@k2b/ui 0.1.1 → 0.3.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 (386) hide show
  1. package/dist/browser/actions/Button.js +11 -2
  2. package/dist/browser/actions/Button.js.map +1 -1
  3. package/dist/browser/actions/Disclosure.js +11 -8
  4. package/dist/browser/actions/Disclosure.js.map +1 -1
  5. package/dist/browser/actions/Dropdown.js +10 -4
  6. package/dist/browser/actions/Dropdown.js.map +1 -1
  7. package/dist/browser/actions/FilterChip.js +16 -2
  8. package/dist/browser/actions/FilterChip.js.map +1 -1
  9. package/dist/browser/actions/SplitButton.js +69 -22
  10. package/dist/browser/actions/SplitButton.js.map +1 -1
  11. package/dist/browser/actions/SpotlightSearch.js +3 -7
  12. package/dist/browser/actions/SpotlightSearch.js.map +1 -1
  13. package/dist/browser/actions/Tabs.js +132 -47
  14. package/dist/browser/actions/Tabs.js.map +1 -1
  15. package/dist/browser/actions/index.js +1 -1
  16. package/dist/browser/actions/index.js.map +1 -1
  17. package/dist/browser/chat/ChatComposer.js +751 -423
  18. package/dist/browser/chat/ChatComposer.js.map +1 -1
  19. package/dist/browser/chat/ChatContextPopup.js +123 -0
  20. package/dist/browser/chat/ChatContextPopup.js.map +1 -0
  21. package/dist/browser/chat/ChatPrimitives.js +143 -77
  22. package/dist/browser/chat/ChatPrimitives.js.map +1 -1
  23. package/dist/browser/chat/ChatTasks.js +112 -0
  24. package/dist/browser/chat/ChatTasks.js.map +1 -0
  25. package/dist/browser/chat/ChatTimeline.js +34 -15
  26. package/dist/browser/chat/ChatTimeline.js.map +1 -1
  27. package/dist/browser/chat/chat-behavior.js +0 -5
  28. package/dist/browser/chat/chat-behavior.js.map +1 -1
  29. package/dist/browser/chat/composer-document.js +55 -0
  30. package/dist/browser/chat/composer-document.js.map +1 -0
  31. package/dist/browser/chat/index.js +6 -1
  32. package/dist/browser/chat/index.js.map +1 -1
  33. package/dist/browser/chat/types.js.map +1 -1
  34. package/dist/browser/content/Chart.js +148 -239
  35. package/dist/browser/content/Chart.js.map +1 -1
  36. package/dist/browser/content/ChartExplorer.js +324 -0
  37. package/dist/browser/content/ChartExplorer.js.map +1 -0
  38. package/dist/browser/content/ChartExplorerControls.js +153 -0
  39. package/dist/browser/content/ChartExplorerControls.js.map +1 -0
  40. package/dist/browser/content/ChartFilterControls.js +200 -0
  41. package/dist/browser/content/ChartFilterControls.js.map +1 -0
  42. package/dist/browser/content/ChartSnapshotView.js +113 -0
  43. package/dist/browser/content/ChartSnapshotView.js.map +1 -0
  44. package/dist/browser/content/DataTable.js +48 -32
  45. package/dist/browser/content/DataTable.js.map +1 -1
  46. package/dist/browser/content/FileBrowser.js +3 -0
  47. package/dist/browser/content/FileBrowser.js.map +1 -1
  48. package/dist/browser/content/FileGrid.js +93 -0
  49. package/dist/browser/content/FileGrid.js.map +1 -0
  50. package/dist/browser/content/FileTree.js +2 -2
  51. package/dist/browser/content/FileTree.js.map +1 -1
  52. package/dist/browser/content/FileView.js +507 -162
  53. package/dist/browser/content/FileView.js.map +1 -1
  54. package/dist/browser/content/MarkdownView.js +20 -3
  55. package/dist/browser/content/MarkdownView.js.map +1 -1
  56. package/dist/browser/content/PdfPreview.js +107 -90
  57. package/dist/browser/content/PdfPreview.js.map +1 -1
  58. package/dist/browser/content/chart-cursor.js +33 -0
  59. package/dist/browser/content/chart-cursor.js.map +1 -0
  60. package/dist/browser/content/chart-explorer.js +147 -0
  61. package/dist/browser/content/chart-explorer.js.map +1 -0
  62. package/dist/browser/content/chart-inspection.js +447 -0
  63. package/dist/browser/content/chart-inspection.js.map +1 -0
  64. package/dist/browser/content/chart-line-gaps.js +53 -0
  65. package/dist/browser/content/chart-line-gaps.js.map +1 -0
  66. package/dist/browser/content/chart-map-viewport.js +5 -1
  67. package/dist/browser/content/chart-map-viewport.js.map +1 -1
  68. package/dist/browser/content/chart-snapshot.js +63 -0
  69. package/dist/browser/content/chart-snapshot.js.map +1 -0
  70. package/dist/browser/content/chart-state-timeline.js +32 -4
  71. package/dist/browser/content/chart-state-timeline.js.map +1 -1
  72. package/dist/browser/content/chart-svg.js +54 -0
  73. package/dist/browser/content/chart-svg.js.map +1 -0
  74. package/dist/browser/content/collection-selection.js +109 -0
  75. package/dist/browser/content/collection-selection.js.map +1 -0
  76. package/dist/browser/content/delimited-preferences.js +21 -0
  77. package/dist/browser/content/delimited-preferences.js.map +1 -0
  78. package/dist/browser/content/file-tree.js.map +1 -1
  79. package/dist/browser/content/file-view-preview.js +11 -7
  80. package/dist/browser/content/file-view-preview.js.map +1 -1
  81. package/dist/browser/content/index.js +9 -0
  82. package/dist/browser/content/index.js.map +1 -1
  83. package/dist/browser/feedback/InlineGuidance.js +17 -3
  84. package/dist/browser/feedback/InlineGuidance.js.map +1 -1
  85. package/dist/browser/feedback/Tooltip.js +6 -2
  86. package/dist/browser/feedback/Tooltip.js.map +1 -1
  87. package/dist/browser/feedback/dialog-core.js +102 -9
  88. package/dist/browser/feedback/dialog-core.js.map +1 -1
  89. package/dist/browser/feedback/prompts.js +6 -0
  90. package/dist/browser/feedback/prompts.js.map +1 -1
  91. package/dist/browser/feedback/toast.js +29 -6
  92. package/dist/browser/feedback/toast.js.map +1 -1
  93. package/dist/browser/feedback/tooltip-position.js +15 -0
  94. package/dist/browser/feedback/tooltip-position.js.map +1 -1
  95. package/dist/browser/inputs/ChoiceInputs.js +47 -38
  96. package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
  97. package/dist/browser/inputs/SelectChip.js +3 -2
  98. package/dist/browser/inputs/SelectChip.js.map +1 -1
  99. package/dist/browser/inputs/TextInput.js +7 -1
  100. package/dist/browser/inputs/TextInput.js.map +1 -1
  101. package/dist/browser/inputs/markdown/MarkdownEditor.js +61 -37
  102. package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
  103. package/dist/browser/internal/portal.js +1 -1
  104. package/dist/browser/internal/portal.js.map +1 -1
  105. package/dist/browser/intl/Format.js +89 -16
  106. package/dist/browser/intl/Format.js.map +1 -1
  107. package/dist/browser/intl/index.js.map +1 -1
  108. package/dist/browser/intl/messages.js +130 -2
  109. package/dist/browser/intl/messages.js.map +1 -1
  110. package/dist/browser/layout/AppWorkspace.js +712 -624
  111. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  112. package/dist/browser/layout/BottomSheet.js +95 -0
  113. package/dist/browser/layout/BottomSheet.js.map +1 -0
  114. package/dist/browser/layout/DetailPanel.js +232 -107
  115. package/dist/browser/layout/DetailPanel.js.map +1 -1
  116. package/dist/browser/layout/Navigation.js +278 -0
  117. package/dist/browser/layout/Navigation.js.map +1 -0
  118. package/dist/browser/layout/PanelDialog.js +229 -72
  119. package/dist/browser/layout/PanelDialog.js.map +1 -1
  120. package/dist/browser/layout/ScrollArea.js +21 -1
  121. package/dist/browser/layout/ScrollArea.js.map +1 -1
  122. package/dist/browser/layout/Settings.js.map +1 -1
  123. package/dist/browser/layout/SidebarItemPreview.js +183 -0
  124. package/dist/browser/layout/SidebarItemPreview.js.map +1 -0
  125. package/dist/browser/layout/app-workspace-controller.js +3 -0
  126. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  127. package/dist/browser/layout/index.js +3 -0
  128. package/dist/browser/layout/index.js.map +1 -1
  129. package/dist/browser/layout/navigation-model.js +23 -0
  130. package/dist/browser/layout/navigation-model.js.map +1 -0
  131. package/dist/browser/layout/scroll-fade.js +100 -0
  132. package/dist/browser/layout/scroll-fade.js.map +1 -0
  133. package/dist/browser/surfaces/DescriptionList.js.map +1 -1
  134. package/dist/browser/surfaces/StatusBadge.js +2 -1
  135. package/dist/browser/surfaces/StatusBadge.js.map +1 -1
  136. package/dist/fonts/ibm-plex-mono-cyrillic-400-italic-4aded3f2f2a7d27d.woff2 +0 -0
  137. package/dist/fonts/ibm-plex-mono-cyrillic-400-normal-7635422bd10ddbbc.woff2 +0 -0
  138. package/dist/fonts/ibm-plex-mono-cyrillic-500-normal-1d89462e86cb8e87.woff2 +0 -0
  139. package/dist/fonts/ibm-plex-mono-cyrillic-600-normal-2b05a8695c7f9f4a.woff2 +0 -0
  140. package/dist/fonts/ibm-plex-mono-cyrillic-ext-400-italic-a0b3b8cbe5a516e7.woff2 +0 -0
  141. package/dist/fonts/ibm-plex-mono-cyrillic-ext-400-normal-f8c22ec1804bd696.woff2 +0 -0
  142. package/dist/fonts/ibm-plex-mono-cyrillic-ext-500-normal-3febe5c7f22e4b07.woff2 +0 -0
  143. package/dist/fonts/ibm-plex-mono-cyrillic-ext-600-normal-83109cdd4f8665b4.woff2 +0 -0
  144. package/dist/fonts/ibm-plex-mono-latin-400-italic-0840095faae86403.woff2 +0 -0
  145. package/dist/fonts/ibm-plex-mono-latin-400-normal-08949f728dc52d52.woff2 +0 -0
  146. package/dist/fonts/ibm-plex-mono-latin-500-normal-01d285447409c8a5.woff2 +0 -0
  147. package/dist/fonts/ibm-plex-mono-latin-600-normal-0d1f0b8d0722224e.woff2 +0 -0
  148. package/dist/fonts/ibm-plex-mono-latin-ext-400-italic-1b07eee6df7d26b3.woff2 +0 -0
  149. package/dist/fonts/ibm-plex-mono-latin-ext-400-normal-6bc0f226a5b7884a.woff2 +0 -0
  150. package/dist/fonts/ibm-plex-mono-latin-ext-500-normal-6bb06407c97584b0.woff2 +0 -0
  151. package/dist/fonts/ibm-plex-mono-latin-ext-600-normal-32057cf50dd14bdb.woff2 +0 -0
  152. package/dist/fonts/ibm-plex-mono-vietnamese-400-italic-a6bab38af4f9c761.woff2 +0 -0
  153. package/dist/fonts/ibm-plex-mono-vietnamese-400-normal-62632b6375305e70.woff2 +0 -0
  154. package/dist/fonts/ibm-plex-mono-vietnamese-500-normal-781633d95de88040.woff2 +0 -0
  155. package/dist/fonts/ibm-plex-mono-vietnamese-600-normal-51b74d53e106ba8a.woff2 +0 -0
  156. package/dist/fonts/ibm-plex-sans-cyrillic-400-italic-e8731a7e2b00fc4f.woff2 +0 -0
  157. package/dist/fonts/ibm-plex-sans-cyrillic-400-normal-69afad88a0740b6e.woff2 +0 -0
  158. package/dist/fonts/ibm-plex-sans-cyrillic-500-normal-200be3a2a6b1789f.woff2 +0 -0
  159. package/dist/fonts/ibm-plex-sans-cyrillic-600-normal-730becc6f005c18c.woff2 +0 -0
  160. package/dist/fonts/ibm-plex-sans-cyrillic-700-normal-40540598b4c9eb2c.woff2 +0 -0
  161. package/dist/fonts/ibm-plex-sans-cyrillic-ext-400-italic-4ffb25726a7ce4cc.woff2 +0 -0
  162. package/dist/fonts/ibm-plex-sans-cyrillic-ext-400-normal-e2580ad78906551e.woff2 +0 -0
  163. package/dist/fonts/ibm-plex-sans-cyrillic-ext-500-normal-08578d906af6d986.woff2 +0 -0
  164. package/dist/fonts/ibm-plex-sans-cyrillic-ext-600-normal-d60d3d0b182753d5.woff2 +0 -0
  165. package/dist/fonts/ibm-plex-sans-cyrillic-ext-700-normal-d07dd53642480097.woff2 +0 -0
  166. package/dist/fonts/ibm-plex-sans-greek-400-italic-1bc10b01688ba9fa.woff2 +0 -0
  167. package/dist/fonts/ibm-plex-sans-greek-400-normal-02296067bc904d2a.woff2 +0 -0
  168. package/dist/fonts/ibm-plex-sans-greek-500-normal-8cb6e20b4dbbaa5f.woff2 +0 -0
  169. package/dist/fonts/ibm-plex-sans-greek-600-normal-0a9ebd9019415ee9.woff2 +0 -0
  170. package/dist/fonts/ibm-plex-sans-greek-700-normal-c949641d10a3bebc.woff2 +0 -0
  171. package/dist/fonts/ibm-plex-sans-latin-400-italic-6de912e531b6c980.woff2 +0 -0
  172. package/dist/fonts/ibm-plex-sans-latin-400-normal-3b646991d30055a9.woff2 +0 -0
  173. package/dist/fonts/ibm-plex-sans-latin-500-normal-0717336fb31fcdcd.woff2 +0 -0
  174. package/dist/fonts/ibm-plex-sans-latin-600-normal-8960851d691c054e.woff2 +0 -0
  175. package/dist/fonts/ibm-plex-sans-latin-700-normal-42e7b0c143c19df9.woff2 +0 -0
  176. package/dist/fonts/ibm-plex-sans-latin-ext-400-italic-c5c00e8a32022dfe.woff2 +0 -0
  177. package/dist/fonts/ibm-plex-sans-latin-ext-400-normal-c93d2a12aaa280f6.woff2 +0 -0
  178. package/dist/fonts/ibm-plex-sans-latin-ext-500-normal-2846035d85100f84.woff2 +0 -0
  179. package/dist/fonts/ibm-plex-sans-latin-ext-600-normal-b25dfd4f979e442a.woff2 +0 -0
  180. package/dist/fonts/ibm-plex-sans-latin-ext-700-normal-92f0392bd74fa395.woff2 +0 -0
  181. package/dist/fonts/ibm-plex-sans-vietnamese-400-italic-675d4bace127bffb.woff2 +0 -0
  182. package/dist/fonts/ibm-plex-sans-vietnamese-400-normal-771538f7f26551bd.woff2 +0 -0
  183. package/dist/fonts/ibm-plex-sans-vietnamese-500-normal-85ba3d9c2488a813.woff2 +0 -0
  184. package/dist/fonts/ibm-plex-sans-vietnamese-600-normal-5d34b803637befe3.woff2 +0 -0
  185. package/dist/fonts/ibm-plex-sans-vietnamese-700-normal-b79d0c4b68b85007.woff2 +0 -0
  186. package/dist/plex.css +1 -1
  187. package/dist/ssr/actions/Button.js +11 -2
  188. package/dist/ssr/actions/Button.js.map +1 -1
  189. package/dist/ssr/actions/Disclosure.js +2 -2
  190. package/dist/ssr/actions/Disclosure.js.map +1 -1
  191. package/dist/ssr/actions/Dropdown.js +5 -2
  192. package/dist/ssr/actions/Dropdown.js.map +1 -1
  193. package/dist/ssr/actions/FilterChip.js +16 -2
  194. package/dist/ssr/actions/FilterChip.js.map +1 -1
  195. package/dist/ssr/actions/SplitButton.js +69 -22
  196. package/dist/ssr/actions/SplitButton.js.map +1 -1
  197. package/dist/ssr/actions/SpotlightSearch.js +3 -7
  198. package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
  199. package/dist/ssr/actions/Tabs.js +58 -11
  200. package/dist/ssr/actions/Tabs.js.map +1 -1
  201. package/dist/ssr/actions/index.js +1 -1
  202. package/dist/ssr/actions/index.js.map +1 -1
  203. package/dist/ssr/chat/ChatComposer.js +366 -134
  204. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  205. package/dist/ssr/chat/ChatContextPopup.js +86 -0
  206. package/dist/ssr/chat/ChatContextPopup.js.map +1 -0
  207. package/dist/ssr/chat/ChatPrimitives.js +50 -12
  208. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  209. package/dist/ssr/chat/ChatTasks.js +48 -0
  210. package/dist/ssr/chat/ChatTasks.js.map +1 -0
  211. package/dist/ssr/chat/ChatTimeline.js +16 -4
  212. package/dist/ssr/chat/ChatTimeline.js.map +1 -1
  213. package/dist/ssr/chat/chat-behavior.js +0 -5
  214. package/dist/ssr/chat/chat-behavior.js.map +1 -1
  215. package/dist/ssr/chat/composer-document.js +55 -0
  216. package/dist/ssr/chat/composer-document.js.map +1 -0
  217. package/dist/ssr/chat/index.js +6 -1
  218. package/dist/ssr/chat/index.js.map +1 -1
  219. package/dist/ssr/chat/types.js.map +1 -1
  220. package/dist/ssr/content/Chart.js +121 -219
  221. package/dist/ssr/content/Chart.js.map +1 -1
  222. package/dist/ssr/content/ChartExplorer.js +257 -0
  223. package/dist/ssr/content/ChartExplorer.js.map +1 -0
  224. package/dist/ssr/content/ChartExplorerControls.js +105 -0
  225. package/dist/ssr/content/ChartExplorerControls.js.map +1 -0
  226. package/dist/ssr/content/ChartFilterControls.js +139 -0
  227. package/dist/ssr/content/ChartFilterControls.js.map +1 -0
  228. package/dist/ssr/content/ChartSnapshotView.js +57 -0
  229. package/dist/ssr/content/ChartSnapshotView.js.map +1 -0
  230. package/dist/ssr/content/DataTable.js +13 -9
  231. package/dist/ssr/content/DataTable.js.map +1 -1
  232. package/dist/ssr/content/FileBrowser.js +3 -0
  233. package/dist/ssr/content/FileBrowser.js.map +1 -1
  234. package/dist/ssr/content/FileGrid.js +38 -0
  235. package/dist/ssr/content/FileGrid.js.map +1 -0
  236. package/dist/ssr/content/FileTree.js +2 -2
  237. package/dist/ssr/content/FileTree.js.map +1 -1
  238. package/dist/ssr/content/FileView.js +352 -75
  239. package/dist/ssr/content/FileView.js.map +1 -1
  240. package/dist/ssr/content/MarkdownView.js +20 -3
  241. package/dist/ssr/content/MarkdownView.js.map +1 -1
  242. package/dist/ssr/content/PdfPreview.js +37 -24
  243. package/dist/ssr/content/PdfPreview.js.map +1 -1
  244. package/dist/ssr/content/chart-cursor.js +33 -0
  245. package/dist/ssr/content/chart-cursor.js.map +1 -0
  246. package/dist/ssr/content/chart-explorer.js +147 -0
  247. package/dist/ssr/content/chart-explorer.js.map +1 -0
  248. package/dist/ssr/content/chart-inspection.js +447 -0
  249. package/dist/ssr/content/chart-inspection.js.map +1 -0
  250. package/dist/ssr/content/chart-line-gaps.js +53 -0
  251. package/dist/ssr/content/chart-line-gaps.js.map +1 -0
  252. package/dist/ssr/content/chart-map-viewport.js +5 -1
  253. package/dist/ssr/content/chart-map-viewport.js.map +1 -1
  254. package/dist/ssr/content/chart-snapshot.js +63 -0
  255. package/dist/ssr/content/chart-snapshot.js.map +1 -0
  256. package/dist/ssr/content/chart-state-timeline.js +32 -4
  257. package/dist/ssr/content/chart-state-timeline.js.map +1 -1
  258. package/dist/ssr/content/chart-svg.js +54 -0
  259. package/dist/ssr/content/chart-svg.js.map +1 -0
  260. package/dist/ssr/content/collection-selection.js +109 -0
  261. package/dist/ssr/content/collection-selection.js.map +1 -0
  262. package/dist/ssr/content/delimited-preferences.js +21 -0
  263. package/dist/ssr/content/delimited-preferences.js.map +1 -0
  264. package/dist/ssr/content/file-tree.js.map +1 -1
  265. package/dist/ssr/content/file-view-preview.js +11 -7
  266. package/dist/ssr/content/file-view-preview.js.map +1 -1
  267. package/dist/ssr/content/index.js +9 -0
  268. package/dist/ssr/content/index.js.map +1 -1
  269. package/dist/ssr/feedback/InlineGuidance.js +17 -3
  270. package/dist/ssr/feedback/InlineGuidance.js.map +1 -1
  271. package/dist/ssr/feedback/Tooltip.js +6 -4
  272. package/dist/ssr/feedback/Tooltip.js.map +1 -1
  273. package/dist/ssr/feedback/dialog-core.js +102 -9
  274. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  275. package/dist/ssr/feedback/prompts.js +6 -0
  276. package/dist/ssr/feedback/prompts.js.map +1 -1
  277. package/dist/ssr/feedback/toast.js +29 -6
  278. package/dist/ssr/feedback/toast.js.map +1 -1
  279. package/dist/ssr/feedback/tooltip-position.js +15 -0
  280. package/dist/ssr/feedback/tooltip-position.js.map +1 -1
  281. package/dist/ssr/inputs/ChoiceInputs.js +9 -6
  282. package/dist/ssr/inputs/ChoiceInputs.js.map +1 -1
  283. package/dist/ssr/inputs/SelectChip.js +3 -3
  284. package/dist/ssr/inputs/SelectChip.js.map +1 -1
  285. package/dist/ssr/inputs/TextInput.js.map +1 -1
  286. package/dist/ssr/inputs/markdown/MarkdownEditor.js +19 -11
  287. package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
  288. package/dist/ssr/internal/portal.js +1 -1
  289. package/dist/ssr/internal/portal.js.map +1 -1
  290. package/dist/ssr/intl/Format.js +61 -0
  291. package/dist/ssr/intl/Format.js.map +1 -1
  292. package/dist/ssr/intl/index.js.map +1 -1
  293. package/dist/ssr/intl/messages.js +130 -2
  294. package/dist/ssr/intl/messages.js.map +1 -1
  295. package/dist/ssr/layout/AppWorkspace.js +368 -275
  296. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  297. package/dist/ssr/layout/BottomSheet.js +43 -0
  298. package/dist/ssr/layout/BottomSheet.js.map +1 -0
  299. package/dist/ssr/layout/DetailPanel.js +95 -17
  300. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  301. package/dist/ssr/layout/Navigation.js +181 -0
  302. package/dist/ssr/layout/Navigation.js.map +1 -0
  303. package/dist/ssr/layout/PanelDialog.js +112 -27
  304. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  305. package/dist/ssr/layout/ScrollArea.js +16 -1
  306. package/dist/ssr/layout/ScrollArea.js.map +1 -1
  307. package/dist/ssr/layout/Settings.js.map +1 -1
  308. package/dist/ssr/layout/SidebarItemPreview.js +133 -0
  309. package/dist/ssr/layout/SidebarItemPreview.js.map +1 -0
  310. package/dist/ssr/layout/app-workspace-controller.js +3 -0
  311. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  312. package/dist/ssr/layout/index.js +3 -0
  313. package/dist/ssr/layout/index.js.map +1 -1
  314. package/dist/ssr/layout/navigation-model.js +23 -0
  315. package/dist/ssr/layout/navigation-model.js.map +1 -0
  316. package/dist/ssr/layout/scroll-fade.js +100 -0
  317. package/dist/ssr/layout/scroll-fade.js.map +1 -0
  318. package/dist/ssr/surfaces/DescriptionList.js.map +1 -1
  319. package/dist/ssr/surfaces/StatusBadge.js +2 -1
  320. package/dist/ssr/surfaces/StatusBadge.js.map +1 -1
  321. package/dist/styles.css +1 -1
  322. package/dist/tabler.css +1 -1
  323. package/dist/types/actions/Button.d.ts +4 -0
  324. package/dist/types/actions/Disclosure.d.ts +1 -0
  325. package/dist/types/actions/Dropdown.d.ts +3 -1
  326. package/dist/types/actions/FilterChip.d.ts +4 -0
  327. package/dist/types/actions/SplitButton.d.ts +6 -0
  328. package/dist/types/actions/SpotlightSearch.d.ts +0 -4
  329. package/dist/types/actions/Tabs.d.ts +4 -0
  330. package/dist/types/actions/index.d.ts +1 -1
  331. package/dist/types/chat/ChatComposer.d.ts +20 -2
  332. package/dist/types/chat/ChatContextPopup.d.ts +6 -0
  333. package/dist/types/chat/ChatPrimitives.d.ts +4 -0
  334. package/dist/types/chat/ChatTasks.d.ts +15 -0
  335. package/dist/types/chat/ChatTimeline.d.ts +2 -0
  336. package/dist/types/chat/chat-behavior.d.ts +0 -3
  337. package/dist/types/chat/composer-document.d.ts +14 -0
  338. package/dist/types/chat/index.d.ts +8 -1
  339. package/dist/types/chat/types.d.ts +9 -0
  340. package/dist/types/content/Chart.d.ts +42 -23
  341. package/dist/types/content/ChartExplorer.d.ts +34 -0
  342. package/dist/types/content/ChartExplorerControls.d.ts +10 -0
  343. package/dist/types/content/ChartFilterControls.d.ts +21 -0
  344. package/dist/types/content/ChartSnapshotView.d.ts +11 -0
  345. package/dist/types/content/DataTable.d.ts +4 -0
  346. package/dist/types/content/FileBrowser.d.ts +1 -0
  347. package/dist/types/content/FileGrid.d.ts +21 -0
  348. package/dist/types/content/FileView.d.ts +20 -0
  349. package/dist/types/content/MarkdownView.d.ts +6 -1
  350. package/dist/types/content/PdfPreview.d.ts +8 -1
  351. package/dist/types/content/chart-cursor.d.ts +15 -0
  352. package/dist/types/content/chart-explorer.d.ts +48 -0
  353. package/dist/types/content/chart-inspection.d.ts +40 -0
  354. package/dist/types/content/chart-line-gaps.d.ts +5 -0
  355. package/dist/types/content/chart-map-viewport.d.ts +1 -1
  356. package/dist/types/content/chart-snapshot.d.ts +26 -0
  357. package/dist/types/content/chart-svg.d.ts +21 -0
  358. package/dist/types/content/collection-selection.d.ts +24 -0
  359. package/dist/types/content/delimited-preferences.d.ts +11 -0
  360. package/dist/types/content/file-tree.d.ts +2 -0
  361. package/dist/types/content/file-view-preview.d.ts +4 -1
  362. package/dist/types/content/index.d.ts +15 -1
  363. package/dist/types/feedback/InlineGuidance.d.ts +1 -0
  364. package/dist/types/feedback/dialog-core.d.ts +13 -0
  365. package/dist/types/feedback/prompts.d.ts +2 -0
  366. package/dist/types/feedback/toast.d.ts +7 -1
  367. package/dist/types/feedback/tooltip-position.d.ts +1 -1
  368. package/dist/types/inputs/ChoiceInputs.d.ts +3 -0
  369. package/dist/types/inputs/markdown/MarkdownEditor.d.ts +5 -1
  370. package/dist/types/intl/Format.d.ts +9 -0
  371. package/dist/types/intl/index.d.ts +1 -1
  372. package/dist/types/intl/messages.d.ts +31 -1
  373. package/dist/types/layout/AppWorkspace.d.ts +35 -18
  374. package/dist/types/layout/BottomSheet.d.ts +23 -0
  375. package/dist/types/layout/DetailPanel.d.ts +7 -0
  376. package/dist/types/layout/Navigation.d.ts +8 -0
  377. package/dist/types/layout/PanelDialog.d.ts +14 -1
  378. package/dist/types/layout/ScrollArea.d.ts +4 -0
  379. package/dist/types/layout/Settings.d.ts +1 -1
  380. package/dist/types/layout/SidebarItemPreview.d.ts +11 -0
  381. package/dist/types/layout/index.d.ts +4 -1
  382. package/dist/types/layout/navigation-model.d.ts +48 -0
  383. package/dist/types/layout/scroll-fade.d.ts +3 -0
  384. package/dist/types/surfaces/DescriptionList.d.ts +1 -1
  385. package/dist/types/surfaces/StatusBadge.d.ts +1 -1
  386. package/package.json +8 -8
@@ -0,0 +1,109 @@
1
+ import { batch, createEffect, createSignal, onCleanup } from "solid-js";
2
+ /** One selection and focus model shared by alternate presentations of a collection. */
3
+ export function createCollectionSelection(options) {
4
+ const [selected, setSelected] = createSignal(new Set(options.initial ?? []));
5
+ const [focused, setFocused] = createSignal(options.initial?.[0] ?? null);
6
+ let anchor = options.initial?.[0] ?? null;
7
+ const elements = new Map();
8
+ const replace = ids => {
9
+ const allowed = new Set(options.ids());
10
+ const next = new Set(ids.filter(id => allowed.has(id)));
11
+ if (next.size === selected().size && [...next].every(id => selected().has(id))) return;
12
+ setSelected(next);
13
+ options.onChange?.([...next]);
14
+ };
15
+ createEffect(() => {
16
+ const ids = options.ids();
17
+ replace([...selected()]);
18
+ if (!focused() || !ids.includes(focused())) setFocused(ids[0] ?? null);
19
+ if (anchor && !ids.includes(anchor)) anchor = null;
20
+ });
21
+ const toggle = id => {
22
+ const next = new Set(selected());
23
+ next.has(id) ? next.delete(id) : next.add(id);
24
+ batch(() => {
25
+ setFocused(id);
26
+ replace([...next]);
27
+ });
28
+ anchor = id;
29
+ };
30
+ const select = (id, modifiers = {}) => {
31
+ if (!options.ids().includes(id)) return;
32
+ batch(() => {
33
+ setFocused(id);
34
+ if (modifiers.shiftKey && anchor) {
35
+ const ids = options.ids();
36
+ const from = ids.indexOf(anchor);
37
+ const to = ids.indexOf(id);
38
+ const range = ids.slice(Math.min(from, to), Math.max(from, to) + 1);
39
+ replace(modifiers.ctrlKey || modifiers.metaKey ? [...selected(), ...range] : range);
40
+ } else if (modifiers.ctrlKey || modifiers.metaKey) toggle(id);else {
41
+ anchor = id;
42
+ replace([id]);
43
+ }
44
+ });
45
+ };
46
+ const focus = id => {
47
+ setFocused(id);
48
+ elements.get(id)?.focus({
49
+ preventScroll: true
50
+ });
51
+ elements.get(id)?.scrollIntoView?.({
52
+ block: "nearest",
53
+ inline: "nearest"
54
+ });
55
+ };
56
+ const keyDown = (event, id, columns = 1) => {
57
+ const ids = options.ids();
58
+ const index = ids.indexOf(id);
59
+ let next;
60
+ if (event.key === "ArrowDown") next = index + columns;
61
+ if (event.key === "ArrowUp") next = index - columns;
62
+ if (columns > 1 && event.key === "ArrowRight") next = index + 1;
63
+ if (columns > 1 && event.key === "ArrowLeft") next = index - 1;
64
+ if (event.key === "Home") next = 0;
65
+ if (event.key === "End") next = ids.length - 1;
66
+ if (next !== undefined && ids.length) {
67
+ event.preventDefault();
68
+ const target = ids[Math.max(0, Math.min(next, ids.length - 1))];
69
+ if (event.shiftKey || !event.ctrlKey && !event.metaKey) select(target, event);
70
+ focus(target);
71
+ return true;
72
+ }
73
+ if (event.key === " ") {
74
+ event.preventDefault();
75
+ toggle(id);
76
+ return true;
77
+ }
78
+ if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === "a") {
79
+ event.preventDefault();
80
+ replace(ids);
81
+ return true;
82
+ }
83
+ if (event.key === "Escape") {
84
+ event.preventDefault();
85
+ replace([]);
86
+ return true;
87
+ }
88
+ return false;
89
+ };
90
+ return {
91
+ selected,
92
+ focused,
93
+ select,
94
+ toggle,
95
+ replace,
96
+ focus,
97
+ keyDown,
98
+ clear: () => replace([]),
99
+ all: () => replace(options.ids()),
100
+ markFocused: id => setFocused(id),
101
+ register: (id, element) => {
102
+ elements.set(id, element);
103
+ onCleanup(() => {
104
+ if (elements.get(id) === element) elements.delete(id);
105
+ });
106
+ }
107
+ };
108
+ }
109
+ //# sourceMappingURL=collection-selection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["batch","createEffect","createSignal","onCleanup","createCollectionSelection","options","selected","setSelected","Set","initial","focused","setFocused","anchor","elements","Map","replace","ids","allowed","next","filter","id","has","size","every","onChange","includes","toggle","delete","add","select","modifiers","shiftKey","from","indexOf","to","range","slice","Math","min","max","ctrlKey","metaKey","focus","get","preventScroll","scrollIntoView","block","inline","keyDown","event","columns","index","key","length","undefined","preventDefault","target","toLowerCase","clear","all","markFocused","register","element","set"],"sources":["content/collection-selection.ts"],"sourcesContent":["import { batch, createEffect, createSignal, onCleanup } from \"solid-js\";\n\nexport type SelectionModifiers = { shiftKey?: boolean; ctrlKey?: boolean; metaKey?: boolean };\nexport type CollectionSelection = ReturnType<typeof createCollectionSelection>;\n\n/** One selection and focus model shared by alternate presentations of a collection. */\nexport function createCollectionSelection(options: {\n ids: () => readonly string[];\n initial?: readonly string[];\n onChange?: (ids: readonly string[]) => void;\n}) {\n const [selected, setSelected] = createSignal<ReadonlySet<string>>(new Set(options.initial ?? []));\n const [focused, setFocused] = createSignal<string | null>(options.initial?.[0] ?? null);\n let anchor: string | null = options.initial?.[0] ?? null;\n const elements = new Map<string, HTMLElement>();\n const replace = (ids: readonly string[]) => {\n const allowed = new Set(options.ids());\n const next = new Set(ids.filter((id) => allowed.has(id)));\n if (next.size === selected().size && [...next].every((id) => selected().has(id))) return;\n setSelected(next);\n options.onChange?.([...next]);\n };\n createEffect(() => {\n const ids = options.ids();\n replace([...selected()]);\n if (!focused() || !ids.includes(focused()!)) setFocused(ids[0] ?? null);\n if (anchor && !ids.includes(anchor)) anchor = null;\n });\n const toggle = (id: string) => {\n const next = new Set(selected());\n next.has(id) ? next.delete(id) : next.add(id);\n batch(() => {\n setFocused(id);\n replace([...next]);\n });\n anchor = id;\n };\n const select = (id: string, modifiers: SelectionModifiers = {}) => {\n if (!options.ids().includes(id)) return;\n batch(() => {\n setFocused(id);\n if (modifiers.shiftKey && anchor) {\n const ids = options.ids();\n const from = ids.indexOf(anchor);\n const to = ids.indexOf(id);\n const range = ids.slice(Math.min(from, to), Math.max(from, to) + 1);\n replace(modifiers.ctrlKey || modifiers.metaKey ? [...selected(), ...range] : range);\n } else if (modifiers.ctrlKey || modifiers.metaKey) toggle(id);\n else {\n anchor = id;\n replace([id]);\n }\n });\n };\n const focus = (id: string) => {\n setFocused(id);\n elements.get(id)?.focus({ preventScroll: true });\n elements.get(id)?.scrollIntoView?.({ block: \"nearest\", inline: \"nearest\" });\n };\n const keyDown = (event: KeyboardEvent, id: string, columns = 1) => {\n const ids = options.ids();\n const index = ids.indexOf(id);\n let next: number | undefined;\n if (event.key === \"ArrowDown\") next = index + columns;\n if (event.key === \"ArrowUp\") next = index - columns;\n if (columns > 1 && event.key === \"ArrowRight\") next = index + 1;\n if (columns > 1 && event.key === \"ArrowLeft\") next = index - 1;\n if (event.key === \"Home\") next = 0;\n if (event.key === \"End\") next = ids.length - 1;\n if (next !== undefined && ids.length) {\n event.preventDefault();\n const target = ids[Math.max(0, Math.min(next, ids.length - 1))]!;\n if (event.shiftKey || (!event.ctrlKey && !event.metaKey)) select(target, event);\n focus(target);\n return true;\n }\n if (event.key === \" \") {\n event.preventDefault();\n toggle(id);\n return true;\n }\n if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === \"a\") {\n event.preventDefault();\n replace(ids);\n return true;\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n replace([]);\n return true;\n }\n return false;\n };\n return {\n selected,\n focused,\n select,\n toggle,\n replace,\n focus,\n keyDown,\n clear: () => replace([]),\n all: () => replace(options.ids()),\n markFocused: (id: string) => setFocused(id),\n register: (id: string, element: HTMLElement) => {\n elements.set(id, element);\n onCleanup(() => {\n if (elements.get(id) === element) elements.delete(id);\n });\n },\n };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,21 @@
1
+ /** Persist presentation choices only, never file contents. Ignore stale or corrupt storage. */
2
+ export const readDelimitedPreferences = stored => {
3
+ const defaults = {
4
+ encoding: "utf-8",
5
+ delimiter: "auto",
6
+ view: "table"
7
+ };
8
+ try {
9
+ const value = JSON.parse(stored ?? "null");
10
+ if (!value || typeof value !== "object") return defaults;
11
+ return {
12
+ encoding: "encoding" in value && typeof value.encoding === "string" && ["utf-8", "windows-1252", "utf-16le", "utf-16be"].includes(value.encoding) ? value.encoding : defaults.encoding,
13
+ delimiter: "delimiter" in value && typeof value.delimiter === "string" && ["auto", ",", ";", "\t", "|"].includes(value.delimiter) ? value.delimiter : defaults.delimiter,
14
+ view: "view" in value && value.view === "raw" ? "raw" : "table"
15
+ };
16
+ } catch {
17
+ return defaults;
18
+ }
19
+ };
20
+ export const decodeDelimitedContent = (content, encoding) => content.encoding === "utf8" ? content.content : new TextDecoder(encoding).decode(Uint8Array.from(atob(content.content), char => char.charCodeAt(0)));
21
+ //# sourceMappingURL=delimited-preferences.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["readDelimitedPreferences","stored","defaults","encoding","delimiter","view","value","JSON","parse","includes","decodeDelimitedContent","content","TextDecoder","decode","Uint8Array","from","atob","char","charCodeAt"],"sources":["content/delimited-preferences.ts"],"sourcesContent":["export type DelimitedPreferences = { encoding: string; delimiter: string; view: \"table\" | \"raw\" };\n\n/** Persist presentation choices only, never file contents. Ignore stale or corrupt storage. */\nexport const readDelimitedPreferences = (stored: string | null): DelimitedPreferences => {\n const defaults: DelimitedPreferences = { encoding: \"utf-8\", delimiter: \"auto\", view: \"table\" };\n try {\n const value: unknown = JSON.parse(stored ?? \"null\");\n if (!value || typeof value !== \"object\") return defaults;\n return {\n encoding:\n \"encoding\" in value &&\n typeof value.encoding === \"string\" &&\n [\"utf-8\", \"windows-1252\", \"utf-16le\", \"utf-16be\"].includes(value.encoding)\n ? value.encoding\n : defaults.encoding,\n delimiter:\n \"delimiter\" in value && typeof value.delimiter === \"string\" && [\"auto\", \",\", \";\", \"\\t\", \"|\"].includes(value.delimiter)\n ? value.delimiter\n : defaults.delimiter,\n view: \"view\" in value && value.view === \"raw\" ? \"raw\" : \"table\",\n };\n } catch {\n return defaults;\n }\n};\n\nexport const decodeDelimitedContent = (content: { encoding: \"utf8\" | \"base64\"; content: string }, encoding: string): string =>\n content.encoding === \"utf8\"\n ? content.content\n : new TextDecoder(encoding).decode(Uint8Array.from(atob(content.content), (char) => char.charCodeAt(0)));\n"],"mappings":"AAEA;AACA,OAAO,MAAMA,wBAAwB,GAAIC,MAAqB,IAA2B;EACvF,MAAMC,QAA8B,GAAG;IAAEC,QAAQ,EAAE,OAAO;IAAEC,SAAS,EAAE,MAAM;IAAEC,IAAI,EAAE;EAAQ,CAAC;EAC9F,IAAI;IACF,MAAMC,KAAc,GAAGC,IAAI,CAACC,KAAK,CAACP,MAAM,IAAI,MAAM,CAAC;IACnD,IAAI,CAACK,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE,OAAOJ,QAAQ;IACxD,OAAO;MACLC,QAAQ,EACN,UAAU,IAAIG,KAAK,IACnB,OAAOA,KAAK,CAACH,QAAQ,KAAK,QAAQ,IAClC,CAAC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,CAAC,CAACM,QAAQ,CAACH,KAAK,CAACH,QAAQ,CAAC,GACtEG,KAAK,CAACH,QAAQ,GACdD,QAAQ,CAACC,QAAQ;MACvBC,SAAS,EACP,WAAW,IAAIE,KAAK,IAAI,OAAOA,KAAK,CAACF,SAAS,KAAK,QAAQ,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAACK,QAAQ,CAACH,KAAK,CAACF,SAAS,CAAC,GAClHE,KAAK,CAACF,SAAS,GACfF,QAAQ,CAACE,SAAS;MACxBC,IAAI,EAAE,MAAM,IAAIC,KAAK,IAAIA,KAAK,CAACD,IAAI,KAAK,KAAK,GAAG,KAAK,GAAG;IAC1D,CAAC;EACH,CAAC,CAAC,MAAM;IACN,OAAOH,QAAQ;EACjB;AACF,CAAC;AAED,OAAO,MAAMQ,sBAAsB,GAAGA,CAACC,OAAyD,EAAER,QAAgB,KAChHQ,OAAO,CAACR,QAAQ,KAAK,MAAM,GACvBQ,OAAO,CAACA,OAAO,GACf,IAAIC,WAAW,CAACT,QAAQ,CAAC,CAACU,MAAM,CAACC,UAAU,CAACC,IAAI,CAACC,IAAI,CAACL,OAAO,CAACA,OAAO,CAAC,EAAGM,IAAI,IAAKA,IAAI,CAACC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC","ignoreList":[]}
@@ -1 +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":[]}
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 /** Optional presentation label; path remains the identity and rename target. */\n displayName?: 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":[]}
@@ -67,12 +67,18 @@ export const parseDelimitedText = (input, delimiter, limits = {}) => {
67
67
  let field = "";
68
68
  let quoted = false;
69
69
  let truncated = false;
70
+ let totalRows = 0;
71
+ let columnsTruncated = false;
70
72
  const pushField = () => {
71
- if (row.length < maxColumns) row.push(field);else truncated = true;
73
+ if (row.length < maxColumns) row.push(field);else {
74
+ truncated = true;
75
+ columnsTruncated = true;
76
+ }
72
77
  field = "";
73
78
  };
74
79
  const pushRow = () => {
75
- if (rows.length < maxRows) rows.push(row);else truncated = true;
80
+ if (rows.length < maxRows && (totalRows === 0 || totalRows > (limits.offset ?? 0))) rows.push(row);else truncated = true;
81
+ totalRows++;
76
82
  row = [];
77
83
  };
78
84
  for (let index = 0; index < input.length; index += 1) {
@@ -92,10 +98,6 @@ export const parseDelimitedText = (input, delimiter, limits = {}) => {
92
98
  pushField();
93
99
  pushRow();
94
100
  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
101
  } else {
100
102
  field += character;
101
103
  }
@@ -106,7 +108,9 @@ export const parseDelimitedText = (input, delimiter, limits = {}) => {
106
108
  }
107
109
  return {
108
110
  rows,
109
- truncated
111
+ truncated,
112
+ totalRows,
113
+ columnsTruncated
110
114
  };
111
115
  };
112
116
  //# sourceMappingURL=file-view-preview.js.map
@@ -1 +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":[]}
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","totalRows","columnsTruncated","pushField","length","push","pushRow","offset","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 totalRows: number;\n columnsTruncated: boolean;\n};\n\nexport const parseDelimitedText = (\n input: string,\n delimiter: string,\n limits: { rows?: number; columns?: number; offset?: 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 let totalRows = 0;\n let columnsTruncated = false;\n\n const pushField = () => {\n if (row.length < maxColumns) row.push(field);\n else { truncated = true; columnsTruncated = true; }\n field = \"\";\n };\n const pushRow = () => {\n if (rows.length < maxRows && (totalRows === 0 || totalRows > (limits.offset ?? 0))) rows.push(row);\n else truncated = true;\n totalRows++;\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 } 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, totalRows, columnsTruncated };\n};\n"],"mappings":"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","ignoreList":[]}
@@ -13,4 +13,13 @@ export { Pagination } from "./Pagination";
13
13
  export { default as PdfPreview } from "./PdfPreview";
14
14
  export { default as RangePicker } from "./RangePicker";
15
15
  export { default as StructuredDataPreview, isStructuredDataValue } from "./StructuredDataPreview";
16
+ export { ChartExplorer } from "./ChartExplorer";
17
+ export { prepareChartSnapshot } from "./chart-snapshot";
18
+ export { createChartExplorer } from "./chart-explorer";
19
+ export { ChartExplorerControls } from "./ChartExplorerControls";
20
+ export { createChartCursor } from "./chart-cursor";
21
+ export { ChartSnapshotView } from "./ChartSnapshotView";
22
+ export { ChartFilterControls } from "./ChartFilterControls";
23
+ export { createCollectionSelection } from "./collection-selection";
24
+ export { FileGrid } from "./FileGrid";
16
25
  //# sourceMappingURL=index.js.map
@@ -1 +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":[]}
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","ChartExplorer","prepareChartSnapshot","createChartExplorer","ChartExplorerControls","createChartCursor","ChartSnapshotView","ChartFilterControls","createCollectionSelection","FileGrid"],"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, ChartRenderOptions } from \"./Chart\";\nexport type { ChartDatumRef, ChartSelection, ChartTooltip, ChartTooltipFormatter } from \"./chart-inspection\";\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\nexport { ChartExplorer } from \"./ChartExplorer\";\nexport type { ChartExplorerProps, ChartExplorerColumn } from \"./ChartExplorer\";\nexport { prepareChartSnapshot } from \"./chart-snapshot\";\nexport type { ChartSnapshot } from \"./chart-snapshot\";\nexport { createChartExplorer } from \"./chart-explorer\";\nexport type {\n ChartExplorerRequest,\n ChartExplorerRow,\n ChartExplorerData,\n ChartExplorerCharts,\n ChartExplorerSnapshot,\n ChartExplorerOptions,\n ChartExplorerController,\n} from \"./chart-explorer\";\nexport { ChartExplorerControls } from \"./ChartExplorerControls\";\nexport type { ChartExplorerControlsProps } from \"./ChartExplorerControls\";\n\nexport { createChartCursor, type ChartCursor } from \"./chart-cursor\";\n\nexport { ChartSnapshotView } from \"./ChartSnapshotView\";\nexport { ChartFilterControls, type ChartFilterControlsProps } from \"./ChartFilterControls\";\n\nexport { type CollectionSelection, createCollectionSelection, type SelectionModifiers } from \"./collection-selection\";\nexport { FileGrid, type FileGridProps } from \"./FileGrid\";\n"],"mappings":"AAaA,SAASA,OAAO,IAAIC,QAAQ,QAAQ,YAAY;AAIhD,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;AAEjG,SAASC,aAAa,QAAQ,iBAAiB;AAE/C,SAASC,oBAAoB,QAAQ,kBAAkB;AAEvD,SAASC,mBAAmB,QAAQ,kBAAkB;AAUtD,SAASC,qBAAqB,QAAQ,yBAAyB;AAG/D,SAASC,iBAAiB,QAA0B,gBAAgB;AAEpE,SAASC,iBAAiB,QAAQ,qBAAqB;AACvD,SAASC,mBAAmB,QAAuC,uBAAuB;AAE1F,SAAmCC,yBAAyB,QAAiC,wBAAwB;AACrH,SAASC,QAAQ,QAA4B,YAAY","ignoreList":[]}
@@ -7,17 +7,31 @@ var _tmpl$ = ["<div class=\"k2b-inline-guidance__content\">", "</div>"],
7
7
  _tmpl$2 = ["<i class=\"", "\" aria-hidden=\"true\"></i>"];
8
8
  import { Show, splitProps } from "solid-js";
9
9
  export function InlineGuidance(props) {
10
- const [local, rest] = splitProps(props, ["children", "tone", "icon", "class"]);
11
- return _$ssrElement("div", _$mergeProps(rest, {
10
+ const [local, rest] = splitProps(props, ["children", "tone", "icon", "class", "loading"]);
11
+ const icon = () => local.icon ?? (local.loading ? "ti ti-loader-2" : undefined);
12
+ return _$ssrElement("div", _$mergeProps({
13
+ get role() {
14
+ return local.loading ? "status" : undefined;
15
+ },
16
+ get ["aria-live"]() {
17
+ return local.loading ? "polite" : undefined;
18
+ },
19
+ get ["aria-busy"]() {
20
+ return local.loading ? "true" : undefined;
21
+ }
22
+ }, rest, {
12
23
  get ["class"]() {
13
24
  return local.class ? `k2b-inline-guidance ${local.class}` : "k2b-inline-guidance";
14
25
  },
15
26
  get ["data-tone"]() {
16
27
  return local.tone ?? "neutral";
28
+ },
29
+ get ["data-loading"]() {
30
+ return local.loading ? "true" : undefined;
17
31
  }
18
32
  }), [_$escape(_$createComponent(Show, {
19
33
  get when() {
20
- return local.icon;
34
+ return icon();
21
35
  },
22
36
  children: icon => _$ssr(_tmpl$2, `${_$escape(icon(), true)} k2b-inline-guidance__icon`)
23
37
  })), _$ssr(_tmpl$, _$escape(local.children))], false);
@@ -1 +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":[]}
1
+ {"version":3,"names":["Show","splitProps","InlineGuidance","props","local","rest","icon","loading","undefined","_$ssrElement","_$mergeProps","role","aria-live","aria-busy","class","data-tone","tone","data-loading","_$escape","_$createComponent","when","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 loading?: boolean;\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\", \"loading\"]);\n\n const icon = () => local.icon ?? (local.loading ? \"ti ti-loader-2\" : undefined);\n\n return (\n <div\n role={local.loading ? \"status\" : undefined}\n aria-live={local.loading ? \"polite\" : undefined}\n aria-busy={local.loading ? \"true\" : undefined}\n {...rest}\n class={local.class ? `k2b-inline-guidance ${local.class}` : \"k2b-inline-guidance\"}\n data-tone={local.tone ?? \"neutral\"}\n data-loading={local.loading ? \"true\" : undefined}\n >\n <Show when={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;AAWrD,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,EAAE,SAAS,CAAC,CAAC;EAEzF,MAAMG,IAAI,GAAGA,CAAA,KAAMF,KAAK,CAACE,IAAI,KAAKF,KAAK,CAACG,OAAO,GAAG,gBAAgB,GAAGC,SAAS,CAAC;EAE/E,OAAAC,YAAA,QAAAC,YAAA;IAAA,IAEIC,IAAIA,CAAA;MAAA,OAAEP,KAAK,CAACG,OAAO,GAAG,QAAQ,GAAGC,SAAS;IAAA;IAAA,iBAAAI,CAAA;MAAA,OAC/BR,KAAK,CAACG,OAAO,GAAG,QAAQ,GAAGC,SAAS;IAAA;IAAA,iBAAAK,CAAA;MAAA,OACpCT,KAAK,CAACG,OAAO,GAAG,MAAM,GAAGC,SAAS;IAAA;EAAA,GACzCH,IAAI;IAAA,aAAAS,CAAA;MAAA,OACDV,KAAK,CAACU,KAAK,GAAG,uBAAuBV,KAAK,CAACU,KAAK,EAAE,GAAG,qBAAqB;IAAA;IAAA,iBAAAC,CAAA;MAAA,OACtEX,KAAK,CAACY,IAAI,IAAI,SAAS;IAAA;IAAA,oBAAAC,CAAA;MAAA,OACpBb,KAAK,CAACG,OAAO,GAAG,MAAM,GAAGC,SAAS;IAAA;EAAA,KAAAU,QAAA,CAAAC,iBAAA,CAE/CnB,IAAI;IAAA,IAACoB,IAAIA,CAAA;MAAA,OAAEd,IAAI,CAAC,CAAC;IAAA;IAAAe,QAAA,EAAIf,IAAI,IAAAgB,KAAA,CAAAC,OAAA,EAAe,GAAAL,QAAA,CAAGZ,IAAI,CAAC,CAAC,mCAA4B;EAAuB,KAAAgB,KAAA,CAAAE,MAAA,EAAAN,QAAA,CAC1Dd,KAAK,CAACiB,QAAQ;AAG/D;AAEA,eAAenB,cAAc","ignoreList":[]}
@@ -4,7 +4,7 @@ import { createComponent as _$createComponent } from "solid-js/web";
4
4
  import { ssr as _$ssr } from "solid-js/web";
5
5
  import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
6
6
  import { escape as _$escape } from "solid-js/web";
7
- var _tmpl$ = ["<span", " role=\"tooltip\" popover=\"manual\" class=\"k2b-tooltip\">", "</span>"];
7
+ var _tmpl$ = ["<span", " role=\"tooltip\" popover=\"manual\" class=\"k2b-tooltip\"", ">", "</span>"];
8
8
  import { createEffect, createUniqueId, onCleanup, onMount, splitProps } from "solid-js";
9
9
  import { positionTooltipSurface } from "./tooltip-position";
10
10
  /**
@@ -43,7 +43,7 @@ function TooltipSurface(props) {
43
43
  const open = () => {
44
44
  clearTimer();
45
45
  if (props.disabled || dismissedUntilLeave || !surface || !target || surface.matches(":popover-open")) return;
46
- openTimer = setTimeout(() => {
46
+ const show = () => {
47
47
  openTimer = undefined;
48
48
  if (props.disabled || !surface?.isConnected || !target) return;
49
49
  try {
@@ -55,7 +55,9 @@ function TooltipSurface(props) {
55
55
  document.addEventListener("keydown", dismissOnEscape);
56
56
  window.addEventListener("scroll", close, true);
57
57
  window.addEventListener("resize", close);
58
- }, props.delay ?? 250);
58
+ };
59
+ const delay = props.delay ?? 250;
60
+ if (delay <= 0) show();else openTimer = setTimeout(show, delay);
59
61
  };
60
62
  createEffect(() => {
61
63
  if (props.disabled) close();
@@ -93,7 +95,7 @@ function TooltipSurface(props) {
93
95
  target?.removeEventListener("focusout", focusOut);
94
96
  });
95
97
  });
96
- return _$ssr(_tmpl$, _$ssrAttribute("id", _$escape(tooltipId, true), false), _$escape(props.content));
98
+ return _$ssr(_tmpl$, _$ssrAttribute("id", _$escape(tooltipId, true), false), _$ssrAttribute("data-instant", props.delay !== undefined && props.delay <= 0 ? "true" : _$escape(undefined, true), false), _$escape(props.content));
97
99
  }
98
100
 
99
101
  /** Explicit tooltip target for non-button content. */
@@ -1 +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":[]}
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","show","isConnected","showPopover","placement","addEventListener","delay","setTimeout","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 const show = () => {\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 };\n const delay = props.delay ?? 250;\n if (delay <= 0) show();\n else openTimer = setTimeout(show, delay);\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\n ref={surface}\n id={tooltipId}\n role=\"tooltip\"\n popover=\"manual\"\n class=\"k2b-tooltip\"\n data-instant={props.delay !== undefined && props.delay <= 0 ? \"true\" : undefined}\n >\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":[]}