basalt-ui 1.41.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +46 -43
- package/CHANGELOG.md +542 -518
- package/MIGRATING.md +964 -37
- package/README.md +171 -366
- package/agent/rules/basalt-batteries.md +19 -74
- package/agent/rules/basalt-charts.md +21 -95
- package/agent/rules/basalt-controls.md +23 -131
- package/agent/rules/basalt-mantine.md +26 -99
- package/agent/rules/basalt-state.md +21 -103
- package/agent/rules/basalt-tokens.md +33 -114
- package/agent/skills/basalt-app/SKILL.md +229 -72
- package/agent/skills/basalt-charts/SKILL.md +23 -57
- package/agent/skills/basalt-design/SKILL.md +12 -70
- package/agent/templates/AGENTS-block.md.tpl +16 -26
- package/agent/templates/DESIGN.md.tpl +1 -1
- package/agent/templates/__root.tpl +9 -16
- package/agent/templates/main.tpl +21 -0
- package/agent/templates/nav.tpl +18 -0
- package/configs/oxlint-basalt.json +4 -10
- package/configs/oxlint-plugin.js +465 -844
- package/configs/oxlint-plugin.test.ts +661 -709
- package/configs/oxlint.json +10 -2
- package/dist/agent/ai-sdk-transport.d.ts +19 -7
- package/dist/agent/ai-sdk-transport.d.ts.map +1 -1
- package/dist/agent/ai-sdk-transport.js +10 -7
- package/dist/{agent-chat → agent/chat}/composer.d.ts +16 -16
- package/dist/agent/chat/composer.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/composer.js +10 -9
- package/dist/{agent-chat → agent/chat}/message-affordances.d.ts +7 -6
- package/dist/agent/chat/message-affordances.d.ts.map +1 -0
- package/dist/agent/chat/relative-time.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-feed-row.d.ts +18 -16
- package/dist/agent/chat/thread-feed-row.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-feed-row.js +12 -11
- package/dist/{agent-chat → agent/chat}/thread-feed.d.ts +8 -8
- package/dist/agent/chat/thread-feed.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-feed.js +12 -10
- package/dist/{agent-chat → agent/chat}/thread-message.d.ts +12 -9
- package/dist/agent/chat/thread-message.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-message.js +15 -13
- package/dist/{agent-chat → agent/chat}/thread-outcome-card.d.ts +2 -2
- package/dist/agent/chat/thread-outcome-card.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-outcome-card.js +3 -3
- package/dist/{agent-chat → agent/chat}/tool-chip.d.ts +5 -5
- package/dist/agent/chat/tool-chip.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/tool-chip.js +4 -4
- package/dist/agent/chat/use-keyboard-inset.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/use-keyboard-inset.js +1 -1
- package/dist/{agent-chat → agent/chat}/virtualize.d.ts +7 -7
- package/dist/agent/chat/virtualize.d.ts.map +1 -0
- package/dist/agent/error.d.ts +31 -0
- package/dist/agent/error.d.ts.map +1 -0
- package/dist/agent/error.js +18 -0
- package/dist/agent/history.d.ts +2 -36
- package/dist/agent/history.d.ts.map +1 -1
- package/dist/agent/history.js +0 -32
- package/dist/agent/id.d.ts +4 -5
- package/dist/agent/id.d.ts.map +1 -1
- package/dist/agent/index.d.ts +19 -52
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +10 -32
- package/dist/agent/outcome.d.ts +3 -14
- package/dist/agent/outcome.d.ts.map +1 -1
- package/dist/agent/outcome.js +0 -30
- package/dist/agent/part-list.d.ts +3 -3
- package/dist/agent/part-list.d.ts.map +1 -1
- package/dist/agent/parts.d.ts +23 -24
- package/dist/agent/parts.d.ts.map +1 -1
- package/dist/agent/run-committer.d.ts +23 -0
- package/dist/agent/run-committer.d.ts.map +1 -0
- package/dist/agent/run-committer.js +41 -0
- package/dist/agent/run-records.d.ts +77 -0
- package/dist/agent/run-records.d.ts.map +1 -0
- package/dist/agent/run-records.js +69 -0
- package/dist/agent/thread.d.ts +23 -47
- package/dist/agent/thread.d.ts.map +1 -1
- package/dist/agent/thread.js +3 -134
- package/dist/agent/transport.d.ts +6 -69
- package/dist/agent/transport.d.ts.map +1 -1
- package/dist/agent/transport.js +0 -18
- package/dist/agent/use-agent-thread-runs.d.ts +63 -26
- package/dist/agent/use-agent-thread-runs.d.ts.map +1 -1
- package/dist/agent/use-agent-thread-runs.js +202 -66
- package/dist/charts/BandStrip.d.ts +46 -0
- package/dist/charts/BandStrip.d.ts.map +1 -0
- package/dist/charts/BandStrip.js +151 -0
- package/dist/charts/Bars.d.ts +19 -0
- package/dist/charts/Bars.d.ts.map +1 -0
- package/dist/charts/Bars.js +77 -0
- package/dist/charts/CartesianChart.d.ts +57 -0
- package/dist/charts/CartesianChart.d.ts.map +1 -0
- package/dist/charts/CartesianChart.js +121 -0
- package/dist/charts/ChartCard.d.ts +34 -0
- package/dist/charts/ChartCard.d.ts.map +1 -0
- package/dist/charts/ChartCard.js +115 -0
- package/dist/charts/Donut.d.ts +25 -0
- package/dist/charts/Donut.d.ts.map +1 -0
- package/dist/charts/Donut.js +191 -0
- package/dist/charts/DualPanel.d.ts +47 -0
- package/dist/charts/DualPanel.d.ts.map +1 -0
- package/dist/charts/DualPanel.js +214 -0
- package/dist/charts/Heatmap.d.ts +41 -0
- package/dist/charts/Heatmap.d.ts.map +1 -0
- package/dist/charts/Heatmap.js +216 -0
- package/dist/charts/Lines.d.ts +11 -0
- package/dist/charts/Lines.d.ts.map +1 -0
- package/dist/charts/Lines.js +114 -0
- package/dist/charts/MirroredBars.d.ts +44 -0
- package/dist/charts/MirroredBars.d.ts.map +1 -0
- package/dist/charts/MirroredBars.js +190 -0
- package/dist/charts/Sparkline.d.ts +22 -0
- package/dist/charts/Sparkline.d.ts.map +1 -0
- package/dist/charts/Sparkline.js +129 -0
- package/dist/charts/StackedArea.d.ts +15 -0
- package/dist/charts/StackedArea.d.ts.map +1 -0
- package/dist/charts/StackedArea.js +46 -0
- package/dist/charts/box.d.ts +38 -0
- package/dist/charts/box.d.ts.map +1 -0
- package/dist/charts/box.js +72 -0
- package/dist/charts/card-context.d.ts +3 -0
- package/dist/charts/card-context.d.ts.map +1 -0
- package/dist/charts/card-context.js +7 -0
- package/dist/charts/chart-box.module.css +64 -0
- package/{src/content/article-card.module.css.d.ts → dist/charts/chart-box.module.css.d.ts} +5 -9
- package/dist/charts/chart-card.module.css +25 -0
- package/dist/{dashboard/widget-grid.module.css.d.ts → charts/chart-card.module.css.d.ts} +1 -3
- package/dist/charts/chart-legend.module.css +38 -0
- package/{src/dashboard/widget-grid.module.css.d.ts → dist/charts/chart-legend.module.css.d.ts} +3 -3
- package/dist/charts/compile.d.ts +62 -0
- package/dist/charts/compile.d.ts.map +1 -0
- package/dist/charts/compile.js +386 -0
- package/dist/charts/cursor.d.ts +50 -0
- package/dist/charts/cursor.d.ts.map +1 -0
- package/dist/charts/cursor.js +157 -0
- package/dist/charts/curves.d.ts +12 -0
- package/dist/charts/curves.d.ts.map +1 -0
- package/dist/charts/curves.js +86 -0
- package/dist/charts/donut.module.css +54 -0
- package/dist/{content/article-card.module.css.d.ts → charts/donut.module.css.d.ts} +2 -9
- package/dist/charts/host.d.ts +17 -0
- package/dist/charts/host.d.ts.map +1 -0
- package/dist/charts/host.js +35 -0
- package/dist/charts/index.d.ts +18 -53
- package/dist/charts/index.d.ts.map +1 -1
- package/dist/charts/index.js +17 -189
- package/dist/charts/legend.d.ts +23 -0
- package/dist/charts/legend.d.ts.map +1 -0
- package/dist/charts/legend.js +160 -0
- package/dist/charts/marks.d.ts +25 -0
- package/dist/charts/marks.d.ts.map +1 -0
- package/dist/charts/marks.js +128 -0
- package/dist/charts/panel.d.ts +56 -0
- package/dist/charts/panel.d.ts.map +1 -0
- package/dist/charts/panel.js +123 -0
- package/dist/charts/scales.d.ts +44 -0
- package/dist/charts/scales.d.ts.map +1 -0
- package/dist/charts/scales.js +163 -0
- package/dist/charts/sizing.d.ts +12 -0
- package/dist/charts/sizing.d.ts.map +1 -0
- package/dist/charts/sizing.js +33 -0
- package/dist/charts/state.d.ts +17 -0
- package/dist/charts/state.d.ts.map +1 -0
- package/dist/charts/state.js +53 -0
- package/dist/charts/theme.d.ts +38 -19
- package/dist/charts/theme.d.ts.map +1 -1
- package/dist/charts/theme.js +48 -26
- package/dist/charts/types.d.ts +227 -0
- package/dist/charts/types.d.ts.map +1 -0
- package/dist/charts/types.js +4 -0
- package/dist/cli/audit-allows.d.ts +4 -17
- package/dist/cli/audit-allows.d.ts.map +1 -1
- package/dist/cli/config.d.ts +18 -43
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +6 -0
- package/dist/cli/doctor-upgrade.d.ts +43 -0
- package/dist/cli/doctor-upgrade.d.ts.map +1 -0
- package/dist/cli/doctor-upgrade.js +314 -0
- package/dist/cli/doctor.d.ts +14 -29
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +58 -9
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +2 -4
- package/dist/cli/index.d.ts +48 -172
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +39 -132
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +43 -37
- package/dist/cli/sync.d.ts +5 -21
- package/dist/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js +4 -23
- package/dist/cli/tokens-css.d.ts +7 -28
- package/dist/cli/tokens-css.d.ts.map +1 -1
- package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
- package/dist/commands/ShortcutsHelp.js +4 -5
- package/dist/commands/define-commands.d.ts +15 -31
- package/dist/commands/define-commands.d.ts.map +1 -1
- package/dist/commands/define-commands.js +1 -11
- package/dist/commands/define-overlays.d.ts +5 -19
- package/dist/commands/define-overlays.d.ts.map +1 -1
- package/dist/commands/define-overlays.js +3 -11
- package/dist/commands/index.d.ts +10 -40
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +9 -46
- package/dist/{notifications → commands/notifications}/bell.d.ts +1 -1
- package/dist/commands/notifications/bell.d.ts.map +1 -0
- package/dist/{notifications → commands/notifications}/center.d.ts +2 -2
- package/dist/commands/notifications/center.d.ts.map +1 -0
- package/dist/{notifications → commands/notifications}/center.js +2 -2
- package/dist/{notifications → commands/notifications}/define-notifications.d.ts +3 -3
- package/dist/commands/notifications/define-notifications.d.ts.map +1 -0
- package/dist/commands/notifications/notify.d.ts +44 -0
- package/dist/commands/notifications/notify.d.ts.map +1 -0
- package/dist/commands/notifications/notify.js +79 -0
- package/dist/{notifications → commands/notifications}/store.d.ts +2 -0
- package/dist/commands/notifications/store.d.ts.map +1 -0
- package/dist/{notifications → commands/notifications}/store.js +4 -0
- package/dist/commands/projectors.d.ts +1 -131
- package/dist/commands/projectors.d.ts.map +1 -1
- package/dist/commands/projectors.js +2 -73
- package/dist/commands/shell-bridge.d.ts +3 -3
- package/dist/commands/shortcut-format.d.ts +5 -4
- package/dist/commands/shortcut-format.d.ts.map +1 -1
- package/dist/common/errors.d.ts +3 -3
- package/dist/common/use-measured-widths.d.ts.map +1 -1
- package/dist/common/use-measured-widths.js +5 -3
- package/dist/common/validate.d.ts +2 -2
- package/dist/content/article-layout.d.ts.map +1 -1
- package/dist/content/article-layout.js +3 -3
- package/dist/content/article-model.d.ts +1 -46
- package/dist/content/article-model.d.ts.map +1 -1
- package/dist/content/article-model.js +1 -29
- package/dist/content/index.d.ts +11 -41
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +3 -35
- package/dist/content/markdown.d.ts +1 -1
- package/dist/content/markdown.d.ts.map +1 -1
- package/dist/content/markdown.js +1 -1
- package/dist/content/mermaid.d.ts.map +1 -1
- package/dist/content/mermaid.js +7 -7
- package/dist/content/slug.d.ts +1 -8
- package/dist/content/slug.d.ts.map +1 -1
- package/dist/content/slug.js +1 -8
- package/dist/content/url-hardening.d.ts +2 -2
- package/dist/content/url-hardening.d.ts.map +1 -1
- package/dist/content/url-hardening.js +2 -0
- package/dist/controls/actions.d.ts +16 -1
- package/dist/controls/actions.d.ts.map +1 -1
- package/dist/controls/enum-filter.d.ts +1 -1
- package/dist/controls/enum-filter.d.ts.map +1 -1
- package/dist/controls/filter-context.d.ts.map +1 -1
- package/dist/controls/filter-context.js +3 -1
- package/dist/controls/filter-set.js +4 -6
- package/dist/controls/form-layout.d.ts +1 -1
- package/dist/controls/form-layout.d.ts.map +1 -1
- package/dist/controls/form-layout.js +1 -1
- package/dist/controls/glyphs.d.ts +0 -2
- package/dist/controls/glyphs.d.ts.map +1 -1
- package/dist/controls/glyphs.js +0 -7
- package/dist/controls/index.d.ts +12 -17
- package/dist/controls/index.d.ts.map +1 -1
- package/dist/controls/index.js +5 -39
- package/dist/controls/multi-select-filter.d.ts +4 -3
- package/dist/controls/multi-select-filter.d.ts.map +1 -1
- package/dist/controls/number-filter.d.ts +4 -3
- package/dist/controls/number-filter.d.ts.map +1 -1
- package/dist/controls/number-filter.js +3 -1
- package/dist/controls/range-filter.d.ts +4 -3
- package/dist/controls/range-filter.d.ts.map +1 -1
- package/dist/controls/search-filter.d.ts +4 -3
- package/dist/controls/search-filter.d.ts.map +1 -1
- package/dist/controls/search-filter.js +19 -14
- package/dist/controls/select-filter.d.ts +4 -3
- package/dist/controls/select-filter.d.ts.map +1 -1
- package/dist/controls/sync-button.d.ts.map +1 -1
- package/dist/controls/sync-button.js +12 -15
- package/dist/controls/toggle-filter.d.ts +4 -3
- package/dist/controls/toggle-filter.d.ts.map +1 -1
- package/dist/controls/uncontrolled.d.ts +12 -0
- package/dist/controls/uncontrolled.d.ts.map +1 -0
- package/dist/controls/view-tabs.d.ts +2 -2
- package/dist/controls/view-tabs.d.ts.map +1 -1
- package/dist/controls-dates/index.d.ts +0 -1
- package/dist/controls-dates/index.d.ts.map +1 -1
- package/dist/dashboard/index.d.ts +7 -9
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/index.js +3 -23
- package/dist/dashboard/section.d.ts +4 -6
- package/dist/dashboard/section.d.ts.map +1 -1
- package/dist/dashboard/section.js +4 -10
- package/dist/dashboard/stat-card.d.ts +4 -4
- package/dist/dashboard/stat-card.d.ts.map +1 -1
- package/dist/dashboard/stat-card.js +3 -3
- package/dist/dashboard/widget-header.module.css +9 -7
- package/dist/dev-dock.d.ts.map +1 -1
- package/dist/dev-dock.js +6 -1
- package/dist/format/date.d.ts +0 -34
- package/dist/format/date.d.ts.map +1 -1
- package/dist/format/date.js +0 -54
- package/dist/format/index.d.ts +7 -22
- package/dist/format/index.d.ts.map +1 -1
- package/dist/format/index.js +2 -43
- package/dist/format/number.d.ts +3 -14
- package/dist/format/number.d.ts.map +1 -1
- package/dist/format/number.js +0 -13
- package/dist/format/shared.d.ts +2 -3
- package/dist/format/shared.d.ts.map +1 -1
- package/dist/forms/index.d.ts +0 -11
- package/dist/forms/index.d.ts.map +1 -1
- package/dist/forms/index.js +1 -14
- package/dist/guard/index.d.ts +6 -21
- package/dist/guard/index.d.ts.map +1 -1
- package/dist/guard/index.js +27 -115
- package/dist/guard/types.d.ts +7 -18
- package/dist/guard/types.d.ts.map +1 -1
- package/dist/index.d.ts +16 -48
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -117
- package/dist/provider/create-router.d.ts +44 -0
- package/dist/provider/create-router.d.ts.map +1 -0
- package/dist/provider/create-router.js +62 -0
- package/dist/provider/hotkeys.d.ts +8 -0
- package/dist/provider/hotkeys.d.ts.map +1 -0
- package/dist/provider/hotkeys.js +50 -0
- package/dist/provider/index.d.ts +33 -110
- package/dist/provider/index.d.ts.map +1 -1
- package/dist/provider/index.js +182 -82
- package/dist/provider/lab-theme.d.ts.map +1 -1
- package/dist/provider/route-transition.d.ts +76 -0
- package/dist/provider/route-transition.d.ts.map +1 -0
- package/dist/provider/route-transition.js +98 -0
- package/dist/provider/spotlight-actions.d.ts +10 -0
- package/dist/provider/spotlight-actions.d.ts.map +1 -0
- package/dist/provider/spotlight-actions.js +55 -0
- package/dist/provider/test-router.d.ts +6 -0
- package/dist/provider/test-router.d.ts.map +1 -0
- package/dist/provider/test-router.js +18 -0
- package/dist/query-client.d.ts +4 -20
- package/dist/query-client.d.ts.map +1 -1
- package/dist/query-client.js +2 -2
- package/dist/router-tanstack/index.d.ts +18 -64
- package/dist/router-tanstack/index.d.ts.map +1 -1
- package/dist/router-tanstack/index.js +2 -16
- package/dist/router-tanstack/nav.d.ts +12 -1
- package/dist/router-tanstack/nav.d.ts.map +1 -1
- package/dist/router-tanstack/nav.js +8 -1
- package/dist/router-tanstack/search-store.d.ts +1 -1
- package/dist/router-tanstack/search-store.d.ts.map +1 -1
- package/dist/router-tanstack/use-nav.d.ts +8 -9
- package/dist/router-tanstack/use-nav.d.ts.map +1 -1
- package/dist/router-tanstack/use-nav.js +20 -1
- package/dist/shell/app-mobile-nav.d.ts.map +1 -1
- package/dist/shell/app-sidebar.js +1 -1
- package/dist/shell/index.d.ts +31 -10
- package/dist/shell/index.d.ts.map +1 -1
- package/dist/shell/index.js +14 -3
- package/dist/shell/page-aside.d.ts +2 -2
- package/dist/shell/page-aside.d.ts.map +1 -1
- package/dist/shell/page-aside.js +31 -12
- package/dist/shell/page-bar.d.ts +2 -2
- package/dist/shell/page-bar.d.ts.map +1 -1
- package/dist/shell/page-bar.js +1 -1
- package/dist/state.d.ts +10 -12
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +4 -6
- package/dist/styles.css +107 -7
- package/dist/surfaces.d.ts +28 -103
- package/dist/surfaces.d.ts.map +1 -1
- package/dist/surfaces.js +54 -143
- package/dist/{data → table}/data-table-state.d.ts +1 -1
- package/dist/table/data-table-state.d.ts.map +1 -0
- package/dist/{data → table}/data-table-state.js +4 -3
- package/dist/{data → table}/data-table.d.ts +28 -49
- package/dist/table/data-table.d.ts.map +1 -0
- package/dist/{data → table}/data-table.js +74 -60
- package/dist/table/index.d.ts +18 -0
- package/dist/table/index.d.ts.map +1 -0
- package/dist/{data/table.js → table/index.js} +1 -1
- package/dist/table/query-branch.d.ts.map +1 -0
- package/dist/table/table-features.d.ts +69 -0
- package/dist/table/table-features.d.ts.map +1 -0
- package/dist/table/table-features.js +49 -0
- package/dist/telemetry.d.ts +77 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +33 -0
- package/dist/theme/index.d.ts +10 -21
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +3 -14
- package/dist/theme/theme-toggle.d.ts.map +1 -1
- package/dist/theme/theme-toggle.js +7 -33
- package/dist/theme/theme-toggle.module.css +30 -0
- package/dist/theme/theme-toggle.module.css.d.ts +10 -0
- package/dist/theme-lab/derive-controls.d.ts.map +1 -1
- package/dist/theme-lab/derive-controls.js +5 -3
- package/dist/theme-lab/derive-state.d.ts.map +1 -1
- package/dist/theme-lab/derive-state.js +2 -1
- package/dist/tokens/core.d.ts +360 -0
- package/dist/tokens/core.d.ts.map +1 -0
- package/dist/tokens/core.js +708 -0
- package/dist/tokens/derive.d.ts +1 -1
- package/dist/tokens/derive.d.ts.map +1 -1
- package/dist/tokens/index.d.ts +5 -373
- package/dist/tokens/index.d.ts.map +1 -1
- package/dist/tokens/index.js +8 -700
- package/dist/tokens/palette.d.ts +2 -6
- package/dist/tokens/palette.d.ts.map +1 -1
- package/dist/tokens/palette.js +1 -4
- package/dist/vite.d.ts +4 -3
- package/dist/vite.d.ts.map +1 -1
- package/llms.txt +43 -85
- package/package.json +80 -173
- package/src/agent/ai-sdk-transport.ts +57 -37
- package/src/{agent-chat → agent/chat}/composer.tsx +29 -30
- package/src/{agent-chat → agent/chat}/message-affordances.ts +8 -5
- package/src/{agent-chat → agent/chat}/thread-feed-row.tsx +30 -35
- package/src/{agent-chat → agent/chat}/thread-feed.tsx +40 -35
- package/src/{agent-chat → agent/chat}/thread-message.tsx +37 -35
- package/src/{agent-chat → agent/chat}/thread-outcome-card.tsx +5 -5
- package/src/{agent-chat → agent/chat}/tool-chip.tsx +12 -12
- package/src/{agent-chat → agent/chat}/use-keyboard-inset.ts +1 -1
- package/src/{agent-chat → agent/chat}/virtualize.ts +5 -5
- package/src/agent/error.ts +43 -0
- package/src/agent/history.ts +2 -107
- package/src/agent/id.ts +4 -5
- package/src/agent/index.ts +23 -112
- package/src/agent/outcome.ts +3 -56
- package/src/agent/part-list.tsx +3 -3
- package/src/agent/parts.ts +23 -22
- package/src/agent/run-committer.ts +64 -0
- package/src/agent/run-records.ts +147 -0
- package/src/agent/thread.ts +24 -231
- package/src/agent/transport.ts +6 -96
- package/src/agent/use-agent-thread-runs.ts +364 -199
- package/src/charts/BandStrip.tsx +276 -0
- package/src/charts/Bars.tsx +141 -0
- package/src/charts/CartesianChart.tsx +206 -0
- package/src/charts/ChartCard.tsx +178 -0
- package/src/charts/Donut.tsx +256 -0
- package/src/charts/DualPanel.tsx +326 -0
- package/src/charts/Heatmap.tsx +282 -0
- package/src/charts/Lines.tsx +151 -0
- package/src/charts/MirroredBars.tsx +303 -0
- package/src/charts/Sparkline.tsx +176 -0
- package/src/charts/StackedArea.tsx +80 -0
- package/src/charts/box.tsx +96 -0
- package/src/charts/card-context.ts +11 -0
- package/src/charts/chart-box.module.css +64 -0
- package/src/charts/chart-box.module.css.d.ts +12 -0
- package/src/charts/chart-card.module.css +25 -0
- package/src/charts/chart-card.module.css.d.ts +8 -0
- package/src/charts/chart-legend.module.css +38 -0
- package/src/charts/chart-legend.module.css.d.ts +10 -0
- package/src/charts/compile.ts +585 -0
- package/src/charts/cursor.ts +282 -0
- package/src/charts/curves.ts +111 -0
- package/src/charts/donut.module.css +54 -0
- package/src/charts/donut.module.css.d.ts +9 -0
- package/src/charts/host.tsx +60 -0
- package/src/charts/index.ts +41 -178
- package/src/charts/legend.tsx +204 -0
- package/src/charts/marks.ts +201 -0
- package/src/charts/panel.tsx +227 -0
- package/src/charts/scales.ts +237 -0
- package/src/charts/sizing.ts +47 -0
- package/src/charts/state.tsx +80 -0
- package/src/charts/theme.ts +65 -0
- package/src/charts/types.ts +242 -0
- package/src/cli/audit-allows.ts +8 -30
- package/src/cli/config.ts +26 -43
- package/src/cli/doctor-upgrade.ts +457 -0
- package/src/cli/doctor.ts +89 -72
- package/src/cli/help.ts +2 -4
- package/src/cli/index.ts +100 -384
- package/src/cli/init.ts +60 -51
- package/src/cli/sync.ts +13 -68
- package/src/cli/tokens-css.ts +7 -28
- package/src/commands/ShortcutsHelp.tsx +8 -9
- package/src/commands/define-commands.ts +16 -43
- package/src/commands/define-overlays.ts +12 -36
- package/src/commands/index.ts +11 -94
- package/src/{notifications → commands/notifications}/bell.tsx +2 -2
- package/src/{notifications → commands/notifications}/center.tsx +7 -5
- package/src/{notifications → commands/notifications}/define-notifications.ts +3 -3
- package/src/commands/notifications/notify.tsx +158 -0
- package/src/{notifications → commands/notifications}/store.ts +10 -2
- package/src/commands/projectors.ts +5 -225
- package/src/commands/shell-bridge.ts +5 -5
- package/src/commands/shortcut-format.ts +5 -4
- package/src/common/errors.ts +3 -3
- package/src/common/use-measured-widths.ts +6 -3
- package/src/common/validate.ts +2 -2
- package/src/content/article-layout.tsx +37 -38
- package/src/content/article-model.ts +1 -84
- package/src/content/index.ts +12 -83
- package/src/content/markdown.tsx +4 -3
- package/src/content/mermaid.tsx +9 -7
- package/src/content/slug.ts +1 -16
- package/src/content/url-hardening.ts +8 -2
- package/src/controls/actions.tsx +24 -1
- package/src/controls/enum-filter.tsx +1 -1
- package/src/controls/filter-context.tsx +3 -1
- package/src/controls/filter-set.tsx +5 -7
- package/src/controls/form-layout.tsx +2 -2
- package/src/controls/glyphs.tsx +0 -10
- package/src/controls/index.ts +13 -64
- package/src/controls/multi-select-filter.tsx +5 -4
- package/src/controls/number-filter.tsx +8 -4
- package/src/controls/range-filter.tsx +5 -4
- package/src/controls/search-filter.tsx +25 -19
- package/src/controls/select-filter.tsx +5 -4
- package/src/controls/sync-button.tsx +18 -20
- package/src/controls/toggle-filter.tsx +5 -4
- package/src/controls/uncontrolled.ts +12 -0
- package/src/controls/view-tabs.tsx +3 -3
- package/src/controls-dates/date-range-picker.tsx +1 -1
- package/src/controls-dates/index.ts +0 -1
- package/src/dashboard/index.ts +7 -48
- package/src/dashboard/section.tsx +11 -40
- package/src/dashboard/stat-card.tsx +14 -16
- package/src/dashboard/widget-header.module.css +9 -7
- package/src/dev-dock.tsx +14 -27
- package/src/format/date.ts +2 -92
- package/src/format/index.ts +7 -53
- package/src/format/number.ts +3 -26
- package/src/format/shared.ts +2 -3
- package/src/forms/index.ts +0 -23
- package/src/guard/index.ts +36 -191
- package/src/guard/types.ts +6 -19
- package/src/index.ts +30 -282
- package/src/provider/create-router.tsx +138 -0
- package/src/provider/hotkeys.ts +70 -0
- package/src/provider/index.tsx +260 -230
- package/src/provider/lab-theme.ts +3 -2
- package/src/provider/route-transition.ts +199 -0
- package/src/provider/spotlight-actions.tsx +69 -0
- package/src/provider/test-router.tsx +25 -0
- package/src/query-client.ts +4 -22
- package/src/router-tanstack/index.ts +18 -112
- package/src/router-tanstack/nav.ts +28 -2
- package/src/router-tanstack/search-store.ts +9 -2
- package/src/router-tanstack/use-nav.ts +47 -13
- package/src/shell/app-mobile-nav.tsx +3 -2
- package/src/shell/app-sidebar.tsx +1 -1
- package/src/shell/aside-docking.ts +1 -1
- package/src/shell/index.tsx +61 -20
- package/src/shell/page-aside.tsx +47 -23
- package/src/shell/page-bar.tsx +3 -3
- package/src/shell/page-title.tsx +1 -1
- package/src/state.ts +11 -37
- package/src/styles.css +107 -7
- package/src/surfaces.ts +56 -151
- package/src/{data → table}/data-table-state.ts +5 -4
- package/src/{data → table}/data-table.tsx +170 -161
- package/src/table/index.ts +18 -0
- package/src/table/table-features.ts +102 -0
- package/src/telemetry.ts +110 -0
- package/src/theme/index.ts +22 -47
- package/src/theme/theme-toggle.module.css +30 -0
- package/src/theme/theme-toggle.module.css.d.ts +10 -0
- package/src/theme/theme-toggle.tsx +15 -43
- package/src/theme-lab/derive-controls.tsx +5 -3
- package/src/theme-lab/derive-state.ts +2 -1
- package/src/tokens/core.ts +1163 -0
- package/src/tokens/derive.ts +1 -1
- package/src/tokens/index.ts +14 -1181
- package/src/tokens/palette.ts +3 -7
- package/src/vite.ts +3 -3
- package/agent/templates/query-client.ts.tpl +0 -26
- package/dist/agent/adapter.d.ts +0 -150
- package/dist/agent/adapter.d.ts.map +0 -1
- package/dist/agent/adapter.js +0 -482
- package/dist/agent/use-agent-stream.d.ts +0 -35
- package/dist/agent/use-agent-stream.d.ts.map +0 -1
- package/dist/agent/use-agent-stream.js +0 -59
- package/dist/agent-chat/composer.d.ts.map +0 -1
- package/dist/agent-chat/index.d.ts +0 -31
- package/dist/agent-chat/index.d.ts.map +0 -1
- package/dist/agent-chat/index.js +0 -19
- package/dist/agent-chat/message-affordances.d.ts.map +0 -1
- package/dist/agent-chat/relative-time.d.ts.map +0 -1
- package/dist/agent-chat/thread-detail-panel.d.ts +0 -28
- package/dist/agent-chat/thread-detail-panel.d.ts.map +0 -1
- package/dist/agent-chat/thread-detail-panel.js +0 -115
- package/dist/agent-chat/thread-feed-row.d.ts.map +0 -1
- package/dist/agent-chat/thread-feed.d.ts.map +0 -1
- package/dist/agent-chat/thread-message.d.ts.map +0 -1
- package/dist/agent-chat/thread-outcome-card.d.ts.map +0 -1
- package/dist/agent-chat/thread-workspace.d.ts +0 -44
- package/dist/agent-chat/thread-workspace.d.ts.map +0 -1
- package/dist/agent-chat/thread-workspace.js +0 -153
- package/dist/agent-chat/tool-chip.d.ts.map +0 -1
- package/dist/agent-chat/use-keyboard-inset.d.ts.map +0 -1
- package/dist/agent-chat/virtualize.d.ts.map +0 -1
- package/dist/charts/cursor/resolve.d.ts +0 -75
- package/dist/charts/cursor/resolve.d.ts.map +0 -1
- package/dist/charts/cursor/resolve.js +0 -91
- package/dist/charts/cursor/scope.d.ts +0 -20
- package/dist/charts/cursor/scope.d.ts.map +0 -1
- package/dist/charts/cursor/scope.js +0 -20
- package/dist/charts/cursor/store.d.ts +0 -35
- package/dist/charts/cursor/store.d.ts.map +0 -1
- package/dist/charts/cursor/store.js +0 -25
- package/dist/charts/cursor/touch-pin.d.ts +0 -45
- package/dist/charts/cursor/touch-pin.d.ts.map +0 -1
- package/dist/charts/cursor/touch-pin.js +0 -79
- package/dist/charts/hooks/use-discrete-cursor.d.ts +0 -66
- package/dist/charts/hooks/use-discrete-cursor.d.ts.map +0 -1
- package/dist/charts/hooks/use-discrete-cursor.js +0 -198
- package/dist/charts/hooks/use-hysteresis.d.ts +0 -18
- package/dist/charts/hooks/use-hysteresis.d.ts.map +0 -1
- package/dist/charts/hooks/use-hysteresis.js +0 -12
- package/dist/charts/hooks/useBandPlot.d.ts +0 -145
- package/dist/charts/hooks/useBandPlot.d.ts.map +0 -1
- package/dist/charts/hooks/useBandPlot.js +0 -178
- package/dist/charts/hooks/useChartCursor.d.ts +0 -75
- package/dist/charts/hooks/useChartCursor.d.ts.map +0 -1
- package/dist/charts/hooks/useChartCursor.js +0 -200
- package/dist/charts/hooks/useChartSize.d.ts +0 -29
- package/dist/charts/hooks/useChartSize.d.ts.map +0 -1
- package/dist/charts/hooks/useChartSize.js +0 -8
- package/dist/charts/kinds/BandStrip.d.ts +0 -132
- package/dist/charts/kinds/BandStrip.d.ts.map +0 -1
- package/dist/charts/kinds/BandStrip.js +0 -241
- package/dist/charts/kinds/Bars.d.ts +0 -141
- package/dist/charts/kinds/Bars.d.ts.map +0 -1
- package/dist/charts/kinds/Bars.js +0 -343
- package/dist/charts/kinds/Donut.d.ts +0 -77
- package/dist/charts/kinds/Donut.d.ts.map +0 -1
- package/dist/charts/kinds/Donut.js +0 -245
- package/dist/charts/kinds/DualPanel.d.ts +0 -111
- package/dist/charts/kinds/DualPanel.d.ts.map +0 -1
- package/dist/charts/kinds/DualPanel.js +0 -471
- package/dist/charts/kinds/Heatmap.d.ts +0 -85
- package/dist/charts/kinds/Heatmap.d.ts.map +0 -1
- package/dist/charts/kinds/Heatmap.js +0 -243
- package/dist/charts/kinds/MirroredBars.d.ts +0 -98
- package/dist/charts/kinds/MirroredBars.d.ts.map +0 -1
- package/dist/charts/kinds/MirroredBars.js +0 -292
- package/dist/charts/kinds/MultiLine.d.ts +0 -87
- package/dist/charts/kinds/MultiLine.d.ts.map +0 -1
- package/dist/charts/kinds/MultiLine.js +0 -176
- package/dist/charts/kinds/StackedArea.d.ts +0 -73
- package/dist/charts/kinds/StackedArea.d.ts.map +0 -1
- package/dist/charts/kinds/StackedArea.js +0 -135
- package/dist/charts/kinds/ZonedLine.d.ts +0 -97
- package/dist/charts/kinds/ZonedLine.d.ts.map +0 -1
- package/dist/charts/kinds/ZonedLine.js +0 -155
- package/dist/charts/kinds/band-chrome.d.ts +0 -31
- package/dist/charts/kinds/band-chrome.d.ts.map +0 -1
- package/dist/charts/kinds/band-chrome.js +0 -71
- package/dist/charts/kinds/donut-layout.d.ts +0 -47
- package/dist/charts/kinds/donut-layout.d.ts.map +0 -1
- package/dist/charts/kinds/donut-layout.js +0 -52
- package/dist/charts/layout/auto-margin.d.ts +0 -122
- package/dist/charts/layout/auto-margin.d.ts.map +0 -1
- package/dist/charts/layout/auto-margin.js +0 -81
- package/dist/charts/layout/end-labels.d.ts +0 -64
- package/dist/charts/layout/end-labels.d.ts.map +0 -1
- package/dist/charts/layout/end-labels.js +0 -76
- package/dist/charts/layout/log-ticks.d.ts +0 -27
- package/dist/charts/layout/log-ticks.d.ts.map +0 -1
- package/dist/charts/layout/log-ticks.js +0 -42
- package/dist/charts/primitives/AreaGradient.d.ts +0 -18
- package/dist/charts/primitives/AreaGradient.d.ts.map +0 -1
- package/dist/charts/primitives/AreaGradient.js +0 -13
- package/dist/charts/primitives/Axes.d.ts +0 -83
- package/dist/charts/primitives/Axes.d.ts.map +0 -1
- package/dist/charts/primitives/Axes.js +0 -168
- package/dist/charts/primitives/CartesianChart.d.ts +0 -257
- package/dist/charts/primitives/CartesianChart.d.ts.map +0 -1
- package/dist/charts/primitives/CartesianChart.js +0 -549
- package/dist/charts/primitives/ChartCard.d.ts +0 -66
- package/dist/charts/primitives/ChartCard.d.ts.map +0 -1
- package/dist/charts/primitives/ChartCard.js +0 -143
- package/dist/charts/primitives/ChartFrame.d.ts +0 -156
- package/dist/charts/primitives/ChartFrame.d.ts.map +0 -1
- package/dist/charts/primitives/ChartFrame.js +0 -241
- package/dist/charts/primitives/ChartLegend.d.ts +0 -67
- package/dist/charts/primitives/ChartLegend.d.ts.map +0 -1
- package/dist/charts/primitives/ChartLegend.js +0 -292
- package/dist/charts/primitives/ChartPending.d.ts +0 -113
- package/dist/charts/primitives/ChartPending.d.ts.map +0 -1
- package/dist/charts/primitives/ChartPending.js +0 -117
- package/dist/charts/primitives/ChartTooltip.d.ts +0 -59
- package/dist/charts/primitives/ChartTooltip.d.ts.map +0 -1
- package/dist/charts/primitives/ChartTooltip.js +0 -197
- package/dist/charts/primitives/Crosshair.d.ts +0 -26
- package/dist/charts/primitives/Crosshair.d.ts.map +0 -1
- package/dist/charts/primitives/Crosshair.js +0 -23
- package/dist/charts/primitives/HatchPattern.d.ts +0 -31
- package/dist/charts/primitives/HatchPattern.d.ts.map +0 -1
- package/dist/charts/primitives/HatchPattern.js +0 -31
- package/dist/charts/primitives/HoverOverlay.d.ts +0 -45
- package/dist/charts/primitives/HoverOverlay.d.ts.map +0 -1
- package/dist/charts/primitives/HoverOverlay.js +0 -72
- package/dist/charts/primitives/HoverOverlay.module.css +0 -13
- package/dist/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
- package/dist/charts/primitives/XZoneRects.d.ts +0 -54
- package/dist/charts/primitives/XZoneRects.d.ts.map +0 -1
- package/dist/charts/primitives/XZoneRects.js +0 -65
- package/dist/charts/primitives/ZoneRects.d.ts +0 -38
- package/dist/charts/primitives/ZoneRects.d.ts.map +0 -1
- package/dist/charts/primitives/ZoneRects.js +0 -30
- package/dist/charts/primitives/chart-card-context.d.ts +0 -33
- package/dist/charts/primitives/chart-card-context.d.ts.map +0 -1
- package/dist/charts/primitives/chart-card-context.js +0 -18
- package/dist/charts/primitives/chart-frame-layout.d.ts +0 -185
- package/dist/charts/primitives/chart-frame-layout.d.ts.map +0 -1
- package/dist/charts/primitives/chart-frame-layout.js +0 -175
- package/dist/charts/primitives/chart-layout.d.ts +0 -112
- package/dist/charts/primitives/chart-layout.d.ts.map +0 -1
- package/dist/charts/primitives/chart-layout.js +0 -175
- package/dist/charts/primitives/chart-tier.d.ts +0 -16
- package/dist/charts/primitives/chart-tier.d.ts.map +0 -1
- package/dist/charts/primitives/chart-tier.js +0 -44
- package/dist/charts/primitives/legend-disclosure.d.ts +0 -27
- package/dist/charts/primitives/legend-disclosure.d.ts.map +0 -1
- package/dist/charts/primitives/legend-disclosure.js +0 -153
- package/dist/charts/series.d.ts +0 -189
- package/dist/charts/series.d.ts.map +0 -1
- package/dist/charts/series.js +0 -84
- package/dist/charts/sparklines/BarSparkline.d.ts +0 -37
- package/dist/charts/sparklines/BarSparkline.d.ts.map +0 -1
- package/dist/charts/sparklines/BarSparkline.js +0 -53
- package/dist/charts/sparklines/LineSparkline.d.ts +0 -15
- package/dist/charts/sparklines/LineSparkline.d.ts.map +0 -1
- package/dist/charts/sparklines/LineSparkline.js +0 -51
- package/dist/charts/sparklines/index.d.ts +0 -3
- package/dist/charts/sparklines/index.d.ts.map +0 -1
- package/dist/charts/sparklines/index.js +0 -6
- package/dist/charts/utils/domain.d.ts +0 -35
- package/dist/charts/utils/domain.d.ts.map +0 -1
- package/dist/charts/utils/domain.js +0 -12
- package/dist/charts/utils/format.d.ts +0 -8
- package/dist/charts/utils/format.d.ts.map +0 -1
- package/dist/charts/utils/format.js +0 -20
- package/dist/charts/utils/measure-text.d.ts +0 -25
- package/dist/charts/utils/measure-text.d.ts.map +0 -1
- package/dist/charts/utils/measure-text.js +0 -64
- package/dist/charts/utils/ticks.d.ts +0 -103
- package/dist/charts/utils/ticks.d.ts.map +0 -1
- package/dist/charts/utils/ticks.js +0 -92
- package/dist/commands/overlays-mount.d.ts +0 -122
- package/dist/commands/overlays-mount.d.ts.map +0 -1
- package/dist/commands/overlays-mount.js +0 -125
- package/dist/commands/useCommandHotkeys.d.ts +0 -14
- package/dist/commands/useCommandHotkeys.d.ts.map +0 -1
- package/dist/commands/useCommandHotkeys.js +0 -45
- package/dist/content/article-actions.d.ts +0 -39
- package/dist/content/article-actions.d.ts.map +0 -1
- package/dist/content/article-actions.js +0 -28
- package/dist/content/article-card.d.ts +0 -58
- package/dist/content/article-card.d.ts.map +0 -1
- package/dist/content/article-card.js +0 -79
- package/dist/content/article-card.module.css +0 -111
- package/dist/content/mdx.d.ts +0 -20
- package/dist/content/mdx.d.ts.map +0 -1
- package/dist/content/mdx.js +0 -64
- package/dist/controls/compare-filter.d.ts +0 -42
- package/dist/controls/compare-filter.d.ts.map +0 -1
- package/dist/controls/compare-filter.js +0 -38
- package/dist/controls/slider-control.d.ts +0 -36
- package/dist/controls/slider-control.d.ts.map +0 -1
- package/dist/controls/slider-control.js +0 -64
- package/dist/dashboard/widget-grid.d.ts +0 -27
- package/dist/dashboard/widget-grid.d.ts.map +0 -1
- package/dist/dashboard/widget-grid.js +0 -40
- package/dist/dashboard/widget-grid.module.css +0 -69
- package/dist/data/data-table-state.d.ts.map +0 -1
- package/dist/data/data-table.d.ts.map +0 -1
- package/dist/data/query-branch.d.ts.map +0 -1
- package/dist/data/table.d.ts +0 -24
- package/dist/data/table.d.ts.map +0 -1
- package/dist/data/virtual-list.d.ts +0 -133
- package/dist/data/virtual-list.d.ts.map +0 -1
- package/dist/data/virtual-list.js +0 -157
- package/dist/data/virtual.d.ts +0 -21
- package/dist/data/virtual.d.ts.map +0 -1
- package/dist/data/virtual.js +0 -4
- package/dist/forms/FormErrorSummary.d.ts +0 -30
- package/dist/forms/FormErrorSummary.d.ts.map +0 -1
- package/dist/forms/FormErrorSummary.js +0 -30
- package/dist/forms/use-field-array.d.ts +0 -60
- package/dist/forms/use-field-array.d.ts.map +0 -1
- package/dist/forms/use-field-array.js +0 -20
- package/dist/forms/use-form-draft.d.ts +0 -76
- package/dist/forms/use-form-draft.d.ts.map +0 -1
- package/dist/forms/use-form-draft.js +0 -92
- package/dist/forms/use-form-submit.d.ts +0 -88
- package/dist/forms/use-form-submit.d.ts.map +0 -1
- package/dist/forms/use-form-submit.js +0 -63
- package/dist/notifications/bell.d.ts.map +0 -1
- package/dist/notifications/center.d.ts.map +0 -1
- package/dist/notifications/define-notifications.d.ts.map +0 -1
- package/dist/notifications/index.d.ts +0 -40
- package/dist/notifications/index.d.ts.map +0 -1
- package/dist/notifications/index.js +0 -54
- package/dist/notifications/mount-guard.d.ts +0 -8
- package/dist/notifications/mount-guard.d.ts.map +0 -1
- package/dist/notifications/mount-guard.js +0 -18
- package/dist/notifications/notify.d.ts +0 -149
- package/dist/notifications/notify.d.ts.map +0 -1
- package/dist/notifications/notify.js +0 -171
- package/dist/notifications/store.d.ts.map +0 -1
- package/dist/provider/connectivity-indicator.d.ts +0 -13
- package/dist/provider/connectivity-indicator.d.ts.map +0 -1
- package/dist/provider/connectivity-indicator.js +0 -205
- package/dist/provider/connectivity-provider.d.ts +0 -7
- package/dist/provider/connectivity-provider.d.ts.map +0 -1
- package/dist/provider/connectivity-provider.js +0 -128
- package/dist/provider/connectivity-types.d.ts +0 -36
- package/dist/provider/connectivity-types.d.ts.map +0 -1
- package/dist/provider/use-connectivity.d.ts +0 -3
- package/dist/provider/use-connectivity.d.ts.map +0 -1
- package/dist/provider/use-connectivity.js +0 -14
- package/dist/query-devtools.d.ts +0 -21
- package/dist/query-devtools.d.ts.map +0 -1
- package/dist/query-devtools.js +0 -13
- package/src/agent/adapter.ts +0 -945
- package/src/agent/use-agent-stream.ts +0 -154
- package/src/agent-chat/index.ts +0 -54
- package/src/agent-chat/thread-detail-panel.tsx +0 -201
- package/src/agent-chat/thread-workspace.tsx +0 -279
- package/src/charts/cursor/resolve.ts +0 -198
- package/src/charts/cursor/scope.tsx +0 -35
- package/src/charts/cursor/store.ts +0 -58
- package/src/charts/cursor/touch-pin.ts +0 -138
- package/src/charts/hooks/use-discrete-cursor.ts +0 -335
- package/src/charts/hooks/use-hysteresis.ts +0 -26
- package/src/charts/hooks/useBandPlot.ts +0 -383
- package/src/charts/hooks/useChartCursor.ts +0 -367
- package/src/charts/hooks/useChartSize.ts +0 -35
- package/src/charts/kinds/BandStrip.tsx +0 -449
- package/src/charts/kinds/Bars.tsx +0 -589
- package/src/charts/kinds/Donut.tsx +0 -368
- package/src/charts/kinds/DualPanel.tsx +0 -712
- package/src/charts/kinds/Heatmap.tsx +0 -396
- package/src/charts/kinds/MirroredBars.tsx +0 -469
- package/src/charts/kinds/MultiLine.tsx +0 -322
- package/src/charts/kinds/StackedArea.tsx +0 -267
- package/src/charts/kinds/ZonedLine.tsx +0 -301
- package/src/charts/kinds/band-chrome.tsx +0 -91
- package/src/charts/kinds/donut-layout.ts +0 -82
- package/src/charts/layout/auto-margin.ts +0 -242
- package/src/charts/layout/end-labels.ts +0 -135
- package/src/charts/layout/log-ticks.ts +0 -90
- package/src/charts/primitives/AreaGradient.tsx +0 -26
- package/src/charts/primitives/Axes.tsx +0 -271
- package/src/charts/primitives/CartesianChart.tsx +0 -1002
- package/src/charts/primitives/ChartCard.tsx +0 -280
- package/src/charts/primitives/ChartFrame.tsx +0 -493
- package/src/charts/primitives/ChartLegend.tsx +0 -422
- package/src/charts/primitives/ChartPending.tsx +0 -243
- package/src/charts/primitives/ChartTooltip.tsx +0 -265
- package/src/charts/primitives/Crosshair.tsx +0 -43
- package/src/charts/primitives/HatchPattern.tsx +0 -55
- package/src/charts/primitives/HoverOverlay.module.css +0 -13
- package/src/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
- package/src/charts/primitives/HoverOverlay.tsx +0 -109
- package/src/charts/primitives/XZoneRects.tsx +0 -132
- package/src/charts/primitives/ZoneRects.tsx +0 -67
- package/src/charts/primitives/chart-card-context.ts +0 -46
- package/src/charts/primitives/chart-frame-layout.ts +0 -430
- package/src/charts/primitives/chart-layout.ts +0 -318
- package/src/charts/primitives/chart-tier.tsx +0 -76
- package/src/charts/primitives/legend-disclosure.tsx +0 -178
- package/src/charts/series.ts +0 -276
- package/src/charts/sparklines/BarSparkline.tsx +0 -94
- package/src/charts/sparklines/LineSparkline.tsx +0 -71
- package/src/charts/sparklines/index.ts +0 -2
- package/src/charts/theme.tsx +0 -53
- package/src/charts/utils/domain.ts +0 -41
- package/src/charts/utils/format.ts +0 -19
- package/src/charts/utils/measure-text.ts +0 -109
- package/src/charts/utils/ticks.ts +0 -239
- package/src/commands/overlays-mount.tsx +0 -333
- package/src/commands/useCommandHotkeys.ts +0 -114
- package/src/content/article-actions.ts +0 -72
- package/src/content/article-card.module.css +0 -111
- package/src/content/article-card.tsx +0 -174
- package/src/content/mdx.tsx +0 -127
- package/src/controls/compare-filter.tsx +0 -81
- package/src/controls/slider-control.tsx +0 -159
- package/src/dashboard/widget-grid.module.css +0 -69
- package/src/dashboard/widget-grid.tsx +0 -146
- package/src/data/table.ts +0 -39
- package/src/data/virtual-list.tsx +0 -356
- package/src/data/virtual.ts +0 -26
- package/src/forms/FormErrorSummary.tsx +0 -71
- package/src/forms/use-field-array.ts +0 -94
- package/src/forms/use-form-draft.ts +0 -262
- package/src/forms/use-form-submit.ts +0 -199
- package/src/notifications/index.ts +0 -88
- package/src/notifications/mount-guard.ts +0 -38
- package/src/notifications/notify.tsx +0 -379
- package/src/provider/connectivity-indicator.tsx +0 -267
- package/src/provider/connectivity-provider.tsx +0 -189
- package/src/provider/connectivity-types.ts +0 -42
- package/src/provider/use-connectivity.ts +0 -26
- package/src/query-devtools.tsx +0 -40
- /package/dist/{agent-chat → agent/chat}/message-affordances.js +0 -0
- /package/dist/{agent-chat → agent/chat}/relative-time.d.ts +0 -0
- /package/dist/{agent-chat → agent/chat}/relative-time.js +0 -0
- /package/dist/{agent-chat → agent/chat}/use-keyboard-inset.d.ts +0 -0
- /package/dist/{agent-chat → agent/chat}/virtualize.js +0 -0
- /package/dist/{notifications → commands/notifications}/bell.js +0 -0
- /package/dist/{notifications → commands/notifications}/define-notifications.js +0 -0
- /package/dist/{provider/connectivity-types.js → controls/uncontrolled.js} +0 -0
- /package/dist/{data → table}/data-table.module.css +0 -0
- /package/dist/{data → table}/data-table.module.css.d.ts +0 -0
- /package/dist/{data → table}/query-branch.d.ts +0 -0
- /package/dist/{data → table}/query-branch.js +0 -0
- /package/src/{agent-chat → agent/chat}/relative-time.ts +0 -0
- /package/src/{data → table}/data-table.module.css +0 -0
- /package/src/{data → table}/data-table.module.css.d.ts +0 -0
- /package/src/{data → table}/query-branch.ts +0 -0
|
@@ -1,322 +0,0 @@
|
|
|
1
|
-
import { LinePath } from '@visx/shape'
|
|
2
|
-
import { memo, useCallback, useMemo } from 'react'
|
|
3
|
-
import type { ReactNode } from 'react'
|
|
4
|
-
import { assertRequiredProps } from '../../common/validate'
|
|
5
|
-
import type { BasaltProps } from '../../common/props'
|
|
6
|
-
import type { CursorResolution } from '../cursor/resolve'
|
|
7
|
-
import type { CartesianTooltipConfig, AxisConfig, PlotContext } from '../primitives/CartesianChart'
|
|
8
|
-
import { CartesianChart } from '../primitives/CartesianChart'
|
|
9
|
-
import type { ResponsiveChartHeight } from '../primitives/ChartFrame'
|
|
10
|
-
import type { XZoneSpec } from '../primitives/XZoneRects'
|
|
11
|
-
import type { ZoneSpec } from '../primitives/ZoneRects'
|
|
12
|
-
import type { ChartState } from '../primitives/ChartPending'
|
|
13
|
-
import { curveFor, definedOn, LINE_OVERLAY_STROKE_WIDTH, toPlotPoint } from '../series'
|
|
14
|
-
import type { ChartLegendConfig, ChartSeries } from '../series'
|
|
15
|
-
import { VX } from '../../tokens'
|
|
16
|
-
|
|
17
|
-
export type MultiLineProps<T> = BasaltProps & {
|
|
18
|
-
data: T[]
|
|
19
|
-
/** Height in px, or one per size step (`{ base, sm?, md?, lg? }`). Default 240. Forwarded
|
|
20
|
-
* unchanged; `ChartFrameProps.height` owns the law — steps resolve off the MEASURED width. */
|
|
21
|
-
height?: number | ResponsiveChartHeight
|
|
22
|
-
chartId: string
|
|
23
|
-
/** Extracts the x-axis category (date string) from a data point. */
|
|
24
|
-
getX: (d: T) => string
|
|
25
|
-
/** 1+ line series sharing the y-axis(es) — the single source of truth for color, dash, legend,
|
|
26
|
-
* and tooltip rows. A series opts into the right axis with `axis: 'right'`. */
|
|
27
|
-
series: ChartSeries<T>[]
|
|
28
|
-
/** Left y-axis. Collapses the old `yDomain` / `yAutoMaxFloor` / `yAutoMinCeil` / `yAutoPad` /
|
|
29
|
-
* `numTicksY` / `formatYTick` prop soup into one object. */
|
|
30
|
-
y?: AxisConfig<T>
|
|
31
|
-
/** Right y-axis. Passing it is what makes the chart dual-axis — the margin widens by
|
|
32
|
-
* measurement, and `axis: 'right'` series read against it. */
|
|
33
|
-
y2?: AxisConfig<T>
|
|
34
|
-
/** Horizontal value-range overlays (target zones), rendered behind the lines. */
|
|
35
|
-
zones?: ZoneSpec[]
|
|
36
|
-
/** Vertical x-range overlays (time windows), rendered behind the lines. Bounds are `getX`
|
|
37
|
-
* domain keys. */
|
|
38
|
-
xZones?: XZoneSpec[]
|
|
39
|
-
/** Horizontal reference lines. Solid by default; set dashed: true for a dashed line. */
|
|
40
|
-
refLines?: { value: number; color: string; dashed?: boolean }[]
|
|
41
|
-
/** Exact number of x ticks. Default: as many as fit. Ignored when `xTickValues` is set. */
|
|
42
|
-
xTicks?: number
|
|
43
|
-
/** Which domain keys get a tick, from the full key list and the resolved plot width. Takes
|
|
44
|
-
* precedence over `xTicks` — see `CartesianChartProps.xTickValues` for why a count is not
|
|
45
|
-
* always enough. */
|
|
46
|
-
xTickValues?: (keys: readonly string[], xMax: number) => readonly string[]
|
|
47
|
-
/** X tick label formatter. Default `fmtAxisDate` (DD.MM). */
|
|
48
|
-
formatX?: (key: string) => string
|
|
49
|
-
/** Tilt the x tick labels 45° or 90°, or `0` to opt out of the phone tier's auto-rotation —
|
|
50
|
-
* see `CartesianChartProps.xLabelRotate`. */
|
|
51
|
-
xLabelRotate?: 0 | 45 | 90
|
|
52
|
-
/**
|
|
53
|
-
* How a sibling chart's broadcast cursor key resolves against this chart's points. Default
|
|
54
|
-
* `'nearest'`. Pass `'leading'` when `getX` returns a bucket's leading edge (a weekly series
|
|
55
|
-
* keyed by its Monday) — see `CursorResolution`.
|
|
56
|
-
*/
|
|
57
|
-
cursorResolution?: CursorResolution
|
|
58
|
-
/** Tooltip config — `label` for a right-aligned header badge, `extraRows` for rows appended
|
|
59
|
-
* after the derived per-series rows. `false` disables the tooltip entirely. */
|
|
60
|
-
tooltip?: CartesianTooltipConfig<T> | false
|
|
61
|
-
/** Marker glyph for per-point markers. Default 'circle'. */
|
|
62
|
-
markerShape?: 'circle' | 'star'
|
|
63
|
-
/** Legend config forwarded to `CartesianChart`; `false` disables the legend (sparkline escape).
|
|
64
|
-
* Default `{ placement: 'bottom' }`. */
|
|
65
|
-
legend?: ChartLegendConfig | false
|
|
66
|
-
/** Accessible text alternative, forwarded to `CartesianChart` as `aria-label` (+ `role="group"`). */
|
|
67
|
-
ariaLabel?: string
|
|
68
|
-
/** Forwarded to `CartesianChart` — see `ChartPending`'s JSDoc for the three-state rationale. */
|
|
69
|
-
isPending?: boolean
|
|
70
|
-
/** The three "nothing to draw" states in one prop — pending → error → empty. See
|
|
71
|
-
* `ChartState`; `isPending` stays a supported alias for `state={{ pending: true }}`. */
|
|
72
|
-
state?: ChartState
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
const STAR_R = 6
|
|
76
|
-
|
|
77
|
-
/** Five-point star path centered at (cx, cy) with outer radius r. */
|
|
78
|
-
function starPath(cx: number, cy: number, r: number): string {
|
|
79
|
-
const inner = r * 0.4
|
|
80
|
-
const pts: string[] = []
|
|
81
|
-
for (let i = 0; i < 10; i++) {
|
|
82
|
-
const radius = i % 2 === 0 ? r : inner
|
|
83
|
-
const angle = (Math.PI / 5) * i - Math.PI / 2
|
|
84
|
-
pts.push(`${cx + radius * Math.cos(angle)},${cy + radius * Math.sin(angle)}`)
|
|
85
|
-
}
|
|
86
|
-
return `M${pts.join('L')}Z`
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
type LinePt<T> = { __d: T; __y: number | null }
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Every row, in x order, with `__y: null` where the series reports no value. The null row STAYS in
|
|
93
|
-
* the array: `ChartSeries.getValue` documents null as a line GAP, and dropping the row instead
|
|
94
|
-
* makes `LinePath` join straight across a coverage hole — drawing a measurement that was never
|
|
95
|
-
* taken. `defined` on the consuming shape is what turns it back into a gap. Reused by the lines
|
|
96
|
-
* and the markers.
|
|
97
|
-
*/
|
|
98
|
-
function seriesPoints<T>(series: ChartSeries<T>, data: readonly T[]): LinePt<T>[] {
|
|
99
|
-
return data.map((d) => ({ __d: d, __y: toPlotPoint(series.getValue(d)) }))
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* N series sharing one or two y-axes, with optional zones/reference lines, per-point markers
|
|
104
|
-
* (PR stars / status dots), a dashed companion line per series, legend-hover dimming, and a
|
|
105
|
-
* shared-cursor tooltip. Generalizes the multi-line argo charts (e1RM trend, relative
|
|
106
|
-
* progression, training load, fitness trends).
|
|
107
|
-
*
|
|
108
|
-
* Composes `CartesianChart` for measuring, scales, grid, axes, cursor, and tooltip — this kind
|
|
109
|
-
* draws ONLY the marks (lines + per-point markers). `series` is the single array that drives the
|
|
110
|
-
* plotted lines, the legend, and the tooltip rows.
|
|
111
|
-
*
|
|
112
|
-
* X-axis is built from the full `data` array so the calendar is preserved even when a series
|
|
113
|
-
* has nulls; each series line BREAKS at a null point, leaving a real gap rather than interpolating
|
|
114
|
-
* across it.
|
|
115
|
-
*/
|
|
116
|
-
function MultiLineInner<T>(props: MultiLineProps<T>) {
|
|
117
|
-
// F-ERR-1: name the component and the prop. Without this a missing accessor surfaces
|
|
118
|
-
// from inside visx as `undefined is not a function`, which `BasaltErrorBoundary`
|
|
119
|
-
// swallows into a blank subtree that names nothing.
|
|
120
|
-
assertRequiredProps('MultiLine', props, ['data', 'getX', 'series'])
|
|
121
|
-
const {
|
|
122
|
-
data,
|
|
123
|
-
chartId,
|
|
124
|
-
getX,
|
|
125
|
-
series,
|
|
126
|
-
y,
|
|
127
|
-
y2,
|
|
128
|
-
zones,
|
|
129
|
-
xZones,
|
|
130
|
-
refLines,
|
|
131
|
-
xTicks,
|
|
132
|
-
xTickValues,
|
|
133
|
-
formatX,
|
|
134
|
-
xLabelRotate,
|
|
135
|
-
cursorResolution,
|
|
136
|
-
tooltip,
|
|
137
|
-
markerShape = 'circle',
|
|
138
|
-
height,
|
|
139
|
-
legend,
|
|
140
|
-
ariaLabel,
|
|
141
|
-
isPending,
|
|
142
|
-
state,
|
|
143
|
-
className,
|
|
144
|
-
style,
|
|
145
|
-
} = props
|
|
146
|
-
|
|
147
|
-
// Default line overlays to the redesign's 1.9px stroke (docs/DESIGN-SPEC.md §5) — applied once
|
|
148
|
-
// here so the plotted line, the derived legend swatch, and the derived tooltip row all agree.
|
|
149
|
-
const styledSeries = useMemo<ChartSeries<T>[]>(
|
|
150
|
-
() => series.map((s) => ({ ...s, strokeWidth: s.strokeWidth ?? LINE_OVERLAY_STROKE_WIDTH })),
|
|
151
|
-
[series],
|
|
152
|
-
)
|
|
153
|
-
|
|
154
|
-
return (
|
|
155
|
-
<CartesianChart
|
|
156
|
-
data={data}
|
|
157
|
-
chartId={chartId}
|
|
158
|
-
getX={getX}
|
|
159
|
-
series={styledSeries}
|
|
160
|
-
{...(y !== undefined && { y })}
|
|
161
|
-
{...(y2 !== undefined && { y2 })}
|
|
162
|
-
{...(zones !== undefined && { zones })}
|
|
163
|
-
{...(xZones !== undefined && { xZones })}
|
|
164
|
-
{...(refLines !== undefined && { refLines })}
|
|
165
|
-
{...(xTicks !== undefined && { xTicks })}
|
|
166
|
-
{...(xTickValues !== undefined && { xTickValues })}
|
|
167
|
-
{...(formatX !== undefined && { formatX })}
|
|
168
|
-
{...(xLabelRotate !== undefined && { xLabelRotate })}
|
|
169
|
-
{...(cursorResolution !== undefined && { cursorResolution })}
|
|
170
|
-
{...(tooltip !== undefined && { tooltip })}
|
|
171
|
-
{...(height !== undefined && { height })}
|
|
172
|
-
{...(legend !== undefined && { legend })}
|
|
173
|
-
{...(ariaLabel !== undefined && { ariaLabel })}
|
|
174
|
-
{...(isPending !== undefined && { isPending })}
|
|
175
|
-
{...(state !== undefined && { state })}
|
|
176
|
-
{...(className !== undefined && { className })}
|
|
177
|
-
{...(style !== undefined && { style })}
|
|
178
|
-
>
|
|
179
|
-
{(ctx: PlotContext<T>) => <MultiLineMarks getX={getX} markerShape={markerShape} ctx={ctx} />}
|
|
180
|
-
</CartesianChart>
|
|
181
|
-
)
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
/** Draws lines + per-point markers for the visible series, dimming everything except the
|
|
185
|
-
* legend-highlighted series (and its dashed companions, matched by `parent`). */
|
|
186
|
-
function MultiLineMarks<T>({
|
|
187
|
-
getX,
|
|
188
|
-
markerShape,
|
|
189
|
-
ctx,
|
|
190
|
-
}: {
|
|
191
|
-
getX: (d: T) => string
|
|
192
|
-
markerShape: 'circle' | 'star'
|
|
193
|
-
ctx: PlotContext<T>
|
|
194
|
-
}) {
|
|
195
|
-
const { data, visible, xScale, yScale, y2Scale, highlighted } = ctx
|
|
196
|
-
|
|
197
|
-
// Memoized per (visible, data), NOT recomputed per render: the cursor is a shared store now, so
|
|
198
|
-
// every pointer frame re-renders every chart on the page. Without this, each frame walks the
|
|
199
|
-
// full series × data grid twice (lines, then markers) and allocates a fresh point array for
|
|
200
|
-
// each — the exact per-paint recompute the
|
|
201
|
-
// pre-rebuild kind memoized away.
|
|
202
|
-
const pointsBySeries = useMemo(() => {
|
|
203
|
-
const m = new Map<string, LinePt<T>[]>()
|
|
204
|
-
for (const s of visible) m.set(s.key, seriesPoints(s, data))
|
|
205
|
-
return m
|
|
206
|
-
}, [visible, data])
|
|
207
|
-
|
|
208
|
-
// A series stays at full opacity when nothing is highlighted, when it IS the highlighted series,
|
|
209
|
-
// or when it is a companion of the highlighted series (its `parent` matches). `useCallback`
|
|
210
|
-
// (rather than a plain function) gives both a stable identity across renders where `highlighted`/
|
|
211
|
-
// `y2Scale` haven't changed, so `markerNodes` below can depend on THEM rather than the raw
|
|
212
|
-
// scale/highlighted values a closure would otherwise hide from the deps array.
|
|
213
|
-
const dimOpacity = useCallback(
|
|
214
|
-
(s: ChartSeries<T>): number =>
|
|
215
|
-
highlighted === null || s.key === highlighted || s.parent === highlighted ? 1 : 0.25,
|
|
216
|
-
[highlighted],
|
|
217
|
-
)
|
|
218
|
-
|
|
219
|
-
const scaleFor = useCallback(
|
|
220
|
-
(s: ChartSeries<T>) => (s.axis === 'right' && y2Scale !== null ? y2Scale : yScale),
|
|
221
|
-
[y2Scale, yScale],
|
|
222
|
-
)
|
|
223
|
-
|
|
224
|
-
// Memoized for the same reason as `pointsBySeries` above — the shared cursor re-renders every
|
|
225
|
-
// mounted chart on every pointer frame, and this walks every visible series' points calling the
|
|
226
|
-
// consumer's `getMarker` each time otherwise.
|
|
227
|
-
const markerNodes = useMemo<ReactNode[]>(
|
|
228
|
-
() =>
|
|
229
|
-
visible.flatMap((s) => {
|
|
230
|
-
const getMarker = s.getMarker
|
|
231
|
-
if (!getMarker) return [] as ReactNode[]
|
|
232
|
-
const scale = scaleFor(s)
|
|
233
|
-
const op = dimOpacity(s)
|
|
234
|
-
const markers: ReactNode[] = []
|
|
235
|
-
for (const p of pointsBySeries.get(s.key) ?? []) {
|
|
236
|
-
// A null point is an absence: no dot, no marker — the same claim the line's `defined`
|
|
237
|
-
// makes by breaking there.
|
|
238
|
-
if (p.__y === null) continue
|
|
239
|
-
const m = getMarker(p.__d)
|
|
240
|
-
if (m === null) continue
|
|
241
|
-
const cx = xScale(getX(p.__d)) ?? 0
|
|
242
|
-
const cy = scale(p.__y)
|
|
243
|
-
// A non-positive value on a log axis (or any input a scale can't place) maps to NaN —
|
|
244
|
-
// skip the marker rather than paint one at `cy="NaN"`.
|
|
245
|
-
if (!Number.isFinite(cy)) continue
|
|
246
|
-
const color = m.color ?? s.color
|
|
247
|
-
const r = m.r ?? (markerShape === 'star' ? STAR_R : VX.dotR)
|
|
248
|
-
const ring = m.ring ?? true
|
|
249
|
-
const fillOpacity = (m.fillOpacity ?? 1) * op
|
|
250
|
-
markers.push(
|
|
251
|
-
markerShape === 'star' ? (
|
|
252
|
-
<path
|
|
253
|
-
key={`mk-${s.key}-${getX(p.__d)}`}
|
|
254
|
-
d={starPath(cx, cy, r)}
|
|
255
|
-
fill={color}
|
|
256
|
-
fillOpacity={fillOpacity}
|
|
257
|
-
{...(ring && { stroke: VX.dotStroke, strokeWidth: 1.5, strokeOpacity: op })}
|
|
258
|
-
/>
|
|
259
|
-
) : (
|
|
260
|
-
<circle
|
|
261
|
-
key={`mk-${s.key}-${getX(p.__d)}`}
|
|
262
|
-
cx={cx}
|
|
263
|
-
cy={cy}
|
|
264
|
-
r={r}
|
|
265
|
-
fill={color}
|
|
266
|
-
fillOpacity={fillOpacity}
|
|
267
|
-
{...(ring && { stroke: VX.dotStroke, strokeWidth: 2, strokeOpacity: op })}
|
|
268
|
-
/>
|
|
269
|
-
),
|
|
270
|
-
)
|
|
271
|
-
}
|
|
272
|
-
return markers
|
|
273
|
-
}),
|
|
274
|
-
[visible, pointsBySeries, xScale, getX, scaleFor, dimOpacity, markerShape],
|
|
275
|
-
)
|
|
276
|
-
|
|
277
|
-
return (
|
|
278
|
-
<>
|
|
279
|
-
{visible.map((s) => {
|
|
280
|
-
const pts = pointsBySeries.get(s.key) ?? []
|
|
281
|
-
// A series that measured nothing (the legend-only `getValue: () => null` idiom) draws no
|
|
282
|
-
// path at all, rather than an empty one.
|
|
283
|
-
if (!pts.some((p) => p.__y !== null)) return null
|
|
284
|
-
const scale = scaleFor(s)
|
|
285
|
-
return (
|
|
286
|
-
<LinePath<LinePt<T>>
|
|
287
|
-
key={`line-${s.key}`}
|
|
288
|
-
data={pts}
|
|
289
|
-
x={(p) => xScale(getX(p.__d)) ?? 0}
|
|
290
|
-
// Never reached with a null `__y`: d3's line generator calls the position accessors
|
|
291
|
-
// only for points `defined` accepted. The `NaN` floor is a type-level one, and it can
|
|
292
|
-
// never paint at zero the way a `?? 0` would.
|
|
293
|
-
y={(p) => scale(p.__y ?? NaN)}
|
|
294
|
-
// Two absences, one guard. A null value is a documented GAP (`ChartSeries.getValue`),
|
|
295
|
-
// and a non-positive value on a log axis maps to NaN via `scale(p.__y)` — `defined`
|
|
296
|
-
// breaks the line at both instead of interpolating across the hole (a coverage hole
|
|
297
|
-
// reading as a measured straight line) or emitting a NaN path command, which per SVG
|
|
298
|
-
// error handling blanks the ENTIRE polyline from that point on.
|
|
299
|
-
defined={definedOn(scale)}
|
|
300
|
-
stroke={s.color}
|
|
301
|
-
strokeWidth={s.strokeWidth ?? LINE_OVERLAY_STROKE_WIDTH}
|
|
302
|
-
strokeDasharray={s.dash === 'dashed' ? VX.dashArray : undefined}
|
|
303
|
-
strokeOpacity={dimOpacity(s) * (s.strokeOpacity ?? 1)}
|
|
304
|
-
curve={curveFor(s.curve)}
|
|
305
|
-
/>
|
|
306
|
-
)
|
|
307
|
-
})}
|
|
308
|
-
|
|
309
|
-
{markerNodes}
|
|
310
|
-
</>
|
|
311
|
-
)
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
/**
|
|
315
|
-
* Hand-memoized: React Compiler does not process the shipped dist, so the hot MultiLine kind is
|
|
316
|
-
* wrapped in `React.memo` to retain the auto-memoization it had as source (parity with ZonedLine).
|
|
317
|
-
*/
|
|
318
|
-
const MultiLineMemo = memo(MultiLineInner)
|
|
319
|
-
// Without it every kind reads as `Memo` in React DevTools (audit A16) — a profiler flame
|
|
320
|
-
// graph of nine identically-named nodes names nothing.
|
|
321
|
-
MultiLineMemo.displayName = 'MultiLine'
|
|
322
|
-
export const MultiLine = MultiLineMemo as typeof MultiLineInner
|
|
@@ -1,267 +0,0 @@
|
|
|
1
|
-
import { AreaStack } from '@visx/shape'
|
|
2
|
-
import { memo, useCallback, useMemo } from 'react'
|
|
3
|
-
import { assertRequiredProps } from '../../common/validate'
|
|
4
|
-
import type { BasaltProps } from '../../common/props'
|
|
5
|
-
import type { CursorResolution } from '../cursor/resolve'
|
|
6
|
-
import { CartesianChart } from '../primitives/CartesianChart'
|
|
7
|
-
import type { AxisConfig, PlotContext } from '../primitives/CartesianChart'
|
|
8
|
-
import type { ResponsiveChartHeight } from '../primitives/ChartFrame'
|
|
9
|
-
import type { ChartState } from '../primitives/ChartPending'
|
|
10
|
-
import { curveFor } from '../series'
|
|
11
|
-
import type { ChartLegendConfig, ChartSeries } from '../series'
|
|
12
|
-
|
|
13
|
-
export type StackedAreaProps<T> = BasaltProps & {
|
|
14
|
-
data: T[]
|
|
15
|
-
/** Height in px, or one per size step (`{ base, sm?, md?, lg? }`). Default 240. Forwarded
|
|
16
|
-
* unchanged; `ChartFrameProps.height` owns the law — steps resolve off the MEASURED width. */
|
|
17
|
-
height?: number | ResponsiveChartHeight
|
|
18
|
-
chartId: string
|
|
19
|
-
getX: (d: T) => string
|
|
20
|
-
/** The stacked bands, bottom to top — the single source of truth for color, legend, and tooltip
|
|
21
|
-
* rows. Typically `mark: 'area'` (rendered as a `bar`-shaped legend/tooltip swatch). */
|
|
22
|
-
series: ChartSeries<T>[]
|
|
23
|
-
/** Axis config for ticks/format/grid. `domain` defaults to the summed per-point stack total
|
|
24
|
-
* (padded ×1.1, or `autoMaxFloor` if higher) rather than a per-series max — the seam a stacked
|
|
25
|
-
* chart needs, since the plotted quantity is the cumulative band top, not any one series' own
|
|
26
|
-
* value. Pass a fixed tuple or your own function to override. No `scale` — stacking sums bar
|
|
27
|
-
* heights directly and a log axis has no additive zero to sum from. */
|
|
28
|
-
y?: Omit<AxisConfig<T>, 'scale'>
|
|
29
|
-
/** Exact number of x ticks. Default: as many as fit. Ignored when `xTickValues` is set. */
|
|
30
|
-
xTicks?: number
|
|
31
|
-
/** Which domain keys get a tick, from the full key list and the resolved plot width. Takes
|
|
32
|
-
* precedence over `xTicks` — see `CartesianChartProps.xTickValues` for why a count is not
|
|
33
|
-
* always enough. */
|
|
34
|
-
xTickValues?: (keys: readonly string[], xMax: number) => readonly string[]
|
|
35
|
-
/** X tick label formatter. Default `fmtAxisDate` (DD.MM). */
|
|
36
|
-
formatX?: (key: string) => string
|
|
37
|
-
/** Tilt the x tick labels 45° or 90°, or `0` to opt out of the phone tier's auto-rotation —
|
|
38
|
-
* see `CartesianChartProps.xLabelRotate`. */
|
|
39
|
-
xLabelRotate?: 0 | 45 | 90
|
|
40
|
-
/**
|
|
41
|
-
* How a sibling chart's broadcast cursor key resolves against this chart's points. Default
|
|
42
|
-
* `'nearest'`. Pass `'leading'` when `getX` returns a bucket's leading edge (a weekly series
|
|
43
|
-
* keyed by its Monday) — see `CursorResolution`.
|
|
44
|
-
*/
|
|
45
|
-
cursorResolution?: CursorResolution
|
|
46
|
-
/** Legend config forwarded to `CartesianChart`; `false` disables the legend (sparkline escape).
|
|
47
|
-
* Default `{ placement: 'bottom' }`. */
|
|
48
|
-
legend?: ChartLegendConfig | false
|
|
49
|
-
/** Accessible text alternative, forwarded as `aria-label` (+ `role="group"`). */
|
|
50
|
-
ariaLabel?: string
|
|
51
|
-
/** Forwarded to `CartesianChart` — see `ChartPending`'s JSDoc for the three-state rationale. */
|
|
52
|
-
isPending?: boolean
|
|
53
|
-
/** The three "nothing to draw" states in one prop — pending → error → empty. See
|
|
54
|
-
* `ChartState`; `isPending` stays a supported alias for `state={{ pending: true }}`. */
|
|
55
|
-
state?: ChartState
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* A stack is only as dense as its sparsest band. A band's value is only meaningful as part of a
|
|
60
|
-
* cumulative total, so a row where ANY visible band reports `null` has no total — every band gaps
|
|
61
|
-
* across it. Reading the missing band as `0` instead would be a positive claim the quantity was
|
|
62
|
-
* measured at zero, which is exactly the absence-as-data lie `ChartSeries.getValue`'s null
|
|
63
|
-
* contract exists to prevent.
|
|
64
|
-
*/
|
|
65
|
-
function rowIsDense<T>(d: T, bands: readonly ChartSeries<T>[]): boolean {
|
|
66
|
-
return bands.every((s) => s.getValue(d) !== null)
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Multi-series stacked-area chart with an optional derived legend (default on) and legend-hover
|
|
71
|
-
* dimming. Each band's fillOpacity is dimmed when a different key is highlighted via the legend.
|
|
72
|
-
*
|
|
73
|
-
* **A stack is only as dense as its sparsest series.** A row where any VISIBLE band is null is
|
|
74
|
-
* dropped from the stack entirely — the bands break across that x, the crosshair reports no
|
|
75
|
-
* cumulative value there, and the axis domain ignores it. Toggling the sparse band off in the
|
|
76
|
-
* legend closes the gap, because density is measured against the visible set. A chart that needs
|
|
77
|
-
* a null band to read as zero must say so in its own `getValue`.
|
|
78
|
-
*
|
|
79
|
-
* Composes `CartesianChart` (`docs/CHARTS-SPEC.md` §2) — margin, scale, grid, axes, cursor, and
|
|
80
|
-
* tooltip are the primitive's job. This file draws only the `AreaStack` bands.
|
|
81
|
-
*
|
|
82
|
-
* The tooltip must render top-to-bottom (matching the visual stack read from the top), but the
|
|
83
|
-
* marks must stack bottom-to-top (matching `series`' own order) — the two can't share one order.
|
|
84
|
-
* `CartesianChart`'s `series` prop drives BOTH the derived tooltip rows and legend, so `series` is
|
|
85
|
-
* passed reversed to it (tooltip/legend read top-first); the marks then reverse `ctx.visible` back
|
|
86
|
-
* to restore the original bottom-to-top stacking order for `AreaStack`'s `keys`.
|
|
87
|
-
*/
|
|
88
|
-
function StackedAreaInner<T>(props: StackedAreaProps<T>) {
|
|
89
|
-
// F-ERR-1: name the component and the prop. Without this a missing accessor surfaces
|
|
90
|
-
// from inside visx as `undefined is not a function`, which `BasaltErrorBoundary`
|
|
91
|
-
// swallows into a blank subtree that names nothing.
|
|
92
|
-
assertRequiredProps('StackedArea', props, ['data', 'getX', 'series'])
|
|
93
|
-
const {
|
|
94
|
-
data,
|
|
95
|
-
chartId,
|
|
96
|
-
getX,
|
|
97
|
-
series,
|
|
98
|
-
y,
|
|
99
|
-
xTicks,
|
|
100
|
-
xTickValues,
|
|
101
|
-
formatX,
|
|
102
|
-
xLabelRotate,
|
|
103
|
-
cursorResolution,
|
|
104
|
-
height,
|
|
105
|
-
legend,
|
|
106
|
-
ariaLabel,
|
|
107
|
-
isPending,
|
|
108
|
-
state,
|
|
109
|
-
className,
|
|
110
|
-
style,
|
|
111
|
-
} = props
|
|
112
|
-
|
|
113
|
-
// The stack sums band heights via `getValue` totals directly — a log axis has no additive zero
|
|
114
|
-
// to sum from (`docs/CHARTS-SPEC.md`'s null-gap + log contract, mirrored from `Bars`' own guard).
|
|
115
|
-
if (
|
|
116
|
-
process.env.NODE_ENV !== 'production' &&
|
|
117
|
-
(y as { scale?: string } | undefined)?.scale === 'log'
|
|
118
|
-
) {
|
|
119
|
-
throw new Error(
|
|
120
|
-
'StackedArea: cannot use a log axis (y.scale: "log") — the stack sums band heights, ' +
|
|
121
|
-
'and a log axis has no additive zero to sum from.',
|
|
122
|
-
)
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// The plotted quantity is the CUMULATIVE stack top, not any one series' value — the built-in
|
|
126
|
-
// 'auto' domain (per-series max) would clip a multi-band stack. Skipped when the caller already
|
|
127
|
-
// supplies a fixed tuple or their own domain function.
|
|
128
|
-
const yConfig = useMemo<AxisConfig<T>>(() => {
|
|
129
|
-
const base = y ?? {}
|
|
130
|
-
if (base.domain !== undefined && base.domain !== 'auto') return base
|
|
131
|
-
const pad = base.autoPad ?? 1.1
|
|
132
|
-
return {
|
|
133
|
-
...base,
|
|
134
|
-
// Sums the VISIBLE bands only, so toggling one off in the legend shrinks the axis instead
|
|
135
|
-
// of leaving a permanent empty gap above the stack.
|
|
136
|
-
domain: (rows: readonly T[], visible: readonly ChartSeries<T>[]) => {
|
|
137
|
-
let maxTotal = 0
|
|
138
|
-
for (const d of rows) {
|
|
139
|
-
// A sparse row is not drawn, so it cannot set the axis top either.
|
|
140
|
-
if (!rowIsDense(d, visible)) continue
|
|
141
|
-
let total = 0
|
|
142
|
-
for (const s of visible) total += s.getValue(d) ?? 0
|
|
143
|
-
if (total > maxTotal) maxTotal = total
|
|
144
|
-
}
|
|
145
|
-
return [0, Math.max(maxTotal, base.autoMaxFloor ?? maxTotal) * pad]
|
|
146
|
-
},
|
|
147
|
-
}
|
|
148
|
-
}, [y])
|
|
149
|
-
|
|
150
|
-
// A stacked band's crosshair dot belongs at the CUMULATIVE band top — the edge the reader is
|
|
151
|
-
// tracking — not at the band's own raw value, which sits somewhere inside the fill.
|
|
152
|
-
const stackedCursorValue = useCallback(
|
|
153
|
-
(d: T, s: ChartSeries<T>, visible: readonly ChartSeries<T>[]): number | null => {
|
|
154
|
-
// No total on a sparse row — the bands gap there, so a dot would sit on nothing. The
|
|
155
|
-
// per-band tooltip rows keep skipping their own nulls (`deriveTooltipRows`), so a row the
|
|
156
|
-
// stack cannot draw never contributes a value anywhere.
|
|
157
|
-
if (!rowIsDense(d, visible)) return null
|
|
158
|
-
let total = 0
|
|
159
|
-
// `visible` arrives top-to-bottom (the `series.toReversed()` handed to the primitive);
|
|
160
|
-
// stacking accumulates bottom-up.
|
|
161
|
-
for (let i = visible.length - 1; i >= 0; i--) {
|
|
162
|
-
const band = visible[i] as ChartSeries<T>
|
|
163
|
-
total += band.getValue(d) ?? 0
|
|
164
|
-
if (band.key === s.key) return total
|
|
165
|
-
}
|
|
166
|
-
return null
|
|
167
|
-
},
|
|
168
|
-
[],
|
|
169
|
-
)
|
|
170
|
-
|
|
171
|
-
// Memoized: this array is `CartesianChart`'s `series` prop, and a fresh identity every render
|
|
172
|
-
// would bust every memo keyed on it inside the primitive (domains, tick labels, margin, visible).
|
|
173
|
-
const reversedSeries = useMemo(() => series.toReversed(), [series])
|
|
174
|
-
|
|
175
|
-
return (
|
|
176
|
-
<CartesianChart
|
|
177
|
-
data={data}
|
|
178
|
-
chartId={chartId}
|
|
179
|
-
getX={getX}
|
|
180
|
-
series={reversedSeries}
|
|
181
|
-
y={yConfig}
|
|
182
|
-
cursorValue={stackedCursorValue}
|
|
183
|
-
{...(xTicks !== undefined && { xTicks })}
|
|
184
|
-
{...(xTickValues !== undefined && { xTickValues })}
|
|
185
|
-
{...(formatX !== undefined && { formatX })}
|
|
186
|
-
{...(xLabelRotate !== undefined && { xLabelRotate })}
|
|
187
|
-
{...(cursorResolution !== undefined && { cursorResolution })}
|
|
188
|
-
{...(height !== undefined && { height })}
|
|
189
|
-
{...(legend !== undefined && { legend })}
|
|
190
|
-
{...(ariaLabel !== undefined && { ariaLabel })}
|
|
191
|
-
{...(isPending !== undefined && { isPending })}
|
|
192
|
-
{...(state !== undefined && { state })}
|
|
193
|
-
{...(className !== undefined && { className })}
|
|
194
|
-
{...(style !== undefined && { style })}
|
|
195
|
-
>
|
|
196
|
-
{(ctx) => <StackedAreaMarks getX={getX} ctx={ctx} />}
|
|
197
|
-
</CartesianChart>
|
|
198
|
-
)
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
/**
|
|
202
|
-
* The bands. A component rather than an inline render-prop body so the stack bookkeeping can be
|
|
203
|
-
* memoized: the cursor is a shared store, so every pointer frame re-renders every chart, and
|
|
204
|
-
* rebuilding the key list + lookup Map + a copy of `data` per frame is pure waste.
|
|
205
|
-
*/
|
|
206
|
-
function StackedAreaMarks<T>({ getX, ctx }: { getX: (d: T) => string; ctx: PlotContext<T> }) {
|
|
207
|
-
const { visible, xScale, yScale, highlighted } = ctx
|
|
208
|
-
|
|
209
|
-
// Restore bottom-to-top order for the actual stacking geometry (see the component doc above).
|
|
210
|
-
const { groups, seriesByKey } = useMemo(() => {
|
|
211
|
-
const stackOrder = visible.toReversed()
|
|
212
|
-
return {
|
|
213
|
-
groups: stackOrder.map((s) => s.key),
|
|
214
|
-
seriesByKey: new Map(stackOrder.map((s) => [s.key, s])),
|
|
215
|
-
}
|
|
216
|
-
}, [visible])
|
|
217
|
-
|
|
218
|
-
// `AreaStack` wants a mutable array; `ctx.data` is readonly. Copy once per data change.
|
|
219
|
-
const rows = useMemo(() => [...ctx.data], [ctx.data])
|
|
220
|
-
|
|
221
|
-
// `AreaStack` draws every band from ONE curve — the bands share their boundaries, so two curves
|
|
222
|
-
// would leave gaps and overlaps between them. `visible` is in `reversedSeries` order (top band
|
|
223
|
-
// first), so this resolves to the TOPMOST VISIBLE band that declares a `curve` — the last such
|
|
224
|
-
// entry in the caller's own `series` array. A band declaring none is skipped rather than read as
|
|
225
|
-
// the monotone default, and a HIDDEN one is never consulted, so a legend toggle can hand the
|
|
226
|
-
// stack to the next declarer down. `series.curve.test.tsx` pins all four halves of that.
|
|
227
|
-
const curve = curveFor(visible.find((s) => s.curve !== undefined)?.curve)
|
|
228
|
-
|
|
229
|
-
return (
|
|
230
|
-
<AreaStack<T, string>
|
|
231
|
-
data={rows}
|
|
232
|
-
keys={groups}
|
|
233
|
-
x={(d) => xScale(getX(d.data)) ?? 0}
|
|
234
|
-
y0={(d) => yScale(d[0]) ?? 0}
|
|
235
|
-
y1={(d) => yScale(d[1]) ?? 0}
|
|
236
|
-
// d3's stack layout needs a number per cell, so a null still enters the layout as 0 — but
|
|
237
|
-
// `defined` keeps that cell out of every band's PATH, so the zero is never drawn. Without it
|
|
238
|
-
// a missing band reads as a measured zero and the bands above it slide down onto it.
|
|
239
|
-
value={(d, key) => seriesByKey.get(key)?.getValue(d) ?? 0}
|
|
240
|
-
defined={(d) => rowIsDense(d.data, visible)}
|
|
241
|
-
curve={curve}
|
|
242
|
-
>
|
|
243
|
-
{({ stacks, path }) =>
|
|
244
|
-
stacks.map((stack) => (
|
|
245
|
-
<path
|
|
246
|
-
key={`stack-${stack.key}`}
|
|
247
|
-
d={path(stack) || ''}
|
|
248
|
-
fill={seriesByKey.get(stack.key)?.color}
|
|
249
|
-
stroke="transparent"
|
|
250
|
-
fillOpacity={highlighted === null || highlighted === stack.key ? 1 : 0.25}
|
|
251
|
-
/>
|
|
252
|
-
))
|
|
253
|
-
}
|
|
254
|
-
</AreaStack>
|
|
255
|
-
)
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
/**
|
|
259
|
-
* Hand-memoized: React Compiler does not process the shipped dist, so we wrap the
|
|
260
|
-
* hot stacked-area kind in `React.memo` to retain the auto-memoization it had as source
|
|
261
|
-
* (parity with ZonedLine / Bars / MultiLine).
|
|
262
|
-
*/
|
|
263
|
-
const StackedAreaMemo = memo(StackedAreaInner)
|
|
264
|
-
// Without it every kind reads as `Memo` in React DevTools (audit A16) — a profiler flame
|
|
265
|
-
// graph of nine identically-named nodes names nothing.
|
|
266
|
-
StackedAreaMemo.displayName = 'StackedArea'
|
|
267
|
-
export const StackedArea = StackedAreaMemo as typeof StackedAreaInner
|