@k2b/ui 0.48.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 (304) 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/actions/CopyButton.js +26 -18
  5. package/dist/browser/actions/CopyButton.js.map +1 -1
  6. package/dist/browser/charts/core/area.js +190 -0
  7. package/dist/browser/charts/core/area.js.map +1 -0
  8. package/dist/browser/charts/core/calendar.js +186 -0
  9. package/dist/browser/charts/core/calendar.js.map +1 -0
  10. package/dist/browser/charts/core/chart-map-data.js +9 -0
  11. package/dist/browser/charts/core/chart-map-data.js.map +1 -0
  12. package/dist/browser/charts/core/index.js +12 -0
  13. package/dist/browser/charts/core/index.js.map +1 -0
  14. package/dist/browser/charts/core/inspection.js +9 -0
  15. package/dist/browser/charts/core/inspection.js.map +1 -0
  16. package/dist/browser/charts/core/registry.js +28 -0
  17. package/dist/browser/charts/core/registry.js.map +1 -0
  18. package/dist/browser/charts/core/render.js +103 -0
  19. package/dist/browser/charts/core/render.js.map +1 -0
  20. package/dist/browser/charts/core/snapshot.js +65 -0
  21. package/dist/browser/charts/core/snapshot.js.map +1 -0
  22. package/dist/browser/charts/core/svg.js +2542 -0
  23. package/dist/browser/charts/core/svg.js.map +1 -0
  24. package/dist/browser/charts/core/termination.test-fixture.js +162 -0
  25. package/dist/browser/charts/core/termination.test-fixture.js.map +1 -0
  26. package/dist/browser/charts/core/text.js +13 -0
  27. package/dist/browser/charts/core/text.js.map +1 -0
  28. package/dist/browser/charts/core/types.js +8 -0
  29. package/dist/browser/charts/core/types.js.map +1 -0
  30. package/dist/browser/charts.js +4 -2
  31. package/dist/browser/charts.js.map +1 -1
  32. package/dist/browser/content/BalanceSummary.js +106 -0
  33. package/dist/browser/content/BalanceSummary.js.map +1 -0
  34. package/dist/browser/content/Chart.js +134 -115
  35. package/dist/browser/content/Chart.js.map +1 -1
  36. package/dist/browser/content/ChartExplorer.js +366 -122
  37. package/dist/browser/content/ChartExplorer.js.map +1 -1
  38. package/dist/browser/content/ChartSnapshotView.js +16 -9
  39. package/dist/browser/content/ChartSnapshotView.js.map +1 -1
  40. package/dist/browser/content/DataTable.js +676 -293
  41. package/dist/browser/content/DataTable.js.map +1 -1
  42. package/dist/browser/content/DataTableTools.js +119 -0
  43. package/dist/browser/content/DataTableTools.js.map +1 -0
  44. package/dist/browser/content/FlowAmount.js +82 -0
  45. package/dist/browser/content/FlowAmount.js.map +1 -0
  46. package/dist/browser/content/balance-summary-messages.js +26 -0
  47. package/dist/browser/content/balance-summary-messages.js.map +1 -0
  48. package/dist/browser/content/chart-bar.js +6 -6
  49. package/dist/browser/content/chart-bar.js.map +1 -1
  50. package/dist/browser/content/chart-calendar.js +43 -0
  51. package/dist/browser/content/chart-calendar.js.map +1 -0
  52. package/dist/browser/content/chart-inspection-core.js +164 -37
  53. package/dist/browser/content/chart-inspection-core.js.map +1 -1
  54. package/dist/browser/content/chart-inspection.js.map +1 -1
  55. package/dist/browser/content/chart-line-gaps.js +2 -2
  56. package/dist/browser/content/chart-line-gaps.js.map +1 -1
  57. package/dist/browser/content/chart-map-viewport.js.map +1 -1
  58. package/dist/browser/content/chart-message-catalog.js +164 -0
  59. package/dist/browser/content/chart-message-catalog.js.map +1 -0
  60. package/dist/browser/content/chart-messages.js +2 -138
  61. package/dist/browser/content/chart-messages.js.map +1 -1
  62. package/dist/browser/content/chart-snapshot.js +1 -62
  63. package/dist/browser/content/chart-snapshot.js.map +1 -1
  64. package/dist/browser/content/chart-state-timeline.js +1 -1
  65. package/dist/browser/content/chart-state-timeline.js.map +1 -1
  66. package/dist/browser/content/chart-svg.js +2 -1
  67. package/dist/browser/content/chart-svg.js.map +1 -1
  68. package/dist/browser/content/chart-time-axis.js +139 -0
  69. package/dist/browser/content/chart-time-axis.js.map +1 -0
  70. package/dist/browser/content/data-table-columns.js +160 -0
  71. package/dist/browser/content/data-table-columns.js.map +1 -0
  72. package/dist/browser/content/data-table-messages.js +38 -2
  73. package/dist/browser/content/data-table-messages.js.map +1 -1
  74. package/dist/browser/content/flow-amount-messages.js +26 -0
  75. package/dist/browser/content/flow-amount-messages.js.map +1 -0
  76. package/dist/browser/content/index.js +4 -0
  77. package/dist/browser/content/index.js.map +1 -1
  78. package/dist/browser/feedback/prompt-confirm.js +7 -4
  79. package/dist/browser/feedback/prompt-confirm.js.map +1 -1
  80. package/dist/browser/feedback/prompts.js +3 -3
  81. package/dist/browser/feedback/prompts.js.map +1 -1
  82. package/dist/browser/inputs/DatePicker.js +5 -4
  83. package/dist/browser/inputs/DatePicker.js.map +1 -1
  84. package/dist/browser/inputs/NumberInput.js +17 -5
  85. package/dist/browser/inputs/NumberInput.js.map +1 -1
  86. package/dist/browser/inputs/SelectChip.js +50 -17
  87. package/dist/browser/inputs/SelectChip.js.map +1 -1
  88. package/dist/browser/inputs/date-picker.js +13 -0
  89. package/dist/browser/inputs/date-picker.js.map +1 -1
  90. package/dist/browser/intl/Format.js +31 -8
  91. package/dist/browser/intl/Format.js.map +1 -1
  92. package/dist/browser/layout/AppWorkspace.js +580 -522
  93. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  94. package/dist/browser/layout/MobileShell.js +26 -0
  95. package/dist/browser/layout/MobileShell.js.map +1 -1
  96. package/dist/browser/layout/index.js +1 -0
  97. package/dist/browser/layout/index.js.map +1 -1
  98. package/dist/browser/layout/sheet-handle.js +155 -0
  99. package/dist/browser/layout/sheet-handle.js.map +1 -0
  100. package/dist/browser/surfaces/BudgetList.js +281 -0
  101. package/dist/browser/surfaces/BudgetList.js.map +1 -0
  102. package/dist/browser/surfaces/NoticeCard.js +48 -29
  103. package/dist/browser/surfaces/NoticeCard.js.map +1 -1
  104. package/dist/browser/surfaces/ProgressBar.js +134 -21
  105. package/dist/browser/surfaces/ProgressBar.js.map +1 -1
  106. package/dist/browser/surfaces/StatCell.js +320 -144
  107. package/dist/browser/surfaces/StatCell.js.map +1 -1
  108. package/dist/browser/surfaces/StatGrid.js +75 -57
  109. package/dist/browser/surfaces/StatGrid.js.map +1 -1
  110. package/dist/browser/surfaces/budget-messages.js +64 -0
  111. package/dist/browser/surfaces/budget-messages.js.map +1 -0
  112. package/dist/browser/surfaces/delta-badge.js +65 -0
  113. package/dist/browser/surfaces/delta-badge.js.map +1 -0
  114. package/dist/browser/surfaces/index.js +2 -1
  115. package/dist/browser/surfaces/index.js.map +1 -1
  116. package/dist/browser/surfaces/person-color.js +2 -2
  117. package/dist/browser/surfaces/person-color.js.map +1 -1
  118. package/dist/browser/surfaces/stat-cell-messages.js +41 -0
  119. package/dist/browser/surfaces/stat-cell-messages.js.map +1 -0
  120. package/dist/browser/widgets/Dashboard.js +137 -0
  121. package/dist/browser/widgets/Dashboard.js.map +1 -0
  122. package/dist/browser/widgets/index.js +1 -0
  123. package/dist/browser/widgets/index.js.map +1 -1
  124. package/dist/ssr/actions/ContextMenu.js +3 -0
  125. package/dist/ssr/actions/ContextMenu.js.map +1 -1
  126. package/dist/ssr/actions/CopyButton.js +13 -8
  127. package/dist/ssr/actions/CopyButton.js.map +1 -1
  128. package/dist/ssr/charts/core/area.js +190 -0
  129. package/dist/ssr/charts/core/area.js.map +1 -0
  130. package/dist/ssr/charts/core/calendar.js +186 -0
  131. package/dist/ssr/charts/core/calendar.js.map +1 -0
  132. package/dist/ssr/charts/core/chart-map-data.js +9 -0
  133. package/dist/ssr/charts/core/chart-map-data.js.map +1 -0
  134. package/dist/ssr/charts/core/index.js +12 -0
  135. package/dist/ssr/charts/core/index.js.map +1 -0
  136. package/dist/ssr/charts/core/inspection.js +9 -0
  137. package/dist/ssr/charts/core/inspection.js.map +1 -0
  138. package/dist/ssr/charts/core/registry.js +28 -0
  139. package/dist/ssr/charts/core/registry.js.map +1 -0
  140. package/dist/ssr/charts/core/render.js +103 -0
  141. package/dist/ssr/charts/core/render.js.map +1 -0
  142. package/dist/ssr/charts/core/snapshot.js +65 -0
  143. package/dist/ssr/charts/core/snapshot.js.map +1 -0
  144. package/dist/ssr/charts/core/svg.js +2542 -0
  145. package/dist/ssr/charts/core/svg.js.map +1 -0
  146. package/dist/ssr/charts/core/termination.test-fixture.js +162 -0
  147. package/dist/ssr/charts/core/termination.test-fixture.js.map +1 -0
  148. package/dist/ssr/charts/core/text.js +13 -0
  149. package/dist/ssr/charts/core/text.js.map +1 -0
  150. package/dist/ssr/charts/core/types.js +8 -0
  151. package/dist/ssr/charts/core/types.js.map +1 -0
  152. package/dist/ssr/charts.js +4 -2
  153. package/dist/ssr/charts.js.map +1 -1
  154. package/dist/ssr/content/BalanceSummary.js +75 -0
  155. package/dist/ssr/content/BalanceSummary.js.map +1 -0
  156. package/dist/ssr/content/Chart.js +90 -95
  157. package/dist/ssr/content/Chart.js.map +1 -1
  158. package/dist/ssr/content/ChartExplorer.js +190 -46
  159. package/dist/ssr/content/ChartExplorer.js.map +1 -1
  160. package/dist/ssr/content/ChartSnapshotView.js +5 -1
  161. package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
  162. package/dist/ssr/content/DataTable.js +287 -78
  163. package/dist/ssr/content/DataTable.js.map +1 -1
  164. package/dist/ssr/content/DataTableTools.js +106 -0
  165. package/dist/ssr/content/DataTableTools.js.map +1 -0
  166. package/dist/ssr/content/FlowAmount.js +58 -0
  167. package/dist/ssr/content/FlowAmount.js.map +1 -0
  168. package/dist/ssr/content/balance-summary-messages.js +26 -0
  169. package/dist/ssr/content/balance-summary-messages.js.map +1 -0
  170. package/dist/ssr/content/chart-bar.js +6 -6
  171. package/dist/ssr/content/chart-bar.js.map +1 -1
  172. package/dist/ssr/content/chart-calendar.js +43 -0
  173. package/dist/ssr/content/chart-calendar.js.map +1 -0
  174. package/dist/ssr/content/chart-inspection-core.js +164 -37
  175. package/dist/ssr/content/chart-inspection-core.js.map +1 -1
  176. package/dist/ssr/content/chart-inspection.js.map +1 -1
  177. package/dist/ssr/content/chart-line-gaps.js +2 -2
  178. package/dist/ssr/content/chart-line-gaps.js.map +1 -1
  179. package/dist/ssr/content/chart-map-viewport.js.map +1 -1
  180. package/dist/ssr/content/chart-message-catalog.js +164 -0
  181. package/dist/ssr/content/chart-message-catalog.js.map +1 -0
  182. package/dist/ssr/content/chart-messages.js +2 -138
  183. package/dist/ssr/content/chart-messages.js.map +1 -1
  184. package/dist/ssr/content/chart-snapshot.js +1 -62
  185. package/dist/ssr/content/chart-snapshot.js.map +1 -1
  186. package/dist/ssr/content/chart-state-timeline.js +1 -1
  187. package/dist/ssr/content/chart-state-timeline.js.map +1 -1
  188. package/dist/ssr/content/chart-svg.js +2 -1
  189. package/dist/ssr/content/chart-svg.js.map +1 -1
  190. package/dist/ssr/content/chart-time-axis.js +139 -0
  191. package/dist/ssr/content/chart-time-axis.js.map +1 -0
  192. package/dist/ssr/content/data-table-columns.js +160 -0
  193. package/dist/ssr/content/data-table-columns.js.map +1 -0
  194. package/dist/ssr/content/data-table-messages.js +38 -2
  195. package/dist/ssr/content/data-table-messages.js.map +1 -1
  196. package/dist/ssr/content/flow-amount-messages.js +26 -0
  197. package/dist/ssr/content/flow-amount-messages.js.map +1 -0
  198. package/dist/ssr/content/index.js +4 -0
  199. package/dist/ssr/content/index.js.map +1 -1
  200. package/dist/ssr/feedback/prompt-confirm.js +7 -4
  201. package/dist/ssr/feedback/prompt-confirm.js.map +1 -1
  202. package/dist/ssr/feedback/prompts.js +3 -3
  203. package/dist/ssr/feedback/prompts.js.map +1 -1
  204. package/dist/ssr/inputs/DatePicker.js +5 -4
  205. package/dist/ssr/inputs/DatePicker.js.map +1 -1
  206. package/dist/ssr/inputs/NumberInput.js +17 -5
  207. package/dist/ssr/inputs/NumberInput.js.map +1 -1
  208. package/dist/ssr/inputs/SelectChip.js +26 -9
  209. package/dist/ssr/inputs/SelectChip.js.map +1 -1
  210. package/dist/ssr/inputs/date-picker.js +13 -0
  211. package/dist/ssr/inputs/date-picker.js.map +1 -1
  212. package/dist/ssr/intl/Format.js +22 -2
  213. package/dist/ssr/intl/Format.js.map +1 -1
  214. package/dist/ssr/layout/AppWorkspace.js +158 -114
  215. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  216. package/dist/ssr/layout/MobileShell.js +26 -0
  217. package/dist/ssr/layout/MobileShell.js.map +1 -1
  218. package/dist/ssr/layout/index.js +1 -0
  219. package/dist/ssr/layout/index.js.map +1 -1
  220. package/dist/ssr/layout/sheet-handle.js +155 -0
  221. package/dist/ssr/layout/sheet-handle.js.map +1 -0
  222. package/dist/ssr/surfaces/BudgetList.js +170 -0
  223. package/dist/ssr/surfaces/BudgetList.js.map +1 -0
  224. package/dist/ssr/surfaces/NoticeCard.js +25 -10
  225. package/dist/ssr/surfaces/NoticeCard.js.map +1 -1
  226. package/dist/ssr/surfaces/ProgressBar.js +96 -5
  227. package/dist/ssr/surfaces/ProgressBar.js.map +1 -1
  228. package/dist/ssr/surfaces/StatCell.js +157 -51
  229. package/dist/ssr/surfaces/StatCell.js.map +1 -1
  230. package/dist/ssr/surfaces/StatGrid.js +24 -35
  231. package/dist/ssr/surfaces/StatGrid.js.map +1 -1
  232. package/dist/ssr/surfaces/budget-messages.js +64 -0
  233. package/dist/ssr/surfaces/budget-messages.js.map +1 -0
  234. package/dist/ssr/surfaces/delta-badge.js +41 -0
  235. package/dist/ssr/surfaces/delta-badge.js.map +1 -0
  236. package/dist/ssr/surfaces/index.js +2 -1
  237. package/dist/ssr/surfaces/index.js.map +1 -1
  238. package/dist/ssr/surfaces/person-color.js +2 -2
  239. package/dist/ssr/surfaces/person-color.js.map +1 -1
  240. package/dist/ssr/surfaces/stat-cell-messages.js +41 -0
  241. package/dist/ssr/surfaces/stat-cell-messages.js.map +1 -0
  242. package/dist/ssr/widgets/Dashboard.js +84 -0
  243. package/dist/ssr/widgets/Dashboard.js.map +1 -0
  244. package/dist/ssr/widgets/index.js +1 -0
  245. package/dist/ssr/widgets/index.js.map +1 -1
  246. package/dist/styles.css +1 -1
  247. package/dist/types/charts/core/area.d.ts +62 -0
  248. package/dist/types/charts/core/calendar.d.ts +57 -0
  249. package/dist/types/charts/core/chart-map-data.d.ts +3 -0
  250. package/dist/types/charts/core/index.d.ts +11 -0
  251. package/dist/types/charts/core/inspection.d.ts +16 -0
  252. package/dist/types/charts/core/registry.d.ts +27 -0
  253. package/dist/types/charts/core/render.d.ts +40 -0
  254. package/dist/types/charts/core/snapshot.d.ts +27 -0
  255. package/dist/types/charts/core/svg.d.ts +714 -0
  256. package/dist/types/charts/core/termination.test-fixture.d.ts +1 -0
  257. package/dist/types/charts/core/text.d.ts +5 -0
  258. package/dist/types/charts/core/types.d.ts +31 -0
  259. package/dist/types/charts.d.ts +4 -2
  260. package/dist/types/content/BalanceSummary.d.ts +29 -0
  261. package/dist/types/content/Chart.d.ts +26 -36
  262. package/dist/types/content/ChartExplorer.d.ts +43 -2
  263. package/dist/types/content/ChartSnapshotView.d.ts +1 -0
  264. package/dist/types/content/DataTable.d.ts +28 -0
  265. package/dist/types/content/DataTableTools.d.ts +44 -0
  266. package/dist/types/content/FlowAmount.d.ts +28 -0
  267. package/dist/types/content/balance-summary-messages.d.ts +11 -0
  268. package/dist/types/content/chart-bar.d.ts +1 -1
  269. package/dist/types/content/chart-calendar.d.ts +4 -0
  270. package/dist/types/content/chart-inspection-core.d.ts +21 -16
  271. package/dist/types/content/chart-inspection.d.ts +5 -1
  272. package/dist/types/content/chart-map-viewport.d.ts +1 -1
  273. package/dist/types/content/chart-message-catalog.d.ts +84 -0
  274. package/dist/types/content/chart-messages.d.ts +2 -33
  275. package/dist/types/content/chart-snapshot.d.ts +1 -26
  276. package/dist/types/content/chart-svg.d.ts +1 -1
  277. package/dist/types/content/chart-time-axis.d.ts +26 -0
  278. package/dist/types/content/data-table-columns.d.ts +72 -0
  279. package/dist/types/content/data-table-messages.d.ts +18 -0
  280. package/dist/types/content/flow-amount-messages.d.ts +11 -0
  281. package/dist/types/content/index.d.ts +10 -2
  282. package/dist/types/feedback/prompt-confirm.d.ts +3 -1
  283. package/dist/types/feedback/prompts.d.ts +2 -2
  284. package/dist/types/inputs/NumberInput.d.ts +1 -1
  285. package/dist/types/inputs/SelectChip.d.ts +2 -0
  286. package/dist/types/inputs/date-picker.d.ts +6 -0
  287. package/dist/types/intl/Format.d.ts +5 -0
  288. package/dist/types/layout/AppWorkspace.d.ts +21 -1
  289. package/dist/types/layout/MobileShell.d.ts +5 -0
  290. package/dist/types/layout/index.d.ts +2 -1
  291. package/dist/types/layout/sheet-handle.d.ts +21 -0
  292. package/dist/types/surfaces/BudgetList.d.ts +42 -0
  293. package/dist/types/surfaces/NoticeCard.d.ts +5 -2
  294. package/dist/types/surfaces/ProgressBar.d.ts +38 -2
  295. package/dist/types/surfaces/StatCell.d.ts +35 -2
  296. package/dist/types/surfaces/StatGrid.d.ts +3 -1
  297. package/dist/types/surfaces/budget-messages.d.ts +30 -0
  298. package/dist/types/surfaces/delta-badge.d.ts +10 -0
  299. package/dist/types/surfaces/index.d.ts +4 -3
  300. package/dist/types/surfaces/person-color.d.ts +2 -2
  301. package/dist/types/surfaces/stat-cell-messages.d.ts +19 -0
  302. package/dist/types/widgets/Dashboard.d.ts +42 -0
  303. package/dist/types/widgets/index.d.ts +1 -0
  304. package/package.json +7 -1
@@ -5,43 +5,155 @@ import { className as _$className } from "solid-js/web";
5
5
  import { effect as _$effect } from "solid-js/web";
6
6
  import { getNextElement as _$getNextElement } from "solid-js/web";
7
7
  import { getNextMarker as _$getNextMarker } from "solid-js/web";
8
- import { insert as _$insert } from "solid-js/web";
9
8
  import { memo as _$memo } from "solid-js/web";
10
- var _tmpl$ = /*#__PURE__*/_$template(`<div><div class=k2b-progress__track role=progressbar aria-valuemin=0 aria-valuemax=100><div class=k2b-progress__value></div></div><!$><!/>`),
11
- _tmpl$2 = /*#__PURE__*/_$template(`<span class=k2b-progress__percent><!$><!/>%`);
9
+ import { insert as _$insert } from "solid-js/web";
10
+ import { createComponent as _$createComponent } from "solid-js/web";
11
+ var _tmpl$ = /*#__PURE__*/_$template(`<div><div class=k2b-progress__track role=progressbar aria-valuemin=0 aria-valuemax=100></div><!$><!/>`),
12
+ _tmpl$2 = /*#__PURE__*/_$template(`<div class=k2b-progress__value>`),
13
+ _tmpl$3 = /*#__PURE__*/_$template(`<span class=k2b-progress__limit aria-hidden=true>`),
14
+ _tmpl$4 = /*#__PURE__*/_$template(`<div class=k2b-progress__segment>`),
15
+ _tmpl$5 = /*#__PURE__*/_$template(`<span class=k2b-progress__percent>`);
16
+ import { For, Show } from "solid-js";
17
+
18
+ /** One part of a segmented bar, in the unit of `limit`. `"hatched"` marks an expected, not yet booked part. */
19
+
20
+ /**
21
+ * Sum minus limit, without float residue: `0.1 + 0.2` against `0.3` is not over. Amounts within a billionth of the
22
+ * larger of both count as equal.
23
+ */
24
+ export const budgetOverrun = (total, limit) => {
25
+ const over = total - limit;
26
+ return over > Math.max(1, Math.abs(total), Math.abs(limit)) * 1e-9 ? over : 0;
27
+ };
28
+
29
+ /** Sum over limit; an empty budget with spending is infinitely full. */
30
+ export const budgetRatio = (total, limit) => limit > 0 ? total / limit : total > 0 ? Number.POSITIVE_INFINITY : 0;
31
+
32
+ /**
33
+ * The drawn parts of a segmented bar, each as a percent of the track. The track spans the larger of the limit and the
34
+ * sum, so an overrun stays visible: segments fill up to the limit in order, the rest is one "over" part, and `mark`
35
+ * places the limit line (only when the sum goes beyond it). Without `limit` the segments fill the track; a limit of 0,
36
+ * below 0 or not finite is an empty budget, so any spending is over it.
37
+ */
38
+ export const progressBarParts = (segments, limit) => {
39
+ const values = segments.map(segment => ({
40
+ pattern: segment.pattern ?? "solid",
41
+ value: Number.isFinite(segment.value) ? Math.max(0, segment.value) : 0
42
+ }));
43
+ const total = values.reduce((sum, segment) => sum + segment.value, 0);
44
+ const budget = limit === undefined ? total : Number.isFinite(limit) ? Math.max(0, limit) : 0;
45
+ const scale = Math.max(budget, total);
46
+ if (scale <= 0) return {
47
+ parts: [],
48
+ total,
49
+ over: 0,
50
+ mark: null,
51
+ ratio: 0
52
+ };
53
+ const parts = [];
54
+ let filled = 0;
55
+ for (const segment of values) {
56
+ const inside = Math.max(0, Math.min(segment.value, budget - filled));
57
+ if (inside > 0) parts.push({
58
+ pattern: segment.pattern,
59
+ width: inside / scale * 100
60
+ });
61
+ filled += segment.value;
62
+ }
63
+ const over = budgetOverrun(total, budget);
64
+ if (over > 0) parts.push({
65
+ pattern: "over",
66
+ width: over / scale * 100
67
+ });
68
+ return {
69
+ parts,
70
+ total,
71
+ over,
72
+ mark: over > 0 ? budget / scale * 100 : null,
73
+ ratio: budgetRatio(total, budget)
74
+ };
75
+ };
12
76
  const clamp = value => Number.isFinite(value) ? Math.max(0, Math.min(100, Math.round(value))) : 0;
13
77
  export function ProgressBar(props) {
14
- const percent = () => clamp(props.value);
78
+ const segmented = () => props.segments ? progressBarParts(props.segments, props.limit) : null;
79
+ // With segments the share always comes from them; `value` only drives the plain bar.
80
+ const percent = () => {
81
+ const bar = segmented();
82
+ if (!bar) return clamp(props.value ?? 0);
83
+ return Number.isFinite(bar.ratio) ? Math.max(0, Math.round(bar.ratio * 100)) : null;
84
+ };
85
+ const shown = () => percent() ?? 100;
15
86
  return (() => {
16
87
  var _el$ = _$getNextElement(_tmpl$),
17
88
  _el$2 = _el$.firstChild,
18
- _el$3 = _el$2.firstChild,
19
- _el$4 = _el$2.nextSibling,
20
- [_el$5, _co$] = _$getNextMarker(_el$4.nextSibling);
89
+ _el$3 = _el$2.nextSibling,
90
+ [_el$4, _co$] = _$getNextMarker(_el$3.nextSibling);
91
+ _$insert(_el$2, _$createComponent(Show, {
92
+ get when() {
93
+ return segmented();
94
+ },
95
+ get fallback() {
96
+ return (() => {
97
+ var _el$5 = _$getNextElement(_tmpl$2);
98
+ _$effect(_$p => _$style(_el$5, `width: ${shown()}%`, _$p));
99
+ return _el$5;
100
+ })();
101
+ },
102
+ children: bar => [_$createComponent(For, {
103
+ get each() {
104
+ return bar().parts;
105
+ },
106
+ children: part => (() => {
107
+ var _el$7 = _$getNextElement(_tmpl$4);
108
+ _$effect(_p$ => {
109
+ var _v$8 = part.pattern,
110
+ _v$9 = `width: ${part.width.toFixed(3)}%`;
111
+ _v$8 !== _p$.e && _$setAttribute(_el$7, "data-pattern", _p$.e = _v$8);
112
+ _p$.t = _$style(_el$7, _v$9, _p$.t);
113
+ return _p$;
114
+ }, {
115
+ e: undefined,
116
+ t: undefined
117
+ });
118
+ return _el$7;
119
+ })()
120
+ }), _$createComponent(Show, {
121
+ get when() {
122
+ return bar().mark !== null;
123
+ },
124
+ get children() {
125
+ var _el$6 = _$getNextElement(_tmpl$3);
126
+ _$effect(_$p => _$style(_el$6, `left: ${(bar().mark ?? 0).toFixed(3)}%`, _$p));
127
+ return _el$6;
128
+ }
129
+ })]
130
+ }));
21
131
  _$insert(_el$, (() => {
22
132
  var _c$ = _$memo(() => !!props.showValue);
23
133
  return () => _c$() ? (() => {
24
- var _el$6 = _$getNextElement(_tmpl$2),
25
- _el$8 = _el$6.firstChild,
26
- [_el$9, _co$2] = _$getNextMarker(_el$8.nextSibling),
27
- _el$7 = _el$9.nextSibling;
28
- _$insert(_el$6, percent, _el$9, _co$2);
29
- return _el$6;
134
+ var _el$8 = _$getNextElement(_tmpl$5);
135
+ _$insert(_el$8, (() => {
136
+ var _c$2 = _$memo(() => percent() === null);
137
+ return () => _c$2() ? "∞" : `${percent()}%`;
138
+ })());
139
+ return _el$8;
30
140
  })() : null;
31
- })(), _el$5, _co$);
141
+ })(), _el$4, _co$);
32
142
  _$effect(_p$ => {
33
143
  var _v$ = `k2b-progress ${props.class ?? ""}`,
34
144
  _v$2 = props.size ?? "md",
35
145
  _v$3 = props.tone ?? "info",
36
- _v$4 = props.label,
37
- _v$5 = percent(),
38
- _v$6 = `width: ${percent()}%`;
146
+ _v$4 = segmented() ? "" : undefined,
147
+ _v$5 = props.label,
148
+ _v$6 = Math.min(100, shown()),
149
+ _v$7 = props.valueText ?? (segmented() ? percent() === null ? "∞" : `${percent()}%` : undefined);
39
150
  _v$ !== _p$.e && _$className(_el$, _p$.e = _v$);
40
151
  _v$2 !== _p$.t && _$setAttribute(_el$, "data-size", _p$.t = _v$2);
41
152
  _v$3 !== _p$.a && _$setAttribute(_el$, "data-tone", _p$.a = _v$3);
42
- _v$4 !== _p$.o && _$setAttribute(_el$2, "aria-label", _p$.o = _v$4);
43
- _v$5 !== _p$.i && _$setAttribute(_el$2, "aria-valuenow", _p$.i = _v$5);
44
- _p$.n = _$style(_el$3, _v$6, _p$.n);
153
+ _v$4 !== _p$.o && _$setAttribute(_el$, "data-segmented", _p$.o = _v$4);
154
+ _v$5 !== _p$.i && _$setAttribute(_el$2, "aria-label", _p$.i = _v$5);
155
+ _v$6 !== _p$.n && _$setAttribute(_el$2, "aria-valuenow", _p$.n = _v$6);
156
+ _v$7 !== _p$.s && _$setAttribute(_el$2, "aria-valuetext", _p$.s = _v$7);
45
157
  return _p$;
46
158
  }, {
47
159
  e: undefined,
@@ -49,7 +161,8 @@ export function ProgressBar(props) {
49
161
  a: undefined,
50
162
  o: undefined,
51
163
  i: undefined,
52
- n: undefined
164
+ n: undefined,
165
+ s: undefined
53
166
  });
54
167
  return _el$;
55
168
  })();
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["surfaces/ProgressBar.tsx"],"sourcesContent":["import type { JSX } from \"solid-js\";\nimport type { IntentTone } from \"../semantics\";\n\nexport type ProgressBarTone = Extract<IntentTone, \"info\" | \"success\" | \"warning\" | \"danger\">;\n\nexport type ProgressBarProps = {\n value: number;\n size?: \"xs\" | \"sm\" | \"md\";\n tone?: ProgressBarTone;\n showValue?: boolean;\n label: string;\n class?: string;\n};\n\nconst clamp = (value: number) => (Number.isFinite(value) ? Math.max(0, Math.min(100, Math.round(value))) : 0);\n\nexport function ProgressBar(props: ProgressBarProps): JSX.Element {\n const percent = () => clamp(props.value);\n return (\n <div class={`k2b-progress ${props.class ?? \"\"}`} data-size={props.size ?? \"md\"} data-tone={props.tone ?? \"info\"}>\n <div\n class=\"k2b-progress__track\"\n role=\"progressbar\"\n aria-label={props.label}\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n aria-valuenow={percent()}\n >\n <div class=\"k2b-progress__value\" style={`width: ${percent()}%`} />\n </div>\n {props.showValue ? <span class=\"k2b-progress__percent\">{percent()}%</span> : null}\n </div>\n );\n}\n\nexport default ProgressBar;\n"],"mappings":";;;;;;;;;;;AAcA,MAAM,KAAK,GAAI,KAAa,IAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAE;AAE7G,OAAO,SAAS,WAAW,CAAC,KAAuB,EAAe;EAChE,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;EACxC;IAAA;MAAA;MAAA;MAAA;MAAA;IAAA;MAAA,yBAYK,KAAK,CAAC,SAAS;MAAA,aAAf;QAAA;UAAA;UAAA;UAAA;QAAA,gBAAuD,OAAO;QAAA;MAAA,OAAc,IAAI;IAAA;IAAA;MAAA,UAXvE,gBAAgB,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE;QAAA,OAAa,KAAK,CAAC,IAAI,IAAI,IAAI;QAAA,OAAa,KAAK,CAAC,IAAI,IAAI,MAAM;QAAA,OAI/F,KAAK,CAAC,KAAK;QAAA,OAGR,OAAO,CAAC,CAAC;QAAA,OAEgB,UAAU,OAAO,CAAC,CAAC,GAAG;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;IAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;IAAA;IAAA;EAAA;AAKtE;AAEA,eAAe,WAAW","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["surfaces/ProgressBar.tsx"],"sourcesContent":["import { For, type JSX, Show } from \"solid-js\";\nimport type { IntentTone } from \"../semantics\";\n\nexport type ProgressBarTone = Extract<IntentTone, \"info\" | \"success\" | \"warning\" | \"danger\">;\n\n/** One part of a segmented bar, in the unit of `limit`. `\"hatched\"` marks an expected, not yet booked part. */\nexport type ProgressBarSegment = { value: number; pattern?: \"solid\" | \"hatched\" };\n\nexport type ProgressBarProps = {\n /** Percent from 0 to 100. With `segments`, the share of `limit` the segments fill. */\n value?: number;\n size?: \"xs\" | \"sm\" | \"md\";\n tone?: ProgressBarTone;\n showValue?: boolean;\n label: string;\n /** Parts drawn in order, such as booked and expected spending. Negative and non-finite values count as 0. */\n segments?: readonly ProgressBarSegment[];\n /** The budget the segments fill. What goes beyond it is drawn red, with a mark at the limit. */\n limit?: number;\n /** Spoken value, such as \"1,240 € of 1,500 €\"; defaults to the percent. */\n valueText?: string;\n class?: string;\n};\n\nexport type ProgressBarPart = { pattern: \"solid\" | \"hatched\" | \"over\"; width: number };\n\n/**\n * Sum minus limit, without float residue: `0.1 + 0.2` against `0.3` is not over. Amounts within a billionth of the\n * larger of both count as equal.\n */\nexport const budgetOverrun = (total: number, limit: number): number => {\n const over = total - limit;\n return over > Math.max(1, Math.abs(total), Math.abs(limit)) * 1e-9 ? over : 0;\n};\n\n/** Sum over limit; an empty budget with spending is infinitely full. */\nexport const budgetRatio = (total: number, limit: number): number => (limit > 0 ? total / limit : total > 0 ? Number.POSITIVE_INFINITY : 0);\n\n/**\n * The drawn parts of a segmented bar, each as a percent of the track. The track spans the larger of the limit and the\n * sum, so an overrun stays visible: segments fill up to the limit in order, the rest is one \"over\" part, and `mark`\n * places the limit line (only when the sum goes beyond it). Without `limit` the segments fill the track; a limit of 0,\n * below 0 or not finite is an empty budget, so any spending is over it.\n */\nexport const progressBarParts = (\n segments: readonly ProgressBarSegment[],\n limit?: number,\n): { parts: ProgressBarPart[]; total: number; over: number; mark: number | null; ratio: number } => {\n const values = segments.map((segment) => ({\n pattern: segment.pattern ?? \"solid\",\n value: Number.isFinite(segment.value) ? Math.max(0, segment.value) : 0,\n }));\n const total = values.reduce((sum, segment) => sum + segment.value, 0);\n const budget = limit === undefined ? total : Number.isFinite(limit) ? Math.max(0, limit) : 0;\n const scale = Math.max(budget, total);\n if (scale <= 0) return { parts: [], total, over: 0, mark: null, ratio: 0 };\n const parts: ProgressBarPart[] = [];\n let filled = 0;\n for (const segment of values) {\n const inside = Math.max(0, Math.min(segment.value, budget - filled));\n if (inside > 0) parts.push({ pattern: segment.pattern, width: (inside / scale) * 100 });\n filled += segment.value;\n }\n const over = budgetOverrun(total, budget);\n if (over > 0) parts.push({ pattern: \"over\", width: (over / scale) * 100 });\n return { parts, total, over, mark: over > 0 ? (budget / scale) * 100 : null, ratio: budgetRatio(total, budget) };\n};\n\nconst clamp = (value: number) => (Number.isFinite(value) ? Math.max(0, Math.min(100, Math.round(value))) : 0);\n\nexport function ProgressBar(props: ProgressBarProps): JSX.Element {\n const segmented = () => (props.segments ? progressBarParts(props.segments, props.limit) : null);\n // With segments the share always comes from them; `value` only drives the plain bar.\n const percent = () => {\n const bar = segmented();\n if (!bar) return clamp(props.value ?? 0);\n return Number.isFinite(bar.ratio) ? Math.max(0, Math.round(bar.ratio * 100)) : null;\n };\n const shown = () => percent() ?? 100;\n return (\n <div\n class={`k2b-progress ${props.class ?? \"\"}`}\n data-size={props.size ?? \"md\"}\n data-tone={props.tone ?? \"info\"}\n data-segmented={segmented() ? \"\" : undefined}\n >\n <div\n class=\"k2b-progress__track\"\n role=\"progressbar\"\n aria-label={props.label}\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n aria-valuenow={Math.min(100, shown())}\n aria-valuetext={props.valueText ?? (segmented() ? (percent() === null ? \"∞\" : `${percent()}%`) : undefined)}\n >\n <Show when={segmented()} fallback={<div class=\"k2b-progress__value\" style={`width: ${shown()}%`} />}>\n {(bar) => (\n <>\n <For each={bar().parts}>\n {(part) => <div class=\"k2b-progress__segment\" data-pattern={part.pattern} style={`width: ${part.width.toFixed(3)}%`} />}\n </For>\n <Show when={bar().mark !== null}>\n <span class=\"k2b-progress__limit\" aria-hidden=\"true\" style={`left: ${(bar().mark ?? 0).toFixed(3)}%`} />\n </Show>\n </>\n )}\n </Show>\n </div>\n {props.showValue ? <span class=\"k2b-progress__percent\">{percent() === null ? \"∞\" : `${percent()}%`}</span> : null}\n </div>\n );\n}\n\nexport default ProgressBar;\n"],"mappings":"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","ignoreList":[]}