@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,281 @@
1
+ import { template as _$template } from "solid-js/web";
2
+ import { setAttribute as _$setAttribute } from "solid-js/web";
3
+ import { memo as _$memo } from "solid-js/web";
4
+ import { className as _$className } from "solid-js/web";
5
+ import { effect as _$effect } from "solid-js/web";
6
+ import { getNextMarker as _$getNextMarker } from "solid-js/web";
7
+ import { getNextElement as _$getNextElement } from "solid-js/web";
8
+ import { insert as _$insert } from "solid-js/web";
9
+ import { createComponent as _$createComponent } from "solid-js/web";
10
+ var _tmpl$ = /*#__PURE__*/_$template(`<ul class=k2b-budget__list>`),
11
+ _tmpl$2 = /*#__PURE__*/_$template(`<li><span class=k2b-budget__swatch data-pattern=hatched></span><!$><!/>`),
12
+ _tmpl$3 = /*#__PURE__*/_$template(`<li><span class=k2b-budget__swatch data-pattern=over></span><!$><!/>`),
13
+ _tmpl$4 = /*#__PURE__*/_$template(`<ul class=k2b-budget__legend aria-hidden=true><li><span class=k2b-budget__swatch data-pattern=solid></span><!$><!/></li><!$><!/><!$><!/>`),
14
+ _tmpl$5 = /*#__PURE__*/_$template(`<div>`),
15
+ _tmpl$6 = /*#__PURE__*/_$template(`<p class=k2b-budget__empty>`),
16
+ _tmpl$7 = /*#__PURE__*/_$template(`<span class=k2b-budget__label>`),
17
+ _tmpl$8 = /*#__PURE__*/_$template(`<span class=k2b-budget__amount><!$><!/> <span>`),
18
+ _tmpl$9 = /*#__PURE__*/_$template(`<i aria-hidden=true>`),
19
+ _tmpl$0 = /*#__PURE__*/_$template(`<span class=k2b-budget__hint><!$><!/><!$><!/>`),
20
+ _tmpl$1 = /*#__PURE__*/_$template(`<li class=k2b-budget__row>`),
21
+ _tmpl$10 = /*#__PURE__*/_$template(`<span><!$><!/> <b>`),
22
+ _tmpl$11 = /*#__PURE__*/_$template(`<span class=k2b-budget__tip><b></b><span><!$><!/> <b></b></span><!$><!/><span><!$><!/> <b></b></span><span><!$><!/> <b>`);
23
+ import { For, Show } from "solid-js";
24
+ import { Tooltip } from "../feedback/Tooltip";
25
+ import { useLocale } from "../intl/locale";
26
+ import { useBudgetMessages } from "./budget-messages";
27
+ import { budgetOverrun, budgetRatio, ProgressBar } from "./ProgressBar";
28
+
29
+ /** One budget: `used` is booked, `expected` comes on top; over the budget is `used + expected - limit`. */
30
+
31
+ /** "near" from 80 % of the budget, "over" beyond it. */
32
+
33
+ /** The figures of one budget row; the share counts booked and expected together. */
34
+ export const budgetState = item => {
35
+ const used = Number.isFinite(item.used) ? Math.max(0, item.used) : 0;
36
+ const expected = item.expected !== undefined && Number.isFinite(item.expected) ? Math.max(0, item.expected) : 0;
37
+ const limit = Number.isFinite(item.limit) ? Math.max(0, item.limit) : 0;
38
+ const total = used + expected;
39
+ const over = budgetOverrun(total, limit);
40
+ const ratio = budgetRatio(total, limit);
41
+ // The same float tolerance as the overrun: 0.7 + 0.1 of 1 is exactly 80 %.
42
+ const level = over > 0 ? "over" : ratio >= 0.8 - 1e-9 ? "near" : "ok";
43
+ return {
44
+ used,
45
+ expected,
46
+ limit,
47
+ total,
48
+ over,
49
+ free: over > 0 ? 0 : Math.max(0, limit - total),
50
+ ratio,
51
+ level
52
+ };
53
+ };
54
+
55
+ /**
56
+ * Budgets as rows: label and "spent of budget", a bar with booked (solid), expected (hatched) and over the budget
57
+ * (red, with a mark at the limit), and a hint that turns amber from 80 % and red beyond the budget.
58
+ */
59
+ export function BudgetList(props) {
60
+ const locale = useLocale();
61
+ const t = useBudgetMessages(() => props.locale);
62
+ const money = value => new Intl.NumberFormat(props.locale ?? locale(), {
63
+ style: "currency",
64
+ currency: props.currency,
65
+ minimumFractionDigits: props.decimals ?? 0,
66
+ maximumFractionDigits: props.decimals ?? 0
67
+ }).format(value);
68
+ const states = () => props.items.map(item => ({
69
+ item,
70
+ state: budgetState(item)
71
+ }));
72
+ const anyExpected = () => states().some(({
73
+ state
74
+ }) => state.expected > 0);
75
+ const anyOver = () => states().some(({
76
+ state
77
+ }) => state.over > 0);
78
+ return (() => {
79
+ var _el$ = _$getNextElement(_tmpl$5);
80
+ _$insert(_el$, _$createComponent(Show, {
81
+ get when() {
82
+ return props.items.length;
83
+ },
84
+ get fallback() {
85
+ return (() => {
86
+ var _el$18 = _$getNextElement(_tmpl$6);
87
+ _$insert(_el$18, () => props.empty);
88
+ return _el$18;
89
+ })();
90
+ },
91
+ get children() {
92
+ return [(() => {
93
+ var _el$2 = _$getNextElement(_tmpl$);
94
+ _$insert(_el$2, _$createComponent(For, {
95
+ get each() {
96
+ return states();
97
+ },
98
+ children: ({
99
+ item,
100
+ state
101
+ }) => (() => {
102
+ var _el$19 = _$getNextElement(_tmpl$1);
103
+ _$insert(_el$19, _$createComponent(Tooltip.Anchor, {
104
+ "class": "k2b-budget__anchor",
105
+ tabIndex: 0,
106
+ get content() {
107
+ return (() => {
108
+ var _el$32 = _$getNextElement(_tmpl$11),
109
+ _el$33 = _el$32.firstChild,
110
+ _el$34 = _el$33.nextSibling,
111
+ _el$37 = _el$34.firstChild,
112
+ [_el$38, _co$9] = _$getNextMarker(_el$37.nextSibling),
113
+ _el$35 = _el$38.nextSibling,
114
+ _el$36 = _el$35.nextSibling,
115
+ _el$54 = _el$34.nextSibling,
116
+ [_el$55, _co$11] = _$getNextMarker(_el$54.nextSibling),
117
+ _el$44 = _el$55.nextSibling,
118
+ _el$47 = _el$44.firstChild,
119
+ [_el$48, _co$1] = _$getNextMarker(_el$47.nextSibling),
120
+ _el$45 = _el$48.nextSibling,
121
+ _el$46 = _el$45.nextSibling,
122
+ _el$49 = _el$44.nextSibling,
123
+ _el$52 = _el$49.firstChild,
124
+ [_el$53, _co$10] = _$getNextMarker(_el$52.nextSibling),
125
+ _el$50 = _el$53.nextSibling,
126
+ _el$51 = _el$50.nextSibling;
127
+ _$insert(_el$33, () => item.label);
128
+ _$insert(_el$34, () => t().used, _el$38, _co$9);
129
+ _$insert(_el$36, () => money(state.used));
130
+ _$insert(_el$32, _$createComponent(Show, {
131
+ get when() {
132
+ return state.expected > 0;
133
+ },
134
+ get children() {
135
+ var _el$39 = _$getNextElement(_tmpl$10),
136
+ _el$42 = _el$39.firstChild,
137
+ [_el$43, _co$0] = _$getNextMarker(_el$42.nextSibling),
138
+ _el$40 = _el$43.nextSibling,
139
+ _el$41 = _el$40.nextSibling;
140
+ _$insert(_el$39, () => t().expected, _el$43, _co$0);
141
+ _$insert(_el$41, () => money(state.expected));
142
+ return _el$39;
143
+ }
144
+ }), _el$55, _co$11);
145
+ _$insert(_el$44, () => t().budget, _el$48, _co$1);
146
+ _$insert(_el$46, () => money(state.limit));
147
+ _$insert(_el$49, (() => {
148
+ var _c$2 = _$memo(() => state.over > 0);
149
+ return () => _c$2() ? t().overBy : t().left;
150
+ })(), _el$53, _co$10);
151
+ _$insert(_el$51, () => money(state.over > 0 ? state.over : state.free));
152
+ return _el$32;
153
+ })();
154
+ },
155
+ get children() {
156
+ return [(() => {
157
+ var _el$20 = _$getNextElement(_tmpl$7);
158
+ _$insert(_el$20, () => item.label);
159
+ return _el$20;
160
+ })(), (() => {
161
+ var _el$21 = _$getNextElement(_tmpl$8),
162
+ _el$24 = _el$21.firstChild,
163
+ [_el$25, _co$6] = _$getNextMarker(_el$24.nextSibling),
164
+ _el$22 = _el$25.nextSibling,
165
+ _el$23 = _el$22.nextSibling;
166
+ _$insert(_el$21, () => money(state.total), _el$25, _co$6);
167
+ _$insert(_el$23, () => t().of({
168
+ limit: money(state.limit)
169
+ }));
170
+ return _el$21;
171
+ })(), _$createComponent(ProgressBar, {
172
+ "class": "k2b-budget__bar",
173
+ size: "sm",
174
+ get label() {
175
+ return item.label;
176
+ },
177
+ get segments() {
178
+ return [{
179
+ value: state.used
180
+ }, {
181
+ value: state.expected,
182
+ pattern: "hatched"
183
+ }];
184
+ },
185
+ get limit() {
186
+ return state.limit;
187
+ },
188
+ get valueText() {
189
+ return t().valueText({
190
+ used: money(state.used),
191
+ expected: state.expected > 0 ? money(state.expected) : undefined,
192
+ limit: money(state.limit)
193
+ });
194
+ }
195
+ }), (() => {
196
+ var _el$26 = _$getNextElement(_tmpl$0),
197
+ _el$28 = _el$26.firstChild,
198
+ [_el$29, _co$7] = _$getNextMarker(_el$28.nextSibling),
199
+ _el$30 = _el$29.nextSibling,
200
+ [_el$31, _co$8] = _$getNextMarker(_el$30.nextSibling);
201
+ _$insert(_el$26, _$createComponent(Show, {
202
+ get when() {
203
+ return state.level !== "ok";
204
+ },
205
+ get children() {
206
+ var _el$27 = _$getNextElement(_tmpl$9);
207
+ _$effect(() => _$className(_el$27, state.level === "over" ? "ti ti-alert-circle" : "ti ti-alert-triangle"));
208
+ return _el$27;
209
+ }
210
+ }), _el$29, _co$7);
211
+ _$insert(_el$26, (() => {
212
+ var _c$ = _$memo(() => state.level === "over");
213
+ return () => _c$() ? t().over({
214
+ amount: money(state.over)
215
+ }) : _$memo(() => state.level === "near")() ? t().near({
216
+ amount: money(state.free)
217
+ }) : t().free({
218
+ amount: money(state.free)
219
+ });
220
+ })(), _el$31, _co$8);
221
+ return _el$26;
222
+ })()];
223
+ }
224
+ }));
225
+ _$effect(() => _$setAttribute(_el$19, "data-level", state.level));
226
+ return _el$19;
227
+ })()
228
+ }));
229
+ return _el$2;
230
+ })(), _$createComponent(Show, {
231
+ get when() {
232
+ return props.legend !== false;
233
+ },
234
+ get children() {
235
+ var _el$3 = _$getNextElement(_tmpl$4),
236
+ _el$4 = _el$3.firstChild,
237
+ _el$5 = _el$4.firstChild,
238
+ _el$6 = _el$5.nextSibling,
239
+ [_el$7, _co$] = _$getNextMarker(_el$6.nextSibling),
240
+ _el$14 = _el$4.nextSibling,
241
+ [_el$15, _co$4] = _$getNextMarker(_el$14.nextSibling),
242
+ _el$16 = _el$15.nextSibling,
243
+ [_el$17, _co$5] = _$getNextMarker(_el$16.nextSibling);
244
+ _$insert(_el$4, () => t().used, _el$7, _co$);
245
+ _$insert(_el$3, _$createComponent(Show, {
246
+ get when() {
247
+ return anyExpected();
248
+ },
249
+ get children() {
250
+ var _el$8 = _$getNextElement(_tmpl$2),
251
+ _el$9 = _el$8.firstChild,
252
+ _el$0 = _el$9.nextSibling,
253
+ [_el$1, _co$2] = _$getNextMarker(_el$0.nextSibling);
254
+ _$insert(_el$8, () => t().expected, _el$1, _co$2);
255
+ return _el$8;
256
+ }
257
+ }), _el$15, _co$4);
258
+ _$insert(_el$3, _$createComponent(Show, {
259
+ get when() {
260
+ return anyOver();
261
+ },
262
+ get children() {
263
+ var _el$10 = _$getNextElement(_tmpl$3),
264
+ _el$11 = _el$10.firstChild,
265
+ _el$12 = _el$11.nextSibling,
266
+ [_el$13, _co$3] = _$getNextMarker(_el$12.nextSibling);
267
+ _$insert(_el$10, () => t().overLegend, _el$13, _co$3);
268
+ return _el$10;
269
+ }
270
+ }), _el$17, _co$5);
271
+ return _el$3;
272
+ }
273
+ })];
274
+ }
275
+ }));
276
+ _$effect(() => _$className(_el$, `k2b-budget ${props.class ?? ""}`));
277
+ return _el$;
278
+ })();
279
+ }
280
+ export default BudgetList;
281
+ //# sourceMappingURL=BudgetList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["surfaces/BudgetList.tsx"],"sourcesContent":["import { For, type JSX, Show } from \"solid-js\";\nimport { Tooltip } from \"../feedback/Tooltip\";\nimport { useLocale } from \"../intl/locale\";\nimport { useBudgetMessages } from \"./budget-messages\";\nimport { budgetOverrun, budgetRatio, ProgressBar } from \"./ProgressBar\";\n\n/** One budget: `used` is booked, `expected` comes on top; over the budget is `used + expected - limit`. */\nexport type BudgetItem = { id?: string; label: string; used: number; expected?: number; limit: number };\n\nexport type BudgetListProps = {\n items: readonly BudgetItem[];\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 0. */\n decimals?: number;\n /** The sentence shown when there is no budget. */\n empty?: string;\n /** Hides the legend under the rows when the host explains the colours elsewhere. */\n legend?: boolean;\n class?: string;\n};\n\n/** \"near\" from 80 % of the budget, \"over\" beyond it. */\nexport type BudgetLevel = \"ok\" | \"near\" | \"over\";\n\n/** The figures of one budget row; the share counts booked and expected together. */\nexport const budgetState = (item: Pick<BudgetItem, \"used\" | \"expected\" | \"limit\">) => {\n const used = Number.isFinite(item.used) ? Math.max(0, item.used) : 0;\n const expected = item.expected !== undefined && Number.isFinite(item.expected) ? Math.max(0, item.expected) : 0;\n const limit = Number.isFinite(item.limit) ? Math.max(0, item.limit) : 0;\n const total = used + expected;\n const over = budgetOverrun(total, limit);\n const ratio = budgetRatio(total, limit);\n // The same float tolerance as the overrun: 0.7 + 0.1 of 1 is exactly 80 %.\n const level: BudgetLevel = over > 0 ? \"over\" : ratio >= 0.8 - 1e-9 ? \"near\" : \"ok\";\n return { used, expected, limit, total, over, free: over > 0 ? 0 : Math.max(0, limit - total), ratio, level };\n};\n\n/**\n * Budgets as rows: label and \"spent of budget\", a bar with booked (solid), expected (hatched) and over the budget\n * (red, with a mark at the limit), and a hint that turns amber from 80 % and red beyond the budget.\n */\nexport function BudgetList(props: BudgetListProps): JSX.Element {\n const locale = useLocale();\n const t = useBudgetMessages(() => props.locale);\n const money = (value: number) =>\n new Intl.NumberFormat(props.locale ?? locale(), {\n style: \"currency\",\n currency: props.currency,\n minimumFractionDigits: props.decimals ?? 0,\n maximumFractionDigits: props.decimals ?? 0,\n }).format(value);\n const states = () => props.items.map((item) => ({ item, state: budgetState(item) }));\n const anyExpected = () => states().some(({ state }) => state.expected > 0);\n const anyOver = () => states().some(({ state }) => state.over > 0);\n return (\n <div class={`k2b-budget ${props.class ?? \"\"}`}>\n <Show when={props.items.length} fallback={<p class=\"k2b-budget__empty\">{props.empty}</p>}>\n <ul class=\"k2b-budget__list\">\n <For each={states()}>\n {({ item, state }) => (\n <li class=\"k2b-budget__row\" data-level={state.level}>\n <Tooltip.Anchor\n class=\"k2b-budget__anchor\"\n tabIndex={0}\n content={\n <span class=\"k2b-budget__tip\">\n <b>{item.label}</b>\n <span>\n {t().used} <b>{money(state.used)}</b>\n </span>\n <Show when={state.expected > 0}>\n <span>\n {t().expected} <b>{money(state.expected)}</b>\n </span>\n </Show>\n <span>\n {t().budget} <b>{money(state.limit)}</b>\n </span>\n <span>\n {state.over > 0 ? t().overBy : t().left} <b>{money(state.over > 0 ? state.over : state.free)}</b>\n </span>\n </span>\n }\n >\n <span class=\"k2b-budget__label\">{item.label}</span>\n <span class=\"k2b-budget__amount\">\n {money(state.total)} <span>{t().of({ limit: money(state.limit) })}</span>\n </span>\n <ProgressBar\n class=\"k2b-budget__bar\"\n size=\"sm\"\n label={item.label}\n segments={[{ value: state.used }, { value: state.expected, pattern: \"hatched\" }]}\n limit={state.limit}\n valueText={t().valueText({\n used: money(state.used),\n expected: state.expected > 0 ? money(state.expected) : undefined,\n limit: money(state.limit),\n })}\n />\n <span class=\"k2b-budget__hint\">\n <Show when={state.level !== \"ok\"}>\n <i class={state.level === \"over\" ? \"ti ti-alert-circle\" : \"ti ti-alert-triangle\"} aria-hidden=\"true\" />\n </Show>\n {state.level === \"over\"\n ? t().over({ amount: money(state.over) })\n : state.level === \"near\"\n ? t().near({ amount: money(state.free) })\n : t().free({ amount: money(state.free) })}\n </span>\n </Tooltip.Anchor>\n </li>\n )}\n </For>\n </ul>\n <Show when={props.legend !== false}>\n <ul class=\"k2b-budget__legend\" aria-hidden=\"true\">\n <li>\n <span class=\"k2b-budget__swatch\" data-pattern=\"solid\" />\n {t().used}\n </li>\n <Show when={anyExpected()}>\n <li>\n <span class=\"k2b-budget__swatch\" data-pattern=\"hatched\" />\n {t().expected}\n </li>\n </Show>\n <Show when={anyOver()}>\n <li>\n <span class=\"k2b-budget__swatch\" data-pattern=\"over\" />\n {t().overLegend}\n </li>\n </Show>\n </ul>\n </Show>\n </Show>\n </div>\n );\n}\n\nexport default BudgetList;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,GAAG,EAAY,IAAI,QAAQ,UAAU;AAC9C,SAAS,OAAO,QAAQ,qBAAqB;AAC7C,SAAS,SAAS,QAAQ,gBAAgB;AAC1C,SAAS,iBAAiB,QAAQ,mBAAmB;AACrD,SAAS,aAAa,EAAE,WAAW,EAAE,WAAW,QAAQ,eAAe;;AAEvE;;AAkBA;;AAGA;AACA,OAAO,MAAM,WAAW,GAAI,IAAqD,IAAK;EACpF,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;EACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;EAC/G,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;EACvE,MAAM,KAAK,GAAG,IAAI,GAAG,QAAQ;EAC7B,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC;EACxC,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC;EACvC;EACA,MAAM,KAAkB,GAAG,IAAI,GAAG,CAAC,GAAG,MAAM,GAAG,KAAK,IAAI,GAAG,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI;EAClF,OAAO;IAAE,IAAI;IAAE,QAAQ;IAAE,KAAK;IAAE,KAAK;IAAE,IAAI;IAAE,IAAI,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IAAE,KAAK;IAAE;EAAM,CAAC;AAC9G,CAAC;;AAED;AACA;AACA;AACA;AACA,OAAO,SAAS,UAAU,CAAC,KAAsB,EAAe;EAC9D,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,MAAM,CAAC,GAAG,iBAAiB,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC;EAC/C,MAAM,KAAK,GAAI,KAAa,IAC1B,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,EAAE;IAC9C,KAAK,EAAE,UAAU;IACjB,QAAQ,EAAE,KAAK,CAAC,QAAQ;IACxB,qBAAqB,EAAE,KAAK,CAAC,QAAQ,IAAI,CAAC;IAC1C,qBAAqB,EAAE,KAAK,CAAC,QAAQ,IAAI;EAC3C,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;EAClB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,CAAE,IAAI,KAAM;IAAE,IAAI;IAAE,KAAK,EAAE,WAAW,CAAC,IAAI;EAAE,CAAC,CAAC,CAAC;EACpF,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAAE;EAAM,CAAC,KAAK,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;EAC1E,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAAE;EAAM,CAAC,KAAK,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;EAClE;IAAA;IAAA,iCAEK,IAAI;MAAA,IAAC,IAAI;QAAA,OAAE,KAAK,CAAC,KAAK,CAAC,MAAM;MAAA;MAAA,IAAE,QAAQ;QAAA;UAAA;UAAA,uBAAgC,KAAK,CAAC,KAAK;UAAA;QAAA;MAAA;MAAA;QAAA;UAAA;UAAA,kCAE9E,GAAG;YAAA,IAAC,IAAI;cAAA,OAAE,MAAM,CAAC,CAAC;YAAA;YAAA,UAChB,CAAC;cAAE,IAAI;cAAE;YAAM,CAAC;cAAA;cAAA,mCAEZ,OAAO,CAAC,MAAM;gBAAA;gBAEb,QAAQ,EAAE,CAAC;gBAAA,IACX,OAAO;kBAAA;oBAAA;sBAAA;sBAAA;sBAAA;sBAAA;sBAAA;sBAAA;sBAAA;sBAAA;sBAAA;sBAAA;sBAAA;sBAAA;sBAAA;sBAAA;sBAAA;sBAAA;sBAAA;sBAAA;oBAAA,uBAEC,IAAI,CAAC,KAAK;oBAAA,uBAEX,CAAC,CAAC,CAAC,CAAC,IAAI;oBAAA,uBAAM,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;oBAAA,mCAEjC,IAAI;sBAAA,IAAC,IAAI;wBAAA,OAAE,KAAK,CAAC,QAAQ,GAAG,CAAC;sBAAA;sBAAA;wBAAA;0BAAA;0BAAA;0BAAA;0BAAA;wBAAA,uBAEzB,CAAC,CAAC,CAAC,CAAC,QAAQ;wBAAA,uBAAM,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;wBAAA;sBAAA;oBAAA;oBAAA,uBAIzC,CAAC,CAAC,CAAC,CAAC,MAAM;oBAAA,uBAAM,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;oBAAA;sBAAA,wBAGlC,KAAK,CAAC,IAAI,GAAG,CAAC;sBAAA,aAAd,SAAiB,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;oBAAA;oBAAA,uBAAM,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;oBAAA;kBAAA;gBAAA;gBAAA;kBAAA;oBAAA;oBAAA,uBAKjE,IAAI,CAAC,KAAK;oBAAA;kBAAA;oBAAA;sBAAA;sBAAA;sBAAA;sBAAA;oBAAA,uBAExC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;oBAAA,uBAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;sBAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK;oBAAE,CAAC,CAAC;oBAAA;kBAAA,wBAElE,WAAW;oBAAA;oBAEV,IAAI;oBAAA,IACJ,KAAK;sBAAA,OAAE,IAAI,CAAC,KAAK;oBAAA;oBAAA,IACjB,QAAQ;sBAAA,OAAE,CAAC;wBAAE,KAAK,EAAE,KAAK,CAAC;sBAAK,CAAC,EAAE;wBAAE,KAAK,EAAE,KAAK,CAAC,QAAQ;wBAAE,OAAO,EAAE;sBAAU,CAAC,CAAC;oBAAA;oBAAA,IAChF,KAAK;sBAAA,OAAE,KAAK,CAAC,KAAK;oBAAA;oBAAA,IAClB,SAAS;sBAAA,OAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;wBACvB,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;wBACvB,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,SAAS;wBAChE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK;sBAC1B,CAAC,CAAC;oBAAA;kBAAA;oBAAA;sBAAA;sBAAA;sBAAA;sBAAA;oBAAA,mCAGD,IAAI;sBAAA,IAAC,IAAI;wBAAA,OAAE,KAAK,CAAC,KAAK,KAAK,IAAI;sBAAA;sBAAA;wBAAA;wBAAA,mCACpB,KAAK,CAAC,KAAK,KAAK,MAAM,GAAG,oBAAoB,GAAG,sBAAsB;wBAAA;sBAAA;oBAAA;oBAAA;sBAAA,uBAEjF,KAAK,CAAC,KAAK,KAAK,MAAM;sBAAA,aAAtB,QACG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;wBAAE,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI;sBAAE,CAAC,CAAC,GACvC,kBAAK,CAAC,KAAK,KAAK,MAAM,MACpB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;wBAAE,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI;sBAAE,CAAC,CAAC,GACvC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;wBAAE,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI;sBAAE,CAAC,CAAC;oBAAA;oBAAA;kBAAA;gBAAA;cAAA;cAAA,oDAhDX,KAAK,CAAC,KAAK;cAAA;YAAA;UAoDpD;UAAA;QAAA,wBAGJ,IAAI;UAAA,IAAC,IAAI;YAAA,OAAE,KAAK,CAAC,MAAM,KAAK,KAAK;UAAA;UAAA;YAAA;cAAA;cAAA;cAAA;cAAA;cAAA;cAAA;cAAA;cAAA;YAAA,sBAI3B,CAAC,CAAC,CAAC,CAAC,IAAI;YAAA,kCAEV,IAAI;cAAA,IAAC,IAAI;gBAAA,OAAE,WAAW,CAAC,CAAC;cAAA;cAAA;gBAAA;kBAAA;kBAAA;kBAAA;gBAAA,sBAGpB,CAAC,CAAC,CAAC,CAAC,QAAQ;gBAAA;cAAA;YAAA;YAAA,kCAGhB,IAAI;cAAA,IAAC,IAAI;gBAAA,OAAE,OAAO,CAAC,CAAC;cAAA;cAAA;gBAAA;kBAAA;kBAAA;kBAAA;gBAAA,uBAGhB,CAAC,CAAC,CAAC,CAAC,UAAU;gBAAA;cAAA;YAAA;YAAA;UAAA;QAAA;MAAA;IAAA;IAAA,iCA3Ef,cAAc,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE;IAAA;EAAA;AAmFjD;AAEA,eAAe,UAAU","ignoreList":[]}
@@ -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":[]}