minerva-design 1.1.0 → 1.2.0
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/CHANGELOG.md +8 -0
- package/dist/charts/canvas.d.cts +7 -0
- package/dist/charts/canvas.d.ts +7 -0
- package/dist/charts/core.cjs +1 -1
- package/dist/charts/core.d.cts +5 -1
- package/dist/charts/core.d.ts +5 -1
- package/dist/charts/core.js +4 -1
- package/dist/charts/engine/canvas.cjs +2 -0
- package/dist/charts/engine/canvas.cjs.map +1 -0
- package/dist/charts/engine/canvas.d.cts +85 -0
- package/dist/charts/engine/canvas.d.ts +85 -0
- package/dist/charts/engine/canvas.js +165 -0
- package/dist/charts/engine/canvas.js.map +1 -0
- package/dist/charts/engine/chart.cjs +2 -2
- package/dist/charts/engine/chart.cjs.map +1 -1
- package/dist/charts/engine/chart.js +382 -440
- package/dist/charts/engine/chart.js.map +1 -1
- package/dist/charts/engine/color.cjs +1 -1
- package/dist/charts/engine/color.cjs.map +1 -1
- package/dist/charts/engine/color.d.cts +10 -0
- package/dist/charts/engine/color.d.ts +10 -0
- package/dist/charts/engine/color.js +75 -3
- package/dist/charts/engine/color.js.map +1 -1
- package/dist/charts/engine/controller.cjs +3 -0
- package/dist/charts/engine/controller.cjs.map +1 -0
- package/dist/charts/engine/controller.d.cts +182 -0
- package/dist/charts/engine/controller.d.ts +182 -0
- package/dist/charts/engine/controller.js +528 -0
- package/dist/charts/engine/controller.js.map +1 -0
- package/dist/charts/engine/model.cjs +1 -1
- package/dist/charts/engine/model.cjs.map +1 -1
- package/dist/charts/engine/model.d.cts +2 -2
- package/dist/charts/engine/model.d.ts +2 -2
- package/dist/charts/engine/model.js +72 -72
- package/dist/charts/engine/model.js.map +1 -1
- package/dist/charts/engine/overlay.cjs +1 -1
- package/dist/charts/engine/overlay.cjs.map +1 -1
- package/dist/charts/engine/overlay.d.cts +17 -1
- package/dist/charts/engine/overlay.d.ts +17 -1
- package/dist/charts/engine/overlay.js +63 -49
- package/dist/charts/engine/overlay.js.map +1 -1
- package/dist/charts/engine/presets.cjs +3 -0
- package/dist/charts/engine/presets.cjs.map +1 -0
- package/dist/charts/engine/presets.d.cts +103 -0
- package/dist/charts/engine/presets.d.ts +103 -0
- package/dist/charts/engine/presets.js +153 -0
- package/dist/charts/engine/presets.js.map +1 -0
- package/dist/charts/engine/renderers/canvas2d.cjs +1 -1
- package/dist/charts/engine/renderers/canvas2d.cjs.map +1 -1
- package/dist/charts/engine/renderers/canvas2d.d.cts +17 -1
- package/dist/charts/engine/renderers/canvas2d.d.ts +17 -1
- package/dist/charts/engine/renderers/canvas2d.js +88 -51
- package/dist/charts/engine/renderers/canvas2d.js.map +1 -1
- package/dist/charts/engine/scene.cjs +2 -0
- package/dist/charts/engine/scene.cjs.map +1 -0
- package/dist/charts/engine/scene.d.cts +89 -0
- package/dist/charts/engine/scene.d.ts +89 -0
- package/dist/charts/engine/scene.js +241 -0
- package/dist/charts/engine/scene.js.map +1 -0
- package/dist/charts/engine/theme.cjs +1 -1
- package/dist/charts/engine/theme.cjs.map +1 -1
- package/dist/charts/engine/theme.d.cts +25 -1
- package/dist/charts/engine/theme.d.ts +25 -1
- package/dist/charts/engine/theme.js +42 -26
- package/dist/charts/engine/theme.js.map +1 -1
- package/dist/charts/engine/types.d.cts +69 -2
- package/dist/charts/engine/types.d.ts +69 -2
- package/dist/charts/index.cjs +1 -1
- package/dist/charts/index.d.cts +1 -1
- package/dist/charts/index.d.ts +1 -1
- package/dist/charts/index.js +5 -2
- package/dist/charts/react/Chart.cjs +1 -1
- package/dist/charts/react/Chart.cjs.map +1 -1
- package/dist/charts/react/Chart.d.cts +11 -4
- package/dist/charts/react/Chart.d.ts +11 -4
- package/dist/charts/react/Chart.js +81 -39
- package/dist/charts/react/Chart.js.map +1 -1
- package/dist/charts/react/charts.cjs +1 -1
- package/dist/charts/react/charts.cjs.map +1 -1
- package/dist/charts/react/charts.d.cts +1 -1
- package/dist/charts/react/charts.d.ts +1 -1
- package/dist/charts/react/charts.js +99 -145
- package/dist/charts/react/charts.js.map +1 -1
- package/dist/charts/react/types.d.cts +29 -61
- package/dist/charts/react/types.d.ts +29 -61
- package/dist/native/charts/src/canvas.cjs +1 -0
- package/dist/native/charts/src/canvas.js +6 -0
- package/dist/native/charts/src/engine/axis.cjs +2 -0
- package/dist/native/charts/src/engine/axis.cjs.map +1 -0
- package/dist/native/charts/src/engine/axis.js +38 -0
- package/dist/native/charts/src/engine/axis.js.map +1 -0
- package/dist/native/charts/src/engine/canvas.cjs +1 -0
- package/dist/native/charts/src/engine/canvas.js +1 -0
- package/dist/native/charts/src/engine/color.cjs +2 -0
- package/dist/native/charts/src/engine/color.cjs.map +1 -0
- package/dist/native/charts/src/engine/color.js +130 -0
- package/dist/native/charts/src/engine/color.js.map +1 -0
- package/dist/native/charts/src/engine/controller.cjs +3 -0
- package/dist/native/charts/src/engine/controller.cjs.map +1 -0
- package/dist/native/charts/src/engine/controller.js +528 -0
- package/dist/native/charts/src/engine/controller.js.map +1 -0
- package/dist/native/charts/src/engine/data.cjs +2 -0
- package/dist/native/charts/src/engine/data.cjs.map +1 -0
- package/dist/native/charts/src/engine/data.js +104 -0
- package/dist/native/charts/src/engine/data.js.map +1 -0
- package/dist/native/charts/src/engine/decimate.cjs +2 -0
- package/dist/native/charts/src/engine/decimate.cjs.map +1 -0
- package/dist/native/charts/src/engine/decimate.js +28 -0
- package/dist/native/charts/src/engine/decimate.js.map +1 -0
- package/dist/native/charts/src/engine/format.cjs +2 -0
- package/dist/native/charts/src/engine/format.cjs.map +1 -0
- package/dist/native/charts/src/engine/format.js +34 -0
- package/dist/native/charts/src/engine/format.js.map +1 -0
- package/dist/native/charts/src/engine/layout.cjs +2 -0
- package/dist/native/charts/src/engine/layout.cjs.map +1 -0
- package/dist/native/charts/src/engine/layout.js +26 -0
- package/dist/native/charts/src/engine/layout.js.map +1 -0
- package/dist/native/charts/src/engine/model.cjs +2 -0
- package/dist/native/charts/src/engine/model.cjs.map +1 -0
- package/dist/native/charts/src/engine/model.js +175 -0
- package/dist/native/charts/src/engine/model.js.map +1 -0
- package/dist/native/charts/src/engine/overlay.cjs +2 -0
- package/dist/native/charts/src/engine/overlay.cjs.map +1 -0
- package/dist/native/charts/src/engine/overlay.js +49 -0
- package/dist/native/charts/src/engine/overlay.js.map +1 -0
- package/dist/native/charts/src/engine/presets.cjs +3 -0
- package/dist/native/charts/src/engine/presets.cjs.map +1 -0
- package/dist/native/charts/src/engine/presets.js +147 -0
- package/dist/native/charts/src/engine/presets.js.map +1 -0
- package/dist/native/charts/src/engine/scale.cjs +2 -0
- package/dist/native/charts/src/engine/scale.cjs.map +1 -0
- package/dist/native/charts/src/engine/scale.js +37 -0
- package/dist/native/charts/src/engine/scale.js.map +1 -0
- package/dist/native/charts/src/engine/scene.cjs +2 -0
- package/dist/native/charts/src/engine/scene.cjs.map +1 -0
- package/dist/native/charts/src/engine/scene.js +241 -0
- package/dist/native/charts/src/engine/scene.js.map +1 -0
- package/dist/native/charts/src/engine/spatial.cjs +2 -0
- package/dist/native/charts/src/engine/spatial.cjs.map +1 -0
- package/dist/native/charts/src/engine/spatial.js +53 -0
- package/dist/native/charts/src/engine/spatial.js.map +1 -0
- package/dist/native/charts/src/engine/theme.cjs +2 -0
- package/dist/native/charts/src/engine/theme.cjs.map +1 -0
- package/dist/native/charts/src/engine/theme.js +62 -0
- package/dist/native/charts/src/engine/theme.js.map +1 -0
- package/dist/native/charts/src/engine/time.cjs +2 -0
- package/dist/native/charts/src/engine/time.cjs.map +1 -0
- package/dist/native/charts/src/engine/time.js +189 -0
- package/dist/native/charts/src/engine/time.js.map +1 -0
- package/dist/native/charts/src/engine/viewport.cjs +2 -0
- package/dist/native/charts/src/engine/viewport.cjs.map +1 -0
- package/dist/native/charts/src/engine/viewport.js +12 -0
- package/dist/native/charts/src/engine/viewport.js.map +1 -0
- package/dist/native/components/Chart/ChartBase.cjs +2 -0
- package/dist/native/components/Chart/ChartBase.cjs.map +1 -0
- package/dist/native/components/Chart/ChartBase.d.cts +29 -0
- package/dist/native/components/Chart/ChartBase.d.ts +29 -0
- package/dist/native/components/Chart/ChartBase.js +287 -0
- package/dist/native/components/Chart/ChartBase.js.map +1 -0
- package/dist/native/components/Chart/charts.cjs +2 -0
- package/dist/native/components/Chart/charts.cjs.map +1 -0
- package/dist/native/components/Chart/charts.d.cts +19 -0
- package/dist/native/components/Chart/charts.d.ts +19 -0
- package/dist/native/components/Chart/charts.js +173 -0
- package/dist/native/components/Chart/charts.js.map +1 -0
- package/dist/native/components/Chart/index.cjs +1 -0
- package/dist/native/components/Chart/index.d.cts +2 -0
- package/dist/native/components/Chart/index.d.ts +2 -0
- package/dist/native/components/Chart/index.js +2 -0
- package/dist/native/components/Chart/measure.cjs +2 -0
- package/dist/native/components/Chart/measure.cjs.map +1 -0
- package/dist/native/components/Chart/measure.d.cts +5 -0
- package/dist/native/components/Chart/measure.d.ts +5 -0
- package/dist/native/components/Chart/measure.js +11 -0
- package/dist/native/components/Chart/measure.js.map +1 -0
- package/dist/native/components/Chart/scene.cjs +2 -0
- package/dist/native/components/Chart/scene.cjs.map +1 -0
- package/dist/native/components/Chart/scene.d.cts +41 -0
- package/dist/native/components/Chart/scene.d.ts +41 -0
- package/dist/native/components/Chart/scene.js +419 -0
- package/dist/native/components/Chart/scene.js.map +1 -0
- package/dist/native/components/Chart/theme.cjs +2 -0
- package/dist/native/components/Chart/theme.cjs.map +1 -0
- package/dist/native/components/Chart/theme.d.cts +10 -0
- package/dist/native/components/Chart/theme.d.ts +10 -0
- package/dist/native/components/Chart/theme.js +10 -0
- package/dist/native/components/Chart/theme.js.map +1 -0
- package/dist/native/components/Chart/types.d.cts +129 -0
- package/dist/native/components/Chart/types.d.ts +129 -0
- package/dist/native/index.cjs +1 -1
- package/dist/native/index.d.cts +1 -0
- package/dist/native/index.d.ts +1 -0
- package/dist/native/index.js +6 -4
- package/dist/native/manifest.d.cts +7 -0
- package/dist/native/manifest.d.ts +7 -0
- package/dist/native/source/components/Chart/ChartBase.tsx +545 -0
- package/dist/native/source/components/Chart/charts.tsx +291 -0
- package/dist/native/source/components/Chart/index.ts +8 -0
- package/dist/native/source/components/Chart/measure.ts +50 -0
- package/dist/native/source/components/Chart/scene.tsx +987 -0
- package/dist/native/source/components/Chart/theme.ts +16 -0
- package/dist/native/source/components/Chart/types.ts +194 -0
- package/dist/native/source/index.ts +1 -0
- package/dist/native/source/manifest.ts +14 -0
- package/dist/taro/charts.d.ts +144 -0
- package/dist/taro/index.d.ts +1 -0
- package/dist/taro/index.js +3064 -618
- package/dist/uni/BarChart.vue +75 -0
- package/dist/uni/BarChart.vue.d.ts +111 -0
- package/dist/uni/Chart.vue +68 -0
- package/dist/uni/Chart.vue.d.ts +100 -0
- package/dist/uni/LineChart.vue +75 -0
- package/dist/uni/LineChart.vue.d.ts +111 -0
- package/dist/uni/ProgressIndicator.vue.d.ts +1 -1
- package/dist/uni/QuadrantChart.vue +184 -0
- package/dist/uni/QuadrantChart.vue.d.ts +173 -0
- package/dist/uni/ScatterChart.vue +69 -0
- package/dist/uni/ScatterChart.vue.d.ts +100 -0
- package/dist/uni/chart-canvas.d.ts +68 -0
- package/dist/uni/chart-canvas.js +363 -0
- package/dist/uni/chart-types.d.ts +135 -0
- package/dist/uni/chart-types.js +84 -0
- package/dist/uni/charts-canvas.d.ts +1 -0
- package/dist/uni/charts-canvas.js +8 -0
- package/dist/uni/index.d.ts +6 -0
- package/dist/uni/index.js +6 -0
- package/dist/weapp/bar-chart/index.js +1 -0
- package/dist/weapp/bar-chart/index.json +1 -0
- package/dist/weapp/bar-chart/index.wxml +1 -0
- package/dist/weapp/bar-chart/index.wxss +1 -0
- package/dist/weapp/chart/index.js +1 -0
- package/dist/weapp/chart/index.json +1 -0
- package/dist/weapp/chart/index.wxml +1 -0
- package/dist/weapp/chart/index.wxss +1 -0
- package/dist/weapp/controls.js +4019 -266
- package/dist/weapp/line-chart/index.js +1 -0
- package/dist/weapp/line-chart/index.json +1 -0
- package/dist/weapp/line-chart/index.wxml +1 -0
- package/dist/weapp/line-chart/index.wxss +1 -0
- package/dist/weapp/quadrant-chart/index.js +1 -0
- package/dist/weapp/quadrant-chart/index.json +1 -0
- package/dist/weapp/quadrant-chart/index.wxml +1 -0
- package/dist/weapp/quadrant-chart/index.wxss +1 -0
- package/dist/weapp/scatter-chart/index.js +1 -0
- package/dist/weapp/scatter-chart/index.json +1 -0
- package/dist/weapp/scatter-chart/index.wxml +1 -0
- package/dist/weapp/scatter-chart/index.wxss +1 -0
- package/dist/weapp/types.d.ts +295 -0
- package/package.json +21 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart.js","names":["assign","MAX_POINT_LABELS","DEFAULT_PADDING","mid","r","copyView","v","createChart","doc","container","win","dom","createChartDom","cache","hidden","listeners","options","initialOptions","theme","readTheme","model","view","zoomed","origin","items","itemsDirty","version","annotations","scales","xTicks","yTicks","renderer","rendererToken","destroyed","frameId","hover","drag","markers","highlights","themeVersion","itemsSignature","objectIds","objectCounter","idOf","id","value","resolveReady","ready","resolve","emit","type","listener","event","interaction","o","tooltipOptions","invalidate","frame","resolveAnnotations","a","color","resolveColor","mix","rebuild","buildModel","zoom","clampRange","base","minSpan","sameRange","signature","s","renderLegend","updateAccessibility","ensureOrigin","far","legendOption","named","show","config","toggle","focused","bottom","item","swatch","names","sizeCanvas","w","width","dpr","h","height","canvas","transformFor","scale","range","offset","reverse","collectPointLabels","labels","series","texts","i","count","text","xi","x","yi","y","size","bg","fg","fontSize","yCount","axisTicks","yLabelWidth","categoryWidth","font","label","step","padding","plot","computePlot","xCount","createScales","drawBackground","drawForeground","bw","bh","buildItems","xScale","xOffset","yScale","yOffset","pointOf","xv","yv","sc","candidateOf","p","inside","half","px","py","nearestScatter","radius","rx","ry","best","bestDist","gridOf","d","nearestX","sorted","nearestIndex","bestD","toItem","c","pc","toCss","eventOf","candidates","b","hoverItems","hitTest","scatter","others","all","bestDx","bandPx","aligned","first","ordered","setHover","changed","next","it","renderHover","tooltipContent","custom","fragment","header","row","el","n","name","yFormat","pooled","pool","make","markerCount","highlightCount","axisMode","cx","createBarHighlight","createMarker","tip","content","stageW","stageH","left","top","setViewInternal","notify","zoomAt","zoomRange","factor","localPoint","rect","inPlot","onPointerMove","dx","dy","panRange","event2","onPointerDown","onPointerUp","moved","hit","onPointerLeave","onWheel","modifier","wheelFactor","onDoubleClick","resetZoom","moveFocus","current","index","lowerBound","current2","span","leadItem","onKeyDown","center","cy","onFocus","visible","onBlur","stage","resizeObserver","refreshTheme","unwatchTheme","watchTheme","initRenderer","token","createRenderer","createDataCanvas","kind","exclude","previous","set","key"],"sources":["../../../../charts/src/engine/chart.ts"],"sourcesContent":["// createChart: mounts a chart in a container and keeps it in sync with its\n// options, its size, the theme and the user's interactions.\n\nimport { axisTicks, type AxisTicks } from \"./axis\";\nimport { mix, resolveColor, toCss } from \"./color\";\nimport { lowerBound, nearestIndex } from \"./data\";\nimport {\n createBarHighlight,\n createChartDom,\n createDataCanvas,\n createMarker,\n styleElement,\n swatch,\n} from \"./dom\";\nimport { buildItems, type Origin } from \"./items\";\nimport { computePlot, createScales, type Scales } from \"./layout\";\nimport {\n buildModel,\n gridOf,\n type ChartModel,\n type DataCache,\n type SeriesModel,\n} from \"./model\";\nimport {\n drawBackground,\n drawForeground,\n font,\n type PointLabel,\n type ResolvedAnnotation,\n} from \"./overlay\";\nimport { createRenderer } from \"./renderers/detect\";\nimport type { ChartRenderer, RenderItem } from \"./renderers/types\";\nimport { readTheme, watchTheme, type ChartTheme } from \"./theme\";\nimport type {\n ChartEventMap,\n ChartHoverEvent,\n ChartHoverItem,\n ChartInstance,\n ChartInteractionOptions,\n ChartOptions,\n ChartRendererKind,\n ChartTooltipOptions,\n ChartView,\n} from \"./types\";\nimport {\n clampRange,\n panRange,\n sameRange,\n wheelFactor,\n zoomRange,\n type Range,\n} from \"./viewport\";\n\nconst MAX_POINT_LABELS = 300;\nconst DEFAULT_PADDING = { top: 12, right: 16, bottom: 4, left: 4 };\n\ninterface Candidate {\n series: SeriesModel;\n index: number;\n /** Pixel position of the point */\n px: number;\n py: number;\n dx: number;\n dist: number;\n inside: boolean;\n}\n\ninterface HoverState {\n event: ChartHoverEvent;\n /** Tooltip anchor in stage pixels */\n anchorX: number;\n anchorY: number;\n keyboard: boolean;\n}\n\nconst mid = (r: Range) => (r[0] + r[1]) / 2;\nconst copyView = (v: ChartView): ChartView => ({\n x: [v.x[0], v.x[1]],\n y: [v.y[0], v.y[1]],\n});\n\n/**\n * Creates a chart inside `container` (which must have a size). The data\n * layer uses WebGPU when available, then WebGL2, then Canvas2D.\n */\nexport const createChart = (\n container: HTMLElement,\n initialOptions: ChartOptions,\n): ChartInstance => {\n const doc = container.ownerDocument;\n const win = doc.defaultView;\n const dom = createChartDom(container);\n const cache: DataCache = new Map();\n const hidden = new Set<string>();\n const listeners: {\n [K in keyof ChartEventMap]?: Set<(event: ChartEventMap[K]) => void>;\n } = {};\n\n let options = initialOptions;\n let theme: ChartTheme = readTheme(dom.root, options.palette);\n let model: ChartModel;\n let view: ChartView = { x: [0, 1], y: [0, 1] };\n let zoomed = false;\n let origin: Origin = { x: 0, y: 0 };\n let items: RenderItem[] = [];\n let itemsDirty = true;\n let version = 0;\n let annotations: ResolvedAnnotation[] = [];\n let scales: Scales | null = null;\n let xTicks: AxisTicks | null = null;\n let yTicks: AxisTicks | null = null;\n let renderer: ChartRenderer | null = null;\n let rendererToken = 0;\n let destroyed = false;\n let frameId = 0;\n let hover: HoverState | null = null;\n let drag: {\n id: number;\n x: number;\n y: number;\n view: ChartView;\n moved: boolean;\n } | null = null;\n const markers: HTMLDivElement[] = [];\n const highlights: HTMLDivElement[] = [];\n let themeVersion = 0;\n let itemsSignature = \"\";\n const objectIds = new WeakMap<object, number>();\n let objectCounter = 0;\n const idOf = (value: object) => {\n let id = objectIds.get(value);\n if (id === undefined) objectIds.set(value, (id = ++objectCounter));\n return id;\n };\n\n let resolveReady: (kind: ChartRendererKind | null) => void = () => {};\n const ready = new Promise<ChartRendererKind | null>((resolve) => {\n resolveReady = resolve;\n });\n\n const emit = <K extends keyof ChartEventMap>(\n type: K,\n event: ChartEventMap[K],\n ) => {\n listeners[type]?.forEach((listener) => listener(event));\n };\n\n const interaction = (): Required<ChartInteractionOptions> | null => {\n const value = options.interaction;\n if (value === false) return null;\n const o = typeof value === \"object\" ? value : {};\n return {\n zoom: o.zoom ?? true,\n wheel: o.wheel ?? \"modifier\",\n pan: o.pan ?? true,\n keyboard: o.keyboard ?? true,\n };\n };\n\n const tooltipOptions = (): ChartTooltipOptions | null =>\n options.tooltip === false\n ? null\n : typeof options.tooltip === \"object\"\n ? options.tooltip\n : {};\n\n const invalidate = () => {\n if (destroyed || frameId) return;\n frameId = win?.requestAnimationFrame\n ? win.requestAnimationFrame(frame)\n : (setTimeout(frame, 16) as unknown as number);\n };\n\n // ---------------------------------------------------------------- model\n\n const resolveAnnotations = (): ResolvedAnnotation[] =>\n (options.annotations ?? []).map((a) => {\n if (a.type === \"rect\") {\n const color = a.color\n ? resolveColor(a.color, dom.root, theme.primary)\n : theme.primary;\n return {\n type: \"rect\",\n x0: a.x0,\n x1: a.x1,\n y0: a.y0,\n y1: a.y1,\n color,\n opacity: a.opacity ?? 0.08,\n label: a.label,\n labelPosition: a.labelPosition ?? \"top-left\",\n labelColor: a.labelColor\n ? resolveColor(a.labelColor, dom.root, color)\n : mix(color, theme.text, 0.2),\n };\n }\n return {\n type: \"line\",\n axis: a.axis,\n value: a.value,\n color: a.color\n ? resolveColor(a.color, dom.root, theme.textMuted)\n : theme.textMuted,\n width: a.width ?? 1,\n dash: [...(a.dash ?? [4, 4])],\n label: a.label,\n };\n });\n\n const rebuild = () => {\n model = buildModel(options, theme, hidden, cache, dom.root);\n const { base, zoom, minSpan } = model;\n if (!zoomed) {\n view = copyView(base);\n } else {\n view = {\n x: zoom.x ? clampRange(view.x, base.x, minSpan.x) : [...base.x],\n y: zoom.y ? clampRange(view.y, base.y, minSpan.y) : [...base.y],\n };\n zoomed = !sameRange(view.x, base.x) || !sameRange(view.y, base.y);\n }\n // Unchanged data and styles (e.g. a React re-render): keep the GPU\n // buffers and the hover state\n const signature = [\n themeVersion,\n model.baseline,\n base.x.join(),\n base.y.join(),\n ...model.series.map((s) =>\n [\n s.key,\n s.type,\n idOf(s.cols),\n s.colorCss,\n s.hidden,\n s.lineWidth,\n s.pointSize,\n s.opacity,\n s.barOffset,\n s.barHalfWidth,\n options.series[s.index].stack ?? \"\",\n ].join(\"|\"),\n ),\n ].join(\"\\n\");\n if (signature !== itemsSignature) {\n itemsSignature = signature;\n origin = { x: mid(base.x), y: mid(base.y) };\n itemsDirty = true;\n if (hover && !hover.keyboard) hover = null;\n }\n annotations = resolveAnnotations();\n renderLegend();\n updateAccessibility();\n invalidate();\n };\n\n /** float32 positions lose precision far from the origin: re-center when deeply zoomed */\n const ensureOrigin = () => {\n const far = (r: Range, o: number) =>\n Math.max(Math.abs(r[0] - o), Math.abs(r[1] - o)) > (r[1] - r[0]) * 2000;\n if (far(view.x, origin.x) || far(view.y, origin.y)) {\n origin = { x: mid(view.x), y: mid(view.y) };\n itemsDirty = true;\n }\n };\n\n // --------------------------------------------------------------- legend\n\n const renderLegend = () => {\n const legendOption = options.legend;\n const named = options.series.filter((s) => s.name).length;\n const show = legendOption === undefined ? named > 1 : !!legendOption;\n const config = typeof legendOption === \"object\" ? legendOption : {};\n const toggle = config.toggle ?? true;\n const focused = [...dom.legend.children].indexOf(\n doc.activeElement as Element,\n );\n dom.legend.replaceChildren();\n dom.legend.style.display = show ? \"flex\" : \"none\";\n if (!show) return;\n const bottom = config.position === \"bottom\";\n dom.legend.style.order = bottom ? \"1\" : \"0\";\n dom.legend.style.padding = bottom ? \"8px 4px 0\" : \"0 4px 8px\";\n for (const s of model.series) {\n const item = doc.createElement(toggle ? \"button\" : \"span\");\n if (item instanceof HTMLButtonElement) {\n item.type = \"button\";\n item.setAttribute(\"aria-pressed\", String(!s.hidden));\n item.addEventListener(\"click\", () => {\n if (hidden.has(s.id)) hidden.delete(s.id);\n else hidden.add(s.id);\n rebuild();\n });\n }\n styleElement(item, {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"6px\",\n padding: \"2px 4px\",\n margin: \"0\",\n border: \"0\",\n borderRadius: \"4px\",\n background: \"none\",\n font: \"inherit\",\n color: \"var(--text-secondary-color, #6b7280)\",\n cursor: toggle ? \"pointer\" : \"default\",\n opacity: s.hidden ? \"0.45\" : \"1\",\n textDecoration: s.hidden ? \"line-through\" : \"none\",\n });\n item.append(\n swatch(\n doc,\n s.colorCss,\n s.type === \"scatter\" ? \"dot\" : s.type === \"line\" ? \"line\" : \"square\",\n ),\n doc.createTextNode(s.name),\n );\n dom.legend.appendChild(item);\n }\n if (focused >= 0)\n (dom.legend.children[focused] as HTMLElement | undefined)?.focus();\n };\n\n const updateAccessibility = () => {\n const names = model.series.map((s) => s.name).join(\", \");\n dom.stage.setAttribute(\n \"aria-label\",\n options.ariaLabel ?? (names ? `Chart: ${names}` : \"Chart\"),\n );\n const keyboard = interaction()?.keyboard;\n if (keyboard) dom.stage.tabIndex = 0;\n else dom.stage.removeAttribute(\"tabindex\");\n };\n\n // ---------------------------------------------------------------- frame\n\n const sizeCanvas = (\n canvas: HTMLCanvasElement,\n width: number,\n height: number,\n dpr: number,\n ) => {\n const w = Math.max(1, Math.round(width * dpr));\n const h = Math.max(1, Math.round(height * dpr));\n if (canvas.width !== w) canvas.width = w;\n if (canvas.height !== h) canvas.height = h;\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n };\n\n const transformFor = (range: Range, o: number, reverse: boolean) => {\n const scale = 2 / (range[1] - range[0]);\n const offset = (o - range[0]) * scale - 1;\n return reverse ? [-scale, -offset] : [scale, offset];\n };\n\n const collectPointLabels = (s: Scales): PointLabel[] => {\n const labels: PointLabel[] = [];\n for (const series of model.series) {\n if (series.hidden || series.type !== \"scatter\" || !series.showLabels)\n continue;\n const { x, y, count, labels: texts, size } = series.cols;\n if (!texts) continue;\n for (let i = 0; i < count && labels.length < MAX_POINT_LABELS; i++) {\n const text = texts[i];\n if (!text) continue;\n const xi = x[i];\n const yi = y[i];\n if (\n xi < view.x[0] ||\n xi > view.x[1] ||\n yi < view.y[0] ||\n yi > view.y[1]\n )\n continue;\n const d = size && size[i] > 0 ? size[i] : series.pointSize;\n labels.push({ x: s.xToPx(xi), y: s.yToPx(yi), r: d / 2, text });\n }\n }\n return labels;\n };\n\n function frame() {\n frameId = 0;\n if (destroyed) return;\n const width = dom.stage.clientWidth;\n const height = dom.stage.clientHeight;\n if (width <= 0 || height <= 0) return;\n const dpr = win?.devicePixelRatio || 1;\n sizeCanvas(dom.background, width, height, dpr);\n sizeCanvas(dom.foreground, width, height, dpr);\n const bg = dom.background.getContext(\"2d\");\n const fg = dom.foreground.getContext(\"2d\");\n\n const fontSize = theme.fontSize;\n // same count as the nice range of the model (its ends are then ticks),\n // fewer on short charts\n const yCount =\n model.y.tickCount ??\n (height >= 220 ? 5 : Math.max(2, Math.round((height - 48) / 52)));\n yTicks = axisTicks(model.y, view.y, yCount);\n let yLabelWidth = 0;\n let categoryWidth = 48;\n if (bg) {\n bg.setTransform(dpr, 0, 0, dpr, 0, 0);\n bg.font = font(theme);\n if (model.y.visible) {\n for (const label of yTicks.labels) {\n yLabelWidth = Math.max(yLabelWidth, bg.measureText(label).width);\n }\n }\n if (model.x.type === \"category\") {\n categoryWidth = 0;\n const step = Math.max(1, Math.floor(model.x.categories.length / 200));\n for (let i = 0; i < model.x.categories.length; i += step) {\n categoryWidth = Math.max(\n categoryWidth,\n bg.measureText(model.x.categories[i]).width,\n );\n }\n }\n }\n const padding = { ...DEFAULT_PADDING, ...options.padding };\n const plot = computePlot({\n width,\n height,\n padding,\n yLabelWidth: model.y.visible ? Math.ceil(yLabelWidth) : 0,\n xAxisVisible: model.x.visible,\n xTitle: !!model.x.title && model.x.visible,\n yTitle: !!model.y.title && model.y.visible,\n fontSize,\n });\n const xCount =\n model.x.type === \"category\"\n ? Math.max(1, Math.floor(plot.width / (categoryWidth + 14)))\n : (model.x.tickCount ?? Math.max(2, Math.floor(plot.width / 96)));\n xTicks = axisTicks(model.x, view.x, xCount);\n scales = createScales(plot, view, model.x.reverse, model.y.reverse);\n\n if (bg) {\n drawBackground(bg, {\n width,\n height,\n scales,\n x: model.x,\n y: model.y,\n xTicks,\n yTicks,\n theme,\n annotations,\n });\n }\n if (fg) {\n fg.setTransform(dpr, 0, 0, dpr, 0, 0);\n drawForeground(fg, {\n width,\n height,\n scales,\n theme,\n annotations,\n pointLabels: collectPointLabels(scales),\n });\n }\n\n if (renderer) {\n const canvas = renderer.canvas;\n styleElement(canvas, {\n left: `${plot.x}px`,\n top: `${plot.y}px`,\n width: `${plot.width}px`,\n height: `${plot.height}px`,\n });\n const bw = Math.max(1, Math.round(plot.width * dpr));\n const bh = Math.max(1, Math.round(plot.height * dpr));\n if (canvas.width !== bw || canvas.height !== bh) renderer.resize(bw, bh);\n ensureOrigin();\n if (itemsDirty) {\n version++;\n items = buildItems(model, origin, version);\n itemsDirty = false;\n }\n const [xScale, xOffset] = transformFor(view.x, origin.x, model.x.reverse);\n const [yScale, yOffset] = transformFor(view.y, origin.y, model.y.reverse);\n renderer.render(items, {\n transform: { xScale, xOffset, yScale, yOffset },\n width: bw,\n height: bh,\n dpr,\n });\n }\n renderHover();\n }\n\n // ------------------------------------------------------------ hit tests\n\n const pointOf = (s: SeriesModel, i: number, sc: Scales) => {\n const xv = s.cols.x[i] + (s.type === \"bar\" ? s.barOffset : 0);\n const yv = s.type === \"bar\" && s.barTop ? s.barTop[i] : s.cols.y[i];\n return { px: sc.xToPx(xv), py: sc.yToPx(yv) };\n };\n\n const candidateOf = (\n s: SeriesModel,\n i: number,\n px: number,\n py: number,\n sc: Scales,\n ): Candidate => {\n const p = pointOf(s, i, sc);\n let inside = false;\n if (s.type === \"bar\" && s.barBase) {\n const half = s.barHalfWidth / sc.xPerPx;\n const base = sc.yToPx(s.barBase[i]);\n inside =\n Math.abs(px - p.px) <= half &&\n py >= Math.min(base, p.py) - 2 &&\n py <= Math.max(base, p.py) + 2;\n }\n return {\n series: s,\n index: i,\n px: p.px,\n py: p.py,\n dx: Math.abs(sc.xToPx(s.cols.x[i]) - px),\n dist: inside ? 0 : Math.hypot(p.px - px, p.py - py),\n inside,\n };\n };\n\n const nearestScatter = (\n s: SeriesModel,\n px: number,\n py: number,\n sc: Scales,\n ) => {\n const radius = Math.max(s.pointSize / 2 + 6, 10);\n const xv = sc.pxToX(px);\n const yv = sc.pxToY(py);\n const rx = radius * sc.xPerPx;\n const ry = radius * sc.yPerPx;\n let best = -1;\n let bestDist = Infinity;\n const { x, y, size } = s.cols;\n gridOf(s).query(xv - rx, xv + rx, yv - ry, yv + ry, (i) => {\n const d = Math.hypot(sc.xToPx(x[i]) - px, sc.yToPx(y[i]) - py);\n const reach = Math.max(\n (size && size[i] > 0 ? size[i] : s.pointSize) / 2 + 4,\n 8,\n );\n if (d <= reach && d <= bestDist) {\n bestDist = d;\n best = i;\n }\n });\n return best;\n };\n\n const nearestX = (s: SeriesModel, xv: number) => {\n const { x, y, count, sorted } = s.cols;\n if (sorted) return nearestIndex(x, y, count, xv);\n let best = -1;\n let bestD = Infinity;\n for (let i = 0; i < count; i++) {\n if (!Number.isFinite(y[i])) continue;\n const d = Math.abs(x[i] - xv);\n if (d < bestD) {\n bestD = d;\n best = i;\n }\n }\n return best;\n };\n\n const toItem = (c: Candidate): ChartHoverItem => {\n const s = c.series;\n const pc = s.pointColors?.[c.index];\n const label = s.cols.labels?.[c.index];\n return {\n seriesIndex: s.index,\n seriesId: s.id,\n seriesName: s.name,\n index: c.index,\n x: s.cols.x[c.index],\n y: s.cols.y[c.index],\n color: pc ? toCss(pc) : s.colorCss,\n ...(label !== undefined ? { label } : {}),\n };\n };\n\n const eventOf = (candidates: Candidate[]): ChartHoverEvent | null => {\n if (!candidates.length) return null;\n candidates.sort((a, b) => a.series.index - b.series.index);\n const hoverItems = candidates.map(toItem);\n const x = hoverItems[0].x;\n return {\n items: hoverItems,\n x,\n xLabel: xTicks?.formatValue(x) ?? String(x),\n };\n };\n\n const hitTest = (px: number, py: number): ChartHoverEvent | null => {\n const sc = scales;\n if (!sc) return null;\n const { plot } = sc;\n const margin = 6;\n if (\n px < plot.x - margin ||\n px > plot.x + plot.width + margin ||\n py < plot.y - margin ||\n py > plot.y + plot.height + margin\n ) {\n return null;\n }\n const xv = sc.pxToX(px);\n const scatter: Candidate[] = [];\n const others: Candidate[] = [];\n for (const s of model.series) {\n if (s.hidden || s.cols.count === 0) continue;\n if (s.type === \"scatter\") {\n const i = nearestScatter(s, px, py, sc);\n if (i >= 0) scatter.push(candidateOf(s, i, px, py, sc));\n } else {\n const i = nearestX(s, xv);\n if (i >= 0) others.push(candidateOf(s, i, px, py, sc));\n }\n }\n if (model.tooltipMode === \"nearest\") {\n const all = [...scatter, ...others].filter(\n (c) => c.inside || c.series.type === \"scatter\" || c.dist <= 32,\n );\n if (!all.length) return null;\n const best = all.reduce((a, b) => (b.dist <= a.dist ? b : a));\n return eventOf([best]);\n }\n if (!others.length) {\n if (!scatter.length) return null;\n return eventOf([scatter.reduce((a, b) => (b.dist <= a.dist ? b : a))]);\n }\n const bestDx = Math.min(...others.map((c) => c.dx));\n const bandPx = model.x.type === \"category\" ? 0.5 / sc.xPerPx : 0;\n const aligned = others.filter((c) => c.dx <= bestDx + Math.max(1, bandPx));\n const first = aligned.reduce((a, b) => (b.dx < a.dx ? b : a));\n const ordered = [first, ...aligned.filter((c) => c !== first), ...scatter];\n const event = eventOf(ordered);\n if (event) {\n event.x = toItem(first).x;\n event.xLabel = xTicks?.formatValue(event.x) ?? String(event.x);\n }\n return event;\n };\n\n // ---------------------------------------------------------------- hover\n\n const setHover = (next: HoverState | null) => {\n const changed =\n (hover === null) !== (next === null) ||\n (hover &&\n next &&\n (hover.event.items.length !== next.event.items.length ||\n hover.event.items.some(\n (it, i) =>\n it.index !== next.event.items[i].index ||\n it.seriesIndex !== next.event.items[i].seriesIndex,\n )));\n hover = next;\n renderHover();\n if (changed) emit(\"hover\", next ? next.event : null);\n };\n\n const tooltipContent = (event: ChartHoverEvent): Node | string | null => {\n const custom = tooltipOptions()?.render;\n if (custom) return custom(event);\n const fragment = doc.createDocumentFragment();\n const header = doc.createElement(\"div\");\n styleElement(header, {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n fontWeight: \"600\",\n marginBottom: \"4px\",\n color: \"var(--text-color, #1f2937)\",\n });\n const row = (color: string | null, name: string, value: string) => {\n const el = doc.createElement(\"div\");\n styleElement(el, { display: \"flex\", alignItems: \"center\", gap: \"8px\" });\n if (color) el.appendChild(swatch(doc, color, \"dot\"));\n const n = doc.createElement(\"span\");\n styleElement(n, {\n flex: \"1 1 auto\",\n color: \"var(--text-secondary-color, #6b7280)\",\n });\n n.textContent = name;\n const v = doc.createElement(\"span\");\n styleElement(v, {\n fontWeight: \"600\",\n fontVariantNumeric: \"tabular-nums\",\n marginLeft: \"12px\",\n });\n v.textContent = value;\n el.append(n, v);\n return el;\n };\n const yFormat = yTicks?.formatValue ?? String;\n const scatterOnly = event.items.every(\n (it) => model.series[it.seriesIndex].type === \"scatter\",\n );\n if (scatterOnly && event.items.length === 1) {\n const it = event.items[0];\n header.append(\n swatch(doc, it.color, \"dot\"),\n doc.createTextNode(it.label ?? it.seriesName),\n );\n fragment.append(\n header,\n row(null, model.x.title ?? \"x\", event.xLabel),\n row(null, model.y.title ?? \"y\", yFormat(it.y)),\n );\n if (it.label !== undefined && model.series.length > 1) {\n fragment.append(row(null, \"\", it.seriesName));\n }\n return fragment;\n }\n header.textContent = event.xLabel;\n fragment.append(header);\n for (const it of event.items) {\n const name = it.label ? `${it.seriesName} · ${it.label}` : it.seriesName;\n fragment.append(row(it.color, name, yFormat(it.y)));\n }\n return fragment;\n };\n\n const pooled = <T extends HTMLElement>(\n pool: T[],\n i: number,\n make: () => T,\n ) => {\n if (!pool[i]) {\n pool[i] = make();\n dom.hover.appendChild(pool[i]);\n }\n pool[i].style.display = \"block\";\n return pool[i];\n };\n\n function renderHover() {\n const sc = scales;\n let markerCount = 0;\n let highlightCount = 0;\n dom.crosshair.style.display = \"none\";\n if (hover && sc) {\n const { plot } = sc;\n dom.hover.style.width = `${dom.stage.clientWidth}px`;\n dom.hover.style.height = `${dom.stage.clientHeight}px`;\n const axisMode = model.tooltipMode === \"axis\";\n const showCrosshair =\n options.crosshair ??\n (axisMode &&\n hover.event.items.some(\n (it) => model.series[it.seriesIndex].type !== \"scatter\",\n ));\n if (showCrosshair) {\n const first = hover.event.items[0];\n const cx = sc.xToPx(first.x);\n if (cx >= plot.x && cx <= plot.x + plot.width) {\n styleElement(dom.crosshair, {\n display: \"block\",\n left: `${Math.round(cx)}px`,\n top: `${plot.y}px`,\n height: `${plot.height}px`,\n });\n }\n }\n for (const it of hover.event.items) {\n const s = model.series[it.seriesIndex];\n if (s.type === \"bar\" && s.barBase && s.barTop) {\n const cx = sc.xToPx(it.x + s.barOffset);\n const half = Math.max(s.barHalfWidth / sc.xPerPx, 1);\n const a = sc.yToPx(s.barBase[it.index]);\n const b = sc.yToPx(s.barTop[it.index]);\n const el = pooled(highlights, highlightCount++, () =>\n createBarHighlight(doc),\n );\n styleElement(el, {\n left: `${cx - half}px`,\n top: `${Math.min(a, b)}px`,\n width: `${half * 2}px`,\n height: `${Math.max(1, Math.abs(a - b))}px`,\n });\n continue;\n }\n const px = sc.xToPx(it.x);\n const py = sc.yToPx(it.y);\n if (\n px < plot.x - 1 ||\n px > plot.x + plot.width + 1 ||\n py < plot.y - 1 ||\n py > plot.y + plot.height + 1\n ) {\n continue;\n }\n const d =\n s.type === \"scatter\"\n ? (s.cols.size && s.cols.size[it.index] > 0\n ? s.cols.size[it.index]\n : s.pointSize) + 6\n : Math.max(10, s.lineWidth * 2 + 6);\n const el = pooled(markers, markerCount++, () => createMarker(doc));\n styleElement(el, {\n left: `${px}px`,\n top: `${py}px`,\n width: `${d}px`,\n height: `${d}px`,\n background: it.color,\n });\n }\n }\n for (let i = markerCount; i < markers.length; i++)\n markers[i].style.display = \"none\";\n for (let i = highlightCount; i < highlights.length; i++)\n highlights[i].style.display = \"none\";\n\n const tip = dom.tooltip;\n const content =\n hover && sc && tooltipOptions() && !drag?.moved\n ? tooltipContent(hover.event)\n : null;\n if (!hover || content === null || content === \"\") {\n tip.style.display = \"none\";\n return;\n }\n if (typeof content === \"string\") tip.textContent = content;\n else tip.replaceChildren(content);\n tip.style.display = \"block\";\n const stageW = dom.stage.clientWidth;\n const stageH = dom.stage.clientHeight;\n const w = tip.offsetWidth;\n const h = tip.offsetHeight;\n let left = hover.anchorX + 16;\n if (left + w > stageW - 4) left = hover.anchorX - 16 - w;\n left = Math.max(4, Math.min(left, stageW - w - 4));\n const top = Math.max(4, Math.min(hover.anchorY - h / 2, stageH - h - 4));\n tip.style.transform = `translate(${Math.round(left)}px, ${Math.round(top)}px)`;\n }\n\n // ---------------------------------------------------------- interaction\n\n const setViewInternal = (next: ChartView, notify: boolean) => {\n const { base, minSpan } = model;\n view = {\n x: clampRange(next.x, base.x, minSpan.x),\n y: clampRange(next.y, base.y, minSpan.y),\n };\n zoomed = !sameRange(view.x, base.x) || !sameRange(view.y, base.y);\n const it = interaction();\n dom.stage.style.cursor = zoomed && it?.pan ? \"grab\" : \"\";\n if (notify) emit(\"zoom\", copyView(view));\n invalidate();\n };\n\n const zoomAt = (px: number, py: number, factor: number) => {\n const sc = scales;\n if (!sc) return;\n const next = copyView(view);\n if (model.zoom.x) next.x = zoomRange(view.x, sc.pxToX(px), factor);\n if (model.zoom.y) next.y = zoomRange(view.y, sc.pxToY(py), factor);\n setViewInternal(next, true);\n };\n\n const localPoint = (event: { clientX: number; clientY: number }) => {\n const rect = dom.stage.getBoundingClientRect();\n return { x: event.clientX - rect.left, y: event.clientY - rect.top };\n };\n\n const inPlot = (x: number, y: number) => {\n const p = scales?.plot;\n return (\n !!p && x >= p.x && x <= p.x + p.width && y >= p.y && y <= p.y + p.height\n );\n };\n\n const onPointerMove = (event: PointerEvent) => {\n const { x, y } = localPoint(event);\n if (drag && drag.id === event.pointerId) {\n const dx = x - drag.x;\n const dy = y - drag.y;\n if (!drag.moved && Math.hypot(dx, dy) > 3) {\n const it = interaction();\n if (zoomed && it?.pan) {\n drag.moved = true;\n dom.stage.setPointerCapture?.(event.pointerId);\n dom.stage.style.cursor = \"grabbing\";\n }\n }\n if (drag.moved && scales) {\n const next = copyView(drag.view);\n if (model.zoom.x)\n next.x = panRange(\n drag.view.x,\n -dx * scales.xPerPx * (model.x.reverse ? -1 : 1),\n );\n if (model.zoom.y)\n next.y = panRange(\n drag.view.y,\n dy * scales.yPerPx * (model.y.reverse ? -1 : 1),\n );\n setViewInternal(next, true);\n return;\n }\n }\n const event2 = hitTest(x, y);\n setHover(\n event2\n ? { event: event2, anchorX: x, anchorY: y, keyboard: false }\n : null,\n );\n };\n\n const onPointerDown = (event: PointerEvent) => {\n if (event.button !== 0) return;\n const { x, y } = localPoint(event);\n if (!inPlot(x, y)) return;\n drag = { id: event.pointerId, x, y, view: copyView(view), moved: false };\n };\n\n const onPointerUp = (event: PointerEvent) => {\n if (!drag || drag.id !== event.pointerId) return;\n const moved = drag.moved;\n drag = null;\n if (dom.stage.hasPointerCapture?.(event.pointerId)) {\n dom.stage.releasePointerCapture(event.pointerId);\n }\n dom.stage.style.cursor = zoomed && interaction()?.pan ? \"grab\" : \"\";\n if (!moved) {\n const { x, y } = localPoint(event);\n const hit = hitTest(x, y);\n if (hit) emit(\"click\", hit);\n } else {\n renderHover();\n }\n };\n\n const onPointerLeave = () => {\n if (!drag?.moved) setHover(null);\n };\n\n const onWheel = (event: WheelEvent) => {\n const it = interaction();\n if (!it || it.zoom === false || (!model.zoom.x && !model.zoom.y)) return;\n const { x, y } = localPoint(event);\n if (!inPlot(x, y)) return;\n const modifier = event.ctrlKey || event.metaKey;\n if (it.wheel === \"always\" || modifier) {\n event.preventDefault();\n zoomAt(\n x,\n y,\n wheelFactor(\n event.deltaY,\n event.deltaMode,\n event.ctrlKey && !event.metaKey,\n ),\n );\n } else if (\n zoomed &&\n model.zoom.x &&\n scales &&\n Math.abs(event.deltaX) > Math.abs(event.deltaY)\n ) {\n event.preventDefault();\n const next = copyView(view);\n next.x = panRange(\n view.x,\n event.deltaX * scales.xPerPx * (model.x.reverse ? -1 : 1),\n );\n setViewInternal(next, true);\n }\n };\n\n const onDoubleClick = (event: MouseEvent) => {\n const { x, y } = localPoint(event);\n if (interaction() && zoomed && inPlot(x, y)) resetZoom();\n };\n\n /** Keyboard: moves along the first visible series (or the one in focus) */\n const moveFocus = (step: number) => {\n const sc = scales;\n if (!sc) return;\n const current = hover?.keyboard ? hover.event.items[0] : null;\n const series =\n (current && model.series[current.seriesIndex]) ??\n model.series.find((s) => !s.hidden && s.cols.count > 0);\n if (!series) return;\n const { x, y, count } = series.cols;\n let index: number;\n if (current) {\n index = current.index + step;\n } else {\n // first point inside the view\n index = series.cols.sorted ? lowerBound(x, count, view.x[0]) : 0;\n if (step < 0)\n index = series.cols.sorted\n ? lowerBound(x, count, view.x[1]) - 1\n : count - 1;\n }\n while (index >= 0 && index < count && !Number.isFinite(y[index]))\n index += step || 1;\n if (index < 0 || index >= count) return;\n // keep the point visible\n let current2 = sc;\n if (model.zoom.x && (x[index] < view.x[0] || x[index] > view.x[1])) {\n const span = view.x[1] - view.x[0];\n setViewInternal(\n { x: [x[index] - span / 2, x[index] + span / 2], y: view.y },\n true,\n );\n current2 = scales = createScales(\n sc.plot,\n view,\n model.x.reverse,\n model.y.reverse,\n );\n }\n const p = pointOf(series, index, current2);\n const leadItem = toItem(candidateOf(series, index, p.px, p.py, current2));\n const others =\n model.tooltipMode === \"axis\" && series.type !== \"scatter\"\n ? (hitTest(p.px, p.py)?.items ?? []).filter(\n (it) => it.seriesIndex !== series.index,\n )\n : [];\n const event: ChartHoverEvent = {\n items: [leadItem, ...others],\n x: leadItem.x,\n xLabel: xTicks?.formatValue(leadItem.x) ?? String(leadItem.x),\n };\n setHover({ event, anchorX: p.px, anchorY: p.py, keyboard: true });\n const it = leadItem;\n dom.live.textContent = `${it.seriesName}: ${event.xLabel}, ${yTicks?.formatValue(it.y) ?? it.y}${it.label ? ` (${it.label})` : \"\"}`;\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (!interaction()?.keyboard) return;\n const center = () => {\n const p = scales?.plot;\n return p ? [p.x + p.width / 2, p.y + p.height / 2] : [0, 0];\n };\n switch (event.key) {\n case \"ArrowRight\":\n case \"ArrowLeft\":\n event.preventDefault();\n moveFocus((event.key === \"ArrowRight\") !== model.x.reverse ? 1 : -1);\n break;\n case \"+\":\n case \"=\": {\n if (!model.zoom.x && !model.zoom.y) return;\n event.preventDefault();\n const [cx, cy] = center();\n zoomAt(cx, cy, 0.8);\n break;\n }\n case \"-\":\n case \"_\": {\n if (!model.zoom.x && !model.zoom.y) return;\n event.preventDefault();\n const [cx, cy] = center();\n zoomAt(cx, cy, 1.25);\n break;\n }\n case \"0\":\n event.preventDefault();\n resetZoom();\n break;\n case \"Escape\":\n if (hover) {\n event.preventDefault();\n setHover(null);\n }\n break;\n default:\n break;\n }\n };\n\n const onFocus = () => {\n let visible: boolean;\n try {\n visible = dom.stage.matches(\":focus-visible\");\n } catch {\n visible = true;\n }\n if (visible)\n dom.stage.style.boxShadow = \"0 0 0 2px var(--primary-color, #4f46e5)\";\n };\n\n const onBlur = () => {\n dom.stage.style.boxShadow = \"\";\n if (hover?.keyboard) setHover(null);\n };\n\n const stage = dom.stage;\n stage.addEventListener(\"pointermove\", onPointerMove);\n stage.addEventListener(\"pointerdown\", onPointerDown);\n stage.addEventListener(\"pointerup\", onPointerUp);\n stage.addEventListener(\"pointercancel\", onPointerUp);\n stage.addEventListener(\"pointerleave\", onPointerLeave);\n stage.addEventListener(\"wheel\", onWheel, { passive: false });\n stage.addEventListener(\"dblclick\", onDoubleClick);\n stage.addEventListener(\"keydown\", onKeyDown);\n stage.addEventListener(\"focus\", onFocus);\n stage.addEventListener(\"blur\", onBlur);\n\n const resizeObserver =\n typeof ResizeObserver === \"function\"\n ? new ResizeObserver(() => invalidate())\n : null;\n resizeObserver?.observe(dom.stage);\n\n const refreshTheme = () => {\n if (destroyed) return;\n theme = readTheme(dom.root, options.palette);\n themeVersion++;\n rebuild();\n };\n const unwatchTheme = watchTheme(refreshTheme);\n\n // ------------------------------------------------------------- renderer\n\n const initRenderer = async (exclude: Set<ChartRendererKind> = new Set()) => {\n const token = ++rendererToken;\n const next = await createRenderer(\n options.renderer ?? \"auto\",\n () => createDataCanvas(doc),\n (kind) => {\n if (destroyed || renderer?.kind !== kind) return;\n renderer.destroy();\n renderer.canvas.remove();\n renderer = null;\n void initRenderer(new Set([...exclude, kind]));\n },\n exclude,\n );\n if (destroyed || token !== rendererToken) {\n next?.destroy();\n return;\n }\n if (renderer) {\n renderer.destroy();\n renderer.canvas.remove();\n }\n renderer = next;\n if (next) {\n dom.root.dataset.renderer = next.kind;\n dom.stage.insertBefore(next.canvas, dom.foreground);\n itemsDirty = true;\n emit(\"renderer\", next.kind);\n }\n resolveReady(next?.kind ?? null);\n invalidate();\n };\n\n // ------------------------------------------------------------------ api\n\n function resetZoom() {\n if (!zoomed) return;\n setViewInternal(copyView(model.base), true);\n }\n\n rebuild();\n void initRenderer();\n\n const instance: ChartInstance = {\n setOptions(next) {\n if (destroyed) return;\n const previous = options;\n options = next;\n if ((next.palette ?? []).join() !== (previous.palette ?? []).join()) {\n theme = readTheme(dom.root, next.palette);\n themeVersion++;\n }\n if ((next.renderer ?? \"auto\") !== (previous.renderer ?? \"auto\"))\n void initRenderer();\n rebuild();\n },\n resize() {\n invalidate();\n },\n resetZoom,\n getView: () => copyView(view),\n setView(next) {\n if (destroyed) return;\n setViewInternal({ x: next.x ?? view.x, y: next.y ?? view.y }, false);\n },\n getRenderer: () => renderer?.kind ?? null,\n ready,\n refreshTheme,\n on(type, listener) {\n let set = listeners[type] as Set<typeof listener> | undefined;\n if (!set) {\n set = new Set();\n (listeners as Record<string, unknown>)[type] = set;\n }\n set.add(listener);\n return () => {\n set.delete(listener);\n };\n },\n destroy() {\n if (destroyed) return;\n destroyed = true;\n if (frameId) {\n if (win?.cancelAnimationFrame) win.cancelAnimationFrame(frameId);\n else clearTimeout(frameId);\n }\n resizeObserver?.disconnect();\n unwatchTheme();\n stage.removeEventListener(\"wheel\", onWheel);\n renderer?.destroy();\n renderer = null;\n dom.root.remove();\n for (const key of Object.keys(listeners)) {\n delete (listeners as Record<string, unknown>)[key];\n }\n },\n };\n return instance;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chart.js","names":["assign","mid","r","copyView","v","createChart","doc","container","win","dom","createChartDom","cache","hidden","listeners","options","initialOptions","theme","readTheme","model","view","zoomed","origin","items","itemsDirty","version","annotations","scales","xTicks","yTicks","renderer","rendererToken","destroyed","frameId","hover","lastPlot","pointDrag","ghost","drag","markers","highlights","themeVersion","itemsSignature","objectIds","objectCounter","idOf","id","value","resolveReady","ready","resolve","emit","type","listener","event","interaction","o","tooltipOptions","invalidate","frame","rebuild","buildModel","zoom","clampRange","base","minSpan","sameRange","signature","s","resolveAnnotations","renderLegend","updateAccessibility","ensureOrigin","far","legendOption","named","show","config","toggle","focused","bottom","item","swatch","names","keyboard","sizeCanvas","w","width","dpr","h","height","canvas","transformFor","scale","range","offset","reverse","bg","fg","font","layout","layoutChart","text","rect","plotRect","drawBackground","drawForeground","collectPointLabels","plot","bw","bh","buildItems","xScale","xOffset","yScale","yOffset","hitAt","hitTest","px","py","p","draggableAt","it","setHover","changed","sameHover","next","renderHover","tooltipNode","custom","content","tooltipContent","fragment","header","row","el","pooled","pool","i","make","sc","markerCount","highlightCount","showsCrosshair","first","cx","mark","hoverMarks","createBarHighlight","createMarker","tip","stageW","stageH","left","top","setViewInternal","notify","zoomAt","zoomRange","factor","localPoint","inPlot","x","y","dataAt","cy","moveGhost","color","size","series","onPointerMove","at","dx","dy","panRange","event2","onPointerDown","draggable","onPointerUp","moved","hit","onPointerLeave","onWheel","modifier","wheelFactor","onDoubleClick","resetZoom","moveFocus","current","index","step","lowerBound","count","current2","span","createScales","pointOf","leadItem","hoverItemOf","onKeyDown","center","onFocus","visible","onBlur","stage","resizeObserver","refreshTheme","unwatchTheme","watchTheme","initRenderer","token","createRenderer","createDataCanvas","kind","exclude","previous","set","key"],"sources":["../../../../charts/src/engine/chart.ts"],"sourcesContent":["// createChart: mounts a chart in a container and keeps it in sync with its\n// options, its size, the theme and the user's interactions.\n\nimport type { AxisTicks } from \"./axis\";\nimport { lowerBound } from \"./data\";\nimport {\n createBarHighlight,\n createChartDom,\n createDataCanvas,\n createMarker,\n styleElement,\n swatch,\n} from \"./dom\";\nimport { buildItems, type Origin } from \"./items\";\nimport { createScales, type Scales } from \"./layout\";\nimport { buildModel, type ChartModel, type DataCache } from \"./model\";\nimport {\n drawBackground,\n drawForeground,\n font,\n type ResolvedAnnotation,\n} from \"./overlay\";\nimport { createRenderer } from \"./renderers/detect\";\nimport type { ChartRenderer, RenderItem } from \"./renderers/types\";\nimport {\n collectPointLabels,\n hitTest,\n hoverItemOf,\n hoverMarks,\n layoutChart,\n pointOf,\n resolveAnnotations,\n sameHover,\n showsCrosshair,\n tooltipContent,\n} from \"./scene\";\nimport { readTheme, watchTheme, type ChartTheme } from \"./theme\";\nimport type {\n ChartEventMap,\n ChartHoverEvent,\n ChartHoverItem,\n ChartInstance,\n ChartInteractionOptions,\n ChartOptions,\n ChartRendererKind,\n ChartTooltipOptions,\n ChartView,\n} from \"./types\";\nimport {\n clampRange,\n panRange,\n sameRange,\n wheelFactor,\n zoomRange,\n type Range,\n} from \"./viewport\";\n\ninterface HoverState {\n event: ChartHoverEvent;\n /** Tooltip anchor in stage pixels */\n anchorX: number;\n anchorY: number;\n keyboard: boolean;\n}\n\nconst mid = (r: Range) => (r[0] + r[1]) / 2;\nconst copyView = (v: ChartView): ChartView => ({\n x: [v.x[0], v.x[1]],\n y: [v.y[0], v.y[1]],\n});\n\n/**\n * Creates a chart inside `container` (which must have a size). The data\n * layer uses WebGPU when available, then WebGL2, then Canvas2D.\n */\nexport const createChart = (\n container: HTMLElement,\n initialOptions: ChartOptions,\n): ChartInstance => {\n const doc = container.ownerDocument;\n const win = doc.defaultView;\n const dom = createChartDom(container);\n const cache: DataCache = new Map();\n const hidden = new Set<string>();\n const listeners: {\n [K in keyof ChartEventMap]?: Set<(event: ChartEventMap[K]) => void>;\n } = {};\n\n let options = initialOptions;\n let theme: ChartTheme = readTheme(dom.root, options.palette);\n let model: ChartModel;\n let view: ChartView = { x: [0, 1], y: [0, 1] };\n let zoomed = false;\n let origin: Origin = { x: 0, y: 0 };\n let items: RenderItem[] = [];\n let itemsDirty = true;\n let version = 0;\n let annotations: ResolvedAnnotation[] = [];\n let scales: Scales | null = null;\n let xTicks: AxisTicks | null = null;\n let yTicks: AxisTicks | null = null;\n let renderer: ChartRenderer | null = null;\n let rendererToken = 0;\n let destroyed = false;\n let frameId = 0;\n let hover: HoverState | null = null;\n let lastPlot = \"\";\n let pointDrag: {\n id: number;\n item: ChartHoverItem;\n x: number;\n y: number;\n moved: boolean;\n } | null = null;\n let ghost: HTMLDivElement | null = null;\n let drag: {\n id: number;\n x: number;\n y: number;\n view: ChartView;\n moved: boolean;\n } | null = null;\n const markers: HTMLDivElement[] = [];\n const highlights: HTMLDivElement[] = [];\n let themeVersion = 0;\n let itemsSignature = \"\";\n const objectIds = new WeakMap<object, number>();\n let objectCounter = 0;\n const idOf = (value: object) => {\n let id = objectIds.get(value);\n if (id === undefined) objectIds.set(value, (id = ++objectCounter));\n return id;\n };\n\n let resolveReady: (kind: ChartRendererKind | null) => void = () => {};\n const ready = new Promise<ChartRendererKind | null>((resolve) => {\n resolveReady = resolve;\n });\n\n const emit = <K extends keyof ChartEventMap>(\n type: K,\n event: ChartEventMap[K],\n ) => {\n listeners[type]?.forEach((listener) => listener(event));\n };\n\n const interaction = (): Required<ChartInteractionOptions> | null => {\n const value = options.interaction;\n if (value === false) return null;\n const o = typeof value === \"object\" ? value : {};\n return {\n zoom: o.zoom ?? true,\n wheel: o.wheel ?? \"modifier\",\n pan: o.pan ?? true,\n keyboard: o.keyboard ?? true,\n dragPoints: o.dragPoints ?? false,\n };\n };\n\n const tooltipOptions = (): ChartTooltipOptions | null =>\n options.tooltip === false\n ? null\n : typeof options.tooltip === \"object\"\n ? options.tooltip\n : {};\n\n const invalidate = () => {\n if (destroyed || frameId) return;\n frameId = win?.requestAnimationFrame\n ? win.requestAnimationFrame(frame)\n : (setTimeout(frame, 16) as unknown as number);\n };\n\n // ---------------------------------------------------------------- model\n\n const rebuild = () => {\n model = buildModel(options, theme, hidden, cache);\n const { base, zoom, minSpan } = model;\n if (!zoomed) {\n view = copyView(base);\n } else {\n view = {\n x: zoom.x ? clampRange(view.x, base.x, minSpan.x) : [...base.x],\n y: zoom.y ? clampRange(view.y, base.y, minSpan.y) : [...base.y],\n };\n zoomed = !sameRange(view.x, base.x) || !sameRange(view.y, base.y);\n }\n // Unchanged data and styles (e.g. a React re-render): keep the GPU\n // buffers and the hover state\n const signature = [\n themeVersion,\n model.baseline,\n base.x.join(),\n base.y.join(),\n ...model.series.map((s) =>\n [\n s.key,\n s.type,\n idOf(s.cols),\n s.colorCss,\n s.hidden,\n s.lineWidth,\n s.pointSize,\n s.opacity,\n s.barOffset,\n s.barHalfWidth,\n options.series[s.index].stack ?? \"\",\n ].join(\"|\"),\n ),\n ].join(\"\\n\");\n if (signature !== itemsSignature) {\n itemsSignature = signature;\n origin = { x: mid(base.x), y: mid(base.y) };\n itemsDirty = true;\n if (hover && !hover.keyboard) hover = null;\n }\n annotations = resolveAnnotations(options.annotations, theme);\n renderLegend();\n updateAccessibility();\n invalidate();\n };\n\n /** float32 positions lose precision far from the origin: re-center when deeply zoomed */\n const ensureOrigin = () => {\n const far = (r: Range, o: number) =>\n Math.max(Math.abs(r[0] - o), Math.abs(r[1] - o)) > (r[1] - r[0]) * 2000;\n if (far(view.x, origin.x) || far(view.y, origin.y)) {\n origin = { x: mid(view.x), y: mid(view.y) };\n itemsDirty = true;\n }\n };\n\n // --------------------------------------------------------------- legend\n\n const renderLegend = () => {\n const legendOption = options.legend;\n const named = options.series.filter((s) => s.name).length;\n const show = legendOption === undefined ? named > 1 : !!legendOption;\n const config = typeof legendOption === \"object\" ? legendOption : {};\n const toggle = config.toggle ?? true;\n const focused = [...dom.legend.children].indexOf(\n doc.activeElement as Element,\n );\n dom.legend.replaceChildren();\n dom.legend.style.display = show ? \"flex\" : \"none\";\n if (!show) return;\n const bottom = config.position === \"bottom\";\n dom.legend.style.order = bottom ? \"1\" : \"0\";\n dom.legend.style.padding = bottom ? \"8px 4px 0\" : \"0 4px 8px\";\n for (const s of model.series) {\n const item = doc.createElement(toggle ? \"button\" : \"span\");\n if (item instanceof HTMLButtonElement) {\n item.type = \"button\";\n item.setAttribute(\"aria-pressed\", String(!s.hidden));\n item.addEventListener(\"click\", () => {\n if (hidden.has(s.id)) hidden.delete(s.id);\n else hidden.add(s.id);\n rebuild();\n });\n }\n styleElement(item, {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"6px\",\n padding: \"2px 4px\",\n margin: \"0\",\n border: \"0\",\n borderRadius: \"4px\",\n background: \"none\",\n font: \"inherit\",\n color: \"var(--text-secondary-color, #6b7280)\",\n cursor: toggle ? \"pointer\" : \"default\",\n opacity: s.hidden ? \"0.45\" : \"1\",\n textDecoration: s.hidden ? \"line-through\" : \"none\",\n });\n item.append(\n swatch(\n doc,\n s.colorCss,\n s.type === \"scatter\" ? \"dot\" : s.type === \"line\" ? \"line\" : \"square\",\n ),\n doc.createTextNode(s.name),\n );\n dom.legend.appendChild(item);\n }\n if (focused >= 0)\n (dom.legend.children[focused] as HTMLElement | undefined)?.focus();\n };\n\n const updateAccessibility = () => {\n const names = model.series.map((s) => s.name).join(\", \");\n dom.stage.setAttribute(\n \"aria-label\",\n options.ariaLabel ?? (names ? `Chart: ${names}` : \"Chart\"),\n );\n const keyboard = interaction()?.keyboard;\n dom.stage.style.touchAction = interaction()?.dragPoints ? \"none\" : \"pan-y\";\n if (keyboard) dom.stage.tabIndex = 0;\n else dom.stage.removeAttribute(\"tabindex\");\n };\n\n // ---------------------------------------------------------------- frame\n\n const sizeCanvas = (\n canvas: HTMLCanvasElement,\n width: number,\n height: number,\n dpr: number,\n ) => {\n const w = Math.max(1, Math.round(width * dpr));\n const h = Math.max(1, Math.round(height * dpr));\n if (canvas.width !== w) canvas.width = w;\n if (canvas.height !== h) canvas.height = h;\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n };\n\n const transformFor = (range: Range, o: number, reverse: boolean) => {\n const scale = 2 / (range[1] - range[0]);\n const offset = (o - range[0]) * scale - 1;\n return reverse ? [-scale, -offset] : [scale, offset];\n };\n\n function frame() {\n frameId = 0;\n if (destroyed) return;\n const width = dom.stage.clientWidth;\n const height = dom.stage.clientHeight;\n if (width <= 0 || height <= 0) return;\n const dpr = win?.devicePixelRatio || 1;\n sizeCanvas(dom.background, width, height, dpr);\n sizeCanvas(dom.foreground, width, height, dpr);\n const bg = dom.background.getContext(\"2d\");\n const fg = dom.foreground.getContext(\"2d\");\n\n if (bg) {\n bg.setTransform(dpr, 0, 0, dpr, 0, 0);\n bg.font = font(theme);\n }\n const layout = layoutChart({\n model,\n view,\n theme,\n width,\n height,\n padding: options.padding,\n measure: bg\n ? (text) => bg.measureText(text).width\n : (text) => text.length * theme.fontSize * 0.6,\n });\n const { plot } = layout;\n xTicks = layout.xTicks;\n yTicks = layout.yTicks;\n scales = layout.scales;\n const rect = plotRect();\n if (rect && rect.join() !== lastPlot) {\n lastPlot = rect.join();\n emit(\"layout\", {\n x: rect[0],\n y: rect[1],\n width: rect[2],\n height: rect[3],\n });\n }\n\n if (bg) {\n drawBackground(bg, {\n width,\n height,\n scales,\n x: model.x,\n y: model.y,\n xTicks,\n yTicks,\n theme,\n annotations,\n });\n }\n if (fg) {\n fg.setTransform(dpr, 0, 0, dpr, 0, 0);\n drawForeground(fg, {\n width,\n height,\n scales,\n theme,\n annotations,\n pointLabels: collectPointLabels(model, view, scales),\n });\n }\n\n if (renderer) {\n const canvas = renderer.canvas;\n styleElement(canvas, {\n left: `${plot.x}px`,\n top: `${plot.y}px`,\n width: `${plot.width}px`,\n height: `${plot.height}px`,\n });\n const bw = Math.max(1, Math.round(plot.width * dpr));\n const bh = Math.max(1, Math.round(plot.height * dpr));\n if (canvas.width !== bw || canvas.height !== bh) renderer.resize(bw, bh);\n ensureOrigin();\n if (itemsDirty) {\n version++;\n items = buildItems(model, origin, version);\n itemsDirty = false;\n }\n const [xScale, xOffset] = transformFor(view.x, origin.x, model.x.reverse);\n const [yScale, yOffset] = transformFor(view.y, origin.y, model.y.reverse);\n renderer.render(items, {\n transform: { xScale, xOffset, yScale, yOffset },\n width: bw,\n height: bh,\n dpr,\n });\n }\n renderHover();\n }\n\n // ------------------------------------------------------------ hit tests\n\n const hitAt = (px: number, py: number): ChartHoverEvent | null =>\n scales ? hitTest(model, scales, xTicks, px, py) : null;\n\n /** Plot area relative to the container: x, y, width, height */\n const plotRect = (): [number, number, number, number] | null => {\n const p = scales?.plot;\n if (!p) return null;\n return [\n p.x + dom.stage.offsetLeft,\n p.y + dom.stage.offsetTop,\n p.width,\n p.height,\n ];\n };\n\n /** A draggable point under the pointer (`interaction.dragPoints`) */\n const draggableAt = (px: number, py: number) => {\n if (!interaction()?.dragPoints) return null;\n const hit = hitAt(px, py);\n const item = hit?.items.find(\n (it) => model.series[it.seriesIndex].type === \"scatter\",\n );\n return item ?? null;\n };\n\n // ---------------------------------------------------------------- hover\n\n const setHover = (next: HoverState | null) => {\n const changed = !sameHover(hover?.event ?? null, next?.event ?? null);\n hover = next;\n renderHover();\n if (changed) emit(\"hover\", next ? next.event : null);\n };\n\n const tooltipNode = (event: ChartHoverEvent): Node | string | null => {\n const custom = tooltipOptions()?.render;\n if (custom) return custom(event);\n const content = tooltipContent(model, event, yTicks);\n const fragment = doc.createDocumentFragment();\n const header = doc.createElement(\"div\");\n styleElement(header, {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n fontWeight: \"600\",\n marginBottom: \"4px\",\n color: \"var(--text-color, #1f2937)\",\n });\n if (content.titleColor)\n header.appendChild(swatch(doc, content.titleColor, \"dot\"));\n header.appendChild(doc.createTextNode(content.title));\n fragment.append(header);\n for (const row of content.rows) {\n const el = doc.createElement(\"div\");\n styleElement(el, { display: \"flex\", alignItems: \"center\", gap: \"8px\" });\n if (row.color) el.appendChild(swatch(doc, row.color, \"dot\"));\n const n = doc.createElement(\"span\");\n styleElement(n, {\n flex: \"1 1 auto\",\n color: \"var(--text-secondary-color, #6b7280)\",\n });\n n.textContent = row.name;\n const v = doc.createElement(\"span\");\n styleElement(v, {\n fontWeight: \"600\",\n fontVariantNumeric: \"tabular-nums\",\n marginLeft: \"12px\",\n });\n v.textContent = row.value;\n el.append(n, v);\n fragment.append(el);\n }\n return fragment;\n };\n\n const pooled = <T extends HTMLElement>(\n pool: T[],\n i: number,\n make: () => T,\n ) => {\n if (!pool[i]) {\n pool[i] = make();\n dom.hover.appendChild(pool[i]);\n }\n pool[i].style.display = \"block\";\n return pool[i];\n };\n\n function renderHover() {\n const sc = scales;\n let markerCount = 0;\n let highlightCount = 0;\n dom.crosshair.style.display = \"none\";\n if (hover && sc) {\n const { plot } = sc;\n dom.hover.style.width = `${dom.stage.clientWidth}px`;\n dom.hover.style.height = `${dom.stage.clientHeight}px`;\n if (showsCrosshair(model, hover.event, options.crosshair)) {\n const first = hover.event.items[0];\n const cx = sc.xToPx(first.x);\n if (cx >= plot.x && cx <= plot.x + plot.width) {\n styleElement(dom.crosshair, {\n display: \"block\",\n left: `${Math.round(cx)}px`,\n top: `${plot.y}px`,\n height: `${plot.height}px`,\n });\n }\n }\n for (const mark of hoverMarks(model, sc, hover.event)) {\n if (mark.kind === \"bar\") {\n const el = pooled(highlights, highlightCount++, () =>\n createBarHighlight(doc),\n );\n styleElement(el, {\n left: `${mark.x}px`,\n top: `${mark.y}px`,\n width: `${mark.width}px`,\n height: `${mark.height}px`,\n });\n continue;\n }\n const el = pooled(markers, markerCount++, () => createMarker(doc));\n styleElement(el, {\n left: `${mark.x}px`,\n top: `${mark.y}px`,\n width: `${mark.size}px`,\n height: `${mark.size}px`,\n background: mark.color,\n });\n }\n }\n for (let i = markerCount; i < markers.length; i++)\n markers[i].style.display = \"none\";\n for (let i = highlightCount; i < highlights.length; i++)\n highlights[i].style.display = \"none\";\n\n const tip = dom.tooltip;\n const content =\n hover && sc && tooltipOptions() && !drag?.moved && !pointDrag?.moved\n ? tooltipNode(hover.event)\n : null;\n if (!hover || content === null || content === \"\") {\n tip.style.display = \"none\";\n return;\n }\n if (typeof content === \"string\") {\n tip.textContent = content;\n tip.style.whiteSpace = \"pre\";\n } else {\n tip.replaceChildren(content);\n tip.style.whiteSpace = \"nowrap\";\n }\n tip.style.display = \"block\";\n const stageW = dom.stage.clientWidth;\n const stageH = dom.stage.clientHeight;\n const w = tip.offsetWidth;\n const h = tip.offsetHeight;\n let left = hover.anchorX + 16;\n if (left + w > stageW - 4) left = hover.anchorX - 16 - w;\n left = Math.max(4, Math.min(left, stageW - w - 4));\n const top = Math.max(4, Math.min(hover.anchorY - h / 2, stageH - h - 4));\n tip.style.transform = `translate(${Math.round(left)}px, ${Math.round(top)}px)`;\n }\n\n // ---------------------------------------------------------- interaction\n\n const setViewInternal = (next: ChartView, notify: boolean) => {\n const { base, minSpan } = model;\n view = {\n x: clampRange(next.x, base.x, minSpan.x),\n y: clampRange(next.y, base.y, minSpan.y),\n };\n zoomed = !sameRange(view.x, base.x) || !sameRange(view.y, base.y);\n const it = interaction();\n dom.stage.style.cursor = zoomed && it?.pan ? \"grab\" : \"\";\n if (notify) emit(\"zoom\", copyView(view));\n invalidate();\n };\n\n const zoomAt = (px: number, py: number, factor: number) => {\n const sc = scales;\n if (!sc) return;\n const next = copyView(view);\n if (model.zoom.x) next.x = zoomRange(view.x, sc.pxToX(px), factor);\n if (model.zoom.y) next.y = zoomRange(view.y, sc.pxToY(py), factor);\n setViewInternal(next, true);\n };\n\n const localPoint = (event: { clientX: number; clientY: number }) => {\n const rect = dom.stage.getBoundingClientRect();\n return { x: event.clientX - rect.left, y: event.clientY - rect.top };\n };\n\n const inPlot = (x: number, y: number) => {\n const p = scales?.plot;\n return (\n !!p && x >= p.x && x <= p.x + p.width && y >= p.y && y <= p.y + p.height\n );\n };\n\n const dataAt = (x: number, y: number) => {\n const sc = scales;\n if (!sc) return null;\n const { plot } = sc;\n const cx = Math.max(plot.x, Math.min(plot.x + plot.width, x));\n const cy = Math.max(plot.y, Math.min(plot.y + plot.height, y));\n return { x: sc.pxToX(cx), y: sc.pxToY(cy) };\n };\n\n const moveGhost = (x: number, y: number, color: string | null) => {\n if (color === null) {\n if (ghost) ghost.style.display = \"none\";\n return;\n }\n if (!ghost) {\n ghost = createMarker(doc);\n dom.hover.appendChild(ghost);\n }\n const s = model.series.find((series) => series.type === \"scatter\");\n const size = (s?.pointSize ?? 8) + 8;\n dom.hover.style.width = `${dom.stage.clientWidth}px`;\n dom.hover.style.height = `${dom.stage.clientHeight}px`;\n styleElement(ghost, {\n display: \"block\",\n left: `${x}px`,\n top: `${y}px`,\n width: `${size}px`,\n height: `${size}px`,\n background: color,\n });\n };\n\n const onPointerMove = (event: PointerEvent) => {\n const { x, y } = localPoint(event);\n if (pointDrag && pointDrag.id === event.pointerId) {\n if (\n !pointDrag.moved &&\n Math.hypot(x - pointDrag.x, y - pointDrag.y) > 3\n ) {\n pointDrag.moved = true;\n dom.stage.setPointerCapture?.(event.pointerId);\n dom.stage.style.cursor = \"grabbing\";\n }\n if (pointDrag.moved) {\n const at = dataAt(x, y);\n if (at) {\n moveGhost(x, y, pointDrag.item.color);\n renderHover();\n emit(\"drag\", { item: pointDrag.item, x: at.x, y: at.y });\n }\n }\n return;\n }\n if (drag && drag.id === event.pointerId) {\n const dx = x - drag.x;\n const dy = y - drag.y;\n if (!drag.moved && Math.hypot(dx, dy) > 3) {\n const it = interaction();\n if (zoomed && it?.pan) {\n drag.moved = true;\n dom.stage.setPointerCapture?.(event.pointerId);\n dom.stage.style.cursor = \"grabbing\";\n }\n }\n if (drag.moved && scales) {\n const next = copyView(drag.view);\n if (model.zoom.x)\n next.x = panRange(\n drag.view.x,\n -dx * scales.xPerPx * (model.x.reverse ? -1 : 1),\n );\n if (model.zoom.y)\n next.y = panRange(\n drag.view.y,\n dy * scales.yPerPx * (model.y.reverse ? -1 : 1),\n );\n setViewInternal(next, true);\n return;\n }\n }\n const event2 = hitAt(x, y);\n setHover(\n event2\n ? { event: event2, anchorX: x, anchorY: y, keyboard: false }\n : null,\n );\n if (!drag && interaction()?.dragPoints) {\n dom.stage.style.cursor = draggableAt(x, y)\n ? \"grab\"\n : zoomed && interaction()?.pan\n ? \"grab\"\n : \"\";\n }\n };\n\n const onPointerDown = (event: PointerEvent) => {\n if (event.button !== 0) return;\n const { x, y } = localPoint(event);\n if (!inPlot(x, y)) return;\n const draggable = draggableAt(x, y);\n if (draggable) {\n pointDrag = { id: event.pointerId, item: draggable, x, y, moved: false };\n return;\n }\n drag = { id: event.pointerId, x, y, view: copyView(view), moved: false };\n };\n\n const onPointerUp = (event: PointerEvent) => {\n if (pointDrag && pointDrag.id === event.pointerId) {\n const { item, moved } = pointDrag;\n pointDrag = null;\n if (dom.stage.hasPointerCapture?.(event.pointerId)) {\n dom.stage.releasePointerCapture(event.pointerId);\n }\n moveGhost(0, 0, null);\n const { x, y } = localPoint(event);\n dom.stage.style.cursor = draggableAt(x, y) ? \"grab\" : \"\";\n if (moved) {\n const at = dataAt(x, y);\n if (at && event.type !== \"pointercancel\")\n emit(\"drop\", { item, x: at.x, y: at.y });\n renderHover();\n } else {\n const hit = hitAt(x, y);\n if (hit) emit(\"click\", hit);\n }\n return;\n }\n if (!drag || drag.id !== event.pointerId) return;\n const moved = drag.moved;\n drag = null;\n if (dom.stage.hasPointerCapture?.(event.pointerId)) {\n dom.stage.releasePointerCapture(event.pointerId);\n }\n dom.stage.style.cursor = zoomed && interaction()?.pan ? \"grab\" : \"\";\n if (!moved) {\n const { x, y } = localPoint(event);\n const hit = hitAt(x, y);\n if (hit) emit(\"click\", hit);\n else if (event.type !== \"pointercancel\" && inPlot(x, y)) {\n const at = dataAt(x, y);\n if (at) emit(\"plotClick\", at);\n }\n } else {\n renderHover();\n }\n };\n\n const onPointerLeave = () => {\n if (!drag?.moved && !pointDrag?.moved) setHover(null);\n };\n\n const onWheel = (event: WheelEvent) => {\n const it = interaction();\n if (!it || it.zoom === false || (!model.zoom.x && !model.zoom.y)) return;\n const { x, y } = localPoint(event);\n if (!inPlot(x, y)) return;\n const modifier = event.ctrlKey || event.metaKey;\n if (it.wheel === \"always\" || modifier) {\n event.preventDefault();\n zoomAt(\n x,\n y,\n wheelFactor(\n event.deltaY,\n event.deltaMode,\n event.ctrlKey && !event.metaKey,\n ),\n );\n } else if (\n zoomed &&\n model.zoom.x &&\n scales &&\n Math.abs(event.deltaX) > Math.abs(event.deltaY)\n ) {\n event.preventDefault();\n const next = copyView(view);\n next.x = panRange(\n view.x,\n event.deltaX * scales.xPerPx * (model.x.reverse ? -1 : 1),\n );\n setViewInternal(next, true);\n }\n };\n\n const onDoubleClick = (event: MouseEvent) => {\n const { x, y } = localPoint(event);\n if (interaction() && zoomed && inPlot(x, y)) resetZoom();\n };\n\n /** Keyboard: moves along the first visible series (or the one in focus) */\n const moveFocus = (step: number) => {\n const sc = scales;\n if (!sc) return;\n const current = hover?.keyboard ? hover.event.items[0] : null;\n const series =\n (current && model.series[current.seriesIndex]) ??\n model.series.find((s) => !s.hidden && s.cols.count > 0);\n if (!series) return;\n const { x, y, count } = series.cols;\n let index: number;\n if (current) {\n index = current.index + step;\n } else {\n // first point inside the view\n index = series.cols.sorted ? lowerBound(x, count, view.x[0]) : 0;\n if (step < 0)\n index = series.cols.sorted\n ? lowerBound(x, count, view.x[1]) - 1\n : count - 1;\n }\n while (index >= 0 && index < count && !Number.isFinite(y[index]))\n index += step || 1;\n if (index < 0 || index >= count) return;\n // keep the point visible\n let current2 = sc;\n if (model.zoom.x && (x[index] < view.x[0] || x[index] > view.x[1])) {\n const span = view.x[1] - view.x[0];\n setViewInternal(\n { x: [x[index] - span / 2, x[index] + span / 2], y: view.y },\n true,\n );\n current2 = scales = createScales(\n sc.plot,\n view,\n model.x.reverse,\n model.y.reverse,\n );\n }\n const p = pointOf(series, index, current2);\n const leadItem = hoverItemOf(series, index);\n const others =\n model.tooltipMode === \"axis\" && series.type !== \"scatter\"\n ? (hitAt(p.px, p.py)?.items ?? []).filter(\n (it) => it.seriesIndex !== series.index,\n )\n : [];\n const event: ChartHoverEvent = {\n items: [leadItem, ...others],\n x: leadItem.x,\n xLabel: xTicks?.formatValue(leadItem.x) ?? String(leadItem.x),\n };\n setHover({ event, anchorX: p.px, anchorY: p.py, keyboard: true });\n const it = leadItem;\n dom.live.textContent = `${it.seriesName}: ${event.xLabel}, ${yTicks?.formatValue(it.y) ?? it.y}${it.label ? ` (${it.label})` : \"\"}`;\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (!interaction()?.keyboard) return;\n const center = () => {\n const p = scales?.plot;\n return p ? [p.x + p.width / 2, p.y + p.height / 2] : [0, 0];\n };\n switch (event.key) {\n case \"ArrowRight\":\n case \"ArrowLeft\":\n event.preventDefault();\n moveFocus((event.key === \"ArrowRight\") !== model.x.reverse ? 1 : -1);\n break;\n case \"+\":\n case \"=\": {\n if (!model.zoom.x && !model.zoom.y) return;\n event.preventDefault();\n const [cx, cy] = center();\n zoomAt(cx, cy, 0.8);\n break;\n }\n case \"-\":\n case \"_\": {\n if (!model.zoom.x && !model.zoom.y) return;\n event.preventDefault();\n const [cx, cy] = center();\n zoomAt(cx, cy, 1.25);\n break;\n }\n case \"0\":\n event.preventDefault();\n resetZoom();\n break;\n case \"Escape\":\n if (hover) {\n event.preventDefault();\n setHover(null);\n }\n break;\n default:\n break;\n }\n };\n\n const onFocus = () => {\n let visible: boolean;\n try {\n visible = dom.stage.matches(\":focus-visible\");\n } catch {\n visible = true;\n }\n if (visible)\n dom.stage.style.boxShadow = \"0 0 0 2px var(--primary-color, #4f46e5)\";\n };\n\n const onBlur = () => {\n dom.stage.style.boxShadow = \"\";\n if (hover?.keyboard) setHover(null);\n };\n\n const stage = dom.stage;\n stage.addEventListener(\"pointermove\", onPointerMove);\n stage.addEventListener(\"pointerdown\", onPointerDown);\n stage.addEventListener(\"pointerup\", onPointerUp);\n stage.addEventListener(\"pointercancel\", onPointerUp);\n stage.addEventListener(\"pointerleave\", onPointerLeave);\n stage.addEventListener(\"wheel\", onWheel, { passive: false });\n stage.addEventListener(\"dblclick\", onDoubleClick);\n stage.addEventListener(\"keydown\", onKeyDown);\n stage.addEventListener(\"focus\", onFocus);\n stage.addEventListener(\"blur\", onBlur);\n\n const resizeObserver =\n typeof ResizeObserver === \"function\"\n ? new ResizeObserver(() => invalidate())\n : null;\n resizeObserver?.observe(dom.stage);\n\n const refreshTheme = () => {\n if (destroyed) return;\n theme = readTheme(dom.root, options.palette);\n themeVersion++;\n rebuild();\n };\n const unwatchTheme = watchTheme(refreshTheme);\n\n // ------------------------------------------------------------- renderer\n\n const initRenderer = async (exclude: Set<ChartRendererKind> = new Set()) => {\n const token = ++rendererToken;\n const next = await createRenderer(\n options.renderer ?? \"auto\",\n () => createDataCanvas(doc),\n (kind) => {\n if (destroyed || renderer?.kind !== kind) return;\n renderer.destroy();\n renderer.canvas.remove();\n renderer = null;\n void initRenderer(new Set([...exclude, kind]));\n },\n exclude,\n );\n if (destroyed || token !== rendererToken) {\n next?.destroy();\n return;\n }\n if (renderer) {\n renderer.destroy();\n renderer.canvas.remove();\n }\n renderer = next;\n if (next) {\n dom.root.dataset.renderer = next.kind;\n dom.stage.insertBefore(next.canvas, dom.foreground);\n itemsDirty = true;\n emit(\"renderer\", next.kind);\n }\n resolveReady(next?.kind ?? null);\n invalidate();\n };\n\n // ------------------------------------------------------------------ api\n\n function resetZoom() {\n if (!zoomed) return;\n setViewInternal(copyView(model.base), true);\n }\n\n rebuild();\n void initRenderer();\n\n const instance: ChartInstance = {\n setOptions(next) {\n if (destroyed) return;\n const previous = options;\n options = next;\n if ((next.palette ?? []).join() !== (previous.palette ?? []).join()) {\n theme = readTheme(dom.root, next.palette);\n themeVersion++;\n }\n if ((next.renderer ?? \"auto\") !== (previous.renderer ?? \"auto\"))\n void initRenderer();\n rebuild();\n },\n resize() {\n invalidate();\n },\n resetZoom,\n getView: () => copyView(view),\n setView(next) {\n if (destroyed) return;\n setViewInternal({ x: next.x ?? view.x, y: next.y ?? view.y }, false);\n },\n getRenderer: () => renderer?.kind ?? null,\n getPlotRect() {\n const rect = plotRect();\n return rect\n ? { x: rect[0], y: rect[1], width: rect[2], height: rect[3] }\n : null;\n },\n toPixel(x, y) {\n if (!scales) return null;\n return {\n x: scales.xToPx(x) + dom.stage.offsetLeft,\n y: scales.yToPx(y) + dom.stage.offsetTop,\n };\n },\n fromPixel(x, y) {\n if (!scales) return null;\n return {\n x: scales.pxToX(x - dom.stage.offsetLeft),\n y: scales.pxToY(y - dom.stage.offsetTop),\n };\n },\n ready,\n refreshTheme,\n on(type, listener) {\n let set = listeners[type] as Set<typeof listener> | undefined;\n if (!set) {\n set = new Set();\n (listeners as Record<string, unknown>)[type] = set;\n }\n set.add(listener);\n return () => {\n set.delete(listener);\n };\n },\n destroy() {\n if (destroyed) return;\n destroyed = true;\n if (frameId) {\n if (win?.cancelAnimationFrame) win.cancelAnimationFrame(frameId);\n else clearTimeout(frameId);\n }\n resizeObserver?.disconnect();\n unwatchTheme();\n stage.removeEventListener(\"wheel\", onWheel);\n renderer?.destroy();\n renderer = null;\n dom.root.remove();\n for (const key of Object.keys(listeners)) {\n delete (listeners as Record<string, unknown>)[key];\n }\n },\n };\n return instance;\n};\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var e=e=>e<0?0:e>1?1:e,t=e=>{let t=e.slice(1);if(!/^[0-9a-f]+$/i.test(t))return null;let n=t.length===3||t.length===4;if(!n&&t.length!==6&&t.length!==8)return null;let r=e=>n?parseInt(t[e]+t[e],16)/255:parseInt(t.slice(e*2,e*2+2),16)/255,i=t.length===4||t.length===8;return[r(0),r(1),r(2),i?r(3):1]},n=(e,t)=>{let n=parseFloat(e);return Number.isNaN(n)?0:e.trim().endsWith(`%`)?n/100:n/t},r=e=>{let[t,n]=e.split(`/`),r=t.split(/[\s,]+/).filter(Boolean);return n!==void 0&&r.push(n.trim()),r},i=i=>{let a=i.trim().toLowerCase();if(a.startsWith(`#`))return t(a);if(a===`transparent`)return[0,0,0,0];let o=/^rgba?\((.*)\)$/.exec(a);if(o){let t=r(o[1]);return t.length<3?null:[e(n(t[0],255)),e(n(t[1],255)),e(n(t[2],255)),t[3]===void 0?1:e(n(t[3],1))]}if(o=/^color\(srgb\s+(.*)\)$/.exec(a),o){let t=r(o[1]);return t.length<3?null:[e(n(t[0],1)),e(n(t[1],1)),e(n(t[2],1)),t[3]===void 0?1:e(n(t[3],1))]}return null},a,o=e=>{if(typeof document>`u`)return null;if(a===void 0){let e=document.createElement(`canvas`);e.width=1,e.height=1,a=e.getContext(`2d`,{willReadFrequently:!0})}let t=a;if(!t)return null;t.clearRect(0,0,1,1),t.fillStyle=`#000`,t.fillStyle=e,t.fillRect(0,0,1,1);let[n,r,i,o]=t.getImageData(0,0,1,1).data;return o===0?[0,0,0,0]:[n/255,r/255,i/255,o/255]},s=(e,t,n=[.4,.4,.4,1])=>{let r=i(e);if(r)return r;let a=e;if(t&&typeof getComputedStyle==`function`){let n=t.ownerDocument.createElement(`span`);n.style.display=`none`,n.style.color=e,t.appendChild(n),a=getComputedStyle(n).color||e,n.remove();let r=i(a);if(r)return r}return o(a)??n},c=(e,t=1)=>`rgba(${Math.round(e[0]*255)}, ${Math.round(e[1]*255)}, ${Math.round(e[2]*255)}, ${+(e[3]*t).toFixed(3)})`,
|
|
1
|
+
var e=e=>e<0?0:e>1?1:e,t=e=>{let t=e.slice(1);if(!/^[0-9a-f]+$/i.test(t))return null;let n=t.length===3||t.length===4;if(!n&&t.length!==6&&t.length!==8)return null;let r=e=>n?parseInt(t[e]+t[e],16)/255:parseInt(t.slice(e*2,e*2+2),16)/255,i=t.length===4||t.length===8;return[r(0),r(1),r(2),i?r(3):1]},n=(e,t)=>{let n=parseFloat(e);return Number.isNaN(n)?0:e.trim().endsWith(`%`)?n/100:n/t},r=e=>{let[t,n]=e.split(`/`),r=t.split(/[\s,]+/).filter(Boolean);return n!==void 0&&r.push(n.trim()),r},i=i=>{let a=i.trim().toLowerCase();if(a.startsWith(`#`))return t(a);if(a===`transparent`)return[0,0,0,0];let o=/^rgba?\((.*)\)$/.exec(a);if(o){let t=r(o[1]);return t.length<3?null:[e(n(t[0],255)),e(n(t[1],255)),e(n(t[2],255)),t[3]===void 0?1:e(n(t[3],1))]}if(o=/^color\(srgb\s+(.*)\)$/.exec(a),o){let t=r(o[1]);return t.length<3?null:[e(n(t[0],1)),e(n(t[1],1)),e(n(t[2],1)),t[3]===void 0?1:e(n(t[3],1))]}return null},a,o=e=>{if(typeof document>`u`)return null;if(a===void 0){let e=document.createElement(`canvas`);e.width=1,e.height=1,a=e.getContext(`2d`,{willReadFrequently:!0})}let t=a;if(!t)return null;t.clearRect(0,0,1,1),t.fillStyle=`#000`,t.fillStyle=e,t.fillRect(0,0,1,1);let[n,r,i,o]=t.getImageData(0,0,1,1).data;return o===0?[0,0,0,0]:[n/255,r/255,i/255,o/255]},s=(e,t,n=[.4,.4,.4,1])=>{let r=i(e);if(r)return r;let a=e;if(t&&typeof getComputedStyle==`function`){let n=t.ownerDocument.createElement(`span`);n.style.display=`none`,n.style.color=e,t.appendChild(n),a=getComputedStyle(n).color||e,n.remove();let r=i(a);if(r)return r}return o(a)??l(e,{},n)},c=e=>{let t=/^var\(\s*(--[\w-]+)\s*(?:,([\s\S]*))?\)$/.exec(e.trim());if(!t)return null;let n=t[2]?.trim();return{name:t[1],...n?{fallback:n}:{}}},l=(e,t={},n=[.4,.4,.4,1],r=0)=>{let a=i(e);if(a)return a;let o=r<8?c(e):null;if(o){let e=t[o.name];if(e)return l(e,t,n,r+1);if(o.fallback)return l(o.fallback,t,n,r+1)}return u[e.trim().toLowerCase()]??n},u={black:[0,0,0,1],white:[1,1,1,1],red:[1,0,0,1],green:[0,128/255,0,1],blue:[0,0,1,1],gray:[128/255,128/255,128/255,1],grey:[128/255,128/255,128/255,1],orange:[1,165/255,0,1]},d=e=>(t,n)=>s(t,e,n),f=(e,t=1)=>`rgba(${Math.round(e[0]*255)}, ${Math.round(e[1]*255)}, ${Math.round(e[2]*255)}, ${+(e[3]*t).toFixed(3)})`,p=t=>(Math.round(e(t[3])*255)<<24|Math.round(e(t[2])*255)<<16|Math.round(e(t[1])*255)<<8|Math.round(e(t[0])*255))>>>0,m=(e,t,n)=>[e[0]+(t[0]-e[0])*n,e[1]+(t[1]-e[1])*n,e[2]+(t[2]-e[2])*n,e[3]+(t[3]-e[3])*n];exports.domColorResolver=d,exports.mix=m,exports.packColor=p,exports.parseColor=i,exports.resolveColor=s,exports.resolveStaticColor=l,exports.toCss=f;
|
|
2
2
|
//# sourceMappingURL=color.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"color.cjs","names":["clamp01","v","parseHex","h","hex","expand","channel","i","hasAlpha","parseComponent","part","scale","splitArgs","main","alpha","args","parts","parseColor","value","input","match","probeContext","parseWithCanvas","canvas","ctx","r","g","b","a","resolveColor","direct","computed","element","probe","parsed","fallback","toCss","c","packColor","mix","t"],"sources":["../../../../charts/src/engine/color.ts"],"sourcesContent":["// Color parsing to straight (non-premultiplied) RGBA in 0-1.\n\nexport type Rgba = readonly [number, number, number, number];\n\nconst clamp01 = (v: number) => (v < 0 ? 0 : v > 1 ? 1 : v);\n\nconst parseHex = (hex: string): Rgba | null => {\n const h = hex.slice(1);\n if (!/^[0-9a-f]+$/i.test(h)) return null;\n const expand = h.length === 3 || h.length === 4;\n if (!expand && h.length !== 6 && h.length !== 8) return null;\n const channel = (i: number) =>\n expand\n ? parseInt(h[i] + h[i], 16) / 255\n : parseInt(h.slice(i * 2, i * 2 + 2), 16) / 255;\n const hasAlpha = h.length === 4 || h.length === 8;\n return [channel(0), channel(1), channel(2), hasAlpha ? channel(3) : 1];\n};\n\nconst parseComponent = (part: string, scale: number): number => {\n const v = parseFloat(part);\n if (Number.isNaN(v)) return 0;\n return part.trim().endsWith(\"%\") ? v / 100 : v / scale;\n};\n\n/** Splits `a b c / d` or `a, b, c, d` */\nconst splitArgs = (args: string): string[] => {\n const [main, alpha] = args.split(\"/\");\n const parts = main.split(/[\\s,]+/).filter(Boolean);\n if (alpha !== undefined) parts.push(alpha.trim());\n return parts;\n};\n\n/**\n * Parses the color syntaxes returned by `getComputedStyle` (`rgb()`,\n * `rgba()`, `color(srgb ...)`) and hex colors; `null` for anything else\n * (named colors, `oklch()`, ... are resolved by `resolveColor`).\n */\nexport const parseColor = (input: string): Rgba | null => {\n const value = input.trim().toLowerCase();\n if (value.startsWith(\"#\")) return parseHex(value);\n if (value === \"transparent\") return [0, 0, 0, 0];\n let match = /^rgba?\\((.*)\\)$/.exec(value);\n if (match) {\n const parts = splitArgs(match[1]);\n if (parts.length < 3) return null;\n return [\n clamp01(parseComponent(parts[0], 255)),\n clamp01(parseComponent(parts[1], 255)),\n clamp01(parseComponent(parts[2], 255)),\n parts[3] === undefined ? 1 : clamp01(parseComponent(parts[3], 1)),\n ];\n }\n match = /^color\\(srgb\\s+(.*)\\)$/.exec(value);\n if (match) {\n const parts = splitArgs(match[1]);\n if (parts.length < 3) return null;\n return [\n clamp01(parseComponent(parts[0], 1)),\n clamp01(parseComponent(parts[1], 1)),\n clamp01(parseComponent(parts[2], 1)),\n parts[3] === undefined ? 1 : clamp01(parseComponent(parts[3], 1)),\n ];\n }\n return null;\n};\n\nlet probeContext: CanvasRenderingContext2D | null | undefined;\n\n/** Lets the browser convert any CSS color (named, hsl, oklch, color-mix, ...) */\nconst parseWithCanvas = (value: string): Rgba | null => {\n if (typeof document === \"undefined\") return null;\n if (probeContext === undefined) {\n const canvas = document.createElement(\"canvas\");\n canvas.width = 1;\n canvas.height = 1;\n probeContext = canvas.getContext(\"2d\", { willReadFrequently: true });\n }\n const ctx = probeContext;\n if (!ctx) return null;\n ctx.clearRect(0, 0, 1, 1);\n ctx.fillStyle = \"#000\";\n ctx.fillStyle = value;\n ctx.fillRect(0, 0, 1, 1);\n const [r, g, b, a] = ctx.getImageData(0, 0, 1, 1).data;\n if (a === 0) return [0, 0, 0, 0];\n // getImageData returns premultiplied-then-unpremultiplied values\n return [r / 255, g / 255, b / 255, a / 255];\n};\n\n/**\n * Resolves a CSS color in the context of `element`: `var(--x)`,\n * `color-mix()`, named colors, ... Falls back to `fallback` when the color\n * cannot be resolved (e.g. outside a browser).\n */\nexport const resolveColor = (\n value: string,\n element: Element | null,\n fallback: Rgba = [0.4, 0.4, 0.4, 1],\n): Rgba => {\n const direct = parseColor(value);\n if (direct) return direct;\n let computed = value;\n if (element && typeof getComputedStyle === \"function\") {\n const probe = element.ownerDocument.createElement(\"span\");\n probe.style.display = \"none\";\n probe.style.color = value;\n element.appendChild(probe);\n computed = getComputedStyle(probe).color || value;\n probe.remove();\n const parsed = parseColor(computed);\n if (parsed) return parsed;\n }\n return parseWithCanvas(computed) ?? fallback;\n};\n\nconst hex2 = (v: number) =>\n Math.round(clamp01(v) * 255)\n .toString(16)\n .padStart(2, \"0\");\n\n/** `rgba()` string usable by Canvas2D and the DOM */\nexport const toCss = (c: Rgba, alpha = 1): string =>\n `rgba(${Math.round(c[0] * 255)}, ${Math.round(c[1] * 255)}, ${Math.round(c[2] * 255)}, ${+(c[3] * alpha).toFixed(3)})`;\n\n/** `#rrggbb` (alpha dropped) */\nexport const toHex = (c: Rgba): string =>\n `#${hex2(c[0])}${hex2(c[1])}${hex2(c[2])}`;\n\n/** Packs a color as little-endian `unorm8x4` (r in the lowest byte) */\nexport const packColor = (c: Rgba): number =>\n ((Math.round(clamp01(c[3]) * 255) << 24) |\n (Math.round(clamp01(c[2]) * 255) << 16) |\n (Math.round(clamp01(c[1]) * 255) << 8) |\n Math.round(clamp01(c[0]) * 255)) >>>\n 0;\n\n/** Mixes two colors (t = 0 -> a, 1 -> b) */\nexport const mix = (a: Rgba, b: Rgba, t: number): Rgba => [\n a[0] + (b[0] - a[0]) * t,\n a[1] + (b[1] - a[1]) * t,\n a[2] + (b[2] - a[2]) * t,\n a[3] + (b[3] - a[3]) * t,\n];\n\n/** Relative luminance (sRGB approximation) */\nexport const luminance = (c: Rgba): number =>\n 0.2126 * c[0] + 0.7152 * c[1] + 0.0722 * c[2];\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"color.cjs","names":["clamp01","v","parseHex","h","hex","expand","channel","i","hasAlpha","parseComponent","part","scale","splitArgs","main","alpha","args","parts","parseColor","value","input","match","probeContext","parseWithCanvas","canvas","ctx","r","g","b","a","resolveColor","direct","computed","element","probe","parsed","resolveStaticColor","fallback","parseVar","ref","depth","defined","variables","NAMED","domColorResolver","toCss","c","packColor","mix","t"],"sources":["../../../../charts/src/engine/color.ts"],"sourcesContent":["// Color parsing to straight (non-premultiplied) RGBA in 0-1.\n\nexport type Rgba = readonly [number, number, number, number];\n\nconst clamp01 = (v: number) => (v < 0 ? 0 : v > 1 ? 1 : v);\n\nconst parseHex = (hex: string): Rgba | null => {\n const h = hex.slice(1);\n if (!/^[0-9a-f]+$/i.test(h)) return null;\n const expand = h.length === 3 || h.length === 4;\n if (!expand && h.length !== 6 && h.length !== 8) return null;\n const channel = (i: number) =>\n expand\n ? parseInt(h[i] + h[i], 16) / 255\n : parseInt(h.slice(i * 2, i * 2 + 2), 16) / 255;\n const hasAlpha = h.length === 4 || h.length === 8;\n return [channel(0), channel(1), channel(2), hasAlpha ? channel(3) : 1];\n};\n\nconst parseComponent = (part: string, scale: number): number => {\n const v = parseFloat(part);\n if (Number.isNaN(v)) return 0;\n return part.trim().endsWith(\"%\") ? v / 100 : v / scale;\n};\n\n/** Splits `a b c / d` or `a, b, c, d` */\nconst splitArgs = (args: string): string[] => {\n const [main, alpha] = args.split(\"/\");\n const parts = main.split(/[\\s,]+/).filter(Boolean);\n if (alpha !== undefined) parts.push(alpha.trim());\n return parts;\n};\n\n/**\n * Parses the color syntaxes returned by `getComputedStyle` (`rgb()`,\n * `rgba()`, `color(srgb ...)`) and hex colors; `null` for anything else\n * (named colors, `oklch()`, ... are resolved by `resolveColor`).\n */\nexport const parseColor = (input: string): Rgba | null => {\n const value = input.trim().toLowerCase();\n if (value.startsWith(\"#\")) return parseHex(value);\n if (value === \"transparent\") return [0, 0, 0, 0];\n let match = /^rgba?\\((.*)\\)$/.exec(value);\n if (match) {\n const parts = splitArgs(match[1]);\n if (parts.length < 3) return null;\n return [\n clamp01(parseComponent(parts[0], 255)),\n clamp01(parseComponent(parts[1], 255)),\n clamp01(parseComponent(parts[2], 255)),\n parts[3] === undefined ? 1 : clamp01(parseComponent(parts[3], 1)),\n ];\n }\n match = /^color\\(srgb\\s+(.*)\\)$/.exec(value);\n if (match) {\n const parts = splitArgs(match[1]);\n if (parts.length < 3) return null;\n return [\n clamp01(parseComponent(parts[0], 1)),\n clamp01(parseComponent(parts[1], 1)),\n clamp01(parseComponent(parts[2], 1)),\n parts[3] === undefined ? 1 : clamp01(parseComponent(parts[3], 1)),\n ];\n }\n return null;\n};\n\nlet probeContext: CanvasRenderingContext2D | null | undefined;\n\n/** Lets the browser convert any CSS color (named, hsl, oklch, color-mix, ...) */\nconst parseWithCanvas = (value: string): Rgba | null => {\n if (typeof document === \"undefined\") return null;\n if (probeContext === undefined) {\n const canvas = document.createElement(\"canvas\");\n canvas.width = 1;\n canvas.height = 1;\n probeContext = canvas.getContext(\"2d\", { willReadFrequently: true });\n }\n const ctx = probeContext;\n if (!ctx) return null;\n ctx.clearRect(0, 0, 1, 1);\n ctx.fillStyle = \"#000\";\n ctx.fillStyle = value;\n ctx.fillRect(0, 0, 1, 1);\n const [r, g, b, a] = ctx.getImageData(0, 0, 1, 1).data;\n if (a === 0) return [0, 0, 0, 0];\n // getImageData returns premultiplied-then-unpremultiplied values\n return [r / 255, g / 255, b / 255, a / 255];\n};\n\n/**\n * Resolves a CSS color in the context of `element`: `var(--x)`,\n * `color-mix()`, named colors, ... Falls back to `fallback` when the color\n * cannot be resolved (e.g. outside a browser).\n */\nexport const resolveColor = (\n value: string,\n element: Element | null,\n fallback: Rgba = [0.4, 0.4, 0.4, 1],\n): Rgba => {\n const direct = parseColor(value);\n if (direct) return direct;\n let computed = value;\n if (element && typeof getComputedStyle === \"function\") {\n const probe = element.ownerDocument.createElement(\"span\");\n probe.style.display = \"none\";\n probe.style.color = value;\n element.appendChild(probe);\n computed = getComputedStyle(probe).color || value;\n probe.remove();\n const parsed = parseColor(computed);\n if (parsed) return parsed;\n }\n return parseWithCanvas(computed) ?? resolveStaticColor(value, {}, fallback);\n};\n\n/** Resolves a color to RGBA, falling back to `fallback` */\nexport type ColorResolver = (value: string, fallback: Rgba) => Rgba;\n\n/** Splits the arguments of `var(--name, fallback)` (the fallback may contain commas) */\nconst parseVar = (\n value: string,\n): { name: string; fallback?: string } | null => {\n const match = /^var\\(\\s*(--[\\w-]+)\\s*(?:,([\\s\\S]*))?\\)$/.exec(value.trim());\n if (!match) return null;\n const fallback = match[2]?.trim();\n return { name: match[1], ...(fallback ? { fallback } : {}) };\n};\n\n/**\n * Resolves a color without a DOM (mini-programs, React Native, workers):\n * hex, `rgb()`, `transparent` and `var(--name, fallback)` looked up in\n * `variables` (nested fallbacks included).\n */\nexport const resolveStaticColor = (\n value: string,\n variables: Readonly<Record<string, string>> = {},\n fallback: Rgba = [0.4, 0.4, 0.4, 1],\n depth = 0,\n): Rgba => {\n const direct = parseColor(value);\n if (direct) return direct;\n const ref = depth < 8 ? parseVar(value) : null;\n if (ref) {\n const defined = variables[ref.name];\n if (defined)\n return resolveStaticColor(defined, variables, fallback, depth + 1);\n if (ref.fallback)\n return resolveStaticColor(ref.fallback, variables, fallback, depth + 1);\n }\n return NAMED[value.trim().toLowerCase()] ?? fallback;\n};\n\nconst NAMED: Record<string, Rgba> = {\n black: [0, 0, 0, 1],\n white: [1, 1, 1, 1],\n red: [1, 0, 0, 1],\n green: [0, 128 / 255, 0, 1],\n blue: [0, 0, 1, 1],\n gray: [128 / 255, 128 / 255, 128 / 255, 1],\n grey: [128 / 255, 128 / 255, 128 / 255, 1],\n orange: [1, 165 / 255, 0, 1],\n};\n\n/** Resolver of the DOM: CSS variables and any CSS color syntax of `element` */\nexport const domColorResolver =\n (element: Element | null): ColorResolver =>\n (value, fallback) =>\n resolveColor(value, element, fallback);\n\nconst hex2 = (v: number) =>\n Math.round(clamp01(v) * 255)\n .toString(16)\n .padStart(2, \"0\");\n\n/** `rgba()` string usable by Canvas2D and the DOM */\nexport const toCss = (c: Rgba, alpha = 1): string =>\n `rgba(${Math.round(c[0] * 255)}, ${Math.round(c[1] * 255)}, ${Math.round(c[2] * 255)}, ${+(c[3] * alpha).toFixed(3)})`;\n\n/** `#rrggbb` (alpha dropped) */\nexport const toHex = (c: Rgba): string =>\n `#${hex2(c[0])}${hex2(c[1])}${hex2(c[2])}`;\n\n/** Packs a color as little-endian `unorm8x4` (r in the lowest byte) */\nexport const packColor = (c: Rgba): number =>\n ((Math.round(clamp01(c[3]) * 255) << 24) |\n (Math.round(clamp01(c[2]) * 255) << 16) |\n (Math.round(clamp01(c[1]) * 255) << 8) |\n Math.round(clamp01(c[0]) * 255)) >>>\n 0;\n\n/** Mixes two colors (t = 0 -> a, 1 -> b) */\nexport const mix = (a: Rgba, b: Rgba, t: number): Rgba => [\n a[0] + (b[0] - a[0]) * t,\n a[1] + (b[1] - a[1]) * t,\n a[2] + (b[2] - a[2]) * t,\n a[3] + (b[3] - a[3]) * t,\n];\n\n/** Relative luminance (sRGB approximation) */\nexport const luminance = (c: Rgba): number =>\n 0.2126 * c[0] + 0.7152 * c[1] + 0.0722 * c[2];\n"],"mappings":"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"}
|
|
@@ -11,6 +11,16 @@ export declare const parseColor: (input: string) => Rgba | null;
|
|
|
11
11
|
* cannot be resolved (e.g. outside a browser).
|
|
12
12
|
*/
|
|
13
13
|
export declare const resolveColor: (value: string, element: Element | null, fallback?: Rgba) => Rgba;
|
|
14
|
+
/** Resolves a color to RGBA, falling back to `fallback` */
|
|
15
|
+
export type ColorResolver = (value: string, fallback: Rgba) => Rgba;
|
|
16
|
+
/**
|
|
17
|
+
* Resolves a color without a DOM (mini-programs, React Native, workers):
|
|
18
|
+
* hex, `rgb()`, `transparent` and `var(--name, fallback)` looked up in
|
|
19
|
+
* `variables` (nested fallbacks included).
|
|
20
|
+
*/
|
|
21
|
+
export declare const resolveStaticColor: (value: string, variables?: Readonly<Record<string, string>>, fallback?: Rgba, depth?: number) => Rgba;
|
|
22
|
+
/** Resolver of the DOM: CSS variables and any CSS color syntax of `element` */
|
|
23
|
+
export declare const domColorResolver: (element: Element | null) => ColorResolver;
|
|
14
24
|
/** `rgba()` string usable by Canvas2D and the DOM */
|
|
15
25
|
export declare const toCss: (c: Rgba, alpha?: number) => string;
|
|
16
26
|
/** `#rrggbb` (alpha dropped) */
|
|
@@ -11,6 +11,16 @@ export declare const parseColor: (input: string) => Rgba | null;
|
|
|
11
11
|
* cannot be resolved (e.g. outside a browser).
|
|
12
12
|
*/
|
|
13
13
|
export declare const resolveColor: (value: string, element: Element | null, fallback?: Rgba) => Rgba;
|
|
14
|
+
/** Resolves a color to RGBA, falling back to `fallback` */
|
|
15
|
+
export type ColorResolver = (value: string, fallback: Rgba) => Rgba;
|
|
16
|
+
/**
|
|
17
|
+
* Resolves a color without a DOM (mini-programs, React Native, workers):
|
|
18
|
+
* hex, `rgb()`, `transparent` and `var(--name, fallback)` looked up in
|
|
19
|
+
* `variables` (nested fallbacks included).
|
|
20
|
+
*/
|
|
21
|
+
export declare const resolveStaticColor: (value: string, variables?: Readonly<Record<string, string>>, fallback?: Rgba, depth?: number) => Rgba;
|
|
22
|
+
/** Resolver of the DOM: CSS variables and any CSS color syntax of `element` */
|
|
23
|
+
export declare const domColorResolver: (element: Element | null) => ColorResolver;
|
|
14
24
|
/** `rgba()` string usable by Canvas2D and the DOM */
|
|
15
25
|
export declare const toCss: (c: Rgba, alpha?: number) => string;
|
|
16
26
|
/** `#rrggbb` (alpha dropped) */
|
|
@@ -82,14 +82,86 @@ var e = (e) => e < 0 ? 0 : e > 1 ? 1 : e, t = (e) => {
|
|
|
82
82
|
let r = i(a);
|
|
83
83
|
if (r) return r;
|
|
84
84
|
}
|
|
85
|
-
return o(a) ?? n;
|
|
86
|
-
}, c = (e
|
|
85
|
+
return o(a) ?? l(e, {}, n);
|
|
86
|
+
}, c = (e) => {
|
|
87
|
+
let t = /^var\(\s*(--[\w-]+)\s*(?:,([\s\S]*))?\)$/.exec(e.trim());
|
|
88
|
+
if (!t) return null;
|
|
89
|
+
let n = t[2]?.trim();
|
|
90
|
+
return {
|
|
91
|
+
name: t[1],
|
|
92
|
+
...n ? { fallback: n } : {}
|
|
93
|
+
};
|
|
94
|
+
}, l = (e, t = {}, n = [
|
|
95
|
+
.4,
|
|
96
|
+
.4,
|
|
97
|
+
.4,
|
|
98
|
+
1
|
|
99
|
+
], r = 0) => {
|
|
100
|
+
let a = i(e);
|
|
101
|
+
if (a) return a;
|
|
102
|
+
let o = r < 8 ? c(e) : null;
|
|
103
|
+
if (o) {
|
|
104
|
+
let e = t[o.name];
|
|
105
|
+
if (e) return l(e, t, n, r + 1);
|
|
106
|
+
if (o.fallback) return l(o.fallback, t, n, r + 1);
|
|
107
|
+
}
|
|
108
|
+
return u[e.trim().toLowerCase()] ?? n;
|
|
109
|
+
}, u = {
|
|
110
|
+
black: [
|
|
111
|
+
0,
|
|
112
|
+
0,
|
|
113
|
+
0,
|
|
114
|
+
1
|
|
115
|
+
],
|
|
116
|
+
white: [
|
|
117
|
+
1,
|
|
118
|
+
1,
|
|
119
|
+
1,
|
|
120
|
+
1
|
|
121
|
+
],
|
|
122
|
+
red: [
|
|
123
|
+
1,
|
|
124
|
+
0,
|
|
125
|
+
0,
|
|
126
|
+
1
|
|
127
|
+
],
|
|
128
|
+
green: [
|
|
129
|
+
0,
|
|
130
|
+
128 / 255,
|
|
131
|
+
0,
|
|
132
|
+
1
|
|
133
|
+
],
|
|
134
|
+
blue: [
|
|
135
|
+
0,
|
|
136
|
+
0,
|
|
137
|
+
1,
|
|
138
|
+
1
|
|
139
|
+
],
|
|
140
|
+
gray: [
|
|
141
|
+
128 / 255,
|
|
142
|
+
128 / 255,
|
|
143
|
+
128 / 255,
|
|
144
|
+
1
|
|
145
|
+
],
|
|
146
|
+
grey: [
|
|
147
|
+
128 / 255,
|
|
148
|
+
128 / 255,
|
|
149
|
+
128 / 255,
|
|
150
|
+
1
|
|
151
|
+
],
|
|
152
|
+
orange: [
|
|
153
|
+
1,
|
|
154
|
+
165 / 255,
|
|
155
|
+
0,
|
|
156
|
+
1
|
|
157
|
+
]
|
|
158
|
+
}, d = (e) => (t, n) => s(t, e, n), f = (e, t = 1) => `rgba(${Math.round(e[0] * 255)}, ${Math.round(e[1] * 255)}, ${Math.round(e[2] * 255)}, ${+(e[3] * t).toFixed(3)})`, p = (t) => (Math.round(e(t[3]) * 255) << 24 | Math.round(e(t[2]) * 255) << 16 | Math.round(e(t[1]) * 255) << 8 | Math.round(e(t[0]) * 255)) >>> 0, m = (e, t, n) => [
|
|
87
159
|
e[0] + (t[0] - e[0]) * n,
|
|
88
160
|
e[1] + (t[1] - e[1]) * n,
|
|
89
161
|
e[2] + (t[2] - e[2]) * n,
|
|
90
162
|
e[3] + (t[3] - e[3]) * n
|
|
91
163
|
];
|
|
92
164
|
//#endregion
|
|
93
|
-
export {
|
|
165
|
+
export { d as domColorResolver, m as mix, p as packColor, i as parseColor, s as resolveColor, l as resolveStaticColor, f as toCss };
|
|
94
166
|
|
|
95
167
|
//# sourceMappingURL=color.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"color.js","names":["clamp01","v","parseHex","h","hex","expand","channel","i","hasAlpha","parseComponent","part","scale","splitArgs","main","alpha","args","parts","parseColor","value","input","match","probeContext","parseWithCanvas","canvas","ctx","r","g","b","a","resolveColor","direct","computed","element","probe","parsed","fallback","toCss","c","packColor","mix","t"],"sources":["../../../../charts/src/engine/color.ts"],"sourcesContent":["// Color parsing to straight (non-premultiplied) RGBA in 0-1.\n\nexport type Rgba = readonly [number, number, number, number];\n\nconst clamp01 = (v: number) => (v < 0 ? 0 : v > 1 ? 1 : v);\n\nconst parseHex = (hex: string): Rgba | null => {\n const h = hex.slice(1);\n if (!/^[0-9a-f]+$/i.test(h)) return null;\n const expand = h.length === 3 || h.length === 4;\n if (!expand && h.length !== 6 && h.length !== 8) return null;\n const channel = (i: number) =>\n expand\n ? parseInt(h[i] + h[i], 16) / 255\n : parseInt(h.slice(i * 2, i * 2 + 2), 16) / 255;\n const hasAlpha = h.length === 4 || h.length === 8;\n return [channel(0), channel(1), channel(2), hasAlpha ? channel(3) : 1];\n};\n\nconst parseComponent = (part: string, scale: number): number => {\n const v = parseFloat(part);\n if (Number.isNaN(v)) return 0;\n return part.trim().endsWith(\"%\") ? v / 100 : v / scale;\n};\n\n/** Splits `a b c / d` or `a, b, c, d` */\nconst splitArgs = (args: string): string[] => {\n const [main, alpha] = args.split(\"/\");\n const parts = main.split(/[\\s,]+/).filter(Boolean);\n if (alpha !== undefined) parts.push(alpha.trim());\n return parts;\n};\n\n/**\n * Parses the color syntaxes returned by `getComputedStyle` (`rgb()`,\n * `rgba()`, `color(srgb ...)`) and hex colors; `null` for anything else\n * (named colors, `oklch()`, ... are resolved by `resolveColor`).\n */\nexport const parseColor = (input: string): Rgba | null => {\n const value = input.trim().toLowerCase();\n if (value.startsWith(\"#\")) return parseHex(value);\n if (value === \"transparent\") return [0, 0, 0, 0];\n let match = /^rgba?\\((.*)\\)$/.exec(value);\n if (match) {\n const parts = splitArgs(match[1]);\n if (parts.length < 3) return null;\n return [\n clamp01(parseComponent(parts[0], 255)),\n clamp01(parseComponent(parts[1], 255)),\n clamp01(parseComponent(parts[2], 255)),\n parts[3] === undefined ? 1 : clamp01(parseComponent(parts[3], 1)),\n ];\n }\n match = /^color\\(srgb\\s+(.*)\\)$/.exec(value);\n if (match) {\n const parts = splitArgs(match[1]);\n if (parts.length < 3) return null;\n return [\n clamp01(parseComponent(parts[0], 1)),\n clamp01(parseComponent(parts[1], 1)),\n clamp01(parseComponent(parts[2], 1)),\n parts[3] === undefined ? 1 : clamp01(parseComponent(parts[3], 1)),\n ];\n }\n return null;\n};\n\nlet probeContext: CanvasRenderingContext2D | null | undefined;\n\n/** Lets the browser convert any CSS color (named, hsl, oklch, color-mix, ...) */\nconst parseWithCanvas = (value: string): Rgba | null => {\n if (typeof document === \"undefined\") return null;\n if (probeContext === undefined) {\n const canvas = document.createElement(\"canvas\");\n canvas.width = 1;\n canvas.height = 1;\n probeContext = canvas.getContext(\"2d\", { willReadFrequently: true });\n }\n const ctx = probeContext;\n if (!ctx) return null;\n ctx.clearRect(0, 0, 1, 1);\n ctx.fillStyle = \"#000\";\n ctx.fillStyle = value;\n ctx.fillRect(0, 0, 1, 1);\n const [r, g, b, a] = ctx.getImageData(0, 0, 1, 1).data;\n if (a === 0) return [0, 0, 0, 0];\n // getImageData returns premultiplied-then-unpremultiplied values\n return [r / 255, g / 255, b / 255, a / 255];\n};\n\n/**\n * Resolves a CSS color in the context of `element`: `var(--x)`,\n * `color-mix()`, named colors, ... Falls back to `fallback` when the color\n * cannot be resolved (e.g. outside a browser).\n */\nexport const resolveColor = (\n value: string,\n element: Element | null,\n fallback: Rgba = [0.4, 0.4, 0.4, 1],\n): Rgba => {\n const direct = parseColor(value);\n if (direct) return direct;\n let computed = value;\n if (element && typeof getComputedStyle === \"function\") {\n const probe = element.ownerDocument.createElement(\"span\");\n probe.style.display = \"none\";\n probe.style.color = value;\n element.appendChild(probe);\n computed = getComputedStyle(probe).color || value;\n probe.remove();\n const parsed = parseColor(computed);\n if (parsed) return parsed;\n }\n return parseWithCanvas(computed) ?? fallback;\n};\n\nconst hex2 = (v: number) =>\n Math.round(clamp01(v) * 255)\n .toString(16)\n .padStart(2, \"0\");\n\n/** `rgba()` string usable by Canvas2D and the DOM */\nexport const toCss = (c: Rgba, alpha = 1): string =>\n `rgba(${Math.round(c[0] * 255)}, ${Math.round(c[1] * 255)}, ${Math.round(c[2] * 255)}, ${+(c[3] * alpha).toFixed(3)})`;\n\n/** `#rrggbb` (alpha dropped) */\nexport const toHex = (c: Rgba): string =>\n `#${hex2(c[0])}${hex2(c[1])}${hex2(c[2])}`;\n\n/** Packs a color as little-endian `unorm8x4` (r in the lowest byte) */\nexport const packColor = (c: Rgba): number =>\n ((Math.round(clamp01(c[3]) * 255) << 24) |\n (Math.round(clamp01(c[2]) * 255) << 16) |\n (Math.round(clamp01(c[1]) * 255) << 8) |\n Math.round(clamp01(c[0]) * 255)) >>>\n 0;\n\n/** Mixes two colors (t = 0 -> a, 1 -> b) */\nexport const mix = (a: Rgba, b: Rgba, t: number): Rgba => [\n a[0] + (b[0] - a[0]) * t,\n a[1] + (b[1] - a[1]) * t,\n a[2] + (b[2] - a[2]) * t,\n a[3] + (b[3] - a[3]) * t,\n];\n\n/** Relative luminance (sRGB approximation) */\nexport const luminance = (c: Rgba): number =>\n 0.2126 * c[0] + 0.7152 * c[1] + 0.0722 * c[2];\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"color.js","names":["clamp01","v","parseHex","h","hex","expand","channel","i","hasAlpha","parseComponent","part","scale","splitArgs","main","alpha","args","parts","parseColor","value","input","match","probeContext","parseWithCanvas","canvas","ctx","r","g","b","a","resolveColor","direct","computed","element","probe","parsed","resolveStaticColor","fallback","parseVar","ref","depth","defined","variables","NAMED","domColorResolver","toCss","c","packColor","mix","t"],"sources":["../../../../charts/src/engine/color.ts"],"sourcesContent":["// Color parsing to straight (non-premultiplied) RGBA in 0-1.\n\nexport type Rgba = readonly [number, number, number, number];\n\nconst clamp01 = (v: number) => (v < 0 ? 0 : v > 1 ? 1 : v);\n\nconst parseHex = (hex: string): Rgba | null => {\n const h = hex.slice(1);\n if (!/^[0-9a-f]+$/i.test(h)) return null;\n const expand = h.length === 3 || h.length === 4;\n if (!expand && h.length !== 6 && h.length !== 8) return null;\n const channel = (i: number) =>\n expand\n ? parseInt(h[i] + h[i], 16) / 255\n : parseInt(h.slice(i * 2, i * 2 + 2), 16) / 255;\n const hasAlpha = h.length === 4 || h.length === 8;\n return [channel(0), channel(1), channel(2), hasAlpha ? channel(3) : 1];\n};\n\nconst parseComponent = (part: string, scale: number): number => {\n const v = parseFloat(part);\n if (Number.isNaN(v)) return 0;\n return part.trim().endsWith(\"%\") ? v / 100 : v / scale;\n};\n\n/** Splits `a b c / d` or `a, b, c, d` */\nconst splitArgs = (args: string): string[] => {\n const [main, alpha] = args.split(\"/\");\n const parts = main.split(/[\\s,]+/).filter(Boolean);\n if (alpha !== undefined) parts.push(alpha.trim());\n return parts;\n};\n\n/**\n * Parses the color syntaxes returned by `getComputedStyle` (`rgb()`,\n * `rgba()`, `color(srgb ...)`) and hex colors; `null` for anything else\n * (named colors, `oklch()`, ... are resolved by `resolveColor`).\n */\nexport const parseColor = (input: string): Rgba | null => {\n const value = input.trim().toLowerCase();\n if (value.startsWith(\"#\")) return parseHex(value);\n if (value === \"transparent\") return [0, 0, 0, 0];\n let match = /^rgba?\\((.*)\\)$/.exec(value);\n if (match) {\n const parts = splitArgs(match[1]);\n if (parts.length < 3) return null;\n return [\n clamp01(parseComponent(parts[0], 255)),\n clamp01(parseComponent(parts[1], 255)),\n clamp01(parseComponent(parts[2], 255)),\n parts[3] === undefined ? 1 : clamp01(parseComponent(parts[3], 1)),\n ];\n }\n match = /^color\\(srgb\\s+(.*)\\)$/.exec(value);\n if (match) {\n const parts = splitArgs(match[1]);\n if (parts.length < 3) return null;\n return [\n clamp01(parseComponent(parts[0], 1)),\n clamp01(parseComponent(parts[1], 1)),\n clamp01(parseComponent(parts[2], 1)),\n parts[3] === undefined ? 1 : clamp01(parseComponent(parts[3], 1)),\n ];\n }\n return null;\n};\n\nlet probeContext: CanvasRenderingContext2D | null | undefined;\n\n/** Lets the browser convert any CSS color (named, hsl, oklch, color-mix, ...) */\nconst parseWithCanvas = (value: string): Rgba | null => {\n if (typeof document === \"undefined\") return null;\n if (probeContext === undefined) {\n const canvas = document.createElement(\"canvas\");\n canvas.width = 1;\n canvas.height = 1;\n probeContext = canvas.getContext(\"2d\", { willReadFrequently: true });\n }\n const ctx = probeContext;\n if (!ctx) return null;\n ctx.clearRect(0, 0, 1, 1);\n ctx.fillStyle = \"#000\";\n ctx.fillStyle = value;\n ctx.fillRect(0, 0, 1, 1);\n const [r, g, b, a] = ctx.getImageData(0, 0, 1, 1).data;\n if (a === 0) return [0, 0, 0, 0];\n // getImageData returns premultiplied-then-unpremultiplied values\n return [r / 255, g / 255, b / 255, a / 255];\n};\n\n/**\n * Resolves a CSS color in the context of `element`: `var(--x)`,\n * `color-mix()`, named colors, ... Falls back to `fallback` when the color\n * cannot be resolved (e.g. outside a browser).\n */\nexport const resolveColor = (\n value: string,\n element: Element | null,\n fallback: Rgba = [0.4, 0.4, 0.4, 1],\n): Rgba => {\n const direct = parseColor(value);\n if (direct) return direct;\n let computed = value;\n if (element && typeof getComputedStyle === \"function\") {\n const probe = element.ownerDocument.createElement(\"span\");\n probe.style.display = \"none\";\n probe.style.color = value;\n element.appendChild(probe);\n computed = getComputedStyle(probe).color || value;\n probe.remove();\n const parsed = parseColor(computed);\n if (parsed) return parsed;\n }\n return parseWithCanvas(computed) ?? resolveStaticColor(value, {}, fallback);\n};\n\n/** Resolves a color to RGBA, falling back to `fallback` */\nexport type ColorResolver = (value: string, fallback: Rgba) => Rgba;\n\n/** Splits the arguments of `var(--name, fallback)` (the fallback may contain commas) */\nconst parseVar = (\n value: string,\n): { name: string; fallback?: string } | null => {\n const match = /^var\\(\\s*(--[\\w-]+)\\s*(?:,([\\s\\S]*))?\\)$/.exec(value.trim());\n if (!match) return null;\n const fallback = match[2]?.trim();\n return { name: match[1], ...(fallback ? { fallback } : {}) };\n};\n\n/**\n * Resolves a color without a DOM (mini-programs, React Native, workers):\n * hex, `rgb()`, `transparent` and `var(--name, fallback)` looked up in\n * `variables` (nested fallbacks included).\n */\nexport const resolveStaticColor = (\n value: string,\n variables: Readonly<Record<string, string>> = {},\n fallback: Rgba = [0.4, 0.4, 0.4, 1],\n depth = 0,\n): Rgba => {\n const direct = parseColor(value);\n if (direct) return direct;\n const ref = depth < 8 ? parseVar(value) : null;\n if (ref) {\n const defined = variables[ref.name];\n if (defined)\n return resolveStaticColor(defined, variables, fallback, depth + 1);\n if (ref.fallback)\n return resolveStaticColor(ref.fallback, variables, fallback, depth + 1);\n }\n return NAMED[value.trim().toLowerCase()] ?? fallback;\n};\n\nconst NAMED: Record<string, Rgba> = {\n black: [0, 0, 0, 1],\n white: [1, 1, 1, 1],\n red: [1, 0, 0, 1],\n green: [0, 128 / 255, 0, 1],\n blue: [0, 0, 1, 1],\n gray: [128 / 255, 128 / 255, 128 / 255, 1],\n grey: [128 / 255, 128 / 255, 128 / 255, 1],\n orange: [1, 165 / 255, 0, 1],\n};\n\n/** Resolver of the DOM: CSS variables and any CSS color syntax of `element` */\nexport const domColorResolver =\n (element: Element | null): ColorResolver =>\n (value, fallback) =>\n resolveColor(value, element, fallback);\n\nconst hex2 = (v: number) =>\n Math.round(clamp01(v) * 255)\n .toString(16)\n .padStart(2, \"0\");\n\n/** `rgba()` string usable by Canvas2D and the DOM */\nexport const toCss = (c: Rgba, alpha = 1): string =>\n `rgba(${Math.round(c[0] * 255)}, ${Math.round(c[1] * 255)}, ${Math.round(c[2] * 255)}, ${+(c[3] * alpha).toFixed(3)})`;\n\n/** `#rrggbb` (alpha dropped) */\nexport const toHex = (c: Rgba): string =>\n `#${hex2(c[0])}${hex2(c[1])}${hex2(c[2])}`;\n\n/** Packs a color as little-endian `unorm8x4` (r in the lowest byte) */\nexport const packColor = (c: Rgba): number =>\n ((Math.round(clamp01(c[3]) * 255) << 24) |\n (Math.round(clamp01(c[2]) * 255) << 16) |\n (Math.round(clamp01(c[1]) * 255) << 8) |\n Math.round(clamp01(c[0]) * 255)) >>>\n 0;\n\n/** Mixes two colors (t = 0 -> a, 1 -> b) */\nexport const mix = (a: Rgba, b: Rgba, t: number): Rgba => [\n a[0] + (b[0] - a[0]) * t,\n a[1] + (b[1] - a[1]) * t,\n a[2] + (b[2] - a[2]) * t,\n a[3] + (b[3] - a[3]) * t,\n];\n\n/** Relative luminance (sRGB approximation) */\nexport const luminance = (c: Rgba): number =>\n 0.2126 * c[0] + 0.7152 * c[1] + 0.0722 * c[2];\n"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const e=require("./data.cjs"),t=require("./color.cjs"),n=require("./layout.cjs"),r=require("./model.cjs"),i=require("./overlay.cjs"),a=require("./decimate.cjs"),o=require("./scene.cjs"),s=require("./theme.cjs"),c=require("./viewport.cjs");var l=e=>({x:[e.x[0],e.x[1]],y:[e.y[0],e.y[1]]}),u=6,d=10,f=320,p=20,m=e=>{let t=e.options,a=e.theme,m=s.createTheme(a,t.palette),h=new Map,g=new Set,_={},v,y={x:[0,1],y:[0,1]},b=!1,x=0,S=0,C=[],w=null,T=!0,E=``,D=!1,O=null,k=new Map,A=null,j={time:0,x:0,y:0},M=(e,t)=>{_[e]?.forEach(e=>e(t))},N=()=>{T=!0,D||e.onInvalidate?.()},P=()=>{let e=t.interaction;if(e===!1)return null;let n=typeof e==`object`?e:{};return{pan:n.pan??!0,dragPoints:n.dragPoints??!1}},F=(t,n=m.fontSize,r=400)=>e.measureText(t,i.font(m,n,r)),I=()=>{v=r.buildModel(t,m,g,h);let{base:e,minSpan:n}=v;b?(y={x:v.zoom.x?c.clampRange(y.x,e.x,n.x):[...e.x],y:v.zoom.y?c.clampRange(y.y,e.y,n.y):[...e.y]},b=!c.sameRange(y.x,e.x)||!c.sameRange(y.y,e.y)):y=l(e),C=o.resolveAnnotations(t.annotations,m),O&&(O.event.items.every(e=>v.series[e.seriesIndex]&&!v.series[e.seriesIndex].hidden&&e.index<v.series[e.seriesIndex].cols.count)||H(null)),N()},L=()=>{let e=t.legend,n=t.series.filter(e=>e.name).length;if(!(e===void 0?n>1:e))return null;let r=typeof e==`object`?e:{},i=r.position===`bottom`?`bottom`:`top`,a=[],o=4,s=0;for(let e of v.series){let t=14+F(e.name,12)+8;o+t>x-4&&o>4&&(o=4,s++),a.push({id:e.id,name:e.name,color:e.colorCss,shape:e.type===`scatter`?`dot`:e.type===`line`?`line`:`square`,hidden:e.hidden,box:{x:o,y:s*p,width:t,height:p}}),o+=t+10}let c=(s+1)*p+6;if(i===`bottom`)for(let e of a)e.box.y+=S-c+6;return{entries:a,position:i,toggle:r.toggle??!0,height:c}},R=(e,n,r)=>{let i=t.tooltip;if(i===!1)return null;let a=typeof i==`object`?i.render:void 0,s=null;if(a){let t=a(e);if(t===null||t===``)return null;typeof t==`string`&&(s=t.split(`
|
|
2
|
+
`))}let c=o.tooltipContent(v,e,w?.layout.yTicks??null),l=0,u;if(s){for(let e of s)l=Math.max(l,F(e,12));u=s.length}else{l=F(c.title,12,600)+(c.titleColor?14:0);for(let e of c.rows)l=Math.max(l,(e.color?14:0)+F(e.name,12)+16+F(e.value,12,600));u=1+c.rows.length}let d=Math.ceil(Math.max(l,96)+16+4),f=u*18+16,p=n+14;p+d>x-4&&(p=n-14-d),p=Math.max(4,Math.min(p,x-d-4));let m=Math.max(4,Math.min(r-f/2,S-f-4));return{content:c,text:s,box:{x:p,y:m,width:d,height:f},lineHeight:18,padding:8}},z=()=>{if(x<=0||S<=0)return null;let e=L(),n=e?.position===`top`?e.height:0,r=o.layoutChart({model:v,view:y,theme:m,width:x,height:S-(e?.height??0),padding:t.padding,top:n,measure:e=>F(e)}),a=o.collectPointLabels(v,y,r.scales),s=[],c=m.fontSize+4;for(let e of C){if(e.type===`text`&&e.text){s.push(i.textBox(e,r.scales,F(e.text,m.fontSize,e.weight),c));continue}if(e.type!==`rect`||!e.label)continue;let t=r.scales,n=e.x0===void 0?r.plot.x:t.xToPx(e.x0),a=e.x1===void 0?r.plot.x+r.plot.width:t.xToPx(e.x1),o=e.y0===void 0?r.plot.y+r.plot.height:t.yToPx(e.y0),l=e.y1===void 0?r.plot.y:t.yToPx(e.y1),u=F(e.label,m.fontSize+1,600),d=Math.min(n,a),f=Math.max(n,a),p=Math.min(o,l),h=Math.max(o,l),g=e.labelPosition;s.push({x:g.endsWith(`left`)?d+10:g.endsWith(`right`)?f-10-u:(d+f-u)/2,y:g.startsWith(`top`)?p+10:g.startsWith(`bottom`)?h-10-c:(p+h-c)/2,width:u,height:c})}let u=i.placeLabels(a,r.plot,e=>F(e),c-2,s),d={width:x,height:S,theme:m,model:v,view:l(y),layout:r,annotations:C,pointLabels:u,legend:e,hover:null,dragging:null};if(w=d,O){let e=o.showsCrosshair(v,O.event,t.crosshair),n=r.scales.xToPx(O.event.items[0].x);d.hover={event:O.event,marks:o.hoverMarks(v,r.scales,O.event),crosshairX:e&&n>=r.plot.x&&n<=r.plot.x+r.plot.width?n:null,tooltip:A?.kind===`pan`||A?.kind===`point`?null:R(O.event,O.x,O.y)}}if(A?.kind===`point`){let e=v.series[A.item.seriesIndex];d.dragging={x:A.x,y:A.y,color:A.item.color,size:(e?o.dotSize(e,A.item.index):8)+6}}let f=r.plot,p=`${f.x},${f.y},${f.width},${f.height}`;return p!==E&&(E=p,M(`layout`,{...f})),d},B=()=>((T||!w)&&(T=!1,w=z()),w),V=()=>B()?.layout.scales??null,H=e=>{let t=!o.sameHover(O?.event??null,e?.event??null);O=e,N(),t&&M(`hover`,e?e.event:null)},U=(e,t,n)=>{let r=V();return r?o.hitTest(v,r,w?.layout.xTicks??null,e,t,n?8:0):null},W=(e,t)=>{let n=V()?.plot;return!!n&&e>=n.x&&e<=n.x+n.width&&t>=n.y&&t<=n.y+n.height},G=(e,t)=>{let n=V();if(!n)return null;let{plot:r}=n,i=Math.max(r.x,Math.min(r.x+r.width,e)),a=Math.max(r.y,Math.min(r.y+r.height,t));return{x:n.pxToX(i),y:n.pxToY(a)}},K=(e,t)=>{let{base:n,minSpan:r}=v;y={x:c.clampRange(e.x,n.x,r.x),y:c.clampRange(e.y,n.y,r.y)},b=!c.sameRange(y.x,n.x)||!c.sameRange(y.y,n.y),t&&M(`zoom`,l(y)),N()},q=(e,t,n)=>{let r=V();if(!r||!v.zoom.x&&!v.zoom.y)return;let i=l(y);v.zoom.x&&(i.x=c.zoomRange(y.x,r.pxToX(e),n)),v.zoom.y&&(i.y=c.zoomRange(y.y,r.pxToY(t),n)),K(i,!0)},J=()=>{b&&K(l(v.base),!0)},Y=(e,t)=>B()?.legend?.entries.find(n=>e>=n.box.x&&e<=n.box.x+n.box.width&&t>=n.box.y&&t<=n.box.y+n.box.height)??null,X=e=>{g.has(e)?g.delete(e):g.add(e),I()},Z=()=>{let[e,t]=[...k.values()];A={kind:`pinch`,view:l(y),distance:Math.max(1,Math.hypot(e.x-t.x,e.y-t.y)),midX:(e.x+t.x)/2,midY:(e.y+t.y)/2},H(null)};return v=r.buildModel(t,m,g,h),I(),{setOptions(e){if(D)return;let n=(e.palette??[]).join()!==(t.palette??[]).join();t=e,n&&(m=s.createTheme(a,t.palette)),I()},setTheme(e){D||(a=e,m=s.createTheme(a,t.palette),I())},setSize(e,t){(e!==x||t!==S)&&(x=Math.max(0,e),S=Math.max(0,t),N())},getScene:B,pointerDown:(e,t,n={})=>{if(D)return;let r=n.id??0,i=!!n.touch;k.set(r,{x:e,y:t,startX:e,startY:t,touch:i,moved:!1});let a=P();if(k.size===2){a&&(v.zoom.x||v.zoom.y)&&A?.kind!==`point`&&Z();return}if(k.size>2||!a){if(!a&&i){let n=U(e,t,!0);H(n?{event:n,x:e,y:t}:null)}return}if(a.dragPoints){let n=U(e,t,i)?.items.find(e=>v.series[e.seriesIndex].type===`scatter`);if(n){A={kind:`point`,item:n,x:e,y:t};return}}if(b&&a.pan&&W(e,t)){A={kind:`pan`,view:l(y),x:e,y:t};return}if(A=null,i){let n=U(e,t,!0);H(n?{event:n,x:e,y:t}:null)}},pointerMove:(e,t,r={})=>{if(D)return;let i=r.id??0,a=k.get(i);if(a&&(a.x=e,a.y=t,!a.moved&&Math.hypot(e-a.startX,t-a.startY)>(a.touch?d:u)&&(a.moved=!0)),A?.kind===`pinch`&&k.size>=2){let[e,t]=[...k.values()],r=Math.max(1,Math.hypot(e.x-t.x,e.y-t.y)),i=(e.x+t.x)/2,a=(e.y+t.y)/2,o=V();if(!o)return;let s=n.createScales(o.plot,A.view,v.x.reverse,v.y.reverse),u=A.distance/r,d=l(A.view);if(v.zoom.x){d.x=c.zoomRange(A.view.x,s.pxToX(A.midX),u);let e=(i-A.midX)*s.xPerPx*u;d.x=c.panRange(d.x,v.x.reverse?e:-e)}if(v.zoom.y){d.y=c.zoomRange(A.view.y,s.pxToY(A.midY),u);let e=(a-A.midY)*s.yPerPx*u;d.y=c.panRange(d.y,v.y.reverse?-e:e)}K(d,!0);return}if(A?.kind===`point`&&a){if(!a.moved)return;A.x=e,A.y=t;let n=G(e,t);N(),n&&M(`drag`,{item:A.item,x:n.x,y:n.y});return}if(A?.kind===`pan`&&a){if(!a.moved)return;let n=V();if(!n)return;let r=e-A.x,i=t-A.y,o=l(A.view);v.zoom.x&&(o.x=c.panRange(A.view.x,-r*n.xPerPx*(v.x.reverse?-1:1))),v.zoom.y&&(o.y=c.panRange(A.view.y,i*n.yPerPx*(v.y.reverse?-1:1))),K(o,!0);return}if(!(k.size>1)&&(!a||a.touch||!r.touch)){let n=U(e,t,!!a?.touch||!!r.touch);(n||!a?.touch)&&H(n?{event:n,x:e,y:t}:null)}},pointerUp:(e,t,n={})=>{if(D)return;let r=n.id??0,i=k.get(r);k.delete(r);let a=A;if(a?.kind===`pinch`){k.size<2&&(A=null);return}if(A=null,!i)return;if(a?.kind===`point`){if(i.moved){let n=G(e,t);N(),n&&M(`drop`,{item:a.item,x:n.x,y:n.y});return}}else if(a?.kind===`pan`&&i.moved){N();return}if(i.moved){i.touch&&N();return}let o=Date.now();if(i.touch&&o-j.time<f&&Math.hypot(e-j.x,t-j.y)<24&&b){j={time:0,x:e,y:t},J();return}j={time:o,x:e,y:t};let s=Y(e,t);if(s){B()?.legend?.toggle&&X(s.id);return}let c=U(e,t,i.touch);if(c){i.touch&&H({event:c,x:e,y:t}),M(`click`,c);return}if(i.touch&&H(null),W(e,t)){let n=G(e,t);n&&M(`plotClick`,n)}},pointerCancel:(e={})=>{k.delete(e.id??0),(A?.kind===`point`||k.size<2)&&(A=null),N()},pointerLeave(){!A&&O&&H(null)},zoomAt:q,resetZoom:J,getView:()=>l(y),setView(e){D||K({x:e.x??y.x,y:e.y??y.y},!1)},toggleSeries:X,clearHover(){O&&H(null)},getPlotRect(){let e=B()?.layout.plot;return e?{...e}:null},toPixel(e,t){let n=V();return n?{x:n.xToPx(e),y:n.yToPx(t)}:null},fromPixel(e,t){let n=V();return n?{x:n.pxToX(e),y:n.pxToY(t)}:null},on(e,t){let n=_[e];return n||(n=new Set,_[e]=n),n.add(t),()=>{n.delete(t)}},destroy(){D=!0,k.clear();for(let e of Object.keys(_))delete _[e]}}},h=(t,n,r,i)=>{if(!r)return[0,n];let[a,o]=i[0]<=i[1]?i:[i[1],i[0]];return[Math.max(0,e.lowerBound(t,n,a)-1),Math.min(n,e.lowerBound(t,n,o)+1)]},g=(e,n={})=>{let{model:r,view:i,layout:s}=e,c=s.scales,{plot:l}=s,u=n.maxDots??4e3,d=n.maxBars??2e3,f=Math.max(1,n.columnWidth??1),p={area:0,bar:1,line:2,scatter:3},m=[],g=r.series.filter(e=>!e.hidden&&e.cols.count>0).sort((e,t)=>p[e.type]-p[t.type]||e.index-t.index);for(let e of g){let{x:s,y:p,count:g,sorted:_}=e.cols;if(e.type===`line`||e.type===`area`){let[t,n]=h(s,g,_,i.x),o=new Float64Array((n-t)*2);for(let e=t;e<n;e++)o[(e-t)*2]=s[e],o[(e-t)*2+1]=p[e];let u=n-t,d=_&&u>l.width*2/f?a.decimateMinMax(o,0,u,e=>c.xToPx(e)/f):{points:o,length:u},v=[],y=[];for(let e=0;e<d.length;e++){let t=d.points[e*2],n=d.points[e*2+1];if(!Number.isFinite(t)||!Number.isFinite(n)){y.length&&v.push(y),y=[];continue}y.push(c.xToPx(t),c.yToPx(n))}y.length&&v.push(y),e.type===`area`&&m.push({kind:`area`,seriesIndex:e.index,color:e.colorCss,opacity:e.opacity,baseline:c.yToPx(r.baseline),segments:v}),m.push({kind:`line`,seriesIndex:e.index,color:e.colorCss,width:e.type===`area`?Math.min(e.lineWidth,2):e.lineWidth,segments:v});continue}if(e.type===`bar`&&e.barBase&&e.barTop){let[t,n]=h(s,g,_,i.x),r=Math.max(e.barHalfWidth/c.xPerPx,.5),a=[],o=n-t>d,u=NaN;for(let i=t;i<n;i++){let t=e.barBase[i],n=e.barTop[i];if(!Number.isFinite(t)||!Number.isFinite(n))continue;let d=c.xToPx(s[i]+e.barOffset);if(d+r<l.x||d-r>l.x+l.width)continue;let f=c.yToPx(t),p=c.yToPx(n),m=Math.min(f,p),h=Math.max(1,Math.abs(f-p)),g=Math.floor(d);if(o&&g===u&&a.length){let e=a.length-4,t=Math.max(a[e+1]+a[e+3],m+h);a[e+1]=Math.min(a[e+1],m),a[e+3]=t-a[e+1];continue}u=g,a.push(d-r,m,r*2,h)}m.push({kind:`bars`,seriesIndex:e.index,color:e.colorCss,rects:a});continue}let v=[],y=[],b=n=>{let r=e.pointColors?.[n];return r?t.toCss(r):e.colorCss},x=[];for(let e=0;e<g;e++){let t=s[e],n=p[e];if(!Number.isFinite(t)||!Number.isFinite(n))continue;let r=c.xToPx(t),i=c.yToPx(n);r<l.x||r>l.x+l.width||i<l.y||i>l.y+l.height||x.push(e)}if(x.length>u){let t=Math.max(2,n.dotCell??e.pointSize*.8),r=Math.ceil(l.width/t)+1,i=new Map;for(let e of x){let n=Math.floor((c.xToPx(s[e])-l.x)/t),a=Math.floor((c.yToPx(p[e])-l.y)/t);i.set(a*r+n,e)}for(let[e,n]of i)v.push(l.x+(e%r+.5)*t,l.y+(Math.floor(e/r)+.5)*t,t),y.push(b(n))}else for(let t of x)v.push(c.xToPx(s[t]),c.yToPx(p[t]),o.dotSize(e,t)),y.push(b(t));m.push({kind:`dots`,seriesIndex:e.index,opacity:e.opacity,dots:v,colors:y})}return m};exports.createChartController=m,exports.scenePrimitives=g;
|
|
3
|
+
//# sourceMappingURL=controller.cjs.map
|