@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,93 @@
1
+ /**
2
+ * Tree shaping for FileTree — flat paths in, sorted nodes out.
3
+ *
4
+ * Kept beside the component rather than inside it because it is pure: no JSX,
5
+ * no reactivity, nothing that needs a DOM. That is also what makes it testable
6
+ * — a test importing the .tsx pulls the whole component through Bun's JSX
7
+ * transform, which resolves against the root tsconfig and lands on the React
8
+ * runtime. Same reason `file-view-preview.ts` sits next to FileView.
9
+ */
10
+
11
+ /** Containing directory of a path; "/" for top-level entries. */
12
+ export const parentOf = path => {
13
+ const index = path.lastIndexOf("/");
14
+ return index <= 0 ? "/" : path.slice(0, index);
15
+ };
16
+ const nameOf = path => path.slice(path.lastIndexOf("/") + 1) || path;
17
+ const nodesByPath = nodes => {
18
+ const result = new Map();
19
+ const visit = node => {
20
+ result.set(node.entry.path, node);
21
+ for (const child of node.children) visit(child);
22
+ };
23
+ for (const node of nodes) visit(node);
24
+ return result;
25
+ };
26
+
27
+ /**
28
+ * Flat paths → sorted tree (folders first, then files, both alphabetical).
29
+ *
30
+ * Passing the previous tree preserves object identity by path while updating
31
+ * the cached node in place. Solid's keyed `<For>` can then keep rows, rename
32
+ * inputs, and focus alive even when a refetch changes metadata.
33
+ */
34
+ export const buildTree = (entries, previous = []) => {
35
+ const byPath = new Map();
36
+ const previousByPath = nodesByPath(previous);
37
+ const folders = new Set();
38
+ const files = new Set(entries.filter(entry => entry.kind !== "folder").map(entry => entry.path));
39
+ for (const entry of entries) {
40
+ for (let dir = parentOf(entry.path); dir !== "/"; dir = parentOf(dir)) {
41
+ if (files.has(dir)) {
42
+ throw new Error(`FileTree entry conflict: "${dir}" is a file and cannot contain "${entry.path}".`);
43
+ }
44
+ }
45
+ }
46
+ for (const entry of entries) {
47
+ byPath.set(entry.path, entry);
48
+ if (entry.kind === "folder") folders.add(entry.path);
49
+ // Register all ancestor folders of every entry.
50
+ for (let dir = parentOf(entry.path); dir !== "/"; dir = parentOf(dir)) folders.add(dir);
51
+ }
52
+ const childrenByParent = new Map();
53
+ for (const path of new Set([...byPath.keys(), ...folders])) {
54
+ if (path === "/") continue;
55
+ const parent = parentOf(path);
56
+ const children = childrenByParent.get(parent);
57
+ if (children) children.push(path);else childrenByParent.set(parent, [path]);
58
+ }
59
+ const nodeFor = (path, depth) => {
60
+ const entry = byPath.get(path) ?? {
61
+ path,
62
+ kind: "folder"
63
+ };
64
+ const isFolder = folders.has(path);
65
+ const old = previousByPath.get(path);
66
+ if (old) {
67
+ old.entry = entry;
68
+ old.name = nameOf(path);
69
+ old.depth = depth;
70
+ old.isFolder = isFolder;
71
+ return old;
72
+ }
73
+ return {
74
+ entry,
75
+ name: nameOf(path),
76
+ depth,
77
+ isFolder,
78
+ children: []
79
+ };
80
+ };
81
+ const childrenOf = (dir, depth) => {
82
+ const nodes = (childrenByParent.get(dir) ?? []).map(path => {
83
+ const node = nodeFor(path, depth);
84
+ if (node.isFolder) node.children = childrenOf(node.entry.path, depth + 1);
85
+ return node;
86
+ });
87
+ return nodes.sort((a, b) => a.isFolder === b.isFolder ? a.name.localeCompare(b.name) : a.isFolder ? -1 : 1);
88
+ };
89
+ return childrenOf("/", 0);
90
+ };
91
+ export const flattenVisible = (nodes, expanded) => nodes.flatMap(node => [node, ...(node.isFolder && expanded.has(node.entry.path) ? flattenVisible(node.children, expanded) : [])]);
92
+ export const allFolderPaths = nodes => nodes.flatMap(node => node.isFolder ? [node.entry.path, ...allFolderPaths(node.children)] : []);
93
+ //# sourceMappingURL=file-tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["parentOf","path","index","lastIndexOf","slice","nameOf","nodesByPath","nodes","result","Map","visit","node","set","entry","child","children","buildTree","entries","previous","byPath","previousByPath","folders","Set","files","filter","kind","map","dir","has","Error","add","childrenByParent","keys","parent","get","push","nodeFor","depth","isFolder","old","name","childrenOf","sort","a","b","localeCompare","flattenVisible","expanded","flatMap","allFolderPaths"],"sources":["content/file-tree.ts"],"sourcesContent":["/**\n * Tree shaping for FileTree — flat paths in, sorted nodes out.\n *\n * Kept beside the component rather than inside it because it is pure: no JSX,\n * no reactivity, nothing that needs a DOM. That is also what makes it testable\n * — a test importing the .tsx pulls the whole component through Bun's JSX\n * transform, which resolves against the root tsconfig and lands on the React\n * runtime. Same reason `file-view-preview.ts` sits next to FileView.\n */\n\nexport type FileTreeEntry = {\n /** Canonical identity, e.g. \"/input/report.csv\". */\n path: string;\n /** Folders are usually implicit from paths — explicit entries model empty dirs. */\n kind?: \"file\" | \"folder\";\n size?: number;\n mediaType?: string;\n updatedAt?: string;\n /** Icon override (tabler class without \"ti \" prefix); default derives from the name. */\n icon?: string;\n /** Small trailing badge, e.g. \"ro\" on read-only mounts. */\n badge?: string;\n};\n\nexport type TreeNode = {\n entry: FileTreeEntry;\n name: string;\n depth: number;\n isFolder: boolean;\n children: TreeNode[];\n};\n\n/** Containing directory of a path; \"/\" for top-level entries. */\nexport const parentOf = (path: string): string => {\n const index = path.lastIndexOf(\"/\");\n return index <= 0 ? \"/\" : path.slice(0, index);\n};\n\nconst nameOf = (path: string): string => path.slice(path.lastIndexOf(\"/\") + 1) || path;\n\nconst nodesByPath = (nodes: TreeNode[]): Map<string, TreeNode> => {\n const result = new Map<string, TreeNode>();\n const visit = (node: TreeNode) => {\n result.set(node.entry.path, node);\n for (const child of node.children) visit(child);\n };\n for (const node of nodes) visit(node);\n return result;\n};\n\n/**\n * Flat paths → sorted tree (folders first, then files, both alphabetical).\n *\n * Passing the previous tree preserves object identity by path while updating\n * the cached node in place. Solid's keyed `<For>` can then keep rows, rename\n * inputs, and focus alive even when a refetch changes metadata.\n */\nexport const buildTree = (entries: FileTreeEntry[], previous: TreeNode[] = []): TreeNode[] => {\n const byPath = new Map<string, FileTreeEntry>();\n const previousByPath = nodesByPath(previous);\n const folders = new Set<string>();\n const files = new Set(entries.filter((entry) => entry.kind !== \"folder\").map((entry) => entry.path));\n for (const entry of entries) {\n for (let dir = parentOf(entry.path); dir !== \"/\"; dir = parentOf(dir)) {\n if (files.has(dir)) {\n throw new Error(`FileTree entry conflict: \"${dir}\" is a file and cannot contain \"${entry.path}\".`);\n }\n }\n }\n for (const entry of entries) {\n byPath.set(entry.path, entry);\n if (entry.kind === \"folder\") folders.add(entry.path);\n // Register all ancestor folders of every entry.\n for (let dir = parentOf(entry.path); dir !== \"/\"; dir = parentOf(dir)) folders.add(dir);\n }\n const childrenByParent = new Map<string, string[]>();\n for (const path of new Set([...byPath.keys(), ...folders])) {\n if (path === \"/\") continue;\n const parent = parentOf(path);\n const children = childrenByParent.get(parent);\n if (children) children.push(path);\n else childrenByParent.set(parent, [path]);\n }\n\n const nodeFor = (path: string, depth: number): TreeNode => {\n const entry = byPath.get(path) ?? { path, kind: \"folder\" as const };\n const isFolder = folders.has(path);\n const old = previousByPath.get(path);\n if (old) {\n old.entry = entry;\n old.name = nameOf(path);\n old.depth = depth;\n old.isFolder = isFolder;\n return old;\n }\n return { entry, name: nameOf(path), depth, isFolder, children: [] };\n };\n\n const childrenOf = (dir: string, depth: number): TreeNode[] => {\n const nodes = (childrenByParent.get(dir) ?? []).map((path) => {\n const node = nodeFor(path, depth);\n if (node.isFolder) node.children = childrenOf(node.entry.path, depth + 1);\n return node;\n });\n return nodes.sort((a, b) => (a.isFolder === b.isFolder ? a.name.localeCompare(b.name) : a.isFolder ? -1 : 1));\n };\n\n return childrenOf(\"/\", 0);\n};\n\nexport const flattenVisible = (nodes: TreeNode[], expanded: Set<string>): TreeNode[] =>\n nodes.flatMap((node) => [node, ...(node.isFolder && expanded.has(node.entry.path) ? flattenVisible(node.children, expanded) : [])]);\n\nexport const allFolderPaths = (nodes: TreeNode[]): string[] =>\n nodes.flatMap((node) => (node.isFolder ? [node.entry.path, ...allFolderPaths(node.children)] : []));\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,112 @@
1
+ const MEBIBYTE = 1024 * 1024;
2
+ const maxPreviewBytes = {
3
+ markdown: 2 * MEBIBYTE,
4
+ image: 25 * MEBIBYTE,
5
+ pdf: 50 * MEBIBYTE,
6
+ json: 2 * MEBIBYTE,
7
+ "delimited-text": 2 * MEBIBYTE,
8
+ audio: 50 * MEBIBYTE,
9
+ video: 50 * MEBIBYTE,
10
+ text: 2 * MEBIBYTE
11
+ };
12
+
13
+ // SVG remains inert because FileView renders every image through <img>; never inject its markup into the DOM.
14
+ const imageMediaTypes = new Set(["image/avif", "image/bmp", "image/gif", "image/jpeg", "image/png", "image/svg+xml", "image/webp", "image/x-icon"]);
15
+ const audioMediaTypes = new Set(["audio/aac", "audio/flac", "audio/mp4", "audio/mpeg", "audio/ogg", "audio/wav", "audio/webm", "audio/x-wav"]);
16
+ const videoMediaTypes = new Set(["video/mp4", "video/ogg", "video/webm"]);
17
+ const markdownExtensions = new Set(["md", "markdown"]);
18
+ const imageExtensions = new Set(["avif", "bmp", "gif", "ico", "jpeg", "jpg", "png", "svg", "webp"]);
19
+ const audioExtensions = new Set(["aac", "flac", "m4a", "mp3", "oga", "ogg", "wav", "weba"]);
20
+ const videoExtensions = new Set(["m4v", "mp4", "ogv", "webm"]);
21
+ const textExtensions = new Set(["c", "conf", "cpp", "css", "env", "go", "h", "html", "ini", "java", "js", "jsx", "log", "mjs", "php", "py", "rb", "rs", "sh", "sql", "toml", "ts", "tsx", "txt", "xml", "yaml", "yml"]);
22
+ export const fileViewExtension = path => {
23
+ const cleanPath = path.split(/[?#]/, 1)[0] ?? path;
24
+ const name = cleanPath.slice(cleanPath.lastIndexOf("/") + 1);
25
+ const dot = name.lastIndexOf(".");
26
+ return dot > 0 ? name.slice(dot + 1).toLowerCase() : "";
27
+ };
28
+ const normalizedMediaType = mediaType => mediaType?.split(";", 1)[0]?.trim().toLowerCase() ?? "";
29
+ const previewKindByType = file => {
30
+ const extension = fileViewExtension(file.path);
31
+ const mediaType = normalizedMediaType(file.mediaType);
32
+ if (mediaType === "text/markdown" || markdownExtensions.has(extension)) return "markdown";
33
+ if (mediaType === "application/json" || mediaType.endsWith("+json") || extension === "json") return "json";
34
+ if (mediaType === "text/csv" || mediaType === "text/tab-separated-values" || extension === "csv" || extension === "tsv") {
35
+ return "delimited-text";
36
+ }
37
+ if (mediaType === "application/pdf" || extension === "pdf") return "pdf";
38
+ if (imageMediaTypes.has(mediaType) || imageExtensions.has(extension)) return "image";
39
+ if (audioMediaTypes.has(mediaType) || audioExtensions.has(extension)) return "audio";
40
+ if (videoMediaTypes.has(mediaType) || videoExtensions.has(extension)) return "video";
41
+ if (mediaType.startsWith("text/") || mediaType === "application/javascript" || mediaType === "application/sql" || mediaType === "application/xml" || textExtensions.has(extension)) {
42
+ return "text";
43
+ }
44
+ return null;
45
+ };
46
+
47
+ /**
48
+ * Returns the built-in preview kind when FileView can render the file within
49
+ * its bounded client-side limits. Custom renderers remain registry-driven.
50
+ */
51
+ export const getFileViewPreviewKind = file => {
52
+ const kind = previewKindByType(file);
53
+ if (!kind) return null;
54
+ if (file.size !== undefined && (!Number.isFinite(file.size) || file.size < 0 || file.size > maxPreviewBytes[kind])) {
55
+ return null;
56
+ }
57
+ return kind;
58
+ };
59
+
60
+ /** Use this to expose preview actions only for files FileView can render. */
61
+ export const canPreviewFile = file => getFileViewPreviewKind(file) !== null;
62
+ export const parseDelimitedText = (input, delimiter, limits = {}) => {
63
+ const maxRows = Math.max(1, limits.rows ?? 201);
64
+ const maxColumns = Math.max(1, limits.columns ?? 50);
65
+ const rows = [];
66
+ let row = [];
67
+ let field = "";
68
+ let quoted = false;
69
+ let truncated = false;
70
+ const pushField = () => {
71
+ if (row.length < maxColumns) row.push(field);else truncated = true;
72
+ field = "";
73
+ };
74
+ const pushRow = () => {
75
+ if (rows.length < maxRows) rows.push(row);else truncated = true;
76
+ row = [];
77
+ };
78
+ for (let index = 0; index < input.length; index += 1) {
79
+ const character = input[index];
80
+ if (quoted) {
81
+ if (character === '"' && input[index + 1] === '"') {
82
+ field += '"';
83
+ index += 1;
84
+ } else if (character === '"') {
85
+ quoted = false;
86
+ } else {
87
+ field += character;
88
+ }
89
+ continue;
90
+ }
91
+ if (character === '"' && field.length === 0) quoted = true;else if (character === delimiter) pushField();else if (character === "\n" || character === "\r") {
92
+ pushField();
93
+ pushRow();
94
+ if (character === "\r" && input[index + 1] === "\n") index += 1;
95
+ if (rows.length >= maxRows && index < input.length - 1) {
96
+ truncated = true;
97
+ break;
98
+ }
99
+ } else {
100
+ field += character;
101
+ }
102
+ }
103
+ if (field.length > 0 || row.length > 0) {
104
+ pushField();
105
+ pushRow();
106
+ }
107
+ return {
108
+ rows,
109
+ truncated
110
+ };
111
+ };
112
+ //# sourceMappingURL=file-view-preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["MEBIBYTE","maxPreviewBytes","markdown","image","pdf","json","audio","video","text","imageMediaTypes","Set","audioMediaTypes","videoMediaTypes","markdownExtensions","imageExtensions","audioExtensions","videoExtensions","textExtensions","fileViewExtension","path","cleanPath","split","name","slice","lastIndexOf","dot","toLowerCase","normalizedMediaType","mediaType","trim","previewKindByType","file","extension","has","endsWith","startsWith","getFileViewPreviewKind","kind","size","undefined","Number","isFinite","canPreviewFile","parseDelimitedText","input","delimiter","limits","maxRows","Math","max","rows","maxColumns","columns","row","field","quoted","truncated","pushField","length","push","pushRow","index","character"],"sources":["content/file-view-preview.ts"],"sourcesContent":["export type FileViewFile = {\n path: string;\n mediaType?: string;\n size?: number;\n};\n\nexport type FileViewPreviewKind = \"markdown\" | \"image\" | \"pdf\" | \"json\" | \"delimited-text\" | \"audio\" | \"video\" | \"text\";\n\nconst MEBIBYTE = 1024 * 1024;\n\nconst maxPreviewBytes: Record<FileViewPreviewKind, number> = {\n markdown: 2 * MEBIBYTE,\n image: 25 * MEBIBYTE,\n pdf: 50 * MEBIBYTE,\n json: 2 * MEBIBYTE,\n \"delimited-text\": 2 * MEBIBYTE,\n audio: 50 * MEBIBYTE,\n video: 50 * MEBIBYTE,\n text: 2 * MEBIBYTE,\n};\n\n// SVG remains inert because FileView renders every image through <img>; never inject its markup into the DOM.\nconst imageMediaTypes = new Set([\n \"image/avif\",\n \"image/bmp\",\n \"image/gif\",\n \"image/jpeg\",\n \"image/png\",\n \"image/svg+xml\",\n \"image/webp\",\n \"image/x-icon\",\n]);\nconst audioMediaTypes = new Set([\n \"audio/aac\",\n \"audio/flac\",\n \"audio/mp4\",\n \"audio/mpeg\",\n \"audio/ogg\",\n \"audio/wav\",\n \"audio/webm\",\n \"audio/x-wav\",\n]);\nconst videoMediaTypes = new Set([\"video/mp4\", \"video/ogg\", \"video/webm\"]);\n\nconst markdownExtensions = new Set([\"md\", \"markdown\"]);\nconst imageExtensions = new Set([\"avif\", \"bmp\", \"gif\", \"ico\", \"jpeg\", \"jpg\", \"png\", \"svg\", \"webp\"]);\nconst audioExtensions = new Set([\"aac\", \"flac\", \"m4a\", \"mp3\", \"oga\", \"ogg\", \"wav\", \"weba\"]);\nconst videoExtensions = new Set([\"m4v\", \"mp4\", \"ogv\", \"webm\"]);\nconst textExtensions = new Set([\n \"c\",\n \"conf\",\n \"cpp\",\n \"css\",\n \"env\",\n \"go\",\n \"h\",\n \"html\",\n \"ini\",\n \"java\",\n \"js\",\n \"jsx\",\n \"log\",\n \"mjs\",\n \"php\",\n \"py\",\n \"rb\",\n \"rs\",\n \"sh\",\n \"sql\",\n \"toml\",\n \"ts\",\n \"tsx\",\n \"txt\",\n \"xml\",\n \"yaml\",\n \"yml\",\n]);\n\nexport const fileViewExtension = (path: string): string => {\n const cleanPath = path.split(/[?#]/, 1)[0] ?? path;\n const name = cleanPath.slice(cleanPath.lastIndexOf(\"/\") + 1);\n const dot = name.lastIndexOf(\".\");\n return dot > 0 ? name.slice(dot + 1).toLowerCase() : \"\";\n};\n\nconst normalizedMediaType = (mediaType?: string): string => mediaType?.split(\";\", 1)[0]?.trim().toLowerCase() ?? \"\";\n\nconst previewKindByType = (file: FileViewFile): FileViewPreviewKind | null => {\n const extension = fileViewExtension(file.path);\n const mediaType = normalizedMediaType(file.mediaType);\n\n if (mediaType === \"text/markdown\" || markdownExtensions.has(extension)) return \"markdown\";\n if (mediaType === \"application/json\" || mediaType.endsWith(\"+json\") || extension === \"json\") return \"json\";\n if (mediaType === \"text/csv\" || mediaType === \"text/tab-separated-values\" || extension === \"csv\" || extension === \"tsv\") {\n return \"delimited-text\";\n }\n if (mediaType === \"application/pdf\" || extension === \"pdf\") return \"pdf\";\n if (imageMediaTypes.has(mediaType) || imageExtensions.has(extension)) return \"image\";\n if (audioMediaTypes.has(mediaType) || audioExtensions.has(extension)) return \"audio\";\n if (videoMediaTypes.has(mediaType) || videoExtensions.has(extension)) return \"video\";\n if (\n mediaType.startsWith(\"text/\") ||\n mediaType === \"application/javascript\" ||\n mediaType === \"application/sql\" ||\n mediaType === \"application/xml\" ||\n textExtensions.has(extension)\n ) {\n return \"text\";\n }\n return null;\n};\n\n/**\n * Returns the built-in preview kind when FileView can render the file within\n * its bounded client-side limits. Custom renderers remain registry-driven.\n */\nexport const getFileViewPreviewKind = (file: FileViewFile): FileViewPreviewKind | null => {\n const kind = previewKindByType(file);\n if (!kind) return null;\n if (file.size !== undefined && (!Number.isFinite(file.size) || file.size < 0 || file.size > maxPreviewBytes[kind])) {\n return null;\n }\n return kind;\n};\n\n/** Use this to expose preview actions only for files FileView can render. */\nexport const canPreviewFile = (file: FileViewFile): boolean => getFileViewPreviewKind(file) !== null;\n\nexport type DelimitedTextPreview = {\n rows: string[][];\n truncated: boolean;\n};\n\nexport const parseDelimitedText = (\n input: string,\n delimiter: \",\" | \"\\t\",\n limits: { rows?: number; columns?: number } = {},\n): DelimitedTextPreview => {\n const maxRows = Math.max(1, limits.rows ?? 201);\n const maxColumns = Math.max(1, limits.columns ?? 50);\n const rows: string[][] = [];\n let row: string[] = [];\n let field = \"\";\n let quoted = false;\n let truncated = false;\n\n const pushField = () => {\n if (row.length < maxColumns) row.push(field);\n else truncated = true;\n field = \"\";\n };\n const pushRow = () => {\n if (rows.length < maxRows) rows.push(row);\n else truncated = true;\n row = [];\n };\n\n for (let index = 0; index < input.length; index += 1) {\n const character = input[index]!;\n if (quoted) {\n if (character === '\"' && input[index + 1] === '\"') {\n field += '\"';\n index += 1;\n } else if (character === '\"') {\n quoted = false;\n } else {\n field += character;\n }\n continue;\n }\n\n if (character === '\"' && field.length === 0) quoted = true;\n else if (character === delimiter) pushField();\n else if (character === \"\\n\" || character === \"\\r\") {\n pushField();\n pushRow();\n if (character === \"\\r\" && input[index + 1] === \"\\n\") index += 1;\n if (rows.length >= maxRows && index < input.length - 1) {\n truncated = true;\n break;\n }\n } else {\n field += character;\n }\n }\n\n if (field.length > 0 || row.length > 0) {\n pushField();\n pushRow();\n }\n\n return { rows, truncated };\n};\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,16 @@
1
+ export { default as Calendar } from "./Calendar";
2
+ export { default as Chart } from "./Chart";
3
+ export { default as CodeDisplay } from "./CodeDisplay";
4
+ export { default as DataTable } from "./DataTable";
5
+ export { DocCode, DocConceptGrid, DocInlineCode, DocLead, DocNote, DocPage, DocRows, DocSection } from "./Docs";
6
+ export { FileBrowserPanel, openFileBrowser } from "./FileBrowser";
7
+ export { default as FileTree } from "./FileTree";
8
+ export { canPreviewFile, default as FileView, formatFileViewSize, getFileViewPreviewKind } from "./FileView";
9
+ export { default as Lightbox } from "./Lightbox";
10
+ export { default as LogEntriesTable } from "./LogEntriesTable";
11
+ export { default as MarkdownView, renderSafeMarkdown } from "./MarkdownView";
12
+ export { Pagination } from "./Pagination";
13
+ export { default as PdfPreview } from "./PdfPreview";
14
+ export { default as RangePicker } from "./RangePicker";
15
+ export { default as StructuredDataPreview, isStructuredDataValue } from "./StructuredDataPreview";
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["default","Calendar","Chart","CodeDisplay","DataTable","DocCode","DocConceptGrid","DocInlineCode","DocLead","DocNote","DocPage","DocRows","DocSection","FileBrowserPanel","openFileBrowser","FileTree","canPreviewFile","FileView","formatFileViewSize","getFileViewPreviewKind","Lightbox","LogEntriesTable","MarkdownView","renderSafeMarkdown","Pagination","PdfPreview","RangePicker","StructuredDataPreview","isStructuredDataValue"],"sources":["content/index.ts"],"sourcesContent":["export type {\n CalendarAttendee,\n CalendarDayBadge,\n CalendarEvent,\n CalendarEventColor,\n CalendarEventRenderContext,\n CalendarEventTimeChange,\n CalendarLabels,\n CalendarProps,\n CalendarRecurrence,\n CalendarResource,\n CalendarView,\n} from \"./Calendar\";\nexport { default as Calendar } from \"./Calendar\";\n\nexport type { ChartKind, ChartLabels, ChartProps } from \"./Chart\";\nexport { default as Chart } from \"./Chart\";\nexport type { CodeDisplayLanguage, CodeDisplayProps } from \"./CodeDisplay\";\nexport { default as CodeDisplay } from \"./CodeDisplay\";\nexport type {\n StateTimelineChartOptions,\n StateTimelineDomain,\n StateTimelineInterval,\n StateTimelineRow,\n StateTimelineState,\n} from \"./chart-state-timeline\";\n\nexport type {\n DataTableColumn,\n DataTableControlsProps,\n DataTableFooter,\n DataTableHeaderProps,\n DataTablePanelFooterProps,\n DataTablePanelProps,\n DataTableProps,\n DataTableRenderCell,\n DataTableRenderHeader,\n DataTableSort,\n} from \"./DataTable\";\nexport { default as DataTable } from \"./DataTable\";\n\nexport type { DocCodeHighlighter, DocCodeProps, DocConcept, DocNoteVariant, DocRow } from \"./Docs\";\nexport { DocCode, DocConceptGrid, DocInlineCode, DocLead, DocNote, DocPage, DocRows, DocSection } from \"./Docs\";\n\nexport { FileBrowserPanel, type FileBrowserPanelProps, type FileSource, openFileBrowser } from \"./FileBrowser\";\nexport { default as FileTree, type FileTreeActions, type FileTreeEntry, type FileTreeProps } from \"./FileTree\";\nexport {\n canPreviewFile,\n default as FileView,\n type FileViewContent,\n type FileViewFile,\n type FileViewPreviewKind,\n type FileViewProps,\n type FileViewRenderer,\n type FileViewRendererProps,\n formatFileViewSize,\n getFileViewPreviewKind,\n} from \"./FileView\";\n\nexport type { LightboxImage } from \"./Lightbox\";\nexport { default as Lightbox } from \"./Lightbox\";\n\nexport type { LogTableEntry } from \"./LogEntriesTable\";\nexport { default as LogEntriesTable } from \"./LogEntriesTable\";\nexport { default as MarkdownView, renderSafeMarkdown, type MarkdownRenderOptions, type MarkdownViewProps } from \"./MarkdownView\";\n\nexport { Pagination, type PaginationProps } from \"./Pagination\";\nexport type { PdfPreviewProps, PdfPreviewRequest } from \"./PdfPreview\";\nexport { default as PdfPreview } from \"./PdfPreview\";\nexport type { RangeOption, RangePickerProps } from \"./RangePicker\";\nexport { default as RangePicker } from \"./RangePicker\";\nexport type { StructuredDataPreviewMode, StructuredDataPreviewProps, StructuredDataValue } from \"./StructuredDataPreview\";\nexport { default as StructuredDataPreview, isStructuredDataValue } from \"./StructuredDataPreview\";\n"],"mappings":"AAaA,SAASA,OAAO,IAAIC,QAAQ,QAAQ,YAAY;AAGhD,SAASD,OAAO,IAAIE,KAAK,QAAQ,SAAS;AAE1C,SAASF,OAAO,IAAIG,WAAW,QAAQ,eAAe;AAqBtD,SAASH,OAAO,IAAII,SAAS,QAAQ,aAAa;AAGlD,SAASC,OAAO,EAAEC,cAAc,EAAEC,aAAa,EAAEC,OAAO,EAAEC,OAAO,EAAEC,OAAO,EAAEC,OAAO,EAAEC,UAAU,QAAQ,QAAQ;AAE/G,SAASC,gBAAgB,EAA+CC,eAAe,QAAQ,eAAe;AAC9G,SAASd,OAAO,IAAIe,QAAQ,QAAsE,YAAY;AAC9G,SACEC,cAAc,EACdhB,OAAO,IAAIiB,QAAQ,EAOnBC,kBAAkB,EAClBC,sBAAsB,QACjB,YAAY;AAGnB,SAASnB,OAAO,IAAIoB,QAAQ,QAAQ,YAAY;AAGhD,SAASpB,OAAO,IAAIqB,eAAe,QAAQ,mBAAmB;AAC9D,SAASrB,OAAO,IAAIsB,YAAY,EAAEC,kBAAkB,QAA4D,gBAAgB;AAEhI,SAASC,UAAU,QAA8B,cAAc;AAE/D,SAASxB,OAAO,IAAIyB,UAAU,QAAQ,cAAc;AAEpD,SAASzB,OAAO,IAAI0B,WAAW,QAAQ,eAAe;AAEtD,SAAS1B,OAAO,IAAI2B,qBAAqB,EAAEC,qBAAqB,QAAQ,yBAAyB","ignoreList":[]}
@@ -0,0 +1,26 @@
1
+ import { ssrElement as _$ssrElement } from "solid-js/web";
2
+ import { mergeProps as _$mergeProps } from "solid-js/web";
3
+ import { ssr as _$ssr } from "solid-js/web";
4
+ import { escape as _$escape } from "solid-js/web";
5
+ import { createComponent as _$createComponent } from "solid-js/web";
6
+ var _tmpl$ = ["<div class=\"k2b-inline-guidance__content\">", "</div>"],
7
+ _tmpl$2 = ["<i class=\"", "\" aria-hidden=\"true\"></i>"];
8
+ import { Show, splitProps } from "solid-js";
9
+ export function InlineGuidance(props) {
10
+ const [local, rest] = splitProps(props, ["children", "tone", "icon", "class"]);
11
+ return _$ssrElement("div", _$mergeProps(rest, {
12
+ get ["class"]() {
13
+ return local.class ? `k2b-inline-guidance ${local.class}` : "k2b-inline-guidance";
14
+ },
15
+ get ["data-tone"]() {
16
+ return local.tone ?? "neutral";
17
+ }
18
+ }), [_$escape(_$createComponent(Show, {
19
+ get when() {
20
+ return local.icon;
21
+ },
22
+ children: icon => _$ssr(_tmpl$2, `${_$escape(icon(), true)} k2b-inline-guidance__icon`)
23
+ })), _$ssr(_tmpl$, _$escape(local.children))], false);
24
+ }
25
+ export default InlineGuidance;
26
+ //# sourceMappingURL=InlineGuidance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Show","splitProps","InlineGuidance","props","local","rest","_$ssrElement","_$mergeProps","class","data-tone","tone","_$escape","_$createComponent","when","icon","children","_$ssr","_tmpl$2","_tmpl$"],"sources":["feedback/InlineGuidance.tsx"],"sourcesContent":["import { type JSX, Show, splitProps } from \"solid-js\";\nimport type { IntentTone } from \"../semantics\";\n\nexport type InlineGuidanceProps = Omit<JSX.HTMLAttributes<HTMLDivElement>, \"children\" | \"class\"> & {\n children: JSX.Element;\n tone?: IntentTone;\n icon?: string | false;\n class?: string;\n};\n\nexport function InlineGuidance(props: InlineGuidanceProps): JSX.Element {\n const [local, rest] = splitProps(props, [\"children\", \"tone\", \"icon\", \"class\"]);\n\n return (\n <div {...rest} class={local.class ? `k2b-inline-guidance ${local.class}` : \"k2b-inline-guidance\"} data-tone={local.tone ?? \"neutral\"}>\n <Show when={local.icon}>{(icon) => <i class={`${icon()} k2b-inline-guidance__icon`} aria-hidden=\"true\" />}</Show>\n <div class=\"k2b-inline-guidance__content\">{local.children}</div>\n </div>\n );\n}\n\nexport default InlineGuidance;\n"],"mappings":";;;;;;;AAAA,SAAmBA,IAAI,EAAEC,UAAU,QAAQ,UAAU;AAUrD,OAAO,SAASC,cAAcA,CAACC,KAA0B,EAAe;EACtE,MAAM,CAACC,KAAK,EAAEC,IAAI,CAAC,GAAGJ,UAAU,CAACE,KAAK,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;EAE9E,OAAAG,YAAA,QAAAC,YAAA,CACWF,IAAI;IAAA,aAAAG,CAAA;MAAA,OAASJ,KAAK,CAACI,KAAK,GAAG,uBAAuBJ,KAAK,CAACI,KAAK,EAAE,GAAG,qBAAqB;IAAA;IAAA,iBAAAC,CAAA;MAAA,OAAaL,KAAK,CAACM,IAAI,IAAI,SAAS;IAAA;EAAA,KAAAC,QAAA,CAAAC,iBAAA,CACjIZ,IAAI;IAAA,IAACa,IAAIA,CAAA;MAAA,OAAET,KAAK,CAACU,IAAI;IAAA;IAAAC,QAAA,EAAID,IAAI,IAAAE,KAAA,CAAAC,OAAA,EAAe,GAAAN,QAAA,CAAGG,IAAI,CAAC,CAAC,mCAA4B;EAAuB,KAAAE,KAAA,CAAAE,MAAA,EAAAP,QAAA,CAC9DP,KAAK,CAACW,QAAQ;AAG/D;AAEA,eAAeb,cAAc","ignoreList":[]}
@@ -0,0 +1,156 @@
1
+ import { ssrElement as _$ssrElement } from "solid-js/web";
2
+ import { mergeProps as _$mergeProps } from "solid-js/web";
3
+ import { createComponent as _$createComponent } from "solid-js/web";
4
+ import { ssr as _$ssr } from "solid-js/web";
5
+ import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
6
+ import { escape as _$escape } from "solid-js/web";
7
+ var _tmpl$ = ["<span", " role=\"tooltip\" popover=\"manual\" class=\"k2b-tooltip\">", "</span>"];
8
+ import { createEffect, createUniqueId, onCleanup, onMount, splitProps } from "solid-js";
9
+ import { positionTooltipSurface } from "./tooltip-position";
10
+ /**
11
+ * Low-level tooltip surface for components that already own their target DOM
12
+ * element. Most callers should use Button.tooltip, IconButton.tooltip, or
13
+ * Tooltip.Anchor instead.
14
+ */
15
+ function TooltipSurface(props) {
16
+ const tooltipId = `k2b-tooltip-${createUniqueId()}`;
17
+ let surface;
18
+ let target;
19
+ let openTimer;
20
+ let dismissedUntilLeave = false;
21
+ const clearTimer = () => {
22
+ if (openTimer) clearTimeout(openTimer);
23
+ openTimer = undefined;
24
+ };
25
+ function dismissOnEscape(event) {
26
+ if (event.key !== "Escape" || !surface?.matches(":popover-open")) return;
27
+ dismissedUntilLeave = true;
28
+ close();
29
+ }
30
+ function close() {
31
+ clearTimer();
32
+ if (surface?.matches(":popover-open")) {
33
+ try {
34
+ surface.hidePopover();
35
+ } catch {
36
+ // The surface may disconnect during cleanup.
37
+ }
38
+ }
39
+ document.removeEventListener("keydown", dismissOnEscape);
40
+ window.removeEventListener("scroll", close, true);
41
+ window.removeEventListener("resize", close);
42
+ }
43
+ const open = () => {
44
+ clearTimer();
45
+ if (props.disabled || dismissedUntilLeave || !surface || !target || surface.matches(":popover-open")) return;
46
+ openTimer = setTimeout(() => {
47
+ openTimer = undefined;
48
+ if (props.disabled || !surface?.isConnected || !target) return;
49
+ try {
50
+ surface.showPopover();
51
+ } catch {
52
+ return;
53
+ }
54
+ positionTooltipSurface(surface, target, props.placement);
55
+ document.addEventListener("keydown", dismissOnEscape);
56
+ window.addEventListener("scroll", close, true);
57
+ window.addEventListener("resize", close);
58
+ }, props.delay ?? 250);
59
+ };
60
+ createEffect(() => {
61
+ if (props.disabled) close();
62
+ });
63
+ onMount(() => {
64
+ target = props.target();
65
+ if (!target) return;
66
+ const originalDescription = target.getAttribute("aria-describedby");
67
+ const descriptions = new Set(originalDescription?.split(/\s+/).filter(Boolean) ?? []);
68
+ descriptions.add(tooltipId);
69
+ target.setAttribute("aria-describedby", [...descriptions].join(" "));
70
+ const leave = () => {
71
+ dismissedUntilLeave = false;
72
+ close();
73
+ };
74
+ const focusOut = event => {
75
+ if (!target?.contains(event.relatedTarget)) leave();
76
+ };
77
+ const pointerDown = () => {
78
+ dismissedUntilLeave = true;
79
+ close();
80
+ };
81
+ target.addEventListener("pointerenter", open);
82
+ target.addEventListener("pointerleave", leave);
83
+ target.addEventListener("pointerdown", pointerDown);
84
+ target.addEventListener("focusin", open);
85
+ target.addEventListener("focusout", focusOut);
86
+ onCleanup(() => {
87
+ close();
88
+ if (originalDescription) target?.setAttribute("aria-describedby", originalDescription);else target?.removeAttribute("aria-describedby");
89
+ target?.removeEventListener("pointerenter", open);
90
+ target?.removeEventListener("pointerleave", leave);
91
+ target?.removeEventListener("pointerdown", pointerDown);
92
+ target?.removeEventListener("focusin", open);
93
+ target?.removeEventListener("focusout", focusOut);
94
+ });
95
+ });
96
+ return _$ssr(_tmpl$, _$ssrAttribute("id", _$escape(tooltipId, true), false), _$escape(props.content));
97
+ }
98
+
99
+ /** Explicit tooltip target for non-button content. */
100
+ function TooltipAnchor(props) {
101
+ const [local, rest] = splitProps(props, ["children", "class", "content", "delay", "disabled", "placement"]);
102
+ let target;
103
+ return _$ssrElement("span", _$mergeProps(rest, {
104
+ get ["class"]() {
105
+ return `k2b-tooltip-wrapper ${local.class ?? ""}`;
106
+ }
107
+ }), [_$escape(local.children), _$escape(_$createComponent(TooltipSurface, {
108
+ get content() {
109
+ return local.content;
110
+ },
111
+ target: () => target,
112
+ get delay() {
113
+ return local.delay;
114
+ },
115
+ get disabled() {
116
+ return local.disabled;
117
+ },
118
+ get placement() {
119
+ return local.placement;
120
+ }
121
+ }))], false);
122
+ }
123
+
124
+ /** Native button target for specialized controls that do not use Button. */
125
+ function TooltipTrigger(props) {
126
+ const [local, rest] = splitProps(props, ["children", "content", "delay", "disabled", "placement", "ref"]);
127
+ let target;
128
+ const register = element => {
129
+ target = element;
130
+ if (typeof local.ref === "function") local.ref(element);
131
+ };
132
+ return [_$ssrElement("button", _$mergeProps(rest, {
133
+ get disabled() {
134
+ return local.disabled;
135
+ }
136
+ }), _$escape(local.children), false), _$createComponent(TooltipSurface, {
137
+ get content() {
138
+ return local.content;
139
+ },
140
+ target: () => target,
141
+ get delay() {
142
+ return local.delay;
143
+ },
144
+ get disabled() {
145
+ return local.disabled;
146
+ },
147
+ get placement() {
148
+ return local.placement;
149
+ }
150
+ })];
151
+ }
152
+ export const Tooltip = TooltipSurface;
153
+ Tooltip.Anchor = TooltipAnchor;
154
+ Tooltip.Trigger = TooltipTrigger;
155
+ export default Tooltip;
156
+ //# sourceMappingURL=Tooltip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createEffect","createUniqueId","onCleanup","onMount","splitProps","positionTooltipSurface","TooltipSurface","props","tooltipId","surface","target","openTimer","dismissedUntilLeave","clearTimer","clearTimeout","undefined","dismissOnEscape","event","key","matches","close","hidePopover","document","removeEventListener","window","open","disabled","setTimeout","isConnected","showPopover","placement","addEventListener","delay","originalDescription","getAttribute","descriptions","Set","split","filter","Boolean","add","setAttribute","join","leave","focusOut","contains","relatedTarget","pointerDown","removeAttribute","_$ssr","_tmpl$","_$ssrAttribute","_$escape","content","TooltipAnchor","local","rest","_$ssrElement","_$mergeProps","class","children","_$createComponent","TooltipTrigger","register","element","ref","Tooltip","Anchor","Trigger"],"sources":["feedback/Tooltip.tsx"],"sourcesContent":["import { createEffect, createUniqueId, type JSX, onCleanup, onMount, splitProps } from \"solid-js\";\nimport { positionTooltipSurface, type TooltipPlacement } from \"./tooltip-position\";\n\nexport type TooltipProps = {\n content: JSX.Element;\n target: () => HTMLElement | undefined;\n placement?: TooltipPlacement;\n delay?: number;\n disabled?: boolean;\n};\n\nexport type TooltipAnchorProps = Omit<JSX.HTMLAttributes<HTMLSpanElement>, \"content\"> & Omit<TooltipProps, \"target\">;\n\nexport type TooltipTriggerProps = Omit<JSX.ButtonHTMLAttributes<HTMLButtonElement>, \"content\"> & Omit<TooltipProps, \"target\">;\n\n/**\n * Low-level tooltip surface for components that already own their target DOM\n * element. Most callers should use Button.tooltip, IconButton.tooltip, or\n * Tooltip.Anchor instead.\n */\nfunction TooltipSurface(props: TooltipProps): JSX.Element {\n const tooltipId = `k2b-tooltip-${createUniqueId()}`;\n let surface: HTMLSpanElement | undefined;\n let target: HTMLElement | undefined;\n let openTimer: ReturnType<typeof setTimeout> | undefined;\n let dismissedUntilLeave = false;\n\n const clearTimer = () => {\n if (openTimer) clearTimeout(openTimer);\n openTimer = undefined;\n };\n\n function dismissOnEscape(event: KeyboardEvent) {\n if (event.key !== \"Escape\" || !surface?.matches(\":popover-open\")) return;\n dismissedUntilLeave = true;\n close();\n }\n\n function close() {\n clearTimer();\n if (surface?.matches(\":popover-open\")) {\n try {\n surface.hidePopover();\n } catch {\n // The surface may disconnect during cleanup.\n }\n }\n document.removeEventListener(\"keydown\", dismissOnEscape);\n window.removeEventListener(\"scroll\", close, true);\n window.removeEventListener(\"resize\", close);\n }\n\n const open = () => {\n clearTimer();\n if (props.disabled || dismissedUntilLeave || !surface || !target || surface.matches(\":popover-open\")) return;\n openTimer = setTimeout(() => {\n openTimer = undefined;\n if (props.disabled || !surface?.isConnected || !target) return;\n try {\n surface.showPopover();\n } catch {\n return;\n }\n positionTooltipSurface(surface, target, props.placement);\n document.addEventListener(\"keydown\", dismissOnEscape);\n window.addEventListener(\"scroll\", close, true);\n window.addEventListener(\"resize\", close);\n }, props.delay ?? 250);\n };\n\n createEffect(() => {\n if (props.disabled) close();\n });\n\n onMount(() => {\n target = props.target();\n if (!target) return;\n\n const originalDescription = target.getAttribute(\"aria-describedby\");\n const descriptions = new Set(originalDescription?.split(/\\s+/).filter(Boolean) ?? []);\n descriptions.add(tooltipId);\n target.setAttribute(\"aria-describedby\", [...descriptions].join(\" \"));\n\n const leave = () => {\n dismissedUntilLeave = false;\n close();\n };\n const focusOut = (event: FocusEvent) => {\n if (!target?.contains(event.relatedTarget as Node | null)) leave();\n };\n const pointerDown = () => {\n dismissedUntilLeave = true;\n close();\n };\n\n target.addEventListener(\"pointerenter\", open);\n target.addEventListener(\"pointerleave\", leave);\n target.addEventListener(\"pointerdown\", pointerDown);\n target.addEventListener(\"focusin\", open);\n target.addEventListener(\"focusout\", focusOut);\n\n onCleanup(() => {\n close();\n if (originalDescription) target?.setAttribute(\"aria-describedby\", originalDescription);\n else target?.removeAttribute(\"aria-describedby\");\n target?.removeEventListener(\"pointerenter\", open);\n target?.removeEventListener(\"pointerleave\", leave);\n target?.removeEventListener(\"pointerdown\", pointerDown);\n target?.removeEventListener(\"focusin\", open);\n target?.removeEventListener(\"focusout\", focusOut);\n });\n });\n\n return (\n <span ref={surface} id={tooltipId} role=\"tooltip\" popover=\"manual\" class=\"k2b-tooltip\">\n {props.content}\n </span>\n );\n}\n\n/** Explicit tooltip target for non-button content. */\nfunction TooltipAnchor(props: TooltipAnchorProps): JSX.Element {\n const [local, rest] = splitProps(props, [\"children\", \"class\", \"content\", \"delay\", \"disabled\", \"placement\"]);\n let target: HTMLSpanElement | undefined;\n\n return (\n <span {...rest} ref={target} class={`k2b-tooltip-wrapper ${local.class ?? \"\"}`}>\n {local.children}\n <TooltipSurface\n content={local.content}\n target={() => target}\n delay={local.delay}\n disabled={local.disabled}\n placement={local.placement}\n />\n </span>\n );\n}\n\n/** Native button target for specialized controls that do not use Button. */\nfunction TooltipTrigger(props: TooltipTriggerProps): JSX.Element {\n const [local, rest] = splitProps(props, [\"children\", \"content\", \"delay\", \"disabled\", \"placement\", \"ref\"]);\n let target: HTMLButtonElement | undefined;\n const register = (element: HTMLButtonElement) => {\n target = element;\n if (typeof local.ref === \"function\") local.ref(element);\n };\n\n return (\n <>\n <button {...rest} ref={register} disabled={local.disabled}>\n {local.children}\n </button>\n <TooltipSurface\n content={local.content}\n target={() => target}\n delay={local.delay}\n disabled={local.disabled}\n placement={local.placement}\n />\n </>\n );\n}\n\ntype TooltipComponent = ((props: TooltipProps) => JSX.Element) & {\n Anchor: (props: TooltipAnchorProps) => JSX.Element;\n Trigger: (props: TooltipTriggerProps) => JSX.Element;\n};\n\nexport const Tooltip = TooltipSurface as TooltipComponent;\nTooltip.Anchor = TooltipAnchor;\nTooltip.Trigger = TooltipTrigger;\n\nexport type { TooltipPlacement } from \"./tooltip-position\";\n\nexport default Tooltip;\n"],"mappings":"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","ignoreList":[]}