minerva-design 1.17.2 → 1.19.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 (98) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/custom-elements.json +10 -6
  3. package/dist/angular/fesm2022/minerva-angular.mjs +173 -70
  4. package/dist/angular/fesm2022/minerva-angular.mjs.map +1 -1
  5. package/dist/angular/types/minerva-angular.d.ts +33 -21
  6. package/dist/charts/core.cjs +1 -1
  7. package/dist/charts/core.d.cts +1 -0
  8. package/dist/charts/core.d.ts +1 -0
  9. package/dist/charts/core.js +22 -21
  10. package/dist/charts/engine/chart.cjs +1 -1
  11. package/dist/charts/engine/chart.cjs.map +1 -1
  12. package/dist/charts/engine/chart.js +414 -376
  13. package/dist/charts/engine/chart.js.map +1 -1
  14. package/dist/charts/engine/overlay.cjs +1 -1
  15. package/dist/charts/engine/overlay.cjs.map +1 -1
  16. package/dist/charts/engine/overlay.d.cts +5 -0
  17. package/dist/charts/engine/overlay.d.ts +5 -0
  18. package/dist/charts/engine/overlay.js +94 -69
  19. package/dist/charts/engine/overlay.js.map +1 -1
  20. package/dist/charts/engine/quadrant-card.cjs +2 -0
  21. package/dist/charts/engine/quadrant-card.cjs.map +1 -0
  22. package/dist/charts/engine/quadrant-card.d.cts +83 -0
  23. package/dist/charts/engine/quadrant-card.d.ts +83 -0
  24. package/dist/charts/engine/quadrant-card.js +154 -0
  25. package/dist/charts/engine/quadrant-card.js.map +1 -0
  26. package/dist/charts/engine/scene.cjs +1 -1
  27. package/dist/charts/engine/scene.cjs.map +1 -1
  28. package/dist/charts/engine/scene.d.cts +5 -0
  29. package/dist/charts/engine/scene.d.ts +5 -0
  30. package/dist/charts/engine/scene.js +32 -32
  31. package/dist/charts/engine/scene.js.map +1 -1
  32. package/dist/charts/engine/types.d.cts +14 -0
  33. package/dist/charts/engine/types.d.ts +14 -0
  34. package/dist/charts/index.cjs +1 -1
  35. package/dist/charts/index.js +28 -27
  36. package/dist/charts/react/Chart.cjs +1 -1
  37. package/dist/charts/react/Chart.cjs.map +1 -1
  38. package/dist/charts/react/Chart.d.cts +4 -2
  39. package/dist/charts/react/Chart.d.ts +4 -2
  40. package/dist/charts/react/Chart.js +42 -42
  41. package/dist/charts/react/Chart.js.map +1 -1
  42. package/dist/charts/react/charts.cjs +1 -1
  43. package/dist/charts/react/charts.cjs.map +1 -1
  44. package/dist/charts/react/charts.js +395 -391
  45. package/dist/charts/react/charts.js.map +1 -1
  46. package/dist/charts/react/types.d.cts +8 -2
  47. package/dist/charts/react/types.d.ts +8 -2
  48. package/dist/core/contracts.cjs +1 -1
  49. package/dist/core/contracts.cjs.map +1 -1
  50. package/dist/core/contracts.js +1 -1
  51. package/dist/core/contracts.js.map +1 -1
  52. package/dist/native/charts/src/engine/overlay.cjs +1 -1
  53. package/dist/native/charts/src/engine/overlay.cjs.map +1 -1
  54. package/dist/native/charts/src/engine/overlay.js +89 -65
  55. package/dist/native/charts/src/engine/overlay.js.map +1 -1
  56. package/dist/native/charts/src/engine/scene.cjs +1 -1
  57. package/dist/native/charts/src/engine/scene.cjs.map +1 -1
  58. package/dist/native/charts/src/engine/scene.js +32 -32
  59. package/dist/native/charts/src/engine/scene.js.map +1 -1
  60. package/dist/react/components/QuadrantTaskBoard/QuadrantTaskBoard.cjs +1 -1
  61. package/dist/react/components/QuadrantTaskBoard/QuadrantTaskBoard.cjs.map +1 -1
  62. package/dist/react/components/QuadrantTaskBoard/QuadrantTaskBoard.js +14 -8
  63. package/dist/react/components/QuadrantTaskBoard/QuadrantTaskBoard.js.map +1 -1
  64. package/dist/react/components/QuadrantTaskBoard/quadrantTaskBoard.module.scss.cjs +1 -1
  65. package/dist/react/components/QuadrantTaskBoard/quadrantTaskBoard.module.scss.cjs.map +1 -1
  66. package/dist/react/components/QuadrantTaskBoard/quadrantTaskBoard.module.scss.js +16 -15
  67. package/dist/react/components/QuadrantTaskBoard/quadrantTaskBoard.module.scss.js.map +1 -1
  68. package/dist/react/style.css +1 -1
  69. package/dist/react/styles/quadrant-task-board.css +1 -1
  70. package/dist/taro/index.js +1521 -1496
  71. package/dist/taro/style.css +22 -0
  72. package/dist/uni/manifest.d.ts +34 -34
  73. package/dist/uni/manifest.js +34 -39
  74. package/dist/uni/style.css +22 -0
  75. package/dist/vue/components/Chart/QuadrantChart.vue.d.ts +4 -3
  76. package/dist/vue/components/Chart/QuadrantChart.vue.js.map +1 -1
  77. package/dist/vue/components/Chart/QuadrantChart.vue_vue_type_script_setup_true_lang.js +186 -142
  78. package/dist/vue/components/Chart/QuadrantChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  79. package/dist/vue/components/Chart/cartesian.d.ts +5 -1
  80. package/dist/vue/components/Chart/cartesian.js +2 -0
  81. package/dist/vue/components/Chart/cartesian.js.map +1 -1
  82. package/dist/vue/components/QuadrantTaskBoard/QuadrantTaskBoard.vue.js.map +1 -1
  83. package/dist/vue/components/QuadrantTaskBoard/QuadrantTaskBoard.vue_vue_type_script_setup_true_lang.js +18 -12
  84. package/dist/vue/components/QuadrantTaskBoard/QuadrantTaskBoard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  85. package/dist/weapp/charts/canvas.js +48 -11
  86. package/dist/weapp/controls.wxss +22 -0
  87. package/dist/web-components/components/chart/chart.d.ts +4 -1
  88. package/dist/web-components/components/chart/chart.js +3 -1
  89. package/dist/web-components/components/chart/chart.js.map +1 -1
  90. package/dist/web-components/components/chart/charts.d.ts +34 -14
  91. package/dist/web-components/components/chart/charts.js +145 -98
  92. package/dist/web-components/components/chart/charts.js.map +1 -1
  93. package/dist/web-components/components/quadrant-task-board/quadrant-task-board.d.ts +8 -8
  94. package/dist/web-components/components/quadrant-task-board/quadrant-task-board.js +16 -12
  95. package/dist/web-components/components/quadrant-task-board/quadrant-task-board.js.map +1 -1
  96. package/dist/web-components/styles/QuadrantTaskBoard/quadrantTaskBoard.css.js +1 -1
  97. package/dist/web-components/styles/QuadrantTaskBoard/quadrantTaskBoard.css.js.map +1 -1
  98. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"chart.js","names":["styleElement","assign","mid","r","withRect","a","b","x","y","copyView","v","createChart","doc","container","win","dom","createChartDom","cache","hidden","listeners","options","initialOptions","theme","readTheme","model","view","zoomed","origin","items","itemsDirty","version","annotations","dependencies","scales","xTicks","yTicks","y2Ticks","renderer","rendererToken","destroyed","frameId","hover","lastPlot","pointDrag","dragEls","settling","clearDragOnFrame","placedLabels","labelChip","labelChipBox","drag","markers","bands","cells","guides","lifts","liftClip","veil","legendCaret","cellKey","themeVersion","itemsSignatureKey","legendKey","shownMarks","shownTip","resolveReady","ready","resolve","emit","type","listener","event","interactionOf","interactionValue","interaction","value","o","tooltipOptions","invalidate","frame","rebuild","buildModel","zoom","clampRange","base","minSpan","sameRange","signature","itemsSignature","index","resolveAnnotations","resolveDependencies","renderLegend","updateAccessibility","ensureOrigin","far","legendOption","named","s","show","legendShown","config","toggle","bottom","colors","colorLegend","key","l","legendShape","focused","ramp","first","last","bar","tick","text","el","item","swatch","chartAriaLabel","keyboard","sizeCanvas","w","width","dpr","h","height","canvas","transformFor","scale","range","offset","reverse","bg","fg","font","layout","layoutChart","rect","plotRect","drawBackground","drawForeground","collectPointLabels","connectorSegments","dependencyArrows","transposed","cw","plot","ch","bw","bh","density","cellStyleKey","buildItems","xScale","xOffset","yScale","yOffset","renderHover","hideDrag","renderDrag","hitAt","hitTest","px","py","p","draggableAt","it","setHover","changed","sameHover","next","tooltipNode","custom","content","tooltipContent","fragment","header","sub","swatches","row","grid","cell","n","pooled","pool","i","make","parent","sc","renderMarks","tip","hoverRect","tooltipObstacles","markerCount","bandCount","cellCount","guideCount","liftCount","veiled","renderLegendCaret","guide","crosshairAt","line","marks","hoverMarks","lifted","mark","createBand","mixed","series","liftParent","PLOT_BACKGROUND","prefersReducedMotion","prev","fresh","liftedBarRect","vertical","ring","shadow","liftShadow","thick","k","CELL_LIFT","CELL_ACCENT","playLift","prevMarker","freshMarker","createMarker","markerHalo","caret","heatPosition","renderLabelChip","found","pointOf","label","createLabelPill","d","showDrag","dragPreview","createDragDot","createDragPlaceholder","createDropTarget","dot","dragDotShadow","right","pill","live","size","placeholder","target","onDragKey","cancelDrag","releasePointer","id","setViewInternal","notify","viewToValues","zoomAt","at","toData","zoomRange","factor","localPoint","inPlot","dataAt","cx","cy","fromPlotX","fromPlotY","onPointerMove","dx","dy","from","to","panRange","event2","onPointerDown","draggable","onPointerUp","hit","moved","onPointerLeave","onWheel","modifier","wheelFactor","onDoubleClick","resetZoom","moveFocus","current","step","lowerBound","count","current2","span","createScales","leadItem","hoverItemOf","onKeyDown","center","onFocus","visible","onBlur","stage","resizeObserver","refreshTheme","themeColorsChanged","themeTooltip","unwatchTheme","watchTheme","unwatchLocale","watchLocale","initRenderer","token","createRenderer","createDataCanvas","kind","exclude","unfollowDefault","followDefaultRenderer","previous","viewFromValues","toScreen","toPlotX","toPlotY","set","releaseTooltip"],"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 createBand,\n createChartDom,\n createDataCanvas,\n createDragDot,\n createDragPlaceholder,\n createDropTarget,\n createLabelPill,\n createMarker,\n CELL_ACCENT,\n CELL_LIFT,\n dragDotShadow,\n liftShadow,\n markerHalo,\n PLOT_BACKGROUND,\n playLift,\n styleElement,\n swatch,\n} from \"./dom\";\nimport { dragPreview, type DragPreview } from \"./drag-preview\";\nimport { hoverRect, tooltipObstacles } from \"./hover-rect\";\nimport {\n buildItems,\n cellStyleKey,\n type Origin,\n type PixelDensity,\n} from \"./items\";\nimport { chartAriaLabel } from \"./labels\";\nimport {\n createScales,\n toData,\n toScreen,\n type Rect,\n type Scales,\n} from \"./layout\";\nimport { watchLocale } from \"./locale\";\nimport {\n buildModel,\n fromPlotX,\n fromPlotY,\n heatPosition,\n toPlotX,\n toPlotY,\n viewFromValues,\n viewToValues,\n type ChartModel,\n type DataCache,\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 { followDefaultRenderer } from \"./renderers/follow\";\nimport type { ChartRenderer, RenderItem } from \"./renderers/types\";\nimport {\n collectPointLabels,\n colorLegend,\n connectorSegments,\n crosshairAt,\n dependencyArrows,\n hitTest,\n hoverItemOf,\n hoverMarks,\n layoutChart,\n legendShape,\n legendShown,\n liftedBarRect,\n pointOf,\n resolveAnnotations,\n resolveDependencies,\n sameHover,\n tooltipContent,\n type ResolvedDependency,\n} from \"./scene\";\nimport { itemsSignature } from \"./signature\";\nimport {\n readTheme,\n themeColorsChanged,\n watchTheme,\n type ChartTheme,\n} from \"./theme\";\nimport {\n positionTooltip,\n prefersReducedMotion,\n releaseTooltip,\n themeTooltip,\n} from \"./tooltip\";\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;\n/** The box around two boxes (either may be missing) */\nconst withRect = (a: Rect | null, b: Rect | null): Rect | null => {\n if (!a || !b) return a ?? b;\n const x = Math.min(a.x, b.x);\n const y = Math.min(a.y, b.y);\n return {\n x,\n y,\n width: Math.max(a.x + a.width, b.x + b.width) - x,\n height: Math.max(a.y + a.height, b.y + b.height) - y,\n };\n};\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 WebGL, 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 themeTooltip(dom.tooltip, theme);\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 dependencies: ResolvedDependency[] = [];\n let scales: Scales | null = null;\n let xTicks: AxisTicks | null = null;\n let yTicks: AxisTicks | null = null;\n let y2Ticks: 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 /** Where the pointer went down */\n x: number;\n y: number;\n /** Where the pointer is */\n px: number;\n py: number;\n moved: boolean;\n } | null = null;\n /** Elements of the drag preview, created on the first drag */\n let dragEls: {\n dot: HTMLDivElement;\n pill: HTMLDivElement;\n placeholder: HTMLDivElement;\n target: HTMLDivElement;\n } | null = null;\n /**\n * A dropped point stays where it was released until the new data is\n * drawn (or briefly, when the drop is not applied)\n */\n let settling: {\n item: ChartHoverItem;\n timer: ReturnType<typeof setTimeout>;\n } | null = null;\n let clearDragOnFrame = false;\n /** Point labels drawn on the foreground (for the hovered label chip) */\n let placedLabels: { label: PointLabel; box: Rect }[] = [];\n let labelChip: HTMLDivElement | null = null;\n /** Where the label chip is shown (the tooltip keeps off it) */\n let labelChipBox: Rect | 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 bands: HTMLDivElement[] = [];\n const cells: HTMLDivElement[] = [];\n const guides: HTMLDivElement[] = [];\n /** Lifted hovered bars, in `liftClip` */\n const lifts: HTMLDivElement[] = [];\n /** Clips the lifted bars to the plot, like the data layer */\n let liftClip: HTMLDivElement | null = null;\n /** Dims the plot behind lifted bars (focus on the hovered one) */\n let veil: HTMLDivElement | null = null;\n /** Hover caret of the color legend (heatmaps) */\n let legendCaret: HTMLDivElement | null = null;\n let cellKey = \"\";\n let themeVersion = 0;\n let itemsSignatureKey = \"\";\n let legendKey = \"\";\n /** What the hover layer shows: kept while the hovered points are the same */\n let shownMarks: {\n event: ChartHoverEvent;\n model: ChartModel;\n scales: Scales;\n } | null = null;\n let shownTip: {\n event: ChartHoverEvent;\n model: ChartModel;\n yTicks: AxisTicks | null;\n width: number;\n height: number;\n } | null = null;\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 let interactionOf: ChartOptions | null = null;\n let interactionValue: Required<ChartInteractionOptions> | null = null;\n /** Resolved `interaction` option (cached: read on every pointer move) */\n const interaction = (): Required<ChartInteractionOptions> | null => {\n if (interactionOf === options) return interactionValue;\n interactionOf = options;\n const value = options.interaction;\n if (value === false) return (interactionValue = null);\n const o = typeof value === \"object\" ? value : {};\n return (interactionValue = {\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 dropTargets: o.dropTargets ?? false,\n dragLabel: o.dragLabel ?? 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 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 = itemsSignature(\n model,\n themeVersion,\n (index) => options.series[index]?.stack,\n );\n if (signature !== itemsSignatureKey) {\n itemsSignatureKey = signature;\n origin = { x: mid(base.x), y: mid(base.y) };\n itemsDirty = true;\n if (hover && !hover.keyboard) {\n hover = null;\n // listeners tracking the hovered point (an info card shown while\n // nothing is hovered) would otherwise keep the old one\n emit(\"hover\", null);\n }\n }\n // new data after a drop: the dropped point is drawn where it landed\n if (settling) {\n clearTimeout(settling.timer);\n settling = null;\n clearDragOnFrame = true;\n }\n annotations = resolveAnnotations(\n options.annotations,\n theme,\n model.y.type === \"log\" ? Math.log10 : undefined,\n model.x.type === \"log\" ? Math.log10 : undefined,\n );\n dependencies = resolveDependencies(options.dependencies, 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 = legendShown(legendOption, model, named);\n const config = typeof legendOption === \"object\" ? legendOption : {};\n const toggle = config.toggle ?? true;\n const bottom = config.position === \"bottom\";\n const colors = show ? colorLegend(model) : null;\n // rebuild the DOM only when what it shows changed\n let key = `${show}|${bottom}|${toggle}`;\n if (colors) {\n key += `\\n${colors.stops.join(\";\")}|${colors.labels.map((l) => l.text).join(\";\")}`;\n } else if (show) {\n for (const s of model.series)\n key += `\\n${s.id}\\u0001${s.name}\\u0001${s.colorCss}\\u0001${legendShape(s.type)}\\u0001${s.hidden}`;\n }\n if (key === legendKey) return;\n legendKey = key;\n const focused = [...dom.legend.children].indexOf(\n doc.activeElement as Element,\n );\n dom.legend.replaceChildren();\n legendCaret = null;\n dom.legend.style.display = show ? \"flex\" : \"none\";\n if (!show) return;\n dom.legend.style.order = bottom ? \"1\" : \"0\";\n dom.legend.style.padding = bottom ? \"8px 4px 0\" : \"0 4px 8px\";\n if (colors) {\n // visual map: the ramp with its values, the hovered value marked\n dom.legend.style.justifyContent = \"flex-end\";\n const ramp = doc.createElement(\"div\");\n styleElement(ramp, {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n color: \"var(--text-secondary-color, #6b7280)\",\n fontSize: \"11px\",\n fontVariantNumeric: \"tabular-nums\",\n });\n const first = colors.labels[0];\n const last = colors.labels[colors.labels.length - 1];\n const bar = doc.createElement(\"div\");\n styleElement(bar, {\n position: \"relative\",\n width: \"160px\",\n height: \"8px\",\n borderRadius: \"4px\",\n background: `linear-gradient(to right, ${colors.stops.join(\", \")})`,\n boxShadow:\n \"inset 0 0 0 1px color-mix(in srgb, var(--text-color, #1f2937) 8%, transparent)\",\n });\n if (colors.labels.length > 2) {\n const tick = doc.createElement(\"div\");\n styleElement(tick, {\n position: \"absolute\",\n left: \"50%\",\n top: \"-2px\",\n width: \"1px\",\n height: \"12px\",\n background:\n \"color-mix(in srgb, var(--text-color, #1f2937) 35%, transparent)\",\n });\n bar.appendChild(tick);\n }\n legendCaret = doc.createElement(\"div\");\n styleElement(legendCaret, {\n position: \"absolute\",\n top: \"-3px\",\n width: \"4px\",\n height: \"14px\",\n marginLeft: \"-2px\",\n borderRadius: \"2px\",\n background: \"var(--text-color, #1f2937)\",\n boxShadow:\n \"0 0 0 1.5px var(--surface-color, var(--background-color, #fff))\",\n display: \"none\",\n });\n bar.appendChild(legendCaret);\n const text = (value: string) => {\n const el = doc.createElement(\"span\");\n el.textContent = value;\n return el;\n };\n ramp.append(text(first?.text ?? \"\"), bar, text(last?.text ?? \"\"));\n dom.legend.appendChild(ramp);\n return;\n }\n dom.legend.style.justifyContent = \"\";\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(doc, s.colorCss, legendShape(s.type)),\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 dom.stage.setAttribute(\n \"aria-label\",\n options.ariaLabel ?? chartAriaLabel(model),\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 y2Ticks = layout.y2Ticks;\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 y2: model.y2,\n y2Ticks,\n theme,\n annotations,\n });\n }\n if (fg) {\n fg.setTransform(dpr, 0, 0, dpr, 0, 0);\n placedLabels = drawForeground(fg, {\n width,\n height,\n scales,\n theme,\n annotations,\n pointLabels: collectPointLabels(\n model,\n view,\n scales,\n yTicks,\n theme.background,\n // the label of a dragged point follows it (in the drag pill)\n pointDrag?.moved ? pointDrag.item : (settling?.item ?? null),\n ),\n connectors: connectorSegments(model, scales),\n arrows: dependencyArrows(model, scales, dependencies),\n });\n }\n\n if (renderer) {\n const canvas = renderer.canvas;\n // horizontal charts: the data layer is drawn as a vertical chart on a\n // transposed canvas (its x axis runs down the plot, its y axis right)\n const transposed = model.horizontal;\n const cw = transposed ? plot.height : plot.width;\n const ch = transposed ? plot.width : plot.height;\n styleElement(canvas, {\n left: `${plot.x}px`,\n top: `${plot.y}px`,\n width: `${cw}px`,\n height: `${ch}px`,\n transformOrigin: transposed ? \"0 0\" : \"\",\n transform: transposed ? \"matrix(0, 1, 1, 0, 0, 0)\" : \"\",\n });\n const bw = Math.max(1, Math.round(cw * dpr));\n const bh = Math.max(1, Math.round(ch * dpr));\n if (canvas.width !== bw || canvas.height !== bh) renderer.resize(bw, bh);\n ensureOrigin();\n // heatmap cells: their gaps and corners follow their size on screen\n const density: PixelDensity = {\n x: 1 / Math.abs(scales.xPerPx),\n y: 1 / Math.abs(scales.yPerPx),\n };\n const key = cellStyleKey(model, density);\n if (key !== cellKey) {\n cellKey = key;\n itemsDirty = true;\n }\n if (itemsDirty) {\n version++;\n items = buildItems(model, origin, version, density);\n itemsDirty = false;\n }\n const [xScale, xOffset] = transformFor(view.x, origin.x, model.x.reverse);\n const [yScale, yOffset] = transformFor(\n view.y,\n origin.y,\n // the top of the transposed canvas is the left of the plot\n transposed ? !model.y.reverse : model.y.reverse,\n );\n renderer.render(items, {\n transform: { xScale, xOffset, yScale, yOffset },\n width: bw,\n height: bh,\n dpr,\n });\n }\n renderHover();\n if (clearDragOnFrame) {\n clearDragOnFrame = false;\n if (!pointDrag?.moved) hideDrag();\n } else if (pointDrag?.moved) renderDrag();\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, y2Ticks);\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: content.subtitle ? \"0\" : \"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 if (content.subtitle) {\n const sub = doc.createElement(\"div\");\n styleElement(sub, {\n color: \"var(--text-secondary-color, #6b7280)\",\n fontSize: \"11px\",\n margin: \"1px 0 6px\",\n paddingLeft: content.titleColor ? \"14px\" : \"0\",\n });\n sub.textContent = content.subtitle;\n fragment.append(sub);\n }\n if (!content.rows.length) return fragment;\n // a label column and a value column (right-aligned, tabular figures)\n const swatches = content.rows.some((row) => row.color);\n const grid = doc.createElement(\"div\");\n styleElement(grid, {\n display: \"grid\",\n gridTemplateColumns: swatches\n ? \"auto minmax(0, 1fr) auto\"\n : \"minmax(0, 1fr) auto\",\n columnGap: \"0\",\n rowGap: \"2px\",\n alignItems: \"center\",\n });\n for (const row of content.rows) {\n if (swatches) {\n const cell = doc.createElement(\"span\");\n styleElement(cell, {\n display: \"inline-flex\",\n width: \"14px\",\n justifyContent: \"flex-start\",\n });\n if (row.color) cell.appendChild(swatch(doc, row.color, \"dot\"));\n grid.appendChild(cell);\n }\n const n = doc.createElement(\"span\");\n styleElement(n, {\n color: \"var(--text-secondary-color, #6b7280)\",\n paddingRight: \"16px\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n });\n n.textContent = row.name;\n const v = doc.createElement(\"span\");\n styleElement(v, {\n fontWeight: \"600\",\n fontVariantNumeric: \"tabular-nums\",\n textAlign: \"right\",\n color: \"var(--text-color, #1f2937)\",\n });\n v.textContent = row.value;\n grid.append(n, v);\n }\n fragment.append(grid);\n return fragment;\n };\n\n const pooled = <T extends HTMLElement>(\n pool: T[],\n i: number,\n make: () => T,\n parent: HTMLElement = dom.hover,\n ) => {\n if (!pool[i]) {\n pool[i] = make();\n parent.appendChild(pool[i]);\n }\n pool[i].style.display = \"block\";\n return pool[i];\n };\n\n function renderHover() {\n const sc = scales;\n const marksShown =\n !!hover &&\n !!sc &&\n !!shownMarks &&\n shownMarks.scales === sc &&\n shownMarks.model === model &&\n sameHover(shownMarks.event, hover.event);\n // pointer moves over the same points: the markers stay where they are\n if (!marksShown) renderMarks(sc);\n\n const tip = dom.tooltip;\n if (!hover || !sc || !tooltipOptions() || drag?.moved || pointDrag?.moved) {\n tip.style.display = \"none\";\n return;\n }\n const custom = tooltipOptions()?.render;\n let w: number;\n let h: number;\n if (\n !custom &&\n shownTip &&\n shownTip.model === model &&\n shownTip.yTicks === yTicks &&\n sameHover(shownTip.event, hover.event) &&\n tip.style.display === \"block\"\n ) {\n // same content: only the position follows the pointer\n w = shownTip.width;\n h = shownTip.height;\n } else {\n shownTip = null;\n const content = tooltipNode(hover.event);\n if (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 w = tip.offsetWidth;\n h = tip.offsetHeight;\n if (!custom)\n shownTip = { event: hover.event, model, yTicks, width: w, height: h };\n }\n // off the hovered marks: beside them, above / below the rows of\n // horizontal charts (Gantt tasks), off the other bars of those\n positionTooltip(tip, dom.stage, {\n anchor: { x: hover.anchorX, y: hover.anchorY },\n avoid: withRect(hoverRect(model, sc, hover.event), labelChipBox),\n obstacles: tooltipObstacles(model, sc),\n prefer: sc.horizontal ? \"vertical\" : \"side\",\n size: { width: w, height: h },\n animate: true,\n });\n }\n\n /** Crosshair, point markers, bar bands, lifted bars and heatmap cells */\n function renderMarks(sc: Scales | null) {\n let markerCount = 0;\n let bandCount = 0;\n let cellCount = 0;\n let guideCount = 0;\n let liftCount = 0;\n let veiled = false;\n renderLegendCaret();\n shownMarks = null;\n dom.crosshair.style.display = \"none\";\n if (hover && sc) {\n shownMarks = { event: hover.event, model, scales: 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 guide = crosshairAt(model, sc, hover.event, options.crosshair);\n if (guide !== null) {\n const line =\n \"1px dashed color-mix(in srgb, var(--text-secondary-color, #6b7280) 45%, transparent)\";\n styleElement(\n dom.crosshair,\n sc.horizontal\n ? {\n display: \"block\",\n left: `${plot.x}px`,\n top: `${Math.round(guide)}px`,\n width: `${plot.width}px`,\n height: \"0\",\n borderLeft: \"0\",\n borderTop: line,\n }\n : {\n display: \"block\",\n left: `${Math.round(guide)}px`,\n top: `${plot.y}px`,\n width: \"0\",\n height: `${plot.height}px`,\n borderLeft: line,\n borderTop: \"0\",\n },\n );\n }\n const marks = hoverMarks(model, sc, hover.event);\n // behind lifted bars the band only gives the context: lighter\n const lifted = marks.some((mark) => mark.kind === \"bar\");\n for (const mark of marks) {\n if (mark.kind === \"band\" || mark.kind === \"guide\") {\n const el =\n mark.kind === \"band\"\n ? pooled(bands, bandCount++, () => createBand(doc), dom.underlay)\n : pooled(\n guides,\n guideCount++,\n () =>\n styleElement(createBand(doc), {\n borderRadius: \"0\",\n background:\n \"color-mix(in srgb, var(--text-color, #1f2937) 6%, transparent)\",\n }),\n dom.lift,\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 if (mark.kind === \"band\")\n el.style.background = `color-mix(in srgb, var(--text-color, #1f2937) ${lifted ? 4 : 6}%, transparent)`;\n continue;\n }\n if (mark.kind === \"bar\") {\n const mixed = model.series.some(\n (series) =>\n !series.hidden &&\n (series.type === \"line\" || series.type === \"area\"),\n );\n // combo charts: the lifted bar goes below the data layer, so the\n // lines (and their markers) stay above it; no veil either\n const liftParent = mixed ? dom.underlay : dom.lift;\n if (!liftClip) {\n liftClip = styleElement(doc.createElement(\"div\"), {\n position: \"absolute\",\n overflow: \"hidden\",\n }) as HTMLDivElement;\n }\n if (\n liftClip.parentElement !== liftParent ||\n (mixed && liftParent.lastElementChild !== liftClip)\n )\n liftParent.appendChild(liftClip);\n if (!veiled && !mixed) {\n veiled = true;\n if (!veil) {\n veil = styleElement(doc.createElement(\"div\"), {\n position: \"absolute\",\n background: `color-mix(in srgb, ${PLOT_BACKGROUND} 42%, transparent)`,\n opacity: \"0\",\n }) as HTMLDivElement;\n dom.lift.insertBefore(\n veil,\n liftClip.parentElement === dom.lift ? liftClip : null,\n );\n }\n styleElement(veil, {\n left: `${plot.x}px`,\n top: `${plot.y}px`,\n width: `${plot.width}px`,\n height: `${plot.height}px`,\n transition: prefersReducedMotion(win)\n ? \"none\"\n : \"opacity 140ms ease-out\",\n opacity: \"1\",\n });\n }\n styleElement(liftClip, {\n left: `${plot.x}px`,\n top: `${plot.y}px`,\n width: `${plot.width}px`,\n height: `${plot.height}px`,\n });\n const key = `${mark.seriesIndex}:${mark.index}`;\n const prev = lifts[liftCount];\n const fresh =\n !prev || prev.style.display !== \"block\" || prev.dataset.key !== key;\n const el = pooled(\n lifts,\n liftCount++,\n () => createBand(doc),\n liftClip,\n );\n el.dataset.key = key;\n const r = liftedBarRect(mark);\n const vertical = mark.base === \"top\" || mark.base === \"bottom\";\n const ring =\n mark.ring === null\n ? null\n : {\n color: mark.ring,\n // translucent bars: a stronger ring in their solid color\n width: Math.min(\n mark.backdrop ? 2 : 1.5,\n Math.max(0, (Math.min(r.width, r.height) - 2) / 4),\n ),\n };\n el.dataset.hoverMark = \"bar\";\n const shadow = ring ? liftShadow(ring, 1.5, null) : \"none\";\n styleElement(el, {\n left: `${r.x - plot.x}px`,\n top: `${r.y - plot.y}px`,\n width: `${r.width}px`,\n height: `${r.height}px`,\n borderRadius: `${mark.radius}px`,\n filter: \"brightness(1.08) saturate(1.08)\",\n background: mark.backdrop\n ? `linear-gradient(${mark.color}, ${mark.color}), ${PLOT_BACKGROUND}`\n : mark.color,\n boxShadow: shadow,\n });\n if (fresh) {\n // grows from the bar as drawn\n const thick = vertical ? r.width : r.height;\n const k = thick > 0 ? (thick - mark.grow * 2) / thick : 1;\n playLift(\n el,\n {\n transform: vertical ? `scaleX(${k})` : `scaleY(${k})`,\n ...(ring\n ? { boxShadow: liftShadow(ring, 1.5, null, true) }\n : {}),\n },\n { transform: \"none\", ...(ring ? { boxShadow: shadow } : {}) },\n win,\n );\n }\n continue;\n }\n if (mark.kind === \"cell\") {\n // the cell lifted above its neighbours (and below the labels):\n // a ring at its edge, a halo of the background and an accent line\n const key = `${mark.seriesIndex}:${mark.index}`;\n const prev = cells[cellCount];\n const fresh =\n !prev || prev.style.display !== \"block\" || prev.dataset.key !== key;\n const el = pooled(\n cells,\n cellCount++,\n () =>\n styleElement(createBand(doc), {\n zIndex: \"1\",\n transform: `scale(${CELL_LIFT})`,\n }),\n dom.lift,\n );\n el.dataset.key = key;\n const ring = {\n color: mark.ring,\n width: Math.min(2, Math.min(mark.width, mark.height) / 5),\n };\n const shadow = liftShadow(ring, 2, CELL_ACCENT);\n styleElement(el, {\n left: `${mark.x}px`,\n top: `${mark.y}px`,\n width: `${mark.width}px`,\n height: `${mark.height}px`,\n background: mark.color,\n borderRadius: `${Math.max(mark.radius, 2)}px`,\n boxShadow: shadow,\n });\n if (fresh)\n playLift(\n el,\n {\n transform: \"scale(1)\",\n boxShadow: liftShadow(ring, 2, CELL_ACCENT, true),\n },\n { transform: `scale(${CELL_LIFT})`, boxShadow: shadow },\n win,\n );\n continue;\n }\n const prevMarker = markers[markerCount];\n const freshMarker =\n !prevMarker ||\n prevMarker.style.display !== \"block\" ||\n prevMarker.style.left !== `${mark.x}px` ||\n prevMarker.style.top !== `${mark.y}px`;\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 boxShadow: markerHalo(mark.halo),\n });\n if (freshMarker)\n playLift(\n el,\n { transform: \"translate(-50%, -50%) scale(0.6)\", opacity: \"0.6\" },\n { transform: \"translate(-50%, -50%) scale(1)\", opacity: \"1\" },\n win,\n );\n }\n renderLabelChip(sc);\n } else if (labelChip) {\n labelChip.style.display = \"none\";\n labelChipBox = null;\n }\n for (let i = markerCount; i < markers.length; i++)\n markers[i].style.display = \"none\";\n for (let i = bandCount; i < bands.length; i++)\n bands[i].style.display = \"none\";\n for (let i = cellCount; i < cells.length; i++)\n cells[i].style.display = \"none\";\n for (let i = guideCount; i < guides.length; i++)\n guides[i].style.display = \"none\";\n for (let i = liftCount; i < lifts.length; i++)\n lifts[i].style.display = \"none\";\n if (veil && !veiled) veil.style.opacity = \"0\";\n }\n\n /** Marks the hovered heatmap value on the color legend */\n function renderLegendCaret() {\n const caret = legendCaret;\n if (!caret) return;\n const it = hover?.event.items[0];\n const s = it ? model.series[it.seriesIndex] : undefined;\n if (!it || !s || s.type !== \"heatmap\" || it.value === undefined) {\n caret.style.display = \"none\";\n return;\n }\n caret.style.display = \"block\";\n caret.style.left = `${(heatPosition(s, it.value) * 100).toFixed(2)}%`;\n }\n\n /** The label of a hovered dot, highlighted in a chip tinted with its color */\n function renderLabelChip(sc: Scales) {\n const it = hover?.event.items[0];\n const s = it ? model.series[it.seriesIndex] : undefined;\n let found: { label: PointLabel; box: Rect } | undefined;\n if (it && s?.type === \"scatter\" && it.label && !pointDrag?.moved) {\n const p = pointOf(s, it.index, sc);\n found = placedLabels.find(\n ({ label }) =>\n label.text === it.label &&\n Math.abs(label.x - p.px) < 0.5 &&\n Math.abs(label.y - p.py) < 0.5,\n );\n }\n labelChipBox = null;\n if (!found || !it) {\n if (labelChip) labelChip.style.display = \"none\";\n return;\n }\n if (!labelChip) {\n labelChip = createLabelPill(doc);\n labelChip.dataset.hoverMark = \"label\";\n dom.hover.appendChild(labelChip);\n }\n labelChip.textContent = found.label.text;\n styleElement(labelChip, {\n display: \"block\",\n left: `${found.box.x - 10}px`,\n top: `${found.box.y + found.box.height / 2}px`,\n transform: \"translateY(-50%)\",\n background: `color-mix(in srgb, ${it.color} 14%, var(--surface-color, var(--background-color, #fff)))`,\n borderColor: `color-mix(in srgb, ${it.color} 45%, transparent)`,\n boxShadow: \"0 4px 12px -4px rgba(15, 23, 42, 0.28)\",\n });\n // the canvas label, a little wider in bold, with the padding of the chip\n labelChipBox = {\n x: found.box.x - 10,\n y: found.box.y + found.box.height / 2 - 11,\n width: found.box.width * 1.1 + 20,\n height: 22,\n };\n }\n\n // ----------------------------------------------------------- point drag\n\n /** The dragged point under the pointer, its label, its origin and target */\n function renderDrag() {\n const d = pointDrag;\n const sc = scales;\n if (!d?.moved || !sc) return;\n showDrag(\n dragPreview(\n model,\n sc,\n annotations,\n d.item,\n d.px,\n d.py,\n !!interaction()?.dropTargets,\n ),\n true,\n );\n }\n\n function showDrag(p: DragPreview, live: boolean) {\n if (!dragEls) {\n dragEls = {\n dot: createDragDot(doc),\n pill: createLabelPill(doc),\n placeholder: createDragPlaceholder(doc),\n target: createDropTarget(doc),\n };\n dragEls.dot.dataset.dragMark = \"dot\";\n dragEls.pill.dataset.dragMark = \"label\";\n dragEls.placeholder.dataset.dragMark = \"origin\";\n dragEls.target.dataset.dragMark = \"target\";\n dom.underlay.appendChild(dragEls.target);\n dom.hover.append(dragEls.placeholder, dragEls.dot, dragEls.pill);\n }\n const { dot, pill, placeholder, target } = dragEls;\n dom.hover.style.width = `${dom.stage.clientWidth}px`;\n dom.hover.style.height = `${dom.stage.clientHeight}px`;\n styleElement(dot, {\n display: \"block\",\n left: `${p.x}px`,\n top: `${p.y}px`,\n width: `${p.size}px`,\n height: `${p.size}px`,\n background: p.color,\n boxShadow: dragDotShadow(p.color),\n });\n if (p.label && interaction()?.dragLabel !== false) {\n pill.textContent = p.label;\n const sc = scales;\n // beside the dot, on the side with room\n const right = !sc || p.x < sc.plot.x + sc.plot.width * 0.62;\n styleElement(pill, {\n display: \"block\",\n left: `${p.x}px`,\n top: `${p.y}px`,\n transform: right\n ? `translate(${p.size / 2 + 8}px, -50%)`\n : `translate(calc(-100% - ${p.size / 2 + 8}px), -50%)`,\n });\n } else pill.style.display = \"none\";\n if (live && p.origin) {\n const size = p.size - 2;\n styleElement(placeholder, {\n display: \"block\",\n left: `${p.origin.x}px`,\n top: `${p.origin.y}px`,\n width: `${size}px`,\n height: `${size}px`,\n borderColor: p.color,\n background: `color-mix(in srgb, ${PLOT_BACKGROUND} 62%, transparent)`,\n });\n } else placeholder.style.display = \"none\";\n if (live && p.target) {\n styleElement(target, {\n display: \"block\",\n left: `${p.target.x}px`,\n top: `${p.target.y}px`,\n width: `${p.target.width}px`,\n height: `${p.target.height}px`,\n background: `color-mix(in srgb, ${p.target.color} 12%, transparent)`,\n boxShadow: `inset 0 0 0 2px color-mix(in srgb, ${p.target.color} 70%, transparent)`,\n });\n } else target.style.display = \"none\";\n }\n\n function hideDrag() {\n if (!dragEls) return;\n for (const el of Object.values(dragEls)) el.style.display = \"none\";\n }\n\n const onDragKey = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\" || !pointDrag) return;\n event.preventDefault();\n event.stopPropagation();\n cancelDrag();\n };\n\n const releasePointer = (id: number) => {\n if (dom.stage.hasPointerCapture?.(id)) dom.stage.releasePointerCapture(id);\n };\n\n /** Ends a point drag without a drop (Escape, a cancelled pointer) */\n function cancelDrag() {\n const d = pointDrag;\n if (!d) return;\n pointDrag = null;\n win?.removeEventListener(\"keydown\", onDragKey, true);\n releasePointer(d.id);\n dom.stage.style.cursor = \"\";\n hideDrag();\n if (!d.moved) return;\n invalidate();\n emit(\"dragEnd\", { item: d.item, cancelled: true });\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\", viewToValues(model, 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 const at = toData(sc, px, py);\n if (model.zoom.x) next.x = zoomRange(view.x, at.x, factor);\n if (model.zoom.y) next.y = zoomRange(view.y, at.y, 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 const p = toData(sc, cx, cy);\n // values of the axes (not logarithms)\n return { x: fromPlotX(model, p.x), y: fromPlotY(model, p.y) };\n };\n\n const onPointerMove = (event: PointerEvent) => {\n const { x, y } = localPoint(event);\n if (pointDrag && pointDrag.id === event.pointerId) {\n const d = pointDrag;\n d.px = x;\n d.py = y;\n if (!d.moved && Math.hypot(x - d.x, y - d.y) > 3) {\n d.moved = true;\n dom.stage.setPointerCapture?.(event.pointerId);\n dom.stage.style.cursor = \"grabbing\";\n win?.addEventListener(\"keydown\", onDragKey, true);\n // a drop not yet applied: the new drag replaces it\n if (settling) {\n clearTimeout(settling.timer);\n settling = null;\n }\n setHover(null);\n // the foreground is drawn again without the label of the point\n invalidate();\n const at = dataAt(d.x, d.y);\n if (at) emit(\"dragStart\", { item: d.item, x: at.x, y: at.y });\n }\n if (d.moved && pointDrag === d) {\n // the point and its label follow the pointer at once, on the DOM\n renderDrag();\n const at = dataAt(x, y);\n if (at) emit(\"drag\", { item: d.item, x: at.x, y: at.y });\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 const from = toData(scales, drag.x, drag.y);\n const to = toData(scales, x, y);\n if (model.zoom.x) next.x = panRange(drag.view.x, from.x - to.x);\n if (model.zoom.y) next.y = panRange(drag.view.y, from.y - to.y);\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 = {\n id: event.pointerId,\n item: draggable,\n x,\n y,\n px: x,\n py: y,\n moved: false,\n };\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 d = pointDrag;\n const { x, y } = localPoint(event);\n if (d.moved && event.type === \"pointercancel\") {\n cancelDrag();\n return;\n }\n pointDrag = null;\n win?.removeEventListener(\"keydown\", onDragKey, true);\n releasePointer(event.pointerId);\n dom.stage.style.cursor = draggableAt(x, y) ? \"grab\" : \"\";\n if (d.moved) {\n d.px = x;\n d.py = y;\n const at = dataAt(x, y);\n const sc = scales;\n // the dot stays where it was released until the new data is drawn\n if (sc) {\n showDrag(\n dragPreview(model, sc, annotations, d.item, x, y, false),\n false,\n );\n if (settling) clearTimeout(settling.timer);\n settling = {\n item: d.item,\n timer: setTimeout(() => {\n settling = null;\n if (!pointDrag?.moved) hideDrag();\n invalidate();\n }, 320),\n };\n } else hideDrag();\n if (at) emit(\"drop\", { item: d.item, x: at.x, y: at.y });\n emit(\"dragEnd\", { item: d.item, cancelled: !at });\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 !scales.horizontal &&\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 model.horizontal,\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 if (model.horizontal) return;\n event.preventDefault();\n moveFocus((event.key === \"ArrowRight\") !== model.x.reverse ? 1 : -1);\n break;\n case \"ArrowDown\":\n case \"ArrowUp\":\n // horizontal charts: the x axis runs down\n if (!model.horizontal) return;\n event.preventDefault();\n moveFocus((event.key === \"ArrowDown\") !== 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 const next = readTheme(dom.root, options.palette);\n // the watcher fires on any class / style change of <html> / <body>:\n // keep the GPU buffers unless a color really changed\n if (themeColorsChanged(theme, next)) themeVersion++;\n theme = next;\n themeTooltip(dom.tooltip, theme);\n rebuild();\n };\n const unwatchTheme = watchTheme(refreshTheme);\n // charts without `locale` follow the page language\n const unwatchLocale = watchLocale(() => {\n if (!destroyed && !options.locale) rebuild();\n });\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 // between the hover band and the lifted marks\n dom.stage.insertBefore(next.canvas, dom.lift);\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 const unfollowDefault = followDefaultRenderer(\n () => options.renderer,\n () => void initRenderer(),\n );\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: () => viewToValues(model, view),\n setView(next) {\n if (destroyed) return;\n setViewInternal(viewFromValues(model, next, view), 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 const p = toScreen(scales, toPlotX(model, x), toPlotY(model, y));\n return {\n x: p.x + dom.stage.offsetLeft,\n y: p.y + dom.stage.offsetTop,\n };\n },\n fromPixel(x, y) {\n if (!scales) return null;\n const p = toData(\n scales,\n x - dom.stage.offsetLeft,\n y - dom.stage.offsetTop,\n );\n return { x: fromPlotX(model, p.x), y: fromPlotY(model, p.y) };\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 win?.removeEventListener(\"keydown\", onDragKey, true);\n if (settling) clearTimeout(settling.timer);\n if (frameId) {\n if (win?.cancelAnimationFrame) win.cancelAnimationFrame(frameId);\n else clearTimeout(frameId);\n }\n resizeObserver?.disconnect();\n unfollowDefault();\n unwatchTheme();\n unwatchLocale();\n stage.removeEventListener(\"wheel\", onWheel);\n renderer?.destroy();\n renderer = null;\n releaseTooltip(dom.tooltip);\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":["styleElement","assign","mid","r","withRect","a","b","x","y","copyView","v","createChart","doc","container","win","dom","createChartDom","cache","hidden","listeners","options","initialOptions","theme","readTheme","model","view","zoomed","origin","items","itemsDirty","version","annotations","dependencies","scales","xTicks","yTicks","y2Ticks","renderer","rendererToken","destroyed","frameId","fullFrame","frameSize","hover","rehover","lastPlot","pointDrag","dragEls","settling","clearDragOnFrame","placedLabels","labelChip","labelChipBox","hiddenLabel","drag","markers","bands","cells","guides","lifts","liftClip","veil","legendCaret","cellKey","themeVersion","itemsSignatureKey","legendKey","shownMarks","shownTip","resolveReady","ready","resolve","emit","type","listener","event","interactionOf","interactionValue","interaction","value","o","tooltipOptions","scheduleFrame","frame","invalidate","invalidateLabels","rebuild","buildModel","zoom","clampRange","base","minSpan","sameRange","signature","itemsSignature","index","resolveAnnotations","resolveDependencies","renderLegend","updateAccessibility","ensureOrigin","far","legendOption","named","s","show","legendShown","config","toggle","bottom","colors","colorLegend","key","l","legendShape","focused","ramp","first","last","bar","tick","text","el","item","swatch","chartAriaLabel","keyboard","sizeCanvas","w","width","dpr","h","height","canvas","transformFor","scale","range","offset","reverse","drawFront","fg","drawForeground","collectPointLabels","connectorSegments","dependencyArrows","full","size","renderHover","renderDrag","bg","font","layout","layoutChart","rect","plotRect","drawBackground","transposed","cw","plot","ch","bw","bh","density","cellStyleKey","buildItems","xScale","xOffset","yScale","yOffset","settleHover","hideDrag","hitAt","hitTest","px","py","p","draggableAt","it","setHover","before","changed","sameHover","next","pending","hit","i","tooltipNode","custom","content","tooltipContent","fragment","header","sub","swatches","row","grid","cell","n","pooled","pool","make","parent","sc","renderMarks","tip","hoverRect","tooltipObstacles","markerCount","bandCount","cellCount","guideCount","liftCount","veiled","renderLegendCaret","guide","crosshairAt","line","marks","hoverMarks","lifted","mark","createBand","mixed","series","liftParent","PLOT_BACKGROUND","prefersReducedMotion","prev","fresh","liftedBarRect","vertical","ring","shadow","liftShadow","thick","k","CELL_LIFT","CELL_ACCENT","playLift","prevMarker","freshMarker","createMarker","markerHalo","caret","heatPosition","renderLabelChip","found","pointOf","label","createLabelPill","d","showDrag","dragPreview","createDragDot","createDragPlaceholder","createDropTarget","dot","dragDotShadow","right","pill","live","placeholder","target","onDragKey","cancelDrag","releasePointer","id","setViewInternal","notify","viewToValues","zoomAt","at","toData","zoomRange","factor","localPoint","inPlot","dataAt","cx","cy","fromPlotX","fromPlotY","onPointerMove","dx","dy","from","to","panRange","event2","onPointerDown","draggable","onPointerUp","moved","onPointerLeave","onWheel","modifier","wheelFactor","onDoubleClick","resetZoom","moveFocus","current","step","lowerBound","count","current2","span","createScales","leadItem","hoverItemOf","onKeyDown","center","onFocus","visible","onBlur","stage","resizeObserver","refreshTheme","themeColorsChanged","themeTooltip","unwatchTheme","watchTheme","unwatchLocale","watchLocale","initRenderer","token","createRenderer","createDataCanvas","kind","exclude","unfollowDefault","followDefaultRenderer","previous","viewFromValues","toScreen","toPlotX","toPlotY","point","set","releaseTooltip"],"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 createBand,\n createChartDom,\n createDataCanvas,\n createDragDot,\n createDragPlaceholder,\n createDropTarget,\n createLabelPill,\n createMarker,\n CELL_ACCENT,\n CELL_LIFT,\n dragDotShadow,\n liftShadow,\n markerHalo,\n PLOT_BACKGROUND,\n playLift,\n styleElement,\n swatch,\n} from \"./dom\";\nimport { dragPreview, type DragPreview } from \"./drag-preview\";\nimport { hoverRect, tooltipObstacles } from \"./hover-rect\";\nimport {\n buildItems,\n cellStyleKey,\n type Origin,\n type PixelDensity,\n} from \"./items\";\nimport { chartAriaLabel } from \"./labels\";\nimport {\n createScales,\n toData,\n toScreen,\n type Rect,\n type Scales,\n} from \"./layout\";\nimport { watchLocale } from \"./locale\";\nimport {\n buildModel,\n fromPlotX,\n fromPlotY,\n heatPosition,\n toPlotX,\n toPlotY,\n viewFromValues,\n viewToValues,\n type ChartModel,\n type DataCache,\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 { followDefaultRenderer } from \"./renderers/follow\";\nimport type { ChartRenderer, RenderItem } from \"./renderers/types\";\nimport {\n collectPointLabels,\n colorLegend,\n connectorSegments,\n crosshairAt,\n dependencyArrows,\n hitTest,\n hoverItemOf,\n hoverMarks,\n layoutChart,\n legendShape,\n legendShown,\n liftedBarRect,\n pointOf,\n resolveAnnotations,\n resolveDependencies,\n sameHover,\n tooltipContent,\n type ResolvedDependency,\n} from \"./scene\";\nimport { itemsSignature } from \"./signature\";\nimport {\n readTheme,\n themeColorsChanged,\n watchTheme,\n type ChartTheme,\n} from \"./theme\";\nimport {\n positionTooltip,\n prefersReducedMotion,\n releaseTooltip,\n themeTooltip,\n} from \"./tooltip\";\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;\n/** The box around two boxes (either may be missing) */\nconst withRect = (a: Rect | null, b: Rect | null): Rect | null => {\n if (!a || !b) return a ?? b;\n const x = Math.min(a.x, b.x);\n const y = Math.min(a.y, b.y);\n return {\n x,\n y,\n width: Math.max(a.x + a.width, b.x + b.width) - x,\n height: Math.max(a.y + a.height, b.y + b.height) - y,\n };\n};\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 WebGL, 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 themeTooltip(dom.tooltip, theme);\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 dependencies: ResolvedDependency[] = [];\n let scales: Scales | null = null;\n let xTicks: AxisTicks | null = null;\n let yTicks: AxisTicks | null = null;\n let y2Ticks: AxisTicks | null = null;\n let renderer: ChartRenderer | null = null;\n let rendererToken = 0;\n let destroyed = false;\n let frameId = 0;\n /** The next frame draws everything; otherwise only the labels changed */\n let fullFrame = false;\n /** Size of the last full frame (a labels-only frame keeps it) */\n let frameSize = \"\";\n let hover: HoverState | null = null;\n /** Pointer hover to test again once new data is laid out */\n let rehover: { x: number; y: number; event: ChartHoverEvent } | null = null;\n let lastPlot = \"\";\n let pointDrag: {\n id: number;\n item: ChartHoverItem;\n /** Where the pointer went down */\n x: number;\n y: number;\n /** Where the pointer is */\n px: number;\n py: number;\n moved: boolean;\n } | null = null;\n /** Elements of the drag preview, created on the first drag */\n let dragEls: {\n dot: HTMLDivElement;\n pill: HTMLDivElement;\n placeholder: HTMLDivElement;\n target: HTMLDivElement;\n } | null = null;\n /**\n * A dropped point stays where it was released until the new data is\n * drawn (or briefly, when the drop is not applied)\n */\n let settling: {\n item: ChartHoverItem;\n timer: ReturnType<typeof setTimeout>;\n } | null = null;\n let clearDragOnFrame = false;\n /** Point labels drawn on the foreground (for the hovered label chip) */\n let placedLabels: { label: PointLabel; box: Rect }[] = [];\n let labelChip: HTMLDivElement | null = null;\n /** Where the label chip is shown (the tooltip keeps off it) */\n let labelChipBox: Rect | null = null;\n /** Point whose label a host card shows instead (`setLabelHidden`) */\n let hiddenLabel: { seriesIndex: number; index: number } | 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 bands: HTMLDivElement[] = [];\n const cells: HTMLDivElement[] = [];\n const guides: HTMLDivElement[] = [];\n /** Lifted hovered bars, in `liftClip` */\n const lifts: HTMLDivElement[] = [];\n /** Clips the lifted bars to the plot, like the data layer */\n let liftClip: HTMLDivElement | null = null;\n /** Dims the plot behind lifted bars (focus on the hovered one) */\n let veil: HTMLDivElement | null = null;\n /** Hover caret of the color legend (heatmaps) */\n let legendCaret: HTMLDivElement | null = null;\n let cellKey = \"\";\n let themeVersion = 0;\n let itemsSignatureKey = \"\";\n let legendKey = \"\";\n /** What the hover layer shows: kept while the hovered points are the same */\n let shownMarks: {\n event: ChartHoverEvent;\n model: ChartModel;\n scales: Scales;\n } | null = null;\n let shownTip: {\n event: ChartHoverEvent;\n model: ChartModel;\n yTicks: AxisTicks | null;\n width: number;\n height: number;\n } | null = null;\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 let interactionOf: ChartOptions | null = null;\n let interactionValue: Required<ChartInteractionOptions> | null = null;\n /** Resolved `interaction` option (cached: read on every pointer move) */\n const interaction = (): Required<ChartInteractionOptions> | null => {\n if (interactionOf === options) return interactionValue;\n interactionOf = options;\n const value = options.interaction;\n if (value === false) return (interactionValue = null);\n const o = typeof value === \"object\" ? value : {};\n return (interactionValue = {\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 dropTargets: o.dropTargets ?? false,\n dragLabel: o.dragLabel ?? true,\n hoverLabel: o.hoverLabel ?? 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 scheduleFrame = () => {\n frameId = win?.requestAnimationFrame\n ? win.requestAnimationFrame(frame)\n : (setTimeout(frame, 16) as unknown as number);\n };\n\n const invalidate = () => {\n if (destroyed) return;\n fullFrame = true;\n if (!frameId) scheduleFrame();\n };\n\n /** Only the drawn labels changed: the next frame redraws the foreground */\n const invalidateLabels = () => {\n if (destroyed || frameId) return;\n scheduleFrame();\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 = itemsSignature(\n model,\n themeVersion,\n (index) => options.series[index]?.stack,\n );\n if (signature !== itemsSignatureKey) {\n itemsSignatureKey = signature;\n origin = { x: mid(base.x), y: mid(base.y) };\n itemsDirty = true;\n if (hover && !hover.keyboard) {\n // the pointer has not moved: the next frame hit-tests it again on the\n // new data (a click adding a selection ring keeps its point hovered);\n // listeners hear of it only when the point under it changed\n rehover = {\n x: hover.anchorX,\n y: hover.anchorY,\n event: rehover?.event ?? hover.event,\n };\n hover = null;\n }\n }\n // new data after a drop: the dropped point is drawn where it landed\n if (settling) {\n clearTimeout(settling.timer);\n settling = null;\n clearDragOnFrame = true;\n }\n annotations = resolveAnnotations(\n options.annotations,\n theme,\n model.y.type === \"log\" ? Math.log10 : undefined,\n model.x.type === \"log\" ? Math.log10 : undefined,\n );\n dependencies = resolveDependencies(options.dependencies, 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 = legendShown(legendOption, model, named);\n const config = typeof legendOption === \"object\" ? legendOption : {};\n const toggle = config.toggle ?? true;\n const bottom = config.position === \"bottom\";\n const colors = show ? colorLegend(model) : null;\n // rebuild the DOM only when what it shows changed\n let key = `${show}|${bottom}|${toggle}`;\n if (colors) {\n key += `\\n${colors.stops.join(\";\")}|${colors.labels.map((l) => l.text).join(\";\")}`;\n } else if (show) {\n for (const s of model.series)\n key += `\\n${s.id}\\u0001${s.name}\\u0001${s.colorCss}\\u0001${legendShape(s.type)}\\u0001${s.hidden}`;\n }\n if (key === legendKey) return;\n legendKey = key;\n const focused = [...dom.legend.children].indexOf(\n doc.activeElement as Element,\n );\n dom.legend.replaceChildren();\n legendCaret = null;\n dom.legend.style.display = show ? \"flex\" : \"none\";\n if (!show) return;\n dom.legend.style.order = bottom ? \"1\" : \"0\";\n dom.legend.style.padding = bottom ? \"8px 4px 0\" : \"0 4px 8px\";\n if (colors) {\n // visual map: the ramp with its values, the hovered value marked\n dom.legend.style.justifyContent = \"flex-end\";\n const ramp = doc.createElement(\"div\");\n styleElement(ramp, {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n color: \"var(--text-secondary-color, #6b7280)\",\n fontSize: \"11px\",\n fontVariantNumeric: \"tabular-nums\",\n });\n const first = colors.labels[0];\n const last = colors.labels[colors.labels.length - 1];\n const bar = doc.createElement(\"div\");\n styleElement(bar, {\n position: \"relative\",\n width: \"160px\",\n height: \"8px\",\n borderRadius: \"4px\",\n background: `linear-gradient(to right, ${colors.stops.join(\", \")})`,\n boxShadow:\n \"inset 0 0 0 1px color-mix(in srgb, var(--text-color, #1f2937) 8%, transparent)\",\n });\n if (colors.labels.length > 2) {\n const tick = doc.createElement(\"div\");\n styleElement(tick, {\n position: \"absolute\",\n left: \"50%\",\n top: \"-2px\",\n width: \"1px\",\n height: \"12px\",\n background:\n \"color-mix(in srgb, var(--text-color, #1f2937) 35%, transparent)\",\n });\n bar.appendChild(tick);\n }\n legendCaret = doc.createElement(\"div\");\n styleElement(legendCaret, {\n position: \"absolute\",\n top: \"-3px\",\n width: \"4px\",\n height: \"14px\",\n marginLeft: \"-2px\",\n borderRadius: \"2px\",\n background: \"var(--text-color, #1f2937)\",\n boxShadow:\n \"0 0 0 1.5px var(--surface-color, var(--background-color, #fff))\",\n display: \"none\",\n });\n bar.appendChild(legendCaret);\n const text = (value: string) => {\n const el = doc.createElement(\"span\");\n el.textContent = value;\n return el;\n };\n ramp.append(text(first?.text ?? \"\"), bar, text(last?.text ?? \"\"));\n dom.legend.appendChild(ramp);\n return;\n }\n dom.legend.style.justifyContent = \"\";\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(doc, s.colorCss, legendShape(s.type)),\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 dom.stage.setAttribute(\n \"aria-label\",\n options.ariaLabel ?? chartAriaLabel(model),\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 /** The 2D layer over the data: annotations, point labels, connectors */\n const drawFront = (width: number, height: number, dpr: number) => {\n const fg = dom.foreground.getContext(\"2d\");\n if (!fg || !scales) return;\n fg.setTransform(dpr, 0, 0, dpr, 0, 0);\n placedLabels = drawForeground(fg, {\n width,\n height,\n scales,\n theme,\n annotations,\n pointLabels: collectPointLabels(\n model,\n view,\n scales,\n yTicks,\n theme.background,\n // the label of a dragged point follows it (in the drag pill)\n pointDrag?.moved ? pointDrag.item : (settling?.item ?? null),\n hiddenLabel,\n ),\n connectors: connectorSegments(model, scales),\n arrows: dependencyArrows(model, scales, dependencies),\n });\n };\n\n function frame() {\n frameId = 0;\n if (destroyed) return;\n const full = fullFrame;\n fullFrame = false;\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 const size = `${width}x${height}@${dpr}`;\n // a label shown or hidden (the point card of a matrix): the background,\n // the axes and the data layer stay as they are\n if (!full && size === frameSize && scales) {\n drawFront(width, height, dpr);\n renderHover();\n if (pointDrag?.moved) renderDrag();\n return;\n }\n frameSize = size;\n sizeCanvas(dom.background, width, height, dpr);\n sizeCanvas(dom.foreground, width, height, dpr);\n const bg = dom.background.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 y2Ticks = layout.y2Ticks;\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 y2: model.y2,\n y2Ticks,\n theme,\n annotations,\n });\n }\n drawFront(width, height, dpr);\n\n if (renderer) {\n const canvas = renderer.canvas;\n // horizontal charts: the data layer is drawn as a vertical chart on a\n // transposed canvas (its x axis runs down the plot, its y axis right)\n const transposed = model.horizontal;\n const cw = transposed ? plot.height : plot.width;\n const ch = transposed ? plot.width : plot.height;\n styleElement(canvas, {\n left: `${plot.x}px`,\n top: `${plot.y}px`,\n width: `${cw}px`,\n height: `${ch}px`,\n transformOrigin: transposed ? \"0 0\" : \"\",\n transform: transposed ? \"matrix(0, 1, 1, 0, 0, 0)\" : \"\",\n });\n const bw = Math.max(1, Math.round(cw * dpr));\n const bh = Math.max(1, Math.round(ch * dpr));\n if (canvas.width !== bw || canvas.height !== bh) renderer.resize(bw, bh);\n ensureOrigin();\n // heatmap cells: their gaps and corners follow their size on screen\n const density: PixelDensity = {\n x: 1 / Math.abs(scales.xPerPx),\n y: 1 / Math.abs(scales.yPerPx),\n };\n const key = cellStyleKey(model, density);\n if (key !== cellKey) {\n cellKey = key;\n itemsDirty = true;\n }\n if (itemsDirty) {\n version++;\n items = buildItems(model, origin, version, density);\n itemsDirty = false;\n }\n const [xScale, xOffset] = transformFor(view.x, origin.x, model.x.reverse);\n const [yScale, yOffset] = transformFor(\n view.y,\n origin.y,\n // the top of the transposed canvas is the left of the plot\n transposed ? !model.y.reverse : model.y.reverse,\n );\n renderer.render(items, {\n transform: { xScale, xOffset, yScale, yOffset },\n width: bw,\n height: bh,\n dpr,\n });\n }\n settleHover();\n renderHover();\n if (clearDragOnFrame) {\n clearDragOnFrame = false;\n if (!pointDrag?.moved) hideDrag();\n } else if (pointDrag?.moved) renderDrag();\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 before = rehover ? rehover.event : (hover?.event ?? null);\n rehover = null;\n const changed = !sameHover(before, next?.event ?? null);\n hover = next;\n renderHover();\n if (changed) emit(\"hover\", next ? next.event : null);\n };\n\n /** The hover dropped by new data, hit-tested again where the pointer is */\n const settleHover = () => {\n const pending = rehover;\n if (!pending || !scales) return;\n rehover = null;\n const hit = hitAt(pending.x, pending.y);\n hover = hit\n ? { event: hit, anchorX: pending.x, anchorY: pending.y, keyboard: false }\n : null;\n const same =\n sameHover(pending.event, hit) &&\n pending.event.items.every(\n (it, i) => it.x === hit!.items[i].x && it.y === hit!.items[i].y,\n );\n // listeners tracking the hovered point (an info card shown while\n // nothing is hovered) would otherwise keep the old one\n if (!same) emit(\"hover\", hit);\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, y2Ticks);\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: content.subtitle ? \"0\" : \"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 if (content.subtitle) {\n const sub = doc.createElement(\"div\");\n styleElement(sub, {\n color: \"var(--text-secondary-color, #6b7280)\",\n fontSize: \"11px\",\n margin: \"1px 0 6px\",\n paddingLeft: content.titleColor ? \"14px\" : \"0\",\n });\n sub.textContent = content.subtitle;\n fragment.append(sub);\n }\n if (!content.rows.length) return fragment;\n // a label column and a value column (right-aligned, tabular figures)\n const swatches = content.rows.some((row) => row.color);\n const grid = doc.createElement(\"div\");\n styleElement(grid, {\n display: \"grid\",\n gridTemplateColumns: swatches\n ? \"auto minmax(0, 1fr) auto\"\n : \"minmax(0, 1fr) auto\",\n columnGap: \"0\",\n rowGap: \"2px\",\n alignItems: \"center\",\n });\n for (const row of content.rows) {\n if (swatches) {\n const cell = doc.createElement(\"span\");\n styleElement(cell, {\n display: \"inline-flex\",\n width: \"14px\",\n justifyContent: \"flex-start\",\n });\n if (row.color) cell.appendChild(swatch(doc, row.color, \"dot\"));\n grid.appendChild(cell);\n }\n const n = doc.createElement(\"span\");\n styleElement(n, {\n color: \"var(--text-secondary-color, #6b7280)\",\n paddingRight: \"16px\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n });\n n.textContent = row.name;\n const v = doc.createElement(\"span\");\n styleElement(v, {\n fontWeight: \"600\",\n fontVariantNumeric: \"tabular-nums\",\n textAlign: \"right\",\n color: \"var(--text-color, #1f2937)\",\n });\n v.textContent = row.value;\n grid.append(n, v);\n }\n fragment.append(grid);\n return fragment;\n };\n\n const pooled = <T extends HTMLElement>(\n pool: T[],\n i: number,\n make: () => T,\n parent: HTMLElement = dom.hover,\n ) => {\n if (!pool[i]) {\n pool[i] = make();\n parent.appendChild(pool[i]);\n }\n pool[i].style.display = \"block\";\n return pool[i];\n };\n\n function renderHover() {\n const sc = scales;\n const marksShown =\n !!hover &&\n !!sc &&\n !!shownMarks &&\n shownMarks.scales === sc &&\n shownMarks.model === model &&\n sameHover(shownMarks.event, hover.event);\n // pointer moves over the same points: the markers stay where they are\n if (!marksShown) renderMarks(sc);\n\n const tip = dom.tooltip;\n if (!hover || !sc || !tooltipOptions() || drag?.moved || pointDrag?.moved) {\n tip.style.display = \"none\";\n return;\n }\n const custom = tooltipOptions()?.render;\n let w: number;\n let h: number;\n if (\n !custom &&\n shownTip &&\n shownTip.model === model &&\n shownTip.yTicks === yTicks &&\n sameHover(shownTip.event, hover.event) &&\n tip.style.display === \"block\"\n ) {\n // same content: only the position follows the pointer\n w = shownTip.width;\n h = shownTip.height;\n } else {\n shownTip = null;\n const content = tooltipNode(hover.event);\n if (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 w = tip.offsetWidth;\n h = tip.offsetHeight;\n if (!custom)\n shownTip = { event: hover.event, model, yTicks, width: w, height: h };\n }\n // off the hovered marks: beside them, above / below the rows of\n // horizontal charts (Gantt tasks), off the other bars of those\n positionTooltip(tip, dom.stage, {\n anchor: { x: hover.anchorX, y: hover.anchorY },\n avoid: withRect(hoverRect(model, sc, hover.event), labelChipBox),\n obstacles: tooltipObstacles(model, sc),\n prefer: sc.horizontal ? \"vertical\" : \"side\",\n size: { width: w, height: h },\n animate: true,\n });\n }\n\n /** Crosshair, point markers, bar bands, lifted bars and heatmap cells */\n function renderMarks(sc: Scales | null) {\n let markerCount = 0;\n let bandCount = 0;\n let cellCount = 0;\n let guideCount = 0;\n let liftCount = 0;\n let veiled = false;\n renderLegendCaret();\n shownMarks = null;\n dom.crosshair.style.display = \"none\";\n if (hover && sc) {\n shownMarks = { event: hover.event, model, scales: 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 guide = crosshairAt(model, sc, hover.event, options.crosshair);\n if (guide !== null) {\n const line =\n \"1px dashed color-mix(in srgb, var(--text-secondary-color, #6b7280) 45%, transparent)\";\n styleElement(\n dom.crosshair,\n sc.horizontal\n ? {\n display: \"block\",\n left: `${plot.x}px`,\n top: `${Math.round(guide)}px`,\n width: `${plot.width}px`,\n height: \"0\",\n borderLeft: \"0\",\n borderTop: line,\n }\n : {\n display: \"block\",\n left: `${Math.round(guide)}px`,\n top: `${plot.y}px`,\n width: \"0\",\n height: `${plot.height}px`,\n borderLeft: line,\n borderTop: \"0\",\n },\n );\n }\n const marks = hoverMarks(model, sc, hover.event);\n // behind lifted bars the band only gives the context: lighter\n const lifted = marks.some((mark) => mark.kind === \"bar\");\n for (const mark of marks) {\n if (mark.kind === \"band\" || mark.kind === \"guide\") {\n const el =\n mark.kind === \"band\"\n ? pooled(bands, bandCount++, () => createBand(doc), dom.underlay)\n : pooled(\n guides,\n guideCount++,\n () =>\n styleElement(createBand(doc), {\n borderRadius: \"0\",\n background:\n \"color-mix(in srgb, var(--text-color, #1f2937) 6%, transparent)\",\n }),\n dom.lift,\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 if (mark.kind === \"band\")\n el.style.background = `color-mix(in srgb, var(--text-color, #1f2937) ${lifted ? 4 : 6}%, transparent)`;\n continue;\n }\n if (mark.kind === \"bar\") {\n const mixed = model.series.some(\n (series) =>\n !series.hidden &&\n (series.type === \"line\" || series.type === \"area\"),\n );\n // combo charts: the lifted bar goes below the data layer, so the\n // lines (and their markers) stay above it; no veil either\n const liftParent = mixed ? dom.underlay : dom.lift;\n if (!liftClip) {\n liftClip = styleElement(doc.createElement(\"div\"), {\n position: \"absolute\",\n overflow: \"hidden\",\n }) as HTMLDivElement;\n }\n if (\n liftClip.parentElement !== liftParent ||\n (mixed && liftParent.lastElementChild !== liftClip)\n )\n liftParent.appendChild(liftClip);\n if (!veiled && !mixed) {\n veiled = true;\n if (!veil) {\n veil = styleElement(doc.createElement(\"div\"), {\n position: \"absolute\",\n background: `color-mix(in srgb, ${PLOT_BACKGROUND} 42%, transparent)`,\n opacity: \"0\",\n }) as HTMLDivElement;\n dom.lift.insertBefore(\n veil,\n liftClip.parentElement === dom.lift ? liftClip : null,\n );\n }\n styleElement(veil, {\n left: `${plot.x}px`,\n top: `${plot.y}px`,\n width: `${plot.width}px`,\n height: `${plot.height}px`,\n transition: prefersReducedMotion(win)\n ? \"none\"\n : \"opacity 140ms ease-out\",\n opacity: \"1\",\n });\n }\n styleElement(liftClip, {\n left: `${plot.x}px`,\n top: `${plot.y}px`,\n width: `${plot.width}px`,\n height: `${plot.height}px`,\n });\n const key = `${mark.seriesIndex}:${mark.index}`;\n const prev = lifts[liftCount];\n const fresh =\n !prev || prev.style.display !== \"block\" || prev.dataset.key !== key;\n const el = pooled(\n lifts,\n liftCount++,\n () => createBand(doc),\n liftClip,\n );\n el.dataset.key = key;\n const r = liftedBarRect(mark);\n const vertical = mark.base === \"top\" || mark.base === \"bottom\";\n const ring =\n mark.ring === null\n ? null\n : {\n color: mark.ring,\n // translucent bars: a stronger ring in their solid color\n width: Math.min(\n mark.backdrop ? 2 : 1.5,\n Math.max(0, (Math.min(r.width, r.height) - 2) / 4),\n ),\n };\n el.dataset.hoverMark = \"bar\";\n const shadow = ring ? liftShadow(ring, 1.5, null) : \"none\";\n styleElement(el, {\n left: `${r.x - plot.x}px`,\n top: `${r.y - plot.y}px`,\n width: `${r.width}px`,\n height: `${r.height}px`,\n borderRadius: `${mark.radius}px`,\n filter: \"brightness(1.08) saturate(1.08)\",\n background: mark.backdrop\n ? `linear-gradient(${mark.color}, ${mark.color}), ${PLOT_BACKGROUND}`\n : mark.color,\n boxShadow: shadow,\n });\n if (fresh) {\n // grows from the bar as drawn\n const thick = vertical ? r.width : r.height;\n const k = thick > 0 ? (thick - mark.grow * 2) / thick : 1;\n playLift(\n el,\n {\n transform: vertical ? `scaleX(${k})` : `scaleY(${k})`,\n ...(ring\n ? { boxShadow: liftShadow(ring, 1.5, null, true) }\n : {}),\n },\n { transform: \"none\", ...(ring ? { boxShadow: shadow } : {}) },\n win,\n );\n }\n continue;\n }\n if (mark.kind === \"cell\") {\n // the cell lifted above its neighbours (and below the labels):\n // a ring at its edge, a halo of the background and an accent line\n const key = `${mark.seriesIndex}:${mark.index}`;\n const prev = cells[cellCount];\n const fresh =\n !prev || prev.style.display !== \"block\" || prev.dataset.key !== key;\n const el = pooled(\n cells,\n cellCount++,\n () =>\n styleElement(createBand(doc), {\n zIndex: \"1\",\n transform: `scale(${CELL_LIFT})`,\n }),\n dom.lift,\n );\n el.dataset.key = key;\n const ring = {\n color: mark.ring,\n width: Math.min(2, Math.min(mark.width, mark.height) / 5),\n };\n const shadow = liftShadow(ring, 2, CELL_ACCENT);\n styleElement(el, {\n left: `${mark.x}px`,\n top: `${mark.y}px`,\n width: `${mark.width}px`,\n height: `${mark.height}px`,\n background: mark.color,\n borderRadius: `${Math.max(mark.radius, 2)}px`,\n boxShadow: shadow,\n });\n if (fresh)\n playLift(\n el,\n {\n transform: \"scale(1)\",\n boxShadow: liftShadow(ring, 2, CELL_ACCENT, true),\n },\n { transform: `scale(${CELL_LIFT})`, boxShadow: shadow },\n win,\n );\n continue;\n }\n const prevMarker = markers[markerCount];\n const freshMarker =\n !prevMarker ||\n prevMarker.style.display !== \"block\" ||\n prevMarker.style.left !== `${mark.x}px` ||\n prevMarker.style.top !== `${mark.y}px`;\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 boxShadow: markerHalo(mark.halo),\n });\n if (freshMarker)\n playLift(\n el,\n { transform: \"translate(-50%, -50%) scale(0.6)\", opacity: \"0.6\" },\n { transform: \"translate(-50%, -50%) scale(1)\", opacity: \"1\" },\n win,\n );\n }\n renderLabelChip(sc);\n } else if (labelChip) {\n labelChip.style.display = \"none\";\n labelChipBox = null;\n }\n for (let i = markerCount; i < markers.length; i++)\n markers[i].style.display = \"none\";\n for (let i = bandCount; i < bands.length; i++)\n bands[i].style.display = \"none\";\n for (let i = cellCount; i < cells.length; i++)\n cells[i].style.display = \"none\";\n for (let i = guideCount; i < guides.length; i++)\n guides[i].style.display = \"none\";\n for (let i = liftCount; i < lifts.length; i++)\n lifts[i].style.display = \"none\";\n if (veil && !veiled) veil.style.opacity = \"0\";\n }\n\n /** Marks the hovered heatmap value on the color legend */\n function renderLegendCaret() {\n const caret = legendCaret;\n if (!caret) return;\n const it = hover?.event.items[0];\n const s = it ? model.series[it.seriesIndex] : undefined;\n if (!it || !s || s.type !== \"heatmap\" || it.value === undefined) {\n caret.style.display = \"none\";\n return;\n }\n caret.style.display = \"block\";\n caret.style.left = `${(heatPosition(s, it.value) * 100).toFixed(2)}%`;\n }\n\n /** The label of a hovered dot, highlighted in a chip tinted with its color */\n function renderLabelChip(sc: Scales) {\n const it = hover?.event.items[0];\n const s = it ? model.series[it.seriesIndex] : undefined;\n let found: { label: PointLabel; box: Rect } | undefined;\n if (\n it &&\n s?.type === \"scatter\" &&\n it.label &&\n !pointDrag?.moved &&\n interaction()?.hoverLabel !== false\n ) {\n const p = pointOf(s, it.index, sc);\n found = placedLabels.find(\n ({ label }) =>\n !label.hidden &&\n label.text === it.label &&\n Math.abs(label.x - p.px) < 0.5 &&\n Math.abs(label.y - p.py) < 0.5,\n );\n }\n labelChipBox = null;\n if (!found || !it) {\n if (labelChip) labelChip.style.display = \"none\";\n return;\n }\n if (!labelChip) {\n labelChip = createLabelPill(doc);\n labelChip.dataset.hoverMark = \"label\";\n dom.hover.appendChild(labelChip);\n }\n labelChip.textContent = found.label.text;\n styleElement(labelChip, {\n display: \"block\",\n left: `${found.box.x - 10}px`,\n top: `${found.box.y + found.box.height / 2}px`,\n transform: \"translateY(-50%)\",\n background: `color-mix(in srgb, ${it.color} 14%, var(--surface-color, var(--background-color, #fff)))`,\n borderColor: `color-mix(in srgb, ${it.color} 45%, transparent)`,\n boxShadow: \"0 4px 12px -4px rgba(15, 23, 42, 0.28)\",\n });\n // the canvas label, a little wider in bold, with the padding of the chip\n labelChipBox = {\n x: found.box.x - 10,\n y: found.box.y + found.box.height / 2 - 11,\n width: found.box.width * 1.1 + 20,\n height: 22,\n };\n }\n\n // ----------------------------------------------------------- point drag\n\n /** The dragged point under the pointer, its label, its origin and target */\n function renderDrag() {\n const d = pointDrag;\n const sc = scales;\n if (!d?.moved || !sc) return;\n showDrag(\n dragPreview(\n model,\n sc,\n annotations,\n d.item,\n d.px,\n d.py,\n !!interaction()?.dropTargets,\n ),\n true,\n );\n }\n\n function showDrag(p: DragPreview, live: boolean) {\n if (!dragEls) {\n dragEls = {\n dot: createDragDot(doc),\n pill: createLabelPill(doc),\n placeholder: createDragPlaceholder(doc),\n target: createDropTarget(doc),\n };\n dragEls.dot.dataset.dragMark = \"dot\";\n dragEls.pill.dataset.dragMark = \"label\";\n dragEls.placeholder.dataset.dragMark = \"origin\";\n dragEls.target.dataset.dragMark = \"target\";\n dom.underlay.appendChild(dragEls.target);\n dom.hover.append(dragEls.placeholder, dragEls.dot, dragEls.pill);\n }\n const { dot, pill, placeholder, target } = dragEls;\n dom.hover.style.width = `${dom.stage.clientWidth}px`;\n dom.hover.style.height = `${dom.stage.clientHeight}px`;\n styleElement(dot, {\n display: \"block\",\n left: `${p.x}px`,\n top: `${p.y}px`,\n width: `${p.size}px`,\n height: `${p.size}px`,\n background: p.color,\n boxShadow: dragDotShadow(p.color),\n });\n if (p.label && interaction()?.dragLabel !== false) {\n pill.textContent = p.label;\n const sc = scales;\n // beside the dot, on the side with room\n const right = !sc || p.x < sc.plot.x + sc.plot.width * 0.62;\n styleElement(pill, {\n display: \"block\",\n left: `${p.x}px`,\n top: `${p.y}px`,\n transform: right\n ? `translate(${p.size / 2 + 8}px, -50%)`\n : `translate(calc(-100% - ${p.size / 2 + 8}px), -50%)`,\n });\n } else pill.style.display = \"none\";\n if (live && p.origin) {\n const size = p.size - 2;\n styleElement(placeholder, {\n display: \"block\",\n left: `${p.origin.x}px`,\n top: `${p.origin.y}px`,\n width: `${size}px`,\n height: `${size}px`,\n borderColor: p.color,\n background: `color-mix(in srgb, ${PLOT_BACKGROUND} 62%, transparent)`,\n });\n } else placeholder.style.display = \"none\";\n if (live && p.target) {\n styleElement(target, {\n display: \"block\",\n left: `${p.target.x}px`,\n top: `${p.target.y}px`,\n width: `${p.target.width}px`,\n height: `${p.target.height}px`,\n background: `color-mix(in srgb, ${p.target.color} 12%, transparent)`,\n boxShadow: `inset 0 0 0 2px color-mix(in srgb, ${p.target.color} 70%, transparent)`,\n });\n } else target.style.display = \"none\";\n }\n\n function hideDrag() {\n if (!dragEls) return;\n for (const el of Object.values(dragEls)) el.style.display = \"none\";\n }\n\n const onDragKey = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\" || !pointDrag) return;\n event.preventDefault();\n event.stopPropagation();\n cancelDrag();\n };\n\n const releasePointer = (id: number) => {\n if (dom.stage.hasPointerCapture?.(id)) dom.stage.releasePointerCapture(id);\n };\n\n /** Ends a point drag without a drop (Escape, a cancelled pointer) */\n function cancelDrag() {\n const d = pointDrag;\n if (!d) return;\n pointDrag = null;\n win?.removeEventListener(\"keydown\", onDragKey, true);\n releasePointer(d.id);\n dom.stage.style.cursor = \"\";\n hideDrag();\n if (!d.moved) return;\n invalidate();\n emit(\"dragEnd\", { item: d.item, cancelled: true });\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\", viewToValues(model, 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 const at = toData(sc, px, py);\n if (model.zoom.x) next.x = zoomRange(view.x, at.x, factor);\n if (model.zoom.y) next.y = zoomRange(view.y, at.y, 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 const p = toData(sc, cx, cy);\n // values of the axes (not logarithms)\n return { x: fromPlotX(model, p.x), y: fromPlotY(model, p.y) };\n };\n\n const onPointerMove = (event: PointerEvent) => {\n const { x, y } = localPoint(event);\n if (pointDrag && pointDrag.id === event.pointerId) {\n const d = pointDrag;\n d.px = x;\n d.py = y;\n if (!d.moved && Math.hypot(x - d.x, y - d.y) > 3) {\n d.moved = true;\n dom.stage.setPointerCapture?.(event.pointerId);\n dom.stage.style.cursor = \"grabbing\";\n win?.addEventListener(\"keydown\", onDragKey, true);\n // a drop not yet applied: the new drag replaces it\n if (settling) {\n clearTimeout(settling.timer);\n settling = null;\n }\n setHover(null);\n // the foreground is drawn again without the label of the point\n invalidate();\n const at = dataAt(d.x, d.y);\n if (at) emit(\"dragStart\", { item: d.item, x: at.x, y: at.y });\n }\n if (d.moved && pointDrag === d) {\n // the point and its label follow the pointer at once, on the DOM\n renderDrag();\n const at = dataAt(x, y);\n if (at) emit(\"drag\", { item: d.item, x: at.x, y: at.y });\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 const from = toData(scales, drag.x, drag.y);\n const to = toData(scales, x, y);\n if (model.zoom.x) next.x = panRange(drag.view.x, from.x - to.x);\n if (model.zoom.y) next.y = panRange(drag.view.y, from.y - to.y);\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 = {\n id: event.pointerId,\n item: draggable,\n x,\n y,\n px: x,\n py: y,\n moved: false,\n };\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 d = pointDrag;\n const { x, y } = localPoint(event);\n if (d.moved && event.type === \"pointercancel\") {\n cancelDrag();\n return;\n }\n pointDrag = null;\n win?.removeEventListener(\"keydown\", onDragKey, true);\n releasePointer(event.pointerId);\n dom.stage.style.cursor = draggableAt(x, y) ? \"grab\" : \"\";\n if (d.moved) {\n d.px = x;\n d.py = y;\n const at = dataAt(x, y);\n const sc = scales;\n // the dot stays where it was released until the new data is drawn\n if (sc) {\n showDrag(\n dragPreview(model, sc, annotations, d.item, x, y, false),\n false,\n );\n if (settling) clearTimeout(settling.timer);\n settling = {\n item: d.item,\n timer: setTimeout(() => {\n settling = null;\n if (!pointDrag?.moved) hideDrag();\n invalidate();\n }, 320),\n };\n } else hideDrag();\n if (at) emit(\"drop\", { item: d.item, x: at.x, y: at.y });\n emit(\"dragEnd\", { item: d.item, cancelled: !at });\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 !scales.horizontal &&\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 model.horizontal,\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 if (model.horizontal) return;\n event.preventDefault();\n moveFocus((event.key === \"ArrowRight\") !== model.x.reverse ? 1 : -1);\n break;\n case \"ArrowDown\":\n case \"ArrowUp\":\n // horizontal charts: the x axis runs down\n if (!model.horizontal) return;\n event.preventDefault();\n moveFocus((event.key === \"ArrowDown\") !== 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 const next = readTheme(dom.root, options.palette);\n // the watcher fires on any class / style change of <html> / <body>:\n // keep the GPU buffers unless a color really changed\n if (themeColorsChanged(theme, next)) themeVersion++;\n theme = next;\n themeTooltip(dom.tooltip, theme);\n rebuild();\n };\n const unwatchTheme = watchTheme(refreshTheme);\n // charts without `locale` follow the page language\n const unwatchLocale = watchLocale(() => {\n if (!destroyed && !options.locale) rebuild();\n });\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 // between the hover band and the lifted marks\n dom.stage.insertBefore(next.canvas, dom.lift);\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 const unfollowDefault = followDefaultRenderer(\n () => options.renderer,\n () => void initRenderer(),\n );\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: () => viewToValues(model, view),\n setView(next) {\n if (destroyed) return;\n setViewInternal(viewFromValues(model, next, view), 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 const p = toScreen(scales, toPlotX(model, x), toPlotY(model, y));\n return {\n x: p.x + dom.stage.offsetLeft,\n y: p.y + dom.stage.offsetTop,\n };\n },\n fromPixel(x, y) {\n if (!scales) return null;\n const p = toData(\n scales,\n x - dom.stage.offsetLeft,\n y - dom.stage.offsetTop,\n );\n return { x: fromPlotX(model, p.x), y: fromPlotY(model, p.y) };\n },\n ready,\n refreshTheme,\n setLabelHidden(point) {\n const next = point\n ? { seriesIndex: point.seriesIndex, index: point.index }\n : null;\n if (\n next?.seriesIndex === hiddenLabel?.seriesIndex &&\n next?.index === hiddenLabel?.index\n )\n return;\n hiddenLabel = next;\n invalidateLabels();\n },\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 win?.removeEventListener(\"keydown\", onDragKey, true);\n if (settling) clearTimeout(settling.timer);\n if (frameId) {\n if (win?.cancelAnimationFrame) win.cancelAnimationFrame(frameId);\n else clearTimeout(frameId);\n }\n resizeObserver?.disconnect();\n unfollowDefault();\n unwatchTheme();\n unwatchLocale();\n stage.removeEventListener(\"wheel\", onWheel);\n renderer?.destroy();\n renderer = null;\n releaseTooltip(dom.tooltip);\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
- const e=require("./color.cjs"),t=require("./layout.cjs");var n=6,r=(t,n)=>{let r=t[3];if(r<.6)return;let i=e.mix(n,t,r),a=e.relativeLuminance(i);return 1.05/(a+.05)>=(a+.05)/.062?`#ffffff`:`rgba(17, 24, 39, 0.92)`},i=(e,t=e.fontSize,n=400)=>`${n} ${t}px ${e.fontFamily}`,a=e=>Math.round(e)+.5,o=(e,t,n,r,i)=>{let a=Math.min(i/2,r/2);e.beginPath(),e.moveTo(t+a,n),e.lineTo(t+r-a,n),e.arcTo(t+r,n,t+r,n+a,a),e.lineTo(t+r,n+i-a),e.arcTo(t+r,n+i,t+r-a,n+i,a),e.lineTo(t+a,n+i),e.arcTo(t,n+i,t,n+i-a,a),e.lineTo(t,n+a),e.arcTo(t,n,t+a,n,a),e.closePath()},s=(e,n,r,i)=>{let{plot:a}=n,o=t.toScreen(n,e.x??0,e.y??0),s=n.horizontal?{x:e.y===void 0,y:e.x===void 0}:{x:e.x===void 0,y:e.y===void 0},c=s.x?a.x+a.width/2:o.x,l=s.y?a.y+a.height/2:o.y,u=c-r/2,d=l-i/2;return e.anchor===`top`?d=l+6:e.anchor===`bottom`?d=l-6-i:e.anchor===`left`?u=c+6:e.anchor===`right`&&(u=c-6-r),u=Math.max(a.x+6,Math.min(u,a.x+a.width-6-r)),d=Math.max(a.y+2,Math.min(d,a.y+a.height-2-i)),{x:u,y:d,width:r,height:i}},c=(e,n)=>{let{plot:r}=n,[i,a]=n.horizontal?[r.y,r.y+r.height]:[r.x,r.x+r.width],[o,s]=n.horizontal?[r.x,r.x+r.width]:[r.y,r.y+r.height],c=(e,t,n)=>e<t?t:e>n?n:e;return t.screenRect(n,c(n.xToPx(e.x0??-1/0),i,a),c(n.xToPx(e.x1??1/0),i,a),c(n.yToPx(e.y0??-1/0),o,s),c(n.yToPx(e.y1??1/0),o,s))},l=e=>!!(e.label||e.badge||e.detail||e.description),u=(e,t,n)=>{if(n(e)<=t)return e;let r=Array.from(e),i=0,a=r.length;for(;i<a;){let e=Math.ceil((i+a)/2);n(`${r.slice(0,e).join(``)}…`)<=t?i=e:a=e-1}return i>0?`${r.slice(0,i).join(``).trimEnd()}…`:``},d=(e,t,n,r)=>{if(!l(e)||t.width<=0||t.height<=0)return null;let i=n+4,a=Math.max(0,t.width-20),o=n+1,s=Math.max(9,n-1),c=e.badge?u(e.badge,Math.max(0,a-10),e=>r(e,s,700)):``,d=c?r(c,s,700)+10:0,f=e.detail??``,p=f?r(f,n,500):0,m=()=>a-(c?d+6:0)-(f?p+6:0);f&&e.label&&m()<32&&(f=``,p=0),f&&m()<0&&(f=u(f,Math.max(0,a-(c?d+6:0)),e=>r(e,n,500)),p=f?r(f,n,500):0);let h=e.label?u(e.label,Math.max(0,m()),e=>r(e,o,600)):``,g=[];c&&g.push({kind:`badge`,text:c,x:0,y:0,width:d,height:i,size:s,weight:700}),h&&g.push({kind:`label`,text:h,x:0,y:0,width:r(h,o,600),height:i,size:o,weight:600}),f&&g.push({kind:`detail`,text:f,x:0,y:0,width:p,height:i,size:n,weight:500});let _=e.description?u(e.description,a,e=>r(e,n,400)):``,v=g.reduce((e,t)=>e+t.width,0)+Math.max(0,g.length-1)*6,y=_?r(_,n,400):0;if(!g.length&&!_)return null;let b=(g.length?i:0)+(_?i+(g.length?2:0):0),x=e.labelPosition,S=x.startsWith(`top`)?t.y+10:x.startsWith(`bottom`)?t.y+t.height-10-b:t.y+(t.height-b)/2,C=e=>x.endsWith(`left`)?t.x+10:x.endsWith(`right`)?t.x+t.width-10-e:t.x+(t.width-e)/2,w=[],T=C(v);for(let e of g)w.push({...e,x:T,y:S}),T+=e.width+6;_&&w.push({kind:`description`,text:_,x:C(y),y:S+(g.length?i+2:0),width:y,height:i,size:n,weight:400});let E=Math.max(v,y);return{parts:w,box:{x:C(E),y:S,width:E,height:b}}},f=(e,t)=>({vertical:e.axis===`x`!==t.horizontal,at:e.axis===`x`?t.xToPx(e.value):t.yToPx(e.value)}),p=(t,n)=>{let{scales:r,theme:o,xTicks:s,yTicks:l}=n,{plot:u}=r,d=r.horizontal?n.y:n.x,f=r.horizontal?n.x:n.y,p=r.horizontal?l:s,m=r.horizontal?s:l,h=r.horizontal?r.yToPx:r.xToPx,g=r.horizontal?r.xToPx:r.yToPx;t.clearRect(0,0,n.width,n.height),t.save(),t.beginPath(),t.rect(u.x,u.y,u.width,u.height),t.clip();for(let i of n.annotations){if(i.type!==`rect`)continue;let n=c(i,r);n.width<=0||n.height<=0||(t.fillStyle=e.toCss(i.color,i.opacity),t.fillRect(n.x,n.y,n.width,n.height))}if(t.restore(),t.lineWidth=1,t.strokeStyle=e.toCss(o.grid),t.beginPath(),f.grid)for(let e of m.values){let n=a(g(e));n<u.y-1||n>u.y+u.height+1||(t.moveTo(u.x,n),t.lineTo(u.x+u.width,n))}if(d.grid)for(let e of p.values){let n=a(h(e));n<u.x-1||n>u.x+u.width+1||(t.moveTo(n,u.y),t.lineTo(n,u.y+u.height))}t.stroke();let _=Math.ceil(o.fontSize*1.4);if(t.font=i(o),t.fillStyle=e.toCss(o.textMuted),d.visible){t.strokeStyle=e.toCss(o.axis),t.beginPath();let r=a(u.y+u.height);t.moveTo(u.x,r),t.lineTo(u.x+u.width,r),t.stroke(),t.textBaseline=`top`,t.textAlign=`center`;let s=-1/0,c=p.values.map((e,t)=>({px:h(e),text:p.labels[t]})).sort((e,t)=>e.px-t.px);for(let{px:e,text:r}of c){if(e<u.x-.5||e>u.x+u.width+.5)continue;let i=t.measureText(r).width,a=Math.max(0,Math.min(n.width-i,e-i/2));a<s+6||(s=a+i,t.fillText(r,a+i/2,u.y+u.height+7))}d.title&&(t.font=i(o,o.fontSize+1,500),t.fillStyle=e.toCss(o.text,.8),t.fillText(d.title,u.x+u.width/2,u.y+u.height+_+10))}if(f.visible){t.font=i(o),t.fillStyle=e.toCss(o.textMuted),t.textAlign=`right`,t.textBaseline=`middle`;let n=-1/0,a=m.values.map((e,t)=>({py:g(e),text:m.labels[t]})).sort((e,t)=>e.py-t.py),s=o.fontSize+2;for(let{py:e,text:i}of a)if(!(e<u.y-.5||e>u.y+u.height+.5)){if(r.horizontal){if(e-s/2<n)continue;n=e+s/2}t.fillText(i,u.x-8,e)}f.title&&(t.save(),t.font=i(o,o.fontSize+1,500),t.fillStyle=e.toCss(o.text,.8),t.translate(_/2+4,u.y+u.height/2),t.rotate(-Math.PI/2),t.textAlign=`center`,t.fillText(f.title,0,0),t.restore())}let v=r.horizontal?null:n.y2,y=n.y2Ticks;if(v&&y&&v.visible){let a=u.x+u.width;t.font=i(o),t.fillStyle=e.toCss(o.textMuted),t.textAlign=`left`,t.textBaseline=`middle`,y.values.forEach((e,n)=>{let i=r.yToPx(e);i<u.y-.5||i>u.y+u.height+.5||t.fillText(y.labels[n],a+8,i)}),v.title&&(t.save(),t.font=i(o,o.fontSize+1,500),t.fillStyle=e.toCss(o.text,.8),t.translate(n.width-_/2-4,u.y+u.height/2),t.rotate(Math.PI/2),t.textAlign=`center`,t.fillText(v.title,0,0),t.restore())}},m=(e,t)=>e.x<t.x+t.width&&t.x<e.x+e.width&&e.y<t.y+t.height&&t.y<e.y+e.height,h=(e,t)=>e.x>=t.x&&e.y>=t.y&&e.x+e.width<=t.x+t.width&&e.y+e.height<=t.y+t.height,g=(e,t,n,r,i,a)=>{e.lineWidth=3,e.lineJoin=`round`,e.strokeStyle=a,e.strokeText(t,n,r),e.fillStyle=i,e.fillText(t,n,r)},_=(e,t,r,i)=>{let a=e.bar;if(!a)return null;let o=Math.max(a.x,t.x),s=Math.min(a.x+a.width,t.x+t.width),c=Math.max(a.y,t.y),l=Math.min(a.y+a.height,t.y+t.height);if(l-c<i-2)return null;let d=u(e.text,s-o-12,r);if(!d)return null;let f=r(d),p=e.align===`start`?o+n:(o+s)/2-f/2;return{label:d===e.text?e:{...e,text:d},box:{x:p,y:(c+l)/2-i/2,width:f,height:i}}},v=2,y=(e,t,n,r,i,a)=>{let o=Math.max(t.x,n.x)+v,s=Math.min(t.x+t.width,n.x+n.width)-v,c=Math.max(t.y,n.y)+v,l=Math.min(t.y+t.height,n.y+n.height)-v;if(s-o<=0||l-c<i)return null;let d={x:o-.01,y:c-.01,width:s-o+.02,height:l-c+.02},f=e=>h(e,d)&&!a.some(t=>m(t,e)),p=e.r+4,g=Math.min(Math.max(e.y-i/2,c),l-i),_={right:s-(e.x+p),left:e.x-p-o},y=_.right>=_.left?[`right`,`left`]:[`left`,`right`],b=(t,n)=>[{x:t===`right`?e.x+p:e.x-p-n,y:g,width:n,height:i}],x=t=>{let n=Math.min(Math.max(e.x-t/2,o),s-t);return[{x:n,y:e.y-p-i,width:t,height:i},{x:n,y:e.y+p,width:t,height:i}]},S=r(e.text),C=[...b(y[0],S),...b(y[1],S),...x(S)].find(f);if(C)return{label:e,box:C};let w=[[_[y[0]],e=>b(y[0],e)],[_[y[1]],e=>b(y[1],e)],[s-o,x]],T=null,E=Array.from(e.text).length,D=Math.min(4,Math.ceil(E*.4));for(let[t,n]of w){let i=u(e.text,t,r);if(!i||T&&i.length<=T.label.text.length||Array.from(i).length-1<D)continue;let a=n(r(i)).find(f);a&&(T={label:{...e,text:i},box:a})}return T},b=(e,t,n,r,i=[])=>{let a=[];for(let o of e){if(o.placement===`inside`){let e=_(o,t,n,r);e&&a.push(e);continue}if(o.bounds){let e=y(o,o.bounds,t,n,r,i);if(!e)continue;i.push(e.box),a.push(e);continue}let e=n(o.text),s=o.r+4,c={x:o.x-e/2,y:o.y-s-r,width:e,height:r},l={x:o.x-e/2,y:o.y+s,width:e,height:r},u={x:o.x+s,y:o.y-r/2,width:e,height:r},d={x:o.x-s-e,y:o.y-r/2,width:e,height:r},f=(o.placement===`above`?[c]:o.placement===`below`?[l]:o.placement===`right`?[u,d]:o.placement===`left`?[d,u]:[{x:o.x+s,y:o.y-r/2,width:e,height:r},{x:o.x-s-e,y:o.y-r/2,width:e,height:r},c,l]).find(e=>h(e,t)&&!i.some(t=>m(t,e)));f&&(i.push(f),a.push({label:o,box:f}))}return a},x=(e,t)=>{for(let n of t){let t=n.points,r=t[0];if(!r)continue;e.strokeStyle=n.color,e.fillStyle=n.color,e.lineWidth=n.width,e.lineJoin=`round`,e.setLineDash([]),e.beginPath(),e.moveTo(r.x,r.y);for(let n=1;n<t.length;n++){let r=t[n],i=t[n+1],a=t[n-1];if(i&&typeof e.arcTo==`function`){let t=Math.min(4,Math.hypot(r.x-a.x,r.y-a.y)/2,Math.hypot(i.x-r.x,i.y-r.y)/2);e.arcTo(r.x,r.y,i.x,i.y,t)}else e.lineTo(r.x,r.y)}e.stroke();let[i,a,o]=n.head;i&&a&&o&&(e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.lineTo(o.x,o.y),e.closePath(),e.fill())}},S=(t,n)=>{let{scales:r,theme:u}=n,{plot:p}=r;n.clear!==!1&&t.clearRect(0,0,n.width,n.height),t.save(),t.beginPath(),t.rect(p.x,p.y,p.width,p.height),t.clip();for(let e of n.connectors??[]){t.strokeStyle=e.color,t.lineWidth=e.width,t.setLineDash([...e.dash]),t.beginPath();let n=e.y0===e.y1,r=n?e.x0:a(e.x0),i=n?a(e.y0):e.y0;t.moveTo(r,i),t.lineTo(n?e.x1:r,n?i:e.y1),t.stroke()}t.setLineDash([]),n.arrows?.length&&x(t,n.arrows);let m=e.toCss(u.background,.9),h=[],_=u.fontSize+4;for(let o of n.annotations){if(o.type!==`line`)continue;let n=e.toCss(o.color);t.strokeStyle=n,t.lineWidth=o.width,t.setLineDash(o.dash),t.beginPath();let s=f(o,r);if(s.vertical){let e=a(s.at);t.moveTo(e,p.y),t.lineTo(e,p.y+p.height),t.stroke(),o.label&&(t.setLineDash([]),t.font=i(u,u.fontSize,500),t.textAlign=`left`,t.textBaseline=`top`,g(t,o.label,e+5,p.y+5,n,m))}else{let e=a(s.at);t.moveTo(p.x,e),t.lineTo(p.x+p.width,e),t.stroke(),o.label&&(t.setLineDash([]),t.font=i(u,u.fontSize,500),t.textAlign=`right`,t.textBaseline=`bottom`,g(t,o.label,p.x+p.width-6,e-3,n,m))}}t.setLineDash([]);for(let a of n.annotations){if(a.type!==`rect`||!l(a))continue;let n=d(a,c(a,r),u.fontSize,(e,n,r)=>(t.font=i(u,n,r),t.measureText(e).width));if(!n)continue;let s=e.toCss(a.labelColor),f=e.toCss(u.textMuted);t.textAlign=`left`,t.textBaseline=`middle`;for(let r of n.parts){let n=r.y+r.height/2;if(r.kind===`badge`){let c=r.height-2;o(t,r.x,n-c/2,r.width,c),t.fillStyle=e.toCss(a.labelColor,.16),t.fill(),t.font=i(u,r.size,r.weight),t.fillStyle=s,t.fillText(r.text,r.x+5,n);continue}t.font=i(u,r.size,r.weight),t.fillStyle=r.kind===`label`?s:f,t.fillText(r.text,r.x,n)}h.push(n.box)}for(let a of n.annotations){if(a.type!==`text`||!a.text)continue;t.font=i(u,u.fontSize,a.weight);let n=s(a,r,t.measureText(a.text).width,_);t.textAlign=`left`,t.textBaseline=`middle`,g(t,a.text,n.x,n.y+n.height/2,e.toCss(a.color),m),h.push(n)}let v=[];if(n.pointLabels.length){t.font=i(u),t.textAlign=`left`,t.textBaseline=`middle`;let r=e.toCss(u.text,.85);v=b(n.pointLabels,p,e=>t.measureText(e).width,_-2,h);for(let{label:e,box:n}of v){let i=n.y+n.height/2;e.color?(t.fillStyle=e.color,t.fillText(e.text,n.x,i)):g(t,e.text,n.x,i,r,m)}}return t.restore(),v};exports.areaTitleLayout=d,exports.drawArrows=x,exports.drawBackground=p,exports.drawForeground=S,exports.font=i,exports.hasAreaTitle=l,exports.insideLabelColor=r,exports.lineOf=f,exports.placeLabels=b,exports.rectOf=c,exports.textBox=s;
1
+ const e=require("./color.cjs"),t=require("./layout.cjs");var n=6,r=(t,n)=>{let r=t[3];if(r<.6)return;let i=e.mix(n,t,r),a=e.relativeLuminance(i);return 1.05/(a+.05)>=(a+.05)/.062?`#ffffff`:`rgba(17, 24, 39, 0.92)`},i=(e,t=e.fontSize,n=400)=>`${n} ${t}px ${e.fontFamily}`,a=e=>Math.round(e)+.5,o=(e,t,n,r,i)=>{let a=Math.min(i/2,r/2);e.beginPath(),e.moveTo(t+a,n),e.lineTo(t+r-a,n),e.arcTo(t+r,n,t+r,n+a,a),e.lineTo(t+r,n+i-a),e.arcTo(t+r,n+i,t+r-a,n+i,a),e.lineTo(t+a,n+i),e.arcTo(t,n+i,t,n+i-a,a),e.lineTo(t,n+a),e.arcTo(t,n,t+a,n,a),e.closePath()},s=(e,n,r,i)=>{let{plot:a}=n,o=t.toScreen(n,e.x??0,e.y??0),s=n.horizontal?{x:e.y===void 0,y:e.x===void 0}:{x:e.x===void 0,y:e.y===void 0},c=s.x?a.x+a.width/2:o.x,l=s.y?a.y+a.height/2:o.y,u=c-r/2,d=l-i/2;return e.anchor===`top`?d=l+6:e.anchor===`bottom`?d=l-6-i:e.anchor===`left`?u=c+6:e.anchor===`right`&&(u=c-6-r),u=Math.max(a.x+6,Math.min(u,a.x+a.width-6-r)),d=Math.max(a.y+2,Math.min(d,a.y+a.height-2-i)),{x:u,y:d,width:r,height:i}},c=(e,n)=>{let{plot:r}=n,[i,a]=n.horizontal?[r.y,r.y+r.height]:[r.x,r.x+r.width],[o,s]=n.horizontal?[r.x,r.x+r.width]:[r.y,r.y+r.height],c=(e,t,n)=>e<t?t:e>n?n:e;return t.screenRect(n,c(n.xToPx(e.x0??-1/0),i,a),c(n.xToPx(e.x1??1/0),i,a),c(n.yToPx(e.y0??-1/0),o,s),c(n.yToPx(e.y1??1/0),o,s))},l=e=>!!(e.label||e.badge||e.detail||e.description),u=(e,t,n)=>{if(n(e)<=t)return e;let r=Array.from(e),i=0,a=r.length;for(;i<a;){let e=Math.ceil((i+a)/2);n(`${r.slice(0,e).join(``)}…`)<=t?i=e:a=e-1}return i>0?`${r.slice(0,i).join(``).trimEnd()}…`:``},d=(e,t,n,r)=>{if(!l(e)||t.width<=0||t.height<=0)return null;let i=n+4,a=Math.max(0,t.width-20),o=n+1,s=Math.max(9,n-1),c=e.badge?u(e.badge,Math.max(0,a-10),e=>r(e,s,700)):``,d=c?r(c,s,700)+10:0,f=e.detail??``,p=f?r(f,n,500):0,m=()=>a-(c?d+6:0)-(f?p+6:0);f&&e.label&&m()<32&&(f=``,p=0),f&&m()<0&&(f=u(f,Math.max(0,a-(c?d+6:0)),e=>r(e,n,500)),p=f?r(f,n,500):0);let h=e.label?u(e.label,Math.max(0,m()),e=>r(e,o,600)):``,g=[];c&&g.push({kind:`badge`,text:c,x:0,y:0,width:d,height:i,size:s,weight:700}),h&&g.push({kind:`label`,text:h,x:0,y:0,width:r(h,o,600),height:i,size:o,weight:600}),f&&g.push({kind:`detail`,text:f,x:0,y:0,width:p,height:i,size:n,weight:500});let _=e.description?u(e.description,a,e=>r(e,n,400)):``,v=g.reduce((e,t)=>e+t.width,0)+Math.max(0,g.length-1)*6,y=_?r(_,n,400):0;if(!g.length&&!_)return null;let b=(g.length?i:0)+(_?i+(g.length?2:0):0),x=e.labelPosition,S=x.startsWith(`top`)?t.y+10:x.startsWith(`bottom`)?t.y+t.height-10-b:t.y+(t.height-b)/2,C=e=>x.endsWith(`left`)?t.x+10:x.endsWith(`right`)?t.x+t.width-10-e:t.x+(t.width-e)/2,w=[],T=C(v);for(let e of g)w.push({...e,x:T,y:S}),T+=e.width+6;_&&w.push({kind:`description`,text:_,x:C(y),y:S+(g.length?i+2:0),width:y,height:i,size:n,weight:400});let E=Math.max(v,y);return{parts:w,box:{x:C(E),y:S,width:E,height:b}}},f=(e,t)=>({vertical:e.axis===`x`!==t.horizontal,at:e.axis===`x`?t.xToPx(e.value):t.yToPx(e.value)}),p=(t,n)=>{let{scales:r,theme:o,xTicks:s,yTicks:l}=n,{plot:u}=r,d=r.horizontal?n.y:n.x,f=r.horizontal?n.x:n.y,p=r.horizontal?l:s,m=r.horizontal?s:l,h=r.horizontal?r.yToPx:r.xToPx,g=r.horizontal?r.xToPx:r.yToPx;t.clearRect(0,0,n.width,n.height),t.save(),t.beginPath(),t.rect(u.x,u.y,u.width,u.height),t.clip();for(let i of n.annotations){if(i.type!==`rect`)continue;let n=c(i,r);n.width<=0||n.height<=0||(t.fillStyle=e.toCss(i.color,i.opacity),t.fillRect(n.x,n.y,n.width,n.height))}if(t.restore(),t.lineWidth=1,t.strokeStyle=e.toCss(o.grid),t.beginPath(),f.grid)for(let e of m.values){let n=a(g(e));n<u.y-1||n>u.y+u.height+1||(t.moveTo(u.x,n),t.lineTo(u.x+u.width,n))}if(d.grid)for(let e of p.values){let n=a(h(e));n<u.x-1||n>u.x+u.width+1||(t.moveTo(n,u.y),t.lineTo(n,u.y+u.height))}t.stroke();let _=Math.ceil(o.fontSize*1.4);if(t.font=i(o),t.fillStyle=e.toCss(o.textMuted),d.visible){t.strokeStyle=e.toCss(o.axis),t.beginPath();let r=a(u.y+u.height);t.moveTo(u.x,r),t.lineTo(u.x+u.width,r),t.stroke(),t.textBaseline=`top`,t.textAlign=`center`;let s=-1/0,c=p.values.map((e,t)=>({px:h(e),text:p.labels[t]})).sort((e,t)=>e.px-t.px);for(let{px:e,text:r}of c){if(e<u.x-.5||e>u.x+u.width+.5)continue;let i=t.measureText(r).width,a=Math.max(0,Math.min(n.width-i,e-i/2));a<s+6||(s=a+i,t.fillText(r,a+i/2,u.y+u.height+7))}d.title&&(t.font=i(o,o.fontSize+1,500),t.fillStyle=e.toCss(o.text,.8),t.fillText(d.title,u.x+u.width/2,u.y+u.height+_+10))}if(f.visible){t.font=i(o),t.fillStyle=e.toCss(o.textMuted),t.textAlign=`right`,t.textBaseline=`middle`;let n=-1/0,a=m.values.map((e,t)=>({py:g(e),text:m.labels[t]})).sort((e,t)=>e.py-t.py),s=o.fontSize+2;for(let{py:e,text:i}of a)if(!(e<u.y-.5||e>u.y+u.height+.5)){if(r.horizontal){if(e-s/2<n)continue;n=e+s/2}t.fillText(i,u.x-8,e)}f.title&&(t.save(),t.font=i(o,o.fontSize+1,500),t.fillStyle=e.toCss(o.text,.8),t.translate(_/2+4,u.y+u.height/2),t.rotate(-Math.PI/2),t.textAlign=`center`,t.fillText(f.title,0,0),t.restore())}let v=r.horizontal?null:n.y2,y=n.y2Ticks;if(v&&y&&v.visible){let a=u.x+u.width;t.font=i(o),t.fillStyle=e.toCss(o.textMuted),t.textAlign=`left`,t.textBaseline=`middle`,y.values.forEach((e,n)=>{let i=r.yToPx(e);i<u.y-.5||i>u.y+u.height+.5||t.fillText(y.labels[n],a+8,i)}),v.title&&(t.save(),t.font=i(o,o.fontSize+1,500),t.fillStyle=e.toCss(o.text,.8),t.translate(n.width-_/2-4,u.y+u.height/2),t.rotate(Math.PI/2),t.textAlign=`center`,t.fillText(v.title,0,0),t.restore())}},m=(e,t)=>e.x<t.x+t.width&&t.x<e.x+e.width&&e.y<t.y+t.height&&t.y<e.y+e.height,h=(e,t)=>e.x>=t.x&&e.y>=t.y&&e.x+e.width<=t.x+t.width&&e.y+e.height<=t.y+t.height,g=(e,t,n,r,i,a)=>{e.lineWidth=3,e.lineJoin=`round`,e.strokeStyle=a,e.strokeText(t,n,r),e.fillStyle=i,e.fillText(t,n,r)},_=(e,t,r,i)=>{let a=e.bar;if(!a)return null;let o=Math.max(a.x,t.x),s=Math.min(a.x+a.width,t.x+t.width),c=Math.max(a.y,t.y),l=Math.min(a.y+a.height,t.y+t.height);if(l-c<i-2)return null;let d=u(e.text,s-o-12,r);if(!d)return null;let f=r(d),p=e.align===`start`?o+n:(o+s)/2-f/2;return{label:d===e.text?e:{...e,text:d},box:{x:p,y:(c+l)/2-i/2,width:f,height:i}}},v=2,y={x:4,y:2},b=(e,t,n)=>Math.hypot(Math.max(n.x-e,0,e-(n.x+n.width)),Math.max(n.y-t,0,t-(n.y+n.height))),x=(e,t,n,r,i,a,o=[])=>{let s=Math.max(t.x,n.x)+v,c=Math.min(t.x+t.width,n.x+n.width)-v,l=Math.max(t.y,n.y)+v,d=Math.min(t.y+t.height,n.y+n.height)-v;if(c-s<=0||d-l<i)return null;let f={x:s-.01,y:l-.01,width:c-s+.02,height:d-l+.02},p=o.filter(t=>Math.abs(t.x-e.x)>=.5||Math.abs(t.y-e.y)>=.5),g=t=>{if(!h(t,f))return!1;let n={x:t.x-y.x,y:t.y-y.y,width:t.width+y.x*2,height:t.height+y.y*2};if(a.some(e=>m(e,n)))return!1;let r=b(e.x,e.y,t);return p.every(e=>{let n=b(e.x,e.y,t);return n>=e.r+2&&n>r})},_=e.r+4,x=Math.min(Math.max(e.y-i/2,l),d-i),S={right:c-(e.x+_),left:e.x-_-s},C=S.right>=S.left?[`right`,`left`]:[`left`,`right`],w=(t,n)=>[{x:t===`right`?e.x+_:e.x-_-n,y:x,width:n,height:i}],T=(t,n)=>[e.y-i-1,e.y+1].map(r=>({x:t===`right`?e.x+_:e.x-_-n,y:Math.min(Math.max(r,l),d-i),width:n,height:i})),E=t=>{let n=Math.min(Math.max(e.x-t/2,s),c-t);return[{x:n,y:e.y-_-i,width:t,height:i},{x:n,y:e.y+_,width:t,height:i}]},D=r(e.text),O=[...w(C[0],D),...w(C[1],D),...E(D),...T(C[0],D),...T(C[1],D)].find(g);if(O)return{label:e,box:O};let k=[[S[C[0]],e=>[...w(C[0],e),...T(C[0],e)]],[S[C[1]],e=>[...w(C[1],e),...T(C[1],e)]],[c-s,E]],A=null,j=Array.from(e.text).length,M=Math.min(4,Math.ceil(j*.4));for(let[t,n]of k){let i=u(e.text,t,r);if(!i||A&&i.length<=A.label.text.length||Array.from(i).length-1<M)continue;let a=n(r(i)).find(g);a&&(A={label:{...e,text:i},box:a})}return A},S=(e,t,n,r,i=[])=>{let a=[],o=e.filter(e=>e.bounds);for(let s of e){if(s.placement===`inside`){let e=_(s,t,n,r);e&&a.push(e);continue}if(s.bounds){let e=x(s,s.bounds,t,n,r,i,o);if(!e)continue;i.push(e.box),a.push(e);continue}let e=n(s.text),c=s.r+4,l={x:s.x-e/2,y:s.y-c-r,width:e,height:r},u={x:s.x-e/2,y:s.y+c,width:e,height:r},d={x:s.x+c,y:s.y-r/2,width:e,height:r},f={x:s.x-c-e,y:s.y-r/2,width:e,height:r},p=(s.placement===`above`?[l]:s.placement===`below`?[u]:s.placement===`right`?[d,f]:s.placement===`left`?[f,d]:[{x:s.x+c,y:s.y-r/2,width:e,height:r},{x:s.x-c-e,y:s.y-r/2,width:e,height:r},l,u]).find(e=>h(e,t)&&!i.some(t=>m(t,e)));p&&(i.push(p),a.push({label:s,box:p}))}return a},C=(e,t)=>{for(let n of t){let t=n.points,r=t[0];if(!r)continue;e.strokeStyle=n.color,e.fillStyle=n.color,e.lineWidth=n.width,e.lineJoin=`round`,e.setLineDash([]),e.beginPath(),e.moveTo(r.x,r.y);for(let n=1;n<t.length;n++){let r=t[n],i=t[n+1],a=t[n-1];if(i&&typeof e.arcTo==`function`){let t=Math.min(4,Math.hypot(r.x-a.x,r.y-a.y)/2,Math.hypot(i.x-r.x,i.y-r.y)/2);e.arcTo(r.x,r.y,i.x,i.y,t)}else e.lineTo(r.x,r.y)}e.stroke();let[i,a,o]=n.head;i&&a&&o&&(e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.lineTo(o.x,o.y),e.closePath(),e.fill())}},w=(t,n)=>{let{scales:r,theme:u}=n,{plot:p}=r;n.clear!==!1&&t.clearRect(0,0,n.width,n.height),t.save(),t.beginPath(),t.rect(p.x,p.y,p.width,p.height),t.clip();for(let e of n.connectors??[]){t.strokeStyle=e.color,t.lineWidth=e.width,t.setLineDash([...e.dash]),t.beginPath();let n=e.y0===e.y1,r=n?e.x0:a(e.x0),i=n?a(e.y0):e.y0;t.moveTo(r,i),t.lineTo(n?e.x1:r,n?i:e.y1),t.stroke()}t.setLineDash([]),n.arrows?.length&&C(t,n.arrows);let m=e.toCss(u.background,.9),h=[],_=u.fontSize+4;for(let o of n.annotations){if(o.type!==`line`)continue;let n=e.toCss(o.color);t.strokeStyle=n,t.lineWidth=o.width,t.setLineDash(o.dash),t.beginPath();let s=f(o,r);if(s.vertical){let e=a(s.at);t.moveTo(e,p.y),t.lineTo(e,p.y+p.height),t.stroke(),o.label&&(t.setLineDash([]),t.font=i(u,u.fontSize,500),t.textAlign=`left`,t.textBaseline=`top`,g(t,o.label,e+5,p.y+5,n,m))}else{let e=a(s.at);t.moveTo(p.x,e),t.lineTo(p.x+p.width,e),t.stroke(),o.label&&(t.setLineDash([]),t.font=i(u,u.fontSize,500),t.textAlign=`right`,t.textBaseline=`bottom`,g(t,o.label,p.x+p.width-6,e-3,n,m))}}t.setLineDash([]);for(let a of n.annotations){if(a.type!==`rect`||!l(a))continue;let n=d(a,c(a,r),u.fontSize,(e,n,r)=>(t.font=i(u,n,r),t.measureText(e).width));if(!n)continue;let s=e.toCss(a.labelColor),f=e.toCss(u.textMuted);t.textAlign=`left`,t.textBaseline=`middle`;for(let r of n.parts){let n=r.y+r.height/2;if(r.kind===`badge`){let c=r.height-2;o(t,r.x,n-c/2,r.width,c),t.fillStyle=e.toCss(a.labelColor,.16),t.fill(),t.font=i(u,r.size,r.weight),t.fillStyle=s,t.fillText(r.text,r.x+5,n);continue}t.font=i(u,r.size,r.weight),t.fillStyle=r.kind===`label`?s:f,t.fillText(r.text,r.x,n)}h.push(n.box)}for(let a of n.annotations){if(a.type!==`text`||!a.text)continue;t.font=i(u,u.fontSize,a.weight);let n=s(a,r,t.measureText(a.text).width,_);t.textAlign=`left`,t.textBaseline=`middle`,g(t,a.text,n.x,n.y+n.height/2,e.toCss(a.color),m),h.push(n)}let v=[];if(n.pointLabels.length){t.font=i(u),t.textAlign=`left`,t.textBaseline=`middle`;let r=e.toCss(u.text,.85);v=S(n.pointLabels,p,e=>t.measureText(e).width,_-2,h);for(let{label:e,box:n}of v){if(e.hidden)continue;let i=n.y+n.height/2;e.color?(t.fillStyle=e.color,t.fillText(e.text,n.x,i)):g(t,e.text,n.x,i,r,m)}}return t.restore(),v};exports.areaTitleLayout=d,exports.drawArrows=C,exports.drawBackground=p,exports.drawForeground=w,exports.font=i,exports.hasAreaTitle=l,exports.insideLabelColor=r,exports.lineOf=f,exports.placeLabels=S,exports.rectOf=c,exports.textBox=s;
2
2
  //# sourceMappingURL=overlay.cjs.map