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,198 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Domain-aware resolution of a BROADCAST cursor key against a chart's own points.
|
|
3
|
-
*
|
|
4
|
-
* The layer this replaced matched keys byte-for-byte, so two charts shared a cursor only if they emitted identical
|
|
5
|
-
* strings. A chart that folded its domain to fit a narrow viewport stopped owning most of the keys
|
|
6
|
-
* its siblings broadcast, and the shared crosshair then landed on roughly one hover in three with
|
|
7
|
-
* no rule a reader could infer — patched per chart by a manual `resolveKey`. Resolving on the
|
|
8
|
-
* PARSED domain instead makes that automatic (`docs/CHARTS-SPEC.md` §3).
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
/** Numeric-string test — shared by `parseKey` and `classifyDomain` so a key can never be numeric
|
|
12
|
-
* to one and not the other. */
|
|
13
|
-
function isNumericString(key: string): boolean {
|
|
14
|
-
return /^[-+]?\d*\.?\d+$/.test(key) && Number.isFinite(Number(key))
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/** `Date.parse`-able test — shared by `parseKey` and `classifyDomain`, same reason. */
|
|
18
|
-
function isDateParseableString(key: string): boolean {
|
|
19
|
-
return !Number.isNaN(Date.parse(key))
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* A key as a comparable number: numeric-looking strings as numbers, everything else as a date.
|
|
24
|
-
* Neither (a plain category like "Direct") → null, which degrades to exact-match only — correct,
|
|
25
|
-
* since "nearest category" is meaningless.
|
|
26
|
-
*/
|
|
27
|
-
export function parseKey(key: string): number | null {
|
|
28
|
-
if (isNumericString(key)) return Number(key)
|
|
29
|
-
return isDateParseableString(key) ? Date.parse(key) : null
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/** The x-domain families the shared cursor partitions on, derived from a chart's own keys — never
|
|
33
|
-
* a prop, never `ChartCursorScope`. A chart's kind is stamped on every broadcast it makes, and a
|
|
34
|
-
* receiving chart ignores any broadcast whose kind differs from its own — so a category chart can
|
|
35
|
-
* never be mistaken for a time chart just because both domains happen to parse. */
|
|
36
|
-
export type DomainKind = 'time' | 'linear' | 'band'
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Classify a domain by the SAME parse precedence `parseKey` applies to each key, so a domain can
|
|
40
|
-
* never be classified one way and resolved another:
|
|
41
|
-
*
|
|
42
|
-
* - empty domain → `'band'` (nothing to share).
|
|
43
|
-
* - every key numeric (same test `parseKey` tries first) → `'linear'`.
|
|
44
|
-
* - otherwise every key `Date.parse`-able (same test `parseKey` falls back to) → `'time'`.
|
|
45
|
-
* - otherwise → `'band'` (categories, or a mixed domain).
|
|
46
|
-
*
|
|
47
|
-
* Ordering matters and mirrors `parseKey` exactly: a domain of bare years like `"2026"` is numeric
|
|
48
|
-
* FIRST, so it classifies `'linear'`, not `'time'`, even though every value is also a valid date.
|
|
49
|
-
*/
|
|
50
|
-
export function classifyDomain(keys: readonly string[]): DomainKind {
|
|
51
|
-
if (keys.length === 0) return 'band'
|
|
52
|
-
if (keys.every(isNumericString)) return 'linear'
|
|
53
|
-
if (keys.every(isDateParseableString)) return 'time'
|
|
54
|
-
return 'band'
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* How a foreign key maps onto a chart's own points.
|
|
59
|
-
*
|
|
60
|
-
* `'nearest'` (default) treats every key as a POINT — the foreign key resolves to whichever own
|
|
61
|
-
* point sits closest to it. Correct when a chart's x-domain is a set of instants.
|
|
62
|
-
*
|
|
63
|
-
* `'leading'` treats every key as the LEADING EDGE of a bucket covering `[key, nextKey)` — the
|
|
64
|
-
* foreign key resolves to the LAST own key `<=` it. Use this when a chart's keys are bucket
|
|
65
|
-
* starts (a weekly series keyed by the Monday of each week, a monthly series keyed by the 1st):
|
|
66
|
-
* under `'nearest'`, a target landing in the back half of a bucket resolves to the FOLLOWING
|
|
67
|
-
* bucket instead of the one it's actually inside, and the shared crosshair lands one column off
|
|
68
|
-
* for every back-half hover.
|
|
69
|
-
*
|
|
70
|
-
* The two modes differ at the DOMAIN EDGES too, and deliberately: `'nearest'` tolerates one step
|
|
71
|
-
* past each end (the target is an instant, so the closest point is still a defensible answer),
|
|
72
|
-
* while `'leading'` bounds strictly to `[first, last + step)` — outside that range no bucket
|
|
73
|
-
* CONTAINS the key, and answering with the nearest one would paint a crosshair on a bucket that
|
|
74
|
-
* provably excludes it.
|
|
75
|
-
*/
|
|
76
|
-
export type CursorResolution = 'nearest' | 'leading'
|
|
77
|
-
|
|
78
|
-
export type DomainIndex<T> = {
|
|
79
|
-
byKey: Map<string, T>
|
|
80
|
-
/** Parsed positions, ascending. Empty when the domain isn't parseable. */
|
|
81
|
-
values: number[]
|
|
82
|
-
/** Points parallel to `values`. */
|
|
83
|
-
points: T[]
|
|
84
|
-
/** Median spacing — the tolerance within which a foreign key still resolves. */
|
|
85
|
-
step: number
|
|
86
|
-
/** The resolution strategy this index was built for. */
|
|
87
|
-
resolution: CursorResolution
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/** Build the lookup structure once per `data` identity. */
|
|
91
|
-
export function buildDomainIndex<T>(
|
|
92
|
-
data: readonly T[],
|
|
93
|
-
getKey: (d: T) => string,
|
|
94
|
-
resolution: CursorResolution = 'nearest',
|
|
95
|
-
): DomainIndex<T> {
|
|
96
|
-
const byKey = new Map<string, T>()
|
|
97
|
-
const parsed: { value: number; point: T }[] = []
|
|
98
|
-
let parseable = true
|
|
99
|
-
|
|
100
|
-
for (const d of data) {
|
|
101
|
-
byKey.set(getKey(d), d)
|
|
102
|
-
if (!parseable) continue
|
|
103
|
-
const value = parseKey(getKey(d))
|
|
104
|
-
if (value === null) parseable = false
|
|
105
|
-
else parsed.push({ value, point: d })
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
// Under two parseable points there is no step to reason about, so nearest-match would be
|
|
109
|
-
// unbounded — fall back to exact match.
|
|
110
|
-
if (!parseable || parsed.length < 2) {
|
|
111
|
-
return { byKey, values: [], points: [], step: 0, resolution }
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
parsed.sort((a, b) => a.value - b.value)
|
|
115
|
-
const values = parsed.map((p) => p.value)
|
|
116
|
-
const points = parsed.map((p) => p.point)
|
|
117
|
-
|
|
118
|
-
const diffs: number[] = []
|
|
119
|
-
for (let i = 1; i < values.length; i++) {
|
|
120
|
-
diffs.push((values[i] as number) - (values[i - 1] as number))
|
|
121
|
-
}
|
|
122
|
-
diffs.sort((a, b) => a - b)
|
|
123
|
-
|
|
124
|
-
return { byKey, values, points, step: diffs[Math.floor(diffs.length / 2)] ?? 0, resolution }
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/** `'leading'` resolution: the last own position `<= target`. The caller has already rejected
|
|
128
|
-
* anything outside `[first, last + step)`, so a containing bucket is guaranteed to exist. */
|
|
129
|
-
function resolveLeading<T>(index: DomainIndex<T>, target: number): T {
|
|
130
|
-
let lo = 0
|
|
131
|
-
let hi = index.values.length - 1
|
|
132
|
-
let result = 0
|
|
133
|
-
while (lo <= hi) {
|
|
134
|
-
const mid = (lo + hi) >> 1
|
|
135
|
-
if ((index.values[mid] as number) <= target) {
|
|
136
|
-
result = mid
|
|
137
|
-
lo = mid + 1
|
|
138
|
-
} else {
|
|
139
|
-
hi = mid - 1
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
return index.points[result] as T
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
/**
|
|
146
|
-
* The own point a broadcast `key` maps to: exact match first, else — per `index.resolution` — the
|
|
147
|
-
* nearest parsed position or the last position at/before the target, both within one domain step.
|
|
148
|
-
* Out of range → null, so charts over unrelated domains never paint a cursor for each other —
|
|
149
|
-
* which is what makes "shared by default" safe. A categorical (unparseable) domain falls back to
|
|
150
|
-
* exact-match-only in BOTH resolutions, since "nearest"/"leading" over a category is meaningless.
|
|
151
|
-
*/
|
|
152
|
-
export function resolveCursorPoint<T>(
|
|
153
|
-
index: DomainIndex<T>,
|
|
154
|
-
key: string,
|
|
155
|
-
resolution: CursorResolution = index.resolution,
|
|
156
|
-
): T | null {
|
|
157
|
-
const exact = index.byKey.get(key)
|
|
158
|
-
if (exact !== undefined) return exact
|
|
159
|
-
|
|
160
|
-
const target = parseKey(key)
|
|
161
|
-
if (target === null || index.values.length === 0) return null
|
|
162
|
-
|
|
163
|
-
const first = index.values[0] as number
|
|
164
|
-
const last = index.values[index.values.length - 1] as number
|
|
165
|
-
|
|
166
|
-
if (resolution === 'leading') {
|
|
167
|
-
// Containment, NOT tolerance. A bucket keyed `k` covers `[k, nextKey)`, so a target before the
|
|
168
|
-
// first key sits in no bucket at all, and `last + step` is the first instant past the final
|
|
169
|
-
// one. Borrowing `'nearest'`'s symmetric ±step window here would snap a pre-domain target onto
|
|
170
|
-
// the first bucket and a post-domain one onto the last — painting a crosshair on a bucket that
|
|
171
|
-
// provably does not contain the hovered key, which is the exact lie this mode exists to remove.
|
|
172
|
-
if (target < first || target >= last + index.step) return null
|
|
173
|
-
return resolveLeading(index, target)
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
if (target < first - index.step || target > last + index.step) return null
|
|
177
|
-
|
|
178
|
-
let lo = 0
|
|
179
|
-
let hi = index.values.length - 1
|
|
180
|
-
while (lo < hi) {
|
|
181
|
-
const mid = (lo + hi) >> 1
|
|
182
|
-
if ((index.values[mid] as number) < target) lo = mid + 1
|
|
183
|
-
else hi = mid
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
let best = lo
|
|
187
|
-
let bestDist = Math.abs((index.values[lo] as number) - target)
|
|
188
|
-
if (lo > 0) {
|
|
189
|
-
const prevDist = Math.abs((index.values[lo - 1] as number) - target)
|
|
190
|
-
// `<=`, not `<`: a key landing exactly between two own points belongs to the EARLIER one —
|
|
191
|
-
// the folded bucket that swallowed it starts there, so ties resolve backwards, consistently.
|
|
192
|
-
if (prevDist <= bestDist) {
|
|
193
|
-
best = lo - 1
|
|
194
|
-
bestDist = prevDist
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
return bestDist <= index.step ? (index.points[best] as T) : null
|
|
198
|
-
}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { createContext, useContext, useMemo, useSyncExternalStore } from 'react'
|
|
2
|
-
import type { ReactNode } from 'react'
|
|
3
|
-
import type { CursorState, CursorStore } from './store'
|
|
4
|
-
import { createCursorStore, EMPTY_CURSOR, globalCursorStore } from './store'
|
|
5
|
-
|
|
6
|
-
const CursorStoreContext = createContext<CursorStore>(globalCursorStore)
|
|
7
|
-
|
|
8
|
-
export type ChartCursorScopeProps = {
|
|
9
|
-
children: ReactNode
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* ISOLATES its subtree onto a private cursor store — the inverse of the removed `ChartHoverSync`, which
|
|
14
|
-
* had to be mounted to enable sharing at all. Charts share a cursor by default now, AND the shared
|
|
15
|
-
* cursor partitions automatically by x-domain kind (`DomainKind`, derived from each chart's own
|
|
16
|
-
* data in `useChartCursor`) — a categorical chart never follows a date chart just because both
|
|
17
|
-
* happen to be on the page, with nothing to configure. `ChartCursorScope` is no longer the tool for
|
|
18
|
-
* that case. What it is still for: isolating two charts that share the same domain KIND but are
|
|
19
|
-
* semantically unrelated — two different tenants' date ranges rendered side by side on one page.
|
|
20
|
-
*/
|
|
21
|
-
export function ChartCursorScope({ children }: ChartCursorScopeProps) {
|
|
22
|
-
const store = useMemo(() => createCursorStore(), [])
|
|
23
|
-
return <CursorStoreContext.Provider value={store}>{children}</CursorStoreContext.Provider>
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/** The cursor store this chart belongs to — the nearest `ChartCursorScope`, else the global one. */
|
|
27
|
-
export function useCursorStore(): CursorStore {
|
|
28
|
-
return useContext(CursorStoreContext)
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/** Subscribe to the ambient cursor. Re-renders only on an actual cursor change. */
|
|
32
|
-
export function useCursorState(): CursorState {
|
|
33
|
-
const store = useCursorStore()
|
|
34
|
-
return useSyncExternalStore(store.subscribe, store.get, () => EMPTY_CURSOR)
|
|
35
|
-
}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The shared chart cursor — an external store, not a React context value.
|
|
3
|
-
*
|
|
4
|
-
* Sharing used to require a `ChartHoverSync` ancestor, so it was opt-in and silently absent
|
|
5
|
-
* whenever someone forgot the wrapper. This inverts that: a module-level store means every
|
|
6
|
-
* chart on the page shares a cursor by default, and `ChartCursorScope` exists to ISOLATE a
|
|
7
|
-
* subtree (`docs/CHARTS-SPEC.md` §3). Charts with non-overlapping domains never resolve each
|
|
8
|
-
* other's keys, so "shared by default" cannot produce a false cursor.
|
|
9
|
-
*
|
|
10
|
-
* External store rather than context for a second reason: a cursor move re-renders only the
|
|
11
|
-
* charts subscribed to it, instead of every descendant of a provider whose value object is new
|
|
12
|
-
* on each pointer frame.
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
import type { DomainKind } from './resolve'
|
|
16
|
-
|
|
17
|
-
/** Broadcast cursor position: an opaque domain key plus the chart that owns it. */
|
|
18
|
-
export type CursorState = {
|
|
19
|
-
/** The hovered x-domain key (a date/category string), or null when nothing is hovered. */
|
|
20
|
-
key: string | null
|
|
21
|
-
/** `chartId` of the chart the pointer is actually over — the one that owns the tooltip. */
|
|
22
|
-
source: string | null
|
|
23
|
-
/** The broadcaster's own x-domain kind. `null` only in the empty state — the store itself does
|
|
24
|
-
* not police this, it just carries it; the partition is enforced by the reading hook. */
|
|
25
|
-
kind: DomainKind | null
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export type CursorStore = {
|
|
29
|
-
get: () => CursorState
|
|
30
|
-
set: (key: string | null, source: string | null, kind?: DomainKind | null) => void
|
|
31
|
-
subscribe: (onChange: () => void) => () => void
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/** Stable identity for "nothing hovered" — also the SSR snapshot, so it must never be recreated. */
|
|
35
|
-
export const EMPTY_CURSOR: CursorState = { key: null, source: null, kind: null }
|
|
36
|
-
|
|
37
|
-
export function createCursorStore(): CursorStore {
|
|
38
|
-
let state: CursorState = EMPTY_CURSOR
|
|
39
|
-
const listeners = new Set<() => void>()
|
|
40
|
-
|
|
41
|
-
return {
|
|
42
|
-
get: () => state,
|
|
43
|
-
set: (key, source, kind = null) => {
|
|
44
|
-
if (state.key === key && state.source === source && state.kind === kind) return
|
|
45
|
-
state = key === null && source === null ? EMPTY_CURSOR : { key, source, kind }
|
|
46
|
-
for (const listener of listeners) listener()
|
|
47
|
-
},
|
|
48
|
-
subscribe: (onChange) => {
|
|
49
|
-
listeners.add(onChange)
|
|
50
|
-
return () => {
|
|
51
|
-
listeners.delete(onChange)
|
|
52
|
-
}
|
|
53
|
-
},
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/** The default store every chart shares unless a `ChartCursorScope` overrides it. */
|
|
58
|
-
export const globalCursorStore: CursorStore = createCursorStore()
|
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Two small pieces shared by every touch-pinned surface in the chart layer — extracted so
|
|
3
|
-
* `useChartCursor`/`useDiscreteCursor`/`ChartLegend`'s disclosure cannot drift apart on the same
|
|
4
|
-
* contract (round 2's carried-forward gap: each had its own hand-rolled copy).
|
|
5
|
-
*/
|
|
6
|
-
import { useCallback, useEffect, useMemo, useRef } from 'react'
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Outside-tap / Escape / scroll (optionally resize) dismissal for a pinned/open floating element.
|
|
10
|
-
* Capture-phase `pointerdown` so a descendant that stops propagation on its own handler can't leave
|
|
11
|
-
* the dismissal stuck.
|
|
12
|
-
*/
|
|
13
|
-
export function useDismissOnOutside({
|
|
14
|
-
enabled,
|
|
15
|
-
isInside,
|
|
16
|
-
onDismiss,
|
|
17
|
-
dismissOnResize = false,
|
|
18
|
-
scrollExemptInside = false,
|
|
19
|
-
}: {
|
|
20
|
-
enabled: boolean
|
|
21
|
-
/** A tap (or, with `scrollExemptInside`, a scroll) landing where this returns true doesn't
|
|
22
|
-
* dismiss. Omit to treat every tap as outside. */
|
|
23
|
-
isInside?: (target: Node) => boolean
|
|
24
|
-
onDismiss: () => void
|
|
25
|
-
/** Also dismiss on a window `resize` — `ChartLegend`'s disclosure needs this, the touch-pinned
|
|
26
|
-
* cursors don't (their host doesn't reflow independently of the chart it's pinned to). */
|
|
27
|
-
dismissOnResize?: boolean
|
|
28
|
-
/** Exempts a scroll whose target is `isInside` — `ChartLegend`'s own scrollable panel needs this
|
|
29
|
-
* (`overflowY: auto`), the cursor hooks don't (a chart has no internal scroller to protect). */
|
|
30
|
-
scrollExemptInside?: boolean
|
|
31
|
-
}): void {
|
|
32
|
-
useEffect(() => {
|
|
33
|
-
if (!enabled) return
|
|
34
|
-
const onPointerDown = (event: PointerEvent) => {
|
|
35
|
-
if (event.target instanceof Node && isInside?.(event.target) === true) return
|
|
36
|
-
onDismiss()
|
|
37
|
-
}
|
|
38
|
-
const onKeyDown = (event: KeyboardEvent) => {
|
|
39
|
-
if (event.key === 'Escape') onDismiss()
|
|
40
|
-
}
|
|
41
|
-
const onScroll = (event: Event) => {
|
|
42
|
-
if (scrollExemptInside && event.target instanceof Node && isInside?.(event.target) === true) {
|
|
43
|
-
return
|
|
44
|
-
}
|
|
45
|
-
onDismiss()
|
|
46
|
-
}
|
|
47
|
-
document.addEventListener('pointerdown', onPointerDown, true)
|
|
48
|
-
document.addEventListener('keydown', onKeyDown)
|
|
49
|
-
document.addEventListener('scroll', onScroll, true)
|
|
50
|
-
if (dismissOnResize) window.addEventListener('resize', onDismiss)
|
|
51
|
-
return () => {
|
|
52
|
-
document.removeEventListener('pointerdown', onPointerDown, true)
|
|
53
|
-
document.removeEventListener('keydown', onKeyDown)
|
|
54
|
-
document.removeEventListener('scroll', onScroll, true)
|
|
55
|
-
if (dismissOnResize) window.removeEventListener('resize', onDismiss)
|
|
56
|
-
}
|
|
57
|
-
}, [enabled, isInside, onDismiss, dismissOnResize, scrollExemptInside])
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export type TouchPin = {
|
|
61
|
-
/** `onPointerDown` for a coarse press: snapshots whatever is currently committed (via
|
|
62
|
-
* `getCommitted`) so a later `cancel` can restore exactly that, then tracks `pointerId`. */
|
|
63
|
-
begin: (pointerId: number) => void
|
|
64
|
-
/** `onPointerUp` for the tracked pointer: the press is now committed — nothing left to revert. */
|
|
65
|
-
commit: (pointerId: number) => boolean
|
|
66
|
-
/** `onPointerCancel`/`onPointerLeave` for the tracked pointer: the browser took the gesture (a
|
|
67
|
-
* scroll) before the press committed — restores the pre-press value via `setCommitted`, or
|
|
68
|
-
* leaves it clear when nothing was committed before. Returns whether this pointer was tracked. */
|
|
69
|
-
cancel: (pointerId: number) => boolean
|
|
70
|
-
/** Hard reset — no restore, just drop any in-flight press bookkeeping (an explicit `clear()`, e.g.
|
|
71
|
-
* Escape or an outside tap, is about to overwrite the value directly anyway). */
|
|
72
|
-
reset: () => void
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Provisional-press state machine shared by `useChartCursor`/`useDiscreteCursor`: a coarse press
|
|
77
|
-
* shows a value immediately (PROVISIONAL, not yet committed) — `commit` on `pointerup` leaves it in
|
|
78
|
-
* place, `cancel` on `pointercancel`/`pointerleave` (a scroll winning the gesture) restores whatever
|
|
79
|
-
* was committed before this press started, rather than dropping it. This is what keeps a previously
|
|
80
|
-
* COMMITTED pin alive through a second tap that gets cancelled instead of completed.
|
|
81
|
-
*/
|
|
82
|
-
export function useTouchPin<V>({
|
|
83
|
-
getCommitted,
|
|
84
|
-
setCommitted,
|
|
85
|
-
}: {
|
|
86
|
-
/** Reads the value currently committed — snapshotted on `begin`, restored on `cancel`. */
|
|
87
|
-
getCommitted: () => V
|
|
88
|
-
setCommitted: (value: V) => void
|
|
89
|
-
}): TouchPin {
|
|
90
|
-
const pressRef = useRef<number | null>(null)
|
|
91
|
-
const backupRef = useRef<V | undefined>(undefined)
|
|
92
|
-
// Whether `backupRef` holds a real snapshot — `backupRef.current !== undefined` used to stand in
|
|
93
|
-
// for this, which silently dropped a genuinely committed `undefined` (a caller's `V` can legally
|
|
94
|
-
// include it): `cancel` would restore nothing at all instead of restoring "nothing was pinned".
|
|
95
|
-
const hasBackupRef = useRef(false)
|
|
96
|
-
const getCommittedRef = useRef(getCommitted)
|
|
97
|
-
getCommittedRef.current = getCommitted
|
|
98
|
-
const setCommittedRef = useRef(setCommitted)
|
|
99
|
-
setCommittedRef.current = setCommitted
|
|
100
|
-
|
|
101
|
-
const begin = useCallback((pointerId: number) => {
|
|
102
|
-
backupRef.current = getCommittedRef.current()
|
|
103
|
-
hasBackupRef.current = true
|
|
104
|
-
pressRef.current = pointerId
|
|
105
|
-
}, [])
|
|
106
|
-
|
|
107
|
-
const commit = useCallback((pointerId: number): boolean => {
|
|
108
|
-
if (pressRef.current !== pointerId) return false
|
|
109
|
-
pressRef.current = null
|
|
110
|
-
backupRef.current = undefined
|
|
111
|
-
hasBackupRef.current = false
|
|
112
|
-
return true
|
|
113
|
-
}, [])
|
|
114
|
-
|
|
115
|
-
const cancel = useCallback((pointerId: number): boolean => {
|
|
116
|
-
if (pressRef.current !== pointerId) return false
|
|
117
|
-
pressRef.current = null
|
|
118
|
-
const backup = backupRef.current
|
|
119
|
-
const hasBackup = hasBackupRef.current
|
|
120
|
-
backupRef.current = undefined
|
|
121
|
-
hasBackupRef.current = false
|
|
122
|
-
if (hasBackup) setCommittedRef.current(backup as V)
|
|
123
|
-
return true
|
|
124
|
-
}, [])
|
|
125
|
-
|
|
126
|
-
const reset = useCallback(() => {
|
|
127
|
-
pressRef.current = null
|
|
128
|
-
backupRef.current = undefined
|
|
129
|
-
hasBackupRef.current = false
|
|
130
|
-
}, [])
|
|
131
|
-
|
|
132
|
-
// Stable identity: `begin`/`commit`/`cancel`/`reset` are themselves already stable (empty-dep
|
|
133
|
-
// `useCallback`s), but the returned OBJECT wrapping them was a fresh literal every render — a
|
|
134
|
-
// consumer's own effect depending on the whole `TouchPin` (or a `useDismissOnOutside` closing
|
|
135
|
-
// over one of these) would re-subscribe on every render for no reason. Memoizing on the four
|
|
136
|
-
// (stable) functions costs nothing and makes the wrapper's identity match theirs.
|
|
137
|
-
return useMemo(() => ({ begin, commit, cancel, reset }), [begin, commit, cancel, reset])
|
|
138
|
-
}
|