@k2b/ui 0.20.0 → 0.22.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 (595) hide show
  1. package/dist/browser/actions/Button.js +20 -31
  2. package/dist/browser/actions/Button.js.map +1 -1
  3. package/dist/browser/actions/ContextMenu.js +10 -4
  4. package/dist/browser/actions/ContextMenu.js.map +1 -1
  5. package/dist/browser/actions/CopyButton.js +10 -8
  6. package/dist/browser/actions/CopyButton.js.map +1 -1
  7. package/dist/browser/actions/FilterChip.js +3 -1
  8. package/dist/browser/actions/FilterChip.js.map +1 -1
  9. package/dist/browser/actions/GestureMenu.js +4 -0
  10. package/dist/browser/actions/GestureMenu.js.map +1 -1
  11. package/dist/browser/actions/SpotlightSearch.js +3 -1
  12. package/dist/browser/actions/SpotlightSearch.js.map +1 -1
  13. package/dist/browser/actions/filter-messages.js +20 -0
  14. package/dist/browser/actions/filter-messages.js.map +1 -0
  15. package/dist/browser/actions/spotlight-messages.js +16 -0
  16. package/dist/browser/actions/spotlight-messages.js.map +1 -0
  17. package/dist/browser/chat/ChatComposer.js +47 -41
  18. package/dist/browser/chat/ChatComposer.js.map +1 -1
  19. package/dist/browser/chat/ChatPrimitives.js +25 -23
  20. package/dist/browser/chat/ChatPrimitives.js.map +1 -1
  21. package/dist/browser/chat/ChatRoot.js +3 -3
  22. package/dist/browser/chat/ChatRoot.js.map +1 -1
  23. package/dist/browser/chat/ChatTimeline.js +12 -12
  24. package/dist/browser/chat/ChatTimeline.js.map +1 -1
  25. package/dist/browser/chat/chat-messages.js +236 -0
  26. package/dist/browser/chat/chat-messages.js.map +1 -0
  27. package/dist/browser/content/Calendar.js +1960 -575
  28. package/dist/browser/content/Calendar.js.map +1 -1
  29. package/dist/browser/content/Chart.js +15 -8
  30. package/dist/browser/content/Chart.js.map +1 -1
  31. package/dist/browser/content/ChartExplorer.js +20 -12
  32. package/dist/browser/content/ChartExplorer.js.map +1 -1
  33. package/dist/browser/content/ChartExplorerControls.js +9 -7
  34. package/dist/browser/content/ChartExplorerControls.js.map +1 -1
  35. package/dist/browser/content/ChartFilterControls.js +4 -2
  36. package/dist/browser/content/ChartFilterControls.js.map +1 -1
  37. package/dist/browser/content/ChartSnapshotView.js +3 -3
  38. package/dist/browser/content/ChartSnapshotView.js.map +1 -1
  39. package/dist/browser/content/DataTable.js +68 -59
  40. package/dist/browser/content/DataTable.js.map +1 -1
  41. package/dist/browser/content/Docs.js +3 -1
  42. package/dist/browser/content/Docs.js.map +1 -1
  43. package/dist/browser/content/FileBrowser.js +30 -26
  44. package/dist/browser/content/FileBrowser.js.map +1 -1
  45. package/dist/browser/content/FileTree.js +9 -7
  46. package/dist/browser/content/FileTree.js.map +1 -1
  47. package/dist/browser/content/FileView.js +37 -28
  48. package/dist/browser/content/FileView.js.map +1 -1
  49. package/dist/browser/content/Lightbox.js +9 -7
  50. package/dist/browser/content/Lightbox.js.map +1 -1
  51. package/dist/browser/content/LogEntriesTable.js +3 -3
  52. package/dist/browser/content/LogEntriesTable.js.map +1 -1
  53. package/dist/browser/content/MessageRow.js +24 -22
  54. package/dist/browser/content/MessageRow.js.map +1 -1
  55. package/dist/browser/content/Pagination.js +7 -7
  56. package/dist/browser/content/Pagination.js.map +1 -1
  57. package/dist/browser/content/PdfPreview.js +15 -13
  58. package/dist/browser/content/PdfPreview.js.map +1 -1
  59. package/dist/browser/content/RangePicker.js +3 -1
  60. package/dist/browser/content/RangePicker.js.map +1 -1
  61. package/dist/browser/content/StructuredDataPreview.js +3 -1
  62. package/dist/browser/content/StructuredDataPreview.js.map +1 -1
  63. package/dist/browser/content/Timeline.js +13 -11
  64. package/dist/browser/content/Timeline.js.map +1 -1
  65. package/dist/browser/content/VideoPlayer.js +5 -5
  66. package/dist/browser/content/VideoPlayer.js.map +1 -1
  67. package/dist/browser/content/VirtualFeed.js +6 -4
  68. package/dist/browser/content/VirtualFeed.js.map +1 -1
  69. package/dist/browser/content/ZoomPanViewport.js +10 -7
  70. package/dist/browser/content/ZoomPanViewport.js.map +1 -1
  71. package/dist/browser/content/calendar-messages.js +121 -0
  72. package/dist/browser/content/calendar-messages.js.map +1 -0
  73. package/dist/browser/content/calendar-month-layout.js +108 -0
  74. package/dist/browser/content/calendar-month-layout.js.map +1 -0
  75. package/dist/browser/content/calendar-pointer.js +4 -3
  76. package/dist/browser/content/calendar-pointer.js.map +1 -1
  77. package/dist/browser/content/chart-messages.js +136 -0
  78. package/dist/browser/content/chart-messages.js.map +1 -0
  79. package/dist/browser/content/collection-selection.js +2 -0
  80. package/dist/browser/content/collection-selection.js.map +1 -1
  81. package/dist/browser/content/data-table-messages.js +24 -0
  82. package/dist/browser/content/data-table-messages.js.map +1 -0
  83. package/dist/browser/content/docs-messages.js +24 -0
  84. package/dist/browser/content/docs-messages.js.map +1 -0
  85. package/dist/browser/content/feed-messages.js +34 -0
  86. package/dist/browser/content/feed-messages.js.map +1 -0
  87. package/dist/browser/content/file-browser-messages.js +69 -0
  88. package/dist/browser/content/file-browser-messages.js.map +1 -0
  89. package/dist/browser/content/file-view-messages.js +64 -0
  90. package/dist/browser/content/file-view-messages.js.map +1 -0
  91. package/dist/browser/content/index.js.map +1 -1
  92. package/dist/browser/content/lightbox-messages.js +36 -0
  93. package/dist/browser/content/lightbox-messages.js.map +1 -0
  94. package/dist/browser/content/log-entries-messages.js +20 -0
  95. package/dist/browser/content/log-entries-messages.js.map +1 -0
  96. package/dist/browser/content/markdown-info-block-messages.js +24 -0
  97. package/dist/browser/content/markdown-info-block-messages.js.map +1 -0
  98. package/dist/browser/content/markdown-info-blocks.js +3 -3
  99. package/dist/browser/content/markdown-info-blocks.js.map +1 -1
  100. package/dist/browser/content/markdown-links.js +2 -2
  101. package/dist/browser/content/markdown-links.js.map +1 -1
  102. package/dist/browser/content/markdown-reference-messages.js +30 -0
  103. package/dist/browser/content/markdown-reference-messages.js.map +1 -0
  104. package/dist/browser/content/pagination-messages.js +38 -0
  105. package/dist/browser/content/pagination-messages.js.map +1 -0
  106. package/dist/browser/content/pdf-messages.js +43 -0
  107. package/dist/browser/content/pdf-messages.js.map +1 -0
  108. package/dist/browser/content/range-picker-messages.js +20 -0
  109. package/dist/browser/content/range-picker-messages.js.map +1 -0
  110. package/dist/browser/content/structured-data-messages.js +22 -0
  111. package/dist/browser/content/structured-data-messages.js.map +1 -0
  112. package/dist/browser/content/timeline-messages.js +62 -0
  113. package/dist/browser/content/timeline-messages.js.map +1 -0
  114. package/dist/browser/content/video-messages.js +24 -0
  115. package/dist/browser/content/video-messages.js.map +1 -0
  116. package/dist/browser/content/viewport-messages.js +28 -0
  117. package/dist/browser/content/viewport-messages.js.map +1 -0
  118. package/dist/browser/feedback/HoverPreview.js +34 -6
  119. package/dist/browser/feedback/HoverPreview.js.map +1 -1
  120. package/dist/browser/feedback/InstallGuide.js +18 -18
  121. package/dist/browser/feedback/InstallGuide.js.map +1 -1
  122. package/dist/browser/feedback/install-messages.js +104 -0
  123. package/dist/browser/feedback/install-messages.js.map +1 -0
  124. package/dist/browser/feedback/prompt-messages.js +65 -0
  125. package/dist/browser/feedback/prompt-messages.js.map +1 -0
  126. package/dist/browser/feedback/prompts.js +14 -11
  127. package/dist/browser/feedback/prompts.js.map +1 -1
  128. package/dist/browser/feedback/toast-messages.js +18 -0
  129. package/dist/browser/feedback/toast-messages.js.map +1 -0
  130. package/dist/browser/feedback/toast.js +4 -3
  131. package/dist/browser/feedback/toast.js.map +1 -1
  132. package/dist/browser/index.js +1 -1
  133. package/dist/browser/index.js.map +1 -1
  134. package/dist/browser/inputs/AutocompleteEditor.js +6 -4
  135. package/dist/browser/inputs/AutocompleteEditor.js.map +1 -1
  136. package/dist/browser/inputs/AutocompleteSelect.js +10 -8
  137. package/dist/browser/inputs/AutocompleteSelect.js.map +1 -1
  138. package/dist/browser/inputs/ChoiceGroups.js +4 -0
  139. package/dist/browser/inputs/ChoiceGroups.js.map +1 -1
  140. package/dist/browser/inputs/ChoiceInputs.js +5 -5
  141. package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
  142. package/dist/browser/inputs/Combobox.js +3 -1
  143. package/dist/browser/inputs/Combobox.js.map +1 -1
  144. package/dist/browser/inputs/DatePicker.js +46 -10
  145. package/dist/browser/inputs/DatePicker.js.map +1 -1
  146. package/dist/browser/inputs/FileDropTarget.js +6 -6
  147. package/dist/browser/inputs/FileDropTarget.js.map +1 -1
  148. package/dist/browser/inputs/FileInputs.js +30 -21
  149. package/dist/browser/inputs/FileInputs.js.map +1 -1
  150. package/dist/browser/inputs/MultiSelectInput.js +7 -5
  151. package/dist/browser/inputs/MultiSelectInput.js.map +1 -1
  152. package/dist/browser/inputs/NumberInput.js +4 -2
  153. package/dist/browser/inputs/NumberInput.js.map +1 -1
  154. package/dist/browser/inputs/QrScanner.js +5 -5
  155. package/dist/browser/inputs/QrScanner.js.map +1 -1
  156. package/dist/browser/inputs/Select.js +7 -5
  157. package/dist/browser/inputs/Select.js.map +1 -1
  158. package/dist/browser/inputs/SelectChip.js +3 -3
  159. package/dist/browser/inputs/SelectChip.js.map +1 -1
  160. package/dist/browser/inputs/SignatureInput.js +9 -3
  161. package/dist/browser/inputs/SignatureInput.js.map +1 -1
  162. package/dist/browser/inputs/SpecialInputs.js +4 -2
  163. package/dist/browser/inputs/SpecialInputs.js.map +1 -1
  164. package/dist/browser/inputs/TagEditor.js +8 -6
  165. package/dist/browser/inputs/TagEditor.js.map +1 -1
  166. package/dist/browser/inputs/TagsInput.js +5 -5
  167. package/dist/browser/inputs/TagsInput.js.map +1 -1
  168. package/dist/browser/inputs/TemplateEditor.js +5 -5
  169. package/dist/browser/inputs/TemplateEditor.js.map +1 -1
  170. package/dist/browser/inputs/TextInput.js +3 -1
  171. package/dist/browser/inputs/TextInput.js.map +1 -1
  172. package/dist/browser/inputs/completion-messages.js +24 -0
  173. package/dist/browser/inputs/completion-messages.js.map +1 -0
  174. package/dist/browser/inputs/date-picker.js +24 -0
  175. package/dist/browser/inputs/date-picker.js.map +1 -1
  176. package/dist/browser/inputs/file-drop-messages.js +63 -0
  177. package/dist/browser/inputs/file-drop-messages.js.map +1 -0
  178. package/dist/browser/inputs/file-drop.js.map +1 -1
  179. package/dist/browser/inputs/file-input-messages.js +60 -0
  180. package/dist/browser/inputs/file-input-messages.js.map +1 -0
  181. package/dist/browser/inputs/icon-messages.js +22 -0
  182. package/dist/browser/inputs/icon-messages.js.map +1 -0
  183. package/dist/browser/inputs/input-messages.js +38 -0
  184. package/dist/browser/inputs/input-messages.js.map +1 -0
  185. package/dist/browser/inputs/markdown/MarkdownEditor.js +10 -6
  186. package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
  187. package/dist/browser/inputs/markdown/Toolbar.js +13 -13
  188. package/dist/browser/inputs/markdown/Toolbar.js.map +1 -1
  189. package/dist/browser/inputs/markdown/editor-messages.js +43 -0
  190. package/dist/browser/inputs/markdown/editor-messages.js.map +1 -0
  191. package/dist/browser/inputs/markdown/toolbar-messages.js +40 -0
  192. package/dist/browser/inputs/markdown/toolbar-messages.js.map +1 -0
  193. package/dist/browser/inputs/qr-messages.js +26 -0
  194. package/dist/browser/inputs/qr-messages.js.map +1 -0
  195. package/dist/browser/inputs/select-messages.js +63 -0
  196. package/dist/browser/inputs/select-messages.js.map +1 -0
  197. package/dist/browser/inputs/tag-messages.js +44 -0
  198. package/dist/browser/inputs/tag-messages.js.map +1 -0
  199. package/dist/browser/inputs/template-messages.js +22 -0
  200. package/dist/browser/inputs/template-messages.js.map +1 -0
  201. package/dist/browser/internal/render-error-messages.js +20 -0
  202. package/dist/browser/internal/render-error-messages.js.map +1 -0
  203. package/dist/browser/internal/render-error.js +3 -1
  204. package/dist/browser/internal/render-error.js.map +1 -1
  205. package/dist/browser/internal/text-selection.js +101 -0
  206. package/dist/browser/internal/text-selection.js.map +1 -0
  207. package/dist/browser/intl/messages.js +12 -1155
  208. package/dist/browser/intl/messages.js.map +1 -1
  209. package/dist/browser/layout/AppWorkspace.js +561 -418
  210. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  211. package/dist/browser/layout/BottomSheet.js +6 -1
  212. package/dist/browser/layout/BottomSheet.js.map +1 -1
  213. package/dist/browser/layout/Discussion.js +8 -5
  214. package/dist/browser/layout/Discussion.js.map +1 -1
  215. package/dist/browser/layout/FloatingWindow.js +8 -5
  216. package/dist/browser/layout/FloatingWindow.js.map +1 -1
  217. package/dist/browser/layout/Navigation.js +7 -6
  218. package/dist/browser/layout/Navigation.js.map +1 -1
  219. package/dist/browser/layout/PageTitle.js +370 -0
  220. package/dist/browser/layout/PageTitle.js.map +1 -0
  221. package/dist/browser/layout/PanelDialog.js +8 -6
  222. package/dist/browser/layout/PanelDialog.js.map +1 -1
  223. package/dist/browser/layout/Panes.js +23 -15
  224. package/dist/browser/layout/Panes.js.map +1 -1
  225. package/dist/browser/layout/PullToRefresh.js +13 -4
  226. package/dist/browser/layout/PullToRefresh.js.map +1 -1
  227. package/dist/browser/layout/Settings.js +14 -12
  228. package/dist/browser/layout/Settings.js.map +1 -1
  229. package/dist/browser/layout/SettingsCollection.js +6 -5
  230. package/dist/browser/layout/SettingsCollection.js.map +1 -1
  231. package/dist/browser/layout/SettingsModal.js +3 -1
  232. package/dist/browser/layout/SettingsModal.js.map +1 -1
  233. package/dist/browser/layout/app-workspace-controller.js +743 -12
  234. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  235. package/dist/browser/layout/app-workspace-state.js +3 -2
  236. package/dist/browser/layout/app-workspace-state.js.map +1 -1
  237. package/dist/browser/layout/floating-window-messages.js +28 -0
  238. package/dist/browser/layout/floating-window-messages.js.map +1 -0
  239. package/dist/browser/layout/index.js +2 -0
  240. package/dist/browser/layout/index.js.map +1 -1
  241. package/dist/browser/layout/navigation-model.js.map +1 -1
  242. package/dist/browser/layout/page-title-controller.js +169 -0
  243. package/dist/browser/layout/page-title-controller.js.map +1 -0
  244. package/dist/browser/layout/panel-dialog-messages.js +20 -0
  245. package/dist/browser/layout/panel-dialog-messages.js.map +1 -0
  246. package/dist/browser/layout/panes-messages.js +48 -0
  247. package/dist/browser/layout/panes-messages.js.map +1 -0
  248. package/dist/browser/layout/refresh-messages.js +20 -0
  249. package/dist/browser/layout/refresh-messages.js.map +1 -0
  250. package/dist/browser/layout/settings-messages.js +54 -0
  251. package/dist/browser/layout/settings-messages.js.map +1 -0
  252. package/dist/browser/layout/workspace-messages.js +56 -0
  253. package/dist/browser/layout/workspace-messages.js.map +1 -0
  254. package/dist/browser/surfaces/Avatar.js +5 -5
  255. package/dist/browser/surfaces/Avatar.js.map +1 -1
  256. package/dist/browser/surfaces/ResourceCard.js +4 -2
  257. package/dist/browser/surfaces/ResourceCard.js.map +1 -1
  258. package/dist/browser/surfaces/Tag.js +3 -3
  259. package/dist/browser/surfaces/Tag.js.map +1 -1
  260. package/dist/browser/surfaces/avatar-messages.js +26 -0
  261. package/dist/browser/surfaces/avatar-messages.js.map +1 -0
  262. package/dist/browser/surfaces/resource-messages.js +26 -0
  263. package/dist/browser/surfaces/resource-messages.js.map +1 -0
  264. package/dist/browser/widgets/Widget.js +6 -0
  265. package/dist/browser/widgets/Widget.js.map +1 -1
  266. package/dist/ssr/actions/Button.js +21 -32
  267. package/dist/ssr/actions/Button.js.map +1 -1
  268. package/dist/ssr/actions/ContextMenu.js +7 -3
  269. package/dist/ssr/actions/ContextMenu.js.map +1 -1
  270. package/dist/ssr/actions/CopyButton.js +9 -7
  271. package/dist/ssr/actions/CopyButton.js.map +1 -1
  272. package/dist/ssr/actions/FilterChip.js +3 -1
  273. package/dist/ssr/actions/FilterChip.js.map +1 -1
  274. package/dist/ssr/actions/GestureMenu.js +4 -0
  275. package/dist/ssr/actions/GestureMenu.js.map +1 -1
  276. package/dist/ssr/actions/SpotlightSearch.js +3 -1
  277. package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
  278. package/dist/ssr/actions/filter-messages.js +20 -0
  279. package/dist/ssr/actions/filter-messages.js.map +1 -0
  280. package/dist/ssr/actions/spotlight-messages.js +16 -0
  281. package/dist/ssr/actions/spotlight-messages.js.map +1 -0
  282. package/dist/ssr/chat/ChatComposer.js +47 -41
  283. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  284. package/dist/ssr/chat/ChatPrimitives.js +23 -21
  285. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  286. package/dist/ssr/chat/ChatRoot.js +3 -3
  287. package/dist/ssr/chat/ChatRoot.js.map +1 -1
  288. package/dist/ssr/chat/ChatTimeline.js +11 -11
  289. package/dist/ssr/chat/ChatTimeline.js.map +1 -1
  290. package/dist/ssr/chat/chat-messages.js +236 -0
  291. package/dist/ssr/chat/chat-messages.js.map +1 -0
  292. package/dist/ssr/content/Calendar.js +1232 -115
  293. package/dist/ssr/content/Calendar.js.map +1 -1
  294. package/dist/ssr/content/Chart.js +12 -5
  295. package/dist/ssr/content/Chart.js.map +1 -1
  296. package/dist/ssr/content/ChartExplorer.js +10 -8
  297. package/dist/ssr/content/ChartExplorer.js.map +1 -1
  298. package/dist/ssr/content/ChartExplorerControls.js +9 -7
  299. package/dist/ssr/content/ChartExplorerControls.js.map +1 -1
  300. package/dist/ssr/content/ChartFilterControls.js +4 -2
  301. package/dist/ssr/content/ChartFilterControls.js.map +1 -1
  302. package/dist/ssr/content/ChartSnapshotView.js +3 -3
  303. package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
  304. package/dist/ssr/content/DataTable.js +10 -4
  305. package/dist/ssr/content/DataTable.js.map +1 -1
  306. package/dist/ssr/content/Docs.js +3 -1
  307. package/dist/ssr/content/Docs.js.map +1 -1
  308. package/dist/ssr/content/FileBrowser.js +30 -26
  309. package/dist/ssr/content/FileBrowser.js.map +1 -1
  310. package/dist/ssr/content/FileTree.js +9 -7
  311. package/dist/ssr/content/FileTree.js.map +1 -1
  312. package/dist/ssr/content/FileView.js +37 -28
  313. package/dist/ssr/content/FileView.js.map +1 -1
  314. package/dist/ssr/content/Lightbox.js +8 -6
  315. package/dist/ssr/content/Lightbox.js.map +1 -1
  316. package/dist/ssr/content/LogEntriesTable.js +3 -3
  317. package/dist/ssr/content/LogEntriesTable.js.map +1 -1
  318. package/dist/ssr/content/MessageRow.js +24 -22
  319. package/dist/ssr/content/MessageRow.js.map +1 -1
  320. package/dist/ssr/content/Pagination.js +6 -6
  321. package/dist/ssr/content/Pagination.js.map +1 -1
  322. package/dist/ssr/content/PdfPreview.js +15 -13
  323. package/dist/ssr/content/PdfPreview.js.map +1 -1
  324. package/dist/ssr/content/RangePicker.js +3 -1
  325. package/dist/ssr/content/RangePicker.js.map +1 -1
  326. package/dist/ssr/content/StructuredDataPreview.js +3 -1
  327. package/dist/ssr/content/StructuredDataPreview.js.map +1 -1
  328. package/dist/ssr/content/Timeline.js +13 -11
  329. package/dist/ssr/content/Timeline.js.map +1 -1
  330. package/dist/ssr/content/VideoPlayer.js +5 -5
  331. package/dist/ssr/content/VideoPlayer.js.map +1 -1
  332. package/dist/ssr/content/VirtualFeed.js +6 -4
  333. package/dist/ssr/content/VirtualFeed.js.map +1 -1
  334. package/dist/ssr/content/ZoomPanViewport.js +7 -4
  335. package/dist/ssr/content/ZoomPanViewport.js.map +1 -1
  336. package/dist/ssr/content/calendar-messages.js +121 -0
  337. package/dist/ssr/content/calendar-messages.js.map +1 -0
  338. package/dist/ssr/content/calendar-month-layout.js +108 -0
  339. package/dist/ssr/content/calendar-month-layout.js.map +1 -0
  340. package/dist/ssr/content/calendar-pointer.js +4 -3
  341. package/dist/ssr/content/calendar-pointer.js.map +1 -1
  342. package/dist/ssr/content/chart-messages.js +136 -0
  343. package/dist/ssr/content/chart-messages.js.map +1 -0
  344. package/dist/ssr/content/collection-selection.js +2 -0
  345. package/dist/ssr/content/collection-selection.js.map +1 -1
  346. package/dist/ssr/content/data-table-messages.js +24 -0
  347. package/dist/ssr/content/data-table-messages.js.map +1 -0
  348. package/dist/ssr/content/docs-messages.js +24 -0
  349. package/dist/ssr/content/docs-messages.js.map +1 -0
  350. package/dist/ssr/content/feed-messages.js +34 -0
  351. package/dist/ssr/content/feed-messages.js.map +1 -0
  352. package/dist/ssr/content/file-browser-messages.js +69 -0
  353. package/dist/ssr/content/file-browser-messages.js.map +1 -0
  354. package/dist/ssr/content/file-view-messages.js +64 -0
  355. package/dist/ssr/content/file-view-messages.js.map +1 -0
  356. package/dist/ssr/content/index.js.map +1 -1
  357. package/dist/ssr/content/lightbox-messages.js +36 -0
  358. package/dist/ssr/content/lightbox-messages.js.map +1 -0
  359. package/dist/ssr/content/log-entries-messages.js +20 -0
  360. package/dist/ssr/content/log-entries-messages.js.map +1 -0
  361. package/dist/ssr/content/markdown-info-block-messages.js +24 -0
  362. package/dist/ssr/content/markdown-info-block-messages.js.map +1 -0
  363. package/dist/ssr/content/markdown-info-blocks.js +3 -3
  364. package/dist/ssr/content/markdown-info-blocks.js.map +1 -1
  365. package/dist/ssr/content/markdown-links.js +2 -2
  366. package/dist/ssr/content/markdown-links.js.map +1 -1
  367. package/dist/ssr/content/markdown-reference-messages.js +30 -0
  368. package/dist/ssr/content/markdown-reference-messages.js.map +1 -0
  369. package/dist/ssr/content/pagination-messages.js +38 -0
  370. package/dist/ssr/content/pagination-messages.js.map +1 -0
  371. package/dist/ssr/content/pdf-messages.js +43 -0
  372. package/dist/ssr/content/pdf-messages.js.map +1 -0
  373. package/dist/ssr/content/range-picker-messages.js +20 -0
  374. package/dist/ssr/content/range-picker-messages.js.map +1 -0
  375. package/dist/ssr/content/structured-data-messages.js +22 -0
  376. package/dist/ssr/content/structured-data-messages.js.map +1 -0
  377. package/dist/ssr/content/timeline-messages.js +62 -0
  378. package/dist/ssr/content/timeline-messages.js.map +1 -0
  379. package/dist/ssr/content/video-messages.js +24 -0
  380. package/dist/ssr/content/video-messages.js.map +1 -0
  381. package/dist/ssr/content/viewport-messages.js +28 -0
  382. package/dist/ssr/content/viewport-messages.js.map +1 -0
  383. package/dist/ssr/feedback/HoverPreview.js +34 -6
  384. package/dist/ssr/feedback/HoverPreview.js.map +1 -1
  385. package/dist/ssr/feedback/InstallGuide.js +18 -18
  386. package/dist/ssr/feedback/InstallGuide.js.map +1 -1
  387. package/dist/ssr/feedback/install-messages.js +104 -0
  388. package/dist/ssr/feedback/install-messages.js.map +1 -0
  389. package/dist/ssr/feedback/prompt-messages.js +65 -0
  390. package/dist/ssr/feedback/prompt-messages.js.map +1 -0
  391. package/dist/ssr/feedback/prompts.js +14 -11
  392. package/dist/ssr/feedback/prompts.js.map +1 -1
  393. package/dist/ssr/feedback/toast-messages.js +18 -0
  394. package/dist/ssr/feedback/toast-messages.js.map +1 -0
  395. package/dist/ssr/feedback/toast.js +4 -3
  396. package/dist/ssr/feedback/toast.js.map +1 -1
  397. package/dist/ssr/index.js +1 -1
  398. package/dist/ssr/index.js.map +1 -1
  399. package/dist/ssr/inputs/AutocompleteEditor.js +5 -3
  400. package/dist/ssr/inputs/AutocompleteEditor.js.map +1 -1
  401. package/dist/ssr/inputs/AutocompleteSelect.js +10 -8
  402. package/dist/ssr/inputs/AutocompleteSelect.js.map +1 -1
  403. package/dist/ssr/inputs/ChoiceGroups.js +4 -0
  404. package/dist/ssr/inputs/ChoiceGroups.js.map +1 -1
  405. package/dist/ssr/inputs/ChoiceInputs.js +5 -5
  406. package/dist/ssr/inputs/ChoiceInputs.js.map +1 -1
  407. package/dist/ssr/inputs/Combobox.js +3 -1
  408. package/dist/ssr/inputs/Combobox.js.map +1 -1
  409. package/dist/ssr/inputs/DatePicker.js +34 -4
  410. package/dist/ssr/inputs/DatePicker.js.map +1 -1
  411. package/dist/ssr/inputs/FileDropTarget.js +6 -6
  412. package/dist/ssr/inputs/FileDropTarget.js.map +1 -1
  413. package/dist/ssr/inputs/FileInputs.js +29 -20
  414. package/dist/ssr/inputs/FileInputs.js.map +1 -1
  415. package/dist/ssr/inputs/MultiSelectInput.js +7 -5
  416. package/dist/ssr/inputs/MultiSelectInput.js.map +1 -1
  417. package/dist/ssr/inputs/NumberInput.js +4 -2
  418. package/dist/ssr/inputs/NumberInput.js.map +1 -1
  419. package/dist/ssr/inputs/QrScanner.js +4 -4
  420. package/dist/ssr/inputs/QrScanner.js.map +1 -1
  421. package/dist/ssr/inputs/Select.js +7 -5
  422. package/dist/ssr/inputs/Select.js.map +1 -1
  423. package/dist/ssr/inputs/SelectChip.js +3 -3
  424. package/dist/ssr/inputs/SelectChip.js.map +1 -1
  425. package/dist/ssr/inputs/SignatureInput.js +9 -3
  426. package/dist/ssr/inputs/SignatureInput.js.map +1 -1
  427. package/dist/ssr/inputs/SpecialInputs.js +4 -2
  428. package/dist/ssr/inputs/SpecialInputs.js.map +1 -1
  429. package/dist/ssr/inputs/TagEditor.js +8 -6
  430. package/dist/ssr/inputs/TagEditor.js.map +1 -1
  431. package/dist/ssr/inputs/TagsInput.js +5 -5
  432. package/dist/ssr/inputs/TagsInput.js.map +1 -1
  433. package/dist/ssr/inputs/TemplateEditor.js +5 -5
  434. package/dist/ssr/inputs/TemplateEditor.js.map +1 -1
  435. package/dist/ssr/inputs/TextInput.js +3 -1
  436. package/dist/ssr/inputs/TextInput.js.map +1 -1
  437. package/dist/ssr/inputs/completion-messages.js +24 -0
  438. package/dist/ssr/inputs/completion-messages.js.map +1 -0
  439. package/dist/ssr/inputs/date-picker.js +24 -0
  440. package/dist/ssr/inputs/date-picker.js.map +1 -1
  441. package/dist/ssr/inputs/file-drop-messages.js +63 -0
  442. package/dist/ssr/inputs/file-drop-messages.js.map +1 -0
  443. package/dist/ssr/inputs/file-drop.js.map +1 -1
  444. package/dist/ssr/inputs/file-input-messages.js +60 -0
  445. package/dist/ssr/inputs/file-input-messages.js.map +1 -0
  446. package/dist/ssr/inputs/icon-messages.js +22 -0
  447. package/dist/ssr/inputs/icon-messages.js.map +1 -0
  448. package/dist/ssr/inputs/input-messages.js +38 -0
  449. package/dist/ssr/inputs/input-messages.js.map +1 -0
  450. package/dist/ssr/inputs/markdown/MarkdownEditor.js +9 -5
  451. package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
  452. package/dist/ssr/inputs/markdown/Toolbar.js +13 -13
  453. package/dist/ssr/inputs/markdown/Toolbar.js.map +1 -1
  454. package/dist/ssr/inputs/markdown/editor-messages.js +43 -0
  455. package/dist/ssr/inputs/markdown/editor-messages.js.map +1 -0
  456. package/dist/ssr/inputs/markdown/toolbar-messages.js +40 -0
  457. package/dist/ssr/inputs/markdown/toolbar-messages.js.map +1 -0
  458. package/dist/ssr/inputs/qr-messages.js +26 -0
  459. package/dist/ssr/inputs/qr-messages.js.map +1 -0
  460. package/dist/ssr/inputs/select-messages.js +63 -0
  461. package/dist/ssr/inputs/select-messages.js.map +1 -0
  462. package/dist/ssr/inputs/tag-messages.js +44 -0
  463. package/dist/ssr/inputs/tag-messages.js.map +1 -0
  464. package/dist/ssr/inputs/template-messages.js +22 -0
  465. package/dist/ssr/inputs/template-messages.js.map +1 -0
  466. package/dist/ssr/internal/render-error-messages.js +20 -0
  467. package/dist/ssr/internal/render-error-messages.js.map +1 -0
  468. package/dist/ssr/internal/render-error.js +3 -1
  469. package/dist/ssr/internal/render-error.js.map +1 -1
  470. package/dist/ssr/internal/text-selection.js +101 -0
  471. package/dist/ssr/internal/text-selection.js.map +1 -0
  472. package/dist/ssr/intl/messages.js +12 -1155
  473. package/dist/ssr/intl/messages.js.map +1 -1
  474. package/dist/ssr/layout/AppWorkspace.js +203 -96
  475. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  476. package/dist/ssr/layout/BottomSheet.js +1 -0
  477. package/dist/ssr/layout/BottomSheet.js.map +1 -1
  478. package/dist/ssr/layout/Discussion.js +8 -5
  479. package/dist/ssr/layout/Discussion.js.map +1 -1
  480. package/dist/ssr/layout/FloatingWindow.js +8 -5
  481. package/dist/ssr/layout/FloatingWindow.js.map +1 -1
  482. package/dist/ssr/layout/Navigation.js +6 -5
  483. package/dist/ssr/layout/Navigation.js.map +1 -1
  484. package/dist/ssr/layout/PageTitle.js +253 -0
  485. package/dist/ssr/layout/PageTitle.js.map +1 -0
  486. package/dist/ssr/layout/PanelDialog.js +8 -6
  487. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  488. package/dist/ssr/layout/Panes.js +22 -14
  489. package/dist/ssr/layout/Panes.js.map +1 -1
  490. package/dist/ssr/layout/PullToRefresh.js +13 -4
  491. package/dist/ssr/layout/PullToRefresh.js.map +1 -1
  492. package/dist/ssr/layout/Settings.js +14 -12
  493. package/dist/ssr/layout/Settings.js.map +1 -1
  494. package/dist/ssr/layout/SettingsCollection.js +6 -5
  495. package/dist/ssr/layout/SettingsCollection.js.map +1 -1
  496. package/dist/ssr/layout/SettingsModal.js +3 -1
  497. package/dist/ssr/layout/SettingsModal.js.map +1 -1
  498. package/dist/ssr/layout/app-workspace-controller.js +743 -12
  499. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  500. package/dist/ssr/layout/app-workspace-state.js +3 -2
  501. package/dist/ssr/layout/app-workspace-state.js.map +1 -1
  502. package/dist/ssr/layout/floating-window-messages.js +28 -0
  503. package/dist/ssr/layout/floating-window-messages.js.map +1 -0
  504. package/dist/ssr/layout/index.js +2 -0
  505. package/dist/ssr/layout/index.js.map +1 -1
  506. package/dist/ssr/layout/navigation-model.js.map +1 -1
  507. package/dist/ssr/layout/page-title-controller.js +169 -0
  508. package/dist/ssr/layout/page-title-controller.js.map +1 -0
  509. package/dist/ssr/layout/panel-dialog-messages.js +20 -0
  510. package/dist/ssr/layout/panel-dialog-messages.js.map +1 -0
  511. package/dist/ssr/layout/panes-messages.js +48 -0
  512. package/dist/ssr/layout/panes-messages.js.map +1 -0
  513. package/dist/ssr/layout/refresh-messages.js +20 -0
  514. package/dist/ssr/layout/refresh-messages.js.map +1 -0
  515. package/dist/ssr/layout/settings-messages.js +54 -0
  516. package/dist/ssr/layout/settings-messages.js.map +1 -0
  517. package/dist/ssr/layout/workspace-messages.js +56 -0
  518. package/dist/ssr/layout/workspace-messages.js.map +1 -0
  519. package/dist/ssr/surfaces/Avatar.js +5 -5
  520. package/dist/ssr/surfaces/Avatar.js.map +1 -1
  521. package/dist/ssr/surfaces/ResourceCard.js +4 -2
  522. package/dist/ssr/surfaces/ResourceCard.js.map +1 -1
  523. package/dist/ssr/surfaces/Tag.js +3 -3
  524. package/dist/ssr/surfaces/Tag.js.map +1 -1
  525. package/dist/ssr/surfaces/avatar-messages.js +26 -0
  526. package/dist/ssr/surfaces/avatar-messages.js.map +1 -0
  527. package/dist/ssr/surfaces/resource-messages.js +26 -0
  528. package/dist/ssr/surfaces/resource-messages.js.map +1 -0
  529. package/dist/ssr/widgets/Widget.js +6 -0
  530. package/dist/ssr/widgets/Widget.js.map +1 -1
  531. package/dist/styles.css +1 -1
  532. package/dist/types/actions/GestureMenu.d.ts +2 -0
  533. package/dist/types/actions/filter-messages.d.ts +8 -0
  534. package/dist/types/actions/spotlight-messages.d.ts +8 -0
  535. package/dist/types/chat/chat-messages.d.ts +116 -0
  536. package/dist/types/content/Calendar.d.ts +32 -0
  537. package/dist/types/content/DataTable.d.ts +2 -0
  538. package/dist/types/content/FileView.d.ts +0 -10
  539. package/dist/types/content/calendar-messages.d.ts +60 -0
  540. package/dist/types/content/calendar-month-layout.d.ts +52 -0
  541. package/dist/types/content/chart-messages.d.ts +32 -0
  542. package/dist/types/content/data-table-messages.d.ts +10 -0
  543. package/dist/types/content/docs-messages.d.ts +10 -0
  544. package/dist/types/content/feed-messages.d.ts +15 -0
  545. package/dist/types/content/file-browser-messages.d.ts +33 -0
  546. package/dist/types/content/file-view-messages.d.ts +30 -0
  547. package/dist/types/content/index.d.ts +1 -1
  548. package/dist/types/content/lightbox-messages.d.ts +16 -0
  549. package/dist/types/content/log-entries-messages.d.ts +8 -0
  550. package/dist/types/content/markdown-info-block-messages.d.ts +12 -0
  551. package/dist/types/content/markdown-reference-messages.d.ts +15 -0
  552. package/dist/types/content/pagination-messages.d.ts +17 -0
  553. package/dist/types/content/pdf-messages.d.ts +20 -0
  554. package/dist/types/content/range-picker-messages.d.ts +8 -0
  555. package/dist/types/content/structured-data-messages.d.ts +9 -0
  556. package/dist/types/content/timeline-messages.d.ts +29 -0
  557. package/dist/types/content/video-messages.d.ts +10 -0
  558. package/dist/types/content/viewport-messages.d.ts +12 -0
  559. package/dist/types/feedback/install-messages.d.ts +50 -0
  560. package/dist/types/feedback/prompt-messages.d.ts +31 -0
  561. package/dist/types/feedback/toast-messages.d.ts +9 -0
  562. package/dist/types/index.d.ts +1 -0
  563. package/dist/types/inputs/completion-messages.d.ts +10 -0
  564. package/dist/types/inputs/date-picker.d.ts +7 -0
  565. package/dist/types/inputs/file-drop-messages.d.ts +30 -0
  566. package/dist/types/inputs/file-drop.d.ts +3 -3
  567. package/dist/types/inputs/file-input-messages.d.ts +28 -0
  568. package/dist/types/inputs/icon-messages.d.ts +9 -0
  569. package/dist/types/inputs/input-messages.d.ts +17 -0
  570. package/dist/types/inputs/markdown/editor-messages.d.ts +20 -0
  571. package/dist/types/inputs/markdown/toolbar-messages.d.ts +18 -0
  572. package/dist/types/inputs/qr-messages.d.ts +11 -0
  573. package/dist/types/inputs/select-messages.d.ts +30 -0
  574. package/dist/types/inputs/tag-messages.d.ts +20 -0
  575. package/dist/types/inputs/template-messages.d.ts +9 -0
  576. package/dist/types/internal/render-error-messages.d.ts +8 -0
  577. package/dist/types/internal/text-selection.d.ts +18 -0
  578. package/dist/types/intl/messages.d.ts +6 -544
  579. package/dist/types/layout/AppWorkspace.d.ts +19 -4
  580. package/dist/types/layout/PageTitle.d.ts +64 -0
  581. package/dist/types/layout/app-workspace-controller.d.ts +4 -0
  582. package/dist/types/layout/app-workspace-state.d.ts +3 -2
  583. package/dist/types/layout/floating-window-messages.d.ts +12 -0
  584. package/dist/types/layout/index.d.ts +3 -0
  585. package/dist/types/layout/navigation-model.d.ts +7 -0
  586. package/dist/types/layout/page-title-controller.d.ts +13 -0
  587. package/dist/types/layout/panel-dialog-messages.d.ts +8 -0
  588. package/dist/types/layout/panes-messages.d.ts +22 -0
  589. package/dist/types/layout/refresh-messages.d.ts +8 -0
  590. package/dist/types/layout/settings-messages.d.ts +25 -0
  591. package/dist/types/layout/workspace-messages.d.ts +26 -0
  592. package/dist/types/surfaces/avatar-messages.d.ts +11 -0
  593. package/dist/types/surfaces/resource-messages.d.ts +11 -0
  594. package/dist/types/widgets/Widget.d.ts +5 -1
  595. package/package.json +1 -1
@@ -4,10 +4,12 @@ import { fuzzy } from "@k2b/stdlib";
4
4
  import { createMemo } from "solid-js";
5
5
  import { useUiMessages } from "../intl/messages";
6
6
  import { resolveMaybeAccessor } from "./field-contract";
7
+ import { useIconMessages } from "./icon-messages";
7
8
  import { DEFAULT_ICON_GROUPS, DEFAULT_ICON_OPTIONS } from "./icon-options";
8
9
  import { Select } from "./Select";
9
10
  export function IconInput(props) {
10
11
  const messages = useUiMessages();
12
+ const iconMessages = useIconMessages();
11
13
  const options = () => props.options ?? DEFAULT_ICON_OPTIONS;
12
14
  const groups = () => props.groups ?? (props.options === undefined ? DEFAULT_ICON_GROUPS : undefined);
13
15
  const filterOptions = (source, query) => {
@@ -57,7 +59,7 @@ export function IconInput(props) {
57
59
  return props["aria-describedby"];
58
60
  },
59
61
  get placeholder() {
60
- return props.placeholder ?? messages().pickIcon;
62
+ return props.placeholder ?? iconMessages().pickIcon;
61
63
  },
62
64
  get disabled() {
63
65
  return props.disabled;
@@ -90,7 +92,7 @@ export function IconInput(props) {
90
92
  return props.defaultGroup ?? (props.options === undefined ? "recommended" : undefined);
91
93
  },
92
94
  get groupsAriaLabel() {
93
- return props.groupsAriaLabel ?? messages().filterIcons;
95
+ return props.groupsAriaLabel ?? iconMessages().filterIcons;
94
96
  },
95
97
  get allGroupLabel() {
96
98
  return props.allGroupLabel;
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["inputs/SpecialInputs.tsx"],"sourcesContent":["import { fuzzy } from \"@k2b/stdlib\";\nimport { createMemo, type JSX } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { resolveMaybeAccessor } from \"./field-contract\";\nimport { DEFAULT_ICON_GROUPS, DEFAULT_ICON_OPTIONS } from \"./icon-options\";\nimport { Select, type SelectGridSize, type SelectGroup, type SelectOption, type SelectView } from \"./Select\";\n\nexport type IconOption = SelectOption & { keywords?: readonly string[] };\nexport type IconInputProps = ValueFieldProps<string | null> & {\n options?: readonly IconOption[];\n placeholder?: string;\n clearable?: boolean;\n searchLimit?: number;\n groups?: readonly SelectGroup[];\n defaultGroup?: string;\n groupsAriaLabel?: string;\n allGroupLabel?: string;\n viewToggle?: boolean;\n defaultView?: SelectView;\n gridSize?: SelectGridSize;\n name?: string;\n};\n\nexport function IconInput(props: IconInputProps): JSX.Element {\n const messages = useUiMessages();\n const options = () => props.options ?? DEFAULT_ICON_OPTIONS;\n const groups = () => props.groups ?? (props.options === undefined ? DEFAULT_ICON_GROUPS : undefined);\n const filterOptions = (source: readonly SelectOption[], query: string): readonly SelectOption[] => {\n const normalized = query.trim().toLowerCase();\n if (!normalized) {\n return [...source].sort((left, right) => String(left.label).localeCompare(String(right.label), undefined, { sensitivity: \"base\" }));\n }\n return fuzzy\n .filter(normalized, source, {\n // Cloud's key is `[label, ...keywords]`. Including `value` as well put\n // the literal \"ti ti-\" in front of every entry, so short queries matched\n // the whole catalogue and fuzzy scores were skewed. The bare glyph name\n // is already the first keyword (see `icon()` in ./icon-options), so\n // nothing is lost by dropping it.\n key: (option) => {\n const keywords = \"keywords\" in option && Array.isArray(option.keywords) ? option.keywords.join(\" \") : \"\";\n return `${String(option.label)} ${keywords}`.toLowerCase();\n },\n limit: props.searchLimit ?? 50,\n })\n .map((match) => match.item);\n };\n const selectedOption = createMemo(() => options().find((option) => option.value === resolveMaybeAccessor(props.value)));\n\n return (\n <Select\n id={props.id}\n name={props.name}\n class={props.class}\n label={props.label}\n description={props.description}\n error={props.error}\n aria-label={props[\"aria-label\"]}\n aria-describedby={props[\"aria-describedby\"]}\n placeholder={props.placeholder ?? messages().pickIcon}\n disabled={props.disabled}\n required={props.required}\n clearable={props.clearable ?? true}\n value={resolveMaybeAccessor(props.value)}\n selectedOption={selectedOption()}\n onValueChange={props.onValueChange}\n onValueCommit={props.onValueCommit}\n options={[...options()]}\n groups={groups()}\n defaultGroup={props.defaultGroup ?? (props.options === undefined ? \"recommended\" : undefined)}\n groupsAriaLabel={props.groupsAriaLabel ?? messages().filterIcons}\n allGroupLabel={props.allGroupLabel}\n viewToggle={props.viewToggle ?? true}\n defaultView={props.defaultView ?? \"grid\"}\n gridSize={props.gridSize ?? \"sm\"}\n searchable\n filterOptions={filterOptions}\n searchPlaceholder={messages().search}\n icon={selectedOption()?.icon ?? \"ti ti-icons\"}\n />\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["inputs/SpecialInputs.tsx"],"sourcesContent":["import { fuzzy } from \"@k2b/stdlib\";\nimport { createMemo, type JSX } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { resolveMaybeAccessor } from \"./field-contract\";\nimport { useIconMessages } from \"./icon-messages\";\nimport { DEFAULT_ICON_GROUPS, DEFAULT_ICON_OPTIONS } from \"./icon-options\";\nimport { Select, type SelectGridSize, type SelectGroup, type SelectOption, type SelectView } from \"./Select\";\n\nexport type IconOption = SelectOption & { keywords?: readonly string[] };\nexport type IconInputProps = ValueFieldProps<string | null> & {\n options?: readonly IconOption[];\n placeholder?: string;\n clearable?: boolean;\n searchLimit?: number;\n groups?: readonly SelectGroup[];\n defaultGroup?: string;\n groupsAriaLabel?: string;\n allGroupLabel?: string;\n viewToggle?: boolean;\n defaultView?: SelectView;\n gridSize?: SelectGridSize;\n name?: string;\n};\n\nexport function IconInput(props: IconInputProps): JSX.Element {\n const messages = useUiMessages();\n const iconMessages = useIconMessages();\n const options = () => props.options ?? DEFAULT_ICON_OPTIONS;\n const groups = () => props.groups ?? (props.options === undefined ? DEFAULT_ICON_GROUPS : undefined);\n const filterOptions = (source: readonly SelectOption[], query: string): readonly SelectOption[] => {\n const normalized = query.trim().toLowerCase();\n if (!normalized) {\n return [...source].sort((left, right) => String(left.label).localeCompare(String(right.label), undefined, { sensitivity: \"base\" }));\n }\n return fuzzy\n .filter(normalized, source, {\n // Cloud's key is `[label, ...keywords]`. Including `value` as well put\n // the literal \"ti ti-\" in front of every entry, so short queries matched\n // the whole catalogue and fuzzy scores were skewed. The bare glyph name\n // is already the first keyword (see `icon()` in ./icon-options), so\n // nothing is lost by dropping it.\n key: (option) => {\n const keywords = \"keywords\" in option && Array.isArray(option.keywords) ? option.keywords.join(\" \") : \"\";\n return `${String(option.label)} ${keywords}`.toLowerCase();\n },\n limit: props.searchLimit ?? 50,\n })\n .map((match) => match.item);\n };\n const selectedOption = createMemo(() => options().find((option) => option.value === resolveMaybeAccessor(props.value)));\n\n return (\n <Select\n id={props.id}\n name={props.name}\n class={props.class}\n label={props.label}\n description={props.description}\n error={props.error}\n aria-label={props[\"aria-label\"]}\n aria-describedby={props[\"aria-describedby\"]}\n placeholder={props.placeholder ?? iconMessages().pickIcon}\n disabled={props.disabled}\n required={props.required}\n clearable={props.clearable ?? true}\n value={resolveMaybeAccessor(props.value)}\n selectedOption={selectedOption()}\n onValueChange={props.onValueChange}\n onValueCommit={props.onValueCommit}\n options={[...options()]}\n groups={groups()}\n defaultGroup={props.defaultGroup ?? (props.options === undefined ? \"recommended\" : undefined)}\n groupsAriaLabel={props.groupsAriaLabel ?? iconMessages().filterIcons}\n allGroupLabel={props.allGroupLabel}\n viewToggle={props.viewToggle ?? true}\n defaultView={props.defaultView ?? \"grid\"}\n gridSize={props.gridSize ?? \"sm\"}\n searchable\n filterOptions={filterOptions}\n searchPlaceholder={messages().search}\n icon={selectedOption()?.icon ?? \"ti ti-icons\"}\n />\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -19,6 +19,7 @@ import { useUiMessages } from "../intl/messages";
19
19
  import { Tag } from "../surfaces/Tag";
20
20
  import { ColorInput } from "./ChoiceInputs";
21
21
  import { TextInput } from "./TextInput";
22
+ import { useTagMessages } from "./tag-messages";
22
23
  function EditorForm(props) {
23
24
  const initialName = props.initial?.name ?? "";
24
25
  const initialColor = props.initial?.color ?? props.defaultColor;
@@ -102,14 +103,15 @@ function EditorForm(props) {
102
103
  /** Controlled tag manager. Persistence, authorization, confirmation, and toasts stay with the consumer. */
103
104
  export function TagEditor(props) {
104
105
  const messages = useUiMessages();
106
+ const tagMessages = useTagMessages();
105
107
  const [mode, setMode] = createSignal(null);
106
108
  const [busyId, setBusyId] = createSignal(null);
107
109
  const [rowError, setRowError] = createSignal();
108
110
  const labels = () => ({
109
- create: messages().addTag,
110
- empty: messages().noTagsYet,
111
+ create: tagMessages().addTag,
112
+ empty: tagMessages().noTagsYet,
111
113
  name: messages().name,
112
- namePlaceholder: messages().tagName,
114
+ namePlaceholder: tagMessages().tagName,
113
115
  color: messages().color,
114
116
  save: messages().save,
115
117
  cancel: messages().cancel,
@@ -128,7 +130,7 @@ export function TagEditor(props) {
128
130
  } catch (cause) {
129
131
  setRowError({
130
132
  id,
131
- message: cause instanceof Error ? cause.message : messages().tagActionFailed
133
+ message: cause instanceof Error ? cause.message : tagMessages().tagActionFailed
132
134
  });
133
135
  throw cause;
134
136
  } finally {
@@ -215,7 +217,7 @@ export function TagEditor(props) {
215
217
  return busyId() === item.id;
216
218
  },
217
219
  get saveError() {
218
- return messages().tagCouldNotBeSaved;
220
+ return tagMessages().tagCouldNotBeSaved;
219
221
  },
220
222
  onCancel: () => setMode(null),
221
223
  get onDirtyChange() {
@@ -265,7 +267,7 @@ export function TagEditor(props) {
265
267
  return busyId() === "create";
266
268
  },
267
269
  get saveError() {
268
- return messages().tagCouldNotBeSaved;
270
+ return tagMessages().tagCouldNotBeSaved;
269
271
  },
270
272
  onCancel: () => setMode(null),
271
273
  get onDirtyChange() {
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["inputs/TagEditor.tsx"],"sourcesContent":["import { createEffect, createSignal, For, type JSX, onCleanup, Show } from \"solid-js\";\nimport { Button, IconButton } from \"../actions/Button\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { Tag } from \"../surfaces/Tag\";\nimport { ColorInput } from \"./ChoiceInputs\";\nimport { TextInput } from \"./TextInput\";\n\nexport type TagEditorItem = {\n id: string;\n name: string;\n color?: string | null;\n};\n\nexport type TagEditorValue = {\n name: string;\n color: string;\n};\n\nexport type TagEditorLabels = {\n create: string;\n empty: string;\n name: string;\n namePlaceholder: string;\n color: string;\n save: string;\n cancel: string;\n edit: string;\n remove: string;\n};\n\nexport type TagEditorProps<T extends TagEditorItem = TagEditorItem> = {\n items: readonly T[];\n onCreate?: (value: TagEditorValue) => void | Promise<void>;\n onUpdate?: (item: T, value: TagEditorValue) => void | Promise<void>;\n onDelete?: (item: T) => void | Promise<void>;\n labels?: Partial<TagEditorLabels>;\n defaultColor?: string;\n disabled?: boolean;\n onDirtyChange?: (dirty: boolean) => void;\n class?: string;\n};\n\ntype EditorFormProps = {\n initial?: TagEditorItem;\n labels: TagEditorLabels;\n defaultColor: string;\n busy: boolean;\n saveError: string;\n onCancel: () => void;\n onDirtyChange?: (dirty: boolean) => void;\n onSave: (value: TagEditorValue) => Promise<void>;\n};\n\nfunction EditorForm(props: EditorFormProps): JSX.Element {\n const initialName = props.initial?.name ?? \"\";\n const initialColor = props.initial?.color ?? props.defaultColor;\n const [name, setName] = createSignal(initialName);\n const [color, setColor] = createSignal(initialColor);\n const [error, setError] = createSignal<string>();\n\n createEffect(() => props.onDirtyChange?.(name() !== initialName || color() !== initialColor));\n onCleanup(() => props.onDirtyChange?.(false));\n\n const submit = async (event: SubmitEvent) => {\n event.preventDefault();\n const normalized = name().trim();\n if (!normalized || props.busy) return;\n setError(undefined);\n try {\n await props.onSave({ name: normalized, color: color() });\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : props.saveError);\n }\n };\n\n return (\n <form class=\"k2b-tag-editor__form\" aria-busy={props.busy ? \"true\" : undefined} onSubmit={submit}>\n <div class=\"k2b-tag-editor__fields\">\n <TextInput\n label={props.labels.name}\n placeholder={props.labels.namePlaceholder}\n value={name}\n onValueChange={setName}\n disabled={props.busy}\n required\n autofocus\n />\n <ColorInput\n aria-label={props.labels.color}\n value={color}\n onValueChange={setColor}\n onValueCommit={setColor}\n disabled={props.busy}\n compact\n />\n </div>\n <Show when={error()}>\n {(message) => (\n <p class=\"k2b-tag-editor__error\" role=\"alert\">\n {message()}\n </p>\n )}\n </Show>\n <div class=\"k2b-tag-editor__form-actions\">\n <Button type=\"submit\" size=\"sm\" loading={props.busy} disabled={!name().trim()}>\n {props.labels.save}\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" disabled={props.busy} onClick={props.onCancel}>\n {props.labels.cancel}\n </Button>\n </div>\n </form>\n );\n}\n\n/** Controlled tag manager. Persistence, authorization, confirmation, and toasts stay with the consumer. */\nexport function TagEditor<T extends TagEditorItem = TagEditorItem>(props: TagEditorProps<T>): JSX.Element {\n const messages = useUiMessages();\n const [mode, setMode] = createSignal<\"create\" | string | null>(null);\n const [busyId, setBusyId] = createSignal<string | null>(null);\n const [rowError, setRowError] = createSignal<{ id: string; message: string }>();\n const labels = (): TagEditorLabels => ({\n create: messages().addTag,\n empty: messages().noTagsYet,\n name: messages().name,\n namePlaceholder: messages().tagName,\n color: messages().color,\n save: messages().save,\n cancel: messages().cancel,\n edit: messages().edit,\n remove: messages().delete,\n ...props.labels,\n });\n const defaultColor = () => props.defaultColor ?? \"#6b7280\";\n const run = async (id: string, action: () => void | Promise<void>) => {\n if (busyId()) return;\n setBusyId(id);\n setRowError(undefined);\n try {\n await action();\n setMode(null);\n } catch (cause) {\n setRowError({ id, message: cause instanceof Error ? cause.message : messages().tagActionFailed });\n throw cause;\n } finally {\n setBusyId(null);\n }\n };\n\n return (\n <div class={`k2b-tag-editor ${props.class ?? \"\"}`} data-disabled={props.disabled ? \"true\" : undefined}>\n <Show when={props.items.length > 0} fallback={<p class=\"k2b-tag-editor__empty\">{labels().empty}</p>}>\n <ul class=\"k2b-tag-editor__list\">\n <For each={props.items}>\n {(item) => (\n <li class=\"k2b-tag-editor__row\">\n <Show\n when={mode() === item.id && props.onUpdate}\n fallback={\n <>\n <Tag color={item.color}>{item.name}</Tag>\n <span class=\"k2b-tag-editor__row-actions\">\n <Show when={props.onUpdate}>\n <IconButton\n size=\"xs\"\n variant=\"ghost\"\n label={`${labels().edit} ${item.name}`}\n disabled={props.disabled || Boolean(busyId())}\n onClick={() => setMode(item.id)}\n >\n <i class=\"ti ti-pencil\" aria-hidden=\"true\" />\n </IconButton>\n </Show>\n <Show when={props.onDelete}>\n {(remove) => (\n <IconButton\n size=\"xs\"\n variant=\"ghost\"\n label={`${labels().remove} ${item.name}`}\n loading={busyId() === item.id}\n disabled={props.disabled || Boolean(busyId())}\n onClick={() => void run(item.id, () => remove()(item)).catch(() => undefined)}\n >\n <i class=\"ti ti-trash\" aria-hidden=\"true\" />\n </IconButton>\n )}\n </Show>\n </span>\n </>\n }\n >\n <EditorForm\n initial={item}\n labels={labels()}\n defaultColor={defaultColor()}\n busy={busyId() === item.id}\n saveError={messages().tagCouldNotBeSaved}\n onCancel={() => setMode(null)}\n onDirtyChange={props.onDirtyChange}\n onSave={(value) => run(item.id, () => props.onUpdate?.(item, value))}\n />\n </Show>\n <Show when={rowError()?.id === item.id && mode() !== item.id ? rowError() : undefined}>\n {(error) => (\n <p class=\"k2b-tag-editor__error\" role=\"alert\">\n {error().message}\n </p>\n )}\n </Show>\n </li>\n )}\n </For>\n </ul>\n </Show>\n\n <Show when={props.onCreate}>\n {(create) => (\n <Show\n when={mode() === \"create\"}\n fallback={\n <Button size=\"xs\" variant=\"subtle\" disabled={props.disabled || Boolean(busyId())} onClick={() => setMode(\"create\")}>\n <i class=\"ti ti-plus\" aria-hidden=\"true\" />\n {labels().create}\n </Button>\n }\n >\n <EditorForm\n labels={labels()}\n defaultColor={defaultColor()}\n busy={busyId() === \"create\"}\n saveError={messages().tagCouldNotBeSaved}\n onCancel={() => setMode(null)}\n onDirtyChange={props.onDirtyChange}\n onSave={(value) => run(\"create\", () => create()(value))}\n />\n </Show>\n )}\n </Show>\n </div>\n );\n}\n\nexport default TagEditor;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["inputs/TagEditor.tsx"],"sourcesContent":["import { createEffect, createSignal, For, type JSX, onCleanup, Show } from \"solid-js\";\nimport { Button, IconButton } from \"../actions/Button\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { Tag } from \"../surfaces/Tag\";\nimport { ColorInput } from \"./ChoiceInputs\";\nimport { TextInput } from \"./TextInput\";\nimport { useTagMessages } from \"./tag-messages\";\n\nexport type TagEditorItem = {\n id: string;\n name: string;\n color?: string | null;\n};\n\nexport type TagEditorValue = {\n name: string;\n color: string;\n};\n\nexport type TagEditorLabels = {\n create: string;\n empty: string;\n name: string;\n namePlaceholder: string;\n color: string;\n save: string;\n cancel: string;\n edit: string;\n remove: string;\n};\n\nexport type TagEditorProps<T extends TagEditorItem = TagEditorItem> = {\n items: readonly T[];\n onCreate?: (value: TagEditorValue) => void | Promise<void>;\n onUpdate?: (item: T, value: TagEditorValue) => void | Promise<void>;\n onDelete?: (item: T) => void | Promise<void>;\n labels?: Partial<TagEditorLabels>;\n defaultColor?: string;\n disabled?: boolean;\n onDirtyChange?: (dirty: boolean) => void;\n class?: string;\n};\n\ntype EditorFormProps = {\n initial?: TagEditorItem;\n labels: TagEditorLabels;\n defaultColor: string;\n busy: boolean;\n saveError: string;\n onCancel: () => void;\n onDirtyChange?: (dirty: boolean) => void;\n onSave: (value: TagEditorValue) => Promise<void>;\n};\n\nfunction EditorForm(props: EditorFormProps): JSX.Element {\n const initialName = props.initial?.name ?? \"\";\n const initialColor = props.initial?.color ?? props.defaultColor;\n const [name, setName] = createSignal(initialName);\n const [color, setColor] = createSignal(initialColor);\n const [error, setError] = createSignal<string>();\n\n createEffect(() => props.onDirtyChange?.(name() !== initialName || color() !== initialColor));\n onCleanup(() => props.onDirtyChange?.(false));\n\n const submit = async (event: SubmitEvent) => {\n event.preventDefault();\n const normalized = name().trim();\n if (!normalized || props.busy) return;\n setError(undefined);\n try {\n await props.onSave({ name: normalized, color: color() });\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : props.saveError);\n }\n };\n\n return (\n <form class=\"k2b-tag-editor__form\" aria-busy={props.busy ? \"true\" : undefined} onSubmit={submit}>\n <div class=\"k2b-tag-editor__fields\">\n <TextInput\n label={props.labels.name}\n placeholder={props.labels.namePlaceholder}\n value={name}\n onValueChange={setName}\n disabled={props.busy}\n required\n autofocus\n />\n <ColorInput\n aria-label={props.labels.color}\n value={color}\n onValueChange={setColor}\n onValueCommit={setColor}\n disabled={props.busy}\n compact\n />\n </div>\n <Show when={error()}>\n {(message) => (\n <p class=\"k2b-tag-editor__error\" role=\"alert\">\n {message()}\n </p>\n )}\n </Show>\n <div class=\"k2b-tag-editor__form-actions\">\n <Button type=\"submit\" size=\"sm\" loading={props.busy} disabled={!name().trim()}>\n {props.labels.save}\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" disabled={props.busy} onClick={props.onCancel}>\n {props.labels.cancel}\n </Button>\n </div>\n </form>\n );\n}\n\n/** Controlled tag manager. Persistence, authorization, confirmation, and toasts stay with the consumer. */\nexport function TagEditor<T extends TagEditorItem = TagEditorItem>(props: TagEditorProps<T>): JSX.Element {\n const messages = useUiMessages();\n const tagMessages = useTagMessages();\n const [mode, setMode] = createSignal<\"create\" | string | null>(null);\n const [busyId, setBusyId] = createSignal<string | null>(null);\n const [rowError, setRowError] = createSignal<{ id: string; message: string }>();\n const labels = (): TagEditorLabels => ({\n create: tagMessages().addTag,\n empty: tagMessages().noTagsYet,\n name: messages().name,\n namePlaceholder: tagMessages().tagName,\n color: messages().color,\n save: messages().save,\n cancel: messages().cancel,\n edit: messages().edit,\n remove: messages().delete,\n ...props.labels,\n });\n const defaultColor = () => props.defaultColor ?? \"#6b7280\";\n const run = async (id: string, action: () => void | Promise<void>) => {\n if (busyId()) return;\n setBusyId(id);\n setRowError(undefined);\n try {\n await action();\n setMode(null);\n } catch (cause) {\n setRowError({ id, message: cause instanceof Error ? cause.message : tagMessages().tagActionFailed });\n throw cause;\n } finally {\n setBusyId(null);\n }\n };\n\n return (\n <div class={`k2b-tag-editor ${props.class ?? \"\"}`} data-disabled={props.disabled ? \"true\" : undefined}>\n <Show when={props.items.length > 0} fallback={<p class=\"k2b-tag-editor__empty\">{labels().empty}</p>}>\n <ul class=\"k2b-tag-editor__list\">\n <For each={props.items}>\n {(item) => (\n <li class=\"k2b-tag-editor__row\">\n <Show\n when={mode() === item.id && props.onUpdate}\n fallback={\n <>\n <Tag color={item.color}>{item.name}</Tag>\n <span class=\"k2b-tag-editor__row-actions\">\n <Show when={props.onUpdate}>\n <IconButton\n size=\"xs\"\n variant=\"ghost\"\n label={`${labels().edit} ${item.name}`}\n disabled={props.disabled || Boolean(busyId())}\n onClick={() => setMode(item.id)}\n >\n <i class=\"ti ti-pencil\" aria-hidden=\"true\" />\n </IconButton>\n </Show>\n <Show when={props.onDelete}>\n {(remove) => (\n <IconButton\n size=\"xs\"\n variant=\"ghost\"\n label={`${labels().remove} ${item.name}`}\n loading={busyId() === item.id}\n disabled={props.disabled || Boolean(busyId())}\n onClick={() => void run(item.id, () => remove()(item)).catch(() => undefined)}\n >\n <i class=\"ti ti-trash\" aria-hidden=\"true\" />\n </IconButton>\n )}\n </Show>\n </span>\n </>\n }\n >\n <EditorForm\n initial={item}\n labels={labels()}\n defaultColor={defaultColor()}\n busy={busyId() === item.id}\n saveError={tagMessages().tagCouldNotBeSaved}\n onCancel={() => setMode(null)}\n onDirtyChange={props.onDirtyChange}\n onSave={(value) => run(item.id, () => props.onUpdate?.(item, value))}\n />\n </Show>\n <Show when={rowError()?.id === item.id && mode() !== item.id ? rowError() : undefined}>\n {(error) => (\n <p class=\"k2b-tag-editor__error\" role=\"alert\">\n {error().message}\n </p>\n )}\n </Show>\n </li>\n )}\n </For>\n </ul>\n </Show>\n\n <Show when={props.onCreate}>\n {(create) => (\n <Show\n when={mode() === \"create\"}\n fallback={\n <Button size=\"xs\" variant=\"subtle\" disabled={props.disabled || Boolean(busyId())} onClick={() => setMode(\"create\")}>\n <i class=\"ti ti-plus\" aria-hidden=\"true\" />\n {labels().create}\n </Button>\n }\n >\n <EditorForm\n labels={labels()}\n defaultColor={defaultColor()}\n busy={busyId() === \"create\"}\n saveError={tagMessages().tagCouldNotBeSaved}\n onCancel={() => setMode(null)}\n onDirtyChange={props.onDirtyChange}\n onSave={(value) => run(\"create\", () => create()(value))}\n />\n </Show>\n )}\n </Show>\n </div>\n );\n}\n\nexport default TagEditor;\n"],"mappings":"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","ignoreList":[]}
@@ -12,14 +12,14 @@ var _tmpl$ = ["<span class=\"k2b-tags-input__values\" aria-hidden=\"true\">", "<
12
12
  _tmpl$6 = ["<input type=\"hidden\"", ">"];
13
13
  import { createEffect, createSignal, createUniqueId, Show } from "solid-js";
14
14
  import { createFieldMeta, Field, fieldControlAria } from "../internal/field";
15
- import { useUiMessages } from "../intl/messages";
16
15
  import { resolveMaybeAccessor } from "./field-contract";
16
+ import { useTagMessages } from "./tag-messages";
17
17
  export function TagsInput(props) {
18
- const messages = useUiMessages();
18
+ const tagMessages = useTagMessages();
19
19
  const meta = createFieldMeta(props.id);
20
20
  const announcementId = `k2b-tags-${createUniqueId()}`;
21
21
  const error = () => resolveMaybeAccessor(props.error);
22
- const placeholder = () => props.placeholder ?? messages().tagsPlaceholder;
22
+ const placeholder = () => props.placeholder ?? tagMessages().tagsPlaceholder;
23
23
  const [focused, setFocused] = createSignal(false);
24
24
  let focusStartValue = [];
25
25
  const normalize = text => text.replace(/\s+/g, " ").trim();
@@ -48,9 +48,9 @@ export function TagsInput(props) {
48
48
  const removed = previous.filter(tag => !nextTags.has(tag));
49
49
  const announcement = document.getElementById(announcementId);
50
50
  if (announcement) {
51
- announcement.textContent = [added.length ? messages().tagsAdded({
51
+ announcement.textContent = [added.length ? tagMessages().tagsAdded({
52
52
  tags: added.join(", ")
53
- }) : "", removed.length ? messages().tagsRemoved({
53
+ }) : "", removed.length ? tagMessages().tagsRemoved({
54
54
  tags: removed.join(", ")
55
55
  }) : ""].filter(Boolean).join(" ");
56
56
  }
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["inputs/TagsInput.tsx"],"sourcesContent":["import { createEffect, createSignal, createUniqueId, type JSX, Show } from \"solid-js\";\nimport { createFieldMeta, Field, fieldControlAria } from \"../internal/field\";\nimport { useUiMessages } from \"../intl/messages\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { resolveMaybeAccessor } from \"./field-contract\";\n\nexport type TagsInputProps = ValueFieldProps<string[]> & {\n placeholder?: string;\n icon?: string;\n activeIcon?: string;\n maxTags?: number;\n name?: string;\n};\n\nexport function TagsInput(props: TagsInputProps): JSX.Element {\n const messages = useUiMessages();\n const meta = createFieldMeta(props.id);\n const announcementId = `k2b-tags-${createUniqueId()}`;\n const error = () => resolveMaybeAccessor(props.error);\n const placeholder = () => props.placeholder ?? messages().tagsPlaceholder;\n const [focused, setFocused] = createSignal(false);\n let focusStartValue: readonly string[] = [];\n const normalize = (text: string) => text.replace(/\\s+/g, \" \").trim();\n const parseTags = (text: string): string[] => {\n const tags: string[] = [];\n const seen = new Set<string>();\n const limit = props.maxTags === undefined ? Number.POSITIVE_INFINITY : Math.max(0, Math.floor(props.maxTags));\n for (const rawTag of text.split(\",\")) {\n const tag = normalize(rawTag);\n if (!tag || seen.has(tag)) continue;\n if (tags.length >= limit) break;\n seen.add(tag);\n tags.push(tag);\n }\n return tags;\n };\n const value = () => parseTags((resolveMaybeAccessor(props.value) ?? []).join(\",\"));\n const [draft, setDraft] = createSignal(value().join(\", \"));\n createEffect(() => {\n if (!focused()) setDraft(value().join(\", \"));\n });\n\n const announce = (previous: readonly string[], next: readonly string[]) => {\n const previousTags = new Set(previous);\n const nextTags = new Set(next);\n const added = next.filter((tag) => !previousTags.has(tag));\n const removed = previous.filter((tag) => !nextTags.has(tag));\n const announcement = document.getElementById(announcementId);\n if (announcement) {\n announcement.textContent = [\n added.length ? messages().tagsAdded({ tags: added.join(\", \") }) : \"\",\n removed.length ? messages().tagsRemoved({ tags: removed.join(\", \") }) : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n }\n };\n\n return (\n <Field\n class={props.class}\n label={props.label}\n description={props.description}\n error={error()}\n meta={meta}\n labelFor={false}\n required={props.required}\n disabled={props.disabled}\n >\n <div class=\"k2b-tags-input\" data-invalid={error() ? \"true\" : undefined} data-disabled={props.disabled ? \"true\" : undefined}>\n <span class=\"k2b-tags-input__icon\" aria-hidden=\"true\">\n <i class={`${props.icon ?? \"ti ti-tag\"} k2b-tags-input__icon-idle`} />\n <i class={`${props.activeIcon ?? \"ti ti-pencil\"} k2b-tags-input__icon-active`} />\n </span>\n <Show when={!focused()}>\n <span class=\"k2b-tags-input__values\" aria-hidden=\"true\">\n <Show when={value().length > 0} fallback={<span class=\"k2b-tags-input__placeholder\">{placeholder()}</span>}>\n {value().map((tag) => (\n <span class=\"k2b-tag\">{tag}</span>\n ))}\n </Show>\n </span>\n </Show>\n <input\n id={meta.controlId}\n type=\"text\"\n {...fieldControlAria(meta, props)}\n disabled={props.disabled}\n placeholder={focused() || value().length === 0 ? placeholder() : undefined}\n value={draft()}\n onFocus={() => {\n if (props.disabled) return;\n focusStartValue = value();\n setDraft(focusStartValue.join(\", \"));\n setFocused(true);\n }}\n onInput={(event) => {\n if (props.disabled) return;\n const nextDraft = event.currentTarget.value;\n setDraft(nextDraft);\n props.onValueChange?.(parseTags(nextDraft));\n }}\n onBlur={() => {\n if (props.disabled) return;\n const next = parseTags(draft());\n announce(focusStartValue, next);\n props.onValueCommit?.(next);\n setFocused(false);\n }}\n onKeyDown={(event) => event.key === \"Enter\" && (event.preventDefault(), event.currentTarget.blur())}\n />\n </div>\n <Show when={props.name}>{(name) => <input type=\"hidden\" name={name()} value={value().join(\",\")} />}</Show>\n <div id={announcementId} class=\"k2b-sr-only\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" />\n </Field>\n );\n}\n\nexport default TagsInput;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["inputs/TagsInput.tsx"],"sourcesContent":["import { createEffect, createSignal, createUniqueId, type JSX, Show } from \"solid-js\";\nimport { createFieldMeta, Field, fieldControlAria } from \"../internal/field\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { resolveMaybeAccessor } from \"./field-contract\";\nimport { useTagMessages } from \"./tag-messages\";\n\nexport type TagsInputProps = ValueFieldProps<string[]> & {\n placeholder?: string;\n icon?: string;\n activeIcon?: string;\n maxTags?: number;\n name?: string;\n};\n\nexport function TagsInput(props: TagsInputProps): JSX.Element {\n const tagMessages = useTagMessages();\n const meta = createFieldMeta(props.id);\n const announcementId = `k2b-tags-${createUniqueId()}`;\n const error = () => resolveMaybeAccessor(props.error);\n const placeholder = () => props.placeholder ?? tagMessages().tagsPlaceholder;\n const [focused, setFocused] = createSignal(false);\n let focusStartValue: readonly string[] = [];\n const normalize = (text: string) => text.replace(/\\s+/g, \" \").trim();\n const parseTags = (text: string): string[] => {\n const tags: string[] = [];\n const seen = new Set<string>();\n const limit = props.maxTags === undefined ? Number.POSITIVE_INFINITY : Math.max(0, Math.floor(props.maxTags));\n for (const rawTag of text.split(\",\")) {\n const tag = normalize(rawTag);\n if (!tag || seen.has(tag)) continue;\n if (tags.length >= limit) break;\n seen.add(tag);\n tags.push(tag);\n }\n return tags;\n };\n const value = () => parseTags((resolveMaybeAccessor(props.value) ?? []).join(\",\"));\n const [draft, setDraft] = createSignal(value().join(\", \"));\n createEffect(() => {\n if (!focused()) setDraft(value().join(\", \"));\n });\n\n const announce = (previous: readonly string[], next: readonly string[]) => {\n const previousTags = new Set(previous);\n const nextTags = new Set(next);\n const added = next.filter((tag) => !previousTags.has(tag));\n const removed = previous.filter((tag) => !nextTags.has(tag));\n const announcement = document.getElementById(announcementId);\n if (announcement) {\n announcement.textContent = [\n added.length ? tagMessages().tagsAdded({ tags: added.join(\", \") }) : \"\",\n removed.length ? tagMessages().tagsRemoved({ tags: removed.join(\", \") }) : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n }\n };\n\n return (\n <Field\n class={props.class}\n label={props.label}\n description={props.description}\n error={error()}\n meta={meta}\n labelFor={false}\n required={props.required}\n disabled={props.disabled}\n >\n <div class=\"k2b-tags-input\" data-invalid={error() ? \"true\" : undefined} data-disabled={props.disabled ? \"true\" : undefined}>\n <span class=\"k2b-tags-input__icon\" aria-hidden=\"true\">\n <i class={`${props.icon ?? \"ti ti-tag\"} k2b-tags-input__icon-idle`} />\n <i class={`${props.activeIcon ?? \"ti ti-pencil\"} k2b-tags-input__icon-active`} />\n </span>\n <Show when={!focused()}>\n <span class=\"k2b-tags-input__values\" aria-hidden=\"true\">\n <Show when={value().length > 0} fallback={<span class=\"k2b-tags-input__placeholder\">{placeholder()}</span>}>\n {value().map((tag) => (\n <span class=\"k2b-tag\">{tag}</span>\n ))}\n </Show>\n </span>\n </Show>\n <input\n id={meta.controlId}\n type=\"text\"\n {...fieldControlAria(meta, props)}\n disabled={props.disabled}\n placeholder={focused() || value().length === 0 ? placeholder() : undefined}\n value={draft()}\n onFocus={() => {\n if (props.disabled) return;\n focusStartValue = value();\n setDraft(focusStartValue.join(\", \"));\n setFocused(true);\n }}\n onInput={(event) => {\n if (props.disabled) return;\n const nextDraft = event.currentTarget.value;\n setDraft(nextDraft);\n props.onValueChange?.(parseTags(nextDraft));\n }}\n onBlur={() => {\n if (props.disabled) return;\n const next = parseTags(draft());\n announce(focusStartValue, next);\n props.onValueCommit?.(next);\n setFocused(false);\n }}\n onKeyDown={(event) => event.key === \"Enter\" && (event.preventDefault(), event.currentTarget.blur())}\n />\n </div>\n <Show when={props.name}>{(name) => <input type=\"hidden\" name={name()} value={value().join(\",\")} />}</Show>\n <div id={announcementId} class=\"k2b-sr-only\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" />\n </Field>\n );\n}\n\nexport default TagsInput;\n"],"mappings":"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","ignoreList":[]}
@@ -7,10 +7,10 @@ import { memo as _$memo } from "solid-js/web";
7
7
  var _tmpl$ = ["<section class=\"", "\"><iframe sandbox", "></iframe></section>"],
8
8
  _tmpl$2 = ["<section class=\"", "\">", "</section>"];
9
9
  import { createMemo, For } from "solid-js";
10
- import { useUiMessages } from "../intl/messages";
11
10
  import { PANES_LAYOUT_VERSION } from "../layout/panes-layout";
12
11
  import { AutocompleteEditor } from "./AutocompleteEditor";
13
12
  import { TextInput } from "./TextInput";
13
+ import { useTemplateMessages } from "./template-messages";
14
14
  export const createTemplateEditorPanesLayout = () => ({
15
15
  version: PANES_LAYOUT_VERSION,
16
16
  root: {
@@ -121,7 +121,7 @@ const highlightTemplate = text => {
121
121
  return withTags.replace(/\uE000(\d+)\uE001/g, (_, index) => stashed[Number(index)] ?? "");
122
122
  };
123
123
  export function TemplateEditor(props) {
124
- const messages = useUiMessages();
124
+ const templateMessages = useTemplateMessages();
125
125
  const completions = createMemo(() => templateCompletions(props.variables));
126
126
  return _$createComponent(AutocompleteEditor, _$mergeProps(props, {
127
127
  get lines() {
@@ -131,7 +131,7 @@ export function TemplateEditor(props) {
131
131
  return props.spellcheck ?? false;
132
132
  },
133
133
  get placeholder() {
134
- return props.placeholder ?? messages().templateEditorPlaceholder;
134
+ return props.placeholder ?? templateMessages().templateEditorPlaceholder;
135
135
  },
136
136
  highlight: highlightTemplate,
137
137
  get completions() {
@@ -140,8 +140,8 @@ export function TemplateEditor(props) {
140
140
  }));
141
141
  }
142
142
  export function TemplatePreview(props) {
143
- const messages = useUiMessages();
144
- return _$ssr(_tmpl$, `k2b-template-preview ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("srcdoc", _$escape(props.html, true), false) + _$ssrAttribute("title", _$escape(props.title ?? messages().templatePreview, true), false));
143
+ const templateMessages = useTemplateMessages();
144
+ return _$ssr(_tmpl$, `k2b-template-preview ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("srcdoc", _$escape(props.html, true), false) + _$ssrAttribute("title", _$escape(props.title ?? templateMessages().templatePreview, true), false));
145
145
  }
146
146
  export function TemplateSampleData(props) {
147
147
  return _$ssr(_tmpl$2, `k2b-template-sample ${_$escape(props.class ?? "", true)}`, _$escape(_$createComponent(For, {
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["inputs/TemplateEditor.tsx"],"sourcesContent":["import { createMemo, For, type JSX } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { PANES_LAYOUT_VERSION, type PanesLayout } from \"../layout/panes-layout\";\nimport { AutocompleteEditor, type AutocompleteEditorProps } from \"./AutocompleteEditor\";\nimport type { Completion, Suggestion } from \"./completion\";\nimport { TextInput } from \"./TextInput\";\n\nexport type TemplateVariableKind = \"string\" | \"email\" | \"url\" | \"number\" | \"boolean\" | \"array\" | \"object\";\n\nexport type TemplateVariable = {\n name: string;\n kind?: TemplateVariableKind;\n description?: string;\n};\n\nexport type TemplateEditorProps = Omit<AutocompleteEditorProps, \"completions\" | \"highlight\"> & {\n variables: readonly TemplateVariable[];\n};\n\nexport type TemplatePreviewProps = {\n html: string;\n title?: string;\n class?: string;\n};\n\nexport type TemplateSampleDataProps = {\n variables: readonly TemplateVariable[];\n values: Readonly<Record<string, string>>;\n onValueChange: (name: string, value: string) => void;\n class?: string;\n};\n\nexport type TemplateEditorLayout = PanesLayout;\n\nexport const createTemplateEditorPanesLayout = (): TemplateEditorLayout => ({\n version: PANES_LAYOUT_VERSION,\n root: {\n type: \"split\",\n direction: \"horizontal\",\n ratio: 0.5,\n first: { type: \"group\", items: [\"html\"], active: \"html\" },\n second: { type: \"group\", items: [\"preview\", \"sample-data\"], active: \"preview\" },\n },\n});\n\nconst HTML_TAGS = [\n { name: \"p\", snippet: \"<p></p>\", hint: \"paragraph\" },\n {\n name: \"a\",\n snippet: '<a href=\"{{ LOGIN_URL }}\">Link</a>',\n hint: \"link\",\n },\n { name: \"strong\", snippet: \"<strong></strong>\", hint: \"bold\" },\n { name: \"em\", snippet: \"<em></em>\", hint: \"emphasis\" },\n { name: \"br\", snippet: \"<br>\", hint: \"line break\" },\n { name: \"ul\", snippet: \"<ul>\\n <li></li>\\n</ul>\", hint: \"list\" },\n {\n name: \"table\",\n snippet: \"<table>\\n <tr><td></td></tr>\\n</table>\",\n hint: \"table\",\n },\n] as const;\n\nconst suggestion = (text: string, hint: string, label?: string): Suggestion => ({ text, hint, label, appendSpace: false });\n\nconst templateCompletions = (variables: readonly TemplateVariable[]): Completion[] => [\n {\n trigger: \"{\",\n dropdown: true,\n allowAfterWord: true,\n suggest: (query, context) => {\n const normalized = query.toLowerCase();\n const leadingBrace = context.tokenStart > 0 && context.fullText[context.tokenStart - 1] === \"{\";\n const open = leadingBrace ? \"{ \" : \"{{ \";\n const close = leadingBrace ? \" }}\" : \" }}\";\n const values = variables\n .filter((variable) => variable.name.toLowerCase().startsWith(normalized))\n .map((variable) => suggestion(`${open}${variable.name}${close}`, variable.kind ?? \"string\", variable.name));\n const conditions = variables\n .filter((variable) => variable.kind !== \"array\")\n .filter((variable) => variable.name.toLowerCase().startsWith(normalized))\n .map((variable) => suggestion(`{% if ${variable.name} != blank %}\\n \\n{% endif %}`, \"condition\", `if ${variable.name}`));\n const loops = variables\n .filter((variable) => variable.kind === \"array\")\n .filter((variable) => variable.name.toLowerCase().startsWith(normalized))\n .map((variable) => suggestion(`{% for item in ${variable.name} %}\\n {{ item }}\\n{% endfor %}`, \"loop\", `for ${variable.name}`));\n return [...values, ...conditions, ...loops];\n },\n },\n {\n trigger: \"%\",\n dropdown: true,\n allowAfterWord: true,\n suggest: (query) => {\n const normalized = query.toLowerCase();\n const conditions = variables\n .filter((variable) => variable.kind !== \"array\")\n .filter((variable) => variable.name.toLowerCase().startsWith(normalized))\n .map((variable) => suggestion(`% if ${variable.name} != blank %}\\n \\n{% endif %}`, \"condition\", `if ${variable.name}`));\n const loops = variables\n .filter((variable) => variable.kind === \"array\")\n .filter((variable) => variable.name.toLowerCase().startsWith(normalized))\n .map((variable) => suggestion(`% for item in ${variable.name} %}\\n {{ item }}\\n{% endfor %}`, \"loop\", `for ${variable.name}`));\n return [...conditions, ...loops];\n },\n },\n {\n trigger: \"<\",\n dropdown: true,\n allowAfterWord: true,\n suggest: (query) => {\n const normalized = query.toLowerCase();\n return HTML_TAGS.filter((tag) => tag.name.startsWith(normalized)).map((tag) => suggestion(tag.snippet, tag.hint, tag.name));\n },\n },\n];\n\nconst escapeHtml = (value: string): string =>\n value.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\").replace(/\"/g, \"&quot;\");\n\nconst highlightLiquidToken = (token: string): string => {\n const inner = token.replace(/^\\{\\{|\\}\\}$|^\\{%|\\%}$/g, \"\").trim();\n const keyword = inner.split(/\\s+/)[0] ?? \"\";\n const kind = token.startsWith(\"{%\") ? (keyword.startsWith(\"end\") ? \"end\" : \"control\") : inner.includes(\"| raw\") ? \"raw\" : \"value\";\n return `<span class=\"k2b-template-token\" data-kind=\"${kind}\">${escapeHtml(token)}</span>`;\n};\n\nconst highlightTag = (tag: string): string => {\n const match = tag.match(/^(&lt;\\/?)([a-zA-Z][\\w:-]*)([\\s\\S]*?)(&gt;)$/);\n if (!match) return `<span class=\"k2b-template-tag\">${tag}</span>`;\n const attrs = (match[3] ?? \"\").replace(\n /([\\w:-]+)(=)(&quot;[\\s\\S]*?&quot;|'[\\s\\S]*?'|[^\\s&]+)/g,\n '<span class=\"k2b-template-attribute\">$1</span><span class=\"k2b-template-punctuation\">$2</span><span class=\"k2b-template-string\">$3</span>',\n );\n return `<span class=\"k2b-template-punctuation\">${match[1]}</span><span class=\"k2b-template-tag\">${match[2]}</span>${attrs}<span class=\"k2b-template-punctuation\">${match[4]}</span>`;\n};\n\nconst highlightTemplate = (text: string): string => {\n const stashed: string[] = [];\n const escaped = escapeHtml(text).replace(/{{[\\s\\S]*?}}|{%[\\s\\S]*?%}/g, (token) => {\n const marker = `\\uE000${stashed.length}\\uE001`;\n stashed.push(highlightLiquidToken(token));\n return marker;\n });\n const withTags = escaped.replace(/&lt;!--[\\s\\S]*?--&gt;|&lt;\\/?[a-zA-Z][\\s\\S]*?&gt;/g, (tag) =>\n tag.startsWith(\"&lt;!--\") ? `<span class=\"k2b-template-comment\">${tag}</span>` : highlightTag(tag),\n );\n return withTags.replace(/\\uE000(\\d+)\\uE001/g, (_, index) => stashed[Number(index)] ?? \"\");\n};\n\nexport function TemplateEditor(props: TemplateEditorProps): JSX.Element {\n const messages = useUiMessages();\n const completions = createMemo(() => templateCompletions(props.variables));\n return (\n <AutocompleteEditor\n {...props}\n lines={props.lines ?? 22}\n spellcheck={props.spellcheck ?? false}\n placeholder={props.placeholder ?? messages().templateEditorPlaceholder}\n highlight={highlightTemplate}\n completions={completions()}\n />\n );\n}\n\nexport function TemplatePreview(props: TemplatePreviewProps): JSX.Element {\n const messages = useUiMessages();\n return (\n <section class={`k2b-template-preview ${props.class ?? \"\"}`}>\n <iframe sandbox=\"\" srcdoc={props.html} title={props.title ?? messages().templatePreview} />\n </section>\n );\n}\n\nexport function TemplateSampleData(props: TemplateSampleDataProps): JSX.Element {\n return (\n <section class={`k2b-template-sample ${props.class ?? \"\"}`}>\n <For each={props.variables}>\n {(variable) => (\n <TextInput\n label={`{{ ${variable.name} }}`}\n description={variable.description}\n value={props.values[variable.name] ?? \"\"}\n onValueChange={(value) => props.onValueChange(variable.name, value)}\n />\n )}\n </For>\n </section>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["inputs/TemplateEditor.tsx"],"sourcesContent":["import { createMemo, For, type JSX } from \"solid-js\";\nimport { PANES_LAYOUT_VERSION, type PanesLayout } from \"../layout/panes-layout\";\nimport { AutocompleteEditor, type AutocompleteEditorProps } from \"./AutocompleteEditor\";\nimport type { Completion, Suggestion } from \"./completion\";\nimport { TextInput } from \"./TextInput\";\nimport { useTemplateMessages } from \"./template-messages\";\n\nexport type TemplateVariableKind = \"string\" | \"email\" | \"url\" | \"number\" | \"boolean\" | \"array\" | \"object\";\n\nexport type TemplateVariable = {\n name: string;\n kind?: TemplateVariableKind;\n description?: string;\n};\n\nexport type TemplateEditorProps = Omit<AutocompleteEditorProps, \"completions\" | \"highlight\"> & {\n variables: readonly TemplateVariable[];\n};\n\nexport type TemplatePreviewProps = {\n html: string;\n title?: string;\n class?: string;\n};\n\nexport type TemplateSampleDataProps = {\n variables: readonly TemplateVariable[];\n values: Readonly<Record<string, string>>;\n onValueChange: (name: string, value: string) => void;\n class?: string;\n};\n\nexport type TemplateEditorLayout = PanesLayout;\n\nexport const createTemplateEditorPanesLayout = (): TemplateEditorLayout => ({\n version: PANES_LAYOUT_VERSION,\n root: {\n type: \"split\",\n direction: \"horizontal\",\n ratio: 0.5,\n first: { type: \"group\", items: [\"html\"], active: \"html\" },\n second: { type: \"group\", items: [\"preview\", \"sample-data\"], active: \"preview\" },\n },\n});\n\nconst HTML_TAGS = [\n { name: \"p\", snippet: \"<p></p>\", hint: \"paragraph\" },\n {\n name: \"a\",\n snippet: '<a href=\"{{ LOGIN_URL }}\">Link</a>',\n hint: \"link\",\n },\n { name: \"strong\", snippet: \"<strong></strong>\", hint: \"bold\" },\n { name: \"em\", snippet: \"<em></em>\", hint: \"emphasis\" },\n { name: \"br\", snippet: \"<br>\", hint: \"line break\" },\n { name: \"ul\", snippet: \"<ul>\\n <li></li>\\n</ul>\", hint: \"list\" },\n {\n name: \"table\",\n snippet: \"<table>\\n <tr><td></td></tr>\\n</table>\",\n hint: \"table\",\n },\n] as const;\n\nconst suggestion = (text: string, hint: string, label?: string): Suggestion => ({ text, hint, label, appendSpace: false });\n\nconst templateCompletions = (variables: readonly TemplateVariable[]): Completion[] => [\n {\n trigger: \"{\",\n dropdown: true,\n allowAfterWord: true,\n suggest: (query, context) => {\n const normalized = query.toLowerCase();\n const leadingBrace = context.tokenStart > 0 && context.fullText[context.tokenStart - 1] === \"{\";\n const open = leadingBrace ? \"{ \" : \"{{ \";\n const close = leadingBrace ? \" }}\" : \" }}\";\n const values = variables\n .filter((variable) => variable.name.toLowerCase().startsWith(normalized))\n .map((variable) => suggestion(`${open}${variable.name}${close}`, variable.kind ?? \"string\", variable.name));\n const conditions = variables\n .filter((variable) => variable.kind !== \"array\")\n .filter((variable) => variable.name.toLowerCase().startsWith(normalized))\n .map((variable) => suggestion(`{% if ${variable.name} != blank %}\\n \\n{% endif %}`, \"condition\", `if ${variable.name}`));\n const loops = variables\n .filter((variable) => variable.kind === \"array\")\n .filter((variable) => variable.name.toLowerCase().startsWith(normalized))\n .map((variable) => suggestion(`{% for item in ${variable.name} %}\\n {{ item }}\\n{% endfor %}`, \"loop\", `for ${variable.name}`));\n return [...values, ...conditions, ...loops];\n },\n },\n {\n trigger: \"%\",\n dropdown: true,\n allowAfterWord: true,\n suggest: (query) => {\n const normalized = query.toLowerCase();\n const conditions = variables\n .filter((variable) => variable.kind !== \"array\")\n .filter((variable) => variable.name.toLowerCase().startsWith(normalized))\n .map((variable) => suggestion(`% if ${variable.name} != blank %}\\n \\n{% endif %}`, \"condition\", `if ${variable.name}`));\n const loops = variables\n .filter((variable) => variable.kind === \"array\")\n .filter((variable) => variable.name.toLowerCase().startsWith(normalized))\n .map((variable) => suggestion(`% for item in ${variable.name} %}\\n {{ item }}\\n{% endfor %}`, \"loop\", `for ${variable.name}`));\n return [...conditions, ...loops];\n },\n },\n {\n trigger: \"<\",\n dropdown: true,\n allowAfterWord: true,\n suggest: (query) => {\n const normalized = query.toLowerCase();\n return HTML_TAGS.filter((tag) => tag.name.startsWith(normalized)).map((tag) => suggestion(tag.snippet, tag.hint, tag.name));\n },\n },\n];\n\nconst escapeHtml = (value: string): string =>\n value.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\").replace(/\"/g, \"&quot;\");\n\nconst highlightLiquidToken = (token: string): string => {\n const inner = token.replace(/^\\{\\{|\\}\\}$|^\\{%|\\%}$/g, \"\").trim();\n const keyword = inner.split(/\\s+/)[0] ?? \"\";\n const kind = token.startsWith(\"{%\") ? (keyword.startsWith(\"end\") ? \"end\" : \"control\") : inner.includes(\"| raw\") ? \"raw\" : \"value\";\n return `<span class=\"k2b-template-token\" data-kind=\"${kind}\">${escapeHtml(token)}</span>`;\n};\n\nconst highlightTag = (tag: string): string => {\n const match = tag.match(/^(&lt;\\/?)([a-zA-Z][\\w:-]*)([\\s\\S]*?)(&gt;)$/);\n if (!match) return `<span class=\"k2b-template-tag\">${tag}</span>`;\n const attrs = (match[3] ?? \"\").replace(\n /([\\w:-]+)(=)(&quot;[\\s\\S]*?&quot;|'[\\s\\S]*?'|[^\\s&]+)/g,\n '<span class=\"k2b-template-attribute\">$1</span><span class=\"k2b-template-punctuation\">$2</span><span class=\"k2b-template-string\">$3</span>',\n );\n return `<span class=\"k2b-template-punctuation\">${match[1]}</span><span class=\"k2b-template-tag\">${match[2]}</span>${attrs}<span class=\"k2b-template-punctuation\">${match[4]}</span>`;\n};\n\nconst highlightTemplate = (text: string): string => {\n const stashed: string[] = [];\n const escaped = escapeHtml(text).replace(/{{[\\s\\S]*?}}|{%[\\s\\S]*?%}/g, (token) => {\n const marker = `\\uE000${stashed.length}\\uE001`;\n stashed.push(highlightLiquidToken(token));\n return marker;\n });\n const withTags = escaped.replace(/&lt;!--[\\s\\S]*?--&gt;|&lt;\\/?[a-zA-Z][\\s\\S]*?&gt;/g, (tag) =>\n tag.startsWith(\"&lt;!--\") ? `<span class=\"k2b-template-comment\">${tag}</span>` : highlightTag(tag),\n );\n return withTags.replace(/\\uE000(\\d+)\\uE001/g, (_, index) => stashed[Number(index)] ?? \"\");\n};\n\nexport function TemplateEditor(props: TemplateEditorProps): JSX.Element {\n const templateMessages = useTemplateMessages();\n const completions = createMemo(() => templateCompletions(props.variables));\n return (\n <AutocompleteEditor\n {...props}\n lines={props.lines ?? 22}\n spellcheck={props.spellcheck ?? false}\n placeholder={props.placeholder ?? templateMessages().templateEditorPlaceholder}\n highlight={highlightTemplate}\n completions={completions()}\n />\n );\n}\n\nexport function TemplatePreview(props: TemplatePreviewProps): JSX.Element {\n const templateMessages = useTemplateMessages();\n return (\n <section class={`k2b-template-preview ${props.class ?? \"\"}`}>\n <iframe sandbox=\"\" srcdoc={props.html} title={props.title ?? templateMessages().templatePreview} />\n </section>\n );\n}\n\nexport function TemplateSampleData(props: TemplateSampleDataProps): JSX.Element {\n return (\n <section class={`k2b-template-sample ${props.class ?? \"\"}`}>\n <For each={props.variables}>\n {(variable) => (\n <TextInput\n label={`{{ ${variable.name} }}`}\n description={variable.description}\n value={props.values[variable.name] ?? \"\"}\n onValueChange={(value) => props.onValueChange(variable.name, value)}\n />\n )}\n </For>\n </section>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -14,9 +14,11 @@ import { createSignal, Show, splitProps } from "solid-js";
14
14
  import { createFieldMeta, Field, fieldControlAria } from "../internal/field";
15
15
  import { useUiMessages } from "../intl/messages";
16
16
  import { commitFieldValue, resolveMaybeAccessor } from "./field-contract";
17
+ import { useInputMessages } from "./input-messages";
17
18
  import { MarkdownEditor } from "./markdown/MarkdownEditor";
18
19
  export function TextInput(props) {
19
20
  const messages = useUiMessages();
21
+ const inputMessages = useInputMessages();
20
22
  const [local, rest] = splitProps(props, ["activeIcon", "aria-describedby", "aria-label", "class", "clearLabel", "clearable", "completions", "description", "error", "icon", "id", "label", "lines", "markdown", "minLength", "maxLength", "monospace", "multiline", "onClear", "onValueCommit", "onSubmit", "onValueChange", "password", "prefix", "required", "suffix", "type", "value", "variant", "abbreviations"]);
21
23
  const meta = createFieldMeta(local.id);
22
24
  const value = () => resolveMaybeAccessor(local.value) ?? "";
@@ -151,7 +153,7 @@ export function TextInput(props) {
151
153
  return _$memo(() => !!local.password)() && !multiline();
152
154
  },
153
155
  get children() {
154
- return _$ssr(_tmpl$3, _$ssrAttribute("aria-label", passwordVisible() ? _$escape(messages().hidePassword, true) : _$escape(messages().showPassword, true), false) + _$ssrAttribute("aria-pressed", _$escape(passwordVisible(), true), false), _$ssrAttribute("disabled", rest.disabled, true), _$ssrAttribute("class", passwordVisible() ? "ti ti-eye-off" : "ti ti-eye", false));
156
+ return _$ssr(_tmpl$3, _$ssrAttribute("aria-label", passwordVisible() ? _$escape(inputMessages().hidePassword, true) : _$escape(inputMessages().showPassword, true), false) + _$ssrAttribute("aria-pressed", _$escape(passwordVisible(), true), false), _$ssrAttribute("disabled", rest.disabled, true), _$ssrAttribute("class", passwordVisible() ? "ti ti-eye-off" : "ti ti-eye", false));
155
157
  }
156
158
  })));
157
159
  }
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["inputs/TextInput.tsx"],"sourcesContent":["import { createSignal, type JSX, Show, splitProps } from \"solid-js\";\nimport { createFieldMeta, Field, fieldControlAria } from \"../internal/field\";\nimport { useUiMessages } from \"../intl/messages\";\nimport type { Completion } from \"./completion\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { commitFieldValue, resolveMaybeAccessor } from \"./field-contract\";\nimport { MarkdownEditor } from \"./markdown/MarkdownEditor\";\n\nexport type TextInputProps = Omit<\n JSX.InputHTMLAttributes<HTMLInputElement>,\n \"onChange\" | \"onInput\" | \"prefix\" | \"suffix\" | \"type\" | \"value\" | keyof ValueFieldProps<string>\n> &\n ValueFieldProps<string> & {\n minLength?: number;\n maxLength?: number;\n type?: \"text\" | \"search\" | \"email\" | \"url\" | \"tel\";\n variant?: \"default\" | \"ai\";\n icon?: string;\n activeIcon?: string;\n prefix?: JSX.Element;\n suffix?: JSX.Element;\n clearable?: boolean;\n onClear?: () => void;\n clearLabel?: string;\n multiline?: boolean;\n monospace?: boolean;\n password?: boolean;\n markdown?: boolean;\n onSubmit?: () => void;\n lines?: number;\n abbreviations?: Record<string, string>;\n completions?: readonly Completion[];\n };\n\nexport function TextInput(props: TextInputProps): JSX.Element {\n const messages = useUiMessages();\n const [local, rest] = splitProps(props, [\n \"activeIcon\",\n \"aria-describedby\",\n \"aria-label\",\n \"class\",\n \"clearLabel\",\n \"clearable\",\n \"completions\",\n \"description\",\n \"error\",\n \"icon\",\n \"id\",\n \"label\",\n \"lines\",\n \"markdown\",\n \"minLength\",\n \"maxLength\",\n \"monospace\",\n \"multiline\",\n \"onClear\",\n \"onValueCommit\",\n \"onSubmit\",\n \"onValueChange\",\n \"password\",\n \"prefix\",\n \"required\",\n \"suffix\",\n \"type\",\n \"value\",\n \"variant\",\n \"abbreviations\",\n ]);\n const meta = createFieldMeta(local.id);\n const value = () => resolveMaybeAccessor(local.value) ?? \"\";\n const error = () => resolveMaybeAccessor(local.error);\n const [passwordVisible, setPasswordVisible] = createSignal(false);\n const multiline = () => Boolean(local.multiline || local.markdown);\n const icon = () => local.icon ?? (local.variant === \"ai\" ? \"ti ti-sparkles\" : local.markdown ? \"ti ti-markdown\" : \"ti ti-cursor-text\");\n // A custom icon stays while typing (a search field keeps its magnifier); only the default icon switches to the pencil.\n const activeIcon = () => local.activeIcon ?? local.icon ?? (local.variant === \"ai\" ? \"ti ti-sparkles\" : \"ti ti-pencil\");\n // Names, addresses and passwords are typed exactly: phone keyboards must not capitalize or \"correct\" them.\n const verbatim = () =>\n local.password || local.type === \"email\" || local.type === \"url\" || /\\b(username|email|url)\\b/.test(String(rest.autocomplete ?? \"\"));\n const input = (next: string) => local.onValueChange?.(next);\n const commit = (next: string) => local.onValueCommit?.(next);\n const clear = () => {\n if (local.onClear) {\n local.onClear();\n return;\n }\n commitFieldValue(local, \"\");\n };\n\n return (\n <Show\n when={local.markdown}\n fallback={\n <Field\n class={local.class}\n label={local.label}\n description={local.description}\n error={error()}\n meta={meta}\n required={local.required}\n disabled={rest.disabled}\n >\n <div\n class=\"k2b-input-shell k2b-text-input\"\n data-invalid={error() ? \"true\" : undefined}\n data-ai={local.variant === \"ai\" ? \"true\" : undefined}\n data-multiline={multiline() ? \"true\" : undefined}\n data-monospace={local.monospace ? \"true\" : undefined}\n style={multiline() ? { \"--k2b-editor-lines\": String(local.lines ?? 3) } : undefined}\n >\n <span class=\"k2b-input-shell__icon k2b-text-input__icon\" aria-hidden=\"true\">\n <i class={icon()} />\n <i class={activeIcon()} />\n </span>\n <Show when={local.prefix}>\n <span class=\"k2b-input-shell__affix\">{local.prefix}</span>\n </Show>\n <Show\n when={multiline()}\n fallback={\n <input\n autocapitalize={verbatim() ? \"none\" : undefined}\n autocorrect={verbatim() ? \"off\" : undefined}\n spellcheck={verbatim() ? false : undefined}\n {...rest}\n id={meta.controlId}\n class=\"k2b-input\"\n type={local.password && !passwordVisible() ? \"password\" : (local.type ?? \"text\")}\n value={value()}\n minlength={local.minLength}\n maxlength={local.maxLength}\n required={local.required}\n {...fieldControlAria(meta, local)}\n onInput={(event) => {\n input(event.currentTarget.value);\n }}\n onChange={(event) => commit(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (local.onSubmit && event.key === \"Enter\" && !event.shiftKey && !event.metaKey) {\n event.preventDefault();\n local.onSubmit();\n }\n }}\n />\n }\n >\n <textarea\n {...(rest as unknown as JSX.TextareaHTMLAttributes<HTMLTextAreaElement>)}\n id={meta.controlId}\n class=\"k2b-input k2b-text-input__textarea\"\n value={value()}\n rows={local.lines ?? 3}\n required={local.required}\n minlength={local.minLength}\n maxlength={local.maxLength}\n {...fieldControlAria(meta, local)}\n onInput={(event) => {\n input(event.currentTarget.value);\n }}\n onChange={(event) => commit(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (local.onSubmit && event.key === \"Enter\" && !event.shiftKey && !event.metaKey) {\n event.preventDefault();\n local.onSubmit();\n }\n }}\n />\n </Show>\n <Show when={local.suffix}>\n <span class=\"k2b-input-shell__affix\">{local.suffix}</span>\n </Show>\n <Show when={local.clearable && value() && !multiline() && !local.password && !rest.disabled && !rest.readOnly}>\n <button\n type=\"button\"\n class=\"k2b-input-shell__clear k2b-input-clear-action\"\n aria-label={local.clearLabel ?? messages().clear}\n onClick={clear}\n >\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </button>\n </Show>\n <Show when={local.password && !multiline()}>\n <button\n type=\"button\"\n class=\"k2b-input-shell__clear\"\n aria-label={passwordVisible() ? messages().hidePassword : messages().showPassword}\n aria-pressed={passwordVisible()}\n disabled={rest.disabled}\n onClick={() => setPasswordVisible((visible) => !visible)}\n >\n <i class={passwordVisible() ? \"ti ti-eye-off\" : \"ti ti-eye\"} aria-hidden=\"true\" />\n </button>\n </Show>\n </div>\n </Field>\n }\n >\n <MarkdownEditor\n class={local.class}\n label={local.label}\n description={local.description}\n error={error()}\n id={meta.controlId}\n name={rest.name}\n value={value()}\n onValueChange={input}\n onValueCommit={local.onValueCommit}\n onSubmit={local.onSubmit}\n placeholder={rest.placeholder}\n disabled={rest.disabled}\n required={local.required}\n lines={local.lines}\n maxLength={local.maxLength}\n spellcheck={rest.spellcheck === undefined ? undefined : rest.spellcheck === true || rest.spellcheck === \"true\"}\n abbreviations={local.abbreviations}\n completions={local.completions}\n aria-label={local[\"aria-label\"]}\n aria-describedby={local[\"aria-describedby\"]}\n />\n </Show>\n );\n}\n\nexport default TextInput;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["inputs/TextInput.tsx"],"sourcesContent":["import { createSignal, type JSX, Show, splitProps } from \"solid-js\";\nimport { createFieldMeta, Field, fieldControlAria } from \"../internal/field\";\nimport { useUiMessages } from \"../intl/messages\";\nimport type { Completion } from \"./completion\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { commitFieldValue, resolveMaybeAccessor } from \"./field-contract\";\nimport { useInputMessages } from \"./input-messages\";\nimport { MarkdownEditor } from \"./markdown/MarkdownEditor\";\n\nexport type TextInputProps = Omit<\n JSX.InputHTMLAttributes<HTMLInputElement>,\n \"onChange\" | \"onInput\" | \"prefix\" | \"suffix\" | \"type\" | \"value\" | keyof ValueFieldProps<string>\n> &\n ValueFieldProps<string> & {\n minLength?: number;\n maxLength?: number;\n type?: \"text\" | \"search\" | \"email\" | \"url\" | \"tel\";\n variant?: \"default\" | \"ai\";\n icon?: string;\n activeIcon?: string;\n prefix?: JSX.Element;\n suffix?: JSX.Element;\n clearable?: boolean;\n onClear?: () => void;\n clearLabel?: string;\n multiline?: boolean;\n monospace?: boolean;\n password?: boolean;\n markdown?: boolean;\n onSubmit?: () => void;\n lines?: number;\n abbreviations?: Record<string, string>;\n completions?: readonly Completion[];\n };\n\nexport function TextInput(props: TextInputProps): JSX.Element {\n const messages = useUiMessages();\n const inputMessages = useInputMessages();\n const [local, rest] = splitProps(props, [\n \"activeIcon\",\n \"aria-describedby\",\n \"aria-label\",\n \"class\",\n \"clearLabel\",\n \"clearable\",\n \"completions\",\n \"description\",\n \"error\",\n \"icon\",\n \"id\",\n \"label\",\n \"lines\",\n \"markdown\",\n \"minLength\",\n \"maxLength\",\n \"monospace\",\n \"multiline\",\n \"onClear\",\n \"onValueCommit\",\n \"onSubmit\",\n \"onValueChange\",\n \"password\",\n \"prefix\",\n \"required\",\n \"suffix\",\n \"type\",\n \"value\",\n \"variant\",\n \"abbreviations\",\n ]);\n const meta = createFieldMeta(local.id);\n const value = () => resolveMaybeAccessor(local.value) ?? \"\";\n const error = () => resolveMaybeAccessor(local.error);\n const [passwordVisible, setPasswordVisible] = createSignal(false);\n const multiline = () => Boolean(local.multiline || local.markdown);\n const icon = () => local.icon ?? (local.variant === \"ai\" ? \"ti ti-sparkles\" : local.markdown ? \"ti ti-markdown\" : \"ti ti-cursor-text\");\n // A custom icon stays while typing (a search field keeps its magnifier); only the default icon switches to the pencil.\n const activeIcon = () => local.activeIcon ?? local.icon ?? (local.variant === \"ai\" ? \"ti ti-sparkles\" : \"ti ti-pencil\");\n // Names, addresses and passwords are typed exactly: phone keyboards must not capitalize or \"correct\" them.\n const verbatim = () =>\n local.password || local.type === \"email\" || local.type === \"url\" || /\\b(username|email|url)\\b/.test(String(rest.autocomplete ?? \"\"));\n const input = (next: string) => local.onValueChange?.(next);\n const commit = (next: string) => local.onValueCommit?.(next);\n const clear = () => {\n if (local.onClear) {\n local.onClear();\n return;\n }\n commitFieldValue(local, \"\");\n };\n\n return (\n <Show\n when={local.markdown}\n fallback={\n <Field\n class={local.class}\n label={local.label}\n description={local.description}\n error={error()}\n meta={meta}\n required={local.required}\n disabled={rest.disabled}\n >\n <div\n class=\"k2b-input-shell k2b-text-input\"\n data-invalid={error() ? \"true\" : undefined}\n data-ai={local.variant === \"ai\" ? \"true\" : undefined}\n data-multiline={multiline() ? \"true\" : undefined}\n data-monospace={local.monospace ? \"true\" : undefined}\n style={multiline() ? { \"--k2b-editor-lines\": String(local.lines ?? 3) } : undefined}\n >\n <span class=\"k2b-input-shell__icon k2b-text-input__icon\" aria-hidden=\"true\">\n <i class={icon()} />\n <i class={activeIcon()} />\n </span>\n <Show when={local.prefix}>\n <span class=\"k2b-input-shell__affix\">{local.prefix}</span>\n </Show>\n <Show\n when={multiline()}\n fallback={\n <input\n autocapitalize={verbatim() ? \"none\" : undefined}\n autocorrect={verbatim() ? \"off\" : undefined}\n spellcheck={verbatim() ? false : undefined}\n {...rest}\n id={meta.controlId}\n class=\"k2b-input\"\n type={local.password && !passwordVisible() ? \"password\" : (local.type ?? \"text\")}\n value={value()}\n minlength={local.minLength}\n maxlength={local.maxLength}\n required={local.required}\n {...fieldControlAria(meta, local)}\n onInput={(event) => {\n input(event.currentTarget.value);\n }}\n onChange={(event) => commit(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (local.onSubmit && event.key === \"Enter\" && !event.shiftKey && !event.metaKey) {\n event.preventDefault();\n local.onSubmit();\n }\n }}\n />\n }\n >\n <textarea\n {...(rest as unknown as JSX.TextareaHTMLAttributes<HTMLTextAreaElement>)}\n id={meta.controlId}\n class=\"k2b-input k2b-text-input__textarea\"\n value={value()}\n rows={local.lines ?? 3}\n required={local.required}\n minlength={local.minLength}\n maxlength={local.maxLength}\n {...fieldControlAria(meta, local)}\n onInput={(event) => {\n input(event.currentTarget.value);\n }}\n onChange={(event) => commit(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (local.onSubmit && event.key === \"Enter\" && !event.shiftKey && !event.metaKey) {\n event.preventDefault();\n local.onSubmit();\n }\n }}\n />\n </Show>\n <Show when={local.suffix}>\n <span class=\"k2b-input-shell__affix\">{local.suffix}</span>\n </Show>\n <Show when={local.clearable && value() && !multiline() && !local.password && !rest.disabled && !rest.readOnly}>\n <button\n type=\"button\"\n class=\"k2b-input-shell__clear k2b-input-clear-action\"\n aria-label={local.clearLabel ?? messages().clear}\n onClick={clear}\n >\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </button>\n </Show>\n <Show when={local.password && !multiline()}>\n <button\n type=\"button\"\n class=\"k2b-input-shell__clear\"\n aria-label={passwordVisible() ? inputMessages().hidePassword : inputMessages().showPassword}\n aria-pressed={passwordVisible()}\n disabled={rest.disabled}\n onClick={() => setPasswordVisible((visible) => !visible)}\n >\n <i class={passwordVisible() ? \"ti ti-eye-off\" : \"ti ti-eye\"} aria-hidden=\"true\" />\n </button>\n </Show>\n </div>\n </Field>\n }\n >\n <MarkdownEditor\n class={local.class}\n label={local.label}\n description={local.description}\n error={error()}\n id={meta.controlId}\n name={rest.name}\n value={value()}\n onValueChange={input}\n onValueCommit={local.onValueCommit}\n onSubmit={local.onSubmit}\n placeholder={rest.placeholder}\n disabled={rest.disabled}\n required={local.required}\n lines={local.lines}\n maxLength={local.maxLength}\n spellcheck={rest.spellcheck === undefined ? undefined : rest.spellcheck === true || rest.spellcheck === \"true\"}\n abbreviations={local.abbreviations}\n completions={local.completions}\n aria-label={local[\"aria-label\"]}\n aria-describedby={local[\"aria-describedby\"]}\n />\n </Show>\n );\n}\n\nexport default TextInput;\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,24 @@
1
+ import { i18n } from "@k2b/stdlib";
2
+ import { useLocale } from "../intl/locale";
3
+ const completionMessages = i18n.define({
4
+ baseLocale: "en",
5
+ messages: {
6
+ en: {
7
+ suggestions: "Suggestions",
8
+ suggestionsCouldNotLoad: "Suggestions could not be loaded",
9
+ completionSuggestions: "Completion suggestions"
10
+ },
11
+ de: {
12
+ suggestions: "Vorschläge",
13
+ suggestionsCouldNotLoad: "Vorschläge konnten nicht geladen werden",
14
+ completionSuggestions: "Vervollständigungsvorschläge"
15
+ }
16
+ }
17
+ });
18
+ /** Resolved from the inherited render locale. */
19
+ export const useCompletionMessages = () => {
20
+ const locale = useLocale();
21
+ return () => completionMessages.resolve([locale()]).t;
22
+ };
23
+ export const checkCompletionMessages = () => completionMessages.check();
24
+ //# sourceMappingURL=completion-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["inputs/completion-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\nconst completionMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n suggestions: \"Suggestions\",\n suggestionsCouldNotLoad: \"Suggestions could not be loaded\",\n completionSuggestions: \"Completion suggestions\",\n },\n de: {\n suggestions: \"Vorschläge\",\n suggestionsCouldNotLoad: \"Vorschläge konnten nicht geladen werden\",\n completionSuggestions: \"Vervollständigungsvorschläge\",\n },\n },\n});\n\nexport type CompletionMessages = ReturnType<(typeof completionMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from the inherited render locale. */\nexport const useCompletionMessages = (): (() => CompletionMessages) => {\n const locale = useLocale();\n return () => completionMessages.resolve([locale()]).t;\n};\n\nexport const checkCompletionMessages = () => completionMessages.check();\n"],"mappings":"AAAA,SAAS,IAAI,QAAQ,aAAa;AAClC,SAAS,SAAS,QAAQ,gBAAgB;AAE1C,MAAM,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC;EACrC,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE;IACR,EAAE,EAAE;MACF,WAAW,EAAE,aAAa;MAC1B,uBAAuB,EAAE,iCAAiC;MAC1D,qBAAqB,EAAE;IACzB,CAAC;IACD,EAAE,EAAE;MACF,WAAW,EAAE,YAAY;MACzB,uBAAuB,EAAE,yCAAyC;MAClE,qBAAqB,EAAE;IACzB;EACF;AACF,CAAC,CAAC;AAIF;AACA,OAAO,MAAM,qBAAqB,GAAG,MAAkC;EACrE,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,OAAO,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,OAAO,MAAM,uBAAuB,GAAG,MAAM,kBAAkB,CAAC,KAAK,CAAC,CAAC","ignoreList":[]}
@@ -44,6 +44,30 @@ export const monthDate = (year, month, context) => {
44
44
  }
45
45
  return new Date(year, month, 1, 12);
46
46
  };
47
+
48
+ /**
49
+ * Milliseconds from `now` until the next calendar day starts in the picker's
50
+ * time zone, so a panel left open past midnight moves its today mark on time.
51
+ * The next day's start is resolved from its date key: where a DST change skips
52
+ * or repeats midnight, the day starts at its first existing instant.
53
+ */
54
+ export const msUntilNextDay = (now, context) => {
55
+ const merged = pickerContext(context);
56
+ const {
57
+ timeZone
58
+ } = merged;
59
+ const next = timeZone ? Date.parse(dates.zonedDateTimeToInstant(dates.addZoned(`${dateKey(now, merged)}T00:00`, {
60
+ timeZone,
61
+ days: 1
62
+ }), timeZone, {
63
+ disambiguation: "compatible"
64
+ })) : dates.addDays(now, 1, merged).getTime();
65
+ const delay = next - now.getTime();
66
+ // The timer re-arms after every tick, so it must never fire at once. Should a
67
+ // zone's rules still put the next day behind `now`, look again in a minute,
68
+ // the finest unit the pickers show.
69
+ return delay > 0 ? delay : 60_000;
70
+ };
47
71
  export const parseDateValue = (value, context) => {
48
72
  if (!value) return dates.today(pickerContext(context));
49
73
  return dates.parseCalendarDate(value.slice(0, 10), pickerContext(context));