diff --git a/dist/peity-vanilla.es2017-esm.js b/dist/peity-vanilla.es2017-esm.js index fbcadc0..0dbf960 100644 --- a/dist/peity-vanilla.es2017-esm.js +++ b/dist/peity-vanilla.es2017-esm.js @@ -1,406 +1,409 @@ /*! Peity Vanila JS 0.0.8 - Copyright © 2022 RailsJazz + Copyright © 2024 RailsJazz https://railsjazz.com */ -const isFunction = (o) => - o !== null && typeof o === "function" && !!o.apply; - -const svgElement = (tag, attrs) => { - const element = document.createElementNS("http://www.w3.org/2000/svg", tag); - for (var attr in attrs) { - element.setAttribute(attr, attrs[attr]); - } - return element; -}; - -const svgSupported = +const isFunction = (o) => + o !== null && typeof o === "function" && !!o.apply; + +const svgElement = (tag, attrs) => { + const element = document.createElementNS("http://www.w3.org/2000/svg", tag); + for (var attr in attrs) { + element.setAttribute(attr, attrs[attr]); + } + return element; +}; + +const svgSupported = "createElementNS" in document && svgElement("svg", {}).createSVGRect(); -class Peity { - static defaults = {}; - static graphers = {}; - - constructor(element, type, options = {}) { - this.element = element; - this.type = type; - this.options = Object.assign( - {}, - Peity.defaults[this.type], - JSON.parse(element.dataset["peity"] || "{}"), - options - ); - - if(this.element._peity) { - this.element._peity.destroy(); - } - this.element._peity = this; - } - - draw() { - const options = this.options; - Peity.graphers[this.type](this); - if (isFunction(options.after)) options.after.call(this, options); - } - - fill() { - var fill = this.options.fill; - - return isFunction(fill) - ? fill - : function (_, i) { - return fill[i % fill.length]; - }; - } - - prepare(width, height) { - if (!this.svg) { - this.element.style.display = "none"; - this.element.after( - (this.svg = svgElement("svg", { - class: "peity", - })) - ); - } - - this.svg.innerHTML = ""; - this.svg.setAttribute("width", width); - this.svg.setAttribute("height", height); - - return this.svg; - } - - get values() { - return this.element.innerText - .split(this.options.delimiter) - .map((value) => parseFloat(value)); - } - - mount() { - if (!svgSupported) return; - - this.element.addEventListener("DOMSubtreeModified", this.draw.bind(this)); - this.draw(); - - this.mounted = true; - } - - unmount() { - this.element.removeEventListener("DOMSubtreeModified", this.draw); - this.svg.remove(); - this.mounted = false; - } - - destroy() { - this.unmount(); - - delete this.element._peity; - } - - static register(type, defaults, grapher) { - Peity.defaults[type] = defaults; - Peity.graphers[type] = grapher; - } +class Peity { + static defaults = {}; + static graphers = {}; + + constructor(element, type, options = {}) { + this.element = element; + this.type = type; + this.options = Object.assign( + {}, + Peity.defaults[this.type], + JSON.parse(element.dataset["peity"] || "{}"), + options + ); + + if (this.element._peity) { + this.element._peity.destroy(); + } + this.element._peity = this; + } + + draw() { + const options = this.options; + Peity.graphers[this.type](this); + if (isFunction(options.after)) options.after.call(this, options); + } + + fill() { + var fill = this.options.fill; + + return isFunction(fill) + ? fill + : function (_, i) { + return fill[i % fill.length]; + }; + } + + prepare(width, height) { + if (!this.svg) { + this.element.style.display = "none"; + this.element.after( + (this.svg = svgElement("svg", { + class: "peity", + })) + ); + } + + this.svg.innerHTML = ""; + this.svg.setAttribute("width", width); + this.svg.setAttribute("height", height); + + return this.svg; + } + + get values() { + return this.element.innerText + .split(this.options.delimiter) + .map((value) => parseFloat(value)); + } + + mount() { + if (!svgSupported) return; + this.observer = new MutationObserver(this.draw.bind(this)); + const config = { attributes: true, childList: true, subtree: true }; + this.observer.observe(this.element, config); + this.draw(); + this.mounted = true; + } + + unmount() { + if (this.observer) { + this.observer.disconnect(); + } + + this.svg.remove(); + this.mounted = false; + } + + destroy() { + this.unmount(); + + delete this.element._peity; + } + + static register(type, defaults, grapher) { + Peity.defaults[type] = defaults; + Peity.graphers[type] = grapher; + } } -const renderer$2 = (peity) => { - if (!peity.options.delimiter) { - const delimiter = peity.element.innerText.match(/[^0-9\.]/); - peity.options.delimiter = delimiter ? delimiter[0] : ","; - } - - let values = peity.values.map((n) => (n > 0 ? n : 0)); - - if (peity.options.delimiter == "/") { - let v1 = values[0]; - let v2 = values[1]; - values = [v1, Math.max(0, v2 - v1)]; - } - - let i = 0; - let length = values.length; - let sum = 0; - - for (; i < length; i++) { - sum += values[i]; - } - - if (!sum) { - length = 2; - sum = 1; - values = [0, 1]; - } - - let diameter = peity.options.radius * 2; - - const svg = peity.prepare( - peity.options.width || diameter, - peity.options.height || diameter - ); - - const width = svg.clientWidth; - const height = svg.clientHeight; - const cx = width / 2; - const cy = height / 2; - - const radius = Math.min(cx, cy); - let innerRadius = peity.options.innerRadius; - - if (peity.type == "donut" && !innerRadius) { - innerRadius = radius * 0.5; - } - - const fill = peity.fill(); - - const scale = (value, radius) => { - const radians = (value / sum) * Math.PI * 2 - Math.PI / 2; - - return [radius * Math.cos(radians) + cx, radius * Math.sin(radians) + cy]; - }; - - let cumulative = 0; - - for (i = 0; i < length; i++) { - const value = values[i]; - const portion = value / sum; - let node; - - if (portion == 0) continue; - - if (portion == 1) { - if (innerRadius) { - const x2 = cx - 0.01; - const y1 = cy - radius; - const y2 = cy - innerRadius; - - node = svgElement("path", { - d: [ - "M", - cx, - y1, - "A", - radius, - radius, - 0, - 1, - 1, - x2, - y1, - "L", - x2, - y2, - "A", - innerRadius, - innerRadius, - 0, - 1, - 0, - cx, - y2, - ].join(" "), - "data-value": value, - }); - } else { - node = svgElement("circle", { - cx: cx, - cy: cy, - "data-value": value, - r: radius, - }); - } - } else { - const cumulativePlusValue = cumulative + value; - - let d = ["M"].concat( - scale(cumulative, radius), - "A", - radius, - radius, - 0, - portion > 0.5 ? 1 : 0, - 1, - scale(cumulativePlusValue, radius), - "L" - ); - - if (innerRadius) { - d = d.concat( - scale(cumulativePlusValue, innerRadius), - "A", - innerRadius, - innerRadius, - 0, - portion > 0.5 ? 1 : 0, - 0, - scale(cumulative, innerRadius) - ); - } else { - d.push(cx, cy); - } - - cumulative += value; - - node = svgElement("path", { - d: d.join(" "), - "data-value": value, - }); - } - - node.setAttribute("fill", fill.call(peity, value, i, values)); - - svg.append(node); - } -}; - -const defaults$2 = { - fill: ["#ff9900", "#fff4dd", "#ffc66e"], - radius: 8, -}; - -const renderer$1 = (peity) => { - const values = peity.values; - const max = Math.max.apply( - Math, - peity.options.max == undefined ? values : values.concat(peity.options.max) - ); - const min = Math.min.apply( - Math, - peity.options.min == undefined ? values : values.concat(peity.options.min) - ); - - const svg = peity.prepare(peity.options.width, peity.options.height); - const width = svg.clientWidth; - const height = svg.clientHeight; - const diff = max - min; - const padding = peity.options.padding; - const fill = peity.fill(); - - const xScale = (input) => { - return (input * width) / values.length; - }; - - const yScale = (input) => { - return height - (diff ? ((input - min) / diff) * height : 1); - }; - - for (var i = 0; i < values.length; i++) { - let x = xScale(i + padding); - let w = xScale(i + 1 - padding) - x; - let value = values[i]; - let valueY = yScale(value); - let y1 = valueY; - let y2 = valueY; - let h; - - if (!diff) { - h = 1; - } else if (value < 0) { - y1 = yScale(Math.min(max, 0)); - } else { - y2 = yScale(Math.max(min, 0)); - } - - h = y2 - y1; - - if (h == 0) { - h = 1; - if (max > 0 && diff) y1--; - } - - svg.append( - svgElement("rect", { - "data-value": value, - fill: fill.call(peity, value, i, values), - x: x, - y: y1, - width: w, - height: h, - }) - ); - } -}; - -const defaults$1 = { - delimiter: ",", - fill: ["#4D89F9"], - height: 16, - min: 0, - padding: 0.1, - width: 32, +const renderer$2 = (peity) => { + if (!peity.options.delimiter) { + const delimiter = peity.element.innerText.match(/[^0-9\.]/); + peity.options.delimiter = delimiter ? delimiter[0] : ","; + } + + let values = peity.values.map((n) => (n > 0 ? n : 0)); + + if (peity.options.delimiter == "/") { + let v1 = values[0]; + let v2 = values[1]; + values = [v1, Math.max(0, v2 - v1)]; + } + + let i = 0; + let length = values.length; + let sum = 0; + + for (; i < length; i++) { + sum += values[i]; + } + + if (!sum) { + length = 2; + sum = 1; + values = [0, 1]; + } + + let diameter = peity.options.radius * 2; + + const svg = peity.prepare( + peity.options.width || diameter, + peity.options.height || diameter + ); + + const width = svg.clientWidth; + const height = svg.clientHeight; + const cx = width / 2; + const cy = height / 2; + + const radius = Math.min(cx, cy); + let innerRadius = peity.options.innerRadius; + + if (peity.type == "donut" && !innerRadius) { + innerRadius = radius * 0.5; + } + + const fill = peity.fill(); + + const scale = (value, radius) => { + const radians = (value / sum) * Math.PI * 2 - Math.PI / 2; + + return [radius * Math.cos(radians) + cx, radius * Math.sin(radians) + cy]; + }; + + let cumulative = 0; + + for (i = 0; i < length; i++) { + const value = values[i]; + const portion = value / sum; + let node; + + if (portion == 0) continue; + + if (portion == 1) { + if (innerRadius) { + const x2 = cx - 0.01; + const y1 = cy - radius; + const y2 = cy - innerRadius; + + node = svgElement("path", { + d: [ + "M", + cx, + y1, + "A", + radius, + radius, + 0, + 1, + 1, + x2, + y1, + "L", + x2, + y2, + "A", + innerRadius, + innerRadius, + 0, + 1, + 0, + cx, + y2, + ].join(" "), + "data-value": value, + }); + } else { + node = svgElement("circle", { + cx: cx, + cy: cy, + "data-value": value, + r: radius, + }); + } + } else { + const cumulativePlusValue = cumulative + value; + + let d = ["M"].concat( + scale(cumulative, radius), + "A", + radius, + radius, + 0, + portion > 0.5 ? 1 : 0, + 1, + scale(cumulativePlusValue, radius), + "L" + ); + + if (innerRadius) { + d = d.concat( + scale(cumulativePlusValue, innerRadius), + "A", + innerRadius, + innerRadius, + 0, + portion > 0.5 ? 1 : 0, + 0, + scale(cumulative, innerRadius) + ); + } else { + d.push(cx, cy); + } + + cumulative += value; + + node = svgElement("path", { + d: d.join(" "), + "data-value": value, + }); + } + + node.setAttribute("fill", fill.call(peity, value, i, values)); + + svg.append(node); + } +}; + +const defaults$2 = { + fill: ["#ff9900", "#fff4dd", "#ffc66e"], + radius: 8, }; -const renderer = (peity) => { - const values = peity.values; - if (values.length == 1) values.push(values[0]); - const max = Math.max.apply( - Math, - peity.options.max == undefined ? values : values.concat(peity.options.max) - ); - const min = Math.min.apply( - Math, - peity.options.min == undefined ? values : values.concat(peity.options.min) - ); - - const svg = peity.prepare(peity.options.width, peity.options.height); - const strokeWidth = peity.options.strokeWidth; - const width = svg.clientWidth; - const height = svg.clientHeight - strokeWidth; - const diff = max - min; - - const xScale = (input) => { - return input * (width / (values.length - 1)); - }; - - const yScale = (input) => { - let y = height; - - if (diff) { - y -= ((input - min) / diff) * height; - } - - return y + strokeWidth / 2; - }; - - let zero = yScale(Math.max(min, 0)); - let coords = [0, zero]; - - for (var i = 0; i < values.length; i++) { - coords.push(xScale(i), yScale(values[i])); - } - - coords.push(width, zero); - - if (peity.options.fill) { - svg.append( - svgElement("polygon", { - fill: peity.options.fill, - points: coords.join(" "), - }) - ); - } - - if (strokeWidth) { - svg.append( - svgElement("polyline", { - fill: "none", - points: coords.slice(2, coords.length - 2).join(" "), - stroke: peity.options.stroke, - "stroke-width": strokeWidth, - "stroke-linecap": "square", - }) - ); - } +const renderer$1 = (peity) => { + const values = peity.values; + const max = Math.max.apply( + Math, + peity.options.max == undefined ? values : values.concat(peity.options.max) + ); + const min = Math.min.apply( + Math, + peity.options.min == undefined ? values : values.concat(peity.options.min) + ); + + const svg = peity.prepare(peity.options.width, peity.options.height); + const width = svg.clientWidth; + const height = svg.clientHeight; + const diff = max - min; + const padding = peity.options.padding; + const fill = peity.fill(); + + const xScale = (input) => { + return (input * width) / values.length; + }; + + const yScale = (input) => { + return height - (diff ? ((input - min) / diff) * height : 1); + }; + + for (var i = 0; i < values.length; i++) { + let x = xScale(i + padding); + let w = xScale(i + 1 - padding) - x; + let value = values[i]; + let valueY = yScale(value); + let y1 = valueY; + let y2 = valueY; + let h; + + if (!diff) { + h = 1; + } else if (value < 0) { + y1 = yScale(Math.min(max, 0)); + } else { + y2 = yScale(Math.max(min, 0)); + } + + h = y2 - y1; + + if (h == 0) { + h = 1; + if (max > 0 && diff) y1--; + } + + svg.append( + svgElement("rect", { + "data-value": value, + fill: fill.call(peity, value, i, values), + x: x, + y: y1, + width: w, + height: h, + }) + ); + } +}; + +const defaults$1 = { + delimiter: ",", + fill: ["#4D89F9"], + height: 16, + min: 0, + padding: 0.1, + width: 32, }; -const defaults = { - delimiter: ",", - fill: "#c6d9fd", - height: 16, - min: 0, - stroke: "#4d89f9", - strokeWidth: 1, - width: 32, +const renderer = (peity) => { + const values = peity.values; + if (values.length == 1) values.push(values[0]); + const max = Math.max.apply( + Math, + peity.options.max == undefined ? values : values.concat(peity.options.max) + ); + const min = Math.min.apply( + Math, + peity.options.min == undefined ? values : values.concat(peity.options.min) + ); + + const svg = peity.prepare(peity.options.width, peity.options.height); + const strokeWidth = peity.options.strokeWidth; + const width = svg.clientWidth; + const height = svg.clientHeight - strokeWidth; + const diff = max - min; + + const xScale = (input) => { + return input * (width / (values.length - 1)); + }; + + const yScale = (input) => { + let y = height; + + if (diff) { + y -= ((input - min) / diff) * height; + } + + return y + strokeWidth / 2; + }; + + let zero = yScale(Math.max(min, 0)); + let coords = [0, zero]; + + for (var i = 0; i < values.length; i++) { + coords.push(xScale(i), yScale(values[i])); + } + + coords.push(width, zero); + + if (peity.options.fill) { + svg.append( + svgElement("polygon", { + fill: peity.options.fill, + points: coords.join(" "), + }) + ); + } + + if (strokeWidth) { + svg.append( + svgElement("polyline", { + fill: "none", + points: coords.slice(2, coords.length - 2).join(" "), + stroke: peity.options.stroke, + "stroke-width": strokeWidth, + "stroke-linecap": "square", + }) + ); + } +}; + +const defaults = { + delimiter: ",", + fill: "#c6d9fd", + height: 16, + min: 0, + stroke: "#4d89f9", + strokeWidth: 1, + width: 32, }; Peity.register("pie", defaults$2, renderer$2); diff --git a/dist/peity-vanilla.js b/dist/peity-vanilla.js index 9450fde..238c2f6 100644 --- a/dist/peity-vanilla.js +++ b/dist/peity-vanilla.js @@ -1,6 +1,6 @@ /*! Peity Vanila JS 0.0.8 - Copyright © 2022 RailsJazz + Copyright © 2024 RailsJazz https://railsjazz.com */ @@ -10,403 +10,406 @@ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.peity = factory()); })(this, (function () { 'use strict'; - const isFunction = (o) => - o !== null && typeof o === "function" && !!o.apply; - - const svgElement = (tag, attrs) => { - const element = document.createElementNS("http://www.w3.org/2000/svg", tag); - for (var attr in attrs) { - element.setAttribute(attr, attrs[attr]); - } - return element; - }; - - const svgSupported = + const isFunction = (o) => + o !== null && typeof o === "function" && !!o.apply; + + const svgElement = (tag, attrs) => { + const element = document.createElementNS("http://www.w3.org/2000/svg", tag); + for (var attr in attrs) { + element.setAttribute(attr, attrs[attr]); + } + return element; + }; + + const svgSupported = "createElementNS" in document && svgElement("svg", {}).createSVGRect(); - class Peity { - static defaults = {}; - static graphers = {}; - - constructor(element, type, options = {}) { - this.element = element; - this.type = type; - this.options = Object.assign( - {}, - Peity.defaults[this.type], - JSON.parse(element.dataset["peity"] || "{}"), - options - ); - - if(this.element._peity) { - this.element._peity.destroy(); - } - this.element._peity = this; - } - - draw() { - const options = this.options; - Peity.graphers[this.type](this); - if (isFunction(options.after)) options.after.call(this, options); - } - - fill() { - var fill = this.options.fill; - - return isFunction(fill) - ? fill - : function (_, i) { - return fill[i % fill.length]; - }; - } - - prepare(width, height) { - if (!this.svg) { - this.element.style.display = "none"; - this.element.after( - (this.svg = svgElement("svg", { - class: "peity", - })) - ); - } - - this.svg.innerHTML = ""; - this.svg.setAttribute("width", width); - this.svg.setAttribute("height", height); - - return this.svg; - } - - get values() { - return this.element.innerText - .split(this.options.delimiter) - .map((value) => parseFloat(value)); - } - - mount() { - if (!svgSupported) return; - - this.element.addEventListener("DOMSubtreeModified", this.draw.bind(this)); - this.draw(); - - this.mounted = true; - } - - unmount() { - this.element.removeEventListener("DOMSubtreeModified", this.draw); - this.svg.remove(); - this.mounted = false; - } - - destroy() { - this.unmount(); - - delete this.element._peity; - } - - static register(type, defaults, grapher) { - Peity.defaults[type] = defaults; - Peity.graphers[type] = grapher; - } + class Peity { + static defaults = {}; + static graphers = {}; + + constructor(element, type, options = {}) { + this.element = element; + this.type = type; + this.options = Object.assign( + {}, + Peity.defaults[this.type], + JSON.parse(element.dataset["peity"] || "{}"), + options + ); + + if (this.element._peity) { + this.element._peity.destroy(); + } + this.element._peity = this; + } + + draw() { + const options = this.options; + Peity.graphers[this.type](this); + if (isFunction(options.after)) options.after.call(this, options); + } + + fill() { + var fill = this.options.fill; + + return isFunction(fill) + ? fill + : function (_, i) { + return fill[i % fill.length]; + }; + } + + prepare(width, height) { + if (!this.svg) { + this.element.style.display = "none"; + this.element.after( + (this.svg = svgElement("svg", { + class: "peity", + })) + ); + } + + this.svg.innerHTML = ""; + this.svg.setAttribute("width", width); + this.svg.setAttribute("height", height); + + return this.svg; + } + + get values() { + return this.element.innerText + .split(this.options.delimiter) + .map((value) => parseFloat(value)); + } + + mount() { + if (!svgSupported) return; + this.observer = new MutationObserver(this.draw.bind(this)); + const config = { attributes: true, childList: true, subtree: true }; + this.observer.observe(this.element, config); + this.draw(); + this.mounted = true; + } + + unmount() { + if (this.observer) { + this.observer.disconnect(); + } + + this.svg.remove(); + this.mounted = false; + } + + destroy() { + this.unmount(); + + delete this.element._peity; + } + + static register(type, defaults, grapher) { + Peity.defaults[type] = defaults; + Peity.graphers[type] = grapher; + } } - const renderer$2 = (peity) => { - if (!peity.options.delimiter) { - const delimiter = peity.element.innerText.match(/[^0-9\.]/); - peity.options.delimiter = delimiter ? delimiter[0] : ","; - } - - let values = peity.values.map((n) => (n > 0 ? n : 0)); - - if (peity.options.delimiter == "/") { - let v1 = values[0]; - let v2 = values[1]; - values = [v1, Math.max(0, v2 - v1)]; - } - - let i = 0; - let length = values.length; - let sum = 0; - - for (; i < length; i++) { - sum += values[i]; - } - - if (!sum) { - length = 2; - sum = 1; - values = [0, 1]; - } - - let diameter = peity.options.radius * 2; - - const svg = peity.prepare( - peity.options.width || diameter, - peity.options.height || diameter - ); - - const width = svg.clientWidth; - const height = svg.clientHeight; - const cx = width / 2; - const cy = height / 2; - - const radius = Math.min(cx, cy); - let innerRadius = peity.options.innerRadius; - - if (peity.type == "donut" && !innerRadius) { - innerRadius = radius * 0.5; - } - - const fill = peity.fill(); - - const scale = (value, radius) => { - const radians = (value / sum) * Math.PI * 2 - Math.PI / 2; - - return [radius * Math.cos(radians) + cx, radius * Math.sin(radians) + cy]; - }; - - let cumulative = 0; - - for (i = 0; i < length; i++) { - const value = values[i]; - const portion = value / sum; - let node; - - if (portion == 0) continue; - - if (portion == 1) { - if (innerRadius) { - const x2 = cx - 0.01; - const y1 = cy - radius; - const y2 = cy - innerRadius; - - node = svgElement("path", { - d: [ - "M", - cx, - y1, - "A", - radius, - radius, - 0, - 1, - 1, - x2, - y1, - "L", - x2, - y2, - "A", - innerRadius, - innerRadius, - 0, - 1, - 0, - cx, - y2, - ].join(" "), - "data-value": value, - }); - } else { - node = svgElement("circle", { - cx: cx, - cy: cy, - "data-value": value, - r: radius, - }); - } - } else { - const cumulativePlusValue = cumulative + value; - - let d = ["M"].concat( - scale(cumulative, radius), - "A", - radius, - radius, - 0, - portion > 0.5 ? 1 : 0, - 1, - scale(cumulativePlusValue, radius), - "L" - ); - - if (innerRadius) { - d = d.concat( - scale(cumulativePlusValue, innerRadius), - "A", - innerRadius, - innerRadius, - 0, - portion > 0.5 ? 1 : 0, - 0, - scale(cumulative, innerRadius) - ); - } else { - d.push(cx, cy); - } - - cumulative += value; - - node = svgElement("path", { - d: d.join(" "), - "data-value": value, - }); - } - - node.setAttribute("fill", fill.call(peity, value, i, values)); - - svg.append(node); - } - }; - - const defaults$2 = { - fill: ["#ff9900", "#fff4dd", "#ffc66e"], - radius: 8, - }; - - const renderer$1 = (peity) => { - const values = peity.values; - const max = Math.max.apply( - Math, - peity.options.max == undefined ? values : values.concat(peity.options.max) - ); - const min = Math.min.apply( - Math, - peity.options.min == undefined ? values : values.concat(peity.options.min) - ); - - const svg = peity.prepare(peity.options.width, peity.options.height); - const width = svg.clientWidth; - const height = svg.clientHeight; - const diff = max - min; - const padding = peity.options.padding; - const fill = peity.fill(); - - const xScale = (input) => { - return (input * width) / values.length; - }; - - const yScale = (input) => { - return height - (diff ? ((input - min) / diff) * height : 1); - }; - - for (var i = 0; i < values.length; i++) { - let x = xScale(i + padding); - let w = xScale(i + 1 - padding) - x; - let value = values[i]; - let valueY = yScale(value); - let y1 = valueY; - let y2 = valueY; - let h; - - if (!diff) { - h = 1; - } else if (value < 0) { - y1 = yScale(Math.min(max, 0)); - } else { - y2 = yScale(Math.max(min, 0)); - } - - h = y2 - y1; - - if (h == 0) { - h = 1; - if (max > 0 && diff) y1--; - } - - svg.append( - svgElement("rect", { - "data-value": value, - fill: fill.call(peity, value, i, values), - x: x, - y: y1, - width: w, - height: h, - }) - ); - } - }; - - const defaults$1 = { - delimiter: ",", - fill: ["#4D89F9"], - height: 16, - min: 0, - padding: 0.1, - width: 32, + const renderer$2 = (peity) => { + if (!peity.options.delimiter) { + const delimiter = peity.element.innerText.match(/[^0-9\.]/); + peity.options.delimiter = delimiter ? delimiter[0] : ","; + } + + let values = peity.values.map((n) => (n > 0 ? n : 0)); + + if (peity.options.delimiter == "/") { + let v1 = values[0]; + let v2 = values[1]; + values = [v1, Math.max(0, v2 - v1)]; + } + + let i = 0; + let length = values.length; + let sum = 0; + + for (; i < length; i++) { + sum += values[i]; + } + + if (!sum) { + length = 2; + sum = 1; + values = [0, 1]; + } + + let diameter = peity.options.radius * 2; + + const svg = peity.prepare( + peity.options.width || diameter, + peity.options.height || diameter + ); + + const width = svg.clientWidth; + const height = svg.clientHeight; + const cx = width / 2; + const cy = height / 2; + + const radius = Math.min(cx, cy); + let innerRadius = peity.options.innerRadius; + + if (peity.type == "donut" && !innerRadius) { + innerRadius = radius * 0.5; + } + + const fill = peity.fill(); + + const scale = (value, radius) => { + const radians = (value / sum) * Math.PI * 2 - Math.PI / 2; + + return [radius * Math.cos(radians) + cx, radius * Math.sin(radians) + cy]; + }; + + let cumulative = 0; + + for (i = 0; i < length; i++) { + const value = values[i]; + const portion = value / sum; + let node; + + if (portion == 0) continue; + + if (portion == 1) { + if (innerRadius) { + const x2 = cx - 0.01; + const y1 = cy - radius; + const y2 = cy - innerRadius; + + node = svgElement("path", { + d: [ + "M", + cx, + y1, + "A", + radius, + radius, + 0, + 1, + 1, + x2, + y1, + "L", + x2, + y2, + "A", + innerRadius, + innerRadius, + 0, + 1, + 0, + cx, + y2, + ].join(" "), + "data-value": value, + }); + } else { + node = svgElement("circle", { + cx: cx, + cy: cy, + "data-value": value, + r: radius, + }); + } + } else { + const cumulativePlusValue = cumulative + value; + + let d = ["M"].concat( + scale(cumulative, radius), + "A", + radius, + radius, + 0, + portion > 0.5 ? 1 : 0, + 1, + scale(cumulativePlusValue, radius), + "L" + ); + + if (innerRadius) { + d = d.concat( + scale(cumulativePlusValue, innerRadius), + "A", + innerRadius, + innerRadius, + 0, + portion > 0.5 ? 1 : 0, + 0, + scale(cumulative, innerRadius) + ); + } else { + d.push(cx, cy); + } + + cumulative += value; + + node = svgElement("path", { + d: d.join(" "), + "data-value": value, + }); + } + + node.setAttribute("fill", fill.call(peity, value, i, values)); + + svg.append(node); + } + }; + + const defaults$2 = { + fill: ["#ff9900", "#fff4dd", "#ffc66e"], + radius: 8, }; - const renderer = (peity) => { - const values = peity.values; - if (values.length == 1) values.push(values[0]); - const max = Math.max.apply( - Math, - peity.options.max == undefined ? values : values.concat(peity.options.max) - ); - const min = Math.min.apply( - Math, - peity.options.min == undefined ? values : values.concat(peity.options.min) - ); - - const svg = peity.prepare(peity.options.width, peity.options.height); - const strokeWidth = peity.options.strokeWidth; - const width = svg.clientWidth; - const height = svg.clientHeight - strokeWidth; - const diff = max - min; - - const xScale = (input) => { - return input * (width / (values.length - 1)); - }; - - const yScale = (input) => { - let y = height; - - if (diff) { - y -= ((input - min) / diff) * height; - } - - return y + strokeWidth / 2; - }; - - let zero = yScale(Math.max(min, 0)); - let coords = [0, zero]; - - for (var i = 0; i < values.length; i++) { - coords.push(xScale(i), yScale(values[i])); - } - - coords.push(width, zero); - - if (peity.options.fill) { - svg.append( - svgElement("polygon", { - fill: peity.options.fill, - points: coords.join(" "), - }) - ); - } - - if (strokeWidth) { - svg.append( - svgElement("polyline", { - fill: "none", - points: coords.slice(2, coords.length - 2).join(" "), - stroke: peity.options.stroke, - "stroke-width": strokeWidth, - "stroke-linecap": "square", - }) - ); - } + const renderer$1 = (peity) => { + const values = peity.values; + const max = Math.max.apply( + Math, + peity.options.max == undefined ? values : values.concat(peity.options.max) + ); + const min = Math.min.apply( + Math, + peity.options.min == undefined ? values : values.concat(peity.options.min) + ); + + const svg = peity.prepare(peity.options.width, peity.options.height); + const width = svg.clientWidth; + const height = svg.clientHeight; + const diff = max - min; + const padding = peity.options.padding; + const fill = peity.fill(); + + const xScale = (input) => { + return (input * width) / values.length; + }; + + const yScale = (input) => { + return height - (diff ? ((input - min) / diff) * height : 1); + }; + + for (var i = 0; i < values.length; i++) { + let x = xScale(i + padding); + let w = xScale(i + 1 - padding) - x; + let value = values[i]; + let valueY = yScale(value); + let y1 = valueY; + let y2 = valueY; + let h; + + if (!diff) { + h = 1; + } else if (value < 0) { + y1 = yScale(Math.min(max, 0)); + } else { + y2 = yScale(Math.max(min, 0)); + } + + h = y2 - y1; + + if (h == 0) { + h = 1; + if (max > 0 && diff) y1--; + } + + svg.append( + svgElement("rect", { + "data-value": value, + fill: fill.call(peity, value, i, values), + x: x, + y: y1, + width: w, + height: h, + }) + ); + } + }; + + const defaults$1 = { + delimiter: ",", + fill: ["#4D89F9"], + height: 16, + min: 0, + padding: 0.1, + width: 32, }; - const defaults = { - delimiter: ",", - fill: "#c6d9fd", - height: 16, - min: 0, - stroke: "#4d89f9", - strokeWidth: 1, - width: 32, + const renderer = (peity) => { + const values = peity.values; + if (values.length == 1) values.push(values[0]); + const max = Math.max.apply( + Math, + peity.options.max == undefined ? values : values.concat(peity.options.max) + ); + const min = Math.min.apply( + Math, + peity.options.min == undefined ? values : values.concat(peity.options.min) + ); + + const svg = peity.prepare(peity.options.width, peity.options.height); + const strokeWidth = peity.options.strokeWidth; + const width = svg.clientWidth; + const height = svg.clientHeight - strokeWidth; + const diff = max - min; + + const xScale = (input) => { + return input * (width / (values.length - 1)); + }; + + const yScale = (input) => { + let y = height; + + if (diff) { + y -= ((input - min) / diff) * height; + } + + return y + strokeWidth / 2; + }; + + let zero = yScale(Math.max(min, 0)); + let coords = [0, zero]; + + for (var i = 0; i < values.length; i++) { + coords.push(xScale(i), yScale(values[i])); + } + + coords.push(width, zero); + + if (peity.options.fill) { + svg.append( + svgElement("polygon", { + fill: peity.options.fill, + points: coords.join(" "), + }) + ); + } + + if (strokeWidth) { + svg.append( + svgElement("polyline", { + fill: "none", + points: coords.slice(2, coords.length - 2).join(" "), + stroke: peity.options.stroke, + "stroke-width": strokeWidth, + "stroke-linecap": "square", + }) + ); + } + }; + + const defaults = { + delimiter: ",", + fill: "#c6d9fd", + height: 16, + min: 0, + stroke: "#4d89f9", + strokeWidth: 1, + width: 32, }; Peity.register("pie", defaults$2, renderer$2); diff --git a/dist/peity-vanilla.js.map b/dist/peity-vanilla.js.map index e7fb59e..11baecf 100644 --- a/dist/peity-vanilla.js.map +++ b/dist/peity-vanilla.js.map @@ -1 +1 @@ -{"version":3,"file":"peity-vanilla.js","sources":["../src/utils.js","../src/peity.js","../src/renderers/pie.js","../src/renderers/bar.js","../src/renderers/line.js","../src/index.js"],"sourcesContent":["export const isFunction = (o) =>\n o !== null && typeof o === \"function\" && !!o.apply;\n\nexport const svgElement = (tag, attrs) => {\n const element = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n for (var attr in attrs) {\n element.setAttribute(attr, attrs[attr]);\n }\n return element;\n};\n\nexport const svgSupported =\n \"createElementNS\" in document && svgElement(\"svg\", {}).createSVGRect();\n","import { isFunction, svgElement, svgSupported } from \"./utils\";\n\nclass Peity {\n static defaults = {};\n static graphers = {};\n\n constructor(element, type, options = {}) {\n this.element = element;\n this.type = type;\n this.options = Object.assign(\n {},\n Peity.defaults[this.type],\n JSON.parse(element.dataset[\"peity\"] || \"{}\"),\n options\n );\n\n if(this.element._peity) {\n this.element._peity.destroy();\n }\n this.element._peity = this;\n }\n\n draw() {\n const options = this.options;\n Peity.graphers[this.type](this);\n if (isFunction(options.after)) options.after.call(this, options);\n }\n\n fill() {\n var fill = this.options.fill;\n\n return isFunction(fill)\n ? fill\n : function (_, i) {\n return fill[i % fill.length];\n };\n }\n\n prepare(width, height) {\n if (!this.svg) {\n this.element.style.display = \"none\";\n this.element.after(\n (this.svg = svgElement(\"svg\", {\n class: \"peity\",\n }))\n );\n }\n\n this.svg.innerHTML = \"\";\n this.svg.setAttribute(\"width\", width);\n this.svg.setAttribute(\"height\", height);\n\n return this.svg;\n }\n\n get values() {\n return this.element.innerText\n .split(this.options.delimiter)\n .map((value) => parseFloat(value));\n }\n\n mount() {\n if (!svgSupported) return;\n\n this.element.addEventListener(\"DOMSubtreeModified\", this.draw.bind(this));\n this.draw();\n\n this.mounted = true;\n }\n\n unmount() {\n this.element.removeEventListener(\"DOMSubtreeModified\", this.draw);\n this.svg.remove();\n this.mounted = false;\n }\n\n destroy() {\n this.unmount();\n\n delete this.element._peity;\n }\n\n static register(type, defaults, grapher) {\n Peity.defaults[type] = defaults;\n Peity.graphers[type] = grapher;\n }\n}\n\nexport default Peity;\n","import { svgElement } from \"../utils\";\n\nexport const renderer = (peity) => {\n if (!peity.options.delimiter) {\n const delimiter = peity.element.innerText.match(/[^0-9\\.]/);\n peity.options.delimiter = delimiter ? delimiter[0] : \",\";\n }\n\n let values = peity.values.map((n) => (n > 0 ? n : 0));\n\n if (peity.options.delimiter == \"/\") {\n let v1 = values[0];\n let v2 = values[1];\n values = [v1, Math.max(0, v2 - v1)];\n }\n\n let i = 0;\n let length = values.length;\n let sum = 0;\n\n for (; i < length; i++) {\n sum += values[i];\n }\n\n if (!sum) {\n length = 2;\n sum = 1;\n values = [0, 1];\n }\n\n let diameter = peity.options.radius * 2;\n\n const svg = peity.prepare(\n peity.options.width || diameter,\n peity.options.height || diameter\n );\n\n const width = svg.clientWidth;\n const height = svg.clientHeight;\n const cx = width / 2;\n const cy = height / 2;\n\n const radius = Math.min(cx, cy);\n let innerRadius = peity.options.innerRadius;\n\n if (peity.type == \"donut\" && !innerRadius) {\n innerRadius = radius * 0.5;\n }\n\n const fill = peity.fill();\n\n const scale = (value, radius) => {\n const radians = (value / sum) * Math.PI * 2 - Math.PI / 2;\n\n return [radius * Math.cos(radians) + cx, radius * Math.sin(radians) + cy];\n };\n\n let cumulative = 0;\n\n for (i = 0; i < length; i++) {\n const value = values[i];\n const portion = value / sum;\n let node;\n\n if (portion == 0) continue;\n\n if (portion == 1) {\n if (innerRadius) {\n const x2 = cx - 0.01;\n const y1 = cy - radius;\n const y2 = cy - innerRadius;\n\n node = svgElement(\"path\", {\n d: [\n \"M\",\n cx,\n y1,\n \"A\",\n radius,\n radius,\n 0,\n 1,\n 1,\n x2,\n y1,\n \"L\",\n x2,\n y2,\n \"A\",\n innerRadius,\n innerRadius,\n 0,\n 1,\n 0,\n cx,\n y2,\n ].join(\" \"),\n \"data-value\": value,\n });\n } else {\n node = svgElement(\"circle\", {\n cx: cx,\n cy: cy,\n \"data-value\": value,\n r: radius,\n });\n }\n } else {\n const cumulativePlusValue = cumulative + value;\n\n let d = [\"M\"].concat(\n scale(cumulative, radius),\n \"A\",\n radius,\n radius,\n 0,\n portion > 0.5 ? 1 : 0,\n 1,\n scale(cumulativePlusValue, radius),\n \"L\"\n );\n\n if (innerRadius) {\n d = d.concat(\n scale(cumulativePlusValue, innerRadius),\n \"A\",\n innerRadius,\n innerRadius,\n 0,\n portion > 0.5 ? 1 : 0,\n 0,\n scale(cumulative, innerRadius)\n );\n } else {\n d.push(cx, cy);\n }\n\n cumulative += value;\n\n node = svgElement(\"path\", {\n d: d.join(\" \"),\n \"data-value\": value,\n });\n }\n\n node.setAttribute(\"fill\", fill.call(peity, value, i, values));\n\n svg.append(node);\n }\n};\n\nexport const defaults = {\n fill: [\"#ff9900\", \"#fff4dd\", \"#ffc66e\"],\n radius: 8,\n};\n","import { svgElement } from \"../utils\";\n\nexport const renderer = (peity) => {\n const values = peity.values;\n const max = Math.max.apply(\n Math,\n peity.options.max == undefined ? values : values.concat(peity.options.max)\n );\n const min = Math.min.apply(\n Math,\n peity.options.min == undefined ? values : values.concat(peity.options.min)\n );\n\n const svg = peity.prepare(peity.options.width, peity.options.height);\n const width = svg.clientWidth;\n const height = svg.clientHeight;\n const diff = max - min;\n const padding = peity.options.padding;\n const fill = peity.fill();\n\n const xScale = (input) => {\n return (input * width) / values.length;\n };\n\n const yScale = (input) => {\n return height - (diff ? ((input - min) / diff) * height : 1);\n };\n\n for (var i = 0; i < values.length; i++) {\n let x = xScale(i + padding);\n let w = xScale(i + 1 - padding) - x;\n let value = values[i];\n let valueY = yScale(value);\n let y1 = valueY;\n let y2 = valueY;\n let h;\n\n if (!diff) {\n h = 1;\n } else if (value < 0) {\n y1 = yScale(Math.min(max, 0));\n } else {\n y2 = yScale(Math.max(min, 0));\n }\n\n h = y2 - y1;\n\n if (h == 0) {\n h = 1;\n if (max > 0 && diff) y1--;\n }\n\n svg.append(\n svgElement(\"rect\", {\n \"data-value\": value,\n fill: fill.call(peity, value, i, values),\n x: x,\n y: y1,\n width: w,\n height: h,\n })\n );\n }\n};\n\nexport const defaults = {\n delimiter: \",\",\n fill: [\"#4D89F9\"],\n height: 16,\n min: 0,\n padding: 0.1,\n width: 32,\n};\n","import { svgElement } from \"../utils\";\n\nexport const renderer = (peity) => {\n const values = peity.values;\n if (values.length == 1) values.push(values[0]);\n const max = Math.max.apply(\n Math,\n peity.options.max == undefined ? values : values.concat(peity.options.max)\n );\n const min = Math.min.apply(\n Math,\n peity.options.min == undefined ? values : values.concat(peity.options.min)\n );\n\n const svg = peity.prepare(peity.options.width, peity.options.height);\n const strokeWidth = peity.options.strokeWidth;\n const width = svg.clientWidth;\n const height = svg.clientHeight - strokeWidth;\n const diff = max - min;\n\n const xScale = (input) => {\n return input * (width / (values.length - 1));\n };\n\n const yScale = (input) => {\n let y = height;\n\n if (diff) {\n y -= ((input - min) / diff) * height;\n }\n\n return y + strokeWidth / 2;\n };\n\n let zero = yScale(Math.max(min, 0));\n let coords = [0, zero];\n\n for (var i = 0; i < values.length; i++) {\n coords.push(xScale(i), yScale(values[i]));\n }\n\n coords.push(width, zero);\n\n if (peity.options.fill) {\n svg.append(\n svgElement(\"polygon\", {\n fill: peity.options.fill,\n points: coords.join(\" \"),\n })\n );\n }\n\n if (strokeWidth) {\n svg.append(\n svgElement(\"polyline\", {\n fill: \"none\",\n points: coords.slice(2, coords.length - 2).join(\" \"),\n stroke: peity.options.stroke,\n \"stroke-width\": strokeWidth,\n \"stroke-linecap\": \"square\",\n })\n );\n }\n};\n\nexport const defaults = {\n delimiter: \",\",\n fill: \"#c6d9fd\",\n height: 16,\n min: 0,\n stroke: \"#4d89f9\",\n strokeWidth: 1,\n width: 32,\n};\n","import Peity from \"./peity\";\r\nimport * as pie from \"./renderers/pie\";\r\nimport * as bar from \"./renderers/bar\";\r\nimport * as line from \"./renderers/line\";\r\n\r\nPeity.register(\"pie\", pie.defaults, pie.renderer);\r\nPeity.register(\"donut\", pie.defaults, pie.renderer);\r\nPeity.register(\"bar\", bar.defaults, bar.renderer);\r\nPeity.register(\"line\", line.defaults, line.renderer);\r\n\r\nexport * from \"./peity\";\r\n\r\nconst peity = function (element, type, options) {\r\n const peity = new Peity(element, type, options);\r\n peity.mount();\r\n\r\n return peity;\r\n};\r\n\r\npeity.defaults = Peity.defaults;\r\npeity.graphers = Peity.graphers;\r\n\r\nexport default peity;\r\n"],"names":["renderer","defaults","pie.defaults","pie.renderer","bar.defaults","bar.renderer","line.defaults","line.renderer"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"peity-vanilla.js","sources":["../src/utils.js","../src/peity.js","../src/renderers/pie.js","../src/renderers/bar.js","../src/renderers/line.js","../src/index.js"],"sourcesContent":["export const isFunction = (o) =>\r\n o !== null && typeof o === \"function\" && !!o.apply;\r\n\r\nexport const svgElement = (tag, attrs) => {\r\n const element = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\r\n for (var attr in attrs) {\r\n element.setAttribute(attr, attrs[attr]);\r\n }\r\n return element;\r\n};\r\n\r\nexport const svgSupported =\r\n \"createElementNS\" in document && svgElement(\"svg\", {}).createSVGRect();\r\n","import { isFunction, svgElement, svgSupported } from \"./utils\";\r\n\r\nclass Peity {\r\n static defaults = {};\r\n static graphers = {};\r\n\r\n constructor(element, type, options = {}) {\r\n this.element = element;\r\n this.type = type;\r\n this.options = Object.assign(\r\n {},\r\n Peity.defaults[this.type],\r\n JSON.parse(element.dataset[\"peity\"] || \"{}\"),\r\n options\r\n );\r\n\r\n if (this.element._peity) {\r\n this.element._peity.destroy();\r\n }\r\n this.element._peity = this;\r\n }\r\n\r\n draw() {\r\n const options = this.options;\r\n Peity.graphers[this.type](this);\r\n if (isFunction(options.after)) options.after.call(this, options);\r\n }\r\n\r\n fill() {\r\n var fill = this.options.fill;\r\n\r\n return isFunction(fill)\r\n ? fill\r\n : function (_, i) {\r\n return fill[i % fill.length];\r\n };\r\n }\r\n\r\n prepare(width, height) {\r\n if (!this.svg) {\r\n this.element.style.display = \"none\";\r\n this.element.after(\r\n (this.svg = svgElement(\"svg\", {\r\n class: \"peity\",\r\n }))\r\n );\r\n }\r\n\r\n this.svg.innerHTML = \"\";\r\n this.svg.setAttribute(\"width\", width);\r\n this.svg.setAttribute(\"height\", height);\r\n\r\n return this.svg;\r\n }\r\n\r\n get values() {\r\n return this.element.innerText\r\n .split(this.options.delimiter)\r\n .map((value) => parseFloat(value));\r\n }\r\n\r\n mount() {\r\n if (!svgSupported) return;\r\n this.observer = new MutationObserver(this.draw.bind(this));\r\n const config = { attributes: true, childList: true, subtree: true };\r\n this.observer.observe(this.element, config);\r\n this.draw();\r\n this.mounted = true;\r\n }\r\n\r\n unmount() {\r\n if (this.observer) {\r\n this.observer.disconnect();\r\n }\r\n\r\n this.svg.remove();\r\n this.mounted = false;\r\n }\r\n\r\n destroy() {\r\n this.unmount();\r\n\r\n delete this.element._peity;\r\n }\r\n\r\n static register(type, defaults, grapher) {\r\n Peity.defaults[type] = defaults;\r\n Peity.graphers[type] = grapher;\r\n }\r\n}\r\n\r\nexport default Peity;\r\n","import { svgElement } from \"../utils\";\r\n\r\nexport const renderer = (peity) => {\r\n if (!peity.options.delimiter) {\r\n const delimiter = peity.element.innerText.match(/[^0-9\\.]/);\r\n peity.options.delimiter = delimiter ? delimiter[0] : \",\";\r\n }\r\n\r\n let values = peity.values.map((n) => (n > 0 ? n : 0));\r\n\r\n if (peity.options.delimiter == \"/\") {\r\n let v1 = values[0];\r\n let v2 = values[1];\r\n values = [v1, Math.max(0, v2 - v1)];\r\n }\r\n\r\n let i = 0;\r\n let length = values.length;\r\n let sum = 0;\r\n\r\n for (; i < length; i++) {\r\n sum += values[i];\r\n }\r\n\r\n if (!sum) {\r\n length = 2;\r\n sum = 1;\r\n values = [0, 1];\r\n }\r\n\r\n let diameter = peity.options.radius * 2;\r\n\r\n const svg = peity.prepare(\r\n peity.options.width || diameter,\r\n peity.options.height || diameter\r\n );\r\n\r\n const width = svg.clientWidth;\r\n const height = svg.clientHeight;\r\n const cx = width / 2;\r\n const cy = height / 2;\r\n\r\n const radius = Math.min(cx, cy);\r\n let innerRadius = peity.options.innerRadius;\r\n\r\n if (peity.type == \"donut\" && !innerRadius) {\r\n innerRadius = radius * 0.5;\r\n }\r\n\r\n const fill = peity.fill();\r\n\r\n const scale = (value, radius) => {\r\n const radians = (value / sum) * Math.PI * 2 - Math.PI / 2;\r\n\r\n return [radius * Math.cos(radians) + cx, radius * Math.sin(radians) + cy];\r\n };\r\n\r\n let cumulative = 0;\r\n\r\n for (i = 0; i < length; i++) {\r\n const value = values[i];\r\n const portion = value / sum;\r\n let node;\r\n\r\n if (portion == 0) continue;\r\n\r\n if (portion == 1) {\r\n if (innerRadius) {\r\n const x2 = cx - 0.01;\r\n const y1 = cy - radius;\r\n const y2 = cy - innerRadius;\r\n\r\n node = svgElement(\"path\", {\r\n d: [\r\n \"M\",\r\n cx,\r\n y1,\r\n \"A\",\r\n radius,\r\n radius,\r\n 0,\r\n 1,\r\n 1,\r\n x2,\r\n y1,\r\n \"L\",\r\n x2,\r\n y2,\r\n \"A\",\r\n innerRadius,\r\n innerRadius,\r\n 0,\r\n 1,\r\n 0,\r\n cx,\r\n y2,\r\n ].join(\" \"),\r\n \"data-value\": value,\r\n });\r\n } else {\r\n node = svgElement(\"circle\", {\r\n cx: cx,\r\n cy: cy,\r\n \"data-value\": value,\r\n r: radius,\r\n });\r\n }\r\n } else {\r\n const cumulativePlusValue = cumulative + value;\r\n\r\n let d = [\"M\"].concat(\r\n scale(cumulative, radius),\r\n \"A\",\r\n radius,\r\n radius,\r\n 0,\r\n portion > 0.5 ? 1 : 0,\r\n 1,\r\n scale(cumulativePlusValue, radius),\r\n \"L\"\r\n );\r\n\r\n if (innerRadius) {\r\n d = d.concat(\r\n scale(cumulativePlusValue, innerRadius),\r\n \"A\",\r\n innerRadius,\r\n innerRadius,\r\n 0,\r\n portion > 0.5 ? 1 : 0,\r\n 0,\r\n scale(cumulative, innerRadius)\r\n );\r\n } else {\r\n d.push(cx, cy);\r\n }\r\n\r\n cumulative += value;\r\n\r\n node = svgElement(\"path\", {\r\n d: d.join(\" \"),\r\n \"data-value\": value,\r\n });\r\n }\r\n\r\n node.setAttribute(\"fill\", fill.call(peity, value, i, values));\r\n\r\n svg.append(node);\r\n }\r\n};\r\n\r\nexport const defaults = {\r\n fill: [\"#ff9900\", \"#fff4dd\", \"#ffc66e\"],\r\n radius: 8,\r\n};\r\n","import { svgElement } from \"../utils\";\r\n\r\nexport const renderer = (peity) => {\r\n const values = peity.values;\r\n const max = Math.max.apply(\r\n Math,\r\n peity.options.max == undefined ? values : values.concat(peity.options.max)\r\n );\r\n const min = Math.min.apply(\r\n Math,\r\n peity.options.min == undefined ? values : values.concat(peity.options.min)\r\n );\r\n\r\n const svg = peity.prepare(peity.options.width, peity.options.height);\r\n const width = svg.clientWidth;\r\n const height = svg.clientHeight;\r\n const diff = max - min;\r\n const padding = peity.options.padding;\r\n const fill = peity.fill();\r\n\r\n const xScale = (input) => {\r\n return (input * width) / values.length;\r\n };\r\n\r\n const yScale = (input) => {\r\n return height - (diff ? ((input - min) / diff) * height : 1);\r\n };\r\n\r\n for (var i = 0; i < values.length; i++) {\r\n let x = xScale(i + padding);\r\n let w = xScale(i + 1 - padding) - x;\r\n let value = values[i];\r\n let valueY = yScale(value);\r\n let y1 = valueY;\r\n let y2 = valueY;\r\n let h;\r\n\r\n if (!diff) {\r\n h = 1;\r\n } else if (value < 0) {\r\n y1 = yScale(Math.min(max, 0));\r\n } else {\r\n y2 = yScale(Math.max(min, 0));\r\n }\r\n\r\n h = y2 - y1;\r\n\r\n if (h == 0) {\r\n h = 1;\r\n if (max > 0 && diff) y1--;\r\n }\r\n\r\n svg.append(\r\n svgElement(\"rect\", {\r\n \"data-value\": value,\r\n fill: fill.call(peity, value, i, values),\r\n x: x,\r\n y: y1,\r\n width: w,\r\n height: h,\r\n })\r\n );\r\n }\r\n};\r\n\r\nexport const defaults = {\r\n delimiter: \",\",\r\n fill: [\"#4D89F9\"],\r\n height: 16,\r\n min: 0,\r\n padding: 0.1,\r\n width: 32,\r\n};\r\n","import { svgElement } from \"../utils\";\r\n\r\nexport const renderer = (peity) => {\r\n const values = peity.values;\r\n if (values.length == 1) values.push(values[0]);\r\n const max = Math.max.apply(\r\n Math,\r\n peity.options.max == undefined ? values : values.concat(peity.options.max)\r\n );\r\n const min = Math.min.apply(\r\n Math,\r\n peity.options.min == undefined ? values : values.concat(peity.options.min)\r\n );\r\n\r\n const svg = peity.prepare(peity.options.width, peity.options.height);\r\n const strokeWidth = peity.options.strokeWidth;\r\n const width = svg.clientWidth;\r\n const height = svg.clientHeight - strokeWidth;\r\n const diff = max - min;\r\n\r\n const xScale = (input) => {\r\n return input * (width / (values.length - 1));\r\n };\r\n\r\n const yScale = (input) => {\r\n let y = height;\r\n\r\n if (diff) {\r\n y -= ((input - min) / diff) * height;\r\n }\r\n\r\n return y + strokeWidth / 2;\r\n };\r\n\r\n let zero = yScale(Math.max(min, 0));\r\n let coords = [0, zero];\r\n\r\n for (var i = 0; i < values.length; i++) {\r\n coords.push(xScale(i), yScale(values[i]));\r\n }\r\n\r\n coords.push(width, zero);\r\n\r\n if (peity.options.fill) {\r\n svg.append(\r\n svgElement(\"polygon\", {\r\n fill: peity.options.fill,\r\n points: coords.join(\" \"),\r\n })\r\n );\r\n }\r\n\r\n if (strokeWidth) {\r\n svg.append(\r\n svgElement(\"polyline\", {\r\n fill: \"none\",\r\n points: coords.slice(2, coords.length - 2).join(\" \"),\r\n stroke: peity.options.stroke,\r\n \"stroke-width\": strokeWidth,\r\n \"stroke-linecap\": \"square\",\r\n })\r\n );\r\n }\r\n};\r\n\r\nexport const defaults = {\r\n delimiter: \",\",\r\n fill: \"#c6d9fd\",\r\n height: 16,\r\n min: 0,\r\n stroke: \"#4d89f9\",\r\n strokeWidth: 1,\r\n width: 32,\r\n};\r\n","import Peity from \"./peity\";\r\nimport * as pie from \"./renderers/pie\";\r\nimport * as bar from \"./renderers/bar\";\r\nimport * as line from \"./renderers/line\";\r\n\r\nPeity.register(\"pie\", pie.defaults, pie.renderer);\r\nPeity.register(\"donut\", pie.defaults, pie.renderer);\r\nPeity.register(\"bar\", bar.defaults, bar.renderer);\r\nPeity.register(\"line\", line.defaults, line.renderer);\r\n\r\nexport * from \"./peity\";\r\n\r\nconst peity = function (element, type, options) {\r\n const peity = new Peity(element, type, options);\r\n peity.mount();\r\n\r\n return peity;\r\n};\r\n\r\npeity.defaults = Peity.defaults;\r\npeity.graphers = Peity.graphers;\r\n\r\nexport default peity;\r\n"],"names":["renderer","defaults","pie.defaults","pie.renderer","bar.defaults","bar.renderer","line.defaults","line.renderer"],"mappings":"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"} \ No newline at end of file diff --git a/dist/peity-vanilla.min.js b/dist/peity-vanilla.min.js index ed56aec..a5d1557 100644 --- a/dist/peity-vanilla.min.js +++ b/dist/peity-vanilla.min.js @@ -1,6 +1,6 @@ /*! Peity Vanila JS 0.0.8 - Copyright © 2022 RailsJazz + Copyright © 2024 RailsJazz https://railsjazz.com */ -var peity=function(){"use strict";const t=t=>null!==t&&"function"==typeof t&&!!t.apply,e=(t,e)=>{const i=document.createElementNS("http://www.w3.org/2000/svg",t);for(var n in e)i.setAttribute(n,e[n]);return i},i="createElementNS"in document&&e("svg",{}).createSVGRect();class n{static defaults={};static graphers={};constructor(t,e,i={}){this.element=t,this.type=e,this.options=Object.assign({},n.defaults[this.type],JSON.parse(t.dataset.peity||"{}"),i),this.element._peity&&this.element._peity.destroy(),this.element._peity=this}draw(){const e=this.options;n.graphers[this.type](this),t(e.after)&&e.after.call(this,e)}fill(){var e=this.options.fill;return t(e)?e:function(t,i){return e[i%e.length]}}prepare(t,i){return this.svg||(this.element.style.display="none",this.element.after(this.svg=e("svg",{class:"peity"}))),this.svg.innerHTML="",this.svg.setAttribute("width",t),this.svg.setAttribute("height",i),this.svg}get values(){return this.element.innerText.split(this.options.delimiter).map((t=>parseFloat(t)))}mount(){i&&(this.element.addEventListener("DOMSubtreeModified",this.draw.bind(this)),this.draw(),this.mounted=!0)}unmount(){this.element.removeEventListener("DOMSubtreeModified",this.draw),this.svg.remove(),this.mounted=!1}destroy(){this.unmount(),delete this.element._peity}static register(t,e,i){n.defaults[t]=e,n.graphers[t]=i}}const s=t=>{if(!t.options.delimiter){const e=t.element.innerText.match(/[^0-9\.]/);t.options.delimiter=e?e[0]:","}let i=t.values.map((t=>t>0?t:0));if("/"==t.options.delimiter){let t=i[0],e=i[1];i=[t,Math.max(0,e-t)]}let n=0,s=i.length,o=0;for(;n{const i=t/o*Math.PI*2-Math.PI/2;return[e*Math.cos(i)+p,e*Math.sin(i)+d]};let g=0;for(n=0;n.5?1:0,1,f(t,c),"L");u?i=i.concat(f(t,u),"A",u,u,0,l>.5?1:0,0,f(g,u)):i.push(p,d),g+=s,r=e("path",{d:i.join(" "),"data-value":s})}r.setAttribute("fill",m.call(t,s,n,i)),a.append(r)}}},o={fill:["#ff9900","#fff4dd","#ffc66e"],radius:8};n.register("pie",o,s),n.register("donut",o,s),n.register("bar",{delimiter:",",fill:["#4D89F9"],height:16,min:0,padding:.1,width:32},(t=>{const i=t.values,n=Math.max.apply(Math,null==t.options.max?i:i.concat(t.options.max)),s=Math.min.apply(Math,null==t.options.min?i:i.concat(t.options.min)),o=t.prepare(t.options.width,t.options.height),l=o.clientWidth,a=o.clientHeight,r=n-s,h=t.options.padding,p=t.fill(),d=t=>t*l/i.length,c=t=>a-(r?(t-s)/r*a:1);for(var u=0;u0&&r&&v--),o.append(e("rect",{"data-value":f,fill:p.call(t,f,u,i),x:a,y:v,width:m,height:l}))}})),n.register("line",{delimiter:",",fill:"#c6d9fd",height:16,min:0,stroke:"#4d89f9",strokeWidth:1,width:32},(t=>{const i=t.values;1==i.length&&i.push(i[0]);const n=Math.max.apply(Math,null==t.options.max?i:i.concat(t.options.max)),s=Math.min.apply(Math,null==t.options.min?i:i.concat(t.options.min)),o=t.prepare(t.options.width,t.options.height),l=t.options.strokeWidth,a=o.clientWidth,r=o.clientHeight-l,h=n-s,p=t=>{let e=r;return h&&(e-=(t-s)/h*r),e+l/2};let d=p(Math.max(s,0)),c=[0,d];for(var u=0;unull!==t&&"function"==typeof t&&!!t.apply,e=(t,e)=>{const i=document.createElementNS("http://www.w3.org/2000/svg",t);for(var s in e)i.setAttribute(s,e[s]);return i},i="createElementNS"in document&&e("svg",{}).createSVGRect();class s{static defaults={};static graphers={};constructor(t,e,i={}){this.element=t,this.type=e,this.options=Object.assign({},s.defaults[this.type],JSON.parse(t.dataset.peity||"{}"),i),this.element._peity&&this.element._peity.destroy(),this.element._peity=this}draw(){const e=this.options;s.graphers[this.type](this),t(e.after)&&e.after.call(this,e)}fill(){var e=this.options.fill;return t(e)?e:function(t,i){return e[i%e.length]}}prepare(t,i){return this.svg||(this.element.style.display="none",this.element.after(this.svg=e("svg",{class:"peity"}))),this.svg.innerHTML="",this.svg.setAttribute("width",t),this.svg.setAttribute("height",i),this.svg}get values(){return this.element.innerText.split(this.options.delimiter).map((t=>parseFloat(t)))}mount(){if(!i)return;this.observer=new MutationObserver(this.draw.bind(this));this.observer.observe(this.element,{attributes:!0,childList:!0,subtree:!0}),this.draw(),this.mounted=!0}unmount(){this.observer&&this.observer.disconnect(),this.svg.remove(),this.mounted=!1}destroy(){this.unmount(),delete this.element._peity}static register(t,e,i){s.defaults[t]=e,s.graphers[t]=i}}const n=t=>{if(!t.options.delimiter){const e=t.element.innerText.match(/[^0-9\.]/);t.options.delimiter=e?e[0]:","}let i=t.values.map((t=>t>0?t:0));if("/"==t.options.delimiter){let t=i[0],e=i[1];i=[t,Math.max(0,e-t)]}let s=0,n=i.length,o=0;for(;s{const i=t/o*Math.PI*2-Math.PI/2;return[e*Math.cos(i)+p,e*Math.sin(i)+c]};let g=0;for(s=0;s.5?1:0,1,f(t,d),"L");u?i=i.concat(f(t,u),"A",u,u,0,l>.5?1:0,0,f(g,u)):i.push(p,c),g+=n,a=e("path",{d:i.join(" "),"data-value":n})}a.setAttribute("fill",m.call(t,n,s,i)),r.append(a)}}},o={fill:["#ff9900","#fff4dd","#ffc66e"],radius:8};s.register("pie",o,n),s.register("donut",o,n),s.register("bar",{delimiter:",",fill:["#4D89F9"],height:16,min:0,padding:.1,width:32},(t=>{const i=t.values,s=Math.max.apply(Math,null==t.options.max?i:i.concat(t.options.max)),n=Math.min.apply(Math,null==t.options.min?i:i.concat(t.options.min)),o=t.prepare(t.options.width,t.options.height),l=o.clientWidth,r=o.clientHeight,a=s-n,h=t.options.padding,p=t.fill(),c=t=>t*l/i.length,d=t=>r-(a?(t-n)/a*r:1);for(var u=0;u0&&a&&v--),o.append(e("rect",{"data-value":f,fill:p.call(t,f,u,i),x:r,y:v,width:m,height:l}))}})),s.register("line",{delimiter:",",fill:"#c6d9fd",height:16,min:0,stroke:"#4d89f9",strokeWidth:1,width:32},(t=>{const i=t.values;1==i.length&&i.push(i[0]);const s=Math.max.apply(Math,null==t.options.max?i:i.concat(t.options.max)),n=Math.min.apply(Math,null==t.options.min?i:i.concat(t.options.min)),o=t.prepare(t.options.width,t.options.height),l=t.options.strokeWidth,r=o.clientWidth,a=o.clientHeight-l,h=s-n,p=t=>{let e=a;return h&&(e-=(t-n)/h*a),e+l/2};let c=p(Math.max(n,0)),d=[0,c];for(var u=0;u