basalt-ui 1.41.0 → 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 +46 -43
- package/CHANGELOG.md +535 -518
- package/MIGRATING.md +945 -37
- package/README.md +171 -366
- package/agent/rules/basalt-batteries.md +19 -74
- package/agent/rules/basalt-charts.md +21 -95
- package/agent/rules/basalt-controls.md +23 -131
- package/agent/rules/basalt-mantine.md +26 -99
- package/agent/rules/basalt-state.md +21 -103
- package/agent/rules/basalt-tokens.md +33 -114
- package/agent/skills/basalt-app/SKILL.md +229 -72
- package/agent/skills/basalt-charts/SKILL.md +23 -57
- package/agent/skills/basalt-design/SKILL.md +12 -70
- package/agent/templates/AGENTS-block.md.tpl +16 -26
- package/agent/templates/DESIGN.md.tpl +1 -1
- package/agent/templates/__root.tpl +9 -16
- package/agent/templates/main.tpl +21 -0
- package/agent/templates/nav.tpl +18 -0
- package/configs/oxlint-basalt.json +4 -10
- package/configs/oxlint-plugin.js +465 -844
- package/configs/oxlint-plugin.test.ts +661 -709
- package/configs/oxlint.json +10 -2
- package/dist/agent/ai-sdk-transport.d.ts +19 -7
- package/dist/agent/ai-sdk-transport.d.ts.map +1 -1
- package/dist/agent/ai-sdk-transport.js +10 -7
- package/dist/{agent-chat → agent/chat}/composer.d.ts +16 -16
- package/dist/agent/chat/composer.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/composer.js +10 -9
- package/dist/{agent-chat → agent/chat}/message-affordances.d.ts +7 -6
- package/dist/agent/chat/message-affordances.d.ts.map +1 -0
- package/dist/agent/chat/relative-time.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-feed-row.d.ts +18 -16
- package/dist/agent/chat/thread-feed-row.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-feed-row.js +12 -11
- package/dist/{agent-chat → agent/chat}/thread-feed.d.ts +8 -8
- package/dist/agent/chat/thread-feed.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-feed.js +12 -10
- package/dist/{agent-chat → agent/chat}/thread-message.d.ts +12 -9
- package/dist/agent/chat/thread-message.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-message.js +15 -13
- package/dist/{agent-chat → agent/chat}/thread-outcome-card.d.ts +2 -2
- package/dist/agent/chat/thread-outcome-card.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-outcome-card.js +3 -3
- package/dist/{agent-chat → agent/chat}/tool-chip.d.ts +5 -5
- package/dist/agent/chat/tool-chip.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/tool-chip.js +4 -4
- package/dist/agent/chat/use-keyboard-inset.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/use-keyboard-inset.js +1 -1
- package/dist/{agent-chat → agent/chat}/virtualize.d.ts +7 -7
- package/dist/agent/chat/virtualize.d.ts.map +1 -0
- package/dist/agent/error.d.ts +31 -0
- package/dist/agent/error.d.ts.map +1 -0
- package/dist/agent/error.js +18 -0
- package/dist/agent/history.d.ts +2 -36
- package/dist/agent/history.d.ts.map +1 -1
- package/dist/agent/history.js +0 -32
- package/dist/agent/id.d.ts +4 -5
- package/dist/agent/id.d.ts.map +1 -1
- package/dist/agent/index.d.ts +19 -52
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +10 -32
- package/dist/agent/outcome.d.ts +3 -14
- package/dist/agent/outcome.d.ts.map +1 -1
- package/dist/agent/outcome.js +0 -30
- package/dist/agent/part-list.d.ts +3 -3
- package/dist/agent/part-list.d.ts.map +1 -1
- package/dist/agent/parts.d.ts +23 -24
- package/dist/agent/parts.d.ts.map +1 -1
- package/dist/agent/run-committer.d.ts +23 -0
- package/dist/agent/run-committer.d.ts.map +1 -0
- package/dist/agent/run-committer.js +41 -0
- package/dist/agent/run-records.d.ts +77 -0
- package/dist/agent/run-records.d.ts.map +1 -0
- package/dist/agent/run-records.js +69 -0
- package/dist/agent/thread.d.ts +23 -47
- package/dist/agent/thread.d.ts.map +1 -1
- package/dist/agent/thread.js +3 -134
- package/dist/agent/transport.d.ts +6 -69
- package/dist/agent/transport.d.ts.map +1 -1
- package/dist/agent/transport.js +0 -18
- package/dist/agent/use-agent-thread-runs.d.ts +63 -26
- package/dist/agent/use-agent-thread-runs.d.ts.map +1 -1
- package/dist/agent/use-agent-thread-runs.js +202 -66
- package/dist/charts/BandStrip.d.ts +46 -0
- package/dist/charts/BandStrip.d.ts.map +1 -0
- package/dist/charts/BandStrip.js +151 -0
- package/dist/charts/Bars.d.ts +19 -0
- package/dist/charts/Bars.d.ts.map +1 -0
- package/dist/charts/Bars.js +77 -0
- package/dist/charts/CartesianChart.d.ts +57 -0
- package/dist/charts/CartesianChart.d.ts.map +1 -0
- package/dist/charts/CartesianChart.js +121 -0
- package/dist/charts/ChartCard.d.ts +34 -0
- package/dist/charts/ChartCard.d.ts.map +1 -0
- package/dist/charts/ChartCard.js +115 -0
- package/dist/charts/Donut.d.ts +25 -0
- package/dist/charts/Donut.d.ts.map +1 -0
- package/dist/charts/Donut.js +191 -0
- package/dist/charts/DualPanel.d.ts +47 -0
- package/dist/charts/DualPanel.d.ts.map +1 -0
- package/dist/charts/DualPanel.js +214 -0
- package/dist/charts/Heatmap.d.ts +41 -0
- package/dist/charts/Heatmap.d.ts.map +1 -0
- package/dist/charts/Heatmap.js +216 -0
- package/dist/charts/Lines.d.ts +11 -0
- package/dist/charts/Lines.d.ts.map +1 -0
- package/dist/charts/Lines.js +114 -0
- package/dist/charts/MirroredBars.d.ts +44 -0
- package/dist/charts/MirroredBars.d.ts.map +1 -0
- package/dist/charts/MirroredBars.js +190 -0
- package/dist/charts/Sparkline.d.ts +22 -0
- package/dist/charts/Sparkline.d.ts.map +1 -0
- package/dist/charts/Sparkline.js +129 -0
- package/dist/charts/StackedArea.d.ts +15 -0
- package/dist/charts/StackedArea.d.ts.map +1 -0
- package/dist/charts/StackedArea.js +46 -0
- package/dist/charts/box.d.ts +38 -0
- package/dist/charts/box.d.ts.map +1 -0
- package/dist/charts/box.js +72 -0
- package/dist/charts/card-context.d.ts +3 -0
- package/dist/charts/card-context.d.ts.map +1 -0
- package/dist/charts/card-context.js +7 -0
- package/dist/charts/chart-box.module.css +64 -0
- package/{src/content/article-card.module.css.d.ts → dist/charts/chart-box.module.css.d.ts} +5 -9
- package/dist/charts/chart-card.module.css +25 -0
- package/dist/{dashboard/widget-grid.module.css.d.ts → charts/chart-card.module.css.d.ts} +1 -3
- package/dist/charts/chart-legend.module.css +38 -0
- package/{src/dashboard/widget-grid.module.css.d.ts → dist/charts/chart-legend.module.css.d.ts} +3 -3
- package/dist/charts/compile.d.ts +62 -0
- package/dist/charts/compile.d.ts.map +1 -0
- package/dist/charts/compile.js +386 -0
- package/dist/charts/cursor.d.ts +50 -0
- package/dist/charts/cursor.d.ts.map +1 -0
- package/dist/charts/cursor.js +157 -0
- package/dist/charts/curves.d.ts +12 -0
- package/dist/charts/curves.d.ts.map +1 -0
- package/dist/charts/curves.js +86 -0
- package/dist/charts/donut.module.css +54 -0
- package/dist/{content/article-card.module.css.d.ts → charts/donut.module.css.d.ts} +2 -9
- package/dist/charts/host.d.ts +17 -0
- package/dist/charts/host.d.ts.map +1 -0
- package/dist/charts/host.js +35 -0
- package/dist/charts/index.d.ts +18 -53
- package/dist/charts/index.d.ts.map +1 -1
- package/dist/charts/index.js +17 -189
- package/dist/charts/legend.d.ts +23 -0
- package/dist/charts/legend.d.ts.map +1 -0
- package/dist/charts/legend.js +160 -0
- package/dist/charts/marks.d.ts +25 -0
- package/dist/charts/marks.d.ts.map +1 -0
- package/dist/charts/marks.js +128 -0
- package/dist/charts/panel.d.ts +56 -0
- package/dist/charts/panel.d.ts.map +1 -0
- package/dist/charts/panel.js +123 -0
- package/dist/charts/scales.d.ts +44 -0
- package/dist/charts/scales.d.ts.map +1 -0
- package/dist/charts/scales.js +163 -0
- package/dist/charts/sizing.d.ts +12 -0
- package/dist/charts/sizing.d.ts.map +1 -0
- package/dist/charts/sizing.js +33 -0
- package/dist/charts/state.d.ts +17 -0
- package/dist/charts/state.d.ts.map +1 -0
- package/dist/charts/state.js +53 -0
- package/dist/charts/theme.d.ts +38 -19
- package/dist/charts/theme.d.ts.map +1 -1
- package/dist/charts/theme.js +48 -26
- package/dist/charts/types.d.ts +227 -0
- package/dist/charts/types.d.ts.map +1 -0
- package/dist/charts/types.js +4 -0
- package/dist/cli/audit-allows.d.ts +4 -17
- package/dist/cli/audit-allows.d.ts.map +1 -1
- package/dist/cli/config.d.ts +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 -29
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +51 -9
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +2 -4
- package/dist/cli/index.d.ts +48 -172
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +39 -132
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +43 -37
- package/dist/cli/sync.d.ts +5 -21
- package/dist/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js +4 -23
- package/dist/cli/tokens-css.d.ts +7 -28
- package/dist/cli/tokens-css.d.ts.map +1 -1
- package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
- package/dist/commands/ShortcutsHelp.js +4 -5
- package/dist/commands/define-commands.d.ts +15 -31
- package/dist/commands/define-commands.d.ts.map +1 -1
- package/dist/commands/define-commands.js +1 -11
- package/dist/commands/define-overlays.d.ts +5 -19
- package/dist/commands/define-overlays.d.ts.map +1 -1
- package/dist/commands/define-overlays.js +3 -11
- package/dist/commands/index.d.ts +10 -40
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +9 -46
- package/dist/{notifications → commands/notifications}/bell.d.ts +1 -1
- package/dist/commands/notifications/bell.d.ts.map +1 -0
- package/dist/{notifications → commands/notifications}/center.d.ts +2 -2
- package/dist/commands/notifications/center.d.ts.map +1 -0
- package/dist/{notifications → commands/notifications}/center.js +2 -2
- package/dist/{notifications → commands/notifications}/define-notifications.d.ts +3 -3
- package/dist/commands/notifications/define-notifications.d.ts.map +1 -0
- package/dist/commands/notifications/notify.d.ts +44 -0
- package/dist/commands/notifications/notify.d.ts.map +1 -0
- package/dist/commands/notifications/notify.js +79 -0
- package/dist/{notifications → commands/notifications}/store.d.ts +2 -0
- package/dist/commands/notifications/store.d.ts.map +1 -0
- package/dist/{notifications → commands/notifications}/store.js +4 -0
- package/dist/commands/projectors.d.ts +1 -131
- package/dist/commands/projectors.d.ts.map +1 -1
- package/dist/commands/projectors.js +2 -73
- package/dist/commands/shell-bridge.d.ts +3 -3
- package/dist/commands/shortcut-format.d.ts +5 -4
- package/dist/commands/shortcut-format.d.ts.map +1 -1
- package/dist/common/errors.d.ts +3 -3
- package/dist/common/use-measured-widths.d.ts.map +1 -1
- package/dist/common/use-measured-widths.js +5 -3
- package/dist/common/validate.d.ts +2 -2
- package/dist/content/article-layout.d.ts.map +1 -1
- package/dist/content/article-layout.js +3 -3
- package/dist/content/article-model.d.ts +1 -46
- package/dist/content/article-model.d.ts.map +1 -1
- package/dist/content/article-model.js +1 -29
- package/dist/content/index.d.ts +11 -41
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +3 -35
- package/dist/content/markdown.d.ts +1 -1
- package/dist/content/markdown.d.ts.map +1 -1
- package/dist/content/markdown.js +1 -1
- package/dist/content/mermaid.d.ts.map +1 -1
- package/dist/content/mermaid.js +7 -7
- package/dist/content/slug.d.ts +1 -8
- package/dist/content/slug.d.ts.map +1 -1
- package/dist/content/slug.js +1 -8
- package/dist/content/url-hardening.d.ts +2 -2
- package/dist/content/url-hardening.d.ts.map +1 -1
- package/dist/content/url-hardening.js +2 -0
- package/dist/controls/actions.d.ts +16 -1
- package/dist/controls/actions.d.ts.map +1 -1
- package/dist/controls/enum-filter.d.ts +1 -1
- package/dist/controls/enum-filter.d.ts.map +1 -1
- package/dist/controls/filter-context.d.ts.map +1 -1
- package/dist/controls/filter-context.js +3 -1
- package/dist/controls/filter-set.js +4 -6
- package/dist/controls/form-layout.d.ts +1 -1
- package/dist/controls/form-layout.d.ts.map +1 -1
- package/dist/controls/form-layout.js +1 -1
- package/dist/controls/glyphs.d.ts +0 -2
- package/dist/controls/glyphs.d.ts.map +1 -1
- package/dist/controls/glyphs.js +0 -7
- package/dist/controls/index.d.ts +12 -17
- package/dist/controls/index.d.ts.map +1 -1
- package/dist/controls/index.js +5 -39
- package/dist/controls/multi-select-filter.d.ts +4 -3
- package/dist/controls/multi-select-filter.d.ts.map +1 -1
- package/dist/controls/number-filter.d.ts +4 -3
- package/dist/controls/number-filter.d.ts.map +1 -1
- package/dist/controls/number-filter.js +3 -1
- package/dist/controls/range-filter.d.ts +4 -3
- package/dist/controls/range-filter.d.ts.map +1 -1
- package/dist/controls/search-filter.d.ts +4 -3
- package/dist/controls/search-filter.d.ts.map +1 -1
- package/dist/controls/search-filter.js +19 -14
- package/dist/controls/select-filter.d.ts +4 -3
- package/dist/controls/select-filter.d.ts.map +1 -1
- package/dist/controls/sync-button.d.ts.map +1 -1
- package/dist/controls/sync-button.js +12 -15
- package/dist/controls/toggle-filter.d.ts +4 -3
- package/dist/controls/toggle-filter.d.ts.map +1 -1
- package/dist/controls/uncontrolled.d.ts +12 -0
- package/dist/controls/uncontrolled.d.ts.map +1 -0
- package/dist/controls/view-tabs.d.ts +2 -2
- package/dist/controls/view-tabs.d.ts.map +1 -1
- package/dist/controls-dates/index.d.ts +0 -1
- package/dist/controls-dates/index.d.ts.map +1 -1
- package/dist/dashboard/index.d.ts +7 -9
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/index.js +3 -23
- package/dist/dashboard/section.d.ts +4 -6
- package/dist/dashboard/section.d.ts.map +1 -1
- package/dist/dashboard/section.js +4 -10
- package/dist/dashboard/stat-card.d.ts +4 -4
- package/dist/dashboard/stat-card.d.ts.map +1 -1
- package/dist/dashboard/stat-card.js +3 -3
- package/dist/dashboard/widget-header.module.css +9 -7
- package/dist/dev-dock.d.ts.map +1 -1
- package/dist/dev-dock.js +6 -1
- package/dist/format/date.d.ts +0 -34
- package/dist/format/date.d.ts.map +1 -1
- package/dist/format/date.js +0 -54
- package/dist/format/index.d.ts +7 -22
- package/dist/format/index.d.ts.map +1 -1
- package/dist/format/index.js +2 -43
- package/dist/format/number.d.ts +3 -14
- package/dist/format/number.d.ts.map +1 -1
- package/dist/format/number.js +0 -13
- package/dist/format/shared.d.ts +2 -3
- package/dist/format/shared.d.ts.map +1 -1
- package/dist/forms/index.d.ts +0 -11
- package/dist/forms/index.d.ts.map +1 -1
- package/dist/forms/index.js +1 -14
- package/dist/guard/index.d.ts +6 -21
- package/dist/guard/index.d.ts.map +1 -1
- package/dist/guard/index.js +27 -115
- package/dist/guard/types.d.ts +7 -18
- package/dist/guard/types.d.ts.map +1 -1
- package/dist/index.d.ts +16 -48
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -117
- package/dist/provider/create-router.d.ts +44 -0
- package/dist/provider/create-router.d.ts.map +1 -0
- package/dist/provider/create-router.js +62 -0
- package/dist/provider/hotkeys.d.ts +8 -0
- package/dist/provider/hotkeys.d.ts.map +1 -0
- package/dist/provider/hotkeys.js +50 -0
- package/dist/provider/index.d.ts +33 -110
- package/dist/provider/index.d.ts.map +1 -1
- package/dist/provider/index.js +182 -82
- package/dist/provider/lab-theme.d.ts.map +1 -1
- package/dist/provider/route-transition.d.ts +76 -0
- package/dist/provider/route-transition.d.ts.map +1 -0
- package/dist/provider/route-transition.js +98 -0
- package/dist/provider/spotlight-actions.d.ts +10 -0
- package/dist/provider/spotlight-actions.d.ts.map +1 -0
- package/dist/provider/spotlight-actions.js +55 -0
- package/dist/provider/test-router.d.ts +6 -0
- package/dist/provider/test-router.d.ts.map +1 -0
- package/dist/provider/test-router.js +18 -0
- package/dist/query-client.d.ts +4 -20
- package/dist/query-client.d.ts.map +1 -1
- package/dist/query-client.js +2 -2
- package/dist/router-tanstack/index.d.ts +18 -64
- package/dist/router-tanstack/index.d.ts.map +1 -1
- package/dist/router-tanstack/index.js +2 -16
- package/dist/router-tanstack/nav.d.ts +12 -1
- package/dist/router-tanstack/nav.d.ts.map +1 -1
- package/dist/router-tanstack/nav.js +8 -1
- package/dist/router-tanstack/search-store.d.ts +1 -1
- package/dist/router-tanstack/search-store.d.ts.map +1 -1
- package/dist/router-tanstack/use-nav.d.ts +8 -9
- package/dist/router-tanstack/use-nav.d.ts.map +1 -1
- package/dist/router-tanstack/use-nav.js +20 -1
- package/dist/shell/app-mobile-nav.d.ts.map +1 -1
- package/dist/shell/app-sidebar.js +1 -1
- package/dist/shell/index.d.ts +31 -10
- package/dist/shell/index.d.ts.map +1 -1
- package/dist/shell/index.js +14 -3
- package/dist/shell/page-aside.d.ts +2 -2
- package/dist/shell/page-aside.d.ts.map +1 -1
- package/dist/shell/page-aside.js +31 -12
- package/dist/shell/page-bar.d.ts +2 -2
- package/dist/shell/page-bar.d.ts.map +1 -1
- package/dist/shell/page-bar.js +1 -1
- package/dist/state.d.ts +10 -12
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +4 -6
- package/dist/styles.css +107 -7
- package/dist/surfaces.d.ts +28 -103
- package/dist/surfaces.d.ts.map +1 -1
- package/dist/surfaces.js +54 -143
- package/dist/{data → table}/data-table-state.d.ts +1 -1
- package/dist/table/data-table-state.d.ts.map +1 -0
- package/dist/{data → table}/data-table-state.js +4 -3
- package/dist/{data → table}/data-table.d.ts +28 -49
- package/dist/table/data-table.d.ts.map +1 -0
- package/dist/{data → table}/data-table.js +74 -60
- package/dist/table/index.d.ts +18 -0
- package/dist/table/index.d.ts.map +1 -0
- package/dist/{data/table.js → table/index.js} +1 -1
- package/dist/table/query-branch.d.ts.map +1 -0
- package/dist/table/table-features.d.ts +69 -0
- package/dist/table/table-features.d.ts.map +1 -0
- package/dist/table/table-features.js +49 -0
- package/dist/telemetry.d.ts +77 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +33 -0
- package/dist/theme/index.d.ts +10 -21
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +3 -14
- package/dist/theme/theme-toggle.d.ts.map +1 -1
- package/dist/theme/theme-toggle.js +7 -33
- package/dist/theme/theme-toggle.module.css +30 -0
- package/dist/theme/theme-toggle.module.css.d.ts +10 -0
- package/dist/theme-lab/derive-controls.d.ts.map +1 -1
- package/dist/theme-lab/derive-controls.js +5 -3
- package/dist/theme-lab/derive-state.d.ts.map +1 -1
- package/dist/theme-lab/derive-state.js +2 -1
- package/dist/tokens/core.d.ts +360 -0
- package/dist/tokens/core.d.ts.map +1 -0
- package/dist/tokens/core.js +708 -0
- package/dist/tokens/derive.d.ts +1 -1
- package/dist/tokens/derive.d.ts.map +1 -1
- package/dist/tokens/index.d.ts +5 -373
- package/dist/tokens/index.d.ts.map +1 -1
- package/dist/tokens/index.js +8 -700
- package/dist/tokens/palette.d.ts +2 -6
- package/dist/tokens/palette.d.ts.map +1 -1
- package/dist/tokens/palette.js +1 -4
- package/dist/vite.d.ts +4 -3
- package/dist/vite.d.ts.map +1 -1
- package/llms.txt +43 -85
- package/package.json +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/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 +81 -72
- package/src/cli/help.ts +2 -4
- package/src/cli/index.ts +100 -384
- package/src/cli/init.ts +60 -51
- package/src/cli/sync.ts +13 -68
- package/src/cli/tokens-css.ts +7 -28
- package/src/commands/ShortcutsHelp.tsx +8 -9
- package/src/commands/define-commands.ts +16 -43
- package/src/commands/define-overlays.ts +12 -36
- package/src/commands/index.ts +11 -94
- package/src/{notifications → commands/notifications}/bell.tsx +2 -2
- package/src/{notifications → commands/notifications}/center.tsx +7 -5
- package/src/{notifications → commands/notifications}/define-notifications.ts +3 -3
- package/src/commands/notifications/notify.tsx +158 -0
- package/src/{notifications → commands/notifications}/store.ts +10 -2
- package/src/commands/projectors.ts +5 -225
- package/src/commands/shell-bridge.ts +5 -5
- package/src/commands/shortcut-format.ts +5 -4
- package/src/common/errors.ts +3 -3
- package/src/common/use-measured-widths.ts +6 -3
- package/src/common/validate.ts +2 -2
- package/src/content/article-layout.tsx +37 -38
- package/src/content/article-model.ts +1 -84
- package/src/content/index.ts +12 -83
- package/src/content/markdown.tsx +4 -3
- package/src/content/mermaid.tsx +9 -7
- package/src/content/slug.ts +1 -16
- package/src/content/url-hardening.ts +8 -2
- package/src/controls/actions.tsx +24 -1
- package/src/controls/enum-filter.tsx +1 -1
- package/src/controls/filter-context.tsx +3 -1
- package/src/controls/filter-set.tsx +5 -7
- package/src/controls/form-layout.tsx +2 -2
- package/src/controls/glyphs.tsx +0 -10
- package/src/controls/index.ts +13 -64
- package/src/controls/multi-select-filter.tsx +5 -4
- package/src/controls/number-filter.tsx +8 -4
- package/src/controls/range-filter.tsx +5 -4
- package/src/controls/search-filter.tsx +25 -19
- package/src/controls/select-filter.tsx +5 -4
- package/src/controls/sync-button.tsx +18 -20
- package/src/controls/toggle-filter.tsx +5 -4
- package/src/controls/uncontrolled.ts +12 -0
- package/src/controls/view-tabs.tsx +3 -3
- package/src/controls-dates/date-range-picker.tsx +1 -1
- package/src/controls-dates/index.ts +0 -1
- package/src/dashboard/index.ts +7 -48
- package/src/dashboard/section.tsx +11 -40
- package/src/dashboard/stat-card.tsx +14 -16
- package/src/dashboard/widget-header.module.css +9 -7
- package/src/dev-dock.tsx +14 -27
- package/src/format/date.ts +2 -92
- package/src/format/index.ts +7 -53
- package/src/format/number.ts +3 -26
- package/src/format/shared.ts +2 -3
- package/src/forms/index.ts +0 -23
- package/src/guard/index.ts +36 -191
- package/src/guard/types.ts +6 -19
- package/src/index.ts +30 -282
- package/src/provider/create-router.tsx +138 -0
- package/src/provider/hotkeys.ts +70 -0
- package/src/provider/index.tsx +260 -230
- package/src/provider/lab-theme.ts +3 -2
- package/src/provider/route-transition.ts +199 -0
- package/src/provider/spotlight-actions.tsx +69 -0
- package/src/provider/test-router.tsx +25 -0
- package/src/query-client.ts +4 -22
- package/src/router-tanstack/index.ts +18 -112
- package/src/router-tanstack/nav.ts +28 -2
- package/src/router-tanstack/search-store.ts +9 -2
- package/src/router-tanstack/use-nav.ts +47 -13
- package/src/shell/app-mobile-nav.tsx +3 -2
- package/src/shell/app-sidebar.tsx +1 -1
- package/src/shell/aside-docking.ts +1 -1
- package/src/shell/index.tsx +61 -20
- package/src/shell/page-aside.tsx +47 -23
- package/src/shell/page-bar.tsx +3 -3
- package/src/shell/page-title.tsx +1 -1
- package/src/state.ts +11 -37
- package/src/styles.css +107 -7
- package/src/surfaces.ts +56 -151
- package/src/{data → table}/data-table-state.ts +5 -4
- package/src/{data → table}/data-table.tsx +170 -161
- package/src/table/index.ts +18 -0
- package/src/table/table-features.ts +102 -0
- package/src/telemetry.ts +110 -0
- package/src/theme/index.ts +22 -47
- package/src/theme/theme-toggle.module.css +30 -0
- package/src/theme/theme-toggle.module.css.d.ts +10 -0
- package/src/theme/theme-toggle.tsx +15 -43
- package/src/theme-lab/derive-controls.tsx +5 -3
- package/src/theme-lab/derive-state.ts +2 -1
- package/src/tokens/core.ts +1163 -0
- package/src/tokens/derive.ts +1 -1
- package/src/tokens/index.ts +14 -1181
- package/src/tokens/palette.ts +3 -7
- package/src/vite.ts +3 -3
- package/agent/templates/query-client.ts.tpl +0 -26
- package/dist/agent/adapter.d.ts +0 -150
- package/dist/agent/adapter.d.ts.map +0 -1
- package/dist/agent/adapter.js +0 -482
- package/dist/agent/use-agent-stream.d.ts +0 -35
- package/dist/agent/use-agent-stream.d.ts.map +0 -1
- package/dist/agent/use-agent-stream.js +0 -59
- package/dist/agent-chat/composer.d.ts.map +0 -1
- package/dist/agent-chat/index.d.ts +0 -31
- package/dist/agent-chat/index.d.ts.map +0 -1
- package/dist/agent-chat/index.js +0 -19
- package/dist/agent-chat/message-affordances.d.ts.map +0 -1
- package/dist/agent-chat/relative-time.d.ts.map +0 -1
- package/dist/agent-chat/thread-detail-panel.d.ts +0 -28
- package/dist/agent-chat/thread-detail-panel.d.ts.map +0 -1
- package/dist/agent-chat/thread-detail-panel.js +0 -115
- package/dist/agent-chat/thread-feed-row.d.ts.map +0 -1
- package/dist/agent-chat/thread-feed.d.ts.map +0 -1
- package/dist/agent-chat/thread-message.d.ts.map +0 -1
- package/dist/agent-chat/thread-outcome-card.d.ts.map +0 -1
- package/dist/agent-chat/thread-workspace.d.ts +0 -44
- package/dist/agent-chat/thread-workspace.d.ts.map +0 -1
- package/dist/agent-chat/thread-workspace.js +0 -153
- package/dist/agent-chat/tool-chip.d.ts.map +0 -1
- package/dist/agent-chat/use-keyboard-inset.d.ts.map +0 -1
- package/dist/agent-chat/virtualize.d.ts.map +0 -1
- package/dist/charts/cursor/resolve.d.ts +0 -75
- package/dist/charts/cursor/resolve.d.ts.map +0 -1
- package/dist/charts/cursor/resolve.js +0 -91
- package/dist/charts/cursor/scope.d.ts +0 -20
- package/dist/charts/cursor/scope.d.ts.map +0 -1
- package/dist/charts/cursor/scope.js +0 -20
- package/dist/charts/cursor/store.d.ts +0 -35
- package/dist/charts/cursor/store.d.ts.map +0 -1
- package/dist/charts/cursor/store.js +0 -25
- package/dist/charts/cursor/touch-pin.d.ts +0 -45
- package/dist/charts/cursor/touch-pin.d.ts.map +0 -1
- package/dist/charts/cursor/touch-pin.js +0 -79
- package/dist/charts/hooks/use-discrete-cursor.d.ts +0 -66
- package/dist/charts/hooks/use-discrete-cursor.d.ts.map +0 -1
- package/dist/charts/hooks/use-discrete-cursor.js +0 -198
- package/dist/charts/hooks/use-hysteresis.d.ts +0 -18
- package/dist/charts/hooks/use-hysteresis.d.ts.map +0 -1
- package/dist/charts/hooks/use-hysteresis.js +0 -12
- package/dist/charts/hooks/useBandPlot.d.ts +0 -145
- package/dist/charts/hooks/useBandPlot.d.ts.map +0 -1
- package/dist/charts/hooks/useBandPlot.js +0 -178
- package/dist/charts/hooks/useChartCursor.d.ts +0 -75
- package/dist/charts/hooks/useChartCursor.d.ts.map +0 -1
- package/dist/charts/hooks/useChartCursor.js +0 -200
- package/dist/charts/hooks/useChartSize.d.ts +0 -29
- package/dist/charts/hooks/useChartSize.d.ts.map +0 -1
- package/dist/charts/hooks/useChartSize.js +0 -8
- package/dist/charts/kinds/BandStrip.d.ts +0 -132
- package/dist/charts/kinds/BandStrip.d.ts.map +0 -1
- package/dist/charts/kinds/BandStrip.js +0 -241
- package/dist/charts/kinds/Bars.d.ts +0 -141
- package/dist/charts/kinds/Bars.d.ts.map +0 -1
- package/dist/charts/kinds/Bars.js +0 -343
- package/dist/charts/kinds/Donut.d.ts +0 -77
- package/dist/charts/kinds/Donut.d.ts.map +0 -1
- package/dist/charts/kinds/Donut.js +0 -245
- package/dist/charts/kinds/DualPanel.d.ts +0 -111
- package/dist/charts/kinds/DualPanel.d.ts.map +0 -1
- package/dist/charts/kinds/DualPanel.js +0 -471
- package/dist/charts/kinds/Heatmap.d.ts +0 -85
- package/dist/charts/kinds/Heatmap.d.ts.map +0 -1
- package/dist/charts/kinds/Heatmap.js +0 -243
- package/dist/charts/kinds/MirroredBars.d.ts +0 -98
- package/dist/charts/kinds/MirroredBars.d.ts.map +0 -1
- package/dist/charts/kinds/MirroredBars.js +0 -292
- package/dist/charts/kinds/MultiLine.d.ts +0 -87
- package/dist/charts/kinds/MultiLine.d.ts.map +0 -1
- package/dist/charts/kinds/MultiLine.js +0 -176
- package/dist/charts/kinds/StackedArea.d.ts +0 -73
- package/dist/charts/kinds/StackedArea.d.ts.map +0 -1
- package/dist/charts/kinds/StackedArea.js +0 -135
- package/dist/charts/kinds/ZonedLine.d.ts +0 -97
- package/dist/charts/kinds/ZonedLine.d.ts.map +0 -1
- package/dist/charts/kinds/ZonedLine.js +0 -155
- package/dist/charts/kinds/band-chrome.d.ts +0 -31
- package/dist/charts/kinds/band-chrome.d.ts.map +0 -1
- package/dist/charts/kinds/band-chrome.js +0 -71
- package/dist/charts/kinds/donut-layout.d.ts +0 -47
- package/dist/charts/kinds/donut-layout.d.ts.map +0 -1
- package/dist/charts/kinds/donut-layout.js +0 -52
- package/dist/charts/layout/auto-margin.d.ts +0 -122
- package/dist/charts/layout/auto-margin.d.ts.map +0 -1
- package/dist/charts/layout/auto-margin.js +0 -81
- package/dist/charts/layout/end-labels.d.ts +0 -64
- package/dist/charts/layout/end-labels.d.ts.map +0 -1
- package/dist/charts/layout/end-labels.js +0 -76
- package/dist/charts/layout/log-ticks.d.ts +0 -27
- package/dist/charts/layout/log-ticks.d.ts.map +0 -1
- package/dist/charts/layout/log-ticks.js +0 -42
- package/dist/charts/primitives/AreaGradient.d.ts +0 -18
- package/dist/charts/primitives/AreaGradient.d.ts.map +0 -1
- package/dist/charts/primitives/AreaGradient.js +0 -13
- package/dist/charts/primitives/Axes.d.ts +0 -83
- package/dist/charts/primitives/Axes.d.ts.map +0 -1
- package/dist/charts/primitives/Axes.js +0 -168
- package/dist/charts/primitives/CartesianChart.d.ts +0 -257
- package/dist/charts/primitives/CartesianChart.d.ts.map +0 -1
- package/dist/charts/primitives/CartesianChart.js +0 -549
- package/dist/charts/primitives/ChartCard.d.ts +0 -66
- package/dist/charts/primitives/ChartCard.d.ts.map +0 -1
- package/dist/charts/primitives/ChartCard.js +0 -143
- package/dist/charts/primitives/ChartFrame.d.ts +0 -156
- package/dist/charts/primitives/ChartFrame.d.ts.map +0 -1
- package/dist/charts/primitives/ChartFrame.js +0 -241
- package/dist/charts/primitives/ChartLegend.d.ts +0 -67
- package/dist/charts/primitives/ChartLegend.d.ts.map +0 -1
- package/dist/charts/primitives/ChartLegend.js +0 -292
- package/dist/charts/primitives/ChartPending.d.ts +0 -113
- package/dist/charts/primitives/ChartPending.d.ts.map +0 -1
- package/dist/charts/primitives/ChartPending.js +0 -117
- package/dist/charts/primitives/ChartTooltip.d.ts +0 -59
- package/dist/charts/primitives/ChartTooltip.d.ts.map +0 -1
- package/dist/charts/primitives/ChartTooltip.js +0 -197
- package/dist/charts/primitives/Crosshair.d.ts +0 -26
- package/dist/charts/primitives/Crosshair.d.ts.map +0 -1
- package/dist/charts/primitives/Crosshair.js +0 -23
- package/dist/charts/primitives/HatchPattern.d.ts +0 -31
- package/dist/charts/primitives/HatchPattern.d.ts.map +0 -1
- package/dist/charts/primitives/HatchPattern.js +0 -31
- package/dist/charts/primitives/HoverOverlay.d.ts +0 -45
- package/dist/charts/primitives/HoverOverlay.d.ts.map +0 -1
- package/dist/charts/primitives/HoverOverlay.js +0 -72
- package/dist/charts/primitives/HoverOverlay.module.css +0 -13
- package/dist/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
- package/dist/charts/primitives/XZoneRects.d.ts +0 -54
- package/dist/charts/primitives/XZoneRects.d.ts.map +0 -1
- package/dist/charts/primitives/XZoneRects.js +0 -65
- package/dist/charts/primitives/ZoneRects.d.ts +0 -38
- package/dist/charts/primitives/ZoneRects.d.ts.map +0 -1
- package/dist/charts/primitives/ZoneRects.js +0 -30
- package/dist/charts/primitives/chart-card-context.d.ts +0 -33
- package/dist/charts/primitives/chart-card-context.d.ts.map +0 -1
- package/dist/charts/primitives/chart-card-context.js +0 -18
- package/dist/charts/primitives/chart-frame-layout.d.ts +0 -185
- package/dist/charts/primitives/chart-frame-layout.d.ts.map +0 -1
- package/dist/charts/primitives/chart-frame-layout.js +0 -175
- package/dist/charts/primitives/chart-layout.d.ts +0 -112
- package/dist/charts/primitives/chart-layout.d.ts.map +0 -1
- package/dist/charts/primitives/chart-layout.js +0 -175
- package/dist/charts/primitives/chart-tier.d.ts +0 -16
- package/dist/charts/primitives/chart-tier.d.ts.map +0 -1
- package/dist/charts/primitives/chart-tier.js +0 -44
- package/dist/charts/primitives/legend-disclosure.d.ts +0 -27
- package/dist/charts/primitives/legend-disclosure.d.ts.map +0 -1
- package/dist/charts/primitives/legend-disclosure.js +0 -153
- package/dist/charts/series.d.ts +0 -189
- package/dist/charts/series.d.ts.map +0 -1
- package/dist/charts/series.js +0 -84
- package/dist/charts/sparklines/BarSparkline.d.ts +0 -37
- package/dist/charts/sparklines/BarSparkline.d.ts.map +0 -1
- package/dist/charts/sparklines/BarSparkline.js +0 -53
- package/dist/charts/sparklines/LineSparkline.d.ts +0 -15
- package/dist/charts/sparklines/LineSparkline.d.ts.map +0 -1
- package/dist/charts/sparklines/LineSparkline.js +0 -51
- package/dist/charts/sparklines/index.d.ts +0 -3
- package/dist/charts/sparklines/index.d.ts.map +0 -1
- package/dist/charts/sparklines/index.js +0 -6
- package/dist/charts/utils/domain.d.ts +0 -35
- package/dist/charts/utils/domain.d.ts.map +0 -1
- package/dist/charts/utils/domain.js +0 -12
- package/dist/charts/utils/format.d.ts +0 -8
- package/dist/charts/utils/format.d.ts.map +0 -1
- package/dist/charts/utils/format.js +0 -20
- package/dist/charts/utils/measure-text.d.ts +0 -25
- package/dist/charts/utils/measure-text.d.ts.map +0 -1
- package/dist/charts/utils/measure-text.js +0 -64
- package/dist/charts/utils/ticks.d.ts +0 -103
- package/dist/charts/utils/ticks.d.ts.map +0 -1
- package/dist/charts/utils/ticks.js +0 -92
- package/dist/commands/overlays-mount.d.ts +0 -122
- package/dist/commands/overlays-mount.d.ts.map +0 -1
- package/dist/commands/overlays-mount.js +0 -125
- package/dist/commands/useCommandHotkeys.d.ts +0 -14
- package/dist/commands/useCommandHotkeys.d.ts.map +0 -1
- package/dist/commands/useCommandHotkeys.js +0 -45
- package/dist/content/article-actions.d.ts +0 -39
- package/dist/content/article-actions.d.ts.map +0 -1
- package/dist/content/article-actions.js +0 -28
- package/dist/content/article-card.d.ts +0 -58
- package/dist/content/article-card.d.ts.map +0 -1
- package/dist/content/article-card.js +0 -79
- package/dist/content/article-card.module.css +0 -111
- package/dist/content/mdx.d.ts +0 -20
- package/dist/content/mdx.d.ts.map +0 -1
- package/dist/content/mdx.js +0 -64
- package/dist/controls/compare-filter.d.ts +0 -42
- package/dist/controls/compare-filter.d.ts.map +0 -1
- package/dist/controls/compare-filter.js +0 -38
- package/dist/controls/slider-control.d.ts +0 -36
- package/dist/controls/slider-control.d.ts.map +0 -1
- package/dist/controls/slider-control.js +0 -64
- package/dist/dashboard/widget-grid.d.ts +0 -27
- package/dist/dashboard/widget-grid.d.ts.map +0 -1
- package/dist/dashboard/widget-grid.js +0 -40
- package/dist/dashboard/widget-grid.module.css +0 -69
- package/dist/data/data-table-state.d.ts.map +0 -1
- package/dist/data/data-table.d.ts.map +0 -1
- package/dist/data/query-branch.d.ts.map +0 -1
- package/dist/data/table.d.ts +0 -24
- package/dist/data/table.d.ts.map +0 -1
- package/dist/data/virtual-list.d.ts +0 -133
- package/dist/data/virtual-list.d.ts.map +0 -1
- package/dist/data/virtual-list.js +0 -157
- package/dist/data/virtual.d.ts +0 -21
- package/dist/data/virtual.d.ts.map +0 -1
- package/dist/data/virtual.js +0 -4
- package/dist/forms/FormErrorSummary.d.ts +0 -30
- package/dist/forms/FormErrorSummary.d.ts.map +0 -1
- package/dist/forms/FormErrorSummary.js +0 -30
- package/dist/forms/use-field-array.d.ts +0 -60
- package/dist/forms/use-field-array.d.ts.map +0 -1
- package/dist/forms/use-field-array.js +0 -20
- package/dist/forms/use-form-draft.d.ts +0 -76
- package/dist/forms/use-form-draft.d.ts.map +0 -1
- package/dist/forms/use-form-draft.js +0 -92
- package/dist/forms/use-form-submit.d.ts +0 -88
- package/dist/forms/use-form-submit.d.ts.map +0 -1
- package/dist/forms/use-form-submit.js +0 -63
- package/dist/notifications/bell.d.ts.map +0 -1
- package/dist/notifications/center.d.ts.map +0 -1
- package/dist/notifications/define-notifications.d.ts.map +0 -1
- package/dist/notifications/index.d.ts +0 -40
- package/dist/notifications/index.d.ts.map +0 -1
- package/dist/notifications/index.js +0 -54
- package/dist/notifications/mount-guard.d.ts +0 -8
- package/dist/notifications/mount-guard.d.ts.map +0 -1
- package/dist/notifications/mount-guard.js +0 -18
- package/dist/notifications/notify.d.ts +0 -149
- package/dist/notifications/notify.d.ts.map +0 -1
- package/dist/notifications/notify.js +0 -171
- package/dist/notifications/store.d.ts.map +0 -1
- package/dist/provider/connectivity-indicator.d.ts +0 -13
- package/dist/provider/connectivity-indicator.d.ts.map +0 -1
- package/dist/provider/connectivity-indicator.js +0 -205
- package/dist/provider/connectivity-provider.d.ts +0 -7
- package/dist/provider/connectivity-provider.d.ts.map +0 -1
- package/dist/provider/connectivity-provider.js +0 -128
- package/dist/provider/connectivity-types.d.ts +0 -36
- package/dist/provider/connectivity-types.d.ts.map +0 -1
- package/dist/provider/use-connectivity.d.ts +0 -3
- package/dist/provider/use-connectivity.d.ts.map +0 -1
- package/dist/provider/use-connectivity.js +0 -14
- package/dist/query-devtools.d.ts +0 -21
- package/dist/query-devtools.d.ts.map +0 -1
- package/dist/query-devtools.js +0 -13
- package/src/agent/adapter.ts +0 -945
- package/src/agent/use-agent-stream.ts +0 -154
- package/src/agent-chat/index.ts +0 -54
- package/src/agent-chat/thread-detail-panel.tsx +0 -201
- package/src/agent-chat/thread-workspace.tsx +0 -279
- package/src/charts/cursor/resolve.ts +0 -198
- package/src/charts/cursor/scope.tsx +0 -35
- package/src/charts/cursor/store.ts +0 -58
- package/src/charts/cursor/touch-pin.ts +0 -138
- package/src/charts/hooks/use-discrete-cursor.ts +0 -335
- package/src/charts/hooks/use-hysteresis.ts +0 -26
- package/src/charts/hooks/useBandPlot.ts +0 -383
- package/src/charts/hooks/useChartCursor.ts +0 -367
- package/src/charts/hooks/useChartSize.ts +0 -35
- package/src/charts/kinds/BandStrip.tsx +0 -449
- package/src/charts/kinds/Bars.tsx +0 -589
- package/src/charts/kinds/Donut.tsx +0 -368
- package/src/charts/kinds/DualPanel.tsx +0 -712
- package/src/charts/kinds/Heatmap.tsx +0 -396
- package/src/charts/kinds/MirroredBars.tsx +0 -469
- package/src/charts/kinds/MultiLine.tsx +0 -322
- package/src/charts/kinds/StackedArea.tsx +0 -267
- package/src/charts/kinds/ZonedLine.tsx +0 -301
- package/src/charts/kinds/band-chrome.tsx +0 -91
- package/src/charts/kinds/donut-layout.ts +0 -82
- package/src/charts/layout/auto-margin.ts +0 -242
- package/src/charts/layout/end-labels.ts +0 -135
- package/src/charts/layout/log-ticks.ts +0 -90
- package/src/charts/primitives/AreaGradient.tsx +0 -26
- package/src/charts/primitives/Axes.tsx +0 -271
- package/src/charts/primitives/CartesianChart.tsx +0 -1002
- package/src/charts/primitives/ChartCard.tsx +0 -280
- package/src/charts/primitives/ChartFrame.tsx +0 -493
- package/src/charts/primitives/ChartLegend.tsx +0 -422
- package/src/charts/primitives/ChartPending.tsx +0 -243
- package/src/charts/primitives/ChartTooltip.tsx +0 -265
- package/src/charts/primitives/Crosshair.tsx +0 -43
- package/src/charts/primitives/HatchPattern.tsx +0 -55
- package/src/charts/primitives/HoverOverlay.module.css +0 -13
- package/src/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
- package/src/charts/primitives/HoverOverlay.tsx +0 -109
- package/src/charts/primitives/XZoneRects.tsx +0 -132
- package/src/charts/primitives/ZoneRects.tsx +0 -67
- package/src/charts/primitives/chart-card-context.ts +0 -46
- package/src/charts/primitives/chart-frame-layout.ts +0 -430
- package/src/charts/primitives/chart-layout.ts +0 -318
- package/src/charts/primitives/chart-tier.tsx +0 -76
- package/src/charts/primitives/legend-disclosure.tsx +0 -178
- package/src/charts/series.ts +0 -276
- package/src/charts/sparklines/BarSparkline.tsx +0 -94
- package/src/charts/sparklines/LineSparkline.tsx +0 -71
- package/src/charts/sparklines/index.ts +0 -2
- package/src/charts/theme.tsx +0 -53
- package/src/charts/utils/domain.ts +0 -41
- package/src/charts/utils/format.ts +0 -19
- package/src/charts/utils/measure-text.ts +0 -109
- package/src/charts/utils/ticks.ts +0 -239
- package/src/commands/overlays-mount.tsx +0 -333
- package/src/commands/useCommandHotkeys.ts +0 -114
- package/src/content/article-actions.ts +0 -72
- package/src/content/article-card.module.css +0 -111
- package/src/content/article-card.tsx +0 -174
- package/src/content/mdx.tsx +0 -127
- package/src/controls/compare-filter.tsx +0 -81
- package/src/controls/slider-control.tsx +0 -159
- package/src/dashboard/widget-grid.module.css +0 -69
- package/src/dashboard/widget-grid.tsx +0 -146
- package/src/data/table.ts +0 -39
- package/src/data/virtual-list.tsx +0 -356
- package/src/data/virtual.ts +0 -26
- package/src/forms/FormErrorSummary.tsx +0 -71
- package/src/forms/use-field-array.ts +0 -94
- package/src/forms/use-form-draft.ts +0 -262
- package/src/forms/use-form-submit.ts +0 -199
- package/src/notifications/index.ts +0 -88
- package/src/notifications/mount-guard.ts +0 -38
- package/src/notifications/notify.tsx +0 -379
- package/src/provider/connectivity-indicator.tsx +0 -267
- package/src/provider/connectivity-provider.tsx +0 -189
- package/src/provider/connectivity-types.ts +0 -42
- package/src/provider/use-connectivity.ts +0 -26
- package/src/query-devtools.tsx +0 -40
- /package/dist/{agent-chat → agent/chat}/message-affordances.js +0 -0
- /package/dist/{agent-chat → agent/chat}/relative-time.d.ts +0 -0
- /package/dist/{agent-chat → agent/chat}/relative-time.js +0 -0
- /package/dist/{agent-chat → agent/chat}/use-keyboard-inset.d.ts +0 -0
- /package/dist/{agent-chat → agent/chat}/virtualize.js +0 -0
- /package/dist/{notifications → commands/notifications}/bell.js +0 -0
- /package/dist/{notifications → commands/notifications}/define-notifications.js +0 -0
- /package/dist/{provider/connectivity-types.js → controls/uncontrolled.js} +0 -0
- /package/dist/{data → table}/data-table.module.css +0 -0
- /package/dist/{data → table}/data-table.module.css.d.ts +0 -0
- /package/dist/{data → table}/query-branch.d.ts +0 -0
- /package/dist/{data → table}/query-branch.js +0 -0
- /package/src/{agent-chat → agent/chat}/relative-time.ts +0 -0
- /package/src/{data → table}/data-table.module.css +0 -0
- /package/src/{data → table}/data-table.module.css.d.ts +0 -0
- /package/src/{data → table}/query-branch.ts +0 -0
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The shared cursor (`docs/V2-SPEC.md` § 9.4). One TanStack `createChartCursor()` per group in a
|
|
3
|
+
* module map — no provider. Every chart joins `'default'` unless it names a `cursorGroup`.
|
|
4
|
+
*
|
|
5
|
+
* CLIENT-ONLY BY CONSTRUCTION. The map is module state, so on a server it would be shared by every
|
|
6
|
+
* concurrent request. Without `window`, `chartCursor()` is the inert controller (null state, no-op
|
|
7
|
+
* set/subscribe) and no entry is created. The engine never reads a binding during SSR anyway:
|
|
8
|
+
* `prerender()` renders the scene, and the binding is consumed by `mountChartRenderer` from a layout
|
|
9
|
+
* effect. Bindings resolve their controller per call, never at compile time.
|
|
10
|
+
*
|
|
11
|
+
* TEARDOWN. A group's entry is refcounted by its live `subscribe` registrations; the last
|
|
12
|
+
* unsubscribe drops it one microtask later (a host re-binding unsubscribes before it resubscribes,
|
|
13
|
+
* and must not lose the group's state in between). Only `subscribe` creates an entry: `getState` on
|
|
14
|
+
* a missing group returns `null` and `setState` on one is a no-op.
|
|
15
|
+
*/
|
|
16
|
+
import { createChartCursor, cursorHost } from '@tanstack/charts/cursor'
|
|
17
|
+
import type { ChartCursorController } from '@tanstack/charts/cursor'
|
|
18
|
+
import { resolveChartFocusStrategy } from '@tanstack/charts/cursor/host'
|
|
19
|
+
import type {
|
|
20
|
+
ChartCursorBinding,
|
|
21
|
+
ChartFocusStrategy,
|
|
22
|
+
ChartValue,
|
|
23
|
+
} from '@tanstack/charts/types/core'
|
|
24
|
+
import type { ChartX, CursorResolution } from './types'
|
|
25
|
+
|
|
26
|
+
type CursorState = ReturnType<ChartCursorController['getState']>
|
|
27
|
+
|
|
28
|
+
type Entry = { controller: ChartCursorController; subscribers: number }
|
|
29
|
+
|
|
30
|
+
const groups = new Map<string, Entry>()
|
|
31
|
+
const facades = new Map<string, ChartCursorController>()
|
|
32
|
+
|
|
33
|
+
const INERT: ChartCursorController = {
|
|
34
|
+
getState: () => null,
|
|
35
|
+
setState: () => {},
|
|
36
|
+
subscribe: () => () => {},
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const isServer = (): boolean => typeof window === 'undefined'
|
|
40
|
+
|
|
41
|
+
/** Drops `key` a microtask after its entry idles: a host re-binding releases before it re-acquires. */
|
|
42
|
+
function sweepWhenIdle<E extends { subscribers: number }>(
|
|
43
|
+
map: Map<string, E>,
|
|
44
|
+
key: string,
|
|
45
|
+
entry: E,
|
|
46
|
+
): void {
|
|
47
|
+
queueMicrotask(() => {
|
|
48
|
+
if (entry.subscribers === 0 && map.get(key) === entry) map.delete(key)
|
|
49
|
+
})
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Counts a live subscription; the returned release runs `unsubscribe` once, sweeping at zero. */
|
|
53
|
+
function retain<E extends { subscribers: number }>(
|
|
54
|
+
map: Map<string, E>,
|
|
55
|
+
key: string,
|
|
56
|
+
entry: E,
|
|
57
|
+
unsubscribe: () => void,
|
|
58
|
+
): () => void {
|
|
59
|
+
entry.subscribers += 1
|
|
60
|
+
let live = true
|
|
61
|
+
return () => {
|
|
62
|
+
if (!live) return
|
|
63
|
+
live = false
|
|
64
|
+
unsubscribe()
|
|
65
|
+
entry.subscribers -= 1
|
|
66
|
+
if (entry.subscribers === 0) sweepWhenIdle(map, key, entry)
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function ensure(group: string): Entry {
|
|
71
|
+
let entry = groups.get(group)
|
|
72
|
+
if (!entry) {
|
|
73
|
+
entry = { controller: createChartCursor(), subscribers: 0 }
|
|
74
|
+
groups.set(group, entry)
|
|
75
|
+
}
|
|
76
|
+
return entry
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const facade = (group: string): ChartCursorController => ({
|
|
80
|
+
getState: () => groups.get(group)?.controller.getState() ?? null,
|
|
81
|
+
// No subscriber, no entry: a write to a group nothing listens to would only leak one.
|
|
82
|
+
setState: (next) => groups.get(group)?.controller.setState(next),
|
|
83
|
+
subscribe: (listener) => {
|
|
84
|
+
const entry = ensure(group)
|
|
85
|
+
return retain(groups, group, entry, entry.controller.subscribe(listener))
|
|
86
|
+
},
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* The cursor controller for a group (default `'default'`), for app-side sync — a map timeline that
|
|
91
|
+
* follows the charts, or drives them:
|
|
92
|
+
*
|
|
93
|
+
* ```ts
|
|
94
|
+
* const cursor = chartCursor()
|
|
95
|
+
* const state = useSyncExternalStore(cursor.subscribe, cursor.getState, () => null)
|
|
96
|
+
* ```
|
|
97
|
+
*
|
|
98
|
+
* The same object for the same group, so `useSyncExternalStore` never resubscribes per render. On
|
|
99
|
+
* the server it is inert.
|
|
100
|
+
*/
|
|
101
|
+
export function chartCursor(group = 'default'): ChartCursorController {
|
|
102
|
+
if (isServer()) return INERT
|
|
103
|
+
let controller = facades.get(group)
|
|
104
|
+
if (!controller) {
|
|
105
|
+
controller = facade(group)
|
|
106
|
+
facades.set(group, controller)
|
|
107
|
+
}
|
|
108
|
+
return controller
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** Test seam: whether a group currently has an entry. */
|
|
112
|
+
export const hasCursorGroup = (group: string): boolean => groups.has(group)
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Which chart published a state, keyed by the state OBJECT: TanStack clears only the exact object a
|
|
116
|
+
* host published, so a stamp must never change its identity. A programmatic state (an app timeline)
|
|
117
|
+
* has no owner, so every chart treats it as foreign.
|
|
118
|
+
*/
|
|
119
|
+
const owners = new WeakMap<object, string>()
|
|
120
|
+
|
|
121
|
+
function stamp(state: CursorState, chartId: string): CursorState {
|
|
122
|
+
if (state) owners.set(state, chartId)
|
|
123
|
+
return state
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export function isForeign(group: string | undefined, chartId: string): boolean {
|
|
127
|
+
const state = chartCursor(group).getState()
|
|
128
|
+
return state !== null && owners.get(state) !== chartId
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const valueX = (state: CursorState): ChartValue | undefined =>
|
|
132
|
+
state?.anchor === 'value' ? state.value.x : undefined
|
|
133
|
+
|
|
134
|
+
/** Snaps a foreign x value onto this chart's own x values; `null` = no snap (exact). */
|
|
135
|
+
function snapper(
|
|
136
|
+
keys: readonly ChartX[],
|
|
137
|
+
mode: CursorResolution,
|
|
138
|
+
): ((x: ChartValue) => ChartValue | undefined) | null {
|
|
139
|
+
const first = keys[0]
|
|
140
|
+
if (first === undefined || typeof first === 'string') return null
|
|
141
|
+
const isDate = first instanceof Date
|
|
142
|
+
const ts = keys
|
|
143
|
+
.map((k) => (k instanceof Date ? k.getTime() : (k as number)))
|
|
144
|
+
.toSorted((a, b) => a - b)
|
|
145
|
+
return (x) => {
|
|
146
|
+
// Charts whose x value types differ never sync (the 1.x `DomainKind` partition).
|
|
147
|
+
if (isDate !== x instanceof Date) return undefined
|
|
148
|
+
if (!isDate && typeof x !== 'number') return undefined
|
|
149
|
+
if (mode === 'exact') return x
|
|
150
|
+
const t = x instanceof Date ? x.getTime() : (x as number)
|
|
151
|
+
let i = ts.findLastIndex((k) => k <= t)
|
|
152
|
+
if (
|
|
153
|
+
mode === 'nearest' &&
|
|
154
|
+
i < ts.length - 1 &&
|
|
155
|
+
(i < 0 || (ts[i + 1] as number) - t < t - (ts[i] as number))
|
|
156
|
+
)
|
|
157
|
+
i += 1
|
|
158
|
+
const snapped = ts[Math.max(i, 0)] as number
|
|
159
|
+
if (snapped === t) return x
|
|
160
|
+
return isDate ? new Date(snapped) : snapped
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
type Snap = { snap: ReturnType<typeof snapper>; memo: WeakMap<object, CursorState> }
|
|
165
|
+
type View = { controller: ChartCursorController; config: Snap; subscribers: number }
|
|
166
|
+
|
|
167
|
+
/** One stable view per mounted chart: TanStack compares the binding's controller by reference and
|
|
168
|
+
* re-creates the cursor session when it changes, so a fresh object per compile would reset it on
|
|
169
|
+
* every re-render. Recompiling only swaps the view's snapping config. */
|
|
170
|
+
const views = new Map<string, View>()
|
|
171
|
+
|
|
172
|
+
function makeView(
|
|
173
|
+
group: string | undefined,
|
|
174
|
+
chartId: string,
|
|
175
|
+
config: () => Snap,
|
|
176
|
+
track: (unsubscribe: () => void) => () => void = (unsubscribe) => unsubscribe,
|
|
177
|
+
): ChartCursorController {
|
|
178
|
+
// Resolved per call, never at build time: a definition compiled during SSR holds no controller.
|
|
179
|
+
const shared = (): ChartCursorController => chartCursor(group)
|
|
180
|
+
return {
|
|
181
|
+
subscribe: (listener) => track(shared().subscribe(listener)),
|
|
182
|
+
setState: (next) =>
|
|
183
|
+
shared().setState(
|
|
184
|
+
typeof next === 'function' ? (prev) => stamp(next(prev), chartId) : stamp(next, chartId),
|
|
185
|
+
),
|
|
186
|
+
getState: () => {
|
|
187
|
+
const state = shared().getState()
|
|
188
|
+
const x = valueX(state)
|
|
189
|
+
const { snap, memo } = config()
|
|
190
|
+
if (!state || !snap || x === undefined) return state
|
|
191
|
+
const hit = memo.get(state)
|
|
192
|
+
if (hit !== undefined) return hit
|
|
193
|
+
const snapped = snap(x)
|
|
194
|
+
const next = snapped === x ? state : snappedState(state, snapped)
|
|
195
|
+
memo.set(state, next)
|
|
196
|
+
return next
|
|
197
|
+
},
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/** A foreign value of another x type never shows (`undefined`); otherwise a copy at the snap. */
|
|
202
|
+
function snappedState(state: NonNullable<CursorState>, x: ChartValue | undefined): CursorState {
|
|
203
|
+
if (x === undefined) return null
|
|
204
|
+
return { ...state, value: { ...state.value, x } }
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Each chart's view of its group's controller. Two jobs:
|
|
209
|
+
* - stamp what this chart publishes with its id (ownership, above);
|
|
210
|
+
* - snap a foreign value onto THIS chart's x values. TanStack matches a shared value exactly, so a
|
|
211
|
+
* weekly chart following a daily one would paint an unsnapped rule. State identity is preserved:
|
|
212
|
+
* the same object when no snap is needed, one memoized copy otherwise.
|
|
213
|
+
*
|
|
214
|
+
* The view object itself is stable per `group` + `chartId` on the client (see `views`); its entry
|
|
215
|
+
* is dropped a microtask after its last subscription ends, or after its creation if nothing
|
|
216
|
+
* subscribed by then.
|
|
217
|
+
*/
|
|
218
|
+
export function chartCursorView(
|
|
219
|
+
group: string | undefined,
|
|
220
|
+
chartId: string,
|
|
221
|
+
keys: readonly ChartX[],
|
|
222
|
+
mode: CursorResolution,
|
|
223
|
+
): ChartCursorController {
|
|
224
|
+
const config: Snap = { snap: snapper(keys, mode), memo: new WeakMap() }
|
|
225
|
+
if (isServer()) return makeView(group, chartId, () => config)
|
|
226
|
+
const id = `${group ?? 'default'}\u0000${chartId}`
|
|
227
|
+
const existing = views.get(id)
|
|
228
|
+
if (existing) {
|
|
229
|
+
existing.config = config
|
|
230
|
+
return existing.controller
|
|
231
|
+
}
|
|
232
|
+
const view: View = { controller: INERT, config, subscribers: 0 }
|
|
233
|
+
view.controller = makeView(
|
|
234
|
+
group,
|
|
235
|
+
chartId,
|
|
236
|
+
() => view.config,
|
|
237
|
+
(unsubscribe) => retain(views, id, view, unsubscribe),
|
|
238
|
+
)
|
|
239
|
+
views.set(id, view)
|
|
240
|
+
// Swept unless subscribed by then — a chart rendering a `state` placeholder compiles a view it
|
|
241
|
+
// never mounts, and must not leave a permanent entry.
|
|
242
|
+
sweepWhenIdle(views, id, view)
|
|
243
|
+
return view.controller
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Source-only tooltips. A 1.1.0 host shows a tooltip (and its `role="status"` live region) exactly
|
|
248
|
+
* when it resolves a focus point, and it resolves a shared cursor's point through the definition's
|
|
249
|
+
* focus strategy. Wrapping `group-x` so it groups nothing while a FOREIGN state is current leaves a
|
|
250
|
+
* follower with the crosshair (painted from the cursor presentation, not from focus) and nothing
|
|
251
|
+
* else.
|
|
252
|
+
*/
|
|
253
|
+
export function sourceOnlyFocus(group: string | undefined, chartId: string): ChartFocusStrategy {
|
|
254
|
+
const base = resolveChartFocusStrategy<unknown, ChartValue, ChartValue>('group-x')
|
|
255
|
+
if (!base) throw new Error('[basalt] charts: the group-x focus strategy is missing')
|
|
256
|
+
return {
|
|
257
|
+
resolve: (points, context) => base.resolve(points, context),
|
|
258
|
+
navigation: (points) => base.navigation(points),
|
|
259
|
+
group: (points, context) => (isForeign(group, chartId) ? [] : base.group(points, context)),
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
export function cursorBinding(opts: {
|
|
264
|
+
group: string | undefined
|
|
265
|
+
chartId: string
|
|
266
|
+
keys: readonly ChartX[]
|
|
267
|
+
mode: CursorResolution
|
|
268
|
+
/** Activation pins and unpins the cursor — on for a coarse pointer (§ 9.6: tap to pin). */
|
|
269
|
+
pin: boolean
|
|
270
|
+
}): ChartCursorBinding {
|
|
271
|
+
return {
|
|
272
|
+
use: cursorHost,
|
|
273
|
+
controller: chartCursorView(opts.group, opts.chartId, opts.keys, opts.mode),
|
|
274
|
+
mode: 'focus',
|
|
275
|
+
match: 'x',
|
|
276
|
+
pin: opts.pin,
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/** Test seam: whether a chart's view entry exists. */
|
|
281
|
+
export const hasCursorView = (group: string | undefined, chartId: string): boolean =>
|
|
282
|
+
views.has(`${group ?? 'default'}\u0000${chartId}`)
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ChartSeries.curve` → TanStack's `ChartCurve` contract. Written here rather than bridged through
|
|
3
|
+
* `@tanstack/charts/d3/shape`: that bridge takes a `d3-shape` curve factory, and `d3-shape` is not
|
|
4
|
+
* resolvable from basalt under an isolated linker (the engine depends on it, basalt would have to
|
|
5
|
+
* add a third peer for five interpolations). The algorithms are d3's own: `monotone` is
|
|
6
|
+
* `curveMonotoneX` (Steffen), the steps are `curveStep` / `curveStepAfter` / `curveStepBefore`.
|
|
7
|
+
*/
|
|
8
|
+
import type { ChartCurve } from '@tanstack/charts/types/core'
|
|
9
|
+
|
|
10
|
+
type Point = readonly [number, number]
|
|
11
|
+
|
|
12
|
+
export type CurveName = 'monotone' | 'linear' | 'step' | 'stepAfter' | 'stepBefore'
|
|
13
|
+
|
|
14
|
+
const fmt = (n: number): string => String(Math.round(n * 1000) / 1000)
|
|
15
|
+
const at = (p: Point): string => `${fmt(p[0])},${fmt(p[1])}`
|
|
16
|
+
|
|
17
|
+
function linear(points: readonly Point[]): string {
|
|
18
|
+
return points.map((p, i) => `${i === 0 ? 'M' : 'L'}${at(p)}`).join('')
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** `t` is where between two samples the value changes: 0 = before, 0.5 = midpoint, 1 = after. */
|
|
22
|
+
function step(points: readonly Point[], t: number): string {
|
|
23
|
+
const first = points[0]
|
|
24
|
+
if (!first) return ''
|
|
25
|
+
let d = `M${at(first)}`
|
|
26
|
+
for (let i = 1; i < points.length; i++) {
|
|
27
|
+
const [x0, y0] = points[i - 1] as Point
|
|
28
|
+
const [x1, y1] = points[i] as Point
|
|
29
|
+
const xm = x0 * (1 - t) + x1 * t
|
|
30
|
+
d += `L${fmt(xm)},${fmt(y0)}L${fmt(xm)},${fmt(y1)}`
|
|
31
|
+
if (xm !== x1) d += `L${at([x1, y1])}`
|
|
32
|
+
}
|
|
33
|
+
return d
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const sign = (n: number): number => (n < 0 ? -1 : 1)
|
|
37
|
+
|
|
38
|
+
/** d3's `slope3`: the tangent at an interior point, limited so the curve never overshoots. */
|
|
39
|
+
function interiorTangent(p0: Point, p1: Point, p2: Point): number {
|
|
40
|
+
const h0 = p1[0] - p0[0]
|
|
41
|
+
const h1 = p2[0] - p1[0]
|
|
42
|
+
const s0 = (p1[1] - p0[1]) / (h0 || (h1 < 0 ? -0 : 0))
|
|
43
|
+
const s1 = (p2[1] - p1[1]) / (h1 || (h0 < 0 ? -0 : 0))
|
|
44
|
+
const p = (s0 * h1 + s1 * h0) / (h0 + h1)
|
|
45
|
+
return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** d3's `slope2`: an end tangent from the one next to it. */
|
|
49
|
+
function endTangent(a: Point, b: Point, t: number): number {
|
|
50
|
+
const h = b[0] - a[0]
|
|
51
|
+
return h ? ((3 * (b[1] - a[1])) / h - t) / 2 : t
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function monotone(points: readonly Point[]): string {
|
|
55
|
+
if (points.length < 3) return linear(points)
|
|
56
|
+
const n = points.length
|
|
57
|
+
const t: number[] = Array.from({ length: n }, () => 0)
|
|
58
|
+
for (let i = 1; i < n - 1; i++)
|
|
59
|
+
t[i] = interiorTangent(points[i - 1] as Point, points[i] as Point, points[i + 1] as Point)
|
|
60
|
+
t[0] = endTangent(points[0] as Point, points[1] as Point, t[1] as number)
|
|
61
|
+
t[n - 1] = endTangent(points[n - 2] as Point, points[n - 1] as Point, t[n - 2] as number)
|
|
62
|
+
let d = `M${at(points[0] as Point)}`
|
|
63
|
+
for (let i = 1; i < n; i++) {
|
|
64
|
+
const [x0, y0] = points[i - 1] as Point
|
|
65
|
+
const [x1, y1] = points[i] as Point
|
|
66
|
+
const dx = (x1 - x0) / 3
|
|
67
|
+
const c1: Point = [x0 + dx, y0 + dx * (t[i - 1] as number)]
|
|
68
|
+
const c2: Point = [x1 - dx, y1 - dx * (t[i] as number)]
|
|
69
|
+
d += `C${at(c1)},${at(c2)},${at([x1, y1])}`
|
|
70
|
+
}
|
|
71
|
+
return d
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function pathFor(name: CurveName, points: readonly Point[], reversed: boolean): string {
|
|
75
|
+
switch (name) {
|
|
76
|
+
case 'linear':
|
|
77
|
+
return linear(points)
|
|
78
|
+
case 'monotone':
|
|
79
|
+
return monotone(points)
|
|
80
|
+
case 'step':
|
|
81
|
+
return step(points, 0.5)
|
|
82
|
+
// A reversed baseline walks right-to-left, so "after" becomes "before" (d3 flips `t` there).
|
|
83
|
+
case 'stepAfter':
|
|
84
|
+
return step(points, reversed ? 0 : 1)
|
|
85
|
+
case 'stepBefore':
|
|
86
|
+
return step(points, reversed ? 1 : 0)
|
|
87
|
+
default:
|
|
88
|
+
// Exhaustive at compile time; a JS caller's unknown name draws straight segments, never the
|
|
89
|
+
// name itself as path data.
|
|
90
|
+
void (name satisfies never)
|
|
91
|
+
return linear(points)
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const CACHE = new Map<CurveName, ChartCurve>()
|
|
96
|
+
|
|
97
|
+
/** The engine curve for a series curve name. `linear` maps to the engine's own straight default. */
|
|
98
|
+
export function chartCurve(name: CurveName): ChartCurve {
|
|
99
|
+
const hit = CACHE.get(name)
|
|
100
|
+
if (hit) return hit
|
|
101
|
+
const curve: ChartCurve = {
|
|
102
|
+
line: (points) => pathFor(name, points, false),
|
|
103
|
+
area: (top, bottom) => {
|
|
104
|
+
if (top.length === 0) return ''
|
|
105
|
+
const back = pathFor(name, bottom.toReversed(), true).replace(/^M/, 'L')
|
|
106
|
+
return `${pathFor(name, top, false)}${back}Z`
|
|
107
|
+
},
|
|
108
|
+
}
|
|
109
|
+
CACHE.set(name, curve)
|
|
110
|
+
return curve
|
|
111
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Donut layout, by the donut's own inline size (docs/V2-SPEC.md § 9.6, W10 SSR contract): the legend
|
|
3
|
+
* stacks under the ring below 480px and sits beside it from 480px. In CSS, so the server HTML is the
|
|
4
|
+
* hydrated layout. The literal is CONTAINER_CLASSES.regular (`breakpoint-literals.test.ts`).
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
.row {
|
|
8
|
+
display: flex;
|
|
9
|
+
flex-direction: column;
|
|
10
|
+
gap: 12px;
|
|
11
|
+
min-width: 0;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/* The ring is the sized element (its chart box fills it): the stated height per container class
|
|
15
|
+
* when stacked, a square when beside the legend. One resolution, so a responsive `height` cannot
|
|
16
|
+
* make the ring and its box disagree. */
|
|
17
|
+
.ring {
|
|
18
|
+
position: relative;
|
|
19
|
+
min-width: 0;
|
|
20
|
+
height: var(--bc-micro);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@container (min-width: 240px) {
|
|
24
|
+
.ring {
|
|
25
|
+
height: var(--bc-compact);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
@media (pointer: coarse) {
|
|
30
|
+
.ring {
|
|
31
|
+
max-height: 45svh;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
@container (min-width: 480px) {
|
|
36
|
+
.row {
|
|
37
|
+
flex-direction: row;
|
|
38
|
+
align-items: center;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/* At most 55% of the row wide, and square. */
|
|
42
|
+
.ring {
|
|
43
|
+
flex: 0 0 min(var(--bc-regular), 55cqw);
|
|
44
|
+
height: auto;
|
|
45
|
+
max-height: none;
|
|
46
|
+
aspect-ratio: 1;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
@container (min-width: 800px) {
|
|
51
|
+
.ring {
|
|
52
|
+
flex-basis: min(var(--bc-wide), 55cqw);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed CSS-module declaration (the S4 CSS-modules path). Named string props — not an index
|
|
3
|
+
* signature — so dot access stays verbatim under the package's strict flags.
|
|
4
|
+
*/
|
|
5
|
+
declare const classes: {
|
|
6
|
+
readonly row: string
|
|
7
|
+
readonly ring: string
|
|
8
|
+
}
|
|
9
|
+
export default classes
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The bare engine mount — the ONLY module that imports `@tanstack/charts/react`
|
|
3
|
+
* (`basalt/chart-host-single`). It knows a compiled definition, a size and an accessible name, and
|
|
4
|
+
* nothing about legends, placeholders or cards (`docs/V2-SPEC.md` § 9.2).
|
|
5
|
+
*
|
|
6
|
+
* The engine is never given a height: it fills a CSS-owned {@link ChartBox} and measures it, so the
|
|
7
|
+
* box is final in the server HTML and hydration only redraws the svg inside it (W10).
|
|
8
|
+
*/
|
|
9
|
+
import { Chart } from '@tanstack/charts/react'
|
|
10
|
+
import type { CSSProperties, ReactElement } from 'react'
|
|
11
|
+
import type { CartesianDefinition } from './compile'
|
|
12
|
+
import { ChartBox } from './box'
|
|
13
|
+
import type { ChartBoxHeight } from './box'
|
|
14
|
+
import { INITIAL_WIDTH } from './sizing'
|
|
15
|
+
|
|
16
|
+
export type ChartEngineProps = {
|
|
17
|
+
definition: CartesianDefinition
|
|
18
|
+
ariaLabel: string
|
|
19
|
+
/** The box height: the law when omitted, a number when fixed (see {@link ChartBoxHeight}). */
|
|
20
|
+
height?: ChartBoxHeight
|
|
21
|
+
/** Scopes the SVG resources (clip paths, gradients) — the chart's `useId`, sanitized. */
|
|
22
|
+
idPrefix: string
|
|
23
|
+
/** `touch-action: pan-y`: a vertical swipe across the chart still scrolls the page. */
|
|
24
|
+
coarse: boolean
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** `currentColor` is the axis ink. The font is pinned to mono (the 1.x tick look) and inherited by
|
|
28
|
+
* the svg — TanStack measures guides with the host's computed font. */
|
|
29
|
+
const HOST_STYLE: CSSProperties = {
|
|
30
|
+
// Overrides the host's own fallback height: the box decides, the engine measures it.
|
|
31
|
+
height: '100%',
|
|
32
|
+
color: 'var(--vx-axis)',
|
|
33
|
+
fontFamily: 'var(--basalt-font-mono)',
|
|
34
|
+
}
|
|
35
|
+
const COARSE_STYLE: CSSProperties = { ...HOST_STYLE, touchAction: 'pan-y' }
|
|
36
|
+
|
|
37
|
+
export function ChartEngine({
|
|
38
|
+
definition,
|
|
39
|
+
ariaLabel,
|
|
40
|
+
height,
|
|
41
|
+
idPrefix,
|
|
42
|
+
coarse,
|
|
43
|
+
}: ChartEngineProps): ReactElement {
|
|
44
|
+
return (
|
|
45
|
+
<ChartBox height={height}>
|
|
46
|
+
<Chart
|
|
47
|
+
definition={definition}
|
|
48
|
+
ariaLabel={ariaLabel}
|
|
49
|
+
initialWidth={INITIAL_WIDTH}
|
|
50
|
+
idPrefix={idPrefix}
|
|
51
|
+
className="basalt-chart"
|
|
52
|
+
style={coarse ? COARSE_STYLE : HOST_STYLE}
|
|
53
|
+
/>
|
|
54
|
+
</ChartBox>
|
|
55
|
+
)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** Scopes the engine's SVG resource ids per chart instance (`useId` output carries colons). */
|
|
59
|
+
export const idPrefixOf = (id: string, prefix = 'chart'): string =>
|
|
60
|
+
`basalt-${prefix}-${id.replaceAll(/[^\w-]/g, '')}`
|