@vielzeug/prism 26.10.14 → 26.10.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_dev.cjs.map +1 -1
- package/dist/_dev.js +6 -1
- package/dist/_dev.js.map +1 -1
- package/dist/_tappers.cjs.map +1 -1
- package/dist/_tappers.js +25 -1
- package/dist/_tappers.js.map +1 -1
- package/dist/animation/easing.cjs.map +1 -1
- package/dist/animation/easing.js +15 -1
- package/dist/animation/easing.js.map +1 -1
- package/dist/animation/motion.cjs.map +1 -1
- package/dist/animation/motion.js +15 -1
- package/dist/animation/motion.js.map +1 -1
- package/dist/animation/reveal.cjs.map +1 -1
- package/dist/animation/reveal.js +97 -1
- package/dist/animation/reveal.js.map +1 -1
- package/dist/animation/transition.cjs.map +1 -1
- package/dist/animation/transition.js +39 -1
- package/dist/animation/transition.js.map +1 -1
- package/dist/animation/tween.cjs.map +1 -1
- package/dist/animation/tween.js +7 -1
- package/dist/animation/tween.js.map +1 -1
- package/dist/axes/axis.cjs.map +1 -1
- package/dist/axes/axis.js +76 -1
- package/dist/axes/axis.js.map +1 -1
- package/dist/axes/grid.cjs.map +1 -1
- package/dist/axes/grid.js +29 -1
- package/dist/axes/grid.js.map +1 -1
- package/dist/axes/scale-utils.cjs.map +1 -1
- package/dist/axes/scale-utils.js +10 -1
- package/dist/axes/scale-utils.js.map +1 -1
- package/dist/charts/area/area-chart.cjs.map +1 -1
- package/dist/charts/area/area-chart.js +71 -1
- package/dist/charts/area/area-chart.js.map +1 -1
- package/dist/charts/area/area-renderer.cjs.map +1 -1
- package/dist/charts/area/area-renderer.js +128 -1
- package/dist/charts/area/area-renderer.js.map +1 -1
- package/dist/charts/bar/bar-chart.cjs.map +1 -1
- package/dist/charts/bar/bar-chart.js +228 -1
- package/dist/charts/bar/bar-chart.js.map +1 -1
- package/dist/charts/bar/bar-hit-test.cjs.map +1 -1
- package/dist/charts/bar/bar-hit-test.js +25 -1
- package/dist/charts/bar/bar-hit-test.js.map +1 -1
- package/dist/charts/bar/bar-renderer.cjs.map +1 -1
- package/dist/charts/bar/bar-renderer.js +139 -1
- package/dist/charts/bar/bar-renderer.js.map +1 -1
- package/dist/charts/line/line-chart.cjs.map +1 -1
- package/dist/charts/line/line-chart.js +93 -1
- package/dist/charts/line/line-chart.js.map +1 -1
- package/dist/charts/line/line-renderer.cjs.map +1 -1
- package/dist/charts/line/line-renderer.js +143 -1
- package/dist/charts/line/line-renderer.js.map +1 -1
- package/dist/charts/pie/pie-chart.cjs +1 -1
- package/dist/charts/pie/pie-chart.cjs.map +1 -1
- package/dist/charts/pie/pie-chart.js +207 -1
- package/dist/charts/pie/pie-chart.js.map +1 -1
- package/dist/charts/pie/pie-renderer.cjs.map +1 -1
- package/dist/charts/pie/pie-renderer.js +68 -1
- package/dist/charts/pie/pie-renderer.js.map +1 -1
- package/dist/charts/radar/radar-chart.cjs +1 -1
- package/dist/charts/radar/radar-chart.cjs.map +1 -1
- package/dist/charts/radar/radar-chart.js +281 -1
- package/dist/charts/radar/radar-chart.js.map +1 -1
- package/dist/charts/radar/radar-geometry.cjs.map +1 -1
- package/dist/charts/radar/radar-geometry.js +69 -1
- package/dist/charts/radar/radar-geometry.js.map +1 -1
- package/dist/charts/scatter/scatter-chart.cjs.map +1 -1
- package/dist/charts/scatter/scatter-chart.js +69 -1
- package/dist/charts/scatter/scatter-chart.js.map +1 -1
- package/dist/charts/scatter/scatter-renderer.cjs.map +1 -1
- package/dist/charts/scatter/scatter-renderer.js +57 -1
- package/dist/charts/scatter/scatter-renderer.js.map +1 -1
- package/dist/charts/sparkline/sparkline.cjs +1 -1
- package/dist/charts/sparkline/sparkline.cjs.map +1 -1
- package/dist/charts/sparkline/sparkline.js +251 -1
- package/dist/charts/sparkline/sparkline.js.map +1 -1
- package/dist/core/cartesian-model.cjs +1 -1
- package/dist/core/cartesian-model.cjs.map +1 -1
- package/dist/core/cartesian-model.js +26 -1
- package/dist/core/cartesian-model.js.map +1 -1
- package/dist/core/cartesian-scales.cjs.map +1 -1
- package/dist/core/cartesian-scales.js +38 -1
- package/dist/core/cartesian-scales.js.map +1 -1
- package/dist/core/chart-base.cjs.map +1 -1
- package/dist/core/chart-base.js +62 -1
- package/dist/core/chart-base.js.map +1 -1
- package/dist/core/chart-scaffold.cjs.map +1 -1
- package/dist/core/chart-scaffold.js +103 -1
- package/dist/core/chart-scaffold.js.map +1 -1
- package/dist/core/datum-style.cjs +1 -1
- package/dist/core/datum-style.cjs.map +1 -1
- package/dist/core/datum-style.js +22 -1
- package/dist/core/datum-style.js.map +1 -1
- package/dist/core/ids.cjs.map +1 -1
- package/dist/core/ids.js +8 -1
- package/dist/core/ids.js.map +1 -1
- package/dist/core/layout.cjs.map +1 -1
- package/dist/core/layout.js +22 -1
- package/dist/core/layout.js.map +1 -1
- package/dist/core/polar.cjs.map +1 -1
- package/dist/core/polar.js +13 -1
- package/dist/core/polar.js.map +1 -1
- package/dist/core/responsive.cjs.map +1 -1
- package/dist/core/responsive.js +20 -1
- package/dist/core/responsive.js.map +1 -1
- package/dist/core/series-id.cjs.map +1 -1
- package/dist/core/series-id.js +7 -1
- package/dist/core/series-id.js.map +1 -1
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.js +9 -1
- package/dist/errors.js.map +1 -1
- package/dist/index.js +13 -1
- package/dist/interaction/announcer.cjs.map +1 -1
- package/dist/interaction/announcer.js +25 -1
- package/dist/interaction/announcer.js.map +1 -1
- package/dist/interaction/crosshair.cjs.map +1 -1
- package/dist/interaction/crosshair.js +37 -1
- package/dist/interaction/crosshair.js.map +1 -1
- package/dist/interaction/events.cjs.map +1 -1
- package/dist/interaction/events.js +11 -1
- package/dist/interaction/events.js.map +1 -1
- package/dist/interaction/legend.cjs.map +1 -1
- package/dist/interaction/legend.js +31 -1
- package/dist/interaction/legend.js.map +1 -1
- package/dist/interaction/scatter-interaction.cjs.map +1 -1
- package/dist/interaction/scatter-interaction.js +105 -1
- package/dist/interaction/scatter-interaction.js.map +1 -1
- package/dist/interaction/series-interaction.cjs.map +1 -1
- package/dist/interaction/series-interaction.js +163 -1
- package/dist/interaction/series-interaction.js.map +1 -1
- package/dist/interaction/tooltip.cjs +1 -1
- package/dist/interaction/tooltip.cjs.map +1 -1
- package/dist/interaction/tooltip.js +87 -1
- package/dist/interaction/tooltip.js.map +1 -1
- package/dist/prism.cjs +1 -1
- package/dist/prism.cjs.map +1 -1
- package/dist/prism.iife.js +1 -1
- package/dist/prism.iife.js.map +1 -1
- package/dist/prism.js +2930 -1
- package/dist/prism.js.map +1 -1
- package/dist/scales/band.cjs.map +1 -1
- package/dist/scales/band.js +39 -1
- package/dist/scales/band.js.map +1 -1
- package/dist/scales/linear.cjs.map +1 -1
- package/dist/scales/linear.js +43 -1
- package/dist/scales/linear.js.map +1 -1
- package/dist/scales/time.cjs.map +1 -1
- package/dist/scales/time.js +61 -1
- package/dist/scales/time.js.map +1 -1
- package/dist/svg/element.cjs +1 -1
- package/dist/svg/element.cjs.map +1 -1
- package/dist/svg/element.js +16 -1
- package/dist/svg/element.js.map +1 -1
- package/dist/svg/path.cjs.map +1 -1
- package/dist/svg/path.js +48 -1
- package/dist/svg/path.js.map +1 -1
- package/dist/svg/text.cjs.map +1 -1
- package/dist/svg/text.js +13 -1
- package/dist/svg/text.js.map +1 -1
- package/dist/theme/index.cjs.map +1 -1
- package/dist/theme/index.js +37 -1
- package/dist/theme/index.js.map +1 -1
- package/package.json +5 -5
package/dist/prism.js
CHANGED
|
@@ -1,2 +1,2931 @@
|
|
|
1
|
-
import{computePosition as e,flip as t,getClippingAncestorRect as n,offset as r,shift as i}from"@vielzeug/orbit";var a=`http://www.w3.org/2000/svg`;function createSvgElement(e,t){let n=document.createElementNS(a,e);return t&&setAttributes(n,t),n}function setAttributes(e,t){for(let[n,r]of Object.entries(t)){if(r===void 0){e.removeAttribute(n);continue}typeof r==`number`&&!Number.isFinite(r)&&`${n}${e.tagName}${r}`,e.setAttribute(n,String(r))}}function removeChildren(e){for(;e.firstChild;)e.removeChild(e.firstChild)}var o=.6;function estimateTextWidth(e,t){return e.length*t*o}function createTextElement(e,t){let n=createSvgElement(`text`,t);return n.textContent=e,n}function isBandScale(e){return typeof e.bandwidth==`function`}function mapTick(e,t){return isBandScale(e)?e.map(t)+e.bandwidth()/2:e.map(t)}var s=11,c=8,l=new Intl.NumberFormat(void 0,{maximumSignificantDigits:3,notation:`compact`}),defaultTickFormat=e=>e instanceof Date?e.toLocaleDateString(void 0,{month:`short`,year:`numeric`}):typeof e==`number`&&Math.abs(e)>=1e5?l.format(e):String(e);function resolveTicks(e,t,n){return t.tickValues?[...t.tickValues]:e.ticks(n)}function positionAxis(e,t,n,r){let i=t===`bottom`?`translate(0,${r})`:t===`right`?`translate(${n},0)`:void 0;i?e.setAttribute(`transform`,i):e.removeAttribute(`transform`)}function resolveTickCount(e,t,n){let r=e.position??n,i=r===`bottom`||r===`top`?Math.max(2,Math.floor(t/80)):Math.max(2,Math.floor(t/50));return e.tickCount??i}function categoryTickCount(e,t,n,r){if(e.length===0)return 0;let i=r?Math.max(...e.map(e=>estimateTextWidth(t(e),s))):s*1.3;return Math.max(1,Math.min(e.length,Math.floor(n/(i+c))))}function renderAxis(e,t,n,r,i=`bottom`){removeChildren(e);let a=n.position??i,o=a===`bottom`||a===`top`,s=a===`top`||a===`left`,c=s?-1:1,l=createSvgElement(`line`,{"aria-hidden":`true`,class:`prism-axis-line`,x1:0,x2:o?r:0,y1:0,y2:o?0:r});e.appendChild(l);let u=n.tickFormat??defaultTickFormat,d=resolveTicks(t,n,n.tickCount===void 0&&`bandwidth`in t?categoryTickCount(t.domain,u,r,o):resolveTickCount(n,r,i));n.tickValues&&n.tickValues;for(let n of d){let r=mapTick(t,n),i=createSvgElement(`line`,{"aria-hidden":`true`,class:`prism-axis-tick`,x1:o?r:0,x2:o?r:6*c,y1:o?0:r,y2:o?6*c:r});e.appendChild(i);let a=createTextElement(u(n),{"aria-hidden":`true`,class:`prism-axis-label`,"dominant-baseline":o?s?`auto`:`hanging`:`middle`,"text-anchor":o?`middle`:s?`end`:`start`,x:o?r:6*c*1.5,y:o?6*c*1.5:r});e.appendChild(a)}if(n.label){let t=createTextElement(n.label,{class:`prism-axis-title`,"dominant-baseline":`middle`,"text-anchor":`middle`});o?setAttributes(t,{x:r/2,y:6*c*6}):setAttributes(t,{transform:`translate(${6*c*7}, ${r/2}) rotate(-90)`}),e.appendChild(t)}}function renderGrid(e,t,n,r,i,a){removeChildren(e);let o=n!==!0&&n.color||void 0,s=n!==!0&&n.dash||void 0;for(let n of a){let a=mapTick(t,n),c={class:`prism-grid-line`,stroke:o??`var(--prism-grid-color)`,"stroke-dasharray":s,"stroke-opacity":`var(--prism-grid-opacity)`};i===`vertical`?Object.assign(c,{x1:a,x2:a,y1:0,y2:r}):Object.assign(c,{x1:0,x2:r,y1:a,y2:a}),e.appendChild(createSvgElement(`line`,c))}}function niceNumber(e,t){let n=Math.floor(Math.log10(e)),r=e/10**n,i;return i=t?r<1.5?1:r<3?2:r<7?5:10:r<=1?1:r<=2?2:r<=5?5:10,i*10**n}function niceRange(e,t,n){if(!Number.isFinite(e)||!Number.isFinite(t))return[0,1];if(e>t&&([e,t]=[t,e]),e===t)return[e-1,t+1];let r=niceNumber(niceNumber(t-e,!1)/Math.max(1,n-1),!0);return[Math.floor(e/r)*r,Math.ceil(t/r)*r]}function linearScale(e){let getDomain=()=>e.nice===!1?e.domain:niceRange(e.domain[0],e.domain[1],10),getRange=()=>e.range;return{get domain(){return getDomain()},invert(e){let[t,n]=getDomain(),[r,i]=getRange();return i===r?t:t+(e-r)/(i-r)*(n-t)},map(t){let[n,r]=getDomain(),[i,a]=getRange();if(r===n)return i;let o=(t-n)/(r-n);return e.clamp&&(o=Math.max(0,Math.min(1,o))),i+o*(a-i)},get range(){return getRange()},ticks(e=10){if(e<=0)return[];let[t,n]=getDomain();if(t===n||e===1)return[t];let r=Math.min(t,n),i=Math.max(t,n),a=niceNumber(niceNumber(i-r,!1)/(e-1),!0),o=Math.ceil(r/a)*a,s=Math.floor(i/a)*a,c=[];for(let e=o;e<=s+a*.5;e+=a)c.push(Math.round(e*0xe8d4a51000)/0xe8d4a51000);return c}}}var u=1e3,d=60*u,f=60*d,p=24*f,m=30*p,h=365*p,g=[u,5*u,15*u,30*u,d,5*d,15*d,30*d,f,3*f,6*f,12*f,p,7*p,m,3*m,6*m,h];function chooseInterval(e,t){let n=Math.abs(e)/Math.max(1,t);for(let e of g)if(e>=n)return e;return h}function niceDomain(e,t){let[n,r]=e;n.getTime()>r.getTime()&&([n,r]=[r,n]);let i=chooseInterval(r.getTime()-n.getTime(),t);return[new Date(Math.floor(n.getTime()/i)*i),new Date(Math.ceil(r.getTime()/i)*i)]}function timeScale(e){let getDomain=()=>e.nice===!1?e.domain:niceDomain(e.domain,10),getRange=()=>e.range;return{get domain(){return getDomain()},invert(e){let[t,n]=getDomain(),[r,i]=getRange();if(i===r)return t;let a=(e-r)/(i-r);return new Date(t.getTime()+a*(n.getTime()-t.getTime()))},map(e){let[t,n]=getDomain(),[r,i]=getRange(),a=n.getTime()-t.getTime();return a===0?r:r+(e.getTime()-t.getTime())/a*(i-r)},get range(){return getRange()},ticks(e=10){let[t,n]=getDomain(),r=chooseInterval(n.getTime()-t.getTime(),e),i=Math.ceil(t.getTime()/r)*r,a=[];for(let e=i;e<=n.getTime();e+=r)a.push(new Date(e));return a}}}function buildXScale(e,t){if(e.length===0||e.some(e=>e==null)||e.some(e=>typeof e==`number`&&!Number.isFinite(e)))return linearScale({domain:[0,1],range:[0,t]});if(e[0]instanceof Date){let n=e,r=Math.min(...n.map(Number)),i=Math.max(...n.map(Number));return timeScale({domain:[new Date(r),new Date(r===i?i+1:i)],nice:!1,range:[0,t]})}let n=e,r=Math.min(...n),i=Math.max(...n);return linearScale({domain:[r,r===i?i+1:i],nice:!1,range:[0,t]})}function buildYScale(e,t,n=!0){if(e.length===0||e.some(e=>e==null)||e.some(e=>!Number.isFinite(e)))return linearScale({domain:[0,1],range:[t,0]});let r=Math.min(...e),i=n?Math.min(0,r):r,a=Math.max(...e);return linearScale({domain:[i,i===a?a+1:a],range:[t,0]})}function createTappers(){let e=new Set,t=!1;return{emit(t){if(e.size!==0)for(let n of e)try{n(t)}catch{}},stop(){t=!0,e.clear()},tap(n,r){if(t||r?.signal?.aborted)return()=>{};e.add(n);let detach=()=>{e.delete(n)};return r?.signal?.addEventListener(`abort`,detach,{once:!0}),detach}}}var PrismError=class extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}},PrismRenderError=class extends PrismError{};function describeValues(e,t,n=String){return`${e}: ${t.map(({datum:e,series:t})=>`${t.name} ${e?n(e.value,e,t):`n/a`}`).join(`, `)}`}function createAnnouncer(e,t){let n=createSvgElement(`text`,{"aria-live":`polite`,class:t,role:`status`,x:-9999,y:-9999});return e.appendChild(n),{announce(e){n.textContent=e},clear(){n.textContent=``}}}function resolvePosition(e){return e===!0?`bottom`:e.position??`bottom`}function createLegend(e,t,n){let r=resolvePosition(t),i=document.createElement(`div`);i.className=`prism-legend prism-legend-${r}`,r===`top`?e.insertBefore(i,e.firstChild):e.appendChild(i);let disposeHandle=()=>{i.remove()};return{dispose:disposeHandle,el:i,[Symbol.dispose]:disposeHandle,update(e){i.replaceChildren();for(let t of e){let e=document.createElement(`div`);e.className=`prism-legend-item`;let n=document.createElement(`span`);n.className=`prism-legend-dot`,n.style.backgroundColor=t.color;let r=document.createElement(`span`);r.className=`prism-legend-label`,r.textContent=t.name,e.appendChild(n),e.appendChild(r),i.appendChild(e)}n?.()}}}var _=`position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap`;function shiftBoundary(e,t){let r=e.getBoundingClientRect(),i={height:r.height,width:r.width,x:r.x,y:r.y},a=n(t),o=Math.max(i.x,a.x),s=Math.max(i.y,a.y),c=Math.min(i.x+i.width,a.x+a.width),l=Math.min(i.y+i.height,a.y+a.height);return c<=o||l<=s?i:{height:l-s,width:c-o,x:o,y:s}}function comparisonContent(e,t,n,r){let i=e.createElement(`div`),a=e.createElement(`span`),o=e.createElement(`div`),s=e.createElement(`div`);i.className=`prism-tooltip-body`,a.className=`prism-tooltip-sr`,a.style.cssText=_,a.textContent=r,o.setAttribute(`aria-hidden`,`true`),s.className=`prism-tooltip-title`,s.textContent=t,o.appendChild(s);for(let t of n){let n=e.createElement(`div`),r=e.createElement(`span`),i=e.createElement(`span`),a=e.createElement(`span`);n.className=`prism-tooltip-row`,r.className=`prism-tooltip-swatch`,r.style.setProperty(`--prism-swatch`,t.color),i.className=`prism-tooltip-name`,i.textContent=t.name,a.className=`prism-tooltip-value`,a.textContent=t.value,n.append(r,i,a),o.appendChild(n)}return i.append(a,o),i}function createTooltip(n,a){let o=n.style.position,s=getComputedStyle(n).position===`static`;s&&(n.style.position=`relative`);let c=n.ownerDocument.createElement(`div`);c.className=`prism-tooltip`,c.style.position=`absolute`,c.style.pointerEvents=`none`,c.style.top=`0`,c.style.left=`0`,c.setAttribute(`role`,`status`),c.setAttribute(`aria-live`,`polite`),n.appendChild(c);let l=a!==!0&&a?.offset||8,u=a===!0?void 0:a?.render,setVisible=e=>{c.classList.toggle(`prism-tooltip--visible`,e),c.style.opacity=e?`1`:`0`},d=null,f=null,p=!1,cancelClear=()=>{f!==null&&(clearTimeout(f),f=null)},cancelReveal=()=>{d!==null&&(cancelAnimationFrame(d),d=null)},disposeHandle=()=>{cancelReveal(),cancelClear(),c.remove(),s&&n.style.position===`relative`&&(n.style.position=o)};return{dispose:disposeHandle,el:c,hide(){cancelReveal(),cancelClear(),p=!1,setVisible(!1),f=setTimeout(()=>{f=null,p||(c.textContent=``)},150)},show(a,o,s,f,m){if(!n.isConnected)return;cancelClear();let h=u?u(s,f):m??`${f.name}: ${s.value}`;typeof h==`string`?c.textContent=h:c.replaceChildren(h);let{x:g,y:_}=e({getBoundingClientRect:()=>{let e=n.getBoundingClientRect();return{bottom:e.top+o,height:0,left:e.left+a,right:e.left+a,top:e.top+o,width:0,x:e.left+a,y:e.top+o}}},c,{containingBlock:n,middleware:[r(l),t(),i({boundary:shiftBoundary(n,c),padding:8})],placement:`top`});if(c.style.left=`${g}px`,c.style.top=`${_}px`,p){d===null&&setVisible(!0);return}p=!0,setVisible(!1),d=requestAnimationFrame(()=>{d=null,p&&setVisible(!0)})},[Symbol.dispose]:disposeHandle}}var v={bottom:48,left:50,right:20,top:20};function resolveMargin(e){return{...v,...e}}function chartArea(e,t,n){return{height:Math.max(0,t-n.top-n.bottom),width:Math.max(0,e-n.left-n.right)}}function observeResize(e,t){if(typeof ResizeObserver>`u`)return()=>{};let n=null,r=new ResizeObserver(e=>{n!==null&&cancelAnimationFrame(n),n=requestAnimationFrame(()=>{n=null;let r=e[0];if(r){let{height:e,width:n}=r.contentRect;t(n,e)}})});return r.observe(e),()=>{n!==null&&cancelAnimationFrame(n),r.disconnect()}}function createChartBase(e,t,n){if(!(typeof e==`object`&&e&&e.nodeType===1&&typeof e.appendChild==`function`&&typeof e.getBoundingClientRect==`function`)){let t=e;throw new PrismRenderError(`Invalid chart configuration: \`container\` must be a DOM Element, received ${t===null?`null`:typeof t==`object`?t.constructor?.name??`object`:typeof t}.`)}let r=resolveMargin(t.margin),i=t.a11y,a=createSvgElement(`svg`,{...!i||i.decorative?{"aria-hidden":`true`}:{"aria-label":i.ariaLabel,role:`img`,tabindex:`0`},class:`prism-chart`,style:`display:block;max-width:100%`}),o=createSvgElement(`g`,{class:`prism-chart-area`,transform:`translate(${r.left},${r.top})`});a.appendChild(o);let s=e.getBoundingClientRect();s.width===0||s.height;let c=s.width||600,l=s.height||300,u={height:l,margin:r,width:c},d=c,f=l,p=l,syncChrome=()=>{let e=Math.max(0,p-(t.chrome?.()?.offsetHeight??0));f=e,u.height=e,setAttributes(a,{height:e,viewBox:`0 0 ${u.width} ${e}`})},m=observeResize(e,(e,r)=>{p=r;let i=t.chrome?.()?.offsetHeight??0,o=Math.max(0,r-i);(e!==d||o!==f)&&(d=e,f=o,u.height=o,u.width=e,setAttributes(a,{height:o,viewBox:`0 0 ${e} ${o}`,width:e}),n?.())});return setAttributes(a,{height:l,viewBox:`0 0 ${c} ${l}`,width:c}),e.appendChild(a),{chartArea:o,dimensions:u,dispose(){m(),a.remove()},svg:a,syncChrome}}function clearCartesianDom(e,t,n,r){removeChildren(e.series),removeChildren(e.grid),removeChildren(e.xAxis),removeChildren(e.yAxis),t?.update([]),n?.hide(),r?.hide()}function runScaffold(e,t,n,r,i){let render=e=>{},a=createTappers(),o=null,s=createChartBase(e,{a11y:t.a11y,chrome:()=>o?.el??null,margin:t.margin},()=>{a.emit({height:s.dimensions.height,type:`resize`,width:s.dimensions.width}),render(`resize`)}),c=t.tooltip?createTooltip(e,t.tooltip):null;o=t.legend?createLegend(e,t.legend,()=>s.syncChrome()):null;let l=new AbortController,u=n(s,c,o,l.signal,createAnnouncer(s.svg,`prism-live`)),d=!1,f=makeEventManager(s.svg);render=e=>{d||f.attach(r(u,e))};try{render(`mount`)}catch(e){throw d=!0,l.abort(),f.detach(),c?.dispose(),o?.dispose(),s.dispose(),e instanceof PrismRenderError?e:new PrismRenderError(`Failed to render chart.`,{cause:e})}return{get disposalSignal(){return l.signal},dispose(){d||(d=!0,a.emit({type:`dispose`}),a.stop(),l.abort(),f.detach(),c?.dispose(),o?.dispose(),s.dispose())},get disposed(){return d},el:s.svg,tap:a.tap,update(e){if(d)throw new PrismRenderError(`Cannot update a disposed chart.`);i(e),render(`update`)},[Symbol.dispose](){this.dispose()}}}function makeEventManager(e){let t=null;return{attach(n){t&&=(t.onMouseMove&&e.removeEventListener(`mousemove`,t.onMouseMove),t.onMouseLeave&&e.removeEventListener(`mouseleave`,t.onMouseLeave),t.onClick&&e.removeEventListener(`click`,t.onClick),t.onKeyDown&&e.removeEventListener(`keydown`,t.onKeyDown),null),n&&(t=n,n.onMouseMove&&e.addEventListener(`mousemove`,n.onMouseMove),n.onMouseLeave&&e.addEventListener(`mouseleave`,n.onMouseLeave),n.onClick&&e.addEventListener(`click`,n.onClick),n.onKeyDown&&e.addEventListener(`keydown`,n.onKeyDown))},detach(){this.attach(void 0)}}}function createChartScaffold(e,t,n,r){return runScaffold(e,t,(t,n,r,i,a)=>{let o={grid:createSvgElement(`g`,{"aria-hidden":`true`,class:`prism-grid`}),series:createSvgElement(`g`,{class:`prism-series`}),xAxis:createSvgElement(`g`,{class:`prism-x-axis`}),yAxis:createSvgElement(`g`,{class:`prism-y-axis`})};return t.chartArea.appendChild(o.grid),t.chartArea.appendChild(o.xAxis),t.chartArea.appendChild(o.yAxis),t.chartArea.appendChild(o.series),{announcer:a,chartArea:t.chartArea,container:e,dimensions:t.dimensions,disposalSignal:i,groups:o,legend:r,svg:t.svg,tooltip:n}},n,r)}function createRadialScaffold(e,t,n,r){return runScaffold(e,t,(t,n,r,i,a)=>({announcer:a,container:e,dimensions:t.dimensions,disposalSignal:i,legend:r,svg:t.svg,tooltip:n}),n,r)}function seriesDomId(e,t){return e?.id?e.id.replace(/[^A-Za-z0-9_-]/g,`-`):`series-${t}`}function createCrosshair(e,t){let n=t===!0||t?.vertical!==!1,r=t!==!0&&t?.horizontal===!0,i=t===!0||t?.snap!==!1,a=createSvgElement(`g`,{"aria-hidden":`true`,class:`prism-crosshair`,style:`display:none`}),o=n?createSvgElement(`line`,{class:`prism-crosshair-v`,"stroke-dasharray":`var(--prism-crosshair-dash, 4 2)`}):null,s=r?createSvgElement(`line`,{class:`prism-crosshair-h`,"stroke-dasharray":`var(--prism-crosshair-dash, 4 2)`}):null;return o&&a.appendChild(o),s&&a.appendChild(s),e.appendChild(a),{hide(){a.style.display=`none`},show(e,t,n,r){a.style.display=``,o&&(setAttributes(o,{x1:0,x2:0,y1:0,y2:r}),o.style.transform=`translateX(${e}px)`),s&&(setAttributes(s,{x1:0,x2:n,y1:0,y2:0}),s.style.transform=`translateY(${t}px)`)},snap:i}}function keyId(e){return e instanceof Date?`date:${e.getTime()}`:`${typeof e}:${String(e)}`}function normalizeCartesianSeries(e,t){let n=[],r=new Map;return{domain:n,labels:r,series:e.map((e,i)=>{let a=new Map;for(let o of t[i]??[]){let t=keyId(o.key);if(a.has(t)){`${String(o.key)}${e.name}`;continue}a.set(t,o),r.has(t)||(r.set(t,o.key),n.push(t))}return{byKey:a,config:e}})}}function getMousePosition(e,t,n,r){let i=e.getBoundingClientRect();return{x:t.clientX-i.left-n,y:t.clientY-i.top-r}}var keyOrder=e=>e instanceof Date?e.getTime():Number(e);function keyLabel(e){return e instanceof Date?e.toLocaleDateString():String(e)}function findNearestKey(e,t,n){let r=null,i=1/0;for(let a=0;a<t.length;a++)for(let o=0;o<(t[a]?.length??0);o++){let s=e[a]?.[o],c=t[a]?.[o];if(!s||!c)continue;let l=Math.abs(c.x-n);l<i&&(i=l,r=s.key)}return r}function createSeriesInteraction(e){let t=-1,n=!1,renderedHit=t=>{let n=t.target;if(!(n instanceof SVGElement)||n.tagName.toLowerCase()!==`circle`||!e.seriesGroup.contains(n)||!n.parentElement)return null;let r=n.parentElement;for(;r&&r.parentNode!==e.seriesGroup;)r=r.parentElement;if(!r)return null;let i=[...e.seriesGroup.children].indexOf(r),a=[...n.parentElement.children].indexOf(n),o=e.getData()[i]?.[a],s=e.getPoints()[i]?.[a];return o&&s?{datum:o,point:s,seriesIndex:i}:null},entriesAt=t=>{let n=keyId(t),r=e.getPoints();return e.getData().map((e,t)=>{let i=e.findIndex(e=>keyId(e.key)===n);return i===-1?{datum:void 0,point:void 0}:{datum:e[i],point:r[t]?.[i]}})},nearestIndex=(e,t)=>{let n=-1,r=1/0;return e.forEach(({point:e},i)=>{if(!e)return;let a=Number.isFinite(t)?Math.abs(e.y-t):0;a<r&&(r=a,n=i)}),n},highlight=(t,n)=>{let r=e.colors();e.markers.replaceChildren(),t.forEach(({point:t},n)=>{t&&e.markers.appendChild(createSvgElement(`circle`,{class:`prism-active-point`,cx:t.x,cy:t.y,fill:r[n],r:4}))});let i=[...e.seriesGroup.children];e.seriesGroup.classList.toggle(`prism-series-focused`,n>=0&&i.length>1);for(let[e,t]of i.entries())t.classList.toggle(`prism-series-active`,e===n)},clear=()=>{e.crosshair?.hide(),e.tooltip?.hide(),e.announcer.clear(),highlight([],-1),n=!1,e.onHover?.(null)},eventFor=(t,n,r)=>{let i=entriesAt(t),a=renderedHit(r),o=a?.seriesIndex??nearestIndex(i,n);a&&(i[o]={datum:a.datum,point:a.point});let s=e.getSeriesList(),c=i[o]?.datum;if(o<0||!c)return null;let l=i.map((e,t)=>({datum:e.datum,series:s[t]}));return{entries:i,event:{datum:c,originalEvent:r,series:s[o],values:l},index:o}},focus=(t,r,i)=>{let a=eventFor(t,r?.y??NaN,i);if(!a)return;let{entries:o,event:s,index:c}=a,l=o[c].point,u=e.dims(),d=chartArea(u.width,u.height,e.margin),f=e.crosshair?.snap===!1&&r,p=e.tooltipFormat?.titleFormat?e.tooltipFormat.titleFormat(t):keyLabel(t),m=s.values??[],h=e.colors(),g=e.tooltipFormat?.valueFormat;e.crosshair?.show(f?r.x:l.x,f?r.y:l.y,d.width,d.height),highlight(o,c);let _=describeValues(p,m,g??String);if(e.tooltip){let t=m.flatMap(({datum:e,series:t},n)=>e?[{color:h[n],name:t.name,value:g?g(e.value,e,t):String(e.value)}]:[]);e.tooltip.show(l.x+e.margin.left,l.y+e.margin.top,s.datum,s.series,comparisonContent(e.svg.ownerDocument,p,t,_))}else e.announcer.announce(_);n=!0,e.onHover?.(s)},pointerKey=t=>{let n=renderedHit(t);if(n)return{key:n.datum.key,pos:n.point};let r=e.getPoints();if(r.every(e=>e.length===0))return null;let i=e.dims(),a=getMousePosition(e.svg,t,e.margin.left,e.margin.top),o=chartArea(i.width,i.height,e.margin);if(a.x<0||a.x>o.width||a.y<0||a.y>o.height)return null;let s=findNearestKey(e.getData(),r,a.x);return s===null?null:{key:s,pos:a}},sortedKeys=()=>[...new Map(e.getData().flat().map(e=>[keyId(e.key),e.key])).values()].sort((e,t)=>keyOrder(e)-keyOrder(t)),onMouseMove=e=>{let t=pointerKey(e);t?focus(t.key,t.pos,e):n&&clear()},onClick=t=>{if(!e.onClick)return;let n=pointerKey(t),r=n&&eventFor(n.key,n.pos.y,t);r&&e.onClick(r.event)},onKeyDown=n=>{let r=sortedKeys();if(r.length===0)return;let i=r.length-1,a={ArrowLeft:t<0?i:Math.max(0,t-1),ArrowRight:t<0?0:Math.min(i,t+1),End:i,Home:0};if(n.key in a)n.preventDefault(),t=a[n.key],focus(r[t],null,n);else if((n.key===`Enter`||n.key===` `)&&t>=0&&e.onClick){n.preventDefault();let i=eventFor(r[t],NaN,n);i&&e.onClick(i.event)}else n.key===`Escape`&&(t=-1,clear())};return{onClick,onKeyDown,onMouseLeave:clear,onMouseMove}}function ensureMarkerGroup(e,t){if(t&&e.contains(t))return t;let n=createSvgElement(`g`,{"aria-hidden":`true`,class:`prism-active-points`,"pointer-events":`none`});return e.appendChild(n),n}var y=8,b={axisColor:`--prism-axis-color`,fontFamily:`--prism-font-family`,gridColor:`--prism-grid-color`,gridOpacity:`--prism-grid-opacity`,textColor:`--prism-text-color`,textColorSecondary:`--prism-text-color-secondary`,tooltipBg:`--prism-tooltip-bg`,tooltipBorder:`--prism-tooltip-border`,tooltipColor:`--prism-tooltip-color`};function target(e){return e?.scope??document.documentElement}function setTheme(e,t){let n=target(t);if(e.colors)for(let t=0;t<y;t++){let r=e.colors[t];r?n.style.setProperty(`--prism-color-${t+1}`,r):n.style.removeProperty(`--prism-color-${t+1}`)}for(let[t,r]of Object.entries(b)){let i=e[t];i!==void 0&&n.style.setProperty(r,String(i))}}function resetTheme(e){let t=target(e);for(let e=1;e<=y;e++)t.style.removeProperty(`--prism-color-${e}`);for(let e of Object.values(b))t.style.removeProperty(e)}function seriesColor(e,t){return t??`var(--prism-color-${e%y+1})`}var x=1.70158,S={"back-out":e=>1+2.70158*(e-1)**3+x*(e-1)**2,"ease-in":e=>e*e*e,"ease-in-out":e=>e<.5?4*e*e*e:1-(-2*e+2)**3/2,"ease-out":e=>1-(1-e)**3,"expo-out":e=>e>=1?1:1-2**(-10*e),linear:e=>e};function resolveEasing(e){return typeof e==`function`?e:e!==void 0&&Object.hasOwn(S,e)?S[e]:S[`ease-out`]}function resolveMotion(e,t){if(e===!1)return{duration:0,stagger:0};let n=e===!0?void 0:e,r=n?.preference??`system`,i=typeof matchMedia<`u`&&matchMedia(`(prefers-reduced-motion: reduce)`).matches,a=r===`never`||r===`system`&&i?0:n?.duration??t?.defaultDuration??300;return{...n,duration:a,stagger:Math.max(0,n?.stagger??t?.defaultStagger??0)}}function tweenNumber(e,t,n){return e+(t-e)*n}function startTween(e){let{count:t,duration:n,easing:r,stagger:i=0,signal:a,onFrame:o,onComplete:s}=e;if(a?.aborted)return()=>{};if(n<=0)return o(()=>1),s?.(),()=>{};if(t===0)return s?.(),()=>{};let c=n+i*(t-1),l=null,u=null,d=!1,cancel=()=>{d=!0,u!==null&&(cancelAnimationFrame(u),u=null),a?.removeEventListener(`abort`,cancel)},frame=e=>{if(d||a?.aborted)return;l===null&&(l=e);let t=e-l;o(e=>r(Math.max(0,Math.min(1,(t-e*i)/n)))),t<c?u=requestAnimationFrame(frame):(u=null,a?.removeEventListener(`abort`,cancel),s?.())};return a?.addEventListener(`abort`,cancel,{once:!0}),u=requestAnimationFrame(frame),cancel}function animate(e,t,n,r){let i=resolveMotion(t);return startTween({count:e.length,duration:i.duration,easing:resolveEasing(i.easing),onComplete:n,onFrame:t=>{for(let[n,r]of e.entries()){let e=t(n);for(let[t,{from:n,to:i}]of Object.entries(r.attrs))r.el.setAttribute(t,String(tweenNumber(n,i,e)))}},signal:r,stagger:i.stagger})}function hasStyledRuns(e){return e?.some(e=>e&&(e.dash!==void 0||e.opacity!==void 0))??!1}function computeStyleRuns(e,t){let n=Math.max(0,t-1);if(n===0)return[];let r=[];for(let t=0;t<n;t++){let n=e[t]??{},i=r[r.length-1];if(i&&i.dash===n.dash&&i.opacity===n.opacity){i.end=t+1;continue}r.push({dash:n.dash,end:t+1,opacity:n.opacity,start:t})}return r}var C=0;function uniqueId(e){return C+=1,`${e}-${C}`}function linePath(e){if(e.length===0)return``;let t=`M${e[0].x},${e[0].y}`;for(let n=1;n<e.length;n++)t+=`L${e[n].x},${e[n].y}`;return t}function monotonePath(e){if(e.length<3)return linePath(e);let t=e.length,n=[];for(let r=0;r<t;r++)r===0?n.push({x:e[1].x-e[0].x,y:e[1].y-e[0].y}):r===t-1?n.push({x:e[t-1].x-e[t-2].x,y:e[t-1].y-e[t-2].y}):n.push({x:(e[r+1].x-e[r-1].x)/2,y:(e[r+1].y-e[r-1].y)/2});let r=`M${e[0].x},${e[0].y}`;for(let i=0;i<t-1;i++){let t=e[i],a=e[i+1],o=n[i],s=n[i+1],c=(a.x-t.x)/3;r+=`C${t.x+c},${t.y+o.y/3},${a.x-c},${a.y-s.y/3},${a.x},${a.y}`}return r}function stepPath(e){if(e.length===0)return``;let t=`M${e[0].x},${e[0].y}`;for(let n=1;n<e.length;n++){let r=(e[n-1].x+e[n].x)/2;t+=`H${r}V${e[n].y}H${e[n].x}`}return t}function areaPath(e,t,n=`linear`){if(e.length===0)return``;let r=n===`monotone`?monotonePath(e):n===`step`?stepPath(e):linePath(e),i=[...t].reverse();if(i.length>0){r+=`L${i[0].x},${i[0].y}`;for(let e=1;e<i.length;e++)r+=`L${i[e].x},${i[e].y}`}return r+=`Z`,r}var w=new WeakMap,T=new WeakMap;function buildLinePath(e,t){return t===`monotone`?monotonePath(e):t===`step`?stepPath(e):linePath(e)}function applyAreaFill(e,t,n){let r=e.querySelector(`linearGradient`);if(n.fill===`gradient`){if(!r){let t=createSvgElement(`defs`);r=createSvgElement(`linearGradient`,{id:uniqueId(`prism-area-fill`),x1:0,x2:0,y1:0,y2:1}),r.append(createSvgElement(`stop`,{class:`prism-area-stop-top`,offset:0}),createSvgElement(`stop`,{class:`prism-area-stop-bottom`,offset:1})),t.appendChild(r),e.insertBefore(t,e.firstChild)}for(let e of r.querySelectorAll(`stop`))e.setAttribute(`stop-color`,n.color),e.style.stopColor=n.color;setAttributes(t,{fill:`url(#${r.id})`})}else r?.parentElement?.remove(),setAttributes(t,{fill:n.color});setAttributes(t,{class:`prism-area-fill prism-area-fill--${n.fill}`,stroke:`none`}),t.style.fillOpacity=n.fillOpacity===void 0?``:String(n.fillOpacity)}function renderArea(e,t,n,r){let i=resolveMotion(r.transition),a=i.duration,o=resolveEasing(i.easing),s=e.querySelector(`.prism-area-fill`);s||(s=createSvgElement(`path`,{class:`prism-area-fill`}),e.appendChild(s)),applyAreaFill(e,s,r);let c=null,l=[],u=[],d=hasStyledRuns(r.marks),f=r.marks??[];if(r.showLine){if(d){l=computeStyleRuns(f,t.length);let n=[...e.querySelectorAll(`.prism-area-line`)];for(let e of n.slice(l.length))e.remove();u=l.map((t,r)=>{let i=n[r];if(i)return i;let a=createSvgElement(`path`,{class:`prism-area-line`,fill:`none`});return e.appendChild(a),a});for(let[e,t]of l.entries())setAttributes(u[e],{opacity:t.opacity,stroke:r.color,"stroke-dasharray":t.dash,"stroke-width":2});c=null}else{let t=[...e.querySelectorAll(`.prism-area-line`)];for(let e of t.slice(1))e.remove();c=t[0]??null,c||(c=createSvgElement(`path`,{class:`prism-area-line`,fill:`none`}),e.appendChild(c)),setAttributes(c,{opacity:void 0,stroke:r.color,"stroke-dasharray":void 0,"stroke-width":2})}}else for(let t of e.querySelectorAll(`.prism-area-line`))t.remove();let drawLine=e=>{if(r.showLine){if(d)for(let[t,n]of l.entries())setAttributes(u[t],{d:buildLinePath(e.slice(n.start,n.end+1),r.curve)});else c&&setAttributes(c,{d:buildLinePath(e,r.curve)})}};if(a===0){let i=t.map(e=>({x:e.x,y:n}));setAttributes(s,{d:areaPath(t,i,r.curve)}),drawLine(t),T.set(e,t);return}w.get(e)?.();let p=T.has(e)?T.get(e)??t:t.map(e=>({x:e.x,y:n})),m=t.map((e,n)=>p[n]??p[p.length-1]??t[n]),paintFrame=i=>{let a=t.map((e,t)=>({x:tweenNumber(m[t].x,e.x,i),y:tweenNumber(m[t].y,e.y,i)})),o=a.map(e=>({x:e.x,y:n}));T.set(e,a),setAttributes(s,{d:areaPath(a,o,r.curve)}),drawLine(a)};paintFrame(0),w.set(e,startTween({count:1,duration:a,easing:o,onComplete:()=>{w.delete(e),T.set(e,t)},onFrame:e=>paintFrame(e(0)),signal:r.disposalSignal}))}function computeAreaPoints(e,t,n){return e.some(e=>e.key==null)||e.some(e=>typeof e.key==`string`),e.map(e=>({x:t.map(e.key),y:n.map(e.value)}))}function createAreaChart(e,t){let n=null,r=null,i=t.series;return createChartScaffold(e,t,e=>{let{groups:a,legend:o,tooltip:s}=e;o?.update(i.map((e,t)=>({color:seriesColor(t,e.color),name:e.name})));let c=e.dimensions,l=chartArea(c.width,c.height,c.margin),u=i.map(e=>e.data),d=u.flat().map(e=>e.key),f=u.flat().map(e=>e.value);if(d.length===0){clearCartesianDom(a,o,s,n),r?.replaceChildren();return}t.crosshair&&!n&&(n=createCrosshair(e.chartArea,t.crosshair));let p=buildXScale(d,l.width),m=buildYScale(f,l.height),h=m.map(0),g=t.xAxis===!1?!1:t.xAxis??{},_=t.yAxis!==!1&&{grid:!0,...t.yAxis};for(_&&_.grid&&renderGrid(a.grid,m,_.grid,l.width,`horizontal`,resolveTicks(m,_,resolveTickCount(_,l.height,`left`))),g&&g.grid&&renderGrid(a.grid,p,g.grid,l.height,`vertical`,resolveTicks(p,g,resolveTickCount(g,l.width,`bottom`))),g?(positionAxis(a.xAxis,g.position??`bottom`,l.width,l.height),renderAxis(a.xAxis,p,g,l.width,`bottom`)):a.xAxis.replaceChildren(),_?(positionAxis(a.yAxis,_.position??`left`,l.width,l.height),renderAxis(a.yAxis,m,_,l.height,`left`)):a.yAxis.replaceChildren();a.series.children.length>i.length;)a.series.removeChild(a.series.lastChild);let v=[];for(let n=0;n<i.length;n++){let r=i[n],o=a.series.children[n];o||(o=createSvgElement(`g`,{class:`prism-area-series`}),a.series.appendChild(o)),o.setAttribute(`data-series-id`,seriesDomId(r,n));let s=computeAreaPoints(u[n],p,m);v.push(s),renderArea(o,s,h,{color:seriesColor(n,r.color),curve:r.curve??`linear`,disposalSignal:e.disposalSignal,fill:r.fill??`gradient`,fillOpacity:r.fillOpacity,marks:r.data,showLine:r.showLine!==!1,transition:t.transition})}return s?.hide(),r=ensureMarkerGroup(e.chartArea,r),createSeriesInteraction({announcer:e.announcer,colors:()=>i.map((e,t)=>seriesColor(t,e.color)),crosshair:n,dims:()=>e.dimensions,getData:()=>u,getPoints:()=>v,getSeriesList:()=>i,margin:e.dimensions.margin,markers:r,onClick:t.onClick,onHover:t.onHover,seriesGroup:a.series,svg:e.svg,tooltip:s,tooltipFormat:typeof t.tooltip==`object`?t.tooltip:void 0})},e=>{i=e})}function bandScale(e){let getDomain=()=>e.domain,getRange=()=>e.range,getBandwidth=()=>{let t=getDomain().length;if(t===0)return 0;let[n,r]=getRange(),i=e.padding??.1;return(r-n)/(t+(t-1)*i+(e.paddingOuter??i)*2)};return{bandwidth:getBandwidth,get domain(){return getDomain()},gap(){let t=e.padding??.1;return getBandwidth()*t},map(t){let n=getDomain().indexOf(t);if(n===-1)return`${t}`,0;let[r]=getRange(),i=getBandwidth(),a=e.padding??.1;return r+(e.paddingOuter??a)*i+n*(i+i*a)},get range(){return getRange()},ticks(e){let t=getDomain();if(e===void 0||e>=t.length)return[...t];if(e<=0)return[];let n=Math.ceil(t.length/e);return t.filter((e,t)=>t%n===0)}}}function findCatIdx(e,t,n){for(let r=0;r<t.length;r++){let i=n.bandCenter(t[r])-n.bandwidth/2;if(e>=i&&e<i+n.bandwidth)return r}return-1}function findSeriesIdx(e,t,n,r,i){if(r.stacked){if(r.horizontal){for(let n=0;n<i;n++)if(r.valueScale.map(r.stackedTops[n]?.[t]??0)>=e.x)return n;return i-1}for(let n=0;n<i;n++)if(r.valueScale.map(r.stackedTops[n]?.[t]??0)<=e.y)return n;return i-1}{let a=r.bandwidth/i,o=r.bandCenter(n[t])-r.bandwidth/2,s=r.horizontal?e.y-o:e.x-o,c=Math.floor(s/a);return Math.max(0,Math.min(i-1,c))}}var E=new WeakMap;function cancelReveal(e){E.get(e)?.()}function playTraceReveal(e,t,n,r,i,a){if(cancelReveal(e),i.duration<=0||a?.aborted)return()=>{};let o=uniqueId(`prism-trace`),s=createSvgElement(`defs`),c=r/2,l=createSvgElement(`mask`,{height:t.height+r,id:o,maskContentUnits:`userSpaceOnUse`,maskUnits:`userSpaceOnUse`,width:t.width+r,x:-c,y:-c}),u=n.map(({d:e})=>{let t=createSvgElement(`path`,{d:e,fill:`none`,pathLength:1,stroke:`white`,"stroke-dasharray":`1 1`,"stroke-dashoffset":1,"stroke-width":r});return l.appendChild(t),t});s.appendChild(l),e.insertBefore(s,e.firstChild),e.setAttribute(`mask`,`url(#${o})`);let cancelTween=()=>{},finish=()=>{E.delete(e),e.removeAttribute(`mask`),s.remove(),a?.removeEventListener(`abort`,finish),cancelTween()};return E.set(e,finish),a?.addEventListener(`abort`,finish,{once:!0}),cancelTween=startTween({count:1,duration:i.duration,easing:resolveEasing(i.easing),onComplete:finish,onFrame:e=>{let t=e(0);for(let[e,r]of u.entries()){let{start:i,end:a}=n[e],o=Math.max(0,Math.min(1,(t-i)/(a-i)));r.setAttribute(`stroke-dashoffset`,String(1-o))}},signal:a}),finish}function playGrowReveal(e,t,n,r,i){if(cancelReveal(e),n(),r.duration<=0||t.length===0||i.signal?.aborted)return()=>{};let a=uniqueId(`prism-reveal`),o=createSvgElement(`defs`),s=createSvgElement(`clipPath`,{id:a}),c=t.map(e=>{let t=createSvgElement(`rect`,{height:0,width:0,x:e.x,y:e.y});return s.appendChild(t),t});o.appendChild(s),e.insertBefore(o,e.firstChild),e.setAttribute(`clip-path`,`url(#${a})`);let cancelTween=()=>{},finish=()=>{E.delete(e),e.removeAttribute(`clip-path`),o.remove(),i.signal?.removeEventListener(`abort`,finish),cancelTween()};return E.set(e,finish),i.signal?.addEventListener(`abort`,finish,{once:!0}),cancelTween=startTween({count:t.length,duration:r.duration,easing:resolveEasing(r.easing),onComplete:finish,onFrame:e=>{for(let[n,r]of c.entries()){let a=t[n],o=Math.max(0,Math.min(1,e(n)));if(i.axis===`y`){let e=a.anchor+(a.y-a.anchor)*o,t=a.anchor+(a.y+a.height-a.anchor)*o;setAttributes(r,{height:Math.max(0,t-e),width:a.width,y:e})}else{let e=a.anchor+(a.x-a.anchor)*o,t=a.anchor+(a.x+a.width-a.anchor)*o;setAttributes(r,{height:a.height,width:Math.max(0,t-e),x:e})}}},signal:i.signal,stagger:i.stagger}),finish}var D=20,O=400,k=new WeakMap;function barsOf(e){return[...e.children].filter(e=>e.classList.contains(`prism-bar`))}function renderBars(e,t,n,r,i,a){k.get(e)?.(),k.delete(e);let o=barsOf(e);for(let e of o.slice(t.length))e.remove();let s=n.bandwidth(),c=a.stacked?s:s/a.seriesCount,l=Math.max(0,c-1),u=a.stacked?0:c*a.seriesIndex,d=a.horizontal??!1,f=o.length===0,p=[],m=[],h=[],g=resolveMotion(a.transition,{defaultStagger:f?0:D}),_=g.duration>0,v=Math.min(g.stagger,O/Math.max(1,t.length));for(let s=0;s<t.length;s++){let c=t[s],g=n.map(c.key)+u,v=a.baselineYs?a.baselineYs[s]:i,y=r.map(c.y),b=o[s],x=!b;if(b||(b=createSvgElement(`rect`,{class:`prism-bar`}),e.appendChild(b)),b.style.display=c.present?``:`none`,setAttributes(b,{opacity:c.opacity,stroke:c.dash?a.color:void 0,"stroke-dasharray":c.dash,"stroke-width":c.dash?1:void 0}),d){let e=Math.max(0,Math.abs(v-y)),t=Math.min(y,v);setAttributes(b,{fill:a.color,height:l,rx:a.borderRadius,ry:a.borderRadius,y:g}),f?(setAttributes(b,{width:e,x:t}),_&&h.push({anchor:v,height:l,width:e,x:t,y:g})):_?x?(setAttributes(b,{width:0,x:v}),p.push({attrs:{width:{from:0,to:e},x:{from:v,to:t}},el:b})):m.push({attrs:{width:{from:Number(b.getAttribute(`width`)??e),to:e},x:{from:Number(b.getAttribute(`x`)??t),to:t}},el:b}):setAttributes(b,{width:e,x:t})}else{let e=Math.max(0,Math.abs(v-y)),t=Math.min(y,v);setAttributes(b,{fill:a.color,rx:a.borderRadius,ry:a.borderRadius,width:l,x:g}),f?(setAttributes(b,{height:e,y:t}),_&&h.push({anchor:v,height:e,width:l,x:g,y:t})):_?x?(setAttributes(b,{height:0,y:v}),p.push({attrs:{height:{from:0,to:e},y:{from:v,to:t}},el:b})):m.push({attrs:{height:{from:Number(b.getAttribute(`height`)??e),to:e},y:{from:Number(b.getAttribute(`y`)??t),to:t}},el:b}):setAttributes(b,{height:e,y:t})}}if(_){let t=[];f&&h.length>0&&t.push(playGrowReveal(e,h,()=>{},g,{axis:d?`x`:`y`,signal:a.disposalSignal,stagger:v})),p.length>0&&t.push(animate(p,{...g,stagger:v},void 0,a.disposalSignal)),m.length>0&&t.push(animate(m,{...g,stagger:0},void 0,a.disposalSignal)),k.set(e,()=>{for(let e of t)e()})}}function variantFlags(e){return{horizontal:e===`grouped-horizontal`||e===`stacked-horizontal`,stacked:e===`stacked`||e===`stacked-horizontal`}}function createBarChart(e,t){let n=t.series,r=null;return createChartScaffold(e,t,(e,i)=>{let{groups:a,legend:o,tooltip:s}=e;o?.update(n.map((e,t)=>({color:seriesColor(t,e.color),name:e.name})));let c=e.dimensions,l=chartArea(c.width,c.height,c.margin),u=n.map(e=>e.data),d=normalizeCartesianSeries(n,u),f=d.domain,p=d.series.map(({byKey:e})=>f.map(t=>e.get(t))),categoryAxis=e=>({...e,tickFormat:t=>{let n=String(t),r=d.labels.get(n)??t;return e.tickFormat?e.tickFormat(r):String(r)}});if(f.length===0){clearCartesianDom(a,o,s),r?.remove(),r=null;return}let{horizontal:m,stacked:h}=variantFlags(t.variant??`grouped`),g=t.xAxis===!1?!1:m?{grid:!0,...t.xAxis}:t.xAxis??{},_=t.yAxis===!1?!1:m?t.yAxis??{}:{grid:!0,...t.yAxis},v,y;if(h){p.some(e=>e.some(e=>(e?.value??0)<0));let e=f.map((e,t)=>p.reduce((e,n)=>e+Math.max(0,n[t]?.value??0),0));v=Math.max(...e),y=0}else{let e=p.flatMap(e=>e.flatMap(e=>e?[e.value]:[]));v=Math.max(...e),y=Math.min(0,...e)}let b=bandScale(m?{domain:f,range:[0,l.height]}:{domain:f,range:[0,l.width]}),x=linearScale(m?{domain:[y,v],range:[0,l.width]}:{domain:[y,v],range:[l.height,0]}),S=[],C=Object.create(null);for(let e of f)C[e]=0;let w={bandCenter:e=>b.map(e)+b.bandwidth()/2,bandwidth:b.bandwidth(),baselinePx:x.map(0),horizontal:m,stacked:h,stackedTops:S,valueScale:x};if(m){if(g&&g.grid&&renderGrid(a.grid,x,g.grid,l.height,`vertical`,resolveTicks(x,g,resolveTickCount(g,l.width,`bottom`))),_!==!1){let e=categoryAxis(_);positionAxis(a.yAxis,e.position??`left`,l.width,l.height),renderAxis(a.yAxis,b,e,l.height,`left`)}g&&(positionAxis(a.xAxis,g.position??`bottom`,l.width,l.height),renderAxis(a.xAxis,x,g,l.width,`bottom`))}else{if(_&&_.grid&&renderGrid(a.grid,x,_.grid,l.width,`horizontal`,resolveTicks(x,_,resolveTickCount(_,l.height,`left`))),g!==!1){let e=categoryAxis(g);positionAxis(a.xAxis,e.position??`bottom`,l.width,l.height),renderAxis(a.xAxis,b,e,l.width,`bottom`)}_&&(positionAxis(a.yAxis,_.position??`left`,l.width,l.height),renderAxis(a.yAxis,x,_,l.height,`left`))}let T=h?0:Number.parseFloat(getComputedStyle(e.svg).getPropertyValue(`--prism-bar-radius`))||0;for(;a.series.children.length>n.length;){let e=a.series.lastElementChild;e&&a.series.removeChild(e)}for(let r=0;r<n.length;r++){let o=n[r],s=a.series.children[r];s||(s=createSvgElement(`g`,{class:`prism-bar-series`}),a.series.appendChild(s)),s.setAttribute(`data-series-id`,seriesDomId(o,r));let c=f.map((e,t)=>{let n=p[r]?.[t];if(h){let t=C[e]??0,r=t+Math.max(0,n?.value??0);return C[e]=r,{base:t,dash:n?.dash,key:e,opacity:n?.opacity,present:n!==void 0,y:r}}return{base:0,dash:n?.dash,key:e,opacity:n?.opacity,present:n!==void 0,y:n?.value??0}});S[r]=c.map(e=>e.y);let l=h?c.map(e=>x.map(e.base)):void 0;renderBars(s,c,b,x,w.baselinePx,{baselineYs:l,borderRadius:o.borderRadius??T,color:seriesColor(r,o.color),disposalSignal:e.disposalSignal,horizontal:m,seriesCount:n.length,seriesIndex:r,stacked:h,transition:i!==`resize`&&t.transition})}s?.hide(),a.series.classList.toggle(`prism-bars-stacked`,h),(!r||!e.chartArea.contains(r))&&(r=createSvgElement(`rect`,{"aria-hidden":`true`,class:`prism-bar-band`,"pointer-events":`none`}),e.chartArea.insertBefore(r,a.series)),r.style.display=`none`;let E=n.map((e,t)=>seriesColor(t,e.color)),labelOf=e=>String(d.labels.get(f[e])??f[e]),D=typeof t.tooltip==`object`?t.tooltip:void 0,keyOf=e=>d.labels.get(f[e])??f[e],titleOf=e=>D?.titleFormat?D.titleFormat(keyOf(e)):labelOf(e),O=D?.valueFormat??String,k=-1,valuesAt=e=>n.map((t,n)=>({datum:p[n]?.[e],series:t})),eventAt=(e,t,r)=>{let i=valuesAt(e),a=i[t]?.datum?t:i.findIndex(e=>e.datum),o=i[a]?.datum;return o?{datum:o,originalEvent:r,series:n[a],values:i}:null},setActive=t=>{k=t,a.series.classList.toggle(`prism-bars-focused`,t>=0);for(let e of a.series.children)for(let[n,r]of[...e.children].entries())r.classList.toggle(`prism-bar--active`,n===t);if(!r||(r.style.display=t<0?`none`:``,t<0))return;let n=w.bandCenter(f[t])-b.bandwidth()/2-b.gap()/2,i=b.bandwidth()+b.gap(),o=chartArea(e.dimensions.width,e.dimensions.height,e.dimensions.margin);setAttributes(r,m?{height:i,width:o.width,x:0,y:n}:{height:o.height,width:i,x:n,y:0})},activate=(n,r,i)=>{let a=eventAt(n,r,i);if(!a)return;setActive(n);let o=a.values??[],c=describeValues(titleOf(n),o,O);if(s){let t=o.map((e,t)=>h?S[t]?.[n]??0:Math.max(0,e.datum?.value??0)),r=x.map(Math.max(...t)),i=w.bandCenter(f[n]),{margin:l}=e.dimensions,u=o.flatMap((e,t)=>e.datum?[{color:E[t],name:e.series.name,value:O(e.datum.value,e.datum,e.series)}]:[]);s.show((m?r:i)+l.left,(m?i:r)+l.top,a.datum,a.series,comparisonContent(e.svg.ownerDocument,titleOf(n),u,c))}else e.announcer.announce(c);t.onHover?.(a)},deactivate=()=>{setActive(-1),s?.hide(),e.announcer.clear(),t.onHover?.(null)},hit=t=>{let r=e.dimensions,i=getMousePosition(e.svg,t,r.margin.left,r.margin.top),a=chartArea(r.width,r.height,r.margin);if(i.x<0||i.x>a.width||i.y<0||i.y>a.height)return null;let o=findCatIdx(m?i.y:i.x,f,w);return o===-1?null:{catIdx:o,seriesIdx:findSeriesIdx(i,o,f,w,n.length)}},onMouseMove=e=>{let t=hit(e);t?activate(t.catIdx,t.seriesIdx,e):k>=0&&deactivate()},onClick=e=>{let n=t.onClick&&hit(e),r=n&&eventAt(n.catIdx,n.seriesIdx,e);r&&t.onClick?.(r)},onKeyDown=e=>{let n=f.length-1,r=k<0?n:Math.max(0,k-1),i=k<0?0:Math.min(n,k+1),a={ArrowDown:i,ArrowLeft:r,ArrowRight:i,ArrowUp:r,End:n,Home:0};if(e.key in a)e.preventDefault(),activate(a[e.key],0,e);else if((e.key===`Enter`||e.key===` `)&&k>=0&&t.onClick){e.preventDefault();let n=eventAt(k,0,e);n&&t.onClick(n)}else e.key===`Escape`&&deactivate()};return{onClick,onKeyDown,onMouseLeave:deactivate,onMouseMove}},e=>{n=e})}var A=new WeakMap,j=new WeakMap;function buildPath(e,t){return t===`monotone`?monotonePath(e):t===`step`?stepPath(e):linePath(e)}function renderLine(e,t,n){let r=hasStyledRuns(n.marks),i=n.marks??[],a=resolveMotion(n.transition),o=a.duration,s=resolveEasing(a.easing),c=null,l=[],u=[];if(r){l=computeStyleRuns(i,t.length);let r=[...e.querySelectorAll(`.prism-line-path`)];for(let e of r.slice(l.length))e.remove();u=l.map((t,n)=>{let i=r[n];if(i)return i;let a=createSvgElement(`path`,{class:`prism-line-path`,fill:`none`});return e.appendChild(a),a});for(let[e,t]of l.entries())setAttributes(u[e],{opacity:t.opacity,stroke:n.color,"stroke-dasharray":t.dash,"stroke-width":n.strokeWidth??2}),u[e].style.strokeWidth=n.strokeWidth===void 0?``:String(n.strokeWidth)}else{let t=[...e.querySelectorAll(`.prism-line-path`)];c=t[0]??null;for(let e of t.slice(1))e.remove();c||(c=createSvgElement(`path`,{class:`prism-line-path`,fill:`none`}),e.appendChild(c)),setAttributes(c,{opacity:void 0,stroke:n.color,"stroke-dasharray":void 0,"stroke-width":n.strokeWidth??2}),c.style.strokeWidth=n.strokeWidth===void 0?``:String(n.strokeWidth)}let draw=e=>{if(r)for(let[t,r]of l.entries())setAttributes(u[t],{d:buildPath(e.slice(r.start,r.end+1),n.curve)});else setAttributes(c,{d:buildPath(e,n.curve)})},d=e.querySelector(`.prism-line-dots`);if(n.showPoints?d||(d=createSvgElement(`g`,{class:`prism-line-dots`}),e.appendChild(d)):d&&=(d.remove(),null),o===0){if(A.get(e)?.(),cancelReveal(e),draw(t),j.set(e,t),d){for(;d.children.length>t.length;)d.removeChild(d.lastChild);for(let e=0;e<t.length;e++){let r=d.children[e];r||(r=createSvgElement(`circle`,{class:`prism-line-dot`}),d.appendChild(r)),setAttributes(r,{cx:t[e].x,cy:t[e].y,fill:n.color,opacity:i[e]?.opacity,r:n.pointRadius})}}return}A.get(e)?.(),cancelReveal(e);let f=!j.has(e);if(d){for(;d.children.length>t.length;)d.removeChild(d.lastChild);for(let e=d.children.length;e<t.length;e++){let t=createSvgElement(`circle`,{class:`prism-line-dot`});setAttributes(t,{fill:n.color,opacity:i[e]?.opacity,r:n.pointRadius}),d.appendChild(t)}for(let e=0;e<d.children.length;e++)setAttributes(d.children[e],{opacity:i[e]?.opacity})}if(f){if(draw(t),j.set(e,t),d)for(let[e,n]of t.entries()){let t=d.children[e];t&&setAttributes(t,{cx:n.x,cy:n.y})}if(t.length>1){let i=c??u[0],a=n.strokeWidth??(Number.parseFloat(getComputedStyle(i).strokeWidth)||2),o=r?l.map((e,n)=>({d:u[n].getAttribute(`d`),end:e.end/(t.length-1),start:e.start/(t.length-1)})):[{d:c.getAttribute(`d`),end:1,start:0}];playTraceReveal(e,n.bounds,o,Math.max(a,n.showPoints?n.pointRadius*2:0)+2,resolveMotion(n.transition,{defaultDuration:420}),n.disposalSignal)}return}let p=[],m=j.get(e)??t;for(let[e,n]of t.entries())p.push(m[e]??m.at(-1)??n);let paintFrame=n=>{let r=t.map((e,t)=>{let r=p[t]??e;return{x:tweenNumber(r.x,e.x,n),y:tweenNumber(r.y,e.y,n)}});if(j.set(e,r),draw(r),d)for(let e=0;e<t.length;e++){let t=d.children[e];t&&setAttributes(t,{cx:r[e].x,cy:r[e].y})}};paintFrame(0),A.set(e,startTween({count:1,duration:o,easing:s,onComplete:()=>{A.delete(e),j.set(e,t)},onFrame:e=>paintFrame(e(0)),signal:n.disposalSignal}))}function computePoints(e,t,n){return e.some(e=>e.key==null)||e.some(e=>typeof e.key==`string`),e.map(e=>({x:t.map(e.key),y:n.map(e.value)}))}function createLineChart(e,t){let n=null,r=null,i=null,a=t.series;return createChartScaffold(e,t,(e,o)=>{let{groups:s,legend:c,tooltip:l}=e;c?.update(a.map((e,t)=>({color:seriesColor(t,e.color),name:e.name})));let u=e.dimensions,d=a.some(e=>e.yAxis===`right`),f=a.some(e=>e.yAxis!==`right`&&e.data.length>0),p={...resolveMargin(t.margin),right:t.margin?.right??(d?t.rightYAxis?.label?72:50:resolveMargin(t.margin).right)},m=chartArea(u.width,u.height,p),h=a.map(e=>e.data),g=h.flat().map(e=>e.key),_=a.filter(e=>e.yAxis!==`right`).flatMap(e=>e.data.map(e=>e.value)),v=a.filter(e=>e.yAxis===`right`).flatMap(e=>e.data.map(e=>e.value));if(g.length===0){clearCartesianDom(s,c,l,n),r?.replaceChildren(),i?.replaceChildren();return}t.crosshair&&!n&&(n=createCrosshair(e.chartArea,t.crosshair));let y=buildXScale(g,m.width),b=buildYScale(_,m.height),x=buildYScale(v,m.height),S=t.xAxis===!1?!1:t.xAxis??{},C=t.yAxis!==!1&&{grid:!0,...t.yAxis};if(C&&C.grid&&(!d||f)?renderGrid(s.grid,b,C.grid,m.width,`horizontal`,resolveTicks(b,C,resolveTickCount(C,m.height,`left`))):s.grid.replaceChildren(),S&&S.grid&&renderGrid(s.grid,y,S.grid,m.height,`vertical`,resolveTicks(y,S,resolveTickCount(S,m.width,`bottom`))),S?(positionAxis(s.xAxis,S.position??`bottom`,m.width,m.height),renderAxis(s.xAxis,y,S,m.width,`bottom`)):s.xAxis.replaceChildren(),C&&(!d||f)){let e={...C,position:d?`left`:C.position??`left`};positionAxis(s.yAxis,e.position,m.width,m.height),renderAxis(s.yAxis,b,e,m.height,`left`)}else s.yAxis.replaceChildren();if(d){i||(i=createSvgElement(`g`,{class:`prism-y-axis-right`}),e.chartArea.appendChild(i));let n={...t.rightYAxis,position:`right`};positionAxis(i,`right`,m.width,m.height),renderAxis(i,x,n,m.height,`right`)}else i?.replaceChildren();for(;s.series.children.length>a.length;)s.series.removeChild(s.series.lastChild);let w=[];for(let n=0;n<a.length;n++){let r=a[n],i=s.series.children[n];i||(i=createSvgElement(`g`,{class:`prism-line-series`}),s.series.appendChild(i)),i.setAttribute(`data-series-id`,seriesDomId(r,n));let c=r.yAxis===`right`?x:b,l=computePoints(h[n],y,c);w.push(l),renderLine(i,l,{bounds:{height:m.height,width:m.width},color:seriesColor(n,r.color),curve:r.curve??`linear`,disposalSignal:e.disposalSignal,marks:r.data,pointRadius:r.pointRadius??3,showPoints:r.showPoints??!1,strokeWidth:r.strokeWidth,transition:o!==`resize`&&t.transition})}return l?.hide(),r=ensureMarkerGroup(e.chartArea,r),createSeriesInteraction({announcer:e.announcer,colors:()=>a.map((e,t)=>seriesColor(t,e.color)),crosshair:n,dims:()=>e.dimensions,getData:()=>h,getPoints:()=>w,getSeriesList:()=>a,margin:p,markers:r,onClick:t.onClick,onHover:t.onHover,seriesGroup:s.series,svg:e.svg,tooltip:l,tooltipFormat:typeof t.tooltip==`object`?t.tooltip:void 0})},e=>{a=e})}function polarX(e,t,n){return e+t*Math.sin(n)}function polarY(e,t,n){return e-t*Math.cos(n)}function polarPoint(e,t,n,r){return`${polarX(e,n,r)},${polarY(t,n,r)}`}function computeArcs(e,t,n,r,i,a,o,s,c,l,u=!1){let d=e.reduce((e,t)=>e+Math.max(0,t.value),0);if(d===0)return[];let f=o-a,p=r>0?Math.asin(Math.min(1,s/2/r)):0,m=a,h=e.length;return e.map((e,a)=>{let o=Math.max(0,e.value)/d*f,s=m,g=m+o;m+=o;let _=Math.min(p,o/2);return{capEnd:u&&a===h-1,capStart:u&&a===0,centerX:t,centerY:n,color:e.color??l(a),cornerRadius:c,endAngle:g,index:a,innerRadius:i,outerRadius:r,padAngle:_,slice:e,startAngle:s}})}function arcPath(e){let{capEnd:t,capStart:n,centerX:r,centerY:i,cornerRadius:a,endAngle:o,innerRadius:s,outerRadius:c,padAngle:l,startAngle:u}=e,d=o-u;if(d<=0)return``;if(d>=2*Math.PI-1e-6){let e=u+Math.PI;return s<=0?`M${polarPoint(r,i,c,u)}A${c},${c},0,1,1,${polarPoint(r,i,c,e)}A${c},${c},0,1,1,${polarPoint(r,i,c,u)}Z`:[`M${polarPoint(r,i,c,u)}`,`A${c},${c},0,1,1,${polarPoint(r,i,c,e)}`,`A${c},${c},0,1,1,${polarPoint(r,i,c,u)}`,`M${polarPoint(r,i,s,u)}`,`A${s},${s},0,1,0,${polarPoint(r,i,s,e)}`,`A${s},${s},0,1,0,${polarPoint(r,i,s,u)}`,`Z`].join(``)}let f=n?u:u+l,p=t?o:o-l;if(p<=f)return``;let m=p-f;if(a<=0){let e=+(m>Math.PI);return s<=0?`M${r},${i}L${polarPoint(r,i,c,f)}A${c},${c},0,${e},1,${polarPoint(r,i,c,p)}Z`:[`M${polarPoint(r,i,c,f)}`,`A${c},${c},0,${e},1,${polarPoint(r,i,c,p)}`,`L${polarPoint(r,i,s,p)}`,`A${s},${s},0,${e},0,${polarPoint(r,i,s,f)}`,`Z`].join(``)}let h=Math.min(a/c,m/2),g=Math.min(a/s,m/2),_=Math.min(a,(c-s)/2),v=(c-s)/2,y=f+(n?0:h),b=p-(t?0:h),x=f+(n?0:g),S=p-(t?0:g),C=+(b-y>Math.PI),w=+(S-x>Math.PI),T=polarX(r,c,f),E=polarY(i,c,f),D=polarX(r,c,p),O=polarY(i,c,p),k=polarX(r,s,f),A=polarY(i,s,f),j=polarX(r,s,p),M=polarY(i,s,p),N=_/(c-s),P=`${T+(k-T)*N},${E+(A-E)*N}`,F=`${D+(j-D)*N},${O+(M-O)*N}`,I=`${k+(T-k)*N},${A+(E-A)*N}`,L=`${j+(D-j)*N},${M+(O-M)*N}`,R=[];return n?R.push(`M${polarPoint(r,i,c,f)}`):(R.push(`M${P}`),R.push(`Q${T},${E},${polarPoint(r,i,c,y)}`)),R.push(`A${c},${c},0,${C},1,${polarPoint(r,i,c,b)}`),t?R.push(`A${v},${v},0,0,1,${polarPoint(r,i,s,p)}`):(R.push(`Q${D},${O},${F}`),R.push(`L${L}`),R.push(`Q${j},${M},${polarPoint(r,i,s,S)}`)),R.push(`A${s},${s},0,${w},0,${polarPoint(r,i,s,x)}`),n?R.push(`A${v},${v},0,0,0,${polarPoint(r,i,c,f)}`):R.push(`Q${k},${A},${I}`),R.push(`Z`),R.join(``)}function arcCentroid(e){let t=(e.startAngle+e.endAngle)/2,n=(e.outerRadius+e.innerRadius)/2;return{x:e.centerX+n*Math.sin(t),y:e.centerY-n*Math.cos(t)}}var M=2*Math.PI,N=12;function labelFits(e,t){let n=e.outerRadius-e.innerRadius,r=(e.outerRadius+e.innerRadius)/2,i=(e.endAngle-e.startAngle-2*e.padAngle)*r;return n>=N*1.4&&i>=estimateTextWidth(t,N)+8}var P=-Math.PI/2,F=Math.PI/2;function semiAngles(e){return e===`semi`?{end:F,start:P}:{end:M,start:0}}function createPieChart(e,t){let n=t.variant??`pie`,r=t.padPixels??(n===`pie`?0:8),i=t.cornerRadius??(n===`pie`?0:8),a=t.data,o=createSvgElement(`circle`,{class:`prism-pie-bg`,"pointer-events":`none`}),s=createSvgElement(`g`,{class:`prism-pie-slices`,"shape-rendering":`geometricPrecision`}),c=createSvgElement(`g`,{class:`prism-pie-labels`,"pointer-events":`none`}),l=[],u=[],d=null;function renderLabels(e){c.replaceChildren();for(let t=0;t<l.length;t++){let n=l[t],r=e[t];if(!r?.label||!labelFits(n,r.label))continue;let{x:i,y:a}=arcCentroid(n),o=createSvgElement(`text`,{class:`prism-pie-label`});setAttributes(o,{"dominant-baseline":`middle`,fill:`var(--prism-pie-label-color, #fff)`,"font-family":`var(--prism-font-family, system-ui)`,"font-size":`var(--prism-pie-label-size, 12px)`,"text-anchor":`middle`,x:i,y:a}),o.textContent=r.label,c.appendChild(o)}}return createRadialScaffold(e,{a11y:t.a11y,legend:t.legend,tooltip:t.tooltip},f=>{let{legend:p,svg:m,tooltip:h}=f,g=a.some(e=>e.value>0);p?.update(g?a.map((e,t)=>({color:e.color??seriesColor(t),name:e.label??``})):[]),m.contains(o)||(m.appendChild(o),m.appendChild(s),m.appendChild(c));let{height:_,width:v}=f.dimensions,y=n===`semi`,b=v/2,x=y?_*.85:_/2,S=y?Math.min(b,x)-8:Math.min(v,_)/2-8,C=n===`pie`?0:Math.round(S*.55),w=t.innerRadius===void 0?C:t.innerRadius,T=Math.max(w+1,S),E=a,{end:D,start:O}=semiAngles(n);for(l=computeArcs(E,b,x,T,w,O,D,r,i,e=>seriesColor(e),!1),setAttributes(o,{cx:b,cy:x,r:w>0?w:0}),o.setAttribute(`style`,`fill:var(--prism-bg,#fff)`);s.children.length>l.length;)s.removeChild(s.lastChild);c.replaceChildren();let k=resolveMotion(t.transition),A=k.duration,j=resolveEasing(k.easing);for(let e=0;e<l.length;e++){let n=l[e],r=s.children[e];r||(r=createSvgElement(`path`,{class:`prism-pie-slice`}),s.appendChild(r)),r.setAttribute(`fill`,n.color),r.setAttribute(`stroke`,`none`),r.style.cursor=t.onClick||t.onHover?`pointer`:``}d?.();let M=u.length===0,N=u;d=startTween({count:1,duration:A,easing:j,onComplete:()=>renderLabels(E),onFrame:e=>{let t=e(0);if(M){let e=tweenNumber(O,D,t);u=l.map((t,n)=>{let r=s.children[n];if(!r)return t;if(e<=t.startAngle)return setAttributes(r,{d:``}),{...t,endAngle:t.startAngle};let i=Math.min(t.endAngle,e);return setAttributes(r,{d:arcPath({...t,endAngle:i})}),{...t,endAngle:i}});return}u=l.map((e,n)=>{let r=s.children[n],i=N.at(-1),a=N[n]??{...e,endAngle:i?.endAngle??O,startAngle:i?.endAngle??O},o={...e,endAngle:tweenNumber(a.endAngle,e.endAngle,t),innerRadius:tweenNumber(a.innerRadius,e.innerRadius,t),outerRadius:tweenNumber(a.outerRadius,e.outerRadius,t),padAngle:tweenNumber(a.padAngle,e.padAngle,t),startAngle:tweenNumber(a.startAngle,e.startAngle,t)};return r&&setAttributes(r,{d:o.endAngle-o.startAngle<=1e-6?``:arcPath(o)}),o})},signal:f.disposalSignal}),h?.hide();let P=l.reduce((e,t)=>e+Math.max(0,t.slice.value),0),F=-1,describe=e=>{let t=P>0?Math.round(Math.max(0,e.slice.value)/P*1e3)/10:0;return`${e.slice.label??`Slice ${e.index+1}`}: ${e.slice.value} (${t}%)`},setActive=e=>{F=e,s.classList.toggle(`prism-pie-focused`,e>=0);for(let[t,n]of[...s.children].entries())n.classList.toggle(`prism-pie-slice--active`,t===e)},activate=(n,r)=>{let i=l[n];if(!i)return;setActive(n),t.onHover?.({index:n,originalEvent:r,slice:i.slice});let a=describe(i);if(!h){f.announcer.announce(a);return}let{x:o,y:s}=arcCentroid(i),c=m.getBoundingClientRect(),u=e.getBoundingClientRect();h.show(o+(c.left-u.left),s+(c.top-u.top),{key:n,value:i.slice.value},{color:i.color,data:[],name:i.slice.label??``},a)},deactivate=()=>{setActive(-1),h?.hide(),f.announcer.clear(),t.onHover?.(null)},hitAt=e=>{let t=m.getBoundingClientRect();return hitTestArc(l,e.clientX-t.left,e.clientY-t.top,n)},onMouseMove=e=>{let t=hitAt(e);t>=0?t!==F&&activate(t,e):F>=0&&deactivate()},onClick=e=>{if(!t.onClick)return;let n=hitAt(e);n>=0&&t.onClick({index:n,originalEvent:e,slice:l[n].slice})},onKeyDown=e=>{let n=l.length;if(n===0)return;let r={ArrowDown:1,ArrowLeft:-1,ArrowRight:1,ArrowUp:-1};e.key in r?(e.preventDefault(),activate(F<0?r[e.key]>0?0:n-1:(F+r[e.key]+n)%n,e)):e.key===`Home`||e.key===`End`?(e.preventDefault(),activate(e.key===`Home`?0:n-1,e)):(e.key===`Enter`||e.key===` `)&&F>=0&&t.onClick?(e.preventDefault(),t.onClick({index:F,originalEvent:e,slice:l[F].slice})):e.key===`Escape`&&deactivate()};return{onClick,onKeyDown,onMouseLeave:deactivate,onMouseMove}},e=>{a=e})}function hitTestArc(e,t,n,r){for(let i=0;i<e.length;i++){let a=e[i],o=t-a.centerX,s=n-a.centerY,c=Math.sqrt(o*o+s*s);if(c<a.outerRadius&&c>=a.innerRadius){let e=Math.atan2(o,-s);if(r===`semi`){if(e>=a.startAngle-1e-9&&e<=a.endAngle+1e-9)return i}else{let t=e<0?e+M:e;if(t>=a.startAngle-1e-9&&t<=a.endAngle+1e-9)return i}}}return-1}var I=2*Math.PI;function toRadians(e){return e*Math.PI/180}function axisAngles(e,t=0){return Array.from({length:e},(n,r)=>t+r*I/e)}function resolveAxisDomains(e,t,n){let r=n;if(!r){let e=t.flatMap(e=>e.data.map(e=>e.value)).filter(Number.isFinite),n=Math.min(0,...e),i=e.length?Math.max(...e):1;r=linearScale({domain:[n,i>n?i:n+1],range:[0,1]}).domain}return e.map(e=>[e.min??r[0],e.max??r[1]])}function normalize(e,[t,n]){return n===t?0:Math.max(0,Math.min(1,(e-t)/(n-t)))}function radarPoints(e,t,n,r,i){return e.map((e,a)=>({x:polarX(t,r*e,i[a]),y:polarY(n,r*e,i[a])}))}function closedPath(e,t=`linear`){let n=e.length;if(n===0)return``;let[r]=e;if(t===`linear`||n<3)return`M${r.x},${r.y}${e.slice(1).map(e=>`L${e.x},${e.y}`).join(``)}Z`;let i=`M${r.x},${r.y}`;for(let t=0;t<n;t++){let r=e[(t-1+n)%n],a=e[t],o=e[(t+1)%n],s=e[(t+2)%n];i+=`C${a.x+(o.x-r.x)/6},${a.y+(o.y-r.y)/6} ${o.x-(s.x-a.x)/6},${o.y-(s.y-a.y)/6} ${o.x},${o.y}`}return`${i}Z`}function ringPath(e,t,n,r,i){return r<=0?``:e===`circle`?`M${t},${n-r}A${r},${r} 0 1 1 ${t},${n+r}A${r},${r} 0 1 1 ${t},${n-r}Z`:closedPath(radarPoints(i.map(()=>1),t,n,r,i))}function labelPlacement(e){let t=Math.sin(e),n=Math.cos(e);return{anchor:Math.abs(t)<.1?`middle`:t>0?`start`:`end`,baseline:n>.9?`auto`:n<-.9?`hanging`:`middle`}}function fitRadius(e,t,n,r,i,a){let o=0;n.forEach((e,t)=>{labelPlacement(r[t]).anchor!==`middle`&&(o=Math.max(o,estimateTextWidth(e,i)))});let s=i*1.3;return Math.max(8,Math.min(e/2-a-o,t/2-a-s))}function nearestAxis(e,t,n,r=0){if(n===0)return-1;let i=I/n,a=((Math.atan2(e,-t)-r)%I+I)%I;return Math.round(a/i)%n}var L=11,R=12,z=10,B={ArrowDown:1,ArrowLeft:-1,ArrowRight:1,ArrowUp:-1};function resolveGrid(e){return e===!1?null:{bands:!0,labels:!1,levels:4,shape:`polygon`,...typeof e==`object`?e:{}}}function createRadarChart(e,t){let{axes:n}=t,r=t.curve??`linear`,i=t.fill??`solid`,a=t.showPoints??!0,o=resolveGrid(t.grid),s=toRadians(t.startAngle??0),c=axisAngles(n.length,s),l=R+(t.showValues?z:0),u=uniqueId(`prism-radar`),d=t.series,f=createSvgElement(`g`,{class:`prism-radar`}),p=createSvgElement(`defs`),m=createSvgElement(`g`,{"aria-hidden":`true`,class:`prism-radar-grid`}),h=createSvgElement(`g`,{class:`prism-radar-series-group`}),g=createSvgElement(`g`,{"aria-hidden":`true`,class:`prism-radar-labels`});f.append(p,m,h,g);let _=[],v=null,y=-1,b={cx:0,cy:0,radius:0},datumAt=(e,t)=>e.data.find(e=>e.key===n[t].key),valuesAt=e=>d.map(t=>({datum:datumAt(t,e),series:t})),formatValue=(e,t)=>n[e].format?.(t)??String(t),describe=e=>describeValues(n[e].label,valuesAt(e),t=>formatValue(e,t));function draw(e){let{cx:t,cy:n,radius:i}=b;e.forEach((e,a)=>{let o=h.children[a];if(!o)return;let s=radarPoints(e,t,n,i,c);o.querySelector(`.prism-radar-area`)?.setAttribute(`d`,closedPath(s,r)),o.querySelectorAll(`.prism-radar-point`).forEach((e,t)=>{setAttributes(e,{cx:s[t].x,cy:s[t].y})}),o.querySelectorAll(`.prism-radar-value`).forEach((r,a)=>{let o=i*e[a]+z;setAttributes(r,{x:polarX(t,o,c[a]),y:polarY(n,o,c[a])})})})}function renderGrid(e){if(m.replaceChildren(),!o)return;let{cx:t,cy:n,radius:r}=b,i=Math.max(1,Math.round(o.levels)),a=Array.from({length:i},(e,a)=>ringPath(o.shape,t,n,r*(a+1)/i,c));if(o.bands)for(let e=i-1;e>=0;e-=2)m.appendChild(createSvgElement(`path`,{class:`prism-radar-band`,d:`${a[e]}${a[e-1]??``}`,"fill-rule":`evenodd`}));for(let e of a)m.appendChild(createSvgElement(`path`,{class:`prism-radar-ring`,d:e,fill:`none`}));c.forEach((e,i)=>{m.appendChild(createSvgElement(`line`,{class:`prism-radar-spoke`,"data-axis":i,x1:t,x2:polarX(t,r,e),y1:n,y2:polarY(n,r,e)}))});let[s,l]=e[0],u=e.every(([e,t])=>e===s&&t===l);if(!o.labels||!u)return;let d=c[0]+Math.PI/c.length;for(let e=1;e<=i;e++){let a=r*e/i,o=createSvgElement(`text`,{class:`prism-radar-level`,"dominant-baseline":`middle`,"text-anchor":`middle`,x:polarX(t,a,d),y:polarY(n,a,d)});o.textContent=formatValue(0,Math.round((s+(l-s)*e/i)*100)/100),m.appendChild(o)}}function renderLabels(){g.replaceChildren();let{cx:e,cy:t,radius:r}=b;n.forEach((n,i)=>{let{anchor:a,baseline:o}=labelPlacement(c[i]),s=createSvgElement(`text`,{class:`prism-radar-axis-label`,"dominant-baseline":o,"text-anchor":a,x:polarX(e,r+l,c[i]),y:polarY(t,r+l,c[i])});s.textContent=n.label,g.appendChild(s)})}function renderSeries(){let{cx:e,cy:r,radius:o}=b;for(p.replaceChildren();h.children.length>d.length;)h.lastChild?.remove();d.forEach((s,l)=>{let d=s.color??seriesColor(l),f=h.children[l];f||(f=createSvgElement(`g`,{class:`prism-radar-series`}),h.appendChild(f)),f.setAttribute(`data-series-id`,seriesDomId(s,l)),f.replaceChildren();let m=createSvgElement(`path`,{class:`prism-radar-area prism-radar-area--${i}`,stroke:d,"stroke-linejoin":`round`,"stroke-width":2});if(i===`gradient`){let t=`${u}-fill-${l}`,n=createSvgElement(`radialGradient`,{cx:e,cy:r,gradientUnits:`userSpaceOnUse`,id:t,r:o});for(let[e,t]of[[0,.08],[1,.55]])n.appendChild(createSvgElement(`stop`,{offset:e,"stop-color":d,"stop-opacity":t,style:`stop-color:${d}`}));p.appendChild(n),setAttributes(m,{fill:`url(#${t})`})}else setAttributes(m,{fill:i===`none`?`none`:d,"fill-opacity":.25});f.appendChild(m),a&&n.forEach((e,t)=>{let n=!Number.isFinite(datumAt(s,t)?.value);f.appendChild(createSvgElement(`circle`,{class:`prism-radar-point${n?` prism-radar-point--missing`:``}`,"data-axis":t,fill:n?`none`:d,r:3,stroke:d}))}),t.showValues&&n.forEach((e,t)=>{let n=datumAt(s,t),{anchor:r,baseline:i}=labelPlacement(c[t]),a=createSvgElement(`text`,{"aria-hidden":`true`,class:`prism-radar-value`,"dominant-baseline":i,"text-anchor":r});a.textContent=n&&Number.isFinite(n.value)?formatValue(t,n.value):``,f.appendChild(a)})})}function setActive(e){y=e;for(let t of f.querySelectorAll(`[data-axis]`)){let n=Number(t.getAttribute(`data-axis`))===e;t.classList.toggle(t.tagName===`line`?`prism-radar-spoke--active`:`prism-radar-point--active`,n)}}function animateTo(e,n){v?.();let r=e.map((e,t)=>e.map((e,n)=>_[t]?.[n]??0)),i=resolveMotion(t.transition,{defaultDuration:400}),a=resolveEasing(i.easing??`ease-out`),o=r.every((t,n)=>t.every((t,r)=>t===e[n][r]));if(i.duration===0||o){_=e,draw(e);return}v=startTween({count:e.length,duration:i.duration,easing:a,onFrame:t=>{_=e.map((e,n)=>{let i=t(n);return e.map((e,t)=>tweenNumber(r[n][t],e,i))}),draw(_)},signal:n,stagger:i.stagger})}return createRadialScaffold(e,{a11y:t.a11y,legend:t.legend,tooltip:t.tooltip},r=>{let{legend:i,svg:a,tooltip:o}=r;if(a.contains(f)||a.appendChild(f),o?.hide(),i?.update(d.map((e,t)=>({color:e.color??seriesColor(t),name:e.name}))),n.length<3){for(let e of[p,m,h,g])e.replaceChildren();_=[];return}let{height:u,width:v}=r.dimensions,x=fitRadius(v,u,n.map(e=>e.label),c,L,l);b={cx:v/2,cy:u/2,radius:x};let S=resolveAxisDomains(n,d,t.domain);renderGrid(S),renderLabels(),renderSeries(),animateTo(d.map(e=>n.map((t,n)=>{let r=datumAt(e,n)?.value;return r!==void 0&&Number.isFinite(r)?normalize(r,S[n]):0})),r.disposalSignal),setActive(y);let eventFor=(e,t)=>({axis:n[e],index:e,originalEvent:t,values:valuesAt(e)}),activate=(i,s)=>{setActive(i),t.onHover?.(eventFor(i,s));let l=describe(i);if(!o){r.announcer.announce(l);return}let u=Math.max(0,..._.map(e=>e[i]??0)),f=a.getBoundingClientRect(),p=e.getBoundingClientRect(),m=valuesAt(i),h=m.find(e=>e.datum)?.datum,g=m.flatMap(({datum:e,series:t})=>e?[{color:t.color??seriesColor(d.indexOf(t)),name:t.name,value:formatValue(i,e.value)}]:[]);o.show(polarX(b.cx,b.radius*u,c[i])+(f.left-p.left),polarY(b.cy,b.radius*u,c[i])+(f.top-p.top),{key:n[i].key,meta:{axis:n[i],text:l,values:m},value:h?.value??0},{color:d[0]?.color??seriesColor(0),data:[],name:n[i].label},comparisonContent(a.ownerDocument,n[i].label,g,l))},deactivate=()=>{setActive(-1),t.onHover?.(null),o?.hide(),r.announcer.clear()},hitIndex=e=>{let t=a.getBoundingClientRect(),r=e.clientX-t.left-b.cx,i=e.clientY-t.top-b.cy;return Math.hypot(r,i)>b.radius+l+22?-1:nearestAxis(r,i,n.length,s)};return{onClick(e){let n=hitIndex(e);n>=0&&t.onClick?.(eventFor(n,e))},onKeyDown(e){let r=B[e.key];r===void 0?(e.key===`Enter`||e.key===` `)&&y>=0&&t.onClick?(e.preventDefault(),t.onClick(eventFor(y,e))):e.key===`Escape`&&deactivate():(e.preventDefault(),activate(y<0?0:(y+r+n.length)%n.length,e))},onMouseLeave:deactivate,onMouseMove(e){let t=hitIndex(e);t<0?y>=0&&deactivate():t!==y&&activate(t,e)}}},e=>{d=e})}function createScatterInteraction(e){let t=-1,n=!1,hitAt=(t,n)=>{let r=e.getData()[t]?.[n],i=e.getPoints()[t]?.[n];return r&&i?{datum:r,point:i,seriesIndex:t}:null},renderedHit=t=>{let n=t.target;return!(n instanceof SVGElement)||!n.classList.contains(`prism-scatter-point`)||!n.parentElement||n.parentElement.parentNode!==e.seriesGroup?null:hitAt([...e.seriesGroup.children].indexOf(n.parentElement),[...n.parentElement.children].indexOf(n))},nearestHit=t=>{let n=null,r=1/0;for(let[i,a]of e.getPoints().entries())for(let e of a.keys()){let a=hitAt(i,e);if(!a)continue;let o=Math.hypot(a.point.x-t.x,a.point.y-t.y);o<r&&(r=o,n=a)}return n},orderedHits=()=>{let t=[];for(let[n,r]of e.getData().entries())for(let e of r.keys()){let r=hitAt(n,e);r&&t.push(r)}return t.sort((e,t)=>e.point.x-t.point.x||e.point.y-t.point.y||e.seriesIndex-t.seriesIndex)},eventFor=(t,n)=>({datum:t.datum,originalEvent:n,series:e.getSeriesList()[t.seriesIndex]}),highlight=t=>{let n=[...e.seriesGroup.children];e.markers.replaceChildren(),t&&e.markers.appendChild(createSvgElement(`circle`,{class:`prism-active-point`,cx:t.point.x,cy:t.point.y,fill:e.colors()[t.seriesIndex],r:4})),e.seriesGroup.classList.toggle(`prism-series-focused`,t!==null&&n.length>1);for(let[e,r]of n.entries())r.classList.toggle(`prism-series-active`,e===t?.seriesIndex)},clear=()=>{e.crosshair?.hide(),e.tooltip?.hide(),e.announcer.clear(),highlight(null),n=!1,e.onHover?.(null)},focus=(t,r,i)=>{let a=e.dims(),o=chartArea(a.width,a.height,e.margin),s=e.crosshair?.snap===!1&&r,c=eventFor(t,i),{datum:l,series:u}=c,d=e.tooltipFormat?.titleFormat?e.tooltipFormat.titleFormat(l.key):keyLabel(l.key),f=e.tooltipFormat?.valueFormat,p=describeValues(d,[{datum:l,series:u}],f??String);if(e.crosshair?.show(s?r.x:t.point.x,s?r.y:t.point.y,o.width,o.height),highlight(t),e.tooltip){let n={color:e.colors()[t.seriesIndex],name:u.name,value:f?f(l.value,l,u):String(l.value)};e.tooltip.show(t.point.x+e.margin.left,t.point.y+e.margin.top,l,u,comparisonContent(e.svg.ownerDocument,d,[n],p))}else e.announcer.announce(p);n=!0,e.onHover?.(c)},pointerHit=t=>{let n=renderedHit(t);if(n)return{hit:n,raw:n.point};let r=e.dims(),i=getMousePosition(e.svg,t,e.margin.left,e.margin.top),a=chartArea(r.width,r.height,e.margin);if(i.x<0||i.x>a.width||i.y<0||i.y>a.height)return null;let o=nearestHit(i);return o?{hit:o,raw:i}:null},onMouseMove=e=>{let t=pointerHit(e);t?focus(t.hit,t.raw,e):n&&clear()},onClick=t=>{if(!e.onClick)return;let n=pointerHit(t);n&&e.onClick(eventFor(n.hit,t))},onKeyDown=n=>{let r=orderedHits();if(r.length===0)return;let i=r.length-1,a={ArrowLeft:t<0?i:Math.max(0,t-1),ArrowRight:t<0?0:Math.min(i,t+1),End:i,Home:0};n.key in a?(n.preventDefault(),t=a[n.key],focus(r[t],null,n)):(n.key===`Enter`||n.key===` `)&&t>=0&&e.onClick?(n.preventDefault(),e.onClick(eventFor(r[t],n))):n.key===`Escape`&&(t=-1,clear())};return{onClick,onKeyDown,onMouseLeave:clear,onMouseMove}}var V=400,H=new WeakMap,U=new WeakMap;function computeScatterPoints(e,t,n){return e.some(e=>e.key==null)||e.some(e=>typeof e.key==`string`),e.map(e=>({x:t.map(e.key),y:n.map(e.value)}))}function renderScatterPoints(e,t,n){let r=resolveMotion(n.transition),i=n.marks??[],a=n.pointRadius;for(H.get(e)?.(),H.delete(e);e.children.length>t.length;)e.lastChild.remove();let o=U.get(e)??[],s=[],c=t.map((t,r)=>{let a=e.children[r];return a?s.push(Number(a.getAttribute(`r`))||0):(a=createSvgElement(`circle`,{class:`prism-scatter-point`}),e.appendChild(a),s.push(0)),setAttributes(a,{fill:n.color,opacity:i[r]?.opacity}),a}),paint=(t,n)=>{for(let[e,r]of c.entries())setAttributes(r,{cx:t[e].x,cy:t[e].y,r:n(e)});U.set(e,t)};if(r.duration===0){paint(t,()=>a);return}let l=t.map((e,t)=>o[t]??e),u=t.map((e,t)=>t).filter(e=>e>=o.length),d=new Map([...u].sort((e,n)=>t[e].x-t[n].x).map((e,t)=>[e,t])),f=Math.min(r.stagger,V/Math.max(1,u.length)),paintFrame=e=>{let n=t.map((t,n)=>e(d.get(n)??0));paint(t.map((e,t)=>({x:tweenNumber(l[t].x,e.x,n[t]),y:tweenNumber(l[t].y,e.y,n[t])})),e=>tweenNumber(s[e],a,n[e]))};paintFrame(()=>0),H.set(e,startTween({count:Math.max(1,u.length),duration:r.duration,easing:resolveEasing(r.easing),onComplete:()=>{H.delete(e),paint(t,()=>a)},onFrame:paintFrame,signal:n.disposalSignal,stagger:f}))}function createScatterChart(e,t){let n=null,r=null,i=t.series;return createChartScaffold(e,t,(e,a)=>{let{groups:o,legend:s,tooltip:c}=e;s?.update(i.map((e,t)=>({color:seriesColor(t,e.color),name:e.name})));let l=e.dimensions,u=chartArea(l.width,l.height,l.margin),d=i.map(e=>e.data),f=d.flat().map(e=>e.key),p=d.flat().map(e=>e.value);if(f.length===0){clearCartesianDom(o,s,c,n),r?.replaceChildren();return}t.crosshair&&!n&&(n=createCrosshair(e.chartArea,t.crosshair));let m=buildXScale(f,u.width),h=buildYScale(p,u.height,!1),g=t.xAxis===!1?!1:t.xAxis??{},_=t.yAxis!==!1&&{grid:!0,...t.yAxis};for(_&&_.grid?renderGrid(o.grid,h,_.grid,u.width,`horizontal`,resolveTicks(h,_,resolveTickCount(_,u.height,`left`))):o.grid.replaceChildren(),g&&g.grid&&renderGrid(o.grid,m,g.grid,u.height,`vertical`,resolveTicks(m,g,resolveTickCount(g,u.width,`bottom`))),g?(positionAxis(o.xAxis,g.position??`bottom`,u.width,u.height),renderAxis(o.xAxis,m,g,u.width,`bottom`)):o.xAxis.replaceChildren(),_?(positionAxis(o.yAxis,_.position??`left`,u.width,u.height),renderAxis(o.yAxis,h,_,u.height,`left`)):o.yAxis.replaceChildren();o.series.children.length>i.length;)o.series.removeChild(o.series.lastChild);let v=[];for(let[n,r]of i.entries()){let i=o.series.children[n];i||(i=createSvgElement(`g`,{class:`prism-scatter-series`}),o.series.appendChild(i)),i.setAttribute(`data-series-id`,seriesDomId(r,n));let s=computeScatterPoints(r.data,m,h);v.push(s),renderScatterPoints(i,s,{color:seriesColor(n,r.color),disposalSignal:e.disposalSignal,marks:r.data,pointRadius:r.pointRadius??3,transition:a!==`resize`&&t.transition})}return c?.hide(),r=ensureMarkerGroup(e.chartArea,r),createScatterInteraction({announcer:e.announcer,colors:()=>i.map((e,t)=>seriesColor(t,e.color)),crosshair:n,dims:()=>e.dimensions,getData:()=>d,getPoints:()=>v,getSeriesList:()=>i,margin:l.margin,markers:r,onClick:t.onClick,onHover:t.onHover,seriesGroup:o.series,svg:e.svg,tooltip:c,tooltipFormat:typeof t.tooltip==`object`?t.tooltip:void 0})},e=>{i=e})}var W=5;function buildTopPoints(e,t,n){if(e.length===0)return[];let r=t/Math.max(1,e.length-1),i=Math.min(...e),a=Math.max(...e)-i||1;return e.map((e,t)=>({x:t*r,y:n-(e-i)/a*n}))}function buildAreaPathFromPoints(e,t,n){return e.length===0?``:areaPath(e,e.map(e=>({x:e.x,y:t})),n??`linear`)}function buildPathFromPoints(e,t){return e.length===0?``:t===`monotone`?monotonePath(e):t===`step`?stepPath(e):linePath(e)}function isStackData(e){return e.length>0&&e[0]!==null&&typeof e[0]==`object`}function buildRoundedStackRect(e,t,n,r,i,a,o){let s=Math.min(i,n/2,r/2),c=a?s:0,l=a?s:0,u=o?s:0,d=o?s:0;return[`M${e+c},${t}`,`H${e+n-u}`,u?`Q${e+n},${t} ${e+n},${t+u}`:``,`V${t+r-d}`,d?`Q${e+n},${t+r} ${e+n-d},${t+r}`:``,`H${e+l}`,l?`Q${e},${t+r} ${e},${t+r-l}`:``,`V${t+c}`,c?`Q${e},${t} ${e+c},${t}`:``,`Z`].filter(Boolean).join(``)}function defaultStackColor(e){return`var(--prism-color-${e%8+1})`}function createSparkline(e,t){let n=t.variant??`line`,r=t.color??`var(--prism-color-1)`,i=t.curve??`linear`,a=t.strokeWidth??1.5,o=t.fillOpacity,s=t.showEndPoint??!0,c=uniqueId(`prism-spark-fill`),l=createTappers(),u=resolveMotion(t.transition),d=resolveEasing(u.easing),f=t.data,p=null,m=null,h=createChartBase(e,{a11y:t.a11y,margin:{bottom:0,left:0,right:0,top:0}},()=>{l.emit({height:h.dimensions.height,type:`resize`,width:h.dimensions.width}),renderAll()}),{svg:g}=h;g.classList.add(`prism-sparkline`);let _=createSvgElement(`g`,{class:`prism-spark-inner`});g.appendChild(_);let cleanupInteraction;function plotArea(){let{height:e,width:t}=h.dimensions,r=n===`line`||n===`area`?W:0;return{h:Math.max(1,e-r*2),inset:r,w:Math.max(1,t-r*2)}}function animateValues(e,t,n){m?.();let r=p?.length===e.length?p:e.map(()=>t);if(r.every((t,n)=>t===e[n])||u.duration===0){p=e,n(e);return}m=startTween({count:1,duration:u.duration,easing:d,onFrame:t=>{let i=t(0),a=e.map((e,t)=>tweenNumber(r[t],e,i));p=a,n(a)},signal:v.signal}),p=r,n(r)}function renderAll(){let{height:e,width:l}=h.dimensions,u=plotArea();for(;_.firstChild;)_.removeChild(_.firstChild);if(_.setAttribute(`transform`,`translate(${u.inset},${u.inset})`),f.length===0){p=null;return}if(!isStackData(f)&&f.some(e=>!Number.isFinite(e)),n===`stack`&&isStackData(f)){let n=createSvgElement(`g`,{class:`prism-spark-stack`});_.appendChild(n);let r=t.cornerRadius??4,i=f,a=i.reduce((e,t)=>e+Math.max(0,t.value),0),o=i.map((e,t)=>{let r=createSvgElement(`path`,{class:`prism-spark-stack-segment`});return setAttributes(r,{fill:e.color??defaultStackColor(t)}),n.appendChild(r),r});a>0?animateValues(i.map(e=>Math.max(0,e.value)),0,n=>{let i=n.reduce((e,t)=>e+t,0)||1,a=(t.padPixels??0)/2,s=0;n.forEach((t,c)=>{let u=Math.round(s);s+=t/i*l;let d=c===n.length-1?l:Math.round(s),f=c===0,p=c===n.length-1,m=u+(f?0:a),h=Math.max(0,d-u-(f?0:a)-(p?0:a));o[c]?.setAttribute(`d`,buildRoundedStackRect(m,0,h,e,r,f,p))})}):(m?.(),p=null)}else if(n===`bar`){let t=createSvgElement(`g`,{class:`prism-spark-bars`});_.appendChild(t);let n=f,i=Math.min(0,...n),a=Math.max(...n)-i||1,o=Math.max(1,l/n.length-1),s=l/n.length,c=n.map(()=>{let e=createSvgElement(`rect`,{class:`prism-spark-bar`,fill:r});return t.appendChild(e),e});animateValues(n,i,t=>{for(let[n,r]of c.entries()){let c=Math.max(1,(t[n]-i)/a*e);setAttributes(r,{height:c,width:o,x:n*s,y:e-c})}})}else{let e=f,t=Math.min(...e),l=Math.max(...e)-t||1,d=u.w/Math.max(1,e.length-1),pointsFromValues=e=>e.map((e,n)=>({x:n*d,y:u.h-(e-t)/l*u.h})),p=null;if(n===`area`){let e=createSvgElement(`defs`),t=createSvgElement(`linearGradient`,{id:c,x1:0,x2:0,y1:0,y2:1});for(let[e,n]of[[0,`prism-spark-stop-top`],[1,`prism-spark-stop-bottom`]]){let i=createSvgElement(`stop`,{class:n,offset:e,"stop-color":r});i.style.stopColor=r,t.appendChild(i)}e.appendChild(t),_.appendChild(e),p=createSvgElement(`path`,{class:`prism-spark-fill`}),setAttributes(p,{fill:`url(#${c})`,stroke:`none`}),p.style.fillOpacity=o===void 0?``:String(o),_.appendChild(p)}let m=createSvgElement(`path`,{class:`prism-spark-line`});setAttributes(m,{fill:`none`,stroke:r,"stroke-width":a}),_.appendChild(m);let h=s&&e.length>0?createSvgElement(`circle`,{class:`prism-spark-end`,fill:r,r:2.5}):null;h&&_.appendChild(h),animateValues(e,t,e=>{let t=pointsFromValues(e);setAttributes(m,{d:buildPathFromPoints(t,i)}),p&&setAttributes(p,{d:buildAreaPathFromPoints(t,u.h,i)});let n=t.at(-1);h&&n&&setAttributes(h,{cx:n.x,cy:n.y})})}isStackData(f)||attachInteraction(f)}function attachInteraction(e){if(cleanupInteraction?.(),cleanupInteraction=void 0,!t.onHover&&!t.onClick||e.length<=1)return;let{h:i,inset:a,w:o}=plotArea();g.style.cursor=`crosshair`;let s=o/(e.length-1),c=n===`bar`?[]:buildTopPoints(e,o,i),l=createSvgElement(`circle`,{class:`prism-spark-marker`,fill:r,r:3.5}),indexAt=t=>Math.max(0,Math.min(e.length-1,Math.round((t-g.getBoundingClientRect().left-a)/s)));l.style.display=`none`,_.appendChild(l);let handleMove=n=>{let r=indexAt(n.clientX),i=c[r];i&&(setAttributes(l,{cx:i.x,cy:i.y}),l.style.display=``),t.onHover?.({index:r,originalEvent:n,value:e[r]})},handleLeave=()=>{l.style.display=`none`,t.onHover?.(null)},handleClick=n=>{if(!t.onClick)return;let r=indexAt(n.clientX);t.onClick({index:r,originalEvent:n,value:e[r]})};g.addEventListener(`mousemove`,handleMove),g.addEventListener(`mouseleave`,handleLeave),g.addEventListener(`click`,handleClick),cleanupInteraction=()=>{g.removeEventListener(`mousemove`,handleMove),g.removeEventListener(`mouseleave`,handleLeave),g.removeEventListener(`click`,handleClick)}}let v=new AbortController,y=!1;try{return renderAll(),{get disposalSignal(){return v.signal},dispose(){y||(y=!0,l.emit({type:`dispose`}),l.stop(),v.abort(),cleanupInteraction?.(),h.dispose())},get disposed(){return y},el:g,tap:l.tap,update(e){if(y)throw new PrismRenderError(`Cannot update a disposed chart.`);f=e,renderAll()},[Symbol.dispose](){this.dispose()}}}catch(e){throw v.abort(),cleanupInteraction?.(),h.dispose(),e instanceof PrismRenderError?e:new PrismRenderError(`Failed to render chart.`,{cause:e})}}export{PrismError,PrismRenderError,bandScale,createAreaChart,createBarChart,createLineChart,createPieChart,createRadarChart,createScatterChart,createSparkline,linearScale,resetTheme,seriesColor,setTheme,timeScale};
|
|
1
|
+
import { computePosition as e, flip as t, getClippingAncestorRect as n, offset as r, shift as i } from "@vielzeug/orbit";
|
|
2
|
+
//#endregion
|
|
3
|
+
//#region src/svg/element.ts
|
|
4
|
+
var a = "http://www.w3.org/2000/svg";
|
|
5
|
+
function createSvgElement(e, t) {
|
|
6
|
+
let n = document.createElementNS(a, e);
|
|
7
|
+
return t && setAttributes(n, t), n;
|
|
8
|
+
}
|
|
9
|
+
function setAttributes(e, t) {
|
|
10
|
+
for (let [n, r] of Object.entries(t)) r === void 0 ? e.removeAttribute(n) : (typeof r == "number" && !Number.isFinite(r) && `${n}${e.tagName}${r}`, e.setAttribute(n, String(r)));
|
|
11
|
+
}
|
|
12
|
+
function removeChildren(e) {
|
|
13
|
+
for (; e.firstChild;) e.removeChild(e.firstChild);
|
|
14
|
+
}
|
|
15
|
+
//#endregion
|
|
16
|
+
//#region src/svg/text.ts
|
|
17
|
+
var o = .6;
|
|
18
|
+
function estimateTextWidth(e, t) {
|
|
19
|
+
return e.length * t * o;
|
|
20
|
+
}
|
|
21
|
+
function createTextElement(e, t) {
|
|
22
|
+
let n = createSvgElement("text", t);
|
|
23
|
+
return n.textContent = e, n;
|
|
24
|
+
}
|
|
25
|
+
//#endregion
|
|
26
|
+
//#region src/axes/scale-utils.ts
|
|
27
|
+
function isBandScale(e) {
|
|
28
|
+
return typeof e.bandwidth == "function";
|
|
29
|
+
}
|
|
30
|
+
function mapTick(e, t) {
|
|
31
|
+
return isBandScale(e) ? e.map(t) + e.bandwidth() / 2 : e.map(t);
|
|
32
|
+
}
|
|
33
|
+
//#endregion
|
|
34
|
+
//#region src/axes/axis.ts
|
|
35
|
+
var s = 11, c = 8, l = new Intl.NumberFormat(void 0, {
|
|
36
|
+
maximumSignificantDigits: 3,
|
|
37
|
+
notation: "compact"
|
|
38
|
+
}), defaultTickFormat = (e) => e instanceof Date ? e.toLocaleDateString(void 0, {
|
|
39
|
+
month: "short",
|
|
40
|
+
year: "numeric"
|
|
41
|
+
}) : typeof e == "number" && Math.abs(e) >= 1e5 ? l.format(e) : String(e);
|
|
42
|
+
function resolveTicks(e, t, n) {
|
|
43
|
+
return t.tickValues ? [...t.tickValues] : e.ticks(n);
|
|
44
|
+
}
|
|
45
|
+
function positionAxis(e, t, n, r) {
|
|
46
|
+
let i = t === "bottom" ? `translate(0,${r})` : t === "right" ? `translate(${n},0)` : void 0;
|
|
47
|
+
i ? e.setAttribute("transform", i) : e.removeAttribute("transform");
|
|
48
|
+
}
|
|
49
|
+
function resolveTickCount(e, t, n) {
|
|
50
|
+
let r = e.position ?? n, i = r === "bottom" || r === "top" ? Math.max(2, Math.floor(t / 80)) : Math.max(2, Math.floor(t / 50));
|
|
51
|
+
return e.tickCount ?? i;
|
|
52
|
+
}
|
|
53
|
+
function categoryTickCount(e, t, n, r) {
|
|
54
|
+
if (e.length === 0) return 0;
|
|
55
|
+
let i = r ? Math.max(...e.map((e) => estimateTextWidth(t(e), s))) : s * 1.3;
|
|
56
|
+
return Math.max(1, Math.min(e.length, Math.floor(n / (i + c))));
|
|
57
|
+
}
|
|
58
|
+
function renderAxis(e, t, n, r, i = "bottom") {
|
|
59
|
+
removeChildren(e);
|
|
60
|
+
let a = n.position ?? i, o = a === "bottom" || a === "top", s = a === "top" || a === "left", c = s ? -1 : 1, l = createSvgElement("line", {
|
|
61
|
+
"aria-hidden": "true",
|
|
62
|
+
class: "prism-axis-line",
|
|
63
|
+
x1: 0,
|
|
64
|
+
x2: o ? r : 0,
|
|
65
|
+
y1: 0,
|
|
66
|
+
y2: o ? 0 : r
|
|
67
|
+
});
|
|
68
|
+
e.appendChild(l);
|
|
69
|
+
let u = n.tickFormat ?? defaultTickFormat, d = resolveTicks(t, n, n.tickCount === void 0 && "bandwidth" in t ? categoryTickCount(t.domain, u, r, o) : resolveTickCount(n, r, i));
|
|
70
|
+
n.tickValues && n.tickValues;
|
|
71
|
+
for (let n of d) {
|
|
72
|
+
let r = mapTick(t, n), i = createSvgElement("line", {
|
|
73
|
+
"aria-hidden": "true",
|
|
74
|
+
class: "prism-axis-tick",
|
|
75
|
+
x1: o ? r : 0,
|
|
76
|
+
x2: o ? r : 6 * c,
|
|
77
|
+
y1: o ? 0 : r,
|
|
78
|
+
y2: o ? 6 * c : r
|
|
79
|
+
});
|
|
80
|
+
e.appendChild(i);
|
|
81
|
+
let a = createTextElement(u(n), {
|
|
82
|
+
"aria-hidden": "true",
|
|
83
|
+
class: "prism-axis-label",
|
|
84
|
+
"dominant-baseline": o ? s ? "auto" : "hanging" : "middle",
|
|
85
|
+
"text-anchor": o ? "middle" : s ? "end" : "start",
|
|
86
|
+
x: o ? r : 6 * c * 1.5,
|
|
87
|
+
y: o ? 6 * c * 1.5 : r
|
|
88
|
+
});
|
|
89
|
+
e.appendChild(a);
|
|
90
|
+
}
|
|
91
|
+
if (n.label) {
|
|
92
|
+
let t = createTextElement(n.label, {
|
|
93
|
+
class: "prism-axis-title",
|
|
94
|
+
"dominant-baseline": "middle",
|
|
95
|
+
"text-anchor": "middle"
|
|
96
|
+
});
|
|
97
|
+
o ? setAttributes(t, {
|
|
98
|
+
x: r / 2,
|
|
99
|
+
y: 6 * c * 6
|
|
100
|
+
}) : setAttributes(t, { transform: `translate(${6 * c * 7}, ${r / 2}) rotate(-90)` }), e.appendChild(t);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//#endregion
|
|
104
|
+
//#region src/axes/grid.ts
|
|
105
|
+
function renderGrid(e, t, n, r, i, a) {
|
|
106
|
+
removeChildren(e);
|
|
107
|
+
let o = n !== !0 && n.color || void 0, s = n !== !0 && n.dash || void 0;
|
|
108
|
+
for (let n of a) {
|
|
109
|
+
let a = mapTick(t, n), c = {
|
|
110
|
+
class: "prism-grid-line",
|
|
111
|
+
stroke: o ?? "var(--prism-grid-color)",
|
|
112
|
+
"stroke-dasharray": s,
|
|
113
|
+
"stroke-opacity": "var(--prism-grid-opacity)"
|
|
114
|
+
};
|
|
115
|
+
i === "vertical" ? Object.assign(c, {
|
|
116
|
+
x1: a,
|
|
117
|
+
x2: a,
|
|
118
|
+
y1: 0,
|
|
119
|
+
y2: r
|
|
120
|
+
}) : Object.assign(c, {
|
|
121
|
+
x1: 0,
|
|
122
|
+
x2: r,
|
|
123
|
+
y1: a,
|
|
124
|
+
y2: a
|
|
125
|
+
}), e.appendChild(createSvgElement("line", c));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
//#endregion
|
|
129
|
+
//#region src/scales/linear.ts
|
|
130
|
+
function niceNumber(e, t) {
|
|
131
|
+
let n = Math.floor(Math.log10(e)), r = e / 10 ** n, i;
|
|
132
|
+
return i = t ? r < 1.5 ? 1 : r < 3 ? 2 : r < 7 ? 5 : 10 : r <= 1 ? 1 : r <= 2 ? 2 : r <= 5 ? 5 : 10, i * 10 ** n;
|
|
133
|
+
}
|
|
134
|
+
function niceRange(e, t, n) {
|
|
135
|
+
if (!Number.isFinite(e) || !Number.isFinite(t)) return [0, 1];
|
|
136
|
+
if (e > t && ([e, t] = [t, e]), e === t) return [e - 1, t + 1];
|
|
137
|
+
let r = niceNumber(niceNumber(t - e, !1) / Math.max(1, n - 1), !0);
|
|
138
|
+
return [Math.floor(e / r) * r, Math.ceil(t / r) * r];
|
|
139
|
+
}
|
|
140
|
+
function linearScale(e) {
|
|
141
|
+
let getDomain = () => e.nice === !1 ? e.domain : niceRange(e.domain[0], e.domain[1], 10), getRange = () => e.range;
|
|
142
|
+
return {
|
|
143
|
+
get domain() {
|
|
144
|
+
return getDomain();
|
|
145
|
+
},
|
|
146
|
+
invert(e) {
|
|
147
|
+
let [t, n] = getDomain(), [r, i] = getRange();
|
|
148
|
+
return i === r ? t : t + (e - r) / (i - r) * (n - t);
|
|
149
|
+
},
|
|
150
|
+
map(t) {
|
|
151
|
+
let [n, r] = getDomain(), [i, a] = getRange();
|
|
152
|
+
if (r === n) return i;
|
|
153
|
+
let o = (t - n) / (r - n);
|
|
154
|
+
return e.clamp && (o = Math.max(0, Math.min(1, o))), i + o * (a - i);
|
|
155
|
+
},
|
|
156
|
+
get range() {
|
|
157
|
+
return getRange();
|
|
158
|
+
},
|
|
159
|
+
ticks(e = 10) {
|
|
160
|
+
if (e <= 0) return [];
|
|
161
|
+
let [t, n] = getDomain();
|
|
162
|
+
if (t === n || e === 1) return [t];
|
|
163
|
+
let r = Math.min(t, n), i = Math.max(t, n), a = niceNumber(niceNumber(i - r, !1) / (e - 1), !0), o = Math.ceil(r / a) * a, s = Math.floor(i / a) * a, c = [];
|
|
164
|
+
for (let e = o; e <= s + a * .5; e += a) c.push(Math.round(e * 0xe8d4a51000) / 0xe8d4a51000);
|
|
165
|
+
return c;
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
//#endregion
|
|
170
|
+
//#region src/scales/time.ts
|
|
171
|
+
var u = 1e3, d = 60 * u, f = 60 * d, p = 24 * f, m = 30 * p, h = 365 * p, g = [
|
|
172
|
+
u,
|
|
173
|
+
5 * u,
|
|
174
|
+
15 * u,
|
|
175
|
+
30 * u,
|
|
176
|
+
d,
|
|
177
|
+
5 * d,
|
|
178
|
+
15 * d,
|
|
179
|
+
30 * d,
|
|
180
|
+
f,
|
|
181
|
+
3 * f,
|
|
182
|
+
6 * f,
|
|
183
|
+
12 * f,
|
|
184
|
+
p,
|
|
185
|
+
7 * p,
|
|
186
|
+
m,
|
|
187
|
+
3 * m,
|
|
188
|
+
6 * m,
|
|
189
|
+
h
|
|
190
|
+
];
|
|
191
|
+
function chooseInterval(e, t) {
|
|
192
|
+
let n = Math.abs(e) / Math.max(1, t);
|
|
193
|
+
for (let e of g) if (e >= n) return e;
|
|
194
|
+
return h;
|
|
195
|
+
}
|
|
196
|
+
function niceDomain(e, t) {
|
|
197
|
+
let [n, r] = e;
|
|
198
|
+
n.getTime() > r.getTime() && ([n, r] = [r, n]);
|
|
199
|
+
let i = chooseInterval(r.getTime() - n.getTime(), t);
|
|
200
|
+
return [new Date(Math.floor(n.getTime() / i) * i), new Date(Math.ceil(r.getTime() / i) * i)];
|
|
201
|
+
}
|
|
202
|
+
function timeScale(e) {
|
|
203
|
+
let getDomain = () => e.nice === !1 ? e.domain : niceDomain(e.domain, 10), getRange = () => e.range;
|
|
204
|
+
return {
|
|
205
|
+
get domain() {
|
|
206
|
+
return getDomain();
|
|
207
|
+
},
|
|
208
|
+
invert(e) {
|
|
209
|
+
let [t, n] = getDomain(), [r, i] = getRange();
|
|
210
|
+
if (i === r) return t;
|
|
211
|
+
let a = (e - r) / (i - r);
|
|
212
|
+
return new Date(t.getTime() + a * (n.getTime() - t.getTime()));
|
|
213
|
+
},
|
|
214
|
+
map(e) {
|
|
215
|
+
let [t, n] = getDomain(), [r, i] = getRange(), a = n.getTime() - t.getTime();
|
|
216
|
+
return a === 0 ? r : r + (e.getTime() - t.getTime()) / a * (i - r);
|
|
217
|
+
},
|
|
218
|
+
get range() {
|
|
219
|
+
return getRange();
|
|
220
|
+
},
|
|
221
|
+
ticks(e = 10) {
|
|
222
|
+
let [t, n] = getDomain(), r = chooseInterval(n.getTime() - t.getTime(), e), i = Math.ceil(t.getTime() / r) * r, a = [];
|
|
223
|
+
for (let e = i; e <= n.getTime(); e += r) a.push(new Date(e));
|
|
224
|
+
return a;
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
//#endregion
|
|
229
|
+
//#region src/core/cartesian-scales.ts
|
|
230
|
+
function buildXScale(e, t) {
|
|
231
|
+
if (e.length === 0 || e.some((e) => e == null) || e.some((e) => typeof e == "number" && !Number.isFinite(e))) return linearScale({
|
|
232
|
+
domain: [0, 1],
|
|
233
|
+
range: [0, t]
|
|
234
|
+
});
|
|
235
|
+
if (e[0] instanceof Date) {
|
|
236
|
+
let n = e, r = Math.min(...n.map(Number)), i = Math.max(...n.map(Number));
|
|
237
|
+
return timeScale({
|
|
238
|
+
domain: [new Date(r), new Date(r === i ? i + 1 : i)],
|
|
239
|
+
nice: !1,
|
|
240
|
+
range: [0, t]
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
let n = e, r = Math.min(...n), i = Math.max(...n);
|
|
244
|
+
return linearScale({
|
|
245
|
+
domain: [r, r === i ? i + 1 : i],
|
|
246
|
+
nice: !1,
|
|
247
|
+
range: [0, t]
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
function buildYScale(e, t, n = !0) {
|
|
251
|
+
if (e.length === 0 || e.some((e) => e == null) || e.some((e) => !Number.isFinite(e))) return linearScale({
|
|
252
|
+
domain: [0, 1],
|
|
253
|
+
range: [t, 0]
|
|
254
|
+
});
|
|
255
|
+
let r = Math.min(...e), i = n ? Math.min(0, r) : r, a = Math.max(...e);
|
|
256
|
+
return linearScale({
|
|
257
|
+
domain: [i, i === a ? a + 1 : a],
|
|
258
|
+
range: [t, 0]
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
//#endregion
|
|
262
|
+
//#region src/_tappers.ts
|
|
263
|
+
function createTappers() {
|
|
264
|
+
let e = /* @__PURE__ */ new Set(), t = !1;
|
|
265
|
+
return {
|
|
266
|
+
emit(t) {
|
|
267
|
+
if (e.size !== 0) for (let n of e) try {
|
|
268
|
+
n(t);
|
|
269
|
+
} catch {}
|
|
270
|
+
},
|
|
271
|
+
stop() {
|
|
272
|
+
t = !0, e.clear();
|
|
273
|
+
},
|
|
274
|
+
tap(n, r) {
|
|
275
|
+
if (t || r?.signal?.aborted) return () => {};
|
|
276
|
+
e.add(n);
|
|
277
|
+
let detach = () => {
|
|
278
|
+
e.delete(n);
|
|
279
|
+
};
|
|
280
|
+
return r?.signal?.addEventListener("abort", detach, { once: !0 }), detach;
|
|
281
|
+
}
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
//#endregion
|
|
285
|
+
//#region src/errors.ts
|
|
286
|
+
var PrismError = class extends Error {
|
|
287
|
+
constructor(e, t) {
|
|
288
|
+
super(e, t), this.name = new.target.name, Object.setPrototypeOf(this, new.target.prototype);
|
|
289
|
+
}
|
|
290
|
+
}, PrismRenderError = class extends PrismError {};
|
|
291
|
+
//#endregion
|
|
292
|
+
//#region src/interaction/announcer.ts
|
|
293
|
+
function describeValues(e, t, n = String) {
|
|
294
|
+
return `${e}: ${t.map(({ datum: e, series: t }) => `${t.name} ${e ? n(e.value, e, t) : "n/a"}`).join(", ")}`;
|
|
295
|
+
}
|
|
296
|
+
function createAnnouncer(e, t) {
|
|
297
|
+
let n = createSvgElement("text", {
|
|
298
|
+
"aria-live": "polite",
|
|
299
|
+
class: t,
|
|
300
|
+
role: "status",
|
|
301
|
+
x: -9999,
|
|
302
|
+
y: -9999
|
|
303
|
+
});
|
|
304
|
+
return e.appendChild(n), {
|
|
305
|
+
announce(e) {
|
|
306
|
+
n.textContent = e;
|
|
307
|
+
},
|
|
308
|
+
clear() {
|
|
309
|
+
n.textContent = "";
|
|
310
|
+
}
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
//#endregion
|
|
314
|
+
//#region src/interaction/legend.ts
|
|
315
|
+
function resolvePosition(e) {
|
|
316
|
+
return e === !0 ? "bottom" : e.position ?? "bottom";
|
|
317
|
+
}
|
|
318
|
+
function createLegend(e, t, n) {
|
|
319
|
+
let r = resolvePosition(t), i = document.createElement("div");
|
|
320
|
+
i.className = `prism-legend prism-legend-${r}`, r === "top" ? e.insertBefore(i, e.firstChild) : e.appendChild(i);
|
|
321
|
+
let disposeHandle = () => {
|
|
322
|
+
i.remove();
|
|
323
|
+
};
|
|
324
|
+
return {
|
|
325
|
+
dispose: disposeHandle,
|
|
326
|
+
el: i,
|
|
327
|
+
[Symbol.dispose]: disposeHandle,
|
|
328
|
+
update(e) {
|
|
329
|
+
i.replaceChildren();
|
|
330
|
+
for (let t of e) {
|
|
331
|
+
let e = document.createElement("div");
|
|
332
|
+
e.className = "prism-legend-item";
|
|
333
|
+
let n = document.createElement("span");
|
|
334
|
+
n.className = "prism-legend-dot", n.style.backgroundColor = t.color;
|
|
335
|
+
let r = document.createElement("span");
|
|
336
|
+
r.className = "prism-legend-label", r.textContent = t.name, e.appendChild(n), e.appendChild(r), i.appendChild(e);
|
|
337
|
+
}
|
|
338
|
+
n?.();
|
|
339
|
+
}
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
//#endregion
|
|
343
|
+
//#region src/interaction/tooltip.ts
|
|
344
|
+
var _ = "position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap";
|
|
345
|
+
function shiftBoundary(e, t) {
|
|
346
|
+
let r = e.getBoundingClientRect(), i = {
|
|
347
|
+
height: r.height,
|
|
348
|
+
width: r.width,
|
|
349
|
+
x: r.x,
|
|
350
|
+
y: r.y
|
|
351
|
+
}, a = n(t), o = Math.max(i.x, a.x), s = Math.max(i.y, a.y), c = Math.min(i.x + i.width, a.x + a.width), l = Math.min(i.y + i.height, a.y + a.height);
|
|
352
|
+
return c <= o || l <= s ? i : {
|
|
353
|
+
height: l - s,
|
|
354
|
+
width: c - o,
|
|
355
|
+
x: o,
|
|
356
|
+
y: s
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
function comparisonContent(e, t, n, r) {
|
|
360
|
+
let i = e.createElement("div"), a = e.createElement("span"), o = e.createElement("div"), s = e.createElement("div");
|
|
361
|
+
i.className = "prism-tooltip-body", a.className = "prism-tooltip-sr", a.style.cssText = _, a.textContent = r, o.setAttribute("aria-hidden", "true"), s.className = "prism-tooltip-title", s.textContent = t, o.appendChild(s);
|
|
362
|
+
for (let t of n) {
|
|
363
|
+
let n = e.createElement("div"), r = e.createElement("span"), i = e.createElement("span"), a = e.createElement("span");
|
|
364
|
+
n.className = "prism-tooltip-row", r.className = "prism-tooltip-swatch", r.style.setProperty("--prism-swatch", t.color), i.className = "prism-tooltip-name", i.textContent = t.name, a.className = "prism-tooltip-value", a.textContent = t.value, n.append(r, i, a), o.appendChild(n);
|
|
365
|
+
}
|
|
366
|
+
return i.append(a, o), i;
|
|
367
|
+
}
|
|
368
|
+
function createTooltip(n, a) {
|
|
369
|
+
let o = n.style.position, s = getComputedStyle(n).position === "static";
|
|
370
|
+
s && (n.style.position = "relative");
|
|
371
|
+
let c = n.ownerDocument.createElement("div");
|
|
372
|
+
c.className = "prism-tooltip", c.style.position = "absolute", c.style.pointerEvents = "none", c.style.top = "0", c.style.left = "0", c.setAttribute("role", "status"), c.setAttribute("aria-live", "polite"), n.appendChild(c);
|
|
373
|
+
let l = a !== !0 && a?.offset || 8, u = a === !0 ? void 0 : a?.render, setVisible = (e) => {
|
|
374
|
+
c.classList.toggle("prism-tooltip--visible", e), c.style.opacity = e ? "1" : "0";
|
|
375
|
+
}, d = null, f = null, p = !1, cancelClear = () => {
|
|
376
|
+
f !== null && (clearTimeout(f), f = null);
|
|
377
|
+
}, cancelReveal = () => {
|
|
378
|
+
d !== null && (cancelAnimationFrame(d), d = null);
|
|
379
|
+
}, disposeHandle = () => {
|
|
380
|
+
cancelReveal(), cancelClear(), c.remove(), s && n.style.position === "relative" && (n.style.position = o);
|
|
381
|
+
};
|
|
382
|
+
return {
|
|
383
|
+
dispose: disposeHandle,
|
|
384
|
+
el: c,
|
|
385
|
+
hide() {
|
|
386
|
+
cancelReveal(), cancelClear(), p = !1, setVisible(!1), f = setTimeout(() => {
|
|
387
|
+
f = null, p || (c.textContent = "");
|
|
388
|
+
}, 150);
|
|
389
|
+
},
|
|
390
|
+
show(a, o, s, f, m) {
|
|
391
|
+
if (!n.isConnected) return;
|
|
392
|
+
cancelClear();
|
|
393
|
+
let h = u ? u(s, f) : m ?? `${f.name}: ${s.value}`;
|
|
394
|
+
typeof h == "string" ? c.textContent = h : c.replaceChildren(h);
|
|
395
|
+
let { x: g, y: _ } = e({ getBoundingClientRect: () => {
|
|
396
|
+
let e = n.getBoundingClientRect();
|
|
397
|
+
return {
|
|
398
|
+
bottom: e.top + o,
|
|
399
|
+
height: 0,
|
|
400
|
+
left: e.left + a,
|
|
401
|
+
right: e.left + a,
|
|
402
|
+
top: e.top + o,
|
|
403
|
+
width: 0,
|
|
404
|
+
x: e.left + a,
|
|
405
|
+
y: e.top + o
|
|
406
|
+
};
|
|
407
|
+
} }, c, {
|
|
408
|
+
containingBlock: n,
|
|
409
|
+
middleware: [
|
|
410
|
+
r(l),
|
|
411
|
+
t(),
|
|
412
|
+
i({
|
|
413
|
+
boundary: shiftBoundary(n, c),
|
|
414
|
+
padding: 8
|
|
415
|
+
})
|
|
416
|
+
],
|
|
417
|
+
placement: "top"
|
|
418
|
+
});
|
|
419
|
+
c.style.left = `${g}px`, c.style.top = `${_}px`, p ? d === null && setVisible(!0) : (p = !0, setVisible(!1), d = requestAnimationFrame(() => {
|
|
420
|
+
d = null, p && setVisible(!0);
|
|
421
|
+
}));
|
|
422
|
+
},
|
|
423
|
+
[Symbol.dispose]: disposeHandle
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
//#endregion
|
|
427
|
+
//#region src/core/layout.ts
|
|
428
|
+
var v = {
|
|
429
|
+
bottom: 48,
|
|
430
|
+
left: 50,
|
|
431
|
+
right: 20,
|
|
432
|
+
top: 20
|
|
433
|
+
};
|
|
434
|
+
function resolveMargin(e) {
|
|
435
|
+
return {
|
|
436
|
+
...v,
|
|
437
|
+
...e
|
|
438
|
+
};
|
|
439
|
+
}
|
|
440
|
+
function chartArea(e, t, n) {
|
|
441
|
+
return {
|
|
442
|
+
height: Math.max(0, t - n.top - n.bottom),
|
|
443
|
+
width: Math.max(0, e - n.left - n.right)
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
//#endregion
|
|
447
|
+
//#region src/core/responsive.ts
|
|
448
|
+
function observeResize(e, t) {
|
|
449
|
+
if (typeof ResizeObserver > "u") return () => {};
|
|
450
|
+
let n = null, r = new ResizeObserver((e) => {
|
|
451
|
+
n !== null && cancelAnimationFrame(n), n = requestAnimationFrame(() => {
|
|
452
|
+
n = null;
|
|
453
|
+
let r = e[0];
|
|
454
|
+
if (r) {
|
|
455
|
+
let { height: e, width: n } = r.contentRect;
|
|
456
|
+
t(n, e);
|
|
457
|
+
}
|
|
458
|
+
});
|
|
459
|
+
});
|
|
460
|
+
return r.observe(e), () => {
|
|
461
|
+
n !== null && cancelAnimationFrame(n), r.disconnect();
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
//#endregion
|
|
465
|
+
//#region src/core/chart-base.ts
|
|
466
|
+
function createChartBase(e, t, n) {
|
|
467
|
+
if (!(typeof e == "object" && e && e.nodeType === 1 && typeof e.appendChild == "function" && typeof e.getBoundingClientRect == "function")) {
|
|
468
|
+
let t = e;
|
|
469
|
+
throw new PrismRenderError(`Invalid chart configuration: \`container\` must be a DOM Element, received ${t === null ? "null" : typeof t == "object" ? t.constructor?.name ?? "object" : typeof t}.`);
|
|
470
|
+
}
|
|
471
|
+
let r = resolveMargin(t.margin), i = t.a11y, a = createSvgElement("svg", {
|
|
472
|
+
...!i || i.decorative ? { "aria-hidden": "true" } : {
|
|
473
|
+
"aria-label": i.ariaLabel,
|
|
474
|
+
role: "img",
|
|
475
|
+
tabindex: "0"
|
|
476
|
+
},
|
|
477
|
+
class: "prism-chart",
|
|
478
|
+
style: "display:block;max-width:100%"
|
|
479
|
+
}), o = createSvgElement("g", {
|
|
480
|
+
class: "prism-chart-area",
|
|
481
|
+
transform: `translate(${r.left},${r.top})`
|
|
482
|
+
});
|
|
483
|
+
a.appendChild(o);
|
|
484
|
+
let s = e.getBoundingClientRect();
|
|
485
|
+
s.width === 0 || s.height;
|
|
486
|
+
let c = s.width || 600, l = s.height || 300, u = {
|
|
487
|
+
height: l,
|
|
488
|
+
margin: r,
|
|
489
|
+
width: c
|
|
490
|
+
}, d = c, f = l, p = l, syncChrome = () => {
|
|
491
|
+
let e = Math.max(0, p - (t.chrome?.()?.offsetHeight ?? 0));
|
|
492
|
+
f = e, u.height = e, setAttributes(a, {
|
|
493
|
+
height: e,
|
|
494
|
+
viewBox: `0 0 ${u.width} ${e}`
|
|
495
|
+
});
|
|
496
|
+
}, m = observeResize(e, (e, r) => {
|
|
497
|
+
p = r;
|
|
498
|
+
let i = t.chrome?.()?.offsetHeight ?? 0, o = Math.max(0, r - i);
|
|
499
|
+
(e !== d || o !== f) && (d = e, f = o, u.height = o, u.width = e, setAttributes(a, {
|
|
500
|
+
height: o,
|
|
501
|
+
viewBox: `0 0 ${e} ${o}`,
|
|
502
|
+
width: e
|
|
503
|
+
}), n?.());
|
|
504
|
+
});
|
|
505
|
+
return setAttributes(a, {
|
|
506
|
+
height: l,
|
|
507
|
+
viewBox: `0 0 ${c} ${l}`,
|
|
508
|
+
width: c
|
|
509
|
+
}), e.appendChild(a), {
|
|
510
|
+
chartArea: o,
|
|
511
|
+
dimensions: u,
|
|
512
|
+
dispose() {
|
|
513
|
+
m(), a.remove();
|
|
514
|
+
},
|
|
515
|
+
svg: a,
|
|
516
|
+
syncChrome
|
|
517
|
+
};
|
|
518
|
+
}
|
|
519
|
+
//#endregion
|
|
520
|
+
//#region src/core/chart-scaffold.ts
|
|
521
|
+
function clearCartesianDom(e, t, n, r) {
|
|
522
|
+
removeChildren(e.series), removeChildren(e.grid), removeChildren(e.xAxis), removeChildren(e.yAxis), t?.update([]), n?.hide(), r?.hide();
|
|
523
|
+
}
|
|
524
|
+
function runScaffold(e, t, n, r, i) {
|
|
525
|
+
let render = (e) => {}, a = createTappers(), o = null, s = createChartBase(e, {
|
|
526
|
+
a11y: t.a11y,
|
|
527
|
+
chrome: () => o?.el ?? null,
|
|
528
|
+
margin: t.margin
|
|
529
|
+
}, () => {
|
|
530
|
+
a.emit({
|
|
531
|
+
height: s.dimensions.height,
|
|
532
|
+
type: "resize",
|
|
533
|
+
width: s.dimensions.width
|
|
534
|
+
}), render("resize");
|
|
535
|
+
}), c = t.tooltip ? createTooltip(e, t.tooltip) : null;
|
|
536
|
+
o = t.legend ? createLegend(e, t.legend, () => s.syncChrome()) : null;
|
|
537
|
+
let l = new AbortController(), u = n(s, c, o, l.signal, createAnnouncer(s.svg, "prism-live")), d = !1, f = makeEventManager(s.svg);
|
|
538
|
+
render = (e) => {
|
|
539
|
+
d || f.attach(r(u, e));
|
|
540
|
+
};
|
|
541
|
+
try {
|
|
542
|
+
render("mount");
|
|
543
|
+
} catch (e) {
|
|
544
|
+
throw d = !0, l.abort(), f.detach(), c?.dispose(), o?.dispose(), s.dispose(), e instanceof PrismRenderError ? e : new PrismRenderError("Failed to render chart.", { cause: e });
|
|
545
|
+
}
|
|
546
|
+
return {
|
|
547
|
+
get disposalSignal() {
|
|
548
|
+
return l.signal;
|
|
549
|
+
},
|
|
550
|
+
dispose() {
|
|
551
|
+
d || (d = !0, a.emit({ type: "dispose" }), a.stop(), l.abort(), f.detach(), c?.dispose(), o?.dispose(), s.dispose());
|
|
552
|
+
},
|
|
553
|
+
get disposed() {
|
|
554
|
+
return d;
|
|
555
|
+
},
|
|
556
|
+
el: s.svg,
|
|
557
|
+
tap: a.tap,
|
|
558
|
+
update(e) {
|
|
559
|
+
if (d) throw new PrismRenderError("Cannot update a disposed chart.");
|
|
560
|
+
i(e), render("update");
|
|
561
|
+
},
|
|
562
|
+
[Symbol.dispose]() {
|
|
563
|
+
this.dispose();
|
|
564
|
+
}
|
|
565
|
+
};
|
|
566
|
+
}
|
|
567
|
+
function makeEventManager(e) {
|
|
568
|
+
let t = null;
|
|
569
|
+
return {
|
|
570
|
+
attach(n) {
|
|
571
|
+
t &&= (t.onMouseMove && e.removeEventListener("mousemove", t.onMouseMove), t.onMouseLeave && e.removeEventListener("mouseleave", t.onMouseLeave), t.onClick && e.removeEventListener("click", t.onClick), t.onKeyDown && e.removeEventListener("keydown", t.onKeyDown), null), n && (t = n, n.onMouseMove && e.addEventListener("mousemove", n.onMouseMove), n.onMouseLeave && e.addEventListener("mouseleave", n.onMouseLeave), n.onClick && e.addEventListener("click", n.onClick), n.onKeyDown && e.addEventListener("keydown", n.onKeyDown));
|
|
572
|
+
},
|
|
573
|
+
detach() {
|
|
574
|
+
this.attach(void 0);
|
|
575
|
+
}
|
|
576
|
+
};
|
|
577
|
+
}
|
|
578
|
+
function createChartScaffold(e, t, n, r) {
|
|
579
|
+
return runScaffold(e, t, (t, n, r, i, a) => {
|
|
580
|
+
let o = {
|
|
581
|
+
grid: createSvgElement("g", {
|
|
582
|
+
"aria-hidden": "true",
|
|
583
|
+
class: "prism-grid"
|
|
584
|
+
}),
|
|
585
|
+
series: createSvgElement("g", { class: "prism-series" }),
|
|
586
|
+
xAxis: createSvgElement("g", { class: "prism-x-axis" }),
|
|
587
|
+
yAxis: createSvgElement("g", { class: "prism-y-axis" })
|
|
588
|
+
};
|
|
589
|
+
return t.chartArea.appendChild(o.grid), t.chartArea.appendChild(o.xAxis), t.chartArea.appendChild(o.yAxis), t.chartArea.appendChild(o.series), {
|
|
590
|
+
announcer: a,
|
|
591
|
+
chartArea: t.chartArea,
|
|
592
|
+
container: e,
|
|
593
|
+
dimensions: t.dimensions,
|
|
594
|
+
disposalSignal: i,
|
|
595
|
+
groups: o,
|
|
596
|
+
legend: r,
|
|
597
|
+
svg: t.svg,
|
|
598
|
+
tooltip: n
|
|
599
|
+
};
|
|
600
|
+
}, n, r);
|
|
601
|
+
}
|
|
602
|
+
function createRadialScaffold(e, t, n, r) {
|
|
603
|
+
return runScaffold(e, t, (t, n, r, i, a) => ({
|
|
604
|
+
announcer: a,
|
|
605
|
+
container: e,
|
|
606
|
+
dimensions: t.dimensions,
|
|
607
|
+
disposalSignal: i,
|
|
608
|
+
legend: r,
|
|
609
|
+
svg: t.svg,
|
|
610
|
+
tooltip: n
|
|
611
|
+
}), n, r);
|
|
612
|
+
}
|
|
613
|
+
//#endregion
|
|
614
|
+
//#region src/core/series-id.ts
|
|
615
|
+
function seriesDomId(e, t) {
|
|
616
|
+
return e?.id ? e.id.replace(/[^A-Za-z0-9_-]/g, "-") : `series-${t}`;
|
|
617
|
+
}
|
|
618
|
+
//#endregion
|
|
619
|
+
//#region src/interaction/crosshair.ts
|
|
620
|
+
function createCrosshair(e, t) {
|
|
621
|
+
let n = t === !0 || t?.vertical !== !1, r = t !== !0 && t?.horizontal === !0, i = t === !0 || t?.snap !== !1, a = createSvgElement("g", {
|
|
622
|
+
"aria-hidden": "true",
|
|
623
|
+
class: "prism-crosshair",
|
|
624
|
+
style: "display:none"
|
|
625
|
+
}), o = n ? createSvgElement("line", {
|
|
626
|
+
class: "prism-crosshair-v",
|
|
627
|
+
"stroke-dasharray": "var(--prism-crosshair-dash, 4 2)"
|
|
628
|
+
}) : null, s = r ? createSvgElement("line", {
|
|
629
|
+
class: "prism-crosshair-h",
|
|
630
|
+
"stroke-dasharray": "var(--prism-crosshair-dash, 4 2)"
|
|
631
|
+
}) : null;
|
|
632
|
+
return o && a.appendChild(o), s && a.appendChild(s), e.appendChild(a), {
|
|
633
|
+
hide() {
|
|
634
|
+
a.style.display = "none";
|
|
635
|
+
},
|
|
636
|
+
show(e, t, n, r) {
|
|
637
|
+
a.style.display = "", o && (setAttributes(o, {
|
|
638
|
+
x1: 0,
|
|
639
|
+
x2: 0,
|
|
640
|
+
y1: 0,
|
|
641
|
+
y2: r
|
|
642
|
+
}), o.style.transform = `translateX(${e}px)`), s && (setAttributes(s, {
|
|
643
|
+
x1: 0,
|
|
644
|
+
x2: n,
|
|
645
|
+
y1: 0,
|
|
646
|
+
y2: 0
|
|
647
|
+
}), s.style.transform = `translateY(${t}px)`);
|
|
648
|
+
},
|
|
649
|
+
snap: i
|
|
650
|
+
};
|
|
651
|
+
}
|
|
652
|
+
//#endregion
|
|
653
|
+
//#region src/core/cartesian-model.ts
|
|
654
|
+
function keyId(e) {
|
|
655
|
+
return e instanceof Date ? `date:${e.getTime()}` : `${typeof e}:${String(e)}`;
|
|
656
|
+
}
|
|
657
|
+
function normalizeCartesianSeries(e, t) {
|
|
658
|
+
let n = [], r = /* @__PURE__ */ new Map();
|
|
659
|
+
return {
|
|
660
|
+
domain: n,
|
|
661
|
+
labels: r,
|
|
662
|
+
series: e.map((e, i) => {
|
|
663
|
+
let a = /* @__PURE__ */ new Map();
|
|
664
|
+
for (let o of t[i] ?? []) {
|
|
665
|
+
let t = keyId(o.key);
|
|
666
|
+
a.has(t) ? `${String(o.key)}${e.name}` : (a.set(t, o), r.has(t) || (r.set(t, o.key), n.push(t)));
|
|
667
|
+
}
|
|
668
|
+
return {
|
|
669
|
+
byKey: a,
|
|
670
|
+
config: e
|
|
671
|
+
};
|
|
672
|
+
})
|
|
673
|
+
};
|
|
674
|
+
}
|
|
675
|
+
//#endregion
|
|
676
|
+
//#region src/interaction/events.ts
|
|
677
|
+
function getMousePosition(e, t, n, r) {
|
|
678
|
+
let i = e.getBoundingClientRect();
|
|
679
|
+
return {
|
|
680
|
+
x: t.clientX - i.left - n,
|
|
681
|
+
y: t.clientY - i.top - r
|
|
682
|
+
};
|
|
683
|
+
}
|
|
684
|
+
//#endregion
|
|
685
|
+
//#region src/interaction/series-interaction.ts
|
|
686
|
+
var keyOrder = (e) => e instanceof Date ? e.getTime() : Number(e);
|
|
687
|
+
function keyLabel(e) {
|
|
688
|
+
return e instanceof Date ? e.toLocaleDateString() : String(e);
|
|
689
|
+
}
|
|
690
|
+
function findNearestKey(e, t, n) {
|
|
691
|
+
let r = null, i = Infinity;
|
|
692
|
+
for (let a = 0; a < t.length; a++) for (let o = 0; o < (t[a]?.length ?? 0); o++) {
|
|
693
|
+
let s = e[a]?.[o], c = t[a]?.[o];
|
|
694
|
+
if (!s || !c) continue;
|
|
695
|
+
let l = Math.abs(c.x - n);
|
|
696
|
+
l < i && (i = l, r = s.key);
|
|
697
|
+
}
|
|
698
|
+
return r;
|
|
699
|
+
}
|
|
700
|
+
function createSeriesInteraction(e) {
|
|
701
|
+
let t = -1, n = !1, renderedHit = (t) => {
|
|
702
|
+
let n = t.target;
|
|
703
|
+
if (!(n instanceof SVGElement) || n.tagName.toLowerCase() !== "circle" || !e.seriesGroup.contains(n) || !n.parentElement) return null;
|
|
704
|
+
let r = n.parentElement;
|
|
705
|
+
for (; r && r.parentNode !== e.seriesGroup;) r = r.parentElement;
|
|
706
|
+
if (!r) return null;
|
|
707
|
+
let i = [...e.seriesGroup.children].indexOf(r), a = [...n.parentElement.children].indexOf(n), o = e.getData()[i]?.[a], s = e.getPoints()[i]?.[a];
|
|
708
|
+
return o && s ? {
|
|
709
|
+
datum: o,
|
|
710
|
+
point: s,
|
|
711
|
+
seriesIndex: i
|
|
712
|
+
} : null;
|
|
713
|
+
}, entriesAt = (t) => {
|
|
714
|
+
let n = keyId(t), r = e.getPoints();
|
|
715
|
+
return e.getData().map((e, t) => {
|
|
716
|
+
let i = e.findIndex((e) => keyId(e.key) === n);
|
|
717
|
+
return i === -1 ? {
|
|
718
|
+
datum: void 0,
|
|
719
|
+
point: void 0
|
|
720
|
+
} : {
|
|
721
|
+
datum: e[i],
|
|
722
|
+
point: r[t]?.[i]
|
|
723
|
+
};
|
|
724
|
+
});
|
|
725
|
+
}, nearestIndex = (e, t) => {
|
|
726
|
+
let n = -1, r = Infinity;
|
|
727
|
+
return e.forEach(({ point: e }, i) => {
|
|
728
|
+
if (!e) return;
|
|
729
|
+
let a = Number.isFinite(t) ? Math.abs(e.y - t) : 0;
|
|
730
|
+
a < r && (r = a, n = i);
|
|
731
|
+
}), n;
|
|
732
|
+
}, highlight = (t, n) => {
|
|
733
|
+
let r = e.colors();
|
|
734
|
+
e.markers.replaceChildren(), t.forEach(({ point: t }, n) => {
|
|
735
|
+
t && e.markers.appendChild(createSvgElement("circle", {
|
|
736
|
+
class: "prism-active-point",
|
|
737
|
+
cx: t.x,
|
|
738
|
+
cy: t.y,
|
|
739
|
+
fill: r[n],
|
|
740
|
+
r: 4
|
|
741
|
+
}));
|
|
742
|
+
});
|
|
743
|
+
let i = [...e.seriesGroup.children];
|
|
744
|
+
e.seriesGroup.classList.toggle("prism-series-focused", n >= 0 && i.length > 1);
|
|
745
|
+
for (let [e, t] of i.entries()) t.classList.toggle("prism-series-active", e === n);
|
|
746
|
+
}, clear = () => {
|
|
747
|
+
e.crosshair?.hide(), e.tooltip?.hide(), e.announcer.clear(), highlight([], -1), n = !1, e.onHover?.(null);
|
|
748
|
+
}, eventFor = (t, n, r) => {
|
|
749
|
+
let i = entriesAt(t), a = renderedHit(r), o = a?.seriesIndex ?? nearestIndex(i, n);
|
|
750
|
+
a && (i[o] = {
|
|
751
|
+
datum: a.datum,
|
|
752
|
+
point: a.point
|
|
753
|
+
});
|
|
754
|
+
let s = e.getSeriesList(), c = i[o]?.datum;
|
|
755
|
+
if (o < 0 || !c) return null;
|
|
756
|
+
let l = i.map((e, t) => ({
|
|
757
|
+
datum: e.datum,
|
|
758
|
+
series: s[t]
|
|
759
|
+
}));
|
|
760
|
+
return {
|
|
761
|
+
entries: i,
|
|
762
|
+
event: {
|
|
763
|
+
datum: c,
|
|
764
|
+
originalEvent: r,
|
|
765
|
+
series: s[o],
|
|
766
|
+
values: l
|
|
767
|
+
},
|
|
768
|
+
index: o
|
|
769
|
+
};
|
|
770
|
+
}, focus = (t, r, i) => {
|
|
771
|
+
let a = eventFor(t, r?.y ?? NaN, i);
|
|
772
|
+
if (!a) return;
|
|
773
|
+
let { entries: o, event: s, index: c } = a, l = o[c].point, u = e.dims(), d = chartArea(u.width, u.height, e.margin), f = e.crosshair?.snap === !1 && r, p = e.tooltipFormat?.titleFormat ? e.tooltipFormat.titleFormat(t) : keyLabel(t), m = s.values ?? [], h = e.colors(), g = e.tooltipFormat?.valueFormat;
|
|
774
|
+
e.crosshair?.show(f ? r.x : l.x, f ? r.y : l.y, d.width, d.height), highlight(o, c);
|
|
775
|
+
let _ = describeValues(p, m, g ?? String);
|
|
776
|
+
if (e.tooltip) {
|
|
777
|
+
let t = m.flatMap(({ datum: e, series: t }, n) => e ? [{
|
|
778
|
+
color: h[n],
|
|
779
|
+
name: t.name,
|
|
780
|
+
value: g ? g(e.value, e, t) : String(e.value)
|
|
781
|
+
}] : []);
|
|
782
|
+
e.tooltip.show(l.x + e.margin.left, l.y + e.margin.top, s.datum, s.series, comparisonContent(e.svg.ownerDocument, p, t, _));
|
|
783
|
+
} else e.announcer.announce(_);
|
|
784
|
+
n = !0, e.onHover?.(s);
|
|
785
|
+
}, pointerKey = (t) => {
|
|
786
|
+
let n = renderedHit(t);
|
|
787
|
+
if (n) return {
|
|
788
|
+
key: n.datum.key,
|
|
789
|
+
pos: n.point
|
|
790
|
+
};
|
|
791
|
+
let r = e.getPoints();
|
|
792
|
+
if (r.every((e) => e.length === 0)) return null;
|
|
793
|
+
let i = e.dims(), a = getMousePosition(e.svg, t, e.margin.left, e.margin.top), o = chartArea(i.width, i.height, e.margin);
|
|
794
|
+
if (a.x < 0 || a.x > o.width || a.y < 0 || a.y > o.height) return null;
|
|
795
|
+
let s = findNearestKey(e.getData(), r, a.x);
|
|
796
|
+
return s === null ? null : {
|
|
797
|
+
key: s,
|
|
798
|
+
pos: a
|
|
799
|
+
};
|
|
800
|
+
}, sortedKeys = () => [...new Map(e.getData().flat().map((e) => [keyId(e.key), e.key])).values()].sort((e, t) => keyOrder(e) - keyOrder(t)), onMouseMove = (e) => {
|
|
801
|
+
let t = pointerKey(e);
|
|
802
|
+
t ? focus(t.key, t.pos, e) : n && clear();
|
|
803
|
+
}, onClick = (t) => {
|
|
804
|
+
if (!e.onClick) return;
|
|
805
|
+
let n = pointerKey(t), r = n && eventFor(n.key, n.pos.y, t);
|
|
806
|
+
r && e.onClick(r.event);
|
|
807
|
+
}, onKeyDown = (n) => {
|
|
808
|
+
let r = sortedKeys();
|
|
809
|
+
if (r.length === 0) return;
|
|
810
|
+
let i = r.length - 1, a = {
|
|
811
|
+
ArrowLeft: t < 0 ? i : Math.max(0, t - 1),
|
|
812
|
+
ArrowRight: t < 0 ? 0 : Math.min(i, t + 1),
|
|
813
|
+
End: i,
|
|
814
|
+
Home: 0
|
|
815
|
+
};
|
|
816
|
+
if (n.key in a) n.preventDefault(), t = a[n.key], focus(r[t], null, n);
|
|
817
|
+
else if ((n.key === "Enter" || n.key === " ") && t >= 0 && e.onClick) {
|
|
818
|
+
n.preventDefault();
|
|
819
|
+
let i = eventFor(r[t], NaN, n);
|
|
820
|
+
i && e.onClick(i.event);
|
|
821
|
+
} else n.key === "Escape" && (t = -1, clear());
|
|
822
|
+
};
|
|
823
|
+
return {
|
|
824
|
+
onClick,
|
|
825
|
+
onKeyDown,
|
|
826
|
+
onMouseLeave: clear,
|
|
827
|
+
onMouseMove
|
|
828
|
+
};
|
|
829
|
+
}
|
|
830
|
+
function ensureMarkerGroup(e, t) {
|
|
831
|
+
if (t && e.contains(t)) return t;
|
|
832
|
+
let n = createSvgElement("g", {
|
|
833
|
+
"aria-hidden": "true",
|
|
834
|
+
class: "prism-active-points",
|
|
835
|
+
"pointer-events": "none"
|
|
836
|
+
});
|
|
837
|
+
return e.appendChild(n), n;
|
|
838
|
+
}
|
|
839
|
+
//#endregion
|
|
840
|
+
//#region src/theme/index.ts
|
|
841
|
+
var y = 8, b = {
|
|
842
|
+
axisColor: "--prism-axis-color",
|
|
843
|
+
fontFamily: "--prism-font-family",
|
|
844
|
+
gridColor: "--prism-grid-color",
|
|
845
|
+
gridOpacity: "--prism-grid-opacity",
|
|
846
|
+
textColor: "--prism-text-color",
|
|
847
|
+
textColorSecondary: "--prism-text-color-secondary",
|
|
848
|
+
tooltipBg: "--prism-tooltip-bg",
|
|
849
|
+
tooltipBorder: "--prism-tooltip-border",
|
|
850
|
+
tooltipColor: "--prism-tooltip-color"
|
|
851
|
+
};
|
|
852
|
+
function target(e) {
|
|
853
|
+
return e?.scope ?? document.documentElement;
|
|
854
|
+
}
|
|
855
|
+
function setTheme(e, t) {
|
|
856
|
+
let n = target(t);
|
|
857
|
+
if (e.colors) for (let t = 0; t < y; t++) {
|
|
858
|
+
let r = e.colors[t];
|
|
859
|
+
r ? n.style.setProperty(`--prism-color-${t + 1}`, r) : n.style.removeProperty(`--prism-color-${t + 1}`);
|
|
860
|
+
}
|
|
861
|
+
for (let [t, r] of Object.entries(b)) {
|
|
862
|
+
let i = e[t];
|
|
863
|
+
i !== void 0 && n.style.setProperty(r, String(i));
|
|
864
|
+
}
|
|
865
|
+
}
|
|
866
|
+
function resetTheme(e) {
|
|
867
|
+
let t = target(e);
|
|
868
|
+
for (let e = 1; e <= y; e++) t.style.removeProperty(`--prism-color-${e}`);
|
|
869
|
+
for (let e of Object.values(b)) t.style.removeProperty(e);
|
|
870
|
+
}
|
|
871
|
+
function seriesColor(e, t) {
|
|
872
|
+
return t ?? `var(--prism-color-${e % y + 1})`;
|
|
873
|
+
}
|
|
874
|
+
//#endregion
|
|
875
|
+
//#region src/animation/easing.ts
|
|
876
|
+
var x = 1.70158, S = {
|
|
877
|
+
"back-out": (e) => 1 + 2.70158 * (e - 1) ** 3 + x * (e - 1) ** 2,
|
|
878
|
+
"ease-in": (e) => e * e * e,
|
|
879
|
+
"ease-in-out": (e) => e < .5 ? 4 * e * e * e : 1 - (-2 * e + 2) ** 3 / 2,
|
|
880
|
+
"ease-out": (e) => 1 - (1 - e) ** 3,
|
|
881
|
+
"expo-out": (e) => e >= 1 ? 1 : 1 - 2 ** (-10 * e),
|
|
882
|
+
linear: (e) => e
|
|
883
|
+
};
|
|
884
|
+
function resolveEasing(e) {
|
|
885
|
+
return typeof e == "function" ? e : e !== void 0 && Object.hasOwn(S, e) ? S[e] : S["ease-out"];
|
|
886
|
+
}
|
|
887
|
+
function resolveMotion(e, t) {
|
|
888
|
+
if (e === !1) return {
|
|
889
|
+
duration: 0,
|
|
890
|
+
stagger: 0
|
|
891
|
+
};
|
|
892
|
+
let n = e === !0 ? void 0 : e, r = n?.preference ?? "system", i = typeof matchMedia < "u" && matchMedia("(prefers-reduced-motion: reduce)").matches, a = r === "never" || r === "system" && i ? 0 : n?.duration ?? t?.defaultDuration ?? 300;
|
|
893
|
+
return {
|
|
894
|
+
...n,
|
|
895
|
+
duration: a,
|
|
896
|
+
stagger: Math.max(0, n?.stagger ?? t?.defaultStagger ?? 0)
|
|
897
|
+
};
|
|
898
|
+
}
|
|
899
|
+
//#endregion
|
|
900
|
+
//#region src/animation/tween.ts
|
|
901
|
+
function tweenNumber(e, t, n) {
|
|
902
|
+
return e + (t - e) * n;
|
|
903
|
+
}
|
|
904
|
+
//#endregion
|
|
905
|
+
//#region src/animation/transition.ts
|
|
906
|
+
function startTween(e) {
|
|
907
|
+
let { count: t, duration: n, easing: r, stagger: i = 0, signal: a, onFrame: o, onComplete: s } = e;
|
|
908
|
+
if (a?.aborted) return () => {};
|
|
909
|
+
if (n <= 0) return o(() => 1), s?.(), () => {};
|
|
910
|
+
if (t === 0) return s?.(), () => {};
|
|
911
|
+
let c = n + i * (t - 1), l = null, u = null, d = !1, cancel = () => {
|
|
912
|
+
d = !0, u !== null && (cancelAnimationFrame(u), u = null), a?.removeEventListener("abort", cancel);
|
|
913
|
+
}, frame = (e) => {
|
|
914
|
+
if (d || a?.aborted) return;
|
|
915
|
+
l === null && (l = e);
|
|
916
|
+
let t = e - l;
|
|
917
|
+
o((e) => r(Math.max(0, Math.min(1, (t - e * i) / n)))), t < c ? u = requestAnimationFrame(frame) : (u = null, a?.removeEventListener("abort", cancel), s?.());
|
|
918
|
+
};
|
|
919
|
+
return a?.addEventListener("abort", cancel, { once: !0 }), u = requestAnimationFrame(frame), cancel;
|
|
920
|
+
}
|
|
921
|
+
function animate(e, t, n, r) {
|
|
922
|
+
let i = resolveMotion(t);
|
|
923
|
+
return startTween({
|
|
924
|
+
count: e.length,
|
|
925
|
+
duration: i.duration,
|
|
926
|
+
easing: resolveEasing(i.easing),
|
|
927
|
+
onComplete: n,
|
|
928
|
+
onFrame: (t) => {
|
|
929
|
+
for (let [n, r] of e.entries()) {
|
|
930
|
+
let e = t(n);
|
|
931
|
+
for (let [t, { from: n, to: i }] of Object.entries(r.attrs)) r.el.setAttribute(t, String(tweenNumber(n, i, e)));
|
|
932
|
+
}
|
|
933
|
+
},
|
|
934
|
+
signal: r,
|
|
935
|
+
stagger: i.stagger
|
|
936
|
+
});
|
|
937
|
+
}
|
|
938
|
+
//#endregion
|
|
939
|
+
//#region src/core/datum-style.ts
|
|
940
|
+
function hasStyledRuns(e) {
|
|
941
|
+
return e?.some((e) => e && (e.dash !== void 0 || e.opacity !== void 0)) ?? !1;
|
|
942
|
+
}
|
|
943
|
+
function computeStyleRuns(e, t) {
|
|
944
|
+
let n = Math.max(0, t - 1);
|
|
945
|
+
if (n === 0) return [];
|
|
946
|
+
let r = [];
|
|
947
|
+
for (let t = 0; t < n; t++) {
|
|
948
|
+
let n = e[t] ?? {}, i = r[r.length - 1];
|
|
949
|
+
i && i.dash === n.dash && i.opacity === n.opacity ? i.end = t + 1 : r.push({
|
|
950
|
+
dash: n.dash,
|
|
951
|
+
end: t + 1,
|
|
952
|
+
opacity: n.opacity,
|
|
953
|
+
start: t
|
|
954
|
+
});
|
|
955
|
+
}
|
|
956
|
+
return r;
|
|
957
|
+
}
|
|
958
|
+
//#endregion
|
|
959
|
+
//#region src/core/ids.ts
|
|
960
|
+
var C = 0;
|
|
961
|
+
function uniqueId(e) {
|
|
962
|
+
return C += 1, `${e}-${C}`;
|
|
963
|
+
}
|
|
964
|
+
//#endregion
|
|
965
|
+
//#region src/svg/path.ts
|
|
966
|
+
function linePath(e) {
|
|
967
|
+
if (e.length === 0) return "";
|
|
968
|
+
let t = `M${e[0].x},${e[0].y}`;
|
|
969
|
+
for (let n = 1; n < e.length; n++) t += `L${e[n].x},${e[n].y}`;
|
|
970
|
+
return t;
|
|
971
|
+
}
|
|
972
|
+
function monotonePath(e) {
|
|
973
|
+
if (e.length < 3) return linePath(e);
|
|
974
|
+
let t = e.length, n = [];
|
|
975
|
+
for (let r = 0; r < t; r++) r === 0 ? n.push({
|
|
976
|
+
x: e[1].x - e[0].x,
|
|
977
|
+
y: e[1].y - e[0].y
|
|
978
|
+
}) : r === t - 1 ? n.push({
|
|
979
|
+
x: e[t - 1].x - e[t - 2].x,
|
|
980
|
+
y: e[t - 1].y - e[t - 2].y
|
|
981
|
+
}) : n.push({
|
|
982
|
+
x: (e[r + 1].x - e[r - 1].x) / 2,
|
|
983
|
+
y: (e[r + 1].y - e[r - 1].y) / 2
|
|
984
|
+
});
|
|
985
|
+
let r = `M${e[0].x},${e[0].y}`;
|
|
986
|
+
for (let i = 0; i < t - 1; i++) {
|
|
987
|
+
let t = e[i], a = e[i + 1], o = n[i], s = n[i + 1], c = (a.x - t.x) / 3;
|
|
988
|
+
r += `C${t.x + c},${t.y + o.y / 3},${a.x - c},${a.y - s.y / 3},${a.x},${a.y}`;
|
|
989
|
+
}
|
|
990
|
+
return r;
|
|
991
|
+
}
|
|
992
|
+
function stepPath(e) {
|
|
993
|
+
if (e.length === 0) return "";
|
|
994
|
+
let t = `M${e[0].x},${e[0].y}`;
|
|
995
|
+
for (let n = 1; n < e.length; n++) {
|
|
996
|
+
let r = (e[n - 1].x + e[n].x) / 2;
|
|
997
|
+
t += `H${r}V${e[n].y}H${e[n].x}`;
|
|
998
|
+
}
|
|
999
|
+
return t;
|
|
1000
|
+
}
|
|
1001
|
+
function areaPath(e, t, n = "linear") {
|
|
1002
|
+
if (e.length === 0) return "";
|
|
1003
|
+
let r = n === "monotone" ? monotonePath(e) : n === "step" ? stepPath(e) : linePath(e), i = [...t].reverse();
|
|
1004
|
+
if (i.length > 0) {
|
|
1005
|
+
r += `L${i[0].x},${i[0].y}`;
|
|
1006
|
+
for (let e = 1; e < i.length; e++) r += `L${i[e].x},${i[e].y}`;
|
|
1007
|
+
}
|
|
1008
|
+
return r += "Z", r;
|
|
1009
|
+
}
|
|
1010
|
+
//#endregion
|
|
1011
|
+
//#region src/charts/area/area-renderer.ts
|
|
1012
|
+
var w = /* @__PURE__ */ new WeakMap(), T = /* @__PURE__ */ new WeakMap();
|
|
1013
|
+
function buildLinePath(e, t) {
|
|
1014
|
+
return t === "monotone" ? monotonePath(e) : t === "step" ? stepPath(e) : linePath(e);
|
|
1015
|
+
}
|
|
1016
|
+
function applyAreaFill(e, t, n) {
|
|
1017
|
+
let r = e.querySelector("linearGradient");
|
|
1018
|
+
if (n.fill === "gradient") {
|
|
1019
|
+
if (!r) {
|
|
1020
|
+
let t = createSvgElement("defs");
|
|
1021
|
+
r = createSvgElement("linearGradient", {
|
|
1022
|
+
id: uniqueId("prism-area-fill"),
|
|
1023
|
+
x1: 0,
|
|
1024
|
+
x2: 0,
|
|
1025
|
+
y1: 0,
|
|
1026
|
+
y2: 1
|
|
1027
|
+
}), r.append(createSvgElement("stop", {
|
|
1028
|
+
class: "prism-area-stop-top",
|
|
1029
|
+
offset: 0
|
|
1030
|
+
}), createSvgElement("stop", {
|
|
1031
|
+
class: "prism-area-stop-bottom",
|
|
1032
|
+
offset: 1
|
|
1033
|
+
})), t.appendChild(r), e.insertBefore(t, e.firstChild);
|
|
1034
|
+
}
|
|
1035
|
+
for (let e of r.querySelectorAll("stop")) e.setAttribute("stop-color", n.color), e.style.stopColor = n.color;
|
|
1036
|
+
setAttributes(t, { fill: `url(#${r.id})` });
|
|
1037
|
+
} else r?.parentElement?.remove(), setAttributes(t, { fill: n.color });
|
|
1038
|
+
setAttributes(t, {
|
|
1039
|
+
class: `prism-area-fill prism-area-fill--${n.fill}`,
|
|
1040
|
+
stroke: "none"
|
|
1041
|
+
}), t.style.fillOpacity = n.fillOpacity === void 0 ? "" : String(n.fillOpacity);
|
|
1042
|
+
}
|
|
1043
|
+
function renderArea(e, t, n, r) {
|
|
1044
|
+
let i = resolveMotion(r.transition), a = i.duration, o = resolveEasing(i.easing), s = e.querySelector(".prism-area-fill");
|
|
1045
|
+
s || (s = createSvgElement("path", { class: "prism-area-fill" }), e.appendChild(s)), applyAreaFill(e, s, r);
|
|
1046
|
+
let c = null, l = [], u = [], d = hasStyledRuns(r.marks), f = r.marks ?? [];
|
|
1047
|
+
if (r.showLine) {
|
|
1048
|
+
if (d) {
|
|
1049
|
+
l = computeStyleRuns(f, t.length);
|
|
1050
|
+
let n = [...e.querySelectorAll(".prism-area-line")];
|
|
1051
|
+
for (let e of n.slice(l.length)) e.remove();
|
|
1052
|
+
u = l.map((t, r) => {
|
|
1053
|
+
let i = n[r];
|
|
1054
|
+
if (i) return i;
|
|
1055
|
+
let a = createSvgElement("path", {
|
|
1056
|
+
class: "prism-area-line",
|
|
1057
|
+
fill: "none"
|
|
1058
|
+
});
|
|
1059
|
+
return e.appendChild(a), a;
|
|
1060
|
+
});
|
|
1061
|
+
for (let [e, t] of l.entries()) setAttributes(u[e], {
|
|
1062
|
+
opacity: t.opacity,
|
|
1063
|
+
stroke: r.color,
|
|
1064
|
+
"stroke-dasharray": t.dash,
|
|
1065
|
+
"stroke-width": 2
|
|
1066
|
+
});
|
|
1067
|
+
c = null;
|
|
1068
|
+
} else {
|
|
1069
|
+
let t = [...e.querySelectorAll(".prism-area-line")];
|
|
1070
|
+
for (let e of t.slice(1)) e.remove();
|
|
1071
|
+
c = t[0] ?? null, c || (c = createSvgElement("path", {
|
|
1072
|
+
class: "prism-area-line",
|
|
1073
|
+
fill: "none"
|
|
1074
|
+
}), e.appendChild(c)), setAttributes(c, {
|
|
1075
|
+
opacity: void 0,
|
|
1076
|
+
stroke: r.color,
|
|
1077
|
+
"stroke-dasharray": void 0,
|
|
1078
|
+
"stroke-width": 2
|
|
1079
|
+
});
|
|
1080
|
+
}
|
|
1081
|
+
} else for (let t of e.querySelectorAll(".prism-area-line")) t.remove();
|
|
1082
|
+
let drawLine = (e) => {
|
|
1083
|
+
if (r.showLine) {
|
|
1084
|
+
if (d) for (let [t, n] of l.entries()) setAttributes(u[t], { d: buildLinePath(e.slice(n.start, n.end + 1), r.curve) });
|
|
1085
|
+
else c && setAttributes(c, { d: buildLinePath(e, r.curve) });
|
|
1086
|
+
}
|
|
1087
|
+
};
|
|
1088
|
+
if (a === 0) {
|
|
1089
|
+
let i = t.map((e) => ({
|
|
1090
|
+
x: e.x,
|
|
1091
|
+
y: n
|
|
1092
|
+
}));
|
|
1093
|
+
setAttributes(s, { d: areaPath(t, i, r.curve) }), drawLine(t), T.set(e, t);
|
|
1094
|
+
return;
|
|
1095
|
+
}
|
|
1096
|
+
w.get(e)?.();
|
|
1097
|
+
let p = T.has(e) ? T.get(e) ?? t : t.map((e) => ({
|
|
1098
|
+
x: e.x,
|
|
1099
|
+
y: n
|
|
1100
|
+
})), m = t.map((e, n) => p[n] ?? p[p.length - 1] ?? t[n]), paintFrame = (i) => {
|
|
1101
|
+
let a = t.map((e, t) => ({
|
|
1102
|
+
x: tweenNumber(m[t].x, e.x, i),
|
|
1103
|
+
y: tweenNumber(m[t].y, e.y, i)
|
|
1104
|
+
})), o = a.map((e) => ({
|
|
1105
|
+
x: e.x,
|
|
1106
|
+
y: n
|
|
1107
|
+
}));
|
|
1108
|
+
T.set(e, a), setAttributes(s, { d: areaPath(a, o, r.curve) }), drawLine(a);
|
|
1109
|
+
};
|
|
1110
|
+
paintFrame(0), w.set(e, startTween({
|
|
1111
|
+
count: 1,
|
|
1112
|
+
duration: a,
|
|
1113
|
+
easing: o,
|
|
1114
|
+
onComplete: () => {
|
|
1115
|
+
w.delete(e), T.set(e, t);
|
|
1116
|
+
},
|
|
1117
|
+
onFrame: (e) => paintFrame(e(0)),
|
|
1118
|
+
signal: r.disposalSignal
|
|
1119
|
+
}));
|
|
1120
|
+
}
|
|
1121
|
+
function computeAreaPoints(e, t, n) {
|
|
1122
|
+
return e.some((e) => e.key == null) || e.some((e) => typeof e.key == "string"), e.map((e) => ({
|
|
1123
|
+
x: t.map(e.key),
|
|
1124
|
+
y: n.map(e.value)
|
|
1125
|
+
}));
|
|
1126
|
+
}
|
|
1127
|
+
//#endregion
|
|
1128
|
+
//#region src/charts/area/area-chart.ts
|
|
1129
|
+
function createAreaChart(e, t) {
|
|
1130
|
+
let n = null, r = null, i = t.series;
|
|
1131
|
+
return createChartScaffold(e, t, (e) => {
|
|
1132
|
+
let { groups: a, legend: o, tooltip: s } = e;
|
|
1133
|
+
o?.update(i.map((e, t) => ({
|
|
1134
|
+
color: seriesColor(t, e.color),
|
|
1135
|
+
name: e.name
|
|
1136
|
+
})));
|
|
1137
|
+
let c = e.dimensions, l = chartArea(c.width, c.height, c.margin), u = i.map((e) => e.data), d = u.flat().map((e) => e.key), f = u.flat().map((e) => e.value);
|
|
1138
|
+
if (d.length === 0) {
|
|
1139
|
+
clearCartesianDom(a, o, s, n), r?.replaceChildren();
|
|
1140
|
+
return;
|
|
1141
|
+
}
|
|
1142
|
+
t.crosshair && !n && (n = createCrosshair(e.chartArea, t.crosshair));
|
|
1143
|
+
let p = buildXScale(d, l.width), m = buildYScale(f, l.height), h = m.map(0), g = t.xAxis === !1 ? !1 : t.xAxis ?? {}, _ = t.yAxis !== !1 && {
|
|
1144
|
+
grid: !0,
|
|
1145
|
+
...t.yAxis
|
|
1146
|
+
};
|
|
1147
|
+
for (_ && _.grid && renderGrid(a.grid, m, _.grid, l.width, "horizontal", resolveTicks(m, _, resolveTickCount(_, l.height, "left"))), g && g.grid && renderGrid(a.grid, p, g.grid, l.height, "vertical", resolveTicks(p, g, resolveTickCount(g, l.width, "bottom"))), g ? (positionAxis(a.xAxis, g.position ?? "bottom", l.width, l.height), renderAxis(a.xAxis, p, g, l.width, "bottom")) : a.xAxis.replaceChildren(), _ ? (positionAxis(a.yAxis, _.position ?? "left", l.width, l.height), renderAxis(a.yAxis, m, _, l.height, "left")) : a.yAxis.replaceChildren(); a.series.children.length > i.length;) a.series.removeChild(a.series.lastChild);
|
|
1148
|
+
let v = [];
|
|
1149
|
+
for (let n = 0; n < i.length; n++) {
|
|
1150
|
+
let r = i[n], o = a.series.children[n];
|
|
1151
|
+
o || (o = createSvgElement("g", { class: "prism-area-series" }), a.series.appendChild(o)), o.setAttribute("data-series-id", seriesDomId(r, n));
|
|
1152
|
+
let s = computeAreaPoints(u[n], p, m);
|
|
1153
|
+
v.push(s), renderArea(o, s, h, {
|
|
1154
|
+
color: seriesColor(n, r.color),
|
|
1155
|
+
curve: r.curve ?? "linear",
|
|
1156
|
+
disposalSignal: e.disposalSignal,
|
|
1157
|
+
fill: r.fill ?? "gradient",
|
|
1158
|
+
fillOpacity: r.fillOpacity,
|
|
1159
|
+
marks: r.data,
|
|
1160
|
+
showLine: r.showLine !== !1,
|
|
1161
|
+
transition: t.transition
|
|
1162
|
+
});
|
|
1163
|
+
}
|
|
1164
|
+
return s?.hide(), r = ensureMarkerGroup(e.chartArea, r), createSeriesInteraction({
|
|
1165
|
+
announcer: e.announcer,
|
|
1166
|
+
colors: () => i.map((e, t) => seriesColor(t, e.color)),
|
|
1167
|
+
crosshair: n,
|
|
1168
|
+
dims: () => e.dimensions,
|
|
1169
|
+
getData: () => u,
|
|
1170
|
+
getPoints: () => v,
|
|
1171
|
+
getSeriesList: () => i,
|
|
1172
|
+
margin: e.dimensions.margin,
|
|
1173
|
+
markers: r,
|
|
1174
|
+
onClick: t.onClick,
|
|
1175
|
+
onHover: t.onHover,
|
|
1176
|
+
seriesGroup: a.series,
|
|
1177
|
+
svg: e.svg,
|
|
1178
|
+
tooltip: s,
|
|
1179
|
+
tooltipFormat: typeof t.tooltip == "object" ? t.tooltip : void 0
|
|
1180
|
+
});
|
|
1181
|
+
}, (e) => {
|
|
1182
|
+
i = e;
|
|
1183
|
+
});
|
|
1184
|
+
}
|
|
1185
|
+
//#endregion
|
|
1186
|
+
//#region src/scales/band.ts
|
|
1187
|
+
function bandScale(e) {
|
|
1188
|
+
let getDomain = () => e.domain, getRange = () => e.range, getBandwidth = () => {
|
|
1189
|
+
let t = getDomain().length;
|
|
1190
|
+
if (t === 0) return 0;
|
|
1191
|
+
let [n, r] = getRange(), i = e.padding ?? .1;
|
|
1192
|
+
return (r - n) / (t + (t - 1) * i + (e.paddingOuter ?? i) * 2);
|
|
1193
|
+
};
|
|
1194
|
+
return {
|
|
1195
|
+
bandwidth: getBandwidth,
|
|
1196
|
+
get domain() {
|
|
1197
|
+
return getDomain();
|
|
1198
|
+
},
|
|
1199
|
+
gap() {
|
|
1200
|
+
let t = e.padding ?? .1;
|
|
1201
|
+
return getBandwidth() * t;
|
|
1202
|
+
},
|
|
1203
|
+
map(t) {
|
|
1204
|
+
let n = getDomain().indexOf(t);
|
|
1205
|
+
if (n === -1) return `${t}`, 0;
|
|
1206
|
+
let [r] = getRange(), i = getBandwidth(), a = e.padding ?? .1;
|
|
1207
|
+
return r + (e.paddingOuter ?? a) * i + n * (i + i * a);
|
|
1208
|
+
},
|
|
1209
|
+
get range() {
|
|
1210
|
+
return getRange();
|
|
1211
|
+
},
|
|
1212
|
+
ticks(e) {
|
|
1213
|
+
let t = getDomain();
|
|
1214
|
+
if (e === void 0 || e >= t.length) return [...t];
|
|
1215
|
+
if (e <= 0) return [];
|
|
1216
|
+
let n = Math.ceil(t.length / e);
|
|
1217
|
+
return t.filter((e, t) => t % n === 0);
|
|
1218
|
+
}
|
|
1219
|
+
};
|
|
1220
|
+
}
|
|
1221
|
+
//#endregion
|
|
1222
|
+
//#region src/charts/bar/bar-hit-test.ts
|
|
1223
|
+
function findCatIdx(e, t, n) {
|
|
1224
|
+
for (let r = 0; r < t.length; r++) {
|
|
1225
|
+
let i = n.bandCenter(t[r]) - n.bandwidth / 2;
|
|
1226
|
+
if (e >= i && e < i + n.bandwidth) return r;
|
|
1227
|
+
}
|
|
1228
|
+
return -1;
|
|
1229
|
+
}
|
|
1230
|
+
function findSeriesIdx(e, t, n, r, i) {
|
|
1231
|
+
if (r.stacked) {
|
|
1232
|
+
if (r.horizontal) {
|
|
1233
|
+
for (let n = 0; n < i; n++) if (r.valueScale.map(r.stackedTops[n]?.[t] ?? 0) >= e.x) return n;
|
|
1234
|
+
return i - 1;
|
|
1235
|
+
}
|
|
1236
|
+
for (let n = 0; n < i; n++) if (r.valueScale.map(r.stackedTops[n]?.[t] ?? 0) <= e.y) return n;
|
|
1237
|
+
return i - 1;
|
|
1238
|
+
}
|
|
1239
|
+
{
|
|
1240
|
+
let a = r.bandwidth / i, o = r.bandCenter(n[t]) - r.bandwidth / 2, s = r.horizontal ? e.y - o : e.x - o, c = Math.floor(s / a);
|
|
1241
|
+
return Math.max(0, Math.min(i - 1, c));
|
|
1242
|
+
}
|
|
1243
|
+
}
|
|
1244
|
+
//#endregion
|
|
1245
|
+
//#region src/animation/reveal.ts
|
|
1246
|
+
var E = /* @__PURE__ */ new WeakMap();
|
|
1247
|
+
function cancelReveal(e) {
|
|
1248
|
+
E.get(e)?.();
|
|
1249
|
+
}
|
|
1250
|
+
function playTraceReveal(e, t, n, r, i, a) {
|
|
1251
|
+
if (cancelReveal(e), i.duration <= 0 || a?.aborted) return () => {};
|
|
1252
|
+
let o = uniqueId("prism-trace"), s = createSvgElement("defs"), c = r / 2, l = createSvgElement("mask", {
|
|
1253
|
+
height: t.height + r,
|
|
1254
|
+
id: o,
|
|
1255
|
+
maskContentUnits: "userSpaceOnUse",
|
|
1256
|
+
maskUnits: "userSpaceOnUse",
|
|
1257
|
+
width: t.width + r,
|
|
1258
|
+
x: -c,
|
|
1259
|
+
y: -c
|
|
1260
|
+
}), u = n.map(({ d: e }) => {
|
|
1261
|
+
let t = createSvgElement("path", {
|
|
1262
|
+
d: e,
|
|
1263
|
+
fill: "none",
|
|
1264
|
+
pathLength: 1,
|
|
1265
|
+
stroke: "white",
|
|
1266
|
+
"stroke-dasharray": "1 1",
|
|
1267
|
+
"stroke-dashoffset": 1,
|
|
1268
|
+
"stroke-width": r
|
|
1269
|
+
});
|
|
1270
|
+
return l.appendChild(t), t;
|
|
1271
|
+
});
|
|
1272
|
+
s.appendChild(l), e.insertBefore(s, e.firstChild), e.setAttribute("mask", `url(#${o})`);
|
|
1273
|
+
let cancelTween = () => {}, finish = () => {
|
|
1274
|
+
E.delete(e), e.removeAttribute("mask"), s.remove(), a?.removeEventListener("abort", finish), cancelTween();
|
|
1275
|
+
};
|
|
1276
|
+
return E.set(e, finish), a?.addEventListener("abort", finish, { once: !0 }), cancelTween = startTween({
|
|
1277
|
+
count: 1,
|
|
1278
|
+
duration: i.duration,
|
|
1279
|
+
easing: resolveEasing(i.easing),
|
|
1280
|
+
onComplete: finish,
|
|
1281
|
+
onFrame: (e) => {
|
|
1282
|
+
let t = e(0);
|
|
1283
|
+
for (let [e, r] of u.entries()) {
|
|
1284
|
+
let { start: i, end: a } = n[e], o = Math.max(0, Math.min(1, (t - i) / (a - i)));
|
|
1285
|
+
r.setAttribute("stroke-dashoffset", String(1 - o));
|
|
1286
|
+
}
|
|
1287
|
+
},
|
|
1288
|
+
signal: a
|
|
1289
|
+
}), finish;
|
|
1290
|
+
}
|
|
1291
|
+
function playGrowReveal(e, t, n, r, i) {
|
|
1292
|
+
if (cancelReveal(e), n(), r.duration <= 0 || t.length === 0 || i.signal?.aborted) return () => {};
|
|
1293
|
+
let a = uniqueId("prism-reveal"), o = createSvgElement("defs"), s = createSvgElement("clipPath", { id: a }), c = t.map((e) => {
|
|
1294
|
+
let t = createSvgElement("rect", {
|
|
1295
|
+
height: 0,
|
|
1296
|
+
width: 0,
|
|
1297
|
+
x: e.x,
|
|
1298
|
+
y: e.y
|
|
1299
|
+
});
|
|
1300
|
+
return s.appendChild(t), t;
|
|
1301
|
+
});
|
|
1302
|
+
o.appendChild(s), e.insertBefore(o, e.firstChild), e.setAttribute("clip-path", `url(#${a})`);
|
|
1303
|
+
let cancelTween = () => {}, finish = () => {
|
|
1304
|
+
E.delete(e), e.removeAttribute("clip-path"), o.remove(), i.signal?.removeEventListener("abort", finish), cancelTween();
|
|
1305
|
+
};
|
|
1306
|
+
return E.set(e, finish), i.signal?.addEventListener("abort", finish, { once: !0 }), cancelTween = startTween({
|
|
1307
|
+
count: t.length,
|
|
1308
|
+
duration: r.duration,
|
|
1309
|
+
easing: resolveEasing(r.easing),
|
|
1310
|
+
onComplete: finish,
|
|
1311
|
+
onFrame: (e) => {
|
|
1312
|
+
for (let [n, r] of c.entries()) {
|
|
1313
|
+
let a = t[n], o = Math.max(0, Math.min(1, e(n)));
|
|
1314
|
+
if (i.axis === "y") {
|
|
1315
|
+
let e = a.anchor + (a.y - a.anchor) * o, t = a.anchor + (a.y + a.height - a.anchor) * o;
|
|
1316
|
+
setAttributes(r, {
|
|
1317
|
+
height: Math.max(0, t - e),
|
|
1318
|
+
width: a.width,
|
|
1319
|
+
y: e
|
|
1320
|
+
});
|
|
1321
|
+
} else {
|
|
1322
|
+
let e = a.anchor + (a.x - a.anchor) * o, t = a.anchor + (a.x + a.width - a.anchor) * o;
|
|
1323
|
+
setAttributes(r, {
|
|
1324
|
+
height: a.height,
|
|
1325
|
+
width: Math.max(0, t - e),
|
|
1326
|
+
x: e
|
|
1327
|
+
});
|
|
1328
|
+
}
|
|
1329
|
+
}
|
|
1330
|
+
},
|
|
1331
|
+
signal: i.signal,
|
|
1332
|
+
stagger: i.stagger
|
|
1333
|
+
}), finish;
|
|
1334
|
+
}
|
|
1335
|
+
//#endregion
|
|
1336
|
+
//#region src/charts/bar/bar-renderer.ts
|
|
1337
|
+
var D = 20, O = 400, k = /* @__PURE__ */ new WeakMap();
|
|
1338
|
+
function barsOf(e) {
|
|
1339
|
+
return [...e.children].filter((e) => e.classList.contains("prism-bar"));
|
|
1340
|
+
}
|
|
1341
|
+
function renderBars(e, t, n, r, i, a) {
|
|
1342
|
+
k.get(e)?.(), k.delete(e);
|
|
1343
|
+
let o = barsOf(e);
|
|
1344
|
+
for (let e of o.slice(t.length)) e.remove();
|
|
1345
|
+
let s = n.bandwidth(), c = a.stacked ? s : s / a.seriesCount, l = Math.max(0, c - 1), u = a.stacked ? 0 : c * a.seriesIndex, d = a.horizontal ?? !1, f = o.length === 0, p = [], m = [], h = [], g = resolveMotion(a.transition, { defaultStagger: f ? 0 : D }), _ = g.duration > 0, v = Math.min(g.stagger, O / Math.max(1, t.length));
|
|
1346
|
+
for (let s = 0; s < t.length; s++) {
|
|
1347
|
+
let c = t[s], g = n.map(c.key) + u, v = a.baselineYs ? a.baselineYs[s] : i, y = r.map(c.y), b = o[s], x = !b;
|
|
1348
|
+
if (b || (b = createSvgElement("rect", { class: "prism-bar" }), e.appendChild(b)), b.style.display = c.present ? "" : "none", setAttributes(b, {
|
|
1349
|
+
opacity: c.opacity,
|
|
1350
|
+
stroke: c.dash ? a.color : void 0,
|
|
1351
|
+
"stroke-dasharray": c.dash,
|
|
1352
|
+
"stroke-width": c.dash ? 1 : void 0
|
|
1353
|
+
}), d) {
|
|
1354
|
+
let e = Math.max(0, Math.abs(v - y)), t = Math.min(y, v);
|
|
1355
|
+
setAttributes(b, {
|
|
1356
|
+
fill: a.color,
|
|
1357
|
+
height: l,
|
|
1358
|
+
rx: a.borderRadius,
|
|
1359
|
+
ry: a.borderRadius,
|
|
1360
|
+
y: g
|
|
1361
|
+
}), f ? (setAttributes(b, {
|
|
1362
|
+
width: e,
|
|
1363
|
+
x: t
|
|
1364
|
+
}), _ && h.push({
|
|
1365
|
+
anchor: v,
|
|
1366
|
+
height: l,
|
|
1367
|
+
width: e,
|
|
1368
|
+
x: t,
|
|
1369
|
+
y: g
|
|
1370
|
+
})) : _ ? x ? (setAttributes(b, {
|
|
1371
|
+
width: 0,
|
|
1372
|
+
x: v
|
|
1373
|
+
}), p.push({
|
|
1374
|
+
attrs: {
|
|
1375
|
+
width: {
|
|
1376
|
+
from: 0,
|
|
1377
|
+
to: e
|
|
1378
|
+
},
|
|
1379
|
+
x: {
|
|
1380
|
+
from: v,
|
|
1381
|
+
to: t
|
|
1382
|
+
}
|
|
1383
|
+
},
|
|
1384
|
+
el: b
|
|
1385
|
+
})) : m.push({
|
|
1386
|
+
attrs: {
|
|
1387
|
+
width: {
|
|
1388
|
+
from: Number(b.getAttribute("width") ?? e),
|
|
1389
|
+
to: e
|
|
1390
|
+
},
|
|
1391
|
+
x: {
|
|
1392
|
+
from: Number(b.getAttribute("x") ?? t),
|
|
1393
|
+
to: t
|
|
1394
|
+
}
|
|
1395
|
+
},
|
|
1396
|
+
el: b
|
|
1397
|
+
}) : setAttributes(b, {
|
|
1398
|
+
width: e,
|
|
1399
|
+
x: t
|
|
1400
|
+
});
|
|
1401
|
+
} else {
|
|
1402
|
+
let e = Math.max(0, Math.abs(v - y)), t = Math.min(y, v);
|
|
1403
|
+
setAttributes(b, {
|
|
1404
|
+
fill: a.color,
|
|
1405
|
+
rx: a.borderRadius,
|
|
1406
|
+
ry: a.borderRadius,
|
|
1407
|
+
width: l,
|
|
1408
|
+
x: g
|
|
1409
|
+
}), f ? (setAttributes(b, {
|
|
1410
|
+
height: e,
|
|
1411
|
+
y: t
|
|
1412
|
+
}), _ && h.push({
|
|
1413
|
+
anchor: v,
|
|
1414
|
+
height: e,
|
|
1415
|
+
width: l,
|
|
1416
|
+
x: g,
|
|
1417
|
+
y: t
|
|
1418
|
+
})) : _ ? x ? (setAttributes(b, {
|
|
1419
|
+
height: 0,
|
|
1420
|
+
y: v
|
|
1421
|
+
}), p.push({
|
|
1422
|
+
attrs: {
|
|
1423
|
+
height: {
|
|
1424
|
+
from: 0,
|
|
1425
|
+
to: e
|
|
1426
|
+
},
|
|
1427
|
+
y: {
|
|
1428
|
+
from: v,
|
|
1429
|
+
to: t
|
|
1430
|
+
}
|
|
1431
|
+
},
|
|
1432
|
+
el: b
|
|
1433
|
+
})) : m.push({
|
|
1434
|
+
attrs: {
|
|
1435
|
+
height: {
|
|
1436
|
+
from: Number(b.getAttribute("height") ?? e),
|
|
1437
|
+
to: e
|
|
1438
|
+
},
|
|
1439
|
+
y: {
|
|
1440
|
+
from: Number(b.getAttribute("y") ?? t),
|
|
1441
|
+
to: t
|
|
1442
|
+
}
|
|
1443
|
+
},
|
|
1444
|
+
el: b
|
|
1445
|
+
}) : setAttributes(b, {
|
|
1446
|
+
height: e,
|
|
1447
|
+
y: t
|
|
1448
|
+
});
|
|
1449
|
+
}
|
|
1450
|
+
}
|
|
1451
|
+
if (_) {
|
|
1452
|
+
let t = [];
|
|
1453
|
+
f && h.length > 0 && t.push(playGrowReveal(e, h, () => {}, g, {
|
|
1454
|
+
axis: d ? "x" : "y",
|
|
1455
|
+
signal: a.disposalSignal,
|
|
1456
|
+
stagger: v
|
|
1457
|
+
})), p.length > 0 && t.push(animate(p, {
|
|
1458
|
+
...g,
|
|
1459
|
+
stagger: v
|
|
1460
|
+
}, void 0, a.disposalSignal)), m.length > 0 && t.push(animate(m, {
|
|
1461
|
+
...g,
|
|
1462
|
+
stagger: 0
|
|
1463
|
+
}, void 0, a.disposalSignal)), k.set(e, () => {
|
|
1464
|
+
for (let e of t) e();
|
|
1465
|
+
});
|
|
1466
|
+
}
|
|
1467
|
+
}
|
|
1468
|
+
//#endregion
|
|
1469
|
+
//#region src/charts/bar/bar-chart.ts
|
|
1470
|
+
function variantFlags(e) {
|
|
1471
|
+
return {
|
|
1472
|
+
horizontal: e === "grouped-horizontal" || e === "stacked-horizontal",
|
|
1473
|
+
stacked: e === "stacked" || e === "stacked-horizontal"
|
|
1474
|
+
};
|
|
1475
|
+
}
|
|
1476
|
+
function createBarChart(e, t) {
|
|
1477
|
+
let n = t.series, r = null;
|
|
1478
|
+
return createChartScaffold(e, t, (e, i) => {
|
|
1479
|
+
let { groups: a, legend: o, tooltip: s } = e;
|
|
1480
|
+
o?.update(n.map((e, t) => ({
|
|
1481
|
+
color: seriesColor(t, e.color),
|
|
1482
|
+
name: e.name
|
|
1483
|
+
})));
|
|
1484
|
+
let c = e.dimensions, l = chartArea(c.width, c.height, c.margin), u = n.map((e) => e.data), d = normalizeCartesianSeries(n, u), f = d.domain, p = d.series.map(({ byKey: e }) => f.map((t) => e.get(t))), categoryAxis = (e) => ({
|
|
1485
|
+
...e,
|
|
1486
|
+
tickFormat: (t) => {
|
|
1487
|
+
let n = String(t), r = d.labels.get(n) ?? t;
|
|
1488
|
+
return e.tickFormat ? e.tickFormat(r) : String(r);
|
|
1489
|
+
}
|
|
1490
|
+
});
|
|
1491
|
+
if (f.length === 0) {
|
|
1492
|
+
clearCartesianDom(a, o, s), r?.remove(), r = null;
|
|
1493
|
+
return;
|
|
1494
|
+
}
|
|
1495
|
+
let { horizontal: m, stacked: h } = variantFlags(t.variant ?? "grouped"), g = t.xAxis === !1 ? !1 : m ? {
|
|
1496
|
+
grid: !0,
|
|
1497
|
+
...t.xAxis
|
|
1498
|
+
} : t.xAxis ?? {}, _ = t.yAxis === !1 ? !1 : m ? t.yAxis ?? {} : {
|
|
1499
|
+
grid: !0,
|
|
1500
|
+
...t.yAxis
|
|
1501
|
+
}, v, y;
|
|
1502
|
+
if (h) {
|
|
1503
|
+
p.some((e) => e.some((e) => (e?.value ?? 0) < 0));
|
|
1504
|
+
let e = f.map((e, t) => p.reduce((e, n) => e + Math.max(0, n[t]?.value ?? 0), 0));
|
|
1505
|
+
v = Math.max(...e), y = 0;
|
|
1506
|
+
} else {
|
|
1507
|
+
let e = p.flatMap((e) => e.flatMap((e) => e ? [e.value] : []));
|
|
1508
|
+
v = Math.max(...e), y = Math.min(0, ...e);
|
|
1509
|
+
}
|
|
1510
|
+
let b = bandScale(m ? {
|
|
1511
|
+
domain: f,
|
|
1512
|
+
range: [0, l.height]
|
|
1513
|
+
} : {
|
|
1514
|
+
domain: f,
|
|
1515
|
+
range: [0, l.width]
|
|
1516
|
+
}), x = linearScale(m ? {
|
|
1517
|
+
domain: [y, v],
|
|
1518
|
+
range: [0, l.width]
|
|
1519
|
+
} : {
|
|
1520
|
+
domain: [y, v],
|
|
1521
|
+
range: [l.height, 0]
|
|
1522
|
+
}), S = [], C = Object.create(null);
|
|
1523
|
+
for (let e of f) C[e] = 0;
|
|
1524
|
+
let w = {
|
|
1525
|
+
bandCenter: (e) => b.map(e) + b.bandwidth() / 2,
|
|
1526
|
+
bandwidth: b.bandwidth(),
|
|
1527
|
+
baselinePx: x.map(0),
|
|
1528
|
+
horizontal: m,
|
|
1529
|
+
stacked: h,
|
|
1530
|
+
stackedTops: S,
|
|
1531
|
+
valueScale: x
|
|
1532
|
+
};
|
|
1533
|
+
if (m) {
|
|
1534
|
+
if (g && g.grid && renderGrid(a.grid, x, g.grid, l.height, "vertical", resolveTicks(x, g, resolveTickCount(g, l.width, "bottom"))), _ !== !1) {
|
|
1535
|
+
let e = categoryAxis(_);
|
|
1536
|
+
positionAxis(a.yAxis, e.position ?? "left", l.width, l.height), renderAxis(a.yAxis, b, e, l.height, "left");
|
|
1537
|
+
}
|
|
1538
|
+
g && (positionAxis(a.xAxis, g.position ?? "bottom", l.width, l.height), renderAxis(a.xAxis, x, g, l.width, "bottom"));
|
|
1539
|
+
} else {
|
|
1540
|
+
if (_ && _.grid && renderGrid(a.grid, x, _.grid, l.width, "horizontal", resolveTicks(x, _, resolveTickCount(_, l.height, "left"))), g !== !1) {
|
|
1541
|
+
let e = categoryAxis(g);
|
|
1542
|
+
positionAxis(a.xAxis, e.position ?? "bottom", l.width, l.height), renderAxis(a.xAxis, b, e, l.width, "bottom");
|
|
1543
|
+
}
|
|
1544
|
+
_ && (positionAxis(a.yAxis, _.position ?? "left", l.width, l.height), renderAxis(a.yAxis, x, _, l.height, "left"));
|
|
1545
|
+
}
|
|
1546
|
+
let T = h ? 0 : Number.parseFloat(getComputedStyle(e.svg).getPropertyValue("--prism-bar-radius")) || 0;
|
|
1547
|
+
for (; a.series.children.length > n.length;) {
|
|
1548
|
+
let e = a.series.lastElementChild;
|
|
1549
|
+
e && a.series.removeChild(e);
|
|
1550
|
+
}
|
|
1551
|
+
for (let r = 0; r < n.length; r++) {
|
|
1552
|
+
let o = n[r], s = a.series.children[r];
|
|
1553
|
+
s || (s = createSvgElement("g", { class: "prism-bar-series" }), a.series.appendChild(s)), s.setAttribute("data-series-id", seriesDomId(o, r));
|
|
1554
|
+
let c = f.map((e, t) => {
|
|
1555
|
+
let n = p[r]?.[t];
|
|
1556
|
+
if (h) {
|
|
1557
|
+
let t = C[e] ?? 0, r = t + Math.max(0, n?.value ?? 0);
|
|
1558
|
+
return C[e] = r, {
|
|
1559
|
+
base: t,
|
|
1560
|
+
dash: n?.dash,
|
|
1561
|
+
key: e,
|
|
1562
|
+
opacity: n?.opacity,
|
|
1563
|
+
present: n !== void 0,
|
|
1564
|
+
y: r
|
|
1565
|
+
};
|
|
1566
|
+
}
|
|
1567
|
+
return {
|
|
1568
|
+
base: 0,
|
|
1569
|
+
dash: n?.dash,
|
|
1570
|
+
key: e,
|
|
1571
|
+
opacity: n?.opacity,
|
|
1572
|
+
present: n !== void 0,
|
|
1573
|
+
y: n?.value ?? 0
|
|
1574
|
+
};
|
|
1575
|
+
});
|
|
1576
|
+
S[r] = c.map((e) => e.y);
|
|
1577
|
+
let l = h ? c.map((e) => x.map(e.base)) : void 0;
|
|
1578
|
+
renderBars(s, c, b, x, w.baselinePx, {
|
|
1579
|
+
baselineYs: l,
|
|
1580
|
+
borderRadius: o.borderRadius ?? T,
|
|
1581
|
+
color: seriesColor(r, o.color),
|
|
1582
|
+
disposalSignal: e.disposalSignal,
|
|
1583
|
+
horizontal: m,
|
|
1584
|
+
seriesCount: n.length,
|
|
1585
|
+
seriesIndex: r,
|
|
1586
|
+
stacked: h,
|
|
1587
|
+
transition: i !== "resize" && t.transition
|
|
1588
|
+
});
|
|
1589
|
+
}
|
|
1590
|
+
s?.hide(), a.series.classList.toggle("prism-bars-stacked", h), (!r || !e.chartArea.contains(r)) && (r = createSvgElement("rect", {
|
|
1591
|
+
"aria-hidden": "true",
|
|
1592
|
+
class: "prism-bar-band",
|
|
1593
|
+
"pointer-events": "none"
|
|
1594
|
+
}), e.chartArea.insertBefore(r, a.series)), r.style.display = "none";
|
|
1595
|
+
let E = n.map((e, t) => seriesColor(t, e.color)), labelOf = (e) => String(d.labels.get(f[e]) ?? f[e]), D = typeof t.tooltip == "object" ? t.tooltip : void 0, keyOf = (e) => d.labels.get(f[e]) ?? f[e], titleOf = (e) => D?.titleFormat ? D.titleFormat(keyOf(e)) : labelOf(e), O = D?.valueFormat ?? String, k = -1, valuesAt = (e) => n.map((t, n) => ({
|
|
1596
|
+
datum: p[n]?.[e],
|
|
1597
|
+
series: t
|
|
1598
|
+
})), eventAt = (e, t, r) => {
|
|
1599
|
+
let i = valuesAt(e), a = i[t]?.datum ? t : i.findIndex((e) => e.datum), o = i[a]?.datum;
|
|
1600
|
+
return o ? {
|
|
1601
|
+
datum: o,
|
|
1602
|
+
originalEvent: r,
|
|
1603
|
+
series: n[a],
|
|
1604
|
+
values: i
|
|
1605
|
+
} : null;
|
|
1606
|
+
}, setActive = (t) => {
|
|
1607
|
+
k = t, a.series.classList.toggle("prism-bars-focused", t >= 0);
|
|
1608
|
+
for (let e of a.series.children) for (let [n, r] of [...e.children].entries()) r.classList.toggle("prism-bar--active", n === t);
|
|
1609
|
+
if (!r || (r.style.display = t < 0 ? "none" : "", t < 0)) return;
|
|
1610
|
+
let n = w.bandCenter(f[t]) - b.bandwidth() / 2 - b.gap() / 2, i = b.bandwidth() + b.gap(), o = chartArea(e.dimensions.width, e.dimensions.height, e.dimensions.margin);
|
|
1611
|
+
setAttributes(r, m ? {
|
|
1612
|
+
height: i,
|
|
1613
|
+
width: o.width,
|
|
1614
|
+
x: 0,
|
|
1615
|
+
y: n
|
|
1616
|
+
} : {
|
|
1617
|
+
height: o.height,
|
|
1618
|
+
width: i,
|
|
1619
|
+
x: n,
|
|
1620
|
+
y: 0
|
|
1621
|
+
});
|
|
1622
|
+
}, activate = (n, r, i) => {
|
|
1623
|
+
let a = eventAt(n, r, i);
|
|
1624
|
+
if (!a) return;
|
|
1625
|
+
setActive(n);
|
|
1626
|
+
let o = a.values ?? [], c = describeValues(titleOf(n), o, O);
|
|
1627
|
+
if (s) {
|
|
1628
|
+
let t = o.map((e, t) => h ? S[t]?.[n] ?? 0 : Math.max(0, e.datum?.value ?? 0)), r = x.map(Math.max(...t)), i = w.bandCenter(f[n]), { margin: l } = e.dimensions, u = o.flatMap((e, t) => e.datum ? [{
|
|
1629
|
+
color: E[t],
|
|
1630
|
+
name: e.series.name,
|
|
1631
|
+
value: O(e.datum.value, e.datum, e.series)
|
|
1632
|
+
}] : []);
|
|
1633
|
+
s.show((m ? r : i) + l.left, (m ? i : r) + l.top, a.datum, a.series, comparisonContent(e.svg.ownerDocument, titleOf(n), u, c));
|
|
1634
|
+
} else e.announcer.announce(c);
|
|
1635
|
+
t.onHover?.(a);
|
|
1636
|
+
}, deactivate = () => {
|
|
1637
|
+
setActive(-1), s?.hide(), e.announcer.clear(), t.onHover?.(null);
|
|
1638
|
+
}, hit = (t) => {
|
|
1639
|
+
let r = e.dimensions, i = getMousePosition(e.svg, t, r.margin.left, r.margin.top), a = chartArea(r.width, r.height, r.margin);
|
|
1640
|
+
if (i.x < 0 || i.x > a.width || i.y < 0 || i.y > a.height) return null;
|
|
1641
|
+
let o = findCatIdx(m ? i.y : i.x, f, w);
|
|
1642
|
+
return o === -1 ? null : {
|
|
1643
|
+
catIdx: o,
|
|
1644
|
+
seriesIdx: findSeriesIdx(i, o, f, w, n.length)
|
|
1645
|
+
};
|
|
1646
|
+
}, onMouseMove = (e) => {
|
|
1647
|
+
let t = hit(e);
|
|
1648
|
+
t ? activate(t.catIdx, t.seriesIdx, e) : k >= 0 && deactivate();
|
|
1649
|
+
}, onClick = (e) => {
|
|
1650
|
+
let n = t.onClick && hit(e), r = n && eventAt(n.catIdx, n.seriesIdx, e);
|
|
1651
|
+
r && t.onClick?.(r);
|
|
1652
|
+
}, onKeyDown = (e) => {
|
|
1653
|
+
let n = f.length - 1, r = k < 0 ? n : Math.max(0, k - 1), i = k < 0 ? 0 : Math.min(n, k + 1), a = {
|
|
1654
|
+
ArrowDown: i,
|
|
1655
|
+
ArrowLeft: r,
|
|
1656
|
+
ArrowRight: i,
|
|
1657
|
+
ArrowUp: r,
|
|
1658
|
+
End: n,
|
|
1659
|
+
Home: 0
|
|
1660
|
+
};
|
|
1661
|
+
if (e.key in a) e.preventDefault(), activate(a[e.key], 0, e);
|
|
1662
|
+
else if ((e.key === "Enter" || e.key === " ") && k >= 0 && t.onClick) {
|
|
1663
|
+
e.preventDefault();
|
|
1664
|
+
let n = eventAt(k, 0, e);
|
|
1665
|
+
n && t.onClick(n);
|
|
1666
|
+
} else e.key === "Escape" && deactivate();
|
|
1667
|
+
};
|
|
1668
|
+
return {
|
|
1669
|
+
onClick,
|
|
1670
|
+
onKeyDown,
|
|
1671
|
+
onMouseLeave: deactivate,
|
|
1672
|
+
onMouseMove
|
|
1673
|
+
};
|
|
1674
|
+
}, (e) => {
|
|
1675
|
+
n = e;
|
|
1676
|
+
});
|
|
1677
|
+
}
|
|
1678
|
+
//#endregion
|
|
1679
|
+
//#region src/charts/line/line-renderer.ts
|
|
1680
|
+
var A = /* @__PURE__ */ new WeakMap(), j = /* @__PURE__ */ new WeakMap();
|
|
1681
|
+
function buildPath(e, t) {
|
|
1682
|
+
return t === "monotone" ? monotonePath(e) : t === "step" ? stepPath(e) : linePath(e);
|
|
1683
|
+
}
|
|
1684
|
+
function renderLine(e, t, n) {
|
|
1685
|
+
let r = hasStyledRuns(n.marks), i = n.marks ?? [], a = resolveMotion(n.transition), o = a.duration, s = resolveEasing(a.easing), c = null, l = [], u = [];
|
|
1686
|
+
if (r) {
|
|
1687
|
+
l = computeStyleRuns(i, t.length);
|
|
1688
|
+
let r = [...e.querySelectorAll(".prism-line-path")];
|
|
1689
|
+
for (let e of r.slice(l.length)) e.remove();
|
|
1690
|
+
u = l.map((t, n) => {
|
|
1691
|
+
let i = r[n];
|
|
1692
|
+
if (i) return i;
|
|
1693
|
+
let a = createSvgElement("path", {
|
|
1694
|
+
class: "prism-line-path",
|
|
1695
|
+
fill: "none"
|
|
1696
|
+
});
|
|
1697
|
+
return e.appendChild(a), a;
|
|
1698
|
+
});
|
|
1699
|
+
for (let [e, t] of l.entries()) setAttributes(u[e], {
|
|
1700
|
+
opacity: t.opacity,
|
|
1701
|
+
stroke: n.color,
|
|
1702
|
+
"stroke-dasharray": t.dash,
|
|
1703
|
+
"stroke-width": n.strokeWidth ?? 2
|
|
1704
|
+
}), u[e].style.strokeWidth = n.strokeWidth === void 0 ? "" : String(n.strokeWidth);
|
|
1705
|
+
} else {
|
|
1706
|
+
let t = [...e.querySelectorAll(".prism-line-path")];
|
|
1707
|
+
c = t[0] ?? null;
|
|
1708
|
+
for (let e of t.slice(1)) e.remove();
|
|
1709
|
+
c || (c = createSvgElement("path", {
|
|
1710
|
+
class: "prism-line-path",
|
|
1711
|
+
fill: "none"
|
|
1712
|
+
}), e.appendChild(c)), setAttributes(c, {
|
|
1713
|
+
opacity: void 0,
|
|
1714
|
+
stroke: n.color,
|
|
1715
|
+
"stroke-dasharray": void 0,
|
|
1716
|
+
"stroke-width": n.strokeWidth ?? 2
|
|
1717
|
+
}), c.style.strokeWidth = n.strokeWidth === void 0 ? "" : String(n.strokeWidth);
|
|
1718
|
+
}
|
|
1719
|
+
let draw = (e) => {
|
|
1720
|
+
if (r) for (let [t, r] of l.entries()) setAttributes(u[t], { d: buildPath(e.slice(r.start, r.end + 1), n.curve) });
|
|
1721
|
+
else setAttributes(c, { d: buildPath(e, n.curve) });
|
|
1722
|
+
}, d = e.querySelector(".prism-line-dots");
|
|
1723
|
+
if (n.showPoints ? d || (d = createSvgElement("g", { class: "prism-line-dots" }), e.appendChild(d)) : d &&= (d.remove(), null), o === 0) {
|
|
1724
|
+
if (A.get(e)?.(), cancelReveal(e), draw(t), j.set(e, t), d) {
|
|
1725
|
+
for (; d.children.length > t.length;) d.removeChild(d.lastChild);
|
|
1726
|
+
for (let e = 0; e < t.length; e++) {
|
|
1727
|
+
let r = d.children[e];
|
|
1728
|
+
r || (r = createSvgElement("circle", { class: "prism-line-dot" }), d.appendChild(r)), setAttributes(r, {
|
|
1729
|
+
cx: t[e].x,
|
|
1730
|
+
cy: t[e].y,
|
|
1731
|
+
fill: n.color,
|
|
1732
|
+
opacity: i[e]?.opacity,
|
|
1733
|
+
r: n.pointRadius
|
|
1734
|
+
});
|
|
1735
|
+
}
|
|
1736
|
+
}
|
|
1737
|
+
return;
|
|
1738
|
+
}
|
|
1739
|
+
A.get(e)?.(), cancelReveal(e);
|
|
1740
|
+
let f = !j.has(e);
|
|
1741
|
+
if (d) {
|
|
1742
|
+
for (; d.children.length > t.length;) d.removeChild(d.lastChild);
|
|
1743
|
+
for (let e = d.children.length; e < t.length; e++) {
|
|
1744
|
+
let t = createSvgElement("circle", { class: "prism-line-dot" });
|
|
1745
|
+
setAttributes(t, {
|
|
1746
|
+
fill: n.color,
|
|
1747
|
+
opacity: i[e]?.opacity,
|
|
1748
|
+
r: n.pointRadius
|
|
1749
|
+
}), d.appendChild(t);
|
|
1750
|
+
}
|
|
1751
|
+
for (let e = 0; e < d.children.length; e++) setAttributes(d.children[e], { opacity: i[e]?.opacity });
|
|
1752
|
+
}
|
|
1753
|
+
if (f) {
|
|
1754
|
+
if (draw(t), j.set(e, t), d) for (let [e, n] of t.entries()) {
|
|
1755
|
+
let t = d.children[e];
|
|
1756
|
+
t && setAttributes(t, {
|
|
1757
|
+
cx: n.x,
|
|
1758
|
+
cy: n.y
|
|
1759
|
+
});
|
|
1760
|
+
}
|
|
1761
|
+
if (t.length > 1) {
|
|
1762
|
+
let i = c ?? u[0], a = n.strokeWidth ?? (Number.parseFloat(getComputedStyle(i).strokeWidth) || 2), o = r ? l.map((e, n) => ({
|
|
1763
|
+
d: u[n].getAttribute("d"),
|
|
1764
|
+
end: e.end / (t.length - 1),
|
|
1765
|
+
start: e.start / (t.length - 1)
|
|
1766
|
+
})) : [{
|
|
1767
|
+
d: c.getAttribute("d"),
|
|
1768
|
+
end: 1,
|
|
1769
|
+
start: 0
|
|
1770
|
+
}];
|
|
1771
|
+
playTraceReveal(e, n.bounds, o, Math.max(a, n.showPoints ? n.pointRadius * 2 : 0) + 2, resolveMotion(n.transition, { defaultDuration: 420 }), n.disposalSignal);
|
|
1772
|
+
}
|
|
1773
|
+
return;
|
|
1774
|
+
}
|
|
1775
|
+
let p = [], m = j.get(e) ?? t;
|
|
1776
|
+
for (let [e, n] of t.entries()) p.push(m[e] ?? m.at(-1) ?? n);
|
|
1777
|
+
let paintFrame = (n) => {
|
|
1778
|
+
let r = t.map((e, t) => {
|
|
1779
|
+
let r = p[t] ?? e;
|
|
1780
|
+
return {
|
|
1781
|
+
x: tweenNumber(r.x, e.x, n),
|
|
1782
|
+
y: tweenNumber(r.y, e.y, n)
|
|
1783
|
+
};
|
|
1784
|
+
});
|
|
1785
|
+
if (j.set(e, r), draw(r), d) for (let e = 0; e < t.length; e++) {
|
|
1786
|
+
let t = d.children[e];
|
|
1787
|
+
t && setAttributes(t, {
|
|
1788
|
+
cx: r[e].x,
|
|
1789
|
+
cy: r[e].y
|
|
1790
|
+
});
|
|
1791
|
+
}
|
|
1792
|
+
};
|
|
1793
|
+
paintFrame(0), A.set(e, startTween({
|
|
1794
|
+
count: 1,
|
|
1795
|
+
duration: o,
|
|
1796
|
+
easing: s,
|
|
1797
|
+
onComplete: () => {
|
|
1798
|
+
A.delete(e), j.set(e, t);
|
|
1799
|
+
},
|
|
1800
|
+
onFrame: (e) => paintFrame(e(0)),
|
|
1801
|
+
signal: n.disposalSignal
|
|
1802
|
+
}));
|
|
1803
|
+
}
|
|
1804
|
+
function computePoints(e, t, n) {
|
|
1805
|
+
return e.some((e) => e.key == null) || e.some((e) => typeof e.key == "string"), e.map((e) => ({
|
|
1806
|
+
x: t.map(e.key),
|
|
1807
|
+
y: n.map(e.value)
|
|
1808
|
+
}));
|
|
1809
|
+
}
|
|
1810
|
+
//#endregion
|
|
1811
|
+
//#region src/charts/line/line-chart.ts
|
|
1812
|
+
function createLineChart(e, t) {
|
|
1813
|
+
let n = null, r = null, i = null, a = t.series;
|
|
1814
|
+
return createChartScaffold(e, t, (e, o) => {
|
|
1815
|
+
let { groups: s, legend: c, tooltip: l } = e;
|
|
1816
|
+
c?.update(a.map((e, t) => ({
|
|
1817
|
+
color: seriesColor(t, e.color),
|
|
1818
|
+
name: e.name
|
|
1819
|
+
})));
|
|
1820
|
+
let u = e.dimensions, d = a.some((e) => e.yAxis === "right"), f = a.some((e) => e.yAxis !== "right" && e.data.length > 0), p = {
|
|
1821
|
+
...resolveMargin(t.margin),
|
|
1822
|
+
right: t.margin?.right ?? (d ? t.rightYAxis?.label ? 72 : 50 : resolveMargin(t.margin).right)
|
|
1823
|
+
}, m = chartArea(u.width, u.height, p), h = a.map((e) => e.data), g = h.flat().map((e) => e.key), _ = a.filter((e) => e.yAxis !== "right").flatMap((e) => e.data.map((e) => e.value)), v = a.filter((e) => e.yAxis === "right").flatMap((e) => e.data.map((e) => e.value));
|
|
1824
|
+
if (g.length === 0) {
|
|
1825
|
+
clearCartesianDom(s, c, l, n), r?.replaceChildren(), i?.replaceChildren();
|
|
1826
|
+
return;
|
|
1827
|
+
}
|
|
1828
|
+
t.crosshair && !n && (n = createCrosshair(e.chartArea, t.crosshair));
|
|
1829
|
+
let y = buildXScale(g, m.width), b = buildYScale(_, m.height), x = buildYScale(v, m.height), S = t.xAxis === !1 ? !1 : t.xAxis ?? {}, C = t.yAxis !== !1 && {
|
|
1830
|
+
grid: !0,
|
|
1831
|
+
...t.yAxis
|
|
1832
|
+
};
|
|
1833
|
+
if (C && C.grid && (!d || f) ? renderGrid(s.grid, b, C.grid, m.width, "horizontal", resolveTicks(b, C, resolveTickCount(C, m.height, "left"))) : s.grid.replaceChildren(), S && S.grid && renderGrid(s.grid, y, S.grid, m.height, "vertical", resolveTicks(y, S, resolveTickCount(S, m.width, "bottom"))), S ? (positionAxis(s.xAxis, S.position ?? "bottom", m.width, m.height), renderAxis(s.xAxis, y, S, m.width, "bottom")) : s.xAxis.replaceChildren(), C && (!d || f)) {
|
|
1834
|
+
let e = {
|
|
1835
|
+
...C,
|
|
1836
|
+
position: d ? "left" : C.position ?? "left"
|
|
1837
|
+
};
|
|
1838
|
+
positionAxis(s.yAxis, e.position, m.width, m.height), renderAxis(s.yAxis, b, e, m.height, "left");
|
|
1839
|
+
} else s.yAxis.replaceChildren();
|
|
1840
|
+
if (d) {
|
|
1841
|
+
i || (i = createSvgElement("g", { class: "prism-y-axis-right" }), e.chartArea.appendChild(i));
|
|
1842
|
+
let n = {
|
|
1843
|
+
...t.rightYAxis,
|
|
1844
|
+
position: "right"
|
|
1845
|
+
};
|
|
1846
|
+
positionAxis(i, "right", m.width, m.height), renderAxis(i, x, n, m.height, "right");
|
|
1847
|
+
} else i?.replaceChildren();
|
|
1848
|
+
for (; s.series.children.length > a.length;) s.series.removeChild(s.series.lastChild);
|
|
1849
|
+
let w = [];
|
|
1850
|
+
for (let n = 0; n < a.length; n++) {
|
|
1851
|
+
let r = a[n], i = s.series.children[n];
|
|
1852
|
+
i || (i = createSvgElement("g", { class: "prism-line-series" }), s.series.appendChild(i)), i.setAttribute("data-series-id", seriesDomId(r, n));
|
|
1853
|
+
let c = r.yAxis === "right" ? x : b, l = computePoints(h[n], y, c);
|
|
1854
|
+
w.push(l), renderLine(i, l, {
|
|
1855
|
+
bounds: {
|
|
1856
|
+
height: m.height,
|
|
1857
|
+
width: m.width
|
|
1858
|
+
},
|
|
1859
|
+
color: seriesColor(n, r.color),
|
|
1860
|
+
curve: r.curve ?? "linear",
|
|
1861
|
+
disposalSignal: e.disposalSignal,
|
|
1862
|
+
marks: r.data,
|
|
1863
|
+
pointRadius: r.pointRadius ?? 3,
|
|
1864
|
+
showPoints: r.showPoints ?? !1,
|
|
1865
|
+
strokeWidth: r.strokeWidth,
|
|
1866
|
+
transition: o !== "resize" && t.transition
|
|
1867
|
+
});
|
|
1868
|
+
}
|
|
1869
|
+
return l?.hide(), r = ensureMarkerGroup(e.chartArea, r), createSeriesInteraction({
|
|
1870
|
+
announcer: e.announcer,
|
|
1871
|
+
colors: () => a.map((e, t) => seriesColor(t, e.color)),
|
|
1872
|
+
crosshair: n,
|
|
1873
|
+
dims: () => e.dimensions,
|
|
1874
|
+
getData: () => h,
|
|
1875
|
+
getPoints: () => w,
|
|
1876
|
+
getSeriesList: () => a,
|
|
1877
|
+
margin: p,
|
|
1878
|
+
markers: r,
|
|
1879
|
+
onClick: t.onClick,
|
|
1880
|
+
onHover: t.onHover,
|
|
1881
|
+
seriesGroup: s.series,
|
|
1882
|
+
svg: e.svg,
|
|
1883
|
+
tooltip: l,
|
|
1884
|
+
tooltipFormat: typeof t.tooltip == "object" ? t.tooltip : void 0
|
|
1885
|
+
});
|
|
1886
|
+
}, (e) => {
|
|
1887
|
+
a = e;
|
|
1888
|
+
});
|
|
1889
|
+
}
|
|
1890
|
+
//#endregion
|
|
1891
|
+
//#region src/core/polar.ts
|
|
1892
|
+
function polarX(e, t, n) {
|
|
1893
|
+
return e + t * Math.sin(n);
|
|
1894
|
+
}
|
|
1895
|
+
function polarY(e, t, n) {
|
|
1896
|
+
return e - t * Math.cos(n);
|
|
1897
|
+
}
|
|
1898
|
+
function polarPoint(e, t, n, r) {
|
|
1899
|
+
return `${polarX(e, n, r)},${polarY(t, n, r)}`;
|
|
1900
|
+
}
|
|
1901
|
+
//#endregion
|
|
1902
|
+
//#region src/charts/pie/pie-renderer.ts
|
|
1903
|
+
function computeArcs(e, t, n, r, i, a, o, s, c, l, u = !1) {
|
|
1904
|
+
let d = e.reduce((e, t) => e + Math.max(0, t.value), 0);
|
|
1905
|
+
if (d === 0) return [];
|
|
1906
|
+
let f = o - a, p = r > 0 ? Math.asin(Math.min(1, s / 2 / r)) : 0, m = a, h = e.length;
|
|
1907
|
+
return e.map((e, a) => {
|
|
1908
|
+
let o = Math.max(0, e.value) / d * f, s = m, g = m + o;
|
|
1909
|
+
m += o;
|
|
1910
|
+
let _ = Math.min(p, o / 2);
|
|
1911
|
+
return {
|
|
1912
|
+
capEnd: u && a === h - 1,
|
|
1913
|
+
capStart: u && a === 0,
|
|
1914
|
+
centerX: t,
|
|
1915
|
+
centerY: n,
|
|
1916
|
+
color: e.color ?? l(a),
|
|
1917
|
+
cornerRadius: c,
|
|
1918
|
+
endAngle: g,
|
|
1919
|
+
index: a,
|
|
1920
|
+
innerRadius: i,
|
|
1921
|
+
outerRadius: r,
|
|
1922
|
+
padAngle: _,
|
|
1923
|
+
slice: e,
|
|
1924
|
+
startAngle: s
|
|
1925
|
+
};
|
|
1926
|
+
});
|
|
1927
|
+
}
|
|
1928
|
+
function arcPath(e) {
|
|
1929
|
+
let { capEnd: t, capStart: n, centerX: r, centerY: i, cornerRadius: a, endAngle: o, innerRadius: s, outerRadius: c, padAngle: l, startAngle: u } = e, d = o - u;
|
|
1930
|
+
if (d <= 0) return "";
|
|
1931
|
+
if (d >= 2 * Math.PI - 1e-6) {
|
|
1932
|
+
let e = u + Math.PI;
|
|
1933
|
+
return s <= 0 ? `M${polarPoint(r, i, c, u)}A${c},${c},0,1,1,${polarPoint(r, i, c, e)}A${c},${c},0,1,1,${polarPoint(r, i, c, u)}Z` : [
|
|
1934
|
+
`M${polarPoint(r, i, c, u)}`,
|
|
1935
|
+
`A${c},${c},0,1,1,${polarPoint(r, i, c, e)}`,
|
|
1936
|
+
`A${c},${c},0,1,1,${polarPoint(r, i, c, u)}`,
|
|
1937
|
+
`M${polarPoint(r, i, s, u)}`,
|
|
1938
|
+
`A${s},${s},0,1,0,${polarPoint(r, i, s, e)}`,
|
|
1939
|
+
`A${s},${s},0,1,0,${polarPoint(r, i, s, u)}`,
|
|
1940
|
+
"Z"
|
|
1941
|
+
].join("");
|
|
1942
|
+
}
|
|
1943
|
+
let f = n ? u : u + l, p = t ? o : o - l;
|
|
1944
|
+
if (p <= f) return "";
|
|
1945
|
+
let m = p - f;
|
|
1946
|
+
if (a <= 0) {
|
|
1947
|
+
let e = +(m > Math.PI);
|
|
1948
|
+
return s <= 0 ? `M${r},${i}L${polarPoint(r, i, c, f)}A${c},${c},0,${e},1,${polarPoint(r, i, c, p)}Z` : [
|
|
1949
|
+
`M${polarPoint(r, i, c, f)}`,
|
|
1950
|
+
`A${c},${c},0,${e},1,${polarPoint(r, i, c, p)}`,
|
|
1951
|
+
`L${polarPoint(r, i, s, p)}`,
|
|
1952
|
+
`A${s},${s},0,${e},0,${polarPoint(r, i, s, f)}`,
|
|
1953
|
+
"Z"
|
|
1954
|
+
].join("");
|
|
1955
|
+
}
|
|
1956
|
+
let h = Math.min(a / c, m / 2), g = Math.min(a / s, m / 2), _ = Math.min(a, (c - s) / 2), v = (c - s) / 2, y = f + (n ? 0 : h), b = p - (t ? 0 : h), x = f + (n ? 0 : g), S = p - (t ? 0 : g), C = +(b - y > Math.PI), w = +(S - x > Math.PI), T = polarX(r, c, f), E = polarY(i, c, f), D = polarX(r, c, p), O = polarY(i, c, p), k = polarX(r, s, f), A = polarY(i, s, f), j = polarX(r, s, p), M = polarY(i, s, p), N = _ / (c - s), P = `${T + (k - T) * N},${E + (A - E) * N}`, F = `${D + (j - D) * N},${O + (M - O) * N}`, I = `${k + (T - k) * N},${A + (E - A) * N}`, L = `${j + (D - j) * N},${M + (O - M) * N}`, R = [];
|
|
1957
|
+
return n ? R.push(`M${polarPoint(r, i, c, f)}`) : (R.push(`M${P}`), R.push(`Q${T},${E},${polarPoint(r, i, c, y)}`)), R.push(`A${c},${c},0,${C},1,${polarPoint(r, i, c, b)}`), t ? R.push(`A${v},${v},0,0,1,${polarPoint(r, i, s, p)}`) : (R.push(`Q${D},${O},${F}`), R.push(`L${L}`), R.push(`Q${j},${M},${polarPoint(r, i, s, S)}`)), R.push(`A${s},${s},0,${w},0,${polarPoint(r, i, s, x)}`), n ? R.push(`A${v},${v},0,0,0,${polarPoint(r, i, c, f)}`) : R.push(`Q${k},${A},${I}`), R.push("Z"), R.join("");
|
|
1958
|
+
}
|
|
1959
|
+
function arcCentroid(e) {
|
|
1960
|
+
let t = (e.startAngle + e.endAngle) / 2, n = (e.outerRadius + e.innerRadius) / 2;
|
|
1961
|
+
return {
|
|
1962
|
+
x: e.centerX + n * Math.sin(t),
|
|
1963
|
+
y: e.centerY - n * Math.cos(t)
|
|
1964
|
+
};
|
|
1965
|
+
}
|
|
1966
|
+
//#endregion
|
|
1967
|
+
//#region src/charts/pie/pie-chart.ts
|
|
1968
|
+
var M = 2 * Math.PI, N = 12;
|
|
1969
|
+
function labelFits(e, t) {
|
|
1970
|
+
let n = e.outerRadius - e.innerRadius, r = (e.outerRadius + e.innerRadius) / 2, i = (e.endAngle - e.startAngle - 2 * e.padAngle) * r;
|
|
1971
|
+
return n >= N * 1.4 && i >= estimateTextWidth(t, N) + 8;
|
|
1972
|
+
}
|
|
1973
|
+
var P = -Math.PI / 2, F = Math.PI / 2;
|
|
1974
|
+
function semiAngles(e) {
|
|
1975
|
+
return e === "semi" ? {
|
|
1976
|
+
end: F,
|
|
1977
|
+
start: P
|
|
1978
|
+
} : {
|
|
1979
|
+
end: M,
|
|
1980
|
+
start: 0
|
|
1981
|
+
};
|
|
1982
|
+
}
|
|
1983
|
+
function createPieChart(e, t) {
|
|
1984
|
+
let n = t.variant ?? "pie", r = t.padPixels ?? (n === "pie" ? 0 : 8), i = t.cornerRadius ?? (n === "pie" ? 0 : 8), a = t.data, o = createSvgElement("circle", {
|
|
1985
|
+
class: "prism-pie-bg",
|
|
1986
|
+
"pointer-events": "none"
|
|
1987
|
+
}), s = createSvgElement("g", {
|
|
1988
|
+
class: "prism-pie-slices",
|
|
1989
|
+
"shape-rendering": "geometricPrecision"
|
|
1990
|
+
}), c = createSvgElement("g", {
|
|
1991
|
+
class: "prism-pie-labels",
|
|
1992
|
+
"pointer-events": "none"
|
|
1993
|
+
}), l = [], u = [], d = null;
|
|
1994
|
+
function renderLabels(e) {
|
|
1995
|
+
c.replaceChildren();
|
|
1996
|
+
for (let t = 0; t < l.length; t++) {
|
|
1997
|
+
let n = l[t], r = e[t];
|
|
1998
|
+
if (!r?.label || !labelFits(n, r.label)) continue;
|
|
1999
|
+
let { x: i, y: a } = arcCentroid(n), o = createSvgElement("text", { class: "prism-pie-label" });
|
|
2000
|
+
setAttributes(o, {
|
|
2001
|
+
"dominant-baseline": "middle",
|
|
2002
|
+
fill: "var(--prism-pie-label-color, #fff)",
|
|
2003
|
+
"font-family": "var(--prism-font-family, system-ui)",
|
|
2004
|
+
"font-size": "var(--prism-pie-label-size, 12px)",
|
|
2005
|
+
"text-anchor": "middle",
|
|
2006
|
+
x: i,
|
|
2007
|
+
y: a
|
|
2008
|
+
}), o.textContent = r.label, c.appendChild(o);
|
|
2009
|
+
}
|
|
2010
|
+
}
|
|
2011
|
+
return createRadialScaffold(e, {
|
|
2012
|
+
a11y: t.a11y,
|
|
2013
|
+
legend: t.legend,
|
|
2014
|
+
tooltip: t.tooltip
|
|
2015
|
+
}, (f) => {
|
|
2016
|
+
let { legend: p, svg: m, tooltip: h } = f, g = a.some((e) => e.value > 0);
|
|
2017
|
+
p?.update(g ? a.map((e, t) => ({
|
|
2018
|
+
color: e.color ?? seriesColor(t),
|
|
2019
|
+
name: e.label ?? ""
|
|
2020
|
+
})) : []), m.contains(o) || (m.appendChild(o), m.appendChild(s), m.appendChild(c));
|
|
2021
|
+
let { height: _, width: v } = f.dimensions, y = n === "semi", b = v / 2, x = y ? _ * .85 : _ / 2, S = y ? Math.min(b, x) - 8 : Math.min(v, _) / 2 - 8, C = n === "pie" ? 0 : Math.round(S * .55), w = t.innerRadius === void 0 ? C : t.innerRadius, T = Math.max(w + 1, S), E = a, { end: D, start: O } = semiAngles(n);
|
|
2022
|
+
for (l = computeArcs(E, b, x, T, w, O, D, r, i, (e) => seriesColor(e), !1), setAttributes(o, {
|
|
2023
|
+
cx: b,
|
|
2024
|
+
cy: x,
|
|
2025
|
+
r: w > 0 ? w : 0
|
|
2026
|
+
}), o.setAttribute("style", "fill:var(--prism-bg,#fff)"); s.children.length > l.length;) s.removeChild(s.lastChild);
|
|
2027
|
+
c.replaceChildren();
|
|
2028
|
+
let k = resolveMotion(t.transition), A = k.duration, j = resolveEasing(k.easing);
|
|
2029
|
+
for (let e = 0; e < l.length; e++) {
|
|
2030
|
+
let n = l[e], r = s.children[e];
|
|
2031
|
+
r || (r = createSvgElement("path", { class: "prism-pie-slice" }), s.appendChild(r)), r.setAttribute("fill", n.color), r.setAttribute("stroke", "none"), r.style.cursor = t.onClick || t.onHover ? "pointer" : "";
|
|
2032
|
+
}
|
|
2033
|
+
d?.();
|
|
2034
|
+
let M = u.length === 0, N = u;
|
|
2035
|
+
d = startTween({
|
|
2036
|
+
count: 1,
|
|
2037
|
+
duration: A,
|
|
2038
|
+
easing: j,
|
|
2039
|
+
onComplete: () => renderLabels(E),
|
|
2040
|
+
onFrame: (e) => {
|
|
2041
|
+
let t = e(0);
|
|
2042
|
+
if (M) {
|
|
2043
|
+
let e = tweenNumber(O, D, t);
|
|
2044
|
+
u = l.map((t, n) => {
|
|
2045
|
+
let r = s.children[n];
|
|
2046
|
+
if (!r) return t;
|
|
2047
|
+
if (e <= t.startAngle) return setAttributes(r, { d: "" }), {
|
|
2048
|
+
...t,
|
|
2049
|
+
endAngle: t.startAngle
|
|
2050
|
+
};
|
|
2051
|
+
let i = Math.min(t.endAngle, e);
|
|
2052
|
+
return setAttributes(r, { d: arcPath({
|
|
2053
|
+
...t,
|
|
2054
|
+
endAngle: i
|
|
2055
|
+
}) }), {
|
|
2056
|
+
...t,
|
|
2057
|
+
endAngle: i
|
|
2058
|
+
};
|
|
2059
|
+
});
|
|
2060
|
+
} else u = l.map((e, n) => {
|
|
2061
|
+
let r = s.children[n], i = N.at(-1), a = N[n] ?? {
|
|
2062
|
+
...e,
|
|
2063
|
+
endAngle: i?.endAngle ?? O,
|
|
2064
|
+
startAngle: i?.endAngle ?? O
|
|
2065
|
+
}, o = {
|
|
2066
|
+
...e,
|
|
2067
|
+
endAngle: tweenNumber(a.endAngle, e.endAngle, t),
|
|
2068
|
+
innerRadius: tweenNumber(a.innerRadius, e.innerRadius, t),
|
|
2069
|
+
outerRadius: tweenNumber(a.outerRadius, e.outerRadius, t),
|
|
2070
|
+
padAngle: tweenNumber(a.padAngle, e.padAngle, t),
|
|
2071
|
+
startAngle: tweenNumber(a.startAngle, e.startAngle, t)
|
|
2072
|
+
};
|
|
2073
|
+
return r && setAttributes(r, { d: o.endAngle - o.startAngle <= 1e-6 ? "" : arcPath(o) }), o;
|
|
2074
|
+
});
|
|
2075
|
+
},
|
|
2076
|
+
signal: f.disposalSignal
|
|
2077
|
+
}), h?.hide();
|
|
2078
|
+
let P = l.reduce((e, t) => e + Math.max(0, t.slice.value), 0), F = -1, describe = (e) => {
|
|
2079
|
+
let t = P > 0 ? Math.round(Math.max(0, e.slice.value) / P * 1e3) / 10 : 0;
|
|
2080
|
+
return `${e.slice.label ?? `Slice ${e.index + 1}`}: ${e.slice.value} (${t}%)`;
|
|
2081
|
+
}, setActive = (e) => {
|
|
2082
|
+
F = e, s.classList.toggle("prism-pie-focused", e >= 0);
|
|
2083
|
+
for (let [t, n] of [...s.children].entries()) n.classList.toggle("prism-pie-slice--active", t === e);
|
|
2084
|
+
}, activate = (n, r) => {
|
|
2085
|
+
let i = l[n];
|
|
2086
|
+
if (!i) return;
|
|
2087
|
+
setActive(n), t.onHover?.({
|
|
2088
|
+
index: n,
|
|
2089
|
+
originalEvent: r,
|
|
2090
|
+
slice: i.slice
|
|
2091
|
+
});
|
|
2092
|
+
let a = describe(i);
|
|
2093
|
+
if (!h) {
|
|
2094
|
+
f.announcer.announce(a);
|
|
2095
|
+
return;
|
|
2096
|
+
}
|
|
2097
|
+
let { x: o, y: s } = arcCentroid(i), c = m.getBoundingClientRect(), u = e.getBoundingClientRect();
|
|
2098
|
+
h.show(o + (c.left - u.left), s + (c.top - u.top), {
|
|
2099
|
+
key: n,
|
|
2100
|
+
value: i.slice.value
|
|
2101
|
+
}, {
|
|
2102
|
+
color: i.color,
|
|
2103
|
+
data: [],
|
|
2104
|
+
name: i.slice.label ?? ""
|
|
2105
|
+
}, a);
|
|
2106
|
+
}, deactivate = () => {
|
|
2107
|
+
setActive(-1), h?.hide(), f.announcer.clear(), t.onHover?.(null);
|
|
2108
|
+
}, hitAt = (e) => {
|
|
2109
|
+
let t = m.getBoundingClientRect();
|
|
2110
|
+
return hitTestArc(l, e.clientX - t.left, e.clientY - t.top, n);
|
|
2111
|
+
}, onMouseMove = (e) => {
|
|
2112
|
+
let t = hitAt(e);
|
|
2113
|
+
t >= 0 ? t !== F && activate(t, e) : F >= 0 && deactivate();
|
|
2114
|
+
}, onClick = (e) => {
|
|
2115
|
+
if (!t.onClick) return;
|
|
2116
|
+
let n = hitAt(e);
|
|
2117
|
+
n >= 0 && t.onClick({
|
|
2118
|
+
index: n,
|
|
2119
|
+
originalEvent: e,
|
|
2120
|
+
slice: l[n].slice
|
|
2121
|
+
});
|
|
2122
|
+
}, onKeyDown = (e) => {
|
|
2123
|
+
let n = l.length;
|
|
2124
|
+
if (n === 0) return;
|
|
2125
|
+
let r = {
|
|
2126
|
+
ArrowDown: 1,
|
|
2127
|
+
ArrowLeft: -1,
|
|
2128
|
+
ArrowRight: 1,
|
|
2129
|
+
ArrowUp: -1
|
|
2130
|
+
};
|
|
2131
|
+
e.key in r ? (e.preventDefault(), activate(F < 0 ? r[e.key] > 0 ? 0 : n - 1 : (F + r[e.key] + n) % n, e)) : e.key === "Home" || e.key === "End" ? (e.preventDefault(), activate(e.key === "Home" ? 0 : n - 1, e)) : (e.key === "Enter" || e.key === " ") && F >= 0 && t.onClick ? (e.preventDefault(), t.onClick({
|
|
2132
|
+
index: F,
|
|
2133
|
+
originalEvent: e,
|
|
2134
|
+
slice: l[F].slice
|
|
2135
|
+
})) : e.key === "Escape" && deactivate();
|
|
2136
|
+
};
|
|
2137
|
+
return {
|
|
2138
|
+
onClick,
|
|
2139
|
+
onKeyDown,
|
|
2140
|
+
onMouseLeave: deactivate,
|
|
2141
|
+
onMouseMove
|
|
2142
|
+
};
|
|
2143
|
+
}, (e) => {
|
|
2144
|
+
a = e;
|
|
2145
|
+
});
|
|
2146
|
+
}
|
|
2147
|
+
function hitTestArc(e, t, n, r) {
|
|
2148
|
+
for (let i = 0; i < e.length; i++) {
|
|
2149
|
+
let a = e[i], o = t - a.centerX, s = n - a.centerY, c = Math.sqrt(o * o + s * s);
|
|
2150
|
+
if (c < a.outerRadius && c >= a.innerRadius) {
|
|
2151
|
+
let e = Math.atan2(o, -s);
|
|
2152
|
+
if (r === "semi") {
|
|
2153
|
+
if (e >= a.startAngle - 1e-9 && e <= a.endAngle + 1e-9) return i;
|
|
2154
|
+
} else {
|
|
2155
|
+
let t = e < 0 ? e + M : e;
|
|
2156
|
+
if (t >= a.startAngle - 1e-9 && t <= a.endAngle + 1e-9) return i;
|
|
2157
|
+
}
|
|
2158
|
+
}
|
|
2159
|
+
}
|
|
2160
|
+
return -1;
|
|
2161
|
+
}
|
|
2162
|
+
//#endregion
|
|
2163
|
+
//#region src/charts/radar/radar-geometry.ts
|
|
2164
|
+
var I = 2 * Math.PI;
|
|
2165
|
+
function toRadians(e) {
|
|
2166
|
+
return e * Math.PI / 180;
|
|
2167
|
+
}
|
|
2168
|
+
function axisAngles(e, t = 0) {
|
|
2169
|
+
return Array.from({ length: e }, (n, r) => t + r * I / e);
|
|
2170
|
+
}
|
|
2171
|
+
function resolveAxisDomains(e, t, n) {
|
|
2172
|
+
let r = n;
|
|
2173
|
+
if (!r) {
|
|
2174
|
+
let e = t.flatMap((e) => e.data.map((e) => e.value)).filter(Number.isFinite), n = Math.min(0, ...e), i = e.length ? Math.max(...e) : 1;
|
|
2175
|
+
r = linearScale({
|
|
2176
|
+
domain: [n, i > n ? i : n + 1],
|
|
2177
|
+
range: [0, 1]
|
|
2178
|
+
}).domain;
|
|
2179
|
+
}
|
|
2180
|
+
return e.map((e) => [e.min ?? r[0], e.max ?? r[1]]);
|
|
2181
|
+
}
|
|
2182
|
+
function normalize(e, [t, n]) {
|
|
2183
|
+
return n === t ? 0 : Math.max(0, Math.min(1, (e - t) / (n - t)));
|
|
2184
|
+
}
|
|
2185
|
+
function radarPoints(e, t, n, r, i) {
|
|
2186
|
+
return e.map((e, a) => ({
|
|
2187
|
+
x: polarX(t, r * e, i[a]),
|
|
2188
|
+
y: polarY(n, r * e, i[a])
|
|
2189
|
+
}));
|
|
2190
|
+
}
|
|
2191
|
+
function closedPath(e, t = "linear") {
|
|
2192
|
+
let n = e.length;
|
|
2193
|
+
if (n === 0) return "";
|
|
2194
|
+
let [r] = e;
|
|
2195
|
+
if (t === "linear" || n < 3) return `M${r.x},${r.y}${e.slice(1).map((e) => `L${e.x},${e.y}`).join("")}Z`;
|
|
2196
|
+
let i = `M${r.x},${r.y}`;
|
|
2197
|
+
for (let t = 0; t < n; t++) {
|
|
2198
|
+
let r = e[(t - 1 + n) % n], a = e[t], o = e[(t + 1) % n], s = e[(t + 2) % n];
|
|
2199
|
+
i += `C${a.x + (o.x - r.x) / 6},${a.y + (o.y - r.y) / 6} ${o.x - (s.x - a.x) / 6},${o.y - (s.y - a.y) / 6} ${o.x},${o.y}`;
|
|
2200
|
+
}
|
|
2201
|
+
return `${i}Z`;
|
|
2202
|
+
}
|
|
2203
|
+
function ringPath(e, t, n, r, i) {
|
|
2204
|
+
return r <= 0 ? "" : e === "circle" ? `M${t},${n - r}A${r},${r} 0 1 1 ${t},${n + r}A${r},${r} 0 1 1 ${t},${n - r}Z` : closedPath(radarPoints(i.map(() => 1), t, n, r, i));
|
|
2205
|
+
}
|
|
2206
|
+
function labelPlacement(e) {
|
|
2207
|
+
let t = Math.sin(e), n = Math.cos(e);
|
|
2208
|
+
return {
|
|
2209
|
+
anchor: Math.abs(t) < .1 ? "middle" : t > 0 ? "start" : "end",
|
|
2210
|
+
baseline: n > .9 ? "auto" : n < -.9 ? "hanging" : "middle"
|
|
2211
|
+
};
|
|
2212
|
+
}
|
|
2213
|
+
function fitRadius(e, t, n, r, i, a) {
|
|
2214
|
+
let o = 0;
|
|
2215
|
+
n.forEach((e, t) => {
|
|
2216
|
+
labelPlacement(r[t]).anchor !== "middle" && (o = Math.max(o, estimateTextWidth(e, i)));
|
|
2217
|
+
});
|
|
2218
|
+
let s = i * 1.3;
|
|
2219
|
+
return Math.max(8, Math.min(e / 2 - a - o, t / 2 - a - s));
|
|
2220
|
+
}
|
|
2221
|
+
function nearestAxis(e, t, n, r = 0) {
|
|
2222
|
+
if (n === 0) return -1;
|
|
2223
|
+
let i = I / n, a = ((Math.atan2(e, -t) - r) % I + I) % I;
|
|
2224
|
+
return Math.round(a / i) % n;
|
|
2225
|
+
}
|
|
2226
|
+
//#endregion
|
|
2227
|
+
//#region src/charts/radar/radar-chart.ts
|
|
2228
|
+
var L = 11, R = 12, z = 10, B = {
|
|
2229
|
+
ArrowDown: 1,
|
|
2230
|
+
ArrowLeft: -1,
|
|
2231
|
+
ArrowRight: 1,
|
|
2232
|
+
ArrowUp: -1
|
|
2233
|
+
};
|
|
2234
|
+
function resolveGrid(e) {
|
|
2235
|
+
return e === !1 ? null : {
|
|
2236
|
+
bands: !0,
|
|
2237
|
+
labels: !1,
|
|
2238
|
+
levels: 4,
|
|
2239
|
+
shape: "polygon",
|
|
2240
|
+
...typeof e == "object" ? e : {}
|
|
2241
|
+
};
|
|
2242
|
+
}
|
|
2243
|
+
function createRadarChart(e, t) {
|
|
2244
|
+
let { axes: n } = t, r = t.curve ?? "linear", i = t.fill ?? "solid", a = t.showPoints ?? !0, o = resolveGrid(t.grid), s = toRadians(t.startAngle ?? 0), c = axisAngles(n.length, s), l = R + (t.showValues ? z : 0), u = uniqueId("prism-radar"), d = t.series, f = createSvgElement("g", { class: "prism-radar" }), p = createSvgElement("defs"), m = createSvgElement("g", {
|
|
2245
|
+
"aria-hidden": "true",
|
|
2246
|
+
class: "prism-radar-grid"
|
|
2247
|
+
}), h = createSvgElement("g", { class: "prism-radar-series-group" }), g = createSvgElement("g", {
|
|
2248
|
+
"aria-hidden": "true",
|
|
2249
|
+
class: "prism-radar-labels"
|
|
2250
|
+
});
|
|
2251
|
+
f.append(p, m, h, g);
|
|
2252
|
+
let _ = [], v = null, y = -1, b = {
|
|
2253
|
+
cx: 0,
|
|
2254
|
+
cy: 0,
|
|
2255
|
+
radius: 0
|
|
2256
|
+
}, datumAt = (e, t) => e.data.find((e) => e.key === n[t].key), valuesAt = (e) => d.map((t) => ({
|
|
2257
|
+
datum: datumAt(t, e),
|
|
2258
|
+
series: t
|
|
2259
|
+
})), formatValue = (e, t) => n[e].format?.(t) ?? String(t), describe = (e) => describeValues(n[e].label, valuesAt(e), (t) => formatValue(e, t));
|
|
2260
|
+
function draw(e) {
|
|
2261
|
+
let { cx: t, cy: n, radius: i } = b;
|
|
2262
|
+
e.forEach((e, a) => {
|
|
2263
|
+
let o = h.children[a];
|
|
2264
|
+
if (!o) return;
|
|
2265
|
+
let s = radarPoints(e, t, n, i, c);
|
|
2266
|
+
o.querySelector(".prism-radar-area")?.setAttribute("d", closedPath(s, r)), o.querySelectorAll(".prism-radar-point").forEach((e, t) => {
|
|
2267
|
+
setAttributes(e, {
|
|
2268
|
+
cx: s[t].x,
|
|
2269
|
+
cy: s[t].y
|
|
2270
|
+
});
|
|
2271
|
+
}), o.querySelectorAll(".prism-radar-value").forEach((r, a) => {
|
|
2272
|
+
let o = i * e[a] + z;
|
|
2273
|
+
setAttributes(r, {
|
|
2274
|
+
x: polarX(t, o, c[a]),
|
|
2275
|
+
y: polarY(n, o, c[a])
|
|
2276
|
+
});
|
|
2277
|
+
});
|
|
2278
|
+
});
|
|
2279
|
+
}
|
|
2280
|
+
function renderGrid(e) {
|
|
2281
|
+
if (m.replaceChildren(), !o) return;
|
|
2282
|
+
let { cx: t, cy: n, radius: r } = b, i = Math.max(1, Math.round(o.levels)), a = Array.from({ length: i }, (e, a) => ringPath(o.shape, t, n, r * (a + 1) / i, c));
|
|
2283
|
+
if (o.bands) for (let e = i - 1; e >= 0; e -= 2) m.appendChild(createSvgElement("path", {
|
|
2284
|
+
class: "prism-radar-band",
|
|
2285
|
+
d: `${a[e]}${a[e - 1] ?? ""}`,
|
|
2286
|
+
"fill-rule": "evenodd"
|
|
2287
|
+
}));
|
|
2288
|
+
for (let e of a) m.appendChild(createSvgElement("path", {
|
|
2289
|
+
class: "prism-radar-ring",
|
|
2290
|
+
d: e,
|
|
2291
|
+
fill: "none"
|
|
2292
|
+
}));
|
|
2293
|
+
c.forEach((e, i) => {
|
|
2294
|
+
m.appendChild(createSvgElement("line", {
|
|
2295
|
+
class: "prism-radar-spoke",
|
|
2296
|
+
"data-axis": i,
|
|
2297
|
+
x1: t,
|
|
2298
|
+
x2: polarX(t, r, e),
|
|
2299
|
+
y1: n,
|
|
2300
|
+
y2: polarY(n, r, e)
|
|
2301
|
+
}));
|
|
2302
|
+
});
|
|
2303
|
+
let [s, l] = e[0], u = e.every(([e, t]) => e === s && t === l);
|
|
2304
|
+
if (!o.labels || !u) return;
|
|
2305
|
+
let d = c[0] + Math.PI / c.length;
|
|
2306
|
+
for (let e = 1; e <= i; e++) {
|
|
2307
|
+
let a = r * e / i, o = createSvgElement("text", {
|
|
2308
|
+
class: "prism-radar-level",
|
|
2309
|
+
"dominant-baseline": "middle",
|
|
2310
|
+
"text-anchor": "middle",
|
|
2311
|
+
x: polarX(t, a, d),
|
|
2312
|
+
y: polarY(n, a, d)
|
|
2313
|
+
});
|
|
2314
|
+
o.textContent = formatValue(0, Math.round((s + (l - s) * e / i) * 100) / 100), m.appendChild(o);
|
|
2315
|
+
}
|
|
2316
|
+
}
|
|
2317
|
+
function renderLabels() {
|
|
2318
|
+
g.replaceChildren();
|
|
2319
|
+
let { cx: e, cy: t, radius: r } = b;
|
|
2320
|
+
n.forEach((n, i) => {
|
|
2321
|
+
let { anchor: a, baseline: o } = labelPlacement(c[i]), s = createSvgElement("text", {
|
|
2322
|
+
class: "prism-radar-axis-label",
|
|
2323
|
+
"dominant-baseline": o,
|
|
2324
|
+
"text-anchor": a,
|
|
2325
|
+
x: polarX(e, r + l, c[i]),
|
|
2326
|
+
y: polarY(t, r + l, c[i])
|
|
2327
|
+
});
|
|
2328
|
+
s.textContent = n.label, g.appendChild(s);
|
|
2329
|
+
});
|
|
2330
|
+
}
|
|
2331
|
+
function renderSeries() {
|
|
2332
|
+
let { cx: e, cy: r, radius: o } = b;
|
|
2333
|
+
for (p.replaceChildren(); h.children.length > d.length;) h.lastChild?.remove();
|
|
2334
|
+
d.forEach((s, l) => {
|
|
2335
|
+
let d = s.color ?? seriesColor(l), f = h.children[l];
|
|
2336
|
+
f || (f = createSvgElement("g", { class: "prism-radar-series" }), h.appendChild(f)), f.setAttribute("data-series-id", seriesDomId(s, l)), f.replaceChildren();
|
|
2337
|
+
let m = createSvgElement("path", {
|
|
2338
|
+
class: `prism-radar-area prism-radar-area--${i}`,
|
|
2339
|
+
stroke: d,
|
|
2340
|
+
"stroke-linejoin": "round",
|
|
2341
|
+
"stroke-width": 2
|
|
2342
|
+
});
|
|
2343
|
+
if (i === "gradient") {
|
|
2344
|
+
let t = `${u}-fill-${l}`, n = createSvgElement("radialGradient", {
|
|
2345
|
+
cx: e,
|
|
2346
|
+
cy: r,
|
|
2347
|
+
gradientUnits: "userSpaceOnUse",
|
|
2348
|
+
id: t,
|
|
2349
|
+
r: o
|
|
2350
|
+
});
|
|
2351
|
+
for (let [e, t] of [[0, .08], [1, .55]]) n.appendChild(createSvgElement("stop", {
|
|
2352
|
+
offset: e,
|
|
2353
|
+
"stop-color": d,
|
|
2354
|
+
"stop-opacity": t,
|
|
2355
|
+
style: `stop-color:${d}`
|
|
2356
|
+
}));
|
|
2357
|
+
p.appendChild(n), setAttributes(m, { fill: `url(#${t})` });
|
|
2358
|
+
} else setAttributes(m, {
|
|
2359
|
+
fill: i === "none" ? "none" : d,
|
|
2360
|
+
"fill-opacity": .25
|
|
2361
|
+
});
|
|
2362
|
+
f.appendChild(m), a && n.forEach((e, t) => {
|
|
2363
|
+
let n = !Number.isFinite(datumAt(s, t)?.value);
|
|
2364
|
+
f.appendChild(createSvgElement("circle", {
|
|
2365
|
+
class: `prism-radar-point${n ? " prism-radar-point--missing" : ""}`,
|
|
2366
|
+
"data-axis": t,
|
|
2367
|
+
fill: n ? "none" : d,
|
|
2368
|
+
r: 3,
|
|
2369
|
+
stroke: d
|
|
2370
|
+
}));
|
|
2371
|
+
}), t.showValues && n.forEach((e, t) => {
|
|
2372
|
+
let n = datumAt(s, t), { anchor: r, baseline: i } = labelPlacement(c[t]), a = createSvgElement("text", {
|
|
2373
|
+
"aria-hidden": "true",
|
|
2374
|
+
class: "prism-radar-value",
|
|
2375
|
+
"dominant-baseline": i,
|
|
2376
|
+
"text-anchor": r
|
|
2377
|
+
});
|
|
2378
|
+
a.textContent = n && Number.isFinite(n.value) ? formatValue(t, n.value) : "", f.appendChild(a);
|
|
2379
|
+
});
|
|
2380
|
+
});
|
|
2381
|
+
}
|
|
2382
|
+
function setActive(e) {
|
|
2383
|
+
y = e;
|
|
2384
|
+
for (let t of f.querySelectorAll("[data-axis]")) {
|
|
2385
|
+
let n = Number(t.getAttribute("data-axis")) === e;
|
|
2386
|
+
t.classList.toggle(t.tagName === "line" ? "prism-radar-spoke--active" : "prism-radar-point--active", n);
|
|
2387
|
+
}
|
|
2388
|
+
}
|
|
2389
|
+
function animateTo(e, n) {
|
|
2390
|
+
v?.();
|
|
2391
|
+
let r = e.map((e, t) => e.map((e, n) => _[t]?.[n] ?? 0)), i = resolveMotion(t.transition, { defaultDuration: 400 }), a = resolveEasing(i.easing ?? "ease-out"), o = r.every((t, n) => t.every((t, r) => t === e[n][r]));
|
|
2392
|
+
i.duration === 0 || o ? (_ = e, draw(e)) : v = startTween({
|
|
2393
|
+
count: e.length,
|
|
2394
|
+
duration: i.duration,
|
|
2395
|
+
easing: a,
|
|
2396
|
+
onFrame: (t) => {
|
|
2397
|
+
_ = e.map((e, n) => {
|
|
2398
|
+
let i = t(n);
|
|
2399
|
+
return e.map((e, t) => tweenNumber(r[n][t], e, i));
|
|
2400
|
+
}), draw(_);
|
|
2401
|
+
},
|
|
2402
|
+
signal: n,
|
|
2403
|
+
stagger: i.stagger
|
|
2404
|
+
});
|
|
2405
|
+
}
|
|
2406
|
+
return createRadialScaffold(e, {
|
|
2407
|
+
a11y: t.a11y,
|
|
2408
|
+
legend: t.legend,
|
|
2409
|
+
tooltip: t.tooltip
|
|
2410
|
+
}, (r) => {
|
|
2411
|
+
let { legend: i, svg: a, tooltip: o } = r;
|
|
2412
|
+
if (a.contains(f) || a.appendChild(f), o?.hide(), i?.update(d.map((e, t) => ({
|
|
2413
|
+
color: e.color ?? seriesColor(t),
|
|
2414
|
+
name: e.name
|
|
2415
|
+
}))), n.length < 3) {
|
|
2416
|
+
for (let e of [
|
|
2417
|
+
p,
|
|
2418
|
+
m,
|
|
2419
|
+
h,
|
|
2420
|
+
g
|
|
2421
|
+
]) e.replaceChildren();
|
|
2422
|
+
_ = [];
|
|
2423
|
+
return;
|
|
2424
|
+
}
|
|
2425
|
+
let { height: u, width: v } = r.dimensions, x = fitRadius(v, u, n.map((e) => e.label), c, L, l);
|
|
2426
|
+
b = {
|
|
2427
|
+
cx: v / 2,
|
|
2428
|
+
cy: u / 2,
|
|
2429
|
+
radius: x
|
|
2430
|
+
};
|
|
2431
|
+
let S = resolveAxisDomains(n, d, t.domain);
|
|
2432
|
+
renderGrid(S), renderLabels(), renderSeries(), animateTo(d.map((e) => n.map((t, n) => {
|
|
2433
|
+
let r = datumAt(e, n)?.value;
|
|
2434
|
+
return r !== void 0 && Number.isFinite(r) ? normalize(r, S[n]) : 0;
|
|
2435
|
+
})), r.disposalSignal), setActive(y);
|
|
2436
|
+
let eventFor = (e, t) => ({
|
|
2437
|
+
axis: n[e],
|
|
2438
|
+
index: e,
|
|
2439
|
+
originalEvent: t,
|
|
2440
|
+
values: valuesAt(e)
|
|
2441
|
+
}), activate = (i, s) => {
|
|
2442
|
+
setActive(i), t.onHover?.(eventFor(i, s));
|
|
2443
|
+
let l = describe(i);
|
|
2444
|
+
if (!o) {
|
|
2445
|
+
r.announcer.announce(l);
|
|
2446
|
+
return;
|
|
2447
|
+
}
|
|
2448
|
+
let u = Math.max(0, ..._.map((e) => e[i] ?? 0)), f = a.getBoundingClientRect(), p = e.getBoundingClientRect(), m = valuesAt(i), h = m.find((e) => e.datum)?.datum, g = m.flatMap(({ datum: e, series: t }) => e ? [{
|
|
2449
|
+
color: t.color ?? seriesColor(d.indexOf(t)),
|
|
2450
|
+
name: t.name,
|
|
2451
|
+
value: formatValue(i, e.value)
|
|
2452
|
+
}] : []);
|
|
2453
|
+
o.show(polarX(b.cx, b.radius * u, c[i]) + (f.left - p.left), polarY(b.cy, b.radius * u, c[i]) + (f.top - p.top), {
|
|
2454
|
+
key: n[i].key,
|
|
2455
|
+
meta: {
|
|
2456
|
+
axis: n[i],
|
|
2457
|
+
text: l,
|
|
2458
|
+
values: m
|
|
2459
|
+
},
|
|
2460
|
+
value: h?.value ?? 0
|
|
2461
|
+
}, {
|
|
2462
|
+
color: d[0]?.color ?? seriesColor(0),
|
|
2463
|
+
data: [],
|
|
2464
|
+
name: n[i].label
|
|
2465
|
+
}, comparisonContent(a.ownerDocument, n[i].label, g, l));
|
|
2466
|
+
}, deactivate = () => {
|
|
2467
|
+
setActive(-1), t.onHover?.(null), o?.hide(), r.announcer.clear();
|
|
2468
|
+
}, hitIndex = (e) => {
|
|
2469
|
+
let t = a.getBoundingClientRect(), r = e.clientX - t.left - b.cx, i = e.clientY - t.top - b.cy;
|
|
2470
|
+
return Math.hypot(r, i) > b.radius + l + 22 ? -1 : nearestAxis(r, i, n.length, s);
|
|
2471
|
+
};
|
|
2472
|
+
return {
|
|
2473
|
+
onClick(e) {
|
|
2474
|
+
let n = hitIndex(e);
|
|
2475
|
+
n >= 0 && t.onClick?.(eventFor(n, e));
|
|
2476
|
+
},
|
|
2477
|
+
onKeyDown(e) {
|
|
2478
|
+
let r = B[e.key];
|
|
2479
|
+
r === void 0 ? (e.key === "Enter" || e.key === " ") && y >= 0 && t.onClick ? (e.preventDefault(), t.onClick(eventFor(y, e))) : e.key === "Escape" && deactivate() : (e.preventDefault(), activate(y < 0 ? 0 : (y + r + n.length) % n.length, e));
|
|
2480
|
+
},
|
|
2481
|
+
onMouseLeave: deactivate,
|
|
2482
|
+
onMouseMove(e) {
|
|
2483
|
+
let t = hitIndex(e);
|
|
2484
|
+
t < 0 ? y >= 0 && deactivate() : t !== y && activate(t, e);
|
|
2485
|
+
}
|
|
2486
|
+
};
|
|
2487
|
+
}, (e) => {
|
|
2488
|
+
d = e;
|
|
2489
|
+
});
|
|
2490
|
+
}
|
|
2491
|
+
//#endregion
|
|
2492
|
+
//#region src/interaction/scatter-interaction.ts
|
|
2493
|
+
function createScatterInteraction(e) {
|
|
2494
|
+
let t = -1, n = !1, hitAt = (t, n) => {
|
|
2495
|
+
let r = e.getData()[t]?.[n], i = e.getPoints()[t]?.[n];
|
|
2496
|
+
return r && i ? {
|
|
2497
|
+
datum: r,
|
|
2498
|
+
point: i,
|
|
2499
|
+
seriesIndex: t
|
|
2500
|
+
} : null;
|
|
2501
|
+
}, renderedHit = (t) => {
|
|
2502
|
+
let n = t.target;
|
|
2503
|
+
return !(n instanceof SVGElement) || !n.classList.contains("prism-scatter-point") || !n.parentElement || n.parentElement.parentNode !== e.seriesGroup ? null : hitAt([...e.seriesGroup.children].indexOf(n.parentElement), [...n.parentElement.children].indexOf(n));
|
|
2504
|
+
}, nearestHit = (t) => {
|
|
2505
|
+
let n = null, r = Infinity;
|
|
2506
|
+
for (let [i, a] of e.getPoints().entries()) for (let e of a.keys()) {
|
|
2507
|
+
let a = hitAt(i, e);
|
|
2508
|
+
if (!a) continue;
|
|
2509
|
+
let o = Math.hypot(a.point.x - t.x, a.point.y - t.y);
|
|
2510
|
+
o < r && (r = o, n = a);
|
|
2511
|
+
}
|
|
2512
|
+
return n;
|
|
2513
|
+
}, orderedHits = () => {
|
|
2514
|
+
let t = [];
|
|
2515
|
+
for (let [n, r] of e.getData().entries()) for (let e of r.keys()) {
|
|
2516
|
+
let r = hitAt(n, e);
|
|
2517
|
+
r && t.push(r);
|
|
2518
|
+
}
|
|
2519
|
+
return t.sort((e, t) => e.point.x - t.point.x || e.point.y - t.point.y || e.seriesIndex - t.seriesIndex);
|
|
2520
|
+
}, eventFor = (t, n) => ({
|
|
2521
|
+
datum: t.datum,
|
|
2522
|
+
originalEvent: n,
|
|
2523
|
+
series: e.getSeriesList()[t.seriesIndex]
|
|
2524
|
+
}), highlight = (t) => {
|
|
2525
|
+
let n = [...e.seriesGroup.children];
|
|
2526
|
+
e.markers.replaceChildren(), t && e.markers.appendChild(createSvgElement("circle", {
|
|
2527
|
+
class: "prism-active-point",
|
|
2528
|
+
cx: t.point.x,
|
|
2529
|
+
cy: t.point.y,
|
|
2530
|
+
fill: e.colors()[t.seriesIndex],
|
|
2531
|
+
r: 4
|
|
2532
|
+
})), e.seriesGroup.classList.toggle("prism-series-focused", t !== null && n.length > 1);
|
|
2533
|
+
for (let [e, r] of n.entries()) r.classList.toggle("prism-series-active", e === t?.seriesIndex);
|
|
2534
|
+
}, clear = () => {
|
|
2535
|
+
e.crosshair?.hide(), e.tooltip?.hide(), e.announcer.clear(), highlight(null), n = !1, e.onHover?.(null);
|
|
2536
|
+
}, focus = (t, r, i) => {
|
|
2537
|
+
let a = e.dims(), o = chartArea(a.width, a.height, e.margin), s = e.crosshair?.snap === !1 && r, c = eventFor(t, i), { datum: l, series: u } = c, d = e.tooltipFormat?.titleFormat ? e.tooltipFormat.titleFormat(l.key) : keyLabel(l.key), f = e.tooltipFormat?.valueFormat, p = describeValues(d, [{
|
|
2538
|
+
datum: l,
|
|
2539
|
+
series: u
|
|
2540
|
+
}], f ?? String);
|
|
2541
|
+
if (e.crosshair?.show(s ? r.x : t.point.x, s ? r.y : t.point.y, o.width, o.height), highlight(t), e.tooltip) {
|
|
2542
|
+
let n = {
|
|
2543
|
+
color: e.colors()[t.seriesIndex],
|
|
2544
|
+
name: u.name,
|
|
2545
|
+
value: f ? f(l.value, l, u) : String(l.value)
|
|
2546
|
+
};
|
|
2547
|
+
e.tooltip.show(t.point.x + e.margin.left, t.point.y + e.margin.top, l, u, comparisonContent(e.svg.ownerDocument, d, [n], p));
|
|
2548
|
+
} else e.announcer.announce(p);
|
|
2549
|
+
n = !0, e.onHover?.(c);
|
|
2550
|
+
}, pointerHit = (t) => {
|
|
2551
|
+
let n = renderedHit(t);
|
|
2552
|
+
if (n) return {
|
|
2553
|
+
hit: n,
|
|
2554
|
+
raw: n.point
|
|
2555
|
+
};
|
|
2556
|
+
let r = e.dims(), i = getMousePosition(e.svg, t, e.margin.left, e.margin.top), a = chartArea(r.width, r.height, e.margin);
|
|
2557
|
+
if (i.x < 0 || i.x > a.width || i.y < 0 || i.y > a.height) return null;
|
|
2558
|
+
let o = nearestHit(i);
|
|
2559
|
+
return o ? {
|
|
2560
|
+
hit: o,
|
|
2561
|
+
raw: i
|
|
2562
|
+
} : null;
|
|
2563
|
+
}, onMouseMove = (e) => {
|
|
2564
|
+
let t = pointerHit(e);
|
|
2565
|
+
t ? focus(t.hit, t.raw, e) : n && clear();
|
|
2566
|
+
}, onClick = (t) => {
|
|
2567
|
+
if (!e.onClick) return;
|
|
2568
|
+
let n = pointerHit(t);
|
|
2569
|
+
n && e.onClick(eventFor(n.hit, t));
|
|
2570
|
+
}, onKeyDown = (n) => {
|
|
2571
|
+
let r = orderedHits();
|
|
2572
|
+
if (r.length === 0) return;
|
|
2573
|
+
let i = r.length - 1, a = {
|
|
2574
|
+
ArrowLeft: t < 0 ? i : Math.max(0, t - 1),
|
|
2575
|
+
ArrowRight: t < 0 ? 0 : Math.min(i, t + 1),
|
|
2576
|
+
End: i,
|
|
2577
|
+
Home: 0
|
|
2578
|
+
};
|
|
2579
|
+
n.key in a ? (n.preventDefault(), t = a[n.key], focus(r[t], null, n)) : (n.key === "Enter" || n.key === " ") && t >= 0 && e.onClick ? (n.preventDefault(), e.onClick(eventFor(r[t], n))) : n.key === "Escape" && (t = -1, clear());
|
|
2580
|
+
};
|
|
2581
|
+
return {
|
|
2582
|
+
onClick,
|
|
2583
|
+
onKeyDown,
|
|
2584
|
+
onMouseLeave: clear,
|
|
2585
|
+
onMouseMove
|
|
2586
|
+
};
|
|
2587
|
+
}
|
|
2588
|
+
//#endregion
|
|
2589
|
+
//#region src/charts/scatter/scatter-renderer.ts
|
|
2590
|
+
var V = 400, H = /* @__PURE__ */ new WeakMap(), U = /* @__PURE__ */ new WeakMap();
|
|
2591
|
+
function computeScatterPoints(e, t, n) {
|
|
2592
|
+
return e.some((e) => e.key == null) || e.some((e) => typeof e.key == "string"), e.map((e) => ({
|
|
2593
|
+
x: t.map(e.key),
|
|
2594
|
+
y: n.map(e.value)
|
|
2595
|
+
}));
|
|
2596
|
+
}
|
|
2597
|
+
function renderScatterPoints(e, t, n) {
|
|
2598
|
+
let r = resolveMotion(n.transition), i = n.marks ?? [], a = n.pointRadius;
|
|
2599
|
+
for (H.get(e)?.(), H.delete(e); e.children.length > t.length;) e.lastChild.remove();
|
|
2600
|
+
let o = U.get(e) ?? [], s = [], c = t.map((t, r) => {
|
|
2601
|
+
let a = e.children[r];
|
|
2602
|
+
return a ? s.push(Number(a.getAttribute("r")) || 0) : (a = createSvgElement("circle", { class: "prism-scatter-point" }), e.appendChild(a), s.push(0)), setAttributes(a, {
|
|
2603
|
+
fill: n.color,
|
|
2604
|
+
opacity: i[r]?.opacity
|
|
2605
|
+
}), a;
|
|
2606
|
+
}), paint = (t, n) => {
|
|
2607
|
+
for (let [e, r] of c.entries()) setAttributes(r, {
|
|
2608
|
+
cx: t[e].x,
|
|
2609
|
+
cy: t[e].y,
|
|
2610
|
+
r: n(e)
|
|
2611
|
+
});
|
|
2612
|
+
U.set(e, t);
|
|
2613
|
+
};
|
|
2614
|
+
if (r.duration === 0) {
|
|
2615
|
+
paint(t, () => a);
|
|
2616
|
+
return;
|
|
2617
|
+
}
|
|
2618
|
+
let l = t.map((e, t) => o[t] ?? e), u = t.map((e, t) => t).filter((e) => e >= o.length), d = new Map([...u].sort((e, n) => t[e].x - t[n].x).map((e, t) => [e, t])), f = Math.min(r.stagger, V / Math.max(1, u.length)), paintFrame = (e) => {
|
|
2619
|
+
let n = t.map((t, n) => e(d.get(n) ?? 0));
|
|
2620
|
+
paint(t.map((e, t) => ({
|
|
2621
|
+
x: tweenNumber(l[t].x, e.x, n[t]),
|
|
2622
|
+
y: tweenNumber(l[t].y, e.y, n[t])
|
|
2623
|
+
})), (e) => tweenNumber(s[e], a, n[e]));
|
|
2624
|
+
};
|
|
2625
|
+
paintFrame(() => 0), H.set(e, startTween({
|
|
2626
|
+
count: Math.max(1, u.length),
|
|
2627
|
+
duration: r.duration,
|
|
2628
|
+
easing: resolveEasing(r.easing),
|
|
2629
|
+
onComplete: () => {
|
|
2630
|
+
H.delete(e), paint(t, () => a);
|
|
2631
|
+
},
|
|
2632
|
+
onFrame: paintFrame,
|
|
2633
|
+
signal: n.disposalSignal,
|
|
2634
|
+
stagger: f
|
|
2635
|
+
}));
|
|
2636
|
+
}
|
|
2637
|
+
//#endregion
|
|
2638
|
+
//#region src/charts/scatter/scatter-chart.ts
|
|
2639
|
+
function createScatterChart(e, t) {
|
|
2640
|
+
let n = null, r = null, i = t.series;
|
|
2641
|
+
return createChartScaffold(e, t, (e, a) => {
|
|
2642
|
+
let { groups: o, legend: s, tooltip: c } = e;
|
|
2643
|
+
s?.update(i.map((e, t) => ({
|
|
2644
|
+
color: seriesColor(t, e.color),
|
|
2645
|
+
name: e.name
|
|
2646
|
+
})));
|
|
2647
|
+
let l = e.dimensions, u = chartArea(l.width, l.height, l.margin), d = i.map((e) => e.data), f = d.flat().map((e) => e.key), p = d.flat().map((e) => e.value);
|
|
2648
|
+
if (f.length === 0) {
|
|
2649
|
+
clearCartesianDom(o, s, c, n), r?.replaceChildren();
|
|
2650
|
+
return;
|
|
2651
|
+
}
|
|
2652
|
+
t.crosshair && !n && (n = createCrosshair(e.chartArea, t.crosshair));
|
|
2653
|
+
let m = buildXScale(f, u.width), h = buildYScale(p, u.height, !1), g = t.xAxis === !1 ? !1 : t.xAxis ?? {}, _ = t.yAxis !== !1 && {
|
|
2654
|
+
grid: !0,
|
|
2655
|
+
...t.yAxis
|
|
2656
|
+
};
|
|
2657
|
+
for (_ && _.grid ? renderGrid(o.grid, h, _.grid, u.width, "horizontal", resolveTicks(h, _, resolveTickCount(_, u.height, "left"))) : o.grid.replaceChildren(), g && g.grid && renderGrid(o.grid, m, g.grid, u.height, "vertical", resolveTicks(m, g, resolveTickCount(g, u.width, "bottom"))), g ? (positionAxis(o.xAxis, g.position ?? "bottom", u.width, u.height), renderAxis(o.xAxis, m, g, u.width, "bottom")) : o.xAxis.replaceChildren(), _ ? (positionAxis(o.yAxis, _.position ?? "left", u.width, u.height), renderAxis(o.yAxis, h, _, u.height, "left")) : o.yAxis.replaceChildren(); o.series.children.length > i.length;) o.series.removeChild(o.series.lastChild);
|
|
2658
|
+
let v = [];
|
|
2659
|
+
for (let [n, r] of i.entries()) {
|
|
2660
|
+
let i = o.series.children[n];
|
|
2661
|
+
i || (i = createSvgElement("g", { class: "prism-scatter-series" }), o.series.appendChild(i)), i.setAttribute("data-series-id", seriesDomId(r, n));
|
|
2662
|
+
let s = computeScatterPoints(r.data, m, h);
|
|
2663
|
+
v.push(s), renderScatterPoints(i, s, {
|
|
2664
|
+
color: seriesColor(n, r.color),
|
|
2665
|
+
disposalSignal: e.disposalSignal,
|
|
2666
|
+
marks: r.data,
|
|
2667
|
+
pointRadius: r.pointRadius ?? 3,
|
|
2668
|
+
transition: a !== "resize" && t.transition
|
|
2669
|
+
});
|
|
2670
|
+
}
|
|
2671
|
+
return c?.hide(), r = ensureMarkerGroup(e.chartArea, r), createScatterInteraction({
|
|
2672
|
+
announcer: e.announcer,
|
|
2673
|
+
colors: () => i.map((e, t) => seriesColor(t, e.color)),
|
|
2674
|
+
crosshair: n,
|
|
2675
|
+
dims: () => e.dimensions,
|
|
2676
|
+
getData: () => d,
|
|
2677
|
+
getPoints: () => v,
|
|
2678
|
+
getSeriesList: () => i,
|
|
2679
|
+
margin: l.margin,
|
|
2680
|
+
markers: r,
|
|
2681
|
+
onClick: t.onClick,
|
|
2682
|
+
onHover: t.onHover,
|
|
2683
|
+
seriesGroup: o.series,
|
|
2684
|
+
svg: e.svg,
|
|
2685
|
+
tooltip: c,
|
|
2686
|
+
tooltipFormat: typeof t.tooltip == "object" ? t.tooltip : void 0
|
|
2687
|
+
});
|
|
2688
|
+
}, (e) => {
|
|
2689
|
+
i = e;
|
|
2690
|
+
});
|
|
2691
|
+
}
|
|
2692
|
+
//#endregion
|
|
2693
|
+
//#region src/charts/sparkline/sparkline.ts
|
|
2694
|
+
var W = 5;
|
|
2695
|
+
function buildTopPoints(e, t, n) {
|
|
2696
|
+
if (e.length === 0) return [];
|
|
2697
|
+
let r = t / Math.max(1, e.length - 1), i = Math.min(...e), a = Math.max(...e) - i || 1;
|
|
2698
|
+
return e.map((e, t) => ({
|
|
2699
|
+
x: t * r,
|
|
2700
|
+
y: n - (e - i) / a * n
|
|
2701
|
+
}));
|
|
2702
|
+
}
|
|
2703
|
+
function buildAreaPathFromPoints(e, t, n) {
|
|
2704
|
+
return e.length === 0 ? "" : areaPath(e, e.map((e) => ({
|
|
2705
|
+
x: e.x,
|
|
2706
|
+
y: t
|
|
2707
|
+
})), n ?? "linear");
|
|
2708
|
+
}
|
|
2709
|
+
function buildPathFromPoints(e, t) {
|
|
2710
|
+
return e.length === 0 ? "" : t === "monotone" ? monotonePath(e) : t === "step" ? stepPath(e) : linePath(e);
|
|
2711
|
+
}
|
|
2712
|
+
function isStackData(e) {
|
|
2713
|
+
return e.length > 0 && e[0] !== null && typeof e[0] == "object";
|
|
2714
|
+
}
|
|
2715
|
+
function buildRoundedStackRect(e, t, n, r, i, a, o) {
|
|
2716
|
+
let s = Math.min(i, n / 2, r / 2), c = a ? s : 0, l = a ? s : 0, u = o ? s : 0, d = o ? s : 0;
|
|
2717
|
+
return [
|
|
2718
|
+
`M${e + c},${t}`,
|
|
2719
|
+
`H${e + n - u}`,
|
|
2720
|
+
u ? `Q${e + n},${t} ${e + n},${t + u}` : "",
|
|
2721
|
+
`V${t + r - d}`,
|
|
2722
|
+
d ? `Q${e + n},${t + r} ${e + n - d},${t + r}` : "",
|
|
2723
|
+
`H${e + l}`,
|
|
2724
|
+
l ? `Q${e},${t + r} ${e},${t + r - l}` : "",
|
|
2725
|
+
`V${t + c}`,
|
|
2726
|
+
c ? `Q${e},${t} ${e + c},${t}` : "",
|
|
2727
|
+
"Z"
|
|
2728
|
+
].filter(Boolean).join("");
|
|
2729
|
+
}
|
|
2730
|
+
function defaultStackColor(e) {
|
|
2731
|
+
return `var(--prism-color-${e % 8 + 1})`;
|
|
2732
|
+
}
|
|
2733
|
+
function createSparkline(e, t) {
|
|
2734
|
+
let n = t.variant ?? "line", r = t.color ?? "var(--prism-color-1)", i = t.curve ?? "linear", a = t.strokeWidth ?? 1.5, o = t.fillOpacity, s = t.showEndPoint ?? !0, c = uniqueId("prism-spark-fill"), l = createTappers(), u = resolveMotion(t.transition), d = resolveEasing(u.easing), f = t.data, p = null, m = null, h = createChartBase(e, {
|
|
2735
|
+
a11y: t.a11y,
|
|
2736
|
+
margin: {
|
|
2737
|
+
bottom: 0,
|
|
2738
|
+
left: 0,
|
|
2739
|
+
right: 0,
|
|
2740
|
+
top: 0
|
|
2741
|
+
}
|
|
2742
|
+
}, () => {
|
|
2743
|
+
l.emit({
|
|
2744
|
+
height: h.dimensions.height,
|
|
2745
|
+
type: "resize",
|
|
2746
|
+
width: h.dimensions.width
|
|
2747
|
+
}), renderAll();
|
|
2748
|
+
}), { svg: g } = h;
|
|
2749
|
+
g.classList.add("prism-sparkline");
|
|
2750
|
+
let _ = createSvgElement("g", { class: "prism-spark-inner" });
|
|
2751
|
+
g.appendChild(_);
|
|
2752
|
+
let cleanupInteraction;
|
|
2753
|
+
function plotArea() {
|
|
2754
|
+
let { height: e, width: t } = h.dimensions, r = n === "line" || n === "area" ? W : 0;
|
|
2755
|
+
return {
|
|
2756
|
+
h: Math.max(1, e - r * 2),
|
|
2757
|
+
inset: r,
|
|
2758
|
+
w: Math.max(1, t - r * 2)
|
|
2759
|
+
};
|
|
2760
|
+
}
|
|
2761
|
+
function animateValues(e, t, n) {
|
|
2762
|
+
m?.();
|
|
2763
|
+
let r = p?.length === e.length ? p : e.map(() => t);
|
|
2764
|
+
r.every((t, n) => t === e[n]) || u.duration === 0 ? (p = e, n(e)) : (m = startTween({
|
|
2765
|
+
count: 1,
|
|
2766
|
+
duration: u.duration,
|
|
2767
|
+
easing: d,
|
|
2768
|
+
onFrame: (t) => {
|
|
2769
|
+
let i = t(0), a = e.map((e, t) => tweenNumber(r[t], e, i));
|
|
2770
|
+
p = a, n(a);
|
|
2771
|
+
},
|
|
2772
|
+
signal: v.signal
|
|
2773
|
+
}), p = r, n(r));
|
|
2774
|
+
}
|
|
2775
|
+
function renderAll() {
|
|
2776
|
+
let { height: e, width: l } = h.dimensions, u = plotArea();
|
|
2777
|
+
for (; _.firstChild;) _.removeChild(_.firstChild);
|
|
2778
|
+
if (_.setAttribute("transform", `translate(${u.inset},${u.inset})`), f.length === 0) p = null;
|
|
2779
|
+
else {
|
|
2780
|
+
if (!isStackData(f) && f.some((e) => !Number.isFinite(e)), n === "stack" && isStackData(f)) {
|
|
2781
|
+
let n = createSvgElement("g", { class: "prism-spark-stack" });
|
|
2782
|
+
_.appendChild(n);
|
|
2783
|
+
let r = t.cornerRadius ?? 4, i = f, a = i.reduce((e, t) => e + Math.max(0, t.value), 0), o = i.map((e, t) => {
|
|
2784
|
+
let r = createSvgElement("path", { class: "prism-spark-stack-segment" });
|
|
2785
|
+
return setAttributes(r, { fill: e.color ?? defaultStackColor(t) }), n.appendChild(r), r;
|
|
2786
|
+
});
|
|
2787
|
+
a > 0 ? animateValues(i.map((e) => Math.max(0, e.value)), 0, (n) => {
|
|
2788
|
+
let i = n.reduce((e, t) => e + t, 0) || 1, a = (t.padPixels ?? 0) / 2, s = 0;
|
|
2789
|
+
n.forEach((t, c) => {
|
|
2790
|
+
let u = Math.round(s);
|
|
2791
|
+
s += t / i * l;
|
|
2792
|
+
let d = c === n.length - 1 ? l : Math.round(s), f = c === 0, p = c === n.length - 1, m = u + (f ? 0 : a), h = Math.max(0, d - u - (f ? 0 : a) - (p ? 0 : a));
|
|
2793
|
+
o[c]?.setAttribute("d", buildRoundedStackRect(m, 0, h, e, r, f, p));
|
|
2794
|
+
});
|
|
2795
|
+
}) : (m?.(), p = null);
|
|
2796
|
+
} else if (n === "bar") {
|
|
2797
|
+
let t = createSvgElement("g", { class: "prism-spark-bars" });
|
|
2798
|
+
_.appendChild(t);
|
|
2799
|
+
let n = f, i = Math.min(0, ...n), a = Math.max(...n) - i || 1, o = Math.max(1, l / n.length - 1), s = l / n.length, c = n.map(() => {
|
|
2800
|
+
let e = createSvgElement("rect", {
|
|
2801
|
+
class: "prism-spark-bar",
|
|
2802
|
+
fill: r
|
|
2803
|
+
});
|
|
2804
|
+
return t.appendChild(e), e;
|
|
2805
|
+
});
|
|
2806
|
+
animateValues(n, i, (t) => {
|
|
2807
|
+
for (let [n, r] of c.entries()) {
|
|
2808
|
+
let c = Math.max(1, (t[n] - i) / a * e);
|
|
2809
|
+
setAttributes(r, {
|
|
2810
|
+
height: c,
|
|
2811
|
+
width: o,
|
|
2812
|
+
x: n * s,
|
|
2813
|
+
y: e - c
|
|
2814
|
+
});
|
|
2815
|
+
}
|
|
2816
|
+
});
|
|
2817
|
+
} else {
|
|
2818
|
+
let e = f, t = Math.min(...e), l = Math.max(...e) - t || 1, d = u.w / Math.max(1, e.length - 1), pointsFromValues = (e) => e.map((e, n) => ({
|
|
2819
|
+
x: n * d,
|
|
2820
|
+
y: u.h - (e - t) / l * u.h
|
|
2821
|
+
})), p = null;
|
|
2822
|
+
if (n === "area") {
|
|
2823
|
+
let e = createSvgElement("defs"), t = createSvgElement("linearGradient", {
|
|
2824
|
+
id: c,
|
|
2825
|
+
x1: 0,
|
|
2826
|
+
x2: 0,
|
|
2827
|
+
y1: 0,
|
|
2828
|
+
y2: 1
|
|
2829
|
+
});
|
|
2830
|
+
for (let [e, n] of [[0, "prism-spark-stop-top"], [1, "prism-spark-stop-bottom"]]) {
|
|
2831
|
+
let i = createSvgElement("stop", {
|
|
2832
|
+
class: n,
|
|
2833
|
+
offset: e,
|
|
2834
|
+
"stop-color": r
|
|
2835
|
+
});
|
|
2836
|
+
i.style.stopColor = r, t.appendChild(i);
|
|
2837
|
+
}
|
|
2838
|
+
e.appendChild(t), _.appendChild(e), p = createSvgElement("path", { class: "prism-spark-fill" }), setAttributes(p, {
|
|
2839
|
+
fill: `url(#${c})`,
|
|
2840
|
+
stroke: "none"
|
|
2841
|
+
}), p.style.fillOpacity = o === void 0 ? "" : String(o), _.appendChild(p);
|
|
2842
|
+
}
|
|
2843
|
+
let m = createSvgElement("path", { class: "prism-spark-line" });
|
|
2844
|
+
setAttributes(m, {
|
|
2845
|
+
fill: "none",
|
|
2846
|
+
stroke: r,
|
|
2847
|
+
"stroke-width": a
|
|
2848
|
+
}), _.appendChild(m);
|
|
2849
|
+
let h = s && e.length > 0 ? createSvgElement("circle", {
|
|
2850
|
+
class: "prism-spark-end",
|
|
2851
|
+
fill: r,
|
|
2852
|
+
r: 2.5
|
|
2853
|
+
}) : null;
|
|
2854
|
+
h && _.appendChild(h), animateValues(e, t, (e) => {
|
|
2855
|
+
let t = pointsFromValues(e);
|
|
2856
|
+
setAttributes(m, { d: buildPathFromPoints(t, i) }), p && setAttributes(p, { d: buildAreaPathFromPoints(t, u.h, i) });
|
|
2857
|
+
let n = t.at(-1);
|
|
2858
|
+
h && n && setAttributes(h, {
|
|
2859
|
+
cx: n.x,
|
|
2860
|
+
cy: n.y
|
|
2861
|
+
});
|
|
2862
|
+
});
|
|
2863
|
+
}
|
|
2864
|
+
isStackData(f) || attachInteraction(f);
|
|
2865
|
+
}
|
|
2866
|
+
}
|
|
2867
|
+
function attachInteraction(e) {
|
|
2868
|
+
if (cleanupInteraction?.(), cleanupInteraction = void 0, !t.onHover && !t.onClick || e.length <= 1) return;
|
|
2869
|
+
let { h: i, inset: a, w: o } = plotArea();
|
|
2870
|
+
g.style.cursor = "crosshair";
|
|
2871
|
+
let s = o / (e.length - 1), c = n === "bar" ? [] : buildTopPoints(e, o, i), l = createSvgElement("circle", {
|
|
2872
|
+
class: "prism-spark-marker",
|
|
2873
|
+
fill: r,
|
|
2874
|
+
r: 3.5
|
|
2875
|
+
}), indexAt = (t) => Math.max(0, Math.min(e.length - 1, Math.round((t - g.getBoundingClientRect().left - a) / s)));
|
|
2876
|
+
l.style.display = "none", _.appendChild(l);
|
|
2877
|
+
let handleMove = (n) => {
|
|
2878
|
+
let r = indexAt(n.clientX), i = c[r];
|
|
2879
|
+
i && (setAttributes(l, {
|
|
2880
|
+
cx: i.x,
|
|
2881
|
+
cy: i.y
|
|
2882
|
+
}), l.style.display = ""), t.onHover?.({
|
|
2883
|
+
index: r,
|
|
2884
|
+
originalEvent: n,
|
|
2885
|
+
value: e[r]
|
|
2886
|
+
});
|
|
2887
|
+
}, handleLeave = () => {
|
|
2888
|
+
l.style.display = "none", t.onHover?.(null);
|
|
2889
|
+
}, handleClick = (n) => {
|
|
2890
|
+
if (!t.onClick) return;
|
|
2891
|
+
let r = indexAt(n.clientX);
|
|
2892
|
+
t.onClick({
|
|
2893
|
+
index: r,
|
|
2894
|
+
originalEvent: n,
|
|
2895
|
+
value: e[r]
|
|
2896
|
+
});
|
|
2897
|
+
};
|
|
2898
|
+
g.addEventListener("mousemove", handleMove), g.addEventListener("mouseleave", handleLeave), g.addEventListener("click", handleClick), cleanupInteraction = () => {
|
|
2899
|
+
g.removeEventListener("mousemove", handleMove), g.removeEventListener("mouseleave", handleLeave), g.removeEventListener("click", handleClick);
|
|
2900
|
+
};
|
|
2901
|
+
}
|
|
2902
|
+
let v = new AbortController(), y = !1;
|
|
2903
|
+
try {
|
|
2904
|
+
return renderAll(), {
|
|
2905
|
+
get disposalSignal() {
|
|
2906
|
+
return v.signal;
|
|
2907
|
+
},
|
|
2908
|
+
dispose() {
|
|
2909
|
+
y || (y = !0, l.emit({ type: "dispose" }), l.stop(), v.abort(), cleanupInteraction?.(), h.dispose());
|
|
2910
|
+
},
|
|
2911
|
+
get disposed() {
|
|
2912
|
+
return y;
|
|
2913
|
+
},
|
|
2914
|
+
el: g,
|
|
2915
|
+
tap: l.tap,
|
|
2916
|
+
update(e) {
|
|
2917
|
+
if (y) throw new PrismRenderError("Cannot update a disposed chart.");
|
|
2918
|
+
f = e, renderAll();
|
|
2919
|
+
},
|
|
2920
|
+
[Symbol.dispose]() {
|
|
2921
|
+
this.dispose();
|
|
2922
|
+
}
|
|
2923
|
+
};
|
|
2924
|
+
} catch (e) {
|
|
2925
|
+
throw v.abort(), cleanupInteraction?.(), h.dispose(), e instanceof PrismRenderError ? e : new PrismRenderError("Failed to render chart.", { cause: e });
|
|
2926
|
+
}
|
|
2927
|
+
}
|
|
2928
|
+
//#endregion
|
|
2929
|
+
export { PrismError, PrismRenderError, bandScale, createAreaChart, createBarChart, createLineChart, createPieChart, createRadarChart, createScatterChart, createSparkline, linearScale, resetTheme, seriesColor, setTheme, timeScale };
|
|
2930
|
+
|
|
2
2931
|
//# sourceMappingURL=prism.js.map
|