minerva-design 1.0.2 → 1.1.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.
Files changed (165) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +21 -19
  3. package/dist/charts/core.cjs +1 -0
  4. package/dist/charts/core.d.cts +3 -0
  5. package/dist/charts/core.d.ts +3 -0
  6. package/dist/charts/core.js +3 -0
  7. package/dist/charts/engine/axis.cjs +2 -0
  8. package/dist/charts/engine/axis.cjs.map +1 -0
  9. package/dist/charts/engine/axis.d.cts +13 -0
  10. package/dist/charts/engine/axis.d.ts +13 -0
  11. package/dist/charts/engine/axis.js +38 -0
  12. package/dist/charts/engine/axis.js.map +1 -0
  13. package/dist/charts/engine/chart.cjs +3 -0
  14. package/dist/charts/engine/chart.cjs.map +1 -0
  15. package/dist/charts/engine/chart.d.cts +6 -0
  16. package/dist/charts/engine/chart.d.ts +6 -0
  17. package/dist/charts/engine/chart.js +624 -0
  18. package/dist/charts/engine/chart.js.map +1 -0
  19. package/dist/charts/engine/color.cjs +2 -0
  20. package/dist/charts/engine/color.cjs.map +1 -0
  21. package/dist/charts/engine/color.d.cts +23 -0
  22. package/dist/charts/engine/color.d.ts +23 -0
  23. package/dist/charts/engine/color.js +95 -0
  24. package/dist/charts/engine/color.js.map +1 -0
  25. package/dist/charts/engine/data.cjs +2 -0
  26. package/dist/charts/engine/data.cjs.map +1 -0
  27. package/dist/charts/engine/data.d.cts +29 -0
  28. package/dist/charts/engine/data.d.ts +29 -0
  29. package/dist/charts/engine/data.js +104 -0
  30. package/dist/charts/engine/data.js.map +1 -0
  31. package/dist/charts/engine/decimate.cjs +2 -0
  32. package/dist/charts/engine/decimate.cjs.map +1 -0
  33. package/dist/charts/engine/decimate.d.cts +13 -0
  34. package/dist/charts/engine/decimate.d.ts +13 -0
  35. package/dist/charts/engine/decimate.js +28 -0
  36. package/dist/charts/engine/decimate.js.map +1 -0
  37. package/dist/charts/engine/dom.cjs +2 -0
  38. package/dist/charts/engine/dom.cjs.map +1 -0
  39. package/dist/charts/engine/dom.d.cts +21 -0
  40. package/dist/charts/engine/dom.d.ts +21 -0
  41. package/dist/charts/engine/dom.js +125 -0
  42. package/dist/charts/engine/dom.js.map +1 -0
  43. package/dist/charts/engine/format.cjs +2 -0
  44. package/dist/charts/engine/format.cjs.map +1 -0
  45. package/dist/charts/engine/format.d.cts +9 -0
  46. package/dist/charts/engine/format.d.ts +9 -0
  47. package/dist/charts/engine/format.js +34 -0
  48. package/dist/charts/engine/format.js.map +1 -0
  49. package/dist/charts/engine/items.cjs +2 -0
  50. package/dist/charts/engine/items.cjs.map +1 -0
  51. package/dist/charts/engine/items.d.cts +8 -0
  52. package/dist/charts/engine/items.d.ts +8 -0
  53. package/dist/charts/engine/items.js +91 -0
  54. package/dist/charts/engine/items.js.map +1 -0
  55. package/dist/charts/engine/layout.cjs +2 -0
  56. package/dist/charts/engine/layout.cjs.map +1 -0
  57. package/dist/charts/engine/layout.d.cts +37 -0
  58. package/dist/charts/engine/layout.d.ts +37 -0
  59. package/dist/charts/engine/layout.js +26 -0
  60. package/dist/charts/engine/layout.js.map +1 -0
  61. package/dist/charts/engine/model.cjs +2 -0
  62. package/dist/charts/engine/model.cjs.map +1 -0
  63. package/dist/charts/engine/model.d.cts +74 -0
  64. package/dist/charts/engine/model.d.ts +74 -0
  65. package/dist/charts/engine/model.js +175 -0
  66. package/dist/charts/engine/model.js.map +1 -0
  67. package/dist/charts/engine/overlay.cjs +2 -0
  68. package/dist/charts/engine/overlay.cjs.map +1 -0
  69. package/dist/charts/engine/overlay.d.cts +62 -0
  70. package/dist/charts/engine/overlay.d.ts +62 -0
  71. package/dist/charts/engine/overlay.js +123 -0
  72. package/dist/charts/engine/overlay.js.map +1 -0
  73. package/dist/charts/engine/renderers/canvas2d.cjs +2 -0
  74. package/dist/charts/engine/renderers/canvas2d.cjs.map +1 -0
  75. package/dist/charts/engine/renderers/canvas2d.d.cts +4 -0
  76. package/dist/charts/engine/renderers/canvas2d.d.ts +4 -0
  77. package/dist/charts/engine/renderers/canvas2d.js +156 -0
  78. package/dist/charts/engine/renderers/canvas2d.js.map +1 -0
  79. package/dist/charts/engine/renderers/detect.cjs +2 -0
  80. package/dist/charts/engine/renderers/detect.cjs.map +1 -0
  81. package/dist/charts/engine/renderers/detect.d.cts +12 -0
  82. package/dist/charts/engine/renderers/detect.d.ts +12 -0
  83. package/dist/charts/engine/renderers/detect.js +33 -0
  84. package/dist/charts/engine/renderers/detect.js.map +1 -0
  85. package/dist/charts/engine/renderers/range.cjs +2 -0
  86. package/dist/charts/engine/renderers/range.cjs.map +1 -0
  87. package/dist/charts/engine/renderers/range.d.cts +5 -0
  88. package/dist/charts/engine/renderers/range.d.ts +5 -0
  89. package/dist/charts/engine/renderers/range.js +32 -0
  90. package/dist/charts/engine/renderers/range.js.map +1 -0
  91. package/dist/charts/engine/renderers/shaders.cjs +266 -0
  92. package/dist/charts/engine/renderers/shaders.cjs.map +1 -0
  93. package/dist/charts/engine/renderers/shaders.d.cts +20 -0
  94. package/dist/charts/engine/renderers/shaders.d.ts +20 -0
  95. package/dist/charts/engine/renderers/shaders.js +251 -0
  96. package/dist/charts/engine/renderers/shaders.js.map +1 -0
  97. package/dist/charts/engine/renderers/types.cjs +2 -0
  98. package/dist/charts/engine/renderers/types.cjs.map +1 -0
  99. package/dist/charts/engine/renderers/types.d.cts +83 -0
  100. package/dist/charts/engine/renderers/types.d.ts +83 -0
  101. package/dist/charts/engine/renderers/types.js +6 -0
  102. package/dist/charts/engine/renderers/types.js.map +1 -0
  103. package/dist/charts/engine/renderers/webgl2.cjs +2 -0
  104. package/dist/charts/engine/renderers/webgl2.cjs.map +1 -0
  105. package/dist/charts/engine/renderers/webgl2.d.cts +5 -0
  106. package/dist/charts/engine/renderers/webgl2.d.ts +5 -0
  107. package/dist/charts/engine/renderers/webgl2.js +134 -0
  108. package/dist/charts/engine/renderers/webgl2.js.map +1 -0
  109. package/dist/charts/engine/renderers/webgpu.cjs +2 -0
  110. package/dist/charts/engine/renderers/webgpu.cjs.map +1 -0
  111. package/dist/charts/engine/renderers/webgpu.d.cts +6 -0
  112. package/dist/charts/engine/renderers/webgpu.d.ts +6 -0
  113. package/dist/charts/engine/renderers/webgpu.js +220 -0
  114. package/dist/charts/engine/renderers/webgpu.js.map +1 -0
  115. package/dist/charts/engine/scale.cjs +2 -0
  116. package/dist/charts/engine/scale.cjs.map +1 -0
  117. package/dist/charts/engine/scale.d.cts +13 -0
  118. package/dist/charts/engine/scale.d.ts +13 -0
  119. package/dist/charts/engine/scale.js +37 -0
  120. package/dist/charts/engine/scale.js.map +1 -0
  121. package/dist/charts/engine/spatial.cjs +2 -0
  122. package/dist/charts/engine/spatial.cjs.map +1 -0
  123. package/dist/charts/engine/spatial.d.cts +18 -0
  124. package/dist/charts/engine/spatial.d.ts +18 -0
  125. package/dist/charts/engine/spatial.js +53 -0
  126. package/dist/charts/engine/spatial.js.map +1 -0
  127. package/dist/charts/engine/theme.cjs +2 -0
  128. package/dist/charts/engine/theme.cjs.map +1 -0
  129. package/dist/charts/engine/theme.d.cts +21 -0
  130. package/dist/charts/engine/theme.d.ts +21 -0
  131. package/dist/charts/engine/theme.js +70 -0
  132. package/dist/charts/engine/theme.js.map +1 -0
  133. package/dist/charts/engine/time.cjs +2 -0
  134. package/dist/charts/engine/time.cjs.map +1 -0
  135. package/dist/charts/engine/time.d.cts +10 -0
  136. package/dist/charts/engine/time.d.ts +10 -0
  137. package/dist/charts/engine/time.js +189 -0
  138. package/dist/charts/engine/time.js.map +1 -0
  139. package/dist/charts/engine/types.d.cts +289 -0
  140. package/dist/charts/engine/types.d.ts +289 -0
  141. package/dist/charts/engine/viewport.cjs +2 -0
  142. package/dist/charts/engine/viewport.cjs.map +1 -0
  143. package/dist/charts/engine/viewport.d.cts +12 -0
  144. package/dist/charts/engine/viewport.d.ts +12 -0
  145. package/dist/charts/engine/viewport.js +15 -0
  146. package/dist/charts/engine/viewport.js.map +1 -0
  147. package/dist/charts/index.cjs +1 -0
  148. package/dist/charts/index.d.cts +4 -0
  149. package/dist/charts/index.d.ts +4 -0
  150. package/dist/charts/index.js +7 -0
  151. package/dist/charts/react/Chart.cjs +2 -0
  152. package/dist/charts/react/Chart.cjs.map +1 -0
  153. package/dist/charts/react/Chart.d.cts +28 -0
  154. package/dist/charts/react/Chart.d.ts +28 -0
  155. package/dist/charts/react/Chart.js +75 -0
  156. package/dist/charts/react/Chart.js.map +1 -0
  157. package/dist/charts/react/charts.cjs +2 -0
  158. package/dist/charts/react/charts.cjs.map +1 -0
  159. package/dist/charts/react/charts.d.cts +13 -0
  160. package/dist/charts/react/charts.d.ts +13 -0
  161. package/dist/charts/react/charts.js +179 -0
  162. package/dist/charts/react/charts.js.map +1 -0
  163. package/dist/charts/react/types.d.cts +168 -0
  164. package/dist/charts/react/types.d.ts +168 -0
  165. package/package.json +28 -2
@@ -0,0 +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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"}
@@ -0,0 +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)})`,l=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,u=(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.mix=u,exports.packColor=l,exports.parseColor=i,exports.resolveColor=s,exports.toCss=c;
2
+ //# sourceMappingURL=color.cjs.map
@@ -0,0 +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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"}
@@ -0,0 +1,23 @@
1
+ export type Rgba = readonly [number, number, number, number];
2
+ /**
3
+ * Parses the color syntaxes returned by `getComputedStyle` (`rgb()`,
4
+ * `rgba()`, `color(srgb ...)`) and hex colors; `null` for anything else
5
+ * (named colors, `oklch()`, ... are resolved by `resolveColor`).
6
+ */
7
+ export declare const parseColor: (input: string) => Rgba | null;
8
+ /**
9
+ * Resolves a CSS color in the context of `element`: `var(--x)`,
10
+ * `color-mix()`, named colors, ... Falls back to `fallback` when the color
11
+ * cannot be resolved (e.g. outside a browser).
12
+ */
13
+ export declare const resolveColor: (value: string, element: Element | null, fallback?: Rgba) => Rgba;
14
+ /** `rgba()` string usable by Canvas2D and the DOM */
15
+ export declare const toCss: (c: Rgba, alpha?: number) => string;
16
+ /** `#rrggbb` (alpha dropped) */
17
+ export declare const toHex: (c: Rgba) => string;
18
+ /** Packs a color as little-endian `unorm8x4` (r in the lowest byte) */
19
+ export declare const packColor: (c: Rgba) => number;
20
+ /** Mixes two colors (t = 0 -> a, 1 -> b) */
21
+ export declare const mix: (a: Rgba, b: Rgba, t: number) => Rgba;
22
+ /** Relative luminance (sRGB approximation) */
23
+ export declare const luminance: (c: Rgba) => number;
@@ -0,0 +1,23 @@
1
+ export type Rgba = readonly [number, number, number, number];
2
+ /**
3
+ * Parses the color syntaxes returned by `getComputedStyle` (`rgb()`,
4
+ * `rgba()`, `color(srgb ...)`) and hex colors; `null` for anything else
5
+ * (named colors, `oklch()`, ... are resolved by `resolveColor`).
6
+ */
7
+ export declare const parseColor: (input: string) => Rgba | null;
8
+ /**
9
+ * Resolves a CSS color in the context of `element`: `var(--x)`,
10
+ * `color-mix()`, named colors, ... Falls back to `fallback` when the color
11
+ * cannot be resolved (e.g. outside a browser).
12
+ */
13
+ export declare const resolveColor: (value: string, element: Element | null, fallback?: Rgba) => Rgba;
14
+ /** `rgba()` string usable by Canvas2D and the DOM */
15
+ export declare const toCss: (c: Rgba, alpha?: number) => string;
16
+ /** `#rrggbb` (alpha dropped) */
17
+ export declare const toHex: (c: Rgba) => string;
18
+ /** Packs a color as little-endian `unorm8x4` (r in the lowest byte) */
19
+ export declare const packColor: (c: Rgba) => number;
20
+ /** Mixes two colors (t = 0 -> a, 1 -> b) */
21
+ export declare const mix: (a: Rgba, b: Rgba, t: number) => Rgba;
22
+ /** Relative luminance (sRGB approximation) */
23
+ export declare const luminance: (c: Rgba) => number;
@@ -0,0 +1,95 @@
1
+ //#region src/engine/color.ts
2
+ var e = (e) => e < 0 ? 0 : e > 1 ? 1 : e, t = (e) => {
3
+ let t = e.slice(1);
4
+ if (!/^[0-9a-f]+$/i.test(t)) return null;
5
+ let n = t.length === 3 || t.length === 4;
6
+ if (!n && t.length !== 6 && t.length !== 8) return null;
7
+ 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;
8
+ return [
9
+ r(0),
10
+ r(1),
11
+ r(2),
12
+ i ? r(3) : 1
13
+ ];
14
+ }, n = (e, t) => {
15
+ let n = parseFloat(e);
16
+ return Number.isNaN(n) ? 0 : e.trim().endsWith("%") ? n / 100 : n / t;
17
+ }, r = (e) => {
18
+ let [t, n] = e.split("/"), r = t.split(/[\s,]+/).filter(Boolean);
19
+ return n !== void 0 && r.push(n.trim()), r;
20
+ }, i = (i) => {
21
+ let a = i.trim().toLowerCase();
22
+ if (a.startsWith("#")) return t(a);
23
+ if (a === "transparent") return [
24
+ 0,
25
+ 0,
26
+ 0,
27
+ 0
28
+ ];
29
+ let o = /^rgba?\((.*)\)$/.exec(a);
30
+ if (o) {
31
+ let t = r(o[1]);
32
+ return t.length < 3 ? null : [
33
+ e(n(t[0], 255)),
34
+ e(n(t[1], 255)),
35
+ e(n(t[2], 255)),
36
+ t[3] === void 0 ? 1 : e(n(t[3], 1))
37
+ ];
38
+ }
39
+ if (o = /^color\(srgb\s+(.*)\)$/.exec(a), o) {
40
+ let t = r(o[1]);
41
+ return t.length < 3 ? null : [
42
+ e(n(t[0], 1)),
43
+ e(n(t[1], 1)),
44
+ e(n(t[2], 1)),
45
+ t[3] === void 0 ? 1 : e(n(t[3], 1))
46
+ ];
47
+ }
48
+ return null;
49
+ }, a, o = (e) => {
50
+ if (typeof document > "u") return null;
51
+ if (a === void 0) {
52
+ let e = document.createElement("canvas");
53
+ e.width = 1, e.height = 1, a = e.getContext("2d", { willReadFrequently: !0 });
54
+ }
55
+ let t = a;
56
+ if (!t) return null;
57
+ t.clearRect(0, 0, 1, 1), t.fillStyle = "#000", t.fillStyle = e, t.fillRect(0, 0, 1, 1);
58
+ let [n, r, i, o] = t.getImageData(0, 0, 1, 1).data;
59
+ return o === 0 ? [
60
+ 0,
61
+ 0,
62
+ 0,
63
+ 0
64
+ ] : [
65
+ n / 255,
66
+ r / 255,
67
+ i / 255,
68
+ o / 255
69
+ ];
70
+ }, s = (e, t, n = [
71
+ .4,
72
+ .4,
73
+ .4,
74
+ 1
75
+ ]) => {
76
+ let r = i(e);
77
+ if (r) return r;
78
+ let a = e;
79
+ if (t && typeof getComputedStyle == "function") {
80
+ let n = t.ownerDocument.createElement("span");
81
+ n.style.display = "none", n.style.color = e, t.appendChild(n), a = getComputedStyle(n).color || e, n.remove();
82
+ let r = i(a);
83
+ if (r) return r;
84
+ }
85
+ return o(a) ?? n;
86
+ }, 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)})`, l = (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, u = (e, t, n) => [
87
+ e[0] + (t[0] - e[0]) * n,
88
+ e[1] + (t[1] - e[1]) * n,
89
+ e[2] + (t[2] - e[2]) * n,
90
+ e[3] + (t[3] - e[3]) * n
91
+ ];
92
+ //#endregion
93
+ export { u as mix, l as packColor, i as parseColor, s as resolveColor, c as toCss };
94
+
95
+ //# sourceMappingURL=color.js.map
@@ -0,0 +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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"}
@@ -0,0 +1,2 @@
1
+ var e=e=>typeof e==`object`&&!!e&&!(`length`in e)&&`y`in e,t=(e,t)=>(n,r)=>{if(typeof n==`number`)return n;if(n instanceof Date)return n.getTime();if(typeof n==`string`){if(e===`category`)return t(n);if(e===`time`)return Date.parse(n);let i=Number(n);return Number.isNaN(i)?r:i}return r},n=e=>typeof e==`number`?e:e==null?NaN:Number(e),r=t=>{let n=new Set,r=e=>{typeof e==`string`&&n.add(e)};for(let n of t){if(e(n)){let e=n.x;if(e&&!ArrayBuffer.isView(e))for(let t=0;t<e.length;t++)r(e[t]);continue}let t=n;for(let e=0;e<t.length;e++){let n=t[e];Array.isArray(n)?r(n[0]):n&&typeof n==`object`&&r(n.x)}}return[...n]},i=(e,t,n,r)=>{let i=1/0,a=-1/0,o=1/0,s=-1/0,c=!0,l=-1/0;for(let r=0;r<n;r++){let n=e[r];if(!Number.isFinite(n)){t[r]=NaN;continue}n<l&&(c=!1),l=n;let u=t[r];Number.isFinite(u)&&(n<i&&(i=n),n>a&&(a=n),u<o&&(o=u),u>s&&(s=u))}let u=i>a;return{x:e,y:t,count:n,sorted:c,xMin:u?NaN:i,xMax:u?NaN:a,yMin:u?NaN:o,yMax:u?NaN:s,...r}},a=(t,r)=>{let a={size:null,colors:null,labels:null};if(e(t)){let e=t.y.length,o=new Float64Array(e),s=new Float64Array(e),c=t.x;for(let i=0;i<e;i++)s[i]=n(t.y[i]),o[i]=c?r(c[i],i):i;let l=null;if(t.size){l=new Float32Array(e);for(let r=0;r<e;r++)l[r]=n(t.size[r])}return i(o,s,e,{...a,size:l})}let o=t,s=o.length,c=new Float64Array(s),l=new Float64Array(s),u=null,d=null,f=null;for(let e=0;e<s;e++){let t=o[e];if(t==null||typeof t==`number`)c[e]=e,l[e]=n(t);else if(Array.isArray(t))c[e]=r(t[0],e),l[e]=n(t[1]);else if(typeof t==`object`){let i=t;c[e]=i.x===void 0?e:r(i.x,e),l[e]=n(i.y),i.size!==void 0&&(u??(u=new Float32Array(s).fill(NaN)),u[e]=i.size),i.color!==void 0&&(d??(d=Array(s)),d[e]=i.color),i.label!==void 0&&(f??(f=Array(s)),f[e]=i.label)}else c[e]=e,l[e]=NaN}return i(c,l,s,{size:u,colors:d,labels:f})},o=(e,t,n)=>{let r=0,i=t;for(;r<i;){let t=r+i>>>1;e[t]<n?r=t+1:i=t}return r},s=(e,t,n,r)=>{if(n===0)return-1;let i=o(e,n,r),a=i-1,s=i;for(;a>=0&&!Number.isFinite(t[a]);)a--;for(;s<n&&!Number.isFinite(t[s]);)s++;return a<0?s<n?s:-1:s>=n||r-e[a]<=e[s]-r?a:s};exports.collectCategories=r,exports.lowerBound=o,exports.nearestIndex=s,exports.normalizeData=a,exports.xResolver=t;
2
+ //# sourceMappingURL=data.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.cjs","names":["isColumns","data","xResolver","value","type","categoryIndex","n","index","toNumber","v","collectCategories","seen","add","datas","xs","i","list","item","finalize","xMin","xMax","yMin","yMax","sorted","prev","count","xi","x","yi","y","empty","extra","normalizeData","none","resolveX","size","colors","labels","d","lowerBound","lo","hi","mid","nearestIndex","left","right"],"sources":["../../../../charts/src/engine/data.ts"],"sourcesContent":["// Normalization of series data into columns (Float64Array).\n\nimport type { ChartAxisType, ChartSeriesData, ChartXValue } from \"./types\";\n\nexport interface SeriesColumns {\n x: Float64Array;\n /** NaN where the value is missing */\n y: Float64Array;\n size: Float32Array | null;\n colors: (string | undefined)[] | null;\n labels: (string | undefined)[] | null;\n count: number;\n /** x is non-decreasing (binary search, decimation) */\n sorted: boolean;\n /** Extent of the finite points (NaN when there is none) */\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n}\n\ntype XResolver = (value: ChartXValue, index: number) => number;\n\nconst isColumns = (\n data: ChartSeriesData,\n): data is {\n x?: ArrayLike<number> | readonly ChartXValue[];\n y: ArrayLike<number> | readonly (number | null)[];\n size?: ArrayLike<number>;\n} =>\n typeof data === \"object\" &&\n data !== null &&\n !(\"length\" in data) &&\n \"y\" in data;\n\n/** Converts an x value to a number for the axis type */\nexport const xResolver = (\n type: ChartAxisType,\n categoryIndex: (name: string) => number,\n): XResolver => {\n return (value, index) => {\n if (typeof value === \"number\") return value;\n if (value instanceof Date) return value.getTime();\n if (typeof value === \"string\") {\n if (type === \"category\") return categoryIndex(value);\n if (type === \"time\") return Date.parse(value);\n const n = Number(value);\n return Number.isNaN(n) ? index : n;\n }\n return index;\n };\n};\n\nconst toNumber = (v: unknown): number =>\n typeof v === \"number\" ? v : v === null || v === undefined ? NaN : Number(v);\n\n/** Category names used by string x values, in order of appearance */\nexport const collectCategories = (\n datas: readonly ChartSeriesData[],\n): string[] => {\n const seen = new Set<string>();\n const add = (v: unknown) => {\n if (typeof v === \"string\") seen.add(v);\n };\n for (const data of datas) {\n if (isColumns(data)) {\n const xs = data.x;\n if (xs && !ArrayBuffer.isView(xs)) {\n for (let i = 0; i < xs.length; i++) add(xs[i]);\n }\n continue;\n }\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < list.length; i++) {\n const item = list[i];\n if (Array.isArray(item)) add(item[0]);\n else if (item && typeof item === \"object\")\n add((item as { x?: unknown }).x);\n }\n }\n return [...seen];\n};\n\nconst finalize = (\n x: Float64Array,\n y: Float64Array,\n count: number,\n extra: Pick<SeriesColumns, \"size\" | \"colors\" | \"labels\">,\n): SeriesColumns => {\n let xMin = Infinity;\n let xMax = -Infinity;\n let yMin = Infinity;\n let yMax = -Infinity;\n let sorted = true;\n let prev = -Infinity;\n for (let i = 0; i < count; i++) {\n const xi = x[i];\n if (!Number.isFinite(xi)) {\n y[i] = NaN;\n continue;\n }\n if (xi < prev) sorted = false;\n prev = xi;\n const yi = y[i];\n if (!Number.isFinite(yi)) continue;\n if (xi < xMin) xMin = xi;\n if (xi > xMax) xMax = xi;\n if (yi < yMin) yMin = yi;\n if (yi > yMax) yMax = yi;\n }\n const empty = xMin > xMax;\n return {\n x,\n y,\n count,\n sorted,\n xMin: empty ? NaN : xMin,\n xMax: empty ? NaN : xMax,\n yMin: empty ? NaN : yMin,\n yMax: empty ? NaN : yMax,\n ...extra,\n };\n};\n\n/** Turns any supported data form into columns */\nexport const normalizeData = (\n data: ChartSeriesData,\n resolveX: XResolver,\n): SeriesColumns => {\n const none = { size: null, colors: null, labels: null };\n if (isColumns(data)) {\n const count = data.y.length;\n const x = new Float64Array(count);\n const y = new Float64Array(count);\n const xs = data.x;\n for (let i = 0; i < count; i++) {\n y[i] = toNumber(data.y[i]);\n x[i] = xs ? resolveX(xs[i] as ChartXValue, i) : i;\n }\n let size: Float32Array | null = null;\n if (data.size) {\n size = new Float32Array(count);\n for (let i = 0; i < count; i++) size[i] = toNumber(data.size[i]);\n }\n return finalize(x, y, count, { ...none, size });\n }\n\n const list = data as ArrayLike<unknown>;\n const count = list.length;\n const x = new Float64Array(count);\n const y = new Float64Array(count);\n let size: Float32Array | null = null;\n let colors: (string | undefined)[] | null = null;\n let labels: (string | undefined)[] | null = null;\n\n for (let i = 0; i < count; i++) {\n const item = list[i];\n if (item === null || item === undefined || typeof item === \"number\") {\n x[i] = i;\n y[i] = toNumber(item);\n } else if (Array.isArray(item)) {\n x[i] = resolveX(item[0] as ChartXValue, i);\n y[i] = toNumber(item[1]);\n } else if (typeof item === \"object\") {\n const d = item as {\n x?: ChartXValue;\n y?: number | null;\n size?: number;\n color?: string;\n label?: string;\n };\n x[i] = d.x === undefined ? i : resolveX(d.x, i);\n y[i] = toNumber(d.y);\n if (d.size !== undefined) {\n size ??= new Float32Array(count).fill(NaN);\n size[i] = d.size;\n }\n if (d.color !== undefined) {\n colors ??= new Array<string | undefined>(count);\n colors[i] = d.color;\n }\n if (d.label !== undefined) {\n labels ??= new Array<string | undefined>(count);\n labels[i] = d.label;\n }\n } else {\n x[i] = i;\n y[i] = NaN;\n }\n }\n return finalize(x, y, count, { size, colors, labels });\n};\n\n/** First index whose x is >= value (sorted x) */\nexport const lowerBound = (\n x: ArrayLike<number>,\n count: number,\n value: number,\n): number => {\n let lo = 0;\n let hi = count;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (x[mid] < value) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n};\n\n/** Index of the point with the closest x and a finite y (sorted x), -1 if none */\nexport const nearestIndex = (\n x: ArrayLike<number>,\n y: ArrayLike<number>,\n count: number,\n value: number,\n): number => {\n if (count === 0) return -1;\n const i = lowerBound(x, count, value);\n let left = i - 1;\n let right = i;\n while (left >= 0 && !Number.isFinite(y[left])) left--;\n while (right < count && !Number.isFinite(y[right])) right++;\n if (left < 0) return right < count ? right : -1;\n if (right >= count) return left;\n return value - x[left] <= x[right] - value ? left : right;\n};\n"],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { ChartAxisType, ChartSeriesData, ChartXValue } from './types.cjs';
2
+ export interface SeriesColumns {
3
+ x: Float64Array;
4
+ /** NaN where the value is missing */
5
+ y: Float64Array;
6
+ size: Float32Array | null;
7
+ colors: (string | undefined)[] | null;
8
+ labels: (string | undefined)[] | null;
9
+ count: number;
10
+ /** x is non-decreasing (binary search, decimation) */
11
+ sorted: boolean;
12
+ /** Extent of the finite points (NaN when there is none) */
13
+ xMin: number;
14
+ xMax: number;
15
+ yMin: number;
16
+ yMax: number;
17
+ }
18
+ type XResolver = (value: ChartXValue, index: number) => number;
19
+ /** Converts an x value to a number for the axis type */
20
+ export declare const xResolver: (type: ChartAxisType, categoryIndex: (name: string) => number) => XResolver;
21
+ /** Category names used by string x values, in order of appearance */
22
+ export declare const collectCategories: (datas: readonly ChartSeriesData[]) => string[];
23
+ /** Turns any supported data form into columns */
24
+ export declare const normalizeData: (data: ChartSeriesData, resolveX: XResolver) => SeriesColumns;
25
+ /** First index whose x is >= value (sorted x) */
26
+ export declare const lowerBound: (x: ArrayLike<number>, count: number, value: number) => number;
27
+ /** Index of the point with the closest x and a finite y (sorted x), -1 if none */
28
+ export declare const nearestIndex: (x: ArrayLike<number>, y: ArrayLike<number>, count: number, value: number) => number;
29
+ export {};
@@ -0,0 +1,29 @@
1
+ import { ChartAxisType, ChartSeriesData, ChartXValue } from './types.js';
2
+ export interface SeriesColumns {
3
+ x: Float64Array;
4
+ /** NaN where the value is missing */
5
+ y: Float64Array;
6
+ size: Float32Array | null;
7
+ colors: (string | undefined)[] | null;
8
+ labels: (string | undefined)[] | null;
9
+ count: number;
10
+ /** x is non-decreasing (binary search, decimation) */
11
+ sorted: boolean;
12
+ /** Extent of the finite points (NaN when there is none) */
13
+ xMin: number;
14
+ xMax: number;
15
+ yMin: number;
16
+ yMax: number;
17
+ }
18
+ type XResolver = (value: ChartXValue, index: number) => number;
19
+ /** Converts an x value to a number for the axis type */
20
+ export declare const xResolver: (type: ChartAxisType, categoryIndex: (name: string) => number) => XResolver;
21
+ /** Category names used by string x values, in order of appearance */
22
+ export declare const collectCategories: (datas: readonly ChartSeriesData[]) => string[];
23
+ /** Turns any supported data form into columns */
24
+ export declare const normalizeData: (data: ChartSeriesData, resolveX: XResolver) => SeriesColumns;
25
+ /** First index whose x is >= value (sorted x) */
26
+ export declare const lowerBound: (x: ArrayLike<number>, count: number, value: number) => number;
27
+ /** Index of the point with the closest x and a finite y (sorted x), -1 if none */
28
+ export declare const nearestIndex: (x: ArrayLike<number>, y: ArrayLike<number>, count: number, value: number) => number;
29
+ export {};
@@ -0,0 +1,104 @@
1
+ //#region src/engine/data.ts
2
+ var e = (e) => typeof e == "object" && !!e && !("length" in e) && "y" in e, t = (e, t) => (n, r) => {
3
+ if (typeof n == "number") return n;
4
+ if (n instanceof Date) return n.getTime();
5
+ if (typeof n == "string") {
6
+ if (e === "category") return t(n);
7
+ if (e === "time") return Date.parse(n);
8
+ let i = Number(n);
9
+ return Number.isNaN(i) ? r : i;
10
+ }
11
+ return r;
12
+ }, n = (e) => typeof e == "number" ? e : e == null ? NaN : Number(e), r = (t) => {
13
+ let n = /* @__PURE__ */ new Set(), r = (e) => {
14
+ typeof e == "string" && n.add(e);
15
+ };
16
+ for (let n of t) {
17
+ if (e(n)) {
18
+ let e = n.x;
19
+ if (e && !ArrayBuffer.isView(e)) for (let t = 0; t < e.length; t++) r(e[t]);
20
+ continue;
21
+ }
22
+ let t = n;
23
+ for (let e = 0; e < t.length; e++) {
24
+ let n = t[e];
25
+ Array.isArray(n) ? r(n[0]) : n && typeof n == "object" && r(n.x);
26
+ }
27
+ }
28
+ return [...n];
29
+ }, i = (e, t, n, r) => {
30
+ let i = Infinity, a = -Infinity, o = Infinity, s = -Infinity, c = !0, l = -Infinity;
31
+ for (let r = 0; r < n; r++) {
32
+ let n = e[r];
33
+ if (!Number.isFinite(n)) {
34
+ t[r] = NaN;
35
+ continue;
36
+ }
37
+ n < l && (c = !1), l = n;
38
+ let u = t[r];
39
+ Number.isFinite(u) && (n < i && (i = n), n > a && (a = n), u < o && (o = u), u > s && (s = u));
40
+ }
41
+ let u = i > a;
42
+ return {
43
+ x: e,
44
+ y: t,
45
+ count: n,
46
+ sorted: c,
47
+ xMin: u ? NaN : i,
48
+ xMax: u ? NaN : a,
49
+ yMin: u ? NaN : o,
50
+ yMax: u ? NaN : s,
51
+ ...r
52
+ };
53
+ }, a = (t, r) => {
54
+ let a = {
55
+ size: null,
56
+ colors: null,
57
+ labels: null
58
+ };
59
+ if (e(t)) {
60
+ let e = t.y.length, o = new Float64Array(e), s = new Float64Array(e), c = t.x;
61
+ for (let i = 0; i < e; i++) s[i] = n(t.y[i]), o[i] = c ? r(c[i], i) : i;
62
+ let l = null;
63
+ if (t.size) {
64
+ l = new Float32Array(e);
65
+ for (let r = 0; r < e; r++) l[r] = n(t.size[r]);
66
+ }
67
+ return i(o, s, e, {
68
+ ...a,
69
+ size: l
70
+ });
71
+ }
72
+ let o = t, s = o.length, c = new Float64Array(s), l = new Float64Array(s), u = null, d = null, f = null;
73
+ for (let e = 0; e < s; e++) {
74
+ let t = o[e];
75
+ if (t == null || typeof t == "number") c[e] = e, l[e] = n(t);
76
+ else if (Array.isArray(t)) c[e] = r(t[0], e), l[e] = n(t[1]);
77
+ else if (typeof t == "object") {
78
+ let i = t;
79
+ c[e] = i.x === void 0 ? e : r(i.x, e), l[e] = n(i.y), i.size !== void 0 && (u ?? (u = new Float32Array(s).fill(NaN)), u[e] = i.size), i.color !== void 0 && (d ?? (d = Array(s)), d[e] = i.color), i.label !== void 0 && (f ?? (f = Array(s)), f[e] = i.label);
80
+ } else c[e] = e, l[e] = NaN;
81
+ }
82
+ return i(c, l, s, {
83
+ size: u,
84
+ colors: d,
85
+ labels: f
86
+ });
87
+ }, o = (e, t, n) => {
88
+ let r = 0, i = t;
89
+ for (; r < i;) {
90
+ let t = r + i >>> 1;
91
+ e[t] < n ? r = t + 1 : i = t;
92
+ }
93
+ return r;
94
+ }, s = (e, t, n, r) => {
95
+ if (n === 0) return -1;
96
+ let i = o(e, n, r), a = i - 1, s = i;
97
+ for (; a >= 0 && !Number.isFinite(t[a]);) a--;
98
+ for (; s < n && !Number.isFinite(t[s]);) s++;
99
+ return a < 0 ? s < n ? s : -1 : s >= n || r - e[a] <= e[s] - r ? a : s;
100
+ };
101
+ //#endregion
102
+ export { r as collectCategories, o as lowerBound, s as nearestIndex, a as normalizeData, t as xResolver };
103
+
104
+ //# sourceMappingURL=data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.js","names":["isColumns","data","xResolver","value","type","categoryIndex","n","index","toNumber","v","collectCategories","seen","add","datas","xs","i","list","item","finalize","xMin","xMax","yMin","yMax","sorted","prev","count","xi","x","yi","y","empty","extra","normalizeData","none","resolveX","size","colors","labels","d","lowerBound","lo","hi","mid","nearestIndex","left","right"],"sources":["../../../../charts/src/engine/data.ts"],"sourcesContent":["// Normalization of series data into columns (Float64Array).\n\nimport type { ChartAxisType, ChartSeriesData, ChartXValue } from \"./types\";\n\nexport interface SeriesColumns {\n x: Float64Array;\n /** NaN where the value is missing */\n y: Float64Array;\n size: Float32Array | null;\n colors: (string | undefined)[] | null;\n labels: (string | undefined)[] | null;\n count: number;\n /** x is non-decreasing (binary search, decimation) */\n sorted: boolean;\n /** Extent of the finite points (NaN when there is none) */\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n}\n\ntype XResolver = (value: ChartXValue, index: number) => number;\n\nconst isColumns = (\n data: ChartSeriesData,\n): data is {\n x?: ArrayLike<number> | readonly ChartXValue[];\n y: ArrayLike<number> | readonly (number | null)[];\n size?: ArrayLike<number>;\n} =>\n typeof data === \"object\" &&\n data !== null &&\n !(\"length\" in data) &&\n \"y\" in data;\n\n/** Converts an x value to a number for the axis type */\nexport const xResolver = (\n type: ChartAxisType,\n categoryIndex: (name: string) => number,\n): XResolver => {\n return (value, index) => {\n if (typeof value === \"number\") return value;\n if (value instanceof Date) return value.getTime();\n if (typeof value === \"string\") {\n if (type === \"category\") return categoryIndex(value);\n if (type === \"time\") return Date.parse(value);\n const n = Number(value);\n return Number.isNaN(n) ? index : n;\n }\n return index;\n };\n};\n\nconst toNumber = (v: unknown): number =>\n typeof v === \"number\" ? v : v === null || v === undefined ? NaN : Number(v);\n\n/** Category names used by string x values, in order of appearance */\nexport const collectCategories = (\n datas: readonly ChartSeriesData[],\n): string[] => {\n const seen = new Set<string>();\n const add = (v: unknown) => {\n if (typeof v === \"string\") seen.add(v);\n };\n for (const data of datas) {\n if (isColumns(data)) {\n const xs = data.x;\n if (xs && !ArrayBuffer.isView(xs)) {\n for (let i = 0; i < xs.length; i++) add(xs[i]);\n }\n continue;\n }\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < list.length; i++) {\n const item = list[i];\n if (Array.isArray(item)) add(item[0]);\n else if (item && typeof item === \"object\")\n add((item as { x?: unknown }).x);\n }\n }\n return [...seen];\n};\n\nconst finalize = (\n x: Float64Array,\n y: Float64Array,\n count: number,\n extra: Pick<SeriesColumns, \"size\" | \"colors\" | \"labels\">,\n): SeriesColumns => {\n let xMin = Infinity;\n let xMax = -Infinity;\n let yMin = Infinity;\n let yMax = -Infinity;\n let sorted = true;\n let prev = -Infinity;\n for (let i = 0; i < count; i++) {\n const xi = x[i];\n if (!Number.isFinite(xi)) {\n y[i] = NaN;\n continue;\n }\n if (xi < prev) sorted = false;\n prev = xi;\n const yi = y[i];\n if (!Number.isFinite(yi)) continue;\n if (xi < xMin) xMin = xi;\n if (xi > xMax) xMax = xi;\n if (yi < yMin) yMin = yi;\n if (yi > yMax) yMax = yi;\n }\n const empty = xMin > xMax;\n return {\n x,\n y,\n count,\n sorted,\n xMin: empty ? NaN : xMin,\n xMax: empty ? NaN : xMax,\n yMin: empty ? NaN : yMin,\n yMax: empty ? NaN : yMax,\n ...extra,\n };\n};\n\n/** Turns any supported data form into columns */\nexport const normalizeData = (\n data: ChartSeriesData,\n resolveX: XResolver,\n): SeriesColumns => {\n const none = { size: null, colors: null, labels: null };\n if (isColumns(data)) {\n const count = data.y.length;\n const x = new Float64Array(count);\n const y = new Float64Array(count);\n const xs = data.x;\n for (let i = 0; i < count; i++) {\n y[i] = toNumber(data.y[i]);\n x[i] = xs ? resolveX(xs[i] as ChartXValue, i) : i;\n }\n let size: Float32Array | null = null;\n if (data.size) {\n size = new Float32Array(count);\n for (let i = 0; i < count; i++) size[i] = toNumber(data.size[i]);\n }\n return finalize(x, y, count, { ...none, size });\n }\n\n const list = data as ArrayLike<unknown>;\n const count = list.length;\n const x = new Float64Array(count);\n const y = new Float64Array(count);\n let size: Float32Array | null = null;\n let colors: (string | undefined)[] | null = null;\n let labels: (string | undefined)[] | null = null;\n\n for (let i = 0; i < count; i++) {\n const item = list[i];\n if (item === null || item === undefined || typeof item === \"number\") {\n x[i] = i;\n y[i] = toNumber(item);\n } else if (Array.isArray(item)) {\n x[i] = resolveX(item[0] as ChartXValue, i);\n y[i] = toNumber(item[1]);\n } else if (typeof item === \"object\") {\n const d = item as {\n x?: ChartXValue;\n y?: number | null;\n size?: number;\n color?: string;\n label?: string;\n };\n x[i] = d.x === undefined ? i : resolveX(d.x, i);\n y[i] = toNumber(d.y);\n if (d.size !== undefined) {\n size ??= new Float32Array(count).fill(NaN);\n size[i] = d.size;\n }\n if (d.color !== undefined) {\n colors ??= new Array<string | undefined>(count);\n colors[i] = d.color;\n }\n if (d.label !== undefined) {\n labels ??= new Array<string | undefined>(count);\n labels[i] = d.label;\n }\n } else {\n x[i] = i;\n y[i] = NaN;\n }\n }\n return finalize(x, y, count, { size, colors, labels });\n};\n\n/** First index whose x is >= value (sorted x) */\nexport const lowerBound = (\n x: ArrayLike<number>,\n count: number,\n value: number,\n): number => {\n let lo = 0;\n let hi = count;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (x[mid] < value) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n};\n\n/** Index of the point with the closest x and a finite y (sorted x), -1 if none */\nexport const nearestIndex = (\n x: ArrayLike<number>,\n y: ArrayLike<number>,\n count: number,\n value: number,\n): number => {\n if (count === 0) return -1;\n const i = lowerBound(x, count, value);\n let left = i - 1;\n let right = i;\n while (left >= 0 && !Number.isFinite(y[left])) left--;\n while (right < count && !Number.isFinite(y[right])) right++;\n if (left < 0) return right < count ? right : -1;\n if (right >= count) return left;\n return value - x[left] <= x[right] - value ? left : right;\n};\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ var e=(e,t,n,r,i=1/0)=>{let a=new Float64Array(Math.max(0,n-t)*2),o=0,s=NaN,c=-1,l=-1,u=-1,d=-1,f=t=>{a[o*2]=e[t*2],a[o*2+1]=e[t*2+1],o++},p=()=>{if(c<0)return;f(c);let e=Math.min(l,u),t=Math.max(l,u);e!==c&&f(e),t!==e&&t!==c&&f(t),d!==t&&d!==e&&d!==c&&f(d),c=-1},m=e=>Number.isFinite(e)&&Math.abs(e)<i;for(let i=t;i<n;i++){let t=e[i*2],n=e[i*2+1];if(!m(t)||!m(n)){p(),s=NaN,o>0&&!Number.isNaN(a[o*2-1])&&(a[o*2]=t,a[o*2+1]=NaN,o++);continue}let f=Math.floor(r(t));f!==s||c<0?(p(),s=f,c=l=u=d=i):(n<e[l*2+1]&&(l=i),n>e[u*2+1]&&(u=i),d=i)}return p(),{points:a,length:o}};exports.decimateMinMax=e;
2
+ //# sourceMappingURL=decimate.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decimate.cjs","names":["decimateMinMax","out","end","start","length","col","first","min","max","last","push","points","i","flush","lo","hi","valid","v","gap","x","y","c","column"],"sources":["../../../../charts/src/engine/decimate.ts"],"sourcesContent":["// Min-max decimation: keeps the shape of a sorted line with at most four\n// points per pixel column (first, min, max, last).\n\nexport interface DecimatedLine {\n /** Interleaved x, y; NaN y marks a gap */\n points: Float64Array;\n /** Number of points */\n length: number;\n}\n\n/**\n * Decimates the points `[start, end)` of a line with sorted x, given as\n * interleaved `x, y` values. `column` maps an x value to its pixel column.\n * Missing values (NaN or `gap`) are kept as a single NaN point so the\n * gaps survive.\n */\nexport const decimateMinMax = (\n points: ArrayLike<number>,\n start: number,\n end: number,\n column: (x: number) => number,\n gap = Infinity,\n): DecimatedLine => {\n const out = new Float64Array(Math.max(0, end - start) * 2);\n let length = 0;\n let col = NaN;\n let first = -1;\n let min = -1;\n let max = -1;\n let last = -1;\n\n const push = (i: number) => {\n out[length * 2] = points[i * 2];\n out[length * 2 + 1] = points[i * 2 + 1];\n length++;\n };\n const flush = () => {\n if (first < 0) return;\n push(first);\n const lo = Math.min(min, max);\n const hi = Math.max(min, max);\n if (lo !== first) push(lo);\n if (hi !== lo && hi !== first) push(hi);\n if (last !== hi && last !== lo && last !== first) push(last);\n first = -1;\n };\n const valid = (v: number) => Number.isFinite(v) && Math.abs(v) < gap;\n\n for (let i = start; i < end; i++) {\n const x = points[i * 2];\n const y = points[i * 2 + 1];\n if (!valid(x) || !valid(y)) {\n flush();\n col = NaN;\n if (length > 0 && !Number.isNaN(out[length * 2 - 1])) {\n out[length * 2] = x;\n out[length * 2 + 1] = NaN;\n length++;\n }\n continue;\n }\n const c = Math.floor(column(x));\n if (c !== col || first < 0) {\n flush();\n col = c;\n first = min = max = last = i;\n } else {\n if (y < points[min * 2 + 1]) min = i;\n if (y > points[max * 2 + 1]) max = i;\n last = i;\n }\n }\n flush();\n return { points: out, length };\n};\n"],"mappings":"AAgBA,IAAaA,GACX,EACA,EACA,EACA,EACA,EAAM,MACY,CAClB,IAAMC,EAAM,IAAI,aAAa,KAAK,IAAI,EAAGC,EAAMC,CAAK,EAAI,CAAC,EACrDC,EAAS,EACTC,EAAM,IACNC,EAAQ,GACRC,EAAM,GACNC,EAAM,GACNC,EAAO,GAELC,EAAQ,GAAc,CAC1B,EAAIN,EAAS,GAAKO,EAAOC,EAAI,GAC7B,EAAIR,EAAS,EAAI,GAAKO,EAAOC,EAAI,EAAI,GACrC,GACF,EACMC,MAAc,CAClB,GAAIP,EAAQ,EAAG,OACfI,EAAKJ,CAAK,EACV,IAAMQ,EAAK,KAAK,IAAIP,EAAKC,CAAG,EACtBO,EAAK,KAAK,IAAIR,EAAKC,CAAG,EACxBM,IAAOR,GAAOI,EAAKI,CAAE,EACrBC,IAAOD,GAAMC,IAAOT,GAAOI,EAAKK,CAAE,EAClCN,IAASM,GAAMN,IAASK,GAAML,IAASH,GAAOI,EAAKD,CAAI,EAC3D,EAAQ,EACV,EACMO,EAAS,GAAc,OAAO,SAASC,CAAC,GAAK,KAAK,IAAIA,CAAC,EAAIC,EAEjE,IAAK,IAAI,EAAIf,EAAO,EAAID,EAAK,IAAK,CAChC,IAAMiB,EAAIR,EAAO,EAAI,GACfS,EAAIT,EAAO,EAAI,EAAI,GACzB,GAAI,CAACK,EAAMG,CAAC,GAAK,CAACH,EAAMI,CAAC,EAAG,CAC1BP,EAAM,EACN,EAAM,IACFT,EAAS,GAAK,CAAC,OAAO,MAAMH,EAAIG,EAAS,EAAI,EAAE,IACjD,EAAIA,EAAS,GAAKe,EAClB,EAAIf,EAAS,EAAI,GAAK,IACtB,KAEF,QACF,CACA,IAAMiB,EAAI,KAAK,MAAMC,EAAOH,CAAC,CAAC,EAC1BE,IAAMhB,GAAOC,EAAQ,GACvBO,EAAM,EACN,EAAMQ,EACN,EAAQ,EAAM,EAAM,EAAO,IAEvBD,EAAIT,EAAOJ,EAAM,EAAI,KAAI,EAAM,GAC/Ba,EAAIT,EAAOH,EAAM,EAAI,KAAI,EAAM,GACnC,EAAO,EAEX,CAEA,OADAK,EAAM,EACC,CAAE,OAAQZ,EAAK,QAAO,CAC/B"}