@vielzeug/prism 26.10.4 → 26.10.6
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/README.md +15 -26
- package/dist/animation/reveal.cjs +2 -0
- package/dist/animation/reveal.cjs.map +1 -0
- package/dist/animation/reveal.d.ts +29 -0
- package/dist/animation/reveal.d.ts.map +1 -0
- package/dist/animation/reveal.js +2 -0
- package/dist/animation/reveal.js.map +1 -0
- package/dist/axes/axis.cjs +1 -1
- package/dist/axes/axis.cjs.map +1 -1
- package/dist/axes/axis.d.ts +10 -3
- package/dist/axes/axis.d.ts.map +1 -1
- package/dist/axes/axis.js +1 -1
- package/dist/axes/axis.js.map +1 -1
- package/dist/axes/grid.cjs +1 -1
- package/dist/axes/grid.cjs.map +1 -1
- package/dist/axes/grid.d.ts +1 -1
- package/dist/axes/grid.d.ts.map +1 -1
- package/dist/axes/grid.js +1 -1
- package/dist/axes/grid.js.map +1 -1
- package/dist/charts/area/area-chart.cjs +1 -1
- package/dist/charts/area/area-chart.cjs.map +1 -1
- package/dist/charts/area/area-chart.d.ts.map +1 -1
- package/dist/charts/area/area-chart.js +1 -1
- package/dist/charts/area/area-chart.js.map +1 -1
- package/dist/charts/bar/bar-chart.cjs +1 -1
- package/dist/charts/bar/bar-chart.cjs.map +1 -1
- package/dist/charts/bar/bar-chart.d.ts.map +1 -1
- package/dist/charts/bar/bar-chart.js +1 -1
- package/dist/charts/bar/bar-chart.js.map +1 -1
- package/dist/charts/bar/bar-renderer.cjs +1 -1
- package/dist/charts/bar/bar-renderer.cjs.map +1 -1
- package/dist/charts/bar/bar-renderer.d.ts.map +1 -1
- package/dist/charts/bar/bar-renderer.js +1 -1
- package/dist/charts/bar/bar-renderer.js.map +1 -1
- package/dist/charts/line/line-chart.cjs +1 -1
- package/dist/charts/line/line-chart.cjs.map +1 -1
- package/dist/charts/line/line-chart.d.ts.map +1 -1
- package/dist/charts/line/line-chart.js +1 -1
- package/dist/charts/line/line-chart.js.map +1 -1
- package/dist/charts/line/line-renderer.cjs +1 -1
- package/dist/charts/line/line-renderer.cjs.map +1 -1
- package/dist/charts/line/line-renderer.d.ts +5 -2
- package/dist/charts/line/line-renderer.d.ts.map +1 -1
- package/dist/charts/line/line-renderer.js +1 -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.d.ts.map +1 -1
- package/dist/charts/pie/pie-chart.js +1 -1
- package/dist/charts/pie/pie-chart.js.map +1 -1
- package/dist/charts/scatter/index.d.ts +2 -0
- package/dist/charts/scatter/index.d.ts.map +1 -0
- package/dist/charts/scatter/scatter-chart.cjs +2 -0
- package/dist/charts/scatter/scatter-chart.cjs.map +1 -0
- package/dist/charts/scatter/scatter-chart.d.ts +3 -0
- package/dist/charts/scatter/scatter-chart.d.ts.map +1 -0
- package/dist/charts/scatter/scatter-chart.js +2 -0
- package/dist/charts/scatter/scatter-chart.js.map +1 -0
- package/dist/charts/scatter/scatter-renderer.cjs +2 -0
- package/dist/charts/scatter/scatter-renderer.cjs.map +1 -0
- package/dist/charts/scatter/scatter-renderer.d.ts +24 -0
- package/dist/charts/scatter/scatter-renderer.d.ts.map +1 -0
- package/dist/charts/scatter/scatter-renderer.js +2 -0
- package/dist/charts/scatter/scatter-renderer.js.map +1 -0
- package/dist/core/chart-base.cjs +1 -1
- package/dist/core/chart-base.cjs.map +1 -1
- package/dist/core/chart-base.d.ts +1 -0
- package/dist/core/chart-base.d.ts.map +1 -1
- package/dist/core/chart-base.js +1 -1
- package/dist/core/chart-base.js.map +1 -1
- package/dist/core/chart-scaffold.cjs +1 -1
- package/dist/core/chart-scaffold.cjs.map +1 -1
- package/dist/core/chart-scaffold.d.ts +4 -2
- package/dist/core/chart-scaffold.d.ts.map +1 -1
- package/dist/core/chart-scaffold.js +1 -1
- package/dist/core/chart-scaffold.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/interaction/announcer.cjs +1 -1
- package/dist/interaction/announcer.cjs.map +1 -1
- package/dist/interaction/announcer.d.ts +1 -1
- package/dist/interaction/announcer.d.ts.map +1 -1
- package/dist/interaction/announcer.js +1 -1
- package/dist/interaction/announcer.js.map +1 -1
- package/dist/interaction/legend.cjs +1 -1
- package/dist/interaction/legend.cjs.map +1 -1
- package/dist/interaction/legend.d.ts +1 -1
- package/dist/interaction/legend.d.ts.map +1 -1
- package/dist/interaction/legend.js +1 -1
- package/dist/interaction/legend.js.map +1 -1
- package/dist/interaction/scatter-interaction.cjs +2 -0
- package/dist/interaction/scatter-interaction.cjs.map +1 -0
- package/dist/interaction/scatter-interaction.d.ts +36 -0
- package/dist/interaction/scatter-interaction.d.ts.map +1 -0
- package/dist/interaction/scatter-interaction.js +2 -0
- package/dist/interaction/scatter-interaction.js.map +1 -0
- package/dist/interaction/series-interaction.cjs +1 -1
- package/dist/interaction/series-interaction.cjs.map +1 -1
- package/dist/interaction/series-interaction.d.ts +3 -1
- package/dist/interaction/series-interaction.d.ts.map +1 -1
- package/dist/interaction/series-interaction.js +1 -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.d.ts.map +1 -1
- package/dist/interaction/tooltip.js +1 -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 +1 -1
- package/dist/prism.js.map +1 -1
- package/dist/theme/prism.css +6 -0
- package/dist/types.d.ts +39 -6
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -3
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @vielzeug/prism
|
|
2
2
|
|
|
3
|
-
> Responsive SVG charts with explicit updates: line, bar, area, pie, radar, sparkline
|
|
3
|
+
> Responsive SVG charts with explicit updates: line, bar, area, scatter, pie, radar, sparkline
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
@@ -13,40 +13,29 @@ yarn add @vielzeug/prism
|
|
|
13
13
|
## Quick Start
|
|
14
14
|
|
|
15
15
|
```ts
|
|
16
|
-
import { createLineChart
|
|
16
|
+
import { createLineChart } from '@vielzeug/prism';
|
|
17
17
|
import '@vielzeug/prism/theme.css';
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
const host = document.createElement('div');
|
|
20
|
+
host.style.cssText = 'width:640px;height:320px';
|
|
21
|
+
document.body.append(host);
|
|
21
22
|
|
|
22
|
-
|
|
23
|
-
{
|
|
23
|
+
const chart = createLineChart(host, {
|
|
24
|
+
a11y: { ariaLabel: 'Revenue by month' },
|
|
25
|
+
series: [{
|
|
24
26
|
color: '#3b82f6',
|
|
25
|
-
data: [
|
|
26
|
-
{ key: 1, value: 10 },
|
|
27
|
-
{ key: 2, value: 25 },
|
|
28
|
-
{ key: 3, value: 18 },
|
|
29
|
-
{ key: 4, value: 32 },
|
|
30
|
-
],
|
|
27
|
+
data: [{ key: 1, value: 10 }, { key: 2, value: 25 }, { key: 3, value: 18 }, { key: 4, value: 32 }],
|
|
31
28
|
name: 'Revenue',
|
|
32
|
-
},
|
|
33
|
-
];
|
|
34
|
-
|
|
35
|
-
const chart = createLineChart(document.getElementById('chart')!, {
|
|
36
|
-
a11y: { ariaLabel: 'Revenue by month' },
|
|
37
|
-
series,
|
|
38
|
-
xAxis: { position: 'bottom' },
|
|
39
|
-
yAxis: { position: 'left', grid: true },
|
|
29
|
+
}],
|
|
40
30
|
tooltip: true,
|
|
41
|
-
crosshair: true,
|
|
42
|
-
onHover: (event) => console.log(event?.datum),
|
|
43
31
|
});
|
|
44
32
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
33
|
+
chart.update([{
|
|
34
|
+
color: '#3b82f6',
|
|
35
|
+
data: [{ key: 1, value: 10 }, { key: 2, value: 25 }, { key: 3, value: 18 }, { key: 4, value: 32 }, { key: 5, value: 28 }],
|
|
36
|
+
name: 'Revenue',
|
|
37
|
+
}]);
|
|
48
38
|
|
|
49
|
-
// Cleanup (also works with TC39 `using` declarations)
|
|
50
39
|
chart.dispose();
|
|
51
40
|
```
|
|
52
41
|
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("../svg/element.cjs"),t=require("./easing.cjs"),n=require("./transition.cjs"),r=require("../core/ids.cjs");var i=new WeakMap;function cancelReveal(e){i.get(e)?.()}function playTraceReveal(a,o,s,c,l,u){if(cancelReveal(a),l.duration<=0||u?.aborted)return()=>{};let d=r.uniqueId(`prism-trace`),f=e.createSvgElement(`defs`),p=c/2,m=e.createSvgElement(`mask`,{height:o.height+c,id:d,maskContentUnits:`userSpaceOnUse`,maskUnits:`userSpaceOnUse`,width:o.width+c,x:-p,y:-p}),h=s.map(({d:t})=>{let n=e.createSvgElement(`path`,{d:t,fill:`none`,pathLength:1,stroke:`white`,"stroke-dasharray":`1 1`,"stroke-dashoffset":1,"stroke-width":c});return m.appendChild(n),n});f.appendChild(m),a.insertBefore(f,a.firstChild),a.setAttribute(`mask`,`url(#${d})`);let cancelTween=()=>{},finish=()=>{i.delete(a),a.removeAttribute(`mask`),f.remove(),u?.removeEventListener(`abort`,finish),cancelTween()};return i.set(a,finish),u?.addEventListener(`abort`,finish,{once:!0}),cancelTween=n.startTween({count:1,duration:l.duration,easing:t.resolveEasing(l.easing),onComplete:finish,onFrame:e=>{let t=e(0);for(let[e,n]of h.entries()){let{start:r,end:i}=s[e],a=Math.max(0,Math.min(1,(t-r)/(i-r)));n.setAttribute(`stroke-dashoffset`,String(1-a))}},signal:u}),finish}function playGrowReveal(a,o,s,c,l){if(cancelReveal(a),s(),c.duration<=0||o.length===0||l.signal?.aborted)return()=>{};let u=r.uniqueId(`prism-reveal`),d=e.createSvgElement(`defs`),f=e.createSvgElement(`clipPath`,{id:u}),p=o.map(t=>{let n=e.createSvgElement(`rect`,{height:0,width:0,x:t.x,y:t.y});return f.appendChild(n),n});d.appendChild(f),a.insertBefore(d,a.firstChild),a.setAttribute(`clip-path`,`url(#${u})`);let cancelTween=()=>{},finish=()=>{i.delete(a),a.removeAttribute(`clip-path`),d.remove(),l.signal?.removeEventListener(`abort`,finish),cancelTween()};return i.set(a,finish),l.signal?.addEventListener(`abort`,finish,{once:!0}),cancelTween=n.startTween({count:o.length,duration:c.duration,easing:t.resolveEasing(c.easing),onComplete:finish,onFrame:t=>{for(let[n,r]of p.entries()){let i=o[n],a=Math.max(0,Math.min(1,t(n)));if(l.axis===`y`){let t=i.anchor+(i.y-i.anchor)*a,n=i.anchor+(i.y+i.height-i.anchor)*a;e.setAttributes(r,{height:Math.max(0,n-t),width:i.width,y:t})}else{let t=i.anchor+(i.x-i.anchor)*a,n=i.anchor+(i.x+i.width-i.anchor)*a;e.setAttributes(r,{height:i.height,width:Math.max(0,n-t),x:t})}}},signal:l.signal,stagger:l.stagger}),finish}exports.cancelReveal=cancelReveal,exports.playGrowReveal=playGrowReveal,exports.playTraceReveal=playTraceReveal;
|
|
2
|
+
//# sourceMappingURL=reveal.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reveal.cjs","names":[],"sources":["../../src/animation/reveal.ts"],"sourcesContent":["import { uniqueId } from '../core/ids';\nimport { createSvgElement, setAttributes } from '../svg/element';\nimport type { TransitionConfig } from '../types';\nimport { resolveEasing } from './easing';\nimport { startTween } from './transition';\n\nconst activeReveals = new WeakMap<Element, () => void>();\n\nexport function cancelReveal(parent: Element): void {\n activeReveals.get(parent)?.();\n}\n\n/** Traces final line geometry without replacing its dash or per-datum styling. */\nexport function playTraceReveal(\n parent: SVGGElement,\n bounds: { height: number; width: number },\n paths: readonly { d: string; end: number; start: number }[],\n strokeWidth: number,\n motion: TransitionConfig & { duration: number },\n signal?: AbortSignal,\n): () => void {\n cancelReveal(parent);\n if (motion.duration <= 0 || signal?.aborted) return () => {};\n\n const maskId = uniqueId('prism-trace');\n const host = createSvgElement('defs');\n const padding = strokeWidth / 2;\n const mask = createSvgElement('mask', {\n height: bounds.height + strokeWidth,\n id: maskId,\n maskContentUnits: 'userSpaceOnUse',\n maskUnits: 'userSpaceOnUse',\n width: bounds.width + strokeWidth,\n x: -padding,\n y: -padding,\n });\n const traces = paths.map(({ d }) => {\n const trace = createSvgElement('path', {\n d,\n fill: 'none',\n pathLength: 1,\n stroke: 'white',\n 'stroke-dasharray': '1 1',\n 'stroke-dashoffset': 1,\n 'stroke-width': strokeWidth,\n });\n mask.appendChild(trace);\n return trace;\n });\n host.appendChild(mask);\n parent.insertBefore(host, parent.firstChild);\n parent.setAttribute('mask', `url(#${maskId})`);\n\n let cancelTween: () => void = () => {};\n const finish = (): void => {\n activeReveals.delete(parent);\n parent.removeAttribute('mask');\n host.remove();\n signal?.removeEventListener('abort', finish);\n cancelTween();\n };\n activeReveals.set(parent, finish);\n signal?.addEventListener('abort', finish, { once: true });\n cancelTween = startTween({\n count: 1,\n duration: motion.duration,\n easing: resolveEasing(motion.easing),\n onComplete: finish,\n onFrame: (progress) => {\n const e = progress(0);\n for (const [i, trace] of traces.entries()) {\n const { start, end } = paths[i];\n const revealed = Math.max(0, Math.min(1, (e - start) / (end - start)));\n trace.setAttribute('stroke-dashoffset', String(1 - revealed));\n }\n },\n signal,\n });\n return finish;\n}\n\nexport interface GrowRevealLane {\n anchor: number;\n height: number;\n width: number;\n x: number;\n y: number;\n}\n\n/** Reveals finished bars from their own baseline without distorting rounded corners. */\nexport function playGrowReveal(\n parent: SVGGElement,\n lanes: readonly GrowRevealLane[],\n paintFinal: () => void,\n motion: TransitionConfig & { duration: number },\n options: { axis: 'x' | 'y'; signal?: AbortSignal; stagger?: number },\n): () => void {\n cancelReveal(parent);\n paintFinal();\n if (motion.duration <= 0 || lanes.length === 0 || options.signal?.aborted) return () => {};\n\n const clipId = uniqueId('prism-reveal');\n const host = createSvgElement('defs');\n const clipPath = createSvgElement('clipPath', { id: clipId });\n const rects = lanes.map((lane) => {\n const rect = createSvgElement('rect', { height: 0, width: 0, x: lane.x, y: lane.y });\n clipPath.appendChild(rect);\n return rect;\n });\n host.appendChild(clipPath);\n parent.insertBefore(host, parent.firstChild);\n parent.setAttribute('clip-path', `url(#${clipId})`);\n\n let cancelTween: () => void = () => {};\n const finish = (): void => {\n activeReveals.delete(parent);\n parent.removeAttribute('clip-path');\n host.remove();\n options.signal?.removeEventListener('abort', finish);\n cancelTween();\n };\n activeReveals.set(parent, finish);\n options.signal?.addEventListener('abort', finish, { once: true });\n cancelTween = startTween({\n count: lanes.length,\n duration: motion.duration,\n easing: resolveEasing(motion.easing),\n onComplete: finish,\n onFrame: (progress) => {\n for (const [i, rect] of rects.entries()) {\n const lane = lanes[i];\n const e = Math.max(0, Math.min(1, progress(i)));\n if (options.axis === 'y') {\n const top = lane.anchor + (lane.y - lane.anchor) * e;\n const bottom = lane.anchor + (lane.y + lane.height - lane.anchor) * e;\n setAttributes(rect, { height: Math.max(0, bottom - top), width: lane.width, y: top });\n } else {\n const left = lane.anchor + (lane.x - lane.anchor) * e;\n const right = lane.anchor + (lane.x + lane.width - lane.anchor) * e;\n setAttributes(rect, { height: lane.height, width: Math.max(0, right - left), x: left });\n }\n }\n },\n signal: options.signal,\n stagger: options.stagger,\n });\n return finish;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { TransitionConfig } from '../types';
|
|
2
|
+
export declare function cancelReveal(parent: Element): void;
|
|
3
|
+
/** Traces final line geometry without replacing its dash or per-datum styling. */
|
|
4
|
+
export declare function playTraceReveal(parent: SVGGElement, bounds: {
|
|
5
|
+
height: number;
|
|
6
|
+
width: number;
|
|
7
|
+
}, paths: readonly {
|
|
8
|
+
d: string;
|
|
9
|
+
end: number;
|
|
10
|
+
start: number;
|
|
11
|
+
}[], strokeWidth: number, motion: TransitionConfig & {
|
|
12
|
+
duration: number;
|
|
13
|
+
}, signal?: AbortSignal): () => void;
|
|
14
|
+
export interface GrowRevealLane {
|
|
15
|
+
anchor: number;
|
|
16
|
+
height: number;
|
|
17
|
+
width: number;
|
|
18
|
+
x: number;
|
|
19
|
+
y: number;
|
|
20
|
+
}
|
|
21
|
+
/** Reveals finished bars from their own baseline without distorting rounded corners. */
|
|
22
|
+
export declare function playGrowReveal(parent: SVGGElement, lanes: readonly GrowRevealLane[], paintFinal: () => void, motion: TransitionConfig & {
|
|
23
|
+
duration: number;
|
|
24
|
+
}, options: {
|
|
25
|
+
axis: 'x' | 'y';
|
|
26
|
+
signal?: AbortSignal;
|
|
27
|
+
stagger?: number;
|
|
28
|
+
}): () => void;
|
|
29
|
+
//# sourceMappingURL=reveal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reveal.d.ts","sourceRoot":"","sources":["../../src/animation/reveal.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAMjD,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAElD;AAED,kFAAkF;AAClF,wBAAgB,eAAe,CAC7B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EACzC,KAAK,EAAE,SAAS;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,EAC3D,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,gBAAgB,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,EAC/C,MAAM,CAAC,EAAE,WAAW,GACnB,MAAM,IAAI,CA2DZ;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,wFAAwF;AACxF,wBAAgB,cAAc,CAC5B,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,SAAS,cAAc,EAAE,EAChC,UAAU,EAAE,MAAM,IAAI,EACtB,MAAM,EAAE,gBAAgB,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,EAC/C,OAAO,EAAE;IAAE,IAAI,EAAE,GAAG,GAAG,GAAG,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACnE,MAAM,IAAI,CAmDZ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{createSvgElement as e,setAttributes as t}from"../svg/element.js";import{resolveEasing as n}from"./easing.js";import{startTween as r}from"./transition.js";import{uniqueId as i}from"../core/ids.js";var a=new WeakMap;function cancelReveal(e){a.get(e)?.()}function playTraceReveal(t,o,s,c,l,u){if(cancelReveal(t),l.duration<=0||u?.aborted)return()=>{};let d=i(`prism-trace`),f=e(`defs`),p=c/2,m=e(`mask`,{height:o.height+c,id:d,maskContentUnits:`userSpaceOnUse`,maskUnits:`userSpaceOnUse`,width:o.width+c,x:-p,y:-p}),h=s.map(({d:t})=>{let n=e(`path`,{d:t,fill:`none`,pathLength:1,stroke:`white`,"stroke-dasharray":`1 1`,"stroke-dashoffset":1,"stroke-width":c});return m.appendChild(n),n});f.appendChild(m),t.insertBefore(f,t.firstChild),t.setAttribute(`mask`,`url(#${d})`);let cancelTween=()=>{},finish=()=>{a.delete(t),t.removeAttribute(`mask`),f.remove(),u?.removeEventListener(`abort`,finish),cancelTween()};return a.set(t,finish),u?.addEventListener(`abort`,finish,{once:!0}),cancelTween=r({count:1,duration:l.duration,easing:n(l.easing),onComplete:finish,onFrame:e=>{let t=e(0);for(let[e,n]of h.entries()){let{start:r,end:i}=s[e],a=Math.max(0,Math.min(1,(t-r)/(i-r)));n.setAttribute(`stroke-dashoffset`,String(1-a))}},signal:u}),finish}function playGrowReveal(o,s,c,l,u){if(cancelReveal(o),c(),l.duration<=0||s.length===0||u.signal?.aborted)return()=>{};let d=i(`prism-reveal`),f=e(`defs`),p=e(`clipPath`,{id:d}),m=s.map(t=>{let n=e(`rect`,{height:0,width:0,x:t.x,y:t.y});return p.appendChild(n),n});f.appendChild(p),o.insertBefore(f,o.firstChild),o.setAttribute(`clip-path`,`url(#${d})`);let cancelTween=()=>{},finish=()=>{a.delete(o),o.removeAttribute(`clip-path`),f.remove(),u.signal?.removeEventListener(`abort`,finish),cancelTween()};return a.set(o,finish),u.signal?.addEventListener(`abort`,finish,{once:!0}),cancelTween=r({count:s.length,duration:l.duration,easing:n(l.easing),onComplete:finish,onFrame:e=>{for(let[n,r]of m.entries()){let i=s[n],a=Math.max(0,Math.min(1,e(n)));if(u.axis===`y`){let e=i.anchor+(i.y-i.anchor)*a,n=i.anchor+(i.y+i.height-i.anchor)*a;t(r,{height:Math.max(0,n-e),width:i.width,y:e})}else{let e=i.anchor+(i.x-i.anchor)*a,n=i.anchor+(i.x+i.width-i.anchor)*a;t(r,{height:i.height,width:Math.max(0,n-e),x:e})}}},signal:u.signal,stagger:u.stagger}),finish}export{cancelReveal,playGrowReveal,playTraceReveal};
|
|
2
|
+
//# sourceMappingURL=reveal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reveal.js","names":[],"sources":["../../src/animation/reveal.ts"],"sourcesContent":["import { uniqueId } from '../core/ids';\nimport { createSvgElement, setAttributes } from '../svg/element';\nimport type { TransitionConfig } from '../types';\nimport { resolveEasing } from './easing';\nimport { startTween } from './transition';\n\nconst activeReveals = new WeakMap<Element, () => void>();\n\nexport function cancelReveal(parent: Element): void {\n activeReveals.get(parent)?.();\n}\n\n/** Traces final line geometry without replacing its dash or per-datum styling. */\nexport function playTraceReveal(\n parent: SVGGElement,\n bounds: { height: number; width: number },\n paths: readonly { d: string; end: number; start: number }[],\n strokeWidth: number,\n motion: TransitionConfig & { duration: number },\n signal?: AbortSignal,\n): () => void {\n cancelReveal(parent);\n if (motion.duration <= 0 || signal?.aborted) return () => {};\n\n const maskId = uniqueId('prism-trace');\n const host = createSvgElement('defs');\n const padding = strokeWidth / 2;\n const mask = createSvgElement('mask', {\n height: bounds.height + strokeWidth,\n id: maskId,\n maskContentUnits: 'userSpaceOnUse',\n maskUnits: 'userSpaceOnUse',\n width: bounds.width + strokeWidth,\n x: -padding,\n y: -padding,\n });\n const traces = paths.map(({ d }) => {\n const trace = createSvgElement('path', {\n d,\n fill: 'none',\n pathLength: 1,\n stroke: 'white',\n 'stroke-dasharray': '1 1',\n 'stroke-dashoffset': 1,\n 'stroke-width': strokeWidth,\n });\n mask.appendChild(trace);\n return trace;\n });\n host.appendChild(mask);\n parent.insertBefore(host, parent.firstChild);\n parent.setAttribute('mask', `url(#${maskId})`);\n\n let cancelTween: () => void = () => {};\n const finish = (): void => {\n activeReveals.delete(parent);\n parent.removeAttribute('mask');\n host.remove();\n signal?.removeEventListener('abort', finish);\n cancelTween();\n };\n activeReveals.set(parent, finish);\n signal?.addEventListener('abort', finish, { once: true });\n cancelTween = startTween({\n count: 1,\n duration: motion.duration,\n easing: resolveEasing(motion.easing),\n onComplete: finish,\n onFrame: (progress) => {\n const e = progress(0);\n for (const [i, trace] of traces.entries()) {\n const { start, end } = paths[i];\n const revealed = Math.max(0, Math.min(1, (e - start) / (end - start)));\n trace.setAttribute('stroke-dashoffset', String(1 - revealed));\n }\n },\n signal,\n });\n return finish;\n}\n\nexport interface GrowRevealLane {\n anchor: number;\n height: number;\n width: number;\n x: number;\n y: number;\n}\n\n/** Reveals finished bars from their own baseline without distorting rounded corners. */\nexport function playGrowReveal(\n parent: SVGGElement,\n lanes: readonly GrowRevealLane[],\n paintFinal: () => void,\n motion: TransitionConfig & { duration: number },\n options: { axis: 'x' | 'y'; signal?: AbortSignal; stagger?: number },\n): () => void {\n cancelReveal(parent);\n paintFinal();\n if (motion.duration <= 0 || lanes.length === 0 || options.signal?.aborted) return () => {};\n\n const clipId = uniqueId('prism-reveal');\n const host = createSvgElement('defs');\n const clipPath = createSvgElement('clipPath', { id: clipId });\n const rects = lanes.map((lane) => {\n const rect = createSvgElement('rect', { height: 0, width: 0, x: lane.x, y: lane.y });\n clipPath.appendChild(rect);\n return rect;\n });\n host.appendChild(clipPath);\n parent.insertBefore(host, parent.firstChild);\n parent.setAttribute('clip-path', `url(#${clipId})`);\n\n let cancelTween: () => void = () => {};\n const finish = (): void => {\n activeReveals.delete(parent);\n parent.removeAttribute('clip-path');\n host.remove();\n options.signal?.removeEventListener('abort', finish);\n cancelTween();\n };\n activeReveals.set(parent, finish);\n options.signal?.addEventListener('abort', finish, { once: true });\n cancelTween = startTween({\n count: lanes.length,\n duration: motion.duration,\n easing: resolveEasing(motion.easing),\n onComplete: finish,\n onFrame: (progress) => {\n for (const [i, rect] of rects.entries()) {\n const lane = lanes[i];\n const e = Math.max(0, Math.min(1, progress(i)));\n if (options.axis === 'y') {\n const top = lane.anchor + (lane.y - lane.anchor) * e;\n const bottom = lane.anchor + (lane.y + lane.height - lane.anchor) * e;\n setAttributes(rect, { height: Math.max(0, bottom - top), width: lane.width, y: top });\n } else {\n const left = lane.anchor + (lane.x - lane.anchor) * e;\n const right = lane.anchor + (lane.x + lane.width - lane.anchor) * e;\n setAttributes(rect, { height: lane.height, width: Math.max(0, right - left), x: left });\n }\n }\n },\n signal: options.signal,\n stagger: options.stagger,\n });\n return finish;\n}\n"],"mappings":"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"}
|
package/dist/axes/axis.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../svg/element.cjs"),t=require("../svg/text.cjs"),n=require("./scale-utils.cjs");var r=11,i=8,defaultTickFormat=e=>e instanceof Date?e.toLocaleDateString(void 0,{month:`short`,year:`numeric`}):String(e);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,n,a,o){if(e.length===0)return 0;let s=o?Math.max(...e.map(e=>t.estimateTextWidth(n(e),r))):r*1.3;return Math.max(1,Math.min(e.length,Math.floor(a/(s+i))))}function renderAxis(r,i,a,o,s=`bottom`){e.removeChildren(r);let c=a.position??s,l=c===`bottom`||c===`top`,u=c===`top`||c===`left`,d=u?-1:1,f=e.createSvgElement(`line`,{"aria-hidden":`true`,class:`prism-axis-line`,x1:0,x2:l?o:0,y1:0,y2:l?0:o});r.appendChild(f);let p=a.tickFormat??defaultTickFormat,m=a.tickCount===void 0&&`bandwidth`in i?categoryTickCount(i.domain,p,o,l):resolveTickCount(a,o,s)
|
|
1
|
+
require("../_dev.cjs");const e=require("../svg/element.cjs"),t=require("../svg/text.cjs"),n=require("./scale-utils.cjs");var r=11,i=8,a=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?a.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,n,a,o){if(e.length===0)return 0;let s=o?Math.max(...e.map(e=>t.estimateTextWidth(n(e),r))):r*1.3;return Math.max(1,Math.min(e.length,Math.floor(a/(s+i))))}function renderAxis(r,i,a,o,s=`bottom`){e.removeChildren(r);let c=a.position??s,l=c===`bottom`||c===`top`,u=c===`top`||c===`left`,d=u?-1:1,f=e.createSvgElement(`line`,{"aria-hidden":`true`,class:`prism-axis-line`,x1:0,x2:l?o:0,y1:0,y2:l?0:o});r.appendChild(f);let p=a.tickFormat??defaultTickFormat,m=resolveTicks(i,a,a.tickCount===void 0&&`bandwidth`in i?categoryTickCount(i.domain,p,o,l):resolveTickCount(a,o,s));a.tickValues&&a.tickValues;for(let a of m){let o=n.mapTick(i,a),s=e.createSvgElement(`line`,{"aria-hidden":`true`,class:`prism-axis-tick`,x1:l?o:0,x2:l?o:6*d,y1:l?0:o,y2:l?6*d:o});r.appendChild(s);let c=t.createTextElement(p(a),{"aria-hidden":`true`,class:`prism-axis-label`,"dominant-baseline":l?u?`auto`:`hanging`:`middle`,"text-anchor":l?`middle`:u?`end`:`start`,x:l?o:6*d*1.5,y:l?6*d*1.5:o});r.appendChild(c)}if(a.label){let n=t.createTextElement(a.label,{class:`prism-axis-title`,"dominant-baseline":`middle`,"text-anchor":`middle`});l?e.setAttributes(n,{x:o/2,y:6*d*6}):e.setAttributes(n,{transform:`translate(${6*d*7}, ${o/2}) rotate(-90)`}),r.appendChild(n)}}exports.positionAxis=positionAxis,exports.renderAxis=renderAxis,exports.resolveTickCount=resolveTickCount,exports.resolveTicks=resolveTicks;
|
|
2
2
|
//# sourceMappingURL=axis.cjs.map
|
package/dist/axes/axis.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"axis.cjs","names":[],"sources":["../../src/axes/axis.ts"],"sourcesContent":["import { createSvgElement, removeChildren, setAttributes } from '../svg/element';\nimport { createTextElement, estimateTextWidth } from '../svg/text';\nimport type { AxisConfig, AxisPosition } from '../types';\nimport { type AnyScale, mapTick } from './scale-utils';\n\n/** Default `--prism-font-size-label` in px, used to estimate category label size. */\nconst LABEL_FONT_SIZE = 11;\nconst LABEL_GAP = 8;\n\nconst defaultTickFormat = (v: Date | number | string): string
|
|
1
|
+
{"version":3,"file":"axis.cjs","names":[],"sources":["../../src/axes/axis.ts"],"sourcesContent":["import { devOnly, warn } from '../_dev';\nimport { createSvgElement, removeChildren, setAttributes } from '../svg/element';\nimport { createTextElement, estimateTextWidth } from '../svg/text';\nimport type { AxisConfig, AxisPosition } from '../types';\nimport { type AnyScale, mapTick } from './scale-utils';\n\n/** Default `--prism-font-size-label` in px, used to estimate category label size. */\nconst LABEL_FONT_SIZE = 11;\nconst LABEL_GAP = 8;\n\nconst COMPACT = new Intl.NumberFormat(undefined, { maximumSignificantDigits: 3, notation: 'compact' });\n\n/**\n * Dates localize; magnitudes of 1e5 and above render in compact notation (\"123K\",\n * \"1.23M\") so a long number cannot crop against the default 50 px value-axis margin.\n * With three significant digits every compact label is at most as wide as \"99999\",\n * the widest plain label below the threshold. Opt out with `tickFormat: String`.\n */\nconst defaultTickFormat = (v: Date | number | string): string => {\n if (v instanceof Date) return v.toLocaleDateString(undefined, { month: 'short', year: 'numeric' });\n if (typeof v === 'number' && Math.abs(v) >= 1e5) return COMPACT.format(v);\n\n return String(v);\n};\n\n/**\n * The single tick source for an axis and its gridlines: explicit `tickValues` when set,\n * scale-generated ticks otherwise. Keeping grid on this same array is what stops\n * gridlines from drifting off the rendered ticks.\n */\nexport function resolveTicks(scale: AnyScale, config: AxisConfig, tickCount: number): (Date | number | string)[] {\n return config.tickValues ? [...config.tickValues] : scale.ticks(tickCount);\n}\n\n/** Development-only check that explicit tickValues match the scale they render on. */\nfunction warnOffScaleTicks(scale: AnyScale, tickValues: ReadonlyArray<Date | number | string>): void {\n devOnly(() => {\n if ('bandwidth' in scale) {\n for (const tick of tickValues) {\n if (!scale.domain.includes(tick as string)) {\n warn(`renderAxis: tickValue \"${String(tick)}\" is not a category in the band scale's domain.`);\n }\n }\n\n return;\n }\n\n const toMs = (v: Date | number): number => (v instanceof Date ? v.getTime() : v);\n const [a, b] = scale.domain;\n const lo = Math.min(toMs(a), toMs(b));\n const hi = Math.max(toMs(a), toMs(b));\n\n for (const tick of tickValues) {\n const value = tick instanceof Date ? tick.getTime() : Number(tick);\n\n if (Number.isNaN(value) || value < lo || value > hi) {\n warn(`renderAxis: tickValue \"${String(tick)}\" is outside the axis domain and renders off-canvas.`);\n }\n }\n });\n}\n\n/**\n * Resolves the tick count an axis will render for a given scale/length: charts pass it to\n * `resolveTicks` for both the axis and its gridlines so the two stay aligned.\n * `defaultPosition` must match the one passed to the corresponding `renderAxis` call\n * ('bottom' for xAxis, 'left' for yAxis).\n */\nexport function positionAxis(parent: SVGGElement, position: AxisPosition, width: number, height: number): void {\n const transform =\n position === 'bottom' ? `translate(0,${height})` : position === 'right' ? `translate(${width},0)` : undefined;\n\n if (transform) parent.setAttribute('transform', transform);\n else parent.removeAttribute('transform');\n}\n\nexport function resolveTickCount(config: AxisConfig, length: number, defaultPosition: AxisPosition): number {\n const position = config.position ?? defaultPosition;\n const isHorizontal = position === 'bottom' || position === 'top';\n const defaultTickCount = isHorizontal ? Math.max(2, Math.floor(length / 80)) : Math.max(2, Math.floor(length / 50));\n\n return config.tickCount ?? defaultTickCount;\n}\n\n/** How many category labels fit along the axis without their estimated boxes overlapping. */\nfunction categoryTickCount(\n domain: readonly string[],\n format: (value: string) => string,\n length: number,\n isHorizontal: boolean,\n): number {\n if (domain.length === 0) return 0;\n\n const size = isHorizontal\n ? Math.max(...domain.map((value) => estimateTextWidth(format(value), LABEL_FONT_SIZE)))\n : LABEL_FONT_SIZE * 1.3;\n\n return Math.max(1, Math.min(domain.length, Math.floor(length / (size + LABEL_GAP))));\n}\n\n/**\n * `defaultPosition` is applied when `config.position` is unset: pass `'bottom'` for an\n * xAxis call and `'left'` for a yAxis call so an unconfigured axis renders on its\n * conventional side instead of always defaulting to a horizontal bottom axis.\n */\nexport function renderAxis(\n parent: SVGGElement,\n scale: AnyScale,\n config: AxisConfig,\n length: number,\n defaultPosition: AxisPosition = 'bottom',\n): void {\n removeChildren(parent);\n\n const position = config.position ?? defaultPosition;\n const isHorizontal = position === 'bottom' || position === 'top';\n const isInverted = position === 'top' || position === 'left';\n const tickSize = 6;\n const tickDirection = isInverted ? -1 : 1;\n\n const axisLine = createSvgElement('line', {\n 'aria-hidden': 'true',\n class: 'prism-axis-line',\n x1: isHorizontal ? 0 : 0,\n x2: isHorizontal ? length : 0,\n y1: isHorizontal ? 0 : 0,\n y2: isHorizontal ? 0 : length,\n });\n\n parent.appendChild(axisLine);\n\n const format = config.tickFormat ?? defaultTickFormat;\n const tickCount =\n config.tickCount === undefined && 'bandwidth' in scale\n ? categoryTickCount(scale.domain, format, length, isHorizontal)\n : resolveTickCount(config, length, defaultPosition);\n const ticks = resolveTicks(scale, config, tickCount);\n\n if (config.tickValues) warnOffScaleTicks(scale, config.tickValues);\n\n for (const tick of ticks) {\n const pos = mapTick(scale, tick);\n const tickLine = createSvgElement('line', {\n 'aria-hidden': 'true',\n class: 'prism-axis-tick',\n x1: isHorizontal ? pos : 0,\n x2: isHorizontal ? pos : tickSize * tickDirection,\n y1: isHorizontal ? 0 : pos,\n y2: isHorizontal ? tickSize * tickDirection : pos,\n });\n\n parent.appendChild(tickLine);\n\n const label = createTextElement(format(tick), {\n 'aria-hidden': 'true',\n class: 'prism-axis-label',\n 'dominant-baseline': isHorizontal ? (isInverted ? 'auto' : 'hanging') : 'middle',\n 'text-anchor': isHorizontal ? 'middle' : isInverted ? 'end' : 'start',\n x: isHorizontal ? pos : tickSize * tickDirection * 1.5,\n y: isHorizontal ? tickSize * tickDirection * 1.5 : pos,\n });\n\n parent.appendChild(label);\n }\n\n if (config.label) {\n const labelEl = createTextElement(config.label, {\n class: 'prism-axis-title',\n 'dominant-baseline': 'middle',\n 'text-anchor': 'middle',\n });\n\n if (isHorizontal) {\n setAttributes(labelEl, { x: length / 2, y: tickSize * tickDirection * 6 });\n } else {\n setAttributes(labelEl, {\n transform: `translate(${tickSize * tickDirection * 7}, ${length / 2}) rotate(-90)`,\n });\n }\n\n parent.appendChild(labelEl);\n }\n}\n"],"mappings":"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"}
|
package/dist/axes/axis.d.ts
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
import type { AxisConfig, AxisPosition } from '../types';
|
|
2
2
|
import { type AnyScale } from './scale-utils';
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* The single tick source for an axis and its gridlines: explicit `tickValues` when set,
|
|
5
|
+
* scale-generated ticks otherwise. Keeping grid on this same array is what stops
|
|
6
|
+
* gridlines from drifting off the rendered ticks.
|
|
7
|
+
*/
|
|
8
|
+
export declare function resolveTicks(scale: AnyScale, config: AxisConfig, tickCount: number): (Date | number | string)[];
|
|
9
|
+
/**
|
|
10
|
+
* Resolves the tick count an axis will render for a given scale/length: charts pass it to
|
|
11
|
+
* `resolveTicks` for both the axis and its gridlines so the two stay aligned.
|
|
12
|
+
* `defaultPosition` must match the one passed to the corresponding `renderAxis` call
|
|
13
|
+
* ('bottom' for xAxis, 'left' for yAxis).
|
|
7
14
|
*/
|
|
8
15
|
export declare function positionAxis(parent: SVGGElement, position: AxisPosition, width: number, height: number): void;
|
|
9
16
|
export declare function resolveTickCount(config: AxisConfig, length: number, defaultPosition: AxisPosition): number;
|
package/dist/axes/axis.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"axis.d.ts","sourceRoot":"","sources":["../../src/axes/axis.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"axis.d.ts","sourceRoot":"","sources":["../../src/axes/axis.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACzD,OAAO,EAAE,KAAK,QAAQ,EAAW,MAAM,eAAe,CAAC;AAqBvD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,CAAC,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC,EAAE,CAE/G;AA8BD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAM7G;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,YAAY,GAAG,MAAM,CAM1G;AAkBD;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,MAAM,EACd,eAAe,GAAE,YAAuB,GACvC,IAAI,CAuEN"}
|
package/dist/axes/axis.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{createSvgElement as e,removeChildren as t,setAttributes as n}from"../svg/element.js";import{createTextElement as r,estimateTextWidth as i}from"../svg/text.js";import{mapTick as a}from"./scale-utils.js";var o=11,s=8,defaultTickFormat=e=>e instanceof Date?e.toLocaleDateString(void 0,{month:`short`,year:`numeric`}):String(e);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 a=r?Math.max(...e.map(e=>i(t(e),o))):o*1.3;return Math.max(1,Math.min(e.length,Math.floor(n/(a+s))))}function renderAxis(i,o,s,c,l=`bottom`){t(i);let u=s.position??l,d=u===`bottom`||u===`top`,f=u===`top`||u===`left`,p=f?-1:1,m=e(`line`,{"aria-hidden":`true`,class:`prism-axis-line`,x1:0,x2:d?c:0,y1:0,y2:d?0:c});i.appendChild(m);let h=s.tickFormat??defaultTickFormat,g=s.tickCount===void 0&&`bandwidth`in o?categoryTickCount(o.domain,h,c,d):resolveTickCount(s,c,l)
|
|
1
|
+
import"../_dev.js";import{createSvgElement as e,removeChildren as t,setAttributes as n}from"../svg/element.js";import{createTextElement as r,estimateTextWidth as i}from"../svg/text.js";import{mapTick as a}from"./scale-utils.js";var o=11,s=8,c=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?c.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 a=r?Math.max(...e.map(e=>i(t(e),o))):o*1.3;return Math.max(1,Math.min(e.length,Math.floor(n/(a+s))))}function renderAxis(i,o,s,c,l=`bottom`){t(i);let u=s.position??l,d=u===`bottom`||u===`top`,f=u===`top`||u===`left`,p=f?-1:1,m=e(`line`,{"aria-hidden":`true`,class:`prism-axis-line`,x1:0,x2:d?c:0,y1:0,y2:d?0:c});i.appendChild(m);let h=s.tickFormat??defaultTickFormat,g=resolveTicks(o,s,s.tickCount===void 0&&`bandwidth`in o?categoryTickCount(o.domain,h,c,d):resolveTickCount(s,c,l));s.tickValues&&s.tickValues;for(let t of g){let n=a(o,t),s=e(`line`,{"aria-hidden":`true`,class:`prism-axis-tick`,x1:d?n:0,x2:d?n:6*p,y1:d?0:n,y2:d?6*p:n});i.appendChild(s);let c=r(h(t),{"aria-hidden":`true`,class:`prism-axis-label`,"dominant-baseline":d?f?`auto`:`hanging`:`middle`,"text-anchor":d?`middle`:f?`end`:`start`,x:d?n:6*p*1.5,y:d?6*p*1.5:n});i.appendChild(c)}if(s.label){let e=r(s.label,{class:`prism-axis-title`,"dominant-baseline":`middle`,"text-anchor":`middle`});d?n(e,{x:c/2,y:6*p*6}):n(e,{transform:`translate(${6*p*7}, ${c/2}) rotate(-90)`}),i.appendChild(e)}}export{positionAxis,renderAxis,resolveTickCount,resolveTicks};
|
|
2
2
|
//# sourceMappingURL=axis.js.map
|
package/dist/axes/axis.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"axis.js","names":[],"sources":["../../src/axes/axis.ts"],"sourcesContent":["import { createSvgElement, removeChildren, setAttributes } from '../svg/element';\nimport { createTextElement, estimateTextWidth } from '../svg/text';\nimport type { AxisConfig, AxisPosition } from '../types';\nimport { type AnyScale, mapTick } from './scale-utils';\n\n/** Default `--prism-font-size-label` in px, used to estimate category label size. */\nconst LABEL_FONT_SIZE = 11;\nconst LABEL_GAP = 8;\n\nconst defaultTickFormat = (v: Date | number | string): string
|
|
1
|
+
{"version":3,"file":"axis.js","names":[],"sources":["../../src/axes/axis.ts"],"sourcesContent":["import { devOnly, warn } from '../_dev';\nimport { createSvgElement, removeChildren, setAttributes } from '../svg/element';\nimport { createTextElement, estimateTextWidth } from '../svg/text';\nimport type { AxisConfig, AxisPosition } from '../types';\nimport { type AnyScale, mapTick } from './scale-utils';\n\n/** Default `--prism-font-size-label` in px, used to estimate category label size. */\nconst LABEL_FONT_SIZE = 11;\nconst LABEL_GAP = 8;\n\nconst COMPACT = new Intl.NumberFormat(undefined, { maximumSignificantDigits: 3, notation: 'compact' });\n\n/**\n * Dates localize; magnitudes of 1e5 and above render in compact notation (\"123K\",\n * \"1.23M\") so a long number cannot crop against the default 50 px value-axis margin.\n * With three significant digits every compact label is at most as wide as \"99999\",\n * the widest plain label below the threshold. Opt out with `tickFormat: String`.\n */\nconst defaultTickFormat = (v: Date | number | string): string => {\n if (v instanceof Date) return v.toLocaleDateString(undefined, { month: 'short', year: 'numeric' });\n if (typeof v === 'number' && Math.abs(v) >= 1e5) return COMPACT.format(v);\n\n return String(v);\n};\n\n/**\n * The single tick source for an axis and its gridlines: explicit `tickValues` when set,\n * scale-generated ticks otherwise. Keeping grid on this same array is what stops\n * gridlines from drifting off the rendered ticks.\n */\nexport function resolveTicks(scale: AnyScale, config: AxisConfig, tickCount: number): (Date | number | string)[] {\n return config.tickValues ? [...config.tickValues] : scale.ticks(tickCount);\n}\n\n/** Development-only check that explicit tickValues match the scale they render on. */\nfunction warnOffScaleTicks(scale: AnyScale, tickValues: ReadonlyArray<Date | number | string>): void {\n devOnly(() => {\n if ('bandwidth' in scale) {\n for (const tick of tickValues) {\n if (!scale.domain.includes(tick as string)) {\n warn(`renderAxis: tickValue \"${String(tick)}\" is not a category in the band scale's domain.`);\n }\n }\n\n return;\n }\n\n const toMs = (v: Date | number): number => (v instanceof Date ? v.getTime() : v);\n const [a, b] = scale.domain;\n const lo = Math.min(toMs(a), toMs(b));\n const hi = Math.max(toMs(a), toMs(b));\n\n for (const tick of tickValues) {\n const value = tick instanceof Date ? tick.getTime() : Number(tick);\n\n if (Number.isNaN(value) || value < lo || value > hi) {\n warn(`renderAxis: tickValue \"${String(tick)}\" is outside the axis domain and renders off-canvas.`);\n }\n }\n });\n}\n\n/**\n * Resolves the tick count an axis will render for a given scale/length: charts pass it to\n * `resolveTicks` for both the axis and its gridlines so the two stay aligned.\n * `defaultPosition` must match the one passed to the corresponding `renderAxis` call\n * ('bottom' for xAxis, 'left' for yAxis).\n */\nexport function positionAxis(parent: SVGGElement, position: AxisPosition, width: number, height: number): void {\n const transform =\n position === 'bottom' ? `translate(0,${height})` : position === 'right' ? `translate(${width},0)` : undefined;\n\n if (transform) parent.setAttribute('transform', transform);\n else parent.removeAttribute('transform');\n}\n\nexport function resolveTickCount(config: AxisConfig, length: number, defaultPosition: AxisPosition): number {\n const position = config.position ?? defaultPosition;\n const isHorizontal = position === 'bottom' || position === 'top';\n const defaultTickCount = isHorizontal ? Math.max(2, Math.floor(length / 80)) : Math.max(2, Math.floor(length / 50));\n\n return config.tickCount ?? defaultTickCount;\n}\n\n/** How many category labels fit along the axis without their estimated boxes overlapping. */\nfunction categoryTickCount(\n domain: readonly string[],\n format: (value: string) => string,\n length: number,\n isHorizontal: boolean,\n): number {\n if (domain.length === 0) return 0;\n\n const size = isHorizontal\n ? Math.max(...domain.map((value) => estimateTextWidth(format(value), LABEL_FONT_SIZE)))\n : LABEL_FONT_SIZE * 1.3;\n\n return Math.max(1, Math.min(domain.length, Math.floor(length / (size + LABEL_GAP))));\n}\n\n/**\n * `defaultPosition` is applied when `config.position` is unset: pass `'bottom'` for an\n * xAxis call and `'left'` for a yAxis call so an unconfigured axis renders on its\n * conventional side instead of always defaulting to a horizontal bottom axis.\n */\nexport function renderAxis(\n parent: SVGGElement,\n scale: AnyScale,\n config: AxisConfig,\n length: number,\n defaultPosition: AxisPosition = 'bottom',\n): void {\n removeChildren(parent);\n\n const position = config.position ?? defaultPosition;\n const isHorizontal = position === 'bottom' || position === 'top';\n const isInverted = position === 'top' || position === 'left';\n const tickSize = 6;\n const tickDirection = isInverted ? -1 : 1;\n\n const axisLine = createSvgElement('line', {\n 'aria-hidden': 'true',\n class: 'prism-axis-line',\n x1: isHorizontal ? 0 : 0,\n x2: isHorizontal ? length : 0,\n y1: isHorizontal ? 0 : 0,\n y2: isHorizontal ? 0 : length,\n });\n\n parent.appendChild(axisLine);\n\n const format = config.tickFormat ?? defaultTickFormat;\n const tickCount =\n config.tickCount === undefined && 'bandwidth' in scale\n ? categoryTickCount(scale.domain, format, length, isHorizontal)\n : resolveTickCount(config, length, defaultPosition);\n const ticks = resolveTicks(scale, config, tickCount);\n\n if (config.tickValues) warnOffScaleTicks(scale, config.tickValues);\n\n for (const tick of ticks) {\n const pos = mapTick(scale, tick);\n const tickLine = createSvgElement('line', {\n 'aria-hidden': 'true',\n class: 'prism-axis-tick',\n x1: isHorizontal ? pos : 0,\n x2: isHorizontal ? pos : tickSize * tickDirection,\n y1: isHorizontal ? 0 : pos,\n y2: isHorizontal ? tickSize * tickDirection : pos,\n });\n\n parent.appendChild(tickLine);\n\n const label = createTextElement(format(tick), {\n 'aria-hidden': 'true',\n class: 'prism-axis-label',\n 'dominant-baseline': isHorizontal ? (isInverted ? 'auto' : 'hanging') : 'middle',\n 'text-anchor': isHorizontal ? 'middle' : isInverted ? 'end' : 'start',\n x: isHorizontal ? pos : tickSize * tickDirection * 1.5,\n y: isHorizontal ? tickSize * tickDirection * 1.5 : pos,\n });\n\n parent.appendChild(label);\n }\n\n if (config.label) {\n const labelEl = createTextElement(config.label, {\n class: 'prism-axis-title',\n 'dominant-baseline': 'middle',\n 'text-anchor': 'middle',\n });\n\n if (isHorizontal) {\n setAttributes(labelEl, { x: length / 2, y: tickSize * tickDirection * 6 });\n } else {\n setAttributes(labelEl, {\n transform: `translate(${tickSize * tickDirection * 7}, ${length / 2}) rotate(-90)`,\n });\n }\n\n parent.appendChild(labelEl);\n }\n}\n"],"mappings":"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"}
|
package/dist/axes/grid.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../svg/element.cjs"),t=require("./scale-utils.cjs");function renderGrid(n,r,i,a,o,s
|
|
1
|
+
const e=require("../svg/element.cjs"),t=require("./scale-utils.cjs");function renderGrid(n,r,i,a,o,s){e.removeChildren(n);let c=i!==!0&&i.color||void 0,l=i!==!0&&i.dash||void 0;for(let i of s){let s=t.mapTick(r,i),u={class:`prism-grid-line`,stroke:c??`var(--prism-grid-color)`,"stroke-dasharray":l,"stroke-opacity":`var(--prism-grid-opacity)`};o===`vertical`?Object.assign(u,{x1:s,x2:s,y1:0,y2:a}):Object.assign(u,{x1:0,x2:a,y1:s,y2:s}),n.appendChild(e.createSvgElement(`line`,u))}}exports.renderGrid=renderGrid;
|
|
2
2
|
//# sourceMappingURL=grid.cjs.map
|
package/dist/axes/grid.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grid.cjs","names":[],"sources":["../../src/axes/grid.ts"],"sourcesContent":["import { createSvgElement, removeChildren } from '../svg/element';\nimport type { GridConfig } from '../types';\nimport { type AnyScale, mapTick } from './scale-utils';\n\nexport function renderGrid(\n parent: SVGGElement,\n scale: AnyScale,\n config: GridConfig | true,\n crossLength: number,\n direction: 'horizontal' | 'vertical',\n
|
|
1
|
+
{"version":3,"file":"grid.cjs","names":[],"sources":["../../src/axes/grid.ts"],"sourcesContent":["import { createSvgElement, removeChildren } from '../svg/element';\nimport type { GridConfig } from '../types';\nimport { type AnyScale, mapTick } from './scale-utils';\n\nexport function renderGrid(\n parent: SVGGElement,\n scale: AnyScale,\n config: GridConfig | true,\n crossLength: number,\n direction: 'horizontal' | 'vertical',\n ticks: readonly (Date | number | string)[],\n): void {\n removeChildren(parent);\n\n const color = (config !== true && config.color) || undefined;\n const dash = (config !== true && config.dash) || undefined;\n\n for (const tick of ticks) {\n const pos = mapTick(scale, tick);\n const attrs: Record<string, number | string | undefined> = {\n class: 'prism-grid-line',\n stroke: color ?? 'var(--prism-grid-color)',\n 'stroke-dasharray': dash,\n 'stroke-opacity': 'var(--prism-grid-opacity)',\n };\n\n if (direction === 'vertical') {\n Object.assign(attrs, { x1: pos, x2: pos, y1: 0, y2: crossLength });\n } else {\n Object.assign(attrs, { x1: 0, x2: crossLength, y1: pos, y2: pos });\n }\n\n parent.appendChild(createSvgElement('line', attrs));\n }\n}\n"],"mappings":"qEAIA,SAAgB,WACd,EACA,EACA,EACA,EACA,EACA,EACM,CACN,EAAA,eAAe,CAAM,EAErB,IAAM,EAAS,IAAW,IAAQ,EAAO,OAAU,IAAA,GAC7C,EAAQ,IAAW,IAAQ,EAAO,MAAS,IAAA,GAEjD,IAAK,IAAM,KAAQ,EAAO,CACxB,IAAM,EAAM,EAAA,QAAQ,EAAO,CAAI,EACzB,EAAqD,CACzD,MAAO,kBACP,OAAQ,GAAS,0BACjB,mBAAoB,EACpB,iBAAkB,2BACpB,EAEI,IAAc,WAChB,OAAO,OAAO,EAAO,CAAE,GAAI,EAAK,GAAI,EAAK,GAAI,EAAG,GAAI,CAAY,CAAC,EAEjE,OAAO,OAAO,EAAO,CAAE,GAAI,EAAG,GAAI,EAAa,GAAI,EAAK,GAAI,CAAI,CAAC,EAGnE,EAAO,YAAY,EAAA,iBAAiB,OAAQ,CAAK,CAAC,CACpD,CACF"}
|
package/dist/axes/grid.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { GridConfig } from '../types';
|
|
2
2
|
import { type AnyScale } from './scale-utils';
|
|
3
|
-
export declare function renderGrid(parent: SVGGElement, scale: AnyScale, config: GridConfig | true, crossLength: number, direction: 'horizontal' | 'vertical',
|
|
3
|
+
export declare function renderGrid(parent: SVGGElement, scale: AnyScale, config: GridConfig | true, crossLength: number, direction: 'horizontal' | 'vertical', ticks: readonly (Date | number | string)[]): void;
|
|
4
4
|
//# sourceMappingURL=grid.d.ts.map
|
package/dist/axes/grid.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grid.d.ts","sourceRoot":"","sources":["../../src/axes/grid.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,KAAK,QAAQ,EAAW,MAAM,eAAe,CAAC;AAEvD,wBAAgB,UAAU,CACxB,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE,UAAU,GAAG,IAAI,EACzB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,YAAY,GAAG,UAAU,EACpC,SAAS,
|
|
1
|
+
{"version":3,"file":"grid.d.ts","sourceRoot":"","sources":["../../src/axes/grid.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,KAAK,QAAQ,EAAW,MAAM,eAAe,CAAC;AAEvD,wBAAgB,UAAU,CACxB,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE,UAAU,GAAG,IAAI,EACzB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,YAAY,GAAG,UAAU,EACpC,KAAK,EAAE,SAAS,CAAC,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC,EAAE,GACzC,IAAI,CAuBN"}
|
package/dist/axes/grid.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{createSvgElement as e,removeChildren as t}from"../svg/element.js";import{mapTick as n}from"./scale-utils.js";function renderGrid(r,i,a,o,s,c
|
|
1
|
+
import{createSvgElement as e,removeChildren as t}from"../svg/element.js";import{mapTick as n}from"./scale-utils.js";function renderGrid(r,i,a,o,s,c){t(r);let l=a!==!0&&a.color||void 0,u=a!==!0&&a.dash||void 0;for(let t of c){let a=n(i,t),c={class:`prism-grid-line`,stroke:l??`var(--prism-grid-color)`,"stroke-dasharray":u,"stroke-opacity":`var(--prism-grid-opacity)`};s===`vertical`?Object.assign(c,{x1:a,x2:a,y1:0,y2:o}):Object.assign(c,{x1:0,x2:o,y1:a,y2:a}),r.appendChild(e(`line`,c))}}export{renderGrid};
|
|
2
2
|
//# sourceMappingURL=grid.js.map
|
package/dist/axes/grid.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grid.js","names":[],"sources":["../../src/axes/grid.ts"],"sourcesContent":["import { createSvgElement, removeChildren } from '../svg/element';\nimport type { GridConfig } from '../types';\nimport { type AnyScale, mapTick } from './scale-utils';\n\nexport function renderGrid(\n parent: SVGGElement,\n scale: AnyScale,\n config: GridConfig | true,\n crossLength: number,\n direction: 'horizontal' | 'vertical',\n
|
|
1
|
+
{"version":3,"file":"grid.js","names":[],"sources":["../../src/axes/grid.ts"],"sourcesContent":["import { createSvgElement, removeChildren } from '../svg/element';\nimport type { GridConfig } from '../types';\nimport { type AnyScale, mapTick } from './scale-utils';\n\nexport function renderGrid(\n parent: SVGGElement,\n scale: AnyScale,\n config: GridConfig | true,\n crossLength: number,\n direction: 'horizontal' | 'vertical',\n ticks: readonly (Date | number | string)[],\n): void {\n removeChildren(parent);\n\n const color = (config !== true && config.color) || undefined;\n const dash = (config !== true && config.dash) || undefined;\n\n for (const tick of ticks) {\n const pos = mapTick(scale, tick);\n const attrs: Record<string, number | string | undefined> = {\n class: 'prism-grid-line',\n stroke: color ?? 'var(--prism-grid-color)',\n 'stroke-dasharray': dash,\n 'stroke-opacity': 'var(--prism-grid-opacity)',\n };\n\n if (direction === 'vertical') {\n Object.assign(attrs, { x1: pos, x2: pos, y1: 0, y2: crossLength });\n } else {\n Object.assign(attrs, { x1: 0, x2: crossLength, y1: pos, y2: pos });\n }\n\n parent.appendChild(createSvgElement('line', attrs));\n }\n}\n"],"mappings":"oHAIA,SAAgB,WACd,EACA,EACA,EACA,EACA,EACA,EACM,CACN,EAAe,CAAM,EAErB,IAAM,EAAS,IAAW,IAAQ,EAAO,OAAU,IAAA,GAC7C,EAAQ,IAAW,IAAQ,EAAO,MAAS,IAAA,GAEjD,IAAK,IAAM,KAAQ,EAAO,CACxB,IAAM,EAAM,EAAQ,EAAO,CAAI,EACzB,EAAqD,CACzD,MAAO,kBACP,OAAQ,GAAS,0BACjB,mBAAoB,EACpB,iBAAkB,2BACpB,EAEI,IAAc,WAChB,OAAO,OAAO,EAAO,CAAE,GAAI,EAAK,GAAI,EAAK,GAAI,EAAG,GAAI,CAAY,CAAC,EAEjE,OAAO,OAAO,EAAO,CAAE,GAAI,EAAG,GAAI,EAAa,GAAI,EAAK,GAAI,CAAI,CAAC,EAGnE,EAAO,YAAY,EAAiB,OAAQ,CAAK,CAAC,CACpD,CACF"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../../svg/element.cjs"),t=require("../../axes/axis.cjs"),n=require("../../axes/grid.cjs"),r=require("../../core/cartesian-scales.cjs"),i=require("../../core/layout.cjs"),a=require("../../core/chart-scaffold.cjs"),o=require("../../core/series-id.cjs"),s=require("../../interaction/crosshair.cjs"),c=require("../../interaction/series-interaction.cjs"),l=require("../../theme/index.cjs"),u=require("./area-renderer.cjs");function createAreaChart(d,f){let p=null,m=null,h=f.series;return a.createChartScaffold(d,f,d=>{let{groups:g,legend:_,tooltip:v}=d,y=d.dimensions,b=i.chartArea(y.width,y.height,y.margin),x=h.map(e=>e.data),S=x.flat().map(e=>e.key),C=x.flat().map(e=>e.value);if(S.length===0){a.clearCartesianDom(g,_,v,p),m?.replaceChildren();return}f.crosshair&&!p&&(p=s.createCrosshair(d.chartArea,f.crosshair));let w=r.buildXScale(S,b.width),T=r.buildYScale(C,b.height),E=T.map(0),D=f.xAxis===!1?!1:f.xAxis??{},O=f.yAxis
|
|
1
|
+
const e=require("../../svg/element.cjs"),t=require("../../axes/axis.cjs"),n=require("../../axes/grid.cjs"),r=require("../../core/cartesian-scales.cjs"),i=require("../../core/layout.cjs"),a=require("../../core/chart-scaffold.cjs"),o=require("../../core/series-id.cjs"),s=require("../../interaction/crosshair.cjs"),c=require("../../interaction/series-interaction.cjs"),l=require("../../theme/index.cjs"),u=require("./area-renderer.cjs");function createAreaChart(d,f){let p=null,m=null,h=f.series;return a.createChartScaffold(d,f,d=>{let{groups:g,legend:_,tooltip:v}=d;_?.update(h.map((e,t)=>({color:l.seriesColor(t,e.color),name:e.name})));let y=d.dimensions,b=i.chartArea(y.width,y.height,y.margin),x=h.map(e=>e.data),S=x.flat().map(e=>e.key),C=x.flat().map(e=>e.value);if(S.length===0){a.clearCartesianDom(g,_,v,p),m?.replaceChildren();return}f.crosshair&&!p&&(p=s.createCrosshair(d.chartArea,f.crosshair));let w=r.buildXScale(S,b.width),T=r.buildYScale(C,b.height),E=T.map(0),D=f.xAxis===!1?!1:f.xAxis??{},O=f.yAxis!==!1&&{grid:!0,...f.yAxis};for(O&&O.grid&&n.renderGrid(g.grid,T,O.grid,b.width,`horizontal`,t.resolveTicks(T,O,t.resolveTickCount(O,b.height,`left`))),D&&D.grid&&n.renderGrid(g.grid,w,D.grid,b.height,`vertical`,t.resolveTicks(w,D,t.resolveTickCount(D,b.width,`bottom`))),D?(t.positionAxis(g.xAxis,D.position??`bottom`,b.width,b.height),t.renderAxis(g.xAxis,w,D,b.width,`bottom`)):g.xAxis.replaceChildren(),O?(t.positionAxis(g.yAxis,O.position??`left`,b.width,b.height),t.renderAxis(g.yAxis,T,O,b.height,`left`)):g.yAxis.replaceChildren();g.series.children.length>h.length;)g.series.removeChild(g.series.lastChild);let k=[];for(let t=0;t<h.length;t++){let n=h[t],r=g.series.children[t];r||(r=e.createSvgElement(`g`,{class:`prism-area-series`}),g.series.appendChild(r)),r.setAttribute(`data-series-id`,o.seriesDomId(n,t));let i=u.computeAreaPoints(x[t],w,T);k.push(i),u.renderArea(r,i,E,{color:l.seriesColor(t,n.color),curve:n.curve??`linear`,disposalSignal:d.disposalSignal,fill:n.fill??`gradient`,fillOpacity:n.fillOpacity,marks:n.data,showLine:n.showLine!==!1,transition:f.transition})}return v?.hide(),m=c.ensureMarkerGroup(d.chartArea,m),c.createSeriesInteraction({announcer:d.announcer,colors:()=>h.map((e,t)=>l.seriesColor(t,e.color)),crosshair:p,dims:()=>d.dimensions,getData:()=>x,getPoints:()=>k,getSeriesList:()=>h,margin:d.dimensions.margin,markers:m,onClick:f.onClick,onHover:f.onHover,seriesGroup:g.series,svg:d.svg,tooltip:v,tooltipFormat:typeof f.tooltip==`object`?f.tooltip:void 0})},e=>{h=e})}exports.createAreaChart=createAreaChart;
|
|
2
2
|
//# sourceMappingURL=area-chart.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"area-chart.cjs","names":[],"sources":["../../../src/charts/area/area-chart.ts"],"sourcesContent":["import { positionAxis, renderAxis, resolveTickCount } from '../../axes/axis';\nimport { renderGrid } from '../../axes/grid';\nimport { buildXScale, buildYScale } from '../../core/cartesian-scales';\nimport { clearCartesianDom, createChartScaffold } from '../../core/chart-scaffold';\nimport { chartArea } from '../../core/layout';\nimport { seriesDomId } from '../../core/series-id';\nimport { createCrosshair } from '../../interaction/crosshair';\nimport { createSeriesInteraction, ensureMarkerGroup } from '../../interaction/series-interaction';\nimport { createSvgElement } from '../../svg/element';\nimport type { Point } from '../../svg/path';\nimport { seriesColor } from '../../theme';\nimport type { AreaChartConfig, AreaSeriesConfig, ChartHandle, XAxisConfig, YAxisConfig } from '../../types';\nimport { computeAreaPoints, renderArea } from './area-renderer';\n\nexport function createAreaChart(container: HTMLElement, config: AreaChartConfig): ChartHandle<AreaSeriesConfig[]> {\n let crosshair: ReturnType<typeof createCrosshair> | null = null;\n let markers: SVGGElement | null = null;\n let seriesList = config.series;\n\n return createChartScaffold(\n container,\n config,\n (ctx) => {\n const { groups, legend, tooltip } = ctx;\n const dims = ctx.dimensions;\n const area = chartArea(dims.width, dims.height, dims.margin);\n const allData = seriesList.map((series) => series.data);\n const allX = allData.flat().map((datum) => datum.key);\n const allY = allData.flat().map((d) => d.value);\n\n if (allX.length === 0) {\n clearCartesianDom(groups, legend, tooltip, crosshair);\n markers?.replaceChildren();\n\n return;\n }\n\n if (config.crosshair && !crosshair) {\n crosshair = createCrosshair(ctx.chartArea, config.crosshair);\n }\n\n const xScale = buildXScale(allX, area.width);\n const yScale = buildYScale(allY, area.height);\n const baselineY = yScale.map(0);\n\n // Axes render by default (value axis with gridlines); `false` opts out.\n const xAxisConfig: XAxisConfig | false = config.xAxis === false ? false : (config.xAxis ?? {});\n const yAxisConfig: YAxisConfig | false = config.yAxis === false ? false :
|
|
1
|
+
{"version":3,"file":"area-chart.cjs","names":[],"sources":["../../../src/charts/area/area-chart.ts"],"sourcesContent":["import { positionAxis, renderAxis, resolveTickCount, resolveTicks } from '../../axes/axis';\nimport { renderGrid } from '../../axes/grid';\nimport { buildXScale, buildYScale } from '../../core/cartesian-scales';\nimport { clearCartesianDom, createChartScaffold } from '../../core/chart-scaffold';\nimport { chartArea } from '../../core/layout';\nimport { seriesDomId } from '../../core/series-id';\nimport { createCrosshair } from '../../interaction/crosshair';\nimport { createSeriesInteraction, ensureMarkerGroup } from '../../interaction/series-interaction';\nimport { createSvgElement } from '../../svg/element';\nimport type { Point } from '../../svg/path';\nimport { seriesColor } from '../../theme';\nimport type { AreaChartConfig, AreaSeriesConfig, ChartHandle, XAxisConfig, YAxisConfig } from '../../types';\nimport { computeAreaPoints, renderArea } from './area-renderer';\n\nexport function createAreaChart(container: HTMLElement, config: AreaChartConfig): ChartHandle<AreaSeriesConfig[]> {\n let crosshair: ReturnType<typeof createCrosshair> | null = null;\n let markers: SVGGElement | null = null;\n let seriesList = config.series;\n\n return createChartScaffold(\n container,\n config,\n (ctx) => {\n const { groups, legend, tooltip } = ctx;\n legend?.update(seriesList.map((s, i) => ({ color: seriesColor(i, s.color), name: s.name })));\n const dims = ctx.dimensions;\n const area = chartArea(dims.width, dims.height, dims.margin);\n const allData = seriesList.map((series) => series.data);\n const allX = allData.flat().map((datum) => datum.key);\n const allY = allData.flat().map((d) => d.value);\n\n if (allX.length === 0) {\n clearCartesianDom(groups, legend, tooltip, crosshair);\n markers?.replaceChildren();\n\n return;\n }\n\n if (config.crosshair && !crosshair) {\n crosshair = createCrosshair(ctx.chartArea, config.crosshair);\n }\n\n const xScale = buildXScale(allX, area.width);\n const yScale = buildYScale(allY, area.height);\n const baselineY = yScale.map(0);\n\n // Axes render by default (value axis with gridlines); `false` opts out. The value\n // axis merges over its default so a partial config (e.g. only `tickFormat`) keeps\n // the default gridlines.\n const xAxisConfig: XAxisConfig | false = config.xAxis === false ? false : (config.xAxis ?? {});\n const yAxisConfig: YAxisConfig | false = config.yAxis === false ? false : { grid: true, ...config.yAxis };\n\n if (yAxisConfig && yAxisConfig.grid) {\n renderGrid(\n groups.grid,\n yScale,\n yAxisConfig.grid,\n area.width,\n 'horizontal',\n resolveTicks(yScale, yAxisConfig, resolveTickCount(yAxisConfig, area.height, 'left')),\n );\n }\n\n if (xAxisConfig && xAxisConfig.grid) {\n renderGrid(\n groups.grid,\n xScale,\n xAxisConfig.grid,\n area.height,\n 'vertical',\n resolveTicks(xScale, xAxisConfig, resolveTickCount(xAxisConfig, area.width, 'bottom')),\n );\n }\n\n if (xAxisConfig) {\n positionAxis(groups.xAxis, xAxisConfig.position ?? 'bottom', area.width, area.height);\n renderAxis(groups.xAxis, xScale, xAxisConfig, area.width, 'bottom');\n } else {\n groups.xAxis.replaceChildren();\n }\n\n if (yAxisConfig) {\n positionAxis(groups.yAxis, yAxisConfig.position ?? 'left', area.width, area.height);\n renderAxis(groups.yAxis, yScale, yAxisConfig, area.height, 'left');\n } else {\n groups.yAxis.replaceChildren();\n }\n\n while (groups.series.children.length > seriesList.length) {\n groups.series.removeChild(groups.series.lastChild!);\n }\n\n const allPoints: Point[][] = [];\n\n for (let i = 0; i < seriesList.length; i++) {\n const series = seriesList[i];\n let group = groups.series.children[i] as SVGGElement | undefined;\n\n if (!group) {\n group = createSvgElement('g', { class: 'prism-area-series' });\n groups.series.appendChild(group);\n }\n\n group.setAttribute('data-series-id', seriesDomId(series, i));\n\n const points = computeAreaPoints(allData[i], xScale, yScale);\n\n allPoints.push(points);\n\n renderArea(group, points, baselineY, {\n color: seriesColor(i, series.color),\n curve: series.curve ?? 'linear',\n disposalSignal: ctx.disposalSignal,\n fill: series.fill ?? 'gradient',\n fillOpacity: series.fillOpacity,\n marks: series.data,\n showLine: series.showLine !== false,\n transition: config.transition,\n });\n }\n\n tooltip?.hide();\n markers = ensureMarkerGroup(ctx.chartArea, markers);\n\n return createSeriesInteraction({\n announcer: ctx.announcer,\n colors: () => seriesList.map((s, i) => seriesColor(i, s.color)),\n crosshair,\n dims: () => ctx.dimensions,\n getData: () => allData,\n getPoints: () => allPoints,\n getSeriesList: () => seriesList,\n margin: ctx.dimensions.margin,\n markers,\n onClick: config.onClick,\n onHover: config.onHover,\n seriesGroup: groups.series,\n svg: ctx.svg,\n tooltip,\n tooltipFormat: typeof config.tooltip === 'object' ? config.tooltip : undefined,\n });\n },\n (data) => {\n seriesList = data;\n },\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"area-chart.d.ts","sourceRoot":"","sources":["../../../src/charts/area/area-chart.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,WAAW,EAA4B,MAAM,aAAa,CAAC;AAG5G,wBAAgB,eAAe,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,eAAe,GAAG,WAAW,CAAC,gBAAgB,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"area-chart.d.ts","sourceRoot":"","sources":["../../../src/charts/area/area-chart.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,WAAW,EAA4B,MAAM,aAAa,CAAC;AAG5G,wBAAgB,eAAe,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,eAAe,GAAG,WAAW,CAAC,gBAAgB,EAAE,CAAC,CAoIhH"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{createSvgElement as e}from"../../svg/element.js";import{positionAxis as t,renderAxis as n,resolveTickCount as r}from"../../axes/axis.js";import{renderGrid as
|
|
1
|
+
import{createSvgElement as e}from"../../svg/element.js";import{positionAxis as t,renderAxis as n,resolveTickCount as r,resolveTicks as i}from"../../axes/axis.js";import{renderGrid as a}from"../../axes/grid.js";import{buildXScale as o,buildYScale as s}from"../../core/cartesian-scales.js";import{chartArea as c}from"../../core/layout.js";import{clearCartesianDom as l,createChartScaffold as u}from"../../core/chart-scaffold.js";import{seriesDomId as d}from"../../core/series-id.js";import{createCrosshair as f}from"../../interaction/crosshair.js";import{createSeriesInteraction as p,ensureMarkerGroup as m}from"../../interaction/series-interaction.js";import{seriesColor as h}from"../../theme/index.js";import{computeAreaPoints as g,renderArea as _}from"./area-renderer.js";function createAreaChart(v,y){let b=null,x=null,S=y.series;return u(v,y,u=>{let{groups:v,legend:C,tooltip:w}=u;C?.update(S.map((e,t)=>({color:h(t,e.color),name:e.name})));let T=u.dimensions,E=c(T.width,T.height,T.margin),D=S.map(e=>e.data),O=D.flat().map(e=>e.key),k=D.flat().map(e=>e.value);if(O.length===0){l(v,C,w,b),x?.replaceChildren();return}y.crosshair&&!b&&(b=f(u.chartArea,y.crosshair));let A=o(O,E.width),j=s(k,E.height),M=j.map(0),N=y.xAxis===!1?!1:y.xAxis??{},P=y.yAxis!==!1&&{grid:!0,...y.yAxis};for(P&&P.grid&&a(v.grid,j,P.grid,E.width,`horizontal`,i(j,P,r(P,E.height,`left`))),N&&N.grid&&a(v.grid,A,N.grid,E.height,`vertical`,i(A,N,r(N,E.width,`bottom`))),N?(t(v.xAxis,N.position??`bottom`,E.width,E.height),n(v.xAxis,A,N,E.width,`bottom`)):v.xAxis.replaceChildren(),P?(t(v.yAxis,P.position??`left`,E.width,E.height),n(v.yAxis,j,P,E.height,`left`)):v.yAxis.replaceChildren();v.series.children.length>S.length;)v.series.removeChild(v.series.lastChild);let F=[];for(let t=0;t<S.length;t++){let n=S[t],r=v.series.children[t];r||(r=e(`g`,{class:`prism-area-series`}),v.series.appendChild(r)),r.setAttribute(`data-series-id`,d(n,t));let i=g(D[t],A,j);F.push(i),_(r,i,M,{color:h(t,n.color),curve:n.curve??`linear`,disposalSignal:u.disposalSignal,fill:n.fill??`gradient`,fillOpacity:n.fillOpacity,marks:n.data,showLine:n.showLine!==!1,transition:y.transition})}return w?.hide(),x=m(u.chartArea,x),p({announcer:u.announcer,colors:()=>S.map((e,t)=>h(t,e.color)),crosshair:b,dims:()=>u.dimensions,getData:()=>D,getPoints:()=>F,getSeriesList:()=>S,margin:u.dimensions.margin,markers:x,onClick:y.onClick,onHover:y.onHover,seriesGroup:v.series,svg:u.svg,tooltip:w,tooltipFormat:typeof y.tooltip==`object`?y.tooltip:void 0})},e=>{S=e})}export{createAreaChart};
|
|
2
2
|
//# sourceMappingURL=area-chart.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"area-chart.js","names":[],"sources":["../../../src/charts/area/area-chart.ts"],"sourcesContent":["import { positionAxis, renderAxis, resolveTickCount } from '../../axes/axis';\nimport { renderGrid } from '../../axes/grid';\nimport { buildXScale, buildYScale } from '../../core/cartesian-scales';\nimport { clearCartesianDom, createChartScaffold } from '../../core/chart-scaffold';\nimport { chartArea } from '../../core/layout';\nimport { seriesDomId } from '../../core/series-id';\nimport { createCrosshair } from '../../interaction/crosshair';\nimport { createSeriesInteraction, ensureMarkerGroup } from '../../interaction/series-interaction';\nimport { createSvgElement } from '../../svg/element';\nimport type { Point } from '../../svg/path';\nimport { seriesColor } from '../../theme';\nimport type { AreaChartConfig, AreaSeriesConfig, ChartHandle, XAxisConfig, YAxisConfig } from '../../types';\nimport { computeAreaPoints, renderArea } from './area-renderer';\n\nexport function createAreaChart(container: HTMLElement, config: AreaChartConfig): ChartHandle<AreaSeriesConfig[]> {\n let crosshair: ReturnType<typeof createCrosshair> | null = null;\n let markers: SVGGElement | null = null;\n let seriesList = config.series;\n\n return createChartScaffold(\n container,\n config,\n (ctx) => {\n const { groups, legend, tooltip } = ctx;\n const dims = ctx.dimensions;\n const area = chartArea(dims.width, dims.height, dims.margin);\n const allData = seriesList.map((series) => series.data);\n const allX = allData.flat().map((datum) => datum.key);\n const allY = allData.flat().map((d) => d.value);\n\n if (allX.length === 0) {\n clearCartesianDom(groups, legend, tooltip, crosshair);\n markers?.replaceChildren();\n\n return;\n }\n\n if (config.crosshair && !crosshair) {\n crosshair = createCrosshair(ctx.chartArea, config.crosshair);\n }\n\n const xScale = buildXScale(allX, area.width);\n const yScale = buildYScale(allY, area.height);\n const baselineY = yScale.map(0);\n\n // Axes render by default (value axis with gridlines); `false` opts out.\n const xAxisConfig: XAxisConfig | false = config.xAxis === false ? false : (config.xAxis ?? {});\n const yAxisConfig: YAxisConfig | false = config.yAxis === false ? false :
|
|
1
|
+
{"version":3,"file":"area-chart.js","names":[],"sources":["../../../src/charts/area/area-chart.ts"],"sourcesContent":["import { positionAxis, renderAxis, resolveTickCount, resolveTicks } from '../../axes/axis';\nimport { renderGrid } from '../../axes/grid';\nimport { buildXScale, buildYScale } from '../../core/cartesian-scales';\nimport { clearCartesianDom, createChartScaffold } from '../../core/chart-scaffold';\nimport { chartArea } from '../../core/layout';\nimport { seriesDomId } from '../../core/series-id';\nimport { createCrosshair } from '../../interaction/crosshair';\nimport { createSeriesInteraction, ensureMarkerGroup } from '../../interaction/series-interaction';\nimport { createSvgElement } from '../../svg/element';\nimport type { Point } from '../../svg/path';\nimport { seriesColor } from '../../theme';\nimport type { AreaChartConfig, AreaSeriesConfig, ChartHandle, XAxisConfig, YAxisConfig } from '../../types';\nimport { computeAreaPoints, renderArea } from './area-renderer';\n\nexport function createAreaChart(container: HTMLElement, config: AreaChartConfig): ChartHandle<AreaSeriesConfig[]> {\n let crosshair: ReturnType<typeof createCrosshair> | null = null;\n let markers: SVGGElement | null = null;\n let seriesList = config.series;\n\n return createChartScaffold(\n container,\n config,\n (ctx) => {\n const { groups, legend, tooltip } = ctx;\n legend?.update(seriesList.map((s, i) => ({ color: seriesColor(i, s.color), name: s.name })));\n const dims = ctx.dimensions;\n const area = chartArea(dims.width, dims.height, dims.margin);\n const allData = seriesList.map((series) => series.data);\n const allX = allData.flat().map((datum) => datum.key);\n const allY = allData.flat().map((d) => d.value);\n\n if (allX.length === 0) {\n clearCartesianDom(groups, legend, tooltip, crosshair);\n markers?.replaceChildren();\n\n return;\n }\n\n if (config.crosshair && !crosshair) {\n crosshair = createCrosshair(ctx.chartArea, config.crosshair);\n }\n\n const xScale = buildXScale(allX, area.width);\n const yScale = buildYScale(allY, area.height);\n const baselineY = yScale.map(0);\n\n // Axes render by default (value axis with gridlines); `false` opts out. The value\n // axis merges over its default so a partial config (e.g. only `tickFormat`) keeps\n // the default gridlines.\n const xAxisConfig: XAxisConfig | false = config.xAxis === false ? false : (config.xAxis ?? {});\n const yAxisConfig: YAxisConfig | false = config.yAxis === false ? false : { grid: true, ...config.yAxis };\n\n if (yAxisConfig && yAxisConfig.grid) {\n renderGrid(\n groups.grid,\n yScale,\n yAxisConfig.grid,\n area.width,\n 'horizontal',\n resolveTicks(yScale, yAxisConfig, resolveTickCount(yAxisConfig, area.height, 'left')),\n );\n }\n\n if (xAxisConfig && xAxisConfig.grid) {\n renderGrid(\n groups.grid,\n xScale,\n xAxisConfig.grid,\n area.height,\n 'vertical',\n resolveTicks(xScale, xAxisConfig, resolveTickCount(xAxisConfig, area.width, 'bottom')),\n );\n }\n\n if (xAxisConfig) {\n positionAxis(groups.xAxis, xAxisConfig.position ?? 'bottom', area.width, area.height);\n renderAxis(groups.xAxis, xScale, xAxisConfig, area.width, 'bottom');\n } else {\n groups.xAxis.replaceChildren();\n }\n\n if (yAxisConfig) {\n positionAxis(groups.yAxis, yAxisConfig.position ?? 'left', area.width, area.height);\n renderAxis(groups.yAxis, yScale, yAxisConfig, area.height, 'left');\n } else {\n groups.yAxis.replaceChildren();\n }\n\n while (groups.series.children.length > seriesList.length) {\n groups.series.removeChild(groups.series.lastChild!);\n }\n\n const allPoints: Point[][] = [];\n\n for (let i = 0; i < seriesList.length; i++) {\n const series = seriesList[i];\n let group = groups.series.children[i] as SVGGElement | undefined;\n\n if (!group) {\n group = createSvgElement('g', { class: 'prism-area-series' });\n groups.series.appendChild(group);\n }\n\n group.setAttribute('data-series-id', seriesDomId(series, i));\n\n const points = computeAreaPoints(allData[i], xScale, yScale);\n\n allPoints.push(points);\n\n renderArea(group, points, baselineY, {\n color: seriesColor(i, series.color),\n curve: series.curve ?? 'linear',\n disposalSignal: ctx.disposalSignal,\n fill: series.fill ?? 'gradient',\n fillOpacity: series.fillOpacity,\n marks: series.data,\n showLine: series.showLine !== false,\n transition: config.transition,\n });\n }\n\n tooltip?.hide();\n markers = ensureMarkerGroup(ctx.chartArea, markers);\n\n return createSeriesInteraction({\n announcer: ctx.announcer,\n colors: () => seriesList.map((s, i) => seriesColor(i, s.color)),\n crosshair,\n dims: () => ctx.dimensions,\n getData: () => allData,\n getPoints: () => allPoints,\n getSeriesList: () => seriesList,\n margin: ctx.dimensions.margin,\n markers,\n onClick: config.onClick,\n onHover: config.onHover,\n seriesGroup: groups.series,\n svg: ctx.svg,\n tooltip,\n tooltipFormat: typeof config.tooltip === 'object' ? config.tooltip : undefined,\n });\n },\n (data) => {\n seriesList = data;\n },\n );\n}\n"],"mappings":"qwBAcA,SAAgB,gBAAgB,EAAwB,EAA0D,CAChH,IAAI,EAAuD,KACvD,EAA8B,KAC9B,EAAa,EAAO,OAExB,OAAO,EACL,EACA,EACC,GAAQ,CACP,GAAM,CAAE,SAAQ,SAAQ,WAAY,EACpC,GAAQ,OAAO,EAAW,KAAK,EAAG,KAAO,CAAE,MAAO,EAAY,EAAG,EAAE,KAAK,EAAG,KAAM,EAAE,IAAK,EAAE,CAAC,EAC3F,IAAM,EAAO,EAAI,WACX,EAAO,EAAU,EAAK,MAAO,EAAK,OAAQ,EAAK,MAAM,EACrD,EAAU,EAAW,IAAK,GAAW,EAAO,IAAI,EAChD,EAAO,EAAQ,KAAK,CAAC,CAAC,IAAK,GAAU,EAAM,GAAG,EAC9C,EAAO,EAAQ,KAAK,CAAC,CAAC,IAAK,GAAM,EAAE,KAAK,EAE9C,GAAI,EAAK,SAAW,EAAG,CACrB,EAAkB,EAAQ,EAAQ,EAAS,CAAS,EACpD,GAAS,gBAAgB,EAEzB,MACF,CAEI,EAAO,WAAa,CAAC,IACvB,EAAY,EAAgB,EAAI,UAAW,EAAO,SAAS,GAG7D,IAAM,EAAS,EAAY,EAAM,EAAK,KAAK,EACrC,EAAS,EAAY,EAAM,EAAK,MAAM,EACtC,EAAY,EAAO,IAAI,CAAC,EAKxB,EAAmC,EAAO,QAAU,GAAQ,GAAS,EAAO,OAAS,CAAC,EACtF,EAAmC,EAAO,QAAU,IAAgB,CAAE,KAAM,GAAM,GAAG,EAAO,KAAM,EAsCxG,IApCI,GAAe,EAAY,MAC7B,EACE,EAAO,KACP,EACA,EAAY,KACZ,EAAK,MACL,aACA,EAAa,EAAQ,EAAa,EAAiB,EAAa,EAAK,OAAQ,MAAM,CAAC,CACtF,EAGE,GAAe,EAAY,MAC7B,EACE,EAAO,KACP,EACA,EAAY,KACZ,EAAK,OACL,WACA,EAAa,EAAQ,EAAa,EAAiB,EAAa,EAAK,MAAO,QAAQ,CAAC,CACvF,EAGE,GACF,EAAa,EAAO,MAAO,EAAY,UAAY,SAAU,EAAK,MAAO,EAAK,MAAM,EACpF,EAAW,EAAO,MAAO,EAAQ,EAAa,EAAK,MAAO,QAAQ,GAElE,EAAO,MAAM,gBAAgB,EAG3B,GACF,EAAa,EAAO,MAAO,EAAY,UAAY,OAAQ,EAAK,MAAO,EAAK,MAAM,EAClF,EAAW,EAAO,MAAO,EAAQ,EAAa,EAAK,OAAQ,MAAM,GAEjE,EAAO,MAAM,gBAAgB,EAGxB,EAAO,OAAO,SAAS,OAAS,EAAW,QAChD,EAAO,OAAO,YAAY,EAAO,OAAO,SAAU,EAGpD,IAAM,EAAuB,CAAC,EAE9B,IAAK,IAAI,EAAI,EAAG,EAAI,EAAW,OAAQ,IAAK,CAC1C,IAAM,EAAS,EAAW,GACtB,EAAQ,EAAO,OAAO,SAAS,GAE9B,IACH,EAAQ,EAAiB,IAAK,CAAE,MAAO,mBAAoB,CAAC,EAC5D,EAAO,OAAO,YAAY,CAAK,GAGjC,EAAM,aAAa,iBAAkB,EAAY,EAAQ,CAAC,CAAC,EAE3D,IAAM,EAAS,EAAkB,EAAQ,GAAI,EAAQ,CAAM,EAE3D,EAAU,KAAK,CAAM,EAErB,EAAW,EAAO,EAAQ,EAAW,CACnC,MAAO,EAAY,EAAG,EAAO,KAAK,EAClC,MAAO,EAAO,OAAS,SACvB,eAAgB,EAAI,eACpB,KAAM,EAAO,MAAQ,WACrB,YAAa,EAAO,YACpB,MAAO,EAAO,KACd,SAAU,EAAO,WAAa,GAC9B,WAAY,EAAO,UACrB,CAAC,CACH,CAKA,OAHA,GAAS,KAAK,EACd,EAAU,EAAkB,EAAI,UAAW,CAAO,EAE3C,EAAwB,CAC7B,UAAW,EAAI,UACf,WAAc,EAAW,KAAK,EAAG,IAAM,EAAY,EAAG,EAAE,KAAK,CAAC,EAC9D,YACA,SAAY,EAAI,WAChB,YAAe,EACf,cAAiB,EACjB,kBAAqB,EACrB,OAAQ,EAAI,WAAW,OACvB,UACA,QAAS,EAAO,QAChB,QAAS,EAAO,QAChB,YAAa,EAAO,OACpB,IAAK,EAAI,IACT,UACA,cAAe,OAAO,EAAO,SAAY,SAAW,EAAO,QAAU,IAAA,EACvE,CAAC,CACH,EACC,GAAS,CACR,EAAa,CACf,CACF,CACF"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require("../../_dev.cjs");const e=require("../../svg/element.cjs"),t=require("../../axes/axis.cjs"),n=require("../../axes/grid.cjs"),r=require("../../scales/linear.cjs"),i=require("../../interaction/announcer.cjs"),a=require("../../interaction/tooltip.cjs"),o=require("../../core/layout.cjs"),s=require("../../core/chart-scaffold.cjs"),c=require("../../core/series-id.cjs"),l=require("../../core/cartesian-model.cjs"),u=require("../../interaction/events.cjs"),d=require("../../theme/index.cjs"),f=require("../../scales/band.cjs"),p=require("./bar-hit-test.cjs"),m=require("./bar-renderer.cjs");function variantFlags(e){return{horizontal:e===`grouped-horizontal`||e===`stacked-horizontal`,stacked:e===`stacked`||e===`stacked-horizontal`}}function createBarChart(h,g){let _=g.series,v=null;return s.createChartScaffold(h,g,h=>{let{groups:
|
|
1
|
+
require("../../_dev.cjs");const e=require("../../svg/element.cjs"),t=require("../../axes/axis.cjs"),n=require("../../axes/grid.cjs"),r=require("../../scales/linear.cjs"),i=require("../../interaction/announcer.cjs"),a=require("../../interaction/tooltip.cjs"),o=require("../../core/layout.cjs"),s=require("../../core/chart-scaffold.cjs"),c=require("../../core/series-id.cjs"),l=require("../../core/cartesian-model.cjs"),u=require("../../interaction/events.cjs"),d=require("../../theme/index.cjs"),f=require("../../scales/band.cjs"),p=require("./bar-hit-test.cjs"),m=require("./bar-renderer.cjs");function variantFlags(e){return{horizontal:e===`grouped-horizontal`||e===`stacked-horizontal`,stacked:e===`stacked`||e===`stacked-horizontal`}}function createBarChart(h,g){let _=g.series,v=null;return s.createChartScaffold(h,g,(h,y)=>{let{groups:b,legend:x,tooltip:S}=h;x?.update(_.map((e,t)=>({color:d.seriesColor(t,e.color),name:e.name})));let C=h.dimensions,w=o.chartArea(C.width,C.height,C.margin),T=_.map(e=>e.data),E=l.normalizeCartesianSeries(_,T),D=E.domain,O=E.series.map(({byKey:e})=>D.map(t=>e.get(t))),categoryAxis=e=>({...e,tickFormat:t=>{let n=String(t),r=E.labels.get(n)??t;return e.tickFormat?e.tickFormat(r):String(r)}});if(D.length===0){s.clearCartesianDom(b,x,S),v?.remove(),v=null;return}let{horizontal:k,stacked:A}=variantFlags(g.variant??`grouped`),j=g.xAxis===!1?!1:k?{grid:!0,...g.xAxis}:g.xAxis??{},M=g.yAxis===!1?!1:k?g.yAxis??{}:{grid:!0,...g.yAxis},N,P;if(A){O.some(e=>e.some(e=>(e?.value??0)<0));let e=D.map((e,t)=>O.reduce((e,n)=>e+Math.max(0,n[t]?.value??0),0));N=Math.max(...e),P=0}else{let e=O.flatMap(e=>e.flatMap(e=>e?[e.value]:[]));N=Math.max(...e),P=Math.min(0,...e)}let F=k?f.bandScale({domain:D,range:[0,w.height]}):f.bandScale({domain:D,range:[0,w.width]}),I=k?r.linearScale({domain:[P,N],range:[0,w.width]}):r.linearScale({domain:[P,N],range:[w.height,0]}),L=[],R=Object.create(null);for(let e of D)R[e]=0;let z={bandCenter:e=>F.map(e)+F.bandwidth()/2,bandwidth:F.bandwidth(),baselinePx:I.map(0),horizontal:k,stacked:A,stackedTops:L,valueScale:I};if(k){if(j&&j.grid&&n.renderGrid(b.grid,I,j.grid,w.height,`vertical`,t.resolveTicks(I,j,t.resolveTickCount(j,w.width,`bottom`))),M!==!1){let e=categoryAxis(M);t.positionAxis(b.yAxis,e.position??`left`,w.width,w.height),t.renderAxis(b.yAxis,F,e,w.height,`left`)}j&&(t.positionAxis(b.xAxis,j.position??`bottom`,w.width,w.height),t.renderAxis(b.xAxis,I,j,w.width,`bottom`))}else{if(M&&M.grid&&n.renderGrid(b.grid,I,M.grid,w.width,`horizontal`,t.resolveTicks(I,M,t.resolveTickCount(M,w.height,`left`))),j!==!1){let e=categoryAxis(j);t.positionAxis(b.xAxis,e.position??`bottom`,w.width,w.height),t.renderAxis(b.xAxis,F,e,w.width,`bottom`)}M&&(t.positionAxis(b.yAxis,M.position??`left`,w.width,w.height),t.renderAxis(b.yAxis,I,M,w.height,`left`))}let B=A?0:Number.parseFloat(getComputedStyle(h.svg).getPropertyValue(`--prism-bar-radius`))||0;for(;b.series.children.length>_.length;){let e=b.series.lastElementChild;e&&b.series.removeChild(e)}for(let t=0;t<_.length;t++){let n=_[t],r=b.series.children[t];r||(r=e.createSvgElement(`g`,{class:`prism-bar-series`}),b.series.appendChild(r)),r.setAttribute(`data-series-id`,c.seriesDomId(n,t));let i=D.map((e,n)=>{let r=O[t]?.[n];if(A){let t=R[e]??0,n=t+Math.max(0,r?.value??0);return R[e]=n,{base:t,dash:r?.dash,key:e,opacity:r?.opacity,present:r!==void 0,y:n}}return{base:0,dash:r?.dash,key:e,opacity:r?.opacity,present:r!==void 0,y:r?.value??0}});L[t]=i.map(e=>e.y);let a=A?i.map(e=>I.map(e.base)):void 0;m.renderBars(r,i,F,I,z.baselinePx,{baselineYs:a,borderRadius:n.borderRadius??B,color:d.seriesColor(t,n.color),disposalSignal:h.disposalSignal,horizontal:k,seriesCount:_.length,seriesIndex:t,stacked:A,transition:y!==`resize`&&g.transition})}S?.hide(),b.series.classList.toggle(`prism-bars-stacked`,A),(!v||!h.chartArea.contains(v))&&(v=e.createSvgElement(`rect`,{"aria-hidden":`true`,class:`prism-bar-band`,"pointer-events":`none`}),h.chartArea.insertBefore(v,b.series)),v.style.display=`none`;let V=_.map((e,t)=>d.seriesColor(t,e.color)),labelOf=e=>String(E.labels.get(D[e])??D[e]),H=typeof g.tooltip==`object`?g.tooltip:void 0,keyOf=e=>E.labels.get(D[e])??D[e],titleOf=e=>H?.titleFormat?H.titleFormat(keyOf(e)):labelOf(e),U=H?.valueFormat??String,W=-1,valuesAt=e=>_.map((t,n)=>({datum:O[n]?.[e],series:t})),eventAt=(e,t,n)=>{let r=valuesAt(e),i=r[t]?.datum?t:r.findIndex(e=>e.datum),a=r[i]?.datum;return a?{datum:a,originalEvent:n,series:_[i],values:r}:null},setActive=t=>{W=t,b.series.classList.toggle(`prism-bars-focused`,t>=0);for(let e of b.series.children)for(let[n,r]of[...e.children].entries())r.classList.toggle(`prism-bar--active`,n===t);if(!v||(v.style.display=t<0?`none`:``,t<0))return;let n=z.bandCenter(D[t])-F.bandwidth()/2-F.gap()/2,r=F.bandwidth()+F.gap(),i=o.chartArea(h.dimensions.width,h.dimensions.height,h.dimensions.margin);e.setAttributes(v,k?{height:r,width:i.width,x:0,y:n}:{height:i.height,width:r,x:n,y:0})},activate=(e,t,n)=>{let r=eventAt(e,t,n);if(!r)return;setActive(e);let o=r.values??[],s=i.describeValues(titleOf(e),o,U);if(S){let t=o.map((t,n)=>A?L[n]?.[e]??0:Math.max(0,t.datum?.value??0)),n=I.map(Math.max(...t)),i=z.bandCenter(D[e]),{margin:c}=h.dimensions,l=o.flatMap((e,t)=>e.datum?[{color:V[t],name:e.series.name,value:U(e.datum.value,e.datum,e.series)}]:[]);S.show((k?n:i)+c.left,(k?i:n)+c.top,r.datum,r.series,a.comparisonContent(h.svg.ownerDocument,titleOf(e),l,s))}else h.announcer.announce(s);g.onHover?.(r)},deactivate=()=>{setActive(-1),S?.hide(),h.announcer.clear(),g.onHover?.(null)},hit=e=>{let t=h.dimensions,n=u.getMousePosition(h.svg,e,t.margin.left,t.margin.top),r=o.chartArea(t.width,t.height,t.margin);if(n.x<0||n.x>r.width||n.y<0||n.y>r.height)return null;let i=p.findCatIdx(k?n.y:n.x,D,z);return i===-1?null:{catIdx:i,seriesIdx:p.findSeriesIdx(n,i,D,z,_.length)}},onMouseMove=e=>{let t=hit(e);t?activate(t.catIdx,t.seriesIdx,e):W>=0&&deactivate()},onClick=e=>{let t=g.onClick&&hit(e),n=t&&eventAt(t.catIdx,t.seriesIdx,e);n&&g.onClick?.(n)},onKeyDown=e=>{let t=D.length-1,n=W<0?t:Math.max(0,W-1),r=W<0?0:Math.min(t,W+1),i={ArrowDown:r,ArrowLeft:n,ArrowRight:r,ArrowUp:n,End:t,Home:0};if(e.key in i)e.preventDefault(),activate(i[e.key],0,e);else if((e.key===`Enter`||e.key===` `)&&W>=0&&g.onClick){e.preventDefault();let t=eventAt(W,0,e);t&&g.onClick(t)}else e.key===`Escape`&&deactivate()};return{onClick,onKeyDown,onMouseLeave:deactivate,onMouseMove}},e=>{_=e})}exports.createBarChart=createBarChart;
|
|
2
2
|
//# sourceMappingURL=bar-chart.cjs.map
|