@vielzeug/prism 26.10.5 → 26.10.7
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 +1 -1
- 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/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/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/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/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 +38 -5
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -3
package/README.md
CHANGED
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":"oOAOA,IAAM,EAAkB,GAClB,EAAY,EAEZ,EAAU,IAAI,KAAK,aAAa,IAAA,GAAW,CAAE,yBAA0B,EAAG,SAAU,SAAU,CAAC,EAQ/F,kBAAqB,GACrB,aAAa,KAAa,EAAE,mBAAmB,IAAA,GAAW,CAAE,MAAO,QAAS,KAAM,SAAU,CAAC,EAC7F,OAAO,GAAM,UAAY,KAAK,IAAI,CAAC,GAAK,IAAY,EAAQ,OAAO,CAAC,EAEjE,OAAO,CAAC,EAQjB,SAAgB,aAAa,EAAiB,EAAoB,EAA+C,CAC/G,OAAO,EAAO,WAAa,CAAC,GAAG,EAAO,UAAU,EAAI,EAAM,MAAM,CAAS,CAC3E,CAoCA,SAAgB,aAAa,EAAqB,EAAwB,EAAe,EAAsB,CAC7G,IAAM,EACJ,IAAa,SAAW,eAAe,EAAO,GAAK,IAAa,QAAU,aAAa,EAAM,KAAO,IAAA,GAElG,EAAW,EAAO,aAAa,YAAa,CAAS,EACpD,EAAO,gBAAgB,WAAW,CACzC,CAEA,SAAgB,iBAAiB,EAAoB,EAAgB,EAAuC,CAC1G,IAAM,EAAW,EAAO,UAAY,EAE9B,EADe,IAAa,UAAY,IAAa,MACnB,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,EAAE,CAAC,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,EAAE,CAAC,EAElH,OAAO,EAAO,WAAa,CAC7B,CAGA,SAAS,kBACP,EACA,EACA,EACA,EACQ,CACR,GAAI,EAAO,SAAW,EAAG,MAAO,GAEhC,IAAM,EAAO,EACT,KAAK,IAAI,GAAG,EAAO,IAAK,GAAU,EAAkB,EAAO,CAAK,EAAG,CAAe,CAAC,CAAC,EACpF,EAAkB,IAEtB,OAAO,KAAK,IAAI,EAAG,KAAK,IAAI,EAAO,OAAQ,KAAK,MAAM,GAAU,EAAO,EAAU,CAAC,CAAC,CACrF,CAOA,SAAgB,WACd,EACA,EACA,EACA,EACA,EAAgC,SAC1B,CACN,EAAe,CAAM,EAErB,IAAM,EAAW,EAAO,UAAY,EAC9B,EAAe,IAAa,UAAY,IAAa,MACrD,EAAa,IAAa,OAAS,IAAa,OAEhD,EAAgB,EAAa,GAAK,EAElC,EAAW,EAAiB,OAAQ,CACxC,cAAe,OACf,MAAO,kBACP,GAAmB,EACnB,GAAI,EAAe,EAAS,EAC5B,GAAmB,EACnB,GAAI,EAAe,EAAI,CACzB,CAAC,EAED,EAAO,YAAY,CAAQ,EAE3B,IAAM,EAAS,EAAO,YAAc,kBAK9B,EAAQ,aAAa,EAAO,EAHhC,EAAO,YAAc,IAAA,IAAa,cAAe,EAC7C,kBAAkB,EAAM,OAAQ,EAAQ,EAAQ,CAAY,EAC5D,iBAAiB,EAAQ,EAAQ,CAAe,CACH,EAE/C,EAAO,YAAqC,EAAO,WAEvD,IAAK,IAAM,KAAQ,EAAO,CACxB,IAAM,EAAM,EAAQ,EAAO,CAAI,EACzB,EAAW,EAAiB,OAAQ,CACxC,cAAe,OACf,MAAO,kBACP,GAAI,EAAe,EAAM,EACzB,GAAI,EAAe,EAAM,EAAW,EACpC,GAAI,EAAe,EAAI,EACvB,GAAI,EAAe,EAAW,EAAgB,CAChD,CAAC,EAED,EAAO,YAAY,CAAQ,EAE3B,IAAM,EAAQ,EAAkB,EAAO,CAAI,EAAG,CAC5C,cAAe,OACf,MAAO,mBACP,oBAAqB,EAAgB,EAAa,OAAS,UAAa,SACxE,cAAe,EAAe,SAAW,EAAa,MAAQ,QAC9D,EAAG,EAAe,EAAM,EAAW,EAAgB,IACnD,EAAG,EAAe,EAAW,EAAgB,IAAM,CACrD,CAAC,EAED,EAAO,YAAY,CAAK,CAC1B,CAEA,GAAI,EAAO,MAAO,CAChB,IAAM,EAAU,EAAkB,EAAO,MAAO,CAC9C,MAAO,mBACP,oBAAqB,SACrB,cAAe,QACjB,CAAC,EAEG,EACF,EAAc,EAAS,CAAE,EAAG,EAAS,EAAG,EAAG,EAAW,EAAgB,CAAE,CAAC,EAEzE,EAAc,EAAS,CACrB,UAAW,aAAa,EAAW,EAAgB,EAAE,IAAI,EAAS,EAAE,cACtE,CAAC,EAGH,EAAO,YAAY,CAAO,CAC5B,CACF"}
|
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;_?.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
|
+
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 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.\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 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.\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":"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"}
|
|
@@ -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,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:
|
|
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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bar-chart.cjs","names":[],"sources":["../../../src/charts/bar/bar-chart.ts"],"sourcesContent":["import { warn } from '../../_dev';\nimport { positionAxis, renderAxis, resolveTickCount } from '../../axes/axis';\nimport { renderGrid } from '../../axes/grid';\nimport { normalizeCartesianSeries } from '../../core/cartesian-model';\nimport { clearCartesianDom, createChartScaffold } from '../../core/chart-scaffold';\nimport { chartArea } from '../../core/layout';\nimport { seriesDomId } from '../../core/series-id';\nimport { describeValues } from '../../interaction/announcer';\nimport { getMousePosition } from '../../interaction/events';\nimport { comparisonContent } from '../../interaction/tooltip';\nimport { bandScale } from '../../scales/band';\nimport { linearScale } from '../../scales/linear';\nimport { createSvgElement, setAttributes } from '../../svg/element';\nimport { seriesColor } from '../../theme';\nimport type {\n BarChartConfig,\n BarSeriesConfig,\n BarVariant,\n ChartEvent,\n ChartHandle,\n SeriesValue,\n XAxisConfig,\n YAxisConfig,\n} from '../../types';\nimport { findCatIdx, findSeriesIdx } from './bar-hit-test';\nimport { renderBars } from './bar-renderer';\nimport type { BarScaleContext } from './bar-scale-context';\n\nfunction variantFlags(variant: BarVariant): { horizontal: boolean; stacked: boolean } {\n return {\n horizontal: variant === 'grouped-horizontal' || variant === 'stacked-horizontal',\n stacked: variant === 'stacked' || variant === 'stacked-horizontal',\n };\n}\n\n// ─── Chart ────────────────────────────────────────────────────────────────────\n\nexport function createBarChart(container: HTMLElement, config: BarChartConfig): ChartHandle<BarSeriesConfig[]> {\n let seriesList = config.series;\n let band: SVGRectElement | null = null;\n\n return createChartScaffold(\n container,\n config,\n (ctx, reason) => {\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 sourceData = seriesList.map((series) => series.data);\n const model = normalizeCartesianSeries(seriesList, sourceData);\n const categories = model.domain;\n const allData = model.series.map(({ byKey }) => categories.map((key) => byKey.get(key)));\n const categoryAxis = (axis: XAxisConfig | YAxisConfig) => {\n return {\n ...axis,\n tickFormat: (value: Date | number | string) => {\n const key = String(value);\n const label = model.labels.get(key) ?? value;\n\n return axis.tickFormat ? axis.tickFormat(label) : String(label);\n },\n };\n };\n\n if (categories.length === 0) {\n clearCartesianDom(groups, legend, tooltip);\n band?.remove();\n band = null;\n\n return;\n }\n\n const { horizontal, stacked } = variantFlags(config.variant ?? 'grouped');\n\n // Axes render by default; `false` opts out. The value axis carries gridlines by\n // default, the category axis does not; an explicit config is used verbatim.\n const xAxisConfig: XAxisConfig | false =\n config.xAxis === false ? false : (config.xAxis ?? (horizontal ? { grid: true } : {}));\n const yAxisConfig: YAxisConfig | false =\n config.yAxis === false ? false : (config.yAxis ?? (horizontal ? {} : { grid: true }));\n\n // Value domain\n let vMax: number;\n let vMin: number;\n\n if (stacked) {\n if (allData.some((seriesData) => seriesData.some((datum) => (datum?.value ?? 0) < 0))) {\n warn(\n 'createBarChart: negative values in a stacked/stacked-horizontal series are clamped to 0: stacking mixed-sign data is not supported.',\n );\n }\n\n const sums = categories.map((_, categoryIndex) =>\n allData.reduce((sum, seriesData) => sum + Math.max(0, seriesData[categoryIndex]?.value ?? 0), 0),\n );\n\n vMax = Math.max(...sums);\n vMin = 0;\n } else {\n const allY = allData.flatMap((seriesData) => seriesData.flatMap((datum) => (datum ? [datum.value] : [])));\n\n vMax = Math.max(...allY);\n vMin = Math.min(0, ...allY);\n }\n\n // Build uniform scale context\n const catScale = horizontal\n ? bandScale({ domain: categories, range: [0, area.height] })\n : bandScale({ domain: categories, range: [0, area.width] });\n\n const valScale = horizontal\n ? linearScale({ domain: [vMin, vMax], range: [0, area.width] })\n : linearScale({ domain: [vMin, vMax], range: [area.height, 0] });\n\n const stackedTops: number[][] = [];\n const stackTops = Object.create(null) as Record<string, number>;\n\n for (const cat of categories) stackTops[cat] = 0;\n\n const sc: BarScaleContext = {\n bandCenter: (cat) => catScale.map(cat) + catScale.bandwidth() / 2,\n bandwidth: catScale.bandwidth(),\n baselinePx: valScale.map(0),\n horizontal,\n stacked,\n stackedTops,\n valueScale: valScale,\n };\n\n // Axes & grid\n if (horizontal) {\n if (xAxisConfig && xAxisConfig.grid) {\n renderGrid(\n groups.grid,\n valScale,\n xAxisConfig.grid,\n area.height,\n 'vertical',\n resolveTickCount(xAxisConfig, area.width, 'bottom'),\n );\n }\n\n if (yAxisConfig !== false) {\n const yAxis = categoryAxis(yAxisConfig);\n\n positionAxis(groups.yAxis, yAxis.position ?? 'left', area.width, area.height);\n renderAxis(groups.yAxis, catScale, yAxis, area.height, 'left');\n }\n\n if (xAxisConfig) {\n positionAxis(groups.xAxis, xAxisConfig.position ?? 'bottom', area.width, area.height);\n renderAxis(groups.xAxis, valScale, xAxisConfig, area.width, 'bottom');\n }\n } else {\n if (yAxisConfig && yAxisConfig.grid) {\n renderGrid(\n groups.grid,\n valScale,\n yAxisConfig.grid,\n area.width,\n 'horizontal',\n resolveTickCount(yAxisConfig, area.height, 'left'),\n );\n }\n\n if (xAxisConfig !== false) {\n const xAxis = categoryAxis(xAxisConfig);\n\n positionAxis(groups.xAxis, xAxis.position ?? 'bottom', area.width, area.height);\n renderAxis(groups.xAxis, catScale, xAxis, area.width, 'bottom');\n }\n\n if (yAxisConfig) {\n positionAxis(groups.yAxis, yAxisConfig.position ?? 'left', area.width, area.height);\n renderAxis(groups.yAxis, valScale, yAxisConfig, area.height, 'left');\n }\n }\n\n // Series groups\n // Stacked segments stay square so they join cleanly.\n const themeRadius = stacked\n ? 0\n : Number.parseFloat(getComputedStyle(ctx.svg).getPropertyValue('--prism-bar-radius')) || 0;\n\n while (groups.series.children.length > seriesList.length) {\n const last = groups.series.lastElementChild;\n\n if (last) groups.series.removeChild(last);\n }\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-bar-series' });\n groups.series.appendChild(group);\n }\n\n group.setAttribute('data-series-id', seriesDomId(series, i));\n\n const barData = categories.map((key, categoryIndex) => {\n const datum = allData[i]?.[categoryIndex];\n\n if (stacked) {\n const base = stackTops[key] ?? 0;\n const top = base + Math.max(0, datum?.value ?? 0);\n\n stackTops[key] = top;\n\n return { base, dash: datum?.dash, key, opacity: datum?.opacity, present: datum !== undefined, y: top };\n }\n\n return {\n base: 0,\n dash: datum?.dash,\n key,\n opacity: datum?.opacity,\n present: datum !== undefined,\n y: datum?.value ?? 0,\n };\n });\n\n stackedTops[i] = barData.map((d) => d.y);\n\n const baselineYs = stacked ? barData.map((d) => valScale.map(d.base)) : undefined;\n\n renderBars(group, barData, catScale, valScale, sc.baselinePx, {\n baselineYs,\n borderRadius: series.borderRadius ?? themeRadius,\n color: seriesColor(i, series.color),\n disposalSignal: ctx.disposalSignal,\n horizontal,\n seriesCount: seriesList.length,\n seriesIndex: i,\n stacked,\n transition: reason === 'resize' ? false : config.transition,\n });\n }\n\n tooltip?.hide();\n groups.series.classList.toggle('prism-bars-stacked', stacked);\n\n if (!band || !ctx.chartArea.contains(band)) {\n band = createSvgElement('rect', { 'aria-hidden': 'true', class: 'prism-bar-band', 'pointer-events': 'none' });\n ctx.chartArea.insertBefore(band, groups.series);\n }\n\n band.style.display = 'none';\n\n // ─── Event handlers (close over render-derived state) ─────────────────────\n\n const colors = seriesList.map((s, i) => seriesColor(i, s.color));\n const labelOf = (catIdx: number): string => String(model.labels.get(categories[catIdx]) ?? categories[catIdx]);\n let activeCat = -1;\n\n const valuesAt = (catIdx: number): SeriesValue[] =>\n seriesList.map((series, si) => ({ datum: allData[si]?.[catIdx], series }));\n\n const eventAt = (catIdx: number, seriesIdx: number, originalEvent: Event): ChartEvent | null => {\n const values = valuesAt(catIdx);\n const preferred = values[seriesIdx]?.datum ? seriesIdx : values.findIndex((v) => v.datum);\n const datum = values[preferred]?.datum;\n\n return datum ? { datum, originalEvent, series: seriesList[preferred], values } : null;\n };\n\n const setActive = (catIdx: number): void => {\n activeCat = catIdx;\n groups.series.classList.toggle('prism-bars-focused', catIdx >= 0);\n\n for (const group of groups.series.children) {\n for (const [i, rect] of [...group.children].entries())\n rect.classList.toggle('prism-bar--active', i === catIdx);\n }\n\n if (!band) return;\n\n band.style.display = catIdx < 0 ? 'none' : '';\n\n if (catIdx < 0) return;\n\n const start = sc.bandCenter(categories[catIdx]) - catScale.bandwidth() / 2 - catScale.gap() / 2;\n const size = catScale.bandwidth() + catScale.gap();\n const a = chartArea(ctx.dimensions.width, ctx.dimensions.height, ctx.dimensions.margin);\n\n setAttributes(\n band,\n horizontal\n ? { height: size, width: a.width, x: 0, y: start }\n : { height: a.height, width: size, x: start, y: 0 },\n );\n };\n\n const activate = (catIdx: number, seriesIdx: number, originalEvent: Event): void => {\n const event = eventAt(catIdx, seriesIdx, originalEvent);\n\n if (!event) return;\n\n setActive(catIdx);\n\n const values = event.values ?? [];\n const spoken = describeValues(labelOf(catIdx), values);\n\n if (tooltip) {\n const tops = values.map((v, si) =>\n stacked ? (stackedTops[si]?.[catIdx] ?? 0) : Math.max(0, v.datum?.value ?? 0),\n );\n const valuePx = valScale.map(Math.max(...tops));\n const bandCenterPx = sc.bandCenter(categories[catIdx]);\n const { margin } = ctx.dimensions;\n const rows = values.flatMap((v, si) =>\n v.datum ? [{ color: colors[si], name: v.series.name, value: String(v.datum.value) }] : [],\n );\n\n tooltip.show(\n (horizontal ? valuePx : bandCenterPx) + margin.left,\n (horizontal ? bandCenterPx : valuePx) + margin.top,\n event.datum,\n event.series,\n comparisonContent(ctx.svg.ownerDocument, labelOf(catIdx), rows, spoken),\n );\n } else {\n ctx.announcer.announce(spoken);\n }\n\n config.onHover?.(event);\n };\n\n const deactivate = (): void => {\n setActive(-1);\n tooltip?.hide();\n ctx.announcer.clear();\n config.onHover?.(null);\n };\n\n const hit = (event: MouseEvent): { catIdx: number; seriesIdx: number } | null => {\n const d = ctx.dimensions;\n const pos = getMousePosition(ctx.svg, event, d.margin.left, d.margin.top);\n const a = chartArea(d.width, d.height, d.margin);\n\n if (pos.x < 0 || pos.x > a.width || pos.y < 0 || pos.y > a.height) return null;\n\n const catIdx = findCatIdx(horizontal ? pos.y : pos.x, categories, sc);\n\n return catIdx === -1\n ? null\n : { catIdx, seriesIdx: findSeriesIdx(pos, catIdx, categories, sc, seriesList.length) };\n };\n\n const onMouseMove = (event: MouseEvent) => {\n const target = hit(event);\n\n if (target) activate(target.catIdx, target.seriesIdx, event);\n else if (activeCat >= 0) deactivate();\n };\n\n const onClick = (event: MouseEvent) => {\n const target = config.onClick && hit(event);\n const chartEvent = target && eventAt(target.catIdx, target.seriesIdx, event);\n\n if (chartEvent) config.onClick?.(chartEvent);\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n const last = categories.length - 1;\n const prev = activeCat < 0 ? last : Math.max(0, activeCat - 1);\n const next = activeCat < 0 ? 0 : Math.min(last, activeCat + 1);\n const target: Record<string, number> = {\n ArrowDown: next,\n ArrowLeft: prev,\n ArrowRight: next,\n ArrowUp: prev,\n End: last,\n Home: 0,\n };\n\n if (event.key in target) {\n event.preventDefault();\n activate(target[event.key], 0, event);\n } else if ((event.key === 'Enter' || event.key === ' ') && activeCat >= 0 && config.onClick) {\n event.preventDefault();\n\n const chartEvent = eventAt(activeCat, 0, event);\n\n if (chartEvent) config.onClick(chartEvent);\n } else if (event.key === 'Escape') {\n deactivate();\n }\n };\n\n return { onClick, onKeyDown, onMouseLeave: deactivate, onMouseMove };\n },\n (data) => {\n seriesList = data;\n },\n );\n}\n"],"mappings":"klBA4BA,SAAS,aAAa,EAAgE,CACpF,MAAO,CACL,WAAY,IAAY,sBAAwB,IAAY,qBAC5D,QAAS,IAAY,WAAa,IAAY,oBAChD,CACF,CAIA,SAAgB,eAAe,EAAwB,EAAwD,CAC7G,IAAI,EAAa,EAAO,OACpB,EAA8B,KAElC,OAAO,EAAA,oBACL,EACA,GACC,EAAK,IAAW,CACf,GAAM,CAAE,SAAQ,SAAQ,WAAY,EACpC,GAAQ,OAAO,EAAW,KAAK,EAAG,KAAO,CAAE,MAAO,EAAA,YAAY,EAAG,EAAE,KAAK,EAAG,KAAM,EAAE,IAAK,EAAE,CAAC,EAC3F,IAAM,EAAO,EAAI,WACX,EAAO,EAAA,UAAU,EAAK,MAAO,EAAK,OAAQ,EAAK,MAAM,EACrD,EAAa,EAAW,IAAK,GAAW,EAAO,IAAI,EACnD,EAAQ,EAAA,yBAAyB,EAAY,CAAU,EACvD,EAAa,EAAM,OACnB,EAAU,EAAM,OAAO,KAAK,CAAE,WAAY,EAAW,IAAK,GAAQ,EAAM,IAAI,CAAG,CAAC,CAAC,EACjF,aAAgB,IACb,CACL,GAAG,EACH,WAAa,GAAkC,CAC7C,IAAM,EAAM,OAAO,CAAK,EAClB,EAAQ,EAAM,OAAO,IAAI,CAAG,GAAK,EAEvC,OAAO,EAAK,WAAa,EAAK,WAAW,CAAK,EAAI,OAAO,CAAK,CAChE,CACF,GAGF,GAAI,EAAW,SAAW,EAAG,CAC3B,EAAA,kBAAkB,EAAQ,EAAQ,CAAO,EACzC,GAAM,OAAO,EACb,EAAO,KAEP,MACF,CAEA,GAAM,CAAE,aAAY,WAAY,aAAa,EAAO,SAAW,SAAS,EAIlE,EACJ,EAAO,QAAU,GAAQ,GAAS,EAAO,QAAU,EAAa,CAAE,KAAM,EAAK,EAAI,CAAC,GAC9E,EACJ,EAAO,QAAU,GAAQ,GAAS,EAAO,QAAU,EAAa,CAAC,EAAI,CAAE,KAAM,EAAK,GAGhF,EACA,EAEJ,GAAI,EAAS,CACP,EAAQ,KAAM,GAAe,EAAW,KAAM,IAAW,GAAO,OAAS,GAAK,CAAC,CAAC,EAMpF,IAAM,EAAO,EAAW,KAAK,EAAG,IAC9B,EAAQ,QAAQ,EAAK,IAAe,EAAM,KAAK,IAAI,EAAG,EAAW,EAAc,EAAE,OAAS,CAAC,EAAG,CAAC,CACjG,EAEA,EAAO,KAAK,IAAI,GAAG,CAAI,EACvB,EAAO,CACT,KAAO,CACL,IAAM,EAAO,EAAQ,QAAS,GAAe,EAAW,QAAS,GAAW,EAAQ,CAAC,EAAM,KAAK,EAAI,CAAC,CAAE,CAAC,EAExG,EAAO,KAAK,IAAI,GAAG,CAAI,EACvB,EAAO,KAAK,IAAI,EAAG,GAAG,CAAI,CAC5B,CAGA,IAAM,EAAW,EACb,EAAA,UAAU,CAAE,OAAQ,EAAY,MAAO,CAAC,EAAG,EAAK,MAAM,CAAE,CAAC,EACzD,EAAA,UAAU,CAAE,OAAQ,EAAY,MAAO,CAAC,EAAG,EAAK,KAAK,CAAE,CAAC,EAEtD,EAAW,EACb,EAAA,YAAY,CAAE,OAAQ,CAAC,EAAM,CAAI,EAAG,MAAO,CAAC,EAAG,EAAK,KAAK,CAAE,CAAC,EAC5D,EAAA,YAAY,CAAE,OAAQ,CAAC,EAAM,CAAI,EAAG,MAAO,CAAC,EAAK,OAAQ,CAAC,CAAE,CAAC,EAE3D,EAA0B,CAAC,EAC3B,EAAY,OAAO,OAAO,IAAI,EAEpC,IAAK,IAAM,KAAO,EAAY,EAAU,GAAO,EAE/C,IAAM,EAAsB,CAC1B,WAAa,GAAQ,EAAS,IAAI,CAAG,EAAI,EAAS,UAAU,EAAI,EAChE,UAAW,EAAS,UAAU,EAC9B,WAAY,EAAS,IAAI,CAAC,EAC1B,aACA,UACA,cACA,WAAY,CACd,EAGA,GAAI,EAAY,CAYd,GAXI,GAAe,EAAY,MAC7B,EAAA,WACE,EAAO,KACP,EACA,EAAY,KACZ,EAAK,OACL,WACA,EAAA,iBAAiB,EAAa,EAAK,MAAO,QAAQ,CACpD,EAGE,IAAgB,GAAO,CACzB,IAAM,EAAQ,aAAa,CAAW,EAEtC,EAAA,aAAa,EAAO,MAAO,EAAM,UAAY,OAAQ,EAAK,MAAO,EAAK,MAAM,EAC5E,EAAA,WAAW,EAAO,MAAO,EAAU,EAAO,EAAK,OAAQ,MAAM,CAC/D,CAEI,IACF,EAAA,aAAa,EAAO,MAAO,EAAY,UAAY,SAAU,EAAK,MAAO,EAAK,MAAM,EACpF,EAAA,WAAW,EAAO,MAAO,EAAU,EAAa,EAAK,MAAO,QAAQ,EAExE,KAAO,CAYL,GAXI,GAAe,EAAY,MAC7B,EAAA,WACE,EAAO,KACP,EACA,EAAY,KACZ,EAAK,MACL,aACA,EAAA,iBAAiB,EAAa,EAAK,OAAQ,MAAM,CACnD,EAGE,IAAgB,GAAO,CACzB,IAAM,EAAQ,aAAa,CAAW,EAEtC,EAAA,aAAa,EAAO,MAAO,EAAM,UAAY,SAAU,EAAK,MAAO,EAAK,MAAM,EAC9E,EAAA,WAAW,EAAO,MAAO,EAAU,EAAO,EAAK,MAAO,QAAQ,CAChE,CAEI,IACF,EAAA,aAAa,EAAO,MAAO,EAAY,UAAY,OAAQ,EAAK,MAAO,EAAK,MAAM,EAClF,EAAA,WAAW,EAAO,MAAO,EAAU,EAAa,EAAK,OAAQ,MAAM,EAEvE,CAIA,IAAM,EAAc,EAChB,EACA,OAAO,WAAW,iBAAiB,EAAI,GAAG,CAAC,CAAC,iBAAiB,oBAAoB,CAAC,GAAK,EAE3F,KAAO,EAAO,OAAO,SAAS,OAAS,EAAW,QAAQ,CACxD,IAAM,EAAO,EAAO,OAAO,iBAEvB,GAAM,EAAO,OAAO,YAAY,CAAI,CAC1C,CAEA,IAAK,IAAI,EAAI,EAAG,EAAI,EAAW,OAAQ,IAAK,CAC1C,IAAM,EAAS,EAAW,GACtB,EAAQ,EAAO,OAAO,SAAS,GAE9B,IACH,EAAQ,EAAA,iBAAiB,IAAK,CAAE,MAAO,kBAAmB,CAAC,EAC3D,EAAO,OAAO,YAAY,CAAK,GAGjC,EAAM,aAAa,iBAAkB,EAAA,YAAY,EAAQ,CAAC,CAAC,EAE3D,IAAM,EAAU,EAAW,KAAK,EAAK,IAAkB,CACrD,IAAM,EAAQ,EAAQ,EAAE,GAAG,GAE3B,GAAI,EAAS,CACX,IAAM,EAAO,EAAU,IAAQ,EACzB,EAAM,EAAO,KAAK,IAAI,EAAG,GAAO,OAAS,CAAC,EAIhD,MAFA,GAAU,GAAO,EAEV,CAAE,OAAM,KAAM,GAAO,KAAM,MAAK,QAAS,GAAO,QAAS,QAAS,IAAU,IAAA,GAAW,EAAG,CAAI,CACvG,CAEA,MAAO,CACL,KAAM,EACN,KAAM,GAAO,KACb,MACA,QAAS,GAAO,QAChB,QAAS,IAAU,IAAA,GACnB,EAAG,GAAO,OAAS,CACrB,CACF,CAAC,EAED,EAAY,GAAK,EAAQ,IAAK,GAAM,EAAE,CAAC,EAEvC,IAAM,EAAa,EAAU,EAAQ,IAAK,GAAM,EAAS,IAAI,EAAE,IAAI,CAAC,EAAI,IAAA,GAExE,EAAA,WAAW,EAAO,EAAS,EAAU,EAAU,EAAG,WAAY,CAC5D,aACA,aAAc,EAAO,cAAgB,EACrC,MAAO,EAAA,YAAY,EAAG,EAAO,KAAK,EAClC,eAAgB,EAAI,eACpB,aACA,YAAa,EAAW,OACxB,YAAa,EACb,UACA,WAAY,IAAW,UAAmB,EAAO,UACnD,CAAC,CACH,CAEA,GAAS,KAAK,EACd,EAAO,OAAO,UAAU,OAAO,qBAAsB,CAAO,GAExD,CAAC,GAAQ,CAAC,EAAI,UAAU,SAAS,CAAI,KACvC,EAAO,EAAA,iBAAiB,OAAQ,CAAE,cAAe,OAAQ,MAAO,iBAAkB,iBAAkB,MAAO,CAAC,EAC5G,EAAI,UAAU,aAAa,EAAM,EAAO,MAAM,GAGhD,EAAK,MAAM,QAAU,OAIrB,IAAM,EAAS,EAAW,KAAK,EAAG,IAAM,EAAA,YAAY,EAAG,EAAE,KAAK,CAAC,EACzD,QAAW,GAA2B,OAAO,EAAM,OAAO,IAAI,EAAW,EAAO,GAAK,EAAW,EAAO,EACzG,EAAY,GAEV,SAAY,GAChB,EAAW,KAAK,EAAQ,KAAQ,CAAE,MAAO,EAAQ,EAAG,GAAG,GAAS,QAAO,EAAE,EAErE,SAAW,EAAgB,EAAmB,IAA4C,CAC9F,IAAM,EAAS,SAAS,CAAM,EACxB,EAAY,EAAO,EAAU,EAAE,MAAQ,EAAY,EAAO,UAAW,GAAM,EAAE,KAAK,EAClF,EAAQ,EAAO,EAAU,EAAE,MAEjC,OAAO,EAAQ,CAAE,QAAO,gBAAe,OAAQ,EAAW,GAAY,QAAO,EAAI,IACnF,EAEM,UAAa,GAAyB,CAC1C,EAAY,EACZ,EAAO,OAAO,UAAU,OAAO,qBAAsB,GAAU,CAAC,EAEhE,IAAK,IAAM,KAAS,EAAO,OAAO,SAChC,IAAK,GAAM,CAAC,EAAG,IAAS,CAAC,GAAG,EAAM,QAAQ,CAAC,CAAC,QAAQ,EAClD,EAAK,UAAU,OAAO,oBAAqB,IAAM,CAAM,EAO3D,GAJI,CAAC,IAEL,EAAK,MAAM,QAAU,EAAS,EAAI,OAAS,GAEvC,EAAS,GAAG,OAEhB,IAAM,EAAQ,EAAG,WAAW,EAAW,EAAO,EAAI,EAAS,UAAU,EAAI,EAAI,EAAS,IAAI,EAAI,EACxF,EAAO,EAAS,UAAU,EAAI,EAAS,IAAI,EAC3C,EAAI,EAAA,UAAU,EAAI,WAAW,MAAO,EAAI,WAAW,OAAQ,EAAI,WAAW,MAAM,EAEtF,EAAA,cACE,EACA,EACI,CAAE,OAAQ,EAAM,MAAO,EAAE,MAAO,EAAG,EAAG,EAAG,CAAM,EAC/C,CAAE,OAAQ,EAAE,OAAQ,MAAO,EAAM,EAAG,EAAO,EAAG,CAAE,CACtD,CACF,EAEM,UAAY,EAAgB,EAAmB,IAA+B,CAClF,IAAM,EAAQ,QAAQ,EAAQ,EAAW,CAAa,EAEtD,GAAI,CAAC,EAAO,OAEZ,UAAU,CAAM,EAEhB,IAAM,EAAS,EAAM,QAAU,CAAC,EAC1B,EAAS,EAAA,eAAe,QAAQ,CAAM,EAAG,CAAM,EAErD,GAAI,EAAS,CACX,IAAM,EAAO,EAAO,KAAK,EAAG,IAC1B,EAAW,EAAY,EAAG,GAAG,IAAW,EAAK,KAAK,IAAI,EAAG,EAAE,OAAO,OAAS,CAAC,CAC9E,EACM,EAAU,EAAS,IAAI,KAAK,IAAI,GAAG,CAAI,CAAC,EACxC,EAAe,EAAG,WAAW,EAAW,EAAO,EAC/C,CAAE,UAAW,EAAI,WACjB,EAAO,EAAO,SAAS,EAAG,IAC9B,EAAE,MAAQ,CAAC,CAAE,MAAO,EAAO,GAAK,KAAM,EAAE,OAAO,KAAM,MAAO,OAAO,EAAE,MAAM,KAAK,CAAE,CAAC,EAAI,CAAC,CAC1F,EAEA,EAAQ,MACL,EAAa,EAAU,GAAgB,EAAO,MAC9C,EAAa,EAAe,GAAW,EAAO,IAC/C,EAAM,MACN,EAAM,OACN,EAAA,kBAAkB,EAAI,IAAI,cAAe,QAAQ,CAAM,EAAG,EAAM,CAAM,CACxE,CACF,MACE,EAAI,UAAU,SAAS,CAAM,EAG/B,EAAO,UAAU,CAAK,CACxB,EAEM,eAAyB,CAC7B,UAAU,EAAE,EACZ,GAAS,KAAK,EACd,EAAI,UAAU,MAAM,EACpB,EAAO,UAAU,IAAI,CACvB,EAEM,IAAO,GAAoE,CAC/E,IAAM,EAAI,EAAI,WACR,EAAM,EAAA,iBAAiB,EAAI,IAAK,EAAO,EAAE,OAAO,KAAM,EAAE,OAAO,GAAG,EAClE,EAAI,EAAA,UAAU,EAAE,MAAO,EAAE,OAAQ,EAAE,MAAM,EAE/C,GAAI,EAAI,EAAI,GAAK,EAAI,EAAI,EAAE,OAAS,EAAI,EAAI,GAAK,EAAI,EAAI,EAAE,OAAQ,OAAO,KAE1E,IAAM,EAAS,EAAA,WAAW,EAAa,EAAI,EAAI,EAAI,EAAG,EAAY,CAAE,EAEpE,OAAO,IAAW,GACd,KACA,CAAE,SAAQ,UAAW,EAAA,cAAc,EAAK,EAAQ,EAAY,EAAI,EAAW,MAAM,CAAE,CACzF,EAEM,YAAe,GAAsB,CACzC,IAAM,EAAS,IAAI,CAAK,EAEpB,EAAQ,SAAS,EAAO,OAAQ,EAAO,UAAW,CAAK,EAClD,GAAa,GAAG,WAAW,CACtC,EAEM,QAAW,GAAsB,CACrC,IAAM,EAAS,EAAO,SAAW,IAAI,CAAK,EACpC,EAAa,GAAU,QAAQ,EAAO,OAAQ,EAAO,UAAW,CAAK,EAEvE,GAAY,EAAO,UAAU,CAAU,CAC7C,EAEM,UAAa,GAAyB,CAC1C,IAAM,EAAO,EAAW,OAAS,EAC3B,EAAO,EAAY,EAAI,EAAO,KAAK,IAAI,EAAG,EAAY,CAAC,EACvD,EAAO,EAAY,EAAI,EAAI,KAAK,IAAI,EAAM,EAAY,CAAC,EACvD,EAAiC,CACrC,UAAW,EACX,UAAW,EACX,WAAY,EACZ,QAAS,EACT,IAAK,EACL,KAAM,CACR,EAEA,GAAI,EAAM,OAAO,EACf,EAAM,eAAe,EACrB,SAAS,EAAO,EAAM,KAAM,EAAG,CAAK,OAC/B,IAAK,EAAM,MAAQ,SAAW,EAAM,MAAQ,MAAQ,GAAa,GAAK,EAAO,QAAS,CAC3F,EAAM,eAAe,EAErB,IAAM,EAAa,QAAQ,EAAW,EAAG,CAAK,EAE1C,GAAY,EAAO,QAAQ,CAAU,CAC3C,MAAW,EAAM,MAAQ,UACvB,WAAW,CAEf,EAEA,MAAO,CAAE,QAAS,UAAW,aAAc,WAAY,WAAY,CACrE,EACC,GAAS,CACR,EAAa,CACf,CACF,CACF"}
|
|
1
|
+
{"version":3,"file":"bar-chart.cjs","names":[],"sources":["../../../src/charts/bar/bar-chart.ts"],"sourcesContent":["import { warn } from '../../_dev';\nimport { positionAxis, renderAxis, resolveTickCount, resolveTicks } from '../../axes/axis';\nimport { renderGrid } from '../../axes/grid';\nimport { normalizeCartesianSeries } from '../../core/cartesian-model';\nimport { clearCartesianDom, createChartScaffold } from '../../core/chart-scaffold';\nimport { chartArea } from '../../core/layout';\nimport { seriesDomId } from '../../core/series-id';\nimport { describeValues } from '../../interaction/announcer';\nimport { getMousePosition } from '../../interaction/events';\nimport { comparisonContent } from '../../interaction/tooltip';\nimport { bandScale } from '../../scales/band';\nimport { linearScale } from '../../scales/linear';\nimport { createSvgElement, setAttributes } from '../../svg/element';\nimport { seriesColor } from '../../theme';\nimport type {\n BarChartConfig,\n BarSeriesConfig,\n BarVariant,\n ChartEvent,\n ChartHandle,\n Datum,\n SeriesValue,\n XAxisConfig,\n YAxisConfig,\n} from '../../types';\nimport { findCatIdx, findSeriesIdx } from './bar-hit-test';\nimport { renderBars } from './bar-renderer';\nimport type { BarScaleContext } from './bar-scale-context';\n\nfunction variantFlags(variant: BarVariant): { horizontal: boolean; stacked: boolean } {\n return {\n horizontal: variant === 'grouped-horizontal' || variant === 'stacked-horizontal',\n stacked: variant === 'stacked' || variant === 'stacked-horizontal',\n };\n}\n\n// ─── Chart ────────────────────────────────────────────────────────────────────\n\nexport function createBarChart(container: HTMLElement, config: BarChartConfig): ChartHandle<BarSeriesConfig[]> {\n let seriesList = config.series;\n let band: SVGRectElement | null = null;\n\n return createChartScaffold(\n container,\n config,\n (ctx, reason) => {\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 sourceData = seriesList.map((series) => series.data);\n const model = normalizeCartesianSeries(seriesList, sourceData);\n const categories = model.domain;\n const allData = model.series.map(({ byKey }) => categories.map((key) => byKey.get(key)));\n const categoryAxis = (axis: XAxisConfig | YAxisConfig) => {\n return {\n ...axis,\n tickFormat: (value: Date | number | string) => {\n const key = String(value);\n const label = model.labels.get(key) ?? value;\n\n return axis.tickFormat ? axis.tickFormat(label) : String(label);\n },\n };\n };\n\n if (categories.length === 0) {\n clearCartesianDom(groups, legend, tooltip);\n band?.remove();\n band = null;\n\n return;\n }\n\n const { horizontal, stacked } = variantFlags(config.variant ?? 'grouped');\n\n // Axes render by default; `false` opts out. The value axis (x when horizontal, y\n // otherwise) carries gridlines by default and merges over that default, so a partial\n // config (e.g. only `tickFormat`) keeps the gridlines; the category axis defaults to none.\n const xAxisConfig: XAxisConfig | false =\n config.xAxis === false ? false : horizontal ? { grid: true, ...config.xAxis } : (config.xAxis ?? {});\n const yAxisConfig: YAxisConfig | false =\n config.yAxis === false ? false : horizontal ? (config.yAxis ?? {}) : { grid: true, ...config.yAxis };\n\n // Value domain\n let vMax: number;\n let vMin: number;\n\n if (stacked) {\n if (allData.some((seriesData) => seriesData.some((datum) => (datum?.value ?? 0) < 0))) {\n warn(\n 'createBarChart: negative values in a stacked/stacked-horizontal series are clamped to 0: stacking mixed-sign data is not supported.',\n );\n }\n\n const sums = categories.map((_, categoryIndex) =>\n allData.reduce((sum, seriesData) => sum + Math.max(0, seriesData[categoryIndex]?.value ?? 0), 0),\n );\n\n vMax = Math.max(...sums);\n vMin = 0;\n } else {\n const allY = allData.flatMap((seriesData) => seriesData.flatMap((datum) => (datum ? [datum.value] : [])));\n\n vMax = Math.max(...allY);\n vMin = Math.min(0, ...allY);\n }\n\n // Build uniform scale context\n const catScale = horizontal\n ? bandScale({ domain: categories, range: [0, area.height] })\n : bandScale({ domain: categories, range: [0, area.width] });\n\n const valScale = horizontal\n ? linearScale({ domain: [vMin, vMax], range: [0, area.width] })\n : linearScale({ domain: [vMin, vMax], range: [area.height, 0] });\n\n const stackedTops: number[][] = [];\n const stackTops = Object.create(null) as Record<string, number>;\n\n for (const cat of categories) stackTops[cat] = 0;\n\n const sc: BarScaleContext = {\n bandCenter: (cat) => catScale.map(cat) + catScale.bandwidth() / 2,\n bandwidth: catScale.bandwidth(),\n baselinePx: valScale.map(0),\n horizontal,\n stacked,\n stackedTops,\n valueScale: valScale,\n };\n\n // Axes & grid\n if (horizontal) {\n if (xAxisConfig && xAxisConfig.grid) {\n renderGrid(\n groups.grid,\n valScale,\n xAxisConfig.grid,\n area.height,\n 'vertical',\n resolveTicks(valScale, xAxisConfig, resolveTickCount(xAxisConfig, area.width, 'bottom')),\n );\n }\n\n if (yAxisConfig !== false) {\n const yAxis = categoryAxis(yAxisConfig);\n\n positionAxis(groups.yAxis, yAxis.position ?? 'left', area.width, area.height);\n renderAxis(groups.yAxis, catScale, yAxis, area.height, 'left');\n }\n\n if (xAxisConfig) {\n positionAxis(groups.xAxis, xAxisConfig.position ?? 'bottom', area.width, area.height);\n renderAxis(groups.xAxis, valScale, xAxisConfig, area.width, 'bottom');\n }\n } else {\n if (yAxisConfig && yAxisConfig.grid) {\n renderGrid(\n groups.grid,\n valScale,\n yAxisConfig.grid,\n area.width,\n 'horizontal',\n resolveTicks(valScale, yAxisConfig, resolveTickCount(yAxisConfig, area.height, 'left')),\n );\n }\n\n if (xAxisConfig !== false) {\n const xAxis = categoryAxis(xAxisConfig);\n\n positionAxis(groups.xAxis, xAxis.position ?? 'bottom', area.width, area.height);\n renderAxis(groups.xAxis, catScale, xAxis, area.width, 'bottom');\n }\n\n if (yAxisConfig) {\n positionAxis(groups.yAxis, yAxisConfig.position ?? 'left', area.width, area.height);\n renderAxis(groups.yAxis, valScale, yAxisConfig, area.height, 'left');\n }\n }\n\n // Series groups\n // Stacked segments stay square so they join cleanly.\n const themeRadius = stacked\n ? 0\n : Number.parseFloat(getComputedStyle(ctx.svg).getPropertyValue('--prism-bar-radius')) || 0;\n\n while (groups.series.children.length > seriesList.length) {\n const last = groups.series.lastElementChild;\n\n if (last) groups.series.removeChild(last);\n }\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-bar-series' });\n groups.series.appendChild(group);\n }\n\n group.setAttribute('data-series-id', seriesDomId(series, i));\n\n const barData = categories.map((key, categoryIndex) => {\n const datum = allData[i]?.[categoryIndex];\n\n if (stacked) {\n const base = stackTops[key] ?? 0;\n const top = base + Math.max(0, datum?.value ?? 0);\n\n stackTops[key] = top;\n\n return { base, dash: datum?.dash, key, opacity: datum?.opacity, present: datum !== undefined, y: top };\n }\n\n return {\n base: 0,\n dash: datum?.dash,\n key,\n opacity: datum?.opacity,\n present: datum !== undefined,\n y: datum?.value ?? 0,\n };\n });\n\n stackedTops[i] = barData.map((d) => d.y);\n\n const baselineYs = stacked ? barData.map((d) => valScale.map(d.base)) : undefined;\n\n renderBars(group, barData, catScale, valScale, sc.baselinePx, {\n baselineYs,\n borderRadius: series.borderRadius ?? themeRadius,\n color: seriesColor(i, series.color),\n disposalSignal: ctx.disposalSignal,\n horizontal,\n seriesCount: seriesList.length,\n seriesIndex: i,\n stacked,\n transition: reason === 'resize' ? false : config.transition,\n });\n }\n\n tooltip?.hide();\n groups.series.classList.toggle('prism-bars-stacked', stacked);\n\n if (!band || !ctx.chartArea.contains(band)) {\n band = createSvgElement('rect', { 'aria-hidden': 'true', class: 'prism-bar-band', 'pointer-events': 'none' });\n ctx.chartArea.insertBefore(band, groups.series);\n }\n\n band.style.display = 'none';\n\n // ─── Event handlers (close over render-derived state) ─────────────────────\n\n const colors = seriesList.map((s, i) => seriesColor(i, s.color));\n const labelOf = (catIdx: number): string => String(model.labels.get(categories[catIdx]) ?? categories[catIdx]);\n const tooltipFormat = typeof config.tooltip === 'object' ? config.tooltip : undefined;\n const keyOf = (catIdx: number): Datum['key'] => model.labels.get(categories[catIdx]) ?? categories[catIdx];\n const titleOf = (catIdx: number): string =>\n tooltipFormat?.titleFormat ? tooltipFormat.titleFormat(keyOf(catIdx)) : labelOf(catIdx);\n const formatValue = tooltipFormat?.valueFormat ?? String;\n let activeCat = -1;\n\n const valuesAt = (catIdx: number): SeriesValue[] =>\n seriesList.map((series, si) => ({ datum: allData[si]?.[catIdx], series }));\n\n const eventAt = (catIdx: number, seriesIdx: number, originalEvent: Event): ChartEvent | null => {\n const values = valuesAt(catIdx);\n const preferred = values[seriesIdx]?.datum ? seriesIdx : values.findIndex((v) => v.datum);\n const datum = values[preferred]?.datum;\n\n return datum ? { datum, originalEvent, series: seriesList[preferred], values } : null;\n };\n\n const setActive = (catIdx: number): void => {\n activeCat = catIdx;\n groups.series.classList.toggle('prism-bars-focused', catIdx >= 0);\n\n for (const group of groups.series.children) {\n for (const [i, rect] of [...group.children].entries())\n rect.classList.toggle('prism-bar--active', i === catIdx);\n }\n\n if (!band) return;\n\n band.style.display = catIdx < 0 ? 'none' : '';\n\n if (catIdx < 0) return;\n\n const start = sc.bandCenter(categories[catIdx]) - catScale.bandwidth() / 2 - catScale.gap() / 2;\n const size = catScale.bandwidth() + catScale.gap();\n const a = chartArea(ctx.dimensions.width, ctx.dimensions.height, ctx.dimensions.margin);\n\n setAttributes(\n band,\n horizontal\n ? { height: size, width: a.width, x: 0, y: start }\n : { height: a.height, width: size, x: start, y: 0 },\n );\n };\n\n const activate = (catIdx: number, seriesIdx: number, originalEvent: Event): void => {\n const event = eventAt(catIdx, seriesIdx, originalEvent);\n\n if (!event) return;\n\n setActive(catIdx);\n\n const values = event.values ?? [];\n const spoken = describeValues(titleOf(catIdx), values, formatValue);\n\n if (tooltip) {\n const tops = values.map((v, si) =>\n stacked ? (stackedTops[si]?.[catIdx] ?? 0) : Math.max(0, v.datum?.value ?? 0),\n );\n const valuePx = valScale.map(Math.max(...tops));\n const bandCenterPx = sc.bandCenter(categories[catIdx]);\n const { margin } = ctx.dimensions;\n const rows = values.flatMap((v, si) =>\n v.datum\n ? [{ color: colors[si], name: v.series.name, value: formatValue(v.datum.value, v.datum, v.series) }]\n : [],\n );\n\n tooltip.show(\n (horizontal ? valuePx : bandCenterPx) + margin.left,\n (horizontal ? bandCenterPx : valuePx) + margin.top,\n event.datum,\n event.series,\n comparisonContent(ctx.svg.ownerDocument, titleOf(catIdx), rows, spoken),\n );\n } else {\n ctx.announcer.announce(spoken);\n }\n\n config.onHover?.(event);\n };\n\n const deactivate = (): void => {\n setActive(-1);\n tooltip?.hide();\n ctx.announcer.clear();\n config.onHover?.(null);\n };\n\n const hit = (event: MouseEvent): { catIdx: number; seriesIdx: number } | null => {\n const d = ctx.dimensions;\n const pos = getMousePosition(ctx.svg, event, d.margin.left, d.margin.top);\n const a = chartArea(d.width, d.height, d.margin);\n\n if (pos.x < 0 || pos.x > a.width || pos.y < 0 || pos.y > a.height) return null;\n\n const catIdx = findCatIdx(horizontal ? pos.y : pos.x, categories, sc);\n\n return catIdx === -1\n ? null\n : { catIdx, seriesIdx: findSeriesIdx(pos, catIdx, categories, sc, seriesList.length) };\n };\n\n const onMouseMove = (event: MouseEvent) => {\n const target = hit(event);\n\n if (target) activate(target.catIdx, target.seriesIdx, event);\n else if (activeCat >= 0) deactivate();\n };\n\n const onClick = (event: MouseEvent) => {\n const target = config.onClick && hit(event);\n const chartEvent = target && eventAt(target.catIdx, target.seriesIdx, event);\n\n if (chartEvent) config.onClick?.(chartEvent);\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n const last = categories.length - 1;\n const prev = activeCat < 0 ? last : Math.max(0, activeCat - 1);\n const next = activeCat < 0 ? 0 : Math.min(last, activeCat + 1);\n const target: Record<string, number> = {\n ArrowDown: next,\n ArrowLeft: prev,\n ArrowRight: next,\n ArrowUp: prev,\n End: last,\n Home: 0,\n };\n\n if (event.key in target) {\n event.preventDefault();\n activate(target[event.key], 0, event);\n } else if ((event.key === 'Enter' || event.key === ' ') && activeCat >= 0 && config.onClick) {\n event.preventDefault();\n\n const chartEvent = eventAt(activeCat, 0, event);\n\n if (chartEvent) config.onClick(chartEvent);\n } else if (event.key === 'Escape') {\n deactivate();\n }\n };\n\n return { onClick, onKeyDown, onMouseLeave: deactivate, onMouseMove };\n },\n (data) => {\n seriesList = data;\n },\n );\n}\n"],"mappings":"klBA6BA,SAAS,aAAa,EAAgE,CACpF,MAAO,CACL,WAAY,IAAY,sBAAwB,IAAY,qBAC5D,QAAS,IAAY,WAAa,IAAY,oBAChD,CACF,CAIA,SAAgB,eAAe,EAAwB,EAAwD,CAC7G,IAAI,EAAa,EAAO,OACpB,EAA8B,KAElC,OAAO,EAAA,oBACL,EACA,GACC,EAAK,IAAW,CACf,GAAM,CAAE,SAAQ,SAAQ,WAAY,EACpC,GAAQ,OAAO,EAAW,KAAK,EAAG,KAAO,CAAE,MAAO,EAAA,YAAY,EAAG,EAAE,KAAK,EAAG,KAAM,EAAE,IAAK,EAAE,CAAC,EAC3F,IAAM,EAAO,EAAI,WACX,EAAO,EAAA,UAAU,EAAK,MAAO,EAAK,OAAQ,EAAK,MAAM,EACrD,EAAa,EAAW,IAAK,GAAW,EAAO,IAAI,EACnD,EAAQ,EAAA,yBAAyB,EAAY,CAAU,EACvD,EAAa,EAAM,OACnB,EAAU,EAAM,OAAO,KAAK,CAAE,WAAY,EAAW,IAAK,GAAQ,EAAM,IAAI,CAAG,CAAC,CAAC,EACjF,aAAgB,IACb,CACL,GAAG,EACH,WAAa,GAAkC,CAC7C,IAAM,EAAM,OAAO,CAAK,EAClB,EAAQ,EAAM,OAAO,IAAI,CAAG,GAAK,EAEvC,OAAO,EAAK,WAAa,EAAK,WAAW,CAAK,EAAI,OAAO,CAAK,CAChE,CACF,GAGF,GAAI,EAAW,SAAW,EAAG,CAC3B,EAAA,kBAAkB,EAAQ,EAAQ,CAAO,EACzC,GAAM,OAAO,EACb,EAAO,KAEP,MACF,CAEA,GAAM,CAAE,aAAY,WAAY,aAAa,EAAO,SAAW,SAAS,EAKlE,EACJ,EAAO,QAAU,GAAQ,GAAQ,EAAa,CAAE,KAAM,GAAM,GAAG,EAAO,KAAM,EAAK,EAAO,OAAS,CAAC,EAC9F,EACJ,EAAO,QAAU,GAAQ,GAAQ,EAAc,EAAO,OAAS,CAAC,EAAK,CAAE,KAAM,GAAM,GAAG,EAAO,KAAM,EAGjG,EACA,EAEJ,GAAI,EAAS,CACP,EAAQ,KAAM,GAAe,EAAW,KAAM,IAAW,GAAO,OAAS,GAAK,CAAC,CAAC,EAMpF,IAAM,EAAO,EAAW,KAAK,EAAG,IAC9B,EAAQ,QAAQ,EAAK,IAAe,EAAM,KAAK,IAAI,EAAG,EAAW,EAAc,EAAE,OAAS,CAAC,EAAG,CAAC,CACjG,EAEA,EAAO,KAAK,IAAI,GAAG,CAAI,EACvB,EAAO,CACT,KAAO,CACL,IAAM,EAAO,EAAQ,QAAS,GAAe,EAAW,QAAS,GAAW,EAAQ,CAAC,EAAM,KAAK,EAAI,CAAC,CAAE,CAAC,EAExG,EAAO,KAAK,IAAI,GAAG,CAAI,EACvB,EAAO,KAAK,IAAI,EAAG,GAAG,CAAI,CAC5B,CAGA,IAAM,EAAW,EACb,EAAA,UAAU,CAAE,OAAQ,EAAY,MAAO,CAAC,EAAG,EAAK,MAAM,CAAE,CAAC,EACzD,EAAA,UAAU,CAAE,OAAQ,EAAY,MAAO,CAAC,EAAG,EAAK,KAAK,CAAE,CAAC,EAEtD,EAAW,EACb,EAAA,YAAY,CAAE,OAAQ,CAAC,EAAM,CAAI,EAAG,MAAO,CAAC,EAAG,EAAK,KAAK,CAAE,CAAC,EAC5D,EAAA,YAAY,CAAE,OAAQ,CAAC,EAAM,CAAI,EAAG,MAAO,CAAC,EAAK,OAAQ,CAAC,CAAE,CAAC,EAE3D,EAA0B,CAAC,EAC3B,EAAY,OAAO,OAAO,IAAI,EAEpC,IAAK,IAAM,KAAO,EAAY,EAAU,GAAO,EAE/C,IAAM,EAAsB,CAC1B,WAAa,GAAQ,EAAS,IAAI,CAAG,EAAI,EAAS,UAAU,EAAI,EAChE,UAAW,EAAS,UAAU,EAC9B,WAAY,EAAS,IAAI,CAAC,EAC1B,aACA,UACA,cACA,WAAY,CACd,EAGA,GAAI,EAAY,CAYd,GAXI,GAAe,EAAY,MAC7B,EAAA,WACE,EAAO,KACP,EACA,EAAY,KACZ,EAAK,OACL,WACA,EAAA,aAAa,EAAU,EAAa,EAAA,iBAAiB,EAAa,EAAK,MAAO,QAAQ,CAAC,CACzF,EAGE,IAAgB,GAAO,CACzB,IAAM,EAAQ,aAAa,CAAW,EAEtC,EAAA,aAAa,EAAO,MAAO,EAAM,UAAY,OAAQ,EAAK,MAAO,EAAK,MAAM,EAC5E,EAAA,WAAW,EAAO,MAAO,EAAU,EAAO,EAAK,OAAQ,MAAM,CAC/D,CAEI,IACF,EAAA,aAAa,EAAO,MAAO,EAAY,UAAY,SAAU,EAAK,MAAO,EAAK,MAAM,EACpF,EAAA,WAAW,EAAO,MAAO,EAAU,EAAa,EAAK,MAAO,QAAQ,EAExE,KAAO,CAYL,GAXI,GAAe,EAAY,MAC7B,EAAA,WACE,EAAO,KACP,EACA,EAAY,KACZ,EAAK,MACL,aACA,EAAA,aAAa,EAAU,EAAa,EAAA,iBAAiB,EAAa,EAAK,OAAQ,MAAM,CAAC,CACxF,EAGE,IAAgB,GAAO,CACzB,IAAM,EAAQ,aAAa,CAAW,EAEtC,EAAA,aAAa,EAAO,MAAO,EAAM,UAAY,SAAU,EAAK,MAAO,EAAK,MAAM,EAC9E,EAAA,WAAW,EAAO,MAAO,EAAU,EAAO,EAAK,MAAO,QAAQ,CAChE,CAEI,IACF,EAAA,aAAa,EAAO,MAAO,EAAY,UAAY,OAAQ,EAAK,MAAO,EAAK,MAAM,EAClF,EAAA,WAAW,EAAO,MAAO,EAAU,EAAa,EAAK,OAAQ,MAAM,EAEvE,CAIA,IAAM,EAAc,EAChB,EACA,OAAO,WAAW,iBAAiB,EAAI,GAAG,CAAC,CAAC,iBAAiB,oBAAoB,CAAC,GAAK,EAE3F,KAAO,EAAO,OAAO,SAAS,OAAS,EAAW,QAAQ,CACxD,IAAM,EAAO,EAAO,OAAO,iBAEvB,GAAM,EAAO,OAAO,YAAY,CAAI,CAC1C,CAEA,IAAK,IAAI,EAAI,EAAG,EAAI,EAAW,OAAQ,IAAK,CAC1C,IAAM,EAAS,EAAW,GACtB,EAAQ,EAAO,OAAO,SAAS,GAE9B,IACH,EAAQ,EAAA,iBAAiB,IAAK,CAAE,MAAO,kBAAmB,CAAC,EAC3D,EAAO,OAAO,YAAY,CAAK,GAGjC,EAAM,aAAa,iBAAkB,EAAA,YAAY,EAAQ,CAAC,CAAC,EAE3D,IAAM,EAAU,EAAW,KAAK,EAAK,IAAkB,CACrD,IAAM,EAAQ,EAAQ,EAAE,GAAG,GAE3B,GAAI,EAAS,CACX,IAAM,EAAO,EAAU,IAAQ,EACzB,EAAM,EAAO,KAAK,IAAI,EAAG,GAAO,OAAS,CAAC,EAIhD,MAFA,GAAU,GAAO,EAEV,CAAE,OAAM,KAAM,GAAO,KAAM,MAAK,QAAS,GAAO,QAAS,QAAS,IAAU,IAAA,GAAW,EAAG,CAAI,CACvG,CAEA,MAAO,CACL,KAAM,EACN,KAAM,GAAO,KACb,MACA,QAAS,GAAO,QAChB,QAAS,IAAU,IAAA,GACnB,EAAG,GAAO,OAAS,CACrB,CACF,CAAC,EAED,EAAY,GAAK,EAAQ,IAAK,GAAM,EAAE,CAAC,EAEvC,IAAM,EAAa,EAAU,EAAQ,IAAK,GAAM,EAAS,IAAI,EAAE,IAAI,CAAC,EAAI,IAAA,GAExE,EAAA,WAAW,EAAO,EAAS,EAAU,EAAU,EAAG,WAAY,CAC5D,aACA,aAAc,EAAO,cAAgB,EACrC,MAAO,EAAA,YAAY,EAAG,EAAO,KAAK,EAClC,eAAgB,EAAI,eACpB,aACA,YAAa,EAAW,OACxB,YAAa,EACb,UACA,WAAY,IAAW,UAAmB,EAAO,UACnD,CAAC,CACH,CAEA,GAAS,KAAK,EACd,EAAO,OAAO,UAAU,OAAO,qBAAsB,CAAO,GAExD,CAAC,GAAQ,CAAC,EAAI,UAAU,SAAS,CAAI,KACvC,EAAO,EAAA,iBAAiB,OAAQ,CAAE,cAAe,OAAQ,MAAO,iBAAkB,iBAAkB,MAAO,CAAC,EAC5G,EAAI,UAAU,aAAa,EAAM,EAAO,MAAM,GAGhD,EAAK,MAAM,QAAU,OAIrB,IAAM,EAAS,EAAW,KAAK,EAAG,IAAM,EAAA,YAAY,EAAG,EAAE,KAAK,CAAC,EACzD,QAAW,GAA2B,OAAO,EAAM,OAAO,IAAI,EAAW,EAAO,GAAK,EAAW,EAAO,EACvG,EAAgB,OAAO,EAAO,SAAY,SAAW,EAAO,QAAU,IAAA,GACtE,MAAS,GAAiC,EAAM,OAAO,IAAI,EAAW,EAAO,GAAK,EAAW,GAC7F,QAAW,GACf,GAAe,YAAc,EAAc,YAAY,MAAM,CAAM,CAAC,EAAI,QAAQ,CAAM,EAClF,EAAc,GAAe,aAAe,OAC9C,EAAY,GAEV,SAAY,GAChB,EAAW,KAAK,EAAQ,KAAQ,CAAE,MAAO,EAAQ,EAAG,GAAG,GAAS,QAAO,EAAE,EAErE,SAAW,EAAgB,EAAmB,IAA4C,CAC9F,IAAM,EAAS,SAAS,CAAM,EACxB,EAAY,EAAO,EAAU,EAAE,MAAQ,EAAY,EAAO,UAAW,GAAM,EAAE,KAAK,EAClF,EAAQ,EAAO,EAAU,EAAE,MAEjC,OAAO,EAAQ,CAAE,QAAO,gBAAe,OAAQ,EAAW,GAAY,QAAO,EAAI,IACnF,EAEM,UAAa,GAAyB,CAC1C,EAAY,EACZ,EAAO,OAAO,UAAU,OAAO,qBAAsB,GAAU,CAAC,EAEhE,IAAK,IAAM,KAAS,EAAO,OAAO,SAChC,IAAK,GAAM,CAAC,EAAG,IAAS,CAAC,GAAG,EAAM,QAAQ,CAAC,CAAC,QAAQ,EAClD,EAAK,UAAU,OAAO,oBAAqB,IAAM,CAAM,EAO3D,GAJI,CAAC,IAEL,EAAK,MAAM,QAAU,EAAS,EAAI,OAAS,GAEvC,EAAS,GAAG,OAEhB,IAAM,EAAQ,EAAG,WAAW,EAAW,EAAO,EAAI,EAAS,UAAU,EAAI,EAAI,EAAS,IAAI,EAAI,EACxF,EAAO,EAAS,UAAU,EAAI,EAAS,IAAI,EAC3C,EAAI,EAAA,UAAU,EAAI,WAAW,MAAO,EAAI,WAAW,OAAQ,EAAI,WAAW,MAAM,EAEtF,EAAA,cACE,EACA,EACI,CAAE,OAAQ,EAAM,MAAO,EAAE,MAAO,EAAG,EAAG,EAAG,CAAM,EAC/C,CAAE,OAAQ,EAAE,OAAQ,MAAO,EAAM,EAAG,EAAO,EAAG,CAAE,CACtD,CACF,EAEM,UAAY,EAAgB,EAAmB,IAA+B,CAClF,IAAM,EAAQ,QAAQ,EAAQ,EAAW,CAAa,EAEtD,GAAI,CAAC,EAAO,OAEZ,UAAU,CAAM,EAEhB,IAAM,EAAS,EAAM,QAAU,CAAC,EAC1B,EAAS,EAAA,eAAe,QAAQ,CAAM,EAAG,EAAQ,CAAW,EAElE,GAAI,EAAS,CACX,IAAM,EAAO,EAAO,KAAK,EAAG,IAC1B,EAAW,EAAY,EAAG,GAAG,IAAW,EAAK,KAAK,IAAI,EAAG,EAAE,OAAO,OAAS,CAAC,CAC9E,EACM,EAAU,EAAS,IAAI,KAAK,IAAI,GAAG,CAAI,CAAC,EACxC,EAAe,EAAG,WAAW,EAAW,EAAO,EAC/C,CAAE,UAAW,EAAI,WACjB,EAAO,EAAO,SAAS,EAAG,IAC9B,EAAE,MACE,CAAC,CAAE,MAAO,EAAO,GAAK,KAAM,EAAE,OAAO,KAAM,MAAO,EAAY,EAAE,MAAM,MAAO,EAAE,MAAO,EAAE,MAAM,CAAE,CAAC,EACjG,CAAC,CACP,EAEA,EAAQ,MACL,EAAa,EAAU,GAAgB,EAAO,MAC9C,EAAa,EAAe,GAAW,EAAO,IAC/C,EAAM,MACN,EAAM,OACN,EAAA,kBAAkB,EAAI,IAAI,cAAe,QAAQ,CAAM,EAAG,EAAM,CAAM,CACxE,CACF,MACE,EAAI,UAAU,SAAS,CAAM,EAG/B,EAAO,UAAU,CAAK,CACxB,EAEM,eAAyB,CAC7B,UAAU,EAAE,EACZ,GAAS,KAAK,EACd,EAAI,UAAU,MAAM,EACpB,EAAO,UAAU,IAAI,CACvB,EAEM,IAAO,GAAoE,CAC/E,IAAM,EAAI,EAAI,WACR,EAAM,EAAA,iBAAiB,EAAI,IAAK,EAAO,EAAE,OAAO,KAAM,EAAE,OAAO,GAAG,EAClE,EAAI,EAAA,UAAU,EAAE,MAAO,EAAE,OAAQ,EAAE,MAAM,EAE/C,GAAI,EAAI,EAAI,GAAK,EAAI,EAAI,EAAE,OAAS,EAAI,EAAI,GAAK,EAAI,EAAI,EAAE,OAAQ,OAAO,KAE1E,IAAM,EAAS,EAAA,WAAW,EAAa,EAAI,EAAI,EAAI,EAAG,EAAY,CAAE,EAEpE,OAAO,IAAW,GACd,KACA,CAAE,SAAQ,UAAW,EAAA,cAAc,EAAK,EAAQ,EAAY,EAAI,EAAW,MAAM,CAAE,CACzF,EAEM,YAAe,GAAsB,CACzC,IAAM,EAAS,IAAI,CAAK,EAEpB,EAAQ,SAAS,EAAO,OAAQ,EAAO,UAAW,CAAK,EAClD,GAAa,GAAG,WAAW,CACtC,EAEM,QAAW,GAAsB,CACrC,IAAM,EAAS,EAAO,SAAW,IAAI,CAAK,EACpC,EAAa,GAAU,QAAQ,EAAO,OAAQ,EAAO,UAAW,CAAK,EAEvE,GAAY,EAAO,UAAU,CAAU,CAC7C,EAEM,UAAa,GAAyB,CAC1C,IAAM,EAAO,EAAW,OAAS,EAC3B,EAAO,EAAY,EAAI,EAAO,KAAK,IAAI,EAAG,EAAY,CAAC,EACvD,EAAO,EAAY,EAAI,EAAI,KAAK,IAAI,EAAM,EAAY,CAAC,EACvD,EAAiC,CACrC,UAAW,EACX,UAAW,EACX,WAAY,EACZ,QAAS,EACT,IAAK,EACL,KAAM,CACR,EAEA,GAAI,EAAM,OAAO,EACf,EAAM,eAAe,EACrB,SAAS,EAAO,EAAM,KAAM,EAAG,CAAK,OAC/B,IAAK,EAAM,MAAQ,SAAW,EAAM,MAAQ,MAAQ,GAAa,GAAK,EAAO,QAAS,CAC3F,EAAM,eAAe,EAErB,IAAM,EAAa,QAAQ,EAAW,EAAG,CAAK,EAE1C,GAAY,EAAO,QAAQ,CAAU,CAC3C,MAAW,EAAM,MAAQ,UACvB,WAAW,CAEf,EAEA,MAAO,CAAE,QAAS,UAAW,aAAc,WAAY,WAAY,CACrE,EACC,GAAS,CACR,EAAa,CACf,CACF,CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bar-chart.d.ts","sourceRoot":"","sources":["../../../src/charts/bar/bar-chart.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EAGf,WAAW,
|
|
1
|
+
{"version":3,"file":"bar-chart.d.ts","sourceRoot":"","sources":["../../../src/charts/bar/bar-chart.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EAGf,WAAW,EAKZ,MAAM,aAAa,CAAC;AAcrB,wBAAgB,cAAc,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,GAAG,WAAW,CAAC,eAAe,EAAE,CAAC,CAiX7G"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"../../_dev.js";import{createSvgElement as e,setAttributes as t}from"../../svg/element.js";import{positionAxis as n,renderAxis as r,resolveTickCount as i}from"../../axes/axis.js";import{renderGrid as
|
|
1
|
+
import"../../_dev.js";import{createSvgElement as e,setAttributes as t}from"../../svg/element.js";import{positionAxis as n,renderAxis as r,resolveTickCount as i,resolveTicks as a}from"../../axes/axis.js";import{renderGrid as o}from"../../axes/grid.js";import{linearScale as s}from"../../scales/linear.js";import{describeValues as c}from"../../interaction/announcer.js";import{comparisonContent as l}from"../../interaction/tooltip.js";import{chartArea as u}from"../../core/layout.js";import{clearCartesianDom as d,createChartScaffold as f}from"../../core/chart-scaffold.js";import{seriesDomId as p}from"../../core/series-id.js";import{normalizeCartesianSeries as m}from"../../core/cartesian-model.js";import{getMousePosition as h}from"../../interaction/events.js";import{seriesColor as g}from"../../theme/index.js";import{bandScale as _}from"../../scales/band.js";import{findCatIdx as v,findSeriesIdx as y}from"./bar-hit-test.js";import{renderBars as b}from"./bar-renderer.js";function variantFlags(e){return{horizontal:e===`grouped-horizontal`||e===`stacked-horizontal`,stacked:e===`stacked`||e===`stacked-horizontal`}}function createBarChart(x,S){let C=S.series,w=null;return f(x,S,(f,x)=>{let{groups:T,legend:E,tooltip:D}=f;E?.update(C.map((e,t)=>({color:g(t,e.color),name:e.name})));let O=f.dimensions,k=u(O.width,O.height,O.margin),A=C.map(e=>e.data),j=m(C,A),M=j.domain,N=j.series.map(({byKey:e})=>M.map(t=>e.get(t))),categoryAxis=e=>({...e,tickFormat:t=>{let n=String(t),r=j.labels.get(n)??t;return e.tickFormat?e.tickFormat(r):String(r)}});if(M.length===0){d(T,E,D),w?.remove(),w=null;return}let{horizontal:P,stacked:F}=variantFlags(S.variant??`grouped`),I=S.xAxis===!1?!1:P?{grid:!0,...S.xAxis}:S.xAxis??{},L=S.yAxis===!1?!1:P?S.yAxis??{}:{grid:!0,...S.yAxis},R,z;if(F){N.some(e=>e.some(e=>(e?.value??0)<0));let e=M.map((e,t)=>N.reduce((e,n)=>e+Math.max(0,n[t]?.value??0),0));R=Math.max(...e),z=0}else{let e=N.flatMap(e=>e.flatMap(e=>e?[e.value]:[]));R=Math.max(...e),z=Math.min(0,...e)}let B=_(P?{domain:M,range:[0,k.height]}:{domain:M,range:[0,k.width]}),V=s(P?{domain:[z,R],range:[0,k.width]}:{domain:[z,R],range:[k.height,0]}),H=[],U=Object.create(null);for(let e of M)U[e]=0;let W={bandCenter:e=>B.map(e)+B.bandwidth()/2,bandwidth:B.bandwidth(),baselinePx:V.map(0),horizontal:P,stacked:F,stackedTops:H,valueScale:V};if(P){if(I&&I.grid&&o(T.grid,V,I.grid,k.height,`vertical`,a(V,I,i(I,k.width,`bottom`))),L!==!1){let e=categoryAxis(L);n(T.yAxis,e.position??`left`,k.width,k.height),r(T.yAxis,B,e,k.height,`left`)}I&&(n(T.xAxis,I.position??`bottom`,k.width,k.height),r(T.xAxis,V,I,k.width,`bottom`))}else{if(L&&L.grid&&o(T.grid,V,L.grid,k.width,`horizontal`,a(V,L,i(L,k.height,`left`))),I!==!1){let e=categoryAxis(I);n(T.xAxis,e.position??`bottom`,k.width,k.height),r(T.xAxis,B,e,k.width,`bottom`)}L&&(n(T.yAxis,L.position??`left`,k.width,k.height),r(T.yAxis,V,L,k.height,`left`))}let G=F?0:Number.parseFloat(getComputedStyle(f.svg).getPropertyValue(`--prism-bar-radius`))||0;for(;T.series.children.length>C.length;){let e=T.series.lastElementChild;e&&T.series.removeChild(e)}for(let t=0;t<C.length;t++){let n=C[t],r=T.series.children[t];r||(r=e(`g`,{class:`prism-bar-series`}),T.series.appendChild(r)),r.setAttribute(`data-series-id`,p(n,t));let i=M.map((e,n)=>{let r=N[t]?.[n];if(F){let t=U[e]??0,n=t+Math.max(0,r?.value??0);return U[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}});H[t]=i.map(e=>e.y);let a=F?i.map(e=>V.map(e.base)):void 0;b(r,i,B,V,W.baselinePx,{baselineYs:a,borderRadius:n.borderRadius??G,color:g(t,n.color),disposalSignal:f.disposalSignal,horizontal:P,seriesCount:C.length,seriesIndex:t,stacked:F,transition:x!==`resize`&&S.transition})}D?.hide(),T.series.classList.toggle(`prism-bars-stacked`,F),(!w||!f.chartArea.contains(w))&&(w=e(`rect`,{"aria-hidden":`true`,class:`prism-bar-band`,"pointer-events":`none`}),f.chartArea.insertBefore(w,T.series)),w.style.display=`none`;let K=C.map((e,t)=>g(t,e.color)),labelOf=e=>String(j.labels.get(M[e])??M[e]),q=typeof S.tooltip==`object`?S.tooltip:void 0,keyOf=e=>j.labels.get(M[e])??M[e],titleOf=e=>q?.titleFormat?q.titleFormat(keyOf(e)):labelOf(e),J=q?.valueFormat??String,Y=-1,valuesAt=e=>C.map((t,n)=>({datum:N[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:C[i],values:r}:null},setActive=e=>{Y=e,T.series.classList.toggle(`prism-bars-focused`,e>=0);for(let t of T.series.children)for(let[n,r]of[...t.children].entries())r.classList.toggle(`prism-bar--active`,n===e);if(!w||(w.style.display=e<0?`none`:``,e<0))return;let n=W.bandCenter(M[e])-B.bandwidth()/2-B.gap()/2,r=B.bandwidth()+B.gap(),i=u(f.dimensions.width,f.dimensions.height,f.dimensions.margin);t(w,P?{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 i=r.values??[],a=c(titleOf(e),i,J);if(D){let t=i.map((t,n)=>F?H[n]?.[e]??0:Math.max(0,t.datum?.value??0)),n=V.map(Math.max(...t)),o=W.bandCenter(M[e]),{margin:s}=f.dimensions,c=i.flatMap((e,t)=>e.datum?[{color:K[t],name:e.series.name,value:J(e.datum.value,e.datum,e.series)}]:[]);D.show((P?n:o)+s.left,(P?o:n)+s.top,r.datum,r.series,l(f.svg.ownerDocument,titleOf(e),c,a))}else f.announcer.announce(a);S.onHover?.(r)},deactivate=()=>{setActive(-1),D?.hide(),f.announcer.clear(),S.onHover?.(null)},hit=e=>{let t=f.dimensions,n=h(f.svg,e,t.margin.left,t.margin.top),r=u(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=v(P?n.y:n.x,M,W);return i===-1?null:{catIdx:i,seriesIdx:y(n,i,M,W,C.length)}},onMouseMove=e=>{let t=hit(e);t?activate(t.catIdx,t.seriesIdx,e):Y>=0&&deactivate()},onClick=e=>{let t=S.onClick&&hit(e),n=t&&eventAt(t.catIdx,t.seriesIdx,e);n&&S.onClick?.(n)},onKeyDown=e=>{let t=M.length-1,n=Y<0?t:Math.max(0,Y-1),r=Y<0?0:Math.min(t,Y+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===` `)&&Y>=0&&S.onClick){e.preventDefault();let t=eventAt(Y,0,e);t&&S.onClick(t)}else e.key===`Escape`&&deactivate()};return{onClick,onKeyDown,onMouseLeave:deactivate,onMouseMove}},e=>{C=e})}export{createBarChart};
|
|
2
2
|
//# sourceMappingURL=bar-chart.js.map
|