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/README.md
CHANGED
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
[](https://www.npmjs.com/package/basalt-ui)
|
|
4
4
|
[](https://github.com/jkrumm/basalt-ui/blob/master/LICENSE)
|
|
5
5
|
|
|
6
|
-
> Opinionated framework for Mantine v9 +
|
|
6
|
+
> Opinionated framework for Mantine v9 + TanStack Charts React apps — theme, app shell, chart system, and the agentic layer to drive them.
|
|
7
7
|
|
|
8
8
|
**[Documentation](#quick-start)** · **[GitHub](https://github.com/jkrumm/basalt-ui)** · **[npm](https://www.npmjs.com/package/basalt-ui)**
|
|
9
9
|
|
|
10
|
-
Building a dashboard app means wiring a Mantine theme, a
|
|
10
|
+
Building a dashboard app means wiring a Mantine theme, a TanStack Charts chart system, a typed token layer, and an app shell — each with its own opinions, and none of them talking to each other.
|
|
11
11
|
|
|
12
12
|
Basalt UI is the extraction of that setup from a production app. Install once, get a coherent system.
|
|
13
13
|
|
|
@@ -19,29 +19,25 @@ Basalt UI is the extraction of that setup from a production app. Install once, g
|
|
|
19
19
|
|
|
20
20
|
```bash
|
|
21
21
|
bun add basalt-ui
|
|
22
|
-
bun add react react-dom @mantine/core @mantine/hooks @
|
|
22
|
+
bun add react react-dom @mantine/core @mantine/hooks @mantine/modals @mantine/notifications @mantine/spotlight \
|
|
23
|
+
@tanstack/react-router @tanstack/react-query \
|
|
24
|
+
@fontsource-variable/hubot-sans @fontsource-variable/jetbrains-mono @fontsource-variable/nunito-sans
|
|
23
25
|
```
|
|
24
26
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
version mismatches on an installed peer still warn.
|
|
27
|
+
That is the **required** set: `BasaltProvider` mounts the router, Query, Modals, Notifications and
|
|
28
|
+
Spotlight, and `basalt-ui/styles.css` imports the three fonts. Install the peers yourself — a
|
|
29
|
+
missing one surfaces as an unresolved import at build time, not as an install warning. A real app
|
|
30
|
+
also needs `@types/react @types/react-dom` (dev) and a standard Vite `vite-env.d.ts`. Exact
|
|
31
|
+
versions: `peerDependencies` in `package.json`.
|
|
31
32
|
|
|
32
|
-
|
|
33
|
-
|
|
33
|
+
| Class | Peers | Rule |
|
|
34
|
+
| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
|
|
35
|
+
| Required | `react`, `react-dom`, `@mantine/{core,hooks,modals,notifications,spotlight}`, `@tanstack/react-router`, `@tanstack/react-query`, the three `@fontsource-variable/*` | every consumer; `.` or `./styles.css` imports or names it |
|
|
36
|
+
| Subpath-required | `./charts`: `@tanstack/charts`, `d3-scale` · `./commands`: `@tanstack/react-hotkeys` · `./agent`: `ai`, `@ai-sdk/provider`, `motion` · `./table`: `@tanstack/react-table` · `./forms`: `@mantine/form` · `./controls-dates`: `@mantine/dates`, `dayjs` · `./content`: `react-markdown` · `./vite`: `vite` | needed only by consumers of that subpath; declared `optional` in `peerDependenciesMeta` |
|
|
37
|
+
| Optional | `remend`, `shiki`, `@shikijs/*`, `beautiful-mermaid`, `remark-gfm`, `rehype-sanitize`, `@tanstack/react-query-devtools`, `@tanstack/react-router-devtools`, `vite-plugin-pwa` | reached through `import()` only; absent, the feature degrades (dev devtools panels, plain-text markdown) |
|
|
34
38
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
`ThreadDetailPanel`, and the three `@fontsource-variable` packages
|
|
38
|
-
(`bun add @fontsource-variable/hubot-sans @fontsource-variable/jetbrains-mono
|
|
39
|
-
@fontsource-variable/nunito-sans`, all exact-pinned — see `packages/basalt-ui/package.json` for the
|
|
40
|
-
versions) if you import `basalt-ui/styles.css`, which `@import`s them for the three-font system.
|
|
41
|
-
Both are optional peers, so neither installs automatically.
|
|
42
|
-
|
|
43
|
-
**No React?** `./tokens`, `./charts`, `./state` and `./guard` resolve with none of the five
|
|
44
|
-
installed, and the token system is consumable with no package at all:
|
|
39
|
+
**No React?** `./tokens` imports no `@mantine/*`, and the token system is consumable with no package
|
|
40
|
+
at all:
|
|
45
41
|
|
|
46
42
|
```bash
|
|
47
43
|
bunx basalt-ui tokens:css --selector-attribute data-theme --only core --out src/tokens.css
|
|
@@ -71,7 +67,7 @@ That's the whole install — there is no plugin, no marketplace, and no second v
|
|
|
71
67
|
whole oxlint plugins the repo was never linted against, so previously-clean code lands with real
|
|
72
68
|
findings on the first run. `init` names those plugins, and names every file it kept along with what
|
|
73
69
|
keeping it costs — an `.oxlintrc.json` that does not extend the preset means the entire basalt lint
|
|
74
|
-
half is inert and nothing else says so (
|
|
70
|
+
half is inert and nothing else says so (`init` now splices the `extends` in by default, `--no-merge-lint` opts out; it refuses on a
|
|
75
71
|
commented config rather than deleting the comments). Run `oxlint .` and triage before your next
|
|
76
72
|
commit.
|
|
77
73
|
|
|
@@ -83,75 +79,60 @@ reported — exactly the files Claude reads, which cannot load from `node_module
|
|
|
83
79
|
|
|
84
80
|
## Wire the runtime
|
|
85
81
|
|
|
86
|
-
After `bunx basalt-ui init`, wire the
|
|
87
|
-
|
|
82
|
+
After `bunx basalt-ui init`, two files wire the app. `BasaltProvider` owns the whole provider tree —
|
|
83
|
+
Mantine + theme, Query, Modals (wrapping the router), the router, Notifications, Spotlight, the root
|
|
84
|
+
error boundary, command hotkeys, and in dev the dev dock. Canonical reference:
|
|
85
|
+
`apps/playground/src/main.tsx`.
|
|
88
86
|
|
|
89
87
|
```tsx
|
|
90
|
-
// main.tsx
|
|
91
|
-
// stored scheme from localStorage before mount, so a client-only app needs no ColorSchemeScript.
|
|
92
|
-
import '@mantine/core/styles.layer.css'
|
|
93
|
-
import '@mantine/notifications/styles.layer.css'
|
|
94
|
-
import '@mantine/spotlight/styles.layer.css'
|
|
88
|
+
// src/main.tsx
|
|
95
89
|
import 'basalt-ui/styles.css'
|
|
96
|
-
import { BasaltProvider, createBasaltTheme } from 'basalt-ui'
|
|
97
|
-
import { BasaltOverlays } from 'basalt-ui/commands'
|
|
98
|
-
import { applyOverrides, loadOverrides } from 'basalt-ui/theme-lab'
|
|
99
90
|
import { createRoot } from 'react-dom/client'
|
|
100
|
-
import {
|
|
101
|
-
import {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
const theme = createBasaltTheme({
|
|
113
|
-
/* app deltas only */
|
|
114
|
-
})
|
|
91
|
+
import { BasaltProvider, createBasaltRouter } from 'basalt-ui'
|
|
92
|
+
import { routeTree } from './routeTree.gen'
|
|
93
|
+
import { telemetry } from './lib/telemetry'
|
|
94
|
+
import './lib/commands'
|
|
95
|
+
|
|
96
|
+
const router = createBasaltRouter({ routeTree })
|
|
97
|
+
declare module '@tanstack/react-router' {
|
|
98
|
+
interface Register {
|
|
99
|
+
router: typeof router
|
|
100
|
+
}
|
|
101
|
+
}
|
|
115
102
|
|
|
116
103
|
createRoot(document.getElementById('root')!).render(
|
|
117
|
-
<BasaltProvider
|
|
118
|
-
<BasaltOverlays>
|
|
119
|
-
<App />
|
|
120
|
-
</BasaltOverlays>
|
|
121
|
-
</BasaltProvider>,
|
|
104
|
+
<BasaltProvider router={router} telemetry={telemetry} />,
|
|
122
105
|
)
|
|
123
106
|
```
|
|
124
107
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
108
|
+
```tsx
|
|
109
|
+
// src/routes/__root.tsx
|
|
110
|
+
import { Outlet, createRootRouteWithContext } from '@tanstack/react-router'
|
|
111
|
+
import { BasaltShell, type BasaltRouterContext } from 'basalt-ui'
|
|
112
|
+
import { NAV } from '../lib/nav'
|
|
113
|
+
|
|
114
|
+
export const Route = createRootRouteWithContext<BasaltRouterContext>()({
|
|
115
|
+
component: () => (
|
|
116
|
+
<BasaltShell brand={{ name: 'Argo' }} nav={NAV}>
|
|
117
|
+
<Outlet />
|
|
118
|
+
</BasaltShell>
|
|
119
|
+
),
|
|
120
|
+
})
|
|
121
|
+
```
|
|
132
122
|
|
|
133
|
-
|
|
123
|
+
`createBasaltRouter({ routeTree, context?, query? })` creates one `QueryClient` per call (1.x
|
|
124
|
+
defaults, `query` merges over them) and carries it on `context.queryClient`; extra context extends
|
|
125
|
+
`BasaltRouterContext`. `BasaltProvider` takes `router` (required), `theme` (defaults to
|
|
126
|
+
`createBasaltTheme()`), `telemetry` (typed `BasaltEvent`s, no sink → no events) and `fallback` (the
|
|
127
|
+
root error boundary's UI).
|
|
134
128
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
<BasaltOverlays>
|
|
139
|
-
<RouterProvider router={router} />
|
|
140
|
-
</BasaltOverlays>
|
|
141
|
-
</QueryClientProvider>
|
|
142
|
-
</BasaltProvider>
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
The order is load-bearing, not stylistic: `BasaltProvider` auto-mounts `ConnectivityProvider`
|
|
146
|
-
(C1: absorbed onto the root barrel from the dropped `./connectivity`), which aggregates
|
|
147
|
-
React-Query's own status and so must sit **above** the query client; `BasaltOverlays` must sit **inside** the theme, since Modals/Spotlight/Notifications
|
|
148
|
-
resolve `--vx-*` tokens through Mantine's context; the router goes **last** so every route
|
|
149
|
-
component renders with the theme, the data layer and the overlay layer already mounted above it.
|
|
150
|
-
`agent/rules/basalt-mantine.md` points here rather than restating the tree.
|
|
129
|
+
> Use the **layered** `*.layer.css` bundles, never the plain ones — Mantine's unlayered bundle
|
|
130
|
+
> outranks basalt's `@layer basalt` styles (including the iOS 16px input floor) regardless of
|
|
131
|
+
> specificity. `basalt-ui/styles.css` already imports the core layer bundle.
|
|
151
132
|
|
|
152
133
|
**No `'use client'` directive ships anywhere in the package.** A Next.js App Router consumer wraps
|
|
153
|
-
|
|
154
|
-
|
|
134
|
+
the provider in its own client file and renders that from a server layout — basalt stays
|
|
135
|
+
framework-agnostic and does not guess at the boundary.
|
|
155
136
|
|
|
156
137
|
### Theming
|
|
157
138
|
|
|
@@ -160,9 +141,7 @@ bounded knobs, with contrast guaranteed by derivation rather than hand-tuning:
|
|
|
160
141
|
|
|
161
142
|
```ts
|
|
162
143
|
const theme = createBasaltTheme(
|
|
163
|
-
{
|
|
164
|
-
/* app deltas only */
|
|
165
|
-
},
|
|
144
|
+
{/* app deltas only */},
|
|
166
145
|
{ derive: { accent: '#7c3aed', neutral: 'zinc', vibrancy: 1 } },
|
|
167
146
|
)
|
|
168
147
|
```
|
|
@@ -171,22 +150,18 @@ const theme = createBasaltTheme(
|
|
|
171
150
|
`lightLevel` / `darkLevel` / `vibrancy` / `accentBrightness` (`-5..5`, all optional — omitted knobs
|
|
172
151
|
keep the shipped default). Never hand-edit a palette hex to retune the identity.
|
|
173
152
|
|
|
174
|
-
`
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
app-specific series colors (see
|
|
178
|
-
[Consumer-series extensibility](#consumer-series-extensibility) below) alongside the framework
|
|
179
|
-
palette. Skip both — `BasaltOverlays` and `paletteGroups` — if you don't use those batteries yet.
|
|
153
|
+
`paletteOptions={{ groups: paletteGroups }}` on `BasaltProvider` emits your app-specific series
|
|
154
|
+
colors (see [Consumer-series extensibility](#consumer-series-extensibility) below) alongside the
|
|
155
|
+
framework palette. Skip it if you have no app-specific series yet.
|
|
180
156
|
|
|
181
157
|
> **SSR only:** Next.js / React Router (SSR) consumers must additionally render
|
|
182
158
|
> `<ColorSchemeScript defaultColorScheme="dark" />` (matching `BasaltProvider`'s default) in the
|
|
183
159
|
> document `<head>` to avoid a flash of the wrong theme during hydration. Plain Vite CSR apps don't
|
|
184
|
-
> need it — there is no hydration to mismatch. See `docs/MANTINE-THEMING.md
|
|
160
|
+
> need it — there is no hydration to mismatch. See [`MANTINE-THEMING.md`](https://github.com/jkrumm/basalt-ui/blob/master/docs/MANTINE-THEMING.md) (repo, not in the package).
|
|
185
161
|
|
|
186
162
|
```tsx
|
|
187
|
-
// Shell — sidebar / mobile nav / breadcrumbs / PageBar; router
|
|
188
|
-
import { BasaltShell,
|
|
189
|
-
import type { SidebarBlock, SidebarSection } from 'basalt-ui'
|
|
163
|
+
// Shell — sidebar / mobile nav / breadcrumbs / PageBar; resolved against the router from `nav`
|
|
164
|
+
import { BasaltShell, PageBar } from 'basalt-ui'
|
|
190
165
|
```
|
|
191
166
|
|
|
192
167
|
```ts
|
|
@@ -250,7 +225,7 @@ guard, and this sentence described a check that did not exist.) Each root's **pa
|
|
|
250
225
|
contributes its `index.html` and its `public/` tree — the Vite layout `basaltViteConfig` assumes,
|
|
251
226
|
and where a raw `theme-color` or webmanifest `background_color` actually lives. `.json` is never
|
|
252
227
|
blanket-scanned; `include` names one explicitly and is the only route to it. `profile:
|
|
253
|
-
"tokens-only"` turns off the
|
|
228
|
+
"tokens-only"` turns off the 16 kinds whose remedy is a Mantine component or prop, and must be
|
|
254
229
|
declared (or `--tokens-only`) — it is deliberately never inferred from a missing `@mantine/core`,
|
|
255
230
|
which would silence half the guard on any repo keeping Mantine in a different workspace package.
|
|
256
231
|
Other keys (`exempt`, `severity`, `spacingSteps`, `forbiddenAccents`, …) are documented on the
|
|
@@ -298,7 +273,7 @@ nothing, so a typo is never the blanket form.
|
|
|
298
273
|
what it still suppresses, proved by re-running the scan with that one waiver neutralized. Exits 1 on
|
|
299
274
|
a dead waiver, so it is usable as a CI gate. Since 1.22.0 it runs **both** halves — `checkSource` for
|
|
300
275
|
a guard kind, oxlint over one neutralized sibling file for a plugin rule — so a waiver naming
|
|
301
|
-
|
|
276
|
+
a plugin rule is judged rather than skipped. **It needs oxlint reachable**; where it is not, the
|
|
302
277
|
verdict is "cannot judge", never "dead". The report prints the scope it audited, because `0 dead`
|
|
303
278
|
over `basalt.roots` is not `0 dead anywhere`. Two known gaps: `basalt.exempt` is not audited at all,
|
|
304
279
|
and the `scoped to …` line does not distinguish `theme-allow` from `theme-allow-file`.
|
|
@@ -327,41 +302,37 @@ deleted rather than silently surviving into the next real skew.
|
|
|
327
302
|
|
|
328
303
|
## Subpath exports
|
|
329
304
|
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
|
333
|
-
|
|
|
334
|
-
|
|
|
335
|
-
| `./
|
|
336
|
-
| `./
|
|
337
|
-
| `./
|
|
338
|
-
| `./
|
|
339
|
-
| `./
|
|
340
|
-
| `./
|
|
341
|
-
| `./
|
|
342
|
-
| `./
|
|
343
|
-
| `./
|
|
344
|
-
| `./
|
|
345
|
-
| `./
|
|
346
|
-
| `./
|
|
347
|
-
| `./
|
|
348
|
-
| `./
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
| `./configs/*` | — | Raw toolchain presets — oxlint, oxfmt, tsconfig (base/react-app/node), lefthook |
|
|
354
|
-
| `./llms.txt` | — | Machine-readable surface map — one entry per published subpath with import specifier, description, layer, and optional peers |
|
|
355
|
-
|
|
356
|
-
Named exports only — no default exports.
|
|
305
|
+
15 subpaths. One import path per symbol; named exports only — no default exports.
|
|
306
|
+
|
|
307
|
+
| Subpath | Purpose |
|
|
308
|
+
| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
309
|
+
| `.` | Wiring (`BasaltProvider`, `createBasaltTheme`, `createBasaltRouter`, `unwrap`), shell + nav (`BasaltShell`, `PageBar`, `PageAside`, `defineNav`, `navGroup`, `flattenNav`, `useBasaltNav`), dashboard atoms (`Section`, `StatCard`, `EmptyState`, `SettingsSection`, …) |
|
|
310
|
+
| `./tokens` | **Mantine-free.** `VX` token refs, `alpha`, `defineSeries`, `seriesTokens`, `groupTokens`, `buildPaletteCss`, layout (`BP`, `p`, `CONTAINER_*`) |
|
|
311
|
+
| `./charts` | **Mantine-free.** `CartesianChart` + the `Lines`/`Bars` kinds, `ChartCard`, `chartCursor` on `@tanstack/charts` |
|
|
312
|
+
| `./controls` | `FilterSet` + the `FieldHandle`-bound filters, `ViewTabs`, `SyncButton`, `FormRow`, `FormGroup` |
|
|
313
|
+
| `./controls-dates` | `DateRangePicker` — its own subpath so `./controls` resolves with no `@mantine/dates` |
|
|
314
|
+
| `./forms` | `useBasaltForm`, `inputProps`, `fieldKey` on `@mantine/form` |
|
|
315
|
+
| `./state` | `field`, `createSearchStore`, `createLocalStore`, `createPersistedState` |
|
|
316
|
+
| `./table` | `BasaltDataTable`, `createColumnHelper<Row>()` over TanStack Table |
|
|
317
|
+
| `./format` | `Intl`-backed, React-free formatting: `integer`, `money`, `percent`, `durationClock`, `relativeTime`, `weekday`, `km`, `kcal` |
|
|
318
|
+
| `./commands` | `defineCommands`, `defineOverlays`, `overlays`, `setColorScheme`, `toggleSidebar`, `ShortcutsHelp`, `defineNotifications`, `emit`, `NotificationBell` |
|
|
319
|
+
| `./agent` | Streaming-chat runtime (`aiSdkTransport`, `useAgentThreadRuns`, `parseAgentPart`) and its Mantine chat UI (`ThreadFeed`, `ThreadFeedRow`, `Composer`, `ToolChip`) |
|
|
320
|
+
| `./content` | `Prose`, `Markdown`, `Callout`, `TableOfContents`, `ArticleLayout`, `GuideLink` |
|
|
321
|
+
| `./vite` | `basaltViteConfig(opts)` preset, `basaltAppPlugin(opts)` PWA head / manifest / icons |
|
|
322
|
+
| `./styles.css` | The one stylesheet: `@layer basalt` base styles, iOS input floor, fonts |
|
|
323
|
+
| `./configs/*` | Raw toolchain presets — oxlint, oxfmt, tsconfig (base/react-app/node), lefthook |
|
|
324
|
+
|
|
325
|
+
The theme lab and the dev dock are mounted by `BasaltProvider` in dev only; `basalt-ui tokens:css`
|
|
326
|
+
emits the prebuilt `--vx-*` stylesheet. Every dropped 1.x subpath and its new home:
|
|
327
|
+
[`MIGRATING.md`](./MIGRATING.md) § 2.0.0.
|
|
357
328
|
|
|
358
329
|
---
|
|
359
330
|
|
|
360
331
|
## Mantine-free boundary
|
|
361
332
|
|
|
362
|
-
`./charts` and `./tokens` import zero `@mantine/*`. `@visx/*` is
|
|
333
|
+
`./charts` and `./tokens` import zero `@mantine/*`. `@visx/*` is banned everywhere, and `@tanstack/charts/react` is imported by `src/charts/host.tsx` alone. The root barrel (`.`) does not re-export `./charts` or `./tokens`.
|
|
363
334
|
|
|
364
|
-
The Mantine-free part protects two things. First, layering: `tokens` is pure data that `cssVariablesResolver` reads to bind Mantine's surfaces to the same `--vx-*` vars charts use, so an `@mantine/*` import in either would cycle back through the theme layer or let a chart bypass `--vx-*` and fork chrome/charts apart. Second, packaging: `./charts` and `./tokens` resolve and render with **no `@mantine/*` installed** — a charts/tokens-only consumer never pulls Mantine into their bundle. This is real and CI-tested (`scripts/pack-test.sh`'s "charts/tokens-only (no-Mantine) resolution + render" step scratch-installs the tarball with only `react`/`react-dom` and SSR-renders `basalt-ui/charts`; `scripts/check-dist-layering.mjs` walks the built dist graph and fails if those entries reach `@mantine/*`; the root barrel not re-exporting them is the third leg). The LAYER is Mantine-free — the FRAMEWORK is not: `.` requires Mantine (`@mantine/core`/`@mantine/hooks` are required, non-optional peers); only `./charts`/`./tokens` don't. Both consequences are a basalt-internal invariant enforced by the repo-local-only `basalt/token-layer-boundary` oxlint plugin rule — not a consumer contract, so it is deliberately absent from the shipped consumer preset. The
|
|
335
|
+
The Mantine-free part protects two things. First, layering: `tokens` is pure data that `cssVariablesResolver` reads to bind Mantine's surfaces to the same `--vx-*` vars charts use, so an `@mantine/*` import in either would cycle back through the theme layer or let a chart bypass `--vx-*` and fork chrome/charts apart. Second, packaging: `./charts` and `./tokens` resolve and render with **no `@mantine/*` installed** — a charts/tokens-only consumer never pulls Mantine into their bundle. This is real and CI-tested (`scripts/pack-test.sh`'s "charts/tokens-only (no-Mantine) resolution + render" step scratch-installs the tarball with only `react`/`react-dom` and SSR-renders `basalt-ui/charts`; `scripts/check-dist-layering.mjs` walks the built dist graph and fails if those entries reach `@mantine/*`; the root barrel not re-exporting them is the third leg). The LAYER is Mantine-free — the FRAMEWORK is not: `.` requires Mantine (`@mantine/core`/`@mantine/hooks` are required, non-optional peers); only `./charts`/`./tokens` don't. Both consequences are a basalt-internal invariant enforced by the repo-local-only `basalt/token-layer-boundary` oxlint plugin rule — not a consumer contract, so it is deliberately absent from the shipped consumer preset. The chart-engine part (`basalt/chart-engine-boundary`: no `@visx/*`, and `@tanstack/charts` only through an allowlist of mark subpaths) IS shipped, so that constraint holds downstream too.
|
|
365
336
|
|
|
366
337
|
---
|
|
367
338
|
|
|
@@ -425,15 +396,12 @@ export const paletteGroups = { [`${GROUP}-`]: SERIES }
|
|
|
425
396
|
|
|
426
397
|
```tsx
|
|
427
398
|
// main.tsx — wire paletteGroups into BasaltProvider
|
|
428
|
-
import { BasaltProvider
|
|
399
|
+
import { BasaltProvider } from 'basalt-ui'
|
|
429
400
|
import { paletteGroups } from './theme/series'
|
|
401
|
+
import { router } from './router'
|
|
430
402
|
|
|
431
403
|
export function App() {
|
|
432
|
-
return
|
|
433
|
-
<BasaltProvider theme={createBasaltTheme()} paletteOptions={{ groups: paletteGroups }}>
|
|
434
|
-
{/* app */}
|
|
435
|
-
</BasaltProvider>
|
|
436
|
-
)
|
|
404
|
+
return <BasaltProvider router={router} paletteOptions={{ groups: paletteGroups }} />
|
|
437
405
|
}
|
|
438
406
|
```
|
|
439
407
|
|
|
@@ -445,176 +413,91 @@ Every `defineX` factory is const-generic and exact-keyed — the return type mir
|
|
|
445
413
|
|
|
446
414
|
Seven optional-peer batteries extend the core. Install only what you use — core resolves without them.
|
|
447
415
|
|
|
448
|
-
### `./charts` —
|
|
416
|
+
### `./charts` — TanStack Charts
|
|
449
417
|
|
|
450
418
|
```bash
|
|
451
|
-
bun add @
|
|
419
|
+
bun add @tanstack/charts d3-scale
|
|
452
420
|
```
|
|
453
421
|
|
|
454
422
|
`./charts` is Mantine-free (see [Mantine-free boundary](#mantine-free-boundary) above) but not
|
|
455
|
-
dependency-free: it needs
|
|
456
|
-
optional peers, not bundled dependencies, so a `./tokens`-only consumer never
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
the
|
|
423
|
+
dependency-free: it needs `@tanstack/charts` and `d3-scale`, both pinned exact (`1.1.0` and
|
|
424
|
+
`4.0.2`). They ship as optional peers, not bundled dependencies, so a `./tokens`-only consumer never
|
|
425
|
+
installs them. visx is gone: no dependency, peer or re-export.
|
|
426
|
+
|
|
427
|
+
`CartesianChart` is the entry point: it compiles one engine definition and owns the measured
|
|
428
|
+
margins, both y domains, the x scale, the grid, zones, the page-shared cursor, the crosshair,
|
|
429
|
+
keyboard focus, the legend and the derived tooltip, so a chart supplies its `series` and returns
|
|
430
|
+
only marks. `ariaLabel` is required. The x scale follows the value `x` returns: a `Date` is a
|
|
431
|
+
proportional time axis, a `number` is linear, a `string` is a point (lines) or band (bars) scale.
|
|
432
|
+
Marks come straight from `@tanstack/charts/*` subpaths (`basalt/chart-engine-boundary` allowlists
|
|
433
|
+
them); `basalt-ui/charts` re-exports none, and tokens and formatters live in `basalt-ui/tokens` and
|
|
434
|
+
`basalt-ui/format`.
|
|
462
435
|
|
|
463
436
|
```tsx
|
|
464
|
-
import {
|
|
437
|
+
import { lineY } from '@tanstack/charts/line'
|
|
438
|
+
import { CartesianChart } from 'basalt-ui/charts'
|
|
439
|
+
import { VX } from 'basalt-ui/tokens'
|
|
465
440
|
;<CartesianChart
|
|
441
|
+
ariaLabel="Sessions"
|
|
466
442
|
data={rows}
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
series={[
|
|
470
|
-
{
|
|
471
|
-
key: 'sessions',
|
|
472
|
-
label: 'Sessions',
|
|
473
|
-
color: VX.accent,
|
|
474
|
-
mark: 'line',
|
|
475
|
-
getValue: (d) => d.sessions,
|
|
476
|
-
},
|
|
477
|
-
]}
|
|
443
|
+
x={(d) => d.date}
|
|
444
|
+
series={[{ key: 'sessions', label: 'Sessions', color: VX.accent, getValue: (d) => d.sessions }]}
|
|
478
445
|
y={{ format: (v) => v.toFixed(0) }}
|
|
479
446
|
height={260}
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
key={s.key}
|
|
485
|
-
data={rows}
|
|
486
|
-
x={(d) => xScale(d.date) ?? 0}
|
|
487
|
-
y={(d) => yScale(s.getValue(d) ?? 0)}
|
|
488
|
-
stroke={s.color}
|
|
489
|
-
/>
|
|
490
|
-
))
|
|
447
|
+
marks={(plot) =>
|
|
448
|
+
plot.visible.map((s) =>
|
|
449
|
+
lineY(plot.rows(s.key), { x: (row) => row.x, y: 'y', z: 'series', stroke: s.color }),
|
|
450
|
+
)
|
|
491
451
|
}
|
|
492
|
-
|
|
493
|
-
```
|
|
494
|
-
|
|
495
|
-
Shipped kinds (`Bars`, `MultiLine`, `StackedArea`, `ZonedLine`, `Donut`, `DualPanel`, `Heatmap`,
|
|
496
|
-
`BandStrip`, `MirroredBars`) are that same composition, pre-wired. The last five compose
|
|
497
|
-
`ChartFrame` directly, because a ring, a matrix, two panes or a strip is not a single plot rect:
|
|
498
|
-
**`BandStrip`** draws 1-D categorical bands with no y dimension at all (`CartesianChart` renders a
|
|
499
|
-
left numeric axis unconditionally, so it could never host one), and **`MirroredBars`** draws two
|
|
500
|
-
bar panes over one x scale and one baseline, each in its own domain. Both fold their domain by
|
|
501
|
-
width, hatch the share of a slot nothing measured, and share the page cursor like every other
|
|
502
|
-
chart.
|
|
503
|
-
|
|
504
|
-
On a strip, `series` IS the state set, so a `state` naming no entry has no colour, no legend entry
|
|
505
|
-
and no tooltip row. It **throws in dev**, naming the key and the valid set; in production it draws a
|
|
506
|
-
dashed neutral outline band — a treatment no legend entry and no state fill uses — plus an
|
|
507
|
-
`Unknown state` tooltip row. Drawing nothing was the old behaviour and the wrong one: on a
|
|
508
|
-
measured/not-measured strip a missing band claims a coverage gap. `absentState` and `MirroredBars`'
|
|
509
|
-
`up.key`/`down.key` are PROPS rather than data, so those throw in every environment; an
|
|
510
|
-
unresolvable pane key used to hide the pane and its axis, which reads as a measured zero.
|
|
511
|
-
`BandStripSeries.formatValue` returns `string | null`, `null` rendering an em dash — an absent
|
|
512
|
-
reading, distinct from `''`, which is a state whose label is the whole row.
|
|
513
|
-
|
|
514
|
-
Which x ticks get painted is `xTickValues?: (keys, xMax) => readonly string[]`, on
|
|
515
|
-
`CartesianChart` and forwarded by `Bars`/`MultiLine`/`StackedArea`/`ZonedLine` and both band kinds.
|
|
516
|
-
It resolves ahead of the `xTicks` COUNT, which is unchanged; omit both and ticks are chosen to fit.
|
|
517
|
-
Reach for values on a dense time axis — the tick chooser appends the final key unconditionally, so
|
|
518
|
-
a count that misses the last index collides two labels at the right edge at every count.
|
|
519
|
-
|
|
520
|
-
### Query — `createBasaltQueryClient` / `unwrap` (root barrel)
|
|
521
|
-
|
|
522
|
-
`./query` was dropped in 1.29.0 (C1 consolidation) — its two exports moved onto the root barrel,
|
|
523
|
-
which already requires `@tanstack/react-query` as a peer. TanStack itself
|
|
524
|
-
(`QueryClientProvider`, hooks, `queryOptions`) is imported straight from `@tanstack/react-query`,
|
|
525
|
-
never re-exported by basalt.
|
|
526
|
-
|
|
527
|
-
```bash
|
|
528
|
-
bun add @tanstack/react-query @tanstack/react-query-devtools
|
|
452
|
+
/>
|
|
529
453
|
```
|
|
530
454
|
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
455
|
+
Shipped kinds are that same composition, pre-wired: `Lines` (n series, `area`, `thresholds`, zones,
|
|
456
|
+
reference lines, `y2`) and `Bars` (stacked, grouped or normalised, ± bars, overlay lines), plus `StackedArea`,
|
|
457
|
+
`DualPanel`, `MirroredBars`, `BandStrip`, `Donut`, `Heatmap` and `Sparkline`. The
|
|
458
|
+
[`MIGRATING.md`](./MIGRATING.md) § 2.0.0 Charts table maps every 1.x chart export.
|
|
534
459
|
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
460
|
+
Charts share a cursor with no provider (`cursorGroup="…"` isolates one; `chartCursor(group?)` reads
|
|
461
|
+
it for app code), and only the chart under the pointer or keyboard focus shows a tooltip
|
|
462
|
+
(`tooltip.onFollow` opts a follower in). `x` ticks are `xTicks` (a count or the values) and
|
|
463
|
+
collision is the engine's `tickLabels.thin`; labels never rotate.
|
|
538
464
|
|
|
539
|
-
|
|
540
|
-
unknown thrown value into something renderable, folding an HTTP status into the fallback when the
|
|
541
|
-
body decodes to nothing usable (`''`, `'{}'`, `'[object Object]'`, …). `BasaltQueryDevtools` (lazy)
|
|
542
|
-
is there too.
|
|
465
|
+
### Query — `unwrap` (root barrel)
|
|
543
466
|
|
|
544
|
-
|
|
467
|
+
`createBasaltRouter` owns the `QueryClient` (one per call, `context.queryClient`); there is no
|
|
468
|
+
separate client factory. `unwrap` turns an Eden-style `{ data, error }` envelope into a thrown error
|
|
469
|
+
so `useQuery` sees it. TanStack itself (`useQuery`, `queryOptions`) is imported straight from
|
|
470
|
+
`@tanstack/react-query`, never re-exported by basalt.
|
|
545
471
|
|
|
546
472
|
```tsx
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
function Library() {
|
|
550
|
-
const q = useQuery(imageQueries.list()) // { data, isError, error, fetchStatus, refetch }
|
|
551
|
-
return (
|
|
552
|
-
<QueryState
|
|
553
|
-
query={q}
|
|
554
|
-
variant="page" // or "section"
|
|
555
|
-
errorTitle="Could not load images"
|
|
556
|
-
errorFallback="The request failed."
|
|
557
|
-
errorAction={<Button onClick={openSupport}>Get help</Button>}
|
|
558
|
-
empty={{ title: 'No images yet', description: 'Upload one to get started.' }}
|
|
559
|
-
isEmpty={(d) => d.items.length === 0}
|
|
560
|
-
>
|
|
561
|
-
{(data) => <ImageGrid items={data.items} />}
|
|
562
|
-
</QueryState>
|
|
563
|
-
)
|
|
564
|
-
}
|
|
473
|
+
// queryFn: () => unwrap(api.users.get())
|
|
565
474
|
```
|
|
566
475
|
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
nobody wrote the other three branches. `LoadingState` and `ErrorState` ship beside it as the escape
|
|
571
|
-
hatch for a page that must place its branches in different DOM positions.
|
|
572
|
-
|
|
573
|
-
Branch precedence, in the order it is evaluated:
|
|
574
|
-
|
|
575
|
-
| Condition | Renders |
|
|
576
|
-
| ----------------------------------- | ------------------------------------------------------------------------- |
|
|
577
|
-
| `isError` and no `data` | `ErrorState` — `errorTitle` / `errorFallback` / `errorAction`, with Retry |
|
|
578
|
-
| no `data`, `fetchStatus === 'idle'` | the `empty` copy (or nothing, if `empty` is omitted) |
|
|
579
|
-
| no `data` | `loading`, else `LoadingState` |
|
|
580
|
-
| `data`, `isEmpty(data)` | the `empty` copy |
|
|
581
|
-
| `data` | `children` — a node, or `(data) => node` |
|
|
582
|
-
| `data` **and** `isError` | a section-variant _stale data_ banner above `children` |
|
|
583
|
-
|
|
584
|
-
The stale-data banner carries its own fixed copy (`Showing cached data`); `errorTitle` /
|
|
585
|
-
`errorFallback` / `errorAction` apply to the no-data error branch only.
|
|
476
|
+
Dev only: the dock `BasaltProvider` mounts holds the router and query devtools; open them from
|
|
477
|
+
Spotlight (`dev.router`, `dev.query`, `dev.theme`). Install the optional
|
|
478
|
+
`@tanstack/react-router-devtools` / `@tanstack/react-query-devtools` to get those panels.
|
|
586
479
|
|
|
587
|
-
|
|
588
|
-
hand-composed object is legal, and basalt couples to no query-library version. That subset removes
|
|
589
|
-
the compiler, so **the shape is checked at runtime and a missing `isError` throws**, naming the
|
|
590
|
-
field. That is deliberate: a missing `isError` is exactly the bug above, and degrading quietly would
|
|
591
|
-
reproduce it.
|
|
592
|
-
|
|
593
|
-
### `./router-tanstack` — TanStack Router bridge
|
|
594
|
-
|
|
595
|
-
```bash
|
|
596
|
-
bun add @tanstack/react-router
|
|
597
|
-
```
|
|
480
|
+
### Nav and stores — `.` and `./state`
|
|
598
481
|
|
|
599
482
|
```tsx
|
|
600
|
-
import {
|
|
483
|
+
import { defineNav, navGroup } from 'basalt-ui'
|
|
484
|
+
import { createSearchStore, field } from 'basalt-ui/state'
|
|
601
485
|
|
|
602
486
|
export const NAV = defineNav({
|
|
603
|
-
groups: [
|
|
604
|
-
/* navGroup(...) */
|
|
605
|
-
],
|
|
487
|
+
groups: [/* navGroup(...) */],
|
|
606
488
|
})
|
|
607
489
|
export const analytics = createSearchStore({
|
|
608
490
|
key: 'analytics',
|
|
609
491
|
fields: { range: field.range({ presets: ['7d', '30d'], fallback: '30d' }) },
|
|
610
492
|
})
|
|
611
493
|
|
|
612
|
-
|
|
494
|
+
// <BasaltShell nav={NAV} /> resolves the sidebar, mobile bar and breadcrumb
|
|
613
495
|
// route: validateSearch: analytics.validateSearch — nav link: search: analytics.linkSearch
|
|
614
496
|
```
|
|
615
497
|
|
|
616
|
-
`
|
|
617
|
-
`analytics.field.range`, never to
|
|
498
|
+
`defineNav` needs the `Register` augmentation from `main.tsx` (it validates links against the route
|
|
499
|
+
tree); `useBasaltNav` returns the active route. A control binds to `analytics.field.range`, never to
|
|
500
|
+
`value`/`onChange` — see `basalt-ui/controls`.
|
|
618
501
|
|
|
619
502
|
### `./forms` — Mantine form adapter
|
|
620
503
|
|
|
@@ -623,53 +506,39 @@ bun add @mantine/form
|
|
|
623
506
|
```
|
|
624
507
|
|
|
625
508
|
```tsx
|
|
626
|
-
import { useBasaltForm, inputProps
|
|
509
|
+
import { useBasaltForm, inputProps } from 'basalt-ui/forms'
|
|
627
510
|
|
|
628
511
|
const form = useBasaltForm({ initialValues: { email: '' } })
|
|
629
512
|
```
|
|
630
513
|
|
|
631
|
-
### `./
|
|
514
|
+
### `./commands` — command bus, overlays, notifications
|
|
632
515
|
|
|
633
516
|
```bash
|
|
634
|
-
bun add @
|
|
635
|
-
```
|
|
636
|
-
|
|
637
|
-
```tsx
|
|
638
|
-
import { notifySuccess, notifyError } from 'basalt-ui/notifications'
|
|
639
|
-
import { BasaltOverlays } from 'basalt-ui/commands'
|
|
640
|
-
|
|
641
|
-
// in main.tsx: <BasaltProvider><BasaltOverlays notifications><App /></BasaltOverlays></BasaltProvider>
|
|
642
|
-
notifySuccess('Saved')
|
|
643
|
-
notifyError('Upload failed', { title: 'Error' })
|
|
517
|
+
bun add @tanstack/react-hotkeys
|
|
644
518
|
```
|
|
645
519
|
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
bun add @mantine/spotlight @mantine/modals @mantine/notifications @tanstack/react-hotkeys
|
|
650
|
-
```
|
|
520
|
+
`BasaltProvider` mounts `ModalsProvider`, `Notifications` and `Spotlight`, and binds every
|
|
521
|
+
`defineCommands` shortcut (the hotkeys runtime loads lazily; absent the peer, shortcuts simply do not
|
|
522
|
+
bind). The subpath is only what an app declares and calls:
|
|
651
523
|
|
|
652
524
|
```tsx
|
|
653
|
-
import { defineCommands,
|
|
525
|
+
import { defineCommands, defineNotifications, emit, overlays } from 'basalt-ui/commands'
|
|
654
526
|
|
|
655
527
|
export const COMMANDS = defineCommands({
|
|
656
528
|
'file:save': { label: 'Save', group: 'File', shortcut: 'Mod+S', run: () => save() },
|
|
657
529
|
})
|
|
658
|
-
// in
|
|
659
|
-
|
|
530
|
+
// commands appear in Spotlight (Mod+K) alongside the `defineNav` destinations
|
|
531
|
+
await overlays.confirm({ title: 'Discard draft?', onConfirm: () => reset() })
|
|
660
532
|
```
|
|
661
533
|
|
|
662
|
-
### `./
|
|
663
|
-
|
|
664
|
-
Two subpaths, one per peer group (C1: there is no bare `./data` barrel) — install only what you
|
|
665
|
-
use.
|
|
534
|
+
### `./table` — TanStack Table
|
|
666
535
|
|
|
667
536
|
```bash
|
|
668
|
-
bun add @tanstack/react-table
|
|
537
|
+
bun add -E @tanstack/react-table@9.2.8
|
|
669
538
|
```
|
|
670
539
|
|
|
671
540
|
```tsx
|
|
672
|
-
import { BasaltDataTable, createColumnHelper } from 'basalt-ui/
|
|
541
|
+
import { BasaltDataTable, createColumnHelper } from 'basalt-ui/table'
|
|
673
542
|
|
|
674
543
|
const col = createColumnHelper<Row>()
|
|
675
544
|
const columns = [
|
|
@@ -699,26 +568,6 @@ longer. Column defs cost more than JSX rows when every cell is bespoke. Adopt th
|
|
|
699
568
|
they actually buy — the `type="native"` footgun, alignment stated once instead of on both `th` and
|
|
700
569
|
`td`, and sorting/filtering/pagination owned by basalt — not for a line count.
|
|
701
570
|
|
|
702
|
-
#### `./data/table` — BasaltDataTable only
|
|
703
|
-
|
|
704
|
-
```bash
|
|
705
|
-
bun add @tanstack/react-table
|
|
706
|
-
```
|
|
707
|
-
|
|
708
|
-
```tsx
|
|
709
|
-
import { BasaltDataTable, createColumnHelper } from 'basalt-ui/data/table'
|
|
710
|
-
```
|
|
711
|
-
|
|
712
|
-
#### `./data/virtual` — BasaltVirtualList only
|
|
713
|
-
|
|
714
|
-
```bash
|
|
715
|
-
bun add @tanstack/react-virtual
|
|
716
|
-
```
|
|
717
|
-
|
|
718
|
-
```tsx
|
|
719
|
-
import { BasaltVirtualList } from 'basalt-ui/data/virtual'
|
|
720
|
-
```
|
|
721
|
-
|
|
722
571
|
### `./content` — prose + markdown
|
|
723
572
|
|
|
724
573
|
````bash
|
|
@@ -757,49 +606,23 @@ otherwise exfiltrate via a remote image URL. Any surface rendering agent/model o
|
|
|
757
606
|
### `./agent` — streaming-chat layer
|
|
758
607
|
|
|
759
608
|
```bash
|
|
760
|
-
bun add ai use-stick-to-bottom
|
|
609
|
+
bun add ai @ai-sdk/provider motion use-stick-to-bottom
|
|
761
610
|
```
|
|
762
611
|
|
|
763
|
-
|
|
764
|
-
a consumer-
|
|
765
|
-
`
|
|
766
|
-
|
|
767
|
-
Single conversation — headless streaming primitives, `aiSdkTransport` (recommended default, optional
|
|
768
|
-
peer: `ai`):
|
|
612
|
+
`aiSdkTransport` (over the `ai` package) is the one transport and `useAgentThreadRuns` the one
|
|
613
|
+
runner: it streams one turn per thread, concurrently, over a consumer-owned `ThreadsStore`. The chat
|
|
614
|
+
UI (`ThreadFeed`, `ThreadFeedRow`, `Composer`, `ToolChip`) ships from the same subpath.
|
|
769
615
|
|
|
770
616
|
```tsx
|
|
771
|
-
import {
|
|
617
|
+
import { aiSdkTransport, useAgentThreadRuns, ThreadFeed, Composer } from 'basalt-ui/agent'
|
|
772
618
|
|
|
773
619
|
const transport = aiSdkTransport({ api: '/api/chat' })
|
|
774
|
-
const {
|
|
775
|
-
```
|
|
776
|
-
|
|
777
|
-
Many short chats — the `ThreadWorkspace` composite (a distilled-outcome feed + a detail panel).
|
|
778
|
-
The headless multi-thread layer lives in `./agent`; the Mantine chrome ships from
|
|
779
|
-
`basalt-ui/agent-chat` (also re-exported from the root entry):
|
|
780
|
-
|
|
781
|
-
```tsx
|
|
782
|
-
import { ThreadWorkspace } from 'basalt-ui/agent-chat'
|
|
783
|
-
import { createThreadsStore, heuristicOutcome } from 'basalt-ui/agent'
|
|
784
|
-
|
|
785
|
-
// Once at module scope:
|
|
786
|
-
const useThreads = createThreadsStore({ key: 'main-threads', version: 1 })
|
|
787
|
-
|
|
788
|
-
function Inbox() {
|
|
789
|
-
return (
|
|
790
|
-
<ThreadWorkspace
|
|
791
|
-
useThreads={useThreads}
|
|
792
|
-
transport={transport}
|
|
793
|
-
resolveOutcome={heuristicOutcome} // swap for your LLM-backed {title, summary} resolver
|
|
794
|
-
newThreadPlaceholder="Ask anything…"
|
|
795
|
-
/>
|
|
796
|
-
)
|
|
797
|
-
}
|
|
620
|
+
const { runs, start, stop } = useAgentThreadRuns({ transport, store, resolveOutcome })
|
|
798
621
|
```
|
|
799
622
|
|
|
800
|
-
`
|
|
801
|
-
|
|
802
|
-
`agent/rules/basalt-agent.md
|
|
623
|
+
The feed shows only the distilled `{ title, summary }` outcome, never the raw prompt or thinking. It
|
|
624
|
+
ships no markdown renderer — pass `./content`'s `Markdown` where a part needs one. Doctrine:
|
|
625
|
+
`agent/rules/basalt-agent.md`.
|
|
803
626
|
|
|
804
627
|
### `./vite` — PWA / head metadata (optional peer)
|
|
805
628
|
|
|
@@ -845,7 +668,7 @@ declare module 'basalt-ui' {
|
|
|
845
668
|
}
|
|
846
669
|
```
|
|
847
670
|
|
|
848
|
-
Current slots: `series` (read by `./charts` + `./tokens`), `commands` (read by `./commands`), and `overlays` / `notifications` (read by `./commands`
|
|
671
|
+
Current slots: `series` (read by `./charts` + `./tokens`), `commands` (read by `./commands`), and `overlays` / `notifications` (both read by `./commands`). An un-augmented slot defaults to a never-keyed `{}` — augment only the slots you use.
|
|
849
672
|
|
|
850
673
|
---
|
|
851
674
|
|
|
@@ -908,27 +731,9 @@ straight back into it.
|
|
|
908
731
|
|
|
909
732
|
## Requirements
|
|
910
733
|
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
| `@mantine/core` | `^9.3` | required |
|
|
915
|
-
| `@mantine/hooks` | `^9.3` | required |
|
|
916
|
-
| `@tanstack/react-query` | — | required for the root `.` entry — `BasaltProvider` hard-requires it at build time; NOT required by `./agent-chat`, which doesn't touch it |
|
|
917
|
-
| `motion` | `12.42.0` | required for both the root `.` entry and `./agent-chat` — both export `ThreadFeed`/`ThreadDetailPanel` (`agent-chat/thread-feed.tsx` / `thread-detail-panel.tsx`), which import `motion/react` eagerly; the root's `ThemeToggle` also uses it |
|
|
918
|
-
| `@tanstack/react-virtual` | `>=3.13.26 <4` | optional for `./agent-chat` — enables `ThreadTranscript`'s `virtualize` windowing mode via a lazy `import()`; absent it degrades to an unwindowed, height-bound pane |
|
|
919
|
-
|
|
920
|
-
`remend` was required through 1.10.x — `content/markdown.tsx` imported it at the top of the module,
|
|
921
|
-
so both the root `.` entry and `./agent-chat`'s `ThreadWorkspace`/`ThreadTranscript` hard-required it
|
|
922
|
-
transitively. It is now a genuinely optional, lazy peer (dynamic `import()`); see
|
|
923
|
-
[`./content`](#content--prose--markdown) below.
|
|
924
|
-
|
|
925
|
-
`./agent-chat`'s `optionalPeers` in `llms.txt`/`surfaces.ts` lists `remend`, `motion`, and
|
|
926
|
-
`@tanstack/react-virtual` (npm has no per-subpath optionality in `peerDependenciesMeta`) — only
|
|
927
|
-
`motion` needs to be treated as required when installing just this subpath; `remend` and
|
|
928
|
-
`@tanstack/react-virtual` are accurately optional there too, both reached only through a lazy
|
|
929
|
-
`import()` (the latter behind `ThreadTranscript`'s `virtualize` option).
|
|
930
|
-
|
|
931
|
-
Optional peer batteries and their packages are listed per battery above.
|
|
734
|
+
Peers by class — required, subpath-required and optional — are listed under
|
|
735
|
+
[Install](#1-install); exact ranges are in `packages/basalt-ui/package.json`. Optional peers that a
|
|
736
|
+
subpath uses are named in that subpath's section above.
|
|
932
737
|
|
|
933
738
|
---
|
|
934
739
|
|