@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
@@ -1,6 +1,8 @@
1
1
  import { template as _$template } from "solid-js/web";
2
2
  import { delegateEvents as _$delegateEvents } from "solid-js/web";
3
+ import { memo as _$memo } from "solid-js/web";
3
4
  import { setProperty as _$setProperty } from "solid-js/web";
5
+ import { setStyleProperty as _$setStyleProperty } from "solid-js/web";
4
6
  import { style as _$style } from "solid-js/web";
5
7
  import { className as _$className } from "solid-js/web";
6
8
  import { getNextMarker as _$getNextMarker } from "solid-js/web";
@@ -10,19 +12,23 @@ import { runHydrationEvents as _$runHydrationEvents } from "solid-js/web";
10
12
  import { createComponent as _$createComponent } from "solid-js/web";
11
13
  import { setAttribute as _$setAttribute } from "solid-js/web";
12
14
  import { getNextElement as _$getNextElement } from "solid-js/web";
13
- import { memo as _$memo } from "solid-js/web";
15
+ import { addEventListener as _$addEventListener } from "solid-js/web";
14
16
  import { use as _$use } from "solid-js/web";
15
17
  var _tmpl$ = /*#__PURE__*/_$template(`<span class=k2b-chart__anchor aria-hidden=true>`),
16
- _tmpl$2 = /*#__PURE__*/_$template(`<span role=tooltip popover=manual class=k2b-tooltip>`),
18
+ _tmpl$2 = /*#__PURE__*/_$template(`<span role=tooltip popover=manual data-instant=true class="k2b-tooltip k2b-chart__tooltip">`),
17
19
  _tmpl$3 = /*#__PURE__*/_$template(`<div class=k2b-chart__controls><button type=button class="k2b-button k2b-icon-button"data-variant=secondary><i class="ti ti-plus"aria-hidden=true></i></button><button type=button class="k2b-button k2b-icon-button"data-variant=secondary><i class="ti ti-minus"aria-hidden=true></i></button><button type=button class="k2b-button k2b-icon-button"data-variant=secondary><i class="ti ti-focus-centered"aria-hidden=true>`),
18
20
  _tmpl$4 = /*#__PURE__*/_$template(`<div role=group><div class=k2b-chart__svg></div><!$><!/><!$><!/>`),
19
21
  _tmpl$5 = /*#__PURE__*/_$template(`<div>`);
22
+ import { lineGapsSvg } from "./chart-line-gaps";
20
23
  import { charts } from "@k2b/stdlib";
21
- import { createEffect, createMemo, createSignal, createUniqueId, onCleanup, onMount, Show } from "solid-js";
22
- import { positionTooltipSurface } from "../feedback/tooltip-position";
24
+ import { createEffect, createMemo, createSignal, createUniqueId, onCleanup, onMount, Show, splitProps, untrack } from "solid-js";
25
+ import { createChartInspection } from "./chart-inspection";
26
+ import { useLocale } from "../intl/locale";
23
27
  import { useUiMessages } from "../intl/messages";
24
28
  import { DEFAULT_MAP_VIEWPORT, normalizeMapViewport, panMapViewport, zoomMapViewport } from "./chart-map-viewport";
25
29
  import { panStateTimelineViewport, renderStateTimelineSvg, stateTimelineDomain, stateTimelineHeight, zoomStateTimelineViewport } from "./chart-state-timeline";
30
+ import { isServer } from "solid-js/web";
31
+ import { responsiveChartSvg, responsiveMapSvg, selectedChartSvg } from "./chart-svg";
26
32
 
27
33
  /**
28
34
  * Chart — minimal Solid wrapper around `stdlib.charts`.
@@ -34,31 +40,20 @@ import { panStateTimelineViewport, renderStateTimelineSvg, stateTimelineDomain,
34
40
  * is a full SVG re-build, not a diff — fine for dashboard cadences
35
41
  * (poll, websocket, store updates). Don't use this for 60fps streaming.
36
42
  *
37
- * **Sizing.** stdlib emits `<svg viewBox="0 0 W H">` with no width/
38
- * height attributes, so the SVG would otherwise fall back to the
39
- * browser's replaced-element default (300×150) and either overflow
40
- * or look squished. We measure the wrapping `<div>` with a
41
- * ResizeObserver and pass the actual pixel dimensions to stdlib —
42
- * the viewBox matches the container, no aspect distortion, no
43
- * letterboxing. Sizing the wrapper itself is the caller's job
44
- * (`style={{ height: "14rem" }}`, an app class, a flex child, …).
45
- * On SSR (no observer)
46
- * the chart renders at stdlib's default size; the first client-side
47
- * frame re-measures and re-renders.
48
- *
49
- * One documented exception: `kind: "stateTimeline"` derives its own
50
- * initial height from the row count and legend via
51
- * `stateTimelineHeight()`, because a timeline's height is a function of
52
- * how many rows it has rather than of the layout around it. Every other
53
- * kind starts at 280px until the observer reports the real box. Layout
54
- * code that sizes charts uniformly must account for this.
43
+ * **Sizing.** The server and browser render the same logical viewBox. CSS
44
+ * fits Cartesian plots to the container and preserves text/marker sizes;
45
+ * maps fit the whole world and zoom uniformly across the full plot; pies, donuts and gauges retain
46
+ * their aspect ratio. No measurement
47
+ * or hydration redraw is needed. The caller sizes the wrapper, for example
48
+ * `style={{ height: "14rem" }}`. State timelines derive their default height
49
+ * from the row count and legend via `stateTimelineHeight()`.
55
50
  *
56
51
  * **Why so thin.** The props are a discriminated union over each
57
52
  * stdlib chart function — `kind: "line"` brings in exactly the params
58
53
  * `charts.line` expects, `kind: "bar"` brings in `charts.bar`'s, etc.
59
54
  * Options stay aligned with stdlib without renaming. Shared interactive
60
55
  * layers add bounded pan / zoom controls to maps and state timelines, plus
61
- * nearest-point hover and keyboard inspection for line charts.
56
+ * renderer-owned inspection, tooltips and optional selection for all chart kinds.
62
57
  * If stdlib gains a new option, it's automatically available at every
63
58
  * callsite.
64
59
  *
@@ -85,45 +80,68 @@ import { panStateTimelineViewport, renderStateTimelineSvg, stateTimelineDomain,
85
80
  /**
86
81
  * Per-kind props: `kind` discriminator + the exact options that
87
82
  * `charts.<kind>` accepts, **minus** `width` / `height` (the wrapper
88
- * owns those — they're derived from container measurement). Solid's
83
+ * owns those — CSS fits a stable coordinate space to the box). Solid's
89
84
  * component model handles discriminated unions natively, so callsites
90
85
  * get full type safety.
91
86
  */
92
87
 
88
+ /** Pure renderer options: component layout, events and inspection are configured elsewhere. */
89
+
90
+ /** Keep the fixed 28-unit bar-gauge rows inside the shared SSR/browser coordinate space. */
91
+ export const chartRenderHeight = props => {
92
+ if (props.kind === "stateTimeline") return stateTimelineHeight(props.rows.length, props.legend !== false);
93
+ if (props.kind === "barGauge") return Math.max(280, (props.title || props.subtitle ? 42 : 16) + props.data.length * 28 + 14);
94
+ return 280;
95
+ };
96
+
93
97
  /**
94
98
  * Internal — strips wrapper-only keys from props and forwards the
95
- * rest (plus measured size) to `charts[kind]`. The `any` is the
96
- * price for dispatching one function call across 8 different option
99
+ * rest (plus logical size) to `charts[kind]`. The `any` is the
100
+ * price for dispatching one function call across 14 different option
97
101
  * types; an explicit per-kind switch would type it but balloon the
98
102
  * component for no runtime benefit.
99
103
  */
100
- const renderSvg = (props, width, height, mapViewport, timelineViewport) => {
104
+ export const renderChartSvg = (props, width, height, mapViewport, timelineViewport) => {
101
105
  const {
102
106
  kind,
103
107
  class: _class,
104
108
  style: _style,
105
109
  labels: _labels,
106
110
  interactive: _interactive,
111
+ onSelect: _onSelect,
112
+ selected: _selected,
113
+ tooltip: _tooltip,
114
+ cursor: _cursor,
115
+ zoomFocus: _zoomFocus,
107
116
  ...opts
108
117
  } = props;
109
118
  if (kind === "stateTimeline") {
110
- return renderStateTimelineSvg({
119
+ return responsiveChartSvg(renderStateTimelineSvg({
111
120
  ...opts,
112
121
  width,
113
122
  height,
114
- viewport: timelineViewport
115
- });
123
+ viewport: timelineViewport,
124
+ interactive: props.interactive
125
+ }));
116
126
  }
117
127
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
118
- return charts[kind]({
128
+ let svg = charts[kind]({
119
129
  ...opts,
120
- ...(kind === "map" && mapViewport ? {
121
- viewport: mapViewport
130
+ ...(kind === "map" ? {
131
+ viewport: DEFAULT_MAP_VIEWPORT
122
132
  } : {}),
123
133
  width,
124
- height
134
+ height,
135
+ inspect: props.interactive === true || props.kind === "line" && props.maxGap !== undefined
125
136
  });
137
+ if (props.kind === "line" && props.maxGap !== undefined) {
138
+ if (props.area || props.errorBand) throw new Error("Chart maxGap does not support area or errorBand fills");
139
+ svg = lineGapsSvg(svg, props.maxGap, props);
140
+ }
141
+ if (props.kind === "map") return responsiveMapSvg(svg, width, height, normalizeMapViewport(mapViewport ?? props.viewport));
142
+ return preservesAspectRatio(kind) ? svg : responsiveChartSvg(svg);
126
143
  };
144
+ const preservesAspectRatio = kind => kind === "map" || kind === "pie" || kind === "donut" || kind === "gauge";
127
145
 
128
146
  /** Empty-data short-circuit. Kept per-kind because stdlib's payload
129
147
  * key differs (series vs data vs groups). We're conservative: only
@@ -148,25 +166,23 @@ const isEmpty = props => {
148
166
  return false;
149
167
  };
150
168
  const Chart = props => {
169
+ const [, drawingProps] = splitProps(props, ["selected", "onSelect", "tooltip", "cursor"]);
151
170
  const messages = useUiMessages();
171
+ const locale = useLocale();
152
172
  let containerRef;
153
173
  let chartTooltipRef;
154
174
  let lineAnchorRef;
155
- let chartTooltipTriggerRef;
156
- // Initial size matches stdlib's chart-function defaults so the SSR
157
- // render is sensible. The observer updates this on the first
158
- // client-side frame; the SVG re-renders reactively via innerHTML.
159
- const initialHeight = props.kind === "stateTimeline" ? stateTimelineHeight(props.rows.length, props.legend !== false) : 280;
160
- const [size, setSize] = createSignal({
175
+ // One deterministic coordinate space on the server and client. CSS fits the
176
+ // SVG to its box; hydration must never replace it with measured geometry.
177
+ const size = () => ({
161
178
  width: 480,
162
- height: initialHeight
179
+ height: chartRenderHeight(props)
163
180
  });
181
+ const dimensions = () => containerRef?.getBoundingClientRect() ?? size();
164
182
  const initialMapViewport = props.kind === "map" ? normalizeMapViewport(props.viewport) : DEFAULT_MAP_VIEWPORT;
165
183
  const [mapViewport, setMapViewport] = createSignal(initialMapViewport);
166
184
  const initialTimelineViewport = props.kind === "stateTimeline" ? stateTimelineDomain(props.rows, props.domain) : [0, 1];
167
185
  const [timelineViewport, setTimelineViewport] = createSignal(initialTimelineViewport);
168
- const [linePointIndex, setLinePointIndex] = createSignal(0);
169
- const [lineInspectionActive, setLineInspectionActive] = createSignal(false);
170
186
  const [dragging, setDragging] = createSignal(false);
171
187
  const chartTooltipId = `k2b-chart-tooltip-${createUniqueId()}`;
172
188
  let timelineViewportLocallyChanged = false;
@@ -177,7 +193,7 @@ const Chart = props => {
177
193
  const interactiveMap = () => props.kind === "map" && props.interactive === true;
178
194
  const interactiveTimeline = () => props.kind === "stateTimeline" && props.interactive === true;
179
195
  const interactiveLine = () => props.kind === "line" && props.interactive === true;
180
- const interactive = () => interactiveMap() || interactiveTimeline() || interactiveLine();
196
+ const interactive = () => props.interactive === true;
181
197
  const draggable = () => interactiveMap() || interactiveTimeline();
182
198
  const labels = () => props.labels ?? {};
183
199
  const timelineFullDomain = () => props.kind === "stateTimeline" ? stateTimelineDomain(props.rows, props.domain) : [0, 1];
@@ -197,6 +213,14 @@ const Chart = props => {
197
213
  };
198
214
  const mapDimensions = () => {
199
215
  const viewportElement = containerRef?.querySelector(".stdlib-chart-map-viewport");
216
+ const matrix = viewportElement?.getScreenCTM?.();
217
+ const box = viewportElement?.viewBox?.baseVal;
218
+ if (matrix && box?.width && box.height) {
219
+ return {
220
+ width: box.width * Math.hypot(matrix.a, matrix.b),
221
+ height: box.height * Math.hypot(matrix.c, matrix.d)
222
+ };
223
+ }
200
224
  const rect = viewportElement?.getBoundingClientRect();
201
225
  if (rect && rect.width > 0 && rect.height > 0) {
202
226
  return {
@@ -204,16 +228,18 @@ const Chart = props => {
204
228
  height: rect.height
205
229
  };
206
230
  }
207
- return size();
231
+ return dimensions();
208
232
  };
209
233
  const zoom = delta => {
234
+ closeChartTooltip();
210
235
  if (interactiveMap()) {
211
- setMapViewport(current => zoomMapViewport(current, delta));
236
+ setMapViewport(current => zoomMapViewport(current, delta, props.kind === "map" ? props.zoomFocus : undefined));
212
237
  } else if (interactiveTimeline()) {
213
238
  updateTimelineViewport(current => zoomStateTimelineViewport(current, timelineFullDomain(), delta));
214
239
  }
215
240
  };
216
241
  const reset = () => {
242
+ closeChartTooltip();
217
243
  if (interactiveMap() && props.kind === "map") {
218
244
  setMapViewport(normalizeMapViewport(props.viewport));
219
245
  }
@@ -223,6 +249,7 @@ const Chart = props => {
223
249
  }
224
250
  };
225
251
  const handlePointerDown = event => {
252
+ inspection.down(event);
226
253
  if (!draggable() || event.button !== 0 || event.target.closest("button, a")) {
227
254
  return;
228
255
  }
@@ -258,10 +285,8 @@ const Chart = props => {
258
285
  const sample = pendingPointer;
259
286
  pendingPointer = undefined;
260
287
  if (!sample) return;
261
- if (interactiveLine()) {
262
- showLineTooltip(sample.clientX, sample.clientY);
263
- return;
264
- }
288
+ const start = timelineDrag ?? drag;
289
+ if (start && Math.hypot(sample.clientX - start.x, sample.clientY - ("y" in start ? start.y : sample.clientY)) <= 6) return;
265
290
  const activeTimelineDrag = timelineDrag;
266
291
  if (activeTimelineDrag?.pointerId === sample.pointerId) {
267
292
  updateTimelineViewport(() => panStateTimelineViewport(activeTimelineDrag.viewport, timelineFullDomain(), sample.clientX - activeTimelineDrag.x, activeTimelineDrag.width));
@@ -271,7 +296,8 @@ const Chart = props => {
271
296
  setMapViewport(panMapViewport(drag.viewport, sample.clientX - drag.x, sample.clientY - drag.y, drag.width, drag.height));
272
297
  };
273
298
  const handlePointerMove = event => {
274
- if (!interactiveLine() && timelineDrag?.pointerId !== event.pointerId && drag?.pointerId !== event.pointerId) return;
299
+ inspection.move(event);
300
+ if (timelineDrag?.pointerId !== event.pointerId && drag?.pointerId !== event.pointerId) return;
275
301
  pendingPointer = {
276
302
  pointerId: event.pointerId,
277
303
  clientX: event.clientX,
@@ -315,20 +341,8 @@ const Chart = props => {
315
341
  }
316
342
  };
317
343
  const handleKeyDown = event => {
318
- if (!interactive()) return;
319
- if (interactiveLine()) {
320
- const values = lineXValues();
321
- if (values.length === 0) return;
322
- if (event.key === "Escape") {
323
- closeChartTooltip();
324
- return;
325
- }
326
- const next = event.key === "Home" ? 0 : event.key === "End" ? values.length - 1 : event.key === "ArrowLeft" ? Math.max(0, linePointIndex() - 1) : event.key === "ArrowRight" ? Math.min(values.length - 1, linePointIndex() + 1) : null;
327
- if (next === null) return;
328
- event.preventDefault();
329
- showLinePoint(next);
330
- return;
331
- }
344
+ if (inspection.key(event)) return;
345
+ if (!draggable() || event.target !== containerRef) return;
332
346
  if (event.key === "+" || event.key === "=") {
333
347
  event.preventDefault();
334
348
  zoom(1);
@@ -360,171 +374,60 @@ const Chart = props => {
360
374
  const dimensions = mapDimensions();
361
375
  setMapViewport(current => panMapViewport(current, delta[0], delta[1], dimensions.width, dimensions.height));
362
376
  };
363
- const closeChartTooltip = () => {
364
- if (interactiveLine()) {
365
- if (pointerFrame !== undefined) cancelAnimationFrame(pointerFrame);
366
- pointerFrame = undefined;
367
- pendingPointer = undefined;
368
- }
369
- chartTooltipTriggerRef?.removeAttribute("aria-describedby");
370
- chartTooltipTriggerRef = undefined;
371
- setLineInspectionActive(false);
372
- if (!chartTooltipRef) return;
373
- try {
374
- if (chartTooltipRef.matches(":popover-open")) chartTooltipRef.hidePopover();
375
- } catch {
376
- // A disconnect can race with the Popover API.
377
- }
378
- };
379
- const showTimelineTooltip = target => {
380
- if (!interactiveTimeline() || !chartTooltipRef) return;
381
- const trigger = target?.closest("[data-chart-tooltip]");
382
- const content = trigger?.dataset.chartTooltip;
383
- if (!trigger || !content) return;
384
- chartTooltipTriggerRef?.removeAttribute("aria-describedby");
385
- chartTooltipTriggerRef = trigger;
386
- trigger.setAttribute("aria-describedby", chartTooltipId);
387
- chartTooltipRef.textContent = content;
388
- try {
389
- if (!chartTooltipRef.matches(":popover-open")) chartTooltipRef.showPopover();
390
- positionTooltipSurface(chartTooltipRef, trigger);
391
- } catch {
392
- // SVG <title> remains as the fallback on browsers without Popover.
393
- }
394
- };
395
- const lineInspection = createMemo(() => {
396
- if (props.kind !== "line") {
377
+ const inspection = createChartInspection({
378
+ container: () => containerRef,
379
+ cursor: () => props.cursor,
380
+ tooltip: () => chartTooltipRef,
381
+ anchor: () => lineAnchorRef,
382
+ kind: () => props.kind,
383
+ enabled: interactive,
384
+ select: selection => props.onSelect?.(selection),
385
+ format: selection => {
386
+ if (props.tooltip) return props.tooltip(selection);
387
+ const fields = messages().chartFields;
388
+ const format = new Intl.NumberFormat(locale(), {
389
+ maximumFractionDigits: 6
390
+ });
397
391
  return {
398
- values: [],
399
- series: []
392
+ title: selection.datum.label ?? (selection.datum.seriesIndex !== undefined ? `${labels().series ?? messages().series} ${selection.datum.seriesIndex + 1}` : undefined),
393
+ rows: selection.datum.values.map(field => ({
394
+ label: selection.kind === "line" && field.key === "y" ? selection.datum.label ?? labels().series ?? messages().series : fields({
395
+ key: field.key
396
+ }),
397
+ value: field.formatted ?? (field.key === "upperInclusive" ? field.value === "true" ? messages().yes : messages().no : typeof field.value === "number" ? `${format.format(field.value)}${field.key === "percent" ? "%" : ""}` : field.value)
398
+ }))
400
399
  };
401
400
  }
402
- const values = new Set();
403
- const series = props.series.map(entry => {
404
- const points = new Map();
405
- for (const point of entry.data) {
406
- if (!Number.isFinite(point.x)) continue;
407
- values.add(point.x);
408
- if (Number.isFinite(point.y) && !points.has(point.x)) points.set(point.x, point);
409
- }
410
- return {
411
- label: entry.label ?? labels().series ?? messages().series,
412
- points
413
- };
414
- });
415
- return {
416
- values: [...values].sort((left, right) => left - right),
417
- series
418
- };
419
401
  });
420
- const lineXValues = () => lineInspection().values;
421
- const linePlotBounds = () => {
422
- if (props.kind !== "line") return {
423
- left: 0,
424
- right: size().width
425
- };
426
- const padding = props.padding;
427
- const left = (typeof padding === "number" ? padding : padding?.left) ?? 40;
428
- const rightInset = (typeof padding === "number" ? padding : padding?.right) ?? 16;
429
- return {
430
- left: left + (props.yAxis?.label ? 14 : 0),
431
- right: Math.max(left + 1, size().width - rightInset)
432
- };
433
- };
434
- const showLinePoint = (index, pointerY) => {
435
- if (props.kind !== "line" || !chartTooltipRef || !lineAnchorRef) return;
436
- const inspection = lineInspection();
437
- const values = inspection.values;
438
- const pointIndex = Math.min(values.length - 1, Math.max(0, index));
439
- const x = values[pointIndex];
440
- if (x === undefined) return;
441
- const points = inspection.series.map(series => {
442
- const point = series.points.get(x);
443
- return point ? {
444
- label: series.label,
445
- point
446
- } : null;
447
- }).filter(entry => entry !== null);
448
- if (points.length === 0) return;
449
- const xFormat = props.xAxis?.format ?? String;
450
- const yFormat = props.yAxis?.format ?? String;
451
- chartTooltipRef.textContent = [xFormat(x), ...points.map(entry => `${entry.label}: ${yFormat(entry.point.y)}`)].join(" · ");
452
- const [min, max] = [values[0] ?? x, values.at(-1) ?? x];
453
- const bounds = linePlotBounds();
454
- const ratio = max === min ? 0.5 : (x - min) / (max - min);
455
- lineAnchorRef.style.left = `${bounds.left + ratio * (bounds.right - bounds.left)}px`;
456
- lineAnchorRef.style.top = `${Math.min(size().height - 8, Math.max(8, pointerY ?? 24))}px`;
457
- setLinePointIndex(pointIndex);
458
- setLineInspectionActive(true);
459
- try {
460
- if (!chartTooltipRef.matches(":popover-open")) chartTooltipRef.showPopover();
461
- positionTooltipSurface(chartTooltipRef, lineAnchorRef);
462
- } catch {
463
- // The chart remains readable on browsers without Popover support.
464
- }
465
- };
466
- const showLineTooltip = (clientX, clientY) => {
467
- const values = lineXValues();
468
- if (values.length === 0) return;
469
- const rect = containerRef?.getBoundingClientRect();
470
- if (!rect) return;
471
- const bounds = linePlotBounds();
472
- const localX = clientX - rect.left;
473
- const ratio = Math.min(1, Math.max(0, (localX - bounds.left) / Math.max(1, bounds.right - bounds.left)));
474
- const target = (values[0] ?? 0) + ratio * ((values.at(-1) ?? 0) - (values[0] ?? 0));
475
- let low = 0;
476
- let high = values.length - 1;
477
- while (low < high) {
478
- const middle = Math.floor((low + high) / 2);
479
- if (values[middle] < target) low = middle + 1;else high = middle;
480
- }
481
- const previous = Math.max(0, low - 1);
482
- const index = Math.abs(values[previous] - target) <= Math.abs(values[low] - target) ? previous : low;
483
- showLinePoint(index, clientY - rect.top);
484
- };
402
+ const closeChartTooltip = () => inspection.close();
403
+ const svgMarkup = createMemo(() => renderChartSvg(drawingProps, size().width, size().height, interactiveMap() ? mapViewport() : undefined, interactiveTimeline() ? timelineViewport() : undefined));
404
+ createEffect(() => {
405
+ svgMarkup();
406
+ inspection.invalidate();
407
+ untrack(() => inspection.selectDatum(props.selected));
408
+ });
409
+ createEffect(() => inspection.selectDatum(props.selected));
485
410
  onCleanup(() => {
411
+ inspection.close();
486
412
  if (pointerFrame !== undefined) cancelAnimationFrame(pointerFrame);
487
413
  pointerFrame = undefined;
488
414
  pendingPointer = undefined;
489
415
  });
490
416
  onMount(() => {
491
417
  if (!containerRef) return;
492
- // Seed immediately from layout — avoids one wasted re-render in
493
- // the case where the container already has its final size at
494
- // mount time (the common case for dashboard widgets).
495
- const rect = containerRef.getBoundingClientRect();
496
- if (rect.width > 0 && rect.height > 0) {
497
- setSize({
498
- width: Math.round(rect.width),
499
- height: Math.round(rect.height)
500
- });
501
- }
502
- const ro = new ResizeObserver(entries => {
503
- const entry = entries[0];
504
- if (!entry) return;
505
- const {
506
- width,
507
- height
508
- } = entry.contentRect;
509
- // Floor to integer pixels; sub-pixel jitter would trigger an
510
- // SVG re-render on every scroll/zoom otherwise.
511
- if (width > 0 && height > 0) {
512
- setSize(prev => {
513
- const w = Math.round(width);
514
- const h = Math.round(height);
515
- return prev.width === w && prev.height === h ? prev : {
516
- width: w,
517
- height: h
518
- };
519
- });
520
- }
521
- });
522
- ro.observe(containerRef);
523
- window.addEventListener("scroll", closeChartTooltip, true);
418
+ const outside = event => {
419
+ if (event.target instanceof Node && !containerRef?.contains(event.target)) closeChartTooltip();
420
+ };
421
+ window.addEventListener("pointerdown", outside);
422
+ const scroll = event => {
423
+ if (event.target instanceof Node && chartTooltipRef?.contains(event.target)) return;
424
+ closeChartTooltip();
425
+ };
426
+ window.addEventListener("scroll", scroll, true);
524
427
  window.addEventListener("resize", closeChartTooltip);
525
428
  onCleanup(() => {
526
- ro.disconnect();
527
- window.removeEventListener("scroll", closeChartTooltip, true);
429
+ window.removeEventListener("pointerdown", outside);
430
+ window.removeEventListener("scroll", scroll, true);
528
431
  window.removeEventListener("resize", closeChartTooltip);
529
432
  });
530
433
  });
@@ -542,10 +445,10 @@ const Chart = props => {
542
445
  typeof _ref$4 === "function" ? _$use(_ref$4, _el$11) : containerRef = _el$11;
543
446
  _$insert(_el$11, () => labels().empty ?? messages().noData);
544
447
  _$effect(_p$ => {
545
- var _v$15 = `k2b-chart k2b-chart__empty ${props.class ?? ""}`,
546
- _v$16 = chartStyle();
547
- _v$15 !== _p$.e && _$className(_el$11, _p$.e = _v$15);
548
- _p$.t = _$style(_el$11, _v$16, _p$.t);
448
+ var _v$19 = `k2b-chart k2b-chart__empty ${props.class ?? ""}`,
449
+ _v$20 = chartStyle();
450
+ _v$19 !== _p$.e && _$className(_el$11, _p$.e = _v$19);
451
+ _p$.t = _$style(_el$11, _v$20, _p$.t);
549
452
  return _p$;
550
453
  }, {
551
454
  e: undefined,
@@ -564,15 +467,9 @@ const Chart = props => {
564
467
  _el$.$$keydown = handleKeyDown;
565
468
  _el$.addEventListener("wheel", handleWheel);
566
469
  _el$.$$focusout = closeChartTooltip;
567
- _el$.$$focusin = event => {
568
- if (interactiveLine()) showLinePoint(lineXValues().length - 1);else showTimelineTooltip(event.target);
569
- };
570
- _el$.addEventListener("pointerleave", closeChartTooltip);
571
- _el$.$$pointerout = event => {
572
- const trigger = event.target.closest("[data-chart-tooltip]");
573
- if (trigger && !trigger.contains(event.relatedTarget)) closeChartTooltip();
574
- };
575
- _el$.$$pointerover = event => showTimelineTooltip(event.target);
470
+ _$addEventListener(_el$, "focusin", inspection.focus, true);
471
+ _$addEventListener(_el$, "pointerleave", inspection.leave);
472
+ _$addEventListener(_el$, "click", inspection.click, true);
576
473
  _el$.addEventListener("pointercancel", stopDragging);
577
474
  _el$.$$pointerup = stopDragging;
578
475
  _el$.$$pointermove = handlePointerMove;
@@ -581,7 +478,7 @@ const Chart = props => {
581
478
  typeof _ref$ === "function" ? _$use(_ref$, _el$) : containerRef = _el$;
582
479
  _$insert(_el$, _$createComponent(Show, {
583
480
  get when() {
584
- return interactiveTimeline() || interactiveLine();
481
+ return interactive();
585
482
  },
586
483
  get children() {
587
484
  return [(() => {
@@ -643,20 +540,28 @@ const Chart = props => {
643
540
  _v$0 = !draggable() && interactiveLine() ? "true" : undefined,
644
541
  _v$1 = interactive() ? "true" : undefined,
645
542
  _v$10 = chartStyle(),
646
- _v$11 = interactiveLine() && lineInspectionActive() ? chartTooltipId : undefined,
647
- _v$12 = interactiveMap() ? labels().interactiveMap ?? messages().interactiveMap : interactiveTimeline() ? labels().interactiveTimeline ?? messages().interactiveTimeline : interactiveLine() ? labels().interactiveLine ?? messages().interactiveLineChart : undefined,
543
+ _v$11 = interactiveMap() ? labels().interactiveMap ?? messages().interactiveMap : interactiveTimeline() ? labels().interactiveTimeline ?? messages().interactiveTimeline : interactiveLine() ? labels().interactiveLine ?? messages().interactiveLineChart : interactive() ? labels().interactiveChart ?? messages().interactiveChart : undefined,
544
+ _v$12 = interactive() ? messages().interactiveChart : undefined,
648
545
  _v$13 = interactive() ? 0 : undefined,
649
- _v$14 = renderSvg(props, size().width, size().height, interactiveMap() ? mapViewport() : undefined, interactiveTimeline() ? timelineViewport() : undefined);
546
+ _v$14 = !preservesAspectRatio(props.kind) ? "true" : undefined,
547
+ _v$15 = `${size().width}px`,
548
+ _v$16 = `${size().height}px`,
549
+ _v$17 = `${size().width} / ${size().height}`,
550
+ _v$18 = isServer ? selectedChartSvg(svgMarkup(), props.selected) : svgMarkup();
650
551
  _v$7 !== _p$.e && _$className(_el$, _p$.e = _v$7);
651
552
  _v$8 !== _p$.t && _$setAttribute(_el$, "data-chart-kind", _p$.t = _v$8);
652
553
  _v$9 !== _p$.a && _$setAttribute(_el$, "data-drag", _p$.a = _v$9);
653
554
  _v$0 !== _p$.o && _$setAttribute(_el$, "data-crosshair", _p$.o = _v$0);
654
555
  _v$1 !== _p$.i && _$setAttribute(_el$, "data-interactive", _p$.i = _v$1);
655
556
  _p$.n = _$style(_el$, _v$10, _p$.n);
656
- _v$11 !== _p$.s && _$setAttribute(_el$, "aria-describedby", _p$.s = _v$11);
657
- _v$12 !== _p$.h && _$setAttribute(_el$, "aria-label", _p$.h = _v$12);
557
+ _v$11 !== _p$.s && _$setAttribute(_el$, "aria-label", _p$.s = _v$11);
558
+ _v$12 !== _p$.h && _$setAttribute(_el$, "aria-description", _p$.h = _v$12);
658
559
  _v$13 !== _p$.r && _$setAttribute(_el$, "tabindex", _p$.r = _v$13);
659
- _v$14 !== _p$.d && _$setProperty(_el$2, "innerHTML", _p$.d = _v$14);
560
+ _v$14 !== _p$.d && _$setAttribute(_el$2, "data-stretch", _p$.d = _v$14);
561
+ _v$15 !== _p$.l && _$setStyleProperty(_el$2, "--k2b-chart-width", _p$.l = _v$15);
562
+ _v$16 !== _p$.u && _$setStyleProperty(_el$2, "--k2b-chart-height", _p$.u = _v$16);
563
+ _v$17 !== _p$.c && _$setStyleProperty(_el$2, "aspect-ratio", _p$.c = _v$17);
564
+ _v$18 !== _p$.w && _$setProperty(_el$2, "innerHTML", _p$.w = _v$18);
660
565
  return _p$;
661
566
  }, {
662
567
  e: undefined,
@@ -668,7 +573,11 @@ const Chart = props => {
668
573
  s: undefined,
669
574
  h: undefined,
670
575
  r: undefined,
671
- d: undefined
576
+ d: undefined,
577
+ l: undefined,
578
+ u: undefined,
579
+ c: undefined,
580
+ w: undefined
672
581
  });
673
582
  _$runHydrationEvents();
674
583
  return _el$;
@@ -676,5 +585,5 @@ const Chart = props => {
676
585
  });
677
586
  };
678
587
  export default Chart;
679
- _$delegateEvents(["pointerdown", "pointermove", "pointerup", "pointerover", "pointerout", "focusin", "focusout", "keydown", "click"]);
588
+ _$delegateEvents(["pointerdown", "pointermove", "pointerup", "click", "focusin", "focusout", "keydown"]);
680
589
  //# sourceMappingURL=Chart.js.map