basalt-ui 1.41.0 → 2.0.1
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.
- package/AGENTS.md +46 -43
- package/CHANGELOG.md +542 -518
- package/MIGRATING.md +964 -37
- package/README.md +171 -366
- package/agent/rules/basalt-batteries.md +19 -74
- package/agent/rules/basalt-charts.md +21 -95
- package/agent/rules/basalt-controls.md +23 -131
- package/agent/rules/basalt-mantine.md +26 -99
- package/agent/rules/basalt-state.md +21 -103
- package/agent/rules/basalt-tokens.md +33 -114
- package/agent/skills/basalt-app/SKILL.md +229 -72
- package/agent/skills/basalt-charts/SKILL.md +23 -57
- package/agent/skills/basalt-design/SKILL.md +12 -70
- package/agent/templates/AGENTS-block.md.tpl +16 -26
- package/agent/templates/DESIGN.md.tpl +1 -1
- package/agent/templates/__root.tpl +9 -16
- package/agent/templates/main.tpl +21 -0
- package/agent/templates/nav.tpl +18 -0
- package/configs/oxlint-basalt.json +4 -10
- package/configs/oxlint-plugin.js +465 -844
- package/configs/oxlint-plugin.test.ts +661 -709
- package/configs/oxlint.json +10 -2
- package/dist/agent/ai-sdk-transport.d.ts +19 -7
- package/dist/agent/ai-sdk-transport.d.ts.map +1 -1
- package/dist/agent/ai-sdk-transport.js +10 -7
- package/dist/{agent-chat → agent/chat}/composer.d.ts +16 -16
- package/dist/agent/chat/composer.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/composer.js +10 -9
- package/dist/{agent-chat → agent/chat}/message-affordances.d.ts +7 -6
- package/dist/agent/chat/message-affordances.d.ts.map +1 -0
- package/dist/agent/chat/relative-time.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-feed-row.d.ts +18 -16
- package/dist/agent/chat/thread-feed-row.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-feed-row.js +12 -11
- package/dist/{agent-chat → agent/chat}/thread-feed.d.ts +8 -8
- package/dist/agent/chat/thread-feed.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-feed.js +12 -10
- package/dist/{agent-chat → agent/chat}/thread-message.d.ts +12 -9
- package/dist/agent/chat/thread-message.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-message.js +15 -13
- package/dist/{agent-chat → agent/chat}/thread-outcome-card.d.ts +2 -2
- package/dist/agent/chat/thread-outcome-card.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-outcome-card.js +3 -3
- package/dist/{agent-chat → agent/chat}/tool-chip.d.ts +5 -5
- package/dist/agent/chat/tool-chip.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/tool-chip.js +4 -4
- package/dist/agent/chat/use-keyboard-inset.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/use-keyboard-inset.js +1 -1
- package/dist/{agent-chat → agent/chat}/virtualize.d.ts +7 -7
- package/dist/agent/chat/virtualize.d.ts.map +1 -0
- package/dist/agent/error.d.ts +31 -0
- package/dist/agent/error.d.ts.map +1 -0
- package/dist/agent/error.js +18 -0
- package/dist/agent/history.d.ts +2 -36
- package/dist/agent/history.d.ts.map +1 -1
- package/dist/agent/history.js +0 -32
- package/dist/agent/id.d.ts +4 -5
- package/dist/agent/id.d.ts.map +1 -1
- package/dist/agent/index.d.ts +19 -52
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +10 -32
- package/dist/agent/outcome.d.ts +3 -14
- package/dist/agent/outcome.d.ts.map +1 -1
- package/dist/agent/outcome.js +0 -30
- package/dist/agent/part-list.d.ts +3 -3
- package/dist/agent/part-list.d.ts.map +1 -1
- package/dist/agent/parts.d.ts +23 -24
- package/dist/agent/parts.d.ts.map +1 -1
- package/dist/agent/run-committer.d.ts +23 -0
- package/dist/agent/run-committer.d.ts.map +1 -0
- package/dist/agent/run-committer.js +41 -0
- package/dist/agent/run-records.d.ts +77 -0
- package/dist/agent/run-records.d.ts.map +1 -0
- package/dist/agent/run-records.js +69 -0
- package/dist/agent/thread.d.ts +23 -47
- package/dist/agent/thread.d.ts.map +1 -1
- package/dist/agent/thread.js +3 -134
- package/dist/agent/transport.d.ts +6 -69
- package/dist/agent/transport.d.ts.map +1 -1
- package/dist/agent/transport.js +0 -18
- package/dist/agent/use-agent-thread-runs.d.ts +63 -26
- package/dist/agent/use-agent-thread-runs.d.ts.map +1 -1
- package/dist/agent/use-agent-thread-runs.js +202 -66
- package/dist/charts/BandStrip.d.ts +46 -0
- package/dist/charts/BandStrip.d.ts.map +1 -0
- package/dist/charts/BandStrip.js +151 -0
- package/dist/charts/Bars.d.ts +19 -0
- package/dist/charts/Bars.d.ts.map +1 -0
- package/dist/charts/Bars.js +77 -0
- package/dist/charts/CartesianChart.d.ts +57 -0
- package/dist/charts/CartesianChart.d.ts.map +1 -0
- package/dist/charts/CartesianChart.js +121 -0
- package/dist/charts/ChartCard.d.ts +34 -0
- package/dist/charts/ChartCard.d.ts.map +1 -0
- package/dist/charts/ChartCard.js +115 -0
- package/dist/charts/Donut.d.ts +25 -0
- package/dist/charts/Donut.d.ts.map +1 -0
- package/dist/charts/Donut.js +191 -0
- package/dist/charts/DualPanel.d.ts +47 -0
- package/dist/charts/DualPanel.d.ts.map +1 -0
- package/dist/charts/DualPanel.js +214 -0
- package/dist/charts/Heatmap.d.ts +41 -0
- package/dist/charts/Heatmap.d.ts.map +1 -0
- package/dist/charts/Heatmap.js +216 -0
- package/dist/charts/Lines.d.ts +11 -0
- package/dist/charts/Lines.d.ts.map +1 -0
- package/dist/charts/Lines.js +114 -0
- package/dist/charts/MirroredBars.d.ts +44 -0
- package/dist/charts/MirroredBars.d.ts.map +1 -0
- package/dist/charts/MirroredBars.js +190 -0
- package/dist/charts/Sparkline.d.ts +22 -0
- package/dist/charts/Sparkline.d.ts.map +1 -0
- package/dist/charts/Sparkline.js +129 -0
- package/dist/charts/StackedArea.d.ts +15 -0
- package/dist/charts/StackedArea.d.ts.map +1 -0
- package/dist/charts/StackedArea.js +46 -0
- package/dist/charts/box.d.ts +38 -0
- package/dist/charts/box.d.ts.map +1 -0
- package/dist/charts/box.js +72 -0
- package/dist/charts/card-context.d.ts +3 -0
- package/dist/charts/card-context.d.ts.map +1 -0
- package/dist/charts/card-context.js +7 -0
- package/dist/charts/chart-box.module.css +64 -0
- package/{src/content/article-card.module.css.d.ts → dist/charts/chart-box.module.css.d.ts} +5 -9
- package/dist/charts/chart-card.module.css +25 -0
- package/dist/{dashboard/widget-grid.module.css.d.ts → charts/chart-card.module.css.d.ts} +1 -3
- package/dist/charts/chart-legend.module.css +38 -0
- package/{src/dashboard/widget-grid.module.css.d.ts → dist/charts/chart-legend.module.css.d.ts} +3 -3
- package/dist/charts/compile.d.ts +62 -0
- package/dist/charts/compile.d.ts.map +1 -0
- package/dist/charts/compile.js +386 -0
- package/dist/charts/cursor.d.ts +50 -0
- package/dist/charts/cursor.d.ts.map +1 -0
- package/dist/charts/cursor.js +157 -0
- package/dist/charts/curves.d.ts +12 -0
- package/dist/charts/curves.d.ts.map +1 -0
- package/dist/charts/curves.js +86 -0
- package/dist/charts/donut.module.css +54 -0
- package/dist/{content/article-card.module.css.d.ts → charts/donut.module.css.d.ts} +2 -9
- package/dist/charts/host.d.ts +17 -0
- package/dist/charts/host.d.ts.map +1 -0
- package/dist/charts/host.js +35 -0
- package/dist/charts/index.d.ts +18 -53
- package/dist/charts/index.d.ts.map +1 -1
- package/dist/charts/index.js +17 -189
- package/dist/charts/legend.d.ts +23 -0
- package/dist/charts/legend.d.ts.map +1 -0
- package/dist/charts/legend.js +160 -0
- package/dist/charts/marks.d.ts +25 -0
- package/dist/charts/marks.d.ts.map +1 -0
- package/dist/charts/marks.js +128 -0
- package/dist/charts/panel.d.ts +56 -0
- package/dist/charts/panel.d.ts.map +1 -0
- package/dist/charts/panel.js +123 -0
- package/dist/charts/scales.d.ts +44 -0
- package/dist/charts/scales.d.ts.map +1 -0
- package/dist/charts/scales.js +163 -0
- package/dist/charts/sizing.d.ts +12 -0
- package/dist/charts/sizing.d.ts.map +1 -0
- package/dist/charts/sizing.js +33 -0
- package/dist/charts/state.d.ts +17 -0
- package/dist/charts/state.d.ts.map +1 -0
- package/dist/charts/state.js +53 -0
- package/dist/charts/theme.d.ts +38 -19
- package/dist/charts/theme.d.ts.map +1 -1
- package/dist/charts/theme.js +48 -26
- package/dist/charts/types.d.ts +227 -0
- package/dist/charts/types.d.ts.map +1 -0
- package/dist/charts/types.js +4 -0
- package/dist/cli/audit-allows.d.ts +4 -17
- package/dist/cli/audit-allows.d.ts.map +1 -1
- package/dist/cli/config.d.ts +18 -43
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +6 -0
- package/dist/cli/doctor-upgrade.d.ts +43 -0
- package/dist/cli/doctor-upgrade.d.ts.map +1 -0
- package/dist/cli/doctor-upgrade.js +314 -0
- package/dist/cli/doctor.d.ts +14 -29
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +58 -9
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +2 -4
- package/dist/cli/index.d.ts +48 -172
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +39 -132
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +43 -37
- package/dist/cli/sync.d.ts +5 -21
- package/dist/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js +4 -23
- package/dist/cli/tokens-css.d.ts +7 -28
- package/dist/cli/tokens-css.d.ts.map +1 -1
- package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
- package/dist/commands/ShortcutsHelp.js +4 -5
- package/dist/commands/define-commands.d.ts +15 -31
- package/dist/commands/define-commands.d.ts.map +1 -1
- package/dist/commands/define-commands.js +1 -11
- package/dist/commands/define-overlays.d.ts +5 -19
- package/dist/commands/define-overlays.d.ts.map +1 -1
- package/dist/commands/define-overlays.js +3 -11
- package/dist/commands/index.d.ts +10 -40
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +9 -46
- package/dist/{notifications → commands/notifications}/bell.d.ts +1 -1
- package/dist/commands/notifications/bell.d.ts.map +1 -0
- package/dist/{notifications → commands/notifications}/center.d.ts +2 -2
- package/dist/commands/notifications/center.d.ts.map +1 -0
- package/dist/{notifications → commands/notifications}/center.js +2 -2
- package/dist/{notifications → commands/notifications}/define-notifications.d.ts +3 -3
- package/dist/commands/notifications/define-notifications.d.ts.map +1 -0
- package/dist/commands/notifications/notify.d.ts +44 -0
- package/dist/commands/notifications/notify.d.ts.map +1 -0
- package/dist/commands/notifications/notify.js +79 -0
- package/dist/{notifications → commands/notifications}/store.d.ts +2 -0
- package/dist/commands/notifications/store.d.ts.map +1 -0
- package/dist/{notifications → commands/notifications}/store.js +4 -0
- package/dist/commands/projectors.d.ts +1 -131
- package/dist/commands/projectors.d.ts.map +1 -1
- package/dist/commands/projectors.js +2 -73
- package/dist/commands/shell-bridge.d.ts +3 -3
- package/dist/commands/shortcut-format.d.ts +5 -4
- package/dist/commands/shortcut-format.d.ts.map +1 -1
- package/dist/common/errors.d.ts +3 -3
- package/dist/common/use-measured-widths.d.ts.map +1 -1
- package/dist/common/use-measured-widths.js +5 -3
- package/dist/common/validate.d.ts +2 -2
- package/dist/content/article-layout.d.ts.map +1 -1
- package/dist/content/article-layout.js +3 -3
- package/dist/content/article-model.d.ts +1 -46
- package/dist/content/article-model.d.ts.map +1 -1
- package/dist/content/article-model.js +1 -29
- package/dist/content/index.d.ts +11 -41
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +3 -35
- package/dist/content/markdown.d.ts +1 -1
- package/dist/content/markdown.d.ts.map +1 -1
- package/dist/content/markdown.js +1 -1
- package/dist/content/mermaid.d.ts.map +1 -1
- package/dist/content/mermaid.js +7 -7
- package/dist/content/slug.d.ts +1 -8
- package/dist/content/slug.d.ts.map +1 -1
- package/dist/content/slug.js +1 -8
- package/dist/content/url-hardening.d.ts +2 -2
- package/dist/content/url-hardening.d.ts.map +1 -1
- package/dist/content/url-hardening.js +2 -0
- package/dist/controls/actions.d.ts +16 -1
- package/dist/controls/actions.d.ts.map +1 -1
- package/dist/controls/enum-filter.d.ts +1 -1
- package/dist/controls/enum-filter.d.ts.map +1 -1
- package/dist/controls/filter-context.d.ts.map +1 -1
- package/dist/controls/filter-context.js +3 -1
- package/dist/controls/filter-set.js +4 -6
- package/dist/controls/form-layout.d.ts +1 -1
- package/dist/controls/form-layout.d.ts.map +1 -1
- package/dist/controls/form-layout.js +1 -1
- package/dist/controls/glyphs.d.ts +0 -2
- package/dist/controls/glyphs.d.ts.map +1 -1
- package/dist/controls/glyphs.js +0 -7
- package/dist/controls/index.d.ts +12 -17
- package/dist/controls/index.d.ts.map +1 -1
- package/dist/controls/index.js +5 -39
- package/dist/controls/multi-select-filter.d.ts +4 -3
- package/dist/controls/multi-select-filter.d.ts.map +1 -1
- package/dist/controls/number-filter.d.ts +4 -3
- package/dist/controls/number-filter.d.ts.map +1 -1
- package/dist/controls/number-filter.js +3 -1
- package/dist/controls/range-filter.d.ts +4 -3
- package/dist/controls/range-filter.d.ts.map +1 -1
- package/dist/controls/search-filter.d.ts +4 -3
- package/dist/controls/search-filter.d.ts.map +1 -1
- package/dist/controls/search-filter.js +19 -14
- package/dist/controls/select-filter.d.ts +4 -3
- package/dist/controls/select-filter.d.ts.map +1 -1
- package/dist/controls/sync-button.d.ts.map +1 -1
- package/dist/controls/sync-button.js +12 -15
- package/dist/controls/toggle-filter.d.ts +4 -3
- package/dist/controls/toggle-filter.d.ts.map +1 -1
- package/dist/controls/uncontrolled.d.ts +12 -0
- package/dist/controls/uncontrolled.d.ts.map +1 -0
- package/dist/controls/view-tabs.d.ts +2 -2
- package/dist/controls/view-tabs.d.ts.map +1 -1
- package/dist/controls-dates/index.d.ts +0 -1
- package/dist/controls-dates/index.d.ts.map +1 -1
- package/dist/dashboard/index.d.ts +7 -9
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/index.js +3 -23
- package/dist/dashboard/section.d.ts +4 -6
- package/dist/dashboard/section.d.ts.map +1 -1
- package/dist/dashboard/section.js +4 -10
- package/dist/dashboard/stat-card.d.ts +4 -4
- package/dist/dashboard/stat-card.d.ts.map +1 -1
- package/dist/dashboard/stat-card.js +3 -3
- package/dist/dashboard/widget-header.module.css +9 -7
- package/dist/dev-dock.d.ts.map +1 -1
- package/dist/dev-dock.js +6 -1
- package/dist/format/date.d.ts +0 -34
- package/dist/format/date.d.ts.map +1 -1
- package/dist/format/date.js +0 -54
- package/dist/format/index.d.ts +7 -22
- package/dist/format/index.d.ts.map +1 -1
- package/dist/format/index.js +2 -43
- package/dist/format/number.d.ts +3 -14
- package/dist/format/number.d.ts.map +1 -1
- package/dist/format/number.js +0 -13
- package/dist/format/shared.d.ts +2 -3
- package/dist/format/shared.d.ts.map +1 -1
- package/dist/forms/index.d.ts +0 -11
- package/dist/forms/index.d.ts.map +1 -1
- package/dist/forms/index.js +1 -14
- package/dist/guard/index.d.ts +6 -21
- package/dist/guard/index.d.ts.map +1 -1
- package/dist/guard/index.js +27 -115
- package/dist/guard/types.d.ts +7 -18
- package/dist/guard/types.d.ts.map +1 -1
- package/dist/index.d.ts +16 -48
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -117
- package/dist/provider/create-router.d.ts +44 -0
- package/dist/provider/create-router.d.ts.map +1 -0
- package/dist/provider/create-router.js +62 -0
- package/dist/provider/hotkeys.d.ts +8 -0
- package/dist/provider/hotkeys.d.ts.map +1 -0
- package/dist/provider/hotkeys.js +50 -0
- package/dist/provider/index.d.ts +33 -110
- package/dist/provider/index.d.ts.map +1 -1
- package/dist/provider/index.js +182 -82
- package/dist/provider/lab-theme.d.ts.map +1 -1
- package/dist/provider/route-transition.d.ts +76 -0
- package/dist/provider/route-transition.d.ts.map +1 -0
- package/dist/provider/route-transition.js +98 -0
- package/dist/provider/spotlight-actions.d.ts +10 -0
- package/dist/provider/spotlight-actions.d.ts.map +1 -0
- package/dist/provider/spotlight-actions.js +55 -0
- package/dist/provider/test-router.d.ts +6 -0
- package/dist/provider/test-router.d.ts.map +1 -0
- package/dist/provider/test-router.js +18 -0
- package/dist/query-client.d.ts +4 -20
- package/dist/query-client.d.ts.map +1 -1
- package/dist/query-client.js +2 -2
- package/dist/router-tanstack/index.d.ts +18 -64
- package/dist/router-tanstack/index.d.ts.map +1 -1
- package/dist/router-tanstack/index.js +2 -16
- package/dist/router-tanstack/nav.d.ts +12 -1
- package/dist/router-tanstack/nav.d.ts.map +1 -1
- package/dist/router-tanstack/nav.js +8 -1
- package/dist/router-tanstack/search-store.d.ts +1 -1
- package/dist/router-tanstack/search-store.d.ts.map +1 -1
- package/dist/router-tanstack/use-nav.d.ts +8 -9
- package/dist/router-tanstack/use-nav.d.ts.map +1 -1
- package/dist/router-tanstack/use-nav.js +20 -1
- package/dist/shell/app-mobile-nav.d.ts.map +1 -1
- package/dist/shell/app-sidebar.js +1 -1
- package/dist/shell/index.d.ts +31 -10
- package/dist/shell/index.d.ts.map +1 -1
- package/dist/shell/index.js +14 -3
- package/dist/shell/page-aside.d.ts +2 -2
- package/dist/shell/page-aside.d.ts.map +1 -1
- package/dist/shell/page-aside.js +31 -12
- package/dist/shell/page-bar.d.ts +2 -2
- package/dist/shell/page-bar.d.ts.map +1 -1
- package/dist/shell/page-bar.js +1 -1
- package/dist/state.d.ts +10 -12
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +4 -6
- package/dist/styles.css +107 -7
- package/dist/surfaces.d.ts +28 -103
- package/dist/surfaces.d.ts.map +1 -1
- package/dist/surfaces.js +54 -143
- package/dist/{data → table}/data-table-state.d.ts +1 -1
- package/dist/table/data-table-state.d.ts.map +1 -0
- package/dist/{data → table}/data-table-state.js +4 -3
- package/dist/{data → table}/data-table.d.ts +28 -49
- package/dist/table/data-table.d.ts.map +1 -0
- package/dist/{data → table}/data-table.js +74 -60
- package/dist/table/index.d.ts +18 -0
- package/dist/table/index.d.ts.map +1 -0
- package/dist/{data/table.js → table/index.js} +1 -1
- package/dist/table/query-branch.d.ts.map +1 -0
- package/dist/table/table-features.d.ts +69 -0
- package/dist/table/table-features.d.ts.map +1 -0
- package/dist/table/table-features.js +49 -0
- package/dist/telemetry.d.ts +77 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +33 -0
- package/dist/theme/index.d.ts +10 -21
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +3 -14
- package/dist/theme/theme-toggle.d.ts.map +1 -1
- package/dist/theme/theme-toggle.js +7 -33
- package/dist/theme/theme-toggle.module.css +30 -0
- package/dist/theme/theme-toggle.module.css.d.ts +10 -0
- package/dist/theme-lab/derive-controls.d.ts.map +1 -1
- package/dist/theme-lab/derive-controls.js +5 -3
- package/dist/theme-lab/derive-state.d.ts.map +1 -1
- package/dist/theme-lab/derive-state.js +2 -1
- package/dist/tokens/core.d.ts +360 -0
- package/dist/tokens/core.d.ts.map +1 -0
- package/dist/tokens/core.js +708 -0
- package/dist/tokens/derive.d.ts +1 -1
- package/dist/tokens/derive.d.ts.map +1 -1
- package/dist/tokens/index.d.ts +5 -373
- package/dist/tokens/index.d.ts.map +1 -1
- package/dist/tokens/index.js +8 -700
- package/dist/tokens/palette.d.ts +2 -6
- package/dist/tokens/palette.d.ts.map +1 -1
- package/dist/tokens/palette.js +1 -4
- package/dist/vite.d.ts +4 -3
- package/dist/vite.d.ts.map +1 -1
- package/llms.txt +43 -85
- package/package.json +80 -173
- package/src/agent/ai-sdk-transport.ts +57 -37
- package/src/{agent-chat → agent/chat}/composer.tsx +29 -30
- package/src/{agent-chat → agent/chat}/message-affordances.ts +8 -5
- package/src/{agent-chat → agent/chat}/thread-feed-row.tsx +30 -35
- package/src/{agent-chat → agent/chat}/thread-feed.tsx +40 -35
- package/src/{agent-chat → agent/chat}/thread-message.tsx +37 -35
- package/src/{agent-chat → agent/chat}/thread-outcome-card.tsx +5 -5
- package/src/{agent-chat → agent/chat}/tool-chip.tsx +12 -12
- package/src/{agent-chat → agent/chat}/use-keyboard-inset.ts +1 -1
- package/src/{agent-chat → agent/chat}/virtualize.ts +5 -5
- package/src/agent/error.ts +43 -0
- package/src/agent/history.ts +2 -107
- package/src/agent/id.ts +4 -5
- package/src/agent/index.ts +23 -112
- package/src/agent/outcome.ts +3 -56
- package/src/agent/part-list.tsx +3 -3
- package/src/agent/parts.ts +23 -22
- package/src/agent/run-committer.ts +64 -0
- package/src/agent/run-records.ts +147 -0
- package/src/agent/thread.ts +24 -231
- package/src/agent/transport.ts +6 -96
- package/src/agent/use-agent-thread-runs.ts +364 -199
- package/src/charts/BandStrip.tsx +276 -0
- package/src/charts/Bars.tsx +141 -0
- package/src/charts/CartesianChart.tsx +206 -0
- package/src/charts/ChartCard.tsx +178 -0
- package/src/charts/Donut.tsx +256 -0
- package/src/charts/DualPanel.tsx +326 -0
- package/src/charts/Heatmap.tsx +282 -0
- package/src/charts/Lines.tsx +151 -0
- package/src/charts/MirroredBars.tsx +303 -0
- package/src/charts/Sparkline.tsx +176 -0
- package/src/charts/StackedArea.tsx +80 -0
- package/src/charts/box.tsx +96 -0
- package/src/charts/card-context.ts +11 -0
- package/src/charts/chart-box.module.css +64 -0
- package/src/charts/chart-box.module.css.d.ts +12 -0
- package/src/charts/chart-card.module.css +25 -0
- package/src/charts/chart-card.module.css.d.ts +8 -0
- package/src/charts/chart-legend.module.css +38 -0
- package/src/charts/chart-legend.module.css.d.ts +10 -0
- package/src/charts/compile.ts +585 -0
- package/src/charts/cursor.ts +282 -0
- package/src/charts/curves.ts +111 -0
- package/src/charts/donut.module.css +54 -0
- package/src/charts/donut.module.css.d.ts +9 -0
- package/src/charts/host.tsx +60 -0
- package/src/charts/index.ts +41 -178
- package/src/charts/legend.tsx +204 -0
- package/src/charts/marks.ts +201 -0
- package/src/charts/panel.tsx +227 -0
- package/src/charts/scales.ts +237 -0
- package/src/charts/sizing.ts +47 -0
- package/src/charts/state.tsx +80 -0
- package/src/charts/theme.ts +65 -0
- package/src/charts/types.ts +242 -0
- package/src/cli/audit-allows.ts +8 -30
- package/src/cli/config.ts +26 -43
- package/src/cli/doctor-upgrade.ts +457 -0
- package/src/cli/doctor.ts +89 -72
- package/src/cli/help.ts +2 -4
- package/src/cli/index.ts +100 -384
- package/src/cli/init.ts +60 -51
- package/src/cli/sync.ts +13 -68
- package/src/cli/tokens-css.ts +7 -28
- package/src/commands/ShortcutsHelp.tsx +8 -9
- package/src/commands/define-commands.ts +16 -43
- package/src/commands/define-overlays.ts +12 -36
- package/src/commands/index.ts +11 -94
- package/src/{notifications → commands/notifications}/bell.tsx +2 -2
- package/src/{notifications → commands/notifications}/center.tsx +7 -5
- package/src/{notifications → commands/notifications}/define-notifications.ts +3 -3
- package/src/commands/notifications/notify.tsx +158 -0
- package/src/{notifications → commands/notifications}/store.ts +10 -2
- package/src/commands/projectors.ts +5 -225
- package/src/commands/shell-bridge.ts +5 -5
- package/src/commands/shortcut-format.ts +5 -4
- package/src/common/errors.ts +3 -3
- package/src/common/use-measured-widths.ts +6 -3
- package/src/common/validate.ts +2 -2
- package/src/content/article-layout.tsx +37 -38
- package/src/content/article-model.ts +1 -84
- package/src/content/index.ts +12 -83
- package/src/content/markdown.tsx +4 -3
- package/src/content/mermaid.tsx +9 -7
- package/src/content/slug.ts +1 -16
- package/src/content/url-hardening.ts +8 -2
- package/src/controls/actions.tsx +24 -1
- package/src/controls/enum-filter.tsx +1 -1
- package/src/controls/filter-context.tsx +3 -1
- package/src/controls/filter-set.tsx +5 -7
- package/src/controls/form-layout.tsx +2 -2
- package/src/controls/glyphs.tsx +0 -10
- package/src/controls/index.ts +13 -64
- package/src/controls/multi-select-filter.tsx +5 -4
- package/src/controls/number-filter.tsx +8 -4
- package/src/controls/range-filter.tsx +5 -4
- package/src/controls/search-filter.tsx +25 -19
- package/src/controls/select-filter.tsx +5 -4
- package/src/controls/sync-button.tsx +18 -20
- package/src/controls/toggle-filter.tsx +5 -4
- package/src/controls/uncontrolled.ts +12 -0
- package/src/controls/view-tabs.tsx +3 -3
- package/src/controls-dates/date-range-picker.tsx +1 -1
- package/src/controls-dates/index.ts +0 -1
- package/src/dashboard/index.ts +7 -48
- package/src/dashboard/section.tsx +11 -40
- package/src/dashboard/stat-card.tsx +14 -16
- package/src/dashboard/widget-header.module.css +9 -7
- package/src/dev-dock.tsx +14 -27
- package/src/format/date.ts +2 -92
- package/src/format/index.ts +7 -53
- package/src/format/number.ts +3 -26
- package/src/format/shared.ts +2 -3
- package/src/forms/index.ts +0 -23
- package/src/guard/index.ts +36 -191
- package/src/guard/types.ts +6 -19
- package/src/index.ts +30 -282
- package/src/provider/create-router.tsx +138 -0
- package/src/provider/hotkeys.ts +70 -0
- package/src/provider/index.tsx +260 -230
- package/src/provider/lab-theme.ts +3 -2
- package/src/provider/route-transition.ts +199 -0
- package/src/provider/spotlight-actions.tsx +69 -0
- package/src/provider/test-router.tsx +25 -0
- package/src/query-client.ts +4 -22
- package/src/router-tanstack/index.ts +18 -112
- package/src/router-tanstack/nav.ts +28 -2
- package/src/router-tanstack/search-store.ts +9 -2
- package/src/router-tanstack/use-nav.ts +47 -13
- package/src/shell/app-mobile-nav.tsx +3 -2
- package/src/shell/app-sidebar.tsx +1 -1
- package/src/shell/aside-docking.ts +1 -1
- package/src/shell/index.tsx +61 -20
- package/src/shell/page-aside.tsx +47 -23
- package/src/shell/page-bar.tsx +3 -3
- package/src/shell/page-title.tsx +1 -1
- package/src/state.ts +11 -37
- package/src/styles.css +107 -7
- package/src/surfaces.ts +56 -151
- package/src/{data → table}/data-table-state.ts +5 -4
- package/src/{data → table}/data-table.tsx +170 -161
- package/src/table/index.ts +18 -0
- package/src/table/table-features.ts +102 -0
- package/src/telemetry.ts +110 -0
- package/src/theme/index.ts +22 -47
- package/src/theme/theme-toggle.module.css +30 -0
- package/src/theme/theme-toggle.module.css.d.ts +10 -0
- package/src/theme/theme-toggle.tsx +15 -43
- package/src/theme-lab/derive-controls.tsx +5 -3
- package/src/theme-lab/derive-state.ts +2 -1
- package/src/tokens/core.ts +1163 -0
- package/src/tokens/derive.ts +1 -1
- package/src/tokens/index.ts +14 -1181
- package/src/tokens/palette.ts +3 -7
- package/src/vite.ts +3 -3
- package/agent/templates/query-client.ts.tpl +0 -26
- package/dist/agent/adapter.d.ts +0 -150
- package/dist/agent/adapter.d.ts.map +0 -1
- package/dist/agent/adapter.js +0 -482
- package/dist/agent/use-agent-stream.d.ts +0 -35
- package/dist/agent/use-agent-stream.d.ts.map +0 -1
- package/dist/agent/use-agent-stream.js +0 -59
- package/dist/agent-chat/composer.d.ts.map +0 -1
- package/dist/agent-chat/index.d.ts +0 -31
- package/dist/agent-chat/index.d.ts.map +0 -1
- package/dist/agent-chat/index.js +0 -19
- package/dist/agent-chat/message-affordances.d.ts.map +0 -1
- package/dist/agent-chat/relative-time.d.ts.map +0 -1
- package/dist/agent-chat/thread-detail-panel.d.ts +0 -28
- package/dist/agent-chat/thread-detail-panel.d.ts.map +0 -1
- package/dist/agent-chat/thread-detail-panel.js +0 -115
- package/dist/agent-chat/thread-feed-row.d.ts.map +0 -1
- package/dist/agent-chat/thread-feed.d.ts.map +0 -1
- package/dist/agent-chat/thread-message.d.ts.map +0 -1
- package/dist/agent-chat/thread-outcome-card.d.ts.map +0 -1
- package/dist/agent-chat/thread-workspace.d.ts +0 -44
- package/dist/agent-chat/thread-workspace.d.ts.map +0 -1
- package/dist/agent-chat/thread-workspace.js +0 -153
- package/dist/agent-chat/tool-chip.d.ts.map +0 -1
- package/dist/agent-chat/use-keyboard-inset.d.ts.map +0 -1
- package/dist/agent-chat/virtualize.d.ts.map +0 -1
- package/dist/charts/cursor/resolve.d.ts +0 -75
- package/dist/charts/cursor/resolve.d.ts.map +0 -1
- package/dist/charts/cursor/resolve.js +0 -91
- package/dist/charts/cursor/scope.d.ts +0 -20
- package/dist/charts/cursor/scope.d.ts.map +0 -1
- package/dist/charts/cursor/scope.js +0 -20
- package/dist/charts/cursor/store.d.ts +0 -35
- package/dist/charts/cursor/store.d.ts.map +0 -1
- package/dist/charts/cursor/store.js +0 -25
- package/dist/charts/cursor/touch-pin.d.ts +0 -45
- package/dist/charts/cursor/touch-pin.d.ts.map +0 -1
- package/dist/charts/cursor/touch-pin.js +0 -79
- package/dist/charts/hooks/use-discrete-cursor.d.ts +0 -66
- package/dist/charts/hooks/use-discrete-cursor.d.ts.map +0 -1
- package/dist/charts/hooks/use-discrete-cursor.js +0 -198
- package/dist/charts/hooks/use-hysteresis.d.ts +0 -18
- package/dist/charts/hooks/use-hysteresis.d.ts.map +0 -1
- package/dist/charts/hooks/use-hysteresis.js +0 -12
- package/dist/charts/hooks/useBandPlot.d.ts +0 -145
- package/dist/charts/hooks/useBandPlot.d.ts.map +0 -1
- package/dist/charts/hooks/useBandPlot.js +0 -178
- package/dist/charts/hooks/useChartCursor.d.ts +0 -75
- package/dist/charts/hooks/useChartCursor.d.ts.map +0 -1
- package/dist/charts/hooks/useChartCursor.js +0 -200
- package/dist/charts/hooks/useChartSize.d.ts +0 -29
- package/dist/charts/hooks/useChartSize.d.ts.map +0 -1
- package/dist/charts/hooks/useChartSize.js +0 -8
- package/dist/charts/kinds/BandStrip.d.ts +0 -132
- package/dist/charts/kinds/BandStrip.d.ts.map +0 -1
- package/dist/charts/kinds/BandStrip.js +0 -241
- package/dist/charts/kinds/Bars.d.ts +0 -141
- package/dist/charts/kinds/Bars.d.ts.map +0 -1
- package/dist/charts/kinds/Bars.js +0 -343
- package/dist/charts/kinds/Donut.d.ts +0 -77
- package/dist/charts/kinds/Donut.d.ts.map +0 -1
- package/dist/charts/kinds/Donut.js +0 -245
- package/dist/charts/kinds/DualPanel.d.ts +0 -111
- package/dist/charts/kinds/DualPanel.d.ts.map +0 -1
- package/dist/charts/kinds/DualPanel.js +0 -471
- package/dist/charts/kinds/Heatmap.d.ts +0 -85
- package/dist/charts/kinds/Heatmap.d.ts.map +0 -1
- package/dist/charts/kinds/Heatmap.js +0 -243
- package/dist/charts/kinds/MirroredBars.d.ts +0 -98
- package/dist/charts/kinds/MirroredBars.d.ts.map +0 -1
- package/dist/charts/kinds/MirroredBars.js +0 -292
- package/dist/charts/kinds/MultiLine.d.ts +0 -87
- package/dist/charts/kinds/MultiLine.d.ts.map +0 -1
- package/dist/charts/kinds/MultiLine.js +0 -176
- package/dist/charts/kinds/StackedArea.d.ts +0 -73
- package/dist/charts/kinds/StackedArea.d.ts.map +0 -1
- package/dist/charts/kinds/StackedArea.js +0 -135
- package/dist/charts/kinds/ZonedLine.d.ts +0 -97
- package/dist/charts/kinds/ZonedLine.d.ts.map +0 -1
- package/dist/charts/kinds/ZonedLine.js +0 -155
- package/dist/charts/kinds/band-chrome.d.ts +0 -31
- package/dist/charts/kinds/band-chrome.d.ts.map +0 -1
- package/dist/charts/kinds/band-chrome.js +0 -71
- package/dist/charts/kinds/donut-layout.d.ts +0 -47
- package/dist/charts/kinds/donut-layout.d.ts.map +0 -1
- package/dist/charts/kinds/donut-layout.js +0 -52
- package/dist/charts/layout/auto-margin.d.ts +0 -122
- package/dist/charts/layout/auto-margin.d.ts.map +0 -1
- package/dist/charts/layout/auto-margin.js +0 -81
- package/dist/charts/layout/end-labels.d.ts +0 -64
- package/dist/charts/layout/end-labels.d.ts.map +0 -1
- package/dist/charts/layout/end-labels.js +0 -76
- package/dist/charts/layout/log-ticks.d.ts +0 -27
- package/dist/charts/layout/log-ticks.d.ts.map +0 -1
- package/dist/charts/layout/log-ticks.js +0 -42
- package/dist/charts/primitives/AreaGradient.d.ts +0 -18
- package/dist/charts/primitives/AreaGradient.d.ts.map +0 -1
- package/dist/charts/primitives/AreaGradient.js +0 -13
- package/dist/charts/primitives/Axes.d.ts +0 -83
- package/dist/charts/primitives/Axes.d.ts.map +0 -1
- package/dist/charts/primitives/Axes.js +0 -168
- package/dist/charts/primitives/CartesianChart.d.ts +0 -257
- package/dist/charts/primitives/CartesianChart.d.ts.map +0 -1
- package/dist/charts/primitives/CartesianChart.js +0 -549
- package/dist/charts/primitives/ChartCard.d.ts +0 -66
- package/dist/charts/primitives/ChartCard.d.ts.map +0 -1
- package/dist/charts/primitives/ChartCard.js +0 -143
- package/dist/charts/primitives/ChartFrame.d.ts +0 -156
- package/dist/charts/primitives/ChartFrame.d.ts.map +0 -1
- package/dist/charts/primitives/ChartFrame.js +0 -241
- package/dist/charts/primitives/ChartLegend.d.ts +0 -67
- package/dist/charts/primitives/ChartLegend.d.ts.map +0 -1
- package/dist/charts/primitives/ChartLegend.js +0 -292
- package/dist/charts/primitives/ChartPending.d.ts +0 -113
- package/dist/charts/primitives/ChartPending.d.ts.map +0 -1
- package/dist/charts/primitives/ChartPending.js +0 -117
- package/dist/charts/primitives/ChartTooltip.d.ts +0 -59
- package/dist/charts/primitives/ChartTooltip.d.ts.map +0 -1
- package/dist/charts/primitives/ChartTooltip.js +0 -197
- package/dist/charts/primitives/Crosshair.d.ts +0 -26
- package/dist/charts/primitives/Crosshair.d.ts.map +0 -1
- package/dist/charts/primitives/Crosshair.js +0 -23
- package/dist/charts/primitives/HatchPattern.d.ts +0 -31
- package/dist/charts/primitives/HatchPattern.d.ts.map +0 -1
- package/dist/charts/primitives/HatchPattern.js +0 -31
- package/dist/charts/primitives/HoverOverlay.d.ts +0 -45
- package/dist/charts/primitives/HoverOverlay.d.ts.map +0 -1
- package/dist/charts/primitives/HoverOverlay.js +0 -72
- package/dist/charts/primitives/HoverOverlay.module.css +0 -13
- package/dist/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
- package/dist/charts/primitives/XZoneRects.d.ts +0 -54
- package/dist/charts/primitives/XZoneRects.d.ts.map +0 -1
- package/dist/charts/primitives/XZoneRects.js +0 -65
- package/dist/charts/primitives/ZoneRects.d.ts +0 -38
- package/dist/charts/primitives/ZoneRects.d.ts.map +0 -1
- package/dist/charts/primitives/ZoneRects.js +0 -30
- package/dist/charts/primitives/chart-card-context.d.ts +0 -33
- package/dist/charts/primitives/chart-card-context.d.ts.map +0 -1
- package/dist/charts/primitives/chart-card-context.js +0 -18
- package/dist/charts/primitives/chart-frame-layout.d.ts +0 -185
- package/dist/charts/primitives/chart-frame-layout.d.ts.map +0 -1
- package/dist/charts/primitives/chart-frame-layout.js +0 -175
- package/dist/charts/primitives/chart-layout.d.ts +0 -112
- package/dist/charts/primitives/chart-layout.d.ts.map +0 -1
- package/dist/charts/primitives/chart-layout.js +0 -175
- package/dist/charts/primitives/chart-tier.d.ts +0 -16
- package/dist/charts/primitives/chart-tier.d.ts.map +0 -1
- package/dist/charts/primitives/chart-tier.js +0 -44
- package/dist/charts/primitives/legend-disclosure.d.ts +0 -27
- package/dist/charts/primitives/legend-disclosure.d.ts.map +0 -1
- package/dist/charts/primitives/legend-disclosure.js +0 -153
- package/dist/charts/series.d.ts +0 -189
- package/dist/charts/series.d.ts.map +0 -1
- package/dist/charts/series.js +0 -84
- package/dist/charts/sparklines/BarSparkline.d.ts +0 -37
- package/dist/charts/sparklines/BarSparkline.d.ts.map +0 -1
- package/dist/charts/sparklines/BarSparkline.js +0 -53
- package/dist/charts/sparklines/LineSparkline.d.ts +0 -15
- package/dist/charts/sparklines/LineSparkline.d.ts.map +0 -1
- package/dist/charts/sparklines/LineSparkline.js +0 -51
- package/dist/charts/sparklines/index.d.ts +0 -3
- package/dist/charts/sparklines/index.d.ts.map +0 -1
- package/dist/charts/sparklines/index.js +0 -6
- package/dist/charts/utils/domain.d.ts +0 -35
- package/dist/charts/utils/domain.d.ts.map +0 -1
- package/dist/charts/utils/domain.js +0 -12
- package/dist/charts/utils/format.d.ts +0 -8
- package/dist/charts/utils/format.d.ts.map +0 -1
- package/dist/charts/utils/format.js +0 -20
- package/dist/charts/utils/measure-text.d.ts +0 -25
- package/dist/charts/utils/measure-text.d.ts.map +0 -1
- package/dist/charts/utils/measure-text.js +0 -64
- package/dist/charts/utils/ticks.d.ts +0 -103
- package/dist/charts/utils/ticks.d.ts.map +0 -1
- package/dist/charts/utils/ticks.js +0 -92
- package/dist/commands/overlays-mount.d.ts +0 -122
- package/dist/commands/overlays-mount.d.ts.map +0 -1
- package/dist/commands/overlays-mount.js +0 -125
- package/dist/commands/useCommandHotkeys.d.ts +0 -14
- package/dist/commands/useCommandHotkeys.d.ts.map +0 -1
- package/dist/commands/useCommandHotkeys.js +0 -45
- package/dist/content/article-actions.d.ts +0 -39
- package/dist/content/article-actions.d.ts.map +0 -1
- package/dist/content/article-actions.js +0 -28
- package/dist/content/article-card.d.ts +0 -58
- package/dist/content/article-card.d.ts.map +0 -1
- package/dist/content/article-card.js +0 -79
- package/dist/content/article-card.module.css +0 -111
- package/dist/content/mdx.d.ts +0 -20
- package/dist/content/mdx.d.ts.map +0 -1
- package/dist/content/mdx.js +0 -64
- package/dist/controls/compare-filter.d.ts +0 -42
- package/dist/controls/compare-filter.d.ts.map +0 -1
- package/dist/controls/compare-filter.js +0 -38
- package/dist/controls/slider-control.d.ts +0 -36
- package/dist/controls/slider-control.d.ts.map +0 -1
- package/dist/controls/slider-control.js +0 -64
- package/dist/dashboard/widget-grid.d.ts +0 -27
- package/dist/dashboard/widget-grid.d.ts.map +0 -1
- package/dist/dashboard/widget-grid.js +0 -40
- package/dist/dashboard/widget-grid.module.css +0 -69
- package/dist/data/data-table-state.d.ts.map +0 -1
- package/dist/data/data-table.d.ts.map +0 -1
- package/dist/data/query-branch.d.ts.map +0 -1
- package/dist/data/table.d.ts +0 -24
- package/dist/data/table.d.ts.map +0 -1
- package/dist/data/virtual-list.d.ts +0 -133
- package/dist/data/virtual-list.d.ts.map +0 -1
- package/dist/data/virtual-list.js +0 -157
- package/dist/data/virtual.d.ts +0 -21
- package/dist/data/virtual.d.ts.map +0 -1
- package/dist/data/virtual.js +0 -4
- package/dist/forms/FormErrorSummary.d.ts +0 -30
- package/dist/forms/FormErrorSummary.d.ts.map +0 -1
- package/dist/forms/FormErrorSummary.js +0 -30
- package/dist/forms/use-field-array.d.ts +0 -60
- package/dist/forms/use-field-array.d.ts.map +0 -1
- package/dist/forms/use-field-array.js +0 -20
- package/dist/forms/use-form-draft.d.ts +0 -76
- package/dist/forms/use-form-draft.d.ts.map +0 -1
- package/dist/forms/use-form-draft.js +0 -92
- package/dist/forms/use-form-submit.d.ts +0 -88
- package/dist/forms/use-form-submit.d.ts.map +0 -1
- package/dist/forms/use-form-submit.js +0 -63
- package/dist/notifications/bell.d.ts.map +0 -1
- package/dist/notifications/center.d.ts.map +0 -1
- package/dist/notifications/define-notifications.d.ts.map +0 -1
- package/dist/notifications/index.d.ts +0 -40
- package/dist/notifications/index.d.ts.map +0 -1
- package/dist/notifications/index.js +0 -54
- package/dist/notifications/mount-guard.d.ts +0 -8
- package/dist/notifications/mount-guard.d.ts.map +0 -1
- package/dist/notifications/mount-guard.js +0 -18
- package/dist/notifications/notify.d.ts +0 -149
- package/dist/notifications/notify.d.ts.map +0 -1
- package/dist/notifications/notify.js +0 -171
- package/dist/notifications/store.d.ts.map +0 -1
- package/dist/provider/connectivity-indicator.d.ts +0 -13
- package/dist/provider/connectivity-indicator.d.ts.map +0 -1
- package/dist/provider/connectivity-indicator.js +0 -205
- package/dist/provider/connectivity-provider.d.ts +0 -7
- package/dist/provider/connectivity-provider.d.ts.map +0 -1
- package/dist/provider/connectivity-provider.js +0 -128
- package/dist/provider/connectivity-types.d.ts +0 -36
- package/dist/provider/connectivity-types.d.ts.map +0 -1
- package/dist/provider/use-connectivity.d.ts +0 -3
- package/dist/provider/use-connectivity.d.ts.map +0 -1
- package/dist/provider/use-connectivity.js +0 -14
- package/dist/query-devtools.d.ts +0 -21
- package/dist/query-devtools.d.ts.map +0 -1
- package/dist/query-devtools.js +0 -13
- package/src/agent/adapter.ts +0 -945
- package/src/agent/use-agent-stream.ts +0 -154
- package/src/agent-chat/index.ts +0 -54
- package/src/agent-chat/thread-detail-panel.tsx +0 -201
- package/src/agent-chat/thread-workspace.tsx +0 -279
- package/src/charts/cursor/resolve.ts +0 -198
- package/src/charts/cursor/scope.tsx +0 -35
- package/src/charts/cursor/store.ts +0 -58
- package/src/charts/cursor/touch-pin.ts +0 -138
- package/src/charts/hooks/use-discrete-cursor.ts +0 -335
- package/src/charts/hooks/use-hysteresis.ts +0 -26
- package/src/charts/hooks/useBandPlot.ts +0 -383
- package/src/charts/hooks/useChartCursor.ts +0 -367
- package/src/charts/hooks/useChartSize.ts +0 -35
- package/src/charts/kinds/BandStrip.tsx +0 -449
- package/src/charts/kinds/Bars.tsx +0 -589
- package/src/charts/kinds/Donut.tsx +0 -368
- package/src/charts/kinds/DualPanel.tsx +0 -712
- package/src/charts/kinds/Heatmap.tsx +0 -396
- package/src/charts/kinds/MirroredBars.tsx +0 -469
- package/src/charts/kinds/MultiLine.tsx +0 -322
- package/src/charts/kinds/StackedArea.tsx +0 -267
- package/src/charts/kinds/ZonedLine.tsx +0 -301
- package/src/charts/kinds/band-chrome.tsx +0 -91
- package/src/charts/kinds/donut-layout.ts +0 -82
- package/src/charts/layout/auto-margin.ts +0 -242
- package/src/charts/layout/end-labels.ts +0 -135
- package/src/charts/layout/log-ticks.ts +0 -90
- package/src/charts/primitives/AreaGradient.tsx +0 -26
- package/src/charts/primitives/Axes.tsx +0 -271
- package/src/charts/primitives/CartesianChart.tsx +0 -1002
- package/src/charts/primitives/ChartCard.tsx +0 -280
- package/src/charts/primitives/ChartFrame.tsx +0 -493
- package/src/charts/primitives/ChartLegend.tsx +0 -422
- package/src/charts/primitives/ChartPending.tsx +0 -243
- package/src/charts/primitives/ChartTooltip.tsx +0 -265
- package/src/charts/primitives/Crosshair.tsx +0 -43
- package/src/charts/primitives/HatchPattern.tsx +0 -55
- package/src/charts/primitives/HoverOverlay.module.css +0 -13
- package/src/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
- package/src/charts/primitives/HoverOverlay.tsx +0 -109
- package/src/charts/primitives/XZoneRects.tsx +0 -132
- package/src/charts/primitives/ZoneRects.tsx +0 -67
- package/src/charts/primitives/chart-card-context.ts +0 -46
- package/src/charts/primitives/chart-frame-layout.ts +0 -430
- package/src/charts/primitives/chart-layout.ts +0 -318
- package/src/charts/primitives/chart-tier.tsx +0 -76
- package/src/charts/primitives/legend-disclosure.tsx +0 -178
- package/src/charts/series.ts +0 -276
- package/src/charts/sparklines/BarSparkline.tsx +0 -94
- package/src/charts/sparklines/LineSparkline.tsx +0 -71
- package/src/charts/sparklines/index.ts +0 -2
- package/src/charts/theme.tsx +0 -53
- package/src/charts/utils/domain.ts +0 -41
- package/src/charts/utils/format.ts +0 -19
- package/src/charts/utils/measure-text.ts +0 -109
- package/src/charts/utils/ticks.ts +0 -239
- package/src/commands/overlays-mount.tsx +0 -333
- package/src/commands/useCommandHotkeys.ts +0 -114
- package/src/content/article-actions.ts +0 -72
- package/src/content/article-card.module.css +0 -111
- package/src/content/article-card.tsx +0 -174
- package/src/content/mdx.tsx +0 -127
- package/src/controls/compare-filter.tsx +0 -81
- package/src/controls/slider-control.tsx +0 -159
- package/src/dashboard/widget-grid.module.css +0 -69
- package/src/dashboard/widget-grid.tsx +0 -146
- package/src/data/table.ts +0 -39
- package/src/data/virtual-list.tsx +0 -356
- package/src/data/virtual.ts +0 -26
- package/src/forms/FormErrorSummary.tsx +0 -71
- package/src/forms/use-field-array.ts +0 -94
- package/src/forms/use-form-draft.ts +0 -262
- package/src/forms/use-form-submit.ts +0 -199
- package/src/notifications/index.ts +0 -88
- package/src/notifications/mount-guard.ts +0 -38
- package/src/notifications/notify.tsx +0 -379
- package/src/provider/connectivity-indicator.tsx +0 -267
- package/src/provider/connectivity-provider.tsx +0 -189
- package/src/provider/connectivity-types.ts +0 -42
- package/src/provider/use-connectivity.ts +0 -26
- package/src/query-devtools.tsx +0 -40
- /package/dist/{agent-chat → agent/chat}/message-affordances.js +0 -0
- /package/dist/{agent-chat → agent/chat}/relative-time.d.ts +0 -0
- /package/dist/{agent-chat → agent/chat}/relative-time.js +0 -0
- /package/dist/{agent-chat → agent/chat}/use-keyboard-inset.d.ts +0 -0
- /package/dist/{agent-chat → agent/chat}/virtualize.js +0 -0
- /package/dist/{notifications → commands/notifications}/bell.js +0 -0
- /package/dist/{notifications → commands/notifications}/define-notifications.js +0 -0
- /package/dist/{provider/connectivity-types.js → controls/uncontrolled.js} +0 -0
- /package/dist/{data → table}/data-table.module.css +0 -0
- /package/dist/{data → table}/data-table.module.css.d.ts +0 -0
- /package/dist/{data → table}/query-branch.d.ts +0 -0
- /package/dist/{data → table}/query-branch.js +0 -0
- /package/src/{agent-chat → agent/chat}/relative-time.ts +0 -0
- /package/src/{data → table}/data-table.module.css +0 -0
- /package/src/{data → table}/data-table.module.css.d.ts +0 -0
- /package/src/{data → table}/query-branch.ts +0 -0
|
@@ -1,367 +0,0 @@
|
|
|
1
|
-
import { localPoint } from '@visx/event'
|
|
2
|
-
import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
|
|
3
|
-
import type { KeyboardEvent, PointerEvent, RefObject } from 'react'
|
|
4
|
-
import type { CursorResolution } from '../cursor/resolve'
|
|
5
|
-
import { buildDomainIndex, classifyDomain, resolveCursorPoint } from '../cursor/resolve'
|
|
6
|
-
import { useCursorState, useCursorStore } from '../cursor/scope'
|
|
7
|
-
import type { CursorState } from '../cursor/store'
|
|
8
|
-
import { useDismissOnOutside, useTouchPin } from '../cursor/touch-pin'
|
|
9
|
-
|
|
10
|
-
/** Viewport-space pointer anchor the tooltip positions against. */
|
|
11
|
-
export type CursorAnchor = { x: number; y: number }
|
|
12
|
-
|
|
13
|
-
export type ChartCursor<T> = {
|
|
14
|
-
/** The point this chart paints its crosshair + dots at — own hover, or a resolved sibling key. */
|
|
15
|
-
point: T | null
|
|
16
|
-
/** True when the pointer is over THIS chart. Only the source chart shows the floating tooltip. */
|
|
17
|
-
isSource: boolean
|
|
18
|
-
/** Latest pointer position in viewport coords, or null when not hovered. */
|
|
19
|
-
anchor: CursorAnchor | null
|
|
20
|
-
/**
|
|
21
|
-
* True when the interaction that most recently placed THIS chart's cursor had
|
|
22
|
-
* `event.pointerType !== 'mouse'` (touch or pen). Callers fold it into the anchored-tooltip
|
|
23
|
-
* condition (`tooltip.follow` defaulting to `false` on touch, docs/CHARTS-SPEC.md §4) — a follower's own
|
|
24
|
-
* anchoring is unaffected, since a follower is never the one whose pointer set this flag.
|
|
25
|
-
*/
|
|
26
|
-
isTouch: boolean
|
|
27
|
-
onPointerMove: (event: PointerEvent<SVGRectElement>) => void
|
|
28
|
-
/** Coarse-pointer equivalent of hover: resolves the nearest point and shows the tooltip
|
|
29
|
-
* immediately, with no preceding `pointermove` — a plain tap otherwise fires only
|
|
30
|
-
* `pointerdown`/`pointerup`. The press is PROVISIONAL: it shows the tooltip but does not commit a
|
|
31
|
-
* pin, which only `onPointerUp` does. Also what MOVES an existing touch pin to a new tap elsewhere
|
|
32
|
-
* in the same chart (fine pointers ignore it; `onPointerMove` already covers hover for them). */
|
|
33
|
-
onPointerDown: (event: PointerEvent<SVGRectElement>) => void
|
|
34
|
-
/** Commits the provisional touch press — the same `pointerId` as the matching `onPointerDown` —
|
|
35
|
-
* so the pin survives the lift. A `pointerup` for any other pointer is ignored. */
|
|
36
|
-
onPointerUp: (event: PointerEvent<SVGRectElement>) => void
|
|
37
|
-
/** `pointerleave`/`pointercancel`, sharing one handler. A still-UNCOMMITTED touch press cancelled
|
|
38
|
-
* here is the browser taking the gesture (a scroll) and clears; once committed, touch no-ops so a
|
|
39
|
-
* stray `pointercancel` cannot undo the pin. A fine pointer always clears. */
|
|
40
|
-
onPointerLeave: (event: PointerEvent<SVGRectElement>) => void
|
|
41
|
-
onKeyDown: (event: KeyboardEvent<SVGRectElement>) => void
|
|
42
|
-
onBlur: () => void
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Wires a chart into the ambient cursor store: snaps the pointer to the nearest own point,
|
|
47
|
-
* broadcasts it, and reads back a sibling's broadcast through domain-aware resolution — automatic,
|
|
48
|
-
* no `resolveKey` escape hatch.
|
|
49
|
-
*
|
|
50
|
-
* The tooltip anchor is coalesced through `requestAnimationFrame` (one local write per frame on a
|
|
51
|
-
* fast scrub); the BROADCAST is deduped instead, so a within-bucket scrub costs nothing and a real
|
|
52
|
-
* bucket change reaches siblings on the same tick.
|
|
53
|
-
*
|
|
54
|
-
* Touch model (`docs/CHARTS-SPEC.md` §4): a fine pointer keeps hovering. A coarse pointer
|
|
55
|
-
* (`onPointerDown`) resolves and shows the tooltip immediately, drag-scrubs via `onPointerMove`,
|
|
56
|
-
* and COMMITS a pin on `onPointerUp` — `onPointerLeave` (also wired to `pointercancel`) no-ops once
|
|
57
|
-
* committed. A press the browser turns into a scroll clears instead. The pin moves on a fresh tap,
|
|
58
|
-
* clears on a `document` tap outside `boundaryRef`, on any scroll, or on Escape.
|
|
59
|
-
*/
|
|
60
|
-
export function useChartCursor<T>({
|
|
61
|
-
data,
|
|
62
|
-
chartId,
|
|
63
|
-
getKey,
|
|
64
|
-
xScale,
|
|
65
|
-
marginLeft,
|
|
66
|
-
resolution = 'nearest',
|
|
67
|
-
boundaryRef,
|
|
68
|
-
}: {
|
|
69
|
-
data: readonly T[]
|
|
70
|
-
chartId: string
|
|
71
|
-
getKey: (d: T) => string
|
|
72
|
-
/** Own x scale — maps a domain key to a plot-local x offset. */
|
|
73
|
-
xScale: (key: string) => number | undefined
|
|
74
|
-
marginLeft: number
|
|
75
|
-
/**
|
|
76
|
-
* How a sibling's broadcast key resolves against this chart's own points. Default `'nearest'`
|
|
77
|
-
* (point domains). Pass `'leading'` when `getKey` returns a bucket's leading edge (a weekly
|
|
78
|
-
* series keyed by its Monday, a monthly series keyed by its 1st) — see {@link CursorResolution}.
|
|
79
|
-
*/
|
|
80
|
-
resolution?: CursorResolution
|
|
81
|
-
/**
|
|
82
|
-
* Element a touch tap OUTSIDE dismisses the pin against (`docs/CHARTS-SPEC.md` §4). One
|
|
83
|
-
* capture-phase `document` `pointerdown` listener clears the pin when the target falls outside
|
|
84
|
-
* this ref — added on pinning, removed on unpin/unmount. Omit to skip outside-dismiss (a tap
|
|
85
|
-
* elsewhere in the chart and Escape still work); never throws for a missing ref.
|
|
86
|
-
*/
|
|
87
|
-
boundaryRef?: RefObject<Element | null>
|
|
88
|
-
}): ChartCursor<T> {
|
|
89
|
-
const store = useCursorStore()
|
|
90
|
-
const cursor = useCursorState()
|
|
91
|
-
const [anchor, setAnchor] = useState<CursorAnchor | null>(null)
|
|
92
|
-
// Whether the interaction that most recently placed THIS chart's cursor was coarse (touch/pen).
|
|
93
|
-
// Branched per EVENT (`event.pointerType`), never a static media query — a hybrid device can
|
|
94
|
-
// carry both inputs, and a media query can't tell which one just fired.
|
|
95
|
-
const [isTouch, setIsTouch] = useState(false)
|
|
96
|
-
// Whether THIS chart currently holds a COMMITTED touch/pen pin — deliberately separate from
|
|
97
|
-
// `isTouch` above, which a subsequent fine-pointer move resets to `false` (that IS the bug this
|
|
98
|
-
// guards against) and which `clear()` never touches. Set on a successful `onPointerUp` commit,
|
|
99
|
-
// cleared by `clear()` OR by losing source ownership — mirrors `useDiscreteCursor`'s `pinned`
|
|
100
|
-
// state, kept as a ref here since nothing needs to re-render off it directly.
|
|
101
|
-
const pinnedRef = useRef(false)
|
|
102
|
-
// A SIBLING chart stealing the shared cursor source (its own touch tap) never calls THIS chart's
|
|
103
|
-
// `clear()` — nothing here observes that tap directly. Left unguarded, `pinnedRef` stayed `true`
|
|
104
|
-
// forever once set, so a later mouse hover on this chart — after it legitimately re-claims
|
|
105
|
-
// `source` — read a stale pin and froze the crosshair (`resolveNearestAt`'s
|
|
106
|
-
// `pointerType === 'mouse' && pinnedRef.current && store.get().source === chartId` guard blocking
|
|
107
|
-
// a hover that was never actually still pinned). Reset the moment this chart is no longer the
|
|
108
|
-
// cursor's source — the one signal that unambiguously means whatever touch pin this chart held
|
|
109
|
-
// is gone, stolen or not.
|
|
110
|
-
useEffect(() => {
|
|
111
|
-
if (cursor.source !== chartId) pinnedRef.current = false
|
|
112
|
-
}, [cursor.source, chartId])
|
|
113
|
-
|
|
114
|
-
// Accessors read through refs so the pointer callbacks stay referentially stable: the natural
|
|
115
|
-
// call style is an inline arrow, fresh every render, and re-creating these would re-bind the
|
|
116
|
-
// overlay's listeners on every cursor frame in every sibling chart.
|
|
117
|
-
const getKeyRef = useRef(getKey)
|
|
118
|
-
getKeyRef.current = getKey
|
|
119
|
-
const xScaleRef = useRef(xScale)
|
|
120
|
-
xScaleRef.current = xScale
|
|
121
|
-
|
|
122
|
-
const index = useMemo(
|
|
123
|
-
() => buildDomainIndex(data, getKeyRef.current, resolution),
|
|
124
|
-
[data, resolution],
|
|
125
|
-
)
|
|
126
|
-
// Mirrors `index`'s memo shape (deps built off `data`, reading the accessor through a ref) —
|
|
127
|
-
// `resolution` is left out because `kind` never reads it, and `exhaustive-deps` enforces that.
|
|
128
|
-
const kind = useMemo(() => classifyDomain(data.map((d) => getKeyRef.current(d))), [data])
|
|
129
|
-
|
|
130
|
-
const frameRef = useRef<number | null>(null)
|
|
131
|
-
const pendingRef = useRef<CursorAnchor | null>(null)
|
|
132
|
-
// `pointermove` floods far faster than one nearest-point search is worth — an untethered scrub
|
|
133
|
-
// can fire dozens of native events between paints. `moveFrameRef`/`pendingMoveRef` coalesce the
|
|
134
|
-
// O(n) search itself (not just the anchor, which `frameRef`/`pendingRef` already batch) to one
|
|
135
|
-
// per animation frame — see `onPointerMove` below.
|
|
136
|
-
const moveFrameRef = useRef<number | null>(null)
|
|
137
|
-
const pendingMoveRef = useRef<{ px: number; anchor: CursorAnchor; pointerType: string } | null>(
|
|
138
|
-
null,
|
|
139
|
-
)
|
|
140
|
-
useEffect(
|
|
141
|
-
() => () => {
|
|
142
|
-
if (frameRef.current !== null) cancelAnimationFrame(frameRef.current)
|
|
143
|
-
if (moveFrameRef.current !== null) cancelAnimationFrame(moveFrameRef.current)
|
|
144
|
-
// Release the shared cursor if this chart still owns it. Unmounting while hovered (a filter
|
|
145
|
-
// drops the chart, a tab switches) fires no leave/blur, so the store would keep pointing at
|
|
146
|
-
// a dead chartId — and any sibling whose domain resolves that stale key would paint a ghost
|
|
147
|
-
// crosshair with no way to clear it. Same ownership guard as `clear()`.
|
|
148
|
-
if (store.get().source === chartId) store.set(null, null, null)
|
|
149
|
-
},
|
|
150
|
-
[store, chartId],
|
|
151
|
-
)
|
|
152
|
-
|
|
153
|
-
const scheduleAnchor = useCallback((next: CursorAnchor) => {
|
|
154
|
-
pendingRef.current = next
|
|
155
|
-
if (frameRef.current !== null) return
|
|
156
|
-
frameRef.current = requestAnimationFrame(() => {
|
|
157
|
-
frameRef.current = null
|
|
158
|
-
setAnchor(pendingRef.current)
|
|
159
|
-
})
|
|
160
|
-
}, [])
|
|
161
|
-
|
|
162
|
-
// The provisional-press commit/revert machine (`docs/CHARTS-SPEC.md` §4) — shared with
|
|
163
|
-
// `useDiscreteCursor`. `getCommitted` snapshots the STORE's current value (not this chart's own
|
|
164
|
-
// `point`), because the shared cursor is page-wide: a committed pin can belong to a different
|
|
165
|
-
// chart than the one now taking a second, cancelled press.
|
|
166
|
-
const touchPin = useTouchPin<CursorState>({
|
|
167
|
-
getCommitted: () => store.get(),
|
|
168
|
-
setCommitted: (v) => store.set(v.key, v.source, v.kind),
|
|
169
|
-
})
|
|
170
|
-
|
|
171
|
-
// The nearest-point search plus the broadcast — shared by the immediate (tap) and throttled
|
|
172
|
-
// (move) resolve paths below, so they cannot drift apart. `px` is the plot-local x, already run
|
|
173
|
-
// through `localPoint` by the caller: a `requestAnimationFrame` boundary has no business holding
|
|
174
|
-
// a live `PointerEvent`, only the plain numbers it already read out of one.
|
|
175
|
-
const resolveNearestAt = useCallback(
|
|
176
|
-
(px: number, anchor: CursorAnchor, pointerType: string) => {
|
|
177
|
-
if (data.length === 0) return
|
|
178
|
-
// A committed touch/pen pin must not be silently overridden by a fine-pointer hover on a
|
|
179
|
-
// hybrid device (a touchscreen laptop with a mouse/trackpad) — mirrors `useDiscreteCursor`'s
|
|
180
|
-
// `pinned` guard on its own hover path. Gated on `store.get().source` (not the reactive
|
|
181
|
-
// `isSource` derived later in this hook) so a pin a SIBLING chart has since stolen no longer
|
|
182
|
-
// blocks this chart's own mouse hover just because this chart's stale `pinnedRef` is still
|
|
183
|
-
// true.
|
|
184
|
-
if (pointerType === 'mouse' && pinnedRef.current && store.get().source === chartId) return
|
|
185
|
-
let closest = data[0] as T
|
|
186
|
-
let minDist = Infinity
|
|
187
|
-
for (const d of data) {
|
|
188
|
-
const x = xScaleRef.current(getKeyRef.current(d)) ?? 0
|
|
189
|
-
const dist = Math.abs(x - px)
|
|
190
|
-
if (dist < minDist) {
|
|
191
|
-
minDist = dist
|
|
192
|
-
closest = d
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
setIsTouch(pointerType !== 'mouse')
|
|
196
|
-
scheduleAnchor(anchor)
|
|
197
|
-
store.set(getKeyRef.current(closest), chartId, kind)
|
|
198
|
-
},
|
|
199
|
-
[data, chartId, store, scheduleAnchor, kind],
|
|
200
|
-
)
|
|
201
|
-
|
|
202
|
-
// Explicit reference node: `localPoint(event)` resolves it from `event.target`, which is the
|
|
203
|
-
// overlay rect only while the overlay is genuinely the topmost hit element. Passing
|
|
204
|
-
// `currentTarget` pins the coordinate space to the overlay regardless of what a kind draws above it.
|
|
205
|
-
const localX = useCallback(
|
|
206
|
-
(event: PointerEvent<SVGRectElement>): number | null => {
|
|
207
|
-
const local = localPoint(event.currentTarget, event.nativeEvent)
|
|
208
|
-
return local === null ? null : local.x - marginLeft
|
|
209
|
-
},
|
|
210
|
-
[marginLeft],
|
|
211
|
-
)
|
|
212
|
-
|
|
213
|
-
// A tap resolves immediately — one discrete event, not a flood, so it needs no throttle.
|
|
214
|
-
const resolveImmediate = useCallback(
|
|
215
|
-
(event: PointerEvent<SVGRectElement>) => {
|
|
216
|
-
const px = localX(event)
|
|
217
|
-
if (px === null) return
|
|
218
|
-
resolveNearestAt(px, { x: event.clientX, y: event.clientY }, event.pointerType)
|
|
219
|
-
},
|
|
220
|
-
[localX, resolveNearestAt],
|
|
221
|
-
)
|
|
222
|
-
|
|
223
|
-
const onPointerMove = useCallback(
|
|
224
|
-
(event: PointerEvent<SVGRectElement>) => {
|
|
225
|
-
const px = localX(event)
|
|
226
|
-
if (px === null) return
|
|
227
|
-
pendingMoveRef.current = {
|
|
228
|
-
px,
|
|
229
|
-
anchor: { x: event.clientX, y: event.clientY },
|
|
230
|
-
pointerType: event.pointerType,
|
|
231
|
-
}
|
|
232
|
-
if (moveFrameRef.current !== null) return
|
|
233
|
-
moveFrameRef.current = requestAnimationFrame(() => {
|
|
234
|
-
moveFrameRef.current = null
|
|
235
|
-
const pending = pendingMoveRef.current
|
|
236
|
-
pendingMoveRef.current = null
|
|
237
|
-
if (pending !== null) resolveNearestAt(pending.px, pending.anchor, pending.pointerType)
|
|
238
|
-
})
|
|
239
|
-
},
|
|
240
|
-
[localX, resolveNearestAt],
|
|
241
|
-
)
|
|
242
|
-
|
|
243
|
-
// A tap fires `pointerdown` + `pointerup` with no `pointermove` in between, so hover's resolve
|
|
244
|
-
// path never runs for it — this is what makes a tap show anything at all. It also MOVES an
|
|
245
|
-
// existing touch pin: a fresh `pointerdown` elsewhere in the chart re-resolves and re-broadcasts
|
|
246
|
-
// exactly like the first one, with nothing extra to wire.
|
|
247
|
-
const onPointerDown = useCallback(
|
|
248
|
-
(event: PointerEvent<SVGRectElement>) => {
|
|
249
|
-
// A coarse press is PROVISIONAL: snapshot whatever is committed now (so a cancel can restore
|
|
250
|
-
// it) BEFORE the resolve below overwrites the store. A fine pointer never begins a press —
|
|
251
|
-
// its hover path has no pin to protect.
|
|
252
|
-
if (event.pointerType !== 'mouse') touchPin.begin(event.pointerId)
|
|
253
|
-
resolveImmediate(event)
|
|
254
|
-
},
|
|
255
|
-
[resolveImmediate, touchPin],
|
|
256
|
-
)
|
|
257
|
-
// A completed tap: the pin is now committed, so `onPointerLeave`'s touch no-op keeps it past the
|
|
258
|
-
// lift. Only the tracked pointer commits — a stray `pointerup` is ignored. `pointerType ===
|
|
259
|
-
// 'mouse'` is checked FIRST and unconditionally: some browsers alias a touch's `pointerId` to the
|
|
260
|
-
// same value (1) a mouse pointer uses, so without this an unrelated mouse `pointerup` could commit
|
|
261
|
-
// an abandoned touch press it never tracked (mirrors `useDiscreteCursor`'s identical guard).
|
|
262
|
-
const onPointerUp = useCallback(
|
|
263
|
-
(event: PointerEvent<SVGRectElement>) => {
|
|
264
|
-
if (event.pointerType === 'mouse') return
|
|
265
|
-
if (touchPin.commit(event.pointerId)) pinnedRef.current = true
|
|
266
|
-
},
|
|
267
|
-
[touchPin],
|
|
268
|
-
)
|
|
269
|
-
|
|
270
|
-
const clear = useCallback(() => {
|
|
271
|
-
if (frameRef.current !== null) {
|
|
272
|
-
cancelAnimationFrame(frameRef.current)
|
|
273
|
-
frameRef.current = null
|
|
274
|
-
}
|
|
275
|
-
if (moveFrameRef.current !== null) {
|
|
276
|
-
cancelAnimationFrame(moveFrameRef.current)
|
|
277
|
-
moveFrameRef.current = null
|
|
278
|
-
}
|
|
279
|
-
pendingRef.current = null
|
|
280
|
-
pendingMoveRef.current = null
|
|
281
|
-
touchPin.reset()
|
|
282
|
-
pinnedRef.current = false
|
|
283
|
-
setAnchor(null)
|
|
284
|
-
// Only clear the SHARED cursor if this chart still owns it: moving fast from chart A to B lets
|
|
285
|
-
// A's leave fire after B's move, and an unconditional clear would wipe B's cursor.
|
|
286
|
-
if (store.get().source === chartId) store.set(null, null, null)
|
|
287
|
-
}, [store, chartId, touchPin])
|
|
288
|
-
|
|
289
|
-
// `pointerleave`/`pointercancel` share this one handler (`HoverOverlay` wires both to `onLeave`).
|
|
290
|
-
// A still-uncommitted touch press cancelled here is the browser taking the gesture (a scroll):
|
|
291
|
-
// `touchPin.cancel` restores whatever pin was committed before this press started (or leaves it
|
|
292
|
-
// clear when nothing was), rather than dropping a pin this press never owned. Once COMMITTED by
|
|
293
|
-
// touch it is a no-op — a stray `pointercancel` must not undo the pin the tap was meant to set.
|
|
294
|
-
// Escape's `clear()` in `onKeyDown` bypasses this guard entirely, by design: it is the one
|
|
295
|
-
// dismissal that must work regardless of pointer type.
|
|
296
|
-
const onPointerLeave = useCallback(
|
|
297
|
-
(event: PointerEvent<SVGRectElement>) => {
|
|
298
|
-
if (touchPin.cancel(event.pointerId)) return
|
|
299
|
-
if (isTouch) return
|
|
300
|
-
clear()
|
|
301
|
-
},
|
|
302
|
-
[isTouch, clear, touchPin],
|
|
303
|
-
)
|
|
304
|
-
|
|
305
|
-
const onKeyDown = useCallback(
|
|
306
|
-
(event: KeyboardEvent<SVGRectElement>) => {
|
|
307
|
-
if (data.length === 0) return
|
|
308
|
-
if (event.key === 'Escape') {
|
|
309
|
-
clear()
|
|
310
|
-
return
|
|
311
|
-
}
|
|
312
|
-
const delta = event.key === 'ArrowRight' ? 1 : event.key === 'ArrowLeft' ? -1 : 0
|
|
313
|
-
if (delta === 0) return
|
|
314
|
-
event.preventDefault()
|
|
315
|
-
|
|
316
|
-
const current = store.get().key
|
|
317
|
-
const currentIndex = data.findIndex((d) => getKeyRef.current(d) === current)
|
|
318
|
-
const nextIndex = Math.min(
|
|
319
|
-
Math.max((currentIndex === -1 ? (delta > 0 ? -1 : data.length) : currentIndex) + delta, 0),
|
|
320
|
-
data.length - 1,
|
|
321
|
-
)
|
|
322
|
-
const next = data[nextIndex] as T
|
|
323
|
-
const rect = event.currentTarget.getBoundingClientRect()
|
|
324
|
-
const x = xScaleRef.current(getKeyRef.current(next)) ?? 0
|
|
325
|
-
scheduleAnchor({ x: rect.left + x, y: rect.top })
|
|
326
|
-
store.set(getKeyRef.current(next), chartId, kind)
|
|
327
|
-
},
|
|
328
|
-
[data, store, chartId, clear, scheduleAnchor, kind],
|
|
329
|
-
)
|
|
330
|
-
|
|
331
|
-
// A broadcast from a domain of a DIFFERENT kind is filtered out here, before resolution is even
|
|
332
|
-
// attempted — a category chart never resolves a date chart's key just because both happen to
|
|
333
|
-
// parse. `isSource` is unaffected: it compares `chartId`, not `kind`, and a chart's own broadcast
|
|
334
|
-
// always carries its own kind by construction.
|
|
335
|
-
const point =
|
|
336
|
-
cursor.key === null || cursor.kind !== kind ? null : resolveCursorPoint(index, cursor.key)
|
|
337
|
-
const isSource = cursor.source === chartId
|
|
338
|
-
|
|
339
|
-
// Tap-outside dismissal (spec §5): while THIS chart is both pinned by touch and still the cursor's
|
|
340
|
-
// source, a capture-phase `document` `pointerdown`/`scroll`/`keydown` (shared with
|
|
341
|
-
// `useDiscreteCursor`, see `touch-pin.ts`) clears it the moment the event target falls outside
|
|
342
|
-
// `boundaryRef`. Gating on `isSource` (not `isTouch` alone) means the listener follows the pin —
|
|
343
|
-
// a sibling chart stealing the source on its own touch tap detaches this one instead of leaving a
|
|
344
|
-
// second stale listener alive.
|
|
345
|
-
const isInsideBoundary = useCallback(
|
|
346
|
-
(target: Node): boolean => boundaryRef?.current?.contains(target) === true,
|
|
347
|
-
[boundaryRef],
|
|
348
|
-
)
|
|
349
|
-
useDismissOnOutside({
|
|
350
|
-
enabled: isTouch && isSource && boundaryRef !== undefined,
|
|
351
|
-
isInside: isInsideBoundary,
|
|
352
|
-
onDismiss: clear,
|
|
353
|
-
})
|
|
354
|
-
|
|
355
|
-
return {
|
|
356
|
-
point,
|
|
357
|
-
isSource,
|
|
358
|
-
anchor,
|
|
359
|
-
isTouch,
|
|
360
|
-
onPointerMove,
|
|
361
|
-
onPointerDown,
|
|
362
|
-
onPointerUp,
|
|
363
|
-
onPointerLeave,
|
|
364
|
-
onKeyDown,
|
|
365
|
-
onBlur: clear,
|
|
366
|
-
}
|
|
367
|
-
}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { useParentSize } from '@visx/responsive'
|
|
2
|
-
|
|
3
|
-
export type ChartSize = {
|
|
4
|
-
width: number
|
|
5
|
-
height: number
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export type UseChartSizeResult = ChartSize & {
|
|
9
|
-
/** Attach to the container element to measure its dimensions. */
|
|
10
|
-
ref: (node: HTMLDivElement | null) => void
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Measures the width and height of a container element via a ResizeObserver.
|
|
15
|
-
* A thin basalt wrapper over `@visx/responsive`'s `useParentSize` — keeps the
|
|
16
|
-
* `@visx/*` import inside `src/charts/**` per the Mantine-free boundary rule.
|
|
17
|
-
*
|
|
18
|
-
* Charts do not call this directly — `ChartFrame` (and `CartesianChart` above it) measure for
|
|
19
|
-
* them, including the legend band. Reach for it when something OUTSIDE the chart system needs a
|
|
20
|
-
* measured box, e.g. sizing a sparkline to its table cell.
|
|
21
|
-
*
|
|
22
|
-
* @example
|
|
23
|
-
* function CellSparkline({ points }: { points: number[] }) {
|
|
24
|
-
* const { ref, width } = useChartSize()
|
|
25
|
-
* return (
|
|
26
|
-
* <div ref={ref} style={{ width: '100%', height: 24 }}>
|
|
27
|
-
* {width > 0 && <LineSparkline data={points} width={width} height={24} />}
|
|
28
|
-
* </div>
|
|
29
|
-
* )
|
|
30
|
-
* }
|
|
31
|
-
*/
|
|
32
|
-
export function useChartSize(debounceMs = 0): UseChartSizeResult {
|
|
33
|
-
const { parentRef, width, height } = useParentSize({ debounceTime: debounceMs })
|
|
34
|
-
return { ref: parentRef, width, height }
|
|
35
|
-
}
|