@k2b/ui 0.2.0 → 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 (366) hide show
  1. package/dist/browser/actions/Button.js +11 -2
  2. package/dist/browser/actions/Button.js.map +1 -1
  3. package/dist/browser/actions/Disclosure.js +11 -8
  4. package/dist/browser/actions/Disclosure.js.map +1 -1
  5. package/dist/browser/actions/Dropdown.js +4 -1
  6. package/dist/browser/actions/Dropdown.js.map +1 -1
  7. package/dist/browser/actions/FilterChip.js +16 -2
  8. package/dist/browser/actions/FilterChip.js.map +1 -1
  9. package/dist/browser/actions/SplitButton.js +69 -22
  10. package/dist/browser/actions/SplitButton.js.map +1 -1
  11. package/dist/browser/actions/SpotlightSearch.js +3 -7
  12. package/dist/browser/actions/SpotlightSearch.js.map +1 -1
  13. package/dist/browser/actions/Tabs.js +132 -47
  14. package/dist/browser/actions/Tabs.js.map +1 -1
  15. package/dist/browser/actions/index.js +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 +141 -78
  22. package/dist/browser/chat/ChatPrimitives.js.map +1 -1
  23. package/dist/browser/chat/ChatTasks.js +112 -0
  24. package/dist/browser/chat/ChatTasks.js.map +1 -0
  25. package/dist/browser/chat/ChatTimeline.js +31 -14
  26. package/dist/browser/chat/ChatTimeline.js.map +1 -1
  27. package/dist/browser/chat/chat-behavior.js +0 -5
  28. package/dist/browser/chat/chat-behavior.js.map +1 -1
  29. package/dist/browser/chat/composer-document.js +55 -0
  30. package/dist/browser/chat/composer-document.js.map +1 -0
  31. package/dist/browser/chat/index.js +6 -1
  32. package/dist/browser/chat/index.js.map +1 -1
  33. package/dist/browser/chat/types.js.map +1 -1
  34. package/dist/browser/content/Chart.js +148 -239
  35. package/dist/browser/content/Chart.js.map +1 -1
  36. package/dist/browser/content/ChartExplorer.js +324 -0
  37. package/dist/browser/content/ChartExplorer.js.map +1 -0
  38. package/dist/browser/content/ChartExplorerControls.js +153 -0
  39. package/dist/browser/content/ChartExplorerControls.js.map +1 -0
  40. package/dist/browser/content/ChartFilterControls.js +200 -0
  41. package/dist/browser/content/ChartFilterControls.js.map +1 -0
  42. package/dist/browser/content/ChartSnapshotView.js +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 +6 -0
  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/dialog-core.js +81 -7
  86. package/dist/browser/feedback/dialog-core.js.map +1 -1
  87. package/dist/browser/feedback/prompts.js +6 -0
  88. package/dist/browser/feedback/prompts.js.map +1 -1
  89. package/dist/browser/feedback/toast.js +29 -6
  90. package/dist/browser/feedback/toast.js.map +1 -1
  91. package/dist/browser/inputs/SelectChip.js +3 -2
  92. package/dist/browser/inputs/SelectChip.js.map +1 -1
  93. package/dist/browser/inputs/TextInput.js +7 -1
  94. package/dist/browser/inputs/TextInput.js.map +1 -1
  95. package/dist/browser/inputs/markdown/MarkdownEditor.js +61 -37
  96. package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
  97. package/dist/browser/intl/Format.js +89 -16
  98. package/dist/browser/intl/Format.js.map +1 -1
  99. package/dist/browser/intl/index.js.map +1 -1
  100. package/dist/browser/intl/messages.js +130 -2
  101. package/dist/browser/intl/messages.js.map +1 -1
  102. package/dist/browser/layout/AppWorkspace.js +712 -624
  103. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  104. package/dist/browser/layout/BottomSheet.js +95 -0
  105. package/dist/browser/layout/BottomSheet.js.map +1 -0
  106. package/dist/browser/layout/DetailPanel.js +56 -44
  107. package/dist/browser/layout/DetailPanel.js.map +1 -1
  108. package/dist/browser/layout/Navigation.js +278 -0
  109. package/dist/browser/layout/Navigation.js.map +1 -0
  110. package/dist/browser/layout/PanelDialog.js +219 -71
  111. package/dist/browser/layout/PanelDialog.js.map +1 -1
  112. package/dist/browser/layout/ScrollArea.js +21 -1
  113. package/dist/browser/layout/ScrollArea.js.map +1 -1
  114. package/dist/browser/layout/Settings.js.map +1 -1
  115. package/dist/browser/layout/SidebarItemPreview.js +183 -0
  116. package/dist/browser/layout/SidebarItemPreview.js.map +1 -0
  117. package/dist/browser/layout/app-workspace-controller.js +3 -0
  118. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  119. package/dist/browser/layout/index.js +3 -0
  120. package/dist/browser/layout/index.js.map +1 -1
  121. package/dist/browser/layout/navigation-model.js +23 -0
  122. package/dist/browser/layout/navigation-model.js.map +1 -0
  123. package/dist/browser/layout/scroll-fade.js +100 -0
  124. package/dist/browser/layout/scroll-fade.js.map +1 -0
  125. package/dist/browser/surfaces/DescriptionList.js.map +1 -1
  126. package/dist/browser/surfaces/StatusBadge.js +2 -1
  127. package/dist/browser/surfaces/StatusBadge.js.map +1 -1
  128. package/dist/fonts/ibm-plex-mono-cyrillic-400-italic-4aded3f2f2a7d27d.woff2 +0 -0
  129. package/dist/fonts/ibm-plex-mono-cyrillic-400-normal-7635422bd10ddbbc.woff2 +0 -0
  130. package/dist/fonts/ibm-plex-mono-cyrillic-500-normal-1d89462e86cb8e87.woff2 +0 -0
  131. package/dist/fonts/ibm-plex-mono-cyrillic-600-normal-2b05a8695c7f9f4a.woff2 +0 -0
  132. package/dist/fonts/ibm-plex-mono-cyrillic-ext-400-italic-a0b3b8cbe5a516e7.woff2 +0 -0
  133. package/dist/fonts/ibm-plex-mono-cyrillic-ext-400-normal-f8c22ec1804bd696.woff2 +0 -0
  134. package/dist/fonts/ibm-plex-mono-cyrillic-ext-500-normal-3febe5c7f22e4b07.woff2 +0 -0
  135. package/dist/fonts/ibm-plex-mono-cyrillic-ext-600-normal-83109cdd4f8665b4.woff2 +0 -0
  136. package/dist/fonts/ibm-plex-mono-latin-400-italic-0840095faae86403.woff2 +0 -0
  137. package/dist/fonts/ibm-plex-mono-latin-400-normal-08949f728dc52d52.woff2 +0 -0
  138. package/dist/fonts/ibm-plex-mono-latin-500-normal-01d285447409c8a5.woff2 +0 -0
  139. package/dist/fonts/ibm-plex-mono-latin-600-normal-0d1f0b8d0722224e.woff2 +0 -0
  140. package/dist/fonts/ibm-plex-mono-latin-ext-400-italic-1b07eee6df7d26b3.woff2 +0 -0
  141. package/dist/fonts/ibm-plex-mono-latin-ext-400-normal-6bc0f226a5b7884a.woff2 +0 -0
  142. package/dist/fonts/ibm-plex-mono-latin-ext-500-normal-6bb06407c97584b0.woff2 +0 -0
  143. package/dist/fonts/ibm-plex-mono-latin-ext-600-normal-32057cf50dd14bdb.woff2 +0 -0
  144. package/dist/fonts/ibm-plex-mono-vietnamese-400-italic-a6bab38af4f9c761.woff2 +0 -0
  145. package/dist/fonts/ibm-plex-mono-vietnamese-400-normal-62632b6375305e70.woff2 +0 -0
  146. package/dist/fonts/ibm-plex-mono-vietnamese-500-normal-781633d95de88040.woff2 +0 -0
  147. package/dist/fonts/ibm-plex-mono-vietnamese-600-normal-51b74d53e106ba8a.woff2 +0 -0
  148. package/dist/fonts/ibm-plex-sans-cyrillic-400-italic-e8731a7e2b00fc4f.woff2 +0 -0
  149. package/dist/fonts/ibm-plex-sans-cyrillic-400-normal-69afad88a0740b6e.woff2 +0 -0
  150. package/dist/fonts/ibm-plex-sans-cyrillic-500-normal-200be3a2a6b1789f.woff2 +0 -0
  151. package/dist/fonts/ibm-plex-sans-cyrillic-600-normal-730becc6f005c18c.woff2 +0 -0
  152. package/dist/fonts/ibm-plex-sans-cyrillic-700-normal-40540598b4c9eb2c.woff2 +0 -0
  153. package/dist/fonts/ibm-plex-sans-cyrillic-ext-400-italic-4ffb25726a7ce4cc.woff2 +0 -0
  154. package/dist/fonts/ibm-plex-sans-cyrillic-ext-400-normal-e2580ad78906551e.woff2 +0 -0
  155. package/dist/fonts/ibm-plex-sans-cyrillic-ext-500-normal-08578d906af6d986.woff2 +0 -0
  156. package/dist/fonts/ibm-plex-sans-cyrillic-ext-600-normal-d60d3d0b182753d5.woff2 +0 -0
  157. package/dist/fonts/ibm-plex-sans-cyrillic-ext-700-normal-d07dd53642480097.woff2 +0 -0
  158. package/dist/fonts/ibm-plex-sans-greek-400-italic-1bc10b01688ba9fa.woff2 +0 -0
  159. package/dist/fonts/ibm-plex-sans-greek-400-normal-02296067bc904d2a.woff2 +0 -0
  160. package/dist/fonts/ibm-plex-sans-greek-500-normal-8cb6e20b4dbbaa5f.woff2 +0 -0
  161. package/dist/fonts/ibm-plex-sans-greek-600-normal-0a9ebd9019415ee9.woff2 +0 -0
  162. package/dist/fonts/ibm-plex-sans-greek-700-normal-c949641d10a3bebc.woff2 +0 -0
  163. package/dist/fonts/ibm-plex-sans-latin-400-italic-6de912e531b6c980.woff2 +0 -0
  164. package/dist/fonts/ibm-plex-sans-latin-400-normal-3b646991d30055a9.woff2 +0 -0
  165. package/dist/fonts/ibm-plex-sans-latin-500-normal-0717336fb31fcdcd.woff2 +0 -0
  166. package/dist/fonts/ibm-plex-sans-latin-600-normal-8960851d691c054e.woff2 +0 -0
  167. package/dist/fonts/ibm-plex-sans-latin-700-normal-42e7b0c143c19df9.woff2 +0 -0
  168. package/dist/fonts/ibm-plex-sans-latin-ext-400-italic-c5c00e8a32022dfe.woff2 +0 -0
  169. package/dist/fonts/ibm-plex-sans-latin-ext-400-normal-c93d2a12aaa280f6.woff2 +0 -0
  170. package/dist/fonts/ibm-plex-sans-latin-ext-500-normal-2846035d85100f84.woff2 +0 -0
  171. package/dist/fonts/ibm-plex-sans-latin-ext-600-normal-b25dfd4f979e442a.woff2 +0 -0
  172. package/dist/fonts/ibm-plex-sans-latin-ext-700-normal-92f0392bd74fa395.woff2 +0 -0
  173. package/dist/fonts/ibm-plex-sans-vietnamese-400-italic-675d4bace127bffb.woff2 +0 -0
  174. package/dist/fonts/ibm-plex-sans-vietnamese-400-normal-771538f7f26551bd.woff2 +0 -0
  175. package/dist/fonts/ibm-plex-sans-vietnamese-500-normal-85ba3d9c2488a813.woff2 +0 -0
  176. package/dist/fonts/ibm-plex-sans-vietnamese-600-normal-5d34b803637befe3.woff2 +0 -0
  177. package/dist/fonts/ibm-plex-sans-vietnamese-700-normal-b79d0c4b68b85007.woff2 +0 -0
  178. package/dist/plex.css +1 -1
  179. package/dist/ssr/actions/Button.js +11 -2
  180. package/dist/ssr/actions/Button.js.map +1 -1
  181. package/dist/ssr/actions/Disclosure.js +2 -2
  182. package/dist/ssr/actions/Disclosure.js.map +1 -1
  183. package/dist/ssr/actions/Dropdown.js +4 -1
  184. package/dist/ssr/actions/Dropdown.js.map +1 -1
  185. package/dist/ssr/actions/FilterChip.js +16 -2
  186. package/dist/ssr/actions/FilterChip.js.map +1 -1
  187. package/dist/ssr/actions/SplitButton.js +69 -22
  188. package/dist/ssr/actions/SplitButton.js.map +1 -1
  189. package/dist/ssr/actions/SpotlightSearch.js +3 -7
  190. package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
  191. package/dist/ssr/actions/Tabs.js +58 -11
  192. package/dist/ssr/actions/Tabs.js.map +1 -1
  193. package/dist/ssr/actions/index.js +1 -1
  194. package/dist/ssr/actions/index.js.map +1 -1
  195. package/dist/ssr/chat/ChatComposer.js +366 -134
  196. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  197. package/dist/ssr/chat/ChatContextPopup.js +86 -0
  198. package/dist/ssr/chat/ChatContextPopup.js.map +1 -0
  199. package/dist/ssr/chat/ChatPrimitives.js +49 -11
  200. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  201. package/dist/ssr/chat/ChatTasks.js +48 -0
  202. package/dist/ssr/chat/ChatTasks.js.map +1 -0
  203. package/dist/ssr/chat/ChatTimeline.js +14 -4
  204. package/dist/ssr/chat/ChatTimeline.js.map +1 -1
  205. package/dist/ssr/chat/chat-behavior.js +0 -5
  206. package/dist/ssr/chat/chat-behavior.js.map +1 -1
  207. package/dist/ssr/chat/composer-document.js +55 -0
  208. package/dist/ssr/chat/composer-document.js.map +1 -0
  209. package/dist/ssr/chat/index.js +6 -1
  210. package/dist/ssr/chat/index.js.map +1 -1
  211. package/dist/ssr/chat/types.js.map +1 -1
  212. package/dist/ssr/content/Chart.js +121 -219
  213. package/dist/ssr/content/Chart.js.map +1 -1
  214. package/dist/ssr/content/ChartExplorer.js +257 -0
  215. package/dist/ssr/content/ChartExplorer.js.map +1 -0
  216. package/dist/ssr/content/ChartExplorerControls.js +105 -0
  217. package/dist/ssr/content/ChartExplorerControls.js.map +1 -0
  218. package/dist/ssr/content/ChartFilterControls.js +139 -0
  219. package/dist/ssr/content/ChartFilterControls.js.map +1 -0
  220. package/dist/ssr/content/ChartSnapshotView.js +57 -0
  221. package/dist/ssr/content/ChartSnapshotView.js.map +1 -0
  222. package/dist/ssr/content/DataTable.js +13 -9
  223. package/dist/ssr/content/DataTable.js.map +1 -1
  224. package/dist/ssr/content/FileBrowser.js +3 -0
  225. package/dist/ssr/content/FileBrowser.js.map +1 -1
  226. package/dist/ssr/content/FileGrid.js +38 -0
  227. package/dist/ssr/content/FileGrid.js.map +1 -0
  228. package/dist/ssr/content/FileTree.js +2 -2
  229. package/dist/ssr/content/FileTree.js.map +1 -1
  230. package/dist/ssr/content/FileView.js +352 -75
  231. package/dist/ssr/content/FileView.js.map +1 -1
  232. package/dist/ssr/content/MarkdownView.js +6 -0
  233. package/dist/ssr/content/MarkdownView.js.map +1 -1
  234. package/dist/ssr/content/PdfPreview.js +37 -24
  235. package/dist/ssr/content/PdfPreview.js.map +1 -1
  236. package/dist/ssr/content/chart-cursor.js +33 -0
  237. package/dist/ssr/content/chart-cursor.js.map +1 -0
  238. package/dist/ssr/content/chart-explorer.js +147 -0
  239. package/dist/ssr/content/chart-explorer.js.map +1 -0
  240. package/dist/ssr/content/chart-inspection.js +447 -0
  241. package/dist/ssr/content/chart-inspection.js.map +1 -0
  242. package/dist/ssr/content/chart-line-gaps.js +53 -0
  243. package/dist/ssr/content/chart-line-gaps.js.map +1 -0
  244. package/dist/ssr/content/chart-map-viewport.js +5 -1
  245. package/dist/ssr/content/chart-map-viewport.js.map +1 -1
  246. package/dist/ssr/content/chart-snapshot.js +63 -0
  247. package/dist/ssr/content/chart-snapshot.js.map +1 -0
  248. package/dist/ssr/content/chart-state-timeline.js +32 -4
  249. package/dist/ssr/content/chart-state-timeline.js.map +1 -1
  250. package/dist/ssr/content/chart-svg.js +54 -0
  251. package/dist/ssr/content/chart-svg.js.map +1 -0
  252. package/dist/ssr/content/collection-selection.js +109 -0
  253. package/dist/ssr/content/collection-selection.js.map +1 -0
  254. package/dist/ssr/content/delimited-preferences.js +21 -0
  255. package/dist/ssr/content/delimited-preferences.js.map +1 -0
  256. package/dist/ssr/content/file-tree.js.map +1 -1
  257. package/dist/ssr/content/file-view-preview.js +11 -7
  258. package/dist/ssr/content/file-view-preview.js.map +1 -1
  259. package/dist/ssr/content/index.js +9 -0
  260. package/dist/ssr/content/index.js.map +1 -1
  261. package/dist/ssr/feedback/InlineGuidance.js +17 -3
  262. package/dist/ssr/feedback/InlineGuidance.js.map +1 -1
  263. package/dist/ssr/feedback/dialog-core.js +81 -7
  264. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  265. package/dist/ssr/feedback/prompts.js +6 -0
  266. package/dist/ssr/feedback/prompts.js.map +1 -1
  267. package/dist/ssr/feedback/toast.js +29 -6
  268. package/dist/ssr/feedback/toast.js.map +1 -1
  269. package/dist/ssr/inputs/SelectChip.js +3 -3
  270. package/dist/ssr/inputs/SelectChip.js.map +1 -1
  271. package/dist/ssr/inputs/TextInput.js.map +1 -1
  272. package/dist/ssr/inputs/markdown/MarkdownEditor.js +19 -11
  273. package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
  274. package/dist/ssr/intl/Format.js +61 -0
  275. package/dist/ssr/intl/Format.js.map +1 -1
  276. package/dist/ssr/intl/index.js.map +1 -1
  277. package/dist/ssr/intl/messages.js +130 -2
  278. package/dist/ssr/intl/messages.js.map +1 -1
  279. package/dist/ssr/layout/AppWorkspace.js +368 -275
  280. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  281. package/dist/ssr/layout/BottomSheet.js +43 -0
  282. package/dist/ssr/layout/BottomSheet.js.map +1 -0
  283. package/dist/ssr/layout/DetailPanel.js +11 -4
  284. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  285. package/dist/ssr/layout/Navigation.js +181 -0
  286. package/dist/ssr/layout/Navigation.js.map +1 -0
  287. package/dist/ssr/layout/PanelDialog.js +111 -26
  288. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  289. package/dist/ssr/layout/ScrollArea.js +16 -1
  290. package/dist/ssr/layout/ScrollArea.js.map +1 -1
  291. package/dist/ssr/layout/Settings.js.map +1 -1
  292. package/dist/ssr/layout/SidebarItemPreview.js +133 -0
  293. package/dist/ssr/layout/SidebarItemPreview.js.map +1 -0
  294. package/dist/ssr/layout/app-workspace-controller.js +3 -0
  295. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  296. package/dist/ssr/layout/index.js +3 -0
  297. package/dist/ssr/layout/index.js.map +1 -1
  298. package/dist/ssr/layout/navigation-model.js +23 -0
  299. package/dist/ssr/layout/navigation-model.js.map +1 -0
  300. package/dist/ssr/layout/scroll-fade.js +100 -0
  301. package/dist/ssr/layout/scroll-fade.js.map +1 -0
  302. package/dist/ssr/surfaces/DescriptionList.js.map +1 -1
  303. package/dist/ssr/surfaces/StatusBadge.js +2 -1
  304. package/dist/ssr/surfaces/StatusBadge.js.map +1 -1
  305. package/dist/styles.css +1 -1
  306. package/dist/tabler.css +1 -1
  307. package/dist/types/actions/Button.d.ts +4 -0
  308. package/dist/types/actions/Disclosure.d.ts +1 -0
  309. package/dist/types/actions/FilterChip.d.ts +4 -0
  310. package/dist/types/actions/SplitButton.d.ts +6 -0
  311. package/dist/types/actions/SpotlightSearch.d.ts +0 -4
  312. package/dist/types/actions/Tabs.d.ts +4 -0
  313. package/dist/types/actions/index.d.ts +1 -1
  314. package/dist/types/chat/ChatComposer.d.ts +20 -2
  315. package/dist/types/chat/ChatContextPopup.d.ts +6 -0
  316. package/dist/types/chat/ChatPrimitives.d.ts +4 -0
  317. package/dist/types/chat/ChatTasks.d.ts +15 -0
  318. package/dist/types/chat/ChatTimeline.d.ts +2 -0
  319. package/dist/types/chat/chat-behavior.d.ts +0 -3
  320. package/dist/types/chat/composer-document.d.ts +14 -0
  321. package/dist/types/chat/index.d.ts +8 -1
  322. package/dist/types/chat/types.d.ts +7 -0
  323. package/dist/types/content/Chart.d.ts +42 -23
  324. package/dist/types/content/ChartExplorer.d.ts +34 -0
  325. package/dist/types/content/ChartExplorerControls.d.ts +10 -0
  326. package/dist/types/content/ChartFilterControls.d.ts +21 -0
  327. package/dist/types/content/ChartSnapshotView.d.ts +11 -0
  328. package/dist/types/content/DataTable.d.ts +4 -0
  329. package/dist/types/content/FileBrowser.d.ts +1 -0
  330. package/dist/types/content/FileGrid.d.ts +21 -0
  331. package/dist/types/content/FileView.d.ts +20 -0
  332. package/dist/types/content/PdfPreview.d.ts +8 -1
  333. package/dist/types/content/chart-cursor.d.ts +15 -0
  334. package/dist/types/content/chart-explorer.d.ts +48 -0
  335. package/dist/types/content/chart-inspection.d.ts +40 -0
  336. package/dist/types/content/chart-line-gaps.d.ts +5 -0
  337. package/dist/types/content/chart-map-viewport.d.ts +1 -1
  338. package/dist/types/content/chart-snapshot.d.ts +26 -0
  339. package/dist/types/content/chart-svg.d.ts +21 -0
  340. package/dist/types/content/collection-selection.d.ts +24 -0
  341. package/dist/types/content/delimited-preferences.d.ts +11 -0
  342. package/dist/types/content/file-tree.d.ts +2 -0
  343. package/dist/types/content/file-view-preview.d.ts +4 -1
  344. package/dist/types/content/index.d.ts +15 -1
  345. package/dist/types/feedback/InlineGuidance.d.ts +1 -0
  346. package/dist/types/feedback/dialog-core.d.ts +11 -0
  347. package/dist/types/feedback/prompts.d.ts +2 -0
  348. package/dist/types/feedback/toast.d.ts +7 -1
  349. package/dist/types/inputs/markdown/MarkdownEditor.d.ts +5 -1
  350. package/dist/types/intl/Format.d.ts +9 -0
  351. package/dist/types/intl/index.d.ts +1 -1
  352. package/dist/types/intl/messages.d.ts +31 -1
  353. package/dist/types/layout/AppWorkspace.d.ts +35 -18
  354. package/dist/types/layout/BottomSheet.d.ts +23 -0
  355. package/dist/types/layout/DetailPanel.d.ts +1 -0
  356. package/dist/types/layout/Navigation.d.ts +8 -0
  357. package/dist/types/layout/PanelDialog.d.ts +14 -1
  358. package/dist/types/layout/ScrollArea.d.ts +4 -0
  359. package/dist/types/layout/Settings.d.ts +1 -1
  360. package/dist/types/layout/SidebarItemPreview.d.ts +11 -0
  361. package/dist/types/layout/index.d.ts +4 -1
  362. package/dist/types/layout/navigation-model.d.ts +48 -0
  363. package/dist/types/layout/scroll-fade.d.ts +3 -0
  364. package/dist/types/surfaces/DescriptionList.d.ts +1 -1
  365. package/dist/types/surfaces/StatusBadge.d.ts +1 -1
  366. package/package.json +5 -5
@@ -0,0 +1,147 @@
1
+ import { batch, createEffect, createSignal, onCleanup, untrack } from "solid-js";
2
+
3
+ /** Omitted visibleKeys means no series filter; [] explicitly hides every series. */
4
+
5
+ export const sameExplorerRequest = (a, b) => a.step === b.step && a.referenceStep === b.referenceStep && (a.visibleKeys === undefined || b.visibleKeys === undefined ? a.visibleKeys === b.visibleKeys : a.visibleKeys.length === b.visibleKeys.length && a.visibleKeys.every(key => b.visibleKeys.includes(key)));
6
+ function validateRequest(request) {
7
+ if (request.step === "" || request.referenceStep === "" || request.referenceStep !== undefined && request.step === undefined || request.visibleKeys?.some(key => !key) || new Set(request.visibleKeys).size !== (request.visibleKeys?.length ?? 0)) {
8
+ throw new Error("Chart filters require nonempty unique keys; a reference requires a current step");
9
+ }
10
+ }
11
+ export function validateChartExplorerData(data) {
12
+ const keys = data.rows.map(row => row.key);
13
+ const rows = new Set(keys);
14
+ const marks = data.chart.marks.map(mark => mark.key);
15
+ if (keys.some(key => !key) || rows.size !== keys.length || marks.some(key => !key) || new Set(marks).size !== marks.length || data.chart.marks.some(mark => !rows.has(mark.rowKey))) {
16
+ throw new Error("Chart data requires unique row/mark keys and a row for every mark.rowKey");
17
+ }
18
+ }
19
+
20
+ /** One owner for one or many charts. Source/HTTP/aggregation remain caller-owned. */
21
+ export function createChartExplorer(options) {
22
+ if (options.request && !options.onRequestChange) throw new Error("Controlled chart filters require onRequestChange");
23
+ if (options.selectedKey && !options.onSelectedKeyChange) throw new Error("Controlled chart selection requires onSelectedKeyChange");
24
+ const initial = options.snapshot();
25
+ const ids = Object.keys(initial.charts).sort();
26
+ if (!ids.length || ids.some(id => !id)) throw new Error("An explorer needs named charts");
27
+ const validate = value => {
28
+ validateRequest(value.request);
29
+ const nextIds = Object.keys(value.charts).sort();
30
+ if (nextIds.length !== ids.length || nextIds.some((id, i) => id !== ids[i])) throw new Error("Return every configured chart");
31
+ Object.values(value.charts).forEach(validateChartExplorerData);
32
+ };
33
+ validate(initial);
34
+ const [snapshot, setSnapshot] = createSignal(initial);
35
+ const [desired, setDesired] = createSignal(options.request?.() ?? initial.request);
36
+ const [loading, setLoading] = createSignal(false);
37
+ const [error, setError] = createSignal(null);
38
+ const [localSelection, setLocalSelection] = createSignal(null);
39
+ const rawSelection = () => options.selectedKey ? options.selectedKey() : localSelection();
40
+ const hasRow = (value, key) => Object.values(value.charts).some(data => data.rows.some(row => row.key === key));
41
+ const selectedKey = () => {
42
+ const key = rawSelection();
43
+ return key !== null && hasRow(snapshot(), key) ? key : null;
44
+ };
45
+ const select = key => {
46
+ if (key !== null && !hasRow(snapshot(), key)) return;
47
+ if (!options.selectedKey) setLocalSelection(key);
48
+ options.onSelectedKeyChange?.(key);
49
+ };
50
+ let pending;
51
+ let disposed = false;
52
+ const adopt = next => {
53
+ setSnapshot(() => next);
54
+ const key = rawSelection();
55
+ if (!options.selectedKey && key !== null && !hasRow(next, key)) select(null);
56
+ };
57
+ const execute = async (next, force = false) => {
58
+ if (disposed) return;
59
+ validateRequest(next);
60
+ if (!force && pending && sameExplorerRequest(next, desired())) return;
61
+ pending?.abort();
62
+ const controller = new AbortController();
63
+ pending = controller;
64
+ batch(() => {
65
+ setDesired(next);
66
+ setError(null);
67
+ });
68
+ if (!force && sameExplorerRequest(next, snapshot().request)) {
69
+ pending = undefined;
70
+ setLoading(false);
71
+ return;
72
+ }
73
+ setLoading(true);
74
+ try {
75
+ const result = await options.load(next, controller.signal);
76
+ if (controller.signal.aborted || pending !== controller) return;
77
+ if (!sameExplorerRequest(result.request, next)) throw new Error("Chart response does not match requested filters");
78
+ validate(result);
79
+ batch(() => adopt(result));
80
+ } catch (cause) {
81
+ if (!controller.signal.aborted && pending === controller) setError(() => cause instanceof Error ? cause : new Error("Could not load chart data", {
82
+ cause
83
+ }));
84
+ } finally {
85
+ if (!controller.signal.aborted && pending === controller) {
86
+ setLoading(false);
87
+ pending = undefined;
88
+ }
89
+ }
90
+ };
91
+ createEffect(() => {
92
+ const next = options.snapshot();
93
+ untrack(() => {
94
+ validate(next);
95
+ pending?.abort();
96
+ pending = undefined;
97
+ batch(() => {
98
+ adopt(next);
99
+ setDesired(options.request?.() ?? next.request);
100
+ setLoading(false);
101
+ setError(null);
102
+ });
103
+ });
104
+ });
105
+ createEffect(() => {
106
+ options.snapshot();
107
+ const request = options.request?.();
108
+ if (request) untrack(() => {
109
+ void execute(request);
110
+ });
111
+ });
112
+ onCleanup(() => {
113
+ disposed = true;
114
+ pending?.abort();
115
+ });
116
+ const setRequest = next => {
117
+ validateRequest(next);
118
+ if (!options.request) void execute(next);
119
+ options.onRequestChange?.(next);
120
+ };
121
+ return {
122
+ snapshot,
123
+ desired,
124
+ loading,
125
+ error,
126
+ selectedKey,
127
+ select,
128
+ setRequest,
129
+ /** Force a fresh read of the desired filters, even when nothing changed. */
130
+ refresh: () => execute(options.request?.() ?? desired(), true),
131
+ retry: () => execute(options.request?.() ?? desired(), true),
132
+ pinReference() {
133
+ const step = snapshot().request.step;
134
+ if (step !== undefined) setRequest({
135
+ ...desired(),
136
+ referenceStep: step
137
+ });
138
+ },
139
+ clearReference() {
140
+ setRequest({
141
+ ...desired(),
142
+ referenceStep: undefined
143
+ });
144
+ }
145
+ };
146
+ }
147
+ //# sourceMappingURL=chart-explorer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["batch","createEffect","createSignal","onCleanup","untrack","sameExplorerRequest","a","b","step","referenceStep","visibleKeys","undefined","length","every","key","includes","validateRequest","request","some","Set","size","Error","validateChartExplorerData","data","keys","rows","map","row","marks","chart","mark","has","rowKey","createChartExplorer","options","onRequestChange","selectedKey","onSelectedKeyChange","initial","snapshot","ids","Object","charts","sort","id","validate","value","nextIds","i","values","forEach","setSnapshot","desired","setDesired","loading","setLoading","error","setError","localSelection","setLocalSelection","rawSelection","hasRow","select","pending","disposed","adopt","next","execute","force","abort","controller","AbortController","result","load","signal","aborted","cause","setRequest","refresh","retry","pinReference","clearReference"],"sources":["content/chart-explorer.ts"],"sourcesContent":["import { batch, createEffect, createSignal, onCleanup, untrack, type Accessor } from \"solid-js\";\nimport type { ChartSnapshot } from \"./chart-snapshot\";\n\n/** Omitted visibleKeys means no series filter; [] explicitly hides every series. */\nexport type ChartExplorerRequest = { step?: string; visibleKeys?: readonly string[]; referenceStep?: string };\nexport type ChartExplorerRow = { key: string };\nexport type ChartExplorerData<T extends ChartExplorerRow = ChartExplorerRow> = { chart: ChartSnapshot; rows: readonly T[] };\nexport type ChartExplorerCharts = Readonly<Record<string, ChartExplorerData>>;\nexport type ChartExplorerSnapshot<C extends ChartExplorerCharts> = { request: ChartExplorerRequest; charts: C };\nexport type ChartExplorerOptions<C extends ChartExplorerCharts> = {\n /** Authoritative initial/replacement data. Replacements cancel pending work. */\n snapshot: Accessor<ChartExplorerSnapshot<C>>;\n load: (\n request: ChartExplorerRequest,\n signal: AbortSignal,\n ) => ChartExplorerSnapshot<NoInfer<C>> | Promise<ChartExplorerSnapshot<NoInfer<C>>>;\n /** Optional controlled filters. Changes trigger loading; setRequest emits onRequestChange. */\n request?: Accessor<ChartExplorerRequest>;\n onRequestChange?: (request: ChartExplorerRequest) => void;\n selectedKey?: Accessor<string | null>;\n onSelectedKeyChange?: (key: string | null) => void;\n};\nexport type ChartExplorerController<C extends ChartExplorerCharts> = ReturnType<typeof createChartExplorer<C>>;\n\nexport const sameExplorerRequest = (a: ChartExplorerRequest, b: ChartExplorerRequest) =>\n a.step === b.step &&\n a.referenceStep === b.referenceStep &&\n (a.visibleKeys === undefined || b.visibleKeys === undefined\n ? a.visibleKeys === b.visibleKeys\n : a.visibleKeys.length === b.visibleKeys.length && a.visibleKeys.every((key) => b.visibleKeys!.includes(key)));\n\nfunction validateRequest(request: ChartExplorerRequest) {\n if (\n request.step === \"\" ||\n request.referenceStep === \"\" ||\n (request.referenceStep !== undefined && request.step === undefined) ||\n request.visibleKeys?.some((key) => !key) ||\n new Set(request.visibleKeys).size !== (request.visibleKeys?.length ?? 0)\n ) {\n throw new Error(\"Chart filters require nonempty unique keys; a reference requires a current step\");\n }\n}\n\nexport function validateChartExplorerData(data: ChartExplorerData) {\n const keys = data.rows.map((row) => row.key);\n const rows = new Set(keys);\n const marks = data.chart.marks.map((mark) => mark.key);\n if (\n keys.some((key) => !key) ||\n rows.size !== keys.length ||\n marks.some((key) => !key) ||\n new Set(marks).size !== marks.length ||\n data.chart.marks.some((mark) => !rows.has(mark.rowKey))\n ) {\n throw new Error(\"Chart data requires unique row/mark keys and a row for every mark.rowKey\");\n }\n}\n\n/** One owner for one or many charts. Source/HTTP/aggregation remain caller-owned. */\nexport function createChartExplorer<C extends ChartExplorerCharts>(options: ChartExplorerOptions<C>) {\n if (options.request && !options.onRequestChange) throw new Error(\"Controlled chart filters require onRequestChange\");\n if (options.selectedKey && !options.onSelectedKeyChange) throw new Error(\"Controlled chart selection requires onSelectedKeyChange\");\n const initial = options.snapshot();\n const ids = Object.keys(initial.charts).sort();\n if (!ids.length || ids.some((id) => !id)) throw new Error(\"An explorer needs named charts\");\n const validate = (value: ChartExplorerSnapshot<C>) => {\n validateRequest(value.request);\n const nextIds = Object.keys(value.charts).sort();\n if (nextIds.length !== ids.length || nextIds.some((id, i) => id !== ids[i])) throw new Error(\"Return every configured chart\");\n Object.values(value.charts).forEach(validateChartExplorerData);\n };\n validate(initial);\n const [snapshot, setSnapshot] = createSignal(initial);\n const [desired, setDesired] = createSignal(options.request?.() ?? initial.request);\n const [loading, setLoading] = createSignal(false);\n const [error, setError] = createSignal<Error | null>(null);\n const [localSelection, setLocalSelection] = createSignal<string | null>(null);\n const rawSelection = () => (options.selectedKey ? options.selectedKey() : localSelection());\n const hasRow = (value: ChartExplorerSnapshot<C>, key: string) =>\n Object.values(value.charts).some((data) => data.rows.some((row) => row.key === key));\n const selectedKey = () => {\n const key = rawSelection();\n return key !== null && hasRow(snapshot(), key) ? key : null;\n };\n const select = (key: string | null) => {\n if (key !== null && !hasRow(snapshot(), key)) return;\n if (!options.selectedKey) setLocalSelection(key);\n options.onSelectedKeyChange?.(key);\n };\n let pending: AbortController | undefined;\n let disposed = false;\n const adopt = (next: ChartExplorerSnapshot<C>) => {\n setSnapshot(() => next);\n const key = rawSelection();\n if (!options.selectedKey && key !== null && !hasRow(next, key)) select(null);\n };\n const execute = async (next: ChartExplorerRequest, force = false) => {\n if (disposed) return;\n validateRequest(next);\n if (!force && pending && sameExplorerRequest(next, desired())) return;\n pending?.abort();\n const controller = new AbortController();\n pending = controller;\n batch(() => {\n setDesired(next);\n setError(null);\n });\n if (!force && sameExplorerRequest(next, snapshot().request)) {\n pending = undefined;\n setLoading(false);\n return;\n }\n setLoading(true);\n try {\n const result = await options.load(next, controller.signal);\n if (controller.signal.aborted || pending !== controller) return;\n if (!sameExplorerRequest(result.request, next)) throw new Error(\"Chart response does not match requested filters\");\n validate(result);\n batch(() => adopt(result));\n } catch (cause) {\n if (!controller.signal.aborted && pending === controller)\n setError(() => (cause instanceof Error ? cause : new Error(\"Could not load chart data\", { cause })));\n } finally {\n if (!controller.signal.aborted && pending === controller) {\n setLoading(false);\n pending = undefined;\n }\n }\n };\n createEffect(() => {\n const next = options.snapshot();\n untrack(() => {\n validate(next);\n pending?.abort();\n pending = undefined;\n batch(() => {\n adopt(next);\n setDesired(options.request?.() ?? next.request);\n setLoading(false);\n setError(null);\n });\n });\n });\n createEffect(() => {\n options.snapshot();\n const request = options.request?.();\n if (request)\n untrack(() => {\n void execute(request);\n });\n });\n onCleanup(() => {\n disposed = true;\n pending?.abort();\n });\n const setRequest = (next: ChartExplorerRequest) => {\n validateRequest(next);\n if (!options.request) void execute(next);\n options.onRequestChange?.(next);\n };\n return {\n snapshot,\n desired,\n loading,\n error,\n selectedKey,\n select,\n setRequest,\n /** Force a fresh read of the desired filters, even when nothing changed. */\n refresh: () => execute(options.request?.() ?? desired(), true),\n retry: () => execute(options.request?.() ?? desired(), true),\n pinReference() {\n const step = snapshot().request.step;\n if (step !== undefined) setRequest({ ...desired(), referenceStep: step });\n },\n clearReference() {\n setRequest({ ...desired(), referenceStep: undefined });\n },\n };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,447 @@
1
+ import { createEffect, onCleanup } from "solid-js";
2
+ import { positionTooltipSurface } from "../feedback/tooltip-position";
3
+ export const sameChartDatum = (a, b) => a.role === b.role && a.index === b.index && a.seriesIndex === b.seriesIndex;
4
+ const object = value => typeof value === "object" && value !== null;
5
+ const pair = value => Array.isArray(value) && value.length === 2 && value.every(n => typeof n === "number" && Number.isFinite(n));
6
+ const roles = new Set(["point", "item", "bin", "box", "outlier", "value", "cell", "interval"]);
7
+ export function isChartDatum(value) {
8
+ return object(value) && Number.isInteger(value.index) && typeof value.index === "number" && value.index >= 0 && (value.seriesIndex === undefined || typeof value.seriesIndex === "number" && Number.isInteger(value.seriesIndex) && value.seriesIndex >= 0) && typeof value.role === "string" && roles.has(value.role) && pair(value.anchor) && (value.grid === undefined || pair(value.grid)) && (value.label === undefined || typeof value.label === "string") && Array.isArray(value.values) && value.values.every(field => object(field) && typeof field.key === "string" && (typeof field.value === "string" || typeof field.value === "number" && Number.isFinite(field.value)) && (field.formatted === undefined || typeof field.formatted === "string"));
9
+ }
10
+
11
+ /** Enhances existing SVG nodes. Pointer/focus changes never rebuild the chart. */
12
+ export function createChartInspection(options) {
13
+ const source = Symbol("chart cursor");
14
+ let entries;
15
+ let sortedPoints = [];
16
+ const byElement = new Map();
17
+ let active;
18
+ let highlighted = [];
19
+ let pinned = false;
20
+ let pointerStart;
21
+ let moved = false;
22
+ let pending;
23
+ let frame;
24
+ const records = () => {
25
+ if (!entries || entries.length > 0 && !entries[0].element.isConnected) {
26
+ entries = [];
27
+ byElement.clear();
28
+ sortedPoints = [];
29
+ for (const element of Array.from(options.container()?.querySelectorAll("[data-chart-datum]") ?? [])) {
30
+ try {
31
+ const value = JSON.parse(element.getAttribute("data-chart-datum") ?? "null");
32
+ if (isChartDatum(value)) {
33
+ const entry = {
34
+ element,
35
+ datum: value
36
+ };
37
+ entries.push(entry);
38
+ byElement.set(element, entry);
39
+ }
40
+ } catch {
41
+ /* Only valid renderer metadata participates in inspection. */
42
+ }
43
+ }
44
+ sortedPoints = entries.filter(entry => entry.datum.role === "point").sort((a, b) => a.datum.anchor[0] - b.datum.anchor[0]);
45
+ }
46
+ return entries;
47
+ };
48
+ const highlightColor = item => {
49
+ // Read the actual paint before applying inspection styles, including
50
+ // custom series and threshold colors. Invisible points use their line.
51
+ const point = item.element.querySelector(".stdlib-chart-inspection-point");
52
+ const source = point ? options.container()?.querySelector(options.kind() === "line" ? `.stdlib-chart-line.stdlib-chart-series-${(item.datum.seriesIndex ?? 0) % 8}` : ".stdlib-chart-sparkline, .stdlib-chart-stat-sparkline") : item.element.querySelector(".stdlib-chart-bar-gauge-fill, .stdlib-chart-gauge-fill, .stdlib-chart-stat-value") ?? item.element.querySelector("rect, path, circle");
53
+ const paint = source ? source.ownerDocument.defaultView?.getComputedStyle(source) : undefined;
54
+ const color = (point || item.element.hasAttribute("data-chart-reference") ? paint?.stroke : paint?.fill) || `var(--stdlib-chart-c${(item.datum.seriesIndex ?? 0) % 8 + 1})`;
55
+ return `color-mix(in srgb, ${color} 72%, var(--k2b-chart-highlight-mix))`;
56
+ };
57
+ const selectData = selected => {
58
+ for (const entry of records()) {
59
+ const matches = selected.some(datum => sameChartDatum(datum, entry.datum));
60
+ if (matches) entry.element.style.setProperty("--k2b-chart-selection-color", highlightColor(entry));else entry.element.style.removeProperty("--k2b-chart-selection-color");
61
+ entry.element.toggleAttribute("data-selected", matches);
62
+ }
63
+ };
64
+ const screenPoint = entry => {
65
+ const matrix = entry.element.getScreenCTM?.();
66
+ const [x, y] = entry.datum.anchor;
67
+ if (matrix) return {
68
+ x: matrix.a * x + matrix.c * y + matrix.e,
69
+ y: matrix.b * x + matrix.d * y + matrix.f
70
+ };
71
+ const rect = entry.element.getBoundingClientRect();
72
+ return {
73
+ x: rect.x + rect.width / 2,
74
+ y: rect.y + rect.height / 2
75
+ };
76
+ };
77
+ const visibleRecords = () => {
78
+ const nodes = records();
79
+ if (options.kind() !== "map") return nodes;
80
+ const viewport = options.container()?.querySelector(".stdlib-chart-map-viewport");
81
+ if (!viewport?.getScreenCTM?.()) return nodes;
82
+ const root = viewport.ownerSVGElement?.getBoundingClientRect();
83
+ if (!root?.width || !root.height) return nodes;
84
+ const width = viewport?.width?.baseVal.value;
85
+ const height = viewport?.height?.baseVal.value;
86
+ if (!width || !height) return nodes;
87
+ const left = root.left + viewport.x.baseVal.value;
88
+ const top = root.top + viewport.y.baseVal.value;
89
+ const clip = {
90
+ left,
91
+ top,
92
+ right: left + width,
93
+ bottom: top + height
94
+ };
95
+ return nodes.filter(entry => {
96
+ const point = screenPoint(entry);
97
+ return point.x >= clip.left && point.x <= clip.right && point.y >= clip.top && point.y <= clip.bottom;
98
+ });
99
+ };
100
+ const rawX = entry => entry.datum.values.find(field => field.key === "x")?.value;
101
+ const seriesChart = () => options.kind() === "line" || options.kind() === "sparkline";
102
+ const clearHighlight = () => {
103
+ for (const entry of highlighted) {
104
+ entry.element.removeAttribute("data-inspected");
105
+ entry.element.style.removeProperty("--k2b-chart-inspection-color");
106
+ if (!entry.element.getAttribute("style")) entry.element.removeAttribute("style");
107
+ }
108
+ highlighted = [];
109
+ };
110
+ const close = (broadcast = true, cancelPending = true) => {
111
+ const state = options.cursor?.()?.read();
112
+ if (broadcast && state && state.source !== source) return;
113
+ if (broadcast) options.cursor?.()?.clear(source);
114
+ options.container()?.removeAttribute("data-cursor-source");
115
+ pinned = false;
116
+ active = undefined;
117
+ clearHighlight();
118
+ options.container()?.removeAttribute("aria-describedby");
119
+ options.container()?.removeAttribute("data-inspecting");
120
+ const tooltip = options.tooltip();
121
+ if (tooltip) {
122
+ try {
123
+ if (tooltip.matches(":popover-open")) tooltip.hidePopover();
124
+ } catch {
125
+ /* Detached during navigation. */
126
+ }
127
+ }
128
+ if (cancelPending) {
129
+ if (frame !== undefined) cancelAnimationFrame(frame);
130
+ frame = undefined;
131
+ pending = undefined;
132
+ }
133
+ };
134
+ const invalidate = () => {
135
+ options.cursor?.()?.clear(source);
136
+ close(false);
137
+ entries = undefined;
138
+ sortedPoints = [];
139
+ byElement.clear();
140
+ receive(options.cursor?.()?.read() ?? null);
141
+ };
142
+ const show = (entry, broadcast = true) => {
143
+ const x = rawX(entry);
144
+ if (broadcast && options.kind() === "line" && typeof x === "number") options.cursor?.()?.move(source, x);
145
+ const tooltip = options.tooltip(),
146
+ anchor = options.anchor(),
147
+ container = options.container();
148
+ if (!tooltip || !anchor || !container || !options.enabled()) return;
149
+ if (active === entry && tooltip.matches(":popover-open")) return;
150
+ clearHighlight();
151
+ active = entry;
152
+ highlighted = options.kind() === "line" ? records().filter(candidate => rawX(candidate) === rawX(entry)) : [entry];
153
+ for (const item of highlighted) {
154
+ item.element.style.setProperty("--k2b-chart-inspection-color", highlightColor(item));
155
+ item.element.setAttribute("data-inspected", "true");
156
+ }
157
+ const document = tooltip.ownerDocument;
158
+ const contents = highlighted.map(item => ({
159
+ item,
160
+ content: options.format({
161
+ kind: options.kind(),
162
+ datum: item.datum
163
+ }),
164
+ missing: false
165
+ }));
166
+ if (options.cursor?.() && options.kind() === "line") {
167
+ const present = new Set(highlighted.map(item => item.datum.seriesIndex));
168
+ for (const item of records()) {
169
+ if (present.has(item.datum.seriesIndex)) continue;
170
+ present.add(item.datum.seriesIndex);
171
+ contents.push({
172
+ item,
173
+ content: options.format({
174
+ kind: options.kind(),
175
+ datum: item.datum
176
+ }),
177
+ missing: true
178
+ });
179
+ }
180
+ contents.sort((a, b) => (a.item.datum.seriesIndex ?? 0) - (b.item.datum.seriesIndex ?? 0));
181
+ }
182
+ tooltip.replaceChildren();
183
+ const sharedTitle = typeof x === "number" ? options.cursor?.()?.formatX?.(x) : undefined;
184
+ const commonTitle = sharedTitle ?? (contents.every(({
185
+ content
186
+ }) => content.title === contents[0]?.content.title) ? contents[0]?.content.title : undefined);
187
+ if (commonTitle) {
188
+ const title = document.createElement("strong");
189
+ title.className = "k2b-chart__tooltip-title";
190
+ title.textContent = commonTitle;
191
+ tooltip.append(title);
192
+ }
193
+ for (const {
194
+ item,
195
+ content,
196
+ missing
197
+ } of contents) {
198
+ if (content.title && !commonTitle) {
199
+ const title = document.createElement("strong");
200
+ title.className = "k2b-chart__tooltip-title";
201
+ title.textContent = content.title;
202
+ tooltip.append(title);
203
+ }
204
+ for (const row of content.rows) {
205
+ const line = document.createElement("span");
206
+ line.className = "k2b-chart__tooltip-row";
207
+ if (options.kind() === "line") {
208
+ const swatch = document.createElement("i");
209
+ swatch.setAttribute("aria-hidden", "true");
210
+ const series = container.querySelector(`.stdlib-chart-line.stdlib-chart-series-${(item.datum.seriesIndex ?? 0) % 8}`);
211
+ swatch.style.background = series ? getComputedStyle(series).stroke : `var(--stdlib-chart-c${(item.datum.seriesIndex ?? 0) % 8 + 1})`;
212
+ line.append(swatch);
213
+ }
214
+ const label = document.createElement("span");
215
+ label.textContent = `${row.label}: `;
216
+ const value = document.createElement("b");
217
+ value.textContent = missing ? "—" : row.value;
218
+ line.append(label, value);
219
+ tooltip.append(line);
220
+ }
221
+ }
222
+ const rect = container.getBoundingClientRect(),
223
+ point = screenPoint(entry);
224
+ anchor.style.left = `${point.x - rect.left}px`;
225
+ anchor.style.top = `${point.y - rect.top}px`;
226
+ updatePlotBounds();
227
+ container.style.setProperty("--k2b-chart-inspection-x", `${point.x - rect.left}px`);
228
+ container.setAttribute("data-inspecting", seriesChart() ? "series" : "datum");
229
+ container.setAttribute("aria-describedby", tooltip.id);
230
+ try {
231
+ if (!tooltip.matches(":popover-open")) tooltip.showPopover();
232
+ positionTooltipSurface(tooltip, anchor);
233
+ } catch {
234
+ /* SVG titles remain available without the Popover API. */
235
+ }
236
+ };
237
+ const updatePlotBounds = () => {
238
+ const container = options.container();
239
+ if (!container) return;
240
+ const axes = Array.from(container.querySelectorAll(".stdlib-chart-axis")).map(axis => axis.getBoundingClientRect());
241
+ if (axes.length < 2) return;
242
+ const left = Math.min(...axes.map(a => a.left)),
243
+ right = Math.max(...axes.map(a => a.right));
244
+ const top = Math.min(...axes.map(a => a.top)),
245
+ bottom = Math.max(...axes.map(a => a.bottom));
246
+ if (right <= left || bottom <= top) return;
247
+ const rect = container.getBoundingClientRect();
248
+ for (const [name, value] of Object.entries({
249
+ left: left - rect.left,
250
+ right: rect.right - right,
251
+ top: top - rect.top,
252
+ bottom: rect.bottom - bottom
253
+ })) container.style.setProperty(`--k2b-chart-plot-${name}`, `${value}px`);
254
+ return {
255
+ left,
256
+ right,
257
+ top,
258
+ bottom
259
+ };
260
+ };
261
+ const receive = state => {
262
+ if (state?.source === source) return;
263
+ close(false, false);
264
+ if (!state || options.kind() !== "line") return;
265
+ const entry = records().find(item => rawX(item) === state.x);
266
+ if (entry) show(entry, false);
267
+ };
268
+ createEffect(() => {
269
+ const cursor = options.cursor?.();
270
+ const unsubscribe = cursor?.subscribe(receive);
271
+ onCleanup(() => {
272
+ unsubscribe?.();
273
+ cursor?.clear(source);
274
+ });
275
+ });
276
+ onCleanup(() => close(false));
277
+ const nearest = (x, y, target) => {
278
+ if (target?.closest("button,a") && !target.closest("[data-chart-datum]")) return;
279
+ if (seriesChart()) {
280
+ const plot = updatePlotBounds();
281
+ if (plot && (x < plot.left || x > plot.right || y < plot.top || y > plot.bottom)) return;
282
+ }
283
+ const nodes = visibleRecords();
284
+ const direct = target?.closest("[data-chart-datum]");
285
+ const hit = direct ? byElement.get(direct) : undefined;
286
+ if (hit && nodes.includes(hit)) return hit;
287
+ // Exact shapes win. A small physical hit radius also reaches tiny or
288
+ // zero-sized marks; distant whitespace leaves the chart unselected.
289
+ const points = seriesChart() ? sortedPoints : nodes;
290
+ if (seriesChart() && points.length) {
291
+ const matrix = points[0].element.getScreenCTM?.();
292
+ if (matrix) {
293
+ const determinant = matrix.a * matrix.d - matrix.b * matrix.c;
294
+ if (!determinant) return;
295
+ const targetX = ((x - matrix.e) * matrix.d - (y - matrix.f) * matrix.c) / determinant;
296
+ let low = 0,
297
+ high = points.length - 1;
298
+ while (low < high) {
299
+ const mid = Math.floor((low + high) / 2);
300
+ if (points[mid].datum.anchor[0] < targetX) low = mid + 1;else high = mid;
301
+ }
302
+ const previous = Math.max(0, low - 1);
303
+ return Math.abs(points[previous].datum.anchor[0] - targetX) <= Math.abs(points[low].datum.anchor[0] - targetX) ? points[previous] : points[low];
304
+ }
305
+ }
306
+ const matrices = new Map();
307
+ let best,
308
+ distance = Infinity;
309
+ for (const entry of points) {
310
+ const svg = entry.element.ownerSVGElement;
311
+ if (svg && !matrices.has(svg)) matrices.set(svg, svg.getScreenCTM?.() ?? null);
312
+ const matrix = svg ? matrices.get(svg) : null;
313
+ const [ax, ay] = entry.datum.anchor;
314
+ const point = matrix ? {
315
+ x: matrix.a * ax + matrix.c * ay + matrix.e,
316
+ y: matrix.b * ax + matrix.d * ay + matrix.f
317
+ } : screenPoint(entry);
318
+ const dx = point.x - x,
319
+ dy = point.y - y;
320
+ const next = seriesChart() ? Math.abs(dx) : Math.hypot(dx, dy);
321
+ if (next < distance) {
322
+ distance = next;
323
+ best = entry;
324
+ }
325
+ }
326
+ return seriesChart() || distance <= 24 ? best : undefined;
327
+ };
328
+ const move = event => {
329
+ if (event.target instanceof Node && options.tooltip()?.contains(event.target)) return;
330
+ if (pointerStart && Math.hypot(event.clientX - pointerStart.x, event.clientY - pointerStart.y) > 6) moved = true;
331
+ if (!options.enabled() || pinned || event.pointerType === "touch" || event.buttons) return;
332
+ pending = {
333
+ x: event.clientX,
334
+ y: event.clientY,
335
+ target: event.target instanceof Element ? event.target : null
336
+ };
337
+ if (frame !== undefined) return;
338
+ frame = requestAnimationFrame(() => {
339
+ frame = undefined;
340
+ const sample = pending;
341
+ pending = undefined;
342
+ if (!sample) return;
343
+ const entry = nearest(sample.x, sample.y, sample.target);
344
+ if (entry) {
345
+ show(entry);
346
+ if (seriesChart()) {
347
+ const container = options.container();
348
+ container?.setAttribute("data-cursor-source", "true");
349
+ container?.style.setProperty("--k2b-chart-inspection-y", `${sample.y - container.getBoundingClientRect().top}px`);
350
+ }
351
+ } else close();
352
+ });
353
+ };
354
+ const down = event => {
355
+ pointerStart = {
356
+ x: event.clientX,
357
+ y: event.clientY
358
+ };
359
+ moved = false;
360
+ };
361
+ const click = event => {
362
+ if (!options.enabled() || moved || event.target instanceof Element && event.target.closest("button,a")) return;
363
+ const entry = nearest(event.clientX, event.clientY, event.target instanceof Element ? event.target : null);
364
+ if (!entry) {
365
+ close();
366
+ return;
367
+ }
368
+ pinned = true;
369
+ show(entry);
370
+ options.select({
371
+ kind: options.kind(),
372
+ datum: entry.datum
373
+ });
374
+ };
375
+ const focus = event => {
376
+ if (event.target !== options.container() || !options.enabled()) return;
377
+ const nodes = visibleRecords();
378
+ const first = options.kind() === "line" ? sortedPoints.at(-1) : nodes[0];
379
+ if (first) show(first);
380
+ };
381
+ const key = event => {
382
+ if (!options.enabled() || event.target !== options.container()) return false;
383
+ if (event.key === "Escape") {
384
+ close();
385
+ return true;
386
+ }
387
+ if (event.key === "Enter" && active) {
388
+ if (options.kind() === "map" && !visibleRecords().includes(active)) {
389
+ close();
390
+ return true;
391
+ }
392
+ event.preventDefault();
393
+ pinned = true;
394
+ const link = active.element.closest("a");
395
+ if (link) link.dispatchEvent(new MouseEvent("click", {
396
+ bubbles: true,
397
+ cancelable: true
398
+ }));else options.select({
399
+ kind: options.kind(),
400
+ datum: active.datum
401
+ });
402
+ return true;
403
+ }
404
+ const navigationChart = options.kind() === "map" || options.kind() === "stateTimeline";
405
+ if (navigationChart && !event.altKey) return false;
406
+ if (!["Home", "End", "ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown"].includes(event.key)) return false;
407
+ let nodes = visibleRecords();
408
+ if (seriesChart()) nodes = [...nodes].sort((a, b) => a.datum.anchor[0] - b.datum.anchor[0]);
409
+ if (options.kind() === "line") {
410
+ const seen = new Set();
411
+ nodes = nodes.filter(entry => {
412
+ const x = rawX(entry);
413
+ if (seen.has(x)) return false;
414
+ seen.add(x);
415
+ return true;
416
+ });
417
+ }
418
+ if (!nodes.length) return false;
419
+ event.preventDefault();
420
+ pinned = false;
421
+ let index = active ? options.kind() === "line" ? nodes.findIndex(entry => rawX(entry) === rawX(active)) : nodes.indexOf(active) : -1;
422
+ if (event.key === "Home") index = 0;else if (event.key === "End") index = nodes.length - 1;else if (active?.datum.grid && ["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight"].includes(event.key)) {
423
+ const [x, y] = active.datum.grid;
424
+ const dx = event.key === "ArrowLeft" ? -1 : event.key === "ArrowRight" ? 1 : 0;
425
+ const dy = event.key === "ArrowUp" ? -1 : event.key === "ArrowDown" ? 1 : 0;
426
+ const next = nodes.filter(entry => entry.datum.grid && (dx ? entry.datum.grid[1] === y && (entry.datum.grid[0] - x) * dx > 0 : entry.datum.grid[0] === x && (entry.datum.grid[1] - y) * dy > 0)).sort((a, b) => Math.abs(a.datum.grid[0] - x) + Math.abs(a.datum.grid[1] - y) - Math.abs(b.datum.grid[0] - x) - Math.abs(b.datum.grid[1] - y))[0];
427
+ if (next) index = nodes.indexOf(next);
428
+ } else index += event.key === "ArrowLeft" || event.key === "ArrowUp" ? -1 : 1;
429
+ show(nodes[Math.max(0, Math.min(nodes.length - 1, index))]);
430
+ return true;
431
+ };
432
+ return {
433
+ selectDatum: selected => selectData(selected ? [selected] : []),
434
+ selectData,
435
+ move,
436
+ down,
437
+ click,
438
+ focus,
439
+ key,
440
+ close: () => close(),
441
+ invalidate,
442
+ leave: () => {
443
+ if (!pinned) close();
444
+ }
445
+ };
446
+ }
447
+ //# sourceMappingURL=chart-inspection.js.map