@k2b/ui 0.21.0 → 0.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (610) hide show
  1. package/dist/browser/actions/ContextMenu.js +3 -1
  2. package/dist/browser/actions/ContextMenu.js.map +1 -1
  3. package/dist/browser/actions/FilterChip.js +3 -1
  4. package/dist/browser/actions/FilterChip.js.map +1 -1
  5. package/dist/browser/actions/SpotlightSearch.js +3 -1
  6. package/dist/browser/actions/SpotlightSearch.js.map +1 -1
  7. package/dist/browser/actions/filter-messages.js +20 -0
  8. package/dist/browser/actions/filter-messages.js.map +1 -0
  9. package/dist/browser/actions/spotlight-messages.js +16 -0
  10. package/dist/browser/actions/spotlight-messages.js.map +1 -0
  11. package/dist/browser/chat/ChatComposer.js +47 -41
  12. package/dist/browser/chat/ChatComposer.js.map +1 -1
  13. package/dist/browser/chat/ChatPrimitives.js +25 -23
  14. package/dist/browser/chat/ChatPrimitives.js.map +1 -1
  15. package/dist/browser/chat/ChatRoot.js +3 -3
  16. package/dist/browser/chat/ChatRoot.js.map +1 -1
  17. package/dist/browser/chat/ChatTimeline.js +12 -12
  18. package/dist/browser/chat/ChatTimeline.js.map +1 -1
  19. package/dist/browser/chat/chat-messages.js +236 -0
  20. package/dist/browser/chat/chat-messages.js.map +1 -0
  21. package/dist/browser/content/Calendar.js +1096 -1060
  22. package/dist/browser/content/Calendar.js.map +1 -1
  23. package/dist/browser/content/CalendarDayView.js +1187 -0
  24. package/dist/browser/content/CalendarDayView.js.map +1 -0
  25. package/dist/browser/content/CalendarWeekView.js +1571 -0
  26. package/dist/browser/content/CalendarWeekView.js.map +1 -0
  27. package/dist/browser/content/Chart.js +15 -8
  28. package/dist/browser/content/Chart.js.map +1 -1
  29. package/dist/browser/content/ChartExplorer.js +185 -85
  30. package/dist/browser/content/ChartExplorer.js.map +1 -1
  31. package/dist/browser/content/ChartExplorerControls.js +9 -7
  32. package/dist/browser/content/ChartExplorerControls.js.map +1 -1
  33. package/dist/browser/content/ChartFilterControls.js +93 -34
  34. package/dist/browser/content/ChartFilterControls.js.map +1 -1
  35. package/dist/browser/content/ChartSnapshotView.js +3 -3
  36. package/dist/browser/content/ChartSnapshotView.js.map +1 -1
  37. package/dist/browser/content/DataTable.js +238 -201
  38. package/dist/browser/content/DataTable.js.map +1 -1
  39. package/dist/browser/content/Docs.js +3 -1
  40. package/dist/browser/content/Docs.js.map +1 -1
  41. package/dist/browser/content/FileBrowser.js +30 -26
  42. package/dist/browser/content/FileBrowser.js.map +1 -1
  43. package/dist/browser/content/FileTree.js +9 -7
  44. package/dist/browser/content/FileTree.js.map +1 -1
  45. package/dist/browser/content/FileView.js +37 -28
  46. package/dist/browser/content/FileView.js.map +1 -1
  47. package/dist/browser/content/Lightbox.js +9 -7
  48. package/dist/browser/content/Lightbox.js.map +1 -1
  49. package/dist/browser/content/LogEntriesTable.js +3 -3
  50. package/dist/browser/content/LogEntriesTable.js.map +1 -1
  51. package/dist/browser/content/MessageRow.js +24 -22
  52. package/dist/browser/content/MessageRow.js.map +1 -1
  53. package/dist/browser/content/Pagination.js +7 -7
  54. package/dist/browser/content/Pagination.js.map +1 -1
  55. package/dist/browser/content/PdfPreview.js +15 -13
  56. package/dist/browser/content/PdfPreview.js.map +1 -1
  57. package/dist/browser/content/RangePicker.js +3 -1
  58. package/dist/browser/content/RangePicker.js.map +1 -1
  59. package/dist/browser/content/StructuredDataPreview.js +3 -1
  60. package/dist/browser/content/StructuredDataPreview.js.map +1 -1
  61. package/dist/browser/content/Timeline.js +13 -11
  62. package/dist/browser/content/Timeline.js.map +1 -1
  63. package/dist/browser/content/VideoPlayer.js +5 -5
  64. package/dist/browser/content/VideoPlayer.js.map +1 -1
  65. package/dist/browser/content/VirtualFeed.js +6 -4
  66. package/dist/browser/content/VirtualFeed.js.map +1 -1
  67. package/dist/browser/content/ZoomPanViewport.js +10 -7
  68. package/dist/browser/content/ZoomPanViewport.js.map +1 -1
  69. package/dist/browser/content/calendar-day-scroll.js +98 -0
  70. package/dist/browser/content/calendar-day-scroll.js.map +1 -0
  71. package/dist/browser/content/calendar-days.js +408 -0
  72. package/dist/browser/content/calendar-days.js.map +1 -0
  73. package/dist/browser/content/calendar-dialogs.js +236 -0
  74. package/dist/browser/content/calendar-dialogs.js.map +1 -0
  75. package/dist/browser/content/calendar-messages.js +249 -3
  76. package/dist/browser/content/calendar-messages.js.map +1 -1
  77. package/dist/browser/content/calendar-pointer.js +19 -6
  78. package/dist/browser/content/calendar-pointer.js.map +1 -1
  79. package/dist/browser/content/calendar-shared.js +328 -0
  80. package/dist/browser/content/calendar-shared.js.map +1 -0
  81. package/dist/browser/content/calendar-time-view.js +1649 -0
  82. package/dist/browser/content/calendar-time-view.js.map +1 -0
  83. package/dist/browser/content/chart-messages.js +146 -0
  84. package/dist/browser/content/chart-messages.js.map +1 -0
  85. package/dist/browser/content/collection-selection.js +2 -0
  86. package/dist/browser/content/collection-selection.js.map +1 -1
  87. package/dist/browser/content/data-table-messages.js +24 -0
  88. package/dist/browser/content/data-table-messages.js.map +1 -0
  89. package/dist/browser/content/docs-messages.js +24 -0
  90. package/dist/browser/content/docs-messages.js.map +1 -0
  91. package/dist/browser/content/feed-messages.js +34 -0
  92. package/dist/browser/content/feed-messages.js.map +1 -0
  93. package/dist/browser/content/file-browser-messages.js +69 -0
  94. package/dist/browser/content/file-browser-messages.js.map +1 -0
  95. package/dist/browser/content/file-view-messages.js +64 -0
  96. package/dist/browser/content/file-view-messages.js.map +1 -0
  97. package/dist/browser/content/index.js.map +1 -1
  98. package/dist/browser/content/lightbox-messages.js +36 -0
  99. package/dist/browser/content/lightbox-messages.js.map +1 -0
  100. package/dist/browser/content/log-entries-messages.js +20 -0
  101. package/dist/browser/content/log-entries-messages.js.map +1 -0
  102. package/dist/browser/content/markdown-info-block-messages.js +24 -0
  103. package/dist/browser/content/markdown-info-block-messages.js.map +1 -0
  104. package/dist/browser/content/markdown-info-blocks.js +3 -3
  105. package/dist/browser/content/markdown-info-blocks.js.map +1 -1
  106. package/dist/browser/content/markdown-links.js +2 -2
  107. package/dist/browser/content/markdown-links.js.map +1 -1
  108. package/dist/browser/content/markdown-reference-messages.js +30 -0
  109. package/dist/browser/content/markdown-reference-messages.js.map +1 -0
  110. package/dist/browser/content/pagination-messages.js +38 -0
  111. package/dist/browser/content/pagination-messages.js.map +1 -0
  112. package/dist/browser/content/pdf-messages.js +43 -0
  113. package/dist/browser/content/pdf-messages.js.map +1 -0
  114. package/dist/browser/content/range-picker-messages.js +20 -0
  115. package/dist/browser/content/range-picker-messages.js.map +1 -0
  116. package/dist/browser/content/structured-data-messages.js +22 -0
  117. package/dist/browser/content/structured-data-messages.js.map +1 -0
  118. package/dist/browser/content/timeline-messages.js +62 -0
  119. package/dist/browser/content/timeline-messages.js.map +1 -0
  120. package/dist/browser/content/video-messages.js +24 -0
  121. package/dist/browser/content/video-messages.js.map +1 -0
  122. package/dist/browser/content/viewport-messages.js +28 -0
  123. package/dist/browser/content/viewport-messages.js.map +1 -0
  124. package/dist/browser/feedback/HoverPreview.js +34 -6
  125. package/dist/browser/feedback/HoverPreview.js.map +1 -1
  126. package/dist/browser/feedback/InstallGuide.js +18 -18
  127. package/dist/browser/feedback/InstallGuide.js.map +1 -1
  128. package/dist/browser/feedback/install-messages.js +104 -0
  129. package/dist/browser/feedback/install-messages.js.map +1 -0
  130. package/dist/browser/feedback/prompt-messages.js +65 -0
  131. package/dist/browser/feedback/prompt-messages.js.map +1 -0
  132. package/dist/browser/feedback/prompts.js +14 -11
  133. package/dist/browser/feedback/prompts.js.map +1 -1
  134. package/dist/browser/feedback/toast-messages.js +18 -0
  135. package/dist/browser/feedback/toast-messages.js.map +1 -0
  136. package/dist/browser/feedback/toast.js +4 -3
  137. package/dist/browser/feedback/toast.js.map +1 -1
  138. package/dist/browser/index.js +1 -1
  139. package/dist/browser/index.js.map +1 -1
  140. package/dist/browser/inputs/AutocompleteEditor.js +6 -4
  141. package/dist/browser/inputs/AutocompleteEditor.js.map +1 -1
  142. package/dist/browser/inputs/AutocompleteSelect.js +10 -8
  143. package/dist/browser/inputs/AutocompleteSelect.js.map +1 -1
  144. package/dist/browser/inputs/ChoiceGroups.js +4 -0
  145. package/dist/browser/inputs/ChoiceGroups.js.map +1 -1
  146. package/dist/browser/inputs/ChoiceInputs.js +5 -5
  147. package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
  148. package/dist/browser/inputs/Combobox.js +3 -2
  149. package/dist/browser/inputs/Combobox.js.map +1 -1
  150. package/dist/browser/inputs/FileDropTarget.js +6 -6
  151. package/dist/browser/inputs/FileDropTarget.js.map +1 -1
  152. package/dist/browser/inputs/FileInputs.js +30 -21
  153. package/dist/browser/inputs/FileInputs.js.map +1 -1
  154. package/dist/browser/inputs/MultiSelectInput.js +7 -5
  155. package/dist/browser/inputs/MultiSelectInput.js.map +1 -1
  156. package/dist/browser/inputs/NumberInput.js +4 -2
  157. package/dist/browser/inputs/NumberInput.js.map +1 -1
  158. package/dist/browser/inputs/QrScanner.js +5 -5
  159. package/dist/browser/inputs/QrScanner.js.map +1 -1
  160. package/dist/browser/inputs/Select.js +7 -5
  161. package/dist/browser/inputs/Select.js.map +1 -1
  162. package/dist/browser/inputs/SelectChip.js +3 -3
  163. package/dist/browser/inputs/SelectChip.js.map +1 -1
  164. package/dist/browser/inputs/SignatureInput.js +9 -3
  165. package/dist/browser/inputs/SignatureInput.js.map +1 -1
  166. package/dist/browser/inputs/SpecialInputs.js +4 -2
  167. package/dist/browser/inputs/SpecialInputs.js.map +1 -1
  168. package/dist/browser/inputs/TagEditor.js +8 -6
  169. package/dist/browser/inputs/TagEditor.js.map +1 -1
  170. package/dist/browser/inputs/TagsInput.js +5 -5
  171. package/dist/browser/inputs/TagsInput.js.map +1 -1
  172. package/dist/browser/inputs/TemplateEditor.js +5 -5
  173. package/dist/browser/inputs/TemplateEditor.js.map +1 -1
  174. package/dist/browser/inputs/TextInput.js +3 -1
  175. package/dist/browser/inputs/TextInput.js.map +1 -1
  176. package/dist/browser/inputs/completion-messages.js +24 -0
  177. package/dist/browser/inputs/completion-messages.js.map +1 -0
  178. package/dist/browser/inputs/file-drop-messages.js +63 -0
  179. package/dist/browser/inputs/file-drop-messages.js.map +1 -0
  180. package/dist/browser/inputs/file-drop.js.map +1 -1
  181. package/dist/browser/inputs/file-input-messages.js +60 -0
  182. package/dist/browser/inputs/file-input-messages.js.map +1 -0
  183. package/dist/browser/inputs/icon-messages.js +22 -0
  184. package/dist/browser/inputs/icon-messages.js.map +1 -0
  185. package/dist/browser/inputs/input-messages.js +38 -0
  186. package/dist/browser/inputs/input-messages.js.map +1 -0
  187. package/dist/browser/inputs/markdown/MarkdownEditor.js +10 -6
  188. package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
  189. package/dist/browser/inputs/markdown/Toolbar.js +13 -13
  190. package/dist/browser/inputs/markdown/Toolbar.js.map +1 -1
  191. package/dist/browser/inputs/markdown/editor-messages.js +43 -0
  192. package/dist/browser/inputs/markdown/editor-messages.js.map +1 -0
  193. package/dist/browser/inputs/markdown/toolbar-messages.js +40 -0
  194. package/dist/browser/inputs/markdown/toolbar-messages.js.map +1 -0
  195. package/dist/browser/inputs/qr-messages.js +26 -0
  196. package/dist/browser/inputs/qr-messages.js.map +1 -0
  197. package/dist/browser/inputs/select-messages.js +63 -0
  198. package/dist/browser/inputs/select-messages.js.map +1 -0
  199. package/dist/browser/inputs/tag-messages.js +44 -0
  200. package/dist/browser/inputs/tag-messages.js.map +1 -0
  201. package/dist/browser/inputs/template-messages.js +22 -0
  202. package/dist/browser/inputs/template-messages.js.map +1 -0
  203. package/dist/browser/internal/render-error-messages.js +20 -0
  204. package/dist/browser/internal/render-error-messages.js.map +1 -0
  205. package/dist/browser/internal/render-error.js +3 -1
  206. package/dist/browser/internal/render-error.js.map +1 -1
  207. package/dist/browser/internal/text-selection.js +101 -0
  208. package/dist/browser/internal/text-selection.js.map +1 -0
  209. package/dist/browser/intl/messages.js +6 -1155
  210. package/dist/browser/intl/messages.js.map +1 -1
  211. package/dist/browser/layout/AppWorkspace.js +594 -425
  212. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  213. package/dist/browser/layout/BottomSheet.js +6 -1
  214. package/dist/browser/layout/BottomSheet.js.map +1 -1
  215. package/dist/browser/layout/Discussion.js +8 -5
  216. package/dist/browser/layout/Discussion.js.map +1 -1
  217. package/dist/browser/layout/FloatingWindow.js +8 -5
  218. package/dist/browser/layout/FloatingWindow.js.map +1 -1
  219. package/dist/browser/layout/Navigation.js +7 -6
  220. package/dist/browser/layout/Navigation.js.map +1 -1
  221. package/dist/browser/layout/PageTitle.js +373 -0
  222. package/dist/browser/layout/PageTitle.js.map +1 -0
  223. package/dist/browser/layout/PanelDialog.js +8 -6
  224. package/dist/browser/layout/PanelDialog.js.map +1 -1
  225. package/dist/browser/layout/Panes.js +23 -15
  226. package/dist/browser/layout/Panes.js.map +1 -1
  227. package/dist/browser/layout/PullToRefresh.js +13 -4
  228. package/dist/browser/layout/PullToRefresh.js.map +1 -1
  229. package/dist/browser/layout/Settings.js +14 -12
  230. package/dist/browser/layout/Settings.js.map +1 -1
  231. package/dist/browser/layout/SettingsCollection.js +6 -5
  232. package/dist/browser/layout/SettingsCollection.js.map +1 -1
  233. package/dist/browser/layout/SettingsModal.js +3 -1
  234. package/dist/browser/layout/SettingsModal.js.map +1 -1
  235. package/dist/browser/layout/app-workspace-controller.js +821 -12
  236. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  237. package/dist/browser/layout/app-workspace-state.js +3 -2
  238. package/dist/browser/layout/app-workspace-state.js.map +1 -1
  239. package/dist/browser/layout/floating-window-messages.js +28 -0
  240. package/dist/browser/layout/floating-window-messages.js.map +1 -0
  241. package/dist/browser/layout/index.js +2 -0
  242. package/dist/browser/layout/index.js.map +1 -1
  243. package/dist/browser/layout/navigation-model.js.map +1 -1
  244. package/dist/browser/layout/page-title-controller.js +169 -0
  245. package/dist/browser/layout/page-title-controller.js.map +1 -0
  246. package/dist/browser/layout/panel-dialog-messages.js +20 -0
  247. package/dist/browser/layout/panel-dialog-messages.js.map +1 -0
  248. package/dist/browser/layout/panes-messages.js +48 -0
  249. package/dist/browser/layout/panes-messages.js.map +1 -0
  250. package/dist/browser/layout/refresh-messages.js +20 -0
  251. package/dist/browser/layout/refresh-messages.js.map +1 -0
  252. package/dist/browser/layout/settings-messages.js +54 -0
  253. package/dist/browser/layout/settings-messages.js.map +1 -0
  254. package/dist/browser/layout/workspace-messages.js +56 -0
  255. package/dist/browser/layout/workspace-messages.js.map +1 -0
  256. package/dist/browser/surfaces/Avatar.js +5 -5
  257. package/dist/browser/surfaces/Avatar.js.map +1 -1
  258. package/dist/browser/surfaces/ResourceCard.js +4 -2
  259. package/dist/browser/surfaces/ResourceCard.js.map +1 -1
  260. package/dist/browser/surfaces/StatCell.js +18 -6
  261. package/dist/browser/surfaces/StatCell.js.map +1 -1
  262. package/dist/browser/surfaces/Tag.js +3 -3
  263. package/dist/browser/surfaces/Tag.js.map +1 -1
  264. package/dist/browser/surfaces/avatar-messages.js +26 -0
  265. package/dist/browser/surfaces/avatar-messages.js.map +1 -0
  266. package/dist/browser/surfaces/resource-messages.js +26 -0
  267. package/dist/browser/surfaces/resource-messages.js.map +1 -0
  268. package/dist/browser/widgets/Widget.js +6 -0
  269. package/dist/browser/widgets/Widget.js.map +1 -1
  270. package/dist/ssr/actions/ContextMenu.js.map +1 -1
  271. package/dist/ssr/actions/FilterChip.js +3 -1
  272. package/dist/ssr/actions/FilterChip.js.map +1 -1
  273. package/dist/ssr/actions/SpotlightSearch.js +3 -1
  274. package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
  275. package/dist/ssr/actions/filter-messages.js +20 -0
  276. package/dist/ssr/actions/filter-messages.js.map +1 -0
  277. package/dist/ssr/actions/spotlight-messages.js +16 -0
  278. package/dist/ssr/actions/spotlight-messages.js.map +1 -0
  279. package/dist/ssr/chat/ChatComposer.js +47 -41
  280. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  281. package/dist/ssr/chat/ChatPrimitives.js +23 -21
  282. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  283. package/dist/ssr/chat/ChatRoot.js +3 -3
  284. package/dist/ssr/chat/ChatRoot.js.map +1 -1
  285. package/dist/ssr/chat/ChatTimeline.js +11 -11
  286. package/dist/ssr/chat/ChatTimeline.js.map +1 -1
  287. package/dist/ssr/chat/chat-messages.js +236 -0
  288. package/dist/ssr/chat/chat-messages.js.map +1 -0
  289. package/dist/ssr/content/Calendar.js +534 -346
  290. package/dist/ssr/content/Calendar.js.map +1 -1
  291. package/dist/ssr/content/CalendarDayView.js +800 -0
  292. package/dist/ssr/content/CalendarDayView.js.map +1 -0
  293. package/dist/ssr/content/CalendarWeekView.js +1069 -0
  294. package/dist/ssr/content/CalendarWeekView.js.map +1 -0
  295. package/dist/ssr/content/Chart.js +12 -5
  296. package/dist/ssr/content/Chart.js.map +1 -1
  297. package/dist/ssr/content/ChartExplorer.js +98 -37
  298. package/dist/ssr/content/ChartExplorer.js.map +1 -1
  299. package/dist/ssr/content/ChartExplorerControls.js +9 -7
  300. package/dist/ssr/content/ChartExplorerControls.js.map +1 -1
  301. package/dist/ssr/content/ChartFilterControls.js +52 -8
  302. package/dist/ssr/content/ChartFilterControls.js.map +1 -1
  303. package/dist/ssr/content/ChartSnapshotView.js +3 -3
  304. package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
  305. package/dist/ssr/content/DataTable.js +77 -53
  306. package/dist/ssr/content/DataTable.js.map +1 -1
  307. package/dist/ssr/content/Docs.js +3 -1
  308. package/dist/ssr/content/Docs.js.map +1 -1
  309. package/dist/ssr/content/FileBrowser.js +30 -26
  310. package/dist/ssr/content/FileBrowser.js.map +1 -1
  311. package/dist/ssr/content/FileTree.js +9 -7
  312. package/dist/ssr/content/FileTree.js.map +1 -1
  313. package/dist/ssr/content/FileView.js +37 -28
  314. package/dist/ssr/content/FileView.js.map +1 -1
  315. package/dist/ssr/content/Lightbox.js +8 -6
  316. package/dist/ssr/content/Lightbox.js.map +1 -1
  317. package/dist/ssr/content/LogEntriesTable.js +3 -3
  318. package/dist/ssr/content/LogEntriesTable.js.map +1 -1
  319. package/dist/ssr/content/MessageRow.js +24 -22
  320. package/dist/ssr/content/MessageRow.js.map +1 -1
  321. package/dist/ssr/content/Pagination.js +6 -6
  322. package/dist/ssr/content/Pagination.js.map +1 -1
  323. package/dist/ssr/content/PdfPreview.js +15 -13
  324. package/dist/ssr/content/PdfPreview.js.map +1 -1
  325. package/dist/ssr/content/RangePicker.js +3 -1
  326. package/dist/ssr/content/RangePicker.js.map +1 -1
  327. package/dist/ssr/content/StructuredDataPreview.js +3 -1
  328. package/dist/ssr/content/StructuredDataPreview.js.map +1 -1
  329. package/dist/ssr/content/Timeline.js +13 -11
  330. package/dist/ssr/content/Timeline.js.map +1 -1
  331. package/dist/ssr/content/VideoPlayer.js +5 -5
  332. package/dist/ssr/content/VideoPlayer.js.map +1 -1
  333. package/dist/ssr/content/VirtualFeed.js +6 -4
  334. package/dist/ssr/content/VirtualFeed.js.map +1 -1
  335. package/dist/ssr/content/ZoomPanViewport.js +7 -4
  336. package/dist/ssr/content/ZoomPanViewport.js.map +1 -1
  337. package/dist/ssr/content/calendar-day-scroll.js +98 -0
  338. package/dist/ssr/content/calendar-day-scroll.js.map +1 -0
  339. package/dist/ssr/content/calendar-days.js +408 -0
  340. package/dist/ssr/content/calendar-days.js.map +1 -0
  341. package/dist/ssr/content/calendar-dialogs.js +159 -0
  342. package/dist/ssr/content/calendar-dialogs.js.map +1 -0
  343. package/dist/ssr/content/calendar-messages.js +249 -3
  344. package/dist/ssr/content/calendar-messages.js.map +1 -1
  345. package/dist/ssr/content/calendar-pointer.js +19 -6
  346. package/dist/ssr/content/calendar-pointer.js.map +1 -1
  347. package/dist/ssr/content/calendar-shared.js +261 -0
  348. package/dist/ssr/content/calendar-shared.js.map +1 -0
  349. package/dist/ssr/content/calendar-time-view.js +1306 -0
  350. package/dist/ssr/content/calendar-time-view.js.map +1 -0
  351. package/dist/ssr/content/chart-messages.js +146 -0
  352. package/dist/ssr/content/chart-messages.js.map +1 -0
  353. package/dist/ssr/content/collection-selection.js +2 -0
  354. package/dist/ssr/content/collection-selection.js.map +1 -1
  355. package/dist/ssr/content/data-table-messages.js +24 -0
  356. package/dist/ssr/content/data-table-messages.js.map +1 -0
  357. package/dist/ssr/content/docs-messages.js +24 -0
  358. package/dist/ssr/content/docs-messages.js.map +1 -0
  359. package/dist/ssr/content/feed-messages.js +34 -0
  360. package/dist/ssr/content/feed-messages.js.map +1 -0
  361. package/dist/ssr/content/file-browser-messages.js +69 -0
  362. package/dist/ssr/content/file-browser-messages.js.map +1 -0
  363. package/dist/ssr/content/file-view-messages.js +64 -0
  364. package/dist/ssr/content/file-view-messages.js.map +1 -0
  365. package/dist/ssr/content/index.js.map +1 -1
  366. package/dist/ssr/content/lightbox-messages.js +36 -0
  367. package/dist/ssr/content/lightbox-messages.js.map +1 -0
  368. package/dist/ssr/content/log-entries-messages.js +20 -0
  369. package/dist/ssr/content/log-entries-messages.js.map +1 -0
  370. package/dist/ssr/content/markdown-info-block-messages.js +24 -0
  371. package/dist/ssr/content/markdown-info-block-messages.js.map +1 -0
  372. package/dist/ssr/content/markdown-info-blocks.js +3 -3
  373. package/dist/ssr/content/markdown-info-blocks.js.map +1 -1
  374. package/dist/ssr/content/markdown-links.js +2 -2
  375. package/dist/ssr/content/markdown-links.js.map +1 -1
  376. package/dist/ssr/content/markdown-reference-messages.js +30 -0
  377. package/dist/ssr/content/markdown-reference-messages.js.map +1 -0
  378. package/dist/ssr/content/pagination-messages.js +38 -0
  379. package/dist/ssr/content/pagination-messages.js.map +1 -0
  380. package/dist/ssr/content/pdf-messages.js +43 -0
  381. package/dist/ssr/content/pdf-messages.js.map +1 -0
  382. package/dist/ssr/content/range-picker-messages.js +20 -0
  383. package/dist/ssr/content/range-picker-messages.js.map +1 -0
  384. package/dist/ssr/content/structured-data-messages.js +22 -0
  385. package/dist/ssr/content/structured-data-messages.js.map +1 -0
  386. package/dist/ssr/content/timeline-messages.js +62 -0
  387. package/dist/ssr/content/timeline-messages.js.map +1 -0
  388. package/dist/ssr/content/video-messages.js +24 -0
  389. package/dist/ssr/content/video-messages.js.map +1 -0
  390. package/dist/ssr/content/viewport-messages.js +28 -0
  391. package/dist/ssr/content/viewport-messages.js.map +1 -0
  392. package/dist/ssr/feedback/HoverPreview.js +34 -6
  393. package/dist/ssr/feedback/HoverPreview.js.map +1 -1
  394. package/dist/ssr/feedback/InstallGuide.js +18 -18
  395. package/dist/ssr/feedback/InstallGuide.js.map +1 -1
  396. package/dist/ssr/feedback/install-messages.js +104 -0
  397. package/dist/ssr/feedback/install-messages.js.map +1 -0
  398. package/dist/ssr/feedback/prompt-messages.js +65 -0
  399. package/dist/ssr/feedback/prompt-messages.js.map +1 -0
  400. package/dist/ssr/feedback/prompts.js +14 -11
  401. package/dist/ssr/feedback/prompts.js.map +1 -1
  402. package/dist/ssr/feedback/toast-messages.js +18 -0
  403. package/dist/ssr/feedback/toast-messages.js.map +1 -0
  404. package/dist/ssr/feedback/toast.js +4 -3
  405. package/dist/ssr/feedback/toast.js.map +1 -1
  406. package/dist/ssr/index.js +1 -1
  407. package/dist/ssr/index.js.map +1 -1
  408. package/dist/ssr/inputs/AutocompleteEditor.js +5 -3
  409. package/dist/ssr/inputs/AutocompleteEditor.js.map +1 -1
  410. package/dist/ssr/inputs/AutocompleteSelect.js +10 -8
  411. package/dist/ssr/inputs/AutocompleteSelect.js.map +1 -1
  412. package/dist/ssr/inputs/ChoiceGroups.js +4 -0
  413. package/dist/ssr/inputs/ChoiceGroups.js.map +1 -1
  414. package/dist/ssr/inputs/ChoiceInputs.js +5 -5
  415. package/dist/ssr/inputs/ChoiceInputs.js.map +1 -1
  416. package/dist/ssr/inputs/Combobox.js +3 -1
  417. package/dist/ssr/inputs/Combobox.js.map +1 -1
  418. package/dist/ssr/inputs/FileDropTarget.js +6 -6
  419. package/dist/ssr/inputs/FileDropTarget.js.map +1 -1
  420. package/dist/ssr/inputs/FileInputs.js +29 -20
  421. package/dist/ssr/inputs/FileInputs.js.map +1 -1
  422. package/dist/ssr/inputs/MultiSelectInput.js +7 -5
  423. package/dist/ssr/inputs/MultiSelectInput.js.map +1 -1
  424. package/dist/ssr/inputs/NumberInput.js +4 -2
  425. package/dist/ssr/inputs/NumberInput.js.map +1 -1
  426. package/dist/ssr/inputs/QrScanner.js +4 -4
  427. package/dist/ssr/inputs/QrScanner.js.map +1 -1
  428. package/dist/ssr/inputs/Select.js +7 -5
  429. package/dist/ssr/inputs/Select.js.map +1 -1
  430. package/dist/ssr/inputs/SelectChip.js +3 -3
  431. package/dist/ssr/inputs/SelectChip.js.map +1 -1
  432. package/dist/ssr/inputs/SignatureInput.js +9 -3
  433. package/dist/ssr/inputs/SignatureInput.js.map +1 -1
  434. package/dist/ssr/inputs/SpecialInputs.js +4 -2
  435. package/dist/ssr/inputs/SpecialInputs.js.map +1 -1
  436. package/dist/ssr/inputs/TagEditor.js +8 -6
  437. package/dist/ssr/inputs/TagEditor.js.map +1 -1
  438. package/dist/ssr/inputs/TagsInput.js +5 -5
  439. package/dist/ssr/inputs/TagsInput.js.map +1 -1
  440. package/dist/ssr/inputs/TemplateEditor.js +5 -5
  441. package/dist/ssr/inputs/TemplateEditor.js.map +1 -1
  442. package/dist/ssr/inputs/TextInput.js +3 -1
  443. package/dist/ssr/inputs/TextInput.js.map +1 -1
  444. package/dist/ssr/inputs/completion-messages.js +24 -0
  445. package/dist/ssr/inputs/completion-messages.js.map +1 -0
  446. package/dist/ssr/inputs/file-drop-messages.js +63 -0
  447. package/dist/ssr/inputs/file-drop-messages.js.map +1 -0
  448. package/dist/ssr/inputs/file-drop.js.map +1 -1
  449. package/dist/ssr/inputs/file-input-messages.js +60 -0
  450. package/dist/ssr/inputs/file-input-messages.js.map +1 -0
  451. package/dist/ssr/inputs/icon-messages.js +22 -0
  452. package/dist/ssr/inputs/icon-messages.js.map +1 -0
  453. package/dist/ssr/inputs/input-messages.js +38 -0
  454. package/dist/ssr/inputs/input-messages.js.map +1 -0
  455. package/dist/ssr/inputs/markdown/MarkdownEditor.js +9 -5
  456. package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
  457. package/dist/ssr/inputs/markdown/Toolbar.js +13 -13
  458. package/dist/ssr/inputs/markdown/Toolbar.js.map +1 -1
  459. package/dist/ssr/inputs/markdown/editor-messages.js +43 -0
  460. package/dist/ssr/inputs/markdown/editor-messages.js.map +1 -0
  461. package/dist/ssr/inputs/markdown/toolbar-messages.js +40 -0
  462. package/dist/ssr/inputs/markdown/toolbar-messages.js.map +1 -0
  463. package/dist/ssr/inputs/qr-messages.js +26 -0
  464. package/dist/ssr/inputs/qr-messages.js.map +1 -0
  465. package/dist/ssr/inputs/select-messages.js +63 -0
  466. package/dist/ssr/inputs/select-messages.js.map +1 -0
  467. package/dist/ssr/inputs/tag-messages.js +44 -0
  468. package/dist/ssr/inputs/tag-messages.js.map +1 -0
  469. package/dist/ssr/inputs/template-messages.js +22 -0
  470. package/dist/ssr/inputs/template-messages.js.map +1 -0
  471. package/dist/ssr/internal/render-error-messages.js +20 -0
  472. package/dist/ssr/internal/render-error-messages.js.map +1 -0
  473. package/dist/ssr/internal/render-error.js +3 -1
  474. package/dist/ssr/internal/render-error.js.map +1 -1
  475. package/dist/ssr/internal/text-selection.js +101 -0
  476. package/dist/ssr/internal/text-selection.js.map +1 -0
  477. package/dist/ssr/intl/messages.js +6 -1155
  478. package/dist/ssr/intl/messages.js.map +1 -1
  479. package/dist/ssr/layout/AppWorkspace.js +219 -103
  480. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  481. package/dist/ssr/layout/BottomSheet.js +1 -0
  482. package/dist/ssr/layout/BottomSheet.js.map +1 -1
  483. package/dist/ssr/layout/Discussion.js +8 -5
  484. package/dist/ssr/layout/Discussion.js.map +1 -1
  485. package/dist/ssr/layout/FloatingWindow.js +8 -5
  486. package/dist/ssr/layout/FloatingWindow.js.map +1 -1
  487. package/dist/ssr/layout/Navigation.js +6 -5
  488. package/dist/ssr/layout/Navigation.js.map +1 -1
  489. package/dist/ssr/layout/PageTitle.js +256 -0
  490. package/dist/ssr/layout/PageTitle.js.map +1 -0
  491. package/dist/ssr/layout/PanelDialog.js +8 -6
  492. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  493. package/dist/ssr/layout/Panes.js +22 -14
  494. package/dist/ssr/layout/Panes.js.map +1 -1
  495. package/dist/ssr/layout/PullToRefresh.js +13 -4
  496. package/dist/ssr/layout/PullToRefresh.js.map +1 -1
  497. package/dist/ssr/layout/Settings.js +14 -12
  498. package/dist/ssr/layout/Settings.js.map +1 -1
  499. package/dist/ssr/layout/SettingsCollection.js +6 -5
  500. package/dist/ssr/layout/SettingsCollection.js.map +1 -1
  501. package/dist/ssr/layout/SettingsModal.js +3 -1
  502. package/dist/ssr/layout/SettingsModal.js.map +1 -1
  503. package/dist/ssr/layout/app-workspace-controller.js +821 -12
  504. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  505. package/dist/ssr/layout/app-workspace-state.js +3 -2
  506. package/dist/ssr/layout/app-workspace-state.js.map +1 -1
  507. package/dist/ssr/layout/floating-window-messages.js +28 -0
  508. package/dist/ssr/layout/floating-window-messages.js.map +1 -0
  509. package/dist/ssr/layout/index.js +2 -0
  510. package/dist/ssr/layout/index.js.map +1 -1
  511. package/dist/ssr/layout/navigation-model.js.map +1 -1
  512. package/dist/ssr/layout/page-title-controller.js +169 -0
  513. package/dist/ssr/layout/page-title-controller.js.map +1 -0
  514. package/dist/ssr/layout/panel-dialog-messages.js +20 -0
  515. package/dist/ssr/layout/panel-dialog-messages.js.map +1 -0
  516. package/dist/ssr/layout/panes-messages.js +48 -0
  517. package/dist/ssr/layout/panes-messages.js.map +1 -0
  518. package/dist/ssr/layout/refresh-messages.js +20 -0
  519. package/dist/ssr/layout/refresh-messages.js.map +1 -0
  520. package/dist/ssr/layout/settings-messages.js +54 -0
  521. package/dist/ssr/layout/settings-messages.js.map +1 -0
  522. package/dist/ssr/layout/workspace-messages.js +56 -0
  523. package/dist/ssr/layout/workspace-messages.js.map +1 -0
  524. package/dist/ssr/surfaces/Avatar.js +5 -5
  525. package/dist/ssr/surfaces/Avatar.js.map +1 -1
  526. package/dist/ssr/surfaces/ResourceCard.js +4 -2
  527. package/dist/ssr/surfaces/ResourceCard.js.map +1 -1
  528. package/dist/ssr/surfaces/StatCell.js +2 -2
  529. package/dist/ssr/surfaces/StatCell.js.map +1 -1
  530. package/dist/ssr/surfaces/Tag.js +3 -3
  531. package/dist/ssr/surfaces/Tag.js.map +1 -1
  532. package/dist/ssr/surfaces/avatar-messages.js +26 -0
  533. package/dist/ssr/surfaces/avatar-messages.js.map +1 -0
  534. package/dist/ssr/surfaces/resource-messages.js +26 -0
  535. package/dist/ssr/surfaces/resource-messages.js.map +1 -0
  536. package/dist/ssr/widgets/Widget.js +6 -0
  537. package/dist/ssr/widgets/Widget.js.map +1 -1
  538. package/dist/styles.css +1 -1
  539. package/dist/types/actions/filter-messages.d.ts +8 -0
  540. package/dist/types/actions/spotlight-messages.d.ts +8 -0
  541. package/dist/types/chat/chat-messages.d.ts +116 -0
  542. package/dist/types/content/Calendar.d.ts +91 -0
  543. package/dist/types/content/CalendarDayView.d.ts +7 -0
  544. package/dist/types/content/CalendarWeekView.d.ts +7 -0
  545. package/dist/types/content/ChartExplorer.d.ts +36 -1
  546. package/dist/types/content/ChartFilterControls.d.ts +6 -1
  547. package/dist/types/content/DataTable.d.ts +7 -0
  548. package/dist/types/content/FileView.d.ts +0 -10
  549. package/dist/types/content/calendar-day-scroll.d.ts +42 -0
  550. package/dist/types/content/calendar-days.d.ts +192 -0
  551. package/dist/types/content/calendar-dialogs.d.ts +22 -0
  552. package/dist/types/content/calendar-messages.d.ts +119 -1
  553. package/dist/types/content/calendar-pointer.d.ts +9 -0
  554. package/dist/types/content/calendar-shared.d.ts +69 -0
  555. package/dist/types/content/calendar-time-view.d.ts +252 -0
  556. package/dist/types/content/chart-messages.d.ts +37 -0
  557. package/dist/types/content/data-table-messages.d.ts +10 -0
  558. package/dist/types/content/docs-messages.d.ts +10 -0
  559. package/dist/types/content/feed-messages.d.ts +15 -0
  560. package/dist/types/content/file-browser-messages.d.ts +33 -0
  561. package/dist/types/content/file-view-messages.d.ts +30 -0
  562. package/dist/types/content/index.d.ts +2 -2
  563. package/dist/types/content/lightbox-messages.d.ts +16 -0
  564. package/dist/types/content/log-entries-messages.d.ts +8 -0
  565. package/dist/types/content/markdown-info-block-messages.d.ts +12 -0
  566. package/dist/types/content/markdown-reference-messages.d.ts +15 -0
  567. package/dist/types/content/pagination-messages.d.ts +17 -0
  568. package/dist/types/content/pdf-messages.d.ts +20 -0
  569. package/dist/types/content/range-picker-messages.d.ts +8 -0
  570. package/dist/types/content/structured-data-messages.d.ts +9 -0
  571. package/dist/types/content/timeline-messages.d.ts +29 -0
  572. package/dist/types/content/video-messages.d.ts +10 -0
  573. package/dist/types/content/viewport-messages.d.ts +12 -0
  574. package/dist/types/feedback/install-messages.d.ts +50 -0
  575. package/dist/types/feedback/prompt-messages.d.ts +31 -0
  576. package/dist/types/feedback/toast-messages.d.ts +9 -0
  577. package/dist/types/index.d.ts +1 -0
  578. package/dist/types/inputs/completion-messages.d.ts +10 -0
  579. package/dist/types/inputs/file-drop-messages.d.ts +30 -0
  580. package/dist/types/inputs/file-drop.d.ts +3 -3
  581. package/dist/types/inputs/file-input-messages.d.ts +28 -0
  582. package/dist/types/inputs/icon-messages.d.ts +9 -0
  583. package/dist/types/inputs/input-messages.d.ts +17 -0
  584. package/dist/types/inputs/markdown/editor-messages.d.ts +20 -0
  585. package/dist/types/inputs/markdown/toolbar-messages.d.ts +18 -0
  586. package/dist/types/inputs/qr-messages.d.ts +11 -0
  587. package/dist/types/inputs/select-messages.d.ts +30 -0
  588. package/dist/types/inputs/tag-messages.d.ts +20 -0
  589. package/dist/types/inputs/template-messages.d.ts +9 -0
  590. package/dist/types/internal/render-error-messages.d.ts +8 -0
  591. package/dist/types/internal/text-selection.d.ts +18 -0
  592. package/dist/types/intl/messages.d.ts +3 -544
  593. package/dist/types/layout/AppWorkspace.d.ts +42 -5
  594. package/dist/types/layout/PageTitle.d.ts +65 -0
  595. package/dist/types/layout/app-workspace-controller.d.ts +12 -0
  596. package/dist/types/layout/app-workspace-state.d.ts +3 -2
  597. package/dist/types/layout/floating-window-messages.d.ts +12 -0
  598. package/dist/types/layout/index.d.ts +3 -0
  599. package/dist/types/layout/navigation-model.d.ts +7 -0
  600. package/dist/types/layout/page-title-controller.d.ts +13 -0
  601. package/dist/types/layout/panel-dialog-messages.d.ts +8 -0
  602. package/dist/types/layout/panes-messages.d.ts +22 -0
  603. package/dist/types/layout/refresh-messages.d.ts +8 -0
  604. package/dist/types/layout/settings-messages.d.ts +25 -0
  605. package/dist/types/layout/workspace-messages.d.ts +26 -0
  606. package/dist/types/surfaces/StatCell.d.ts +5 -0
  607. package/dist/types/surfaces/avatar-messages.d.ts +11 -0
  608. package/dist/types/surfaces/resource-messages.d.ts +11 -0
  609. package/dist/types/widgets/Widget.d.ts +5 -1
  610. package/package.json +1 -1
@@ -15,8 +15,9 @@ var _tmpl$ = ["<button type=\"button\" class=\"k2b-button\" data-variant=\"secon
15
15
  _tmpl$0 = ["<section class=\"", "\"><div class=\"k2b-content-pdf-preview__toolbar\"><div class=\"k2b-content-pdf-preview__heading\">", "</div>", "</div>", "</section>"];
16
16
  import { createSignal, onCleanup, onMount, Show } from "solid-js";
17
17
  import { announce } from "../feedback/announce";
18
- import { resolveUiMessages, useUiMessages } from "../intl/messages";
18
+ import { useUiMessages } from "../intl/messages";
19
19
  import Placeholder from "../surfaces/Placeholder";
20
+ import { resolvePdfMessages, usePdfMessages } from "./pdf-messages";
20
21
  const readErrorMessage = async response => {
21
22
  try {
22
23
  const data = await response.json();
@@ -24,12 +25,13 @@ const readErrorMessage = async response => {
24
25
  } catch {
25
26
  // Fall through to the HTTP status fallback.
26
27
  }
27
- return resolveUiMessages().pdfPreviewHttpError({
28
+ return resolvePdfMessages().pdfPreviewHttpError({
28
29
  status: response.status
29
30
  });
30
31
  };
31
32
  export default function PdfPreview(props) {
32
33
  const messages = useUiMessages();
34
+ const pdfMessages = usePdfMessages();
33
35
  const [url, setUrl] = createSignal(null);
34
36
  // An automatic preview starts loading once mounted. The server and the page before hydration already show that
35
37
  // state, so they offer neither a retry nor an invitation to render while nothing has failed.
@@ -99,8 +101,8 @@ export default function PdfPreview(props) {
99
101
  if (previousUrl) URL.revokeObjectURL(previousUrl);
100
102
  // The loading status turns into the missing-viewer hint in place and stops being a live region, so say it here.
101
103
  if (!inlineViewer()) {
102
- announce(messages().pdfPreviewNoViewer);
103
- announce(messages().pdfPreviewNoViewerDescription);
104
+ announce(pdfMessages().pdfPreviewNoViewer);
105
+ announce(pdfMessages().pdfPreviewNoViewerDescription);
104
106
  }
105
107
  // The shown document removes the retry action; keep keyboard focus in the actions instead of the page, or, when
106
108
  // the host shows only the content, in the viewer, which hands it on to the document once the frame has loaded it.
@@ -129,8 +131,8 @@ export default function PdfPreview(props) {
129
131
  setTabBlocked(!tab);
130
132
  if (!tab) return;
131
133
  tab.opener = null;
132
- tab.document.title = props.title ?? messages().pdfPreview;
133
- tab.document.body.textContent = messages().pdfPreviewRendering;
134
+ tab.document.title = props.title ?? pdfMessages().pdfPreview;
135
+ tab.document.body.textContent = pdfMessages().pdfPreviewRendering;
134
136
  setOpening(true);
135
137
  setError(null);
136
138
  try {
@@ -158,10 +160,10 @@ export default function PdfPreview(props) {
158
160
  return _$memo(() => !!!props.disabled?.())() && props.openHref;
159
161
  },
160
162
  get fallback() {
161
- return _$ssr(_tmpl$2, _$ssrAttribute("disabled", loading() || opening() || props.disabled?.(), true), _$ssrAttribute("class", opening() ? "ti ti-loader-2 k2b-spin" : "ti ti-external-link", false), _$escape(props.openButtonLabel ?? messages().openPreview));
163
+ return _$ssr(_tmpl$2, _$ssrAttribute("disabled", loading() || opening() || props.disabled?.(), true), _$ssrAttribute("class", opening() ? "ti ti-loader-2 k2b-spin" : "ti ti-external-link", false), _$escape(props.openButtonLabel ?? pdfMessages().openPreview));
162
164
  },
163
165
  children: href => // A plain link to a real address: the browser opens it on the user's own click, and the tab can reload it.
164
- _$ssr(_tmpl$5, _$ssrAttribute("href", _$escape(href(), true), false), _$escape(props.openButtonLabel ?? messages().openPreview))
166
+ _$ssr(_tmpl$5, _$ssrAttribute("href", _$escape(href(), true), false), _$escape(props.openButtonLabel ?? pdfMessages().openPreview))
165
167
  })), _$escape(_$createComponent(Show, {
166
168
  get when() {
167
169
  return props.onDownload;
@@ -174,14 +176,14 @@ export default function PdfPreview(props) {
174
176
  return renderable();
175
177
  },
176
178
  get children() {
177
- return _$ssr(_tmpl$2, _$ssrAttribute("disabled", loading() || opening() || props.disabled?.(), true), _$ssrAttribute("class", loading() ? "ti ti-loader-2 k2b-spin" : "ti ti-file-type-pdf", false), _$escape(props.buttonLabel ?? messages().previewPdf));
179
+ return _$ssr(_tmpl$2, _$ssrAttribute("disabled", loading() || opening() || props.disabled?.(), true), _$ssrAttribute("class", loading() ? "ti ti-loader-2 k2b-spin" : "ti ti-file-type-pdf", false), _$escape(props.buttonLabel ?? pdfMessages().previewPdf));
178
180
  }
179
181
  })), _$escape(_$createComponent(Show, {
180
182
  get when() {
181
183
  return tabBlocked();
182
184
  },
183
185
  get children() {
184
- return _$ssr(_tmpl$3, _$escape(messages().pdfPreviewTabBlocked));
186
+ return _$ssr(_tmpl$3, _$escape(pdfMessages().pdfPreviewTabBlocked));
185
187
  }
186
188
  })));
187
189
  // Every state uses one placeholder in the viewer's box, so loading changes no layout: idle and loading before a
@@ -197,7 +199,7 @@ export default function PdfPreview(props) {
197
199
  get when() {
198
200
  return _$memo(() => !!(!error() && inlineViewer()))() && url();
199
201
  },
200
- children: currentUrl => _$ssr(_tmpl$7, _$ssrAttribute("data-drawn", drawn() ? "" : _$escape(undefined, true), false), _$ssrAttribute("inert", !drawn(), true) + _$ssrAttribute("src", _$escape(currentUrl(), true), false) + _$ssrAttribute("title", _$escape(props.title ?? messages().pdfPreview, true), false))
202
+ children: currentUrl => _$ssr(_tmpl$7, _$ssrAttribute("data-drawn", drawn() ? "" : _$escape(undefined, true), false), _$ssrAttribute("inert", !drawn(), true) + _$ssrAttribute("src", _$escape(currentUrl(), true), false) + _$ssrAttribute("title", _$escape(props.title ?? pdfMessages().pdfPreview, true), false))
201
203
  })), _$escape(_$createComponent(Show, {
202
204
  get when() {
203
205
  return error();
@@ -216,10 +218,10 @@ export default function PdfPreview(props) {
216
218
  return state() === "loading" ? undefined : "ti ti-file-type-pdf";
217
219
  },
218
220
  get title() {
219
- return _$memo(() => state() === "loading")() ? messages().loading : _$memo(() => state() === "no-viewer")() ? messages().pdfPreviewNoViewer : undefined;
221
+ return _$memo(() => state() === "loading")() ? messages().loading : _$memo(() => state() === "no-viewer")() ? pdfMessages().pdfPreviewNoViewer : undefined;
220
222
  },
221
223
  get description() {
222
- return _$memo(() => state() === "idle")() ? props.emptyText ?? messages().renderPdfPreview : _$memo(() => state() === "no-viewer")() ? messages().pdfPreviewNoViewerDescription : undefined;
224
+ return _$memo(() => state() === "idle")() ? props.emptyText ?? pdfMessages().renderPdfPreview : _$memo(() => state() === "no-viewer")() ? pdfMessages().pdfPreviewNoViewerDescription : undefined;
223
225
  }
224
226
  })
225
227
  });
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["content/PdfPreview.tsx"],"sourcesContent":["import { createSignal, type JSX, onCleanup, onMount, Show } from \"solid-js\";\nimport { announce } from \"../feedback/announce\";\nimport { resolveUiMessages, useUiMessages } from \"../intl/messages\";\nimport Placeholder from \"../surfaces/Placeholder\";\n\nexport type PdfPreviewRequest = () => Promise<Response | Blob>;\n\nexport type PdfPreviewProps = {\n request: PdfPreviewRequest;\n autoLoad?: boolean;\n disabled?: () => boolean;\n title?: string;\n buttonLabel?: string;\n openButtonLabel?: string;\n /**\n * Opens the document at this address in a new tab instead of a local copy. Pass a stable same-origin URL that\n * serves the PDF inline, so reloading and the viewer's file name keep working. Without it, the open action shows\n * a temporary copy of the requested document.\n */\n openHref?: string;\n /** Adds a Download action. The host owns the download, for example a fresh attachment URL. */\n onDownload?: () => void;\n emptyText?: string;\n class?: string;\n children?: (parts: { actions: JSX.Element; content: JSX.Element }) => JSX.Element;\n renderError?: (message: string) => JSX.Element;\n};\n\nconst readErrorMessage = async (response: Response): Promise<string> => {\n try {\n const data = (await response.json()) as unknown;\n if (data && typeof data === \"object\" && \"message\" in data && typeof data.message === \"string\") return data.message;\n } catch {\n // Fall through to the HTTP status fallback.\n }\n return resolveUiMessages().pdfPreviewHttpError({ status: response.status });\n};\n\nexport default function PdfPreview(props: PdfPreviewProps) {\n const messages = useUiMessages();\n const [url, setUrl] = createSignal<string | null>(null);\n // An automatic preview starts loading once mounted. The server and the page before hydration already show that\n // state, so they offer neither a retry nor an invitation to render while nothing has failed.\n const [loading, setLoading] = createSignal(Boolean(props.autoLoad) && !props.disabled?.());\n const [opening, setOpening] = createSignal(false);\n const [error, setError] = createSignal<string | null>(null);\n const [failed, setFailed] = createSignal(false);\n const [tabBlocked, setTabBlocked] = createSignal(false);\n // The frame has its document only once it fires `load`; until then the loading state covers it.\n const [drawn, setDrawn] = createSignal(false);\n // An automatic preview shows one fixed document; the open action reuses it instead of requesting it again.\n let shownBlob: Blob | null = null;\n let openButton: HTMLElement | undefined;\n let frame: HTMLIFrameElement | undefined;\n let viewer: HTMLDivElement | undefined;\n let renderButton: HTMLButtonElement | undefined;\n let errorRetryButton: HTMLButtonElement | undefined;\n let disposed = false;\n let loadGeneration = 0;\n let openGeneration = 0;\n\n // Without an inline PDF viewer (`navigator.pdfViewerEnabled === false`, as in Chrome on Android) a frame stays empty\n // or downloads the file, so the viewer explains that instead and leaves the document to the open and download actions.\n const inlineViewer = () => typeof navigator === \"undefined\" || navigator.pdfViewerEnabled !== false;\n // There an automatic preview could show only that hint, so it requests nothing: the open action fetches the document\n // when someone asks for it, and is also the retry after it fails. An on-demand preview still renders, because its\n // request also checks the caller's input.\n const openOnly = () => Boolean(props.autoLoad) && !inlineViewer();\n\n const revokeCurrent = () => {\n const current = url();\n if (current) URL.revokeObjectURL(current);\n setUrl(null);\n };\n\n onCleanup(() => {\n disposed = true;\n loadGeneration += 1;\n openGeneration += 1;\n revokeCurrent();\n });\n\n const readPdfBlob = async () => {\n const response = await props.request();\n const blob = response instanceof Response ? (response.ok ? await response.blob() : null) : response;\n if (!blob) throw new Error(await readErrorMessage(response as Response));\n if (blob.type && blob.type !== \"application/pdf\") throw new Error(`PDF preview returned ${blob.type} instead of application/pdf`);\n return blob;\n };\n\n const load = async () => {\n if (loading() || opening() || props.disabled?.()) return;\n const generation = ++loadGeneration;\n // A retry the shown document or the loading state removes hands keyboard focus on instead of dropping it.\n const retryFocused =\n (props.autoLoad && document.activeElement === renderButton) ||\n (errorRetryButton?.isConnected && document.activeElement === errorRetryButton);\n setLoading(true);\n setError(null);\n try {\n const blob = await readPdfBlob();\n const nextUrl = URL.createObjectURL(blob);\n if (disposed || generation !== loadGeneration) {\n URL.revokeObjectURL(nextUrl);\n return;\n }\n const previousUrl = url();\n shownBlob = blob;\n setFailed(false);\n setDrawn(false);\n setUrl(nextUrl);\n setLoading(false);\n if (previousUrl) URL.revokeObjectURL(previousUrl);\n // The loading status turns into the missing-viewer hint in place and stops being a live region, so say it here.\n if (!inlineViewer()) {\n announce(messages().pdfPreviewNoViewer);\n announce(messages().pdfPreviewNoViewerDescription);\n }\n // The shown document removes the retry action; keep keyboard focus in the actions instead of the page, or, when\n // the host shows only the content, in the viewer, which hands it on to the document once the frame has loaded it.\n if (retryFocused && document.activeElement === document.body) (openButton?.isConnected ? openButton : viewer)?.focus();\n } catch (e) {\n if (disposed || generation !== loadGeneration) return;\n shownBlob = null;\n setFailed(true);\n setError(e instanceof Error ? e.message : \"PDF preview failed\");\n if (retryFocused && document.activeElement === document.body) errorRetryButton?.focus();\n } finally {\n if (!disposed && generation === loadGeneration) setLoading(false);\n }\n };\n\n onMount(() => {\n // Hand the initial loading state to the request itself, which also covers a preview disabled by now or one that\n // leaves the document to the open action.\n setLoading(false);\n if (props.autoLoad && !openOnly()) void load();\n });\n\n const openInNewTab = async () => {\n if (loading() || opening() || props.disabled?.()) return;\n const generation = ++openGeneration;\n const tab = window.open(\"\", \"_blank\");\n // A blocked tab is not a document error: keep the shown document and report it beside the actions.\n setTabBlocked(!tab);\n if (!tab) return;\n tab.opener = null;\n tab.document.title = props.title ?? messages().pdfPreview;\n tab.document.body.textContent = messages().pdfPreviewRendering;\n setOpening(true);\n setError(null);\n try {\n const blob = (props.autoLoad ? shownBlob : null) ?? (await readPdfBlob());\n if (disposed || generation !== openGeneration) {\n tab.close();\n return;\n }\n const objectUrl = URL.createObjectURL(blob);\n tab.location.href = objectUrl;\n window.setTimeout(() => URL.revokeObjectURL(objectUrl), 60_000);\n } catch (e) {\n tab.close();\n if (!disposed && generation === openGeneration) setError(e instanceof Error ? e.message : \"PDF preview failed\");\n } finally {\n if (!disposed && generation === openGeneration) setOpening(false);\n }\n };\n\n // With autoLoad, rendering again would show the same document: offer it only until one is shown. After a failure the\n // default error state carries it as the retry; beside a caller's error content it stays in place while a retry loads.\n const renderable = () => !openOnly() && (!props.autoLoad || (failed() ? Boolean(props.renderError) : !url() && !loading()));\n const actions = () => (\n <div class=\"k2b-content-pdf-preview__actions\">\n <Show\n when={!props.disabled?.() && props.openHref}\n fallback={\n <button\n ref={(element) => (openButton = element)}\n type=\"button\"\n class=\"k2b-button\"\n data-variant=\"secondary\"\n data-size=\"sm\"\n onClick={() => void openInNewTab()}\n disabled={loading() || opening() || props.disabled?.()}\n >\n <i class={opening() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-external-link\"} aria-hidden=\"true\" />\n {props.openButtonLabel ?? messages().openPreview}\n </button>\n }\n >\n {(href) => (\n // A plain link to a real address: the browser opens it on the user's own click, and the tab can reload it.\n <a\n ref={(element) => (openButton = element)}\n class=\"k2b-button\"\n data-variant=\"secondary\"\n data-size=\"sm\"\n href={href()}\n target=\"_blank\"\n rel=\"noopener\"\n >\n <i class=\"ti ti-external-link\" aria-hidden=\"true\" />\n {props.openButtonLabel ?? messages().openPreview}\n </a>\n )}\n </Show>\n <Show when={props.onDownload}>\n <button\n type=\"button\"\n class=\"k2b-button\"\n data-variant=\"secondary\"\n data-size=\"sm\"\n onClick={() => props.onDownload?.()}\n disabled={props.disabled?.()}\n >\n <i class=\"ti ti-download\" aria-hidden=\"true\" />\n {messages().download}\n </button>\n </Show>\n <Show when={renderable()}>\n <button\n ref={renderButton}\n type=\"button\"\n class=\"k2b-button\"\n data-variant=\"secondary\"\n data-size=\"sm\"\n onClick={() => void load()}\n disabled={loading() || opening() || props.disabled?.()}\n >\n <i class={loading() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-file-type-pdf\"} aria-hidden=\"true\" />\n {props.buttonLabel ?? messages().previewPdf}\n </button>\n </Show>\n <Show when={tabBlocked()}>\n <span role=\"alert\" class=\"k2b-content-pdf-preview__notice\">\n {messages().pdfPreviewTabBlocked}\n </span>\n </Show>\n </div>\n );\n // Every state uses one placeholder in the viewer's box, so loading changes no layout: idle and loading before a\n // document arrives, loading over the frame until it has loaded the document, and the hint where no frame can.\n const status = () => {\n if (error()) return null;\n if (!inlineViewer() && (url() || (openOnly() && !loading()))) return \"no-viewer\";\n if (!url()) return loading() ? \"loading\" : \"idle\";\n return drawn() ? null : \"loading\";\n };\n const viewerBox = () => (\n // While it shows a placeholder, the viewer itself holds keyboard focus that has nowhere else to go.\n <div ref={(element) => (viewer = element)} class=\"k2b-content-pdf-preview__viewer\" tabIndex={status() ? -1 : undefined}>\n <Show when={!error() && inlineViewer() && url()}>\n {(currentUrl) => (\n <iframe\n ref={(element) => {\n frame = element;\n // A new frame loads its document again, also one that was shown before a failed reload.\n setDrawn(false);\n }}\n class=\"k2b-content-pdf-preview__frame\"\n data-drawn={drawn() ? \"\" : undefined}\n // Out of reach while the loading state covers it, so keyboard focus never lands on an invisible frame.\n inert={!drawn()}\n src={currentUrl()}\n title={props.title ?? messages().pdfPreview}\n onLoad={() => {\n const waiting = document.activeElement === viewer;\n setDrawn(true);\n if (waiting) frame?.focus();\n }}\n />\n )}\n </Show>\n <Show\n when={error()}\n fallback={\n <Show when={status()}>\n {(state) => (\n <Placeholder\n class=\"k2b-content-pdf-preview__placeholder\"\n state={state() === \"loading\" ? \"loading\" : \"empty\"}\n icon={state() === \"loading\" ? undefined : \"ti ti-file-type-pdf\"}\n title={state() === \"loading\" ? messages().loading : state() === \"no-viewer\" ? messages().pdfPreviewNoViewer : undefined}\n description={\n state() === \"idle\"\n ? (props.emptyText ?? messages().renderPdfPreview)\n : state() === \"no-viewer\"\n ? messages().pdfPreviewNoViewerDescription\n : undefined\n }\n />\n )}\n </Show>\n }\n >\n {(message) => (\n <Placeholder\n class=\"k2b-content-pdf-preview__placeholder\"\n state=\"error\"\n description={message()}\n action={\n // One retry at a time: the render action moves here only where the toolbar no longer offers it, and the\n // open action is the retry of a preview that leaves the document to it.\n renderable() || openOnly() ? undefined : (\n <button\n ref={(element) => (errorRetryButton = element)}\n type=\"button\"\n class=\"k2b-button\"\n data-variant=\"secondary\"\n data-size=\"sm\"\n onClick={() => void load()}\n disabled={opening() || props.disabled?.()}\n >\n {props.buttonLabel ?? messages().retry}\n </button>\n )\n }\n />\n )}\n </Show>\n </div>\n );\n // A caller's error content replaces the whole viewer, as it brings its own layout.\n const content = () => (\n <Show when={props.renderError ? error() : null} fallback={viewerBox()}>\n {(message) => props.renderError?.(message())}\n </Show>\n );\n\n if (props.children)\n return props.children({\n get actions() {\n return actions();\n },\n get content() {\n return content();\n },\n });\n return (\n <section class={`k2b-content-pdf-preview ${props.class ?? \"\"}`}>\n <div class=\"k2b-content-pdf-preview__toolbar\">\n <div class=\"k2b-content-pdf-preview__heading\">\n <Show when={props.title}>\n <h2 class=\"k2b-content-pdf-preview__title\">{props.title}</h2>\n </Show>\n </div>\n {actions()}\n </div>\n {content()}\n </section>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["content/PdfPreview.tsx"],"sourcesContent":["import { createSignal, type JSX, onCleanup, onMount, Show } from \"solid-js\";\nimport { announce } from \"../feedback/announce\";\nimport { useUiMessages } from \"../intl/messages\";\nimport Placeholder from \"../surfaces/Placeholder\";\nimport { resolvePdfMessages, usePdfMessages } from \"./pdf-messages\";\n\nexport type PdfPreviewRequest = () => Promise<Response | Blob>;\n\nexport type PdfPreviewProps = {\n request: PdfPreviewRequest;\n autoLoad?: boolean;\n disabled?: () => boolean;\n title?: string;\n buttonLabel?: string;\n openButtonLabel?: string;\n /**\n * Opens the document at this address in a new tab instead of a local copy. Pass a stable same-origin URL that\n * serves the PDF inline, so reloading and the viewer's file name keep working. Without it, the open action shows\n * a temporary copy of the requested document.\n */\n openHref?: string;\n /** Adds a Download action. The host owns the download, for example a fresh attachment URL. */\n onDownload?: () => void;\n emptyText?: string;\n class?: string;\n children?: (parts: { actions: JSX.Element; content: JSX.Element }) => JSX.Element;\n renderError?: (message: string) => JSX.Element;\n};\n\nconst readErrorMessage = async (response: Response): Promise<string> => {\n try {\n const data = (await response.json()) as unknown;\n if (data && typeof data === \"object\" && \"message\" in data && typeof data.message === \"string\") return data.message;\n } catch {\n // Fall through to the HTTP status fallback.\n }\n return resolvePdfMessages().pdfPreviewHttpError({ status: response.status });\n};\n\nexport default function PdfPreview(props: PdfPreviewProps) {\n const messages = useUiMessages();\n const pdfMessages = usePdfMessages();\n const [url, setUrl] = createSignal<string | null>(null);\n // An automatic preview starts loading once mounted. The server and the page before hydration already show that\n // state, so they offer neither a retry nor an invitation to render while nothing has failed.\n const [loading, setLoading] = createSignal(Boolean(props.autoLoad) && !props.disabled?.());\n const [opening, setOpening] = createSignal(false);\n const [error, setError] = createSignal<string | null>(null);\n const [failed, setFailed] = createSignal(false);\n const [tabBlocked, setTabBlocked] = createSignal(false);\n // The frame has its document only once it fires `load`; until then the loading state covers it.\n const [drawn, setDrawn] = createSignal(false);\n // An automatic preview shows one fixed document; the open action reuses it instead of requesting it again.\n let shownBlob: Blob | null = null;\n let openButton: HTMLElement | undefined;\n let frame: HTMLIFrameElement | undefined;\n let viewer: HTMLDivElement | undefined;\n let renderButton: HTMLButtonElement | undefined;\n let errorRetryButton: HTMLButtonElement | undefined;\n let disposed = false;\n let loadGeneration = 0;\n let openGeneration = 0;\n\n // Without an inline PDF viewer (`navigator.pdfViewerEnabled === false`, as in Chrome on Android) a frame stays empty\n // or downloads the file, so the viewer explains that instead and leaves the document to the open and download actions.\n const inlineViewer = () => typeof navigator === \"undefined\" || navigator.pdfViewerEnabled !== false;\n // There an automatic preview could show only that hint, so it requests nothing: the open action fetches the document\n // when someone asks for it, and is also the retry after it fails. An on-demand preview still renders, because its\n // request also checks the caller's input.\n const openOnly = () => Boolean(props.autoLoad) && !inlineViewer();\n\n const revokeCurrent = () => {\n const current = url();\n if (current) URL.revokeObjectURL(current);\n setUrl(null);\n };\n\n onCleanup(() => {\n disposed = true;\n loadGeneration += 1;\n openGeneration += 1;\n revokeCurrent();\n });\n\n const readPdfBlob = async () => {\n const response = await props.request();\n const blob = response instanceof Response ? (response.ok ? await response.blob() : null) : response;\n if (!blob) throw new Error(await readErrorMessage(response as Response));\n if (blob.type && blob.type !== \"application/pdf\") throw new Error(`PDF preview returned ${blob.type} instead of application/pdf`);\n return blob;\n };\n\n const load = async () => {\n if (loading() || opening() || props.disabled?.()) return;\n const generation = ++loadGeneration;\n // A retry the shown document or the loading state removes hands keyboard focus on instead of dropping it.\n const retryFocused =\n (props.autoLoad && document.activeElement === renderButton) ||\n (errorRetryButton?.isConnected && document.activeElement === errorRetryButton);\n setLoading(true);\n setError(null);\n try {\n const blob = await readPdfBlob();\n const nextUrl = URL.createObjectURL(blob);\n if (disposed || generation !== loadGeneration) {\n URL.revokeObjectURL(nextUrl);\n return;\n }\n const previousUrl = url();\n shownBlob = blob;\n setFailed(false);\n setDrawn(false);\n setUrl(nextUrl);\n setLoading(false);\n if (previousUrl) URL.revokeObjectURL(previousUrl);\n // The loading status turns into the missing-viewer hint in place and stops being a live region, so say it here.\n if (!inlineViewer()) {\n announce(pdfMessages().pdfPreviewNoViewer);\n announce(pdfMessages().pdfPreviewNoViewerDescription);\n }\n // The shown document removes the retry action; keep keyboard focus in the actions instead of the page, or, when\n // the host shows only the content, in the viewer, which hands it on to the document once the frame has loaded it.\n if (retryFocused && document.activeElement === document.body) (openButton?.isConnected ? openButton : viewer)?.focus();\n } catch (e) {\n if (disposed || generation !== loadGeneration) return;\n shownBlob = null;\n setFailed(true);\n setError(e instanceof Error ? e.message : \"PDF preview failed\");\n if (retryFocused && document.activeElement === document.body) errorRetryButton?.focus();\n } finally {\n if (!disposed && generation === loadGeneration) setLoading(false);\n }\n };\n\n onMount(() => {\n // Hand the initial loading state to the request itself, which also covers a preview disabled by now or one that\n // leaves the document to the open action.\n setLoading(false);\n if (props.autoLoad && !openOnly()) void load();\n });\n\n const openInNewTab = async () => {\n if (loading() || opening() || props.disabled?.()) return;\n const generation = ++openGeneration;\n const tab = window.open(\"\", \"_blank\");\n // A blocked tab is not a document error: keep the shown document and report it beside the actions.\n setTabBlocked(!tab);\n if (!tab) return;\n tab.opener = null;\n tab.document.title = props.title ?? pdfMessages().pdfPreview;\n tab.document.body.textContent = pdfMessages().pdfPreviewRendering;\n setOpening(true);\n setError(null);\n try {\n const blob = (props.autoLoad ? shownBlob : null) ?? (await readPdfBlob());\n if (disposed || generation !== openGeneration) {\n tab.close();\n return;\n }\n const objectUrl = URL.createObjectURL(blob);\n tab.location.href = objectUrl;\n window.setTimeout(() => URL.revokeObjectURL(objectUrl), 60_000);\n } catch (e) {\n tab.close();\n if (!disposed && generation === openGeneration) setError(e instanceof Error ? e.message : \"PDF preview failed\");\n } finally {\n if (!disposed && generation === openGeneration) setOpening(false);\n }\n };\n\n // With autoLoad, rendering again would show the same document: offer it only until one is shown. After a failure the\n // default error state carries it as the retry; beside a caller's error content it stays in place while a retry loads.\n const renderable = () => !openOnly() && (!props.autoLoad || (failed() ? Boolean(props.renderError) : !url() && !loading()));\n const actions = () => (\n <div class=\"k2b-content-pdf-preview__actions\">\n <Show\n when={!props.disabled?.() && props.openHref}\n fallback={\n <button\n ref={(element) => (openButton = element)}\n type=\"button\"\n class=\"k2b-button\"\n data-variant=\"secondary\"\n data-size=\"sm\"\n onClick={() => void openInNewTab()}\n disabled={loading() || opening() || props.disabled?.()}\n >\n <i class={opening() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-external-link\"} aria-hidden=\"true\" />\n {props.openButtonLabel ?? pdfMessages().openPreview}\n </button>\n }\n >\n {(href) => (\n // A plain link to a real address: the browser opens it on the user's own click, and the tab can reload it.\n <a\n ref={(element) => (openButton = element)}\n class=\"k2b-button\"\n data-variant=\"secondary\"\n data-size=\"sm\"\n href={href()}\n target=\"_blank\"\n rel=\"noopener\"\n >\n <i class=\"ti ti-external-link\" aria-hidden=\"true\" />\n {props.openButtonLabel ?? pdfMessages().openPreview}\n </a>\n )}\n </Show>\n <Show when={props.onDownload}>\n <button\n type=\"button\"\n class=\"k2b-button\"\n data-variant=\"secondary\"\n data-size=\"sm\"\n onClick={() => props.onDownload?.()}\n disabled={props.disabled?.()}\n >\n <i class=\"ti ti-download\" aria-hidden=\"true\" />\n {messages().download}\n </button>\n </Show>\n <Show when={renderable()}>\n <button\n ref={renderButton}\n type=\"button\"\n class=\"k2b-button\"\n data-variant=\"secondary\"\n data-size=\"sm\"\n onClick={() => void load()}\n disabled={loading() || opening() || props.disabled?.()}\n >\n <i class={loading() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-file-type-pdf\"} aria-hidden=\"true\" />\n {props.buttonLabel ?? pdfMessages().previewPdf}\n </button>\n </Show>\n <Show when={tabBlocked()}>\n <span role=\"alert\" class=\"k2b-content-pdf-preview__notice\">\n {pdfMessages().pdfPreviewTabBlocked}\n </span>\n </Show>\n </div>\n );\n // Every state uses one placeholder in the viewer's box, so loading changes no layout: idle and loading before a\n // document arrives, loading over the frame until it has loaded the document, and the hint where no frame can.\n const status = () => {\n if (error()) return null;\n if (!inlineViewer() && (url() || (openOnly() && !loading()))) return \"no-viewer\";\n if (!url()) return loading() ? \"loading\" : \"idle\";\n return drawn() ? null : \"loading\";\n };\n const viewerBox = () => (\n // While it shows a placeholder, the viewer itself holds keyboard focus that has nowhere else to go.\n <div ref={(element) => (viewer = element)} class=\"k2b-content-pdf-preview__viewer\" tabIndex={status() ? -1 : undefined}>\n <Show when={!error() && inlineViewer() && url()}>\n {(currentUrl) => (\n <iframe\n ref={(element) => {\n frame = element;\n // A new frame loads its document again, also one that was shown before a failed reload.\n setDrawn(false);\n }}\n class=\"k2b-content-pdf-preview__frame\"\n data-drawn={drawn() ? \"\" : undefined}\n // Out of reach while the loading state covers it, so keyboard focus never lands on an invisible frame.\n inert={!drawn()}\n src={currentUrl()}\n title={props.title ?? pdfMessages().pdfPreview}\n onLoad={() => {\n const waiting = document.activeElement === viewer;\n setDrawn(true);\n if (waiting) frame?.focus();\n }}\n />\n )}\n </Show>\n <Show\n when={error()}\n fallback={\n <Show when={status()}>\n {(state) => (\n <Placeholder\n class=\"k2b-content-pdf-preview__placeholder\"\n state={state() === \"loading\" ? \"loading\" : \"empty\"}\n icon={state() === \"loading\" ? undefined : \"ti ti-file-type-pdf\"}\n title={state() === \"loading\" ? messages().loading : state() === \"no-viewer\" ? pdfMessages().pdfPreviewNoViewer : undefined}\n description={\n state() === \"idle\"\n ? (props.emptyText ?? pdfMessages().renderPdfPreview)\n : state() === \"no-viewer\"\n ? pdfMessages().pdfPreviewNoViewerDescription\n : undefined\n }\n />\n )}\n </Show>\n }\n >\n {(message) => (\n <Placeholder\n class=\"k2b-content-pdf-preview__placeholder\"\n state=\"error\"\n description={message()}\n action={\n // One retry at a time: the render action moves here only where the toolbar no longer offers it, and the\n // open action is the retry of a preview that leaves the document to it.\n renderable() || openOnly() ? undefined : (\n <button\n ref={(element) => (errorRetryButton = element)}\n type=\"button\"\n class=\"k2b-button\"\n data-variant=\"secondary\"\n data-size=\"sm\"\n onClick={() => void load()}\n disabled={opening() || props.disabled?.()}\n >\n {props.buttonLabel ?? messages().retry}\n </button>\n )\n }\n />\n )}\n </Show>\n </div>\n );\n // A caller's error content replaces the whole viewer, as it brings its own layout.\n const content = () => (\n <Show when={props.renderError ? error() : null} fallback={viewerBox()}>\n {(message) => props.renderError?.(message())}\n </Show>\n );\n\n if (props.children)\n return props.children({\n get actions() {\n return actions();\n },\n get content() {\n return content();\n },\n });\n return (\n <section class={`k2b-content-pdf-preview ${props.class ?? \"\"}`}>\n <div class=\"k2b-content-pdf-preview__toolbar\">\n <div class=\"k2b-content-pdf-preview__heading\">\n <Show when={props.title}>\n <h2 class=\"k2b-content-pdf-preview__title\">{props.title}</h2>\n </Show>\n </div>\n {actions()}\n </div>\n {content()}\n </section>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -7,6 +7,7 @@ var _tmpl$ = ["<nav class=\"", "\"", ">", "", "</nav>"],
7
7
  _tmpl$3 = ["<a", " class=\"k2b-range-picker__option\"", ">", "</a>"];
8
8
  import { For } from "solid-js";
9
9
  import { useUiMessages } from "../intl/messages";
10
+ import { useRangePickerMessages } from "./range-picker-messages";
10
11
 
11
12
  /**
12
13
  * RangePicker — the time window every observability surface needs.
@@ -24,7 +25,8 @@ import { useUiMessages } from "../intl/messages";
24
25
 
25
26
  export default function RangePicker(props) {
26
27
  const messages = useUiMessages();
27
- const caption = () => props.label === null ? null : props.label ?? messages().window;
28
+ const rangePickerMessages = useRangePickerMessages();
29
+ const caption = () => props.label === null ? null : props.label ?? rangePickerMessages().window;
28
30
  return _$ssr(_tmpl$, `k2b-range-picker ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("aria-label", _$escape(props.ariaLabel ?? caption() ?? messages().range, true), false), caption() ? _$ssr(_tmpl$2, _$escape(caption())) : _$escape(null), _$escape(_$createComponent(For, {
29
31
  get each() {
30
32
  return props.options;
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["content/RangePicker.tsx"],"sourcesContent":["import { For } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\n\n/**\n * RangePicker — the time window every observability surface needs.\n *\n * Rendered as links rather than buttons on purpose: window selection is a\n * server concern (the query, not the rendering), so it belongs in the URL and\n * works without hydration. Callers supply the href per option, which is what\n * lets each page keep its own other params intact — the hand-rolled copies\n * differed exactly there, with one silently dropping every unrelated filter.\n *\n * The vocabulary stays with the caller too. Traces think in `10m…30d`, request\n * telemetry in `1h…30d`, audit in days; a single hardcoded list would be wrong\n * for most of them.\n */\nexport type RangeOption<T extends string> = {\n value: T;\n /** Defaults to the value, which is already short by convention (`24h`). */\n label?: string;\n href: string;\n};\n\nexport type RangePickerProps<T extends string> = {\n options: readonly RangeOption<T>[];\n value: T;\n /** Leading caption. Pass `null` to omit it in tight toolbars. */\n label?: string | null;\n /** Names the control for assistive tech; defaults to the visible label. */\n ariaLabel?: string;\n class?: string;\n};\n\nexport default function RangePicker<T extends string>(props: RangePickerProps<T>) {\n const messages = useUiMessages();\n const caption = () => (props.label === null ? null : (props.label ?? messages().window));\n return (\n <nav class={`k2b-range-picker ${props.class ?? \"\"}`} aria-label={props.ariaLabel ?? caption() ?? messages().range}>\n {caption() ? <span class=\"k2b-range-picker__caption\">{caption()}</span> : null}\n <For each={props.options}>\n {(option) => (\n <a\n href={option.href}\n class=\"k2b-range-picker__option\"\n data-selected={option.value === props.value ? \"true\" : undefined}\n aria-current={option.value === props.value ? \"true\" : undefined}\n >\n {option.label ?? option.value}\n </a>\n )}\n </For>\n </nav>\n );\n}\n"],"mappings":";;;;;;;AAAA,SAAS,GAAG,QAAQ,UAAU;AAC9B,SAAS,aAAa,QAAQ,kBAAkB;;AAEhD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAkBA,eAAe,SAAS,WAAW,CAAmB,KAA0B,EAAE;EAChF,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC;EAChC,MAAM,OAAO,GAAG,MAAO,KAAK,CAAC,KAAK,KAAK,IAAI,GAAG,IAAI,GAAI,KAAK,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAQ;EACxF,qBACc,6BAAoB,KAAK,CAAC,KAAK,IAAI,EAAE,SAAE,wCAAc,KAAK,CAAC,SAAS,IAAI,OAAO,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,iBAC9G,OAAO,CAAC,CAAC,2BAA4C,OAAO,CAAC,CAAC,cAAW,IAAI,8BAC7E,GAAG;IAAA,IAAC,IAAI;MAAA,OAAE,KAAK,CAAC,OAAO;IAAA;IAAA,UACpB,MAAM,mDAEE,MAAM,CAAC,IAAI,iDAEF,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,GAAG,MAAM,YAAG,SAAS,iDAClD,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,GAAG,MAAM,YAAG,SAAS,0BAE9D,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK;EAEhC;AAIT","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["content/RangePicker.tsx"],"sourcesContent":["import { For } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { useRangePickerMessages } from \"./range-picker-messages\";\n\n/**\n * RangePicker — the time window every observability surface needs.\n *\n * Rendered as links rather than buttons on purpose: window selection is a\n * server concern (the query, not the rendering), so it belongs in the URL and\n * works without hydration. Callers supply the href per option, which is what\n * lets each page keep its own other params intact — the hand-rolled copies\n * differed exactly there, with one silently dropping every unrelated filter.\n *\n * The vocabulary stays with the caller too. Traces think in `10m…30d`, request\n * telemetry in `1h…30d`, audit in days; a single hardcoded list would be wrong\n * for most of them.\n */\nexport type RangeOption<T extends string> = {\n value: T;\n /** Defaults to the value, which is already short by convention (`24h`). */\n label?: string;\n href: string;\n};\n\nexport type RangePickerProps<T extends string> = {\n options: readonly RangeOption<T>[];\n value: T;\n /** Leading caption. Pass `null` to omit it in tight toolbars. */\n label?: string | null;\n /** Names the control for assistive tech; defaults to the visible label. */\n ariaLabel?: string;\n class?: string;\n};\n\nexport default function RangePicker<T extends string>(props: RangePickerProps<T>) {\n const messages = useUiMessages();\n const rangePickerMessages = useRangePickerMessages();\n const caption = () => (props.label === null ? null : (props.label ?? rangePickerMessages().window));\n return (\n <nav class={`k2b-range-picker ${props.class ?? \"\"}`} aria-label={props.ariaLabel ?? caption() ?? messages().range}>\n {caption() ? <span class=\"k2b-range-picker__caption\">{caption()}</span> : null}\n <For each={props.options}>\n {(option) => (\n <a\n href={option.href}\n class=\"k2b-range-picker__option\"\n data-selected={option.value === props.value ? \"true\" : undefined}\n aria-current={option.value === props.value ? \"true\" : undefined}\n >\n {option.label ?? option.value}\n </a>\n )}\n </For>\n </nav>\n );\n}\n"],"mappings":";;;;;;;AAAA,SAAS,GAAG,QAAQ,UAAU;AAC9B,SAAS,aAAa,QAAQ,kBAAkB;AAChD,SAAS,sBAAsB,QAAQ,yBAAyB;;AAEhE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAkBA,eAAe,SAAS,WAAW,CAAmB,KAA0B,EAAE;EAChF,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC;EAChC,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,CAAC;EACpD,MAAM,OAAO,GAAG,MAAO,KAAK,CAAC,KAAK,KAAK,IAAI,GAAG,IAAI,GAAI,KAAK,CAAC,KAAK,IAAI,mBAAmB,CAAC,CAAC,CAAC,MAAQ;EACnG,qBACc,6BAAoB,KAAK,CAAC,KAAK,IAAI,EAAE,SAAE,wCAAc,KAAK,CAAC,SAAS,IAAI,OAAO,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,iBAC9G,OAAO,CAAC,CAAC,2BAA4C,OAAO,CAAC,CAAC,cAAW,IAAI,8BAC7E,GAAG;IAAA,IAAC,IAAI;MAAA,OAAE,KAAK,CAAC,OAAO;IAAA;IAAA,UACpB,MAAM,mDAEE,MAAM,CAAC,IAAI,iDAEF,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,GAAG,MAAM,YAAG,SAAS,iDAClD,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,GAAG,MAAM,YAAG,SAAS,0BAE9D,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK;EAEhC;AAIT","ignoreList":[]}
@@ -17,6 +17,7 @@ import { createMemo, createSignal, For, Show } from "solid-js";
17
17
  import CopyButton from "../actions/CopyButton";
18
18
  import { resolveMaybeAccessor } from "../inputs/field-contract";
19
19
  import { useUiMessages } from "../intl/messages";
20
+ import { useStructuredDataMessages } from "./structured-data-messages";
20
21
  export const isStructuredDataValue = (value, seen = new WeakSet()) => {
21
22
  if (value === null || typeof value === "string" || typeof value === "boolean") return true;
22
23
  if (typeof value === "number") return Number.isFinite(value);
@@ -52,6 +53,7 @@ const formatInlineValue = value => {
52
53
  const formatJson = data => JSON.stringify(data, null, 2);
53
54
  export default function StructuredDataPreview(props) {
54
55
  const messages = useUiMessages();
56
+ const structuredDataMessages = useStructuredDataMessages();
55
57
  const [internalMode, setInternalMode] = createSignal(props.defaultMode ?? "formatted");
56
58
  const mode = () => props.mode === undefined ? internalMode() : resolveMaybeAccessor(props.mode);
57
59
  const setMode = next => {
@@ -120,7 +122,7 @@ export default function StructuredDataPreview(props) {
120
122
  return hasData();
121
123
  },
122
124
  get children() {
123
- return _$ssr(_tmpl$4, showRaw() ? _$escape(messages().viewFormatted) : _$escape(messages().viewRaw));
125
+ return _$ssr(_tmpl$4, showRaw() ? _$escape(structuredDataMessages().viewFormatted) : _$escape(structuredDataMessages().viewRaw));
124
126
  }
125
127
  })));
126
128
  }
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["content/StructuredDataPreview.tsx"],"sourcesContent":["import { createMemo, createSignal, For, Show } from \"solid-js\";\nimport CopyButton from \"../actions/CopyButton\";\nimport { type MaybeAccessor, resolveMaybeAccessor } from \"../inputs/field-contract\";\nimport { useUiMessages } from \"../intl/messages\";\n\nexport type StructuredDataPreviewMode = \"formatted\" | \"raw\";\nexport type StructuredDataValue =\n | null\n | boolean\n | number\n | string\n | readonly StructuredDataValue[]\n | { readonly [key: string]: StructuredDataValue };\n\nexport const isStructuredDataValue = (value: unknown, seen = new WeakSet<object>()): value is StructuredDataValue => {\n if (value === null || typeof value === \"string\" || typeof value === \"boolean\") return true;\n if (typeof value === \"number\") return Number.isFinite(value);\n if (typeof value !== \"object\" || seen.has(value)) return false;\n\n const prototype = Object.getPrototypeOf(value);\n if (!Array.isArray(value) && prototype !== Object.prototype && prototype !== null) return false;\n\n seen.add(value);\n const valid = Array.isArray(value)\n ? value.every((item) => isStructuredDataValue(item, seen))\n : Object.values(value).every((item) => isStructuredDataValue(item, seen));\n seen.delete(value);\n return valid;\n};\n\nexport type StructuredDataPreviewProps = {\n title?: string;\n data: StructuredDataValue;\n /** Controlled display mode. */\n mode?: MaybeAccessor<StructuredDataPreviewMode>;\n onModeChange?: (mode: StructuredDataPreviewMode) => void;\n /** Initial mode for an uncontrolled preview. */\n defaultMode?: StructuredDataPreviewMode;\n copy?: boolean;\n empty?: string;\n maxRows?: number;\n class?: string;\n};\n\ntype Row = {\n key: string;\n value: StructuredDataValue;\n};\n\nconst toRows = (data: StructuredDataValue): Row[] => {\n if (Array.isArray(data)) return data.map((value, index) => ({ key: String(index), value }));\n if (data && typeof data === \"object\") return Object.entries(data).map(([key, value]) => ({ key, value }));\n if (data === null) return [];\n return [{ key: \"value\", value: data }];\n};\n\nconst formatInlineValue = (value: StructuredDataValue): string => {\n if (value === null) return \"null\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n return JSON.stringify(value);\n};\n\nconst formatJson = (data: StructuredDataValue): string => JSON.stringify(data, null, 2);\n\nexport default function StructuredDataPreview(props: StructuredDataPreviewProps) {\n const messages = useUiMessages();\n const [internalMode, setInternalMode] = createSignal<StructuredDataPreviewMode>(props.defaultMode ?? \"formatted\");\n const mode = () => (props.mode === undefined ? internalMode() : resolveMaybeAccessor(props.mode));\n const setMode = (next: StructuredDataPreviewMode) => {\n if (props.mode === undefined) setInternalMode(next);\n props.onModeChange?.(next);\n };\n const rows = createMemo(() => toRows(props.data));\n const visibleRows = createMemo(() => rows().slice(0, props.maxRows ?? rows().length));\n const hiddenCount = createMemo(() => Math.max(0, rows().length - visibleRows().length));\n const raw = createMemo(() => formatJson(props.data));\n const hasData = createMemo(() => rows().length > 0);\n const showRaw = createMemo(() => mode() === \"raw\");\n\n return (\n <div class={[\"k2b-content-structured-data\", props.class].filter(Boolean).join(\" \")}>\n <Show when={props.title}>{(title) => <h2 class=\"k2b-content-structured-data__title\">{title()}</h2>}</Show>\n\n <Show\n when={!showRaw()}\n fallback={\n <div class=\"k2b-content-structured-data__surface\" data-mode=\"raw\">\n <pre>{raw()}</pre>\n <Show when={props.copy !== false}>\n <div class=\"k2b-content-structured-data__copy\">\n <CopyButton text={raw()} />\n </div>\n </Show>\n </div>\n }\n >\n <div class=\"k2b-content-structured-data__surface\">\n <Show when={hasData()} fallback={<p class=\"k2b-content-structured-data__empty\">{props.empty ?? messages().noData}</p>}>\n <div class=\"k2b-content-structured-data__rows\">\n <For each={visibleRows()}>\n {(row) => {\n const complex = typeof row.value === \"object\" && row.value !== null;\n return (\n <>\n <span class=\"k2b-content-structured-data__key\" title={row.key}>\n {row.key}\n </span>\n <span class=\"k2b-content-structured-data__value\" data-complex={complex ? \"true\" : undefined}>\n {formatInlineValue(row.value)}\n </span>\n </>\n );\n }}\n </For>\n </div>\n <Show when={hiddenCount() > 0}>\n <p class=\"k2b-content-structured-data__hidden\">\n {hiddenCount()} more row{hiddenCount() === 1 ? \"\" : \"s\"} hidden.\n </p>\n </Show>\n </Show>\n </div>\n </Show>\n\n <div class=\"k2b-content-structured-data__footer\">\n <Show when={hasData()}>\n <button type=\"button\" class=\"k2b-content-structured-data__action\" onClick={() => setMode(showRaw() ? \"formatted\" : \"raw\")}>\n {showRaw() ? messages().viewFormatted : messages().viewRaw}\n </button>\n </Show>\n </div>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["content/StructuredDataPreview.tsx"],"sourcesContent":["import { createMemo, createSignal, For, Show } from \"solid-js\";\nimport CopyButton from \"../actions/CopyButton\";\nimport { type MaybeAccessor, resolveMaybeAccessor } from \"../inputs/field-contract\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { useStructuredDataMessages } from \"./structured-data-messages\";\n\nexport type StructuredDataPreviewMode = \"formatted\" | \"raw\";\nexport type StructuredDataValue =\n | null\n | boolean\n | number\n | string\n | readonly StructuredDataValue[]\n | { readonly [key: string]: StructuredDataValue };\n\nexport const isStructuredDataValue = (value: unknown, seen = new WeakSet<object>()): value is StructuredDataValue => {\n if (value === null || typeof value === \"string\" || typeof value === \"boolean\") return true;\n if (typeof value === \"number\") return Number.isFinite(value);\n if (typeof value !== \"object\" || seen.has(value)) return false;\n\n const prototype = Object.getPrototypeOf(value);\n if (!Array.isArray(value) && prototype !== Object.prototype && prototype !== null) return false;\n\n seen.add(value);\n const valid = Array.isArray(value)\n ? value.every((item) => isStructuredDataValue(item, seen))\n : Object.values(value).every((item) => isStructuredDataValue(item, seen));\n seen.delete(value);\n return valid;\n};\n\nexport type StructuredDataPreviewProps = {\n title?: string;\n data: StructuredDataValue;\n /** Controlled display mode. */\n mode?: MaybeAccessor<StructuredDataPreviewMode>;\n onModeChange?: (mode: StructuredDataPreviewMode) => void;\n /** Initial mode for an uncontrolled preview. */\n defaultMode?: StructuredDataPreviewMode;\n copy?: boolean;\n empty?: string;\n maxRows?: number;\n class?: string;\n};\n\ntype Row = {\n key: string;\n value: StructuredDataValue;\n};\n\nconst toRows = (data: StructuredDataValue): Row[] => {\n if (Array.isArray(data)) return data.map((value, index) => ({ key: String(index), value }));\n if (data && typeof data === \"object\") return Object.entries(data).map(([key, value]) => ({ key, value }));\n if (data === null) return [];\n return [{ key: \"value\", value: data }];\n};\n\nconst formatInlineValue = (value: StructuredDataValue): string => {\n if (value === null) return \"null\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n return JSON.stringify(value);\n};\n\nconst formatJson = (data: StructuredDataValue): string => JSON.stringify(data, null, 2);\n\nexport default function StructuredDataPreview(props: StructuredDataPreviewProps) {\n const messages = useUiMessages();\n const structuredDataMessages = useStructuredDataMessages();\n const [internalMode, setInternalMode] = createSignal<StructuredDataPreviewMode>(props.defaultMode ?? \"formatted\");\n const mode = () => (props.mode === undefined ? internalMode() : resolveMaybeAccessor(props.mode));\n const setMode = (next: StructuredDataPreviewMode) => {\n if (props.mode === undefined) setInternalMode(next);\n props.onModeChange?.(next);\n };\n const rows = createMemo(() => toRows(props.data));\n const visibleRows = createMemo(() => rows().slice(0, props.maxRows ?? rows().length));\n const hiddenCount = createMemo(() => Math.max(0, rows().length - visibleRows().length));\n const raw = createMemo(() => formatJson(props.data));\n const hasData = createMemo(() => rows().length > 0);\n const showRaw = createMemo(() => mode() === \"raw\");\n\n return (\n <div class={[\"k2b-content-structured-data\", props.class].filter(Boolean).join(\" \")}>\n <Show when={props.title}>{(title) => <h2 class=\"k2b-content-structured-data__title\">{title()}</h2>}</Show>\n\n <Show\n when={!showRaw()}\n fallback={\n <div class=\"k2b-content-structured-data__surface\" data-mode=\"raw\">\n <pre>{raw()}</pre>\n <Show when={props.copy !== false}>\n <div class=\"k2b-content-structured-data__copy\">\n <CopyButton text={raw()} />\n </div>\n </Show>\n </div>\n }\n >\n <div class=\"k2b-content-structured-data__surface\">\n <Show when={hasData()} fallback={<p class=\"k2b-content-structured-data__empty\">{props.empty ?? messages().noData}</p>}>\n <div class=\"k2b-content-structured-data__rows\">\n <For each={visibleRows()}>\n {(row) => {\n const complex = typeof row.value === \"object\" && row.value !== null;\n return (\n <>\n <span class=\"k2b-content-structured-data__key\" title={row.key}>\n {row.key}\n </span>\n <span class=\"k2b-content-structured-data__value\" data-complex={complex ? \"true\" : undefined}>\n {formatInlineValue(row.value)}\n </span>\n </>\n );\n }}\n </For>\n </div>\n <Show when={hiddenCount() > 0}>\n <p class=\"k2b-content-structured-data__hidden\">\n {hiddenCount()} more row{hiddenCount() === 1 ? \"\" : \"s\"} hidden.\n </p>\n </Show>\n </Show>\n </div>\n </Show>\n\n <div class=\"k2b-content-structured-data__footer\">\n <Show when={hasData()}>\n <button type=\"button\" class=\"k2b-content-structured-data__action\" onClick={() => setMode(showRaw() ? \"formatted\" : \"raw\")}>\n {showRaw() ? structuredDataMessages().viewFormatted : structuredDataMessages().viewRaw}\n </button>\n </Show>\n </div>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -24,6 +24,7 @@ import Dropdown from "../actions/Dropdown";
24
24
  import { announce } from "../feedback/announce";
25
25
  import { useDateConfigLocale } from "../intl/locale";
26
26
  import { useUiMessages } from "../intl/messages";
27
+ import { useTimelineMessages } from "./timeline-messages";
27
28
  import { buildTimelineModel, parseTimelineTime, spanCss, spanPx, timelineDayKey, timelineHourOf } from "./timeline-model";
28
29
  /** Unit sizes of the horizontal axis, as in the stylesheet; the server and the first render use them. */
29
30
  const HORIZONTAL_UNITS = [54, 48, 160, 0, 0];
@@ -66,6 +67,7 @@ const verticalScroller = from => {
66
67
  */
67
68
  export default function Timeline(props) {
68
69
  const messages = useUiMessages();
70
+ const timelineMessages = useTimelineMessages();
69
71
  const context = useDateConfigLocale(() => ({
70
72
  ...props.dateConfig,
71
73
  timeZone: props.timeZone ?? props.dateConfig?.timeZone
@@ -124,7 +126,7 @@ export default function Timeline(props) {
124
126
  hourCycle: "h23",
125
127
  timeZone: "UTC"
126
128
  });
127
- return messages().timelineNight({
129
+ return timelineMessages().timelineNight({
128
130
  start: format.format(Date.UTC(2000, 0, 1, 22)),
129
131
  end: format.format(Date.UTC(2000, 0, 1, 6))
130
132
  });
@@ -132,13 +134,13 @@ export default function Timeline(props) {
132
134
  const spoken = entry => {
133
135
  const item = entry.item;
134
136
  const parts = [item.label];
135
- if (entry.kind === "all-day") parts.push(messages().allDay);else if (entry.end > entry.start) parts.push(messages().timelineTimeRange({
137
+ if (entry.kind === "all-day") parts.push(messages().allDay);else if (entry.end > entry.start) parts.push(timelineMessages().timelineTimeRange({
136
138
  start: formatTime(entry.start),
137
139
  end: formatTime(entry.end)
138
140
  }));else parts.push(formatTime(entry.start));
139
141
  if (item.detail) parts.push(item.detail);
140
142
  parts.push(entry.kind === "all-day" ? dayRange(entry.firstKey, entry.lastKey, longDayFormat()) : longDayFormat().format(new Date(entry.start)));
141
- if (item.checked !== undefined) parts.push(item.checked ? messages().timelineDone : messages().timelineOpen);
143
+ if (item.checked !== undefined) parts.push(item.checked ? timelineMessages().timelineDone : timelineMessages().timelineOpen);
142
144
  return parts.join(", ");
143
145
  };
144
146
  /** When an item happens, for a "+n" menu row. */
@@ -334,7 +336,7 @@ export default function Timeline(props) {
334
336
  handled();
335
337
  const happening = current();
336
338
  if (happening) focusEntry(happening);else scrollToTime(now(), "center");
337
- announce(messages().timelineNow({
339
+ announce(timelineMessages().timelineNow({
338
340
  time: formatTime(now())
339
341
  }));
340
342
  return;
@@ -626,10 +628,10 @@ export default function Timeline(props) {
626
628
  const entry = () => moreProps.entry;
627
629
  const label = () => {
628
630
  const current = entry();
629
- const count = messages().timelineMore({
631
+ const count = timelineMessages().timelineMore({
630
632
  count: current.hidden.length
631
633
  });
632
- return current.area === "all-day" ? count : `${count}, ${messages().timelineTimeRange({
634
+ return current.area === "all-day" ? count : `${count}, ${timelineMessages().timelineTimeRange({
633
635
  start: formatTime(current.start),
634
636
  end: formatTime(current.end)
635
637
  })}`;
@@ -640,7 +642,7 @@ export default function Timeline(props) {
640
642
  item
641
643
  } = hidden;
642
644
  const parts = [when(hidden), ...(item.detail ? [item.detail] : [])];
643
- const state = item.checked === undefined ? [] : [item.checked ? messages().timelineDone : messages().timelineOpen];
645
+ const state = item.checked === undefined ? [] : [item.checked ? timelineMessages().timelineDone : timelineMessages().timelineOpen];
644
646
  const icon = item.checked === undefined ? undefined : item.checked ? "ti ti-circle-check" : "ti ti-circle";
645
647
  const base = {
646
648
  label: item.label,
@@ -748,7 +750,7 @@ export default function Timeline(props) {
748
750
  get each() {
749
751
  return group().folds;
750
752
  },
751
- children: fold => _$ssr(_tmpl$0, _$ssrAttribute("data-kind", _$escape(fold().kind, true), false), _$ssrStyleProperty("--k2b-timeline-at:", _$escape(spanCss(fold().at), true)) + _$ssrStyleProperty(";--k2b-timeline-size:", _$escape(spanCss(fold().size), true)), fold().kind === "night" ? _$escape(nightLabel()) : _$escape(messages().timelineNothingPlanned))
753
+ children: fold => _$ssr(_tmpl$0, _$ssrAttribute("data-kind", _$escape(fold().kind, true), false), _$ssrStyleProperty("--k2b-timeline-at:", _$escape(spanCss(fold().at), true)) + _$ssrStyleProperty(";--k2b-timeline-size:", _$escape(spanCss(fold().size), true)), fold().kind === "night" ? _$escape(nightLabel()) : _$escape(timelineMessages().timelineNothingPlanned))
752
754
  })), _$escape(_$createComponent(Index, {
753
755
  get each() {
754
756
  return group().hours;
@@ -758,7 +760,7 @@ export default function Timeline(props) {
758
760
  get each() {
759
761
  return group().gaps;
760
762
  },
761
- children: gap => _$ssr(_tmpl$10, _$ssrAttribute("data-long", gap().long ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-past", gap().end <= now() ? "true" : _$escape(undefined, true), false), _$ssrStyleProperty("--k2b-timeline-at:", _$escape(spanCss(gap().at), true)), _$escape(messages().timelineFree({
763
+ children: gap => _$ssr(_tmpl$10, _$ssrAttribute("data-long", gap().long ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-past", gap().end <= now() ? "true" : _$escape(undefined, true), false), _$ssrStyleProperty("--k2b-timeline-at:", _$escape(spanCss(gap().at), true)), _$escape(timelineMessages().timelineFree({
762
764
  duration: hoursFormat().format(gap().hours)
763
765
  })))
764
766
  })), _$escape(_$createComponent(Index, {
@@ -792,13 +794,13 @@ export default function Timeline(props) {
792
794
  }
793
795
  })));
794
796
  };
795
- return _$ssr(_tmpl$12, `k2b-timeline ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("aria-label", _$escape(props.label ?? messages().timeline, true), false), `${_$escape(baseId, true)}-hint`, _$ssrAttribute("aria-busy", props.busy ? "true" : _$escape(undefined, true), false), _$ssrAttribute("tabindex", model().order.length === 0 ? 0 : _$escape(undefined, true), false), _$ssrStyleProperty("--k2b-timeline-length:", _$escape(spanCss(model().total), true)), _$escape(_$createComponent(For, {
797
+ return _$ssr(_tmpl$12, `k2b-timeline ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("aria-label", _$escape(props.label ?? timelineMessages().timeline, true), false), `${_$escape(baseId, true)}-hint`, _$ssrAttribute("aria-busy", props.busy ? "true" : _$escape(undefined, true), false), _$ssrAttribute("tabindex", model().order.length === 0 ? 0 : _$escape(undefined, true), false), _$ssrStyleProperty("--k2b-timeline-length:", _$escape(spanCss(model().total), true)), _$escape(_$createComponent(For, {
796
798
  get each() {
797
799
  return renderedKeys();
798
800
  },
799
801
  children: key => _$createComponent(Group, {
800
802
  key: key
801
803
  })
802
- })), _$ssrAttribute("data-hidden", nowShown() ? _$escape(undefined, true) : "true", false), _$ssrStyleProperty("--k2b-timeline-at:", _$escape(spanCss(model().posOf(now())), true)), _$escape(formatTime(now())), `${_$escape(baseId, true)}-hint`, _$escape(messages().timelineHint));
804
+ })), _$ssrAttribute("data-hidden", nowShown() ? _$escape(undefined, true) : "true", false), _$ssrStyleProperty("--k2b-timeline-at:", _$escape(spanCss(model().posOf(now())), true)), _$escape(formatTime(now())), `${_$escape(baseId, true)}-hint`, _$escape(timelineMessages().timelineHint));
803
805
  }
804
806
  //# sourceMappingURL=Timeline.js.map