@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
@@ -1,469 +1,9 @@
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, mergeProps, 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";
1
+ import { mergeProps } from "solid-js";
18
2
  import { chartKinds } from "../charts/core/registry";
19
- import { chartRenderHeight, preservesAspectRatio, renderChartSvg } from "../charts/core/render";
20
- import { suppressTextSelection } from "../internal/text-selection";
21
- import { useLocale } from "../intl/locale";
22
- import { useUiMessages } from "../intl/messages";
23
- import { calendarInspectionNavigation, mountCalendarScroll } from "./chart-calendar";
24
- import { createChartInspection } from "./chart-inspection";
25
- import { closeChartInspectionOnOutside } from "./chart-inspection-core";
26
- import { DEFAULT_MAP_VIEWPORT, normalizeMapViewport, panMapViewport, zoomMapViewport } from "./chart-map-viewport";
27
- import { resolveChartMessages, useChartMessages } from "./chart-messages";
28
- import { panStateTimelineViewport, stateTimelineDomain, stateTimelineHeight, zoomStateTimelineViewport } from "./chart-state-timeline";
29
- import { selectedChartSvg } from "./chart-svg";
30
- import { useViewportMessages } from "./viewport-messages";
31
-
32
- /**
33
- * Chart — Solid interaction and sizing around the portable UI chart core.
34
- *
35
- * **Live-update story.** `charts.<kind>(opts)` returns an SVG string;
36
- * Solid's `innerHTML` is reactive, so any time a prop (signal, store
37
- * slice, derived value) changes, the SVG re-renders. No manual
38
- * subscription, no imperative DOM patching. Trade-off: every change
39
- * is a full SVG re-build, not a diff — fine for dashboard cadences
40
- * (poll, websocket, store updates). Don't use this for 60fps streaming.
41
- *
42
- * **Sizing.** The server and browser render the same logical viewBox. CSS
43
- * fits Cartesian plots to the container and preserves text/marker sizes;
44
- * maps fit the whole world and zoom uniformly across the full plot; pies, donuts and gauges retain
45
- * their aspect ratio. No measurement
46
- * or hydration redraw is needed. The caller sizes the wrapper, for example
47
- * `style={{ height: "14rem" }}`. State timelines derive their default height
48
- * from the row count and legend via `stateTimelineHeight()`.
49
- *
50
- * **Why so thin.** The props are a discriminated union over each
51
- * registered core chart renderer — `kind: "line"` brings in exactly the params
52
- * `charts.line` expects, `kind: "bar"` brings in `charts.bar`'s, etc.
53
- * Options stay aligned with the core renderer without renaming. Every chart provides
54
- * renderer-owned inspection, tooltips and optional selection by default.
55
- * `interactive` adds bounded pan / zoom and reset controls to maps and state timelines.
56
- * When a core renderer gains an option, it is automatically available at every
57
- * callsite.
58
- *
59
- * **Theming.** The core renderers use `currentColor` for axes / ticks /
60
- * tick labels — set the wrapping element's `color` and everything
61
- * inherits. Series colors come from `--stdlib-chart-c1..c8` CSS
62
- * custom properties; override on the parent for per-chart palettes.
63
- *
64
- * ```tsx
65
- * <Chart kind="line" style={{ height: "12rem" }}
66
- * series={[{ data: points() }]}
67
- * yAxis={{ format: v => `€${v}k` }} />
68
- *
69
- * <Chart kind="donut" style={{ height: "12rem" }} data={slices()} />
70
- *
71
- * <Chart kind="sparkline" style={{ width: "6rem", height: "1.5rem" }} data={trend()} />
72
- *
73
- * <Chart kind="map" style={{ height: "16rem" }} series={locations()} interactive />
74
- * ```
75
- */
76
-
77
- /** All registered chart kinds. */
78
-
79
- /**
80
- * Per-kind props: `kind` discriminator + the exact options that
81
- * `charts.<kind>` accepts, **minus** `width` / `height` (the wrapper
82
- * owns those — CSS fits a stable coordinate space to the box). Solid's
83
- * component model handles discriminated unions natively, so callsites
84
- * get full type safety.
85
- */
86
-
3
+ import { renderChartSvg } from "../charts/core/render";
4
+ import { renderChartRoot } from "./ChartRoot";
87
5
  export { chartRenderHeight, renderChartSvg } from "../charts/core/render";
88
-
89
- /** Empty-data short-circuit. Kept per-kind because each renderer's payload
90
- * key differs (series vs data vs groups). We're conservative: only
91
- * block on truly empty inputs; partially-filled series get rendered
92
- * as-is and the core handles the gaps. */
93
- const isEmpty = props => {
94
- 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));
95
- if (props.kind === "line" || props.kind === "scatter") {
96
- return !props.series?.length || props.series.every(s => !s.data.length);
97
- }
98
- if (props.kind === "bar" || props.kind === "donut" || props.kind === "pie") {
99
- return !props.data?.length;
100
- }
101
- if (props.kind === "histogram" || props.kind === "sparkline") {
102
- return !props.data?.length;
103
- }
104
- if (props.kind === "boxplot") {
105
- return !props.groups?.length;
106
- }
107
- if (props.kind === "stateTimeline") {
108
- return !props.rows?.length || props.rows.every(row => !row.intervals.length);
109
- }
110
- return false;
111
- };
112
- const ChartRoot = props => {
113
- const [, drawingProps] = splitProps(props, ["class", "style", "labels", "interactive", "selected", "onSelect", "tooltip", "cursor"]);
114
- const messages = useUiMessages();
115
- const chartMessages = useChartMessages();
116
- const viewportMessages = useViewportMessages();
117
- const locale = useLocale();
118
- let containerRef;
119
- let chartTooltipRef;
120
- let lineAnchorRef;
121
- // One deterministic coordinate space on the server and client. CSS fits the
122
- // SVG to its box; hydration must never replace it with measured geometry.
123
- const calendar = () => props.kind === "heatmap" && props.layout === "calendar" ? calendarLayout({
124
- ...props,
125
- locale: props.locale ?? locale()
126
- }) : undefined;
127
- const size = () => ({
128
- width: calendar()?.width ?? 480,
129
- height: chartRenderHeight(props)
130
- });
131
- const topLegend = () => props.kind === "area" ? props.legend !== false : props.kind === "line" && props.legend === true && props.legendPlacement === "top-start";
132
- const legendSeries = () => props.kind === "line" || props.kind === "area" ? props.series : [];
133
- const legendValue = index => {
134
- if (props.kind !== "area") return "";
135
- const last = props.x.length - 1;
136
- const amount = props.series[index]?.data[last];
137
- const values = props.series.map(s => s.data[last]);
138
- const total = values.reduce((sum, value) => sum + (value ?? 0), 0);
139
- if (amount == null || values.some(v => v == null) || props.normalize && total === 0) return "—";
140
- return props.normalize ? new Intl.NumberFormat(locale(), {
141
- style: "percent",
142
- minimumFractionDigits: 1,
143
- maximumFractionDigits: 1
144
- }).format(amount / total) : props.format?.(amount) ?? new Intl.NumberFormat(locale(), {
145
- maximumFractionDigits: 2
146
- }).format(amount);
147
- };
148
- const dimensions = () => containerRef?.getBoundingClientRect() ?? size();
149
- const initialMapViewport = props.kind === "map" ? normalizeMapViewport(props.viewport) : DEFAULT_MAP_VIEWPORT;
150
- const [mapViewport, setMapViewport] = createSignal(initialMapViewport);
151
- const initialTimelineViewport = props.kind === "stateTimeline" ? stateTimelineDomain(props.rows, props.domain) : [0, 1];
152
- const [timelineViewport, setTimelineViewport] = createSignal(initialTimelineViewport);
153
- const [dragging, setDragging] = createSignal(false);
154
- const chartTooltipId = `k2b-chart-tooltip-${createUniqueId()}`;
155
- let timelineViewportLocallyChanged = false;
156
- let drag;
157
- let timelineDrag;
158
- let pointerFrame;
159
- let pendingPointer;
160
- const interactiveMap = () => props.kind === "map" && props.interactive === true;
161
- const interactiveTimeline = () => props.kind === "stateTimeline" && props.interactive === true;
162
- const draggable = () => interactiveMap() || interactiveTimeline();
163
- const labels = () => props.labels ?? {};
164
- const accessibleName = () => {
165
- const override = props.kind === "map" ? labels().interactiveMap : props.kind === "stateTimeline" ? labels().interactiveTimeline : props.kind === "line" ? labels().interactiveLine : labels().interactiveChart;
166
- const title = "title" in props && typeof props.title === "string" && props.title.trim() ? props.title : undefined;
167
- const valueLabel = (props.kind === "stat" || props.kind === "gauge") && props.label?.trim() ? props.label : undefined;
168
- const fallback = props.kind === "map" ? chartMessages().interactiveMap : props.kind === "stateTimeline" ? chartMessages().interactiveTimeline : props.kind === "line" ? chartMessages().interactiveLineChart : chartMessages().interactiveChart;
169
- return override ?? title ?? valueLabel ?? fallback;
170
- };
171
- const timelineFullDomain = () => props.kind === "stateTimeline" ? stateTimelineDomain(props.rows, props.domain) : [0, 1];
172
- createEffect(() => {
173
- if (props.kind === "map") {
174
- setMapViewport(normalizeMapViewport(props.viewport));
175
- }
176
- });
177
- createEffect(() => {
178
- if (props.kind === "stateTimeline" && !timelineViewportLocallyChanged) {
179
- setTimelineViewport(timelineFullDomain());
180
- }
181
- });
182
- const updateTimelineViewport = update => {
183
- timelineViewportLocallyChanged = true;
184
- setTimelineViewport(update);
185
- };
186
- const mapDimensions = () => {
187
- const viewportElement = containerRef?.querySelector(".stdlib-chart-map-viewport");
188
- const matrix = viewportElement?.getScreenCTM?.();
189
- const box = viewportElement?.viewBox?.baseVal;
190
- if (matrix && box?.width && box.height) {
191
- return {
192
- width: box.width * Math.hypot(matrix.a, matrix.b),
193
- height: box.height * Math.hypot(matrix.c, matrix.d)
194
- };
195
- }
196
- const rect = viewportElement?.getBoundingClientRect();
197
- if (rect && rect.width > 0 && rect.height > 0) {
198
- return {
199
- width: rect.width,
200
- height: rect.height
201
- };
202
- }
203
- return dimensions();
204
- };
205
- const zoom = delta => {
206
- closeChartTooltip();
207
- if (interactiveMap()) {
208
- setMapViewport(current => zoomMapViewport(current, delta, props.kind === "map" ? props.zoomFocus : undefined));
209
- } else if (interactiveTimeline()) {
210
- updateTimelineViewport(current => zoomStateTimelineViewport(current, timelineFullDomain(), delta));
211
- }
212
- };
213
- const reset = () => {
214
- closeChartTooltip();
215
- if (interactiveMap() && props.kind === "map") {
216
- setMapViewport(normalizeMapViewport(props.viewport));
217
- }
218
- if (interactiveTimeline()) {
219
- timelineViewportLocallyChanged = false;
220
- setTimelineViewport(timelineFullDomain());
221
- }
222
- };
223
- const handlePointerDown = event => {
224
- inspection.down(event);
225
- if (!draggable() || event.button !== 0 || event.target.closest("button, a")) {
226
- return;
227
- }
228
- closeChartTooltip();
229
- // The pointer's own pointerup or pointercancel ends the hold.
230
- suppressTextSelection(event.pointerId);
231
- if (interactiveTimeline()) {
232
- timelineDrag = {
233
- pointerId: event.pointerId,
234
- x: event.clientX,
235
- width: Math.max(1, event.currentTarget.getBoundingClientRect().width),
236
- viewport: timelineViewport()
237
- };
238
- event.currentTarget.setPointerCapture(event.pointerId);
239
- setDragging(true);
240
- return;
241
- }
242
- const dimensions = mapDimensions();
243
- drag = {
244
- pointerId: event.pointerId,
245
- x: event.clientX,
246
- y: event.clientY,
247
- width: dimensions.width,
248
- height: dimensions.height,
249
- viewport: mapViewport()
250
- };
251
- event.currentTarget.setPointerCapture(event.pointerId);
252
- setDragging(true);
253
- };
254
- const flushPointerMove = () => {
255
- if (pointerFrame !== undefined) {
256
- cancelAnimationFrame(pointerFrame);
257
- pointerFrame = undefined;
258
- }
259
- const sample = pendingPointer;
260
- pendingPointer = undefined;
261
- if (!sample) return;
262
- const start = timelineDrag ?? drag;
263
- if (start && Math.hypot(sample.clientX - start.x, sample.clientY - ("y" in start ? start.y : sample.clientY)) <= 6) return;
264
- const activeTimelineDrag = timelineDrag;
265
- if (activeTimelineDrag?.pointerId === sample.pointerId) {
266
- updateTimelineViewport(() => panStateTimelineViewport(activeTimelineDrag.viewport, timelineFullDomain(), sample.clientX - activeTimelineDrag.x, activeTimelineDrag.width));
267
- return;
268
- }
269
- if (!drag || drag.pointerId !== sample.pointerId) return;
270
- setMapViewport(panMapViewport(drag.viewport, sample.clientX - drag.x, sample.clientY - drag.y, drag.width, drag.height));
271
- };
272
- const handlePointerMove = event => {
273
- inspection.move(event);
274
- if (timelineDrag?.pointerId !== event.pointerId && drag?.pointerId !== event.pointerId) return;
275
- pendingPointer = {
276
- pointerId: event.pointerId,
277
- clientX: event.clientX,
278
- clientY: event.clientY
279
- };
280
- if (pointerFrame !== undefined) return;
281
- pointerFrame = requestAnimationFrame(flushPointerMove);
282
- };
283
- const stopDragging = event => {
284
- inspection.up();
285
- if (pendingPointer?.pointerId === event.pointerId) flushPointerMove();
286
- if (timelineDrag?.pointerId === event.pointerId) {
287
- if (event.currentTarget.hasPointerCapture(event.pointerId)) {
288
- event.currentTarget.releasePointerCapture(event.pointerId);
289
- }
290
- timelineDrag = undefined;
291
- setDragging(false);
292
- return;
293
- }
294
- if (!drag || drag.pointerId !== event.pointerId) return;
295
- if (event.currentTarget.hasPointerCapture(event.pointerId)) {
296
- event.currentTarget.releasePointerCapture(event.pointerId);
297
- }
298
- drag = undefined;
299
- setDragging(false);
300
- };
301
- const handleWheel = event => {
302
- if (interactiveMap() && (event.ctrlKey || event.metaKey)) {
303
- event.preventDefault();
304
- zoom(event.deltaY < 0 ? 1 : -1);
305
- return;
306
- }
307
- if (!interactiveTimeline()) return;
308
- if (event.ctrlKey || event.metaKey) {
309
- event.preventDefault();
310
- const rect = event.currentTarget.getBoundingClientRect();
311
- const anchor = rect.width > 0 ? (event.clientX - rect.left) / rect.width : 0.5;
312
- updateTimelineViewport(current => zoomStateTimelineViewport(current, timelineFullDomain(), event.deltaY < 0 ? 1 : -1, anchor));
313
- } else if (event.shiftKey) {
314
- event.preventDefault();
315
- updateTimelineViewport(current => panStateTimelineViewport(current, timelineFullDomain(), -event.deltaY, event.currentTarget.getBoundingClientRect().width));
316
- }
317
- };
318
- const handleKeyDown = event => {
319
- if (inspection.key(event)) return;
320
- if (!draggable() || event.target !== containerRef) return;
321
- if (event.key === "+" || event.key === "=") {
322
- event.preventDefault();
323
- zoom(1);
324
- return;
325
- }
326
- if (event.key === "-" || event.key === "_") {
327
- event.preventDefault();
328
- zoom(-1);
329
- return;
330
- }
331
- if (event.key === "0" || event.key === "Home") {
332
- event.preventDefault();
333
- reset();
334
- return;
335
- }
336
- if (interactiveTimeline() && (event.key === "ArrowLeft" || event.key === "ArrowRight")) {
337
- event.preventDefault();
338
- updateTimelineViewport(current => panStateTimelineViewport(current, timelineFullDomain(), event.key === "ArrowLeft" ? 80 : -80, event.currentTarget.getBoundingClientRect().width));
339
- return;
340
- }
341
- const delta = {
342
- ArrowLeft: [40, 0],
343
- ArrowRight: [-40, 0],
344
- ArrowUp: [0, 40],
345
- ArrowDown: [0, -40]
346
- }[event.key];
347
- if (!delta) return;
348
- event.preventDefault();
349
- const dimensions = mapDimensions();
350
- setMapViewport(current => panMapViewport(current, delta[0], delta[1], dimensions.width, dimensions.height));
351
- };
352
- const inspection = createChartInspection({
353
- container: () => containerRef,
354
- locale,
355
- cursor: () => props.cursor,
356
- tooltip: () => chartTooltipRef,
357
- anchor: () => lineAnchorRef,
358
- kind: () => props.kind,
359
- nav: () => props.kind === "heatmap" && props.layout === "calendar" ? calendarInspectionNavigation : undefined,
360
- enabled: () => !isEmpty(props),
361
- select: selection => props.onSelect?.(selection),
362
- format: selection => {
363
- if (props.tooltip) return props.tooltip(selection);
364
- const fields = props.kind === "heatmap" && props.layout === "calendar" ? resolveChartMessages(props.locale ?? locale()).chartFields : chartMessages().chartFields;
365
- if (selection.kind === "area" && props.kind === "area") {
366
- const amount = selection.datum.values.find(f => f.key === "value");
367
- const share = selection.datum.values.find(f => f.key === "percent");
368
- return {
369
- title: selection.datum.values.find(f => f.key === "x")?.formatted ?? "",
370
- rows: [{
371
- label: selection.datum.label ?? chartMessages().series,
372
- value: `${share ? `${share.formatted} · ` : ""}${amount.formatted}`
373
- }]
374
- };
375
- }
376
- const format = new Intl.NumberFormat(locale(), {
377
- maximumFractionDigits: 6
378
- });
379
- return {
380
- title: selection.datum.label ?? (selection.datum.seriesIndex !== undefined ? `${labels().series ?? chartMessages().series} ${selection.datum.seriesIndex + 1}` : undefined),
381
- rows: selection.datum.values.map(field => ({
382
- 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 : fields({
383
- key: field.key
384
- }),
385
- 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)
386
- }))
387
- };
388
- }
389
- });
390
- const closeChartTooltip = () => inspection.close();
391
- const svgMarkup = createMemo(() => renderChartSvg(props.kind === "heatmap" && props.layout === "calendar" ? {
392
- ...props,
393
- locale: props.locale ?? locale()
394
- } : drawingProps, size().width, size().height, interactiveMap() ? mapViewport() : undefined, interactiveTimeline() ? timelineViewport() : undefined, locale()));
395
- createEffect(() => {
396
- svgMarkup();
397
- inspection.invalidate();
398
- untrack(() => inspection.selectDatum(props.selected));
399
- });
400
- createEffect(() => inspection.selectDatum(props.selected));
401
- onCleanup(() => {
402
- inspection.close();
403
- if (pointerFrame !== undefined) cancelAnimationFrame(pointerFrame);
404
- pointerFrame = undefined;
405
- pendingPointer = undefined;
406
- });
407
- onMount(() => {
408
- if (!containerRef) return;
409
- if (props.kind === "heatmap" && props.layout === "calendar") onCleanup(mountCalendarScroll(containerRef));
410
- onCleanup(closeChartInspectionOnOutside({
411
- container: () => containerRef,
412
- tooltip: () => chartTooltipRef,
413
- close: closeChartTooltip,
414
- keepScroll: () => props.kind === "heatmap" && props.layout === "calendar"
415
- }));
416
- });
417
- const chartStyle = () => props.style ?? (props.kind === "stateTimeline" ? {
418
- height: `${stateTimelineHeight(props.rows.length, props.legend !== false)}px`
419
- } : undefined);
420
- const control = (label, shortcut, icon, action) => _$createComponent(IconButton, {
421
- variant: "secondary",
422
- label: label,
423
- tooltip: `${label} (${shortcut})`,
424
- onClick: action,
425
- get children() {
426
- return _$ssr(_tmpl$, `ti ${_$escape(icon, true)}`);
427
- }
428
- });
429
- return _$createComponent(Show, {
430
- get when() {
431
- return !isEmpty(props);
432
- },
433
- get fallback() {
434
- return _$ssr(_tmpl$5, `k2b-chart k2b-chart__empty ${_$escape(props.class ?? "", true)}`, _$ssrStyle(chartStyle()), _$escape(labels().empty ?? messages().noData));
435
- },
436
- get children() {
437
- 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, {
438
- get when() {
439
- return topLegend();
440
- },
441
- get children() {
442
- return _$ssr(_tmpl$2, _$ssrAttribute("aria-label", _$escape(chartMessages().chartLegend, true), false), _$escape(_$createComponent(For, {
443
- get each() {
444
- return legendSeries();
445
- },
446
- 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, {
447
- get when() {
448
- return props.kind === "area";
449
- },
450
- get children() {
451
- 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())));
452
- }
453
- })))
454
- })));
455
- }
456
- })), _$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, {
457
- get when() {
458
- return draggable();
459
- },
460
- get children() {
461
- 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)));
462
- }
463
- })));
464
- }
465
- });
466
- };
6
+ const ChartRoot = props => renderChartRoot(props, renderChartSvg);
467
7
  // Add a renderer to charts/core/registry.ts; its key defines the namespace member and discriminator.
468
8
  // Both entry styles share ChartRoot, preserving the same owner, markup and reactive props.
469
9
  const chartComponent = kind => props =>
@@ -471,12 +11,15 @@ const chartComponent = kind => props =>
471
11
  ChartRoot(mergeProps(props, {
472
12
  kind
473
13
  }));
474
- const components = Object.fromEntries(Object.entries(chartKinds).map(([name, kind]) => [name, chartComponent(kind)]));
475
- const Chart = Object.assign(ChartRoot, components, {
476
- Calendar: props => ChartRoot(mergeProps(props, {
477
- kind: "heatmap",
478
- layout: "calendar"
479
- }))
480
- });
14
+ const createChart = () => {
15
+ const components = Object.fromEntries(Object.entries(chartKinds).map(([name, kind]) => [name, chartComponent(kind)]));
16
+ return Object.assign(ChartRoot, components, {
17
+ Calendar: props => ChartRoot(mergeProps(props, {
18
+ kind: "heatmap",
19
+ layout: "calendar"
20
+ }))
21
+ });
22
+ };
23
+ const Chart = /* @__PURE__ */createChart();
481
24
  export default Chart;
482
25
  //# sourceMappingURL=Chart.js.map
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["content/Chart.tsx"],"sourcesContent":["import type { JSX } from \"solid-js\";\nimport {\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n For,\n mergeProps,\n onCleanup,\n onMount,\n Show,\n splitProps,\n untrack,\n} 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 { chartKinds } from \"../charts/core/registry\";\nimport { type ChartDrawingOptions, chartRenderHeight, preservesAspectRatio, renderChartSvg } from \"../charts/core/render\";\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];\nexport { type ChartRenderOptions, chartRenderHeight, renderChartSvg } from \"../charts/core/render\";\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 === \"bar\" || 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\nconst ChartRoot = (props: ChartProps): 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.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 : 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\" ? { ...props, locale: props.locale ?? locale() } : drawingProps,\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\ntype KindProps<T> = T extends unknown ? Omit<T, \"kind\"> : never;\nexport type ChartKindProps<K extends ChartKind> = KindProps<Extract<ChartProps, { kind: K }>>;\n\ntype ChartComponents = {\n [Name in keyof typeof chartKinds]: (props: ChartKindProps<(typeof chartKinds)[Name]>) => JSX.Element;\n};\n\n// Add a renderer to charts/core/registry.ts; its key defines the namespace member and discriminator.\n// Both entry styles share ChartRoot, preserving the same owner, markup and reactive props.\nconst chartComponent =\n (kind: ChartKind) =>\n (props: Omit<ChartProps, \"kind\">): JSX.Element =>\n // Public namespace types correlate each discriminator with its options.\n ChartRoot(mergeProps(props, { kind }) as ChartProps);\nconst components = Object.fromEntries(\n Object.entries(chartKinds).map(([name, kind]) => [name, chartComponent(kind)]),\n) as unknown as ChartComponents;\nconst Chart = Object.assign(ChartRoot, components, {\n Calendar: (props: Omit<Extract<ChartProps, { kind: \"heatmap\"; layout: \"calendar\" }>, \"kind\" | \"layout\">) =>\n ChartRoot(mergeProps(props, { kind: \"heatmap\" as const, layout: \"calendar\" as const })),\n});\nexport default Chart;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["content/Chart.tsx"],"sourcesContent":["import { type JSX, mergeProps } from \"solid-js\";\nimport { chartKinds } from \"../charts/core/registry\";\nimport { renderChartSvg } from \"../charts/core/render\";\nimport { type ChartKind, type ChartProps, renderChartRoot } from \"./ChartRoot\";\n\nexport { type ChartRenderOptions, chartRenderHeight, renderChartSvg } from \"../charts/core/render\";\nexport type { ChartKind, ChartLabels, ChartProps } from \"./ChartRoot\";\n\nconst ChartRoot = (props: ChartProps) => renderChartRoot(props, renderChartSvg);\n\ntype KindProps<T> = T extends unknown ? Omit<T, \"kind\"> : never;\nexport type ChartKindProps<K extends ChartKind> = KindProps<Extract<ChartProps, { kind: K }>>;\n\ntype ChartComponents = {\n [Name in keyof typeof chartKinds]: (props: ChartKindProps<(typeof chartKinds)[Name]>) => JSX.Element;\n};\n\n// Add a renderer to charts/core/registry.ts; its key defines the namespace member and discriminator.\n// Both entry styles share ChartRoot, preserving the same owner, markup and reactive props.\nconst chartComponent =\n (kind: ChartKind) =>\n (props: Omit<ChartProps, \"kind\">): JSX.Element =>\n // Public namespace types correlate each discriminator with its options.\n ChartRoot(mergeProps(props, { kind }) as ChartProps);\nconst createChart = () => {\n const components = Object.fromEntries(\n Object.entries(chartKinds).map(([name, kind]) => [name, chartComponent(kind)]),\n ) as unknown as ChartComponents;\n return Object.assign(ChartRoot, components, {\n Calendar: (props: Omit<Extract<ChartProps, { kind: \"heatmap\"; layout: \"calendar\" }>, \"kind\" | \"layout\">) =>\n ChartRoot(mergeProps(props, { kind: \"heatmap\" as const, layout: \"calendar\" as const })),\n });\n};\nconst Chart = /* @__PURE__ */ createChart();\nexport default Chart;\n"],"mappings":"AAAA,SAAmB,UAAU,QAAQ,UAAU;AAC/C,SAAS,UAAU,QAAQ,yBAAyB;AACpD,SAAS,cAAc,QAAQ,uBAAuB;AACtD,SAA0C,eAAe,QAAQ,aAAa;AAE9E,SAAkC,iBAAiB,EAAE,cAAc,QAAQ,uBAAuB;AAGlG,MAAM,SAAS,GAAI,KAAiB,IAAK,eAAe,CAAC,KAAK,EAAE,cAAc,CAAC;AAS/E;AACA;AACA,MAAM,cAAc,GACjB,IAAe,IACf,KAA+B;AAC9B;AACA,SAAS,CAAC,UAAU,CAAC,KAAK,EAAE;EAAE;AAAK,CAAC,CAAe,CAAC;AACxD,MAAM,WAAW,GAAG,MAAM;EACxB,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CACnC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAC/E,CAA+B;EAC/B,OAAO,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,UAAU,EAAE;IAC1C,QAAQ,EAAG,KAA4F,IACrG,SAAS,CAAC,UAAU,CAAC,KAAK,EAAE;MAAE,IAAI,EAAE,SAAkB;MAAE,MAAM,EAAE;IAAoB,CAAC,CAAC;EAC1F,CAAC,CAAC;AACJ,CAAC;AACD,MAAM,KAAK,GAAG,eAAgB,WAAW,CAAC,CAAC;AAC3C,eAAe,KAAK","ignoreList":[]}