@k2b/ui 0.49.0 → 0.51.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 (461) hide show
  1. package/dist/base.css +70 -1
  2. package/dist/browser/actions/Button.js.map +1 -1
  3. package/dist/browser/actions/CommandList.js +861 -0
  4. package/dist/browser/actions/CommandList.js.map +1 -0
  5. package/dist/browser/actions/CommandMenu.js +237 -0
  6. package/dist/browser/actions/CommandMenu.js.map +1 -0
  7. package/dist/browser/actions/ContextMenu.js +3 -0
  8. package/dist/browser/actions/ContextMenu.js.map +1 -1
  9. package/dist/browser/actions/Dropdown.js +43 -10
  10. package/dist/browser/actions/Dropdown.js.map +1 -1
  11. package/dist/browser/actions/command-dock.js +47 -0
  12. package/dist/browser/actions/command-dock.js.map +1 -0
  13. package/dist/browser/actions/command-items.js +84 -0
  14. package/dist/browser/actions/command-items.js.map +1 -0
  15. package/dist/browser/actions/command-messages.js +42 -0
  16. package/dist/browser/actions/command-messages.js.map +1 -0
  17. package/dist/browser/actions/index.js +1 -0
  18. package/dist/browser/actions/index.js.map +1 -1
  19. package/dist/browser/charts/core/area.js +188 -0
  20. package/dist/browser/charts/core/area.js.map +1 -0
  21. package/dist/browser/charts/core/calendar.js +186 -0
  22. package/dist/browser/charts/core/calendar.js.map +1 -0
  23. package/dist/browser/charts/core/chart-map-data.js +9 -0
  24. package/dist/browser/charts/core/chart-map-data.js.map +1 -0
  25. package/dist/browser/charts/core/chart-messages.js +17 -0
  26. package/dist/browser/charts/core/chart-messages.js.map +1 -0
  27. package/dist/browser/charts/core/hbar-layout.js +118 -0
  28. package/dist/browser/charts/core/hbar-layout.js.map +1 -0
  29. package/dist/browser/charts/core/hbar.js +39 -0
  30. package/dist/browser/charts/core/hbar.js.map +1 -0
  31. package/dist/browser/charts/core/index.js +17 -0
  32. package/dist/browser/charts/core/index.js.map +1 -0
  33. package/dist/browser/charts/core/inspection.js +9 -0
  34. package/dist/browser/charts/core/inspection.js.map +1 -0
  35. package/dist/browser/charts/core/map.js +116 -0
  36. package/dist/browser/charts/core/map.js.map +1 -0
  37. package/dist/browser/charts/core/registry.js +35 -0
  38. package/dist/browser/charts/core/registry.js.map +1 -0
  39. package/dist/browser/charts/core/render-size.js +13 -0
  40. package/dist/browser/charts/core/render-size.js.map +1 -0
  41. package/dist/browser/charts/core/render.js +113 -0
  42. package/dist/browser/charts/core/render.js.map +1 -0
  43. package/dist/browser/charts/core/snapshot.js +65 -0
  44. package/dist/browser/charts/core/snapshot.js.map +1 -0
  45. package/dist/browser/charts/core/svg-renderers.js +2406 -0
  46. package/dist/browser/charts/core/svg-renderers.js.map +1 -0
  47. package/dist/browser/charts/core/svg.js +21 -0
  48. package/dist/browser/charts/core/svg.js.map +1 -0
  49. package/dist/browser/charts/core/termination.test-fixture.js +162 -0
  50. package/dist/browser/charts/core/termination.test-fixture.js.map +1 -0
  51. package/dist/browser/charts/core/text.js +13 -0
  52. package/dist/browser/charts/core/text.js.map +1 -0
  53. package/dist/browser/charts/core/types.js +6 -0
  54. package/dist/browser/charts/core/types.js.map +1 -0
  55. package/dist/browser/charts/core/waterfall.js +162 -0
  56. package/dist/browser/charts/core/waterfall.js.map +1 -0
  57. package/dist/browser/charts/description.js +2 -0
  58. package/dist/browser/charts/description.js.map +1 -0
  59. package/dist/browser/charts.js +4 -2
  60. package/dist/browser/charts.js.map +1 -1
  61. package/dist/browser/content/BalanceSummary.js +106 -0
  62. package/dist/browser/content/BalanceSummary.js.map +1 -0
  63. package/dist/browser/content/Chart.js +21 -616
  64. package/dist/browser/content/Chart.js.map +1 -1
  65. package/dist/browser/content/ChartExplorer.js +366 -122
  66. package/dist/browser/content/ChartExplorer.js.map +1 -1
  67. package/dist/browser/content/ChartRoot.js +632 -0
  68. package/dist/browser/content/ChartRoot.js.map +1 -0
  69. package/dist/browser/content/ChartSnapshotView.js +16 -9
  70. package/dist/browser/content/ChartSnapshotView.js.map +1 -1
  71. package/dist/browser/content/ChartSparkline.js +24 -0
  72. package/dist/browser/content/ChartSparkline.js.map +1 -0
  73. package/dist/browser/content/DataTable.js +676 -293
  74. package/dist/browser/content/DataTable.js.map +1 -1
  75. package/dist/browser/content/DataTableTools.js +119 -0
  76. package/dist/browser/content/DataTableTools.js.map +1 -0
  77. package/dist/browser/content/FileView.js +111 -61
  78. package/dist/browser/content/FileView.js.map +1 -1
  79. package/dist/browser/content/FlowAmount.js +82 -0
  80. package/dist/browser/content/FlowAmount.js.map +1 -0
  81. package/dist/browser/content/Lightbox.js +8 -8
  82. package/dist/browser/content/Lightbox.js.map +1 -1
  83. package/dist/browser/content/MapView.js +30 -28
  84. package/dist/browser/content/MapView.js.map +1 -1
  85. package/dist/browser/content/PdfPreview.js +84 -52
  86. package/dist/browser/content/PdfPreview.js.map +1 -1
  87. package/dist/browser/content/PdfViewer.js +588 -0
  88. package/dist/browser/content/PdfViewer.js.map +1 -0
  89. package/dist/browser/content/balance-summary-messages.js +26 -0
  90. package/dist/browser/content/balance-summary-messages.js.map +1 -0
  91. package/dist/browser/content/chart-bar.js +251 -21
  92. package/dist/browser/content/chart-bar.js.map +1 -1
  93. package/dist/browser/content/chart-calendar.js +43 -0
  94. package/dist/browser/content/chart-calendar.js.map +1 -0
  95. package/dist/browser/content/chart-inspection-core.js +178 -50
  96. package/dist/browser/content/chart-inspection-core.js.map +1 -1
  97. package/dist/browser/content/chart-inspection.js.map +1 -1
  98. package/dist/browser/content/chart-line-gaps.js +2 -2
  99. package/dist/browser/content/chart-line-gaps.js.map +1 -1
  100. package/dist/browser/content/chart-map-viewport.js.map +1 -1
  101. package/dist/browser/content/chart-message-catalog.js +174 -0
  102. package/dist/browser/content/chart-message-catalog.js.map +1 -0
  103. package/dist/browser/content/chart-messages.js +2 -138
  104. package/dist/browser/content/chart-messages.js.map +1 -1
  105. package/dist/browser/content/chart-snapshot.js +1 -62
  106. package/dist/browser/content/chart-snapshot.js.map +1 -1
  107. package/dist/browser/content/chart-state-timeline.js +1 -1
  108. package/dist/browser/content/chart-state-timeline.js.map +1 -1
  109. package/dist/browser/content/chart-svg.js +4 -2
  110. package/dist/browser/content/chart-svg.js.map +1 -1
  111. package/dist/browser/content/chart-time-axis.js +139 -0
  112. package/dist/browser/content/chart-time-axis.js.map +1 -0
  113. package/dist/browser/content/data-table-columns.js +160 -0
  114. package/dist/browser/content/data-table-columns.js.map +1 -0
  115. package/dist/browser/content/data-table-messages.js +38 -2
  116. package/dist/browser/content/data-table-messages.js.map +1 -1
  117. package/dist/browser/content/flow-amount-messages.js +26 -0
  118. package/dist/browser/content/flow-amount-messages.js.map +1 -0
  119. package/dist/browser/content/index.js +5 -0
  120. package/dist/browser/content/index.js.map +1 -1
  121. package/dist/browser/content/pdf-document.js +29 -0
  122. package/dist/browser/content/pdf-document.js.map +1 -0
  123. package/dist/browser/content/pdf-limits.js +31 -0
  124. package/dist/browser/content/pdf-limits.js.map +1 -0
  125. package/dist/browser/content/pdf-messages.js +34 -2
  126. package/dist/browser/content/pdf-messages.js.map +1 -1
  127. package/dist/browser/content/pdf-viewer-engine.js +57 -0
  128. package/dist/browser/content/pdf-viewer-worker.js +28 -0
  129. package/dist/browser/inputs/ChoiceInputs.js +94 -51
  130. package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
  131. package/dist/browser/inputs/ChoiceSlider.js +75 -58
  132. package/dist/browser/inputs/ChoiceSlider.js.map +1 -1
  133. package/dist/browser/inputs/DatePicker.js +118 -102
  134. package/dist/browser/inputs/DatePicker.js.map +1 -1
  135. package/dist/browser/inputs/PeriodPicker.js +874 -0
  136. package/dist/browser/inputs/PeriodPicker.js.map +1 -0
  137. package/dist/browser/inputs/SelectChip.js +50 -17
  138. package/dist/browser/inputs/SelectChip.js.map +1 -1
  139. package/dist/browser/inputs/date-picker.js +13 -0
  140. package/dist/browser/inputs/date-picker.js.map +1 -1
  141. package/dist/browser/inputs/index.js +4 -1
  142. package/dist/browser/inputs/index.js.map +1 -1
  143. package/dist/browser/inputs/input-messages.js +8 -2
  144. package/dist/browser/inputs/input-messages.js.map +1 -1
  145. package/dist/browser/inputs/markdown/MarkdownEditor.js +14 -10
  146. package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
  147. package/dist/browser/inputs/markdown/SlashCommands.js +402 -0
  148. package/dist/browser/inputs/markdown/SlashCommands.js.map +1 -0
  149. package/dist/browser/inputs/period-picker-messages.js +71 -0
  150. package/dist/browser/inputs/period-picker-messages.js.map +1 -0
  151. package/dist/browser/inputs/period.js +263 -0
  152. package/dist/browser/inputs/period.js.map +1 -0
  153. package/dist/browser/intl/Format.js +31 -8
  154. package/dist/browser/intl/Format.js.map +1 -1
  155. package/dist/browser/layout/AppWorkspace.js +7 -1
  156. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  157. package/dist/browser/layout/DetailPanel.js +147 -120
  158. package/dist/browser/layout/DetailPanel.js.map +1 -1
  159. package/dist/browser/layout/Discussion.js +101 -108
  160. package/dist/browser/layout/Discussion.js.map +1 -1
  161. package/dist/browser/layout/index.js.map +1 -1
  162. package/dist/browser/surfaces/BudgetList.js +281 -0
  163. package/dist/browser/surfaces/BudgetList.js.map +1 -0
  164. package/dist/browser/surfaces/DescriptionList.js +5 -2
  165. package/dist/browser/surfaces/DescriptionList.js.map +1 -1
  166. package/dist/browser/surfaces/ProgressBar.js +134 -21
  167. package/dist/browser/surfaces/ProgressBar.js.map +1 -1
  168. package/dist/browser/surfaces/StatCell.js +327 -146
  169. package/dist/browser/surfaces/StatCell.js.map +1 -1
  170. package/dist/browser/surfaces/StatGrid.js +75 -57
  171. package/dist/browser/surfaces/StatGrid.js.map +1 -1
  172. package/dist/browser/surfaces/budget-messages.js +64 -0
  173. package/dist/browser/surfaces/budget-messages.js.map +1 -0
  174. package/dist/browser/surfaces/delta-badge.js +79 -0
  175. package/dist/browser/surfaces/delta-badge.js.map +1 -0
  176. package/dist/browser/surfaces/index.js +2 -1
  177. package/dist/browser/surfaces/index.js.map +1 -1
  178. package/dist/browser/surfaces/person-color.js +2 -2
  179. package/dist/browser/surfaces/person-color.js.map +1 -1
  180. package/dist/browser/surfaces/stat-cell-messages.js +41 -0
  181. package/dist/browser/surfaces/stat-cell-messages.js.map +1 -0
  182. package/dist/browser/widgets/Dashboard.js +137 -0
  183. package/dist/browser/widgets/Dashboard.js.map +1 -0
  184. package/dist/browser/widgets/DashboardFrame.js +310 -0
  185. package/dist/browser/widgets/DashboardFrame.js.map +1 -0
  186. package/dist/browser/widgets/index.js +2 -0
  187. package/dist/browser/widgets/index.js.map +1 -1
  188. package/dist/licenses/pdfjs-dist.txt +177 -0
  189. package/dist/ssr/actions/Button.js.map +1 -1
  190. package/dist/ssr/actions/CommandList.js +638 -0
  191. package/dist/ssr/actions/CommandList.js.map +1 -0
  192. package/dist/ssr/actions/CommandMenu.js +197 -0
  193. package/dist/ssr/actions/CommandMenu.js.map +1 -0
  194. package/dist/ssr/actions/ContextMenu.js +3 -0
  195. package/dist/ssr/actions/ContextMenu.js.map +1 -1
  196. package/dist/ssr/actions/Dropdown.js +43 -10
  197. package/dist/ssr/actions/Dropdown.js.map +1 -1
  198. package/dist/ssr/actions/command-dock.js +47 -0
  199. package/dist/ssr/actions/command-dock.js.map +1 -0
  200. package/dist/ssr/actions/command-items.js +84 -0
  201. package/dist/ssr/actions/command-items.js.map +1 -0
  202. package/dist/ssr/actions/command-messages.js +42 -0
  203. package/dist/ssr/actions/command-messages.js.map +1 -0
  204. package/dist/ssr/actions/index.js +1 -0
  205. package/dist/ssr/actions/index.js.map +1 -1
  206. package/dist/ssr/charts/core/area.js +188 -0
  207. package/dist/ssr/charts/core/area.js.map +1 -0
  208. package/dist/ssr/charts/core/calendar.js +186 -0
  209. package/dist/ssr/charts/core/calendar.js.map +1 -0
  210. package/dist/ssr/charts/core/chart-map-data.js +9 -0
  211. package/dist/ssr/charts/core/chart-map-data.js.map +1 -0
  212. package/dist/ssr/charts/core/chart-messages.js +17 -0
  213. package/dist/ssr/charts/core/chart-messages.js.map +1 -0
  214. package/dist/ssr/charts/core/hbar-layout.js +118 -0
  215. package/dist/ssr/charts/core/hbar-layout.js.map +1 -0
  216. package/dist/ssr/charts/core/hbar.js +39 -0
  217. package/dist/ssr/charts/core/hbar.js.map +1 -0
  218. package/dist/ssr/charts/core/index.js +17 -0
  219. package/dist/ssr/charts/core/index.js.map +1 -0
  220. package/dist/ssr/charts/core/inspection.js +9 -0
  221. package/dist/ssr/charts/core/inspection.js.map +1 -0
  222. package/dist/ssr/charts/core/map.js +116 -0
  223. package/dist/ssr/charts/core/map.js.map +1 -0
  224. package/dist/ssr/charts/core/registry.js +35 -0
  225. package/dist/ssr/charts/core/registry.js.map +1 -0
  226. package/dist/ssr/charts/core/render-size.js +13 -0
  227. package/dist/ssr/charts/core/render-size.js.map +1 -0
  228. package/dist/ssr/charts/core/render.js +113 -0
  229. package/dist/ssr/charts/core/render.js.map +1 -0
  230. package/dist/ssr/charts/core/snapshot.js +65 -0
  231. package/dist/ssr/charts/core/snapshot.js.map +1 -0
  232. package/dist/ssr/charts/core/svg-renderers.js +2406 -0
  233. package/dist/ssr/charts/core/svg-renderers.js.map +1 -0
  234. package/dist/ssr/charts/core/svg.js +21 -0
  235. package/dist/ssr/charts/core/svg.js.map +1 -0
  236. package/dist/ssr/charts/core/termination.test-fixture.js +162 -0
  237. package/dist/ssr/charts/core/termination.test-fixture.js.map +1 -0
  238. package/dist/ssr/charts/core/text.js +13 -0
  239. package/dist/ssr/charts/core/text.js.map +1 -0
  240. package/dist/ssr/charts/core/types.js +6 -0
  241. package/dist/ssr/charts/core/types.js.map +1 -0
  242. package/dist/ssr/charts/core/waterfall.js +162 -0
  243. package/dist/ssr/charts/core/waterfall.js.map +1 -0
  244. package/dist/ssr/charts/description.js +2 -0
  245. package/dist/ssr/charts/description.js.map +1 -0
  246. package/dist/ssr/charts.js +4 -2
  247. package/dist/ssr/charts.js.map +1 -1
  248. package/dist/ssr/content/BalanceSummary.js +75 -0
  249. package/dist/ssr/content/BalanceSummary.js.map +1 -0
  250. package/dist/ssr/content/Chart.js +21 -483
  251. package/dist/ssr/content/Chart.js.map +1 -1
  252. package/dist/ssr/content/ChartExplorer.js +190 -46
  253. package/dist/ssr/content/ChartExplorer.js.map +1 -1
  254. package/dist/ssr/content/ChartRoot.js +475 -0
  255. package/dist/ssr/content/ChartRoot.js.map +1 -0
  256. package/dist/ssr/content/ChartSnapshotView.js +5 -1
  257. package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
  258. package/dist/ssr/content/ChartSparkline.js +24 -0
  259. package/dist/ssr/content/ChartSparkline.js.map +1 -0
  260. package/dist/ssr/content/DataTable.js +287 -78
  261. package/dist/ssr/content/DataTable.js.map +1 -1
  262. package/dist/ssr/content/DataTableTools.js +106 -0
  263. package/dist/ssr/content/DataTableTools.js.map +1 -0
  264. package/dist/ssr/content/FileView.js +56 -7
  265. package/dist/ssr/content/FileView.js.map +1 -1
  266. package/dist/ssr/content/FlowAmount.js +58 -0
  267. package/dist/ssr/content/FlowAmount.js.map +1 -0
  268. package/dist/ssr/content/Lightbox.js +8 -8
  269. package/dist/ssr/content/Lightbox.js.map +1 -1
  270. package/dist/ssr/content/MapView.js +9 -9
  271. package/dist/ssr/content/MapView.js.map +1 -1
  272. package/dist/ssr/content/PdfPreview.js +49 -20
  273. package/dist/ssr/content/PdfPreview.js.map +1 -1
  274. package/dist/ssr/content/PdfViewer.js +484 -0
  275. package/dist/ssr/content/PdfViewer.js.map +1 -0
  276. package/dist/ssr/content/balance-summary-messages.js +26 -0
  277. package/dist/ssr/content/balance-summary-messages.js.map +1 -0
  278. package/dist/ssr/content/chart-bar.js +251 -21
  279. package/dist/ssr/content/chart-bar.js.map +1 -1
  280. package/dist/ssr/content/chart-calendar.js +43 -0
  281. package/dist/ssr/content/chart-calendar.js.map +1 -0
  282. package/dist/ssr/content/chart-inspection-core.js +178 -50
  283. package/dist/ssr/content/chart-inspection-core.js.map +1 -1
  284. package/dist/ssr/content/chart-inspection.js.map +1 -1
  285. package/dist/ssr/content/chart-line-gaps.js +2 -2
  286. package/dist/ssr/content/chart-line-gaps.js.map +1 -1
  287. package/dist/ssr/content/chart-map-viewport.js.map +1 -1
  288. package/dist/ssr/content/chart-message-catalog.js +174 -0
  289. package/dist/ssr/content/chart-message-catalog.js.map +1 -0
  290. package/dist/ssr/content/chart-messages.js +2 -138
  291. package/dist/ssr/content/chart-messages.js.map +1 -1
  292. package/dist/ssr/content/chart-snapshot.js +1 -62
  293. package/dist/ssr/content/chart-snapshot.js.map +1 -1
  294. package/dist/ssr/content/chart-state-timeline.js +1 -1
  295. package/dist/ssr/content/chart-state-timeline.js.map +1 -1
  296. package/dist/ssr/content/chart-svg.js +4 -2
  297. package/dist/ssr/content/chart-svg.js.map +1 -1
  298. package/dist/ssr/content/chart-time-axis.js +139 -0
  299. package/dist/ssr/content/chart-time-axis.js.map +1 -0
  300. package/dist/ssr/content/data-table-columns.js +160 -0
  301. package/dist/ssr/content/data-table-columns.js.map +1 -0
  302. package/dist/ssr/content/data-table-messages.js +38 -2
  303. package/dist/ssr/content/data-table-messages.js.map +1 -1
  304. package/dist/ssr/content/flow-amount-messages.js +26 -0
  305. package/dist/ssr/content/flow-amount-messages.js.map +1 -0
  306. package/dist/ssr/content/index.js +5 -0
  307. package/dist/ssr/content/index.js.map +1 -1
  308. package/dist/ssr/content/pdf-document.js +29 -0
  309. package/dist/ssr/content/pdf-document.js.map +1 -0
  310. package/dist/ssr/content/pdf-limits.js +31 -0
  311. package/dist/ssr/content/pdf-limits.js.map +1 -0
  312. package/dist/ssr/content/pdf-messages.js +34 -2
  313. package/dist/ssr/content/pdf-messages.js.map +1 -1
  314. package/dist/ssr/inputs/ChoiceInputs.js +49 -12
  315. package/dist/ssr/inputs/ChoiceInputs.js.map +1 -1
  316. package/dist/ssr/inputs/ChoiceSlider.js +17 -12
  317. package/dist/ssr/inputs/ChoiceSlider.js.map +1 -1
  318. package/dist/ssr/inputs/DatePicker.js +19 -13
  319. package/dist/ssr/inputs/DatePicker.js.map +1 -1
  320. package/dist/ssr/inputs/PeriodPicker.js +598 -0
  321. package/dist/ssr/inputs/PeriodPicker.js.map +1 -0
  322. package/dist/ssr/inputs/SelectChip.js +26 -9
  323. package/dist/ssr/inputs/SelectChip.js.map +1 -1
  324. package/dist/ssr/inputs/date-picker.js +13 -0
  325. package/dist/ssr/inputs/date-picker.js.map +1 -1
  326. package/dist/ssr/inputs/index.js +4 -1
  327. package/dist/ssr/inputs/index.js.map +1 -1
  328. package/dist/ssr/inputs/input-messages.js +8 -2
  329. package/dist/ssr/inputs/input-messages.js.map +1 -1
  330. package/dist/ssr/inputs/markdown/MarkdownEditor.js +3 -2
  331. package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
  332. package/dist/ssr/inputs/markdown/SlashCommands.js +339 -0
  333. package/dist/ssr/inputs/markdown/SlashCommands.js.map +1 -0
  334. package/dist/ssr/inputs/period-picker-messages.js +71 -0
  335. package/dist/ssr/inputs/period-picker-messages.js.map +1 -0
  336. package/dist/ssr/inputs/period.js +263 -0
  337. package/dist/ssr/inputs/period.js.map +1 -0
  338. package/dist/ssr/intl/Format.js +22 -2
  339. package/dist/ssr/intl/Format.js.map +1 -1
  340. package/dist/ssr/layout/AppWorkspace.js +7 -1
  341. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  342. package/dist/ssr/layout/DetailPanel.js +27 -4
  343. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  344. package/dist/ssr/layout/Discussion.js +16 -2
  345. package/dist/ssr/layout/Discussion.js.map +1 -1
  346. package/dist/ssr/layout/index.js.map +1 -1
  347. package/dist/ssr/surfaces/BudgetList.js +170 -0
  348. package/dist/ssr/surfaces/BudgetList.js.map +1 -0
  349. package/dist/ssr/surfaces/DescriptionList.js +1 -1
  350. package/dist/ssr/surfaces/DescriptionList.js.map +1 -1
  351. package/dist/ssr/surfaces/ProgressBar.js +96 -5
  352. package/dist/ssr/surfaces/ProgressBar.js.map +1 -1
  353. package/dist/ssr/surfaces/StatCell.js +157 -52
  354. package/dist/ssr/surfaces/StatCell.js.map +1 -1
  355. package/dist/ssr/surfaces/StatGrid.js +24 -35
  356. package/dist/ssr/surfaces/StatGrid.js.map +1 -1
  357. package/dist/ssr/surfaces/budget-messages.js +64 -0
  358. package/dist/ssr/surfaces/budget-messages.js.map +1 -0
  359. package/dist/ssr/surfaces/delta-badge.js +55 -0
  360. package/dist/ssr/surfaces/delta-badge.js.map +1 -0
  361. package/dist/ssr/surfaces/index.js +2 -1
  362. package/dist/ssr/surfaces/index.js.map +1 -1
  363. package/dist/ssr/surfaces/person-color.js +2 -2
  364. package/dist/ssr/surfaces/person-color.js.map +1 -1
  365. package/dist/ssr/surfaces/stat-cell-messages.js +41 -0
  366. package/dist/ssr/surfaces/stat-cell-messages.js.map +1 -0
  367. package/dist/ssr/widgets/Dashboard.js +84 -0
  368. package/dist/ssr/widgets/Dashboard.js.map +1 -0
  369. package/dist/ssr/widgets/DashboardFrame.js +200 -0
  370. package/dist/ssr/widgets/DashboardFrame.js.map +1 -0
  371. package/dist/ssr/widgets/index.js +2 -0
  372. package/dist/ssr/widgets/index.js.map +1 -1
  373. package/dist/styles.css +1 -1
  374. package/dist/types/actions/Button.d.ts +1 -1
  375. package/dist/types/actions/CommandList.d.ts +120 -0
  376. package/dist/types/actions/CommandMenu.d.ts +39 -0
  377. package/dist/types/actions/Dropdown.d.ts +17 -0
  378. package/dist/types/actions/command-dock.d.ts +8 -0
  379. package/dist/types/actions/command-items.d.ts +134 -0
  380. package/dist/types/actions/command-messages.d.ts +19 -0
  381. package/dist/types/actions/index.d.ts +3 -0
  382. package/dist/types/charts/core/area.d.ts +62 -0
  383. package/dist/types/charts/core/calendar.d.ts +57 -0
  384. package/dist/types/charts/core/chart-map-data.d.ts +3 -0
  385. package/dist/types/charts/core/chart-messages.d.ts +5 -0
  386. package/dist/types/charts/core/hbar-layout.d.ts +74 -0
  387. package/dist/types/charts/core/hbar.d.ts +13 -0
  388. package/dist/types/charts/core/index.d.ts +16 -0
  389. package/dist/types/charts/core/inspection.d.ts +16 -0
  390. package/dist/types/charts/core/map.d.ts +3 -0
  391. package/dist/types/charts/core/registry.d.ts +33 -0
  392. package/dist/types/charts/core/render-size.d.ts +7 -0
  393. package/dist/types/charts/core/render.d.ts +37 -0
  394. package/dist/types/charts/core/snapshot.d.ts +27 -0
  395. package/dist/types/charts/core/svg-renderers.d.ts +722 -0
  396. package/dist/types/charts/core/svg.d.ts +20 -0
  397. package/dist/types/charts/core/termination.test-fixture.d.ts +1 -0
  398. package/dist/types/charts/core/text.d.ts +5 -0
  399. package/dist/types/charts/core/types.d.ts +20 -0
  400. package/dist/types/charts/core/waterfall.d.ts +68 -0
  401. package/dist/types/charts/description.d.ts +226 -0
  402. package/dist/types/charts.d.ts +5 -2
  403. package/dist/types/content/BalanceSummary.d.ts +29 -0
  404. package/dist/types/content/Chart.d.ts +19 -117
  405. package/dist/types/content/ChartExplorer.d.ts +43 -2
  406. package/dist/types/content/ChartRoot.d.ts +92 -0
  407. package/dist/types/content/ChartSnapshotView.d.ts +1 -0
  408. package/dist/types/content/ChartSparkline.d.ts +5 -0
  409. package/dist/types/content/DataTable.d.ts +28 -0
  410. package/dist/types/content/DataTableTools.d.ts +44 -0
  411. package/dist/types/content/FlowAmount.d.ts +28 -0
  412. package/dist/types/content/PdfViewer.d.ts +32 -0
  413. package/dist/types/content/balance-summary-messages.d.ts +11 -0
  414. package/dist/types/content/chart-bar.d.ts +95 -2
  415. package/dist/types/content/chart-calendar.d.ts +4 -0
  416. package/dist/types/content/chart-inspection-core.d.ts +21 -16
  417. package/dist/types/content/chart-inspection.d.ts +5 -1
  418. package/dist/types/content/chart-map-viewport.d.ts +1 -1
  419. package/dist/types/content/chart-message-catalog.d.ts +84 -0
  420. package/dist/types/content/chart-messages.d.ts +2 -33
  421. package/dist/types/content/chart-snapshot.d.ts +1 -26
  422. package/dist/types/content/chart-svg.d.ts +1 -1
  423. package/dist/types/content/chart-time-axis.d.ts +26 -0
  424. package/dist/types/content/data-table-columns.d.ts +72 -0
  425. package/dist/types/content/data-table-messages.d.ts +18 -0
  426. package/dist/types/content/flow-amount-messages.d.ts +11 -0
  427. package/dist/types/content/index.d.ts +12 -2
  428. package/dist/types/content/pdf-document.d.ts +5 -0
  429. package/dist/types/content/pdf-engine.d.ts +9 -0
  430. package/dist/types/content/pdf-limits.d.ts +43 -0
  431. package/dist/types/content/pdf-messages.d.ts +16 -0
  432. package/dist/types/inputs/ChoiceInputs.d.ts +4 -0
  433. package/dist/types/inputs/ChoiceSlider.d.ts +12 -0
  434. package/dist/types/inputs/DatePicker.d.ts +22 -0
  435. package/dist/types/inputs/PeriodPicker.d.ts +24 -0
  436. package/dist/types/inputs/SelectChip.d.ts +2 -0
  437. package/dist/types/inputs/date-picker.d.ts +6 -0
  438. package/dist/types/inputs/index.d.ts +8 -2
  439. package/dist/types/inputs/input-messages.d.ts +3 -0
  440. package/dist/types/inputs/markdown/MarkdownEditor.d.ts +5 -0
  441. package/dist/types/inputs/markdown/SlashCommands.d.ts +20 -0
  442. package/dist/types/inputs/period-picker-messages.d.ts +34 -0
  443. package/dist/types/inputs/period.d.ts +134 -0
  444. package/dist/types/intl/Format.d.ts +5 -0
  445. package/dist/types/layout/AppWorkspace.d.ts +5 -0
  446. package/dist/types/layout/DetailPanel.d.ts +12 -0
  447. package/dist/types/layout/index.d.ts +1 -1
  448. package/dist/types/surfaces/BudgetList.d.ts +42 -0
  449. package/dist/types/surfaces/DescriptionList.d.ts +5 -0
  450. package/dist/types/surfaces/ProgressBar.d.ts +38 -2
  451. package/dist/types/surfaces/StatCell.d.ts +40 -2
  452. package/dist/types/surfaces/StatGrid.d.ts +3 -1
  453. package/dist/types/surfaces/budget-messages.d.ts +30 -0
  454. package/dist/types/surfaces/delta-badge.d.ts +10 -0
  455. package/dist/types/surfaces/index.d.ts +4 -3
  456. package/dist/types/surfaces/person-color.d.ts +2 -2
  457. package/dist/types/surfaces/stat-cell-messages.d.ts +19 -0
  458. package/dist/types/widgets/Dashboard.d.ts +42 -0
  459. package/dist/types/widgets/DashboardFrame.d.ts +58 -0
  460. package/dist/types/widgets/index.d.ts +2 -0
  461. package/package.json +8 -1
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["inputs/markdown/SlashCommands.tsx"],"sourcesContent":["import { createEffect, createMemo, createSignal, type JSX, onCleanup, onMount, Show } from \"solid-js\";\nimport { CommandList, commandListKey, commandOptionId, createCommandNavigator } from \"../../actions/CommandList\";\nimport { dockCommandList, followComposer } from \"../../actions/command-dock\";\nimport { type CommandSource, commandPlace } from \"../../actions/command-items\";\nimport { useCommandMessages } from \"../../actions/command-messages\";\nimport { type Completion, detectQuery, type QueryContext } from \"../completion\";\nimport { isInCodeZone } from \"./code-zone\";\n\nexport type SlashCommandsProps = {\n /** The editor's textarea, from `MarkdownEditor`'s `textareaRef`. The commands attach once it is there. */\n textarea: HTMLTextAreaElement | undefined;\n /** The same entries as `CommandMenu`'s `items`. */\n items: CommandSource;\n /**\n * The composer box the list docks to, such as the frame around the editor and its \"+\" row. Defaults to the editor\n * itself.\n */\n composer?: HTMLElement;\n};\n\n/** Replaces a range of the text the way typing would, so undo keeps working; an empty text deletes. */\nconst replace = (textarea: HTMLTextAreaElement, start: number, end: number, text: string) => {\n textarea.focus();\n textarea.setSelectionRange(start, end);\n if (start === end && text === \"\") return;\n try {\n if (document.execCommand?.(text === \"\" ? \"delete\" : \"insertText\", false, text)) return;\n } catch {\n // Fall through to the standards-based replacement.\n }\n textarea.setRangeText(text, start, end, \"end\");\n textarea.dispatchEvent(new Event(\"input\", { bubbles: true }));\n};\n\nconst trigger: Completion = { trigger: \"/\", suggest: () => [] };\n\n/**\n * Slash commands for a `MarkdownEditor`: `/` at the start of a line or after a space opens the entries docked above the\n * composer, as wide as it is. Place it beside the editor and pass the editor's textarea. It listens to the textarea itself, so editors without\n * commands carry none of it: native listeners run before the editor's own, and a key it uses is marked handled with\n * `preventDefault`, which the editor respects.\n */\nexport function SlashCommands(props: SlashCommandsProps): JSX.Element {\n return (\n <Show when={props.textarea}>\n {(textarea) => <AttachedCommands textarea={textarea()} items={props.items} composer={props.composer} />}\n </Show>\n );\n}\n\nfunction AttachedCommands(props: { textarea: HTMLTextAreaElement; items: CommandSource; composer?: HTMLElement }): JSX.Element {\n const messages = useCommandMessages();\n const textarea = props.textarea;\n const id = `${textarea.id || \"k2b-markdown\"}-commands`;\n const composer = (): Element => props.composer ?? textarea.closest(\".k2b-markdown-editor\") ?? textarea;\n const [context, setContext] = createSignal<QueryContext | null>(null);\n /**\n * The list as a command left it: the `/query` is gone from the text, but the list stays at its slash while the\n * command runs or after it failed, until the person types, leaves, or presses Escape.\n */\n const [held, setHeld] = createSignal<{ start: number; query: string }>();\n /** Where Escape closed the commands; they stay closed while the caret stays in that `/query`. */\n let dismissedAt: number | null = null;\n /**\n * How deep the list is. A further list has its own search field: the `/query` leaves the text, the focus moves into\n * the field, and the composer's text stays as it is while the person searches.\n */\n const [depth, setDepth] = createSignal(0);\n const [search, setSearch] = createSignal(\"\");\n let searchField: HTMLInputElement | undefined;\n /** Set while this part moves the focus between the text and the search field itself. */\n let moving = false;\n /** Puts the focus back in the text at `at`, where the slash stood. */\n const focusText = (at: number) => {\n moving = true;\n try {\n textarea.focus();\n textarea.setSelectionRange(at, at);\n } finally {\n moving = false;\n }\n };\n /** Set while this part edits the text itself, so its own edit does not count as the person typing. */\n let editing = false;\n let popover: HTMLDivElement | undefined;\n const edit = (start: number, end: number, text: string) => {\n editing = true;\n try {\n replace(textarea, start, end, text);\n } finally {\n editing = false;\n }\n };\n const nav = createCommandNavigator({\n items: () => props.items,\n query: () => (depth() > 0 ? search() : (context()?.query ?? held()?.query ?? \"\")),\n onText: (item) => {\n // After a command failed, the held list has no `/query` left; a snippet goes where it stood.\n const current = context();\n const start = current?.start ?? held()?.start;\n if (start === undefined) return;\n close();\n edit(start, current?.end ?? start, item.text ?? \"\");\n },\n beforeRun: () => {\n const current = context();\n if (!current) return;\n // The list stays where it was while the `/query` leaves the text.\n setHeld({ start: current.start, query: current.query });\n setContext(null);\n edit(current.start, current.end, \"\");\n },\n // While the `/query` is in the text, the context leaves it out; once a command removed it, the text is as it is.\n context: () => {\n const current = context();\n const start = current?.start ?? held()?.start ?? textarea.selectionStart;\n const place = commandPlace(textarea.value, start, current?.end ?? start);\n return {\n ...place,\n selection: current ? { start, end: start } : { start: textarea.selectionStart, end: textarea.selectionEnd },\n insert: (text: string) => edit(textarea.selectionStart, textarea.selectionEnd, text),\n };\n },\n // A finished command leaves the focus in the text where the slash stood; its outcome, if any, shows in the list's place.\n afterRun: () => {\n const at = held()?.start;\n close();\n if (at !== undefined && document.activeElement !== textarea) focusText(at);\n },\n active: () => context() !== null || held() !== undefined,\n onStep: (next) => {\n const previous = depth();\n if (next === 0) {\n // Back to the first list: the typed `/query` comes back, and the text has the focus again. The list keeps its\n // place throughout: the context returns before the held state goes, and the focus is in the text before the\n // search field leaves, since a browser blurs a focused field that is removed, which would close the list.\n const at = held();\n if (at) {\n const text = `/${at.query}`;\n setContext({ start: at.start, end: at.start + text.length, text, query: at.query, completion: trigger });\n setHeld(undefined);\n moving = true;\n try {\n edit(at.start, at.start, text);\n } finally {\n moving = false;\n }\n }\n setDepth(0);\n setSearch(\"\");\n return;\n }\n setDepth(next);\n setSearch(\"\");\n if (previous === 0) {\n // Into a further list: the `/query` leaves the text, and the list stays where it was.\n const current = context();\n if (current) {\n setHeld({ start: current.start, query: current.query });\n setContext(null);\n edit(current.start, current.end, \"\");\n }\n }\n queueMicrotask(() => {\n moving = true;\n try {\n searchField?.focus({ preventScroll: true });\n } finally {\n moving = false;\n }\n });\n },\n });\n // Entries on their way, or a list that could not load, show too, so the person sees what happens.\n const open = createMemo(\n () =>\n nav.outcome() !== undefined ||\n held() !== undefined ||\n (context() !== null && (nav.step() !== undefined || nav.entries().length > 0 || nav.load().state !== \"ready\")),\n );\n const close = () => {\n setContext(null);\n setHeld(undefined);\n setDepth(0);\n setSearch(\"\");\n nav.reset();\n };\n\n const detect = () => {\n if (editing) return;\n // Typing after a command ran or failed moves on: the held list closes, the command keeps running.\n if (held()) close();\n const found = document.activeElement === textarea ? detectQuery(textarea, [trigger], { isExcluded: isInCodeZone }) : null;\n // Commands start at the line start or after a space, never inside `https://` or after a bracket.\n const usable = found && (found.start === 0 || /\\s/.test(textarea.value[found.start - 1] ?? \"\")) ? found : null;\n if (usable?.start !== context()?.start) {\n if (usable?.start !== dismissedAt) dismissedAt = null;\n close();\n }\n if (usable && usable.start !== dismissedAt) {\n // A new `/` takes the place at once, even from an outcome still in its least time.\n if (usable.start !== context()?.start) nav.clearOutcome();\n setContext(usable);\n }\n };\n /** The person typed: an outcome clears once it showed long enough, and a new `/` opens the list. */\n const typed = () => {\n if (!editing) nav.typedOn();\n detect();\n };\n /** An outcome's button leaves the focus in the text, where the person goes on writing. */\n const backToText = () => {\n if (document.activeElement === textarea) return;\n moving = true;\n try {\n textarea.focus({ preventScroll: true });\n } finally {\n moving = false;\n }\n };\n\n const position = () => {\n if (!popover?.isConnected) return;\n if (!popover.matches(\":popover-open\")) popover.showPopover?.();\n dockCommandList(popover, composer());\n };\n\n // The textarea points at the list while it shows, as a combobox does.\n createEffect(() => {\n const marked = nav.entries()[nav.active()];\n // In a further list the search field points at it instead.\n const pointing = open() && depth() === 0 && !nav.outcome();\n const active = pointing && marked && !marked.disabled ? commandOptionId(id, nav.active()) : undefined;\n if (pointing) textarea.setAttribute(\"aria-controls\", id);\n else if (textarea.getAttribute(\"aria-controls\") === id) textarea.removeAttribute(\"aria-controls\");\n if (active) textarea.setAttribute(\"aria-activedescendant\", active);\n else if (textarea.getAttribute(\"aria-activedescendant\")?.startsWith(`${id}-`)) textarea.removeAttribute(\"aria-activedescendant\");\n });\n // Opening, and entries that arrive while the `/` waits, such as from a reactive source, show the list.\n createEffect(() => {\n if (!open()) return;\n queueMicrotask(position);\n // The composer grows with its text, and a phone's keyboard moves the visible viewport.\n onCleanup(followComposer(composer(), position));\n });\n\n onMount(() => {\n const key = (event: KeyboardEvent) => {\n if (!open() || event.defaultPrevented) return;\n const current = context();\n if (event.key === \"Escape\" && !current) {\n // Escape stops a running command and closes the list it held, or clears an outcome at once.\n event.preventDefault();\n nav.abort();\n nav.clearOutcome();\n close();\n return;\n }\n // An outcome is no list: other keys are the person writing on.\n if (!current && nav.outcome()) return;\n if (commandListKey(nav, event, current?.query ?? \"\")) event.preventDefault();\n else if (event.key === \"Escape\" && current) {\n event.preventDefault();\n dismissedAt = current.start;\n close();\n }\n };\n const selection = () => {\n if (document.activeElement === textarea && !held()) detect();\n };\n const blur = (event: FocusEvent) => {\n if (moving || (event.relatedTarget instanceof Node && popover?.contains(event.relatedTarget))) return;\n close();\n dismissedAt = null;\n };\n textarea.addEventListener(\"keydown\", key);\n textarea.addEventListener(\"input\", typed);\n textarea.addEventListener(\"blur\", blur);\n document.addEventListener(\"selectionchange\", selection);\n // A `/` typed while this module loaded opens the list now.\n detect();\n onCleanup(() => {\n textarea.removeEventListener(\"keydown\", key);\n textarea.removeEventListener(\"input\", typed);\n textarea.removeEventListener(\"blur\", blur);\n document.removeEventListener(\"selectionchange\", selection);\n popover?.hidePopover?.();\n });\n });\n\n return (\n <Show when={open()}>\n {/* biome-ignore lint/a11y/noStaticElementInteractions: Escape from an outcome's own buttons; the text owns every other key. */}\n <div\n ref={popover}\n popover=\"manual\"\n class=\"k2b-autocomplete__options\"\n data-commands=\"\"\n data-outcome={nav.outcome()?.state}\n role=\"presentation\"\n // Escape on an outcome's button clears it, as it does in the text.\n onKeyDown={(event) => {\n if (event.key !== \"Escape\" || !nav.outcome() || event.target === searchField) return;\n event.preventDefault();\n nav.clearOutcome();\n backToText();\n }}\n >\n <CommandList\n onOutcomeAction={backToText}\n navigator={nav}\n id={id}\n label={messages().commands}\n query={nav.query}\n header={\n <Show when={depth() > 0}>\n <label class=\"k2b-dropdown__search\">\n <i class=\"ti ti-search\" aria-hidden=\"true\" />\n <input\n ref={searchField}\n type=\"search\"\n role=\"combobox\"\n aria-label={nav.step()?.next?.label}\n aria-expanded=\"true\"\n aria-controls={id}\n aria-autocomplete=\"list\"\n aria-activedescendant={\n nav.entries()[nav.active()] && !nav.entries()[nav.active()]!.disabled ? commandOptionId(id, nav.active()) : undefined\n }\n autocomplete=\"off\"\n spellcheck={false}\n enterkeyhint=\"go\"\n placeholder={nav.step()?.next?.label}\n value={search()}\n // While a command runs, the list waits for it.\n readOnly={nav.busy()}\n onInput={(event) => setSearch(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (event.key === \"Escape\" && nav.busy()) {\n // Escape stops a running command and closes the list.\n event.preventDefault();\n const at = held()?.start;\n nav.abort();\n close();\n if (at !== undefined) focusText(at);\n return;\n }\n if (commandListKey(nav, event, search())) event.preventDefault();\n }}\n onBlur={(event) => {\n // Leaving the list, other than to the text by this part itself, closes it. An outcome that took the\n // list's place removed this field; the finished command puts the focus back in the text.\n if (moving || nav.outcome() || (event.relatedTarget instanceof Node && popover?.contains(event.relatedTarget))) return;\n close();\n }}\n />\n </label>\n </Show>\n }\n />\n </div>\n </Show>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,71 @@
1
+ import { i18n } from "@k2b/stdlib";
2
+ import { useLocale } from "../intl/locale";
3
+
4
+ /** Labels of the built-in period presets and the picker's own words. */
5
+ const periodPickerMessages = i18n.define({
6
+ baseLocale: "en",
7
+ messages: {
8
+ en: {
9
+ period: "Period",
10
+ choosePeriod: "Choose a period",
11
+ custom: "Custom range",
12
+ from: "From",
13
+ to: "To",
14
+ backToPresets: "Back to presets",
15
+ since: ({
16
+ date
17
+ }) => `since ${date}`,
18
+ days: ({
19
+ count
20
+ }) => count === 1 ? "1 day" : `${count} days`,
21
+ today: "Today",
22
+ yesterday: "Yesterday",
23
+ "this-week": "This week",
24
+ "last-week": "Last week",
25
+ "this-month": "This month",
26
+ "last-month": "Last month",
27
+ "this-quarter": "This quarter",
28
+ "last-quarter": "Last quarter",
29
+ "this-year": "This year",
30
+ "last-year": "Last year",
31
+ all: "All time"
32
+ },
33
+ de: {
34
+ period: "Zeitraum",
35
+ choosePeriod: "Zeitraum wählen",
36
+ custom: "Frei wählen",
37
+ from: "Von",
38
+ to: "Bis",
39
+ backToPresets: "Zurück zu den Vorgaben",
40
+ since: ({
41
+ date
42
+ }) => `seit ${date}`,
43
+ days: ({
44
+ count
45
+ }) => count === 1 ? "1 Tag" : `${count} Tage`,
46
+ today: "Heute",
47
+ yesterday: "Gestern",
48
+ "this-week": "Diese Woche",
49
+ "last-week": "Letzte Woche",
50
+ "this-month": "Dieser Monat",
51
+ "last-month": "Letzter Monat",
52
+ "this-quarter": "Dieses Quartal",
53
+ "last-quarter": "Letztes Quartal",
54
+ "this-year": "Dieses Jahr",
55
+ "last-year": "Letztes Jahr",
56
+ all: "Gesamt"
57
+ }
58
+ }
59
+ });
60
+ const builtInKeys = new Set(["today", "yesterday", "this-week", "last-week", "this-month", "last-month", "this-quarter", "last-quarter", "this-year", "last-year", "all"]);
61
+ /** The translated label of a built-in preset key, if it is one. */
62
+ export const builtInPresetLabel = (t, key) => builtInKeys.has(key) ? t[key] : undefined;
63
+
64
+ /** Resolved from the inherited render locale. */
65
+ export const usePeriodPickerMessages = () => {
66
+ const locale = useLocale();
67
+ return () => periodPickerMessages.resolve([locale()]).t;
68
+ };
69
+ export const resolvePeriodPickerMessages = locale => periodPickerMessages.resolve([locale ?? "en"]).t;
70
+ export const checkPeriodPickerMessages = () => periodPickerMessages.check();
71
+ //# sourceMappingURL=period-picker-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["inputs/period-picker-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\n/** Labels of the built-in period presets and the picker's own words. */\nconst periodPickerMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n period: \"Period\",\n choosePeriod: \"Choose a period\",\n custom: \"Custom range\",\n from: \"From\",\n to: \"To\",\n backToPresets: \"Back to presets\",\n since: ({ date }: { date: string }) => `since ${date}`,\n days: ({ count }: { count: number }) => (count === 1 ? \"1 day\" : `${count} days`),\n today: \"Today\",\n yesterday: \"Yesterday\",\n \"this-week\": \"This week\",\n \"last-week\": \"Last week\",\n \"this-month\": \"This month\",\n \"last-month\": \"Last month\",\n \"this-quarter\": \"This quarter\",\n \"last-quarter\": \"Last quarter\",\n \"this-year\": \"This year\",\n \"last-year\": \"Last year\",\n all: \"All time\",\n },\n de: {\n period: \"Zeitraum\",\n choosePeriod: \"Zeitraum wählen\",\n custom: \"Frei wählen\",\n from: \"Von\",\n to: \"Bis\",\n backToPresets: \"Zurück zu den Vorgaben\",\n since: ({ date }) => `seit ${date}`,\n days: ({ count }) => (count === 1 ? \"1 Tag\" : `${count} Tage`),\n today: \"Heute\",\n yesterday: \"Gestern\",\n \"this-week\": \"Diese Woche\",\n \"last-week\": \"Letzte Woche\",\n \"this-month\": \"Dieser Monat\",\n \"last-month\": \"Letzter Monat\",\n \"this-quarter\": \"Dieses Quartal\",\n \"last-quarter\": \"Letztes Quartal\",\n \"this-year\": \"Dieses Jahr\",\n \"last-year\": \"Letztes Jahr\",\n all: \"Gesamt\",\n },\n },\n});\n\nexport type PeriodPickerMessages = ReturnType<(typeof periodPickerMessages)[\"resolve\"]>[\"t\"];\n\nconst builtInKeys = new Set([\n \"today\",\n \"yesterday\",\n \"this-week\",\n \"last-week\",\n \"this-month\",\n \"last-month\",\n \"this-quarter\",\n \"last-quarter\",\n \"this-year\",\n \"last-year\",\n \"all\",\n] as const);\ntype BuiltInKey = typeof builtInKeys extends Set<infer K> ? K : never;\n\n/** The translated label of a built-in preset key, if it is one. */\nexport const builtInPresetLabel = (t: PeriodPickerMessages, key: string): string | undefined =>\n builtInKeys.has(key as BuiltInKey) ? t[key as BuiltInKey] : undefined;\n\n/** Resolved from the inherited render locale. */\nexport const usePeriodPickerMessages = (): (() => PeriodPickerMessages) => {\n const locale = useLocale();\n return () => periodPickerMessages.resolve([locale()]).t;\n};\n\nexport const resolvePeriodPickerMessages = (locale?: string): PeriodPickerMessages => periodPickerMessages.resolve([locale ?? \"en\"]).t;\n\nexport const checkPeriodPickerMessages = () => periodPickerMessages.check();\n"],"mappings":"AAAA,SAAS,IAAI,QAAQ,aAAa;AAClC,SAAS,SAAS,QAAQ,gBAAgB;;AAE1C;AACA,MAAM,oBAAoB,GAAG,IAAI,CAAC,MAAM,CAAC;EACvC,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE;IACR,EAAE,EAAE;MACF,MAAM,EAAE,QAAQ;MAChB,YAAY,EAAE,iBAAiB;MAC/B,MAAM,EAAE,cAAc;MACtB,IAAI,EAAE,MAAM;MACZ,EAAE,EAAE,IAAI;MACR,aAAa,EAAE,iBAAiB;MAChC,KAAK,EAAE,CAAC;QAAE;MAAuB,CAAC,KAAK,SAAS,IAAI,EAAE;MACtD,IAAI,EAAE,CAAC;QAAE;MAAyB,CAAC,KAAM,KAAK,KAAK,CAAC,GAAG,OAAO,GAAG,GAAG,KAAK,OAAQ;MACjF,KAAK,EAAE,OAAO;MACd,SAAS,EAAE,WAAW;MACtB,WAAW,EAAE,WAAW;MACxB,WAAW,EAAE,WAAW;MACxB,YAAY,EAAE,YAAY;MAC1B,YAAY,EAAE,YAAY;MAC1B,cAAc,EAAE,cAAc;MAC9B,cAAc,EAAE,cAAc;MAC9B,WAAW,EAAE,WAAW;MACxB,WAAW,EAAE,WAAW;MACxB,GAAG,EAAE;IACP,CAAC;IACD,EAAE,EAAE;MACF,MAAM,EAAE,UAAU;MAClB,YAAY,EAAE,iBAAiB;MAC/B,MAAM,EAAE,aAAa;MACrB,IAAI,EAAE,KAAK;MACX,EAAE,EAAE,KAAK;MACT,aAAa,EAAE,wBAAwB;MACvC,KAAK,EAAE,CAAC;QAAE;MAAK,CAAC,KAAK,QAAQ,IAAI,EAAE;MACnC,IAAI,EAAE,CAAC;QAAE;MAAM,CAAC,KAAM,KAAK,KAAK,CAAC,GAAG,OAAO,GAAG,GAAG,KAAK,OAAQ;MAC9D,KAAK,EAAE,OAAO;MACd,SAAS,EAAE,SAAS;MACpB,WAAW,EAAE,aAAa;MAC1B,WAAW,EAAE,cAAc;MAC3B,YAAY,EAAE,cAAc;MAC5B,YAAY,EAAE,eAAe;MAC7B,cAAc,EAAE,gBAAgB;MAChC,cAAc,EAAE,iBAAiB;MACjC,WAAW,EAAE,aAAa;MAC1B,WAAW,EAAE,cAAc;MAC3B,GAAG,EAAE;IACP;EACF;AACF,CAAC,CAAC;AAIF,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAC1B,OAAO,EACP,WAAW,EACX,WAAW,EACX,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,cAAc,EACd,WAAW,EACX,WAAW,EACX,KAAK,CACG,CAAC;AAGX;AACA,OAAO,MAAM,kBAAkB,GAAG,CAAC,CAAuB,EAAE,GAAW,KACrE,WAAW,CAAC,GAAG,CAAC,GAAiB,CAAC,GAAG,CAAC,CAAC,GAAG,CAAe,GAAG,SAAS;;AAEvE;AACA,OAAO,MAAM,uBAAuB,GAAG,MAAoC;EACzE,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,OAAO,MAAM,oBAAoB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,OAAO,MAAM,2BAA2B,GAAI,MAAe,IAA2B,oBAAoB,CAAC,OAAO,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;AAEtI,OAAO,MAAM,yBAAyB,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,263 @@
1
+ import { dates } from "@k2b/stdlib";
2
+
3
+ /**
4
+ * A period as an app stores it: a preset key that stays relative ("this month" is next month's month too), or two
5
+ * explicit days. Days are date keys such as `2026-11-01`; `end` is inclusive.
6
+ */
7
+
8
+ /** Inclusive days of a period. `null` is an open edge, for example "All time" without a known first day. */
9
+
10
+ /** What a preset resolves against: today in the period's time zone and the first day of the week. */
11
+
12
+ /** The clock a period is resolved with. Server and browser pass the same values so the first render agrees. */
13
+
14
+ const keyDate = key => new Date(`${key}T00:00:00Z`);
15
+ const dateKeyOf = date => date.toISOString().slice(0, 10);
16
+ const day = (year, month, date) => dateKeyOf(new Date(Date.UTC(year, month, date)));
17
+ const parts = key => ({
18
+ year: Number(key.slice(0, 4)),
19
+ month: Number(key.slice(5, 7)) - 1,
20
+ date: Number(key.slice(8, 10))
21
+ });
22
+
23
+ /** Adds whole days to a date key; calendar days, so a DST change never moves it. */
24
+ export const addPeriodDays = (key, count) => {
25
+ const date = keyDate(key);
26
+ date.setUTCDate(date.getUTCDate() + count);
27
+ return dateKeyOf(date);
28
+ };
29
+
30
+ /** Number of days in an inclusive range of date keys. */
31
+ export const periodDayCount = range => Math.round((keyDate(range.end).getTime() - keyDate(range.start).getTime()) / 86_400_000) + 1;
32
+ const month = (key, offset) => {
33
+ const {
34
+ year,
35
+ month
36
+ } = parts(key);
37
+ return {
38
+ start: day(year, month + offset, 1),
39
+ end: day(year, month + offset + 1, 0)
40
+ };
41
+ };
42
+ const quarter = (key, offset) => {
43
+ const {
44
+ year,
45
+ month
46
+ } = parts(key);
47
+ const first = Math.floor(month / 3) * 3 + offset * 3;
48
+ return {
49
+ start: day(year, first, 1),
50
+ end: day(year, first + 3, 0)
51
+ };
52
+ };
53
+ const year = (key, offset) => {
54
+ const value = parts(key).year + offset;
55
+ return {
56
+ start: `${value}-01-01`,
57
+ end: `${value}-12-31`
58
+ };
59
+ };
60
+ const week = (context, offset) => {
61
+ const weekday = keyDate(context.today).getUTCDay();
62
+ const start = addPeriodDays(context.today, -((weekday - context.weekStartsOn + 7) % 7) + offset * 7);
63
+ return {
64
+ start,
65
+ end: addPeriodDays(start, 6)
66
+ };
67
+ };
68
+
69
+ /**
70
+ * Built-in presets. Each covers its whole calendar period ("This month" is the 1st to the last day, not up to
71
+ * today) in the period's time zone; weeks start on the context's first day of the week.
72
+ */
73
+ export const periodPresets = {
74
+ today: {
75
+ key: "today",
76
+ resolve: ({
77
+ today
78
+ }) => ({
79
+ start: today,
80
+ end: today
81
+ })
82
+ },
83
+ yesterday: {
84
+ key: "yesterday",
85
+ resolve: ({
86
+ today
87
+ }) => ({
88
+ start: addPeriodDays(today, -1),
89
+ end: addPeriodDays(today, -1)
90
+ })
91
+ },
92
+ thisWeek: {
93
+ key: "this-week",
94
+ resolve: context => week(context, 0)
95
+ },
96
+ lastWeek: {
97
+ key: "last-week",
98
+ resolve: context => week(context, -1)
99
+ },
100
+ thisMonth: {
101
+ key: "this-month",
102
+ resolve: ({
103
+ today
104
+ }) => month(today, 0)
105
+ },
106
+ lastMonth: {
107
+ key: "last-month",
108
+ resolve: ({
109
+ today
110
+ }) => month(today, -1)
111
+ },
112
+ thisQuarter: {
113
+ key: "this-quarter",
114
+ resolve: ({
115
+ today
116
+ }) => quarter(today, 0)
117
+ },
118
+ lastQuarter: {
119
+ key: "last-quarter",
120
+ resolve: ({
121
+ today
122
+ }) => quarter(today, -1)
123
+ },
124
+ thisYear: {
125
+ key: "this-year",
126
+ resolve: ({
127
+ today
128
+ }) => year(today, 0)
129
+ },
130
+ lastYear: {
131
+ key: "last-year",
132
+ resolve: ({
133
+ today
134
+ }) => year(today, -1)
135
+ },
136
+ /** Everything up to today; `since` is the first day with data when the app knows it, else the start stays open. */
137
+ all: (options = {}) => ({
138
+ key: "all",
139
+ resolve: ({
140
+ today
141
+ }) => ({
142
+ start: options.since ?? null,
143
+ end: today
144
+ })
145
+ })
146
+ };
147
+ const dateKeyPattern = /^\d{4}-\d{2}-\d{2}$/;
148
+ /** A real calendar day key, not only the shape (`2026-02-30` is refused). */
149
+ export const isPeriodDay = value => {
150
+ if (typeof value !== "string" || !dateKeyPattern.test(value)) return false;
151
+ const date = keyDate(value);
152
+ return !Number.isNaN(date.getTime()) && dateKeyOf(date) === value;
153
+ };
154
+
155
+ /** Accepts a stored or URL value only when it is a known preset key or two real days in order. */
156
+ export const parsePeriodValue = (value, presets) => {
157
+ if (!value || typeof value !== "object") return undefined;
158
+ const candidate = value;
159
+ if (typeof candidate.preset === "string") return presets.some(preset => preset.key === candidate.preset) ? {
160
+ preset: candidate.preset
161
+ } : undefined;
162
+ if (isPeriodDay(candidate.start) && isPeriodDay(candidate.end) && candidate.start <= candidate.end) return {
163
+ start: candidate.start,
164
+ end: candidate.end
165
+ };
166
+ return undefined;
167
+ };
168
+
169
+ /** The context presets resolve against: today in the clock's time zone. */
170
+ export const periodContext = (clock = {}) => ({
171
+ today: dates.formatDateKey(clock.now ?? new Date(), {
172
+ timeZone: clock.timeZone
173
+ }),
174
+ weekStartsOn: clock.weekStartsOn ?? clock.firstDayOfWeek ?? 1
175
+ });
176
+
177
+ /**
178
+ * Resolves a value to inclusive days. Returns `undefined` for a preset key the list does not contain, so a stored
179
+ * period that no longer exists is never silently replaced.
180
+ */
181
+ export const resolvePeriod = (value, presets, clock = {}) => {
182
+ if (!("preset" in value)) return {
183
+ start: value.start,
184
+ end: value.end
185
+ };
186
+ return presets.find(preset => preset.key === value.preset)?.resolve(periodContext(clock));
187
+ };
188
+
189
+ /**
190
+ * The instants a query uses for a resolved period: `from` is the start of the first day and `to` the start of the
191
+ * day after the last one (exclusive), both in the time zone. Days are never assumed to last 24 hours.
192
+ */
193
+ export const periodInstants = (range, timeZone) => {
194
+ const midnight = key => dates.zonedDateTimeToInstant(`${key}T00:00`, timeZone, {
195
+ disambiguation: "compatible"
196
+ });
197
+ return {
198
+ from: range.start ? midnight(range.start) : null,
199
+ to: range.end ? midnight(addPeriodDays(range.end, 1)) : null
200
+ };
201
+ };
202
+ const utcFormat = (locale, options) => new Intl.DateTimeFormat(locale, {
203
+ ...options,
204
+ timeZone: "UTC"
205
+ });
206
+
207
+ /**
208
+ * Short days of a preset, for the list and the trigger: "Sat, Nov 7", "Nov 1 – 30", "2025", "since 3/14/2019".
209
+ * The year is added only when the period is not in today's year.
210
+ */
211
+ export const formatPeriodDays = (range, today, locale, since) => {
212
+ if (!range.start) return "";
213
+ if (!range.end) return since(utcFormat(locale, {
214
+ day: "2-digit",
215
+ month: "2-digit",
216
+ year: "numeric"
217
+ }).format(keyDate(range.start)));
218
+ const start = keyDate(range.start);
219
+ const end = keyDate(range.end);
220
+ const sameYear = range.start.slice(0, 4) === range.end.slice(0, 4);
221
+ if (sameYear && range.start.endsWith("-01-01") && range.end.endsWith("-12-31")) return range.start.slice(0, 4);
222
+ if (range.end === today && range.start.slice(0, 4) !== today.slice(0, 4)) return since(utcFormat(locale, {
223
+ day: "2-digit",
224
+ month: "2-digit",
225
+ year: "numeric"
226
+ }).format(start));
227
+ const withYear = !sameYear || range.start.slice(0, 4) !== today.slice(0, 4);
228
+ if (range.start === range.end) return utcFormat(locale, {
229
+ weekday: "short",
230
+ day: "numeric",
231
+ month: "short",
232
+ ...(withYear ? {
233
+ year: "numeric"
234
+ } : {})
235
+ }).format(start);
236
+ return utcFormat(locale, {
237
+ day: "numeric",
238
+ month: "short",
239
+ ...(withYear ? {
240
+ year: "numeric"
241
+ } : {})
242
+ }).formatRange(start, end);
243
+ };
244
+
245
+ /** Explicit days as numbers with the year: "01.–07.11.2026" in German, "11/1/2026 – 11/7/2026" in English. */
246
+ export const formatPeriodRange = (range, locale) => {
247
+ const format = utcFormat(locale, {
248
+ day: "2-digit",
249
+ month: "2-digit",
250
+ year: "numeric"
251
+ });
252
+ return range.start === range.end ? format.format(keyDate(range.start)) : format.formatRange(keyDate(range.start), keyDate(range.end));
253
+ };
254
+
255
+ /** The widest explicit range within today's year, all of it (two-digit days, a three-digit count), so a trigger can reserve its width. */
256
+ export const widePeriodRangeSample = today => {
257
+ const year = today.slice(0, 4);
258
+ return {
259
+ start: `${year}-01-01`,
260
+ end: `${year}-12-31`
261
+ };
262
+ };
263
+ //# sourceMappingURL=period.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["inputs/period.ts"],"sourcesContent":["import { dates } from \"@k2b/stdlib\";\n\n/**\n * A period as an app stores it: a preset key that stays relative (\"this month\" is next month's month too), or two\n * explicit days. Days are date keys such as `2026-11-01`; `end` is inclusive.\n */\nexport type PeriodValue = { preset: string } | { start: string; end: string };\n\n/** Inclusive days of a period. `null` is an open edge, for example \"All time\" without a known first day. */\nexport type PeriodRange = { start: string | null; end: string | null };\n\n/** What a preset resolves against: today in the period's time zone and the first day of the week. */\nexport type PeriodContext = { today: string; weekStartsOn: 0 | 1 };\n\nexport type PeriodPreset = {\n key: string;\n /** Shown in the list and the trigger. Built-in presets bring a translated label; app presets name their own. */\n label?: string;\n resolve: (context: PeriodContext) => PeriodRange;\n};\n\n/** The clock a period is resolved with. Server and browser pass the same values so the first render agrees. */\nexport type PeriodClock = {\n /** The instant \"today\" is read from; defaults to now. */\n now?: Date;\n /** IANA time zone the days belong to, for example a base's zone; defaults to the runtime zone. */\n timeZone?: string;\n /** First day of the week, as in the calendar's date config; Monday by default. */\n weekStartsOn?: 0 | 1;\n /** Alias of `weekStartsOn`, accepted from a shared date config. */\n firstDayOfWeek?: 0 | 1;\n};\n\nconst keyDate = (key: string): Date => new Date(`${key}T00:00:00Z`);\nconst dateKeyOf = (date: Date): string => date.toISOString().slice(0, 10);\nconst day = (year: number, month: number, date: number): string => dateKeyOf(new Date(Date.UTC(year, month, date)));\nconst parts = (key: string) => ({ year: Number(key.slice(0, 4)), month: Number(key.slice(5, 7)) - 1, date: Number(key.slice(8, 10)) });\n\n/** Adds whole days to a date key; calendar days, so a DST change never moves it. */\nexport const addPeriodDays = (key: string, count: number): string => {\n const date = keyDate(key);\n date.setUTCDate(date.getUTCDate() + count);\n return dateKeyOf(date);\n};\n\n/** Number of days in an inclusive range of date keys. */\nexport const periodDayCount = (range: { start: string; end: string }): number =>\n Math.round((keyDate(range.end).getTime() - keyDate(range.start).getTime()) / 86_400_000) + 1;\n\nconst month = (key: string, offset: number): PeriodRange => {\n const { year, month } = parts(key);\n return { start: day(year, month + offset, 1), end: day(year, month + offset + 1, 0) };\n};\nconst quarter = (key: string, offset: number): PeriodRange => {\n const { year, month } = parts(key);\n const first = Math.floor(month / 3) * 3 + offset * 3;\n return { start: day(year, first, 1), end: day(year, first + 3, 0) };\n};\nconst year = (key: string, offset: number): PeriodRange => {\n const value = parts(key).year + offset;\n return { start: `${value}-01-01`, end: `${value}-12-31` };\n};\nconst week = (context: PeriodContext, offset: number): PeriodRange => {\n const weekday = keyDate(context.today).getUTCDay();\n const start = addPeriodDays(context.today, -((weekday - context.weekStartsOn + 7) % 7) + offset * 7);\n return { start, end: addPeriodDays(start, 6) };\n};\n\n/**\n * Built-in presets. Each covers its whole calendar period (\"This month\" is the 1st to the last day, not up to\n * today) in the period's time zone; weeks start on the context's first day of the week.\n */\nexport const periodPresets = {\n today: { key: \"today\", resolve: ({ today }) => ({ start: today, end: today }) },\n yesterday: { key: \"yesterday\", resolve: ({ today }) => ({ start: addPeriodDays(today, -1), end: addPeriodDays(today, -1) }) },\n thisWeek: { key: \"this-week\", resolve: (context) => week(context, 0) },\n lastWeek: { key: \"last-week\", resolve: (context) => week(context, -1) },\n thisMonth: { key: \"this-month\", resolve: ({ today }) => month(today, 0) },\n lastMonth: { key: \"last-month\", resolve: ({ today }) => month(today, -1) },\n thisQuarter: { key: \"this-quarter\", resolve: ({ today }) => quarter(today, 0) },\n lastQuarter: { key: \"last-quarter\", resolve: ({ today }) => quarter(today, -1) },\n thisYear: { key: \"this-year\", resolve: ({ today }) => year(today, 0) },\n lastYear: { key: \"last-year\", resolve: ({ today }) => year(today, -1) },\n /** Everything up to today; `since` is the first day with data when the app knows it, else the start stays open. */\n all: (options: { since?: string | null } = {}): PeriodPreset => ({\n key: \"all\",\n resolve: ({ today }) => ({ start: options.since ?? null, end: today }),\n }),\n} satisfies Record<string, PeriodPreset | ((options?: { since?: string | null }) => PeriodPreset)>;\n\nconst dateKeyPattern = /^\\d{4}-\\d{2}-\\d{2}$/;\n/** A real calendar day key, not only the shape (`2026-02-30` is refused). */\nexport const isPeriodDay = (value: unknown): value is string => {\n if (typeof value !== \"string\" || !dateKeyPattern.test(value)) return false;\n const date = keyDate(value);\n return !Number.isNaN(date.getTime()) && dateKeyOf(date) === value;\n};\n\n/** Accepts a stored or URL value only when it is a known preset key or two real days in order. */\nexport const parsePeriodValue = (value: unknown, presets: readonly PeriodPreset[]): PeriodValue | undefined => {\n if (!value || typeof value !== \"object\") return undefined;\n const candidate = value as Record<string, unknown>;\n if (typeof candidate.preset === \"string\")\n return presets.some((preset) => preset.key === candidate.preset) ? { preset: candidate.preset } : undefined;\n if (isPeriodDay(candidate.start) && isPeriodDay(candidate.end) && candidate.start <= candidate.end)\n return { start: candidate.start, end: candidate.end };\n return undefined;\n};\n\n/** The context presets resolve against: today in the clock's time zone. */\nexport const periodContext = (clock: PeriodClock = {}): PeriodContext => ({\n today: dates.formatDateKey(clock.now ?? new Date(), { timeZone: clock.timeZone }),\n weekStartsOn: clock.weekStartsOn ?? clock.firstDayOfWeek ?? 1,\n});\n\n/**\n * Resolves a value to inclusive days. Returns `undefined` for a preset key the list does not contain, so a stored\n * period that no longer exists is never silently replaced.\n */\nexport const resolvePeriod = (value: PeriodValue, presets: readonly PeriodPreset[], clock: PeriodClock = {}): PeriodRange | undefined => {\n if (!(\"preset\" in value)) return { start: value.start, end: value.end };\n return presets.find((preset) => preset.key === value.preset)?.resolve(periodContext(clock));\n};\n\n/**\n * The instants a query uses for a resolved period: `from` is the start of the first day and `to` the start of the\n * day after the last one (exclusive), both in the time zone. Days are never assumed to last 24 hours.\n */\nexport const periodInstants = (range: PeriodRange, timeZone: string): { from: string | null; to: string | null } => {\n const midnight = (key: string) => dates.zonedDateTimeToInstant(`${key}T00:00`, timeZone, { disambiguation: \"compatible\" });\n return { from: range.start ? midnight(range.start) : null, to: range.end ? midnight(addPeriodDays(range.end, 1)) : null };\n};\n\nconst utcFormat = (locale: string, options: Intl.DateTimeFormatOptions) => new Intl.DateTimeFormat(locale, { ...options, timeZone: \"UTC\" });\n\n/**\n * Short days of a preset, for the list and the trigger: \"Sat, Nov 7\", \"Nov 1 – 30\", \"2025\", \"since 3/14/2019\".\n * The year is added only when the period is not in today's year.\n */\nexport const formatPeriodDays = (range: PeriodRange, today: string, locale: string, since: (date: string) => string): string => {\n if (!range.start) return \"\";\n if (!range.end) return since(utcFormat(locale, { day: \"2-digit\", month: \"2-digit\", year: \"numeric\" }).format(keyDate(range.start)));\n const start = keyDate(range.start);\n const end = keyDate(range.end);\n const sameYear = range.start.slice(0, 4) === range.end.slice(0, 4);\n if (sameYear && range.start.endsWith(\"-01-01\") && range.end.endsWith(\"-12-31\")) return range.start.slice(0, 4);\n if (range.end === today && range.start.slice(0, 4) !== today.slice(0, 4))\n return since(utcFormat(locale, { day: \"2-digit\", month: \"2-digit\", year: \"numeric\" }).format(start));\n const withYear = !sameYear || range.start.slice(0, 4) !== today.slice(0, 4);\n if (range.start === range.end)\n return utcFormat(locale, { weekday: \"short\", day: \"numeric\", month: \"short\", ...(withYear ? { year: \"numeric\" } : {}) }).format(start);\n return utcFormat(locale, { day: \"numeric\", month: \"short\", ...(withYear ? { year: \"numeric\" } : {}) }).formatRange(start, end);\n};\n\n/** Explicit days as numbers with the year: \"01.–07.11.2026\" in German, \"11/1/2026 – 11/7/2026\" in English. */\nexport const formatPeriodRange = (range: { start: string; end: string }, locale: string): string => {\n const format = utcFormat(locale, { day: \"2-digit\", month: \"2-digit\", year: \"numeric\" });\n return range.start === range.end ? format.format(keyDate(range.start)) : format.formatRange(keyDate(range.start), keyDate(range.end));\n};\n\n/** The widest explicit range within today's year, all of it (two-digit days, a three-digit count), so a trigger can reserve its width. */\nexport const widePeriodRangeSample = (today: string): { start: string; end: string } => {\n const year = today.slice(0, 4);\n return { start: `${year}-01-01`, end: `${year}-12-31` };\n};\n"],"mappings":"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","ignoreList":[]}
@@ -70,17 +70,40 @@ const FormatPercent = props => {
70
70
  return _el$2;
71
71
  })();
72
72
  };
73
+
74
+ /** A currency amount with an explicit sign rule; the same digits as `text.pprintCurrency`. */
75
+ const signedCurrency = (value, currency, options) => {
76
+ if (typeof value !== "number" || !Number.isFinite(value)) return options.fallback ?? FALLBACK;
77
+ const decimals = options.decimals === undefined ? undefined : Number.isFinite(options.decimals) ? Math.min(20, Math.max(0, Math.trunc(options.decimals))) : 0;
78
+ return new Intl.NumberFormat(options.locale, {
79
+ style: "currency",
80
+ currency,
81
+ signDisplay: options.signDisplay,
82
+ ...(decimals === undefined ? {} : {
83
+ minimumFractionDigits: decimals,
84
+ maximumFractionDigits: decimals
85
+ })
86
+ }).format(Object.is(value, -0) ? 0 : value);
87
+ };
73
88
  const FormatCurrency = props => {
74
- const [own, rest] = splitProps(props, ["value", "currency", "locale", "decimals", "fallback"]);
89
+ const [own, rest] = splitProps(props, ["value", "currency", "locale", "decimals", "fallback", "signDisplay"]);
75
90
  const locale = useLocale();
76
91
  return (() => {
77
92
  var _el$3 = _$getNextElement(_tmpl$);
78
93
  _$spread(_el$3, rest, false, true);
79
- _$insert(_el$3, () => text.pprintCurrency(own.value, own.currency, {
80
- locale: own.locale ?? locale(),
81
- decimals: own.decimals,
82
- fallback: own.fallback
83
- }));
94
+ _$insert(_el$3, (() => {
95
+ var _c$ = _$memo(() => own.signDisplay === undefined);
96
+ return () => _c$() ? text.pprintCurrency(own.value, own.currency, {
97
+ locale: own.locale ?? locale(),
98
+ decimals: own.decimals,
99
+ fallback: own.fallback
100
+ }) : signedCurrency(own.value, own.currency, {
101
+ locale: own.locale ?? locale(),
102
+ decimals: own.decimals,
103
+ fallback: own.fallback,
104
+ signDisplay: own.signDisplay
105
+ });
106
+ })());
84
107
  _$runHydrationEvents();
85
108
  return _el$3;
86
109
  })();
@@ -92,8 +115,8 @@ const FormatBytes = props => {
92
115
  var _el$4 = _$getNextElement(_tmpl$);
93
116
  _$spread(_el$4, rest, false, true);
94
117
  _$insert(_el$4, (() => {
95
- var _c$ = _$memo(() => !!(typeof own.value === "number" && Number.isFinite(own.value)));
96
- return () => _c$() ? text.pprintBytes(own.value, {
118
+ var _c$2 = _$memo(() => !!(typeof own.value === "number" && Number.isFinite(own.value)));
119
+ return () => _c$2() ? text.pprintBytes(own.value, {
97
120
  locale: own.locale ?? locale(),
98
121
  mode: own.mode
99
122
  }) : own.fallback ?? FALLBACK;
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["intl/Format.tsx"],"sourcesContent":["import { type ByteMode, dates, text } from \"@k2b/stdlib\";\nimport { type JSX, Show, splitProps } from \"solid-js\";\nimport { useLocale } from \"./locale\";\n\nconst FALLBACK = \"—\";\n\ntype SpanProps = JSX.HTMLAttributes<HTMLSpanElement>;\n// Temporal components render `<time>` for valid values and a `<span>` fallback\n// otherwise, so their native attributes are typed against the shared element\n// base; `ref` is excluded because its value form is element-specific. The\n// `datetime` attribute is owned by the component itself.\ntype TimeElementProps = Omit<JSX.HTMLAttributes<HTMLElement>, \"ref\">;\n\ntype LocaleProp = {\n /** Explicit locale override; defaults to the inherited render locale. */\n locale?: string;\n};\n\ntype FallbackProp = {\n /** Text rendered for null or invalid input. Defaults to `\"—\"`. */\n fallback?: string;\n};\n\nexport type FormatNumberProps = SpanProps &\n LocaleProp &\n FallbackProp & {\n value: number | null | undefined;\n /** Use deterministic compact suffixes (`k`, `M`, `B`, `T`). */\n compact?: boolean;\n /** Fixed fraction digits. */\n decimals?: number;\n };\n\nexport type FormatPercentProps = SpanProps &\n LocaleProp &\n FallbackProp & {\n /** Ratio input: `0.12` renders as `12%`. */\n value: number | null | undefined;\n /** Fixed fraction digits. Defaults to 0. */\n decimals?: number;\n /** Clamp the ratio to 0..1 before formatting. */\n clamp?: boolean;\n };\n\nexport type FormatCurrencyProps = SpanProps &\n LocaleProp &\n FallbackProp & {\n value: number | null | undefined;\n /** ISO 4217 currency code, e.g. `\"EUR\"` or `\"USD\"`. */\n currency: string;\n /** Fixed fraction digits. Defaults to the currency's standard digits. */\n decimals?: number;\n };\n\nexport type FormatBytesProps = SpanProps &\n LocaleProp &\n FallbackProp & {\n value: number | null | undefined;\n /** `\"iec\"` (default, 1024-base) or `\"si\"` (1000-base). */\n mode?: ByteMode;\n };\n\nexport type FormatDateProps = TimeElementProps &\n LocaleProp &\n FallbackProp & {\n value: Date | string | null | undefined;\n /** IANA timezone. Defaults to `\"UTC\"` so server and browser text agree. */\n timeZone?: string;\n };\n\nexport type FormatTimeProps = FormatDateProps;\nexport type FormatDateTimeProps = FormatDateProps;\n\nexport type FormatRelativeTimeProps = TimeElementProps &\n LocaleProp &\n FallbackProp & {\n value: Date | string | null | undefined;\n /** Deterministic base timestamp; defaults to now. */\n base?: Date | string;\n /** IANA timezone used to select calendar-relative labels. Defaults to `\"UTC\"`. */\n timeZone?: string;\n };\n\nexport type FormatRelativeDateProps = TimeElementProps &\n LocaleProp &\n FallbackProp & {\n /** A Gregorian calendar date in strict YYYY-MM-DD format, never timezone-shifted. */\n value: string | null | undefined;\n /** Calendar date, Date, or ISO timestamp with an explicit offset. Defaults to now. */\n base?: Date | string;\n /** Zone used to read the base instant as a calendar day. Defaults to UTC. */\n timeZone?: string;\n };\n\nexport type FormatDurationProps = TimeElementProps &\n LocaleProp &\n FallbackProp & {\n from: Date | string | null | undefined;\n to: Date | string | null | undefined;\n };\n\nexport type FormatDurationMsProps = TimeElementProps &\n LocaleProp &\n FallbackProp & {\n /** Duration in milliseconds. */\n value: number | null | undefined;\n };\n\nconst toDate = (value: Date | string | null | undefined): Date | null => {\n if (value == null) return null;\n const date = typeof value === \"string\" ? new Date(value) : value;\n return Number.isNaN(date.getTime()) ? null : date;\n};\n\n/** ISO 8601 duration for the `<time datetime>` attribute, e.g. `\"PT2H30M\"`. */\nconst isoDuration = (ms: number): string => {\n const totalMilliseconds = Math.round(ms);\n if (totalMilliseconds <= 0) return \"PT0S\";\n const totalSeconds = Math.floor(totalMilliseconds / 1000);\n const milliseconds = totalMilliseconds % 1000;\n const days = Math.floor(totalSeconds / 86_400);\n const hours = Math.floor((totalSeconds % 86_400) / 3_600);\n const minutes = Math.floor((totalSeconds % 3_600) / 60);\n const seconds = totalSeconds % 60;\n const fractionalSeconds = milliseconds ? `${seconds}.${String(milliseconds).padStart(3, \"0\").replace(/0+$/, \"\")}S` : \"\";\n const time = `${hours ? `${hours}H` : \"\"}${minutes ? `${minutes}M` : \"\"}${fractionalSeconds || (seconds ? `${seconds}S` : \"\")}`;\n return `P${days ? `${days}D` : \"\"}${time ? `T${time}` : \"\"}`;\n};\n\nconst FormatNumber = (props: FormatNumberProps): JSX.Element => {\n const [own, rest] = splitProps(props, [\"value\", \"locale\", \"compact\", \"decimals\", \"fallback\"]);\n const locale = useLocale();\n return (\n <span {...rest}>\n {text.pprintNumber(own.value, {\n locale: own.locale ?? locale(),\n compact: own.compact,\n decimals: own.decimals,\n fallback: own.fallback,\n })}\n </span>\n );\n};\n\nconst FormatPercent = (props: FormatPercentProps): JSX.Element => {\n const [own, rest] = splitProps(props, [\"value\", \"locale\", \"decimals\", \"clamp\", \"fallback\"]);\n const locale = useLocale();\n return (\n <span {...rest}>\n {text.pprintPercent(own.value, {\n locale: own.locale ?? locale(),\n decimals: own.decimals,\n clamp: own.clamp,\n fallback: own.fallback,\n })}\n </span>\n );\n};\n\nconst FormatCurrency = (props: FormatCurrencyProps): JSX.Element => {\n const [own, rest] = splitProps(props, [\"value\", \"currency\", \"locale\", \"decimals\", \"fallback\"]);\n const locale = useLocale();\n return (\n <span {...rest}>\n {text.pprintCurrency(own.value, own.currency, {\n locale: own.locale ?? locale(),\n decimals: own.decimals,\n fallback: own.fallback,\n })}\n </span>\n );\n};\n\nconst FormatBytes = (props: FormatBytesProps): JSX.Element => {\n const [own, rest] = splitProps(props, [\"value\", \"locale\", \"mode\", \"fallback\"]);\n const locale = useLocale();\n return (\n <span {...rest}>\n {typeof own.value === \"number\" && Number.isFinite(own.value)\n ? text.pprintBytes(own.value, { locale: own.locale ?? locale(), mode: own.mode })\n : (own.fallback ?? FALLBACK)}\n </span>\n );\n};\n\ntype TemporalFormatter = (date: Date, context: { locale: string; timeZone: string }) => string;\n\nconst temporalComponent =\n (format: TemporalFormatter) =>\n (props: FormatDateProps): JSX.Element => {\n const [own, rest] = splitProps(props, [\"value\", \"locale\", \"timeZone\", \"fallback\"]);\n const locale = useLocale();\n return (\n <Show when={toDate(own.value)} fallback={<span {...rest}>{own.fallback ?? FALLBACK}</span>}>\n {(date) => (\n <time {...rest} datetime={date().toISOString()}>\n {format(date(), { locale: own.locale ?? locale(), timeZone: own.timeZone ?? \"UTC\" })}\n </time>\n )}\n </Show>\n );\n };\n\nconst FormatDate = temporalComponent((date, context) => dates.formatDate(date, context));\nconst FormatTime = temporalComponent((date, context) => dates.formatTime(date, context));\nconst FormatDateTime = temporalComponent((date, context) => dates.formatDateTime(date, context));\n\nconst FormatRelativeTime = (props: FormatRelativeTimeProps): JSX.Element => {\n const [own, rest] = splitProps(props, [\"value\", \"locale\", \"base\", \"timeZone\", \"fallback\"]);\n const locale = useLocale();\n return (\n <Show when={toDate(own.value)} fallback={<span {...rest}>{own.fallback ?? FALLBACK}</span>}>\n {(date) => (\n <time {...rest} datetime={date().toISOString()}>\n {dates.formatTimeSpan(date(), { locale: own.locale ?? locale(), base: own.base, timeZone: own.timeZone ?? \"UTC\" })}\n </time>\n )}\n </Show>\n );\n};\n\n// Encode calendar dates as UTC day ordinals, not elapsed local-midnight time:\n// a calendar day remains one day across 23-hour and 25-hour DST transitions.\nconst calendarDay = (value: string | null | undefined): number | null => {\n if (!value || !/^\\d{4}-\\d{2}-\\d{2}$/.test(value) || value.startsWith(\"0000\")) return null;\n const instant = new Date(`${value}T00:00:00Z`);\n if (!Number.isFinite(instant.getTime()) || instant.toISOString().slice(0, 10) !== value) return null;\n return instant.getTime() / 86_400_000;\n};\n\nconst FormatRelativeDate = (props: FormatRelativeDateProps): JSX.Element => {\n const [own, rest] = splitProps(props, [\"value\", \"locale\", \"base\", \"timeZone\", \"fallback\"]);\n const locale = useLocale();\n const relative = () => {\n const targetDay = calendarDay(own.value);\n const zone = own.timeZone ?? \"UTC\";\n if (targetDay === null || !dates.isValidTimeZone(zone)) return null;\n const base = own.base ?? new Date();\n let baseDay: number | null;\n if (typeof base === \"string\" && /^\\d{4}-\\d{2}-\\d{2}$/.test(base)) {\n baseDay = calendarDay(base);\n } else {\n // Offsetless timestamps depend on the host timezone and cannot hydrate reliably.\n if (typeof base === \"string\" && !/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d+)?)?(?:Z|[+-]\\d{2}:\\d{2})$/.test(base)) return null;\n if (typeof base === \"string\" && calendarDay(base.slice(0, 10)) === null) return null;\n const instant = toDate(base);\n if (!instant) return null;\n const parts = new Intl.DateTimeFormat(\"en-US\", {\n calendar: \"gregory\",\n numberingSystem: \"latn\",\n timeZone: zone,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n era: \"short\",\n }).formatToParts(instant);\n const part = (type: Intl.DateTimeFormatPartTypes) => parts.find((item) => item.type === type)?.value;\n if (part(\"era\") !== \"AD\") return null;\n baseDay = calendarDay(`${part(\"year\")?.padStart(4, \"0\")}-${part(\"month\")}-${part(\"day\")}`);\n }\n if (baseDay === null) return null;\n return { label: new Intl.RelativeTimeFormat(own.locale ?? locale(), { numeric: \"auto\" }).format(targetDay - baseDay, \"day\") };\n };\n return (\n <Show when={relative()} fallback={<span {...rest}>{own.fallback ?? FALLBACK}</span>}>\n {(value) => (\n <time {...rest} datetime={own.value ?? undefined}>\n {value().label}\n </time>\n )}\n </Show>\n );\n};\n\nconst FormatDuration = (props: FormatDurationProps): JSX.Element => {\n const [own, rest] = splitProps(props, [\"from\", \"to\", \"locale\", \"fallback\"]);\n const locale = useLocale();\n const range = () => {\n const from = toDate(own.from);\n const to = toDate(own.to);\n return from && to ? { from, to } : null;\n };\n return (\n <Show when={range()} fallback={<span {...rest}>{own.fallback ?? FALLBACK}</span>}>\n {(value) => (\n <time {...rest} datetime={isoDuration(Math.abs(value().to.getTime() - value().from.getTime()))}>\n {dates.formatDuration(value().from, value().to, { locale: own.locale ?? locale() })}\n </time>\n )}\n </Show>\n );\n};\n\nconst FormatDurationMs = (props: FormatDurationMsProps): JSX.Element => {\n const [own, rest] = splitProps(props, [\"value\", \"locale\", \"fallback\"]);\n const locale = useLocale();\n // Wrapped in an object because a valid duration of 0ms is falsy.\n const valid = (): { ms: number } | null => {\n const value = own.value;\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0 ? { ms: value } : null;\n };\n return (\n <Show when={valid()} fallback={<span {...rest}>{own.fallback ?? FALLBACK}</span>}>\n {(duration) => (\n <time {...rest} datetime={isoDuration(duration().ms)}>\n {text.pprintDurationMs(duration().ms, { locale: own.locale ?? locale() })}\n </time>\n )}\n </Show>\n );\n};\n\n/**\n * Unstyled semantic formatter components backed by `@k2b/stdlib`.\n *\n * Numeric components render a plain `<span>`; date/time components render\n * `<time>` with a canonical `datetime` attribute. All components inherit the\n * render locale (see `LocaleProvider` / `useLocale`) and accept an explicit\n * `locale` override. Date, Time, and DateTime format in UTC unless an\n * explicit `timeZone` is given, so server and browser output never diverge\n * with the runtime timezone.\n */\nexport const Format = {\n Number: FormatNumber,\n Percent: FormatPercent,\n Currency: FormatCurrency,\n Bytes: FormatBytes,\n Date: FormatDate,\n Time: FormatTime,\n DateTime: FormatDateTime,\n RelativeTime: FormatRelativeTime,\n RelativeDate: FormatRelativeDate,\n Duration: FormatDuration,\n DurationMs: FormatDurationMs,\n} as const;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["intl/Format.tsx"],"sourcesContent":["import { type ByteMode, dates, text } from \"@k2b/stdlib\";\nimport { type JSX, Show, splitProps } from \"solid-js\";\nimport { useLocale } from \"./locale\";\n\nconst FALLBACK = \"—\";\n\ntype SpanProps = JSX.HTMLAttributes<HTMLSpanElement>;\n// Temporal components render `<time>` for valid values and a `<span>` fallback\n// otherwise, so their native attributes are typed against the shared element\n// base; `ref` is excluded because its value form is element-specific. The\n// `datetime` attribute is owned by the component itself.\ntype TimeElementProps = Omit<JSX.HTMLAttributes<HTMLElement>, \"ref\">;\n\ntype LocaleProp = {\n /** Explicit locale override; defaults to the inherited render locale. */\n locale?: string;\n};\n\ntype FallbackProp = {\n /** Text rendered for null or invalid input. Defaults to `\"—\"`. */\n fallback?: string;\n};\n\nexport type FormatNumberProps = SpanProps &\n LocaleProp &\n FallbackProp & {\n value: number | null | undefined;\n /** Use deterministic compact suffixes (`k`, `M`, `B`, `T`). */\n compact?: boolean;\n /** Fixed fraction digits. */\n decimals?: number;\n };\n\nexport type FormatPercentProps = SpanProps &\n LocaleProp &\n FallbackProp & {\n /** Ratio input: `0.12` renders as `12%`. */\n value: number | null | undefined;\n /** Fixed fraction digits. Defaults to 0. */\n decimals?: number;\n /** Clamp the ratio to 0..1 before formatting. */\n clamp?: boolean;\n };\n\nexport type FormatCurrencyProps = SpanProps &\n LocaleProp &\n FallbackProp & {\n value: number | null | undefined;\n /** ISO 4217 currency code, e.g. `\"EUR\"` or `\"USD\"`. */\n currency: string;\n /** Fixed fraction digits. Defaults to the currency's standard digits. */\n decimals?: number;\n /**\n * When the sign shows, as in `Intl.NumberFormat`: `\"exceptZero\"` writes `+1.234,50 €` and `-80,00 €` for a\n * balance change or net amount, `\"never\"` drops it. Defaults to `\"auto\"` (only negative amounts carry a sign).\n */\n signDisplay?: Intl.NumberFormatOptions[\"signDisplay\"];\n };\n\nexport type FormatBytesProps = SpanProps &\n LocaleProp &\n FallbackProp & {\n value: number | null | undefined;\n /** `\"iec\"` (default, 1024-base) or `\"si\"` (1000-base). */\n mode?: ByteMode;\n };\n\nexport type FormatDateProps = TimeElementProps &\n LocaleProp &\n FallbackProp & {\n value: Date | string | null | undefined;\n /** IANA timezone. Defaults to `\"UTC\"` so server and browser text agree. */\n timeZone?: string;\n };\n\nexport type FormatTimeProps = FormatDateProps;\nexport type FormatDateTimeProps = FormatDateProps;\n\nexport type FormatRelativeTimeProps = TimeElementProps &\n LocaleProp &\n FallbackProp & {\n value: Date | string | null | undefined;\n /** Deterministic base timestamp; defaults to now. */\n base?: Date | string;\n /** IANA timezone used to select calendar-relative labels. Defaults to `\"UTC\"`. */\n timeZone?: string;\n };\n\nexport type FormatRelativeDateProps = TimeElementProps &\n LocaleProp &\n FallbackProp & {\n /** A Gregorian calendar date in strict YYYY-MM-DD format, never timezone-shifted. */\n value: string | null | undefined;\n /** Calendar date, Date, or ISO timestamp with an explicit offset. Defaults to now. */\n base?: Date | string;\n /** Zone used to read the base instant as a calendar day. Defaults to UTC. */\n timeZone?: string;\n };\n\nexport type FormatDurationProps = TimeElementProps &\n LocaleProp &\n FallbackProp & {\n from: Date | string | null | undefined;\n to: Date | string | null | undefined;\n };\n\nexport type FormatDurationMsProps = TimeElementProps &\n LocaleProp &\n FallbackProp & {\n /** Duration in milliseconds. */\n value: number | null | undefined;\n };\n\nconst toDate = (value: Date | string | null | undefined): Date | null => {\n if (value == null) return null;\n const date = typeof value === \"string\" ? new Date(value) : value;\n return Number.isNaN(date.getTime()) ? null : date;\n};\n\n/** ISO 8601 duration for the `<time datetime>` attribute, e.g. `\"PT2H30M\"`. */\nconst isoDuration = (ms: number): string => {\n const totalMilliseconds = Math.round(ms);\n if (totalMilliseconds <= 0) return \"PT0S\";\n const totalSeconds = Math.floor(totalMilliseconds / 1000);\n const milliseconds = totalMilliseconds % 1000;\n const days = Math.floor(totalSeconds / 86_400);\n const hours = Math.floor((totalSeconds % 86_400) / 3_600);\n const minutes = Math.floor((totalSeconds % 3_600) / 60);\n const seconds = totalSeconds % 60;\n const fractionalSeconds = milliseconds ? `${seconds}.${String(milliseconds).padStart(3, \"0\").replace(/0+$/, \"\")}S` : \"\";\n const time = `${hours ? `${hours}H` : \"\"}${minutes ? `${minutes}M` : \"\"}${fractionalSeconds || (seconds ? `${seconds}S` : \"\")}`;\n return `P${days ? `${days}D` : \"\"}${time ? `T${time}` : \"\"}`;\n};\n\nconst FormatNumber = (props: FormatNumberProps): JSX.Element => {\n const [own, rest] = splitProps(props, [\"value\", \"locale\", \"compact\", \"decimals\", \"fallback\"]);\n const locale = useLocale();\n return (\n <span {...rest}>\n {text.pprintNumber(own.value, {\n locale: own.locale ?? locale(),\n compact: own.compact,\n decimals: own.decimals,\n fallback: own.fallback,\n })}\n </span>\n );\n};\n\nconst FormatPercent = (props: FormatPercentProps): JSX.Element => {\n const [own, rest] = splitProps(props, [\"value\", \"locale\", \"decimals\", \"clamp\", \"fallback\"]);\n const locale = useLocale();\n return (\n <span {...rest}>\n {text.pprintPercent(own.value, {\n locale: own.locale ?? locale(),\n decimals: own.decimals,\n clamp: own.clamp,\n fallback: own.fallback,\n })}\n </span>\n );\n};\n\n/** A currency amount with an explicit sign rule; the same digits as `text.pprintCurrency`. */\nconst signedCurrency = (\n value: number | null | undefined,\n currency: string,\n options: { locale: string; decimals?: number; fallback?: string; signDisplay: NonNullable<FormatCurrencyProps[\"signDisplay\"]> },\n): string => {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return options.fallback ?? FALLBACK;\n const decimals =\n options.decimals === undefined\n ? undefined\n : Number.isFinite(options.decimals)\n ? Math.min(20, Math.max(0, Math.trunc(options.decimals)))\n : 0;\n return new Intl.NumberFormat(options.locale, {\n style: \"currency\",\n currency,\n signDisplay: options.signDisplay,\n ...(decimals === undefined ? {} : { minimumFractionDigits: decimals, maximumFractionDigits: decimals }),\n }).format(Object.is(value, -0) ? 0 : value);\n};\n\nconst FormatCurrency = (props: FormatCurrencyProps): JSX.Element => {\n const [own, rest] = splitProps(props, [\"value\", \"currency\", \"locale\", \"decimals\", \"fallback\", \"signDisplay\"]);\n const locale = useLocale();\n return (\n <span {...rest}>\n {own.signDisplay === undefined\n ? text.pprintCurrency(own.value, own.currency, {\n locale: own.locale ?? locale(),\n decimals: own.decimals,\n fallback: own.fallback,\n })\n : signedCurrency(own.value, own.currency, {\n locale: own.locale ?? locale(),\n decimals: own.decimals,\n fallback: own.fallback,\n signDisplay: own.signDisplay,\n })}\n </span>\n );\n};\n\nconst FormatBytes = (props: FormatBytesProps): JSX.Element => {\n const [own, rest] = splitProps(props, [\"value\", \"locale\", \"mode\", \"fallback\"]);\n const locale = useLocale();\n return (\n <span {...rest}>\n {typeof own.value === \"number\" && Number.isFinite(own.value)\n ? text.pprintBytes(own.value, { locale: own.locale ?? locale(), mode: own.mode })\n : (own.fallback ?? FALLBACK)}\n </span>\n );\n};\n\ntype TemporalFormatter = (date: Date, context: { locale: string; timeZone: string }) => string;\n\nconst temporalComponent =\n (format: TemporalFormatter) =>\n (props: FormatDateProps): JSX.Element => {\n const [own, rest] = splitProps(props, [\"value\", \"locale\", \"timeZone\", \"fallback\"]);\n const locale = useLocale();\n return (\n <Show when={toDate(own.value)} fallback={<span {...rest}>{own.fallback ?? FALLBACK}</span>}>\n {(date) => (\n <time {...rest} datetime={date().toISOString()}>\n {format(date(), { locale: own.locale ?? locale(), timeZone: own.timeZone ?? \"UTC\" })}\n </time>\n )}\n </Show>\n );\n };\n\nconst FormatDate = temporalComponent((date, context) => dates.formatDate(date, context));\nconst FormatTime = temporalComponent((date, context) => dates.formatTime(date, context));\nconst FormatDateTime = temporalComponent((date, context) => dates.formatDateTime(date, context));\n\nconst FormatRelativeTime = (props: FormatRelativeTimeProps): JSX.Element => {\n const [own, rest] = splitProps(props, [\"value\", \"locale\", \"base\", \"timeZone\", \"fallback\"]);\n const locale = useLocale();\n return (\n <Show when={toDate(own.value)} fallback={<span {...rest}>{own.fallback ?? FALLBACK}</span>}>\n {(date) => (\n <time {...rest} datetime={date().toISOString()}>\n {dates.formatTimeSpan(date(), { locale: own.locale ?? locale(), base: own.base, timeZone: own.timeZone ?? \"UTC\" })}\n </time>\n )}\n </Show>\n );\n};\n\n// Encode calendar dates as UTC day ordinals, not elapsed local-midnight time:\n// a calendar day remains one day across 23-hour and 25-hour DST transitions.\nconst calendarDay = (value: string | null | undefined): number | null => {\n if (!value || !/^\\d{4}-\\d{2}-\\d{2}$/.test(value) || value.startsWith(\"0000\")) return null;\n const instant = new Date(`${value}T00:00:00Z`);\n if (!Number.isFinite(instant.getTime()) || instant.toISOString().slice(0, 10) !== value) return null;\n return instant.getTime() / 86_400_000;\n};\n\nconst FormatRelativeDate = (props: FormatRelativeDateProps): JSX.Element => {\n const [own, rest] = splitProps(props, [\"value\", \"locale\", \"base\", \"timeZone\", \"fallback\"]);\n const locale = useLocale();\n const relative = () => {\n const targetDay = calendarDay(own.value);\n const zone = own.timeZone ?? \"UTC\";\n if (targetDay === null || !dates.isValidTimeZone(zone)) return null;\n const base = own.base ?? new Date();\n let baseDay: number | null;\n if (typeof base === \"string\" && /^\\d{4}-\\d{2}-\\d{2}$/.test(base)) {\n baseDay = calendarDay(base);\n } else {\n // Offsetless timestamps depend on the host timezone and cannot hydrate reliably.\n if (typeof base === \"string\" && !/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d+)?)?(?:Z|[+-]\\d{2}:\\d{2})$/.test(base)) return null;\n if (typeof base === \"string\" && calendarDay(base.slice(0, 10)) === null) return null;\n const instant = toDate(base);\n if (!instant) return null;\n const parts = new Intl.DateTimeFormat(\"en-US\", {\n calendar: \"gregory\",\n numberingSystem: \"latn\",\n timeZone: zone,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n era: \"short\",\n }).formatToParts(instant);\n const part = (type: Intl.DateTimeFormatPartTypes) => parts.find((item) => item.type === type)?.value;\n if (part(\"era\") !== \"AD\") return null;\n baseDay = calendarDay(`${part(\"year\")?.padStart(4, \"0\")}-${part(\"month\")}-${part(\"day\")}`);\n }\n if (baseDay === null) return null;\n return { label: new Intl.RelativeTimeFormat(own.locale ?? locale(), { numeric: \"auto\" }).format(targetDay - baseDay, \"day\") };\n };\n return (\n <Show when={relative()} fallback={<span {...rest}>{own.fallback ?? FALLBACK}</span>}>\n {(value) => (\n <time {...rest} datetime={own.value ?? undefined}>\n {value().label}\n </time>\n )}\n </Show>\n );\n};\n\nconst FormatDuration = (props: FormatDurationProps): JSX.Element => {\n const [own, rest] = splitProps(props, [\"from\", \"to\", \"locale\", \"fallback\"]);\n const locale = useLocale();\n const range = () => {\n const from = toDate(own.from);\n const to = toDate(own.to);\n return from && to ? { from, to } : null;\n };\n return (\n <Show when={range()} fallback={<span {...rest}>{own.fallback ?? FALLBACK}</span>}>\n {(value) => (\n <time {...rest} datetime={isoDuration(Math.abs(value().to.getTime() - value().from.getTime()))}>\n {dates.formatDuration(value().from, value().to, { locale: own.locale ?? locale() })}\n </time>\n )}\n </Show>\n );\n};\n\nconst FormatDurationMs = (props: FormatDurationMsProps): JSX.Element => {\n const [own, rest] = splitProps(props, [\"value\", \"locale\", \"fallback\"]);\n const locale = useLocale();\n // Wrapped in an object because a valid duration of 0ms is falsy.\n const valid = (): { ms: number } | null => {\n const value = own.value;\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0 ? { ms: value } : null;\n };\n return (\n <Show when={valid()} fallback={<span {...rest}>{own.fallback ?? FALLBACK}</span>}>\n {(duration) => (\n <time {...rest} datetime={isoDuration(duration().ms)}>\n {text.pprintDurationMs(duration().ms, { locale: own.locale ?? locale() })}\n </time>\n )}\n </Show>\n );\n};\n\n/**\n * Unstyled semantic formatter components backed by `@k2b/stdlib`.\n *\n * Numeric components render a plain `<span>`; date/time components render\n * `<time>` with a canonical `datetime` attribute. All components inherit the\n * render locale (see `LocaleProvider` / `useLocale`) and accept an explicit\n * `locale` override. Date, Time, and DateTime format in UTC unless an\n * explicit `timeZone` is given, so server and browser output never diverge\n * with the runtime timezone.\n */\nexport const Format = {\n Number: FormatNumber,\n Percent: FormatPercent,\n Currency: FormatCurrency,\n Bytes: FormatBytes,\n Date: FormatDate,\n Time: FormatTime,\n DateTime: FormatDateTime,\n RelativeTime: FormatRelativeTime,\n RelativeDate: FormatRelativeDate,\n Duration: FormatDuration,\n DurationMs: FormatDurationMs,\n} as const;\n"],"mappings":"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","ignoreList":[]}