basalt-ui 1.28.0 → 1.29.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 +11 -18
- package/CHANGELOG.md +13 -0
- package/MIGRATING.md +151 -7
- package/README.md +23 -66
- package/agent/rules/basalt-batteries.md +59 -182
- package/agent/rules/basalt-charts.md +56 -75
- package/agent/rules/basalt-controls.md +38 -69
- package/agent/rules/basalt-mantine.md +58 -103
- package/agent/rules/basalt-state.md +42 -60
- package/agent/rules/basalt-tokens.md +46 -67
- package/agent/skills/basalt-app/SKILL.md +2 -0
- package/agent/templates/CLAUDE-block.md.tpl +14 -14
- package/configs/oxlint-plugin.js +70 -167
- package/configs/oxlint-plugin.test.ts +20 -186
- package/configs/oxlint.json +0 -1
- package/dist/agent/ai-sdk-transport.d.ts.map +1 -1
- package/dist/agent/ai-sdk-transport.js +7 -4
- package/dist/agent/coalesce.js +1 -1
- package/dist/agent/merge.js +1 -1
- package/dist/agent/transport.d.ts +13 -2
- package/dist/agent/transport.d.ts.map +1 -1
- package/dist/agent/use-agent-thread-runs.d.ts +12 -1
- package/dist/agent/use-agent-thread-runs.d.ts.map +1 -1
- package/dist/agent/use-agent-thread-runs.js +20 -6
- package/dist/agent-chat/index.d.ts +1 -1
- package/dist/agent-chat/index.d.ts.map +1 -1
- package/dist/agent-chat/relative-time.js +1 -1
- package/dist/agent-chat/thread-detail-panel.js +1 -1
- package/dist/agent-chat/thread-feed-row.d.ts +32 -7
- package/dist/agent-chat/thread-feed-row.d.ts.map +1 -1
- package/dist/agent-chat/thread-feed-row.js +121 -86
- package/dist/agent-chat/thread-feed.d.ts +11 -1
- package/dist/agent-chat/thread-feed.d.ts.map +1 -1
- package/dist/agent-chat/thread-feed.js +10 -6
- package/dist/agent-chat/thread-message.js +1 -1
- package/dist/agent-chat/virtualize.d.ts +39 -0
- package/dist/agent-chat/virtualize.d.ts.map +1 -1
- package/dist/agent-chat/virtualize.js +15 -0
- package/dist/charts/index.d.ts +3 -3
- package/dist/charts/index.d.ts.map +1 -1
- package/dist/charts/index.js +8 -4
- package/dist/charts/kinds/BandStrip.js +1 -1
- package/dist/charts/kinds/Bars.d.ts +1 -3
- package/dist/charts/kinds/Bars.d.ts.map +1 -1
- package/dist/charts/kinds/Bars.js +1 -1
- package/dist/charts/kinds/DualPanel.d.ts +3 -1
- package/dist/charts/kinds/DualPanel.d.ts.map +1 -1
- package/dist/charts/kinds/DualPanel.js +1 -1
- package/dist/charts/kinds/StackedArea.js +1 -1
- package/dist/charts/kinds/ZonedLine.d.ts +1 -3
- package/dist/charts/kinds/ZonedLine.d.ts.map +1 -1
- package/dist/charts/primitives/Axes.d.ts +21 -2
- package/dist/charts/primitives/Axes.d.ts.map +1 -1
- package/dist/charts/primitives/Axes.js +34 -2
- package/dist/charts/primitives/ChartCard.d.ts +20 -4
- package/dist/charts/primitives/ChartCard.d.ts.map +1 -1
- package/dist/charts/primitives/ChartCard.js +62 -33
- package/dist/charts/primitives/ChartFrame.d.ts.map +1 -1
- package/dist/charts/primitives/ChartFrame.js +8 -1
- package/dist/charts/primitives/ChartPending.d.ts +12 -6
- package/dist/charts/primitives/ChartPending.d.ts.map +1 -1
- package/dist/charts/primitives/ChartPending.js +1 -1
- package/dist/charts/utils/format.d.ts +5 -92
- package/dist/charts/utils/format.d.ts.map +1 -1
- package/dist/charts/utils/format.js +10 -80
- package/dist/cli/audit-allows.d.ts +24 -0
- package/dist/cli/audit-allows.d.ts.map +1 -0
- package/dist/cli/audit-allows.js +240 -0
- package/dist/cli/check-theme.d.ts +10 -0
- package/dist/cli/check-theme.d.ts.map +1 -0
- package/dist/cli/check-theme.js +139 -0
- package/dist/cli/doctor.d.ts +47 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +197 -0
- package/dist/cli/guard-hook.d.ts +9 -0
- package/dist/cli/guard-hook.d.ts.map +1 -0
- package/dist/cli/guard-hook.js +93 -0
- package/dist/cli/help.d.ts +9 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +53 -0
- package/dist/cli/index.d.ts +360 -270
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +85 -1901
- package/dist/cli/init.d.ts +4 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +165 -0
- package/dist/cli/sync.d.ts +43 -0
- package/dist/cli/sync.d.ts.map +1 -0
- package/dist/cli/sync.js +206 -0
- package/dist/cli/tokens-css.d.ts +51 -0
- package/dist/cli/tokens-css.d.ts.map +1 -0
- package/dist/cli/tokens-css.js +165 -0
- package/dist/commands/define-commands.js +1 -1
- package/dist/commands/define-overlays.js +1 -1
- package/dist/commands/index.d.ts +2 -1
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +6 -0
- package/dist/commands/overlays-mount.d.ts +7 -9
- package/dist/commands/overlays-mount.d.ts.map +1 -1
- package/dist/commands/shell-bridge.d.ts +57 -0
- package/dist/commands/shell-bridge.d.ts.map +1 -0
- package/dist/commands/shell-bridge.js +32 -0
- package/dist/common/errors.d.ts +35 -0
- package/dist/common/errors.d.ts.map +1 -1
- package/dist/common/errors.js +29 -1
- package/dist/common/index.d.ts +2 -0
- package/dist/common/index.d.ts.map +1 -1
- package/dist/common/index.js +6 -0
- package/dist/common/is-dev.d.ts.map +1 -0
- package/dist/{motion/index.d.ts → common/motion.d.ts} +1 -1
- package/dist/common/motion.d.ts.map +1 -0
- package/dist/common/props.d.ts +1 -1
- package/dist/common/props.d.ts.map +1 -1
- package/dist/common/validate.js +1 -1
- package/dist/content/markdown.d.ts +3 -4
- package/dist/content/markdown.d.ts.map +1 -1
- package/dist/content/markdown.js +1 -4
- package/dist/controls/actions.d.ts +1 -1
- package/dist/controls/actions.d.ts.map +1 -1
- package/dist/controls/panel-row.js +1 -1
- package/dist/controls/range-filter.js +1 -1
- package/dist/dashboard/delta-badge.d.ts +18 -10
- package/dist/dashboard/delta-badge.d.ts.map +1 -1
- package/dist/dashboard/delta-badge.js +33 -1
- package/dist/dashboard/empty-state.d.ts +1 -4
- package/dist/dashboard/empty-state.d.ts.map +1 -1
- package/dist/dashboard/empty-state.js +1 -2
- package/dist/dashboard/index.d.ts +4 -2
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/index.js +7 -1
- package/dist/dashboard/query-state.d.ts +4 -13
- package/dist/dashboard/query-state.d.ts.map +1 -1
- package/dist/dashboard/query-state.js +4 -7
- package/dist/{section → dashboard}/section.d.ts +2 -2
- package/dist/{section → dashboard}/section.d.ts.map +1 -1
- package/dist/{section → dashboard}/section.js +2 -2
- package/dist/dashboard/settings-section.d.ts +1 -1
- package/dist/dashboard/settings-section.d.ts.map +1 -1
- package/dist/dashboard/settings-section.js +1 -1
- package/dist/dashboard/stat-card.d.ts +1 -1
- package/dist/dashboard/stat-card.d.ts.map +1 -1
- package/dist/dashboard/stat-card.js +1 -1
- package/dist/dashboard/widget-header.d.ts.map +1 -0
- package/dist/data/data-table.js +2 -2
- package/dist/data/table.d.ts +1 -1
- package/dist/data/table.d.ts.map +1 -1
- package/dist/data/table.js +2 -16
- package/dist/data/virtual.d.ts +3 -3
- package/dist/dev-dock.d.ts +28 -0
- package/dist/dev-dock.d.ts.map +1 -0
- package/dist/dev-dock.js +85 -0
- package/dist/format/date.d.ts +62 -0
- package/dist/format/date.d.ts.map +1 -0
- package/dist/format/date.js +106 -0
- package/dist/format/index.d.ts +39 -0
- package/dist/format/index.d.ts.map +1 -0
- package/dist/format/index.js +54 -0
- package/dist/format/measure.d.ts +15 -0
- package/dist/format/measure.d.ts.map +1 -0
- package/dist/format/measure.js +16 -0
- package/dist/format/number.d.ts +69 -0
- package/dist/format/number.d.ts.map +1 -0
- package/dist/format/number.js +62 -0
- package/dist/format/shared.d.ts +27 -0
- package/dist/format/shared.d.ts.map +1 -0
- package/dist/format/shared.js +29 -0
- package/dist/forms/field.d.ts +4 -20
- package/dist/forms/field.d.ts.map +1 -1
- package/dist/forms/field.js +0 -4
- package/dist/forms/form-layout.d.ts +1 -1
- package/dist/forms/form-layout.d.ts.map +1 -1
- package/dist/forms/form-layout.js +1 -1
- package/dist/forms/index.d.ts +1 -1
- package/dist/forms/index.d.ts.map +1 -1
- package/dist/forms/index.js +1 -2
- package/dist/forms/use-form-submit.js +1 -1
- package/dist/guard/index.d.ts +2 -9
- package/dist/guard/index.d.ts.map +1 -1
- package/dist/guard/index.js +16 -26
- package/dist/guard/types.d.ts +8 -10
- package/dist/guard/types.d.ts.map +1 -1
- package/dist/index.d.ts +16 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -29
- package/dist/notifications/index.d.ts +5 -5
- package/dist/notifications/index.d.ts.map +1 -1
- package/dist/notifications/index.js +0 -2
- package/dist/notifications/mount-guard.d.ts.map +1 -1
- package/dist/notifications/mount-guard.js +2 -2
- package/dist/provider/connectivity-indicator.d.ts.map +1 -0
- package/dist/{connectivity → provider}/connectivity-provider.d.ts +1 -1
- package/dist/provider/connectivity-provider.d.ts.map +1 -0
- package/dist/{connectivity/types.d.ts → provider/connectivity-types.d.ts} +1 -1
- package/dist/provider/connectivity-types.d.ts.map +1 -0
- package/dist/provider/error-fallback.module.css +21 -0
- package/dist/provider/error-fallback.module.css.d.ts +9 -0
- package/dist/provider/index.d.ts +20 -36
- package/dist/provider/index.d.ts.map +1 -1
- package/dist/provider/index.js +42 -32
- package/dist/provider/lab-theme.js +1 -1
- package/dist/provider/use-connectivity.d.ts +3 -0
- package/dist/provider/use-connectivity.d.ts.map +1 -0
- package/dist/query-client.d.ts +63 -0
- package/dist/query-client.d.ts.map +1 -0
- package/dist/query-client.js +33 -0
- package/dist/{query/devtools.d.ts → query-devtools.d.ts} +2 -2
- package/dist/query-devtools.d.ts.map +1 -0
- package/dist/register.d.ts +17 -3
- package/dist/register.d.ts.map +1 -1
- package/dist/router-tanstack/index.d.ts +4 -7
- package/dist/router-tanstack/index.d.ts.map +1 -1
- package/dist/router-tanstack/index.js +1 -9
- package/dist/router-tanstack/nav.d.ts +1 -1
- package/dist/router-tanstack/nav.d.ts.map +1 -1
- package/dist/router-tanstack/search-store.d.ts +3 -6
- package/dist/router-tanstack/search-store.d.ts.map +1 -1
- package/dist/router-tanstack/use-nav.d.ts +1 -1
- package/dist/router-tanstack/use-nav.d.ts.map +1 -1
- package/dist/shell/app-breadcrumbs.d.ts +1 -1
- package/dist/shell/app-breadcrumbs.d.ts.map +1 -1
- package/dist/shell/app-main.module.css +11 -0
- package/dist/shell/app-mobile-nav.d.ts +1 -1
- package/dist/shell/app-mobile-nav.d.ts.map +1 -1
- package/dist/shell/app-mobile-nav.js +24 -2
- package/dist/shell/app-sidebar.d.ts +1 -1
- package/dist/shell/app-sidebar.d.ts.map +1 -1
- package/dist/shell/app-sidebar.js +31 -2
- package/dist/shell/app-sidebar.module.css +10 -0
- package/dist/shell/index.d.ts +10 -4
- package/dist/shell/index.d.ts.map +1 -1
- package/dist/shell/index.js +13 -17
- package/dist/shell/mobile-nav-model.d.ts +1 -1
- package/dist/shell/mobile-nav-model.d.ts.map +1 -1
- package/dist/{nav/types.d.ts → shell/nav-types.d.ts} +1 -1
- package/dist/shell/nav-types.d.ts.map +1 -0
- package/dist/shell/page-aside.d.ts.map +1 -1
- package/dist/shell/page-aside.js +2 -29
- package/dist/shell/page-title.d.ts +14 -0
- package/dist/shell/page-title.d.ts.map +1 -0
- package/dist/shell/page-title.js +25 -0
- package/dist/shell/page-title.module.css +33 -0
- package/dist/shell/page-title.module.css.d.ts +11 -0
- package/dist/shell/sidebar-block-model.d.ts +1 -1
- package/dist/shell/sidebar-block-model.d.ts.map +1 -1
- package/dist/shell/sidebar-blocks.d.ts +1 -1
- package/dist/shell/sidebar-blocks.d.ts.map +1 -1
- package/dist/shell/use-breakpoint.d.ts +11 -0
- package/dist/shell/use-breakpoint.d.ts.map +1 -0
- package/dist/shell/use-breakpoint.js +33 -0
- package/dist/state/fields.d.ts +3 -19
- package/dist/state/fields.d.ts.map +1 -1
- package/dist/state/fields.js +6 -16
- package/dist/styles.css +36 -0
- package/dist/surfaces.d.ts +18 -41
- package/dist/surfaces.d.ts.map +1 -1
- package/dist/surfaces.js +46 -59
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/{theme-toggle/index.d.ts → theme/theme-toggle.d.ts} +1 -1
- package/dist/theme/theme-toggle.d.ts.map +1 -0
- package/dist/{theme-toggle/index.js → theme/theme-toggle.js} +1 -1
- package/dist/tokens/index.d.ts +1 -0
- package/dist/tokens/index.d.ts.map +1 -1
- package/dist/tokens/index.js +10 -0
- package/dist/tokens/palette.d.ts +12 -0
- package/dist/tokens/palette.d.ts.map +1 -1
- package/dist/tokens/palette.js +13 -1
- package/dist/tokens.css +1 -0
- package/llms.txt +9 -24
- package/package.json +12 -16
- package/src/agent/ai-sdk-transport.ts +11 -4
- package/src/agent/coalesce.ts +1 -1
- package/src/agent/merge.ts +1 -1
- package/src/agent/transport.ts +15 -2
- package/src/agent/use-agent-thread-runs.ts +65 -15
- package/src/agent-chat/index.ts +6 -4
- package/src/agent-chat/relative-time.ts +1 -1
- package/src/agent-chat/thread-detail-panel.tsx +1 -1
- package/src/agent-chat/thread-feed-row.tsx +105 -30
- package/src/agent-chat/thread-feed.tsx +51 -25
- package/src/agent-chat/thread-message.tsx +1 -1
- package/src/agent-chat/virtualize.ts +48 -0
- package/src/charts/index.ts +7 -10
- package/src/charts/kinds/BandStrip.tsx +1 -1
- package/src/charts/kinds/Bars.tsx +2 -5
- package/src/charts/kinds/DualPanel.tsx +4 -3
- package/src/charts/kinds/StackedArea.tsx +1 -1
- package/src/charts/kinds/ZonedLine.tsx +1 -4
- package/src/charts/primitives/Axes.tsx +49 -0
- package/src/charts/primitives/ChartCard.tsx +49 -6
- package/src/charts/primitives/ChartFrame.tsx +5 -1
- package/src/charts/primitives/ChartPending.tsx +14 -8
- package/src/charts/utils/format.ts +17 -186
- package/src/cli/audit-allows.ts +371 -0
- package/src/cli/check-theme.ts +197 -0
- package/src/cli/doctor.ts +331 -0
- package/src/cli/guard-hook.ts +115 -0
- package/src/cli/help.ts +101 -0
- package/src/cli/index.ts +269 -3439
- package/src/cli/init.ts +247 -0
- package/src/cli/sync.ts +324 -0
- package/src/cli/tokens-css.ts +252 -0
- package/src/commands/define-commands.ts +1 -1
- package/src/commands/define-overlays.ts +1 -1
- package/src/commands/index.ts +10 -1
- package/src/commands/overlays-mount.tsx +8 -10
- package/src/commands/shell-bridge.ts +86 -0
- package/src/common/errors.ts +70 -0
- package/src/common/index.ts +2 -0
- package/src/common/props.ts +1 -1
- package/src/common/validate.ts +1 -1
- package/src/content/markdown.tsx +4 -8
- package/src/controls/actions.tsx +1 -1
- package/src/controls/panel-row.tsx +1 -1
- package/src/controls/range-filter.tsx +1 -1
- package/src/dashboard/delta-badge.tsx +74 -7
- package/src/dashboard/empty-state.tsx +2 -6
- package/src/dashboard/index.ts +11 -2
- package/src/dashboard/query-state.tsx +5 -18
- package/src/{section → dashboard}/section.tsx +4 -4
- package/src/dashboard/settings-section.tsx +2 -2
- package/src/dashboard/stat-card.tsx +2 -2
- package/src/data/data-table.tsx +3 -3
- package/src/data/table.ts +6 -25
- package/src/data/virtual-list.tsx +1 -1
- package/src/data/virtual.ts +3 -3
- package/src/dev-dock.tsx +159 -0
- package/src/format/date.ts +184 -0
- package/src/format/index.ts +69 -0
- package/src/format/measure.ts +31 -0
- package/src/format/number.ts +129 -0
- package/src/format/shared.ts +63 -0
- package/src/forms/field.ts +4 -24
- package/src/forms/form-layout.tsx +2 -2
- package/src/forms/index.ts +1 -2
- package/src/forms/use-form-submit.ts +1 -1
- package/src/guard/index.ts +30 -56
- package/src/guard/types.ts +7 -10
- package/src/index.ts +38 -29
- package/src/notifications/index.ts +5 -7
- package/src/notifications/mount-guard.ts +7 -9
- package/src/{connectivity → provider}/connectivity-indicator.tsx +1 -1
- package/src/{connectivity → provider}/connectivity-provider.tsx +1 -1
- package/src/provider/error-fallback.module.css +21 -0
- package/src/provider/error-fallback.module.css.d.ts +9 -0
- package/src/provider/index.tsx +71 -71
- package/src/provider/lab-theme.ts +1 -1
- package/src/{connectivity → provider}/use-connectivity.ts +3 -3
- package/src/query-client.ts +100 -0
- package/src/{query/devtools.tsx → query-devtools.tsx} +5 -4
- package/src/register.ts +20 -4
- package/src/router-tanstack/index.ts +4 -15
- package/src/router-tanstack/nav.ts +1 -1
- package/src/router-tanstack/search-store.ts +3 -4
- package/src/router-tanstack/use-nav.ts +1 -1
- package/src/shell/app-breadcrumbs.tsx +1 -1
- package/src/shell/app-main.module.css +11 -0
- package/src/shell/app-mobile-nav.tsx +28 -1
- package/src/shell/app-sidebar.module.css +10 -0
- package/src/shell/app-sidebar.tsx +31 -2
- package/src/shell/index.tsx +23 -28
- package/src/shell/mobile-nav-model.ts +1 -1
- package/src/shell/page-aside.tsx +2 -52
- package/src/shell/page-title.module.css +33 -0
- package/src/shell/page-title.module.css.d.ts +11 -0
- package/src/shell/page-title.tsx +57 -0
- package/src/shell/sidebar-block-model.ts +1 -1
- package/src/shell/sidebar-blocks.tsx +1 -1
- package/src/shell/use-breakpoint.ts +73 -0
- package/src/state/fields.ts +7 -43
- package/src/styles.css +36 -0
- package/src/surfaces.ts +45 -60
- package/src/theme/index.ts +7 -0
- package/src/{theme-toggle/index.tsx → theme/theme-toggle.tsx} +1 -1
- package/src/tokens/index.ts +10 -0
- package/src/tokens/palette.ts +12 -0
- package/dist/connectivity/connectivity-indicator.d.ts.map +0 -1
- package/dist/connectivity/connectivity-provider.d.ts.map +0 -1
- package/dist/connectivity/index.d.ts +0 -14
- package/dist/connectivity/index.d.ts.map +0 -1
- package/dist/connectivity/index.js +0 -8
- package/dist/connectivity/types.d.ts.map +0 -1
- package/dist/connectivity/use-connectivity.d.ts +0 -3
- package/dist/connectivity/use-connectivity.d.ts.map +0 -1
- package/dist/data/index.d.ts +0 -38
- package/dist/data/index.d.ts.map +0 -1
- package/dist/data/index.js +0 -24
- package/dist/motion/index.d.ts.map +0 -1
- package/dist/nav/types.d.ts.map +0 -1
- package/dist/notifications/overlay.d.ts +0 -20
- package/dist/notifications/overlay.d.ts.map +0 -1
- package/dist/notifications/overlay.js +0 -14
- package/dist/query/devtools.d.ts.map +0 -1
- package/dist/query/error-message.d.ts +0 -41
- package/dist/query/error-message.d.ts.map +0 -1
- package/dist/query/error-message.js +0 -30
- package/dist/query/index.d.ts +0 -47
- package/dist/query/index.d.ts.map +0 -1
- package/dist/query/index.js +0 -56
- package/dist/router-tanstack/field.d.ts +0 -14
- package/dist/router-tanstack/field.d.ts.map +0 -1
- package/dist/router-tanstack/field.js +0 -4
- package/dist/router-tanstack/multi-search-param-store.d.ts +0 -43
- package/dist/router-tanstack/multi-search-param-store.d.ts.map +0 -1
- package/dist/router-tanstack/multi-search-param-store.js +0 -30
- package/dist/router-tanstack/search-param-store.d.ts +0 -42
- package/dist/router-tanstack/search-param-store.d.ts.map +0 -1
- package/dist/router-tanstack/search-param-store.js +0 -25
- package/dist/section/index.d.ts +0 -2
- package/dist/section/index.d.ts.map +0 -1
- package/dist/section/index.js +0 -4
- package/dist/theme-toggle/index.d.ts.map +0 -1
- package/dist/utils/is-dev.d.ts.map +0 -1
- package/dist/widget-header/delta-badge.d.ts +0 -19
- package/dist/widget-header/delta-badge.d.ts.map +0 -1
- package/dist/widget-header/delta-badge.js +0 -36
- package/dist/widget-header/index.d.ts +0 -3
- package/dist/widget-header/index.d.ts.map +0 -1
- package/dist/widget-header/index.js +0 -8
- package/dist/widget-header/widget-header.d.ts.map +0 -1
- package/src/connectivity/index.ts +0 -19
- package/src/data/index.ts +0 -69
- package/src/notifications/overlay.tsx +0 -66
- package/src/query/error-message.ts +0 -70
- package/src/query/index.ts +0 -97
- package/src/router-tanstack/field.ts +0 -36
- package/src/router-tanstack/multi-search-param-store.ts +0 -106
- package/src/router-tanstack/search-param-store.ts +0 -100
- package/src/section/index.ts +0 -1
- package/src/widget-header/delta-badge.tsx +0 -77
- package/src/widget-header/index.ts +0 -10
- /package/dist/{utils → common}/is-dev.d.ts +0 -0
- /package/dist/{utils → common}/is-dev.js +0 -0
- /package/dist/{motion/index.js → common/motion.js} +0 -0
- /package/dist/{section → dashboard}/section.module.css +0 -0
- /package/dist/{section → dashboard}/section.module.css.d.ts +0 -0
- /package/dist/{widget-header → dashboard}/widget-header.d.ts +0 -0
- /package/dist/{widget-header → dashboard}/widget-header.js +0 -0
- /package/dist/{widget-header → dashboard}/widget-header.module.css +0 -0
- /package/dist/{widget-header → dashboard}/widget-header.module.css.d.ts +0 -0
- /package/dist/{connectivity → provider}/connectivity-indicator.d.ts +0 -0
- /package/dist/{connectivity → provider}/connectivity-indicator.js +0 -0
- /package/dist/{connectivity → provider}/connectivity-provider.js +0 -0
- /package/dist/{connectivity/types.js → provider/connectivity-types.js} +0 -0
- /package/dist/{connectivity → provider}/use-connectivity.js +0 -0
- /package/dist/{query/devtools.js → query-devtools.js} +0 -0
- /package/dist/{nav/types.js → shell/nav-types.js} +0 -0
- /package/src/{utils → common}/is-dev.ts +0 -0
- /package/src/{motion/index.ts → common/motion.ts} +0 -0
- /package/src/{section → dashboard}/section.module.css +0 -0
- /package/src/{section → dashboard}/section.module.css.d.ts +0 -0
- /package/src/{widget-header → dashboard}/widget-header.module.css +0 -0
- /package/src/{widget-header → dashboard}/widget-header.module.css.d.ts +0 -0
- /package/src/{widget-header → dashboard}/widget-header.tsx +0 -0
- /package/src/{connectivity/types.ts → provider/connectivity-types.ts} +0 -0
- /package/src/{nav/types.ts → shell/nav-types.ts} +0 -0
package/AGENTS.md
CHANGED
|
@@ -8,18 +8,16 @@ Toolchain: Bun runtime, oxlint + oxfmt, conventional commits (empty scope), `mas
|
|
|
8
8
|
|
|
9
9
|
| Subpath | Layer | Purpose |
|
|
10
10
|
| --------------------------- | --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
11
|
-
| `basalt-ui` | mantine-coupled | BasaltProvider, createBasaltTheme, BasaltShell + sidebar/mobile-nav/breadcrumbs, PageBar, PageAside, NavCountBadge, ThemeToggle, ThreadWorkspace + thread-chat components, WidgetHeader, dashboard composites (DeltaBadge, StatCard with threshold tone, EmptyState, QueryState/LoadingState/ErrorState, SettingsSection/SettingsRow/DangerZone)
|
|
11
|
+
| `basalt-ui` | mantine-coupled | BasaltProvider, createBasaltTheme, BasaltShell + sidebar/mobile-nav/breadcrumbs, PageBar, PageAside, useBreakpoint, NavCountBadge, ThemeToggle, ThreadWorkspace + thread-chat components, WidgetHeader, dashboard composites (DeltaBadge, StatCard with threshold tone, EmptyState, QueryState/LoadingState/ErrorState, SettingsSection/SettingsRow/DangerZone), ConnectivityProvider/useConnectivity/ConnectivityIndicator (auto-mounted, C1: absorbed from the dropped ./connectivity), createBasaltQueryClient/unwrap/BasaltQueryDevtools (C1: absorbed from the dropped ./query), BasaltDevDock (C5: lazy Router/Query devtools + theme lab in one dock) |
|
|
12
12
|
| `basalt-ui/charts` | headless | CartesianChart + visx chart primitives, kinds, sparklines, hooks, and token re-exports (Mantine-free) |
|
|
13
13
|
| `basalt-ui/tokens` | headless | VX token refs, buildPaletteCss, defineSeries, seriesTokens, groupTokens, alpha (Mantine-free) |
|
|
14
14
|
| `basalt-ui/theme-lab` | mantine-coupled | ThemeLabControls, applyOverrides, COLOR_GROUPS — a low-level inspector for the non-derived structural tokens; identity/color tuning lives in DeriveControls |
|
|
15
15
|
| `basalt-ui/vite` | build-tooling | basaltViteConfig(opts) — Vite preset for basalt-ui consumer apps; basaltAppPlugin(opts) — PWA head, manifest, and icon metadata derived from the token palette |
|
|
16
16
|
| `basalt-ui/guard` | headless | checkSource, GUARD_RULES, Finding types — the headless theme-guard core |
|
|
17
|
-
| `basalt-ui/
|
|
18
|
-
| `basalt-ui/
|
|
19
|
-
| `basalt-ui/forms` | mantine-coupled | Mantine form layer: useBasaltForm + inputProps/fieldKey (two calls — a spread `key` is a React 19 warning), the FormSection/FormRow/FormGroup/FormActions layout (FormRow is law C1’s form row), useFormSubmit (submit state, decoded errors, server fieldErrors, focus-first-error, validateAsync), FormStateProvider disable propagation, useFieldArray, FormErrorSummary, useFormDraft with autosave (Standard Schema; deprecated `field` alias for `inputProps` until the surface next changes) |
|
|
17
|
+
| `basalt-ui/router-tanstack` | headless | TanStack Router bridge: defineNav/navGroup/navTarget (one typed nav definition) + useNav (sections + mobileNav, spread onto BasaltShell) + useBasaltNav (active route) + useRouterBreadcrumbs + createSearchStore (typed URL > localStorage > fallback store over field.enum/multi/range/number/boolean/string; the deprecated createSearchParamStore/createMultiSearchParamStore wrappers were removed in 1.29.0, C1 consolidation) |
|
|
18
|
+
| `basalt-ui/forms` | mantine-coupled | Mantine form layer: useBasaltForm + inputProps/fieldKey (two calls — a spread `key` is a React 19 warning; the deprecated `field` alias for `inputProps` was removed in 1.29.0, C1 consolidation), the FormSection/FormRow/FormGroup/FormActions layout (FormRow is law C1’s form row), useFormSubmit (submit state, decoded errors, server fieldErrors, focus-first-error, validateAsync), FormStateProvider disable propagation, useFieldArray, FormErrorSummary, useFormDraft with autosave (Standard Schema) |
|
|
20
19
|
| `basalt-ui/notifications` | mantine-coupled | Mantine notifications: notify helpers, typed registry, persisted history, NotificationBell, NotificationCenter |
|
|
21
20
|
| `basalt-ui/commands` | mantine-coupled | typed command bus + overlay controller, toSpotlightActions, ShortcutsHelp, BasaltOverlays |
|
|
22
|
-
| `basalt-ui/data` | mantine-coupled | Convenience barrel pulling both TanStack Table + Virtual peer groups: BasaltDataTable, BasaltVirtualList (Mantine-rendered) — prefer ./data/table or ./data/virtual for per-feature opt-in |
|
|
23
21
|
| `basalt-ui/data/table` | mantine-coupled | BasaltDataTable: a sortable data table over TanStack Table, rendered with Mantine (Mantine-rendered) |
|
|
24
22
|
| `basalt-ui/data/virtual` | mantine-coupled | BasaltVirtualList: a windowed virtual list over TanStack Virtual, rendered with Mantine (Mantine-rendered) |
|
|
25
23
|
| `basalt-ui/agent` | headless | Headless streaming-chat layer: useAgentStream, aiSdkTransport (recommended default) + edenTransport, isResumable/ResumableAgentTransport (stream-resumption seam), PartList, coalesceParts, the ForeignPart/definePartRenderers/narrowAgentPart open part-registry seam, plus the multi-thread createThreadsStore + useAgentThreadRuns + outcome-resolver seam (Mantine-free) |
|
|
@@ -28,7 +26,7 @@ Toolchain: Bun runtime, oxlint + oxfmt, conventional commits (empty scope), `mas
|
|
|
28
26
|
| `basalt-ui/controls` | mantine-coupled | The control tier (docs/CONTROLS-SPEC.md §3): FilterSet (nowrap row + measured +N fold + the mobile Filters (n) sheet), RangeFilter/CompareFilter/SelectFilter/MultiSelectFilter/NumberFilter/SearchFilter/ToggleFilter (each bound to a FieldHandle — no value/onChange/size, law C2/C5; NumberFilter is the field.number lane, a radio list over `options` or a stepper without), ViewTabs, and the action/sync family (ActionGroup, OverflowMenu, SyncButton, BarAction/GlobalAction). THREE surfaces, picked by the home and never by a prop (useFilterSurface): pill in a PageBar row, sheet in the mobile Filters (n) drawer, panel in a PageAside body — where every control renders an inspector/facet ROW instead of a chip (docs/ASIDE-SPEC.md §3). PanelRow is that row primitive (label above, hint, mono readout, an `end` control on the label line) and SliderControl is the one bound control with no pill form at all; the counts/max props on MultiSelectFilter render the Foundry facet list there. Every control owns its own desktop/mobile swap in CSS (C9) and renders size="ctl" internally. Resolves and renders with NO @mantine/dates installed — the custom date picker is injected through RangeFilter.customPicker from ./controls-dates. |
|
|
29
27
|
| `basalt-ui/controls-dates` | mantine-coupled | DateRangePicker — the @mantine/dates implementation of RangeFilter's customPicker seam. Its own subpath because @mantine/dates is an optional peer and basaltViteConfig pre-bundles the whole @mantine scope, so a consumer without the peer (linewatch) must never resolve it: nothing under src/controls may import it, statically or lazily (docs/CONTROLS-SPEC.md §3). |
|
|
30
28
|
| `basalt-ui/state` | headless | createPersistedState (versioned localStorage) + the store field vocabulary (field.enum/multi/range/number/boolean/string, FieldHandle, lanes) + createLocalStore, the router-free store — Mantine-free state primitives |
|
|
31
|
-
| `basalt-ui/
|
|
29
|
+
| `basalt-ui/format` | headless | money/percent/integer/compact/deltaPct/duration/durationClock/clock/relativeTime/weekday/km/kcal — Intl-backed, Mantine-free, React-free formatting; charts/utils/format.ts re-exports fmtCompact/fmtPercent/fmtCurrency/fmtInt/fmtAxisDate/fmtTooltipDate from here (C5 consolidation, one implementation) |
|
|
32
30
|
|
|
33
31
|
## Hard rules
|
|
34
32
|
|
|
@@ -77,21 +75,16 @@ basalt-ui sync --check # CI freshness gate — exits non-zero if any manage
|
|
|
77
75
|
basalt-ui doctor # integration health — SKIPPED is a third outcome and exits non-zero
|
|
78
76
|
bunx basalt-ui tokens:css # emit the --vx-* stylesheet (no React, no Mantine, no bundler) — bunx ONLY if basalt is not installed
|
|
79
77
|
bunx basalt-ui fonts:css # emit the shipped --basalt-font-* stacks — same exception
|
|
80
|
-
basalt-ui info --json # stable JSON surface map
|
|
81
78
|
basalt-ui guard-hook # PreToolUse theme-guard adapter: reads a Write/Edit payload on stdin, denies off-palette writes
|
|
82
79
|
```
|
|
83
80
|
|
|
84
81
|
Every subcommand rejects a flag it does not accept, exiting 1 and naming it; an unknown command says
|
|
85
82
|
so above the usage block. Neither is ever ignored — `doctor --json` used to run doctor and exit 0.
|
|
86
83
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
relocation in one sentence — `check-theme` used to fabricate `roots: ["src"]` on the ascend path and
|
|
92
|
-
pass silently. Two candidates is ambiguous and reported, never guessed. `sync` on a `tokens-only`
|
|
93
|
-
consumer prints `n/a` and exits 0; from a sub-package it refreshes the parent install rather than
|
|
94
|
-
refusing, and still will not scaffold a second consumer.
|
|
84
|
+
**One resolver (C2, 1.29.0): `BASALT_CWD` → cwd, and a declared `basalt.roots` — nothing inferred.**
|
|
85
|
+
`check-theme`, `doctor` and `sync` all resolve their project the same way; there is no ascend/descend
|
|
86
|
+
guess. Two candidates is ambiguous and reported, never guessed. `sync` on a `tokens-only` consumer
|
|
87
|
+
prints `n/a` and exits 0.
|
|
95
88
|
|
|
96
89
|
**Run the local bin, not `bunx`.** `bunx` does not re-resolve a cached package, so it can execute
|
|
97
90
|
the version you just upgraded away from — one consumer filed a P0 against a 1.20.0 cache while
|
|
@@ -115,9 +108,9 @@ reports `theme-allow-unscoped`. A word in the id slot that names no rule waives
|
|
|
115
108
|
plugin-rule waivers too (since 1.22.0), by re-running oxlint — so it needs oxlint reachable;
|
|
116
109
|
otherwise the verdict is "cannot judge", never "dead".
|
|
117
110
|
|
|
118
|
-
> **Framework-internal only** — `
|
|
119
|
-
> basalt-ui repo itself (asserts SURFACES ↔
|
|
120
|
-
>
|
|
111
|
+
> **Framework-internal only** — `bun scripts/check-coverage.ts` (a script, not a CLI subcommand
|
|
112
|
+
> as of C2/1.29.0) is a self-consistency gate for the basalt-ui repo itself (asserts SURFACES ↔
|
|
113
|
+
> rule files ↔ skill files ↔ package.json exports). Not a consumer command.
|
|
121
114
|
|
|
122
115
|
## Machine-readable surface map
|
|
123
116
|
|
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,16 @@
|
|
|
1
|
+
# [1.29.0](https://github.com/jkrumm/basalt-ui/compare/v1.28.0...v1.29.0) (2026-09-02)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* record every 1.29.0 removal, retire the dead notifications rule, tickValues ([21a6c28](https://github.com/jkrumm/basalt-ui/commit/21a6c287ad020e50dad7004135e1695bce58e2d6))
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* a format module, chart states by flag, useBreakpoint, command handles ([dbf38f7](https://github.com/jkrumm/basalt-ui/commit/dbf38f79d01a2333181cf3f490f66ae8cd0dffbf))
|
|
12
|
+
* transport message ids, onError and hydrated resume in the agent layer ([a30959e](https://github.com/jkrumm/basalt-ui/commit/a30959ef81eac0f555e0ad06e6fe68366cb358a8))
|
|
13
|
+
|
|
1
14
|
# [1.28.0](https://github.com/jkrumm/basalt-ui/compare/v1.27.0...v1.28.0) (2026-09-02)
|
|
2
15
|
|
|
3
16
|
|
package/MIGRATING.md
CHANGED
|
@@ -180,8 +180,8 @@ What is new, one line each — nothing here renames or removes anything:
|
|
|
180
180
|
`tier` is the package's word for "how loud is this" (`WidgetHeader`, `CtlSlot`), and `'section'`
|
|
181
181
|
meant two different things across the two spellings. `variant` is `@deprecated` and still
|
|
182
182
|
honoured; resolution is `tier ?? variant ?? 'page'`, so nothing moves until you change the prop.
|
|
183
|
-
`QueryStateTier` is the new type name; `QueryStateVariant`
|
|
184
|
-
is
|
|
183
|
+
`QueryStateTier` is the new type name; `QueryStateVariant` stayed exported as an alias through
|
|
184
|
+
1.28.x and is **removed in 1.29.0** together with the `variant` prop (see § Consolidation).
|
|
185
185
|
- **`WidgetHeader` and `QueryState` gained slot classes** — `classNames={{ root, title, metric,
|
|
186
186
|
icon }}` on the first, `classNames={{ root }}` on the second (the branch that is live). Additive.
|
|
187
187
|
`Section` now OMITS `classNames` from the `WidgetHeaderProps` it re-publishes, so its slot union
|
|
@@ -221,8 +221,8 @@ icon }}` on the first, `classNames={{ root }}` on the second (the branch that is
|
|
|
221
221
|
not activate.
|
|
222
222
|
- **`BasaltDataTable` row selection** — `enableRowSelection` prepends a checkbox column (header =
|
|
223
223
|
select-all on the page) and arms TanStack's row-selection feature; `rowSelection` /
|
|
224
|
-
`onRowSelectionChange` are the controlled pair over TanStack's own `RowSelectionState` (
|
|
225
|
-
|
|
224
|
+
`onRowSelectionChange` are the controlled pair over TanStack's own `RowSelectionState` (re-exported
|
|
225
|
+
from `basalt-ui/data/table` in 1.28.x; from 1.29.0 import it from `@tanstack/react-table`), and `getRowId` makes a selection
|
|
226
226
|
survive a re-sort or a refetch (the default id is the row INDEX). `bulkActions` renders a bar
|
|
227
227
|
above the table while ≥1 row is selected — the count, then the actions, through the SAME
|
|
228
228
|
`BarAction[]` vocabulary `PageBar` uses, so the ≤3-inline fold and the mobile kebab are basalt's
|
|
@@ -444,7 +444,7 @@ The `field.*` store builder (`basalt-ui/state`, `basalt-ui/router-tanstack`) is
|
|
|
444
444
|
### Shell — region seams, and what moved with them
|
|
445
445
|
|
|
446
446
|
**Every `AppShell` region now ends in a real, themed 1px `--vx-divider` line on its Main-facing
|
|
447
|
-
edge, with no opt-out** (`docs/
|
|
447
|
+
edge, with no opt-out** (`docs/MANTINE-THEMING.md` § Chrome integration): sidebar|main
|
|
448
448
|
(full height, under `layout="alt"` it owns the top-left corner), header|main (main column only),
|
|
449
449
|
main|aside (full height, absent when the aside is unclaimed), main|mobile-nav (below `sm`). Mantine
|
|
450
450
|
draws all four itself through `[data-with-border]`; the colour is one theme var,
|
|
@@ -879,6 +879,138 @@ Three rendering changes ride along, all visible without any code change:
|
|
|
879
879
|
`12ch`, capped at `100%`). The field still resolves to 220px wherever 220 fits and still never
|
|
880
880
|
grows with the table; below that the search and the pills wrap onto their own lines.
|
|
881
881
|
|
|
882
|
+
### Consolidation (targeting 1.29.0)
|
|
883
|
+
|
|
884
|
+
**Dropped subpaths — three, all folded into `.`/`./provider`, none deleted outright.**
|
|
885
|
+
|
|
886
|
+
<!-- C1 symbol list -->
|
|
887
|
+
|
|
888
|
+
- `./query` — dropped. `createBasaltQueryClient`, `unwrap`, `BasaltQueryDevtools`,
|
|
889
|
+
`toErrorMessage`, `errorStatus` now on `.` (root barrel) — import from `basalt-ui` instead of
|
|
890
|
+
`basalt-ui/query`. The nine raw TanStack re-exports it carried (`QueryClientProvider`,
|
|
891
|
+
`QueryErrorResetBoundary`, `useQueryErrorResetBoundary`, `useQuery`, `useSuspenseQuery`,
|
|
892
|
+
`useMutation`, `useQueryClient`, `useInfiniteQuery`, `queryOptions`) are gone from basalt entirely —
|
|
893
|
+
import them from `@tanstack/react-query`, which the root entry already requires.
|
|
894
|
+
- `./data/table` — **narrowed, not dropped**: `BasaltDataTable`, its types and `createColumnHelper`
|
|
895
|
+
stay; the TanStack pass-throughs (`useReactTable`, `flexRender`, `getCoreRowModel`,
|
|
896
|
+
`getSortedRowModel`, `getFilteredRowModel`, `getPaginationRowModel`, `ColumnDef`, `SortingState`,
|
|
897
|
+
`ColumnHelper`, `PaginationState`, `ColumnPinningState`, `RowSelectionState`, `ColumnFiltersState`)
|
|
898
|
+
are imported from `@tanstack/react-table` directly.
|
|
899
|
+
- `./connectivity` — dropped. `ConnectivityProvider` (auto-mounted by `BasaltProvider`, no
|
|
900
|
+
consumer-side import needed), `useConnectivity`, `ConnectivityIndicator` now on `.`.
|
|
901
|
+
- `./data` (bare) — dropped. It never carried its own exports beyond re-exporting `./data/table`
|
|
902
|
+
and `./data/virtual` — import the narrow subpath you need directly; nothing renamed.
|
|
903
|
+
- `./controls-dates` — **unaffected**, stays a separate subpath (inlining it into `./controls`
|
|
904
|
+
would pull `@mantine/dates` into a subpath that must resolve without it).
|
|
905
|
+
|
|
906
|
+
**Deleted `@deprecated` shims** (every one slated for 1.29.0 removal in an earlier minor's
|
|
907
|
+
deprecation row — see that minor's own `MIGRATING.md` section for the original `@deprecated`
|
|
908
|
+
annotation and rationale):
|
|
909
|
+
|
|
910
|
+
- `state.ts`'s legacy connectivity export — use `./provider`'s `useConnectivity` instead.
|
|
911
|
+
- `BasaltProvider`'s flat `sseUrl` / `healthUrl` / `healthIntervalMs` props — use
|
|
912
|
+
`connectivity={{ sseUrl, healthUrl, healthIntervalMs }}`.
|
|
913
|
+
- `QueryStateVariant` and the `variant` prop on `QueryState`/`LoadingState`/`ErrorState`/`EmptyState`
|
|
914
|
+
— use `QueryStateTier` and `tier` (identical values).
|
|
915
|
+
- `createSearchParamStore` / `createMultiSearchParamStore` (`basalt-ui/router-tanstack`) and the
|
|
916
|
+
legacy branches they kept alive in the field vocabulary — use `createSearchStore` with
|
|
917
|
+
`field.enum` / `field.multi`.
|
|
918
|
+
- `field` on `basalt-ui/forms` — use `inputProps(form, path)` + `fieldKey(form, path)`.
|
|
919
|
+
- `BasaltNotifications` / `BasaltNotificationsProps` (`basalt-ui/notifications`) — mount
|
|
920
|
+
`<BasaltOverlays notifications />` from `basalt-ui/commands` instead. **Doctrine exception,
|
|
921
|
+
recorded**: this one never carried a `deprecated-export` row; it was superseded in 1.2x and its own
|
|
922
|
+
JSDoc warned against mounting it next to `BasaltOverlays`, so it leaves in the same minor as the
|
|
923
|
+
other shims. The `duplicate-notifications-mount` lint rule that only existed to catch the
|
|
924
|
+
double-mount is retired with it.
|
|
925
|
+
- `ConnectivityIndicatorProps` stays on the root barrel (it is `BasaltProps`).
|
|
926
|
+
|
|
927
|
+
**CLI** (`basalt-ui`): `info` and `check-coverage` are gone — `check-coverage` is a repo-internal
|
|
928
|
+
script (`bun scripts/check-coverage.ts`), not a consumer command; `info` graded a consumer's
|
|
929
|
+
`vite.config.ts` by parsing it and nobody read the output. `doctor` checks THIS package only: the
|
|
930
|
+
workspace-wide `ai` major-parity walk (with `!`-exclusions and `aiMajorSkewReason`) and the
|
|
931
|
+
`basaltAppPlugin({ icons })` file check are dropped. One resolver remains for every command —
|
|
932
|
+
`BASALT_CWD`, then cwd, plus a declared `basalt.roots`; nothing is inferred from siblings or parents.
|
|
933
|
+
|
|
934
|
+
- `ZonedLine`/`Bars`' `ZoneSpec` aliases — use the canonical `AxisConfig`-scoped zone type each
|
|
935
|
+
kind now exports directly.
|
|
936
|
+
- `inputProps`'s `key` return field (already shape-changed in an earlier Unreleased entry above) —
|
|
937
|
+
fully removed this minor; use `fieldKey(form, name)` alongside `inputProps(form, name)`.
|
|
938
|
+
|
|
939
|
+
**On notice for 1.30.0** — a public export with exactly one consumer (the playground) as of this
|
|
940
|
+
audit. Adopt-or-delete: gains a real consumer by 1.30.0 or is removed. Not a promise either way;
|
|
941
|
+
record your adoption in `docs/ARGO-MIGRATION-LEARNINGS.md` if you pick one up.
|
|
942
|
+
|
|
943
|
+
- **Threads/agent-chat composite tier**: `ThreadWorkspace`, `ThreadFeed`, `ThreadFeedRow`,
|
|
944
|
+
`ThreadDetailPanel`, `ThreadOutcomeCard`, `ThreadsStoreAdapter`, `createThreadsStore`,
|
|
945
|
+
`createAdapterThreadsStore`, `threadsStoreAdapterContract`, `threadPartRenderers`,
|
|
946
|
+
`definePartRenderers`.
|
|
947
|
+
- **Chart kind**: `Heatmap` only — `DualPanel` has an argo consumer and `MirroredBars`/`BandStrip`
|
|
948
|
+
are consumed by linewatch, so those three are NOT on notice.
|
|
949
|
+
- **Nav/shell**: `PageAside`, `PanelRow`, `SettingsRow` (playground-only as of this audit).
|
|
950
|
+
- **Controls**: `SliderControl`, `SearchFilter`, `ToggleFilter`, `CompareFilter`, `OverflowMenu`,
|
|
951
|
+
`ControlGroup`.
|
|
952
|
+
|
|
953
|
+
**`common/**`— the public common primitives, as a unit.**`src/common/\*\*`(shipped from the
|
|
954
|
+
maturation round) is now the one place base prop/error/ref vocabulary lives:`BasaltProps`,
|
|
955
|
+
`SlotStylesProps`, `cx`, `mergeRefs`/`assignRef`, the prefixed `errors.ts` table
|
|
956
|
+
(`toErrorMessage`/`errorStatus`), `useValidateProps`, `assertRequiredProps`. Every basalt component
|
|
957
|
+
extends `BasaltProps`for its own prop type rather than redeclaring`className`/`style`; a consumer
|
|
958
|
+
composing over a basalt component should do the same.
|
|
959
|
+
|
|
960
|
+
### Additions (targeting 1.29.0)
|
|
961
|
+
|
|
962
|
+
C5 consolidation — every item below names the argo lines it lets a consumer delete
|
|
963
|
+
(`.claude/maturation/consolidation-plan.md` §C5, `audit-f-argo-consumer.md`). All additive; nothing
|
|
964
|
+
in this block removes or renames an existing export.
|
|
965
|
+
|
|
966
|
+
- **`basalt-ui/format`** — new subpath, Mantine-free and React-free: `money`, `percent`, `integer`,
|
|
967
|
+
`compact`, `deltaPct`, `duration` (seconds → `"1h 02m"`; `{ unit: 'minutes' }` for a
|
|
968
|
+
minutes-based input), `durationClock` (`"1:02:03"`), `clock`, `relativeTime`, `weekday`, `km`,
|
|
969
|
+
`kcal` — plus the original chart-formatter names (`fmtCompact`/`fmtPercent`/`fmtCurrency`/
|
|
970
|
+
`fmtInt`/`fmtAxisDate`/`fmtTooltipDate`/`NON_FINITE`/`formatters`), now re-exported from here;
|
|
971
|
+
`./charts`' `utils/format.ts` is an internal re-export shim, not a second implementation.
|
|
972
|
+
- **`ChartState.empty`** widens to `boolean | string` — a string is both truthy and the label
|
|
973
|
+
`ChartEmpty` paints. `ChartCard` gains `state?: ChartState`, `placeholderHeight?: number`
|
|
974
|
+
(default 240) and `stateAction?: ReactNode`, and `children` is now optional so a title-less
|
|
975
|
+
pending card can be a route's own `<Suspense fallback>`. Resolution order is the same
|
|
976
|
+
`resolveChartState` precedence every kind already has — pending → error → empty — and
|
|
977
|
+
`state={{}}`/omitting `state` renders `children` unchanged. `ChartCenter`'s `width` widens to
|
|
978
|
+
`number | string` (`'100%'` for a non-measured block body).
|
|
979
|
+
- **`DualPanel`'s `fillBetween` gains `aboveFill?: string`** — the above-side fill color; omitted,
|
|
980
|
+
both sides keep sharing `fill` (unchanged behaviour). **`AxisBottomNumeric`** exported from
|
|
981
|
+
`./charts` — the numeric twin of `AxisLeftNumeric`, for a bespoke continuous-x plot.
|
|
982
|
+
- **`useBreakpoint(name, edge?, options?)`** on the root barrel — SSR/hydration-safe media query
|
|
983
|
+
over `theme.breakpoints`, built on `useSyncExternalStore` (not `@mantine/hooks`' `useMediaQuery`,
|
|
984
|
+
which mismatches during hydration). `edge` is `'min'` (default, "at least this wide") or `'max'`.
|
|
985
|
+
`page-aside.tsx` now composes this hook's own internals instead of a private duplicate.
|
|
986
|
+
- **`--vx-space-touch-target` / `VX.spaceTouchTarget`** — the WCAG touch-target floor (44px),
|
|
987
|
+
density-exempt. The one `SPACE_FIXED` member that IS emitted as a CSS var (every other one stays
|
|
988
|
+
JS-only) — a consumer's own `@media (pointer: coarse)` CSS-module rule reads it directly.
|
|
989
|
+
- **`SettingsMenuItem.active?: boolean`** — renders a trailing check glyph and `aria-current` in
|
|
990
|
+
every projection (the sidebar's flat rows and gear menu, the mobile More sheet).
|
|
991
|
+
- **`basalt-ui/commands` gains imperative shell handles**: `setColorScheme(scheme)` and
|
|
992
|
+
`toggleSidebar()`, wired automatically — `BasaltProvider` registers the Mantine color-scheme
|
|
993
|
+
setter, `BasaltShell` registers the collapse toggle, so a command's `run` calls either with zero
|
|
994
|
+
`__root.tsx` bridge wiring (unlike the hand-rolled `color-scheme-bridge.ts`/`sidebar-bridge.ts`
|
|
995
|
+
shape this seeds from). `Slot<K, Constraint>` (`register.ts`) changed its internal resolution
|
|
996
|
+
from a whole-interface mapped-type match to an indexed-access form — same public behaviour,
|
|
997
|
+
fixes the commands↔overlays same-file type cycle a command calling `overlays.open(...)` used to
|
|
998
|
+
hit while `defineCommands`'s own type was still being inferred.
|
|
999
|
+
- **`BasaltDevDock`** on the root barrel — a fixed, dev-only bottom drawer hosting TanStack Router
|
|
1000
|
+
devtools, TanStack Query devtools and the theme lab, each peer lazy-loaded. New optional peer:
|
|
1001
|
+
`@tanstack/react-router-devtools`.
|
|
1002
|
+
- **`BasaltErrorBoundaryProps`** is now exported; `onError` is optional (defaults to the same
|
|
1003
|
+
console-warn-in-dev fallback `BasaltProvider`'s own top-level `onError` uses); an omitted
|
|
1004
|
+
`fallback` now renders a minimal built-in default (a `PageTitle` + reload button) instead of
|
|
1005
|
+
`null` — pass `fallback={null}` explicitly for the old swallow-it behaviour. **`PageTitle`** is a
|
|
1006
|
+
new shell-less page-title primitive on the root barrel (a plain `<h1>`, not Mantine's `<Title>`,
|
|
1007
|
+
so it needs no `in-body-page-title` waiver) — the remedy for the `in-body-page-title` waiver a
|
|
1008
|
+
shell-less error/auth page used to need.
|
|
1009
|
+
- **`unwrap` gains a second overload** — the original took only a `Promise` of the `{ data, error }`
|
|
1010
|
+
envelope; it now also accepts the ALREADY-RESOLVED envelope directly (`unwrap(await api.x.get())`,
|
|
1011
|
+
or as a bare `.then(unwrap)` callback), inferring which overload from whether the argument IS a
|
|
1012
|
+
`Promise`. The absence guard also now throws on `undefined` data, not just `null`.
|
|
1013
|
+
|
|
882
1014
|
## 1.26.0 — the control tier, the page bar and the store
|
|
883
1015
|
|
|
884
1016
|
**One export removed and two deprecated — see § Stores below; two shell PROPS removed — see
|
|
@@ -921,6 +1053,18 @@ Consumers who never overrode `basalt.severity` for any of the eight kinds/rules
|
|
|
921
1053
|
waived them see these findings for the first time as `error`; measure against the shipped preset
|
|
922
1054
|
before upgrading if that's a concern (`basalt-ui check-theme --audit-allows`, `oxlint .`).
|
|
923
1055
|
|
|
1056
|
+
- **`AgentTransport.stream`'s third param** (`basalt-ui/agent`) — `ctx?: { messageId: string }`;
|
|
1057
|
+
`aiSdkTransport` and `useAgentThreadRuns.start()`/`retry()` now share ONE id per turn instead of two.
|
|
1058
|
+
- **`useAgentThreadRuns({ onError })`** (`basalt-ui/agent`) — a genuine (non-abort) stream failure
|
|
1059
|
+
per thread, for a toast without wrapping the transport.
|
|
1060
|
+
- **`useAgentThreadRuns` re-sweeps when `store.hydrated` flips true** (`basalt-ui/agent`) —
|
|
1061
|
+
resume-after-reload now works for an async `createAdapterThreadsStore`; no API change.
|
|
1062
|
+
- **`ThreadFeedRow` gains `title`/`summary`/`headerLeft`/`headerRight`/`messages`/`classNames`**
|
|
1063
|
+
(`basalt-ui/agent-chat`) — header and transcript overrides plus slot classes for a server-titled row.
|
|
1064
|
+
- **`ThreadFeedRow.height` no longer requires `virtualize`** (`basalt-ui/agent-chat`) — a bounded,
|
|
1065
|
+
auto-scrolling body via `BasaltStickToBottom`.
|
|
1066
|
+
- **`ThreadFeed.anchor`** (`basalt-ui/agent-chat`) — `'end'` for a bottom-anchored chat feed.
|
|
1067
|
+
|
|
924
1068
|
### Composers — WidgetHeader-backed renames (docs/CONTROLS-SPEC.md §2.2)
|
|
925
1069
|
|
|
926
1070
|
`StatCard`, `ChartCard`, `Section` (new), `SettingsSection`/`DangerZone` and `BasaltDataTable` now
|
|
@@ -1259,7 +1403,7 @@ homes rather than shipped repo-wide. `basalt/shadow-basalt-export` gains a renam
|
|
|
1259
1403
|
→ `StatCard`), so a fork that RENAMED the export is visible too. It stays a permanent advisory
|
|
1260
1404
|
`warn`.
|
|
1261
1405
|
|
|
1262
|
-
**`profile: 'tokens-only'` now disables
|
|
1406
|
+
**`profile: 'tokens-only'` now disables 18 kinds** — Mantine-coupled kinds, count as of this write (drifts release to release; `TOKENS_ONLY_DISABLED_KINDS.size` in `src/guard/index.ts` is ground truth, this table isn't).
|
|
1263
1407
|
|
|
1264
1408
|
**`SURFACES` gains `pluginRules`** (`src/surfaces.ts`, internal — not a published subpath): every
|
|
1265
1409
|
doctrine surface names the oxlint rules that enforce it, every registered rule maps to exactly one
|
|
@@ -1944,7 +2088,7 @@ with the whole lint half off).
|
|
|
1944
2088
|
|
|
1945
2089
|
| Surface | Note |
|
|
1946
2090
|
| ---------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
1947
|
-
| `basalt.profile: 'tokens-only'` / `--tokens-only` | disables the
|
|
2091
|
+
| `basalt.profile: 'tokens-only'` / `--tokens-only` | disables the 18 kinds whose remedy is a Mantine component, prop or the React theme factory. `check-theme` requires it DECLARED; `doctor` infers it, because its profile only changes advice, never enforcement |
|
|
1948
2092
|
| `basalt.include: [...]` | scan a named file outside `roots` — and the only route to a `.json`, which is never blanket-scanned |
|
|
1949
2093
|
| `basalt.roots` + a `lint:basalt` script | written by `init` from the real layout; `init` on an existing app is a lint-debt event, not a no-op |
|
|
1950
2094
|
| `tokens:css --check`, `--selector-class <c>` (+ `--light-class`) | drift gate; the Tailwind `<html class="dark">` convention. There is no `scheme: { class }` API — the class form is CLI-only |
|
package/README.md
CHANGED
|
@@ -59,7 +59,7 @@ bunx basalt-ui init
|
|
|
59
59
|
That's the whole install — there is no plugin, no marketplace, and no second version to track.
|
|
60
60
|
`init` writes into the consumer repo:
|
|
61
61
|
|
|
62
|
-
- `.claude/rules/basalt-*.md` —
|
|
62
|
+
- `.claude/rules/basalt-*.md` — six Claude Code rules (`basalt-tokens`, `basalt-mantine`, `basalt-charts`, `basalt-state`, `basalt-controls`, `basalt-batteries`), each with a generated coverage header naming what enforces it
|
|
63
63
|
- `.claude/skills/basalt-{app,design,charts}/SKILL.md` — the three skills (`/basalt-app`, `/basalt-design`, `/basalt-charts`), same managed path as the rules
|
|
64
64
|
- A managed `<!-- basalt:begin/end -->` block in `CLAUDE.md` — stack facts, the DESIGN.md pointer, and the frontend-design restraint override
|
|
65
65
|
- A thin `DESIGN.md` seed — your app's deltas (series dictionary, identity, deviations)
|
|
@@ -172,8 +172,8 @@ const theme = createBasaltTheme(
|
|
|
172
172
|
keep the shipped default). Never hand-edit a palette hex to retune the identity.
|
|
173
173
|
|
|
174
174
|
`BasaltOverlays` (from `basalt-ui/commands`) is the composable overlay mount: it bundles
|
|
175
|
-
`ModalsProvider`, `Spotlight`, and `Notifications` into a single mount point
|
|
176
|
-
|
|
175
|
+
`ModalsProvider`, `Spotlight`, and `Notifications` into a single mount point — it is the one
|
|
176
|
+
notifications mount. `paletteOptions={{ groups: paletteGroups }}` emits your
|
|
177
177
|
app-specific series colors (see
|
|
178
178
|
[Consumer-series extensibility](#consumer-series-extensibility) below) alongside the framework
|
|
179
179
|
palette. Skip both — `BasaltOverlays` and `paletteGroups` — if you don't use those batteries yet.
|
|
@@ -245,7 +245,7 @@ scanned files, and `doctor`'s `guard-scan` check agrees with it. Each root's **p
|
|
|
245
245
|
contributes its `index.html` and its `public/` tree — the Vite layout `basaltViteConfig` assumes,
|
|
246
246
|
and where a raw `theme-color` or webmanifest `background_color` actually lives. `.json` is never
|
|
247
247
|
blanket-scanned; `include` names one explicitly and is the only route to it. `profile:
|
|
248
|
-
"tokens-only"` turns off the
|
|
248
|
+
"tokens-only"` turns off the 18 kinds whose remedy is a Mantine component or prop, and must be
|
|
249
249
|
declared (or `--tokens-only`) — it is deliberately never inferred from a missing `@mantine/core`,
|
|
250
250
|
which would silence half the guard on any repo keeping Mantine in a different workspace package.
|
|
251
251
|
Other keys (`exempt`, `severity`, `spacingSteps`, `forbiddenAccents`, …) are documented on the
|
|
@@ -610,9 +610,10 @@ bun add @mantine/notifications
|
|
|
610
610
|
```
|
|
611
611
|
|
|
612
612
|
```tsx
|
|
613
|
-
import {
|
|
613
|
+
import { notifySuccess, notifyError } from 'basalt-ui/notifications'
|
|
614
|
+
import { BasaltOverlays } from 'basalt-ui/commands'
|
|
614
615
|
|
|
615
|
-
// in main.tsx: <BasaltProvider><
|
|
616
|
+
// in main.tsx: <BasaltProvider><BasaltOverlays notifications><App /></BasaltOverlays></BasaltProvider>
|
|
616
617
|
notifySuccess('Saved')
|
|
617
618
|
notifyError('Upload failed', { title: 'Error' })
|
|
618
619
|
```
|
|
@@ -825,66 +826,11 @@ Current slots: `series` (read by `./charts` + `./tokens`), `commands` (read by `
|
|
|
825
826
|
|
|
826
827
|
## CLI
|
|
827
828
|
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
basalt-ui
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
basalt-ui check-theme # palette guard — fails on colors that bypass the central --vx-* system
|
|
834
|
-
basalt-ui doctor # integration health: basalt-resolves, guard-scan, oxlint-preset, lefthook-preset, manifest presence, node_modules-vs-manifest version, spacing-scale drift, and a cross-package `ai` major-version parity check (HARD failure — walks every workspace manifest, exemptable via `basalt.aiMajorSkewReason` — see above) + warn on an icon file basaltAppPlugin references and public/ does not have
|
|
835
|
-
basalt-ui doctor --tokens-only # force the Mantine-free profile (auto-detected otherwise; --framework forces the full set)
|
|
836
|
-
bunx basalt-ui tokens:css --out src/tokens.css # emit the --vx-* stylesheet as a file you own — `bunx` ONLY if basalt is not installed here
|
|
837
|
-
bunx basalt-ui fonts:css --out src/fonts.css # emit the shipped --basalt-font-* stacks — same exception
|
|
838
|
-
basalt-ui info --json # surface map as stable JSON (InfoOutput shape); bare `info` is the human-readable form
|
|
839
|
-
basalt-ui help # full usage; every subcommand also takes --help / -h
|
|
840
|
-
```
|
|
841
|
-
|
|
842
|
-
**Nothing fails open.** `--version` resolves before dispatch, so it can never run a command to
|
|
843
|
-
answer which CLI ran. Every subcommand validates its flags and exits 1 naming the first one it does
|
|
844
|
-
not accept — `doctor --json` used to run doctor and exit **0**, and `check-theme --audit-allow`
|
|
845
|
-
scanned and reported success. An unknown command says so above the usage block.
|
|
846
|
-
|
|
847
|
-
`doctor` reports **`SKIPPED`** as a third outcome beside pass/warn/fail and exits non-zero on it —
|
|
848
|
-
"All checks passed" is only printable when every check actually ran. **`check-theme`, `doctor` and
|
|
849
|
-
`sync` all resolve their project the same way**: `BASALT_CWD` wins, then the cwd itself, then the
|
|
850
|
-
workspace packages the root declares, then a two-level layout scan. Two candidates is reported as
|
|
851
|
-
ambiguous, never guessed. The scan is what a repo declaring **no `workspaces` field** needs — with
|
|
852
|
-
the install one level down and nothing declaring it, every command answered about the root and
|
|
853
|
-
found nothing there: `check-theme` printed "no off-palette colors" having scanned zero files, and
|
|
854
|
-
`doctor` inferred `tokens-only` for a full Mantine consumer. `tokens:css` and `fonts:css` both take
|
|
855
|
-
`--check` as a CI drift gate, comparing everything but the header's provenance line — so a
|
|
856
|
-
basalt-ui version bump alone never forces a no-op commit in a tokens-only consumer.
|
|
857
|
-
|
|
858
|
-
**Run the local bin, not `bunx`.** `bunx` does not re-resolve a package it has already cached, so a
|
|
859
|
-
`bunx basalt-ui …` run can execute a version you upgraded away from — which is how one consumer
|
|
860
|
-
filed a P0 against a 1.20.0 cache while pinned to 1.22.0. `init` and `sync` now render every seeded
|
|
861
|
-
script, CI step, hook and piece of doctor advice with the resolved `./node_modules/.bin/basalt-ui`
|
|
862
|
-
(`BASALT_BIN` overrides it, and `configs/lefthook.yml` keeps `bunx --no-install` as a deliberately
|
|
863
|
-
loud fallback). `basalt-ui --version` is the one-second check.
|
|
864
|
-
|
|
865
|
-
**Three commands are the sanctioned exception, and only when basalt is not installed in the repo:**
|
|
866
|
-
`init` (which predates the install by definition) and `tokens:css` / `fonts:css` (the framework-free
|
|
867
|
-
route, where there is nothing to install). In a repo that _does_ carry basalt — which includes every
|
|
868
|
-
tokens-only consumer that keeps it as a devDependency — run those through the local bin too.
|
|
869
|
-
|
|
870
|
-
`sync` strategy per file: unchanged since last write → overwrite; locally edited → skip (show diff);
|
|
871
|
-
missing → recreate. `--force` overwrites local edits. The summary counts `created` and `recreated`
|
|
872
|
-
apart: `recreated` means the ledger placed that file once and it went missing. On a
|
|
873
|
-
`"basalt": { "profile": "tokens-only" }` consumer there is no scaffold to reconcile, so `sync`
|
|
874
|
-
prints `n/a` and exits 0 — `sync --check` is wirable into a tokens-only repo's CI without a
|
|
875
|
-
special case. `sync` also heals a `DESIGN.md` opener that still names a version: the file is a
|
|
876
|
-
**seed**, written once and never reconciled, so any number stamped into it was stale by the next
|
|
877
|
-
release.
|
|
878
|
-
|
|
879
|
-
**`sync` refreshes an existing install; it does not create one.** It resolves its project exactly as
|
|
880
|
-
`check-theme` and `doctor` do, and since 1.22.0 **exits 1** when the resolved project has no
|
|
881
|
-
`.basalt/manifest.json`, naming the install it found above instead of scaffolding a second one
|
|
882
|
-
beside it. Run it at the package that holds the manifest, or point `BASALT_CWD` at that package.
|
|
883
|
-
Creating an install is `basalt-ui init`'s decision — and `doctor` now says the same sentence from
|
|
884
|
-
the same directory, where it used to prescribe `init` and so recommend the very scaffold that
|
|
885
|
-
refusal exists to prevent.
|
|
886
|
-
|
|
887
|
-
---
|
|
829
|
+
`basalt-ui help` prints full usage (every subcommand also takes `--help`/`-h`); `AGENTS.md` at the
|
|
830
|
+
install directory is the machine-readable companion. Run the **local bin, not `bunx`** —
|
|
831
|
+
`./node_modules/.bin/basalt-ui` or a `package.json` script; `bunx` can silently run a cached version
|
|
832
|
+
you've upgraded away from. The one sanctioned `bunx` invocation is `init`, because nothing is
|
|
833
|
+
installed yet.
|
|
888
834
|
|
|
889
835
|
## Toolchain
|
|
890
836
|
|
|
@@ -901,6 +847,17 @@ The `./configs/*` export gives consumer apps raw presets to `extends` or copy vi
|
|
|
901
847
|
{ "extends": ["./node_modules/basalt-ui/configs/oxlint.json"] }
|
|
902
848
|
```
|
|
903
849
|
|
|
850
|
+
`tsconfig.json` `extends` resolves the SAME way, through package exports (`bundler`
|
|
851
|
+
`moduleResolution`, CI-verified by `scripts/pack-test.sh`) — three raw presets, `base` (the shared
|
|
852
|
+
strict flags), `react-app` (`base` + DOM/JSX libs) and `node` (`base` + Node types):
|
|
853
|
+
|
|
854
|
+
```json
|
|
855
|
+
{ "extends": "basalt-ui/configs/tsconfig.react-app.json" }
|
|
856
|
+
```
|
|
857
|
+
|
|
858
|
+
`.oxfmtrc.json` has no `extends` of its own — copy `configs/oxfmt.json` verbatim (`basalt-ui init`
|
|
859
|
+
does this for you).
|
|
860
|
+
|
|
904
861
|
---
|
|
905
862
|
|
|
906
863
|
## `basalt-ui sync` in CI
|