@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
@@ -1,5 +1,6 @@
1
1
  import { template as _$template } from "solid-js/web";
2
2
  import { setAttribute as _$setAttribute } from "solid-js/web";
3
+ import { className as _$className } from "solid-js/web";
3
4
  import { effect as _$effect } from "solid-js/web";
4
5
  import { memo as _$memo } from "solid-js/web";
5
6
  import { getNextElement as _$getNextElement } from "solid-js/web";
@@ -8,73 +9,90 @@ import { createComponent as _$createComponent } from "solid-js/web";
8
9
  import { insert as _$insert } from "solid-js/web";
9
10
  var _tmpl$ = /*#__PURE__*/_$template(`<header class=k2b-stat-grid__header><span class=k2b-stat-grid__title></span><!$><!/>`),
10
11
  _tmpl$2 = /*#__PURE__*/_$template(`<div class=k2b-stat-grid__body>`),
11
- _tmpl$3 = /*#__PURE__*/_$template(`<a class=k2b-stat-grid__action><span></span><i class="ti ti-arrow-up-right"aria-hidden=true>`);
12
+ _tmpl$3 = /*#__PURE__*/_$template(`<section><!$><!/><!$><!/>`),
13
+ _tmpl$4 = /*#__PURE__*/_$template(`<a class=k2b-stat-grid__action><span></span><i class="ti ti-arrow-up-right"aria-hidden=true>`);
12
14
  import { createContext, Show, useContext } from "solid-js";
13
- import { Paper } from "./Paper";
14
15
  const StatGridSizeContext = createContext("md");
15
16
  const StatGridSurfaceContext = createContext("white");
16
17
  export const useStatGridSize = () => useContext(StatGridSizeContext);
17
18
  export const useStatGridSurface = () => useContext(StatGridSurfaceContext);
18
19
  const columnValue = columns => {
19
20
  if (columns && Number.isInteger(columns) && columns >= 1 && columns <= 6) return columns;
20
- return 6;
21
+ return 4;
21
22
  };
23
+
24
+ /** A row of key figures, each a framed tile of its own; the optional title and action sit above the row. */
22
25
  export function StatGrid(props) {
23
26
  const surface = () => props.surface ?? "white";
24
- return _$createComponent(Paper, {
25
- get ["class"]() {
26
- return `k2b-stat-grid ${props.class ?? ""}`;
27
- },
28
- get ["data-columns"]() {
29
- return columnValue(props.columns);
30
- },
31
- get ["data-surface"]() {
32
- return surface();
33
- },
34
- get children() {
35
- return [_$createComponent(Show, {
36
- get when() {
37
- return props.title;
38
- },
39
- get children() {
40
- var _el$ = _$getNextElement(_tmpl$),
41
- _el$2 = _el$.firstChild,
42
- _el$3 = _el$2.nextSibling,
43
- [_el$4, _co$] = _$getNextMarker(_el$3.nextSibling);
44
- _$insert(_el$2, () => props.title);
45
- _$insert(_el$, _$createComponent(Show, {
46
- get when() {
47
- return props.action;
48
- },
49
- children: action => (() => {
50
- var _el$6 = _$getNextElement(_tmpl$3),
51
- _el$7 = _el$6.firstChild;
52
- _$insert(_el$7, () => action().label);
53
- _$effect(() => _$setAttribute(_el$6, "href", action().href));
54
- return _el$6;
55
- })()
56
- }), _el$4, _co$);
57
- return _el$;
58
- }
59
- }), _$createComponent(StatGridSizeContext.Provider, {
60
- get value() {
61
- return props.size ?? "md";
62
- },
63
- get children() {
64
- return _$createComponent(StatGridSurfaceContext.Provider, {
65
- get value() {
66
- return surface();
67
- },
68
- get children() {
69
- var _el$5 = _$getNextElement(_tmpl$2);
70
- _$insert(_el$5, () => props.children);
71
- return _el$5;
72
- }
73
- });
74
- }
75
- })];
76
- }
77
- });
27
+ return (() => {
28
+ var _el$ = _$getNextElement(_tmpl$3),
29
+ _el$7 = _el$.firstChild,
30
+ [_el$8, _co$2] = _$getNextMarker(_el$7.nextSibling),
31
+ _el$9 = _el$8.nextSibling,
32
+ [_el$0, _co$3] = _$getNextMarker(_el$9.nextSibling);
33
+ _$insert(_el$, _$createComponent(Show, {
34
+ get when() {
35
+ return props.title;
36
+ },
37
+ get children() {
38
+ var _el$2 = _$getNextElement(_tmpl$),
39
+ _el$3 = _el$2.firstChild,
40
+ _el$4 = _el$3.nextSibling,
41
+ [_el$5, _co$] = _$getNextMarker(_el$4.nextSibling);
42
+ _$insert(_el$3, () => props.title);
43
+ _$insert(_el$2, _$createComponent(Show, {
44
+ get when() {
45
+ return props.action;
46
+ },
47
+ children: action => (() => {
48
+ var _el$1 = _$getNextElement(_tmpl$4),
49
+ _el$10 = _el$1.firstChild;
50
+ _$insert(_el$10, () => action().label);
51
+ _$effect(() => _$setAttribute(_el$1, "href", action().href));
52
+ return _el$1;
53
+ })()
54
+ }), _el$5, _co$);
55
+ return _el$2;
56
+ }
57
+ }), _el$8, _co$2);
58
+ _$insert(_el$, _$createComponent(StatGridSizeContext.Provider, {
59
+ get value() {
60
+ return props.size ?? "md";
61
+ },
62
+ get children() {
63
+ return _$createComponent(StatGridSurfaceContext.Provider, {
64
+ get value() {
65
+ return surface();
66
+ },
67
+ get children() {
68
+ var _el$6 = _$getNextElement(_tmpl$2);
69
+ _$insert(_el$6, () => props.children);
70
+ return _el$6;
71
+ }
72
+ });
73
+ }
74
+ }), _el$0, _co$3);
75
+ _$effect(_p$ => {
76
+ var _v$ = `k2b-stat-grid ${props.class ?? ""}`,
77
+ _v$2 = columnValue(props.columns),
78
+ _v$3 = props.size ?? "md",
79
+ _v$4 = surface(),
80
+ _v$5 = props.title;
81
+ _v$ !== _p$.e && _$className(_el$, _p$.e = _v$);
82
+ _v$2 !== _p$.t && _$setAttribute(_el$, "data-columns", _p$.t = _v$2);
83
+ _v$3 !== _p$.a && _$setAttribute(_el$, "data-size", _p$.a = _v$3);
84
+ _v$4 !== _p$.o && _$setAttribute(_el$, "data-surface", _p$.o = _v$4);
85
+ _v$5 !== _p$.i && _$setAttribute(_el$, "aria-label", _p$.i = _v$5);
86
+ return _p$;
87
+ }, {
88
+ e: undefined,
89
+ t: undefined,
90
+ a: undefined,
91
+ o: undefined,
92
+ i: undefined
93
+ });
94
+ return _el$;
95
+ })();
78
96
  }
79
97
  export default StatGrid;
80
98
  //# sourceMappingURL=StatGrid.js.map
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["surfaces/StatGrid.tsx"],"sourcesContent":["import { createContext, type JSX, Show, useContext } from \"solid-js\";\nimport { Paper } from \"./Paper\";\n\nexport type StatGridSize = \"md\" | \"sm\";\nexport type StatGridSurface = \"white\" | \"muted\";\nexport type StatGridColumns = 1 | 2 | 3 | 4 | 5 | 6;\nexport type StatGridAction = { label: string; href: string };\n\nexport type StatGridProps = {\n children: JSX.Element;\n title?: string;\n action?: StatGridAction;\n columns?: StatGridColumns;\n size?: StatGridSize;\n surface?: StatGridSurface;\n class?: string;\n};\n\nconst StatGridSizeContext = createContext<StatGridSize>(\"md\");\nconst StatGridSurfaceContext = createContext<StatGridSurface>(\"white\");\n\nexport const useStatGridSize = (): StatGridSize => useContext(StatGridSizeContext);\nexport const useStatGridSurface = (): StatGridSurface => useContext(StatGridSurfaceContext);\n\nconst columnValue = (columns?: StatGridColumns): StatGridColumns => {\n if (columns && Number.isInteger(columns) && columns >= 1 && columns <= 6) return columns;\n return 6;\n};\n\nexport function StatGrid(props: StatGridProps): JSX.Element {\n const surface = () => props.surface ?? \"white\";\n return (\n <Paper class={`k2b-stat-grid ${props.class ?? \"\"}`} data-columns={columnValue(props.columns)} data-surface={surface()}>\n <Show when={props.title}>\n <header class=\"k2b-stat-grid__header\">\n <span class=\"k2b-stat-grid__title\">{props.title}</span>\n <Show when={props.action}>\n {(action) => (\n <a href={action().href} class=\"k2b-stat-grid__action\">\n <span>{action().label}</span>\n <i class=\"ti ti-arrow-up-right\" aria-hidden=\"true\" />\n </a>\n )}\n </Show>\n </header>\n </Show>\n <StatGridSizeContext.Provider value={props.size ?? \"md\"}>\n <StatGridSurfaceContext.Provider value={surface()}>\n <div class=\"k2b-stat-grid__body\">{props.children}</div>\n </StatGridSurfaceContext.Provider>\n </StatGridSizeContext.Provider>\n </Paper>\n );\n}\n\nexport default StatGrid;\n"],"mappings":";;;;;;;;;;;AAAA,SAAS,aAAa,EAAY,IAAI,EAAE,UAAU,QAAQ,UAAU;AACpE,SAAS,KAAK,QAAQ,SAAS;AAiB/B,MAAM,mBAAmB,GAAG,aAAa,CAAe,IAAI,CAAC;AAC7D,MAAM,sBAAsB,GAAG,aAAa,CAAkB,OAAO,CAAC;AAEtE,OAAO,MAAM,eAAe,GAAG,MAAoB,UAAU,CAAC,mBAAmB,CAAC;AAClF,OAAO,MAAM,kBAAkB,GAAG,MAAuB,UAAU,CAAC,sBAAsB,CAAC;AAE3F,MAAM,WAAW,GAAI,OAAyB,IAAsB;EAClE,IAAI,OAAO,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,EAAE,OAAO,OAAO;EACxF,OAAO,CAAC;AACV,CAAC;AAED,OAAO,SAAS,QAAQ,CAAC,KAAoB,EAAe;EAC1D,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,OAAO,IAAI,OAAO;EAC9C,yBACG,KAAK;IAAA;MAAA,OAAQ,iBAAiB,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE;IAAA;IAAA;MAAA,OAAgB,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC;IAAA;IAAA;MAAA,OAAgB,OAAO,CAAC,CAAC;IAAA;IAAA;MAAA,0BAClH,IAAI;QAAA,IAAC,IAAI;UAAA,OAAE,KAAK,CAAC,KAAK;QAAA;QAAA;UAAA;YAAA;YAAA;YAAA;UAAA,sBAEiB,KAAK,CAAC,KAAK;UAAA,iCAC9C,IAAI;YAAA,IAAC,IAAI;cAAA,OAAE,KAAK,CAAC,MAAM;YAAA;YAAA,UACpB,MAAM;cAAA;gBAAA;cAAA,sBAEG,MAAM,CAAC,CAAC,CAAC,KAAK;cAAA,6CADd,MAAM,CAAC,CAAC,CAAC,IAAI;cAAA;YAAA;UAIvB;UAAA;QAAA;MAAA,sBAIN,mBAAmB,CAAC,QAAQ;QAAA,IAAC,KAAK;UAAA,OAAE,KAAK,CAAC,IAAI,IAAI,IAAI;QAAA;QAAA;UAAA,yBACpD,sBAAsB,CAAC,QAAQ;YAAA,IAAC,KAAK;cAAA,OAAE,OAAO,CAAC,CAAC;YAAA;YAAA;cAAA;cAAA,sBACb,KAAK,CAAC,QAAQ;cAAA;YAAA;UAAA;QAAA;MAAA;IAAA;EAAA;AAK1D;AAEA,eAAe,QAAQ","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["surfaces/StatGrid.tsx"],"sourcesContent":["import { createContext, type JSX, Show, useContext } from \"solid-js\";\n\nexport type StatGridSize = \"lg\" | \"md\" | \"sm\";\nexport type StatGridSurface = \"white\" | \"muted\";\nexport type StatGridColumns = 1 | 2 | 3 | 4 | 5 | 6;\nexport type StatGridAction = { label: string; href: string };\n\nexport type StatGridProps = {\n children: JSX.Element;\n title?: string;\n action?: StatGridAction;\n /** Tiles per row on a wide container. Defaults to 4; at 600 px or less two share a row, and five or six take three up to 900 px. */\n columns?: StatGridColumns;\n size?: StatGridSize;\n surface?: StatGridSurface;\n class?: string;\n};\n\nconst StatGridSizeContext = createContext<StatGridSize>(\"md\");\nconst StatGridSurfaceContext = createContext<StatGridSurface>(\"white\");\n\nexport const useStatGridSize = (): StatGridSize => useContext(StatGridSizeContext);\nexport const useStatGridSurface = (): StatGridSurface => useContext(StatGridSurfaceContext);\n\nconst columnValue = (columns?: StatGridColumns): StatGridColumns => {\n if (columns && Number.isInteger(columns) && columns >= 1 && columns <= 6) return columns;\n return 4;\n};\n\n/** A row of key figures, each a framed tile of its own; the optional title and action sit above the row. */\nexport function StatGrid(props: StatGridProps): JSX.Element {\n const surface = () => props.surface ?? \"white\";\n return (\n <section\n class={`k2b-stat-grid ${props.class ?? \"\"}`}\n data-columns={columnValue(props.columns)}\n data-size={props.size ?? \"md\"}\n data-surface={surface()}\n aria-label={props.title}\n >\n <Show when={props.title}>\n <header class=\"k2b-stat-grid__header\">\n <span class=\"k2b-stat-grid__title\">{props.title}</span>\n <Show when={props.action}>\n {(action) => (\n <a href={action().href} class=\"k2b-stat-grid__action\">\n <span>{action().label}</span>\n <i class=\"ti ti-arrow-up-right\" aria-hidden=\"true\" />\n </a>\n )}\n </Show>\n </header>\n </Show>\n <StatGridSizeContext.Provider value={props.size ?? \"md\"}>\n <StatGridSurfaceContext.Provider value={surface()}>\n <div class=\"k2b-stat-grid__body\">{props.children}</div>\n </StatGridSurfaceContext.Provider>\n </StatGridSizeContext.Provider>\n </section>\n );\n}\n\nexport default StatGrid;\n"],"mappings":";;;;;;;;;;;;;AAAA,SAAS,aAAa,EAAY,IAAI,EAAE,UAAU,QAAQ,UAAU;AAkBpE,MAAM,mBAAmB,GAAG,aAAa,CAAe,IAAI,CAAC;AAC7D,MAAM,sBAAsB,GAAG,aAAa,CAAkB,OAAO,CAAC;AAEtE,OAAO,MAAM,eAAe,GAAG,MAAoB,UAAU,CAAC,mBAAmB,CAAC;AAClF,OAAO,MAAM,kBAAkB,GAAG,MAAuB,UAAU,CAAC,sBAAsB,CAAC;AAE3F,MAAM,WAAW,GAAI,OAAyB,IAAsB;EAClE,IAAI,OAAO,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,EAAE,OAAO,OAAO;EACxF,OAAO,CAAC;AACV,CAAC;;AAED;AACA,OAAO,SAAS,QAAQ,CAAC,KAAoB,EAAe;EAC1D,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,OAAO,IAAI,OAAO;EAC9C;IAAA;MAAA;MAAA;MAAA;MAAA;IAAA,iCAQK,IAAI;MAAA,IAAC,IAAI;QAAA,OAAE,KAAK,CAAC,KAAK;MAAA;MAAA;QAAA;UAAA;UAAA;UAAA;QAAA,sBAEiB,KAAK,CAAC,KAAK;QAAA,kCAC9C,IAAI;UAAA,IAAC,IAAI;YAAA,OAAE,KAAK,CAAC,MAAM;UAAA;UAAA,UACpB,MAAM;YAAA;cAAA;YAAA,uBAEG,MAAM,CAAC,CAAC,CAAC,KAAK;YAAA,6CADd,MAAM,CAAC,CAAC,CAAC,IAAI;YAAA;UAAA;QAIvB;QAAA;MAAA;IAAA;IAAA,iCAIN,mBAAmB,CAAC,QAAQ;MAAA,IAAC,KAAK;QAAA,OAAE,KAAK,CAAC,IAAI,IAAI,IAAI;MAAA;MAAA;QAAA,yBACpD,sBAAsB,CAAC,QAAQ;UAAA,IAAC,KAAK;YAAA,OAAE,OAAO,CAAC,CAAC;UAAA;UAAA;YAAA;YAAA,sBACb,KAAK,CAAC,QAAQ;YAAA;UAAA;QAAA;MAAA;IAAA;IAAA;MAAA,UArB7C,iBAAiB,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE;QAAA,OAC7B,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC;QAAA,OAC7B,KAAK,CAAC,IAAI,IAAI,IAAI;QAAA,OACf,OAAO,CAAC,CAAC;QAAA,OACX,KAAK,CAAC,KAAK;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;IAAA;MAAA;MAAA;MAAA;MAAA;MAAA;IAAA;IAAA;EAAA;AAsB7B;AAEA,eAAe,QAAQ","ignoreList":[]}
@@ -0,0 +1,64 @@
1
+ import { i18n } from "@k2b/stdlib";
2
+ import { useLocale } from "../intl/locale";
3
+ const budgetMessages = i18n.define({
4
+ baseLocale: "en",
5
+ messages: {
6
+ en: {
7
+ of: ({
8
+ limit
9
+ }) => `of ${limit}`,
10
+ free: ({
11
+ amount
12
+ }) => `${amount} left`,
13
+ near: ({
14
+ amount
15
+ }) => `tight · ${amount} left`,
16
+ over: ({
17
+ amount
18
+ }) => `${amount} over budget`,
19
+ used: "booked",
20
+ expected: "expected",
21
+ overLegend: "over budget",
22
+ budget: "Budget",
23
+ left: "left",
24
+ overBy: "over",
25
+ valueText: ({
26
+ used,
27
+ expected,
28
+ limit
29
+ }) => `${used} booked${expected ? `, ${expected} expected` : ""}, of ${limit}`
30
+ },
31
+ de: {
32
+ of: ({
33
+ limit
34
+ }) => `von ${limit}`,
35
+ free: ({
36
+ amount
37
+ }) => `noch ${amount} frei`,
38
+ near: ({
39
+ amount
40
+ }) => `knapp · noch ${amount} frei`,
41
+ over: ({
42
+ amount
43
+ }) => `${amount} über dem Budget`,
44
+ used: "gebucht",
45
+ expected: "erwartet",
46
+ overLegend: "über dem Budget",
47
+ budget: "Budget",
48
+ left: "frei",
49
+ overBy: "darüber",
50
+ valueText: ({
51
+ used,
52
+ expected,
53
+ limit
54
+ }) => `${used} gebucht${expected ? `, ${expected} erwartet` : ""}, von ${limit}`
55
+ }
56
+ }
57
+ });
58
+ /** Resolved from an explicit locale override, else the inherited render locale. */
59
+ export const useBudgetMessages = override => {
60
+ const locale = useLocale();
61
+ return () => budgetMessages.resolve([override?.() ?? locale()]).t;
62
+ };
63
+ export const checkBudgetMessages = () => budgetMessages.check();
64
+ //# sourceMappingURL=budget-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["surfaces/budget-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\nconst budgetMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n of: ({ limit }: { limit: string }) => `of ${limit}`,\n free: ({ amount }: { amount: string }) => `${amount} left`,\n near: ({ amount }: { amount: string }) => `tight · ${amount} left`,\n over: ({ amount }: { amount: string }) => `${amount} over budget`,\n used: \"booked\",\n expected: \"expected\",\n overLegend: \"over budget\",\n budget: \"Budget\",\n left: \"left\",\n overBy: \"over\",\n valueText: ({ used, expected, limit }: { used: string; expected?: string; limit: string }) =>\n `${used} booked${expected ? `, ${expected} expected` : \"\"}, of ${limit}`,\n },\n de: {\n of: ({ limit }: { limit: string }) => `von ${limit}`,\n free: ({ amount }: { amount: string }) => `noch ${amount} frei`,\n near: ({ amount }: { amount: string }) => `knapp · noch ${amount} frei`,\n over: ({ amount }: { amount: string }) => `${amount} über dem Budget`,\n used: \"gebucht\",\n expected: \"erwartet\",\n overLegend: \"über dem Budget\",\n budget: \"Budget\",\n left: \"frei\",\n overBy: \"darüber\",\n valueText: ({ used, expected, limit }: { used: string; expected?: string; limit: string }) =>\n `${used} gebucht${expected ? `, ${expected} erwartet` : \"\"}, von ${limit}`,\n },\n },\n});\n\nexport type BudgetMessages = ReturnType<(typeof budgetMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from an explicit locale override, else the inherited render locale. */\nexport const useBudgetMessages = (override?: () => string | undefined): (() => BudgetMessages) => {\n const locale = useLocale();\n return () => budgetMessages.resolve([override?.() ?? locale()]).t;\n};\n\nexport const checkBudgetMessages = () => budgetMessages.check();\n"],"mappings":"AAAA,SAAS,IAAI,QAAQ,aAAa;AAClC,SAAS,SAAS,QAAQ,gBAAgB;AAE1C,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;EACjC,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE;IACR,EAAE,EAAE;MACF,EAAE,EAAE,CAAC;QAAE;MAAyB,CAAC,KAAK,MAAM,KAAK,EAAE;MACnD,IAAI,EAAE,CAAC;QAAE;MAA2B,CAAC,KAAK,GAAG,MAAM,OAAO;MAC1D,IAAI,EAAE,CAAC;QAAE;MAA2B,CAAC,KAAK,WAAW,MAAM,OAAO;MAClE,IAAI,EAAE,CAAC;QAAE;MAA2B,CAAC,KAAK,GAAG,MAAM,cAAc;MACjE,IAAI,EAAE,QAAQ;MACd,QAAQ,EAAE,UAAU;MACpB,UAAU,EAAE,aAAa;MACzB,MAAM,EAAE,QAAQ;MAChB,IAAI,EAAE,MAAM;MACZ,MAAM,EAAE,MAAM;MACd,SAAS,EAAE,CAAC;QAAE,IAAI;QAAE,QAAQ;QAAE;MAA0D,CAAC,KACvF,GAAG,IAAI,UAAU,QAAQ,GAAG,KAAK,QAAQ,WAAW,GAAG,EAAE,QAAQ,KAAK;IAC1E,CAAC;IACD,EAAE,EAAE;MACF,EAAE,EAAE,CAAC;QAAE;MAAyB,CAAC,KAAK,OAAO,KAAK,EAAE;MACpD,IAAI,EAAE,CAAC;QAAE;MAA2B,CAAC,KAAK,QAAQ,MAAM,OAAO;MAC/D,IAAI,EAAE,CAAC;QAAE;MAA2B,CAAC,KAAK,gBAAgB,MAAM,OAAO;MACvE,IAAI,EAAE,CAAC;QAAE;MAA2B,CAAC,KAAK,GAAG,MAAM,kBAAkB;MACrE,IAAI,EAAE,SAAS;MACf,QAAQ,EAAE,UAAU;MACpB,UAAU,EAAE,iBAAiB;MAC7B,MAAM,EAAE,QAAQ;MAChB,IAAI,EAAE,MAAM;MACZ,MAAM,EAAE,SAAS;MACjB,SAAS,EAAE,CAAC;QAAE,IAAI;QAAE,QAAQ;QAAE;MAA0D,CAAC,KACvF,GAAG,IAAI,WAAW,QAAQ,GAAG,KAAK,QAAQ,WAAW,GAAG,EAAE,SAAS,KAAK;IAC5E;EACF;AACF,CAAC,CAAC;AAIF;AACA,OAAO,MAAM,iBAAiB,GAAI,QAAmC,IAA6B;EAChG,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,OAAO,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC,QAAQ,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,OAAO,MAAM,mBAAmB,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,65 @@
1
+ import { template as _$template } from "solid-js/web";
2
+ import { className as _$className } from "solid-js/web";
3
+ import { setAttribute as _$setAttribute } from "solid-js/web";
4
+ import { effect as _$effect } from "solid-js/web";
5
+ import { getNextElement as _$getNextElement } from "solid-js/web";
6
+ import { getNextMarker as _$getNextMarker } from "solid-js/web";
7
+ import { insert as _$insert } from "solid-js/web";
8
+ var _tmpl$ = /*#__PURE__*/_$template(`<span class=k2b-stat-cell__delta role=img><i aria-hidden=true></i><!$><!/>`);
9
+ import { useLocale } from "../intl/locale";
10
+ import { useStatCellMessages } from "./stat-cell-messages";
11
+
12
+ // The change badge of a key figure, on its own so a table cell can show it without the tile and its trend chart.
13
+
14
+ /** The change as shown: one decimal of a percent or point, so text, arrow and rating never disagree. */
15
+ const shownDelta = delta => Math.round(delta.value * 1000) / 1000 || 0;
16
+ const deltaTone = delta => {
17
+ const value = shownDelta(delta);
18
+ return !delta.better || value === 0 ? "neutral" : value > 0 === (delta.better === "up") ? "good" : "bad";
19
+ };
20
+
21
+ /** Signed with a true minus sign (U+2212), as figures are typeset. */
22
+ export const deltaText = (delta, locale, t) => (delta.unit === "points" ? `${new Intl.NumberFormat(locale, {
23
+ minimumFractionDigits: 1,
24
+ maximumFractionDigits: 1,
25
+ signDisplay: "exceptZero"
26
+ }).format(shownDelta(delta) * 100)} ${t.points}` : new Intl.NumberFormat(locale, {
27
+ style: "percent",
28
+ minimumFractionDigits: 1,
29
+ maximumFractionDigits: 1,
30
+ signDisplay: "exceptZero"
31
+ }).format(shownDelta(delta))).replace("-", "\u2212");
32
+
33
+ /** A change badge: arrow, signed text, and a spoken label that names the comparison and, with `better`, the rating. */
34
+ export function DeltaBadge(props) {
35
+ const locale = useLocale();
36
+ const t = useStatCellMessages();
37
+ const tone = () => deltaTone(props.delta);
38
+ const text = () => deltaText(props.delta, locale(), t());
39
+ const label = () => [text(), props.compare ? t().comparedWith({
40
+ label: props.compare.label
41
+ }) : ""].filter(Boolean).join(" ") + (tone() === "good" ? `, ${t().better}` : tone() === "bad" ? `, ${t().worse}` : "");
42
+ const icon = () => shownDelta(props.delta) > 0 ? "ti-trending-up" : shownDelta(props.delta) < 0 ? "ti-trending-down" : "ti-minus";
43
+ return (() => {
44
+ var _el$ = _$getNextElement(_tmpl$),
45
+ _el$2 = _el$.firstChild,
46
+ _el$3 = _el$2.nextSibling,
47
+ [_el$4, _co$] = _$getNextMarker(_el$3.nextSibling);
48
+ _$insert(_el$, text, _el$4, _co$);
49
+ _$effect(_p$ => {
50
+ var _v$ = tone(),
51
+ _v$2 = label(),
52
+ _v$3 = `ti ${icon()}`;
53
+ _v$ !== _p$.e && _$setAttribute(_el$, "data-tone", _p$.e = _v$);
54
+ _v$2 !== _p$.t && _$setAttribute(_el$, "aria-label", _p$.t = _v$2);
55
+ _v$3 !== _p$.a && _$className(_el$2, _p$.a = _v$3);
56
+ return _p$;
57
+ }, {
58
+ e: undefined,
59
+ t: undefined,
60
+ a: undefined
61
+ });
62
+ return _el$;
63
+ })();
64
+ }
65
+ //# sourceMappingURL=delta-badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["surfaces/delta-badge.tsx"],"sourcesContent":["import type { JSX } from \"solid-js\";\nimport { useLocale } from \"../intl/locale\";\nimport type { StatCellCompare, StatCellDelta } from \"./StatCell\";\nimport { type StatCellMessages, useStatCellMessages } from \"./stat-cell-messages\";\n\n// The change badge of a key figure, on its own so a table cell can show it without the tile and its trend chart.\n\n/** The change as shown: one decimal of a percent or point, so text, arrow and rating never disagree. */\nconst shownDelta = (delta: StatCellDelta): number => Math.round(delta.value * 1000) / 1000 || 0;\n\nconst deltaTone = (delta: StatCellDelta): \"good\" | \"bad\" | \"neutral\" => {\n const value = shownDelta(delta);\n return !delta.better || value === 0 ? \"neutral\" : value > 0 === (delta.better === \"up\") ? \"good\" : \"bad\";\n};\n\n/** Signed with a true minus sign (U+2212), as figures are typeset. */\nexport const deltaText = (delta: StatCellDelta, locale: string, t: StatCellMessages): string =>\n (delta.unit === \"points\"\n ? `${new Intl.NumberFormat(locale, { minimumFractionDigits: 1, maximumFractionDigits: 1, signDisplay: \"exceptZero\" }).format(shownDelta(delta) * 100)} ${t.points}`\n : new Intl.NumberFormat(locale, {\n style: \"percent\",\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n signDisplay: \"exceptZero\",\n }).format(shownDelta(delta))\n ).replace(\"-\", \"\\u2212\");\n\n/** A change badge: arrow, signed text, and a spoken label that names the comparison and, with `better`, the rating. */\nexport function DeltaBadge(props: { delta: StatCellDelta; compare?: StatCellCompare }): JSX.Element {\n const locale = useLocale();\n const t = useStatCellMessages();\n const tone = () => deltaTone(props.delta);\n const text = () => deltaText(props.delta, locale(), t());\n const label = () =>\n [text(), props.compare ? t().comparedWith({ label: props.compare.label }) : \"\"].filter(Boolean).join(\" \") +\n (tone() === \"good\" ? `, ${t().better}` : tone() === \"bad\" ? `, ${t().worse}` : \"\");\n const icon = () => (shownDelta(props.delta) > 0 ? \"ti-trending-up\" : shownDelta(props.delta) < 0 ? \"ti-trending-down\" : \"ti-minus\");\n return (\n <span class=\"k2b-stat-cell__delta\" data-tone={tone()} role=\"img\" aria-label={label()}>\n <i class={`ti ${icon()}`} aria-hidden=\"true\" />\n {text()}\n </span>\n );\n}\n"],"mappings":";;;;;;;;AACA,SAAS,SAAS,QAAQ,gBAAgB;AAE1C,SAAgC,mBAAmB,QAAQ,sBAAsB;;AAEjF;;AAEA;AACA,MAAM,UAAU,GAAI,KAAoB,IAAa,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC;AAE/F,MAAM,SAAS,GAAI,KAAoB,IAAiC;EACtE,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC;EAC/B,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,KAAK,CAAC,GAAG,SAAS,GAAG,KAAK,GAAG,CAAC,MAAM,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,GAAG,MAAM,GAAG,KAAK;AAC1G,CAAC;;AAED;AACA,OAAO,MAAM,SAAS,GAAG,CAAC,KAAoB,EAAE,MAAc,EAAE,CAAmB,KACjF,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,GACpB,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;EAAE,qBAAqB,EAAE,CAAC;EAAE,qBAAqB,EAAE,CAAC;EAAE,WAAW,EAAE;AAAa,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,GACjK,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;EAC5B,KAAK,EAAE,SAAS;EAChB,qBAAqB,EAAE,CAAC;EACxB,qBAAqB,EAAE,CAAC;EACxB,WAAW,EAAE;AACf,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAC9B,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC;;AAE1B;AACA,OAAO,SAAS,UAAU,CAAC,KAA0D,EAAe;EAClG,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,MAAM,CAAC,GAAG,mBAAmB,CAAC,CAAC;EAC/B,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;EACzC,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;EACxD,MAAM,KAAK,GAAG,MACZ,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IAAE,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;EAAM,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IACxG,IAAI,CAAC,CAAC,KAAK,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,KAAK,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;EACpF,MAAM,IAAI,GAAG,MAAO,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,gBAAgB,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,kBAAkB,GAAG,UAAW;EACnI;IAAA;MAAA;MAAA;MAAA;IAAA,eAGK,IAAI;IAAA;MAAA,UAFuC,IAAI,CAAC,CAAC;QAAA,OAAyB,KAAK,CAAC,CAAC;QAAA,OACxE,MAAM,IAAI,CAAC,CAAC,EAAE;MAAA;MAAA;MAAA;MAAA;IAAA;MAAA;MAAA;MAAA;IAAA;IAAA;EAAA;AAI9B","ignoreList":[]}
@@ -1,5 +1,6 @@
1
1
  export { Avatar } from "./Avatar";
2
2
  export { AvatarFaces, AvatarStack } from "./AvatarStack";
3
+ export { BudgetList, budgetState } from "./BudgetList";
3
4
  export { ChangeList } from "./ChangeList";
4
5
  export { DescriptionList } from "./DescriptionList";
5
6
  export { DotStrip } from "./DotStrip";
@@ -8,7 +9,7 @@ export { NotFoundState } from "./NotFoundState";
8
9
  export { NOTICE_CARD_CLASSES, NoticeCard } from "./NoticeCard";
9
10
  export { Paper } from "./Paper";
10
11
  export { default as Placeholder } from "./Placeholder";
11
- export { ProgressBar } from "./ProgressBar";
12
+ export { ProgressBar, progressBarParts } from "./ProgressBar";
12
13
  export { ProgressRing } from "./ProgressRing";
13
14
  export { PERSON_COLORS, personColor } from "./person-color";
14
15
  export { ResourceCard } from "./ResourceCard";
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["surfaces/index.ts"],"sourcesContent":["export type { AvatarProps, AvatarRing, AvatarShape, AvatarSize, AvatarTone } from \"./Avatar\";\nexport { Avatar } from \"./Avatar\";\nexport type { AvatarFacesPerson, AvatarFacesProps, AvatarStackPerson, AvatarStackProps } from \"./AvatarStack\";\nexport { AvatarFaces, AvatarStack } from \"./AvatarStack\";\nexport type { ChangeListItem, ChangeListProps, ChangeTone } from \"./ChangeList\";\nexport { ChangeList } from \"./ChangeList\";\nexport type { DescriptionListItem, DescriptionListProps } from \"./DescriptionList\";\nexport { DescriptionList } from \"./DescriptionList\";\nexport type { DotStripProps, DotStripTone } from \"./DotStrip\";\nexport { DotStrip } from \"./DotStrip\";\nexport type { LinkCardColor, LinkCardProps } from \"./LinkCard\";\nexport { LinkCard } from \"./LinkCard\";\nexport type { NotFoundStateAction, NotFoundStateProps } from \"./NotFoundState\";\nexport { NotFoundState } from \"./NotFoundState\";\nexport type { NoticeCardProps, NoticeGridProps, NoticeTone } from \"./NoticeCard\";\nexport { NOTICE_CARD_CLASSES, NoticeCard } from \"./NoticeCard\";\nexport type { PaperProps, PaperTag } from \"./Paper\";\nexport { Paper } from \"./Paper\";\nexport type {\n PlaceholderAlign,\n PlaceholderProps,\n PlaceholderState,\n PlaceholderSurface,\n PlaceholderVariant,\n} from \"./Placeholder\";\nexport { default as Placeholder } from \"./Placeholder\";\nexport type { ProgressBarProps, ProgressBarTone } from \"./ProgressBar\";\nexport { ProgressBar } from \"./ProgressBar\";\nexport type { ProgressRingProps, ProgressRingTone } from \"./ProgressRing\";\nexport { ProgressRing } from \"./ProgressRing\";\nexport { PERSON_COLORS, personColor } from \"./person-color\";\nexport type { ResourceCardColor, ResourceCardProps, ResourceCardState } from \"./ResourceCard\";\nexport { ResourceCard } from \"./ResourceCard\";\nexport { Skeleton, type SkeletonProps } from \"./Skeleton\";\nexport type { StatCellAccent, StatCellProps, StatCellTone } from \"./StatCell\";\nexport { StatCell } from \"./StatCell\";\nexport type {\n StatGridAction,\n StatGridColumns,\n StatGridProps,\n StatGridSize,\n StatGridSurface,\n} from \"./StatGrid\";\nexport { StatGrid } from \"./StatGrid\";\nexport type { StatusBadgeProps, StatusTone } from \"./StatusBadge\";\nexport { StatusBadge } from \"./StatusBadge\";\nexport type { TagProps, TagSize } from \"./Tag\";\nexport { Tag } from \"./Tag\";\n"],"mappings":"AACA,SAAS,MAAM,QAAQ,UAAU;AAEjC,SAAS,WAAW,EAAE,WAAW,QAAQ,eAAe;AAExD,SAAS,UAAU,QAAQ,cAAc;AAEzC,SAAS,eAAe,QAAQ,mBAAmB;AAEnD,SAAS,QAAQ,QAAQ,YAAY;AAErC,SAAS,QAAQ,QAAQ,YAAY;AAErC,SAAS,aAAa,QAAQ,iBAAiB;AAE/C,SAAS,mBAAmB,EAAE,UAAU,QAAQ,cAAc;AAE9D,SAAS,KAAK,QAAQ,SAAS;AAQ/B,SAAS,OAAO,IAAI,WAAW,QAAQ,eAAe;AAEtD,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,YAAY,QAAQ,gBAAgB;AAC7C,SAAS,aAAa,EAAE,WAAW,QAAQ,gBAAgB;AAE3D,SAAS,YAAY,QAAQ,gBAAgB;AAC7C,SAAS,QAAQ,QAA4B,YAAY;AAEzD,SAAS,QAAQ,QAAQ,YAAY;AAQrC,SAAS,QAAQ,QAAQ,YAAY;AAErC,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,GAAG,QAAQ,OAAO","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["surfaces/index.ts"],"sourcesContent":["export type { AvatarProps, AvatarRing, AvatarShape, AvatarSize, AvatarTone } from \"./Avatar\";\nexport { Avatar } from \"./Avatar\";\nexport type { AvatarFacesPerson, AvatarFacesProps, AvatarStackPerson, AvatarStackProps } from \"./AvatarStack\";\nexport { AvatarFaces, AvatarStack } from \"./AvatarStack\";\nexport { type BudgetItem, type BudgetLevel, BudgetList, type BudgetListProps, budgetState } from \"./BudgetList\";\nexport type { ChangeListItem, ChangeListProps, ChangeTone } from \"./ChangeList\";\nexport { ChangeList } from \"./ChangeList\";\nexport type { DescriptionListItem, DescriptionListProps } from \"./DescriptionList\";\nexport { DescriptionList } from \"./DescriptionList\";\nexport type { DotStripProps, DotStripTone } from \"./DotStrip\";\nexport { DotStrip } from \"./DotStrip\";\nexport type { LinkCardColor, LinkCardProps } from \"./LinkCard\";\nexport { LinkCard } from \"./LinkCard\";\nexport type { NotFoundStateAction, NotFoundStateProps } from \"./NotFoundState\";\nexport { NotFoundState } from \"./NotFoundState\";\nexport type { NoticeCardProps, NoticeGridProps, NoticeTone } from \"./NoticeCard\";\nexport { NOTICE_CARD_CLASSES, NoticeCard } from \"./NoticeCard\";\nexport type { PaperProps, PaperTag } from \"./Paper\";\nexport { Paper } from \"./Paper\";\nexport type {\n PlaceholderAlign,\n PlaceholderProps,\n PlaceholderState,\n PlaceholderSurface,\n PlaceholderVariant,\n} from \"./Placeholder\";\nexport { default as Placeholder } from \"./Placeholder\";\nexport type { ProgressBarPart, ProgressBarProps, ProgressBarSegment, ProgressBarTone } from \"./ProgressBar\";\nexport { ProgressBar, progressBarParts } from \"./ProgressBar\";\nexport type { ProgressRingProps, ProgressRingTone } from \"./ProgressRing\";\nexport { ProgressRing } from \"./ProgressRing\";\nexport { PERSON_COLORS, personColor } from \"./person-color\";\nexport type { ResourceCardColor, ResourceCardProps, ResourceCardState } from \"./ResourceCard\";\nexport { ResourceCard } from \"./ResourceCard\";\nexport { Skeleton, type SkeletonProps } from \"./Skeleton\";\nexport type { StatCellAccent, StatCellCompare, StatCellDelta, StatCellProps, StatCellSize, StatCellTone } from \"./StatCell\";\nexport { StatCell } from \"./StatCell\";\nexport type {\n StatGridAction,\n StatGridColumns,\n StatGridProps,\n StatGridSize,\n StatGridSurface,\n} from \"./StatGrid\";\nexport { StatGrid } from \"./StatGrid\";\nexport type { StatusBadgeProps, StatusTone } from \"./StatusBadge\";\nexport { StatusBadge } from \"./StatusBadge\";\nexport type { TagProps, TagSize } from \"./Tag\";\nexport { Tag } from \"./Tag\";\n"],"mappings":"AACA,SAAS,MAAM,QAAQ,UAAU;AAEjC,SAAS,WAAW,EAAE,WAAW,QAAQ,eAAe;AACxD,SAA4C,UAAU,EAAwB,WAAW,QAAQ,cAAc;AAE/G,SAAS,UAAU,QAAQ,cAAc;AAEzC,SAAS,eAAe,QAAQ,mBAAmB;AAEnD,SAAS,QAAQ,QAAQ,YAAY;AAErC,SAAS,QAAQ,QAAQ,YAAY;AAErC,SAAS,aAAa,QAAQ,iBAAiB;AAE/C,SAAS,mBAAmB,EAAE,UAAU,QAAQ,cAAc;AAE9D,SAAS,KAAK,QAAQ,SAAS;AAQ/B,SAAS,OAAO,IAAI,WAAW,QAAQ,eAAe;AAEtD,SAAS,WAAW,EAAE,gBAAgB,QAAQ,eAAe;AAE7D,SAAS,YAAY,QAAQ,gBAAgB;AAC7C,SAAS,aAAa,EAAE,WAAW,QAAQ,gBAAgB;AAE3D,SAAS,YAAY,QAAQ,gBAAgB;AAC7C,SAAS,QAAQ,QAA4B,YAAY;AAEzD,SAAS,QAAQ,QAAQ,YAAY;AAQrC,SAAS,QAAQ,QAAQ,YAAY;AAErC,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,GAAG,QAAQ,OAAO","ignoreList":[]}
@@ -1,9 +1,9 @@
1
1
  /**
2
2
  * The colors that stand for a person: the tint behind avatar initials, a collaborator's cursor, and the marks and
3
- * comments a person leaves. The palette leaves out cyan, which means AI, and yellow, which reads as a text highlight.
3
+ * comments a person leaves. The palette leaves out plum, which means AI, and yellow, which reads as a text highlight.
4
4
  * Several people can share a color, so a person's name always appears next to it.
5
5
  */
6
- export const PERSON_COLORS = ["#3b82f6", "#6366f1", "#8b5cf6", "#c026d3", "#ec4899", "#e11d48", "#f97316", "#16a34a"];
6
+ export const PERSON_COLORS = ["#3b82f6", "#6366f1", "#8b5cf6", "#0891b2", "#0d9488", "#e11d48", "#f97316", "#16a34a"];
7
7
 
8
8
  /** The palette index for a name, the order of the `.k2b-avatar[data-tint]` rules. Surrounding spaces do not count. */
9
9
  export const personTint = name => {
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["surfaces/person-color.ts"],"sourcesContent":["/**\n * The colors that stand for a person: the tint behind avatar initials, a collaborator's cursor, and the marks and\n * comments a person leaves. The palette leaves out cyan, which means AI, and yellow, which reads as a text highlight.\n * Several people can share a color, so a person's name always appears next to it.\n */\nexport const PERSON_COLORS = [\"#3b82f6\", \"#6366f1\", \"#8b5cf6\", \"#c026d3\", \"#ec4899\", \"#e11d48\", \"#f97316\", \"#16a34a\"] as const;\n\n/** The palette index for a name, the order of the `.k2b-avatar[data-tint]` rules. Surrounding spaces do not count. */\nexport const personTint = (name: string): number => {\n const trimmed = name.trim();\n let hash = 0;\n for (let index = 0; index < trimmed.length; index++) hash = (hash * 31 + trimmed.charCodeAt(index)) >>> 0;\n return hash % PERSON_COLORS.length;\n};\n\n/** A person's color from their display name, the same wherever Cloud shows that person. */\nexport const personColor = (name: string): string => PERSON_COLORS[personTint(name)]!;\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAU;;AAE9H;AACA,OAAO,MAAM,UAAU,GAAI,IAAY,IAAa;EAClD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;EAC3B,IAAI,IAAI,GAAG,CAAC;EACZ,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,GAAI,IAAI,GAAG,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,KAAM,CAAC;EACzG,OAAO,IAAI,GAAG,aAAa,CAAC,MAAM;AACpC,CAAC;;AAED;AACA,OAAO,MAAM,WAAW,GAAI,IAAY,IAAa,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,CAAE","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["surfaces/person-color.ts"],"sourcesContent":["/**\n * The colors that stand for a person: the tint behind avatar initials, a collaborator's cursor, and the marks and\n * comments a person leaves. The palette leaves out plum, which means AI, and yellow, which reads as a text highlight.\n * Several people can share a color, so a person's name always appears next to it.\n */\nexport const PERSON_COLORS = [\"#3b82f6\", \"#6366f1\", \"#8b5cf6\", \"#0891b2\", \"#0d9488\", \"#e11d48\", \"#f97316\", \"#16a34a\"] as const;\n\n/** The palette index for a name, the order of the `.k2b-avatar[data-tint]` rules. Surrounding spaces do not count. */\nexport const personTint = (name: string): number => {\n const trimmed = name.trim();\n let hash = 0;\n for (let index = 0; index < trimmed.length; index++) hash = (hash * 31 + trimmed.charCodeAt(index)) >>> 0;\n return hash % PERSON_COLORS.length;\n};\n\n/** A person's color from their display name, the same wherever Cloud shows that person. */\nexport const personColor = (name: string): string => PERSON_COLORS[personTint(name)]!;\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAU;;AAE9H;AACA,OAAO,MAAM,UAAU,GAAI,IAAY,IAAa;EAClD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;EAC3B,IAAI,IAAI,GAAG,CAAC;EACZ,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,GAAI,IAAI,GAAG,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,KAAM,CAAC;EACzG,OAAO,IAAI,GAAG,aAAa,CAAC,MAAM;AACpC,CAAC;;AAED;AACA,OAAO,MAAM,WAAW,GAAI,IAAY,IAAa,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,CAAE","ignoreList":[]}
@@ -0,0 +1,41 @@
1
+ import { i18n } from "@k2b/stdlib";
2
+ import { useLocale } from "../intl/locale";
3
+ const statCellMessages = i18n.define({
4
+ baseLocale: "en",
5
+ messages: {
6
+ en: {
7
+ points: "pts",
8
+ better: "better",
9
+ worse: "worse",
10
+ comparedWith: ({
11
+ label
12
+ }) => `compared with ${label}`,
13
+ notLoaded: "Not loaded",
14
+ retry: "Try again",
15
+ reload: "Reload",
16
+ loading: "Loading"
17
+ },
18
+ de: {
19
+ points: "Pkt.",
20
+ better: "besser",
21
+ worse: "schlechter",
22
+ comparedWith: ({
23
+ label
24
+ }) => `gegenüber ${label}`,
25
+ notLoaded: "Nicht geladen",
26
+ retry: "Erneut versuchen",
27
+ reload: "Neu laden",
28
+ loading: "Wird geladen"
29
+ }
30
+ }
31
+ });
32
+ /** Resolved from the inherited render locale. */
33
+ export const useStatCellMessages = () => {
34
+ const locale = useLocale();
35
+ return () => statCellMessages.resolve([locale()]).t;
36
+ };
37
+
38
+ /** For a caller that already holds the locale, such as table text for search and copy. */
39
+ export const resolveStatCellMessages = locale => statCellMessages.resolve([locale]).t;
40
+ export const checkStatCellMessages = () => statCellMessages.check();
41
+ //# sourceMappingURL=stat-cell-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["surfaces/stat-cell-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\nconst statCellMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n points: \"pts\",\n better: \"better\",\n worse: \"worse\",\n comparedWith: ({ label }: { label: string }) => `compared with ${label}`,\n notLoaded: \"Not loaded\",\n retry: \"Try again\",\n reload: \"Reload\",\n loading: \"Loading\",\n },\n de: {\n points: \"Pkt.\",\n better: \"besser\",\n worse: \"schlechter\",\n comparedWith: ({ label }: { label: string }) => `gegenüber ${label}`,\n notLoaded: \"Nicht geladen\",\n retry: \"Erneut versuchen\",\n reload: \"Neu laden\",\n loading: \"Wird geladen\",\n },\n },\n});\n\nexport type StatCellMessages = ReturnType<(typeof statCellMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from the inherited render locale. */\nexport const useStatCellMessages = (): (() => StatCellMessages) => {\n const locale = useLocale();\n return () => statCellMessages.resolve([locale()]).t;\n};\n\n/** For a caller that already holds the locale, such as table text for search and copy. */\nexport const resolveStatCellMessages = (locale: string): StatCellMessages => statCellMessages.resolve([locale]).t;\n\nexport const checkStatCellMessages = () => statCellMessages.check();\n"],"mappings":"AAAA,SAAS,IAAI,QAAQ,aAAa;AAClC,SAAS,SAAS,QAAQ,gBAAgB;AAE1C,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC;EACnC,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE;IACR,EAAE,EAAE;MACF,MAAM,EAAE,KAAK;MACb,MAAM,EAAE,QAAQ;MAChB,KAAK,EAAE,OAAO;MACd,YAAY,EAAE,CAAC;QAAE;MAAyB,CAAC,KAAK,iBAAiB,KAAK,EAAE;MACxE,SAAS,EAAE,YAAY;MACvB,KAAK,EAAE,WAAW;MAClB,MAAM,EAAE,QAAQ;MAChB,OAAO,EAAE;IACX,CAAC;IACD,EAAE,EAAE;MACF,MAAM,EAAE,MAAM;MACd,MAAM,EAAE,QAAQ;MAChB,KAAK,EAAE,YAAY;MACnB,YAAY,EAAE,CAAC;QAAE;MAAyB,CAAC,KAAK,aAAa,KAAK,EAAE;MACpE,SAAS,EAAE,eAAe;MAC1B,KAAK,EAAE,kBAAkB;MACzB,MAAM,EAAE,WAAW;MACnB,OAAO,EAAE;IACX;EACF;AACF,CAAC,CAAC;AAIF;AACA,OAAO,MAAM,mBAAmB,GAAG,MAAgC;EACjE,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,OAAO,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrD,CAAC;;AAED;AACA,OAAO,MAAM,uBAAuB,GAAI,MAAc,IAAuB,gBAAgB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAEjH,OAAO,MAAM,qBAAqB,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,137 @@
1
+ import { template as _$template } from "solid-js/web";
2
+ import { mergeProps as _$mergeProps } from "solid-js/web";
3
+ import { memo as _$memo } from "solid-js/web";
4
+ import { setAttribute as _$setAttribute } from "solid-js/web";
5
+ import { getNextMarker as _$getNextMarker } from "solid-js/web";
6
+ import { createComponent as _$createComponent } from "solid-js/web";
7
+ import { style as _$style } from "solid-js/web";
8
+ import { className as _$className } from "solid-js/web";
9
+ import { effect as _$effect } from "solid-js/web";
10
+ import { getNextElement as _$getNextElement } from "solid-js/web";
11
+ import { insert as _$insert } from "solid-js/web";
12
+ var _tmpl$ = /*#__PURE__*/_$template(`<div>`),
13
+ _tmpl$2 = /*#__PURE__*/_$template(`<i aria-hidden=true>`),
14
+ _tmpl$3 = /*#__PURE__*/_$template(`<p class=k2b-dashboard-section__description>`),
15
+ _tmpl$4 = /*#__PURE__*/_$template(`<header class=k2b-dashboard-section__header><!$><!/><!$><!/><!$><!/>`),
16
+ _tmpl$5 = /*#__PURE__*/_$template(`<section><!$><!/><div class=k2b-dashboard-section__grid>`);
17
+ import { createUniqueId, Show, splitProps } from "solid-js";
18
+ import { Dynamic } from "solid-js/web";
19
+
20
+ /**
21
+ * A panel's share of the six dashboard columns: a third is two, a half three, two thirds four, full all six. At a
22
+ * dashboard width of 1000 px or less a third takes half the row and two thirds the whole row; at 600 px or less every
23
+ * panel takes the whole row.
24
+ */
25
+
26
+ /** The dashboard's measuring container. Panel widths and the key-figure row follow its width, not the window's. */
27
+ export function DashboardGrid(props) {
28
+ return (() => {
29
+ var _el$ = _$getNextElement(_tmpl$);
30
+ _$insert(_el$, () => props.children);
31
+ _$effect(() => _$className(_el$, props.class ? `k2b-dashboard-grid ${props.class}` : "k2b-dashboard-grid"));
32
+ return _el$;
33
+ })();
34
+ }
35
+ /** A titled group of panels on the six-column grid. */
36
+ export function DashboardSection(props) {
37
+ const id = createUniqueId();
38
+ return (() => {
39
+ var _el$2 = _$getNextElement(_tmpl$5),
40
+ _el$11 = _el$2.firstChild,
41
+ [_el$12, _co$4] = _$getNextMarker(_el$11.nextSibling),
42
+ _el$10 = _el$12.nextSibling;
43
+ _$insert(_el$2, _$createComponent(Show, {
44
+ get when() {
45
+ return props.title;
46
+ },
47
+ get children() {
48
+ var _el$3 = _$getNextElement(_tmpl$4),
49
+ _el$6 = _el$3.firstChild,
50
+ [_el$7, _co$] = _$getNextMarker(_el$6.nextSibling),
51
+ _el$8 = _el$7.nextSibling,
52
+ [_el$9, _co$2] = _$getNextMarker(_el$8.nextSibling),
53
+ _el$0 = _el$9.nextSibling,
54
+ [_el$1, _co$3] = _$getNextMarker(_el$0.nextSibling);
55
+ _$insert(_el$3, _$createComponent(Show, {
56
+ get when() {
57
+ return props.icon;
58
+ },
59
+ get children() {
60
+ var _el$4 = _$getNextElement(_tmpl$2);
61
+ _$effect(_p$ => {
62
+ var _v$ = `k2b-dashboard-section__icon ${props.icon}`,
63
+ _v$2 = props.iconColor ? {
64
+ color: `color-mix(in srgb, ${props.iconColor} 72%, var(--k2b-text))`
65
+ } : undefined;
66
+ _v$ !== _p$.e && _$className(_el$4, _p$.e = _v$);
67
+ _p$.t = _$style(_el$4, _v$2, _p$.t);
68
+ return _p$;
69
+ }, {
70
+ e: undefined,
71
+ t: undefined
72
+ });
73
+ return _el$4;
74
+ }
75
+ }), _el$7, _co$);
76
+ _$insert(_el$3, _$createComponent(Dynamic, {
77
+ get component() {
78
+ return `h${props.headingLevel ?? 2}`;
79
+ },
80
+ id: id,
81
+ "class": "k2b-dashboard-section__title",
82
+ get children() {
83
+ return props.title;
84
+ }
85
+ }), _el$9, _co$2);
86
+ _$insert(_el$3, _$createComponent(Show, {
87
+ get when() {
88
+ return props.description;
89
+ },
90
+ get children() {
91
+ var _el$5 = _$getNextElement(_tmpl$3);
92
+ _$insert(_el$5, () => props.description);
93
+ return _el$5;
94
+ }
95
+ }), _el$1, _co$3);
96
+ return _el$3;
97
+ }
98
+ }), _el$12, _co$4);
99
+ _$insert(_el$10, () => props.children);
100
+ _$effect(_p$ => {
101
+ var _v$3 = props.class ? `k2b-dashboard-section ${props.class}` : "k2b-dashboard-section",
102
+ _v$4 = props.title ? id : undefined,
103
+ _v$5 = props.title ? undefined : props.ariaLabel;
104
+ _v$3 !== _p$.e && _$className(_el$2, _p$.e = _v$3);
105
+ _v$4 !== _p$.t && _$setAttribute(_el$2, "aria-labelledby", _p$.t = _v$4);
106
+ _v$5 !== _p$.a && _$setAttribute(_el$2, "aria-label", _p$.a = _v$5);
107
+ return _p$;
108
+ }, {
109
+ e: undefined,
110
+ t: undefined,
111
+ a: undefined
112
+ });
113
+ return _el$2;
114
+ })();
115
+ }
116
+ const PanelElement = Dynamic;
117
+
118
+ /** One framed cell of the grid. Panels in a row share the height of the tallest. */
119
+ export function DashboardPanel(props) {
120
+ const [local, element] = splitProps(props, ["as", "width", "class", "children"]);
121
+ return _$createComponent(PanelElement, _$mergeProps({
122
+ get component() {
123
+ return local.as ?? "article";
124
+ }
125
+ }, element, {
126
+ get ["class"]() {
127
+ return _$memo(() => !!local.class)() ? `k2b-dashboard-panel ${local.class}` : "k2b-dashboard-panel";
128
+ },
129
+ get ["data-width"]() {
130
+ return local.width ?? "third";
131
+ },
132
+ get children() {
133
+ return local.children;
134
+ }
135
+ }));
136
+ }
137
+ //# sourceMappingURL=Dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["widgets/Dashboard.tsx"],"sourcesContent":["import { createUniqueId, type JSX, Show, splitProps } from \"solid-js\";\nimport { Dynamic } from \"solid-js/web\";\n\n/**\n * A panel's share of the six dashboard columns: a third is two, a half three, two thirds four, full all six. At a\n * dashboard width of 1000 px or less a third takes half the row and two thirds the whole row; at 600 px or less every\n * panel takes the whole row.\n */\nexport type DashboardWidth = \"third\" | \"half\" | \"twoThirds\" | \"full\";\n\nexport type DashboardGridProps = {\n children: JSX.Element;\n class?: string;\n};\n\n/** The dashboard's measuring container. Panel widths and the key-figure row follow its width, not the window's. */\nexport function DashboardGrid(props: DashboardGridProps): JSX.Element {\n return <div class={props.class ? `k2b-dashboard-grid ${props.class}` : \"k2b-dashboard-grid\"}>{props.children}</div>;\n}\n\nexport type DashboardSectionProps = {\n /** Visible heading; without it the section has no heading and is named by `ariaLabel`. */\n title?: string;\n /** Tabler icon class shown as a plain glyph before the title, never in a tile. */\n icon?: string;\n /** Colour of the icon glyph; it is mixed with the text colour so it stays readable in light and dark. */\n iconColor?: string;\n /** Source or cadence, quiet and next to the title. */\n description?: string;\n headingLevel?: 2 | 3 | 4;\n ariaLabel?: string;\n class?: string;\n /** Panels and at most one key-figure row (`StatGrid`), in reading order; the row always spans all six columns. */\n children?: JSX.Element;\n};\n\n/** A titled group of panels on the six-column grid. */\nexport function DashboardSection(props: DashboardSectionProps): JSX.Element {\n const id = createUniqueId();\n return (\n <section\n class={props.class ? `k2b-dashboard-section ${props.class}` : \"k2b-dashboard-section\"}\n aria-labelledby={props.title ? id : undefined}\n aria-label={props.title ? undefined : props.ariaLabel}\n >\n <Show when={props.title}>\n <header class=\"k2b-dashboard-section__header\">\n <Show when={props.icon}>\n <i\n class={`k2b-dashboard-section__icon ${props.icon}`}\n style={props.iconColor ? { color: `color-mix(in srgb, ${props.iconColor} 72%, var(--k2b-text))` } : undefined}\n aria-hidden=\"true\"\n />\n </Show>\n <Dynamic component={`h${props.headingLevel ?? 2}`} id={id} class=\"k2b-dashboard-section__title\">\n {props.title}\n </Dynamic>\n <Show when={props.description}>\n <p class=\"k2b-dashboard-section__description\">{props.description}</p>\n </Show>\n </header>\n </Show>\n <div class=\"k2b-dashboard-section__grid\">{props.children}</div>\n </section>\n );\n}\n\ntype DashboardPanelTag = \"article\" | \"section\" | \"div\" | \"li\";\n\ntype DashboardPanelOwnProps<T extends DashboardPanelTag> = {\n as?: T;\n /** Defaults to a third. Ignored inside a key-figure row, where every tile takes one of its columns. */\n width?: DashboardWidth;\n class?: string;\n children?: JSX.Element;\n};\n\nexport type DashboardPanelProps<T extends DashboardPanelTag = \"article\"> = DashboardPanelOwnProps<T> &\n Omit<JSX.IntrinsicElements[T], keyof DashboardPanelOwnProps<T>>;\n\nconst PanelElement = Dynamic as unknown as (props: Record<string, unknown>) => JSX.Element;\n\n/** One framed cell of the grid. Panels in a row share the height of the tallest. */\nexport function DashboardPanel<T extends DashboardPanelTag = \"article\">(props: DashboardPanelProps<T>): JSX.Element {\n const [local, element] = splitProps(props, [\"as\", \"width\", \"class\", \"children\"]);\n return (\n <PanelElement\n component={local.as ?? \"article\"}\n {...element}\n class={local.class ? `k2b-dashboard-panel ${local.class}` : \"k2b-dashboard-panel\"}\n data-width={local.width ?? \"third\"}\n >\n {local.children}\n </PanelElement>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAAA,SAAS,cAAc,EAAY,IAAI,EAAE,UAAU,QAAQ,UAAU;AACrE,SAAS,OAAO,QAAQ,cAAc;;AAEtC;AACA;AACA;AACA;AACA;;AAQA;AACA,OAAO,SAAS,aAAa,CAAC,KAAyB,EAAe;EACpE;IAAA;IAAA,qBAA8F,KAAK,CAAC,QAAQ;IAAA,iCAAzF,KAAK,CAAC,KAAK,GAAG,sBAAsB,KAAK,CAAC,KAAK,EAAE,GAAG,oBAAoB;IAAA;EAAA;AAC7F;AAkBA;AACA,OAAO,SAAS,gBAAgB,CAAC,KAA4B,EAAe;EAC1E,MAAM,EAAE,GAAG,cAAc,CAAC,CAAC;EAC3B;IAAA;MAAA;MAAA;MAAA;IAAA,kCAMK,IAAI;MAAA,IAAC,IAAI;QAAA,OAAE,KAAK,CAAC,KAAK;MAAA;MAAA;QAAA;UAAA;UAAA;UAAA;UAAA;UAAA;UAAA;QAAA,kCAElB,IAAI;UAAA,IAAC,IAAI;YAAA,OAAE,KAAK,CAAC,IAAI;UAAA;UAAA;YAAA;YAAA;cAAA,UAEX,+BAA+B,KAAK,CAAC,IAAI,EAAE;gBAAA,OAC3C,KAAK,CAAC,SAAS,GAAG;kBAAE,KAAK,EAAE,sBAAsB,KAAK,CAAC,SAAS;gBAAyB,CAAC,GAAG,SAAS;cAAA;cAAA;cAAA;YAAA;cAAA;cAAA;YAAA;YAAA;UAAA;QAAA;QAAA,kCAIhH,OAAO;UAAA,IAAC,SAAS;YAAA,OAAE,IAAI,KAAK,CAAC,YAAY,IAAI,CAAC,EAAE;UAAA;UAAE,EAAE,EAAE,EAAE;UAAA;UAAA;YAAA,OACtD,KAAK,CAAC,KAAK;UAAA;QAAA;QAAA,kCAEb,IAAI;UAAA,IAAC,IAAI;YAAA,OAAE,KAAK,CAAC,WAAW;UAAA;UAAA;YAAA;YAAA,sBACoB,KAAK,CAAC,WAAW;YAAA;UAAA;QAAA;QAAA;MAAA;IAAA;IAAA,uBAI5B,KAAK,CAAC,QAAQ;IAAA;MAAA,WArBjD,KAAK,CAAC,KAAK,GAAG,yBAAyB,KAAK,CAAC,KAAK,EAAE,GAAG,uBAAuB;QAAA,OACpE,KAAK,CAAC,KAAK,GAAG,EAAE,GAAG,SAAS;QAAA,OACjC,KAAK,CAAC,KAAK,GAAG,SAAS,GAAG,KAAK,CAAC,SAAS;MAAA;MAAA;MAAA;MAAA;IAAA;MAAA;MAAA;MAAA;IAAA;IAAA;EAAA;AAsB3D;AAeA,MAAM,YAAY,GAAG,OAAqE;;AAE1F;AACA,OAAO,SAAS,cAAc,CAA0C,KAA6B,EAAe;EAClH,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;EAChF,yBACG,YAAY;IAAA,IACX,SAAS;MAAA,OAAE,KAAK,CAAC,EAAE,IAAI,SAAS;IAAA;EAAA,GAC5B,OAAO;IAAA;MAAA,OACJ,oBAAK,CAAC,KAAK,MAAG,uBAAuB,KAAK,CAAC,KAAK,EAAE,GAAG,qBAAqB;IAAA;IAAA;MAAA,OACrE,KAAK,CAAC,KAAK,IAAI,OAAO;IAAA;IAAA;MAAA,OAEjC,KAAK,CAAC,QAAQ;IAAA;EAAA;AAGrB","ignoreList":[]}
@@ -1,3 +1,4 @@
1
+ export * from "./Dashboard";
1
2
  export * from "./Widget";
2
3
  export * from "./WidgetHero";
3
4
  export * from "./WidgetList";
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["widgets/index.ts"],"sourcesContent":["export * from \"./Widget\";\nexport * from \"./WidgetHero\";\nexport * from \"./WidgetList\";\nexport * from \"./WidgetPills\";\nexport * from \"./WidgetStat\";\nexport * from \"./WidgetStatus\";\n"],"mappings":"AAAA,cAAc,UAAU;AACxB,cAAc,cAAc;AAC5B,cAAc,cAAc;AAC5B,cAAc,eAAe;AAC7B,cAAc,cAAc;AAC5B,cAAc,gBAAgB","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["widgets/index.ts"],"sourcesContent":["export * from \"./Dashboard\";\nexport * from \"./Widget\";\nexport * from \"./WidgetHero\";\nexport * from \"./WidgetList\";\nexport * from \"./WidgetPills\";\nexport * from \"./WidgetStat\";\nexport * from \"./WidgetStatus\";\n"],"mappings":"AAAA,cAAc,aAAa;AAC3B,cAAc,UAAU;AACxB,cAAc,cAAc;AAC5B,cAAc,cAAc;AAC5B,cAAc,eAAe;AAC7B,cAAc,cAAc;AAC5B,cAAc,gBAAgB","ignoreList":[]}
@@ -103,6 +103,9 @@ export function ContextMenuBase(props) {
103
103
  const close = () => {
104
104
  detachOpenListeners();
105
105
  if (!isOpen()) return;
106
+ // An activated entry closes the menu before its action runs: focus goes back to where the menu opened from, as
107
+ // Escape returns it, so the keyboard never lands on the page body.
108
+ if (menu?.contains(document.activeElement)) returnFocus(opener?.isConnected ? opener : host, hostRing);
106
109
  setPosition();
107
110
  if (closeActiveContextMenu === close) closeActiveContextMenu = undefined;
108
111
  props.onClose?.();