@k2b/ui 0.1.0-rc.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 (548) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +343 -0
  3. package/dist/.build-complete +0 -0
  4. package/dist/browser/actions/Button.js +236 -0
  5. package/dist/browser/actions/Button.js.map +1 -0
  6. package/dist/browser/actions/ContextMenu.js +199 -0
  7. package/dist/browser/actions/ContextMenu.js.map +1 -0
  8. package/dist/browser/actions/CopyButton.js +97 -0
  9. package/dist/browser/actions/CopyButton.js.map +1 -0
  10. package/dist/browser/actions/Disclosure.js +83 -0
  11. package/dist/browser/actions/Disclosure.js.map +1 -0
  12. package/dist/browser/actions/Dropdown.js +669 -0
  13. package/dist/browser/actions/Dropdown.js.map +1 -0
  14. package/dist/browser/actions/FilterChip.js +149 -0
  15. package/dist/browser/actions/FilterChip.js.map +1 -0
  16. package/dist/browser/actions/RemoveButton.js +47 -0
  17. package/dist/browser/actions/RemoveButton.js.map +1 -0
  18. package/dist/browser/actions/SegmentedControl.js +138 -0
  19. package/dist/browser/actions/SegmentedControl.js.map +1 -0
  20. package/dist/browser/actions/SplitButton.js +76 -0
  21. package/dist/browser/actions/SplitButton.js.map +1 -0
  22. package/dist/browser/actions/SpotlightSearch.js +87 -0
  23. package/dist/browser/actions/SpotlightSearch.js.map +1 -0
  24. package/dist/browser/actions/Tabs.js +185 -0
  25. package/dist/browser/actions/Tabs.js.map +1 -0
  26. package/dist/browser/actions/Toolbar.js +87 -0
  27. package/dist/browser/actions/Toolbar.js.map +1 -0
  28. package/dist/browser/actions/index.js +13 -0
  29. package/dist/browser/actions/index.js.map +1 -0
  30. package/dist/browser/chat/ChatComposer.js +760 -0
  31. package/dist/browser/chat/ChatComposer.js.map +1 -0
  32. package/dist/browser/chat/ChatPrimitives.js +688 -0
  33. package/dist/browser/chat/ChatPrimitives.js.map +1 -0
  34. package/dist/browser/chat/ChatRoot.js +27 -0
  35. package/dist/browser/chat/ChatRoot.js.map +1 -0
  36. package/dist/browser/chat/ChatTimeline.js +404 -0
  37. package/dist/browser/chat/ChatTimeline.js.map +1 -0
  38. package/dist/browser/chat/chat-behavior.js +53 -0
  39. package/dist/browser/chat/chat-behavior.js.map +1 -0
  40. package/dist/browser/chat/index.js +17 -0
  41. package/dist/browser/chat/index.js.map +1 -0
  42. package/dist/browser/chat/types.js +2 -0
  43. package/dist/browser/chat/types.js.map +1 -0
  44. package/dist/browser/content/Calendar.js +2168 -0
  45. package/dist/browser/content/Calendar.js.map +1 -0
  46. package/dist/browser/content/Chart.js +680 -0
  47. package/dist/browser/content/Chart.js.map +1 -0
  48. package/dist/browser/content/CodeDisplay.js +104 -0
  49. package/dist/browser/content/CodeDisplay.js.map +1 -0
  50. package/dist/browser/content/DataTable.js +724 -0
  51. package/dist/browser/content/DataTable.js.map +1 -0
  52. package/dist/browser/content/Docs.js +227 -0
  53. package/dist/browser/content/Docs.js.map +1 -0
  54. package/dist/browser/content/FileBrowser.js +462 -0
  55. package/dist/browser/content/FileBrowser.js.map +1 -0
  56. package/dist/browser/content/FileTree.js +453 -0
  57. package/dist/browser/content/FileTree.js.map +1 -0
  58. package/dist/browser/content/FileView.js +842 -0
  59. package/dist/browser/content/FileView.js.map +1 -0
  60. package/dist/browser/content/Lightbox.js +285 -0
  61. package/dist/browser/content/Lightbox.js.map +1 -0
  62. package/dist/browser/content/LogEntriesTable.js +139 -0
  63. package/dist/browser/content/LogEntriesTable.js.map +1 -0
  64. package/dist/browser/content/MarkdownView.js +138 -0
  65. package/dist/browser/content/MarkdownView.js.map +1 -0
  66. package/dist/browser/content/Pagination.js +182 -0
  67. package/dist/browser/content/Pagination.js.map +1 -0
  68. package/dist/browser/content/PdfPreview.js +204 -0
  69. package/dist/browser/content/PdfPreview.js.map +1 -0
  70. package/dist/browser/content/RangePicker.js +83 -0
  71. package/dist/browser/content/RangePicker.js.map +1 -0
  72. package/dist/browser/content/StructuredDataPreview.js +194 -0
  73. package/dist/browser/content/StructuredDataPreview.js.map +1 -0
  74. package/dist/browser/content/calendar-event-layout.js +92 -0
  75. package/dist/browser/content/calendar-event-layout.js.map +1 -0
  76. package/dist/browser/content/calendar-pointer.js +114 -0
  77. package/dist/browser/content/calendar-pointer.js.map +1 -0
  78. package/dist/browser/content/chart-map-viewport.js +33 -0
  79. package/dist/browser/content/chart-map-viewport.js.map +1 -0
  80. package/dist/browser/content/chart-state-timeline.js +124 -0
  81. package/dist/browser/content/chart-state-timeline.js.map +1 -0
  82. package/dist/browser/content/code-highlight.js +144 -0
  83. package/dist/browser/content/code-highlight.js.map +1 -0
  84. package/dist/browser/content/file-tree.js +93 -0
  85. package/dist/browser/content/file-tree.js.map +1 -0
  86. package/dist/browser/content/file-view-preview.js +112 -0
  87. package/dist/browser/content/file-view-preview.js.map +1 -0
  88. package/dist/browser/content/index.js +16 -0
  89. package/dist/browser/content/index.js.map +1 -0
  90. package/dist/browser/feedback/InlineGuidance.js +46 -0
  91. package/dist/browser/feedback/InlineGuidance.js.map +1 -0
  92. package/dist/browser/feedback/Tooltip.js +189 -0
  93. package/dist/browser/feedback/Tooltip.js.map +1 -0
  94. package/dist/browser/feedback/dialog-core.js +207 -0
  95. package/dist/browser/feedback/dialog-core.js.map +1 -0
  96. package/dist/browser/feedback/index.js +6 -0
  97. package/dist/browser/feedback/index.js.map +1 -0
  98. package/dist/browser/feedback/prompts.js +991 -0
  99. package/dist/browser/feedback/prompts.js.map +1 -0
  100. package/dist/browser/feedback/toast.js +271 -0
  101. package/dist/browser/feedback/toast.js.map +1 -0
  102. package/dist/browser/feedback/tooltip-position.js +25 -0
  103. package/dist/browser/feedback/tooltip-position.js.map +1 -0
  104. package/dist/browser/index.js +11 -0
  105. package/dist/browser/index.js.map +1 -0
  106. package/dist/browser/inputs/AutocompleteEditor.js +610 -0
  107. package/dist/browser/inputs/AutocompleteEditor.js.map +1 -0
  108. package/dist/browser/inputs/AutocompleteSelect.js +632 -0
  109. package/dist/browser/inputs/AutocompleteSelect.js.map +1 -0
  110. package/dist/browser/inputs/Checkbox.js +137 -0
  111. package/dist/browser/inputs/Checkbox.js.map +1 -0
  112. package/dist/browser/inputs/CheckboxCard.js +130 -0
  113. package/dist/browser/inputs/CheckboxCard.js.map +1 -0
  114. package/dist/browser/inputs/ChoiceGroups.js +174 -0
  115. package/dist/browser/inputs/ChoiceGroups.js.map +1 -0
  116. package/dist/browser/inputs/ChoiceInputs.js +400 -0
  117. package/dist/browser/inputs/ChoiceInputs.js.map +1 -0
  118. package/dist/browser/inputs/Combobox.js +274 -0
  119. package/dist/browser/inputs/Combobox.js.map +1 -0
  120. package/dist/browser/inputs/DatePicker.js +923 -0
  121. package/dist/browser/inputs/DatePicker.js.map +1 -0
  122. package/dist/browser/inputs/FileInputs.js +736 -0
  123. package/dist/browser/inputs/FileInputs.js.map +1 -0
  124. package/dist/browser/inputs/MultiSelectInput.js +565 -0
  125. package/dist/browser/inputs/MultiSelectInput.js.map +1 -0
  126. package/dist/browser/inputs/NumberInput.js +288 -0
  127. package/dist/browser/inputs/NumberInput.js.map +1 -0
  128. package/dist/browser/inputs/Select.js +507 -0
  129. package/dist/browser/inputs/Select.js.map +1 -0
  130. package/dist/browser/inputs/SelectChip.js +151 -0
  131. package/dist/browser/inputs/SelectChip.js.map +1 -0
  132. package/dist/browser/inputs/SpecialInputs.js +117 -0
  133. package/dist/browser/inputs/SpecialInputs.js.map +1 -0
  134. package/dist/browser/inputs/Switch.js +117 -0
  135. package/dist/browser/inputs/Switch.js.map +1 -0
  136. package/dist/browser/inputs/TagEditor.js +358 -0
  137. package/dist/browser/inputs/TagEditor.js.map +1 -0
  138. package/dist/browser/inputs/TagsInput.js +195 -0
  139. package/dist/browser/inputs/TagsInput.js.map +1 -0
  140. package/dist/browser/inputs/TemplateEditor.js +190 -0
  141. package/dist/browser/inputs/TemplateEditor.js.map +1 -0
  142. package/dist/browser/inputs/TextInput.js +318 -0
  143. package/dist/browser/inputs/TextInput.js.map +1 -0
  144. package/dist/browser/inputs/choice.js +188 -0
  145. package/dist/browser/inputs/choice.js.map +1 -0
  146. package/dist/browser/inputs/completion/behaviors.js +108 -0
  147. package/dist/browser/inputs/completion/behaviors.js.map +1 -0
  148. package/dist/browser/inputs/completion/engine.js +103 -0
  149. package/dist/browser/inputs/completion/engine.js.map +1 -0
  150. package/dist/browser/inputs/completion/index.js +4 -0
  151. package/dist/browser/inputs/completion/index.js.map +1 -0
  152. package/dist/browser/inputs/completion/overlay.js +25 -0
  153. package/dist/browser/inputs/completion/overlay.js.map +1 -0
  154. package/dist/browser/inputs/date-picker.js +123 -0
  155. package/dist/browser/inputs/date-picker.js.map +1 -0
  156. package/dist/browser/inputs/editor-dom.js +26 -0
  157. package/dist/browser/inputs/editor-dom.js.map +1 -0
  158. package/dist/browser/inputs/field-contract.js +9 -0
  159. package/dist/browser/inputs/field-contract.js.map +1 -0
  160. package/dist/browser/inputs/icon-options.js +46 -0
  161. package/dist/browser/inputs/icon-options.js.map +1 -0
  162. package/dist/browser/inputs/image-crop.js +145 -0
  163. package/dist/browser/inputs/image-crop.js.map +1 -0
  164. package/dist/browser/inputs/index.js +23 -0
  165. package/dist/browser/inputs/index.js.map +1 -0
  166. package/dist/browser/inputs/markdown/MarkdownEditor.js +725 -0
  167. package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -0
  168. package/dist/browser/inputs/markdown/Toolbar.js +172 -0
  169. package/dist/browser/inputs/markdown/Toolbar.js.map +1 -0
  170. package/dist/browser/inputs/markdown/actions.js +140 -0
  171. package/dist/browser/inputs/markdown/actions.js.map +1 -0
  172. package/dist/browser/inputs/markdown/active-formats.js +36 -0
  173. package/dist/browser/inputs/markdown/active-formats.js.map +1 -0
  174. package/dist/browser/inputs/markdown/behaviors.js +63 -0
  175. package/dist/browser/inputs/markdown/behaviors.js.map +1 -0
  176. package/dist/browser/inputs/markdown/code-zone.js +8 -0
  177. package/dist/browser/inputs/markdown/code-zone.js.map +1 -0
  178. package/dist/browser/internal/color.js +18 -0
  179. package/dist/browser/internal/color.js.map +1 -0
  180. package/dist/browser/internal/field.js +158 -0
  181. package/dist/browser/internal/field.js.map +1 -0
  182. package/dist/browser/internal/portal.js +17 -0
  183. package/dist/browser/internal/portal.js.map +1 -0
  184. package/dist/browser/intl/Format.js +273 -0
  185. package/dist/browser/intl/Format.js.map +1 -0
  186. package/dist/browser/intl/index.js +3 -0
  187. package/dist/browser/intl/index.js.map +1 -0
  188. package/dist/browser/intl/locale.js +63 -0
  189. package/dist/browser/intl/locale.js.map +1 -0
  190. package/dist/browser/intl/messages.js +753 -0
  191. package/dist/browser/intl/messages.js.map +1 -0
  192. package/dist/browser/layout/AppOverview.js +151 -0
  193. package/dist/browser/layout/AppOverview.js.map +1 -0
  194. package/dist/browser/layout/AppWorkspace.js +1502 -0
  195. package/dist/browser/layout/AppWorkspace.js.map +1 -0
  196. package/dist/browser/layout/DataPanel.js +122 -0
  197. package/dist/browser/layout/DataPanel.js.map +1 -0
  198. package/dist/browser/layout/DetailPanel.js +484 -0
  199. package/dist/browser/layout/DetailPanel.js.map +1 -0
  200. package/dist/browser/layout/Discussion.js +511 -0
  201. package/dist/browser/layout/Discussion.js.map +1 -0
  202. package/dist/browser/layout/FloatingWindow.js +332 -0
  203. package/dist/browser/layout/FloatingWindow.js.map +1 -0
  204. package/dist/browser/layout/PanelDialog.js +236 -0
  205. package/dist/browser/layout/PanelDialog.js.map +1 -0
  206. package/dist/browser/layout/PanelHeader.js +91 -0
  207. package/dist/browser/layout/PanelHeader.js.map +1 -0
  208. package/dist/browser/layout/Panes.js +978 -0
  209. package/dist/browser/layout/Panes.js.map +1 -0
  210. package/dist/browser/layout/ScrollArea.js +29 -0
  211. package/dist/browser/layout/ScrollArea.js.map +1 -0
  212. package/dist/browser/layout/Settings.js +381 -0
  213. package/dist/browser/layout/Settings.js.map +1 -0
  214. package/dist/browser/layout/SettingsCollection.js +212 -0
  215. package/dist/browser/layout/SettingsCollection.js.map +1 -0
  216. package/dist/browser/layout/SettingsModal.js +281 -0
  217. package/dist/browser/layout/SettingsModal.js.map +1 -0
  218. package/dist/browser/layout/app-workspace-controller.js +419 -0
  219. package/dist/browser/layout/app-workspace-controller.js.map +1 -0
  220. package/dist/browser/layout/app-workspace-state.js +125 -0
  221. package/dist/browser/layout/app-workspace-state.js.map +1 -0
  222. package/dist/browser/layout/floating-window-geometry.js +15 -0
  223. package/dist/browser/layout/floating-window-geometry.js.map +1 -0
  224. package/dist/browser/layout/index.js +17 -0
  225. package/dist/browser/layout/index.js.map +1 -0
  226. package/dist/browser/layout/panes-layout.js +436 -0
  227. package/dist/browser/layout/panes-layout.js.map +1 -0
  228. package/dist/browser/layout/stable-id.js +17 -0
  229. package/dist/browser/layout/stable-id.js.map +1 -0
  230. package/dist/browser/semantics.js +2 -0
  231. package/dist/browser/semantics.js.map +1 -0
  232. package/dist/browser/surfaces/Avatar.js +97 -0
  233. package/dist/browser/surfaces/Avatar.js.map +1 -0
  234. package/dist/browser/surfaces/DescriptionList.js +66 -0
  235. package/dist/browser/surfaces/DescriptionList.js.map +1 -0
  236. package/dist/browser/surfaces/LinkCard.js +40 -0
  237. package/dist/browser/surfaces/LinkCard.js.map +1 -0
  238. package/dist/browser/surfaces/NotFoundState.js +85 -0
  239. package/dist/browser/surfaces/NotFoundState.js.map +1 -0
  240. package/dist/browser/surfaces/NoticeCard.js +145 -0
  241. package/dist/browser/surfaces/NoticeCard.js.map +1 -0
  242. package/dist/browser/surfaces/Paper.js +33 -0
  243. package/dist/browser/surfaces/Paper.js.map +1 -0
  244. package/dist/browser/surfaces/Placeholder.js +90 -0
  245. package/dist/browser/surfaces/Placeholder.js.map +1 -0
  246. package/dist/browser/surfaces/ProgressBar.js +58 -0
  247. package/dist/browser/surfaces/ProgressBar.js.map +1 -0
  248. package/dist/browser/surfaces/StatCell.js +172 -0
  249. package/dist/browser/surfaces/StatCell.js.map +1 -0
  250. package/dist/browser/surfaces/StatGrid.js +80 -0
  251. package/dist/browser/surfaces/StatGrid.js.map +1 -0
  252. package/dist/browser/surfaces/StatusBadge.js +70 -0
  253. package/dist/browser/surfaces/StatusBadge.js.map +1 -0
  254. package/dist/browser/surfaces/Tag.js +94 -0
  255. package/dist/browser/surfaces/Tag.js.map +1 -0
  256. package/dist/browser/surfaces/index.js +13 -0
  257. package/dist/browser/surfaces/index.js.map +1 -0
  258. package/dist/browser/widgets/Widget.js +89 -0
  259. package/dist/browser/widgets/Widget.js.map +1 -0
  260. package/dist/browser/widgets/WidgetHero.js +47 -0
  261. package/dist/browser/widgets/WidgetHero.js.map +1 -0
  262. package/dist/browser/widgets/WidgetList.js +125 -0
  263. package/dist/browser/widgets/WidgetList.js.map +1 -0
  264. package/dist/browser/widgets/WidgetPills.js +78 -0
  265. package/dist/browser/widgets/WidgetPills.js.map +1 -0
  266. package/dist/browser/widgets/WidgetStat.js +114 -0
  267. package/dist/browser/widgets/WidgetStat.js.map +1 -0
  268. package/dist/browser/widgets/WidgetStatus.js +54 -0
  269. package/dist/browser/widgets/WidgetStatus.js.map +1 -0
  270. package/dist/browser/widgets/index.js +7 -0
  271. package/dist/browser/widgets/index.js.map +1 -0
  272. package/dist/global.css +3 -0
  273. package/dist/licenses/ibm-plex-mono.txt +93 -0
  274. package/dist/licenses/ibm-plex-sans.txt +93 -0
  275. package/dist/licenses/tabler-icons.txt +21 -0
  276. package/dist/plex.css +1 -0
  277. package/dist/ssr/actions/Button.js +203 -0
  278. package/dist/ssr/actions/Button.js.map +1 -0
  279. package/dist/ssr/actions/ContextMenu.js +128 -0
  280. package/dist/ssr/actions/ContextMenu.js.map +1 -0
  281. package/dist/ssr/actions/CopyButton.js +79 -0
  282. package/dist/ssr/actions/CopyButton.js.map +1 -0
  283. package/dist/ssr/actions/Disclosure.js +26 -0
  284. package/dist/ssr/actions/Disclosure.js.map +1 -0
  285. package/dist/ssr/actions/Dropdown.js +443 -0
  286. package/dist/ssr/actions/Dropdown.js.map +1 -0
  287. package/dist/ssr/actions/FilterChip.js +132 -0
  288. package/dist/ssr/actions/FilterChip.js.map +1 -0
  289. package/dist/ssr/actions/RemoveButton.js +45 -0
  290. package/dist/ssr/actions/RemoveButton.js.map +1 -0
  291. package/dist/ssr/actions/SegmentedControl.js +57 -0
  292. package/dist/ssr/actions/SegmentedControl.js.map +1 -0
  293. package/dist/ssr/actions/SplitButton.js +74 -0
  294. package/dist/ssr/actions/SplitButton.js.map +1 -0
  295. package/dist/ssr/actions/SpotlightSearch.js +38 -0
  296. package/dist/ssr/actions/SpotlightSearch.js.map +1 -0
  297. package/dist/ssr/actions/Tabs.js +91 -0
  298. package/dist/ssr/actions/Tabs.js.map +1 -0
  299. package/dist/ssr/actions/Toolbar.js +33 -0
  300. package/dist/ssr/actions/Toolbar.js.map +1 -0
  301. package/dist/ssr/actions/index.js +13 -0
  302. package/dist/ssr/actions/index.js.map +1 -0
  303. package/dist/ssr/chat/ChatComposer.js +392 -0
  304. package/dist/ssr/chat/ChatComposer.js.map +1 -0
  305. package/dist/ssr/chat/ChatPrimitives.js +377 -0
  306. package/dist/ssr/chat/ChatPrimitives.js.map +1 -0
  307. package/dist/ssr/chat/ChatRoot.js +10 -0
  308. package/dist/ssr/chat/ChatRoot.js.map +1 -0
  309. package/dist/ssr/chat/ChatTimeline.js +301 -0
  310. package/dist/ssr/chat/ChatTimeline.js.map +1 -0
  311. package/dist/ssr/chat/chat-behavior.js +53 -0
  312. package/dist/ssr/chat/chat-behavior.js.map +1 -0
  313. package/dist/ssr/chat/index.js +17 -0
  314. package/dist/ssr/chat/index.js.map +1 -0
  315. package/dist/ssr/chat/types.js +2 -0
  316. package/dist/ssr/chat/types.js.map +1 -0
  317. package/dist/ssr/content/Calendar.js +1542 -0
  318. package/dist/ssr/content/Calendar.js.map +1 -0
  319. package/dist/ssr/content/Chart.js +552 -0
  320. package/dist/ssr/content/Chart.js.map +1 -0
  321. package/dist/ssr/content/CodeDisplay.js +55 -0
  322. package/dist/ssr/content/CodeDisplay.js.map +1 -0
  323. package/dist/ssr/content/DataTable.js +470 -0
  324. package/dist/ssr/content/DataTable.js.map +1 -0
  325. package/dist/ssr/content/Docs.js +108 -0
  326. package/dist/ssr/content/Docs.js.map +1 -0
  327. package/dist/ssr/content/FileBrowser.js +422 -0
  328. package/dist/ssr/content/FileBrowser.js.map +1 -0
  329. package/dist/ssr/content/FileTree.js +299 -0
  330. package/dist/ssr/content/FileTree.js.map +1 -0
  331. package/dist/ssr/content/FileView.js +612 -0
  332. package/dist/ssr/content/FileView.js.map +1 -0
  333. package/dist/ssr/content/Lightbox.js +164 -0
  334. package/dist/ssr/content/Lightbox.js.map +1 -0
  335. package/dist/ssr/content/LogEntriesTable.js +106 -0
  336. package/dist/ssr/content/LogEntriesTable.js.map +1 -0
  337. package/dist/ssr/content/MarkdownView.js +119 -0
  338. package/dist/ssr/content/MarkdownView.js.map +1 -0
  339. package/dist/ssr/content/Pagination.js +141 -0
  340. package/dist/ssr/content/Pagination.js.map +1 -0
  341. package/dist/ssr/content/PdfPreview.js +126 -0
  342. package/dist/ssr/content/PdfPreview.js.map +1 -0
  343. package/dist/ssr/content/RangePicker.js +35 -0
  344. package/dist/ssr/content/RangePicker.js.map +1 -0
  345. package/dist/ssr/content/StructuredDataPreview.js +127 -0
  346. package/dist/ssr/content/StructuredDataPreview.js.map +1 -0
  347. package/dist/ssr/content/calendar-event-layout.js +92 -0
  348. package/dist/ssr/content/calendar-event-layout.js.map +1 -0
  349. package/dist/ssr/content/calendar-pointer.js +114 -0
  350. package/dist/ssr/content/calendar-pointer.js.map +1 -0
  351. package/dist/ssr/content/chart-map-viewport.js +33 -0
  352. package/dist/ssr/content/chart-map-viewport.js.map +1 -0
  353. package/dist/ssr/content/chart-state-timeline.js +124 -0
  354. package/dist/ssr/content/chart-state-timeline.js.map +1 -0
  355. package/dist/ssr/content/code-highlight.js +144 -0
  356. package/dist/ssr/content/code-highlight.js.map +1 -0
  357. package/dist/ssr/content/file-tree.js +93 -0
  358. package/dist/ssr/content/file-tree.js.map +1 -0
  359. package/dist/ssr/content/file-view-preview.js +112 -0
  360. package/dist/ssr/content/file-view-preview.js.map +1 -0
  361. package/dist/ssr/content/index.js +16 -0
  362. package/dist/ssr/content/index.js.map +1 -0
  363. package/dist/ssr/feedback/InlineGuidance.js +26 -0
  364. package/dist/ssr/feedback/InlineGuidance.js.map +1 -0
  365. package/dist/ssr/feedback/Tooltip.js +156 -0
  366. package/dist/ssr/feedback/Tooltip.js.map +1 -0
  367. package/dist/ssr/feedback/dialog-core.js +207 -0
  368. package/dist/ssr/feedback/dialog-core.js.map +1 -0
  369. package/dist/ssr/feedback/index.js +6 -0
  370. package/dist/ssr/feedback/index.js.map +1 -0
  371. package/dist/ssr/feedback/prompts.js +703 -0
  372. package/dist/ssr/feedback/prompts.js.map +1 -0
  373. package/dist/ssr/feedback/toast.js +271 -0
  374. package/dist/ssr/feedback/toast.js.map +1 -0
  375. package/dist/ssr/feedback/tooltip-position.js +25 -0
  376. package/dist/ssr/feedback/tooltip-position.js.map +1 -0
  377. package/dist/ssr/index.js +11 -0
  378. package/dist/ssr/index.js.map +1 -0
  379. package/dist/ssr/inputs/AutocompleteEditor.js +463 -0
  380. package/dist/ssr/inputs/AutocompleteEditor.js.map +1 -0
  381. package/dist/ssr/inputs/AutocompleteSelect.js +420 -0
  382. package/dist/ssr/inputs/AutocompleteSelect.js.map +1 -0
  383. package/dist/ssr/inputs/Checkbox.js +75 -0
  384. package/dist/ssr/inputs/Checkbox.js.map +1 -0
  385. package/dist/ssr/inputs/CheckboxCard.js +69 -0
  386. package/dist/ssr/inputs/CheckboxCard.js.map +1 -0
  387. package/dist/ssr/inputs/ChoiceGroups.js +101 -0
  388. package/dist/ssr/inputs/ChoiceGroups.js.map +1 -0
  389. package/dist/ssr/inputs/ChoiceInputs.js +250 -0
  390. package/dist/ssr/inputs/ChoiceInputs.js.map +1 -0
  391. package/dist/ssr/inputs/Combobox.js +177 -0
  392. package/dist/ssr/inputs/Combobox.js.map +1 -0
  393. package/dist/ssr/inputs/DatePicker.js +629 -0
  394. package/dist/ssr/inputs/DatePicker.js.map +1 -0
  395. package/dist/ssr/inputs/FileInputs.js +543 -0
  396. package/dist/ssr/inputs/FileInputs.js.map +1 -0
  397. package/dist/ssr/inputs/MultiSelectInput.js +347 -0
  398. package/dist/ssr/inputs/MultiSelectInput.js.map +1 -0
  399. package/dist/ssr/inputs/NumberInput.js +177 -0
  400. package/dist/ssr/inputs/NumberInput.js.map +1 -0
  401. package/dist/ssr/inputs/Select.js +308 -0
  402. package/dist/ssr/inputs/Select.js.map +1 -0
  403. package/dist/ssr/inputs/SelectChip.js +129 -0
  404. package/dist/ssr/inputs/SelectChip.js.map +1 -0
  405. package/dist/ssr/inputs/SpecialInputs.js +116 -0
  406. package/dist/ssr/inputs/SpecialInputs.js.map +1 -0
  407. package/dist/ssr/inputs/Switch.js +62 -0
  408. package/dist/ssr/inputs/Switch.js.map +1 -0
  409. package/dist/ssr/inputs/TagEditor.js +280 -0
  410. package/dist/ssr/inputs/TagEditor.js.map +1 -0
  411. package/dist/ssr/inputs/TagsInput.js +122 -0
  412. package/dist/ssr/inputs/TagsInput.js.map +1 -0
  413. package/dist/ssr/inputs/TemplateEditor.js +164 -0
  414. package/dist/ssr/inputs/TemplateEditor.js.map +1 -0
  415. package/dist/ssr/inputs/TextInput.js +211 -0
  416. package/dist/ssr/inputs/TextInput.js.map +1 -0
  417. package/dist/ssr/inputs/choice.js +188 -0
  418. package/dist/ssr/inputs/choice.js.map +1 -0
  419. package/dist/ssr/inputs/completion/behaviors.js +108 -0
  420. package/dist/ssr/inputs/completion/behaviors.js.map +1 -0
  421. package/dist/ssr/inputs/completion/engine.js +103 -0
  422. package/dist/ssr/inputs/completion/engine.js.map +1 -0
  423. package/dist/ssr/inputs/completion/index.js +4 -0
  424. package/dist/ssr/inputs/completion/index.js.map +1 -0
  425. package/dist/ssr/inputs/completion/overlay.js +25 -0
  426. package/dist/ssr/inputs/completion/overlay.js.map +1 -0
  427. package/dist/ssr/inputs/date-picker.js +123 -0
  428. package/dist/ssr/inputs/date-picker.js.map +1 -0
  429. package/dist/ssr/inputs/editor-dom.js +26 -0
  430. package/dist/ssr/inputs/editor-dom.js.map +1 -0
  431. package/dist/ssr/inputs/field-contract.js +9 -0
  432. package/dist/ssr/inputs/field-contract.js.map +1 -0
  433. package/dist/ssr/inputs/icon-options.js +46 -0
  434. package/dist/ssr/inputs/icon-options.js.map +1 -0
  435. package/dist/ssr/inputs/image-crop.js +145 -0
  436. package/dist/ssr/inputs/image-crop.js.map +1 -0
  437. package/dist/ssr/inputs/index.js +23 -0
  438. package/dist/ssr/inputs/index.js.map +1 -0
  439. package/dist/ssr/inputs/markdown/MarkdownEditor.js +516 -0
  440. package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -0
  441. package/dist/ssr/inputs/markdown/Toolbar.js +115 -0
  442. package/dist/ssr/inputs/markdown/Toolbar.js.map +1 -0
  443. package/dist/ssr/inputs/markdown/actions.js +140 -0
  444. package/dist/ssr/inputs/markdown/actions.js.map +1 -0
  445. package/dist/ssr/inputs/markdown/active-formats.js +36 -0
  446. package/dist/ssr/inputs/markdown/active-formats.js.map +1 -0
  447. package/dist/ssr/inputs/markdown/behaviors.js +63 -0
  448. package/dist/ssr/inputs/markdown/behaviors.js.map +1 -0
  449. package/dist/ssr/inputs/markdown/code-zone.js +8 -0
  450. package/dist/ssr/inputs/markdown/code-zone.js.map +1 -0
  451. package/dist/ssr/internal/color.js +18 -0
  452. package/dist/ssr/internal/color.js.map +1 -0
  453. package/dist/ssr/internal/field.js +90 -0
  454. package/dist/ssr/internal/field.js.map +1 -0
  455. package/dist/ssr/internal/portal.js +17 -0
  456. package/dist/ssr/internal/portal.js.map +1 -0
  457. package/dist/ssr/intl/Format.js +192 -0
  458. package/dist/ssr/intl/Format.js.map +1 -0
  459. package/dist/ssr/intl/index.js +3 -0
  460. package/dist/ssr/intl/index.js.map +1 -0
  461. package/dist/ssr/intl/locale.js +63 -0
  462. package/dist/ssr/intl/locale.js.map +1 -0
  463. package/dist/ssr/intl/messages.js +753 -0
  464. package/dist/ssr/intl/messages.js.map +1 -0
  465. package/dist/ssr/layout/AppOverview.js +85 -0
  466. package/dist/ssr/layout/AppOverview.js.map +1 -0
  467. package/dist/ssr/layout/AppWorkspace.js +976 -0
  468. package/dist/ssr/layout/AppWorkspace.js.map +1 -0
  469. package/dist/ssr/layout/DataPanel.js +101 -0
  470. package/dist/ssr/layout/DataPanel.js.map +1 -0
  471. package/dist/ssr/layout/DetailPanel.js +284 -0
  472. package/dist/ssr/layout/DetailPanel.js.map +1 -0
  473. package/dist/ssr/layout/Discussion.js +319 -0
  474. package/dist/ssr/layout/Discussion.js.map +1 -0
  475. package/dist/ssr/layout/FloatingWindow.js +259 -0
  476. package/dist/ssr/layout/FloatingWindow.js.map +1 -0
  477. package/dist/ssr/layout/PanelDialog.js +136 -0
  478. package/dist/ssr/layout/PanelDialog.js.map +1 -0
  479. package/dist/ssr/layout/PanelHeader.js +45 -0
  480. package/dist/ssr/layout/PanelHeader.js.map +1 -0
  481. package/dist/ssr/layout/Panes.js +678 -0
  482. package/dist/ssr/layout/Panes.js.map +1 -0
  483. package/dist/ssr/layout/ScrollArea.js +18 -0
  484. package/dist/ssr/layout/ScrollArea.js.map +1 -0
  485. package/dist/ssr/layout/Settings.js +219 -0
  486. package/dist/ssr/layout/Settings.js.map +1 -0
  487. package/dist/ssr/layout/SettingsCollection.js +150 -0
  488. package/dist/ssr/layout/SettingsCollection.js.map +1 -0
  489. package/dist/ssr/layout/SettingsModal.js +156 -0
  490. package/dist/ssr/layout/SettingsModal.js.map +1 -0
  491. package/dist/ssr/layout/app-workspace-controller.js +419 -0
  492. package/dist/ssr/layout/app-workspace-controller.js.map +1 -0
  493. package/dist/ssr/layout/app-workspace-state.js +125 -0
  494. package/dist/ssr/layout/app-workspace-state.js.map +1 -0
  495. package/dist/ssr/layout/floating-window-geometry.js +15 -0
  496. package/dist/ssr/layout/floating-window-geometry.js.map +1 -0
  497. package/dist/ssr/layout/index.js +17 -0
  498. package/dist/ssr/layout/index.js.map +1 -0
  499. package/dist/ssr/layout/panes-layout.js +436 -0
  500. package/dist/ssr/layout/panes-layout.js.map +1 -0
  501. package/dist/ssr/layout/stable-id.js +17 -0
  502. package/dist/ssr/layout/stable-id.js.map +1 -0
  503. package/dist/ssr/semantics.js +2 -0
  504. package/dist/ssr/semantics.js.map +1 -0
  505. package/dist/ssr/surfaces/Avatar.js +43 -0
  506. package/dist/ssr/surfaces/Avatar.js.map +1 -0
  507. package/dist/ssr/surfaces/DescriptionList.js +25 -0
  508. package/dist/ssr/surfaces/DescriptionList.js.map +1 -0
  509. package/dist/ssr/surfaces/LinkCard.js +25 -0
  510. package/dist/ssr/surfaces/LinkCard.js.map +1 -0
  511. package/dist/ssr/surfaces/NotFoundState.js +38 -0
  512. package/dist/ssr/surfaces/NotFoundState.js.map +1 -0
  513. package/dist/ssr/surfaces/NoticeCard.js +83 -0
  514. package/dist/ssr/surfaces/NoticeCard.js.map +1 -0
  515. package/dist/ssr/surfaces/Paper.js +32 -0
  516. package/dist/ssr/surfaces/Paper.js.map +1 -0
  517. package/dist/ssr/surfaces/Placeholder.js +76 -0
  518. package/dist/ssr/surfaces/Placeholder.js.map +1 -0
  519. package/dist/ssr/surfaces/ProgressBar.js +13 -0
  520. package/dist/ssr/surfaces/ProgressBar.js.map +1 -0
  521. package/dist/ssr/surfaces/StatCell.js +80 -0
  522. package/dist/ssr/surfaces/StatCell.js.map +1 -0
  523. package/dist/ssr/surfaces/StatGrid.js +62 -0
  524. package/dist/ssr/surfaces/StatGrid.js.map +1 -0
  525. package/dist/ssr/surfaces/StatusBadge.js +38 -0
  526. package/dist/ssr/surfaces/StatusBadge.js.map +1 -0
  527. package/dist/ssr/surfaces/Tag.js +32 -0
  528. package/dist/ssr/surfaces/Tag.js.map +1 -0
  529. package/dist/ssr/surfaces/index.js +13 -0
  530. package/dist/ssr/surfaces/index.js.map +1 -0
  531. package/dist/ssr/widgets/Widget.js +54 -0
  532. package/dist/ssr/widgets/Widget.js.map +1 -0
  533. package/dist/ssr/widgets/WidgetHero.js +23 -0
  534. package/dist/ssr/widgets/WidgetHero.js.map +1 -0
  535. package/dist/ssr/widgets/WidgetList.js +73 -0
  536. package/dist/ssr/widgets/WidgetList.js.map +1 -0
  537. package/dist/ssr/widgets/WidgetPills.js +40 -0
  538. package/dist/ssr/widgets/WidgetPills.js.map +1 -0
  539. package/dist/ssr/widgets/WidgetStat.js +45 -0
  540. package/dist/ssr/widgets/WidgetStat.js.map +1 -0
  541. package/dist/ssr/widgets/WidgetStatus.js +23 -0
  542. package/dist/ssr/widgets/WidgetStatus.js.map +1 -0
  543. package/dist/ssr/widgets/index.js +7 -0
  544. package/dist/ssr/widgets/index.js.map +1 -0
  545. package/dist/styles.css +1 -0
  546. package/dist/tabler-icons-q30jt7jk.woff2 +0 -0
  547. package/dist/tabler.css +4 -0
  548. package/package.json +77 -0
@@ -0,0 +1,612 @@
1
+ import { ssr as _$ssr } from "solid-js/web";
2
+ import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
3
+ import { escape as _$escape } from "solid-js/web";
4
+ import { createComponent as _$createComponent } from "solid-js/web";
5
+ var _tmpl$ = ["<button type=\"button\" class=\"k2b-content-file-view__action\"", "><i class=\"", "\" aria-hidden=\"true\"></i></button>"],
6
+ _tmpl$2 = ["<a class=\"k2b-content-file-view__action\"", "><i class=\"", "\" aria-hidden=\"true\"></i><span class=\"k2b-sr-only\">", "</span></a>"],
7
+ _tmpl$3 = ["<div class=\"k2b-content-file-view__overlay\">", "</div>"],
8
+ _tmpl$4 = ["<div class=\"k2b-content-file-view__panel\"><div class=\"k2b-content-file-view__preview\">", "</div>", "</div>"],
9
+ _tmpl$5 = ["<button type=\"button\" class=\"k2b-markdown-editor__tool\"", " tabindex=\"-1\"", "><i", "></i></button>"],
10
+ _tmpl$6 = ["<div class=\"k2b-content-file-view__document\">", "</div>"],
11
+ _tmpl$7 = ["<div class=\"k2b-content-file-view__editor\">", "</div>"],
12
+ _tmpl$8 = ["<div class=\"k2b-content-file-view__editor\"><div class=\"k2b-markdown-editor\" data-fill=\"true\" role=\"group\"", "><div class=\"k2b-markdown-editor__toolbar k2b-content-file-view__code-toolbar\"><span class=\"k2b-content-file-view__code-language\">", "</span><span class=\"k2b-markdown-editor__trailing\">", "", "</span></div><div class=\"k2b-markdown-editor__surface\"><textarea class=\"k2b-content-file-view__code-input\"", " spellcheck=\"false\"></textarea></div></div></div>"],
13
+ _tmpl$9 = ["<a class=\"k2b-markdown-editor__tool\"", "><i class=\"ti ti-download\"></i></a>"],
14
+ _tmpl$0 = ["<p class=\"k2b-content-file-view__truncated\">", "</p>"],
15
+ _tmpl$1 = ["<div class=\"k2b-content-file-view__sheet\"><table class=\"k2b-content-file-view__table\"><thead><tr>", "</tr></thead><tbody>", "</tbody></table>", "</div>"],
16
+ _tmpl$10 = ["<th scope=\"col\"><span>", "</span></th>"],
17
+ _tmpl$11 = ["<tr>", "</tr>"],
18
+ _tmpl$12 = ["<td>", "</td>"],
19
+ _tmpl$13 = ["<div class=\"k2b-content-file-view__media\"><img", "></div>"],
20
+ _tmpl$14 = ["<object", " type=\"application/pdf\" class=\"k2b-content-file-view__pdf\"", "></object>"],
21
+ _tmpl$15 = ["<div class=\"k2b-content-file-view__media\" data-kind=\"audio\"><audio controls preload=\"metadata\"", ">", "</audio></div>"],
22
+ _tmpl$16 = ["<div class=\"k2b-content-file-view__media\" data-kind=\"video\"><video controls preload=\"metadata\" playsinline", ">", "</video></div>"],
23
+ _tmpl$17 = ["<a class=\"k2b-button\" data-variant=\"secondary\" data-size=\"sm\"", " download><i class=\"ti ti-download\" aria-hidden=\"true\"></i>", "</a>"],
24
+ _tmpl$18 = ["<div class=\"", "\">", "</div>"];
25
+ /**
26
+ * FileView — renders one file through a small renderer registry keyed by
27
+ * media type / path. Editing is enabled purely by the presence of `save`;
28
+ * without it every renderer is read-only. IDE-style chrome: editors reuse
29
+ * the markdown editor's surface (toolbar with an in-toolbar save, Ctrl/Cmd+S),
30
+ * previews are quiet paper panels with icon-only actions overlaid top-right.
31
+ * Custom renderers are passed per instance, which keeps SSR requests and
32
+ * independently mounted applications isolated.
33
+ */
34
+
35
+ import { mutation } from "@k2b/stdlib/solid";
36
+ import { createEffect, createMemo, createResource, createSignal, For, Match, onCleanup, Show, Switch, untrack } from "solid-js";
37
+ import { toast } from "../feedback/toast";
38
+ import { MarkdownEditor } from "../inputs/markdown/MarkdownEditor";
39
+ import { useUiMessages } from "../intl/messages";
40
+ import Placeholder from "../surfaces/Placeholder";
41
+ import CodeDisplay from "./CodeDisplay";
42
+ import { fileViewExtension, getFileViewPreviewKind, parseDelimitedText } from "./file-view-preview";
43
+ import MarkdownView from "./MarkdownView";
44
+ import StructuredDataPreview from "./StructuredDataPreview";
45
+ export { canPreviewFile, getFileViewPreviewKind } from "./file-view-preview";
46
+ const codeLanguage = path => {
47
+ const extension = fileViewExtension(path);
48
+ if (extension === "ts" || extension === "mts" || extension === "cts") return "ts";
49
+ if (extension === "tsx") return "tsx";
50
+ if (extension === "js" || extension === "mjs" || extension === "cjs") return "js";
51
+ if (extension === "jsx") return "jsx";
52
+ if (extension === "md" || extension === "markdown") return "md";
53
+ return "text";
54
+ };
55
+ const isMarkdown = (file, content) => content.encoding === "utf8" && getFileViewPreviewKind({
56
+ ...file,
57
+ mediaType: content.mediaType || file.mediaType
58
+ }) === "markdown";
59
+
60
+ /** Rendered previews hide a leading YAML frontmatter block — it's metadata, not content. */
61
+ const stripFrontmatter = text => {
62
+ const match = /^---\r?\n[\s\S]*?\r?\n---\r?\n?/.exec(text.trimStart());
63
+ return match ? text.trimStart().slice(match[0].length) : text;
64
+ };
65
+
66
+ /** Icon-only action, IDE style — sits in the floating top-right cluster of previews. */
67
+ function OverlayAction(props) {
68
+ const classes = "k2b-content-file-view__action";
69
+ return _$createComponent(Show, {
70
+ get when() {
71
+ return props.href;
72
+ },
73
+ get fallback() {
74
+ return _$ssr(_tmpl$, _$ssrAttribute("title", _$escape(props.title, true), false) + _$ssrAttribute("aria-label", _$escape(props.title, true), false), `ti ${_$escape(props.icon, true)}`);
75
+ },
76
+ children: href => _$ssr(_tmpl$2, _$ssrAttribute("href", _$escape(href(), true), false) + _$ssrAttribute("download", _$escape(props.download ?? "", true), false) + _$ssrAttribute("title", _$escape(props.title, true), false) + _$ssrAttribute("aria-label", _$escape(props.title, true), false), `ti ${_$escape(props.icon, true)}`, _$escape(props.title))
77
+ });
78
+ }
79
+
80
+ /** Scrollable preview panel with the floating action cluster overlaid top-right. */
81
+ function OverlayPanel(props) {
82
+ return _$ssr(_tmpl$4, _$escape(props.children), _$escape(_$createComponent(Show, {
83
+ get when() {
84
+ return props.actions;
85
+ },
86
+ get children() {
87
+ return _$ssr(_tmpl$3, _$escape(props.actions));
88
+ }
89
+ })));
90
+ }
91
+ const DownloadAction = props => {
92
+ const messages = useUiMessages();
93
+ return _$createComponent(Show, {
94
+ get when() {
95
+ return props.downloadHref;
96
+ },
97
+ children: href => _$createComponent(OverlayAction, {
98
+ icon: "ti-download",
99
+ get title() {
100
+ return messages().download;
101
+ },
102
+ get href() {
103
+ return href();
104
+ },
105
+ get download() {
106
+ return props.file.path.slice(props.file.path.lastIndexOf("/") + 1);
107
+ }
108
+ })
109
+ });
110
+ };
111
+
112
+ /** Toolbar-styled icon button — reuses the package markdown-editor tool primitive. */
113
+ function EditorToolButton(props) {
114
+ return _$ssr(_tmpl$5, _$ssrAttribute("title", _$escape(props.title, true), false) + _$ssrAttribute("aria-label", _$escape(props.title, true), false), _$ssrAttribute("disabled", props.disabled, true), _$ssrAttribute("class", _$escape(props.icon, true), false));
115
+ }
116
+
117
+ // ── Built-in renderers ──────────────────────────────────────────────────────
118
+
119
+ function MarkdownRenderer(props) {
120
+ const messages = useUiMessages();
121
+ const [editing, setEditing] = createSignal(false);
122
+ return _$createComponent(Show, {
123
+ get when() {
124
+ return props.editor && editing();
125
+ },
126
+ get fallback() {
127
+ return _$createComponent(OverlayPanel, {
128
+ get actions() {
129
+ return [_$createComponent(Show, {
130
+ get when() {
131
+ return props.editor;
132
+ },
133
+ get children() {
134
+ return _$createComponent(OverlayAction, {
135
+ icon: "ti-pencil",
136
+ get title() {
137
+ return messages().edit;
138
+ },
139
+ onClick: () => setEditing(true)
140
+ });
141
+ }
142
+ }), _$createComponent(DownloadAction, props)];
143
+ },
144
+ get children() {
145
+ return _$ssr(_tmpl$6, _$escape(_$createComponent(MarkdownView, {
146
+ get markdown() {
147
+ return stripFrontmatter(props.editor?.draft() ?? props.content.content);
148
+ },
149
+ headingScale: "compact"
150
+ })));
151
+ }
152
+ });
153
+ },
154
+ children: _ => {
155
+ const editor = props.editor;
156
+ return _$ssr(_tmpl$7, _$escape(_$createComponent(MarkdownEditor, {
157
+ "class": "k2b-content-file-view__markdown-field",
158
+ get ["aria-label"]() {
159
+ return `Edit ${props.file.path.slice(props.file.path.lastIndexOf("/") + 1)}`;
160
+ },
161
+ fill: true,
162
+ get value() {
163
+ return editor.draft();
164
+ },
165
+ get onValueChange() {
166
+ return editor.setDraft;
167
+ },
168
+ showStats: false,
169
+ onSave: () => void editor.save(),
170
+ get saveDisabled() {
171
+ return !editor.dirty();
172
+ },
173
+ get saving() {
174
+ return editor.saving();
175
+ },
176
+ get toolbarTrailing() {
177
+ return _$createComponent(EditorToolButton, {
178
+ icon: "ti ti-eye",
179
+ get title() {
180
+ return messages().preview;
181
+ },
182
+ onClick: () => setEditing(false)
183
+ });
184
+ }
185
+ })));
186
+ }
187
+ });
188
+ }
189
+ function TextRenderer(props) {
190
+ const messages = useUiMessages();
191
+ return _$createComponent(Show, {
192
+ get when() {
193
+ return props.editor;
194
+ },
195
+ get fallback() {
196
+ return _$createComponent(OverlayPanel, {
197
+ get actions() {
198
+ return _$createComponent(DownloadAction, props);
199
+ },
200
+ get children() {
201
+ return _$createComponent(CodeDisplay, {
202
+ get code() {
203
+ return props.content.content;
204
+ },
205
+ get language() {
206
+ return codeLanguage(props.file.path);
207
+ }
208
+ });
209
+ }
210
+ });
211
+ },
212
+ children: editor => // Same chrome as the markdown editor — literally the same classes, so
213
+ // border, radius, focus ring, toolbar height and text metrics cannot drift.
214
+ _$ssr(_tmpl$8, _$ssrAttribute("aria-label", _$escape(messages().textEditor, true), false), _$escape(codeLanguage(props.file.path)), _$escape(_$createComponent(Show, {
215
+ get when() {
216
+ return props.downloadHref;
217
+ },
218
+ children: href => _$ssr(_tmpl$9, _$ssrAttribute("href", _$escape(href(), true), false) + _$ssrAttribute("download", _$escape(props.file.path.slice(props.file.path.lastIndexOf("/") + 1), true), false) + _$ssrAttribute("title", _$escape(messages().download, true), false) + _$ssrAttribute("aria-label", _$escape(messages().download, true), false))
219
+ })), _$escape(_$createComponent(EditorToolButton, {
220
+ get icon() {
221
+ return editor().saving() ? "ti ti-loader-2 k2b-spin" : "ti ti-device-floppy";
222
+ },
223
+ get title() {
224
+ return messages().saveShortcut;
225
+ },
226
+ get disabled() {
227
+ return !editor().dirty() || editor().saving();
228
+ },
229
+ onClick: () => void editor().save()
230
+ })), _$ssrAttribute("value", _$escape(editor().draft(), true), false))
231
+ });
232
+ }
233
+ function JsonRenderer(props) {
234
+ const parsed = createMemo(() => {
235
+ try {
236
+ return {
237
+ ok: true,
238
+ value: JSON.parse(props.content.content)
239
+ };
240
+ } catch {
241
+ return {
242
+ ok: false
243
+ };
244
+ }
245
+ });
246
+ const parsedValue = () => {
247
+ const result = parsed();
248
+ return result.ok ? result.value : null;
249
+ };
250
+ return _$createComponent(OverlayPanel, {
251
+ get actions() {
252
+ return _$createComponent(DownloadAction, props);
253
+ },
254
+ get children() {
255
+ return _$ssr(_tmpl$6, _$escape(_$createComponent(Show, {
256
+ get when() {
257
+ return parsed().ok;
258
+ },
259
+ get fallback() {
260
+ return _$createComponent(CodeDisplay, {
261
+ get code() {
262
+ return props.content.content;
263
+ },
264
+ language: "text"
265
+ });
266
+ },
267
+ get children() {
268
+ return _$createComponent(StructuredDataPreview, {
269
+ get data() {
270
+ return parsedValue();
271
+ },
272
+ maxRows: 200
273
+ });
274
+ }
275
+ })));
276
+ }
277
+ });
278
+ }
279
+ function DelimitedTextRenderer(props) {
280
+ const messages = useUiMessages();
281
+ const delimiter = () => fileViewExtension(props.file.path) === "tsv" || props.content.mediaType === "text/tab-separated-values" ? "\t" : ",";
282
+ const preview = createMemo(() => parseDelimitedText(props.content.content, delimiter()));
283
+ const headers = createMemo(() => preview().rows[0] ?? []);
284
+ const rows = createMemo(() => preview().rows.slice(1));
285
+ return _$createComponent(OverlayPanel, {
286
+ get actions() {
287
+ return _$createComponent(DownloadAction, props);
288
+ },
289
+ get children() {
290
+ return _$createComponent(Show, {
291
+ get when() {
292
+ return headers().length > 0;
293
+ },
294
+ get fallback() {
295
+ return _$createComponent(Placeholder, {
296
+ icon: "ti ti-table",
297
+ get title() {
298
+ return messages().emptyFile;
299
+ },
300
+ get description() {
301
+ return messages().delimitedFileEmpty;
302
+ }
303
+ });
304
+ },
305
+ get children() {
306
+ return _$ssr(_tmpl$1, _$escape(_$createComponent(For, {
307
+ get each() {
308
+ return headers();
309
+ },
310
+ children: (header, index) => _$ssr(_tmpl$10, _$escape(header || messages().column({
311
+ number: index() + 1
312
+ })))
313
+ })), _$escape(_$createComponent(For, {
314
+ get each() {
315
+ return rows();
316
+ },
317
+ children: row => _$ssr(_tmpl$11, _$escape(_$createComponent(For, {
318
+ get each() {
319
+ return headers();
320
+ },
321
+ children: (_, index) => _$ssr(_tmpl$12, _$escape(row[index()] ?? ""))
322
+ })))
323
+ })), _$escape(_$createComponent(Show, {
324
+ get when() {
325
+ return preview().truncated;
326
+ },
327
+ get children() {
328
+ return _$ssr(_tmpl$0, _$escape(messages().previewLimited));
329
+ }
330
+ })));
331
+ }
332
+ });
333
+ }
334
+ });
335
+ }
336
+ const mediaSource = props => props.previewHref ?? `data:${props.content.mediaType};base64,${props.content.content}`;
337
+ function ImageRenderer(props) {
338
+ return _$createComponent(OverlayPanel, {
339
+ get actions() {
340
+ return _$createComponent(DownloadAction, props);
341
+ },
342
+ get children() {
343
+ return _$ssr(_tmpl$13, _$ssrAttribute("src", _$escape(mediaSource(props), true), false) + _$ssrAttribute("alt", _$escape(props.file.path, true), false));
344
+ }
345
+ });
346
+ }
347
+ function PdfRenderer(props) {
348
+ const messages = useUiMessages();
349
+ const href = () => props.previewHref ?? props.downloadHref;
350
+ return _$createComponent(Show, {
351
+ get when() {
352
+ return href();
353
+ },
354
+ get fallback() {
355
+ return _$createComponent(Placeholder, {
356
+ icon: "ti ti-file-type-pdf",
357
+ title: "PDF",
358
+ get description() {
359
+ return messages().noInlinePreview;
360
+ }
361
+ });
362
+ },
363
+ children: href => _$ssr(_tmpl$14, _$ssrAttribute("data", _$escape(href(), true), false), _$ssrAttribute("aria-label", _$escape(props.file.path, true), false))
364
+ });
365
+ }
366
+ function AudioRenderer(props) {
367
+ const messages = useUiMessages();
368
+ return _$createComponent(OverlayPanel, {
369
+ get actions() {
370
+ return _$createComponent(DownloadAction, props);
371
+ },
372
+ get children() {
373
+ return _$ssr(_tmpl$15, _$ssrAttribute("src", _$escape(mediaSource(props), true), false) + _$ssrAttribute("aria-label", _$escape(props.file.path, true), false), _$escape(messages().audioUnsupported));
374
+ }
375
+ });
376
+ }
377
+ function VideoRenderer(props) {
378
+ const messages = useUiMessages();
379
+ return _$createComponent(OverlayPanel, {
380
+ get actions() {
381
+ return _$createComponent(DownloadAction, props);
382
+ },
383
+ get children() {
384
+ return _$ssr(_tmpl$16, _$ssrAttribute("src", _$escape(mediaSource(props), true), false) + _$ssrAttribute("aria-label", _$escape(props.file.path, true), false), _$escape(messages().videoUnsupported));
385
+ }
386
+ });
387
+ }
388
+ function BinaryRenderer(props) {
389
+ const messages = useUiMessages();
390
+ return _$createComponent(Placeholder, {
391
+ icon: "ti ti-file-unknown",
392
+ get title() {
393
+ return messages().noPreview;
394
+ },
395
+ get description() {
396
+ return props.content.mediaType || messages().binaryFile;
397
+ },
398
+ get action() {
399
+ return _$createComponent(Show, {
400
+ get when() {
401
+ return props.downloadHref;
402
+ },
403
+ children: href => _$ssr(_tmpl$17, _$ssrAttribute("href", _$escape(href(), true), false), _$escape(messages().download))
404
+ });
405
+ }
406
+ });
407
+ }
408
+ const BUILTIN_RENDERERS = [{
409
+ id: "markdown",
410
+ match: isMarkdown,
411
+ component: MarkdownRenderer,
412
+ editable: true
413
+ }, {
414
+ id: "image",
415
+ match: (file, content) => getFileViewPreviewKind({
416
+ ...file,
417
+ mediaType: content.mediaType || file.mediaType
418
+ }) === "image",
419
+ component: ImageRenderer
420
+ }, {
421
+ id: "pdf",
422
+ match: (file, content) => getFileViewPreviewKind({
423
+ ...file,
424
+ mediaType: content.mediaType || file.mediaType
425
+ }) === "pdf",
426
+ component: PdfRenderer
427
+ }, {
428
+ id: "json",
429
+ match: (file, content) => content.encoding === "utf8" && getFileViewPreviewKind({
430
+ ...file,
431
+ mediaType: content.mediaType || file.mediaType
432
+ }) === "json",
433
+ component: JsonRenderer
434
+ }, {
435
+ id: "delimited-text",
436
+ match: (file, content) => content.encoding === "utf8" && getFileViewPreviewKind({
437
+ ...file,
438
+ mediaType: content.mediaType || file.mediaType
439
+ }) === "delimited-text",
440
+ component: DelimitedTextRenderer
441
+ }, {
442
+ id: "audio",
443
+ match: (file, content) => getFileViewPreviewKind({
444
+ ...file,
445
+ mediaType: content.mediaType || file.mediaType
446
+ }) === "audio",
447
+ component: AudioRenderer
448
+ }, {
449
+ id: "video",
450
+ match: (file, content) => getFileViewPreviewKind({
451
+ ...file,
452
+ mediaType: content.mediaType || file.mediaType
453
+ }) === "video",
454
+ component: VideoRenderer
455
+ }, {
456
+ id: "text",
457
+ match: (_file, content) => content.encoding === "utf8",
458
+ component: TextRenderer,
459
+ editable: true
460
+ }, {
461
+ id: "binary",
462
+ match: () => true,
463
+ component: BinaryRenderer
464
+ }];
465
+
466
+ // ── Component ───────────────────────────────────────────────────────────────
467
+
468
+ export const formatFileViewSize = bytes => {
469
+ if (bytes < 1024) return `${bytes} B`;
470
+ if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
471
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
472
+ };
473
+ export default function FileView(props) {
474
+ const messages = useUiMessages();
475
+ const [draft, setDraft] = createSignal("");
476
+ const [savedDraft, setSavedDraft] = createSignal("");
477
+ const [nativeRevision, setNativeRevision] = createSignal(0);
478
+ const dirty = createMemo(() => draft() !== savedDraft());
479
+ const instanceRenderers = () => props.renderers ?? [];
480
+ const saveMutation = mutation.create({
481
+ mutation: async input => {
482
+ await props.save(input.content);
483
+ return input;
484
+ },
485
+ onSuccess: saved => {
486
+ if (props.file.path === saved.path) setSavedDraft(saved.content);
487
+ toast.success(messages().fileSaved);
488
+ },
489
+ onError: error => toast.error(error.message)
490
+ });
491
+ const nativePreviewHref = createMemo(() => {
492
+ const kind = getFileViewPreviewKind(props.file);
493
+ const href = props.previewHref ?? (kind === "pdf" ? props.downloadHref : null);
494
+ if (!href) return null;
495
+ const separator = href.includes("?") ? "&" : "?";
496
+ return `${href}${separator}preview-revision=${nativeRevision()}`;
497
+ });
498
+ const browserPreviewContent = createMemo(() => {
499
+ const kind = getFileViewPreviewKind(props.file);
500
+ if (kind !== "image" && kind !== "pdf" && kind !== "audio" && kind !== "video") return null;
501
+ const href = nativePreviewHref();
502
+ if (!href) return null;
503
+ const candidate = {
504
+ encoding: "base64",
505
+ content: "",
506
+ mediaType: props.file.mediaType ?? "application/octet-stream"
507
+ };
508
+ return instanceRenderers().some(renderer => renderer.match(props.file, candidate)) ? null : candidate;
509
+ });
510
+ const [content, {
511
+ refetch
512
+ }] = createResource(() => browserPreviewContent() ? null : {
513
+ path: props.file.path,
514
+ revision: props.revision
515
+ }, async () => {
516
+ saveMutation.abort();
517
+ // `load` is an imperative source adapter. Host signal reads inside it
518
+ // must not turn this resource into a hidden reactive feedback loop.
519
+ const loaded = await untrack(() => props.load());
520
+ const loadedDraft = loaded.encoding === "utf8" ? loaded.content : "";
521
+ setDraft(loadedDraft);
522
+ setSavedDraft(loadedDraft);
523
+ return loaded;
524
+ });
525
+ createEffect(() => {
526
+ if (!props.registerRefresh) return;
527
+ const unregister = props.registerRefresh(async () => {
528
+ if (browserPreviewContent()) setNativeRevision(value => value + 1);else await refetch();
529
+ });
530
+ if (unregister) onCleanup(unregister);
531
+ });
532
+ const resolvedContent = createMemo(() => browserPreviewContent() ?? content());
533
+ const renderer = createMemo(() => {
534
+ const loaded = resolvedContent();
535
+ if (!loaded) return null;
536
+ return [...instanceRenderers(), ...BUILTIN_RENDERERS].find(candidate => candidate.match(props.file, loaded)) ?? null;
537
+ });
538
+ createEffect(() => {
539
+ props.onDirtyChange?.(dirty());
540
+ });
541
+ const save = async () => {
542
+ if (!props.save || saveMutation.loading()) return;
543
+ await saveMutation.mutate({
544
+ path: props.file.path,
545
+ content: draft()
546
+ });
547
+ };
548
+ const editor = () => props.save && renderer()?.editable && resolvedContent()?.encoding === "utf8" ? {
549
+ draft,
550
+ setDraft,
551
+ dirty,
552
+ saving: saveMutation.loading,
553
+ save
554
+ } : null;
555
+ return _$ssr(_tmpl$18, `k2b-content-file-view ${_$escape(props.class ?? "", true)}`, _$escape(_$createComponent(Switch, {
556
+ get children() {
557
+ return [_$createComponent(Match, {
558
+ get when() {
559
+ return content.loading && content() === undefined;
560
+ },
561
+ get children() {
562
+ return _$createComponent(Placeholder, {
563
+ icon: "ti ti-loader-2",
564
+ get title() {
565
+ return messages().loading;
566
+ }
567
+ });
568
+ }
569
+ }), _$createComponent(Match, {
570
+ get when() {
571
+ return content.error;
572
+ },
573
+ get children() {
574
+ return _$createComponent(Placeholder, {
575
+ icon: "ti ti-alert-circle",
576
+ get title() {
577
+ return messages().failedLoadFile;
578
+ },
579
+ get description() {
580
+ return String(content.error?.message ?? "");
581
+ }
582
+ });
583
+ }
584
+ }), _$createComponent(Match, {
585
+ get when() {
586
+ return resolvedContent() && renderer();
587
+ },
588
+ children: active => {
589
+ const Renderer = active().component;
590
+ return _$createComponent(Renderer, {
591
+ get file() {
592
+ return props.file;
593
+ },
594
+ get content() {
595
+ return resolvedContent();
596
+ },
597
+ get previewHref() {
598
+ return nativePreviewHref();
599
+ },
600
+ get downloadHref() {
601
+ return props.downloadHref ?? null;
602
+ },
603
+ get editor() {
604
+ return editor();
605
+ }
606
+ });
607
+ }
608
+ })];
609
+ }
610
+ })));
611
+ }
612
+ //# sourceMappingURL=FileView.js.map