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
package/src/provider/index.tsx
CHANGED
|
@@ -1,168 +1,99 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* BasaltProvider —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* BasaltProvider — the one provider tree (V2-SPEC § 2): `MantineProvider` with the Basalt theme and
|
|
3
|
+
* resolver, the `--vx-*` palette `<style>`, and then
|
|
4
|
+
* `QueryClientProvider > ModalsProvider > RouterProvider` with `Notifications` and `Spotlight` as
|
|
5
|
+
* siblings. The consumer writes the route tree, the nav and the registries.
|
|
5
6
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* context, inject the palette `<style>`). Basalt folds the GENERIC half of both into one provider.
|
|
9
|
-
* The DOMAIN half of argo's `main.tsx` — router, query client, app routes, auth gate, the concrete
|
|
10
|
-
* series/sections — stays in the consumer and does NOT extract.
|
|
7
|
+
* It also owns the root error boundary, the `window` error listeners and the telemetry seam
|
|
8
|
+
* (V2-SPEC § 7), the command hotkeys and Spotlight actions, and — in dev only — the dev dock.
|
|
11
9
|
*
|
|
12
|
-
* The palette injection is pure CSS
|
|
13
|
-
*
|
|
14
|
-
* Vx context still carries the resolved `colorScheme` for any non-color branching a chart may need.
|
|
15
|
-
*
|
|
16
|
-
* Mantine usage is allowed in this `./` root layer (unlike `src/charts/**` and `src/tokens/**`).
|
|
10
|
+
* The palette injection is pure CSS keyed off Mantine's `[data-mantine-color-scheme]` attribute, so
|
|
11
|
+
* dark/light resolution needs no React re-render.
|
|
17
12
|
*/
|
|
18
|
-
import {
|
|
19
|
-
MantineProvider,
|
|
20
|
-
useComputedColorScheme,
|
|
21
|
-
useMantineColorScheme,
|
|
22
|
-
useMantineTheme,
|
|
23
|
-
} from '@mantine/core'
|
|
13
|
+
import { MantineProvider, useMantineColorScheme, useMantineTheme } from '@mantine/core'
|
|
24
14
|
import type { MantineProviderProps } from '@mantine/core'
|
|
25
|
-
import {
|
|
15
|
+
import { ModalsProvider } from '@mantine/modals'
|
|
16
|
+
import { Notifications } from '@mantine/notifications'
|
|
17
|
+
import { Spotlight } from '@mantine/spotlight'
|
|
18
|
+
import type { SpotlightActionData } from '@mantine/spotlight'
|
|
19
|
+
import { QueryClientProvider } from '@tanstack/react-query'
|
|
20
|
+
import type { QueryClient } from '@tanstack/react-query'
|
|
21
|
+
import { RouterProvider } from '@tanstack/react-router'
|
|
22
|
+
import type { AnyRouter } from '@tanstack/react-router'
|
|
23
|
+
import { Component, Suspense, lazy, useCallback, useEffect, useMemo, useRef, useState } from 'react'
|
|
26
24
|
import type { ErrorInfo, ReactNode } from 'react'
|
|
27
|
-
import { VxThemeProvider } from '../charts/theme'
|
|
28
25
|
import fallbackClasses from './error-fallback.module.css'
|
|
29
|
-
import { ConnectivityProvider } from './connectivity-provider'
|
|
30
|
-
import type { ConnectivityProviderProps } from './connectivity-types'
|
|
31
26
|
import { cssVariablesResolver } from '../theme'
|
|
32
27
|
import { useLabTheme } from './lab-theme'
|
|
33
|
-
import { buildDensityCss, buildFontsCss, buildPaletteCss, buildRadiusCss } from '../tokens'
|
|
34
|
-
import type { BuildPaletteOpts } from '../tokens'
|
|
28
|
+
import { buildDensityCss, buildFontsCss, buildPaletteCss, buildRadiusCss } from '../tokens/core'
|
|
29
|
+
import type { BuildPaletteOpts } from '../tokens/core'
|
|
35
30
|
import { isDefaultDeriveConfig } from '../tokens/derive'
|
|
36
31
|
import { buildPaletteData } from '../tokens/palette'
|
|
37
32
|
import { useMediaQuery } from '../common/use-media-query'
|
|
33
|
+
import { registerModalsProvider } from '../commands/define-overlays'
|
|
38
34
|
import { registerColorSchemeSetter } from '../commands/shell-bridge'
|
|
39
35
|
import { useIsomorphicLayoutEffect } from '../common/isomorphic-layout-effect'
|
|
40
36
|
import { PageTitle } from '../shell/page-title'
|
|
41
37
|
import { SizeClassHintContext } from '../shell/use-size-class'
|
|
42
38
|
import type { SizeClass } from '../shell/use-size-class'
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
* onError={(e, ctx) => {
|
|
50
|
-
* if (ctx.kind === 'render') Sentry.captureException(e, { extra: { info: ctx.info } })
|
|
51
|
-
* if (ctx.kind === 'unhandledrejection') Sentry.captureException(e)
|
|
52
|
-
* }}
|
|
53
|
-
* >
|
|
54
|
-
*/
|
|
55
|
-
export type BasaltErrorContext =
|
|
56
|
-
| { kind: 'render'; info: ErrorInfo }
|
|
57
|
-
| { kind: 'window'; event: ErrorEvent }
|
|
58
|
-
| { kind: 'unhandledrejection'; reason: unknown }
|
|
39
|
+
import { TelemetryContext, bindRouterTelemetry, createEmitter, errorName, now } from '../telemetry'
|
|
40
|
+
import type { Telemetry } from '../telemetry'
|
|
41
|
+
import type { BasaltDevDockTool } from '../dev-dock'
|
|
42
|
+
import type { BasaltRouter, BasaltRouterContext } from './create-router'
|
|
43
|
+
import { useRegistryHotkeys } from './hotkeys'
|
|
44
|
+
import { buildSpotlightActions } from './spotlight-actions'
|
|
59
45
|
|
|
60
46
|
export type BasaltProviderProps = {
|
|
61
|
-
|
|
62
|
-
|
|
47
|
+
/** From `createBasaltRouter`; the provider mounts it and reads its `queryClient`. */
|
|
48
|
+
router: BasaltRouter
|
|
49
|
+
/** Theme override merged onto the Basalt base. Defaults to `createBasaltTheme()`. */
|
|
63
50
|
theme?: MantineProviderProps['theme']
|
|
51
|
+
/**
|
|
52
|
+
* Typed events (V2-SPEC § 7) — navigations, route/query/mutation/render/window errors. Called
|
|
53
|
+
* synchronously and wrapped in `try/catch`, so a throwing sink never breaks a render. Events carry
|
|
54
|
+
* ids, hashes, counts and durations only; no sink, no events.
|
|
55
|
+
*/
|
|
56
|
+
telemetry?: Telemetry
|
|
57
|
+
/** The root error boundary's UI. Unset → a minimal page with a reload button; `null` renders nothing. */
|
|
58
|
+
fallback?: ReactNode | ((error: unknown) => ReactNode)
|
|
64
59
|
/**
|
|
65
60
|
* Inject the `--vx-*` palette stylesheet once via an inline `<style>`. Default `true`. Set
|
|
66
|
-
* `false` to skip it (SSR / head injection — emit `buildPaletteCss(paletteOptions)` yourself
|
|
67
|
-
*
|
|
68
|
-
* A `{ fonts }` config passed to `createBasaltTheme` rides this SAME injection (its
|
|
69
|
-
* `--basalt-font-*` declarations are appended to the same `<style>`), so `injectPalette={false}`
|
|
70
|
-
* opts fonts out too — emit `buildFontsCss(theme.other.basaltFonts)` yourself alongside the
|
|
71
|
-
* palette CSS in that case.
|
|
72
|
-
* A `{ radius }` config rides the SAME injection too (its `--vx-radius-*` override declarations
|
|
73
|
-
* are appended alongside), so `injectPalette={false}` opts radius out just the same — an SSR
|
|
74
|
-
* consumer disabling injection must also emit `buildRadiusCss(theme.other.basaltRadius)`
|
|
75
|
-
* themselves, or `var(--vx-radius-*)` consumers render at their defaults instead of the retuned
|
|
76
|
-
* level.
|
|
77
|
-
* A `{ density }` config rides the SAME injection too (its `--vx-space-*` override declarations
|
|
78
|
-
* are appended alongside), so `injectPalette={false}` opts density out just the same — an SSR
|
|
79
|
-
* consumer disabling injection must also emit `buildDensityCss(theme.other.basaltDensity)`
|
|
80
|
-
* themselves, or `var(--vx-space-*)` consumers render at their defaults instead of the retuned
|
|
81
|
-
* level.
|
|
61
|
+
* `false` to skip it (SSR / head injection — emit `buildPaletteCss(paletteOptions)` yourself).
|
|
62
|
+
* Fonts, radius and density configs ride the same injection, so `false` opts them out too.
|
|
82
63
|
*/
|
|
83
64
|
injectPalette?: boolean
|
|
84
65
|
/**
|
|
85
66
|
* Passed through to `buildPaletteCss` so a consumer can append its own series/groups/derived
|
|
86
|
-
* declarations on top of the framework primitives.
|
|
67
|
+
* declarations on top of the framework primitives.
|
|
87
68
|
*/
|
|
88
69
|
paletteOptions?: BuildPaletteOpts
|
|
89
70
|
/** Default color scheme. Defaults to dark. */
|
|
90
71
|
defaultColorScheme?: MantineProviderProps['defaultColorScheme']
|
|
91
72
|
/**
|
|
92
|
-
*
|
|
93
|
-
*
|
|
94
|
-
* NEVER a no-op prop — the BasaltErrorBoundary + listeners that feed it ship in this same freeze.
|
|
95
|
-
*
|
|
96
|
-
* @example
|
|
97
|
-
* <BasaltProvider onError={(e, ctx) => Sentry.captureException(e, { tags: { kind: ctx.kind } })}>
|
|
98
|
-
*/
|
|
99
|
-
onError?: (error: unknown, ctx: BasaltErrorContext) => void
|
|
100
|
-
/**
|
|
101
|
-
* CSP nonce for the raw palette `<style>` at provider/index.tsx (the one element `...rest`
|
|
102
|
-
* cannot reach — it is basalt's own JSX, not a Mantine prop). For Mantine's own injected styles,
|
|
103
|
-
* also pass `getStyleNonce={() => nonce}` via `...rest` — Mantine v9 has no top-level `nonce`
|
|
104
|
-
* prop; its nonce mechanism is `getStyleNonce: () => string`, which flows through `...rest`.
|
|
73
|
+
* CSP nonce for the raw palette `<style>` (the one element `...rest` cannot reach). For Mantine's
|
|
74
|
+
* own injected styles also pass `getStyleNonce={() => nonce}` via `...rest`.
|
|
105
75
|
*/
|
|
106
76
|
nonce?: string
|
|
107
|
-
/**
|
|
108
|
-
* Options threaded through to the auto-mounted `ConnectivityProvider` (everything except
|
|
109
|
-
* `children`) — `sseUrl`, `healthUrl`, `healthIntervalMs`, and `override` (previously
|
|
110
|
-
* unreachable through `BasaltProvider`: the only way to reach it was a second, shadowing
|
|
111
|
-
* `ConnectivityProvider`).
|
|
112
|
-
*/
|
|
113
|
-
connectivity?: Omit<ConnectivityProviderProps, 'children'>
|
|
114
77
|
/**
|
|
115
78
|
* The size class `useSizeClass()` reports on the server and during hydration, before `matchMedia`
|
|
116
|
-
* can answer. Default `'compact'
|
|
117
|
-
* reads `matchMedia` on its first render and never sees this value. An SSR app that knows the
|
|
118
|
-
* device class (UA hint, cookie) passes it so the first frame already matches. An SSR desktop app
|
|
119
|
-
* SHOULD pass it: without it the first paint is `'compact'`, and `PageAside`/`ThreadWorkspace`
|
|
120
|
-
* remount after hydration when the real class lands.
|
|
79
|
+
* can answer. Default `'compact'`. SSR only; an SSR desktop app SHOULD pass it.
|
|
121
80
|
*/
|
|
122
81
|
sizeClassHint?: SizeClass
|
|
123
82
|
} & Omit<MantineProviderProps, 'children' | 'theme' | 'defaultColorScheme' | 'cssVariablesResolver'>
|
|
124
83
|
|
|
125
|
-
// ──
|
|
126
|
-
|
|
127
|
-
function defaultOnError(error: unknown, ctx: BasaltErrorContext): void {
|
|
128
|
-
if (process.env.NODE_ENV !== 'production') {
|
|
129
|
-
// eslint-disable-next-line no-console -- intentional dev-only diagnostic when no onError is supplied
|
|
130
|
-
console.error('[BasaltProvider] unhandled error', ctx.kind, error)
|
|
131
|
-
}
|
|
132
|
-
// prod: no-op
|
|
133
|
-
}
|
|
84
|
+
// ── Root error boundary ───────────────────────────────────────────────────────────────────────────
|
|
134
85
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* `BasaltErrorBoundary`'s props — exported (C5 consolidation) so a consumer mounting a nested
|
|
139
|
-
* boundary can name the type, e.g. for a wrapper component's own prop forwarding.
|
|
140
|
-
*/
|
|
141
|
-
export type BasaltErrorBoundaryProps = {
|
|
86
|
+
type RootBoundaryProps = {
|
|
142
87
|
children: ReactNode
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
* prod — the same fallback `BasaltProvider`'s own top-level `onError` uses), so a NESTED
|
|
146
|
-
* boundary mounted with no `onError` still surfaces something in dev instead of silently
|
|
147
|
-
* swallowing it.
|
|
148
|
-
*/
|
|
149
|
-
onError?: (error: unknown, ctx: BasaltErrorContext) => void
|
|
150
|
-
/**
|
|
151
|
-
* UI to render when a render error is caught. If a function, called with the error. Unset →
|
|
152
|
-
* {@link DefaultErrorFallback} — a minimal `PageTitle` + reload button, never a silent `null`;
|
|
153
|
-
* pass `fallback={null}` explicitly for the old swallow-it behaviour.
|
|
154
|
-
*/
|
|
155
|
-
fallback?: ReactNode | ((error: unknown) => ReactNode)
|
|
88
|
+
emit: Telemetry
|
|
89
|
+
fallback: BasaltProviderProps['fallback']
|
|
156
90
|
}
|
|
157
91
|
|
|
158
92
|
type BoundaryState = { hasError: boolean; error: unknown }
|
|
159
93
|
|
|
160
94
|
/**
|
|
161
|
-
* The boundary's own default fallback — a `PageTitle`
|
|
162
|
-
*
|
|
163
|
-
* a consumer wanting session ids, a stack trace or a "try to recover" reset (argo's own
|
|
164
|
-
* `lib/error-boundary.tsx`) still passes its own `fallback` render function — this default exists
|
|
165
|
-
* so an app that mounts `BasaltErrorBoundary` and does nothing else shows a page, not a blank one.
|
|
95
|
+
* The boundary's own default fallback — a `PageTitle` plus a plain reload affordance. Deliberately
|
|
96
|
+
* minimal: a consumer wanting session ids or a "try to recover" reset passes its own `fallback`.
|
|
166
97
|
*/
|
|
167
98
|
function DefaultErrorFallback(): ReactNode {
|
|
168
99
|
return (
|
|
@@ -182,18 +113,9 @@ function DefaultErrorFallback(): ReactNode {
|
|
|
182
113
|
)
|
|
183
114
|
}
|
|
184
115
|
|
|
185
|
-
/**
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
* Also exported so consumers can mount nested boundaries with the same `onError` contract.
|
|
189
|
-
*
|
|
190
|
-
* @example
|
|
191
|
-
* <BasaltErrorBoundary onError={(e, ctx) => Sentry.captureException(e)} fallback={<p>Something went wrong.</p>}>
|
|
192
|
-
* <MyFeature />
|
|
193
|
-
* </BasaltErrorBoundary>
|
|
194
|
-
*/
|
|
195
|
-
export class BasaltErrorBoundary extends Component<BasaltErrorBoundaryProps, BoundaryState> {
|
|
196
|
-
constructor(props: BasaltErrorBoundaryProps) {
|
|
116
|
+
/** Catches render-phase errors inside `MantineProvider`, so a fallback still has theme context. */
|
|
117
|
+
export class RootBoundary extends Component<RootBoundaryProps, BoundaryState> {
|
|
118
|
+
constructor(props: RootBoundaryProps) {
|
|
197
119
|
super(props)
|
|
198
120
|
this.state = { hasError: false, error: undefined }
|
|
199
121
|
}
|
|
@@ -202,43 +124,43 @@ export class BasaltErrorBoundary extends Component<BasaltErrorBoundaryProps, Bou
|
|
|
202
124
|
return { hasError: true, error }
|
|
203
125
|
}
|
|
204
126
|
|
|
205
|
-
override componentDidCatch(error: unknown,
|
|
206
|
-
|
|
207
|
-
|
|
127
|
+
override componentDidCatch(error: unknown, _info: ErrorInfo): void {
|
|
128
|
+
if (process.env.NODE_ENV !== 'production') console.error('[basalt] render error', error)
|
|
129
|
+
this.props.emit({
|
|
130
|
+
type: 'render.error',
|
|
131
|
+
failed: true,
|
|
132
|
+
start: now(),
|
|
133
|
+
attributes: {
|
|
134
|
+
'exception.type': errorName(error),
|
|
135
|
+
'basalt.error.kind': 'render',
|
|
136
|
+
'basalt.error.boundary': 'root',
|
|
137
|
+
},
|
|
138
|
+
})
|
|
208
139
|
}
|
|
209
140
|
|
|
210
141
|
override render(): ReactNode {
|
|
211
|
-
if (this.state.hasError)
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
}
|
|
217
|
-
return this.props.children
|
|
142
|
+
if (!this.state.hasError) return this.props.children
|
|
143
|
+
const { fallback } = this.props
|
|
144
|
+
if (fallback === undefined) return <DefaultErrorFallback />
|
|
145
|
+
if (fallback === null) return null
|
|
146
|
+
return typeof fallback === 'function' ? fallback(this.state.error) : fallback
|
|
218
147
|
}
|
|
219
148
|
}
|
|
220
149
|
|
|
221
150
|
/**
|
|
222
151
|
* Compose the four independently-built override CSS blocks into ONE injected `<style>` body, in
|
|
223
|
-
* cascade-winning order. Every builder
|
|
224
|
-
*
|
|
225
|
-
*
|
|
226
|
-
*
|
|
227
|
-
* overrides must out-cascade the base palette's own defaults), `radius` after `fonts`, `fonts` after
|
|
228
|
-
* `base` — reorder this array and the density/radius/fonts knobs silently stop working, with every
|
|
229
|
-
* OTHER existing test still green (each builder is tested for its OWN output in isolation, not for
|
|
230
|
-
* where it lands in the concatenated string). Exported as a pure function (not inlined in
|
|
231
|
-
* `BasaltBridge`'s `useMemo`) purely so `provider/index.test.ts` can assert the ORDER holds without
|
|
232
|
-
* rendering a React tree.
|
|
152
|
+
* cascade-winning order. Every builder emits its declarations under a bare `:root { ... }` block —
|
|
153
|
+
* EQUAL selector specificity — so nothing but DOCUMENT ORDER decides which value a browser paints.
|
|
154
|
+
* `density` must come LAST, `radius` after `fonts`, `fonts` after `base`; reorder this array and the
|
|
155
|
+
* knobs silently stop working. Exported as a pure function so a test can assert the ORDER.
|
|
233
156
|
*/
|
|
234
157
|
export function composeInjectedCss(
|
|
235
158
|
base: string,
|
|
236
159
|
fontsCss: string,
|
|
237
160
|
radiusCss: string,
|
|
238
161
|
densityCss: string,
|
|
239
|
-
inputsCss = '',
|
|
240
162
|
): string {
|
|
241
|
-
return [base, fontsCss, radiusCss, densityCss
|
|
163
|
+
return [base, fontsCss, radiusCss, densityCss].filter(Boolean).join('\n')
|
|
242
164
|
}
|
|
243
165
|
|
|
244
166
|
// ── Host attribute ────────────────────────────────────────────────────────────────────────────────
|
|
@@ -284,30 +206,22 @@ export function useHostAttribute(): void {
|
|
|
284
206
|
// ── Inner bridge ──────────────────────────────────────────────────────────────────────────────────
|
|
285
207
|
|
|
286
208
|
/**
|
|
287
|
-
* Inner bridge — must render INSIDE `MantineProvider`
|
|
288
|
-
*
|
|
289
|
-
* Also registers global window error listeners for the `onError` contract.
|
|
209
|
+
* Inner bridge — must render INSIDE `MantineProvider` (it reads the theme and registers the
|
|
210
|
+
* color-scheme handle). Injects the palette `<style>`; charts paint through those CSS variables.
|
|
290
211
|
*/
|
|
291
212
|
function BasaltBridge({
|
|
292
213
|
children,
|
|
293
214
|
injectPalette,
|
|
294
215
|
paletteOptions,
|
|
295
216
|
nonce,
|
|
296
|
-
onError,
|
|
297
217
|
}: {
|
|
298
218
|
children: ReactNode
|
|
299
219
|
injectPalette: boolean
|
|
300
220
|
paletteOptions: BuildPaletteOpts | undefined
|
|
301
221
|
nonce: string | undefined
|
|
302
|
-
onError: (error: unknown, ctx: BasaltErrorContext) => void
|
|
303
222
|
}) {
|
|
304
|
-
// Resolve via Mantine's computed scheme so 'auto' follows the OS prefers-color-scheme
|
|
305
|
-
// (fallback 'dark' before hydration, matching the provider's defaultColorScheme).
|
|
306
|
-
const resolved = useComputedColorScheme('dark')
|
|
307
|
-
|
|
308
223
|
// `commands/shell-bridge.ts`'s `setColorScheme` handle — registered here (already inside
|
|
309
|
-
// `MantineProvider`) so a consumer's `commands.tsx` calls it with ZERO `__root.tsx` wiring
|
|
310
|
-
// unlike argo's hand-rolled `color-scheme-bridge.ts` this seeds from (see that file's own doc).
|
|
224
|
+
// `MantineProvider`) so a consumer's `commands.tsx` calls it with ZERO `__root.tsx` wiring.
|
|
311
225
|
const { setColorScheme: setMantineColorScheme } = useMantineColorScheme()
|
|
312
226
|
useEffect(() => {
|
|
313
227
|
registerColorSchemeSetter(setMantineColorScheme)
|
|
@@ -315,18 +229,14 @@ function BasaltBridge({
|
|
|
315
229
|
}, [setMantineColorScheme])
|
|
316
230
|
|
|
317
231
|
// `createBasaltTheme`'s non-default `{ derive }` / `{ fonts }` / `{ radius }` / `{ density }`
|
|
318
|
-
// paths stash the resolved values on `theme.other.
|
|
319
|
-
// `theme.other.basaltRadius` / `theme.other.basaltDensity` — read them here (INSIDE
|
|
232
|
+
// paths stash the resolved values on `theme.other.basalt*` — read them here (INSIDE
|
|
320
233
|
// MantineProvider, so `useMantineTheme` sees the fully-merged runtime theme) to decide whether the
|
|
321
|
-
// pre-baked static palette CSS still applies or a re-derived one is needed
|
|
322
|
-
// `--basalt-font-*` / `--vx-radius-*` / `--vx-space-*` override declarations must ride along.
|
|
323
|
-
// Default/absent config -> zero extra derivation work.
|
|
234
|
+
// pre-baked static palette CSS still applies or a re-derived one is needed.
|
|
324
235
|
const theme = useMantineTheme()
|
|
325
236
|
const deriveConfig = theme.other?.basaltDerive
|
|
326
237
|
const fontsConfig = theme.other?.basaltFonts
|
|
327
238
|
const radiusConfig = theme.other?.basaltRadius
|
|
328
239
|
const densityConfig = theme.other?.basaltDensity
|
|
329
|
-
const desktopInputs = theme.other?.['basaltInputs'] === 'desktop'
|
|
330
240
|
const paletteCss = useMemo(() => {
|
|
331
241
|
if (!injectPalette) return ''
|
|
332
242
|
const base =
|
|
@@ -335,48 +245,19 @@ function BasaltBridge({
|
|
|
335
245
|
: // Memoized by `buildPaletteData` (keyed on the config value), so retuning is never a
|
|
336
246
|
// per-render re-derivation once a given config has been built once.
|
|
337
247
|
buildPaletteCss(paletteOptions, buildPaletteData(deriveConfig))
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
}, [
|
|
345
|
-
injectPalette,
|
|
346
|
-
deriveConfig,
|
|
347
|
-
fontsConfig,
|
|
348
|
-
radiusConfig,
|
|
349
|
-
densityConfig,
|
|
350
|
-
desktopInputs,
|
|
351
|
-
paletteOptions,
|
|
352
|
-
])
|
|
353
|
-
|
|
354
|
-
useEffect(() => {
|
|
355
|
-
// SSR guard — window is not available in server contexts
|
|
356
|
-
if (typeof window === 'undefined') return
|
|
357
|
-
|
|
358
|
-
const handleError = (e: ErrorEvent): void => {
|
|
359
|
-
onError(e.error ?? e, { kind: 'window', event: e })
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
const handleUnhandledRejection = (e: PromiseRejectionEvent): void => {
|
|
363
|
-
onError(e.reason, { kind: 'unhandledrejection', reason: e.reason })
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
window.addEventListener('error', handleError)
|
|
367
|
-
window.addEventListener('unhandledrejection', handleUnhandledRejection)
|
|
368
|
-
|
|
369
|
-
return () => {
|
|
370
|
-
window.removeEventListener('error', handleError)
|
|
371
|
-
window.removeEventListener('unhandledrejection', handleUnhandledRejection)
|
|
372
|
-
}
|
|
373
|
-
}, [onError])
|
|
248
|
+
return composeInjectedCss(
|
|
249
|
+
base,
|
|
250
|
+
buildFontsCss(fontsConfig),
|
|
251
|
+
buildRadiusCss(radiusConfig),
|
|
252
|
+
buildDensityCss(densityConfig),
|
|
253
|
+
)
|
|
254
|
+
}, [injectPalette, deriveConfig, fontsConfig, radiusConfig, densityConfig, paletteOptions])
|
|
374
255
|
|
|
375
256
|
return (
|
|
376
|
-
|
|
257
|
+
<>
|
|
377
258
|
{injectPalette ? <style nonce={nonce}>{paletteCss}</style> : null}
|
|
378
259
|
{children}
|
|
379
|
-
|
|
260
|
+
</>
|
|
380
261
|
)
|
|
381
262
|
}
|
|
382
263
|
|
|
@@ -386,7 +267,7 @@ function BasaltBridge({
|
|
|
386
267
|
* Module-level (deliberately NOT a per-instance ref, unlike `fence-block.tsx`'s warn-once gate) —
|
|
387
268
|
* the whole point is detecting a SECOND, unrelated `BasaltProvider` mounted anywhere else in the
|
|
388
269
|
* tree, which a per-instance gate could never see. Nested/duplicate providers double-mount
|
|
389
|
-
* `MantineProvider`, the palette `<style
|
|
270
|
+
* `MantineProvider`, the palette `<style>`, the router and the overlays — real
|
|
390
271
|
* misuse, not a false positive from React 18 StrictMode's double-invoke (that mounts/unmounts the
|
|
391
272
|
* SAME instance in sequence, so the count returns to 0 before a second instance could ever exist).
|
|
392
273
|
*/
|
|
@@ -397,31 +278,164 @@ function useDuplicateProviderGuard(): void {
|
|
|
397
278
|
if (providerMounts.mount() > 1 && process.env.NODE_ENV !== 'production') {
|
|
398
279
|
console.warn(
|
|
399
280
|
'[basalt] BasaltProvider: more than one instance is mounted at once — nested/duplicate ' +
|
|
400
|
-
'BasaltProviders double-mount MantineProvider, the palette <style
|
|
401
|
-
'
|
|
281
|
+
'BasaltProviders double-mount MantineProvider, the palette <style>, the router and the ' +
|
|
282
|
+
'overlays. Mount exactly one, at the app root.',
|
|
402
283
|
)
|
|
403
284
|
}
|
|
404
285
|
return () => void providerMounts.unmount()
|
|
405
286
|
}, [])
|
|
406
287
|
}
|
|
407
288
|
|
|
289
|
+
// ── Telemetry sources ─────────────────────────────────────────────────────────────────────────────
|
|
290
|
+
|
|
291
|
+
/** `window` `error` / `unhandledrejection` → `window.error`. */
|
|
292
|
+
function useWindowErrors(emit: Telemetry): void {
|
|
293
|
+
useEffect(() => {
|
|
294
|
+
const report = (source: 'error' | 'unhandledrejection', error: unknown): void => {
|
|
295
|
+
if (process.env.NODE_ENV !== 'production') console.error(`[basalt] ${source}`, error)
|
|
296
|
+
emit({
|
|
297
|
+
type: 'window.error',
|
|
298
|
+
failed: true,
|
|
299
|
+
start: now(),
|
|
300
|
+
attributes: {
|
|
301
|
+
'exception.type': errorName(error),
|
|
302
|
+
'basalt.error.kind': source === 'error' ? 'window' : 'unhandledrejection',
|
|
303
|
+
'basalt.error.source': source,
|
|
304
|
+
},
|
|
305
|
+
})
|
|
306
|
+
}
|
|
307
|
+
const onError = (e: ErrorEvent): void => report('error', e.error ?? e)
|
|
308
|
+
const onRejection = (e: PromiseRejectionEvent): void => report('unhandledrejection', e.reason)
|
|
309
|
+
window.addEventListener('error', onError)
|
|
310
|
+
window.addEventListener('unhandledrejection', onRejection)
|
|
311
|
+
return () => {
|
|
312
|
+
window.removeEventListener('error', onError)
|
|
313
|
+
window.removeEventListener('unhandledrejection', onRejection)
|
|
314
|
+
}
|
|
315
|
+
}, [emit])
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/** Router navigations and the QueryClient's caches → `route.*`, `query.error`, `mutation.error`. */
|
|
319
|
+
function useDataTelemetry(router: AnyRouter, client: QueryClient, emit: Telemetry): void {
|
|
320
|
+
useEffect(() => {
|
|
321
|
+
const unbind = bindRouterTelemetry(router, emit)
|
|
322
|
+
|
|
323
|
+
// Keyed by the target href: a newer navigation overwrites, and a resolve for any other target
|
|
324
|
+
// (a superseded or redirected navigation) is dropped rather than paired with the wrong start.
|
|
325
|
+
let pending: { href: string; start: number; from: string } | undefined
|
|
326
|
+
const offBefore = router.subscribe('onBeforeNavigate', (ev) => {
|
|
327
|
+
pending = { href: ev.toLocation.href, start: now(), from: ev.fromLocation?.pathname ?? '' }
|
|
328
|
+
})
|
|
329
|
+
const offResolved = router.subscribe('onResolved', (ev) => {
|
|
330
|
+
if (pending?.href !== ev.toLocation.href) return
|
|
331
|
+
const { start, from } = pending
|
|
332
|
+
pending = undefined
|
|
333
|
+
emit({
|
|
334
|
+
type: 'route.navigate',
|
|
335
|
+
failed: false,
|
|
336
|
+
start,
|
|
337
|
+
duration: now() - start,
|
|
338
|
+
attributes: {
|
|
339
|
+
'basalt.route.id': router.state.matches.at(-1)?.routeId ?? 'unknown',
|
|
340
|
+
'basalt.route.from': from,
|
|
341
|
+
'url.path': ev.toLocation.pathname,
|
|
342
|
+
},
|
|
343
|
+
})
|
|
344
|
+
})
|
|
345
|
+
|
|
346
|
+
const offQuery = client.getQueryCache().subscribe((ev) => {
|
|
347
|
+
if (ev.type !== 'updated' || ev.action.type !== 'error') return
|
|
348
|
+
emit({
|
|
349
|
+
type: 'query.error',
|
|
350
|
+
failed: true,
|
|
351
|
+
start: now(),
|
|
352
|
+
attributes: {
|
|
353
|
+
'basalt.query.hash': ev.query.queryHash,
|
|
354
|
+
'basalt.query.failure_count': ev.query.state.fetchFailureCount,
|
|
355
|
+
'exception.type': errorName(ev.action.error),
|
|
356
|
+
'basalt.error.kind': 'query',
|
|
357
|
+
},
|
|
358
|
+
})
|
|
359
|
+
})
|
|
360
|
+
const offMutation = client.getMutationCache().subscribe((ev) => {
|
|
361
|
+
if (ev.type !== 'updated' || ev.action.type !== 'error') return
|
|
362
|
+
emit({
|
|
363
|
+
type: 'mutation.error',
|
|
364
|
+
failed: true,
|
|
365
|
+
start: now(),
|
|
366
|
+
attributes: {
|
|
367
|
+
'basalt.mutation.key': JSON.stringify(ev.mutation.options.mutationKey ?? null),
|
|
368
|
+
'exception.type': errorName(ev.action.error),
|
|
369
|
+
'basalt.error.kind': 'mutation',
|
|
370
|
+
},
|
|
371
|
+
})
|
|
372
|
+
})
|
|
373
|
+
|
|
374
|
+
return () => {
|
|
375
|
+
unbind()
|
|
376
|
+
offBefore()
|
|
377
|
+
offResolved()
|
|
378
|
+
offQuery()
|
|
379
|
+
offMutation()
|
|
380
|
+
}
|
|
381
|
+
}, [router, client, emit])
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
// ── Dev dock (dev-only, behind a literal NODE_ENV read at the lazy site) ──────────────────────────
|
|
385
|
+
|
|
386
|
+
const LazyDevDock = lazy(() => import('../dev-dock').then((m) => ({ default: m.BasaltDevDock })))
|
|
387
|
+
|
|
388
|
+
function readQueryClient(router: AnyRouter): QueryClient {
|
|
389
|
+
const client = (router.options.context as Partial<BasaltRouterContext> | undefined)?.queryClient
|
|
390
|
+
if (client === undefined) {
|
|
391
|
+
throw new Error(
|
|
392
|
+
'[basalt] BasaltProvider: the router has no context.queryClient — create it with ' +
|
|
393
|
+
'createBasaltRouter({ routeTree }).',
|
|
394
|
+
)
|
|
395
|
+
}
|
|
396
|
+
return client
|
|
397
|
+
}
|
|
398
|
+
|
|
408
399
|
// ── Public provider ───────────────────────────────────────────────────────────────────────────────
|
|
409
400
|
|
|
410
401
|
export function BasaltProvider({
|
|
411
|
-
|
|
402
|
+
router,
|
|
412
403
|
theme,
|
|
404
|
+
telemetry,
|
|
405
|
+
fallback,
|
|
413
406
|
injectPalette = true,
|
|
414
407
|
paletteOptions,
|
|
415
408
|
defaultColorScheme = 'dark',
|
|
416
|
-
onError,
|
|
417
409
|
nonce,
|
|
418
|
-
connectivity,
|
|
419
410
|
sizeClassHint = 'compact',
|
|
420
411
|
...rest
|
|
421
412
|
}: BasaltProviderProps) {
|
|
422
413
|
useDuplicateProviderGuard()
|
|
423
414
|
useHostAttribute()
|
|
424
|
-
|
|
415
|
+
|
|
416
|
+
// The sink is read through a ref, so an inline `telemetry` function does not re-subscribe.
|
|
417
|
+
const sinkRef = useRef(telemetry)
|
|
418
|
+
useEffect(() => {
|
|
419
|
+
sinkRef.current = telemetry
|
|
420
|
+
})
|
|
421
|
+
const emit = useMemo(() => createEmitter((event) => sinkRef.current?.(event)), [])
|
|
422
|
+
useWindowErrors(emit)
|
|
423
|
+
useRegistryHotkeys()
|
|
424
|
+
// `overlays.confirm` is an imperative call; this tells it a `ModalsProvider` is live.
|
|
425
|
+
useEffect(() => registerModalsProvider(), [])
|
|
426
|
+
|
|
427
|
+
const client = readQueryClient(router)
|
|
428
|
+
useDataTelemetry(router, client, emit)
|
|
429
|
+
|
|
430
|
+
const [devTool, setDevTool] = useState<BasaltDevDockTool | null>(null)
|
|
431
|
+
// Rebuilt on mount and again at every open, so a command's `when()` is read when the palette
|
|
432
|
+
// appears, not frozen at mount — and `detectMac` (inside the builder) never runs during render.
|
|
433
|
+
const [actions, setActions] = useState<SpotlightActionData[]>([])
|
|
434
|
+
const refreshActions = useCallback(
|
|
435
|
+
() => setActions(buildSpotlightActions(router, setDevTool)),
|
|
436
|
+
[router],
|
|
437
|
+
)
|
|
438
|
+
useEffect(refreshActions, [refreshActions])
|
|
425
439
|
|
|
426
440
|
// `createBasaltTheme(theme)` — plus, when the theme lab's "Apply" switch is on, the delta of its
|
|
427
441
|
// persisted config, so the dev tool moves the numeric `defaultProps` and `theme.spacing` a `<style>`
|
|
@@ -429,31 +443,47 @@ export function BasaltProvider({
|
|
|
429
443
|
// Basalt base and nothing else. See `./lab-theme.ts`.
|
|
430
444
|
const resolvedTheme = useLabTheme(theme)
|
|
431
445
|
|
|
432
|
-
const resolvedConnectivity = connectivity ?? {}
|
|
433
|
-
|
|
434
446
|
return (
|
|
435
447
|
// `...rest` spreads FIRST so a consumer's `MantineProviderProps` can never shadow the three
|
|
436
448
|
// values that follow it — `cssVariablesResolver` in particular is the resolver the package
|
|
437
|
-
// exists to install
|
|
438
|
-
// this is belt-and-braces against a widened rest at the call site.
|
|
449
|
+
// exists to install.
|
|
439
450
|
<MantineProvider
|
|
440
451
|
{...rest}
|
|
441
452
|
theme={resolvedTheme}
|
|
442
453
|
cssVariablesResolver={cssVariablesResolver}
|
|
443
454
|
defaultColorScheme={defaultColorScheme}
|
|
444
455
|
>
|
|
445
|
-
<
|
|
446
|
-
<BasaltBridge
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
456
|
+
<RootBoundary emit={emit} fallback={fallback}>
|
|
457
|
+
<BasaltBridge injectPalette={injectPalette} paletteOptions={paletteOptions} nonce={nonce}>
|
|
458
|
+
<TelemetryContext.Provider value={emit}>
|
|
459
|
+
<SizeClassHintContext.Provider value={sizeClassHint}>
|
|
460
|
+
<QueryClientProvider client={client}>
|
|
461
|
+
{/* ModalsProvider WRAPS the router, so `useModals()` / `openContextModal` have real context. */}
|
|
462
|
+
<ModalsProvider>
|
|
463
|
+
<RouterProvider router={router} />
|
|
464
|
+
{/* The literal read sits at the branch, so a production build drops the import. */}
|
|
465
|
+
{process.env.NODE_ENV !== 'production' && (
|
|
466
|
+
<Suspense fallback={null}>
|
|
467
|
+
<LazyDevDock
|
|
468
|
+
tool={devTool}
|
|
469
|
+
onClose={() => setDevTool(null)}
|
|
470
|
+
router={router}
|
|
471
|
+
/>
|
|
472
|
+
</Suspense>
|
|
473
|
+
)}
|
|
474
|
+
</ModalsProvider>
|
|
475
|
+
</QueryClientProvider>
|
|
476
|
+
<Notifications position="bottom-right" autoClose={4000} limit={5} />
|
|
477
|
+
<Spotlight
|
|
478
|
+
actions={actions}
|
|
479
|
+
onSpotlightOpen={refreshActions}
|
|
480
|
+
shortcut="mod + K"
|
|
481
|
+
maxHeight={420}
|
|
482
|
+
/>
|
|
483
|
+
</SizeClassHintContext.Provider>
|
|
484
|
+
</TelemetryContext.Provider>
|
|
455
485
|
</BasaltBridge>
|
|
456
|
-
</
|
|
486
|
+
</RootBoundary>
|
|
457
487
|
</MantineProvider>
|
|
458
488
|
)
|
|
459
489
|
}
|