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,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The composed-chart infrastructure `DualPanel` and `MirroredBars` share (`docs/V2-SPEC.md` § 9.2):
|
|
3
|
+
* two TanStack views composed with `composeViews` + `grid` + `alignX` into ONE definition — one
|
|
4
|
+
* host, one cursor, one tooltip — mounted by the rung's own `ChartShell`. A kind supplies a
|
|
5
|
+
* `PanelPlan` (its two panes and its tooltip rows) per legend state; everything else — size, legend,
|
|
6
|
+
* `state`, cursor binding, tooltip surface, guides — is the rung's or lives here once.
|
|
7
|
+
*/
|
|
8
|
+
import { crosshair } from '@tanstack/charts/crosshair'
|
|
9
|
+
import { tooltip as tooltipHost } from '@tanstack/charts/tooltip'
|
|
10
|
+
import { portal } from '@tanstack/charts/tooltip/portal'
|
|
11
|
+
import type {
|
|
12
|
+
ChartBuildContext,
|
|
13
|
+
ChartPoint,
|
|
14
|
+
ChartTooltipRow as EngineTooltipRow,
|
|
15
|
+
ChartValue,
|
|
16
|
+
StoredChartSpec,
|
|
17
|
+
} from '@tanstack/charts/types/core'
|
|
18
|
+
import { alignX, composeViews, grid } from '@tanstack/charts/view'
|
|
19
|
+
import type { ComposableResponsiveChartDefinition } from '@tanstack/charts/view'
|
|
20
|
+
import { useCallback } from 'react'
|
|
21
|
+
import type { ReactElement } from 'react'
|
|
22
|
+
import { ChartShell } from './CartesianChart'
|
|
23
|
+
import type { ChartShellProps, ShellContext } from './CartesianChart'
|
|
24
|
+
import { defaultFormatX, utcHeaderDate, visibleSeries, xGuide, yGuide } from './compile'
|
|
25
|
+
import type { CartesianDefinition } from './compile'
|
|
26
|
+
import { cursorBinding, sourceOnlyFocus } from './cursor'
|
|
27
|
+
import type { XScaleModel } from './scales'
|
|
28
|
+
import { CHART_THEME, CROSSHAIR } from './theme'
|
|
29
|
+
import type { ContainerClass } from '../tokens/size-classes'
|
|
30
|
+
import type {
|
|
31
|
+
CartesianChartProps,
|
|
32
|
+
ChartMarks,
|
|
33
|
+
ChartSeries,
|
|
34
|
+
ChartTooltipRow,
|
|
35
|
+
ChartX,
|
|
36
|
+
PlotRow,
|
|
37
|
+
} from './types'
|
|
38
|
+
|
|
39
|
+
/** One pane, built per container class: its marks and its scales (x, y, and any helper scale). */
|
|
40
|
+
export type PaneBuilder = (ctx: ChartBuildContext) => {
|
|
41
|
+
marks: ChartMarks
|
|
42
|
+
scales: StoredChartSpec['scales']
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Everything a composed kind compiles for one legend state. */
|
|
46
|
+
export type PanelPlan<T> = {
|
|
47
|
+
/** Every x value the cursor can land on, for snapping a foreign cursor. */
|
|
48
|
+
keys: readonly ChartX[]
|
|
49
|
+
top: PaneBuilder
|
|
50
|
+
bottom: PaneBuilder
|
|
51
|
+
/** The top pane's share of the grid, 0..1. */
|
|
52
|
+
topFraction: number
|
|
53
|
+
/** Space between the panes in px. */
|
|
54
|
+
gap: number
|
|
55
|
+
/** The per-series tooltip rows for a hovered datum; `tooltip.rows` and the title are the rung's. */
|
|
56
|
+
rows: (d: T) => readonly EngineTooltipRow[]
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export type PanelInput = {
|
|
60
|
+
hidden: ReadonlySet<string>
|
|
61
|
+
highlighted: string | null
|
|
62
|
+
/** The measured chart width, only when the rung is asked for it (`byWidth`), otherwise 0. */
|
|
63
|
+
width: number
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export type PanelRungProps<T, X extends ChartX> = Omit<ChartShellProps<T>, 'compile'> &
|
|
67
|
+
Pick<CartesianChartProps<T, X>, 'formatX' | 'cursorGroup' | 'cursorResolution' | 'tooltip'> & {
|
|
68
|
+
plan: (input: PanelInput) => PanelPlan<T>
|
|
69
|
+
/** Recompile on width changes: for a kind whose data depends on it (`fold`). */
|
|
70
|
+
byWidth?: boolean
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** A child's theme may not carry a background or focus ring: the composed chart owns them. */
|
|
74
|
+
const { background: _background, focusRing: _focusRing, ...PANE_THEME } = CHART_THEME
|
|
75
|
+
|
|
76
|
+
/** The least share of the height either pane keeps: the grid needs positive tracks. */
|
|
77
|
+
const MIN_PANE_SHARE = 0.02
|
|
78
|
+
|
|
79
|
+
/** A pane's y axis: the scale and the rung's guide for it. */
|
|
80
|
+
export const paneY = (opts: {
|
|
81
|
+
scale: ChartScale
|
|
82
|
+
domain: readonly [number, number]
|
|
83
|
+
format: (v: number) => string
|
|
84
|
+
ticks: number
|
|
85
|
+
cls: ContainerClass
|
|
86
|
+
}): StoredChartSpec['scales'][string] => ({
|
|
87
|
+
scale: opts.scale,
|
|
88
|
+
...yGuide({
|
|
89
|
+
cfg: { ticks: opts.ticks },
|
|
90
|
+
axis: { domain: opts.domain, format: opts.format },
|
|
91
|
+
cls: opts.cls,
|
|
92
|
+
side: 'left',
|
|
93
|
+
grid: true,
|
|
94
|
+
}),
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
type ChartScale = NonNullable<StoredChartSpec['scales'][string]>['scale']
|
|
98
|
+
|
|
99
|
+
/** The shared x axis (drawn on the bottom pane only): the rung's ticks and format. */
|
|
100
|
+
export const paneX = <X extends ChartX>(opts: {
|
|
101
|
+
scale: ChartScale
|
|
102
|
+
model: XScaleModel<X>
|
|
103
|
+
format: (v: ChartValue) => string
|
|
104
|
+
cls: ContainerClass
|
|
105
|
+
}): StoredChartSpec['scales'][string] => ({
|
|
106
|
+
scale: opts.scale,
|
|
107
|
+
...xGuide({ model: opts.model, xTicks: undefined, format: opts.format, cls: opts.cls }),
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
/** One row per datum for a series: a `null` or non-finite value is kept as a gap. */
|
|
111
|
+
export function rowsOf<T, X extends ChartX>(
|
|
112
|
+
data: readonly T[],
|
|
113
|
+
x: (d: T) => X,
|
|
114
|
+
s: ChartSeries<T>,
|
|
115
|
+
): PlotRow<T, X>[] {
|
|
116
|
+
return data.map((d) => {
|
|
117
|
+
const v = s.getValue(d)
|
|
118
|
+
return { x: x(d), y: v === null || !Number.isFinite(v) ? null : v, series: s.key, datum: d }
|
|
119
|
+
})
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** A pane as a composable view. The crosshair is per pane: together they span both. */
|
|
123
|
+
function paneView(build: PaneBuilder): ComposableResponsiveChartDefinition {
|
|
124
|
+
return {
|
|
125
|
+
chart: (ctx) => {
|
|
126
|
+
const { marks, scales } = build(ctx)
|
|
127
|
+
return {
|
|
128
|
+
marks: [...marks, crosshair({ x: CROSSHAIR, y: false })],
|
|
129
|
+
scales,
|
|
130
|
+
theme: PANE_THEME,
|
|
131
|
+
clip: true,
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/** A plotted datum is a `PlotRow` of an owned series: its source datum. Otherwise the datum is `T`. */
|
|
138
|
+
function sourceOf<T>(point: ChartPoint, owned: ReadonlySet<string>): { x: ChartValue; d: T } {
|
|
139
|
+
const datum = point.datum
|
|
140
|
+
if (typeof datum === 'object' && datum !== null && 'datum' in datum && 'series' in datum) {
|
|
141
|
+
const row = datum as PlotRow<T>
|
|
142
|
+
if (owned.has(row.series)) return { x: point.xValue, d: row.datum }
|
|
143
|
+
}
|
|
144
|
+
return { x: point.xValue, d: datum as T }
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
type DefinitionProps<T, X extends ChartX> = Pick<PanelRungProps<T, X>, 'series'> & {
|
|
148
|
+
[K in 'formatX' | 'cursorGroup' | 'cursorResolution' | 'tooltip']: PanelRungProps<T, X>[K]
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function panelDefinition<T, X extends ChartX>(
|
|
152
|
+
props: DefinitionProps<T, X>,
|
|
153
|
+
ctx: ShellContext,
|
|
154
|
+
plan: PanelPlan<T>,
|
|
155
|
+
): CartesianDefinition {
|
|
156
|
+
const { series, formatX, cursorGroup, cursorResolution = 'nearest' } = props
|
|
157
|
+
const { hidden, chartId } = ctx
|
|
158
|
+
const tooltip = props.tooltip === false ? undefined : props.tooltip
|
|
159
|
+
// A share outside 0..1 (or NaN) is clamped to leave each pane a sliver rather than throw.
|
|
160
|
+
const top = Number.isFinite(plan.topFraction)
|
|
161
|
+
? Math.min(Math.max(plan.topFraction, MIN_PANE_SHARE), 1 - MIN_PANE_SHARE)
|
|
162
|
+
: 0.5
|
|
163
|
+
const composed = composeViews({
|
|
164
|
+
views: { top: paneView(plan.top), bottom: paneView(plan.bottom) },
|
|
165
|
+
layout: grid({
|
|
166
|
+
rows: [
|
|
167
|
+
{ id: 'top', grow: top },
|
|
168
|
+
{ id: 'bottom', grow: 1 - top },
|
|
169
|
+
],
|
|
170
|
+
columns: [{ id: 'main', grow: 1 }],
|
|
171
|
+
gap: plan.gap,
|
|
172
|
+
cells: { top: { row: 'top', column: 'main' }, bottom: { row: 'bottom', column: 'main' } },
|
|
173
|
+
}),
|
|
174
|
+
links: [alignX('top', 'bottom')],
|
|
175
|
+
})
|
|
176
|
+
const owned = new Set(series.map((s) => s.key))
|
|
177
|
+
const visible = visibleSeries(series, hidden)
|
|
178
|
+
const hiddenSeries = series.filter((s) => !visible.includes(s))
|
|
179
|
+
const header = (v: ChartValue, d: T): string => {
|
|
180
|
+
if (tooltip?.formatHeader) return tooltip.formatHeader(v as X, d)
|
|
181
|
+
if (v instanceof Date && !formatX) return utcHeaderDate(v)
|
|
182
|
+
return formatX ? formatX(v as X) : defaultFormatX(v)
|
|
183
|
+
}
|
|
184
|
+
return {
|
|
185
|
+
chart: () => composed,
|
|
186
|
+
focus: tooltip?.onFollow ? 'group-x' : sourceOnlyFocus(cursorGroup, chartId),
|
|
187
|
+
maxFocusDistance: Number.POSITIVE_INFINITY,
|
|
188
|
+
cursor: cursorBinding({
|
|
189
|
+
group: cursorGroup,
|
|
190
|
+
chartId,
|
|
191
|
+
keys: plan.keys,
|
|
192
|
+
mode: cursorResolution,
|
|
193
|
+
pin: ctx.coarse,
|
|
194
|
+
}),
|
|
195
|
+
tooltip:
|
|
196
|
+
props.tooltip === false
|
|
197
|
+
? false
|
|
198
|
+
: {
|
|
199
|
+
use: tooltipHost,
|
|
200
|
+
portal,
|
|
201
|
+
anchor: 'group-center',
|
|
202
|
+
content: (points: readonly ChartPoint[]) => {
|
|
203
|
+
const primary = points[0]
|
|
204
|
+
if (!primary) return { rows: [] }
|
|
205
|
+
const { x, d } = sourceOf<T>(primary, owned)
|
|
206
|
+
const extra: readonly ChartTooltipRow[] =
|
|
207
|
+
tooltip?.rows?.(d, { visible, hidden: hiddenSeries }) ?? []
|
|
208
|
+
return { title: header(x, d), rows: [...plan.rows(d), ...extra] }
|
|
209
|
+
},
|
|
210
|
+
},
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
export function PanelRung<T, X extends ChartX>(props: PanelRungProps<T, X>): ReactElement {
|
|
215
|
+
const { plan, byWidth, formatX, cursorGroup, cursorResolution, tooltip, ...shell } = props
|
|
216
|
+
const { series } = shell
|
|
217
|
+
const compile = useCallback(
|
|
218
|
+
(ctx: ShellContext) =>
|
|
219
|
+
panelDefinition(
|
|
220
|
+
{ series, formatX, cursorGroup, cursorResolution, tooltip },
|
|
221
|
+
ctx,
|
|
222
|
+
plan({ hidden: ctx.hidden, highlighted: ctx.highlighted, width: ctx.width }),
|
|
223
|
+
),
|
|
224
|
+
[series, formatX, cursorGroup, cursorResolution, tooltip, plan],
|
|
225
|
+
)
|
|
226
|
+
return <ChartShell {...shell} compile={compile} {...(byWidth !== undefined && { byWidth })} />
|
|
227
|
+
}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scales basalt owns (`docs/V2-SPEC.md` § 9.1): every y domain, and the x scale by value type
|
|
3
|
+
* (§ 9.4). TanStack receives CONFIGURED instances, never a factory: a factory infers its domain from
|
|
4
|
+
* every scale-contributing mark (a 60–100 zone widened a 30–70 line's axis to 0–100) and cannot see
|
|
5
|
+
* a legend-hidden series.
|
|
6
|
+
*/
|
|
7
|
+
import { scaleBand } from '@tanstack/charts/scales/band'
|
|
8
|
+
import { scaleLinear } from '@tanstack/charts/scales/linear'
|
|
9
|
+
import { scalePoint } from '@tanstack/charts/scales/point'
|
|
10
|
+
import { scaleLog, scaleUtc } from 'd3-scale'
|
|
11
|
+
import type { ChartPositionScaleOptions } from '@tanstack/charts/types/core'
|
|
12
|
+
import type { AxisConfig, ChartSeries, ChartX, XZoneSpec } from './types'
|
|
13
|
+
|
|
14
|
+
const DEFAULT_AUTO_PAD = 1.1
|
|
15
|
+
|
|
16
|
+
/** Pad AWAY from zero: a positive floor moves down, a negative one further down; zero stays. */
|
|
17
|
+
export function padAutoLower(candidate: number, pad: number): number {
|
|
18
|
+
if (candidate === 0) return 0
|
|
19
|
+
return candidate > 0 ? candidate / pad : candidate * pad
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** The mirror of {@link padAutoLower}: a positive ceiling moves up, a negative one toward zero. */
|
|
23
|
+
export function padAutoUpper(candidate: number, pad: number): number {
|
|
24
|
+
if (candidate === 0) return 0
|
|
25
|
+
return candidate > 0 ? candidate * pad : candidate / pad
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* One y axis' domain. `extraBounds` are the finite zone and reference-line values pinned to this
|
|
30
|
+
* axis — a target past the data must stay inside the plot. Infinite bounds clamp to the domain by
|
|
31
|
+
* definition and are ignored. The 1.x law, unchanged (`resolveAxisDomain`).
|
|
32
|
+
*/
|
|
33
|
+
export function resolveYDomain<T>(
|
|
34
|
+
cfg: AxisConfig<T> | undefined,
|
|
35
|
+
data: readonly T[],
|
|
36
|
+
series: readonly ChartSeries<T>[],
|
|
37
|
+
extraBounds: readonly number[] = [],
|
|
38
|
+
): readonly [number, number] {
|
|
39
|
+
const domain = cfg?.domain ?? 'auto'
|
|
40
|
+
if (Array.isArray(domain)) return domain as readonly [number, number]
|
|
41
|
+
if (typeof domain === 'function') return domain(data, series)
|
|
42
|
+
|
|
43
|
+
const isLog = cfg?.scale === 'log'
|
|
44
|
+
let min = Infinity
|
|
45
|
+
let max = -Infinity
|
|
46
|
+
const take = (v: number | null): void => {
|
|
47
|
+
if (v === null || !Number.isFinite(v)) return
|
|
48
|
+
// A log axis has no zero and no negative half: such a value drops out of the domain.
|
|
49
|
+
if (isLog && v <= 0) return
|
|
50
|
+
if (v < min) min = v
|
|
51
|
+
if (v > max) max = v
|
|
52
|
+
}
|
|
53
|
+
for (const d of data) for (const s of series) take(s.getValue(d))
|
|
54
|
+
for (const v of extraBounds) take(v)
|
|
55
|
+
|
|
56
|
+
const pad = cfg?.autoPad ?? DEFAULT_AUTO_PAD
|
|
57
|
+
if (isLog) {
|
|
58
|
+
if (min === Infinity) return [1, 10]
|
|
59
|
+
if (min === max) return [min / pad, max * pad]
|
|
60
|
+
return [min / pad, padAutoUpper(Math.max(max, cfg?.autoMaxFloor ?? -Infinity), pad)]
|
|
61
|
+
}
|
|
62
|
+
if (min === Infinity) return [0, cfg?.autoMaxFloor ?? 1]
|
|
63
|
+
|
|
64
|
+
// Clamp the RAW bounds first, then pad once, away from zero: padding before the clamp lands a
|
|
65
|
+
// floored top exactly on the floor, with a target line glued to the plot edge.
|
|
66
|
+
const upper = padAutoUpper(Math.max(max, cfg?.autoMaxFloor ?? -Infinity), pad)
|
|
67
|
+
const lower = padAutoLower(Math.min(min, cfg?.autoMinCeil ?? 0), pad)
|
|
68
|
+
// A flat series would be a scale with no extent: every point on one pixel.
|
|
69
|
+
if (lower === upper) return [Math.min(lower, 0), upper === 0 ? 1 : upper * pad]
|
|
70
|
+
return [lower, upper]
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** A configured y scale instance for a resolved domain. */
|
|
74
|
+
export function yScaleFor<T>(
|
|
75
|
+
cfg: AxisConfig<T> | undefined,
|
|
76
|
+
domain: readonly [number, number],
|
|
77
|
+
): ReturnType<typeof scaleLinear> | ReturnType<typeof scaleLog<number, number>> {
|
|
78
|
+
const extent: [number, number] = [domain[0], domain[1]]
|
|
79
|
+
if (cfg?.scale === 'log') {
|
|
80
|
+
const log = scaleLog().domain(extent)
|
|
81
|
+
return cfg.nice ? log.nice() : log
|
|
82
|
+
}
|
|
83
|
+
const linear = scaleLinear().domain(extent)
|
|
84
|
+
return cfg?.nice ? linear.nice() : linear
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export type XKind = 'date' | 'number' | 'string'
|
|
88
|
+
|
|
89
|
+
/** The value type `x` returns, read off the first row (a chart's x is homogeneous by type). */
|
|
90
|
+
export function xKindOf(values: readonly ChartX[]): XKind {
|
|
91
|
+
const first = values[0]
|
|
92
|
+
if (first instanceof Date) return 'date'
|
|
93
|
+
if (typeof first === 'number') return 'number'
|
|
94
|
+
return 'string'
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const keyOf = (v: ChartX): number | string => (v instanceof Date ? v.getTime() : v)
|
|
98
|
+
|
|
99
|
+
/** Distinct x values in data order (dates by timestamp). */
|
|
100
|
+
export function distinctX<X extends ChartX>(values: readonly X[]): X[] {
|
|
101
|
+
const seen = new Set<number | string>()
|
|
102
|
+
const out: X[] = []
|
|
103
|
+
for (const v of values) {
|
|
104
|
+
const k = keyOf(v)
|
|
105
|
+
if (seen.has(k)) continue
|
|
106
|
+
seen.add(k)
|
|
107
|
+
out.push(v)
|
|
108
|
+
}
|
|
109
|
+
return out
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** Point-scale padding for a categorical line: half a step at each edge. */
|
|
113
|
+
const POINT_PADDING = 0.5
|
|
114
|
+
/** Band padding for bars: the gap between two bars, and the inset at the plot's ends. */
|
|
115
|
+
const BAND_PADDING_INNER = 0.2
|
|
116
|
+
const BAND_PADDING_OUTER = 0.1
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* The x scale and the normalized position of any x value inside the plot (0 = left edge, 1 = right
|
|
120
|
+
* edge). Zones and x-zones are drawn on a hidden `[0, 1]` scale from those fractions, so a band
|
|
121
|
+
* spans the plot exactly whatever the x scale is.
|
|
122
|
+
*/
|
|
123
|
+
export type XScaleModel<X extends ChartX> = {
|
|
124
|
+
kind: XKind
|
|
125
|
+
band: boolean
|
|
126
|
+
/** Goes straight into `scales.x.scale`. */
|
|
127
|
+
scale: ChartPositionScaleOptions['scale']
|
|
128
|
+
values: readonly X[]
|
|
129
|
+
/** Center of `x` as a plot fraction; `null` for a value the scale does not contain. */
|
|
130
|
+
fraction: (x: X) => number | null
|
|
131
|
+
/** Half a sample step, as a plot fraction (the `'edge'` widening). */
|
|
132
|
+
halfStep: number
|
|
133
|
+
/** Continuous scales: the domain as numbers (ms for dates), and the median sample step. */
|
|
134
|
+
extent?: readonly [number, number]
|
|
135
|
+
step: number
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const DAY_MS = 86_400_000
|
|
139
|
+
|
|
140
|
+
export function xScaleFor<X extends ChartX>(raw: readonly X[], band: boolean): XScaleModel<X> {
|
|
141
|
+
const values = distinctX(raw)
|
|
142
|
+
const kind = xKindOf(values)
|
|
143
|
+
const n = values.length
|
|
144
|
+
|
|
145
|
+
if (band || kind === 'string') {
|
|
146
|
+
const keys = values as X[]
|
|
147
|
+
const index = new Map(keys.map((k, i) => [keyOf(k), i] as const))
|
|
148
|
+
if (band) {
|
|
149
|
+
const step = 1 / Math.max(1, n - BAND_PADDING_INNER + 2 * BAND_PADDING_OUTER)
|
|
150
|
+
const scale = scaleBand<X>()
|
|
151
|
+
.domain(keys)
|
|
152
|
+
.paddingInner(BAND_PADDING_INNER)
|
|
153
|
+
.paddingOuter(BAND_PADDING_OUTER)
|
|
154
|
+
return {
|
|
155
|
+
kind,
|
|
156
|
+
band: true,
|
|
157
|
+
scale,
|
|
158
|
+
values: keys,
|
|
159
|
+
halfStep: step / 2,
|
|
160
|
+
step: 1,
|
|
161
|
+
fraction: (x) => {
|
|
162
|
+
const i = index.get(keyOf(x))
|
|
163
|
+
if (i === undefined) return null
|
|
164
|
+
return step * (BAND_PADDING_OUTER + i + (1 - BAND_PADDING_INNER) / 2)
|
|
165
|
+
},
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
const step = 1 / Math.max(1, n - 1 + 2 * POINT_PADDING)
|
|
169
|
+
return {
|
|
170
|
+
kind,
|
|
171
|
+
band: false,
|
|
172
|
+
scale: scalePoint<X>().domain(keys).padding(POINT_PADDING),
|
|
173
|
+
values: keys,
|
|
174
|
+
halfStep: step / 2,
|
|
175
|
+
step: 1,
|
|
176
|
+
fraction: (x) => {
|
|
177
|
+
const i = index.get(keyOf(x))
|
|
178
|
+
return i === undefined ? null : step * (POINT_PADDING + i)
|
|
179
|
+
},
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const nums = values.map((v) => (v instanceof Date ? v.getTime() : (v as number)))
|
|
184
|
+
// A loop, not Math.min(...nums): a spread of a long series overflows the call stack.
|
|
185
|
+
let lo = Infinity
|
|
186
|
+
let hi = -Infinity
|
|
187
|
+
for (const v of nums) {
|
|
188
|
+
// NaN poisons the extent, as Math.min/max did: the guard below falls back to [0, 1].
|
|
189
|
+
if (Number.isNaN(v)) {
|
|
190
|
+
lo = hi = NaN
|
|
191
|
+
break
|
|
192
|
+
}
|
|
193
|
+
if (v < lo) lo = v
|
|
194
|
+
if (v > hi) hi = v
|
|
195
|
+
}
|
|
196
|
+
if (!Number.isFinite(lo)) [lo, hi] = [0, 1]
|
|
197
|
+
if (lo === hi) {
|
|
198
|
+
// One sample: give the axis a day (or a unit) of width so the point sits in the middle.
|
|
199
|
+
const half = kind === 'date' ? DAY_MS / 2 : 0.5
|
|
200
|
+
lo -= half
|
|
201
|
+
hi += half
|
|
202
|
+
}
|
|
203
|
+
const span = hi - lo
|
|
204
|
+
const sorted = nums.toSorted((a, b) => a - b)
|
|
205
|
+
const gaps = sorted.slice(1).map((v, i) => v - (sorted[i] as number))
|
|
206
|
+
const medianGap = gaps.length ? (gaps.toSorted((a, b) => a - b)[gaps.length >> 1] as number) : 0
|
|
207
|
+
const scale =
|
|
208
|
+
kind === 'date'
|
|
209
|
+
? scaleUtc().domain([new Date(lo), new Date(hi)])
|
|
210
|
+
: scaleLinear().domain([lo, hi])
|
|
211
|
+
return {
|
|
212
|
+
kind,
|
|
213
|
+
band: false,
|
|
214
|
+
scale,
|
|
215
|
+
values,
|
|
216
|
+
halfStep: medianGap / span / 2,
|
|
217
|
+
extent: [lo, hi],
|
|
218
|
+
step: medianGap,
|
|
219
|
+
fraction: (x) => {
|
|
220
|
+
const v = x instanceof Date ? x.getTime() : (x as number)
|
|
221
|
+
return typeof v === 'number' && Number.isFinite(v) ? (v - lo) / span : null
|
|
222
|
+
},
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/** An x-zone's [left, right] as plot fractions, clamped to the plot; `null` when it is empty. */
|
|
227
|
+
export function xZoneFractions<X extends ChartX>(
|
|
228
|
+
zone: XZoneSpec<X>,
|
|
229
|
+
model: XScaleModel<X>,
|
|
230
|
+
): readonly [number, number] | null {
|
|
231
|
+
const widen = zone.align === 'edge' ? model.halfStep : 0
|
|
232
|
+
const from = zone.from === undefined ? 0 : (model.fraction(zone.from) ?? 0) - widen
|
|
233
|
+
const to = zone.to === undefined ? 1 : (model.fraction(zone.to) ?? 1) + widen
|
|
234
|
+
const left = Math.max(0, Math.min(from, to))
|
|
235
|
+
const right = Math.min(1, Math.max(from, to))
|
|
236
|
+
return right > left ? [left, right] : null
|
|
237
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The measured-width seam (`docs/V2-SPEC.md` § 9.2, § 9.6): the chart root's width, for the compiled
|
|
3
|
+
* definition's ticks and fonts. Nothing here sizes the box: `box.tsx` and `chart-box.module.css`
|
|
4
|
+
* own the height in CSS so it exists before JS runs (W10 SSR contract).
|
|
5
|
+
*/
|
|
6
|
+
import { useCallback, useRef, useState } from 'react'
|
|
7
|
+
import type { RefCallback } from 'react'
|
|
8
|
+
import { useIsomorphicLayoutEffect } from '../common/isomorphic-layout-effect'
|
|
9
|
+
import { useCoarsePointer } from '../common/use-media-query'
|
|
10
|
+
|
|
11
|
+
/** Server and first-paint width before the host measures (TanStack `initialWidth`): the regular
|
|
12
|
+
* class, so SSR markup and the first client frame agree. Only the svg's internal geometry follows
|
|
13
|
+
* the real width; the box around it is already final. */
|
|
14
|
+
export const INITIAL_WIDTH = 640
|
|
15
|
+
|
|
16
|
+
/** Measures the width of the element `ref` lands on (`0` until measured, e.g. on the server). */
|
|
17
|
+
export function useChartSize(): {
|
|
18
|
+
ref: RefCallback<HTMLElement>
|
|
19
|
+
width: number
|
|
20
|
+
coarse: boolean
|
|
21
|
+
} {
|
|
22
|
+
const [width, setWidth] = useState(0)
|
|
23
|
+
const [node, setNode] = useState<HTMLElement | null>(null)
|
|
24
|
+
const coarse = useCoarsePointer()
|
|
25
|
+
const last = useRef(0)
|
|
26
|
+
|
|
27
|
+
useIsomorphicLayoutEffect(() => {
|
|
28
|
+
if (!node) return
|
|
29
|
+
const read = (w: number): void => {
|
|
30
|
+
const rounded = Math.round(w)
|
|
31
|
+
if (rounded === last.current) return
|
|
32
|
+
last.current = rounded
|
|
33
|
+
setWidth(rounded)
|
|
34
|
+
}
|
|
35
|
+
read(node.getBoundingClientRect().width)
|
|
36
|
+
if (typeof ResizeObserver === 'undefined') return
|
|
37
|
+
const observer = new ResizeObserver((entries) => {
|
|
38
|
+
const entry = entries[0]
|
|
39
|
+
if (entry) read(entry.contentRect.width)
|
|
40
|
+
})
|
|
41
|
+
observer.observe(node)
|
|
42
|
+
return () => observer.disconnect()
|
|
43
|
+
}, [node])
|
|
44
|
+
|
|
45
|
+
const ref = useCallback<RefCallback<HTMLElement>>((el) => setNode(el), [])
|
|
46
|
+
return { ref, width, coarse }
|
|
47
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The "nothing to draw" placeholders: pending → error → empty, in that precedence. One renderer for
|
|
3
|
+
* the chart chrome and `ChartCard`, so a pending card and a pending chart read the same.
|
|
4
|
+
*/
|
|
5
|
+
import type { CSSProperties, ReactElement, ReactNode } from 'react'
|
|
6
|
+
import { toErrorMessage } from '../common/errors'
|
|
7
|
+
import { VX } from '../tokens'
|
|
8
|
+
import { ChartBox, stateClass } from './box'
|
|
9
|
+
import type { ChartBoxHeight } from './box'
|
|
10
|
+
import type { ChartState } from './types'
|
|
11
|
+
|
|
12
|
+
export type ResolvedChartState = 'pending' | 'error' | 'empty' | null
|
|
13
|
+
|
|
14
|
+
export function resolveChartState(state: ChartState | undefined): ResolvedChartState {
|
|
15
|
+
if (!state) return null
|
|
16
|
+
if (state.pending) return 'pending'
|
|
17
|
+
if (state.error) return 'error'
|
|
18
|
+
if (state.empty) return 'empty'
|
|
19
|
+
return null
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const boxStyle: CSSProperties = {
|
|
23
|
+
display: 'flex',
|
|
24
|
+
flexDirection: 'column',
|
|
25
|
+
alignItems: 'center',
|
|
26
|
+
justifyContent: 'center',
|
|
27
|
+
gap: 6,
|
|
28
|
+
color: VX.axis,
|
|
29
|
+
fontSize: VX.text.xs,
|
|
30
|
+
textAlign: 'center',
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const pendingStyle: CSSProperties = {
|
|
34
|
+
...boxStyle,
|
|
35
|
+
borderRadius: VX.radiusCtrl,
|
|
36
|
+
background: `linear-gradient(90deg, transparent, ${VX.surface.subtle}, transparent)`,
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const emptyLabel = (state: ChartState | undefined): string =>
|
|
40
|
+
typeof state?.empty === 'string' ? state.empty : 'No data'
|
|
41
|
+
|
|
42
|
+
/** Fills the same {@link ChartBox} the chart will, so a pending, failed or empty chart (and a
|
|
43
|
+
* `<Suspense>` fallback built from one) occupies the final chart's height. */
|
|
44
|
+
export function ChartPlaceholder(props: {
|
|
45
|
+
state: ChartState | undefined
|
|
46
|
+
height?: ChartBoxHeight
|
|
47
|
+
action?: ReactNode
|
|
48
|
+
}): ReactElement | null {
|
|
49
|
+
const kind = resolveChartState(props.state)
|
|
50
|
+
if (kind === null) return null
|
|
51
|
+
const style = kind === 'pending' ? pendingStyle : boxStyle
|
|
52
|
+
const fit = (node: ReactElement): ReactElement => (
|
|
53
|
+
<ChartBox height={props.height}>{node}</ChartBox>
|
|
54
|
+
)
|
|
55
|
+
if (kind === 'pending')
|
|
56
|
+
return fit(
|
|
57
|
+
<output aria-label="Loading chart" aria-busy="true" className={stateClass} style={style} />,
|
|
58
|
+
)
|
|
59
|
+
const label =
|
|
60
|
+
kind === 'error'
|
|
61
|
+
? toErrorMessage(props.state?.error, 'The chart failed to load.')
|
|
62
|
+
: emptyLabel(props.state)
|
|
63
|
+
const body = (
|
|
64
|
+
<>
|
|
65
|
+
<span>{label}</span>
|
|
66
|
+
{props.action}
|
|
67
|
+
</>
|
|
68
|
+
)
|
|
69
|
+
if (kind === 'error')
|
|
70
|
+
return fit(
|
|
71
|
+
<div role="alert" data-basalt-chart-state={kind} className={stateClass} style={style}>
|
|
72
|
+
{body}
|
|
73
|
+
</div>,
|
|
74
|
+
)
|
|
75
|
+
return fit(
|
|
76
|
+
<output data-basalt-chart-state={kind} className={stateClass} style={style}>
|
|
77
|
+
{body}
|
|
78
|
+
</output>,
|
|
79
|
+
)
|
|
80
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `--vx-*` → TanStack Charts bridge (`docs/V2-SPEC.md` § 9.5). Two halves, both CSS-variable
|
|
3
|
+
* references, so a scheme switch repaints without rebuilding a definition:
|
|
4
|
+
*
|
|
5
|
+
* - `CHART_THEME` goes into every definition's `theme` (scene paint: guides, grid, focus ring).
|
|
6
|
+
* - `CHART_ENGINE_VARS` (`--ts-chart-*`: palette, tooltip, crosshair halo) is one `:root` block
|
|
7
|
+
* (`chartEngineCss`) inside `styles.css`. Not on the host element: the tooltip portal's fallback
|
|
8
|
+
* reparents the tooltip under `<body>`, out of the host's inheritance. Not in `buildPaletteCss`:
|
|
9
|
+
* that emitter stays engine-agnostic.
|
|
10
|
+
*/
|
|
11
|
+
import type { ChartTheme } from '@tanstack/charts/types/core'
|
|
12
|
+
import { VX } from '../tokens'
|
|
13
|
+
|
|
14
|
+
export const CHART_THEME: Partial<ChartTheme> = {
|
|
15
|
+
foreground: 'var(--vx-ink2)',
|
|
16
|
+
muted: 'var(--vx-axis)',
|
|
17
|
+
grid: 'var(--vx-grid)',
|
|
18
|
+
background: 'transparent',
|
|
19
|
+
palette: [
|
|
20
|
+
'var(--ts-chart-1)',
|
|
21
|
+
'var(--ts-chart-2)',
|
|
22
|
+
'var(--ts-chart-3)',
|
|
23
|
+
'var(--ts-chart-4)',
|
|
24
|
+
'var(--ts-chart-5)',
|
|
25
|
+
'var(--ts-chart-6)',
|
|
26
|
+
],
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export const CHART_ENGINE_VARS: Readonly<Record<`--ts-chart-${string}`, string>> = {
|
|
30
|
+
'--ts-chart-1': 'var(--vx-line)',
|
|
31
|
+
'--ts-chart-2': 'var(--vx-accent)',
|
|
32
|
+
'--ts-chart-3': 'var(--vx-fill-cyan)',
|
|
33
|
+
'--ts-chart-4': 'var(--vx-fill-orange)',
|
|
34
|
+
'--ts-chart-5': 'var(--vx-fill-grape)',
|
|
35
|
+
'--ts-chart-6': 'var(--vx-fill-lime)',
|
|
36
|
+
'--ts-chart-tooltip-background': 'var(--vx-tooltip-bg)',
|
|
37
|
+
'--ts-chart-tooltip-color': 'var(--vx-tooltip-text)',
|
|
38
|
+
'--ts-chart-tooltip-border': 'var(--vx-tooltip-border)',
|
|
39
|
+
'--ts-chart-tooltip-shadow': 'var(--vx-tooltip-shadow)',
|
|
40
|
+
'--ts-chart-tooltip-border-radius': 'var(--vx-radius-ctrl)',
|
|
41
|
+
'--ts-chart-crosshair-label-halo': 'var(--vx-surface-panel)',
|
|
42
|
+
'--ts-chart-crosshair-marker-fill': 'var(--vx-surface-panel)',
|
|
43
|
+
'--ts-chart-focus-fill': 'var(--vx-surface-panel)',
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* The charts layer's stylesheet block: one `:root` rule. `styles.css` carries the same declarations
|
|
48
|
+
* (formatter-laid-out) between two generated markers — `scripts/gen-chart-css.ts` writes them from this
|
|
49
|
+
* function's output, and `engine.test.tsx` fails on drift, whitespace aside — so the
|
|
50
|
+
* source tree a Vite alias or the layout fixture serves and the published `dist/styles.css` agree.
|
|
51
|
+
*/
|
|
52
|
+
export function chartEngineCss(): string {
|
|
53
|
+
const decls = Object.entries(CHART_ENGINE_VARS).map(([name, value]) => `${name}:${value}`)
|
|
54
|
+
return `:root{${decls.join(';')}}`
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** Guide paint every definition shares — the tokens are pre-mixed, so nothing dilutes them. */
|
|
58
|
+
export const AXIS_LINE = { stroke: VX.axisStroke, strokeOpacity: 1 } as const
|
|
59
|
+
export const GRID_LINE = { strokeDasharray: '2 3', strokeOpacity: 1 } as const
|
|
60
|
+
export const CROSSHAIR = { stroke: VX.crosshair, strokeOpacity: 1, strokeDasharray: '3 3' } as const
|
|
61
|
+
export const DASH = VX.dashArray
|
|
62
|
+
/** The default plotted stroke: the redesign's 1.9px line overlay. */
|
|
63
|
+
export const LINE_STROKE_WIDTH = 1.9
|
|
64
|
+
/** A series' opacity multiplier while ANOTHER legend entry is hovered (one value for every kind). */
|
|
65
|
+
export const DIMMED = 0.25
|