basalt-ui 1.40.3 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +50 -45
- package/CHANGELOG.md +543 -513
- package/MIGRATING.md +969 -37
- package/README.md +172 -367
- 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 +30 -0
- package/agent/templates/DESIGN.md.tpl +2 -2
- package/agent/templates/__root.tpl +9 -16
- package/agent/templates/main.tpl +21 -0
- package/agent/templates/nav.tpl +18 -0
- package/configs/check.yml +1 -1
- package/configs/oxlint-basalt.json +4 -10
- package/configs/oxlint-plugin.js +468 -847
- package/configs/oxlint-plugin.test.ts +662 -710
- 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/foreign.d.ts +3 -2
- package/dist/agent/foreign.d.ts.map +1 -1
- 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 +14 -43
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/doctor-upgrade.d.ts +31 -0
- package/dist/cli/doctor-upgrade.d.ts.map +1 -0
- package/dist/cli/doctor-upgrade.js +269 -0
- package/dist/cli/doctor.d.ts +13 -26
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +79 -8
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +2 -4
- package/dist/cli/index.d.ts +68 -135
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +89 -76
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +43 -27
- package/dist/cli/sync.d.ts +5 -21
- package/dist/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js +4 -6
- 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/copy-action.d.ts +1 -1
- package/dist/content/glyphs.d.ts +1 -1
- 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 +77 -170
- 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/foreign.ts +3 -2
- 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 +14 -43
- package/src/cli/doctor-upgrade.ts +392 -0
- package/src/cli/doctor.ts +120 -68
- package/src/cli/help.ts +2 -4
- package/src/cli/index.ts +161 -276
- package/src/cli/init.ts +60 -37
- package/src/cli/sync.ts +13 -45
- 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/copy-action.tsx +1 -1
- package/src/content/glyphs.tsx +1 -1
- 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 +37 -192
- 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/CLAUDE-block.md.tpl +0 -40
- 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,100 +1,257 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: basalt-app
|
|
3
|
-
description: Scaffold or
|
|
4
|
-
when_to_use: User is adding basalt-ui to
|
|
3
|
+
description: Scaffold, wire, verify or upgrade a basalt-ui app — `basalt-ui init`, `doctor`, `sync`, and the 1.x to 2.0 upgrade path.
|
|
4
|
+
when_to_use: User is adding basalt-ui to an app, wiring BasaltProvider / BasaltShell / the vite preset, upgrading basalt-ui, refreshing the shipped rules, or wiring a freshness check in CI. Also when /basalt-design reports no DESIGN.md.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
components, the toolchain presets, the rules, the skills, the templates — ships in the one npm
|
|
9
|
-
package; `init` places it and `sync` refreshes it.
|
|
7
|
+
Procedure only; the law is `.claude/rules/basalt-*.md`.
|
|
10
8
|
|
|
11
|
-
##
|
|
9
|
+
## Scaffold
|
|
12
10
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
11
|
+
1. `bun add basalt-ui && bunx basalt-ui init` (the only `bunx` call; use `./node_modules/.bin/basalt-ui` after).
|
|
12
|
+
2. Check the seeded `src/main.tsx` (`init` writes it when absent); `basalt-ui/styles.css` is the only stylesheet import:
|
|
13
|
+
|
|
14
|
+
```tsx
|
|
15
|
+
// @check
|
|
16
|
+
import 'basalt-ui/styles.css'
|
|
17
|
+
import { createRoot } from 'react-dom/client'
|
|
18
|
+
import { BasaltProvider, createBasaltRouter } from 'basalt-ui'
|
|
19
|
+
import { routeTree } from './routeTree.gen'
|
|
20
|
+
const router = createBasaltRouter({ routeTree })
|
|
21
|
+
declare module '@tanstack/react-router' {
|
|
22
|
+
interface Register {
|
|
23
|
+
router: typeof router
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
createRoot(document.getElementById('root')!).render(<BasaltProvider router={router} />)
|
|
17
27
|
```
|
|
18
28
|
|
|
19
|
-
|
|
20
|
-
the `
|
|
21
|
-
`
|
|
22
|
-
`
|
|
29
|
+
3. If you use `basalt-ui/controls-dates`, import `@mantine/dates/styles.layer.css` after `basalt-ui/styles.css` (core must precede dates in `@layer mantine`).
|
|
30
|
+
4. Install the peers of each subpath you import: read its `Install: bun add …` line in `node_modules/basalt-ui/llms.txt`; a subpath with no `Install:` line needs only the required peers listed at the top of that file.
|
|
31
|
+
5. In `vite.config.ts` spread `...basaltViteConfig({ port, apiTarget })` and register, in this order, `plugins: [tanstackRouter({ target: 'react', autoCodeSplitting: true }), react(), ...basaltAppPlugin({ name, description })]`. Run `bun add -d @tanstack/router-plugin` and import `tanstackRouter` from `@tanstack/router-plugin/vite`.
|
|
32
|
+
6. Run `vite build` once so the plugin writes `src/routeTree.gen.ts`; commit it (`tsc -b` fails without it).
|
|
33
|
+
7. In `src/routes/__root.tsx`: `<BasaltShell brand={{ name }} nav={NAV}><Outlet /></BasaltShell>`; build `NAV` with `defineNav` in `src/lib/nav.tsx`.
|
|
34
|
+
8. Add a page as a file route, and link to it with `navTarget`:
|
|
23
35
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
36
|
+
```tsx
|
|
37
|
+
// @check
|
|
38
|
+
import { Link, createFileRoute, linkOptions } from '@tanstack/react-router'
|
|
39
|
+
import { defineNav, navGroup, navTarget } from 'basalt-ui'
|
|
40
|
+
// src/routes/dashboard.tsx — the breadcrumb and page title come from the nav item's `label`; export the component too (react/only-export-components)
|
|
41
|
+
export const Route = createFileRoute('/dashboard')({ component: Dashboard })
|
|
42
|
+
export function Dashboard() {
|
|
43
|
+
return <h2>Dashboard</h2>
|
|
44
|
+
}
|
|
45
|
+
// src/lib/nav.tsx
|
|
46
|
+
export const NAV = defineNav({
|
|
47
|
+
groups: [
|
|
48
|
+
navGroup({ id: 'main', label: 'Main' }, [
|
|
49
|
+
{ id: 'dashboard', label: 'Dashboard', link: linkOptions({ to: '/dashboard' }) },
|
|
50
|
+
]),
|
|
51
|
+
],
|
|
52
|
+
})
|
|
29
53
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
the full one pairs with the shipped `tsconfig.react-app.json` (ES2023 lib: `unicorn/no-array-sort`
|
|
34
|
-
steers to `toSorted()`).
|
|
54
|
+
// anywhere
|
|
55
|
+
export const ToDashboard = () => <Link {...navTarget(NAV, 'dashboard')}>Dashboard</Link>
|
|
56
|
+
```
|
|
35
57
|
|
|
36
|
-
|
|
58
|
+
9. Fill in `DESIGN.md` (identity, series dictionary, deviations).
|
|
59
|
+
|
|
60
|
+
## Add a table
|
|
61
|
+
|
|
62
|
+
A table is `BasaltDataTable` with columns from `createColumnHelper`; it has no `count` prop (with `title`, the header counts the rows itself):
|
|
37
63
|
|
|
38
64
|
```tsx
|
|
39
|
-
//
|
|
40
|
-
import '
|
|
41
|
-
import
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
65
|
+
// @check
|
|
66
|
+
import { money } from 'basalt-ui/format'
|
|
67
|
+
import { BasaltDataTable, createColumnHelper } from 'basalt-ui/table'
|
|
68
|
+
|
|
69
|
+
type Row = { id: string; name: string; revenue: number }
|
|
70
|
+
const col = createColumnHelper<Row>()
|
|
71
|
+
const columns = [
|
|
72
|
+
col.accessor('name', { header: 'Name' }),
|
|
73
|
+
col.accessor('revenue', {
|
|
74
|
+
header: 'Revenue',
|
|
75
|
+
sortFn: 'basic', // v9 `sortFn`, not v8 `sortingFn`
|
|
76
|
+
meta: { align: 'right' }, // numbers are mono-numeral by default; `numeral: false` opts out
|
|
77
|
+
cell: (c) => money(c.getValue(), { currency: 'USD' }),
|
|
78
|
+
}),
|
|
79
|
+
]
|
|
80
|
+
export const Revenue = ({ rows }: { rows: Row[] }) => (
|
|
81
|
+
<BasaltDataTable data={rows} columns={columns} getRowId={(r) => r.id} />
|
|
82
|
+
)
|
|
49
83
|
```
|
|
50
84
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
85
|
+
## Stream a slow section
|
|
86
|
+
|
|
87
|
+
The shell holds no promise; the loader returns the slow promise unawaited (settled, so a failure renders the chart's error state), and the fallback is the same chart pending (it fills the final box):
|
|
88
|
+
|
|
89
|
+
```tsx
|
|
90
|
+
// @check
|
|
91
|
+
import { Await, createFileRoute } from '@tanstack/react-router'
|
|
92
|
+
import { Suspense } from 'react'
|
|
93
|
+
import { Lines } from 'basalt-ui/charts'
|
|
94
|
+
import type { ChartSeries, ChartState } from 'basalt-ui/charts'
|
|
95
|
+
import { VX } from 'basalt-ui/tokens'
|
|
96
|
+
type P = { t: number; v: number }
|
|
97
|
+
declare const fetchPoints: () => Promise<P[]>
|
|
98
|
+
const series = [
|
|
99
|
+
{ key: 'v', label: 'Value', color: VX.accent, getValue: (p) => p.v },
|
|
100
|
+
] satisfies ChartSeries<P>[]
|
|
101
|
+
const chart = (data: P[], state: ChartState) => (
|
|
102
|
+
<Lines ariaLabel="Value" data={data} x={(p) => p.t} series={series} state={state} />
|
|
103
|
+
)
|
|
104
|
+
export const Route = createFileRoute('/live')({
|
|
105
|
+
loader: () => ({
|
|
106
|
+
points: fetchPoints().then(
|
|
107
|
+
(data) => ({ data }),
|
|
108
|
+
(error: unknown) => ({ data: [], error }),
|
|
109
|
+
),
|
|
110
|
+
}),
|
|
111
|
+
component: Live,
|
|
56
112
|
})
|
|
113
|
+
export function Live() {
|
|
114
|
+
const { points } = Route.useLoaderData()
|
|
115
|
+
return (
|
|
116
|
+
<Suspense fallback={chart([], { pending: true })}>
|
|
117
|
+
<Await promise={points}>
|
|
118
|
+
{(r) => chart(r.data, { error: r.error, empty: r.data.length === 0 })}
|
|
119
|
+
</Await>
|
|
120
|
+
</Suspense>
|
|
121
|
+
)
|
|
122
|
+
}
|
|
57
123
|
```
|
|
58
124
|
|
|
59
|
-
|
|
60
|
-
(basalt-controls.md), `PageAside` on any page that needs a right-hand inspector — a region a ROUTE
|
|
61
|
-
claims rather than a shell prop, so it never appears in `BasaltShell`'s props — and
|
|
62
|
-
`<first basalt.root>/lib/series.ts` as the app's one guard-exempt series source (`/basalt-charts`).
|
|
63
|
-
There is no Tailwind.
|
|
125
|
+
## Add a chat
|
|
64
126
|
|
|
65
|
-
|
|
127
|
+
1. Install the `basalt-ui/agent` peers from its `Install:` line in `llms.txt`.
|
|
128
|
+
2. Implement `ThreadsStore` (in memory here), bind one transport per thread, compose the feed:
|
|
66
129
|
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
130
|
+
```tsx
|
|
131
|
+
// @check
|
|
132
|
+
import { Button } from '@mantine/core'
|
|
133
|
+
import { useState } from 'react'
|
|
134
|
+
import { ThreadFeed, ThreadFeedRow, aiSdkTransport, useAgentThreadRuns } from 'basalt-ui/agent'
|
|
135
|
+
import type { AgentPart, AgentThread, AgentTransport, ThreadsStore } from 'basalt-ui/agent'
|
|
136
|
+
|
|
137
|
+
type Thread = AgentThread<AgentPart>
|
|
71
138
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
139
|
+
function useMemoryStore(): ThreadsStore<AgentPart> {
|
|
140
|
+
const [threads, setThreads] = useState<Thread[]>([])
|
|
141
|
+
const [activeId, select] = useState<string | null>(null)
|
|
142
|
+
const patch = (id: string, change: (t: Thread) => Thread) =>
|
|
143
|
+
setThreads((all) => all.map((t) => (t.id === id ? { ...change(t), updatedAt: Date.now() } : t)))
|
|
144
|
+
return {
|
|
145
|
+
threads,
|
|
146
|
+
activeId,
|
|
147
|
+
select,
|
|
148
|
+
hydrated: true,
|
|
149
|
+
error: undefined,
|
|
150
|
+
create: () => {
|
|
151
|
+
const id = crypto.randomUUID()
|
|
152
|
+
const now = Date.now()
|
|
153
|
+
const blank: Thread = {
|
|
154
|
+
id,
|
|
155
|
+
messages: [],
|
|
156
|
+
outcome: null,
|
|
157
|
+
status: 'pending',
|
|
158
|
+
read: true,
|
|
159
|
+
createdAt: now,
|
|
160
|
+
updatedAt: now,
|
|
161
|
+
}
|
|
162
|
+
setThreads((all) => [blank, ...all])
|
|
163
|
+
return id
|
|
164
|
+
},
|
|
165
|
+
appendMessage: (id, m) => patch(id, (t) => ({ ...t, messages: [...t.messages, m] })),
|
|
166
|
+
setOutcome: (id, outcome) => patch(id, (t) => ({ ...t, outcome })),
|
|
167
|
+
setStatus: (id, status) => patch(id, (t) => ({ ...t, status })),
|
|
168
|
+
setResumeToken: (id, token) =>
|
|
169
|
+
patch(id, ({ resumeToken: _old, ...t }) =>
|
|
170
|
+
token === undefined ? t : { ...t, resumeToken: token },
|
|
171
|
+
),
|
|
172
|
+
markRead: (id) => patch(id, (t) => ({ ...t, read: true })),
|
|
173
|
+
remove: (id) => {
|
|
174
|
+
setThreads((all) => all.filter((t) => t.id !== id))
|
|
175
|
+
select((current) => (current === id ? null : current))
|
|
176
|
+
},
|
|
177
|
+
clear: () => {
|
|
178
|
+
setThreads([])
|
|
179
|
+
select(null)
|
|
180
|
+
},
|
|
181
|
+
}
|
|
182
|
+
}
|
|
75
183
|
|
|
76
|
-
|
|
184
|
+
const base = aiSdkTransport<AgentPart>({ api: '/api/chat' })
|
|
185
|
+
// A mock (swap it in for `base.forThread(threadId)`). A text part is a DELTA: parts with the same
|
|
186
|
+
// `id` are appended in order.
|
|
187
|
+
export const mock: AgentTransport<AgentPart> = {
|
|
188
|
+
async *stream(input) {
|
|
189
|
+
const id = crypto.randomUUID()
|
|
190
|
+
for (const word of `Echo: ${input}`.split(' ')) yield { id, type: 'text', text: `${word} ` }
|
|
191
|
+
},
|
|
192
|
+
}
|
|
77
193
|
|
|
78
|
-
|
|
79
|
-
|
|
194
|
+
export function Chat() {
|
|
195
|
+
const store = useMemoryStore()
|
|
196
|
+
const { runs, start, stop } = useAgentThreadRuns({
|
|
197
|
+
transport: (threadId) => base.forThread(threadId),
|
|
198
|
+
store,
|
|
199
|
+
resolveOutcome: (t) => ({
|
|
200
|
+
title: 'Chat',
|
|
201
|
+
summary: `${t.messages.length} turns`,
|
|
202
|
+
status: 'done',
|
|
203
|
+
}),
|
|
204
|
+
})
|
|
205
|
+
return (
|
|
206
|
+
<>
|
|
207
|
+
<Button onClick={() => store.select(store.create())}>New chat</Button>
|
|
208
|
+
<ThreadFeed
|
|
209
|
+
threads={store.threads}
|
|
210
|
+
activeId={store.activeId}
|
|
211
|
+
onSelect={store.select}
|
|
212
|
+
renderRow={(t) => {
|
|
213
|
+
const run = runs.get(t.id)
|
|
214
|
+
const live = run === undefined ? {} : { liveParts: run.parts, liveStatus: run.status }
|
|
215
|
+
return (
|
|
216
|
+
<ThreadFeedRow
|
|
217
|
+
key={t.id}
|
|
218
|
+
thread={t}
|
|
219
|
+
expanded={t.id === store.activeId}
|
|
220
|
+
onToggle={() => store.select(t.id === store.activeId ? null : t.id)}
|
|
221
|
+
{...live}
|
|
222
|
+
onSend={({ text }) => start(t.id, text)}
|
|
223
|
+
onStop={() => stop(t.id)}
|
|
224
|
+
/>
|
|
225
|
+
)
|
|
226
|
+
}}
|
|
227
|
+
/>
|
|
228
|
+
</>
|
|
229
|
+
)
|
|
230
|
+
}
|
|
80
231
|
```
|
|
81
232
|
|
|
82
|
-
|
|
83
|
-
recreated. **Retired upstream → deleted**, and named in the output; a rule file basalt stopped
|
|
84
|
-
shipping is doctrine your agent would otherwise keep reading.
|
|
85
|
-
- `sync --check` makes no writes and exits non-zero on any of that — wire it as the freshness gate.
|
|
86
|
-
- Run it anywhere in the repo: it resolves the project the way `check-theme` and `doctor` do,
|
|
87
|
-
announces a relocation, refreshes a PARENT install from a sub-package, and still refuses to
|
|
88
|
-
scaffold a second consumer (that stays `init`'s decision).
|
|
89
|
-
- Seeds are never reconciled or reported. They are yours.
|
|
233
|
+
3. `ThreadFeedRow` carries the `Composer`; tune it with `composerProps`.
|
|
90
234
|
|
|
91
|
-
##
|
|
235
|
+
## Verify
|
|
92
236
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
237
|
+
1. `./node_modules/.bin/basalt-ui doctor`; read to the last line. `SKIPPED` exits non-zero.
|
|
238
|
+
2. Fix every finding doctor prints, then rerun until it is clean.
|
|
239
|
+
3. `bun run lint:basalt` (`oxlint . && basalt-ui check-theme`); fix every finding at its source.
|
|
240
|
+
4. `bunx tsc --noEmit`; fix every error without `as never` or `any`.
|
|
241
|
+
|
|
242
|
+
## Refresh after any upgrade
|
|
243
|
+
|
|
244
|
+
1. `./node_modules/.bin/basalt-ui sync` (`--check` in CI, `--force` overwrites local edits).
|
|
245
|
+
2. Read its output: edited files are skipped, retired files are deleted, the AGENTS.md block is rewritten.
|
|
246
|
+
|
|
247
|
+
## Upgrade 1.x to 2.0
|
|
248
|
+
|
|
249
|
+
1. `bun add basalt-ui@latest`, then `./node_modules/.bin/basalt-ui sync`; it prunes retired managed files and rewrites the AGENTS.md block.
|
|
250
|
+
2. `./node_modules/.bin/basalt-ui doctor`; fix each of doctor's checks: a tsconfig that does not extend the shipped base, `basalt/*` rule ids the plugin no longer has, and imports of subpaths 2.0 dropped.
|
|
251
|
+
3. Work through `MIGRATING.md` § 2.0 (in the installed package): one row per removal or move; apply each that your code touches.
|
|
252
|
+
4. Run the Verify steps above.
|
|
253
|
+
|
|
254
|
+
## Not a React app
|
|
97
255
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
commit. Declare `"basalt": { "profile": "tokens-only" }` by hand; `check-theme` never infers it.
|
|
256
|
+
1. `bunx basalt-ui tokens:css --out src/tokens.css` and `bunx basalt-ui fonts:css --out src/fonts.css`.
|
|
257
|
+
2. Set `"basalt": { "profile": "tokens-only" }` in `package.json` by hand.
|
|
@@ -1,74 +1,40 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: basalt-charts
|
|
3
|
-
description: Add or extend a chart in a basalt-ui app —
|
|
4
|
-
when_to_use: User wants to add
|
|
3
|
+
description: Add or extend a chart in a basalt-ui app — pick a shipped kind or compose CartesianChart, register series colors, verify.
|
|
4
|
+
when_to_use: User wants to add or restyle a chart, introduce a metric and its color, or extract a repeated chart shape. Companion to /basalt-design.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
assumes, and `/basalt-design` owns the aesthetic law — read both before writing chart code. The
|
|
9
|
-
props themselves are in the shipped types and `llms.txt` at the install directory.
|
|
7
|
+
Procedure only; the contract is `.claude/rules/basalt-charts.md`.
|
|
10
8
|
|
|
11
|
-
##
|
|
9
|
+
## Steps
|
|
12
10
|
|
|
13
|
-
1.
|
|
14
|
-
|
|
15
|
-
axis, zones, thresholds, refLines, per-point markers, folding, per-series formatting and
|
|
16
|
-
`isPending` are all declarative already.
|
|
17
|
-
2. **This is the SECOND instance of a shape with no kind** → extract a kind and migrate both call
|
|
18
|
-
sites. Not on the first, not past the third.
|
|
19
|
-
3. **Genuinely unique** → stay bespoke in the page's own chart file, composing the primitive
|
|
20
|
-
directly. Not in a shared kinds directory.
|
|
21
|
-
|
|
22
|
-
**Extracting a kind? Prove it by porting.** Move real call sites onto it and ship the list of what
|
|
23
|
-
it could NOT express. A demo page is written against the API that already exists, so it proves
|
|
24
|
-
nothing.
|
|
25
|
-
|
|
26
|
-
## 2. Register the series (this is consumer data)
|
|
27
|
-
|
|
28
|
-
`VX.series` does not exist in the framework — which metric owns which hue is domain data, declared
|
|
29
|
-
in ONE guard-exempt file per app:
|
|
11
|
+
1. Pick the path: a shipped kind fits (`Lines`, `Bars`, `Sparkline`, `StackedArea`, `DualPanel`, `MirroredBars`, `BandStrip`, `Donut`, `Heatmap`) → use it. A second chart of a shape with no kind → extract a kind and migrate both call sites. Otherwise compose `CartesianChart` in the page's own chart file.
|
|
12
|
+
2. Register each new series color in the app's one series file (exempt from `check-theme`):
|
|
30
13
|
|
|
31
14
|
```ts
|
|
32
|
-
|
|
33
|
-
import { buildPaletteCss, defineSeries, groupTokens, seriesTokens } from 'basalt-ui/tokens'
|
|
15
|
+
import { defineSeries, groupTokens } from 'basalt-ui/tokens'
|
|
34
16
|
|
|
35
17
|
const HEALTH = defineSeries({ hrv: { light: '…', dark: '…' } }) // lighter on dark, deeper on light
|
|
36
|
-
export const SERIES =
|
|
37
|
-
export const PALETTE_CSS = buildPaletteCss({ groups: { '': HEALTH, 'walking-': WALKING } })
|
|
18
|
+
export const SERIES = groupTokens('health', HEALTH)
|
|
38
19
|
```
|
|
39
20
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
trailing dash matters) or the refs point at variables nothing declares.
|
|
43
|
-
|
|
44
|
-
## 3. Compose the primitive
|
|
45
|
-
|
|
46
|
-
A single-plot chart composes `CartesianChart` and draws only marks in the render prop — margins,
|
|
47
|
-
scales, axes, grid, the shared cursor, crosshair, dots and tooltip are already done:
|
|
21
|
+
3. Pass the group as `<BasaltProvider paletteOptions={{ groups: [SERIES] }} />` (or `buildPaletteCss` for SSR) so its vars are declared.
|
|
22
|
+
4. Compose the chart; import marks from the allowed `@tanstack/charts/*` subpaths:
|
|
48
23
|
|
|
49
24
|
```tsx
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
25
|
+
import { lineY } from '@tanstack/charts/line'
|
|
26
|
+
|
|
27
|
+
;<CartesianChart
|
|
28
|
+
ariaLabel="HRV"
|
|
29
|
+
data={data}
|
|
30
|
+
x={(d) => d.date}
|
|
31
|
+
series={[{ key: 'hrv', label: 'HRV', color: SERIES.hrv, getValue: (d) => d.hrv }]}
|
|
32
|
+
marks={(plot) =>
|
|
33
|
+
plot.visible.map((s) => lineY(plot.rows(s.key), { x: 'x', y: 'y', stroke: s.color }))
|
|
53
34
|
}
|
|
54
|
-
|
|
35
|
+
/>
|
|
55
36
|
```
|
|
56
37
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
`ChartTooltipFloat` and declares itself with `theme-allow-file hand-rolled-plot — <why>`.
|
|
61
|
-
- **Size is `height` / `aspectRatio` / `fill`** — one of the three, nothing else. Charts measure
|
|
62
|
-
themselves.
|
|
63
|
-
- Never substitute a raw visx axis, a hand-written legend array, a `@visx/tooltip` import, an
|
|
64
|
-
`rgba()` fill or a hex.
|
|
65
|
-
|
|
66
|
-
## 4. Verify
|
|
67
|
-
|
|
68
|
-
- `oxlint .` green — no `basalt/hand-rolled-plot`, no `basalt/chart-legend-literal`, no
|
|
69
|
-
`basalt/chart-in-raw-surface`, no `@visx/*` import outside a `charts/` segment.
|
|
70
|
-
- `basalt-ui check-theme` green — no raw hex, no raw axis, every chart entry point has an
|
|
71
|
-
`ariaLabel`.
|
|
72
|
-
- Every new color is a `{ light, dark }` pair in the series file and wired into the palette CSS.
|
|
73
|
-
- Tooltip rows and the legend are DERIVED from `series`; the plot draws `visible`.
|
|
74
|
-
- Checked in both schemes, and with a pending query (`isPending`, not `data ?? []`).
|
|
38
|
+
5. Wrap it in `ChartCard`; pass `state={{ pending, error, empty }}` from the query.
|
|
39
|
+
6. Run `bun run lint:basalt` and `bunx tsc --noEmit`; fix every finding at its source.
|
|
40
|
+
7. Check both color schemes and a pending query.
|
|
@@ -1,76 +1,18 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: basalt-design
|
|
3
|
-
description:
|
|
4
|
-
when_to_use: User is building or restyling
|
|
3
|
+
description: Build or restyle dashboards and metric UIs in a basalt-ui app — read the law, decide, build, tune in the theme lab, verify.
|
|
4
|
+
when_to_use: User is building or restyling dashboards, charts or metric UIs; tuning a palette; or says a UI looks inconsistent, over-colored or "AI default". Entry point for "make this look professional".
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
managed `CLAUDE.md` block states which wins — read them, do not re-derive them here. This skill is
|
|
9
|
-
the sequence to follow and the loop to run.
|
|
7
|
+
Method only; the law is `.claude/rules/basalt-*.md` and `./DESIGN.md`.
|
|
10
8
|
|
|
11
|
-
##
|
|
9
|
+
## Steps
|
|
12
10
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
## 2. Decide before coding
|
|
23
|
-
|
|
24
|
-
Answer these four in one pass; each one is a decision, not a preference:
|
|
25
|
-
|
|
26
|
-
1. **What earns a hue here?** Trend, signal/status, or genuine categorical separation. Everything
|
|
27
|
-
else is neutral. One hue per metric, stable across every view.
|
|
28
|
-
2. **Where does each control live?** One home per control, and the home sets its size (law C1/C5).
|
|
29
|
-
3. **What is the one primary action on this view?** Exactly one filled accent; everything else
|
|
30
|
-
neutral.
|
|
31
|
-
4. **What does this surface reuse?** Check the shipped composite FIRST — `StatCard`, `ChartCard`,
|
|
32
|
-
`Section`, `BasaltDataTable`, `QueryState`, `EmptyState`. A fork by a token-fluent author passes
|
|
33
|
-
every gate, so no guard will tell you; asking is the control. If a composite genuinely cannot
|
|
34
|
-
express the case, that is a gap to REPORT, not to route around.
|
|
35
|
-
|
|
36
|
-
## 3. Build it
|
|
37
|
-
|
|
38
|
-
Compose Mantine primitives and shipped composites; pull every color from `VX.*` / a series token.
|
|
39
|
-
Let the theme carry size, radius, depth and font — a prop you did not have to pass is the point.
|
|
40
|
-
|
|
41
|
-
## 4. Tune by eye, then bake
|
|
42
|
-
|
|
43
|
-
A static POC never translates 1:1 to visx + Mantine. Tune in the REAL app with the shipped lab
|
|
44
|
-
(`basalt-ui/theme-lab`), which writes inline `--vx-*` overrides on `<html>` — they beat the
|
|
45
|
-
stylesheet, so everything restyles instantly with no React re-render.
|
|
46
|
-
|
|
47
|
-
```tsx
|
|
48
|
-
import { ThemeLabControls, applyOverrides, loadOverrides } from 'basalt-ui/theme-lab'
|
|
49
|
-
|
|
50
|
-
applyOverrides(loadOverrides()) // at boot — the control body does NOT do the initial apply
|
|
51
|
-
;<ThemeLabControls groups={[...COLOR_GROUPS, appSeriesGroup]} onCopy={notifyCopied} />
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
1. Adjust colors and the area-gradient strength by eye — in BOTH schemes.
|
|
55
|
-
2. Toggle the scheme and re-check: a saturated mid-tone glows on dark (step lighter, slightly
|
|
56
|
-
desaturated) and washes out on light (step deeper). Same hue, different shade, **never the same
|
|
57
|
-
value in both**.
|
|
58
|
-
3. Copy the JSON and hand the values back into the palette as `{ light, dark }` pairs — or, for the
|
|
59
|
-
identity itself, into the derive config's knobs rather than a hand-picked hex.
|
|
60
|
-
4. Remove the override and confirm the baked palette matches.
|
|
61
|
-
|
|
62
|
-
`DeriveControls` is the identity/colour knobs (seed + the bounded levels + radius + density) and is
|
|
63
|
-
faithful to `createBasaltTheme`; `ThemeLabControls` is the low-level inspector for the non-derived
|
|
64
|
-
structural tokens. Both are DEV tools and inert in a production build — run the dev server.
|
|
65
|
-
|
|
66
|
-
## 5. Verify before calling it done
|
|
67
|
-
|
|
68
|
-
- `basalt-ui check-theme` green: zero raw hex, zero `rgba()`, nothing reading `localStorage['theme']`.
|
|
69
|
-
- `oxlint .` green on the `basalt/*` rules — no hand-rolled filter (in a slot) and no in-body
|
|
70
|
-
`<Title order={1|2}>`. Hand-rolled section headings are NOT lint-visible (see the `not guarded`
|
|
71
|
-
line in `basalt-controls.md`'s coverage header): grep the diff for `fw={600}` / `<Title order={3`
|
|
72
|
-
headings by hand and replace them with `WidgetHeader` / `Section`.
|
|
73
|
-
- One hue per metric; neutral structure; the accent only points.
|
|
74
|
-
- Checked in BOTH schemes, and below `sm` as well as on a wide viewport.
|
|
75
|
-
- Any new color landed as a `{ light, dark }` pair in the consumer series file, never inline.
|
|
76
|
-
- Nothing you built duplicates a shipped composite.
|
|
11
|
+
1. Read `./DESIGN.md` and the rules `basalt-tokens.md`, `basalt-mantine.md`, `basalt-controls.md`, `basalt-charts.md`. No `DESIGN.md`: run `/basalt-app` first.
|
|
12
|
+
2. Decide before coding: which metrics earn a hue (trend, status, separation; the rest neutral), the one primary action per view, each control's home.
|
|
13
|
+
3. Check the shipped composites first: `StatCard`, `ChartCard`, `Section`, `WidgetHeader`, `BasaltDataTable`, `EmptyState`. A gap is reported, not routed around.
|
|
14
|
+
4. Build with Mantine primitives and the composites; take every color from `VX.*` or a series token.
|
|
15
|
+
5. Tune by eye in the running app: open the theme lab with the `dev.theme` Spotlight command (dev only) and adjust in both color schemes.
|
|
16
|
+
6. Bake the values back: identity changes go into the `derive` knobs of `createBasaltTheme`, series colors into `src/lib/series.ts` as `{ light, dark }` pairs. Clear the lab overrides and confirm the baked result matches.
|
|
17
|
+
7. Run `bun run lint:basalt`; fix every finding at its source.
|
|
18
|
+
8. Check both schemes, and below and above the `sm` breakpoint.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<!-- basalt:begin {{BASALT_VERSION}} -->
|
|
2
|
+
|
|
3
|
+
## basalt-ui (managed — do not hand-edit)
|
|
4
|
+
|
|
5
|
+
Placed by `basalt-ui init`, refreshed by `basalt-ui sync` (`--check` gates drift in CI); edit `DESIGN.md`, not this block.
|
|
6
|
+
|
|
7
|
+
**Stack:** React 19 + Mantine v9 via `basalt-ui` (`BasaltProvider`, `BasaltShell`), TanStack Router and
|
|
8
|
+
Query, TanStack Charts via `basalt-ui/charts`, Bun, oxlint + oxfmt, no Tailwind. Color is `VX.*` or a
|
|
9
|
+
series token, never a literal.
|
|
10
|
+
|
|
11
|
+
**Precedence** (highest wins): consumer `DESIGN.md` > the six shipped `basalt-*` rules in
|
|
12
|
+
`.claude/rules/` > the `basalt-*` skills. Each rule bullet ends in the lint rule, guard kind or type
|
|
13
|
+
that enforces it; skills are procedure, not law.
|
|
14
|
+
|
|
15
|
+
**Run the local bin** (`./node_modules/.bin/basalt-ui` or a package script), never `bunx`; `init` is the
|
|
16
|
+
one exception.
|
|
17
|
+
|
|
18
|
+
**Before guessing an import, read the installed `llms.txt`** at the install directory (in a workspace,
|
|
19
|
+
under the depending package; `basalt-ui doctor` prints where).
|
|
20
|
+
|
|
21
|
+
@./DESIGN.md
|
|
22
|
+
|
|
23
|
+
**Restraint override (supersedes `/frontend-design`).** This is a calm, data-dense professional
|
|
24
|
+
surface: no "bold aesthetic direction", gradient meshes, grain or dramatic motion. Neutral by default,
|
|
25
|
+
the single accent spent only when earned.
|
|
26
|
+
|
|
27
|
+
**Chart override.** The `basalt-charts` rule supersedes any global visx or chart rule: compose
|
|
28
|
+
`CartesianChart`.
|
|
29
|
+
|
|
30
|
+
<!-- basalt:end -->
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
> Seeded by basalt-ui `init`, then owned by you — `sync` never touches it again, and no version is
|
|
4
4
|
> stamped here (run `basalt-ui doctor` for the version; a number written into a file is frozen at
|
|
5
5
|
> scaffold time). It records this app's **deltas only**: the law lives in `.claude/rules/basalt-*.md`,
|
|
6
|
-
> and the precedence between this file, those rules and the skills is stated once in `
|
|
6
|
+
> and the precedence between this file, those rules and the skills is stated once in the managed `AGENTS.md` block.
|
|
7
7
|
|
|
8
8
|
## Identity
|
|
9
9
|
|
|
@@ -32,7 +32,7 @@ const SERIES_MAP = defineSeries({
|
|
|
32
32
|
// requests: { light: '…', dark: '…' }, // deeper on light, lighter on dark — never one value
|
|
33
33
|
})
|
|
34
34
|
export const series = groupTokens('app', SERIES_MAP) // { requests: 'var(--vx-app-requests)', … }
|
|
35
|
-
export const paletteGroups =
|
|
35
|
+
export const paletteGroups = [series] // the groupTokens result, never a retyped key
|
|
36
36
|
// <BasaltProvider paletteOptions={{ groups: paletteGroups }} …/> — then charts read `series.requests`
|
|
37
37
|
```
|
|
38
38
|
|
|
@@ -1,30 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* TanStack Router root route
|
|
3
|
-
*
|
|
2
|
+
* TanStack Router root route. `BasaltRouterContext` types the context `createBasaltRouter` fills
|
|
3
|
+
* (the QueryClient); extend it for your own context and pass the value to
|
|
4
|
+
* `createBasaltRouter({ routeTree, context })`.
|
|
4
5
|
*
|
|
5
6
|
* Scaffold written by `basalt-ui init`. This file is yours — `basalt-ui sync` will not overwrite it.
|
|
6
7
|
*/
|
|
7
8
|
import { Outlet, createRootRouteWithContext } from '@tanstack/react-router'
|
|
8
|
-
import type { QueryClient } from '@tanstack/react-query'
|
|
9
|
-
|
|
10
9
|
import { BasaltShell } from 'basalt-ui'
|
|
10
|
+
import type { BasaltRouterContext } from 'basalt-ui'
|
|
11
|
+
import { NAV } from '../lib/nav'
|
|
11
12
|
|
|
12
|
-
|
|
13
|
-
queryClient: QueryClient
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export const Route = createRootRouteWithContext<RouterContext>()({
|
|
13
|
+
export const Route = createRootRouteWithContext<BasaltRouterContext>()({
|
|
17
14
|
component: RootComponent,
|
|
18
15
|
})
|
|
19
16
|
|
|
20
|
-
|
|
17
|
+
// Exported: react/only-export-components flags a non-exported component in a file that exports `Route`.
|
|
18
|
+
export function RootComponent() {
|
|
21
19
|
return (
|
|
22
|
-
<BasaltShell
|
|
23
|
-
brand={{ name: '{{APP_NAME}}' }}
|
|
24
|
-
sections={[
|
|
25
|
-
// { label: 'Section', items: [{ label: 'Page', to: '/page', icon: <Icon /> }] }
|
|
26
|
-
]}
|
|
27
|
-
>
|
|
20
|
+
<BasaltShell brand={{ name: '{{APP_NAME}}' }} nav={NAV}>
|
|
28
21
|
<Outlet />
|
|
29
22
|
</BasaltShell>
|
|
30
23
|
)
|