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":["wheelFactor","pixels","deltaMode","deltaY","pinch","DEFAULT_LIGHTING","ROTATE_SPEED","DRAG_DEGREES","KEY_DEGREES","TWEEN_MS","initialCamera","clampCamera","camera","DEFAULT_CAMERA","copyCamera","c","sameCamera","a","b","lerpCamera","da","t","stageLayout","side","width","top","height","bottom","barSpace","colorBar","fit","h","createChart3D","doc","container","win","dom","createChart3DDom","stage","options","initialOptions","theme","readTheme","themeVersion","destroyed","listeners","emit","type","fn","event","toggled","model","buildModel","colors","lut","lutKey","lutId","buildGeometry","createGeometryBuilder","geometry","geometryDirty","picker","createPicker","sortTransparent","createDepthSorter","renderer","rendererToken","resolveReady","ready","resolve","homeCamera","cameraKey","tween","frameId","dataDirty","lastFrame","lastLayout","overlay","overlayStyle","isDark","hoverHit","hoverEvt","pendingHover","lastPointer","pointerInside","visible","lastRotate","reducedMotion","interaction","o","rotateSpeed","showsColorBar","effectiveOptions","id","s","i","resolveColor","value","parseColor","refreshColors","key","colorLut","colorStops","f","palette","m","rebuild","renderLegend","updateAccessibility","invalidate","scheduleHover","legendKey","named","show","config","toggle","toCss","focused","item","fill","labels","style","swatch","names","lines","count","name","size","axis","range","data","frame","rotating","drag","lightDirection","v","normalize","dpr","time","eased","dt","sizeCanvas","layout","fov","half","cameraFrame","bg","drawWalls","CPU_BUDGET","GPU_BUDGET","w","l","frame3d","drawForeground","fg","drawAxes","colorBarFormat","shape","highlightShape","drawHighlight","d","locale","step","tickStep","tooltipEnabled","stageOffset","setHover","hit","hoverEvent","changed","renderTooltip","tip","custom","content","defaultTooltip","tw","th","x","y","fragment","header","valueName","row","tooltipRows","el","n","pickAt","hoverFrame","p","pointers","local","r","fitHeight","setCameraInternal","clamped","next","notify","animateTo","target","pinchInfo","pts","startDrag","mode","onPointerDown","ia","pan","onPointerMove","scale","distance","center","dx","dy","onPointerUp","wasDrag","rest","onPointerCancel","onPointerEnter","onPointerLeave","onWheel","factor","zoom","ratio","cx","cy","nx","ny","onDoubleClick","onContextMenu","onFocus","keyboard","onBlur","onKeyDown","resizeObserver","intersection","entry","entries","was","onVisibility","dprQuery","onDprChange","watchDpr","onMotionChange","refreshTheme","themeColorsChanged","unwatchTheme","watchTheme","langObserver","resolveLocale","initRenderer","token","createRenderer3D","canvas","layerCanvas","kind","exclude","unfollowDefault","followDefaultRenderer","previous","set","listener","luminance"],"sources":["../../../../../charts/src/engine/three-d/chart.ts"],"sourcesContent":["// createChart3D: 3D scatter / surface / bar / line charts. The data layer\n// is drawn by a GPU backend (WebGPU -> WebGL2 -> WebGL) or by Canvas2D (CPU\n// projection, painter's algorithm); walls, labels, color bar and hover\n// highlight are 2D canvases around it. Frames are drawn on demand: the only\n// animation loop is the optional auto rotation (paused off-screen, while\n// hovered and with prefers-reduced-motion).\n\nimport { luminance, parseColor, toCss, type Rgba } from \"../color\";\nimport { resolveLocale } from \"../locale\";\nimport { followDefaultRenderer } from \"../renderers/follow\";\nimport { tickStep } from \"../scale\";\nimport {\n readTheme,\n themeColorsChanged,\n watchTheme,\n type ChartTheme,\n} from \"../theme\";\nimport type { ChartRendererKind } from \"../types\";\nimport { colorLut, colorStops, type ColorLut } from \"./colormap\";\nimport { createRenderer3D } from \"./detect\";\nimport {\n createChart3DDom,\n layerCanvas,\n sizeCanvas,\n style,\n swatch,\n} from \"./dom\";\nimport {\n CPU_BUDGET,\n GPU_BUDGET,\n createGeometryBuilder,\n type Geometry,\n type GeometryColors,\n} from \"./geometry\";\nimport { highlightShape, hoverEvent, tooltipRows } from \"./hover\";\nimport { fill } from \"./labels\";\nimport {\n DEFAULT_CAMERA,\n cameraFrame,\n clampCamera,\n normalize,\n type CameraFrame,\n type FitRect,\n type Vec3,\n} from \"./math\";\nimport { buildModel, type Model3D } from \"./model\";\nimport {\n drawAxes,\n drawColorBar,\n drawHighlight,\n drawWalls,\n overlayStyle,\n type HighlightShape,\n type OverlayStyle,\n} from \"./overlay\";\nimport { createPicker, type PickHit } from \"./pick\";\nimport type { Frame3D, Renderer3D } from \"./render-types\";\nimport { createDepthSorter } from \"./sort\";\nimport type {\n Chart3DCameraOptions,\n Chart3DCameraState,\n Chart3DEventMap,\n Chart3DHoverEvent,\n Chart3DInstance,\n Chart3DInteractionOptions,\n Chart3DOptions,\n} from \"./types\";\n\n/** Zoom factor of a wheel event (same feel as the 2D charts) */\nconst wheelFactor = (deltaY: number, deltaMode: number, pinch: boolean) => {\n const pixels =\n deltaMode === 1 ? deltaY * 16 : deltaMode === 2 ? deltaY * 400 : deltaY;\n const speed = pinch ? 0.01 : 0.0025;\n return Math.exp(Math.max(-1, Math.min(1, pixels * speed)));\n};\n\nconst DEFAULT_LIGHTING = {\n ambient: 0.5,\n diffuse: 0.6,\n specular: 0.25,\n shininess: 32,\n};\n\nconst ROTATE_SPEED = 12;\nconst DRAG_DEGREES = 0.45;\nconst KEY_DEGREES = 5;\nconst TWEEN_MS = 380;\n\n/** Camera of the options (also the one restored by a reset) */\nexport const initialCamera = (\n camera: Chart3DCameraOptions | undefined,\n): Chart3DCameraState =>\n clampCamera({\n azimuth: camera?.azimuth ?? DEFAULT_CAMERA.azimuth,\n elevation: camera?.elevation ?? DEFAULT_CAMERA.elevation,\n zoom: camera?.zoom ?? DEFAULT_CAMERA.zoom,\n pan: [0, 0],\n projection: camera?.projection ?? DEFAULT_CAMERA.projection,\n });\n\nconst copyCamera = (c: Chart3DCameraState): Chart3DCameraState => ({\n ...c,\n pan: [c.pan[0], c.pan[1]],\n});\n\nconst sameCamera = (a: Chart3DCameraState, b: Chart3DCameraState) =>\n a.azimuth === b.azimuth &&\n a.elevation === b.elevation &&\n a.zoom === b.zoom &&\n a.pan[0] === b.pan[0] &&\n a.pan[1] === b.pan[1] &&\n a.projection === b.projection;\n\n/** Interpolated camera (shortest way around for the azimuth) */\nconst lerpCamera = (\n a: Chart3DCameraState,\n b: Chart3DCameraState,\n t: number,\n): Chart3DCameraState => {\n let da = (b.azimuth - a.azimuth) % 360;\n if (da > 180) da -= 360;\n if (da < -180) da += 360;\n return clampCamera({\n azimuth: a.azimuth + da * t,\n elevation: a.elevation + (b.elevation - a.elevation) * t,\n zoom: a.zoom * Math.pow(b.zoom / a.zoom, t),\n pan: [\n a.pan[0] + (b.pan[0] - a.pan[0]) * t,\n a.pan[1] + (b.pan[1] - a.pan[1]) * t,\n ],\n projection: t < 0.5 ? a.projection : b.projection,\n });\n};\n\n/** Layout of the stage: area the box is fitted into and the color bar */\nexport const stageLayout = (\n width: number,\n height: number,\n colorBar: boolean,\n): {\n fit: FitRect;\n bar: { x: number; y: number; w: number; h: number } | null;\n} => {\n const side = Math.max(30, Math.min(72, width * 0.08));\n const top = Math.max(14, Math.min(28, height * 0.05));\n const bottom = Math.max(30, Math.min(56, height * 0.1));\n const barSpace = colorBar ? 74 : 0;\n const fit: FitRect = {\n x: side,\n y: top,\n width: Math.max(10, width - side * 2 - barSpace),\n height: Math.max(10, height - top - bottom),\n };\n if (!colorBar) return { fit, bar: null };\n const h = Math.max(40, Math.min(260, height * 0.62));\n return {\n fit,\n bar: { x: width - 66, y: (height - h) / 2 + 8, w: 12, h },\n };\n};\n\nexport const createChart3D = (\n container: HTMLElement,\n initialOptions: Chart3DOptions,\n): Chart3DInstance => {\n const doc = container.ownerDocument;\n const win = doc.defaultView;\n const dom = createChart3DDom(container);\n const stage = dom.stage;\n let options = initialOptions;\n let theme: ChartTheme = readTheme(dom.root, options.palette);\n let themeVersion = 0;\n let destroyed = false;\n\n const listeners = new Map<keyof Chart3DEventMap, Set<(e: never) => void>>();\n const emit = <K extends keyof Chart3DEventMap>(\n type: K,\n event: Chart3DEventMap[K],\n ) => {\n listeners\n .get(type)\n ?.forEach((fn) => (fn as (e: Chart3DEventMap[K]) => void)(event));\n };\n\n // ------------------------------------------------------------- state\n\n /** Series whose visibility the legend flipped (ids) */\n const toggled = new Set<string>();\n let model: Model3D = buildModel(options);\n let colors: GeometryColors;\n let lut: ColorLut;\n let lutKey = \"\";\n let lutId = 0;\n const buildGeometry = createGeometryBuilder();\n let geometry: Geometry = { items: [], targets: [], counts: [] };\n let geometryDirty = true;\n const picker = createPicker();\n const sortTransparent = createDepthSorter();\n\n let renderer: Renderer3D | null = null;\n let rendererToken = 0;\n let resolveReady: (kind: ChartRendererKind | null) => void = () => {};\n const ready = new Promise<ChartRendererKind | null>((resolve) => {\n resolveReady = resolve;\n });\n\n let homeCamera = initialCamera(options.camera);\n let cameraKey = JSON.stringify(options.camera ?? {});\n let camera = copyCamera(homeCamera);\n let tween: {\n from: Chart3DCameraState;\n to: Chart3DCameraState;\n start: number;\n } | null = null;\n\n let frameId = 0;\n let dataDirty = true;\n let lastFrame: CameraFrame | null = null;\n let lastLayout: ReturnType<typeof stageLayout> | null = null;\n let overlay: OverlayStyle = overlayStyle(theme, isDark(theme));\n\n let hoverHit: PickHit | null = null;\n let hoverEvt: Chart3DHoverEvent | null = null;\n let pendingHover: { x: number; y: number } | null = null;\n let lastPointer: { x: number; y: number } | null = null;\n let pointerInside = false;\n let visible = true;\n let lastRotate = 0;\n\n const reducedMotion =\n typeof win?.matchMedia === \"function\"\n ? win.matchMedia(\"(prefers-reduced-motion: reduce)\")\n : null;\n\n // ------------------------------------------------------------ options\n\n const interaction = (): Required<Chart3DInteractionOptions> | null => {\n const o = options.interaction;\n if (o === false) return null;\n const c = typeof o === \"object\" ? o : {};\n return {\n rotate: c.rotate ?? true,\n zoom: c.zoom ?? true,\n wheel: c.wheel ?? \"modifier\",\n pan: c.pan ?? true,\n keyboard: c.keyboard ?? true,\n };\n };\n\n const rotateSpeed = () => {\n const a = options.autoRotate;\n if (a === true) return ROTATE_SPEED;\n return typeof a === \"number\" && Number.isFinite(a) ? a : 0;\n };\n\n const showsColorBar = () => {\n const o = options.colorBar;\n if (o === false) return false;\n return !!model.colorDomain;\n };\n\n const effectiveOptions = (): Chart3DOptions => ({\n ...options,\n series: options.series.map((s, i) => {\n const id = s.id ?? String(i);\n return toggled.has(id) ? { ...s, hidden: !s.hidden } : s;\n }),\n });\n\n const resolveColor = (value: string): Rgba =>\n theme.resolve\n ? theme.resolve(value, [0.5, 0.5, 0.5, 1])\n : (parseColor(value) ?? [0.5, 0.5, 0.5, 1]);\n\n const refreshColors = () => {\n const key = `${JSON.stringify(options.colorScale ?? \"viridis\")}|${themeVersion}`;\n if (key !== lutKey || !lut) {\n lutKey = key;\n lut = colorLut(\n colorStops(options.colorScale, (c, f) =>\n theme.resolve ? theme.resolve(c, f) : (parseColor(c) ?? f),\n ),\n );\n lutId++;\n }\n const palette = theme.palette.length ? theme.palette : [theme.primary];\n colors = {\n series: model.series.map((m, i) =>\n m.color\n ? resolveColor(m.color)\n : (palette[i % palette.length] ?? theme.primary),\n ),\n resolve: resolveColor,\n lut,\n wire: [theme.text[0], theme.text[1], theme.text[2], 0.38],\n };\n };\n\n const rebuild = () => {\n model = buildModel(effectiveOptions());\n refreshColors();\n geometryDirty = true;\n overlay = overlayStyle(theme, isDark(theme));\n renderLegend();\n updateAccessibility();\n invalidate(true);\n // the hovered item may have moved (live data): pick it again after the frame\n if (hoverHit && lastPointer) scheduleHover(lastPointer.x, lastPointer.y);\n };\n\n // ------------------------------------------------------------- legend\n\n let legendKey = \"\";\n const renderLegend = () => {\n const o = options.legend;\n const named = model.series.filter((s) => s.name).length;\n const show = o === undefined ? named > 1 : !!o;\n const config = typeof o === \"object\" ? o : {};\n const toggle = config.toggle ?? true;\n const bottom = config.position === \"bottom\";\n let key = `${show}|${bottom}|${toggle}`;\n if (show) {\n model.series.forEach((s, i) => {\n key += `\\n${s.id}\\u0001${s.name}\\u0001${toCss(colors.series[i] ?? theme.primary)}\\u0001${s.hidden}`;\n });\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 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 model.series.forEach((s, i) => {\n if (!s.name) return;\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 (toggled.has(s.id)) toggled.delete(s.id);\n else toggled.add(s.id);\n const { labels } = model.locale;\n dom.live.textContent = fill(s.hidden ? labels.shown : labels.hidden, {\n name: s.name,\n });\n rebuild();\n });\n }\n style(item, {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"6px\",\n padding: \"2px 4px\",\n margin: \"0\",\n border: \"0\",\n borderRadius: \"4px\",\n background: \"none\",\n font: \"inherit\",\n color: \"var(--text-secondary-color, #6b7280)\",\n cursor: toggle ? \"pointer\" : \"default\",\n opacity: s.hidden ? \"0.45\" : \"1\",\n textDecoration: s.hidden ? \"line-through\" : \"none\",\n });\n item.append(\n swatch(\n doc,\n toCss(colors.series[i] ?? theme.primary),\n s.type !== \"bar\" && s.type !== \"surface\",\n ),\n doc.createTextNode(s.name),\n );\n dom.legend.appendChild(item);\n });\n if (focused >= 0)\n (dom.legend.children[focused] as HTMLElement | undefined)?.focus();\n };\n\n // ------------------------------------------------------ accessibility\n\n const updateAccessibility = () => {\n const { labels, count } = model.locale;\n const names = model.series\n .map((s) => s.name)\n .filter(Boolean)\n .join(labels.listSeparator);\n stage.setAttribute(\"aria-roledescription\", labels.chart);\n stage.setAttribute(\n \"aria-label\",\n options.ariaLabel ??\n (names ? fill(labels.chartNamed, { names }) : labels.chart),\n );\n const keyboard = interaction()?.keyboard;\n if (keyboard) stage.tabIndex = 0;\n else stage.removeAttribute(\"tabindex\");\n stage.style.cursor = interaction()?.rotate ? \"grab\" : \"default\";\n const lines: string[] = [];\n lines.push(fill(labels.seriesCount, { count: count(model.series.length) }));\n for (const m of model.series) {\n const name = m.name || fill(labels.series, { n: m.index + 1 });\n const size =\n m.type === \"surface\"\n ? fill(labels.grid, {\n rows: count(m.grid.rows),\n cols: count(m.grid.cols),\n })\n : m.type === \"bar\"\n ? fill(labels.bars, { count: count(m.bars.count) })\n : fill(m.type === \"line\" ? labels.vertices : labels.points, {\n count: count(m.cols.count),\n });\n lines.push(\n fill(m.hidden ? labels.seriesSummaryHidden : labels.seriesSummary, {\n name,\n type: labels[m.type],\n size,\n }),\n );\n }\n for (const key of [\"x\", \"y\", \"z\"] as const) {\n const axis = model[key];\n const range = axis.categories\n ? axis.categories.join(labels.listSeparator)\n : fill(labels.range, {\n min: axis.format(axis.domain[0]),\n max: axis.format(axis.domain[1]),\n });\n lines.push(\n fill(axis.title ? labels.axisTitled : labels.axis, {\n axis: key.toUpperCase(),\n title: axis.title,\n range,\n }),\n );\n }\n dom.summary.textContent = lines.join(\" \");\n };\n\n // -------------------------------------------------------------- frame\n\n function invalidate(data = true) {\n if (data) dataDirty = true;\n if (destroyed || frameId || !win) return;\n frameId = win.requestAnimationFrame(frame);\n }\n\n const rotating = () =>\n rotateSpeed() !== 0 &&\n visible &&\n !pointerInside &&\n !drag &&\n !tween &&\n !reducedMotion?.matches &&\n !(doc.visibilityState === \"hidden\");\n\n const lightDirection = (f: CameraFrame): Vec3 => {\n // a headlight from the upper left, slightly raised towards the sky\n const v: Vec3 = [0, 0, 0];\n for (let i = 0; i < 3; i++) {\n v[i] = -f.right[i]! * 0.35 + f.up[i]! * 0.55 - f.forward[i]! * 0.7;\n }\n v[2] += 0.35;\n return normalize(v);\n };\n\n function frame(time: number) {\n frameId = 0;\n if (destroyed) return;\n const width = stage.clientWidth;\n const height = stage.clientHeight;\n if (width <= 0 || height <= 0) return;\n const dpr = win?.devicePixelRatio || 1;\n // camera animations\n if (tween) {\n const t = Math.min(1, (time - tween.start) / TWEEN_MS);\n const eased = 1 - Math.pow(1 - t, 3);\n camera = lerpCamera(tween.from, tween.to, eased);\n if (t >= 1) {\n camera = copyCamera(tween.to);\n tween = null;\n emit(\"camera\", copyCamera(camera));\n }\n dataDirty = true;\n } else if (rotating()) {\n const dt = lastRotate ? Math.min(0.1, (time - lastRotate) / 1000) : 0;\n if (dt > 0) {\n camera = clampCamera({\n ...camera,\n azimuth: camera.azimuth - rotateSpeed() * dt,\n });\n dataDirty = true;\n }\n lastRotate = time;\n } else {\n lastRotate = 0;\n }\n\n sizeCanvas(dom.background, width, height, dpr);\n sizeCanvas(dom.foreground, width, height, dpr);\n const layout = stageLayout(width, height, showsColorBar());\n const fov = options.camera?.fov ?? 32;\n const half: Vec3 = [model.x.half, model.y.half, model.z.half];\n const f = cameraFrame(camera, half, width, height, layout.fit, fov);\n lastFrame = f;\n lastLayout = layout;\n\n if (dataDirty) {\n dataDirty = false;\n const bg = dom.background.getContext(\"2d\");\n if (bg) {\n bg.setTransform(dpr, 0, 0, dpr, 0, 0);\n bg.clearRect(0, 0, width, height);\n if (options.box !== false) drawWalls(bg, f, model, overlay);\n }\n if (renderer) {\n if (geometryDirty) {\n geometry = buildGeometry(\n model,\n colors,\n renderer.kind === \"canvas2d\" ? CPU_BUDGET : GPU_BUDGET,\n lutId,\n );\n geometryDirty = false;\n picker.reset();\n }\n const w = Math.max(1, Math.round(width * dpr));\n const h = Math.max(1, Math.round(height * dpr));\n if (renderer.canvas.width !== w || renderer.canvas.height !== h)\n renderer.resize(w, h);\n renderer.canvas.style.width = `${width}px`;\n renderer.canvas.style.height = `${height}px`;\n const l = options.lighting ?? {};\n const frame3d: Frame3D = {\n viewProj: f.viewProj,\n eye: f.eye,\n light: lightDirection(f),\n orthographic: f.orthographic,\n distance: f.distance,\n radius: f.radius,\n width: w,\n height: h,\n dpr,\n lighting: [\n l.ambient ?? DEFAULT_LIGHTING.ambient,\n l.diffuse ?? DEFAULT_LIGHTING.diffuse,\n l.specular ?? DEFAULT_LIGHTING.specular,\n l.shininess ?? DEFAULT_LIGHTING.shininess,\n ],\n fog: theme.background,\n exposure: Math.max(0, options.exposure ?? 1),\n };\n renderer.render(\n renderer.kind === \"canvas2d\" || renderer.orderIndependent\n ? geometry.items\n : sortTransparent(geometry.items, frame3d),\n frame3d,\n );\n }\n }\n drawForeground(f, layout, width, height, dpr);\n if (tween || rotating()) invalidate(true);\n }\n\n const drawForeground = (\n f: CameraFrame,\n layout: ReturnType<typeof stageLayout>,\n width: number,\n height: number,\n dpr: number,\n ) => {\n const fg = dom.foreground.getContext(\"2d\");\n if (!fg) return;\n fg.setTransform(dpr, 0, 0, dpr, 0, 0);\n fg.clearRect(0, 0, width, height);\n if (options.box !== false) {\n drawAxes(fg, f, model, overlay, {\n left: 4,\n top: 4,\n right: layout.bar ? layout.bar.x - 10 : width - 4,\n bottom: height - 4,\n });\n }\n if (layout.bar && model.colorDomain) {\n const o = typeof options.colorBar === \"object\" ? options.colorBar : {};\n drawColorBar(\n fg,\n layout.bar,\n lut,\n model.colorDomain,\n o.format ?? colorBarFormat(),\n o.title ?? (model.colorFromZ ? model.z.title : \"\"),\n overlay,\n width,\n );\n }\n if (hoverHit && hoverEvt) {\n const shape: HighlightShape | null = highlightShape(\n geometry.targets,\n hoverHit,\n hoverEvt.color,\n );\n if (shape) drawHighlight(fg, f, model, shape, overlay);\n }\n };\n\n const colorBarFormat = () => {\n const d = model.colorDomain;\n const { locale } = model;\n if (!d) return locale.value;\n if (model.colorFromZ && options.zAxis?.format) return options.zAxis.format;\n const step = tickStep(d[0], d[1], 5);\n return step > 0\n ? locale.ticks(step, Math.max(Math.abs(d[0]), Math.abs(d[1])))\n : locale.value;\n };\n\n // -------------------------------------------------------------- hover\n\n const tooltipEnabled = () => options.tooltip !== false;\n\n const stageOffset = () => ({ x: stage.offsetLeft, y: stage.offsetTop });\n\n const setHover = (hit: PickHit | null) => {\n const event =\n hit && !geometryDirty\n ? hoverEvent(model, geometry.targets, hit, colors, stageOffset())\n : null;\n const changed =\n (event === null) !== (hoverEvt === null) ||\n (!!event &&\n !!hoverEvt &&\n (event.seriesIndex !== hoverEvt.seriesIndex ||\n event.index !== hoverEvt.index ||\n event.type !== hoverEvt.type));\n hoverHit = event ? hit : null;\n hoverEvt = event;\n renderTooltip();\n if (lastFrame && lastLayout) {\n const width = stage.clientWidth;\n const height = stage.clientHeight;\n if (width > 0 && height > 0)\n drawForeground(\n lastFrame,\n lastLayout,\n width,\n height,\n win?.devicePixelRatio || 1,\n );\n }\n if (changed) emit(\"hover\", event);\n };\n\n const renderTooltip = () => {\n const tip = dom.tooltip;\n if (!hoverEvt || !hoverHit || !tooltipEnabled()) {\n tip.style.display = \"none\";\n return;\n }\n const custom =\n typeof options.tooltip === \"object\" ? options.tooltip.render : undefined;\n const content = custom ? custom(hoverEvt) : defaultTooltip(hoverEvt);\n if (content === null) {\n tip.style.display = \"none\";\n return;\n }\n if (typeof content === \"string\") tip.textContent = content;\n else tip.replaceChildren(content);\n tip.style.display = \"block\";\n const width = stage.clientWidth;\n const height = stage.clientHeight;\n const tw = tip.offsetWidth;\n const th = tip.offsetHeight;\n let x = hoverHit.x + 16;\n if (x + tw > width - 4) x = hoverHit.x - 16 - tw;\n x = Math.max(4, x);\n const y = Math.max(4, Math.min(height - th - 4, hoverHit.y - th / 2));\n tip.style.transform = `translate(${Math.round(x)}px, ${Math.round(y)}px)`;\n };\n\n const defaultTooltip = (event: Chart3DHoverEvent): Node => {\n const fragment = doc.createDocumentFragment();\n const header = style(doc.createElement(\"div\"), {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n fontWeight: \"600\",\n marginBottom: \"4px\",\n color: \"var(--text-color, #1f2937)\",\n });\n header.append(\n swatch(doc, event.color, event.type !== \"bar\"),\n doc.createTextNode(\n event.seriesName ||\n fill(model.locale.labels.series, { n: event.seriesIndex + 1 }),\n ),\n );\n fragment.append(header);\n const valueName =\n typeof options.colorBar === \"object\" && options.colorBar.title\n ? options.colorBar.title\n : \"\";\n for (const row of tooltipRows(model, event, valueName)) {\n const el = style(doc.createElement(\"div\"), {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n });\n const n = style(doc.createElement(\"span\"), {\n flex: \"1 1 auto\",\n color: \"var(--text-secondary-color, #6b7280)\",\n });\n n.textContent = row.name;\n const v = style(doc.createElement(\"span\"), {\n fontWeight: row.name ? \"600\" : \"400\",\n fontVariantNumeric: \"tabular-nums\",\n marginLeft: row.name ? \"12px\" : \"0\",\n });\n v.textContent = row.value;\n if (row.name) el.append(n, v);\n else el.append(v);\n fragment.append(el);\n }\n return fragment;\n };\n\n const pickAt = (x: number, y: number): PickHit | null => {\n if (!lastFrame || geometryDirty || !renderer) return null;\n return picker.pick(geometry.targets, lastFrame, x, y);\n };\n\n let hoverFrame = 0;\n const scheduleHover = (x: number, y: number) => {\n pendingHover = { x, y };\n if (hoverFrame || !win) return;\n hoverFrame = win.requestAnimationFrame(() => {\n hoverFrame = 0;\n const p = pendingHover;\n pendingHover = null;\n if (!p || destroyed || drag) return;\n setHover(pickAt(p.x, p.y));\n });\n };\n\n // -------------------------------------------------------- interaction\n\n interface DragState {\n mode: \"rotate\" | \"pan\" | \"pinch\";\n pointers: Map<number, { x: number; y: number }>;\n start: Chart3DCameraState;\n origin: { x: number; y: number };\n distance: number;\n moved: boolean;\n }\n let drag: DragState | null = null;\n const pointers = new Map<number, { x: number; y: number }>();\n\n const local = (e: { clientX: number; clientY: number }) => {\n const r = stage.getBoundingClientRect();\n return { x: e.clientX - r.left, y: e.clientY - r.top };\n };\n\n const fitHeight = () =>\n lastLayout?.fit.height ?? Math.max(1, stage.clientHeight);\n\n const setCameraInternal = (next: Chart3DCameraState, notify = true) => {\n const clamped = clampCamera(next);\n if (sameCamera(clamped, camera)) return;\n camera = clamped;\n tween = null;\n if (hoverHit) setHover(null);\n invalidate(true);\n if (notify) emit(\"camera\", copyCamera(camera));\n };\n\n const animateTo = (target: Chart3DCameraState) => {\n if (reducedMotion?.matches || !win) {\n setCameraInternal(target);\n return;\n }\n tween = {\n from: copyCamera(camera),\n to: copyCamera(target),\n start: win.performance.now(),\n };\n invalidate(true);\n };\n\n const pinchInfo = () => {\n const pts = [...pointers.values()];\n const a = pts[0] ?? { x: 0, y: 0 };\n const b = pts[1] ?? a;\n return {\n distance: Math.hypot(a.x - b.x, a.y - b.y),\n center: { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 },\n };\n };\n\n const startDrag = (\n mode: DragState[\"mode\"],\n origin: { x: number; y: number },\n ) => {\n drag = {\n mode,\n pointers,\n start: copyCamera(camera),\n origin,\n distance: mode === \"pinch\" ? pinchInfo().distance : 0,\n moved: false,\n };\n tween = null;\n if (hoverHit) setHover(null);\n stage.style.cursor = mode === \"rotate\" ? \"grabbing\" : \"move\";\n };\n\n const onPointerDown = (e: PointerEvent) => {\n const ia = interaction();\n if (!ia) return;\n const p = local(e);\n pointers.set(e.pointerId, p);\n stage.setPointerCapture?.(e.pointerId);\n if (pointers.size === 2 && (ia.zoom || ia.pan)) {\n startDrag(\"pinch\", pinchInfo().center);\n return;\n }\n if (pointers.size > 1) return;\n const pan = ia.pan && (e.button === 2 || e.shiftKey || e.button === 1);\n if (pan) startDrag(\"pan\", p);\n else if (ia.rotate && e.button === 0) startDrag(\"rotate\", p);\n else drag = null;\n if (pan || e.button === 1) e.preventDefault();\n };\n\n const onPointerMove = (e: PointerEvent) => {\n const p = local(e);\n lastPointer = p;\n if (pointers.has(e.pointerId)) pointers.set(e.pointerId, p);\n if (!drag) {\n if (e.pointerType === \"touch\" && pointers.size) return;\n if (\n tooltipEnabled() ||\n listeners.get(\"hover\")?.size ||\n listeners.get(\"click\")?.size\n )\n scheduleHover(p.x, p.y);\n return;\n }\n const ia = interaction();\n if (!ia) return;\n if (drag.mode === \"pinch\") {\n const { distance, center } = pinchInfo();\n const scale = drag.distance > 0 ? distance / drag.distance : 1;\n const h = fitHeight();\n setCameraInternal({\n ...drag.start,\n zoom: ia.zoom ? drag.start.zoom * scale : drag.start.zoom,\n pan: ia.pan\n ? [\n drag.start.pan[0] + (center.x - drag.origin.x) / h,\n drag.start.pan[1] + (center.y - drag.origin.y) / h,\n ]\n : drag.start.pan,\n });\n drag.moved = true;\n return;\n }\n const dx = p.x - drag.origin.x;\n const dy = p.y - drag.origin.y;\n if (!drag.moved && Math.hypot(dx, dy) < 3) return;\n drag.moved = true;\n if (drag.mode === \"pan\") {\n const h = fitHeight();\n setCameraInternal({\n ...drag.start,\n pan: [drag.start.pan[0] + dx / h, drag.start.pan[1] + dy / h],\n });\n } else {\n setCameraInternal({\n ...drag.start,\n azimuth: drag.start.azimuth - dx * DRAG_DEGREES,\n elevation: drag.start.elevation + dy * DRAG_DEGREES,\n });\n }\n };\n\n const onPointerUp = (e: PointerEvent) => {\n const wasDrag = drag;\n pointers.delete(e.pointerId);\n if (stage.hasPointerCapture?.(e.pointerId))\n stage.releasePointerCapture(e.pointerId);\n if (pointers.size === 1 && wasDrag?.mode === \"pinch\") {\n // continue with the remaining finger as a rotation\n const rest = [...pointers.values()][0]!;\n startDrag(\"rotate\", rest);\n return;\n }\n if (pointers.size) return;\n drag = null;\n stage.style.cursor = interaction()?.rotate ? \"grab\" : \"default\";\n if (wasDrag && !wasDrag.moved && e.button === 0) {\n const p = local(e);\n const hit = pickAt(p.x, p.y);\n setHover(hit);\n if (hoverEvt) emit(\"click\", hoverEvt);\n }\n if (rotating()) invalidate(false);\n };\n\n const onPointerCancel = (e: PointerEvent) => {\n pointers.delete(e.pointerId);\n if (!pointers.size) {\n drag = null;\n stage.style.cursor = interaction()?.rotate ? \"grab\" : \"default\";\n }\n };\n\n const onPointerEnter = (e: PointerEvent) => {\n if (e.pointerType !== \"touch\") pointerInside = true;\n };\n\n const onPointerLeave = () => {\n pointerInside = false;\n pendingHover = null;\n lastPointer = null;\n if (!drag && hoverHit) setHover(null);\n if (rotating()) invalidate(false);\n };\n\n const onWheel = (e: WheelEvent) => {\n const ia = interaction();\n if (!ia?.zoom) return;\n const pinch = e.ctrlKey && !e.metaKey;\n if (ia.wheel === \"modifier\" && !e.ctrlKey && !e.metaKey) return;\n e.preventDefault();\n const factor = wheelFactor(e.deltaY, e.deltaMode, pinch);\n const zoom = camera.zoom / factor;\n // keep the point under the pointer in place\n const layout = lastLayout;\n if (!layout) {\n setCameraInternal({ ...camera, zoom });\n return;\n }\n const clamped = clampCamera({ ...camera, zoom });\n const ratio = clamped.zoom / camera.zoom;\n const h = layout.fit.height;\n const cx = layout.fit.x + layout.fit.width / 2 + camera.pan[0] * h;\n const cy = layout.fit.y + layout.fit.height / 2 + camera.pan[1] * h;\n const m = local(e);\n const nx = m.x - ratio * (m.x - cx);\n const ny = m.y - ratio * (m.y - cy);\n setCameraInternal({\n ...clamped,\n pan: [camera.pan[0] + (nx - cx) / h, camera.pan[1] + (ny - cy) / h],\n });\n if (hoverHit) setHover(null);\n };\n\n const onDoubleClick = (e: MouseEvent) => {\n if (!interaction()) return;\n e.preventDefault();\n animateTo(homeCamera);\n };\n\n const onContextMenu = (e: MouseEvent) => {\n if (interaction()?.pan) e.preventDefault();\n };\n\n // a focus ring for keyboard users only\n const onFocus = () => {\n let keyboard: boolean;\n try {\n keyboard = stage.matches(\":focus-visible\");\n } catch {\n keyboard = true;\n }\n if (keyboard)\n stage.style.boxShadow = \"0 0 0 2px var(--primary-color, #4f46e5)\";\n };\n\n const onBlur = () => {\n stage.style.boxShadow = \"\";\n };\n\n const onKeyDown = (e: KeyboardEvent) => {\n const ia = interaction();\n if (!ia?.keyboard) return;\n let next: Chart3DCameraState | null = null;\n const step = e.shiftKey ? KEY_DEGREES * 3 : KEY_DEGREES;\n switch (e.key) {\n case \"ArrowLeft\":\n if (ia.rotate) next = { ...camera, azimuth: camera.azimuth + step };\n break;\n case \"ArrowRight\":\n if (ia.rotate) next = { ...camera, azimuth: camera.azimuth - step };\n break;\n case \"ArrowUp\":\n if (ia.rotate) next = { ...camera, elevation: camera.elevation + step };\n break;\n case \"ArrowDown\":\n if (ia.rotate) next = { ...camera, elevation: camera.elevation - step };\n break;\n case \"+\":\n case \"=\":\n if (ia.zoom) next = { ...camera, zoom: camera.zoom * 1.2 };\n break;\n case \"-\":\n case \"_\":\n if (ia.zoom) next = { ...camera, zoom: camera.zoom / 1.2 };\n break;\n case \"0\":\n case \"Home\":\n e.preventDefault();\n animateTo(homeCamera);\n return;\n case \"Escape\":\n lastPointer = null;\n if (hoverHit) {\n e.preventDefault();\n setHover(null);\n }\n return;\n default:\n return;\n }\n if (!next) return;\n e.preventDefault();\n setCameraInternal(next);\n };\n\n stage.addEventListener(\"pointerdown\", onPointerDown);\n stage.addEventListener(\"pointermove\", onPointerMove);\n stage.addEventListener(\"pointerup\", onPointerUp);\n stage.addEventListener(\"pointercancel\", onPointerCancel);\n stage.addEventListener(\"pointerenter\", onPointerEnter);\n stage.addEventListener(\"pointerleave\", onPointerLeave);\n stage.addEventListener(\"wheel\", onWheel, { passive: false });\n stage.addEventListener(\"dblclick\", onDoubleClick);\n stage.addEventListener(\"contextmenu\", onContextMenu);\n stage.addEventListener(\"keydown\", onKeyDown);\n stage.addEventListener(\"focus\", onFocus);\n stage.addEventListener(\"blur\", onBlur);\n\n // ----------------------------------------------------------- watchers\n\n const resizeObserver =\n typeof ResizeObserver === \"function\"\n ? new ResizeObserver(() => {\n picker.reset();\n invalidate(true);\n })\n : null;\n resizeObserver?.observe(stage);\n\n const intersection =\n typeof IntersectionObserver === \"function\"\n ? new IntersectionObserver((entries) => {\n const entry = entries[entries.length - 1];\n if (!entry) return;\n const was = visible;\n visible = entry.isIntersecting;\n if (visible && !was) invalidate(true);\n })\n : null;\n intersection?.observe(stage);\n\n const onVisibility = () => {\n if (doc.visibilityState !== \"hidden\") invalidate(false);\n };\n doc.addEventListener(\"visibilitychange\", onVisibility);\n\n // device pixel ratio changes (zoom, moving to another screen)\n let dprQuery: MediaQueryList | null = null;\n const onDprChange = () => {\n watchDpr();\n invalidate(true);\n };\n const watchDpr = () => {\n dprQuery?.removeEventListener?.(\"change\", onDprChange);\n dprQuery =\n typeof win?.matchMedia === \"function\"\n ? win.matchMedia(`(resolution: ${win.devicePixelRatio || 1}dppx)`)\n : null;\n dprQuery?.addEventListener?.(\"change\", onDprChange);\n };\n watchDpr();\n\n const onMotionChange = () => invalidate(false);\n reducedMotion?.addEventListener?.(\"change\", onMotionChange);\n\n const refreshTheme = () => {\n if (destroyed) return;\n const next = readTheme(dom.root, options.palette);\n if (themeColorsChanged(theme, next)) themeVersion++;\n theme = next;\n rebuild();\n };\n const unwatchTheme = watchTheme(refreshTheme);\n\n // texts follow the page language when no `locale` is set\n const langObserver =\n typeof win?.MutationObserver === \"function\"\n ? new win.MutationObserver(() => {\n if (\n !destroyed &&\n resolveLocale(options.locale) !== model.locale.locale\n )\n rebuild();\n })\n : null;\n langObserver?.observe(doc.documentElement, {\n attributes: true,\n attributeFilter: [\"lang\"],\n });\n\n // ----------------------------------------------------------- renderer\n\n const initRenderer = async (exclude: Set<ChartRendererKind> = new Set()) => {\n const token = ++rendererToken;\n const next = await createRenderer3D(\n options.renderer ?? \"auto\",\n () => {\n const canvas = layerCanvas(doc);\n canvas.className = \"minerva-chart-data\";\n return canvas;\n },\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 geometryDirty = true;\n if (next) {\n dom.root.dataset.renderer = next.kind;\n stage.insertBefore(next.canvas, dom.foreground);\n emit(\"renderer\", next.kind);\n } else {\n delete dom.root.dataset.renderer;\n }\n resolveReady(next?.kind ?? null);\n invalidate(true);\n };\n\n refreshColors();\n rebuild();\n void initRenderer();\n const unfollowDefault = followDefaultRenderer(\n () => options.renderer,\n () => void initRenderer(),\n );\n\n // ---------------------------------------------------------------- api\n\n const instance: Chart3DInstance = {\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 const key = JSON.stringify(next.camera ?? {});\n if (key !== cameraKey) {\n cameraKey = key;\n homeCamera = initialCamera(next.camera);\n setCameraInternal({ ...homeCamera });\n }\n if ((next.renderer ?? \"auto\") !== (previous.renderer ?? \"auto\"))\n void initRenderer();\n rebuild();\n },\n resize() {\n picker.reset();\n invalidate(true);\n },\n resetCamera() {\n setCameraInternal(copyCamera(homeCamera));\n },\n getCamera: () => copyCamera(camera),\n setCamera(next) {\n if (destroyed) return;\n setCameraInternal({\n azimuth: next.azimuth ?? camera.azimuth,\n elevation: next.elevation ?? camera.elevation,\n zoom: next.zoom ?? camera.zoom,\n pan: next.pan ? [next.pan[0], next.pan[1]] : camera.pan,\n projection: next.projection ?? camera.projection,\n });\n },\n getRenderer: () => renderer?.kind ?? null,\n ready,\n refreshTheme,\n on(type, listener) {\n let set = listeners.get(type);\n if (!set) {\n set = new Set();\n listeners.set(type, set);\n }\n set.add(listener as (e: never) => void);\n return () => {\n set.delete(listener as (e: never) => void);\n };\n },\n destroy() {\n if (destroyed) return;\n destroyed = true;\n rendererToken++;\n if (frameId) win?.cancelAnimationFrame(frameId);\n if (hoverFrame) win?.cancelAnimationFrame(hoverFrame);\n frameId = 0;\n hoverFrame = 0;\n resizeObserver?.disconnect();\n intersection?.disconnect();\n doc.removeEventListener(\"visibilitychange\", onVisibility);\n dprQuery?.removeEventListener?.(\"change\", onDprChange);\n reducedMotion?.removeEventListener?.(\"change\", onMotionChange);\n unfollowDefault();\n unwatchTheme();\n langObserver?.disconnect();\n stage.removeEventListener(\"pointerdown\", onPointerDown);\n stage.removeEventListener(\"pointermove\", onPointerMove);\n stage.removeEventListener(\"pointerup\", onPointerUp);\n stage.removeEventListener(\"pointercancel\", onPointerCancel);\n stage.removeEventListener(\"pointerenter\", onPointerEnter);\n stage.removeEventListener(\"pointerleave\", onPointerLeave);\n stage.removeEventListener(\"wheel\", onWheel);\n stage.removeEventListener(\"dblclick\", onDoubleClick);\n stage.removeEventListener(\"contextmenu\", onContextMenu);\n stage.removeEventListener(\"keydown\", onKeyDown);\n stage.removeEventListener(\"focus\", onFocus);\n stage.removeEventListener(\"blur\", onBlur);\n renderer?.destroy();\n renderer = null;\n listeners.clear();\n resolveReady(null);\n dom.root.remove();\n },\n };\n return instance;\n};\n\nfunction isDark(theme: ChartTheme): boolean {\n return luminance(theme.background) < 0.4 || luminance(theme.text) > 0.6;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"chart.js","names":["wheelFactor","pixels","deltaMode","deltaY","pinch","DEFAULT_LIGHTING","ROTATE_SPEED","DRAG_DEGREES","KEY_DEGREES","TWEEN_MS","initialCamera","clampCamera","camera","DEFAULT_CAMERA","copyCamera","c","sameCamera","a","b","lerpCamera","da","t","stageLayout","side","width","top","height","bottom","barSpace","colorBar","fit","h","createChart3D","doc","container","win","dom","createChart3DDom","stage","options","initialOptions","theme","readTheme","themeVersion","destroyed","listeners","emit","type","fn","event","toggled","model","buildModel","colors","lut","lutKey","lutId","buildGeometry","createGeometryBuilder","geometry","geometryDirty","picker","createPicker","sortTransparent","createDepthSorter","renderer","rendererToken","resolveReady","ready","resolve","homeCamera","cameraKey","tween","frameId","dataDirty","lastFrame","lastLayout","overlay","overlayStyle","isDark","hoverHit","hoverEvt","pendingHover","lastPointer","pointerInside","visible","lastRotate","reducedMotion","interaction","o","rotateSpeed","showsColorBar","effectiveOptions","id","s","i","resolveColor","value","parseColor","refreshColors","key","colorLut","colorStops","f","palette","m","rebuild","renderLegend","updateAccessibility","invalidate","scheduleHover","legendKey","named","show","config","toggle","toCss","focused","item","fill","labels","style","swatch","names","lines","count","name","size","axis","range","data","frame","rotating","drag","lightDirection","v","normalize","dpr","time","eased","dt","sizeCanvas","layout","fov","half","cameraFrame","bg","drawWalls","CPU_BUDGET","GPU_BUDGET","w","l","frame3d","drawForeground","fg","drawAxes","colorBarFormat","shape","highlightShape","drawHighlight","d","locale","step","tickStep","tooltipEnabled","stageOffset","setHover","hit","hoverEvent","changed","renderTooltip","tip","custom","content","defaultTooltip","positionTooltip","fragment","header","valueName","row","tooltipRows","el","n","pickAt","x","y","hoverFrame","p","pointers","local","r","fitHeight","setCameraInternal","clamped","next","notify","animateTo","target","pinchInfo","pts","startDrag","mode","onPointerDown","ia","pan","onPointerMove","scale","distance","center","dx","dy","onPointerUp","wasDrag","rest","onPointerCancel","onPointerEnter","onPointerLeave","onWheel","factor","zoom","ratio","cx","cy","nx","ny","onDoubleClick","onContextMenu","onFocus","keyboard","onBlur","onKeyDown","resizeObserver","intersection","entry","entries","was","onVisibility","dprQuery","onDprChange","watchDpr","onMotionChange","refreshTheme","themeColorsChanged","unwatchTheme","watchTheme","langObserver","resolveLocale","initRenderer","token","createRenderer3D","canvas","layerCanvas","kind","exclude","unfollowDefault","followDefaultRenderer","previous","set","listener","luminance"],"sources":["../../../../../charts/src/engine/three-d/chart.ts"],"sourcesContent":["// createChart3D: 3D scatter / surface / bar / line charts. The data layer\n// is drawn by a GPU backend (WebGPU -> WebGL2 -> WebGL) or by Canvas2D (CPU\n// projection, painter's algorithm); walls, labels, color bar and hover\n// highlight are 2D canvases around it. Frames are drawn on demand: the only\n// animation loop is the optional auto rotation (paused off-screen, while\n// hovered and with prefers-reduced-motion).\n\nimport { luminance, parseColor, toCss, type Rgba } from \"../color\";\nimport { resolveLocale } from \"../locale\";\nimport { followDefaultRenderer } from \"../renderers/follow\";\nimport { tickStep } from \"../scale\";\nimport {\n readTheme,\n themeColorsChanged,\n watchTheme,\n type ChartTheme,\n} from \"../theme\";\nimport { positionTooltip } from \"../tooltip\";\nimport type { ChartRendererKind } from \"../types\";\nimport { colorLut, colorStops, type ColorLut } from \"./colormap\";\nimport { createRenderer3D } from \"./detect\";\nimport {\n createChart3DDom,\n layerCanvas,\n sizeCanvas,\n style,\n swatch,\n} from \"./dom\";\nimport {\n CPU_BUDGET,\n GPU_BUDGET,\n createGeometryBuilder,\n type Geometry,\n type GeometryColors,\n} from \"./geometry\";\nimport { highlightShape, hoverEvent, tooltipRows } from \"./hover\";\nimport { fill } from \"./labels\";\nimport {\n DEFAULT_CAMERA,\n cameraFrame,\n clampCamera,\n normalize,\n type CameraFrame,\n type FitRect,\n type Vec3,\n} from \"./math\";\nimport { buildModel, type Model3D } from \"./model\";\nimport {\n drawAxes,\n drawColorBar,\n drawHighlight,\n drawWalls,\n overlayStyle,\n type HighlightShape,\n type OverlayStyle,\n} from \"./overlay\";\nimport { createPicker, type PickHit } from \"./pick\";\nimport type { Frame3D, Renderer3D } from \"./render-types\";\nimport { createDepthSorter } from \"./sort\";\nimport type {\n Chart3DCameraOptions,\n Chart3DCameraState,\n Chart3DEventMap,\n Chart3DHoverEvent,\n Chart3DInstance,\n Chart3DInteractionOptions,\n Chart3DOptions,\n} from \"./types\";\n\n/** Zoom factor of a wheel event (same feel as the 2D charts) */\nconst wheelFactor = (deltaY: number, deltaMode: number, pinch: boolean) => {\n const pixels =\n deltaMode === 1 ? deltaY * 16 : deltaMode === 2 ? deltaY * 400 : deltaY;\n const speed = pinch ? 0.01 : 0.0025;\n return Math.exp(Math.max(-1, Math.min(1, pixels * speed)));\n};\n\nconst DEFAULT_LIGHTING = {\n ambient: 0.5,\n diffuse: 0.6,\n specular: 0.25,\n shininess: 32,\n};\n\nconst ROTATE_SPEED = 12;\nconst DRAG_DEGREES = 0.45;\nconst KEY_DEGREES = 5;\nconst TWEEN_MS = 380;\n\n/** Camera of the options (also the one restored by a reset) */\nexport const initialCamera = (\n camera: Chart3DCameraOptions | undefined,\n): Chart3DCameraState =>\n clampCamera({\n azimuth: camera?.azimuth ?? DEFAULT_CAMERA.azimuth,\n elevation: camera?.elevation ?? DEFAULT_CAMERA.elevation,\n zoom: camera?.zoom ?? DEFAULT_CAMERA.zoom,\n pan: [0, 0],\n projection: camera?.projection ?? DEFAULT_CAMERA.projection,\n });\n\nconst copyCamera = (c: Chart3DCameraState): Chart3DCameraState => ({\n ...c,\n pan: [c.pan[0], c.pan[1]],\n});\n\nconst sameCamera = (a: Chart3DCameraState, b: Chart3DCameraState) =>\n a.azimuth === b.azimuth &&\n a.elevation === b.elevation &&\n a.zoom === b.zoom &&\n a.pan[0] === b.pan[0] &&\n a.pan[1] === b.pan[1] &&\n a.projection === b.projection;\n\n/** Interpolated camera (shortest way around for the azimuth) */\nconst lerpCamera = (\n a: Chart3DCameraState,\n b: Chart3DCameraState,\n t: number,\n): Chart3DCameraState => {\n let da = (b.azimuth - a.azimuth) % 360;\n if (da > 180) da -= 360;\n if (da < -180) da += 360;\n return clampCamera({\n azimuth: a.azimuth + da * t,\n elevation: a.elevation + (b.elevation - a.elevation) * t,\n zoom: a.zoom * Math.pow(b.zoom / a.zoom, t),\n pan: [\n a.pan[0] + (b.pan[0] - a.pan[0]) * t,\n a.pan[1] + (b.pan[1] - a.pan[1]) * t,\n ],\n projection: t < 0.5 ? a.projection : b.projection,\n });\n};\n\n/** Layout of the stage: area the box is fitted into and the color bar */\nexport const stageLayout = (\n width: number,\n height: number,\n colorBar: boolean,\n): {\n fit: FitRect;\n bar: { x: number; y: number; w: number; h: number } | null;\n} => {\n const side = Math.max(30, Math.min(72, width * 0.08));\n const top = Math.max(14, Math.min(28, height * 0.05));\n const bottom = Math.max(30, Math.min(56, height * 0.1));\n const barSpace = colorBar ? 74 : 0;\n const fit: FitRect = {\n x: side,\n y: top,\n width: Math.max(10, width - side * 2 - barSpace),\n height: Math.max(10, height - top - bottom),\n };\n if (!colorBar) return { fit, bar: null };\n const h = Math.max(40, Math.min(260, height * 0.62));\n return {\n fit,\n bar: { x: width - 66, y: (height - h) / 2 + 8, w: 12, h },\n };\n};\n\nexport const createChart3D = (\n container: HTMLElement,\n initialOptions: Chart3DOptions,\n): Chart3DInstance => {\n const doc = container.ownerDocument;\n const win = doc.defaultView;\n const dom = createChart3DDom(container);\n const stage = dom.stage;\n let options = initialOptions;\n let theme: ChartTheme = readTheme(dom.root, options.palette);\n let themeVersion = 0;\n let destroyed = false;\n\n const listeners = new Map<keyof Chart3DEventMap, Set<(e: never) => void>>();\n const emit = <K extends keyof Chart3DEventMap>(\n type: K,\n event: Chart3DEventMap[K],\n ) => {\n listeners\n .get(type)\n ?.forEach((fn) => (fn as (e: Chart3DEventMap[K]) => void)(event));\n };\n\n // ------------------------------------------------------------- state\n\n /** Series whose visibility the legend flipped (ids) */\n const toggled = new Set<string>();\n let model: Model3D = buildModel(options);\n let colors: GeometryColors;\n let lut: ColorLut;\n let lutKey = \"\";\n let lutId = 0;\n const buildGeometry = createGeometryBuilder();\n let geometry: Geometry = { items: [], targets: [], counts: [] };\n let geometryDirty = true;\n const picker = createPicker();\n const sortTransparent = createDepthSorter();\n\n let renderer: Renderer3D | null = null;\n let rendererToken = 0;\n let resolveReady: (kind: ChartRendererKind | null) => void = () => {};\n const ready = new Promise<ChartRendererKind | null>((resolve) => {\n resolveReady = resolve;\n });\n\n let homeCamera = initialCamera(options.camera);\n let cameraKey = JSON.stringify(options.camera ?? {});\n let camera = copyCamera(homeCamera);\n let tween: {\n from: Chart3DCameraState;\n to: Chart3DCameraState;\n start: number;\n } | null = null;\n\n let frameId = 0;\n let dataDirty = true;\n let lastFrame: CameraFrame | null = null;\n let lastLayout: ReturnType<typeof stageLayout> | null = null;\n let overlay: OverlayStyle = overlayStyle(theme, isDark(theme));\n\n let hoverHit: PickHit | null = null;\n let hoverEvt: Chart3DHoverEvent | null = null;\n let pendingHover: { x: number; y: number } | null = null;\n let lastPointer: { x: number; y: number } | null = null;\n let pointerInside = false;\n let visible = true;\n let lastRotate = 0;\n\n const reducedMotion =\n typeof win?.matchMedia === \"function\"\n ? win.matchMedia(\"(prefers-reduced-motion: reduce)\")\n : null;\n\n // ------------------------------------------------------------ options\n\n const interaction = (): Required<Chart3DInteractionOptions> | null => {\n const o = options.interaction;\n if (o === false) return null;\n const c = typeof o === \"object\" ? o : {};\n return {\n rotate: c.rotate ?? true,\n zoom: c.zoom ?? true,\n wheel: c.wheel ?? \"modifier\",\n pan: c.pan ?? true,\n keyboard: c.keyboard ?? true,\n };\n };\n\n const rotateSpeed = () => {\n const a = options.autoRotate;\n if (a === true) return ROTATE_SPEED;\n return typeof a === \"number\" && Number.isFinite(a) ? a : 0;\n };\n\n const showsColorBar = () => {\n const o = options.colorBar;\n if (o === false) return false;\n return !!model.colorDomain;\n };\n\n const effectiveOptions = (): Chart3DOptions => ({\n ...options,\n series: options.series.map((s, i) => {\n const id = s.id ?? String(i);\n return toggled.has(id) ? { ...s, hidden: !s.hidden } : s;\n }),\n });\n\n const resolveColor = (value: string): Rgba =>\n theme.resolve\n ? theme.resolve(value, [0.5, 0.5, 0.5, 1])\n : (parseColor(value) ?? [0.5, 0.5, 0.5, 1]);\n\n const refreshColors = () => {\n const key = `${JSON.stringify(options.colorScale ?? \"viridis\")}|${themeVersion}`;\n if (key !== lutKey || !lut) {\n lutKey = key;\n lut = colorLut(\n colorStops(options.colorScale, (c, f) =>\n theme.resolve ? theme.resolve(c, f) : (parseColor(c) ?? f),\n ),\n );\n lutId++;\n }\n const palette = theme.palette.length ? theme.palette : [theme.primary];\n colors = {\n series: model.series.map((m, i) =>\n m.color\n ? resolveColor(m.color)\n : (palette[i % palette.length] ?? theme.primary),\n ),\n resolve: resolveColor,\n lut,\n wire: [theme.text[0], theme.text[1], theme.text[2], 0.38],\n };\n };\n\n const rebuild = () => {\n model = buildModel(effectiveOptions());\n refreshColors();\n geometryDirty = true;\n overlay = overlayStyle(theme, isDark(theme));\n renderLegend();\n updateAccessibility();\n invalidate(true);\n // the hovered item may have moved (live data): pick it again after the frame\n if (hoverHit && lastPointer) scheduleHover(lastPointer.x, lastPointer.y);\n };\n\n // ------------------------------------------------------------- legend\n\n let legendKey = \"\";\n const renderLegend = () => {\n const o = options.legend;\n const named = model.series.filter((s) => s.name).length;\n const show = o === undefined ? named > 1 : !!o;\n const config = typeof o === \"object\" ? o : {};\n const toggle = config.toggle ?? true;\n const bottom = config.position === \"bottom\";\n let key = `${show}|${bottom}|${toggle}`;\n if (show) {\n model.series.forEach((s, i) => {\n key += `\\n${s.id}\\u0001${s.name}\\u0001${toCss(colors.series[i] ?? theme.primary)}\\u0001${s.hidden}`;\n });\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 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 model.series.forEach((s, i) => {\n if (!s.name) return;\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 (toggled.has(s.id)) toggled.delete(s.id);\n else toggled.add(s.id);\n const { labels } = model.locale;\n dom.live.textContent = fill(s.hidden ? labels.shown : labels.hidden, {\n name: s.name,\n });\n rebuild();\n });\n }\n style(item, {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"6px\",\n padding: \"2px 4px\",\n margin: \"0\",\n border: \"0\",\n borderRadius: \"4px\",\n background: \"none\",\n font: \"inherit\",\n color: \"var(--text-secondary-color, #6b7280)\",\n cursor: toggle ? \"pointer\" : \"default\",\n opacity: s.hidden ? \"0.45\" : \"1\",\n textDecoration: s.hidden ? \"line-through\" : \"none\",\n });\n item.append(\n swatch(\n doc,\n toCss(colors.series[i] ?? theme.primary),\n s.type !== \"bar\" && s.type !== \"surface\",\n ),\n doc.createTextNode(s.name),\n );\n dom.legend.appendChild(item);\n });\n if (focused >= 0)\n (dom.legend.children[focused] as HTMLElement | undefined)?.focus();\n };\n\n // ------------------------------------------------------ accessibility\n\n const updateAccessibility = () => {\n const { labels, count } = model.locale;\n const names = model.series\n .map((s) => s.name)\n .filter(Boolean)\n .join(labels.listSeparator);\n stage.setAttribute(\"aria-roledescription\", labels.chart);\n stage.setAttribute(\n \"aria-label\",\n options.ariaLabel ??\n (names ? fill(labels.chartNamed, { names }) : labels.chart),\n );\n const keyboard = interaction()?.keyboard;\n if (keyboard) stage.tabIndex = 0;\n else stage.removeAttribute(\"tabindex\");\n stage.style.cursor = interaction()?.rotate ? \"grab\" : \"default\";\n const lines: string[] = [];\n lines.push(fill(labels.seriesCount, { count: count(model.series.length) }));\n for (const m of model.series) {\n const name = m.name || fill(labels.series, { n: m.index + 1 });\n const size =\n m.type === \"surface\"\n ? fill(labels.grid, {\n rows: count(m.grid.rows),\n cols: count(m.grid.cols),\n })\n : m.type === \"bar\"\n ? fill(labels.bars, { count: count(m.bars.count) })\n : fill(m.type === \"line\" ? labels.vertices : labels.points, {\n count: count(m.cols.count),\n });\n lines.push(\n fill(m.hidden ? labels.seriesSummaryHidden : labels.seriesSummary, {\n name,\n type: labels[m.type],\n size,\n }),\n );\n }\n for (const key of [\"x\", \"y\", \"z\"] as const) {\n const axis = model[key];\n const range = axis.categories\n ? axis.categories.join(labels.listSeparator)\n : fill(labels.range, {\n min: axis.format(axis.domain[0]),\n max: axis.format(axis.domain[1]),\n });\n lines.push(\n fill(axis.title ? labels.axisTitled : labels.axis, {\n axis: key.toUpperCase(),\n title: axis.title,\n range,\n }),\n );\n }\n dom.summary.textContent = lines.join(\" \");\n };\n\n // -------------------------------------------------------------- frame\n\n function invalidate(data = true) {\n if (data) dataDirty = true;\n if (destroyed || frameId || !win) return;\n frameId = win.requestAnimationFrame(frame);\n }\n\n const rotating = () =>\n rotateSpeed() !== 0 &&\n visible &&\n !pointerInside &&\n !drag &&\n !tween &&\n !reducedMotion?.matches &&\n !(doc.visibilityState === \"hidden\");\n\n const lightDirection = (f: CameraFrame): Vec3 => {\n // a headlight from the upper left, slightly raised towards the sky\n const v: Vec3 = [0, 0, 0];\n for (let i = 0; i < 3; i++) {\n v[i] = -f.right[i]! * 0.35 + f.up[i]! * 0.55 - f.forward[i]! * 0.7;\n }\n v[2] += 0.35;\n return normalize(v);\n };\n\n function frame(time: number) {\n frameId = 0;\n if (destroyed) return;\n const width = stage.clientWidth;\n const height = stage.clientHeight;\n if (width <= 0 || height <= 0) return;\n const dpr = win?.devicePixelRatio || 1;\n // camera animations\n if (tween) {\n const t = Math.min(1, (time - tween.start) / TWEEN_MS);\n const eased = 1 - Math.pow(1 - t, 3);\n camera = lerpCamera(tween.from, tween.to, eased);\n if (t >= 1) {\n camera = copyCamera(tween.to);\n tween = null;\n emit(\"camera\", copyCamera(camera));\n }\n dataDirty = true;\n } else if (rotating()) {\n const dt = lastRotate ? Math.min(0.1, (time - lastRotate) / 1000) : 0;\n if (dt > 0) {\n camera = clampCamera({\n ...camera,\n azimuth: camera.azimuth - rotateSpeed() * dt,\n });\n dataDirty = true;\n }\n lastRotate = time;\n } else {\n lastRotate = 0;\n }\n\n sizeCanvas(dom.background, width, height, dpr);\n sizeCanvas(dom.foreground, width, height, dpr);\n const layout = stageLayout(width, height, showsColorBar());\n const fov = options.camera?.fov ?? 32;\n const half: Vec3 = [model.x.half, model.y.half, model.z.half];\n const f = cameraFrame(camera, half, width, height, layout.fit, fov);\n lastFrame = f;\n lastLayout = layout;\n\n if (dataDirty) {\n dataDirty = false;\n const bg = dom.background.getContext(\"2d\");\n if (bg) {\n bg.setTransform(dpr, 0, 0, dpr, 0, 0);\n bg.clearRect(0, 0, width, height);\n if (options.box !== false) drawWalls(bg, f, model, overlay);\n }\n if (renderer) {\n if (geometryDirty) {\n geometry = buildGeometry(\n model,\n colors,\n renderer.kind === \"canvas2d\" ? CPU_BUDGET : GPU_BUDGET,\n lutId,\n );\n geometryDirty = false;\n picker.reset();\n }\n const w = Math.max(1, Math.round(width * dpr));\n const h = Math.max(1, Math.round(height * dpr));\n if (renderer.canvas.width !== w || renderer.canvas.height !== h)\n renderer.resize(w, h);\n renderer.canvas.style.width = `${width}px`;\n renderer.canvas.style.height = `${height}px`;\n const l = options.lighting ?? {};\n const frame3d: Frame3D = {\n viewProj: f.viewProj,\n eye: f.eye,\n light: lightDirection(f),\n orthographic: f.orthographic,\n distance: f.distance,\n radius: f.radius,\n width: w,\n height: h,\n dpr,\n lighting: [\n l.ambient ?? DEFAULT_LIGHTING.ambient,\n l.diffuse ?? DEFAULT_LIGHTING.diffuse,\n l.specular ?? DEFAULT_LIGHTING.specular,\n l.shininess ?? DEFAULT_LIGHTING.shininess,\n ],\n fog: theme.background,\n exposure: Math.max(0, options.exposure ?? 1),\n };\n renderer.render(\n renderer.kind === \"canvas2d\" || renderer.orderIndependent\n ? geometry.items\n : sortTransparent(geometry.items, frame3d),\n frame3d,\n );\n }\n }\n drawForeground(f, layout, width, height, dpr);\n if (tween || rotating()) invalidate(true);\n }\n\n const drawForeground = (\n f: CameraFrame,\n layout: ReturnType<typeof stageLayout>,\n width: number,\n height: number,\n dpr: number,\n ) => {\n const fg = dom.foreground.getContext(\"2d\");\n if (!fg) return;\n fg.setTransform(dpr, 0, 0, dpr, 0, 0);\n fg.clearRect(0, 0, width, height);\n if (options.box !== false) {\n drawAxes(fg, f, model, overlay, {\n left: 4,\n top: 4,\n right: layout.bar ? layout.bar.x - 10 : width - 4,\n bottom: height - 4,\n });\n }\n if (layout.bar && model.colorDomain) {\n const o = typeof options.colorBar === \"object\" ? options.colorBar : {};\n drawColorBar(\n fg,\n layout.bar,\n lut,\n model.colorDomain,\n o.format ?? colorBarFormat(),\n o.title ?? (model.colorFromZ ? model.z.title : \"\"),\n overlay,\n width,\n );\n }\n if (hoverHit && hoverEvt) {\n const shape: HighlightShape | null = highlightShape(\n geometry.targets,\n hoverHit,\n hoverEvt.color,\n );\n if (shape) drawHighlight(fg, f, model, shape, overlay);\n }\n };\n\n const colorBarFormat = () => {\n const d = model.colorDomain;\n const { locale } = model;\n if (!d) return locale.value;\n if (model.colorFromZ && options.zAxis?.format) return options.zAxis.format;\n const step = tickStep(d[0], d[1], 5);\n return step > 0\n ? locale.ticks(step, Math.max(Math.abs(d[0]), Math.abs(d[1])))\n : locale.value;\n };\n\n // -------------------------------------------------------------- hover\n\n const tooltipEnabled = () => options.tooltip !== false;\n\n const stageOffset = () => ({ x: stage.offsetLeft, y: stage.offsetTop });\n\n const setHover = (hit: PickHit | null) => {\n const event =\n hit && !geometryDirty\n ? hoverEvent(model, geometry.targets, hit, colors, stageOffset())\n : null;\n const changed =\n (event === null) !== (hoverEvt === null) ||\n (!!event &&\n !!hoverEvt &&\n (event.seriesIndex !== hoverEvt.seriesIndex ||\n event.index !== hoverEvt.index ||\n event.type !== hoverEvt.type));\n hoverHit = event ? hit : null;\n hoverEvt = event;\n renderTooltip();\n if (lastFrame && lastLayout) {\n const width = stage.clientWidth;\n const height = stage.clientHeight;\n if (width > 0 && height > 0)\n drawForeground(\n lastFrame,\n lastLayout,\n width,\n height,\n win?.devicePixelRatio || 1,\n );\n }\n if (changed) emit(\"hover\", event);\n };\n\n const renderTooltip = () => {\n const tip = dom.tooltip;\n if (!hoverEvt || !hoverHit || !tooltipEnabled()) {\n tip.style.display = \"none\";\n return;\n }\n const custom =\n typeof options.tooltip === \"object\" ? options.tooltip.render : undefined;\n const content = custom ? custom(hoverEvt) : defaultTooltip(hoverEvt);\n if (content === null) {\n tip.style.display = \"none\";\n return;\n }\n if (typeof content === \"string\") tip.textContent = content;\n else tip.replaceChildren(content);\n tip.style.display = \"block\";\n // off the hovered point / bar top\n const r = 8;\n positionTooltip(tip, stage, {\n anchor: { x: hoverHit.x, y: hoverHit.y },\n avoid: {\n x: hoverHit.x - r,\n y: hoverHit.y - r,\n width: r * 2,\n height: r * 2,\n },\n gap: 10,\n });\n };\n\n const defaultTooltip = (event: Chart3DHoverEvent): Node => {\n const fragment = doc.createDocumentFragment();\n const header = style(doc.createElement(\"div\"), {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n fontWeight: \"600\",\n marginBottom: \"4px\",\n color: \"var(--text-color, #1f2937)\",\n });\n header.append(\n swatch(doc, event.color, event.type !== \"bar\"),\n doc.createTextNode(\n event.seriesName ||\n fill(model.locale.labels.series, { n: event.seriesIndex + 1 }),\n ),\n );\n fragment.append(header);\n const valueName =\n typeof options.colorBar === \"object\" && options.colorBar.title\n ? options.colorBar.title\n : \"\";\n for (const row of tooltipRows(model, event, valueName)) {\n const el = style(doc.createElement(\"div\"), {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n });\n const n = style(doc.createElement(\"span\"), {\n flex: \"1 1 auto\",\n color: \"var(--text-secondary-color, #6b7280)\",\n });\n n.textContent = row.name;\n const v = style(doc.createElement(\"span\"), {\n fontWeight: row.name ? \"600\" : \"400\",\n fontVariantNumeric: \"tabular-nums\",\n marginLeft: row.name ? \"12px\" : \"0\",\n });\n v.textContent = row.value;\n if (row.name) el.append(n, v);\n else el.append(v);\n fragment.append(el);\n }\n return fragment;\n };\n\n const pickAt = (x: number, y: number): PickHit | null => {\n if (!lastFrame || geometryDirty || !renderer) return null;\n return picker.pick(geometry.targets, lastFrame, x, y);\n };\n\n let hoverFrame = 0;\n const scheduleHover = (x: number, y: number) => {\n pendingHover = { x, y };\n if (hoverFrame || !win) return;\n hoverFrame = win.requestAnimationFrame(() => {\n hoverFrame = 0;\n const p = pendingHover;\n pendingHover = null;\n if (!p || destroyed || drag) return;\n setHover(pickAt(p.x, p.y));\n });\n };\n\n // -------------------------------------------------------- interaction\n\n interface DragState {\n mode: \"rotate\" | \"pan\" | \"pinch\";\n pointers: Map<number, { x: number; y: number }>;\n start: Chart3DCameraState;\n origin: { x: number; y: number };\n distance: number;\n moved: boolean;\n }\n let drag: DragState | null = null;\n const pointers = new Map<number, { x: number; y: number }>();\n\n const local = (e: { clientX: number; clientY: number }) => {\n const r = stage.getBoundingClientRect();\n return { x: e.clientX - r.left, y: e.clientY - r.top };\n };\n\n const fitHeight = () =>\n lastLayout?.fit.height ?? Math.max(1, stage.clientHeight);\n\n const setCameraInternal = (next: Chart3DCameraState, notify = true) => {\n const clamped = clampCamera(next);\n if (sameCamera(clamped, camera)) return;\n camera = clamped;\n tween = null;\n if (hoverHit) setHover(null);\n invalidate(true);\n if (notify) emit(\"camera\", copyCamera(camera));\n };\n\n const animateTo = (target: Chart3DCameraState) => {\n if (reducedMotion?.matches || !win) {\n setCameraInternal(target);\n return;\n }\n tween = {\n from: copyCamera(camera),\n to: copyCamera(target),\n start: win.performance.now(),\n };\n invalidate(true);\n };\n\n const pinchInfo = () => {\n const pts = [...pointers.values()];\n const a = pts[0] ?? { x: 0, y: 0 };\n const b = pts[1] ?? a;\n return {\n distance: Math.hypot(a.x - b.x, a.y - b.y),\n center: { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 },\n };\n };\n\n const startDrag = (\n mode: DragState[\"mode\"],\n origin: { x: number; y: number },\n ) => {\n drag = {\n mode,\n pointers,\n start: copyCamera(camera),\n origin,\n distance: mode === \"pinch\" ? pinchInfo().distance : 0,\n moved: false,\n };\n tween = null;\n if (hoverHit) setHover(null);\n stage.style.cursor = mode === \"rotate\" ? \"grabbing\" : \"move\";\n };\n\n const onPointerDown = (e: PointerEvent) => {\n const ia = interaction();\n if (!ia) return;\n const p = local(e);\n pointers.set(e.pointerId, p);\n stage.setPointerCapture?.(e.pointerId);\n if (pointers.size === 2 && (ia.zoom || ia.pan)) {\n startDrag(\"pinch\", pinchInfo().center);\n return;\n }\n if (pointers.size > 1) return;\n const pan = ia.pan && (e.button === 2 || e.shiftKey || e.button === 1);\n if (pan) startDrag(\"pan\", p);\n else if (ia.rotate && e.button === 0) startDrag(\"rotate\", p);\n else drag = null;\n if (pan || e.button === 1) e.preventDefault();\n };\n\n const onPointerMove = (e: PointerEvent) => {\n const p = local(e);\n lastPointer = p;\n if (pointers.has(e.pointerId)) pointers.set(e.pointerId, p);\n if (!drag) {\n if (e.pointerType === \"touch\" && pointers.size) return;\n if (\n tooltipEnabled() ||\n listeners.get(\"hover\")?.size ||\n listeners.get(\"click\")?.size\n )\n scheduleHover(p.x, p.y);\n return;\n }\n const ia = interaction();\n if (!ia) return;\n if (drag.mode === \"pinch\") {\n const { distance, center } = pinchInfo();\n const scale = drag.distance > 0 ? distance / drag.distance : 1;\n const h = fitHeight();\n setCameraInternal({\n ...drag.start,\n zoom: ia.zoom ? drag.start.zoom * scale : drag.start.zoom,\n pan: ia.pan\n ? [\n drag.start.pan[0] + (center.x - drag.origin.x) / h,\n drag.start.pan[1] + (center.y - drag.origin.y) / h,\n ]\n : drag.start.pan,\n });\n drag.moved = true;\n return;\n }\n const dx = p.x - drag.origin.x;\n const dy = p.y - drag.origin.y;\n if (!drag.moved && Math.hypot(dx, dy) < 3) return;\n drag.moved = true;\n if (drag.mode === \"pan\") {\n const h = fitHeight();\n setCameraInternal({\n ...drag.start,\n pan: [drag.start.pan[0] + dx / h, drag.start.pan[1] + dy / h],\n });\n } else {\n setCameraInternal({\n ...drag.start,\n azimuth: drag.start.azimuth - dx * DRAG_DEGREES,\n elevation: drag.start.elevation + dy * DRAG_DEGREES,\n });\n }\n };\n\n const onPointerUp = (e: PointerEvent) => {\n const wasDrag = drag;\n pointers.delete(e.pointerId);\n if (stage.hasPointerCapture?.(e.pointerId))\n stage.releasePointerCapture(e.pointerId);\n if (pointers.size === 1 && wasDrag?.mode === \"pinch\") {\n // continue with the remaining finger as a rotation\n const rest = [...pointers.values()][0]!;\n startDrag(\"rotate\", rest);\n return;\n }\n if (pointers.size) return;\n drag = null;\n stage.style.cursor = interaction()?.rotate ? \"grab\" : \"default\";\n if (wasDrag && !wasDrag.moved && e.button === 0) {\n const p = local(e);\n const hit = pickAt(p.x, p.y);\n setHover(hit);\n if (hoverEvt) emit(\"click\", hoverEvt);\n }\n if (rotating()) invalidate(false);\n };\n\n const onPointerCancel = (e: PointerEvent) => {\n pointers.delete(e.pointerId);\n if (!pointers.size) {\n drag = null;\n stage.style.cursor = interaction()?.rotate ? \"grab\" : \"default\";\n }\n };\n\n const onPointerEnter = (e: PointerEvent) => {\n if (e.pointerType !== \"touch\") pointerInside = true;\n };\n\n const onPointerLeave = () => {\n pointerInside = false;\n pendingHover = null;\n lastPointer = null;\n if (!drag && hoverHit) setHover(null);\n if (rotating()) invalidate(false);\n };\n\n const onWheel = (e: WheelEvent) => {\n const ia = interaction();\n if (!ia?.zoom) return;\n const pinch = e.ctrlKey && !e.metaKey;\n if (ia.wheel === \"modifier\" && !e.ctrlKey && !e.metaKey) return;\n e.preventDefault();\n const factor = wheelFactor(e.deltaY, e.deltaMode, pinch);\n const zoom = camera.zoom / factor;\n // keep the point under the pointer in place\n const layout = lastLayout;\n if (!layout) {\n setCameraInternal({ ...camera, zoom });\n return;\n }\n const clamped = clampCamera({ ...camera, zoom });\n const ratio = clamped.zoom / camera.zoom;\n const h = layout.fit.height;\n const cx = layout.fit.x + layout.fit.width / 2 + camera.pan[0] * h;\n const cy = layout.fit.y + layout.fit.height / 2 + camera.pan[1] * h;\n const m = local(e);\n const nx = m.x - ratio * (m.x - cx);\n const ny = m.y - ratio * (m.y - cy);\n setCameraInternal({\n ...clamped,\n pan: [camera.pan[0] + (nx - cx) / h, camera.pan[1] + (ny - cy) / h],\n });\n if (hoverHit) setHover(null);\n };\n\n const onDoubleClick = (e: MouseEvent) => {\n if (!interaction()) return;\n e.preventDefault();\n animateTo(homeCamera);\n };\n\n const onContextMenu = (e: MouseEvent) => {\n if (interaction()?.pan) e.preventDefault();\n };\n\n // a focus ring for keyboard users only\n const onFocus = () => {\n let keyboard: boolean;\n try {\n keyboard = stage.matches(\":focus-visible\");\n } catch {\n keyboard = true;\n }\n if (keyboard)\n stage.style.boxShadow = \"0 0 0 2px var(--primary-color, #4f46e5)\";\n };\n\n const onBlur = () => {\n stage.style.boxShadow = \"\";\n };\n\n const onKeyDown = (e: KeyboardEvent) => {\n const ia = interaction();\n if (!ia?.keyboard) return;\n let next: Chart3DCameraState | null = null;\n const step = e.shiftKey ? KEY_DEGREES * 3 : KEY_DEGREES;\n switch (e.key) {\n case \"ArrowLeft\":\n if (ia.rotate) next = { ...camera, azimuth: camera.azimuth + step };\n break;\n case \"ArrowRight\":\n if (ia.rotate) next = { ...camera, azimuth: camera.azimuth - step };\n break;\n case \"ArrowUp\":\n if (ia.rotate) next = { ...camera, elevation: camera.elevation + step };\n break;\n case \"ArrowDown\":\n if (ia.rotate) next = { ...camera, elevation: camera.elevation - step };\n break;\n case \"+\":\n case \"=\":\n if (ia.zoom) next = { ...camera, zoom: camera.zoom * 1.2 };\n break;\n case \"-\":\n case \"_\":\n if (ia.zoom) next = { ...camera, zoom: camera.zoom / 1.2 };\n break;\n case \"0\":\n case \"Home\":\n e.preventDefault();\n animateTo(homeCamera);\n return;\n case \"Escape\":\n lastPointer = null;\n if (hoverHit) {\n e.preventDefault();\n setHover(null);\n }\n return;\n default:\n return;\n }\n if (!next) return;\n e.preventDefault();\n setCameraInternal(next);\n };\n\n stage.addEventListener(\"pointerdown\", onPointerDown);\n stage.addEventListener(\"pointermove\", onPointerMove);\n stage.addEventListener(\"pointerup\", onPointerUp);\n stage.addEventListener(\"pointercancel\", onPointerCancel);\n stage.addEventListener(\"pointerenter\", onPointerEnter);\n stage.addEventListener(\"pointerleave\", onPointerLeave);\n stage.addEventListener(\"wheel\", onWheel, { passive: false });\n stage.addEventListener(\"dblclick\", onDoubleClick);\n stage.addEventListener(\"contextmenu\", onContextMenu);\n stage.addEventListener(\"keydown\", onKeyDown);\n stage.addEventListener(\"focus\", onFocus);\n stage.addEventListener(\"blur\", onBlur);\n\n // ----------------------------------------------------------- watchers\n\n const resizeObserver =\n typeof ResizeObserver === \"function\"\n ? new ResizeObserver(() => {\n picker.reset();\n invalidate(true);\n })\n : null;\n resizeObserver?.observe(stage);\n\n const intersection =\n typeof IntersectionObserver === \"function\"\n ? new IntersectionObserver((entries) => {\n const entry = entries[entries.length - 1];\n if (!entry) return;\n const was = visible;\n visible = entry.isIntersecting;\n if (visible && !was) invalidate(true);\n })\n : null;\n intersection?.observe(stage);\n\n const onVisibility = () => {\n if (doc.visibilityState !== \"hidden\") invalidate(false);\n };\n doc.addEventListener(\"visibilitychange\", onVisibility);\n\n // device pixel ratio changes (zoom, moving to another screen)\n let dprQuery: MediaQueryList | null = null;\n const onDprChange = () => {\n watchDpr();\n invalidate(true);\n };\n const watchDpr = () => {\n dprQuery?.removeEventListener?.(\"change\", onDprChange);\n dprQuery =\n typeof win?.matchMedia === \"function\"\n ? win.matchMedia(`(resolution: ${win.devicePixelRatio || 1}dppx)`)\n : null;\n dprQuery?.addEventListener?.(\"change\", onDprChange);\n };\n watchDpr();\n\n const onMotionChange = () => invalidate(false);\n reducedMotion?.addEventListener?.(\"change\", onMotionChange);\n\n const refreshTheme = () => {\n if (destroyed) return;\n const next = readTheme(dom.root, options.palette);\n if (themeColorsChanged(theme, next)) themeVersion++;\n theme = next;\n rebuild();\n };\n const unwatchTheme = watchTheme(refreshTheme);\n\n // texts follow the page language when no `locale` is set\n const langObserver =\n typeof win?.MutationObserver === \"function\"\n ? new win.MutationObserver(() => {\n if (\n !destroyed &&\n resolveLocale(options.locale) !== model.locale.locale\n )\n rebuild();\n })\n : null;\n langObserver?.observe(doc.documentElement, {\n attributes: true,\n attributeFilter: [\"lang\"],\n });\n\n // ----------------------------------------------------------- renderer\n\n const initRenderer = async (exclude: Set<ChartRendererKind> = new Set()) => {\n const token = ++rendererToken;\n const next = await createRenderer3D(\n options.renderer ?? \"auto\",\n () => {\n const canvas = layerCanvas(doc);\n canvas.className = \"minerva-chart-data\";\n return canvas;\n },\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 geometryDirty = true;\n if (next) {\n dom.root.dataset.renderer = next.kind;\n stage.insertBefore(next.canvas, dom.foreground);\n emit(\"renderer\", next.kind);\n } else {\n delete dom.root.dataset.renderer;\n }\n resolveReady(next?.kind ?? null);\n invalidate(true);\n };\n\n refreshColors();\n rebuild();\n void initRenderer();\n const unfollowDefault = followDefaultRenderer(\n () => options.renderer,\n () => void initRenderer(),\n );\n\n // ---------------------------------------------------------------- api\n\n const instance: Chart3DInstance = {\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 const key = JSON.stringify(next.camera ?? {});\n if (key !== cameraKey) {\n cameraKey = key;\n homeCamera = initialCamera(next.camera);\n setCameraInternal({ ...homeCamera });\n }\n if ((next.renderer ?? \"auto\") !== (previous.renderer ?? \"auto\"))\n void initRenderer();\n rebuild();\n },\n resize() {\n picker.reset();\n invalidate(true);\n },\n resetCamera() {\n setCameraInternal(copyCamera(homeCamera));\n },\n getCamera: () => copyCamera(camera),\n setCamera(next) {\n if (destroyed) return;\n setCameraInternal({\n azimuth: next.azimuth ?? camera.azimuth,\n elevation: next.elevation ?? camera.elevation,\n zoom: next.zoom ?? camera.zoom,\n pan: next.pan ? [next.pan[0], next.pan[1]] : camera.pan,\n projection: next.projection ?? camera.projection,\n });\n },\n getRenderer: () => renderer?.kind ?? null,\n ready,\n refreshTheme,\n on(type, listener) {\n let set = listeners.get(type);\n if (!set) {\n set = new Set();\n listeners.set(type, set);\n }\n set.add(listener as (e: never) => void);\n return () => {\n set.delete(listener as (e: never) => void);\n };\n },\n destroy() {\n if (destroyed) return;\n destroyed = true;\n rendererToken++;\n if (frameId) win?.cancelAnimationFrame(frameId);\n if (hoverFrame) win?.cancelAnimationFrame(hoverFrame);\n frameId = 0;\n hoverFrame = 0;\n resizeObserver?.disconnect();\n intersection?.disconnect();\n doc.removeEventListener(\"visibilitychange\", onVisibility);\n dprQuery?.removeEventListener?.(\"change\", onDprChange);\n reducedMotion?.removeEventListener?.(\"change\", onMotionChange);\n unfollowDefault();\n unwatchTheme();\n langObserver?.disconnect();\n stage.removeEventListener(\"pointerdown\", onPointerDown);\n stage.removeEventListener(\"pointermove\", onPointerMove);\n stage.removeEventListener(\"pointerup\", onPointerUp);\n stage.removeEventListener(\"pointercancel\", onPointerCancel);\n stage.removeEventListener(\"pointerenter\", onPointerEnter);\n stage.removeEventListener(\"pointerleave\", onPointerLeave);\n stage.removeEventListener(\"wheel\", onWheel);\n stage.removeEventListener(\"dblclick\", onDoubleClick);\n stage.removeEventListener(\"contextmenu\", onContextMenu);\n stage.removeEventListener(\"keydown\", onKeyDown);\n stage.removeEventListener(\"focus\", onFocus);\n stage.removeEventListener(\"blur\", onBlur);\n renderer?.destroy();\n renderer = null;\n listeners.clear();\n resolveReady(null);\n dom.root.remove();\n },\n };\n return instance;\n};\n\nfunction isDark(theme: ChartTheme): boolean {\n return luminance(theme.background) < 0.4 || luminance(theme.text) > 0.6;\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- var e=(e,t)=>(Object.assign(e.style,t),e),t={position:`absolute`,width:`1px`,height:`1px`,overflow:`hidden`,clip:`rect(0 0 0 0)`,clipPath:`inset(50%)`,whiteSpace:`nowrap`},n=0,r=t=>{let n=e(t.createElement(`canvas`),{position:`absolute`,left:`0`,top:`0`,pointerEvents:`none`});return n.setAttribute(`aria-hidden`,`true`),n},i=i=>{let a=i.ownerDocument,o=e(a.createElement(`div`),{position:`relative`,display:`flex`,flexDirection:`column`,width:`100%`,height:`100%`,minHeight:`0`,fontFamily:`var(--font-family-sans, system-ui, sans-serif)`,color:`var(--text-color, #1f2937)`});o.className=`minerva-chart minerva-chart-3d`;let s=e(a.createElement(`div`),{display:`none`,flexWrap:`wrap`,alignItems:`center`,gap:`4px 14px`,padding:`0 4px 8px`,fontSize:`12px`,lineHeight:`18px`});s.className=`minerva-chart-legend`;let c=e(a.createElement(`div`),{position:`relative`,flex:`1 1 auto`,minHeight:`0`,outline:`none`,touchAction:`none`,userSelect:`none`,borderRadius:`6px`,cursor:`grab`});c.className=`minerva-chart-stage`,c.setAttribute(`role`,`figure`),c.setAttribute(`aria-roledescription`,`3D chart`);let l=r(a),u=r(a),d=e(a.createElement(`div`),{position:`absolute`,left:`0`,top:`0`,zIndex:`2`,display:`none`,pointerEvents:`none`,minWidth:`128px`,maxWidth:`320px`,padding:`8px 12px`,borderRadius:`10px`,border:`1px solid color-mix(in srgb, var(--border-color, #e5e7eb) 60%, transparent)`,background:`var(--surface-elevated-color, var(--background-color, #fff))`,color:`var(--text-color, #1f2937)`,boxShadow:`0 12px 32px -8px rgba(15, 23, 42, 0.16), 0 4px 10px -4px rgba(15, 23, 42, 0.08)`,fontSize:`12px`,lineHeight:`20px`,whiteSpace:`nowrap`});d.className=`minerva-chart-tooltip`,d.setAttribute(`role`,`tooltip`);let f=e(a.createElement(`div`),t);f.id=`minerva-chart-3d-summary-${++n}`,c.setAttribute(`aria-describedby`,f.id);let p=e(a.createElement(`div`),t);return p.setAttribute(`aria-live`,`polite`),c.append(l,u,d,f,p),o.append(s,c),i.appendChild(o),{root:o,legend:s,stage:c,background:l,foreground:u,tooltip:d,summary:f,live:p}},a=(t,n,r)=>e(t.createElement(`span`),{display:`inline-block`,flex:`none`,width:`9px`,height:`9px`,borderRadius:r?`50%`:`2px`,background:n}),o=(e,t,n,r)=>{let i=Math.max(1,Math.round(t*r)),a=Math.max(1,Math.round(n*r));e.width!==i&&(e.width=i),e.height!==a&&(e.height=a),e.style.width=`${t}px`,e.style.height=`${n}px`};exports.createChart3DDom=i,exports.layerCanvas=r,exports.sizeCanvas=o,exports.style=e,exports.swatch=a;
1
+ const e=require("../tooltip.cjs");var t=(e,t)=>(Object.assign(e.style,t),e),n={position:`absolute`,width:`1px`,height:`1px`,overflow:`hidden`,clip:`rect(0 0 0 0)`,clipPath:`inset(50%)`,whiteSpace:`nowrap`},r=0,i=e=>{let n=t(e.createElement(`canvas`),{position:`absolute`,left:`0`,top:`0`,pointerEvents:`none`});return n.setAttribute(`aria-hidden`,`true`),n},a=a=>{let o=a.ownerDocument,s=t(o.createElement(`div`),{position:`relative`,display:`flex`,flexDirection:`column`,width:`100%`,height:`100%`,minHeight:`0`,fontFamily:`var(--font-family-sans, system-ui, sans-serif)`,color:`var(--text-color, #1f2937)`});s.className=`minerva-chart minerva-chart-3d`;let c=t(o.createElement(`div`),{display:`none`,flexWrap:`wrap`,alignItems:`center`,gap:`4px 14px`,padding:`0 4px 8px`,fontSize:`12px`,lineHeight:`18px`});c.className=`minerva-chart-legend`;let l=t(o.createElement(`div`),{position:`relative`,flex:`1 1 auto`,minHeight:`0`,outline:`none`,touchAction:`none`,userSelect:`none`,borderRadius:`6px`,cursor:`grab`});l.className=`minerva-chart-stage`,l.setAttribute(`role`,`figure`),l.setAttribute(`aria-roledescription`,`3D chart`);let u=i(o),d=i(o),f=e.styleTooltip(o.createElement(`div`),{zIndex:`2`,display:`none`,minWidth:`128px`,maxWidth:`320px`,padding:`8px 12px`,borderRadius:`10px`,fontSize:`12px`,lineHeight:`20px`,whiteSpace:`nowrap`});f.className=`minerva-chart-tooltip`,f.setAttribute(`role`,`tooltip`);let p=t(o.createElement(`div`),n);p.id=`minerva-chart-3d-summary-${++r}`,l.setAttribute(`aria-describedby`,p.id);let m=t(o.createElement(`div`),n);return m.setAttribute(`aria-live`,`polite`),l.append(u,d,f,p,m),s.append(c,l),a.appendChild(s),{root:s,legend:c,stage:l,background:u,foreground:d,tooltip:f,summary:p,live:m}},o=(e,n,r)=>t(e.createElement(`span`),{display:`inline-block`,flex:`none`,width:`9px`,height:`9px`,borderRadius:r?`50%`:`2px`,background:n}),s=(e,t,n,r)=>{let i=Math.max(1,Math.round(t*r)),a=Math.max(1,Math.round(n*r));e.width!==i&&(e.width=i),e.height!==a&&(e.height=a),e.style.width=`${t}px`,e.style.height=`${n}px`};exports.createChart3DDom=a,exports.layerCanvas=i,exports.sizeCanvas=s,exports.style=t,exports.swatch=o;
2
2
  //# sourceMappingURL=dom.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"dom.cjs","names":["style","el","css","VISUALLY_HIDDEN","nextId","layerCanvas","canvas","doc","createChart3DDom","container","root","legend","stage","background","foreground","tooltip","summary","live","swatch","round","color","sizeCanvas","w","width","dpr","h","height"],"sources":["../../../../../charts/src/engine/three-d/dom.ts"],"sourcesContent":["// DOM of a 3D chart: legend, focusable stage with the canvas layers (back\n// walls, data, labels / hover), tooltip, a visually hidden data summary and\n// a live region. Styled inline with the Minerva CSS variables.\n\nexport interface Chart3DDom {\n root: HTMLDivElement;\n legend: HTMLDivElement;\n stage: HTMLDivElement;\n /** Walls, grid lines (below the data) */\n background: HTMLCanvasElement;\n /** Tick labels, titles, color bar, hover highlight (above the data) */\n foreground: HTMLCanvasElement;\n tooltip: HTMLDivElement;\n /** Visually hidden description of the data (`aria-describedby` of the stage) */\n summary: HTMLDivElement;\n live: HTMLDivElement;\n}\n\nexport const style = <T extends HTMLElement>(\n el: T,\n css: Partial<CSSStyleDeclaration>,\n): T => {\n Object.assign(el.style, css);\n return el;\n};\n\nconst VISUALLY_HIDDEN: Partial<CSSStyleDeclaration> = {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n overflow: \"hidden\",\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n whiteSpace: \"nowrap\",\n};\n\nlet nextId = 0;\n\n/** Canvas layer covering the stage */\nexport const layerCanvas = (doc: Document): HTMLCanvasElement => {\n const canvas = style(doc.createElement(\"canvas\"), {\n position: \"absolute\",\n left: \"0\",\n top: \"0\",\n pointerEvents: \"none\",\n });\n canvas.setAttribute(\"aria-hidden\", \"true\");\n return canvas;\n};\n\nexport const createChart3DDom = (container: HTMLElement): Chart3DDom => {\n const doc = container.ownerDocument;\n const root = style(doc.createElement(\"div\"), {\n position: \"relative\",\n display: \"flex\",\n flexDirection: \"column\",\n width: \"100%\",\n height: \"100%\",\n minHeight: \"0\",\n fontFamily: \"var(--font-family-sans, system-ui, sans-serif)\",\n color: \"var(--text-color, #1f2937)\",\n });\n root.className = \"minerva-chart minerva-chart-3d\";\n\n const legend = style(doc.createElement(\"div\"), {\n display: \"none\",\n flexWrap: \"wrap\",\n alignItems: \"center\",\n gap: \"4px 14px\",\n padding: \"0 4px 8px\",\n fontSize: \"12px\",\n lineHeight: \"18px\",\n });\n legend.className = \"minerva-chart-legend\";\n\n const stage = style(doc.createElement(\"div\"), {\n position: \"relative\",\n flex: \"1 1 auto\",\n minHeight: \"0\",\n outline: \"none\",\n touchAction: \"none\",\n userSelect: \"none\",\n borderRadius: \"6px\",\n cursor: \"grab\",\n });\n stage.className = \"minerva-chart-stage\";\n stage.setAttribute(\"role\", \"figure\");\n stage.setAttribute(\"aria-roledescription\", \"3D chart\");\n\n const background = layerCanvas(doc);\n const foreground = layerCanvas(doc);\n\n const tooltip = style(doc.createElement(\"div\"), {\n position: \"absolute\",\n left: \"0\",\n top: \"0\",\n zIndex: \"2\",\n display: \"none\",\n pointerEvents: \"none\",\n minWidth: \"128px\",\n maxWidth: \"320px\",\n padding: \"8px 12px\",\n borderRadius: \"10px\",\n border:\n \"1px solid color-mix(in srgb, var(--border-color, #e5e7eb) 60%, transparent)\",\n background: \"var(--surface-elevated-color, var(--background-color, #fff))\",\n color: \"var(--text-color, #1f2937)\",\n boxShadow:\n \"0 12px 32px -8px rgba(15, 23, 42, 0.16), 0 4px 10px -4px rgba(15, 23, 42, 0.08)\",\n fontSize: \"12px\",\n lineHeight: \"20px\",\n whiteSpace: \"nowrap\",\n });\n tooltip.className = \"minerva-chart-tooltip\";\n tooltip.setAttribute(\"role\", \"tooltip\");\n\n const summary = style(doc.createElement(\"div\"), VISUALLY_HIDDEN);\n summary.id = `minerva-chart-3d-summary-${++nextId}`;\n stage.setAttribute(\"aria-describedby\", summary.id);\n\n const live = style(doc.createElement(\"div\"), VISUALLY_HIDDEN);\n live.setAttribute(\"aria-live\", \"polite\");\n\n stage.append(background, foreground, tooltip, summary, live);\n root.append(legend, stage);\n container.appendChild(root);\n return {\n root,\n legend,\n stage,\n background,\n foreground,\n tooltip,\n summary,\n live,\n };\n};\n\n/** Color square / dot of the legend and the tooltip */\nexport const swatch = (doc: Document, color: string, round: boolean) =>\n style(doc.createElement(\"span\"), {\n display: \"inline-block\",\n flex: \"none\",\n width: \"9px\",\n height: \"9px\",\n borderRadius: round ? \"50%\" : \"2px\",\n background: color,\n });\n\n/** Sizes a canvas to the stage (CSS pixels × device pixel ratio) */\nexport const sizeCanvas = (\n canvas: HTMLCanvasElement,\n width: number,\n height: number,\n dpr: number,\n): void => {\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"],"mappings":"AAkBA,IAAaA,GACX,EACA,KAEA,OAAO,OAAOC,EAAG,MAAOC,CAAG,EACpBD,GAGHE,EAAgD,CACpD,SAAU,WACV,MAAO,MACP,OAAQ,MACR,SAAU,SACV,KAAM,gBACN,SAAU,aACV,WAAY,QACd,EAEIC,EAAS,EAGAC,EAAe,GAAqC,CAC/D,IAAMC,EAASN,EAAMO,EAAI,cAAc,QAAQ,EAAG,CAChD,SAAU,WACV,KAAM,IACN,IAAK,IACL,cAAe,MACjB,CAAC,EAED,OADAD,EAAO,aAAa,cAAe,MAAM,EAClCA,CACT,EAEaE,EAAoB,GAAuC,CACtE,IAAMD,EAAME,EAAU,cAChBC,EAAOV,EAAMO,EAAI,cAAc,KAAK,EAAG,CAC3C,SAAU,WACV,QAAS,OACT,cAAe,SACf,MAAO,OACP,OAAQ,OACR,UAAW,IACX,WAAY,iDACZ,MAAO,4BACT,CAAC,EACD,EAAK,UAAY,iCAEjB,IAAMI,EAASX,EAAMO,EAAI,cAAc,KAAK,EAAG,CAC7C,QAAS,OACT,SAAU,OACV,WAAY,SACZ,IAAK,WACL,QAAS,YACT,SAAU,OACV,WAAY,MACd,CAAC,EACD,EAAO,UAAY,uBAEnB,IAAMK,EAAQZ,EAAMO,EAAI,cAAc,KAAK,EAAG,CAC5C,SAAU,WACV,KAAM,WACN,UAAW,IACX,QAAS,OACT,YAAa,OACb,WAAY,OACZ,aAAc,MACd,OAAQ,MACV,CAAC,EACD,EAAM,UAAY,sBAClBK,EAAM,aAAa,OAAQ,QAAQ,EACnCA,EAAM,aAAa,uBAAwB,UAAU,EAErD,IAAMC,EAAaR,EAAYE,CAAG,EAC5BO,EAAaT,EAAYE,CAAG,EAE5BQ,EAAUf,EAAMO,EAAI,cAAc,KAAK,EAAG,CAC9C,SAAU,WACV,KAAM,IACN,IAAK,IACL,OAAQ,IACR,QAAS,OACT,cAAe,OACf,SAAU,QACV,SAAU,QACV,QAAS,WACT,aAAc,OACd,OACE,8EACF,WAAY,+DACZ,MAAO,6BACP,UACE,kFACF,SAAU,OACV,WAAY,OACZ,WAAY,QACd,CAAC,EACD,EAAQ,UAAY,wBACpBQ,EAAQ,aAAa,OAAQ,SAAS,EAEtC,IAAMC,EAAUhB,EAAMO,EAAI,cAAc,KAAK,EAAGJ,CAAe,EAC/D,EAAQ,GAAK,4BAA4B,EAAEC,IAC3CQ,EAAM,aAAa,mBAAoBI,EAAQ,EAAE,EAEjD,IAAMC,EAAOjB,EAAMO,EAAI,cAAc,KAAK,EAAGJ,CAAe,EAM5D,OALAc,EAAK,aAAa,YAAa,QAAQ,EAEvCL,EAAM,OAAOC,EAAYC,EAAYC,EAASC,EAASC,CAAI,EAC3DP,EAAK,OAAOC,EAAQC,CAAK,EACzBH,EAAU,YAAYC,CAAI,EACnB,CACL,OACA,SACA,QACA,aACA,aACA,UACA,UACA,MACF,CACF,EAGaQ,GAAU,EAAe,EAAe,IACnDlB,EAAMO,EAAI,cAAc,MAAM,EAAG,CAC/B,QAAS,eACT,KAAM,OACN,MAAO,MACP,OAAQ,MACR,aAAcY,EAAQ,MAAQ,MAC9B,WAAYC,CACd,CAAC,EAGUC,GACX,EACA,EACA,EACA,IACS,CACT,IAAMC,EAAI,KAAK,IAAI,EAAG,KAAK,MAAMC,EAAQC,CAAG,CAAC,EACvCC,EAAI,KAAK,IAAI,EAAG,KAAK,MAAMC,EAASF,CAAG,CAAC,EAC1ClB,EAAO,QAAUgB,IAAG,EAAO,MAAQA,GACnChB,EAAO,SAAWmB,IAAG,EAAO,OAASA,GACzC,EAAO,MAAM,MAAQ,GAAGF,EAAM,IAC9B,EAAO,MAAM,OAAS,GAAGG,EAAO,GAClC"}
1
+ {"version":3,"file":"dom.cjs","names":["styleTooltip","require_tooltip","style","el","css","VISUALLY_HIDDEN","nextId","layerCanvas","canvas","doc","createChart3DDom","container","root","legend","stage","background","foreground","tooltip","summary","live","swatch","round","color","sizeCanvas","w","width","dpr","h","height"],"sources":["../../../../../charts/src/engine/three-d/dom.ts"],"sourcesContent":["// DOM of a 3D chart: legend, focusable stage with the canvas layers (back\n// walls, data, labels / hover), tooltip, a visually hidden data summary and\n// a live region. Styled inline with the Minerva CSS variables.\n\nimport { styleTooltip } from \"../tooltip\";\n\nexport interface Chart3DDom {\n root: HTMLDivElement;\n legend: HTMLDivElement;\n stage: HTMLDivElement;\n /** Walls, grid lines (below the data) */\n background: HTMLCanvasElement;\n /** Tick labels, titles, color bar, hover highlight (above the data) */\n foreground: HTMLCanvasElement;\n tooltip: HTMLDivElement;\n /** Visually hidden description of the data (`aria-describedby` of the stage) */\n summary: HTMLDivElement;\n live: HTMLDivElement;\n}\n\nexport const style = <T extends HTMLElement>(\n el: T,\n css: Partial<CSSStyleDeclaration>,\n): T => {\n Object.assign(el.style, css);\n return el;\n};\n\nconst VISUALLY_HIDDEN: Partial<CSSStyleDeclaration> = {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n overflow: \"hidden\",\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n whiteSpace: \"nowrap\",\n};\n\nlet nextId = 0;\n\n/** Canvas layer covering the stage */\nexport const layerCanvas = (doc: Document): HTMLCanvasElement => {\n const canvas = style(doc.createElement(\"canvas\"), {\n position: \"absolute\",\n left: \"0\",\n top: \"0\",\n pointerEvents: \"none\",\n });\n canvas.setAttribute(\"aria-hidden\", \"true\");\n return canvas;\n};\n\nexport const createChart3DDom = (container: HTMLElement): Chart3DDom => {\n const doc = container.ownerDocument;\n const root = style(doc.createElement(\"div\"), {\n position: \"relative\",\n display: \"flex\",\n flexDirection: \"column\",\n width: \"100%\",\n height: \"100%\",\n minHeight: \"0\",\n fontFamily: \"var(--font-family-sans, system-ui, sans-serif)\",\n color: \"var(--text-color, #1f2937)\",\n });\n root.className = \"minerva-chart minerva-chart-3d\";\n\n const legend = style(doc.createElement(\"div\"), {\n display: \"none\",\n flexWrap: \"wrap\",\n alignItems: \"center\",\n gap: \"4px 14px\",\n padding: \"0 4px 8px\",\n fontSize: \"12px\",\n lineHeight: \"18px\",\n });\n legend.className = \"minerva-chart-legend\";\n\n const stage = style(doc.createElement(\"div\"), {\n position: \"relative\",\n flex: \"1 1 auto\",\n minHeight: \"0\",\n outline: \"none\",\n touchAction: \"none\",\n userSelect: \"none\",\n borderRadius: \"6px\",\n cursor: \"grab\",\n });\n stage.className = \"minerva-chart-stage\";\n stage.setAttribute(\"role\", \"figure\");\n stage.setAttribute(\"aria-roledescription\", \"3D chart\");\n\n const background = layerCanvas(doc);\n const foreground = layerCanvas(doc);\n\n const tooltip = styleTooltip(doc.createElement(\"div\"), {\n zIndex: \"2\",\n display: \"none\",\n minWidth: \"128px\",\n maxWidth: \"320px\",\n padding: \"8px 12px\",\n borderRadius: \"10px\",\n fontSize: \"12px\",\n lineHeight: \"20px\",\n whiteSpace: \"nowrap\",\n });\n tooltip.className = \"minerva-chart-tooltip\";\n tooltip.setAttribute(\"role\", \"tooltip\");\n\n const summary = style(doc.createElement(\"div\"), VISUALLY_HIDDEN);\n summary.id = `minerva-chart-3d-summary-${++nextId}`;\n stage.setAttribute(\"aria-describedby\", summary.id);\n\n const live = style(doc.createElement(\"div\"), VISUALLY_HIDDEN);\n live.setAttribute(\"aria-live\", \"polite\");\n\n stage.append(background, foreground, tooltip, summary, live);\n root.append(legend, stage);\n container.appendChild(root);\n return {\n root,\n legend,\n stage,\n background,\n foreground,\n tooltip,\n summary,\n live,\n };\n};\n\n/** Color square / dot of the legend and the tooltip */\nexport const swatch = (doc: Document, color: string, round: boolean) =>\n style(doc.createElement(\"span\"), {\n display: \"inline-block\",\n flex: \"none\",\n width: \"9px\",\n height: \"9px\",\n borderRadius: round ? \"50%\" : \"2px\",\n background: color,\n });\n\n/** Sizes a canvas to the stage (CSS pixels × device pixel ratio) */\nexport const sizeCanvas = (\n canvas: HTMLCanvasElement,\n width: number,\n height: number,\n dpr: number,\n): void => {\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"],"mappings":"kCAoBA,IAAaE,GACX,EACA,KAEA,OAAO,OAAOC,EAAG,MAAOC,CAAG,EACpBD,GAGHE,EAAgD,CACpD,SAAU,WACV,MAAO,MACP,OAAQ,MACR,SAAU,SACV,KAAM,gBACN,SAAU,aACV,WAAY,QACd,EAEIC,EAAS,EAGAC,EAAe,GAAqC,CAC/D,IAAMC,EAASN,EAAMO,EAAI,cAAc,QAAQ,EAAG,CAChD,SAAU,WACV,KAAM,IACN,IAAK,IACL,cAAe,MACjB,CAAC,EAED,OADAD,EAAO,aAAa,cAAe,MAAM,EAClCA,CACT,EAEaE,EAAoB,GAAuC,CACtE,IAAMD,EAAME,EAAU,cAChBC,EAAOV,EAAMO,EAAI,cAAc,KAAK,EAAG,CAC3C,SAAU,WACV,QAAS,OACT,cAAe,SACf,MAAO,OACP,OAAQ,OACR,UAAW,IACX,WAAY,iDACZ,MAAO,4BACT,CAAC,EACD,EAAK,UAAY,iCAEjB,IAAMI,EAASX,EAAMO,EAAI,cAAc,KAAK,EAAG,CAC7C,QAAS,OACT,SAAU,OACV,WAAY,SACZ,IAAK,WACL,QAAS,YACT,SAAU,OACV,WAAY,MACd,CAAC,EACD,EAAO,UAAY,uBAEnB,IAAMK,EAAQZ,EAAMO,EAAI,cAAc,KAAK,EAAG,CAC5C,SAAU,WACV,KAAM,WACN,UAAW,IACX,QAAS,OACT,YAAa,OACb,WAAY,OACZ,aAAc,MACd,OAAQ,MACV,CAAC,EACD,EAAM,UAAY,sBAClBK,EAAM,aAAa,OAAQ,QAAQ,EACnCA,EAAM,aAAa,uBAAwB,UAAU,EAErD,IAAMC,EAAaR,EAAYE,CAAG,EAC5BO,EAAaT,EAAYE,CAAG,EAE5BQ,EAAUjB,EAAAA,aAAaS,EAAI,cAAc,KAAK,EAAG,CACrD,OAAQ,IACR,QAAS,OACT,SAAU,QACV,SAAU,QACV,QAAS,WACT,aAAc,OACd,SAAU,OACV,WAAY,OACZ,WAAY,QACd,CAAC,EACD,EAAQ,UAAY,wBACpBQ,EAAQ,aAAa,OAAQ,SAAS,EAEtC,IAAMC,EAAUhB,EAAMO,EAAI,cAAc,KAAK,EAAGJ,CAAe,EAC/D,EAAQ,GAAK,4BAA4B,EAAEC,IAC3CQ,EAAM,aAAa,mBAAoBI,EAAQ,EAAE,EAEjD,IAAMC,EAAOjB,EAAMO,EAAI,cAAc,KAAK,EAAGJ,CAAe,EAM5D,OALAc,EAAK,aAAa,YAAa,QAAQ,EAEvCL,EAAM,OAAOC,EAAYC,EAAYC,EAASC,EAASC,CAAI,EAC3DP,EAAK,OAAOC,EAAQC,CAAK,EACzBH,EAAU,YAAYC,CAAI,EACnB,CACL,OACA,SACA,QACA,aACA,aACA,UACA,UACA,MACF,CACF,EAGaQ,GAAU,EAAe,EAAe,IACnDlB,EAAMO,EAAI,cAAc,MAAM,EAAG,CAC/B,QAAS,eACT,KAAM,OACN,MAAO,MACP,OAAQ,MACR,aAAcY,EAAQ,MAAQ,MAC9B,WAAYC,CACd,CAAC,EAGUC,GACX,EACA,EACA,EACA,IACS,CACT,IAAMC,EAAI,KAAK,IAAI,EAAG,KAAK,MAAMC,EAAQC,CAAG,CAAC,EACvCC,EAAI,KAAK,IAAI,EAAG,KAAK,MAAMC,EAASF,CAAG,CAAC,EAC1ClB,EAAO,QAAUgB,IAAG,EAAO,MAAQA,GACnChB,EAAO,SAAWmB,IAAG,EAAO,OAASA,GACzC,EAAO,MAAM,MAAQ,GAAGF,EAAM,IAC9B,EAAO,MAAM,OAAS,GAAGG,EAAO,GAClC"}
@@ -1,5 +1,6 @@
1
+ import { styleTooltip as e } from "../tooltip.js";
1
2
  //#region src/engine/three-d/dom.ts
2
- var e = (e, t) => (Object.assign(e.style, t), e), t = {
3
+ var t = (e, t) => (Object.assign(e.style, t), e), n = {
3
4
  position: "absolute",
4
5
  width: "1px",
5
6
  height: "1px",
@@ -7,16 +8,16 @@ var e = (e, t) => (Object.assign(e.style, t), e), t = {
7
8
  clip: "rect(0 0 0 0)",
8
9
  clipPath: "inset(50%)",
9
10
  whiteSpace: "nowrap"
10
- }, n = 0, r = (t) => {
11
- let n = e(t.createElement("canvas"), {
11
+ }, r = 0, i = (e) => {
12
+ let n = t(e.createElement("canvas"), {
12
13
  position: "absolute",
13
14
  left: "0",
14
15
  top: "0",
15
16
  pointerEvents: "none"
16
17
  });
17
18
  return n.setAttribute("aria-hidden", "true"), n;
18
- }, i = (i) => {
19
- let a = i.ownerDocument, o = e(a.createElement("div"), {
19
+ }, a = (a) => {
20
+ let o = a.ownerDocument, s = t(o.createElement("div"), {
20
21
  position: "relative",
21
22
  display: "flex",
22
23
  flexDirection: "column",
@@ -26,8 +27,8 @@ var e = (e, t) => (Object.assign(e.style, t), e), t = {
26
27
  fontFamily: "var(--font-family-sans, system-ui, sans-serif)",
27
28
  color: "var(--text-color, #1f2937)"
28
29
  });
29
- o.className = "minerva-chart minerva-chart-3d";
30
- let s = e(a.createElement("div"), {
30
+ s.className = "minerva-chart minerva-chart-3d";
31
+ let c = t(o.createElement("div"), {
31
32
  display: "none",
32
33
  flexWrap: "wrap",
33
34
  alignItems: "center",
@@ -36,8 +37,8 @@ var e = (e, t) => (Object.assign(e.style, t), e), t = {
36
37
  fontSize: "12px",
37
38
  lineHeight: "18px"
38
39
  });
39
- s.className = "minerva-chart-legend";
40
- let c = e(a.createElement("div"), {
40
+ c.className = "minerva-chart-legend";
41
+ let l = t(o.createElement("div"), {
41
42
  position: "relative",
42
43
  flex: "1 1 auto",
43
44
  minHeight: "0",
@@ -47,52 +48,44 @@ var e = (e, t) => (Object.assign(e.style, t), e), t = {
47
48
  borderRadius: "6px",
48
49
  cursor: "grab"
49
50
  });
50
- c.className = "minerva-chart-stage", c.setAttribute("role", "figure"), c.setAttribute("aria-roledescription", "3D chart");
51
- let l = r(a), u = r(a), d = e(a.createElement("div"), {
52
- position: "absolute",
53
- left: "0",
54
- top: "0",
51
+ l.className = "minerva-chart-stage", l.setAttribute("role", "figure"), l.setAttribute("aria-roledescription", "3D chart");
52
+ let u = i(o), d = i(o), f = e(o.createElement("div"), {
55
53
  zIndex: "2",
56
54
  display: "none",
57
- pointerEvents: "none",
58
55
  minWidth: "128px",
59
56
  maxWidth: "320px",
60
57
  padding: "8px 12px",
61
58
  borderRadius: "10px",
62
- border: "1px solid color-mix(in srgb, var(--border-color, #e5e7eb) 60%, transparent)",
63
- background: "var(--surface-elevated-color, var(--background-color, #fff))",
64
- color: "var(--text-color, #1f2937)",
65
- boxShadow: "0 12px 32px -8px rgba(15, 23, 42, 0.16), 0 4px 10px -4px rgba(15, 23, 42, 0.08)",
66
59
  fontSize: "12px",
67
60
  lineHeight: "20px",
68
61
  whiteSpace: "nowrap"
69
62
  });
70
- d.className = "minerva-chart-tooltip", d.setAttribute("role", "tooltip");
71
- let f = e(a.createElement("div"), t);
72
- f.id = `minerva-chart-3d-summary-${++n}`, c.setAttribute("aria-describedby", f.id);
73
- let p = e(a.createElement("div"), t);
74
- return p.setAttribute("aria-live", "polite"), c.append(l, u, d, f, p), o.append(s, c), i.appendChild(o), {
75
- root: o,
76
- legend: s,
77
- stage: c,
78
- background: l,
79
- foreground: u,
80
- tooltip: d,
81
- summary: f,
82
- live: p
63
+ f.className = "minerva-chart-tooltip", f.setAttribute("role", "tooltip");
64
+ let p = t(o.createElement("div"), n);
65
+ p.id = `minerva-chart-3d-summary-${++r}`, l.setAttribute("aria-describedby", p.id);
66
+ let m = t(o.createElement("div"), n);
67
+ return m.setAttribute("aria-live", "polite"), l.append(u, d, f, p, m), s.append(c, l), a.appendChild(s), {
68
+ root: s,
69
+ legend: c,
70
+ stage: l,
71
+ background: u,
72
+ foreground: d,
73
+ tooltip: f,
74
+ summary: p,
75
+ live: m
83
76
  };
84
- }, a = (t, n, r) => e(t.createElement("span"), {
77
+ }, o = (e, n, r) => t(e.createElement("span"), {
85
78
  display: "inline-block",
86
79
  flex: "none",
87
80
  width: "9px",
88
81
  height: "9px",
89
82
  borderRadius: r ? "50%" : "2px",
90
83
  background: n
91
- }), o = (e, t, n, r) => {
84
+ }), s = (e, t, n, r) => {
92
85
  let i = Math.max(1, Math.round(t * r)), a = Math.max(1, Math.round(n * r));
93
86
  e.width !== i && (e.width = i), e.height !== a && (e.height = a), e.style.width = `${t}px`, e.style.height = `${n}px`;
94
87
  };
95
88
  //#endregion
96
- export { i as createChart3DDom, r as layerCanvas, o as sizeCanvas, e as style, a as swatch };
89
+ export { a as createChart3DDom, i as layerCanvas, s as sizeCanvas, t as style, o as swatch };
97
90
 
98
91
  //# sourceMappingURL=dom.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dom.js","names":["style","el","css","VISUALLY_HIDDEN","nextId","layerCanvas","canvas","doc","createChart3DDom","container","root","legend","stage","background","foreground","tooltip","summary","live","swatch","round","color","sizeCanvas","w","width","dpr","h","height"],"sources":["../../../../../charts/src/engine/three-d/dom.ts"],"sourcesContent":["// DOM of a 3D chart: legend, focusable stage with the canvas layers (back\n// walls, data, labels / hover), tooltip, a visually hidden data summary and\n// a live region. Styled inline with the Minerva CSS variables.\n\nexport interface Chart3DDom {\n root: HTMLDivElement;\n legend: HTMLDivElement;\n stage: HTMLDivElement;\n /** Walls, grid lines (below the data) */\n background: HTMLCanvasElement;\n /** Tick labels, titles, color bar, hover highlight (above the data) */\n foreground: HTMLCanvasElement;\n tooltip: HTMLDivElement;\n /** Visually hidden description of the data (`aria-describedby` of the stage) */\n summary: HTMLDivElement;\n live: HTMLDivElement;\n}\n\nexport const style = <T extends HTMLElement>(\n el: T,\n css: Partial<CSSStyleDeclaration>,\n): T => {\n Object.assign(el.style, css);\n return el;\n};\n\nconst VISUALLY_HIDDEN: Partial<CSSStyleDeclaration> = {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n overflow: \"hidden\",\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n whiteSpace: \"nowrap\",\n};\n\nlet nextId = 0;\n\n/** Canvas layer covering the stage */\nexport const layerCanvas = (doc: Document): HTMLCanvasElement => {\n const canvas = style(doc.createElement(\"canvas\"), {\n position: \"absolute\",\n left: \"0\",\n top: \"0\",\n pointerEvents: \"none\",\n });\n canvas.setAttribute(\"aria-hidden\", \"true\");\n return canvas;\n};\n\nexport const createChart3DDom = (container: HTMLElement): Chart3DDom => {\n const doc = container.ownerDocument;\n const root = style(doc.createElement(\"div\"), {\n position: \"relative\",\n display: \"flex\",\n flexDirection: \"column\",\n width: \"100%\",\n height: \"100%\",\n minHeight: \"0\",\n fontFamily: \"var(--font-family-sans, system-ui, sans-serif)\",\n color: \"var(--text-color, #1f2937)\",\n });\n root.className = \"minerva-chart minerva-chart-3d\";\n\n const legend = style(doc.createElement(\"div\"), {\n display: \"none\",\n flexWrap: \"wrap\",\n alignItems: \"center\",\n gap: \"4px 14px\",\n padding: \"0 4px 8px\",\n fontSize: \"12px\",\n lineHeight: \"18px\",\n });\n legend.className = \"minerva-chart-legend\";\n\n const stage = style(doc.createElement(\"div\"), {\n position: \"relative\",\n flex: \"1 1 auto\",\n minHeight: \"0\",\n outline: \"none\",\n touchAction: \"none\",\n userSelect: \"none\",\n borderRadius: \"6px\",\n cursor: \"grab\",\n });\n stage.className = \"minerva-chart-stage\";\n stage.setAttribute(\"role\", \"figure\");\n stage.setAttribute(\"aria-roledescription\", \"3D chart\");\n\n const background = layerCanvas(doc);\n const foreground = layerCanvas(doc);\n\n const tooltip = style(doc.createElement(\"div\"), {\n position: \"absolute\",\n left: \"0\",\n top: \"0\",\n zIndex: \"2\",\n display: \"none\",\n pointerEvents: \"none\",\n minWidth: \"128px\",\n maxWidth: \"320px\",\n padding: \"8px 12px\",\n borderRadius: \"10px\",\n border:\n \"1px solid color-mix(in srgb, var(--border-color, #e5e7eb) 60%, transparent)\",\n background: \"var(--surface-elevated-color, var(--background-color, #fff))\",\n color: \"var(--text-color, #1f2937)\",\n boxShadow:\n \"0 12px 32px -8px rgba(15, 23, 42, 0.16), 0 4px 10px -4px rgba(15, 23, 42, 0.08)\",\n fontSize: \"12px\",\n lineHeight: \"20px\",\n whiteSpace: \"nowrap\",\n });\n tooltip.className = \"minerva-chart-tooltip\";\n tooltip.setAttribute(\"role\", \"tooltip\");\n\n const summary = style(doc.createElement(\"div\"), VISUALLY_HIDDEN);\n summary.id = `minerva-chart-3d-summary-${++nextId}`;\n stage.setAttribute(\"aria-describedby\", summary.id);\n\n const live = style(doc.createElement(\"div\"), VISUALLY_HIDDEN);\n live.setAttribute(\"aria-live\", \"polite\");\n\n stage.append(background, foreground, tooltip, summary, live);\n root.append(legend, stage);\n container.appendChild(root);\n return {\n root,\n legend,\n stage,\n background,\n foreground,\n tooltip,\n summary,\n live,\n };\n};\n\n/** Color square / dot of the legend and the tooltip */\nexport const swatch = (doc: Document, color: string, round: boolean) =>\n style(doc.createElement(\"span\"), {\n display: \"inline-block\",\n flex: \"none\",\n width: \"9px\",\n height: \"9px\",\n borderRadius: round ? \"50%\" : \"2px\",\n background: color,\n });\n\n/** Sizes a canvas to the stage (CSS pixels × device pixel ratio) */\nexport const sizeCanvas = (\n canvas: HTMLCanvasElement,\n width: number,\n height: number,\n dpr: number,\n): void => {\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"],"mappings":";AAkBA,IAAaA,KACX,GACA,OAEA,OAAO,OAAOC,EAAG,OAAOC,CAAG,GACpBD,IAGHE,IAAgD;CACpD,UAAU;CACV,OAAO;CACP,QAAQ;CACR,UAAU;CACV,MAAM;CACN,UAAU;CACV,YAAY;AACd,GAEIC,IAAS,GAGAC,KAAe,MAAqC;CAC/D,IAAMC,IAASN,EAAMO,EAAI,cAAc,QAAQ,GAAG;EAChD,UAAU;EACV,MAAM;EACN,KAAK;EACL,eAAe;CACjB,CAAC;CAED,OADAD,EAAO,aAAa,eAAe,MAAM,GAClCA;AACT,GAEaE,KAAoB,MAAuC;CACtE,IAAMD,IAAME,EAAU,eAChBC,IAAOV,EAAMO,EAAI,cAAc,KAAK,GAAG;EAC3C,UAAU;EACV,SAAS;EACT,eAAe;EACf,OAAO;EACP,QAAQ;EACR,WAAW;EACX,YAAY;EACZ,OAAO;CACT,CAAC;CACD,EAAK,YAAY;CAEjB,IAAMI,IAASX,EAAMO,EAAI,cAAc,KAAK,GAAG;EAC7C,SAAS;EACT,UAAU;EACV,YAAY;EACZ,KAAK;EACL,SAAS;EACT,UAAU;EACV,YAAY;CACd,CAAC;CACD,EAAO,YAAY;CAEnB,IAAMK,IAAQZ,EAAMO,EAAI,cAAc,KAAK,GAAG;EAC5C,UAAU;EACV,MAAM;EACN,WAAW;EACX,SAAS;EACT,aAAa;EACb,YAAY;EACZ,cAAc;EACd,QAAQ;CACV,CAAC;CAGD,AAFA,EAAM,YAAY,uBAClBK,EAAM,aAAa,QAAQ,QAAQ,GACnCA,EAAM,aAAa,wBAAwB,UAAU;CAErD,IAAMC,IAAaR,EAAYE,CAAG,GAC5BO,IAAaT,EAAYE,CAAG,GAE5BQ,IAAUf,EAAMO,EAAI,cAAc,KAAK,GAAG;EAC9C,UAAU;EACV,MAAM;EACN,KAAK;EACL,QAAQ;EACR,SAAS;EACT,eAAe;EACf,UAAU;EACV,UAAU;EACV,SAAS;EACT,cAAc;EACd,QACE;EACF,YAAY;EACZ,OAAO;EACP,WACE;EACF,UAAU;EACV,YAAY;EACZ,YAAY;CACd,CAAC;CAED,AADA,EAAQ,YAAY,yBACpBQ,EAAQ,aAAa,QAAQ,SAAS;CAEtC,IAAMC,IAAUhB,EAAMO,EAAI,cAAc,KAAK,GAAGJ,CAAe;CAE/D,AADA,EAAQ,KAAK,4BAA4B,EAAEC,KAC3CQ,EAAM,aAAa,oBAAoBI,EAAQ,EAAE;CAEjD,IAAMC,IAAOjB,EAAMO,EAAI,cAAc,KAAK,GAAGJ,CAAe;CAM5D,OALAc,EAAK,aAAa,aAAa,QAAQ,GAEvCL,EAAM,OAAOC,GAAYC,GAAYC,GAASC,GAASC,CAAI,GAC3DP,EAAK,OAAOC,GAAQC,CAAK,GACzBH,EAAU,YAAYC,CAAI,GACnB;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF,GAGaQ,KAAU,GAAe,GAAe,MACnDlB,EAAMO,EAAI,cAAc,MAAM,GAAG;CAC/B,SAAS;CACT,MAAM;CACN,OAAO;CACP,QAAQ;CACR,cAAcY,IAAQ,QAAQ;CAC9B,YAAYC;AACd,CAAC,GAGUC,KACX,GACA,GACA,GACA,MACS;CACT,IAAMC,IAAI,KAAK,IAAI,GAAG,KAAK,MAAMC,IAAQC,CAAG,CAAC,GACvCC,IAAI,KAAK,IAAI,GAAG,KAAK,MAAMC,IAASF,CAAG,CAAC;CAI9C,AAHIlB,EAAO,UAAUgB,MAAG,EAAO,QAAQA,IACnChB,EAAO,WAAWmB,MAAG,EAAO,SAASA,IACzC,EAAO,MAAM,QAAQ,GAAGF,EAAM,KAC9B,EAAO,MAAM,SAAS,GAAGG,EAAO;AAClC"}
1
+ {"version":3,"file":"dom.js","names":["style","el","css","VISUALLY_HIDDEN","nextId","layerCanvas","canvas","doc","createChart3DDom","container","root","legend","stage","background","foreground","tooltip","styleTooltip","summary","live","swatch","round","color","sizeCanvas","w","width","dpr","h","height"],"sources":["../../../../../charts/src/engine/three-d/dom.ts"],"sourcesContent":["// DOM of a 3D chart: legend, focusable stage with the canvas layers (back\n// walls, data, labels / hover), tooltip, a visually hidden data summary and\n// a live region. Styled inline with the Minerva CSS variables.\n\nimport { styleTooltip } from \"../tooltip\";\n\nexport interface Chart3DDom {\n root: HTMLDivElement;\n legend: HTMLDivElement;\n stage: HTMLDivElement;\n /** Walls, grid lines (below the data) */\n background: HTMLCanvasElement;\n /** Tick labels, titles, color bar, hover highlight (above the data) */\n foreground: HTMLCanvasElement;\n tooltip: HTMLDivElement;\n /** Visually hidden description of the data (`aria-describedby` of the stage) */\n summary: HTMLDivElement;\n live: HTMLDivElement;\n}\n\nexport const style = <T extends HTMLElement>(\n el: T,\n css: Partial<CSSStyleDeclaration>,\n): T => {\n Object.assign(el.style, css);\n return el;\n};\n\nconst VISUALLY_HIDDEN: Partial<CSSStyleDeclaration> = {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n overflow: \"hidden\",\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n whiteSpace: \"nowrap\",\n};\n\nlet nextId = 0;\n\n/** Canvas layer covering the stage */\nexport const layerCanvas = (doc: Document): HTMLCanvasElement => {\n const canvas = style(doc.createElement(\"canvas\"), {\n position: \"absolute\",\n left: \"0\",\n top: \"0\",\n pointerEvents: \"none\",\n });\n canvas.setAttribute(\"aria-hidden\", \"true\");\n return canvas;\n};\n\nexport const createChart3DDom = (container: HTMLElement): Chart3DDom => {\n const doc = container.ownerDocument;\n const root = style(doc.createElement(\"div\"), {\n position: \"relative\",\n display: \"flex\",\n flexDirection: \"column\",\n width: \"100%\",\n height: \"100%\",\n minHeight: \"0\",\n fontFamily: \"var(--font-family-sans, system-ui, sans-serif)\",\n color: \"var(--text-color, #1f2937)\",\n });\n root.className = \"minerva-chart minerva-chart-3d\";\n\n const legend = style(doc.createElement(\"div\"), {\n display: \"none\",\n flexWrap: \"wrap\",\n alignItems: \"center\",\n gap: \"4px 14px\",\n padding: \"0 4px 8px\",\n fontSize: \"12px\",\n lineHeight: \"18px\",\n });\n legend.className = \"minerva-chart-legend\";\n\n const stage = style(doc.createElement(\"div\"), {\n position: \"relative\",\n flex: \"1 1 auto\",\n minHeight: \"0\",\n outline: \"none\",\n touchAction: \"none\",\n userSelect: \"none\",\n borderRadius: \"6px\",\n cursor: \"grab\",\n });\n stage.className = \"minerva-chart-stage\";\n stage.setAttribute(\"role\", \"figure\");\n stage.setAttribute(\"aria-roledescription\", \"3D chart\");\n\n const background = layerCanvas(doc);\n const foreground = layerCanvas(doc);\n\n const tooltip = styleTooltip(doc.createElement(\"div\"), {\n zIndex: \"2\",\n display: \"none\",\n minWidth: \"128px\",\n maxWidth: \"320px\",\n padding: \"8px 12px\",\n borderRadius: \"10px\",\n fontSize: \"12px\",\n lineHeight: \"20px\",\n whiteSpace: \"nowrap\",\n });\n tooltip.className = \"minerva-chart-tooltip\";\n tooltip.setAttribute(\"role\", \"tooltip\");\n\n const summary = style(doc.createElement(\"div\"), VISUALLY_HIDDEN);\n summary.id = `minerva-chart-3d-summary-${++nextId}`;\n stage.setAttribute(\"aria-describedby\", summary.id);\n\n const live = style(doc.createElement(\"div\"), VISUALLY_HIDDEN);\n live.setAttribute(\"aria-live\", \"polite\");\n\n stage.append(background, foreground, tooltip, summary, live);\n root.append(legend, stage);\n container.appendChild(root);\n return {\n root,\n legend,\n stage,\n background,\n foreground,\n tooltip,\n summary,\n live,\n };\n};\n\n/** Color square / dot of the legend and the tooltip */\nexport const swatch = (doc: Document, color: string, round: boolean) =>\n style(doc.createElement(\"span\"), {\n display: \"inline-block\",\n flex: \"none\",\n width: \"9px\",\n height: \"9px\",\n borderRadius: round ? \"50%\" : \"2px\",\n background: color,\n });\n\n/** Sizes a canvas to the stage (CSS pixels × device pixel ratio) */\nexport const sizeCanvas = (\n canvas: HTMLCanvasElement,\n width: number,\n height: number,\n dpr: number,\n): void => {\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"],"mappings":";;AAoBA,IAAaA,KACX,GACA,OAEA,OAAO,OAAOC,EAAG,OAAOC,CAAG,GACpBD,IAGHE,IAAgD;CACpD,UAAU;CACV,OAAO;CACP,QAAQ;CACR,UAAU;CACV,MAAM;CACN,UAAU;CACV,YAAY;AACd,GAEIC,IAAS,GAGAC,KAAe,MAAqC;CAC/D,IAAMC,IAASN,EAAMO,EAAI,cAAc,QAAQ,GAAG;EAChD,UAAU;EACV,MAAM;EACN,KAAK;EACL,eAAe;CACjB,CAAC;CAED,OADAD,EAAO,aAAa,eAAe,MAAM,GAClCA;AACT,GAEaE,KAAoB,MAAuC;CACtE,IAAMD,IAAME,EAAU,eAChBC,IAAOV,EAAMO,EAAI,cAAc,KAAK,GAAG;EAC3C,UAAU;EACV,SAAS;EACT,eAAe;EACf,OAAO;EACP,QAAQ;EACR,WAAW;EACX,YAAY;EACZ,OAAO;CACT,CAAC;CACD,EAAK,YAAY;CAEjB,IAAMI,IAASX,EAAMO,EAAI,cAAc,KAAK,GAAG;EAC7C,SAAS;EACT,UAAU;EACV,YAAY;EACZ,KAAK;EACL,SAAS;EACT,UAAU;EACV,YAAY;CACd,CAAC;CACD,EAAO,YAAY;CAEnB,IAAMK,IAAQZ,EAAMO,EAAI,cAAc,KAAK,GAAG;EAC5C,UAAU;EACV,MAAM;EACN,WAAW;EACX,SAAS;EACT,aAAa;EACb,YAAY;EACZ,cAAc;EACd,QAAQ;CACV,CAAC;CAGD,AAFA,EAAM,YAAY,uBAClBK,EAAM,aAAa,QAAQ,QAAQ,GACnCA,EAAM,aAAa,wBAAwB,UAAU;CAErD,IAAMC,IAAaR,EAAYE,CAAG,GAC5BO,IAAaT,EAAYE,CAAG,GAE5BQ,IAAUC,EAAaT,EAAI,cAAc,KAAK,GAAG;EACrD,QAAQ;EACR,SAAS;EACT,UAAU;EACV,UAAU;EACV,SAAS;EACT,cAAc;EACd,UAAU;EACV,YAAY;EACZ,YAAY;CACd,CAAC;CAED,AADA,EAAQ,YAAY,yBACpBQ,EAAQ,aAAa,QAAQ,SAAS;CAEtC,IAAME,IAAUjB,EAAMO,EAAI,cAAc,KAAK,GAAGJ,CAAe;CAE/D,AADA,EAAQ,KAAK,4BAA4B,EAAEC,KAC3CQ,EAAM,aAAa,oBAAoBK,EAAQ,EAAE;CAEjD,IAAMC,IAAOlB,EAAMO,EAAI,cAAc,KAAK,GAAGJ,CAAe;CAM5D,OALAe,EAAK,aAAa,aAAa,QAAQ,GAEvCN,EAAM,OAAOC,GAAYC,GAAYC,GAASE,GAASC,CAAI,GAC3DR,EAAK,OAAOC,GAAQC,CAAK,GACzBH,EAAU,YAAYC,CAAI,GACnB;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF,GAGaS,KAAU,GAAe,GAAe,MACnDnB,EAAMO,EAAI,cAAc,MAAM,GAAG;CAC/B,SAAS;CACT,MAAM;CACN,OAAO;CACP,QAAQ;CACR,cAAca,IAAQ,QAAQ;CAC9B,YAAYC;AACd,CAAC,GAGUC,KACX,GACA,GACA,GACA,MACS;CACT,IAAMC,IAAI,KAAK,IAAI,GAAG,KAAK,MAAMC,IAAQC,CAAG,CAAC,GACvCC,IAAI,KAAK,IAAI,GAAG,KAAK,MAAMC,IAASF,CAAG,CAAC;CAI9C,AAHInB,EAAO,UAAUiB,MAAG,EAAO,QAAQA,IACnCjB,EAAO,WAAWoB,MAAG,EAAO,SAASA,IACzC,EAAO,MAAM,QAAQ,GAAGF,EAAM,KAC9B,EAAO,MAAM,SAAS,GAAGG,EAAO;AAClC"}