@k2b/ui 0.2.0 → 0.4.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 (378) hide show
  1. package/dist/browser/actions/Button.js +11 -2
  2. package/dist/browser/actions/Button.js.map +1 -1
  3. package/dist/browser/actions/Disclosure.js +11 -8
  4. package/dist/browser/actions/Disclosure.js.map +1 -1
  5. package/dist/browser/actions/Dropdown.js +4 -1
  6. package/dist/browser/actions/Dropdown.js.map +1 -1
  7. package/dist/browser/actions/FilterChip.js +16 -2
  8. package/dist/browser/actions/FilterChip.js.map +1 -1
  9. package/dist/browser/actions/SplitButton.js +69 -22
  10. package/dist/browser/actions/SplitButton.js.map +1 -1
  11. package/dist/browser/actions/SpotlightSearch.js +3 -7
  12. package/dist/browser/actions/SpotlightSearch.js.map +1 -1
  13. package/dist/browser/actions/Tabs.js +132 -47
  14. package/dist/browser/actions/Tabs.js.map +1 -1
  15. package/dist/browser/actions/index.js +2 -2
  16. package/dist/browser/actions/index.js.map +1 -1
  17. package/dist/browser/chat/ChatComposer.js +751 -423
  18. package/dist/browser/chat/ChatComposer.js.map +1 -1
  19. package/dist/browser/chat/ChatContextPopup.js +123 -0
  20. package/dist/browser/chat/ChatContextPopup.js.map +1 -0
  21. package/dist/browser/chat/ChatPrimitives.js +141 -78
  22. package/dist/browser/chat/ChatPrimitives.js.map +1 -1
  23. package/dist/browser/chat/ChatTasks.js +112 -0
  24. package/dist/browser/chat/ChatTasks.js.map +1 -0
  25. package/dist/browser/chat/ChatTimeline.js +31 -14
  26. package/dist/browser/chat/ChatTimeline.js.map +1 -1
  27. package/dist/browser/chat/chat-behavior.js +0 -5
  28. package/dist/browser/chat/chat-behavior.js.map +1 -1
  29. package/dist/browser/chat/composer-document.js +55 -0
  30. package/dist/browser/chat/composer-document.js.map +1 -0
  31. package/dist/browser/chat/index.js +6 -1
  32. package/dist/browser/chat/index.js.map +1 -1
  33. package/dist/browser/chat/types.js.map +1 -1
  34. package/dist/browser/content/Chart.js +148 -239
  35. package/dist/browser/content/Chart.js.map +1 -1
  36. package/dist/browser/content/ChartExplorer.js +324 -0
  37. package/dist/browser/content/ChartExplorer.js.map +1 -0
  38. package/dist/browser/content/ChartExplorerControls.js +153 -0
  39. package/dist/browser/content/ChartExplorerControls.js.map +1 -0
  40. package/dist/browser/content/ChartFilterControls.js +200 -0
  41. package/dist/browser/content/ChartFilterControls.js.map +1 -0
  42. package/dist/browser/content/ChartSnapshotView.js +114 -0
  43. package/dist/browser/content/ChartSnapshotView.js.map +1 -0
  44. package/dist/browser/content/DataTable.js +48 -32
  45. package/dist/browser/content/DataTable.js.map +1 -1
  46. package/dist/browser/content/FileBrowser.js +3 -0
  47. package/dist/browser/content/FileBrowser.js.map +1 -1
  48. package/dist/browser/content/FileGrid.js +93 -0
  49. package/dist/browser/content/FileGrid.js.map +1 -0
  50. package/dist/browser/content/FileTree.js +2 -2
  51. package/dist/browser/content/FileTree.js.map +1 -1
  52. package/dist/browser/content/FileView.js +511 -162
  53. package/dist/browser/content/FileView.js.map +1 -1
  54. package/dist/browser/content/MarkdownView.js +6 -0
  55. package/dist/browser/content/MarkdownView.js.map +1 -1
  56. package/dist/browser/content/Pagination.js.map +1 -1
  57. package/dist/browser/content/PdfPreview.js +107 -90
  58. package/dist/browser/content/PdfPreview.js.map +1 -1
  59. package/dist/browser/content/chart-cursor.js +33 -0
  60. package/dist/browser/content/chart-cursor.js.map +1 -0
  61. package/dist/browser/content/chart-explorer.js +147 -0
  62. package/dist/browser/content/chart-explorer.js.map +1 -0
  63. package/dist/browser/content/chart-inspection.js +447 -0
  64. package/dist/browser/content/chart-inspection.js.map +1 -0
  65. package/dist/browser/content/chart-line-gaps.js +53 -0
  66. package/dist/browser/content/chart-line-gaps.js.map +1 -0
  67. package/dist/browser/content/chart-map-viewport.js +5 -1
  68. package/dist/browser/content/chart-map-viewport.js.map +1 -1
  69. package/dist/browser/content/chart-snapshot.js +63 -0
  70. package/dist/browser/content/chart-snapshot.js.map +1 -0
  71. package/dist/browser/content/chart-state-timeline.js +32 -4
  72. package/dist/browser/content/chart-state-timeline.js.map +1 -1
  73. package/dist/browser/content/chart-svg.js +54 -0
  74. package/dist/browser/content/chart-svg.js.map +1 -0
  75. package/dist/browser/content/collection-selection.js +109 -0
  76. package/dist/browser/content/collection-selection.js.map +1 -0
  77. package/dist/browser/content/delimited-preferences.js +21 -0
  78. package/dist/browser/content/delimited-preferences.js.map +1 -0
  79. package/dist/browser/content/file-tree.js.map +1 -1
  80. package/dist/browser/content/file-view-preview.js +11 -7
  81. package/dist/browser/content/file-view-preview.js.map +1 -1
  82. package/dist/browser/content/index.js +9 -0
  83. package/dist/browser/content/index.js.map +1 -1
  84. package/dist/browser/feedback/InlineGuidance.js +17 -3
  85. package/dist/browser/feedback/InlineGuidance.js.map +1 -1
  86. package/dist/browser/feedback/dialog-core.js +81 -7
  87. package/dist/browser/feedback/dialog-core.js.map +1 -1
  88. package/dist/browser/feedback/prompts.js +6 -0
  89. package/dist/browser/feedback/prompts.js.map +1 -1
  90. package/dist/browser/feedback/toast.js +29 -6
  91. package/dist/browser/feedback/toast.js.map +1 -1
  92. package/dist/browser/inputs/ChoiceGroups.js.map +1 -1
  93. package/dist/browser/inputs/Select.js.map +1 -1
  94. package/dist/browser/inputs/SelectChip.js +3 -2
  95. package/dist/browser/inputs/SelectChip.js.map +1 -1
  96. package/dist/browser/inputs/TextInput.js +7 -1
  97. package/dist/browser/inputs/TextInput.js.map +1 -1
  98. package/dist/browser/inputs/markdown/MarkdownEditor.js +61 -37
  99. package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
  100. package/dist/browser/inputs/markdown/behaviors.js +1 -1
  101. package/dist/browser/inputs/markdown/behaviors.js.map +1 -1
  102. package/dist/browser/intl/Format.js +89 -16
  103. package/dist/browser/intl/Format.js.map +1 -1
  104. package/dist/browser/intl/index.js.map +1 -1
  105. package/dist/browser/intl/messages.js +130 -2
  106. package/dist/browser/intl/messages.js.map +1 -1
  107. package/dist/browser/layout/AppWorkspace.js +712 -624
  108. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  109. package/dist/browser/layout/BottomSheet.js +95 -0
  110. package/dist/browser/layout/BottomSheet.js.map +1 -0
  111. package/dist/browser/layout/DetailPanel.js +56 -44
  112. package/dist/browser/layout/DetailPanel.js.map +1 -1
  113. package/dist/browser/layout/Navigation.js +278 -0
  114. package/dist/browser/layout/Navigation.js.map +1 -0
  115. package/dist/browser/layout/PanelDialog.js +219 -71
  116. package/dist/browser/layout/PanelDialog.js.map +1 -1
  117. package/dist/browser/layout/ScrollArea.js +21 -1
  118. package/dist/browser/layout/ScrollArea.js.map +1 -1
  119. package/dist/browser/layout/Settings.js.map +1 -1
  120. package/dist/browser/layout/SidebarItemPreview.js +183 -0
  121. package/dist/browser/layout/SidebarItemPreview.js.map +1 -0
  122. package/dist/browser/layout/app-workspace-controller.js +3 -0
  123. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  124. package/dist/browser/layout/app-workspace-state.js.map +1 -1
  125. package/dist/browser/layout/index.js +3 -0
  126. package/dist/browser/layout/index.js.map +1 -1
  127. package/dist/browser/layout/navigation-model.js +23 -0
  128. package/dist/browser/layout/navigation-model.js.map +1 -0
  129. package/dist/browser/layout/scroll-fade.js +100 -0
  130. package/dist/browser/layout/scroll-fade.js.map +1 -0
  131. package/dist/browser/surfaces/DescriptionList.js.map +1 -1
  132. package/dist/browser/surfaces/StatusBadge.js +2 -1
  133. package/dist/browser/surfaces/StatusBadge.js.map +1 -1
  134. package/dist/fonts/ibm-plex-mono-cyrillic-400-italic-4aded3f2f2a7d27d.woff2 +0 -0
  135. package/dist/fonts/ibm-plex-mono-cyrillic-400-normal-7635422bd10ddbbc.woff2 +0 -0
  136. package/dist/fonts/ibm-plex-mono-cyrillic-500-normal-1d89462e86cb8e87.woff2 +0 -0
  137. package/dist/fonts/ibm-plex-mono-cyrillic-600-normal-2b05a8695c7f9f4a.woff2 +0 -0
  138. package/dist/fonts/ibm-plex-mono-cyrillic-ext-400-italic-a0b3b8cbe5a516e7.woff2 +0 -0
  139. package/dist/fonts/ibm-plex-mono-cyrillic-ext-400-normal-f8c22ec1804bd696.woff2 +0 -0
  140. package/dist/fonts/ibm-plex-mono-cyrillic-ext-500-normal-3febe5c7f22e4b07.woff2 +0 -0
  141. package/dist/fonts/ibm-plex-mono-cyrillic-ext-600-normal-83109cdd4f8665b4.woff2 +0 -0
  142. package/dist/fonts/ibm-plex-mono-latin-400-italic-0840095faae86403.woff2 +0 -0
  143. package/dist/fonts/ibm-plex-mono-latin-400-normal-08949f728dc52d52.woff2 +0 -0
  144. package/dist/fonts/ibm-plex-mono-latin-500-normal-01d285447409c8a5.woff2 +0 -0
  145. package/dist/fonts/ibm-plex-mono-latin-600-normal-0d1f0b8d0722224e.woff2 +0 -0
  146. package/dist/fonts/ibm-plex-mono-latin-ext-400-italic-1b07eee6df7d26b3.woff2 +0 -0
  147. package/dist/fonts/ibm-plex-mono-latin-ext-400-normal-6bc0f226a5b7884a.woff2 +0 -0
  148. package/dist/fonts/ibm-plex-mono-latin-ext-500-normal-6bb06407c97584b0.woff2 +0 -0
  149. package/dist/fonts/ibm-plex-mono-latin-ext-600-normal-32057cf50dd14bdb.woff2 +0 -0
  150. package/dist/fonts/ibm-plex-mono-vietnamese-400-italic-a6bab38af4f9c761.woff2 +0 -0
  151. package/dist/fonts/ibm-plex-mono-vietnamese-400-normal-62632b6375305e70.woff2 +0 -0
  152. package/dist/fonts/ibm-plex-mono-vietnamese-500-normal-781633d95de88040.woff2 +0 -0
  153. package/dist/fonts/ibm-plex-mono-vietnamese-600-normal-51b74d53e106ba8a.woff2 +0 -0
  154. package/dist/fonts/ibm-plex-sans-cyrillic-400-italic-e8731a7e2b00fc4f.woff2 +0 -0
  155. package/dist/fonts/ibm-plex-sans-cyrillic-400-normal-69afad88a0740b6e.woff2 +0 -0
  156. package/dist/fonts/ibm-plex-sans-cyrillic-500-normal-200be3a2a6b1789f.woff2 +0 -0
  157. package/dist/fonts/ibm-plex-sans-cyrillic-600-normal-730becc6f005c18c.woff2 +0 -0
  158. package/dist/fonts/ibm-plex-sans-cyrillic-700-normal-40540598b4c9eb2c.woff2 +0 -0
  159. package/dist/fonts/ibm-plex-sans-cyrillic-ext-400-italic-4ffb25726a7ce4cc.woff2 +0 -0
  160. package/dist/fonts/ibm-plex-sans-cyrillic-ext-400-normal-e2580ad78906551e.woff2 +0 -0
  161. package/dist/fonts/ibm-plex-sans-cyrillic-ext-500-normal-08578d906af6d986.woff2 +0 -0
  162. package/dist/fonts/ibm-plex-sans-cyrillic-ext-600-normal-d60d3d0b182753d5.woff2 +0 -0
  163. package/dist/fonts/ibm-plex-sans-cyrillic-ext-700-normal-d07dd53642480097.woff2 +0 -0
  164. package/dist/fonts/ibm-plex-sans-greek-400-italic-1bc10b01688ba9fa.woff2 +0 -0
  165. package/dist/fonts/ibm-plex-sans-greek-400-normal-02296067bc904d2a.woff2 +0 -0
  166. package/dist/fonts/ibm-plex-sans-greek-500-normal-8cb6e20b4dbbaa5f.woff2 +0 -0
  167. package/dist/fonts/ibm-plex-sans-greek-600-normal-0a9ebd9019415ee9.woff2 +0 -0
  168. package/dist/fonts/ibm-plex-sans-greek-700-normal-c949641d10a3bebc.woff2 +0 -0
  169. package/dist/fonts/ibm-plex-sans-latin-400-italic-6de912e531b6c980.woff2 +0 -0
  170. package/dist/fonts/ibm-plex-sans-latin-400-normal-3b646991d30055a9.woff2 +0 -0
  171. package/dist/fonts/ibm-plex-sans-latin-500-normal-0717336fb31fcdcd.woff2 +0 -0
  172. package/dist/fonts/ibm-plex-sans-latin-600-normal-8960851d691c054e.woff2 +0 -0
  173. package/dist/fonts/ibm-plex-sans-latin-700-normal-42e7b0c143c19df9.woff2 +0 -0
  174. package/dist/fonts/ibm-plex-sans-latin-ext-400-italic-c5c00e8a32022dfe.woff2 +0 -0
  175. package/dist/fonts/ibm-plex-sans-latin-ext-400-normal-c93d2a12aaa280f6.woff2 +0 -0
  176. package/dist/fonts/ibm-plex-sans-latin-ext-500-normal-2846035d85100f84.woff2 +0 -0
  177. package/dist/fonts/ibm-plex-sans-latin-ext-600-normal-b25dfd4f979e442a.woff2 +0 -0
  178. package/dist/fonts/ibm-plex-sans-latin-ext-700-normal-92f0392bd74fa395.woff2 +0 -0
  179. package/dist/fonts/ibm-plex-sans-vietnamese-400-italic-675d4bace127bffb.woff2 +0 -0
  180. package/dist/fonts/ibm-plex-sans-vietnamese-400-normal-771538f7f26551bd.woff2 +0 -0
  181. package/dist/fonts/ibm-plex-sans-vietnamese-500-normal-85ba3d9c2488a813.woff2 +0 -0
  182. package/dist/fonts/ibm-plex-sans-vietnamese-600-normal-5d34b803637befe3.woff2 +0 -0
  183. package/dist/fonts/ibm-plex-sans-vietnamese-700-normal-b79d0c4b68b85007.woff2 +0 -0
  184. package/dist/plex.css +1 -1
  185. package/dist/ssr/actions/Button.js +11 -2
  186. package/dist/ssr/actions/Button.js.map +1 -1
  187. package/dist/ssr/actions/Disclosure.js +2 -2
  188. package/dist/ssr/actions/Disclosure.js.map +1 -1
  189. package/dist/ssr/actions/Dropdown.js +4 -1
  190. package/dist/ssr/actions/Dropdown.js.map +1 -1
  191. package/dist/ssr/actions/FilterChip.js +16 -2
  192. package/dist/ssr/actions/FilterChip.js.map +1 -1
  193. package/dist/ssr/actions/SplitButton.js +69 -22
  194. package/dist/ssr/actions/SplitButton.js.map +1 -1
  195. package/dist/ssr/actions/SpotlightSearch.js +3 -7
  196. package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
  197. package/dist/ssr/actions/Tabs.js +58 -11
  198. package/dist/ssr/actions/Tabs.js.map +1 -1
  199. package/dist/ssr/actions/index.js +2 -2
  200. package/dist/ssr/actions/index.js.map +1 -1
  201. package/dist/ssr/chat/ChatComposer.js +366 -134
  202. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  203. package/dist/ssr/chat/ChatContextPopup.js +86 -0
  204. package/dist/ssr/chat/ChatContextPopup.js.map +1 -0
  205. package/dist/ssr/chat/ChatPrimitives.js +49 -11
  206. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  207. package/dist/ssr/chat/ChatTasks.js +48 -0
  208. package/dist/ssr/chat/ChatTasks.js.map +1 -0
  209. package/dist/ssr/chat/ChatTimeline.js +14 -4
  210. package/dist/ssr/chat/ChatTimeline.js.map +1 -1
  211. package/dist/ssr/chat/chat-behavior.js +0 -5
  212. package/dist/ssr/chat/chat-behavior.js.map +1 -1
  213. package/dist/ssr/chat/composer-document.js +55 -0
  214. package/dist/ssr/chat/composer-document.js.map +1 -0
  215. package/dist/ssr/chat/index.js +6 -1
  216. package/dist/ssr/chat/index.js.map +1 -1
  217. package/dist/ssr/chat/types.js.map +1 -1
  218. package/dist/ssr/content/Chart.js +121 -219
  219. package/dist/ssr/content/Chart.js.map +1 -1
  220. package/dist/ssr/content/ChartExplorer.js +257 -0
  221. package/dist/ssr/content/ChartExplorer.js.map +1 -0
  222. package/dist/ssr/content/ChartExplorerControls.js +105 -0
  223. package/dist/ssr/content/ChartExplorerControls.js.map +1 -0
  224. package/dist/ssr/content/ChartFilterControls.js +139 -0
  225. package/dist/ssr/content/ChartFilterControls.js.map +1 -0
  226. package/dist/ssr/content/ChartSnapshotView.js +58 -0
  227. package/dist/ssr/content/ChartSnapshotView.js.map +1 -0
  228. package/dist/ssr/content/DataTable.js +13 -9
  229. package/dist/ssr/content/DataTable.js.map +1 -1
  230. package/dist/ssr/content/FileBrowser.js +3 -0
  231. package/dist/ssr/content/FileBrowser.js.map +1 -1
  232. package/dist/ssr/content/FileGrid.js +38 -0
  233. package/dist/ssr/content/FileGrid.js.map +1 -0
  234. package/dist/ssr/content/FileTree.js +2 -2
  235. package/dist/ssr/content/FileTree.js.map +1 -1
  236. package/dist/ssr/content/FileView.js +356 -75
  237. package/dist/ssr/content/FileView.js.map +1 -1
  238. package/dist/ssr/content/MarkdownView.js +6 -0
  239. package/dist/ssr/content/MarkdownView.js.map +1 -1
  240. package/dist/ssr/content/Pagination.js.map +1 -1
  241. package/dist/ssr/content/PdfPreview.js +37 -24
  242. package/dist/ssr/content/PdfPreview.js.map +1 -1
  243. package/dist/ssr/content/chart-cursor.js +33 -0
  244. package/dist/ssr/content/chart-cursor.js.map +1 -0
  245. package/dist/ssr/content/chart-explorer.js +147 -0
  246. package/dist/ssr/content/chart-explorer.js.map +1 -0
  247. package/dist/ssr/content/chart-inspection.js +447 -0
  248. package/dist/ssr/content/chart-inspection.js.map +1 -0
  249. package/dist/ssr/content/chart-line-gaps.js +53 -0
  250. package/dist/ssr/content/chart-line-gaps.js.map +1 -0
  251. package/dist/ssr/content/chart-map-viewport.js +5 -1
  252. package/dist/ssr/content/chart-map-viewport.js.map +1 -1
  253. package/dist/ssr/content/chart-snapshot.js +63 -0
  254. package/dist/ssr/content/chart-snapshot.js.map +1 -0
  255. package/dist/ssr/content/chart-state-timeline.js +32 -4
  256. package/dist/ssr/content/chart-state-timeline.js.map +1 -1
  257. package/dist/ssr/content/chart-svg.js +54 -0
  258. package/dist/ssr/content/chart-svg.js.map +1 -0
  259. package/dist/ssr/content/collection-selection.js +109 -0
  260. package/dist/ssr/content/collection-selection.js.map +1 -0
  261. package/dist/ssr/content/delimited-preferences.js +21 -0
  262. package/dist/ssr/content/delimited-preferences.js.map +1 -0
  263. package/dist/ssr/content/file-tree.js.map +1 -1
  264. package/dist/ssr/content/file-view-preview.js +11 -7
  265. package/dist/ssr/content/file-view-preview.js.map +1 -1
  266. package/dist/ssr/content/index.js +9 -0
  267. package/dist/ssr/content/index.js.map +1 -1
  268. package/dist/ssr/feedback/InlineGuidance.js +17 -3
  269. package/dist/ssr/feedback/InlineGuidance.js.map +1 -1
  270. package/dist/ssr/feedback/dialog-core.js +81 -7
  271. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  272. package/dist/ssr/feedback/prompts.js +6 -0
  273. package/dist/ssr/feedback/prompts.js.map +1 -1
  274. package/dist/ssr/feedback/toast.js +29 -6
  275. package/dist/ssr/feedback/toast.js.map +1 -1
  276. package/dist/ssr/inputs/ChoiceGroups.js.map +1 -1
  277. package/dist/ssr/inputs/Select.js.map +1 -1
  278. package/dist/ssr/inputs/SelectChip.js +3 -3
  279. package/dist/ssr/inputs/SelectChip.js.map +1 -1
  280. package/dist/ssr/inputs/TextInput.js.map +1 -1
  281. package/dist/ssr/inputs/markdown/MarkdownEditor.js +19 -11
  282. package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
  283. package/dist/ssr/inputs/markdown/behaviors.js +1 -1
  284. package/dist/ssr/inputs/markdown/behaviors.js.map +1 -1
  285. package/dist/ssr/intl/Format.js +61 -0
  286. package/dist/ssr/intl/Format.js.map +1 -1
  287. package/dist/ssr/intl/index.js.map +1 -1
  288. package/dist/ssr/intl/messages.js +130 -2
  289. package/dist/ssr/intl/messages.js.map +1 -1
  290. package/dist/ssr/layout/AppWorkspace.js +368 -275
  291. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  292. package/dist/ssr/layout/BottomSheet.js +43 -0
  293. package/dist/ssr/layout/BottomSheet.js.map +1 -0
  294. package/dist/ssr/layout/DetailPanel.js +11 -4
  295. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  296. package/dist/ssr/layout/Navigation.js +181 -0
  297. package/dist/ssr/layout/Navigation.js.map +1 -0
  298. package/dist/ssr/layout/PanelDialog.js +111 -26
  299. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  300. package/dist/ssr/layout/ScrollArea.js +16 -1
  301. package/dist/ssr/layout/ScrollArea.js.map +1 -1
  302. package/dist/ssr/layout/Settings.js.map +1 -1
  303. package/dist/ssr/layout/SidebarItemPreview.js +133 -0
  304. package/dist/ssr/layout/SidebarItemPreview.js.map +1 -0
  305. package/dist/ssr/layout/app-workspace-controller.js +3 -0
  306. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  307. package/dist/ssr/layout/app-workspace-state.js.map +1 -1
  308. package/dist/ssr/layout/index.js +3 -0
  309. package/dist/ssr/layout/index.js.map +1 -1
  310. package/dist/ssr/layout/navigation-model.js +23 -0
  311. package/dist/ssr/layout/navigation-model.js.map +1 -0
  312. package/dist/ssr/layout/scroll-fade.js +100 -0
  313. package/dist/ssr/layout/scroll-fade.js.map +1 -0
  314. package/dist/ssr/surfaces/DescriptionList.js.map +1 -1
  315. package/dist/ssr/surfaces/StatusBadge.js +2 -1
  316. package/dist/ssr/surfaces/StatusBadge.js.map +1 -1
  317. package/dist/styles.css +1 -1
  318. package/dist/tabler.css +1 -1
  319. package/dist/types/actions/Button.d.ts +4 -0
  320. package/dist/types/actions/Disclosure.d.ts +1 -0
  321. package/dist/types/actions/FilterChip.d.ts +4 -0
  322. package/dist/types/actions/SplitButton.d.ts +6 -0
  323. package/dist/types/actions/SpotlightSearch.d.ts +0 -4
  324. package/dist/types/actions/Tabs.d.ts +4 -0
  325. package/dist/types/actions/index.d.ts +4 -4
  326. package/dist/types/chat/ChatComposer.d.ts +20 -2
  327. package/dist/types/chat/ChatContextPopup.d.ts +6 -0
  328. package/dist/types/chat/ChatPrimitives.d.ts +4 -0
  329. package/dist/types/chat/ChatTasks.d.ts +15 -0
  330. package/dist/types/chat/ChatTimeline.d.ts +2 -0
  331. package/dist/types/chat/chat-behavior.d.ts +0 -3
  332. package/dist/types/chat/composer-document.d.ts +14 -0
  333. package/dist/types/chat/index.d.ts +8 -1
  334. package/dist/types/chat/types.d.ts +7 -0
  335. package/dist/types/content/Chart.d.ts +42 -23
  336. package/dist/types/content/ChartExplorer.d.ts +34 -0
  337. package/dist/types/content/ChartExplorerControls.d.ts +10 -0
  338. package/dist/types/content/ChartFilterControls.d.ts +21 -0
  339. package/dist/types/content/ChartSnapshotView.d.ts +11 -0
  340. package/dist/types/content/DataTable.d.ts +4 -0
  341. package/dist/types/content/FileBrowser.d.ts +1 -0
  342. package/dist/types/content/FileGrid.d.ts +21 -0
  343. package/dist/types/content/FileView.d.ts +20 -0
  344. package/dist/types/content/PdfPreview.d.ts +8 -1
  345. package/dist/types/content/chart-cursor.d.ts +15 -0
  346. package/dist/types/content/chart-explorer.d.ts +48 -0
  347. package/dist/types/content/chart-inspection.d.ts +40 -0
  348. package/dist/types/content/chart-line-gaps.d.ts +5 -0
  349. package/dist/types/content/chart-map-viewport.d.ts +1 -1
  350. package/dist/types/content/chart-snapshot.d.ts +26 -0
  351. package/dist/types/content/chart-svg.d.ts +21 -0
  352. package/dist/types/content/collection-selection.d.ts +24 -0
  353. package/dist/types/content/delimited-preferences.d.ts +11 -0
  354. package/dist/types/content/file-tree.d.ts +2 -0
  355. package/dist/types/content/file-view-preview.d.ts +4 -1
  356. package/dist/types/content/index.d.ts +16 -2
  357. package/dist/types/feedback/InlineGuidance.d.ts +1 -0
  358. package/dist/types/feedback/dialog-core.d.ts +11 -0
  359. package/dist/types/feedback/prompts.d.ts +2 -0
  360. package/dist/types/feedback/toast.d.ts +7 -1
  361. package/dist/types/inputs/markdown/MarkdownEditor.d.ts +5 -1
  362. package/dist/types/intl/Format.d.ts +9 -0
  363. package/dist/types/intl/index.d.ts +1 -1
  364. package/dist/types/intl/messages.d.ts +31 -1
  365. package/dist/types/layout/AppWorkspace.d.ts +35 -18
  366. package/dist/types/layout/BottomSheet.d.ts +23 -0
  367. package/dist/types/layout/DetailPanel.d.ts +1 -0
  368. package/dist/types/layout/Navigation.d.ts +8 -0
  369. package/dist/types/layout/PanelDialog.d.ts +14 -1
  370. package/dist/types/layout/ScrollArea.d.ts +4 -0
  371. package/dist/types/layout/Settings.d.ts +1 -1
  372. package/dist/types/layout/SidebarItemPreview.d.ts +11 -0
  373. package/dist/types/layout/index.d.ts +4 -1
  374. package/dist/types/layout/navigation-model.d.ts +48 -0
  375. package/dist/types/layout/scroll-fade.d.ts +3 -0
  376. package/dist/types/surfaces/DescriptionList.d.ts +1 -1
  377. package/dist/types/surfaces/StatusBadge.d.ts +1 -1
  378. package/package.json +5 -7
@@ -1 +1 @@
1
- {"version":3,"names":["mutation","createEffect","createMemo","createResource","createSignal","For","Match","onCleanup","Show","Switch","untrack","toast","MarkdownEditor","useUiMessages","Placeholder","CodeDisplay","fileViewExtension","getFileViewPreviewKind","parseDelimitedText","MarkdownView","StructuredDataPreview","canPreviewFile","codeLanguage","path","extension","isMarkdown","file","content","encoding","mediaType","stripFrontmatter","text","match","exec","trimStart","slice","length","OverlayAction","props","classes","_$createComponent","when","href","fallback","_$ssr","_tmpl$","_$ssrAttribute","_$escape","title","icon","children","_tmpl$2","download","OverlayPanel","_tmpl$4","actions","_tmpl$3","DownloadAction","messages","downloadHref","lastIndexOf","EditorToolButton","_tmpl$5","disabled","MarkdownRenderer","editing","setEditing","editor","edit","onClick","_tmpl$6","markdown","draft","headingScale","_","_tmpl$7","aria-label","fill","value","onValueChange","setDraft","showStats","onSave","save","saveDisabled","dirty","saving","toolbarTrailing","preview","TextRenderer","code","language","_tmpl$8","textEditor","_tmpl$9","saveShortcut","JsonRenderer","parsed","ok","JSON","parse","parsedValue","result","data","maxRows","DelimitedTextRenderer","delimiter","headers","rows","emptyFile","description","delimitedFileEmpty","_tmpl$1","each","header","index","_tmpl$10","column","number","row","_tmpl$11","_tmpl$12","truncated","_tmpl$0","previewLimited","mediaSource","previewHref","ImageRenderer","_tmpl$13","PdfRenderer","noInlinePreview","_tmpl$14","AudioRenderer","_tmpl$15","audioUnsupported","VideoRenderer","_tmpl$16","videoUnsupported","BinaryRenderer","noPreview","binaryFile","action","_tmpl$17","BUILTIN_RENDERERS","id","component","editable","_file","formatFileViewSize","bytes","toFixed","FileView","savedDraft","setSavedDraft","nativeRevision","setNativeRevision","instanceRenderers","renderers","saveMutation","create","input","onSuccess","saved","success","fileSaved","onError","error","message","nativePreviewHref","kind","separator","includes","browserPreviewContent","candidate","some","renderer","refetch","revision","abort","loaded","load","loadedDraft","registerRefresh","unregister","resolvedContent","find","onDirtyChange","loading","mutate","_tmpl$18","class","undefined","failedLoadFile","String","active","Renderer"],"sources":["content/FileView.tsx"],"sourcesContent":["/**\n * FileView — renders one file through a small renderer registry keyed by\n * media type / path. Editing is enabled purely by the presence of `save`;\n * without it every renderer is read-only. IDE-style chrome: editors reuse\n * the markdown editor's surface (toolbar with an in-toolbar save, Ctrl/Cmd+S),\n * previews are quiet paper panels with icon-only actions overlaid top-right.\n * Custom renderers are passed per instance, which keeps SSR requests and\n * independently mounted applications isolated.\n */\n\nimport { mutation } from \"@k2b/stdlib/solid\";\nimport {\n type Component,\n createEffect,\n createMemo,\n createResource,\n createSignal,\n For,\n type JSX,\n Match,\n onCleanup,\n Show,\n Switch,\n untrack,\n} from \"solid-js\";\nimport { toast } from \"../feedback/toast\";\nimport { MarkdownEditor } from \"../inputs/markdown/MarkdownEditor\";\nimport { useUiMessages } from \"../intl/messages\";\nimport Placeholder from \"../surfaces/Placeholder\";\nimport CodeDisplay, { type CodeDisplayLanguage } from \"./CodeDisplay\";\nimport { type FileViewFile, fileViewExtension, getFileViewPreviewKind, parseDelimitedText } from \"./file-view-preview\";\nimport MarkdownView from \"./MarkdownView\";\nimport StructuredDataPreview, { type StructuredDataValue } from \"./StructuredDataPreview\";\n\nexport type { FileViewFile, FileViewPreviewKind } from \"./file-view-preview\";\nexport { canPreviewFile, getFileViewPreviewKind } from \"./file-view-preview\";\nexport type FileViewContent = { encoding: \"utf8\" | \"base64\"; content: string; mediaType: string };\n\nexport type FileViewProps = {\n file: FileViewFile;\n load: () => Promise<FileViewContent>;\n /** Refetch the current path when this host-owned revision changes. */\n revision?: unknown;\n /** Register an awaitable refresh for the currently visible preview. */\n registerRefresh?: (refresh: () => Promise<void>) => void | (() => void);\n /** Presence enables editing for text-based renderers. */\n save?: (content: string) => Promise<void>;\n /** Authenticated inline URL used by browser-native image, PDF, audio, and video previews. */\n previewHref?: string | null;\n downloadHref?: string | null;\n /** App-specific renderers matched before the built-ins for this instance. */\n renderers?: readonly FileViewRenderer[];\n /** Reports local edit state so a parent browser can guard navigation. */\n onDirtyChange?: (dirty: boolean) => void;\n class?: string;\n};\n\nexport type FileViewRendererProps = {\n file: FileViewFile;\n content: FileViewContent;\n previewHref: string | null;\n downloadHref: string | null;\n /** Null when the file is read-only. */\n editor: {\n draft: () => string;\n setDraft: (value: string) => void;\n dirty: () => boolean;\n saving: () => boolean;\n save: () => Promise<void>;\n } | null;\n};\n\nexport type FileViewRenderer = {\n id: string;\n match: (file: FileViewFile, content: FileViewContent) => boolean;\n component: Component<FileViewRendererProps>;\n /** Text renderers that support the edit affordance when `save` is present. */\n editable?: boolean;\n};\n\nconst codeLanguage = (path: string): CodeDisplayLanguage => {\n const extension = fileViewExtension(path);\n if (extension === \"ts\" || extension === \"mts\" || extension === \"cts\") return \"ts\";\n if (extension === \"tsx\") return \"tsx\";\n if (extension === \"js\" || extension === \"mjs\" || extension === \"cjs\") return \"js\";\n if (extension === \"jsx\") return \"jsx\";\n if (extension === \"md\" || extension === \"markdown\") return \"md\";\n return \"text\";\n};\n\nconst isMarkdown = (file: FileViewFile, content: FileViewContent) =>\n content.encoding === \"utf8\" && getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"markdown\";\n\n/** Rendered previews hide a leading YAML frontmatter block — it's metadata, not content. */\nconst stripFrontmatter = (text: string): string => {\n const match = /^---\\r?\\n[\\s\\S]*?\\r?\\n---\\r?\\n?/.exec(text.trimStart());\n return match ? text.trimStart().slice(match[0].length) : text;\n};\n\n/** Icon-only action, IDE style — sits in the floating top-right cluster of previews. */\nfunction OverlayAction(props: { icon: string; title: string; onClick?: () => void; href?: string; download?: string }) {\n const classes = \"k2b-content-file-view__action\";\n return (\n <Show\n when={props.href}\n fallback={\n <button type=\"button\" class={classes} title={props.title} aria-label={props.title} onClick={props.onClick}>\n <i class={`ti ${props.icon}`} aria-hidden=\"true\" />\n </button>\n }\n >\n {(href) => (\n <a class={classes} href={href()} download={props.download ?? \"\"} title={props.title} aria-label={props.title}>\n <i class={`ti ${props.icon}`} aria-hidden=\"true\" />\n <span class=\"k2b-sr-only\">{props.title}</span>\n </a>\n )}\n </Show>\n );\n}\n\n/** Scrollable preview panel with the floating action cluster overlaid top-right. */\nfunction OverlayPanel(props: { actions?: JSX.Element; children: JSX.Element }) {\n return (\n <div class=\"k2b-content-file-view__panel\">\n <div class=\"k2b-content-file-view__preview\">{props.children}</div>\n <Show when={props.actions}>\n <div class=\"k2b-content-file-view__overlay\">{props.actions}</div>\n </Show>\n </div>\n );\n}\n\nconst DownloadAction = (props: FileViewRendererProps): JSX.Element => {\n const messages = useUiMessages();\n return (\n <Show when={props.downloadHref}>\n {(href) => (\n <OverlayAction\n icon=\"ti-download\"\n title={messages().download}\n href={href()}\n download={props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1)}\n />\n )}\n </Show>\n );\n};\n\n/** Toolbar-styled icon button — reuses the package markdown-editor tool primitive. */\nfunction EditorToolButton(props: { icon: string; title: string; onClick: () => void; disabled?: boolean }) {\n return (\n <button\n type=\"button\"\n class=\"k2b-markdown-editor__tool\"\n title={props.title}\n aria-label={props.title}\n tabIndex={-1}\n disabled={props.disabled}\n onMouseDown={(e) => e.preventDefault()}\n onClick={props.onClick}\n >\n <i class={props.icon} />\n </button>\n );\n}\n\n// ── Built-in renderers ──────────────────────────────────────────────────────\n\nfunction MarkdownRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const [editing, setEditing] = createSignal(false);\n return (\n <Show\n when={props.editor && editing()}\n fallback={\n <OverlayPanel\n actions={\n <>\n <Show when={props.editor}>\n <OverlayAction icon=\"ti-pencil\" title={messages().edit} onClick={() => setEditing(true)} />\n </Show>\n <DownloadAction {...props} />\n </>\n }\n >\n <div class=\"k2b-content-file-view__document\">\n <MarkdownView markdown={stripFrontmatter(props.editor?.draft() ?? props.content.content)} headingScale=\"compact\" />\n </div>\n </OverlayPanel>\n }\n >\n {(_) => {\n const editor = props.editor!;\n return (\n <div class=\"k2b-content-file-view__editor\">\n <MarkdownEditor\n class=\"k2b-content-file-view__markdown-field\"\n aria-label={`Edit ${props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1)}`}\n fill\n value={editor.draft()}\n onValueChange={editor.setDraft}\n showStats={false}\n onSave={() => void editor.save()}\n saveDisabled={!editor.dirty()}\n saving={editor.saving()}\n toolbarTrailing={<EditorToolButton icon=\"ti ti-eye\" title={messages().preview} onClick={() => setEditing(false)} />}\n />\n </div>\n );\n }}\n </Show>\n );\n}\n\nfunction TextRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n return (\n <Show\n when={props.editor}\n fallback={\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <CodeDisplay code={props.content.content} language={codeLanguage(props.file.path)} />\n </OverlayPanel>\n }\n >\n {(editor) => (\n // Same chrome as the markdown editor — literally the same classes, so\n // border, radius, focus ring, toolbar height and text metrics cannot drift.\n <div class=\"k2b-content-file-view__editor\">\n <div\n class=\"k2b-markdown-editor\"\n data-fill=\"true\"\n role=\"group\"\n aria-label={messages().textEditor}\n onKeyDown={(event) => {\n if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === \"s\") {\n event.preventDefault();\n if (editor().dirty() && !editor().saving()) void editor().save();\n }\n }}\n >\n {/* No formatting tools here — the divider under an actions-only bar reads lost. */}\n <div class=\"k2b-markdown-editor__toolbar k2b-content-file-view__code-toolbar\">\n <span class=\"k2b-content-file-view__code-language\">{codeLanguage(props.file.path)}</span>\n <span class=\"k2b-markdown-editor__trailing\">\n <Show when={props.downloadHref}>\n {(href) => (\n <a\n class=\"k2b-markdown-editor__tool\"\n href={href()}\n download={props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1)}\n title={messages().download}\n aria-label={messages().download}\n >\n <i class=\"ti ti-download\" />\n </a>\n )}\n </Show>\n <EditorToolButton\n icon={editor().saving() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-device-floppy\"}\n title={messages().saveShortcut}\n disabled={!editor().dirty() || editor().saving()}\n onClick={() => void editor().save()}\n />\n </span>\n </div>\n <div class=\"k2b-markdown-editor__surface\">\n <textarea\n class=\"k2b-content-file-view__code-input\"\n value={editor().draft()}\n spellcheck={false}\n onInput={(event) => editor().setDraft(event.currentTarget.value)}\n />\n </div>\n </div>\n </div>\n )}\n </Show>\n );\n}\n\nfunction JsonRenderer(props: FileViewRendererProps) {\n const parsed = createMemo(() => {\n try {\n return { ok: true as const, value: JSON.parse(props.content.content) as StructuredDataValue };\n } catch {\n return { ok: false as const };\n }\n });\n const parsedValue = (): StructuredDataValue => {\n const result = parsed();\n return result.ok ? result.value : null;\n };\n\n return (\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <div class=\"k2b-content-file-view__document\">\n <Show when={parsed().ok} fallback={<CodeDisplay code={props.content.content} language=\"text\" />}>\n <StructuredDataPreview data={parsedValue()} maxRows={200} />\n </Show>\n </div>\n </OverlayPanel>\n );\n}\n\nfunction DelimitedTextRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const delimiter = () =>\n fileViewExtension(props.file.path) === \"tsv\" || props.content.mediaType === \"text/tab-separated-values\" ? \"\\t\" : \",\";\n const preview = createMemo(() => parseDelimitedText(props.content.content, delimiter()));\n const headers = createMemo(() => preview().rows[0] ?? []);\n const rows = createMemo(() => preview().rows.slice(1));\n\n return (\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <Show\n when={headers().length > 0}\n fallback={<Placeholder icon=\"ti ti-table\" title={messages().emptyFile} description={messages().delimitedFileEmpty} />}\n >\n <div class=\"k2b-content-file-view__sheet\">\n <table class=\"k2b-content-file-view__table\">\n <thead>\n <tr>\n <For each={headers()}>\n {(header, index) => (\n <th scope=\"col\">\n <span>{header || messages().column({ number: index() + 1 })}</span>\n </th>\n )}\n </For>\n </tr>\n </thead>\n <tbody>\n <For each={rows()}>\n {(row) => (\n <tr>\n <For each={headers()}>{(_, index) => <td>{row[index()] ?? \"\"}</td>}</For>\n </tr>\n )}\n </For>\n </tbody>\n </table>\n <Show when={preview().truncated}>\n <p class=\"k2b-content-file-view__truncated\">{messages().previewLimited}</p>\n </Show>\n </div>\n </Show>\n </OverlayPanel>\n );\n}\n\nconst mediaSource = (props: FileViewRendererProps): string =>\n props.previewHref ?? `data:${props.content.mediaType};base64,${props.content.content}`;\n\nfunction ImageRenderer(props: FileViewRendererProps) {\n return (\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <div class=\"k2b-content-file-view__media\">\n <img src={mediaSource(props)} alt={props.file.path} />\n </div>\n </OverlayPanel>\n );\n}\n\nfunction PdfRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const href = () => props.previewHref ?? props.downloadHref;\n return (\n <Show when={href()} fallback={<Placeholder icon=\"ti ti-file-type-pdf\" title=\"PDF\" description={messages().noInlinePreview} />}>\n {(href) => <object data={href()} type=\"application/pdf\" class=\"k2b-content-file-view__pdf\" aria-label={props.file.path} />}\n </Show>\n );\n}\n\nfunction AudioRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n return (\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <div class=\"k2b-content-file-view__media\" data-kind=\"audio\">\n <audio controls preload=\"metadata\" src={mediaSource(props)} aria-label={props.file.path}>\n {messages().audioUnsupported}\n </audio>\n </div>\n </OverlayPanel>\n );\n}\n\nfunction VideoRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n return (\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <div class=\"k2b-content-file-view__media\" data-kind=\"video\">\n <video controls preload=\"metadata\" playsinline src={mediaSource(props)} aria-label={props.file.path}>\n {messages().videoUnsupported}\n </video>\n </div>\n </OverlayPanel>\n );\n}\n\nfunction BinaryRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n return (\n <Placeholder\n icon=\"ti ti-file-unknown\"\n title={messages().noPreview}\n description={props.content.mediaType || messages().binaryFile}\n action={\n <Show when={props.downloadHref}>\n {(href) => (\n <a class=\"k2b-button\" data-variant=\"secondary\" data-size=\"sm\" href={href()} download=\"\">\n <i class=\"ti ti-download\" aria-hidden=\"true\" />\n {messages().download}\n </a>\n )}\n </Show>\n }\n />\n );\n}\n\nconst BUILTIN_RENDERERS: FileViewRenderer[] = [\n { id: \"markdown\", match: isMarkdown, component: MarkdownRenderer, editable: true },\n {\n id: \"image\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"image\",\n component: ImageRenderer,\n },\n {\n id: \"pdf\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"pdf\",\n component: PdfRenderer,\n },\n {\n id: \"json\",\n match: (file, content) =>\n content.encoding === \"utf8\" && getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"json\",\n component: JsonRenderer,\n },\n {\n id: \"delimited-text\",\n match: (file, content) =>\n content.encoding === \"utf8\" &&\n getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"delimited-text\",\n component: DelimitedTextRenderer,\n },\n {\n id: \"audio\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"audio\",\n component: AudioRenderer,\n },\n {\n id: \"video\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"video\",\n component: VideoRenderer,\n },\n { id: \"text\", match: (_file, content) => content.encoding === \"utf8\", component: TextRenderer, editable: true },\n { id: \"binary\", match: () => true, component: BinaryRenderer },\n];\n\n// ── Component ───────────────────────────────────────────────────────────────\n\nexport const formatFileViewSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n};\n\nexport default function FileView(props: FileViewProps) {\n const messages = useUiMessages();\n const [draft, setDraft] = createSignal(\"\");\n const [savedDraft, setSavedDraft] = createSignal(\"\");\n const [nativeRevision, setNativeRevision] = createSignal(0);\n const dirty = createMemo(() => draft() !== savedDraft());\n const instanceRenderers = () => props.renderers ?? [];\n const saveMutation = mutation.create<{ path: string; content: string }, { path: string; content: string }>({\n mutation: async (input) => {\n await props.save!(input.content);\n return input;\n },\n onSuccess: (saved) => {\n if (props.file.path === saved.path) setSavedDraft(saved.content);\n toast.success(messages().fileSaved);\n },\n onError: (error) => toast.error(error.message),\n });\n const nativePreviewHref = createMemo(() => {\n const kind = getFileViewPreviewKind(props.file);\n const href = props.previewHref ?? (kind === \"pdf\" ? props.downloadHref : null);\n if (!href) return null;\n const separator = href.includes(\"?\") ? \"&\" : \"?\";\n return `${href}${separator}preview-revision=${nativeRevision()}`;\n });\n const browserPreviewContent = createMemo<FileViewContent | null>(() => {\n const kind = getFileViewPreviewKind(props.file);\n if (kind !== \"image\" && kind !== \"pdf\" && kind !== \"audio\" && kind !== \"video\") return null;\n const href = nativePreviewHref();\n if (!href) return null;\n\n const candidate: FileViewContent = {\n encoding: \"base64\",\n content: \"\",\n mediaType: props.file.mediaType ?? \"application/octet-stream\",\n };\n return instanceRenderers().some((renderer) => renderer.match(props.file, candidate)) ? null : candidate;\n });\n const [content, { refetch }] = createResource(\n () => (browserPreviewContent() ? null : { path: props.file.path, revision: props.revision }),\n async () => {\n saveMutation.abort();\n // `load` is an imperative source adapter. Host signal reads inside it\n // must not turn this resource into a hidden reactive feedback loop.\n const loaded = await untrack(() => props.load());\n const loadedDraft = loaded.encoding === \"utf8\" ? loaded.content : \"\";\n setDraft(loadedDraft);\n setSavedDraft(loadedDraft);\n return loaded;\n },\n );\n createEffect(() => {\n if (!props.registerRefresh) return;\n const unregister = props.registerRefresh(async () => {\n if (browserPreviewContent()) setNativeRevision((value) => value + 1);\n else await refetch();\n });\n if (unregister) onCleanup(unregister);\n });\n const resolvedContent = createMemo(() => browserPreviewContent() ?? content());\n\n const renderer = createMemo(() => {\n const loaded = resolvedContent();\n if (!loaded) return null;\n return [...instanceRenderers(), ...BUILTIN_RENDERERS].find((candidate) => candidate.match(props.file, loaded)) ?? null;\n });\n\n createEffect(() => {\n props.onDirtyChange?.(dirty());\n });\n\n const save = async () => {\n if (!props.save || saveMutation.loading()) return;\n await saveMutation.mutate({ path: props.file.path, content: draft() });\n };\n\n const editor = () =>\n props.save && renderer()?.editable && resolvedContent()?.encoding === \"utf8\"\n ? {\n draft,\n setDraft,\n dirty,\n saving: saveMutation.loading,\n save,\n }\n : null;\n\n return (\n <div class={`k2b-content-file-view ${props.class ?? \"\"}`}>\n <Switch>\n <Match when={content.loading && content() === undefined}>\n <Placeholder icon=\"ti ti-loader-2\" title={messages().loading} />\n </Match>\n <Match when={content.error}>\n <Placeholder icon=\"ti ti-alert-circle\" title={messages().failedLoadFile} description={String(content.error?.message ?? \"\")} />\n </Match>\n <Match when={resolvedContent() && renderer()}>\n {(active) => {\n const Renderer = active().component;\n return (\n <Renderer\n file={props.file}\n content={resolvedContent()!}\n previewHref={nativePreviewHref()}\n downloadHref={props.downloadHref ?? null}\n editor={editor()}\n />\n );\n }}\n </Match>\n </Switch>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["mutation","createEffect","createMemo","createResource","createSignal","For","Match","onCleanup","onMount","Show","Switch","untrack","Button","prompts","toast","MarkdownEditor","Select","useUiMessages","Placeholder","CodeDisplay","decodeDelimitedContent","readDelimitedPreferences","fileViewExtension","getFileViewPreviewKind","parseDelimitedText","MarkdownView","StructuredDataPreview","canPreviewFile","codeLanguage","path","extension","isMarkdown","file","content","encoding","mediaType","stripFrontmatter","text","match","exec","trimStart","slice","length","OverlayAction","props","classes","_$createComponent","when","href","fallback","_$ssr","_tmpl$","_$ssrAttribute","_$escape","title","icon","children","_tmpl$2","download","OverlayPanel","_tmpl$4","actions","_tmpl$3","DownloadAction","messages","downloadHref","lastIndexOf","EditorToolButton","_tmpl$5","disabled","MoreLines","count","_tmpl$6","onClick","_tmpl$7","previewMoreLines","size","variant","TextExcerpt","lines","replace","split","limit","renderer","previewLines","undefined","Math","max","join","_tmpl$8","markdown","code","language","headingScale","onExpandPreview","MarkdownRenderer","editing","setEditing","editor","edit","_tmpl$9","draft","_","_tmpl$0","aria-label","fill","value","onValueChange","setDraft","showStats","onSave","save","saveDisabled","dirty","saving","toolbarTrailing","preview","TextRenderer","_tmpl$1","textEditor","_tmpl$10","saveShortcut","JsonRenderer","parsed","ok","JSON","parse","parsedValue","result","stringify","data","maxRows","DelimitedTextRenderer","preferences","setPreferences","delimiter","view","previewPreferencesKey","localStorage","getItem","update","patch","next","setItem","page","setPage","pageSize","rows","offset","settings","dialog","_tmpl$11","label","csvEncoding","options","csvSeparator","csvDefaultSeparator","csvComma","csvSemicolon","csvTab","csvView","dataTable","csvRaw","csvSettings","headers","emptyFile","description","delimitedFileEmpty","_tmpl$12","each","header","index","_tmpl$13","column","number","row","_tmpl$14","_tmpl$15","columnsTruncated","previewColumnsLimited","totalRows","_tmpl$16","previous","min","mediaSource","previewHref","ImageRenderer","_tmpl$17","crossOrigin","PdfRenderer","noInlinePreview","_tmpl$18","AudioRenderer","_tmpl$19","audioUnsupported","VideoRenderer","_tmpl$20","videoUnsupported","BinaryRenderer","noPreview","binaryFile","action","_tmpl$21","BUILTIN_RENDERERS","id","component","editable","_file","formatFileViewSize","bytes","toFixed","FileView","savedDraft","setSavedDraft","nativeRevision","setNativeRevision","instanceRenderers","renderers","saveMutation","create","input","onSuccess","saved","success","fileSaved","onError","error","message","nativePreviewHref","kind","separator","includes","browserPreviewContent","candidate","some","refetch","revision","abort","loaded","load","loadedDraft","registerRefresh","unregister","resolvedContent","find","onDirtyChange","loading","mutate","_tmpl$22","class","failedLoadFile","String","active","Renderer","onPreviewError"],"sources":["content/FileView.tsx"],"sourcesContent":["/**\n * FileView — renders one file through a small renderer registry keyed by\n * media type / path. Editing is enabled purely by the presence of `save`;\n * without it every renderer is read-only. IDE-style chrome: editors reuse\n * the markdown editor's surface (toolbar with an in-toolbar save, Ctrl/Cmd+S),\n * previews are quiet paper panels with icon-only actions overlaid top-right.\n * Custom renderers are passed per instance, which keeps SSR requests and\n * independently mounted applications isolated.\n */\n\nimport { mutation } from \"@k2b/stdlib/solid\";\nimport {\n type Component,\n createEffect,\n createMemo,\n createResource,\n createSignal,\n For,\n type JSX,\n Match,\n onCleanup,\n onMount,\n Show,\n Switch,\n untrack,\n} from \"solid-js\";\nimport { Button } from \"../actions/Button\";\nimport { prompts } from \"../feedback/prompts\";\nimport { toast } from \"../feedback/toast\";\nimport { MarkdownEditor } from \"../inputs/markdown/MarkdownEditor\";\nimport { Select } from \"../inputs/Select\";\nimport { useUiMessages } from \"../intl/messages\";\nimport Placeholder from \"../surfaces/Placeholder\";\nimport CodeDisplay, { type CodeDisplayLanguage } from \"./CodeDisplay\";\nimport { type DelimitedPreferences, decodeDelimitedContent, readDelimitedPreferences } from \"./delimited-preferences\";\nimport { type FileViewFile, fileViewExtension, getFileViewPreviewKind, parseDelimitedText } from \"./file-view-preview\";\nimport MarkdownView from \"./MarkdownView\";\nimport StructuredDataPreview, { type StructuredDataValue } from \"./StructuredDataPreview\";\n\nexport type { FileViewFile, FileViewPreviewKind } from \"./file-view-preview\";\nexport { canPreviewFile, getFileViewPreviewKind } from \"./file-view-preview\";\nexport type FileViewContent = { encoding: \"utf8\" | \"base64\"; content: string; mediaType: string };\n\nexport type FileViewProps = {\n /** Plain previews inherit the surrounding surface without a frame or inset padding. */\n variant?: \"default\" | \"plain\";\n /** Read-only excerpt limit; omitted renders the complete preview. */\n previewLines?: number;\n onExpandPreview?: () => void;\n headingScale?: \"compact\" | \"normal\" | \"large\";\n /** Optional browser-local preference scope, owned by the host. */\n previewPreferencesKey?: string;\n file: FileViewFile;\n load: () => Promise<FileViewContent>;\n /** Refetch the current path when this host-owned revision changes. */\n revision?: unknown;\n /** Register an awaitable refresh for the currently visible preview. */\n registerRefresh?: (refresh: () => Promise<void>) => void | (() => void);\n /** Presence enables editing for text-based renderers. */\n save?: (content: string) => Promise<void>;\n /** Authenticated inline URL used by browser-native image, PDF, audio, and video previews. */\n previewHref?: string | null;\n /** CORS mode for native image/audio/video previews. Omit to preserve browser defaults. */\n crossOrigin?: \"anonymous\" | \"use-credentials\";\n /** Native media failed to load; the host can renew a signed URL and offer retry. */\n onPreviewError?: () => void;\n downloadHref?: string | null;\n /** App-specific renderers matched before the built-ins for this instance. */\n renderers?: readonly FileViewRenderer[];\n /** Reports local edit state so a parent browser can guard navigation. */\n onDirtyChange?: (dirty: boolean) => void;\n class?: string;\n};\n\nexport type FileViewRendererProps = {\n /** Read-only excerpt limit; omitted renders the complete preview. */\n previewLines?: number;\n onExpandPreview?: () => void;\n headingScale?: \"compact\" | \"normal\" | \"large\";\n /** Optional browser-local preference scope, owned by the host. */\n previewPreferencesKey?: string;\n file: FileViewFile;\n content: FileViewContent;\n previewHref: string | null;\n crossOrigin?: \"anonymous\" | \"use-credentials\";\n onPreviewError?: () => void;\n downloadHref: string | null;\n /** Null when the file is read-only. */\n editor: {\n draft: () => string;\n setDraft: (value: string) => void;\n dirty: () => boolean;\n saving: () => boolean;\n save: () => Promise<void>;\n } | null;\n};\n\nexport type FileViewRenderer = {\n id: string;\n match: (file: FileViewFile, content: FileViewContent) => boolean;\n component: Component<FileViewRendererProps>;\n /** Text renderers that support the edit affordance when `save` is present. */\n editable?: boolean;\n};\n\nconst codeLanguage = (path: string): CodeDisplayLanguage => {\n const extension = fileViewExtension(path);\n if (extension === \"ts\" || extension === \"mts\" || extension === \"cts\") return \"ts\";\n if (extension === \"tsx\") return \"tsx\";\n if (extension === \"js\" || extension === \"mjs\" || extension === \"cjs\") return \"js\";\n if (extension === \"jsx\") return \"jsx\";\n if (extension === \"md\" || extension === \"markdown\") return \"md\";\n return \"text\";\n};\n\nconst isMarkdown = (file: FileViewFile, content: FileViewContent) =>\n content.encoding === \"utf8\" && getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"markdown\";\n\n/** Rendered previews hide a leading YAML frontmatter block — it's metadata, not content. */\nconst stripFrontmatter = (text: string): string => {\n const match = /^---\\r?\\n[\\s\\S]*?\\r?\\n---\\r?\\n?/.exec(text.trimStart());\n return match ? text.trimStart().slice(match[0].length) : text;\n};\n\n/** Icon-only action, IDE style — sits in the floating top-right cluster of previews. */\nfunction OverlayAction(props: { icon: string; title: string; onClick?: () => void; href?: string; download?: string }) {\n const classes = \"k2b-content-file-view__action\";\n return (\n <Show\n when={props.href}\n fallback={\n <button type=\"button\" class={classes} title={props.title} aria-label={props.title} onClick={props.onClick}>\n <i class={`ti ${props.icon}`} aria-hidden=\"true\" />\n </button>\n }\n >\n {(href) => (\n <a class={classes} href={href()} download={props.download ?? \"\"} title={props.title} aria-label={props.title}>\n <i class={`ti ${props.icon}`} aria-hidden=\"true\" />\n <span class=\"k2b-sr-only\">{props.title}</span>\n </a>\n )}\n </Show>\n );\n}\n\n/** Scrollable preview panel with the floating action cluster overlaid top-right. */\nfunction OverlayPanel(props: { actions?: JSX.Element; children: JSX.Element }) {\n return (\n <div class=\"k2b-content-file-view__panel\">\n <div class=\"k2b-content-file-view__preview\">{props.children}</div>\n <Show when={props.actions}>\n <div class=\"k2b-content-file-view__overlay\">{props.actions}</div>\n </Show>\n </div>\n );\n}\n\nconst DownloadAction = (props: FileViewRendererProps): JSX.Element => {\n const messages = useUiMessages();\n return (\n <Show when={props.downloadHref}>\n {(href) => (\n <OverlayAction\n icon=\"ti-download\"\n title={messages().download}\n href={href()}\n download={props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1)}\n />\n )}\n </Show>\n );\n};\n\n/** Toolbar-styled icon button — reuses the package markdown-editor tool primitive. */\nfunction EditorToolButton(props: { icon: string; title: string; onClick: () => void; disabled?: boolean }) {\n return (\n <button\n type=\"button\"\n class=\"k2b-markdown-editor__tool\"\n title={props.title}\n aria-label={props.title}\n tabIndex={-1}\n disabled={props.disabled}\n onMouseDown={(e) => e.preventDefault()}\n onClick={props.onClick}\n >\n <i class={props.icon} />\n </button>\n );\n}\n\n// ── Built-in renderers ──────────────────────────────────────────────────────\n\nfunction MoreLines(props: { count: number; onClick?: () => void }) {\n const messages = useUiMessages();\n return (\n <Show when={props.count > 0}>\n <div class=\"k2b-content-file-view__truncated\">\n <Show when={props.onClick} fallback={<span>{messages().previewMoreLines(props.count)}</span>}>\n <Button size=\"sm\" variant=\"ghost\" onClick={props.onClick}>\n {messages().previewMoreLines(props.count)}\n </Button>\n </Show>\n </div>\n </Show>\n );\n}\nfunction TextExcerpt(props: { renderer: FileViewRendererProps; text: string; markdown?: boolean }) {\n const lines = createMemo(() => props.text.replace(/\\r\\n?/g, \"\\n\").replace(/\\n$/, \"\").split(\"\\n\"));\n const limit = () => (props.renderer.previewLines === undefined ? lines().length : Math.max(1, props.renderer.previewLines));\n const text = () => lines().slice(0, limit()).join(\"\\n\");\n return (\n <>\n <div classList={{ \"k2b-content-file-view__excerpt\": props.renderer.previewLines !== undefined }}>\n <Show when={props.markdown} fallback={<CodeDisplay code={text()} language={codeLanguage(props.renderer.file.path)} />}>\n <MarkdownView markdown={text()} headingScale={props.renderer.headingScale ?? \"compact\"} />\n </Show>\n </div>\n <MoreLines count={lines().length - limit()} onClick={props.renderer.onExpandPreview} />\n </>\n );\n}\n\nfunction MarkdownRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const [editing, setEditing] = createSignal(false);\n return (\n <Show\n when={props.editor && editing()}\n fallback={\n <OverlayPanel\n actions={\n <>\n <Show when={props.editor}>\n <OverlayAction icon=\"ti-pencil\" title={messages().edit} onClick={() => setEditing(true)} />\n </Show>\n <DownloadAction {...props} />\n </>\n }\n >\n <div class=\"k2b-content-file-view__document\">\n <TextExcerpt renderer={props} text={stripFrontmatter(props.editor?.draft() ?? props.content.content)} markdown />\n </div>\n </OverlayPanel>\n }\n >\n {(_) => {\n const editor = props.editor!;\n return (\n <div class=\"k2b-content-file-view__editor\">\n <MarkdownEditor\n class=\"k2b-content-file-view__markdown-field\"\n aria-label={`Edit ${props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1)}`}\n fill\n value={editor.draft()}\n onValueChange={editor.setDraft}\n showStats={false}\n onSave={() => void editor.save()}\n saveDisabled={!editor.dirty()}\n saving={editor.saving()}\n toolbarTrailing={<EditorToolButton icon=\"ti ti-eye\" title={messages().preview} onClick={() => setEditing(false)} />}\n />\n </div>\n );\n }}\n </Show>\n );\n}\n\nfunction TextRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n return (\n <Show\n when={props.editor}\n fallback={\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <TextExcerpt renderer={props} text={props.content.content} />\n </OverlayPanel>\n }\n >\n {(editor) => (\n // Same chrome as the markdown editor — literally the same classes, so\n // border, radius, focus ring, toolbar height and text metrics cannot drift.\n <div class=\"k2b-content-file-view__editor\">\n <div\n class=\"k2b-markdown-editor\"\n data-fill=\"true\"\n role=\"group\"\n aria-label={messages().textEditor}\n onKeyDown={(event) => {\n if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === \"s\") {\n event.preventDefault();\n if (editor().dirty() && !editor().saving()) void editor().save();\n }\n }}\n >\n {/* No formatting tools here — the divider under an actions-only bar reads lost. */}\n <div class=\"k2b-markdown-editor__toolbar k2b-content-file-view__code-toolbar\">\n <span class=\"k2b-content-file-view__code-language\">{codeLanguage(props.file.path)}</span>\n <span class=\"k2b-markdown-editor__trailing\">\n <Show when={props.downloadHref}>\n {(href) => (\n <a\n class=\"k2b-markdown-editor__tool\"\n href={href()}\n download={props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1)}\n title={messages().download}\n aria-label={messages().download}\n >\n <i class=\"ti ti-download\" />\n </a>\n )}\n </Show>\n <EditorToolButton\n icon={editor().saving() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-device-floppy\"}\n title={messages().saveShortcut}\n disabled={!editor().dirty() || editor().saving()}\n onClick={() => void editor().save()}\n />\n </span>\n </div>\n <div class=\"k2b-markdown-editor__surface\">\n <textarea\n class=\"k2b-content-file-view__code-input\"\n value={editor().draft()}\n spellcheck={false}\n onInput={(event) => editor().setDraft(event.currentTarget.value)}\n />\n </div>\n </div>\n </div>\n )}\n </Show>\n );\n}\n\nfunction JsonRenderer(props: FileViewRendererProps) {\n const parsed = createMemo(() => {\n try {\n return { ok: true as const, value: JSON.parse(props.content.content) as StructuredDataValue };\n } catch {\n return { ok: false as const };\n }\n });\n const parsedValue = (): StructuredDataValue => {\n const result = parsed();\n return result.ok ? result.value : null;\n };\n\n return (\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <div class=\"k2b-content-file-view__document\">\n <Show when={parsed().ok} fallback={<TextExcerpt renderer={props} text={props.content.content} />}>\n <Show\n when={props.previewLines === undefined}\n fallback={<TextExcerpt renderer={props} text={JSON.stringify(parsedValue(), null, 2)} />}\n >\n <StructuredDataPreview data={parsedValue()} maxRows={200} />\n </Show>\n </Show>\n </div>\n </OverlayPanel>\n );\n}\n\nfunction DelimitedTextRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const [preferences, setPreferences] = createSignal<DelimitedPreferences>({ encoding: \"utf-8\", delimiter: \"auto\", view: \"table\" });\n onMount(() => {\n if (!props.previewPreferencesKey) return;\n try {\n setPreferences(readDelimitedPreferences(localStorage.getItem(props.previewPreferencesKey)));\n } catch {\n /* Storage may be disabled. */\n }\n });\n const update = (patch: Partial<DelimitedPreferences>) => {\n const next = { ...preferences(), ...patch };\n setPreferences(next);\n if (props.previewPreferencesKey) {\n try {\n localStorage.setItem(props.previewPreferencesKey, JSON.stringify(next));\n } catch {\n /* Keep the local selection. */\n }\n }\n };\n const text = createMemo(() => decodeDelimitedContent(props.content, preferences().encoding));\n const delimiter = () =>\n preferences().delimiter === \"auto\"\n ? fileViewExtension(props.file.path) === \"tsv\" || props.content.mediaType === \"text/tab-separated-values\"\n ? \"\\t\"\n : \",\"\n : preferences().delimiter;\n const [page, setPage] = createSignal(0);\n createEffect(() => {\n text();\n delimiter();\n props.previewLines;\n setPage(0);\n });\n const pageSize = () => (props.previewLines === undefined ? 200 : Math.max(1, props.previewLines));\n const preview = createMemo(() => parseDelimitedText(text(), delimiter(), { rows: pageSize() + 1, offset: page() * pageSize() }));\n const settings = () =>\n prompts.dialog(\n () => (\n <div class=\"k2b-content-file-view__settings\">\n <Select\n label={messages().csvEncoding}\n value={preferences().encoding}\n disabled={props.content.encoding !== \"base64\"}\n options={[\"utf-8\", \"windows-1252\", \"utf-16le\", \"utf-16be\"]}\n onValueChange={(value) => {\n if (value) update({ encoding: value });\n }}\n />\n <Select\n label={messages().csvSeparator}\n value={preferences().delimiter}\n options={[\n { value: \"auto\", label: messages().csvDefaultSeparator },\n { value: \",\", label: messages().csvComma },\n { value: \";\", label: messages().csvSemicolon },\n { value: \"\\t\", label: messages().csvTab },\n { value: \"|\", label: \"|\" },\n ]}\n onValueChange={(value) => {\n if (value) update({ delimiter: value });\n }}\n />\n <Select\n label={messages().csvView}\n value={preferences().view}\n options={[\n { value: \"table\", label: messages().dataTable },\n { value: \"raw\", label: messages().csvRaw },\n ]}\n onValueChange={(value) => {\n if (value === \"table\" || value === \"raw\") update({ view: value });\n }}\n />\n </div>\n ),\n { title: messages().csvSettings },\n );\n const headers = createMemo(() => preview().rows[0] ?? []);\n const rows = createMemo(() => preview().rows.slice(1));\n\n return (\n <OverlayPanel\n actions={\n <>\n <OverlayAction icon=\"ti-adjustments-horizontal\" title={messages().csvSettings} onClick={() => void settings()} />\n <DownloadAction {...props} />\n </>\n }\n >\n <Show when={preferences().view === \"table\"} fallback={<TextExcerpt renderer={props} text={text()} />}>\n <Show\n when={headers().length > 0}\n fallback={<Placeholder icon=\"ti ti-table\" title={messages().emptyFile} description={messages().delimitedFileEmpty} />}\n >\n <div class=\"k2b-content-file-view__sheet\">\n <table class=\"k2b-content-file-view__table\">\n <thead>\n <tr>\n <For each={headers()}>\n {(header, index) => (\n <th scope=\"col\">\n <span>{header || messages().column({ number: index() + 1 })}</span>\n </th>\n )}\n </For>\n </tr>\n </thead>\n <tbody>\n <For each={rows()}>\n {(row) => (\n <tr>\n <For each={headers()}>{(_, index) => <td>{row[index()] ?? \"\"}</td>}</For>\n </tr>\n )}\n </For>\n </tbody>\n </table>\n <Show when={preview().columnsTruncated}>\n <div class=\"k2b-content-file-view__truncated\">{messages().previewColumnsLimited}</div>\n </Show>\n <Show\n when={props.previewLines !== undefined}\n fallback={\n <Show when={preview().totalRows > 201}>\n <div class=\"k2b-content-file-view__pagination\">\n <Button size=\"sm\" variant=\"ghost\" disabled={page() === 0} onClick={() => setPage(page() - 1)}>\n {messages().previous}\n </Button>\n <span>\n {page() * pageSize() + 1}–{Math.min((page() + 1) * pageSize(), preview().totalRows - 1)} / {preview().totalRows - 1}\n </span>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={(page() + 1) * pageSize() >= preview().totalRows - 1}\n onClick={() => setPage(page() + 1)}\n >\n {messages().next}\n </Button>\n </div>\n </Show>\n }\n >\n <MoreLines count={preview().totalRows - rows().length - 1} onClick={props.onExpandPreview} />\n </Show>\n </div>\n </Show>\n </Show>\n </OverlayPanel>\n );\n}\n\nconst mediaSource = (props: FileViewRendererProps): string =>\n props.previewHref ?? `data:${props.content.mediaType};base64,${props.content.content}`;\n\nfunction ImageRenderer(props: FileViewRendererProps) {\n return (\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <div class=\"k2b-content-file-view__media\">\n <img crossOrigin={props.crossOrigin} onError={props.onPreviewError} src={mediaSource(props)} alt={props.file.path} />\n </div>\n </OverlayPanel>\n );\n}\n\nfunction PdfRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const href = () => props.previewHref ?? props.downloadHref;\n return (\n <Show when={href()} fallback={<Placeholder icon=\"ti ti-file-type-pdf\" title=\"PDF\" description={messages().noInlinePreview} />}>\n {(href) => <object data={href()} type=\"application/pdf\" class=\"k2b-content-file-view__pdf\" aria-label={props.file.path} />}\n </Show>\n );\n}\n\nfunction AudioRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n return (\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <div class=\"k2b-content-file-view__media\" data-kind=\"audio\">\n <audio\n crossOrigin={props.crossOrigin}\n onError={props.onPreviewError}\n controls\n preload=\"metadata\"\n src={mediaSource(props)}\n aria-label={props.file.path}\n >\n {messages().audioUnsupported}\n </audio>\n </div>\n </OverlayPanel>\n );\n}\n\nfunction VideoRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n return (\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <div class=\"k2b-content-file-view__media\" data-kind=\"video\">\n <video\n crossOrigin={props.crossOrigin}\n onError={props.onPreviewError}\n controls\n preload=\"metadata\"\n playsinline\n src={mediaSource(props)}\n aria-label={props.file.path}\n >\n {messages().videoUnsupported}\n </video>\n </div>\n </OverlayPanel>\n );\n}\n\nfunction BinaryRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n return (\n <Placeholder\n icon=\"ti ti-file-unknown\"\n title={messages().noPreview}\n description={props.content.mediaType || messages().binaryFile}\n action={\n <Show when={props.downloadHref}>\n {(href) => (\n <a class=\"k2b-button\" data-variant=\"secondary\" data-size=\"sm\" href={href()} download=\"\">\n <i class=\"ti ti-download\" aria-hidden=\"true\" />\n {messages().download}\n </a>\n )}\n </Show>\n }\n />\n );\n}\n\nconst BUILTIN_RENDERERS: FileViewRenderer[] = [\n { id: \"markdown\", match: isMarkdown, component: MarkdownRenderer, editable: true },\n {\n id: \"image\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"image\",\n component: ImageRenderer,\n },\n {\n id: \"pdf\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"pdf\",\n component: PdfRenderer,\n },\n {\n id: \"json\",\n match: (file, content) =>\n content.encoding === \"utf8\" && getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"json\",\n component: JsonRenderer,\n },\n {\n id: \"delimited-text\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"delimited-text\",\n component: DelimitedTextRenderer,\n },\n {\n id: \"audio\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"audio\",\n component: AudioRenderer,\n },\n {\n id: \"video\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"video\",\n component: VideoRenderer,\n },\n { id: \"text\", match: (_file, content) => content.encoding === \"utf8\", component: TextRenderer, editable: true },\n { id: \"binary\", match: () => true, component: BinaryRenderer },\n];\n\n// ── Component ───────────────────────────────────────────────────────────────\n\nexport const formatFileViewSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n};\n\nexport default function FileView(props: FileViewProps) {\n const messages = useUiMessages();\n const [draft, setDraft] = createSignal(\"\");\n const [savedDraft, setSavedDraft] = createSignal(\"\");\n const [nativeRevision, setNativeRevision] = createSignal(0);\n const dirty = createMemo(() => draft() !== savedDraft());\n const instanceRenderers = () => props.renderers ?? [];\n const saveMutation = mutation.create<{ path: string; content: string }, { path: string; content: string }>({\n mutation: async (input) => {\n await props.save!(input.content);\n return input;\n },\n onSuccess: (saved) => {\n if (props.file.path === saved.path) setSavedDraft(saved.content);\n toast.success(messages().fileSaved);\n },\n onError: (error) => toast.error(error.message),\n });\n const nativePreviewHref = createMemo(() => {\n const kind = getFileViewPreviewKind(props.file);\n const href = props.previewHref ?? (kind === \"pdf\" ? props.downloadHref : null);\n if (!href) return null;\n const separator = href.includes(\"?\") ? \"&\" : \"?\";\n return `${href}${separator}preview-revision=${nativeRevision()}`;\n });\n const browserPreviewContent = createMemo<FileViewContent | null>(() => {\n const kind = getFileViewPreviewKind(props.file);\n if (kind !== \"image\" && kind !== \"pdf\" && kind !== \"audio\" && kind !== \"video\") return null;\n const href = nativePreviewHref();\n if (!href) return null;\n\n const candidate: FileViewContent = {\n encoding: \"base64\",\n content: \"\",\n mediaType: props.file.mediaType ?? \"application/octet-stream\",\n };\n return instanceRenderers().some((renderer) => renderer.match(props.file, candidate)) ? null : candidate;\n });\n const [content, { refetch }] = createResource(\n () => (browserPreviewContent() ? null : { path: props.file.path, revision: props.revision }),\n async () => {\n saveMutation.abort();\n // `load` is an imperative source adapter. Host signal reads inside it\n // must not turn this resource into a hidden reactive feedback loop.\n const loaded = await untrack(() => props.load());\n const loadedDraft = loaded.encoding === \"utf8\" ? loaded.content : \"\";\n setDraft(loadedDraft);\n setSavedDraft(loadedDraft);\n return loaded;\n },\n );\n createEffect(() => {\n if (!props.registerRefresh) return;\n const unregister = props.registerRefresh(async () => {\n if (browserPreviewContent()) setNativeRevision((value) => value + 1);\n else await refetch();\n });\n if (unregister) onCleanup(unregister);\n });\n const resolvedContent = createMemo(() => browserPreviewContent() ?? content());\n\n const renderer = createMemo(() => {\n const loaded = resolvedContent();\n if (!loaded) return null;\n return [...instanceRenderers(), ...BUILTIN_RENDERERS].find((candidate) => candidate.match(props.file, loaded)) ?? null;\n });\n\n createEffect(() => {\n props.onDirtyChange?.(dirty());\n });\n\n const save = async () => {\n if (!props.save || saveMutation.loading()) return;\n await saveMutation.mutate({ path: props.file.path, content: draft() });\n };\n\n const editor = () =>\n props.save && renderer()?.editable && resolvedContent()?.encoding === \"utf8\"\n ? {\n draft,\n setDraft,\n dirty,\n saving: saveMutation.loading,\n save,\n }\n : null;\n\n return (\n <div\n class={`k2b-content-file-view ${props.class ?? \"\"}`}\n data-variant={props.variant}\n data-excerpt={props.previewLines !== undefined ? \"true\" : undefined}\n >\n <Switch>\n <Match when={content.loading && content() === undefined}>\n <Placeholder icon=\"ti ti-loader-2\" title={messages().loading} />\n </Match>\n <Match when={content.error}>\n <Placeholder icon=\"ti ti-alert-circle\" title={messages().failedLoadFile} description={String(content.error?.message ?? \"\")} />\n </Match>\n <Match when={resolvedContent() && renderer()}>\n {(active) => {\n const Renderer = active().component;\n return (\n <Renderer\n previewLines={props.previewLines}\n onExpandPreview={props.onExpandPreview}\n headingScale={props.headingScale}\n previewPreferencesKey={props.previewPreferencesKey}\n file={props.file}\n content={resolvedContent()!}\n previewHref={nativePreviewHref()}\n crossOrigin={props.crossOrigin}\n onPreviewError={props.onPreviewError}\n downloadHref={props.downloadHref ?? null}\n editor={editor()}\n />\n );\n }}\n </Match>\n </Switch>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,QAAQ,QAAQ,mBAAmB;AAC5C,SAEEC,YAAY,EACZC,UAAU,EACVC,cAAc,EACdC,YAAY,EACZC,GAAG,EAEHC,KAAK,EACLC,SAAS,EACTC,OAAO,EACPC,IAAI,EACJC,MAAM,EACNC,OAAO,QACF,UAAU;AACjB,SAASC,MAAM,QAAQ,mBAAmB;AAC1C,SAASC,OAAO,QAAQ,qBAAqB;AAC7C,SAASC,KAAK,QAAQ,mBAAmB;AACzC,SAASC,cAAc,QAAQ,mCAAmC;AAClE,SAASC,MAAM,QAAQ,kBAAkB;AACzC,SAASC,aAAa,QAAQ,kBAAkB;AAChD,OAAOC,WAAW,MAAM,yBAAyB;AACjD,OAAOC,WAAW,MAAoC,eAAe;AACrE,SAAoCC,sBAAsB,EAAEC,wBAAwB,QAAQ,yBAAyB;AACrH,SAA4BC,iBAAiB,EAAEC,sBAAsB,EAAEC,kBAAkB,QAAQ,qBAAqB;AACtH,OAAOC,YAAY,MAAM,gBAAgB;AACzC,OAAOC,qBAAqB,MAAoC,yBAAyB;AAGzF,SAASC,cAAc,EAAEJ,sBAAsB,QAAQ,qBAAqB;AAiE5E,MAAMK,YAAY,GAAIC,IAAY,IAA0B;EAC1D,MAAMC,SAAS,GAAGR,iBAAiB,CAACO,IAAI,CAAC;EACzC,IAAIC,SAAS,KAAK,IAAI,IAAIA,SAAS,KAAK,KAAK,IAAIA,SAAS,KAAK,KAAK,EAAE,OAAO,IAAI;EACjF,IAAIA,SAAS,KAAK,KAAK,EAAE,OAAO,KAAK;EACrC,IAAIA,SAAS,KAAK,IAAI,IAAIA,SAAS,KAAK,KAAK,IAAIA,SAAS,KAAK,KAAK,EAAE,OAAO,IAAI;EACjF,IAAIA,SAAS,KAAK,KAAK,EAAE,OAAO,KAAK;EACrC,IAAIA,SAAS,KAAK,IAAI,IAAIA,SAAS,KAAK,UAAU,EAAE,OAAO,IAAI;EAC/D,OAAO,MAAM;AACf,CAAC;AAED,MAAMC,UAAU,GAAGA,CAACC,IAAkB,EAAEC,OAAwB,KAC9DA,OAAO,CAACC,QAAQ,KAAK,MAAM,IAAIX,sBAAsB,CAAC;EAAE,GAAGS,IAAI;EAAEG,SAAS,EAAEF,OAAO,CAACE,SAAS,IAAIH,IAAI,CAACG;AAAU,CAAC,CAAC,KAAK,UAAU;;AAEnI;AACA,MAAMC,gBAAgB,GAAIC,IAAY,IAAa;EACjD,MAAMC,KAAK,GAAG,iCAAiC,CAACC,IAAI,CAACF,IAAI,CAACG,SAAS,CAAC,CAAC,CAAC;EACtE,OAAOF,KAAK,GAAGD,IAAI,CAACG,SAAS,CAAC,CAAC,CAACC,KAAK,CAACH,KAAK,CAAC,CAAC,CAAC,CAACI,MAAM,CAAC,GAAGL,IAAI;AAC/D,CAAC;;AAED;AACA,SAASM,aAAaA,CAACC,KAA8F,EAAE;EACrH,MAAMC,OAAO,GAAG,+BAA+B;EAC/C,OAAAC,iBAAA,CACGrC,IAAI;IAAA,IACHsC,IAAIA,CAAA;MAAA,OAAEH,KAAK,CAACI,IAAI;IAAA;IAAA,IAChBC,QAAQA,CAAA;MAAA,OAAAC,KAAA,CAAAC,MAAA,EAAAC,cAAA,UAAAC,QAAA,CACuCT,KAAK,CAACU,KAAK,kBAAAF,cAAA,eAAAC,QAAA,CAAcT,KAAK,CAACU,KAAK,iBACrE,MAAAD,QAAA,CAAMT,KAAK,CAACW,IAAI,SAAE;IAAA;IAAAC,QAAA,EAI9BR,IAAI,IAAAE,KAAA,CAAAO,OAAA,EAAAL,cAAA,SAAAC,QAAA,CACqBL,IAAI,CAAC,CAAC,kBAAAI,cAAA,aAAAC,QAAA,CAAYT,KAAK,CAACc,QAAQ,IAAI,EAAE,kBAAAN,cAAA,UAAAC,QAAA,CAAST,KAAK,CAACU,KAAK,kBAAAF,cAAA,eAAAC,QAAA,CAAcT,KAAK,CAACU,KAAK,iBAChG,MAAAD,QAAA,CAAMT,KAAK,CAACW,IAAI,SAAE,EAAAF,QAAA,CACDT,KAAK,CAACU,KAAK;EAEzC;AAGP;;AAEA;AACA,SAASK,YAAYA,CAACf,KAAuD,EAAE;EAC7E,OAAAM,KAAA,CAAAU,OAAA,EAAAP,QAAA,CAEiDT,KAAK,CAACY,QAAQ,GAAAH,QAAA,CAAAP,iBAAA,CAC1DrC,IAAI;IAAA,IAACsC,IAAIA,CAAA;MAAA,OAAEH,KAAK,CAACiB,OAAO;IAAA;IAAA,IAAAL,SAAA;MAAA,OAAAN,KAAA,CAAAY,OAAA,EAAAT,QAAA,CACsBT,KAAK,CAACiB,OAAO;IAAA;EAAA;AAIlE;AAEA,MAAME,cAAc,GAAInB,KAA4B,IAAkB;EACpE,MAAMoB,QAAQ,GAAG/C,aAAa,CAAC,CAAC;EAChC,OAAA6B,iBAAA,CACGrC,IAAI;IAAA,IAACsC,IAAIA,CAAA;MAAA,OAAEH,KAAK,CAACqB,YAAY;IAAA;IAAAT,QAAA,EAC1BR,IAAI,IAAAF,iBAAA,CACHH,aAAa;MACZY,IAAI;MAAA,IACJD,KAAKA,CAAA;QAAA,OAAEU,QAAQ,CAAC,CAAC,CAACN,QAAQ;MAAA;MAAA,IAC1BV,IAAIA,CAAA;QAAA,OAAEA,IAAI,CAAC,CAAC;MAAA;MAAA,IACZU,QAAQA,CAAA;QAAA,OAAEd,KAAK,CAACZ,IAAI,CAACH,IAAI,CAACY,KAAK,CAACG,KAAK,CAACZ,IAAI,CAACH,IAAI,CAACqC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;MAAA;IAAA;EAExE;AAGP,CAAC;;AAED;AACA,SAASC,gBAAgBA,CAACvB,KAA+E,EAAE;EACzG,OAAAM,KAAA,CAAAkB,OAAA,EAAAhB,cAAA,UAAAC,QAAA,CAIWT,KAAK,CAACU,KAAK,kBAAAF,cAAA,eAAAC,QAAA,CACNT,KAAK,CAACU,KAAK,iBAAAF,cAAA,aAEbR,KAAK,CAACyB,QAAQ,SAAAjB,cAAA,UAAAC,QAAA,CAIdT,KAAK,CAACW,IAAI;AAG1B;;AAEA;;AAEA,SAASe,SAASA,CAAC1B,KAA8C,EAAE;EACjE,MAAMoB,QAAQ,GAAG/C,aAAa,CAAC,CAAC;EAChC,OAAA6B,iBAAA,CACGrC,IAAI;IAAA,IAACsC,IAAIA,CAAA;MAAA,OAAEH,KAAK,CAAC2B,KAAK,GAAG,CAAC;IAAA;IAAA,IAAAf,SAAA;MAAA,OAAAN,KAAA,CAAAsB,OAAA,EAAAnB,QAAA,CAAAP,iBAAA,CAEtBrC,IAAI;QAAA,IAACsC,IAAIA,CAAA;UAAA,OAAEH,KAAK,CAAC6B,OAAO;QAAA;QAAA,IAAExB,QAAQA,CAAA;UAAA,OAAAC,KAAA,CAAAwB,OAAA,EAAArB,QAAA,CAASW,QAAQ,CAAC,CAAC,CAACW,gBAAgB,CAAC/B,KAAK,CAAC2B,KAAK,CAAC;QAAA;QAAA,IAAAf,SAAA;UAAA,OAAAV,iBAAA,CACjFlC,MAAM;YAACgE,IAAI;YAAMC,OAAO;YAAA,IAASJ,OAAOA,CAAA;cAAA,OAAE7B,KAAK,CAAC6B,OAAO;YAAA;YAAA,IAAAjB,SAAA;cAAA,OACrDQ,QAAQ,CAAC,CAAC,CAACW,gBAAgB,CAAC/B,KAAK,CAAC2B,KAAK,CAAC;YAAA;UAAA;QAAA;MAAA;IAAA;EAAA;AAMrD;AACA,SAASO,WAAWA,CAAClC,KAA4E,EAAE;EACjG,MAAMmC,KAAK,GAAG7E,UAAU,CAAC,MAAM0C,KAAK,CAACP,IAAI,CAAC2C,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAACA,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAACC,KAAK,CAAC,IAAI,CAAC,CAAC;EACjG,MAAMC,KAAK,GAAGA,CAAA,KAAOtC,KAAK,CAACuC,QAAQ,CAACC,YAAY,KAAKC,SAAS,GAAGN,KAAK,CAAC,CAAC,CAACrC,MAAM,GAAG4C,IAAI,CAACC,GAAG,CAAC,CAAC,EAAE3C,KAAK,CAACuC,QAAQ,CAACC,YAAY,CAAE;EAC3H,MAAM/C,IAAI,GAAGA,CAAA,KAAM0C,KAAK,CAAC,CAAC,CAACtC,KAAK,CAAC,CAAC,EAAEyC,KAAK,CAAC,CAAC,CAAC,CAACM,IAAI,CAAC,IAAI,CAAC;EACvD,QAAAtC,KAAA,CAAAuC,OAAA,EAEwD7C,KAAK,CAACuC,QAAQ,CAACC,YAAY,KAAKC,SAAS,0CAAAhC,QAAA,CAAAP,iBAAA,CAC1FrC,IAAI;IAAA,IAACsC,IAAIA,CAAA;MAAA,OAAEH,KAAK,CAAC8C,QAAQ;IAAA;IAAA,IAAEzC,QAAQA,CAAA;MAAA,OAAAH,iBAAA,CAAG3B,WAAW;QAAA,IAACwE,IAAIA,CAAA;UAAA,OAAEtD,IAAI,CAAC,CAAC;QAAA;QAAA,IAAEuD,QAAQA,CAAA;UAAA,OAAEhE,YAAY,CAACgB,KAAK,CAACuC,QAAQ,CAACnD,IAAI,CAACH,IAAI,CAAC;QAAA;MAAA;IAAA;IAAA,IAAA2B,SAAA;MAAA,OAAAV,iBAAA,CAC9GrB,YAAY;QAAA,IAACiE,QAAQA,CAAA;UAAA,OAAErD,IAAI,CAAC,CAAC;QAAA;QAAA,IAAEwD,YAAYA,CAAA;UAAA,OAAEjD,KAAK,CAACuC,QAAQ,CAACU,YAAY,IAAI,SAAS;QAAA;MAAA;IAAA;EAAA,MAAA/C,iBAAA,CAGzFwB,SAAS;IAAA,IAACC,KAAKA,CAAA;MAAA,OAAEQ,KAAK,CAAC,CAAC,CAACrC,MAAM,GAAGwC,KAAK,CAAC,CAAC;IAAA;IAAA,IAAET,OAAOA,CAAA;MAAA,OAAE7B,KAAK,CAACuC,QAAQ,CAACW,eAAe;IAAA;EAAA;AAGzF;AAEA,SAASC,gBAAgBA,CAACnD,KAA4B,EAAE;EACtD,MAAMoB,QAAQ,GAAG/C,aAAa,CAAC,CAAC;EAChC,MAAM,CAAC+E,OAAO,EAAEC,UAAU,CAAC,GAAG7F,YAAY,CAAC,KAAK,CAAC;EACjD,OAAA0C,iBAAA,CACGrC,IAAI;IAAA,IACHsC,IAAIA,CAAA;MAAA,OAAEH,KAAK,CAACsD,MAAM,IAAIF,OAAO,CAAC,CAAC;IAAA;IAAA,IAC/B/C,QAAQA,CAAA;MAAA,OAAAH,iBAAA,CACLa,YAAY;QAAA,IACXE,OAAOA,CAAA;UAAA,QAAAf,iBAAA,CAEFrC,IAAI;YAAA,IAACsC,IAAIA,CAAA;cAAA,OAAEH,KAAK,CAACsD,MAAM;YAAA;YAAA,IAAA1C,SAAA;cAAA,OAAAV,iBAAA,CACrBH,aAAa;gBAACY,IAAI;gBAAA,IAAaD,KAAKA,CAAA;kBAAA,OAAEU,QAAQ,CAAC,CAAC,CAACmC,IAAI;gBAAA;gBAAE1B,OAAO,EAAEA,CAAA,KAAMwB,UAAU,CAAC,IAAI;cAAC;YAAA;UAAA,IAAAnD,iBAAA,CAExFiB,cAAc,EAAKnB,KAAK;QAAA;QAAA,IAAAY,SAAA;UAAA,OAAAN,KAAA,CAAAkD,OAAA,EAAA/C,QAAA,CAAAP,iBAAA,CAK1BgC,WAAW;YAACK,QAAQ,EAAEvC,KAAK;YAAA,IAAEP,IAAIA,CAAA;cAAA,OAAED,gBAAgB,CAACQ,KAAK,CAACsD,MAAM,EAAEG,KAAK,CAAC,CAAC,IAAIzD,KAAK,CAACX,OAAO,CAACA,OAAO,CAAC;YAAA;YAAEyD,QAAQ;UAAA;QAAA;MAAA;IAAA;IAAAlC,QAAA,EAKlH8C,CAAC,IAAK;MACN,MAAMJ,MAAM,GAAGtD,KAAK,CAACsD,MAAO;MAC5B,OAAAhD,KAAA,CAAAqD,OAAA,EAAAlD,QAAA,CAAAP,iBAAA,CAEK/B,cAAc;QAAA;QAAA,kBAAAyF,CAAA;UAAA,OAED,QAAQ5D,KAAK,CAACZ,IAAI,CAACH,IAAI,CAACY,KAAK,CAACG,KAAK,CAACZ,IAAI,CAACH,IAAI,CAACqC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE;QAAA;QACjFuC,IAAI;QAAA,IACJC,KAAKA,CAAA;UAAA,OAAER,MAAM,CAACG,KAAK,CAAC,CAAC;QAAA;QAAA,IACrBM,aAAaA,CAAA;UAAA,OAAET,MAAM,CAACU,QAAQ;QAAA;QAC9BC,SAAS,EAAE,KAAK;QAChBC,MAAM,EAAEA,CAAA,KAAM,KAAKZ,MAAM,CAACa,IAAI,CAAC,CAAC;QAAA,IAChCC,YAAYA,CAAA;UAAA,OAAE,CAACd,MAAM,CAACe,KAAK,CAAC,CAAC;QAAA;QAAA,IAC7BC,MAAMA,CAAA;UAAA,OAAEhB,MAAM,CAACgB,MAAM,CAAC,CAAC;QAAA;QAAA,IACvBC,eAAeA,CAAA;UAAA,OAAArE,iBAAA,CAAGqB,gBAAgB;YAACZ,IAAI;YAAA,IAAaD,KAAKA,CAAA;cAAA,OAAEU,QAAQ,CAAC,CAAC,CAACoD,OAAO;YAAA;YAAE3C,OAAO,EAAEA,CAAA,KAAMwB,UAAU,CAAC,KAAK;UAAC;QAAA;MAAA;IAIvH;EAAC;AAGP;AAEA,SAASoB,YAAYA,CAACzE,KAA4B,EAAE;EAClD,MAAMoB,QAAQ,GAAG/C,aAAa,CAAC,CAAC;EAChC,OAAA6B,iBAAA,CACGrC,IAAI;IAAA,IACHsC,IAAIA,CAAA;MAAA,OAAEH,KAAK,CAACsD,MAAM;IAAA;IAAA,IAClBjD,QAAQA,CAAA;MAAA,OAAAH,iBAAA,CACLa,YAAY;QAAA,IAACE,OAAOA,CAAA;UAAA,OAAAf,iBAAA,CAAGiB,cAAc,EAAKnB,KAAK;QAAA;QAAA,IAAAY,SAAA;UAAA,OAAAV,iBAAA,CAC7CgC,WAAW;YAACK,QAAQ,EAAEvC,KAAK;YAAA,IAAEP,IAAIA,CAAA;cAAA,OAAEO,KAAK,CAACX,OAAO,CAACA,OAAO;YAAA;UAAA;QAAA;MAAA;IAAA;IAAAuB,QAAA,EAI3D0C,MAAM,IACN;IACA;IAAAhD,KAAA,CAAAoE,OAAA,EAAAlE,cAAA,eAAAC,QAAA,CAMgBW,QAAQ,CAAC,CAAC,CAACuD,UAAU,iBAAAlE,QAAA,CAUqBzB,YAAY,CAACgB,KAAK,CAACZ,IAAI,CAACH,IAAI,CAAC,GAAAwB,QAAA,CAAAP,iBAAA,CAE9ErC,IAAI;MAAA,IAACsC,IAAIA,CAAA;QAAA,OAAEH,KAAK,CAACqB,YAAY;MAAA;MAAAT,QAAA,EAC1BR,IAAI,IAAAE,KAAA,CAAAsE,QAAA,EAAApE,cAAA,SAAAC,QAAA,CAGIL,IAAI,CAAC,CAAC,kBAAAI,cAAA,aAAAC,QAAA,CACFT,KAAK,CAACZ,IAAI,CAACH,IAAI,CAACY,KAAK,CAACG,KAAK,CAACZ,IAAI,CAACH,IAAI,CAACqC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,kBAAAd,cAAA,UAAAC,QAAA,CAC9DW,QAAQ,CAAC,CAAC,CAACN,QAAQ,kBAAAN,cAAA,eAAAC,QAAA,CACdW,QAAQ,CAAC,CAAC,CAACN,QAAQ;IAIlC,KAAAL,QAAA,CAAAP,iBAAA,CAEFqB,gBAAgB;MAAA,IACfZ,IAAIA,CAAA;QAAA,OAAE2C,MAAM,CAAC,CAAC,CAACgB,MAAM,CAAC,CAAC,GAAG,yBAAyB,GAAG,qBAAqB;MAAA;MAAA,IAC3E5D,KAAKA,CAAA;QAAA,OAAEU,QAAQ,CAAC,CAAC,CAACyD,YAAY;MAAA;MAAA,IAC9BpD,QAAQA,CAAA;QAAA,OAAE,CAAC6B,MAAM,CAAC,CAAC,CAACe,KAAK,CAAC,CAAC,IAAIf,MAAM,CAAC,CAAC,CAACgB,MAAM,CAAC,CAAC;MAAA;MAChDzC,OAAO,EAAEA,CAAA,KAAM,KAAKyB,MAAM,CAAC,CAAC,CAACa,IAAI,CAAC;IAAC,KAAA3D,cAAA,UAAAC,QAAA,CAO9B6C,MAAM,CAAC,CAAC,CAACG,KAAK,CAAC,CAAC;EAOhC;AAGP;AAEA,SAASqB,YAAYA,CAAC9E,KAA4B,EAAE;EAClD,MAAM+E,MAAM,GAAGzH,UAAU,CAAC,MAAM;IAC9B,IAAI;MACF,OAAO;QAAE0H,EAAE,EAAE,IAAa;QAAElB,KAAK,EAAEmB,IAAI,CAACC,KAAK,CAAClF,KAAK,CAACX,OAAO,CAACA,OAAO;MAAyB,CAAC;IAC/F,CAAC,CAAC,MAAM;MACN,OAAO;QAAE2F,EAAE,EAAE;MAAe,CAAC;IAC/B;EACF,CAAC,CAAC;EACF,MAAMG,WAAW,GAAGA,CAAA,KAA2B;IAC7C,MAAMC,MAAM,GAAGL,MAAM,CAAC,CAAC;IACvB,OAAOK,MAAM,CAACJ,EAAE,GAAGI,MAAM,CAACtB,KAAK,GAAG,IAAI;EACxC,CAAC;EAED,OAAA5D,iBAAA,CACGa,YAAY;IAAA,IAACE,OAAOA,CAAA;MAAA,OAAAf,iBAAA,CAAGiB,cAAc,EAAKnB,KAAK;IAAA;IAAA,IAAAY,SAAA;MAAA,OAAAN,KAAA,CAAAkD,OAAA,EAAA/C,QAAA,CAAAP,iBAAA,CAE3CrC,IAAI;QAAA,IAACsC,IAAIA,CAAA;UAAA,OAAE4E,MAAM,CAAC,CAAC,CAACC,EAAE;QAAA;QAAA,IAAE3E,QAAQA,CAAA;UAAA,OAAAH,iBAAA,CAAGgC,WAAW;YAACK,QAAQ,EAAEvC,KAAK;YAAA,IAAEP,IAAIA,CAAA;cAAA,OAAEO,KAAK,CAACX,OAAO,CAACA,OAAO;YAAA;UAAA;QAAA;QAAA,IAAAuB,SAAA;UAAA,OAAAV,iBAAA,CACzFrC,IAAI;YAAA,IACHsC,IAAIA,CAAA;cAAA,OAAEH,KAAK,CAACwC,YAAY,KAAKC,SAAS;YAAA;YAAA,IACtCpC,QAAQA,CAAA;cAAA,OAAAH,iBAAA,CAAGgC,WAAW;gBAACK,QAAQ,EAAEvC,KAAK;gBAAA,IAAEP,IAAIA,CAAA;kBAAA,OAAEwF,IAAI,CAACI,SAAS,CAACF,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;gBAAA;cAAA;YAAA;YAAA,IAAAvE,SAAA;cAAA,OAAAV,iBAAA,CAEnFpB,qBAAqB;gBAAA,IAACwG,IAAIA,CAAA;kBAAA,OAAEH,WAAW,CAAC,CAAC;gBAAA;gBAAEI,OAAO,EAAE;cAAG;YAAA;UAAA;QAAA;MAAA;IAAA;EAAA;AAMpE;AAEA,SAASC,qBAAqBA,CAACxF,KAA4B,EAAE;EAC3D,MAAMoB,QAAQ,GAAG/C,aAAa,CAAC,CAAC;EAChC,MAAM,CAACoH,WAAW,EAAEC,cAAc,CAAC,GAAGlI,YAAY,CAAuB;IAAE8B,QAAQ,EAAE,OAAO;IAAEqG,SAAS,EAAE,MAAM;IAAEC,IAAI,EAAE;EAAQ,CAAC,CAAC;EACjIhI,OAAO,CAAC,MAAM;IACZ,IAAI,CAACoC,KAAK,CAAC6F,qBAAqB,EAAE;IAClC,IAAI;MACFH,cAAc,CAACjH,wBAAwB,CAACqH,YAAY,CAACC,OAAO,CAAC/F,KAAK,CAAC6F,qBAAqB,CAAC,CAAC,CAAC;IAC7F,CAAC,CAAC,MAAM;MACN;IAAA;EAEJ,CAAC,CAAC;EACF,MAAMG,MAAM,GAAIC,KAAoC,IAAK;IACvD,MAAMC,IAAI,GAAG;MAAE,GAAGT,WAAW,CAAC,CAAC;MAAE,GAAGQ;IAAM,CAAC;IAC3CP,cAAc,CAACQ,IAAI,CAAC;IACpB,IAAIlG,KAAK,CAAC6F,qBAAqB,EAAE;MAC/B,IAAI;QACFC,YAAY,CAACK,OAAO,CAACnG,KAAK,CAAC6F,qBAAqB,EAAEZ,IAAI,CAACI,SAAS,CAACa,IAAI,CAAC,CAAC;MACzE,CAAC,CAAC,MAAM;QACN;MAAA;IAEJ;EACF,CAAC;EACD,MAAMzG,IAAI,GAAGnC,UAAU,CAAC,MAAMkB,sBAAsB,CAACwB,KAAK,CAACX,OAAO,EAAEoG,WAAW,CAAC,CAAC,CAACnG,QAAQ,CAAC,CAAC;EAC5F,MAAMqG,SAAS,GAAGA,CAAA,KAChBF,WAAW,CAAC,CAAC,CAACE,SAAS,KAAK,MAAM,GAC9BjH,iBAAiB,CAACsB,KAAK,CAACZ,IAAI,CAACH,IAAI,CAAC,KAAK,KAAK,IAAIe,KAAK,CAACX,OAAO,CAACE,SAAS,KAAK,2BAA2B,GACrG,IAAI,GACJ,GAAG,GACLkG,WAAW,CAAC,CAAC,CAACE,SAAS;EAC7B,MAAM,CAACS,IAAI,EAAEC,OAAO,CAAC,GAAG7I,YAAY,CAAC,CAAC,CAAC;EACvCH,YAAY,CAAC,MAAM;IACjBoC,IAAI,CAAC,CAAC;IACNkG,SAAS,CAAC,CAAC;IACX3F,KAAK,CAACwC,YAAY;IAClB6D,OAAO,CAAC,CAAC,CAAC;EACZ,CAAC,CAAC;EACF,MAAMC,QAAQ,GAAGA,CAAA,KAAOtG,KAAK,CAACwC,YAAY,KAAKC,SAAS,GAAG,GAAG,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAE3C,KAAK,CAACwC,YAAY,CAAE;EACjG,MAAMgC,OAAO,GAAGlH,UAAU,CAAC,MAAMsB,kBAAkB,CAACa,IAAI,CAAC,CAAC,EAAEkG,SAAS,CAAC,CAAC,EAAE;IAAEY,IAAI,EAAED,QAAQ,CAAC,CAAC,GAAG,CAAC;IAAEE,MAAM,EAAEJ,IAAI,CAAC,CAAC,GAAGE,QAAQ,CAAC;EAAE,CAAC,CAAC,CAAC;EAChI,MAAMG,QAAQ,GAAGA,CAAA,KACfxI,OAAO,CAACyI,MAAM,CACZ,MAAApG,KAAA,CAAAqG,QAAA,EAAAlG,QAAA,CAAAP,iBAAA,CAEK9B,MAAM;IAAA,IACLwI,KAAKA,CAAA;MAAA,OAAExF,QAAQ,CAAC,CAAC,CAACyF,WAAW;IAAA;IAAA,IAC7B/C,KAAKA,CAAA;MAAA,OAAE2B,WAAW,CAAC,CAAC,CAACnG,QAAQ;IAAA;IAAA,IAC7BmC,QAAQA,CAAA;MAAA,OAAEzB,KAAK,CAACX,OAAO,CAACC,QAAQ,KAAK,QAAQ;IAAA;IAC7CwH,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,CAAC;IAC1D/C,aAAa,EAAGD,KAAK,IAAK;MACxB,IAAIA,KAAK,EAAEkC,MAAM,CAAC;QAAE1G,QAAQ,EAAEwE;MAAM,CAAC,CAAC;IACxC;EAAC,KAAArD,QAAA,CAAAP,iBAAA,CAEF9B,MAAM;IAAA,IACLwI,KAAKA,CAAA;MAAA,OAAExF,QAAQ,CAAC,CAAC,CAAC2F,YAAY;IAAA;IAAA,IAC9BjD,KAAKA,CAAA;MAAA,OAAE2B,WAAW,CAAC,CAAC,CAACE,SAAS;IAAA;IAAA,IAC9BmB,OAAOA,CAAA;MAAA,OAAE,CACP;QAAEhD,KAAK,EAAE,MAAM;QAAE8C,KAAK,EAAExF,QAAQ,CAAC,CAAC,CAAC4F;MAAoB,CAAC,EACxD;QAAElD,KAAK,EAAE,GAAG;QAAE8C,KAAK,EAAExF,QAAQ,CAAC,CAAC,CAAC6F;MAAS,CAAC,EAC1C;QAAEnD,KAAK,EAAE,GAAG;QAAE8C,KAAK,EAAExF,QAAQ,CAAC,CAAC,CAAC8F;MAAa,CAAC,EAC9C;QAAEpD,KAAK,EAAE,IAAI;QAAE8C,KAAK,EAAExF,QAAQ,CAAC,CAAC,CAAC+F;MAAO,CAAC,EACzC;QAAErD,KAAK,EAAE,GAAG;QAAE8C,KAAK,EAAE;MAAI,CAAC,CAC3B;IAAA;IACD7C,aAAa,EAAGD,KAAK,IAAK;MACxB,IAAIA,KAAK,EAAEkC,MAAM,CAAC;QAAEL,SAAS,EAAE7B;MAAM,CAAC,CAAC;IACzC;EAAC,KAAArD,QAAA,CAAAP,iBAAA,CAEF9B,MAAM;IAAA,IACLwI,KAAKA,CAAA;MAAA,OAAExF,QAAQ,CAAC,CAAC,CAACgG,OAAO;IAAA;IAAA,IACzBtD,KAAKA,CAAA;MAAA,OAAE2B,WAAW,CAAC,CAAC,CAACG,IAAI;IAAA;IAAA,IACzBkB,OAAOA,CAAA;MAAA,OAAE,CACP;QAAEhD,KAAK,EAAE,OAAO;QAAE8C,KAAK,EAAExF,QAAQ,CAAC,CAAC,CAACiG;MAAU,CAAC,EAC/C;QAAEvD,KAAK,EAAE,KAAK;QAAE8C,KAAK,EAAExF,QAAQ,CAAC,CAAC,CAACkG;MAAO,CAAC,CAC3C;IAAA;IACDvD,aAAa,EAAGD,KAAK,IAAK;MACxB,IAAIA,KAAK,KAAK,OAAO,IAAIA,KAAK,KAAK,KAAK,EAAEkC,MAAM,CAAC;QAAEJ,IAAI,EAAE9B;MAAM,CAAC,CAAC;IACnE;EAAC,IAGN,EACD;IAAEpD,KAAK,EAAEU,QAAQ,CAAC,CAAC,CAACmG;EAAY,CAClC,CAAC;EACH,MAAMC,OAAO,GAAGlK,UAAU,CAAC,MAAMkH,OAAO,CAAC,CAAC,CAAC+B,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;EACzD,MAAMA,IAAI,GAAGjJ,UAAU,CAAC,MAAMkH,OAAO,CAAC,CAAC,CAAC+B,IAAI,CAAC1G,KAAK,CAAC,CAAC,CAAC,CAAC;EAEtD,OAAAK,iBAAA,CACGa,YAAY;IAAA,IACXE,OAAOA,CAAA;MAAA,QAAAf,iBAAA,CAEFH,aAAa;QAACY,IAAI;QAAA,IAA6BD,KAAKA,CAAA;UAAA,OAAEU,QAAQ,CAAC,CAAC,CAACmG,WAAW;QAAA;QAAE1F,OAAO,EAAEA,CAAA,KAAM,KAAK4E,QAAQ,CAAC;MAAC,IAAAvG,iBAAA,CAC5GiB,cAAc,EAAKnB,KAAK;IAAA;IAAA,IAAAY,SAAA;MAAA,OAAAV,iBAAA,CAI5BrC,IAAI;QAAA,IAACsC,IAAIA,CAAA;UAAA,OAAEsF,WAAW,CAAC,CAAC,CAACG,IAAI,KAAK,OAAO;QAAA;QAAA,IAAEvF,QAAQA,CAAA;UAAA,OAAAH,iBAAA,CAAGgC,WAAW;YAACK,QAAQ,EAAEvC,KAAK;YAAA,IAAEP,IAAIA,CAAA;cAAA,OAAEA,IAAI,CAAC,CAAC;YAAA;UAAA;QAAA;QAAA,IAAAmB,SAAA;UAAA,OAAAV,iBAAA,CAC7FrC,IAAI;YAAA,IACHsC,IAAIA,CAAA;cAAA,OAAEqH,OAAO,CAAC,CAAC,CAAC1H,MAAM,GAAG,CAAC;YAAA;YAAA,IAC1BO,QAAQA,CAAA;cAAA,OAAAH,iBAAA,CAAG5B,WAAW;gBAACqC,IAAI;gBAAA,IAAeD,KAAKA,CAAA;kBAAA,OAAEU,QAAQ,CAAC,CAAC,CAACqG,SAAS;gBAAA;gBAAA,IAAEC,WAAWA,CAAA;kBAAA,OAAEtG,QAAQ,CAAC,CAAC,CAACuG,kBAAkB;gBAAA;cAAA;YAAA;YAAA,IAAA/G,SAAA;cAAA,OAAAN,KAAA,CAAAsH,QAAA,EAAAnH,QAAA,CAAAP,iBAAA,CAMxGzC,GAAG;gBAAA,IAACoK,IAAIA,CAAA;kBAAA,OAAEL,OAAO,CAAC,CAAC;gBAAA;gBAAA5G,QAAA,EACjBA,CAACkH,MAAM,EAAEC,KAAK,KAAAzH,KAAA,CAAA0H,QAAA,EAAAvH,QAAA,CAEJqH,MAAM,IAAI1G,QAAQ,CAAC,CAAC,CAAC6G,MAAM,CAAC;kBAAEC,MAAM,EAAEH,KAAK,CAAC,CAAC,GAAG;gBAAE,CAAC,CAAC;cAE9D,KAAAtH,QAAA,CAAAP,iBAAA,CAKJzC,GAAG;gBAAA,IAACoK,IAAIA,CAAA;kBAAA,OAAEtB,IAAI,CAAC,CAAC;gBAAA;gBAAA3F,QAAA,EACbuH,GAAG,IAAA7H,KAAA,CAAA8H,QAAA,EAAA3H,QAAA,CAAAP,iBAAA,CAEAzC,GAAG;kBAAA,IAACoK,IAAIA,CAAA;oBAAA,OAAEL,OAAO,CAAC,CAAC;kBAAA;kBAAA5G,QAAA,EAAGA,CAAC8C,CAAC,EAAEqE,KAAK,KAAAzH,KAAA,CAAA+H,QAAA,EAAA5H,QAAA,CAAU0H,GAAG,CAACJ,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;gBAAM;cAErE,KAAAtH,QAAA,CAAAP,iBAAA,CAINrC,IAAI;gBAAA,IAACsC,IAAIA,CAAA;kBAAA,OAAEqE,OAAO,CAAC,CAAC,CAAC8D,gBAAgB;gBAAA;gBAAA,IAAA1H,SAAA;kBAAA,OAAAN,KAAA,CAAAsB,OAAA,EAAAnB,QAAA,CACWW,QAAQ,CAAC,CAAC,CAACmH,qBAAqB;gBAAA;cAAA,KAAA9H,QAAA,CAAAP,iBAAA,CAEhFrC,IAAI;gBAAA,IACHsC,IAAIA,CAAA;kBAAA,OAAEH,KAAK,CAACwC,YAAY,KAAKC,SAAS;gBAAA;gBAAA,IACtCpC,QAAQA,CAAA;kBAAA,OAAAH,iBAAA,CACLrC,IAAI;oBAAA,IAACsC,IAAIA,CAAA;sBAAA,OAAEqE,OAAO,CAAC,CAAC,CAACgE,SAAS,GAAG,GAAG;oBAAA;oBAAA,IAAA5H,SAAA;sBAAA,OAAAN,KAAA,CAAAmI,QAAA,EAAAhI,QAAA,CAAAP,iBAAA,CAEhClC,MAAM;wBAACgE,IAAI;wBAAMC,OAAO;wBAAA,IAASR,QAAQA,CAAA;0BAAA,OAAE2E,IAAI,CAAC,CAAC,KAAK,CAAC;wBAAA;wBAAEvE,OAAO,EAAEA,CAAA,KAAMwE,OAAO,CAACD,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;wBAAA,IAAAxF,SAAA;0BAAA,OACzFQ,QAAQ,CAAC,CAAC,CAACsH,QAAQ;wBAAA;sBAAA,KAGnBjI,QAAA,CAAA2F,IAAI,CAAC,CAAC,IAAA3F,QAAA,CAAG6F,QAAQ,CAAC,CAAC,IAAG,CAAC,EAAA7F,QAAA,CAAGiC,IAAI,CAACiG,GAAG,CAAC,CAACvC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAIE,QAAQ,CAAC,CAAC,EAAE9B,OAAO,CAAC,CAAC,CAACgE,SAAS,GAAG,CAAC,CAAC,GAAK/H,QAAA,CAAA+D,OAAO,CAAC,CAAC,CAACgE,SAAS,IAAG,CAAC,EAAA/H,QAAA,CAAAP,iBAAA,CAEpHlC,MAAM;wBACLgE,IAAI;wBACJC,OAAO;wBAAA,IACPR,QAAQA,CAAA;0BAAA,OAAE,CAAC2E,IAAI,CAAC,CAAC,GAAG,CAAC,IAAIE,QAAQ,CAAC,CAAC,IAAI9B,OAAO,CAAC,CAAC,CAACgE,SAAS,GAAG,CAAC;wBAAA;wBAC9D3G,OAAO,EAAEA,CAAA,KAAMwE,OAAO,CAACD,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;wBAAA,IAAAxF,SAAA;0BAAA,OAEjCQ,QAAQ,CAAC,CAAC,CAAC8E,IAAI;wBAAA;sBAAA;oBAAA;kBAAA;gBAAA;gBAAA,IAAAtF,SAAA;kBAAA,OAAAV,iBAAA,CAMvBwB,SAAS;oBAAA,IAACC,KAAKA,CAAA;sBAAA,OAAE6C,OAAO,CAAC,CAAC,CAACgE,SAAS,GAAGjC,IAAI,CAAC,CAAC,CAACzG,MAAM,GAAG,CAAC;oBAAA;oBAAA,IAAE+B,OAAOA,CAAA;sBAAA,OAAE7B,KAAK,CAACkD,eAAe;oBAAA;kBAAA;gBAAA;cAAA;YAAA;UAAA;QAAA;MAAA;IAAA;EAAA;AAOvG;AAEA,MAAM0F,WAAW,GAAI5I,KAA4B,IAC/CA,KAAK,CAAC6I,WAAW,IAAI,QAAQ7I,KAAK,CAACX,OAAO,CAACE,SAAS,WAAWS,KAAK,CAACX,OAAO,CAACA,OAAO,EAAE;AAExF,SAASyJ,aAAaA,CAAC9I,KAA4B,EAAE;EACnD,OAAAE,iBAAA,CACGa,YAAY;IAAA,IAACE,OAAOA,CAAA;MAAA,OAAAf,iBAAA,CAAGiB,cAAc,EAAKnB,KAAK;IAAA;IAAA,IAAAY,SAAA;MAAA,OAAAN,KAAA,CAAAyI,QAAA,EAAAvI,cAAA,gBAAAC,QAAA,CAE1BT,KAAK,CAACgJ,WAAW,kBAAAxI,cAAA,QAAAC,QAAA,CAAsCmI,WAAW,CAAC5I,KAAK,CAAC,kBAAAQ,cAAA,QAAAC,QAAA,CAAOT,KAAK,CAACZ,IAAI,CAACH,IAAI;IAAA;EAAA;AAIzH;AAEA,SAASgK,WAAWA,CAACjJ,KAA4B,EAAE;EACjD,MAAMoB,QAAQ,GAAG/C,aAAa,CAAC,CAAC;EAChC,MAAM+B,IAAI,GAAGA,CAAA,KAAMJ,KAAK,CAAC6I,WAAW,IAAI7I,KAAK,CAACqB,YAAY;EAC1D,OAAAnB,iBAAA,CACGrC,IAAI;IAAA,IAACsC,IAAIA,CAAA;MAAA,OAAEC,IAAI,CAAC,CAAC;IAAA;IAAA,IAAEC,QAAQA,CAAA;MAAA,OAAAH,iBAAA,CAAG5B,WAAW;QAACqC,IAAI;QAAuBD,KAAK;QAAA,IAAOgH,WAAWA,CAAA;UAAA,OAAEtG,QAAQ,CAAC,CAAC,CAAC8H,eAAe;QAAA;MAAA;IAAA;IAAAtI,QAAA,EACrHR,IAAI,IAAAE,KAAA,CAAA6I,QAAA,EAAA3I,cAAA,SAAAC,QAAA,CAAmBL,IAAI,CAAC,CAAC,iBAAAI,cAAA,eAAAC,QAAA,CAAwET,KAAK,CAACZ,IAAI,CAACH,IAAI;EAAI;AAGhI;AAEA,SAASmK,aAAaA,CAACpJ,KAA4B,EAAE;EACnD,MAAMoB,QAAQ,GAAG/C,aAAa,CAAC,CAAC;EAChC,OAAA6B,iBAAA,CACGa,YAAY;IAAA,IAACE,OAAOA,CAAA;MAAA,OAAAf,iBAAA,CAAGiB,cAAc,EAAKnB,KAAK;IAAA;IAAA,IAAAY,SAAA;MAAA,OAAAN,KAAA,CAAA+I,QAAA,EAAA7I,cAAA,gBAAAC,QAAA,CAG7BT,KAAK,CAACgJ,WAAW,iBAAAxI,cAAA,QAAAC,QAAA,CAIzBmI,WAAW,CAAC5I,KAAK,CAAC,kBAAAQ,cAAA,eAAAC,QAAA,CACXT,KAAK,CAACZ,IAAI,CAACH,IAAI,iBAAAwB,QAAA,CAE1BW,QAAQ,CAAC,CAAC,CAACkI,gBAAgB;IAAA;EAAA;AAKtC;AAEA,SAASC,aAAaA,CAACvJ,KAA4B,EAAE;EACnD,MAAMoB,QAAQ,GAAG/C,aAAa,CAAC,CAAC;EAChC,OAAA6B,iBAAA,CACGa,YAAY;IAAA,IAACE,OAAOA,CAAA;MAAA,OAAAf,iBAAA,CAAGiB,cAAc,EAAKnB,KAAK;IAAA;IAAA,IAAAY,SAAA;MAAA,OAAAN,KAAA,CAAAkJ,QAAA,EAAAhJ,cAAA,gBAAAC,QAAA,CAG7BT,KAAK,CAACgJ,WAAW,iBAAAxI,cAAA,QAAAC,QAAA,CAKzBmI,WAAW,CAAC5I,KAAK,CAAC,kBAAAQ,cAAA,eAAAC,QAAA,CACXT,KAAK,CAACZ,IAAI,CAACH,IAAI,iBAAAwB,QAAA,CAE1BW,QAAQ,CAAC,CAAC,CAACqI,gBAAgB;IAAA;EAAA;AAKtC;AAEA,SAASC,cAAcA,CAAC1J,KAA4B,EAAE;EACpD,MAAMoB,QAAQ,GAAG/C,aAAa,CAAC,CAAC;EAChC,OAAA6B,iBAAA,CACG5B,WAAW;IACVqC,IAAI;IAAA,IACJD,KAAKA,CAAA;MAAA,OAAEU,QAAQ,CAAC,CAAC,CAACuI,SAAS;IAAA;IAAA,IAC3BjC,WAAWA,CAAA;MAAA,OAAE1H,KAAK,CAACX,OAAO,CAACE,SAAS,IAAI6B,QAAQ,CAAC,CAAC,CAACwI,UAAU;IAAA;IAAA,IAC7DC,MAAMA,CAAA;MAAA,OAAA3J,iBAAA,CACHrC,IAAI;QAAA,IAACsC,IAAIA,CAAA;UAAA,OAAEH,KAAK,CAACqB,YAAY;QAAA;QAAAT,QAAA,EAC1BR,IAAI,IAAAE,KAAA,CAAAwJ,QAAA,EAAAtJ,cAAA,SAAAC,QAAA,CACgEL,IAAI,CAAC,CAAC,iBAAAK,QAAA,CAEvEW,QAAQ,CAAC,CAAC,CAACN,QAAQ;MAEvB;IAAA;EAAA;AAKX;AAEA,MAAMiJ,iBAAqC,GAAG,CAC5C;EAAEC,EAAE,EAAE,UAAU;EAAEtK,KAAK,EAAEP,UAAU;EAAE8K,SAAS,EAAE9G,gBAAgB;EAAE+G,QAAQ,EAAE;AAAK,CAAC,EAClF;EACEF,EAAE,EAAE,OAAO;EACXtK,KAAK,EAAEA,CAACN,IAAI,EAAEC,OAAO,KAAKV,sBAAsB,CAAC;IAAE,GAAGS,IAAI;IAAEG,SAAS,EAAEF,OAAO,CAACE,SAAS,IAAIH,IAAI,CAACG;EAAU,CAAC,CAAC,KAAK,OAAO;EACzH0K,SAAS,EAAEnB;AACb,CAAC,EACD;EACEkB,EAAE,EAAE,KAAK;EACTtK,KAAK,EAAEA,CAACN,IAAI,EAAEC,OAAO,KAAKV,sBAAsB,CAAC;IAAE,GAAGS,IAAI;IAAEG,SAAS,EAAEF,OAAO,CAACE,SAAS,IAAIH,IAAI,CAACG;EAAU,CAAC,CAAC,KAAK,KAAK;EACvH0K,SAAS,EAAEhB;AACb,CAAC,EACD;EACEe,EAAE,EAAE,MAAM;EACVtK,KAAK,EAAEA,CAACN,IAAI,EAAEC,OAAO,KACnBA,OAAO,CAACC,QAAQ,KAAK,MAAM,IAAIX,sBAAsB,CAAC;IAAE,GAAGS,IAAI;IAAEG,SAAS,EAAEF,OAAO,CAACE,SAAS,IAAIH,IAAI,CAACG;EAAU,CAAC,CAAC,KAAK,MAAM;EAC/H0K,SAAS,EAAEnF;AACb,CAAC,EACD;EACEkF,EAAE,EAAE,gBAAgB;EACpBtK,KAAK,EAAEA,CAACN,IAAI,EAAEC,OAAO,KAAKV,sBAAsB,CAAC;IAAE,GAAGS,IAAI;IAAEG,SAAS,EAAEF,OAAO,CAACE,SAAS,IAAIH,IAAI,CAACG;EAAU,CAAC,CAAC,KAAK,gBAAgB;EAClI0K,SAAS,EAAEzE;AACb,CAAC,EACD;EACEwE,EAAE,EAAE,OAAO;EACXtK,KAAK,EAAEA,CAACN,IAAI,EAAEC,OAAO,KAAKV,sBAAsB,CAAC;IAAE,GAAGS,IAAI;IAAEG,SAAS,EAAEF,OAAO,CAACE,SAAS,IAAIH,IAAI,CAACG;EAAU,CAAC,CAAC,KAAK,OAAO;EACzH0K,SAAS,EAAEb;AACb,CAAC,EACD;EACEY,EAAE,EAAE,OAAO;EACXtK,KAAK,EAAEA,CAACN,IAAI,EAAEC,OAAO,KAAKV,sBAAsB,CAAC;IAAE,GAAGS,IAAI;IAAEG,SAAS,EAAEF,OAAO,CAACE,SAAS,IAAIH,IAAI,CAACG;EAAU,CAAC,CAAC,KAAK,OAAO;EACzH0K,SAAS,EAAEV;AACb,CAAC,EACD;EAAES,EAAE,EAAE,MAAM;EAAEtK,KAAK,EAAEA,CAACyK,KAAK,EAAE9K,OAAO,KAAKA,OAAO,CAACC,QAAQ,KAAK,MAAM;EAAE2K,SAAS,EAAExF,YAAY;EAAEyF,QAAQ,EAAE;AAAK,CAAC,EAC/G;EAAEF,EAAE,EAAE,QAAQ;EAAEtK,KAAK,EAAEA,CAAA,KAAM,IAAI;EAAEuK,SAAS,EAAEP;AAAe,CAAC,CAC/D;;AAED;;AAEA,OAAO,MAAMU,kBAAkB,GAAIC,KAAa,IAAa;EAC3D,IAAIA,KAAK,GAAG,IAAI,EAAE,OAAO,GAAGA,KAAK,IAAI;EACrC,IAAIA,KAAK,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO,GAAG,CAACA,KAAK,GAAG,IAAI,EAAEC,OAAO,CAAC,CAAC,CAAC,KAAK;EACjE,OAAO,GAAG,CAACD,KAAK,IAAI,IAAI,GAAG,IAAI,CAAC,EAAEC,OAAO,CAAC,CAAC,CAAC,KAAK;AACnD,CAAC;AAED,eAAe,SAASC,QAAQA,CAACvK,KAAoB,EAAE;EACrD,MAAMoB,QAAQ,GAAG/C,aAAa,CAAC,CAAC;EAChC,MAAM,CAACoF,KAAK,EAAEO,QAAQ,CAAC,GAAGxG,YAAY,CAAC,EAAE,CAAC;EAC1C,MAAM,CAACgN,UAAU,EAAEC,aAAa,CAAC,GAAGjN,YAAY,CAAC,EAAE,CAAC;EACpD,MAAM,CAACkN,cAAc,EAAEC,iBAAiB,CAAC,GAAGnN,YAAY,CAAC,CAAC,CAAC;EAC3D,MAAM6G,KAAK,GAAG/G,UAAU,CAAC,MAAMmG,KAAK,CAAC,CAAC,KAAK+G,UAAU,CAAC,CAAC,CAAC;EACxD,MAAMI,iBAAiB,GAAGA,CAAA,KAAM5K,KAAK,CAAC6K,SAAS,IAAI,EAAE;EACrD,MAAMC,YAAY,GAAG1N,QAAQ,CAAC2N,MAAM,CAAuE;IACzG3N,QAAQ,EAAE,MAAO4N,KAAK,IAAK;MACzB,MAAMhL,KAAK,CAACmE,IAAI,CAAE6G,KAAK,CAAC3L,OAAO,CAAC;MAChC,OAAO2L,KAAK;IACd,CAAC;IACDC,SAAS,EAAGC,KAAK,IAAK;MACpB,IAAIlL,KAAK,CAACZ,IAAI,CAACH,IAAI,KAAKiM,KAAK,CAACjM,IAAI,EAAEwL,aAAa,CAACS,KAAK,CAAC7L,OAAO,CAAC;MAChEnB,KAAK,CAACiN,OAAO,CAAC/J,QAAQ,CAAC,CAAC,CAACgK,SAAS,CAAC;IACrC,CAAC;IACDC,OAAO,EAAGC,KAAK,IAAKpN,KAAK,CAACoN,KAAK,CAACA,KAAK,CAACC,OAAO;EAC/C,CAAC,CAAC;EACF,MAAMC,iBAAiB,GAAGlO,UAAU,CAAC,MAAM;IACzC,MAAMmO,IAAI,GAAG9M,sBAAsB,CAACqB,KAAK,CAACZ,IAAI,CAAC;IAC/C,MAAMgB,IAAI,GAAGJ,KAAK,CAAC6I,WAAW,KAAK4C,IAAI,KAAK,KAAK,GAAGzL,KAAK,CAACqB,YAAY,GAAG,IAAI,CAAC;IAC9E,IAAI,CAACjB,IAAI,EAAE,OAAO,IAAI;IACtB,MAAMsL,SAAS,GAAGtL,IAAI,CAACuL,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG;IAChD,OAAO,GAAGvL,IAAI,GAAGsL,SAAS,oBAAoBhB,cAAc,CAAC,CAAC,EAAE;EAClE,CAAC,CAAC;EACF,MAAMkB,qBAAqB,GAAGtO,UAAU,CAAyB,MAAM;IACrE,MAAMmO,IAAI,GAAG9M,sBAAsB,CAACqB,KAAK,CAACZ,IAAI,CAAC;IAC/C,IAAIqM,IAAI,KAAK,OAAO,IAAIA,IAAI,KAAK,KAAK,IAAIA,IAAI,KAAK,OAAO,IAAIA,IAAI,KAAK,OAAO,EAAE,OAAO,IAAI;IAC3F,MAAMrL,IAAI,GAAGoL,iBAAiB,CAAC,CAAC;IAChC,IAAI,CAACpL,IAAI,EAAE,OAAO,IAAI;IAEtB,MAAMyL,SAA0B,GAAG;MACjCvM,QAAQ,EAAE,QAAQ;MAClBD,OAAO,EAAE,EAAE;MACXE,SAAS,EAAES,KAAK,CAACZ,IAAI,CAACG,SAAS,IAAI;IACrC,CAAC;IACD,OAAOqL,iBAAiB,CAAC,CAAC,CAACkB,IAAI,CAAEvJ,QAAQ,IAAKA,QAAQ,CAAC7C,KAAK,CAACM,KAAK,CAACZ,IAAI,EAAEyM,SAAS,CAAC,CAAC,GAAG,IAAI,GAAGA,SAAS;EACzG,CAAC,CAAC;EACF,MAAM,CAACxM,OAAO,EAAE;IAAE0M;EAAQ,CAAC,CAAC,GAAGxO,cAAc,CAC3C,MAAOqO,qBAAqB,CAAC,CAAC,GAAG,IAAI,GAAG;IAAE3M,IAAI,EAAEe,KAAK,CAACZ,IAAI,CAACH,IAAI;IAAE+M,QAAQ,EAAEhM,KAAK,CAACgM;EAAS,CAAE,EAC5F,YAAY;IACVlB,YAAY,CAACmB,KAAK,CAAC,CAAC;IACpB;IACA;IACA,MAAMC,MAAM,GAAG,MAAMnO,OAAO,CAAC,MAAMiC,KAAK,CAACmM,IAAI,CAAC,CAAC,CAAC;IAChD,MAAMC,WAAW,GAAGF,MAAM,CAAC5M,QAAQ,KAAK,MAAM,GAAG4M,MAAM,CAAC7M,OAAO,GAAG,EAAE;IACpE2E,QAAQ,CAACoI,WAAW,CAAC;IACrB3B,aAAa,CAAC2B,WAAW,CAAC;IAC1B,OAAOF,MAAM;EACf,CACF,CAAC;EACD7O,YAAY,CAAC,MAAM;IACjB,IAAI,CAAC2C,KAAK,CAACqM,eAAe,EAAE;IAC5B,MAAMC,UAAU,GAAGtM,KAAK,CAACqM,eAAe,CAAC,YAAY;MACnD,IAAIT,qBAAqB,CAAC,CAAC,EAAEjB,iBAAiB,CAAE7G,KAAK,IAAKA,KAAK,GAAG,CAAC,CAAC,CAAC,KAChE,MAAMiI,OAAO,CAAC,CAAC;IACtB,CAAC,CAAC;IACF,IAAIO,UAAU,EAAE3O,SAAS,CAAC2O,UAAU,CAAC;EACvC,CAAC,CAAC;EACF,MAAMC,eAAe,GAAGjP,UAAU,CAAC,MAAMsO,qBAAqB,CAAC,CAAC,IAAIvM,OAAO,CAAC,CAAC,CAAC;EAE9E,MAAMkD,QAAQ,GAAGjF,UAAU,CAAC,MAAM;IAChC,MAAM4O,MAAM,GAAGK,eAAe,CAAC,CAAC;IAChC,IAAI,CAACL,MAAM,EAAE,OAAO,IAAI;IACxB,OAAO,CAAC,GAAGtB,iBAAiB,CAAC,CAAC,EAAE,GAAGb,iBAAiB,CAAC,CAACyC,IAAI,CAAEX,SAAS,IAAKA,SAAS,CAACnM,KAAK,CAACM,KAAK,CAACZ,IAAI,EAAE8M,MAAM,CAAC,CAAC,IAAI,IAAI;EACxH,CAAC,CAAC;EAEF7O,YAAY,CAAC,MAAM;IACjB2C,KAAK,CAACyM,aAAa,GAAGpI,KAAK,CAAC,CAAC,CAAC;EAChC,CAAC,CAAC;EAEF,MAAMF,IAAI,GAAG,MAAAA,CAAA,KAAY;IACvB,IAAI,CAACnE,KAAK,CAACmE,IAAI,IAAI2G,YAAY,CAAC4B,OAAO,CAAC,CAAC,EAAE;IAC3C,MAAM5B,YAAY,CAAC6B,MAAM,CAAC;MAAE1N,IAAI,EAAEe,KAAK,CAACZ,IAAI,CAACH,IAAI;MAAEI,OAAO,EAAEoE,KAAK,CAAC;IAAE,CAAC,CAAC;EACxE,CAAC;EAED,MAAMH,MAAM,GAAGA,CAAA,KACbtD,KAAK,CAACmE,IAAI,IAAI5B,QAAQ,CAAC,CAAC,EAAE2H,QAAQ,IAAIqC,eAAe,CAAC,CAAC,EAAEjN,QAAQ,KAAK,MAAM,GACxE;IACEmE,KAAK;IACLO,QAAQ;IACRK,KAAK;IACLC,MAAM,EAAEwG,YAAY,CAAC4B,OAAO;IAC5BvI;EACF,CAAC,GACD,IAAI;EAEV,OAAA7D,KAAA,CAAAsM,QAAA,EAEW,yBAAAnM,QAAA,CAAyBT,KAAK,CAAC6M,KAAK,IAAI,EAAE,SAAE,EAAArM,cAAA,iBAAAC,QAAA,CACrCT,KAAK,CAACiC,OAAO,kBAAAzB,cAAA,iBACbR,KAAK,CAACwC,YAAY,KAAKC,SAAS,GAAG,MAAM,GAAAhC,QAAA,CAAGgC,SAAS,iBAAAhC,QAAA,CAAAP,iBAAA,CAElEpC,MAAM;IAAA,IAAA8C,SAAA;MAAA,QAAAV,iBAAA,CACJxC,KAAK;QAAA,IAACyC,IAAIA,CAAA;UAAA,OAAEd,OAAO,CAACqN,OAAO,IAAIrN,OAAO,CAAC,CAAC,KAAKoD,SAAS;QAAA;QAAA,IAAA7B,SAAA;UAAA,OAAAV,iBAAA,CACpD5B,WAAW;YAACqC,IAAI;YAAA,IAAkBD,KAAKA,CAAA;cAAA,OAAEU,QAAQ,CAAC,CAAC,CAACsL,OAAO;YAAA;UAAA;QAAA;MAAA,IAAAxM,iBAAA,CAE7DxC,KAAK;QAAA,IAACyC,IAAIA,CAAA;UAAA,OAAEd,OAAO,CAACiM,KAAK;QAAA;QAAA,IAAA1K,SAAA;UAAA,OAAAV,iBAAA,CACvB5B,WAAW;YAACqC,IAAI;YAAA,IAAsBD,KAAKA,CAAA;cAAA,OAAEU,QAAQ,CAAC,CAAC,CAAC0L,cAAc;YAAA;YAAA,IAAEpF,WAAWA,CAAA;cAAA,OAAEqF,MAAM,CAAC1N,OAAO,CAACiM,KAAK,EAAEC,OAAO,IAAI,EAAE,CAAC;YAAA;UAAA;QAAA;MAAA,IAAArL,iBAAA,CAE3HxC,KAAK;QAAA,IAACyC,IAAIA,CAAA;UAAA,OAAEoM,eAAe,CAAC,CAAC,IAAIhK,QAAQ,CAAC,CAAC;QAAA;QAAA3B,QAAA,EACxCoM,MAAM,IAAK;UACX,MAAMC,QAAQ,GAAGD,MAAM,CAAC,CAAC,CAAC/C,SAAS;UACnC,OAAA/J,iBAAA,CACG+M,QAAQ;YAAA,IACPzK,YAAYA,CAAA;cAAA,OAAExC,KAAK,CAACwC,YAAY;YAAA;YAAA,IAChCU,eAAeA,CAAA;cAAA,OAAElD,KAAK,CAACkD,eAAe;YAAA;YAAA,IACtCD,YAAYA,CAAA;cAAA,OAAEjD,KAAK,CAACiD,YAAY;YAAA;YAAA,IAChC4C,qBAAqBA,CAAA;cAAA,OAAE7F,KAAK,CAAC6F,qBAAqB;YAAA;YAAA,IAClDzG,IAAIA,CAAA;cAAA,OAAEY,KAAK,CAACZ,IAAI;YAAA;YAAA,IAChBC,OAAOA,CAAA;cAAA,OAAEkN,eAAe,CAAC,CAAC;YAAA;YAAA,IAC1B1D,WAAWA,CAAA;cAAA,OAAE2C,iBAAiB,CAAC,CAAC;YAAA;YAAA,IAChCxC,WAAWA,CAAA;cAAA,OAAEhJ,KAAK,CAACgJ,WAAW;YAAA;YAAA,IAC9BkE,cAAcA,CAAA;cAAA,OAAElN,KAAK,CAACkN,cAAc;YAAA;YAAA,IACpC7L,YAAYA,CAAA;cAAA,OAAErB,KAAK,CAACqB,YAAY,IAAI,IAAI;YAAA;YAAA,IACxCiC,MAAMA,CAAA;cAAA,OAAEA,MAAM,CAAC,CAAC;YAAA;UAAA;QAGtB;MAAC;IAAA;EAAA;AAKX","ignoreList":[]}
@@ -22,6 +22,12 @@ const createSafeRenderer = (options = {}) => {
22
22
  const renderer = new Renderer();
23
23
  const inlineTokens = normalizeInlineTokens(options.inlineTokens);
24
24
  const renderText = renderer.text.bind(renderer);
25
+ const renderTable = renderer.table.bind(renderer);
26
+ renderer.table = token => {
27
+ const table = renderTable(token);
28
+ const content = token.header.every(cell => !cell.text.trim()) ? table.replace(/<thead>[\s\S]*?<\/thead>\n?/, "") : table;
29
+ return `<div class="k2b-content-markdown__table" tabindex="0">${content}</div>`;
30
+ };
25
31
  renderer.html = ({
26
32
  text
27
33
  }) => escapeHtml(text);
@@ -1 +1 @@
1
- {"version":3,"names":["marked","Renderer","escapeHtml","value","replaceAll","safeUrl","normalized","trim","replace","test","normalizeInlineTokens","tokens","Set","filter","Boolean","sort","left","right","length","isStandaloneInlineToken","text","start","before","end","after","createSafeRenderer","options","renderer","inlineTokens","renderText","bind","html","link","href","title","body","parser","parseInline","url","linkProtocols","includes","URL","protocol","titleAttribute","target","linkTarget","image","allowImages","token","type","parts","plainStart","cursor","inlineToken","find","candidate","startsWith","slice","push","raw","join","renderSafeMarkdown","markdown","parse","async","MarkdownView","props","undefined","trustedHtml","_$ssr","_tmpl$","_$escape","class","_$ssrAttribute","headingScale"],"sources":["content/MarkdownView.tsx"],"sourcesContent":["import { marked, Renderer, type Tokens } from \"marked\";\n\ntype CommonProps = MarkdownRenderOptions & {\n /** Optional additional CSS classes */\n class?: string;\n /**\n * Visual heading scale. Markdown heading levels and document structure stay\n * unchanged.\n */\n headingScale?: \"compact\" | \"normal\" | \"large\";\n};\n\nexport type MarkdownViewProps = CommonProps &\n (\n | {\n /** Untrusted Markdown. Raw HTML and unsafe link protocols are escaped. */\n markdown: string;\n /** Exact standalone text tokens to emphasize without changing Markdown parsing or trusted-HTML boundaries. */\n inlineTokens?: readonly string[];\n trustedHtml?: never;\n }\n | {\n /** Explicitly trusted, already-rendered HTML. The caller owns sanitization. */\n trustedHtml: string;\n markdown?: never;\n inlineTokens?: never;\n }\n );\n\nexport type MarkdownRenderOptions = {\n inlineTokens?: readonly string[];\n /** Whether to render images. False renders alt text without resource requests. Defaults to true. */\n allowImages?: boolean;\n /** Optional protocol allowlist, including trailing colons. Relative URLs resolve as HTTPS. */\n linkProtocols?: readonly string[];\n linkTarget?: \"_blank\";\n};\n\nconst escapeHtml = (value: string): string =>\n value.replaceAll(\"&\", \"&amp;\").replaceAll(\"<\", \"&lt;\").replaceAll(\">\", \"&gt;\").replaceAll('\"', \"&quot;\").replaceAll(\"'\", \"&#39;\");\n\nconst safeUrl = (value: string): string | null => {\n const normalized = value.trim().replace(/[\\u0000-\\u001f\\u007f-\\u009f\\s]+/g, \"\");\n if (/^(?:javascript|vbscript|data):/i.test(normalized)) return null;\n return value;\n};\n\nconst normalizeInlineTokens = (tokens: readonly string[] | undefined): string[] =>\n [...new Set(tokens?.filter(Boolean) ?? [])].sort((left, right) => right.length - left.length);\n\nconst isStandaloneInlineToken = (text: string, start: number, value: string): boolean => {\n const before = text[start - 1];\n if (before && /[a-zA-Z0-9_.%+\\-]/.test(before)) return false;\n const end = start + value.length;\n const after = text[end];\n if (after && /[a-zA-Z0-9_@]/.test(after)) return false;\n return !(after === \".\" && /[a-zA-Z0-9_]/.test(text[end + 1] ?? \"\"));\n};\n\nconst createSafeRenderer = (options: MarkdownRenderOptions = {}): Renderer => {\n const renderer = new Renderer();\n const inlineTokens = normalizeInlineTokens(options.inlineTokens);\n const renderText = renderer.text.bind(renderer);\n renderer.html = ({ text }: Tokens.HTML | Tokens.Tag) => escapeHtml(text);\n renderer.link = function ({ href, title, tokens }: Tokens.Link) {\n const body = this.parser.parseInline(tokens);\n const url = safeUrl(href);\n if (!url) return body;\n if (options.linkProtocols) {\n try {\n if (!options.linkProtocols.includes(new URL(url, \"https://markdown.invalid/\").protocol)) return body;\n } catch {\n return body;\n }\n }\n const titleAttribute = title ? ` title=\"${escapeHtml(title)}\"` : \"\";\n const target = options.linkTarget === \"_blank\" ? ' target=\"_blank\" rel=\"noopener noreferrer\"' : \"\";\n return `<a href=\"${escapeHtml(url)}\"${titleAttribute}${target}>${body}</a>`;\n };\n renderer.image = ({ href, title, text }: Tokens.Image) => {\n const url = safeUrl(href);\n if (!url || options.allowImages === false) return escapeHtml(text);\n const titleAttribute = title ? ` title=\"${escapeHtml(title)}\"` : \"\";\n return `<img src=\"${escapeHtml(url)}\" alt=\"${escapeHtml(text)}\"${titleAttribute}>`;\n };\n renderer.text = (token) => {\n if (inlineTokens.length === 0 || token.type === \"escape\" || (\"tokens\" in token && token.tokens)) return renderText(token);\n const parts: string[] = [];\n let plainStart = 0;\n let cursor = 0;\n while (cursor < token.text.length) {\n const inlineToken = inlineTokens.find(\n (candidate) => token.text.startsWith(candidate, cursor) && isStandaloneInlineToken(token.text, cursor, candidate),\n );\n if (!inlineToken) {\n cursor += 1;\n continue;\n }\n if (plainStart < cursor) {\n const text = token.text.slice(plainStart, cursor);\n parts.push(renderText({ ...token, raw: text, text }));\n }\n parts.push(\n `<span class=\"k2b-content-markdown__inline-token\">${renderText({ ...token, raw: inlineToken, text: inlineToken })}</span>`,\n );\n cursor += inlineToken.length;\n plainStart = cursor;\n }\n if (plainStart === 0) return renderText(token);\n if (plainStart < token.text.length) {\n const text = token.text.slice(plainStart);\n parts.push(renderText({ ...token, raw: text, text }));\n }\n return parts.join(\"\");\n };\n return renderer;\n};\n\nexport const renderSafeMarkdown = (markdown: string, options: MarkdownRenderOptions = {}): string =>\n marked.parse(markdown, {\n async: false,\n renderer: createSafeRenderer(options),\n }) as string;\n\n/**\n * Markdown View Component (SSR)\n *\n * Renders untrusted Markdown safely by default. Raw HTML and unsafe link\n * protocols are escaped. Already-rendered HTML requires the deliberately named\n * `trustedHtml` boundary; the caller owns sanitization in that mode.\n *\n * @example\n * ```tsx\n * import { MarkdownView } from \"@k2b/ui\";\n *\n * <MarkdownView markdown={source} />;\n * ```\n *\n * @example Compact headings, e.g. inside comments or file previews:\n * ```tsx\n * <MarkdownView markdown={source} headingScale=\"compact\" />;\n * ```\n */\nexport default function MarkdownView(props: MarkdownViewProps) {\n const html = () =>\n props.markdown !== undefined\n ? renderSafeMarkdown(props.markdown, {\n inlineTokens: props.inlineTokens,\n allowImages: props.allowImages,\n linkProtocols: props.linkProtocols,\n linkTarget: props.linkTarget,\n })\n : props.trustedHtml;\n return (\n <div\n class={`k2b-content-markdown ${props.class ?? \"\"}`}\n data-heading-scale={props.headingScale && props.headingScale !== \"normal\" ? props.headingScale : undefined}\n innerHTML={html()}\n />\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["marked","Renderer","escapeHtml","value","replaceAll","safeUrl","normalized","trim","replace","test","normalizeInlineTokens","tokens","Set","filter","Boolean","sort","left","right","length","isStandaloneInlineToken","text","start","before","end","after","createSafeRenderer","options","renderer","inlineTokens","renderText","bind","renderTable","table","token","content","header","every","cell","html","link","href","title","body","parser","parseInline","url","linkProtocols","includes","URL","protocol","titleAttribute","target","linkTarget","image","allowImages","type","parts","plainStart","cursor","inlineToken","find","candidate","startsWith","slice","push","raw","join","renderSafeMarkdown","markdown","parse","async","MarkdownView","props","undefined","trustedHtml","_$ssr","_tmpl$","_$escape","class","_$ssrAttribute","headingScale"],"sources":["content/MarkdownView.tsx"],"sourcesContent":["import { marked, Renderer, type Tokens } from \"marked\";\n\ntype CommonProps = MarkdownRenderOptions & {\n /** Optional additional CSS classes */\n class?: string;\n /**\n * Visual heading scale. Markdown heading levels and document structure stay\n * unchanged.\n */\n headingScale?: \"compact\" | \"normal\" | \"large\";\n};\n\nexport type MarkdownViewProps = CommonProps &\n (\n | {\n /** Untrusted Markdown. Raw HTML and unsafe link protocols are escaped. */\n markdown: string;\n /** Exact standalone text tokens to emphasize without changing Markdown parsing or trusted-HTML boundaries. */\n inlineTokens?: readonly string[];\n trustedHtml?: never;\n }\n | {\n /** Explicitly trusted, already-rendered HTML. The caller owns sanitization. */\n trustedHtml: string;\n markdown?: never;\n inlineTokens?: never;\n }\n );\n\nexport type MarkdownRenderOptions = {\n inlineTokens?: readonly string[];\n /** Whether to render images. False renders alt text without resource requests. Defaults to true. */\n allowImages?: boolean;\n /** Optional protocol allowlist, including trailing colons. Relative URLs resolve as HTTPS. */\n linkProtocols?: readonly string[];\n linkTarget?: \"_blank\";\n};\n\nconst escapeHtml = (value: string): string =>\n value.replaceAll(\"&\", \"&amp;\").replaceAll(\"<\", \"&lt;\").replaceAll(\">\", \"&gt;\").replaceAll('\"', \"&quot;\").replaceAll(\"'\", \"&#39;\");\n\nconst safeUrl = (value: string): string | null => {\n const normalized = value.trim().replace(/[\\u0000-\\u001f\\u007f-\\u009f\\s]+/g, \"\");\n if (/^(?:javascript|vbscript|data):/i.test(normalized)) return null;\n return value;\n};\n\nconst normalizeInlineTokens = (tokens: readonly string[] | undefined): string[] =>\n [...new Set(tokens?.filter(Boolean) ?? [])].sort((left, right) => right.length - left.length);\n\nconst isStandaloneInlineToken = (text: string, start: number, value: string): boolean => {\n const before = text[start - 1];\n if (before && /[a-zA-Z0-9_.%+\\-]/.test(before)) return false;\n const end = start + value.length;\n const after = text[end];\n if (after && /[a-zA-Z0-9_@]/.test(after)) return false;\n return !(after === \".\" && /[a-zA-Z0-9_]/.test(text[end + 1] ?? \"\"));\n};\n\nconst createSafeRenderer = (options: MarkdownRenderOptions = {}): Renderer => {\n const renderer = new Renderer();\n const inlineTokens = normalizeInlineTokens(options.inlineTokens);\n const renderText = renderer.text.bind(renderer);\n const renderTable = renderer.table.bind(renderer);\n renderer.table = (token: Tokens.Table) => {\n const table = renderTable(token);\n const content = token.header.every((cell) => !cell.text.trim()) ? table.replace(/<thead>[\\s\\S]*?<\\/thead>\\n?/, \"\") : table;\n return `<div class=\"k2b-content-markdown__table\" tabindex=\"0\">${content}</div>`;\n };\n renderer.html = ({ text }: Tokens.HTML | Tokens.Tag) => escapeHtml(text);\n renderer.link = function ({ href, title, tokens }: Tokens.Link) {\n const body = this.parser.parseInline(tokens);\n const url = safeUrl(href);\n if (!url) return body;\n if (options.linkProtocols) {\n try {\n if (!options.linkProtocols.includes(new URL(url, \"https://markdown.invalid/\").protocol)) return body;\n } catch {\n return body;\n }\n }\n const titleAttribute = title ? ` title=\"${escapeHtml(title)}\"` : \"\";\n const target = options.linkTarget === \"_blank\" ? ' target=\"_blank\" rel=\"noopener noreferrer\"' : \"\";\n return `<a href=\"${escapeHtml(url)}\"${titleAttribute}${target}>${body}</a>`;\n };\n renderer.image = ({ href, title, text }: Tokens.Image) => {\n const url = safeUrl(href);\n if (!url || options.allowImages === false) return escapeHtml(text);\n const titleAttribute = title ? ` title=\"${escapeHtml(title)}\"` : \"\";\n return `<img src=\"${escapeHtml(url)}\" alt=\"${escapeHtml(text)}\"${titleAttribute}>`;\n };\n renderer.text = (token) => {\n if (inlineTokens.length === 0 || token.type === \"escape\" || (\"tokens\" in token && token.tokens)) return renderText(token);\n const parts: string[] = [];\n let plainStart = 0;\n let cursor = 0;\n while (cursor < token.text.length) {\n const inlineToken = inlineTokens.find(\n (candidate) => token.text.startsWith(candidate, cursor) && isStandaloneInlineToken(token.text, cursor, candidate),\n );\n if (!inlineToken) {\n cursor += 1;\n continue;\n }\n if (plainStart < cursor) {\n const text = token.text.slice(plainStart, cursor);\n parts.push(renderText({ ...token, raw: text, text }));\n }\n parts.push(\n `<span class=\"k2b-content-markdown__inline-token\">${renderText({ ...token, raw: inlineToken, text: inlineToken })}</span>`,\n );\n cursor += inlineToken.length;\n plainStart = cursor;\n }\n if (plainStart === 0) return renderText(token);\n if (plainStart < token.text.length) {\n const text = token.text.slice(plainStart);\n parts.push(renderText({ ...token, raw: text, text }));\n }\n return parts.join(\"\");\n };\n return renderer;\n};\n\nexport const renderSafeMarkdown = (markdown: string, options: MarkdownRenderOptions = {}): string =>\n marked.parse(markdown, {\n async: false,\n renderer: createSafeRenderer(options),\n }) as string;\n\n/**\n * Markdown View Component (SSR)\n *\n * Renders untrusted Markdown safely by default. Raw HTML and unsafe link\n * protocols are escaped. Already-rendered HTML requires the deliberately named\n * `trustedHtml` boundary; the caller owns sanitization in that mode.\n *\n * @example\n * ```tsx\n * import { MarkdownView } from \"@k2b/ui\";\n *\n * <MarkdownView markdown={source} />;\n * ```\n *\n * @example Compact headings, e.g. inside comments or file previews:\n * ```tsx\n * <MarkdownView markdown={source} headingScale=\"compact\" />;\n * ```\n */\nexport default function MarkdownView(props: MarkdownViewProps) {\n const html = () =>\n props.markdown !== undefined\n ? renderSafeMarkdown(props.markdown, {\n inlineTokens: props.inlineTokens,\n allowImages: props.allowImages,\n linkProtocols: props.linkProtocols,\n linkTarget: props.linkTarget,\n })\n : props.trustedHtml;\n return (\n <div\n class={`k2b-content-markdown ${props.class ?? \"\"}`}\n data-heading-scale={props.headingScale && props.headingScale !== \"normal\" ? props.headingScale : undefined}\n innerHTML={html()}\n />\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["Link","createMemo","For","Show","useUiMessages","PaginationLink","props","onNavigate","_$createComponent","href","rel","scroll","class","aria-label","label","children","_$ssr","_tmpl$","_$ssrAttribute","_$escape","Pagination","messages","totalPages","Math","max","floor","Number","isFinite","currentPage","min","page","baseUrl","visiblePages","Set","filter","sort","left","right","when","_tmpl$4","pagination","pageOf","total","previousPage","_tmpl$2","each","index","hasGap","undefined","isCurrent","mobileVisible","_tmpl$5","fallback","goToPage","_tmpl$6","nextPage","_tmpl$3"],"sources":["content/Pagination.tsx"],"sourcesContent":["import { Link, type LinkNavigateEvent } from \"@k2b/ssr/nav\";\nimport { createMemo, For, type JSX, Show } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\n\nexport type PaginationProps = {\n currentPage: number;\n totalPages: number;\n baseUrl: string;\n onNavigate?: (event: LinkNavigateEvent) => void | Promise<void>;\n};\n\ntype PaginationLinkProps = {\n href: string;\n label: string;\n rel?: \"prev\" | \"next\";\n class?: string;\n onNavigate?: PaginationProps[\"onNavigate\"];\n children: JSX.Element;\n};\n\nconst PaginationLink = (props: PaginationLinkProps) =>\n props.onNavigate ? (\n <Link\n href={props.href}\n rel={props.rel}\n scroll=\"top\"\n onNavigate={props.onNavigate}\n class={`k2b-pagination__page ${props.class ?? \"\"}`}\n aria-label={props.label}\n >\n {props.children}\n </Link>\n ) : (\n <a href={props.href} rel={props.rel} class={`k2b-pagination__page ${props.class ?? \"\"}`} aria-label={props.label}>\n {props.children}\n </a>\n );\n\n/** Link-based pagination with directional navigation and compact mobile disclosure. */\nexport const Pagination = (props: PaginationProps): JSX.Element => {\n const messages = useUiMessages();\n const totalPages = createMemo(() => Math.max(1, Math.floor(Number.isFinite(props.totalPages) ? props.totalPages : 1)));\n const currentPage = createMemo(() =>\n Math.min(totalPages(), Math.max(1, Math.floor(Number.isFinite(props.currentPage) ? props.currentPage : 1))),\n );\n const href = (page: number) => `${props.baseUrl}${page}`;\n const visiblePages = createMemo(() =>\n [...new Set([1, currentPage() - 1, currentPage(), currentPage() + 1, totalPages()])]\n .filter((page) => page >= 1 && page <= totalPages())\n .sort((left, right) => left - right),\n );\n\n return (\n <Show when={totalPages() > 1}>\n <nav class=\"k2b-pagination\" aria-label={messages().pagination}>\n <span class=\"k2b-sr-only\">\n {messages().pageOf({ page: currentPage(), total: totalPages() })}\n </span>\n <div class=\"k2b-pagination__pages\">\n <Show when={currentPage() > 1}>\n <PaginationLink href={href(currentPage() - 1)} rel=\"prev\" label={messages().previousPage} onNavigate={props.onNavigate}>\n <i class=\"ti ti-chevron-left\" aria-hidden=\"true\" />\n </PaginationLink>\n </Show>\n\n <For each={visiblePages()}>\n {(page, index) => {\n const previousPage = () => visiblePages()[index() - 1];\n const hasGap = () => previousPage() !== undefined && page - previousPage()! > 1;\n const isCurrent = () => page === currentPage();\n const mobileVisible = () => page === 1 || page === totalPages() || isCurrent();\n\n return (\n <>\n <Show when={hasGap()}>\n <span class=\"k2b-pagination__ellipsis\" aria-hidden=\"true\">\n …\n </span>\n </Show>\n <Show\n when={isCurrent()}\n fallback={\n <PaginationLink\n href={href(page)}\n label={messages().goToPage({ page })}\n class={mobileVisible() ? \"\" : \"k2b-pagination__page--wide-only\"}\n onNavigate={props.onNavigate}\n >\n {page}\n </PaginationLink>\n }\n >\n <span class=\"k2b-pagination__page is-current\" aria-current=\"page\">\n {page}\n </span>\n </Show>\n </>\n );\n }}\n </For>\n\n <Show when={currentPage() < totalPages()}>\n <PaginationLink href={href(currentPage() + 1)} rel=\"next\" label={messages().nextPage} onNavigate={props.onNavigate}>\n <i class=\"ti ti-chevron-right\" aria-hidden=\"true\" />\n </PaginationLink>\n </Show>\n </div>\n </nav>\n </Show>\n );\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Link","createMemo","For","Show","useUiMessages","PaginationLink","props","onNavigate","_$createComponent","href","rel","scroll","class","aria-label","label","children","_$ssr","_tmpl$","_$ssrAttribute","_$escape","Pagination","messages","totalPages","Math","max","floor","Number","isFinite","currentPage","min","page","baseUrl","visiblePages","Set","filter","sort","left","right","when","_tmpl$4","pagination","pageOf","total","previousPage","_tmpl$2","each","index","hasGap","undefined","isCurrent","mobileVisible","_tmpl$5","fallback","goToPage","_tmpl$6","nextPage","_tmpl$3"],"sources":["content/Pagination.tsx"],"sourcesContent":["import { Link, type LinkNavigateEvent } from \"@k2b/ssr/nav\";\nimport { createMemo, For, type JSX, Show } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\n\nexport type PaginationProps = {\n currentPage: number;\n totalPages: number;\n baseUrl: string;\n onNavigate?: (event: LinkNavigateEvent) => void | Promise<void>;\n};\n\ntype PaginationLinkProps = {\n href: string;\n label: string;\n rel?: \"prev\" | \"next\";\n class?: string;\n onNavigate?: PaginationProps[\"onNavigate\"];\n children: JSX.Element;\n};\n\nconst PaginationLink = (props: PaginationLinkProps) =>\n props.onNavigate ? (\n <Link\n href={props.href}\n rel={props.rel}\n scroll=\"top\"\n onNavigate={props.onNavigate}\n class={`k2b-pagination__page ${props.class ?? \"\"}`}\n aria-label={props.label}\n >\n {props.children}\n </Link>\n ) : (\n <a href={props.href} rel={props.rel} class={`k2b-pagination__page ${props.class ?? \"\"}`} aria-label={props.label}>\n {props.children}\n </a>\n );\n\n/** Link-based pagination with directional navigation and compact mobile disclosure. */\nexport const Pagination = (props: PaginationProps): JSX.Element => {\n const messages = useUiMessages();\n const totalPages = createMemo(() => Math.max(1, Math.floor(Number.isFinite(props.totalPages) ? props.totalPages : 1)));\n const currentPage = createMemo(() =>\n Math.min(totalPages(), Math.max(1, Math.floor(Number.isFinite(props.currentPage) ? props.currentPage : 1))),\n );\n const href = (page: number) => `${props.baseUrl}${page}`;\n const visiblePages = createMemo(() =>\n [...new Set([1, currentPage() - 1, currentPage(), currentPage() + 1, totalPages()])]\n .filter((page) => page >= 1 && page <= totalPages())\n .sort((left, right) => left - right),\n );\n\n return (\n <Show when={totalPages() > 1}>\n <nav class=\"k2b-pagination\" aria-label={messages().pagination}>\n <span class=\"k2b-sr-only\">{messages().pageOf({ page: currentPage(), total: totalPages() })}</span>\n <div class=\"k2b-pagination__pages\">\n <Show when={currentPage() > 1}>\n <PaginationLink href={href(currentPage() - 1)} rel=\"prev\" label={messages().previousPage} onNavigate={props.onNavigate}>\n <i class=\"ti ti-chevron-left\" aria-hidden=\"true\" />\n </PaginationLink>\n </Show>\n\n <For each={visiblePages()}>\n {(page, index) => {\n const previousPage = () => visiblePages()[index() - 1];\n const hasGap = () => previousPage() !== undefined && page - previousPage()! > 1;\n const isCurrent = () => page === currentPage();\n const mobileVisible = () => page === 1 || page === totalPages() || isCurrent();\n\n return (\n <>\n <Show when={hasGap()}>\n <span class=\"k2b-pagination__ellipsis\" aria-hidden=\"true\">\n …\n </span>\n </Show>\n <Show\n when={isCurrent()}\n fallback={\n <PaginationLink\n href={href(page)}\n label={messages().goToPage({ page })}\n class={mobileVisible() ? \"\" : \"k2b-pagination__page--wide-only\"}\n onNavigate={props.onNavigate}\n >\n {page}\n </PaginationLink>\n }\n >\n <span class=\"k2b-pagination__page is-current\" aria-current=\"page\">\n {page}\n </span>\n </Show>\n </>\n );\n }}\n </For>\n\n <Show when={currentPage() < totalPages()}>\n <PaginationLink href={href(currentPage() + 1)} rel=\"next\" label={messages().nextPage} onNavigate={props.onNavigate}>\n <i class=\"ti ti-chevron-right\" aria-hidden=\"true\" />\n </PaginationLink>\n </Show>\n </div>\n </nav>\n </Show>\n );\n};\n"],"mappings":"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","ignoreList":[]}
@@ -1,14 +1,14 @@
1
- import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
2
1
  import { createComponent as _$createComponent } from "solid-js/web";
3
2
  import { ssr as _$ssr } from "solid-js/web";
4
3
  import { escape as _$escape } from "solid-js/web";
5
- var _tmpl$ = ["<h2 class=\"k2b-content-pdf-preview__title\">", "</h2>"],
6
- _tmpl$2 = ["<section class=\"", "\"><div class=\"k2b-content-pdf-preview__toolbar\"><div class=\"k2b-content-pdf-preview__heading\">", "</div><div class=\"k2b-content-pdf-preview__actions\"><button type=\"button\" class=\"k2b-button\" data-variant=\"secondary\" data-size=\"sm\"", "><i", " aria-hidden=\"true\"></i>", "</button><button type=\"button\" class=\"k2b-button\" data-variant=\"secondary\" data-size=\"sm\"", "><i", " aria-hidden=\"true\"></i>", "</button></div></div>", "</section>"],
7
- _tmpl$3 = ["<div class=\"k2b-content-pdf-preview__empty\">", "</div>"],
8
- _tmpl$4 = ["<span>", "</span>"],
9
- _tmpl$5 = ["<div class=\"k2b-content-pdf-preview__error\">", "</div>"],
10
- _tmpl$6 = ["<iframe class=\"k2b-content-pdf-preview__frame\"", "></iframe>"];
11
- import { createSignal, onCleanup, Show } from "solid-js";
4
+ import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
5
+ var _tmpl$ = ["<div class=\"k2b-content-pdf-preview__actions\"><button type=\"button\" class=\"k2b-button\" data-variant=\"secondary\" data-size=\"sm\"", "><i", " aria-hidden=\"true\"></i>", "</button><button type=\"button\" class=\"k2b-button\" data-variant=\"secondary\" data-size=\"sm\"", "><i", " aria-hidden=\"true\"></i>", "</button></div>"],
6
+ _tmpl$2 = ["<div class=\"k2b-content-pdf-preview__empty\"><span", ">", "</span></div>"],
7
+ _tmpl$3 = ["<iframe class=\"k2b-content-pdf-preview__frame\"", "></iframe>"],
8
+ _tmpl$4 = ["<div role=\"alert\" class=\"k2b-content-pdf-preview__error\">", "</div>"],
9
+ _tmpl$5 = ["<h2 class=\"k2b-content-pdf-preview__title\">", "</h2>"],
10
+ _tmpl$6 = ["<section class=\"", "\"><div class=\"k2b-content-pdf-preview__toolbar\"><div class=\"k2b-content-pdf-preview__heading\">", "</div>", "</div>", "</section>"];
11
+ import { createSignal, onCleanup, onMount, Show } from "solid-js";
12
12
  import { resolveUiMessages, useUiMessages } from "../intl/messages";
13
13
  const readErrorMessage = async response => {
14
14
  try {
@@ -69,6 +69,9 @@ export default function PdfPreview(props) {
69
69
  if (!disposed && generation === loadGeneration) setLoading(false);
70
70
  }
71
71
  };
72
+ onMount(() => {
73
+ if (props.autoLoad) void load();
74
+ });
72
75
  const openInNewTab = async () => {
73
76
  if (loading() || opening() || props.disabled?.()) return;
74
77
  const generation = ++openGeneration;
@@ -98,29 +101,39 @@ export default function PdfPreview(props) {
98
101
  if (!disposed && generation === openGeneration) setOpening(false);
99
102
  }
100
103
  };
101
- return _$ssr(_tmpl$2, `k2b-content-pdf-preview ${_$escape(props.class ?? "", true)}`, _$escape(_$createComponent(Show, {
104
+ const actions = () => _$ssr(_tmpl$, _$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), _$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));
105
+ const content = () => _$createComponent(Show, {
102
106
  get when() {
103
- return props.title;
104
- },
105
- get children() {
106
- return _$ssr(_tmpl$, _$escape(props.title));
107
- }
108
- })), _$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), _$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), _$escape(_$createComponent(Show, {
109
- get when() {
110
- return url();
107
+ return error();
111
108
  },
112
109
  get fallback() {
113
- return _$ssr(_tmpl$3, _$escape(_$createComponent(Show, {
110
+ return _$createComponent(Show, {
114
111
  get when() {
115
- return error();
112
+ return url();
116
113
  },
117
114
  get fallback() {
118
- return _$ssr(_tmpl$4, _$escape(props.emptyText ?? messages().renderPdfPreview));
115
+ return _$ssr(_tmpl$2, _$ssrAttribute("role", loading() ? "status" : _$escape(undefined, true), false), loading() ? _$escape(messages().loading) : _$escape(props.emptyText ?? messages().renderPdfPreview));
119
116
  },
120
- children: message => _$ssr(_tmpl$5, _$escape(message()))
121
- })));
117
+ children: currentUrl => _$ssr(_tmpl$3, _$ssrAttribute("src", _$escape(currentUrl(), true), false) + _$ssrAttribute("title", _$escape(props.title ?? messages().pdfPreview, true), false))
118
+ });
122
119
  },
123
- children: currentUrl => _$ssr(_tmpl$6, _$ssrAttribute("src", _$escape(currentUrl(), true), false) + _$ssrAttribute("title", _$escape(props.title ?? messages().pdfPreview, true), false))
124
- })));
120
+ children: message => props.renderError?.(message()) ?? _$ssr(_tmpl$4, _$escape(message()))
121
+ });
122
+ if (props.children) return props.children({
123
+ get actions() {
124
+ return actions();
125
+ },
126
+ get content() {
127
+ return content();
128
+ }
129
+ });
130
+ return _$ssr(_tmpl$6, `k2b-content-pdf-preview ${_$escape(props.class ?? "", true)}`, _$escape(_$createComponent(Show, {
131
+ get when() {
132
+ return props.title;
133
+ },
134
+ get children() {
135
+ return _$ssr(_tmpl$5, _$escape(props.title));
136
+ }
137
+ })), _$escape(actions()), _$escape(content()));
125
138
  }
126
139
  //# sourceMappingURL=PdfPreview.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createSignal","onCleanup","Show","resolveUiMessages","useUiMessages","readErrorMessage","response","data","json","message","pdfPreviewHttpError","status","PdfPreview","props","messages","url","setUrl","loading","setLoading","opening","setOpening","error","setError","disposed","loadGeneration","openGeneration","revokeCurrent","current","URL","revokeObjectURL","readPdfBlob","request","blob","Response","ok","Error","type","load","disabled","generation","nextUrl","createObjectURL","previousUrl","e","openInNewTab","tab","window","open","opener","document","title","pdfPreview","body","textContent","close","objectUrl","location","href","setTimeout","_$ssr","_tmpl$2","_$escape","class","_$createComponent","when","children","_tmpl$","_$ssrAttribute","openButtonLabel","openPreview","buttonLabel","previewPdf","fallback","_tmpl$3","_tmpl$4","emptyText","renderPdfPreview","_tmpl$5","currentUrl","_tmpl$6"],"sources":["content/PdfPreview.tsx"],"sourcesContent":["import { createSignal, onCleanup, Show } from \"solid-js\";\nimport { resolveUiMessages, useUiMessages } from \"../intl/messages\";\n\nexport type PdfPreviewRequest = () => Promise<Response | Blob>;\n\nexport type PdfPreviewProps = {\n request: PdfPreviewRequest;\n disabled?: () => boolean;\n title?: string;\n buttonLabel?: string;\n openButtonLabel?: string;\n emptyText?: string;\n class?: string;\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 const [loading, setLoading] = createSignal(false);\n const [opening, setOpening] = createSignal(false);\n const [error, setError] = createSignal<string | null>(null);\n let disposed = false;\n let loadGeneration = 0;\n let openGeneration = 0;\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 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 setUrl(nextUrl);\n if (previousUrl) URL.revokeObjectURL(previousUrl);\n } catch (e) {\n if (!disposed && generation === loadGeneration) setError(e instanceof Error ? e.message : \"PDF preview failed\");\n } finally {\n if (!disposed && generation === loadGeneration) setLoading(false);\n }\n };\n\n const openInNewTab = async () => {\n if (loading() || opening() || props.disabled?.()) return;\n const generation = ++openGeneration;\n const tab = window.open(\"\", \"_blank\");\n if (!tab) {\n setError(\"Browser blocked the preview tab\");\n return;\n }\n tab.opener = null;\n tab.document.title = props.title ?? messages().pdfPreview;\n tab.document.body.textContent = \"Rendering PDF preview...\";\n setOpening(true);\n setError(null);\n try {\n const blob = 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 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 <div class=\"k2b-content-pdf-preview__actions\">\n <button\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 <button\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 </div>\n </div>\n\n <Show\n when={url()}\n fallback={\n <div class=\"k2b-content-pdf-preview__empty\">\n <Show when={error()} fallback={<span>{props.emptyText ?? messages().renderPdfPreview}</span>}>\n {(message) => <div class=\"k2b-content-pdf-preview__error\">{message()}</div>}\n </Show>\n </div>\n }\n >\n {(currentUrl) => <iframe class=\"k2b-content-pdf-preview__frame\" src={currentUrl()} title={props.title ?? messages().pdfPreview} />}\n </Show>\n </section>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["createSignal","onCleanup","onMount","Show","resolveUiMessages","useUiMessages","readErrorMessage","response","data","json","message","pdfPreviewHttpError","status","PdfPreview","props","messages","url","setUrl","loading","setLoading","opening","setOpening","error","setError","disposed","loadGeneration","openGeneration","revokeCurrent","current","URL","revokeObjectURL","readPdfBlob","request","blob","Response","ok","Error","type","load","disabled","generation","nextUrl","createObjectURL","previousUrl","e","autoLoad","openInNewTab","tab","window","open","opener","document","title","pdfPreview","body","textContent","close","objectUrl","location","href","setTimeout","actions","_$ssr","_tmpl$","_$ssrAttribute","_$escape","openButtonLabel","openPreview","buttonLabel","previewPdf","content","_$createComponent","when","fallback","_tmpl$2","undefined","emptyText","renderPdfPreview","children","currentUrl","_tmpl$3","renderError","_tmpl$4","_tmpl$6","class","_tmpl$5"],"sources":["content/PdfPreview.tsx"],"sourcesContent":["import { createSignal, type JSX, onCleanup, onMount, Show } from \"solid-js\";\nimport { resolveUiMessages, useUiMessages } from \"../intl/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 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 const [loading, setLoading] = createSignal(false);\n const [opening, setOpening] = createSignal(false);\n const [error, setError] = createSignal<string | null>(null);\n let disposed = false;\n let loadGeneration = 0;\n let openGeneration = 0;\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 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 setUrl(nextUrl);\n if (previousUrl) URL.revokeObjectURL(previousUrl);\n } catch (e) {\n if (!disposed && generation === loadGeneration) setError(e instanceof Error ? e.message : \"PDF preview failed\");\n } finally {\n if (!disposed && generation === loadGeneration) setLoading(false);\n }\n };\n\n onMount(() => {\n if (props.autoLoad) 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 if (!tab) {\n setError(\"Browser blocked the preview tab\");\n return;\n }\n tab.opener = null;\n tab.document.title = props.title ?? messages().pdfPreview;\n tab.document.body.textContent = \"Rendering PDF preview...\";\n setOpening(true);\n setError(null);\n try {\n const blob = 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 const actions = () => (\n <div class=\"k2b-content-pdf-preview__actions\">\n <button\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 <button\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 </div>\n );\n const content = () => (\n <Show\n when={error()}\n fallback={\n <Show\n when={url()}\n fallback={\n <div class=\"k2b-content-pdf-preview__empty\">\n <span role={loading() ? \"status\" : undefined}>\n {loading() ? messages().loading : (props.emptyText ?? messages().renderPdfPreview)}\n </span>\n </div>\n }\n >\n {(currentUrl) => (\n <iframe class=\"k2b-content-pdf-preview__frame\" src={currentUrl()} title={props.title ?? messages().pdfPreview} />\n )}\n </Show>\n }\n >\n {(message) =>\n props.renderError?.(message()) ?? (\n <div role=\"alert\" class=\"k2b-content-pdf-preview__error\">\n {message()}\n </div>\n )\n }\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":[]}
@@ -0,0 +1,33 @@
1
+ /** Share one numeric X value between line charts. Create one instance per group. */
2
+ export function createChartCursor(options = {}) {
3
+ let state = null;
4
+ const listeners = new Set();
5
+ const notify = () => {
6
+ for (const listener of listeners) listener(state);
7
+ };
8
+ return {
9
+ formatX: options.formatX,
10
+ read: () => state,
11
+ subscribe(listener) {
12
+ listeners.add(listener);
13
+ listener(state);
14
+ return () => {
15
+ listeners.delete(listener);
16
+ };
17
+ },
18
+ move(source, x) {
19
+ if (!Number.isFinite(x) || state?.source === source && state.x === x) return;
20
+ state = {
21
+ source,
22
+ x
23
+ };
24
+ notify();
25
+ },
26
+ clear(source) {
27
+ if (state?.source !== source) return;
28
+ state = null;
29
+ notify();
30
+ }
31
+ };
32
+ }
33
+ //# sourceMappingURL=chart-cursor.js.map