@k2b/ui 0.21.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 (563) hide show
  1. package/dist/browser/actions/ContextMenu.js +3 -1
  2. package/dist/browser/actions/ContextMenu.js.map +1 -1
  3. package/dist/browser/actions/FilterChip.js +3 -1
  4. package/dist/browser/actions/FilterChip.js.map +1 -1
  5. package/dist/browser/actions/SpotlightSearch.js +3 -1
  6. package/dist/browser/actions/SpotlightSearch.js.map +1 -1
  7. package/dist/browser/actions/filter-messages.js +20 -0
  8. package/dist/browser/actions/filter-messages.js.map +1 -0
  9. package/dist/browser/actions/spotlight-messages.js +16 -0
  10. package/dist/browser/actions/spotlight-messages.js.map +1 -0
  11. package/dist/browser/chat/ChatComposer.js +47 -41
  12. package/dist/browser/chat/ChatComposer.js.map +1 -1
  13. package/dist/browser/chat/ChatPrimitives.js +25 -23
  14. package/dist/browser/chat/ChatPrimitives.js.map +1 -1
  15. package/dist/browser/chat/ChatRoot.js +3 -3
  16. package/dist/browser/chat/ChatRoot.js.map +1 -1
  17. package/dist/browser/chat/ChatTimeline.js +12 -12
  18. package/dist/browser/chat/ChatTimeline.js.map +1 -1
  19. package/dist/browser/chat/chat-messages.js +236 -0
  20. package/dist/browser/chat/chat-messages.js.map +1 -0
  21. package/dist/browser/content/Calendar.js +18 -19
  22. package/dist/browser/content/Calendar.js.map +1 -1
  23. package/dist/browser/content/Chart.js +15 -8
  24. package/dist/browser/content/Chart.js.map +1 -1
  25. package/dist/browser/content/ChartExplorer.js +20 -12
  26. package/dist/browser/content/ChartExplorer.js.map +1 -1
  27. package/dist/browser/content/ChartExplorerControls.js +9 -7
  28. package/dist/browser/content/ChartExplorerControls.js.map +1 -1
  29. package/dist/browser/content/ChartFilterControls.js +4 -2
  30. package/dist/browser/content/ChartFilterControls.js.map +1 -1
  31. package/dist/browser/content/ChartSnapshotView.js +3 -3
  32. package/dist/browser/content/ChartSnapshotView.js.map +1 -1
  33. package/dist/browser/content/DataTable.js +68 -59
  34. package/dist/browser/content/DataTable.js.map +1 -1
  35. package/dist/browser/content/Docs.js +3 -1
  36. package/dist/browser/content/Docs.js.map +1 -1
  37. package/dist/browser/content/FileBrowser.js +30 -26
  38. package/dist/browser/content/FileBrowser.js.map +1 -1
  39. package/dist/browser/content/FileTree.js +9 -7
  40. package/dist/browser/content/FileTree.js.map +1 -1
  41. package/dist/browser/content/FileView.js +37 -28
  42. package/dist/browser/content/FileView.js.map +1 -1
  43. package/dist/browser/content/Lightbox.js +9 -7
  44. package/dist/browser/content/Lightbox.js.map +1 -1
  45. package/dist/browser/content/LogEntriesTable.js +3 -3
  46. package/dist/browser/content/LogEntriesTable.js.map +1 -1
  47. package/dist/browser/content/MessageRow.js +24 -22
  48. package/dist/browser/content/MessageRow.js.map +1 -1
  49. package/dist/browser/content/Pagination.js +7 -7
  50. package/dist/browser/content/Pagination.js.map +1 -1
  51. package/dist/browser/content/PdfPreview.js +15 -13
  52. package/dist/browser/content/PdfPreview.js.map +1 -1
  53. package/dist/browser/content/RangePicker.js +3 -1
  54. package/dist/browser/content/RangePicker.js.map +1 -1
  55. package/dist/browser/content/StructuredDataPreview.js +3 -1
  56. package/dist/browser/content/StructuredDataPreview.js.map +1 -1
  57. package/dist/browser/content/Timeline.js +13 -11
  58. package/dist/browser/content/Timeline.js.map +1 -1
  59. package/dist/browser/content/VideoPlayer.js +5 -5
  60. package/dist/browser/content/VideoPlayer.js.map +1 -1
  61. package/dist/browser/content/VirtualFeed.js +6 -4
  62. package/dist/browser/content/VirtualFeed.js.map +1 -1
  63. package/dist/browser/content/ZoomPanViewport.js +10 -7
  64. package/dist/browser/content/ZoomPanViewport.js.map +1 -1
  65. package/dist/browser/content/calendar-messages.js +39 -1
  66. package/dist/browser/content/calendar-messages.js.map +1 -1
  67. package/dist/browser/content/calendar-pointer.js +4 -3
  68. package/dist/browser/content/calendar-pointer.js.map +1 -1
  69. package/dist/browser/content/chart-messages.js +136 -0
  70. package/dist/browser/content/chart-messages.js.map +1 -0
  71. package/dist/browser/content/collection-selection.js +2 -0
  72. package/dist/browser/content/collection-selection.js.map +1 -1
  73. package/dist/browser/content/data-table-messages.js +24 -0
  74. package/dist/browser/content/data-table-messages.js.map +1 -0
  75. package/dist/browser/content/docs-messages.js +24 -0
  76. package/dist/browser/content/docs-messages.js.map +1 -0
  77. package/dist/browser/content/feed-messages.js +34 -0
  78. package/dist/browser/content/feed-messages.js.map +1 -0
  79. package/dist/browser/content/file-browser-messages.js +69 -0
  80. package/dist/browser/content/file-browser-messages.js.map +1 -0
  81. package/dist/browser/content/file-view-messages.js +64 -0
  82. package/dist/browser/content/file-view-messages.js.map +1 -0
  83. package/dist/browser/content/lightbox-messages.js +36 -0
  84. package/dist/browser/content/lightbox-messages.js.map +1 -0
  85. package/dist/browser/content/log-entries-messages.js +20 -0
  86. package/dist/browser/content/log-entries-messages.js.map +1 -0
  87. package/dist/browser/content/markdown-info-block-messages.js +24 -0
  88. package/dist/browser/content/markdown-info-block-messages.js.map +1 -0
  89. package/dist/browser/content/markdown-info-blocks.js +3 -3
  90. package/dist/browser/content/markdown-info-blocks.js.map +1 -1
  91. package/dist/browser/content/markdown-links.js +2 -2
  92. package/dist/browser/content/markdown-links.js.map +1 -1
  93. package/dist/browser/content/markdown-reference-messages.js +30 -0
  94. package/dist/browser/content/markdown-reference-messages.js.map +1 -0
  95. package/dist/browser/content/pagination-messages.js +38 -0
  96. package/dist/browser/content/pagination-messages.js.map +1 -0
  97. package/dist/browser/content/pdf-messages.js +43 -0
  98. package/dist/browser/content/pdf-messages.js.map +1 -0
  99. package/dist/browser/content/range-picker-messages.js +20 -0
  100. package/dist/browser/content/range-picker-messages.js.map +1 -0
  101. package/dist/browser/content/structured-data-messages.js +22 -0
  102. package/dist/browser/content/structured-data-messages.js.map +1 -0
  103. package/dist/browser/content/timeline-messages.js +62 -0
  104. package/dist/browser/content/timeline-messages.js.map +1 -0
  105. package/dist/browser/content/video-messages.js +24 -0
  106. package/dist/browser/content/video-messages.js.map +1 -0
  107. package/dist/browser/content/viewport-messages.js +28 -0
  108. package/dist/browser/content/viewport-messages.js.map +1 -0
  109. package/dist/browser/feedback/HoverPreview.js +34 -6
  110. package/dist/browser/feedback/HoverPreview.js.map +1 -1
  111. package/dist/browser/feedback/InstallGuide.js +18 -18
  112. package/dist/browser/feedback/InstallGuide.js.map +1 -1
  113. package/dist/browser/feedback/install-messages.js +104 -0
  114. package/dist/browser/feedback/install-messages.js.map +1 -0
  115. package/dist/browser/feedback/prompt-messages.js +65 -0
  116. package/dist/browser/feedback/prompt-messages.js.map +1 -0
  117. package/dist/browser/feedback/prompts.js +14 -11
  118. package/dist/browser/feedback/prompts.js.map +1 -1
  119. package/dist/browser/feedback/toast-messages.js +18 -0
  120. package/dist/browser/feedback/toast-messages.js.map +1 -0
  121. package/dist/browser/feedback/toast.js +4 -3
  122. package/dist/browser/feedback/toast.js.map +1 -1
  123. package/dist/browser/index.js +1 -1
  124. package/dist/browser/index.js.map +1 -1
  125. package/dist/browser/inputs/AutocompleteEditor.js +6 -4
  126. package/dist/browser/inputs/AutocompleteEditor.js.map +1 -1
  127. package/dist/browser/inputs/AutocompleteSelect.js +10 -8
  128. package/dist/browser/inputs/AutocompleteSelect.js.map +1 -1
  129. package/dist/browser/inputs/ChoiceGroups.js +4 -0
  130. package/dist/browser/inputs/ChoiceGroups.js.map +1 -1
  131. package/dist/browser/inputs/ChoiceInputs.js +5 -5
  132. package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
  133. package/dist/browser/inputs/Combobox.js +3 -1
  134. package/dist/browser/inputs/Combobox.js.map +1 -1
  135. package/dist/browser/inputs/FileDropTarget.js +6 -6
  136. package/dist/browser/inputs/FileDropTarget.js.map +1 -1
  137. package/dist/browser/inputs/FileInputs.js +30 -21
  138. package/dist/browser/inputs/FileInputs.js.map +1 -1
  139. package/dist/browser/inputs/MultiSelectInput.js +7 -5
  140. package/dist/browser/inputs/MultiSelectInput.js.map +1 -1
  141. package/dist/browser/inputs/NumberInput.js +4 -2
  142. package/dist/browser/inputs/NumberInput.js.map +1 -1
  143. package/dist/browser/inputs/QrScanner.js +5 -5
  144. package/dist/browser/inputs/QrScanner.js.map +1 -1
  145. package/dist/browser/inputs/Select.js +7 -5
  146. package/dist/browser/inputs/Select.js.map +1 -1
  147. package/dist/browser/inputs/SelectChip.js +3 -3
  148. package/dist/browser/inputs/SelectChip.js.map +1 -1
  149. package/dist/browser/inputs/SignatureInput.js +9 -3
  150. package/dist/browser/inputs/SignatureInput.js.map +1 -1
  151. package/dist/browser/inputs/SpecialInputs.js +4 -2
  152. package/dist/browser/inputs/SpecialInputs.js.map +1 -1
  153. package/dist/browser/inputs/TagEditor.js +8 -6
  154. package/dist/browser/inputs/TagEditor.js.map +1 -1
  155. package/dist/browser/inputs/TagsInput.js +5 -5
  156. package/dist/browser/inputs/TagsInput.js.map +1 -1
  157. package/dist/browser/inputs/TemplateEditor.js +5 -5
  158. package/dist/browser/inputs/TemplateEditor.js.map +1 -1
  159. package/dist/browser/inputs/TextInput.js +3 -1
  160. package/dist/browser/inputs/TextInput.js.map +1 -1
  161. package/dist/browser/inputs/completion-messages.js +24 -0
  162. package/dist/browser/inputs/completion-messages.js.map +1 -0
  163. package/dist/browser/inputs/file-drop-messages.js +63 -0
  164. package/dist/browser/inputs/file-drop-messages.js.map +1 -0
  165. package/dist/browser/inputs/file-drop.js.map +1 -1
  166. package/dist/browser/inputs/file-input-messages.js +60 -0
  167. package/dist/browser/inputs/file-input-messages.js.map +1 -0
  168. package/dist/browser/inputs/icon-messages.js +22 -0
  169. package/dist/browser/inputs/icon-messages.js.map +1 -0
  170. package/dist/browser/inputs/input-messages.js +38 -0
  171. package/dist/browser/inputs/input-messages.js.map +1 -0
  172. package/dist/browser/inputs/markdown/MarkdownEditor.js +10 -6
  173. package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
  174. package/dist/browser/inputs/markdown/Toolbar.js +13 -13
  175. package/dist/browser/inputs/markdown/Toolbar.js.map +1 -1
  176. package/dist/browser/inputs/markdown/editor-messages.js +43 -0
  177. package/dist/browser/inputs/markdown/editor-messages.js.map +1 -0
  178. package/dist/browser/inputs/markdown/toolbar-messages.js +40 -0
  179. package/dist/browser/inputs/markdown/toolbar-messages.js.map +1 -0
  180. package/dist/browser/inputs/qr-messages.js +26 -0
  181. package/dist/browser/inputs/qr-messages.js.map +1 -0
  182. package/dist/browser/inputs/select-messages.js +63 -0
  183. package/dist/browser/inputs/select-messages.js.map +1 -0
  184. package/dist/browser/inputs/tag-messages.js +44 -0
  185. package/dist/browser/inputs/tag-messages.js.map +1 -0
  186. package/dist/browser/inputs/template-messages.js +22 -0
  187. package/dist/browser/inputs/template-messages.js.map +1 -0
  188. package/dist/browser/internal/render-error-messages.js +20 -0
  189. package/dist/browser/internal/render-error-messages.js.map +1 -0
  190. package/dist/browser/internal/render-error.js +3 -1
  191. package/dist/browser/internal/render-error.js.map +1 -1
  192. package/dist/browser/internal/text-selection.js +101 -0
  193. package/dist/browser/internal/text-selection.js.map +1 -0
  194. package/dist/browser/intl/messages.js +6 -1155
  195. package/dist/browser/intl/messages.js.map +1 -1
  196. package/dist/browser/layout/AppWorkspace.js +561 -418
  197. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  198. package/dist/browser/layout/BottomSheet.js +6 -1
  199. package/dist/browser/layout/BottomSheet.js.map +1 -1
  200. package/dist/browser/layout/Discussion.js +8 -5
  201. package/dist/browser/layout/Discussion.js.map +1 -1
  202. package/dist/browser/layout/FloatingWindow.js +8 -5
  203. package/dist/browser/layout/FloatingWindow.js.map +1 -1
  204. package/dist/browser/layout/Navigation.js +7 -6
  205. package/dist/browser/layout/Navigation.js.map +1 -1
  206. package/dist/browser/layout/PageTitle.js +370 -0
  207. package/dist/browser/layout/PageTitle.js.map +1 -0
  208. package/dist/browser/layout/PanelDialog.js +8 -6
  209. package/dist/browser/layout/PanelDialog.js.map +1 -1
  210. package/dist/browser/layout/Panes.js +23 -15
  211. package/dist/browser/layout/Panes.js.map +1 -1
  212. package/dist/browser/layout/PullToRefresh.js +13 -4
  213. package/dist/browser/layout/PullToRefresh.js.map +1 -1
  214. package/dist/browser/layout/Settings.js +14 -12
  215. package/dist/browser/layout/Settings.js.map +1 -1
  216. package/dist/browser/layout/SettingsCollection.js +6 -5
  217. package/dist/browser/layout/SettingsCollection.js.map +1 -1
  218. package/dist/browser/layout/SettingsModal.js +3 -1
  219. package/dist/browser/layout/SettingsModal.js.map +1 -1
  220. package/dist/browser/layout/app-workspace-controller.js +743 -12
  221. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  222. package/dist/browser/layout/app-workspace-state.js +3 -2
  223. package/dist/browser/layout/app-workspace-state.js.map +1 -1
  224. package/dist/browser/layout/floating-window-messages.js +28 -0
  225. package/dist/browser/layout/floating-window-messages.js.map +1 -0
  226. package/dist/browser/layout/index.js +2 -0
  227. package/dist/browser/layout/index.js.map +1 -1
  228. package/dist/browser/layout/navigation-model.js.map +1 -1
  229. package/dist/browser/layout/page-title-controller.js +169 -0
  230. package/dist/browser/layout/page-title-controller.js.map +1 -0
  231. package/dist/browser/layout/panel-dialog-messages.js +20 -0
  232. package/dist/browser/layout/panel-dialog-messages.js.map +1 -0
  233. package/dist/browser/layout/panes-messages.js +48 -0
  234. package/dist/browser/layout/panes-messages.js.map +1 -0
  235. package/dist/browser/layout/refresh-messages.js +20 -0
  236. package/dist/browser/layout/refresh-messages.js.map +1 -0
  237. package/dist/browser/layout/settings-messages.js +54 -0
  238. package/dist/browser/layout/settings-messages.js.map +1 -0
  239. package/dist/browser/layout/workspace-messages.js +56 -0
  240. package/dist/browser/layout/workspace-messages.js.map +1 -0
  241. package/dist/browser/surfaces/Avatar.js +5 -5
  242. package/dist/browser/surfaces/Avatar.js.map +1 -1
  243. package/dist/browser/surfaces/ResourceCard.js +4 -2
  244. package/dist/browser/surfaces/ResourceCard.js.map +1 -1
  245. package/dist/browser/surfaces/Tag.js +3 -3
  246. package/dist/browser/surfaces/Tag.js.map +1 -1
  247. package/dist/browser/surfaces/avatar-messages.js +26 -0
  248. package/dist/browser/surfaces/avatar-messages.js.map +1 -0
  249. package/dist/browser/surfaces/resource-messages.js +26 -0
  250. package/dist/browser/surfaces/resource-messages.js.map +1 -0
  251. package/dist/browser/widgets/Widget.js +6 -0
  252. package/dist/browser/widgets/Widget.js.map +1 -1
  253. package/dist/ssr/actions/ContextMenu.js.map +1 -1
  254. package/dist/ssr/actions/FilterChip.js +3 -1
  255. package/dist/ssr/actions/FilterChip.js.map +1 -1
  256. package/dist/ssr/actions/SpotlightSearch.js +3 -1
  257. package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
  258. package/dist/ssr/actions/filter-messages.js +20 -0
  259. package/dist/ssr/actions/filter-messages.js.map +1 -0
  260. package/dist/ssr/actions/spotlight-messages.js +16 -0
  261. package/dist/ssr/actions/spotlight-messages.js.map +1 -0
  262. package/dist/ssr/chat/ChatComposer.js +47 -41
  263. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  264. package/dist/ssr/chat/ChatPrimitives.js +23 -21
  265. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  266. package/dist/ssr/chat/ChatRoot.js +3 -3
  267. package/dist/ssr/chat/ChatRoot.js.map +1 -1
  268. package/dist/ssr/chat/ChatTimeline.js +11 -11
  269. package/dist/ssr/chat/ChatTimeline.js.map +1 -1
  270. package/dist/ssr/chat/chat-messages.js +236 -0
  271. package/dist/ssr/chat/chat-messages.js.map +1 -0
  272. package/dist/ssr/content/Calendar.js +18 -19
  273. package/dist/ssr/content/Calendar.js.map +1 -1
  274. package/dist/ssr/content/Chart.js +12 -5
  275. package/dist/ssr/content/Chart.js.map +1 -1
  276. package/dist/ssr/content/ChartExplorer.js +10 -8
  277. package/dist/ssr/content/ChartExplorer.js.map +1 -1
  278. package/dist/ssr/content/ChartExplorerControls.js +9 -7
  279. package/dist/ssr/content/ChartExplorerControls.js.map +1 -1
  280. package/dist/ssr/content/ChartFilterControls.js +4 -2
  281. package/dist/ssr/content/ChartFilterControls.js.map +1 -1
  282. package/dist/ssr/content/ChartSnapshotView.js +3 -3
  283. package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
  284. package/dist/ssr/content/DataTable.js +10 -4
  285. package/dist/ssr/content/DataTable.js.map +1 -1
  286. package/dist/ssr/content/Docs.js +3 -1
  287. package/dist/ssr/content/Docs.js.map +1 -1
  288. package/dist/ssr/content/FileBrowser.js +30 -26
  289. package/dist/ssr/content/FileBrowser.js.map +1 -1
  290. package/dist/ssr/content/FileTree.js +9 -7
  291. package/dist/ssr/content/FileTree.js.map +1 -1
  292. package/dist/ssr/content/FileView.js +37 -28
  293. package/dist/ssr/content/FileView.js.map +1 -1
  294. package/dist/ssr/content/Lightbox.js +8 -6
  295. package/dist/ssr/content/Lightbox.js.map +1 -1
  296. package/dist/ssr/content/LogEntriesTable.js +3 -3
  297. package/dist/ssr/content/LogEntriesTable.js.map +1 -1
  298. package/dist/ssr/content/MessageRow.js +24 -22
  299. package/dist/ssr/content/MessageRow.js.map +1 -1
  300. package/dist/ssr/content/Pagination.js +6 -6
  301. package/dist/ssr/content/Pagination.js.map +1 -1
  302. package/dist/ssr/content/PdfPreview.js +15 -13
  303. package/dist/ssr/content/PdfPreview.js.map +1 -1
  304. package/dist/ssr/content/RangePicker.js +3 -1
  305. package/dist/ssr/content/RangePicker.js.map +1 -1
  306. package/dist/ssr/content/StructuredDataPreview.js +3 -1
  307. package/dist/ssr/content/StructuredDataPreview.js.map +1 -1
  308. package/dist/ssr/content/Timeline.js +13 -11
  309. package/dist/ssr/content/Timeline.js.map +1 -1
  310. package/dist/ssr/content/VideoPlayer.js +5 -5
  311. package/dist/ssr/content/VideoPlayer.js.map +1 -1
  312. package/dist/ssr/content/VirtualFeed.js +6 -4
  313. package/dist/ssr/content/VirtualFeed.js.map +1 -1
  314. package/dist/ssr/content/ZoomPanViewport.js +7 -4
  315. package/dist/ssr/content/ZoomPanViewport.js.map +1 -1
  316. package/dist/ssr/content/calendar-messages.js +39 -1
  317. package/dist/ssr/content/calendar-messages.js.map +1 -1
  318. package/dist/ssr/content/calendar-pointer.js +4 -3
  319. package/dist/ssr/content/calendar-pointer.js.map +1 -1
  320. package/dist/ssr/content/chart-messages.js +136 -0
  321. package/dist/ssr/content/chart-messages.js.map +1 -0
  322. package/dist/ssr/content/collection-selection.js +2 -0
  323. package/dist/ssr/content/collection-selection.js.map +1 -1
  324. package/dist/ssr/content/data-table-messages.js +24 -0
  325. package/dist/ssr/content/data-table-messages.js.map +1 -0
  326. package/dist/ssr/content/docs-messages.js +24 -0
  327. package/dist/ssr/content/docs-messages.js.map +1 -0
  328. package/dist/ssr/content/feed-messages.js +34 -0
  329. package/dist/ssr/content/feed-messages.js.map +1 -0
  330. package/dist/ssr/content/file-browser-messages.js +69 -0
  331. package/dist/ssr/content/file-browser-messages.js.map +1 -0
  332. package/dist/ssr/content/file-view-messages.js +64 -0
  333. package/dist/ssr/content/file-view-messages.js.map +1 -0
  334. package/dist/ssr/content/lightbox-messages.js +36 -0
  335. package/dist/ssr/content/lightbox-messages.js.map +1 -0
  336. package/dist/ssr/content/log-entries-messages.js +20 -0
  337. package/dist/ssr/content/log-entries-messages.js.map +1 -0
  338. package/dist/ssr/content/markdown-info-block-messages.js +24 -0
  339. package/dist/ssr/content/markdown-info-block-messages.js.map +1 -0
  340. package/dist/ssr/content/markdown-info-blocks.js +3 -3
  341. package/dist/ssr/content/markdown-info-blocks.js.map +1 -1
  342. package/dist/ssr/content/markdown-links.js +2 -2
  343. package/dist/ssr/content/markdown-links.js.map +1 -1
  344. package/dist/ssr/content/markdown-reference-messages.js +30 -0
  345. package/dist/ssr/content/markdown-reference-messages.js.map +1 -0
  346. package/dist/ssr/content/pagination-messages.js +38 -0
  347. package/dist/ssr/content/pagination-messages.js.map +1 -0
  348. package/dist/ssr/content/pdf-messages.js +43 -0
  349. package/dist/ssr/content/pdf-messages.js.map +1 -0
  350. package/dist/ssr/content/range-picker-messages.js +20 -0
  351. package/dist/ssr/content/range-picker-messages.js.map +1 -0
  352. package/dist/ssr/content/structured-data-messages.js +22 -0
  353. package/dist/ssr/content/structured-data-messages.js.map +1 -0
  354. package/dist/ssr/content/timeline-messages.js +62 -0
  355. package/dist/ssr/content/timeline-messages.js.map +1 -0
  356. package/dist/ssr/content/video-messages.js +24 -0
  357. package/dist/ssr/content/video-messages.js.map +1 -0
  358. package/dist/ssr/content/viewport-messages.js +28 -0
  359. package/dist/ssr/content/viewport-messages.js.map +1 -0
  360. package/dist/ssr/feedback/HoverPreview.js +34 -6
  361. package/dist/ssr/feedback/HoverPreview.js.map +1 -1
  362. package/dist/ssr/feedback/InstallGuide.js +18 -18
  363. package/dist/ssr/feedback/InstallGuide.js.map +1 -1
  364. package/dist/ssr/feedback/install-messages.js +104 -0
  365. package/dist/ssr/feedback/install-messages.js.map +1 -0
  366. package/dist/ssr/feedback/prompt-messages.js +65 -0
  367. package/dist/ssr/feedback/prompt-messages.js.map +1 -0
  368. package/dist/ssr/feedback/prompts.js +14 -11
  369. package/dist/ssr/feedback/prompts.js.map +1 -1
  370. package/dist/ssr/feedback/toast-messages.js +18 -0
  371. package/dist/ssr/feedback/toast-messages.js.map +1 -0
  372. package/dist/ssr/feedback/toast.js +4 -3
  373. package/dist/ssr/feedback/toast.js.map +1 -1
  374. package/dist/ssr/index.js +1 -1
  375. package/dist/ssr/index.js.map +1 -1
  376. package/dist/ssr/inputs/AutocompleteEditor.js +5 -3
  377. package/dist/ssr/inputs/AutocompleteEditor.js.map +1 -1
  378. package/dist/ssr/inputs/AutocompleteSelect.js +10 -8
  379. package/dist/ssr/inputs/AutocompleteSelect.js.map +1 -1
  380. package/dist/ssr/inputs/ChoiceGroups.js +4 -0
  381. package/dist/ssr/inputs/ChoiceGroups.js.map +1 -1
  382. package/dist/ssr/inputs/ChoiceInputs.js +5 -5
  383. package/dist/ssr/inputs/ChoiceInputs.js.map +1 -1
  384. package/dist/ssr/inputs/Combobox.js +3 -1
  385. package/dist/ssr/inputs/Combobox.js.map +1 -1
  386. package/dist/ssr/inputs/FileDropTarget.js +6 -6
  387. package/dist/ssr/inputs/FileDropTarget.js.map +1 -1
  388. package/dist/ssr/inputs/FileInputs.js +29 -20
  389. package/dist/ssr/inputs/FileInputs.js.map +1 -1
  390. package/dist/ssr/inputs/MultiSelectInput.js +7 -5
  391. package/dist/ssr/inputs/MultiSelectInput.js.map +1 -1
  392. package/dist/ssr/inputs/NumberInput.js +4 -2
  393. package/dist/ssr/inputs/NumberInput.js.map +1 -1
  394. package/dist/ssr/inputs/QrScanner.js +4 -4
  395. package/dist/ssr/inputs/QrScanner.js.map +1 -1
  396. package/dist/ssr/inputs/Select.js +7 -5
  397. package/dist/ssr/inputs/Select.js.map +1 -1
  398. package/dist/ssr/inputs/SelectChip.js +3 -3
  399. package/dist/ssr/inputs/SelectChip.js.map +1 -1
  400. package/dist/ssr/inputs/SignatureInput.js +9 -3
  401. package/dist/ssr/inputs/SignatureInput.js.map +1 -1
  402. package/dist/ssr/inputs/SpecialInputs.js +4 -2
  403. package/dist/ssr/inputs/SpecialInputs.js.map +1 -1
  404. package/dist/ssr/inputs/TagEditor.js +8 -6
  405. package/dist/ssr/inputs/TagEditor.js.map +1 -1
  406. package/dist/ssr/inputs/TagsInput.js +5 -5
  407. package/dist/ssr/inputs/TagsInput.js.map +1 -1
  408. package/dist/ssr/inputs/TemplateEditor.js +5 -5
  409. package/dist/ssr/inputs/TemplateEditor.js.map +1 -1
  410. package/dist/ssr/inputs/TextInput.js +3 -1
  411. package/dist/ssr/inputs/TextInput.js.map +1 -1
  412. package/dist/ssr/inputs/completion-messages.js +24 -0
  413. package/dist/ssr/inputs/completion-messages.js.map +1 -0
  414. package/dist/ssr/inputs/file-drop-messages.js +63 -0
  415. package/dist/ssr/inputs/file-drop-messages.js.map +1 -0
  416. package/dist/ssr/inputs/file-drop.js.map +1 -1
  417. package/dist/ssr/inputs/file-input-messages.js +60 -0
  418. package/dist/ssr/inputs/file-input-messages.js.map +1 -0
  419. package/dist/ssr/inputs/icon-messages.js +22 -0
  420. package/dist/ssr/inputs/icon-messages.js.map +1 -0
  421. package/dist/ssr/inputs/input-messages.js +38 -0
  422. package/dist/ssr/inputs/input-messages.js.map +1 -0
  423. package/dist/ssr/inputs/markdown/MarkdownEditor.js +9 -5
  424. package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
  425. package/dist/ssr/inputs/markdown/Toolbar.js +13 -13
  426. package/dist/ssr/inputs/markdown/Toolbar.js.map +1 -1
  427. package/dist/ssr/inputs/markdown/editor-messages.js +43 -0
  428. package/dist/ssr/inputs/markdown/editor-messages.js.map +1 -0
  429. package/dist/ssr/inputs/markdown/toolbar-messages.js +40 -0
  430. package/dist/ssr/inputs/markdown/toolbar-messages.js.map +1 -0
  431. package/dist/ssr/inputs/qr-messages.js +26 -0
  432. package/dist/ssr/inputs/qr-messages.js.map +1 -0
  433. package/dist/ssr/inputs/select-messages.js +63 -0
  434. package/dist/ssr/inputs/select-messages.js.map +1 -0
  435. package/dist/ssr/inputs/tag-messages.js +44 -0
  436. package/dist/ssr/inputs/tag-messages.js.map +1 -0
  437. package/dist/ssr/inputs/template-messages.js +22 -0
  438. package/dist/ssr/inputs/template-messages.js.map +1 -0
  439. package/dist/ssr/internal/render-error-messages.js +20 -0
  440. package/dist/ssr/internal/render-error-messages.js.map +1 -0
  441. package/dist/ssr/internal/render-error.js +3 -1
  442. package/dist/ssr/internal/render-error.js.map +1 -1
  443. package/dist/ssr/internal/text-selection.js +101 -0
  444. package/dist/ssr/internal/text-selection.js.map +1 -0
  445. package/dist/ssr/intl/messages.js +6 -1155
  446. package/dist/ssr/intl/messages.js.map +1 -1
  447. package/dist/ssr/layout/AppWorkspace.js +203 -96
  448. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  449. package/dist/ssr/layout/BottomSheet.js +1 -0
  450. package/dist/ssr/layout/BottomSheet.js.map +1 -1
  451. package/dist/ssr/layout/Discussion.js +8 -5
  452. package/dist/ssr/layout/Discussion.js.map +1 -1
  453. package/dist/ssr/layout/FloatingWindow.js +8 -5
  454. package/dist/ssr/layout/FloatingWindow.js.map +1 -1
  455. package/dist/ssr/layout/Navigation.js +6 -5
  456. package/dist/ssr/layout/Navigation.js.map +1 -1
  457. package/dist/ssr/layout/PageTitle.js +253 -0
  458. package/dist/ssr/layout/PageTitle.js.map +1 -0
  459. package/dist/ssr/layout/PanelDialog.js +8 -6
  460. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  461. package/dist/ssr/layout/Panes.js +22 -14
  462. package/dist/ssr/layout/Panes.js.map +1 -1
  463. package/dist/ssr/layout/PullToRefresh.js +13 -4
  464. package/dist/ssr/layout/PullToRefresh.js.map +1 -1
  465. package/dist/ssr/layout/Settings.js +14 -12
  466. package/dist/ssr/layout/Settings.js.map +1 -1
  467. package/dist/ssr/layout/SettingsCollection.js +6 -5
  468. package/dist/ssr/layout/SettingsCollection.js.map +1 -1
  469. package/dist/ssr/layout/SettingsModal.js +3 -1
  470. package/dist/ssr/layout/SettingsModal.js.map +1 -1
  471. package/dist/ssr/layout/app-workspace-controller.js +743 -12
  472. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  473. package/dist/ssr/layout/app-workspace-state.js +3 -2
  474. package/dist/ssr/layout/app-workspace-state.js.map +1 -1
  475. package/dist/ssr/layout/floating-window-messages.js +28 -0
  476. package/dist/ssr/layout/floating-window-messages.js.map +1 -0
  477. package/dist/ssr/layout/index.js +2 -0
  478. package/dist/ssr/layout/index.js.map +1 -1
  479. package/dist/ssr/layout/navigation-model.js.map +1 -1
  480. package/dist/ssr/layout/page-title-controller.js +169 -0
  481. package/dist/ssr/layout/page-title-controller.js.map +1 -0
  482. package/dist/ssr/layout/panel-dialog-messages.js +20 -0
  483. package/dist/ssr/layout/panel-dialog-messages.js.map +1 -0
  484. package/dist/ssr/layout/panes-messages.js +48 -0
  485. package/dist/ssr/layout/panes-messages.js.map +1 -0
  486. package/dist/ssr/layout/refresh-messages.js +20 -0
  487. package/dist/ssr/layout/refresh-messages.js.map +1 -0
  488. package/dist/ssr/layout/settings-messages.js +54 -0
  489. package/dist/ssr/layout/settings-messages.js.map +1 -0
  490. package/dist/ssr/layout/workspace-messages.js +56 -0
  491. package/dist/ssr/layout/workspace-messages.js.map +1 -0
  492. package/dist/ssr/surfaces/Avatar.js +5 -5
  493. package/dist/ssr/surfaces/Avatar.js.map +1 -1
  494. package/dist/ssr/surfaces/ResourceCard.js +4 -2
  495. package/dist/ssr/surfaces/ResourceCard.js.map +1 -1
  496. package/dist/ssr/surfaces/Tag.js +3 -3
  497. package/dist/ssr/surfaces/Tag.js.map +1 -1
  498. package/dist/ssr/surfaces/avatar-messages.js +26 -0
  499. package/dist/ssr/surfaces/avatar-messages.js.map +1 -0
  500. package/dist/ssr/surfaces/resource-messages.js +26 -0
  501. package/dist/ssr/surfaces/resource-messages.js.map +1 -0
  502. package/dist/ssr/widgets/Widget.js +6 -0
  503. package/dist/ssr/widgets/Widget.js.map +1 -1
  504. package/dist/styles.css +1 -1
  505. package/dist/types/actions/filter-messages.d.ts +8 -0
  506. package/dist/types/actions/spotlight-messages.d.ts +8 -0
  507. package/dist/types/chat/chat-messages.d.ts +116 -0
  508. package/dist/types/content/DataTable.d.ts +2 -0
  509. package/dist/types/content/FileView.d.ts +0 -10
  510. package/dist/types/content/calendar-messages.d.ts +20 -1
  511. package/dist/types/content/chart-messages.d.ts +32 -0
  512. package/dist/types/content/data-table-messages.d.ts +10 -0
  513. package/dist/types/content/docs-messages.d.ts +10 -0
  514. package/dist/types/content/feed-messages.d.ts +15 -0
  515. package/dist/types/content/file-browser-messages.d.ts +33 -0
  516. package/dist/types/content/file-view-messages.d.ts +30 -0
  517. package/dist/types/content/lightbox-messages.d.ts +16 -0
  518. package/dist/types/content/log-entries-messages.d.ts +8 -0
  519. package/dist/types/content/markdown-info-block-messages.d.ts +12 -0
  520. package/dist/types/content/markdown-reference-messages.d.ts +15 -0
  521. package/dist/types/content/pagination-messages.d.ts +17 -0
  522. package/dist/types/content/pdf-messages.d.ts +20 -0
  523. package/dist/types/content/range-picker-messages.d.ts +8 -0
  524. package/dist/types/content/structured-data-messages.d.ts +9 -0
  525. package/dist/types/content/timeline-messages.d.ts +29 -0
  526. package/dist/types/content/video-messages.d.ts +10 -0
  527. package/dist/types/content/viewport-messages.d.ts +12 -0
  528. package/dist/types/feedback/install-messages.d.ts +50 -0
  529. package/dist/types/feedback/prompt-messages.d.ts +31 -0
  530. package/dist/types/feedback/toast-messages.d.ts +9 -0
  531. package/dist/types/index.d.ts +1 -0
  532. package/dist/types/inputs/completion-messages.d.ts +10 -0
  533. package/dist/types/inputs/file-drop-messages.d.ts +30 -0
  534. package/dist/types/inputs/file-drop.d.ts +3 -3
  535. package/dist/types/inputs/file-input-messages.d.ts +28 -0
  536. package/dist/types/inputs/icon-messages.d.ts +9 -0
  537. package/dist/types/inputs/input-messages.d.ts +17 -0
  538. package/dist/types/inputs/markdown/editor-messages.d.ts +20 -0
  539. package/dist/types/inputs/markdown/toolbar-messages.d.ts +18 -0
  540. package/dist/types/inputs/qr-messages.d.ts +11 -0
  541. package/dist/types/inputs/select-messages.d.ts +30 -0
  542. package/dist/types/inputs/tag-messages.d.ts +20 -0
  543. package/dist/types/inputs/template-messages.d.ts +9 -0
  544. package/dist/types/internal/render-error-messages.d.ts +8 -0
  545. package/dist/types/internal/text-selection.d.ts +18 -0
  546. package/dist/types/intl/messages.d.ts +3 -544
  547. package/dist/types/layout/AppWorkspace.d.ts +19 -4
  548. package/dist/types/layout/PageTitle.d.ts +64 -0
  549. package/dist/types/layout/app-workspace-controller.d.ts +4 -0
  550. package/dist/types/layout/app-workspace-state.d.ts +3 -2
  551. package/dist/types/layout/floating-window-messages.d.ts +12 -0
  552. package/dist/types/layout/index.d.ts +3 -0
  553. package/dist/types/layout/navigation-model.d.ts +7 -0
  554. package/dist/types/layout/page-title-controller.d.ts +13 -0
  555. package/dist/types/layout/panel-dialog-messages.d.ts +8 -0
  556. package/dist/types/layout/panes-messages.d.ts +22 -0
  557. package/dist/types/layout/refresh-messages.d.ts +8 -0
  558. package/dist/types/layout/settings-messages.d.ts +25 -0
  559. package/dist/types/layout/workspace-messages.d.ts +26 -0
  560. package/dist/types/surfaces/avatar-messages.d.ts +11 -0
  561. package/dist/types/surfaces/resource-messages.d.ts +11 -0
  562. package/dist/types/widgets/Widget.d.ts +5 -1
  563. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["inputs/SignatureInput.tsx"],"sourcesContent":["import { createEffect, createSignal, For, type JSX, on, Show, untrack } from \"solid-js\";\nimport { IconButton } from \"../actions/Button\";\nimport { SegmentedControl } from \"../actions/SegmentedControl\";\nimport { createFieldMeta, Field, fieldDescribedBy } from \"../internal/field\";\nimport { useUiMessages } from \"../intl/messages\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { commitFieldValue, resolveMaybeAccessor } from \"./field-contract\";\nimport {\n drawingToSvg,\n type SignatureDrawing,\n type SignaturePoint,\n type SignatureValue,\n signatureName,\n strokeOutline,\n svgToDrawing,\n typedToSvg,\n} from \"./signature\";\nimport { useSignatureMessages } from \"./signature-messages\";\n\nexport type SignatureInputProps = ValueFieldProps<SignatureValue | null> & {\n /** Submits the value as JSON in a hidden input of this name. */\n name?: string;\n /** Shows the signature without allowing changes. */\n readOnly?: boolean;\n /**\n * Offers typing the name instead of drawing. Defaults to `true`: typing is the\n * keyboard and screen-reader path and helps people who cannot draw. Without\n * it, a typed value is still shown and can be cleared, but not edited.\n */\n allowTyped?: boolean;\n};\n\ntype SignatureMode = \"draw\" | \"type\";\n\n/** Base stroke width in drawing units (CSS pixels at the time of drawing). */\nconst STROKE_SIZE = 3.2;\n/** Points closer than this to the previous one add no shape, only path length. */\nconst MIN_POINT_DISTANCE = 1.2;\nconst EMPTY_SPACE = { x: 0, y: 0, width: 600, height: 200 };\n\nconst sameValue = (left: SignatureValue | null, right: SignatureValue | null) =>\n left === right ||\n (left !== null &&\n right !== null &&\n left.kind === right.kind &&\n left.svg === right.svg &&\n (left.kind === \"typed\" && right.kind === \"typed\" ? left.name === right.name : true));\n\nconst drawingOf = (value: SignatureValue | null): SignatureDrawing =>\n (value?.kind === \"drawn\" ? svgToDrawing(value.svg) : null) ?? { ...EMPTY_SPACE, strokes: [] };\n\nlet measureContext: CanvasRenderingContext2D | null | undefined;\nconst measureText = (text: string, font: string): number | undefined => {\n measureContext ??= document.createElement(\"canvas\").getContext(\"2d\");\n if (!measureContext) return undefined;\n measureContext.font = font;\n return measureContext.measureText(text).width;\n};\n\n/**\n * A signature field: draw with a finger, pen, or mouse, or type the name. The\n * value is an SVG document plus how it was given; `signatureToPng` turns it\n * into a bitmap. Legal evidence such as timestamps or hashes stays with the app.\n */\nexport function SignatureInput(props: SignatureInputProps): JSX.Element {\n const messages = useUiMessages();\n const text = useSignatureMessages();\n const meta = createFieldMeta(props.id);\n const requiredId = `${meta.controlId}-required`;\n const value = () => resolveMaybeAccessor(props.value) ?? null;\n const error = () => resolveMaybeAccessor(props.error);\n const allowTyped = () => props.allowTyped !== false;\n const editable = () => !props.disabled && !props.readOnly;\n\n const initial = untrack(value);\n const [mode, setMode] = createSignal<SignatureMode>(initial?.kind === \"typed\" ? \"type\" : \"draw\");\n const [drawing, setDrawing] = createSignal<SignatureDrawing>(drawingOf(initial));\n const [typedName, setTypedName] = createSignal(initial?.kind === \"typed\" ? initial.name : \"\");\n const [live, setLive] = createSignal(\"\");\n let svg: SVGSVGElement | undefined;\n let nameInput: HTMLInputElement | undefined;\n let lastReported: SignatureValue | null = initial;\n\n const drawnValue = (): SignatureValue | null => {\n const markup = drawingToSvg(drawing());\n return markup ? { kind: \"drawn\", svg: markup } : null;\n };\n const typedValue = (): SignatureValue | null => {\n const name = signatureName(typedName());\n if (!name) return null;\n const family = nameInput ? getComputedStyle(nameInput).fontFamily : \"cursive\";\n return { kind: \"typed\", name, svg: typedToSvg(name, family, measureText) };\n };\n const report = (next: SignatureValue | null, commit: boolean) => {\n if (sameValue(next, lastReported)) return;\n lastReported = next;\n if (commit) commitFieldValue(props, next);\n else props.onValueChange?.(next);\n };\n\n let stroke: { pointerId: number; pointerType: string; points: SignaturePoint[]; time: number } | null = null;\n /** Drops the stroke in progress without keeping its ink. */\n const abortStroke = () => {\n if (!stroke) return;\n const { pointerId } = stroke;\n stroke = null;\n setLive(\"\");\n if (svg?.hasPointerCapture(pointerId)) svg.releasePointerCapture(pointerId);\n };\n /** After Clear or the last Undo, keyboard focus moves from the now disabled button to the pad instead of the page. */\n const keepFocus = (button: HTMLElement) => {\n if (button.matches(\":focus-visible\")) queueMicrotask(() => svg?.focus());\n };\n\n // A value the parent sets (a stored signature, another record, a reset to null) replaces both inputs, so nothing of an\n // earlier signer stays behind the mode switch. Our own reports echo back unchanged.\n createEffect(\n on(\n value,\n (next) => {\n if (next === lastReported || sameValue(next, lastReported)) return;\n lastReported = next;\n abortStroke();\n setDrawing(drawingOf(next));\n setTypedName(next?.kind === \"typed\" ? next.name : \"\");\n if (next) setMode(next.kind === \"typed\" ? \"type\" : \"draw\");\n },\n { defer: true },\n ),\n );\n // A field that turns disabled or read-only, or leaves drawing, ends the stroke in progress without a value.\n createEffect(() => {\n if (!editable() || mode() !== \"draw\") abortStroke();\n });\n\n const switchMode = (next: SignatureMode) => {\n if (!editable() || next === mode()) return;\n setMode(next);\n report(next === \"draw\" ? drawnValue() : typedValue(), true);\n };\n const undo = (event: MouseEvent & { currentTarget: HTMLButtonElement }) => {\n if (!editable()) return;\n setDrawing((current) => ({ ...current, strokes: current.strokes.slice(0, -1) }));\n if (drawing().strokes.length === 0) keepFocus(event.currentTarget);\n report(drawnValue(), true);\n };\n const clear = (event: MouseEvent & { currentTarget: HTMLButtonElement }) => {\n if (!editable()) return;\n abortStroke();\n // Clear starts over in both modes. Without the Type option, a typed value it removes gives way to drawing.\n setTypedName(\"\");\n setDrawing((current) => ({ ...current, strokes: [] }));\n if (mode() === \"type\" && allowTyped()) {\n nameInput?.focus();\n } else {\n setMode(\"draw\");\n keepFocus(event.currentTarget);\n }\n report(null, true);\n };\n\n const toPoint = (event: PointerEvent): { x: number; y: number } | null => {\n const matrix = svg?.getScreenCTM();\n if (!matrix) return null;\n const point = new DOMPoint(event.clientX, event.clientY).matrixTransform(matrix.inverse());\n return { x: point.x, y: point.y };\n };\n const addPoint = (event: PointerEvent, force = false) => {\n if (!stroke) return;\n const position = toPoint(event);\n if (!position) return;\n const previous = stroke.points[stroke.points.length - 1];\n const distance = previous ? Math.hypot(position.x - previous.x, position.y - previous.y) : 0;\n if (previous && distance < MIN_POINT_DISTANCE && !force) return;\n let pressure: number;\n if (event.pointerType === \"pen\" && event.pressure > 0) {\n pressure = event.pressure;\n } else {\n // Without real pressure, faster movement draws a thinner line, as ink does.\n const elapsed = Math.max(1, event.timeStamp - stroke.time);\n const target = Math.min(1, Math.max(0.3, 1.1 - (distance / elapsed) * 0.3));\n pressure = previous ? previous.pressure * 0.6 + target * 0.4 : 0.6;\n }\n stroke.time = event.timeStamp;\n stroke.points.push({ ...position, pressure });\n setLive(strokeOutline(stroke.points, STROKE_SIZE));\n };\n /**\n * The drawing space after a stroke. It stays as it is while the ink lies inside it. Ink beyond it, drawn after the\n * pad changed its shape (a rotated phone, a resized window, a drawing from another device), grows the space to the\n * whole visible pad: the stored SVG then holds everything the signer saw, and the ink on the pad does not move.\n */\n const spaceAfter = (points: readonly SignaturePoint[]): Omit<SignatureDrawing, \"strokes\"> => {\n const { strokes: _, ...space } = drawing();\n const matrix = svg?.getScreenCTM();\n if (!svg || !matrix) return space;\n const box = svg.getBoundingClientRect();\n const inverse = matrix.inverse();\n const start = new DOMPoint(box.left, box.top).matrixTransform(inverse);\n const end = new DOMPoint(box.right, box.bottom).matrixTransform(inverse);\n // Ink reaches half the widest stroke past its points; what lies outside the pad was never visible and does not count.\n const reach = STROKE_SIZE / 2;\n let left = end.x;\n let top = end.y;\n let right = start.x;\n let bottom = start.y;\n for (const point of points) {\n left = Math.min(left, Math.max(start.x, point.x - reach));\n top = Math.min(top, Math.max(start.y, point.y - reach));\n right = Math.max(right, Math.min(end.x, point.x + reach));\n bottom = Math.max(bottom, Math.min(end.y, point.y + reach));\n }\n if (left >= space.x && top >= space.y && right <= space.x + space.width && bottom <= space.y + space.height) return space;\n const x = Math.min(space.x, start.x);\n const y = Math.min(space.y, start.y);\n return {\n x,\n y,\n width: Math.max(space.x + space.width, end.x) - x,\n height: Math.max(space.y + space.height, end.y) - y,\n };\n };\n const startStroke = (event: PointerEvent) => {\n // Only the primary contact draws: not a mouse's other buttons, a pen's barrel button, or its eraser.\n if (!editable() || !svg || event.button !== 0) return;\n // A pen takes over from a touch that is still down, such as a palm resting on a tablet.\n if (stroke?.pointerType === \"touch\" && event.pointerType === \"pen\") abortStroke();\n if (stroke) return;\n event.preventDefault();\n try {\n // Capture keeps the stroke when the pointer leaves the pad; a pointer that already ended cannot be captured.\n svg.setPointerCapture(event.pointerId);\n } catch {}\n if (drawing().strokes.length === 0) {\n // An empty pad adopts its current size, so one drawing unit is one CSS pixel while drawing.\n const box = svg.getBoundingClientRect();\n setDrawing({ x: 0, y: 0, width: Math.max(1, box.width), height: Math.max(1, box.height), strokes: [] });\n }\n stroke = { pointerId: event.pointerId, pointerType: event.pointerType, points: [], time: event.timeStamp };\n addPoint(event, true);\n };\n const moveStroke = (event: PointerEvent) => {\n if (stroke?.pointerId !== event.pointerId) return;\n event.preventDefault();\n const events = event.getCoalescedEvents?.() ?? [];\n for (const sample of events.length > 0 ? events : [event]) addPoint(sample);\n };\n const endStroke = (event: PointerEvent) => {\n if (!stroke || stroke.pointerId !== event.pointerId) return;\n addPoint(event, false);\n const { points } = stroke;\n const outline = strokeOutline(points, STROKE_SIZE);\n stroke = null;\n setLive(\"\");\n if (!outline) return;\n const space = spaceAfter(points);\n setDrawing((current) => ({ ...space, strokes: [...current.strokes, outline] }));\n report(drawnValue(), true);\n };\n // A cancelled pointer (an OS gesture, palm rejection) or lost capture is not a finished stroke.\n const cancelStroke = (event: PointerEvent) => {\n if (stroke?.pointerId === event.pointerId) abortStroke();\n };\n\n const empty = () => (mode() === \"draw\" ? drawing().strokes.length === 0 && !live() : !signatureName(typedName()));\n const serialized = () => {\n const current = value();\n return current ? JSON.stringify(current) : \"\";\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\n id={meta.controlId}\n class=\"k2b-signature-input\"\n role=\"group\"\n aria-label={props.label ? undefined : props[\"aria-label\"]}\n aria-labelledby={props.label ? meta.labelId : undefined}\n aria-describedby={[props.required ? requiredId : undefined, fieldDescribedBy(meta, props)].filter(Boolean).join(\" \") || undefined}\n aria-invalid={error() ? \"true\" : undefined}\n data-mode={mode()}\n data-empty={empty() ? \"true\" : undefined}\n data-invalid={error() ? \"true\" : undefined}\n data-disabled={props.disabled ? \"true\" : undefined}\n data-readonly={props.readOnly ? \"true\" : undefined}\n >\n {/* A group cannot be marked required, so the required state is part of its description. */}\n <Show when={props.required}>\n <span id={requiredId} hidden>\n {messages().required}\n </span>\n </Show>\n <div class=\"k2b-signature-input__toolbar\">\n <Show when={allowTyped()}>\n <SegmentedControl\n class=\"k2b-signature-input__modes\"\n size=\"sm\"\n ariaLabel={text().method}\n options={[\n { value: \"draw\", label: text().draw, icon: \"ti ti-signature\" },\n { value: \"type\", label: text().type, icon: \"ti ti-keyboard\" },\n ]}\n value={mode}\n onValueChange={switchMode}\n disabled={!editable()}\n />\n </Show>\n <div class=\"k2b-signature-input__actions\">\n <IconButton\n size=\"sm\"\n variant=\"ghost\"\n label={text().undo}\n data-hidden={mode() === \"type\" ? \"true\" : undefined}\n disabled={!editable() || mode() !== \"draw\" || drawing().strokes.length === 0}\n onClick={undo}\n >\n <i class=\"ti ti-arrow-back-up\" aria-hidden=\"true\" />\n </IconButton>\n <IconButton size=\"sm\" variant=\"ghost\" label={messages().clear} disabled={!editable() || empty()} onClick={clear}>\n <i class=\"ti ti-eraser\" aria-hidden=\"true\" />\n </IconButton>\n </div>\n </div>\n <div class=\"k2b-signature-input__pad\">\n <span class=\"k2b-signature-input__line\" aria-hidden=\"true\" />\n <Show\n when={mode() === \"draw\"}\n fallback={\n <input\n ref={nameInput}\n class=\"k2b-signature-input__name\"\n type=\"text\"\n value={typedName()}\n placeholder={text().typeName}\n aria-label={text().typeName}\n aria-describedby={fieldDescribedBy(meta, props)}\n aria-invalid={error() ? \"true\" : undefined}\n aria-required={props.required || undefined}\n autocomplete=\"name\"\n autocapitalize=\"words\"\n spellcheck={false}\n disabled={props.disabled}\n readOnly={props.readOnly || !allowTyped()}\n onInput={(event) => {\n setTypedName(event.currentTarget.value);\n report(typedValue(), false);\n }}\n onChange={() => props.onValueCommit?.(typedValue())}\n />\n }\n >\n <span class=\"k2b-signature-input__placeholder\" aria-hidden=\"true\">\n <i class=\"ti ti-writing-sign\" aria-hidden=\"true\" />\n {text().signHere}\n </span>\n <svg\n ref={svg}\n class=\"k2b-signature-input__canvas\"\n role=\"img\"\n tabindex=\"-1\"\n aria-label={drawing().strokes.length > 0 ? text().drawn : text().drawArea}\n viewBox={`${drawing().x} ${drawing().y} ${drawing().width} ${drawing().height}`}\n preserveAspectRatio=\"xMidYMid meet\"\n onPointerDown={startStroke}\n onPointerMove={moveStroke}\n onPointerUp={endStroke}\n onPointerCancel={cancelStroke}\n onLostPointerCapture={(event) => {\n // A child path that held a touch's implicit capture hands it to the pad; only the pad's own loss counts.\n if (event.target === event.currentTarget) cancelStroke(event);\n }}\n >\n <g fill=\"currentColor\">\n <For each={drawing().strokes}>{(outline) => <path d={outline} />}</For>\n <Show when={live()}>\n <path d={live()} />\n </Show>\n </g>\n </svg>\n </Show>\n </div>\n </div>\n <Show when={props.name}>{(name) => <input type=\"hidden\" name={name()} value={serialized()} />}</Show>\n </Field>\n );\n}\n\nexport default SignatureInput;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,YAAY,EAAE,YAAY,EAAE,GAAG,EAAY,EAAE,EAAE,IAAI,EAAE,OAAO,QAAQ,UAAU;AACvF,SAAS,UAAU,QAAQ,mBAAmB;AAC9C,SAAS,gBAAgB,QAAQ,6BAA6B;AAC9D,SAAS,eAAe,EAAE,KAAK,EAAE,gBAAgB,QAAQ,mBAAmB;AAC5E,SAAS,aAAa,QAAQ,kBAAkB;AAEhD,SAAS,gBAAgB,EAAE,oBAAoB,QAAQ,kBAAkB;AACzE,SACE,YAAY,EAIZ,aAAa,EACb,aAAa,EACb,YAAY,EACZ,UAAU,QACL,aAAa;AACpB,SAAS,oBAAoB,QAAQ,sBAAsB;AAiB3D;AACA,MAAM,WAAW,GAAG,GAAG;AACvB;AACA,MAAM,kBAAkB,GAAG,GAAG;AAC9B,MAAM,WAAW,GAAG;EAAE,CAAC,EAAE,CAAC;EAAE,CAAC,EAAE,CAAC;EAAE,KAAK,EAAE,GAAG;EAAE,MAAM,EAAE;AAAI,CAAC;AAE3D,MAAM,SAAS,GAAG,CAAC,IAA2B,EAAE,KAA4B,KAC1E,IAAI,KAAK,KAAK,IACb,IAAI,KAAK,IAAI,IACZ,KAAK,KAAK,IAAI,IACd,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,IACxB,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,KACrB,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,GAAG,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,GAAG,IAAI,CAAE;AAExF,MAAM,SAAS,GAAI,KAA4B,IAC7C,CAAC,KAAK,EAAE,IAAI,KAAK,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,KAAK;EAAE,GAAG,WAAW;EAAE,OAAO,EAAE;AAAG,CAAC;AAE/F,IAAI,cAA2D;AAC/D,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,IAAY,KAAyB;EACtE,cAAc,KAAK,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;EACpE,IAAI,CAAC,cAAc,EAAE,OAAO,SAAS;EACrC,cAAc,CAAC,IAAI,GAAG,IAAI;EAC1B,OAAO,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK;AAC/C,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAO,SAAS,cAAc,CAAC,KAA0B,EAAe;EACtE,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC;EAChC,MAAM,IAAI,GAAG,oBAAoB,CAAC,CAAC;EACnC,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;EACtC,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,SAAS,WAAW;EAC/C,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI;EAC7D,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC;EACrD,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,UAAU,KAAK,KAAK;EACnD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,QAAQ;EAEzD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;EAC9B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,YAAY,CAAgB,OAAO,EAAE,IAAI,KAAK,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;EAChG,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,YAAY,CAAmB,SAAS,CAAC,OAAO,CAAC,CAAC;EAChF,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,YAAY,CAAC,OAAO,EAAE,IAAI,KAAK,OAAO,GAAG,OAAO,CAAC,IAAI,GAAG,EAAE,CAAC;EAC7F,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC;EACxC,IAAI,GAA8B;EAClC,IAAI,SAAuC;EAC3C,IAAI,YAAmC,GAAG,OAAO;EAEjD,MAAM,UAAU,GAAG,MAA6B;IAC9C,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IACtC,OAAO,MAAM,GAAG;MAAE,IAAI,EAAE,OAAO;MAAE,GAAG,EAAE;IAAO,CAAC,GAAG,IAAI;EACvD,CAAC;EACD,MAAM,UAAU,GAAG,MAA6B;IAC9C,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;IACvC,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI;IACtB,MAAM,MAAM,GAAG,SAAS,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC,UAAU,GAAG,SAAS;IAC7E,OAAO;MAAE,IAAI,EAAE,OAAO;MAAE,IAAI;MAAE,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW;IAAE,CAAC;EAC5E,CAAC;EACD,MAAM,MAAM,GAAG,CAAC,IAA2B,EAAE,MAAe,KAAK;IAC/D,IAAI,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE;IACnC,YAAY,GAAG,IAAI;IACnB,IAAI,MAAM,EAAE,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,KACrC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC;EAClC,CAAC;EAED,IAAI,MAAiG,GAAG,IAAI;EAC5G;EACA,MAAM,WAAW,GAAG,MAAM;IACxB,IAAI,CAAC,MAAM,EAAE;IACb,MAAM;MAAE;IAAU,CAAC,GAAG,MAAM;IAC5B,MAAM,GAAG,IAAI;IACb,OAAO,CAAC,EAAE,CAAC;IACX,IAAI,GAAG,EAAE,iBAAiB,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,qBAAqB,CAAC,SAAS,CAAC;EAC7E,CAAC;EACD;EACA,MAAM,SAAS,GAAI,MAAmB,IAAK;IACzC,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,cAAc,CAAC,MAAM,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;EAC1E,CAAC;;EAED;EACA;EACA,YAAY,CACV,EAAE,CACA,KAAK,EACJ,IAAI,IAAK;IACR,IAAI,IAAI,KAAK,YAAY,IAAI,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE;IAC5D,YAAY,GAAG,IAAI;IACnB,WAAW,CAAC,CAAC;IACb,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC3B,YAAY,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;IACrD,IAAI,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;EAC5D,CAAC,EACD;IAAE,KAAK,EAAE;EAAK,CAChB,CACF,CAAC;EACD;EACA,YAAY,CAAC,MAAM;IACjB,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,MAAM,EAAE,WAAW,CAAC,CAAC;EACrD,CAAC,CAAC;EAEF,MAAM,UAAU,GAAI,IAAmB,IAAK;IAC1C,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,EAAE;IACpC,OAAO,CAAC,IAAI,CAAC;IACb,MAAM,CAAC,IAAI,KAAK,MAAM,GAAG,UAAU,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC;EAC7D,CAAC;EACD,MAAM,IAAI,GAAI,KAAwD,IAAK;IACzE,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE;IACjB,UAAU,CAAE,OAAO,KAAM;MAAE,GAAG,OAAO;MAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IAAE,CAAC,CAAC,CAAC;IAChF,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC;IAClE,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC;EAC5B,CAAC;EACD,MAAM,KAAK,GAAI,KAAwD,IAAK;IAC1E,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE;IACjB,WAAW,CAAC,CAAC;IACb;IACA,YAAY,CAAC,EAAE,CAAC;IAChB,UAAU,CAAE,OAAO,KAAM;MAAE,GAAG,OAAO;MAAE,OAAO,EAAE;IAAG,CAAC,CAAC,CAAC;IACtD,IAAI,IAAI,CAAC,CAAC,KAAK,MAAM,IAAI,UAAU,CAAC,CAAC,EAAE;MACrC,SAAS,EAAE,KAAK,CAAC,CAAC;IACpB,CAAC,MAAM;MACL,OAAO,CAAC,MAAM,CAAC;MACf,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC;IAChC;IACA,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC;EACpB,CAAC;EAED,MAAM,OAAO,GAAI,KAAmB,IAAsC;IACxE,MAAM,MAAM,GAAG,GAAG,EAAE,YAAY,CAAC,CAAC;IAClC,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI;IACxB,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1F,OAAO;MAAE,CAAC,EAAE,KAAK,CAAC,CAAC;MAAE,CAAC,EAAE,KAAK,CAAC;IAAE,CAAC;EACnC,CAAC;EACD,MAAM,QAAQ,GAAG,CAAC,KAAmB,EAAE,KAAK,GAAG,KAAK,KAAK;IACvD,IAAI,CAAC,MAAM,EAAE;IACb,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC;IAC/B,IAAI,CAAC,QAAQ,EAAE;IACf,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5F,IAAI,QAAQ,IAAI,QAAQ,GAAG,kBAAkB,IAAI,CAAC,KAAK,EAAE;IACzD,IAAI,QAAgB;IACpB,IAAI,KAAK,CAAC,WAAW,KAAK,KAAK,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,EAAE;MACrD,QAAQ,GAAG,KAAK,CAAC,QAAQ;IAC3B,CAAC,MAAM;MACL;MACA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC;MAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,GAAI,QAAQ,GAAG,OAAO,GAAI,GAAG,CAAC,CAAC;MAC3E,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC,QAAQ,GAAG,GAAG,GAAG,MAAM,GAAG,GAAG,GAAG,GAAG;IACpE;IACA,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,SAAS;IAC7B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;MAAE,GAAG,QAAQ;MAAE;IAAS,CAAC,CAAC;IAC7C,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;EACpD,CAAC;EACD;AACF;AACA;AACA;AACA;EACE,MAAM,UAAU,GAAI,MAAiC,IAAwC;IAC3F,MAAM;MAAE,OAAO,EAAE,CAAC;MAAE,GAAG;IAAM,CAAC,GAAG,OAAO,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,GAAG,EAAE,YAAY,CAAC,CAAC;IAClC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,KAAK;IACjC,MAAM,GAAG,GAAG,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC;IACtE,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC;IACxE;IACA,MAAM,KAAK,GAAG,WAAW,GAAG,CAAC;IAC7B,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC;IAChB,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC;IACf,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC;IACnB,IAAI,MAAM,GAAG,KAAK,CAAC,CAAC;IACpB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;MAC1B,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;MACzD,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;MACvD,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;MACzD,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;IAC7D;IACA,IAAI,IAAI,IAAI,KAAK,CAAC,CAAC,IAAI,GAAG,IAAI,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,IAAI,MAAM,IAAI,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK;IACzH,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IACpC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IACpC,OAAO;MACL,CAAC;MACD,CAAC;MACD,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;MACjD,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG;IACpD,CAAC;EACH,CAAC;EACD,MAAM,WAAW,GAAI,KAAmB,IAAK;IAC3C;IACA,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;IAC/C;IACA,IAAI,MAAM,EAAE,WAAW,KAAK,OAAO,IAAI,KAAK,CAAC,WAAW,KAAK,KAAK,EAAE,WAAW,CAAC,CAAC;IACjF,IAAI,MAAM,EAAE;IACZ,KAAK,CAAC,cAAc,CAAC,CAAC;IACtB,IAAI;MACF;MACA,GAAG,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC;IACxC,CAAC,CAAC,MAAM,CAAC;IACT,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;MAClC;MACA,MAAM,GAAG,GAAG,GAAG,CAAC,qBAAqB,CAAC,CAAC;MACvC,UAAU,CAAC;QAAE,CAAC,EAAE,CAAC;QAAE,CAAC,EAAE,CAAC;QAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC;QAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE;MAAG,CAAC,CAAC;IACzG;IACA,MAAM,GAAG;MAAE,SAAS,EAAE,KAAK,CAAC,SAAS;MAAE,WAAW,EAAE,KAAK,CAAC,WAAW;MAAE,MAAM,EAAE,EAAE;MAAE,IAAI,EAAE,KAAK,CAAC;IAAU,CAAC;IAC1G,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;EACvB,CAAC;EACD,MAAM,UAAU,GAAI,KAAmB,IAAK;IAC1C,IAAI,MAAM,EAAE,SAAS,KAAK,KAAK,CAAC,SAAS,EAAE;IAC3C,KAAK,CAAC,cAAc,CAAC,CAAC;IACtB,MAAM,MAAM,GAAG,KAAK,CAAC,kBAAkB,GAAG,CAAC,IAAI,EAAE;IACjD,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC;EAC7E,CAAC;EACD,MAAM,SAAS,GAAI,KAAmB,IAAK;IACzC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,EAAE;IACrD,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,MAAM;MAAE;IAAO,CAAC,GAAG,MAAM;IACzB,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,EAAE,WAAW,CAAC;IAClD,MAAM,GAAG,IAAI;IACb,OAAO,CAAC,EAAE,CAAC;IACX,IAAI,CAAC,OAAO,EAAE;IACd,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC;IAChC,UAAU,CAAE,OAAO,KAAM;MAAE,GAAG,KAAK;MAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,OAAO;IAAE,CAAC,CAAC,CAAC;IAC/E,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC;EAC5B,CAAC;EACD;EACA,MAAM,YAAY,GAAI,KAAmB,IAAK;IAC5C,IAAI,MAAM,EAAE,SAAS,KAAK,KAAK,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;EAC1D,CAAC;EAED,MAAM,KAAK,GAAG,MAAO,IAAI,CAAC,CAAC,KAAK,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAE;EACjH,MAAM,UAAU,GAAG,MAAM;IACvB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC;IACvB,OAAO,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE;EAC/C,CAAC;EAED,yBACG,KAAK;IAAA;MAAA,OACG,KAAK,CAAC,KAAK;IAAA;IAAA,IAClB,KAAK;MAAA,OAAE,KAAK,CAAC,KAAK;IAAA;IAAA,IAClB,WAAW;MAAA,OAAE,KAAK,CAAC,WAAW;IAAA;IAAA,IAC9B,KAAK;MAAA,OAAE,KAAK,CAAC,CAAC;IAAA;IACd,IAAI,EAAE,IAAI;IACV,QAAQ,EAAE,KAAK;IAAA,IACf,QAAQ;MAAA,OAAE,KAAK,CAAC,QAAQ;IAAA;IAAA,IACxB,QAAQ;MAAA,OAAE,KAAK,CAAC,QAAQ;IAAA;IAAA;MAAA;QAAA;UAAA;UAAA;UAAA;UAAA;UAAA;UAAA;UAAA;UAAA;UAAA;UAAA;UAAA;UAAA;UAAA;UAAA;QAAA,iCAiBrB,IAAI;UAAA,IAAC,IAAI;YAAA,OAAE,KAAK,CAAC,QAAQ;UAAA;UAAA;YAAA;YAAA,4BACd,UAAU;YAAA,sBACjB,QAAQ,CAAC,CAAC,CAAC,QAAQ;YAAA;UAAA;QAAA;QAAA,kCAIrB,IAAI;UAAA,IAAC,IAAI;YAAA,OAAE,UAAU,CAAC,CAAC;UAAA;UAAA;YAAA,yBACrB,gBAAgB;cAAA;cAEf,IAAI;cAAA,IACJ,SAAS;gBAAA,OAAE,IAAI,CAAC,CAAC,CAAC,MAAM;cAAA;cAAA,IACxB,OAAO;gBAAA,OAAE,CACP;kBAAE,KAAK,EAAE,MAAM;kBAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI;kBAAE,IAAI,EAAE;gBAAkB,CAAC,EAC9D;kBAAE,KAAK,EAAE,MAAM;kBAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI;kBAAE,IAAI,EAAE;gBAAiB,CAAC,CAC9D;cAAA;cACD,KAAK,EAAE,IAAI;cACX,aAAa,EAAE,UAAU;cAAA,IACzB,QAAQ;gBAAA,OAAE,CAAC,QAAQ,CAAC,CAAC;cAAA;YAAA;UAAA;QAAA;QAAA,kCAItB,UAAU;UACT,IAAI;UACJ,OAAO;UAAA,IACP,KAAK;YAAA,OAAE,IAAI,CAAC,CAAC,CAAC,IAAI;UAAA;UAAA;YAAA,OACL,IAAI,CAAC,CAAC,KAAK,MAAM,GAAG,MAAM,GAAG,SAAS;UAAA;UAAA,IACnD,QAAQ;YAAA,OAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;UAAA;UAC5E,OAAO,EAAE,IAAI;UAAA;YAAA;UAAA;QAAA;QAAA,kCAId,UAAU;UAAC,IAAI;UAAM,OAAO;UAAA,IAAS,KAAK;YAAA,OAAE,QAAQ,CAAC,CAAC,CAAC,KAAK;UAAA;UAAA,IAAE,QAAQ;YAAA,OAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC;UAAA;UAAE,OAAO,EAAE,KAAK;UAAA;YAAA;UAAA;QAAA;QAAA,mCAOhH,IAAI;UAAA,IACH,IAAI;YAAA,OAAE,IAAI,CAAC,CAAC,KAAK,MAAM;UAAA;UAAA,IACvB,QAAQ;YAAA;cAAA;cAAA,kCAoBM,MAAM,KAAK,CAAC,aAAa,GAAG,UAAU,CAAC,CAAC,CAAC;cAAA,iBAJzC,KAAK,IAAK;gBAClB,YAAY,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC;gBACvC,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC;cAC7B,CAAC;cAAA,aAjBI,SAAS;cAAA,uDAAT,SAAS;cAAA,qCAWF,KAAK;cAAA;gBAAA,YAPJ,IAAI,CAAC,CAAC,CAAC,QAAQ;kBAAA,QAChB,IAAI,CAAC,CAAC,CAAC,QAAQ;kBAAA,QACT,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC;kBAAA,QACjC,KAAK,CAAC,CAAC,GAAG,MAAM,GAAG,SAAS;kBAAA,QAC3B,KAAK,CAAC,QAAQ,IAAI,SAAS;kBAAA,QAIhC,KAAK,CAAC,QAAQ;kBAAA,QACd,KAAK,CAAC,QAAQ,IAAI,CAAC,UAAU,CAAC,CAAC;gBAAA;gBAAA;gBAAA;gBAAA;gBAAA;gBAAA;gBAAA;gBAAA;cAAA;gBAAA;gBAAA;gBAAA;gBAAA;gBAAA;gBAAA;gBAAA;cAAA;cAAA,8CAVlC,SAAS,CAAC,CAAC;cAAA;cAAA;YAAA;UAAA;UAAA;YAAA;cAAA;gBAAA;gBAAA;gBAAA;cAAA,uBAqBnB,IAAI,CAAC,CAAC,CAAC,QAAQ;cAAA;YAAA;cAAA;gBAAA;gBAAA;gBAAA;gBAAA;gBAAA;cAAA,8CAcO,KAAK,IAAK;gBAC/B;gBACA,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,aAAa,EAAE,YAAY,CAAC,KAAK,CAAC;cAC/D,CAAC;cAAA,yCAJgB,YAAY;cAAA,qBADhB,SAAS;cAAA,uBADP,UAAU;cAAA,uBADV,WAAW;cAAA,YAPrB,GAAG;cAAA,qDAAH,GAAG;cAAA,mCAiBL,GAAG;gBAAA,IAAC,IAAI;kBAAA,OAAE,OAAO,CAAC,CAAC,CAAC,OAAO;gBAAA;gBAAA,UAAI,OAAO;kBAAA;kBAAA,4BAAc,OAAO;kBAAA;gBAAA;cAAI;cAAA,mCAC/D,IAAI;gBAAA,IAAC,IAAI;kBAAA,OAAE,IAAI,CAAC,CAAC;gBAAA;gBAAA;kBAAA;kBAAA,2CACP,IAAI,CAAC,CAAC;kBAAA;gBAAA;cAAA;cAAA;gBAAA,UAfP,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ;kBAAA,OAChE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE;gBAAA;gBAAA;gBAAA;cAAA;gBAAA;gBAAA;cAAA;cAAA;cAAA;YAAA;UAAA;QAAA;QAAA;UAAA,WAxFjF,IAAI,CAAC,SAAS;YAAA,OAGN,KAAK,CAAC,KAAK,GAAG,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC;YAAA,OACxC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,GAAG,SAAS;YAAA,OACrC,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,GAAG,SAAS,EAAE,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS;YAAA,OACnH,KAAK,CAAC,CAAC,GAAG,MAAM,GAAG,SAAS;YAAA,OAC/B,IAAI,CAAC,CAAC;YAAA,OACL,KAAK,CAAC,CAAC,GAAG,MAAM,GAAG,SAAS;YAAA,OAC1B,KAAK,CAAC,CAAC,GAAG,MAAM,GAAG,SAAS;YAAA,OAC3B,KAAK,CAAC,QAAQ,GAAG,MAAM,GAAG,SAAS;YAAA,QACnC,KAAK,CAAC,QAAQ,GAAG,MAAM,GAAG,SAAS;UAAA;UAAA;UAAA;UAAA;UAAA;UAAA;UAAA;UAAA;UAAA;UAAA;UAAA;QAAA;UAAA;UAAA;UAAA;UAAA;UAAA;UAAA;UAAA;UAAA;UAAA;UAAA;QAAA;QAAA;MAAA,wBAkGnD,IAAI;QAAA,IAAC,IAAI;UAAA,OAAE,KAAK,CAAC,IAAI;QAAA;QAAA,UAAI,IAAI;UAAA;UAAA,8CAAgC,IAAI,CAAC,CAAC;UAAA,8CAAS,UAAU,CAAC,CAAC;UAAA;QAAA;MAAI;IAAA;EAAA;AAGnG;AAEA,eAAe,cAAc;AAAC","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["inputs/SignatureInput.tsx"],"sourcesContent":["import { createEffect, createSignal, For, type JSX, on, Show, untrack } from \"solid-js\";\nimport { IconButton } from \"../actions/Button\";\nimport { SegmentedControl } from \"../actions/SegmentedControl\";\nimport { createFieldMeta, Field, fieldDescribedBy } from \"../internal/field\";\nimport { suppressTextSelection } from \"../internal/text-selection\";\nimport { useUiMessages } from \"../intl/messages\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { commitFieldValue, resolveMaybeAccessor } from \"./field-contract\";\nimport {\n drawingToSvg,\n type SignatureDrawing,\n type SignaturePoint,\n type SignatureValue,\n signatureName,\n strokeOutline,\n svgToDrawing,\n typedToSvg,\n} from \"./signature\";\nimport { useSignatureMessages } from \"./signature-messages\";\n\nexport type SignatureInputProps = ValueFieldProps<SignatureValue | null> & {\n /** Submits the value as JSON in a hidden input of this name. */\n name?: string;\n /** Shows the signature without allowing changes. */\n readOnly?: boolean;\n /**\n * Offers typing the name instead of drawing. Defaults to `true`: typing is the\n * keyboard and screen-reader path and helps people who cannot draw. Without\n * it, a typed value is still shown and can be cleared, but not edited.\n */\n allowTyped?: boolean;\n};\n\ntype SignatureMode = \"draw\" | \"type\";\n\n/** Base stroke width in drawing units (CSS pixels at the time of drawing). */\nconst STROKE_SIZE = 3.2;\n/** Points closer than this to the previous one add no shape, only path length. */\nconst MIN_POINT_DISTANCE = 1.2;\nconst EMPTY_SPACE = { x: 0, y: 0, width: 600, height: 200 };\n\nconst sameValue = (left: SignatureValue | null, right: SignatureValue | null) =>\n left === right ||\n (left !== null &&\n right !== null &&\n left.kind === right.kind &&\n left.svg === right.svg &&\n (left.kind === \"typed\" && right.kind === \"typed\" ? left.name === right.name : true));\n\nconst drawingOf = (value: SignatureValue | null): SignatureDrawing =>\n (value?.kind === \"drawn\" ? svgToDrawing(value.svg) : null) ?? { ...EMPTY_SPACE, strokes: [] };\n\nlet measureContext: CanvasRenderingContext2D | null | undefined;\nconst measureText = (text: string, font: string): number | undefined => {\n measureContext ??= document.createElement(\"canvas\").getContext(\"2d\");\n if (!measureContext) return undefined;\n measureContext.font = font;\n return measureContext.measureText(text).width;\n};\n\n/**\n * A signature field: draw with a finger, pen, or mouse, or type the name. The\n * value is an SVG document plus how it was given; `signatureToPng` turns it\n * into a bitmap. Legal evidence such as timestamps or hashes stays with the app.\n */\nexport function SignatureInput(props: SignatureInputProps): JSX.Element {\n const messages = useUiMessages();\n const text = useSignatureMessages();\n const meta = createFieldMeta(props.id);\n const requiredId = `${meta.controlId}-required`;\n const value = () => resolveMaybeAccessor(props.value) ?? null;\n const error = () => resolveMaybeAccessor(props.error);\n const allowTyped = () => props.allowTyped !== false;\n const editable = () => !props.disabled && !props.readOnly;\n\n const initial = untrack(value);\n const [mode, setMode] = createSignal<SignatureMode>(initial?.kind === \"typed\" ? \"type\" : \"draw\");\n const [drawing, setDrawing] = createSignal<SignatureDrawing>(drawingOf(initial));\n const [typedName, setTypedName] = createSignal(initial?.kind === \"typed\" ? initial.name : \"\");\n const [live, setLive] = createSignal(\"\");\n let svg: SVGSVGElement | undefined;\n let nameInput: HTMLInputElement | undefined;\n let lastReported: SignatureValue | null = initial;\n\n const drawnValue = (): SignatureValue | null => {\n const markup = drawingToSvg(drawing());\n return markup ? { kind: \"drawn\", svg: markup } : null;\n };\n const typedValue = (): SignatureValue | null => {\n const name = signatureName(typedName());\n if (!name) return null;\n const family = nameInput ? getComputedStyle(nameInput).fontFamily : \"cursive\";\n return { kind: \"typed\", name, svg: typedToSvg(name, family, measureText) };\n };\n const report = (next: SignatureValue | null, commit: boolean) => {\n if (sameValue(next, lastReported)) return;\n lastReported = next;\n if (commit) commitFieldValue(props, next);\n else props.onValueChange?.(next);\n };\n\n let stroke: {\n pointerId: number;\n pointerType: string;\n points: SignaturePoint[];\n time: number;\n releaseTextSelection: () => void;\n } | null = null;\n /** Drops the stroke in progress without keeping its ink. */\n const abortStroke = () => {\n if (!stroke) return;\n const { pointerId, releaseTextSelection } = stroke;\n stroke = null;\n releaseTextSelection();\n setLive(\"\");\n if (svg?.hasPointerCapture(pointerId)) svg.releasePointerCapture(pointerId);\n };\n /** After Clear or the last Undo, keyboard focus moves from the now disabled button to the pad instead of the page. */\n const keepFocus = (button: HTMLElement) => {\n if (button.matches(\":focus-visible\")) queueMicrotask(() => svg?.focus());\n };\n\n // A value the parent sets (a stored signature, another record, a reset to null) replaces both inputs, so nothing of an\n // earlier signer stays behind the mode switch. Our own reports echo back unchanged.\n createEffect(\n on(\n value,\n (next) => {\n if (next === lastReported || sameValue(next, lastReported)) return;\n lastReported = next;\n abortStroke();\n setDrawing(drawingOf(next));\n setTypedName(next?.kind === \"typed\" ? next.name : \"\");\n if (next) setMode(next.kind === \"typed\" ? \"type\" : \"draw\");\n },\n { defer: true },\n ),\n );\n // A field that turns disabled or read-only, or leaves drawing, ends the stroke in progress without a value.\n createEffect(() => {\n if (!editable() || mode() !== \"draw\") abortStroke();\n });\n\n const switchMode = (next: SignatureMode) => {\n if (!editable() || next === mode()) return;\n setMode(next);\n report(next === \"draw\" ? drawnValue() : typedValue(), true);\n };\n const undo = (event: MouseEvent & { currentTarget: HTMLButtonElement }) => {\n if (!editable()) return;\n setDrawing((current) => ({ ...current, strokes: current.strokes.slice(0, -1) }));\n if (drawing().strokes.length === 0) keepFocus(event.currentTarget);\n report(drawnValue(), true);\n };\n const clear = (event: MouseEvent & { currentTarget: HTMLButtonElement }) => {\n if (!editable()) return;\n abortStroke();\n // Clear starts over in both modes. Without the Type option, a typed value it removes gives way to drawing.\n setTypedName(\"\");\n setDrawing((current) => ({ ...current, strokes: [] }));\n if (mode() === \"type\" && allowTyped()) {\n nameInput?.focus();\n } else {\n setMode(\"draw\");\n keepFocus(event.currentTarget);\n }\n report(null, true);\n };\n\n const toPoint = (event: PointerEvent): { x: number; y: number } | null => {\n const matrix = svg?.getScreenCTM();\n if (!matrix) return null;\n const point = new DOMPoint(event.clientX, event.clientY).matrixTransform(matrix.inverse());\n return { x: point.x, y: point.y };\n };\n const addPoint = (event: PointerEvent, force = false) => {\n if (!stroke) return;\n const position = toPoint(event);\n if (!position) return;\n const previous = stroke.points[stroke.points.length - 1];\n const distance = previous ? Math.hypot(position.x - previous.x, position.y - previous.y) : 0;\n if (previous && distance < MIN_POINT_DISTANCE && !force) return;\n let pressure: number;\n if (event.pointerType === \"pen\" && event.pressure > 0) {\n pressure = event.pressure;\n } else {\n // Without real pressure, faster movement draws a thinner line, as ink does.\n const elapsed = Math.max(1, event.timeStamp - stroke.time);\n const target = Math.min(1, Math.max(0.3, 1.1 - (distance / elapsed) * 0.3));\n pressure = previous ? previous.pressure * 0.6 + target * 0.4 : 0.6;\n }\n stroke.time = event.timeStamp;\n stroke.points.push({ ...position, pressure });\n setLive(strokeOutline(stroke.points, STROKE_SIZE));\n };\n /**\n * The drawing space after a stroke. It stays as it is while the ink lies inside it. Ink beyond it, drawn after the\n * pad changed its shape (a rotated phone, a resized window, a drawing from another device), grows the space to the\n * whole visible pad: the stored SVG then holds everything the signer saw, and the ink on the pad does not move.\n */\n const spaceAfter = (points: readonly SignaturePoint[]): Omit<SignatureDrawing, \"strokes\"> => {\n const { strokes: _, ...space } = drawing();\n const matrix = svg?.getScreenCTM();\n if (!svg || !matrix) return space;\n const box = svg.getBoundingClientRect();\n const inverse = matrix.inverse();\n const start = new DOMPoint(box.left, box.top).matrixTransform(inverse);\n const end = new DOMPoint(box.right, box.bottom).matrixTransform(inverse);\n // Ink reaches half the widest stroke past its points; what lies outside the pad was never visible and does not count.\n const reach = STROKE_SIZE / 2;\n let left = end.x;\n let top = end.y;\n let right = start.x;\n let bottom = start.y;\n for (const point of points) {\n left = Math.min(left, Math.max(start.x, point.x - reach));\n top = Math.min(top, Math.max(start.y, point.y - reach));\n right = Math.max(right, Math.min(end.x, point.x + reach));\n bottom = Math.max(bottom, Math.min(end.y, point.y + reach));\n }\n if (left >= space.x && top >= space.y && right <= space.x + space.width && bottom <= space.y + space.height) return space;\n const x = Math.min(space.x, start.x);\n const y = Math.min(space.y, start.y);\n return {\n x,\n y,\n width: Math.max(space.x + space.width, end.x) - x,\n height: Math.max(space.y + space.height, end.y) - y,\n };\n };\n const startStroke = (event: PointerEvent) => {\n // Only the primary contact draws: not a mouse's other buttons, a pen's barrel button, or its eraser.\n if (!editable() || !svg || event.button !== 0) return;\n // A pen takes over from a touch that is still down, such as a palm resting on a tablet.\n if (stroke?.pointerType === \"touch\" && event.pointerType === \"pen\") abortStroke();\n if (stroke) return;\n event.preventDefault();\n try {\n // Capture keeps the stroke when the pointer leaves the pad; a pointer that already ended cannot be captured.\n svg.setPointerCapture(event.pointerId);\n } catch {}\n if (drawing().strokes.length === 0) {\n // An empty pad adopts its current size, so one drawing unit is one CSS pixel while drawing.\n const box = svg.getBoundingClientRect();\n setDrawing({ x: 0, y: 0, width: Math.max(1, box.width), height: Math.max(1, box.height), strokes: [] });\n }\n stroke = {\n pointerId: event.pointerId,\n pointerType: event.pointerType,\n points: [],\n time: event.timeStamp,\n releaseTextSelection: suppressTextSelection(event.pointerId),\n };\n addPoint(event, true);\n };\n const moveStroke = (event: PointerEvent) => {\n if (stroke?.pointerId !== event.pointerId) return;\n event.preventDefault();\n const events = event.getCoalescedEvents?.() ?? [];\n for (const sample of events.length > 0 ? events : [event]) addPoint(sample);\n };\n const endStroke = (event: PointerEvent) => {\n if (!stroke || stroke.pointerId !== event.pointerId) return;\n addPoint(event, false);\n const { points, releaseTextSelection } = stroke;\n const outline = strokeOutline(points, STROKE_SIZE);\n stroke = null;\n releaseTextSelection();\n setLive(\"\");\n if (!outline) return;\n const space = spaceAfter(points);\n setDrawing((current) => ({ ...space, strokes: [...current.strokes, outline] }));\n report(drawnValue(), true);\n };\n // A cancelled pointer (an OS gesture, palm rejection) or lost capture is not a finished stroke.\n const cancelStroke = (event: PointerEvent) => {\n if (stroke?.pointerId === event.pointerId) abortStroke();\n };\n\n const empty = () => (mode() === \"draw\" ? drawing().strokes.length === 0 && !live() : !signatureName(typedName()));\n const serialized = () => {\n const current = value();\n return current ? JSON.stringify(current) : \"\";\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\n id={meta.controlId}\n class=\"k2b-signature-input\"\n role=\"group\"\n aria-label={props.label ? undefined : props[\"aria-label\"]}\n aria-labelledby={props.label ? meta.labelId : undefined}\n aria-describedby={[props.required ? requiredId : undefined, fieldDescribedBy(meta, props)].filter(Boolean).join(\" \") || undefined}\n aria-invalid={error() ? \"true\" : undefined}\n data-mode={mode()}\n data-empty={empty() ? \"true\" : undefined}\n data-invalid={error() ? \"true\" : undefined}\n data-disabled={props.disabled ? \"true\" : undefined}\n data-readonly={props.readOnly ? \"true\" : undefined}\n >\n {/* A group cannot be marked required, so the required state is part of its description. */}\n <Show when={props.required}>\n <span id={requiredId} hidden>\n {messages().required}\n </span>\n </Show>\n <div class=\"k2b-signature-input__toolbar\">\n <Show when={allowTyped()}>\n <SegmentedControl\n class=\"k2b-signature-input__modes\"\n size=\"sm\"\n ariaLabel={text().method}\n options={[\n { value: \"draw\", label: text().draw, icon: \"ti ti-signature\" },\n { value: \"type\", label: text().type, icon: \"ti ti-keyboard\" },\n ]}\n value={mode}\n onValueChange={switchMode}\n disabled={!editable()}\n />\n </Show>\n <div class=\"k2b-signature-input__actions\">\n <IconButton\n size=\"sm\"\n variant=\"ghost\"\n label={text().undo}\n data-hidden={mode() === \"type\" ? \"true\" : undefined}\n disabled={!editable() || mode() !== \"draw\" || drawing().strokes.length === 0}\n onClick={undo}\n >\n <i class=\"ti ti-arrow-back-up\" aria-hidden=\"true\" />\n </IconButton>\n <IconButton size=\"sm\" variant=\"ghost\" label={messages().clear} disabled={!editable() || empty()} onClick={clear}>\n <i class=\"ti ti-eraser\" aria-hidden=\"true\" />\n </IconButton>\n </div>\n </div>\n <div class=\"k2b-signature-input__pad\">\n <span class=\"k2b-signature-input__line\" aria-hidden=\"true\" />\n <Show\n when={mode() === \"draw\"}\n fallback={\n <input\n ref={nameInput}\n class=\"k2b-signature-input__name\"\n type=\"text\"\n value={typedName()}\n placeholder={text().typeName}\n aria-label={text().typeName}\n aria-describedby={fieldDescribedBy(meta, props)}\n aria-invalid={error() ? \"true\" : undefined}\n aria-required={props.required || undefined}\n autocomplete=\"name\"\n autocapitalize=\"words\"\n spellcheck={false}\n disabled={props.disabled}\n readOnly={props.readOnly || !allowTyped()}\n onInput={(event) => {\n setTypedName(event.currentTarget.value);\n report(typedValue(), false);\n }}\n onChange={() => props.onValueCommit?.(typedValue())}\n />\n }\n >\n <span class=\"k2b-signature-input__placeholder\" aria-hidden=\"true\">\n <i class=\"ti ti-writing-sign\" aria-hidden=\"true\" />\n {text().signHere}\n </span>\n <svg\n ref={svg}\n class=\"k2b-signature-input__canvas\"\n role=\"img\"\n tabindex=\"-1\"\n aria-label={drawing().strokes.length > 0 ? text().drawn : text().drawArea}\n viewBox={`${drawing().x} ${drawing().y} ${drawing().width} ${drawing().height}`}\n preserveAspectRatio=\"xMidYMid meet\"\n onPointerDown={startStroke}\n onPointerMove={moveStroke}\n onPointerUp={endStroke}\n onPointerCancel={cancelStroke}\n onLostPointerCapture={(event) => {\n // A child path that held a touch's implicit capture hands it to the pad; only the pad's own loss counts.\n if (event.target === event.currentTarget) cancelStroke(event);\n }}\n >\n <g fill=\"currentColor\">\n <For each={drawing().strokes}>{(outline) => <path d={outline} />}</For>\n <Show when={live()}>\n <path d={live()} />\n </Show>\n </g>\n </svg>\n </Show>\n </div>\n </div>\n <Show when={props.name}>{(name) => <input type=\"hidden\" name={name()} value={serialized()} />}</Show>\n </Field>\n );\n}\n\nexport default SignatureInput;\n"],"mappings":"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","ignoreList":[]}
@@ -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":[]}
@@ -23,6 +23,7 @@ import { useUiMessages } from "../intl/messages";
23
23
  import { Tag } from "../surfaces/Tag";
24
24
  import { ColorInput } from "./ChoiceInputs";
25
25
  import { TextInput } from "./TextInput";
26
+ import { useTagMessages } from "./tag-messages";
26
27
  function EditorForm(props) {
27
28
  const initialName = props.initial?.name ?? "";
28
29
  const initialColor = props.initial?.color ?? props.defaultColor;
@@ -132,14 +133,15 @@ function EditorForm(props) {
132
133
  /** Controlled tag manager. Persistence, authorization, confirmation, and toasts stay with the consumer. */
133
134
  export function TagEditor(props) {
134
135
  const messages = useUiMessages();
136
+ const tagMessages = useTagMessages();
135
137
  const [mode, setMode] = createSignal(null);
136
138
  const [busyId, setBusyId] = createSignal(null);
137
139
  const [rowError, setRowError] = createSignal();
138
140
  const labels = () => ({
139
- create: messages().addTag,
140
- empty: messages().noTagsYet,
141
+ create: tagMessages().addTag,
142
+ empty: tagMessages().noTagsYet,
141
143
  name: messages().name,
142
- namePlaceholder: messages().tagName,
144
+ namePlaceholder: tagMessages().tagName,
143
145
  color: messages().color,
144
146
  save: messages().save,
145
147
  cancel: messages().cancel,
@@ -158,7 +160,7 @@ export function TagEditor(props) {
158
160
  } catch (cause) {
159
161
  setRowError({
160
162
  id,
161
- message: cause instanceof Error ? cause.message : messages().tagActionFailed
163
+ message: cause instanceof Error ? cause.message : tagMessages().tagActionFailed
162
164
  });
163
165
  throw cause;
164
166
  } finally {
@@ -271,7 +273,7 @@ export function TagEditor(props) {
271
273
  return busyId() === item.id;
272
274
  },
273
275
  get saveError() {
274
- return messages().tagCouldNotBeSaved;
276
+ return tagMessages().tagCouldNotBeSaved;
275
277
  },
276
278
  onCancel: () => setMode(null),
277
279
  get onDirtyChange() {
@@ -330,7 +332,7 @@ export function TagEditor(props) {
330
332
  return busyId() === "create";
331
333
  },
332
334
  get saveError() {
333
- return messages().tagCouldNotBeSaved;
335
+ return tagMessages().tagCouldNotBeSaved;
334
336
  },
335
337
  onCancel: () => setMode(null),
336
338
  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":[]}
@@ -19,14 +19,14 @@ var _tmpl$ = /*#__PURE__*/_$template(`<span class=k2b-tags-input__values aria-hi
19
19
  _tmpl$6 = /*#__PURE__*/_$template(`<input type=hidden>`);
20
20
  import { createEffect, createSignal, createUniqueId, Show } from "solid-js";
21
21
  import { createFieldMeta, Field, fieldControlAria } from "../internal/field";
22
- import { useUiMessages } from "../intl/messages";
23
22
  import { resolveMaybeAccessor } from "./field-contract";
23
+ import { useTagMessages } from "./tag-messages";
24
24
  export function TagsInput(props) {
25
- const messages = useUiMessages();
25
+ const tagMessages = useTagMessages();
26
26
  const meta = createFieldMeta(props.id);
27
27
  const announcementId = `k2b-tags-${createUniqueId()}`;
28
28
  const error = () => resolveMaybeAccessor(props.error);
29
- const placeholder = () => props.placeholder ?? messages().tagsPlaceholder;
29
+ const placeholder = () => props.placeholder ?? tagMessages().tagsPlaceholder;
30
30
  const [focused, setFocused] = createSignal(false);
31
31
  let focusStartValue = [];
32
32
  const normalize = text => text.replace(/\s+/g, " ").trim();
@@ -55,9 +55,9 @@ export function TagsInput(props) {
55
55
  const removed = previous.filter(tag => !nextTags.has(tag));
56
56
  const announcement = document.getElementById(announcementId);
57
57
  if (announcement) {
58
- announcement.textContent = [added.length ? messages().tagsAdded({
58
+ announcement.textContent = [added.length ? tagMessages().tagsAdded({
59
59
  tags: added.join(", ")
60
- }) : "", removed.length ? messages().tagsRemoved({
60
+ }) : "", removed.length ? tagMessages().tagsRemoved({
61
61
  tags: removed.join(", ")
62
62
  }) : ""].filter(Boolean).join(" ");
63
63
  }
@@ -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":[]}
@@ -10,10 +10,10 @@ import { memo as _$memo } from "solid-js/web";
10
10
  var _tmpl$ = /*#__PURE__*/_$template(`<section><iframe sandbox>`),
11
11
  _tmpl$2 = /*#__PURE__*/_$template(`<section>`);
12
12
  import { createMemo, For } from "solid-js";
13
- import { useUiMessages } from "../intl/messages";
14
13
  import { PANES_LAYOUT_VERSION } from "../layout/panes-layout";
15
14
  import { AutocompleteEditor } from "./AutocompleteEditor";
16
15
  import { TextInput } from "./TextInput";
16
+ import { useTemplateMessages } from "./template-messages";
17
17
  export const createTemplateEditorPanesLayout = () => ({
18
18
  version: PANES_LAYOUT_VERSION,
19
19
  root: {
@@ -124,7 +124,7 @@ const highlightTemplate = text => {
124
124
  return withTags.replace(/\uE000(\d+)\uE001/g, (_, index) => stashed[Number(index)] ?? "");
125
125
  };
126
126
  export function TemplateEditor(props) {
127
- const messages = useUiMessages();
127
+ const templateMessages = useTemplateMessages();
128
128
  const completions = createMemo(() => templateCompletions(props.variables));
129
129
  return _$createComponent(AutocompleteEditor, _$mergeProps(props, {
130
130
  get lines() {
@@ -134,7 +134,7 @@ export function TemplateEditor(props) {
134
134
  return props.spellcheck ?? false;
135
135
  },
136
136
  get placeholder() {
137
- return props.placeholder ?? messages().templateEditorPlaceholder;
137
+ return props.placeholder ?? templateMessages().templateEditorPlaceholder;
138
138
  },
139
139
  highlight: highlightTemplate,
140
140
  get completions() {
@@ -143,14 +143,14 @@ export function TemplateEditor(props) {
143
143
  }));
144
144
  }
145
145
  export function TemplatePreview(props) {
146
- const messages = useUiMessages();
146
+ const templateMessages = useTemplateMessages();
147
147
  return (() => {
148
148
  var _el$ = _$getNextElement(_tmpl$),
149
149
  _el$2 = _el$.firstChild;
150
150
  _$effect(_p$ => {
151
151
  var _v$ = `k2b-template-preview ${props.class ?? ""}`,
152
152
  _v$2 = props.html,
153
- _v$3 = props.title ?? messages().templatePreview;
153
+ _v$3 = props.title ?? templateMessages().templatePreview;
154
154
  _v$ !== _p$.e && _$className(_el$, _p$.e = _v$);
155
155
  _v$2 !== _p$.t && _$setAttribute(_el$2, "srcdoc", _p$.t = _v$2);
156
156
  _v$3 !== _p$.a && _$setAttribute(_el$2, "title", _p$.a = _v$3);
@@ -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":[]}
@@ -23,9 +23,11 @@ import { createSignal, Show, splitProps } from "solid-js";
23
23
  import { createFieldMeta, Field, fieldControlAria } from "../internal/field";
24
24
  import { useUiMessages } from "../intl/messages";
25
25
  import { commitFieldValue, resolveMaybeAccessor } from "./field-contract";
26
+ import { useInputMessages } from "./input-messages";
26
27
  import { MarkdownEditor } from "./markdown/MarkdownEditor";
27
28
  export function TextInput(props) {
28
29
  const messages = useUiMessages();
30
+ const inputMessages = useInputMessages();
29
31
  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"]);
30
32
  const meta = createFieldMeta(local.id);
31
33
  const value = () => resolveMaybeAccessor(local.value) ?? "";
@@ -218,7 +220,7 @@ export function TextInput(props) {
218
220
  _el$0 = _el$9.firstChild;
219
221
  _el$9.$$click = () => setPasswordVisible(visible => !visible);
220
222
  _$effect(_p$ => {
221
- var _v$ = passwordVisible() ? messages().hidePassword : messages().showPassword,
223
+ var _v$ = passwordVisible() ? inputMessages().hidePassword : inputMessages().showPassword,
222
224
  _v$2 = passwordVisible(),
223
225
  _v$3 = rest.disabled,
224
226
  _v$4 = passwordVisible() ? "ti ti-eye-off" : "ti ti-eye";