minerva-design 1.13.2 → 1.14.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 (202) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/custom-elements.json +194 -12
  3. package/dist/angular/fesm2022/minerva-angular.mjs +20 -0
  4. package/dist/angular/fesm2022/minerva-angular.mjs.map +1 -1
  5. package/dist/angular/types/minerva-angular.d.ts +10 -1
  6. package/dist/charts/canvas.d.cts +1 -0
  7. package/dist/charts/canvas.d.ts +1 -0
  8. package/dist/charts/engine/canvas.cjs +1 -1
  9. package/dist/charts/engine/canvas.cjs.map +1 -1
  10. package/dist/charts/engine/canvas.js +152 -128
  11. package/dist/charts/engine/canvas.js.map +1 -1
  12. package/dist/charts/engine/chart.cjs +1 -1
  13. package/dist/charts/engine/chart.cjs.map +1 -1
  14. package/dist/charts/engine/chart.js +475 -405
  15. package/dist/charts/engine/chart.js.map +1 -1
  16. package/dist/charts/engine/controller.cjs +2 -2
  17. package/dist/charts/engine/controller.cjs.map +1 -1
  18. package/dist/charts/engine/controller.js +263 -248
  19. package/dist/charts/engine/controller.js.map +1 -1
  20. package/dist/charts/engine/dom.cjs +1 -1
  21. package/dist/charts/engine/dom.cjs.map +1 -1
  22. package/dist/charts/engine/dom.d.cts +34 -0
  23. package/dist/charts/engine/dom.d.ts +34 -0
  24. package/dist/charts/engine/dom.js +62 -51
  25. package/dist/charts/engine/dom.js.map +1 -1
  26. package/dist/charts/engine/graph/chart.cjs +1 -1
  27. package/dist/charts/engine/graph/chart.cjs.map +1 -1
  28. package/dist/charts/engine/graph/chart.js +835 -821
  29. package/dist/charts/engine/graph/chart.js.map +1 -1
  30. package/dist/charts/engine/graph/dom.cjs +1 -1
  31. package/dist/charts/engine/graph/dom.cjs.map +1 -1
  32. package/dist/charts/engine/graph/dom.js +44 -51
  33. package/dist/charts/engine/graph/dom.js.map +1 -1
  34. package/dist/charts/engine/hover-rect.cjs +2 -0
  35. package/dist/charts/engine/hover-rect.cjs.map +1 -0
  36. package/dist/charts/engine/hover-rect.d.cts +10 -0
  37. package/dist/charts/engine/hover-rect.d.ts +10 -0
  38. package/dist/charts/engine/hover-rect.js +47 -0
  39. package/dist/charts/engine/hover-rect.js.map +1 -0
  40. package/dist/charts/engine/items.cjs +1 -1
  41. package/dist/charts/engine/items.cjs.map +1 -1
  42. package/dist/charts/engine/items.js +8 -8
  43. package/dist/charts/engine/model.cjs +1 -1
  44. package/dist/charts/engine/model.cjs.map +1 -1
  45. package/dist/charts/engine/model.js +191 -191
  46. package/dist/charts/engine/model.js.map +1 -1
  47. package/dist/charts/engine/orderbook/depth.cjs +1 -1
  48. package/dist/charts/engine/orderbook/depth.cjs.map +1 -1
  49. package/dist/charts/engine/orderbook/depth.js +63 -63
  50. package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
  51. package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
  52. package/dist/charts/engine/orderbook/heatmap.js +155 -155
  53. package/dist/charts/engine/orderbook/host.cjs +1 -1
  54. package/dist/charts/engine/orderbook/host.cjs.map +1 -1
  55. package/dist/charts/engine/orderbook/host.js +87 -75
  56. package/dist/charts/engine/orderbook/host.js.map +1 -1
  57. package/dist/charts/engine/orderbook/ladder.cjs +1 -1
  58. package/dist/charts/engine/orderbook/ladder.cjs.map +1 -1
  59. package/dist/charts/engine/orderbook/ladder.js +41 -41
  60. package/dist/charts/engine/orderbook/tape.cjs +1 -1
  61. package/dist/charts/engine/orderbook/tape.cjs.map +1 -1
  62. package/dist/charts/engine/orderbook/tape.js +31 -31
  63. package/dist/charts/engine/presets.cjs +2 -2
  64. package/dist/charts/engine/presets.cjs.map +1 -1
  65. package/dist/charts/engine/presets.js +15 -15
  66. package/dist/charts/engine/renderers/vector-gpu.cjs +24 -0
  67. package/dist/charts/engine/renderers/vector-gpu.cjs.map +1 -0
  68. package/dist/charts/engine/renderers/vector-gpu.d.cts +22 -0
  69. package/dist/charts/engine/renderers/vector-gpu.d.ts +22 -0
  70. package/dist/charts/engine/renderers/vector-gpu.js +301 -0
  71. package/dist/charts/engine/renderers/vector-gpu.js.map +1 -0
  72. package/dist/charts/engine/renderers/vector.cjs +2 -0
  73. package/dist/charts/engine/renderers/vector.cjs.map +1 -0
  74. package/dist/charts/engine/renderers/vector.d.cts +140 -0
  75. package/dist/charts/engine/renderers/vector.d.ts +140 -0
  76. package/dist/charts/engine/renderers/vector.js +568 -0
  77. package/dist/charts/engine/renderers/vector.js.map +1 -0
  78. package/dist/charts/engine/scene.cjs +1 -1
  79. package/dist/charts/engine/scene.cjs.map +1 -1
  80. package/dist/charts/engine/scene.d.cts +43 -3
  81. package/dist/charts/engine/scene.d.ts +43 -3
  82. package/dist/charts/engine/scene.js +411 -338
  83. package/dist/charts/engine/scene.js.map +1 -1
  84. package/dist/charts/engine/shapes/bullet.cjs +1 -1
  85. package/dist/charts/engine/shapes/bullet.cjs.map +1 -1
  86. package/dist/charts/engine/shapes/bullet.js +36 -36
  87. package/dist/charts/engine/shapes/calendar.cjs +1 -1
  88. package/dist/charts/engine/shapes/calendar.cjs.map +1 -1
  89. package/dist/charts/engine/shapes/calendar.js +53 -53
  90. package/dist/charts/engine/shapes/chart.cjs +1 -1
  91. package/dist/charts/engine/shapes/chart.cjs.map +1 -1
  92. package/dist/charts/engine/shapes/chart.d.cts +3 -2
  93. package/dist/charts/engine/shapes/chart.d.ts +3 -2
  94. package/dist/charts/engine/shapes/chart.js +192 -162
  95. package/dist/charts/engine/shapes/chart.js.map +1 -1
  96. package/dist/charts/engine/shapes/draw.cjs +1 -1
  97. package/dist/charts/engine/shapes/draw.cjs.map +1 -1
  98. package/dist/charts/engine/shapes/draw.js +87 -86
  99. package/dist/charts/engine/shapes/draw.js.map +1 -1
  100. package/dist/charts/engine/shapes/layout.cjs +2 -2
  101. package/dist/charts/engine/shapes/layout.cjs.map +1 -1
  102. package/dist/charts/engine/shapes/layout.d.cts +8 -7
  103. package/dist/charts/engine/shapes/layout.d.ts +8 -7
  104. package/dist/charts/engine/shapes/layout.js +262 -166
  105. package/dist/charts/engine/shapes/layout.js.map +1 -1
  106. package/dist/charts/engine/shapes/types.d.cts +13 -1
  107. package/dist/charts/engine/shapes/types.d.ts +13 -1
  108. package/dist/charts/engine/three-d/chart.cjs +1 -1
  109. package/dist/charts/engine/three-d/chart.cjs.map +1 -1
  110. package/dist/charts/engine/three-d/chart.js +266 -257
  111. package/dist/charts/engine/three-d/chart.js.map +1 -1
  112. package/dist/charts/engine/three-d/dom.cjs +1 -1
  113. package/dist/charts/engine/three-d/dom.cjs.map +1 -1
  114. package/dist/charts/engine/three-d/dom.js +28 -35
  115. package/dist/charts/engine/three-d/dom.js.map +1 -1
  116. package/dist/charts/engine/three-d/geometry.cjs +1 -1
  117. package/dist/charts/engine/three-d/geometry.cjs.map +1 -1
  118. package/dist/charts/engine/three-d/geometry.js +70 -70
  119. package/dist/charts/engine/three-d/overlay.cjs +1 -1
  120. package/dist/charts/engine/three-d/overlay.cjs.map +1 -1
  121. package/dist/charts/engine/three-d/overlay.js +15 -15
  122. package/dist/charts/engine/tooltip.cjs +2 -0
  123. package/dist/charts/engine/tooltip.cjs.map +1 -0
  124. package/dist/charts/engine/tooltip.d.cts +94 -0
  125. package/dist/charts/engine/tooltip.d.ts +94 -0
  126. package/dist/charts/engine/tooltip.js +242 -0
  127. package/dist/charts/engine/tooltip.js.map +1 -0
  128. package/dist/charts/engine/trading/chart.cjs +1 -1
  129. package/dist/charts/engine/trading/chart.cjs.map +1 -1
  130. package/dist/charts/engine/trading/chart.js +135 -135
  131. package/dist/charts/react/shapes.cjs +1 -1
  132. package/dist/charts/react/shapes.cjs.map +1 -1
  133. package/dist/charts/react/shapes.d.cts +10 -1
  134. package/dist/charts/react/shapes.d.ts +10 -1
  135. package/dist/charts/react/shapes.js +24 -19
  136. package/dist/charts/react/shapes.js.map +1 -1
  137. package/dist/core/contracts.cjs +1 -1
  138. package/dist/core/contracts.cjs.map +1 -1
  139. package/dist/core/contracts.js +1 -1
  140. package/dist/core/contracts.js.map +1 -1
  141. package/dist/native/charts/src/canvas.cjs +1 -1
  142. package/dist/native/charts/src/canvas.js +8 -7
  143. package/dist/native/charts/src/engine/canvas.cjs +1 -1
  144. package/dist/native/charts/src/engine/canvas.js +2 -0
  145. package/dist/native/charts/src/engine/controller.cjs +2 -2
  146. package/dist/native/charts/src/engine/controller.cjs.map +1 -1
  147. package/dist/native/charts/src/engine/controller.js +102 -87
  148. package/dist/native/charts/src/engine/controller.js.map +1 -1
  149. package/dist/native/charts/src/engine/hover-rect.cjs +2 -0
  150. package/dist/native/charts/src/engine/hover-rect.cjs.map +1 -0
  151. package/dist/native/charts/src/engine/hover-rect.js +47 -0
  152. package/dist/native/charts/src/engine/hover-rect.js.map +1 -0
  153. package/dist/native/charts/src/engine/scene.cjs +1 -1
  154. package/dist/native/charts/src/engine/scene.cjs.map +1 -1
  155. package/dist/native/charts/src/engine/scene.js +318 -245
  156. package/dist/native/charts/src/engine/scene.js.map +1 -1
  157. package/dist/native/charts/src/engine/shapes/draw.cjs +1 -1
  158. package/dist/native/charts/src/engine/shapes/draw.cjs.map +1 -1
  159. package/dist/native/charts/src/engine/shapes/draw.js +81 -80
  160. package/dist/native/charts/src/engine/shapes/draw.js.map +1 -1
  161. package/dist/native/charts/src/engine/shapes/layout.cjs +2 -2
  162. package/dist/native/charts/src/engine/shapes/layout.cjs.map +1 -1
  163. package/dist/native/charts/src/engine/shapes/layout.js +239 -143
  164. package/dist/native/charts/src/engine/shapes/layout.js.map +1 -1
  165. package/dist/native/charts/src/engine/tooltip.cjs +2 -0
  166. package/dist/native/charts/src/engine/tooltip.cjs.map +1 -0
  167. package/dist/native/charts/src/engine/tooltip.js +164 -0
  168. package/dist/native/charts/src/engine/tooltip.js.map +1 -0
  169. package/dist/native/components/Chart/scene.cjs +1 -1
  170. package/dist/native/components/Chart/scene.cjs.map +1 -1
  171. package/dist/native/components/Chart/scene.js +210 -187
  172. package/dist/native/components/Chart/scene.js.map +1 -1
  173. package/dist/native/source/components/Chart/scene.tsx +55 -2
  174. package/dist/taro/index.js +2026 -1626
  175. package/dist/uni/charts-canvas.js +1 -0
  176. package/dist/vue/components/Chart/BulletChart.vue.d.ts +2 -0
  177. package/dist/vue/components/Chart/CalendarHeatmap.vue.d.ts +2 -0
  178. package/dist/vue/components/Chart/ChordChart.vue.d.ts +2 -0
  179. package/dist/vue/components/Chart/DonutChart.vue.d.ts +2 -0
  180. package/dist/vue/components/Chart/FunnelChart.vue.d.ts +2 -0
  181. package/dist/vue/components/Chart/GaugeChart.vue.d.ts +2 -0
  182. package/dist/vue/components/Chart/PieChart.vue.d.ts +2 -0
  183. package/dist/vue/components/Chart/RadarChart.vue.d.ts +2 -0
  184. package/dist/vue/components/Chart/RadialBarChart.vue.d.ts +2 -0
  185. package/dist/vue/components/Chart/SankeyChart.vue.d.ts +2 -0
  186. package/dist/vue/components/Chart/SunburstChart.vue.d.ts +2 -0
  187. package/dist/vue/components/Chart/TreemapChart.vue.d.ts +2 -0
  188. package/dist/vue/components/Chart/props.d.ts +2 -0
  189. package/dist/vue/components/Chart/props.js +1 -0
  190. package/dist/vue/components/Chart/props.js.map +1 -1
  191. package/dist/vue/components/Chart/shape.d.ts +2 -1
  192. package/dist/vue/components/Chart/shape.js +2 -0
  193. package/dist/vue/components/Chart/shape.js.map +1 -1
  194. package/dist/vue/components/Chart/types.d.ts +2 -0
  195. package/dist/weapp/charts/canvas.js +2576 -1969
  196. package/dist/weapp/charts/core.js +1 -0
  197. package/dist/web-components/components/chart/shape-chart.d.ts +9 -7
  198. package/dist/web-components/components/chart/shape-chart.js +3 -0
  199. package/dist/web-components/components/chart/shape-chart.js.map +1 -1
  200. package/dist/web-components/components/chart/shapes-extended.d.ts +6 -6
  201. package/dist/web-components/components/chart/shapes-extended.js.map +1 -1
  202. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"chart.js","names":["styleElement","assign","mid","r","copyView","v","createChart","doc","container","win","dom","createChartDom","cache","hidden","listeners","options","initialOptions","theme","readTheme","model","view","zoomed","origin","items","itemsDirty","version","annotations","dependencies","scales","xTicks","yTicks","y2Ticks","renderer","rendererToken","destroyed","frameId","hover","lastPlot","pointDrag","ghost","drag","markers","bands","cells","guides","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","hitAt","hitTest","px","py","p","draggableAt","it","setHover","changed","sameHover","next","renderHover","tooltipNode","custom","content","tooltipContent","fragment","header","sub","swatches","row","grid","cell","n","pooled","pool","i","make","parent","sc","renderMarks","tip","stageW","stageH","left","top","markerCount","bandCount","cellCount","guideCount","renderLegendCaret","guide","crosshairAt","line","mark","hoverMarks","createBand","createMarker","caret","heatPosition","setViewInternal","notify","viewToValues","zoomAt","at","toData","zoomRange","factor","localPoint","inPlot","x","y","dataAt","cx","cy","fromPlotX","fromPlotY","moveGhost","color","size","series","onPointerMove","dx","dy","from","to","panRange","event2","onPointerDown","draggable","onPointerUp","moved","hit","onPointerLeave","onWheel","modifier","wheelFactor","onDoubleClick","resetZoom","moveFocus","current","step","lowerBound","count","current2","span","createScales","pointOf","leadItem","hoverItemOf","onKeyDown","center","onFocus","visible","onBlur","stage","resizeObserver","refreshTheme","themeColorsChanged","unwatchTheme","watchTheme","unwatchLocale","watchLocale","initRenderer","token","createRenderer","createDataCanvas","kind","exclude","unfollowDefault","followDefaultRenderer","previous","viewFromValues","toScreen","toPlotX","toPlotY","set"],"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 createMarker,\n styleElement,\n swatch,\n} from \"./dom\";\nimport {\n buildItems,\n cellStyleKey,\n type Origin,\n type PixelDensity,\n} from \"./items\";\nimport { chartAriaLabel } from \"./labels\";\nimport { createScales, toData, toScreen, type Scales } 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 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 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 type {\n ChartEventMap,\n ChartHoverEvent,\n ChartHoverItem,\n ChartInstance,\n ChartInteractionOptions,\n ChartOptions,\n ChartRendererKind,\n ChartTooltipOptions,\n ChartView,\n} from \"./types\";\nimport {\n clampRange,\n panRange,\n sameRange,\n wheelFactor,\n zoomRange,\n type Range,\n} from \"./viewport\";\n\ninterface HoverState {\n event: ChartHoverEvent;\n /** Tooltip anchor in stage pixels */\n anchorX: number;\n anchorY: number;\n keyboard: boolean;\n}\n\nconst mid = (r: Range) => (r[0] + r[1]) / 2;\nconst copyView = (v: ChartView): ChartView => ({\n x: [v.x[0], v.x[1]],\n y: [v.y[0], v.y[1]],\n});\n\n/**\n * Creates a chart inside `container` (which must have a size). The data\n * layer uses WebGPU when available, then WebGL2, then 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 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 x: number;\n y: number;\n moved: boolean;\n } | null = null;\n let ghost: HTMLDivElement | null = null;\n let drag: {\n id: number;\n x: number;\n y: number;\n view: ChartView;\n moved: boolean;\n } | null = null;\n const markers: HTMLDivElement[] = [];\n const bands: HTMLDivElement[] = [];\n const cells: HTMLDivElement[] = [];\n const guides: HTMLDivElement[] = [];\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 });\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) hover = null;\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 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 ),\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 }\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 const stageW = dom.stage.clientWidth;\n const stageH = dom.stage.clientHeight;\n let left = hover.anchorX + 16;\n if (left + w > stageW - 4) left = hover.anchorX - 16 - w;\n left = Math.max(4, Math.min(left, stageW - w - 4));\n const top = Math.max(4, Math.min(hover.anchorY - h / 2, stageH - h - 4));\n tip.style.transform = `translate(${Math.round(left)}px, ${Math.round(top)}px)`;\n }\n\n /** Crosshair, point markers, bar bands and lifted 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 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 for (const mark of hoverMarks(model, sc, hover.event)) {\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(guides, guideCount++, () =>\n styleElement(createBand(doc), {\n borderRadius: \"0\",\n background:\n \"color-mix(in srgb, var(--text-color, #1f2937) 6%, transparent)\",\n }),\n );\n styleElement(el, {\n left: `${mark.x}px`,\n top: `${mark.y}px`,\n width: `${mark.width}px`,\n height: `${mark.height}px`,\n });\n continue;\n }\n if (mark.kind === \"cell\") {\n // the cell lifted above its neighbours, a ring inside its edge\n const el = pooled(cells, cellCount++, () =>\n styleElement(createBand(doc), {\n boxShadow:\n \"0 8px 18px -6px rgba(15, 23, 42, 0.6), 0 0 0 1px rgba(15, 23, 42, 0.12)\",\n outlineStyle: \"solid\",\n outlineWidth: \"1.5px\",\n outlineOffset: \"-4px\",\n transform: \"scale(1.12)\",\n }),\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 background: mark.color,\n borderRadius: `${Math.max(mark.radius, 2)}px`,\n outlineColor: mark.ring,\n });\n continue;\n }\n const el = pooled(markers, markerCount++, () => createMarker(doc));\n styleElement(el, {\n left: `${mark.x}px`,\n top: `${mark.y}px`,\n width: `${mark.size}px`,\n height: `${mark.size}px`,\n background: mark.color,\n boxShadow: `0 0 0 4px ${mark.halo}`,\n });\n }\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 }\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 // ---------------------------------------------------------- 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 moveGhost = (x: number, y: number, color: string | null) => {\n if (color === null) {\n if (ghost) ghost.style.display = \"none\";\n return;\n }\n if (!ghost) {\n ghost = createMarker(doc);\n dom.hover.appendChild(ghost);\n }\n const s = model.series.find((series) => series.type === \"scatter\");\n const size = (s?.pointSize ?? 8) + 8;\n dom.hover.style.width = `${dom.stage.clientWidth}px`;\n dom.hover.style.height = `${dom.stage.clientHeight}px`;\n styleElement(ghost, {\n display: \"block\",\n left: `${x}px`,\n top: `${y}px`,\n width: `${size}px`,\n height: `${size}px`,\n background: color,\n });\n };\n\n const onPointerMove = (event: PointerEvent) => {\n const { x, y } = localPoint(event);\n if (pointDrag && pointDrag.id === event.pointerId) {\n if (\n !pointDrag.moved &&\n Math.hypot(x - pointDrag.x, y - pointDrag.y) > 3\n ) {\n pointDrag.moved = true;\n dom.stage.setPointerCapture?.(event.pointerId);\n dom.stage.style.cursor = \"grabbing\";\n }\n if (pointDrag.moved) {\n const at = dataAt(x, y);\n if (at) {\n moveGhost(x, y, pointDrag.item.color);\n renderHover();\n emit(\"drag\", { item: pointDrag.item, x: at.x, y: at.y });\n }\n }\n return;\n }\n if (drag && drag.id === event.pointerId) {\n const dx = x - drag.x;\n const dy = y - drag.y;\n if (!drag.moved && Math.hypot(dx, dy) > 3) {\n const it = interaction();\n if (zoomed && it?.pan) {\n drag.moved = true;\n dom.stage.setPointerCapture?.(event.pointerId);\n dom.stage.style.cursor = \"grabbing\";\n }\n }\n if (drag.moved && scales) {\n const next = copyView(drag.view);\n 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 = { id: event.pointerId, item: draggable, x, y, moved: false };\n return;\n }\n drag = { id: event.pointerId, x, y, view: copyView(view), moved: false };\n };\n\n const onPointerUp = (event: PointerEvent) => {\n if (pointDrag && pointDrag.id === event.pointerId) {\n const { item, moved } = pointDrag;\n pointDrag = null;\n if (dom.stage.hasPointerCapture?.(event.pointerId)) {\n dom.stage.releasePointerCapture(event.pointerId);\n }\n moveGhost(0, 0, null);\n const { x, y } = localPoint(event);\n dom.stage.style.cursor = draggableAt(x, y) ? \"grab\" : \"\";\n if (moved) {\n const at = dataAt(x, y);\n if (at && event.type !== \"pointercancel\")\n emit(\"drop\", { item, x: at.x, y: at.y });\n renderHover();\n } else {\n const hit = hitAt(x, y);\n if (hit) emit(\"click\", hit);\n }\n return;\n }\n if (!drag || drag.id !== event.pointerId) return;\n const moved = drag.moved;\n drag = null;\n if (dom.stage.hasPointerCapture?.(event.pointerId)) {\n dom.stage.releasePointerCapture(event.pointerId);\n }\n dom.stage.style.cursor = zoomed && interaction()?.pan ? \"grab\" : \"\";\n if (!moved) {\n const { x, y } = localPoint(event);\n const hit = hitAt(x, y);\n if (hit) emit(\"click\", hit);\n else if (event.type !== \"pointercancel\" && inPlot(x, y)) {\n const at = dataAt(x, y);\n if (at) emit(\"plotClick\", at);\n }\n } else {\n renderHover();\n }\n };\n\n const onPointerLeave = () => {\n if (!drag?.moved && !pointDrag?.moved) setHover(null);\n };\n\n const onWheel = (event: WheelEvent) => {\n const it = interaction();\n if (!it || it.zoom === false || (!model.zoom.x && !model.zoom.y)) return;\n const { x, y } = localPoint(event);\n if (!inPlot(x, y)) return;\n const modifier = event.ctrlKey || event.metaKey;\n if (it.wheel === \"always\" || modifier) {\n event.preventDefault();\n zoomAt(\n x,\n y,\n wheelFactor(\n event.deltaY,\n event.deltaMode,\n event.ctrlKey && !event.metaKey,\n ),\n );\n } else if (\n zoomed &&\n model.zoom.x &&\n scales &&\n !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 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 dom.stage.insertBefore(next.canvas, dom.foreground);\n itemsDirty = true;\n emit(\"renderer\", next.kind);\n }\n resolveReady(next?.kind ?? null);\n invalidate();\n };\n\n // ------------------------------------------------------------------ api\n\n function resetZoom() {\n if (!zoomed) return;\n setViewInternal(copyView(model.base), true);\n }\n\n rebuild();\n void initRenderer();\n 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 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 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":";;;;;;;;;;;;;;;AAiGA,IAAME,KAAO,OAAcC,EAAE,KAAKA,EAAE,MAAM,GACpCC,KAAY,OAA6B;CAC7C,GAAG,CAACC,EAAE,EAAE,IAAIA,EAAE,EAAE,EAAE;CAClB,GAAG,CAACA,EAAE,EAAE,IAAIA,EAAE,EAAE,EAAE;AACpB,IAMaC,MACX,IACA,OACkB;CAClB,IAAMC,IAAMC,GAAU,eAChBC,IAAMF,EAAI,aACVG,IAAMC,EAAeH,EAAS,GAC9BI,qBAAmB,IAAI,IAAI,GAC3BC,oBAAS,IAAI,IAAY,GACzBC,IAEF,CAAC,GAEDC,IAAUC,IACVC,IAAoBC,GAAUR,EAAI,MAAMK,EAAQ,OAAO,GACvDI,GACAC,IAAkB;EAAE,GAAG,CAAC,GAAG,CAAC;EAAG,GAAG,CAAC,GAAG,CAAC;CAAE,GACzCC,IAAS,IACTC,IAAiB;EAAE,GAAG;EAAG,GAAG;CAAE,GAC9BC,KAAsB,CAAC,GACvBC,IAAa,IACbC,KAAU,GACVC,KAAoC,CAAC,GACrCC,KAAqC,CAAC,GACtCC,IAAwB,MACxBC,IAA2B,MAC3BC,IAA2B,MAC3BC,KAA4B,MAC5BC,IAAiC,MACjCC,KAAgB,GAChBC,IAAY,IACZC,IAAU,GACVC,IAA2B,MAC3BC,KAAW,IACXC,IAMO,MACPC,IAA+B,MAC/BC,IAMO,MACLC,KAA4B,CAAC,GAC7BC,KAA0B,CAAC,GAC3BC,KAA0B,CAAC,GAC3BC,KAA2B,CAAC,GAE9BC,IAAqC,MACrCC,KAAU,IACVC,KAAe,GACfC,KAAoB,IACpBC,KAAY,IAEZC,IAIO,MACPC,IAMO,MAEPC,WAA+D,CAAC,GAC9DC,KAAQ,IAAI,SAAmC,MAAY;EAC/D,KAAeC;CACjB,CAAC,GAEKC,KACJ,GACA,MACG;EACH,EAAUC,EAAK,EAAE,SAAS,MAAaC,EAASC,CAAK,CAAC;CACxD,GAEIC,KAAqC,MACrCC,KAA6D,MAE3DC,UAA8D;EAClE,IAAIF,OAAkB5C,GAAS,OAAO6C;EACtC,KAAgB7C;EAChB,IAAM+C,IAAQ/C,EAAQ;EACtB,IAAI+C,MAAU,IAAO,OAAQ,KAAmB;EAChD,IAAMC,IAAI,OAAOD,KAAU,WAAWA,IAAQ,CAAC;EAC/C,OAAQ,KAAmB;GACzB,MAAMC,EAAE,QAAQ;GAChB,OAAOA,EAAE,SAAS;GAClB,KAAKA,EAAE,OAAO;GACd,UAAUA,EAAE,YAAY;GACxB,YAAYA,EAAE,cAAc;EAC9B;CACF,GAEMC,WACJjD,EAAQ,YAAY,KAChB,OACA,OAAOA,EAAQ,WAAY,WACzBA,EAAQ,UACR,CAAC,GAEHkD,UAAmB;EACvB,AAAI/B,KAAaC,MACjB,IAAU1B,GAAK,wBACXA,EAAI,sBAAsByD,EAAK,IAC9B,WAAWA,IAAO,EAAE;CAC3B,GAIMC,UAAgB;EACpB,IAAQC,EAAWrD,GAASE,GAAOJ,GAAQD,EAAK;EAChD,IAAM,EAAE,SAAM,SAAM,eAAYO;EAChC,AAAKE,KAGH,IAAO;GACL,GAAGgD,EAAK,IAAIC,EAAWlD,EAAK,GAAGmD,EAAK,GAAGC,EAAQ,CAAC,IAAI,CAAC,GAAGD,EAAK,CAAC;GAC9D,GAAGF,EAAK,IAAIC,EAAWlD,EAAK,GAAGmD,EAAK,GAAGC,EAAQ,CAAC,IAAI,CAAC,GAAGD,EAAK,CAAC;EAChE,GACA,IAAS,CAACE,EAAUrD,EAAK,GAAGmD,EAAK,CAAC,KAAK,CAACE,EAAUrD,EAAK,GAAGmD,EAAK,CAAC,KANhE,IAAOnE,EAASmE,CAAI;EAUtB,IAAMG,IAAYC,GAChBxD,GACA4B,KACC,MAAUhC,EAAQ,OAAO6D,EAAM,EAAE,KACpC;EAgBA,AAfIF,MAAc1B,OAChB,KAAoB0B,GACpB,IAAS;GAAE,GAAGxE,EAAIqE,EAAK,CAAC;GAAG,GAAGrE,EAAIqE,EAAK,CAAC;EAAE,GAC1C,IAAa,IACTnC,KAAS,CAACA,EAAM,aAAU,IAAQ,QAExC,KAAcyC,GACZ9D,EAAQ,aACRE,GACAE,EAAM,EAAE,SAAS,QAAQ,KAAK,QAAQ,KAAA,GACtCA,EAAM,EAAE,SAAS,QAAQ,KAAK,QAAQ,KAAA,CACxC,GACA,KAAe2D,GAAoB/D,EAAQ,cAAcE,CAAK,GAC9D8D,GAAa,GACbC,GAAoB,GACpBf,EAAW;CACb,GAGMgB,WAAqB;EACzB,IAAMC,KAAO,GAAU,MACrB,KAAK,IAAI,KAAK,IAAI/E,EAAE,KAAK4D,CAAC,GAAG,KAAK,IAAI5D,EAAE,KAAK4D,CAAC,CAAC,KAAK5D,EAAE,KAAKA,EAAE,MAAM;EACrE,CAAI+E,EAAI9D,EAAK,GAAGE,EAAO,CAAC,KAAK4D,EAAI9D,EAAK,GAAGE,EAAO,CAAC,OAC/C,IAAS;GAAE,GAAGpB,EAAIkB,EAAK,CAAC;GAAG,GAAGlB,EAAIkB,EAAK,CAAC;EAAE,GAC1C,IAAa;CAEjB,GAIM2D,WAAqB;EACzB,IAAMI,IAAepE,EAAQ,QACvBqE,IAAQrE,EAAQ,OAAO,QAAQ,MAAMsE,EAAE,IAAI,CAAC,CAAC,QAC7CC,IAAOC,GAAYJ,GAAchE,GAAOiE,CAAK,GAC7CI,IAAS,OAAOL,KAAiB,WAAWA,IAAe,CAAC,GAC5DM,IAASD,EAAO,UAAU,IAC1BE,IAASF,EAAO,aAAa,UAC7BG,IAASL,IAAOM,GAAYzE,CAAK,IAAI,MAEvC0E,IAAM,GAAGP,EAAK,GAAGI,EAAO,GAAGD;EAC/B,IAAIE,GACF,KAAO,KAAKA,EAAO,MAAM,KAAK,GAAG,EAAE,GAAGA,EAAO,OAAO,KAAK,MAAMG,EAAE,IAAI,CAAC,CAAC,KAAK,GAAG;OAC1E,IAAIR,GACT,KAAK,IAAMD,KAAKlE,EAAM,QACpB,KAAO,KAAKkE,EAAE,GAAG,QAAQA,EAAE,KAAK,QAAQA,EAAE,SAAS,QAAQU,GAAYV,EAAE,IAAI,EAAE,QAAQA,EAAE;EAE7F,IAAIQ,MAAQ5C,IAAW;EACvB,KAAY4C;EACZ,IAAMG,IAAU,CAAC,GAAGtF,EAAI,OAAO,QAAQ,CAAC,CAAC,QACvCH,EAAI,aACN;EAIA,IAHAG,EAAI,OAAO,gBAAgB,GAC3B,IAAc,MACd,EAAI,OAAO,MAAM,UAAU4E,IAAO,SAAS,QACtCA,GAGL;OAFA,EAAI,OAAO,MAAM,QAAQI,IAAS,MAAM,KACxC,EAAI,OAAO,MAAM,UAAUA,IAAS,cAAc,aAC9CC,GAAQ;IAEV,EAAI,OAAO,MAAM,iBAAiB;IAClC,IAAMM,IAAO1F,EAAI,cAAc,KAAK;IACpC,EAAa0F,GAAM;KACjB,SAAS;KACT,YAAY;KACZ,KAAK;KACL,OAAO;KACP,UAAU;KACV,oBAAoB;IACtB,CAAC;IACD,IAAMC,IAAQP,EAAO,OAAO,IACtBQ,IAAOR,EAAO,OAAOA,EAAO,OAAO,SAAS,IAC5CS,IAAM7F,EAAI,cAAc,KAAK;IAUnC,IATAN,EAAamG,GAAK;KAChB,UAAU;KACV,OAAO;KACP,QAAQ;KACR,cAAc;KACd,YAAY,6BAA6BT,EAAO,MAAM,KAAK,IAAI,EAAE;KACjE,WACE;IACJ,CAAC,GACGA,EAAO,OAAO,SAAS,GAAG;KAC5B,IAAMU,IAAO9F,EAAI,cAAc,KAAK;KAUpC,AATAN,EAAaoG,GAAM;MACjB,UAAU;MACV,MAAM;MACN,KAAK;MACL,OAAO;MACP,QAAQ;MACR,YACE;KACJ,CAAC,GACDD,EAAI,YAAYC,CAAI;IACtB;IAcA,AAbA,IAAc9F,EAAI,cAAc,KAAK,GACrCN,EAAa4C,GAAa;KACxB,UAAU;KACV,KAAK;KACL,OAAO;KACP,QAAQ;KACR,YAAY;KACZ,cAAc;KACd,YAAY;KACZ,WACE;KACF,SAAS;IACX,CAAC,GACDuD,EAAI,YAAYvD,CAAW;IAC3B,IAAMyD,KAAQ,MAAkB;KAC9B,IAAMC,IAAKhG,EAAI,cAAc,MAAM;KAEnC,OADA,EAAG,cAAcuD,GACVyC;IACT;IAEA,AADAN,EAAK,OAAOK,EAAKJ,GAAO,QAAQ,EAAE,GAAGE,GAAKE,EAAKH,GAAM,QAAQ,EAAE,CAAC,GAChEzF,EAAI,OAAO,YAAYuF,CAAI;IAC3B;GACF;GACA,EAAI,OAAO,MAAM,iBAAiB;GAClC,KAAK,IAAMZ,KAAKlE,EAAM,QAAQ;IAC5B,IAAMqF,IAAOjG,EAAI,cAAckF,IAAS,WAAW,MAAM;IA6BzD,AA5BIe,aAAgB,sBAClB,EAAK,OAAO,UACZA,EAAK,aAAa,gBAAgB,OAAO,CAACnB,EAAE,MAAM,CAAC,GACnDmB,EAAK,iBAAiB,eAAe;KAGnC,AAFI3F,EAAO,IAAIwE,EAAE,EAAE,IAAGxE,EAAO,OAAOwE,EAAE,EAAE,IACnCxE,EAAO,IAAIwE,EAAE,EAAE,GACpBlB,EAAQ;IACV,CAAC,IAEHlE,EAAauG,GAAM;KACjB,SAAS;KACT,YAAY;KACZ,KAAK;KACL,SAAS;KACT,QAAQ;KACR,QAAQ;KACR,cAAc;KACd,YAAY;KACZ,MAAM;KACN,OAAO;KACP,QAAQf,IAAS,YAAY;KAC7B,SAASJ,EAAE,SAAS,SAAS;KAC7B,gBAAgBA,EAAE,SAAS,iBAAiB;IAC9C,CAAC,GACDmB,EAAK,OACHC,EAAOlG,GAAK8E,EAAE,UAAUU,GAAYV,EAAE,IAAI,CAAC,GAC3C9E,EAAI,eAAe8E,EAAE,IAAI,CAC3B,GACA3E,EAAI,OAAO,YAAY8F,CAAI;GAC7B;GACA,AAAIR,KAAW,KACbtF,EAAK,OAAO,SAASsF,EAAQ,EAA8B,MAAM;EAnCnE;CAoCF,GAEMhB,WAA4B;EAChC,EAAI,MAAM,aACR,cACAjE,EAAQ,aAAa2F,EAAevF,CAAK,CAC3C;EACA,IAAMwF,IAAW9C,EAAY,CAAC,EAAE;EAEhC,AADA,EAAI,MAAM,MAAM,cAAcA,EAAY,CAAC,EAAE,aAAa,SAAS,SAC/D8C,IAAU,EAAI,MAAM,WAAW,IAC9BjG,EAAI,MAAM,gBAAgB,UAAU;CAC3C,GAIMkG,MACJ,GACA,GACA,GACA,MACG;EACH,IAAMC,IAAI,KAAK,IAAI,GAAG,KAAK,MAAMC,IAAQC,CAAG,CAAC,GACvCC,IAAI,KAAK,IAAI,GAAG,KAAK,MAAMC,IAASF,CAAG,CAAC;EAI9C,AAHIG,EAAO,UAAUL,MAAG,EAAO,QAAQA,IACnCK,EAAO,WAAWF,MAAG,EAAO,SAASA,IACzC,EAAO,MAAM,QAAQ,GAAGF,EAAM,KAC9B,EAAO,MAAM,SAAS,GAAGG,EAAO;CAClC,GAEME,MAAgB,GAAc,GAAW,MAAqB;EAClE,IAAMC,IAAQ,KAAKC,EAAM,KAAKA,EAAM,KAC9BC,KAAUvD,IAAIsD,EAAM,MAAMD,IAAQ;EACxC,OAAOG,IAAU,CAAC,CAACH,GAAO,CAACE,CAAM,IAAI,CAACF,GAAOE,CAAM;CACrD;CAEA,SAASpD,KAAQ;EAEf,IADA,IAAU,GACNhC,GAAW;EACf,IAAM4E,IAAQpG,EAAI,MAAM,aAClBuG,IAASvG,EAAI,MAAM;EACzB,IAAIoG,KAAS,KAAKG,KAAU,GAAG;EAC/B,IAAMF,IAAMtG,GAAK,oBAAoB;EAErC,AADAmG,GAAWlG,EAAI,YAAYoG,GAAOG,GAAQF,CAAG,GAC7CH,GAAWlG,EAAI,YAAYoG,GAAOG,GAAQF,CAAG;EAC7C,IAAMS,IAAK9G,EAAI,WAAW,WAAW,IAAI,GACnC+G,IAAK/G,EAAI,WAAW,WAAW,IAAI;EAEzC,AAAI8G,MACFA,EAAG,aAAaT,GAAK,GAAG,GAAGA,GAAK,GAAG,CAAC,GACpC,EAAG,OAAOW,GAAKzG,CAAK;EAEtB,IAAM0G,IAASC,GAAY;GACzB;GACA;GACA;GACA;GACA;GACA,SAAS7G,EAAQ;GACjB,SAASyG,KACJ,MAASA,EAAG,YAAYlB,CAAI,CAAC,CAAC,SAC9B,MAASA,EAAK,SAASrF,EAAM,WAAW;EAC/C,CAAC,GACK,EAAE,YAAS0G;EAIjB,AAHA,IAASA,EAAO,QAChB,IAASA,EAAO,QAChB,KAAUA,EAAO,SACjB,IAASA,EAAO;EAChB,IAAME,IAAOC,GAAS;EA8CtB,IA7CID,KAAQA,EAAK,KAAK,MAAMxF,OAC1B,KAAWwF,EAAK,KAAK,GACrBtE,EAAK,UAAU;GACb,GAAGsE,EAAK;GACR,GAAGA,EAAK;GACR,OAAOA,EAAK;GACZ,QAAQA,EAAK;EACf,CAAC,IAGCL,KACFO,GAAeP,GAAI;GACjB;GACA;GACA;GACA,GAAGrG,EAAM;GACT,GAAGA,EAAM;GACT;GACA;GACA,IAAIA,EAAM;GACV;GACA;GACA;EACF,CAAC,GAECsG,MACFA,EAAG,aAAaV,GAAK,GAAG,GAAGA,GAAK,GAAG,CAAC,GACpCiB,GAAeP,GAAI;GACjB;GACA;GACA;GACA;GACA;GACA,aAAaQ,GACX9G,GACAC,GACAQ,GACAE,GACAb,EAAM,UACR;GACA,YAAYiH,GAAkB/G,GAAOS,CAAM;GAC3C,QAAQuG,GAAiBhH,GAAOS,GAAQD,EAAY;EACtD,CAAC,IAGCK,GAAU;GACZ,IAAMkF,IAASlF,EAAS,QAGlBoG,IAAajH,EAAM,YACnBkH,IAAKD,IAAaE,EAAK,SAASA,EAAK,OACrCC,IAAKH,IAAaE,EAAK,QAAQA,EAAK;GAC1C,EAAapB,GAAQ;IACnB,MAAM,GAAGoB,EAAK,EAAE;IAChB,KAAK,GAAGA,EAAK,EAAE;IACf,OAAO,GAAGD,EAAG;IACb,QAAQ,GAAGE,EAAG;IACd,iBAAiBH,IAAa,QAAQ;IACtC,WAAWA,IAAa,6BAA6B;GACvD,CAAC;GACD,IAAMI,IAAK,KAAK,IAAI,GAAG,KAAK,MAAMH,IAAKtB,CAAG,CAAC,GACrC0B,IAAK,KAAK,IAAI,GAAG,KAAK,MAAMF,IAAKxB,CAAG,CAAC;GAE3C,CADIG,EAAO,UAAUsB,KAAMtB,EAAO,WAAWuB,MAAIzG,EAAS,OAAOwG,GAAIC,CAAE,GACvExD,GAAa;GAEb,IAAMyD,IAAwB;IAC5B,GAAG,IAAI,KAAK,IAAI9G,EAAO,MAAM;IAC7B,GAAG,IAAI,KAAK,IAAIA,EAAO,MAAM;GAC/B,GACMiE,IAAM8C,EAAaxH,GAAOuH,CAAO;GAKvC,AAJI7C,MAAQ/C,OACV,KAAU+C,GACV,IAAa,KAEXrE,MACF,MACA,KAAQoH,EAAWzH,GAAOG,GAAQG,IAASiH,CAAO,GAClD,IAAa;GAEf,IAAM,CAACG,GAAQC,KAAW3B,GAAa/F,EAAK,GAAGE,EAAO,GAAGH,EAAM,EAAE,OAAO,GAClE,CAAC4H,IAAQC,MAAW7B,GACxB/F,EAAK,GACLE,EAAO,GAEP8G,IAAa,CAACjH,EAAM,EAAE,UAAUA,EAAM,EAAE,OAC1C;GACA,EAAS,OAAOI,IAAO;IACrB,WAAW;KAAE;KAAQ;KAAS;KAAQ;IAAQ;IAC9C,OAAOiH;IACP,QAAQC;IACR;GACF,CAAC;EACH;EACA,EAAY;CACd;CAIA,IAAMQ,KAAS,GAAY,MACzBrH,IAASsH,GAAQ/H,GAAOS,GAAQC,GAAQsH,GAAIC,CAAE,IAAI,MAG9CtB,WAA0D;EAC9D,IAAMuB,IAAIzH,GAAQ;EAElB,OADKyH,IACE;GACLA,EAAE,IAAI3I,EAAI,MAAM;GAChB2I,EAAE,IAAI3I,EAAI,MAAM;GAChB2I,EAAE;GACFA,EAAE;EACJ,IANe;CAOjB,GAGMC,MAAe,GAAY,MAC1BzF,EAAY,CAAC,EAAE,aACRoF,EAAME,GAAIC,CACT,CAAA,EAAK,MAAM,MACrB,MAAOjI,EAAM,OAAOoI,EAAG,YAAY,CAAC,SAAS,SAChD,KACe,OALwB,MAUnCC,KAAY,MAA4B;EAC5C,IAAMC,IAAU,CAACC,GAAUtH,GAAO,SAAS,MAAMuH,GAAM,SAAS,IAAI;EAGpE,AAFA,IAAQA,GACRC,EAAY,GACRH,KAASlG,EAAK,SAASoG,IAAOA,EAAK,QAAQ,IAAI;CACrD,GAEME,MAAe,MAAiD;EACpE,IAAMC,IAAS9F,GAAe,CAAC,EAAE;EACjC,IAAI8F,GAAQ,OAAOA,EAAOpG,CAAK;EAC/B,IAAMqG,IAAUC,GAAe7I,GAAOuC,GAAO5B,GAAQC,EAAO,GACtDkI,IAAW1J,EAAI,uBAAuB,GACtC2J,IAAS3J,EAAI,cAAc,KAAK;EAatC,IAZAN,EAAaiK,GAAQ;GACnB,SAAS;GACT,YAAY;GACZ,KAAK;GACL,YAAY;GACZ,cAAcH,EAAQ,WAAW,MAAM;GACvC,OAAO;EACT,CAAC,GACGA,EAAQ,cACVG,EAAO,YAAYzD,EAAOlG,GAAKwJ,EAAQ,YAAY,KAAK,CAAC,GAC3DG,EAAO,YAAY3J,EAAI,eAAewJ,EAAQ,KAAK,CAAC,GACpDE,EAAS,OAAOC,CAAM,GAClBH,EAAQ,UAAU;GACpB,IAAMI,IAAM5J,EAAI,cAAc,KAAK;GAQnC,AAPAN,EAAakK,GAAK;IAChB,OAAO;IACP,UAAU;IACV,QAAQ;IACR,aAAaJ,EAAQ,aAAa,SAAS;GAC7C,CAAC,GACD,EAAI,cAAcA,EAAQ,UAC1BE,EAAS,OAAOE,CAAG;EACrB;EACA,IAAI,CAACJ,EAAQ,KAAK,QAAQ,OAAOE;EAEjC,IAAMG,IAAWL,EAAQ,KAAK,MAAM,MAAQM,EAAI,KAAK,GAC/CC,IAAO/J,EAAI,cAAc,KAAK;EACpC,EAAa+J,GAAM;GACjB,SAAS;GACT,qBAAqBF,IACjB,6BACA;GACJ,WAAW;GACX,QAAQ;GACR,YAAY;EACd,CAAC;EACD,KAAK,IAAMC,KAAON,EAAQ,MAAM;GAC9B,IAAIK,GAAU;IACZ,IAAMG,IAAOhK,EAAI,cAAc,MAAM;IAOrC,AANAN,EAAasK,GAAM;KACjB,SAAS;KACT,OAAO;KACP,gBAAgB;IAClB,CAAC,GACGF,EAAI,SAAOE,EAAK,YAAY9D,EAAOlG,GAAK8J,EAAI,OAAO,KAAK,CAAC,GAC7DC,EAAK,YAAYC,CAAI;GACvB;GACA,IAAMC,IAAIjK,EAAI,cAAc,MAAM;GAOlC,AANAN,EAAauK,GAAG;IACd,OAAO;IACP,cAAc;IACd,UAAU;IACV,cAAc;GAChB,CAAC,GACD,EAAE,cAAcH,EAAI;GACpB,IAAMhK,IAAIE,EAAI,cAAc,MAAM;GAQlC,AAPAN,EAAaI,GAAG;IACd,YAAY;IACZ,oBAAoB;IACpB,WAAW;IACX,OAAO;GACT,CAAC,GACD,EAAE,cAAcgK,EAAI,OACpBC,EAAK,OAAOE,GAAGnK,CAAC;EAClB;EAEA,OADA4J,EAAS,OAAOK,CAAI,GACbL;CACT,GAEMQ,MACJ,GACA,GACA,GACA,IAAsB/J,EAAI,WAErBgK,EAAKC,OACR,EAAKA,KAAKC,EAAK,GACfC,EAAO,YAAYH,EAAKC,EAAE,IAE5B,EAAKA,EAAE,CAAC,MAAM,UAAU,SACjBD,EAAKC;CAGd,SAASf,IAAc;EACrB,IAAMkB,IAAKlJ;EASX,AAPIQ,KACA0I,KACA5H,KACFA,EAAW,WAAW4H,KACtB5H,EAAW,UAAU/B,KACrBuI,GAAUxG,EAAW,OAAOd,EAAM,KAAK,KAExB2I,GAAYD,CAAE;EAE/B,IAAME,IAAMtK,EAAI;EAChB,IAAI,CAAC0B,KAAS,CAAC0I,KAAM,CAAC9G,GAAe,KAAKxB,GAAM,SAASF,GAAW,OAAO;GACzE,EAAI,MAAM,UAAU;GACpB;EACF;EACA,IAAMwH,IAAS9F,GAAe,CAAC,EAAE,QAC7B6C,GACAG;EACJ,IACE,CAAC8C,KACD3G,KACAA,EAAS,UAAUhC,KACnBgC,EAAS,WAAWrB,KACpB4H,GAAUvG,EAAS,OAAOf,EAAM,KAAK,KACrC4I,EAAI,MAAM,YAAY,SAItB,AADA,IAAI7H,EAAS,OACb,IAAIA,EAAS;OACR;GACL,IAAW;GACX,IAAM4G,IAAUF,GAAYzH,EAAM,KAAK;GACvC,IAAI2H,MAAY,QAAQA,MAAY,IAAI;IACtC,EAAI,MAAM,UAAU;IACpB;GACF;GAWA,AAVI,OAAOA,KAAY,YACrB,EAAI,cAAcA,GAClB,EAAI,MAAM,aAAa,UAEvBiB,EAAI,gBAAgBjB,CAAO,GAC3B,EAAI,MAAM,aAAa,WAEzB,EAAI,MAAM,UAAU,SACpB,IAAIiB,EAAI,aACR,IAAIA,EAAI,cACHlB,MACH,IAAW;IAAE,OAAO1H,EAAM;IAAO;IAAO;IAAQ,OAAOyE;IAAG,QAAQG;GAAE;EACxE;EACA,IAAMiE,IAASvK,EAAI,MAAM,aACnBwK,IAASxK,EAAI,MAAM,cACrByK,IAAO/I,EAAM,UAAU;EAE3B,AADI+I,IAAOtE,IAAIoE,IAAS,MAAG,IAAO7I,EAAM,UAAU,KAAKyE,IACvD,IAAO,KAAK,IAAI,GAAG,KAAK,IAAIsE,GAAMF,IAASpE,IAAI,CAAC,CAAC;EACjD,IAAMuE,IAAM,KAAK,IAAI,GAAG,KAAK,IAAIhJ,EAAM,UAAU4E,IAAI,GAAGkE,IAASlE,IAAI,CAAC,CAAC;EACvE,EAAI,MAAM,YAAY,aAAa,KAAK,MAAMmE,CAAI,EAAE,MAAM,KAAK,MAAMC,CAAG,EAAE;CAC5E;CAGA,SAASL,GAAY,GAAmB;EACtC,IAAIM,IAAc,GACdC,IAAY,GACZC,IAAY,GACZC,IAAa;EAIjB,IAHAC,GAAkB,GAClB,IAAa,MACb,EAAI,UAAU,MAAM,UAAU,QAC1BrJ,KAAS0I,GAAI;GACf,IAAa;IAAE,OAAO1I,EAAM;IAAO;IAAO,QAAQ0I;GAAG;GACrD,IAAM,EAAE,YAASA;GAEjB,AADA,EAAI,MAAM,MAAM,QAAQ,GAAGpK,EAAI,MAAM,YAAY,KACjD,EAAI,MAAM,MAAM,SAAS,GAAGA,EAAI,MAAM,aAAa;GACnD,IAAMgL,IAAQC,GAAYxK,GAAO2J,GAAI1I,EAAM,OAAOrB,EAAQ,SAAS;GACnE,IAAI2K,MAAU,MAAM;IAClB,IAAME,IACJ;IACF,EACElL,EAAI,WACJoK,EAAG,aACC;KACE,SAAS;KACT,MAAM,GAAGxC,EAAK,EAAE;KAChB,KAAK,GAAG,KAAK,MAAMoD,CAAK,EAAE;KAC1B,OAAO,GAAGpD,EAAK,MAAM;KACrB,QAAQ;KACR,YAAY;KACZ,WAAWsD;IACb,IACA;KACE,SAAS;KACT,MAAM,GAAG,KAAK,MAAMF,CAAK,EAAE;KAC3B,KAAK,GAAGpD,EAAK,EAAE;KACf,OAAO;KACP,QAAQ,GAAGA,EAAK,OAAO;KACvB,YAAYsD;KACZ,WAAW;IACb,CACN;GACF;GACA,KAAK,IAAMC,KAAQC,GAAW3K,GAAO2J,GAAI1I,EAAM,KAAK,GAAG;IACrD,IAAIyJ,EAAK,SAAS,UAAUA,EAAK,SAAS,SAAS;KACjD,IAAMtF,IACJsF,EAAK,SAAS,SACVpB,GAAO/H,IAAO,WAAmBqJ,EAAWxL,CAAG,GAAGG,EAAI,QAAQ,IAC9D+J,GAAO7H,IAAQ,WACb5C,EAAa+L,EAAWxL,CAAG,GAAG;MAC5B,cAAc;MACd,YACE;KACJ,CAAC,CACH;KACN,EAAagG,GAAI;MACf,MAAM,GAAGsF,EAAK,EAAE;MAChB,KAAK,GAAGA,EAAK,EAAE;MACf,OAAO,GAAGA,EAAK,MAAM;MACrB,QAAQ,GAAGA,EAAK,OAAO;KACzB,CAAC;KACD;IACF;IACA,IAAIA,EAAK,SAAS,QAAQ;KAExB,IAAMtF,IAAKkE,GAAO9H,IAAO,WACvB3C,EAAa+L,EAAWxL,CAAG,GAAG;MAC5B,WACE;MACF,cAAc;MACd,cAAc;MACd,eAAe;MACf,WAAW;KACb,CAAC,CACH;KACA,EAAagG,GAAI;MACf,MAAM,GAAGsF,EAAK,EAAE;MAChB,KAAK,GAAGA,EAAK,EAAE;MACf,OAAO,GAAGA,EAAK,MAAM;MACrB,QAAQ,GAAGA,EAAK,OAAO;MACvB,YAAYA,EAAK;MACjB,cAAc,GAAG,KAAK,IAAIA,EAAK,QAAQ,CAAC,EAAE;MAC1C,cAAcA,EAAK;KACrB,CAAC;KACD;IACF;IACA,IAAMtF,IAAKkE,GAAOhI,IAAS,WAAqBuJ,EAAazL,CAAG,CAAC;IACjE,EAAagG,GAAI;KACf,MAAM,GAAGsF,EAAK,EAAE;KAChB,KAAK,GAAGA,EAAK,EAAE;KACf,OAAO,GAAGA,EAAK,KAAK;KACpB,QAAQ,GAAGA,EAAK,KAAK;KACrB,YAAYA,EAAK;KACjB,WAAW,aAAaA,EAAK;IAC/B,CAAC;GACH;EACF;EACA,KAAK,IAAIlB,IAAIU,GAAaV,IAAIlI,GAAQ,QAAQ,KAC5C,GAAQkI,EAAE,CAAC,MAAM,UAAU;EAC7B,KAAK,IAAIA,IAAIW,GAAWX,IAAIjI,GAAM,QAAQ,KACxC,GAAMiI,EAAE,CAAC,MAAM,UAAU;EAC3B,KAAK,IAAIA,IAAIY,GAAWZ,IAAIhI,GAAM,QAAQ,KACxC,GAAMgI,EAAE,CAAC,MAAM,UAAU;EAC3B,KAAK,IAAIA,IAAIa,GAAYb,IAAI/H,GAAO,QAAQ,KAC1C,GAAO+H,EAAE,CAAC,MAAM,UAAU;CAC9B;CAGA,SAASc,KAAoB;EAC3B,IAAMQ,IAAQpJ;EACd,IAAI,CAACoJ,GAAO;EACZ,IAAM1C,IAAKnH,GAAO,MAAM,MAAM,IACxBiD,IAAIkE,IAAKpI,EAAM,OAAOoI,EAAG,eAAe,KAAA;EAC9C,IAAI,CAACA,KAAM,CAAClE,KAAKA,EAAE,SAAS,aAAakE,EAAG,UAAU,KAAA,GAAW;GAC/D,EAAM,MAAM,UAAU;GACtB;EACF;EAEA,AADA,EAAM,MAAM,UAAU,SACtB,EAAM,MAAM,OAAO,IAAI2C,GAAa7G,GAAGkE,EAAG,KAAK,IAAI,IAAA,CAAK,QAAQ,CAAC,EAAE;CACrE;CAIA,IAAM4C,KAAmB,GAAiB,MAAoB;EAC5D,IAAM,EAAE,SAAM,eAAYhL;EAK1B,AAJA,IAAO;GACL,GAAGmD,EAAWqF,EAAK,GAAGpF,EAAK,GAAGC,EAAQ,CAAC;GACvC,GAAGF,EAAWqF,EAAK,GAAGpF,EAAK,GAAGC,EAAQ,CAAC;EACzC,GACA,IAAS,CAACC,EAAUrD,EAAK,GAAGmD,EAAK,CAAC,KAAK,CAACE,EAAUrD,EAAK,GAAGmD,EAAK,CAAC;EAChE,IAAMgF,IAAK1F,EAAY;EAGvB,AAFA,EAAI,MAAM,MAAM,SAASxC,KAAUkI,GAAI,MAAM,SAAS,IAClD6C,KAAQ7I,EAAK,QAAQ8I,GAAalL,GAAOC,CAAI,CAAC,GAClD6C,EAAW;CACb,GAEMqI,MAAU,GAAY,GAAY,MAAmB;EACzD,IAAMxB,IAAKlJ;EACX,IAAI,CAACkJ,GAAI;EACT,IAAMnB,IAAOvJ,EAASgB,CAAI,GACpBmL,IAAKC,EAAO1B,GAAI3B,GAAIC,CAAE;EAG5B,AAFIjI,EAAM,KAAK,MAAG,EAAK,IAAIsL,GAAUrL,EAAK,GAAGmL,EAAG,GAAGG,CAAM,IACrDvL,EAAM,KAAK,MAAG,EAAK,IAAIsL,GAAUrL,EAAK,GAAGmL,EAAG,GAAGG,CAAM,IACzDP,EAAgBxC,GAAM,EAAI;CAC5B,GAEMgD,KAAc,MAAgD;EAClE,IAAM9E,IAAOnH,EAAI,MAAM,sBAAsB;EAC7C,OAAO;GAAE,GAAGgD,EAAM,UAAUmE,EAAK;GAAM,GAAGnE,EAAM,UAAUmE,EAAK;EAAI;CACrE,GAEM+E,MAAU,GAAW,MAAc;EACvC,IAAMvD,IAAIzH,GAAQ;EAClB,OACE,CAAC,CAACyH,KAAKwD,KAAKxD,EAAE,KAAKwD,KAAKxD,EAAE,IAAIA,EAAE,SAASyD,KAAKzD,EAAE,KAAKyD,KAAKzD,EAAE,IAAIA,EAAE;CAEtE,GAEM0D,MAAU,GAAW,MAAc;EACvC,IAAMjC,IAAKlJ;EACX,IAAI,CAACkJ,GAAI,OAAO;EAChB,IAAM,EAAE,YAASA,GACXkC,IAAK,KAAK,IAAI1E,EAAK,GAAG,KAAK,IAAIA,EAAK,IAAIA,EAAK,OAAOuE,CAAC,CAAC,GACtDI,IAAK,KAAK,IAAI3E,EAAK,GAAG,KAAK,IAAIA,EAAK,IAAIA,EAAK,QAAQwE,CAAC,CAAC,GACvDzD,IAAImD,EAAO1B,GAAIkC,GAAIC,CAAE;EAE3B,OAAO;GAAE,GAAGC,GAAU/L,GAAOkI,EAAE,CAAC;GAAG,GAAG8D,GAAUhM,GAAOkI,EAAE,CAAC;EAAE;CAC9D,GAEM+D,MAAa,GAAW,GAAW,MAAyB;EAChE,IAAIC,MAAU,MAAM;GAClB,AAAI9K,MAAO,EAAM,MAAM,UAAU;GACjC;EACF;EACA,AAAKA,MACH,IAAQyJ,EAAazL,CAAG,GACxBG,EAAI,MAAM,YAAY6B,CAAK;EAG7B,IAAM+K,KADInM,EAAM,OAAO,MAAM,MAAWoM,EAAO,SAAS,SAC1C,CAAA,EAAG,aAAa,KAAK;EAGnC,AAFA,EAAI,MAAM,MAAM,QAAQ,GAAG7M,EAAI,MAAM,YAAY,KACjD,EAAI,MAAM,MAAM,SAAS,GAAGA,EAAI,MAAM,aAAa,KACnDT,EAAasC,GAAO;GAClB,SAAS;GACT,MAAM,GAAGsK,EAAE;GACX,KAAK,GAAGC,EAAE;GACV,OAAO,GAAGQ,EAAK;GACf,QAAQ,GAAGA,EAAK;GAChB,YAAYD;EACd,CAAC;CACH,GAEMG,MAAiB,MAAwB;EAC7C,IAAM,EAAE,MAAG,SAAMb,EAAWjJ,CAAK;EACjC,IAAIpB,KAAaA,EAAU,OAAOoB,EAAM,WAAW;GASjD,IAPE,CAACpB,EAAU,SACX,KAAK,MAAMuK,IAAIvK,EAAU,GAAGwK,IAAIxK,EAAU,CAAC,IAAI,MAE/C,EAAU,QAAQ,IAClB5B,EAAI,MAAM,oBAAoBgD,EAAM,SAAS,GAC7C,EAAI,MAAM,MAAM,SAAS,aAEvBpB,EAAU,OAAO;IACnB,IAAMiK,IAAKQ,GAAOF,GAAGC,CAAC;IACtB,AAAIP,MACFa,GAAUP,GAAGC,GAAGxK,EAAU,KAAK,KAAK,GACpCsH,EAAY,GACZrG,EAAK,QAAQ;KAAE,MAAMjB,EAAU;KAAM,GAAGiK,EAAG;KAAG,GAAGA,EAAG;IAAE,CAAC;GAE3D;GACA;EACF;EACA,IAAI/J,KAAQA,EAAK,OAAOkB,EAAM,WAAW;GACvC,IAAM+J,IAAKZ,IAAIrK,EAAK,GACdkL,IAAKZ,IAAItK,EAAK;GACpB,IAAI,CAACA,EAAK,SAAS,KAAK,MAAMiL,GAAIC,CAAE,IAAI,GAAG;IACzC,IAAMnE,IAAK1F,EAAY;IACvB,AAAIxC,KAAUkI,GAAI,QAChB,EAAK,QAAQ,IACb7I,EAAI,MAAM,oBAAoBgD,EAAM,SAAS,GAC7C,EAAI,MAAM,MAAM,SAAS;GAE7B;GACA,IAAIlB,EAAK,SAASZ,GAAQ;IACxB,IAAM+H,IAAOvJ,EAASoC,EAAK,IAAI,GACzBmL,IAAOnB,EAAO5K,GAAQY,EAAK,GAAGA,EAAK,CAAC,GACpCoL,IAAKpB,EAAO5K,GAAQiL,GAAGC,CAAC;IAG9B,AAFI3L,EAAM,KAAK,MAAG,EAAK,IAAI0M,GAASrL,EAAK,KAAK,GAAGmL,EAAK,IAAIC,EAAG,CAAC,IAC1DzM,EAAM,KAAK,MAAG,EAAK,IAAI0M,GAASrL,EAAK,KAAK,GAAGmL,EAAK,IAAIC,EAAG,CAAC,IAC9DzB,EAAgBxC,GAAM,EAAI;IAC1B;GACF;EACF;EACA,IAAMmE,IAAS7E,EAAM4D,GAAGC,CAAC;EAMzB,AALAtD,EACEsE,IACI;GAAE,OAAOA;GAAQ,SAASjB;GAAG,SAASC;GAAG,UAAU;EAAM,IACzD,IACN,GACI,CAACtK,KAAQqB,EAAY,CAAC,EAAE,eAC1B,EAAI,MAAM,MAAM,SAASyF,GAAYuD,GAAGC,CAAC,KAErCzL,KAAUwC,EAAY,CAAC,EAAE,MADzB,SAGE;CAEV,GAEMkK,MAAiB,MAAwB;EAC7C,IAAIrK,EAAM,WAAW,GAAG;EACxB,IAAM,EAAE,MAAG,SAAMiJ,EAAWjJ,CAAK;EACjC,IAAI,CAACkJ,GAAOC,GAAGC,CAAC,GAAG;EACnB,IAAMkB,IAAY1E,GAAYuD,GAAGC,CAAC;EAClC,IAAIkB,GAAW;GACb,IAAY;IAAE,IAAItK,EAAM;IAAW,MAAMsK;IAAW;IAAG;IAAG,OAAO;GAAM;GACvE;EACF;EACA,IAAO;GAAE,IAAItK,EAAM;GAAW;GAAG;GAAG,MAAMtD,EAASgB,CAAI;GAAG,OAAO;EAAM;CACzE,GAEM6M,MAAe,MAAwB;EAC3C,IAAI3L,KAAaA,EAAU,OAAOoB,EAAM,WAAW;GACjD,IAAM,EAAE,SAAM,aAAUpB;GAKxB,AAJA,IAAY,MACR5B,EAAI,MAAM,oBAAoBgD,EAAM,SAAS,KAC/ChD,EAAI,MAAM,sBAAsBgD,EAAM,SAAS,GAEjD0J,GAAU,GAAG,GAAG,IAAI;GACpB,IAAM,EAAE,MAAG,SAAMT,EAAWjJ,CAAK;GAEjC,IADA,EAAI,MAAM,MAAM,SAAS4F,GAAYuD,GAAGC,CAAC,IAAI,SAAS,IAClDoB,GAAO;IACT,IAAM3B,IAAKQ,GAAOF,GAAGC,CAAC;IAGtB,AAFIP,KAAM7I,EAAM,SAAS,mBACvBH,EAAK,QAAQ;KAAE;KAAM,GAAGgJ,EAAG;KAAG,GAAGA,EAAG;IAAE,CAAC,GACzC3C,EAAY;GACd,OAAO;IACL,IAAMuE,IAAMlF,EAAM4D,GAAGC,CAAC;IACtB,AAAIqB,KAAK5K,EAAK,SAAS4K,CAAG;GAC5B;GACA;EACF;EACA,IAAI,CAAC3L,KAAQA,EAAK,OAAOkB,EAAM,WAAW;EAC1C,IAAMwK,IAAQ1L,EAAK;EAMnB,IALA,IAAO,MACH9B,EAAI,MAAM,oBAAoBgD,EAAM,SAAS,KAC/ChD,EAAI,MAAM,sBAAsBgD,EAAM,SAAS,GAEjD,EAAI,MAAM,MAAM,SAASrC,KAAUwC,EAAY,CAAC,EAAE,MAAM,SAAS,IAC5DqK,GASH,EAAY;OATF;GACV,IAAM,EAAE,MAAG,SAAMvB,EAAWjJ,CAAK,GAC3ByK,IAAMlF,EAAM4D,GAAGC,CAAC;GACtB,IAAIqB,GAAK,EAAK,SAASA,CAAG;QACrB,IAAIzK,EAAM,SAAS,mBAAmBkJ,GAAOC,GAAGC,CAAC,GAAG;IACvD,IAAMP,IAAKQ,GAAOF,GAAGC,CAAC;IACtB,AAAIP,KAAIhJ,EAAK,aAAagJ,CAAE;GAC9B;EACF;CAGF,GAEM6B,WAAuB;EAC3B,AAAI,CAAC5L,GAAM,SAAS,CAACF,GAAW,SAAOkH,EAAS,IAAI;CACtD,GAEM6E,MAAW,MAAsB;EACrC,IAAM9E,IAAK1F,EAAY;EACvB,IAAI,CAAC0F,KAAMA,EAAG,SAAS,MAAU,CAACpI,EAAM,KAAK,KAAK,CAACA,EAAM,KAAK,GAAI;EAClE,IAAM,EAAE,MAAG,SAAMwL,EAAWjJ,CAAK;EACjC,IAAI,CAACkJ,GAAOC,GAAGC,CAAC,GAAG;EACnB,IAAMwB,IAAW5K,EAAM,WAAWA,EAAM;EACxC,IAAI6F,EAAG,UAAU,YAAY+E,GAE3B,AADA5K,EAAM,eAAe,GACrB4I,GACEO,GACAC,GACAyB,GACE7K,EAAM,QACNA,EAAM,WACNA,EAAM,WAAW,CAACA,EAAM,OAC1B,CACF;OACK,IACLrC,KACAF,EAAM,KAAK,KACXS,KACA,CAACA,EAAO,cACR,KAAK,IAAI8B,EAAM,MAAM,IAAI,KAAK,IAAIA,EAAM,MAAM,GAC9C;GACA,EAAM,eAAe;GACrB,IAAMiG,IAAOvJ,EAASgB,CAAI;GAK1B,AAJA,EAAK,IAAIyM,GACPzM,EAAK,GACLsC,EAAM,SAAS9B,EAAO,UAAUT,EAAM,EAAE,UAAU,KAAK,EACzD,GACAgL,EAAgBxC,GAAM,EAAI;EAC5B;CACF,GAEM6E,MAAiB,MAAsB;EAC3C,IAAM,EAAE,MAAG,SAAM7B,EAAWjJ,CAAK;EACjC,AAAIG,EAAY,KAAKxC,KAAUuL,GAAOC,GAAGC,CAAC,KAAG2B,GAAU;CACzD,GAGMC,MAAa,MAAiB;EAClC,IAAM5D,IAAKlJ;EACX,IAAI,CAACkJ,GAAI;EACT,IAAM6D,IAAUvM,GAAO,WAAWA,EAAM,MAAM,MAAM,KAAK,MACnDmL,KACHoB,KAAWxN,EAAM,OAAOwN,EAAQ,iBACjCxN,EAAM,OAAO,MAAM,MAAM,CAACkE,EAAE,UAAUA,EAAE,KAAK,QAAQ,CAAC;EACxD,IAAI,CAACkI,GAAQ;EACb,IAAM,EAAE,MAAG,MAAG,aAAUA,EAAO,MAC3B3I;EAWJ,KAVI+J,IACF,IAAQA,EAAQ,QAAQC,KAGxB,IAAQrB,EAAO,KAAK,SAASsB,EAAWhC,GAAGiC,GAAO1N,EAAK,EAAE,EAAE,IAAI,GAC3DwN,IAAO,MACT,IAAQrB,EAAO,KAAK,SAChBsB,EAAWhC,GAAGiC,GAAO1N,EAAK,EAAE,EAAE,IAAI,IAClC0N,IAAQ,KAETlK,KAAS,KAAKA,IAAQkK,KAAS,CAAC,OAAO,SAAShC,EAAElI,EAAM,IAC7D,KAASgK,KAAQ;EACnB,IAAIhK,IAAQ,KAAKA,KAASkK,GAAO;EAEjC,IAAIC,IAAWjE;EACf,IAAI3J,EAAM,KAAK,MAAM0L,EAAEjI,KAASxD,EAAK,EAAE,MAAMyL,EAAEjI,KAASxD,EAAK,EAAE,KAAK;GAClE,IAAM4N,IAAO5N,EAAK,EAAE,KAAKA,EAAK,EAAE;GAKhC,AAJA+K,EACE;IAAE,GAAG,CAACU,EAAEjI,KAASoK,IAAO,GAAGnC,EAAEjI,KAASoK,IAAO,CAAC;IAAG,GAAG5N,EAAK;GAAE,GAC3D,EACF,GACA,IAAW,IAAS6N,EAClBnE,EAAG,MACH1J,GACAD,EAAM,EAAE,SACRA,EAAM,EAAE,SACRA,EAAM,UACR;EACF;EACA,IAAMkI,IAAI6F,GAAQ3B,GAAQ3I,GAAOmK,CAAQ,GACnCI,IAAWC,GAAY7B,GAAQ3I,CAAK,GAOpClB,IAAyB;GAC7B,OAAO,CAACyL,GAAU,GANlBhO,EAAM,gBAAgB,UAAUoM,EAAO,SAAS,aAC3CtE,EAAMI,EAAE,IAAIA,EAAE,EAAE,CAAC,EAAE,SAAS,CAAC,EAAA,CAAG,QAC9B,MAAOE,EAAG,gBAAgBgE,EAAO,KACpC,IACA,CAAC,CAEsB;GAC3B,GAAG4B,EAAS;GACZ,QAAQtN,GAAQ,YAAYsN,EAAS,CAAC,KAAK,OAAOA,EAAS,CAAC;EAC9D;EACA,EAAS;GAAE;GAAO,SAAS9F,EAAE;GAAI,SAASA,EAAE;GAAI,UAAU;EAAK,CAAC;EAChE,IAAME,IAAK4F;EACX,EAAI,KAAK,cAAc,GAAG5F,EAAG,WAAW,IAAI7F,EAAM,OAAO,IAAI5B,GAAQ,YAAYyH,EAAG,CAAC,KAAKA,EAAG,IAAIA,EAAG,QAAQ,KAAKA,EAAG,MAAM,KAAK;CACjI,GAEM8F,MAAa,MAAyB;EAC1C,IAAI,CAACxL,EAAY,CAAC,EAAE,UAAU;EAC9B,IAAMyL,UAAe;GACnB,IAAMjG,IAAIzH,GAAQ;GAClB,OAAOyH,IAAI,CAACA,EAAE,IAAIA,EAAE,QAAQ,GAAGA,EAAE,IAAIA,EAAE,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;EAC5D;EACA,QAAQ3F,EAAM,KAAd;GACE,KAAK;GACL,KAAK;IACH,IAAIvC,EAAM,YAAY;IAEtB,AADAuC,EAAM,eAAe,GACrBgL,GAAWhL,EAAM,QAAQ,iBAAkBvC,EAAM,EAAE,UAAc,KAAJ,CAAM;IACnE;GACF,KAAK;GACL,KAAK;IAEH,IAAI,CAACA,EAAM,YAAY;IAEvB,AADAuC,EAAM,eAAe,GACrBgL,GAAWhL,EAAM,QAAQ,gBAAiBvC,EAAM,EAAE,UAAc,KAAJ,CAAM;IAClE;GACF,KAAK;GACL,KAAK,KAAK;IACR,IAAI,CAACA,EAAM,KAAK,KAAK,CAACA,EAAM,KAAK,GAAG;IACpC,EAAM,eAAe;IACrB,IAAM,CAAC6L,GAAIC,KAAMqC,EAAO;IACxB,GAAOtC,GAAIC,GAAI,EAAG;IAClB;GACF;GACA,KAAK;GACL,KAAK,KAAK;IACR,IAAI,CAAC9L,EAAM,KAAK,KAAK,CAACA,EAAM,KAAK,GAAG;IACpC,EAAM,eAAe;IACrB,IAAM,CAAC6L,GAAIC,KAAMqC,EAAO;IACxB,GAAOtC,GAAIC,GAAI,IAAI;IACnB;GACF;GACA,KAAK;IAEH,AADAvJ,EAAM,eAAe,GACrB+K,GAAU;IACV;GACF,KAAK,UACH,AAAIrM,MACFsB,EAAM,eAAe,GACrB8F,EAAS,IAAI;EAKnB;CACF,GAEM+F,WAAgB;EACpB,IAAIC;EACJ,IAAI;GACF,IAAU9O,EAAI,MAAM,QAAQ,gBAAgB;EAC9C,QAAQ;GACN,IAAU;EACZ;EACA,AAAI8O,MACF,EAAI,MAAM,MAAM,YAAY;CAChC,GAEMC,WAAe;EAEnB,AADA,EAAI,MAAM,MAAM,YAAY,IACxBrN,GAAO,YAAUoH,EAAS,IAAI;CACpC,GAEMkG,IAAQhP,EAAI;CAUlB,AATAgP,EAAM,iBAAiB,eAAelC,EAAa,GACnDkC,EAAM,iBAAiB,eAAe3B,EAAa,GACnD2B,EAAM,iBAAiB,aAAazB,EAAW,GAC/CyB,EAAM,iBAAiB,iBAAiBzB,EAAW,GACnDyB,EAAM,iBAAiB,gBAAgBtB,EAAc,GACrDsB,EAAM,iBAAiB,SAASrB,IAAS,EAAE,SAAS,GAAM,CAAC,GAC3DqB,EAAM,iBAAiB,YAAYlB,EAAa,GAChDkB,EAAM,iBAAiB,WAAWL,EAAS,GAC3CK,EAAM,iBAAiB,SAASH,EAAO,GACvCG,EAAM,iBAAiB,QAAQD,EAAM;CAErC,IAAME,KACJ,OAAO,kBAAmB,aACtB,IAAI,qBAAqB1L,EAAW,CAAC,IACrC;CACN,IAAgB,QAAQvD,EAAI,KAAK;CAEjC,IAAMkP,WAAqB;EACzB,IAAI1N,GAAW;EACf,IAAMyH,IAAOzI,GAAUR,EAAI,MAAMK,EAAQ,OAAO;EAKhD,AAFI8O,GAAmB5O,GAAO0I,CAAI,KAAG,MACrC,IAAQA,GACRxF,EAAQ;CACV,GACM2L,KAAeC,GAAWH,EAAY,GAEtCI,KAAgBC,QAAkB;EACtC,AAAI,CAAC/N,KAAa,CAACnB,EAAQ,UAAQoD,EAAQ;CAC7C,CAAC,GAIK+L,KAAe,OAAO,oBAAkC,IAAI,IAAI,MAAM;EAC1E,IAAMC,IAAQ,EAAElO,IACV0H,IAAO,MAAMyG,GACjBrP,EAAQ,YAAY,cACdsP,EAAiB9P,CAAG,IACzB,MAAS;GACR,AAAI2B,KAAaF,GAAU,SAASsO,MACpCtO,EAAS,QAAQ,GACjBA,EAAS,OAAO,OAAO,GACvB,IAAW,MACXkO,mBAAkB,IAAI,IAAI,CAAC,GAAGK,GAASD,CAAI,CAAC,CAAC;EAC/C,GACAC,CACF;EACA,IAAIrO,KAAaiO,MAAUlO,IAAe;GACxC,GAAM,QAAQ;GACd;EACF;EAaA,AAZID,MACFA,EAAS,QAAQ,GACjBA,EAAS,OAAO,OAAO,IAEzB,IAAW2H,GACPA,MACF,EAAI,KAAK,QAAQ,WAAWA,EAAK,MACjCjJ,EAAI,MAAM,aAAaiJ,EAAK,QAAQjJ,EAAI,UAAU,GAClD,IAAa,IACb6C,EAAK,YAAYoG,EAAK,IAAI,IAE5BvG,GAAauG,GAAM,QAAQ,IAAI,GAC/B1F,EAAW;CACb;CAIA,SAASwK,KAAY;EACnB,AAAKpN,KACL8K,EAAgB/L,EAASe,EAAM,IAAI,GAAG,EAAI;CAC5C;CAGA,AADAgD,EAAQ,GACR+L,GAAkB;CAClB,IAAMM,KAAkBC,SAChB1P,EAAQ,gBACR,KAAKmP,GAAa,CAC1B;CAiFA,OAAO;EA9EL,WAAW,GAAM;GACf,IAAIhO,GAAW;GACf,IAAMwO,IAAW3P;GAQjB,AAPA,IAAU4I,IACLA,EAAK,WAAW,CAAC,EAAA,CAAG,KAAK,OAAO+G,EAAS,WAAW,CAAC,EAAA,CAAG,KAAK,MAChE,IAAQxP,GAAUR,EAAI,MAAMiJ,EAAK,OAAO,GACxC,QAEGA,EAAK,YAAY,aAAa+G,EAAS,YAAY,WACtDR,GAAkB,GACpB/L,EAAQ;EACV;EACA,SAAS;GACP,EAAW;EACb;EACA;EACA,eAAekI,GAAalL,GAAOC,CAAI;EACvC,QAAQ,GAAM;GACZ,AAAIc,KACJiK,EAAgBwE,GAAexP,GAAOwI,GAAMvI,CAAI,GAAG,EAAK;EAC1D;EACA,mBAAmBY,GAAU,QAAQ;EACrC,cAAc;GACZ,IAAM6F,IAAOC,GAAS;GACtB,OAAOD,IACH;IAAE,GAAGA,EAAK;IAAI,GAAGA,EAAK;IAAI,OAAOA,EAAK;IAAI,QAAQA,EAAK;GAAG,IAC1D;EACN;EACA,QAAQ,GAAG,GAAG;GACZ,IAAI,CAACjG,GAAQ,OAAO;GACpB,IAAMyH,IAAIuH,EAAShP,GAAQiP,GAAQ1P,GAAO0L,CAAC,GAAGiE,GAAQ3P,GAAO2L,CAAC,CAAC;GAC/D,OAAO;IACL,GAAGzD,EAAE,IAAI3I,EAAI,MAAM;IACnB,GAAG2I,EAAE,IAAI3I,EAAI,MAAM;GACrB;EACF;EACA,UAAU,GAAG,GAAG;GACd,IAAI,CAACkB,GAAQ,OAAO;GACpB,IAAMyH,IAAImD,EACR5K,GACAiL,IAAInM,EAAI,MAAM,YACdoM,IAAIpM,EAAI,MAAM,SAChB;GACA,OAAO;IAAE,GAAGwM,GAAU/L,GAAOkI,EAAE,CAAC;IAAG,GAAG8D,GAAUhM,GAAOkI,EAAE,CAAC;GAAE;EAC9D;EACA;EACA;EACA,GAAG,GAAM,GAAU;GACjB,IAAI0H,IAAMjQ,EAAU0C;GAMpB,OALKuN,MACH,oBAAM,IAAI,IAAI,GACd,EAAuCvN,KAAQuN,IAEjDA,EAAI,IAAItN,CAAQ,SACH;IACX,EAAI,OAAOA,CAAQ;GACrB;EACF;EACA,UAAU;GACR,IAAI,IAaJ;IAZA,IAAY,IACRtB,MACE1B,GAAK,uBAAsBA,EAAI,qBAAqB0B,CAAO,IAC1D,aAAaA,CAAO,IAE3BwN,IAAgB,WAAW,GAC3Ba,GAAgB,GAChBV,GAAa,GACbE,GAAc,GACdN,EAAM,oBAAoB,SAASrB,EAAO,GAC1CrM,GAAU,QAAQ,GAClB,IAAW,MACXtB,EAAI,KAAK,OAAO;IAChB,KAAK,IAAMmF,KAAO,OAAO,KAAK/E,CAAS,GACrC,OAAQA,EAAsC+E;GAFhC;EAIlB;CAEK;AACT"}
1
+ {"version":3,"file":"chart.js","names":["styleElement","assign","mid","r","copyView","v","createChart","doc","container","win","dom","createChartDom","cache","hidden","listeners","options","initialOptions","theme","readTheme","model","view","zoomed","origin","items","itemsDirty","version","annotations","dependencies","scales","xTicks","yTicks","y2Ticks","renderer","rendererToken","destroyed","frameId","hover","lastPlot","pointDrag","ghost","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","hitAt","hitTest","px","py","p","draggableAt","it","setHover","changed","sameHover","next","renderHover","tooltipNode","custom","content","tooltipContent","fragment","header","sub","swatches","row","grid","cell","n","pooled","pool","i","make","parent","sc","renderMarks","tip","hoverRect","markerCount","bandCount","cellCount","guideCount","liftCount","veiled","renderLegendCaret","guide","crosshairAt","line","marks","hoverMarks","lifted","mark","createBand","PLOT_BACKGROUND","prefersReducedMotion","prev","fresh","liftedBarRect","vertical","ring","shadow","liftShadow","thick","k","CELL_LIFT","CELL_ACCENT","playLift","createMarker","caret","heatPosition","setViewInternal","notify","viewToValues","zoomAt","at","toData","zoomRange","factor","localPoint","inPlot","x","y","dataAt","cx","cy","fromPlotX","fromPlotY","moveGhost","color","size","series","onPointerMove","dx","dy","from","to","panRange","event2","onPointerDown","draggable","onPointerUp","moved","hit","onPointerLeave","onWheel","modifier","wheelFactor","onDoubleClick","resetZoom","moveFocus","current","step","lowerBound","count","current2","span","createScales","pointOf","leadItem","hoverItemOf","onKeyDown","center","onFocus","visible","onBlur","stage","resizeObserver","refreshTheme","themeColorsChanged","unwatchTheme","watchTheme","unwatchLocale","watchLocale","initRenderer","token","createRenderer","createDataCanvas","kind","exclude","unfollowDefault","followDefaultRenderer","previous","viewFromValues","toScreen","toPlotX","toPlotY","set"],"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 createMarker,\n CELL_ACCENT,\n CELL_LIFT,\n liftShadow,\n PLOT_BACKGROUND,\n playLift,\n styleElement,\n swatch,\n} from \"./dom\";\nimport { hoverRect } from \"./hover-rect\";\nimport {\n buildItems,\n cellStyleKey,\n type Origin,\n type PixelDensity,\n} from \"./items\";\nimport { chartAriaLabel } from \"./labels\";\nimport { createScales, toData, toScreen, type Scales } 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 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 { positionTooltip, prefersReducedMotion } 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;\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 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 x: number;\n y: number;\n moved: boolean;\n } | null = null;\n let ghost: HTMLDivElement | null = null;\n let drag: {\n id: number;\n x: number;\n y: number;\n view: ChartView;\n moved: boolean;\n } | null = null;\n const markers: HTMLDivElement[] = [];\n const 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 });\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) hover = null;\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 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 ),\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 }\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)\n positionTooltip(tip, dom.stage, {\n anchor: { x: hover.anchorX, y: hover.anchorY },\n avoid: hoverRect(model, sc, hover.event),\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 // the bar in its color, thicker (never longer), lifted and ringed\n if (!liftClip) {\n liftClip = styleElement(doc.createElement(\"div\"), {\n position: \"absolute\",\n overflow: \"hidden\",\n }) as HTMLDivElement;\n dom.lift.appendChild(liftClip);\n }\n if (!veiled) {\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(veil, liftClip);\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 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 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: `0 0 0 4px ${mark.halo}`,\n });\n }\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 // ---------------------------------------------------------- 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 moveGhost = (x: number, y: number, color: string | null) => {\n if (color === null) {\n if (ghost) ghost.style.display = \"none\";\n return;\n }\n if (!ghost) {\n ghost = createMarker(doc);\n dom.hover.appendChild(ghost);\n }\n const s = model.series.find((series) => series.type === \"scatter\");\n const size = (s?.pointSize ?? 8) + 8;\n dom.hover.style.width = `${dom.stage.clientWidth}px`;\n dom.hover.style.height = `${dom.stage.clientHeight}px`;\n styleElement(ghost, {\n display: \"block\",\n left: `${x}px`,\n top: `${y}px`,\n width: `${size}px`,\n height: `${size}px`,\n background: color,\n });\n };\n\n const onPointerMove = (event: PointerEvent) => {\n const { x, y } = localPoint(event);\n if (pointDrag && pointDrag.id === event.pointerId) {\n if (\n !pointDrag.moved &&\n Math.hypot(x - pointDrag.x, y - pointDrag.y) > 3\n ) {\n pointDrag.moved = true;\n dom.stage.setPointerCapture?.(event.pointerId);\n dom.stage.style.cursor = \"grabbing\";\n }\n if (pointDrag.moved) {\n const at = dataAt(x, y);\n if (at) {\n moveGhost(x, y, pointDrag.item.color);\n renderHover();\n emit(\"drag\", { item: pointDrag.item, x: at.x, y: at.y });\n }\n }\n return;\n }\n if (drag && drag.id === event.pointerId) {\n const dx = x - drag.x;\n const dy = y - drag.y;\n if (!drag.moved && Math.hypot(dx, dy) > 3) {\n const it = interaction();\n if (zoomed && it?.pan) {\n drag.moved = true;\n dom.stage.setPointerCapture?.(event.pointerId);\n dom.stage.style.cursor = \"grabbing\";\n }\n }\n if (drag.moved && scales) {\n const next = copyView(drag.view);\n 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 = { id: event.pointerId, item: draggable, x, y, moved: false };\n return;\n }\n drag = { id: event.pointerId, x, y, view: copyView(view), moved: false };\n };\n\n const onPointerUp = (event: PointerEvent) => {\n if (pointDrag && pointDrag.id === event.pointerId) {\n const { item, moved } = pointDrag;\n pointDrag = null;\n if (dom.stage.hasPointerCapture?.(event.pointerId)) {\n dom.stage.releasePointerCapture(event.pointerId);\n }\n moveGhost(0, 0, null);\n const { x, y } = localPoint(event);\n dom.stage.style.cursor = draggableAt(x, y) ? \"grab\" : \"\";\n if (moved) {\n const at = dataAt(x, y);\n if (at && event.type !== \"pointercancel\")\n emit(\"drop\", { item, x: at.x, y: at.y });\n renderHover();\n } else {\n const hit = hitAt(x, y);\n if (hit) emit(\"click\", hit);\n }\n return;\n }\n if (!drag || drag.id !== event.pointerId) return;\n const moved = drag.moved;\n drag = null;\n if (dom.stage.hasPointerCapture?.(event.pointerId)) {\n dom.stage.releasePointerCapture(event.pointerId);\n }\n dom.stage.style.cursor = zoomed && interaction()?.pan ? \"grab\" : \"\";\n if (!moved) {\n const { x, y } = localPoint(event);\n const hit = hitAt(x, y);\n if (hit) emit(\"click\", hit);\n else if (event.type !== \"pointercancel\" && inPlot(x, y)) {\n const at = dataAt(x, y);\n if (at) emit(\"plotClick\", at);\n }\n } else {\n renderHover();\n }\n };\n\n const onPointerLeave = () => {\n if (!drag?.moved && !pointDrag?.moved) setHover(null);\n };\n\n const onWheel = (event: WheelEvent) => {\n const it = interaction();\n if (!it || it.zoom === false || (!model.zoom.x && !model.zoom.y)) return;\n const { x, y } = localPoint(event);\n if (!inPlot(x, y)) return;\n const modifier = event.ctrlKey || event.metaKey;\n if (it.wheel === \"always\" || modifier) {\n event.preventDefault();\n zoomAt(\n x,\n y,\n wheelFactor(\n event.deltaY,\n event.deltaMode,\n event.ctrlKey && !event.metaKey,\n ),\n );\n } else if (\n zoomed &&\n model.zoom.x &&\n scales &&\n !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 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 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 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,3 +1,3 @@
1
- const e=require("./data.cjs"),t=require("./color.cjs"),n=require("./curve.cjs"),r=require("./layout.cjs"),i=require("./model.cjs"),a=require("./overlay.cjs"),o=require("./decimate.cjs"),s=require("./scene.cjs"),c=require("./theme.cjs"),l=require("./viewport.cjs");var u=e=>({x:[e.x[0],e.x[1]],y:[e.y[0],e.y[1]]}),d=6,f=10,p=320,m=20,h=e=>{let t=e.options,n=e.theme,o=c.createTheme(n,t.palette),h=new Map,g=new Set,_={},v,y={x:[0,1],y:[0,1]},b=!1,x=0,S=0,C=[],w=[],T=null,E=!0,D=``,O=!1,k=null,A=new Map,j=null,M={time:0,x:0,y:0},N=(e,t)=>{_[e]?.forEach(e=>e(t))},P=()=>{E=!0,O||e.onInvalidate?.()},F=()=>{let e=t.interaction;if(e===!1)return null;let n=typeof e==`object`?e:{};return{pan:n.pan??!0,dragPoints:n.dragPoints??!1}},I=(t,n=o.fontSize,r=400)=>e.measureText(t,a.font(o,n,r)),L=()=>{v=i.buildModel(t,o,g,h);let{base:e,minSpan:n}=v;b?(y={x:v.zoom.x?l.clampRange(y.x,e.x,n.x):[...e.x],y:v.zoom.y?l.clampRange(y.y,e.y,n.y):[...e.y]},b=!l.sameRange(y.x,e.x)||!l.sameRange(y.y,e.y)):y=u(e),C=s.resolveAnnotations(t.annotations,o,v.y.type===`log`?Math.log10:void 0,v.x.type===`log`?Math.log10:void 0),w=s.resolveDependencies(t.dependencies,o),k&&(k.event.items.every(e=>v.series[e.seriesIndex]&&!v.series[e.seriesIndex].hidden&&e.index<v.series[e.seriesIndex].cols.count)||U(null)),P()},R=()=>{let e=t.legend,n=t.series.filter(e=>e.name).length;if(!s.legendShown(e,v,n))return null;let r=typeof e==`object`?e:{},i=r.position===`bottom`?`bottom`:`top`,a=s.colorLegend(v);if(a){let e=a.labels[0]?.text??``,t=a.labels[a.labels.length-1]?.text??``,n=Math.max(60,Math.min(160,x*.32)),r=x-4-I(t,11)-8,o=r-n,s=(i===`bottom`?S-m:0)+m/2;return{entries:[],colors:{bar:{x:o,y:s-4,width:n,height:8},stops:a.stops,labels:[{text:e,x:o-8,y:s,align:`right`},{text:t,x:r+8,y:s,align:`left`}],ticks:a.labels.filter(e=>e.at>0&&e.at<1).map(e=>o+e.at*n),caret:null},position:i,toggle:!1,height:26}}let o=[],c=4,l=0;for(let e of v.series){let t=14+I(e.name,12)+8;c+t>x-4&&c>4&&(c=4,l++),o.push({id:e.id,name:e.name,color:e.colorCss,shape:s.legendShape(e.type),hidden:e.hidden,box:{x:c,y:l*m,width:t,height:m}}),c+=t+10}let u=(l+1)*m+6;if(i===`bottom`)for(let e of o)e.box.y+=S-u+6;return{entries:o,colors:null,position:i,toggle:r.toggle??!0,height:u}},z=(e,n,r)=>{let i=t.tooltip;if(i===!1)return null;let a=typeof i==`object`?i.render:void 0,o=null;if(a){let t=a(e);if(t===null||t===``)return null;typeof t==`string`&&(o=t.split(`
2
- `))}let c=s.tooltipContent(v,e,T?.layout.yTicks??null,T?.layout.y2Ticks??null),l=0,u,d=c.rows.some(e=>e.color)?14:0;if(o){for(let e of o)l=Math.max(l,I(e,12));u=o.length}else{l=I(c.title,12,600)+(c.titleColor?14:0),c.subtitle&&(l=Math.max(l,I(c.subtitle,11)+(c.titleColor?14:0)));let e=0,t=0;for(let n of c.rows)e=Math.max(e,I(n.name,12)),t=Math.max(t,I(n.value,12,600));c.rows.length&&(l=Math.max(l,d+e+16+t)),u=1+ +!!c.subtitle+c.rows.length}let f=Math.ceil(Math.max(l,96)+16+4),p=u*18+16,m=n+14;m+f>x-4&&(m=n-14-f),m=Math.max(4,Math.min(m,x-f-4));let h=Math.max(4,Math.min(r-p/2,S-p-4));return{content:c,text:o,box:{x:m,y:h,width:f,height:p},lineHeight:18,padding:8,swatchWidth:d}},B=()=>{if(x<=0||S<=0)return null;let e=R(),n=e?.position===`top`?e.height:0,r=s.layoutChart({model:v,view:y,theme:o,width:x,height:S-(e?.height??0),padding:t.padding,top:n,measure:e=>I(e)}),c=s.collectPointLabels(v,y,r.scales,r.yTicks,o.background),l=[],d=o.fontSize+4;for(let e of C){if(e.type===`text`&&e.text){l.push(a.textBox(e,r.scales,I(e.text,o.fontSize,e.weight),d));continue}if(e.type!==`rect`)continue;let t=a.areaTitleLayout(e,a.rectOf(e,r.scales),o.fontSize,I);t&&l.push(t.box)}let f=a.placeLabels(c,r.plot,e=>I(e),d-2,l),p={width:x,height:S,theme:o,model:v,view:u(y),layout:r,annotations:C,pointLabels:f,legend:e,hover:null,dragging:null,connectors:s.connectorSegments(v,r.scales),arrows:s.dependencyArrows(v,r.scales,w)};if(T=p,k){let n=s.crosshairAt(v,r.scales,k.event,t.crosshair),a=r.scales.horizontal;p.hover={event:k.event,marks:s.hoverMarks(v,r.scales,k.event),crosshairX:a?null:n,crosshairY:a?n:null,tooltip:j?.kind===`pan`||j?.kind===`point`?null:z(k.event,k.x,k.y)};let o=e?.colors,c=k.event.items[0],l=c?v.series[c.seriesIndex]:void 0;o&&c&&l?.type===`heatmap`&&c.value!==void 0&&(o.caret=o.bar.x+i.heatPosition(l,c.value)*o.bar.width)}if(j?.kind===`point`){let e=v.series[j.item.seriesIndex];p.dragging={x:j.x,y:j.y,color:j.item.color,size:(e?s.dotSize(e,j.item.index):8)+6}}let m=r.plot,h=`${m.x},${m.y},${m.width},${m.height}`;return h!==D&&(D=h,N(`layout`,{...m})),p},V=()=>((E||!T)&&(E=!1,T=B()),T),H=()=>V()?.layout.scales??null,U=e=>{let t=!s.sameHover(k?.event??null,e?.event??null);k=e,P(),t&&N(`hover`,e?e.event:null)},W=(e,t,n)=>{let r=H();return r?s.hitTest(v,r,T?.layout.xTicks??null,e,t,n?8:0):null},G=(e,t)=>{let n=H()?.plot;return!!n&&e>=n.x&&e<=n.x+n.width&&t>=n.y&&t<=n.y+n.height},K=(e,t)=>{let n=H();if(!n)return null;let{plot:a}=n,o=Math.max(a.x,Math.min(a.x+a.width,e)),s=Math.max(a.y,Math.min(a.y+a.height,t)),c=r.toData(n,o,s);return{x:i.fromPlotX(v,c.x),y:i.fromPlotY(v,c.y)}},q=(e,t)=>{let{base:n,minSpan:r}=v;y={x:l.clampRange(e.x,n.x,r.x),y:l.clampRange(e.y,n.y,r.y)},b=!l.sameRange(y.x,n.x)||!l.sameRange(y.y,n.y),t&&N(`zoom`,i.viewToValues(v,y)),P()},J=(e,t,n)=>{let i=H();if(!i||!v.zoom.x&&!v.zoom.y)return;let a=u(y),o=r.toData(i,e,t);v.zoom.x&&(a.x=l.zoomRange(y.x,o.x,n)),v.zoom.y&&(a.y=l.zoomRange(y.y,o.y,n)),q(a,!0)},Y=()=>{b&&q(u(v.base),!0)},X=(e,t)=>V()?.legend?.entries.find(n=>e>=n.box.x&&e<=n.box.x+n.box.width&&t>=n.box.y&&t<=n.box.y+n.box.height)??null,Z=e=>{g.has(e)?g.delete(e):g.add(e),L()},Q=()=>{let[e,t]=[...A.values()];j={kind:`pinch`,view:u(y),distance:Math.max(1,Math.hypot(e.x-t.x,e.y-t.y)),midX:(e.x+t.x)/2,midY:(e.y+t.y)/2},U(null)};return v=i.buildModel(t,o,g,h),L(),{setOptions(e){if(O)return;let r=(e.palette??[]).join()!==(t.palette??[]).join();t=e,r&&(o=c.createTheme(n,t.palette)),L()},setTheme(e){O||(n=e,o=c.createTheme(n,t.palette),L())},setSize(e,t){(e!==x||t!==S)&&(x=Math.max(0,e),S=Math.max(0,t),P())},getScene:V,pointerDown:(e,t,n={})=>{if(O)return;let r=n.id??0,i=!!n.touch;A.set(r,{x:e,y:t,startX:e,startY:t,touch:i,moved:!1});let a=F();if(A.size===2){a&&(v.zoom.x||v.zoom.y)&&j?.kind!==`point`&&Q();return}if(A.size>2||!a){if(!a&&i){let n=W(e,t,!0);U(n?{event:n,x:e,y:t}:null)}return}if(a.dragPoints){let n=W(e,t,i)?.items.find(e=>v.series[e.seriesIndex].type===`scatter`);if(n){j={kind:`point`,item:n,x:e,y:t};return}}if(b&&a.pan&&G(e,t)){j={kind:`pan`,view:u(y),x:e,y:t};return}if(j=null,i){let n=W(e,t,!0);U(n?{event:n,x:e,y:t}:null)}},pointerMove:(e,t,n={})=>{if(O)return;let i=n.id??0,a=A.get(i);if(a&&(a.x=e,a.y=t,!a.moved&&Math.hypot(e-a.startX,t-a.startY)>(a.touch?f:d)&&(a.moved=!0)),j?.kind===`pinch`&&A.size>=2){let[e,t]=[...A.values()],n=Math.max(1,Math.hypot(e.x-t.x,e.y-t.y)),i=(e.x+t.x)/2,a=(e.y+t.y)/2,o=H();if(!o)return;let s=r.createScales(o.plot,j.view,v.x.reverse,v.y.reverse,v.horizontal),c=j.distance/n,d=u(j.view),f=r.toData(s,j.midX,j.midY),p=r.toData(s,i,a);v.zoom.x&&(d.x=l.zoomRange(j.view.x,f.x,c),d.x=l.panRange(d.x,(f.x-p.x)*c)),v.zoom.y&&(d.y=l.zoomRange(j.view.y,f.y,c),d.y=l.panRange(d.y,(f.y-p.y)*c)),q(d,!0);return}if(j?.kind===`point`&&a){if(!a.moved)return;j.x=e,j.y=t;let n=K(e,t);P(),n&&N(`drag`,{item:j.item,x:n.x,y:n.y});return}if(j?.kind===`pan`&&a){if(!a.moved)return;let n=H();if(!n)return;let i=u(j.view),o=r.toData(n,j.x,j.y),s=r.toData(n,e,t);v.zoom.x&&(i.x=l.panRange(j.view.x,o.x-s.x)),v.zoom.y&&(i.y=l.panRange(j.view.y,o.y-s.y)),q(i,!0);return}if(!(A.size>1)&&(!a||a.touch||!n.touch)){let r=W(e,t,!!a?.touch||!!n.touch);(r||!a?.touch)&&U(r?{event:r,x:e,y:t}:null)}},pointerUp:(e,t,n={})=>{if(O)return;let r=n.id??0,i=A.get(r);A.delete(r);let a=j;if(a?.kind===`pinch`){A.size<2&&(j=null);return}if(j=null,!i)return;if(a?.kind===`point`){if(i.moved){let n=K(e,t);P(),n&&N(`drop`,{item:a.item,x:n.x,y:n.y});return}}else if(a?.kind===`pan`&&i.moved){P();return}if(i.moved){i.touch&&P();return}let o=Date.now();if(i.touch&&o-M.time<p&&Math.hypot(e-M.x,t-M.y)<24&&b){M={time:0,x:e,y:t},Y();return}M={time:o,x:e,y:t};let s=X(e,t);if(s){V()?.legend?.toggle&&Z(s.id);return}let c=W(e,t,i.touch);if(c){i.touch&&U({event:c,x:e,y:t}),N(`click`,c);return}if(i.touch&&U(null),G(e,t)){let n=K(e,t);n&&N(`plotClick`,n)}},pointerCancel:(e={})=>{A.delete(e.id??0),(j?.kind===`point`||A.size<2)&&(j=null),P()},pointerLeave(){!j&&k&&U(null)},zoomAt:J,resetZoom:Y,getView:()=>i.viewToValues(v,y),setView(e){O||q(i.viewFromValues(v,e,y),!1)},toggleSeries:Z,clearHover(){k&&U(null)},getPlotRect(){let e=V()?.layout.plot;return e?{...e}:null},toPixel(e,t){let n=H();return n?r.toScreen(n,i.toPlotX(v,e),i.toPlotY(v,t)):null},fromPixel(e,t){let n=H();if(!n)return null;let a=r.toData(n,e,t);return{x:i.fromPlotX(v,a.x),y:i.fromPlotY(v,a.y)}},on(e,t){let n=_[e];return n||(n=new Set,_[e]=n),n.add(t),()=>{n.delete(t)}},destroy(){O=!0,A.clear();for(let e of Object.keys(_))delete _[e]}}},g=(t,n,r,i)=>{if(!r)return[0,n];let[a,o]=i[0]<=i[1]?i:[i[1],i[0]];return[Math.max(0,e.lowerBound(t,n,a)-1),Math.min(n,e.lowerBound(t,n,o)+1)]},_={heatmap:0,area:1,bar:2,boxplot:2,candlestick:3,line:4,scatter:5},v=(e,t)=>{if(!e.horizontal)return t;let n=Array(t.length);for(let e=0;e<t.length;e+=4)n[e]=t[e+1],n[e+1]=t[e],n[e+2]=t[e+3],n[e+3]=t[e+2];return n},y=(e,a={})=>{let{model:c,view:l,layout:u}=e,d=u.scales,{plot:f}=u,p=d.horizontal,m=a.maxDots??4e3,h=a.maxBars??2e3,y=Math.max(1,a.columnWidth??1),x=p?f.y:f.x,S=x+(p?f.height:f.width),C=[],w=c.series.filter(e=>!e.hidden&&e.cols.count>0).sort((e,t)=>_[e.type]-_[t.type]||e.index-t.index);for(let e of w){let{x:u,y:_,count:w,sorted:T}=e.cols;if(e.type===`line`||e.type===`area`){let[t,i]=g(u,w,T,l.x),a=e.stackTop??_,s=n.curvePoints(u,a,t,i,e.curve),f=e.stackBase?n.curvePoints(u,e.stackBase,t,i,e.curve).points:null,m=s.length,h=s.points,v=f;if(T&&m>(S-x)*2/y){if(f){let e=o.decimateMinMax(h,0,m,e=>d.xToPx(e)/y),t=new Float64Array(e.length*2),n=new Float64Array(e.length*2),r=0,i=0;for(let a=0;a<e.length;a++){let o=e.points[a*2];for(;i<m-1&&h[i*2]<o;)i++;t[r*2]=o,t[r*2+1]=e.points[a*2+1],n[r*2]=o,n[r*2+1]=f[i*2+1],r++}h=t,v=n,m=r}else{let e=o.decimateMinMax(h,0,m,e=>d.xToPx(e)/y);h=e.points,m=e.length}}let b=e.type===`area`&&!!e.cols.y0&&!!v,E=[],D=[],O=[],k=[],A=[],j=[],M=()=>{k.length&&(E.push(k),D.push(A),b&&O.push(j)),k=[],A=[],j=[]};for(let e=0;e<m;e++){let t=h[e*2],n=h[e*2+1],i=v?v[e*2+1]:0;if(!Number.isFinite(t)||!Number.isFinite(n)||!Number.isFinite(i)){M();continue}let a=r.toScreen(d,t,n);if(k.push(a.x,a.y),v&&A.push(d.yToPx(i)),b){let e=r.toScreen(d,t,i);j.push(e.x,e.y)}}if(M(),e.type===`area`&&C.push({kind:`area`,seriesIndex:e.index,color:e.colorCss,opacity:e.opacity,baseline:d.yToPx(c.baseline),segments:E,...v?{bottoms:D}:{},...p?{horizontal:!0}:{}}),e.lineWidth>0){let t=e.type===`area`?Math.min(e.lineWidth,2):e.lineWidth;C.push({kind:`line`,seriesIndex:e.index,color:e.colorCss,width:t,segments:E}),b&&C.push({kind:`line`,seriesIndex:e.index,color:e.colorCss,width:t,segments:O})}continue}if(e.type===`bar`&&e.barBase&&e.barTop){let[n,r]=g(u,w,T,l.x),a=Math.max(e.barHalfWidth/Math.abs(d.xPerPx),.5),o=[],s=[],c=r-n>h,f=NaN;for(let l=n;l<r;l++){let n=e.barBase[l],r=e.barTop[l];if(!Number.isFinite(n)||!Number.isFinite(r))continue;let p=d.xToPx(u[l]+e.barOffset);if(p+a<x||p-a>S)continue;let m=d.yToPx(n),h=d.yToPx(r),g=Math.min(m,h),_=Math.max(1,Math.abs(m-h)),v=Math.floor(p);if(c&&v===f&&o.length){let e=o.length-4,t=Math.max(o[e+1]+o[e+3],g+_);o[e+1]=Math.min(o[e+1],g),o[e+3]=t-o[e+1];continue}f=v,o.push(p-a,g,a*2,_);let y=e.pointColors?.[l];s.push(e.cols.opacities?t.toCss(y??e.color,i.barOpacity(e,l)):y?t.toCss(y):e.colorCss)}C.push({kind:`bars`,seriesIndex:e.index,color:e.colorCss,rects:v(d,o),...e.pointColors||e.cols.opacities?{colors:s}:{},radius:e.radius,...e.opacity<1&&!e.cols.opacities?{opacity:e.opacity}:{}});continue}if(e.type===`boxplot`){C.push(...b(e,d,l.x,x,S,h));continue}if(e.type===`candlestick`){let[n,r]=g(u,w,T,l.x),{open:i,high:a,low:o}=e.cols,s=Math.max(e.barHalfWidth/Math.abs(d.xPerPx),1),c=t.toCss(e.upColor),f=t.toCss(e.downColor),p=[],m=[],y=[],b=[],E=Math.max(1,Math.ceil((r-n)/h));for(let e=n;e<r;e+=E){let t=_[e],n=i?i[e]:t;if(!Number.isFinite(t)||!Number.isFinite(n))continue;let r=d.xToPx(u[e]);if(r+s<x||r-s>S)continue;let l=t<n?f:c,h=d.yToPx(a?a[e]:Math.max(n,t)),g=d.yToPx(o?o[e]:Math.min(n,t));p.push(r-.5,Math.min(h,g),1,Math.abs(g-h)),y.push(l);let v=d.yToPx(n),C=d.yToPx(t);m.push(r-s,Math.min(v,C),s*2,Math.max(1,Math.abs(v-C))),b.push(l)}C.push({kind:`bars`,seriesIndex:e.index,color:c,rects:v(d,p),colors:y},{kind:`bars`,seriesIndex:e.index,color:c,rects:v(d,m),colors:b,radius:1});continue}if(e.type===`heatmap`){let n=Math.abs(e.cellHalf.x/d.xPerPx),i=Math.abs(e.cellHalf.y/d.yPerPx),a=[],o=[],s=r.heatCellStyle(n*2,i*2,e.radius),c=s.inset;for(let s=0;s<w&&a.length/4<h*4;s++){let l=e.cellColors?.[s];if(!l)continue;let p=r.screenRect(d,d.xToPx(u[s])-n,d.xToPx(u[s])+n,d.yToPx(_[s])-i,d.yToPx(_[s])+i);p.x+p.width<f.x||p.x>f.x+f.width||p.y+p.height<f.y||p.y>f.y+f.height||(a.push(p.x+c,p.y+c,p.width-c*2,p.height-c*2),o.push(t.toCss(t.unpackColor(l))))}C.push({kind:`bars`,seriesIndex:e.index,color:e.colorCss,rects:a,colors:o,radius:s.radius});continue}let E=[],D=[],O=n=>{let r=e.pointColors?.[n];return r?t.toCss(r):e.colorCss},k=[],A=[];for(let e=0;e<w;e++){let t=u[e],n=_[e];if(!Number.isFinite(t)||!Number.isFinite(n))continue;let i=r.toScreen(d,t,n);i.x<f.x||i.x>f.x+f.width||i.y<f.y||i.y>f.y+f.height||(k.push(e),A.push(i.x,i.y))}if(k.length>m){let t=Math.max(2,a.dotCell??e.pointSize*.8),n=Math.ceil(f.width/t)+1,r=new Map;k.forEach((e,i)=>{let a=Math.floor((A[i*2]-f.x)/t),o=Math.floor((A[i*2+1]-f.y)/t);r.set(o*n+a,e)});for(let[e,i]of r)E.push(f.x+(e%n+.5)*t,f.y+(Math.floor(e/n)+.5)*t,t),D.push(O(i))}else k.forEach((t,n)=>{E.push(A[n*2],A[n*2+1],s.dotSize(e,t)),D.push(O(t))});C.push({kind:`dots`,seriesIndex:e.index,opacity:e.opacity,dots:E,colors:D,...e.stroke===null?{}:{stroke:e.stroke}})}return C},b=(e,n,r,i,a,o)=>{let{x:s,y:c,count:l,sorted:u,high:d,low:f,q1:p,q3:m,outliers:h}=e.cols,[_,y]=g(s,l,u,r),b=Math.max(e.barHalfWidth/Math.abs(n.xPerPx),1),x=Math.max(1,e.lineWidth),S=[],C=[],w=[],T=[],E=[],D=[],O=Math.max(1,Math.ceil((y-_)/o)),k=(e,t,n)=>{C.push(e-x/2,Math.min(t,n),x,Math.abs(t-n))},A=(e,t,n,r=x)=>{C.push(e-t,n-r/2,t*2,r)};for(let r=_;r<y;r+=O){let o=c[r];if(!Number.isFinite(o))continue;let l=n.xToPx(s[r]+e.barOffset);if(l+b<i||l-b>a)continue;let u=e.pointColors?.[r],g=u?t.toCss(u):e.colorCss,_=n.yToPx(f&&Number.isFinite(f[r])?f[r]:o),v=n.yToPx(d&&Number.isFinite(d[r])?d[r]:o),y=n.yToPx(p&&Number.isFinite(p[r])?p[r]:o),O=n.yToPx(m&&Number.isFinite(m[r])?m[r]:o),j=C.length;S.push(l-b,Math.min(y,O),b*2,Math.abs(y-O)),w.push(g),k(l,_,y),k(l,O,v),k(l-b,y,O),k(l+b,y,O),A(l,b/2,_),A(l,b/2,v),A(l,b,y),A(l,b,O),A(l,b,n.yToPx(o),Math.max(2,x*1.6));for(let e=j;e<C.length;e+=4)T.push(g);let M=h?.[r];if(M)for(let t of M){let r=n.horizontal?{x:n.yToPx(t),y:l}:{x:l,y:n.yToPx(t)};E.push(r.x,r.y,e.outlierSize),D.push(g)}}let j=[{kind:`bars`,seriesIndex:e.index,color:e.colorCss,rects:v(n,S),colors:w,opacity:e.opacity},{kind:`bars`,seriesIndex:e.index,color:e.colorCss,rects:v(n,C),colors:T}];return E.length&&j.push({kind:`dots`,seriesIndex:e.index,opacity:e.outlierShape===`hollow`?0:.85,dots:E,colors:D,stroke:1.25}),j};exports.createChartController=h,exports.scenePrimitives=y;
1
+ const e=require("./data.cjs"),t=require("./tooltip.cjs"),n=require("./color.cjs"),r=require("./layout.cjs"),i=require("./model.cjs"),a=require("./overlay.cjs"),o=require("./scene.cjs"),s=require("./hover-rect.cjs"),c=require("./curve.cjs"),l=require("./decimate.cjs"),u=require("./theme.cjs"),d=require("./viewport.cjs");var f=e=>({x:[e.x[0],e.x[1]],y:[e.y[0],e.y[1]]}),p=6,m=10,h=320,g=20,_=e=>{let n=e.options,c=e.theme,l=u.createTheme(c,n.palette),_=new Map,v=new Set,y={},b,x={x:[0,1],y:[0,1]},S=!1,C=0,w=0,T=[],E=[],D=null,O=!0,k=``,A=!1,j=null,M=new Map,N=null,P={time:0,x:0,y:0},F=(e,t)=>{y[e]?.forEach(e=>e(t))},I=()=>{O=!0,A||e.onInvalidate?.()},L=()=>{let e=n.interaction;if(e===!1)return null;let t=typeof e==`object`?e:{};return{pan:t.pan??!0,dragPoints:t.dragPoints??!1}},R=(t,n=l.fontSize,r=400)=>e.measureText(t,a.font(l,n,r)),z=()=>{b=i.buildModel(n,l,v,_);let{base:e,minSpan:t}=b;S?(x={x:b.zoom.x?d.clampRange(x.x,e.x,t.x):[...e.x],y:b.zoom.y?d.clampRange(x.y,e.y,t.y):[...e.y]},S=!d.sameRange(x.x,e.x)||!d.sameRange(x.y,e.y)):x=f(e),T=o.resolveAnnotations(n.annotations,l,b.y.type===`log`?Math.log10:void 0,b.x.type===`log`?Math.log10:void 0),E=o.resolveDependencies(n.dependencies,l),j&&(j.event.items.every(e=>b.series[e.seriesIndex]&&!b.series[e.seriesIndex].hidden&&e.index<b.series[e.seriesIndex].cols.count)||G(null)),I()},B=()=>{let e=n.legend,t=n.series.filter(e=>e.name).length;if(!o.legendShown(e,b,t))return null;let r=typeof e==`object`?e:{},i=r.position===`bottom`?`bottom`:`top`,a=o.colorLegend(b);if(a){let e=a.labels[0]?.text??``,t=a.labels[a.labels.length-1]?.text??``,n=Math.max(60,Math.min(160,C*.32)),r=C-4-R(t,11)-8,o=r-n,s=(i===`bottom`?w-g:0)+g/2;return{entries:[],colors:{bar:{x:o,y:s-4,width:n,height:8},stops:a.stops,labels:[{text:e,x:o-8,y:s,align:`right`},{text:t,x:r+8,y:s,align:`left`}],ticks:a.labels.filter(e=>e.at>0&&e.at<1).map(e=>o+e.at*n),caret:null},position:i,toggle:!1,height:26}}let s=[],c=4,l=0;for(let e of b.series){let t=14+R(e.name,12)+8;c+t>C-4&&c>4&&(c=4,l++),s.push({id:e.id,name:e.name,color:e.colorCss,shape:o.legendShape(e.type),hidden:e.hidden,box:{x:c,y:l*g,width:t,height:g}}),c+=t+10}let u=(l+1)*g+6;if(i===`bottom`)for(let e of s)e.box.y+=w-u+6;return{entries:s,colors:null,position:i,toggle:r.toggle??!0,height:u}},V=(e,r,i,a)=>{let c=n.tooltip;if(c===!1)return null;let l=typeof c==`object`?c.render:void 0,u=null;if(l){let t=l(e);if(t===null||t===``)return null;typeof t==`string`&&(u=t.split(`
2
+ `))}let d=o.tooltipContent(b,e,D?.layout.yTicks??null,D?.layout.y2Ticks??null),f=0,p,m=d.rows.some(e=>e.color)?14:0;if(u){for(let e of u)f=Math.max(f,R(e,12));p=u.length}else{f=R(d.title,12,600)+(d.titleColor?14:0),d.subtitle&&(f=Math.max(f,R(d.subtitle,11)+(d.titleColor?14:0)));let e=0,t=0;for(let n of d.rows)e=Math.max(e,R(n.name,12)),t=Math.max(t,R(n.value,12,600));d.rows.length&&(f=Math.max(f,m+e+16+t)),p=1+ +!!d.subtitle+d.rows.length}let h=Math.ceil(Math.max(f,96)+16+4),g=p*18+16,{x:_,y:v}=t.placeTooltip({anchor:{x:r,y:i},avoid:s.hoverRect(b,a,e),size:{width:h,height:g},stage:{width:C,height:w},prefer:a.horizontal?`vertical`:`side`});return{content:d,text:u,box:{x:_,y:v,width:h,height:g},lineHeight:18,padding:8,swatchWidth:m}},H=()=>{if(C<=0||w<=0)return null;let e=B(),t=e?.position===`top`?e.height:0,r=o.layoutChart({model:b,view:x,theme:l,width:C,height:w-(e?.height??0),padding:n.padding,top:t,measure:e=>R(e)}),s=o.collectPointLabels(b,x,r.scales,r.yTicks,l.background),c=[],u=l.fontSize+4;for(let e of T){if(e.type===`text`&&e.text){c.push(a.textBox(e,r.scales,R(e.text,l.fontSize,e.weight),u));continue}if(e.type!==`rect`)continue;let t=a.areaTitleLayout(e,a.rectOf(e,r.scales),l.fontSize,R);t&&c.push(t.box)}let d=a.placeLabels(s,r.plot,e=>R(e),u-2,c),p={width:C,height:w,theme:l,model:b,view:f(x),layout:r,annotations:T,pointLabels:d,legend:e,hover:null,dragging:null,connectors:o.connectorSegments(b,r.scales),arrows:o.dependencyArrows(b,r.scales,E)};if(D=p,j){let t=o.crosshairAt(b,r.scales,j.event,n.crosshair),a=r.scales.horizontal;p.hover={event:j.event,marks:o.hoverMarks(b,r.scales,j.event),crosshairX:a?null:t,crosshairY:a?t:null,tooltip:N?.kind===`pan`||N?.kind===`point`?null:V(j.event,j.x,j.y,r.scales)};let s=e?.colors,c=j.event.items[0],l=c?b.series[c.seriesIndex]:void 0;s&&c&&l?.type===`heatmap`&&c.value!==void 0&&(s.caret=s.bar.x+i.heatPosition(l,c.value)*s.bar.width)}if(N?.kind===`point`){let e=b.series[N.item.seriesIndex];p.dragging={x:N.x,y:N.y,color:N.item.color,size:(e?o.dotSize(e,N.item.index):8)+6}}let m=r.plot,h=`${m.x},${m.y},${m.width},${m.height}`;return h!==k&&(k=h,F(`layout`,{...m})),p},U=()=>((O||!D)&&(O=!1,D=H()),D),W=()=>U()?.layout.scales??null,G=e=>{let t=!o.sameHover(j?.event??null,e?.event??null);j=e,I(),t&&F(`hover`,e?e.event:null)},K=(e,t,n)=>{let r=W();return r?o.hitTest(b,r,D?.layout.xTicks??null,e,t,n?8:0):null},q=(e,t)=>{let n=W()?.plot;return!!n&&e>=n.x&&e<=n.x+n.width&&t>=n.y&&t<=n.y+n.height},J=(e,t)=>{let n=W();if(!n)return null;let{plot:a}=n,o=Math.max(a.x,Math.min(a.x+a.width,e)),s=Math.max(a.y,Math.min(a.y+a.height,t)),c=r.toData(n,o,s);return{x:i.fromPlotX(b,c.x),y:i.fromPlotY(b,c.y)}},Y=(e,t)=>{let{base:n,minSpan:r}=b;x={x:d.clampRange(e.x,n.x,r.x),y:d.clampRange(e.y,n.y,r.y)},S=!d.sameRange(x.x,n.x)||!d.sameRange(x.y,n.y),t&&F(`zoom`,i.viewToValues(b,x)),I()},X=(e,t,n)=>{let i=W();if(!i||!b.zoom.x&&!b.zoom.y)return;let a=f(x),o=r.toData(i,e,t);b.zoom.x&&(a.x=d.zoomRange(x.x,o.x,n)),b.zoom.y&&(a.y=d.zoomRange(x.y,o.y,n)),Y(a,!0)},Z=()=>{S&&Y(f(b.base),!0)},Q=(e,t)=>U()?.legend?.entries.find(n=>e>=n.box.x&&e<=n.box.x+n.box.width&&t>=n.box.y&&t<=n.box.y+n.box.height)??null,$=e=>{v.has(e)?v.delete(e):v.add(e),z()},ee=()=>{let[e,t]=[...M.values()];N={kind:`pinch`,view:f(x),distance:Math.max(1,Math.hypot(e.x-t.x,e.y-t.y)),midX:(e.x+t.x)/2,midY:(e.y+t.y)/2},G(null)};return b=i.buildModel(n,l,v,_),z(),{setOptions(e){if(A)return;let t=(e.palette??[]).join()!==(n.palette??[]).join();n=e,t&&(l=u.createTheme(c,n.palette)),z()},setTheme(e){A||(c=e,l=u.createTheme(c,n.palette),z())},setSize(e,t){(e!==C||t!==w)&&(C=Math.max(0,e),w=Math.max(0,t),I())},getScene:U,pointerDown:(e,t,n={})=>{if(A)return;let r=n.id??0,i=!!n.touch;M.set(r,{x:e,y:t,startX:e,startY:t,touch:i,moved:!1});let a=L();if(M.size===2){a&&(b.zoom.x||b.zoom.y)&&N?.kind!==`point`&&ee();return}if(M.size>2||!a){if(!a&&i){let n=K(e,t,!0);G(n?{event:n,x:e,y:t}:null)}return}if(a.dragPoints){let n=K(e,t,i)?.items.find(e=>b.series[e.seriesIndex].type===`scatter`);if(n){N={kind:`point`,item:n,x:e,y:t};return}}if(S&&a.pan&&q(e,t)){N={kind:`pan`,view:f(x),x:e,y:t};return}if(N=null,i){let n=K(e,t,!0);G(n?{event:n,x:e,y:t}:null)}},pointerMove:(e,t,n={})=>{if(A)return;let i=n.id??0,a=M.get(i);if(a&&(a.x=e,a.y=t,!a.moved&&Math.hypot(e-a.startX,t-a.startY)>(a.touch?m:p)&&(a.moved=!0)),N?.kind===`pinch`&&M.size>=2){let[e,t]=[...M.values()],n=Math.max(1,Math.hypot(e.x-t.x,e.y-t.y)),i=(e.x+t.x)/2,a=(e.y+t.y)/2,o=W();if(!o)return;let s=r.createScales(o.plot,N.view,b.x.reverse,b.y.reverse,b.horizontal),c=N.distance/n,l=f(N.view),u=r.toData(s,N.midX,N.midY),p=r.toData(s,i,a);b.zoom.x&&(l.x=d.zoomRange(N.view.x,u.x,c),l.x=d.panRange(l.x,(u.x-p.x)*c)),b.zoom.y&&(l.y=d.zoomRange(N.view.y,u.y,c),l.y=d.panRange(l.y,(u.y-p.y)*c)),Y(l,!0);return}if(N?.kind===`point`&&a){if(!a.moved)return;N.x=e,N.y=t;let n=J(e,t);I(),n&&F(`drag`,{item:N.item,x:n.x,y:n.y});return}if(N?.kind===`pan`&&a){if(!a.moved)return;let n=W();if(!n)return;let i=f(N.view),o=r.toData(n,N.x,N.y),s=r.toData(n,e,t);b.zoom.x&&(i.x=d.panRange(N.view.x,o.x-s.x)),b.zoom.y&&(i.y=d.panRange(N.view.y,o.y-s.y)),Y(i,!0);return}if(!(M.size>1)&&(!a||a.touch||!n.touch)){let r=K(e,t,!!a?.touch||!!n.touch);(r||!a?.touch)&&G(r?{event:r,x:e,y:t}:null)}},pointerUp:(e,t,n={})=>{if(A)return;let r=n.id??0,i=M.get(r);M.delete(r);let a=N;if(a?.kind===`pinch`){M.size<2&&(N=null);return}if(N=null,!i)return;if(a?.kind===`point`){if(i.moved){let n=J(e,t);I(),n&&F(`drop`,{item:a.item,x:n.x,y:n.y});return}}else if(a?.kind===`pan`&&i.moved){I();return}if(i.moved){i.touch&&I();return}let o=Date.now();if(i.touch&&o-P.time<h&&Math.hypot(e-P.x,t-P.y)<24&&S){P={time:0,x:e,y:t},Z();return}P={time:o,x:e,y:t};let s=Q(e,t);if(s){U()?.legend?.toggle&&$(s.id);return}let c=K(e,t,i.touch);if(c){i.touch&&G({event:c,x:e,y:t}),F(`click`,c);return}if(i.touch&&G(null),q(e,t)){let n=J(e,t);n&&F(`plotClick`,n)}},pointerCancel:(e={})=>{M.delete(e.id??0),(N?.kind===`point`||M.size<2)&&(N=null),I()},pointerLeave(){!N&&j&&G(null)},zoomAt:X,resetZoom:Z,getView:()=>i.viewToValues(b,x),setView(e){A||Y(i.viewFromValues(b,e,x),!1)},toggleSeries:$,clearHover(){j&&G(null)},getPlotRect(){let e=U()?.layout.plot;return e?{...e}:null},toPixel(e,t){let n=W();return n?r.toScreen(n,i.toPlotX(b,e),i.toPlotY(b,t)):null},fromPixel(e,t){let n=W();if(!n)return null;let a=r.toData(n,e,t);return{x:i.fromPlotX(b,a.x),y:i.fromPlotY(b,a.y)}},on(e,t){let n=y[e];return n||(n=new Set,y[e]=n),n.add(t),()=>{n.delete(t)}},destroy(){A=!0,M.clear();for(let e of Object.keys(y))delete y[e]}}},v=(t,n,r,i)=>{if(!r)return[0,n];let[a,o]=i[0]<=i[1]?i:[i[1],i[0]];return[Math.max(0,e.lowerBound(t,n,a)-1),Math.min(n,e.lowerBound(t,n,o)+1)]},y={heatmap:0,area:1,bar:2,boxplot:2,candlestick:3,line:4,scatter:5},b=(e,t)=>{if(!e.horizontal)return t;let n=Array(t.length);for(let e=0;e<t.length;e+=4)n[e]=t[e+1],n[e+1]=t[e],n[e+2]=t[e+3],n[e+3]=t[e+2];return n},x=(e,t={})=>{let{model:a,view:s,layout:u}=e,d=u.scales,{plot:f}=u,p=d.horizontal,m=t.maxDots??4e3,h=t.maxBars??2e3,g=Math.max(1,t.columnWidth??1),_=p?f.y:f.x,x=_+(p?f.height:f.width),C=[],w=a.series.filter(e=>!e.hidden&&e.cols.count>0).sort((e,t)=>y[e.type]-y[t.type]||e.index-t.index);for(let e of w){let{x:u,y,count:w,sorted:T}=e.cols;if(e.type===`line`||e.type===`area`){let[t,n]=v(u,w,T,s.x),i=e.stackTop??y,o=c.curvePoints(u,i,t,n,e.curve),f=e.stackBase?c.curvePoints(u,e.stackBase,t,n,e.curve).points:null,m=o.length,h=o.points,b=f;if(T&&m>(x-_)*2/g){if(f){let e=l.decimateMinMax(h,0,m,e=>d.xToPx(e)/g),t=new Float64Array(e.length*2),n=new Float64Array(e.length*2),r=0,i=0;for(let a=0;a<e.length;a++){let o=e.points[a*2];for(;i<m-1&&h[i*2]<o;)i++;t[r*2]=o,t[r*2+1]=e.points[a*2+1],n[r*2]=o,n[r*2+1]=f[i*2+1],r++}h=t,b=n,m=r}else{let e=l.decimateMinMax(h,0,m,e=>d.xToPx(e)/g);h=e.points,m=e.length}}let S=e.type===`area`&&!!e.cols.y0&&!!b,E=[],D=[],O=[],k=[],A=[],j=[],M=()=>{k.length&&(E.push(k),D.push(A),S&&O.push(j)),k=[],A=[],j=[]};for(let e=0;e<m;e++){let t=h[e*2],n=h[e*2+1],i=b?b[e*2+1]:0;if(!Number.isFinite(t)||!Number.isFinite(n)||!Number.isFinite(i)){M();continue}let a=r.toScreen(d,t,n);if(k.push(a.x,a.y),b&&A.push(d.yToPx(i)),S){let e=r.toScreen(d,t,i);j.push(e.x,e.y)}}if(M(),e.type===`area`&&C.push({kind:`area`,seriesIndex:e.index,color:e.colorCss,opacity:e.opacity,baseline:d.yToPx(a.baseline),segments:E,...b?{bottoms:D}:{},...p?{horizontal:!0}:{}}),e.lineWidth>0){let t=e.type===`area`?Math.min(e.lineWidth,2):e.lineWidth;C.push({kind:`line`,seriesIndex:e.index,color:e.colorCss,width:t,segments:E}),S&&C.push({kind:`line`,seriesIndex:e.index,color:e.colorCss,width:t,segments:O})}continue}if(e.type===`bar`&&e.barBase&&e.barTop){let[t,r]=v(u,w,T,s.x),a=Math.max(e.barHalfWidth/Math.abs(d.xPerPx),.5),o=[],c=[],l=r-t>h,f=NaN;for(let s=t;s<r;s++){let t=e.barBase[s],r=e.barTop[s];if(!Number.isFinite(t)||!Number.isFinite(r))continue;let p=d.xToPx(u[s]+e.barOffset);if(p+a<_||p-a>x)continue;let m=d.yToPx(t),h=d.yToPx(r),g=Math.min(m,h),v=Math.max(1,Math.abs(m-h)),y=Math.floor(p);if(l&&y===f&&o.length){let e=o.length-4,t=Math.max(o[e+1]+o[e+3],g+v);o[e+1]=Math.min(o[e+1],g),o[e+3]=t-o[e+1];continue}f=y,o.push(p-a,g,a*2,v);let b=e.pointColors?.[s];c.push(e.cols.opacities?n.toCss(b??e.color,i.barOpacity(e,s)):b?n.toCss(b):e.colorCss)}C.push({kind:`bars`,seriesIndex:e.index,color:e.colorCss,rects:b(d,o),...e.pointColors||e.cols.opacities?{colors:c}:{},radius:e.radius,...e.opacity<1&&!e.cols.opacities?{opacity:e.opacity}:{}});continue}if(e.type===`boxplot`){C.push(...S(e,d,s.x,_,x,h));continue}if(e.type===`candlestick`){let[t,r]=v(u,w,T,s.x),{open:i,high:a,low:o}=e.cols,c=Math.max(e.barHalfWidth/Math.abs(d.xPerPx),1),l=n.toCss(e.upColor),f=n.toCss(e.downColor),p=[],m=[],g=[],S=[],E=Math.max(1,Math.ceil((r-t)/h));for(let e=t;e<r;e+=E){let t=y[e],n=i?i[e]:t;if(!Number.isFinite(t)||!Number.isFinite(n))continue;let r=d.xToPx(u[e]);if(r+c<_||r-c>x)continue;let s=t<n?f:l,h=d.yToPx(a?a[e]:Math.max(n,t)),v=d.yToPx(o?o[e]:Math.min(n,t));p.push(r-.5,Math.min(h,v),1,Math.abs(v-h)),g.push(s);let b=d.yToPx(n),C=d.yToPx(t);m.push(r-c,Math.min(b,C),c*2,Math.max(1,Math.abs(b-C))),S.push(s)}C.push({kind:`bars`,seriesIndex:e.index,color:l,rects:b(d,p),colors:g},{kind:`bars`,seriesIndex:e.index,color:l,rects:b(d,m),colors:S,radius:1});continue}if(e.type===`heatmap`){let t=Math.abs(e.cellHalf.x/d.xPerPx),i=Math.abs(e.cellHalf.y/d.yPerPx),a=[],o=[],s=r.heatCellStyle(t*2,i*2,e.radius),c=s.inset;for(let s=0;s<w&&a.length/4<h*4;s++){let l=e.cellColors?.[s];if(!l)continue;let p=r.screenRect(d,d.xToPx(u[s])-t,d.xToPx(u[s])+t,d.yToPx(y[s])-i,d.yToPx(y[s])+i);p.x+p.width<f.x||p.x>f.x+f.width||p.y+p.height<f.y||p.y>f.y+f.height||(a.push(p.x+c,p.y+c,p.width-c*2,p.height-c*2),o.push(n.toCss(n.unpackColor(l))))}C.push({kind:`bars`,seriesIndex:e.index,color:e.colorCss,rects:a,colors:o,radius:s.radius});continue}let E=[],D=[],O=t=>{let r=e.pointColors?.[t];return r?n.toCss(r):e.colorCss},k=[],A=[];for(let e=0;e<w;e++){let t=u[e],n=y[e];if(!Number.isFinite(t)||!Number.isFinite(n))continue;let i=r.toScreen(d,t,n);i.x<f.x||i.x>f.x+f.width||i.y<f.y||i.y>f.y+f.height||(k.push(e),A.push(i.x,i.y))}if(k.length>m){let n=Math.max(2,t.dotCell??e.pointSize*.8),r=Math.ceil(f.width/n)+1,i=new Map;k.forEach((e,t)=>{let a=Math.floor((A[t*2]-f.x)/n),o=Math.floor((A[t*2+1]-f.y)/n);i.set(o*r+a,e)});for(let[e,t]of i)E.push(f.x+(e%r+.5)*n,f.y+(Math.floor(e/r)+.5)*n,n),D.push(O(t))}else k.forEach((t,n)=>{E.push(A[n*2],A[n*2+1],o.dotSize(e,t)),D.push(O(t))});C.push({kind:`dots`,seriesIndex:e.index,opacity:e.opacity,dots:E,colors:D,...e.stroke===null?{}:{stroke:e.stroke}})}return C},S=(e,t,r,i,a,o)=>{let{x:s,y:c,count:l,sorted:u,high:d,low:f,q1:p,q3:m,outliers:h}=e.cols,[g,_]=v(s,l,u,r),y=Math.max(e.barHalfWidth/Math.abs(t.xPerPx),1),x=Math.max(1,e.lineWidth),S=[],C=[],w=[],T=[],E=[],D=[],O=Math.max(1,Math.ceil((_-g)/o)),k=(e,t,n)=>{C.push(e-x/2,Math.min(t,n),x,Math.abs(t-n))},A=(e,t,n,r=x)=>{C.push(e-t,n-r/2,t*2,r)};for(let r=g;r<_;r+=O){let o=c[r];if(!Number.isFinite(o))continue;let l=t.xToPx(s[r]+e.barOffset);if(l+y<i||l-y>a)continue;let u=e.pointColors?.[r],g=u?n.toCss(u):e.colorCss,_=t.yToPx(f&&Number.isFinite(f[r])?f[r]:o),v=t.yToPx(d&&Number.isFinite(d[r])?d[r]:o),b=t.yToPx(p&&Number.isFinite(p[r])?p[r]:o),O=t.yToPx(m&&Number.isFinite(m[r])?m[r]:o),j=C.length;S.push(l-y,Math.min(b,O),y*2,Math.abs(b-O)),w.push(g),k(l,_,b),k(l,O,v),k(l-y,b,O),k(l+y,b,O),A(l,y/2,_),A(l,y/2,v),A(l,y,b),A(l,y,O),A(l,y,t.yToPx(o),Math.max(2,x*1.6));for(let e=j;e<C.length;e+=4)T.push(g);let M=h?.[r];if(M)for(let n of M){let r=t.horizontal?{x:t.yToPx(n),y:l}:{x:l,y:t.yToPx(n)};E.push(r.x,r.y,e.outlierSize),D.push(g)}}let j=[{kind:`bars`,seriesIndex:e.index,color:e.colorCss,rects:b(t,S),colors:w,opacity:e.opacity},{kind:`bars`,seriesIndex:e.index,color:e.colorCss,rects:b(t,C),colors:T}];return E.length&&j.push({kind:`dots`,seriesIndex:e.index,opacity:e.outlierShape===`hollow`?0:.85,dots:E,colors:D,stroke:1.25}),j};exports.createChartController=_,exports.scenePrimitives=x;
3
3
  //# sourceMappingURL=controller.cjs.map