{"version":3,"file":"circularProgressBar.min.js","sources":["../sources/helpers/defaults.js","../sources/helpers/function.js","../sources/index.js"],"sourcesContent":["/**\r\n * @typedef {Object} - Default object\r\n * @prop {String} [colorSlice] - Progress color circle\r\n * @prop {String} [fontColor] - Font color\r\n * @prop {String} [fontSize] - Font size\r\n * @prop {Number} [fontWeight] - Font weight\r\n * @prop {Array} [linearGradient] - Linear gradien for circle\r\n * @prop {Boolean} [number] - Show/hide number\r\n * @prop {Boolean} [round] - Path rounding\r\n * @prop {String} [fill] - Inner circle color\r\n * @prop {String} [unit] - Different unit instead of percentage (%) inside the circle\r\n * @prop {Number} [rotation] - Chart rotation\r\n * @prop {Number} [size] - Size progress bar width and height in px\r\n * @prop {Number} [stroke] - Stroke width, chart thickness\r\n */\r\n/**\r\n * Returns the default options of the component\r\n * @return {CPBOptions}\r\n */\r\nconst defaultOptions = {\r\n colorSlice: '#00a1ff',\r\n fontColor: '#000',\r\n fontSize: '1.6rem',\r\n fontWeight: 400,\r\n lineargradient: false,\r\n number: true,\r\n round: false,\r\n fill: 'none',\r\n unit: '%',\r\n rotation: -90,\r\n size: 200,\r\n stroke: 10,\r\n};\r\n\r\nexport default defaultOptions;\r\n","/**\r\n *\r\n * @param {Object} object\r\n * @returns {String}\r\n */\r\nconst styleTransform = ({ rotation, animationSmooth }) => {\r\n const smoothAnimation = animationSmooth\r\n ? `transition: stroke-dashoffset ${animationSmooth}`\r\n : '';\r\n\r\n return `transform:rotate(${rotation}deg);transform-origin: 50% 50%;${smoothAnimation}`;\r\n};\r\n\r\n/**\r\n * Set \"stroke-dasharray\": \"1, 2\"\r\n * @param {String} type\r\n * @returns {Object}\r\n */\r\nconst strokeDasharray = (type) => {\r\n return {\r\n 'stroke-dasharray': type || '264',\r\n };\r\n};\r\n\r\n/**\r\n * Set type stroke-linecap\r\n * @param {String} round\r\n * @returns {Object}\r\n */\r\nconst strokeLinecap = ({ round }) => {\r\n return {\r\n 'stroke-linecap': round ? 'round' : '',\r\n };\r\n};\r\n\r\n/**\r\n * Set font sieze/weight\r\n *\r\n * @param {Object} options\r\n * @returns {Object}\r\n */\r\nconst fontSettings = (options) => {\r\n return {\r\n 'font-size': options.fontSize,\r\n 'font-weight': options.fontWeight,\r\n };\r\n};\r\n\r\n/**\r\n *\r\n * @param {String} element\r\n * @returns {HTMLElement}\r\n */\r\nconst querySelector = (element) => document.querySelector(element);\r\n\r\n/**\r\n * Set color or linear-gradient\r\n *\r\n * @param {String} element\r\n * @param {Object} object\r\n */\r\nconst setColor = (element, { lineargradient, index, colorSlice }) => {\r\n element.setAttribute(\r\n 'stroke',\r\n lineargradient ? `url(#linear-${index})` : colorSlice\r\n );\r\n};\r\n\r\n/**\r\n * Set attribute to specific element\r\n *\r\n * @param {String} element\r\n * @param {Object} object\r\n */\r\nconst setAttribute = (element, object) => {\r\n for (const key in object) {\r\n element?.setAttribute(key, object[key]);\r\n }\r\n};\r\n\r\n/**\r\n * Create svg element\r\n *\r\n * @param {String} type\r\n * @returns {SVGElement}\r\n */\r\nconst createNSElement = (type) =>\r\n document.createElementNS('http://www.w3.org/2000/svg', type);\r\n\r\n/**\r\n * Create svg tspan\r\n *\r\n * @param {String} className\r\n * @param {String} unit\r\n * @returns {HTMLElement}\r\n */\r\nconst tspan = (className, unit) => {\r\n const element = createNSElement('tspan');\r\n\r\n element.classList.add(className);\r\n if (unit) element.textContent = unit;\r\n return element;\r\n};\r\n\r\n/**\r\n * Function generate stroke-dashoffset\r\n *\r\n * @param {Number} count\r\n * @param {Boolean} inverse - Counterclockwise animation\r\n * @param {Number} cut - Angle of the circle sector\r\n * @returns {Number}\r\n */\r\nconst dashOffset = (count, inverse, cut) => {\r\n const cutChar = cut ? (264 / 100) * (100 - cut) : 264;\r\n const angle = 264 - (count / 100) * cutChar;\r\n\r\n return inverse ? -angle : angle;\r\n};\r\n\r\n/**\r\n * @param {HTMLElement} element\r\n * @param {HTMLElement} el\r\n * @param {String} type\r\n */\r\nconst insertAdElement = (element, el, type = 'beforeend') =>\r\n element.insertAdjacentElement(type, el);\r\n\r\n/**\r\n * Generator function linear-gradient stop svg elements\r\n *\r\n * @param {Object} object\r\n */\r\nconst gradient = ({ index, lineargradient }) => {\r\n const defsElement = createNSElement('defs');\r\n const linearGradient = createNSElement('linearGradient');\r\n linearGradient.id = `linear-${index}`;\r\n\r\n const countGradient = [].slice.call(lineargradient);\r\n\r\n defsElement.appendChild(linearGradient);\r\n\r\n let number = 0;\r\n countGradient.map((item) => {\r\n const stopElements = createNSElement('stop');\r\n\r\n const stopObj = {\r\n offset: `${number}%`,\r\n 'stop-color': `${item}`,\r\n };\r\n setAttribute(stopElements, stopObj);\r\n\r\n linearGradient.appendChild(stopElements);\r\n number += 100 / (countGradient.length - 1);\r\n });\r\n\r\n return defsElement;\r\n};\r\n\r\n/**\r\n * A function that generates tspan\r\n * elements with a number and unit\r\n *\r\n * @param {Object} options - Global configuration\r\n * @param {String} className\r\n */\r\nconst percent = (options, className) => {\r\n const creatTextElementSVG = createNSElement('text');\r\n\r\n creatTextElementSVG.classList.add(`${className}-text-${options.index}`);\r\n\r\n // create tspan element with number\r\n // and insert to svg text element\r\n insertAdElement(\r\n creatTextElementSVG,\r\n tspan(`${className}-percent-${options.index}`)\r\n );\r\n\r\n // create and insert unit to text element\r\n insertAdElement(\r\n creatTextElementSVG,\r\n tspan(`${className}-unit-${options.index}`, options.unit)\r\n );\r\n\r\n // config to svg text\r\n const obj = {\r\n x: '50%',\r\n y: '50%',\r\n fill: options.fontColor,\r\n 'text-anchor': 'middle',\r\n dy: options.textPosition || '0.35em',\r\n ...fontSettings(options),\r\n };\r\n\r\n setAttribute(creatTextElementSVG, obj);\r\n return creatTextElementSVG;\r\n};\r\n\r\nexport {\r\n createNSElement,\r\n dashOffset,\r\n fontSettings,\r\n gradient,\r\n insertAdElement,\r\n percent,\r\n querySelector,\r\n setAttribute,\r\n setColor,\r\n strokeDasharray,\r\n strokeLinecap,\r\n styleTransform,\r\n};\r\n","import defaultOptions from \"./helpers/defaults\";\r\nimport {\r\n createNSElement,\r\n dashOffset,\r\n fontSettings,\r\n gradient,\r\n insertAdElement,\r\n percent,\r\n querySelector,\r\n setAttribute,\r\n setColor,\r\n strokeDasharray,\r\n strokeLinecap,\r\n styleTransform,\r\n} from \"./helpers/function\";\r\n\r\n/**\r\n * @class\r\n */\r\nexport default class CircularProgressBar {\r\n /**\r\n * CircularProgressBar constructor\r\n *\r\n * @param {String} pieName - class name\r\n * @param {Object} globalObj - global configuration\r\n */\r\n constructor(pieName, globalObj = {}) {\r\n this._className = pieName;\r\n this._globalObj = globalObj;\r\n\r\n const pieElements = document.querySelectorAll(`.${pieName}`);\r\n const elements = [].slice.call(pieElements);\r\n // add index to all progressbar\r\n elements.map((item, idx) => {\r\n const id = JSON.parse(item.getAttribute(\"data-pie\"));\r\n item.setAttribute(\r\n \"data-pie-index\",\r\n id.index || globalObj.index || idx + 1\r\n );\r\n });\r\n\r\n this._elements = elements;\r\n }\r\n\r\n /**\r\n * @param {object} outside\r\n */\r\n initial(outside) {\r\n const triggeredOutside = outside || this._elements;\r\n Array.isArray(triggeredOutside)\r\n ? triggeredOutside.map((element) => this._createSVG(element))\r\n : this._createSVG(triggeredOutside);\r\n }\r\n\r\n /**\r\n * @param {SVGAElement} svg\r\n * @param {HTMLElement} target\r\n * @param {Object} options\r\n */\r\n _progress(svg, target, options) {\r\n const pieName = this._className;\r\n if (options.number) {\r\n insertAdElement(svg, percent(options, pieName));\r\n }\r\n\r\n const progressCircle = querySelector(`.${pieName}-circle-${options.index}`);\r\n\r\n const configCircle = {\r\n fill: \"none\",\r\n \"stroke-width\": options.stroke,\r\n \"stroke-dashoffset\": \"264\",\r\n ...strokeDasharray(),\r\n ...strokeLinecap(options),\r\n };\r\n setAttribute(progressCircle, configCircle);\r\n\r\n // animation progress\r\n this.animationTo({ ...options, element: progressCircle }, true);\r\n\r\n // set style and rotation\r\n progressCircle.setAttribute(\"style\", styleTransform(options));\r\n\r\n // set color\r\n setColor(progressCircle, options);\r\n\r\n // set width and height on div\r\n target.setAttribute(\r\n \"style\",\r\n `width:${options.size}px;height:${options.size}px;`\r\n );\r\n }\r\n\r\n /**\r\n * Callback function\r\n *\r\n * @param {Object} options\r\n * @param {Boolean} initial\r\n */\r\n animationTo(options, initial = false) {\r\n const pieName = this._className;\r\n const previousConfigObj = JSON.parse(\r\n querySelector(`[data-pie-index=\"${options.index}\"]`).getAttribute(\r\n \"data-pie\"\r\n )\r\n );\r\n\r\n const circleElement = querySelector(`.${pieName}-circle-${options.index}`);\r\n\r\n if (!circleElement) return;\r\n\r\n // merging all configuration objects\r\n const commonConfiguration = initial\r\n ? options\r\n : {\r\n ...defaultOptions,\r\n ...previousConfigObj,\r\n ...options,\r\n ...this._globalObj,\r\n };\r\n\r\n // update color circle\r\n if (!initial) {\r\n setColor(circleElement, commonConfiguration);\r\n }\r\n\r\n // font color update\r\n if (!initial && commonConfiguration.number) {\r\n const fontconfig = {\r\n fill: commonConfiguration.fontColor,\r\n ...fontSettings(commonConfiguration),\r\n };\r\n const textElement = querySelector(\r\n `.${pieName}-text-${commonConfiguration.index}`\r\n );\r\n setAttribute(textElement, fontconfig);\r\n }\r\n\r\n const centerNumber = querySelector(`.${pieName}-percent-${options.index}`);\r\n\r\n if (commonConfiguration.animationOff) {\r\n if (commonConfiguration.number)\r\n centerNumber.textContent = `${commonConfiguration.percent}`;\r\n circleElement.setAttribute(\r\n \"stroke-dashoffset\",\r\n dashOffset(commonConfiguration.percent, commonConfiguration.inverse)\r\n );\r\n return;\r\n }\r\n\r\n // get numer percent from data-angel\r\n let angle = JSON.parse(circleElement.getAttribute(\"data-angel\"));\r\n\r\n // round if number is decimal\r\n const percent = Math.round(options.percent);\r\n\r\n // if percent 0 then set at start 0%\r\n if (percent == 0) {\r\n if (commonConfiguration.number) centerNumber.textContent = \"0\";\r\n circleElement.setAttribute(\"stroke-dashoffset\", \"264\");\r\n }\r\n\r\n if (percent > 100 || percent <= 0 || angle === percent) return;\r\n\r\n let request;\r\n let i = initial ? 0 : angle;\r\n\r\n const fps = commonConfiguration.speed || 1000;\r\n const interval = 1000 / fps;\r\n const tolerance = 0.1;\r\n let then = performance.now();\r\n\r\n const performAnimation = (now) => {\r\n request = requestAnimationFrame(performAnimation);\r\n const delta = now - then;\r\n\r\n if (delta >= interval - tolerance) {\r\n then = now - (delta % interval);\r\n\r\n angle >= commonConfiguration.percent ? i-- : i++;\r\n }\r\n\r\n circleElement.setAttribute(\r\n \"stroke-dashoffset\",\r\n dashOffset(i, commonConfiguration.inverse, commonConfiguration.cut)\r\n );\r\n if (centerNumber && commonConfiguration.number) {\r\n centerNumber.textContent = `${i}`;\r\n }\r\n\r\n circleElement.setAttribute(\"data-angel\", i);\r\n circleElement.parentNode.setAttribute(\"aria-valuenow\", i);\r\n\r\n if (i === percent) {\r\n cancelAnimationFrame(request);\r\n }\r\n };\r\n\r\n requestAnimationFrame(performAnimation);\r\n }\r\n\r\n /**\r\n * Create svg elements\r\n *\r\n * @param {HTMLElement} element\r\n */\r\n _createSVG(element) {\r\n const index = element.getAttribute(\"data-pie-index\");\r\n const json = JSON.parse(element.getAttribute(\"data-pie\"));\r\n\r\n const options = { ...defaultOptions, ...json, index, ...this._globalObj };\r\n\r\n const svg = createNSElement(\"svg\");\r\n\r\n const configSVG = {\r\n role: \"progressbar\",\r\n width: options.size,\r\n height: options.size,\r\n viewBox: \"0 0 100 100\",\r\n \"aria-valuemin\": \"0\",\r\n \"aria-valuemax\": \"100\",\r\n };\r\n\r\n setAttribute(svg, configSVG);\r\n\r\n // colorCircle\r\n if (options.colorCircle) {\r\n svg.appendChild(this._circle(options));\r\n }\r\n\r\n // gradient\r\n if (options.lineargradient) {\r\n svg.appendChild(gradient(options));\r\n }\r\n\r\n svg.appendChild(this._circle(options, \"top\"));\r\n\r\n element.appendChild(svg);\r\n\r\n this._progress(svg, element, options);\r\n }\r\n\r\n /**\r\n * Create circle top/bottom\r\n *\r\n * @param {Object} options\r\n * @param {String} where\r\n * @returns {SVGElement}\r\n */\r\n _circle(options, where = \"bottom\") {\r\n const circle = createNSElement(\"circle\");\r\n\r\n let configCircle = {};\r\n if (options.cut) {\r\n const dashoffset = 264 - (100 - options.cut) * 2.64;\r\n configCircle = {\r\n \"stroke-dashoffset\": options.inverse ? -dashoffset : dashoffset,\r\n style: styleTransform(options),\r\n ...strokeDasharray(),\r\n ...strokeLinecap(options),\r\n };\r\n }\r\n\r\n const objCircle = {\r\n fill: options.fill,\r\n stroke: options.colorCircle,\r\n \"stroke-width\": options.strokeBottom || options.stroke,\r\n ...configCircle,\r\n };\r\n\r\n if (options.strokeDasharray) {\r\n Object.assign(objCircle, { ...strokeDasharray(options.strokeDasharray) });\r\n }\r\n\r\n const typeCircle =\r\n where === \"top\"\r\n ? { class: `${this._className}-circle-${options.index}` }\r\n : objCircle;\r\n\r\n const objConfig = {\r\n cx: \"50%\",\r\n cy: \"50%\",\r\n r: 42,\r\n \"shape-rendering\": \"geometricPrecision\",\r\n ...typeCircle,\r\n };\r\n\r\n setAttribute(circle, objConfig);\r\n\r\n return circle;\r\n }\r\n}\r\n"],"names":["defaultOptions","colorSlice","fontColor","fontSize","fontWeight","lineargradient","number","round","fill","unit","rotation","size","stroke","styleTransform","animationSmooth","strokeDasharray","type","strokeLinecap","fontSettings","options","querySelector","element","document","setColor","index","setAttribute","object","key","createNSElement","createElementNS","tspan","className","classList","add","textContent","dashOffset","count","inverse","cut","angle","insertAdElement","el","insertAdjacentElement","constructor","pieName","globalObj","_className","_globalObj","pieElements","querySelectorAll","elements","slice","call","map","item","idx","id","JSON","parse","getAttribute","_elements","initial","outside","triggeredOutside","this","Array","isArray","_createSVG","_progress","svg","target","creatTextElementSVG","obj","x","y","dy","textPosition","percent","progressCircle","configCircle","animationTo","previousConfigObj","circleElement","commonConfiguration","fontconfig","textElement","centerNumber","animationOff","Math","request","i","interval","speed","then","performance","now","performAnimation","requestAnimationFrame","delta","parentNode","cancelAnimationFrame","json","configSVG","role","width","height","viewBox","colorCircle","appendChild","_circle","defsElement","linearGradient","countGradient","stopElements","offset","length","gradient","where","circle","dashoffset","style","objCircle","strokeBottom","Object","assign","objConfig","cx","cy","r","class"],"mappings":"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"}