@k2b/ui 0.5.0 → 0.6.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 (387) 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/ContextMenu.js.map +1 -1
  4. package/dist/browser/actions/CopyButton.js.map +1 -1
  5. package/dist/browser/actions/Disclosure.js.map +1 -1
  6. package/dist/browser/actions/Dropdown.js.map +1 -1
  7. package/dist/browser/actions/FilterChip.js.map +1 -1
  8. package/dist/browser/actions/RemoveButton.js.map +1 -1
  9. package/dist/browser/actions/SegmentedControl.js.map +1 -1
  10. package/dist/browser/actions/SplitButton.js.map +1 -1
  11. package/dist/browser/actions/SpotlightSearch.js.map +1 -1
  12. package/dist/browser/actions/Tabs.js.map +1 -1
  13. package/dist/browser/actions/Toolbar.js.map +1 -1
  14. package/dist/browser/actions/index.js.map +1 -1
  15. package/dist/browser/chat/ChatComposer.js.map +1 -1
  16. package/dist/browser/chat/ChatContextPopup.js.map +1 -1
  17. package/dist/browser/chat/ChatPrimitives.js.map +1 -1
  18. package/dist/browser/chat/ChatRoot.js.map +1 -1
  19. package/dist/browser/chat/ChatTasks.js +1 -1
  20. package/dist/browser/chat/ChatTasks.js.map +1 -1
  21. package/dist/browser/chat/ChatTimeline.js.map +1 -1
  22. package/dist/browser/chat/chat-behavior.js.map +1 -1
  23. package/dist/browser/chat/composer-document.js.map +1 -1
  24. package/dist/browser/chat/index.js.map +1 -1
  25. package/dist/browser/content/Calendar.js.map +1 -1
  26. package/dist/browser/content/Chart.js.map +1 -1
  27. package/dist/browser/content/ChartExplorer.js.map +1 -1
  28. package/dist/browser/content/ChartExplorerControls.js.map +1 -1
  29. package/dist/browser/content/ChartFilterControls.js +1 -1
  30. package/dist/browser/content/ChartFilterControls.js.map +1 -1
  31. package/dist/browser/content/ChartSnapshotView.js.map +1 -1
  32. package/dist/browser/content/CodeDisplay.js.map +1 -1
  33. package/dist/browser/content/DataTable.js.map +1 -1
  34. package/dist/browser/content/Docs.js.map +1 -1
  35. package/dist/browser/content/FileBrowser.js.map +1 -1
  36. package/dist/browser/content/FileGrid.js.map +1 -1
  37. package/dist/browser/content/FileTree.js.map +1 -1
  38. package/dist/browser/content/FileView.js.map +1 -1
  39. package/dist/browser/content/Lightbox.js.map +1 -1
  40. package/dist/browser/content/LogEntriesTable.js.map +1 -1
  41. package/dist/browser/content/MarkdownView.js.map +1 -1
  42. package/dist/browser/content/Pagination.js.map +1 -1
  43. package/dist/browser/content/PdfPreview.js.map +1 -1
  44. package/dist/browser/content/RangePicker.js.map +1 -1
  45. package/dist/browser/content/StructuredDataPreview.js.map +1 -1
  46. package/dist/browser/content/ZoomPanViewport.js +396 -0
  47. package/dist/browser/content/ZoomPanViewport.js.map +1 -0
  48. package/dist/browser/content/calendar-event-layout.js.map +1 -1
  49. package/dist/browser/content/calendar-pointer.js.map +1 -1
  50. package/dist/browser/content/chart-cursor.js.map +1 -1
  51. package/dist/browser/content/chart-explorer.js.map +1 -1
  52. package/dist/browser/content/chart-inspection.js.map +1 -1
  53. package/dist/browser/content/chart-line-gaps.js.map +1 -1
  54. package/dist/browser/content/chart-map-viewport.js.map +1 -1
  55. package/dist/browser/content/chart-snapshot.js.map +1 -1
  56. package/dist/browser/content/chart-state-timeline.js.map +1 -1
  57. package/dist/browser/content/chart-svg.js.map +1 -1
  58. package/dist/browser/content/code-highlight.js.map +1 -1
  59. package/dist/browser/content/collection-selection.js.map +1 -1
  60. package/dist/browser/content/delimited-preferences.js.map +1 -1
  61. package/dist/browser/content/file-tree.js.map +1 -1
  62. package/dist/browser/content/file-view-preview.js.map +1 -1
  63. package/dist/browser/content/index.js +1 -0
  64. package/dist/browser/content/index.js.map +1 -1
  65. package/dist/browser/content/zoom-pan.js +54 -0
  66. package/dist/browser/content/zoom-pan.js.map +1 -0
  67. package/dist/browser/feedback/InlineGuidance.js.map +1 -1
  68. package/dist/browser/feedback/Tooltip.js.map +1 -1
  69. package/dist/browser/feedback/dialog-core.js.map +1 -1
  70. package/dist/browser/feedback/index.js.map +1 -1
  71. package/dist/browser/feedback/prompts.js.map +1 -1
  72. package/dist/browser/feedback/toast.js.map +1 -1
  73. package/dist/browser/feedback/tooltip-position.js.map +1 -1
  74. package/dist/browser/inputs/AutocompleteEditor.js.map +1 -1
  75. package/dist/browser/inputs/AutocompleteSelect.js.map +1 -1
  76. package/dist/browser/inputs/Checkbox.js.map +1 -1
  77. package/dist/browser/inputs/CheckboxCard.js.map +1 -1
  78. package/dist/browser/inputs/ChoiceGroups.js.map +1 -1
  79. package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
  80. package/dist/browser/inputs/Combobox.js.map +1 -1
  81. package/dist/browser/inputs/DatePicker.js.map +1 -1
  82. package/dist/browser/inputs/FileInputs.js.map +1 -1
  83. package/dist/browser/inputs/MultiSelectInput.js.map +1 -1
  84. package/dist/browser/inputs/NumberInput.js.map +1 -1
  85. package/dist/browser/inputs/Select.js.map +1 -1
  86. package/dist/browser/inputs/SelectChip.js.map +1 -1
  87. package/dist/browser/inputs/SpecialInputs.js.map +1 -1
  88. package/dist/browser/inputs/Switch.js.map +1 -1
  89. package/dist/browser/inputs/TagEditor.js.map +1 -1
  90. package/dist/browser/inputs/TagsInput.js.map +1 -1
  91. package/dist/browser/inputs/TemplateEditor.js.map +1 -1
  92. package/dist/browser/inputs/TextInput.js +2 -1
  93. package/dist/browser/inputs/TextInput.js.map +1 -1
  94. package/dist/browser/inputs/choice.js.map +1 -1
  95. package/dist/browser/inputs/completion/behaviors.js.map +1 -1
  96. package/dist/browser/inputs/completion/engine.js.map +1 -1
  97. package/dist/browser/inputs/completion/index.js.map +1 -1
  98. package/dist/browser/inputs/completion/overlay.js.map +1 -1
  99. package/dist/browser/inputs/date-picker.js.map +1 -1
  100. package/dist/browser/inputs/editor-dom.js.map +1 -1
  101. package/dist/browser/inputs/field-contract.js.map +1 -1
  102. package/dist/browser/inputs/icon-options.js.map +1 -1
  103. package/dist/browser/inputs/image-crop.js.map +1 -1
  104. package/dist/browser/inputs/index.js.map +1 -1
  105. package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
  106. package/dist/browser/inputs/markdown/Toolbar.js.map +1 -1
  107. package/dist/browser/inputs/markdown/actions.js.map +1 -1
  108. package/dist/browser/inputs/markdown/active-formats.js.map +1 -1
  109. package/dist/browser/inputs/markdown/behaviors.js.map +1 -1
  110. package/dist/browser/inputs/markdown/code-zone.js.map +1 -1
  111. package/dist/browser/internal/color.js.map +1 -1
  112. package/dist/browser/internal/field.js.map +1 -1
  113. package/dist/browser/internal/portal.js.map +1 -1
  114. package/dist/browser/intl/Format.js.map +1 -1
  115. package/dist/browser/intl/index.js.map +1 -1
  116. package/dist/browser/intl/locale.js.map +1 -1
  117. package/dist/browser/intl/messages.js +6 -0
  118. package/dist/browser/intl/messages.js.map +1 -1
  119. package/dist/browser/layout/AppOverview.js.map +1 -1
  120. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  121. package/dist/browser/layout/BottomSheet.js.map +1 -1
  122. package/dist/browser/layout/DataPanel.js.map +1 -1
  123. package/dist/browser/layout/DetailPanel.js.map +1 -1
  124. package/dist/browser/layout/Discussion.js.map +1 -1
  125. package/dist/browser/layout/FloatingWindow.js.map +1 -1
  126. package/dist/browser/layout/Navigation.js.map +1 -1
  127. package/dist/browser/layout/PanelDialog.js.map +1 -1
  128. package/dist/browser/layout/PanelHeader.js.map +1 -1
  129. package/dist/browser/layout/Panes.js.map +1 -1
  130. package/dist/browser/layout/PullToRefresh.js +8 -7
  131. package/dist/browser/layout/PullToRefresh.js.map +1 -1
  132. package/dist/browser/layout/ScrollArea.js.map +1 -1
  133. package/dist/browser/layout/Settings.js.map +1 -1
  134. package/dist/browser/layout/SettingsCollection.js.map +1 -1
  135. package/dist/browser/layout/SettingsModal.js.map +1 -1
  136. package/dist/browser/layout/SidebarItemPreview.js.map +1 -1
  137. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  138. package/dist/browser/layout/app-workspace-state.js.map +1 -1
  139. package/dist/browser/layout/floating-window-geometry.js.map +1 -1
  140. package/dist/browser/layout/index.js.map +1 -1
  141. package/dist/browser/layout/navigation-model.js.map +1 -1
  142. package/dist/browser/layout/panes-layout.js.map +1 -1
  143. package/dist/browser/layout/scroll-fade.js.map +1 -1
  144. package/dist/browser/layout/stable-id.js.map +1 -1
  145. package/dist/browser/surfaces/Avatar.js.map +1 -1
  146. package/dist/browser/surfaces/DescriptionList.js.map +1 -1
  147. package/dist/browser/surfaces/LinkCard.js.map +1 -1
  148. package/dist/browser/surfaces/NotFoundState.js.map +1 -1
  149. package/dist/browser/surfaces/NoticeCard.js.map +1 -1
  150. package/dist/browser/surfaces/Paper.js.map +1 -1
  151. package/dist/browser/surfaces/Placeholder.js.map +1 -1
  152. package/dist/browser/surfaces/ProgressBar.js.map +1 -1
  153. package/dist/browser/surfaces/StatCell.js.map +1 -1
  154. package/dist/browser/surfaces/StatGrid.js.map +1 -1
  155. package/dist/browser/surfaces/StatusBadge.js.map +1 -1
  156. package/dist/browser/surfaces/Tag.js.map +1 -1
  157. package/dist/browser/surfaces/index.js.map +1 -1
  158. package/dist/browser/widgets/Widget.js.map +1 -1
  159. package/dist/browser/widgets/WidgetHero.js.map +1 -1
  160. package/dist/browser/widgets/WidgetList.js.map +1 -1
  161. package/dist/browser/widgets/WidgetPills.js.map +1 -1
  162. package/dist/browser/widgets/WidgetStat.js.map +1 -1
  163. package/dist/browser/widgets/WidgetStatus.js.map +1 -1
  164. package/dist/ssr/actions/Button.js +16 -6
  165. package/dist/ssr/actions/Button.js.map +1 -1
  166. package/dist/ssr/actions/ContextMenu.js.map +1 -1
  167. package/dist/ssr/actions/CopyButton.js +2 -1
  168. package/dist/ssr/actions/CopyButton.js.map +1 -1
  169. package/dist/ssr/actions/Disclosure.js.map +1 -1
  170. package/dist/ssr/actions/Dropdown.js +7 -6
  171. package/dist/ssr/actions/Dropdown.js.map +1 -1
  172. package/dist/ssr/actions/FilterChip.js +5 -4
  173. package/dist/ssr/actions/FilterChip.js.map +1 -1
  174. package/dist/ssr/actions/RemoveButton.js +1 -0
  175. package/dist/ssr/actions/RemoveButton.js.map +1 -1
  176. package/dist/ssr/actions/SegmentedControl.js.map +1 -1
  177. package/dist/ssr/actions/SplitButton.js +1 -0
  178. package/dist/ssr/actions/SplitButton.js.map +1 -1
  179. package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
  180. package/dist/ssr/actions/Tabs.js.map +1 -1
  181. package/dist/ssr/actions/Toolbar.js.map +1 -1
  182. package/dist/ssr/actions/index.js.map +1 -1
  183. package/dist/ssr/chat/ChatComposer.js +6 -5
  184. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  185. package/dist/ssr/chat/ChatContextPopup.js.map +1 -1
  186. package/dist/ssr/chat/ChatPrimitives.js +6 -5
  187. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  188. package/dist/ssr/chat/ChatRoot.js.map +1 -1
  189. package/dist/ssr/chat/ChatTasks.js +1 -1
  190. package/dist/ssr/chat/ChatTasks.js.map +1 -1
  191. package/dist/ssr/chat/ChatTimeline.js +5 -4
  192. package/dist/ssr/chat/ChatTimeline.js.map +1 -1
  193. package/dist/ssr/chat/chat-behavior.js.map +1 -1
  194. package/dist/ssr/chat/composer-document.js.map +1 -1
  195. package/dist/ssr/chat/index.js.map +1 -1
  196. package/dist/ssr/content/Calendar.js +2 -1
  197. package/dist/ssr/content/Calendar.js.map +1 -1
  198. package/dist/ssr/content/Chart.js.map +1 -1
  199. package/dist/ssr/content/ChartExplorer.js.map +1 -1
  200. package/dist/ssr/content/ChartExplorerControls.js +5 -4
  201. package/dist/ssr/content/ChartExplorerControls.js.map +1 -1
  202. package/dist/ssr/content/ChartFilterControls.js +3 -2
  203. package/dist/ssr/content/ChartFilterControls.js.map +1 -1
  204. package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
  205. package/dist/ssr/content/CodeDisplay.js.map +1 -1
  206. package/dist/ssr/content/DataTable.js +1 -0
  207. package/dist/ssr/content/DataTable.js.map +1 -1
  208. package/dist/ssr/content/Docs.js +1 -0
  209. package/dist/ssr/content/Docs.js.map +1 -1
  210. package/dist/ssr/content/FileBrowser.js +2 -1
  211. package/dist/ssr/content/FileBrowser.js.map +1 -1
  212. package/dist/ssr/content/FileGrid.js.map +1 -1
  213. package/dist/ssr/content/FileTree.js +2 -1
  214. package/dist/ssr/content/FileTree.js.map +1 -1
  215. package/dist/ssr/content/FileView.js +5 -4
  216. package/dist/ssr/content/FileView.js.map +1 -1
  217. package/dist/ssr/content/Lightbox.js +2 -1
  218. package/dist/ssr/content/Lightbox.js.map +1 -1
  219. package/dist/ssr/content/LogEntriesTable.js.map +1 -1
  220. package/dist/ssr/content/MarkdownView.js.map +1 -1
  221. package/dist/ssr/content/Pagination.js +2 -1
  222. package/dist/ssr/content/Pagination.js.map +1 -1
  223. package/dist/ssr/content/PdfPreview.js.map +1 -1
  224. package/dist/ssr/content/RangePicker.js.map +1 -1
  225. package/dist/ssr/content/StructuredDataPreview.js.map +1 -1
  226. package/dist/ssr/content/ZoomPanViewport.js +300 -0
  227. package/dist/ssr/content/ZoomPanViewport.js.map +1 -0
  228. package/dist/ssr/content/calendar-event-layout.js.map +1 -1
  229. package/dist/ssr/content/calendar-pointer.js.map +1 -1
  230. package/dist/ssr/content/chart-cursor.js.map +1 -1
  231. package/dist/ssr/content/chart-explorer.js.map +1 -1
  232. package/dist/ssr/content/chart-inspection.js.map +1 -1
  233. package/dist/ssr/content/chart-line-gaps.js.map +1 -1
  234. package/dist/ssr/content/chart-map-viewport.js.map +1 -1
  235. package/dist/ssr/content/chart-snapshot.js.map +1 -1
  236. package/dist/ssr/content/chart-state-timeline.js.map +1 -1
  237. package/dist/ssr/content/chart-svg.js.map +1 -1
  238. package/dist/ssr/content/code-highlight.js.map +1 -1
  239. package/dist/ssr/content/collection-selection.js.map +1 -1
  240. package/dist/ssr/content/delimited-preferences.js.map +1 -1
  241. package/dist/ssr/content/file-tree.js.map +1 -1
  242. package/dist/ssr/content/file-view-preview.js.map +1 -1
  243. package/dist/ssr/content/index.js +1 -0
  244. package/dist/ssr/content/index.js.map +1 -1
  245. package/dist/ssr/content/zoom-pan.js +54 -0
  246. package/dist/ssr/content/zoom-pan.js.map +1 -0
  247. package/dist/ssr/feedback/InlineGuidance.js.map +1 -1
  248. package/dist/ssr/feedback/Tooltip.js.map +1 -1
  249. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  250. package/dist/ssr/feedback/index.js.map +1 -1
  251. package/dist/ssr/feedback/prompts.js +3 -2
  252. package/dist/ssr/feedback/prompts.js.map +1 -1
  253. package/dist/ssr/feedback/toast.js.map +1 -1
  254. package/dist/ssr/feedback/tooltip-position.js.map +1 -1
  255. package/dist/ssr/inputs/AutocompleteEditor.js +3 -2
  256. package/dist/ssr/inputs/AutocompleteEditor.js.map +1 -1
  257. package/dist/ssr/inputs/AutocompleteSelect.js +5 -4
  258. package/dist/ssr/inputs/AutocompleteSelect.js.map +1 -1
  259. package/dist/ssr/inputs/Checkbox.js +1 -0
  260. package/dist/ssr/inputs/Checkbox.js.map +1 -1
  261. package/dist/ssr/inputs/CheckboxCard.js.map +1 -1
  262. package/dist/ssr/inputs/ChoiceGroups.js.map +1 -1
  263. package/dist/ssr/inputs/ChoiceInputs.js +1 -0
  264. package/dist/ssr/inputs/ChoiceInputs.js.map +1 -1
  265. package/dist/ssr/inputs/Combobox.js +2 -1
  266. package/dist/ssr/inputs/Combobox.js.map +1 -1
  267. package/dist/ssr/inputs/DatePicker.js +4 -3
  268. package/dist/ssr/inputs/DatePicker.js.map +1 -1
  269. package/dist/ssr/inputs/FileInputs.js +2 -1
  270. package/dist/ssr/inputs/FileInputs.js.map +1 -1
  271. package/dist/ssr/inputs/MultiSelectInput.js +4 -3
  272. package/dist/ssr/inputs/MultiSelectInput.js.map +1 -1
  273. package/dist/ssr/inputs/NumberInput.js +2 -1
  274. package/dist/ssr/inputs/NumberInput.js.map +1 -1
  275. package/dist/ssr/inputs/Select.js +4 -3
  276. package/dist/ssr/inputs/Select.js.map +1 -1
  277. package/dist/ssr/inputs/SelectChip.js +3 -2
  278. package/dist/ssr/inputs/SelectChip.js.map +1 -1
  279. package/dist/ssr/inputs/SpecialInputs.js +1 -0
  280. package/dist/ssr/inputs/SpecialInputs.js.map +1 -1
  281. package/dist/ssr/inputs/Switch.js.map +1 -1
  282. package/dist/ssr/inputs/TagEditor.js +3 -2
  283. package/dist/ssr/inputs/TagEditor.js.map +1 -1
  284. package/dist/ssr/inputs/TagsInput.js.map +1 -1
  285. package/dist/ssr/inputs/TemplateEditor.js +1 -0
  286. package/dist/ssr/inputs/TemplateEditor.js.map +1 -1
  287. package/dist/ssr/inputs/TextInput.js +6 -4
  288. package/dist/ssr/inputs/TextInput.js.map +1 -1
  289. package/dist/ssr/inputs/choice.js.map +1 -1
  290. package/dist/ssr/inputs/completion/behaviors.js.map +1 -1
  291. package/dist/ssr/inputs/completion/engine.js.map +1 -1
  292. package/dist/ssr/inputs/completion/index.js.map +1 -1
  293. package/dist/ssr/inputs/completion/overlay.js.map +1 -1
  294. package/dist/ssr/inputs/date-picker.js.map +1 -1
  295. package/dist/ssr/inputs/editor-dom.js.map +1 -1
  296. package/dist/ssr/inputs/field-contract.js.map +1 -1
  297. package/dist/ssr/inputs/icon-options.js.map +1 -1
  298. package/dist/ssr/inputs/image-crop.js.map +1 -1
  299. package/dist/ssr/inputs/index.js.map +1 -1
  300. package/dist/ssr/inputs/markdown/MarkdownEditor.js +3 -2
  301. package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
  302. package/dist/ssr/inputs/markdown/Toolbar.js.map +1 -1
  303. package/dist/ssr/inputs/markdown/actions.js.map +1 -1
  304. package/dist/ssr/inputs/markdown/active-formats.js.map +1 -1
  305. package/dist/ssr/inputs/markdown/behaviors.js.map +1 -1
  306. package/dist/ssr/inputs/markdown/code-zone.js.map +1 -1
  307. package/dist/ssr/internal/color.js.map +1 -1
  308. package/dist/ssr/internal/field.js.map +1 -1
  309. package/dist/ssr/internal/portal.js.map +1 -1
  310. package/dist/ssr/intl/Format.js.map +1 -1
  311. package/dist/ssr/intl/index.js.map +1 -1
  312. package/dist/ssr/intl/locale.js.map +1 -1
  313. package/dist/ssr/intl/messages.js +6 -0
  314. package/dist/ssr/intl/messages.js.map +1 -1
  315. package/dist/ssr/layout/AppOverview.js +2 -1
  316. package/dist/ssr/layout/AppOverview.js.map +1 -1
  317. package/dist/ssr/layout/AppWorkspace.js +7 -6
  318. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  319. package/dist/ssr/layout/BottomSheet.js.map +1 -1
  320. package/dist/ssr/layout/DataPanel.js +1 -0
  321. package/dist/ssr/layout/DataPanel.js.map +1 -1
  322. package/dist/ssr/layout/DetailPanel.js +1 -0
  323. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  324. package/dist/ssr/layout/Discussion.js +3 -2
  325. package/dist/ssr/layout/Discussion.js.map +1 -1
  326. package/dist/ssr/layout/FloatingWindow.js +1 -0
  327. package/dist/ssr/layout/FloatingWindow.js.map +1 -1
  328. package/dist/ssr/layout/Navigation.js +3 -2
  329. package/dist/ssr/layout/Navigation.js.map +1 -1
  330. package/dist/ssr/layout/PanelDialog.js +1 -0
  331. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  332. package/dist/ssr/layout/PanelHeader.js.map +1 -1
  333. package/dist/ssr/layout/Panes.js.map +1 -1
  334. package/dist/ssr/layout/PullToRefresh.js +1 -1
  335. package/dist/ssr/layout/PullToRefresh.js.map +1 -1
  336. package/dist/ssr/layout/ScrollArea.js.map +1 -1
  337. package/dist/ssr/layout/Settings.js +2 -1
  338. package/dist/ssr/layout/Settings.js.map +1 -1
  339. package/dist/ssr/layout/SettingsCollection.js +1 -0
  340. package/dist/ssr/layout/SettingsCollection.js.map +1 -1
  341. package/dist/ssr/layout/SettingsModal.js.map +1 -1
  342. package/dist/ssr/layout/SidebarItemPreview.js.map +1 -1
  343. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  344. package/dist/ssr/layout/app-workspace-state.js.map +1 -1
  345. package/dist/ssr/layout/floating-window-geometry.js.map +1 -1
  346. package/dist/ssr/layout/index.js.map +1 -1
  347. package/dist/ssr/layout/navigation-model.js.map +1 -1
  348. package/dist/ssr/layout/panes-layout.js.map +1 -1
  349. package/dist/ssr/layout/scroll-fade.js.map +1 -1
  350. package/dist/ssr/layout/stable-id.js.map +1 -1
  351. package/dist/ssr/surfaces/Avatar.js +2 -1
  352. package/dist/ssr/surfaces/Avatar.js.map +1 -1
  353. package/dist/ssr/surfaces/DescriptionList.js.map +1 -1
  354. package/dist/ssr/surfaces/LinkCard.js.map +1 -1
  355. package/dist/ssr/surfaces/NotFoundState.js.map +1 -1
  356. package/dist/ssr/surfaces/NoticeCard.js.map +1 -1
  357. package/dist/ssr/surfaces/Paper.js +2 -1
  358. package/dist/ssr/surfaces/Paper.js.map +1 -1
  359. package/dist/ssr/surfaces/Placeholder.js +2 -1
  360. package/dist/ssr/surfaces/Placeholder.js.map +1 -1
  361. package/dist/ssr/surfaces/ProgressBar.js.map +1 -1
  362. package/dist/ssr/surfaces/StatCell.js +2 -1
  363. package/dist/ssr/surfaces/StatCell.js.map +1 -1
  364. package/dist/ssr/surfaces/StatGrid.js +1 -0
  365. package/dist/ssr/surfaces/StatGrid.js.map +1 -1
  366. package/dist/ssr/surfaces/StatusBadge.js.map +1 -1
  367. package/dist/ssr/surfaces/Tag.js.map +1 -1
  368. package/dist/ssr/surfaces/index.js.map +1 -1
  369. package/dist/ssr/widgets/Widget.js +1 -0
  370. package/dist/ssr/widgets/Widget.js.map +1 -1
  371. package/dist/ssr/widgets/WidgetHero.js.map +1 -1
  372. package/dist/ssr/widgets/WidgetList.js.map +1 -1
  373. package/dist/ssr/widgets/WidgetPills.js.map +1 -1
  374. package/dist/ssr/widgets/WidgetStat.js +1 -0
  375. package/dist/ssr/widgets/WidgetStat.js.map +1 -1
  376. package/dist/ssr/widgets/WidgetStatus.js.map +1 -1
  377. package/dist/styles.css +1 -1
  378. package/dist/types/actions/Button.d.ts +5 -0
  379. package/dist/types/actions/SplitButton.d.ts +1 -1
  380. package/dist/types/actions/SpotlightSearch.d.ts +1 -1
  381. package/dist/types/actions/index.d.ts +1 -1
  382. package/dist/types/content/ZoomPanViewport.d.ts +33 -0
  383. package/dist/types/content/index.d.ts +2 -0
  384. package/dist/types/content/zoom-pan.d.ts +29 -0
  385. package/dist/types/feedback/prompts.d.ts +4 -3
  386. package/dist/types/intl/messages.d.ts +3 -0
  387. package/package.json +9 -10
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["content/ZoomPanViewport.tsx"],"sourcesContent":["import { createSignal, For, type JSX, onCleanup, onMount, Show } from \"solid-js\";\nimport { Button } from \"../actions/Button\";\nimport { dialogCore } from \"../feedback/dialog-core\";\nimport { DialogHeader } from \"../feedback/prompts\";\nimport { LocaleProvider, useLocale } from \"../intl/locale\";\nimport { useUiMessages } from \"../intl/messages\";\nimport {\n clampZoomPan,\n panZoomPan,\n ZOOM_PAN_FIT,\n ZOOM_PAN_STEP,\n type ZoomPanGeometry,\n type ZoomPanTransform,\n zoomZoomPanAt,\n} from \"./zoom-pan\";\n\nexport type ZoomPanAction = {\n label: string;\n icon?: string;\n /** Runs the action; the button shows a pending state until a returned promise settles. Handle failures here. */\n onSelect: () => void | Promise<void>;\n};\n\nexport type ZoomPanFullscreen = {\n /** Heading and accessible name of the fullscreen dialog. */\n title: string;\n /** Renders a fresh copy of the content for the dialog. Called once per opening. */\n content: () => JSX.Element;\n /** Actions shown in the fullscreen dialog, for example exports. */\n actions?: readonly ZoomPanAction[];\n};\n\nexport type ZoomPanViewportProps = {\n /** Accessible name of the focusable viewport. */\n label: string;\n /** The zoomable content. Its first element is measured to keep it on screen. */\n children: JSX.Element;\n /** Enables the fullscreen control and the `F` shortcut. */\n fullscreen?: ZoomPanFullscreen;\n /** `hover` reveals the controls on hover, on focus, and while zoomed in. Touch screens always show them. */\n controls?: \"visible\" | \"hover\";\n class?: string;\n style?: JSX.CSSProperties;\n};\n\nconst PAN_KEY_STEP = 48;\nconst DRAG_THRESHOLD = 4;\nconst PAN_KEYS: Record<string, readonly [number, number]> = {\n ArrowLeft: [PAN_KEY_STEP, 0],\n ArrowRight: [-PAN_KEY_STEP, 0],\n ArrowUp: [0, PAN_KEY_STEP],\n ArrowDown: [0, -PAN_KEY_STEP],\n};\n\n/** Current screen transform of the stage, including a running CSS transition. */\nconst renderedTransform = (stage: HTMLElement, fallback: ZoomPanTransform): ZoomPanTransform => {\n const match = /^matrix\\(([^)]+)\\)$/.exec(getComputedStyle(stage).transform ?? \"\");\n const values = match?.[1]?.split(\",\").map(Number);\n if (!values || values.length !== 6 || values.some((value) => !Number.isFinite(value)) || !values[0]) return fallback;\n return { scale: values[0], x: values[4] ?? 0, y: values[5] ?? 0 };\n};\n\nconst ActionButton = (props: { action: ZoomPanAction }): JSX.Element => {\n const [pending, setPending] = createSignal(false);\n const run = async () => {\n if (pending()) return;\n setPending(true);\n try {\n await props.action.onSelect();\n } catch (error) {\n console.error(\"Zoom-pan action failed\", error);\n } finally {\n setPending(false);\n }\n };\n return (\n <Button variant=\"secondary\" loading={pending()} onClick={() => void run()}>\n <Show when={props.action.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>\n {props.action.label}\n </Button>\n );\n};\n\n/**\n * Makes any content zoomable (fit to 8×) and pannable with buttons, Ctrl/Cmd +\n * wheel, pinch, drag, and keys. It applies a CSS transform, so vector content\n * stays crisp and is never re-rendered. The view always starts at fit.\n */\nexport function ZoomPanViewport(props: ZoomPanViewportProps): JSX.Element {\n const messages = useUiMessages();\n const locale = useLocale();\n const [transform, setTransform] = createSignal<ZoomPanTransform>(ZOOM_PAN_FIT);\n const [smooth, setSmooth] = createSignal(false);\n const [dragging, setDragging] = createSignal(false);\n let root: HTMLDivElement | undefined;\n let stage: HTMLDivElement | undefined;\n const pointers = new Map<number, { x: number; y: number }>();\n let drag: { id: number; x: number; y: number; origin: ZoomPanTransform; moved: boolean } | undefined;\n let pinch: { distance: number; center: { x: number; y: number }; origin: ZoomPanTransform } | undefined;\n let suppressClick = false;\n\n const zoomed = () => transform().scale > 1;\n\n const geometry = (): ZoomPanGeometry => {\n const rect = root?.getBoundingClientRect();\n const width = rect?.width ?? 0;\n const height = rect?.height ?? 0;\n const content = stage?.firstElementChild?.getBoundingClientRect();\n if (!rect || !stage || !content || content.width <= 0 || content.height <= 0) {\n return { width, height, content: { left: 0, top: 0, width, height } };\n }\n const current = renderedTransform(stage, transform());\n return {\n width,\n height,\n content: {\n left: (content.left - rect.left - current.x) / current.scale,\n top: (content.top - rect.top - current.y) / current.scale,\n width: content.width / current.scale,\n height: content.height / current.scale,\n },\n };\n };\n\n const apply = (next: ZoomPanTransform, animate: boolean) => {\n setSmooth(animate);\n setTransform(next);\n };\n\n const local = (event: { clientX: number; clientY: number }) => {\n const rect = root?.getBoundingClientRect();\n return { x: event.clientX - (rect?.left ?? 0), y: event.clientY - (rect?.top ?? 0) };\n };\n\n const zoomBy = (factor: number, point?: { x: number; y: number }, animate = true) => {\n const box = geometry();\n const current = transform();\n apply(zoomZoomPanAt(current, current.scale * factor, point ?? { x: box.width / 2, y: box.height / 2 }, box), animate);\n };\n\n const reset = () => apply(ZOOM_PAN_FIT, true);\n\n const openFullscreen = () => {\n const fullscreen = props.fullscreen;\n if (!fullscreen) return;\n const currentLocale = locale();\n void dialogCore.open<void>(\n (close) => (\n <LocaleProvider locale={currentLocale}>\n <div class=\"k2b-dialog__panel k2b-dialog__stack\">\n <DialogHeader title={fullscreen.title} close={() => close()} />\n <div class=\"k2b-zoom-pan-dialog\">\n <ZoomPanViewport label={props.label}>{fullscreen.content()}</ZoomPanViewport>\n <Show when={fullscreen.actions?.length}>\n <footer class=\"k2b-dialog__actions\">\n <For each={fullscreen.actions}>{(action) => <ActionButton action={action} />}</For>\n </footer>\n </Show>\n </div>\n </div>\n </LocaleProvider>\n ),\n {\n panelClassName: \"k2b-dialog k2b-dialog--full\",\n ariaLabel: fullscreen.title,\n initialFocus: (dialog) => dialog.querySelector<HTMLElement>(\".k2b-zoom-pan\"),\n },\n );\n };\n\n const handleKeyDown: JSX.EventHandler<HTMLDivElement, KeyboardEvent> = (event) => {\n if (event.target !== root || event.ctrlKey || event.metaKey || event.altKey) return;\n const key = event.key;\n if (key === \"+\" || key === \"=\") zoomBy(ZOOM_PAN_STEP);\n else if (key === \"-\" || key === \"_\") zoomBy(1 / ZOOM_PAN_STEP);\n else if (key === \"0\") reset();\n else if ((key === \"f\" || key === \"F\") && props.fullscreen) openFullscreen();\n else {\n const delta = PAN_KEYS[key];\n // At fit the arrow keys keep scrolling the page.\n if (!delta || !zoomed()) return;\n apply(panZoomPan(transform(), delta[0], delta[1], geometry()), true);\n }\n event.preventDefault();\n };\n\n // Plain wheel keeps scrolling the page; Ctrl/Cmd + wheel (and trackpad pinch) zooms toward the pointer.\n const handleWheel: JSX.EventHandler<HTMLDivElement, WheelEvent> = (event) => {\n if (!event.ctrlKey && !event.metaKey) return;\n event.preventDefault();\n const lines = event.deltaMode === 1 ? 16 : event.deltaMode === 2 ? 400 : 1;\n const delta = Math.max(-50, Math.min(50, event.deltaY * lines));\n zoomBy(Math.exp(-delta / 100), local(event), false);\n };\n\n const handlePointerDown: JSX.EventHandler<HTMLDivElement, PointerEvent> = (event) => {\n if (event.button !== 0 || (event.target as Element).closest(\"button, a, input, select, textarea\")) return;\n pointers.set(event.pointerId, local(event));\n if (pointers.size === 2) {\n const [first, second] = [...pointers.values()] as [{ x: number; y: number }, { x: number; y: number }];\n pinch = {\n distance: Math.max(1, Math.hypot(second.x - first.x, second.y - first.y)),\n center: { x: (first.x + second.x) / 2, y: (first.y + second.y) / 2 },\n origin: transform(),\n };\n drag = undefined;\n } else if (pointers.size === 1 && zoomed()) {\n // Panning starts only above fit, so clicks and text selection keep working at fit.\n drag = { id: event.pointerId, x: event.clientX, y: event.clientY, origin: transform(), moved: false };\n } else return;\n try {\n event.currentTarget.setPointerCapture(event.pointerId);\n } catch {\n // A synthetic or already released pointer cannot be captured; moves still arrive while inside.\n }\n };\n\n const handlePointerMove: JSX.EventHandler<HTMLDivElement, PointerEvent> = (event) => {\n if (!pointers.has(event.pointerId)) return;\n pointers.set(event.pointerId, local(event));\n if (pinch && pointers.size >= 2) {\n const [first, second] = [...pointers.values()] as [{ x: number; y: number }, { x: number; y: number }];\n const distance = Math.hypot(second.x - first.x, second.y - first.y);\n const center = { x: (first.x + second.x) / 2, y: (first.y + second.y) / 2 };\n const box = geometry();\n const scaled = zoomZoomPanAt(pinch.origin, pinch.origin.scale * (distance / pinch.distance), pinch.center, box);\n apply(panZoomPan(scaled, center.x - pinch.center.x, center.y - pinch.center.y, box), false);\n return;\n }\n if (drag?.id !== event.pointerId) return;\n const dx = event.clientX - drag.x;\n const dy = event.clientY - drag.y;\n if (!drag.moved && Math.hypot(dx, dy) < DRAG_THRESHOLD) return;\n drag.moved = true;\n setDragging(true);\n apply(panZoomPan(drag.origin, dx, dy, geometry()), false);\n };\n\n const handlePointerEnd: JSX.EventHandler<HTMLDivElement, PointerEvent> = (event) => {\n pointers.delete(event.pointerId);\n if (pointers.size < 2) pinch = undefined;\n if (drag?.id !== event.pointerId) return;\n if (drag.moved) {\n // The click that follows this pointerup (if the browser sends one) comes in the same task.\n suppressClick = true;\n setTimeout(() => {\n suppressClick = false;\n });\n }\n drag = undefined;\n setDragging(false);\n };\n\n onMount(() => {\n const element = root;\n if (!element) return;\n // A drag must not also count as a click on the content or its owner.\n const click = (event: MouseEvent) => {\n if (!suppressClick) return;\n suppressClick = false;\n event.preventDefault();\n event.stopPropagation();\n };\n // Keep a two-finger gesture for pinch zoom instead of page panning.\n const touchMove = (event: TouchEvent) => {\n if (event.touches.length > 1) event.preventDefault();\n };\n element.addEventListener(\"click\", click, true);\n element.addEventListener(\"touchmove\", touchMove, { passive: false });\n const observer =\n typeof ResizeObserver === \"undefined\" ? undefined : new ResizeObserver(() => apply(clampZoomPan(transform(), geometry()), false));\n observer?.observe(element);\n onCleanup(() => {\n element.removeEventListener(\"click\", click, true);\n element.removeEventListener(\"touchmove\", touchMove);\n observer?.disconnect();\n });\n });\n\n const control = (label: string, shortcut: string, icon: string, action: () => void) => (\n <button\n type=\"button\"\n class=\"k2b-button k2b-icon-button\"\n data-variant=\"secondary\"\n aria-label={label}\n title={`${label} (${shortcut})`}\n onClick={action}\n >\n <i class={`ti ${icon}`} aria-hidden=\"true\" />\n </button>\n );\n\n return (\n <div\n ref={root}\n class={`k2b-zoom-pan ${props.class ?? \"\"}`}\n style={props.style}\n role=\"group\"\n aria-label={props.label}\n aria-description={messages().zoomPanKeys}\n tabIndex={0}\n data-controls={props.controls ?? \"visible\"}\n data-zoomed={zoomed() ? \"true\" : undefined}\n data-dragging={dragging() ? \"true\" : undefined}\n onKeyDown={handleKeyDown}\n onWheel={handleWheel}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerEnd}\n onPointerCancel={handlePointerEnd}\n >\n <div\n ref={stage}\n class=\"k2b-zoom-pan__stage\"\n data-smooth={smooth() ? \"true\" : undefined}\n style={{ transform: `translate(${transform().x}px, ${transform().y}px) scale(${transform().scale})` }}\n >\n {props.children}\n </div>\n <div class=\"k2b-zoom-pan__controls\">\n {control(messages().zoomIn, \"+\", \"ti-plus\", () => zoomBy(ZOOM_PAN_STEP))}\n {control(messages().zoomOut, \"-\", \"ti-minus\", () => zoomBy(1 / ZOOM_PAN_STEP))}\n {control(messages().resetZoom, \"0\", \"ti-focus-centered\", reset)}\n <Show when={props.fullscreen}>{control(messages().openFullscreen, \"F\", \"ti-maximize\", openFullscreen)}</Show>\n </div>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["heapPush","heap","value","before","push","index","length","parent","Math","floor","heapPop","first","last","pop","undefined","left","right","next","layoutGroup","group","groupId","active","freeLanes","assigned","laneCount","entry","end","start","released","lane","item","groupStart","groupEnd","reduce","latest","max","map","lanes","layoutCalendarIntervals","items","bounds","sorted","interval","sort","groups","Number","NEGATIVE_INFINITY","flatMap","entries"],"sources":["content/calendar-event-layout.ts"],"sourcesContent":["export type CalendarIntervalLayout<T> = {\n item: T;\n lane: number;\n lanes: number;\n groupId: number;\n groupStart: number;\n groupEnd: number;\n};\n\ntype BoundedItem<T> = {\n item: T;\n start: number;\n end: number;\n};\n\ntype ActiveLane = {\n end: number;\n lane: number;\n};\n\nconst heapPush = <T>(heap: T[], value: T, before: (left: T, right: T) => boolean): void => {\n heap.push(value);\n let index = heap.length - 1;\n while (index > 0) {\n const parent = Math.floor((index - 1) / 2);\n if (!before(heap[index]!, heap[parent]!)) break;\n [heap[parent], heap[index]] = [heap[index]!, heap[parent]!];\n index = parent;\n }\n};\n\nconst heapPop = <T>(heap: T[], before: (left: T, right: T) => boolean): T | undefined => {\n const first = heap[0];\n const last = heap.pop();\n if (heap.length === 0 || last === undefined) return first;\n heap[0] = last;\n let index = 0;\n while (true) {\n const left = index * 2 + 1;\n const right = left + 1;\n let next = index;\n if (left < heap.length && before(heap[left]!, heap[next]!)) next = left;\n if (right < heap.length && before(heap[right]!, heap[next]!)) next = right;\n if (next === index) return first;\n [heap[index], heap[next]] = [heap[next]!, heap[index]!];\n index = next;\n }\n};\n\nconst layoutGroup = <T>(group: readonly BoundedItem<T>[], groupId: number): CalendarIntervalLayout<T>[] => {\n const active: ActiveLane[] = [];\n const freeLanes: number[] = [];\n const assigned: Array<{ item: T; lane: number }> = [];\n let laneCount = 0;\n\n for (const entry of group) {\n while (active[0] && active[0].end <= entry.start) {\n const released = heapPop(active, (left, right) => left.end < right.end || (left.end === right.end && left.lane < right.lane));\n if (released) heapPush(freeLanes, released.lane, (left, right) => left < right);\n }\n const lane = heapPop(freeLanes, (left, right) => left < right) ?? laneCount++;\n heapPush(active, { end: entry.end, lane }, (left, right) => left.end < right.end || (left.end === right.end && left.lane < right.lane));\n assigned.push({ item: entry.item, lane });\n }\n\n const groupStart = group[0]?.start ?? 0;\n const groupEnd = group.reduce((latest, entry) => Math.max(latest, entry.end), groupStart);\n return assigned.map(({ item, lane }) => ({ item, lane, lanes: Math.max(1, laneCount), groupId, groupStart, groupEnd }));\n};\n\n/**\n * Assigns the lowest available visual lane to overlapping intervals.\n * Sorting plus two binary heaps keeps large overlap groups at O(n log n).\n */\nexport const layoutCalendarIntervals = <T>(\n items: readonly T[],\n bounds: (item: T) => { start: number; end: number },\n): CalendarIntervalLayout<T>[] => {\n const sorted = items\n .map((item) => {\n const interval = bounds(item);\n return { item, start: interval.start, end: Math.max(interval.start, interval.end) };\n })\n .sort((left, right) => left.start - right.start || right.end - left.end);\n const groups: Array<Array<BoundedItem<T>>> = [];\n let group: Array<BoundedItem<T>> = [];\n let groupEnd = Number.NEGATIVE_INFINITY;\n\n for (const entry of sorted) {\n if (group.length === 0 || entry.start < groupEnd) {\n group.push(entry);\n groupEnd = Math.max(groupEnd, entry.end);\n continue;\n }\n groups.push(group);\n group = [entry];\n groupEnd = entry.end;\n }\n if (group.length > 0) groups.push(group);\n\n return groups.flatMap((entries, groupId) => layoutGroup(entries, groupId));\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["content/calendar-event-layout.ts"],"sourcesContent":["export type CalendarIntervalLayout<T> = {\n item: T;\n lane: number;\n lanes: number;\n groupId: number;\n groupStart: number;\n groupEnd: number;\n};\n\ntype BoundedItem<T> = {\n item: T;\n start: number;\n end: number;\n};\n\ntype ActiveLane = {\n end: number;\n lane: number;\n};\n\nconst heapPush = <T>(heap: T[], value: T, before: (left: T, right: T) => boolean): void => {\n heap.push(value);\n let index = heap.length - 1;\n while (index > 0) {\n const parent = Math.floor((index - 1) / 2);\n if (!before(heap[index]!, heap[parent]!)) break;\n [heap[parent], heap[index]] = [heap[index]!, heap[parent]!];\n index = parent;\n }\n};\n\nconst heapPop = <T>(heap: T[], before: (left: T, right: T) => boolean): T | undefined => {\n const first = heap[0];\n const last = heap.pop();\n if (heap.length === 0 || last === undefined) return first;\n heap[0] = last;\n let index = 0;\n while (true) {\n const left = index * 2 + 1;\n const right = left + 1;\n let next = index;\n if (left < heap.length && before(heap[left]!, heap[next]!)) next = left;\n if (right < heap.length && before(heap[right]!, heap[next]!)) next = right;\n if (next === index) return first;\n [heap[index], heap[next]] = [heap[next]!, heap[index]!];\n index = next;\n }\n};\n\nconst layoutGroup = <T>(group: readonly BoundedItem<T>[], groupId: number): CalendarIntervalLayout<T>[] => {\n const active: ActiveLane[] = [];\n const freeLanes: number[] = [];\n const assigned: Array<{ item: T; lane: number }> = [];\n let laneCount = 0;\n\n for (const entry of group) {\n while (active[0] && active[0].end <= entry.start) {\n const released = heapPop(active, (left, right) => left.end < right.end || (left.end === right.end && left.lane < right.lane));\n if (released) heapPush(freeLanes, released.lane, (left, right) => left < right);\n }\n const lane = heapPop(freeLanes, (left, right) => left < right) ?? laneCount++;\n heapPush(active, { end: entry.end, lane }, (left, right) => left.end < right.end || (left.end === right.end && left.lane < right.lane));\n assigned.push({ item: entry.item, lane });\n }\n\n const groupStart = group[0]?.start ?? 0;\n const groupEnd = group.reduce((latest, entry) => Math.max(latest, entry.end), groupStart);\n return assigned.map(({ item, lane }) => ({ item, lane, lanes: Math.max(1, laneCount), groupId, groupStart, groupEnd }));\n};\n\n/**\n * Assigns the lowest available visual lane to overlapping intervals.\n * Sorting plus two binary heaps keeps large overlap groups at O(n log n).\n */\nexport const layoutCalendarIntervals = <T>(\n items: readonly T[],\n bounds: (item: T) => { start: number; end: number },\n): CalendarIntervalLayout<T>[] => {\n const sorted = items\n .map((item) => {\n const interval = bounds(item);\n return { item, start: interval.start, end: Math.max(interval.start, interval.end) };\n })\n .sort((left, right) => left.start - right.start || right.end - left.end);\n const groups: Array<Array<BoundedItem<T>>> = [];\n let group: Array<BoundedItem<T>> = [];\n let groupEnd = Number.NEGATIVE_INFINITY;\n\n for (const entry of sorted) {\n if (group.length === 0 || entry.start < groupEnd) {\n group.push(entry);\n groupEnd = Math.max(groupEnd, entry.end);\n continue;\n }\n groups.push(group);\n group = [entry];\n groupEnd = entry.end;\n }\n if (group.length > 0) groups.push(group);\n\n return groups.flatMap((entries, groupId) => layoutGroup(entries, groupId));\n};\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["CALENDAR_SNAP_MINUTES","snapCalendarMinutes","minutes","step","Math","round","calendarDayIndexAtPoint","clientX","startX","width","days","min","floor","calendarMinuteAtPoint","clientY","top","height","startHour","endHour","totalMinutes","max","ratio","calendarAutoScrollSpeed","bottom","edge","maximum","ceil","cancelActiveSession","startCalendarPointerSession","options","event","button","isPrimary","pointerId","target","currentTarget","HTMLElement","startY","threshold","previousUserSelect","document","body","style","userSelect","active","finished","latest","scrollFrame","preview","value","resolve","onPreview","autoScroll","scrollContainer","rect","getBoundingClientRect","speed","before","scrollTop","requestAnimationFrame","cleanup","cancelAnimationFrame","window","removeEventListener","onMove","onUp","cancel","onKeyDown","hasPointerCapture","releasePointerCapture","activate","setPointerCapture","onActivate","onCancel","hypot","preventDefault","onCommit","key","addEventListener","passive"],"sources":["content/calendar-pointer.ts"],"sourcesContent":["export const CALENDAR_SNAP_MINUTES = 15;\n\nexport const snapCalendarMinutes = (minutes: number, step = CALENDAR_SNAP_MINUTES): number => Math.round(minutes / step) * step;\n\nexport const calendarDayIndexAtPoint = (clientX: number, startX: number, width: number, days: number): number | null => {\n if (days <= 0 || width <= 0 || clientX < startX || clientX >= startX + width) return null;\n return Math.min(days - 1, Math.floor(((clientX - startX) / width) * days));\n};\n\nexport const calendarMinuteAtPoint = (clientY: number, top: number, height: number, startHour: number, endHour: number): number => {\n const totalMinutes = Math.max(60, (endHour - startHour + 1) * 60);\n const ratio = height > 0 ? Math.min(1, Math.max(0, (clientY - top) / height)) : 0;\n return snapCalendarMinutes(startHour * 60 + ratio * totalMinutes);\n};\n\nexport const calendarAutoScrollSpeed = (clientY: number, top: number, bottom: number, edge = 56, maximum = 18): number => {\n if (clientY < top + edge) return -Math.ceil(maximum * Math.min(1, (top + edge - clientY) / edge));\n if (clientY > bottom - edge) return Math.ceil(maximum * Math.min(1, (clientY - (bottom - edge)) / edge));\n return 0;\n};\n\ntype CalendarPointerSessionOptions<T> = {\n event: PointerEvent;\n resolve: (clientX: number, clientY: number) => T | null;\n onActivate?: () => void;\n onPreview: (value: T) => void;\n onCommit: (value: T) => void;\n onCancel?: () => void;\n scrollContainer?: HTMLElement;\n threshold?: number;\n};\n\nlet cancelActiveSession: (() => void) | null = null;\n\n/**\n * Owns one pointer gesture from threshold crossing through commit or cancel.\n * Views provide geometry through `resolve`; this helper owns global cleanup,\n * pointer cancellation, Escape handling, and edge auto-scroll.\n */\nexport const startCalendarPointerSession = <T>(options: CalendarPointerSessionOptions<T>): (() => void) => {\n if (options.event.button !== 0 || !options.event.isPrimary) return () => {};\n\n cancelActiveSession?.();\n\n const pointerId = options.event.pointerId;\n const target = options.event.currentTarget instanceof HTMLElement ? options.event.currentTarget : null;\n const startX = options.event.clientX;\n const startY = options.event.clientY;\n // Leave enough room for normal click jitter before an event becomes a drag.\n const threshold = options.threshold ?? 6;\n const previousUserSelect = document.body.style.userSelect;\n let clientX = startX;\n let clientY = startY;\n let active = false;\n let finished = false;\n let latest: T | null = null;\n let scrollFrame = 0;\n\n const preview = () => {\n const value = options.resolve(clientX, clientY);\n if (value === null) return;\n latest = value;\n options.onPreview(value);\n };\n\n const autoScroll = () => {\n scrollFrame = 0;\n if (!active || !options.scrollContainer) return;\n const rect = options.scrollContainer.getBoundingClientRect();\n const speed = calendarAutoScrollSpeed(clientY, rect.top, rect.bottom);\n if (speed !== 0) {\n const before = options.scrollContainer.scrollTop;\n options.scrollContainer.scrollTop += speed;\n if (options.scrollContainer.scrollTop !== before) preview();\n }\n scrollFrame = requestAnimationFrame(autoScroll);\n };\n\n const cleanup = () => {\n if (scrollFrame) cancelAnimationFrame(scrollFrame);\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n window.removeEventListener(\"pointercancel\", cancel);\n window.removeEventListener(\"blur\", cancel);\n window.removeEventListener(\"keydown\", onKeyDown);\n if (target?.hasPointerCapture?.(pointerId)) target.releasePointerCapture(pointerId);\n document.body.style.userSelect = previousUserSelect;\n if (cancelActiveSession === cancel) cancelActiveSession = null;\n };\n\n const activate = () => {\n if (active) return;\n active = true;\n document.body.style.userSelect = \"none\";\n target?.setPointerCapture?.(pointerId);\n options.onActivate?.();\n preview();\n if (options.scrollContainer) scrollFrame = requestAnimationFrame(autoScroll);\n };\n\n function cancel() {\n if (finished) return;\n finished = true;\n cleanup();\n if (active) options.onCancel?.();\n }\n\n function onMove(event: PointerEvent) {\n if (finished || event.pointerId !== pointerId) return;\n clientX = event.clientX;\n clientY = event.clientY;\n if (!active && Math.hypot(clientX - startX, clientY - startY) >= threshold) activate();\n if (!active) return;\n event.preventDefault();\n preview();\n }\n\n function onUp(event: PointerEvent) {\n if (finished || event.pointerId !== pointerId) return;\n finished = true;\n cleanup();\n if (active && latest !== null) options.onCommit(latest);\n else if (active) options.onCancel?.();\n }\n\n function onKeyDown(event: KeyboardEvent) {\n if (event.key !== \"Escape\") return;\n event.preventDefault();\n cancel();\n }\n\n window.addEventListener(\"pointermove\", onMove, { passive: false });\n window.addEventListener(\"pointerup\", onUp);\n window.addEventListener(\"pointercancel\", cancel);\n window.addEventListener(\"blur\", cancel);\n window.addEventListener(\"keydown\", onKeyDown);\n cancelActiveSession = cancel;\n return cancel;\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["content/calendar-pointer.ts"],"sourcesContent":["export const CALENDAR_SNAP_MINUTES = 15;\n\nexport const snapCalendarMinutes = (minutes: number, step = CALENDAR_SNAP_MINUTES): number => Math.round(minutes / step) * step;\n\nexport const calendarDayIndexAtPoint = (clientX: number, startX: number, width: number, days: number): number | null => {\n if (days <= 0 || width <= 0 || clientX < startX || clientX >= startX + width) return null;\n return Math.min(days - 1, Math.floor(((clientX - startX) / width) * days));\n};\n\nexport const calendarMinuteAtPoint = (clientY: number, top: number, height: number, startHour: number, endHour: number): number => {\n const totalMinutes = Math.max(60, (endHour - startHour + 1) * 60);\n const ratio = height > 0 ? Math.min(1, Math.max(0, (clientY - top) / height)) : 0;\n return snapCalendarMinutes(startHour * 60 + ratio * totalMinutes);\n};\n\nexport const calendarAutoScrollSpeed = (clientY: number, top: number, bottom: number, edge = 56, maximum = 18): number => {\n if (clientY < top + edge) return -Math.ceil(maximum * Math.min(1, (top + edge - clientY) / edge));\n if (clientY > bottom - edge) return Math.ceil(maximum * Math.min(1, (clientY - (bottom - edge)) / edge));\n return 0;\n};\n\ntype CalendarPointerSessionOptions<T> = {\n event: PointerEvent;\n resolve: (clientX: number, clientY: number) => T | null;\n onActivate?: () => void;\n onPreview: (value: T) => void;\n onCommit: (value: T) => void;\n onCancel?: () => void;\n scrollContainer?: HTMLElement;\n threshold?: number;\n};\n\nlet cancelActiveSession: (() => void) | null = null;\n\n/**\n * Owns one pointer gesture from threshold crossing through commit or cancel.\n * Views provide geometry through `resolve`; this helper owns global cleanup,\n * pointer cancellation, Escape handling, and edge auto-scroll.\n */\nexport const startCalendarPointerSession = <T>(options: CalendarPointerSessionOptions<T>): (() => void) => {\n if (options.event.button !== 0 || !options.event.isPrimary) return () => {};\n\n cancelActiveSession?.();\n\n const pointerId = options.event.pointerId;\n const target = options.event.currentTarget instanceof HTMLElement ? options.event.currentTarget : null;\n const startX = options.event.clientX;\n const startY = options.event.clientY;\n // Leave enough room for normal click jitter before an event becomes a drag.\n const threshold = options.threshold ?? 6;\n const previousUserSelect = document.body.style.userSelect;\n let clientX = startX;\n let clientY = startY;\n let active = false;\n let finished = false;\n let latest: T | null = null;\n let scrollFrame = 0;\n\n const preview = () => {\n const value = options.resolve(clientX, clientY);\n if (value === null) return;\n latest = value;\n options.onPreview(value);\n };\n\n const autoScroll = () => {\n scrollFrame = 0;\n if (!active || !options.scrollContainer) return;\n const rect = options.scrollContainer.getBoundingClientRect();\n const speed = calendarAutoScrollSpeed(clientY, rect.top, rect.bottom);\n if (speed !== 0) {\n const before = options.scrollContainer.scrollTop;\n options.scrollContainer.scrollTop += speed;\n if (options.scrollContainer.scrollTop !== before) preview();\n }\n scrollFrame = requestAnimationFrame(autoScroll);\n };\n\n const cleanup = () => {\n if (scrollFrame) cancelAnimationFrame(scrollFrame);\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n window.removeEventListener(\"pointercancel\", cancel);\n window.removeEventListener(\"blur\", cancel);\n window.removeEventListener(\"keydown\", onKeyDown);\n if (target?.hasPointerCapture?.(pointerId)) target.releasePointerCapture(pointerId);\n document.body.style.userSelect = previousUserSelect;\n if (cancelActiveSession === cancel) cancelActiveSession = null;\n };\n\n const activate = () => {\n if (active) return;\n active = true;\n document.body.style.userSelect = \"none\";\n target?.setPointerCapture?.(pointerId);\n options.onActivate?.();\n preview();\n if (options.scrollContainer) scrollFrame = requestAnimationFrame(autoScroll);\n };\n\n function cancel() {\n if (finished) return;\n finished = true;\n cleanup();\n if (active) options.onCancel?.();\n }\n\n function onMove(event: PointerEvent) {\n if (finished || event.pointerId !== pointerId) return;\n clientX = event.clientX;\n clientY = event.clientY;\n if (!active && Math.hypot(clientX - startX, clientY - startY) >= threshold) activate();\n if (!active) return;\n event.preventDefault();\n preview();\n }\n\n function onUp(event: PointerEvent) {\n if (finished || event.pointerId !== pointerId) return;\n finished = true;\n cleanup();\n if (active && latest !== null) options.onCommit(latest);\n else if (active) options.onCancel?.();\n }\n\n function onKeyDown(event: KeyboardEvent) {\n if (event.key !== \"Escape\") return;\n event.preventDefault();\n cancel();\n }\n\n window.addEventListener(\"pointermove\", onMove, { passive: false });\n window.addEventListener(\"pointerup\", onUp);\n window.addEventListener(\"pointercancel\", cancel);\n window.addEventListener(\"blur\", cancel);\n window.addEventListener(\"keydown\", onKeyDown);\n cancelActiveSession = cancel;\n return cancel;\n};\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["createChartCursor","options","state","listeners","Set","notify","listener","formatX","read","subscribe","add","delete","move","source","x","Number","isFinite","clear"],"sources":["content/chart-cursor.ts"],"sourcesContent":["export type ChartCursorState = { source: symbol; x: number } | null;\n\n/** Share one numeric X value between line charts. Create one instance per group. */\nexport function createChartCursor(options: { formatX?: (x: number) => string } = {}) {\n let state: ChartCursorState = null;\n const listeners = new Set<(state: ChartCursorState) => void>();\n const notify = () => {\n for (const listener of listeners) listener(state);\n };\n return {\n formatX: options.formatX,\n read: () => state,\n subscribe(listener: (state: ChartCursorState) => void) {\n listeners.add(listener);\n listener(state);\n return () => {\n listeners.delete(listener);\n };\n },\n move(source: symbol, x: number) {\n if (!Number.isFinite(x) || (state?.source === source && state.x === x)) return;\n state = { source, x };\n notify();\n },\n clear(source: symbol) {\n if (state?.source !== source) return;\n state = null;\n notify();\n },\n };\n}\nexport type ChartCursor = ReturnType<typeof createChartCursor>;\n"],"mappings":"AAEA;AACA,OAAO,SAASA,iBAAiBA,CAACC,OAA4C,GAAG,CAAC,CAAC,EAAE;EACnF,IAAIC,KAAuB,GAAG,IAAI;EAClC,MAAMC,SAAS,GAAG,IAAIC,GAAG,CAAoC,CAAC;EAC9D,MAAMC,MAAM,GAAGA,CAAA,KAAM;IACnB,KAAK,MAAMC,QAAQ,IAAIH,SAAS,EAAEG,QAAQ,CAACJ,KAAK,CAAC;EACnD,CAAC;EACD,OAAO;IACLK,OAAO,EAAEN,OAAO,CAACM,OAAO;IACxBC,IAAI,EAAEA,CAAA,KAAMN,KAAK;IACjBO,SAASA,CAACH,QAA2C,EAAE;MACrDH,SAAS,CAACO,GAAG,CAACJ,QAAQ,CAAC;MACvBA,QAAQ,CAACJ,KAAK,CAAC;MACf,OAAO,MAAM;QACXC,SAAS,CAACQ,MAAM,CAACL,QAAQ,CAAC;MAC5B,CAAC;IACH,CAAC;IACDM,IAAIA,CAACC,MAAc,EAAEC,CAAS,EAAE;MAC9B,IAAI,CAACC,MAAM,CAACC,QAAQ,CAACF,CAAC,CAAC,IAAKZ,KAAK,EAAEW,MAAM,KAAKA,MAAM,IAAIX,KAAK,CAACY,CAAC,KAAKA,CAAE,EAAE;MACxEZ,KAAK,GAAG;QAAEW,MAAM;QAAEC;MAAE,CAAC;MACrBT,MAAM,CAAC,CAAC;IACV,CAAC;IACDY,KAAKA,CAACJ,MAAc,EAAE;MACpB,IAAIX,KAAK,EAAEW,MAAM,KAAKA,MAAM,EAAE;MAC9BX,KAAK,GAAG,IAAI;MACZG,MAAM,CAAC,CAAC;IACV;EACF,CAAC;AACH","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["content/chart-cursor.ts"],"sourcesContent":["export type ChartCursorState = { source: symbol; x: number } | null;\n\n/** Share one numeric X value between line charts. Create one instance per group. */\nexport function createChartCursor(options: { formatX?: (x: number) => string } = {}) {\n let state: ChartCursorState = null;\n const listeners = new Set<(state: ChartCursorState) => void>();\n const notify = () => {\n for (const listener of listeners) listener(state);\n };\n return {\n formatX: options.formatX,\n read: () => state,\n subscribe(listener: (state: ChartCursorState) => void) {\n listeners.add(listener);\n listener(state);\n return () => {\n listeners.delete(listener);\n };\n },\n move(source: symbol, x: number) {\n if (!Number.isFinite(x) || (state?.source === source && state.x === x)) return;\n state = { source, x };\n notify();\n },\n clear(source: symbol) {\n if (state?.source !== source) return;\n state = null;\n notify();\n },\n };\n}\nexport type ChartCursor = ReturnType<typeof createChartCursor>;\n"],"mappings":"AAEA;AACA,OAAO,SAAS,iBAAiB,CAAC,OAA4C,GAAG,CAAC,CAAC,EAAE;EACnF,IAAI,KAAuB,GAAG,IAAI;EAClC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAoC,CAAC;EAC9D,MAAM,MAAM,GAAG,MAAM;IACnB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC;EACnD,CAAC;EACD,OAAO;IACL,OAAO,EAAE,OAAO,CAAC,OAAO;IACxB,IAAI,EAAE,MAAM,KAAK;IACjB,SAAS,CAAC,QAA2C,EAAE;MACrD,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;MACvB,QAAQ,CAAC,KAAK,CAAC;MACf,OAAO,MAAM;QACX,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;MAC5B,CAAC;IACH,CAAC;IACD,IAAI,CAAC,MAAc,EAAE,CAAS,EAAE;MAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAK,KAAK,EAAE,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,CAAC,KAAK,CAAE,EAAE;MACxE,KAAK,GAAG;QAAE,MAAM;QAAE;MAAE,CAAC;MACrB,MAAM,CAAC,CAAC;IACV,CAAC;IACD,KAAK,CAAC,MAAc,EAAE;MACpB,IAAI,KAAK,EAAE,MAAM,KAAK,MAAM,EAAE;MAC9B,KAAK,GAAG,IAAI;MACZ,MAAM,CAAC,CAAC;IACV;EACF,CAAC;AACH","ignoreList":[]}
@@ -1 +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 { type Accessor, batch, createEffect, createSignal, onCleanup, untrack } 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":[]}
1
+ {"version":3,"names":[],"sources":["content/chart-explorer.ts"],"sourcesContent":["import { type Accessor, batch, createEffect, createSignal, onCleanup, untrack } 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":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["createEffect","onCleanup","positionTooltipSurface","sameChartDatum","a","b","role","index","seriesIndex","object","value","pair","Array","isArray","length","every","n","Number","isFinite","roles","Set","isChartDatum","isInteger","undefined","has","anchor","grid","label","values","field","key","formatted","createChartInspection","options","source","Symbol","entries","sortedPoints","byElement","Map","active","highlighted","pinned","pointerStart","moved","pending","frame","records","element","isConnected","clear","from","container","querySelectorAll","JSON","parse","getAttribute","entry","datum","push","set","filter","sort","highlightColor","item","point","querySelector","kind","paint","ownerDocument","defaultView","getComputedStyle","color","hasAttribute","stroke","fill","selectData","selected","matches","some","style","setProperty","removeProperty","toggleAttribute","screenPoint","matrix","getScreenCTM","x","y","c","e","d","f","rect","getBoundingClientRect","width","height","visibleRecords","nodes","viewport","root","ownerSVGElement","baseVal","left","top","clip","right","bottom","rawX","find","seriesChart","clearHighlight","removeAttribute","close","broadcast","cancelPending","state","cursor","read","tooltip","hidePopover","cancelAnimationFrame","invalidate","receive","show","move","enabled","candidate","setAttribute","document","contents","map","content","format","missing","present","add","replaceChildren","sharedTitle","formatX","commonTitle","title","createElement","className","textContent","append","row","rows","line","swatch","series","background","updatePlotBounds","id","showPopover","axes","axis","Math","min","max","name","Object","unsubscribe","subscribe","nearest","target","closest","plot","direct","hit","get","includes","points","determinant","targetX","low","high","mid","floor","previous","abs","matrices","best","distance","Infinity","svg","ax","ay","dx","dy","next","hypot","event","Node","contains","clientX","clientY","pointerType","buttons","Element","requestAnimationFrame","sample","down","click","select","focus","first","at","preventDefault","link","dispatchEvent","MouseEvent","bubbles","cancelable","navigationChart","altKey","seen","findIndex","indexOf","selectDatum","leave"],"sources":["content/chart-inspection.ts"],"sourcesContent":["import type { ChartDatum } from \"@k2b/stdlib\";\nimport { createEffect, onCleanup } from \"solid-js\";\nimport { positionTooltipSurface } from \"../feedback/tooltip-position\";\nimport type { ChartKind } from \"./Chart\";\nimport type { ChartCursor, ChartCursorState } from \"./chart-cursor\";\n\nexport type ChartDatumRef = Pick<ChartDatum, \"role\" | \"index\" | \"seriesIndex\">;\nexport const sameChartDatum = (a: ChartDatumRef, b: ChartDatumRef) =>\n a.role === b.role && a.index === b.index && a.seriesIndex === b.seriesIndex;\n\nexport type ChartSelection = { kind: ChartKind; datum: ChartDatum };\nexport type ChartTooltip = { title?: string; rows: readonly { label: string; value: string }[] };\nexport type ChartTooltipFormatter = (selection: ChartSelection) => ChartTooltip;\n\ntype Entry = { element: SVGGraphicsElement; datum: ChartDatum };\nconst object = (value: unknown): value is Record<string, unknown> => typeof value === \"object\" && value !== null;\nconst pair = (value: unknown): value is [number, number] =>\n Array.isArray(value) && value.length === 2 && value.every((n) => typeof n === \"number\" && Number.isFinite(n));\nconst roles = new Set([\"point\", \"item\", \"bin\", \"box\", \"outlier\", \"value\", \"cell\", \"interval\"]);\nexport function isChartDatum(value: unknown): value is ChartDatum {\n return (\n object(value) &&\n Number.isInteger(value.index) &&\n typeof value.index === \"number\" &&\n value.index >= 0 &&\n (value.seriesIndex === undefined ||\n (typeof value.seriesIndex === \"number\" && Number.isInteger(value.seriesIndex) && value.seriesIndex >= 0)) &&\n typeof value.role === \"string\" &&\n roles.has(value.role) &&\n pair(value.anchor) &&\n (value.grid === undefined || pair(value.grid)) &&\n (value.label === undefined || typeof value.label === \"string\") &&\n Array.isArray(value.values) &&\n value.values.every(\n (field) =>\n object(field) &&\n typeof field.key === \"string\" &&\n (typeof field.value === \"string\" || (typeof field.value === \"number\" && Number.isFinite(field.value))) &&\n (field.formatted === undefined || typeof field.formatted === \"string\"),\n )\n );\n}\n\n/** Enhances existing SVG nodes. Pointer/focus changes never rebuild the chart. */\nexport function createChartInspection(options: {\n container: () => HTMLDivElement | undefined;\n cursor?: () => ChartCursor | undefined;\n tooltip: () => HTMLSpanElement | undefined;\n anchor: () => HTMLSpanElement | undefined;\n kind: () => ChartKind;\n enabled: () => boolean;\n format: ChartTooltipFormatter;\n select: (selection: ChartSelection) => void;\n}) {\n const source = Symbol(\"chart cursor\");\n let entries: Entry[] | undefined;\n let sortedPoints: Entry[] = [];\n const byElement = new Map<Element, Entry>();\n let active: Entry | undefined;\n let highlighted: Entry[] = [];\n let pinned = false;\n let pointerStart: { x: number; y: number } | undefined;\n let moved = false;\n let pending: { x: number; y: number; target: Element | null } | undefined;\n let frame: number | undefined;\n\n const records = () => {\n if (!entries || (entries.length > 0 && !entries[0]!.element.isConnected)) {\n entries = [];\n byElement.clear();\n sortedPoints = [];\n for (const element of Array.from(options.container()?.querySelectorAll<SVGGraphicsElement>(\"[data-chart-datum]\") ?? [])) {\n try {\n const value: unknown = JSON.parse(element.getAttribute(\"data-chart-datum\") ?? \"null\");\n if (isChartDatum(value)) {\n const entry = { element, datum: value };\n entries.push(entry);\n byElement.set(element, entry);\n }\n } catch {\n /* Only valid renderer metadata participates in inspection. */\n }\n }\n sortedPoints = entries.filter((entry) => entry.datum.role === \"point\").sort((a, b) => a.datum.anchor[0] - b.datum.anchor[0]);\n }\n return entries;\n };\n const highlightColor = (item: Entry): string => {\n // Read the actual paint before applying inspection styles, including\n // custom series and threshold colors. Invisible points use their line.\n const point = item.element.querySelector(\".stdlib-chart-inspection-point\");\n const source = point\n ? options\n .container()\n ?.querySelector(\n options.kind() === \"line\"\n ? `.stdlib-chart-line.stdlib-chart-series-${(item.datum.seriesIndex ?? 0) % 8}`\n : \".stdlib-chart-sparkline, .stdlib-chart-stat-sparkline\",\n )\n : (item.element.querySelector(\".stdlib-chart-bar-gauge-fill, .stdlib-chart-gauge-fill, .stdlib-chart-stat-value\") ??\n item.element.querySelector(\"rect, path, circle\"));\n const paint = source ? source.ownerDocument.defaultView?.getComputedStyle(source) : undefined;\n const color =\n (point || item.element.hasAttribute(\"data-chart-reference\") ? paint?.stroke : paint?.fill) ||\n `var(--stdlib-chart-c${((item.datum.seriesIndex ?? 0) % 8) + 1})`;\n return `color-mix(in srgb, ${color} 72%, var(--k2b-chart-highlight-mix))`;\n };\n const selectData = (selected: readonly ChartDatumRef[]) => {\n for (const entry of records()) {\n const matches = selected.some((datum) => sameChartDatum(datum, entry.datum));\n if (matches) entry.element.style.setProperty(\"--k2b-chart-selection-color\", highlightColor(entry));\n else entry.element.style.removeProperty(\"--k2b-chart-selection-color\");\n entry.element.toggleAttribute(\"data-selected\", matches);\n }\n };\n const screenPoint = (entry: Entry) => {\n const matrix = entry.element.getScreenCTM?.();\n const [x, y] = entry.datum.anchor;\n if (matrix) return { x: matrix.a * x + matrix.c * y + matrix.e, y: matrix.b * x + matrix.d * y + matrix.f };\n const rect = entry.element.getBoundingClientRect();\n return { x: rect.x + rect.width / 2, y: rect.y + rect.height / 2 };\n };\n const visibleRecords = () => {\n const nodes = records();\n if (options.kind() !== \"map\") return nodes;\n const viewport = options.container()?.querySelector<SVGSVGElement>(\".stdlib-chart-map-viewport\");\n if (!viewport?.getScreenCTM?.()) return nodes;\n const root = viewport.ownerSVGElement?.getBoundingClientRect();\n if (!root?.width || !root.height) return nodes;\n const width = viewport?.width?.baseVal.value;\n const height = viewport?.height?.baseVal.value;\n if (!width || !height) return nodes;\n const left = root.left + viewport.x.baseVal.value;\n const top = root.top + viewport.y.baseVal.value;\n const clip = { left, top, right: left + width, bottom: top + height };\n return nodes.filter((entry) => {\n const point = screenPoint(entry);\n return point.x >= clip.left && point.x <= clip.right && point.y >= clip.top && point.y <= clip.bottom;\n });\n };\n const rawX = (entry: Entry) => entry.datum.values.find((field) => field.key === \"x\")?.value;\n const seriesChart = () => options.kind() === \"line\" || options.kind() === \"sparkline\";\n const clearHighlight = () => {\n for (const entry of highlighted) {\n entry.element.removeAttribute(\"data-inspected\");\n entry.element.style.removeProperty(\"--k2b-chart-inspection-color\");\n if (!entry.element.getAttribute(\"style\")) entry.element.removeAttribute(\"style\");\n }\n highlighted = [];\n };\n const close = (broadcast = true, cancelPending = true) => {\n const state = options.cursor?.()?.read();\n if (broadcast && state && state.source !== source) return;\n if (broadcast) options.cursor?.()?.clear(source);\n options.container()?.removeAttribute(\"data-cursor-source\");\n pinned = false;\n active = undefined;\n clearHighlight();\n options.container()?.removeAttribute(\"aria-describedby\");\n options.container()?.removeAttribute(\"data-inspecting\");\n const tooltip = options.tooltip();\n if (tooltip) {\n try {\n if (tooltip.matches(\":popover-open\")) tooltip.hidePopover();\n } catch {\n /* Detached during navigation. */\n }\n }\n if (cancelPending) {\n if (frame !== undefined) cancelAnimationFrame(frame);\n frame = undefined;\n pending = undefined;\n }\n };\n const invalidate = () => {\n options.cursor?.()?.clear(source);\n close(false);\n entries = undefined;\n sortedPoints = [];\n byElement.clear();\n receive(options.cursor?.()?.read() ?? null);\n };\n const show = (entry: Entry, broadcast = true) => {\n const x = rawX(entry);\n if (broadcast && options.kind() === \"line\" && typeof x === \"number\") options.cursor?.()?.move(source, x);\n const tooltip = options.tooltip(),\n anchor = options.anchor(),\n container = options.container();\n if (!tooltip || !anchor || !container || !options.enabled()) return;\n if (active === entry && tooltip.matches(\":popover-open\")) return;\n clearHighlight();\n active = entry;\n highlighted = options.kind() === \"line\" ? records().filter((candidate) => rawX(candidate) === rawX(entry)) : [entry];\n for (const item of highlighted) {\n item.element.style.setProperty(\"--k2b-chart-inspection-color\", highlightColor(item));\n item.element.setAttribute(\"data-inspected\", \"true\");\n }\n const document = tooltip.ownerDocument;\n const contents = highlighted.map((item) => ({\n item,\n content: options.format({ kind: options.kind(), datum: item.datum }),\n missing: false,\n }));\n if (options.cursor?.() && options.kind() === \"line\") {\n const present = new Set(highlighted.map((item) => item.datum.seriesIndex));\n for (const item of records()) {\n if (present.has(item.datum.seriesIndex)) continue;\n present.add(item.datum.seriesIndex);\n contents.push({ item, content: options.format({ kind: options.kind(), datum: item.datum }), missing: true });\n }\n contents.sort((a, b) => (a.item.datum.seriesIndex ?? 0) - (b.item.datum.seriesIndex ?? 0));\n }\n tooltip.replaceChildren();\n const sharedTitle = typeof x === \"number\" ? options.cursor?.()?.formatX?.(x) : undefined;\n const commonTitle =\n sharedTitle ??\n (contents.every(({ content }) => content.title === contents[0]?.content.title) ? contents[0]?.content.title : undefined);\n if (commonTitle) {\n const title = document.createElement(\"strong\");\n title.className = \"k2b-chart__tooltip-title\";\n title.textContent = commonTitle;\n tooltip.append(title);\n }\n for (const { item, content, missing } of contents) {\n if (content.title && !commonTitle) {\n const title = document.createElement(\"strong\");\n title.className = \"k2b-chart__tooltip-title\";\n title.textContent = content.title;\n tooltip.append(title);\n }\n for (const row of content.rows) {\n const line = document.createElement(\"span\");\n line.className = \"k2b-chart__tooltip-row\";\n if (options.kind() === \"line\") {\n const swatch = document.createElement(\"i\");\n swatch.setAttribute(\"aria-hidden\", \"true\");\n const series = container.querySelector(`.stdlib-chart-line.stdlib-chart-series-${(item.datum.seriesIndex ?? 0) % 8}`);\n swatch.style.background = series\n ? getComputedStyle(series).stroke\n : `var(--stdlib-chart-c${((item.datum.seriesIndex ?? 0) % 8) + 1})`;\n line.append(swatch);\n }\n const label = document.createElement(\"span\");\n label.textContent = `${row.label}: `;\n const value = document.createElement(\"b\");\n value.textContent = missing ? \"—\" : row.value;\n line.append(label, value);\n tooltip.append(line);\n }\n }\n const rect = container.getBoundingClientRect(),\n point = screenPoint(entry);\n anchor.style.left = `${point.x - rect.left}px`;\n anchor.style.top = `${point.y - rect.top}px`;\n updatePlotBounds();\n container.style.setProperty(\"--k2b-chart-inspection-x\", `${point.x - rect.left}px`);\n container.setAttribute(\"data-inspecting\", seriesChart() ? \"series\" : \"datum\");\n container.setAttribute(\"aria-describedby\", tooltip.id);\n try {\n if (!tooltip.matches(\":popover-open\")) tooltip.showPopover();\n positionTooltipSurface(tooltip, anchor);\n } catch {\n /* SVG titles remain available without the Popover API. */\n }\n };\n const updatePlotBounds = () => {\n const container = options.container();\n if (!container) return;\n const axes = Array.from(container.querySelectorAll(\".stdlib-chart-axis\")).map((axis) => axis.getBoundingClientRect());\n if (axes.length < 2) return;\n const left = Math.min(...axes.map((a) => a.left)),\n right = Math.max(...axes.map((a) => a.right));\n const top = Math.min(...axes.map((a) => a.top)),\n bottom = Math.max(...axes.map((a) => a.bottom));\n if (right <= left || bottom <= top) return;\n const rect = container.getBoundingClientRect();\n for (const [name, value] of Object.entries({\n left: left - rect.left,\n right: rect.right - right,\n top: top - rect.top,\n bottom: rect.bottom - bottom,\n }))\n container.style.setProperty(`--k2b-chart-plot-${name}`, `${value}px`);\n return { left, right, top, bottom };\n };\n const receive = (state: ChartCursorState) => {\n if (state?.source === source) return;\n close(false, false);\n if (!state || options.kind() !== \"line\") return;\n const entry = records().find((item) => rawX(item) === state.x);\n if (entry) show(entry, false);\n };\n createEffect(() => {\n const cursor = options.cursor?.();\n const unsubscribe = cursor?.subscribe(receive);\n onCleanup(() => {\n unsubscribe?.();\n cursor?.clear(source);\n });\n });\n onCleanup(() => close(false));\n const nearest = (x: number, y: number, target: Element | null): Entry | undefined => {\n if (target?.closest(\"button,a\") && !target.closest(\"[data-chart-datum]\")) return;\n if (seriesChart()) {\n const plot = updatePlotBounds();\n if (plot && (x < plot.left || x > plot.right || y < plot.top || y > plot.bottom)) return;\n }\n const nodes = visibleRecords();\n const direct = target?.closest(\"[data-chart-datum]\");\n const hit = direct ? byElement.get(direct) : undefined;\n if (hit && nodes.includes(hit)) return hit;\n // Exact shapes win. A small physical hit radius also reaches tiny or\n // zero-sized marks; distant whitespace leaves the chart unselected.\n const points = seriesChart() ? sortedPoints : nodes;\n if (seriesChart() && points.length) {\n const matrix = points[0]!.element.getScreenCTM?.();\n if (matrix) {\n const determinant = matrix.a * matrix.d - matrix.b * matrix.c;\n if (!determinant) return;\n const targetX = ((x - matrix.e) * matrix.d - (y - matrix.f) * matrix.c) / determinant;\n let low = 0,\n high = points.length - 1;\n while (low < high) {\n const mid = Math.floor((low + high) / 2);\n if (points[mid]!.datum.anchor[0] < targetX) low = mid + 1;\n else high = mid;\n }\n const previous = Math.max(0, low - 1);\n return Math.abs(points[previous]!.datum.anchor[0] - targetX) <= Math.abs(points[low]!.datum.anchor[0] - targetX)\n ? points[previous]\n : points[low];\n }\n }\n const matrices = new Map<SVGSVGElement, DOMMatrix | null>();\n let best: Entry | undefined,\n distance = Infinity;\n for (const entry of points) {\n const svg = entry.element.ownerSVGElement;\n if (svg && !matrices.has(svg)) matrices.set(svg, svg.getScreenCTM?.() ?? null);\n const matrix = svg ? matrices.get(svg) : null;\n const [ax, ay] = entry.datum.anchor;\n const point = matrix\n ? { x: matrix.a * ax + matrix.c * ay + matrix.e, y: matrix.b * ax + matrix.d * ay + matrix.f }\n : screenPoint(entry);\n const dx = point.x - x,\n dy = point.y - y;\n const next = seriesChart() ? Math.abs(dx) : Math.hypot(dx, dy);\n if (next < distance) {\n distance = next;\n best = entry;\n }\n }\n return seriesChart() || distance <= 24 ? best : undefined;\n };\n const move = (event: PointerEvent) => {\n if (event.target instanceof Node && options.tooltip()?.contains(event.target)) return;\n if (pointerStart && Math.hypot(event.clientX - pointerStart.x, event.clientY - pointerStart.y) > 6) moved = true;\n if (!options.enabled() || pinned || event.pointerType === \"touch\" || event.buttons) return;\n pending = { x: event.clientX, y: event.clientY, target: event.target instanceof Element ? event.target : null };\n if (frame !== undefined) return;\n frame = requestAnimationFrame(() => {\n frame = undefined;\n const sample = pending;\n pending = undefined;\n if (!sample) return;\n const entry = nearest(sample.x, sample.y, sample.target);\n if (entry) {\n show(entry);\n if (seriesChart()) {\n const container = options.container();\n container?.setAttribute(\"data-cursor-source\", \"true\");\n container?.style.setProperty(\"--k2b-chart-inspection-y\", `${sample.y - container.getBoundingClientRect().top}px`);\n }\n } else close();\n });\n };\n const down = (event: PointerEvent) => {\n pointerStart = { x: event.clientX, y: event.clientY };\n moved = false;\n };\n const click = (event: MouseEvent) => {\n if (!options.enabled() || moved || (event.target instanceof Element && event.target.closest(\"button,a\"))) return;\n const entry = nearest(event.clientX, event.clientY, event.target instanceof Element ? event.target : null);\n if (!entry) {\n close();\n return;\n }\n pinned = true;\n show(entry);\n options.select({ kind: options.kind(), datum: entry.datum });\n };\n const focus = (event: FocusEvent) => {\n if (event.target !== options.container() || !options.enabled()) return;\n const nodes = visibleRecords();\n const first = options.kind() === \"line\" ? sortedPoints.at(-1) : nodes[0];\n if (first) show(first);\n };\n const key = (event: KeyboardEvent): boolean => {\n if (!options.enabled() || event.target !== options.container()) return false;\n if (event.key === \"Escape\") {\n close();\n return true;\n }\n if (event.key === \"Enter\" && active) {\n if (options.kind() === \"map\" && !visibleRecords().includes(active)) {\n close();\n return true;\n }\n event.preventDefault();\n pinned = true;\n const link = active.element.closest(\"a\");\n if (link) link.dispatchEvent(new MouseEvent(\"click\", { bubbles: true, cancelable: true }));\n else options.select({ kind: options.kind(), datum: active.datum });\n return true;\n }\n const navigationChart = options.kind() === \"map\" || options.kind() === \"stateTimeline\";\n if (navigationChart && !event.altKey) return false;\n if (![\"Home\", \"End\", \"ArrowLeft\", \"ArrowRight\", \"ArrowUp\", \"ArrowDown\"].includes(event.key)) return false;\n let nodes = visibleRecords();\n if (seriesChart()) nodes = [...nodes].sort((a, b) => a.datum.anchor[0] - b.datum.anchor[0]);\n if (options.kind() === \"line\") {\n const seen = new Set<string | number | undefined>();\n nodes = nodes.filter((entry) => {\n const x = rawX(entry);\n if (seen.has(x)) return false;\n seen.add(x);\n return true;\n });\n }\n if (!nodes.length) return false;\n event.preventDefault();\n pinned = false;\n let index = active\n ? options.kind() === \"line\"\n ? nodes.findIndex((entry) => rawX(entry) === rawX(active!))\n : nodes.indexOf(active)\n : -1;\n if (event.key === \"Home\") index = 0;\n else if (event.key === \"End\") index = nodes.length - 1;\n else if (active?.datum.grid && [\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"].includes(event.key)) {\n const [x, y] = active.datum.grid;\n const dx = event.key === \"ArrowLeft\" ? -1 : event.key === \"ArrowRight\" ? 1 : 0;\n const dy = event.key === \"ArrowUp\" ? -1 : event.key === \"ArrowDown\" ? 1 : 0;\n const next = nodes\n .filter(\n (entry) =>\n entry.datum.grid &&\n (dx\n ? entry.datum.grid[1] === y && (entry.datum.grid[0] - x) * dx > 0\n : entry.datum.grid[0] === x && (entry.datum.grid[1] - y) * dy > 0),\n )\n .sort(\n (a, b) =>\n Math.abs(a.datum.grid![0] - x) +\n Math.abs(a.datum.grid![1] - y) -\n Math.abs(b.datum.grid![0] - x) -\n Math.abs(b.datum.grid![1] - y),\n )[0];\n if (next) index = nodes.indexOf(next);\n } else index += event.key === \"ArrowLeft\" || event.key === \"ArrowUp\" ? -1 : 1;\n show(nodes[Math.max(0, Math.min(nodes.length - 1, index))]!);\n return true;\n };\n return {\n selectDatum: (selected: ChartDatumRef | null | undefined) => selectData(selected ? [selected] : []),\n selectData,\n move,\n down,\n click,\n focus,\n key,\n close: () => close(),\n invalidate,\n leave: () => {\n if (!pinned) close();\n },\n };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["content/chart-inspection.ts"],"sourcesContent":["import type { ChartDatum } from \"@k2b/stdlib\";\nimport { createEffect, onCleanup } from \"solid-js\";\nimport { positionTooltipSurface } from \"../feedback/tooltip-position\";\nimport type { ChartKind } from \"./Chart\";\nimport type { ChartCursor, ChartCursorState } from \"./chart-cursor\";\n\nexport type ChartDatumRef = Pick<ChartDatum, \"role\" | \"index\" | \"seriesIndex\">;\nexport const sameChartDatum = (a: ChartDatumRef, b: ChartDatumRef) =>\n a.role === b.role && a.index === b.index && a.seriesIndex === b.seriesIndex;\n\nexport type ChartSelection = { kind: ChartKind; datum: ChartDatum };\nexport type ChartTooltip = { title?: string; rows: readonly { label: string; value: string }[] };\nexport type ChartTooltipFormatter = (selection: ChartSelection) => ChartTooltip;\n\ntype Entry = { element: SVGGraphicsElement; datum: ChartDatum };\nconst object = (value: unknown): value is Record<string, unknown> => typeof value === \"object\" && value !== null;\nconst pair = (value: unknown): value is [number, number] =>\n Array.isArray(value) && value.length === 2 && value.every((n) => typeof n === \"number\" && Number.isFinite(n));\nconst roles = new Set([\"point\", \"item\", \"bin\", \"box\", \"outlier\", \"value\", \"cell\", \"interval\"]);\nexport function isChartDatum(value: unknown): value is ChartDatum {\n return (\n object(value) &&\n Number.isInteger(value.index) &&\n typeof value.index === \"number\" &&\n value.index >= 0 &&\n (value.seriesIndex === undefined ||\n (typeof value.seriesIndex === \"number\" && Number.isInteger(value.seriesIndex) && value.seriesIndex >= 0)) &&\n typeof value.role === \"string\" &&\n roles.has(value.role) &&\n pair(value.anchor) &&\n (value.grid === undefined || pair(value.grid)) &&\n (value.label === undefined || typeof value.label === \"string\") &&\n Array.isArray(value.values) &&\n value.values.every(\n (field) =>\n object(field) &&\n typeof field.key === \"string\" &&\n (typeof field.value === \"string\" || (typeof field.value === \"number\" && Number.isFinite(field.value))) &&\n (field.formatted === undefined || typeof field.formatted === \"string\"),\n )\n );\n}\n\n/** Enhances existing SVG nodes. Pointer/focus changes never rebuild the chart. */\nexport function createChartInspection(options: {\n container: () => HTMLDivElement | undefined;\n cursor?: () => ChartCursor | undefined;\n tooltip: () => HTMLSpanElement | undefined;\n anchor: () => HTMLSpanElement | undefined;\n kind: () => ChartKind;\n enabled: () => boolean;\n format: ChartTooltipFormatter;\n select: (selection: ChartSelection) => void;\n}) {\n const source = Symbol(\"chart cursor\");\n let entries: Entry[] | undefined;\n let sortedPoints: Entry[] = [];\n const byElement = new Map<Element, Entry>();\n let active: Entry | undefined;\n let highlighted: Entry[] = [];\n let pinned = false;\n let pointerStart: { x: number; y: number } | undefined;\n let moved = false;\n let pending: { x: number; y: number; target: Element | null } | undefined;\n let frame: number | undefined;\n\n const records = () => {\n if (!entries || (entries.length > 0 && !entries[0]!.element.isConnected)) {\n entries = [];\n byElement.clear();\n sortedPoints = [];\n for (const element of Array.from(options.container()?.querySelectorAll<SVGGraphicsElement>(\"[data-chart-datum]\") ?? [])) {\n try {\n const value: unknown = JSON.parse(element.getAttribute(\"data-chart-datum\") ?? \"null\");\n if (isChartDatum(value)) {\n const entry = { element, datum: value };\n entries.push(entry);\n byElement.set(element, entry);\n }\n } catch {\n /* Only valid renderer metadata participates in inspection. */\n }\n }\n sortedPoints = entries.filter((entry) => entry.datum.role === \"point\").sort((a, b) => a.datum.anchor[0] - b.datum.anchor[0]);\n }\n return entries;\n };\n const highlightColor = (item: Entry): string => {\n // Read the actual paint before applying inspection styles, including\n // custom series and threshold colors. Invisible points use their line.\n const point = item.element.querySelector(\".stdlib-chart-inspection-point\");\n const source = point\n ? options\n .container()\n ?.querySelector(\n options.kind() === \"line\"\n ? `.stdlib-chart-line.stdlib-chart-series-${(item.datum.seriesIndex ?? 0) % 8}`\n : \".stdlib-chart-sparkline, .stdlib-chart-stat-sparkline\",\n )\n : (item.element.querySelector(\".stdlib-chart-bar-gauge-fill, .stdlib-chart-gauge-fill, .stdlib-chart-stat-value\") ??\n item.element.querySelector(\"rect, path, circle\"));\n const paint = source ? source.ownerDocument.defaultView?.getComputedStyle(source) : undefined;\n const color =\n (point || item.element.hasAttribute(\"data-chart-reference\") ? paint?.stroke : paint?.fill) ||\n `var(--stdlib-chart-c${((item.datum.seriesIndex ?? 0) % 8) + 1})`;\n return `color-mix(in srgb, ${color} 72%, var(--k2b-chart-highlight-mix))`;\n };\n const selectData = (selected: readonly ChartDatumRef[]) => {\n for (const entry of records()) {\n const matches = selected.some((datum) => sameChartDatum(datum, entry.datum));\n if (matches) entry.element.style.setProperty(\"--k2b-chart-selection-color\", highlightColor(entry));\n else entry.element.style.removeProperty(\"--k2b-chart-selection-color\");\n entry.element.toggleAttribute(\"data-selected\", matches);\n }\n };\n const screenPoint = (entry: Entry) => {\n const matrix = entry.element.getScreenCTM?.();\n const [x, y] = entry.datum.anchor;\n if (matrix) return { x: matrix.a * x + matrix.c * y + matrix.e, y: matrix.b * x + matrix.d * y + matrix.f };\n const rect = entry.element.getBoundingClientRect();\n return { x: rect.x + rect.width / 2, y: rect.y + rect.height / 2 };\n };\n const visibleRecords = () => {\n const nodes = records();\n if (options.kind() !== \"map\") return nodes;\n const viewport = options.container()?.querySelector<SVGSVGElement>(\".stdlib-chart-map-viewport\");\n if (!viewport?.getScreenCTM?.()) return nodes;\n const root = viewport.ownerSVGElement?.getBoundingClientRect();\n if (!root?.width || !root.height) return nodes;\n const width = viewport?.width?.baseVal.value;\n const height = viewport?.height?.baseVal.value;\n if (!width || !height) return nodes;\n const left = root.left + viewport.x.baseVal.value;\n const top = root.top + viewport.y.baseVal.value;\n const clip = { left, top, right: left + width, bottom: top + height };\n return nodes.filter((entry) => {\n const point = screenPoint(entry);\n return point.x >= clip.left && point.x <= clip.right && point.y >= clip.top && point.y <= clip.bottom;\n });\n };\n const rawX = (entry: Entry) => entry.datum.values.find((field) => field.key === \"x\")?.value;\n const seriesChart = () => options.kind() === \"line\" || options.kind() === \"sparkline\";\n const clearHighlight = () => {\n for (const entry of highlighted) {\n entry.element.removeAttribute(\"data-inspected\");\n entry.element.style.removeProperty(\"--k2b-chart-inspection-color\");\n if (!entry.element.getAttribute(\"style\")) entry.element.removeAttribute(\"style\");\n }\n highlighted = [];\n };\n const close = (broadcast = true, cancelPending = true) => {\n const state = options.cursor?.()?.read();\n if (broadcast && state && state.source !== source) return;\n if (broadcast) options.cursor?.()?.clear(source);\n options.container()?.removeAttribute(\"data-cursor-source\");\n pinned = false;\n active = undefined;\n clearHighlight();\n options.container()?.removeAttribute(\"aria-describedby\");\n options.container()?.removeAttribute(\"data-inspecting\");\n const tooltip = options.tooltip();\n if (tooltip) {\n try {\n if (tooltip.matches(\":popover-open\")) tooltip.hidePopover();\n } catch {\n /* Detached during navigation. */\n }\n }\n if (cancelPending) {\n if (frame !== undefined) cancelAnimationFrame(frame);\n frame = undefined;\n pending = undefined;\n }\n };\n const invalidate = () => {\n options.cursor?.()?.clear(source);\n close(false);\n entries = undefined;\n sortedPoints = [];\n byElement.clear();\n receive(options.cursor?.()?.read() ?? null);\n };\n const show = (entry: Entry, broadcast = true) => {\n const x = rawX(entry);\n if (broadcast && options.kind() === \"line\" && typeof x === \"number\") options.cursor?.()?.move(source, x);\n const tooltip = options.tooltip(),\n anchor = options.anchor(),\n container = options.container();\n if (!tooltip || !anchor || !container || !options.enabled()) return;\n if (active === entry && tooltip.matches(\":popover-open\")) return;\n clearHighlight();\n active = entry;\n highlighted = options.kind() === \"line\" ? records().filter((candidate) => rawX(candidate) === rawX(entry)) : [entry];\n for (const item of highlighted) {\n item.element.style.setProperty(\"--k2b-chart-inspection-color\", highlightColor(item));\n item.element.setAttribute(\"data-inspected\", \"true\");\n }\n const document = tooltip.ownerDocument;\n const contents = highlighted.map((item) => ({\n item,\n content: options.format({ kind: options.kind(), datum: item.datum }),\n missing: false,\n }));\n if (options.cursor?.() && options.kind() === \"line\") {\n const present = new Set(highlighted.map((item) => item.datum.seriesIndex));\n for (const item of records()) {\n if (present.has(item.datum.seriesIndex)) continue;\n present.add(item.datum.seriesIndex);\n contents.push({ item, content: options.format({ kind: options.kind(), datum: item.datum }), missing: true });\n }\n contents.sort((a, b) => (a.item.datum.seriesIndex ?? 0) - (b.item.datum.seriesIndex ?? 0));\n }\n tooltip.replaceChildren();\n const sharedTitle = typeof x === \"number\" ? options.cursor?.()?.formatX?.(x) : undefined;\n const commonTitle =\n sharedTitle ??\n (contents.every(({ content }) => content.title === contents[0]?.content.title) ? contents[0]?.content.title : undefined);\n if (commonTitle) {\n const title = document.createElement(\"strong\");\n title.className = \"k2b-chart__tooltip-title\";\n title.textContent = commonTitle;\n tooltip.append(title);\n }\n for (const { item, content, missing } of contents) {\n if (content.title && !commonTitle) {\n const title = document.createElement(\"strong\");\n title.className = \"k2b-chart__tooltip-title\";\n title.textContent = content.title;\n tooltip.append(title);\n }\n for (const row of content.rows) {\n const line = document.createElement(\"span\");\n line.className = \"k2b-chart__tooltip-row\";\n if (options.kind() === \"line\") {\n const swatch = document.createElement(\"i\");\n swatch.setAttribute(\"aria-hidden\", \"true\");\n const series = container.querySelector(`.stdlib-chart-line.stdlib-chart-series-${(item.datum.seriesIndex ?? 0) % 8}`);\n swatch.style.background = series\n ? getComputedStyle(series).stroke\n : `var(--stdlib-chart-c${((item.datum.seriesIndex ?? 0) % 8) + 1})`;\n line.append(swatch);\n }\n const label = document.createElement(\"span\");\n label.textContent = `${row.label}: `;\n const value = document.createElement(\"b\");\n value.textContent = missing ? \"—\" : row.value;\n line.append(label, value);\n tooltip.append(line);\n }\n }\n const rect = container.getBoundingClientRect(),\n point = screenPoint(entry);\n anchor.style.left = `${point.x - rect.left}px`;\n anchor.style.top = `${point.y - rect.top}px`;\n updatePlotBounds();\n container.style.setProperty(\"--k2b-chart-inspection-x\", `${point.x - rect.left}px`);\n container.setAttribute(\"data-inspecting\", seriesChart() ? \"series\" : \"datum\");\n container.setAttribute(\"aria-describedby\", tooltip.id);\n try {\n if (!tooltip.matches(\":popover-open\")) tooltip.showPopover();\n positionTooltipSurface(tooltip, anchor);\n } catch {\n /* SVG titles remain available without the Popover API. */\n }\n };\n const updatePlotBounds = () => {\n const container = options.container();\n if (!container) return;\n const axes = Array.from(container.querySelectorAll(\".stdlib-chart-axis\")).map((axis) => axis.getBoundingClientRect());\n if (axes.length < 2) return;\n const left = Math.min(...axes.map((a) => a.left)),\n right = Math.max(...axes.map((a) => a.right));\n const top = Math.min(...axes.map((a) => a.top)),\n bottom = Math.max(...axes.map((a) => a.bottom));\n if (right <= left || bottom <= top) return;\n const rect = container.getBoundingClientRect();\n for (const [name, value] of Object.entries({\n left: left - rect.left,\n right: rect.right - right,\n top: top - rect.top,\n bottom: rect.bottom - bottom,\n }))\n container.style.setProperty(`--k2b-chart-plot-${name}`, `${value}px`);\n return { left, right, top, bottom };\n };\n const receive = (state: ChartCursorState) => {\n if (state?.source === source) return;\n close(false, false);\n if (!state || options.kind() !== \"line\") return;\n const entry = records().find((item) => rawX(item) === state.x);\n if (entry) show(entry, false);\n };\n createEffect(() => {\n const cursor = options.cursor?.();\n const unsubscribe = cursor?.subscribe(receive);\n onCleanup(() => {\n unsubscribe?.();\n cursor?.clear(source);\n });\n });\n onCleanup(() => close(false));\n const nearest = (x: number, y: number, target: Element | null): Entry | undefined => {\n if (target?.closest(\"button,a\") && !target.closest(\"[data-chart-datum]\")) return;\n if (seriesChart()) {\n const plot = updatePlotBounds();\n if (plot && (x < plot.left || x > plot.right || y < plot.top || y > plot.bottom)) return;\n }\n const nodes = visibleRecords();\n const direct = target?.closest(\"[data-chart-datum]\");\n const hit = direct ? byElement.get(direct) : undefined;\n if (hit && nodes.includes(hit)) return hit;\n // Exact shapes win. A small physical hit radius also reaches tiny or\n // zero-sized marks; distant whitespace leaves the chart unselected.\n const points = seriesChart() ? sortedPoints : nodes;\n if (seriesChart() && points.length) {\n const matrix = points[0]!.element.getScreenCTM?.();\n if (matrix) {\n const determinant = matrix.a * matrix.d - matrix.b * matrix.c;\n if (!determinant) return;\n const targetX = ((x - matrix.e) * matrix.d - (y - matrix.f) * matrix.c) / determinant;\n let low = 0,\n high = points.length - 1;\n while (low < high) {\n const mid = Math.floor((low + high) / 2);\n if (points[mid]!.datum.anchor[0] < targetX) low = mid + 1;\n else high = mid;\n }\n const previous = Math.max(0, low - 1);\n return Math.abs(points[previous]!.datum.anchor[0] - targetX) <= Math.abs(points[low]!.datum.anchor[0] - targetX)\n ? points[previous]\n : points[low];\n }\n }\n const matrices = new Map<SVGSVGElement, DOMMatrix | null>();\n let best: Entry | undefined,\n distance = Infinity;\n for (const entry of points) {\n const svg = entry.element.ownerSVGElement;\n if (svg && !matrices.has(svg)) matrices.set(svg, svg.getScreenCTM?.() ?? null);\n const matrix = svg ? matrices.get(svg) : null;\n const [ax, ay] = entry.datum.anchor;\n const point = matrix\n ? { x: matrix.a * ax + matrix.c * ay + matrix.e, y: matrix.b * ax + matrix.d * ay + matrix.f }\n : screenPoint(entry);\n const dx = point.x - x,\n dy = point.y - y;\n const next = seriesChart() ? Math.abs(dx) : Math.hypot(dx, dy);\n if (next < distance) {\n distance = next;\n best = entry;\n }\n }\n return seriesChart() || distance <= 24 ? best : undefined;\n };\n const move = (event: PointerEvent) => {\n if (event.target instanceof Node && options.tooltip()?.contains(event.target)) return;\n if (pointerStart && Math.hypot(event.clientX - pointerStart.x, event.clientY - pointerStart.y) > 6) moved = true;\n if (!options.enabled() || pinned || event.pointerType === \"touch\" || event.buttons) return;\n pending = { x: event.clientX, y: event.clientY, target: event.target instanceof Element ? event.target : null };\n if (frame !== undefined) return;\n frame = requestAnimationFrame(() => {\n frame = undefined;\n const sample = pending;\n pending = undefined;\n if (!sample) return;\n const entry = nearest(sample.x, sample.y, sample.target);\n if (entry) {\n show(entry);\n if (seriesChart()) {\n const container = options.container();\n container?.setAttribute(\"data-cursor-source\", \"true\");\n container?.style.setProperty(\"--k2b-chart-inspection-y\", `${sample.y - container.getBoundingClientRect().top}px`);\n }\n } else close();\n });\n };\n const down = (event: PointerEvent) => {\n pointerStart = { x: event.clientX, y: event.clientY };\n moved = false;\n };\n const click = (event: MouseEvent) => {\n if (!options.enabled() || moved || (event.target instanceof Element && event.target.closest(\"button,a\"))) return;\n const entry = nearest(event.clientX, event.clientY, event.target instanceof Element ? event.target : null);\n if (!entry) {\n close();\n return;\n }\n pinned = true;\n show(entry);\n options.select({ kind: options.kind(), datum: entry.datum });\n };\n const focus = (event: FocusEvent) => {\n if (event.target !== options.container() || !options.enabled()) return;\n const nodes = visibleRecords();\n const first = options.kind() === \"line\" ? sortedPoints.at(-1) : nodes[0];\n if (first) show(first);\n };\n const key = (event: KeyboardEvent): boolean => {\n if (!options.enabled() || event.target !== options.container()) return false;\n if (event.key === \"Escape\") {\n close();\n return true;\n }\n if (event.key === \"Enter\" && active) {\n if (options.kind() === \"map\" && !visibleRecords().includes(active)) {\n close();\n return true;\n }\n event.preventDefault();\n pinned = true;\n const link = active.element.closest(\"a\");\n if (link) link.dispatchEvent(new MouseEvent(\"click\", { bubbles: true, cancelable: true }));\n else options.select({ kind: options.kind(), datum: active.datum });\n return true;\n }\n const navigationChart = options.kind() === \"map\" || options.kind() === \"stateTimeline\";\n if (navigationChart && !event.altKey) return false;\n if (![\"Home\", \"End\", \"ArrowLeft\", \"ArrowRight\", \"ArrowUp\", \"ArrowDown\"].includes(event.key)) return false;\n let nodes = visibleRecords();\n if (seriesChart()) nodes = [...nodes].sort((a, b) => a.datum.anchor[0] - b.datum.anchor[0]);\n if (options.kind() === \"line\") {\n const seen = new Set<string | number | undefined>();\n nodes = nodes.filter((entry) => {\n const x = rawX(entry);\n if (seen.has(x)) return false;\n seen.add(x);\n return true;\n });\n }\n if (!nodes.length) return false;\n event.preventDefault();\n pinned = false;\n let index = active\n ? options.kind() === \"line\"\n ? nodes.findIndex((entry) => rawX(entry) === rawX(active!))\n : nodes.indexOf(active)\n : -1;\n if (event.key === \"Home\") index = 0;\n else if (event.key === \"End\") index = nodes.length - 1;\n else if (active?.datum.grid && [\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"].includes(event.key)) {\n const [x, y] = active.datum.grid;\n const dx = event.key === \"ArrowLeft\" ? -1 : event.key === \"ArrowRight\" ? 1 : 0;\n const dy = event.key === \"ArrowUp\" ? -1 : event.key === \"ArrowDown\" ? 1 : 0;\n const next = nodes\n .filter(\n (entry) =>\n entry.datum.grid &&\n (dx\n ? entry.datum.grid[1] === y && (entry.datum.grid[0] - x) * dx > 0\n : entry.datum.grid[0] === x && (entry.datum.grid[1] - y) * dy > 0),\n )\n .sort(\n (a, b) =>\n Math.abs(a.datum.grid![0] - x) +\n Math.abs(a.datum.grid![1] - y) -\n Math.abs(b.datum.grid![0] - x) -\n Math.abs(b.datum.grid![1] - y),\n )[0];\n if (next) index = nodes.indexOf(next);\n } else index += event.key === \"ArrowLeft\" || event.key === \"ArrowUp\" ? -1 : 1;\n show(nodes[Math.max(0, Math.min(nodes.length - 1, index))]!);\n return true;\n };\n return {\n selectDatum: (selected: ChartDatumRef | null | undefined) => selectData(selected ? [selected] : []),\n selectData,\n move,\n down,\n click,\n focus,\n key,\n close: () => close(),\n invalidate,\n leave: () => {\n if (!pinned) close();\n },\n };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["linePathD","smoothPathD","stepPathD","isChartDatum","lineGapsSvg","svg","maxGap","options","Number","isFinite","RangeError","decode","value","replace","series","Map","records","match","matchAll","datum","JSON","parse","role","push","index","seriesIndex","rows","get","set","x","point","values","find","key","paths","isolated","Set","points","runs","sort","a","b","run","at","map","length","add","anchor","y","step","smooth","join","currentSeries","pointIndex","element","startsWith","has"],"sources":["content/chart-line-gaps.ts"],"sourcesContent":["import { type ChartDatum, linePathD, smoothPathD, stepPathD } from \"@k2b/stdlib\";\nimport { isChartDatum } from \"./chart-inspection\";\n\n/** Adapt trusted stdlib line geometry without changing series, indices or inspection. */\nexport function lineGapsSvg(svg: string, maxGap: number, options: { smooth?: boolean; step?: \"before\" | \"after\" | \"middle\" }): string {\n if (!Number.isFinite(maxGap) || maxGap <= 0) throw new RangeError(\"Chart maxGap must be finite and positive\");\n const decode = (value: string) =>\n value\n .replace(/&quot;/g, '\"')\n .replace(/&apos;|&#39;/g, \"'\")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&amp;/g, \"&\");\n const series = new Map<number, ChartDatum[]>();\n const records: ChartDatum[] = [];\n for (const match of svg.matchAll(/data-chart-datum=\"([^\"]*)\"/g)) {\n const datum: unknown = JSON.parse(decode(match[1]!));\n if (!isChartDatum(datum) || datum.role !== \"point\") continue;\n records.push(datum);\n const index = datum.seriesIndex ?? 0;\n const rows = series.get(index) ?? [];\n rows.push(datum);\n series.set(index, rows);\n }\n const x = (point: ChartDatum) => Number(point.values.find((value) => value.key === \"x\")!.value);\n const paths = new Map<number, string>();\n const isolated = new Set<ChartDatum>();\n for (const [index, points] of series) {\n const runs: ChartDatum[][] = [];\n for (const point of [...points].sort((a, b) => x(a) - x(b))) {\n const run = runs.at(-1);\n if (!run || x(point) - x(run.at(-1)!) > maxGap) runs.push([point]);\n else run.push(point);\n }\n paths.set(\n index,\n runs\n .map((run) => {\n if (run.length === 1) {\n isolated.add(run[0]!);\n return \"\";\n }\n const points = run.map((point) => ({ x: point.anchor[0], y: point.anchor[1] }));\n return options.step ? stepPathD(points, options.step) : options.smooth === false ? linePathD(points) : smoothPathD(points);\n })\n .join(\" \"),\n );\n }\n // Metadata precedes each series' path in the renderer. Keeping the source\n // series index also preserves palettes when there are more than eight series.\n let currentSeries = 0;\n let pointIndex = 0;\n return svg.replace(\n /<g data-chart-role=\"point\" data-chart-datum=\"[^\"]*\">[\\s\\S]*?<\\/g>|<path class=\"stdlib-chart-line [^\"]*\"[^>]*\\/>/g,\n (element) => {\n if (element.startsWith(\"<g\")) {\n const datum = records[pointIndex++]!;\n currentSeries = datum.seriesIndex ?? 0;\n\n return isolated.has(datum)\n ? element.replace('fill=\"transparent\"', `fill=\"var(--stdlib-chart-c${(currentSeries % 8) + 1})\"`)\n : element;\n }\n return element.replace(/ d=\"[^\"]*\"/, ` d=\"${paths.get(currentSeries) ?? \"\"}\"`);\n },\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["content/chart-line-gaps.ts"],"sourcesContent":["import { type ChartDatum, linePathD, smoothPathD, stepPathD } from \"@k2b/stdlib\";\nimport { isChartDatum } from \"./chart-inspection\";\n\n/** Adapt trusted stdlib line geometry without changing series, indices or inspection. */\nexport function lineGapsSvg(svg: string, maxGap: number, options: { smooth?: boolean; step?: \"before\" | \"after\" | \"middle\" }): string {\n if (!Number.isFinite(maxGap) || maxGap <= 0) throw new RangeError(\"Chart maxGap must be finite and positive\");\n const decode = (value: string) =>\n value\n .replace(/&quot;/g, '\"')\n .replace(/&apos;|&#39;/g, \"'\")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&amp;/g, \"&\");\n const series = new Map<number, ChartDatum[]>();\n const records: ChartDatum[] = [];\n for (const match of svg.matchAll(/data-chart-datum=\"([^\"]*)\"/g)) {\n const datum: unknown = JSON.parse(decode(match[1]!));\n if (!isChartDatum(datum) || datum.role !== \"point\") continue;\n records.push(datum);\n const index = datum.seriesIndex ?? 0;\n const rows = series.get(index) ?? [];\n rows.push(datum);\n series.set(index, rows);\n }\n const x = (point: ChartDatum) => Number(point.values.find((value) => value.key === \"x\")!.value);\n const paths = new Map<number, string>();\n const isolated = new Set<ChartDatum>();\n for (const [index, points] of series) {\n const runs: ChartDatum[][] = [];\n for (const point of [...points].sort((a, b) => x(a) - x(b))) {\n const run = runs.at(-1);\n if (!run || x(point) - x(run.at(-1)!) > maxGap) runs.push([point]);\n else run.push(point);\n }\n paths.set(\n index,\n runs\n .map((run) => {\n if (run.length === 1) {\n isolated.add(run[0]!);\n return \"\";\n }\n const points = run.map((point) => ({ x: point.anchor[0], y: point.anchor[1] }));\n return options.step ? stepPathD(points, options.step) : options.smooth === false ? linePathD(points) : smoothPathD(points);\n })\n .join(\" \"),\n );\n }\n // Metadata precedes each series' path in the renderer. Keeping the source\n // series index also preserves palettes when there are more than eight series.\n let currentSeries = 0;\n let pointIndex = 0;\n return svg.replace(\n /<g data-chart-role=\"point\" data-chart-datum=\"[^\"]*\">[\\s\\S]*?<\\/g>|<path class=\"stdlib-chart-line [^\"]*\"[^>]*\\/>/g,\n (element) => {\n if (element.startsWith(\"<g\")) {\n const datum = records[pointIndex++]!;\n currentSeries = datum.seriesIndex ?? 0;\n\n return isolated.has(datum)\n ? element.replace('fill=\"transparent\"', `fill=\"var(--stdlib-chart-c${(currentSeries % 8) + 1})\"`)\n : element;\n }\n return element.replace(/ d=\"[^\"]*\"/, ` d=\"${paths.get(currentSeries) ?? \"\"}\"`);\n },\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["DEFAULT_MAP_VIEWPORT","latitude","longitude","zoom","MIN_ZOOM","MAX_ZOOM","clamp","value","min","max","Math","normalizeMapViewport","viewport","Number","isFinite","scale","latitudeLimit","longitudeLimit","zoomMapViewport","delta","focus","panMapViewport","deltaX","deltaY","width","height"],"sources":["content/chart-map-viewport.ts"],"sourcesContent":["import type { MapViewport } from \"@k2b/stdlib\";\n\nexport const DEFAULT_MAP_VIEWPORT: MapViewport = {\n latitude: 0,\n longitude: 0,\n zoom: 0,\n};\n\nconst MIN_ZOOM = 0;\nconst MAX_ZOOM = 5;\n\nconst clamp = (value: number, min: number, max: number): number => Math.min(max, Math.max(min, value));\n\nexport const normalizeMapViewport = (viewport: MapViewport | undefined): MapViewport => {\n const zoom = clamp(viewport && Number.isFinite(viewport.zoom) ? viewport.zoom : MIN_ZOOM, MIN_ZOOM, MAX_ZOOM);\n const scale = 2 ** zoom;\n const latitudeLimit = 90 - 90 / scale;\n const longitudeLimit = 180 - 180 / scale;\n\n return {\n latitude: clamp(viewport && Number.isFinite(viewport.latitude) ? viewport.latitude : 0, -latitudeLimit, latitudeLimit),\n longitude: clamp(viewport && Number.isFinite(viewport.longitude) ? viewport.longitude : 0, -longitudeLimit, longitudeLimit),\n zoom,\n };\n};\n\nexport const zoomMapViewport = (\n viewport: MapViewport,\n delta: number,\n focus: Pick<MapViewport, \"latitude\" | \"longitude\"> = { latitude: 50, longitude: 10 },\n): MapViewport =>\n normalizeMapViewport({\n ...viewport,\n ...(viewport.zoom === 0 && delta > 0 ? focus : {}),\n zoom: viewport.zoom + delta,\n });\n\nexport const panMapViewport = (viewport: MapViewport, deltaX: number, deltaY: number, width: number, height: number): MapViewport => {\n if (width <= 0 || height <= 0) return normalizeMapViewport(viewport);\n\n const scale = 2 ** viewport.zoom;\n return normalizeMapViewport({\n latitude: viewport.latitude + (deltaY / height) * (180 / scale),\n longitude: viewport.longitude - (deltaX / width) * (360 / scale),\n zoom: viewport.zoom,\n });\n};\n"],"mappings":"AAEA,OAAO,MAAMA,oBAAiC,GAAG;EAC/CC,QAAQ,EAAE,CAAC;EACXC,SAAS,EAAE,CAAC;EACZC,IAAI,EAAE;AACR,CAAC;AAED,MAAMC,QAAQ,GAAG,CAAC;AAClB,MAAMC,QAAQ,GAAG,CAAC;AAElB,MAAMC,KAAK,GAAGA,CAACC,KAAa,EAAEC,GAAW,EAAEC,GAAW,KAAaC,IAAI,CAACF,GAAG,CAACC,GAAG,EAAEC,IAAI,CAACD,GAAG,CAACD,GAAG,EAAED,KAAK,CAAC,CAAC;AAEtG,OAAO,MAAMI,oBAAoB,GAAIC,QAAiC,IAAkB;EACtF,MAAMT,IAAI,GAAGG,KAAK,CAACM,QAAQ,IAAIC,MAAM,CAACC,QAAQ,CAACF,QAAQ,CAACT,IAAI,CAAC,GAAGS,QAAQ,CAACT,IAAI,GAAGC,QAAQ,EAAEA,QAAQ,EAAEC,QAAQ,CAAC;EAC7G,MAAMU,KAAK,GAAG,CAAC,IAAIZ,IAAI;EACvB,MAAMa,aAAa,GAAG,EAAE,GAAG,EAAE,GAAGD,KAAK;EACrC,MAAME,cAAc,GAAG,GAAG,GAAG,GAAG,GAAGF,KAAK;EAExC,OAAO;IACLd,QAAQ,EAAEK,KAAK,CAACM,QAAQ,IAAIC,MAAM,CAACC,QAAQ,CAACF,QAAQ,CAACX,QAAQ,CAAC,GAAGW,QAAQ,CAACX,QAAQ,GAAG,CAAC,EAAE,CAACe,aAAa,EAAEA,aAAa,CAAC;IACtHd,SAAS,EAAEI,KAAK,CAACM,QAAQ,IAAIC,MAAM,CAACC,QAAQ,CAACF,QAAQ,CAACV,SAAS,CAAC,GAAGU,QAAQ,CAACV,SAAS,GAAG,CAAC,EAAE,CAACe,cAAc,EAAEA,cAAc,CAAC;IAC3Hd;EACF,CAAC;AACH,CAAC;AAED,OAAO,MAAMe,eAAe,GAAGA,CAC7BN,QAAqB,EACrBO,KAAa,EACbC,KAAkD,GAAG;EAAEnB,QAAQ,EAAE,EAAE;EAAEC,SAAS,EAAE;AAAG,CAAC,KAEpFS,oBAAoB,CAAC;EACnB,GAAGC,QAAQ;EACX,IAAIA,QAAQ,CAACT,IAAI,KAAK,CAAC,IAAIgB,KAAK,GAAG,CAAC,GAAGC,KAAK,GAAG,CAAC,CAAC,CAAC;EAClDjB,IAAI,EAAES,QAAQ,CAACT,IAAI,GAAGgB;AACxB,CAAC,CAAC;AAEJ,OAAO,MAAME,cAAc,GAAGA,CAACT,QAAqB,EAAEU,MAAc,EAAEC,MAAc,EAAEC,KAAa,EAAEC,MAAc,KAAkB;EACnI,IAAID,KAAK,IAAI,CAAC,IAAIC,MAAM,IAAI,CAAC,EAAE,OAAOd,oBAAoB,CAACC,QAAQ,CAAC;EAEpE,MAAMG,KAAK,GAAG,CAAC,IAAIH,QAAQ,CAACT,IAAI;EAChC,OAAOQ,oBAAoB,CAAC;IAC1BV,QAAQ,EAAEW,QAAQ,CAACX,QAAQ,GAAIsB,MAAM,GAAGE,MAAM,IAAK,GAAG,GAAGV,KAAK,CAAC;IAC/Db,SAAS,EAAEU,QAAQ,CAACV,SAAS,GAAIoB,MAAM,GAAGE,KAAK,IAAK,GAAG,GAAGT,KAAK,CAAC;IAChEZ,IAAI,EAAES,QAAQ,CAACT;EACjB,CAAC,CAAC;AACJ,CAAC","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["content/chart-map-viewport.ts"],"sourcesContent":["import type { MapViewport } from \"@k2b/stdlib\";\n\nexport const DEFAULT_MAP_VIEWPORT: MapViewport = {\n latitude: 0,\n longitude: 0,\n zoom: 0,\n};\n\nconst MIN_ZOOM = 0;\nconst MAX_ZOOM = 5;\n\nconst clamp = (value: number, min: number, max: number): number => Math.min(max, Math.max(min, value));\n\nexport const normalizeMapViewport = (viewport: MapViewport | undefined): MapViewport => {\n const zoom = clamp(viewport && Number.isFinite(viewport.zoom) ? viewport.zoom : MIN_ZOOM, MIN_ZOOM, MAX_ZOOM);\n const scale = 2 ** zoom;\n const latitudeLimit = 90 - 90 / scale;\n const longitudeLimit = 180 - 180 / scale;\n\n return {\n latitude: clamp(viewport && Number.isFinite(viewport.latitude) ? viewport.latitude : 0, -latitudeLimit, latitudeLimit),\n longitude: clamp(viewport && Number.isFinite(viewport.longitude) ? viewport.longitude : 0, -longitudeLimit, longitudeLimit),\n zoom,\n };\n};\n\nexport const zoomMapViewport = (\n viewport: MapViewport,\n delta: number,\n focus: Pick<MapViewport, \"latitude\" | \"longitude\"> = { latitude: 50, longitude: 10 },\n): MapViewport =>\n normalizeMapViewport({\n ...viewport,\n ...(viewport.zoom === 0 && delta > 0 ? focus : {}),\n zoom: viewport.zoom + delta,\n });\n\nexport const panMapViewport = (viewport: MapViewport, deltaX: number, deltaY: number, width: number, height: number): MapViewport => {\n if (width <= 0 || height <= 0) return normalizeMapViewport(viewport);\n\n const scale = 2 ** viewport.zoom;\n return normalizeMapViewport({\n latitude: viewport.latitude + (deltaY / height) * (180 / scale),\n longitude: viewport.longitude - (deltaX / width) * (360 / scale),\n zoom: viewport.zoom,\n });\n};\n"],"mappings":"AAEA,OAAO,MAAM,oBAAiC,GAAG;EAC/C,QAAQ,EAAE,CAAC;EACX,SAAS,EAAE,CAAC;EACZ,IAAI,EAAE;AACR,CAAC;AAED,MAAM,QAAQ,GAAG,CAAC;AAClB,MAAM,QAAQ,GAAG,CAAC;AAElB,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW,KAAa,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAEtG,OAAO,MAAM,oBAAoB,GAAI,QAAiC,IAAkB;EACtF,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,GAAG,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;EAC7G,MAAM,KAAK,GAAG,CAAC,IAAI,IAAI;EACvB,MAAM,aAAa,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK;EACrC,MAAM,cAAc,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK;EAExC,OAAO;IACL,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC;IACtH,SAAS,EAAE,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC,cAAc,EAAE,cAAc,CAAC;IAC3H;EACF,CAAC;AACH,CAAC;AAED,OAAO,MAAM,eAAe,GAAG,CAC7B,QAAqB,EACrB,KAAa,EACb,KAAkD,GAAG;EAAE,QAAQ,EAAE,EAAE;EAAE,SAAS,EAAE;AAAG,CAAC,KAEpF,oBAAoB,CAAC;EACnB,GAAG,QAAQ;EACX,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC;EAClD,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG;AACxB,CAAC,CAAC;AAEJ,OAAO,MAAM,cAAc,GAAG,CAAC,QAAqB,EAAE,MAAc,EAAE,MAAc,EAAE,KAAa,EAAE,MAAc,KAAkB;EACnI,IAAI,KAAK,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,OAAO,oBAAoB,CAAC,QAAQ,CAAC;EAEpE,MAAM,KAAK,GAAG,CAAC,IAAI,QAAQ,CAAC,IAAI;EAChC,OAAO,oBAAoB,CAAC;IAC1B,QAAQ,EAAE,QAAQ,CAAC,QAAQ,GAAI,MAAM,GAAG,MAAM,IAAK,GAAG,GAAG,KAAK,CAAC;IAC/D,SAAS,EAAE,QAAQ,CAAC,SAAS,GAAI,MAAM,GAAG,KAAK,IAAK,GAAG,GAAG,KAAK,CAAC;IAChE,IAAI,EAAE,QAAQ,CAAC;EACjB,CAAC,CAAC;AACJ,CAAC","ignoreList":[]}