@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/PeriodPicker.tsx"],"sourcesContent":["import { dates } from \"@k2b/stdlib\";\nimport { batch, createComputed, createEffect, createMemo, createSignal, For, type JSX, on, onCleanup, Show } from \"solid-js\";\nimport { prefersMenuSheet } from \"../actions/phone-sheet\";\nimport { createFieldMeta, Field, fieldDescribedBy } from \"../internal/field\";\nimport { returnFocus, ringOnReturn } from \"../internal/focus-return\";\nimport { useDateConfigLocale } from \"../intl/locale\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { DatePickerPanel } from \"./DatePicker\";\nimport { dateInputPattern, formatDateInput, parseDateInput } from \"./date-input\";\nimport { resolveDateInputMessages } from \"./date-input-messages\";\nimport { errorText } from \"./date-input-status\";\nimport { type DateRangeValue, parseDateValue, pickRangeDay, previewRange, rangeAnchor } from \"./date-picker\";\nimport type { DateContext, MaybeAccessor, ValueFieldProps } from \"./field-contract\";\nimport { commitFieldValue, resolveMaybeAccessor } from \"./field-contract\";\nimport {\n formatPeriodDays,\n formatPeriodRange,\n type PeriodPreset,\n type PeriodRange,\n type PeriodValue,\n periodContext,\n periodDayCount,\n widePeriodRangeSample,\n} from \"./period\";\nimport { builtInPresetLabel, type PeriodPickerMessages, usePeriodPickerMessages } from \"./period-picker-messages\";\n\nexport type PeriodPickerProps = Omit<ValueFieldProps<PeriodValue | null>, \"value\"> & {\n /** A preset key or two explicit days; `null` or an unknown preset key shows the placeholder. */\n value: MaybeAccessor<PeriodValue | null>;\n /** The presets in list order, for example `periodPresets.thisMonth` or an app's own `{ key, label, resolve }`. */\n presets: readonly PeriodPreset[];\n /** Offers \"Custom range\" with a calendar in the same popover. On by default. */\n custom?: boolean;\n /** Time zone, week start and locale. Presets resolve \"today\" in `timeZone`; pass the zone the data uses. */\n dateConfig?: DateContext;\n /** The instant \"today\" is read from. Pass the server's instant so the first render and the browser agree. */\n now?: Date;\n /** Shows that a change is saving: the trigger keeps its size, cannot be opened, and shows a spinner. */\n loading?: boolean;\n};\n\ntype PeriodText = { label: string; detail: string };\ntype View = \"list\" | \"custom\";\n\n/** Two months side by side need room for the list and both calendars. */\nconst TWO_MONTHS_QUERY = \"(min-width: 56rem)\";\n\nconst presetLabel = (preset: PeriodPreset, t: PeriodPickerMessages): string =>\n preset.label ?? builtInPresetLabel(t, preset.key) ?? preset.key;\n\n/** Places the popover under (or over) the trigger; it grows toward the side with room, right-aligned near the right edge. */\nconst placePeriodPopover = (trigger: HTMLElement, popover: HTMLElement): void => {\n const margin = 8;\n const gap = 4;\n const rect = trigger.getBoundingClientRect();\n const box = popover.getBoundingClientRect();\n const width = Math.min(box.width, window.innerWidth - margin * 2);\n const fromLeft = rect.left;\n const fromRight = rect.right - width;\n const left = fromLeft + width <= window.innerWidth - margin ? fromLeft : Math.max(margin, fromRight);\n const roomBelow = window.innerHeight - rect.bottom - gap - margin;\n const roomAbove = rect.top - gap - margin;\n const above = box.height > roomBelow && roomAbove > roomBelow;\n const top = above ? Math.max(margin, rect.top - box.height - gap) : Math.min(rect.bottom + gap, window.innerHeight - box.height - margin);\n popover.style.left = `${Math.max(margin, Math.min(left, window.innerWidth - width - margin))}px`;\n popover.style.top = `${Math.max(margin, top)}px`;\n};\n\nconst popoverIsOpen = (popover: HTMLElement | undefined): boolean => {\n try {\n return Boolean(popover?.matches(\":popover-open\"));\n } catch {\n return false;\n }\n};\n\n/**\n * PeriodPicker — one control for the period an evaluation or dashboard shows: presets such as \"This month\" plus a\n * custom range, edited in the same popover (a bottom sheet on phones). The trigger shows the preset with its days or\n * the custom days with their count, and keeps the width of its longest text so nothing beside it moves.\n */\nexport function PeriodPicker(props: PeriodPickerProps): JSX.Element {\n const t = usePeriodPickerMessages();\n const meta = createFieldMeta(props.id);\n const dateConfig = useDateConfigLocale(() => props.dateConfig);\n const locale = () => dateConfig().locale ?? \"en\";\n const value = () => resolveMaybeAccessor(props.value);\n const custom = () => props.custom ?? true;\n const disabled = createMemo(() => Boolean(props.disabled || props.loading));\n // Read again on every opening, so a picker left open past midnight shows the new day's presets next time.\n const [clockTick, setClockTick] = createSignal(0);\n const context = createMemo(() => {\n clockTick();\n return periodContext({\n now: props.now,\n timeZone: dateConfig().timeZone,\n weekStartsOn: dateConfig().weekStartsOn ?? dateConfig().firstDayOfWeek,\n });\n });\n const since = (date: string) => t().since({ date });\n const presetText = (preset: PeriodPreset): PeriodText => ({\n label: presetLabel(preset, t()),\n detail: formatPeriodDays(preset.resolve(context()), context().today, locale(), since),\n });\n const rangeText = (range: { start: string; end: string }): PeriodText => ({\n label: formatPeriodRange(range, locale()),\n detail: t().days({ count: periodDayCount(range) }),\n });\n const selectedPreset = () => {\n const current = value();\n return current && \"preset\" in current ? props.presets.find((preset) => preset.key === current.preset) : undefined;\n };\n const current = createMemo((): PeriodText | undefined => {\n const selected = value();\n if (!selected) return undefined;\n if (\"preset\" in selected) {\n const preset = selectedPreset();\n return preset ? presetText(preset) : undefined;\n }\n return rangeText(selected);\n });\n const joined = (text: PeriodText) => (text.detail ? `${text.label} · ${text.detail}` : text.label);\n // Every text the trigger can show shares one grid cell, so it keeps the widest one's width.\n const widths = createMemo(() => [\n ...props.presets.map((preset) => joined(presetText(preset))),\n ...(custom() ? [joined(rangeText(widePeriodRangeSample(context().today)))] : []),\n t().choosePeriod,\n ]);\n\n const [open, setOpen] = createSignal(false);\n const [view, setView] = createSignal<View>(\"list\");\n const [sheetOpen, setSheetOpen] = createSignal(false);\n let trigger: HTMLButtonElement | undefined;\n let popover: HTMLDivElement | undefined;\n let openedByKeyboard = false;\n const popoverId = `${meta.controlId}-period`;\n const sheetId = `${meta.controlId}-sheet`;\n const valueId = `${meta.controlId}-value`;\n\n // A trigger disabled while a change saves would drop keyboard focus on the page; it comes back once enabled.\n let refocus = false;\n createComputed(\n on(\n disabled,\n (isDisabled) => {\n if (isDisabled) refocus = trigger !== undefined && document.activeElement === trigger;\n },\n { defer: true },\n ),\n );\n createEffect(\n on(\n disabled,\n (isDisabled) => {\n if (isDisabled || !refocus) return;\n refocus = false;\n const active = document.activeElement;\n if (trigger?.isConnected && (active === null || active === document.body)) trigger.focus();\n },\n { defer: true },\n ),\n );\n\n const place = () => {\n if (trigger && popover && open()) placePeriodPopover(trigger, popover);\n };\n createEffect(() => {\n if (!open()) return;\n view();\n queueMicrotask(place);\n window.addEventListener(\"resize\", place);\n window.addEventListener(\"scroll\", place, true);\n onCleanup(() => {\n window.removeEventListener(\"resize\", place);\n window.removeEventListener(\"scroll\", place, true);\n });\n });\n\n const close = () => {\n // Before hiding, so the popover does not return focus on its own.\n if (popover?.contains(document.activeElement)) returnFocus(trigger, openedByKeyboard);\n if (popoverIsOpen(popover)) popover?.hidePopover();\n setOpen(false);\n };\n onCleanup(() => {\n if (popoverIsOpen(popover)) popover?.hidePopover();\n });\n\n const pick = (next: PeriodValue) => {\n close();\n if (sheetOpen()) return;\n commitFieldValue(props, next);\n };\n\n const initialView = (): View => {\n const selected = value();\n return custom() && selected && !(\"preset\" in selected) ? \"custom\" : \"list\";\n };\n\n const openSheet = async () => {\n setSheetOpen(true);\n const { openDateSheet } = await import(\"./date-sheet\");\n const result = await openDateSheet<PeriodValue>({\n title: typeof props.label === \"string\" ? props.label : (props[\"aria-label\"] ?? t().period),\n subtitle: current() ? joined(current()!) : t().choosePeriod,\n ariaLabel: typeof props.label === \"string\" ? props.label : (props[\"aria-label\"] ?? t().period),\n id: sheetId,\n locale: locale(),\n content: (closeSheet) => (\n <PeriodPanel\n sheet\n presets={props.presets}\n custom={custom()}\n value={value}\n initialView={initialView()}\n context={context}\n dateConfig={dateConfig}\n presetText={presetText}\n rangeText={rangeText}\n label={props[\"aria-label\"] ?? t().period}\n onPick={closeSheet}\n />\n ),\n });\n setSheetOpen(false);\n if (result) commitFieldValue(props, result);\n trigger?.focus({ preventScroll: true });\n };\n\n const show = () => {\n if (disabled() || !popover) return;\n setClockTick((tick) => tick + 1);\n openedByKeyboard = ringOnReturn(trigger);\n if (prefersMenuSheet()) return void openSheet();\n setView(initialView());\n popover.showPopover();\n setOpen(true);\n queueMicrotask(() => {\n place();\n popover?.querySelector<HTMLElement>('[role=\"option\"][tabindex=\"0\"]')?.focus();\n });\n };\n\n const name = () =>\n props.label ? undefined : `${props[\"aria-label\"] ?? t().period}: ${current() ? joined(current()!) : t().choosePeriod}`;\n\n return (\n <Field\n class={`k2b-period-picker ${props.class ?? \"\"}`}\n label={props.label}\n description={props.description}\n error={props.error}\n meta={meta}\n required={props.required}\n disabled={disabled()}\n >\n <button\n ref={trigger}\n id={meta.controlId}\n type=\"button\"\n class=\"k2b-period-picker__trigger\"\n aria-haspopup=\"dialog\"\n aria-expanded={open() || sheetOpen()}\n aria-controls={sheetOpen() ? sheetId : popoverId}\n aria-label={name()}\n aria-labelledby={props.label ? `${meta.labelId} ${valueId}` : undefined}\n aria-describedby={fieldDescribedBy(meta, props)}\n aria-invalid={resolveMaybeAccessor(props.error) ? \"true\" : undefined}\n aria-busy={props.loading ? \"true\" : undefined}\n disabled={disabled()}\n onClick={() => (open() ? close() : show())}\n onKeyDown={(event) => {\n if ((event.key === \"ArrowDown\" || event.key === \"ArrowUp\") && !open()) {\n event.preventDefault();\n show();\n }\n }}\n >\n <i class=\"ti ti-calendar\" aria-hidden=\"true\" />\n <span class=\"k2b-period-picker__value\" data-placeholder={current() ? undefined : \"true\"}>\n <span id={valueId}>\n <Show when={current()} fallback={t().choosePeriod}>\n {(text) => (\n <>\n {text().label}\n <Show when={text().detail}>\n <span class=\"k2b-period-picker__detail\"> · {text().detail}</span>\n </Show>\n </>\n )}\n </Show>\n </span>\n <For each={widths()}>{(text) => <span aria-hidden=\"true\">{text}</span>}</For>\n </span>\n {/* Both glyphs are one icon wide, so a saving picker keeps its size. */}\n <i class={props.loading ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-chevron-down\"} aria-hidden=\"true\" />\n </button>\n <div\n ref={(element) => {\n popover = element;\n // Light dismiss (a click outside) hides it without us; keep the state in step.\n element.addEventListener(\"toggle\", () => {\n if (!popoverIsOpen(element)) setOpen(false);\n });\n }}\n id={popoverId}\n class=\"k2b-period-picker__popover\"\n popover=\"auto\"\n role=\"dialog\"\n aria-label={props[\"aria-label\"] ?? (typeof props.label === \"string\" ? props.label : t().period)}\n onKeyDown={(event) => {\n if (event.key !== \"Escape\") return;\n event.preventDefault();\n event.stopPropagation();\n close();\n }}\n >\n <Show when={open()}>\n <PeriodPanel\n presets={props.presets}\n custom={custom()}\n value={value}\n initialView={view()}\n onViewChange={setView}\n context={context}\n dateConfig={dateConfig}\n presetText={presetText}\n rangeText={rangeText}\n label={props[\"aria-label\"] ?? t().period}\n onPick={pick}\n />\n </Show>\n </div>\n </Field>\n );\n}\n\nfunction PeriodPanel(props: {\n presets: readonly PeriodPreset[];\n custom: boolean;\n value: () => PeriodValue | null;\n initialView: View;\n onViewChange?: (view: View) => void;\n context: () => { today: string; weekStartsOn: 0 | 1 };\n dateConfig: () => DateContext;\n presetText: (preset: PeriodPreset) => PeriodText;\n rangeText: (range: { start: string; end: string }) => PeriodText;\n label: string;\n sheet?: boolean;\n onPick: (value: PeriodValue) => void;\n}): JSX.Element {\n const t = usePeriodPickerMessages();\n const [view, setViewSignal] = createSignal<View>(props.initialView);\n const setView = (next: View) => {\n setViewSignal(next);\n props.onViewChange?.(next);\n };\n const selected = () => props.value();\n const explicit = () => {\n const current = selected();\n return current && !(\"preset\" in current) ? current : undefined;\n };\n const isSelected = (preset: PeriodPreset) => {\n const current = selected();\n return Boolean(current && \"preset\" in current && current.preset === preset.key);\n };\n const optionCount = () => props.presets.length + (props.custom ? 1 : 0);\n const initialActive = () => {\n const index = props.presets.findIndex(isSelected);\n if (index >= 0) return index;\n return explicit() && props.custom ? props.presets.length : 0;\n };\n const [active, setActive] = createSignal(initialActive());\n let list: HTMLDivElement | undefined;\n const focusOption = (index: number) => {\n setActive(index);\n queueMicrotask(() => list?.querySelector<HTMLElement>(`[data-option-index=\"${index}\"]`)?.focus());\n };\n const onListKeyDown = (event: KeyboardEvent) => {\n const count = optionCount();\n const moves: Partial<Record<string, number>> = {\n ArrowDown: (active() + 1) % count,\n ArrowUp: (active() - 1 + count) % count,\n Home: 0,\n End: count - 1,\n };\n const next = moves[event.key];\n if (next === undefined) return;\n event.preventDefault();\n focusOption(next);\n };\n let panel: HTMLDivElement | undefined;\n const openCustom = () => {\n setActive(props.presets.length);\n setView(\"custom\");\n // In the sheet the list goes away with the focused option; focus continues on the calendar's day.\n if (props.sheet) queueMicrotask(() => panel?.querySelector<HTMLElement>('[data-date-focus=\"true\"]')?.focus());\n };\n\n return (\n <div ref={panel} class=\"k2b-period-picker__panel\" data-view={view()} data-sheet={props.sheet ? \"true\" : undefined}>\n <Show when={!props.sheet || view() === \"list\"}>\n <div ref={list} class=\"k2b-period-picker__list\" role=\"listbox\" aria-label={props.label} onKeyDown={onListKeyDown}>\n <For each={props.presets}>\n {(preset, index) => {\n const text = () => props.presetText(preset);\n return (\n <button\n type=\"button\"\n role=\"option\"\n class=\"k2b-dropdown__item k2b-period-picker__option\"\n data-option-index={index()}\n aria-selected={isSelected(preset) && view() === \"list\"}\n tabIndex={active() === index() ? 0 : -1}\n onFocus={() => setActive(index())}\n onClick={() => props.onPick({ preset: preset.key })}\n >\n <span class=\"k2b-dropdown__copy\">\n <span>{text().label}</span>\n </span>\n <span class=\"k2b-period-picker__hint\">{text().detail}</span>\n <i\n class=\"ti ti-check k2b-dropdown__check\"\n aria-hidden=\"true\"\n data-hidden={isSelected(preset) && view() === \"list\" ? undefined : \"true\"}\n />\n </button>\n );\n }}\n </For>\n <Show when={props.custom}>\n <button\n type=\"button\"\n role=\"option\"\n class=\"k2b-dropdown__item k2b-period-picker__option k2b-period-picker__custom\"\n data-option-index={props.presets.length}\n aria-selected={view() === \"custom\" || Boolean(explicit())}\n tabIndex={active() === props.presets.length ? 0 : -1}\n onFocus={() => setActive(props.presets.length)}\n onClick={openCustom}\n >\n <span class=\"k2b-dropdown__copy\">\n <span>{t().custom}</span>\n </span>\n <span class=\"k2b-period-picker__hint\">{explicit() ? props.rangeText(explicit()!).label : \"\"}</span>\n <i class=\"ti ti-chevron-right k2b-dropdown__check\" aria-hidden=\"true\" />\n </button>\n </Show>\n </div>\n </Show>\n <Show when={view() === \"custom\"}>\n <RangeEditor\n initial={(() => {\n const current = explicit();\n if (current) return current;\n const preset = props.presets.find(isSelected);\n const range: PeriodRange | undefined = preset?.resolve(props.context());\n return range?.start && range.end ? { start: range.start, end: range.end } : null;\n })()}\n today={props.context().today}\n dateConfig={props.dateConfig}\n rangeText={props.rangeText}\n sheet={props.sheet}\n onBack={() => {\n setView(\"list\");\n focusOption(props.presets.length);\n }}\n onApply={(range) => props.onPick(range)}\n />\n </Show>\n </div>\n );\n}\n\nfunction RangeEditor(props: {\n initial: { start: string; end: string } | null;\n today: string;\n dateConfig: () => DateContext;\n rangeText: (range: { start: string; end: string }) => PeriodText;\n sheet?: boolean;\n onBack: () => void;\n onApply: (range: { start: string; end: string }) => void;\n}): JSX.Element {\n const t = usePeriodPickerMessages();\n const ui = useUiMessages();\n const locale = () => props.dateConfig().locale ?? \"en\";\n const inputT = () => resolveDateInputMessages(locale());\n const config = () => ({ ...props.dateConfig(), weekStartsOn: props.dateConfig().weekStartsOn ?? props.dateConfig().firstDayOfWeek ?? 1 });\n const [draft, setDraft] = createSignal<DateRangeValue>({ start: props.initial?.start ?? null, end: props.initial?.end ?? null });\n const [anchor, setAnchor] = createSignal<string | null>(null);\n const [preview, setPreview] = createSignal<string | null>(null);\n const [startText, setStartText] = createSignal(props.initial ? formatDateInput(props.initial.start, locale()) : \"\");\n const [endText, setEndText] = createSignal(props.initial ? formatDateInput(props.initial.end, locale()) : \"\");\n const [startError, setStartError] = createSignal(\"\");\n const [endError, setEndError] = createSignal(\"\");\n // Follows the window: narrowing it below two months' room drops the second month, widening adds it.\n const query = !props.sheet && typeof matchMedia === \"function\" ? matchMedia(TWO_MONTHS_QUERY) : undefined;\n const [wide, setWide] = createSignal(Boolean(query?.matches));\n if (query) {\n const update = () => setWide(query.matches);\n query.addEventListener(\"change\", update);\n onCleanup(() => query.removeEventListener(\"change\", update));\n }\n const twoMonths = () => !props.sheet && wide();\n // Months are anchored on their 1st: stepping from 31 March or 30 November never skips a month.\n const monthOf = (key: string, offset = 0) => {\n const year = Number(key.slice(0, 4));\n const month = Number(key.slice(5, 7)) - 1 + offset;\n return parseDateValue(`${year + Math.floor(month / 12)}-${String((((month % 12) + 12) % 12) + 1).padStart(2, \"0\")}-01`, config());\n };\n const keyOf = (date: Date) => dates.formatDateKey(date, config());\n // The first visible month: the end's month, and the one before it when two months show.\n const [first, setFirstMonth] = createSignal(monthOf(props.initial?.end ?? props.today, twoMonths() ? -1 : 0));\n const setFirst = (date: Date) => setFirstMonth(monthOf(keyOf(date)));\n const second = createMemo(() => monthOf(keyOf(first()), 1));\n const shown = createMemo(() => previewRange(draft(), anchor(), preview()));\n let months: HTMLDivElement | undefined;\n const startId = createFieldMeta().controlId;\n const endId = createFieldMeta().controlId;\n\n const isShown = (date: Date) =>\n dates.isSameMonth(date, first(), config()) || (twoMonths() && dates.isSameMonth(date, second(), config()));\n\n const fill = (range: DateRangeValue) => {\n setStartText(range.start ? formatDateInput(range.start, locale()) : \"\");\n setEndText(range.end ? formatDateInput(range.end, locale()) : \"\");\n setStartError(\"\");\n setEndError(\"\");\n };\n const pickDay = (key: string) => {\n const next = pickRangeDay(draft(), anchor(), key);\n batch(() => {\n setDraft(next.range);\n setAnchor(next.anchor);\n setPreview(null);\n fill(next.range);\n });\n };\n /** Reads one typed half; returns the day, `null` for empty, or `undefined` after showing an error. */\n const readText = (text: string, setError: (message: string) => void): string | null | undefined => {\n const result = parseDateInput(text, { today: props.today, locale: locale() });\n if (result.kind === \"empty\") return null;\n if (result.kind === \"error\") {\n setError(errorText(result.error, locale(), inputT(), props.today));\n return undefined;\n }\n setError(\"\");\n return result.date;\n };\n const commitTyped = () => {\n const start = readText(startText(), setStartError);\n const end = readText(endText(), setEndError);\n if (start === undefined || end === undefined) return undefined;\n const range = { start, end };\n batch(() => {\n setDraft(range);\n setAnchor(null);\n });\n if (start && end && end < start) {\n setEndError(inputT().endBeforeStart);\n return undefined;\n }\n if (start && !end) setEndError(inputT().missingEnd);\n if (end && !start) setStartError(inputT().missingStart);\n const visible = end ?? start;\n if (visible && !isShown(parseDateValue(visible, config()))) setFirstMonth(monthOf(visible, twoMonths() ? -1 : 0));\n return start && end ? { start, end } : undefined;\n };\n const complete = () => {\n const range = draft();\n return range.start && range.end && !startError() && !endError() ? { start: range.start, end: range.end } : undefined;\n };\n const apply = () => {\n const typed = commitTyped();\n if (typed) props.onApply(typed);\n };\n const fieldKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Enter\") return;\n event.preventDefault();\n apply();\n };\n const placeholder = () =>\n dateInputPattern(locale(), { day: inputT().dayLetters, month: inputT().monthLetters, year: inputT().yearLetters });\n const status = () => {\n const range = shown();\n return range.start && range.end ? props.rangeText({ start: range.start, end: range.end }).detail : \"\";\n };\n\n const field = (fieldProps: { id: string; label: string; text: () => string; setText: (text: string) => void; error: () => string }) => (\n <div class=\"k2b-field k2b-period-picker__field\" data-invalid={fieldProps.error() ? \"true\" : undefined}>\n <label class=\"k2b-field__label\" for={fieldProps.id}>\n {fieldProps.label}\n </label>\n <div class=\"k2b-input-shell\">\n <input\n id={fieldProps.id}\n class=\"k2b-input\"\n type=\"text\"\n inputMode=\"numeric\"\n autocomplete=\"off\"\n spellcheck={false}\n placeholder={placeholder()}\n value={fieldProps.text()}\n aria-invalid={fieldProps.error() ? \"true\" : undefined}\n aria-describedby={fieldProps.error() ? `${fieldProps.id}-error` : undefined}\n onInput={(event) => fieldProps.setText(event.currentTarget.value)}\n onBlur={() => commitTyped()}\n onKeyDown={fieldKeyDown}\n />\n </div>\n <p class=\"k2b-period-picker__error\" id={`${fieldProps.id}-error`}>\n {fieldProps.error()}\n </p>\n </div>\n );\n\n return (\n <div class=\"k2b-period-picker__editor\" role=\"group\" aria-label={t().custom}>\n <Show when={props.sheet}>\n <button type=\"button\" class=\"k2b-period-picker__back\" onClick={() => props.onBack()}>\n <i class=\"ti ti-chevron-left\" aria-hidden=\"true\" />\n {t().backToPresets}\n </button>\n </Show>\n <div class=\"k2b-period-picker__fields\">\n {field({ id: startId, label: t().from, text: startText, setText: setStartText, error: startError })}\n {field({ id: endId, label: t().to, text: endText, setText: setEndText, error: endError })}\n </div>\n <div ref={months} class=\"k2b-period-picker__months\">\n <DatePickerPanel\n visibleMonth={first}\n setVisibleMonth={setFirst}\n range={shown}\n focusDate={() => draft().start}\n onSelect={pickDay}\n onDayPreview={(key) => setPreview(rangeAnchor(draft(), anchor()) ? key : null)}\n dateConfig={config()}\n nav={twoMonths() ? \"previous\" : \"both\"}\n hideOutside={twoMonths()}\n isShown={isShown}\n focusRoot={() => months}\n />\n <Show when={twoMonths()}>\n <DatePickerPanel\n visibleMonth={second}\n setVisibleMonth={(date) => setFirstMonth(monthOf(keyOf(date), -1))}\n range={shown}\n focusDate={() => draft().end}\n onSelect={pickDay}\n onDayPreview={(key) => setPreview(rangeAnchor(draft(), anchor()) ? key : null)}\n dateConfig={config()}\n nav=\"next\"\n hideOutside\n isShown={isShown}\n focusRoot={() => months}\n />\n </Show>\n </div>\n <div class=\"k2b-period-picker__actions\">\n <span class=\"k2b-date-duration\" aria-live=\"polite\">\n <Show when={shown().start && shown().end}>\n <i class=\"ti ti-hourglass-low\" aria-hidden=\"true\" />\n </Show>\n {status()}\n </span>\n <button type=\"button\" class=\"k2b-date-apply\" disabled={!complete()} onClick={apply}>\n {ui().apply}\n </button>\n </div>\n </div>\n );\n}\n\nexport default PeriodPicker;\n"],"mappings":"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","ignoreList":[]}
@@ -4,11 +4,13 @@ import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
4
4
  import { escape as _$escape } from "solid-js/web";
5
5
  import { createComponent as _$createComponent } from "solid-js/web";
6
6
  import { memo as _$memo } from "solid-js/web";
7
- var _tmpl$ = ["<span", ">", "</span>"],
8
- _tmpl$2 = ["<i", " aria-hidden=\"true\"></i>"],
9
- _tmpl$3 = ["<img", " alt>"],
10
- _tmpl$4 = ["<input type=\"hidden\"", ">"];
11
- import { createComputed, createEffect, createMemo, on, Show } from "solid-js";
7
+ var _tmpl$ = ["<span>", "</span>"],
8
+ _tmpl$2 = ["<span", ">", "</span>"],
9
+ _tmpl$3 = ["<i", " aria-hidden=\"true\"></i>"],
10
+ _tmpl$4 = ["<img", " alt>"],
11
+ _tmpl$5 = ["<span aria-hidden=\"true\">", "</span>"],
12
+ _tmpl$6 = ["<input type=\"hidden\"", ">"];
13
+ import { createComputed, createEffect, createMemo, For, on, Show } from "solid-js";
12
14
  import { Dropdown } from "../actions/Dropdown";
13
15
  import { createFieldMeta, Field, fieldControlAria } from "../internal/field";
14
16
  import { commitFieldValue, resolveMaybeAccessor } from "./field-contract";
@@ -136,16 +138,31 @@ export function SelectChip(props) {
136
138
  get when() {
137
139
  return selected()?.icon ?? props.icon;
138
140
  },
139
- children: icon => _$ssr(_tmpl$2, _$ssrAttribute("class", _$escape(icon(), true), false))
141
+ children: icon => _$ssr(_tmpl$3, _$ssrAttribute("class", _$escape(icon(), true), false))
140
142
  });
141
143
  },
142
- children: image => _$ssr(_tmpl$3, _$ssrAttribute("src", _$escape(image(), true), false))
144
+ children: image => _$ssr(_tmpl$4, _$ssrAttribute("src", _$escape(image(), true), false))
143
145
  }), _$createComponent(Show, {
144
146
  get when() {
145
147
  return !props.iconOnly;
146
148
  },
147
149
  get children() {
148
- return [_$ssr(_tmpl$, _$ssrAttribute("data-placeholder", selected() ? _$escape(undefined, true) : "true", false), _$escape(selected()?.label ?? props.placeholder ?? "")), _$ssr(_tmpl$2, _$ssrAttribute("class", props.loading ? "ti ti-loader-2 k2b-spin" : "ti ti-chevron-down", false))];
150
+ return [_$ssr(_tmpl$2, _$ssrAttribute("data-placeholder", selected() ? _$escape(undefined, true) : "true", false) + _$ssrAttribute("data-stable-width", props.stableWidth ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(Show, {
151
+ get when() {
152
+ return props.stableWidth;
153
+ },
154
+ get fallback() {
155
+ return selected()?.label ?? props.placeholder ?? "";
156
+ },
157
+ get children() {
158
+ return [_$ssr(_tmpl$, _$escape(selected()?.label ?? props.placeholder ?? "")), _$createComponent(For, {
159
+ get each() {
160
+ return props.options;
161
+ },
162
+ children: option => _$ssr(_tmpl$5, _$escape(option.label))
163
+ })];
164
+ }
165
+ }))), _$ssr(_tmpl$3, _$ssrAttribute("class", props.loading ? "ti ti-loader-2 k2b-spin" : "ti ti-chevron-down", false))];
149
166
  }
150
167
  })];
151
168
  }
@@ -155,7 +172,7 @@ export function SelectChip(props) {
155
172
  get when() {
156
173
  return props.name;
157
174
  },
158
- children: name => _$ssr(_tmpl$4, _$ssrAttribute("name", _$escape(name(), true), false) + _$ssrAttribute("value", _$escape(value(), true), false))
175
+ children: name => _$ssr(_tmpl$6, _$ssrAttribute("name", _$escape(name(), true), false) + _$ssrAttribute("value", _$escape(value(), true), false))
159
176
  })];
160
177
  }
161
178
  });
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["inputs/SelectChip.tsx"],"sourcesContent":["import { createComputed, createEffect, createMemo, type JSX, on, Show } from \"solid-js\";\nimport type { ButtonSize } from \"../actions/Button\";\nimport { Dropdown, type DropdownItem, type DropdownPosition } from \"../actions/Dropdown\";\nimport { createFieldMeta, Field, fieldControlAria } from \"../internal/field\";\nimport type { MaybeAccessor, ValueFieldProps } from \"./field-contract\";\nimport { commitFieldValue, resolveMaybeAccessor } from \"./field-contract\";\nimport { useSelectMessages } from \"./select-messages\";\n\nexport type SelectChipOption<T extends string | number = string> = {\n value: T;\n label: string;\n description?: string;\n icon?: string;\n image?: string;\n disabled?: boolean;\n};\n\nexport type SelectChipProps<T extends string | number = string> = ValueFieldProps<T> & {\n value: MaybeAccessor<T>;\n options: SelectChipOption<T>[];\n icon?: string;\n iconOnly?: boolean;\n size?: ButtonSize;\n placeholder?: string;\n position?: DropdownPosition;\n /** Exact menu width as a CSS length. Without it the menu sizes to its options, at least `10rem`. */\n menuWidth?: string;\n name?: string;\n /** Shows that a change from this chip is saving: the chip stays in place with\n * its size, cannot be opened, is marked busy, and shows a spinner where its\n * chevron (or, icon-only, its icon) is. */\n loading?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n};\n\nexport function SelectChip<T extends string | number = string>(props: SelectChipProps<T>): JSX.Element {\n const selectMessages = useSelectMessages();\n const meta = createFieldMeta(props.id);\n const value = () => resolveMaybeAccessor(props.value)!;\n const selected = () => props.options.find((option) => option.value === value());\n const disabled = createMemo(() => Boolean(props.disabled || props.loading));\n // A disabled button loses focus, so a chip disabled while a change saves (its own or one elsewhere) would leave\n // keyboard focus on the page. Focus returns to the chip once it is enabled again, unless it has moved on\n // meanwhile. The check runs as a computation, before the DOM update disables the button.\n let trigger: HTMLButtonElement | undefined;\n let refocus = false;\n createComputed(\n on(\n disabled,\n (isDisabled) => {\n if (isDisabled) refocus = trigger !== undefined && document.activeElement === trigger;\n },\n { defer: true },\n ),\n );\n createEffect(\n on(\n disabled,\n (isDisabled) => {\n if (isDisabled || !refocus) return;\n refocus = false;\n const active = document.activeElement;\n if (trigger?.isConnected && (active === null || active === document.body)) trigger.focus();\n },\n { defer: true },\n ),\n );\n const triggerLabel = () => props[\"aria-label\"] ?? (typeof props.label === \"string\" ? props.label : selectMessages().chooseOption);\n const items = createMemo<DropdownItem[]>(() =>\n props.options.map((option) => ({\n action: () => commitFieldValue(props, option.value),\n checked: () => option.value === value(),\n choice: \"radio\" as const,\n class: \"k2b-select-chip__option\",\n description: option.description,\n disabled: option.disabled,\n icon: option.icon,\n image: option.image,\n label: option.label,\n })),\n );\n\n return (\n <Field\n class={props.class}\n label={props.label}\n description={props.description}\n error={props.error}\n meta={meta}\n required={props.required}\n disabled={disabled()}\n >\n <Dropdown.Root\n // A controlled `open` cannot bypass a disabled or saving chip.\n open={props.open === undefined ? undefined : props.open && !disabled()}\n onOpenChange={props.onOpenChange}\n disabled={disabled()}\n position={props.position ?? \"bottom-right\"}\n /* Cloud opens this menu at `w-40`; the stylesheet keeps that as its floor. */\n width={props.menuWidth}\n menuClass=\"k2b-select-chip__menu\"\n label={triggerLabel()}\n items={items()}\n >\n <Dropdown.Trigger\n appearance={props.iconOnly ? \"button\" : \"plain\"}\n id={meta.controlId}\n ref={(element: HTMLButtonElement) => {\n trigger = element;\n }}\n class={props.iconOnly ? undefined : \"k2b-select-chip\"}\n disabled={disabled()}\n aria-busy={props.loading ? \"true\" : undefined}\n iconOnly={props.iconOnly}\n loading={props.iconOnly ? props.loading : undefined}\n label={triggerLabel()}\n size={props.iconOnly ? props.size : undefined}\n title={props.iconOnly ? triggerLabel() : undefined}\n {...fieldControlAria(meta, props)}\n >\n <Show\n when={selected()?.image}\n fallback={<Show when={selected()?.icon ?? props.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>}\n >\n {(image) => <img src={image()} alt=\"\" />}\n </Show>\n <Show when={!props.iconOnly}>\n <span data-placeholder={selected() ? undefined : \"true\"}>{selected()?.label ?? props.placeholder ?? \"\"}</span>\n {/* Both glyphs are one icon wide, so a saving chip keeps its size. */}\n <i class={props.loading ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-chevron-down\"} aria-hidden=\"true\" />\n </Show>\n </Dropdown.Trigger>\n </Dropdown.Root>\n <Show when={props.name}>{(name) => <input type=\"hidden\" name={name()} value={value()} />}</Show>\n </Field>\n );\n}\n\nexport default SelectChip;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["inputs/SelectChip.tsx"],"sourcesContent":["import { createComputed, createEffect, createMemo, For, type JSX, on, Show } from \"solid-js\";\nimport type { ButtonSize } from \"../actions/Button\";\nimport { Dropdown, type DropdownItem, type DropdownPosition } from \"../actions/Dropdown\";\nimport { createFieldMeta, Field, fieldControlAria } from \"../internal/field\";\nimport type { MaybeAccessor, ValueFieldProps } from \"./field-contract\";\nimport { commitFieldValue, resolveMaybeAccessor } from \"./field-contract\";\nimport { useSelectMessages } from \"./select-messages\";\n\nexport type SelectChipOption<T extends string | number = string> = {\n value: T;\n label: string;\n description?: string;\n icon?: string;\n image?: string;\n disabled?: boolean;\n};\n\nexport type SelectChipProps<T extends string | number = string> = ValueFieldProps<T> & {\n value: MaybeAccessor<T>;\n options: SelectChipOption<T>[];\n icon?: string;\n iconOnly?: boolean;\n size?: ButtonSize;\n placeholder?: string;\n position?: DropdownPosition;\n /** Exact menu width as a CSS length. Without it the menu sizes to its options, at least `10rem`. */\n menuWidth?: string;\n name?: string;\n /** Shows that a change from this chip is saving: the chip stays in place with\n * its size, cannot be opened, is marked busy, and shows a spinner where its\n * chevron (or, icon-only, its icon) is. */\n loading?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Keeps the width of the longest option label, so a new choice never moves what sits beside the chip. */\n stableWidth?: boolean;\n};\n\nexport function SelectChip<T extends string | number = string>(props: SelectChipProps<T>): JSX.Element {\n const selectMessages = useSelectMessages();\n const meta = createFieldMeta(props.id);\n const value = () => resolveMaybeAccessor(props.value)!;\n const selected = () => props.options.find((option) => option.value === value());\n const disabled = createMemo(() => Boolean(props.disabled || props.loading));\n // A disabled button loses focus, so a chip disabled while a change saves (its own or one elsewhere) would leave\n // keyboard focus on the page. Focus returns to the chip once it is enabled again, unless it has moved on\n // meanwhile. The check runs as a computation, before the DOM update disables the button.\n let trigger: HTMLButtonElement | undefined;\n let refocus = false;\n createComputed(\n on(\n disabled,\n (isDisabled) => {\n if (isDisabled) refocus = trigger !== undefined && document.activeElement === trigger;\n },\n { defer: true },\n ),\n );\n createEffect(\n on(\n disabled,\n (isDisabled) => {\n if (isDisabled || !refocus) return;\n refocus = false;\n const active = document.activeElement;\n if (trigger?.isConnected && (active === null || active === document.body)) trigger.focus();\n },\n { defer: true },\n ),\n );\n const triggerLabel = () => props[\"aria-label\"] ?? (typeof props.label === \"string\" ? props.label : selectMessages().chooseOption);\n const items = createMemo<DropdownItem[]>(() =>\n props.options.map((option) => ({\n action: () => commitFieldValue(props, option.value),\n checked: () => option.value === value(),\n choice: \"radio\" as const,\n class: \"k2b-select-chip__option\",\n description: option.description,\n disabled: option.disabled,\n icon: option.icon,\n image: option.image,\n label: option.label,\n })),\n );\n\n return (\n <Field\n class={props.class}\n label={props.label}\n description={props.description}\n error={props.error}\n meta={meta}\n required={props.required}\n disabled={disabled()}\n >\n <Dropdown.Root\n // A controlled `open` cannot bypass a disabled or saving chip.\n open={props.open === undefined ? undefined : props.open && !disabled()}\n onOpenChange={props.onOpenChange}\n disabled={disabled()}\n position={props.position ?? \"bottom-right\"}\n /* Cloud opens this menu at `w-40`; the stylesheet keeps that as its floor. */\n width={props.menuWidth}\n menuClass=\"k2b-select-chip__menu\"\n label={triggerLabel()}\n items={items()}\n >\n <Dropdown.Trigger\n appearance={props.iconOnly ? \"button\" : \"plain\"}\n id={meta.controlId}\n ref={(element: HTMLButtonElement) => {\n trigger = element;\n }}\n class={props.iconOnly ? undefined : \"k2b-select-chip\"}\n disabled={disabled()}\n aria-busy={props.loading ? \"true\" : undefined}\n iconOnly={props.iconOnly}\n loading={props.iconOnly ? props.loading : undefined}\n label={triggerLabel()}\n size={props.iconOnly ? props.size : undefined}\n title={props.iconOnly ? triggerLabel() : undefined}\n {...fieldControlAria(meta, props)}\n >\n <Show\n when={selected()?.image}\n fallback={<Show when={selected()?.icon ?? props.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>}\n >\n {(image) => <img src={image()} alt=\"\" />}\n </Show>\n <Show when={!props.iconOnly}>\n <span data-placeholder={selected() ? undefined : \"true\"} data-stable-width={props.stableWidth ? \"true\" : undefined}>\n <Show when={props.stableWidth} fallback={selected()?.label ?? props.placeholder ?? \"\"}>\n <span>{selected()?.label ?? props.placeholder ?? \"\"}</span>\n <For each={props.options}>{(option) => <span aria-hidden=\"true\">{option.label}</span>}</For>\n </Show>\n </span>\n {/* Both glyphs are one icon wide, so a saving chip keeps its size. */}\n <i class={props.loading ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-chevron-down\"} aria-hidden=\"true\" />\n </Show>\n </Dropdown.Trigger>\n </Dropdown.Root>\n <Show when={props.name}>{(name) => <input type=\"hidden\" name={name()} value={value()} />}</Show>\n </Field>\n );\n}\n\nexport default SelectChip;\n"],"mappings":"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","ignoreList":[]}
@@ -121,6 +121,19 @@ export const toDateTimeValue = (date, time, context) => {
121
121
  }
122
122
  return local;
123
123
  };
124
+
125
+ /**
126
+ * The value an applied draft commits. An untouched draft keeps the exact value: the panel shows minutes in the
127
+ * picker's zone, and a wall time that a daylight-saving change repeats names two instants, so rebuilding it could
128
+ * move the value by an hour or drop its seconds.
129
+ */
130
+ export const draftDateTimeValue = (value, date, time, context) => {
131
+ if (value) {
132
+ const current = splitDateTime(value, context);
133
+ if (current.date === date && current.time === time) return value;
134
+ }
135
+ return toDateTimeValue(date, time, context);
136
+ };
124
137
  export const formatDateTimeValue = (value, context) => value ? dates.formatDateTime(value, pickerContext(context)) : "";
125
138
  export const normalizeTimeInput = value => {
126
139
  const [hours = "", minutes = ""] = value.split(":");
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["inputs/date-picker.ts"],"sourcesContent":["import { type DateContext, dates } from \"@k2b/stdlib\";\n\nexport type DateRangeValue = {\n start: string | null;\n end: string | null;\n};\n\nexport const pickerContext = (context?: DateContext): DateContext => ({\n weekStartsOn: 1,\n ...context,\n});\n\nexport const hasInstantOffset = (value: string): boolean => /[T\\s].*([zZ]|[+-]\\d{2}:?\\d{2})$/.test(value);\n\nexport const dateKey = (date: Date | string, context?: DateContext): string => dates.formatDateKey(date, pickerContext(context));\n\n/**\n * Short month names for the month panel. `dates.months()` only returns the long\n * form (\"September\"), which overflows the three-column month grid, so the short\n * form is derived here while staying locale aware.\n */\nexport const monthNames = (context?: DateContext): string[] => {\n const merged = pickerContext(context);\n const formatter = new Intl.DateTimeFormat(merged.locale, { month: \"short\", timeZone: \"UTC\" });\n return Array.from({ length: 12 }, (_, index) => formatter.format(Date.UTC(2024, index, 15)));\n};\n\n/**\n * Picks the roving-tabindex day for a rendered month grid. The preferred day is\n * used when the grid actually contains it, otherwise the first day of the\n * visible month keeps exactly one cell reachable by Tab.\n */\nexport const resolveFocusDay = (monthDayKeys: readonly string[], preferred: string | null | undefined): string | undefined =>\n preferred && monthDayKeys.includes(preferred) ? preferred : monthDayKeys[0];\n\nexport const yearMonth = (date: Date, context?: DateContext): { year: number; month: number } => {\n const [year = \"1970\", month = \"1\"] = dateKey(date, context).split(\"-\");\n return { year: Number(year), month: Number(month) - 1 };\n};\n\nexport const monthDate = (year: number, month: number, context?: DateContext): Date => {\n const value = `${year}-${String(month + 1).padStart(2, \"0\")}-01T12:00`;\n if (context?.timeZone) {\n return new Date(dates.zonedDateTimeToInstant(value, context.timeZone, { disambiguation: \"compatible\" }));\n }\n return new Date(year, month, 1, 12);\n};\n\n/**\n * Milliseconds from `now` until the next calendar day starts in the picker's\n * time zone, so a panel left open past midnight moves its today mark on time.\n * The next day's start is resolved from its date key: where a DST change skips\n * or repeats midnight, the day starts at its first existing instant.\n */\nexport const msUntilNextDay = (now: Date, context?: DateContext): number => {\n const merged = pickerContext(context);\n const { timeZone } = merged;\n const next = timeZone\n ? Date.parse(\n dates.zonedDateTimeToInstant(dates.addZoned(`${dateKey(now, merged)}T00:00`, { timeZone, days: 1 }), timeZone, {\n disambiguation: \"compatible\",\n }),\n )\n : dates.addDays(now, 1, merged).getTime();\n const delay = next - now.getTime();\n // The timer re-arms after every tick, so it must never fire at once. Should a\n // zone's rules still put the next day behind `now`, look again in a minute,\n // the finest unit the pickers show.\n return delay > 0 ? delay : 60_000;\n};\n\n/** Whether `value` is a date key such as `2026-10-24`, a date without a time. */\nexport const isDateKey = (value: string): boolean => /^\\d{4}-\\d{2}-\\d{2}$/.test(value);\n\nexport const parseDateValue = (value: string | null | undefined, context?: DateContext): Date => {\n if (!value) return dates.today(pickerContext(context));\n return dates.parseCalendarDate(value.slice(0, 10), pickerContext(context));\n};\n\n/** A date key names a calendar day, so it is formatted at noon UTC in UTC: no runtime or picker zone can move it. */\nexport const displayDate = (value: string | null | undefined, context?: DateContext): string =>\n value ? dates.formatDate(`${value.slice(0, 10)}T12:00:00.000Z`, { ...pickerContext(context), timeZone: \"UTC\" }) : \"\";\n\nconst localDateTimeInput = (value: string): string => {\n if (!hasInstantOffset(value)) return value.slice(0, 16);\n const date = new Date(value);\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n return `${year}-${month}-${day}T${hours}:${minutes}`;\n};\n\nexport const dateTimeInput = (value: string | null | undefined, context?: DateContext): string => {\n if (!value) return \"\";\n if (context?.timeZone && hasInstantOffset(value)) return dates.instantToZonedInput(value, context.timeZone);\n return localDateTimeInput(value);\n};\n\nexport const splitDateTime = (value: string | null | undefined, context?: DateContext): { date: string; time: string } => {\n const input = dateTimeInput(value, context);\n const [date = \"\", time = \"\"] = input.split(\"T\");\n return { date, time: time.slice(0, 5) };\n};\n\nexport const isCompleteTime = (value: string): boolean => {\n if (!/^\\d{2}:\\d{2}$/.test(value)) return false;\n const [hours, minutes] = value.split(\":\").map(Number);\n return hours! >= 0 && hours! <= 23 && minutes! >= 0 && minutes! <= 59;\n};\n\nexport const toDateTimeValue = (date: string, time: string, context?: DateContext): string | null => {\n if (!date) return null;\n const resolvedTime = time || \"00:00\";\n if (!isCompleteTime(resolvedTime)) return null;\n const local = `${date}T${resolvedTime}`;\n if (context?.timeZone) {\n return dates.zonedDateTimeToInstant(local, context.timeZone, { disambiguation: \"compatible\" });\n }\n return local;\n};\n\nexport const formatDateTimeValue = (value: string | null | undefined, context?: DateContext): string =>\n value ? dates.formatDateTime(value, pickerContext(context)) : \"\";\n\nexport const normalizeTimeInput = (value: string): string => {\n const [hours = \"\", minutes = \"\"] = value.split(\":\");\n const hour = Math.max(0, Math.min(23, Number(hours || 0)));\n const minute = Math.max(0, Math.min(59, Number(minutes || 0)));\n return `${String(hour).padStart(2, \"0\")}:${String(minute).padStart(2, \"0\")}`;\n};\n\nexport const filterTimeInput = (value: string): string => {\n const digits = value.replace(/\\D/g, \"\").slice(0, 4);\n return digits.length <= 2 ? digits : `${digits.slice(0, 2)}:${digits.slice(2)}`;\n};\n\nexport const orderedRange = (start: string, end: string): DateRangeValue =>\n end.localeCompare(start) < 0 ? { start: end, end: start } : { start, end };\n\n/**\n * The range a click picks. A click starts a complete one-day range on its day, and it becomes the anchor; the next\n * click on another day extends the range from the anchor, whichever side it lies on. A click on the anchor keeps the\n * one-day range. After an extension, the next click starts a new one-day range.\n */\nexport const pickRangeDay = (\n range: DateRangeValue,\n anchor: string | null,\n day: string,\n): { range: DateRangeValue; anchor: string | null } => {\n if (rangeAnchor(range, anchor) && day !== anchor) return { range: orderedRange(anchor!, day), anchor: null };\n return { range: { start: day, end: day }, anchor: day };\n};\n\n/** The anchor that the next click extends from: only while the range is still the one-day range of its click. */\nexport const rangeAnchor = (range: DateRangeValue, anchor: string | null): string | null =>\n anchor && range.start === anchor && range.end === anchor ? anchor : null;\n\n/** The range shown while the pointer or focus rests on `preview`: the extension that a click there would pick. */\nexport const previewRange = (range: DateRangeValue, anchor: string | null, preview: string | null): DateRangeValue => {\n const from = rangeAnchor(range, anchor);\n return from && preview ? orderedRange(from, preview) : range;\n};\n\nexport const inRange = (day: string, range: DateRangeValue): boolean =>\n Boolean(range.start && range.end && day >= range.start && day <= range.end);\n\nexport const isRangeEdge = (day: string, range: DateRangeValue): boolean => day === range.start || day === range.end;\n\nexport const formatDateOnlyRangeDuration = (range: DateRangeValue, context?: DateContext): string => {\n if (!range.start || !range.end) return \"\";\n const start = Date.parse(`${dateKey(range.start, context)}T00:00:00.000Z`);\n const end = Date.parse(`${dateKey(range.end, context)}T00:00:00.000Z`);\n const days = Math.floor(Math.abs(end - start) / 86_400_000) + 1;\n return new Intl.NumberFormat(pickerContext(context).locale ?? \"en\", { style: \"unit\", unit: \"day\", unitDisplay: \"long\" }).format(days);\n};\n\n/**\n * The weekend bands of a week row: one band per run of adjacent weekend columns, as a zero-based start column and a\n * number of columns. Saturday and Sunday in a week from Monday are one band of two; in a week from Sunday they are\n * two bands at both ends.\n */\nexport const weekendBands = (weekend: readonly boolean[]): { start: number; span: number }[] => {\n const bands: { start: number; span: number }[] = [];\n weekend.forEach((isWeekend, column) => {\n if (!isWeekend) return;\n const last = bands.at(-1);\n if (last && last.start + last.span === column) last.span += 1;\n else bands.push({ start: column, span: 1 });\n });\n return bands;\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["inputs/date-picker.ts"],"sourcesContent":["import { type DateContext, dates } from \"@k2b/stdlib\";\n\nexport type DateRangeValue = {\n start: string | null;\n end: string | null;\n};\n\nexport const pickerContext = (context?: DateContext): DateContext => ({\n weekStartsOn: 1,\n ...context,\n});\n\nexport const hasInstantOffset = (value: string): boolean => /[T\\s].*([zZ]|[+-]\\d{2}:?\\d{2})$/.test(value);\n\nexport const dateKey = (date: Date | string, context?: DateContext): string => dates.formatDateKey(date, pickerContext(context));\n\n/**\n * Short month names for the month panel. `dates.months()` only returns the long\n * form (\"September\"), which overflows the three-column month grid, so the short\n * form is derived here while staying locale aware.\n */\nexport const monthNames = (context?: DateContext): string[] => {\n const merged = pickerContext(context);\n const formatter = new Intl.DateTimeFormat(merged.locale, { month: \"short\", timeZone: \"UTC\" });\n return Array.from({ length: 12 }, (_, index) => formatter.format(Date.UTC(2024, index, 15)));\n};\n\n/**\n * Picks the roving-tabindex day for a rendered month grid. The preferred day is\n * used when the grid actually contains it, otherwise the first day of the\n * visible month keeps exactly one cell reachable by Tab.\n */\nexport const resolveFocusDay = (monthDayKeys: readonly string[], preferred: string | null | undefined): string | undefined =>\n preferred && monthDayKeys.includes(preferred) ? preferred : monthDayKeys[0];\n\nexport const yearMonth = (date: Date, context?: DateContext): { year: number; month: number } => {\n const [year = \"1970\", month = \"1\"] = dateKey(date, context).split(\"-\");\n return { year: Number(year), month: Number(month) - 1 };\n};\n\nexport const monthDate = (year: number, month: number, context?: DateContext): Date => {\n const value = `${year}-${String(month + 1).padStart(2, \"0\")}-01T12:00`;\n if (context?.timeZone) {\n return new Date(dates.zonedDateTimeToInstant(value, context.timeZone, { disambiguation: \"compatible\" }));\n }\n return new Date(year, month, 1, 12);\n};\n\n/**\n * Milliseconds from `now` until the next calendar day starts in the picker's\n * time zone, so a panel left open past midnight moves its today mark on time.\n * The next day's start is resolved from its date key: where a DST change skips\n * or repeats midnight, the day starts at its first existing instant.\n */\nexport const msUntilNextDay = (now: Date, context?: DateContext): number => {\n const merged = pickerContext(context);\n const { timeZone } = merged;\n const next = timeZone\n ? Date.parse(\n dates.zonedDateTimeToInstant(dates.addZoned(`${dateKey(now, merged)}T00:00`, { timeZone, days: 1 }), timeZone, {\n disambiguation: \"compatible\",\n }),\n )\n : dates.addDays(now, 1, merged).getTime();\n const delay = next - now.getTime();\n // The timer re-arms after every tick, so it must never fire at once. Should a\n // zone's rules still put the next day behind `now`, look again in a minute,\n // the finest unit the pickers show.\n return delay > 0 ? delay : 60_000;\n};\n\n/** Whether `value` is a date key such as `2026-10-24`, a date without a time. */\nexport const isDateKey = (value: string): boolean => /^\\d{4}-\\d{2}-\\d{2}$/.test(value);\n\nexport const parseDateValue = (value: string | null | undefined, context?: DateContext): Date => {\n if (!value) return dates.today(pickerContext(context));\n return dates.parseCalendarDate(value.slice(0, 10), pickerContext(context));\n};\n\n/** A date key names a calendar day, so it is formatted at noon UTC in UTC: no runtime or picker zone can move it. */\nexport const displayDate = (value: string | null | undefined, context?: DateContext): string =>\n value ? dates.formatDate(`${value.slice(0, 10)}T12:00:00.000Z`, { ...pickerContext(context), timeZone: \"UTC\" }) : \"\";\n\nconst localDateTimeInput = (value: string): string => {\n if (!hasInstantOffset(value)) return value.slice(0, 16);\n const date = new Date(value);\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n return `${year}-${month}-${day}T${hours}:${minutes}`;\n};\n\nexport const dateTimeInput = (value: string | null | undefined, context?: DateContext): string => {\n if (!value) return \"\";\n if (context?.timeZone && hasInstantOffset(value)) return dates.instantToZonedInput(value, context.timeZone);\n return localDateTimeInput(value);\n};\n\nexport const splitDateTime = (value: string | null | undefined, context?: DateContext): { date: string; time: string } => {\n const input = dateTimeInput(value, context);\n const [date = \"\", time = \"\"] = input.split(\"T\");\n return { date, time: time.slice(0, 5) };\n};\n\nexport const isCompleteTime = (value: string): boolean => {\n if (!/^\\d{2}:\\d{2}$/.test(value)) return false;\n const [hours, minutes] = value.split(\":\").map(Number);\n return hours! >= 0 && hours! <= 23 && minutes! >= 0 && minutes! <= 59;\n};\n\nexport const toDateTimeValue = (date: string, time: string, context?: DateContext): string | null => {\n if (!date) return null;\n const resolvedTime = time || \"00:00\";\n if (!isCompleteTime(resolvedTime)) return null;\n const local = `${date}T${resolvedTime}`;\n if (context?.timeZone) {\n return dates.zonedDateTimeToInstant(local, context.timeZone, { disambiguation: \"compatible\" });\n }\n return local;\n};\n\n/**\n * The value an applied draft commits. An untouched draft keeps the exact value: the panel shows minutes in the\n * picker's zone, and a wall time that a daylight-saving change repeats names two instants, so rebuilding it could\n * move the value by an hour or drop its seconds.\n */\nexport const draftDateTimeValue = (value: string | null | undefined, date: string, time: string, context?: DateContext): string | null => {\n if (value) {\n const current = splitDateTime(value, context);\n if (current.date === date && current.time === time) return value;\n }\n return toDateTimeValue(date, time, context);\n};\n\nexport const formatDateTimeValue = (value: string | null | undefined, context?: DateContext): string =>\n value ? dates.formatDateTime(value, pickerContext(context)) : \"\";\n\nexport const normalizeTimeInput = (value: string): string => {\n const [hours = \"\", minutes = \"\"] = value.split(\":\");\n const hour = Math.max(0, Math.min(23, Number(hours || 0)));\n const minute = Math.max(0, Math.min(59, Number(minutes || 0)));\n return `${String(hour).padStart(2, \"0\")}:${String(minute).padStart(2, \"0\")}`;\n};\n\nexport const filterTimeInput = (value: string): string => {\n const digits = value.replace(/\\D/g, \"\").slice(0, 4);\n return digits.length <= 2 ? digits : `${digits.slice(0, 2)}:${digits.slice(2)}`;\n};\n\nexport const orderedRange = (start: string, end: string): DateRangeValue =>\n end.localeCompare(start) < 0 ? { start: end, end: start } : { start, end };\n\n/**\n * The range a click picks. A click starts a complete one-day range on its day, and it becomes the anchor; the next\n * click on another day extends the range from the anchor, whichever side it lies on. A click on the anchor keeps the\n * one-day range. After an extension, the next click starts a new one-day range.\n */\nexport const pickRangeDay = (\n range: DateRangeValue,\n anchor: string | null,\n day: string,\n): { range: DateRangeValue; anchor: string | null } => {\n if (rangeAnchor(range, anchor) && day !== anchor) return { range: orderedRange(anchor!, day), anchor: null };\n return { range: { start: day, end: day }, anchor: day };\n};\n\n/** The anchor that the next click extends from: only while the range is still the one-day range of its click. */\nexport const rangeAnchor = (range: DateRangeValue, anchor: string | null): string | null =>\n anchor && range.start === anchor && range.end === anchor ? anchor : null;\n\n/** The range shown while the pointer or focus rests on `preview`: the extension that a click there would pick. */\nexport const previewRange = (range: DateRangeValue, anchor: string | null, preview: string | null): DateRangeValue => {\n const from = rangeAnchor(range, anchor);\n return from && preview ? orderedRange(from, preview) : range;\n};\n\nexport const inRange = (day: string, range: DateRangeValue): boolean =>\n Boolean(range.start && range.end && day >= range.start && day <= range.end);\n\nexport const isRangeEdge = (day: string, range: DateRangeValue): boolean => day === range.start || day === range.end;\n\nexport const formatDateOnlyRangeDuration = (range: DateRangeValue, context?: DateContext): string => {\n if (!range.start || !range.end) return \"\";\n const start = Date.parse(`${dateKey(range.start, context)}T00:00:00.000Z`);\n const end = Date.parse(`${dateKey(range.end, context)}T00:00:00.000Z`);\n const days = Math.floor(Math.abs(end - start) / 86_400_000) + 1;\n return new Intl.NumberFormat(pickerContext(context).locale ?? \"en\", { style: \"unit\", unit: \"day\", unitDisplay: \"long\" }).format(days);\n};\n\n/**\n * The weekend bands of a week row: one band per run of adjacent weekend columns, as a zero-based start column and a\n * number of columns. Saturday and Sunday in a week from Monday are one band of two; in a week from Sunday they are\n * two bands at both ends.\n */\nexport const weekendBands = (weekend: readonly boolean[]): { start: number; span: number }[] => {\n const bands: { start: number; span: number }[] = [];\n weekend.forEach((isWeekend, column) => {\n if (!isWeekend) return;\n const last = bands.at(-1);\n if (last && last.start + last.span === column) last.span += 1;\n else bands.push({ start: column, span: 1 });\n });\n return bands;\n};\n"],"mappings":"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","ignoreList":[]}
@@ -5,7 +5,7 @@ export { CheckboxCard } from "./CheckboxCard";
5
5
  export { ChoiceChips } from "./ChoiceChips";
6
6
  export { ColorInput, PinInput, Slider } from "./ChoiceInputs";
7
7
  export { ChoiceList } from "./ChoiceList";
8
- export { ChoiceSlider } from "./ChoiceSlider";
8
+ export { ChoiceSlider, ChoiceSliderIndicator } from "./ChoiceSlider";
9
9
  export { ChoiceTiles } from "./ChoiceTiles";
10
10
  export { ColorChoices } from "./ColorChoices";
11
11
  export { Combobox } from "./Combobox";
@@ -22,7 +22,10 @@ export { DEFAULT_ICON_GROUPS, DEFAULT_ICON_OPTIONS } from "./icon-options";
22
22
  export { clampImageCropRect, createCroppedImageCanvas, createCroppedImageDataUrl, getInitialImageCropRect, imageCropRectToPixels, normalizeImageCropRotation, resizeImageCropAroundCenter, rotateImageCropRight } from "./image-crop";
23
23
  export { MultiSelectInput } from "./MultiSelectInput";
24
24
  export { MarkdownEditor } from "./markdown/MarkdownEditor";
25
+ export { SlashCommands } from "./markdown/SlashCommands";
25
26
  export { NumberInput } from "./NumberInput";
27
+ export { PeriodPicker } from "./PeriodPicker";
28
+ export { formatPeriodDays, formatPeriodRange, isPeriodDay, parsePeriodValue, periodContext, periodDayCount, periodInstants, periodPresets, resolvePeriod } from "./period";
26
29
  export { QrScanner } from "./QrScanner";
27
30
  export { RichSelect, RichSelectFacts } from "./RichSelect";
28
31
  export { Select } from "./Select";
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["inputs/index.ts"],"sourcesContent":["export type { AutocompleteEditorProps } from \"./AutocompleteEditor\";\nexport { AutocompleteEditor } from \"./AutocompleteEditor\";\nexport type {\n AutocompleteSelectOption,\n AutocompleteSelectProps,\n AutocompleteSelectSearchResult,\n} from \"./AutocompleteSelect\";\nexport { AutocompleteSelect } from \"./AutocompleteSelect\";\nexport type { CheckboxProps } from \"./Checkbox\";\nexport { Checkbox } from \"./Checkbox\";\nexport type { CheckboxCardProps } from \"./CheckboxCard\";\nexport { CheckboxCard } from \"./CheckboxCard\";\nexport type { ChoiceChipOption, ChoiceChipsProps } from \"./ChoiceChips\";\nexport { ChoiceChips } from \"./ChoiceChips\";\nexport type {\n ColorInputProps,\n PinInputProps,\n SliderProps,\n} from \"./ChoiceInputs\";\nexport { ColorInput, PinInput, Slider } from \"./ChoiceInputs\";\nexport type { ChoiceListOption, ChoiceListProps } from \"./ChoiceList\";\nexport { ChoiceList } from \"./ChoiceList\";\nexport type { ChoiceSliderOption, ChoiceSliderProps } from \"./ChoiceSlider\";\nexport { ChoiceSlider } from \"./ChoiceSlider\";\nexport type { ChoiceTileOption, ChoiceTilesProps } from \"./ChoiceTiles\";\nexport { ChoiceTiles } from \"./ChoiceTiles\";\nexport type { ColorChoiceOption, ColorChoicesProps } from \"./ColorChoices\";\nexport { ColorChoices } from \"./ColorChoices\";\nexport type { ComboboxOption, ComboboxProps } from \"./Combobox\";\nexport { Combobox } from \"./Combobox\";\nexport type { ChoiceOption, ChoiceOptionsLoader } from \"./choice\";\nexport type {\n Completion,\n QueryContext,\n SuggestContext,\n Suggestion,\n} from \"./completion\";\nexport { abbreviations } from \"./completion\";\nexport type {\n DatePickerBaseProps,\n DatePickerProps,\n DatePreset,\n DateRangePickerProps,\n DateRangeValue,\n DateTimePickerProps,\n DurationPreset,\n} from \"./DatePicker\";\nexport { DatePicker, DateRangePicker, DateTimePicker } from \"./DatePicker\";\nexport type { DictationController, DictationNotice, DictationOptions, DictationStatus } from \"./dictation/create-dictation\";\nexport { createDictation } from \"./dictation/create-dictation\";\nexport type { DictationBarProps, DictationButtonProps } from \"./dictation/Dictation\";\nexport { DictationBar, DictationButton, dictationBarShown } from \"./dictation/Dictation\";\nexport type {\n DictationAlternative,\n DictationDevice,\n DictationEndReason,\n DictationErrorCode,\n DictationEvent,\n DictationSession,\n DictationSource,\n DictationTarget,\n} from \"./dictation/types\";\nexport type { EmojiPickerPopoverProps, EmojiPickerProps } from \"./emoji/EmojiPicker\";\nexport { EmojiPicker } from \"./emoji/EmojiPicker\";\nexport type { EmojiSkinTone } from \"./emoji/emoji-index\";\nexport { rememberEmoji } from \"./emoji/emoji-index\";\nexport type { FileDropDetails, FileDropOptions, FileDropRejection, FileDropTargetProps } from \"./FileDropTarget\";\nexport { FileDropTarget, fileDropTarget } from \"./FileDropTarget\";\nexport type { FileDropzoneProps, ImageCropperProps, ImageInputProps } from \"./FileInputs\";\nexport { FileDropzone, ImageCropper, ImageInput } from \"./FileInputs\";\nexport type { DateContext, FieldProps, MaybeAccessor, ValueFieldProps } from \"./field-contract\";\nexport type { IconChoiceOption, IconChoicesProps } from \"./IconChoices\";\nexport { IconChoices } from \"./IconChoices\";\nexport { DEFAULT_ICON_GROUPS, DEFAULT_ICON_OPTIONS } from \"./icon-options\";\nexport type {\n ImageCropAspect,\n ImageCropOutput,\n ImageCropRect,\n ImageCropRotation,\n ImageCropSize,\n ImageCropSource,\n ImageCropState,\n} from \"./image-crop\";\nexport {\n clampImageCropRect,\n createCroppedImageCanvas,\n createCroppedImageDataUrl,\n getInitialImageCropRect,\n imageCropRectToPixels,\n normalizeImageCropRotation,\n resizeImageCropAroundCenter,\n rotateImageCropRight,\n} from \"./image-crop\";\nexport type {\n MultiSelectFetchDataFn,\n MultiSelectInputProps,\n MultiSelectOption,\n} from \"./MultiSelectInput\";\nexport { MultiSelectInput } from \"./MultiSelectInput\";\nexport type { MarkdownEditorProps } from \"./markdown/MarkdownEditor\";\nexport { MarkdownEditor } from \"./markdown/MarkdownEditor\";\nexport type { NumberInputProps } from \"./NumberInput\";\nexport { NumberInput } from \"./NumberInput\";\nexport type { QrScannerError, QrScannerProps } from \"./QrScanner\";\nexport { QrScanner } from \"./QrScanner\";\nexport type {\n RichSelectFact,\n RichSelectFooter,\n RichSelectItem,\n RichSelectProps,\n RichSelectSection,\n RichSelectStatus,\n} from \"./RichSelect\";\nexport { RichSelect, RichSelectFacts } from \"./RichSelect\";\nexport type { ChoiceAppearance, SelectGridSize, SelectGroup, SelectOption, SelectProps, SelectSourceOption, SelectView } from \"./Select\";\nexport { Select } from \"./Select\";\nexport type { SelectChipOption, SelectChipProps } from \"./SelectChip\";\nexport { SelectChip } from \"./SelectChip\";\nexport type { SignatureInputProps } from \"./SignatureInput\";\nexport { SignatureInput } from \"./SignatureInput\";\nexport type { IconInputProps, IconOption } from \"./SpecialInputs\";\nexport { IconInput } from \"./SpecialInputs\";\nexport type { SwitchProps } from \"./Switch\";\nexport { Switch } from \"./Switch\";\nexport type { SignaturePngOptions, SignatureValue } from \"./signature\";\nexport { parseSignature, signatureToPng } from \"./signature\";\nexport type { TagEditorItem, TagEditorLabels, TagEditorProps, TagEditorValue } from \"./TagEditor\";\nexport { TagEditor } from \"./TagEditor\";\nexport type { TagsInputProps } from \"./TagsInput\";\nexport { TagsInput } from \"./TagsInput\";\nexport type {\n TemplateEditorLayout,\n TemplateEditorProps,\n TemplatePreviewProps,\n TemplateSampleDataProps,\n TemplateVariable,\n TemplateVariableKind,\n} from \"./TemplateEditor\";\nexport {\n createTemplateEditorPanesLayout,\n TemplateEditor,\n TemplatePreview,\n TemplateSampleData,\n} from \"./TemplateEditor\";\nexport type { TextInputProps } from \"./TextInput\";\nexport { TextInput } from \"./TextInput\";\n"],"mappings":"AACA,SAAS,kBAAkB,QAAQ,sBAAsB;AAMzD,SAAS,kBAAkB,QAAQ,sBAAsB;AAEzD,SAAS,QAAQ,QAAQ,YAAY;AAErC,SAAS,YAAY,QAAQ,gBAAgB;AAE7C,SAAS,WAAW,QAAQ,eAAe;AAM3C,SAAS,UAAU,EAAE,QAAQ,EAAE,MAAM,QAAQ,gBAAgB;AAE7D,SAAS,UAAU,QAAQ,cAAc;AAEzC,SAAS,YAAY,QAAQ,gBAAgB;AAE7C,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,YAAY,QAAQ,gBAAgB;AAE7C,SAAS,QAAQ,QAAQ,YAAY;AAQrC,SAAS,aAAa,QAAQ,cAAc;AAU5C,SAAS,UAAU,EAAE,eAAe,EAAE,cAAc,QAAQ,cAAc;AAE1E,SAAS,eAAe,QAAQ,8BAA8B;AAE9D,SAAS,YAAY,EAAE,eAAe,EAAE,iBAAiB,QAAQ,uBAAuB;AAYxF,SAAS,WAAW,QAAQ,qBAAqB;AAEjD,SAAS,aAAa,QAAQ,qBAAqB;AAEnD,SAAS,cAAc,EAAE,cAAc,QAAQ,kBAAkB;AAEjE,SAAS,YAAY,EAAE,YAAY,EAAE,UAAU,QAAQ,cAAc;AAGrE,SAAS,WAAW,QAAQ,eAAe;AAC3C,SAAS,mBAAmB,EAAE,oBAAoB,QAAQ,gBAAgB;AAU1E,SACE,kBAAkB,EAClB,wBAAwB,EACxB,yBAAyB,EACzB,uBAAuB,EACvB,qBAAqB,EACrB,0BAA0B,EAC1B,2BAA2B,EAC3B,oBAAoB,QACf,cAAc;AAMrB,SAAS,gBAAgB,QAAQ,oBAAoB;AAErD,SAAS,cAAc,QAAQ,2BAA2B;AAE1D,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,SAAS,QAAQ,aAAa;AASvC,SAAS,UAAU,EAAE,eAAe,QAAQ,cAAc;AAE1D,SAAS,MAAM,QAAQ,UAAU;AAEjC,SAAS,UAAU,QAAQ,cAAc;AAEzC,SAAS,cAAc,QAAQ,kBAAkB;AAEjD,SAAS,SAAS,QAAQ,iBAAiB;AAE3C,SAAS,MAAM,QAAQ,UAAU;AAEjC,SAAS,cAAc,EAAE,cAAc,QAAQ,aAAa;AAE5D,SAAS,SAAS,QAAQ,aAAa;AAEvC,SAAS,SAAS,QAAQ,aAAa;AASvC,SACE,+BAA+B,EAC/B,cAAc,EACd,eAAe,EACf,kBAAkB,QACb,kBAAkB;AAEzB,SAAS,SAAS,QAAQ,aAAa","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["inputs/index.ts"],"sourcesContent":["export type { AutocompleteEditorProps } from \"./AutocompleteEditor\";\nexport { AutocompleteEditor } from \"./AutocompleteEditor\";\nexport type {\n AutocompleteSelectOption,\n AutocompleteSelectProps,\n AutocompleteSelectSearchResult,\n} from \"./AutocompleteSelect\";\nexport { AutocompleteSelect } from \"./AutocompleteSelect\";\nexport type { CheckboxProps } from \"./Checkbox\";\nexport { Checkbox } from \"./Checkbox\";\nexport type { CheckboxCardProps } from \"./CheckboxCard\";\nexport { CheckboxCard } from \"./CheckboxCard\";\nexport type { ChoiceChipOption, ChoiceChipsProps } from \"./ChoiceChips\";\nexport { ChoiceChips } from \"./ChoiceChips\";\nexport type {\n ColorInputProps,\n PinInputProps,\n SliderProps,\n} from \"./ChoiceInputs\";\nexport { ColorInput, PinInput, Slider } from \"./ChoiceInputs\";\nexport type { ChoiceListOption, ChoiceListProps } from \"./ChoiceList\";\nexport { ChoiceList } from \"./ChoiceList\";\nexport type { ChoiceSliderIndicatorProps, ChoiceSliderOption, ChoiceSliderProps } from \"./ChoiceSlider\";\nexport { ChoiceSlider, ChoiceSliderIndicator } from \"./ChoiceSlider\";\nexport type { ChoiceTileOption, ChoiceTilesProps } from \"./ChoiceTiles\";\nexport { ChoiceTiles } from \"./ChoiceTiles\";\nexport type { ColorChoiceOption, ColorChoicesProps } from \"./ColorChoices\";\nexport { ColorChoices } from \"./ColorChoices\";\nexport type { ComboboxOption, ComboboxProps } from \"./Combobox\";\nexport { Combobox } from \"./Combobox\";\nexport type { ChoiceOption, ChoiceOptionsLoader } from \"./choice\";\nexport type {\n Completion,\n QueryContext,\n SuggestContext,\n Suggestion,\n} from \"./completion\";\nexport { abbreviations } from \"./completion\";\nexport type {\n DatePickerBaseProps,\n DatePickerProps,\n DatePreset,\n DateRangePickerProps,\n DateRangeValue,\n DateTimePickerProps,\n DurationPreset,\n} from \"./DatePicker\";\nexport { DatePicker, DateRangePicker, DateTimePicker } from \"./DatePicker\";\nexport type { DictationController, DictationNotice, DictationOptions, DictationStatus } from \"./dictation/create-dictation\";\nexport { createDictation } from \"./dictation/create-dictation\";\nexport type { DictationBarProps, DictationButtonProps } from \"./dictation/Dictation\";\nexport { DictationBar, DictationButton, dictationBarShown } from \"./dictation/Dictation\";\nexport type {\n DictationAlternative,\n DictationDevice,\n DictationEndReason,\n DictationErrorCode,\n DictationEvent,\n DictationSession,\n DictationSource,\n DictationTarget,\n} from \"./dictation/types\";\nexport type { EmojiPickerPopoverProps, EmojiPickerProps } from \"./emoji/EmojiPicker\";\nexport { EmojiPicker } from \"./emoji/EmojiPicker\";\nexport type { EmojiSkinTone } from \"./emoji/emoji-index\";\nexport { rememberEmoji } from \"./emoji/emoji-index\";\nexport type { FileDropDetails, FileDropOptions, FileDropRejection, FileDropTargetProps } from \"./FileDropTarget\";\nexport { FileDropTarget, fileDropTarget } from \"./FileDropTarget\";\nexport type { FileDropzoneProps, ImageCropperProps, ImageInputProps } from \"./FileInputs\";\nexport { FileDropzone, ImageCropper, ImageInput } from \"./FileInputs\";\nexport type { DateContext, FieldProps, MaybeAccessor, ValueFieldProps } from \"./field-contract\";\nexport type { IconChoiceOption, IconChoicesProps } from \"./IconChoices\";\nexport { IconChoices } from \"./IconChoices\";\nexport { DEFAULT_ICON_GROUPS, DEFAULT_ICON_OPTIONS } from \"./icon-options\";\nexport type {\n ImageCropAspect,\n ImageCropOutput,\n ImageCropRect,\n ImageCropRotation,\n ImageCropSize,\n ImageCropSource,\n ImageCropState,\n} from \"./image-crop\";\nexport {\n clampImageCropRect,\n createCroppedImageCanvas,\n createCroppedImageDataUrl,\n getInitialImageCropRect,\n imageCropRectToPixels,\n normalizeImageCropRotation,\n resizeImageCropAroundCenter,\n rotateImageCropRight,\n} from \"./image-crop\";\nexport type {\n MultiSelectFetchDataFn,\n MultiSelectInputProps,\n MultiSelectOption,\n} from \"./MultiSelectInput\";\nexport { MultiSelectInput } from \"./MultiSelectInput\";\nexport type { MarkdownEditorProps } from \"./markdown/MarkdownEditor\";\nexport { MarkdownEditor } from \"./markdown/MarkdownEditor\";\nexport type { SlashCommandsProps } from \"./markdown/SlashCommands\";\nexport { SlashCommands } from \"./markdown/SlashCommands\";\nexport type { NumberInputProps } from \"./NumberInput\";\nexport { NumberInput } from \"./NumberInput\";\nexport type { PeriodPickerProps } from \"./PeriodPicker\";\nexport { PeriodPicker } from \"./PeriodPicker\";\nexport type { PeriodClock, PeriodContext, PeriodPreset, PeriodRange, PeriodValue } from \"./period\";\nexport {\n formatPeriodDays,\n formatPeriodRange,\n isPeriodDay,\n parsePeriodValue,\n periodContext,\n periodDayCount,\n periodInstants,\n periodPresets,\n resolvePeriod,\n} from \"./period\";\nexport type { QrScannerError, QrScannerProps } from \"./QrScanner\";\nexport { QrScanner } from \"./QrScanner\";\nexport type {\n RichSelectFact,\n RichSelectFooter,\n RichSelectItem,\n RichSelectProps,\n RichSelectSection,\n RichSelectStatus,\n} from \"./RichSelect\";\nexport { RichSelect, RichSelectFacts } from \"./RichSelect\";\nexport type { ChoiceAppearance, SelectGridSize, SelectGroup, SelectOption, SelectProps, SelectSourceOption, SelectView } from \"./Select\";\nexport { Select } from \"./Select\";\nexport type { SelectChipOption, SelectChipProps } from \"./SelectChip\";\nexport { SelectChip } from \"./SelectChip\";\nexport type { SignatureInputProps } from \"./SignatureInput\";\nexport { SignatureInput } from \"./SignatureInput\";\nexport type { IconInputProps, IconOption } from \"./SpecialInputs\";\nexport { IconInput } from \"./SpecialInputs\";\nexport type { SwitchProps } from \"./Switch\";\nexport { Switch } from \"./Switch\";\nexport type { SignaturePngOptions, SignatureValue } from \"./signature\";\nexport { parseSignature, signatureToPng } from \"./signature\";\nexport type { TagEditorItem, TagEditorLabels, TagEditorProps, TagEditorValue } from \"./TagEditor\";\nexport { TagEditor } from \"./TagEditor\";\nexport type { TagsInputProps } from \"./TagsInput\";\nexport { TagsInput } from \"./TagsInput\";\nexport type {\n TemplateEditorLayout,\n TemplateEditorProps,\n TemplatePreviewProps,\n TemplateSampleDataProps,\n TemplateVariable,\n TemplateVariableKind,\n} from \"./TemplateEditor\";\nexport {\n createTemplateEditorPanesLayout,\n TemplateEditor,\n TemplatePreview,\n TemplateSampleData,\n} from \"./TemplateEditor\";\nexport type { TextInputProps } from \"./TextInput\";\nexport { TextInput } from \"./TextInput\";\n"],"mappings":"AACA,SAAS,kBAAkB,QAAQ,sBAAsB;AAMzD,SAAS,kBAAkB,QAAQ,sBAAsB;AAEzD,SAAS,QAAQ,QAAQ,YAAY;AAErC,SAAS,YAAY,QAAQ,gBAAgB;AAE7C,SAAS,WAAW,QAAQ,eAAe;AAM3C,SAAS,UAAU,EAAE,QAAQ,EAAE,MAAM,QAAQ,gBAAgB;AAE7D,SAAS,UAAU,QAAQ,cAAc;AAEzC,SAAS,YAAY,EAAE,qBAAqB,QAAQ,gBAAgB;AAEpE,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,YAAY,QAAQ,gBAAgB;AAE7C,SAAS,QAAQ,QAAQ,YAAY;AAQrC,SAAS,aAAa,QAAQ,cAAc;AAU5C,SAAS,UAAU,EAAE,eAAe,EAAE,cAAc,QAAQ,cAAc;AAE1E,SAAS,eAAe,QAAQ,8BAA8B;AAE9D,SAAS,YAAY,EAAE,eAAe,EAAE,iBAAiB,QAAQ,uBAAuB;AAYxF,SAAS,WAAW,QAAQ,qBAAqB;AAEjD,SAAS,aAAa,QAAQ,qBAAqB;AAEnD,SAAS,cAAc,EAAE,cAAc,QAAQ,kBAAkB;AAEjE,SAAS,YAAY,EAAE,YAAY,EAAE,UAAU,QAAQ,cAAc;AAGrE,SAAS,WAAW,QAAQ,eAAe;AAC3C,SAAS,mBAAmB,EAAE,oBAAoB,QAAQ,gBAAgB;AAU1E,SACE,kBAAkB,EAClB,wBAAwB,EACxB,yBAAyB,EACzB,uBAAuB,EACvB,qBAAqB,EACrB,0BAA0B,EAC1B,2BAA2B,EAC3B,oBAAoB,QACf,cAAc;AAMrB,SAAS,gBAAgB,QAAQ,oBAAoB;AAErD,SAAS,cAAc,QAAQ,2BAA2B;AAE1D,SAAS,aAAa,QAAQ,0BAA0B;AAExD,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,YAAY,QAAQ,gBAAgB;AAE7C,SACE,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,cAAc,EACd,aAAa,EACb,aAAa,QACR,UAAU;AAEjB,SAAS,SAAS,QAAQ,aAAa;AASvC,SAAS,UAAU,EAAE,eAAe,QAAQ,cAAc;AAE1D,SAAS,MAAM,QAAQ,UAAU;AAEjC,SAAS,UAAU,QAAQ,cAAc;AAEzC,SAAS,cAAc,QAAQ,kBAAkB;AAEjD,SAAS,SAAS,QAAQ,iBAAiB;AAE3C,SAAS,MAAM,QAAQ,UAAU;AAEjC,SAAS,cAAc,EAAE,cAAc,QAAQ,aAAa;AAE5D,SAAS,SAAS,QAAQ,aAAa;AAEvC,SAAS,SAAS,QAAQ,aAAa;AASvC,SACE,+BAA+B,EAC/B,cAAc,EACd,eAAe,EACf,kBAAkB,QACb,kBAAkB;AAEzB,SAAS,SAAS,QAAQ,aAAa","ignoreList":[]}
@@ -13,7 +13,10 @@ const inputMessages = i18n.define({
13
13
  pinDigit: ({
14
14
  index,
15
15
  total
16
- }) => `PIN digit ${index} of ${total}`
16
+ }) => `PIN digit ${index} of ${total}`,
17
+ resetTo: ({
18
+ value
19
+ }) => `Reset to ${value}`
17
20
  },
18
21
  de: {
19
22
  decreaseValue: "Wert verringern",
@@ -25,7 +28,10 @@ const inputMessages = i18n.define({
25
28
  pinDigit: ({
26
29
  index,
27
30
  total
28
- }) => `PIN-Ziffer ${index} von ${total}`
31
+ }) => `PIN-Ziffer ${index} von ${total}`,
32
+ resetTo: ({
33
+ value
34
+ }) => `Zurücksetzen auf ${value}`
29
35
  }
30
36
  }
31
37
  });
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["inputs/input-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\nconst inputMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n decreaseValue: \"Decrease value\",\n increaseValue: \"Increase value\",\n hidePassword: \"Hide password\",\n showPassword: \"Show password\",\n useColor: \"Use a color\",\n useTransparent: \"Use transparent\",\n pinDigit: ({ index, total }: { index: number; total: number }) => `PIN digit ${index} of ${total}`,\n },\n de: {\n decreaseValue: \"Wert verringern\",\n increaseValue: \"Wert erhöhen\",\n hidePassword: \"Passwort ausblenden\",\n showPassword: \"Passwort anzeigen\",\n useColor: \"Farbe verwenden\",\n useTransparent: \"Transparent verwenden\",\n pinDigit: ({ index, total }) => `PIN-Ziffer ${index} von ${total}`,\n },\n },\n});\n\nexport type InputMessages = ReturnType<(typeof inputMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from the inherited render locale. */\nexport const useInputMessages = (): (() => InputMessages) => {\n const locale = useLocale();\n return () => inputMessages.resolve([locale()]).t;\n};\n\nexport const checkInputMessages = () => inputMessages.check();\n"],"mappings":"AAAA,SAAS,IAAI,QAAQ,aAAa;AAClC,SAAS,SAAS,QAAQ,gBAAgB;AAE1C,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC;EAChC,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE;IACR,EAAE,EAAE;MACF,aAAa,EAAE,gBAAgB;MAC/B,aAAa,EAAE,gBAAgB;MAC/B,YAAY,EAAE,eAAe;MAC7B,YAAY,EAAE,eAAe;MAC7B,QAAQ,EAAE,aAAa;MACvB,cAAc,EAAE,iBAAiB;MACjC,QAAQ,EAAE,CAAC;QAAE,KAAK;QAAE;MAAwC,CAAC,KAAK,aAAa,KAAK,OAAO,KAAK;IAClG,CAAC;IACD,EAAE,EAAE;MACF,aAAa,EAAE,iBAAiB;MAChC,aAAa,EAAE,cAAc;MAC7B,YAAY,EAAE,qBAAqB;MACnC,YAAY,EAAE,mBAAmB;MACjC,QAAQ,EAAE,iBAAiB;MAC3B,cAAc,EAAE,uBAAuB;MACvC,QAAQ,EAAE,CAAC;QAAE,KAAK;QAAE;MAAM,CAAC,KAAK,cAAc,KAAK,QAAQ,KAAK;IAClE;EACF;AACF,CAAC,CAAC;AAIF;AACA,OAAO,MAAM,gBAAgB,GAAG,MAA6B;EAC3D,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,OAAO,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,OAAO,MAAM,kBAAkB,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["inputs/input-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\nconst inputMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n decreaseValue: \"Decrease value\",\n increaseValue: \"Increase value\",\n hidePassword: \"Hide password\",\n showPassword: \"Show password\",\n useColor: \"Use a color\",\n useTransparent: \"Use transparent\",\n pinDigit: ({ index, total }: { index: number; total: number }) => `PIN digit ${index} of ${total}`,\n resetTo: ({ value }: { value: string }) => `Reset to ${value}`,\n },\n de: {\n decreaseValue: \"Wert verringern\",\n increaseValue: \"Wert erhöhen\",\n hidePassword: \"Passwort ausblenden\",\n showPassword: \"Passwort anzeigen\",\n useColor: \"Farbe verwenden\",\n useTransparent: \"Transparent verwenden\",\n pinDigit: ({ index, total }) => `PIN-Ziffer ${index} von ${total}`,\n resetTo: ({ value }) => `Zurücksetzen auf ${value}`,\n },\n },\n});\n\nexport type InputMessages = ReturnType<(typeof inputMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from the inherited render locale. */\nexport const useInputMessages = (): (() => InputMessages) => {\n const locale = useLocale();\n return () => inputMessages.resolve([locale()]).t;\n};\n\nexport const checkInputMessages = () => inputMessages.check();\n"],"mappings":"AAAA,SAAS,IAAI,QAAQ,aAAa;AAClC,SAAS,SAAS,QAAQ,gBAAgB;AAE1C,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC;EAChC,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE;IACR,EAAE,EAAE;MACF,aAAa,EAAE,gBAAgB;MAC/B,aAAa,EAAE,gBAAgB;MAC/B,YAAY,EAAE,eAAe;MAC7B,YAAY,EAAE,eAAe;MAC7B,QAAQ,EAAE,aAAa;MACvB,cAAc,EAAE,iBAAiB;MACjC,QAAQ,EAAE,CAAC;QAAE,KAAK;QAAE;MAAwC,CAAC,KAAK,aAAa,KAAK,OAAO,KAAK,EAAE;MAClG,OAAO,EAAE,CAAC;QAAE;MAAyB,CAAC,KAAK,YAAY,KAAK;IAC9D,CAAC;IACD,EAAE,EAAE;MACF,aAAa,EAAE,iBAAiB;MAChC,aAAa,EAAE,cAAc;MAC7B,YAAY,EAAE,qBAAqB;MACnC,YAAY,EAAE,mBAAmB;MACjC,QAAQ,EAAE,iBAAiB;MAC3B,cAAc,EAAE,uBAAuB;MACvC,QAAQ,EAAE,CAAC;QAAE,KAAK;QAAE;MAAM,CAAC,KAAK,cAAc,KAAK,QAAQ,KAAK,EAAE;MAClE,OAAO,EAAE,CAAC;QAAE;MAAM,CAAC,KAAK,oBAAoB,KAAK;IACnD;EACF;AACF,CAAC,CAAC;AAIF;AACA,OAAO,MAAM,gBAAgB,GAAG,MAA6B;EAC3D,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,OAAO,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,OAAO,MAAM,kBAAkB,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC","ignoreList":[]}
@@ -350,7 +350,8 @@ export function MarkdownEditor(props) {
350
350
  recomputeCompletion();
351
351
  };
352
352
  const onKeyDown = event => {
353
- if (!textarea || event.isComposing) return;
353
+ // A key that an attached part, such as the slash commands, used is not the text's any more.
354
+ if (!textarea || event.isComposing || event.defaultPrevented) return;
354
355
  if (event.key === "Backspace" && !event.metaKey && !event.ctrlKey && !event.altKey && !event.shiftKey && completionBehavior.tryRestore(textarea)) {
355
356
  event.preventDefault();
356
357
  return;
@@ -448,7 +449,7 @@ export function MarkdownEditor(props) {
448
449
  return props.disabled;
449
450
  },
450
451
  get children() {
451
- return _$ssr(_tmpl$6, _$ssrAttribute("aria-labelledby", props.label ? _$escape(meta.labelId, true) : _$escape(undefined, true), false) + _$ssrAttribute("aria-label", !props.label ? _$escape(props["aria-label"], true) : _$escape(undefined, true), false) + _$ssrAttribute("data-disabled", props.disabled ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-invalid", error() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-variant", props.variant === "default" ? _$escape(undefined, true) : _$escape(props.variant, true), false) + _$ssrAttribute("data-fill", props.fill ? "true" : _$escape(undefined, true), false), _$ssrStyleProperty("--k2b-editor-lines:", _$escape(String(props.lines ?? 6), true)), _$escape(_$createComponent(Show, {
452
+ return _$ssr(_tmpl$6, _$ssrAttribute("aria-labelledby", props.label ? _$escape(meta.labelId, true) : _$escape(undefined, true), false) + _$ssrAttribute("aria-label", !props.label ? _$escape(props["aria-label"], true) : _$escape(undefined, true), false) + _$ssrAttribute("data-disabled", props.disabled ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-invalid", error() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-variant", props.variant === "default" ? _$escape(undefined, true) : _$escape(props.variant, true), false) + _$ssrAttribute("data-font", props.font === "sans" ? "sans" : _$escape(undefined, true), false) + _$ssrAttribute("data-fill", props.fill ? "true" : _$escape(undefined, true), false), _$ssrStyleProperty("--k2b-editor-lines:", _$escape(String(props.lines ?? 6), true)), _$escape(_$createComponent(Show, {
452
453
  get when() {
453
454
  return !props.noToolbar;
454
455
  },