minerva-design 1.2.0 → 1.3.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 (256) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/charts/canvas.d.cts +4 -1
  3. package/dist/charts/canvas.d.ts +4 -1
  4. package/dist/charts/core.cjs +1 -1
  5. package/dist/charts/core.d.cts +5 -2
  6. package/dist/charts/core.d.ts +5 -2
  7. package/dist/charts/core.js +6 -4
  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 +65 -53
  11. package/dist/charts/engine/canvas.js.map +1 -1
  12. package/dist/charts/engine/chart.cjs +1 -2
  13. package/dist/charts/engine/chart.cjs.map +1 -1
  14. package/dist/charts/engine/chart.js +342 -323
  15. package/dist/charts/engine/chart.js.map +1 -1
  16. package/dist/charts/engine/color.cjs +1 -1
  17. package/dist/charts/engine/color.cjs.map +1 -1
  18. package/dist/charts/engine/color.d.cts +17 -0
  19. package/dist/charts/engine/color.d.ts +17 -0
  20. package/dist/charts/engine/color.js +27 -3
  21. package/dist/charts/engine/color.js.map +1 -1
  22. package/dist/charts/engine/controller.cjs +2 -2
  23. package/dist/charts/engine/controller.cjs.map +1 -1
  24. package/dist/charts/engine/controller.d.cts +6 -0
  25. package/dist/charts/engine/controller.d.ts +6 -0
  26. package/dist/charts/engine/controller.js +317 -253
  27. package/dist/charts/engine/controller.js.map +1 -1
  28. package/dist/charts/engine/curve.cjs +2 -0
  29. package/dist/charts/engine/curve.cjs.map +1 -0
  30. package/dist/charts/engine/curve.d.cts +15 -0
  31. package/dist/charts/engine/curve.d.ts +15 -0
  32. package/dist/charts/engine/curve.js +56 -0
  33. package/dist/charts/engine/curve.js.map +1 -0
  34. package/dist/charts/engine/data.cjs +1 -1
  35. package/dist/charts/engine/data.cjs.map +1 -1
  36. package/dist/charts/engine/data.d.cts +15 -2
  37. package/dist/charts/engine/data.d.ts +15 -2
  38. package/dist/charts/engine/data.js +98 -38
  39. package/dist/charts/engine/data.js.map +1 -1
  40. package/dist/charts/engine/dom.cjs +1 -1
  41. package/dist/charts/engine/dom.cjs.map +1 -1
  42. package/dist/charts/engine/dom.d.cts +5 -3
  43. package/dist/charts/engine/dom.d.ts +5 -3
  44. package/dist/charts/engine/dom.js +27 -22
  45. package/dist/charts/engine/dom.js.map +1 -1
  46. package/dist/charts/engine/items.cjs +1 -1
  47. package/dist/charts/engine/items.cjs.map +1 -1
  48. package/dist/charts/engine/items.js +132 -61
  49. package/dist/charts/engine/items.js.map +1 -1
  50. package/dist/charts/engine/model.cjs +1 -1
  51. package/dist/charts/engine/model.cjs.map +1 -1
  52. package/dist/charts/engine/model.d.cts +30 -3
  53. package/dist/charts/engine/model.d.ts +30 -3
  54. package/dist/charts/engine/model.js +225 -108
  55. package/dist/charts/engine/model.js.map +1 -1
  56. package/dist/charts/engine/overlay.cjs +1 -1
  57. package/dist/charts/engine/overlay.cjs.map +1 -1
  58. package/dist/charts/engine/overlay.d.cts +2 -0
  59. package/dist/charts/engine/overlay.d.ts +2 -0
  60. package/dist/charts/engine/overlay.js +16 -16
  61. package/dist/charts/engine/overlay.js.map +1 -1
  62. package/dist/charts/engine/presets.cjs +2 -2
  63. package/dist/charts/engine/presets.cjs.map +1 -1
  64. package/dist/charts/engine/presets.d.cts +71 -5
  65. package/dist/charts/engine/presets.d.ts +71 -5
  66. package/dist/charts/engine/presets.js +120 -33
  67. package/dist/charts/engine/presets.js.map +1 -1
  68. package/dist/charts/engine/renderers/canvas2d.cjs +1 -1
  69. package/dist/charts/engine/renderers/canvas2d.cjs.map +1 -1
  70. package/dist/charts/engine/renderers/canvas2d.js +149 -111
  71. package/dist/charts/engine/renderers/canvas2d.js.map +1 -1
  72. package/dist/charts/engine/renderers/range.cjs +1 -1
  73. package/dist/charts/engine/renderers/range.cjs.map +1 -1
  74. package/dist/charts/engine/renderers/range.js +4 -4
  75. package/dist/charts/engine/renderers/range.js.map +1 -1
  76. package/dist/charts/engine/renderers/shaders.cjs +37 -19
  77. package/dist/charts/engine/renderers/shaders.cjs.map +1 -1
  78. package/dist/charts/engine/renderers/shaders.d.cts +2 -2
  79. package/dist/charts/engine/renderers/shaders.d.ts +2 -2
  80. package/dist/charts/engine/renderers/shaders.js +37 -19
  81. package/dist/charts/engine/renderers/shaders.js.map +1 -1
  82. package/dist/charts/engine/renderers/types.cjs.map +1 -1
  83. package/dist/charts/engine/renderers/types.d.cts +11 -4
  84. package/dist/charts/engine/renderers/types.d.ts +11 -4
  85. package/dist/charts/engine/renderers/types.js.map +1 -1
  86. package/dist/charts/engine/renderers/webgl2.cjs +1 -1
  87. package/dist/charts/engine/renderers/webgl2.cjs.map +1 -1
  88. package/dist/charts/engine/renderers/webgl2.js +33 -12
  89. package/dist/charts/engine/renderers/webgl2.js.map +1 -1
  90. package/dist/charts/engine/renderers/webgpu.cjs +1 -1
  91. package/dist/charts/engine/renderers/webgpu.cjs.map +1 -1
  92. package/dist/charts/engine/renderers/webgpu.js +18 -15
  93. package/dist/charts/engine/renderers/webgpu.js.map +1 -1
  94. package/dist/charts/engine/scene.cjs +1 -1
  95. package/dist/charts/engine/scene.cjs.map +1 -1
  96. package/dist/charts/engine/scene.d.cts +19 -6
  97. package/dist/charts/engine/scene.d.ts +19 -6
  98. package/dist/charts/engine/scene.js +201 -89
  99. package/dist/charts/engine/scene.js.map +1 -1
  100. package/dist/charts/engine/shapes/canvas.cjs +2 -0
  101. package/dist/charts/engine/shapes/canvas.cjs.map +1 -0
  102. package/dist/charts/engine/shapes/canvas.d.cts +58 -0
  103. package/dist/charts/engine/shapes/canvas.d.ts +58 -0
  104. package/dist/charts/engine/shapes/canvas.js +159 -0
  105. package/dist/charts/engine/shapes/canvas.js.map +1 -0
  106. package/dist/charts/engine/shapes/chart.cjs +2 -0
  107. package/dist/charts/engine/shapes/chart.cjs.map +1 -0
  108. package/dist/charts/engine/shapes/chart.d.cts +6 -0
  109. package/dist/charts/engine/shapes/chart.d.ts +6 -0
  110. package/dist/charts/engine/shapes/chart.js +273 -0
  111. package/dist/charts/engine/shapes/chart.js.map +1 -0
  112. package/dist/charts/engine/shapes/draw.cjs +2 -0
  113. package/dist/charts/engine/shapes/draw.cjs.map +1 -0
  114. package/dist/charts/engine/shapes/draw.d.cts +20 -0
  115. package/dist/charts/engine/shapes/draw.d.ts +20 -0
  116. package/dist/charts/engine/shapes/draw.js +152 -0
  117. package/dist/charts/engine/shapes/draw.js.map +1 -0
  118. package/dist/charts/engine/shapes/funnel.cjs +2 -0
  119. package/dist/charts/engine/shapes/funnel.cjs.map +1 -0
  120. package/dist/charts/engine/shapes/funnel.d.cts +6 -0
  121. package/dist/charts/engine/shapes/funnel.d.ts +6 -0
  122. package/dist/charts/engine/shapes/funnel.js +149 -0
  123. package/dist/charts/engine/shapes/funnel.js.map +1 -0
  124. package/dist/charts/engine/shapes/gauge.cjs +2 -0
  125. package/dist/charts/engine/shapes/gauge.cjs.map +1 -0
  126. package/dist/charts/engine/shapes/gauge.d.cts +7 -0
  127. package/dist/charts/engine/shapes/gauge.d.ts +7 -0
  128. package/dist/charts/engine/shapes/gauge.js +173 -0
  129. package/dist/charts/engine/shapes/gauge.js.map +1 -0
  130. package/dist/charts/engine/shapes/hit.cjs +2 -0
  131. package/dist/charts/engine/shapes/hit.cjs.map +1 -0
  132. package/dist/charts/engine/shapes/hit.d.cts +28 -0
  133. package/dist/charts/engine/shapes/hit.d.ts +28 -0
  134. package/dist/charts/engine/shapes/hit.js +124 -0
  135. package/dist/charts/engine/shapes/hit.js.map +1 -0
  136. package/dist/charts/engine/shapes/index.d.cts +9 -0
  137. package/dist/charts/engine/shapes/index.d.ts +9 -0
  138. package/dist/charts/engine/shapes/layout.cjs +3 -0
  139. package/dist/charts/engine/shapes/layout.cjs.map +1 -0
  140. package/dist/charts/engine/shapes/layout.d.cts +88 -0
  141. package/dist/charts/engine/shapes/layout.d.ts +88 -0
  142. package/dist/charts/engine/shapes/layout.js +266 -0
  143. package/dist/charts/engine/shapes/layout.js.map +1 -0
  144. package/dist/charts/engine/shapes/pie.cjs +2 -0
  145. package/dist/charts/engine/shapes/pie.cjs.map +1 -0
  146. package/dist/charts/engine/shapes/pie.d.cts +20 -0
  147. package/dist/charts/engine/shapes/pie.d.ts +20 -0
  148. package/dist/charts/engine/shapes/pie.js +302 -0
  149. package/dist/charts/engine/shapes/pie.js.map +1 -0
  150. package/dist/charts/engine/shapes/radar.cjs +2 -0
  151. package/dist/charts/engine/shapes/radar.cjs.map +1 -0
  152. package/dist/charts/engine/shapes/radar.d.cts +8 -0
  153. package/dist/charts/engine/shapes/radar.d.ts +8 -0
  154. package/dist/charts/engine/shapes/radar.js +197 -0
  155. package/dist/charts/engine/shapes/radar.js.map +1 -0
  156. package/dist/charts/engine/shapes/runtime.cjs +2 -0
  157. package/dist/charts/engine/shapes/runtime.cjs.map +1 -0
  158. package/dist/charts/engine/shapes/runtime.d.cts +29 -0
  159. package/dist/charts/engine/shapes/runtime.d.ts +29 -0
  160. package/dist/charts/engine/shapes/runtime.js +97 -0
  161. package/dist/charts/engine/shapes/runtime.js.map +1 -0
  162. package/dist/charts/engine/shapes/scene.cjs +2 -0
  163. package/dist/charts/engine/shapes/scene.cjs.map +1 -0
  164. package/dist/charts/engine/shapes/scene.d.cts +257 -0
  165. package/dist/charts/engine/shapes/scene.d.ts +257 -0
  166. package/dist/charts/engine/shapes/scene.js +123 -0
  167. package/dist/charts/engine/shapes/scene.js.map +1 -0
  168. package/dist/charts/engine/shapes/treemap.cjs +2 -0
  169. package/dist/charts/engine/shapes/treemap.cjs.map +1 -0
  170. package/dist/charts/engine/shapes/treemap.d.cts +14 -0
  171. package/dist/charts/engine/shapes/treemap.d.ts +14 -0
  172. package/dist/charts/engine/shapes/treemap.js +213 -0
  173. package/dist/charts/engine/shapes/treemap.js.map +1 -0
  174. package/dist/charts/engine/shapes/types.d.cts +292 -0
  175. package/dist/charts/engine/shapes/types.d.ts +292 -0
  176. package/dist/charts/engine/signature.cjs +2 -0
  177. package/dist/charts/engine/signature.cjs.map +1 -0
  178. package/dist/charts/engine/signature.d.cts +9 -0
  179. package/dist/charts/engine/signature.d.ts +9 -0
  180. package/dist/charts/engine/signature.js +13 -0
  181. package/dist/charts/engine/signature.js.map +1 -0
  182. package/dist/charts/engine/theme.cjs +1 -1
  183. package/dist/charts/engine/theme.cjs.map +1 -1
  184. package/dist/charts/engine/theme.d.cts +10 -1
  185. package/dist/charts/engine/theme.d.ts +10 -1
  186. package/dist/charts/engine/theme.js +40 -16
  187. package/dist/charts/engine/theme.js.map +1 -1
  188. package/dist/charts/engine/types.d.cts +70 -9
  189. package/dist/charts/engine/types.d.ts +70 -9
  190. package/dist/charts/index.cjs +1 -1
  191. package/dist/charts/index.d.cts +4 -2
  192. package/dist/charts/index.d.ts +4 -2
  193. package/dist/charts/index.js +8 -5
  194. package/dist/charts/react/Chart.cjs +1 -1
  195. package/dist/charts/react/Chart.cjs.map +1 -1
  196. package/dist/charts/react/Chart.d.cts +8 -1
  197. package/dist/charts/react/Chart.d.ts +8 -1
  198. package/dist/charts/react/Chart.js +66 -47
  199. package/dist/charts/react/Chart.js.map +1 -1
  200. package/dist/charts/react/charts.cjs +1 -1
  201. package/dist/charts/react/charts.cjs.map +1 -1
  202. package/dist/charts/react/charts.d.cts +10 -2
  203. package/dist/charts/react/charts.d.ts +10 -2
  204. package/dist/charts/react/charts.js +174 -51
  205. package/dist/charts/react/charts.js.map +1 -1
  206. package/dist/charts/react/shapes.cjs +2 -0
  207. package/dist/charts/react/shapes.cjs.map +1 -0
  208. package/dist/charts/react/shapes.d.cts +255 -0
  209. package/dist/charts/react/shapes.d.ts +255 -0
  210. package/dist/charts/react/shapes.js +242 -0
  211. package/dist/charts/react/shapes.js.map +1 -0
  212. package/dist/charts/react/types.d.cts +73 -4
  213. package/dist/charts/react/types.d.ts +73 -4
  214. package/dist/native/charts/src/engine/color.cjs +1 -1
  215. package/dist/native/charts/src/engine/color.cjs.map +1 -1
  216. package/dist/native/charts/src/engine/color.js +12 -3
  217. package/dist/native/charts/src/engine/color.js.map +1 -1
  218. package/dist/native/charts/src/engine/controller.cjs +2 -2
  219. package/dist/native/charts/src/engine/controller.cjs.map +1 -1
  220. package/dist/native/charts/src/engine/controller.js +334 -270
  221. package/dist/native/charts/src/engine/controller.js.map +1 -1
  222. package/dist/native/charts/src/engine/curve.cjs +2 -0
  223. package/dist/native/charts/src/engine/curve.cjs.map +1 -0
  224. package/dist/native/charts/src/engine/curve.js +56 -0
  225. package/dist/native/charts/src/engine/curve.js.map +1 -0
  226. package/dist/native/charts/src/engine/data.cjs +1 -1
  227. package/dist/native/charts/src/engine/data.cjs.map +1 -1
  228. package/dist/native/charts/src/engine/data.js +98 -38
  229. package/dist/native/charts/src/engine/data.js.map +1 -1
  230. package/dist/native/charts/src/engine/model.cjs +1 -1
  231. package/dist/native/charts/src/engine/model.cjs.map +1 -1
  232. package/dist/native/charts/src/engine/model.js +229 -112
  233. package/dist/native/charts/src/engine/model.js.map +1 -1
  234. package/dist/native/charts/src/engine/overlay.cjs +1 -1
  235. package/dist/native/charts/src/engine/overlay.cjs.map +1 -1
  236. package/dist/native/charts/src/engine/overlay.js +16 -16
  237. package/dist/native/charts/src/engine/overlay.js.map +1 -1
  238. package/dist/native/charts/src/engine/presets.cjs +1 -1
  239. package/dist/native/charts/src/engine/presets.cjs.map +1 -1
  240. package/dist/native/charts/src/engine/presets.js +11 -4
  241. package/dist/native/charts/src/engine/presets.js.map +1 -1
  242. package/dist/native/charts/src/engine/scene.cjs +1 -1
  243. package/dist/native/charts/src/engine/scene.cjs.map +1 -1
  244. package/dist/native/charts/src/engine/scene.js +209 -97
  245. package/dist/native/charts/src/engine/scene.js.map +1 -1
  246. package/dist/native/charts/src/engine/theme.cjs.map +1 -1
  247. package/dist/native/charts/src/engine/theme.js.map +1 -1
  248. package/dist/native/components/Chart/scene.cjs +1 -1
  249. package/dist/native/components/Chart/scene.cjs.map +1 -1
  250. package/dist/native/components/Chart/scene.js +31 -19
  251. package/dist/native/components/Chart/scene.js.map +1 -1
  252. package/dist/native/source/components/Chart/scene.tsx +54 -20
  253. package/dist/taro/index.js +1059 -579
  254. package/dist/uni/charts-canvas.js +3 -1
  255. package/dist/weapp/controls.js +966 -225
  256. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hit.cjs","names":["TAU","padAngleAt","sectorPad","require_scene","require_draw","VERTEX_RADIUS","wrapFrom","d","a","from","pointInSector","dx","x","s","dy","y","span","half","off","pointInPolygon","n","points","inside","i","j","xi","yi","xj","yj","polygonArea","nodeContains","node","hitRadar","radar","scene","best","bestD","k","area","index","indicator","diff","angle","hitTestShapes","enter","valid","it","current","hoverAnchor","item","hover","ind","stepHover","items","pos","first","direction","forward","count","next"],"sources":["../../../../../charts/src/engine/shapes/hit.ts"],"sourcesContent":["// Hit testing of a ShapeScene and keyboard navigation between its items.\n\nimport { padAngleAt, sectorPad } from \"./draw\";\nimport { TAU, type ShapeHover, type ShapeNode, type ShapeScene } from \"./scene\";\n\n/** Distance (px) under which a radar vertex is picked */\nconst VERTEX_RADIUS = 12;\n\n/** Angle `a` brought into [from, from + 2π) */\nconst wrapFrom = (a: number, from: number) => {\n let d = (a - from) % TAU;\n if (d < 0) d += TAU;\n return from + d;\n};\n\n/** Whether a point is in an annular sector (gaps included, corners approximated) */\nexport const pointInSector = (\n x: number,\n y: number,\n s: {\n cx: number;\n cy: number;\n r0: number;\n r1: number;\n a0: number;\n a1: number;\n pad?: number;\n },\n): boolean => {\n const dx = x - s.cx;\n const dy = y - s.cy;\n const d = Math.hypot(dx, dy);\n if (d > s.r1 || d < s.r0) return false;\n const span = s.a1 - s.a0;\n if (span >= TAU - 1e-6) return true;\n if (span <= 0) return false;\n const a = wrapFrom(Math.atan2(dy, dx), s.a0);\n const half = (s.pad ?? 0) / 2;\n const off = half > 0 ? padAngleAt(half, d) : 0;\n return a >= s.a0 + off && a <= s.a1 - off;\n};\n\n/** Even-odd test of a point in a polygon given as a flat x, y list */\nexport const pointInPolygon = (\n x: number,\n y: number,\n points: readonly number[],\n): boolean => {\n const n = points.length >> 1;\n let inside = false;\n for (let i = 0, j = n - 1; i < n; j = i++) {\n const xi = points[i * 2];\n const yi = points[i * 2 + 1];\n const xj = points[j * 2];\n const yj = points[j * 2 + 1];\n if (yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi)\n inside = !inside;\n }\n return inside;\n};\n\nconst polygonArea = (points: readonly number[]) => {\n const n = points.length >> 1;\n let a = 0;\n for (let i = 0, j = n - 1; i < n; j = i++)\n a += points[j * 2] * points[i * 2 + 1] - points[i * 2] * points[j * 2 + 1];\n return Math.abs(a) / 2;\n};\n\nconst nodeContains = (node: ShapeNode, x: number, y: number): boolean => {\n switch (node.kind) {\n case \"sector\":\n return pointInSector(x, y, { ...node, pad: sectorPad(node) });\n case \"polygon\":\n return (\n pointInPolygon(x, y, node.points) &&\n !(node.hole && pointInPolygon(x, y, node.hole))\n );\n case \"rect\":\n return (\n x >= node.x &&\n x <= node.x + node.width &&\n y >= node.y &&\n y <= node.y + node.height\n );\n case \"circle\":\n return Math.hypot(x - node.cx, y - node.cy) <= node.r;\n case \"arc\": {\n const d = Math.hypot(x - node.cx, y - node.cy);\n if (Math.abs(d - node.r) > node.width / 2 + 4) return false;\n if (node.a1 - node.a0 >= TAU - 1e-6) return true;\n const a = wrapFrom(Math.atan2(y - node.cy, x - node.cx), node.a0);\n return a <= node.a1;\n }\n default:\n return false;\n }\n};\n\n/** Radar: the vertex under the pointer, else the smallest polygon containing it */\nconst hitRadar = (\n scene: ShapeScene,\n x: number,\n y: number,\n): ShapeHover | null => {\n const radar = scene.radar;\n if (!radar || !radar.series.length) return null;\n let best: ShapeHover | null = null;\n let bestD = VERTEX_RADIUS;\n for (const s of radar.series) {\n for (let k = 0; k < s.points.length >> 1; k++) {\n const d = Math.hypot(x - s.points[k * 2], y - s.points[k * 2 + 1]);\n if (d <= bestD) {\n bestD = d;\n best = { index: s.index, indicator: k };\n }\n }\n }\n if (best) return best;\n let area = Infinity;\n let index = -1;\n for (const s of radar.series) {\n if (s.points.length < 6 || !pointInPolygon(x, y, s.points)) continue;\n const a = polygonArea(s.points);\n if (a < area) {\n area = a;\n index = s.index;\n }\n }\n if (index < 0) return null;\n // nearest indicator by angle\n const a = Math.atan2(y - radar.cy, x - radar.cx);\n let indicator = 0;\n let diff = Infinity;\n radar.angles.forEach((angle, k) => {\n const d = Math.abs(wrapFrom(a - angle + Math.PI, 0) - Math.PI);\n if (d < diff) {\n diff = d;\n indicator = k;\n }\n });\n return { index, indicator };\n};\n\n/**\n * Item under a point (CSS pixels). `current` is the hovered item: its\n * popped-out geometry also counts so a moved slice keeps the hover.\n */\nexport const hitTestShapes = (\n scene: ShapeScene,\n x: number,\n y: number,\n current: ShapeHover | null = null,\n): ShapeHover | null => {\n if (scene.empty) return null;\n if (scene.type === \"radar\") return hitRadar(scene, x, y);\n const enter = scene.enter;\n if (enter && enter.scale > 0 && enter.scale !== 1) {\n x = enter.cx + (x - enter.cx) / enter.scale;\n y = enter.cy + (y - enter.cy) / enter.scale;\n }\n const valid = new Set(scene.items.map((it) => it.index));\n for (let i = scene.nodes.length - 1; i >= 0; i--) {\n const node = scene.nodes[i];\n if (node.hit === undefined || !valid.has(node.hit)) continue;\n if (node.kind === \"text\" || node.kind === \"line\") continue;\n if (nodeContains(node, x, y)) return { index: node.hit };\n if (current?.index === node.hit && node.shift) {\n const [dx, dy] = node.shift;\n if (nodeContains(node, x - dx, y - dy)) return { index: node.hit };\n }\n }\n return null;\n};\n\n/** Where the tooltip of a keyboard-focused item goes */\nexport const hoverAnchor = (\n scene: ShapeScene,\n hover: ShapeHover,\n): { x: number; y: number } | null => {\n const item = scene.items.find((it) => it.index === hover.index);\n if (!item) return null;\n const ind =\n hover.indicator !== undefined ? item.indicators?.[hover.indicator] : null;\n return ind ? { x: ind.x, y: ind.y } : { x: item.x, y: item.y };\n};\n\n/**\n * Next focused item for the arrow keys: `next` / `prev` walk the items\n * (radar: the indicators of the series), `up` / `down` the radar series.\n */\nexport const stepHover = (\n scene: ShapeScene,\n current: ShapeHover | null,\n direction: \"next\" | \"prev\" | \"up\" | \"down\",\n): ShapeHover | null => {\n const items = scene.items;\n if (!items.length) return null;\n const pos = current\n ? items.findIndex((it) => it.index === current.index)\n : -1;\n const radar = scene.type === \"radar\";\n if (pos < 0) {\n const first =\n direction === \"prev\" || direction === \"up\" ? items.length - 1 : 0;\n return radar\n ? { index: items[first].index, indicator: 0 }\n : { index: items[first].index };\n }\n const forward = direction === \"next\" || direction === \"down\";\n if (radar && (direction === \"next\" || direction === \"prev\")) {\n const count = items[pos].indicators?.length ?? 1;\n const k = current?.indicator ?? 0;\n return {\n index: items[pos].index,\n indicator: (k + (forward ? 1 : -1) + count) % count,\n };\n }\n const next = items[(pos + (forward ? 1 : -1) + items.length) % items.length];\n return radar\n ? { index: next.index, indicator: current?.indicator ?? 0 }\n : { index: next.index };\n};\n"],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { ShapeHover, ShapeScene } from './scene.cjs';
2
+ /** Whether a point is in an annular sector (gaps included, corners approximated) */
3
+ export declare const pointInSector: (x: number, y: number, s: {
4
+ cx: number;
5
+ cy: number;
6
+ r0: number;
7
+ r1: number;
8
+ a0: number;
9
+ a1: number;
10
+ pad?: number;
11
+ }) => boolean;
12
+ /** Even-odd test of a point in a polygon given as a flat x, y list */
13
+ export declare const pointInPolygon: (x: number, y: number, points: readonly number[]) => boolean;
14
+ /**
15
+ * Item under a point (CSS pixels). `current` is the hovered item: its
16
+ * popped-out geometry also counts so a moved slice keeps the hover.
17
+ */
18
+ export declare const hitTestShapes: (scene: ShapeScene, x: number, y: number, current?: ShapeHover | null) => ShapeHover | null;
19
+ /** Where the tooltip of a keyboard-focused item goes */
20
+ export declare const hoverAnchor: (scene: ShapeScene, hover: ShapeHover) => {
21
+ x: number;
22
+ y: number;
23
+ } | null;
24
+ /**
25
+ * Next focused item for the arrow keys: `next` / `prev` walk the items
26
+ * (radar: the indicators of the series), `up` / `down` the radar series.
27
+ */
28
+ export declare const stepHover: (scene: ShapeScene, current: ShapeHover | null, direction: "next" | "prev" | "up" | "down") => ShapeHover | null;
@@ -0,0 +1,28 @@
1
+ import { ShapeHover, ShapeScene } from './scene.js';
2
+ /** Whether a point is in an annular sector (gaps included, corners approximated) */
3
+ export declare const pointInSector: (x: number, y: number, s: {
4
+ cx: number;
5
+ cy: number;
6
+ r0: number;
7
+ r1: number;
8
+ a0: number;
9
+ a1: number;
10
+ pad?: number;
11
+ }) => boolean;
12
+ /** Even-odd test of a point in a polygon given as a flat x, y list */
13
+ export declare const pointInPolygon: (x: number, y: number, points: readonly number[]) => boolean;
14
+ /**
15
+ * Item under a point (CSS pixels). `current` is the hovered item: its
16
+ * popped-out geometry also counts so a moved slice keeps the hover.
17
+ */
18
+ export declare const hitTestShapes: (scene: ShapeScene, x: number, y: number, current?: ShapeHover | null) => ShapeHover | null;
19
+ /** Where the tooltip of a keyboard-focused item goes */
20
+ export declare const hoverAnchor: (scene: ShapeScene, hover: ShapeHover) => {
21
+ x: number;
22
+ y: number;
23
+ } | null;
24
+ /**
25
+ * Next focused item for the arrow keys: `next` / `prev` walk the items
26
+ * (radar: the indicators of the series), `up` / `down` the radar series.
27
+ */
28
+ export declare const stepHover: (scene: ShapeScene, current: ShapeHover | null, direction: "next" | "prev" | "up" | "down") => ShapeHover | null;
@@ -0,0 +1,124 @@
1
+ import { TAU as e } from "./scene.js";
2
+ import { padAngleAt as t, sectorPad as n } from "./draw.js";
3
+ //#region src/engine/shapes/hit.ts
4
+ var r = 12, i = (t, n) => {
5
+ let r = (t - n) % e;
6
+ return r < 0 && (r += e), n + r;
7
+ }, a = (n, r, a) => {
8
+ let o = n - a.cx, s = r - a.cy, c = Math.hypot(o, s);
9
+ if (c > a.r1 || c < a.r0) return !1;
10
+ let l = a.a1 - a.a0;
11
+ if (l >= e - 1e-6) return !0;
12
+ if (l <= 0) return !1;
13
+ let u = i(Math.atan2(s, o), a.a0), d = (a.pad ?? 0) / 2, f = d > 0 ? t(d, c) : 0;
14
+ return u >= a.a0 + f && u <= a.a1 - f;
15
+ }, o = (e, t, n) => {
16
+ let r = n.length >> 1, i = !1;
17
+ for (let a = 0, o = r - 1; a < r; o = a++) {
18
+ let r = n[a * 2], s = n[a * 2 + 1], c = n[o * 2], l = n[o * 2 + 1];
19
+ s > t != l > t && e < (c - r) * (t - s) / (l - s) + r && (i = !i);
20
+ }
21
+ return i;
22
+ }, s = (e) => {
23
+ let t = e.length >> 1, n = 0;
24
+ for (let r = 0, i = t - 1; r < t; i = r++) n += e[i * 2] * e[r * 2 + 1] - e[r * 2] * e[i * 2 + 1];
25
+ return Math.abs(n) / 2;
26
+ }, c = (t, r, s) => {
27
+ switch (t.kind) {
28
+ case "sector": return a(r, s, {
29
+ ...t,
30
+ pad: n(t)
31
+ });
32
+ case "polygon": return o(r, s, t.points) && !(t.hole && o(r, s, t.hole));
33
+ case "rect": return r >= t.x && r <= t.x + t.width && s >= t.y && s <= t.y + t.height;
34
+ case "circle": return Math.hypot(r - t.cx, s - t.cy) <= t.r;
35
+ case "arc": {
36
+ let n = Math.hypot(r - t.cx, s - t.cy);
37
+ return Math.abs(n - t.r) > t.width / 2 + 4 ? !1 : t.a1 - t.a0 >= e - 1e-6 || i(Math.atan2(s - t.cy, r - t.cx), t.a0) <= t.a1;
38
+ }
39
+ default: return !1;
40
+ }
41
+ }, l = (e, t, n) => {
42
+ let a = e.radar;
43
+ if (!a || !a.series.length) return null;
44
+ let c = null, l = r;
45
+ for (let e of a.series) for (let r = 0; r < e.points.length >> 1; r++) {
46
+ let i = Math.hypot(t - e.points[r * 2], n - e.points[r * 2 + 1]);
47
+ i <= l && (l = i, c = {
48
+ index: e.index,
49
+ indicator: r
50
+ });
51
+ }
52
+ if (c) return c;
53
+ let u = Infinity, d = -1;
54
+ for (let e of a.series) {
55
+ if (e.points.length < 6 || !o(t, n, e.points)) continue;
56
+ let r = s(e.points);
57
+ r < u && (u = r, d = e.index);
58
+ }
59
+ if (d < 0) return null;
60
+ let f = Math.atan2(n - a.cy, t - a.cx), p = 0, m = Infinity;
61
+ return a.angles.forEach((e, t) => {
62
+ let n = Math.abs(i(f - e + Math.PI, 0) - Math.PI);
63
+ n < m && (m = n, p = t);
64
+ }), {
65
+ index: d,
66
+ indicator: p
67
+ };
68
+ }, u = (e, t, n, r = null) => {
69
+ if (e.empty) return null;
70
+ if (e.type === "radar") return l(e, t, n);
71
+ let i = e.enter;
72
+ i && i.scale > 0 && i.scale !== 1 && (t = i.cx + (t - i.cx) / i.scale, n = i.cy + (n - i.cy) / i.scale);
73
+ let a = new Set(e.items.map((e) => e.index));
74
+ for (let i = e.nodes.length - 1; i >= 0; i--) {
75
+ let o = e.nodes[i];
76
+ if (o.hit !== void 0 && a.has(o.hit) && o.kind !== "text" && o.kind !== "line") {
77
+ if (c(o, t, n)) return { index: o.hit };
78
+ if (r?.index === o.hit && o.shift) {
79
+ let [e, r] = o.shift;
80
+ if (c(o, t - e, n - r)) return { index: o.hit };
81
+ }
82
+ }
83
+ }
84
+ return null;
85
+ }, d = (e, t) => {
86
+ let n = e.items.find((e) => e.index === t.index);
87
+ if (!n) return null;
88
+ let r = t.indicator === void 0 ? null : n.indicators?.[t.indicator];
89
+ return r ? {
90
+ x: r.x,
91
+ y: r.y
92
+ } : {
93
+ x: n.x,
94
+ y: n.y
95
+ };
96
+ }, f = (e, t, n) => {
97
+ let r = e.items;
98
+ if (!r.length) return null;
99
+ let i = t ? r.findIndex((e) => e.index === t.index) : -1, a = e.type === "radar";
100
+ if (i < 0) {
101
+ let e = n === "prev" || n === "up" ? r.length - 1 : 0;
102
+ return a ? {
103
+ index: r[e].index,
104
+ indicator: 0
105
+ } : { index: r[e].index };
106
+ }
107
+ let o = n === "next" || n === "down";
108
+ if (a && (n === "next" || n === "prev")) {
109
+ let e = r[i].indicators?.length ?? 1, n = t?.indicator ?? 0;
110
+ return {
111
+ index: r[i].index,
112
+ indicator: (n + (o ? 1 : -1) + e) % e
113
+ };
114
+ }
115
+ let s = r[(i + (o ? 1 : -1) + r.length) % r.length];
116
+ return a ? {
117
+ index: s.index,
118
+ indicator: t?.indicator ?? 0
119
+ } : { index: s.index };
120
+ };
121
+ //#endregion
122
+ export { u as hitTestShapes, d as hoverAnchor, o as pointInPolygon, a as pointInSector, f as stepHover };
123
+
124
+ //# sourceMappingURL=hit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hit.js","names":["VERTEX_RADIUS","wrapFrom","d","a","from","TAU","pointInSector","dx","x","s","dy","y","span","half","off","padAngleAt","pointInPolygon","n","points","inside","i","j","xi","yi","xj","yj","polygonArea","nodeContains","node","sectorPad","hitRadar","radar","scene","best","bestD","k","area","index","indicator","diff","angle","hitTestShapes","enter","valid","it","current","hoverAnchor","item","hover","ind","stepHover","items","pos","first","direction","forward","count","next"],"sources":["../../../../../charts/src/engine/shapes/hit.ts"],"sourcesContent":["// Hit testing of a ShapeScene and keyboard navigation between its items.\n\nimport { padAngleAt, sectorPad } from \"./draw\";\nimport { TAU, type ShapeHover, type ShapeNode, type ShapeScene } from \"./scene\";\n\n/** Distance (px) under which a radar vertex is picked */\nconst VERTEX_RADIUS = 12;\n\n/** Angle `a` brought into [from, from + 2π) */\nconst wrapFrom = (a: number, from: number) => {\n let d = (a - from) % TAU;\n if (d < 0) d += TAU;\n return from + d;\n};\n\n/** Whether a point is in an annular sector (gaps included, corners approximated) */\nexport const pointInSector = (\n x: number,\n y: number,\n s: {\n cx: number;\n cy: number;\n r0: number;\n r1: number;\n a0: number;\n a1: number;\n pad?: number;\n },\n): boolean => {\n const dx = x - s.cx;\n const dy = y - s.cy;\n const d = Math.hypot(dx, dy);\n if (d > s.r1 || d < s.r0) return false;\n const span = s.a1 - s.a0;\n if (span >= TAU - 1e-6) return true;\n if (span <= 0) return false;\n const a = wrapFrom(Math.atan2(dy, dx), s.a0);\n const half = (s.pad ?? 0) / 2;\n const off = half > 0 ? padAngleAt(half, d) : 0;\n return a >= s.a0 + off && a <= s.a1 - off;\n};\n\n/** Even-odd test of a point in a polygon given as a flat x, y list */\nexport const pointInPolygon = (\n x: number,\n y: number,\n points: readonly number[],\n): boolean => {\n const n = points.length >> 1;\n let inside = false;\n for (let i = 0, j = n - 1; i < n; j = i++) {\n const xi = points[i * 2];\n const yi = points[i * 2 + 1];\n const xj = points[j * 2];\n const yj = points[j * 2 + 1];\n if (yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi)\n inside = !inside;\n }\n return inside;\n};\n\nconst polygonArea = (points: readonly number[]) => {\n const n = points.length >> 1;\n let a = 0;\n for (let i = 0, j = n - 1; i < n; j = i++)\n a += points[j * 2] * points[i * 2 + 1] - points[i * 2] * points[j * 2 + 1];\n return Math.abs(a) / 2;\n};\n\nconst nodeContains = (node: ShapeNode, x: number, y: number): boolean => {\n switch (node.kind) {\n case \"sector\":\n return pointInSector(x, y, { ...node, pad: sectorPad(node) });\n case \"polygon\":\n return (\n pointInPolygon(x, y, node.points) &&\n !(node.hole && pointInPolygon(x, y, node.hole))\n );\n case \"rect\":\n return (\n x >= node.x &&\n x <= node.x + node.width &&\n y >= node.y &&\n y <= node.y + node.height\n );\n case \"circle\":\n return Math.hypot(x - node.cx, y - node.cy) <= node.r;\n case \"arc\": {\n const d = Math.hypot(x - node.cx, y - node.cy);\n if (Math.abs(d - node.r) > node.width / 2 + 4) return false;\n if (node.a1 - node.a0 >= TAU - 1e-6) return true;\n const a = wrapFrom(Math.atan2(y - node.cy, x - node.cx), node.a0);\n return a <= node.a1;\n }\n default:\n return false;\n }\n};\n\n/** Radar: the vertex under the pointer, else the smallest polygon containing it */\nconst hitRadar = (\n scene: ShapeScene,\n x: number,\n y: number,\n): ShapeHover | null => {\n const radar = scene.radar;\n if (!radar || !radar.series.length) return null;\n let best: ShapeHover | null = null;\n let bestD = VERTEX_RADIUS;\n for (const s of radar.series) {\n for (let k = 0; k < s.points.length >> 1; k++) {\n const d = Math.hypot(x - s.points[k * 2], y - s.points[k * 2 + 1]);\n if (d <= bestD) {\n bestD = d;\n best = { index: s.index, indicator: k };\n }\n }\n }\n if (best) return best;\n let area = Infinity;\n let index = -1;\n for (const s of radar.series) {\n if (s.points.length < 6 || !pointInPolygon(x, y, s.points)) continue;\n const a = polygonArea(s.points);\n if (a < area) {\n area = a;\n index = s.index;\n }\n }\n if (index < 0) return null;\n // nearest indicator by angle\n const a = Math.atan2(y - radar.cy, x - radar.cx);\n let indicator = 0;\n let diff = Infinity;\n radar.angles.forEach((angle, k) => {\n const d = Math.abs(wrapFrom(a - angle + Math.PI, 0) - Math.PI);\n if (d < diff) {\n diff = d;\n indicator = k;\n }\n });\n return { index, indicator };\n};\n\n/**\n * Item under a point (CSS pixels). `current` is the hovered item: its\n * popped-out geometry also counts so a moved slice keeps the hover.\n */\nexport const hitTestShapes = (\n scene: ShapeScene,\n x: number,\n y: number,\n current: ShapeHover | null = null,\n): ShapeHover | null => {\n if (scene.empty) return null;\n if (scene.type === \"radar\") return hitRadar(scene, x, y);\n const enter = scene.enter;\n if (enter && enter.scale > 0 && enter.scale !== 1) {\n x = enter.cx + (x - enter.cx) / enter.scale;\n y = enter.cy + (y - enter.cy) / enter.scale;\n }\n const valid = new Set(scene.items.map((it) => it.index));\n for (let i = scene.nodes.length - 1; i >= 0; i--) {\n const node = scene.nodes[i];\n if (node.hit === undefined || !valid.has(node.hit)) continue;\n if (node.kind === \"text\" || node.kind === \"line\") continue;\n if (nodeContains(node, x, y)) return { index: node.hit };\n if (current?.index === node.hit && node.shift) {\n const [dx, dy] = node.shift;\n if (nodeContains(node, x - dx, y - dy)) return { index: node.hit };\n }\n }\n return null;\n};\n\n/** Where the tooltip of a keyboard-focused item goes */\nexport const hoverAnchor = (\n scene: ShapeScene,\n hover: ShapeHover,\n): { x: number; y: number } | null => {\n const item = scene.items.find((it) => it.index === hover.index);\n if (!item) return null;\n const ind =\n hover.indicator !== undefined ? item.indicators?.[hover.indicator] : null;\n return ind ? { x: ind.x, y: ind.y } : { x: item.x, y: item.y };\n};\n\n/**\n * Next focused item for the arrow keys: `next` / `prev` walk the items\n * (radar: the indicators of the series), `up` / `down` the radar series.\n */\nexport const stepHover = (\n scene: ShapeScene,\n current: ShapeHover | null,\n direction: \"next\" | \"prev\" | \"up\" | \"down\",\n): ShapeHover | null => {\n const items = scene.items;\n if (!items.length) return null;\n const pos = current\n ? items.findIndex((it) => it.index === current.index)\n : -1;\n const radar = scene.type === \"radar\";\n if (pos < 0) {\n const first =\n direction === \"prev\" || direction === \"up\" ? items.length - 1 : 0;\n return radar\n ? { index: items[first].index, indicator: 0 }\n : { index: items[first].index };\n }\n const forward = direction === \"next\" || direction === \"down\";\n if (radar && (direction === \"next\" || direction === \"prev\")) {\n const count = items[pos].indicators?.length ?? 1;\n const k = current?.indicator ?? 0;\n return {\n index: items[pos].index,\n indicator: (k + (forward ? 1 : -1) + count) % count,\n };\n }\n const next = items[(pos + (forward ? 1 : -1) + items.length) % items.length];\n return radar\n ? { index: next.index, indicator: current?.indicator ?? 0 }\n : { index: next.index };\n};\n"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export { createShapeChart } from './chart.cjs';
2
+ export { createCanvasShapeChart, type CanvasShapeChartConfig, type CanvasShapeChartInstance, } from './canvas.cjs';
3
+ export { drawShapeLegend, drawShapeScene, drawShapeTooltip } from './draw.cjs';
4
+ export { hitTestShapes, hoverAnchor, pointInPolygon, pointInSector, stepHover, } from './hit.cjs';
5
+ export { describeChart, describeScene, hoverEvent, layoutShapeLegend, layoutShapeScene, layoutShapeTooltip, placeShapeTooltip, shapeLegend, shapeValues, tooltipContent, type ShapeLayoutInput, type ShapeLegendBox, type ShapeTooltipBox, type ShapeTooltipContent, } from './layout.cjs';
6
+ export { gaugeBandIndex } from './gauge.cjs';
7
+ export { squarify, treemapLeaves } from './treemap.cjs';
8
+ export type { MeasureText, ShapeHover, ShapeItem, ShapeLegendEntry, ShapeNode, ShapeRect, ShapeScene, ShapeTooltipRow, } from './scene.cjs';
9
+ export type { FunnelChartOptions, GaugeBand, GaugeChartOptions, PieChartOptions, RadarChartOptions, RadarIndicator, RadarSeries, ShapeChartCommonOptions, ShapeChartEventMap, ShapeChartInstance, ShapeChartOptions, ShapeChartType, ShapeDatum, ShapeHoverEvent, ShapeLegendOptions, ShapeToggleEvent, ShapeTooltipOptions, TreemapChartOptions, TreemapNode, } from './types.cjs';
@@ -0,0 +1,9 @@
1
+ export { createShapeChart } from './chart.js';
2
+ export { createCanvasShapeChart, type CanvasShapeChartConfig, type CanvasShapeChartInstance, } from './canvas.js';
3
+ export { drawShapeLegend, drawShapeScene, drawShapeTooltip } from './draw.js';
4
+ export { hitTestShapes, hoverAnchor, pointInPolygon, pointInSector, stepHover, } from './hit.js';
5
+ export { describeChart, describeScene, hoverEvent, layoutShapeLegend, layoutShapeScene, layoutShapeTooltip, placeShapeTooltip, shapeLegend, shapeValues, tooltipContent, type ShapeLayoutInput, type ShapeLegendBox, type ShapeTooltipBox, type ShapeTooltipContent, } from './layout.js';
6
+ export { gaugeBandIndex } from './gauge.js';
7
+ export { squarify, treemapLeaves } from './treemap.js';
8
+ export type { MeasureText, ShapeHover, ShapeItem, ShapeLegendEntry, ShapeNode, ShapeRect, ShapeScene, ShapeTooltipRow, } from './scene.js';
9
+ export type { FunnelChartOptions, GaugeBand, GaugeChartOptions, PieChartOptions, RadarChartOptions, RadarIndicator, RadarSeries, ShapeChartCommonOptions, ShapeChartEventMap, ShapeChartInstance, ShapeChartOptions, ShapeChartType, ShapeDatum, ShapeHoverEvent, ShapeLegendOptions, ShapeToggleEvent, ShapeTooltipOptions, TreemapChartOptions, TreemapNode, } from './types.js';
@@ -0,0 +1,3 @@
1
+ const e=require("../color.cjs"),t=require("../overlay.cjs"),n=require("./scene.cjs"),r=require("./funnel.cjs"),i=require("./gauge.cjs"),a=require("./pie.cjs"),o=require("./radar.cjs"),s=require("./treemap.cjs");var c=new Set,l=e=>{let{options:t,theme:l,width:u,height:d}=e,f=e.bounds??{x:0,y:0,width:u,height:d},p=e.from??null,m=n.clamp(e.t??1,0,1),h=l.palette.length?l.palette:[l.primary],g={theme:l,measure:e.measure,hidden:e.hidden??c,enter:n.clamp(e.enter??1,0,1),value:(e,t)=>{if(!p||m>=1)return t;let n=p.get(e)??0;return n+(t-n)*m},format:t.format??n.defaultFormat,percent:t.percentFormat??n.formatPercent,color:(e,t)=>n.resolveWith(l,e,h[t%h.length]),area:n.inset(f,t.padding)},_;switch(t.type){case`pie`:_=a.layoutPie(t,g);break;case`radar`:_=o.layoutRadar(t,g);break;case`gauge`:_=i.layoutGauge(t,g);break;case`funnel`:_=r.layoutFunnel(t,g);break;default:_=s.layoutTreemap(t,g)}return{type:t.type,width:u,height:d,..._}},u=(e,t=c)=>{let n=new Map;switch(e.type){case`pie`:a.pieValues(e,t,n);break;case`radar`:o.radarValues(e,t,n);break;case`gauge`:i.gaugeValues(e,t,n);break;case`funnel`:r.funnelValues(e,t,n);break;default:s.treemapValues(e,t,n)}return n},d=(e,t,n)=>{let r=new Map;return t.forEach((t,i)=>{let a=e.get(i)??0;r.set(i,a+(t-a)*n)}),r},f=(e,t)=>{if(e.size!==t.size)return!1;for(let[n,r]of e){let e=t.get(n);if(e===void 0||Math.abs(e-r)>1e-12)return!1}return!0},p=e=>{let t=typeof e.legend==`object`?e.legend:{};return{position:t.position??`bottom`,toggle:t.toggle??!0}},m=(t,i,a=c)=>{if(t.legend===!1)return null;let s=i.palette.length?i.palette:[i.primary],l=(t,r)=>e.toCss(n.resolveWith(i,t,s[r%s.length])),u=[],d=t.legend!==void 0;switch(t.type){case`pie`:d=!0,u=t.data.map((e,t)=>({index:t,name:e.name,color:l(e.color,t),hidden:a.has(t)}));break;case`funnel`:d=!0,u=r.funnelOrder(t,c).map(e=>({index:e,name:t.data[e].name,color:l(t.data[e].color,e),hidden:a.has(e)}));break;case`radar`:d||(d=t.series.length>1),u=t.series.map((e,n)=>({index:n,name:o.seriesName(t,n),color:l(e.color,n),hidden:a.has(n)}));break;case`treemap`:u=t.data.map((e,t)=>({index:t,name:e.name,color:l(e.color,t),hidden:a.has(t)}))}return d&&u.length?u:null},h=e=>e.type===`radar`?e.series.length:e.type===`gauge`?0:e.data.length,g=(e,t)=>{if(!t)return null;let r=e.items.find(e=>e.index===t.index);if(!r)return null;if(r.indicators){let e=n.clamp(t.indicator??0,0,r.indicators.length-1),i=r.indicators[e];return{index:r.index,indicator:e,name:r.name,value:i.value,percent:i.percent,color:r.color}}return{index:r.index,name:r.name,value:r.value,percent:r.percent,color:r.color,...r.path?{path:r.path}:{}}},_=(e,t)=>e===t||!!e&&!!t&&e.index===t.index&&e.indicator===t.indicator,v=(e,t)=>{let n=e.items.find(e=>e.index===t.index);if(!n)return null;let r=n.indicators?n.rows.map((e,n)=>n===(t.indicator??-1)?{...e,strong:!0}:e):n.rows;return{title:n.path?n.path.join(` / `):n.name,color:n.color,rows:r}},y=(e,t)=>{let r=e.items.find(e=>e.index===t.index);if(!r)return``;if(r.indicators){let e=n.clamp(t.indicator??0,0,r.indicators.length-1);return`${r.name}, ${r.indicators[e].name}: ${r.rows[e]?.value??r.indicators[e].value}`}return`${r.path?r.path.join(` / `):r.name}: ${r.rows[0]?.value??r.value} (${r.share??n.formatPercent(r.percent)})`},b=e=>{switch(e.type){case`pie`:return e.rose?`Rose chart`:(e.innerRadius??0)>0?`Donut chart`:`Pie chart`;case`radar`:return`Radar chart`;case`gauge`:return e.label?`Gauge: ${e.label}`:`Gauge`;case`funnel`:return`Funnel chart`;default:return`Treemap`}},x=e=>e.empty?`No data`:e.items.slice(0,12).map(t=>t.indicators?`${t.name}: ${t.indicators.map((e,n)=>`${e.name} ${t.rows[n]?.value??e.value}`).join(`, `)}`:y(e,{index:t.index})).join(`; `),S=20,C=(e,n,r,i,a,o)=>{let s=t.font(a,12),c=[[]],l=0;for(let t of e){let e=Math.min(n-8,16+o(t.name,s)),r=c[c.length-1];r.length&&l+14+e>n-8&&(c.push(r=[]),l=0),r.length&&(l+=14),r.push({...t,x:l,y:0,width:e,height:S}),l+=e}let u=c.length*S+8,d=r===`top`?2:i-u+6,f=[];return c.forEach((e,t)=>{let r=e[e.length-1],i=(n-(r?r.x+r.width:0))/2;for(let n of e)f.push({...n,x:n.x+i,y:d+t*S})}),{boxes:f,height:u}},w=6,T=14,E=(e,t)=>Math.max(0,Math.min(e.x+e.width,t.x+t.width)-Math.max(e.x,t.x))*Math.max(0,Math.min(e.y+e.height,t.y+t.height)-Math.max(e.y,t.y)),D=(e,t,n,r,i,a,o)=>{let s=w,c=(e,t)=>({x:Math.max(s,Math.min(e,a-r-s)),y:Math.max(s,Math.min(t,o-i-s))}),{x:l,y:u}=n,d=e?.radar;if(!d||!e||!t){let e=l+16;return e+r>a-s&&(e=l-16-r),c(e,u-i/2)}let f=[[l,u]],p=e.items.find(e=>e.index===t.index),m=p?.indicators&&t.indicator!==void 0?p.indicators[t.indicator]:void 0;m&&f.push([m.x,m.y]);let h=d.labels??[],g=l-d.cx,_=u-d.cy,v=Math.hypot(g,_);v>1?(g/=v,_/=v):(g=1,_=0);let y=T,b=[[l+y,u-i/2],[l-y-r,u-i/2],[l-r/2,u-y-i],[l-r/2,u+y],[l+y,u-y-i],[l+y,u+y],[l-y-r,u-y-i],[l-y-r,u+y]],x=c(b[0][0],b[0][1]),S=1/0;for(let[e,t]of b){let n=c(e,t),a={x:n.x,y:n.y,width:r,height:i},o=0;for(let[e,t]of f)e>a.x-8&&e<a.x+r+8&&t>a.y-8&&t<a.y+i+8&&(o+=1e6);for(let e of h)o+=E(a,e)*4;let s=n.x+r/2-l,d=n.y+i/2-u,p=Math.hypot(s,d)||1;o+=p*.5,o-=(s*g+d*_)/p*40,o+=Math.abs(n.x-e)+Math.abs(n.y-t),o<S&&(S=o,x=n)}return x},O=(e,n,r,i,a,o,s,c=null,l=null)=>{let u=0,d,f,p;if(typeof e==`string`){p=e.split(`
2
+ `);let n=t.font(o,12);for(let e of p)u=Math.max(u,s(e,n));d=p.length}else{f=e,u=(e.color?14:0)+s(e.title,t.font(o,12,600));for(let n of e.rows)u=Math.max(u,(n.color?14:0)+s(n.name,t.font(o,12))+16+s(n.value,t.font(o,12,600)));d=1+e.rows.length}let m=Math.max(96,Math.ceil(u+18+4)),h=d*18+18,{x:g,y:_}=D(c,l,{x:n,y:r},m,h,i,a);return{x:g,y:_,width:m,height:h,padding:9,lineHeight:18,...f?{content:f}:{},...p?{text:p}:{}}};exports.blendValues=d,exports.describeChart=b,exports.describeItem=y,exports.describeScene=x,exports.hoverEvent=g,exports.layoutShapeLegend=C,exports.layoutShapeScene=l,exports.layoutShapeTooltip=O,exports.legendConfig=p,exports.placeShapeTooltip=D,exports.sameHover=_,exports.sameValues=f,exports.shapeLegend=m,exports.shapeValues=u,exports.toggleCount=h,exports.tooltipContent=v;
3
+ //# sourceMappingURL=layout.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.cjs","names":["clamp","defaultFormat","formatPercent","resolveWith","inset","layoutPie","layoutRadar","layoutGauge","layoutFunnel","layoutTreemap","toCss","funnelOrder","seriesName","font","require_color","require_overlay","require_scene","require_funnel","require_gauge","require_pie","require_radar","require_treemap","NO_HIDDEN","layoutShapeScene","o","input","bounds","from","t","palette","theme","c","target","start","key","css","i","result","shapeValues","out","hidden","blendValues","to","v","sameValues","a","b","w","legendConfig","config","shapeLegend","color","entries","shown","d","s","toggleCount","hoverEvent","hover","item","scene","it","k","ind","sameHover","tooltipContent","rows","row","describeItem","describeChart","describeScene","LEGEND_ROW","layoutShapeLegend","f","x","e","width","measure","height","top","position","chartHeight","boxes","last","offset","box","r","TIP_MARGIN","TIP_GAP","overlapArea","placeShapeTooltip","m","fit","y","h","ax","ay","anchor","radar","avoid","vertex","labels","dx","dy","len","g","candidates","best","bestScore","cx0","cy0","p","score","px","py","label","ox","oy","dist","layoutShapeTooltip","lines","content","text","value","line","bw","bh","anchorX","anchorY"],"sources":["../../../../../charts/src/engine/shapes/layout.ts"],"sourcesContent":["// Layout of every shape chart type into a ShapeScene, plus what the hosts\n// share: animated values, legend entries, tooltip content, hover events and\n// accessible descriptions. Pure: no DOM, no canvas.\n\nimport { toCss } from \"../color\";\nimport { font } from \"../overlay\";\nimport type { ChartTheme } from \"../theme\";\nimport { funnelOrder, funnelValues, layoutFunnel } from \"./funnel\";\nimport { gaugeValues, layoutGauge } from \"./gauge\";\nimport { layoutPie, pieValues } from \"./pie\";\nimport { layoutRadar, radarValues, seriesName } from \"./radar\";\nimport {\n clamp,\n defaultFormat,\n formatPercent,\n inset,\n resolveWith,\n type LayoutContext,\n type LayoutResult,\n type MeasureText,\n type ShapeHover,\n type ShapeLegendEntry,\n type ShapeRect,\n type ShapeScene,\n type ShapeTooltipRow,\n} from \"./scene\";\nimport { layoutTreemap, treemapValues } from \"./treemap\";\nimport type {\n ShapeChartOptions,\n ShapeHoverEvent,\n ShapeLegendOptions,\n} from \"./types\";\n\nexport interface ShapeLayoutInput {\n options: ShapeChartOptions;\n theme: ChartTheme;\n /** Size of the whole drawing, CSS pixels */\n width: number;\n height: number;\n /** Area of the chart (legend excluded); the whole drawing by default */\n bounds?: ShapeRect;\n measure: MeasureText;\n /** Hidden slices / stages / series (treemap: top-level nodes) */\n hidden?: ReadonlySet<number>;\n /** Entry animation progress, eased (1 = done) */\n enter?: number;\n /** Values at the start of an update animation (`shapeValues`) */\n from?: ReadonlyMap<string, number> | null;\n /** Update animation progress, eased (1 = done) */\n t?: number;\n}\n\nconst NO_HIDDEN: ReadonlySet<number> = new Set();\n\n/** Lays a shape chart out */\nexport const layoutShapeScene = (input: ShapeLayoutInput): ShapeScene => {\n const { options: o, theme, width, height } = input;\n const bounds = input.bounds ?? { x: 0, y: 0, width, height };\n const from = input.from ?? null;\n const t = clamp(input.t ?? 1, 0, 1);\n const palette = theme.palette.length ? theme.palette : [theme.primary];\n const c: LayoutContext = {\n theme,\n measure: input.measure,\n hidden: input.hidden ?? NO_HIDDEN,\n enter: clamp(input.enter ?? 1, 0, 1),\n value: (key, target) => {\n if (!from || t >= 1) return target;\n const start = from.get(key) ?? 0;\n return start + (target - start) * t;\n },\n format: o.format ?? defaultFormat,\n percent: o.percentFormat ?? formatPercent,\n color: (css, i) => resolveWith(theme, css, palette[i % palette.length]),\n area: inset(bounds, o.padding),\n };\n let result: LayoutResult;\n switch (o.type) {\n case \"pie\":\n result = layoutPie(o, c);\n break;\n case \"radar\":\n result = layoutRadar(o, c);\n break;\n case \"gauge\":\n result = layoutGauge(o, c);\n break;\n case \"funnel\":\n result = layoutFunnel(o, c);\n break;\n default:\n result = layoutTreemap(o, c);\n break;\n }\n return { type: o.type, width, height, ...result };\n};\n\n/** Target values of the animated quantities, by key */\nexport const shapeValues = (\n o: ShapeChartOptions,\n hidden: ReadonlySet<number> = NO_HIDDEN,\n): Map<string, number> => {\n const out = new Map<string, number>();\n switch (o.type) {\n case \"pie\":\n pieValues(o, hidden, out);\n break;\n case \"radar\":\n radarValues(o, hidden, out);\n break;\n case \"gauge\":\n gaugeValues(o, hidden, out);\n break;\n case \"funnel\":\n funnelValues(o, hidden, out);\n break;\n default:\n treemapValues(o, hidden, out);\n break;\n }\n return out;\n};\n\n/** Values shown at progress `t` of an animation from `from` to `to` */\nexport const blendValues = (\n from: ReadonlyMap<string, number>,\n to: ReadonlyMap<string, number>,\n t: number,\n): Map<string, number> => {\n const out = new Map<string, number>();\n to.forEach((v, key) => {\n const start = from.get(key) ?? 0;\n out.set(key, start + (v - start) * t);\n });\n return out;\n};\n\nexport const sameValues = (\n a: ReadonlyMap<string, number>,\n b: ReadonlyMap<string, number>,\n) => {\n if (a.size !== b.size) return false;\n for (const [key, v] of a) {\n const w = b.get(key);\n if (w === undefined || Math.abs(w - v) > 1e-12) return false;\n }\n return true;\n};\n\n/** Legend position and toggling */\nexport const legendConfig = (\n o: ShapeChartOptions,\n): Required<ShapeLegendOptions> => {\n const config = typeof o.legend === \"object\" ? o.legend : {};\n return {\n position: config.position ?? \"bottom\",\n toggle: config.toggle ?? true,\n };\n};\n\n/** Legend entries, `null` when the legend is hidden */\nexport const shapeLegend = (\n o: ShapeChartOptions,\n theme: ChartTheme,\n hidden: ReadonlySet<number> = NO_HIDDEN,\n): ShapeLegendEntry[] | null => {\n if (o.legend === false) return null;\n const palette = theme.palette.length ? theme.palette : [theme.primary];\n const color = (css: string | undefined, i: number) =>\n toCss(resolveWith(theme, css, palette[i % palette.length]));\n let entries: ShapeLegendEntry[] = [];\n let shown = o.legend !== undefined;\n switch (o.type) {\n case \"pie\":\n shown = true;\n entries = o.data.map((d, i) => ({\n index: i,\n name: d.name,\n color: color(d.color, i),\n hidden: hidden.has(i),\n }));\n break;\n case \"funnel\":\n shown = true;\n entries = funnelOrder(o, NO_HIDDEN).map((i) => ({\n index: i,\n name: o.data[i].name,\n color: color(o.data[i].color, i),\n hidden: hidden.has(i),\n }));\n break;\n case \"radar\":\n shown ||= o.series.length > 1;\n entries = o.series.map((s, i) => ({\n index: i,\n name: seriesName(o, i),\n color: color(s.color, i),\n hidden: hidden.has(i),\n }));\n break;\n case \"treemap\":\n entries = o.data.map((d, i) => ({\n index: i,\n name: d.name,\n color: color(d.color, i),\n hidden: hidden.has(i),\n }));\n break;\n default:\n break;\n }\n return shown && entries.length ? entries : null;\n};\n\n/** Number of toggleable entries (slices, stages, series, top-level nodes) */\nexport const toggleCount = (o: ShapeChartOptions) =>\n o.type === \"radar\" ? o.series.length : o.type === \"gauge\" ? 0 : o.data.length;\n\n/** Event of a hovered item */\nexport const hoverEvent = (\n scene: ShapeScene,\n hover: ShapeHover | null,\n): ShapeHoverEvent | null => {\n if (!hover) return null;\n const item = scene.items.find((it) => it.index === hover.index);\n if (!item) return null;\n if (item.indicators) {\n const k = clamp(hover.indicator ?? 0, 0, item.indicators.length - 1);\n const ind = item.indicators[k];\n return {\n index: item.index,\n indicator: k,\n name: item.name,\n value: ind.value,\n percent: ind.percent,\n color: item.color,\n };\n }\n return {\n index: item.index,\n name: item.name,\n value: item.value,\n percent: item.percent,\n color: item.color,\n ...(item.path ? { path: item.path } : {}),\n };\n};\n\nexport const sameHover = (a: ShapeHover | null, b: ShapeHover | null) =>\n a === b || (!!a && !!b && a.index === b.index && a.indicator === b.indicator);\n\nexport interface ShapeTooltipContent {\n title: string;\n color?: string;\n rows: ShapeTooltipRow[];\n}\n\n/** Default tooltip of a hovered item */\nexport const tooltipContent = (\n scene: ShapeScene,\n hover: ShapeHover,\n): ShapeTooltipContent | null => {\n const item = scene.items.find((it) => it.index === hover.index);\n if (!item) return null;\n const rows = item.indicators\n ? item.rows.map((row, k) =>\n k === (hover.indicator ?? -1) ? { ...row, strong: true } : row,\n )\n : item.rows;\n return {\n title: item.path ? item.path.join(\" / \") : item.name,\n color: item.color,\n rows,\n };\n};\n\n/** Text read by screen readers for a focused item */\nexport const describeItem = (scene: ShapeScene, hover: ShapeHover) => {\n const item = scene.items.find((it) => it.index === hover.index);\n if (!item) return \"\";\n if (item.indicators) {\n const k = clamp(hover.indicator ?? 0, 0, item.indicators.length - 1);\n return `${item.name}, ${item.indicators[k].name}: ${item.rows[k]?.value ?? item.indicators[k].value}`;\n }\n const name = item.path ? item.path.join(\" / \") : item.name;\n return `${name}: ${item.rows[0]?.value ?? item.value} (${item.share ?? formatPercent(item.percent)})`;\n};\n\n/** Default accessible name of a chart */\nexport const describeChart = (o: ShapeChartOptions) => {\n switch (o.type) {\n case \"pie\":\n return o.rose\n ? \"Rose chart\"\n : (o.innerRadius ?? 0) > 0\n ? \"Donut chart\"\n : \"Pie chart\";\n case \"radar\":\n return \"Radar chart\";\n case \"gauge\":\n return o.label ? `Gauge: ${o.label}` : \"Gauge\";\n case \"funnel\":\n return \"Funnel chart\";\n default:\n return \"Treemap\";\n }\n};\n\n/** Text summary of the data (screen readers) */\nexport const describeScene = (scene: ShapeScene) =>\n scene.empty\n ? \"No data\"\n : scene.items\n .slice(0, 12)\n .map((item) =>\n item.indicators\n ? `${item.name}: ${item.indicators\n .map(\n (ind, k) => `${ind.name} ${item.rows[k]?.value ?? ind.value}`,\n )\n .join(\", \")}`\n : describeItem(scene, { index: item.index }),\n )\n .join(\"; \");\n\n// ------------------------------------------------- canvas legend & tooltip\n\nexport interface ShapeLegendBox extends ShapeLegendEntry {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nconst LEGEND_ROW = 20;\n\n/** Centered legend rows drawn on a canvas; `height` includes the gap with the chart */\nexport const layoutShapeLegend = (\n entries: readonly ShapeLegendEntry[],\n width: number,\n position: \"top\" | \"bottom\",\n chartHeight: number,\n theme: ChartTheme,\n measure: MeasureText,\n): { boxes: ShapeLegendBox[]; height: number } => {\n const f = font(theme, 12);\n const gap = 14;\n const rows: ShapeLegendBox[][] = [[]];\n let x = 0;\n for (const e of entries) {\n const w = Math.min(width - 8, 16 + measure(e.name, f));\n let row = rows[rows.length - 1];\n if (row.length && x + gap + w > width - 8) {\n rows.push((row = []));\n x = 0;\n }\n if (row.length) x += gap;\n row.push({ ...e, x, y: 0, width: w, height: LEGEND_ROW });\n x += w;\n }\n const height = rows.length * LEGEND_ROW + 8;\n const top = position === \"top\" ? 2 : chartHeight - height + 6;\n const boxes: ShapeLegendBox[] = [];\n rows.forEach((row, r) => {\n const last = row[row.length - 1];\n const used = last ? last.x + last.width : 0;\n const offset = (width - used) / 2;\n for (const box of row) {\n boxes.push({ ...box, x: box.x + offset, y: top + r * LEGEND_ROW });\n }\n });\n return { boxes, height };\n};\n\nexport interface ShapeTooltipBox {\n x: number;\n y: number;\n width: number;\n height: number;\n padding: number;\n lineHeight: number;\n /** Default content */\n content?: ShapeTooltipContent;\n /** Custom text (`tooltip.render` returning a string) */\n text?: string[];\n}\n\n/** Margin between a tooltip and the edges of the drawing */\nconst TIP_MARGIN = 6;\n/** Distance between a tooltip and its anchor */\nconst TIP_GAP = 14;\n\nconst overlapArea = (a: ShapeRect, b: ShapeRect) =>\n Math.max(0, Math.min(a.x + a.width, b.x + b.width) - Math.max(a.x, b.x)) *\n Math.max(0, Math.min(a.y + a.height, b.y + b.height) - Math.max(a.y, b.y));\n\n/**\n * Top-left corner of a `w` x `h` tooltip anchored at `anchor`, inside a\n * `width` x `height` drawing. Beside the anchor (right, else left) by\n * default; radar tooltips go outward, off the hovered vertex and, when\n * possible, off the indicator labels.\n */\nexport const placeShapeTooltip = (\n scene: ShapeScene | null,\n hover: ShapeHover | null,\n anchor: { x: number; y: number },\n w: number,\n h: number,\n width: number,\n height: number,\n): { x: number; y: number } => {\n const m = TIP_MARGIN;\n const fit = (x: number, y: number) => ({\n x: Math.max(m, Math.min(x, width - w - m)),\n y: Math.max(m, Math.min(y, height - h - m)),\n });\n const { x: ax, y: ay } = anchor;\n const radar = scene?.radar;\n if (!radar || !scene || !hover) {\n let x = ax + 16;\n if (x + w > width - m) x = ax - 16 - w;\n return fit(x, ay - h / 2);\n }\n\n // points the tooltip must not cover: the anchor and the hovered vertex\n const avoid: [number, number][] = [[ax, ay]];\n const item = scene.items.find((it) => it.index === hover.index);\n const vertex =\n item?.indicators && hover.indicator !== undefined\n ? item.indicators[hover.indicator]\n : undefined;\n if (vertex) avoid.push([vertex.x, vertex.y]);\n const labels = radar.labels ?? [];\n // outward direction, from the center through the anchor\n let dx = ax - radar.cx;\n let dy = ay - radar.cy;\n const len = Math.hypot(dx, dy);\n if (len > 1) {\n dx /= len;\n dy /= len;\n } else {\n dx = 1;\n dy = 0;\n }\n const g = TIP_GAP;\n const candidates: [number, number][] = [\n [ax + g, ay - h / 2],\n [ax - g - w, ay - h / 2],\n [ax - w / 2, ay - g - h],\n [ax - w / 2, ay + g],\n [ax + g, ay - g - h],\n [ax + g, ay + g],\n [ax - g - w, ay - g - h],\n [ax - g - w, ay + g],\n ];\n let best = fit(candidates[0][0], candidates[0][1]);\n let bestScore = Infinity;\n for (const [cx0, cy0] of candidates) {\n const p = fit(cx0, cy0);\n const box = { x: p.x, y: p.y, width: w, height: h };\n let score = 0;\n for (const [px, py] of avoid) {\n const covers =\n px > box.x - 8 &&\n px < box.x + w + 8 &&\n py > box.y - 8 &&\n py < box.y + h + 8;\n if (covers) score += 1e6;\n }\n for (const label of labels) score += overlapArea(box, label) * 4;\n const ox = p.x + w / 2 - ax;\n const oy = p.y + h / 2 - ay;\n const dist = Math.hypot(ox, oy) || 1;\n score += dist * 0.5;\n // prefer going outward, and candidates that fit without being pushed in\n score -= ((ox * dx + oy * dy) / dist) * 40;\n score += Math.abs(p.x - cx0) + Math.abs(p.y - cy0);\n if (score < bestScore) {\n bestScore = score;\n best = p;\n }\n }\n return best;\n};\n\n/** Box of a tooltip drawn on a canvas, next to the anchor and inside the drawing */\nexport const layoutShapeTooltip = (\n value: ShapeTooltipContent | string,\n anchorX: number,\n anchorY: number,\n width: number,\n height: number,\n theme: ChartTheme,\n measure: MeasureText,\n scene: ShapeScene | null = null,\n hover: ShapeHover | null = null,\n): ShapeTooltipBox => {\n const padding = 9;\n const lineHeight = 18;\n let w = 0;\n let lines: number;\n let content: ShapeTooltipContent | undefined;\n let text: string[] | undefined;\n if (typeof value === \"string\") {\n text = value.split(\"\\n\");\n const f = font(theme, 12);\n for (const line of text) w = Math.max(w, measure(line, f));\n lines = text.length;\n } else {\n content = value;\n w = (value.color ? 14 : 0) + measure(value.title, font(theme, 12, 600));\n for (const row of value.rows) {\n w = Math.max(\n w,\n (row.color ? 14 : 0) +\n measure(row.name, font(theme, 12)) +\n 16 +\n measure(row.value, font(theme, 12, 600)),\n );\n }\n lines = 1 + value.rows.length;\n }\n const bw = Math.max(96, Math.ceil(w + padding * 2 + 4));\n const bh = lines * lineHeight + padding * 2;\n const { x, y } = placeShapeTooltip(\n scene,\n hover,\n { x: anchorX, y: anchorY },\n bw,\n bh,\n width,\n height,\n );\n return {\n x,\n y,\n width: bw,\n height: bh,\n padding,\n lineHeight,\n ...(content ? { content } : {}),\n ...(text ? { text } : {}),\n };\n};\n"],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ import { ChartTheme } from '../theme.cjs';
2
+ import { MeasureText, ShapeHover, ShapeLegendEntry, ShapeRect, ShapeScene, ShapeTooltipRow } from './scene.cjs';
3
+ import { ShapeChartOptions, ShapeHoverEvent, ShapeLegendOptions } from './types.cjs';
4
+ export interface ShapeLayoutInput {
5
+ options: ShapeChartOptions;
6
+ theme: ChartTheme;
7
+ /** Size of the whole drawing, CSS pixels */
8
+ width: number;
9
+ height: number;
10
+ /** Area of the chart (legend excluded); the whole drawing by default */
11
+ bounds?: ShapeRect;
12
+ measure: MeasureText;
13
+ /** Hidden slices / stages / series (treemap: top-level nodes) */
14
+ hidden?: ReadonlySet<number>;
15
+ /** Entry animation progress, eased (1 = done) */
16
+ enter?: number;
17
+ /** Values at the start of an update animation (`shapeValues`) */
18
+ from?: ReadonlyMap<string, number> | null;
19
+ /** Update animation progress, eased (1 = done) */
20
+ t?: number;
21
+ }
22
+ /** Lays a shape chart out */
23
+ export declare const layoutShapeScene: (input: ShapeLayoutInput) => ShapeScene;
24
+ /** Target values of the animated quantities, by key */
25
+ export declare const shapeValues: (o: ShapeChartOptions, hidden?: ReadonlySet<number>) => Map<string, number>;
26
+ /** Values shown at progress `t` of an animation from `from` to `to` */
27
+ export declare const blendValues: (from: ReadonlyMap<string, number>, to: ReadonlyMap<string, number>, t: number) => Map<string, number>;
28
+ export declare const sameValues: (a: ReadonlyMap<string, number>, b: ReadonlyMap<string, number>) => boolean;
29
+ /** Legend position and toggling */
30
+ export declare const legendConfig: (o: ShapeChartOptions) => Required<ShapeLegendOptions>;
31
+ /** Legend entries, `null` when the legend is hidden */
32
+ export declare const shapeLegend: (o: ShapeChartOptions, theme: ChartTheme, hidden?: ReadonlySet<number>) => ShapeLegendEntry[] | null;
33
+ /** Number of toggleable entries (slices, stages, series, top-level nodes) */
34
+ export declare const toggleCount: (o: ShapeChartOptions) => number;
35
+ /** Event of a hovered item */
36
+ export declare const hoverEvent: (scene: ShapeScene, hover: ShapeHover | null) => ShapeHoverEvent | null;
37
+ export declare const sameHover: (a: ShapeHover | null, b: ShapeHover | null) => boolean;
38
+ export interface ShapeTooltipContent {
39
+ title: string;
40
+ color?: string;
41
+ rows: ShapeTooltipRow[];
42
+ }
43
+ /** Default tooltip of a hovered item */
44
+ export declare const tooltipContent: (scene: ShapeScene, hover: ShapeHover) => ShapeTooltipContent | null;
45
+ /** Text read by screen readers for a focused item */
46
+ export declare const describeItem: (scene: ShapeScene, hover: ShapeHover) => string;
47
+ /** Default accessible name of a chart */
48
+ export declare const describeChart: (o: ShapeChartOptions) => string;
49
+ /** Text summary of the data (screen readers) */
50
+ export declare const describeScene: (scene: ShapeScene) => string;
51
+ export interface ShapeLegendBox extends ShapeLegendEntry {
52
+ x: number;
53
+ y: number;
54
+ width: number;
55
+ height: number;
56
+ }
57
+ /** Centered legend rows drawn on a canvas; `height` includes the gap with the chart */
58
+ export declare const layoutShapeLegend: (entries: readonly ShapeLegendEntry[], width: number, position: "top" | "bottom", chartHeight: number, theme: ChartTheme, measure: MeasureText) => {
59
+ boxes: ShapeLegendBox[];
60
+ height: number;
61
+ };
62
+ export interface ShapeTooltipBox {
63
+ x: number;
64
+ y: number;
65
+ width: number;
66
+ height: number;
67
+ padding: number;
68
+ lineHeight: number;
69
+ /** Default content */
70
+ content?: ShapeTooltipContent;
71
+ /** Custom text (`tooltip.render` returning a string) */
72
+ text?: string[];
73
+ }
74
+ /**
75
+ * Top-left corner of a `w` x `h` tooltip anchored at `anchor`, inside a
76
+ * `width` x `height` drawing. Beside the anchor (right, else left) by
77
+ * default; radar tooltips go outward, off the hovered vertex and, when
78
+ * possible, off the indicator labels.
79
+ */
80
+ export declare const placeShapeTooltip: (scene: ShapeScene | null, hover: ShapeHover | null, anchor: {
81
+ x: number;
82
+ y: number;
83
+ }, w: number, h: number, width: number, height: number) => {
84
+ x: number;
85
+ y: number;
86
+ };
87
+ /** Box of a tooltip drawn on a canvas, next to the anchor and inside the drawing */
88
+ export declare const layoutShapeTooltip: (value: ShapeTooltipContent | string, anchorX: number, anchorY: number, width: number, height: number, theme: ChartTheme, measure: MeasureText, scene?: ShapeScene | null, hover?: ShapeHover | null) => ShapeTooltipBox;
@@ -0,0 +1,88 @@
1
+ import { ChartTheme } from '../theme.js';
2
+ import { MeasureText, ShapeHover, ShapeLegendEntry, ShapeRect, ShapeScene, ShapeTooltipRow } from './scene.js';
3
+ import { ShapeChartOptions, ShapeHoverEvent, ShapeLegendOptions } from './types.js';
4
+ export interface ShapeLayoutInput {
5
+ options: ShapeChartOptions;
6
+ theme: ChartTheme;
7
+ /** Size of the whole drawing, CSS pixels */
8
+ width: number;
9
+ height: number;
10
+ /** Area of the chart (legend excluded); the whole drawing by default */
11
+ bounds?: ShapeRect;
12
+ measure: MeasureText;
13
+ /** Hidden slices / stages / series (treemap: top-level nodes) */
14
+ hidden?: ReadonlySet<number>;
15
+ /** Entry animation progress, eased (1 = done) */
16
+ enter?: number;
17
+ /** Values at the start of an update animation (`shapeValues`) */
18
+ from?: ReadonlyMap<string, number> | null;
19
+ /** Update animation progress, eased (1 = done) */
20
+ t?: number;
21
+ }
22
+ /** Lays a shape chart out */
23
+ export declare const layoutShapeScene: (input: ShapeLayoutInput) => ShapeScene;
24
+ /** Target values of the animated quantities, by key */
25
+ export declare const shapeValues: (o: ShapeChartOptions, hidden?: ReadonlySet<number>) => Map<string, number>;
26
+ /** Values shown at progress `t` of an animation from `from` to `to` */
27
+ export declare const blendValues: (from: ReadonlyMap<string, number>, to: ReadonlyMap<string, number>, t: number) => Map<string, number>;
28
+ export declare const sameValues: (a: ReadonlyMap<string, number>, b: ReadonlyMap<string, number>) => boolean;
29
+ /** Legend position and toggling */
30
+ export declare const legendConfig: (o: ShapeChartOptions) => Required<ShapeLegendOptions>;
31
+ /** Legend entries, `null` when the legend is hidden */
32
+ export declare const shapeLegend: (o: ShapeChartOptions, theme: ChartTheme, hidden?: ReadonlySet<number>) => ShapeLegendEntry[] | null;
33
+ /** Number of toggleable entries (slices, stages, series, top-level nodes) */
34
+ export declare const toggleCount: (o: ShapeChartOptions) => number;
35
+ /** Event of a hovered item */
36
+ export declare const hoverEvent: (scene: ShapeScene, hover: ShapeHover | null) => ShapeHoverEvent | null;
37
+ export declare const sameHover: (a: ShapeHover | null, b: ShapeHover | null) => boolean;
38
+ export interface ShapeTooltipContent {
39
+ title: string;
40
+ color?: string;
41
+ rows: ShapeTooltipRow[];
42
+ }
43
+ /** Default tooltip of a hovered item */
44
+ export declare const tooltipContent: (scene: ShapeScene, hover: ShapeHover) => ShapeTooltipContent | null;
45
+ /** Text read by screen readers for a focused item */
46
+ export declare const describeItem: (scene: ShapeScene, hover: ShapeHover) => string;
47
+ /** Default accessible name of a chart */
48
+ export declare const describeChart: (o: ShapeChartOptions) => string;
49
+ /** Text summary of the data (screen readers) */
50
+ export declare const describeScene: (scene: ShapeScene) => string;
51
+ export interface ShapeLegendBox extends ShapeLegendEntry {
52
+ x: number;
53
+ y: number;
54
+ width: number;
55
+ height: number;
56
+ }
57
+ /** Centered legend rows drawn on a canvas; `height` includes the gap with the chart */
58
+ export declare const layoutShapeLegend: (entries: readonly ShapeLegendEntry[], width: number, position: "top" | "bottom", chartHeight: number, theme: ChartTheme, measure: MeasureText) => {
59
+ boxes: ShapeLegendBox[];
60
+ height: number;
61
+ };
62
+ export interface ShapeTooltipBox {
63
+ x: number;
64
+ y: number;
65
+ width: number;
66
+ height: number;
67
+ padding: number;
68
+ lineHeight: number;
69
+ /** Default content */
70
+ content?: ShapeTooltipContent;
71
+ /** Custom text (`tooltip.render` returning a string) */
72
+ text?: string[];
73
+ }
74
+ /**
75
+ * Top-left corner of a `w` x `h` tooltip anchored at `anchor`, inside a
76
+ * `width` x `height` drawing. Beside the anchor (right, else left) by
77
+ * default; radar tooltips go outward, off the hovered vertex and, when
78
+ * possible, off the indicator labels.
79
+ */
80
+ export declare const placeShapeTooltip: (scene: ShapeScene | null, hover: ShapeHover | null, anchor: {
81
+ x: number;
82
+ y: number;
83
+ }, w: number, h: number, width: number, height: number) => {
84
+ x: number;
85
+ y: number;
86
+ };
87
+ /** Box of a tooltip drawn on a canvas, next to the anchor and inside the drawing */
88
+ export declare const layoutShapeTooltip: (value: ShapeTooltipContent | string, anchorX: number, anchorY: number, width: number, height: number, theme: ChartTheme, measure: MeasureText, scene?: ShapeScene | null, hover?: ShapeHover | null) => ShapeTooltipBox;