@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,160 @@
1
+ import { deltaText } from "../surfaces/delta-badge";
2
+ import { resolveStatCellMessages } from "../surfaces/stat-cell-messages";
3
+
4
+ /**
5
+ * What a column holds. It decides alignment, wrapping, the shown text, search and sort:
6
+ * text wraps; number, amount, bar, flow and delta read right-aligned with equal-width digits; date reads in the
7
+ * reader's language; status shows a badge from `states`.
8
+ */
9
+
10
+ /** A number format by name, as a portable description stores it. `decimals` fixes the fraction digits. */
11
+
12
+ /** The label and tone of one stored status value. */
13
+
14
+ /** The typed part of a column, independent of how the row stores its values. */
15
+
16
+ const numericTypes = new Set(["number", "amount", "bar", "flow", "delta"]);
17
+ export const isNumericColumnType = type => !!type && numericTypes.has(type);
18
+ const finite = value => {
19
+ if (typeof value === "number") return Number.isFinite(value) ? value : null;
20
+ if (typeof value === "string" && value.trim() !== "" && Number.isFinite(Number(value))) return Number(value);
21
+ return null;
22
+ };
23
+ const fractionDigits = decimals => {
24
+ if (decimals === undefined) return {};
25
+ const digits = Math.min(20, Math.max(0, Math.trunc(decimals) || 0));
26
+ return {
27
+ minimumFractionDigits: digits,
28
+ maximumFractionDigits: digits
29
+ };
30
+ };
31
+
32
+ /** Formats a number the way a typed column shows it: in the reader's language, by the column's format. */
33
+ export const formatTableNumber = (value, column, locale) => {
34
+ const format = column.format ?? {};
35
+ // An amount or a flow is money: with a currency it always reads as one, whatever `style` says.
36
+ const money = column.type === "amount" || column.type === "flow" || format.style === "currency";
37
+ const options = money && format.currency ? {
38
+ style: "currency",
39
+ currency: format.currency
40
+ } : format.style === "percent" ? {
41
+ style: "percent",
42
+ maximumFractionDigits: 1
43
+ } : {
44
+ maximumFractionDigits: 3
45
+ };
46
+ return new Intl.NumberFormat(locale, {
47
+ ...options,
48
+ ...(format.compact ? {
49
+ notation: "compact",
50
+ maximumFractionDigits: 1
51
+ } : {}),
52
+ ...fractionDigits(format.decimals)
53
+ }).format(Object.is(value, -0) ? 0 : value);
54
+ };
55
+ const dateOnly = /^\d{4}-\d{2}-\d{2}$/;
56
+ /** A date column reads ISO text, a timestamp or a Date; a day without a time stays that day in every zone. */
57
+ export const formatTableDate = (value, locale, timeZone) => {
58
+ if (typeof value === "string" && dateOnly.test(value)) {
59
+ const day = new Date(`${value}T00:00:00Z`);
60
+ return Number.isNaN(day.getTime()) ? null : new Intl.DateTimeFormat(locale, {
61
+ dateStyle: "medium",
62
+ timeZone: "UTC"
63
+ }).format(day);
64
+ }
65
+ const date = value instanceof Date ? value : typeof value === "string" || typeof value === "number" ? new Date(value) : null;
66
+ if (!date || Number.isNaN(date.getTime())) return null;
67
+ return new Intl.DateTimeFormat(locale, {
68
+ dateStyle: "medium",
69
+ timeStyle: "short",
70
+ timeZone
71
+ }).format(date);
72
+ };
73
+
74
+ /** True when the value is missing: such a cell shows a dash, sorts last and never counts as zero. */
75
+ export const isEmptyCell = value => value === null || value === undefined || value === "";
76
+
77
+ /**
78
+ * The text a typed cell shows, for search, grouping and copied rows. A flow is the amount without its sign, as the
79
+ * arrow says the direction; a delta is its signed change.
80
+ */
81
+ export const tableCellText = (value, column, locale) => {
82
+ if (isEmptyCell(value)) return "";
83
+ const type = column.type ?? "text";
84
+ if (type === "status") return column.states?.[String(value)]?.label ?? String(value);
85
+ if (type === "date") return formatTableDate(value, locale, column.timeZone) ?? String(value);
86
+ if (isNumericColumnType(type)) {
87
+ const number = finite(value);
88
+ if (number === null) return String(value);
89
+ if (type === "delta") return deltaText({
90
+ value: number,
91
+ unit: column.delta?.unit
92
+ }, locale, resolveStatCellMessages(locale));
93
+ return formatTableNumber(type === "flow" ? Math.abs(number) : number, column, locale);
94
+ }
95
+ return typeof value === "object" ? JSON.stringify(value) : String(value);
96
+ };
97
+
98
+ /** The value a typed column sorts by: numbers by value, dates by time, a status by its label, the rest as text. */
99
+ export const tableSortValue = (value, column, locale) => {
100
+ if (isEmptyCell(value)) return null;
101
+ const type = column.type ?? "text";
102
+ if (isNumericColumnType(type)) return finite(value);
103
+ if (type === "date") {
104
+ const time = value instanceof Date ? value.getTime() : typeof value === "number" ? value : Date.parse(String(value));
105
+ return Number.isFinite(time) ? time : null;
106
+ }
107
+ if (typeof value === "number") return value;
108
+ return tableCellText(value, column, locale);
109
+ };
110
+ export const readTableValue = (row, column) => typeof column.value === "function" ? column.value(row) : column.value ? row[column.value] : undefined;
111
+
112
+ /**
113
+ * The rows any of whose shown values contains the query, ignoring case and accents. An empty query keeps every row.
114
+ * Matches the text a reader sees, so a status matches by its label and an amount as it is formatted.
115
+ */
116
+ export const filterRows = (rows, columns, query, locale) => {
117
+ const fold = text => text.normalize("NFD").replace(/\p{Diacritic}/gu, "").toLocaleLowerCase(locale);
118
+ const needle = fold(query.trim());
119
+ if (!needle) return [...rows];
120
+ return rows.filter(row => columns.some(column => fold(tableCellText(readTableValue(row, column), column, locale)).includes(needle)));
121
+ };
122
+
123
+ /** Rows in the order of one column: values first, missing values last in both directions. */
124
+ export const sortRows = (rows, columns, sort, locale) => {
125
+ const column = sort ? columns.find(entry => entry.id === sort.key) : undefined;
126
+ if (!sort || !column) return [...rows];
127
+ const collator = new Intl.Collator(locale, {
128
+ numeric: true
129
+ });
130
+ const keyed = rows.map((row, index) => ({
131
+ row,
132
+ index,
133
+ key: tableSortValue(readTableValue(row, column), column, locale)
134
+ }));
135
+ const factor = sort.direction === "asc" ? 1 : -1;
136
+ keyed.sort((a, b) => {
137
+ if (a.key === null || b.key === null) return a.key === b.key ? a.index - b.index : a.key === null ? 1 : -1;
138
+ const order = typeof a.key === "number" && typeof b.key === "number" ? a.key - b.key : collator.compare(String(a.key), String(b.key));
139
+ return order * factor || a.index - b.index;
140
+ });
141
+ return keyed.map(entry => entry.row);
142
+ };
143
+
144
+ /** Rows split by one column, in the order each group first appears; the label is the group's shown value. */
145
+ export const groupRows = (rows, column, locale) => {
146
+ const groups = new Map();
147
+ for (const row of rows) {
148
+ const value = readTableValue(row, column);
149
+ const key = isEmptyCell(value) ? "" : String(value);
150
+ const group = groups.get(key) ?? {
151
+ key,
152
+ label: tableCellText(value, column, locale),
153
+ rows: []
154
+ };
155
+ group.rows.push(row);
156
+ groups.set(key, group);
157
+ }
158
+ return [...groups.values()];
159
+ };
160
+ //# sourceMappingURL=data-table-columns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["content/data-table-columns.ts"],"sourcesContent":["import { deltaText } from \"../surfaces/delta-badge\";\nimport type { StatusTone } from \"../surfaces/StatusBadge\";\nimport { resolveStatCellMessages } from \"../surfaces/stat-cell-messages\";\n\n/**\n * What a column holds. It decides alignment, wrapping, the shown text, search and sort:\n * text wraps; number, amount, bar, flow and delta read right-aligned with equal-width digits; date reads in the\n * reader's language; status shows a badge from `states`.\n */\nexport type DataTableColumnType = \"text\" | \"number\" | \"date\" | \"status\" | \"bar\" | \"amount\" | \"flow\" | \"delta\";\n\n/** A number format by name, as a portable description stores it. `decimals` fixes the fraction digits. */\nexport type DataTableNumberFormat = {\n style?: \"number\" | \"percent\" | \"currency\";\n /** ISO 4217 code; required for `style: \"currency\"`, `amount` and `flow`. */\n currency?: string;\n decimals?: number;\n compact?: boolean;\n};\n\n/** The label and tone of one stored status value. */\nexport type DataTableStatusState = { label: string; tone: StatusTone };\n\n/** The typed part of a column, independent of how the row stores its values. */\nexport type DataTableTypedColumn = {\n type?: DataTableColumnType;\n format?: DataTableNumberFormat;\n /** Labels and tones of a status column, by stored value. */\n states?: Readonly<Record<string, DataTableStatusState>>;\n /** The value a bar column fills its track at; defaults to the largest value in the rows. */\n max?: number;\n /** The IANA zone a date column with a time reads in, such as the zone of the data's owner; defaults to the reader's. */\n timeZone?: string;\n /** How a delta column reads its change: `ratio` (default) `0.082` as `+8.2 %`, `points` `0.031` as `+3.1 pts`; `better` rates it. */\n delta?: { unit?: \"ratio\" | \"points\"; better?: \"up\" | \"down\" };\n};\n\nconst numericTypes = new Set<DataTableColumnType>([\"number\", \"amount\", \"bar\", \"flow\", \"delta\"]);\nexport const isNumericColumnType = (type?: DataTableColumnType): boolean => !!type && numericTypes.has(type);\n\nconst finite = (value: unknown): number | null => {\n if (typeof value === \"number\") return Number.isFinite(value) ? value : null;\n if (typeof value === \"string\" && value.trim() !== \"\" && Number.isFinite(Number(value))) return Number(value);\n return null;\n};\n\nconst fractionDigits = (decimals?: number) => {\n if (decimals === undefined) return {};\n const digits = Math.min(20, Math.max(0, Math.trunc(decimals) || 0));\n return { minimumFractionDigits: digits, maximumFractionDigits: digits };\n};\n\n/** Formats a number the way a typed column shows it: in the reader's language, by the column's format. */\nexport const formatTableNumber = (value: number, column: DataTableTypedColumn, locale: string): string => {\n const format = column.format ?? {};\n // An amount or a flow is money: with a currency it always reads as one, whatever `style` says.\n const money = column.type === \"amount\" || column.type === \"flow\" || format.style === \"currency\";\n const options: Intl.NumberFormatOptions =\n money && format.currency\n ? { style: \"currency\", currency: format.currency }\n : format.style === \"percent\"\n ? { style: \"percent\", maximumFractionDigits: 1 }\n : { maximumFractionDigits: 3 };\n return new Intl.NumberFormat(locale, {\n ...options,\n ...(format.compact ? { notation: \"compact\", maximumFractionDigits: 1 } : {}),\n ...fractionDigits(format.decimals),\n }).format(Object.is(value, -0) ? 0 : value);\n};\n\nconst dateOnly = /^\\d{4}-\\d{2}-\\d{2}$/;\n/** A date column reads ISO text, a timestamp or a Date; a day without a time stays that day in every zone. */\nexport const formatTableDate = (value: unknown, locale: string, timeZone?: string): string | null => {\n if (typeof value === \"string\" && dateOnly.test(value)) {\n const day = new Date(`${value}T00:00:00Z`);\n return Number.isNaN(day.getTime()) ? null : new Intl.DateTimeFormat(locale, { dateStyle: \"medium\", timeZone: \"UTC\" }).format(day);\n }\n const date = value instanceof Date ? value : typeof value === \"string\" || typeof value === \"number\" ? new Date(value) : null;\n if (!date || Number.isNaN(date.getTime())) return null;\n return new Intl.DateTimeFormat(locale, { dateStyle: \"medium\", timeStyle: \"short\", timeZone }).format(date);\n};\n\n/** True when the value is missing: such a cell shows a dash, sorts last and never counts as zero. */\nexport const isEmptyCell = (value: unknown): boolean => value === null || value === undefined || value === \"\";\n\n/**\n * The text a typed cell shows, for search, grouping and copied rows. A flow is the amount without its sign, as the\n * arrow says the direction; a delta is its signed change.\n */\nexport const tableCellText = (value: unknown, column: DataTableTypedColumn, locale: string): string => {\n if (isEmptyCell(value)) return \"\";\n const type = column.type ?? \"text\";\n if (type === \"status\") return column.states?.[String(value)]?.label ?? String(value);\n if (type === \"date\") return formatTableDate(value, locale, column.timeZone) ?? String(value);\n if (isNumericColumnType(type)) {\n const number = finite(value);\n if (number === null) return String(value);\n if (type === \"delta\") return deltaText({ value: number, unit: column.delta?.unit }, locale, resolveStatCellMessages(locale));\n return formatTableNumber(type === \"flow\" ? Math.abs(number) : number, column, locale);\n }\n return typeof value === \"object\" ? JSON.stringify(value) : String(value);\n};\n\n/** The value a typed column sorts by: numbers by value, dates by time, a status by its label, the rest as text. */\nexport const tableSortValue = (value: unknown, column: DataTableTypedColumn, locale: string): number | string | null => {\n if (isEmptyCell(value)) return null;\n const type = column.type ?? \"text\";\n if (isNumericColumnType(type)) return finite(value);\n if (type === \"date\") {\n const time = value instanceof Date ? value.getTime() : typeof value === \"number\" ? value : Date.parse(String(value));\n return Number.isFinite(time) ? time : null;\n }\n if (typeof value === \"number\") return value;\n return tableCellText(value, column, locale);\n};\n\ntype Readable<T> = DataTableTypedColumn & { id: string; value?: keyof T | ((row: T) => unknown) };\n\nexport const readTableValue = <T>(row: T, column: Readable<T>): unknown =>\n typeof column.value === \"function\" ? column.value(row) : column.value ? row[column.value] : undefined;\n\n/**\n * The rows any of whose shown values contains the query, ignoring case and accents. An empty query keeps every row.\n * Matches the text a reader sees, so a status matches by its label and an amount as it is formatted.\n */\nexport const filterRows = <T>(rows: readonly T[], columns: readonly Readable<T>[], query: string, locale: string): T[] => {\n const fold = (text: string) =>\n text\n .normalize(\"NFD\")\n .replace(/\\p{Diacritic}/gu, \"\")\n .toLocaleLowerCase(locale);\n const needle = fold(query.trim());\n if (!needle) return [...rows];\n return rows.filter((row) => columns.some((column) => fold(tableCellText(readTableValue(row, column), column, locale)).includes(needle)));\n};\n\n/** Rows in the order of one column: values first, missing values last in both directions. */\nexport const sortRows = <T>(\n rows: readonly T[],\n columns: readonly Readable<T>[],\n sort: { key: string; direction: \"asc\" | \"desc\" } | null | undefined,\n locale: string,\n): T[] => {\n const column = sort ? columns.find((entry) => entry.id === sort.key) : undefined;\n if (!sort || !column) return [...rows];\n const collator = new Intl.Collator(locale, { numeric: true });\n const keyed = rows.map((row, index) => ({ row, index, key: tableSortValue(readTableValue(row, column), column, locale) }));\n const factor = sort.direction === \"asc\" ? 1 : -1;\n keyed.sort((a, b) => {\n if (a.key === null || b.key === null) return a.key === b.key ? a.index - b.index : a.key === null ? 1 : -1;\n const order = typeof a.key === \"number\" && typeof b.key === \"number\" ? a.key - b.key : collator.compare(String(a.key), String(b.key));\n return order * factor || a.index - b.index;\n });\n return keyed.map((entry) => entry.row);\n};\n\n/** Rows split by one column, in the order each group first appears; the label is the group's shown value. */\nexport const groupRows = <T>(rows: readonly T[], column: Readable<T>, locale: string): { key: string; label: string; rows: T[] }[] => {\n const groups = new Map<string, { key: string; label: string; rows: T[] }>();\n for (const row of rows) {\n const value = readTableValue(row, column);\n const key = isEmptyCell(value) ? \"\" : String(value);\n const group = groups.get(key) ?? { key, label: tableCellText(value, column, locale), rows: [] };\n group.rows.push(row);\n groups.set(key, group);\n }\n return [...groups.values()];\n};\n"],"mappings":"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","ignoreList":[]}
@@ -7,13 +7,49 @@ const dataTableMessages = i18n.define({
7
7
  dataTable: "Data table",
8
8
  noColumns: "No columns.",
9
9
  noRecords: "No records",
10
- loadingRows: "Loading rows"
10
+ loadingRows: "Loading rows",
11
+ noMatch: ({
12
+ query
13
+ }) => `No row matches “${query}”.`,
14
+ clearSearch: "Clear search",
15
+ details: "Details",
16
+ showDetails: "Show the row's hidden values",
17
+ rowCount: ({
18
+ count
19
+ }) => count === 1 ? "1 row" : `${count} rows`,
20
+ search: "Search",
21
+ searchTable: ({
22
+ label
23
+ }) => `Search ${label}`,
24
+ groupRows: "Group rows",
25
+ notGrouped: "Not grouped",
26
+ groupedBy: ({
27
+ label
28
+ }) => `By ${label}`
11
29
  },
12
30
  de: {
13
31
  dataTable: "Datentabelle",
14
32
  noColumns: "Keine Spalten.",
15
33
  noRecords: "Keine Einträge",
16
- loadingRows: "Zeilen werden geladen"
34
+ loadingRows: "Zeilen werden geladen",
35
+ noMatch: ({
36
+ query
37
+ }) => `Keine Zeile passt zu „${query}“.`,
38
+ clearSearch: "Suche löschen",
39
+ details: "Details",
40
+ showDetails: "Ausgeblendete Werte der Zeile zeigen",
41
+ rowCount: ({
42
+ count
43
+ }) => count === 1 ? "1 Zeile" : `${count} Zeilen`,
44
+ search: "Suchen",
45
+ searchTable: ({
46
+ label
47
+ }) => `${label} durchsuchen`,
48
+ groupRows: "Zeilen gruppieren",
49
+ notGrouped: "Nicht gruppiert",
50
+ groupedBy: ({
51
+ label
52
+ }) => `Nach ${label}`
17
53
  }
18
54
  }
19
55
  });
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["content/data-table-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\nconst dataTableMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n dataTable: \"Data table\",\n noColumns: \"No columns.\",\n noRecords: \"No records\",\n loadingRows: \"Loading rows\",\n },\n de: {\n dataTable: \"Datentabelle\",\n noColumns: \"Keine Spalten.\",\n noRecords: \"Keine Einträge\",\n loadingRows: \"Zeilen werden geladen\",\n },\n },\n});\n\nexport type DataTableMessages = ReturnType<(typeof dataTableMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from the inherited render locale. */\nexport const useDataTableMessages = (): (() => DataTableMessages) => {\n const locale = useLocale();\n return () => dataTableMessages.resolve([locale()]).t;\n};\n\nexport const checkDataTableMessages = () => dataTableMessages.check();\n"],"mappings":"AAAA,SAAS,IAAI,QAAQ,aAAa;AAClC,SAAS,SAAS,QAAQ,gBAAgB;AAE1C,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC;EACpC,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE;IACR,EAAE,EAAE;MACF,SAAS,EAAE,YAAY;MACvB,SAAS,EAAE,aAAa;MACxB,SAAS,EAAE,YAAY;MACvB,WAAW,EAAE;IACf,CAAC;IACD,EAAE,EAAE;MACF,SAAS,EAAE,cAAc;MACzB,SAAS,EAAE,gBAAgB;MAC3B,SAAS,EAAE,gBAAgB;MAC3B,WAAW,EAAE;IACf;EACF;AACF,CAAC,CAAC;AAIF;AACA,OAAO,MAAM,oBAAoB,GAAG,MAAiC;EACnE,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,OAAO,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,OAAO,MAAM,sBAAsB,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["content/data-table-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\nconst dataTableMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n dataTable: \"Data table\",\n noColumns: \"No columns.\",\n noRecords: \"No records\",\n loadingRows: \"Loading rows\",\n noMatch: ({ query }: { query: string }) => `No row matches “${query}”.`,\n clearSearch: \"Clear search\",\n details: \"Details\",\n showDetails: \"Show the row's hidden values\",\n rowCount: ({ count }: { count: number }) => (count === 1 ? \"1 row\" : `${count} rows`),\n search: \"Search\",\n searchTable: ({ label }: { label: string }) => `Search ${label}`,\n groupRows: \"Group rows\",\n notGrouped: \"Not grouped\",\n groupedBy: ({ label }: { label: string }) => `By ${label}`,\n },\n de: {\n dataTable: \"Datentabelle\",\n noColumns: \"Keine Spalten.\",\n noRecords: \"Keine Einträge\",\n loadingRows: \"Zeilen werden geladen\",\n noMatch: ({ query }: { query: string }) => `Keine Zeile passt zu „${query}“.`,\n clearSearch: \"Suche löschen\",\n details: \"Details\",\n showDetails: \"Ausgeblendete Werte der Zeile zeigen\",\n rowCount: ({ count }: { count: number }) => (count === 1 ? \"1 Zeile\" : `${count} Zeilen`),\n search: \"Suchen\",\n searchTable: ({ label }: { label: string }) => `${label} durchsuchen`,\n groupRows: \"Zeilen gruppieren\",\n notGrouped: \"Nicht gruppiert\",\n groupedBy: ({ label }: { label: string }) => `Nach ${label}`,\n },\n },\n});\n\nexport type DataTableMessages = ReturnType<(typeof dataTableMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from the inherited render locale. */\nexport const useDataTableMessages = (): (() => DataTableMessages) => {\n const locale = useLocale();\n return () => dataTableMessages.resolve([locale()]).t;\n};\n\nexport const checkDataTableMessages = () => dataTableMessages.check();\n"],"mappings":"AAAA,SAAS,IAAI,QAAQ,aAAa;AAClC,SAAS,SAAS,QAAQ,gBAAgB;AAE1C,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC;EACpC,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE;IACR,EAAE,EAAE;MACF,SAAS,EAAE,YAAY;MACvB,SAAS,EAAE,aAAa;MACxB,SAAS,EAAE,YAAY;MACvB,WAAW,EAAE,cAAc;MAC3B,OAAO,EAAE,CAAC;QAAE;MAAyB,CAAC,KAAK,mBAAmB,KAAK,IAAI;MACvE,WAAW,EAAE,cAAc;MAC3B,OAAO,EAAE,SAAS;MAClB,WAAW,EAAE,8BAA8B;MAC3C,QAAQ,EAAE,CAAC;QAAE;MAAyB,CAAC,KAAM,KAAK,KAAK,CAAC,GAAG,OAAO,GAAG,GAAG,KAAK,OAAQ;MACrF,MAAM,EAAE,QAAQ;MAChB,WAAW,EAAE,CAAC;QAAE;MAAyB,CAAC,KAAK,UAAU,KAAK,EAAE;MAChE,SAAS,EAAE,YAAY;MACvB,UAAU,EAAE,aAAa;MACzB,SAAS,EAAE,CAAC;QAAE;MAAyB,CAAC,KAAK,MAAM,KAAK;IAC1D,CAAC;IACD,EAAE,EAAE;MACF,SAAS,EAAE,cAAc;MACzB,SAAS,EAAE,gBAAgB;MAC3B,SAAS,EAAE,gBAAgB;MAC3B,WAAW,EAAE,uBAAuB;MACpC,OAAO,EAAE,CAAC;QAAE;MAAyB,CAAC,KAAK,yBAAyB,KAAK,IAAI;MAC7E,WAAW,EAAE,eAAe;MAC5B,OAAO,EAAE,SAAS;MAClB,WAAW,EAAE,sCAAsC;MACnD,QAAQ,EAAE,CAAC;QAAE;MAAyB,CAAC,KAAM,KAAK,KAAK,CAAC,GAAG,SAAS,GAAG,GAAG,KAAK,SAAU;MACzF,MAAM,EAAE,QAAQ;MAChB,WAAW,EAAE,CAAC;QAAE;MAAyB,CAAC,KAAK,GAAG,KAAK,cAAc;MACrE,SAAS,EAAE,mBAAmB;MAC9B,UAAU,EAAE,iBAAiB;MAC7B,SAAS,EAAE,CAAC;QAAE;MAAyB,CAAC,KAAK,QAAQ,KAAK;IAC5D;EACF;AACF,CAAC,CAAC;AAIF;AACA,OAAO,MAAM,oBAAoB,GAAG,MAAiC;EACnE,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,OAAO,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,OAAO,MAAM,sBAAsB,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,26 @@
1
+ import { i18n } from "@k2b/stdlib";
2
+ import { useLocale } from "../intl/locale";
3
+ const flowAmountMessages = i18n.define({
4
+ baseLocale: "en",
5
+ messages: {
6
+ en: {
7
+ in: "incoming",
8
+ out: "outgoing",
9
+ none: "no amount",
10
+ invalid: "amount unknown"
11
+ },
12
+ de: {
13
+ in: "Eingang",
14
+ out: "Ausgang",
15
+ none: "kein Betrag",
16
+ invalid: "Betrag unbekannt"
17
+ }
18
+ }
19
+ });
20
+ /** Resolved from an explicit locale override, else the inherited render locale. */
21
+ export const useFlowAmountMessages = override => {
22
+ const locale = useLocale();
23
+ return () => flowAmountMessages.resolve([override?.() ?? locale()]).t;
24
+ };
25
+ export const checkFlowAmountMessages = () => flowAmountMessages.check();
26
+ //# sourceMappingURL=flow-amount-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["content/flow-amount-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\nconst flowAmountMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n in: \"incoming\",\n out: \"outgoing\",\n none: \"no amount\",\n invalid: \"amount unknown\",\n },\n de: {\n in: \"Eingang\",\n out: \"Ausgang\",\n none: \"kein Betrag\",\n invalid: \"Betrag unbekannt\",\n },\n },\n});\n\nexport type FlowAmountMessages = ReturnType<(typeof flowAmountMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from an explicit locale override, else the inherited render locale. */\nexport const useFlowAmountMessages = (override?: () => string | undefined): (() => FlowAmountMessages) => {\n const locale = useLocale();\n return () => flowAmountMessages.resolve([override?.() ?? locale()]).t;\n};\n\nexport const checkFlowAmountMessages = () => flowAmountMessages.check();\n"],"mappings":"AAAA,SAAS,IAAI,QAAQ,aAAa;AAClC,SAAS,SAAS,QAAQ,gBAAgB;AAE1C,MAAM,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC;EACrC,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE;IACR,EAAE,EAAE;MACF,EAAE,EAAE,UAAU;MACd,GAAG,EAAE,UAAU;MACf,IAAI,EAAE,WAAW;MACjB,OAAO,EAAE;IACX,CAAC;IACD,EAAE,EAAE;MACF,EAAE,EAAE,SAAS;MACb,GAAG,EAAE,SAAS;MACd,IAAI,EAAE,aAAa;MACnB,OAAO,EAAE;IACX;EACF;AACF,CAAC,CAAC;AAIF;AACA,OAAO,MAAM,qBAAqB,GAAI,QAAmC,IAAiC;EACxG,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,OAAO,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC,QAAQ,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,OAAO,MAAM,uBAAuB,GAAG,MAAM,kBAAkB,CAAC,KAAK,CAAC,CAAC","ignoreList":[]}
@@ -1,3 +1,4 @@
1
+ export { BalanceSummary } from "./BalanceSummary";
1
2
  export { default as Calendar } from "./Calendar";
2
3
  export { default as Chart } from "./Chart";
3
4
  export { ChartExplorer } from "./ChartExplorer";
@@ -11,12 +12,15 @@ export { prepareChartSnapshot } from "./chart-snapshot";
11
12
  export { highlightSql } from "./code-highlight";
12
13
  export { createCollectionSelection } from "./collection-selection";
13
14
  export { default as DataTable } from "./DataTable";
15
+ export { createDataTableView, DataTableTools } from "./DataTableTools";
14
16
  export { DocCode, DocConceptGrid, DocInlineCode, DocLead, DocNote, DocPage, DocRows, DocSection } from "./Docs";
17
+ export { filterRows, sortRows } from "./data-table-columns";
15
18
  export { FileBrowserPanel, openFileBrowser } from "./FileBrowser";
16
19
  export { FileGrid } from "./FileGrid";
17
20
  export { default as FileTree } from "./FileTree";
18
21
  export { FileTypeIcon, fileKindLabel, fileTypeOf } from "./FileTypeIcon";
19
22
  export { canPreviewFile, default as FileView, formatFileViewSize, getFileViewPreviewKind } from "./FileView";
23
+ export { FlowAmount, flowDirection } from "./FlowAmount";
20
24
  export { Kbd } from "./Kbd";
21
25
  export { LabelChip } from "./LabelChip";
22
26
  export { default as Lightbox } from "./Lightbox";
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["content/index.ts"],"sourcesContent":["export type {\n CalendarAttendee,\n CalendarCommand,\n CalendarController,\n CalendarCustomView,\n CalendarDayBadge,\n CalendarEvent,\n CalendarEventColor,\n CalendarEventLink,\n CalendarEventRenderContext,\n CalendarEventTimeChange,\n CalendarExternalDrag,\n CalendarLabels,\n CalendarProps,\n CalendarQuickCreateControls,\n CalendarRange,\n CalendarRecurrence,\n CalendarResource,\n CalendarSelectionControls,\n CalendarView,\n} from \"./Calendar\";\nexport { default as Calendar } from \"./Calendar\";\n\nexport type { ChartKind, ChartLabels, ChartProps, ChartRenderOptions } from \"./Chart\";\nexport { default as Chart } from \"./Chart\";\nexport type { ChartExplorerColumn, ChartExplorerProps, ChartLegendEntry } from \"./ChartExplorer\";\nexport { ChartExplorer } from \"./ChartExplorer\";\nexport type { ChartExplorerControlsProps } from \"./ChartExplorerControls\";\nexport { ChartExplorerControls } from \"./ChartExplorerControls\";\nexport { ChartFilterControls, type ChartFilterControlsProps } from \"./ChartFilterControls\";\nexport { ChartSnapshotView } from \"./ChartSnapshotView\";\nexport type { CodeDisplayLanguage, CodeDisplayProps } from \"./CodeDisplay\";\nexport { default as CodeDisplay } from \"./CodeDisplay\";\nexport { type ChartCursor, createChartCursor } from \"./chart-cursor\";\nexport type {\n ChartExplorerCharts,\n ChartExplorerController,\n ChartExplorerData,\n ChartExplorerOptions,\n ChartExplorerRequest,\n ChartExplorerRow,\n ChartExplorerSnapshot,\n} from \"./chart-explorer\";\nexport { createChartExplorer } from \"./chart-explorer\";\nexport type { ChartDatumRef, ChartSelection, ChartTooltip, ChartTooltipFormatter } from \"./chart-inspection-core\";\nexport type { ChartSnapshot } from \"./chart-snapshot\";\nexport { prepareChartSnapshot } from \"./chart-snapshot\";\nexport type {\n StateTimelineChartOptions,\n StateTimelineDomain,\n StateTimelineInterval,\n StateTimelineRow,\n StateTimelineState,\n} from \"./chart-state-timeline\";\nexport { highlightSql } from \"./code-highlight\";\nexport { type CollectionSelection, createCollectionSelection, type SelectionModifiers } from \"./collection-selection\";\nexport type {\n DataTableColumn,\n DataTableControlsProps,\n DataTableFooter,\n DataTableHeaderProps,\n DataTablePanelFooterProps,\n DataTablePanelProps,\n DataTableProps,\n DataTableRenderCell,\n DataTableRenderHeader,\n DataTableSort,\n} from \"./DataTable\";\nexport { default as DataTable } from \"./DataTable\";\nexport type { DocCodeHighlighter, DocCodeProps, DocConcept, DocNoteVariant, DocRow } from \"./Docs\";\nexport { DocCode, DocConceptGrid, DocInlineCode, DocLead, DocNote, DocPage, DocRows, DocSection } from \"./Docs\";\nexport { FileBrowserPanel, type FileBrowserPanelProps, type FileSource, openFileBrowser } from \"./FileBrowser\";\nexport { FileGrid, type FileGridGroup, type FileGridOpenProps, type FileGridProps, type FileGridSelectableProps } from \"./FileGrid\";\nexport { default as FileTree, type FileTreeActions, type FileTreeEntry, type FileTreeProps } from \"./FileTree\";\nexport { type FileType, FileTypeIcon, type FileTypeIconProps, fileKindLabel, fileTypeOf } from \"./FileTypeIcon\";\nexport {\n canPreviewFile,\n default as FileView,\n type FileViewContent,\n type FileViewFile,\n type FileViewPreviewKind,\n type FileViewProps,\n type FileViewRenderer,\n type FileViewRendererProps,\n formatFileViewSize,\n getFileViewPreviewKind,\n} from \"./FileView\";\nexport type { KbdProps } from \"./Kbd\";\nexport { Kbd } from \"./Kbd\";\nexport type { LabelChipProps } from \"./LabelChip\";\nexport { LabelChip } from \"./LabelChip\";\nexport type { LightboxAction, LightboxImage } from \"./Lightbox\";\nexport { default as Lightbox } from \"./Lightbox\";\nexport type { LogTableEntry } from \"./LogEntriesTable\";\nexport { default as LogEntriesTable } from \"./LogEntriesTable\";\nexport { MapAttribution } from \"./MapAttribution\";\nexport { MapView } from \"./MapView\";\nexport { MapViewFrame } from \"./MapViewFrame\";\nexport { default as MarkdownView, type MarkdownRenderOptions, type MarkdownViewProps, renderSafeMarkdown } from \"./MarkdownView\";\nexport { type MatchRange, MatchText, type MatchTextProps, matchParts } from \"./MatchText\";\nexport type {\n MessageEventGroupProps,\n MessageEventRowProps,\n MessageGroupEntry,\n MessageRowAction,\n MessageRowAttachment,\n MessageRowAuthor,\n MessageRowFile,\n MessageRowMedia,\n MessageRowOrigin,\n MessageRowProgress,\n MessageRowProps,\n MessageRowQuote,\n MessageRowReaction,\n MessageRowStatus,\n MessageRowThread,\n MessageSystemRowProps,\n} from \"./MessageRow\";\nexport { MessageEventGroup, MessageEventRow, MessageRow, MessageSystemRow, startsMessageGroup } from \"./MessageRow\";\nexport { type MapPaletteColors, type MapTheme, mapPalette } from \"./map-palette\";\nexport { type MapStyleOptions, mapAttribution, mapStyle } from \"./map-style\";\nexport { MAP_SNAPSHOT_MAX_PIXELS, MapSnapshotError, type MapSnapshotErrorCode } from \"./map-view-snapshot\";\nexport type {\n MapViewArea,\n MapViewFit,\n MapViewFrameProps,\n MapViewHandle,\n MapViewLine,\n MapViewLineTone,\n MapViewMarker,\n MapViewOwnLocation,\n MapViewPoint,\n MapViewProps,\n MapViewSnapshot,\n MapViewSnapshotOptions,\n MapViewStyle,\n MapViewStyleSource,\n MapViewTone,\n} from \"./map-view-types\";\nexport {\n MARKDOWN_CALLOUT_CLASSES,\n MARKDOWN_CALLOUT_ICON_ATTRIBUTES,\n type MarkdownInfoBlock,\n type MarkdownInfoBlockRenderInput,\n type MarkdownInfoBlockType,\n markdownInfoBlocks,\n renderMarkdownInfoBlock,\n scanMarkdownInfoBlock,\n} from \"./markdown-info-blocks\";\nexport {\n type MarkdownLinkInput,\n type MarkdownReference,\n type MarkdownReferenceKind,\n type MarkdownReferenceType,\n markdownLinkReference,\n markdownReferenceIcon,\n markdownReferenceType,\n markdownReferenceTypeLabel,\n markStandaloneLinks,\n renderMarkdownLink,\n} from \"./markdown-links\";\nexport { Pagination, type PaginationProps } from \"./Pagination\";\nexport type { PdfPreviewProps, PdfPreviewRequest } from \"./PdfPreview\";\nexport { default as PdfPreview } from \"./PdfPreview\";\nexport type { RangeOption, RangePickerProps } from \"./RangePicker\";\nexport { default as RangePicker } from \"./RangePicker\";\nexport { ReactionBar, type ReactionBarItem, type ReactionBarProps } from \"./ReactionBar\";\nexport type {\n ReferenceChipObjectProps,\n ReferenceChipPersonProps,\n ReferenceChipProps,\n ReferenceChipTimeProps,\n} from \"./ReferenceChip\";\nexport { REFERENCE_CHIP_MAX_CHARACTERS, ReferenceChip, truncateMiddle } from \"./ReferenceChip\";\nexport type { StepsProps } from \"./Steps\";\nexport { Steps } from \"./Steps\";\nexport type { StructuredDataPreviewMode, StructuredDataPreviewProps, StructuredDataValue } from \"./StructuredDataPreview\";\nexport { default as StructuredDataPreview, isStructuredDataValue } from \"./StructuredDataPreview\";\nexport type { TimelineColor, TimelineController, TimelineItem, TimelineProps } from \"./Timeline\";\nexport { default as Timeline } from \"./Timeline\";\nexport { VideoPlayer, type VideoPlayerProps } from \"./VideoPlayer\";\nexport type { VirtualFeedController, VirtualFeedProps, VirtualFeedScrollOptions } from \"./VirtualFeed\";\nexport { VirtualFeed } from \"./VirtualFeed\";\nexport type { ZoomPanAction, ZoomPanFullscreen, ZoomPanViewportProps } from \"./ZoomPanViewport\";\nexport { ZoomPanViewport } from \"./ZoomPanViewport\";\n"],"mappings":"AAqBA,SAAS,OAAO,IAAI,QAAQ,QAAQ,YAAY;AAGhD,SAAS,OAAO,IAAI,KAAK,QAAQ,SAAS;AAE1C,SAAS,aAAa,QAAQ,iBAAiB;AAE/C,SAAS,qBAAqB,QAAQ,yBAAyB;AAC/D,SAAS,mBAAmB,QAAuC,uBAAuB;AAC1F,SAAS,iBAAiB,QAAQ,qBAAqB;AAEvD,SAAS,OAAO,IAAI,WAAW,QAAQ,eAAe;AACtD,SAA2B,iBAAiB,QAAQ,gBAAgB;AAUpE,SAAS,mBAAmB,QAAQ,kBAAkB;AAGtD,SAAS,oBAAoB,QAAQ,kBAAkB;AAQvD,SAAS,YAAY,QAAQ,kBAAkB;AAC/C,SAAmC,yBAAyB,QAAiC,wBAAwB;AAarH,SAAS,OAAO,IAAI,SAAS,QAAQ,aAAa;AAElD,SAAS,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,QAAQ,QAAQ;AAC/G,SAAS,gBAAgB,EAA+C,eAAe,QAAQ,eAAe;AAC9G,SAAS,QAAQ,QAAsG,YAAY;AACnI,SAAS,OAAO,IAAI,QAAQ,QAAsE,YAAY;AAC9G,SAAwB,YAAY,EAA0B,aAAa,EAAE,UAAU,QAAQ,gBAAgB;AAC/G,SACE,cAAc,EACd,OAAO,IAAI,QAAQ,EAOnB,kBAAkB,EAClB,sBAAsB,QACjB,YAAY;AAEnB,SAAS,GAAG,QAAQ,OAAO;AAE3B,SAAS,SAAS,QAAQ,aAAa;AAEvC,SAAS,OAAO,IAAI,QAAQ,QAAQ,YAAY;AAEhD,SAAS,OAAO,IAAI,eAAe,QAAQ,mBAAmB;AAC9D,SAAS,cAAc,QAAQ,kBAAkB;AACjD,SAAS,OAAO,QAAQ,WAAW;AACnC,SAAS,YAAY,QAAQ,gBAAgB;AAC7C,SAAS,OAAO,IAAI,YAAY,EAAsD,kBAAkB,QAAQ,gBAAgB;AAChI,SAA0B,SAAS,EAAuB,UAAU,QAAQ,aAAa;AAmBzF,SAAS,iBAAiB,EAAE,eAAe,EAAE,UAAU,EAAE,gBAAgB,EAAE,kBAAkB,QAAQ,cAAc;AACnH,SAA+C,UAAU,QAAQ,eAAe;AAChF,SAA+B,cAAc,EAAE,QAAQ,QAAQ,aAAa;AAC5E,SAAS,uBAAuB,EAAE,gBAAgB,QAAmC,qBAAqB;AAkB1G,SACE,wBAAwB,EACxB,gCAAgC,EAIhC,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,QAChB,wBAAwB;AAC/B,SAKE,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,0BAA0B,EAC1B,mBAAmB,EACnB,kBAAkB,QACb,kBAAkB;AACzB,SAAS,UAAU,QAA8B,cAAc;AAE/D,SAAS,OAAO,IAAI,UAAU,QAAQ,cAAc;AAEpD,SAAS,OAAO,IAAI,WAAW,QAAQ,eAAe;AACtD,SAAS,WAAW,QAAqD,eAAe;AAOxF,SAAS,6BAA6B,EAAE,aAAa,EAAE,cAAc,QAAQ,iBAAiB;AAE9F,SAAS,KAAK,QAAQ,SAAS;AAE/B,SAAS,OAAO,IAAI,qBAAqB,EAAE,qBAAqB,QAAQ,yBAAyB;AAEjG,SAAS,OAAO,IAAI,QAAQ,QAAQ,YAAY;AAChD,SAAS,WAAW,QAA+B,eAAe;AAElE,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,eAAe,QAAQ,mBAAmB","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["content/index.ts"],"sourcesContent":["export type { ChartDateFormat, ChartDatum, ChartDatumRole, ChartFormat, ChartNumberFormat } from \"../charts/core\";\nexport { BalanceSummary, type BalanceSummaryProps } from \"./BalanceSummary\";\nexport type {\n CalendarAttendee,\n CalendarCommand,\n CalendarController,\n CalendarCustomView,\n CalendarDayBadge,\n CalendarEvent,\n CalendarEventColor,\n CalendarEventLink,\n CalendarEventRenderContext,\n CalendarEventTimeChange,\n CalendarExternalDrag,\n CalendarLabels,\n CalendarProps,\n CalendarQuickCreateControls,\n CalendarRange,\n CalendarRecurrence,\n CalendarResource,\n CalendarSelectionControls,\n CalendarView,\n} from \"./Calendar\";\nexport { default as Calendar } from \"./Calendar\";\n\nexport type { ChartKind, ChartKindProps, ChartLabels, ChartProps, ChartRenderOptions } from \"./Chart\";\nexport { default as Chart } from \"./Chart\";\nexport type { ChartExplorerColumn, ChartExplorerProps, ChartFrameRequest, ChartLegendEntry } from \"./ChartExplorer\";\nexport { ChartExplorer } from \"./ChartExplorer\";\nexport type { ChartExplorerControlsProps } from \"./ChartExplorerControls\";\nexport { ChartExplorerControls } from \"./ChartExplorerControls\";\nexport { ChartFilterControls, type ChartFilterControlsProps } from \"./ChartFilterControls\";\nexport { ChartSnapshotView } from \"./ChartSnapshotView\";\nexport type { CodeDisplayLanguage, CodeDisplayProps } from \"./CodeDisplay\";\nexport { default as CodeDisplay } from \"./CodeDisplay\";\nexport { type ChartCursor, createChartCursor } from \"./chart-cursor\";\nexport type {\n ChartExplorerCharts,\n ChartExplorerController,\n ChartExplorerData,\n ChartExplorerOptions,\n ChartExplorerRequest,\n ChartExplorerRow,\n ChartExplorerSnapshot,\n} from \"./chart-explorer\";\nexport { createChartExplorer } from \"./chart-explorer\";\nexport type { ChartDatumRef, ChartSelection, ChartTooltip, ChartTooltipFormatter } from \"./chart-inspection-core\";\nexport type { ChartSnapshot } from \"./chart-snapshot\";\nexport { prepareChartSnapshot } from \"./chart-snapshot\";\nexport type {\n StateTimelineChartOptions,\n StateTimelineDomain,\n StateTimelineInterval,\n StateTimelineRow,\n StateTimelineState,\n} from \"./chart-state-timeline\";\nexport type { ChartTimeAxis } from \"./chart-time-axis\";\nexport { highlightSql } from \"./code-highlight\";\nexport { type CollectionSelection, createCollectionSelection, type SelectionModifiers } from \"./collection-selection\";\nexport type {\n DataTableColumn,\n DataTableControlsProps,\n DataTableFooter,\n DataTableHeaderProps,\n DataTablePanelFooterProps,\n DataTablePanelProps,\n DataTableProps,\n DataTableRenderCell,\n DataTableRenderHeader,\n DataTableSort,\n} from \"./DataTable\";\nexport { default as DataTable } from \"./DataTable\";\nexport type { DataTableToolsProps, DataTableView, DataTableViewOptions } from \"./DataTableTools\";\nexport { createDataTableView, DataTableTools } from \"./DataTableTools\";\nexport type { DocCodeHighlighter, DocCodeProps, DocConcept, DocNoteVariant, DocRow } from \"./Docs\";\nexport { DocCode, DocConceptGrid, DocInlineCode, DocLead, DocNote, DocPage, DocRows, DocSection } from \"./Docs\";\nexport type {\n DataTableColumnType,\n DataTableNumberFormat,\n DataTableStatusState,\n DataTableTypedColumn,\n} from \"./data-table-columns\";\nexport { filterRows, sortRows } from \"./data-table-columns\";\nexport { FileBrowserPanel, type FileBrowserPanelProps, type FileSource, openFileBrowser } from \"./FileBrowser\";\nexport { FileGrid, type FileGridGroup, type FileGridOpenProps, type FileGridProps, type FileGridSelectableProps } from \"./FileGrid\";\nexport { default as FileTree, type FileTreeActions, type FileTreeEntry, type FileTreeProps } from \"./FileTree\";\nexport { type FileType, FileTypeIcon, type FileTypeIconProps, fileKindLabel, fileTypeOf } from \"./FileTypeIcon\";\nexport {\n canPreviewFile,\n default as FileView,\n type FileViewContent,\n type FileViewFile,\n type FileViewPreviewKind,\n type FileViewProps,\n type FileViewRenderer,\n type FileViewRendererProps,\n formatFileViewSize,\n getFileViewPreviewKind,\n} from \"./FileView\";\nexport { FlowAmount, type FlowAmountDirection, type FlowAmountProps, flowDirection } from \"./FlowAmount\";\nexport type { KbdProps } from \"./Kbd\";\nexport { Kbd } from \"./Kbd\";\nexport type { LabelChipProps } from \"./LabelChip\";\nexport { LabelChip } from \"./LabelChip\";\nexport type { LightboxAction, LightboxImage } from \"./Lightbox\";\nexport { default as Lightbox } from \"./Lightbox\";\nexport type { LogTableEntry } from \"./LogEntriesTable\";\nexport { default as LogEntriesTable } from \"./LogEntriesTable\";\nexport { MapAttribution } from \"./MapAttribution\";\nexport { MapView } from \"./MapView\";\nexport { MapViewFrame } from \"./MapViewFrame\";\nexport { default as MarkdownView, type MarkdownRenderOptions, type MarkdownViewProps, renderSafeMarkdown } from \"./MarkdownView\";\nexport { type MatchRange, MatchText, type MatchTextProps, matchParts } from \"./MatchText\";\nexport type {\n MessageEventGroupProps,\n MessageEventRowProps,\n MessageGroupEntry,\n MessageRowAction,\n MessageRowAttachment,\n MessageRowAuthor,\n MessageRowFile,\n MessageRowMedia,\n MessageRowOrigin,\n MessageRowProgress,\n MessageRowProps,\n MessageRowQuote,\n MessageRowReaction,\n MessageRowStatus,\n MessageRowThread,\n MessageSystemRowProps,\n} from \"./MessageRow\";\nexport { MessageEventGroup, MessageEventRow, MessageRow, MessageSystemRow, startsMessageGroup } from \"./MessageRow\";\nexport { type MapPaletteColors, type MapTheme, mapPalette } from \"./map-palette\";\nexport { type MapStyleOptions, mapAttribution, mapStyle } from \"./map-style\";\nexport { MAP_SNAPSHOT_MAX_PIXELS, MapSnapshotError, type MapSnapshotErrorCode } from \"./map-view-snapshot\";\nexport type {\n MapViewArea,\n MapViewFit,\n MapViewFrameProps,\n MapViewHandle,\n MapViewLine,\n MapViewLineTone,\n MapViewMarker,\n MapViewOwnLocation,\n MapViewPoint,\n MapViewProps,\n MapViewSnapshot,\n MapViewSnapshotOptions,\n MapViewStyle,\n MapViewStyleSource,\n MapViewTone,\n} from \"./map-view-types\";\nexport {\n MARKDOWN_CALLOUT_CLASSES,\n MARKDOWN_CALLOUT_ICON_ATTRIBUTES,\n type MarkdownInfoBlock,\n type MarkdownInfoBlockRenderInput,\n type MarkdownInfoBlockType,\n markdownInfoBlocks,\n renderMarkdownInfoBlock,\n scanMarkdownInfoBlock,\n} from \"./markdown-info-blocks\";\nexport {\n type MarkdownLinkInput,\n type MarkdownReference,\n type MarkdownReferenceKind,\n type MarkdownReferenceType,\n markdownLinkReference,\n markdownReferenceIcon,\n markdownReferenceType,\n markdownReferenceTypeLabel,\n markStandaloneLinks,\n renderMarkdownLink,\n} from \"./markdown-links\";\nexport { Pagination, type PaginationProps } from \"./Pagination\";\nexport type { PdfPreviewProps, PdfPreviewRequest } from \"./PdfPreview\";\nexport { default as PdfPreview } from \"./PdfPreview\";\nexport type { RangeOption, RangePickerProps } from \"./RangePicker\";\nexport { default as RangePicker } from \"./RangePicker\";\nexport { ReactionBar, type ReactionBarItem, type ReactionBarProps } from \"./ReactionBar\";\nexport type {\n ReferenceChipObjectProps,\n ReferenceChipPersonProps,\n ReferenceChipProps,\n ReferenceChipTimeProps,\n} from \"./ReferenceChip\";\nexport { REFERENCE_CHIP_MAX_CHARACTERS, ReferenceChip, truncateMiddle } from \"./ReferenceChip\";\nexport type { StepsProps } from \"./Steps\";\nexport { Steps } from \"./Steps\";\nexport type { StructuredDataPreviewMode, StructuredDataPreviewProps, StructuredDataValue } from \"./StructuredDataPreview\";\nexport { default as StructuredDataPreview, isStructuredDataValue } from \"./StructuredDataPreview\";\nexport type { TimelineColor, TimelineController, TimelineItem, TimelineProps } from \"./Timeline\";\nexport { default as Timeline } from \"./Timeline\";\nexport { VideoPlayer, type VideoPlayerProps } from \"./VideoPlayer\";\nexport type { VirtualFeedController, VirtualFeedProps, VirtualFeedScrollOptions } from \"./VirtualFeed\";\nexport { VirtualFeed } from \"./VirtualFeed\";\nexport type { ZoomPanAction, ZoomPanFullscreen, ZoomPanViewportProps } from \"./ZoomPanViewport\";\nexport { ZoomPanViewport } from \"./ZoomPanViewport\";\n"],"mappings":"AACA,SAAS,cAAc,QAAkC,kBAAkB;AAsB3E,SAAS,OAAO,IAAI,QAAQ,QAAQ,YAAY;AAGhD,SAAS,OAAO,IAAI,KAAK,QAAQ,SAAS;AAE1C,SAAS,aAAa,QAAQ,iBAAiB;AAE/C,SAAS,qBAAqB,QAAQ,yBAAyB;AAC/D,SAAS,mBAAmB,QAAuC,uBAAuB;AAC1F,SAAS,iBAAiB,QAAQ,qBAAqB;AAEvD,SAAS,OAAO,IAAI,WAAW,QAAQ,eAAe;AACtD,SAA2B,iBAAiB,QAAQ,gBAAgB;AAUpE,SAAS,mBAAmB,QAAQ,kBAAkB;AAGtD,SAAS,oBAAoB,QAAQ,kBAAkB;AASvD,SAAS,YAAY,QAAQ,kBAAkB;AAC/C,SAAmC,yBAAyB,QAAiC,wBAAwB;AAarH,SAAS,OAAO,IAAI,SAAS,QAAQ,aAAa;AAElD,SAAS,mBAAmB,EAAE,cAAc,QAAQ,kBAAkB;AAEtE,SAAS,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,QAAQ,QAAQ;AAO/G,SAAS,UAAU,EAAE,QAAQ,QAAQ,sBAAsB;AAC3D,SAAS,gBAAgB,EAA+C,eAAe,QAAQ,eAAe;AAC9G,SAAS,QAAQ,QAAsG,YAAY;AACnI,SAAS,OAAO,IAAI,QAAQ,QAAsE,YAAY;AAC9G,SAAwB,YAAY,EAA0B,aAAa,EAAE,UAAU,QAAQ,gBAAgB;AAC/G,SACE,cAAc,EACd,OAAO,IAAI,QAAQ,EAOnB,kBAAkB,EAClB,sBAAsB,QACjB,YAAY;AACnB,SAAS,UAAU,EAAkD,aAAa,QAAQ,cAAc;AAExG,SAAS,GAAG,QAAQ,OAAO;AAE3B,SAAS,SAAS,QAAQ,aAAa;AAEvC,SAAS,OAAO,IAAI,QAAQ,QAAQ,YAAY;AAEhD,SAAS,OAAO,IAAI,eAAe,QAAQ,mBAAmB;AAC9D,SAAS,cAAc,QAAQ,kBAAkB;AACjD,SAAS,OAAO,QAAQ,WAAW;AACnC,SAAS,YAAY,QAAQ,gBAAgB;AAC7C,SAAS,OAAO,IAAI,YAAY,EAAsD,kBAAkB,QAAQ,gBAAgB;AAChI,SAA0B,SAAS,EAAuB,UAAU,QAAQ,aAAa;AAmBzF,SAAS,iBAAiB,EAAE,eAAe,EAAE,UAAU,EAAE,gBAAgB,EAAE,kBAAkB,QAAQ,cAAc;AACnH,SAA+C,UAAU,QAAQ,eAAe;AAChF,SAA+B,cAAc,EAAE,QAAQ,QAAQ,aAAa;AAC5E,SAAS,uBAAuB,EAAE,gBAAgB,QAAmC,qBAAqB;AAkB1G,SACE,wBAAwB,EACxB,gCAAgC,EAIhC,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,QAChB,wBAAwB;AAC/B,SAKE,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,0BAA0B,EAC1B,mBAAmB,EACnB,kBAAkB,QACb,kBAAkB;AACzB,SAAS,UAAU,QAA8B,cAAc;AAE/D,SAAS,OAAO,IAAI,UAAU,QAAQ,cAAc;AAEpD,SAAS,OAAO,IAAI,WAAW,QAAQ,eAAe;AACtD,SAAS,WAAW,QAAqD,eAAe;AAOxF,SAAS,6BAA6B,EAAE,aAAa,EAAE,cAAc,QAAQ,iBAAiB;AAE9F,SAAS,KAAK,QAAQ,SAAS;AAE/B,SAAS,OAAO,IAAI,qBAAqB,EAAE,qBAAqB,QAAQ,yBAAyB;AAEjG,SAAS,OAAO,IAAI,QAAQ,QAAQ,YAAY;AAChD,SAAS,WAAW,QAA+B,eAAe;AAElE,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,eAAe,QAAQ,mBAAmB","ignoreList":[]}
@@ -56,7 +56,7 @@ import { isWeekendKey } from "../intl/weekend";
56
56
  import { dateInputPattern, formatDateInput, parseDateInput } from "./date-input";
57
57
  import { resolveDateInputMessages } from "./date-input-messages";
58
58
  import { draftStatusText, errorText, formatDateLong, limitErrorText, rangeStatusText, restStatusText, spokenDateText, typingStatusText } from "./date-input-status";
59
- import { dateKey, displayDate, filterTimeInput, formatDateOnlyRangeDuration, formatDateTimeValue, inRange, isCompleteTime, isDateKey, isRangeEdge, monthDate, monthNames, msUntilNextDay, normalizeTimeInput, parseDateValue, pickerContext, pickRangeDay, previewRange, rangeAnchor, resolveFocusDay, splitDateTime, toDateTimeValue, weekendBands, yearMonth } from "./date-picker";
59
+ import { dateKey, displayDate, draftDateTimeValue, filterTimeInput, formatDateOnlyRangeDuration, formatDateTimeValue, inRange, isCompleteTime, isDateKey, isRangeEdge, monthDate, monthNames, msUntilNextDay, normalizeTimeInput, parseDateValue, pickerContext, pickRangeDay, previewRange, rangeAnchor, resolveFocusDay, splitDateTime, toDateTimeValue, weekendBands, yearMonth } from "./date-picker";
60
60
  import { commitFieldValue, resolveMaybeAccessor } from "./field-contract";
61
61
  const popoverIsOpen = popover => {
62
62
  if (!popover) return false;
@@ -1454,7 +1454,7 @@ export function DateTimePicker(props) {
1454
1454
  }, dateConfig()), dateConfig()));
1455
1455
  };
1456
1456
  const canApply = () => Boolean(draftDate()) && (!withTime() || isCompleteTime(draftTime()));
1457
- const draftValue = () => withTime() ? toDateTimeValue(draftDate(), draftTime(), dateConfig()) : draftDate() || null;
1457
+ const draftValue = () => withTime() ? draftDateTimeValue(valueHasTime() ? value() : null, draftDate(), draftTime(), dateConfig()) : draftDate() || null;
1458
1458
  const addTime = () => {
1459
1459
  setWithTime(true);
1460
1460
  queueMicrotask(() => timeField?.querySelector("input")?.focus());
@@ -1643,9 +1643,10 @@ export function DateRangePicker(props) {
1643
1643
  return;
1644
1644
  }
1645
1645
  if ((current.start || current.end) && (!isCompleteTime(startTime()) || !isCompleteTime(endTime()))) return;
1646
+ const committed = resolveMaybeAccessor(props.value);
1646
1647
  const value = {
1647
- start: current.start ? toDateTimeValue(current.start, startTime(), dateConfig()) : null,
1648
- end: current.end ? toDateTimeValue(current.end, endTime(), dateConfig()) : null
1648
+ start: current.start ? draftDateTimeValue(committed.start, current.start, startTime(), dateConfig()) : null,
1649
+ end: current.end ? draftDateTimeValue(committed.end, current.end, endTime(), dateConfig()) : null
1649
1650
  };
1650
1651
  close();
1651
1652
  commitFieldValue(props, value);