@k2b/ui 0.50.0 → 0.51.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 (294) hide show
  1. package/dist/base.css +32 -1
  2. package/dist/browser/actions/Button.js.map +1 -1
  3. package/dist/browser/actions/CommandList.js +861 -0
  4. package/dist/browser/actions/CommandList.js.map +1 -0
  5. package/dist/browser/actions/CommandMenu.js +237 -0
  6. package/dist/browser/actions/CommandMenu.js.map +1 -0
  7. package/dist/browser/actions/Dropdown.js +43 -10
  8. package/dist/browser/actions/Dropdown.js.map +1 -1
  9. package/dist/browser/actions/command-dock.js +47 -0
  10. package/dist/browser/actions/command-dock.js.map +1 -0
  11. package/dist/browser/actions/command-items.js +84 -0
  12. package/dist/browser/actions/command-items.js.map +1 -0
  13. package/dist/browser/actions/command-messages.js +42 -0
  14. package/dist/browser/actions/command-messages.js.map +1 -0
  15. package/dist/browser/actions/index.js +1 -0
  16. package/dist/browser/actions/index.js.map +1 -1
  17. package/dist/browser/charts/core/area.js +3 -5
  18. package/dist/browser/charts/core/area.js.map +1 -1
  19. package/dist/browser/charts/core/calendar.js +1 -1
  20. package/dist/browser/charts/core/calendar.js.map +1 -1
  21. package/dist/browser/charts/core/chart-messages.js +17 -0
  22. package/dist/browser/charts/core/chart-messages.js.map +1 -0
  23. package/dist/browser/charts/core/hbar-layout.js +118 -0
  24. package/dist/browser/charts/core/hbar-layout.js.map +1 -0
  25. package/dist/browser/charts/core/hbar.js +39 -0
  26. package/dist/browser/charts/core/hbar.js.map +1 -0
  27. package/dist/browser/charts/core/index.js +7 -2
  28. package/dist/browser/charts/core/index.js.map +1 -1
  29. package/dist/browser/charts/core/map.js +116 -0
  30. package/dist/browser/charts/core/map.js.map +1 -0
  31. package/dist/browser/charts/core/registry.js +22 -15
  32. package/dist/browser/charts/core/registry.js.map +1 -1
  33. package/dist/browser/charts/core/render-size.js +13 -0
  34. package/dist/browser/charts/core/render-size.js.map +1 -0
  35. package/dist/browser/charts/core/render.js +20 -10
  36. package/dist/browser/charts/core/render.js.map +1 -1
  37. package/dist/browser/charts/core/snapshot.js +3 -3
  38. package/dist/browser/charts/core/snapshot.js.map +1 -1
  39. package/dist/browser/charts/core/svg-renderers.js +2406 -0
  40. package/dist/browser/charts/core/svg-renderers.js.map +1 -0
  41. package/dist/browser/charts/core/svg.js +4 -2525
  42. package/dist/browser/charts/core/svg.js.map +1 -1
  43. package/dist/browser/charts/core/types.js +0 -2
  44. package/dist/browser/charts/core/types.js.map +1 -1
  45. package/dist/browser/charts/core/waterfall.js +162 -0
  46. package/dist/browser/charts/core/waterfall.js.map +1 -0
  47. package/dist/browser/charts/description.js +2 -0
  48. package/dist/browser/charts/description.js.map +1 -0
  49. package/dist/browser/charts.js.map +1 -1
  50. package/dist/browser/content/Chart.js +14 -628
  51. package/dist/browser/content/Chart.js.map +1 -1
  52. package/dist/browser/content/ChartRoot.js +632 -0
  53. package/dist/browser/content/ChartRoot.js.map +1 -0
  54. package/dist/browser/content/ChartSparkline.js +24 -0
  55. package/dist/browser/content/ChartSparkline.js.map +1 -0
  56. package/dist/browser/content/FileView.js +111 -61
  57. package/dist/browser/content/FileView.js.map +1 -1
  58. package/dist/browser/content/Lightbox.js +8 -8
  59. package/dist/browser/content/Lightbox.js.map +1 -1
  60. package/dist/browser/content/MapView.js +30 -28
  61. package/dist/browser/content/MapView.js.map +1 -1
  62. package/dist/browser/content/PdfPreview.js +84 -52
  63. package/dist/browser/content/PdfPreview.js.map +1 -1
  64. package/dist/browser/content/PdfViewer.js +588 -0
  65. package/dist/browser/content/PdfViewer.js.map +1 -0
  66. package/dist/browser/content/chart-bar.js +246 -16
  67. package/dist/browser/content/chart-bar.js.map +1 -1
  68. package/dist/browser/content/chart-inspection-core.js +22 -21
  69. package/dist/browser/content/chart-inspection-core.js.map +1 -1
  70. package/dist/browser/content/chart-line-gaps.js +1 -1
  71. package/dist/browser/content/chart-line-gaps.js.map +1 -1
  72. package/dist/browser/content/chart-message-catalog.js +10 -0
  73. package/dist/browser/content/chart-message-catalog.js.map +1 -1
  74. package/dist/browser/content/chart-state-timeline.js +1 -1
  75. package/dist/browser/content/chart-state-timeline.js.map +1 -1
  76. package/dist/browser/content/chart-svg.js +2 -1
  77. package/dist/browser/content/chart-svg.js.map +1 -1
  78. package/dist/browser/content/index.js +1 -0
  79. package/dist/browser/content/index.js.map +1 -1
  80. package/dist/browser/content/pdf-document.js +29 -0
  81. package/dist/browser/content/pdf-document.js.map +1 -0
  82. package/dist/browser/content/pdf-limits.js +31 -0
  83. package/dist/browser/content/pdf-limits.js.map +1 -0
  84. package/dist/browser/content/pdf-messages.js +34 -2
  85. package/dist/browser/content/pdf-messages.js.map +1 -1
  86. package/dist/browser/content/pdf-viewer-engine.js +57 -0
  87. package/dist/browser/content/pdf-viewer-worker.js +28 -0
  88. package/dist/browser/inputs/ChoiceInputs.js +94 -51
  89. package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
  90. package/dist/browser/inputs/ChoiceSlider.js +75 -58
  91. package/dist/browser/inputs/ChoiceSlider.js.map +1 -1
  92. package/dist/browser/inputs/DatePicker.js +113 -98
  93. package/dist/browser/inputs/DatePicker.js.map +1 -1
  94. package/dist/browser/inputs/PeriodPicker.js +874 -0
  95. package/dist/browser/inputs/PeriodPicker.js.map +1 -0
  96. package/dist/browser/inputs/index.js +4 -1
  97. package/dist/browser/inputs/index.js.map +1 -1
  98. package/dist/browser/inputs/input-messages.js +8 -2
  99. package/dist/browser/inputs/input-messages.js.map +1 -1
  100. package/dist/browser/inputs/markdown/MarkdownEditor.js +14 -10
  101. package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
  102. package/dist/browser/inputs/markdown/SlashCommands.js +402 -0
  103. package/dist/browser/inputs/markdown/SlashCommands.js.map +1 -0
  104. package/dist/browser/inputs/period-picker-messages.js +71 -0
  105. package/dist/browser/inputs/period-picker-messages.js.map +1 -0
  106. package/dist/browser/inputs/period.js +263 -0
  107. package/dist/browser/inputs/period.js.map +1 -0
  108. package/dist/browser/layout/DetailPanel.js +147 -120
  109. package/dist/browser/layout/DetailPanel.js.map +1 -1
  110. package/dist/browser/layout/Discussion.js +101 -108
  111. package/dist/browser/layout/Discussion.js.map +1 -1
  112. package/dist/browser/layout/index.js.map +1 -1
  113. package/dist/browser/surfaces/DescriptionList.js +5 -2
  114. package/dist/browser/surfaces/DescriptionList.js.map +1 -1
  115. package/dist/browser/surfaces/StatCell.js +19 -14
  116. package/dist/browser/surfaces/StatCell.js.map +1 -1
  117. package/dist/browser/surfaces/delta-badge.js +16 -2
  118. package/dist/browser/surfaces/delta-badge.js.map +1 -1
  119. package/dist/browser/widgets/DashboardFrame.js +310 -0
  120. package/dist/browser/widgets/DashboardFrame.js.map +1 -0
  121. package/dist/browser/widgets/index.js +1 -0
  122. package/dist/browser/widgets/index.js.map +1 -1
  123. package/dist/licenses/pdfjs-dist.txt +177 -0
  124. package/dist/ssr/actions/Button.js.map +1 -1
  125. package/dist/ssr/actions/CommandList.js +638 -0
  126. package/dist/ssr/actions/CommandList.js.map +1 -0
  127. package/dist/ssr/actions/CommandMenu.js +197 -0
  128. package/dist/ssr/actions/CommandMenu.js.map +1 -0
  129. package/dist/ssr/actions/Dropdown.js +43 -10
  130. package/dist/ssr/actions/Dropdown.js.map +1 -1
  131. package/dist/ssr/actions/command-dock.js +47 -0
  132. package/dist/ssr/actions/command-dock.js.map +1 -0
  133. package/dist/ssr/actions/command-items.js +84 -0
  134. package/dist/ssr/actions/command-items.js.map +1 -0
  135. package/dist/ssr/actions/command-messages.js +42 -0
  136. package/dist/ssr/actions/command-messages.js.map +1 -0
  137. package/dist/ssr/actions/index.js +1 -0
  138. package/dist/ssr/actions/index.js.map +1 -1
  139. package/dist/ssr/charts/core/area.js +3 -5
  140. package/dist/ssr/charts/core/area.js.map +1 -1
  141. package/dist/ssr/charts/core/calendar.js +1 -1
  142. package/dist/ssr/charts/core/calendar.js.map +1 -1
  143. package/dist/ssr/charts/core/chart-messages.js +17 -0
  144. package/dist/ssr/charts/core/chart-messages.js.map +1 -0
  145. package/dist/ssr/charts/core/hbar-layout.js +118 -0
  146. package/dist/ssr/charts/core/hbar-layout.js.map +1 -0
  147. package/dist/ssr/charts/core/hbar.js +39 -0
  148. package/dist/ssr/charts/core/hbar.js.map +1 -0
  149. package/dist/ssr/charts/core/index.js +7 -2
  150. package/dist/ssr/charts/core/index.js.map +1 -1
  151. package/dist/ssr/charts/core/map.js +116 -0
  152. package/dist/ssr/charts/core/map.js.map +1 -0
  153. package/dist/ssr/charts/core/registry.js +22 -15
  154. package/dist/ssr/charts/core/registry.js.map +1 -1
  155. package/dist/ssr/charts/core/render-size.js +13 -0
  156. package/dist/ssr/charts/core/render-size.js.map +1 -0
  157. package/dist/ssr/charts/core/render.js +20 -10
  158. package/dist/ssr/charts/core/render.js.map +1 -1
  159. package/dist/ssr/charts/core/snapshot.js +3 -3
  160. package/dist/ssr/charts/core/snapshot.js.map +1 -1
  161. package/dist/ssr/charts/core/svg-renderers.js +2406 -0
  162. package/dist/ssr/charts/core/svg-renderers.js.map +1 -0
  163. package/dist/ssr/charts/core/svg.js +4 -2525
  164. package/dist/ssr/charts/core/svg.js.map +1 -1
  165. package/dist/ssr/charts/core/types.js +0 -2
  166. package/dist/ssr/charts/core/types.js.map +1 -1
  167. package/dist/ssr/charts/core/waterfall.js +162 -0
  168. package/dist/ssr/charts/core/waterfall.js.map +1 -0
  169. package/dist/ssr/charts/description.js +2 -0
  170. package/dist/ssr/charts/description.js.map +1 -0
  171. package/dist/ssr/charts.js.map +1 -1
  172. package/dist/ssr/content/Chart.js +14 -471
  173. package/dist/ssr/content/Chart.js.map +1 -1
  174. package/dist/ssr/content/ChartRoot.js +475 -0
  175. package/dist/ssr/content/ChartRoot.js.map +1 -0
  176. package/dist/ssr/content/ChartSparkline.js +24 -0
  177. package/dist/ssr/content/ChartSparkline.js.map +1 -0
  178. package/dist/ssr/content/FileView.js +56 -7
  179. package/dist/ssr/content/FileView.js.map +1 -1
  180. package/dist/ssr/content/Lightbox.js +8 -8
  181. package/dist/ssr/content/Lightbox.js.map +1 -1
  182. package/dist/ssr/content/MapView.js +9 -9
  183. package/dist/ssr/content/MapView.js.map +1 -1
  184. package/dist/ssr/content/PdfPreview.js +49 -20
  185. package/dist/ssr/content/PdfPreview.js.map +1 -1
  186. package/dist/ssr/content/PdfViewer.js +484 -0
  187. package/dist/ssr/content/PdfViewer.js.map +1 -0
  188. package/dist/ssr/content/chart-bar.js +246 -16
  189. package/dist/ssr/content/chart-bar.js.map +1 -1
  190. package/dist/ssr/content/chart-inspection-core.js +22 -21
  191. package/dist/ssr/content/chart-inspection-core.js.map +1 -1
  192. package/dist/ssr/content/chart-line-gaps.js +1 -1
  193. package/dist/ssr/content/chart-line-gaps.js.map +1 -1
  194. package/dist/ssr/content/chart-message-catalog.js +10 -0
  195. package/dist/ssr/content/chart-message-catalog.js.map +1 -1
  196. package/dist/ssr/content/chart-state-timeline.js +1 -1
  197. package/dist/ssr/content/chart-state-timeline.js.map +1 -1
  198. package/dist/ssr/content/chart-svg.js +2 -1
  199. package/dist/ssr/content/chart-svg.js.map +1 -1
  200. package/dist/ssr/content/index.js +1 -0
  201. package/dist/ssr/content/index.js.map +1 -1
  202. package/dist/ssr/content/pdf-document.js +29 -0
  203. package/dist/ssr/content/pdf-document.js.map +1 -0
  204. package/dist/ssr/content/pdf-limits.js +31 -0
  205. package/dist/ssr/content/pdf-limits.js.map +1 -0
  206. package/dist/ssr/content/pdf-messages.js +34 -2
  207. package/dist/ssr/content/pdf-messages.js.map +1 -1
  208. package/dist/ssr/inputs/ChoiceInputs.js +49 -12
  209. package/dist/ssr/inputs/ChoiceInputs.js.map +1 -1
  210. package/dist/ssr/inputs/ChoiceSlider.js +17 -12
  211. package/dist/ssr/inputs/ChoiceSlider.js.map +1 -1
  212. package/dist/ssr/inputs/DatePicker.js +14 -9
  213. package/dist/ssr/inputs/DatePicker.js.map +1 -1
  214. package/dist/ssr/inputs/PeriodPicker.js +598 -0
  215. package/dist/ssr/inputs/PeriodPicker.js.map +1 -0
  216. package/dist/ssr/inputs/index.js +4 -1
  217. package/dist/ssr/inputs/index.js.map +1 -1
  218. package/dist/ssr/inputs/input-messages.js +8 -2
  219. package/dist/ssr/inputs/input-messages.js.map +1 -1
  220. package/dist/ssr/inputs/markdown/MarkdownEditor.js +3 -2
  221. package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
  222. package/dist/ssr/inputs/markdown/SlashCommands.js +339 -0
  223. package/dist/ssr/inputs/markdown/SlashCommands.js.map +1 -0
  224. package/dist/ssr/inputs/period-picker-messages.js +71 -0
  225. package/dist/ssr/inputs/period-picker-messages.js.map +1 -0
  226. package/dist/ssr/inputs/period.js +263 -0
  227. package/dist/ssr/inputs/period.js.map +1 -0
  228. package/dist/ssr/layout/DetailPanel.js +27 -4
  229. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  230. package/dist/ssr/layout/Discussion.js +16 -2
  231. package/dist/ssr/layout/Discussion.js.map +1 -1
  232. package/dist/ssr/layout/index.js.map +1 -1
  233. package/dist/ssr/surfaces/DescriptionList.js +1 -1
  234. package/dist/ssr/surfaces/DescriptionList.js.map +1 -1
  235. package/dist/ssr/surfaces/StatCell.js +4 -5
  236. package/dist/ssr/surfaces/StatCell.js.map +1 -1
  237. package/dist/ssr/surfaces/delta-badge.js +16 -2
  238. package/dist/ssr/surfaces/delta-badge.js.map +1 -1
  239. package/dist/ssr/widgets/DashboardFrame.js +200 -0
  240. package/dist/ssr/widgets/DashboardFrame.js.map +1 -0
  241. package/dist/ssr/widgets/index.js +1 -0
  242. package/dist/ssr/widgets/index.js.map +1 -1
  243. package/dist/styles.css +1 -1
  244. package/dist/types/actions/Button.d.ts +1 -1
  245. package/dist/types/actions/CommandList.d.ts +120 -0
  246. package/dist/types/actions/CommandMenu.d.ts +39 -0
  247. package/dist/types/actions/Dropdown.d.ts +17 -0
  248. package/dist/types/actions/command-dock.d.ts +8 -0
  249. package/dist/types/actions/command-items.d.ts +134 -0
  250. package/dist/types/actions/command-messages.d.ts +19 -0
  251. package/dist/types/actions/index.d.ts +3 -0
  252. package/dist/types/charts/core/calendar.d.ts +1 -1
  253. package/dist/types/charts/core/chart-messages.d.ts +5 -0
  254. package/dist/types/charts/core/hbar-layout.d.ts +74 -0
  255. package/dist/types/charts/core/hbar.d.ts +13 -0
  256. package/dist/types/charts/core/index.d.ts +7 -2
  257. package/dist/types/charts/core/map.d.ts +3 -0
  258. package/dist/types/charts/core/registry.d.ts +17 -11
  259. package/dist/types/charts/core/render-size.d.ts +7 -0
  260. package/dist/types/charts/core/render.d.ts +1 -4
  261. package/dist/types/charts/core/snapshot.d.ts +2 -2
  262. package/dist/types/charts/core/svg-renderers.d.ts +722 -0
  263. package/dist/types/charts/core/svg.d.ts +4 -698
  264. package/dist/types/charts/core/types.d.ts +1 -12
  265. package/dist/types/charts/core/waterfall.d.ts +68 -0
  266. package/dist/types/charts/description.d.ts +226 -0
  267. package/dist/types/charts.d.ts +1 -0
  268. package/dist/types/content/Chart.d.ts +3 -91
  269. package/dist/types/content/ChartRoot.d.ts +92 -0
  270. package/dist/types/content/ChartSparkline.d.ts +5 -0
  271. package/dist/types/content/PdfViewer.d.ts +32 -0
  272. package/dist/types/content/chart-bar.d.ts +95 -2
  273. package/dist/types/content/index.d.ts +2 -0
  274. package/dist/types/content/pdf-document.d.ts +5 -0
  275. package/dist/types/content/pdf-engine.d.ts +9 -0
  276. package/dist/types/content/pdf-limits.d.ts +43 -0
  277. package/dist/types/content/pdf-messages.d.ts +16 -0
  278. package/dist/types/inputs/ChoiceInputs.d.ts +4 -0
  279. package/dist/types/inputs/ChoiceSlider.d.ts +12 -0
  280. package/dist/types/inputs/DatePicker.d.ts +22 -0
  281. package/dist/types/inputs/PeriodPicker.d.ts +24 -0
  282. package/dist/types/inputs/index.d.ts +8 -2
  283. package/dist/types/inputs/input-messages.d.ts +3 -0
  284. package/dist/types/inputs/markdown/MarkdownEditor.d.ts +5 -0
  285. package/dist/types/inputs/markdown/SlashCommands.d.ts +20 -0
  286. package/dist/types/inputs/period-picker-messages.d.ts +34 -0
  287. package/dist/types/inputs/period.d.ts +134 -0
  288. package/dist/types/layout/DetailPanel.d.ts +12 -0
  289. package/dist/types/layout/index.d.ts +1 -1
  290. package/dist/types/surfaces/DescriptionList.d.ts +5 -0
  291. package/dist/types/surfaces/StatCell.d.ts +6 -1
  292. package/dist/types/widgets/DashboardFrame.d.ts +58 -0
  293. package/dist/types/widgets/index.d.ts +1 -0
  294. package/package.json +2 -1
@@ -0,0 +1,475 @@
1
+ import { ssrStyleProperty as _$ssrStyleProperty } from "solid-js/web";
2
+ import { ssrStyle as _$ssrStyle } from "solid-js/web";
3
+ import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
4
+ import { createComponent as _$createComponent } from "solid-js/web";
5
+ import { ssr as _$ssr } from "solid-js/web";
6
+ import { escape as _$escape } from "solid-js/web";
7
+ var _tmpl$ = ["<i class=\"", "\" aria-hidden=\"true\"></i>"],
8
+ _tmpl$2 = ["<div class=\"k2b-chart__legend\" role=\"group\"", " tabindex=\"0\">", "</div>"],
9
+ _tmpl$3 = ["<div class=\"k2b-chart__controls\">", "", "", "</div>"],
10
+ _tmpl$4 = ["<div class=\"", "\"", " data-interactive=\"true\" style=\"", "\" role=\"group\"", " tabindex=\"0\">", "<div class=\"k2b-chart__svg\"", " style=\"", "\">", "</div><span class=\"k2b-chart__anchor\" aria-hidden=\"true\"></span><span", " role=\"tooltip\" popover=\"manual\" data-instant=\"true\" class=\"k2b-tooltip k2b-chart__tooltip\"></span>", "</div>"],
11
+ _tmpl$5 = ["<div class=\"", "\" style=\"", "\">", "</div>"],
12
+ _tmpl$6 = ["<b data-chart-legend-value", ">", "</b>"],
13
+ _tmpl$7 = ["<span class=\"k2b-chart__legend-item\"><svg class=\"", "\" viewBox=\"0 0 10 10\" width=\"10\" height=\"10\" aria-hidden=\"true\"><rect x=\"1\" y=\"1\" width=\"8\" height=\"8\" rx=\"2\" class=\"", "\" fill=\"", "\" stroke=\"none\"></rect></svg><span>", "</span>", "</span>"];
14
+ import { createEffect, createMemo, createSignal, createUniqueId, For, onCleanup, onMount, Show, splitProps, untrack } from "solid-js";
15
+ import { isServer } from "solid-js/web";
16
+ import { IconButton } from "../actions/Button";
17
+ import { calendarLayout } from "../charts/core/calendar";
18
+ import { chartRenderHeight, preservesAspectRatio } from "../charts/core/render-size";
19
+ import { suppressTextSelection } from "../internal/text-selection";
20
+ import { useLocale } from "../intl/locale";
21
+ import { useUiMessages } from "../intl/messages";
22
+ import { calendarInspectionNavigation, mountCalendarScroll } from "./chart-calendar";
23
+ import { createChartInspection } from "./chart-inspection";
24
+ import { closeChartInspectionOnOutside } from "./chart-inspection-core";
25
+ import { DEFAULT_MAP_VIEWPORT, normalizeMapViewport, panMapViewport, zoomMapViewport } from "./chart-map-viewport";
26
+ import { resolveChartMessages, useChartMessages } from "./chart-messages";
27
+ import { panStateTimelineViewport, stateTimelineDomain, stateTimelineHeight, zoomStateTimelineViewport } from "./chart-state-timeline";
28
+ import { selectedChartSvg } from "./chart-svg";
29
+ import { useViewportMessages } from "./viewport-messages";
30
+
31
+ /**
32
+ * Chart — Solid interaction and sizing around the portable UI chart core.
33
+ *
34
+ * **Live-update story.** `charts.<kind>(opts)` returns an SVG string;
35
+ * Solid's `innerHTML` is reactive, so any time a prop (signal, store
36
+ * slice, derived value) changes, the SVG re-renders. No manual
37
+ * subscription, no imperative DOM patching. Trade-off: every change
38
+ * is a full SVG re-build, not a diff — fine for dashboard cadences
39
+ * (poll, websocket, store updates). Don't use this for 60fps streaming.
40
+ *
41
+ * **Sizing.** The server and browser render the same logical viewBox. CSS
42
+ * fits Cartesian plots to the container and preserves text/marker sizes;
43
+ * maps fit the whole world and zoom uniformly across the full plot; pies, donuts and gauges retain
44
+ * their aspect ratio. No measurement
45
+ * or hydration redraw is needed. The caller sizes the wrapper, for example
46
+ * `style={{ height: "14rem" }}`. State timelines derive their default height
47
+ * from the row count and legend via `stateTimelineHeight()`.
48
+ *
49
+ * **Why so thin.** The props are a discriminated union over each
50
+ * registered core chart renderer — `kind: "line"` brings in exactly the params
51
+ * `charts.line` expects, `kind: "bar"` brings in `charts.bar`'s, etc.
52
+ * Options stay aligned with the core renderer without renaming. Every chart provides
53
+ * renderer-owned inspection, tooltips and optional selection by default.
54
+ * `interactive` adds bounded pan / zoom and reset controls to maps and state timelines.
55
+ * When a core renderer gains an option, it is automatically available at every
56
+ * callsite.
57
+ *
58
+ * **Theming.** The core renderers use `currentColor` for axes / ticks /
59
+ * tick labels — set the wrapping element's `color` and everything
60
+ * inherits. Series colors come from `--stdlib-chart-c1..c8` CSS
61
+ * custom properties; override on the parent for per-chart palettes.
62
+ *
63
+ * ```tsx
64
+ * <Chart kind="line" style={{ height: "12rem" }}
65
+ * series={[{ data: points() }]}
66
+ * yAxis={{ format: v => `€${v}k` }} />
67
+ *
68
+ * <Chart kind="donut" style={{ height: "12rem" }} data={slices()} />
69
+ *
70
+ * <Chart kind="sparkline" style={{ width: "6rem", height: "1.5rem" }} data={trend()} />
71
+ *
72
+ * <Chart kind="map" style={{ height: "16rem" }} series={locations()} interactive />
73
+ * ```
74
+ */
75
+
76
+ /** All registered chart kinds. */
77
+
78
+ /**
79
+ * Per-kind props: `kind` discriminator + the exact options that
80
+ * `charts.<kind>` accepts, **minus** `width` / `height` (the wrapper
81
+ * owns those — CSS fits a stable coordinate space to the box). Solid's
82
+ * component model handles discriminated unions natively, so callsites
83
+ * get full type safety.
84
+ */
85
+
86
+ /** Empty-data short-circuit. Kept per-kind because each renderer's payload
87
+ * key differs (series vs data vs groups). We're conservative: only
88
+ * block on truly empty inputs; partially-filled series get rendered
89
+ * as-is and the core handles the gaps. */
90
+ const isEmpty = props => {
91
+ if (props.kind === "area") return !props.x.length || !props.series.length || props.x.every((_, i) => props.series.some(s => s.data[i] === null) || props.normalize && props.series.every(s => s.data[i] === 0));
92
+ if (props.kind === "line" || props.kind === "scatter") {
93
+ return !props.series?.length || props.series.every(s => !s.data.length);
94
+ }
95
+ if (props.kind === "hbar") return !props.rows.length;
96
+ if (props.kind === "bar") return props.series ? !props.x?.length || !props.series.some(s => s.data.some(v => v !== null && Number.isFinite(v))) : !props.data?.length;
97
+ if (props.kind === "donut" || props.kind === "pie") {
98
+ return !props.data?.length;
99
+ }
100
+ if (props.kind === "histogram" || props.kind === "sparkline") {
101
+ return !props.data?.length;
102
+ }
103
+ if (props.kind === "boxplot") {
104
+ return !props.groups?.length;
105
+ }
106
+ if (props.kind === "stateTimeline") {
107
+ return !props.rows?.length || props.rows.every(row => !row.intervals.length);
108
+ }
109
+ return false;
110
+ };
111
+ export const renderChartRoot = (props, renderChartSvg) => {
112
+ const [, drawingProps] = splitProps(props, ["class", "style", "labels", "interactive", "selected", "onSelect", "tooltip", "cursor"]);
113
+ const messages = useUiMessages();
114
+ const chartMessages = useChartMessages();
115
+ const viewportMessages = useViewportMessages();
116
+ const locale = useLocale();
117
+ let containerRef;
118
+ let chartTooltipRef;
119
+ let lineAnchorRef;
120
+ // One deterministic coordinate space on the server and client. CSS fits the
121
+ // SVG to its box; hydration must never replace it with measured geometry.
122
+ const calendar = () => props.kind === "heatmap" && props.layout === "calendar" ? calendarLayout({
123
+ ...props,
124
+ locale: props.locale ?? locale()
125
+ }) : undefined;
126
+ const size = () => ({
127
+ width: calendar()?.width ?? 480,
128
+ height: chartRenderHeight(props)
129
+ });
130
+ const topLegend = () => props.kind === "area" ? props.legend !== false : props.kind === "line" && props.legend === true && props.legendPlacement === "top-start";
131
+ const legendSeries = () => props.kind === "line" || props.kind === "area" ? props.series : [];
132
+ const legendValue = index => {
133
+ if (props.kind !== "area") return "";
134
+ const last = props.x.length - 1;
135
+ const amount = props.series[index]?.data[last];
136
+ const values = props.series.map(s => s.data[last]);
137
+ const total = values.reduce((sum, value) => sum + (value ?? 0), 0);
138
+ if (amount == null || values.some(v => v == null) || props.normalize && total === 0) return "—";
139
+ return props.normalize ? new Intl.NumberFormat(locale(), {
140
+ style: "percent",
141
+ minimumFractionDigits: 1,
142
+ maximumFractionDigits: 1
143
+ }).format(amount / total) : props.format?.(amount) ?? new Intl.NumberFormat(locale(), {
144
+ maximumFractionDigits: 2
145
+ }).format(amount);
146
+ };
147
+ const dimensions = () => containerRef?.getBoundingClientRect() ?? size();
148
+ const initialMapViewport = props.kind === "map" ? normalizeMapViewport(props.viewport) : DEFAULT_MAP_VIEWPORT;
149
+ const [mapViewport, setMapViewport] = createSignal(initialMapViewport);
150
+ const initialTimelineViewport = props.kind === "stateTimeline" ? stateTimelineDomain(props.rows, props.domain) : [0, 1];
151
+ const [timelineViewport, setTimelineViewport] = createSignal(initialTimelineViewport);
152
+ const [dragging, setDragging] = createSignal(false);
153
+ const chartTooltipId = `k2b-chart-tooltip-${createUniqueId()}`;
154
+ let timelineViewportLocallyChanged = false;
155
+ let drag;
156
+ let timelineDrag;
157
+ let pointerFrame;
158
+ let pendingPointer;
159
+ const interactiveMap = () => props.kind === "map" && props.interactive === true;
160
+ const interactiveTimeline = () => props.kind === "stateTimeline" && props.interactive === true;
161
+ const draggable = () => interactiveMap() || interactiveTimeline();
162
+ const labels = () => props.labels ?? {};
163
+ const accessibleName = () => {
164
+ const override = props.kind === "map" ? labels().interactiveMap : props.kind === "stateTimeline" ? labels().interactiveTimeline : props.kind === "line" ? labels().interactiveLine : labels().interactiveChart;
165
+ const title = "title" in props && typeof props.title === "string" && props.title.trim() ? props.title : undefined;
166
+ const valueLabel = (props.kind === "stat" || props.kind === "gauge") && props.label?.trim() ? props.label : undefined;
167
+ const fallback = props.kind === "map" ? chartMessages().interactiveMap : props.kind === "stateTimeline" ? chartMessages().interactiveTimeline : props.kind === "line" ? chartMessages().interactiveLineChart : chartMessages().interactiveChart;
168
+ return override ?? title ?? valueLabel ?? fallback;
169
+ };
170
+ const timelineFullDomain = () => props.kind === "stateTimeline" ? stateTimelineDomain(props.rows, props.domain) : [0, 1];
171
+ createEffect(() => {
172
+ if (props.kind === "map") {
173
+ setMapViewport(normalizeMapViewport(props.viewport));
174
+ }
175
+ });
176
+ createEffect(() => {
177
+ if (props.kind === "stateTimeline" && !timelineViewportLocallyChanged) {
178
+ setTimelineViewport(timelineFullDomain());
179
+ }
180
+ });
181
+ const updateTimelineViewport = update => {
182
+ timelineViewportLocallyChanged = true;
183
+ setTimelineViewport(update);
184
+ };
185
+ const mapDimensions = () => {
186
+ const viewportElement = containerRef?.querySelector(".stdlib-chart-map-viewport");
187
+ const matrix = viewportElement?.getScreenCTM?.();
188
+ const box = viewportElement?.viewBox?.baseVal;
189
+ if (matrix && box?.width && box.height) {
190
+ return {
191
+ width: box.width * Math.hypot(matrix.a, matrix.b),
192
+ height: box.height * Math.hypot(matrix.c, matrix.d)
193
+ };
194
+ }
195
+ const rect = viewportElement?.getBoundingClientRect();
196
+ if (rect && rect.width > 0 && rect.height > 0) {
197
+ return {
198
+ width: rect.width,
199
+ height: rect.height
200
+ };
201
+ }
202
+ return dimensions();
203
+ };
204
+ const zoom = delta => {
205
+ closeChartTooltip();
206
+ if (interactiveMap()) {
207
+ setMapViewport(current => zoomMapViewport(current, delta, props.kind === "map" ? props.zoomFocus : undefined));
208
+ } else if (interactiveTimeline()) {
209
+ updateTimelineViewport(current => zoomStateTimelineViewport(current, timelineFullDomain(), delta));
210
+ }
211
+ };
212
+ const reset = () => {
213
+ closeChartTooltip();
214
+ if (interactiveMap() && props.kind === "map") {
215
+ setMapViewport(normalizeMapViewport(props.viewport));
216
+ }
217
+ if (interactiveTimeline()) {
218
+ timelineViewportLocallyChanged = false;
219
+ setTimelineViewport(timelineFullDomain());
220
+ }
221
+ };
222
+ const handlePointerDown = event => {
223
+ inspection.down(event);
224
+ if (!draggable() || event.button !== 0 || event.target.closest("button, a")) {
225
+ return;
226
+ }
227
+ closeChartTooltip();
228
+ // The pointer's own pointerup or pointercancel ends the hold.
229
+ suppressTextSelection(event.pointerId);
230
+ if (interactiveTimeline()) {
231
+ timelineDrag = {
232
+ pointerId: event.pointerId,
233
+ x: event.clientX,
234
+ width: Math.max(1, event.currentTarget.getBoundingClientRect().width),
235
+ viewport: timelineViewport()
236
+ };
237
+ event.currentTarget.setPointerCapture(event.pointerId);
238
+ setDragging(true);
239
+ return;
240
+ }
241
+ const dimensions = mapDimensions();
242
+ drag = {
243
+ pointerId: event.pointerId,
244
+ x: event.clientX,
245
+ y: event.clientY,
246
+ width: dimensions.width,
247
+ height: dimensions.height,
248
+ viewport: mapViewport()
249
+ };
250
+ event.currentTarget.setPointerCapture(event.pointerId);
251
+ setDragging(true);
252
+ };
253
+ const flushPointerMove = () => {
254
+ if (pointerFrame !== undefined) {
255
+ cancelAnimationFrame(pointerFrame);
256
+ pointerFrame = undefined;
257
+ }
258
+ const sample = pendingPointer;
259
+ pendingPointer = undefined;
260
+ if (!sample) return;
261
+ const start = timelineDrag ?? drag;
262
+ if (start && Math.hypot(sample.clientX - start.x, sample.clientY - ("y" in start ? start.y : sample.clientY)) <= 6) return;
263
+ const activeTimelineDrag = timelineDrag;
264
+ if (activeTimelineDrag?.pointerId === sample.pointerId) {
265
+ updateTimelineViewport(() => panStateTimelineViewport(activeTimelineDrag.viewport, timelineFullDomain(), sample.clientX - activeTimelineDrag.x, activeTimelineDrag.width));
266
+ return;
267
+ }
268
+ if (!drag || drag.pointerId !== sample.pointerId) return;
269
+ setMapViewport(panMapViewport(drag.viewport, sample.clientX - drag.x, sample.clientY - drag.y, drag.width, drag.height));
270
+ };
271
+ const handlePointerMove = event => {
272
+ inspection.move(event);
273
+ if (timelineDrag?.pointerId !== event.pointerId && drag?.pointerId !== event.pointerId) return;
274
+ pendingPointer = {
275
+ pointerId: event.pointerId,
276
+ clientX: event.clientX,
277
+ clientY: event.clientY
278
+ };
279
+ if (pointerFrame !== undefined) return;
280
+ pointerFrame = requestAnimationFrame(flushPointerMove);
281
+ };
282
+ const stopDragging = event => {
283
+ inspection.up();
284
+ if (pendingPointer?.pointerId === event.pointerId) flushPointerMove();
285
+ if (timelineDrag?.pointerId === event.pointerId) {
286
+ if (event.currentTarget.hasPointerCapture(event.pointerId)) {
287
+ event.currentTarget.releasePointerCapture(event.pointerId);
288
+ }
289
+ timelineDrag = undefined;
290
+ setDragging(false);
291
+ return;
292
+ }
293
+ if (!drag || drag.pointerId !== event.pointerId) return;
294
+ if (event.currentTarget.hasPointerCapture(event.pointerId)) {
295
+ event.currentTarget.releasePointerCapture(event.pointerId);
296
+ }
297
+ drag = undefined;
298
+ setDragging(false);
299
+ };
300
+ const handleWheel = event => {
301
+ if (interactiveMap() && (event.ctrlKey || event.metaKey)) {
302
+ event.preventDefault();
303
+ zoom(event.deltaY < 0 ? 1 : -1);
304
+ return;
305
+ }
306
+ if (!interactiveTimeline()) return;
307
+ if (event.ctrlKey || event.metaKey) {
308
+ event.preventDefault();
309
+ const rect = event.currentTarget.getBoundingClientRect();
310
+ const anchor = rect.width > 0 ? (event.clientX - rect.left) / rect.width : 0.5;
311
+ updateTimelineViewport(current => zoomStateTimelineViewport(current, timelineFullDomain(), event.deltaY < 0 ? 1 : -1, anchor));
312
+ } else if (event.shiftKey) {
313
+ event.preventDefault();
314
+ updateTimelineViewport(current => panStateTimelineViewport(current, timelineFullDomain(), -event.deltaY, event.currentTarget.getBoundingClientRect().width));
315
+ }
316
+ };
317
+ const handleKeyDown = event => {
318
+ if (inspection.key(event)) return;
319
+ if (!draggable() || event.target !== containerRef) return;
320
+ if (event.key === "+" || event.key === "=") {
321
+ event.preventDefault();
322
+ zoom(1);
323
+ return;
324
+ }
325
+ if (event.key === "-" || event.key === "_") {
326
+ event.preventDefault();
327
+ zoom(-1);
328
+ return;
329
+ }
330
+ if (event.key === "0" || event.key === "Home") {
331
+ event.preventDefault();
332
+ reset();
333
+ return;
334
+ }
335
+ if (interactiveTimeline() && (event.key === "ArrowLeft" || event.key === "ArrowRight")) {
336
+ event.preventDefault();
337
+ updateTimelineViewport(current => panStateTimelineViewport(current, timelineFullDomain(), event.key === "ArrowLeft" ? 80 : -80, event.currentTarget.getBoundingClientRect().width));
338
+ return;
339
+ }
340
+ const delta = {
341
+ ArrowLeft: [40, 0],
342
+ ArrowRight: [-40, 0],
343
+ ArrowUp: [0, 40],
344
+ ArrowDown: [0, -40]
345
+ }[event.key];
346
+ if (!delta) return;
347
+ event.preventDefault();
348
+ const dimensions = mapDimensions();
349
+ setMapViewport(current => panMapViewport(current, delta[0], delta[1], dimensions.width, dimensions.height));
350
+ };
351
+ const inspection = createChartInspection({
352
+ container: () => containerRef,
353
+ locale,
354
+ cursor: () => props.cursor,
355
+ tooltip: () => chartTooltipRef,
356
+ anchor: () => lineAnchorRef,
357
+ kind: () => props.kind,
358
+ nav: () => props.kind === "heatmap" && props.layout === "calendar" ? calendarInspectionNavigation : undefined,
359
+ enabled: () => !isEmpty(props),
360
+ select: selection => props.onSelect?.(selection),
361
+ format: selection => {
362
+ if (props.tooltip) return props.tooltip(selection);
363
+ const fields = props.kind === "heatmap" && props.layout === "calendar" ? resolveChartMessages(props.locale ?? locale()).chartFields : chartMessages().chartFields;
364
+ if (selection.kind === "area" && props.kind === "area") {
365
+ const amount = selection.datum.values.find(f => f.key === "value");
366
+ const share = selection.datum.values.find(f => f.key === "percent");
367
+ return {
368
+ title: selection.datum.values.find(f => f.key === "x")?.formatted ?? "",
369
+ rows: [{
370
+ label: selection.datum.label ?? chartMessages().series,
371
+ value: `${share ? `${share.formatted} · ` : ""}${amount.formatted}`
372
+ }]
373
+ };
374
+ }
375
+ const format = new Intl.NumberFormat(locale(), {
376
+ maximumFractionDigits: 6
377
+ });
378
+ return {
379
+ title: selection.datum.label ?? (selection.datum.seriesIndex !== undefined ? `${labels().series ?? chartMessages().series} ${selection.datum.seriesIndex + 1}` : undefined),
380
+ rows: selection.datum.values.filter(field => selection.kind !== "waterfall" || field.key !== "before").map(field => ({
381
+ label: props.kind === "heatmap" && props.layout === "calendar" && field.key === "value" && props.label ? props.label : selection.kind === "line" && field.key === "y" ? selection.datum.label ?? labels().series ?? chartMessages().series : (props.kind === "bar" || props.kind === "hbar") && field.key.startsWith("series:") ? (props.kind === "hbar" ? props.series[Number(field.key.slice(7))] : props.series?.[Number(field.key.slice(7))]?.label) ?? fields({
382
+ key: field.key
383
+ }) : props.kind === "bar" && field.key === "previous" ? props.compare?.label ?? fields({
384
+ key: field.key
385
+ }) : fields({
386
+ key: field.key
387
+ }),
388
+ value: field.formatted ?? (field.key === "upperInclusive" ? field.value === "true" ? messages().yes : messages().no : typeof field.value === "number" ? `${format.format(field.value)}${field.key === "percent" ? "%" : ""}` : field.value)
389
+ }))
390
+ };
391
+ }
392
+ });
393
+ const closeChartTooltip = () => inspection.close();
394
+ const svgMarkup = createMemo(() => renderChartSvg(props.kind === "heatmap" && props.layout === "calendar" ? {
395
+ ...props,
396
+ locale: props.locale ?? locale()
397
+ } : {
398
+ ...drawingProps,
399
+ ...(props.kind === "bar" || props.kind === "hbar" ? {
400
+ locale: locale()
401
+ } : {})
402
+ }, size().width, size().height, interactiveMap() ? mapViewport() : undefined, interactiveTimeline() ? timelineViewport() : undefined, locale()));
403
+ createEffect(() => {
404
+ svgMarkup();
405
+ inspection.invalidate();
406
+ untrack(() => inspection.selectDatum(props.selected));
407
+ });
408
+ createEffect(() => inspection.selectDatum(props.selected));
409
+ onCleanup(() => {
410
+ inspection.close();
411
+ if (pointerFrame !== undefined) cancelAnimationFrame(pointerFrame);
412
+ pointerFrame = undefined;
413
+ pendingPointer = undefined;
414
+ });
415
+ onMount(() => {
416
+ if (!containerRef) return;
417
+ if (props.kind === "heatmap" && props.layout === "calendar") onCleanup(mountCalendarScroll(containerRef));
418
+ onCleanup(closeChartInspectionOnOutside({
419
+ container: () => containerRef,
420
+ tooltip: () => chartTooltipRef,
421
+ close: closeChartTooltip,
422
+ keepScroll: () => props.kind === "heatmap" && props.layout === "calendar"
423
+ }));
424
+ });
425
+ const chartStyle = () => props.style ?? (props.kind === "stateTimeline" ? {
426
+ height: `${stateTimelineHeight(props.rows.length, props.legend !== false)}px`
427
+ } : undefined);
428
+ const control = (label, shortcut, icon, action) => _$createComponent(IconButton, {
429
+ variant: "secondary",
430
+ label: label,
431
+ tooltip: `${label} (${shortcut})`,
432
+ onClick: action,
433
+ get children() {
434
+ return _$ssr(_tmpl$, `ti ${_$escape(icon, true)}`);
435
+ }
436
+ });
437
+ return _$createComponent(Show, {
438
+ get when() {
439
+ return !isEmpty(props);
440
+ },
441
+ get fallback() {
442
+ return _$ssr(_tmpl$5, `k2b-chart k2b-chart__empty ${_$escape(props.class ?? "", true)}`, _$ssrStyle(chartStyle()), _$escape(labels().empty ?? messages().noData));
443
+ },
444
+ get children() {
445
+ return _$ssr(_tmpl$4, `k2b-chart ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("data-chart-kind", _$escape(props.kind, true), false) + _$ssrAttribute("data-legend-placement", topLegend() ? "top-start" : _$escape(undefined, true), false) + _$ssrAttribute("data-drag", draggable() ? dragging() ? "active" : "idle" : _$escape(undefined, true), false) + _$ssrAttribute("data-crosshair", !draggable() && props.kind === "line" ? "true" : _$escape(undefined, true), false), _$ssrStyle(chartStyle()), _$ssrAttribute("aria-label", _$escape(accessibleName(), true), false) + _$ssrAttribute("aria-description", accessibleName() !== chartMessages().interactiveChart ? _$escape(chartMessages().interactiveChart, true) : _$escape(undefined, true), false), _$escape(_$createComponent(Show, {
446
+ get when() {
447
+ return topLegend();
448
+ },
449
+ get children() {
450
+ return _$ssr(_tmpl$2, _$ssrAttribute("aria-label", _$escape(chartMessages().chartLegend, true), false), _$escape(_$createComponent(For, {
451
+ get each() {
452
+ return legendSeries();
453
+ },
454
+ children: (series, index) => _$ssr(_tmpl$7, `stdlib-chart k2b-chart__legend-swatch ${props.kind === "line" ? _$escape(props.className ?? "", true) : ""}`, `stdlib-chart-series-${_$escape(index(), true) % 8}`, `var(--stdlib-chart-c${_$escape(index(), true) % 8 + 1}, ${_$escape(["#2563eb", "#16a34a", "#d97706", "#dc2626", "#a855f7", "#0891b2", "#db2777", "#65a30d"][index() % 8], true)})`, series.label && series.label.length > 0 ? _$escape(series.label) : `${_$escape(chartMessages().series)} ${_$escape(index()) + 1}`, _$escape(_$createComponent(Show, {
455
+ get when() {
456
+ return props.kind === "area";
457
+ },
458
+ get children() {
459
+ return _$ssr(_tmpl$6, _$ssrAttribute("data-series-index", _$escape(index(), true), false) + _$ssrAttribute("data-field", props.kind === "area" && props.normalize ? "percent" : "value", false) + _$ssrAttribute("data-default", _$escape(legendValue(index()), true), false), _$escape(legendValue(index())));
460
+ }
461
+ })))
462
+ })));
463
+ }
464
+ })), _$ssrAttribute("data-stretch", !calendar() && !preservesAspectRatio(props.kind) ? "true" : _$escape(undefined, true), false), _$ssrStyleProperty("min-width:", calendar() ? `${_$escape(calendar().minWidth, true)}px` : _$escape(undefined, true)) + _$ssrStyleProperty(";--k2b-chart-width:", `${_$escape(size().width, true)}px`) + _$ssrStyleProperty(";--k2b-chart-height:", `${_$escape(size().height, true)}px`) + _$ssrStyleProperty(";aspect-ratio:", `${_$escape(size().width, true)} / ${_$escape(size().height, true)}`), isServer ? selectedChartSvg(svgMarkup(), props.selected) : svgMarkup(), _$ssrAttribute("id", _$escape(chartTooltipId, true), false), _$escape(_$createComponent(Show, {
465
+ get when() {
466
+ return draggable();
467
+ },
468
+ get children() {
469
+ return _$ssr(_tmpl$3, _$escape(control(labels().zoomIn ?? viewportMessages().zoomIn, "+", "ti-plus", () => zoom(1))), _$escape(control(labels().zoomOut ?? viewportMessages().zoomOut, "-", "ti-minus", () => zoom(-1))), _$escape(control(interactiveMap() ? labels().resetMap ?? chartMessages().resetMapView : labels().resetTimeline ?? chartMessages().resetTimelineView, "0", "ti-focus-centered", reset)));
470
+ }
471
+ })));
472
+ }
473
+ });
474
+ };
475
+ //# sourceMappingURL=ChartRoot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["content/ChartRoot.tsx"],"sourcesContent":["import type { JSX } from \"solid-js\";\nimport { createEffect, createMemo, createSignal, createUniqueId, For, onCleanup, onMount, Show, splitProps, untrack } from \"solid-js\";\nimport { isServer } from \"solid-js/web\";\nimport { IconButton } from \"../actions/Button\";\nimport type { MapViewport } from \"../charts/core\";\nimport { calendarLayout } from \"../charts/core/calendar\";\nimport type { ChartDrawingOptions } from \"../charts/core/render\";\nimport { chartRenderHeight, preservesAspectRatio } from \"../charts/core/render-size\";\nimport { suppressTextSelection } from \"../internal/text-selection\";\nimport { useLocale } from \"../intl/locale\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { calendarInspectionNavigation, mountCalendarScroll } from \"./chart-calendar\";\nimport type { ChartCursor } from \"./chart-cursor\";\nimport { createChartInspection } from \"./chart-inspection\";\nimport {\n type ChartDatumRef,\n type ChartKind,\n type ChartSelection,\n type ChartTooltipFormatter,\n closeChartInspectionOnOutside,\n} from \"./chart-inspection-core\";\nimport { DEFAULT_MAP_VIEWPORT, normalizeMapViewport, panMapViewport, zoomMapViewport } from \"./chart-map-viewport\";\nimport { resolveChartMessages, useChartMessages } from \"./chart-messages\";\nimport {\n panStateTimelineViewport,\n type StateTimelineDomain,\n stateTimelineDomain,\n stateTimelineHeight,\n zoomStateTimelineViewport,\n} from \"./chart-state-timeline\";\nimport { selectedChartSvg } from \"./chart-svg\";\nimport { useViewportMessages } from \"./viewport-messages\";\n\n/**\n * Chart — Solid interaction and sizing around the portable UI chart core.\n *\n * **Live-update story.** `charts.<kind>(opts)` returns an SVG string;\n * Solid's `innerHTML` is reactive, so any time a prop (signal, store\n * slice, derived value) changes, the SVG re-renders. No manual\n * subscription, no imperative DOM patching. Trade-off: every change\n * is a full SVG re-build, not a diff — fine for dashboard cadences\n * (poll, websocket, store updates). Don't use this for 60fps streaming.\n *\n * **Sizing.** The server and browser render the same logical viewBox. CSS\n * fits Cartesian plots to the container and preserves text/marker sizes;\n * maps fit the whole world and zoom uniformly across the full plot; pies, donuts and gauges retain\n * their aspect ratio. No measurement\n * or hydration redraw is needed. The caller sizes the wrapper, for example\n * `style={{ height: \"14rem\" }}`. State timelines derive their default height\n * from the row count and legend via `stateTimelineHeight()`.\n *\n * **Why so thin.** The props are a discriminated union over each\n * registered core chart renderer — `kind: \"line\"` brings in exactly the params\n * `charts.line` expects, `kind: \"bar\"` brings in `charts.bar`'s, etc.\n * Options stay aligned with the core renderer without renaming. Every chart provides\n * renderer-owned inspection, tooltips and optional selection by default.\n * `interactive` adds bounded pan / zoom and reset controls to maps and state timelines.\n * When a core renderer gains an option, it is automatically available at every\n * callsite.\n *\n * **Theming.** The core renderers use `currentColor` for axes / ticks /\n * tick labels — set the wrapping element's `color` and everything\n * inherits. Series colors come from `--stdlib-chart-c1..c8` CSS\n * custom properties; override on the parent for per-chart palettes.\n *\n * ```tsx\n * <Chart kind=\"line\" style={{ height: \"12rem\" }}\n * series={[{ data: points() }]}\n * yAxis={{ format: v => `€${v}k` }} />\n *\n * <Chart kind=\"donut\" style={{ height: \"12rem\" }} data={slices()} />\n *\n * <Chart kind=\"sparkline\" style={{ width: \"6rem\", height: \"1.5rem\" }} data={trend()} />\n *\n * <Chart kind=\"map\" style={{ height: \"16rem\" }} series={locations()} interactive />\n * ```\n */\n\n/** All registered chart kinds. */\nexport type { ChartKind } from \"./chart-inspection-core\";\n\nexport type ChartLabels = Partial<{\n empty: string;\n series: string;\n interactiveMap: string;\n interactiveTimeline: string;\n interactiveLine: string;\n interactiveChart: string;\n zoomIn: string;\n zoomOut: string;\n resetMap: string;\n resetTimeline: string;\n}>;\n\n/**\n * Per-kind props: `kind` discriminator + the exact options that\n * `charts.<kind>` accepts, **minus** `width` / `height` (the wrapper\n * owns those — CSS fits a stable coordinate space to the box). Solid's\n * component model handles discriminated unions natively, so callsites\n * get full type safety.\n */\nexport type ChartProps = {\n [K in ChartKind]: Extract<ChartDrawingOptions, { kind: K }> & {\n class?: string;\n style?: JSX.CSSProperties | string;\n labels?: ChartLabels;\n /**\n * Navigation for maps and state timelines: pan, zoom and reset controls.\n * Arrows pan; Alt+arrows inspect. Every chart shows tooltips and keyboard\n * inspection without this prop.\n */\n interactive?: boolean;\n onSelect?: (selection: ChartSelection) => void;\n /** Controlled highlight; indices belong to this exact input snapshot. */\n selected?: ChartDatumRef | null;\n /** Customize the always-on tooltip with a title and labeled text rows. */\n tooltip?: ChartTooltipFormatter;\n /** Optional shared X cursor for line charts. */\n cursor?: ChartCursor;\n };\n}[ChartKind];\n\n/** Empty-data short-circuit. Kept per-kind because each renderer's payload\n * key differs (series vs data vs groups). We're conservative: only\n * block on truly empty inputs; partially-filled series get rendered\n * as-is and the core handles the gaps. */\nconst isEmpty = (props: ChartProps): boolean => {\n if (props.kind === \"area\")\n return (\n !props.x.length ||\n !props.series.length ||\n props.x.every(\n (_, i) => props.series.some((s) => s.data[i] === null) || (props.normalize && props.series.every((s) => s.data[i] === 0)),\n )\n );\n if (props.kind === \"line\" || props.kind === \"scatter\") {\n return !props.series?.length || props.series.every((s) => !s.data.length);\n }\n if (props.kind === \"hbar\") return !props.rows.length;\n if (props.kind === \"bar\")\n return props.series\n ? !props.x?.length || !props.series.some((s) => s.data.some((v) => v !== null && Number.isFinite(v)))\n : !props.data?.length;\n if (props.kind === \"donut\" || props.kind === \"pie\") {\n return !props.data?.length;\n }\n if (props.kind === \"histogram\" || props.kind === \"sparkline\") {\n return !props.data?.length;\n }\n if (props.kind === \"boxplot\") {\n return !props.groups?.length;\n }\n if (props.kind === \"stateTimeline\") {\n return !props.rows?.length || props.rows.every((row) => !row.intervals.length);\n }\n return false;\n};\n\nexport const renderChartRoot = (props: ChartProps, renderChartSvg: typeof import(\"../charts/core/render\").renderChartSvg): JSX.Element => {\n const [, drawingProps] = splitProps(props, [\"class\", \"style\", \"labels\", \"interactive\", \"selected\", \"onSelect\", \"tooltip\", \"cursor\"]);\n const messages = useUiMessages();\n const chartMessages = useChartMessages();\n const viewportMessages = useViewportMessages();\n const locale = useLocale();\n let containerRef: HTMLDivElement | undefined;\n let chartTooltipRef: HTMLSpanElement | undefined;\n let lineAnchorRef: HTMLSpanElement | undefined;\n // One deterministic coordinate space on the server and client. CSS fits the\n // SVG to its box; hydration must never replace it with measured geometry.\n const calendar = () =>\n props.kind === \"heatmap\" && props.layout === \"calendar\" ? calendarLayout({ ...props, locale: props.locale ?? locale() }) : undefined;\n const size = () => ({\n width: calendar()?.width ?? 480,\n height: chartRenderHeight(props),\n });\n const topLegend = () =>\n props.kind === \"area\"\n ? props.legend !== false\n : props.kind === \"line\" && props.legend === true && props.legendPlacement === \"top-start\";\n const legendSeries = () => (props.kind === \"line\" || props.kind === \"area\" ? props.series : []);\n const legendValue = (index: number) => {\n if (props.kind !== \"area\") return \"\";\n const last = props.x.length - 1;\n const amount = props.series[index]?.data[last];\n const values = props.series.map((s) => s.data[last]);\n const total = values.reduce<number>((sum, value) => sum + (value ?? 0), 0);\n if (amount == null || values.some((v) => v == null) || (props.normalize && total === 0)) return \"—\";\n return props.normalize\n ? new Intl.NumberFormat(locale(), { style: \"percent\", minimumFractionDigits: 1, maximumFractionDigits: 1 }).format(amount / total)\n : (props.format?.(amount) ?? new Intl.NumberFormat(locale(), { maximumFractionDigits: 2 }).format(amount));\n };\n const dimensions = () => containerRef?.getBoundingClientRect() ?? size();\n const initialMapViewport = props.kind === \"map\" ? normalizeMapViewport(props.viewport) : DEFAULT_MAP_VIEWPORT;\n const [mapViewport, setMapViewport] = createSignal<MapViewport>(initialMapViewport);\n const initialTimelineViewport =\n props.kind === \"stateTimeline\" ? stateTimelineDomain(props.rows, props.domain) : ([0, 1] as StateTimelineDomain);\n const [timelineViewport, setTimelineViewport] = createSignal<StateTimelineDomain>(initialTimelineViewport);\n const [dragging, setDragging] = createSignal(false);\n const chartTooltipId = `k2b-chart-tooltip-${createUniqueId()}`;\n let timelineViewportLocallyChanged = false;\n let drag:\n | {\n pointerId: number;\n x: number;\n y: number;\n width: number;\n height: number;\n viewport: MapViewport;\n }\n | undefined;\n let timelineDrag:\n | {\n pointerId: number;\n x: number;\n width: number;\n viewport: StateTimelineDomain;\n }\n | undefined;\n let pointerFrame: number | undefined;\n let pendingPointer: { pointerId: number; clientX: number; clientY: number } | undefined;\n\n const interactiveMap = () => props.kind === \"map\" && props.interactive === true;\n const interactiveTimeline = () => props.kind === \"stateTimeline\" && props.interactive === true;\n const draggable = () => interactiveMap() || interactiveTimeline();\n const labels = () => props.labels ?? {};\n const accessibleName = () => {\n const override =\n props.kind === \"map\"\n ? labels().interactiveMap\n : props.kind === \"stateTimeline\"\n ? labels().interactiveTimeline\n : props.kind === \"line\"\n ? labels().interactiveLine\n : labels().interactiveChart;\n const title = \"title\" in props && typeof props.title === \"string\" && props.title.trim() ? props.title : undefined;\n const valueLabel = (props.kind === \"stat\" || props.kind === \"gauge\") && props.label?.trim() ? props.label : undefined;\n const fallback =\n props.kind === \"map\"\n ? chartMessages().interactiveMap\n : props.kind === \"stateTimeline\"\n ? chartMessages().interactiveTimeline\n : props.kind === \"line\"\n ? chartMessages().interactiveLineChart\n : chartMessages().interactiveChart;\n return override ?? title ?? valueLabel ?? fallback;\n };\n const timelineFullDomain = (): StateTimelineDomain =>\n props.kind === \"stateTimeline\" ? stateTimelineDomain(props.rows, props.domain) : [0, 1];\n\n createEffect(() => {\n if (props.kind === \"map\") {\n setMapViewport(normalizeMapViewport(props.viewport));\n }\n });\n\n createEffect(() => {\n if (props.kind === \"stateTimeline\" && !timelineViewportLocallyChanged) {\n setTimelineViewport(timelineFullDomain());\n }\n });\n\n const updateTimelineViewport = (update: (current: StateTimelineDomain) => StateTimelineDomain) => {\n timelineViewportLocallyChanged = true;\n setTimelineViewport(update);\n };\n\n const mapDimensions = () => {\n const viewportElement = containerRef?.querySelector<SVGSVGElement>(\".stdlib-chart-map-viewport\");\n const matrix = viewportElement?.getScreenCTM?.();\n const box = viewportElement?.viewBox?.baseVal;\n if (matrix && box?.width && box.height) {\n return { width: box.width * Math.hypot(matrix.a, matrix.b), height: box.height * Math.hypot(matrix.c, matrix.d) };\n }\n const rect = viewportElement?.getBoundingClientRect();\n if (rect && rect.width > 0 && rect.height > 0) {\n return { width: rect.width, height: rect.height };\n }\n return dimensions();\n };\n\n const zoom = (delta: number) => {\n closeChartTooltip();\n if (interactiveMap()) {\n setMapViewport((current) => zoomMapViewport(current, delta, props.kind === \"map\" ? props.zoomFocus : undefined));\n } else if (interactiveTimeline()) {\n updateTimelineViewport((current) => zoomStateTimelineViewport(current, timelineFullDomain(), delta));\n }\n };\n\n const reset = () => {\n closeChartTooltip();\n if (interactiveMap() && props.kind === \"map\") {\n setMapViewport(normalizeMapViewport(props.viewport));\n }\n if (interactiveTimeline()) {\n timelineViewportLocallyChanged = false;\n setTimelineViewport(timelineFullDomain());\n }\n };\n\n const handlePointerDown: JSX.EventHandlerUnion<HTMLDivElement, PointerEvent> = (event) => {\n inspection.down(event);\n if (!draggable() || event.button !== 0 || (event.target as Element).closest(\"button, a\")) {\n return;\n }\n closeChartTooltip();\n // The pointer's own pointerup or pointercancel ends the hold.\n suppressTextSelection(event.pointerId);\n if (interactiveTimeline()) {\n timelineDrag = {\n pointerId: event.pointerId,\n x: event.clientX,\n width: Math.max(1, event.currentTarget.getBoundingClientRect().width),\n viewport: timelineViewport(),\n };\n event.currentTarget.setPointerCapture(event.pointerId);\n setDragging(true);\n return;\n }\n const dimensions = mapDimensions();\n drag = {\n pointerId: event.pointerId,\n x: event.clientX,\n y: event.clientY,\n width: dimensions.width,\n height: dimensions.height,\n viewport: mapViewport(),\n };\n event.currentTarget.setPointerCapture(event.pointerId);\n setDragging(true);\n };\n\n const flushPointerMove = () => {\n if (pointerFrame !== undefined) {\n cancelAnimationFrame(pointerFrame);\n pointerFrame = undefined;\n }\n const sample = pendingPointer;\n pendingPointer = undefined;\n if (!sample) return;\n const start = timelineDrag ?? drag;\n if (start && Math.hypot(sample.clientX - start.x, sample.clientY - (\"y\" in start ? start.y : sample.clientY)) <= 6) return;\n const activeTimelineDrag = timelineDrag;\n if (activeTimelineDrag?.pointerId === sample.pointerId) {\n updateTimelineViewport(() =>\n panStateTimelineViewport(\n activeTimelineDrag.viewport,\n timelineFullDomain(),\n sample.clientX - activeTimelineDrag.x,\n activeTimelineDrag.width,\n ),\n );\n return;\n }\n if (!drag || drag.pointerId !== sample.pointerId) return;\n setMapViewport(panMapViewport(drag.viewport, sample.clientX - drag.x, sample.clientY - drag.y, drag.width, drag.height));\n };\n\n const handlePointerMove: JSX.EventHandlerUnion<HTMLDivElement, PointerEvent> = (event) => {\n inspection.move(event);\n if (timelineDrag?.pointerId !== event.pointerId && drag?.pointerId !== event.pointerId) return;\n pendingPointer = { pointerId: event.pointerId, clientX: event.clientX, clientY: event.clientY };\n if (pointerFrame !== undefined) return;\n pointerFrame = requestAnimationFrame(flushPointerMove);\n };\n\n const stopDragging: JSX.EventHandlerUnion<HTMLDivElement, PointerEvent> = (event) => {\n inspection.up();\n if (pendingPointer?.pointerId === event.pointerId) flushPointerMove();\n if (timelineDrag?.pointerId === event.pointerId) {\n if (event.currentTarget.hasPointerCapture(event.pointerId)) {\n event.currentTarget.releasePointerCapture(event.pointerId);\n }\n timelineDrag = undefined;\n setDragging(false);\n return;\n }\n if (!drag || drag.pointerId !== event.pointerId) return;\n if (event.currentTarget.hasPointerCapture(event.pointerId)) {\n event.currentTarget.releasePointerCapture(event.pointerId);\n }\n drag = undefined;\n setDragging(false);\n };\n\n const handleWheel: JSX.EventHandlerUnion<HTMLDivElement, WheelEvent> = (event) => {\n if (interactiveMap() && (event.ctrlKey || event.metaKey)) {\n event.preventDefault();\n zoom(event.deltaY < 0 ? 1 : -1);\n return;\n }\n if (!interactiveTimeline()) return;\n if (event.ctrlKey || event.metaKey) {\n event.preventDefault();\n const rect = event.currentTarget.getBoundingClientRect();\n const anchor = rect.width > 0 ? (event.clientX - rect.left) / rect.width : 0.5;\n updateTimelineViewport((current) => zoomStateTimelineViewport(current, timelineFullDomain(), event.deltaY < 0 ? 1 : -1, anchor));\n } else if (event.shiftKey) {\n event.preventDefault();\n updateTimelineViewport((current) =>\n panStateTimelineViewport(current, timelineFullDomain(), -event.deltaY, event.currentTarget.getBoundingClientRect().width),\n );\n }\n };\n\n const handleKeyDown: JSX.EventHandlerUnion<HTMLDivElement, KeyboardEvent> = (event) => {\n if (inspection.key(event)) return;\n if (!draggable() || event.target !== containerRef) return;\n if (event.key === \"+\" || event.key === \"=\") {\n event.preventDefault();\n zoom(1);\n return;\n }\n if (event.key === \"-\" || event.key === \"_\") {\n event.preventDefault();\n zoom(-1);\n return;\n }\n if (event.key === \"0\" || event.key === \"Home\") {\n event.preventDefault();\n reset();\n return;\n }\n if (interactiveTimeline() && (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\")) {\n event.preventDefault();\n updateTimelineViewport((current) =>\n panStateTimelineViewport(\n current,\n timelineFullDomain(),\n event.key === \"ArrowLeft\" ? 80 : -80,\n event.currentTarget.getBoundingClientRect().width,\n ),\n );\n return;\n }\n const delta: readonly [number, number] | undefined = {\n ArrowLeft: [40, 0],\n ArrowRight: [-40, 0],\n ArrowUp: [0, 40],\n ArrowDown: [0, -40],\n }[event.key] as readonly [number, number] | undefined;\n if (!delta) return;\n event.preventDefault();\n const dimensions = mapDimensions();\n setMapViewport((current) => panMapViewport(current, delta[0], delta[1], dimensions.width, dimensions.height));\n };\n\n const inspection = createChartInspection({\n container: () => containerRef,\n locale,\n cursor: () => props.cursor,\n tooltip: () => chartTooltipRef,\n anchor: () => lineAnchorRef,\n kind: () => props.kind,\n nav: () => (props.kind === \"heatmap\" && props.layout === \"calendar\" ? calendarInspectionNavigation : undefined),\n enabled: () => !isEmpty(props),\n select: (selection) => props.onSelect?.(selection),\n format: (selection) => {\n if (props.tooltip) return props.tooltip(selection);\n const fields =\n props.kind === \"heatmap\" && props.layout === \"calendar\"\n ? resolveChartMessages(props.locale ?? locale()).chartFields\n : chartMessages().chartFields;\n if (selection.kind === \"area\" && props.kind === \"area\") {\n const amount = selection.datum.values.find((f) => f.key === \"value\")!;\n const share = selection.datum.values.find((f) => f.key === \"percent\");\n return {\n title: selection.datum.values.find((f) => f.key === \"x\")?.formatted ?? \"\",\n rows: [\n { label: selection.datum.label ?? chartMessages().series, value: `${share ? `${share.formatted} · ` : \"\"}${amount.formatted}` },\n ],\n };\n }\n const format = new Intl.NumberFormat(locale(), { maximumFractionDigits: 6 });\n return {\n title:\n selection.datum.label ??\n (selection.datum.seriesIndex !== undefined\n ? `${labels().series ?? chartMessages().series} ${selection.datum.seriesIndex + 1}`\n : undefined),\n rows: selection.datum.values\n .filter((field) => selection.kind !== \"waterfall\" || field.key !== \"before\")\n .map((field) => ({\n label:\n props.kind === \"heatmap\" && props.layout === \"calendar\" && field.key === \"value\" && props.label\n ? props.label\n : selection.kind === \"line\" && field.key === \"y\"\n ? (selection.datum.label ?? labels().series ?? chartMessages().series)\n : (props.kind === \"bar\" || props.kind === \"hbar\") && field.key.startsWith(\"series:\")\n ? ((props.kind === \"hbar\"\n ? props.series[Number(field.key.slice(7))]\n : props.series?.[Number(field.key.slice(7))]?.label) ?? fields({ key: field.key }))\n : props.kind === \"bar\" && field.key === \"previous\"\n ? (props.compare?.label ?? fields({ key: field.key }))\n : fields({ key: field.key }),\n value:\n field.formatted ??\n (field.key === \"upperInclusive\"\n ? field.value === \"true\"\n ? messages().yes\n : messages().no\n : typeof field.value === \"number\"\n ? `${format.format(field.value)}${field.key === \"percent\" ? \"%\" : \"\"}`\n : field.value),\n })),\n };\n },\n });\n const closeChartTooltip = () => inspection.close();\n const svgMarkup = createMemo(() =>\n renderChartSvg(\n props.kind === \"heatmap\" && props.layout === \"calendar\"\n ? { ...props, locale: props.locale ?? locale() }\n : { ...drawingProps, ...(props.kind === \"bar\" || props.kind === \"hbar\" ? { locale: locale() } : {}) },\n size().width,\n size().height,\n interactiveMap() ? mapViewport() : undefined,\n interactiveTimeline() ? timelineViewport() : undefined,\n locale(),\n ),\n );\n createEffect(() => {\n svgMarkup();\n inspection.invalidate();\n untrack(() => inspection.selectDatum(props.selected));\n });\n\n createEffect(() => inspection.selectDatum(props.selected));\n\n onCleanup(() => {\n inspection.close();\n if (pointerFrame !== undefined) cancelAnimationFrame(pointerFrame);\n pointerFrame = undefined;\n pendingPointer = undefined;\n });\n\n onMount(() => {\n if (!containerRef) return;\n if (props.kind === \"heatmap\" && props.layout === \"calendar\") onCleanup(mountCalendarScroll(containerRef));\n onCleanup(\n closeChartInspectionOnOutside({\n container: () => containerRef,\n tooltip: () => chartTooltipRef,\n close: closeChartTooltip,\n keepScroll: () => props.kind === \"heatmap\" && props.layout === \"calendar\",\n }),\n );\n });\n\n const chartStyle = () =>\n props.style ??\n (props.kind === \"stateTimeline\"\n ? {\n height: `${stateTimelineHeight(props.rows.length, props.legend !== false)}px`,\n }\n : undefined);\n\n const control = (label: string, shortcut: string, icon: string, action: () => void) => (\n <IconButton variant=\"secondary\" label={label} tooltip={`${label} (${shortcut})`} onClick={action}>\n <i class={`ti ${icon}`} aria-hidden=\"true\" />\n </IconButton>\n );\n\n return (\n <Show\n when={!isEmpty(props)}\n fallback={\n <div ref={containerRef} class={`k2b-chart k2b-chart__empty ${props.class ?? \"\"}`} style={chartStyle()}>\n {labels().empty ?? messages().noData}\n </div>\n }\n >\n {/* CSS fits the server-rendered SVG to the caller's box. Only changes\n to chart data/options rebuild the SVG; resizing does not. */}\n <div\n ref={containerRef}\n class={`k2b-chart ${props.class ?? \"\"}`}\n data-chart-kind={props.kind}\n data-legend-placement={topLegend() ? \"top-start\" : undefined}\n data-drag={draggable() ? (dragging() ? \"active\" : \"idle\") : undefined}\n data-crosshair={!draggable() && props.kind === \"line\" ? \"true\" : undefined}\n data-interactive=\"true\"\n style={chartStyle()}\n role=\"group\"\n aria-label={accessibleName()}\n aria-description={accessibleName() !== chartMessages().interactiveChart ? chartMessages().interactiveChart : undefined}\n tabIndex={0}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={stopDragging}\n onPointerCancel={stopDragging}\n onClick={inspection.click}\n onPointerLeave={inspection.leave}\n onFocusIn={inspection.focus}\n onFocusOut={closeChartTooltip}\n onWheel={handleWheel}\n onKeyDown={handleKeyDown}\n >\n <Show when={topLegend()}>\n <div class=\"k2b-chart__legend\" role=\"group\" aria-label={chartMessages().chartLegend} tabIndex={0}>\n <For each={legendSeries()}>\n {(series, index) => (\n <span class=\"k2b-chart__legend-item\">\n {/* Use the renderer's actual series classes/defaults, including consumer palette overrides. */}\n <svg\n class={`stdlib-chart k2b-chart__legend-swatch ${props.kind === \"line\" ? (props.className ?? \"\") : \"\"}`}\n viewBox=\"0 0 10 10\"\n width=\"10\"\n height=\"10\"\n aria-hidden=\"true\"\n >\n <rect\n x=\"1\"\n y=\"1\"\n width=\"8\"\n height=\"8\"\n rx=\"2\"\n class={`stdlib-chart-series-${index() % 8}`}\n fill={`var(--stdlib-chart-c${(index() % 8) + 1}, ${[\"#2563eb\", \"#16a34a\", \"#d97706\", \"#dc2626\", \"#a855f7\", \"#0891b2\", \"#db2777\", \"#65a30d\"][index() % 8]})`}\n stroke=\"none\"\n />\n </svg>\n <span>{series.label && series.label.length > 0 ? series.label : `${chartMessages().series} ${index() + 1}`}</span>\n <Show when={props.kind === \"area\"}>\n <b\n data-chart-legend-value\n data-series-index={index()}\n data-field={props.kind === \"area\" && props.normalize ? \"percent\" : \"value\"}\n data-default={legendValue(index())}\n >\n {legendValue(index())}\n </b>\n </Show>\n </span>\n )}\n </For>\n </div>\n </Show>\n <div\n class=\"k2b-chart__svg\"\n data-stretch={!calendar() && !preservesAspectRatio(props.kind) ? \"true\" : undefined}\n style={{\n \"min-width\": calendar() ? `${calendar()!.minWidth}px` : undefined,\n \"--k2b-chart-width\": `${size().width}px`,\n \"--k2b-chart-height\": `${size().height}px`,\n \"aspect-ratio\": `${size().width} / ${size().height}`,\n }}\n innerHTML={isServer ? selectedChartSvg(svgMarkup(), props.selected) : svgMarkup()}\n />\n <span ref={lineAnchorRef} class=\"k2b-chart__anchor\" aria-hidden=\"true\" />\n <span\n id={chartTooltipId}\n ref={chartTooltipRef}\n role=\"tooltip\"\n popover=\"manual\"\n data-instant=\"true\"\n class=\"k2b-tooltip k2b-chart__tooltip\"\n />\n <Show when={draggable()}>\n <div class=\"k2b-chart__controls\">\n {control(labels().zoomIn ?? viewportMessages().zoomIn, \"+\", \"ti-plus\", () => zoom(1))}\n {control(labels().zoomOut ?? viewportMessages().zoomOut, \"-\", \"ti-minus\", () => zoom(-1))}\n {control(\n interactiveMap()\n ? (labels().resetMap ?? chartMessages().resetMapView)\n : (labels().resetTimeline ?? chartMessages().resetTimelineView),\n \"0\",\n \"ti-focus-centered\",\n reset,\n )}\n </div>\n </Show>\n </div>\n </Show>\n );\n};\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,24 @@
1
+ import { mergeProps } from "solid-js";
2
+ import { sparkline } from "../charts/core/svg-renderers";
3
+ import { renderChartRoot } from "./ChartRoot";
4
+ import { responsiveChartSvg } from "./chart-svg";
5
+
6
+ /** The same chart host and SVG for stat trends, without the catalog dispatcher. */
7
+ export function ChartSparkline(props) {
8
+ return renderChartRoot(mergeProps(props, {
9
+ kind: "sparkline"
10
+ }), (options, width, height) => {
11
+ if (options.kind !== "sparkline") throw new Error("Expected sparkline options");
12
+ const {
13
+ kind: _kind,
14
+ ...data
15
+ } = options;
16
+ return responsiveChartSvg(sparkline({
17
+ ...data,
18
+ width,
19
+ height,
20
+ inspect: true
21
+ }));
22
+ });
23
+ }
24
+ //# sourceMappingURL=ChartSparkline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["content/ChartSparkline.tsx"],"sourcesContent":["import { mergeProps } from \"solid-js\";\nimport { sparkline } from \"../charts/core/svg-renderers\";\nimport { type ChartProps, renderChartRoot } from \"./ChartRoot\";\nimport { responsiveChartSvg } from \"./chart-svg\";\n\n/** The same chart host and SVG for stat trends, without the catalog dispatcher. */\nexport function ChartSparkline(props: Omit<Extract<ChartProps, { kind: \"sparkline\" }>, \"kind\">) {\n return renderChartRoot(mergeProps(props, { kind: \"sparkline\" as const }), (options, width, height) => {\n if (options.kind !== \"sparkline\") throw new Error(\"Expected sparkline options\");\n const { kind: _kind, ...data } = options;\n return responsiveChartSvg(sparkline({ ...data, width, height, inspect: true }));\n });\n}\n"],"mappings":"AAAA,SAAS,UAAU,QAAQ,UAAU;AACrC,SAAS,SAAS,QAAQ,8BAA8B;AACxD,SAA0B,eAAe,QAAQ,aAAa;AAC9D,SAAS,kBAAkB,QAAQ,aAAa;;AAEhD;AACA,OAAO,SAAS,cAAc,CAAC,KAA+D,EAAE;EAC9F,OAAO,eAAe,CAAC,UAAU,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE;EAAqB,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK;IACpG,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC;IAC/E,MAAM;MAAE,IAAI,EAAE,KAAK;MAAE,GAAG;IAAK,CAAC,GAAG,OAAO;IACxC,OAAO,kBAAkB,CAAC,SAAS,CAAC;MAAE,GAAG,IAAI;MAAE,KAAK;MAAE,MAAM;MAAE,OAAO,EAAE;IAAK,CAAC,CAAC,CAAC;EACjF,CAAC,CAAC;AACJ","ignoreList":[]}