@k2b/ui 0.21.0 → 0.23.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 (610) 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 +1096 -1060
  22. package/dist/browser/content/Calendar.js.map +1 -1
  23. package/dist/browser/content/CalendarDayView.js +1187 -0
  24. package/dist/browser/content/CalendarDayView.js.map +1 -0
  25. package/dist/browser/content/CalendarWeekView.js +1571 -0
  26. package/dist/browser/content/CalendarWeekView.js.map +1 -0
  27. package/dist/browser/content/Chart.js +15 -8
  28. package/dist/browser/content/Chart.js.map +1 -1
  29. package/dist/browser/content/ChartExplorer.js +185 -85
  30. package/dist/browser/content/ChartExplorer.js.map +1 -1
  31. package/dist/browser/content/ChartExplorerControls.js +9 -7
  32. package/dist/browser/content/ChartExplorerControls.js.map +1 -1
  33. package/dist/browser/content/ChartFilterControls.js +93 -34
  34. package/dist/browser/content/ChartFilterControls.js.map +1 -1
  35. package/dist/browser/content/ChartSnapshotView.js +3 -3
  36. package/dist/browser/content/ChartSnapshotView.js.map +1 -1
  37. package/dist/browser/content/DataTable.js +238 -201
  38. package/dist/browser/content/DataTable.js.map +1 -1
  39. package/dist/browser/content/Docs.js +3 -1
  40. package/dist/browser/content/Docs.js.map +1 -1
  41. package/dist/browser/content/FileBrowser.js +30 -26
  42. package/dist/browser/content/FileBrowser.js.map +1 -1
  43. package/dist/browser/content/FileTree.js +9 -7
  44. package/dist/browser/content/FileTree.js.map +1 -1
  45. package/dist/browser/content/FileView.js +37 -28
  46. package/dist/browser/content/FileView.js.map +1 -1
  47. package/dist/browser/content/Lightbox.js +9 -7
  48. package/dist/browser/content/Lightbox.js.map +1 -1
  49. package/dist/browser/content/LogEntriesTable.js +3 -3
  50. package/dist/browser/content/LogEntriesTable.js.map +1 -1
  51. package/dist/browser/content/MessageRow.js +24 -22
  52. package/dist/browser/content/MessageRow.js.map +1 -1
  53. package/dist/browser/content/Pagination.js +7 -7
  54. package/dist/browser/content/Pagination.js.map +1 -1
  55. package/dist/browser/content/PdfPreview.js +15 -13
  56. package/dist/browser/content/PdfPreview.js.map +1 -1
  57. package/dist/browser/content/RangePicker.js +3 -1
  58. package/dist/browser/content/RangePicker.js.map +1 -1
  59. package/dist/browser/content/StructuredDataPreview.js +3 -1
  60. package/dist/browser/content/StructuredDataPreview.js.map +1 -1
  61. package/dist/browser/content/Timeline.js +13 -11
  62. package/dist/browser/content/Timeline.js.map +1 -1
  63. package/dist/browser/content/VideoPlayer.js +5 -5
  64. package/dist/browser/content/VideoPlayer.js.map +1 -1
  65. package/dist/browser/content/VirtualFeed.js +6 -4
  66. package/dist/browser/content/VirtualFeed.js.map +1 -1
  67. package/dist/browser/content/ZoomPanViewport.js +10 -7
  68. package/dist/browser/content/ZoomPanViewport.js.map +1 -1
  69. package/dist/browser/content/calendar-day-scroll.js +98 -0
  70. package/dist/browser/content/calendar-day-scroll.js.map +1 -0
  71. package/dist/browser/content/calendar-days.js +408 -0
  72. package/dist/browser/content/calendar-days.js.map +1 -0
  73. package/dist/browser/content/calendar-dialogs.js +236 -0
  74. package/dist/browser/content/calendar-dialogs.js.map +1 -0
  75. package/dist/browser/content/calendar-messages.js +249 -3
  76. package/dist/browser/content/calendar-messages.js.map +1 -1
  77. package/dist/browser/content/calendar-pointer.js +19 -6
  78. package/dist/browser/content/calendar-pointer.js.map +1 -1
  79. package/dist/browser/content/calendar-shared.js +328 -0
  80. package/dist/browser/content/calendar-shared.js.map +1 -0
  81. package/dist/browser/content/calendar-time-view.js +1649 -0
  82. package/dist/browser/content/calendar-time-view.js.map +1 -0
  83. package/dist/browser/content/chart-messages.js +146 -0
  84. package/dist/browser/content/chart-messages.js.map +1 -0
  85. package/dist/browser/content/collection-selection.js +2 -0
  86. package/dist/browser/content/collection-selection.js.map +1 -1
  87. package/dist/browser/content/data-table-messages.js +24 -0
  88. package/dist/browser/content/data-table-messages.js.map +1 -0
  89. package/dist/browser/content/docs-messages.js +24 -0
  90. package/dist/browser/content/docs-messages.js.map +1 -0
  91. package/dist/browser/content/feed-messages.js +34 -0
  92. package/dist/browser/content/feed-messages.js.map +1 -0
  93. package/dist/browser/content/file-browser-messages.js +69 -0
  94. package/dist/browser/content/file-browser-messages.js.map +1 -0
  95. package/dist/browser/content/file-view-messages.js +64 -0
  96. package/dist/browser/content/file-view-messages.js.map +1 -0
  97. package/dist/browser/content/index.js.map +1 -1
  98. package/dist/browser/content/lightbox-messages.js +36 -0
  99. package/dist/browser/content/lightbox-messages.js.map +1 -0
  100. package/dist/browser/content/log-entries-messages.js +20 -0
  101. package/dist/browser/content/log-entries-messages.js.map +1 -0
  102. package/dist/browser/content/markdown-info-block-messages.js +24 -0
  103. package/dist/browser/content/markdown-info-block-messages.js.map +1 -0
  104. package/dist/browser/content/markdown-info-blocks.js +3 -3
  105. package/dist/browser/content/markdown-info-blocks.js.map +1 -1
  106. package/dist/browser/content/markdown-links.js +2 -2
  107. package/dist/browser/content/markdown-links.js.map +1 -1
  108. package/dist/browser/content/markdown-reference-messages.js +30 -0
  109. package/dist/browser/content/markdown-reference-messages.js.map +1 -0
  110. package/dist/browser/content/pagination-messages.js +38 -0
  111. package/dist/browser/content/pagination-messages.js.map +1 -0
  112. package/dist/browser/content/pdf-messages.js +43 -0
  113. package/dist/browser/content/pdf-messages.js.map +1 -0
  114. package/dist/browser/content/range-picker-messages.js +20 -0
  115. package/dist/browser/content/range-picker-messages.js.map +1 -0
  116. package/dist/browser/content/structured-data-messages.js +22 -0
  117. package/dist/browser/content/structured-data-messages.js.map +1 -0
  118. package/dist/browser/content/timeline-messages.js +62 -0
  119. package/dist/browser/content/timeline-messages.js.map +1 -0
  120. package/dist/browser/content/video-messages.js +24 -0
  121. package/dist/browser/content/video-messages.js.map +1 -0
  122. package/dist/browser/content/viewport-messages.js +28 -0
  123. package/dist/browser/content/viewport-messages.js.map +1 -0
  124. package/dist/browser/feedback/HoverPreview.js +34 -6
  125. package/dist/browser/feedback/HoverPreview.js.map +1 -1
  126. package/dist/browser/feedback/InstallGuide.js +18 -18
  127. package/dist/browser/feedback/InstallGuide.js.map +1 -1
  128. package/dist/browser/feedback/install-messages.js +104 -0
  129. package/dist/browser/feedback/install-messages.js.map +1 -0
  130. package/dist/browser/feedback/prompt-messages.js +65 -0
  131. package/dist/browser/feedback/prompt-messages.js.map +1 -0
  132. package/dist/browser/feedback/prompts.js +14 -11
  133. package/dist/browser/feedback/prompts.js.map +1 -1
  134. package/dist/browser/feedback/toast-messages.js +18 -0
  135. package/dist/browser/feedback/toast-messages.js.map +1 -0
  136. package/dist/browser/feedback/toast.js +4 -3
  137. package/dist/browser/feedback/toast.js.map +1 -1
  138. package/dist/browser/index.js +1 -1
  139. package/dist/browser/index.js.map +1 -1
  140. package/dist/browser/inputs/AutocompleteEditor.js +6 -4
  141. package/dist/browser/inputs/AutocompleteEditor.js.map +1 -1
  142. package/dist/browser/inputs/AutocompleteSelect.js +10 -8
  143. package/dist/browser/inputs/AutocompleteSelect.js.map +1 -1
  144. package/dist/browser/inputs/ChoiceGroups.js +4 -0
  145. package/dist/browser/inputs/ChoiceGroups.js.map +1 -1
  146. package/dist/browser/inputs/ChoiceInputs.js +5 -5
  147. package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
  148. package/dist/browser/inputs/Combobox.js +3 -2
  149. package/dist/browser/inputs/Combobox.js.map +1 -1
  150. package/dist/browser/inputs/FileDropTarget.js +6 -6
  151. package/dist/browser/inputs/FileDropTarget.js.map +1 -1
  152. package/dist/browser/inputs/FileInputs.js +30 -21
  153. package/dist/browser/inputs/FileInputs.js.map +1 -1
  154. package/dist/browser/inputs/MultiSelectInput.js +7 -5
  155. package/dist/browser/inputs/MultiSelectInput.js.map +1 -1
  156. package/dist/browser/inputs/NumberInput.js +4 -2
  157. package/dist/browser/inputs/NumberInput.js.map +1 -1
  158. package/dist/browser/inputs/QrScanner.js +5 -5
  159. package/dist/browser/inputs/QrScanner.js.map +1 -1
  160. package/dist/browser/inputs/Select.js +7 -5
  161. package/dist/browser/inputs/Select.js.map +1 -1
  162. package/dist/browser/inputs/SelectChip.js +3 -3
  163. package/dist/browser/inputs/SelectChip.js.map +1 -1
  164. package/dist/browser/inputs/SignatureInput.js +9 -3
  165. package/dist/browser/inputs/SignatureInput.js.map +1 -1
  166. package/dist/browser/inputs/SpecialInputs.js +4 -2
  167. package/dist/browser/inputs/SpecialInputs.js.map +1 -1
  168. package/dist/browser/inputs/TagEditor.js +8 -6
  169. package/dist/browser/inputs/TagEditor.js.map +1 -1
  170. package/dist/browser/inputs/TagsInput.js +5 -5
  171. package/dist/browser/inputs/TagsInput.js.map +1 -1
  172. package/dist/browser/inputs/TemplateEditor.js +5 -5
  173. package/dist/browser/inputs/TemplateEditor.js.map +1 -1
  174. package/dist/browser/inputs/TextInput.js +3 -1
  175. package/dist/browser/inputs/TextInput.js.map +1 -1
  176. package/dist/browser/inputs/completion-messages.js +24 -0
  177. package/dist/browser/inputs/completion-messages.js.map +1 -0
  178. package/dist/browser/inputs/file-drop-messages.js +63 -0
  179. package/dist/browser/inputs/file-drop-messages.js.map +1 -0
  180. package/dist/browser/inputs/file-drop.js.map +1 -1
  181. package/dist/browser/inputs/file-input-messages.js +60 -0
  182. package/dist/browser/inputs/file-input-messages.js.map +1 -0
  183. package/dist/browser/inputs/icon-messages.js +22 -0
  184. package/dist/browser/inputs/icon-messages.js.map +1 -0
  185. package/dist/browser/inputs/input-messages.js +38 -0
  186. package/dist/browser/inputs/input-messages.js.map +1 -0
  187. package/dist/browser/inputs/markdown/MarkdownEditor.js +10 -6
  188. package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
  189. package/dist/browser/inputs/markdown/Toolbar.js +13 -13
  190. package/dist/browser/inputs/markdown/Toolbar.js.map +1 -1
  191. package/dist/browser/inputs/markdown/editor-messages.js +43 -0
  192. package/dist/browser/inputs/markdown/editor-messages.js.map +1 -0
  193. package/dist/browser/inputs/markdown/toolbar-messages.js +40 -0
  194. package/dist/browser/inputs/markdown/toolbar-messages.js.map +1 -0
  195. package/dist/browser/inputs/qr-messages.js +26 -0
  196. package/dist/browser/inputs/qr-messages.js.map +1 -0
  197. package/dist/browser/inputs/select-messages.js +63 -0
  198. package/dist/browser/inputs/select-messages.js.map +1 -0
  199. package/dist/browser/inputs/tag-messages.js +44 -0
  200. package/dist/browser/inputs/tag-messages.js.map +1 -0
  201. package/dist/browser/inputs/template-messages.js +22 -0
  202. package/dist/browser/inputs/template-messages.js.map +1 -0
  203. package/dist/browser/internal/render-error-messages.js +20 -0
  204. package/dist/browser/internal/render-error-messages.js.map +1 -0
  205. package/dist/browser/internal/render-error.js +3 -1
  206. package/dist/browser/internal/render-error.js.map +1 -1
  207. package/dist/browser/internal/text-selection.js +101 -0
  208. package/dist/browser/internal/text-selection.js.map +1 -0
  209. package/dist/browser/intl/messages.js +6 -1155
  210. package/dist/browser/intl/messages.js.map +1 -1
  211. package/dist/browser/layout/AppWorkspace.js +594 -425
  212. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  213. package/dist/browser/layout/BottomSheet.js +6 -1
  214. package/dist/browser/layout/BottomSheet.js.map +1 -1
  215. package/dist/browser/layout/Discussion.js +8 -5
  216. package/dist/browser/layout/Discussion.js.map +1 -1
  217. package/dist/browser/layout/FloatingWindow.js +8 -5
  218. package/dist/browser/layout/FloatingWindow.js.map +1 -1
  219. package/dist/browser/layout/Navigation.js +7 -6
  220. package/dist/browser/layout/Navigation.js.map +1 -1
  221. package/dist/browser/layout/PageTitle.js +373 -0
  222. package/dist/browser/layout/PageTitle.js.map +1 -0
  223. package/dist/browser/layout/PanelDialog.js +8 -6
  224. package/dist/browser/layout/PanelDialog.js.map +1 -1
  225. package/dist/browser/layout/Panes.js +23 -15
  226. package/dist/browser/layout/Panes.js.map +1 -1
  227. package/dist/browser/layout/PullToRefresh.js +13 -4
  228. package/dist/browser/layout/PullToRefresh.js.map +1 -1
  229. package/dist/browser/layout/Settings.js +14 -12
  230. package/dist/browser/layout/Settings.js.map +1 -1
  231. package/dist/browser/layout/SettingsCollection.js +6 -5
  232. package/dist/browser/layout/SettingsCollection.js.map +1 -1
  233. package/dist/browser/layout/SettingsModal.js +3 -1
  234. package/dist/browser/layout/SettingsModal.js.map +1 -1
  235. package/dist/browser/layout/app-workspace-controller.js +821 -12
  236. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  237. package/dist/browser/layout/app-workspace-state.js +3 -2
  238. package/dist/browser/layout/app-workspace-state.js.map +1 -1
  239. package/dist/browser/layout/floating-window-messages.js +28 -0
  240. package/dist/browser/layout/floating-window-messages.js.map +1 -0
  241. package/dist/browser/layout/index.js +2 -0
  242. package/dist/browser/layout/index.js.map +1 -1
  243. package/dist/browser/layout/navigation-model.js.map +1 -1
  244. package/dist/browser/layout/page-title-controller.js +169 -0
  245. package/dist/browser/layout/page-title-controller.js.map +1 -0
  246. package/dist/browser/layout/panel-dialog-messages.js +20 -0
  247. package/dist/browser/layout/panel-dialog-messages.js.map +1 -0
  248. package/dist/browser/layout/panes-messages.js +48 -0
  249. package/dist/browser/layout/panes-messages.js.map +1 -0
  250. package/dist/browser/layout/refresh-messages.js +20 -0
  251. package/dist/browser/layout/refresh-messages.js.map +1 -0
  252. package/dist/browser/layout/settings-messages.js +54 -0
  253. package/dist/browser/layout/settings-messages.js.map +1 -0
  254. package/dist/browser/layout/workspace-messages.js +56 -0
  255. package/dist/browser/layout/workspace-messages.js.map +1 -0
  256. package/dist/browser/surfaces/Avatar.js +5 -5
  257. package/dist/browser/surfaces/Avatar.js.map +1 -1
  258. package/dist/browser/surfaces/ResourceCard.js +4 -2
  259. package/dist/browser/surfaces/ResourceCard.js.map +1 -1
  260. package/dist/browser/surfaces/StatCell.js +18 -6
  261. package/dist/browser/surfaces/StatCell.js.map +1 -1
  262. package/dist/browser/surfaces/Tag.js +3 -3
  263. package/dist/browser/surfaces/Tag.js.map +1 -1
  264. package/dist/browser/surfaces/avatar-messages.js +26 -0
  265. package/dist/browser/surfaces/avatar-messages.js.map +1 -0
  266. package/dist/browser/surfaces/resource-messages.js +26 -0
  267. package/dist/browser/surfaces/resource-messages.js.map +1 -0
  268. package/dist/browser/widgets/Widget.js +6 -0
  269. package/dist/browser/widgets/Widget.js.map +1 -1
  270. package/dist/ssr/actions/ContextMenu.js.map +1 -1
  271. package/dist/ssr/actions/FilterChip.js +3 -1
  272. package/dist/ssr/actions/FilterChip.js.map +1 -1
  273. package/dist/ssr/actions/SpotlightSearch.js +3 -1
  274. package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
  275. package/dist/ssr/actions/filter-messages.js +20 -0
  276. package/dist/ssr/actions/filter-messages.js.map +1 -0
  277. package/dist/ssr/actions/spotlight-messages.js +16 -0
  278. package/dist/ssr/actions/spotlight-messages.js.map +1 -0
  279. package/dist/ssr/chat/ChatComposer.js +47 -41
  280. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  281. package/dist/ssr/chat/ChatPrimitives.js +23 -21
  282. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  283. package/dist/ssr/chat/ChatRoot.js +3 -3
  284. package/dist/ssr/chat/ChatRoot.js.map +1 -1
  285. package/dist/ssr/chat/ChatTimeline.js +11 -11
  286. package/dist/ssr/chat/ChatTimeline.js.map +1 -1
  287. package/dist/ssr/chat/chat-messages.js +236 -0
  288. package/dist/ssr/chat/chat-messages.js.map +1 -0
  289. package/dist/ssr/content/Calendar.js +534 -346
  290. package/dist/ssr/content/Calendar.js.map +1 -1
  291. package/dist/ssr/content/CalendarDayView.js +800 -0
  292. package/dist/ssr/content/CalendarDayView.js.map +1 -0
  293. package/dist/ssr/content/CalendarWeekView.js +1069 -0
  294. package/dist/ssr/content/CalendarWeekView.js.map +1 -0
  295. package/dist/ssr/content/Chart.js +12 -5
  296. package/dist/ssr/content/Chart.js.map +1 -1
  297. package/dist/ssr/content/ChartExplorer.js +98 -37
  298. package/dist/ssr/content/ChartExplorer.js.map +1 -1
  299. package/dist/ssr/content/ChartExplorerControls.js +9 -7
  300. package/dist/ssr/content/ChartExplorerControls.js.map +1 -1
  301. package/dist/ssr/content/ChartFilterControls.js +52 -8
  302. package/dist/ssr/content/ChartFilterControls.js.map +1 -1
  303. package/dist/ssr/content/ChartSnapshotView.js +3 -3
  304. package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
  305. package/dist/ssr/content/DataTable.js +77 -53
  306. package/dist/ssr/content/DataTable.js.map +1 -1
  307. package/dist/ssr/content/Docs.js +3 -1
  308. package/dist/ssr/content/Docs.js.map +1 -1
  309. package/dist/ssr/content/FileBrowser.js +30 -26
  310. package/dist/ssr/content/FileBrowser.js.map +1 -1
  311. package/dist/ssr/content/FileTree.js +9 -7
  312. package/dist/ssr/content/FileTree.js.map +1 -1
  313. package/dist/ssr/content/FileView.js +37 -28
  314. package/dist/ssr/content/FileView.js.map +1 -1
  315. package/dist/ssr/content/Lightbox.js +8 -6
  316. package/dist/ssr/content/Lightbox.js.map +1 -1
  317. package/dist/ssr/content/LogEntriesTable.js +3 -3
  318. package/dist/ssr/content/LogEntriesTable.js.map +1 -1
  319. package/dist/ssr/content/MessageRow.js +24 -22
  320. package/dist/ssr/content/MessageRow.js.map +1 -1
  321. package/dist/ssr/content/Pagination.js +6 -6
  322. package/dist/ssr/content/Pagination.js.map +1 -1
  323. package/dist/ssr/content/PdfPreview.js +15 -13
  324. package/dist/ssr/content/PdfPreview.js.map +1 -1
  325. package/dist/ssr/content/RangePicker.js +3 -1
  326. package/dist/ssr/content/RangePicker.js.map +1 -1
  327. package/dist/ssr/content/StructuredDataPreview.js +3 -1
  328. package/dist/ssr/content/StructuredDataPreview.js.map +1 -1
  329. package/dist/ssr/content/Timeline.js +13 -11
  330. package/dist/ssr/content/Timeline.js.map +1 -1
  331. package/dist/ssr/content/VideoPlayer.js +5 -5
  332. package/dist/ssr/content/VideoPlayer.js.map +1 -1
  333. package/dist/ssr/content/VirtualFeed.js +6 -4
  334. package/dist/ssr/content/VirtualFeed.js.map +1 -1
  335. package/dist/ssr/content/ZoomPanViewport.js +7 -4
  336. package/dist/ssr/content/ZoomPanViewport.js.map +1 -1
  337. package/dist/ssr/content/calendar-day-scroll.js +98 -0
  338. package/dist/ssr/content/calendar-day-scroll.js.map +1 -0
  339. package/dist/ssr/content/calendar-days.js +408 -0
  340. package/dist/ssr/content/calendar-days.js.map +1 -0
  341. package/dist/ssr/content/calendar-dialogs.js +159 -0
  342. package/dist/ssr/content/calendar-dialogs.js.map +1 -0
  343. package/dist/ssr/content/calendar-messages.js +249 -3
  344. package/dist/ssr/content/calendar-messages.js.map +1 -1
  345. package/dist/ssr/content/calendar-pointer.js +19 -6
  346. package/dist/ssr/content/calendar-pointer.js.map +1 -1
  347. package/dist/ssr/content/calendar-shared.js +261 -0
  348. package/dist/ssr/content/calendar-shared.js.map +1 -0
  349. package/dist/ssr/content/calendar-time-view.js +1306 -0
  350. package/dist/ssr/content/calendar-time-view.js.map +1 -0
  351. package/dist/ssr/content/chart-messages.js +146 -0
  352. package/dist/ssr/content/chart-messages.js.map +1 -0
  353. package/dist/ssr/content/collection-selection.js +2 -0
  354. package/dist/ssr/content/collection-selection.js.map +1 -1
  355. package/dist/ssr/content/data-table-messages.js +24 -0
  356. package/dist/ssr/content/data-table-messages.js.map +1 -0
  357. package/dist/ssr/content/docs-messages.js +24 -0
  358. package/dist/ssr/content/docs-messages.js.map +1 -0
  359. package/dist/ssr/content/feed-messages.js +34 -0
  360. package/dist/ssr/content/feed-messages.js.map +1 -0
  361. package/dist/ssr/content/file-browser-messages.js +69 -0
  362. package/dist/ssr/content/file-browser-messages.js.map +1 -0
  363. package/dist/ssr/content/file-view-messages.js +64 -0
  364. package/dist/ssr/content/file-view-messages.js.map +1 -0
  365. package/dist/ssr/content/index.js.map +1 -1
  366. package/dist/ssr/content/lightbox-messages.js +36 -0
  367. package/dist/ssr/content/lightbox-messages.js.map +1 -0
  368. package/dist/ssr/content/log-entries-messages.js +20 -0
  369. package/dist/ssr/content/log-entries-messages.js.map +1 -0
  370. package/dist/ssr/content/markdown-info-block-messages.js +24 -0
  371. package/dist/ssr/content/markdown-info-block-messages.js.map +1 -0
  372. package/dist/ssr/content/markdown-info-blocks.js +3 -3
  373. package/dist/ssr/content/markdown-info-blocks.js.map +1 -1
  374. package/dist/ssr/content/markdown-links.js +2 -2
  375. package/dist/ssr/content/markdown-links.js.map +1 -1
  376. package/dist/ssr/content/markdown-reference-messages.js +30 -0
  377. package/dist/ssr/content/markdown-reference-messages.js.map +1 -0
  378. package/dist/ssr/content/pagination-messages.js +38 -0
  379. package/dist/ssr/content/pagination-messages.js.map +1 -0
  380. package/dist/ssr/content/pdf-messages.js +43 -0
  381. package/dist/ssr/content/pdf-messages.js.map +1 -0
  382. package/dist/ssr/content/range-picker-messages.js +20 -0
  383. package/dist/ssr/content/range-picker-messages.js.map +1 -0
  384. package/dist/ssr/content/structured-data-messages.js +22 -0
  385. package/dist/ssr/content/structured-data-messages.js.map +1 -0
  386. package/dist/ssr/content/timeline-messages.js +62 -0
  387. package/dist/ssr/content/timeline-messages.js.map +1 -0
  388. package/dist/ssr/content/video-messages.js +24 -0
  389. package/dist/ssr/content/video-messages.js.map +1 -0
  390. package/dist/ssr/content/viewport-messages.js +28 -0
  391. package/dist/ssr/content/viewport-messages.js.map +1 -0
  392. package/dist/ssr/feedback/HoverPreview.js +34 -6
  393. package/dist/ssr/feedback/HoverPreview.js.map +1 -1
  394. package/dist/ssr/feedback/InstallGuide.js +18 -18
  395. package/dist/ssr/feedback/InstallGuide.js.map +1 -1
  396. package/dist/ssr/feedback/install-messages.js +104 -0
  397. package/dist/ssr/feedback/install-messages.js.map +1 -0
  398. package/dist/ssr/feedback/prompt-messages.js +65 -0
  399. package/dist/ssr/feedback/prompt-messages.js.map +1 -0
  400. package/dist/ssr/feedback/prompts.js +14 -11
  401. package/dist/ssr/feedback/prompts.js.map +1 -1
  402. package/dist/ssr/feedback/toast-messages.js +18 -0
  403. package/dist/ssr/feedback/toast-messages.js.map +1 -0
  404. package/dist/ssr/feedback/toast.js +4 -3
  405. package/dist/ssr/feedback/toast.js.map +1 -1
  406. package/dist/ssr/index.js +1 -1
  407. package/dist/ssr/index.js.map +1 -1
  408. package/dist/ssr/inputs/AutocompleteEditor.js +5 -3
  409. package/dist/ssr/inputs/AutocompleteEditor.js.map +1 -1
  410. package/dist/ssr/inputs/AutocompleteSelect.js +10 -8
  411. package/dist/ssr/inputs/AutocompleteSelect.js.map +1 -1
  412. package/dist/ssr/inputs/ChoiceGroups.js +4 -0
  413. package/dist/ssr/inputs/ChoiceGroups.js.map +1 -1
  414. package/dist/ssr/inputs/ChoiceInputs.js +5 -5
  415. package/dist/ssr/inputs/ChoiceInputs.js.map +1 -1
  416. package/dist/ssr/inputs/Combobox.js +3 -1
  417. package/dist/ssr/inputs/Combobox.js.map +1 -1
  418. package/dist/ssr/inputs/FileDropTarget.js +6 -6
  419. package/dist/ssr/inputs/FileDropTarget.js.map +1 -1
  420. package/dist/ssr/inputs/FileInputs.js +29 -20
  421. package/dist/ssr/inputs/FileInputs.js.map +1 -1
  422. package/dist/ssr/inputs/MultiSelectInput.js +7 -5
  423. package/dist/ssr/inputs/MultiSelectInput.js.map +1 -1
  424. package/dist/ssr/inputs/NumberInput.js +4 -2
  425. package/dist/ssr/inputs/NumberInput.js.map +1 -1
  426. package/dist/ssr/inputs/QrScanner.js +4 -4
  427. package/dist/ssr/inputs/QrScanner.js.map +1 -1
  428. package/dist/ssr/inputs/Select.js +7 -5
  429. package/dist/ssr/inputs/Select.js.map +1 -1
  430. package/dist/ssr/inputs/SelectChip.js +3 -3
  431. package/dist/ssr/inputs/SelectChip.js.map +1 -1
  432. package/dist/ssr/inputs/SignatureInput.js +9 -3
  433. package/dist/ssr/inputs/SignatureInput.js.map +1 -1
  434. package/dist/ssr/inputs/SpecialInputs.js +4 -2
  435. package/dist/ssr/inputs/SpecialInputs.js.map +1 -1
  436. package/dist/ssr/inputs/TagEditor.js +8 -6
  437. package/dist/ssr/inputs/TagEditor.js.map +1 -1
  438. package/dist/ssr/inputs/TagsInput.js +5 -5
  439. package/dist/ssr/inputs/TagsInput.js.map +1 -1
  440. package/dist/ssr/inputs/TemplateEditor.js +5 -5
  441. package/dist/ssr/inputs/TemplateEditor.js.map +1 -1
  442. package/dist/ssr/inputs/TextInput.js +3 -1
  443. package/dist/ssr/inputs/TextInput.js.map +1 -1
  444. package/dist/ssr/inputs/completion-messages.js +24 -0
  445. package/dist/ssr/inputs/completion-messages.js.map +1 -0
  446. package/dist/ssr/inputs/file-drop-messages.js +63 -0
  447. package/dist/ssr/inputs/file-drop-messages.js.map +1 -0
  448. package/dist/ssr/inputs/file-drop.js.map +1 -1
  449. package/dist/ssr/inputs/file-input-messages.js +60 -0
  450. package/dist/ssr/inputs/file-input-messages.js.map +1 -0
  451. package/dist/ssr/inputs/icon-messages.js +22 -0
  452. package/dist/ssr/inputs/icon-messages.js.map +1 -0
  453. package/dist/ssr/inputs/input-messages.js +38 -0
  454. package/dist/ssr/inputs/input-messages.js.map +1 -0
  455. package/dist/ssr/inputs/markdown/MarkdownEditor.js +9 -5
  456. package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
  457. package/dist/ssr/inputs/markdown/Toolbar.js +13 -13
  458. package/dist/ssr/inputs/markdown/Toolbar.js.map +1 -1
  459. package/dist/ssr/inputs/markdown/editor-messages.js +43 -0
  460. package/dist/ssr/inputs/markdown/editor-messages.js.map +1 -0
  461. package/dist/ssr/inputs/markdown/toolbar-messages.js +40 -0
  462. package/dist/ssr/inputs/markdown/toolbar-messages.js.map +1 -0
  463. package/dist/ssr/inputs/qr-messages.js +26 -0
  464. package/dist/ssr/inputs/qr-messages.js.map +1 -0
  465. package/dist/ssr/inputs/select-messages.js +63 -0
  466. package/dist/ssr/inputs/select-messages.js.map +1 -0
  467. package/dist/ssr/inputs/tag-messages.js +44 -0
  468. package/dist/ssr/inputs/tag-messages.js.map +1 -0
  469. package/dist/ssr/inputs/template-messages.js +22 -0
  470. package/dist/ssr/inputs/template-messages.js.map +1 -0
  471. package/dist/ssr/internal/render-error-messages.js +20 -0
  472. package/dist/ssr/internal/render-error-messages.js.map +1 -0
  473. package/dist/ssr/internal/render-error.js +3 -1
  474. package/dist/ssr/internal/render-error.js.map +1 -1
  475. package/dist/ssr/internal/text-selection.js +101 -0
  476. package/dist/ssr/internal/text-selection.js.map +1 -0
  477. package/dist/ssr/intl/messages.js +6 -1155
  478. package/dist/ssr/intl/messages.js.map +1 -1
  479. package/dist/ssr/layout/AppWorkspace.js +219 -103
  480. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  481. package/dist/ssr/layout/BottomSheet.js +1 -0
  482. package/dist/ssr/layout/BottomSheet.js.map +1 -1
  483. package/dist/ssr/layout/Discussion.js +8 -5
  484. package/dist/ssr/layout/Discussion.js.map +1 -1
  485. package/dist/ssr/layout/FloatingWindow.js +8 -5
  486. package/dist/ssr/layout/FloatingWindow.js.map +1 -1
  487. package/dist/ssr/layout/Navigation.js +6 -5
  488. package/dist/ssr/layout/Navigation.js.map +1 -1
  489. package/dist/ssr/layout/PageTitle.js +256 -0
  490. package/dist/ssr/layout/PageTitle.js.map +1 -0
  491. package/dist/ssr/layout/PanelDialog.js +8 -6
  492. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  493. package/dist/ssr/layout/Panes.js +22 -14
  494. package/dist/ssr/layout/Panes.js.map +1 -1
  495. package/dist/ssr/layout/PullToRefresh.js +13 -4
  496. package/dist/ssr/layout/PullToRefresh.js.map +1 -1
  497. package/dist/ssr/layout/Settings.js +14 -12
  498. package/dist/ssr/layout/Settings.js.map +1 -1
  499. package/dist/ssr/layout/SettingsCollection.js +6 -5
  500. package/dist/ssr/layout/SettingsCollection.js.map +1 -1
  501. package/dist/ssr/layout/SettingsModal.js +3 -1
  502. package/dist/ssr/layout/SettingsModal.js.map +1 -1
  503. package/dist/ssr/layout/app-workspace-controller.js +821 -12
  504. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  505. package/dist/ssr/layout/app-workspace-state.js +3 -2
  506. package/dist/ssr/layout/app-workspace-state.js.map +1 -1
  507. package/dist/ssr/layout/floating-window-messages.js +28 -0
  508. package/dist/ssr/layout/floating-window-messages.js.map +1 -0
  509. package/dist/ssr/layout/index.js +2 -0
  510. package/dist/ssr/layout/index.js.map +1 -1
  511. package/dist/ssr/layout/navigation-model.js.map +1 -1
  512. package/dist/ssr/layout/page-title-controller.js +169 -0
  513. package/dist/ssr/layout/page-title-controller.js.map +1 -0
  514. package/dist/ssr/layout/panel-dialog-messages.js +20 -0
  515. package/dist/ssr/layout/panel-dialog-messages.js.map +1 -0
  516. package/dist/ssr/layout/panes-messages.js +48 -0
  517. package/dist/ssr/layout/panes-messages.js.map +1 -0
  518. package/dist/ssr/layout/refresh-messages.js +20 -0
  519. package/dist/ssr/layout/refresh-messages.js.map +1 -0
  520. package/dist/ssr/layout/settings-messages.js +54 -0
  521. package/dist/ssr/layout/settings-messages.js.map +1 -0
  522. package/dist/ssr/layout/workspace-messages.js +56 -0
  523. package/dist/ssr/layout/workspace-messages.js.map +1 -0
  524. package/dist/ssr/surfaces/Avatar.js +5 -5
  525. package/dist/ssr/surfaces/Avatar.js.map +1 -1
  526. package/dist/ssr/surfaces/ResourceCard.js +4 -2
  527. package/dist/ssr/surfaces/ResourceCard.js.map +1 -1
  528. package/dist/ssr/surfaces/StatCell.js +2 -2
  529. package/dist/ssr/surfaces/StatCell.js.map +1 -1
  530. package/dist/ssr/surfaces/Tag.js +3 -3
  531. package/dist/ssr/surfaces/Tag.js.map +1 -1
  532. package/dist/ssr/surfaces/avatar-messages.js +26 -0
  533. package/dist/ssr/surfaces/avatar-messages.js.map +1 -0
  534. package/dist/ssr/surfaces/resource-messages.js +26 -0
  535. package/dist/ssr/surfaces/resource-messages.js.map +1 -0
  536. package/dist/ssr/widgets/Widget.js +6 -0
  537. package/dist/ssr/widgets/Widget.js.map +1 -1
  538. package/dist/styles.css +1 -1
  539. package/dist/types/actions/filter-messages.d.ts +8 -0
  540. package/dist/types/actions/spotlight-messages.d.ts +8 -0
  541. package/dist/types/chat/chat-messages.d.ts +116 -0
  542. package/dist/types/content/Calendar.d.ts +91 -0
  543. package/dist/types/content/CalendarDayView.d.ts +7 -0
  544. package/dist/types/content/CalendarWeekView.d.ts +7 -0
  545. package/dist/types/content/ChartExplorer.d.ts +36 -1
  546. package/dist/types/content/ChartFilterControls.d.ts +6 -1
  547. package/dist/types/content/DataTable.d.ts +7 -0
  548. package/dist/types/content/FileView.d.ts +0 -10
  549. package/dist/types/content/calendar-day-scroll.d.ts +42 -0
  550. package/dist/types/content/calendar-days.d.ts +192 -0
  551. package/dist/types/content/calendar-dialogs.d.ts +22 -0
  552. package/dist/types/content/calendar-messages.d.ts +119 -1
  553. package/dist/types/content/calendar-pointer.d.ts +9 -0
  554. package/dist/types/content/calendar-shared.d.ts +69 -0
  555. package/dist/types/content/calendar-time-view.d.ts +252 -0
  556. package/dist/types/content/chart-messages.d.ts +37 -0
  557. package/dist/types/content/data-table-messages.d.ts +10 -0
  558. package/dist/types/content/docs-messages.d.ts +10 -0
  559. package/dist/types/content/feed-messages.d.ts +15 -0
  560. package/dist/types/content/file-browser-messages.d.ts +33 -0
  561. package/dist/types/content/file-view-messages.d.ts +30 -0
  562. package/dist/types/content/index.d.ts +2 -2
  563. package/dist/types/content/lightbox-messages.d.ts +16 -0
  564. package/dist/types/content/log-entries-messages.d.ts +8 -0
  565. package/dist/types/content/markdown-info-block-messages.d.ts +12 -0
  566. package/dist/types/content/markdown-reference-messages.d.ts +15 -0
  567. package/dist/types/content/pagination-messages.d.ts +17 -0
  568. package/dist/types/content/pdf-messages.d.ts +20 -0
  569. package/dist/types/content/range-picker-messages.d.ts +8 -0
  570. package/dist/types/content/structured-data-messages.d.ts +9 -0
  571. package/dist/types/content/timeline-messages.d.ts +29 -0
  572. package/dist/types/content/video-messages.d.ts +10 -0
  573. package/dist/types/content/viewport-messages.d.ts +12 -0
  574. package/dist/types/feedback/install-messages.d.ts +50 -0
  575. package/dist/types/feedback/prompt-messages.d.ts +31 -0
  576. package/dist/types/feedback/toast-messages.d.ts +9 -0
  577. package/dist/types/index.d.ts +1 -0
  578. package/dist/types/inputs/completion-messages.d.ts +10 -0
  579. package/dist/types/inputs/file-drop-messages.d.ts +30 -0
  580. package/dist/types/inputs/file-drop.d.ts +3 -3
  581. package/dist/types/inputs/file-input-messages.d.ts +28 -0
  582. package/dist/types/inputs/icon-messages.d.ts +9 -0
  583. package/dist/types/inputs/input-messages.d.ts +17 -0
  584. package/dist/types/inputs/markdown/editor-messages.d.ts +20 -0
  585. package/dist/types/inputs/markdown/toolbar-messages.d.ts +18 -0
  586. package/dist/types/inputs/qr-messages.d.ts +11 -0
  587. package/dist/types/inputs/select-messages.d.ts +30 -0
  588. package/dist/types/inputs/tag-messages.d.ts +20 -0
  589. package/dist/types/inputs/template-messages.d.ts +9 -0
  590. package/dist/types/internal/render-error-messages.d.ts +8 -0
  591. package/dist/types/internal/text-selection.d.ts +18 -0
  592. package/dist/types/intl/messages.d.ts +3 -544
  593. package/dist/types/layout/AppWorkspace.d.ts +42 -5
  594. package/dist/types/layout/PageTitle.d.ts +65 -0
  595. package/dist/types/layout/app-workspace-controller.d.ts +12 -0
  596. package/dist/types/layout/app-workspace-state.d.ts +3 -2
  597. package/dist/types/layout/floating-window-messages.d.ts +12 -0
  598. package/dist/types/layout/index.d.ts +3 -0
  599. package/dist/types/layout/navigation-model.d.ts +7 -0
  600. package/dist/types/layout/page-title-controller.d.ts +13 -0
  601. package/dist/types/layout/panel-dialog-messages.d.ts +8 -0
  602. package/dist/types/layout/panes-messages.d.ts +22 -0
  603. package/dist/types/layout/refresh-messages.d.ts +8 -0
  604. package/dist/types/layout/settings-messages.d.ts +25 -0
  605. package/dist/types/layout/workspace-messages.d.ts +26 -0
  606. package/dist/types/surfaces/StatCell.d.ts +5 -0
  607. package/dist/types/surfaces/avatar-messages.d.ts +11 -0
  608. package/dist/types/surfaces/resource-messages.d.ts +11 -0
  609. package/dist/types/widgets/Widget.d.ts +5 -1
  610. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["inputs/file-drop.ts"],"sourcesContent":["import { text } from \"@k2b/stdlib\";\nimport { checkMimeType } from \"@k2b/stdlib/browser\";\nimport { type Accessor, createSignal } from \"solid-js\";\nimport { announce } from \"../feedback/announce\";\nimport { toast } from \"../feedback/toast\";\nimport type { UiMessages } from \"../intl/messages\";\n\nexport type FileDropRejection = {\n file: File;\n /** `type` misses `accept`, `size` exceeds `maxSize`, `count` is past `maxFiles` or the single file of `multiple={false}`. */\n reason: \"type\" | \"size\" | \"count\";\n};\n\nexport type FileDropDetails = {\n /** The drop's data, readable only while `onDrop` runs synchronously; read folder entries before the first `await`. */\n dataTransfer: DataTransfer;\n /** Files left out by `accept`, `maxSize`, or the file count; the user has already been told. */\n rejected: readonly FileDropRejection[];\n};\n\nexport type FileDropOptions = {\n /** One sentence that says what dropping does here, such as \"Drop to attach to the message\". */\n label: string;\n /** `<input accept>` syntax, such as `\"image/*,.pdf\"`. */\n accept?: string;\n /** Defaults to `true`; `false` takes the first fitting file. */\n multiple?: boolean;\n /** The most files one drop hands over. */\n maxFiles?: number;\n /** The largest file in bytes. */\n maxSize?: number;\n disabled?: boolean;\n /**\n * Called synchronously in the drop with the files that fit. `files` is empty only when the drop carried no file\n * objects at all, as some engines hand over dropped folders; `details.dataTransfer.items` still has their entries.\n */\n onDrop: (files: File[], details: FileDropDetails) => void | Promise<void>;\n};\n\nexport type FileDropTargetEntry = {\n options: FileDropOptions;\n messages: () => UiMessages;\n locale: () => string;\n /** Set for regions: the area the overlay covers. Specific targets are keyed by their element. */\n region?: () => Element | undefined;\n /** Set for regions: where the target itself is rendered; a region whose host is hidden takes no drops. */\n host?: () => Element | undefined;\n};\n\nexport type FileDropHover = { entry: FileDropTargetEntry; element: Element; invalid: boolean };\n\nexport type FileDropSession = {\n /** Regions that show their overlay during this drag: eligible, visible, and not inside another shown region. */\n shown: readonly FileDropTargetEntry[];\n hover: FileDropHover | null;\n};\n\nexport type FileDropEngine = {\n session: Accessor<FileDropSession | null>;\n /** Changes on every drag movement, so overlays can follow a region that moved or resized. */\n frame: Accessor<number>;\n addRegion: (entry: FileDropTargetEntry) => () => void;\n setTarget: (element: Element, entry: FileDropTargetEntry) => void;\n};\n\n/** The marker a hovered specific target carries for its ring; regions show their own overlay instead. */\nexport const FILE_DROP_ATTRIBUTE = \"data-file-drop\";\n\n/** Where a region without `for` looks for its area: the nearest dialog, workspace detail, or workspace main area. */\nexport const FILE_DROP_DEFAULT_REGION = \"dialog, .k2b-app-workspace__detail, .k2b-app-workspace__main\";\n\n/**\n * The type every drag that starts in a page carries. Such a drag holds page content, never files from outside, even\n * an image that carries one. Marking the drag itself leaves nothing behind when it never reports its end, as when its\n * start is cancelled or its source is removed.\n */\nconst PAGE_DRAG_TYPE = \"application/x-k2b-page-drag\";\n\n/** How long after the last drag event a pointer move means the drag ended; a drag over the page repeats them sooner. */\nconst DRAG_SILENCE_MS = 600;\n\nconst engines = new WeakMap<Document, FileDropEngine>();\n\nconst isFileDrag = (event: DragEvent) => {\n const types = Array.from(event.dataTransfer?.types ?? []);\n return types.includes(\"Files\") && !types.includes(PAGE_DRAG_TYPE);\n};\n\nconst elementOf = (target: EventTarget | null): Element | null =>\n target instanceof Element ? target : target instanceof Node ? target.parentElement : null;\n\nconst isModal = (dialog: Element) => {\n try {\n return dialog.matches(\":modal\");\n } catch {\n // An engine without `:modal` has no modal dialogs to defer to.\n return false;\n }\n};\n\n/**\n * The topmost modal dialog. Everything outside of it is inert, so a drag over the page lands inside it; only a drag\n * over other top-layer content falls back to the last modal dialog in the document.\n */\nconst topModal = (doc: Document, target: EventTarget | null): Element | null => {\n for (let dialog = elementOf(target)?.closest(\"dialog\"); dialog; dialog = dialog.parentElement?.closest(\"dialog\"))\n if (isModal(dialog)) return dialog;\n return Array.from(doc.querySelectorAll(\"dialog[open]\")).filter(isModal).at(-1) ?? null;\n};\n\n/** Sorts dropped files into the ones a target takes and the ones it leaves out, in drop order. */\nexport const partitionDroppedFiles = (\n files: readonly File[],\n options: Pick<FileDropOptions, \"accept\" | \"multiple\" | \"maxFiles\" | \"maxSize\">,\n): { accepted: File[]; rejected: FileDropRejection[] } => {\n const limit = options.multiple === false ? 1 : (options.maxFiles ?? Number.POSITIVE_INFINITY);\n const accepted: File[] = [];\n const rejected: FileDropRejection[] = [];\n for (const file of files) {\n if (options.accept && !checkMimeType(file, options.accept)) rejected.push({ file, reason: \"type\" });\n else if (options.maxSize !== undefined && file.size > options.maxSize) rejected.push({ file, reason: \"size\" });\n else if (accepted.length >= limit) rejected.push({ file, reason: \"count\" });\n else accepted.push(file);\n }\n return { accepted, rejected };\n};\n\n/**\n * During a drag only the types are readable, and only in some engines. A drag is refused when none of them can fit.\n * An extension in `accept` matches by file name, and systems report differing types for one extension (a `.csv` may be\n * `application/vnd.ms-excel`), so with one the drop decides.\n */\nexport const refusesDraggedTypes = (types: readonly string[], accept: string | undefined): boolean => {\n if (!accept || accept.split(\",\").some((entry) => entry.trim().startsWith(\".\"))) return false;\n return types.length > 0 && types.every((type) => type !== \"\" && !checkMimeType(type, accept));\n};\n\nconst invalidDrag = (event: DragEvent, options: FileDropOptions) =>\n refusesDraggedTypes(\n Array.from(event.dataTransfer?.items ?? [])\n .filter((item) => item.kind === \"file\")\n .map((item) => item.type),\n options.accept,\n );\n\nconst MAX_NAMES = 3;\nconst nameList = (files: readonly File[], messages: UiMessages) => {\n const names = files.slice(0, MAX_NAMES).map((file) => file.name);\n return files.length > MAX_NAMES ? `${names.join(\", \")} ${messages.fileDropMore({ count: files.length - MAX_NAMES })}` : names.join(\", \");\n};\n\nexport const fileDropRejectionMessage = (\n rejected: readonly FileDropRejection[],\n options: Pick<FileDropOptions, \"multiple\" | \"maxFiles\" | \"maxSize\">,\n messages: UiMessages,\n locale: string,\n): string => {\n const lines: string[] = [];\n const of = (reason: FileDropRejection[\"reason\"]) => rejected.filter((entry) => entry.reason === reason).map((entry) => entry.file);\n const type = of(\"type\");\n const size = of(\"size\");\n const count = of(\"count\");\n if (type.length) lines.push(messages.fileDropRejectedType({ names: nameList(type, messages) }));\n if (size.length)\n lines.push(\n messages.fileDropRejectedSize({ names: nameList(size, messages), limit: text.pprintBytes(options.maxSize ?? 0, { locale }) }),\n );\n if (count.length)\n lines.push(\n messages.fileDropRejectedCount({ names: nameList(count, messages), max: options.multiple === false ? 1 : (options.maxFiles ?? 1) }),\n );\n return lines.join(\"\\n\");\n};\n\nconst createEngine = (doc: Document): FileDropEngine => {\n const view = doc.defaultView;\n const regions = new Set<FileDropTargetEntry>();\n const targets = new WeakMap<Element, FileDropTargetEntry>();\n const [session, setSession] = createSignal<FileDropSession | null>(null);\n const [frame, setFrame] = createSignal(0);\n /** Elements the drag has entered and not yet left; the drag is over the window while any remains. */\n const entered = new Set<EventTarget>();\n let lastDragEvent = 0;\n let marked: Element | null = null;\n let frameRequest = 0;\n\n const mark = (hover: FileDropHover | null) => {\n if (marked && marked !== hover?.element) marked.removeAttribute(FILE_DROP_ATTRIBUTE);\n marked = null;\n if (!hover || hover.entry.region) return;\n marked = hover.element;\n marked.setAttribute(FILE_DROP_ATTRIBUTE, hover.invalid ? \"invalid\" : \"over\");\n };\n\n const regionElement = (entry: FileDropTargetEntry) => {\n const element = entry.region?.();\n return element?.isConnected ? element : undefined;\n };\n\n /** Whether nothing between the target's host and its area hides it, as a dialog stack hides its lower levels. */\n const displayed = (host: Element | undefined, area: Element) => {\n for (let element: Element | null | undefined = host; element && element !== area; element = element.parentElement)\n if (view?.getComputedStyle(element).display === \"none\") return false;\n return true;\n };\n\n /** A region takes part when it is enabled, displayed, and not behind a modal dialog it is not inside of. */\n const eligible = (entry: FileDropTargetEntry, modal: Element | null) => {\n const element = regionElement(entry);\n if (!element || entry.options.disabled) return false;\n return (!modal || modal.contains(element)) && displayed(entry.host?.(), element);\n };\n const rendered = (element: Element) => element === doc.documentElement || element.getClientRects().length > 0;\n\n const begin = (target: EventTarget | null) => {\n const modal = topModal(doc, target);\n const candidates = [...regions].filter((entry) => eligible(entry, modal) && rendered(regionElement(entry)!));\n // The latest region on an element replaces earlier ones; a region inside another shown one acts as a specific target.\n const byElement = new Map<Element, FileDropTargetEntry>();\n for (const entry of candidates) byElement.set(regionElement(entry)!, entry);\n const shown = [...byElement].filter(\n ([element]) => ![...byElement.keys()].some((other) => other !== element && other.contains(element)),\n );\n setSession({ shown: shown.map(([, entry]) => entry), hover: null });\n const first = shown[0]?.[1];\n if (first) announce(first.options.label);\n };\n\n const end = () => {\n entered.clear();\n mark(null);\n if (session()) setSession(null);\n };\n\n const resolve = (target: EventTarget | null): { entry: FileDropTargetEntry; element: Element } | null => {\n const modal = topModal(doc, target);\n for (let element = elementOf(target); element; element = element.parentElement) {\n const specific = targets.get(element);\n if (specific && !specific.options.disabled) return { entry: specific, element };\n let region: FileDropTargetEntry | undefined;\n for (const entry of regions) if (regionElement(entry) === element && eligible(entry, modal)) region = entry;\n if (region) return { entry: region, element };\n }\n return null;\n };\n\n const hoverFrom = (event: DragEvent) => {\n const current = session();\n if (!current) return null;\n const found = resolve(event.target);\n const hover = found ? { ...found, invalid: invalidDrag(event, found.entry.options) } : null;\n const previous = current.hover;\n if (previous?.entry !== hover?.entry || previous?.element !== hover?.element || previous?.invalid !== hover?.invalid) {\n mark(hover);\n setSession({ ...current, hover });\n }\n return hover;\n };\n\n /** Over a page with a region, a file never falls through to the browser, which would open it and leave the page. */\n const guarding = () => [...regions].some((entry) => regionElement(entry));\n\n const accept = (event: DragEvent, hover: FileDropHover | null) => {\n if (!hover && !guarding()) return;\n event.preventDefault();\n if (event.dataTransfer) event.dataTransfer.dropEffect = hover && !hover.invalid ? \"copy\" : \"none\";\n };\n\n const requestFrame = () => {\n if (frameRequest || !view) return;\n frameRequest = view.requestAnimationFrame(() => {\n frameRequest = 0;\n setFrame((value) => value + 1);\n });\n };\n\n const deliver = (entry: FileDropTargetEntry, dataTransfer: DataTransfer) => {\n const { options } = entry;\n const files = Array.from(dataTransfer.files);\n const { accepted, rejected } = partitionDroppedFiles(files, options);\n const messages = entry.messages();\n if (rejected.length) toast.error(fileDropRejectionMessage(rejected, options, messages, entry.locale()));\n if (!accepted.length && files.length) return;\n if (accepted.length)\n announce(\n accepted.length === 1\n ? messages.fileDropDroppedOne({ name: accepted[0]!.name })\n : messages.fileDropDropped({ count: accepted.length }),\n );\n void options.onDrop(accepted, { dataTransfer, rejected });\n };\n\n const listeners: Record<string, (event: Event) => void> = {\n dragstart: (event) => {\n (event as DragEvent).dataTransfer?.setData(PAGE_DRAG_TYPE, \"\");\n },\n dragenter: (event) => {\n const drag = event as DragEvent;\n if (!isFileDrag(drag)) return;\n lastDragEvent = event.timeStamp;\n if (event.target) entered.add(event.target);\n if (!session()) begin(event.target);\n accept(drag, hoverFrom(drag));\n },\n dragover: (event) => {\n const drag = event as DragEvent;\n if (!isFileDrag(drag)) return;\n lastDragEvent = event.timeStamp;\n // An engine may skip the first dragenter; the drag still counts as over the window.\n if (!session()) {\n if (event.target) entered.add(event.target);\n begin(event.target);\n }\n accept(drag, hoverFrom(drag));\n requestFrame();\n },\n dragleave: (event) => {\n if (!session()) return;\n if (event.target) entered.delete(event.target);\n // An element removed during the drag never reports leaving.\n for (const target of entered) if (target instanceof Node && !target.isConnected) entered.delete(target);\n if (entered.size === 0) end();\n },\n drop: (event) => {\n const drag = event as DragEvent;\n if (!isFileDrag(drag)) return;\n const found = resolve(event.target);\n end();\n if (!found) {\n if (guarding()) event.preventDefault();\n return;\n }\n // The most specific target owns the drop; editors and other handlers below it never see the files.\n event.preventDefault();\n event.stopPropagation();\n if (drag.dataTransfer) deliver(found.entry, drag.dataTransfer);\n },\n keydown: (event) => {\n if ((event as KeyboardEvent).key === \"Escape\" && session()) end();\n },\n // Engines send no pointer moves during a drag: one long after the last drag event means the drag ended somewhere the\n // page did not see. One right after it belongs to another pointer, such as a second finger on a touch screen.\n pointermove: (event) => {\n if (session() && event.timeStamp - lastDragEvent > DRAG_SILENCE_MS) end();\n },\n visibilitychange: () => {\n if (doc.visibilityState === \"hidden\") end();\n },\n };\n\n let installed = false;\n const install = () => {\n if (installed || !view) return;\n installed = true;\n for (const [type, listener] of Object.entries(listeners))\n (type === \"visibilitychange\" ? doc : view).addEventListener(type, listener, { capture: true });\n };\n\n return {\n session,\n frame,\n addRegion: (entry) => {\n install();\n regions.add(entry);\n return () => {\n regions.delete(entry);\n const current = session();\n if (current?.hover?.entry === entry) {\n mark(null);\n setSession({ ...current, hover: null });\n }\n };\n },\n setTarget: (element, entry) => {\n install();\n targets.set(element, entry);\n },\n };\n};\n\n/**\n * The document an element lives in. A freshly rendered element still belongs to the inert document of the template it\n * was cloned from; until it is inserted, that is the page's document.\n */\nexport const liveDocument = (element: Element): Document => (element.ownerDocument.defaultView ? element.ownerDocument : document);\n\n/** The one drag tracker of a document, shared by every drop target in it. */\nexport const fileDropEngine = (doc: Document): FileDropEngine => {\n let engine = engines.get(doc);\n if (!engine) {\n engine = createEngine(doc);\n engines.set(doc, engine);\n }\n return engine;\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["inputs/file-drop.ts"],"sourcesContent":["import { text } from \"@k2b/stdlib\";\nimport { checkMimeType } from \"@k2b/stdlib/browser\";\nimport { type Accessor, createSignal } from \"solid-js\";\nimport { announce } from \"../feedback/announce\";\nimport { toast } from \"../feedback/toast\";\nimport type { FileDropMessages } from \"./file-drop-messages\";\n\nexport type FileDropRejection = {\n file: File;\n /** `type` misses `accept`, `size` exceeds `maxSize`, `count` is past `maxFiles` or the single file of `multiple={false}`. */\n reason: \"type\" | \"size\" | \"count\";\n};\n\nexport type FileDropDetails = {\n /** The drop's data, readable only while `onDrop` runs synchronously; read folder entries before the first `await`. */\n dataTransfer: DataTransfer;\n /** Files left out by `accept`, `maxSize`, or the file count; the user has already been told. */\n rejected: readonly FileDropRejection[];\n};\n\nexport type FileDropOptions = {\n /** One sentence that says what dropping does here, such as \"Drop to attach to the message\". */\n label: string;\n /** `<input accept>` syntax, such as `\"image/*,.pdf\"`. */\n accept?: string;\n /** Defaults to `true`; `false` takes the first fitting file. */\n multiple?: boolean;\n /** The most files one drop hands over. */\n maxFiles?: number;\n /** The largest file in bytes. */\n maxSize?: number;\n disabled?: boolean;\n /**\n * Called synchronously in the drop with the files that fit. `files` is empty only when the drop carried no file\n * objects at all, as some engines hand over dropped folders; `details.dataTransfer.items` still has their entries.\n */\n onDrop: (files: File[], details: FileDropDetails) => void | Promise<void>;\n};\n\nexport type FileDropTargetEntry = {\n options: FileDropOptions;\n messages: () => FileDropMessages;\n locale: () => string;\n /** Set for regions: the area the overlay covers. Specific targets are keyed by their element. */\n region?: () => Element | undefined;\n /** Set for regions: where the target itself is rendered; a region whose host is hidden takes no drops. */\n host?: () => Element | undefined;\n};\n\nexport type FileDropHover = { entry: FileDropTargetEntry; element: Element; invalid: boolean };\n\nexport type FileDropSession = {\n /** Regions that show their overlay during this drag: eligible, visible, and not inside another shown region. */\n shown: readonly FileDropTargetEntry[];\n hover: FileDropHover | null;\n};\n\nexport type FileDropEngine = {\n session: Accessor<FileDropSession | null>;\n /** Changes on every drag movement, so overlays can follow a region that moved or resized. */\n frame: Accessor<number>;\n addRegion: (entry: FileDropTargetEntry) => () => void;\n setTarget: (element: Element, entry: FileDropTargetEntry) => void;\n};\n\n/** The marker a hovered specific target carries for its ring; regions show their own overlay instead. */\nexport const FILE_DROP_ATTRIBUTE = \"data-file-drop\";\n\n/** Where a region without `for` looks for its area: the nearest dialog, workspace detail, or workspace main area. */\nexport const FILE_DROP_DEFAULT_REGION = \"dialog, .k2b-app-workspace__detail, .k2b-app-workspace__main\";\n\n/**\n * The type every drag that starts in a page carries. Such a drag holds page content, never files from outside, even\n * an image that carries one. Marking the drag itself leaves nothing behind when it never reports its end, as when its\n * start is cancelled or its source is removed.\n */\nconst PAGE_DRAG_TYPE = \"application/x-k2b-page-drag\";\n\n/** How long after the last drag event a pointer move means the drag ended; a drag over the page repeats them sooner. */\nconst DRAG_SILENCE_MS = 600;\n\nconst engines = new WeakMap<Document, FileDropEngine>();\n\nconst isFileDrag = (event: DragEvent) => {\n const types = Array.from(event.dataTransfer?.types ?? []);\n return types.includes(\"Files\") && !types.includes(PAGE_DRAG_TYPE);\n};\n\nconst elementOf = (target: EventTarget | null): Element | null =>\n target instanceof Element ? target : target instanceof Node ? target.parentElement : null;\n\nconst isModal = (dialog: Element) => {\n try {\n return dialog.matches(\":modal\");\n } catch {\n // An engine without `:modal` has no modal dialogs to defer to.\n return false;\n }\n};\n\n/**\n * The topmost modal dialog. Everything outside of it is inert, so a drag over the page lands inside it; only a drag\n * over other top-layer content falls back to the last modal dialog in the document.\n */\nconst topModal = (doc: Document, target: EventTarget | null): Element | null => {\n for (let dialog = elementOf(target)?.closest(\"dialog\"); dialog; dialog = dialog.parentElement?.closest(\"dialog\"))\n if (isModal(dialog)) return dialog;\n return Array.from(doc.querySelectorAll(\"dialog[open]\")).filter(isModal).at(-1) ?? null;\n};\n\n/** Sorts dropped files into the ones a target takes and the ones it leaves out, in drop order. */\nexport const partitionDroppedFiles = (\n files: readonly File[],\n options: Pick<FileDropOptions, \"accept\" | \"multiple\" | \"maxFiles\" | \"maxSize\">,\n): { accepted: File[]; rejected: FileDropRejection[] } => {\n const limit = options.multiple === false ? 1 : (options.maxFiles ?? Number.POSITIVE_INFINITY);\n const accepted: File[] = [];\n const rejected: FileDropRejection[] = [];\n for (const file of files) {\n if (options.accept && !checkMimeType(file, options.accept)) rejected.push({ file, reason: \"type\" });\n else if (options.maxSize !== undefined && file.size > options.maxSize) rejected.push({ file, reason: \"size\" });\n else if (accepted.length >= limit) rejected.push({ file, reason: \"count\" });\n else accepted.push(file);\n }\n return { accepted, rejected };\n};\n\n/**\n * During a drag only the types are readable, and only in some engines. A drag is refused when none of them can fit.\n * An extension in `accept` matches by file name, and systems report differing types for one extension (a `.csv` may be\n * `application/vnd.ms-excel`), so with one the drop decides.\n */\nexport const refusesDraggedTypes = (types: readonly string[], accept: string | undefined): boolean => {\n if (!accept || accept.split(\",\").some((entry) => entry.trim().startsWith(\".\"))) return false;\n return types.length > 0 && types.every((type) => type !== \"\" && !checkMimeType(type, accept));\n};\n\nconst invalidDrag = (event: DragEvent, options: FileDropOptions) =>\n refusesDraggedTypes(\n Array.from(event.dataTransfer?.items ?? [])\n .filter((item) => item.kind === \"file\")\n .map((item) => item.type),\n options.accept,\n );\n\nconst MAX_NAMES = 3;\nconst nameList = (files: readonly File[], messages: FileDropMessages) => {\n const names = files.slice(0, MAX_NAMES).map((file) => file.name);\n return files.length > MAX_NAMES ? `${names.join(\", \")} ${messages.fileDropMore({ count: files.length - MAX_NAMES })}` : names.join(\", \");\n};\n\nexport const fileDropRejectionMessage = (\n rejected: readonly FileDropRejection[],\n options: Pick<FileDropOptions, \"multiple\" | \"maxFiles\" | \"maxSize\">,\n messages: FileDropMessages,\n locale: string,\n): string => {\n const lines: string[] = [];\n const of = (reason: FileDropRejection[\"reason\"]) => rejected.filter((entry) => entry.reason === reason).map((entry) => entry.file);\n const type = of(\"type\");\n const size = of(\"size\");\n const count = of(\"count\");\n if (type.length) lines.push(messages.fileDropRejectedType({ names: nameList(type, messages) }));\n if (size.length)\n lines.push(\n messages.fileDropRejectedSize({ names: nameList(size, messages), limit: text.pprintBytes(options.maxSize ?? 0, { locale }) }),\n );\n if (count.length)\n lines.push(\n messages.fileDropRejectedCount({ names: nameList(count, messages), max: options.multiple === false ? 1 : (options.maxFiles ?? 1) }),\n );\n return lines.join(\"\\n\");\n};\n\nconst createEngine = (doc: Document): FileDropEngine => {\n const view = doc.defaultView;\n const regions = new Set<FileDropTargetEntry>();\n const targets = new WeakMap<Element, FileDropTargetEntry>();\n const [session, setSession] = createSignal<FileDropSession | null>(null);\n const [frame, setFrame] = createSignal(0);\n /** Elements the drag has entered and not yet left; the drag is over the window while any remains. */\n const entered = new Set<EventTarget>();\n let lastDragEvent = 0;\n let marked: Element | null = null;\n let frameRequest = 0;\n\n const mark = (hover: FileDropHover | null) => {\n if (marked && marked !== hover?.element) marked.removeAttribute(FILE_DROP_ATTRIBUTE);\n marked = null;\n if (!hover || hover.entry.region) return;\n marked = hover.element;\n marked.setAttribute(FILE_DROP_ATTRIBUTE, hover.invalid ? \"invalid\" : \"over\");\n };\n\n const regionElement = (entry: FileDropTargetEntry) => {\n const element = entry.region?.();\n return element?.isConnected ? element : undefined;\n };\n\n /** Whether nothing between the target's host and its area hides it, as a dialog stack hides its lower levels. */\n const displayed = (host: Element | undefined, area: Element) => {\n for (let element: Element | null | undefined = host; element && element !== area; element = element.parentElement)\n if (view?.getComputedStyle(element).display === \"none\") return false;\n return true;\n };\n\n /** A region takes part when it is enabled, displayed, and not behind a modal dialog it is not inside of. */\n const eligible = (entry: FileDropTargetEntry, modal: Element | null) => {\n const element = regionElement(entry);\n if (!element || entry.options.disabled) return false;\n return (!modal || modal.contains(element)) && displayed(entry.host?.(), element);\n };\n const rendered = (element: Element) => element === doc.documentElement || element.getClientRects().length > 0;\n\n const begin = (target: EventTarget | null) => {\n const modal = topModal(doc, target);\n const candidates = [...regions].filter((entry) => eligible(entry, modal) && rendered(regionElement(entry)!));\n // The latest region on an element replaces earlier ones; a region inside another shown one acts as a specific target.\n const byElement = new Map<Element, FileDropTargetEntry>();\n for (const entry of candidates) byElement.set(regionElement(entry)!, entry);\n const shown = [...byElement].filter(\n ([element]) => ![...byElement.keys()].some((other) => other !== element && other.contains(element)),\n );\n setSession({ shown: shown.map(([, entry]) => entry), hover: null });\n const first = shown[0]?.[1];\n if (first) announce(first.options.label);\n };\n\n const end = () => {\n entered.clear();\n mark(null);\n if (session()) setSession(null);\n };\n\n const resolve = (target: EventTarget | null): { entry: FileDropTargetEntry; element: Element } | null => {\n const modal = topModal(doc, target);\n for (let element = elementOf(target); element; element = element.parentElement) {\n const specific = targets.get(element);\n if (specific && !specific.options.disabled) return { entry: specific, element };\n let region: FileDropTargetEntry | undefined;\n for (const entry of regions) if (regionElement(entry) === element && eligible(entry, modal)) region = entry;\n if (region) return { entry: region, element };\n }\n return null;\n };\n\n const hoverFrom = (event: DragEvent) => {\n const current = session();\n if (!current) return null;\n const found = resolve(event.target);\n const hover = found ? { ...found, invalid: invalidDrag(event, found.entry.options) } : null;\n const previous = current.hover;\n if (previous?.entry !== hover?.entry || previous?.element !== hover?.element || previous?.invalid !== hover?.invalid) {\n mark(hover);\n setSession({ ...current, hover });\n }\n return hover;\n };\n\n /** Over a page with a region, a file never falls through to the browser, which would open it and leave the page. */\n const guarding = () => [...regions].some((entry) => regionElement(entry));\n\n const accept = (event: DragEvent, hover: FileDropHover | null) => {\n if (!hover && !guarding()) return;\n event.preventDefault();\n if (event.dataTransfer) event.dataTransfer.dropEffect = hover && !hover.invalid ? \"copy\" : \"none\";\n };\n\n const requestFrame = () => {\n if (frameRequest || !view) return;\n frameRequest = view.requestAnimationFrame(() => {\n frameRequest = 0;\n setFrame((value) => value + 1);\n });\n };\n\n const deliver = (entry: FileDropTargetEntry, dataTransfer: DataTransfer) => {\n const { options } = entry;\n const files = Array.from(dataTransfer.files);\n const { accepted, rejected } = partitionDroppedFiles(files, options);\n const messages = entry.messages();\n if (rejected.length) toast.error(fileDropRejectionMessage(rejected, options, messages, entry.locale()));\n if (!accepted.length && files.length) return;\n if (accepted.length)\n announce(\n accepted.length === 1\n ? messages.fileDropDroppedOne({ name: accepted[0]!.name })\n : messages.fileDropDropped({ count: accepted.length }),\n );\n void options.onDrop(accepted, { dataTransfer, rejected });\n };\n\n const listeners: Record<string, (event: Event) => void> = {\n dragstart: (event) => {\n (event as DragEvent).dataTransfer?.setData(PAGE_DRAG_TYPE, \"\");\n },\n dragenter: (event) => {\n const drag = event as DragEvent;\n if (!isFileDrag(drag)) return;\n lastDragEvent = event.timeStamp;\n if (event.target) entered.add(event.target);\n if (!session()) begin(event.target);\n accept(drag, hoverFrom(drag));\n },\n dragover: (event) => {\n const drag = event as DragEvent;\n if (!isFileDrag(drag)) return;\n lastDragEvent = event.timeStamp;\n // An engine may skip the first dragenter; the drag still counts as over the window.\n if (!session()) {\n if (event.target) entered.add(event.target);\n begin(event.target);\n }\n accept(drag, hoverFrom(drag));\n requestFrame();\n },\n dragleave: (event) => {\n if (!session()) return;\n if (event.target) entered.delete(event.target);\n // An element removed during the drag never reports leaving.\n for (const target of entered) if (target instanceof Node && !target.isConnected) entered.delete(target);\n if (entered.size === 0) end();\n },\n drop: (event) => {\n const drag = event as DragEvent;\n if (!isFileDrag(drag)) return;\n const found = resolve(event.target);\n end();\n if (!found) {\n if (guarding()) event.preventDefault();\n return;\n }\n // The most specific target owns the drop; editors and other handlers below it never see the files.\n event.preventDefault();\n event.stopPropagation();\n if (drag.dataTransfer) deliver(found.entry, drag.dataTransfer);\n },\n keydown: (event) => {\n if ((event as KeyboardEvent).key === \"Escape\" && session()) end();\n },\n // Engines send no pointer moves during a drag: one long after the last drag event means the drag ended somewhere the\n // page did not see. One right after it belongs to another pointer, such as a second finger on a touch screen.\n pointermove: (event) => {\n if (session() && event.timeStamp - lastDragEvent > DRAG_SILENCE_MS) end();\n },\n visibilitychange: () => {\n if (doc.visibilityState === \"hidden\") end();\n },\n };\n\n let installed = false;\n const install = () => {\n if (installed || !view) return;\n installed = true;\n for (const [type, listener] of Object.entries(listeners))\n (type === \"visibilitychange\" ? doc : view).addEventListener(type, listener, { capture: true });\n };\n\n return {\n session,\n frame,\n addRegion: (entry) => {\n install();\n regions.add(entry);\n return () => {\n regions.delete(entry);\n const current = session();\n if (current?.hover?.entry === entry) {\n mark(null);\n setSession({ ...current, hover: null });\n }\n };\n },\n setTarget: (element, entry) => {\n install();\n targets.set(element, entry);\n },\n };\n};\n\n/**\n * The document an element lives in. A freshly rendered element still belongs to the inert document of the template it\n * was cloned from; until it is inserted, that is the page's document.\n */\nexport const liveDocument = (element: Element): Document => (element.ownerDocument.defaultView ? element.ownerDocument : document);\n\n/** The one drag tracker of a document, shared by every drop target in it. */\nexport const fileDropEngine = (doc: Document): FileDropEngine => {\n let engine = engines.get(doc);\n if (!engine) {\n engine = createEngine(doc);\n engines.set(doc, engine);\n }\n return engine;\n};\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,60 @@
1
+ import { i18n } from "@k2b/stdlib";
2
+ import { useLocale } from "../intl/locale";
3
+ const fileInputMessages = i18n.define({
4
+ baseLocale: "en",
5
+ messages: {
6
+ en: {
7
+ addImage: "Add image",
8
+ dropFiles: "Drop files or click to choose",
9
+ dropToUpload: "Drop to upload",
10
+ uploading: "Uploading…",
11
+ chooseFile: "Choose file",
12
+ chooseFiles: "Choose files",
13
+ chooseMatchingFile: "Choose a file that matches this field.",
14
+ changeImage: "Change image",
15
+ cropArea: "Crop area. Use arrow keys to move; hold Shift for larger steps.",
16
+ cropPreview: "Crop preview",
17
+ failedLoadFiles: "Failed to load files",
18
+ failedLoadImage: "Failed to load image.",
19
+ imageProcessingFailed: "Image could not be processed.",
20
+ preparingImage: "Preparing image…",
21
+ processingImage: "Processing image",
22
+ removeImage: "Remove image",
23
+ rotateRight: "Rotate right",
24
+ selectedImage: "Selected image",
25
+ resizeCrop: ({
26
+ handle
27
+ }) => `Resize crop ${handle}`
28
+ },
29
+ de: {
30
+ addImage: "Bild hinzufügen",
31
+ dropFiles: "Dateien ablegen oder zum Auswählen klicken",
32
+ dropToUpload: "Zum Hochladen ablegen",
33
+ uploading: "Wird hochgeladen…",
34
+ chooseFile: "Datei auswählen",
35
+ chooseFiles: "Dateien auswählen",
36
+ chooseMatchingFile: "Wähle eine zu diesem Feld passende Datei aus.",
37
+ changeImage: "Bild ändern",
38
+ cropArea: "Zuschneidebereich. Mit Pfeiltasten verschieben; Umschalt für größere Schritte halten.",
39
+ cropPreview: "Zuschneidevorschau",
40
+ failedLoadFiles: "Dateien konnten nicht geladen werden",
41
+ failedLoadImage: "Bild konnte nicht geladen werden.",
42
+ imageProcessingFailed: "Bild konnte nicht verarbeitet werden.",
43
+ preparingImage: "Bild wird vorbereitet…",
44
+ processingImage: "Bild wird verarbeitet",
45
+ removeImage: "Bild entfernen",
46
+ rotateRight: "Nach rechts drehen",
47
+ selectedImage: "Ausgewähltes Bild",
48
+ resizeCrop: ({
49
+ handle
50
+ }) => `Zuschneidebereich am Griff ${handle} skalieren`
51
+ }
52
+ }
53
+ });
54
+ /** Resolved from the inherited render locale. */
55
+ export const useFileInputMessages = () => {
56
+ const locale = useLocale();
57
+ return () => fileInputMessages.resolve([locale()]).t;
58
+ };
59
+ export const checkFileInputMessages = () => fileInputMessages.check();
60
+ //# sourceMappingURL=file-input-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["inputs/file-input-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\nconst fileInputMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n addImage: \"Add image\",\n dropFiles: \"Drop files or click to choose\",\n dropToUpload: \"Drop to upload\",\n uploading: \"Uploading…\",\n chooseFile: \"Choose file\",\n chooseFiles: \"Choose files\",\n chooseMatchingFile: \"Choose a file that matches this field.\",\n changeImage: \"Change image\",\n cropArea: \"Crop area. Use arrow keys to move; hold Shift for larger steps.\",\n cropPreview: \"Crop preview\",\n failedLoadFiles: \"Failed to load files\",\n failedLoadImage: \"Failed to load image.\",\n imageProcessingFailed: \"Image could not be processed.\",\n preparingImage: \"Preparing image…\",\n processingImage: \"Processing image\",\n removeImage: \"Remove image\",\n rotateRight: \"Rotate right\",\n selectedImage: \"Selected image\",\n resizeCrop: ({ handle }: { handle: string }) => `Resize crop ${handle}`,\n },\n de: {\n addImage: \"Bild hinzufügen\",\n dropFiles: \"Dateien ablegen oder zum Auswählen klicken\",\n dropToUpload: \"Zum Hochladen ablegen\",\n uploading: \"Wird hochgeladen…\",\n chooseFile: \"Datei auswählen\",\n chooseFiles: \"Dateien auswählen\",\n chooseMatchingFile: \"Wähle eine zu diesem Feld passende Datei aus.\",\n changeImage: \"Bild ändern\",\n cropArea: \"Zuschneidebereich. Mit Pfeiltasten verschieben; Umschalt für größere Schritte halten.\",\n cropPreview: \"Zuschneidevorschau\",\n failedLoadFiles: \"Dateien konnten nicht geladen werden\",\n failedLoadImage: \"Bild konnte nicht geladen werden.\",\n imageProcessingFailed: \"Bild konnte nicht verarbeitet werden.\",\n preparingImage: \"Bild wird vorbereitet…\",\n processingImage: \"Bild wird verarbeitet\",\n removeImage: \"Bild entfernen\",\n rotateRight: \"Nach rechts drehen\",\n selectedImage: \"Ausgewähltes Bild\",\n resizeCrop: ({ handle }) => `Zuschneidebereich am Griff ${handle} skalieren`,\n },\n },\n});\n\nexport type FileInputMessages = ReturnType<(typeof fileInputMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from the inherited render locale. */\nexport const useFileInputMessages = (): (() => FileInputMessages) => {\n const locale = useLocale();\n return () => fileInputMessages.resolve([locale()]).t;\n};\n\nexport const checkFileInputMessages = () => fileInputMessages.check();\n"],"mappings":"AAAA,SAAS,IAAI,QAAQ,aAAa;AAClC,SAAS,SAAS,QAAQ,gBAAgB;AAE1C,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC;EACpC,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE;IACR,EAAE,EAAE;MACF,QAAQ,EAAE,WAAW;MACrB,SAAS,EAAE,+BAA+B;MAC1C,YAAY,EAAE,gBAAgB;MAC9B,SAAS,EAAE,YAAY;MACvB,UAAU,EAAE,aAAa;MACzB,WAAW,EAAE,cAAc;MAC3B,kBAAkB,EAAE,wCAAwC;MAC5D,WAAW,EAAE,cAAc;MAC3B,QAAQ,EAAE,iEAAiE;MAC3E,WAAW,EAAE,cAAc;MAC3B,eAAe,EAAE,sBAAsB;MACvC,eAAe,EAAE,uBAAuB;MACxC,qBAAqB,EAAE,+BAA+B;MACtD,cAAc,EAAE,kBAAkB;MAClC,eAAe,EAAE,kBAAkB;MACnC,WAAW,EAAE,cAAc;MAC3B,WAAW,EAAE,cAAc;MAC3B,aAAa,EAAE,gBAAgB;MAC/B,UAAU,EAAE,CAAC;QAAE;MAA2B,CAAC,KAAK,eAAe,MAAM;IACvE,CAAC;IACD,EAAE,EAAE;MACF,QAAQ,EAAE,iBAAiB;MAC3B,SAAS,EAAE,4CAA4C;MACvD,YAAY,EAAE,uBAAuB;MACrC,SAAS,EAAE,mBAAmB;MAC9B,UAAU,EAAE,iBAAiB;MAC7B,WAAW,EAAE,mBAAmB;MAChC,kBAAkB,EAAE,+CAA+C;MACnE,WAAW,EAAE,aAAa;MAC1B,QAAQ,EAAE,uFAAuF;MACjG,WAAW,EAAE,oBAAoB;MACjC,eAAe,EAAE,sCAAsC;MACvD,eAAe,EAAE,mCAAmC;MACpD,qBAAqB,EAAE,uCAAuC;MAC9D,cAAc,EAAE,wBAAwB;MACxC,eAAe,EAAE,uBAAuB;MACxC,WAAW,EAAE,gBAAgB;MAC7B,WAAW,EAAE,oBAAoB;MACjC,aAAa,EAAE,mBAAmB;MAClC,UAAU,EAAE,CAAC;QAAE;MAAO,CAAC,KAAK,8BAA8B,MAAM;IAClE;EACF;AACF,CAAC,CAAC;AAIF;AACA,OAAO,MAAM,oBAAoB,GAAG,MAAiC;EACnE,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,OAAO,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,OAAO,MAAM,sBAAsB,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,22 @@
1
+ import { i18n } from "@k2b/stdlib";
2
+ import { useLocale } from "../intl/locale";
3
+ const iconMessages = i18n.define({
4
+ baseLocale: "en",
5
+ messages: {
6
+ en: {
7
+ filterIcons: "Filter icons",
8
+ pickIcon: "Pick an icon..."
9
+ },
10
+ de: {
11
+ filterIcons: "Symbole filtern",
12
+ pickIcon: "Symbol auswählen..."
13
+ }
14
+ }
15
+ });
16
+ /** Resolved from the inherited render locale. */
17
+ export const useIconMessages = () => {
18
+ const locale = useLocale();
19
+ return () => iconMessages.resolve([locale()]).t;
20
+ };
21
+ export const checkIconMessages = () => iconMessages.check();
22
+ //# sourceMappingURL=icon-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["inputs/icon-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\nconst iconMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n filterIcons: \"Filter icons\",\n pickIcon: \"Pick an icon...\",\n },\n de: {\n filterIcons: \"Symbole filtern\",\n pickIcon: \"Symbol auswählen...\",\n },\n },\n});\n\nexport type IconMessages = ReturnType<(typeof iconMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from the inherited render locale. */\nexport const useIconMessages = (): (() => IconMessages) => {\n const locale = useLocale();\n return () => iconMessages.resolve([locale()]).t;\n};\n\nexport const checkIconMessages = () => iconMessages.check();\n"],"mappings":"AAAA,SAAS,IAAI,QAAQ,aAAa;AAClC,SAAS,SAAS,QAAQ,gBAAgB;AAE1C,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC;EAC/B,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE;IACR,EAAE,EAAE;MACF,WAAW,EAAE,cAAc;MAC3B,QAAQ,EAAE;IACZ,CAAC;IACD,EAAE,EAAE;MACF,WAAW,EAAE,iBAAiB;MAC9B,QAAQ,EAAE;IACZ;EACF;AACF,CAAC,CAAC;AAIF;AACA,OAAO,MAAM,eAAe,GAAG,MAA4B;EACzD,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,OAAO,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,OAAO,MAAM,iBAAiB,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,38 @@
1
+ import { i18n } from "@k2b/stdlib";
2
+ import { useLocale } from "../intl/locale";
3
+ const inputMessages = i18n.define({
4
+ baseLocale: "en",
5
+ messages: {
6
+ en: {
7
+ decreaseValue: "Decrease value",
8
+ increaseValue: "Increase value",
9
+ hidePassword: "Hide password",
10
+ showPassword: "Show password",
11
+ useColor: "Use a color",
12
+ useTransparent: "Use transparent",
13
+ pinDigit: ({
14
+ index,
15
+ total
16
+ }) => `PIN digit ${index} of ${total}`
17
+ },
18
+ de: {
19
+ decreaseValue: "Wert verringern",
20
+ increaseValue: "Wert erhöhen",
21
+ hidePassword: "Passwort ausblenden",
22
+ showPassword: "Passwort anzeigen",
23
+ useColor: "Farbe verwenden",
24
+ useTransparent: "Transparent verwenden",
25
+ pinDigit: ({
26
+ index,
27
+ total
28
+ }) => `PIN-Ziffer ${index} von ${total}`
29
+ }
30
+ }
31
+ });
32
+ /** Resolved from the inherited render locale. */
33
+ export const useInputMessages = () => {
34
+ const locale = useLocale();
35
+ return () => inputMessages.resolve([locale()]).t;
36
+ };
37
+ export const checkInputMessages = () => inputMessages.check();
38
+ //# sourceMappingURL=input-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["inputs/input-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\nconst inputMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n decreaseValue: \"Decrease value\",\n increaseValue: \"Increase value\",\n hidePassword: \"Hide password\",\n showPassword: \"Show password\",\n useColor: \"Use a color\",\n useTransparent: \"Use transparent\",\n pinDigit: ({ index, total }: { index: number; total: number }) => `PIN digit ${index} of ${total}`,\n },\n de: {\n decreaseValue: \"Wert verringern\",\n increaseValue: \"Wert erhöhen\",\n hidePassword: \"Passwort ausblenden\",\n showPassword: \"Passwort anzeigen\",\n useColor: \"Farbe verwenden\",\n useTransparent: \"Transparent verwenden\",\n pinDigit: ({ index, total }) => `PIN-Ziffer ${index} von ${total}`,\n },\n },\n});\n\nexport type InputMessages = ReturnType<(typeof inputMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from the inherited render locale. */\nexport const useInputMessages = (): (() => InputMessages) => {\n const locale = useLocale();\n return () => inputMessages.resolve([locale()]).t;\n};\n\nexport const checkInputMessages = () => inputMessages.check();\n"],"mappings":"AAAA,SAAS,IAAI,QAAQ,aAAa;AAClC,SAAS,SAAS,QAAQ,gBAAgB;AAE1C,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC;EAChC,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE;IACR,EAAE,EAAE;MACF,aAAa,EAAE,gBAAgB;MAC/B,aAAa,EAAE,gBAAgB;MAC/B,YAAY,EAAE,eAAe;MAC7B,YAAY,EAAE,eAAe;MAC7B,QAAQ,EAAE,aAAa;MACvB,cAAc,EAAE,iBAAiB;MACjC,QAAQ,EAAE,CAAC;QAAE,KAAK;QAAE;MAAwC,CAAC,KAAK,aAAa,KAAK,OAAO,KAAK;IAClG,CAAC;IACD,EAAE,EAAE;MACF,aAAa,EAAE,iBAAiB;MAChC,aAAa,EAAE,cAAc;MAC7B,YAAY,EAAE,qBAAqB;MACnC,YAAY,EAAE,mBAAmB;MACjC,QAAQ,EAAE,iBAAiB;MAC3B,cAAc,EAAE,uBAAuB;MACvC,QAAQ,EAAE,CAAC;QAAE,KAAK;QAAE;MAAM,CAAC,KAAK,cAAc,KAAK,QAAQ,KAAK;IAClE;EACF;AACF,CAAC,CAAC;AAIF;AACA,OAAO,MAAM,gBAAgB,GAAG,MAA6B;EAC3D,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,OAAO,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,OAAO,MAAM,kBAAkB,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC","ignoreList":[]}
@@ -23,13 +23,17 @@ import { createFieldMeta, Field, fieldControlAria } from "../../internal/field";
23
23
  import { useLocale } from "../../intl/locale";
24
24
  import { useUiMessages } from "../../intl/messages";
25
25
  import { abbreviations as abbreviationsCompletion, buildSuggestContext, collectKnownLabels, createCompletionBehaviorState, detectQuery, displayLabel, renderWithOverlay, resolveSuggestions } from "../completion";
26
+ import { useCompletionMessages } from "../completion-messages";
26
27
  import { resolveMaybeAccessor } from "../field-contract";
27
28
  import { computeActiveFormats } from "./active-formats";
28
29
  import { handleListContinuation, handleShortcut, handleSmartPaste } from "./behaviors";
29
30
  import { isInCodeZone } from "./code-zone";
31
+ import { useMarkdownEditorMessages } from "./editor-messages";
30
32
  import Toolbar from "./Toolbar";
31
33
  export function MarkdownEditor(props) {
32
34
  const messages = useUiMessages();
35
+ const markdownEditorMessages = useMarkdownEditorMessages();
36
+ const completionMessages = useCompletionMessages();
33
37
  const locale = useLocale();
34
38
  const formatCount = value => new Intl.NumberFormat(locale()).format(value);
35
39
  const meta = createFieldMeta(props.id);
@@ -403,7 +407,7 @@ export function MarkdownEditor(props) {
403
407
  type: "button",
404
408
  "class": "k2b-markdown-editor__tool",
405
409
  get content() {
406
- return messages().saveShortcut;
410
+ return markdownEditorMessages().saveShortcut;
407
411
  },
408
412
  get ["aria-label"]() {
409
413
  return messages().save;
@@ -524,13 +528,13 @@ export function MarkdownEditor(props) {
524
528
  return _$memo(() => !!(props.showStats ?? true))() && !props.disabled;
525
529
  },
526
530
  get children() {
527
- return _$ssr(_tmpl$3, _$ssrAttribute("data-empty", stats().chars === 0 ? "true" : _$escape(undefined, true), false), _$escape(messages().editorLines({
531
+ return _$ssr(_tmpl$3, _$ssrAttribute("data-empty", stats().chars === 0 ? "true" : _$escape(undefined, true), false), _$escape(markdownEditorMessages().editorLines({
528
532
  count: stats().lines,
529
533
  value: formatCount(stats().lines)
530
- })), _$escape(messages().editorWords({
534
+ })), _$escape(markdownEditorMessages().editorWords({
531
535
  count: stats().words,
532
536
  value: formatCount(stats().words)
533
- })), _$escape(messages().editorCharacters({
537
+ })), _$escape(markdownEditorMessages().editorCharacters({
534
538
  count: stats().chars,
535
539
  value: formatCount(stats().chars)
536
540
  })));
@@ -540,7 +544,7 @@ export function MarkdownEditor(props) {
540
544
  return state() || loading() || completionError();
541
545
  },
542
546
  get children() {
543
- return _$ssr(_tmpl$5, _$ssrAttribute("aria-label", _$escape(messages().completionSuggestions, true), false), _$ssrAttribute("id", _$escape(listboxId, true), false), _$ssrAttribute("aria-label", _$escape(messages().suggestions, true), false), _$escape(_$createComponent(Show, {
547
+ return _$ssr(_tmpl$5, _$ssrAttribute("aria-label", _$escape(completionMessages().completionSuggestions, true), false), _$ssrAttribute("id", _$escape(listboxId, true), false), _$ssrAttribute("aria-label", _$escape(completionMessages().suggestions, true), false), _$escape(_$createComponent(Show, {
544
548
  get when() {
545
549
  return loading();
546
550
  },
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["inputs/markdown/MarkdownEditor.tsx"],"sourcesContent":["import { highlight } from \"@k2b/stdlib\";\nimport { createEffect, createMemo, createSignal, createUniqueId, For, type JSX, onCleanup, onMount, Show, untrack } from \"solid-js\";\nimport { Tooltip } from \"../../feedback/Tooltip\";\nimport { createFieldMeta, Field, fieldControlAria } from \"../../internal/field\";\nimport { useLocale } from \"../../intl/locale\";\nimport { useUiMessages } from \"../../intl/messages\";\nimport {\n abbreviations as abbreviationsCompletion,\n buildSuggestContext,\n type Completion,\n collectKnownLabels,\n createCompletionBehaviorState,\n detectQuery,\n displayLabel,\n type QueryContext,\n renderWithOverlay,\n resolveSuggestions,\n type Suggestion,\n} from \"../completion\";\nimport type { ValueFieldProps } from \"../field-contract\";\nimport { resolveMaybeAccessor } from \"../field-contract\";\nimport { computeActiveFormats } from \"./active-formats\";\nimport { handleListContinuation, handleShortcut, handleSmartPaste } from \"./behaviors\";\nimport { isInCodeZone } from \"./code-zone\";\nimport Toolbar from \"./Toolbar\";\n\nexport type MarkdownEditorProps = ValueFieldProps<string> & {\n onSubmit?: () => void;\n placeholder?: string;\n lines?: number;\n noToolbar?: boolean;\n spellcheck?: boolean;\n name?: string;\n maxLength?: number;\n textareaRef?: (element: HTMLTextAreaElement) => void;\n abbreviations?: Record<string, string>;\n completions?: readonly Completion[];\n showStats?: boolean;\n variant?: \"default\" | \"paper\" | \"embedded\";\n fill?: boolean;\n /** Groups save and close at the end of the toolbar. The caller owns navigation and unsaved-change confirmation. */\n onClose?: () => void;\n onSave?: () => void;\n saveDisabled?: boolean;\n saving?: boolean;\n /** Shows a successful-save check. The caller clears it after a brief delay or the next edit. */\n saved?: boolean;\n toolbarTrailing?: JSX.Element;\n};\n\ntype CompletionState = {\n context: QueryContext;\n suggestions: readonly Suggestion[];\n selectedIndex: number;\n};\n\nexport function MarkdownEditor(props: MarkdownEditorProps): JSX.Element {\n const messages = useUiMessages();\n const locale = useLocale();\n const formatCount = (value: number) => new Intl.NumberFormat(locale()).format(value);\n const meta = createFieldMeta(props.id);\n let textarea: HTMLTextAreaElement | undefined;\n let preview: HTMLDivElement | undefined;\n let dropdown: HTMLDivElement | undefined;\n let completionAbort: AbortController | null = null;\n let completionTimer: ReturnType<typeof setTimeout> | null = null;\n let overlayFrame: number | undefined;\n let overlayInitialized = false;\n let renderPendingOverlay: (() => void) | undefined;\n const completionBehavior = createCompletionBehaviorState();\n\n const [textareaSignal, setTextareaSignal] = createSignal<HTMLTextAreaElement | null>(null);\n const [activeFormats, setActiveFormats] = createSignal<Set<string>>(new Set());\n const [composing, setComposing] = createSignal(false);\n const [localValue, setLocalValue] = createSignal(resolveMaybeAccessor(props.value) ?? \"\");\n const error = () => resolveMaybeAccessor(props.error);\n const [state, setState] = createSignal<CompletionState | null>(null);\n const [loading, setLoading] = createSignal(false);\n const [completionError, setCompletionError] = createSignal<string | null>(null);\n const [dropdownOpen, setDropdownOpen] = createSignal(false);\n const completionId = createUniqueId();\n const listboxId = `${meta.controlId}-${completionId}-suggestions`;\n const optionId = (index: number): string => `${listboxId}-${index}`;\n const activeSuggestion = (): Suggestion | null => {\n const current = state();\n return current?.suggestions[current.selectedIndex] ?? null;\n };\n\n const mergedCompletions = createMemo<readonly Completion[] | undefined>(() => {\n const merged: Completion[] = [];\n if (props.abbreviations && Object.keys(props.abbreviations).length > 0) {\n merged.push(abbreviationsCompletion(props.abbreviations));\n }\n if (props.completions) merged.push(...props.completions);\n return merged.length > 0 ? merged : undefined;\n });\n const knownLabels = createMemo(() => collectKnownLabels(mergedCompletions()));\n\n createEffect(() => {\n const incoming = resolveMaybeAccessor(props.value);\n if (incoming !== undefined && incoming !== null && incoming !== untrack(localValue)) {\n setLocalValue(incoming);\n }\n });\n\n createEffect(() => {\n const target = localValue();\n if (!composing() && textarea && textarea.value !== target) {\n textarea.value = target;\n }\n });\n\n createEffect(() => {\n if (!preview) return;\n const value = localValue();\n const labels = knownLabels();\n const current = state();\n const active = activeSuggestion();\n const ghost =\n current && active\n ? {\n at: current.context.end,\n text: active.text.slice(current.context.text.length),\n }\n : undefined;\n const anchor = current && !ghost ? { at: current.context.end } : undefined;\n renderPendingOverlay = () => {\n if (!preview) return;\n preview.innerHTML = renderWithOverlay(value, (text) => highlight.markdown(text, { knownLabels: labels }), { ghost, anchor });\n if (textarea) {\n preview.scrollTop = textarea.scrollTop;\n preview.scrollLeft = textarea.scrollLeft;\n }\n if (dropdown?.matches(\":popover-open\")) positionDropdown();\n };\n if (!overlayInitialized) {\n overlayInitialized = true;\n renderPendingOverlay();\n renderPendingOverlay = undefined;\n return;\n }\n if (overlayFrame !== undefined) return;\n overlayFrame = requestAnimationFrame(() => {\n overlayFrame = undefined;\n const render = renderPendingOverlay;\n renderPendingOverlay = undefined;\n render?.();\n });\n });\n\n const updateActiveFormats = (): void => {\n if (textarea) setActiveFormats(computeActiveFormats(textarea));\n };\n\n const closeDropdown = (): void => {\n if (dropdown?.matches(\":popover-open\")) dropdown.hidePopover();\n setDropdownOpen(false);\n };\n\n const clearCompletion = (): void => {\n completionAbort?.abort();\n completionAbort = null;\n if (completionTimer) clearTimeout(completionTimer);\n completionTimer = null;\n setState(null);\n setLoading(false);\n setCompletionError(null);\n closeDropdown();\n };\n\n const positionDropdown = (): void => {\n if (!dropdown?.isConnected || !preview?.isConnected || !textarea?.isConnected) {\n return;\n }\n const anchor = preview.querySelector<HTMLElement>(\"[data-completion-anchor]\");\n const rect = anchor?.getBoundingClientRect() ?? textarea.getBoundingClientRect();\n const maxHeight = 260;\n const spaceBelow = window.innerHeight - rect.bottom;\n const openAbove = spaceBelow < maxHeight && rect.top > spaceBelow;\n if (openAbove) {\n dropdown.style.setProperty(\"top\", \"auto\", \"important\");\n dropdown.style.setProperty(\"bottom\", `${window.innerHeight - rect.top + 4}px`, \"important\");\n } else {\n dropdown.style.setProperty(\"top\", `${rect.bottom + 4}px`, \"important\");\n dropdown.style.setProperty(\"bottom\", \"auto\", \"important\");\n }\n if (!dropdown.matches(\":popover-open\")) dropdown.showPopover();\n // The list sizes to its suggestions in CSS; measured once shown, it is\n // clamped into the viewport before the next paint.\n const width = dropdown.getBoundingClientRect().width;\n const left = Math.min(rect.left, window.innerWidth - width - 8);\n dropdown.style.setProperty(\"left\", `${Math.max(8, left)}px`, \"important\");\n };\n\n const isAbortError = (error: unknown): boolean =>\n error instanceof DOMException\n ? error.name === \"AbortError\"\n : Boolean(error && typeof error === \"object\" && \"name\" in error && (error as { name: string }).name === \"AbortError\");\n\n const applySuggestionList = (context: QueryContext, suggestions: readonly Suggestion[]): void => {\n const value = localValue();\n const normalized = context.text.toLowerCase();\n const usable = suggestions.filter((suggestion) => {\n if (suggestion.textEdit) {\n const { start, end, text } = suggestion.textEdit;\n return (\n Number.isInteger(start) &&\n Number.isInteger(end) &&\n start >= 0 &&\n end >= start &&\n end <= value.length &&\n value.slice(start, end) !== text\n );\n }\n return suggestion.text.toLowerCase().startsWith(normalized) && suggestion.text.length > context.text.length;\n });\n if (usable.length === 0) {\n setState(null);\n closeDropdown();\n return;\n }\n const previous = activeSuggestion()?.text;\n const retained = previous ? usable.findIndex((suggestion) => suggestion.text === previous) : -1;\n setState({\n context,\n suggestions: usable,\n selectedIndex: retained >= 0 ? retained : 0,\n });\n if (context.completion.dropdown) {\n setDropdownOpen(true);\n queueMicrotask(positionDropdown);\n } else {\n closeDropdown();\n }\n };\n\n const runAsyncCompletion = async (context: QueryContext, promise: Promise<readonly Suggestion[]>, signal: AbortSignal): Promise<void> => {\n try {\n const suggestions = await promise;\n if (signal.aborted) return;\n setLoading(false);\n applySuggestionList(context, suggestions);\n } catch (error) {\n if (signal.aborted || isAbortError(error)) return;\n setLoading(false);\n setState(null);\n setCompletionError(error instanceof Error ? error.message : \"Suggestions could not be loaded\");\n setDropdownOpen(true);\n queueMicrotask(positionDropdown);\n }\n };\n\n const startCompletionResolution = (context: QueryContext, signal: AbortSignal): void => {\n if (signal.aborted || !textarea) return;\n setLoading(true);\n setCompletionError(null);\n setDropdownOpen(true);\n queueMicrotask(positionDropdown);\n try {\n const result = resolveSuggestions(context.completion, context.query, buildSuggestContext(textarea, context), signal);\n if (result.kind === \"sync\") {\n setLoading(false);\n applySuggestionList(context, result.data);\n } else {\n void runAsyncCompletion(context, result.promise, signal);\n }\n } catch (error) {\n if (signal.aborted || isAbortError(error)) return;\n setLoading(false);\n setState(null);\n setCompletionError(error instanceof Error ? error.message : \"Suggestions could not be loaded\");\n queueMicrotask(positionDropdown);\n }\n };\n\n const recomputeCompletion = (): void => {\n if (!textarea) return;\n const context = detectQuery(textarea, mergedCompletions(), {\n isExcluded: isInCodeZone,\n });\n if (!context) {\n clearCompletion();\n return;\n }\n completionAbort?.abort();\n if (completionTimer) clearTimeout(completionTimer);\n completionTimer = null;\n completionAbort = new AbortController();\n const current = state();\n if (\n current &&\n (current.context.start !== context.start ||\n current.context.end !== context.end ||\n current.context.text !== context.text ||\n current.context.completion !== context.completion)\n ) {\n setState(null);\n closeDropdown();\n }\n setCompletionError(null);\n const delay = Math.max(0, context.completion.debounceMs ?? 0);\n if (delay === 0) {\n startCompletionResolution(context, completionAbort.signal);\n } else {\n setLoading(false);\n if (!state()) closeDropdown();\n const signal = completionAbort.signal;\n completionTimer = setTimeout(() => {\n completionTimer = null;\n startCompletionResolution(context, signal);\n }, delay);\n }\n };\n\n const retryCompletion = (): void => {\n if (!textarea) return;\n const context = detectQuery(textarea, mergedCompletions(), {\n isExcluded: isInCodeZone,\n });\n if (!context) return clearCompletion();\n completionAbort?.abort();\n if (completionTimer) clearTimeout(completionTimer);\n completionTimer = null;\n completionAbort = new AbortController();\n startCompletionResolution(context, completionAbort.signal);\n };\n\n const activateSuggestion = (index = state()?.selectedIndex ?? -1): boolean => {\n const current = state();\n const active = current?.suggestions[index];\n if (!textarea || !current || !active) return false;\n if (!active.textEdit && active.text === current.context.text) {\n closeDropdown();\n setState(null);\n return false;\n }\n const applied = completionBehavior.applySuggestion(textarea, current.context, active);\n closeDropdown();\n setState(null);\n return applied;\n };\n\n const moveSelection = (direction: 1 | -1): void => {\n const current = state();\n if (!current || current.suggestions.length === 0) return;\n setState({\n ...current,\n selectedIndex: (current.selectedIndex + direction + current.suggestions.length) % current.suggestions.length,\n });\n };\n\n const stats = createMemo(() => {\n const value = localValue();\n return {\n lines: value.length === 0 ? 0 : value.split(\"\\n\").length,\n words: value.match(/\\S+/g)?.length ?? 0,\n chars: value.length,\n };\n });\n\n onMount(() => {\n if (textarea) setTextareaSignal(textarea);\n updateActiveFormats();\n const selectionChange = (): void => {\n if (document.activeElement === textarea) {\n updateActiveFormats();\n recomputeCompletion();\n }\n };\n // Reposition an OPEN popover only. Calling `positionDropdown` blindly\n // would `showPopover()` a dropdown that is deliberately closed (a\n // ghost-only completion keeps state without a dropdown).\n const reposition = (): void => {\n if (dropdown?.matches(\":popover-open\")) positionDropdown();\n };\n document.addEventListener(\"selectionchange\", selectionChange);\n window.addEventListener(\"resize\", reposition);\n onCleanup(() => {\n document.removeEventListener(\"selectionchange\", selectionChange);\n window.removeEventListener(\"resize\", reposition);\n if (dropdown?.matches(\":popover-open\")) dropdown.hidePopover();\n completionAbort?.abort();\n if (completionTimer) clearTimeout(completionTimer);\n if (overlayFrame !== undefined) cancelAnimationFrame(overlayFrame);\n overlayFrame = undefined;\n renderPendingOverlay = undefined;\n completionBehavior.reset();\n });\n });\n\n const onInput = (event: InputEvent & { currentTarget: HTMLTextAreaElement }): void => {\n if (\n completionBehavior.tryExpand(event.currentTarget, mergedCompletions(), {\n isExcluded: isInCodeZone,\n })\n ) {\n return;\n }\n setLocalValue(event.currentTarget.value);\n props.onValueChange?.(event.currentTarget.value);\n updateActiveFormats();\n recomputeCompletion();\n };\n\n const onKeyDown = (event: KeyboardEvent): void => {\n if (!textarea || event.isComposing) return;\n if (\n event.key === \"Backspace\" &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.altKey &&\n !event.shiftKey &&\n completionBehavior.tryRestore(textarea)\n ) {\n event.preventDefault();\n return;\n }\n const current = state();\n const dropdownCompletion = current?.context.completion.dropdown === true;\n if (current && dropdownCompletion && (event.key === \"ArrowDown\" || event.key === \"ArrowUp\")) {\n event.preventDefault();\n moveSelection(event.key === \"ArrowDown\" ? 1 : -1);\n return;\n }\n if (\n event.key === \"Enter\" &&\n !event.shiftKey &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.altKey &&\n current &&\n dropdownCompletion &&\n dropdownOpen()\n ) {\n event.preventDefault();\n activateSuggestion();\n return;\n }\n if (event.key === \"Tab\" && !event.shiftKey && !event.metaKey && !event.ctrlKey && !event.altKey && current) {\n event.preventDefault();\n activateSuggestion();\n return;\n }\n if (event.key === \"Escape\") {\n if (current) {\n event.preventDefault();\n closeDropdown();\n setState(null);\n return;\n }\n if ((mergedCompletions()?.length ?? 0) > 0) {\n event.preventDefault();\n textarea.blur();\n return;\n }\n }\n if (event.key === \"Enter\" && (event.metaKey || event.ctrlKey) && props.onSubmit) {\n event.preventDefault();\n props.onSubmit();\n return;\n }\n if (handleShortcut(event, textarea)) {\n event.preventDefault();\n return;\n }\n if (event.key === \"Enter\" && !event.shiftKey && !event.metaKey && !event.ctrlKey && !event.altKey && handleListContinuation(textarea)) {\n event.preventDefault();\n }\n };\n\n const saveControls = (): JSX.Element => (\n <>\n <Show when={props.onSave}>\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-markdown-editor__tool\"\n content={messages().saveShortcut}\n aria-label={messages().save}\n tabIndex={-1}\n disabled={props.disabled || props.saveDisabled || props.saving}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => props.onSave?.()}\n >\n <i class={props.saving ? \"ti ti-loader-2 k2b-spin\" : props.saved ? \"ti ti-check\" : \"ti ti-device-floppy\"} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n </Show>\n </>\n );\n\n return (\n <Field\n class={props.class}\n label={props.label}\n description={props.description}\n error={props.error}\n fill={props.fill}\n meta={meta}\n required={props.required}\n disabled={props.disabled}\n >\n <div\n class=\"k2b-markdown-editor\"\n role=\"group\"\n aria-labelledby={props.label ? meta.labelId : undefined}\n aria-label={!props.label ? props[\"aria-label\"] : undefined}\n data-disabled={props.disabled ? \"true\" : undefined}\n data-invalid={error() ? \"true\" : undefined}\n data-variant={props.variant === \"default\" ? undefined : props.variant}\n data-fill={props.fill ? \"true\" : undefined}\n style={{\n \"--k2b-editor-lines\": String(props.lines ?? 6),\n }}\n onKeyDown={(event) => {\n if (props.onSave && (event.metaKey || event.ctrlKey) && event.key.toLowerCase() === \"s\") {\n event.preventDefault();\n if (!props.disabled && !props.saveDisabled && !props.saving) props.onSave();\n }\n }}\n >\n <Show when={!props.noToolbar}>\n <Toolbar\n textarea={textareaSignal}\n activeFormats={activeFormats}\n disabled={props.disabled}\n trailing={\n <>\n {props.toolbarTrailing}\n {saveControls()}\n <Show when={props.onClose}>\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-markdown-editor__tool\"\n content={messages().close}\n aria-label={messages().close}\n tabIndex={props.disabled ? 0 : -1}\n onClick={() => props.onClose?.()}\n >\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </Tooltip.Trigger>\n </Show>\n </>\n }\n />\n </Show>\n <div class=\"k2b-markdown-editor__surface\">\n <Show when={!localValue() && props.placeholder}>\n <div class=\"k2b-markdown-editor__placeholder\" aria-hidden=\"true\">\n {props.placeholder}\n </div>\n </Show>\n <div ref={preview} class=\"k2b-markdown-editor__preview\" aria-hidden=\"true\" />\n <textarea\n ref={(element) => {\n textarea = element;\n props.textareaRef?.(element);\n }}\n id={meta.controlId}\n name={props.name}\n class=\"k2b-markdown-editor__input\"\n onInput={onInput}\n onChange={(event) => props.onValueCommit?.(event.currentTarget.value)}\n onKeyDown={onKeyDown}\n onPaste={(event) => {\n if (textarea && handleSmartPaste(event, textarea)) {\n event.preventDefault();\n }\n }}\n onScroll={(event) => {\n if (preview) {\n preview.scrollTop = event.currentTarget.scrollTop;\n preview.scrollLeft = event.currentTarget.scrollLeft;\n }\n }}\n onCompositionStart={() => setComposing(true)}\n onCompositionEnd={() => setComposing(false)}\n onBlur={(event) => {\n const next = event.relatedTarget as HTMLElement | null;\n if (next && dropdown?.contains(next)) return;\n completionBehavior.reset();\n clearCompletion();\n }}\n disabled={props.disabled}\n required={props.required}\n spellcheck={props.spellcheck ?? true}\n maxLength={props.maxLength}\n {...fieldControlAria(meta, props)}\n aria-haspopup=\"listbox\"\n aria-autocomplete=\"list\"\n aria-controls={dropdownOpen() ? listboxId : undefined}\n aria-activedescendant={dropdownOpen() && state() ? optionId(state()!.selectedIndex) : undefined}\n />\n </div>\n <Show when={(props.showStats ?? true) && !props.disabled}>\n <div class=\"k2b-markdown-editor__stats\" aria-hidden=\"true\" data-empty={stats().chars === 0 ? \"true\" : undefined}>\n <span>{messages().editorLines({ count: stats().lines, value: formatCount(stats().lines) })}</span>\n <span>{messages().editorWords({ count: stats().words, value: formatCount(stats().words) })}</span>\n <span>{messages().editorCharacters({ count: stats().chars, value: formatCount(stats().chars) })}</span>\n </div>\n </Show>\n <Show when={state() || loading() || completionError()}>\n <div\n ref={dropdown}\n popover=\"manual\"\n class=\"k2b-autocomplete__options\"\n role=\"presentation\"\n aria-label={messages().completionSuggestions}\n >\n <div id={listboxId} class=\"k2b-autocomplete__listbox\" role=\"listbox\" aria-label={messages().suggestions}>\n <Show when={loading()}>\n <div class=\"k2b-autocomplete__status\" role=\"status\">\n <i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\" />\n Loading suggestions\n </div>\n </Show>\n <Show when={completionError()}>\n {(message) => (\n <div class=\"k2b-autocomplete__status\" data-error=\"true\" role=\"alert\">\n <i class=\"ti ti-alert-circle\" aria-hidden=\"true\" />\n <span>{message()}</span>\n <button type=\"button\" onMouseDown={(event) => event.preventDefault()} onClick={retryCompletion}>\n {messages().retry}\n </button>\n </div>\n )}\n </Show>\n <For each={state()?.suggestions ?? []}>\n {(suggestion, index) => (\n // biome-ignore lint/a11y/useKeyWithClickEvents: the owning textarea handles keyboard activation through aria-activedescendant.\n <div\n id={optionId(index())}\n class=\"k2b-autocomplete__option\"\n role=\"option\"\n aria-selected={index() === state()?.selectedIndex}\n onMouseEnter={() => {\n const current = state();\n if (current) {\n setState({ ...current, selectedIndex: index() });\n }\n }}\n onMouseDown={(event) => {\n event.preventDefault();\n }}\n onClick={() => {\n activateSuggestion(index());\n textarea?.focus();\n }}\n >\n <span>{displayLabel(suggestion, state()!.context.completion)}</span>\n <Show when={suggestion.hint}>{(hint) => <small>{hint()}</small>}</Show>\n </div>\n )}\n </For>\n </div>\n </div>\n </Show>\n </div>\n </Field>\n );\n}\n\nexport type { Completion, SuggestContext, Suggestion } from \"../completion\";\nexport { abbreviations } from \"../completion\";\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["inputs/markdown/MarkdownEditor.tsx"],"sourcesContent":["import { highlight } from \"@k2b/stdlib\";\nimport { createEffect, createMemo, createSignal, createUniqueId, For, type JSX, onCleanup, onMount, Show, untrack } from \"solid-js\";\nimport { Tooltip } from \"../../feedback/Tooltip\";\nimport { createFieldMeta, Field, fieldControlAria } from \"../../internal/field\";\nimport { useLocale } from \"../../intl/locale\";\nimport { useUiMessages } from \"../../intl/messages\";\nimport {\n abbreviations as abbreviationsCompletion,\n buildSuggestContext,\n type Completion,\n collectKnownLabels,\n createCompletionBehaviorState,\n detectQuery,\n displayLabel,\n type QueryContext,\n renderWithOverlay,\n resolveSuggestions,\n type Suggestion,\n} from \"../completion\";\nimport { useCompletionMessages } from \"../completion-messages\";\nimport type { ValueFieldProps } from \"../field-contract\";\nimport { resolveMaybeAccessor } from \"../field-contract\";\nimport { computeActiveFormats } from \"./active-formats\";\nimport { handleListContinuation, handleShortcut, handleSmartPaste } from \"./behaviors\";\nimport { isInCodeZone } from \"./code-zone\";\nimport { useMarkdownEditorMessages } from \"./editor-messages\";\nimport Toolbar from \"./Toolbar\";\n\nexport type MarkdownEditorProps = ValueFieldProps<string> & {\n onSubmit?: () => void;\n placeholder?: string;\n lines?: number;\n noToolbar?: boolean;\n spellcheck?: boolean;\n name?: string;\n maxLength?: number;\n textareaRef?: (element: HTMLTextAreaElement) => void;\n abbreviations?: Record<string, string>;\n completions?: readonly Completion[];\n showStats?: boolean;\n variant?: \"default\" | \"paper\" | \"embedded\";\n fill?: boolean;\n /** Groups save and close at the end of the toolbar. The caller owns navigation and unsaved-change confirmation. */\n onClose?: () => void;\n onSave?: () => void;\n saveDisabled?: boolean;\n saving?: boolean;\n /** Shows a successful-save check. The caller clears it after a brief delay or the next edit. */\n saved?: boolean;\n toolbarTrailing?: JSX.Element;\n};\n\ntype CompletionState = {\n context: QueryContext;\n suggestions: readonly Suggestion[];\n selectedIndex: number;\n};\n\nexport function MarkdownEditor(props: MarkdownEditorProps): JSX.Element {\n const messages = useUiMessages();\n const markdownEditorMessages = useMarkdownEditorMessages();\n const completionMessages = useCompletionMessages();\n const locale = useLocale();\n const formatCount = (value: number) => new Intl.NumberFormat(locale()).format(value);\n const meta = createFieldMeta(props.id);\n let textarea: HTMLTextAreaElement | undefined;\n let preview: HTMLDivElement | undefined;\n let dropdown: HTMLDivElement | undefined;\n let completionAbort: AbortController | null = null;\n let completionTimer: ReturnType<typeof setTimeout> | null = null;\n let overlayFrame: number | undefined;\n let overlayInitialized = false;\n let renderPendingOverlay: (() => void) | undefined;\n const completionBehavior = createCompletionBehaviorState();\n\n const [textareaSignal, setTextareaSignal] = createSignal<HTMLTextAreaElement | null>(null);\n const [activeFormats, setActiveFormats] = createSignal<Set<string>>(new Set());\n const [composing, setComposing] = createSignal(false);\n const [localValue, setLocalValue] = createSignal(resolveMaybeAccessor(props.value) ?? \"\");\n const error = () => resolveMaybeAccessor(props.error);\n const [state, setState] = createSignal<CompletionState | null>(null);\n const [loading, setLoading] = createSignal(false);\n const [completionError, setCompletionError] = createSignal<string | null>(null);\n const [dropdownOpen, setDropdownOpen] = createSignal(false);\n const completionId = createUniqueId();\n const listboxId = `${meta.controlId}-${completionId}-suggestions`;\n const optionId = (index: number): string => `${listboxId}-${index}`;\n const activeSuggestion = (): Suggestion | null => {\n const current = state();\n return current?.suggestions[current.selectedIndex] ?? null;\n };\n\n const mergedCompletions = createMemo<readonly Completion[] | undefined>(() => {\n const merged: Completion[] = [];\n if (props.abbreviations && Object.keys(props.abbreviations).length > 0) {\n merged.push(abbreviationsCompletion(props.abbreviations));\n }\n if (props.completions) merged.push(...props.completions);\n return merged.length > 0 ? merged : undefined;\n });\n const knownLabels = createMemo(() => collectKnownLabels(mergedCompletions()));\n\n createEffect(() => {\n const incoming = resolveMaybeAccessor(props.value);\n if (incoming !== undefined && incoming !== null && incoming !== untrack(localValue)) {\n setLocalValue(incoming);\n }\n });\n\n createEffect(() => {\n const target = localValue();\n if (!composing() && textarea && textarea.value !== target) {\n textarea.value = target;\n }\n });\n\n createEffect(() => {\n if (!preview) return;\n const value = localValue();\n const labels = knownLabels();\n const current = state();\n const active = activeSuggestion();\n const ghost =\n current && active\n ? {\n at: current.context.end,\n text: active.text.slice(current.context.text.length),\n }\n : undefined;\n const anchor = current && !ghost ? { at: current.context.end } : undefined;\n renderPendingOverlay = () => {\n if (!preview) return;\n preview.innerHTML = renderWithOverlay(value, (text) => highlight.markdown(text, { knownLabels: labels }), { ghost, anchor });\n if (textarea) {\n preview.scrollTop = textarea.scrollTop;\n preview.scrollLeft = textarea.scrollLeft;\n }\n if (dropdown?.matches(\":popover-open\")) positionDropdown();\n };\n if (!overlayInitialized) {\n overlayInitialized = true;\n renderPendingOverlay();\n renderPendingOverlay = undefined;\n return;\n }\n if (overlayFrame !== undefined) return;\n overlayFrame = requestAnimationFrame(() => {\n overlayFrame = undefined;\n const render = renderPendingOverlay;\n renderPendingOverlay = undefined;\n render?.();\n });\n });\n\n const updateActiveFormats = (): void => {\n if (textarea) setActiveFormats(computeActiveFormats(textarea));\n };\n\n const closeDropdown = (): void => {\n if (dropdown?.matches(\":popover-open\")) dropdown.hidePopover();\n setDropdownOpen(false);\n };\n\n const clearCompletion = (): void => {\n completionAbort?.abort();\n completionAbort = null;\n if (completionTimer) clearTimeout(completionTimer);\n completionTimer = null;\n setState(null);\n setLoading(false);\n setCompletionError(null);\n closeDropdown();\n };\n\n const positionDropdown = (): void => {\n if (!dropdown?.isConnected || !preview?.isConnected || !textarea?.isConnected) {\n return;\n }\n const anchor = preview.querySelector<HTMLElement>(\"[data-completion-anchor]\");\n const rect = anchor?.getBoundingClientRect() ?? textarea.getBoundingClientRect();\n const maxHeight = 260;\n const spaceBelow = window.innerHeight - rect.bottom;\n const openAbove = spaceBelow < maxHeight && rect.top > spaceBelow;\n if (openAbove) {\n dropdown.style.setProperty(\"top\", \"auto\", \"important\");\n dropdown.style.setProperty(\"bottom\", `${window.innerHeight - rect.top + 4}px`, \"important\");\n } else {\n dropdown.style.setProperty(\"top\", `${rect.bottom + 4}px`, \"important\");\n dropdown.style.setProperty(\"bottom\", \"auto\", \"important\");\n }\n if (!dropdown.matches(\":popover-open\")) dropdown.showPopover();\n // The list sizes to its suggestions in CSS; measured once shown, it is\n // clamped into the viewport before the next paint.\n const width = dropdown.getBoundingClientRect().width;\n const left = Math.min(rect.left, window.innerWidth - width - 8);\n dropdown.style.setProperty(\"left\", `${Math.max(8, left)}px`, \"important\");\n };\n\n const isAbortError = (error: unknown): boolean =>\n error instanceof DOMException\n ? error.name === \"AbortError\"\n : Boolean(error && typeof error === \"object\" && \"name\" in error && (error as { name: string }).name === \"AbortError\");\n\n const applySuggestionList = (context: QueryContext, suggestions: readonly Suggestion[]): void => {\n const value = localValue();\n const normalized = context.text.toLowerCase();\n const usable = suggestions.filter((suggestion) => {\n if (suggestion.textEdit) {\n const { start, end, text } = suggestion.textEdit;\n return (\n Number.isInteger(start) &&\n Number.isInteger(end) &&\n start >= 0 &&\n end >= start &&\n end <= value.length &&\n value.slice(start, end) !== text\n );\n }\n return suggestion.text.toLowerCase().startsWith(normalized) && suggestion.text.length > context.text.length;\n });\n if (usable.length === 0) {\n setState(null);\n closeDropdown();\n return;\n }\n const previous = activeSuggestion()?.text;\n const retained = previous ? usable.findIndex((suggestion) => suggestion.text === previous) : -1;\n setState({\n context,\n suggestions: usable,\n selectedIndex: retained >= 0 ? retained : 0,\n });\n if (context.completion.dropdown) {\n setDropdownOpen(true);\n queueMicrotask(positionDropdown);\n } else {\n closeDropdown();\n }\n };\n\n const runAsyncCompletion = async (context: QueryContext, promise: Promise<readonly Suggestion[]>, signal: AbortSignal): Promise<void> => {\n try {\n const suggestions = await promise;\n if (signal.aborted) return;\n setLoading(false);\n applySuggestionList(context, suggestions);\n } catch (error) {\n if (signal.aborted || isAbortError(error)) return;\n setLoading(false);\n setState(null);\n setCompletionError(error instanceof Error ? error.message : \"Suggestions could not be loaded\");\n setDropdownOpen(true);\n queueMicrotask(positionDropdown);\n }\n };\n\n const startCompletionResolution = (context: QueryContext, signal: AbortSignal): void => {\n if (signal.aborted || !textarea) return;\n setLoading(true);\n setCompletionError(null);\n setDropdownOpen(true);\n queueMicrotask(positionDropdown);\n try {\n const result = resolveSuggestions(context.completion, context.query, buildSuggestContext(textarea, context), signal);\n if (result.kind === \"sync\") {\n setLoading(false);\n applySuggestionList(context, result.data);\n } else {\n void runAsyncCompletion(context, result.promise, signal);\n }\n } catch (error) {\n if (signal.aborted || isAbortError(error)) return;\n setLoading(false);\n setState(null);\n setCompletionError(error instanceof Error ? error.message : \"Suggestions could not be loaded\");\n queueMicrotask(positionDropdown);\n }\n };\n\n const recomputeCompletion = (): void => {\n if (!textarea) return;\n const context = detectQuery(textarea, mergedCompletions(), {\n isExcluded: isInCodeZone,\n });\n if (!context) {\n clearCompletion();\n return;\n }\n completionAbort?.abort();\n if (completionTimer) clearTimeout(completionTimer);\n completionTimer = null;\n completionAbort = new AbortController();\n const current = state();\n if (\n current &&\n (current.context.start !== context.start ||\n current.context.end !== context.end ||\n current.context.text !== context.text ||\n current.context.completion !== context.completion)\n ) {\n setState(null);\n closeDropdown();\n }\n setCompletionError(null);\n const delay = Math.max(0, context.completion.debounceMs ?? 0);\n if (delay === 0) {\n startCompletionResolution(context, completionAbort.signal);\n } else {\n setLoading(false);\n if (!state()) closeDropdown();\n const signal = completionAbort.signal;\n completionTimer = setTimeout(() => {\n completionTimer = null;\n startCompletionResolution(context, signal);\n }, delay);\n }\n };\n\n const retryCompletion = (): void => {\n if (!textarea) return;\n const context = detectQuery(textarea, mergedCompletions(), {\n isExcluded: isInCodeZone,\n });\n if (!context) return clearCompletion();\n completionAbort?.abort();\n if (completionTimer) clearTimeout(completionTimer);\n completionTimer = null;\n completionAbort = new AbortController();\n startCompletionResolution(context, completionAbort.signal);\n };\n\n const activateSuggestion = (index = state()?.selectedIndex ?? -1): boolean => {\n const current = state();\n const active = current?.suggestions[index];\n if (!textarea || !current || !active) return false;\n if (!active.textEdit && active.text === current.context.text) {\n closeDropdown();\n setState(null);\n return false;\n }\n const applied = completionBehavior.applySuggestion(textarea, current.context, active);\n closeDropdown();\n setState(null);\n return applied;\n };\n\n const moveSelection = (direction: 1 | -1): void => {\n const current = state();\n if (!current || current.suggestions.length === 0) return;\n setState({\n ...current,\n selectedIndex: (current.selectedIndex + direction + current.suggestions.length) % current.suggestions.length,\n });\n };\n\n const stats = createMemo(() => {\n const value = localValue();\n return {\n lines: value.length === 0 ? 0 : value.split(\"\\n\").length,\n words: value.match(/\\S+/g)?.length ?? 0,\n chars: value.length,\n };\n });\n\n onMount(() => {\n if (textarea) setTextareaSignal(textarea);\n updateActiveFormats();\n const selectionChange = (): void => {\n if (document.activeElement === textarea) {\n updateActiveFormats();\n recomputeCompletion();\n }\n };\n // Reposition an OPEN popover only. Calling `positionDropdown` blindly\n // would `showPopover()` a dropdown that is deliberately closed (a\n // ghost-only completion keeps state without a dropdown).\n const reposition = (): void => {\n if (dropdown?.matches(\":popover-open\")) positionDropdown();\n };\n document.addEventListener(\"selectionchange\", selectionChange);\n window.addEventListener(\"resize\", reposition);\n onCleanup(() => {\n document.removeEventListener(\"selectionchange\", selectionChange);\n window.removeEventListener(\"resize\", reposition);\n if (dropdown?.matches(\":popover-open\")) dropdown.hidePopover();\n completionAbort?.abort();\n if (completionTimer) clearTimeout(completionTimer);\n if (overlayFrame !== undefined) cancelAnimationFrame(overlayFrame);\n overlayFrame = undefined;\n renderPendingOverlay = undefined;\n completionBehavior.reset();\n });\n });\n\n const onInput = (event: InputEvent & { currentTarget: HTMLTextAreaElement }): void => {\n if (\n completionBehavior.tryExpand(event.currentTarget, mergedCompletions(), {\n isExcluded: isInCodeZone,\n })\n ) {\n return;\n }\n setLocalValue(event.currentTarget.value);\n props.onValueChange?.(event.currentTarget.value);\n updateActiveFormats();\n recomputeCompletion();\n };\n\n const onKeyDown = (event: KeyboardEvent): void => {\n if (!textarea || event.isComposing) return;\n if (\n event.key === \"Backspace\" &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.altKey &&\n !event.shiftKey &&\n completionBehavior.tryRestore(textarea)\n ) {\n event.preventDefault();\n return;\n }\n const current = state();\n const dropdownCompletion = current?.context.completion.dropdown === true;\n if (current && dropdownCompletion && (event.key === \"ArrowDown\" || event.key === \"ArrowUp\")) {\n event.preventDefault();\n moveSelection(event.key === \"ArrowDown\" ? 1 : -1);\n return;\n }\n if (\n event.key === \"Enter\" &&\n !event.shiftKey &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.altKey &&\n current &&\n dropdownCompletion &&\n dropdownOpen()\n ) {\n event.preventDefault();\n activateSuggestion();\n return;\n }\n if (event.key === \"Tab\" && !event.shiftKey && !event.metaKey && !event.ctrlKey && !event.altKey && current) {\n event.preventDefault();\n activateSuggestion();\n return;\n }\n if (event.key === \"Escape\") {\n if (current) {\n event.preventDefault();\n closeDropdown();\n setState(null);\n return;\n }\n if ((mergedCompletions()?.length ?? 0) > 0) {\n event.preventDefault();\n textarea.blur();\n return;\n }\n }\n if (event.key === \"Enter\" && (event.metaKey || event.ctrlKey) && props.onSubmit) {\n event.preventDefault();\n props.onSubmit();\n return;\n }\n if (handleShortcut(event, textarea)) {\n event.preventDefault();\n return;\n }\n if (event.key === \"Enter\" && !event.shiftKey && !event.metaKey && !event.ctrlKey && !event.altKey && handleListContinuation(textarea)) {\n event.preventDefault();\n }\n };\n\n const saveControls = (): JSX.Element => (\n <>\n <Show when={props.onSave}>\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-markdown-editor__tool\"\n content={markdownEditorMessages().saveShortcut}\n aria-label={messages().save}\n tabIndex={-1}\n disabled={props.disabled || props.saveDisabled || props.saving}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => props.onSave?.()}\n >\n <i class={props.saving ? \"ti ti-loader-2 k2b-spin\" : props.saved ? \"ti ti-check\" : \"ti ti-device-floppy\"} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n </Show>\n </>\n );\n\n return (\n <Field\n class={props.class}\n label={props.label}\n description={props.description}\n error={props.error}\n fill={props.fill}\n meta={meta}\n required={props.required}\n disabled={props.disabled}\n >\n <div\n class=\"k2b-markdown-editor\"\n role=\"group\"\n aria-labelledby={props.label ? meta.labelId : undefined}\n aria-label={!props.label ? props[\"aria-label\"] : undefined}\n data-disabled={props.disabled ? \"true\" : undefined}\n data-invalid={error() ? \"true\" : undefined}\n data-variant={props.variant === \"default\" ? undefined : props.variant}\n data-fill={props.fill ? \"true\" : undefined}\n style={{\n \"--k2b-editor-lines\": String(props.lines ?? 6),\n }}\n onKeyDown={(event) => {\n if (props.onSave && (event.metaKey || event.ctrlKey) && event.key.toLowerCase() === \"s\") {\n event.preventDefault();\n if (!props.disabled && !props.saveDisabled && !props.saving) props.onSave();\n }\n }}\n >\n <Show when={!props.noToolbar}>\n <Toolbar\n textarea={textareaSignal}\n activeFormats={activeFormats}\n disabled={props.disabled}\n trailing={\n <>\n {props.toolbarTrailing}\n {saveControls()}\n <Show when={props.onClose}>\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-markdown-editor__tool\"\n content={messages().close}\n aria-label={messages().close}\n tabIndex={props.disabled ? 0 : -1}\n onClick={() => props.onClose?.()}\n >\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </Tooltip.Trigger>\n </Show>\n </>\n }\n />\n </Show>\n <div class=\"k2b-markdown-editor__surface\">\n <Show when={!localValue() && props.placeholder}>\n <div class=\"k2b-markdown-editor__placeholder\" aria-hidden=\"true\">\n {props.placeholder}\n </div>\n </Show>\n <div ref={preview} class=\"k2b-markdown-editor__preview\" aria-hidden=\"true\" />\n <textarea\n ref={(element) => {\n textarea = element;\n props.textareaRef?.(element);\n }}\n id={meta.controlId}\n name={props.name}\n class=\"k2b-markdown-editor__input\"\n onInput={onInput}\n onChange={(event) => props.onValueCommit?.(event.currentTarget.value)}\n onKeyDown={onKeyDown}\n onPaste={(event) => {\n if (textarea && handleSmartPaste(event, textarea)) {\n event.preventDefault();\n }\n }}\n onScroll={(event) => {\n if (preview) {\n preview.scrollTop = event.currentTarget.scrollTop;\n preview.scrollLeft = event.currentTarget.scrollLeft;\n }\n }}\n onCompositionStart={() => setComposing(true)}\n onCompositionEnd={() => setComposing(false)}\n onBlur={(event) => {\n const next = event.relatedTarget as HTMLElement | null;\n if (next && dropdown?.contains(next)) return;\n completionBehavior.reset();\n clearCompletion();\n }}\n disabled={props.disabled}\n required={props.required}\n spellcheck={props.spellcheck ?? true}\n maxLength={props.maxLength}\n {...fieldControlAria(meta, props)}\n aria-haspopup=\"listbox\"\n aria-autocomplete=\"list\"\n aria-controls={dropdownOpen() ? listboxId : undefined}\n aria-activedescendant={dropdownOpen() && state() ? optionId(state()!.selectedIndex) : undefined}\n />\n </div>\n <Show when={(props.showStats ?? true) && !props.disabled}>\n <div class=\"k2b-markdown-editor__stats\" aria-hidden=\"true\" data-empty={stats().chars === 0 ? \"true\" : undefined}>\n <span>{markdownEditorMessages().editorLines({ count: stats().lines, value: formatCount(stats().lines) })}</span>\n <span>{markdownEditorMessages().editorWords({ count: stats().words, value: formatCount(stats().words) })}</span>\n <span>{markdownEditorMessages().editorCharacters({ count: stats().chars, value: formatCount(stats().chars) })}</span>\n </div>\n </Show>\n <Show when={state() || loading() || completionError()}>\n <div\n ref={dropdown}\n popover=\"manual\"\n class=\"k2b-autocomplete__options\"\n role=\"presentation\"\n aria-label={completionMessages().completionSuggestions}\n >\n <div id={listboxId} class=\"k2b-autocomplete__listbox\" role=\"listbox\" aria-label={completionMessages().suggestions}>\n <Show when={loading()}>\n <div class=\"k2b-autocomplete__status\" role=\"status\">\n <i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\" />\n Loading suggestions\n </div>\n </Show>\n <Show when={completionError()}>\n {(message) => (\n <div class=\"k2b-autocomplete__status\" data-error=\"true\" role=\"alert\">\n <i class=\"ti ti-alert-circle\" aria-hidden=\"true\" />\n <span>{message()}</span>\n <button type=\"button\" onMouseDown={(event) => event.preventDefault()} onClick={retryCompletion}>\n {messages().retry}\n </button>\n </div>\n )}\n </Show>\n <For each={state()?.suggestions ?? []}>\n {(suggestion, index) => (\n // biome-ignore lint/a11y/useKeyWithClickEvents: the owning textarea handles keyboard activation through aria-activedescendant.\n <div\n id={optionId(index())}\n class=\"k2b-autocomplete__option\"\n role=\"option\"\n aria-selected={index() === state()?.selectedIndex}\n onMouseEnter={() => {\n const current = state();\n if (current) {\n setState({ ...current, selectedIndex: index() });\n }\n }}\n onMouseDown={(event) => {\n event.preventDefault();\n }}\n onClick={() => {\n activateSuggestion(index());\n textarea?.focus();\n }}\n >\n <span>{displayLabel(suggestion, state()!.context.completion)}</span>\n <Show when={suggestion.hint}>{(hint) => <small>{hint()}</small>}</Show>\n </div>\n )}\n </For>\n </div>\n </div>\n </Show>\n </div>\n </Field>\n );\n}\n\nexport type { Completion, SuggestContext, Suggestion } from \"../completion\";\nexport { abbreviations } from \"../completion\";\n"],"mappings":"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","ignoreList":[]}
@@ -9,8 +9,8 @@ var _tmpl$ = ["<span class=\"k2b-markdown-editor__trailing\">", "</span>"],
9
9
  _tmpl$4 = ["<i", " aria-hidden=\"true\"></i>"];
10
10
  import { For, Show } from "solid-js";
11
11
  import { Tooltip } from "../../feedback/Tooltip";
12
- import { useUiMessages } from "../../intl/messages";
13
12
  import { insertLink, toggleBold, toggleBulletList, toggleCode, toggleHeading, toggleItalic, toggleNumberedList, toggleQuote } from "./actions";
13
+ import { useMarkdownToolbarMessages } from "./toolbar-messages";
14
14
  const TOOLS = [{
15
15
  kind: "button",
16
16
  id: "bold",
@@ -77,18 +77,18 @@ const TOOLS = [{
77
77
  run: toggleQuote
78
78
  }];
79
79
  export default function Toolbar(props) {
80
- const messages = useUiMessages();
80
+ const markdownToolbarMessages = useMarkdownToolbarMessages();
81
81
  const title = (id, fallback) => ({
82
- bold: messages().boldShortcut,
83
- italic: messages().italicShortcut,
84
- code: messages().inlineCodeShortcut,
85
- link: messages().linkShortcut,
86
- h1: messages().heading1Shortcut,
87
- h2: messages().heading2Shortcut,
88
- h3: messages().heading3Shortcut,
89
- bullet: messages().bulletListShortcut,
90
- ordered: messages().numberedListShortcut,
91
- quote: messages().quote
82
+ bold: markdownToolbarMessages().boldShortcut,
83
+ italic: markdownToolbarMessages().italicShortcut,
84
+ code: markdownToolbarMessages().inlineCodeShortcut,
85
+ link: markdownToolbarMessages().linkShortcut,
86
+ h1: markdownToolbarMessages().heading1Shortcut,
87
+ h2: markdownToolbarMessages().heading2Shortcut,
88
+ h3: markdownToolbarMessages().heading3Shortcut,
89
+ bullet: markdownToolbarMessages().bulletListShortcut,
90
+ ordered: markdownToolbarMessages().numberedListShortcut,
91
+ quote: markdownToolbarMessages().quote
92
92
  })[id] ?? fallback;
93
93
  let toolbar;
94
94
  const moveFocus = event => {
@@ -102,7 +102,7 @@ export default function Toolbar(props) {
102
102
  buttons[next].tabIndex = 0;
103
103
  buttons[next].focus();
104
104
  };
105
- return _$ssr(_tmpl$2, _$ssrAttribute("aria-label", _$escape(messages().markdownFormatting, true), false), _$escape(_$createComponent(For, {
105
+ return _$ssr(_tmpl$2, _$ssrAttribute("aria-label", _$escape(markdownToolbarMessages().markdownFormatting, true), false), _$escape(_$createComponent(For, {
106
106
  each: TOOLS,
107
107
  children: (tool, index) => tool.kind === "separator" ? _$ssr(_tmpl$3) : _$createComponent(Tooltip.Trigger, {
108
108
  type: "button",