@svgrid/grid 3.0.2 → 3.0.4

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 (281) hide show
  1. package/README.md +2 -1
  2. package/dist/GridMenus.svelte +44 -2
  3. package/dist/SvChartMenu.svelte +69 -0
  4. package/dist/SvChartMenu.svelte.d.ts +11 -0
  5. package/dist/SvChartPanes.svelte +113 -0
  6. package/dist/SvChartPanes.svelte.d.ts +20 -0
  7. package/dist/SvGrid.controller.svelte.d.ts +110 -39
  8. package/dist/SvGrid.controller.svelte.js +655 -200
  9. package/dist/SvGrid.css +105 -2
  10. package/dist/SvGrid.svelte +386 -514
  11. package/dist/SvGrid.types.d.ts +210 -9
  12. package/dist/SvGridCellEditor.svelte +17 -0
  13. package/dist/SvGridChart.svelte +2257 -329
  14. package/dist/SvGridChart.svelte.d.ts +6 -106
  15. package/dist/SvGridChart.types.d.ts +338 -0
  16. package/dist/SvGridChart.types.js +1 -0
  17. package/dist/SvGridChartBuilder.svelte +323 -0
  18. package/dist/SvGridChartBuilder.svelte.d.ts +34 -0
  19. package/dist/SvGridChartPanel.svelte +221 -275
  20. package/dist/SvGridChartPickers.svelte +417 -0
  21. package/dist/SvGridChartPickers.svelte.d.ts +70 -0
  22. package/dist/SvGridChartView.svelte +13 -14
  23. package/dist/SvModal.svelte +7 -1
  24. package/dist/SvModal.svelte.d.ts +5 -0
  25. package/dist/ai.d.ts +40 -8
  26. package/dist/ai.js +135 -24
  27. package/dist/aria.d.ts +11 -0
  28. package/dist/build-api.js +108 -22
  29. package/dist/cdn/GridMenus-7kbpnnBW.js +635 -0
  30. package/dist/cdn/GridMenus-BL7ZgQvU.js +636 -0
  31. package/dist/cdn/SvChartMenu-Bl6PBbkT.js +58 -0
  32. package/dist/cdn/SvChartMenu-FBSMINA6.js +59 -0
  33. package/dist/cdn/{SvDateRangeInput-DMLKmGEc.js → SvDateRangeInput-BeU_TkbQ.js} +15 -14
  34. package/dist/cdn/{SvDateRangeInput-CaOuMs8O.js → SvDateRangeInput-yX8vzleW.js} +38 -37
  35. package/dist/cdn/{SvDateTimePicker-sonaH0oh.js → SvDateTimePicker-DQwt4UAs.js} +139 -180
  36. package/dist/cdn/SvDateTimePicker-vNU6bZ-q.js +775 -0
  37. package/dist/cdn/{SvGridCellEditor-CjEJMJKc.js → SvGridCellEditor-B1p-vCK5.js} +188 -178
  38. package/dist/cdn/{SvGridCellEditor-BWnTi2N7.js → SvGridCellEditor-D_0q4xAu.js} +98 -88
  39. package/dist/cdn/SvGridChart-C3EWAZaM.js +3574 -0
  40. package/dist/cdn/SvGridChart-DzLkSwCH.js +3572 -0
  41. package/dist/cdn/SvGridChartBuilder-BE2T1ykB.js +783 -0
  42. package/dist/cdn/SvGridChartBuilder-CfII62sZ.js +784 -0
  43. package/dist/cdn/SvGridChartPanel-CCX5_Wgd.js +675 -0
  44. package/dist/cdn/SvGridChartPanel-xf4sWVTo.js +699 -0
  45. package/dist/cdn/SvGridChartView-CfuXmY5I.js +48 -0
  46. package/dist/cdn/SvGridChartView-DYwabQWj.js +47 -0
  47. package/dist/cdn/SvMenuList-CLN8OuIK.js +452 -0
  48. package/dist/cdn/SvMenuList-DkGhNKjf.js +451 -0
  49. package/dist/cdn/SvModal-BAE-pjZX.js +396 -0
  50. package/dist/cdn/SvModal-CIZWCcad.js +397 -0
  51. package/dist/cdn/chart-Dz7SqMXH.js +4341 -0
  52. package/dist/cdn/chart-export-BXqueeWJ.js +135 -0
  53. package/dist/cdn/chart-export-pdf-DONFUnNY.js +110 -0
  54. package/dist/cdn/chart-panel-messages-CUbf2R4i.js +1052 -0
  55. package/dist/cdn/chart-panel-messages-CmNrMdsr.js +1053 -0
  56. package/dist/cdn/chart-summary-BJW_tg_X.js +138 -0
  57. package/dist/cdn/chart-trend-CaN9mDEV.js +50 -0
  58. package/dist/cdn/chart-validate-HcOVFAfJ.js +188 -0
  59. package/dist/cdn/{column-resize-DsfNXMom.js → column-resize-DpmOLfRp.js} +3 -3
  60. package/dist/cdn/{date-format-BnnHlqGw.js → date-format-CtquV-p3.js} +583 -603
  61. package/dist/cdn/{date-format-BNii4zeD.js → date-format-D6KFzU_W.js} +347 -367
  62. package/dist/cdn/dismissable-DAHetSNk.js +44 -0
  63. package/dist/cdn/editor-contract-LXgQJAgd.js +22 -0
  64. package/dist/cdn/focus-trap-BBOQYBma.js +65 -0
  65. package/dist/cdn/{row-resize-BRcimkUT.js → row-resize-niQCp040.js} +44 -36
  66. package/dist/cdn/{src-DNbz94Ct.js → src-BKhZ6eXd.js} +10227 -9787
  67. package/dist/cdn/{src-BJ2opd0j.js → src-V1uu8iE9.js} +6568 -6128
  68. package/dist/cdn/svgrid.js +26 -15
  69. package/dist/cdn/svgrid.svelte-external.js +26 -15
  70. package/dist/chart-axes.d.ts +53 -0
  71. package/dist/chart-axes.js +351 -0
  72. package/dist/chart-cartesian.d.ts +88 -0
  73. package/dist/chart-cartesian.js +1862 -0
  74. package/dist/chart-decimate.d.ts +51 -0
  75. package/dist/chart-decimate.js +199 -0
  76. package/dist/chart-export-pdf.d.ts +47 -0
  77. package/dist/chart-export-pdf.js +187 -0
  78. package/dist/chart-export.d.ts +2 -1
  79. package/dist/chart-export.js +18 -3
  80. package/dist/chart-financial.d.ts +91 -0
  81. package/dist/chart-financial.js +175 -0
  82. package/dist/chart-flow.d.ts +10 -0
  83. package/dist/chart-flow.js +298 -0
  84. package/dist/chart-format.d.ts +18 -0
  85. package/dist/chart-format.js +65 -0
  86. package/dist/chart-grid.d.ts +8 -0
  87. package/dist/chart-grid.js +190 -0
  88. package/dist/chart-hierarchy.d.ts +17 -0
  89. package/dist/chart-hierarchy.js +146 -0
  90. package/dist/chart-indicators.d.ts +115 -0
  91. package/dist/chart-indicators.js +389 -0
  92. package/dist/chart-messages.d.ts +95 -0
  93. package/dist/chart-messages.js +92 -0
  94. package/dist/chart-motion.d.ts +16 -0
  95. package/dist/chart-motion.js +141 -0
  96. package/dist/chart-panel-messages.d.ts +265 -0
  97. package/dist/chart-panel-messages.js +285 -0
  98. package/dist/chart-pivot.d.ts +87 -0
  99. package/dist/chart-pivot.js +156 -0
  100. package/dist/chart-polar.d.ts +25 -0
  101. package/dist/chart-polar.js +700 -0
  102. package/dist/chart-samples.d.ts +16 -0
  103. package/dist/chart-samples.js +153 -0
  104. package/dist/chart-scale.d.ts +113 -0
  105. package/dist/chart-scale.js +405 -0
  106. package/dist/chart-stats.d.ts +111 -0
  107. package/dist/chart-stats.js +419 -0
  108. package/dist/chart-stream.d.ts +45 -0
  109. package/dist/chart-stream.js +91 -0
  110. package/dist/chart-summary.d.ts +27 -0
  111. package/dist/chart-summary.js +205 -0
  112. package/dist/chart-sync.svelte.d.ts +32 -0
  113. package/dist/chart-sync.svelte.js +23 -0
  114. package/dist/chart-table.d.ts +35 -0
  115. package/dist/chart-table.js +165 -0
  116. package/dist/chart-trend.d.ts +19 -0
  117. package/dist/chart-trend.js +61 -0
  118. package/dist/chart-types.d.ts +1456 -0
  119. package/dist/chart-types.js +6 -0
  120. package/dist/chart-validate.d.ts +43 -0
  121. package/dist/chart-validate.js +272 -0
  122. package/dist/chart-zoom.d.ts +40 -0
  123. package/dist/chart-zoom.js +145 -0
  124. package/dist/chart.d.ts +186 -865
  125. package/dist/chart.js +460 -2204
  126. package/dist/clipboard.d.ts +1 -0
  127. package/dist/clipboard.js +137 -18
  128. package/dist/column-resize.d.ts +3 -0
  129. package/dist/column-resize.js +4 -1
  130. package/dist/columns.js +3 -0
  131. package/dist/command-context.d.ts +19 -0
  132. package/dist/command-context.js +116 -0
  133. package/dist/core.d.ts +7 -0
  134. package/dist/createPopoverSelect.svelte.d.ts +2 -2
  135. package/dist/editing.d.ts +2 -8
  136. package/dist/editing.js +262 -33
  137. package/dist/fill-patterns.d.ts +0 -5
  138. package/dist/fill-patterns.js +56 -2
  139. package/dist/grid-messages.d.ts +10 -3
  140. package/dist/grid-messages.js +5 -0
  141. package/dist/history.d.ts +83 -0
  142. package/dist/history.js +133 -0
  143. package/dist/index.d.ts +24 -6
  144. package/dist/index.js +20 -2
  145. package/dist/keyboard-handlers.js +88 -31
  146. package/dist/keyboard.d.ts +55 -0
  147. package/dist/keyboard.js +132 -0
  148. package/dist/menus.d.ts +3 -1
  149. package/dist/menus.js +7 -2
  150. package/dist/merges.d.ts +97 -0
  151. package/dist/merges.js +147 -0
  152. package/dist/row-resize.d.ts +3 -0
  153. package/dist/row-resize.js +14 -0
  154. package/dist/scroll-sync.d.ts +1 -0
  155. package/dist/scroll-sync.js +24 -0
  156. package/dist/selection.d.ts +16 -0
  157. package/dist/selection.js +108 -16
  158. package/dist/shortcut-registry.d.ts +145 -0
  159. package/dist/shortcut-registry.js +44 -0
  160. package/dist/svgrid-wrapper.types.d.ts +213 -22
  161. package/dist/virtualization/virtualizer.js +38 -17
  162. package/package.json +6 -1
  163. package/src/GridMenus.svelte +44 -2
  164. package/src/SvChartMenu.svelte +69 -0
  165. package/src/SvChartPanes.svelte +113 -0
  166. package/src/SvChartPanes.test.ts +66 -0
  167. package/src/SvGrid.controller.svelte.ts +629 -172
  168. package/src/SvGrid.css +105 -2
  169. package/src/SvGrid.svelte +386 -514
  170. package/src/SvGrid.types.ts +188 -8
  171. package/src/SvGridCellEditor.svelte +17 -0
  172. package/src/SvGridChart.svelte +2257 -329
  173. package/src/SvGridChart.test.ts +1419 -1
  174. package/src/SvGridChart.types.ts +336 -0
  175. package/src/SvGridChartBuilder.svelte +323 -0
  176. package/src/SvGridChartPanel.svelte +221 -275
  177. package/src/SvGridChartPickers.svelte +417 -0
  178. package/src/SvGridChartView.svelte +13 -14
  179. package/src/SvModal.svelte +7 -1
  180. package/src/SvModal.test.ts +9 -0
  181. package/src/ai.test.ts +57 -2
  182. package/src/ai.ts +166 -22
  183. package/src/aria.d.ts +11 -0
  184. package/src/build-api.coverage.test.ts +184 -0
  185. package/src/build-api.ts +107 -18
  186. package/src/chart-axes.test.ts +573 -0
  187. package/src/chart-axes.ts +342 -0
  188. package/src/chart-cartesian.ts +1863 -0
  189. package/src/chart-decimate.test.ts +249 -0
  190. package/src/chart-decimate.ts +186 -0
  191. package/src/chart-export-pdf.test.ts +91 -0
  192. package/src/chart-export-pdf.ts +207 -0
  193. package/src/chart-export.test.ts +14 -0
  194. package/src/chart-export.ts +13 -3
  195. package/src/chart-financial.ts +208 -0
  196. package/src/chart-flow.ts +286 -0
  197. package/src/chart-format.ts +67 -0
  198. package/src/chart-grid.ts +179 -0
  199. package/src/chart-hierarchy.ts +135 -0
  200. package/src/chart-indicators.test.ts +443 -0
  201. package/src/chart-indicators.ts +384 -0
  202. package/src/chart-messages.test.ts +21 -0
  203. package/src/chart-messages.ts +184 -0
  204. package/src/chart-motion.test.ts +71 -0
  205. package/src/chart-motion.ts +148 -0
  206. package/src/chart-panel-messages.test.ts +29 -0
  207. package/src/chart-panel-messages.ts +550 -0
  208. package/src/chart-pivot.test.ts +54 -0
  209. package/src/chart-pivot.ts +225 -0
  210. package/src/chart-polar.ts +674 -0
  211. package/src/chart-samples.ts +106 -0
  212. package/src/chart-scale.ts +394 -0
  213. package/src/chart-series-types.test.ts +714 -0
  214. package/src/chart-stats.ts +409 -0
  215. package/src/chart-stream.test.ts +75 -0
  216. package/src/chart-stream.ts +114 -0
  217. package/src/chart-summary.test.ts +90 -0
  218. package/src/chart-summary.ts +197 -0
  219. package/src/chart-sync.svelte.ts +41 -0
  220. package/src/chart-table.test.ts +76 -0
  221. package/src/chart-table.ts +178 -0
  222. package/src/chart-trend.ts +47 -0
  223. package/src/chart-types.ts +1309 -0
  224. package/src/chart-validate.test.ts +100 -0
  225. package/src/chart-validate.ts +247 -0
  226. package/src/chart-zoom.test.ts +137 -0
  227. package/src/chart-zoom.ts +124 -0
  228. package/src/chart.coverage.test.ts +81 -0
  229. package/src/chart.test.ts +56 -3
  230. package/src/chart.ts +557 -2784
  231. package/src/clipboard.test.ts +151 -0
  232. package/src/clipboard.ts +145 -16
  233. package/src/column-resize.ts +7 -1
  234. package/src/columns.ts +2 -0
  235. package/src/command-context.test.ts +200 -0
  236. package/src/command-context.ts +137 -0
  237. package/src/core.ts +7 -0
  238. package/src/editing.test.ts +281 -3
  239. package/src/editing.ts +256 -38
  240. package/src/fill-patterns.test.ts +35 -0
  241. package/src/fill-patterns.ts +56 -2
  242. package/src/grid-messages.ts +16 -3
  243. package/src/history.test.ts +196 -0
  244. package/src/history.ts +162 -0
  245. package/src/icon-seam.test.ts +3 -2
  246. package/src/index.ts +150 -2
  247. package/src/keyboard-handlers.coverage.test.ts +126 -6
  248. package/src/keyboard-handlers.ts +91 -30
  249. package/src/keyboard-shortcuts.seam.test.ts +200 -0
  250. package/src/keyboard.test.ts +124 -1
  251. package/src/keyboard.ts +142 -0
  252. package/src/menus.test.ts +26 -0
  253. package/src/menus.ts +10 -3
  254. package/src/merges.test.ts +112 -0
  255. package/src/merges.ts +168 -0
  256. package/src/pivot.grid.test.ts +40 -5
  257. package/src/row-resize.test.ts +44 -0
  258. package/src/row-resize.ts +17 -0
  259. package/src/scroll-sync.test.ts +42 -1
  260. package/src/scroll-sync.ts +25 -0
  261. package/src/selection.multi-range.test.ts +34 -0
  262. package/src/selection.test.ts +30 -2
  263. package/src/selection.ts +111 -19
  264. package/src/shortcut-registry.test.ts +97 -0
  265. package/src/shortcut-registry.ts +181 -0
  266. package/src/svgrid-wrapper.types.ts +184 -13
  267. package/src/svgrid.behavior.test.ts +135 -0
  268. package/src/svgrid.charting.test.ts +513 -3
  269. package/src/svgrid.context-menu.test.ts +31 -0
  270. package/src/svgrid.new-features.wrapper.test.ts +10 -3
  271. package/src/virtualization/virtualizer.ts +39 -17
  272. package/dist/cdn/GridMenus-DyFA-QxA.js +0 -602
  273. package/dist/cdn/GridMenus-M2XP9t0_.js +0 -603
  274. package/dist/cdn/SvDateTimePicker-CCbDZNZB.js +0 -816
  275. package/dist/cdn/SvGridChart-DAb9RbRs.js +0 -1480
  276. package/dist/cdn/SvGridChart-Yl-IXZFO.js +0 -1481
  277. package/dist/cdn/SvGridChartPanel-DayQpDsR.js +0 -834
  278. package/dist/cdn/SvGridChartPanel-aqf8n-vJ.js +0 -810
  279. package/dist/cdn/SvGridChartView-CxfakxR0.js +0 -56
  280. package/dist/cdn/SvGridChartView-Dm_YEx9L.js +0 -55
  281. package/dist/cdn/chart-CKJRCPOk.js +0 -1652
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Data-update tweens: a geometry part-way between two laid-out charts, so a
3
+ * value change slides the marks into place instead of snapping them.
4
+ *
5
+ * Marks are matched by identity (series + category, or node path), and a mark
6
+ * with no counterpart on the other side grows from / shrinks to nothing.
7
+ * Anything not worth tweening (ticks' labels, the legend, the hit layer) is
8
+ * taken from the target as-is. Pure, and cheap enough to run per frame on the
9
+ * sizes the chart draws without decimation.
10
+ */
11
+ import type { ChartArc, ChartBar, ChartCandle, ChartGeometry, ChartLine, ChartPieSlice } from './chart-types'
12
+ import { arcPath } from './chart-polar'
13
+ import { buildLinePath } from './chart-cartesian'
14
+
15
+ const mix = (a: number, b: number, t: number) => a + (b - a) * t
16
+ const r2 = (n: number) => Math.round(n * 100) / 100
17
+
18
+ /**
19
+ * The geometry at fraction `t` (0..1) between `from` and `to`. At `t >= 1`
20
+ * this is `to` itself, so a finished tween costs nothing.
21
+ */
22
+ export function interpolateGeometry(from: ChartGeometry, to: ChartGeometry, t: number): ChartGeometry {
23
+ if (t >= 1) return to
24
+ if (t <= 0 && from.type === to.type) return from
25
+ if (from.type !== to.type) return to
26
+ return {
27
+ ...to,
28
+ bars: tweenBars(from.bars, to.bars, t, to.plot.y + to.plot.h),
29
+ lines: tweenLines(from.lines, to.lines, t),
30
+ candles: tweenCandles(from.candles, to.candles, t),
31
+ slices: tweenSlices(from.slices, to.slices, t),
32
+ arcs: tweenArcs(from.arcs, to.arcs, t),
33
+ yTicks: to.yTicks.map((tick) => {
34
+ const prev = from.yTicks.find((p) => p.value === tick.value)
35
+ return prev ? { ...tick, y: r2(mix(prev.y, tick.y, t)) } : tick
36
+ }),
37
+ }
38
+ }
39
+
40
+ const barKey = (b: ChartBar) => `${b.series}\u0000${b.label}`
41
+
42
+ function tweenBars(from: ChartBar[], to: ChartBar[], t: number, baseline: number): ChartBar[] {
43
+ if (!from.length && !to.length) return to
44
+ const prev = new Map(from.map((b) => [barKey(b), b]))
45
+ const seen = new Set<string>()
46
+ const out: ChartBar[] = to.map((b) => {
47
+ const k = barKey(b)
48
+ seen.add(k)
49
+ const p = prev.get(k)
50
+ if (!p) {
51
+ // New: grow from the baseline.
52
+ const y = mix(baseline, b.y, t)
53
+ return { ...b, y: r2(y), h: r2(Math.max(0, mix(0, b.h, t))) }
54
+ }
55
+ return { ...b, x: r2(mix(p.x, b.x, t)), y: r2(mix(p.y, b.y, t)), w: r2(mix(p.w, b.w, t)), h: r2(mix(p.h, b.h, t)) }
56
+ })
57
+ // Removed: shrink to the baseline, then vanish at the end of the tween.
58
+ for (const p of from) {
59
+ if (seen.has(barKey(p))) continue
60
+ out.push({ ...p, y: r2(mix(p.y, baseline, t)), h: r2(Math.max(0, mix(p.h, 0, t))) })
61
+ }
62
+ return out
63
+ }
64
+
65
+ function tweenLines(from: ChartLine[], to: ChartLine[], t: number): ChartLine[] {
66
+ if (!from.length) return to
67
+ const prev = new Map(from.map((l) => [l.label, l]))
68
+ return to.map((l) => {
69
+ const p = prev.get(l.label)
70
+ // A series whose point count changed cannot be paired point for point;
71
+ // it snaps, and the others still slide.
72
+ if (!p || p.points.length !== l.points.length) return l
73
+ const points = l.points.map((pt, i) => {
74
+ const q = p.points[i]!
75
+ if (!pt.defined || !q.defined) return pt
76
+ return { ...pt, x: r2(mix(q.x, pt.x, t)), y: r2(mix(q.y, pt.y, t)) }
77
+ })
78
+ return { ...l, points, path: buildLinePath(points, !!l.smooth, { step: l.step }) }
79
+ })
80
+ }
81
+
82
+ const candleKey = (k: ChartCandle) => `${k.series}\u0000${k.label}`
83
+
84
+ function tweenCandles(from: ChartCandle[], to: ChartCandle[], t: number): ChartCandle[] {
85
+ if (!from.length) return to
86
+ const prev = new Map(from.map((k) => [candleKey(k), k]))
87
+ return to.map((k) => {
88
+ const p = prev.get(candleKey(k))
89
+ if (!p) return k
90
+ const yOpen = mix(p.yOpen, k.yOpen, t)
91
+ const yClose = mix(p.yClose, k.yClose, t)
92
+ return {
93
+ ...k,
94
+ x: r2(mix(p.x, k.x, t)),
95
+ xCenter: r2(mix(p.xCenter, k.xCenter, t)),
96
+ yOpen: r2(yOpen),
97
+ yClose: r2(yClose),
98
+ yHigh: r2(mix(p.yHigh, k.yHigh, t)),
99
+ yLow: r2(mix(p.yLow, k.yLow, t)),
100
+ bodyY: r2(Math.min(yOpen, yClose)),
101
+ bodyH: r2(Math.max(1, Math.abs(yClose - yOpen))),
102
+ }
103
+ })
104
+ }
105
+
106
+ function tweenSlices(from: ChartPieSlice[], to: ChartPieSlice[], t: number): ChartPieSlice[] {
107
+ if (!from.length || to.some((s) => !s.arc)) return to
108
+ const prev = new Map(from.map((s) => [s.label, s]))
109
+ return to.map((s) => {
110
+ const p = prev.get(s.label)
111
+ if (!p?.arc || !s.arc) return s
112
+ const a0 = mix(p.arc.a0, s.arc.a0, t)
113
+ const a1 = mix(p.arc.a1, s.arc.a1, t)
114
+ const mid = (a0 + a1) / 2
115
+ const labelR = (s.arc.r + s.arc.ir) / 2 || s.arc.r * 0.6
116
+ return {
117
+ ...s,
118
+ path: arcPath(s.arc.cx, s.arc.cy, s.arc.ir, s.arc.r, a0, a1),
119
+ cx: r2(s.arc.cx + labelR * Math.cos(mid)),
120
+ cy: r2(s.arc.cy + labelR * Math.sin(mid)),
121
+ arc: { ...s.arc, a0, a1 },
122
+ }
123
+ })
124
+ }
125
+
126
+ const arcKey = (a: ChartArc) => (a.nodePath ? a.nodePath.join('/') : `${a.series}\u0000${a.label}`)
127
+
128
+ function tweenArcs(from: ChartArc[], to: ChartArc[], t: number): ChartArc[] {
129
+ if (!from.length) return to
130
+ const prev = new Map(from.map((a) => [arcKey(a), a]))
131
+ return to.map((a) => {
132
+ const p = prev.get(arcKey(a))
133
+ if (!p) return a
134
+ const a0 = mix(p.a0, a.a0, t)
135
+ const a1 = mix(p.a1, a.a1, t)
136
+ const r0 = mix(p.r0, a.r0, t)
137
+ const r1 = mix(p.r1, a.r1, t)
138
+ const mid = (a0 + a1) / 2
139
+ const lr = (r0 + r1) / 2
140
+ return {
141
+ ...a,
142
+ a0, a1, r0, r1,
143
+ path: arcPath(a.cx, a.cy, r0, r1, a0, a1),
144
+ lx: r2(a.cx + lr * Math.cos(mid)),
145
+ ly: r2(a.cy + lr * Math.sin(mid)),
146
+ }
147
+ })
148
+ }
@@ -0,0 +1,29 @@
1
+ import { describe, expect, it } from 'vitest'
2
+ import { chartPanelMessage, defaultChartPanelMessages, resolveChartPanelMessages } from './chart-panel-messages'
3
+ import { defaultGridMessages } from './grid-messages'
4
+
5
+ describe('chart panel messages', () => {
6
+ it('every key has a non-empty English default with no em-dash', () => {
7
+ for (const [k, v] of Object.entries(defaultChartPanelMessages)) {
8
+ expect(typeof v, k).toBe('string')
9
+ expect(v.trim().length, k).toBeGreaterThan(0)
10
+ expect(v, k).not.toMatch(/\u2014/)
11
+ }
12
+ expect(Object.keys(defaultChartPanelMessages).length).toBeGreaterThan(150)
13
+ })
14
+
15
+ it('does not share a key with the grid chrome, so one localization.text map serves both', () => {
16
+ const chrome = new Set(Object.keys(defaultGridMessages))
17
+ for (const k of Object.keys(defaultChartPanelMessages)) expect(chrome.has(k), k).toBe(false)
18
+ })
19
+
20
+ it('resolves overrides over the defaults and fills placeholders', () => {
21
+ const m = resolveChartPanelMessages({ chartPanelTitle: 'Diagramm', chartAdd: '' })
22
+ expect(m.chartPanelTitle).toBe('Diagramm')
23
+ expect(m.chartAdd).toBe('Add chart')
24
+ expect(m.chartGroupBy).toBe('Group by')
25
+ expect(resolveChartPanelMessages(null)).toBe(defaultChartPanelMessages)
26
+ expect(chartPanelMessage(m.chartRemoveTab, { title: 'Chart 2' })).toBe('Remove Chart 2')
27
+ expect(chartPanelMessage('{a} and {b}', { a: 1 })).toBe('1 and {b}')
28
+ })
29
+ })