@k2b/ui 0.21.0 → 0.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (563) hide show
  1. package/dist/browser/actions/ContextMenu.js +3 -1
  2. package/dist/browser/actions/ContextMenu.js.map +1 -1
  3. package/dist/browser/actions/FilterChip.js +3 -1
  4. package/dist/browser/actions/FilterChip.js.map +1 -1
  5. package/dist/browser/actions/SpotlightSearch.js +3 -1
  6. package/dist/browser/actions/SpotlightSearch.js.map +1 -1
  7. package/dist/browser/actions/filter-messages.js +20 -0
  8. package/dist/browser/actions/filter-messages.js.map +1 -0
  9. package/dist/browser/actions/spotlight-messages.js +16 -0
  10. package/dist/browser/actions/spotlight-messages.js.map +1 -0
  11. package/dist/browser/chat/ChatComposer.js +47 -41
  12. package/dist/browser/chat/ChatComposer.js.map +1 -1
  13. package/dist/browser/chat/ChatPrimitives.js +25 -23
  14. package/dist/browser/chat/ChatPrimitives.js.map +1 -1
  15. package/dist/browser/chat/ChatRoot.js +3 -3
  16. package/dist/browser/chat/ChatRoot.js.map +1 -1
  17. package/dist/browser/chat/ChatTimeline.js +12 -12
  18. package/dist/browser/chat/ChatTimeline.js.map +1 -1
  19. package/dist/browser/chat/chat-messages.js +236 -0
  20. package/dist/browser/chat/chat-messages.js.map +1 -0
  21. package/dist/browser/content/Calendar.js +18 -19
  22. package/dist/browser/content/Calendar.js.map +1 -1
  23. package/dist/browser/content/Chart.js +15 -8
  24. package/dist/browser/content/Chart.js.map +1 -1
  25. package/dist/browser/content/ChartExplorer.js +20 -12
  26. package/dist/browser/content/ChartExplorer.js.map +1 -1
  27. package/dist/browser/content/ChartExplorerControls.js +9 -7
  28. package/dist/browser/content/ChartExplorerControls.js.map +1 -1
  29. package/dist/browser/content/ChartFilterControls.js +4 -2
  30. package/dist/browser/content/ChartFilterControls.js.map +1 -1
  31. package/dist/browser/content/ChartSnapshotView.js +3 -3
  32. package/dist/browser/content/ChartSnapshotView.js.map +1 -1
  33. package/dist/browser/content/DataTable.js +68 -59
  34. package/dist/browser/content/DataTable.js.map +1 -1
  35. package/dist/browser/content/Docs.js +3 -1
  36. package/dist/browser/content/Docs.js.map +1 -1
  37. package/dist/browser/content/FileBrowser.js +30 -26
  38. package/dist/browser/content/FileBrowser.js.map +1 -1
  39. package/dist/browser/content/FileTree.js +9 -7
  40. package/dist/browser/content/FileTree.js.map +1 -1
  41. package/dist/browser/content/FileView.js +37 -28
  42. package/dist/browser/content/FileView.js.map +1 -1
  43. package/dist/browser/content/Lightbox.js +9 -7
  44. package/dist/browser/content/Lightbox.js.map +1 -1
  45. package/dist/browser/content/LogEntriesTable.js +3 -3
  46. package/dist/browser/content/LogEntriesTable.js.map +1 -1
  47. package/dist/browser/content/MessageRow.js +24 -22
  48. package/dist/browser/content/MessageRow.js.map +1 -1
  49. package/dist/browser/content/Pagination.js +7 -7
  50. package/dist/browser/content/Pagination.js.map +1 -1
  51. package/dist/browser/content/PdfPreview.js +15 -13
  52. package/dist/browser/content/PdfPreview.js.map +1 -1
  53. package/dist/browser/content/RangePicker.js +3 -1
  54. package/dist/browser/content/RangePicker.js.map +1 -1
  55. package/dist/browser/content/StructuredDataPreview.js +3 -1
  56. package/dist/browser/content/StructuredDataPreview.js.map +1 -1
  57. package/dist/browser/content/Timeline.js +13 -11
  58. package/dist/browser/content/Timeline.js.map +1 -1
  59. package/dist/browser/content/VideoPlayer.js +5 -5
  60. package/dist/browser/content/VideoPlayer.js.map +1 -1
  61. package/dist/browser/content/VirtualFeed.js +6 -4
  62. package/dist/browser/content/VirtualFeed.js.map +1 -1
  63. package/dist/browser/content/ZoomPanViewport.js +10 -7
  64. package/dist/browser/content/ZoomPanViewport.js.map +1 -1
  65. package/dist/browser/content/calendar-messages.js +39 -1
  66. package/dist/browser/content/calendar-messages.js.map +1 -1
  67. package/dist/browser/content/calendar-pointer.js +4 -3
  68. package/dist/browser/content/calendar-pointer.js.map +1 -1
  69. package/dist/browser/content/chart-messages.js +136 -0
  70. package/dist/browser/content/chart-messages.js.map +1 -0
  71. package/dist/browser/content/collection-selection.js +2 -0
  72. package/dist/browser/content/collection-selection.js.map +1 -1
  73. package/dist/browser/content/data-table-messages.js +24 -0
  74. package/dist/browser/content/data-table-messages.js.map +1 -0
  75. package/dist/browser/content/docs-messages.js +24 -0
  76. package/dist/browser/content/docs-messages.js.map +1 -0
  77. package/dist/browser/content/feed-messages.js +34 -0
  78. package/dist/browser/content/feed-messages.js.map +1 -0
  79. package/dist/browser/content/file-browser-messages.js +69 -0
  80. package/dist/browser/content/file-browser-messages.js.map +1 -0
  81. package/dist/browser/content/file-view-messages.js +64 -0
  82. package/dist/browser/content/file-view-messages.js.map +1 -0
  83. package/dist/browser/content/lightbox-messages.js +36 -0
  84. package/dist/browser/content/lightbox-messages.js.map +1 -0
  85. package/dist/browser/content/log-entries-messages.js +20 -0
  86. package/dist/browser/content/log-entries-messages.js.map +1 -0
  87. package/dist/browser/content/markdown-info-block-messages.js +24 -0
  88. package/dist/browser/content/markdown-info-block-messages.js.map +1 -0
  89. package/dist/browser/content/markdown-info-blocks.js +3 -3
  90. package/dist/browser/content/markdown-info-blocks.js.map +1 -1
  91. package/dist/browser/content/markdown-links.js +2 -2
  92. package/dist/browser/content/markdown-links.js.map +1 -1
  93. package/dist/browser/content/markdown-reference-messages.js +30 -0
  94. package/dist/browser/content/markdown-reference-messages.js.map +1 -0
  95. package/dist/browser/content/pagination-messages.js +38 -0
  96. package/dist/browser/content/pagination-messages.js.map +1 -0
  97. package/dist/browser/content/pdf-messages.js +43 -0
  98. package/dist/browser/content/pdf-messages.js.map +1 -0
  99. package/dist/browser/content/range-picker-messages.js +20 -0
  100. package/dist/browser/content/range-picker-messages.js.map +1 -0
  101. package/dist/browser/content/structured-data-messages.js +22 -0
  102. package/dist/browser/content/structured-data-messages.js.map +1 -0
  103. package/dist/browser/content/timeline-messages.js +62 -0
  104. package/dist/browser/content/timeline-messages.js.map +1 -0
  105. package/dist/browser/content/video-messages.js +24 -0
  106. package/dist/browser/content/video-messages.js.map +1 -0
  107. package/dist/browser/content/viewport-messages.js +28 -0
  108. package/dist/browser/content/viewport-messages.js.map +1 -0
  109. package/dist/browser/feedback/HoverPreview.js +34 -6
  110. package/dist/browser/feedback/HoverPreview.js.map +1 -1
  111. package/dist/browser/feedback/InstallGuide.js +18 -18
  112. package/dist/browser/feedback/InstallGuide.js.map +1 -1
  113. package/dist/browser/feedback/install-messages.js +104 -0
  114. package/dist/browser/feedback/install-messages.js.map +1 -0
  115. package/dist/browser/feedback/prompt-messages.js +65 -0
  116. package/dist/browser/feedback/prompt-messages.js.map +1 -0
  117. package/dist/browser/feedback/prompts.js +14 -11
  118. package/dist/browser/feedback/prompts.js.map +1 -1
  119. package/dist/browser/feedback/toast-messages.js +18 -0
  120. package/dist/browser/feedback/toast-messages.js.map +1 -0
  121. package/dist/browser/feedback/toast.js +4 -3
  122. package/dist/browser/feedback/toast.js.map +1 -1
  123. package/dist/browser/index.js +1 -1
  124. package/dist/browser/index.js.map +1 -1
  125. package/dist/browser/inputs/AutocompleteEditor.js +6 -4
  126. package/dist/browser/inputs/AutocompleteEditor.js.map +1 -1
  127. package/dist/browser/inputs/AutocompleteSelect.js +10 -8
  128. package/dist/browser/inputs/AutocompleteSelect.js.map +1 -1
  129. package/dist/browser/inputs/ChoiceGroups.js +4 -0
  130. package/dist/browser/inputs/ChoiceGroups.js.map +1 -1
  131. package/dist/browser/inputs/ChoiceInputs.js +5 -5
  132. package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
  133. package/dist/browser/inputs/Combobox.js +3 -1
  134. package/dist/browser/inputs/Combobox.js.map +1 -1
  135. package/dist/browser/inputs/FileDropTarget.js +6 -6
  136. package/dist/browser/inputs/FileDropTarget.js.map +1 -1
  137. package/dist/browser/inputs/FileInputs.js +30 -21
  138. package/dist/browser/inputs/FileInputs.js.map +1 -1
  139. package/dist/browser/inputs/MultiSelectInput.js +7 -5
  140. package/dist/browser/inputs/MultiSelectInput.js.map +1 -1
  141. package/dist/browser/inputs/NumberInput.js +4 -2
  142. package/dist/browser/inputs/NumberInput.js.map +1 -1
  143. package/dist/browser/inputs/QrScanner.js +5 -5
  144. package/dist/browser/inputs/QrScanner.js.map +1 -1
  145. package/dist/browser/inputs/Select.js +7 -5
  146. package/dist/browser/inputs/Select.js.map +1 -1
  147. package/dist/browser/inputs/SelectChip.js +3 -3
  148. package/dist/browser/inputs/SelectChip.js.map +1 -1
  149. package/dist/browser/inputs/SignatureInput.js +9 -3
  150. package/dist/browser/inputs/SignatureInput.js.map +1 -1
  151. package/dist/browser/inputs/SpecialInputs.js +4 -2
  152. package/dist/browser/inputs/SpecialInputs.js.map +1 -1
  153. package/dist/browser/inputs/TagEditor.js +8 -6
  154. package/dist/browser/inputs/TagEditor.js.map +1 -1
  155. package/dist/browser/inputs/TagsInput.js +5 -5
  156. package/dist/browser/inputs/TagsInput.js.map +1 -1
  157. package/dist/browser/inputs/TemplateEditor.js +5 -5
  158. package/dist/browser/inputs/TemplateEditor.js.map +1 -1
  159. package/dist/browser/inputs/TextInput.js +3 -1
  160. package/dist/browser/inputs/TextInput.js.map +1 -1
  161. package/dist/browser/inputs/completion-messages.js +24 -0
  162. package/dist/browser/inputs/completion-messages.js.map +1 -0
  163. package/dist/browser/inputs/file-drop-messages.js +63 -0
  164. package/dist/browser/inputs/file-drop-messages.js.map +1 -0
  165. package/dist/browser/inputs/file-drop.js.map +1 -1
  166. package/dist/browser/inputs/file-input-messages.js +60 -0
  167. package/dist/browser/inputs/file-input-messages.js.map +1 -0
  168. package/dist/browser/inputs/icon-messages.js +22 -0
  169. package/dist/browser/inputs/icon-messages.js.map +1 -0
  170. package/dist/browser/inputs/input-messages.js +38 -0
  171. package/dist/browser/inputs/input-messages.js.map +1 -0
  172. package/dist/browser/inputs/markdown/MarkdownEditor.js +10 -6
  173. package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
  174. package/dist/browser/inputs/markdown/Toolbar.js +13 -13
  175. package/dist/browser/inputs/markdown/Toolbar.js.map +1 -1
  176. package/dist/browser/inputs/markdown/editor-messages.js +43 -0
  177. package/dist/browser/inputs/markdown/editor-messages.js.map +1 -0
  178. package/dist/browser/inputs/markdown/toolbar-messages.js +40 -0
  179. package/dist/browser/inputs/markdown/toolbar-messages.js.map +1 -0
  180. package/dist/browser/inputs/qr-messages.js +26 -0
  181. package/dist/browser/inputs/qr-messages.js.map +1 -0
  182. package/dist/browser/inputs/select-messages.js +63 -0
  183. package/dist/browser/inputs/select-messages.js.map +1 -0
  184. package/dist/browser/inputs/tag-messages.js +44 -0
  185. package/dist/browser/inputs/tag-messages.js.map +1 -0
  186. package/dist/browser/inputs/template-messages.js +22 -0
  187. package/dist/browser/inputs/template-messages.js.map +1 -0
  188. package/dist/browser/internal/render-error-messages.js +20 -0
  189. package/dist/browser/internal/render-error-messages.js.map +1 -0
  190. package/dist/browser/internal/render-error.js +3 -1
  191. package/dist/browser/internal/render-error.js.map +1 -1
  192. package/dist/browser/internal/text-selection.js +101 -0
  193. package/dist/browser/internal/text-selection.js.map +1 -0
  194. package/dist/browser/intl/messages.js +6 -1155
  195. package/dist/browser/intl/messages.js.map +1 -1
  196. package/dist/browser/layout/AppWorkspace.js +561 -418
  197. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  198. package/dist/browser/layout/BottomSheet.js +6 -1
  199. package/dist/browser/layout/BottomSheet.js.map +1 -1
  200. package/dist/browser/layout/Discussion.js +8 -5
  201. package/dist/browser/layout/Discussion.js.map +1 -1
  202. package/dist/browser/layout/FloatingWindow.js +8 -5
  203. package/dist/browser/layout/FloatingWindow.js.map +1 -1
  204. package/dist/browser/layout/Navigation.js +7 -6
  205. package/dist/browser/layout/Navigation.js.map +1 -1
  206. package/dist/browser/layout/PageTitle.js +370 -0
  207. package/dist/browser/layout/PageTitle.js.map +1 -0
  208. package/dist/browser/layout/PanelDialog.js +8 -6
  209. package/dist/browser/layout/PanelDialog.js.map +1 -1
  210. package/dist/browser/layout/Panes.js +23 -15
  211. package/dist/browser/layout/Panes.js.map +1 -1
  212. package/dist/browser/layout/PullToRefresh.js +13 -4
  213. package/dist/browser/layout/PullToRefresh.js.map +1 -1
  214. package/dist/browser/layout/Settings.js +14 -12
  215. package/dist/browser/layout/Settings.js.map +1 -1
  216. package/dist/browser/layout/SettingsCollection.js +6 -5
  217. package/dist/browser/layout/SettingsCollection.js.map +1 -1
  218. package/dist/browser/layout/SettingsModal.js +3 -1
  219. package/dist/browser/layout/SettingsModal.js.map +1 -1
  220. package/dist/browser/layout/app-workspace-controller.js +743 -12
  221. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  222. package/dist/browser/layout/app-workspace-state.js +3 -2
  223. package/dist/browser/layout/app-workspace-state.js.map +1 -1
  224. package/dist/browser/layout/floating-window-messages.js +28 -0
  225. package/dist/browser/layout/floating-window-messages.js.map +1 -0
  226. package/dist/browser/layout/index.js +2 -0
  227. package/dist/browser/layout/index.js.map +1 -1
  228. package/dist/browser/layout/navigation-model.js.map +1 -1
  229. package/dist/browser/layout/page-title-controller.js +169 -0
  230. package/dist/browser/layout/page-title-controller.js.map +1 -0
  231. package/dist/browser/layout/panel-dialog-messages.js +20 -0
  232. package/dist/browser/layout/panel-dialog-messages.js.map +1 -0
  233. package/dist/browser/layout/panes-messages.js +48 -0
  234. package/dist/browser/layout/panes-messages.js.map +1 -0
  235. package/dist/browser/layout/refresh-messages.js +20 -0
  236. package/dist/browser/layout/refresh-messages.js.map +1 -0
  237. package/dist/browser/layout/settings-messages.js +54 -0
  238. package/dist/browser/layout/settings-messages.js.map +1 -0
  239. package/dist/browser/layout/workspace-messages.js +56 -0
  240. package/dist/browser/layout/workspace-messages.js.map +1 -0
  241. package/dist/browser/surfaces/Avatar.js +5 -5
  242. package/dist/browser/surfaces/Avatar.js.map +1 -1
  243. package/dist/browser/surfaces/ResourceCard.js +4 -2
  244. package/dist/browser/surfaces/ResourceCard.js.map +1 -1
  245. package/dist/browser/surfaces/Tag.js +3 -3
  246. package/dist/browser/surfaces/Tag.js.map +1 -1
  247. package/dist/browser/surfaces/avatar-messages.js +26 -0
  248. package/dist/browser/surfaces/avatar-messages.js.map +1 -0
  249. package/dist/browser/surfaces/resource-messages.js +26 -0
  250. package/dist/browser/surfaces/resource-messages.js.map +1 -0
  251. package/dist/browser/widgets/Widget.js +6 -0
  252. package/dist/browser/widgets/Widget.js.map +1 -1
  253. package/dist/ssr/actions/ContextMenu.js.map +1 -1
  254. package/dist/ssr/actions/FilterChip.js +3 -1
  255. package/dist/ssr/actions/FilterChip.js.map +1 -1
  256. package/dist/ssr/actions/SpotlightSearch.js +3 -1
  257. package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
  258. package/dist/ssr/actions/filter-messages.js +20 -0
  259. package/dist/ssr/actions/filter-messages.js.map +1 -0
  260. package/dist/ssr/actions/spotlight-messages.js +16 -0
  261. package/dist/ssr/actions/spotlight-messages.js.map +1 -0
  262. package/dist/ssr/chat/ChatComposer.js +47 -41
  263. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  264. package/dist/ssr/chat/ChatPrimitives.js +23 -21
  265. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  266. package/dist/ssr/chat/ChatRoot.js +3 -3
  267. package/dist/ssr/chat/ChatRoot.js.map +1 -1
  268. package/dist/ssr/chat/ChatTimeline.js +11 -11
  269. package/dist/ssr/chat/ChatTimeline.js.map +1 -1
  270. package/dist/ssr/chat/chat-messages.js +236 -0
  271. package/dist/ssr/chat/chat-messages.js.map +1 -0
  272. package/dist/ssr/content/Calendar.js +18 -19
  273. package/dist/ssr/content/Calendar.js.map +1 -1
  274. package/dist/ssr/content/Chart.js +12 -5
  275. package/dist/ssr/content/Chart.js.map +1 -1
  276. package/dist/ssr/content/ChartExplorer.js +10 -8
  277. package/dist/ssr/content/ChartExplorer.js.map +1 -1
  278. package/dist/ssr/content/ChartExplorerControls.js +9 -7
  279. package/dist/ssr/content/ChartExplorerControls.js.map +1 -1
  280. package/dist/ssr/content/ChartFilterControls.js +4 -2
  281. package/dist/ssr/content/ChartFilterControls.js.map +1 -1
  282. package/dist/ssr/content/ChartSnapshotView.js +3 -3
  283. package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
  284. package/dist/ssr/content/DataTable.js +10 -4
  285. package/dist/ssr/content/DataTable.js.map +1 -1
  286. package/dist/ssr/content/Docs.js +3 -1
  287. package/dist/ssr/content/Docs.js.map +1 -1
  288. package/dist/ssr/content/FileBrowser.js +30 -26
  289. package/dist/ssr/content/FileBrowser.js.map +1 -1
  290. package/dist/ssr/content/FileTree.js +9 -7
  291. package/dist/ssr/content/FileTree.js.map +1 -1
  292. package/dist/ssr/content/FileView.js +37 -28
  293. package/dist/ssr/content/FileView.js.map +1 -1
  294. package/dist/ssr/content/Lightbox.js +8 -6
  295. package/dist/ssr/content/Lightbox.js.map +1 -1
  296. package/dist/ssr/content/LogEntriesTable.js +3 -3
  297. package/dist/ssr/content/LogEntriesTable.js.map +1 -1
  298. package/dist/ssr/content/MessageRow.js +24 -22
  299. package/dist/ssr/content/MessageRow.js.map +1 -1
  300. package/dist/ssr/content/Pagination.js +6 -6
  301. package/dist/ssr/content/Pagination.js.map +1 -1
  302. package/dist/ssr/content/PdfPreview.js +15 -13
  303. package/dist/ssr/content/PdfPreview.js.map +1 -1
  304. package/dist/ssr/content/RangePicker.js +3 -1
  305. package/dist/ssr/content/RangePicker.js.map +1 -1
  306. package/dist/ssr/content/StructuredDataPreview.js +3 -1
  307. package/dist/ssr/content/StructuredDataPreview.js.map +1 -1
  308. package/dist/ssr/content/Timeline.js +13 -11
  309. package/dist/ssr/content/Timeline.js.map +1 -1
  310. package/dist/ssr/content/VideoPlayer.js +5 -5
  311. package/dist/ssr/content/VideoPlayer.js.map +1 -1
  312. package/dist/ssr/content/VirtualFeed.js +6 -4
  313. package/dist/ssr/content/VirtualFeed.js.map +1 -1
  314. package/dist/ssr/content/ZoomPanViewport.js +7 -4
  315. package/dist/ssr/content/ZoomPanViewport.js.map +1 -1
  316. package/dist/ssr/content/calendar-messages.js +39 -1
  317. package/dist/ssr/content/calendar-messages.js.map +1 -1
  318. package/dist/ssr/content/calendar-pointer.js +4 -3
  319. package/dist/ssr/content/calendar-pointer.js.map +1 -1
  320. package/dist/ssr/content/chart-messages.js +136 -0
  321. package/dist/ssr/content/chart-messages.js.map +1 -0
  322. package/dist/ssr/content/collection-selection.js +2 -0
  323. package/dist/ssr/content/collection-selection.js.map +1 -1
  324. package/dist/ssr/content/data-table-messages.js +24 -0
  325. package/dist/ssr/content/data-table-messages.js.map +1 -0
  326. package/dist/ssr/content/docs-messages.js +24 -0
  327. package/dist/ssr/content/docs-messages.js.map +1 -0
  328. package/dist/ssr/content/feed-messages.js +34 -0
  329. package/dist/ssr/content/feed-messages.js.map +1 -0
  330. package/dist/ssr/content/file-browser-messages.js +69 -0
  331. package/dist/ssr/content/file-browser-messages.js.map +1 -0
  332. package/dist/ssr/content/file-view-messages.js +64 -0
  333. package/dist/ssr/content/file-view-messages.js.map +1 -0
  334. package/dist/ssr/content/lightbox-messages.js +36 -0
  335. package/dist/ssr/content/lightbox-messages.js.map +1 -0
  336. package/dist/ssr/content/log-entries-messages.js +20 -0
  337. package/dist/ssr/content/log-entries-messages.js.map +1 -0
  338. package/dist/ssr/content/markdown-info-block-messages.js +24 -0
  339. package/dist/ssr/content/markdown-info-block-messages.js.map +1 -0
  340. package/dist/ssr/content/markdown-info-blocks.js +3 -3
  341. package/dist/ssr/content/markdown-info-blocks.js.map +1 -1
  342. package/dist/ssr/content/markdown-links.js +2 -2
  343. package/dist/ssr/content/markdown-links.js.map +1 -1
  344. package/dist/ssr/content/markdown-reference-messages.js +30 -0
  345. package/dist/ssr/content/markdown-reference-messages.js.map +1 -0
  346. package/dist/ssr/content/pagination-messages.js +38 -0
  347. package/dist/ssr/content/pagination-messages.js.map +1 -0
  348. package/dist/ssr/content/pdf-messages.js +43 -0
  349. package/dist/ssr/content/pdf-messages.js.map +1 -0
  350. package/dist/ssr/content/range-picker-messages.js +20 -0
  351. package/dist/ssr/content/range-picker-messages.js.map +1 -0
  352. package/dist/ssr/content/structured-data-messages.js +22 -0
  353. package/dist/ssr/content/structured-data-messages.js.map +1 -0
  354. package/dist/ssr/content/timeline-messages.js +62 -0
  355. package/dist/ssr/content/timeline-messages.js.map +1 -0
  356. package/dist/ssr/content/video-messages.js +24 -0
  357. package/dist/ssr/content/video-messages.js.map +1 -0
  358. package/dist/ssr/content/viewport-messages.js +28 -0
  359. package/dist/ssr/content/viewport-messages.js.map +1 -0
  360. package/dist/ssr/feedback/HoverPreview.js +34 -6
  361. package/dist/ssr/feedback/HoverPreview.js.map +1 -1
  362. package/dist/ssr/feedback/InstallGuide.js +18 -18
  363. package/dist/ssr/feedback/InstallGuide.js.map +1 -1
  364. package/dist/ssr/feedback/install-messages.js +104 -0
  365. package/dist/ssr/feedback/install-messages.js.map +1 -0
  366. package/dist/ssr/feedback/prompt-messages.js +65 -0
  367. package/dist/ssr/feedback/prompt-messages.js.map +1 -0
  368. package/dist/ssr/feedback/prompts.js +14 -11
  369. package/dist/ssr/feedback/prompts.js.map +1 -1
  370. package/dist/ssr/feedback/toast-messages.js +18 -0
  371. package/dist/ssr/feedback/toast-messages.js.map +1 -0
  372. package/dist/ssr/feedback/toast.js +4 -3
  373. package/dist/ssr/feedback/toast.js.map +1 -1
  374. package/dist/ssr/index.js +1 -1
  375. package/dist/ssr/index.js.map +1 -1
  376. package/dist/ssr/inputs/AutocompleteEditor.js +5 -3
  377. package/dist/ssr/inputs/AutocompleteEditor.js.map +1 -1
  378. package/dist/ssr/inputs/AutocompleteSelect.js +10 -8
  379. package/dist/ssr/inputs/AutocompleteSelect.js.map +1 -1
  380. package/dist/ssr/inputs/ChoiceGroups.js +4 -0
  381. package/dist/ssr/inputs/ChoiceGroups.js.map +1 -1
  382. package/dist/ssr/inputs/ChoiceInputs.js +5 -5
  383. package/dist/ssr/inputs/ChoiceInputs.js.map +1 -1
  384. package/dist/ssr/inputs/Combobox.js +3 -1
  385. package/dist/ssr/inputs/Combobox.js.map +1 -1
  386. package/dist/ssr/inputs/FileDropTarget.js +6 -6
  387. package/dist/ssr/inputs/FileDropTarget.js.map +1 -1
  388. package/dist/ssr/inputs/FileInputs.js +29 -20
  389. package/dist/ssr/inputs/FileInputs.js.map +1 -1
  390. package/dist/ssr/inputs/MultiSelectInput.js +7 -5
  391. package/dist/ssr/inputs/MultiSelectInput.js.map +1 -1
  392. package/dist/ssr/inputs/NumberInput.js +4 -2
  393. package/dist/ssr/inputs/NumberInput.js.map +1 -1
  394. package/dist/ssr/inputs/QrScanner.js +4 -4
  395. package/dist/ssr/inputs/QrScanner.js.map +1 -1
  396. package/dist/ssr/inputs/Select.js +7 -5
  397. package/dist/ssr/inputs/Select.js.map +1 -1
  398. package/dist/ssr/inputs/SelectChip.js +3 -3
  399. package/dist/ssr/inputs/SelectChip.js.map +1 -1
  400. package/dist/ssr/inputs/SignatureInput.js +9 -3
  401. package/dist/ssr/inputs/SignatureInput.js.map +1 -1
  402. package/dist/ssr/inputs/SpecialInputs.js +4 -2
  403. package/dist/ssr/inputs/SpecialInputs.js.map +1 -1
  404. package/dist/ssr/inputs/TagEditor.js +8 -6
  405. package/dist/ssr/inputs/TagEditor.js.map +1 -1
  406. package/dist/ssr/inputs/TagsInput.js +5 -5
  407. package/dist/ssr/inputs/TagsInput.js.map +1 -1
  408. package/dist/ssr/inputs/TemplateEditor.js +5 -5
  409. package/dist/ssr/inputs/TemplateEditor.js.map +1 -1
  410. package/dist/ssr/inputs/TextInput.js +3 -1
  411. package/dist/ssr/inputs/TextInput.js.map +1 -1
  412. package/dist/ssr/inputs/completion-messages.js +24 -0
  413. package/dist/ssr/inputs/completion-messages.js.map +1 -0
  414. package/dist/ssr/inputs/file-drop-messages.js +63 -0
  415. package/dist/ssr/inputs/file-drop-messages.js.map +1 -0
  416. package/dist/ssr/inputs/file-drop.js.map +1 -1
  417. package/dist/ssr/inputs/file-input-messages.js +60 -0
  418. package/dist/ssr/inputs/file-input-messages.js.map +1 -0
  419. package/dist/ssr/inputs/icon-messages.js +22 -0
  420. package/dist/ssr/inputs/icon-messages.js.map +1 -0
  421. package/dist/ssr/inputs/input-messages.js +38 -0
  422. package/dist/ssr/inputs/input-messages.js.map +1 -0
  423. package/dist/ssr/inputs/markdown/MarkdownEditor.js +9 -5
  424. package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
  425. package/dist/ssr/inputs/markdown/Toolbar.js +13 -13
  426. package/dist/ssr/inputs/markdown/Toolbar.js.map +1 -1
  427. package/dist/ssr/inputs/markdown/editor-messages.js +43 -0
  428. package/dist/ssr/inputs/markdown/editor-messages.js.map +1 -0
  429. package/dist/ssr/inputs/markdown/toolbar-messages.js +40 -0
  430. package/dist/ssr/inputs/markdown/toolbar-messages.js.map +1 -0
  431. package/dist/ssr/inputs/qr-messages.js +26 -0
  432. package/dist/ssr/inputs/qr-messages.js.map +1 -0
  433. package/dist/ssr/inputs/select-messages.js +63 -0
  434. package/dist/ssr/inputs/select-messages.js.map +1 -0
  435. package/dist/ssr/inputs/tag-messages.js +44 -0
  436. package/dist/ssr/inputs/tag-messages.js.map +1 -0
  437. package/dist/ssr/inputs/template-messages.js +22 -0
  438. package/dist/ssr/inputs/template-messages.js.map +1 -0
  439. package/dist/ssr/internal/render-error-messages.js +20 -0
  440. package/dist/ssr/internal/render-error-messages.js.map +1 -0
  441. package/dist/ssr/internal/render-error.js +3 -1
  442. package/dist/ssr/internal/render-error.js.map +1 -1
  443. package/dist/ssr/internal/text-selection.js +101 -0
  444. package/dist/ssr/internal/text-selection.js.map +1 -0
  445. package/dist/ssr/intl/messages.js +6 -1155
  446. package/dist/ssr/intl/messages.js.map +1 -1
  447. package/dist/ssr/layout/AppWorkspace.js +203 -96
  448. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  449. package/dist/ssr/layout/BottomSheet.js +1 -0
  450. package/dist/ssr/layout/BottomSheet.js.map +1 -1
  451. package/dist/ssr/layout/Discussion.js +8 -5
  452. package/dist/ssr/layout/Discussion.js.map +1 -1
  453. package/dist/ssr/layout/FloatingWindow.js +8 -5
  454. package/dist/ssr/layout/FloatingWindow.js.map +1 -1
  455. package/dist/ssr/layout/Navigation.js +6 -5
  456. package/dist/ssr/layout/Navigation.js.map +1 -1
  457. package/dist/ssr/layout/PageTitle.js +253 -0
  458. package/dist/ssr/layout/PageTitle.js.map +1 -0
  459. package/dist/ssr/layout/PanelDialog.js +8 -6
  460. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  461. package/dist/ssr/layout/Panes.js +22 -14
  462. package/dist/ssr/layout/Panes.js.map +1 -1
  463. package/dist/ssr/layout/PullToRefresh.js +13 -4
  464. package/dist/ssr/layout/PullToRefresh.js.map +1 -1
  465. package/dist/ssr/layout/Settings.js +14 -12
  466. package/dist/ssr/layout/Settings.js.map +1 -1
  467. package/dist/ssr/layout/SettingsCollection.js +6 -5
  468. package/dist/ssr/layout/SettingsCollection.js.map +1 -1
  469. package/dist/ssr/layout/SettingsModal.js +3 -1
  470. package/dist/ssr/layout/SettingsModal.js.map +1 -1
  471. package/dist/ssr/layout/app-workspace-controller.js +743 -12
  472. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  473. package/dist/ssr/layout/app-workspace-state.js +3 -2
  474. package/dist/ssr/layout/app-workspace-state.js.map +1 -1
  475. package/dist/ssr/layout/floating-window-messages.js +28 -0
  476. package/dist/ssr/layout/floating-window-messages.js.map +1 -0
  477. package/dist/ssr/layout/index.js +2 -0
  478. package/dist/ssr/layout/index.js.map +1 -1
  479. package/dist/ssr/layout/navigation-model.js.map +1 -1
  480. package/dist/ssr/layout/page-title-controller.js +169 -0
  481. package/dist/ssr/layout/page-title-controller.js.map +1 -0
  482. package/dist/ssr/layout/panel-dialog-messages.js +20 -0
  483. package/dist/ssr/layout/panel-dialog-messages.js.map +1 -0
  484. package/dist/ssr/layout/panes-messages.js +48 -0
  485. package/dist/ssr/layout/panes-messages.js.map +1 -0
  486. package/dist/ssr/layout/refresh-messages.js +20 -0
  487. package/dist/ssr/layout/refresh-messages.js.map +1 -0
  488. package/dist/ssr/layout/settings-messages.js +54 -0
  489. package/dist/ssr/layout/settings-messages.js.map +1 -0
  490. package/dist/ssr/layout/workspace-messages.js +56 -0
  491. package/dist/ssr/layout/workspace-messages.js.map +1 -0
  492. package/dist/ssr/surfaces/Avatar.js +5 -5
  493. package/dist/ssr/surfaces/Avatar.js.map +1 -1
  494. package/dist/ssr/surfaces/ResourceCard.js +4 -2
  495. package/dist/ssr/surfaces/ResourceCard.js.map +1 -1
  496. package/dist/ssr/surfaces/Tag.js +3 -3
  497. package/dist/ssr/surfaces/Tag.js.map +1 -1
  498. package/dist/ssr/surfaces/avatar-messages.js +26 -0
  499. package/dist/ssr/surfaces/avatar-messages.js.map +1 -0
  500. package/dist/ssr/surfaces/resource-messages.js +26 -0
  501. package/dist/ssr/surfaces/resource-messages.js.map +1 -0
  502. package/dist/ssr/widgets/Widget.js +6 -0
  503. package/dist/ssr/widgets/Widget.js.map +1 -1
  504. package/dist/styles.css +1 -1
  505. package/dist/types/actions/filter-messages.d.ts +8 -0
  506. package/dist/types/actions/spotlight-messages.d.ts +8 -0
  507. package/dist/types/chat/chat-messages.d.ts +116 -0
  508. package/dist/types/content/DataTable.d.ts +2 -0
  509. package/dist/types/content/FileView.d.ts +0 -10
  510. package/dist/types/content/calendar-messages.d.ts +20 -1
  511. package/dist/types/content/chart-messages.d.ts +32 -0
  512. package/dist/types/content/data-table-messages.d.ts +10 -0
  513. package/dist/types/content/docs-messages.d.ts +10 -0
  514. package/dist/types/content/feed-messages.d.ts +15 -0
  515. package/dist/types/content/file-browser-messages.d.ts +33 -0
  516. package/dist/types/content/file-view-messages.d.ts +30 -0
  517. package/dist/types/content/lightbox-messages.d.ts +16 -0
  518. package/dist/types/content/log-entries-messages.d.ts +8 -0
  519. package/dist/types/content/markdown-info-block-messages.d.ts +12 -0
  520. package/dist/types/content/markdown-reference-messages.d.ts +15 -0
  521. package/dist/types/content/pagination-messages.d.ts +17 -0
  522. package/dist/types/content/pdf-messages.d.ts +20 -0
  523. package/dist/types/content/range-picker-messages.d.ts +8 -0
  524. package/dist/types/content/structured-data-messages.d.ts +9 -0
  525. package/dist/types/content/timeline-messages.d.ts +29 -0
  526. package/dist/types/content/video-messages.d.ts +10 -0
  527. package/dist/types/content/viewport-messages.d.ts +12 -0
  528. package/dist/types/feedback/install-messages.d.ts +50 -0
  529. package/dist/types/feedback/prompt-messages.d.ts +31 -0
  530. package/dist/types/feedback/toast-messages.d.ts +9 -0
  531. package/dist/types/index.d.ts +1 -0
  532. package/dist/types/inputs/completion-messages.d.ts +10 -0
  533. package/dist/types/inputs/file-drop-messages.d.ts +30 -0
  534. package/dist/types/inputs/file-drop.d.ts +3 -3
  535. package/dist/types/inputs/file-input-messages.d.ts +28 -0
  536. package/dist/types/inputs/icon-messages.d.ts +9 -0
  537. package/dist/types/inputs/input-messages.d.ts +17 -0
  538. package/dist/types/inputs/markdown/editor-messages.d.ts +20 -0
  539. package/dist/types/inputs/markdown/toolbar-messages.d.ts +18 -0
  540. package/dist/types/inputs/qr-messages.d.ts +11 -0
  541. package/dist/types/inputs/select-messages.d.ts +30 -0
  542. package/dist/types/inputs/tag-messages.d.ts +20 -0
  543. package/dist/types/inputs/template-messages.d.ts +9 -0
  544. package/dist/types/internal/render-error-messages.d.ts +8 -0
  545. package/dist/types/internal/text-selection.d.ts +18 -0
  546. package/dist/types/intl/messages.d.ts +3 -544
  547. package/dist/types/layout/AppWorkspace.d.ts +19 -4
  548. package/dist/types/layout/PageTitle.d.ts +64 -0
  549. package/dist/types/layout/app-workspace-controller.d.ts +4 -0
  550. package/dist/types/layout/app-workspace-state.d.ts +3 -2
  551. package/dist/types/layout/floating-window-messages.d.ts +12 -0
  552. package/dist/types/layout/index.d.ts +3 -0
  553. package/dist/types/layout/navigation-model.d.ts +7 -0
  554. package/dist/types/layout/page-title-controller.d.ts +13 -0
  555. package/dist/types/layout/panel-dialog-messages.d.ts +8 -0
  556. package/dist/types/layout/panes-messages.d.ts +22 -0
  557. package/dist/types/layout/refresh-messages.d.ts +8 -0
  558. package/dist/types/layout/settings-messages.d.ts +25 -0
  559. package/dist/types/layout/workspace-messages.d.ts +26 -0
  560. package/dist/types/surfaces/avatar-messages.d.ts +11 -0
  561. package/dist/types/surfaces/resource-messages.d.ts +11 -0
  562. package/dist/types/widgets/Widget.d.ts +5 -1
  563. package/package.json +1 -1
@@ -0,0 +1,20 @@
1
+ import { i18n } from "@k2b/stdlib";
2
+ import { useLocale } from "../intl/locale";
3
+ const rangePickerMessages = i18n.define({
4
+ baseLocale: "en",
5
+ messages: {
6
+ en: {
7
+ window: "Window"
8
+ },
9
+ de: {
10
+ window: "Fenster"
11
+ }
12
+ }
13
+ });
14
+ /** Resolved from the inherited render locale. */
15
+ export const useRangePickerMessages = () => {
16
+ const locale = useLocale();
17
+ return () => rangePickerMessages.resolve([locale()]).t;
18
+ };
19
+ export const checkRangePickerMessages = () => rangePickerMessages.check();
20
+ //# sourceMappingURL=range-picker-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["content/range-picker-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\nconst rangePickerMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n window: \"Window\",\n },\n de: {\n window: \"Fenster\",\n },\n },\n});\n\nexport type RangePickerMessages = ReturnType<(typeof rangePickerMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from the inherited render locale. */\nexport const useRangePickerMessages = (): (() => RangePickerMessages) => {\n const locale = useLocale();\n return () => rangePickerMessages.resolve([locale()]).t;\n};\n\nexport const checkRangePickerMessages = () => rangePickerMessages.check();\n"],"mappings":"AAAA,SAAS,IAAI,QAAQ,aAAa;AAClC,SAAS,SAAS,QAAQ,gBAAgB;AAE1C,MAAM,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC;EACtC,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE;IACR,EAAE,EAAE;MACF,MAAM,EAAE;IACV,CAAC;IACD,EAAE,EAAE;MACF,MAAM,EAAE;IACV;EACF;AACF,CAAC,CAAC;AAIF;AACA,OAAO,MAAM,sBAAsB,GAAG,MAAmC;EACvE,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,OAAO,MAAM,mBAAmB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,OAAO,MAAM,wBAAwB,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,22 @@
1
+ import { i18n } from "@k2b/stdlib";
2
+ import { useLocale } from "../intl/locale";
3
+ const structuredDataMessages = i18n.define({
4
+ baseLocale: "en",
5
+ messages: {
6
+ en: {
7
+ viewRaw: "View raw",
8
+ viewFormatted: "View formatted"
9
+ },
10
+ de: {
11
+ viewRaw: "Rohdaten anzeigen",
12
+ viewFormatted: "Formatiert anzeigen"
13
+ }
14
+ }
15
+ });
16
+ /** Resolved from the inherited render locale. */
17
+ export const useStructuredDataMessages = () => {
18
+ const locale = useLocale();
19
+ return () => structuredDataMessages.resolve([locale()]).t;
20
+ };
21
+ export const checkStructuredDataMessages = () => structuredDataMessages.check();
22
+ //# sourceMappingURL=structured-data-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["content/structured-data-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\nconst structuredDataMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n viewRaw: \"View raw\",\n viewFormatted: \"View formatted\",\n },\n de: {\n viewRaw: \"Rohdaten anzeigen\",\n viewFormatted: \"Formatiert anzeigen\",\n },\n },\n});\n\nexport type StructuredDataMessages = ReturnType<(typeof structuredDataMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from the inherited render locale. */\nexport const useStructuredDataMessages = (): (() => StructuredDataMessages) => {\n const locale = useLocale();\n return () => structuredDataMessages.resolve([locale()]).t;\n};\n\nexport const checkStructuredDataMessages = () => structuredDataMessages.check();\n"],"mappings":"AAAA,SAAS,IAAI,QAAQ,aAAa;AAClC,SAAS,SAAS,QAAQ,gBAAgB;AAE1C,MAAM,sBAAsB,GAAG,IAAI,CAAC,MAAM,CAAC;EACzC,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE;IACR,EAAE,EAAE;MACF,OAAO,EAAE,UAAU;MACnB,aAAa,EAAE;IACjB,CAAC;IACD,EAAE,EAAE;MACF,OAAO,EAAE,mBAAmB;MAC5B,aAAa,EAAE;IACjB;EACF;AACF,CAAC,CAAC;AAIF;AACA,OAAO,MAAM,yBAAyB,GAAG,MAAsC;EAC7E,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,OAAO,MAAM,sBAAsB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,OAAO,MAAM,2BAA2B,GAAG,MAAM,sBAAsB,CAAC,KAAK,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,62 @@
1
+ import { i18n } from "@k2b/stdlib";
2
+ import { useLocale } from "../intl/locale";
3
+ const timelineMessages = i18n.define({
4
+ baseLocale: "en",
5
+ messages: {
6
+ en: {
7
+ timeline: "Timeline",
8
+ timelineHint: "Arrow keys move between items, Page Up and Page Down between days, Home and End to the first and last item of a day, T to now.",
9
+ timelineTimeRange: ({
10
+ start,
11
+ end
12
+ }) => `${start} to ${end}`,
13
+ timelineDone: "done",
14
+ timelineOpen: "open",
15
+ timelineNight: ({
16
+ start,
17
+ end
18
+ }) => `Night · ${start}–${end}`,
19
+ timelineNothingPlanned: "Nothing planned",
20
+ timelineFree: ({
21
+ duration
22
+ }) => `${duration} free`,
23
+ timelineMore: ({
24
+ count
25
+ }) => `${count} more`,
26
+ timelineNow: ({
27
+ time
28
+ }) => `Now, ${time}`
29
+ },
30
+ de: {
31
+ timeline: "Zeitleiste",
32
+ timelineHint: "Pfeiltasten wechseln den Eintrag, Bild auf und Bild ab den Tag, Pos1 und Ende springen zum ersten und letzten Eintrag des Tages, T zu jetzt.",
33
+ timelineTimeRange: ({
34
+ start,
35
+ end
36
+ }) => `${start} bis ${end}`,
37
+ timelineDone: "erledigt",
38
+ timelineOpen: "offen",
39
+ timelineNight: ({
40
+ start,
41
+ end
42
+ }) => `Nacht · ${start}–${end}`,
43
+ timelineNothingPlanned: "Nichts geplant",
44
+ timelineFree: ({
45
+ duration
46
+ }) => `${duration} frei`,
47
+ timelineMore: ({
48
+ count
49
+ }) => `${count} weitere`,
50
+ timelineNow: ({
51
+ time
52
+ }) => `Jetzt, ${time}`
53
+ }
54
+ }
55
+ });
56
+ /** Resolved from the inherited render locale. */
57
+ export const useTimelineMessages = () => {
58
+ const locale = useLocale();
59
+ return () => timelineMessages.resolve([locale()]).t;
60
+ };
61
+ export const checkTimelineMessages = () => timelineMessages.check();
62
+ //# sourceMappingURL=timeline-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["content/timeline-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\nconst timelineMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n timeline: \"Timeline\",\n timelineHint:\n \"Arrow keys move between items, Page Up and Page Down between days, Home and End to the first and last item of a day, T to now.\",\n timelineTimeRange: ({ start, end }: { start: string; end: string }) => `${start} to ${end}`,\n timelineDone: \"done\",\n timelineOpen: \"open\",\n timelineNight: ({ start, end }: { start: string; end: string }) => `Night · ${start}–${end}`,\n timelineNothingPlanned: \"Nothing planned\",\n timelineFree: ({ duration }: { duration: string }) => `${duration} free`,\n timelineMore: ({ count }: { count: number }) => `${count} more`,\n timelineNow: ({ time }: { time: string }) => `Now, ${time}`,\n },\n de: {\n timeline: \"Zeitleiste\",\n timelineHint:\n \"Pfeiltasten wechseln den Eintrag, Bild auf und Bild ab den Tag, Pos1 und Ende springen zum ersten und letzten Eintrag des Tages, T zu jetzt.\",\n timelineTimeRange: ({ start, end }) => `${start} bis ${end}`,\n timelineDone: \"erledigt\",\n timelineOpen: \"offen\",\n timelineNight: ({ start, end }) => `Nacht · ${start}–${end}`,\n timelineNothingPlanned: \"Nichts geplant\",\n timelineFree: ({ duration }) => `${duration} frei`,\n timelineMore: ({ count }) => `${count} weitere`,\n timelineNow: ({ time }) => `Jetzt, ${time}`,\n },\n },\n});\n\nexport type TimelineMessages = ReturnType<(typeof timelineMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from the inherited render locale. */\nexport const useTimelineMessages = (): (() => TimelineMessages) => {\n const locale = useLocale();\n return () => timelineMessages.resolve([locale()]).t;\n};\n\nexport const checkTimelineMessages = () => timelineMessages.check();\n"],"mappings":"AAAA,SAAS,IAAI,QAAQ,aAAa;AAClC,SAAS,SAAS,QAAQ,gBAAgB;AAE1C,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC;EACnC,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE;IACR,EAAE,EAAE;MACF,QAAQ,EAAE,UAAU;MACpB,YAAY,EACV,gIAAgI;MAClI,iBAAiB,EAAE,CAAC;QAAE,KAAK;QAAE;MAAoC,CAAC,KAAK,GAAG,KAAK,OAAO,GAAG,EAAE;MAC3F,YAAY,EAAE,MAAM;MACpB,YAAY,EAAE,MAAM;MACpB,aAAa,EAAE,CAAC;QAAE,KAAK;QAAE;MAAoC,CAAC,KAAK,WAAW,KAAK,IAAI,GAAG,EAAE;MAC5F,sBAAsB,EAAE,iBAAiB;MACzC,YAAY,EAAE,CAAC;QAAE;MAA+B,CAAC,KAAK,GAAG,QAAQ,OAAO;MACxE,YAAY,EAAE,CAAC;QAAE;MAAyB,CAAC,KAAK,GAAG,KAAK,OAAO;MAC/D,WAAW,EAAE,CAAC;QAAE;MAAuB,CAAC,KAAK,QAAQ,IAAI;IAC3D,CAAC;IACD,EAAE,EAAE;MACF,QAAQ,EAAE,YAAY;MACtB,YAAY,EACV,8IAA8I;MAChJ,iBAAiB,EAAE,CAAC;QAAE,KAAK;QAAE;MAAI,CAAC,KAAK,GAAG,KAAK,QAAQ,GAAG,EAAE;MAC5D,YAAY,EAAE,UAAU;MACxB,YAAY,EAAE,OAAO;MACrB,aAAa,EAAE,CAAC;QAAE,KAAK;QAAE;MAAI,CAAC,KAAK,WAAW,KAAK,IAAI,GAAG,EAAE;MAC5D,sBAAsB,EAAE,gBAAgB;MACxC,YAAY,EAAE,CAAC;QAAE;MAAS,CAAC,KAAK,GAAG,QAAQ,OAAO;MAClD,YAAY,EAAE,CAAC;QAAE;MAAM,CAAC,KAAK,GAAG,KAAK,UAAU;MAC/C,WAAW,EAAE,CAAC;QAAE;MAAK,CAAC,KAAK,UAAU,IAAI;IAC3C;EACF;AACF,CAAC,CAAC;AAIF;AACA,OAAO,MAAM,mBAAmB,GAAG,MAAgC;EACjE,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,OAAO,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,OAAO,MAAM,qBAAqB,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,24 @@
1
+ import { i18n } from "@k2b/stdlib";
2
+ import { useLocale } from "../intl/locale";
3
+ const videoMessages = i18n.define({
4
+ baseLocale: "en",
5
+ messages: {
6
+ en: {
7
+ videoUnsupported: "Your browser does not support video playback.",
8
+ videoCannotPlay: "This video cannot play here",
9
+ videoCannotPlayDescription: "Your browser cannot play this video. Download it to watch it in another app."
10
+ },
11
+ de: {
12
+ videoUnsupported: "Dein Browser unterstützt keine Videowiedergabe.",
13
+ videoCannotPlay: "Dieses Video kann hier nicht abgespielt werden",
14
+ videoCannotPlayDescription: "Dein Browser kann dieses Video nicht abspielen. Lade es herunter, um es in einer anderen App anzusehen."
15
+ }
16
+ }
17
+ });
18
+ /** Resolved from the inherited render locale. */
19
+ export const useVideoMessages = () => {
20
+ const locale = useLocale();
21
+ return () => videoMessages.resolve([locale()]).t;
22
+ };
23
+ export const checkVideoMessages = () => videoMessages.check();
24
+ //# sourceMappingURL=video-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["content/video-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\nconst videoMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n videoUnsupported: \"Your browser does not support video playback.\",\n videoCannotPlay: \"This video cannot play here\",\n videoCannotPlayDescription: \"Your browser cannot play this video. Download it to watch it in another app.\",\n },\n de: {\n videoUnsupported: \"Dein Browser unterstützt keine Videowiedergabe.\",\n videoCannotPlay: \"Dieses Video kann hier nicht abgespielt werden\",\n videoCannotPlayDescription: \"Dein Browser kann dieses Video nicht abspielen. Lade es herunter, um es in einer anderen App anzusehen.\",\n },\n },\n});\n\nexport type VideoMessages = ReturnType<(typeof videoMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from the inherited render locale. */\nexport const useVideoMessages = (): (() => VideoMessages) => {\n const locale = useLocale();\n return () => videoMessages.resolve([locale()]).t;\n};\n\nexport const checkVideoMessages = () => videoMessages.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,gBAAgB,EAAE,+CAA+C;MACjE,eAAe,EAAE,6BAA6B;MAC9C,0BAA0B,EAAE;IAC9B,CAAC;IACD,EAAE,EAAE;MACF,gBAAgB,EAAE,iDAAiD;MACnE,eAAe,EAAE,gDAAgD;MACjE,0BAA0B,EAAE;IAC9B;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":[]}
@@ -0,0 +1,28 @@
1
+ import { i18n } from "@k2b/stdlib";
2
+ import { useLocale } from "../intl/locale";
3
+ const viewportMessages = i18n.define({
4
+ baseLocale: "en",
5
+ messages: {
6
+ en: {
7
+ zoomIn: "Zoom in",
8
+ zoomOut: "Zoom out",
9
+ resetZoom: "Reset zoom",
10
+ openFullscreen: "Open fullscreen",
11
+ zoomPanKeys: "Zoom with plus and minus, move with the arrow keys, reset with 0, open fullscreen with F."
12
+ },
13
+ de: {
14
+ zoomIn: "Vergrößern",
15
+ zoomOut: "Verkleinern",
16
+ resetZoom: "Zoom zurücksetzen",
17
+ openFullscreen: "Im Vollbild öffnen",
18
+ zoomPanKeys: "Mit Plus und Minus zoomen, mit den Pfeiltasten verschieben, mit 0 zurücksetzen, mit F im Vollbild öffnen."
19
+ }
20
+ }
21
+ });
22
+ /** Resolved from the inherited render locale. */
23
+ export const useViewportMessages = () => {
24
+ const locale = useLocale();
25
+ return () => viewportMessages.resolve([locale()]).t;
26
+ };
27
+ export const checkViewportMessages = () => viewportMessages.check();
28
+ //# sourceMappingURL=viewport-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["content/viewport-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\nconst viewportMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n zoomIn: \"Zoom in\",\n zoomOut: \"Zoom out\",\n resetZoom: \"Reset zoom\",\n openFullscreen: \"Open fullscreen\",\n zoomPanKeys: \"Zoom with plus and minus, move with the arrow keys, reset with 0, open fullscreen with F.\",\n },\n de: {\n zoomIn: \"Vergrößern\",\n zoomOut: \"Verkleinern\",\n resetZoom: \"Zoom zurücksetzen\",\n openFullscreen: \"Im Vollbild öffnen\",\n zoomPanKeys: \"Mit Plus und Minus zoomen, mit den Pfeiltasten verschieben, mit 0 zurücksetzen, mit F im Vollbild öffnen.\",\n },\n },\n});\n\nexport type ViewportMessages = ReturnType<(typeof viewportMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from the inherited render locale. */\nexport const useViewportMessages = (): (() => ViewportMessages) => {\n const locale = useLocale();\n return () => viewportMessages.resolve([locale()]).t;\n};\n\nexport const checkViewportMessages = () => viewportMessages.check();\n"],"mappings":"AAAA,SAAS,IAAI,QAAQ,aAAa;AAClC,SAAS,SAAS,QAAQ,gBAAgB;AAE1C,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC;EACnC,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE;IACR,EAAE,EAAE;MACF,MAAM,EAAE,SAAS;MACjB,OAAO,EAAE,UAAU;MACnB,SAAS,EAAE,YAAY;MACvB,cAAc,EAAE,iBAAiB;MACjC,WAAW,EAAE;IACf,CAAC;IACD,EAAE,EAAE;MACF,MAAM,EAAE,YAAY;MACpB,OAAO,EAAE,aAAa;MACtB,SAAS,EAAE,mBAAmB;MAC9B,cAAc,EAAE,oBAAoB;MACpC,WAAW,EAAE;IACf;EACF;AACF,CAAC,CAAC;AAIF;AACA,OAAO,MAAM,mBAAmB,GAAG,MAAgC;EACjE,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,OAAO,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,OAAO,MAAM,qBAAqB,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAC","ignoreList":[]}
@@ -46,6 +46,8 @@ export function createHoverPreview(options = {}) {
46
46
  /** The anchor that Space or `toggle()` opened the card for; only it outlasts the pointer leaving. */
47
47
  let pinned;
48
48
  let dismissed;
49
+ /** Where the mouse last moved on an anchor; a mouse rest checks this point when its delay ends. */
50
+ let mouse;
49
51
  let ring = true;
50
52
  let observer;
51
53
  const placement = () => options.placement ?? {};
@@ -190,15 +192,31 @@ export function createHoverPreview(options = {}) {
190
192
  if (pin) pinned = anchor;
191
193
  return true;
192
194
  };
193
- /** Shows `anchor` after `delay`; a keyboard swap (`follow`) carries an existing pin along. */
194
- const schedule = (anchor, delay, follow = false) => {
195
+ /**
196
+ * Whether the mouse still rests on `anchor`. A scrolling list or a layout
197
+ * change moves rows under a still mouse before the browser reports another
198
+ * pointer event; WebKit reports it only several scroll steps later.
199
+ */
200
+ const restsOn = anchor => {
201
+ if (!mouse) return false;
202
+ // Inside a shadow root, the document reports only the shadow host.
203
+ const root = anchor.element.getRootNode();
204
+ const hit = (root instanceof ShadowRoot ? root : document).elementFromPoint(mouse.x, mouse.y);
205
+ return hit !== null && anchor.element.contains(hit);
206
+ };
207
+ /**
208
+ * Shows `anchor` after `delay`; a keyboard swap (`follow`) carries an existing
209
+ * pin along. A mouse rest (`rest`) shows the anchor only if it still lies
210
+ * under the mouse.
211
+ */
212
+ const schedule = (anchor, delay, follow = false, rest = false) => {
195
213
  clear();
196
214
  if (!open()) {
197
215
  pending = anchor;
198
216
  document.addEventListener("keydown", escape);
199
217
  }
200
218
  timer = setTimeout(() => {
201
- if (open()) show(anchor, follow && pinned !== undefined);else if (blocked()) clear();else show(anchor, false);
219
+ if (rest && !restsOn(anchor)) clear();else if (open()) show(anchor, follow && pinned !== undefined);else if (blocked()) clear();else show(anchor, false);
202
220
  }, delay);
203
221
  };
204
222
  const leave = () => {
@@ -238,14 +256,24 @@ export function createHoverPreview(options = {}) {
238
256
  const pointerEnter = event => {
239
257
  // Touch and pen have no resting hover; the card stays a mouse affordance.
240
258
  if (event.pointerType !== "mouse") return;
259
+ mouse = {
260
+ x: event.clientX,
261
+ y: event.clientY
262
+ };
241
263
  clear();
242
264
  if (open() && current() === entry || dismissed === entry) return;
243
- schedule(entry, open() ? SWAP_DELAY : options.openDelay ?? 250);
265
+ schedule(entry, open() ? SWAP_DELAY : options.openDelay ?? 250, false, true);
244
266
  };
245
267
  // The open delay counts from the moment the mouse rests. An open card
246
- // swaps on entering another anchor and ignores movement inside it.
268
+ // swaps on entering another anchor; movement inside it only moves the
269
+ // position that the swap checks.
247
270
  const pointerMove = event => {
248
- if (event.pointerType === "mouse" && !open() && dismissed !== entry) schedule(entry, options.openDelay ?? 250);
271
+ if (event.pointerType !== "mouse") return;
272
+ mouse = {
273
+ x: event.clientX,
274
+ y: event.clientY
275
+ };
276
+ if (!open() && dismissed !== entry) schedule(entry, options.openDelay ?? 250, false, true);
249
277
  };
250
278
  // A press acts on the row, such as opening it or its menu; a card about to open stays closed.
251
279
  const pointerDown = () => clear();
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["feedback/HoverPreview.tsx"],"sourcesContent":["import { type Accessor, createEffect, createSignal, createUniqueId, type JSX, onCleanup, onMount, Show } from \"solid-js\";\nimport { returnFocus, ringOnReturn } from \"../internal/focus-return\";\nimport { positionTooltipSurface } from \"./tooltip-position\";\n\n/** A resting pointer moving from one anchor to another swaps the card this fast. */\nconst SWAP_DELAY = 90;\n/** Grace period for the pointer to travel from an anchor into the card. */\nconst CLOSE_DELAY = 180;\n/** Distance to the region and to the boundary edges. */\nconst GAP = 8;\n/** Keys the wiring between a controller and its `<HoverPreview>`. */\nconst INTERNALS = Symbol(\"k2b-hover-preview\");\n\n/**\n * Where the card opens. By default it opens to the right of its anchor,\n * centered on it or aligned with its bottom edge, and flips or clamps to stay\n * in the viewport. With `beside`, it opens right of that region, such as a list\n * column, top-aligned with the anchor and clamped into `within` (default: the\n * viewport); when the card does not fit there, it does not open at all.\n */\nexport type HoverPreviewPlacement =\n | { align?: \"center\" | \"end\" }\n | { beside: () => HTMLElement | null | undefined; within?: () => HTMLElement | null | undefined };\n\nexport type HoverPreviewOptions<T> = {\n /** Milliseconds a resting mouse waits on an anchor before the card opens. Defaults to 250. */\n openDelay?: number;\n /**\n * How keyboard users open the card: `\"space\"` (default) toggles it with Space\n * on the focused anchor and leaves focus there; `\"focus\"` opens it after the\n * open delay whenever an anchor receives focus.\n */\n keyboard?: \"space\" | \"focus\";\n placement?: HoverPreviewPlacement;\n /** Anchors whose value is disabled open no card; an open card closes once its value becomes disabled. */\n disabled?: (value: T) => boolean;\n /** Runs whenever the card opens or closes, including light dismissal by the browser. */\n onOpenChange?: (open: boolean) => void;\n};\n\nexport type HoverPreviewController<T> = {\n /** Id of the card element, for `aria-controls`. */\n readonly id: string;\n /**\n * Registers an anchor element for `value`; use the result as a `ref`.\n * `trigger` is the control that toggles the card for this anchor; Escape\n * returns focus there when focus is inside the card. Defaults to the anchor.\n */\n anchor: (value: T, trigger?: () => HTMLElement | null | undefined) => (element: HTMLElement) => void;\n /** The value whose card is open, or `undefined` while closed. */\n active: Accessor<T | undefined>;\n /** Opens the card for `value` at once and moves focus into it, or closes it when it is already pinned open. */\n toggle: (value: T) => void;\n /** Closes the card; it reopens for the same anchor only after the pointer left it. */\n close: () => void;\n /** Wiring for `<HoverPreview>`; not part of the public contract. */\n readonly [INTERNALS]: Internals<T>;\n};\n\ntype Anchor<T> = { value: T; element: HTMLElement; trigger?: () => HTMLElement | null | undefined };\n\ntype Internals<T> = {\n current: Accessor<Anchor<T> | undefined>;\n bind: (surface: HTMLElement) => void;\n enterSurface: () => void;\n leave: () => void;\n focusOut: (event: FocusEvent) => void;\n toggled: (open: boolean) => void;\n};\n\n/** Elements that use Space themselves; Space on them never toggles the card. */\nconst OWNS_SPACE = [\n \"button, input, select, textarea, summary, [contenteditable]:not([contenteditable='false'])\",\n ...[\"button\", \"checkbox\", \"switch\", \"radio\", \"option\", \"menuitem\", \"menuitemcheckbox\", \"menuitemradio\", \"tab\", \"treeitem\"].map(\n (role) => `[role='${role}']`,\n ),\n].join(\", \");\n\n/** Open light-dismiss popovers, such as a menu or a date picker, close when another one opens. */\nconst AUTO_POPOVER = \":is([popover=''], [popover='auto' i]):popover-open\";\n\n/**\n * Creates the behavior of one hover preview card shared by a group of anchors,\n * such as the rows of a list. Render the card with `<HoverPreview preview={…}>`.\n */\nexport function createHoverPreview<T>(options: HoverPreviewOptions<T> = {}): HoverPreviewController<T> {\n const id = `k2b-hover-preview-${createUniqueId()}`;\n const anchors = new Set<Anchor<T>>();\n const [current, setCurrent] = createSignal<Anchor<T>>();\n const [open, setOpen] = createSignal(false);\n let surface: HTMLElement | undefined;\n let timer: ReturnType<typeof setTimeout> | undefined;\n /** The anchor whose open delay runs while the card is closed. */\n let pending: Anchor<T> | undefined;\n /** The anchor that Space or `toggle()` opened the card for; only it outlasts the pointer leaving. */\n let pinned: Anchor<T> | undefined;\n let dismissed: Anchor<T> | undefined;\n let ring = true;\n let observer: ResizeObserver | undefined;\n\n const placement = (): HoverPreviewPlacement => options.placement ?? {};\n const region = () => {\n const value = placement();\n return \"beside\" in value ? value : undefined;\n };\n const focusTarget = (anchor: Anchor<T>) => anchor.trigger?.() ?? anchor.element;\n const anchorOf = (node: Node) => [...anchors].find((anchor) => anchor.element.contains(node));\n const clear = () => {\n clearTimeout(timer);\n timer = undefined;\n if (pending && !open()) document.removeEventListener(\"keydown\", escape);\n pending = undefined;\n };\n /** A passive card never closes a menu or another popover someone opened on purpose. */\n const blocked = () =>\n [...document.querySelectorAll(AUTO_POPOVER)].some((popover) => popover !== surface && !(surface && popover.contains(surface)));\n\n /** The boundary rectangle, never larger than the viewport. */\n const bounds = (within: Element | null | undefined) => {\n const rect = within?.getBoundingClientRect();\n return {\n top: Math.max(0, rect?.top ?? 0),\n right: Math.min(window.innerWidth, rect?.right ?? window.innerWidth),\n bottom: Math.min(window.innerHeight, rect?.bottom ?? window.innerHeight),\n };\n };\n /** Room right of the region for the card plus a gap on both sides. Works while the card is hidden. */\n const hasRoom = () => {\n const beside = region();\n if (!beside || !surface) return true;\n const area = beside.beside()?.getBoundingClientRect();\n if (!area) return false;\n const width = surface.getBoundingClientRect().width || Number.parseFloat(getComputedStyle(surface).width) || 0;\n return bounds(beside.within?.()).right - area.right >= width + 2 * GAP;\n };\n const position = () => {\n const anchor = current();\n if (!surface || !anchor) return;\n const beside = region();\n if (beside) {\n const area = beside.beside()?.getBoundingClientRect() ?? anchor.element.getBoundingClientRect();\n const box = bounds(beside.within?.());\n const height = surface.getBoundingClientRect().height;\n const top = anchor.element.getBoundingClientRect().top;\n surface.style.left = `${Math.round(area.right + GAP)}px`;\n surface.style.top = `${Math.round(Math.max(box.top + GAP, Math.min(top, box.bottom - height - GAP)))}px`;\n return;\n }\n positionTooltipSurface(surface, anchor.element, \"right\");\n const value = placement();\n if (!(\"beside\" in value) && value.align === \"end\") {\n const height = surface.getBoundingClientRect().height;\n const bottom = anchor.element.getBoundingClientRect().bottom;\n surface.style.top = `${Math.round(Math.max(8, Math.min(bottom - height, window.innerHeight - height - 8)))}px`;\n }\n };\n\n const escape = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n if (!open()) {\n // Escape during the open delay works as if the card had opened and closed.\n if (pending) dismissed = pending;\n clear();\n return;\n }\n // Focus in the card goes back to the trigger: handled here, so the browser\n // neither returns it itself nor lights the ring for this key. A card the\n // pointer opened leaves the key to other handlers, such as an open modeless dialog.\n if (surface?.contains(document.activeElement)) event.preventDefault();\n dismiss();\n };\n // A card beside a region belongs to a row of a scrolling list: once the list\n // scrolls, another row sits under the pointer, so the card closes. A card\n // beside its anchor follows it.\n const scroll = (event: Event) => {\n const target = event.target;\n if (!region()) return position();\n if (!(target instanceof Node) || surface?.contains(target)) return;\n const anchor = current();\n if (!anchor || target.contains(anchor.element)) hide();\n };\n const resize = () => {\n if (hasRoom()) position();\n else hide();\n };\n const listen = (on: boolean) => {\n if (on) {\n document.addEventListener(\"keydown\", escape);\n window.addEventListener(\"scroll\", scroll, true);\n window.addEventListener(\"resize\", resize);\n return;\n }\n document.removeEventListener(\"keydown\", escape);\n window.removeEventListener(\"scroll\", scroll, true);\n window.removeEventListener(\"resize\", resize);\n };\n\n const hide = () => {\n clear();\n pinned = undefined;\n if (!open()) return;\n setOpen(false);\n listen(false);\n try {\n surface?.hidePopover();\n } catch {\n // The card may already be disconnected during cleanup.\n }\n };\n const dismiss = () => {\n const anchor = current();\n dismissed = anchor;\n // Before hiding, so the popover does not return focus on its own.\n if (anchor && surface?.contains(document.activeElement)) returnFocus(focusTarget(anchor), ring);\n hide();\n };\n /**\n * Opens the card for `anchor` or moves it there; `pin` keeps it open after\n * the pointer leaves. Moving the card to another anchor drops an earlier pin.\n * Returns whether it is open for `anchor`.\n */\n const show = (anchor: Anchor<T>, pin: boolean): boolean => {\n clear();\n if (!surface || dismissed === anchor) return false;\n if (options.disabled?.(anchor.value) || !hasRoom()) {\n hide();\n return false;\n }\n if (!open() || current() !== anchor) {\n ring = ringOnReturn(focusTarget(anchor));\n setCurrent(anchor);\n if (!open()) {\n try {\n surface.showPopover();\n } catch {\n return false;\n }\n setOpen(true);\n listen(true);\n }\n position();\n pinned = undefined;\n }\n if (pin) pinned = anchor;\n return true;\n };\n /** Shows `anchor` after `delay`; a keyboard swap (`follow`) carries an existing pin along. */\n const schedule = (anchor: Anchor<T>, delay: number, follow = false) => {\n clear();\n if (!open()) {\n pending = anchor;\n document.addEventListener(\"keydown\", escape);\n }\n timer = setTimeout(() => {\n if (open()) show(anchor, follow && pinned !== undefined);\n else if (blocked()) clear();\n else show(anchor, false);\n }, delay);\n };\n const leave = () => {\n clear();\n dismissed = undefined;\n if (pinned && pinned === current()) return;\n timer = setTimeout(() => {\n // Focus holds the card open inside it, and on the anchor where focus opens it.\n const focused = document.activeElement;\n const held = surface?.contains(focused) || (options.keyboard === \"focus\" && current()?.element.contains(focused));\n if (!held) hide();\n }, CLOSE_DELAY);\n };\n const focusOut = (event: FocusEvent) => {\n const next = event.relatedTarget;\n if (next instanceof Node && (surface?.contains(next) || anchorOf(next))) return;\n pinned = undefined;\n leave();\n };\n\n createEffect(() => {\n const anchor = current();\n if (open() && anchor && options.disabled?.(anchor.value)) hide();\n });\n // Only an open card holds global listeners, so a server render that\n // disposes the controller touches no browser globals.\n onCleanup(() => {\n hide();\n observer?.disconnect();\n });\n\n const anchor =\n (value: T, trigger?: () => HTMLElement | null | undefined) =>\n (element: HTMLElement): void => {\n const entry: Anchor<T> = { value, element, trigger };\n anchors.add(entry);\n const pointerEnter = (event: PointerEvent) => {\n // Touch and pen have no resting hover; the card stays a mouse affordance.\n if (event.pointerType !== \"mouse\") return;\n clear();\n if ((open() && current() === entry) || dismissed === entry) return;\n schedule(entry, open() ? SWAP_DELAY : (options.openDelay ?? 250));\n };\n // The open delay counts from the moment the mouse rests. An open card\n // swaps on entering another anchor and ignores movement inside it.\n const pointerMove = (event: PointerEvent) => {\n if (event.pointerType === \"mouse\" && !open() && dismissed !== entry) schedule(entry, options.openDelay ?? 250);\n };\n // A press acts on the row, such as opening it or its menu; a card about to open stays closed.\n const pointerDown = () => clear();\n const focusIn = () => {\n if (open()) {\n if (current() === entry) clear();\n else schedule(entry, SWAP_DELAY, true);\n return;\n }\n clear();\n if (options.keyboard === \"focus\" && dismissed !== entry) schedule(entry, options.openDelay ?? 250);\n };\n const keyDown = (event: KeyboardEvent) => {\n if (options.keyboard === \"focus\" || event.key !== \" \" || event.defaultPrevented) return;\n // Shift+Space keeps scrolling up; other modifiers belong to shortcuts.\n if (event.shiftKey || event.ctrlKey || event.altKey || event.metaKey) return;\n if (event.target instanceof Element && event.target.matches(OWNS_SPACE)) return;\n event.preventDefault();\n // A held key toggles once; its repeats only keep the page from scrolling.\n if (event.repeat) return;\n if (open() && current() === entry) {\n dismiss();\n return;\n }\n dismissed = undefined;\n show(entry, true);\n };\n element.addEventListener(\"pointerenter\", pointerEnter);\n element.addEventListener(\"pointermove\", pointerMove);\n element.addEventListener(\"pointerdown\", pointerDown);\n element.addEventListener(\"pointerleave\", leave);\n element.addEventListener(\"focusin\", focusIn);\n element.addEventListener(\"focusout\", focusOut);\n element.addEventListener(\"keydown\", keyDown);\n onCleanup(() => {\n anchors.delete(entry);\n if (current() === entry) hide();\n element.removeEventListener(\"pointerenter\", pointerEnter);\n element.removeEventListener(\"pointermove\", pointerMove);\n element.removeEventListener(\"pointerdown\", pointerDown);\n element.removeEventListener(\"pointerleave\", leave);\n element.removeEventListener(\"focusin\", focusIn);\n element.removeEventListener(\"focusout\", focusOut);\n element.removeEventListener(\"keydown\", keyDown);\n });\n };\n\n return {\n id,\n anchor,\n active: () => (open() ? current()?.value : undefined),\n toggle: (value) => {\n const entry = [...anchors].find((candidate) => candidate.value === value);\n if (!entry || !surface) return;\n clear();\n if (open() && pinned === entry && current() === entry) {\n dismiss();\n return;\n }\n // A hover may have opened the card before this click or key press pinned it.\n ring = ringOnReturn(focusTarget(entry));\n dismissed = undefined;\n if (show(entry, true)) surface.focus();\n },\n close: dismiss,\n [INTERNALS]: {\n current,\n bind: (element) => {\n surface = element;\n observer = new ResizeObserver(() => {\n if (open()) position();\n });\n observer.observe(element);\n },\n enterSurface: clear,\n leave,\n focusOut,\n toggled: (visible) => {\n // Light dismissal by the browser: an outside click or another popover.\n // The event of a close this controller made itself arrives later, when\n // the pointer may already wait on the next anchor; that delay stays.\n if (!visible && open()) {\n clear();\n pinned = undefined;\n setOpen(false);\n listen(false);\n }\n options.onOpenChange?.(visible);\n },\n },\n };\n}\n\nexport type HoverPreviewProps<T> = {\n preview: HoverPreviewController<T>;\n /** Accessible name of the card. */\n label: string;\n /** `\"content\"` (default) sizes the card to its content up to 32rem; `\"fixed\"` keeps one 22rem × 20rem box for every anchor. */\n size?: \"content\" | \"fixed\";\n class?: string;\n /** Plain content stays mounted while the card is closed; a function renders the open anchor's value. */\n children: JSX.Element | ((value: T) => JSX.Element);\n};\n\n/**\n * A non-modal card that opens beside the anchor a resting mouse points at.\n * Native popover owns the top layer and light dismissal.\n */\nexport function HoverPreview<T>(props: HoverPreviewProps<T>): JSX.Element {\n const state = props.preview[INTERNALS];\n let surface!: HTMLDivElement;\n onMount(() => state.bind(surface));\n const content = () => {\n const children = props.children;\n if (typeof children !== \"function\") return children;\n return (\n <Show when={state.current()} keyed>\n {(anchor) => children(anchor.value)}\n </Show>\n );\n };\n return (\n <div\n ref={surface}\n id={props.preview.id}\n popover=\"auto\"\n role=\"dialog\"\n aria-label={props.label}\n tabIndex={-1}\n class={props.class ? `k2b-hover-preview ${props.class}` : \"k2b-hover-preview\"}\n data-size={props.size ?? \"content\"}\n onPointerEnter={() => state.enterSurface()}\n onPointerLeave={() => state.leave()}\n on:focusout={(event) => state.focusOut(event)}\n onToggle={(event) => state.toggled(event.newState === \"open\")}\n >\n {content()}\n </div>\n );\n}\n"],"mappings":";;;;;AAAA,SAAwB,YAAY,EAAE,YAAY,EAAE,cAAc,EAAY,SAAS,EAAE,OAAO,EAAE,IAAI,QAAQ,UAAU;AACxH,SAAS,WAAW,EAAE,YAAY,QAAQ,0BAA0B;AACpE,SAAS,sBAAsB,QAAQ,oBAAoB;;AAE3D;AACA,MAAM,UAAU,GAAG,EAAE;AACrB;AACA,MAAM,WAAW,GAAG,GAAG;AACvB;AACA,MAAM,GAAG,GAAG,CAAC;AACb;AACA,MAAM,SAAS,GAAG,MAAM,CAAC,mBAAmB,CAAC;;AAE7C;AACA;AACA;AACA;AACA;AACA;AACA;;AAmDA;AACA,MAAM,UAAU,GAAG,CACjB,4FAA4F,EAC5F,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,kBAAkB,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,GAAG,CAC3H,IAAI,IAAK,UAAU,IAAI,IAC1B,CAAC,CACF,CAAC,IAAI,CAAC,IAAI,CAAC;;AAEZ;AACA,MAAM,YAAY,GAAG,oDAAoD;;AAEzE;AACA;AACA;AACA;AACA,OAAO,SAAS,kBAAkB,CAAI,OAA+B,GAAG,CAAC,CAAC,EAA6B;EACrG,MAAM,EAAE,GAAG,qBAAqB,cAAc,CAAC,CAAC,EAAE;EAClD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAY,CAAC;EACpC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,YAAY,CAAY,CAAC;EACvD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC;EAC3C,IAAI,OAAgC;EACpC,IAAI,KAAgD;EACpD;EACA,IAAI,OAA8B;EAClC;EACA,IAAI,MAA6B;EACjC,IAAI,SAAgC;EACpC,IAAI,IAAI,GAAG,IAAI;EACf,IAAI,QAAoC;EAExC,MAAM,SAAS,GAAG,MAA6B,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC;EACtE,MAAM,MAAM,GAAG,MAAM;IACnB,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC;IACzB,OAAO,QAAQ,IAAI,KAAK,GAAG,KAAK,GAAG,SAAS;EAC9C,CAAC;EACD,MAAM,WAAW,GAAI,MAAiB,IAAK,MAAM,CAAC,OAAO,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO;EAC/E,MAAM,QAAQ,GAAI,IAAU,IAAK,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAE,MAAM,IAAK,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;EAC7F,MAAM,KAAK,GAAG,MAAM;IAClB,YAAY,CAAC,KAAK,CAAC;IACnB,KAAK,GAAG,SAAS;IACjB,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,MAAM,CAAC;IACvE,OAAO,GAAG,SAAS;EACrB,CAAC;EACD;EACA,MAAM,OAAO,GAAG,MACd,CAAC,GAAG,QAAQ,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAE,OAAO,IAAK,OAAO,KAAK,OAAO,IAAI,EAAE,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;;EAEhI;EACA,MAAM,MAAM,GAAI,MAAkC,IAAK;IACrD,MAAM,IAAI,GAAG,MAAM,EAAE,qBAAqB,CAAC,CAAC;IAC5C,OAAO;MACL,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;MAChC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,IAAI,MAAM,CAAC,UAAU,CAAC;MACpE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,IAAI,MAAM,CAAC,WAAW;IACzE,CAAC;EACH,CAAC;EACD;EACA,MAAM,OAAO,GAAG,MAAM;IACpB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC;IACvB,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,OAAO,IAAI;IACpC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC;IACrD,IAAI,CAAC,IAAI,EAAE,OAAO,KAAK;IACvB,MAAM,KAAK,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,UAAU,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;IAC9G,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,GAAG,CAAC,GAAG,GAAG;EACxE,CAAC;EACD,MAAM,QAAQ,GAAG,MAAM;IACrB,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC;IACxB,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE;IACzB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC;IACvB,IAAI,MAAM,EAAE;MACV,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;MAC/F,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;MACrC,MAAM,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,MAAM;MACrD,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,GAAG;MACtD,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,IAAI;MACxD,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI;MACxG;IACF;IACA,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC;IACxD,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC;IACzB,IAAI,EAAE,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,EAAE;MACjD,MAAM,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,MAAM;MACrD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,MAAM;MAC5D,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,MAAM,CAAC,WAAW,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;IAChH;EACF,CAAC;EAED,MAAM,MAAM,GAAI,KAAoB,IAAK;IACvC,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;IAC5B,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE;MACX;MACA,IAAI,OAAO,EAAE,SAAS,GAAG,OAAO;MAChC,KAAK,CAAC,CAAC;MACP;IACF;IACA;IACA;IACA;IACA,IAAI,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;IACrE,OAAO,CAAC,CAAC;EACX,CAAC;EACD;EACA;EACA;EACA,MAAM,MAAM,GAAI,KAAY,IAAK;IAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM;IAC3B,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,QAAQ,CAAC,CAAC;IAChC,IAAI,EAAE,MAAM,YAAY,IAAI,CAAC,IAAI,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE;IAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC;IACxB,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;EACxD,CAAC;EACD,MAAM,MAAM,GAAG,MAAM;IACnB,IAAI,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,KACrB,IAAI,CAAC,CAAC;EACb,CAAC;EACD,MAAM,MAAM,GAAI,EAAW,IAAK;IAC9B,IAAI,EAAE,EAAE;MACN,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC;MAC5C,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC;MAC/C,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC;MACzC;IACF;IACA,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,MAAM,CAAC;IAC/C,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC;IAClD,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC;EAC9C,CAAC;EAED,MAAM,IAAI,GAAG,MAAM;IACjB,KAAK,CAAC,CAAC;IACP,MAAM,GAAG,SAAS;IAClB,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE;IACb,OAAO,CAAC,KAAK,CAAC;IACd,MAAM,CAAC,KAAK,CAAC;IACb,IAAI;MACF,OAAO,EAAE,WAAW,CAAC,CAAC;IACxB,CAAC,CAAC,MAAM;MACN;IAAA;EAEJ,CAAC;EACD,MAAM,OAAO,GAAG,MAAM;IACpB,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC;IACxB,SAAS,GAAG,MAAM;IAClB;IACA,IAAI,MAAM,IAAI,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC;IAC/F,IAAI,CAAC,CAAC;EACR,CAAC;EACD;AACF;AACA;AACA;AACA;EACE,MAAM,IAAI,GAAG,CAAC,MAAiB,EAAE,GAAY,KAAc;IACzD,KAAK,CAAC,CAAC;IACP,IAAI,CAAC,OAAO,IAAI,SAAS,KAAK,MAAM,EAAE,OAAO,KAAK;IAClD,IAAI,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE;MAClD,IAAI,CAAC,CAAC;MACN,OAAO,KAAK;IACd;IACA,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,KAAK,MAAM,EAAE;MACnC,IAAI,GAAG,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;MACxC,UAAU,CAAC,MAAM,CAAC;MAClB,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE;QACX,IAAI;UACF,OAAO,CAAC,WAAW,CAAC,CAAC;QACvB,CAAC,CAAC,MAAM;UACN,OAAO,KAAK;QACd;QACA,OAAO,CAAC,IAAI,CAAC;QACb,MAAM,CAAC,IAAI,CAAC;MACd;MACA,QAAQ,CAAC,CAAC;MACV,MAAM,GAAG,SAAS;IACpB;IACA,IAAI,GAAG,EAAE,MAAM,GAAG,MAAM;IACxB,OAAO,IAAI;EACb,CAAC;EACD;EACA,MAAM,QAAQ,GAAG,CAAC,MAAiB,EAAE,KAAa,EAAE,MAAM,GAAG,KAAK,KAAK;IACrE,KAAK,CAAC,CAAC;IACP,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE;MACX,OAAO,GAAG,MAAM;MAChB,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC;IAC9C;IACA,KAAK,GAAG,UAAU,CAAC,MAAM;MACvB,IAAI,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,MAAM,KAAK,SAAS,CAAC,CAAC,KACpD,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,KACvB,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;IAC1B,CAAC,EAAE,KAAK,CAAC;EACX,CAAC;EACD,MAAM,KAAK,GAAG,MAAM;IAClB,KAAK,CAAC,CAAC;IACP,SAAS,GAAG,SAAS;IACrB,IAAI,MAAM,IAAI,MAAM,KAAK,OAAO,CAAC,CAAC,EAAE;IACpC,KAAK,GAAG,UAAU,CAAC,MAAM;MACvB;MACA,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa;MACtC,MAAM,IAAI,GAAG,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAK,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAE;MACjH,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnB,CAAC,EAAE,WAAW,CAAC;EACjB,CAAC;EACD,MAAM,QAAQ,GAAI,KAAiB,IAAK;IACtC,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa;IAChC,IAAI,IAAI,YAAY,IAAI,KAAK,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE;IACzE,MAAM,GAAG,SAAS;IAClB,KAAK,CAAC,CAAC;EACT,CAAC;EAED,YAAY,CAAC,MAAM;IACjB,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC;IACxB,IAAI,IAAI,CAAC,CAAC,IAAI,MAAM,IAAI,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;EAClE,CAAC,CAAC;EACF;EACA;EACA,SAAS,CAAC,MAAM;IACd,IAAI,CAAC,CAAC;IACN,QAAQ,EAAE,UAAU,CAAC,CAAC;EACxB,CAAC,CAAC;EAEF,MAAM,MAAM,GACV,CAAC,KAAQ,EAAE,OAA8C,KACxD,OAAoB,IAAW;IAC9B,MAAM,KAAgB,GAAG;MAAE,KAAK;MAAE,OAAO;MAAE;IAAQ,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;IAClB,MAAM,YAAY,GAAI,KAAmB,IAAK;MAC5C;MACA,IAAI,KAAK,CAAC,WAAW,KAAK,OAAO,EAAE;MACnC,KAAK,CAAC,CAAC;MACP,IAAK,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,IAAK,SAAS,KAAK,KAAK,EAAE;MAC5D,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,UAAU,GAAI,OAAO,CAAC,SAAS,IAAI,GAAI,CAAC;IACnE,CAAC;IACD;IACA;IACA,MAAM,WAAW,GAAI,KAAmB,IAAK;MAC3C,IAAI,KAAK,CAAC,WAAW,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,SAAS,KAAK,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,IAAI,GAAG,CAAC;IAChH,CAAC;IACD;IACA,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,MAAM;MACpB,IAAI,IAAI,CAAC,CAAC,EAAE;QACV,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,KAC5B,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC;QACtC;MACF;MACA,KAAK,CAAC,CAAC;MACP,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,SAAS,KAAK,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,IAAI,GAAG,CAAC;IACpG,CAAC;IACD,MAAM,OAAO,GAAI,KAAoB,IAAK;MACxC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,IAAI,KAAK,CAAC,gBAAgB,EAAE;MACjF;MACA,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE;MACtE,IAAI,KAAK,CAAC,MAAM,YAAY,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;MACzE,KAAK,CAAC,cAAc,CAAC,CAAC;MACtB;MACA,IAAI,KAAK,CAAC,MAAM,EAAE;MAClB,IAAI,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,EAAE;QACjC,OAAO,CAAC,CAAC;QACT;MACF;MACA,SAAS,GAAG,SAAS;MACrB,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC;IACnB,CAAC;IACD,OAAO,CAAC,gBAAgB,CAAC,cAAc,EAAE,YAAY,CAAC;IACtD,OAAO,CAAC,gBAAgB,CAAC,aAAa,EAAE,WAAW,CAAC;IACpD,OAAO,CAAC,gBAAgB,CAAC,aAAa,EAAE,WAAW,CAAC;IACpD,OAAO,CAAC,gBAAgB,CAAC,cAAc,EAAE,KAAK,CAAC;IAC/C,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5C,OAAO,CAAC,gBAAgB,CAAC,UAAU,EAAE,QAAQ,CAAC;IAC9C,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5C,SAAS,CAAC,MAAM;MACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;MACrB,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,EAAE,IAAI,CAAC,CAAC;MAC/B,OAAO,CAAC,mBAAmB,CAAC,cAAc,EAAE,YAAY,CAAC;MACzD,OAAO,CAAC,mBAAmB,CAAC,aAAa,EAAE,WAAW,CAAC;MACvD,OAAO,CAAC,mBAAmB,CAAC,aAAa,EAAE,WAAW,CAAC;MACvD,OAAO,CAAC,mBAAmB,CAAC,cAAc,EAAE,KAAK,CAAC;MAClD,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC;MAC/C,OAAO,CAAC,mBAAmB,CAAC,UAAU,EAAE,QAAQ,CAAC;MACjD,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC;IACjD,CAAC,CAAC;EACJ,CAAC;EAEH,OAAO;IACL,EAAE;IACF,MAAM;IACN,MAAM,EAAE,MAAO,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,KAAK,GAAG,SAAU;IACrD,MAAM,EAAG,KAAK,IAAK;MACjB,MAAM,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAE,SAAS,IAAK,SAAS,CAAC,KAAK,KAAK,KAAK,CAAC;MACzE,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE;MACxB,KAAK,CAAC,CAAC;MACP,IAAI,IAAI,CAAC,CAAC,IAAI,MAAM,KAAK,KAAK,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,EAAE;QACrD,OAAO,CAAC,CAAC;QACT;MACF;MACA;MACA,IAAI,GAAG,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;MACvC,SAAS,GAAG,SAAS;MACrB,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IACD,KAAK,EAAE,OAAO;IACd,CAAC,SAAS,GAAG;MACX,OAAO;MACP,IAAI,EAAG,OAAO,IAAK;QACjB,OAAO,GAAG,OAAO;QACjB,QAAQ,GAAG,IAAI,cAAc,CAAC,MAAM;UAClC,IAAI,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACxB,CAAC,CAAC;QACF,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC;MAC3B,CAAC;MACD,YAAY,EAAE,KAAK;MACnB,KAAK;MACL,QAAQ;MACR,OAAO,EAAG,OAAO,IAAK;QACpB;QACA;QACA;QACA,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,EAAE;UACtB,KAAK,CAAC,CAAC;UACP,MAAM,GAAG,SAAS;UAClB,OAAO,CAAC,KAAK,CAAC;UACd,MAAM,CAAC,KAAK,CAAC;QACf;QACA,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC;MACjC;IACF;EACF,CAAC;AACH;AAaA;AACA;AACA;AACA;AACA,OAAO,SAAS,YAAY,CAAI,KAA2B,EAAe;EACxE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;EACtC,IAAI,OAAwB;EAC5B,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;EAClC,MAAM,OAAO,GAAG,MAAM;IACpB,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ;IAC/B,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,OAAO,QAAQ;IACnD,yBACG,IAAI;MAAA,IAAC,IAAI;QAAA,OAAE,KAAK,CAAC,OAAO,CAAC,CAAC;MAAA;MAAE,KAAK;MAAA,UAC9B,MAAM,IAAK,QAAQ,CAAC,MAAM,CAAC,KAAK;IAAC;EAGzC,CAAC;EACD,mDAGQ,KAAK,CAAC,OAAO,CAAC,EAAE,uDAGR,KAAK,CAAC,KAAK,yCAEhB,KAAK,CAAC,KAAK,GAAG,8BAAqB,KAAK,CAAC,KAAK,SAAE,GAAG,mBAAmB,gDAClE,KAAK,CAAC,IAAI,IAAI,SAAS,0BAMjC,OAAO,CAAC,CAAC;AAGhB","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["feedback/HoverPreview.tsx"],"sourcesContent":["import { type Accessor, createEffect, createSignal, createUniqueId, type JSX, onCleanup, onMount, Show } from \"solid-js\";\nimport { returnFocus, ringOnReturn } from \"../internal/focus-return\";\nimport { positionTooltipSurface } from \"./tooltip-position\";\n\n/** A resting pointer moving from one anchor to another swaps the card this fast. */\nconst SWAP_DELAY = 90;\n/** Grace period for the pointer to travel from an anchor into the card. */\nconst CLOSE_DELAY = 180;\n/** Distance to the region and to the boundary edges. */\nconst GAP = 8;\n/** Keys the wiring between a controller and its `<HoverPreview>`. */\nconst INTERNALS = Symbol(\"k2b-hover-preview\");\n\n/**\n * Where the card opens. By default it opens to the right of its anchor,\n * centered on it or aligned with its bottom edge, and flips or clamps to stay\n * in the viewport. With `beside`, it opens right of that region, such as a list\n * column, top-aligned with the anchor and clamped into `within` (default: the\n * viewport); when the card does not fit there, it does not open at all.\n */\nexport type HoverPreviewPlacement =\n | { align?: \"center\" | \"end\" }\n | { beside: () => HTMLElement | null | undefined; within?: () => HTMLElement | null | undefined };\n\nexport type HoverPreviewOptions<T> = {\n /** Milliseconds a resting mouse waits on an anchor before the card opens. Defaults to 250. */\n openDelay?: number;\n /**\n * How keyboard users open the card: `\"space\"` (default) toggles it with Space\n * on the focused anchor and leaves focus there; `\"focus\"` opens it after the\n * open delay whenever an anchor receives focus.\n */\n keyboard?: \"space\" | \"focus\";\n placement?: HoverPreviewPlacement;\n /** Anchors whose value is disabled open no card; an open card closes once its value becomes disabled. */\n disabled?: (value: T) => boolean;\n /** Runs whenever the card opens or closes, including light dismissal by the browser. */\n onOpenChange?: (open: boolean) => void;\n};\n\nexport type HoverPreviewController<T> = {\n /** Id of the card element, for `aria-controls`. */\n readonly id: string;\n /**\n * Registers an anchor element for `value`; use the result as a `ref`.\n * `trigger` is the control that toggles the card for this anchor; Escape\n * returns focus there when focus is inside the card. Defaults to the anchor.\n */\n anchor: (value: T, trigger?: () => HTMLElement | null | undefined) => (element: HTMLElement) => void;\n /** The value whose card is open, or `undefined` while closed. */\n active: Accessor<T | undefined>;\n /** Opens the card for `value` at once and moves focus into it, or closes it when it is already pinned open. */\n toggle: (value: T) => void;\n /** Closes the card; it reopens for the same anchor only after the pointer left it. */\n close: () => void;\n /** Wiring for `<HoverPreview>`; not part of the public contract. */\n readonly [INTERNALS]: Internals<T>;\n};\n\ntype Anchor<T> = { value: T; element: HTMLElement; trigger?: () => HTMLElement | null | undefined };\n\ntype Internals<T> = {\n current: Accessor<Anchor<T> | undefined>;\n bind: (surface: HTMLElement) => void;\n enterSurface: () => void;\n leave: () => void;\n focusOut: (event: FocusEvent) => void;\n toggled: (open: boolean) => void;\n};\n\n/** Elements that use Space themselves; Space on them never toggles the card. */\nconst OWNS_SPACE = [\n \"button, input, select, textarea, summary, [contenteditable]:not([contenteditable='false'])\",\n ...[\"button\", \"checkbox\", \"switch\", \"radio\", \"option\", \"menuitem\", \"menuitemcheckbox\", \"menuitemradio\", \"tab\", \"treeitem\"].map(\n (role) => `[role='${role}']`,\n ),\n].join(\", \");\n\n/** Open light-dismiss popovers, such as a menu or a date picker, close when another one opens. */\nconst AUTO_POPOVER = \":is([popover=''], [popover='auto' i]):popover-open\";\n\n/**\n * Creates the behavior of one hover preview card shared by a group of anchors,\n * such as the rows of a list. Render the card with `<HoverPreview preview={…}>`.\n */\nexport function createHoverPreview<T>(options: HoverPreviewOptions<T> = {}): HoverPreviewController<T> {\n const id = `k2b-hover-preview-${createUniqueId()}`;\n const anchors = new Set<Anchor<T>>();\n const [current, setCurrent] = createSignal<Anchor<T>>();\n const [open, setOpen] = createSignal(false);\n let surface: HTMLElement | undefined;\n let timer: ReturnType<typeof setTimeout> | undefined;\n /** The anchor whose open delay runs while the card is closed. */\n let pending: Anchor<T> | undefined;\n /** The anchor that Space or `toggle()` opened the card for; only it outlasts the pointer leaving. */\n let pinned: Anchor<T> | undefined;\n let dismissed: Anchor<T> | undefined;\n /** Where the mouse last moved on an anchor; a mouse rest checks this point when its delay ends. */\n let mouse: { x: number; y: number } | undefined;\n let ring = true;\n let observer: ResizeObserver | undefined;\n\n const placement = (): HoverPreviewPlacement => options.placement ?? {};\n const region = () => {\n const value = placement();\n return \"beside\" in value ? value : undefined;\n };\n const focusTarget = (anchor: Anchor<T>) => anchor.trigger?.() ?? anchor.element;\n const anchorOf = (node: Node) => [...anchors].find((anchor) => anchor.element.contains(node));\n const clear = () => {\n clearTimeout(timer);\n timer = undefined;\n if (pending && !open()) document.removeEventListener(\"keydown\", escape);\n pending = undefined;\n };\n /** A passive card never closes a menu or another popover someone opened on purpose. */\n const blocked = () =>\n [...document.querySelectorAll(AUTO_POPOVER)].some((popover) => popover !== surface && !(surface && popover.contains(surface)));\n\n /** The boundary rectangle, never larger than the viewport. */\n const bounds = (within: Element | null | undefined) => {\n const rect = within?.getBoundingClientRect();\n return {\n top: Math.max(0, rect?.top ?? 0),\n right: Math.min(window.innerWidth, rect?.right ?? window.innerWidth),\n bottom: Math.min(window.innerHeight, rect?.bottom ?? window.innerHeight),\n };\n };\n /** Room right of the region for the card plus a gap on both sides. Works while the card is hidden. */\n const hasRoom = () => {\n const beside = region();\n if (!beside || !surface) return true;\n const area = beside.beside()?.getBoundingClientRect();\n if (!area) return false;\n const width = surface.getBoundingClientRect().width || Number.parseFloat(getComputedStyle(surface).width) || 0;\n return bounds(beside.within?.()).right - area.right >= width + 2 * GAP;\n };\n const position = () => {\n const anchor = current();\n if (!surface || !anchor) return;\n const beside = region();\n if (beside) {\n const area = beside.beside()?.getBoundingClientRect() ?? anchor.element.getBoundingClientRect();\n const box = bounds(beside.within?.());\n const height = surface.getBoundingClientRect().height;\n const top = anchor.element.getBoundingClientRect().top;\n surface.style.left = `${Math.round(area.right + GAP)}px`;\n surface.style.top = `${Math.round(Math.max(box.top + GAP, Math.min(top, box.bottom - height - GAP)))}px`;\n return;\n }\n positionTooltipSurface(surface, anchor.element, \"right\");\n const value = placement();\n if (!(\"beside\" in value) && value.align === \"end\") {\n const height = surface.getBoundingClientRect().height;\n const bottom = anchor.element.getBoundingClientRect().bottom;\n surface.style.top = `${Math.round(Math.max(8, Math.min(bottom - height, window.innerHeight - height - 8)))}px`;\n }\n };\n\n const escape = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n if (!open()) {\n // Escape during the open delay works as if the card had opened and closed.\n if (pending) dismissed = pending;\n clear();\n return;\n }\n // Focus in the card goes back to the trigger: handled here, so the browser\n // neither returns it itself nor lights the ring for this key. A card the\n // pointer opened leaves the key to other handlers, such as an open modeless dialog.\n if (surface?.contains(document.activeElement)) event.preventDefault();\n dismiss();\n };\n // A card beside a region belongs to a row of a scrolling list: once the list\n // scrolls, another row sits under the pointer, so the card closes. A card\n // beside its anchor follows it.\n const scroll = (event: Event) => {\n const target = event.target;\n if (!region()) return position();\n if (!(target instanceof Node) || surface?.contains(target)) return;\n const anchor = current();\n if (!anchor || target.contains(anchor.element)) hide();\n };\n const resize = () => {\n if (hasRoom()) position();\n else hide();\n };\n const listen = (on: boolean) => {\n if (on) {\n document.addEventListener(\"keydown\", escape);\n window.addEventListener(\"scroll\", scroll, true);\n window.addEventListener(\"resize\", resize);\n return;\n }\n document.removeEventListener(\"keydown\", escape);\n window.removeEventListener(\"scroll\", scroll, true);\n window.removeEventListener(\"resize\", resize);\n };\n\n const hide = () => {\n clear();\n pinned = undefined;\n if (!open()) return;\n setOpen(false);\n listen(false);\n try {\n surface?.hidePopover();\n } catch {\n // The card may already be disconnected during cleanup.\n }\n };\n const dismiss = () => {\n const anchor = current();\n dismissed = anchor;\n // Before hiding, so the popover does not return focus on its own.\n if (anchor && surface?.contains(document.activeElement)) returnFocus(focusTarget(anchor), ring);\n hide();\n };\n /**\n * Opens the card for `anchor` or moves it there; `pin` keeps it open after\n * the pointer leaves. Moving the card to another anchor drops an earlier pin.\n * Returns whether it is open for `anchor`.\n */\n const show = (anchor: Anchor<T>, pin: boolean): boolean => {\n clear();\n if (!surface || dismissed === anchor) return false;\n if (options.disabled?.(anchor.value) || !hasRoom()) {\n hide();\n return false;\n }\n if (!open() || current() !== anchor) {\n ring = ringOnReturn(focusTarget(anchor));\n setCurrent(anchor);\n if (!open()) {\n try {\n surface.showPopover();\n } catch {\n return false;\n }\n setOpen(true);\n listen(true);\n }\n position();\n pinned = undefined;\n }\n if (pin) pinned = anchor;\n return true;\n };\n /**\n * Whether the mouse still rests on `anchor`. A scrolling list or a layout\n * change moves rows under a still mouse before the browser reports another\n * pointer event; WebKit reports it only several scroll steps later.\n */\n const restsOn = (anchor: Anchor<T>) => {\n if (!mouse) return false;\n // Inside a shadow root, the document reports only the shadow host.\n const root = anchor.element.getRootNode();\n const hit = (root instanceof ShadowRoot ? root : document).elementFromPoint(mouse.x, mouse.y);\n return hit !== null && anchor.element.contains(hit);\n };\n /**\n * Shows `anchor` after `delay`; a keyboard swap (`follow`) carries an existing\n * pin along. A mouse rest (`rest`) shows the anchor only if it still lies\n * under the mouse.\n */\n const schedule = (anchor: Anchor<T>, delay: number, follow = false, rest = false) => {\n clear();\n if (!open()) {\n pending = anchor;\n document.addEventListener(\"keydown\", escape);\n }\n timer = setTimeout(() => {\n if (rest && !restsOn(anchor)) clear();\n else if (open()) show(anchor, follow && pinned !== undefined);\n else if (blocked()) clear();\n else show(anchor, false);\n }, delay);\n };\n const leave = () => {\n clear();\n dismissed = undefined;\n if (pinned && pinned === current()) return;\n timer = setTimeout(() => {\n // Focus holds the card open inside it, and on the anchor where focus opens it.\n const focused = document.activeElement;\n const held = surface?.contains(focused) || (options.keyboard === \"focus\" && current()?.element.contains(focused));\n if (!held) hide();\n }, CLOSE_DELAY);\n };\n const focusOut = (event: FocusEvent) => {\n const next = event.relatedTarget;\n if (next instanceof Node && (surface?.contains(next) || anchorOf(next))) return;\n pinned = undefined;\n leave();\n };\n\n createEffect(() => {\n const anchor = current();\n if (open() && anchor && options.disabled?.(anchor.value)) hide();\n });\n // Only an open card holds global listeners, so a server render that\n // disposes the controller touches no browser globals.\n onCleanup(() => {\n hide();\n observer?.disconnect();\n });\n\n const anchor =\n (value: T, trigger?: () => HTMLElement | null | undefined) =>\n (element: HTMLElement): void => {\n const entry: Anchor<T> = { value, element, trigger };\n anchors.add(entry);\n const pointerEnter = (event: PointerEvent) => {\n // Touch and pen have no resting hover; the card stays a mouse affordance.\n if (event.pointerType !== \"mouse\") return;\n mouse = { x: event.clientX, y: event.clientY };\n clear();\n if ((open() && current() === entry) || dismissed === entry) return;\n schedule(entry, open() ? SWAP_DELAY : (options.openDelay ?? 250), false, true);\n };\n // The open delay counts from the moment the mouse rests. An open card\n // swaps on entering another anchor; movement inside it only moves the\n // position that the swap checks.\n const pointerMove = (event: PointerEvent) => {\n if (event.pointerType !== \"mouse\") return;\n mouse = { x: event.clientX, y: event.clientY };\n if (!open() && dismissed !== entry) schedule(entry, options.openDelay ?? 250, false, true);\n };\n // A press acts on the row, such as opening it or its menu; a card about to open stays closed.\n const pointerDown = () => clear();\n const focusIn = () => {\n if (open()) {\n if (current() === entry) clear();\n else schedule(entry, SWAP_DELAY, true);\n return;\n }\n clear();\n if (options.keyboard === \"focus\" && dismissed !== entry) schedule(entry, options.openDelay ?? 250);\n };\n const keyDown = (event: KeyboardEvent) => {\n if (options.keyboard === \"focus\" || event.key !== \" \" || event.defaultPrevented) return;\n // Shift+Space keeps scrolling up; other modifiers belong to shortcuts.\n if (event.shiftKey || event.ctrlKey || event.altKey || event.metaKey) return;\n if (event.target instanceof Element && event.target.matches(OWNS_SPACE)) return;\n event.preventDefault();\n // A held key toggles once; its repeats only keep the page from scrolling.\n if (event.repeat) return;\n if (open() && current() === entry) {\n dismiss();\n return;\n }\n dismissed = undefined;\n show(entry, true);\n };\n element.addEventListener(\"pointerenter\", pointerEnter);\n element.addEventListener(\"pointermove\", pointerMove);\n element.addEventListener(\"pointerdown\", pointerDown);\n element.addEventListener(\"pointerleave\", leave);\n element.addEventListener(\"focusin\", focusIn);\n element.addEventListener(\"focusout\", focusOut);\n element.addEventListener(\"keydown\", keyDown);\n onCleanup(() => {\n anchors.delete(entry);\n if (current() === entry) hide();\n element.removeEventListener(\"pointerenter\", pointerEnter);\n element.removeEventListener(\"pointermove\", pointerMove);\n element.removeEventListener(\"pointerdown\", pointerDown);\n element.removeEventListener(\"pointerleave\", leave);\n element.removeEventListener(\"focusin\", focusIn);\n element.removeEventListener(\"focusout\", focusOut);\n element.removeEventListener(\"keydown\", keyDown);\n });\n };\n\n return {\n id,\n anchor,\n active: () => (open() ? current()?.value : undefined),\n toggle: (value) => {\n const entry = [...anchors].find((candidate) => candidate.value === value);\n if (!entry || !surface) return;\n clear();\n if (open() && pinned === entry && current() === entry) {\n dismiss();\n return;\n }\n // A hover may have opened the card before this click or key press pinned it.\n ring = ringOnReturn(focusTarget(entry));\n dismissed = undefined;\n if (show(entry, true)) surface.focus();\n },\n close: dismiss,\n [INTERNALS]: {\n current,\n bind: (element) => {\n surface = element;\n observer = new ResizeObserver(() => {\n if (open()) position();\n });\n observer.observe(element);\n },\n enterSurface: clear,\n leave,\n focusOut,\n toggled: (visible) => {\n // Light dismissal by the browser: an outside click or another popover.\n // The event of a close this controller made itself arrives later, when\n // the pointer may already wait on the next anchor; that delay stays.\n if (!visible && open()) {\n clear();\n pinned = undefined;\n setOpen(false);\n listen(false);\n }\n options.onOpenChange?.(visible);\n },\n },\n };\n}\n\nexport type HoverPreviewProps<T> = {\n preview: HoverPreviewController<T>;\n /** Accessible name of the card. */\n label: string;\n /** `\"content\"` (default) sizes the card to its content up to 32rem; `\"fixed\"` keeps one 22rem × 20rem box for every anchor. */\n size?: \"content\" | \"fixed\";\n class?: string;\n /** Plain content stays mounted while the card is closed; a function renders the open anchor's value. */\n children: JSX.Element | ((value: T) => JSX.Element);\n};\n\n/**\n * A non-modal card that opens beside the anchor a resting mouse points at.\n * Native popover owns the top layer and light dismissal.\n */\nexport function HoverPreview<T>(props: HoverPreviewProps<T>): JSX.Element {\n const state = props.preview[INTERNALS];\n let surface!: HTMLDivElement;\n onMount(() => state.bind(surface));\n const content = () => {\n const children = props.children;\n if (typeof children !== \"function\") return children;\n return (\n <Show when={state.current()} keyed>\n {(anchor) => children(anchor.value)}\n </Show>\n );\n };\n return (\n <div\n ref={surface}\n id={props.preview.id}\n popover=\"auto\"\n role=\"dialog\"\n aria-label={props.label}\n tabIndex={-1}\n class={props.class ? `k2b-hover-preview ${props.class}` : \"k2b-hover-preview\"}\n data-size={props.size ?? \"content\"}\n onPointerEnter={() => state.enterSurface()}\n onPointerLeave={() => state.leave()}\n on:focusout={(event) => state.focusOut(event)}\n onToggle={(event) => state.toggled(event.newState === \"open\")}\n >\n {content()}\n </div>\n );\n}\n"],"mappings":";;;;;AAAA,SAAwB,YAAY,EAAE,YAAY,EAAE,cAAc,EAAY,SAAS,EAAE,OAAO,EAAE,IAAI,QAAQ,UAAU;AACxH,SAAS,WAAW,EAAE,YAAY,QAAQ,0BAA0B;AACpE,SAAS,sBAAsB,QAAQ,oBAAoB;;AAE3D;AACA,MAAM,UAAU,GAAG,EAAE;AACrB;AACA,MAAM,WAAW,GAAG,GAAG;AACvB;AACA,MAAM,GAAG,GAAG,CAAC;AACb;AACA,MAAM,SAAS,GAAG,MAAM,CAAC,mBAAmB,CAAC;;AAE7C;AACA;AACA;AACA;AACA;AACA;AACA;;AAmDA;AACA,MAAM,UAAU,GAAG,CACjB,4FAA4F,EAC5F,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,kBAAkB,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,GAAG,CAC3H,IAAI,IAAK,UAAU,IAAI,IAC1B,CAAC,CACF,CAAC,IAAI,CAAC,IAAI,CAAC;;AAEZ;AACA,MAAM,YAAY,GAAG,oDAAoD;;AAEzE;AACA;AACA;AACA;AACA,OAAO,SAAS,kBAAkB,CAAI,OAA+B,GAAG,CAAC,CAAC,EAA6B;EACrG,MAAM,EAAE,GAAG,qBAAqB,cAAc,CAAC,CAAC,EAAE;EAClD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAY,CAAC;EACpC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,YAAY,CAAY,CAAC;EACvD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC;EAC3C,IAAI,OAAgC;EACpC,IAAI,KAAgD;EACpD;EACA,IAAI,OAA8B;EAClC;EACA,IAAI,MAA6B;EACjC,IAAI,SAAgC;EACpC;EACA,IAAI,KAA2C;EAC/C,IAAI,IAAI,GAAG,IAAI;EACf,IAAI,QAAoC;EAExC,MAAM,SAAS,GAAG,MAA6B,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC;EACtE,MAAM,MAAM,GAAG,MAAM;IACnB,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC;IACzB,OAAO,QAAQ,IAAI,KAAK,GAAG,KAAK,GAAG,SAAS;EAC9C,CAAC;EACD,MAAM,WAAW,GAAI,MAAiB,IAAK,MAAM,CAAC,OAAO,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO;EAC/E,MAAM,QAAQ,GAAI,IAAU,IAAK,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAE,MAAM,IAAK,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;EAC7F,MAAM,KAAK,GAAG,MAAM;IAClB,YAAY,CAAC,KAAK,CAAC;IACnB,KAAK,GAAG,SAAS;IACjB,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,MAAM,CAAC;IACvE,OAAO,GAAG,SAAS;EACrB,CAAC;EACD;EACA,MAAM,OAAO,GAAG,MACd,CAAC,GAAG,QAAQ,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAE,OAAO,IAAK,OAAO,KAAK,OAAO,IAAI,EAAE,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;;EAEhI;EACA,MAAM,MAAM,GAAI,MAAkC,IAAK;IACrD,MAAM,IAAI,GAAG,MAAM,EAAE,qBAAqB,CAAC,CAAC;IAC5C,OAAO;MACL,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;MAChC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,IAAI,MAAM,CAAC,UAAU,CAAC;MACpE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,IAAI,MAAM,CAAC,WAAW;IACzE,CAAC;EACH,CAAC;EACD;EACA,MAAM,OAAO,GAAG,MAAM;IACpB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC;IACvB,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,OAAO,IAAI;IACpC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC;IACrD,IAAI,CAAC,IAAI,EAAE,OAAO,KAAK;IACvB,MAAM,KAAK,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,UAAU,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;IAC9G,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,GAAG,CAAC,GAAG,GAAG;EACxE,CAAC;EACD,MAAM,QAAQ,GAAG,MAAM;IACrB,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC;IACxB,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE;IACzB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC;IACvB,IAAI,MAAM,EAAE;MACV,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;MAC/F,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;MACrC,MAAM,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,MAAM;MACrD,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,GAAG;MACtD,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,IAAI;MACxD,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI;MACxG;IACF;IACA,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC;IACxD,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC;IACzB,IAAI,EAAE,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,EAAE;MACjD,MAAM,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,MAAM;MACrD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,MAAM;MAC5D,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,MAAM,CAAC,WAAW,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;IAChH;EACF,CAAC;EAED,MAAM,MAAM,GAAI,KAAoB,IAAK;IACvC,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;IAC5B,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE;MACX;MACA,IAAI,OAAO,EAAE,SAAS,GAAG,OAAO;MAChC,KAAK,CAAC,CAAC;MACP;IACF;IACA;IACA;IACA;IACA,IAAI,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;IACrE,OAAO,CAAC,CAAC;EACX,CAAC;EACD;EACA;EACA;EACA,MAAM,MAAM,GAAI,KAAY,IAAK;IAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM;IAC3B,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,QAAQ,CAAC,CAAC;IAChC,IAAI,EAAE,MAAM,YAAY,IAAI,CAAC,IAAI,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE;IAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC;IACxB,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;EACxD,CAAC;EACD,MAAM,MAAM,GAAG,MAAM;IACnB,IAAI,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,KACrB,IAAI,CAAC,CAAC;EACb,CAAC;EACD,MAAM,MAAM,GAAI,EAAW,IAAK;IAC9B,IAAI,EAAE,EAAE;MACN,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC;MAC5C,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC;MAC/C,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC;MACzC;IACF;IACA,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,MAAM,CAAC;IAC/C,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC;IAClD,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC;EAC9C,CAAC;EAED,MAAM,IAAI,GAAG,MAAM;IACjB,KAAK,CAAC,CAAC;IACP,MAAM,GAAG,SAAS;IAClB,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE;IACb,OAAO,CAAC,KAAK,CAAC;IACd,MAAM,CAAC,KAAK,CAAC;IACb,IAAI;MACF,OAAO,EAAE,WAAW,CAAC,CAAC;IACxB,CAAC,CAAC,MAAM;MACN;IAAA;EAEJ,CAAC;EACD,MAAM,OAAO,GAAG,MAAM;IACpB,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC;IACxB,SAAS,GAAG,MAAM;IAClB;IACA,IAAI,MAAM,IAAI,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC;IAC/F,IAAI,CAAC,CAAC;EACR,CAAC;EACD;AACF;AACA;AACA;AACA;EACE,MAAM,IAAI,GAAG,CAAC,MAAiB,EAAE,GAAY,KAAc;IACzD,KAAK,CAAC,CAAC;IACP,IAAI,CAAC,OAAO,IAAI,SAAS,KAAK,MAAM,EAAE,OAAO,KAAK;IAClD,IAAI,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE;MAClD,IAAI,CAAC,CAAC;MACN,OAAO,KAAK;IACd;IACA,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,KAAK,MAAM,EAAE;MACnC,IAAI,GAAG,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;MACxC,UAAU,CAAC,MAAM,CAAC;MAClB,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE;QACX,IAAI;UACF,OAAO,CAAC,WAAW,CAAC,CAAC;QACvB,CAAC,CAAC,MAAM;UACN,OAAO,KAAK;QACd;QACA,OAAO,CAAC,IAAI,CAAC;QACb,MAAM,CAAC,IAAI,CAAC;MACd;MACA,QAAQ,CAAC,CAAC;MACV,MAAM,GAAG,SAAS;IACpB;IACA,IAAI,GAAG,EAAE,MAAM,GAAG,MAAM;IACxB,OAAO,IAAI;EACb,CAAC;EACD;AACF;AACA;AACA;AACA;EACE,MAAM,OAAO,GAAI,MAAiB,IAAK;IACrC,IAAI,CAAC,KAAK,EAAE,OAAO,KAAK;IACxB;IACA,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,CAAC,IAAI,YAAY,UAAU,GAAG,IAAI,GAAG,QAAQ,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAC7F,OAAO,GAAG,KAAK,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;EACrD,CAAC;EACD;AACF;AACA;AACA;AACA;EACE,MAAM,QAAQ,GAAG,CAAC,MAAiB,EAAE,KAAa,EAAE,MAAM,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,KAAK;IACnF,KAAK,CAAC,CAAC;IACP,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE;MACX,OAAO,GAAG,MAAM;MAChB,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC;IAC9C;IACA,KAAK,GAAG,UAAU,CAAC,MAAM;MACvB,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,KACjC,IAAI,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,MAAM,KAAK,SAAS,CAAC,CAAC,KACzD,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,KACvB,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;IAC1B,CAAC,EAAE,KAAK,CAAC;EACX,CAAC;EACD,MAAM,KAAK,GAAG,MAAM;IAClB,KAAK,CAAC,CAAC;IACP,SAAS,GAAG,SAAS;IACrB,IAAI,MAAM,IAAI,MAAM,KAAK,OAAO,CAAC,CAAC,EAAE;IACpC,KAAK,GAAG,UAAU,CAAC,MAAM;MACvB;MACA,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa;MACtC,MAAM,IAAI,GAAG,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAK,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAE;MACjH,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnB,CAAC,EAAE,WAAW,CAAC;EACjB,CAAC;EACD,MAAM,QAAQ,GAAI,KAAiB,IAAK;IACtC,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa;IAChC,IAAI,IAAI,YAAY,IAAI,KAAK,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE;IACzE,MAAM,GAAG,SAAS;IAClB,KAAK,CAAC,CAAC;EACT,CAAC;EAED,YAAY,CAAC,MAAM;IACjB,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC;IACxB,IAAI,IAAI,CAAC,CAAC,IAAI,MAAM,IAAI,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;EAClE,CAAC,CAAC;EACF;EACA;EACA,SAAS,CAAC,MAAM;IACd,IAAI,CAAC,CAAC;IACN,QAAQ,EAAE,UAAU,CAAC,CAAC;EACxB,CAAC,CAAC;EAEF,MAAM,MAAM,GACV,CAAC,KAAQ,EAAE,OAA8C,KACxD,OAAoB,IAAW;IAC9B,MAAM,KAAgB,GAAG;MAAE,KAAK;MAAE,OAAO;MAAE;IAAQ,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;IAClB,MAAM,YAAY,GAAI,KAAmB,IAAK;MAC5C;MACA,IAAI,KAAK,CAAC,WAAW,KAAK,OAAO,EAAE;MACnC,KAAK,GAAG;QAAE,CAAC,EAAE,KAAK,CAAC,OAAO;QAAE,CAAC,EAAE,KAAK,CAAC;MAAQ,CAAC;MAC9C,KAAK,CAAC,CAAC;MACP,IAAK,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,IAAK,SAAS,KAAK,KAAK,EAAE;MAC5D,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,UAAU,GAAI,OAAO,CAAC,SAAS,IAAI,GAAI,EAAE,KAAK,EAAE,IAAI,CAAC;IAChF,CAAC;IACD;IACA;IACA;IACA,MAAM,WAAW,GAAI,KAAmB,IAAK;MAC3C,IAAI,KAAK,CAAC,WAAW,KAAK,OAAO,EAAE;MACnC,KAAK,GAAG;QAAE,CAAC,EAAE,KAAK,CAAC,OAAO;QAAE,CAAC,EAAE,KAAK,CAAC;MAAQ,CAAC;MAC9C,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,SAAS,KAAK,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,IAAI,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC;IAC5F,CAAC;IACD;IACA,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,MAAM;MACpB,IAAI,IAAI,CAAC,CAAC,EAAE;QACV,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,KAC5B,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC;QACtC;MACF;MACA,KAAK,CAAC,CAAC;MACP,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,SAAS,KAAK,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,IAAI,GAAG,CAAC;IACpG,CAAC;IACD,MAAM,OAAO,GAAI,KAAoB,IAAK;MACxC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,IAAI,KAAK,CAAC,gBAAgB,EAAE;MACjF;MACA,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE;MACtE,IAAI,KAAK,CAAC,MAAM,YAAY,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;MACzE,KAAK,CAAC,cAAc,CAAC,CAAC;MACtB;MACA,IAAI,KAAK,CAAC,MAAM,EAAE;MAClB,IAAI,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,EAAE;QACjC,OAAO,CAAC,CAAC;QACT;MACF;MACA,SAAS,GAAG,SAAS;MACrB,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC;IACnB,CAAC;IACD,OAAO,CAAC,gBAAgB,CAAC,cAAc,EAAE,YAAY,CAAC;IACtD,OAAO,CAAC,gBAAgB,CAAC,aAAa,EAAE,WAAW,CAAC;IACpD,OAAO,CAAC,gBAAgB,CAAC,aAAa,EAAE,WAAW,CAAC;IACpD,OAAO,CAAC,gBAAgB,CAAC,cAAc,EAAE,KAAK,CAAC;IAC/C,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5C,OAAO,CAAC,gBAAgB,CAAC,UAAU,EAAE,QAAQ,CAAC;IAC9C,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5C,SAAS,CAAC,MAAM;MACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;MACrB,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,EAAE,IAAI,CAAC,CAAC;MAC/B,OAAO,CAAC,mBAAmB,CAAC,cAAc,EAAE,YAAY,CAAC;MACzD,OAAO,CAAC,mBAAmB,CAAC,aAAa,EAAE,WAAW,CAAC;MACvD,OAAO,CAAC,mBAAmB,CAAC,aAAa,EAAE,WAAW,CAAC;MACvD,OAAO,CAAC,mBAAmB,CAAC,cAAc,EAAE,KAAK,CAAC;MAClD,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC;MAC/C,OAAO,CAAC,mBAAmB,CAAC,UAAU,EAAE,QAAQ,CAAC;MACjD,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC;IACjD,CAAC,CAAC;EACJ,CAAC;EAEH,OAAO;IACL,EAAE;IACF,MAAM;IACN,MAAM,EAAE,MAAO,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,KAAK,GAAG,SAAU;IACrD,MAAM,EAAG,KAAK,IAAK;MACjB,MAAM,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAE,SAAS,IAAK,SAAS,CAAC,KAAK,KAAK,KAAK,CAAC;MACzE,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE;MACxB,KAAK,CAAC,CAAC;MACP,IAAI,IAAI,CAAC,CAAC,IAAI,MAAM,KAAK,KAAK,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,EAAE;QACrD,OAAO,CAAC,CAAC;QACT;MACF;MACA;MACA,IAAI,GAAG,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;MACvC,SAAS,GAAG,SAAS;MACrB,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IACD,KAAK,EAAE,OAAO;IACd,CAAC,SAAS,GAAG;MACX,OAAO;MACP,IAAI,EAAG,OAAO,IAAK;QACjB,OAAO,GAAG,OAAO;QACjB,QAAQ,GAAG,IAAI,cAAc,CAAC,MAAM;UAClC,IAAI,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACxB,CAAC,CAAC;QACF,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC;MAC3B,CAAC;MACD,YAAY,EAAE,KAAK;MACnB,KAAK;MACL,QAAQ;MACR,OAAO,EAAG,OAAO,IAAK;QACpB;QACA;QACA;QACA,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,EAAE;UACtB,KAAK,CAAC,CAAC;UACP,MAAM,GAAG,SAAS;UAClB,OAAO,CAAC,KAAK,CAAC;UACd,MAAM,CAAC,KAAK,CAAC;QACf;QACA,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC;MACjC;IACF;EACF,CAAC;AACH;AAaA;AACA;AACA;AACA;AACA,OAAO,SAAS,YAAY,CAAI,KAA2B,EAAe;EACxE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;EACtC,IAAI,OAAwB;EAC5B,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;EAClC,MAAM,OAAO,GAAG,MAAM;IACpB,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ;IAC/B,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,OAAO,QAAQ;IACnD,yBACG,IAAI;MAAA,IAAC,IAAI;QAAA,OAAE,KAAK,CAAC,OAAO,CAAC,CAAC;MAAA;MAAE,KAAK;MAAA,UAC9B,MAAM,IAAK,QAAQ,CAAC,MAAM,CAAC,KAAK;IAAC;EAGzC,CAAC;EACD,mDAGQ,KAAK,CAAC,OAAO,CAAC,EAAE,uDAGR,KAAK,CAAC,KAAK,yCAEhB,KAAK,CAAC,KAAK,GAAG,8BAAqB,KAAK,CAAC,KAAK,SAAE,GAAG,mBAAmB,gDAClE,KAAK,CAAC,IAAI,IAAI,SAAS,0BAMjC,OAAO,CAAC,CAAC;AAGhB","ignoreList":[]}
@@ -15,8 +15,8 @@ var _tmpl$ = ["<p role=\"alert\">", "</p>"],
15
15
  import { clipboard } from "@k2b/stdlib/solid";
16
16
  import { createMemo, For, Match, Show, Switch } from "solid-js";
17
17
  import { Button, ButtonLink } from "../actions/Button";
18
- import { useUiMessages } from "../intl/messages";
19
18
  import { NoticeCard } from "../surfaces/NoticeCard";
19
+ import { useInstallMessages } from "./install-messages";
20
20
  /**
21
21
  * Opens `url` in Chrome on Android. Without Chrome, the browser loads `url` itself. Only an absolute http or https
22
22
  * address has an intent; anything else returns `undefined`.
@@ -41,7 +41,7 @@ const chromeIntent = url => {
41
41
  * the app package it builds. The host owns the surrounding surface, its heading, and dismissal.
42
42
  */
43
43
  export function InstallGuide(props) {
44
- const messages = useUiMessages();
44
+ const installMessages = useInstallMessages();
45
45
  // The host may hand over another state after mount, such as the browser's own in place of the server's view.
46
46
  const state = () => props.install;
47
47
  const copy = clipboard.createWriter({
@@ -50,7 +50,7 @@ export function InstallGuide(props) {
50
50
  const embedded = () => state().platform === "in-app" || state().platform === "apple-in-app";
51
51
  /** A browser that installs, but less reliably than the platform's own. */
52
52
  const hint = createMemo(() => {
53
- const t = messages();
53
+ const t = installMessages();
54
54
  if (state().platform === "apple-browser") return {
55
55
  title: t.installAppleBrowserTitle,
56
56
  detail: t.installAppleBrowserDetail
@@ -62,7 +62,7 @@ export function InstallGuide(props) {
62
62
  return undefined;
63
63
  });
64
64
  const steps = createMemo(() => {
65
- const t = messages();
65
+ const t = installMessages();
66
66
  if (state().platform === "apple-mobile" || state().platform === "apple-browser") return [{
67
67
  icon: "ti ti-share-2",
68
68
  title: t.installOpenShare,
@@ -100,7 +100,7 @@ export function InstallGuide(props) {
100
100
  return state().failed();
101
101
  },
102
102
  get children() {
103
- return _$ssr(_tmpl$, _$escape(messages().installFailed));
103
+ return _$ssr(_tmpl$, _$escape(installMessages().installFailed));
104
104
  }
105
105
  })), _$escape(_$createComponent(Switch, {
106
106
  get fallback() {
@@ -127,7 +127,7 @@ export function InstallGuide(props) {
127
127
  return state().platform === "apple-mobile";
128
128
  },
129
129
  get children() {
130
- return _$ssr(_tmpl$3, _$escape(messages().installSafariFallback));
130
+ return _$ssr(_tmpl$3, _$escape(installMessages().installSafariFallback));
131
131
  }
132
132
  }), _$createComponent(Show, {
133
133
  get when() {
@@ -141,7 +141,7 @@ export function InstallGuide(props) {
141
141
  return state().platform === "generic";
142
142
  },
143
143
  get children() {
144
- return _$ssr(_tmpl$3, _$escape(messages().installUnavailable));
144
+ return _$ssr(_tmpl$3, _$escape(installMessages().installUnavailable));
145
145
  }
146
146
  })];
147
147
  },
@@ -151,7 +151,7 @@ export function InstallGuide(props) {
151
151
  return state().requested();
152
152
  },
153
153
  get children() {
154
- return _$ssr(_tmpl$2, _$escape(messages().installRequested));
154
+ return _$ssr(_tmpl$2, _$escape(installMessages().installRequested));
155
155
  }
156
156
  }), _$createComponent(Match, {
157
157
  get when() {
@@ -161,10 +161,10 @@ export function InstallGuide(props) {
161
161
  return [_$createComponent(NoticeCard, {
162
162
  tone: "info",
163
163
  get title() {
164
- return messages().installSamsungTitle;
164
+ return installMessages().installSamsungTitle;
165
165
  },
166
166
  get detail() {
167
- return messages().installSamsungDetail({
167
+ return installMessages().installSamsungDetail({
168
168
  appName: props.appName
169
169
  });
170
170
  }
@@ -177,7 +177,7 @@ export function InstallGuide(props) {
177
177
  return href();
178
178
  },
179
179
  get children() {
180
- return [_$ssr(_tmpl$9), messages().installOpenChrome];
180
+ return [_$ssr(_tmpl$9), installMessages().installOpenChrome];
181
181
  }
182
182
  })
183
183
  }), _$createComponent(Show, {
@@ -194,7 +194,7 @@ export function InstallGuide(props) {
194
194
  return state().canPrompt() || state().busy();
195
195
  },
196
196
  get children() {
197
- return [_$ssr(_tmpl$3, _$escape(messages().installNative({
197
+ return [_$ssr(_tmpl$3, _$escape(installMessages().installNative({
198
198
  appName: props.appName
199
199
  }))), _$createComponent(Button, {
200
200
  get loading() {
@@ -202,7 +202,7 @@ export function InstallGuide(props) {
202
202
  },
203
203
  onClick: () => void state().install(),
204
204
  get children() {
205
- return messages().installApp;
205
+ return installMessages().installApp;
206
206
  }
207
207
  })];
208
208
  }
@@ -214,12 +214,12 @@ export function InstallGuide(props) {
214
214
  return [_$createComponent(NoticeCard, {
215
215
  tone: "warning",
216
216
  get title() {
217
- return _$memo(() => state().platform === "apple-in-app")() ? messages().installAppleInAppTitle : messages().installInAppTitle;
217
+ return _$memo(() => state().platform === "apple-in-app")() ? installMessages().installAppleInAppTitle : installMessages().installInAppTitle;
218
218
  },
219
219
  get detail() {
220
- return _$memo(() => state().platform === "apple-in-app")() ? messages().installAppleInAppDetail({
220
+ return _$memo(() => state().platform === "apple-in-app")() ? installMessages().installAppleInAppDetail({
221
221
  appName: props.appName
222
- }) : messages().installInAppDetail({
222
+ }) : installMessages().installInAppDetail({
223
223
  appName: props.appName
224
224
  });
225
225
  }
@@ -227,14 +227,14 @@ export function InstallGuide(props) {
227
227
  variant: "secondary",
228
228
  onClick: () => void copy.copy(props.url),
229
229
  get children() {
230
- return [_$ssr(_tmpl$4, _$ssrAttribute("class", copy.wasCopied() ? "ti ti-check" : "ti ti-copy", false)), copy.wasCopied() ? messages().installLinkCopied : messages().installCopyLink];
230
+ return [_$ssr(_tmpl$4, _$ssrAttribute("class", copy.wasCopied() ? "ti ti-check" : "ti ti-copy", false)), copy.wasCopied() ? installMessages().installLinkCopied : installMessages().installCopyLink];
231
231
  }
232
232
  }), _$createComponent(Show, {
233
233
  get when() {
234
234
  return copy.error();
235
235
  },
236
236
  get children() {
237
- return [_$ssr(_tmpl$, _$escape(messages().installCopyFailed)), _$ssr(_tmpl$5, _$escape(props.url))];
237
+ return [_$ssr(_tmpl$, _$escape(installMessages().installCopyFailed)), _$ssr(_tmpl$5, _$escape(props.url))];
238
238
  }
239
239
  }), _$createComponent(Show, {
240
240
  get when() {