@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
@@ -0,0 +1,162 @@
1
+ // Draws every axis kind with values that the float spacing or the tick budget used to keep counting forever.
2
+ // termination.test.ts runs this file in a child process with a deadline, so a regression fails instead of hanging.
3
+ import { chartTimeStep, chartTimeTicks } from "../../content/chart-time-axis";
4
+ import { renderChartSvg } from "./render";
5
+ import { extendDomainToNice, stateTimeline } from "./svg";
6
+
7
+ // One value at 1e17 has a float spacing of 16, so its ±1 padding collapses to a zero range.
8
+ const big = 1e17;
9
+ const pair = (x, y) => [{
10
+ x,
11
+ y
12
+ }];
13
+ const cases = {
14
+ "line, auto y": () => renderChartSvg({
15
+ kind: "line",
16
+ series: [{
17
+ label: "A",
18
+ data: [...pair(0, big), ...pair(1, big)]
19
+ }]
20
+ }, 480, 280),
21
+ "line, nearly equal y": () => renderChartSvg({
22
+ kind: "line",
23
+ series: [{
24
+ label: "A",
25
+ data: [...pair(0, big), ...pair(1, big + 16)]
26
+ }]
27
+ }, 480, 280),
28
+ "line, auto x": () => renderChartSvg({
29
+ kind: "line",
30
+ series: [{
31
+ label: "A",
32
+ data: [...pair(big, 1), ...pair(big, 2)]
33
+ }]
34
+ }, 480, 280),
35
+ "line, fixed y with a tick target past the budget": () => renderChartSvg({
36
+ kind: "line",
37
+ series: [{
38
+ label: "A",
39
+ data: pair(0, 0.5)
40
+ }],
41
+ yAxis: {
42
+ domain: [0, 1],
43
+ ticks: 1e9
44
+ }
45
+ }, 480, 280),
46
+ "line, time x": () => renderChartSvg({
47
+ kind: "line",
48
+ series: [{
49
+ label: "A",
50
+ data: pair(big, 1)
51
+ }],
52
+ timeAxis: {
53
+ timeZone: "UTC"
54
+ }
55
+ }, 480, 280),
56
+ "scatter, auto x and y": () => renderChartSvg({
57
+ kind: "scatter",
58
+ series: [{
59
+ label: "A",
60
+ data: pair(big, big)
61
+ }]
62
+ }, 480, 280),
63
+ "histogram, auto x": () => renderChartSvg({
64
+ kind: "histogram",
65
+ data: [big, big, big]
66
+ }, 480, 280),
67
+ "boxplot, auto y": () => renderChartSvg({
68
+ kind: "boxplot",
69
+ groups: [{
70
+ label: "A",
71
+ values: [big, big, big]
72
+ }]
73
+ }, 480, 280),
74
+ "bar, auto y": () => renderChartSvg({
75
+ kind: "bar",
76
+ data: [{
77
+ label: "A",
78
+ value: -big
79
+ }]
80
+ }, 480, 280),
81
+ "bar, fixed y with a tick target past the budget": () => renderChartSvg({
82
+ kind: "bar",
83
+ data: [{
84
+ label: "A",
85
+ value: 0.5
86
+ }],
87
+ yAxis: {
88
+ domain: [0, 1],
89
+ ticks: 1e9
90
+ }
91
+ }, 480, 280),
92
+ "state timeline, time x": () => renderChartSvg({
93
+ kind: "stateTimeline",
94
+ rows: [{
95
+ label: "A",
96
+ intervals: [{
97
+ from: big,
98
+ to: big,
99
+ state: "on"
100
+ }]
101
+ }]
102
+ }, 480, 280),
103
+ "core state timeline, time x": () => stateTimeline({
104
+ width: 480,
105
+ height: 280,
106
+ rows: [{
107
+ label: "A",
108
+ intervals: [{
109
+ from: big,
110
+ to: big,
111
+ state: "on"
112
+ }]
113
+ }]
114
+ }),
115
+ "log y": () => renderChartSvg({
116
+ kind: "line",
117
+ series: [{
118
+ label: "A",
119
+ data: pair(0, 1)
120
+ }],
121
+ yAxis: {
122
+ scale: "log",
123
+ domain: [1e-300, 1e300]
124
+ }
125
+ }, 480, 280),
126
+ "nice ticks, step below the float spacing": () => extendDomainToNice(big, big, 1).ticks,
127
+ "nice ticks, step past the budget": () => extendDomainToNice(0, 1, 1e-9).ticks,
128
+ "nice ticks, negative step": () => extendDomainToNice(0, 10, -1).ticks,
129
+ "time ticks, instants past the Date range": () => chartTimeTicks([big, big + 86_400_000], "UTC", chartTimeStep(86_400_000, 5)),
130
+ "time ticks, a step below the float spacing": () => chartTimeTicks([Date.UTC(2026, 0, 1), Date.UTC(2026, 0, 2)], "UTC", {
131
+ unit: "hour",
132
+ size: 1e-20
133
+ }),
134
+ "time ticks, a step that repeats one minute": () => chartTimeTicks([Date.UTC(2026, 0, 1), Date.UTC(2026, 0, 2)], "UTC", {
135
+ unit: "hour",
136
+ size: 1e-9
137
+ }),
138
+ "time ticks, a zero year step": () => chartTimeTicks([Date.UTC(2026, 0, 1), Date.UTC(2036, 0, 1)], "UTC", {
139
+ unit: "year",
140
+ size: 0
141
+ }),
142
+ "time ticks, a negative step": () => chartTimeTicks([Date.UTC(2026, 0, 1), Date.UTC(2026, 0, 2)], "UTC", {
143
+ unit: "hour",
144
+ size: -1
145
+ })
146
+ };
147
+ for (const [name, draw] of Object.entries(cases)) {
148
+ const result = draw();
149
+ console.log(JSON.stringify({
150
+ name,
151
+ ...(typeof result === "string" ? {
152
+ svg: result.length,
153
+ nan: /NaN/.test(result)
154
+ } : {
155
+ ticks: result
156
+ })
157
+ }));
158
+ }
159
+ console.log(JSON.stringify({
160
+ done: Object.keys(cases).length
161
+ }));
162
+ //# sourceMappingURL=termination.test-fixture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["line, auto y","line, nearly equal y","line, auto x","line, fixed y with a tick target past the budget","line, time x","scatter, auto x and y","histogram, auto x","boxplot, auto y","bar, auto y","bar, fixed y with a tick target past the budget","state timeline, time x","core state timeline, time x","log y","nice ticks, step below the float spacing","nice ticks, step past the budget","nice ticks, negative step","time ticks, instants past the Date range","time ticks, a step below the float spacing","time ticks, a step that repeats one minute","time ticks, a zero year step","time ticks, a negative step"],"sources":["charts/core/termination.test-fixture.ts"],"sourcesContent":["// Draws every axis kind with values that the float spacing or the tick budget used to keep counting forever.\n// termination.test.ts runs this file in a child process with a deadline, so a regression fails instead of hanging.\nimport { chartTimeStep, chartTimeTicks } from \"../../content/chart-time-axis\";\nimport { renderChartSvg } from \"./render\";\nimport { extendDomainToNice, stateTimeline } from \"./svg\";\n\n// One value at 1e17 has a float spacing of 16, so its ±1 padding collapses to a zero range.\nconst big = 1e17;\nconst pair = (x: number, y: number) => [{ x, y }];\nconst cases: Record<string, () => string | number[]> = {\n \"line, auto y\": () => renderChartSvg({ kind: \"line\", series: [{ label: \"A\", data: [...pair(0, big), ...pair(1, big)] }] }, 480, 280),\n \"line, nearly equal y\": () =>\n renderChartSvg({ kind: \"line\", series: [{ label: \"A\", data: [...pair(0, big), ...pair(1, big + 16)] }] }, 480, 280),\n \"line, auto x\": () => renderChartSvg({ kind: \"line\", series: [{ label: \"A\", data: [...pair(big, 1), ...pair(big, 2)] }] }, 480, 280),\n \"line, fixed y with a tick target past the budget\": () =>\n renderChartSvg({ kind: \"line\", series: [{ label: \"A\", data: pair(0, 0.5) }], yAxis: { domain: [0, 1], ticks: 1e9 } }, 480, 280),\n \"line, time x\": () =>\n renderChartSvg({ kind: \"line\", series: [{ label: \"A\", data: pair(big, 1) }], timeAxis: { timeZone: \"UTC\" } }, 480, 280),\n \"scatter, auto x and y\": () => renderChartSvg({ kind: \"scatter\", series: [{ label: \"A\", data: pair(big, big) }] }, 480, 280),\n \"histogram, auto x\": () => renderChartSvg({ kind: \"histogram\", data: [big, big, big] }, 480, 280),\n \"boxplot, auto y\": () => renderChartSvg({ kind: \"boxplot\", groups: [{ label: \"A\", values: [big, big, big] }] }, 480, 280),\n \"bar, auto y\": () => renderChartSvg({ kind: \"bar\", data: [{ label: \"A\", value: -big }] }, 480, 280),\n \"bar, fixed y with a tick target past the budget\": () =>\n renderChartSvg({ kind: \"bar\", data: [{ label: \"A\", value: 0.5 }], yAxis: { domain: [0, 1], ticks: 1e9 } }, 480, 280),\n \"state timeline, time x\": () =>\n renderChartSvg({ kind: \"stateTimeline\", rows: [{ label: \"A\", intervals: [{ from: big, to: big, state: \"on\" }] }] }, 480, 280),\n \"core state timeline, time x\": () =>\n stateTimeline({ width: 480, height: 280, rows: [{ label: \"A\", intervals: [{ from: big, to: big, state: \"on\" }] }] }),\n \"log y\": () =>\n renderChartSvg(\n { kind: \"line\", series: [{ label: \"A\", data: pair(0, 1) }], yAxis: { scale: \"log\", domain: [1e-300, 1e300] } },\n 480,\n 280,\n ),\n \"nice ticks, step below the float spacing\": () => extendDomainToNice(big, big, 1).ticks,\n \"nice ticks, step past the budget\": () => extendDomainToNice(0, 1, 1e-9).ticks,\n \"nice ticks, negative step\": () => extendDomainToNice(0, 10, -1).ticks,\n \"time ticks, instants past the Date range\": () => chartTimeTicks([big, big + 86_400_000], \"UTC\", chartTimeStep(86_400_000, 5)),\n \"time ticks, a step below the float spacing\": () =>\n chartTimeTicks([Date.UTC(2026, 0, 1), Date.UTC(2026, 0, 2)], \"UTC\", { unit: \"hour\", size: 1e-20 }),\n \"time ticks, a step that repeats one minute\": () =>\n chartTimeTicks([Date.UTC(2026, 0, 1), Date.UTC(2026, 0, 2)], \"UTC\", { unit: \"hour\", size: 1e-9 }),\n \"time ticks, a zero year step\": () => chartTimeTicks([Date.UTC(2026, 0, 1), Date.UTC(2036, 0, 1)], \"UTC\", { unit: \"year\", size: 0 }),\n \"time ticks, a negative step\": () => chartTimeTicks([Date.UTC(2026, 0, 1), Date.UTC(2026, 0, 2)], \"UTC\", { unit: \"hour\", size: -1 }),\n};\n\nfor (const [name, draw] of Object.entries(cases)) {\n const result = draw();\n console.log(\n JSON.stringify({ name, ...(typeof result === \"string\" ? { svg: result.length, nan: /NaN/.test(result) } : { ticks: result }) }),\n );\n}\nconsole.log(JSON.stringify({ done: Object.keys(cases).length }));\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,13 @@
1
+ /** Conservative proportional-font advances in em, shared by DOM-free SVG label layout.
2
+ * Wide glyphs retain their natural shape; fitting removes whole code points instead of stretching text.
3
+ */
4
+ export function chartTextWidth(text, size) {
5
+ return Array.from(text).reduce((width, glyph) => width + (/\s/.test(glyph) ? 0.34 : /[ilI.,:;!|'`]/.test(glyph) ? 0.32 : /[MW@%&]/.test(glyph) ? 1 : /[A-Z0-9]/.test(glyph) ? 0.74 : /[a-zäöüßéèáàóúñç()-]/i.test(glyph) ? 0.64 : 1), 0) * size;
6
+ }
7
+ export function fitChartText(text, width, size) {
8
+ if (chartTextWidth(text, size) <= width) return text;
9
+ const glyphs = Array.from(text);
10
+ while (glyphs.length && chartTextWidth(glyphs.join("") + "…", size) > width) glyphs.pop();
11
+ return chartTextWidth("…", size) <= width ? glyphs.join("") + "…" : "";
12
+ }
13
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["charts/core/text.ts"],"sourcesContent":["/** Conservative proportional-font advances in em, shared by DOM-free SVG label layout.\n * Wide glyphs retain their natural shape; fitting removes whole code points instead of stretching text.\n */\nexport function chartTextWidth(text: string, size: number): number {\n return (\n Array.from(text).reduce(\n (width, glyph) =>\n width +\n (/\\s/.test(glyph)\n ? 0.34\n : /[ilI.,:;!|'`]/.test(glyph)\n ? 0.32\n : /[MW@%&]/.test(glyph)\n ? 1\n : /[A-Z0-9]/.test(glyph)\n ? 0.74\n : /[a-zäöüßéèáàóúñç()-]/i.test(glyph)\n ? 0.64\n : 1),\n 0,\n ) * size\n );\n}\n\nexport function fitChartText(text: string, width: number, size: number): string {\n if (chartTextWidth(text, size) <= width) return text;\n const glyphs = Array.from(text);\n while (glyphs.length && chartTextWidth(glyphs.join(\"\") + \"…\", size) > width) glyphs.pop();\n return chartTextWidth(\"…\", size) <= width ? glyphs.join(\"\") + \"…\" : \"\";\n}\n"],"mappings":"AAAA;AACA;AACA;AACA,OAAO,SAAS,cAAc,CAAC,IAAY,EAAE,IAAY,EAAU;EACjE,OACE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CACrB,CAAC,KAAK,EAAE,KAAK,KACX,KAAK,IACJ,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GACb,IAAI,GACJ,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,GACzB,IAAI,GACJ,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GACnB,CAAC,GACD,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GACpB,IAAI,GACJ,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,GACjC,IAAI,GACJ,CAAC,CAAC,EAChB,CACF,CAAC,GAAG,IAAI;AAEZ;AAEA,OAAO,SAAS,YAAY,CAAC,IAAY,EAAE,KAAa,EAAE,IAAY,EAAU;EAC9E,IAAI,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,OAAO,IAAI;EACpD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;EAC/B,OAAO,MAAM,CAAC,MAAM,IAAI,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,IAAI,CAAC,GAAG,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;EACzF,OAAO,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE;AACxE","ignoreList":[]}
@@ -0,0 +1,8 @@
1
+ /** UI-owned kind union, derived from the renderer registry. */
2
+
3
+ export const chartDatumRoles = ["point", "item", "bin", "box", "outlier", "value", "cell", "interval"];
4
+
5
+ /** Renderer metadata. Anchors use the containing SVG's coordinate space. */
6
+
7
+ /** Serializable number presentation, compatible with the editor's NumberFormat contract. */
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["charts/core/types.ts"],"sourcesContent":["import type { chartRenderers } from \"./registry\";\n\n/** UI-owned kind union, derived from the renderer registry. */\nexport type ChartKind = keyof typeof chartRenderers;\nexport const chartDatumRoles = [\"point\", \"item\", \"bin\", \"box\", \"outlier\", \"value\", \"cell\", \"interval\"] as const;\nexport type ChartDatumRole = (typeof chartDatumRoles)[number];\n\n/** Renderer metadata. Anchors use the containing SVG's coordinate space. */\nexport type ChartDatum = {\n index: number;\n seriesIndex?: number;\n role: ChartDatumRole;\n label?: string;\n anchor: [number, number];\n grid?: [number, number];\n values: { key: string; value: string | number; formatted?: string }[];\n};\n\n/** Serializable number presentation, compatible with the editor's NumberFormat contract. */\nexport type ChartNumberFormat = {\n style?: \"number\" | \"percent\" | \"currency\";\n currency?: string;\n unit?: string;\n decimals?: number;\n compact?: boolean;\n};\nexport type ChartDateFormat = { date: \"day\" | \"minute\" | \"second\" };\nexport type ChartFormat = ChartNumberFormat | ChartDateFormat;\n"],"mappings":"AAEA;;AAEA,OAAO,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAU;;AAG/G;;AAWA","ignoreList":[]}
@@ -1,6 +1,8 @@
1
1
  /**
2
- * Pure chart renderers that share the `Chart` component's drawing without its Solid wrapper, for hosts that draw
3
- * SVG themselves, such as server previews and app frames.
2
+ * Drawing helpers and portable chart contracts. Import the Solid Chart component from `@k2b/ui`.
4
3
  */
4
+
5
+ export * from "./charts/core";
5
6
  export { barChartLayout, renderBarChartSvg } from "./content/chart-bar";
7
+ export { calendarInspectionNavigation, mountCalendarScroll } from "./content/chart-calendar";
6
8
  //# sourceMappingURL=charts.js.map
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["charts.ts"],"sourcesContent":["/**\n * Pure chart renderers that share the `Chart` component's drawing without its Solid wrapper, for hosts that draw\n * SVG themselves, such as server previews and app frames.\n */\nexport { type BarChartLayout, type BarChartOptions, barChartLayout, renderBarChartSvg } from \"./content/chart-bar\";\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA,SAAoD,cAAc,EAAE,iBAAiB,QAAQ,qBAAqB","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["charts.ts"],"sourcesContent":["/**\n * Drawing helpers and portable chart contracts. Import the Solid Chart component from `@k2b/ui`.\n */\n\nexport * from \"./charts/core\";\nexport type { ChartKindProps, ChartLabels, ChartProps, ChartRenderOptions } from \"./content/Chart\";\nexport { type BarChartLayout, type BarChartOptions, barChartLayout, renderBarChartSvg } from \"./content/chart-bar\";\n\nexport { calendarInspectionNavigation, mountCalendarScroll } from \"./content/chart-calendar\";\n"],"mappings":"AAAA;AACA;AACA;;AAEA,cAAc,eAAe;AAE7B,SAAoD,cAAc,EAAE,iBAAiB,QAAQ,qBAAqB;AAElH,SAAS,4BAA4B,EAAE,mBAAmB,QAAQ,0BAA0B","ignoreList":[]}
@@ -0,0 +1,106 @@
1
+ import { template as _$template } from "solid-js/web";
2
+ import { className as _$className } from "solid-js/web";
3
+ import { effect as _$effect } from "solid-js/web";
4
+ import { getNextElement as _$getNextElement } from "solid-js/web";
5
+ import { createComponent as _$createComponent } from "solid-js/web";
6
+ import { getNextMarker as _$getNextMarker } from "solid-js/web";
7
+ import { insert as _$insert } from "solid-js/web";
8
+ import { memo as _$memo } from "solid-js/web";
9
+ var _tmpl$ = /*#__PURE__*/_$template(`<p><span class=k2b-balance__part><!$><!/> <b></b></span><span class=k2b-balance__op aria-hidden=true>+</span><!$><!/><span class=k2b-balance__op aria-hidden=true>−</span><!$><!/><span class=k2b-balance__op aria-hidden=true>=</span><span class=k2b-balance__part><!$><!/> <b>`);
10
+ import { useLocale } from "../intl/locale";
11
+ import { useBalanceSummaryMessages } from "./balance-summary-messages";
12
+ import { FlowAmount } from "./FlowAmount";
13
+ /** A movement as an amount; a broken value stays broken, so it shows "—" and never a believable zero. */
14
+ const amount = value => Number.isFinite(value) ? Math.abs(value) : Number.NaN;
15
+
16
+ /**
17
+ * One line from the start of a period to its end: "Start 18,800 € + ↙ 29,260 € − ↗ 29,520 € = End 18,540 €". In and
18
+ * out show their direction with `FlowAmount`; start and end are balances and keep their sign.
19
+ */
20
+ export function BalanceSummary(props) {
21
+ const locale = useLocale();
22
+ const t = useBalanceSummaryMessages(() => props.locale);
23
+ const lang = () => props.locale ?? locale();
24
+ const start = () => props.start;
25
+ const end = () => start() + amount(props.in) - amount(props.out);
26
+ // Whole amounts read best, but the line is an equation: when the rounded parts would not add up, show cents.
27
+ const decimals = () => {
28
+ if (props.decimals !== undefined) return props.decimals;
29
+ const whole = value => Math.round(value);
30
+ const parts = [start(), amount(props.in), amount(props.out)];
31
+ if (!parts.every(Number.isFinite)) return 0;
32
+ return whole(start()) + whole(amount(props.in)) - whole(amount(props.out)) === whole(end()) ? 0 : 2;
33
+ };
34
+ const balance = value => !Number.isFinite(value) ? "—" : new Intl.NumberFormat(lang(), {
35
+ style: "currency",
36
+ currency: props.currency,
37
+ minimumFractionDigits: decimals(),
38
+ maximumFractionDigits: decimals()
39
+ }).format(value === 0 ? 0 : value);
40
+ return (() => {
41
+ var _el$ = _$getNextElement(_tmpl$),
42
+ _el$2 = _el$.firstChild,
43
+ _el$5 = _el$2.firstChild,
44
+ [_el$6, _co$] = _$getNextMarker(_el$5.nextSibling),
45
+ _el$3 = _el$6.nextSibling,
46
+ _el$4 = _el$3.nextSibling,
47
+ _el$7 = _el$2.nextSibling,
48
+ _el$13 = _el$7.nextSibling,
49
+ [_el$14, _co$3] = _$getNextMarker(_el$13.nextSibling),
50
+ _el$8 = _el$14.nextSibling,
51
+ _el$15 = _el$8.nextSibling,
52
+ [_el$16, _co$4] = _$getNextMarker(_el$15.nextSibling),
53
+ _el$9 = _el$16.nextSibling,
54
+ _el$0 = _el$9.nextSibling,
55
+ _el$11 = _el$0.firstChild,
56
+ [_el$12, _co$2] = _$getNextMarker(_el$11.nextSibling),
57
+ _el$1 = _el$12.nextSibling,
58
+ _el$10 = _el$1.nextSibling;
59
+ _$insert(_el$2, () => props.labels?.start ?? t().start, _el$6, _co$);
60
+ _$insert(_el$4, () => balance(start()));
61
+ _$insert(_el$, _$createComponent(FlowAmount, {
62
+ get value() {
63
+ return amount(props.in);
64
+ },
65
+ get currency() {
66
+ return props.currency;
67
+ },
68
+ get locale() {
69
+ return lang();
70
+ },
71
+ get decimals() {
72
+ return decimals();
73
+ },
74
+ get labels() {
75
+ return {
76
+ in: props.labels?.in ?? t().in
77
+ };
78
+ }
79
+ }), _el$14, _co$3);
80
+ _$insert(_el$, _$createComponent(FlowAmount, {
81
+ get value() {
82
+ return -amount(props.out);
83
+ },
84
+ get currency() {
85
+ return props.currency;
86
+ },
87
+ get locale() {
88
+ return lang();
89
+ },
90
+ get decimals() {
91
+ return decimals();
92
+ },
93
+ get labels() {
94
+ return {
95
+ out: props.labels?.out ?? t().out
96
+ };
97
+ }
98
+ }), _el$16, _co$4);
99
+ _$insert(_el$0, () => props.labels?.end ?? t().end, _el$12, _co$2);
100
+ _$insert(_el$10, () => balance(end()));
101
+ _$effect(() => _$className(_el$, props.class ? `k2b-balance ${props.class}` : "k2b-balance"));
102
+ return _el$;
103
+ })();
104
+ }
105
+ export default BalanceSummary;
106
+ //# sourceMappingURL=BalanceSummary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["content/BalanceSummary.tsx"],"sourcesContent":["import type { JSX } from \"solid-js\";\nimport { useLocale } from \"../intl/locale\";\nimport { useBalanceSummaryMessages } from \"./balance-summary-messages\";\nimport { FlowAmount } from \"./FlowAmount\";\n\nexport type BalanceSummaryProps = {\n /** The balance at the start of the period. */\n start: number;\n /** Money that came in during the period, as an amount (the sign is ignored). */\n in: number;\n /** Money that went out during the period, as an amount (the sign is ignored). */\n out: number;\n /** ISO 4217 currency code, e.g. `\"EUR\"`. */\n currency: string;\n /** Explicit locale override; defaults to the inherited render locale. */\n locale?: string;\n /** Fixed fraction digits. Defaults to whole amounts, or cents when whole amounts would not add up. */\n decimals?: number;\n /** Replaces the words \"Start\", \"End\", \"in\" and \"out\". */\n labels?: { start?: string; end?: string; in?: string; out?: string };\n class?: string;\n};\n\n/** A movement as an amount; a broken value stays broken, so it shows \"—\" and never a believable zero. */\nconst amount = (value: number) => (Number.isFinite(value) ? Math.abs(value) : Number.NaN);\n\n/**\n * One line from the start of a period to its end: \"Start 18,800 € + ↙ 29,260 € − ↗ 29,520 € = End 18,540 €\". In and\n * out show their direction with `FlowAmount`; start and end are balances and keep their sign.\n */\nexport function BalanceSummary(props: BalanceSummaryProps): JSX.Element {\n const locale = useLocale();\n const t = useBalanceSummaryMessages(() => props.locale);\n const lang = () => props.locale ?? locale();\n const start = () => props.start;\n const end = () => start() + amount(props.in) - amount(props.out);\n // Whole amounts read best, but the line is an equation: when the rounded parts would not add up, show cents.\n const decimals = () => {\n if (props.decimals !== undefined) return props.decimals;\n const whole = (value: number) => Math.round(value);\n const parts = [start(), amount(props.in), amount(props.out)];\n if (!parts.every(Number.isFinite)) return 0;\n return whole(start()) + whole(amount(props.in)) - whole(amount(props.out)) === whole(end()) ? 0 : 2;\n };\n const balance = (value: number) =>\n !Number.isFinite(value)\n ? \"—\"\n : new Intl.NumberFormat(lang(), {\n style: \"currency\",\n currency: props.currency,\n minimumFractionDigits: decimals(),\n maximumFractionDigits: decimals(),\n }).format(value === 0 ? 0 : value);\n return (\n <p class={props.class ? `k2b-balance ${props.class}` : \"k2b-balance\"}>\n <span class=\"k2b-balance__part\">\n {props.labels?.start ?? t().start} <b>{balance(start())}</b>\n </span>\n <span class=\"k2b-balance__op\" aria-hidden=\"true\">\n +\n </span>\n <FlowAmount\n value={amount(props.in)}\n currency={props.currency}\n locale={lang()}\n decimals={decimals()}\n labels={{ in: props.labels?.in ?? t().in }}\n />\n <span class=\"k2b-balance__op\" aria-hidden=\"true\">\n −\n </span>\n <FlowAmount\n value={-amount(props.out)}\n currency={props.currency}\n locale={lang()}\n decimals={decimals()}\n labels={{ out: props.labels?.out ?? t().out }}\n />\n <span class=\"k2b-balance__op\" aria-hidden=\"true\">\n =\n </span>\n <span class=\"k2b-balance__part\">\n {props.labels?.end ?? t().end} <b>{balance(end())}</b>\n </span>\n </p>\n );\n}\n\nexport default BalanceSummary;\n"],"mappings":"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","ignoreList":[]}