@k2b/ui 0.49.0 → 0.50.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 (265) hide show
  1. package/dist/base.css +40 -2
  2. package/dist/browser/actions/ContextMenu.js +3 -0
  3. package/dist/browser/actions/ContextMenu.js.map +1 -1
  4. package/dist/browser/charts/core/area.js +190 -0
  5. package/dist/browser/charts/core/area.js.map +1 -0
  6. package/dist/browser/charts/core/calendar.js +186 -0
  7. package/dist/browser/charts/core/calendar.js.map +1 -0
  8. package/dist/browser/charts/core/chart-map-data.js +9 -0
  9. package/dist/browser/charts/core/chart-map-data.js.map +1 -0
  10. package/dist/browser/charts/core/index.js +12 -0
  11. package/dist/browser/charts/core/index.js.map +1 -0
  12. package/dist/browser/charts/core/inspection.js +9 -0
  13. package/dist/browser/charts/core/inspection.js.map +1 -0
  14. package/dist/browser/charts/core/registry.js +28 -0
  15. package/dist/browser/charts/core/registry.js.map +1 -0
  16. package/dist/browser/charts/core/render.js +103 -0
  17. package/dist/browser/charts/core/render.js.map +1 -0
  18. package/dist/browser/charts/core/snapshot.js +65 -0
  19. package/dist/browser/charts/core/snapshot.js.map +1 -0
  20. package/dist/browser/charts/core/svg.js +2542 -0
  21. package/dist/browser/charts/core/svg.js.map +1 -0
  22. package/dist/browser/charts/core/termination.test-fixture.js +162 -0
  23. package/dist/browser/charts/core/termination.test-fixture.js.map +1 -0
  24. package/dist/browser/charts/core/text.js +13 -0
  25. package/dist/browser/charts/core/text.js.map +1 -0
  26. package/dist/browser/charts/core/types.js +8 -0
  27. package/dist/browser/charts/core/types.js.map +1 -0
  28. package/dist/browser/charts.js +4 -2
  29. package/dist/browser/charts.js.map +1 -1
  30. package/dist/browser/content/BalanceSummary.js +106 -0
  31. package/dist/browser/content/BalanceSummary.js.map +1 -0
  32. package/dist/browser/content/Chart.js +134 -115
  33. package/dist/browser/content/Chart.js.map +1 -1
  34. package/dist/browser/content/ChartExplorer.js +366 -122
  35. package/dist/browser/content/ChartExplorer.js.map +1 -1
  36. package/dist/browser/content/ChartSnapshotView.js +16 -9
  37. package/dist/browser/content/ChartSnapshotView.js.map +1 -1
  38. package/dist/browser/content/DataTable.js +676 -293
  39. package/dist/browser/content/DataTable.js.map +1 -1
  40. package/dist/browser/content/DataTableTools.js +119 -0
  41. package/dist/browser/content/DataTableTools.js.map +1 -0
  42. package/dist/browser/content/FlowAmount.js +82 -0
  43. package/dist/browser/content/FlowAmount.js.map +1 -0
  44. package/dist/browser/content/balance-summary-messages.js +26 -0
  45. package/dist/browser/content/balance-summary-messages.js.map +1 -0
  46. package/dist/browser/content/chart-bar.js +6 -6
  47. package/dist/browser/content/chart-bar.js.map +1 -1
  48. package/dist/browser/content/chart-calendar.js +43 -0
  49. package/dist/browser/content/chart-calendar.js.map +1 -0
  50. package/dist/browser/content/chart-inspection-core.js +164 -37
  51. package/dist/browser/content/chart-inspection-core.js.map +1 -1
  52. package/dist/browser/content/chart-inspection.js.map +1 -1
  53. package/dist/browser/content/chart-line-gaps.js +2 -2
  54. package/dist/browser/content/chart-line-gaps.js.map +1 -1
  55. package/dist/browser/content/chart-map-viewport.js.map +1 -1
  56. package/dist/browser/content/chart-message-catalog.js +164 -0
  57. package/dist/browser/content/chart-message-catalog.js.map +1 -0
  58. package/dist/browser/content/chart-messages.js +2 -138
  59. package/dist/browser/content/chart-messages.js.map +1 -1
  60. package/dist/browser/content/chart-snapshot.js +1 -62
  61. package/dist/browser/content/chart-snapshot.js.map +1 -1
  62. package/dist/browser/content/chart-state-timeline.js +1 -1
  63. package/dist/browser/content/chart-state-timeline.js.map +1 -1
  64. package/dist/browser/content/chart-svg.js +2 -1
  65. package/dist/browser/content/chart-svg.js.map +1 -1
  66. package/dist/browser/content/chart-time-axis.js +139 -0
  67. package/dist/browser/content/chart-time-axis.js.map +1 -0
  68. package/dist/browser/content/data-table-columns.js +160 -0
  69. package/dist/browser/content/data-table-columns.js.map +1 -0
  70. package/dist/browser/content/data-table-messages.js +38 -2
  71. package/dist/browser/content/data-table-messages.js.map +1 -1
  72. package/dist/browser/content/flow-amount-messages.js +26 -0
  73. package/dist/browser/content/flow-amount-messages.js.map +1 -0
  74. package/dist/browser/content/index.js +4 -0
  75. package/dist/browser/content/index.js.map +1 -1
  76. package/dist/browser/inputs/DatePicker.js +5 -4
  77. package/dist/browser/inputs/DatePicker.js.map +1 -1
  78. package/dist/browser/inputs/SelectChip.js +50 -17
  79. package/dist/browser/inputs/SelectChip.js.map +1 -1
  80. package/dist/browser/inputs/date-picker.js +13 -0
  81. package/dist/browser/inputs/date-picker.js.map +1 -1
  82. package/dist/browser/intl/Format.js +31 -8
  83. package/dist/browser/intl/Format.js.map +1 -1
  84. package/dist/browser/layout/AppWorkspace.js +7 -1
  85. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  86. package/dist/browser/surfaces/BudgetList.js +281 -0
  87. package/dist/browser/surfaces/BudgetList.js.map +1 -0
  88. package/dist/browser/surfaces/ProgressBar.js +134 -21
  89. package/dist/browser/surfaces/ProgressBar.js.map +1 -1
  90. package/dist/browser/surfaces/StatCell.js +320 -144
  91. package/dist/browser/surfaces/StatCell.js.map +1 -1
  92. package/dist/browser/surfaces/StatGrid.js +75 -57
  93. package/dist/browser/surfaces/StatGrid.js.map +1 -1
  94. package/dist/browser/surfaces/budget-messages.js +64 -0
  95. package/dist/browser/surfaces/budget-messages.js.map +1 -0
  96. package/dist/browser/surfaces/delta-badge.js +65 -0
  97. package/dist/browser/surfaces/delta-badge.js.map +1 -0
  98. package/dist/browser/surfaces/index.js +2 -1
  99. package/dist/browser/surfaces/index.js.map +1 -1
  100. package/dist/browser/surfaces/person-color.js +2 -2
  101. package/dist/browser/surfaces/person-color.js.map +1 -1
  102. package/dist/browser/surfaces/stat-cell-messages.js +41 -0
  103. package/dist/browser/surfaces/stat-cell-messages.js.map +1 -0
  104. package/dist/browser/widgets/Dashboard.js +137 -0
  105. package/dist/browser/widgets/Dashboard.js.map +1 -0
  106. package/dist/browser/widgets/index.js +1 -0
  107. package/dist/browser/widgets/index.js.map +1 -1
  108. package/dist/ssr/actions/ContextMenu.js +3 -0
  109. package/dist/ssr/actions/ContextMenu.js.map +1 -1
  110. package/dist/ssr/charts/core/area.js +190 -0
  111. package/dist/ssr/charts/core/area.js.map +1 -0
  112. package/dist/ssr/charts/core/calendar.js +186 -0
  113. package/dist/ssr/charts/core/calendar.js.map +1 -0
  114. package/dist/ssr/charts/core/chart-map-data.js +9 -0
  115. package/dist/ssr/charts/core/chart-map-data.js.map +1 -0
  116. package/dist/ssr/charts/core/index.js +12 -0
  117. package/dist/ssr/charts/core/index.js.map +1 -0
  118. package/dist/ssr/charts/core/inspection.js +9 -0
  119. package/dist/ssr/charts/core/inspection.js.map +1 -0
  120. package/dist/ssr/charts/core/registry.js +28 -0
  121. package/dist/ssr/charts/core/registry.js.map +1 -0
  122. package/dist/ssr/charts/core/render.js +103 -0
  123. package/dist/ssr/charts/core/render.js.map +1 -0
  124. package/dist/ssr/charts/core/snapshot.js +65 -0
  125. package/dist/ssr/charts/core/snapshot.js.map +1 -0
  126. package/dist/ssr/charts/core/svg.js +2542 -0
  127. package/dist/ssr/charts/core/svg.js.map +1 -0
  128. package/dist/ssr/charts/core/termination.test-fixture.js +162 -0
  129. package/dist/ssr/charts/core/termination.test-fixture.js.map +1 -0
  130. package/dist/ssr/charts/core/text.js +13 -0
  131. package/dist/ssr/charts/core/text.js.map +1 -0
  132. package/dist/ssr/charts/core/types.js +8 -0
  133. package/dist/ssr/charts/core/types.js.map +1 -0
  134. package/dist/ssr/charts.js +4 -2
  135. package/dist/ssr/charts.js.map +1 -1
  136. package/dist/ssr/content/BalanceSummary.js +75 -0
  137. package/dist/ssr/content/BalanceSummary.js.map +1 -0
  138. package/dist/ssr/content/Chart.js +90 -95
  139. package/dist/ssr/content/Chart.js.map +1 -1
  140. package/dist/ssr/content/ChartExplorer.js +190 -46
  141. package/dist/ssr/content/ChartExplorer.js.map +1 -1
  142. package/dist/ssr/content/ChartSnapshotView.js +5 -1
  143. package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
  144. package/dist/ssr/content/DataTable.js +287 -78
  145. package/dist/ssr/content/DataTable.js.map +1 -1
  146. package/dist/ssr/content/DataTableTools.js +106 -0
  147. package/dist/ssr/content/DataTableTools.js.map +1 -0
  148. package/dist/ssr/content/FlowAmount.js +58 -0
  149. package/dist/ssr/content/FlowAmount.js.map +1 -0
  150. package/dist/ssr/content/balance-summary-messages.js +26 -0
  151. package/dist/ssr/content/balance-summary-messages.js.map +1 -0
  152. package/dist/ssr/content/chart-bar.js +6 -6
  153. package/dist/ssr/content/chart-bar.js.map +1 -1
  154. package/dist/ssr/content/chart-calendar.js +43 -0
  155. package/dist/ssr/content/chart-calendar.js.map +1 -0
  156. package/dist/ssr/content/chart-inspection-core.js +164 -37
  157. package/dist/ssr/content/chart-inspection-core.js.map +1 -1
  158. package/dist/ssr/content/chart-inspection.js.map +1 -1
  159. package/dist/ssr/content/chart-line-gaps.js +2 -2
  160. package/dist/ssr/content/chart-line-gaps.js.map +1 -1
  161. package/dist/ssr/content/chart-map-viewport.js.map +1 -1
  162. package/dist/ssr/content/chart-message-catalog.js +164 -0
  163. package/dist/ssr/content/chart-message-catalog.js.map +1 -0
  164. package/dist/ssr/content/chart-messages.js +2 -138
  165. package/dist/ssr/content/chart-messages.js.map +1 -1
  166. package/dist/ssr/content/chart-snapshot.js +1 -62
  167. package/dist/ssr/content/chart-snapshot.js.map +1 -1
  168. package/dist/ssr/content/chart-state-timeline.js +1 -1
  169. package/dist/ssr/content/chart-state-timeline.js.map +1 -1
  170. package/dist/ssr/content/chart-svg.js +2 -1
  171. package/dist/ssr/content/chart-svg.js.map +1 -1
  172. package/dist/ssr/content/chart-time-axis.js +139 -0
  173. package/dist/ssr/content/chart-time-axis.js.map +1 -0
  174. package/dist/ssr/content/data-table-columns.js +160 -0
  175. package/dist/ssr/content/data-table-columns.js.map +1 -0
  176. package/dist/ssr/content/data-table-messages.js +38 -2
  177. package/dist/ssr/content/data-table-messages.js.map +1 -1
  178. package/dist/ssr/content/flow-amount-messages.js +26 -0
  179. package/dist/ssr/content/flow-amount-messages.js.map +1 -0
  180. package/dist/ssr/content/index.js +4 -0
  181. package/dist/ssr/content/index.js.map +1 -1
  182. package/dist/ssr/inputs/DatePicker.js +5 -4
  183. package/dist/ssr/inputs/DatePicker.js.map +1 -1
  184. package/dist/ssr/inputs/SelectChip.js +26 -9
  185. package/dist/ssr/inputs/SelectChip.js.map +1 -1
  186. package/dist/ssr/inputs/date-picker.js +13 -0
  187. package/dist/ssr/inputs/date-picker.js.map +1 -1
  188. package/dist/ssr/intl/Format.js +22 -2
  189. package/dist/ssr/intl/Format.js.map +1 -1
  190. package/dist/ssr/layout/AppWorkspace.js +7 -1
  191. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  192. package/dist/ssr/surfaces/BudgetList.js +170 -0
  193. package/dist/ssr/surfaces/BudgetList.js.map +1 -0
  194. package/dist/ssr/surfaces/ProgressBar.js +96 -5
  195. package/dist/ssr/surfaces/ProgressBar.js.map +1 -1
  196. package/dist/ssr/surfaces/StatCell.js +157 -51
  197. package/dist/ssr/surfaces/StatCell.js.map +1 -1
  198. package/dist/ssr/surfaces/StatGrid.js +24 -35
  199. package/dist/ssr/surfaces/StatGrid.js.map +1 -1
  200. package/dist/ssr/surfaces/budget-messages.js +64 -0
  201. package/dist/ssr/surfaces/budget-messages.js.map +1 -0
  202. package/dist/ssr/surfaces/delta-badge.js +41 -0
  203. package/dist/ssr/surfaces/delta-badge.js.map +1 -0
  204. package/dist/ssr/surfaces/index.js +2 -1
  205. package/dist/ssr/surfaces/index.js.map +1 -1
  206. package/dist/ssr/surfaces/person-color.js +2 -2
  207. package/dist/ssr/surfaces/person-color.js.map +1 -1
  208. package/dist/ssr/surfaces/stat-cell-messages.js +41 -0
  209. package/dist/ssr/surfaces/stat-cell-messages.js.map +1 -0
  210. package/dist/ssr/widgets/Dashboard.js +84 -0
  211. package/dist/ssr/widgets/Dashboard.js.map +1 -0
  212. package/dist/ssr/widgets/index.js +1 -0
  213. package/dist/ssr/widgets/index.js.map +1 -1
  214. package/dist/styles.css +1 -1
  215. package/dist/types/charts/core/area.d.ts +62 -0
  216. package/dist/types/charts/core/calendar.d.ts +57 -0
  217. package/dist/types/charts/core/chart-map-data.d.ts +3 -0
  218. package/dist/types/charts/core/index.d.ts +11 -0
  219. package/dist/types/charts/core/inspection.d.ts +16 -0
  220. package/dist/types/charts/core/registry.d.ts +27 -0
  221. package/dist/types/charts/core/render.d.ts +40 -0
  222. package/dist/types/charts/core/snapshot.d.ts +27 -0
  223. package/dist/types/charts/core/svg.d.ts +714 -0
  224. package/dist/types/charts/core/termination.test-fixture.d.ts +1 -0
  225. package/dist/types/charts/core/text.d.ts +5 -0
  226. package/dist/types/charts/core/types.d.ts +31 -0
  227. package/dist/types/charts.d.ts +4 -2
  228. package/dist/types/content/BalanceSummary.d.ts +29 -0
  229. package/dist/types/content/Chart.d.ts +26 -36
  230. package/dist/types/content/ChartExplorer.d.ts +43 -2
  231. package/dist/types/content/ChartSnapshotView.d.ts +1 -0
  232. package/dist/types/content/DataTable.d.ts +28 -0
  233. package/dist/types/content/DataTableTools.d.ts +44 -0
  234. package/dist/types/content/FlowAmount.d.ts +28 -0
  235. package/dist/types/content/balance-summary-messages.d.ts +11 -0
  236. package/dist/types/content/chart-bar.d.ts +1 -1
  237. package/dist/types/content/chart-calendar.d.ts +4 -0
  238. package/dist/types/content/chart-inspection-core.d.ts +21 -16
  239. package/dist/types/content/chart-inspection.d.ts +5 -1
  240. package/dist/types/content/chart-map-viewport.d.ts +1 -1
  241. package/dist/types/content/chart-message-catalog.d.ts +84 -0
  242. package/dist/types/content/chart-messages.d.ts +2 -33
  243. package/dist/types/content/chart-snapshot.d.ts +1 -26
  244. package/dist/types/content/chart-svg.d.ts +1 -1
  245. package/dist/types/content/chart-time-axis.d.ts +26 -0
  246. package/dist/types/content/data-table-columns.d.ts +72 -0
  247. package/dist/types/content/data-table-messages.d.ts +18 -0
  248. package/dist/types/content/flow-amount-messages.d.ts +11 -0
  249. package/dist/types/content/index.d.ts +10 -2
  250. package/dist/types/inputs/SelectChip.d.ts +2 -0
  251. package/dist/types/inputs/date-picker.d.ts +6 -0
  252. package/dist/types/intl/Format.d.ts +5 -0
  253. package/dist/types/layout/AppWorkspace.d.ts +5 -0
  254. package/dist/types/surfaces/BudgetList.d.ts +42 -0
  255. package/dist/types/surfaces/ProgressBar.d.ts +38 -2
  256. package/dist/types/surfaces/StatCell.d.ts +35 -2
  257. package/dist/types/surfaces/StatGrid.d.ts +3 -1
  258. package/dist/types/surfaces/budget-messages.d.ts +30 -0
  259. package/dist/types/surfaces/delta-badge.d.ts +10 -0
  260. package/dist/types/surfaces/index.d.ts +4 -3
  261. package/dist/types/surfaces/person-color.d.ts +2 -2
  262. package/dist/types/surfaces/stat-cell-messages.d.ts +19 -0
  263. package/dist/types/widgets/Dashboard.d.ts +42 -0
  264. package/dist/types/widgets/index.d.ts +1 -0
  265. package/package.json +7 -1
@@ -19,26 +19,28 @@ var _tmpl$ = /*#__PURE__*/_$template(`<i aria-hidden=true>`),
19
19
  _tmpl$3 = /*#__PURE__*/_$template(`<div class=k2b-chart__controls><!$><!/><!$><!/><!$><!/>`),
20
20
  _tmpl$4 = /*#__PURE__*/_$template(`<div data-interactive=true role=group tabindex=0><!$><!/><div class=k2b-chart__svg></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><!$><!/>`),
21
21
  _tmpl$5 = /*#__PURE__*/_$template(`<div>`),
22
- _tmpl$6 = /*#__PURE__*/_$template(`<span class=k2b-chart__legend-item><svg viewBox="0 0 10 10"width=10 height=10 aria-hidden=true><rect x=1 y=1 width=8 height=8 rx=2></rect></svg><span>`);
23
- import { charts } from "@k2b/stdlib";
24
- import { createEffect, createMemo, createSignal, createUniqueId, For, onCleanup, onMount, Show, splitProps, untrack } from "solid-js";
22
+ _tmpl$6 = /*#__PURE__*/_$template(`<b data-chart-legend-value>`),
23
+ _tmpl$7 = /*#__PURE__*/_$template(`<span class=k2b-chart__legend-item><svg viewBox="0 0 10 10"width=10 height=10 aria-hidden=true><rect x=1 y=1 width=8 height=8 rx=2 stroke=none></rect></svg><span></span><!$><!/>`);
24
+ import { createEffect, createMemo, createSignal, createUniqueId, For, mergeProps, onCleanup, onMount, Show, splitProps, untrack } from "solid-js";
25
25
  import { isServer } from "solid-js/web";
26
26
  import { IconButton } from "../actions/Button";
27
+ import { calendarLayout } from "../charts/core/calendar";
28
+ import { chartKinds } from "../charts/core/registry";
29
+ import { chartRenderHeight, preservesAspectRatio, renderChartSvg } from "../charts/core/render";
27
30
  import { suppressTextSelection } from "../internal/text-selection";
28
31
  import { useLocale } from "../intl/locale";
29
32
  import { useUiMessages } from "../intl/messages";
30
- import { barChartLayout, renderBarChartSvg } from "./chart-bar";
33
+ import { calendarInspectionNavigation, mountCalendarScroll } from "./chart-calendar";
31
34
  import { createChartInspection } from "./chart-inspection";
32
35
  import { closeChartInspectionOnOutside } from "./chart-inspection-core";
33
- import { lineGapsSvg } from "./chart-line-gaps";
34
36
  import { DEFAULT_MAP_VIEWPORT, normalizeMapViewport, panMapViewport, zoomMapViewport } from "./chart-map-viewport";
35
- import { useChartMessages } from "./chart-messages";
36
- import { panStateTimelineViewport, renderStateTimelineSvg, stateTimelineDomain, stateTimelineHeight, zoomStateTimelineViewport } from "./chart-state-timeline";
37
- import { responsiveChartSvg, responsiveMapSvg, selectedChartSvg } from "./chart-svg";
37
+ import { resolveChartMessages, useChartMessages } from "./chart-messages";
38
+ import { panStateTimelineViewport, stateTimelineDomain, stateTimelineHeight, zoomStateTimelineViewport } from "./chart-state-timeline";
39
+ import { selectedChartSvg } from "./chart-svg";
38
40
  import { useViewportMessages } from "./viewport-messages";
39
41
 
40
42
  /**
41
- * Chart — minimal Solid wrapper around `stdlib.charts`.
43
+ * Chart — Solid interaction and sizing around the portable UI chart core.
42
44
  *
43
45
  * **Live-update story.** `charts.<kind>(opts)` returns an SVG string;
44
46
  * Solid's `innerHTML` is reactive, so any time a prop (signal, store
@@ -56,15 +58,15 @@ import { useViewportMessages } from "./viewport-messages";
56
58
  * from the row count and legend via `stateTimelineHeight()`.
57
59
  *
58
60
  * **Why so thin.** The props are a discriminated union over each
59
- * stdlib chart function — `kind: "line"` brings in exactly the params
61
+ * registered core chart renderer — `kind: "line"` brings in exactly the params
60
62
  * `charts.line` expects, `kind: "bar"` brings in `charts.bar`'s, etc.
61
- * Options stay aligned with stdlib without renaming. Every chart provides
63
+ * Options stay aligned with the core renderer without renaming. Every chart provides
62
64
  * renderer-owned inspection, tooltips and optional selection by default.
63
65
  * `interactive` adds bounded pan / zoom and reset controls to maps and state timelines.
64
- * If stdlib gains a new option, it's automatically available at every
66
+ * When a core renderer gains an option, it is automatically available at every
65
67
  * callsite.
66
68
  *
67
- * **Theming.** stdlib charts use `currentColor` for axes / ticks /
69
+ * **Theming.** The core renderers use `currentColor` for axes / ticks /
68
70
  * tick labels — set the wrapping element's `color` and everything
69
71
  * inherits. Series colors come from `--stdlib-chart-c1..c8` CSS
70
72
  * custom properties; override on the parent for per-chart palettes.
@@ -82,7 +84,7 @@ import { useViewportMessages } from "./viewport-messages";
82
84
  * ```
83
85
  */
84
86
 
85
- /** All chart kinds shipped by `stdlib.charts`. */
87
+ /** All registered chart kinds. */
86
88
 
87
89
  /**
88
90
  * Per-kind props: `kind` discriminator + the exact options that
@@ -92,80 +94,14 @@ import { useViewportMessages } from "./viewport-messages";
92
94
  * get full type safety.
93
95
  */
94
96
 
95
- /** Pure renderer options: component layout, events and inspection are configured elsewhere. */
97
+ export { chartRenderHeight, renderChartSvg } from "../charts/core/render";
96
98
 
97
- /** Keep the fixed 28-unit bar-gauge rows inside the shared SSR/browser coordinate space. */
98
- export const chartRenderHeight = props => {
99
- if (props.kind === "stateTimeline") return stateTimelineHeight(props.rows.length, props.legend !== false);
100
- if (props.kind === "bar") return barChartLayout(props).height;
101
- if (props.kind === "barGauge") return Math.max(280, (props.title || props.subtitle ? 42 : 16) + props.data.length * 28 + 14);
102
- return 280;
103
- };
104
-
105
- /**
106
- * Internal — strips wrapper-only keys from props and forwards the
107
- * rest (plus logical size) to `charts[kind]`. The `any` is the
108
- * price for dispatching one function call across 14 different option
109
- * types; an explicit per-kind switch would type it but balloon the
110
- * component for no runtime benefit.
111
- */
112
- export const renderChartSvg = (props, width, height, mapViewport, timelineViewport) => {
113
- const {
114
- kind,
115
- class: _class,
116
- style: _style,
117
- labels: _labels,
118
- interactive: _interactive,
119
- onSelect: _onSelect,
120
- selected: _selected,
121
- tooltip: _tooltip,
122
- cursor: _cursor,
123
- zoomFocus: _zoomFocus,
124
- legendPlacement: _legendPlacement,
125
- ...opts
126
- } = props;
127
- if (kind === "stateTimeline") {
128
- return responsiveChartSvg(renderStateTimelineSvg({
129
- ...opts,
130
- width,
131
- height,
132
- viewport: timelineViewport,
133
- interactive: true
134
- }));
135
- }
136
- if (kind === "bar") return responsiveChartSvg(renderBarChartSvg({
137
- ...opts,
138
- width,
139
- height,
140
- inspect: true
141
- }));
142
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
143
- let svg = charts[kind]({
144
- ...opts,
145
- ...(props.kind === "line" && props.legend && props.legendPlacement === "top-start" ? {
146
- legend: false
147
- } : {}),
148
- ...(kind === "map" ? {
149
- viewport: DEFAULT_MAP_VIEWPORT
150
- } : {}),
151
- width,
152
- height,
153
- inspect: true
154
- });
155
- if (props.kind === "line" && props.maxGap !== undefined) {
156
- if (props.area || props.errorBand) throw new Error("Chart maxGap does not support area or errorBand fills");
157
- svg = lineGapsSvg(svg, props.maxGap, props);
158
- }
159
- if (props.kind === "map") return responsiveMapSvg(svg, width, height, normalizeMapViewport(mapViewport ?? props.viewport));
160
- return preservesAspectRatio(kind) ? svg : responsiveChartSvg(svg);
161
- };
162
- const preservesAspectRatio = kind => kind === "map" || kind === "pie" || kind === "donut" || kind === "gauge";
163
-
164
- /** Empty-data short-circuit. Kept per-kind because stdlib's payload
99
+ /** Empty-data short-circuit. Kept per-kind because each renderer's payload
165
100
  * key differs (series vs data vs groups). We're conservative: only
166
101
  * block on truly empty inputs; partially-filled series get rendered
167
- * as-is and stdlib handles the gaps. */
102
+ * as-is and the core handles the gaps. */
168
103
  const isEmpty = props => {
104
+ 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));
169
105
  if (props.kind === "line" || props.kind === "scatter") {
170
106
  return !props.series?.length || props.series.every(s => !s.data.length);
171
107
  }
@@ -183,8 +119,8 @@ const isEmpty = props => {
183
119
  }
184
120
  return false;
185
121
  };
186
- const Chart = props => {
187
- const [, drawingProps] = splitProps(props, ["selected", "onSelect", "tooltip", "cursor"]);
122
+ const ChartRoot = props => {
123
+ const [, drawingProps] = splitProps(props, ["class", "style", "labels", "interactive", "selected", "onSelect", "tooltip", "cursor"]);
188
124
  const messages = useUiMessages();
189
125
  const chartMessages = useChartMessages();
190
126
  const viewportMessages = useViewportMessages();
@@ -194,12 +130,31 @@ const Chart = props => {
194
130
  let lineAnchorRef;
195
131
  // One deterministic coordinate space on the server and client. CSS fits the
196
132
  // SVG to its box; hydration must never replace it with measured geometry.
133
+ const calendar = () => props.kind === "heatmap" && props.layout === "calendar" ? calendarLayout({
134
+ ...props,
135
+ locale: props.locale ?? locale()
136
+ }) : undefined;
197
137
  const size = () => ({
198
- width: 480,
138
+ width: calendar()?.width ?? 480,
199
139
  height: chartRenderHeight(props)
200
140
  });
201
- const topLegend = () => props.kind === "line" && props.legend === true && props.legendPlacement === "top-start";
202
- const legendSeries = () => props.kind === "line" ? props.series : [];
141
+ const topLegend = () => props.kind === "area" ? props.legend !== false : props.kind === "line" && props.legend === true && props.legendPlacement === "top-start";
142
+ const legendSeries = () => props.kind === "line" || props.kind === "area" ? props.series : [];
143
+ const legendValue = index => {
144
+ if (props.kind !== "area") return "";
145
+ const last = props.x.length - 1;
146
+ const amount = props.series[index]?.data[last];
147
+ const values = props.series.map(s => s.data[last]);
148
+ const total = values.reduce((sum, value) => sum + (value ?? 0), 0);
149
+ if (amount == null || values.some(v => v == null) || props.normalize && total === 0) return "—";
150
+ return props.normalize ? new Intl.NumberFormat(locale(), {
151
+ style: "percent",
152
+ minimumFractionDigits: 1,
153
+ maximumFractionDigits: 1
154
+ }).format(amount / total) : props.format?.(amount) ?? new Intl.NumberFormat(locale(), {
155
+ maximumFractionDigits: 2
156
+ }).format(amount);
157
+ };
203
158
  const dimensions = () => containerRef?.getBoundingClientRect() ?? size();
204
159
  const initialMapViewport = props.kind === "map" ? normalizeMapViewport(props.viewport) : DEFAULT_MAP_VIEWPORT;
205
160
  const [mapViewport, setMapViewport] = createSignal(initialMapViewport);
@@ -336,6 +291,7 @@ const Chart = props => {
336
291
  pointerFrame = requestAnimationFrame(flushPointerMove);
337
292
  };
338
293
  const stopDragging = event => {
294
+ inspection.up();
339
295
  if (pendingPointer?.pointerId === event.pointerId) flushPointerMove();
340
296
  if (timelineDrag?.pointerId === event.pointerId) {
341
297
  if (event.currentTarget.hasPointerCapture(event.pointerId)) {
@@ -405,22 +361,35 @@ const Chart = props => {
405
361
  };
406
362
  const inspection = createChartInspection({
407
363
  container: () => containerRef,
364
+ locale,
408
365
  cursor: () => props.cursor,
409
366
  tooltip: () => chartTooltipRef,
410
367
  anchor: () => lineAnchorRef,
411
368
  kind: () => props.kind,
369
+ nav: () => props.kind === "heatmap" && props.layout === "calendar" ? calendarInspectionNavigation : undefined,
412
370
  enabled: () => !isEmpty(props),
413
371
  select: selection => props.onSelect?.(selection),
414
372
  format: selection => {
415
373
  if (props.tooltip) return props.tooltip(selection);
416
- const fields = chartMessages().chartFields;
374
+ const fields = props.kind === "heatmap" && props.layout === "calendar" ? resolveChartMessages(props.locale ?? locale()).chartFields : chartMessages().chartFields;
375
+ if (selection.kind === "area" && props.kind === "area") {
376
+ const amount = selection.datum.values.find(f => f.key === "value");
377
+ const share = selection.datum.values.find(f => f.key === "percent");
378
+ return {
379
+ title: selection.datum.values.find(f => f.key === "x")?.formatted ?? "",
380
+ rows: [{
381
+ label: selection.datum.label ?? chartMessages().series,
382
+ value: `${share ? `${share.formatted} · ` : ""}${amount.formatted}`
383
+ }]
384
+ };
385
+ }
417
386
  const format = new Intl.NumberFormat(locale(), {
418
387
  maximumFractionDigits: 6
419
388
  });
420
389
  return {
421
390
  title: selection.datum.label ?? (selection.datum.seriesIndex !== undefined ? `${labels().series ?? chartMessages().series} ${selection.datum.seriesIndex + 1}` : undefined),
422
391
  rows: selection.datum.values.map(field => ({
423
- label: selection.kind === "line" && field.key === "y" ? selection.datum.label ?? labels().series ?? chartMessages().series : fields({
392
+ 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({
424
393
  key: field.key
425
394
  }),
426
395
  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)
@@ -429,7 +398,10 @@ const Chart = props => {
429
398
  }
430
399
  });
431
400
  const closeChartTooltip = () => inspection.close();
432
- const svgMarkup = createMemo(() => renderChartSvg(drawingProps, size().width, size().height, interactiveMap() ? mapViewport() : undefined, interactiveTimeline() ? timelineViewport() : undefined));
401
+ const svgMarkup = createMemo(() => renderChartSvg(props.kind === "heatmap" && props.layout === "calendar" ? {
402
+ ...props,
403
+ locale: props.locale ?? locale()
404
+ } : drawingProps, size().width, size().height, interactiveMap() ? mapViewport() : undefined, interactiveTimeline() ? timelineViewport() : undefined, locale()));
433
405
  createEffect(() => {
434
406
  svgMarkup();
435
407
  inspection.invalidate();
@@ -444,10 +416,12 @@ const Chart = props => {
444
416
  });
445
417
  onMount(() => {
446
418
  if (!containerRef) return;
419
+ if (props.kind === "heatmap" && props.layout === "calendar") onCleanup(mountCalendarScroll(containerRef));
447
420
  onCleanup(closeChartInspectionOnOutside({
448
421
  container: () => containerRef,
449
422
  tooltip: () => chartTooltipRef,
450
- close: closeChartTooltip
423
+ close: closeChartTooltip,
424
+ keepScroll: () => props.kind === "heatmap" && props.layout === "calendar"
451
425
  }));
452
426
  });
453
427
  const chartStyle = () => props.style ?? (props.kind === "stateTimeline" ? {
@@ -475,10 +449,10 @@ const Chart = props => {
475
449
  typeof _ref$4 === "function" ? _$use(_ref$4, _el$16) : containerRef = _el$16;
476
450
  _$insert(_el$16, () => labels().empty ?? messages().noData);
477
451
  _$effect(_p$ => {
478
- var _v$12 = `k2b-chart k2b-chart__empty ${props.class ?? ""}`,
479
- _v$13 = chartStyle();
480
- _v$12 !== _p$.e && _$className(_el$16, _p$.e = _v$12);
481
- _p$.t = _$style(_el$16, _v$13, _p$.t);
452
+ var _v$13 = `k2b-chart k2b-chart__empty ${props.class ?? ""}`,
453
+ _v$14 = chartStyle();
454
+ _v$13 !== _p$.e && _$className(_el$16, _p$.e = _v$13);
455
+ _p$.t = _$style(_el$16, _v$14, _p$.t);
482
456
  return _p$;
483
457
  }, {
484
458
  e: undefined,
@@ -519,23 +493,51 @@ const Chart = props => {
519
493
  return legendSeries();
520
494
  },
521
495
  children: (series, index) => (() => {
522
- var _el$17 = _$getNextElement(_tmpl$6),
496
+ var _el$17 = _$getNextElement(_tmpl$7),
523
497
  _el$18 = _el$17.firstChild,
524
498
  _el$19 = _el$18.firstChild,
525
- _el$20 = _el$18.nextSibling;
499
+ _el$20 = _el$18.nextSibling,
500
+ _el$22 = _el$20.nextSibling,
501
+ [_el$23, _co$6] = _$getNextMarker(_el$22.nextSibling);
526
502
  _$insert(_el$20, (() => {
527
503
  var _c$ = _$memo(() => !!(series.label && series.label.length > 0));
528
- return () => _c$() ? series.label : `Series ${index() + 1}`;
504
+ return () => _c$() ? series.label : `${chartMessages().series} ${index() + 1}`;
529
505
  })());
506
+ _$insert(_el$17, _$createComponent(Show, {
507
+ get when() {
508
+ return props.kind === "area";
509
+ },
510
+ get children() {
511
+ var _el$21 = _$getNextElement(_tmpl$6);
512
+ _$insert(_el$21, () => legendValue(index()));
513
+ _$effect(_p$ => {
514
+ var _v$15 = index(),
515
+ _v$16 = props.kind === "area" && props.normalize ? "percent" : "value",
516
+ _v$17 = legendValue(index());
517
+ _v$15 !== _p$.e && _$setAttribute(_el$21, "data-series-index", _p$.e = _v$15);
518
+ _v$16 !== _p$.t && _$setAttribute(_el$21, "data-field", _p$.t = _v$16);
519
+ _v$17 !== _p$.a && _$setAttribute(_el$21, "data-default", _p$.a = _v$17);
520
+ return _p$;
521
+ }, {
522
+ e: undefined,
523
+ t: undefined,
524
+ a: undefined
525
+ });
526
+ return _el$21;
527
+ }
528
+ }), _el$23, _co$6);
530
529
  _$effect(_p$ => {
531
- var _v$14 = `stdlib-chart k2b-chart__legend-swatch ${props.kind === "line" ? props.className ?? "" : ""}`,
532
- _v$15 = `stdlib-chart-series-${index() % 8}`;
533
- _v$14 !== _p$.e && _$setAttribute(_el$18, "class", _p$.e = _v$14);
534
- _v$15 !== _p$.t && _$setAttribute(_el$19, "class", _p$.t = _v$15);
530
+ var _v$18 = `stdlib-chart k2b-chart__legend-swatch ${props.kind === "line" ? props.className ?? "" : ""}`,
531
+ _v$19 = `stdlib-chart-series-${index() % 8}`,
532
+ _v$20 = `var(--stdlib-chart-c${index() % 8 + 1}, ${["#2563eb", "#16a34a", "#d97706", "#dc2626", "#a855f7", "#0891b2", "#db2777", "#65a30d"][index() % 8]})`;
533
+ _v$18 !== _p$.e && _$setAttribute(_el$18, "class", _p$.e = _v$18);
534
+ _v$19 !== _p$.t && _$setAttribute(_el$19, "class", _p$.t = _v$19);
535
+ _v$20 !== _p$.a && _$setAttribute(_el$19, "fill", _p$.a = _v$20);
535
536
  return _p$;
536
537
  }, {
537
538
  e: undefined,
538
- t: undefined
539
+ t: undefined,
540
+ a: undefined
539
541
  });
540
542
  return _el$17;
541
543
  })()
@@ -576,11 +578,12 @@ const Chart = props => {
576
578
  _v$6 = chartStyle(),
577
579
  _v$7 = accessibleName(),
578
580
  _v$8 = accessibleName() !== chartMessages().interactiveChart ? chartMessages().interactiveChart : undefined,
579
- _v$9 = !preservesAspectRatio(props.kind) ? "true" : undefined,
580
- _v$0 = `${size().width}px`,
581
- _v$1 = `${size().height}px`,
582
- _v$10 = `${size().width} / ${size().height}`,
583
- _v$11 = isServer ? selectedChartSvg(svgMarkup(), props.selected) : svgMarkup();
581
+ _v$9 = !calendar() && !preservesAspectRatio(props.kind) ? "true" : undefined,
582
+ _v$0 = calendar() ? `${calendar().minWidth}px` : undefined,
583
+ _v$1 = `${size().width}px`,
584
+ _v$10 = `${size().height}px`,
585
+ _v$11 = `${size().width} / ${size().height}`,
586
+ _v$12 = isServer ? selectedChartSvg(svgMarkup(), props.selected) : svgMarkup();
584
587
  _v$ !== _p$.e && _$className(_el$2, _p$.e = _v$);
585
588
  _v$2 !== _p$.t && _$setAttribute(_el$2, "data-chart-kind", _p$.t = _v$2);
586
589
  _v$3 !== _p$.a && _$setAttribute(_el$2, "data-legend-placement", _p$.a = _v$3);
@@ -590,10 +593,11 @@ const Chart = props => {
590
593
  _v$7 !== _p$.s && _$setAttribute(_el$2, "aria-label", _p$.s = _v$7);
591
594
  _v$8 !== _p$.h && _$setAttribute(_el$2, "aria-description", _p$.h = _v$8);
592
595
  _v$9 !== _p$.r && _$setAttribute(_el$4, "data-stretch", _p$.r = _v$9);
593
- _v$0 !== _p$.d && _$setStyleProperty(_el$4, "--k2b-chart-width", _p$.d = _v$0);
594
- _v$1 !== _p$.l && _$setStyleProperty(_el$4, "--k2b-chart-height", _p$.l = _v$1);
595
- _v$10 !== _p$.u && _$setStyleProperty(_el$4, "aspect-ratio", _p$.u = _v$10);
596
- _v$11 !== _p$.c && _$setProperty(_el$4, "innerHTML", _p$.c = _v$11);
596
+ _v$0 !== _p$.d && _$setStyleProperty(_el$4, "min-width", _p$.d = _v$0);
597
+ _v$1 !== _p$.l && _$setStyleProperty(_el$4, "--k2b-chart-width", _p$.l = _v$1);
598
+ _v$10 !== _p$.u && _$setStyleProperty(_el$4, "--k2b-chart-height", _p$.u = _v$10);
599
+ _v$11 !== _p$.c && _$setStyleProperty(_el$4, "aspect-ratio", _p$.c = _v$11);
600
+ _v$12 !== _p$.w && _$setProperty(_el$4, "innerHTML", _p$.w = _v$12);
597
601
  return _p$;
598
602
  }, {
599
603
  e: undefined,
@@ -608,13 +612,28 @@ const Chart = props => {
608
612
  d: undefined,
609
613
  l: undefined,
610
614
  u: undefined,
611
- c: undefined
615
+ c: undefined,
616
+ w: undefined
612
617
  });
613
618
  _$runHydrationEvents();
614
619
  return _el$2;
615
620
  }
616
621
  });
617
622
  };
623
+ // Add a renderer to charts/core/registry.ts; its key defines the namespace member and discriminator.
624
+ // Both entry styles share ChartRoot, preserving the same owner, markup and reactive props.
625
+ const chartComponent = kind => props =>
626
+ // Public namespace types correlate each discriminator with its options.
627
+ ChartRoot(mergeProps(props, {
628
+ kind
629
+ }));
630
+ const components = Object.fromEntries(Object.entries(chartKinds).map(([name, kind]) => [name, chartComponent(kind)]));
631
+ const Chart = Object.assign(ChartRoot, components, {
632
+ Calendar: props => ChartRoot(mergeProps(props, {
633
+ kind: "heatmap",
634
+ layout: "calendar"
635
+ }))
636
+ });
618
637
  export default Chart;
619
638
  _$delegateEvents(["pointerdown", "pointermove", "pointerup", "click", "focusin", "focusout", "keydown"]);
620
639
  //# sourceMappingURL=Chart.js.map