basalt-ui 1.40.3 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +50 -45
- package/CHANGELOG.md +543 -513
- package/MIGRATING.md +969 -37
- package/README.md +172 -367
- package/agent/rules/basalt-batteries.md +19 -74
- package/agent/rules/basalt-charts.md +21 -95
- package/agent/rules/basalt-controls.md +23 -131
- package/agent/rules/basalt-mantine.md +26 -99
- package/agent/rules/basalt-state.md +21 -103
- package/agent/rules/basalt-tokens.md +33 -114
- package/agent/skills/basalt-app/SKILL.md +229 -72
- package/agent/skills/basalt-charts/SKILL.md +23 -57
- package/agent/skills/basalt-design/SKILL.md +12 -70
- package/agent/templates/AGENTS-block.md.tpl +30 -0
- package/agent/templates/DESIGN.md.tpl +2 -2
- package/agent/templates/__root.tpl +9 -16
- package/agent/templates/main.tpl +21 -0
- package/agent/templates/nav.tpl +18 -0
- package/configs/check.yml +1 -1
- package/configs/oxlint-basalt.json +4 -10
- package/configs/oxlint-plugin.js +468 -847
- package/configs/oxlint-plugin.test.ts +662 -710
- package/configs/oxlint.json +10 -2
- package/dist/agent/ai-sdk-transport.d.ts +19 -7
- package/dist/agent/ai-sdk-transport.d.ts.map +1 -1
- package/dist/agent/ai-sdk-transport.js +10 -7
- package/dist/{agent-chat → agent/chat}/composer.d.ts +16 -16
- package/dist/agent/chat/composer.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/composer.js +10 -9
- package/dist/{agent-chat → agent/chat}/message-affordances.d.ts +7 -6
- package/dist/agent/chat/message-affordances.d.ts.map +1 -0
- package/dist/agent/chat/relative-time.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-feed-row.d.ts +18 -16
- package/dist/agent/chat/thread-feed-row.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-feed-row.js +12 -11
- package/dist/{agent-chat → agent/chat}/thread-feed.d.ts +8 -8
- package/dist/agent/chat/thread-feed.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-feed.js +12 -10
- package/dist/{agent-chat → agent/chat}/thread-message.d.ts +12 -9
- package/dist/agent/chat/thread-message.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-message.js +15 -13
- package/dist/{agent-chat → agent/chat}/thread-outcome-card.d.ts +2 -2
- package/dist/agent/chat/thread-outcome-card.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-outcome-card.js +3 -3
- package/dist/{agent-chat → agent/chat}/tool-chip.d.ts +5 -5
- package/dist/agent/chat/tool-chip.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/tool-chip.js +4 -4
- package/dist/agent/chat/use-keyboard-inset.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/use-keyboard-inset.js +1 -1
- package/dist/{agent-chat → agent/chat}/virtualize.d.ts +7 -7
- package/dist/agent/chat/virtualize.d.ts.map +1 -0
- package/dist/agent/error.d.ts +31 -0
- package/dist/agent/error.d.ts.map +1 -0
- package/dist/agent/error.js +18 -0
- package/dist/agent/foreign.d.ts +3 -2
- package/dist/agent/foreign.d.ts.map +1 -1
- package/dist/agent/history.d.ts +2 -36
- package/dist/agent/history.d.ts.map +1 -1
- package/dist/agent/history.js +0 -32
- package/dist/agent/id.d.ts +4 -5
- package/dist/agent/id.d.ts.map +1 -1
- package/dist/agent/index.d.ts +19 -52
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +10 -32
- package/dist/agent/outcome.d.ts +3 -14
- package/dist/agent/outcome.d.ts.map +1 -1
- package/dist/agent/outcome.js +0 -30
- package/dist/agent/part-list.d.ts +3 -3
- package/dist/agent/part-list.d.ts.map +1 -1
- package/dist/agent/parts.d.ts +23 -24
- package/dist/agent/parts.d.ts.map +1 -1
- package/dist/agent/run-committer.d.ts +23 -0
- package/dist/agent/run-committer.d.ts.map +1 -0
- package/dist/agent/run-committer.js +41 -0
- package/dist/agent/run-records.d.ts +77 -0
- package/dist/agent/run-records.d.ts.map +1 -0
- package/dist/agent/run-records.js +69 -0
- package/dist/agent/thread.d.ts +23 -47
- package/dist/agent/thread.d.ts.map +1 -1
- package/dist/agent/thread.js +3 -134
- package/dist/agent/transport.d.ts +6 -69
- package/dist/agent/transport.d.ts.map +1 -1
- package/dist/agent/transport.js +0 -18
- package/dist/agent/use-agent-thread-runs.d.ts +63 -26
- package/dist/agent/use-agent-thread-runs.d.ts.map +1 -1
- package/dist/agent/use-agent-thread-runs.js +202 -66
- package/dist/charts/BandStrip.d.ts +46 -0
- package/dist/charts/BandStrip.d.ts.map +1 -0
- package/dist/charts/BandStrip.js +151 -0
- package/dist/charts/Bars.d.ts +19 -0
- package/dist/charts/Bars.d.ts.map +1 -0
- package/dist/charts/Bars.js +77 -0
- package/dist/charts/CartesianChart.d.ts +57 -0
- package/dist/charts/CartesianChart.d.ts.map +1 -0
- package/dist/charts/CartesianChart.js +121 -0
- package/dist/charts/ChartCard.d.ts +34 -0
- package/dist/charts/ChartCard.d.ts.map +1 -0
- package/dist/charts/ChartCard.js +115 -0
- package/dist/charts/Donut.d.ts +25 -0
- package/dist/charts/Donut.d.ts.map +1 -0
- package/dist/charts/Donut.js +191 -0
- package/dist/charts/DualPanel.d.ts +47 -0
- package/dist/charts/DualPanel.d.ts.map +1 -0
- package/dist/charts/DualPanel.js +214 -0
- package/dist/charts/Heatmap.d.ts +41 -0
- package/dist/charts/Heatmap.d.ts.map +1 -0
- package/dist/charts/Heatmap.js +216 -0
- package/dist/charts/Lines.d.ts +11 -0
- package/dist/charts/Lines.d.ts.map +1 -0
- package/dist/charts/Lines.js +114 -0
- package/dist/charts/MirroredBars.d.ts +44 -0
- package/dist/charts/MirroredBars.d.ts.map +1 -0
- package/dist/charts/MirroredBars.js +190 -0
- package/dist/charts/Sparkline.d.ts +22 -0
- package/dist/charts/Sparkline.d.ts.map +1 -0
- package/dist/charts/Sparkline.js +129 -0
- package/dist/charts/StackedArea.d.ts +15 -0
- package/dist/charts/StackedArea.d.ts.map +1 -0
- package/dist/charts/StackedArea.js +46 -0
- package/dist/charts/box.d.ts +38 -0
- package/dist/charts/box.d.ts.map +1 -0
- package/dist/charts/box.js +72 -0
- package/dist/charts/card-context.d.ts +3 -0
- package/dist/charts/card-context.d.ts.map +1 -0
- package/dist/charts/card-context.js +7 -0
- package/dist/charts/chart-box.module.css +64 -0
- package/{src/content/article-card.module.css.d.ts → dist/charts/chart-box.module.css.d.ts} +5 -9
- package/dist/charts/chart-card.module.css +25 -0
- package/dist/{dashboard/widget-grid.module.css.d.ts → charts/chart-card.module.css.d.ts} +1 -3
- package/dist/charts/chart-legend.module.css +38 -0
- package/{src/dashboard/widget-grid.module.css.d.ts → dist/charts/chart-legend.module.css.d.ts} +3 -3
- package/dist/charts/compile.d.ts +62 -0
- package/dist/charts/compile.d.ts.map +1 -0
- package/dist/charts/compile.js +386 -0
- package/dist/charts/cursor.d.ts +50 -0
- package/dist/charts/cursor.d.ts.map +1 -0
- package/dist/charts/cursor.js +157 -0
- package/dist/charts/curves.d.ts +12 -0
- package/dist/charts/curves.d.ts.map +1 -0
- package/dist/charts/curves.js +86 -0
- package/dist/charts/donut.module.css +54 -0
- package/dist/{content/article-card.module.css.d.ts → charts/donut.module.css.d.ts} +2 -9
- package/dist/charts/host.d.ts +17 -0
- package/dist/charts/host.d.ts.map +1 -0
- package/dist/charts/host.js +35 -0
- package/dist/charts/index.d.ts +18 -53
- package/dist/charts/index.d.ts.map +1 -1
- package/dist/charts/index.js +17 -189
- package/dist/charts/legend.d.ts +23 -0
- package/dist/charts/legend.d.ts.map +1 -0
- package/dist/charts/legend.js +160 -0
- package/dist/charts/marks.d.ts +25 -0
- package/dist/charts/marks.d.ts.map +1 -0
- package/dist/charts/marks.js +128 -0
- package/dist/charts/panel.d.ts +56 -0
- package/dist/charts/panel.d.ts.map +1 -0
- package/dist/charts/panel.js +123 -0
- package/dist/charts/scales.d.ts +44 -0
- package/dist/charts/scales.d.ts.map +1 -0
- package/dist/charts/scales.js +163 -0
- package/dist/charts/sizing.d.ts +12 -0
- package/dist/charts/sizing.d.ts.map +1 -0
- package/dist/charts/sizing.js +33 -0
- package/dist/charts/state.d.ts +17 -0
- package/dist/charts/state.d.ts.map +1 -0
- package/dist/charts/state.js +53 -0
- package/dist/charts/theme.d.ts +38 -19
- package/dist/charts/theme.d.ts.map +1 -1
- package/dist/charts/theme.js +48 -26
- package/dist/charts/types.d.ts +227 -0
- package/dist/charts/types.d.ts.map +1 -0
- package/dist/charts/types.js +4 -0
- package/dist/cli/audit-allows.d.ts +4 -17
- package/dist/cli/audit-allows.d.ts.map +1 -1
- package/dist/cli/config.d.ts +14 -43
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/doctor-upgrade.d.ts +31 -0
- package/dist/cli/doctor-upgrade.d.ts.map +1 -0
- package/dist/cli/doctor-upgrade.js +269 -0
- package/dist/cli/doctor.d.ts +13 -26
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +79 -8
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +2 -4
- package/dist/cli/index.d.ts +68 -135
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +89 -76
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +43 -27
- package/dist/cli/sync.d.ts +5 -21
- package/dist/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js +4 -6
- package/dist/cli/tokens-css.d.ts +7 -28
- package/dist/cli/tokens-css.d.ts.map +1 -1
- package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
- package/dist/commands/ShortcutsHelp.js +4 -5
- package/dist/commands/define-commands.d.ts +15 -31
- package/dist/commands/define-commands.d.ts.map +1 -1
- package/dist/commands/define-commands.js +1 -11
- package/dist/commands/define-overlays.d.ts +5 -19
- package/dist/commands/define-overlays.d.ts.map +1 -1
- package/dist/commands/define-overlays.js +3 -11
- package/dist/commands/index.d.ts +10 -40
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +9 -46
- package/dist/{notifications → commands/notifications}/bell.d.ts +1 -1
- package/dist/commands/notifications/bell.d.ts.map +1 -0
- package/dist/{notifications → commands/notifications}/center.d.ts +2 -2
- package/dist/commands/notifications/center.d.ts.map +1 -0
- package/dist/{notifications → commands/notifications}/center.js +2 -2
- package/dist/{notifications → commands/notifications}/define-notifications.d.ts +3 -3
- package/dist/commands/notifications/define-notifications.d.ts.map +1 -0
- package/dist/commands/notifications/notify.d.ts +44 -0
- package/dist/commands/notifications/notify.d.ts.map +1 -0
- package/dist/commands/notifications/notify.js +79 -0
- package/dist/{notifications → commands/notifications}/store.d.ts +2 -0
- package/dist/commands/notifications/store.d.ts.map +1 -0
- package/dist/{notifications → commands/notifications}/store.js +4 -0
- package/dist/commands/projectors.d.ts +1 -131
- package/dist/commands/projectors.d.ts.map +1 -1
- package/dist/commands/projectors.js +2 -73
- package/dist/commands/shell-bridge.d.ts +3 -3
- package/dist/commands/shortcut-format.d.ts +5 -4
- package/dist/commands/shortcut-format.d.ts.map +1 -1
- package/dist/common/errors.d.ts +3 -3
- package/dist/common/use-measured-widths.d.ts.map +1 -1
- package/dist/common/use-measured-widths.js +5 -3
- package/dist/common/validate.d.ts +2 -2
- package/dist/content/article-layout.d.ts.map +1 -1
- package/dist/content/article-layout.js +3 -3
- package/dist/content/article-model.d.ts +1 -46
- package/dist/content/article-model.d.ts.map +1 -1
- package/dist/content/article-model.js +1 -29
- package/dist/content/copy-action.d.ts +1 -1
- package/dist/content/glyphs.d.ts +1 -1
- package/dist/content/index.d.ts +11 -41
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +3 -35
- package/dist/content/markdown.d.ts +1 -1
- package/dist/content/markdown.d.ts.map +1 -1
- package/dist/content/markdown.js +1 -1
- package/dist/content/mermaid.d.ts.map +1 -1
- package/dist/content/mermaid.js +7 -7
- package/dist/content/slug.d.ts +1 -8
- package/dist/content/slug.d.ts.map +1 -1
- package/dist/content/slug.js +1 -8
- package/dist/content/url-hardening.d.ts +2 -2
- package/dist/content/url-hardening.d.ts.map +1 -1
- package/dist/content/url-hardening.js +2 -0
- package/dist/controls/actions.d.ts +16 -1
- package/dist/controls/actions.d.ts.map +1 -1
- package/dist/controls/enum-filter.d.ts +1 -1
- package/dist/controls/enum-filter.d.ts.map +1 -1
- package/dist/controls/filter-context.d.ts.map +1 -1
- package/dist/controls/filter-context.js +3 -1
- package/dist/controls/filter-set.js +4 -6
- package/dist/controls/form-layout.d.ts +1 -1
- package/dist/controls/form-layout.d.ts.map +1 -1
- package/dist/controls/form-layout.js +1 -1
- package/dist/controls/glyphs.d.ts +0 -2
- package/dist/controls/glyphs.d.ts.map +1 -1
- package/dist/controls/glyphs.js +0 -7
- package/dist/controls/index.d.ts +12 -17
- package/dist/controls/index.d.ts.map +1 -1
- package/dist/controls/index.js +5 -39
- package/dist/controls/multi-select-filter.d.ts +4 -3
- package/dist/controls/multi-select-filter.d.ts.map +1 -1
- package/dist/controls/number-filter.d.ts +4 -3
- package/dist/controls/number-filter.d.ts.map +1 -1
- package/dist/controls/number-filter.js +3 -1
- package/dist/controls/range-filter.d.ts +4 -3
- package/dist/controls/range-filter.d.ts.map +1 -1
- package/dist/controls/search-filter.d.ts +4 -3
- package/dist/controls/search-filter.d.ts.map +1 -1
- package/dist/controls/search-filter.js +19 -14
- package/dist/controls/select-filter.d.ts +4 -3
- package/dist/controls/select-filter.d.ts.map +1 -1
- package/dist/controls/sync-button.d.ts.map +1 -1
- package/dist/controls/sync-button.js +12 -15
- package/dist/controls/toggle-filter.d.ts +4 -3
- package/dist/controls/toggle-filter.d.ts.map +1 -1
- package/dist/controls/uncontrolled.d.ts +12 -0
- package/dist/controls/uncontrolled.d.ts.map +1 -0
- package/dist/controls/view-tabs.d.ts +2 -2
- package/dist/controls/view-tabs.d.ts.map +1 -1
- package/dist/controls-dates/index.d.ts +0 -1
- package/dist/controls-dates/index.d.ts.map +1 -1
- package/dist/dashboard/index.d.ts +7 -9
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/index.js +3 -23
- package/dist/dashboard/section.d.ts +4 -6
- package/dist/dashboard/section.d.ts.map +1 -1
- package/dist/dashboard/section.js +4 -10
- package/dist/dashboard/stat-card.d.ts +4 -4
- package/dist/dashboard/stat-card.d.ts.map +1 -1
- package/dist/dashboard/stat-card.js +3 -3
- package/dist/dashboard/widget-header.module.css +9 -7
- package/dist/dev-dock.d.ts.map +1 -1
- package/dist/dev-dock.js +6 -1
- package/dist/format/date.d.ts +0 -34
- package/dist/format/date.d.ts.map +1 -1
- package/dist/format/date.js +0 -54
- package/dist/format/index.d.ts +7 -22
- package/dist/format/index.d.ts.map +1 -1
- package/dist/format/index.js +2 -43
- package/dist/format/number.d.ts +3 -14
- package/dist/format/number.d.ts.map +1 -1
- package/dist/format/number.js +0 -13
- package/dist/format/shared.d.ts +2 -3
- package/dist/format/shared.d.ts.map +1 -1
- package/dist/forms/index.d.ts +0 -11
- package/dist/forms/index.d.ts.map +1 -1
- package/dist/forms/index.js +1 -14
- package/dist/guard/index.d.ts +6 -21
- package/dist/guard/index.d.ts.map +1 -1
- package/dist/guard/index.js +27 -115
- package/dist/guard/types.d.ts +7 -18
- package/dist/guard/types.d.ts.map +1 -1
- package/dist/index.d.ts +16 -48
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -117
- package/dist/provider/create-router.d.ts +44 -0
- package/dist/provider/create-router.d.ts.map +1 -0
- package/dist/provider/create-router.js +62 -0
- package/dist/provider/hotkeys.d.ts +8 -0
- package/dist/provider/hotkeys.d.ts.map +1 -0
- package/dist/provider/hotkeys.js +50 -0
- package/dist/provider/index.d.ts +33 -110
- package/dist/provider/index.d.ts.map +1 -1
- package/dist/provider/index.js +182 -82
- package/dist/provider/lab-theme.d.ts.map +1 -1
- package/dist/provider/route-transition.d.ts +76 -0
- package/dist/provider/route-transition.d.ts.map +1 -0
- package/dist/provider/route-transition.js +98 -0
- package/dist/provider/spotlight-actions.d.ts +10 -0
- package/dist/provider/spotlight-actions.d.ts.map +1 -0
- package/dist/provider/spotlight-actions.js +55 -0
- package/dist/provider/test-router.d.ts +6 -0
- package/dist/provider/test-router.d.ts.map +1 -0
- package/dist/provider/test-router.js +18 -0
- package/dist/query-client.d.ts +4 -20
- package/dist/query-client.d.ts.map +1 -1
- package/dist/query-client.js +2 -2
- package/dist/router-tanstack/index.d.ts +18 -64
- package/dist/router-tanstack/index.d.ts.map +1 -1
- package/dist/router-tanstack/index.js +2 -16
- package/dist/router-tanstack/nav.d.ts +12 -1
- package/dist/router-tanstack/nav.d.ts.map +1 -1
- package/dist/router-tanstack/nav.js +8 -1
- package/dist/router-tanstack/search-store.d.ts +1 -1
- package/dist/router-tanstack/search-store.d.ts.map +1 -1
- package/dist/router-tanstack/use-nav.d.ts +8 -9
- package/dist/router-tanstack/use-nav.d.ts.map +1 -1
- package/dist/router-tanstack/use-nav.js +20 -1
- package/dist/shell/app-mobile-nav.d.ts.map +1 -1
- package/dist/shell/app-sidebar.js +1 -1
- package/dist/shell/index.d.ts +31 -10
- package/dist/shell/index.d.ts.map +1 -1
- package/dist/shell/index.js +14 -3
- package/dist/shell/page-aside.d.ts +2 -2
- package/dist/shell/page-aside.d.ts.map +1 -1
- package/dist/shell/page-aside.js +31 -12
- package/dist/shell/page-bar.d.ts +2 -2
- package/dist/shell/page-bar.d.ts.map +1 -1
- package/dist/shell/page-bar.js +1 -1
- package/dist/state.d.ts +10 -12
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +4 -6
- package/dist/styles.css +107 -7
- package/dist/surfaces.d.ts +28 -103
- package/dist/surfaces.d.ts.map +1 -1
- package/dist/surfaces.js +54 -143
- package/dist/{data → table}/data-table-state.d.ts +1 -1
- package/dist/table/data-table-state.d.ts.map +1 -0
- package/dist/{data → table}/data-table-state.js +4 -3
- package/dist/{data → table}/data-table.d.ts +28 -49
- package/dist/table/data-table.d.ts.map +1 -0
- package/dist/{data → table}/data-table.js +74 -60
- package/dist/table/index.d.ts +18 -0
- package/dist/table/index.d.ts.map +1 -0
- package/dist/{data/table.js → table/index.js} +1 -1
- package/dist/table/query-branch.d.ts.map +1 -0
- package/dist/table/table-features.d.ts +69 -0
- package/dist/table/table-features.d.ts.map +1 -0
- package/dist/table/table-features.js +49 -0
- package/dist/telemetry.d.ts +77 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +33 -0
- package/dist/theme/index.d.ts +10 -21
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +3 -14
- package/dist/theme/theme-toggle.d.ts.map +1 -1
- package/dist/theme/theme-toggle.js +7 -33
- package/dist/theme/theme-toggle.module.css +30 -0
- package/dist/theme/theme-toggle.module.css.d.ts +10 -0
- package/dist/theme-lab/derive-controls.d.ts.map +1 -1
- package/dist/theme-lab/derive-controls.js +5 -3
- package/dist/theme-lab/derive-state.d.ts.map +1 -1
- package/dist/theme-lab/derive-state.js +2 -1
- package/dist/tokens/core.d.ts +360 -0
- package/dist/tokens/core.d.ts.map +1 -0
- package/dist/tokens/core.js +708 -0
- package/dist/tokens/derive.d.ts +1 -1
- package/dist/tokens/derive.d.ts.map +1 -1
- package/dist/tokens/index.d.ts +5 -373
- package/dist/tokens/index.d.ts.map +1 -1
- package/dist/tokens/index.js +8 -700
- package/dist/tokens/palette.d.ts +2 -6
- package/dist/tokens/palette.d.ts.map +1 -1
- package/dist/tokens/palette.js +1 -4
- package/dist/vite.d.ts +4 -3
- package/dist/vite.d.ts.map +1 -1
- package/llms.txt +43 -85
- package/package.json +77 -170
- package/src/agent/ai-sdk-transport.ts +57 -37
- package/src/{agent-chat → agent/chat}/composer.tsx +29 -30
- package/src/{agent-chat → agent/chat}/message-affordances.ts +8 -5
- package/src/{agent-chat → agent/chat}/thread-feed-row.tsx +30 -35
- package/src/{agent-chat → agent/chat}/thread-feed.tsx +40 -35
- package/src/{agent-chat → agent/chat}/thread-message.tsx +37 -35
- package/src/{agent-chat → agent/chat}/thread-outcome-card.tsx +5 -5
- package/src/{agent-chat → agent/chat}/tool-chip.tsx +12 -12
- package/src/{agent-chat → agent/chat}/use-keyboard-inset.ts +1 -1
- package/src/{agent-chat → agent/chat}/virtualize.ts +5 -5
- package/src/agent/error.ts +43 -0
- package/src/agent/foreign.ts +3 -2
- package/src/agent/history.ts +2 -107
- package/src/agent/id.ts +4 -5
- package/src/agent/index.ts +23 -112
- package/src/agent/outcome.ts +3 -56
- package/src/agent/part-list.tsx +3 -3
- package/src/agent/parts.ts +23 -22
- package/src/agent/run-committer.ts +64 -0
- package/src/agent/run-records.ts +147 -0
- package/src/agent/thread.ts +24 -231
- package/src/agent/transport.ts +6 -96
- package/src/agent/use-agent-thread-runs.ts +364 -199
- package/src/charts/BandStrip.tsx +276 -0
- package/src/charts/Bars.tsx +141 -0
- package/src/charts/CartesianChart.tsx +206 -0
- package/src/charts/ChartCard.tsx +178 -0
- package/src/charts/Donut.tsx +256 -0
- package/src/charts/DualPanel.tsx +326 -0
- package/src/charts/Heatmap.tsx +282 -0
- package/src/charts/Lines.tsx +151 -0
- package/src/charts/MirroredBars.tsx +303 -0
- package/src/charts/Sparkline.tsx +176 -0
- package/src/charts/StackedArea.tsx +80 -0
- package/src/charts/box.tsx +96 -0
- package/src/charts/card-context.ts +11 -0
- package/src/charts/chart-box.module.css +64 -0
- package/src/charts/chart-box.module.css.d.ts +12 -0
- package/src/charts/chart-card.module.css +25 -0
- package/src/charts/chart-card.module.css.d.ts +8 -0
- package/src/charts/chart-legend.module.css +38 -0
- package/src/charts/chart-legend.module.css.d.ts +10 -0
- package/src/charts/compile.ts +585 -0
- package/src/charts/cursor.ts +282 -0
- package/src/charts/curves.ts +111 -0
- package/src/charts/donut.module.css +54 -0
- package/src/charts/donut.module.css.d.ts +9 -0
- package/src/charts/host.tsx +60 -0
- package/src/charts/index.ts +41 -178
- package/src/charts/legend.tsx +204 -0
- package/src/charts/marks.ts +201 -0
- package/src/charts/panel.tsx +227 -0
- package/src/charts/scales.ts +237 -0
- package/src/charts/sizing.ts +47 -0
- package/src/charts/state.tsx +80 -0
- package/src/charts/theme.ts +65 -0
- package/src/charts/types.ts +242 -0
- package/src/cli/audit-allows.ts +8 -30
- package/src/cli/config.ts +14 -43
- package/src/cli/doctor-upgrade.ts +392 -0
- package/src/cli/doctor.ts +120 -68
- package/src/cli/help.ts +2 -4
- package/src/cli/index.ts +161 -276
- package/src/cli/init.ts +60 -37
- package/src/cli/sync.ts +13 -45
- package/src/cli/tokens-css.ts +7 -28
- package/src/commands/ShortcutsHelp.tsx +8 -9
- package/src/commands/define-commands.ts +16 -43
- package/src/commands/define-overlays.ts +12 -36
- package/src/commands/index.ts +11 -94
- package/src/{notifications → commands/notifications}/bell.tsx +2 -2
- package/src/{notifications → commands/notifications}/center.tsx +7 -5
- package/src/{notifications → commands/notifications}/define-notifications.ts +3 -3
- package/src/commands/notifications/notify.tsx +158 -0
- package/src/{notifications → commands/notifications}/store.ts +10 -2
- package/src/commands/projectors.ts +5 -225
- package/src/commands/shell-bridge.ts +5 -5
- package/src/commands/shortcut-format.ts +5 -4
- package/src/common/errors.ts +3 -3
- package/src/common/use-measured-widths.ts +6 -3
- package/src/common/validate.ts +2 -2
- package/src/content/article-layout.tsx +37 -38
- package/src/content/article-model.ts +1 -84
- package/src/content/copy-action.tsx +1 -1
- package/src/content/glyphs.tsx +1 -1
- package/src/content/index.ts +12 -83
- package/src/content/markdown.tsx +4 -3
- package/src/content/mermaid.tsx +9 -7
- package/src/content/slug.ts +1 -16
- package/src/content/url-hardening.ts +8 -2
- package/src/controls/actions.tsx +24 -1
- package/src/controls/enum-filter.tsx +1 -1
- package/src/controls/filter-context.tsx +3 -1
- package/src/controls/filter-set.tsx +5 -7
- package/src/controls/form-layout.tsx +2 -2
- package/src/controls/glyphs.tsx +0 -10
- package/src/controls/index.ts +13 -64
- package/src/controls/multi-select-filter.tsx +5 -4
- package/src/controls/number-filter.tsx +8 -4
- package/src/controls/range-filter.tsx +5 -4
- package/src/controls/search-filter.tsx +25 -19
- package/src/controls/select-filter.tsx +5 -4
- package/src/controls/sync-button.tsx +18 -20
- package/src/controls/toggle-filter.tsx +5 -4
- package/src/controls/uncontrolled.ts +12 -0
- package/src/controls/view-tabs.tsx +3 -3
- package/src/controls-dates/date-range-picker.tsx +1 -1
- package/src/controls-dates/index.ts +0 -1
- package/src/dashboard/index.ts +7 -48
- package/src/dashboard/section.tsx +11 -40
- package/src/dashboard/stat-card.tsx +14 -16
- package/src/dashboard/widget-header.module.css +9 -7
- package/src/dev-dock.tsx +14 -27
- package/src/format/date.ts +2 -92
- package/src/format/index.ts +7 -53
- package/src/format/number.ts +3 -26
- package/src/format/shared.ts +2 -3
- package/src/forms/index.ts +0 -23
- package/src/guard/index.ts +37 -192
- package/src/guard/types.ts +6 -19
- package/src/index.ts +30 -282
- package/src/provider/create-router.tsx +138 -0
- package/src/provider/hotkeys.ts +70 -0
- package/src/provider/index.tsx +260 -230
- package/src/provider/lab-theme.ts +3 -2
- package/src/provider/route-transition.ts +199 -0
- package/src/provider/spotlight-actions.tsx +69 -0
- package/src/provider/test-router.tsx +25 -0
- package/src/query-client.ts +4 -22
- package/src/router-tanstack/index.ts +18 -112
- package/src/router-tanstack/nav.ts +28 -2
- package/src/router-tanstack/search-store.ts +9 -2
- package/src/router-tanstack/use-nav.ts +47 -13
- package/src/shell/app-mobile-nav.tsx +3 -2
- package/src/shell/app-sidebar.tsx +1 -1
- package/src/shell/aside-docking.ts +1 -1
- package/src/shell/index.tsx +61 -20
- package/src/shell/page-aside.tsx +47 -23
- package/src/shell/page-bar.tsx +3 -3
- package/src/shell/page-title.tsx +1 -1
- package/src/state.ts +11 -37
- package/src/styles.css +107 -7
- package/src/surfaces.ts +56 -151
- package/src/{data → table}/data-table-state.ts +5 -4
- package/src/{data → table}/data-table.tsx +170 -161
- package/src/table/index.ts +18 -0
- package/src/table/table-features.ts +102 -0
- package/src/telemetry.ts +110 -0
- package/src/theme/index.ts +22 -47
- package/src/theme/theme-toggle.module.css +30 -0
- package/src/theme/theme-toggle.module.css.d.ts +10 -0
- package/src/theme/theme-toggle.tsx +15 -43
- package/src/theme-lab/derive-controls.tsx +5 -3
- package/src/theme-lab/derive-state.ts +2 -1
- package/src/tokens/core.ts +1163 -0
- package/src/tokens/derive.ts +1 -1
- package/src/tokens/index.ts +14 -1181
- package/src/tokens/palette.ts +3 -7
- package/src/vite.ts +3 -3
- package/agent/templates/CLAUDE-block.md.tpl +0 -40
- package/agent/templates/query-client.ts.tpl +0 -26
- package/dist/agent/adapter.d.ts +0 -150
- package/dist/agent/adapter.d.ts.map +0 -1
- package/dist/agent/adapter.js +0 -482
- package/dist/agent/use-agent-stream.d.ts +0 -35
- package/dist/agent/use-agent-stream.d.ts.map +0 -1
- package/dist/agent/use-agent-stream.js +0 -59
- package/dist/agent-chat/composer.d.ts.map +0 -1
- package/dist/agent-chat/index.d.ts +0 -31
- package/dist/agent-chat/index.d.ts.map +0 -1
- package/dist/agent-chat/index.js +0 -19
- package/dist/agent-chat/message-affordances.d.ts.map +0 -1
- package/dist/agent-chat/relative-time.d.ts.map +0 -1
- package/dist/agent-chat/thread-detail-panel.d.ts +0 -28
- package/dist/agent-chat/thread-detail-panel.d.ts.map +0 -1
- package/dist/agent-chat/thread-detail-panel.js +0 -115
- package/dist/agent-chat/thread-feed-row.d.ts.map +0 -1
- package/dist/agent-chat/thread-feed.d.ts.map +0 -1
- package/dist/agent-chat/thread-message.d.ts.map +0 -1
- package/dist/agent-chat/thread-outcome-card.d.ts.map +0 -1
- package/dist/agent-chat/thread-workspace.d.ts +0 -44
- package/dist/agent-chat/thread-workspace.d.ts.map +0 -1
- package/dist/agent-chat/thread-workspace.js +0 -153
- package/dist/agent-chat/tool-chip.d.ts.map +0 -1
- package/dist/agent-chat/use-keyboard-inset.d.ts.map +0 -1
- package/dist/agent-chat/virtualize.d.ts.map +0 -1
- package/dist/charts/cursor/resolve.d.ts +0 -75
- package/dist/charts/cursor/resolve.d.ts.map +0 -1
- package/dist/charts/cursor/resolve.js +0 -91
- package/dist/charts/cursor/scope.d.ts +0 -20
- package/dist/charts/cursor/scope.d.ts.map +0 -1
- package/dist/charts/cursor/scope.js +0 -20
- package/dist/charts/cursor/store.d.ts +0 -35
- package/dist/charts/cursor/store.d.ts.map +0 -1
- package/dist/charts/cursor/store.js +0 -25
- package/dist/charts/cursor/touch-pin.d.ts +0 -45
- package/dist/charts/cursor/touch-pin.d.ts.map +0 -1
- package/dist/charts/cursor/touch-pin.js +0 -79
- package/dist/charts/hooks/use-discrete-cursor.d.ts +0 -66
- package/dist/charts/hooks/use-discrete-cursor.d.ts.map +0 -1
- package/dist/charts/hooks/use-discrete-cursor.js +0 -198
- package/dist/charts/hooks/use-hysteresis.d.ts +0 -18
- package/dist/charts/hooks/use-hysteresis.d.ts.map +0 -1
- package/dist/charts/hooks/use-hysteresis.js +0 -12
- package/dist/charts/hooks/useBandPlot.d.ts +0 -145
- package/dist/charts/hooks/useBandPlot.d.ts.map +0 -1
- package/dist/charts/hooks/useBandPlot.js +0 -178
- package/dist/charts/hooks/useChartCursor.d.ts +0 -75
- package/dist/charts/hooks/useChartCursor.d.ts.map +0 -1
- package/dist/charts/hooks/useChartCursor.js +0 -200
- package/dist/charts/hooks/useChartSize.d.ts +0 -29
- package/dist/charts/hooks/useChartSize.d.ts.map +0 -1
- package/dist/charts/hooks/useChartSize.js +0 -8
- package/dist/charts/kinds/BandStrip.d.ts +0 -132
- package/dist/charts/kinds/BandStrip.d.ts.map +0 -1
- package/dist/charts/kinds/BandStrip.js +0 -241
- package/dist/charts/kinds/Bars.d.ts +0 -141
- package/dist/charts/kinds/Bars.d.ts.map +0 -1
- package/dist/charts/kinds/Bars.js +0 -343
- package/dist/charts/kinds/Donut.d.ts +0 -77
- package/dist/charts/kinds/Donut.d.ts.map +0 -1
- package/dist/charts/kinds/Donut.js +0 -245
- package/dist/charts/kinds/DualPanel.d.ts +0 -111
- package/dist/charts/kinds/DualPanel.d.ts.map +0 -1
- package/dist/charts/kinds/DualPanel.js +0 -471
- package/dist/charts/kinds/Heatmap.d.ts +0 -85
- package/dist/charts/kinds/Heatmap.d.ts.map +0 -1
- package/dist/charts/kinds/Heatmap.js +0 -243
- package/dist/charts/kinds/MirroredBars.d.ts +0 -98
- package/dist/charts/kinds/MirroredBars.d.ts.map +0 -1
- package/dist/charts/kinds/MirroredBars.js +0 -292
- package/dist/charts/kinds/MultiLine.d.ts +0 -87
- package/dist/charts/kinds/MultiLine.d.ts.map +0 -1
- package/dist/charts/kinds/MultiLine.js +0 -176
- package/dist/charts/kinds/StackedArea.d.ts +0 -73
- package/dist/charts/kinds/StackedArea.d.ts.map +0 -1
- package/dist/charts/kinds/StackedArea.js +0 -135
- package/dist/charts/kinds/ZonedLine.d.ts +0 -97
- package/dist/charts/kinds/ZonedLine.d.ts.map +0 -1
- package/dist/charts/kinds/ZonedLine.js +0 -155
- package/dist/charts/kinds/band-chrome.d.ts +0 -31
- package/dist/charts/kinds/band-chrome.d.ts.map +0 -1
- package/dist/charts/kinds/band-chrome.js +0 -71
- package/dist/charts/kinds/donut-layout.d.ts +0 -47
- package/dist/charts/kinds/donut-layout.d.ts.map +0 -1
- package/dist/charts/kinds/donut-layout.js +0 -52
- package/dist/charts/layout/auto-margin.d.ts +0 -122
- package/dist/charts/layout/auto-margin.d.ts.map +0 -1
- package/dist/charts/layout/auto-margin.js +0 -81
- package/dist/charts/layout/end-labels.d.ts +0 -64
- package/dist/charts/layout/end-labels.d.ts.map +0 -1
- package/dist/charts/layout/end-labels.js +0 -76
- package/dist/charts/layout/log-ticks.d.ts +0 -27
- package/dist/charts/layout/log-ticks.d.ts.map +0 -1
- package/dist/charts/layout/log-ticks.js +0 -42
- package/dist/charts/primitives/AreaGradient.d.ts +0 -18
- package/dist/charts/primitives/AreaGradient.d.ts.map +0 -1
- package/dist/charts/primitives/AreaGradient.js +0 -13
- package/dist/charts/primitives/Axes.d.ts +0 -83
- package/dist/charts/primitives/Axes.d.ts.map +0 -1
- package/dist/charts/primitives/Axes.js +0 -168
- package/dist/charts/primitives/CartesianChart.d.ts +0 -257
- package/dist/charts/primitives/CartesianChart.d.ts.map +0 -1
- package/dist/charts/primitives/CartesianChart.js +0 -549
- package/dist/charts/primitives/ChartCard.d.ts +0 -66
- package/dist/charts/primitives/ChartCard.d.ts.map +0 -1
- package/dist/charts/primitives/ChartCard.js +0 -143
- package/dist/charts/primitives/ChartFrame.d.ts +0 -156
- package/dist/charts/primitives/ChartFrame.d.ts.map +0 -1
- package/dist/charts/primitives/ChartFrame.js +0 -241
- package/dist/charts/primitives/ChartLegend.d.ts +0 -67
- package/dist/charts/primitives/ChartLegend.d.ts.map +0 -1
- package/dist/charts/primitives/ChartLegend.js +0 -292
- package/dist/charts/primitives/ChartPending.d.ts +0 -113
- package/dist/charts/primitives/ChartPending.d.ts.map +0 -1
- package/dist/charts/primitives/ChartPending.js +0 -117
- package/dist/charts/primitives/ChartTooltip.d.ts +0 -59
- package/dist/charts/primitives/ChartTooltip.d.ts.map +0 -1
- package/dist/charts/primitives/ChartTooltip.js +0 -197
- package/dist/charts/primitives/Crosshair.d.ts +0 -26
- package/dist/charts/primitives/Crosshair.d.ts.map +0 -1
- package/dist/charts/primitives/Crosshair.js +0 -23
- package/dist/charts/primitives/HatchPattern.d.ts +0 -31
- package/dist/charts/primitives/HatchPattern.d.ts.map +0 -1
- package/dist/charts/primitives/HatchPattern.js +0 -31
- package/dist/charts/primitives/HoverOverlay.d.ts +0 -45
- package/dist/charts/primitives/HoverOverlay.d.ts.map +0 -1
- package/dist/charts/primitives/HoverOverlay.js +0 -72
- package/dist/charts/primitives/HoverOverlay.module.css +0 -13
- package/dist/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
- package/dist/charts/primitives/XZoneRects.d.ts +0 -54
- package/dist/charts/primitives/XZoneRects.d.ts.map +0 -1
- package/dist/charts/primitives/XZoneRects.js +0 -65
- package/dist/charts/primitives/ZoneRects.d.ts +0 -38
- package/dist/charts/primitives/ZoneRects.d.ts.map +0 -1
- package/dist/charts/primitives/ZoneRects.js +0 -30
- package/dist/charts/primitives/chart-card-context.d.ts +0 -33
- package/dist/charts/primitives/chart-card-context.d.ts.map +0 -1
- package/dist/charts/primitives/chart-card-context.js +0 -18
- package/dist/charts/primitives/chart-frame-layout.d.ts +0 -185
- package/dist/charts/primitives/chart-frame-layout.d.ts.map +0 -1
- package/dist/charts/primitives/chart-frame-layout.js +0 -175
- package/dist/charts/primitives/chart-layout.d.ts +0 -112
- package/dist/charts/primitives/chart-layout.d.ts.map +0 -1
- package/dist/charts/primitives/chart-layout.js +0 -175
- package/dist/charts/primitives/chart-tier.d.ts +0 -16
- package/dist/charts/primitives/chart-tier.d.ts.map +0 -1
- package/dist/charts/primitives/chart-tier.js +0 -44
- package/dist/charts/primitives/legend-disclosure.d.ts +0 -27
- package/dist/charts/primitives/legend-disclosure.d.ts.map +0 -1
- package/dist/charts/primitives/legend-disclosure.js +0 -153
- package/dist/charts/series.d.ts +0 -189
- package/dist/charts/series.d.ts.map +0 -1
- package/dist/charts/series.js +0 -84
- package/dist/charts/sparklines/BarSparkline.d.ts +0 -37
- package/dist/charts/sparklines/BarSparkline.d.ts.map +0 -1
- package/dist/charts/sparklines/BarSparkline.js +0 -53
- package/dist/charts/sparklines/LineSparkline.d.ts +0 -15
- package/dist/charts/sparklines/LineSparkline.d.ts.map +0 -1
- package/dist/charts/sparklines/LineSparkline.js +0 -51
- package/dist/charts/sparklines/index.d.ts +0 -3
- package/dist/charts/sparklines/index.d.ts.map +0 -1
- package/dist/charts/sparklines/index.js +0 -6
- package/dist/charts/utils/domain.d.ts +0 -35
- package/dist/charts/utils/domain.d.ts.map +0 -1
- package/dist/charts/utils/domain.js +0 -12
- package/dist/charts/utils/format.d.ts +0 -8
- package/dist/charts/utils/format.d.ts.map +0 -1
- package/dist/charts/utils/format.js +0 -20
- package/dist/charts/utils/measure-text.d.ts +0 -25
- package/dist/charts/utils/measure-text.d.ts.map +0 -1
- package/dist/charts/utils/measure-text.js +0 -64
- package/dist/charts/utils/ticks.d.ts +0 -103
- package/dist/charts/utils/ticks.d.ts.map +0 -1
- package/dist/charts/utils/ticks.js +0 -92
- package/dist/commands/overlays-mount.d.ts +0 -122
- package/dist/commands/overlays-mount.d.ts.map +0 -1
- package/dist/commands/overlays-mount.js +0 -125
- package/dist/commands/useCommandHotkeys.d.ts +0 -14
- package/dist/commands/useCommandHotkeys.d.ts.map +0 -1
- package/dist/commands/useCommandHotkeys.js +0 -45
- package/dist/content/article-actions.d.ts +0 -39
- package/dist/content/article-actions.d.ts.map +0 -1
- package/dist/content/article-actions.js +0 -28
- package/dist/content/article-card.d.ts +0 -58
- package/dist/content/article-card.d.ts.map +0 -1
- package/dist/content/article-card.js +0 -79
- package/dist/content/article-card.module.css +0 -111
- package/dist/content/mdx.d.ts +0 -20
- package/dist/content/mdx.d.ts.map +0 -1
- package/dist/content/mdx.js +0 -64
- package/dist/controls/compare-filter.d.ts +0 -42
- package/dist/controls/compare-filter.d.ts.map +0 -1
- package/dist/controls/compare-filter.js +0 -38
- package/dist/controls/slider-control.d.ts +0 -36
- package/dist/controls/slider-control.d.ts.map +0 -1
- package/dist/controls/slider-control.js +0 -64
- package/dist/dashboard/widget-grid.d.ts +0 -27
- package/dist/dashboard/widget-grid.d.ts.map +0 -1
- package/dist/dashboard/widget-grid.js +0 -40
- package/dist/dashboard/widget-grid.module.css +0 -69
- package/dist/data/data-table-state.d.ts.map +0 -1
- package/dist/data/data-table.d.ts.map +0 -1
- package/dist/data/query-branch.d.ts.map +0 -1
- package/dist/data/table.d.ts +0 -24
- package/dist/data/table.d.ts.map +0 -1
- package/dist/data/virtual-list.d.ts +0 -133
- package/dist/data/virtual-list.d.ts.map +0 -1
- package/dist/data/virtual-list.js +0 -157
- package/dist/data/virtual.d.ts +0 -21
- package/dist/data/virtual.d.ts.map +0 -1
- package/dist/data/virtual.js +0 -4
- package/dist/forms/FormErrorSummary.d.ts +0 -30
- package/dist/forms/FormErrorSummary.d.ts.map +0 -1
- package/dist/forms/FormErrorSummary.js +0 -30
- package/dist/forms/use-field-array.d.ts +0 -60
- package/dist/forms/use-field-array.d.ts.map +0 -1
- package/dist/forms/use-field-array.js +0 -20
- package/dist/forms/use-form-draft.d.ts +0 -76
- package/dist/forms/use-form-draft.d.ts.map +0 -1
- package/dist/forms/use-form-draft.js +0 -92
- package/dist/forms/use-form-submit.d.ts +0 -88
- package/dist/forms/use-form-submit.d.ts.map +0 -1
- package/dist/forms/use-form-submit.js +0 -63
- package/dist/notifications/bell.d.ts.map +0 -1
- package/dist/notifications/center.d.ts.map +0 -1
- package/dist/notifications/define-notifications.d.ts.map +0 -1
- package/dist/notifications/index.d.ts +0 -40
- package/dist/notifications/index.d.ts.map +0 -1
- package/dist/notifications/index.js +0 -54
- package/dist/notifications/mount-guard.d.ts +0 -8
- package/dist/notifications/mount-guard.d.ts.map +0 -1
- package/dist/notifications/mount-guard.js +0 -18
- package/dist/notifications/notify.d.ts +0 -149
- package/dist/notifications/notify.d.ts.map +0 -1
- package/dist/notifications/notify.js +0 -171
- package/dist/notifications/store.d.ts.map +0 -1
- package/dist/provider/connectivity-indicator.d.ts +0 -13
- package/dist/provider/connectivity-indicator.d.ts.map +0 -1
- package/dist/provider/connectivity-indicator.js +0 -205
- package/dist/provider/connectivity-provider.d.ts +0 -7
- package/dist/provider/connectivity-provider.d.ts.map +0 -1
- package/dist/provider/connectivity-provider.js +0 -128
- package/dist/provider/connectivity-types.d.ts +0 -36
- package/dist/provider/connectivity-types.d.ts.map +0 -1
- package/dist/provider/use-connectivity.d.ts +0 -3
- package/dist/provider/use-connectivity.d.ts.map +0 -1
- package/dist/provider/use-connectivity.js +0 -14
- package/dist/query-devtools.d.ts +0 -21
- package/dist/query-devtools.d.ts.map +0 -1
- package/dist/query-devtools.js +0 -13
- package/src/agent/adapter.ts +0 -945
- package/src/agent/use-agent-stream.ts +0 -154
- package/src/agent-chat/index.ts +0 -54
- package/src/agent-chat/thread-detail-panel.tsx +0 -201
- package/src/agent-chat/thread-workspace.tsx +0 -279
- package/src/charts/cursor/resolve.ts +0 -198
- package/src/charts/cursor/scope.tsx +0 -35
- package/src/charts/cursor/store.ts +0 -58
- package/src/charts/cursor/touch-pin.ts +0 -138
- package/src/charts/hooks/use-discrete-cursor.ts +0 -335
- package/src/charts/hooks/use-hysteresis.ts +0 -26
- package/src/charts/hooks/useBandPlot.ts +0 -383
- package/src/charts/hooks/useChartCursor.ts +0 -367
- package/src/charts/hooks/useChartSize.ts +0 -35
- package/src/charts/kinds/BandStrip.tsx +0 -449
- package/src/charts/kinds/Bars.tsx +0 -589
- package/src/charts/kinds/Donut.tsx +0 -368
- package/src/charts/kinds/DualPanel.tsx +0 -712
- package/src/charts/kinds/Heatmap.tsx +0 -396
- package/src/charts/kinds/MirroredBars.tsx +0 -469
- package/src/charts/kinds/MultiLine.tsx +0 -322
- package/src/charts/kinds/StackedArea.tsx +0 -267
- package/src/charts/kinds/ZonedLine.tsx +0 -301
- package/src/charts/kinds/band-chrome.tsx +0 -91
- package/src/charts/kinds/donut-layout.ts +0 -82
- package/src/charts/layout/auto-margin.ts +0 -242
- package/src/charts/layout/end-labels.ts +0 -135
- package/src/charts/layout/log-ticks.ts +0 -90
- package/src/charts/primitives/AreaGradient.tsx +0 -26
- package/src/charts/primitives/Axes.tsx +0 -271
- package/src/charts/primitives/CartesianChart.tsx +0 -1002
- package/src/charts/primitives/ChartCard.tsx +0 -280
- package/src/charts/primitives/ChartFrame.tsx +0 -493
- package/src/charts/primitives/ChartLegend.tsx +0 -422
- package/src/charts/primitives/ChartPending.tsx +0 -243
- package/src/charts/primitives/ChartTooltip.tsx +0 -265
- package/src/charts/primitives/Crosshair.tsx +0 -43
- package/src/charts/primitives/HatchPattern.tsx +0 -55
- package/src/charts/primitives/HoverOverlay.module.css +0 -13
- package/src/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
- package/src/charts/primitives/HoverOverlay.tsx +0 -109
- package/src/charts/primitives/XZoneRects.tsx +0 -132
- package/src/charts/primitives/ZoneRects.tsx +0 -67
- package/src/charts/primitives/chart-card-context.ts +0 -46
- package/src/charts/primitives/chart-frame-layout.ts +0 -430
- package/src/charts/primitives/chart-layout.ts +0 -318
- package/src/charts/primitives/chart-tier.tsx +0 -76
- package/src/charts/primitives/legend-disclosure.tsx +0 -178
- package/src/charts/series.ts +0 -276
- package/src/charts/sparklines/BarSparkline.tsx +0 -94
- package/src/charts/sparklines/LineSparkline.tsx +0 -71
- package/src/charts/sparklines/index.ts +0 -2
- package/src/charts/theme.tsx +0 -53
- package/src/charts/utils/domain.ts +0 -41
- package/src/charts/utils/format.ts +0 -19
- package/src/charts/utils/measure-text.ts +0 -109
- package/src/charts/utils/ticks.ts +0 -239
- package/src/commands/overlays-mount.tsx +0 -333
- package/src/commands/useCommandHotkeys.ts +0 -114
- package/src/content/article-actions.ts +0 -72
- package/src/content/article-card.module.css +0 -111
- package/src/content/article-card.tsx +0 -174
- package/src/content/mdx.tsx +0 -127
- package/src/controls/compare-filter.tsx +0 -81
- package/src/controls/slider-control.tsx +0 -159
- package/src/dashboard/widget-grid.module.css +0 -69
- package/src/dashboard/widget-grid.tsx +0 -146
- package/src/data/table.ts +0 -39
- package/src/data/virtual-list.tsx +0 -356
- package/src/data/virtual.ts +0 -26
- package/src/forms/FormErrorSummary.tsx +0 -71
- package/src/forms/use-field-array.ts +0 -94
- package/src/forms/use-form-draft.ts +0 -262
- package/src/forms/use-form-submit.ts +0 -199
- package/src/notifications/index.ts +0 -88
- package/src/notifications/mount-guard.ts +0 -38
- package/src/notifications/notify.tsx +0 -379
- package/src/provider/connectivity-indicator.tsx +0 -267
- package/src/provider/connectivity-provider.tsx +0 -189
- package/src/provider/connectivity-types.ts +0 -42
- package/src/provider/use-connectivity.ts +0 -26
- package/src/query-devtools.tsx +0 -40
- /package/dist/{agent-chat → agent/chat}/message-affordances.js +0 -0
- /package/dist/{agent-chat → agent/chat}/relative-time.d.ts +0 -0
- /package/dist/{agent-chat → agent/chat}/relative-time.js +0 -0
- /package/dist/{agent-chat → agent/chat}/use-keyboard-inset.d.ts +0 -0
- /package/dist/{agent-chat → agent/chat}/virtualize.js +0 -0
- /package/dist/{notifications → commands/notifications}/bell.js +0 -0
- /package/dist/{notifications → commands/notifications}/define-notifications.js +0 -0
- /package/dist/{provider/connectivity-types.js → controls/uncontrolled.js} +0 -0
- /package/dist/{data → table}/data-table.module.css +0 -0
- /package/dist/{data → table}/data-table.module.css.d.ts +0 -0
- /package/dist/{data → table}/query-branch.d.ts +0 -0
- /package/dist/{data → table}/query-branch.js +0 -0
- /package/src/{agent-chat → agent/chat}/relative-time.ts +0 -0
- /package/src/{data → table}/data-table.module.css +0 -0
- /package/src/{data → table}/data-table.module.css.d.ts +0 -0
- /package/src/{data → table}/query-branch.ts +0 -0
|
@@ -18,7 +18,8 @@
|
|
|
18
18
|
/**
|
|
19
19
|
* Returns true when running on macOS. SSR-safe — returns false when navigator is unavailable.
|
|
20
20
|
* Uses userAgentData.platform when available; falls back to userAgent string regex.
|
|
21
|
-
*
|
|
21
|
+
* Reads the client's platform, so during SSR/hydration render it through `useSyncExternalStore`
|
|
22
|
+
* with a `false` server snapshot (as `ShortcutsHelp` does) rather than calling it bare in render.
|
|
22
23
|
*/
|
|
23
24
|
export function detectMac(): boolean {
|
|
24
25
|
if (typeof navigator === 'undefined') return false
|
|
@@ -64,14 +65,14 @@ function plainKey(key: string): string {
|
|
|
64
65
|
/**
|
|
65
66
|
* Convert a shortcut string to a list of Kbd-friendly tokens.
|
|
66
67
|
* 'Mod+S' → ['⌘', 'S'] (mac) or ['Ctrl', 'S'] (other).
|
|
67
|
-
* 'Shift+
|
|
68
|
+
* 'Mod+Shift+P' → ['⌘', '⇧', 'P'] (mac) or ['Ctrl', 'Shift', 'P'] (other).
|
|
68
69
|
* Named keys read as glyphs on mac and Title-case words elsewhere:
|
|
69
70
|
* 'Mod+Backspace' → ['⌘', '⌫'] (mac) or ['Ctrl', 'Backspace'] (other).
|
|
70
71
|
* isMac is the post-mount platform flag; defaults false on SSR / first render.
|
|
71
72
|
*
|
|
72
73
|
* @example
|
|
73
74
|
* parseShortcut('Mod+S', true) // ['⌘', 'S']
|
|
74
|
-
* parseShortcut('Shift+
|
|
75
|
+
* parseShortcut('Mod+Shift+P', false) // ['Ctrl', 'Shift', 'P']
|
|
75
76
|
* parseShortcut('ArrowLeft', true) // ['←']
|
|
76
77
|
*/
|
|
77
78
|
export function parseShortcut(shortcut: string, isMac: boolean): string[] {
|
|
@@ -114,7 +115,7 @@ export function parseShortcut(shortcut: string, isMac: boolean): string[] {
|
|
|
114
115
|
* formatShortcutDisplay('Mod+S', true) // '⌘S'
|
|
115
116
|
* formatShortcutDisplay('Mod+Backspace', true) // '⌘⌫'
|
|
116
117
|
* formatShortcutDisplay('Mod+S', false) // 'Ctrl+S'
|
|
117
|
-
* formatShortcutDisplay('Shift+
|
|
118
|
+
* formatShortcutDisplay('Mod+Shift+P', true) // '⌘⇧P'
|
|
118
119
|
*/
|
|
119
120
|
export function formatShortcutDisplay(shortcut: string, isMac: boolean): string {
|
|
120
121
|
const tokens = parseShortcut(shortcut, isMac)
|
package/src/common/errors.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* here, so the prefix, the `Component: …` shape and the em-dash-then-remedy rhythm are one decision
|
|
4
4
|
* instead of 60. It is the generalisation of `assertQueryStateLike`, which was the ONLY component
|
|
5
5
|
* in the library naming itself in its own failure (isomorphic finding F-ERR-1: the other 54 fail as
|
|
6
|
-
* raw `TypeError`s that `
|
|
6
|
+
* raw `TypeError`s that `RootBoundary` swallows into a blank subtree).
|
|
7
7
|
*
|
|
8
8
|
* Every builder returns a string; nothing here throws or logs. The caller decides which it is —
|
|
9
9
|
* `assertRequiredProps` throws, `useValidateProps` logs, the mount guards log.
|
|
@@ -62,8 +62,8 @@ export function deprecatedProp(
|
|
|
62
62
|
*
|
|
63
63
|
* Distinct from {@link deprecatedProp} (still read, going away) and {@link oneOf} (read, and the
|
|
64
64
|
* value is out of range): this one renders something the caller did not ask for and nothing in the
|
|
65
|
-
* type system, the linter or the console says so.
|
|
66
|
-
* reference case —
|
|
65
|
+
* type system, the linter or the console says so. A 1.x chart's `height` under `fill` was the
|
|
66
|
+
* reference case — weatherorb passed both for the life of the file and never learnt that eight height
|
|
67
67
|
* constants and a whole `compact` branch changed no pixel.
|
|
68
68
|
*/
|
|
69
69
|
export function ignoredProp(component: string, prop: string, because: string): string {
|
|
@@ -44,11 +44,14 @@ export function useMeasuredWidths(options: UseMeasuredWidthsOptions): UseMeasure
|
|
|
44
44
|
|
|
45
45
|
// Read through refs so a fresh closure each render does not re-run the effect.
|
|
46
46
|
const resolveRef = useRef(resolveRoot)
|
|
47
|
-
resolveRef.current = resolveRoot
|
|
48
47
|
const extraRef = useRef(extra)
|
|
49
|
-
extraRef.current = extra
|
|
50
48
|
const onMeasureRef = useRef(onMeasure)
|
|
51
|
-
|
|
49
|
+
// Declared before the measuring effect, so the refs are current by the time it reads them.
|
|
50
|
+
useIsomorphicLayoutEffect(() => {
|
|
51
|
+
resolveRef.current = resolveRoot
|
|
52
|
+
extraRef.current = extra
|
|
53
|
+
onMeasureRef.current = onMeasure
|
|
54
|
+
})
|
|
52
55
|
|
|
53
56
|
useIsomorphicLayoutEffect(() => {
|
|
54
57
|
if (signatureRef.current !== signature) {
|
package/src/common/validate.ts
CHANGED
|
@@ -60,7 +60,7 @@ export function useValidateProps(
|
|
|
60
60
|
/**
|
|
61
61
|
* The same once-per-`(component, message)` dev diagnostic {@link useValidateProps} logs, for a
|
|
62
62
|
* caller that already owns the effect a check would otherwise race — a decision made synchronously
|
|
63
|
-
* inside a `useLayoutEffect` (e.g.
|
|
63
|
+
* inside a `useLayoutEffect` (e.g. a card's header-slot claim, P2-9) has no business waiting a
|
|
64
64
|
* further render for a REACTIVE check on state that effect itself just set: that state update lags
|
|
65
65
|
* one commit behind the decision, and a passive-effect check racing it warns about instances that
|
|
66
66
|
* are about to win in the very next render.
|
|
@@ -83,7 +83,7 @@ export function resetValidatedProps(): void {
|
|
|
83
83
|
*
|
|
84
84
|
* This is the F-ERR-1 remedy, and the reason it is not dev-gated: the component was going to crash
|
|
85
85
|
* either way (`undefined is not an object (evaluating 'field.use')`), so the only thing in question
|
|
86
|
-
* is whether the stack reaching `
|
|
86
|
+
* is whether the stack reaching `RootBoundary` names the component and the prop. It does
|
|
87
87
|
* now. A prop that is merely questionable belongs in `useValidateProps`, not here.
|
|
88
88
|
*
|
|
89
89
|
* @example
|
|
@@ -129,9 +129,9 @@ export function ArticleLayout({
|
|
|
129
129
|
// THIS component, not the Popover, so crossing back below the breakpoint would otherwise remount
|
|
130
130
|
// it already open with no user action. Adjusted during render (React's own pattern for resetting
|
|
131
131
|
// state when a derived value changes), not an effect, so there is no open-then-close flash.
|
|
132
|
-
const
|
|
133
|
-
if (
|
|
134
|
-
|
|
132
|
+
const [prevShowTocRail, setPrevShowTocRail] = useState(showTocRail)
|
|
133
|
+
if (prevShowTocRail !== showTocRail) {
|
|
134
|
+
setPrevShowTocRail(showTocRail)
|
|
135
135
|
if (tocOpen) setTocOpen(false)
|
|
136
136
|
}
|
|
137
137
|
|
|
@@ -167,41 +167,40 @@ export function ArticleLayout({
|
|
|
167
167
|
</div>
|
|
168
168
|
)}
|
|
169
169
|
|
|
170
|
-
{toc &&
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
>
|
|
186
|
-
<
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
<
|
|
199
|
-
<
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
)}
|
|
170
|
+
{toc && !showTocRail && (
|
|
171
|
+
// `.tocTrigger`'s `grid-row: 2` (article-layout.module.css) is EXPLICIT, matching
|
|
172
|
+
// `.content`'s own row — not left to CSS Grid's auto-placement, which used to land this
|
|
173
|
+
// in its own row below the content instead of at its top (both are `grid-column: 1`, and
|
|
174
|
+
// the auto-placement cursor moves past row 2 once `.content` claims it).
|
|
175
|
+
<Popover
|
|
176
|
+
opened={tocOpen}
|
|
177
|
+
onChange={setTocOpen}
|
|
178
|
+
onDismiss={() => setTocOpen(false)}
|
|
179
|
+
position="bottom-end"
|
|
180
|
+
withinPortal
|
|
181
|
+
shadow="md"
|
|
182
|
+
radius="sm"
|
|
183
|
+
trapFocus
|
|
184
|
+
>
|
|
185
|
+
<Popover.Target>
|
|
186
|
+
<Button
|
|
187
|
+
variant="subtle"
|
|
188
|
+
color="gray"
|
|
189
|
+
size="compact-xs"
|
|
190
|
+
className={classes.tocTrigger}
|
|
191
|
+
classNames={{ label: classes.tocTriggerLabel }}
|
|
192
|
+
onClick={() => setTocOpen((current) => !current)}
|
|
193
|
+
>
|
|
194
|
+
On this page
|
|
195
|
+
</Button>
|
|
196
|
+
</Popover.Target>
|
|
197
|
+
<Popover.Dropdown className={classes.tocDropdown}>
|
|
198
|
+
<ScrollArea.Autosize mah="calc(100vh - 108px)" type="hover">
|
|
199
|
+
<TableOfContents containerRef={articleRef} onNavigate={() => setTocOpen(false)} />
|
|
200
|
+
</ScrollArea.Autosize>
|
|
201
|
+
</Popover.Dropdown>
|
|
202
|
+
</Popover>
|
|
203
|
+
)}
|
|
205
204
|
|
|
206
205
|
{(prev !== undefined || next !== undefined) && (
|
|
207
206
|
<footer className={classes.footer}>
|
|
@@ -1,87 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Article — the structured data model behind `ArticleCard`/`ArticleLayout` (docs/CONTENT-SPEC.md).
|
|
3
|
-
* Pure data + pure functions: no React, no `@mantine/*`. Sortable/filterable article metadata
|
|
4
|
-
* replaces the old preformatted `meta` string so a consumer can build a filter bar or a Spotlight
|
|
5
|
-
* projector on top of it (both are a later stage — this module only ships the model).
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
export type Article<C extends string = string, T extends string = string> = {
|
|
9
|
-
readonly slug: string
|
|
10
|
-
readonly title: string
|
|
11
|
-
readonly description?: string
|
|
12
|
-
/** ISO 8601 — sortable. Articles without a date sort last regardless of `ArticleOrder`. */
|
|
13
|
-
readonly date?: string
|
|
14
|
-
readonly category?: C
|
|
15
|
-
readonly tags?: readonly T[]
|
|
16
|
-
/** Minutes. */
|
|
17
|
-
readonly readingTime?: number
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export type ArticleOrder = 'date-desc' | 'date-asc' | 'title'
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Sorts articles. Pure — never mutates `articles`, always returns a new array.
|
|
24
|
-
*
|
|
25
|
-
* - `'date-desc'` (default) / `'date-asc'` — compares `date` lexicographically (ISO 8601 sorts
|
|
26
|
-
* chronologically as a string, so no `Date` parsing is needed). Articles missing a `date` sort
|
|
27
|
-
* LAST in both directions — a missing date is not "oldest", it's unranked.
|
|
28
|
-
* - `'title'` — `localeCompare` with a PINNED `'en-US'` locale, not the runtime default, so sort
|
|
29
|
-
* order doesn't drift between environments.
|
|
30
|
-
*
|
|
31
|
-
* Stable: articles that compare equal keep their input order (native `toSorted` is a stable sort).
|
|
32
|
-
*/
|
|
33
|
-
export function sortArticles<A extends Article>(
|
|
34
|
-
articles: readonly A[],
|
|
35
|
-
order: ArticleOrder = 'date-desc',
|
|
36
|
-
): readonly A[] {
|
|
37
|
-
if (order === 'title') {
|
|
38
|
-
return articles.toSorted((a, b) => a.title.localeCompare(b.title, 'en-US'))
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
const direction = order === 'date-asc' ? 1 : -1
|
|
42
|
-
return articles.toSorted((a, b) => {
|
|
43
|
-
if (a.date === undefined && b.date === undefined) return 0
|
|
44
|
-
if (a.date === undefined) return 1
|
|
45
|
-
if (b.date === undefined) return -1
|
|
46
|
-
if (a.date === b.date) return 0
|
|
47
|
-
return a.date < b.date ? -direction : direction
|
|
48
|
-
})
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export type ArticleFilterQuery = {
|
|
52
|
-
readonly category?: string
|
|
53
|
-
readonly tags?: readonly string[]
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Filters articles. Pure — never mutates `articles`.
|
|
58
|
-
*
|
|
59
|
-
* - `category` — exact match. `undefined`/`''` applies no constraint.
|
|
60
|
-
* - `tags` — ANY-OF (OR): an article matches if it carries at least one queried tag.
|
|
61
|
-
* `undefined`/`[]` applies no constraint.
|
|
62
|
-
* - Both axes given: AND between category and tags, OR within tags — matches the multi-facet
|
|
63
|
-
* `filterFn` semantics in `data/data-table.tsx`.
|
|
64
|
-
*
|
|
65
|
-
* An empty query (`{}`, or a query where both axes are unset) returns `articles` unchanged.
|
|
66
|
-
*/
|
|
67
|
-
export function filterArticles<A extends Article>(
|
|
68
|
-
articles: readonly A[],
|
|
69
|
-
query: ArticleFilterQuery,
|
|
70
|
-
): readonly A[] {
|
|
71
|
-
const { category, tags } = query
|
|
72
|
-
const hasCategory = category !== undefined && category !== ''
|
|
73
|
-
const hasTags = tags !== undefined && tags.length > 0
|
|
74
|
-
|
|
75
|
-
if (!hasCategory && !hasTags) return articles
|
|
76
|
-
|
|
77
|
-
return articles.filter((article) => {
|
|
78
|
-
if (hasCategory && article.category !== category) return false
|
|
79
|
-
if (hasTags && tags !== undefined && !tags.some((tag) => article.tags?.includes(tag))) {
|
|
80
|
-
return false
|
|
81
|
-
}
|
|
82
|
-
return true
|
|
83
|
-
})
|
|
84
|
-
}
|
|
1
|
+
/** Article date formatting for `ArticleLayout` — pure, no React, no `@mantine/*`. */
|
|
85
2
|
|
|
86
3
|
/**
|
|
87
4
|
* Formats an ISO 8601 date string via `Intl.DateTimeFormat` → `'Jul 16, 2026'`.
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* The check + tooltip are the entire success signal — no notification (docs/CONTENT-SPEC.md §7).
|
|
8
8
|
* `color="teal"` resolves through the bridged Mantine family, so it stays on the token layer in
|
|
9
|
-
* both schemes (see the package
|
|
9
|
+
* both schemes (see the package MAINTAINING.md on `cssVariablesResolver`).
|
|
10
10
|
*
|
|
11
11
|
* Not part of the public surface — reach it through `CodeBlock` / `HeadingAnchor`.
|
|
12
12
|
*/
|
package/src/content/glyphs.tsx
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* hand-drawn ones that drift apart.
|
|
5
5
|
*
|
|
6
6
|
* Inline SVG rather than an icon dep: the framework takes icons as `ReactNode` from the consumer
|
|
7
|
-
* (see the package
|
|
7
|
+
* (see the package MAINTAINING.md) and ships none, but these are internal chrome of a shipped component,
|
|
8
8
|
* not a consumer-facing slot. `currentColor` + `1em`-agnostic sizing keeps them steerable from CSS
|
|
9
9
|
* — the heading anchor sizes its glyph as an optical ratio of whatever step the heading lands on
|
|
10
10
|
* (docs/DESIGN-SPEC.md §3), while the code-block chrome pins a fixed 14px.
|
package/src/content/index.ts
CHANGED
|
@@ -1,91 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `basalt-ui/content` — the
|
|
2
|
+
* `basalt-ui/content` — prose, markdown and the docs-page frame (docs/CONTENT-SPEC.md).
|
|
3
3
|
*
|
|
4
|
-
* Mantine-coupled
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* remark-gfm + rehype-sanitize + remend, all optional peers) with its fence-renderer registry,
|
|
8
|
-
* `MermaidDiagram` (beautiful-mermaid, optional peer), the MDX
|
|
9
|
-
* component map, the docs-page frame (`ArticleLayout`), overview cards (`ArticleCard`/
|
|
10
|
-
* `ArticleGrid`), the contextual-help drawer (`GuideLink`/`GuideDrawer`), and a re-export of the
|
|
11
|
-
* three `basalt-ui/controls` filters an article list needs (`FilterSet`/`ViewTabs`/
|
|
12
|
-
* `MultiSelectFilter`, which replaced the controlled `ArticleFilterBar`). See
|
|
13
|
-
* `agent/rules/basalt-content.md` for the full doctrine + the content-collections recipe.
|
|
4
|
+
* Mantine-coupled. `Markdown` renders code and mermaid fences itself (`CodeBlock` and
|
|
5
|
+
* `MermaidDiagram` are internal); `fenceRenderers` is the extension point. Optional peers
|
|
6
|
+
* (shiki, react-markdown stack, beautiful-mermaid) load lazily; the sanitizer is always on.
|
|
14
7
|
*/
|
|
15
|
-
export { Prose } from './prose'
|
|
16
|
-
export type { ProseDensity, ProseProps } from './prose'
|
|
17
|
-
|
|
18
|
-
export { CodeBlock } from './code-block'
|
|
19
|
-
export type { CodeBlockProps } from './code-block'
|
|
20
8
|
|
|
9
|
+
export { Prose } from './prose'
|
|
21
10
|
export { Callout } from './callout'
|
|
22
|
-
export type { CalloutKind
|
|
23
|
-
|
|
11
|
+
export type { CalloutKind } from './callout'
|
|
24
12
|
export { TableOfContents } from './toc'
|
|
25
|
-
export type {
|
|
26
|
-
|
|
27
|
-
export { ReadingProgress } from './reading-progress'
|
|
28
|
-
export type { ReadingProgressProps } from './reading-progress'
|
|
29
|
-
|
|
30
|
-
// `SlugTracker` is a PascalCase utility class, not a component — see its own JSDoc `@remarks`
|
|
31
|
-
// (isomorphic harness finding F-DET-1). `new SlugTracker()`, never `<SlugTracker />`.
|
|
32
|
-
export { headingSlug, readingTime, SlugTracker } from './slug'
|
|
33
|
-
export type { ReadingTime } from './slug'
|
|
34
|
-
|
|
35
|
-
export { HeadingAnchor } from './heading-anchor'
|
|
36
|
-
export type { HeadingAnchorProps } from './heading-anchor'
|
|
37
|
-
|
|
13
|
+
export type { TocItem } from './toc'
|
|
38
14
|
export { Markdown, settledOnly } from './markdown'
|
|
39
|
-
export type {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
FenceRenderers,
|
|
43
|
-
MarkdownComponents,
|
|
44
|
-
MarkdownContentTrust,
|
|
45
|
-
MarkdownProps,
|
|
46
|
-
} from './markdown'
|
|
47
|
-
|
|
48
|
-
export { BASALT_SANITIZE_SCHEMA, mergeSanitizeSchema } from './sanitize'
|
|
49
|
-
export type {
|
|
50
|
-
SanitizePropertyDefinition,
|
|
51
|
-
SanitizeSchema,
|
|
52
|
-
SanitizeSchemaExtension,
|
|
53
|
-
SanitizeSchemaInput,
|
|
54
|
-
} from './sanitize'
|
|
55
|
-
|
|
56
|
-
export { MermaidDiagram } from './mermaid'
|
|
57
|
-
export type { MermaidDiagramProps } from './mermaid'
|
|
58
|
-
|
|
59
|
-
export { blockSplit } from './block-split'
|
|
60
|
-
|
|
61
|
-
export { createMdxComponents, mdxComponents } from './mdx'
|
|
62
|
-
export type { CreateMdxComponentsOptions } from './mdx'
|
|
63
|
-
|
|
15
|
+
export type { FenceRenderer, FenceRenderers, MarkdownComponents, MarkdownProps } from './markdown'
|
|
16
|
+
export { mergeSanitizeSchema } from './sanitize'
|
|
17
|
+
export type { SanitizeSchemaExtension, SanitizeSchemaInput } from './sanitize'
|
|
64
18
|
export { ArticleLayout } from './article-layout'
|
|
65
|
-
export type { ArticleLayoutMeta
|
|
66
|
-
|
|
67
|
-
export { ArticleCard, ArticleGrid } from './article-card'
|
|
68
|
-
export type { ArticleCardProps, ArticleGridProps } from './article-card'
|
|
69
|
-
|
|
70
|
-
export { filterArticles, formatArticleDate, sortArticles } from './article-model'
|
|
71
|
-
export type { Article, ArticleFilterQuery, ArticleOrder } from './article-model'
|
|
72
|
-
|
|
73
|
-
export { toArticleActions } from './article-actions'
|
|
74
|
-
export type { ToArticleActionsOptions } from './article-actions'
|
|
75
|
-
|
|
76
|
-
// The article filter UI is no longer content's own: `ArticleFilterBar` (controlled,
|
|
77
|
-
// `value`/`onChange`, its own responsive twin) was replaced by the store-bound controls of
|
|
78
|
-
// `basalt-ui/controls` (`docs/CONTROLS-SPEC.md` §3, C2/C9). Re-exported here — not merely
|
|
79
|
-
// documented as moved — so a content-only consumer that never imports `./controls` still gets the
|
|
80
|
-
// three it needs from the surface it was already using. Both spellings are the same module: one
|
|
81
|
-
// component, two import paths.
|
|
82
|
-
export { FilterSet, MultiSelectFilter, ViewTabs } from '../controls'
|
|
83
|
-
export type {
|
|
84
|
-
FilterSetProps,
|
|
85
|
-
MultiSelectFilterProps,
|
|
86
|
-
ViewTabsOption,
|
|
87
|
-
ViewTabsProps,
|
|
88
|
-
} from '../controls'
|
|
89
|
-
|
|
90
|
-
export { GuideDrawer, GuideLink } from './guide'
|
|
91
|
-
export type { GuideDrawerProps, GuideLinkProps } from './guide'
|
|
19
|
+
export type { ArticleLayoutMeta } from './article-layout'
|
|
20
|
+
export { GuideLink } from './guide'
|
package/src/content/markdown.tsx
CHANGED
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
* through (`./callout-alert`).
|
|
30
30
|
* - `a`/`img` — hardened via `allowedLinkPrefixes`/`allowedImagePrefixes`/`defaultOrigin`
|
|
31
31
|
* (`./url-hardening`); a disallowed URL (including remend's `streamdown:incomplete-link`
|
|
32
|
-
* sentinel) drops the `href`/`src`, and the component renders an unlinked span /
|
|
32
|
+
* sentinel) drops the `href`/`src`, and the component renders an unlinked span / the image's alt text.
|
|
33
33
|
*
|
|
34
34
|
* Streaming mode (`streaming`): `blockSplit` splits `children` into top-level blocks. Every block
|
|
35
35
|
* except the last renders through a memoized renderer (`React.memo`, referentially stable
|
|
@@ -183,8 +183,9 @@ function LinkRenderer({ href, children, node: _node, ...rest }: LinkProps) {
|
|
|
183
183
|
|
|
184
184
|
function ImageRenderer({ src, alt }: ImgProps) {
|
|
185
185
|
// A blocked src arrives as undefined OR '' depending on how urlTransform dropped it — an
|
|
186
|
-
// `<img src="">` renders the broken-image glyph, so both cases
|
|
187
|
-
|
|
186
|
+
// `<img src="">` renders the broken-image glyph, so both cases skip the element and keep the alt
|
|
187
|
+
// as plain text — the same "text, never a destination" degrade an unfinished link gets.
|
|
188
|
+
if (typeof src !== 'string' || src === '') return alt ? <span>{alt}</span> : null
|
|
188
189
|
return <img src={src} alt={alt ?? ''} loading="lazy" />
|
|
189
190
|
}
|
|
190
191
|
|
package/src/content/mermaid.tsx
CHANGED
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
* <MermaidDiagram code={'graph TD\n A --> B'} />
|
|
21
21
|
*/
|
|
22
22
|
import type { CSSProperties, ReactNode } from 'react'
|
|
23
|
-
import { useEffect, useMemo,
|
|
23
|
+
import { useEffect, useMemo, useState } from 'react'
|
|
24
24
|
import { CodeBlock } from './code-block'
|
|
25
25
|
import classes from './mermaid.module.css'
|
|
26
26
|
|
|
@@ -67,7 +67,7 @@ export type MermaidDiagramProps = {
|
|
|
67
67
|
|
|
68
68
|
export function MermaidDiagram({ code, className, style, fallback }: MermaidDiagramProps) {
|
|
69
69
|
const [mod, setMod] = useState<MermaidModule | null | undefined>(undefined)
|
|
70
|
-
const
|
|
70
|
+
const [lastGood, setLastGood] = useState<string | null>(null)
|
|
71
71
|
|
|
72
72
|
useEffect(() => {
|
|
73
73
|
let cancelled = false
|
|
@@ -82,16 +82,18 @@ export function MermaidDiagram({ code, className, style, fallback }: MermaidDiag
|
|
|
82
82
|
|
|
83
83
|
// Pure and synchronous once `mod` is resolved — parse errors keep the last successfully
|
|
84
84
|
// rendered SVG (docs/CONTENT-SPEC.md §2 decision 4) instead of blanking a settled diagram.
|
|
85
|
-
|
|
85
|
+
// Three states: `null` = module not resolved yet, `undefined` = this `code` failed to parse (show
|
|
86
|
+
// the last good SVG), `string` = fresh SVG.
|
|
87
|
+
const rendered = useMemo(() => {
|
|
86
88
|
if (!mod) return null
|
|
87
89
|
try {
|
|
88
|
-
|
|
89
|
-
lastGoodRef.current = svg
|
|
90
|
-
return svg
|
|
90
|
+
return mod.renderMermaidSVG(code, MERMAID_THEME_OPTIONS)
|
|
91
91
|
} catch {
|
|
92
|
-
return
|
|
92
|
+
return undefined
|
|
93
93
|
}
|
|
94
94
|
}, [mod, code])
|
|
95
|
+
if (typeof rendered === 'string' && rendered !== lastGood) setLastGood(rendered)
|
|
96
|
+
const html = rendered === undefined ? lastGood : rendered
|
|
95
97
|
|
|
96
98
|
if (html === null) {
|
|
97
99
|
return (
|
package/src/content/slug.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* headingSlug +
|
|
2
|
+
* headingSlug + SlugTracker — small, pure, zero-dep utils for the content surface.
|
|
3
3
|
*
|
|
4
4
|
* `headingSlug` follows the github-slugger algorithm (lowercase, strip punctuation, spaces → `-`)
|
|
5
5
|
* so headings authored in `<Prose>`, markdown, or MDX land on the SAME anchor ids GitHub itself
|
|
@@ -44,18 +44,3 @@ export class SlugTracker {
|
|
|
44
44
|
return seen === 0 ? base : `${base}-${seen}`
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
|
-
|
|
48
|
-
/** The distilled reading-time estimate for a body of text. */
|
|
49
|
-
export type ReadingTime = {
|
|
50
|
-
readonly minutes: number
|
|
51
|
-
readonly words: number
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const WORDS_PER_MINUTE = 225
|
|
55
|
-
|
|
56
|
-
/** Estimate reading time at 225 wpm, rounded up to the nearest whole minute. */
|
|
57
|
-
export function readingTime(text: string): ReadingTime {
|
|
58
|
-
const words = text.trim().split(WHITESPACE_RE).filter(Boolean).length
|
|
59
|
-
const minutes = Math.ceil(words / WORDS_PER_MINUTE)
|
|
60
|
-
return { minutes, words }
|
|
61
|
-
}
|
|
@@ -11,6 +11,11 @@ import type { UrlTransform } from 'react-markdown'
|
|
|
11
11
|
|
|
12
12
|
const SCHEME_RE = /^[a-z][a-z0-9+.-]*:/i
|
|
13
13
|
|
|
14
|
+
// remend's repair sentinels (`[text](streamdown:incomplete-link)`, ``)
|
|
15
|
+
// are placeholders for a half-streamed URL, never a destination. Rejected before the allowlist so a
|
|
16
|
+
// permissive consumer prefix (`''`, `'streamdown:'`) can't turn one into a real `href`/`img src`.
|
|
17
|
+
const INCOMPLETE_SENTINEL_RE = /^streamdown:incomplete-(?:link|image)$/i
|
|
18
|
+
|
|
14
19
|
function isAllowedUrl(url: string, prefixes: readonly string[]): boolean {
|
|
15
20
|
return prefixes.some((prefix) => url.startsWith(prefix))
|
|
16
21
|
}
|
|
@@ -33,12 +38,13 @@ export type CreateUrlTransformOptions = {
|
|
|
33
38
|
|
|
34
39
|
/**
|
|
35
40
|
* Builds the `urlTransform` passed to `<ReactMarkdown>`. Disallowed URLs (including remend's
|
|
36
|
-
* `streamdown:incomplete-link`
|
|
41
|
+
* `streamdown:incomplete-link` / `streamdown:incomplete-image` sentinels, which no allowlist can admit) resolve to
|
|
37
42
|
* `null`, which react-markdown renders as an `href`/`src`-less element; the `a`/`img` component
|
|
38
|
-
* overrides in `./markdown` turn that into an unlinked span /
|
|
43
|
+
* overrides in `./markdown` turn that into an unlinked span / the image's alt text in a plain span.
|
|
39
44
|
*/
|
|
40
45
|
export function createUrlTransform(opts: CreateUrlTransformOptions): UrlTransform {
|
|
41
46
|
return (url, key) => {
|
|
47
|
+
if (INCOMPLETE_SENTINEL_RE.test(url)) return null
|
|
42
48
|
const prefixes = key === 'src' ? opts.allowedImagePrefixes : opts.allowedLinkPrefixes
|
|
43
49
|
if (!isAllowedUrl(url, prefixes)) return null
|
|
44
50
|
return resolveRelativeUrl(url, opts.defaultOrigin)
|
package/src/controls/actions.tsx
CHANGED
|
@@ -26,7 +26,7 @@ import classes from './actions.module.css'
|
|
|
26
26
|
|
|
27
27
|
/**
|
|
28
28
|
* A button-shaped action. `Anchor` is the router seam basalt HOSTS (the same seam `SidebarItem`
|
|
29
|
-
* uses — pass
|
|
29
|
+
* uses — pass your router's `Link`); `link` is the no-router fallback
|
|
30
30
|
* and only its `to` is honoured, since resolving `search`/`params` needs a router. Supply `Anchor`
|
|
31
31
|
* whenever the destination carries either.
|
|
32
32
|
*/
|
|
@@ -74,6 +74,29 @@ export type BarActionCustom = {
|
|
|
74
74
|
|
|
75
75
|
export type BarAction = BarActionItem | BarActionMenu | BarActionCustom
|
|
76
76
|
|
|
77
|
+
/** The one primary action of a page bar (law C6): the first tuple entry, flagged `primary: true`. */
|
|
78
|
+
type PrimaryBarAction = BarAction & { primary: true }
|
|
79
|
+
/** Every other page-bar action; `primary` may only be absent or `false`. */
|
|
80
|
+
type MoreBarAction = BarAction & { primary?: false }
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* `PageBar.actions`: exactly one primary first, then up to four more. Law C6 as a type — a missing
|
|
84
|
+
* or second primary and a sixth entry are tsc errors (`docs/V2-SPEC.md` §3).
|
|
85
|
+
*/
|
|
86
|
+
export type PageBarActions =
|
|
87
|
+
| [PrimaryBarAction]
|
|
88
|
+
| [PrimaryBarAction, MoreBarAction]
|
|
89
|
+
| [PrimaryBarAction, MoreBarAction, MoreBarAction]
|
|
90
|
+
| [PrimaryBarAction, MoreBarAction, MoreBarAction, MoreBarAction]
|
|
91
|
+
| [PrimaryBarAction, MoreBarAction, MoreBarAction, MoreBarAction, MoreBarAction]
|
|
92
|
+
|
|
93
|
+
/** `Section.actions`: at most three (law C6). */
|
|
94
|
+
export type SectionActions =
|
|
95
|
+
| []
|
|
96
|
+
| [BarAction]
|
|
97
|
+
| [BarAction, BarAction]
|
|
98
|
+
| [BarAction, BarAction, BarAction]
|
|
99
|
+
|
|
77
100
|
/**
|
|
78
101
|
* A home's `actions` slot. `primary` is SINGULAR by type — that is the whole enforcement of law
|
|
79
102
|
* C6's "exactly one primary"; there is no runtime check because a second one cannot be written.
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
import { Radio, Stack } from '@mantine/core'
|
|
30
30
|
import type { ReactNode } from 'react'
|
|
31
31
|
import type { BasaltProps } from '../common/props'
|
|
32
|
-
import type { FieldOption } from '../state'
|
|
32
|
+
import type { FieldOption } from '../state/fields'
|
|
33
33
|
import classes from './controls.module.css'
|
|
34
34
|
import { POPOVER_ROW_HIT_GAP, useFilterRegistration, useFilterSurface } from './filter-context'
|
|
35
35
|
import { FilterClearButton, FilterPill } from './filter-pill'
|
|
@@ -114,7 +114,9 @@ export function useFilterRegistration(isActive: boolean, reset: () => void): voi
|
|
|
114
114
|
// A ref, so a `reset` closure that is fresh every render does not re-run the effect (and so
|
|
115
115
|
// `Reset all` always calls the LATEST setter, not the one captured at registration).
|
|
116
116
|
const resetRef = useRef(reset)
|
|
117
|
-
|
|
117
|
+
useEffect(() => {
|
|
118
|
+
resetRef.current = reset
|
|
119
|
+
})
|
|
118
120
|
const stableReset = useCallback(() => {
|
|
119
121
|
resetRef.current()
|
|
120
122
|
}, [])
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* **Desktop.** One row, `wrap: nowrap`, and it NEVER scrolls (C7). When the measured pill widths
|
|
7
7
|
* exceed the container the tail folds into a `+N` menu pill — a `ResizeObserver` on the row plus
|
|
8
8
|
* per-slot `offsetWidth`, because the fold point depends on the labels actually painted (the same
|
|
9
|
-
* reasoning as the charts'
|
|
9
|
+
* reasoning as the charts' measured margins), not on a guessed pill width.
|
|
10
10
|
*
|
|
11
11
|
* **Mobile (`< sm`).** The first `inline` children stay pills; every child — inline ones included —
|
|
12
12
|
* also renders its full-width sheet form inside the `Filters (n)` Drawer — which exists only when
|
|
@@ -173,14 +173,12 @@ export function FilterSet({
|
|
|
173
173
|
function useOverflowFit(rowRef: RefObject<HTMLDivElement | null>, count: number): number {
|
|
174
174
|
const [fit, setFit] = useState(count)
|
|
175
175
|
const widths = useRef<number[]>([])
|
|
176
|
+
const canObserve = typeof ResizeObserver !== 'undefined'
|
|
176
177
|
|
|
177
178
|
useEffect(() => {
|
|
178
179
|
const row = rowRef.current
|
|
179
180
|
if (row === null) return
|
|
180
|
-
if (
|
|
181
|
-
setFit(count)
|
|
182
|
-
return
|
|
183
|
-
}
|
|
181
|
+
if (!canObserve) return
|
|
184
182
|
|
|
185
183
|
const measure = (): void => {
|
|
186
184
|
const slots = [...row.querySelectorAll<HTMLElement>('[data-filter-slot]')]
|
|
@@ -213,9 +211,9 @@ function useOverflowFit(rowRef: RefObject<HTMLDivElement | null>, count: number)
|
|
|
213
211
|
return () => {
|
|
214
212
|
observer.disconnect()
|
|
215
213
|
}
|
|
216
|
-
}, [rowRef, count])
|
|
214
|
+
}, [rowRef, count, canObserve])
|
|
217
215
|
|
|
218
|
-
return fit
|
|
216
|
+
return canObserve ? fit : count
|
|
219
217
|
}
|
|
220
218
|
|
|
221
219
|
function fitCount(
|
|
@@ -26,8 +26,8 @@ import type { BasaltProps, SlotStylesProps } from '../common/props'
|
|
|
26
26
|
import { assertRequiredProps } from '../common/validate'
|
|
27
27
|
import { BarActionSlot } from './actions'
|
|
28
28
|
import type { SlotActions } from './actions'
|
|
29
|
-
import { WidgetHeader } from '../dashboard'
|
|
30
|
-
import type { WidgetHeaderTitleProps } from '../dashboard'
|
|
29
|
+
import { WidgetHeader } from '../dashboard/widget-header'
|
|
30
|
+
import type { WidgetHeaderTitleProps } from '../dashboard/widget-header'
|
|
31
31
|
import { useFormState } from '../forms/form-state'
|
|
32
32
|
import classes from './form-layout.module.css'
|
|
33
33
|
|