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
|
@@ -1,422 +0,0 @@
|
|
|
1
|
-
import type { CSSProperties, MouseEvent, ReactNode } from 'react'
|
|
2
|
-
import type { BasaltProps } from '../../common/props'
|
|
3
|
-
import { useCoarsePointer } from '../../common/use-media-query'
|
|
4
|
-
import { alpha, VX } from '../../tokens'
|
|
5
|
-
import type { SeriesRole, LegendPlacement } from '../series'
|
|
6
|
-
import { DOTS_HIT_GAP, LEGEND_DOT_SIZE, LEGEND_ROW_GAP, orderEntries } from './chart-frame-layout'
|
|
7
|
-
import { useChartMetrics } from './chart-tier'
|
|
8
|
-
import { LegendDisclosure, useLegendDisclosure } from './legend-disclosure'
|
|
9
|
-
|
|
10
|
-
export type LegendEntry = {
|
|
11
|
-
key: string
|
|
12
|
-
label: string
|
|
13
|
-
color: string
|
|
14
|
-
secondColor?: string
|
|
15
|
-
strokeWidth?: number
|
|
16
|
-
shape?: 'line' | 'bar' | 'split' | 'splitLine'
|
|
17
|
-
/** Render line-style swatches as dashed (only applies to 'line' / 'splitLine'). */
|
|
18
|
-
dashed?: boolean
|
|
19
|
-
/** bar swatch opacity — honored instead of a hardcoded value, so it cannot lie about the fill. */
|
|
20
|
-
fillOpacity?: number
|
|
21
|
-
/** line/splitLine swatch stroke opacity — parity with `fillOpacity` above, so a dimmed
|
|
22
|
-
* companion line's swatch cannot lie about its own opacity either. */
|
|
23
|
-
strokeOpacity?: number
|
|
24
|
-
/** Drives `groups` rendering (series → hairline divider → overlay → reference). */
|
|
25
|
-
role?: SeriesRole
|
|
26
|
-
/** Companions folded under this entry via `parent` (`deriveLegend`) — rendered as compact,
|
|
27
|
-
* subordinate sub-entries beside the parent's label instead of vanishing. */
|
|
28
|
-
children?: LegendEntry[]
|
|
29
|
-
/** Short qualifier rendered after the label in muted text — e.g. a flat-at-zero series that is
|
|
30
|
-
* invisible in the plot. */
|
|
31
|
-
note?: string
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
const LEGEND_ITEM_BASE: CSSProperties = {
|
|
35
|
-
display: 'flex',
|
|
36
|
-
alignItems: 'center',
|
|
37
|
-
gap: 6,
|
|
38
|
-
cursor: 'default',
|
|
39
|
-
transition: 'opacity 0.15s',
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// An interactive legend entry is a native <button> (keyboard-focusable, no jsx-a11y role hack) —
|
|
43
|
-
// this strips the browser's default button chrome so it renders identically to the static entry.
|
|
44
|
-
const LEGEND_ITEM_BUTTON: CSSProperties = {
|
|
45
|
-
...LEGEND_ITEM_BASE,
|
|
46
|
-
appearance: 'none',
|
|
47
|
-
background: 'none',
|
|
48
|
-
border: 'none',
|
|
49
|
-
padding: 0,
|
|
50
|
-
margin: 0,
|
|
51
|
-
font: 'inherit',
|
|
52
|
-
color: 'inherit',
|
|
53
|
-
textAlign: 'inherit',
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/** Stable empty set — a fresh `new Set()` default would be a new identity on every render. */
|
|
57
|
-
const NO_HIDDEN: ReadonlySet<string> = new Set()
|
|
58
|
-
|
|
59
|
-
function wrapperStyle(placement: LegendPlacement, fontSize: number, dots: boolean): CSSProperties {
|
|
60
|
-
const vertical = placement === 'left' || placement === 'right'
|
|
61
|
-
const gap = dots ? DOTS_HIT_GAP : VX.legendGap
|
|
62
|
-
return {
|
|
63
|
-
display: 'flex',
|
|
64
|
-
flexDirection: vertical ? 'column' : 'row',
|
|
65
|
-
flexWrap: vertical ? 'nowrap' : 'wrap',
|
|
66
|
-
alignItems: vertical ? 'flex-start' : 'center',
|
|
67
|
-
justifyContent: 'flex-start',
|
|
68
|
-
columnGap: gap,
|
|
69
|
-
// Always the tight row gap (R2C-9): the wider dots COLUMN gap is a hit-overlap cap, not
|
|
70
|
-
// breathing room between wrapped rows — a dots-mode header legend is 1 row by law
|
|
71
|
-
// (`LEGEND_ROWS.header` in `chart-layout.ts`) anyway, so this only ever shows in the band.
|
|
72
|
-
rowGap: LEGEND_ROW_GAP,
|
|
73
|
-
// Caps each entry's `[data-basalt-hit]` overlay at the real inter-entry gap (styles.css).
|
|
74
|
-
...({ '--vx-hit-gap': `${gap}px` } as CSSProperties),
|
|
75
|
-
// A dots-mode row has no text baseline to breathe around — the header-fold law (wave 8) is
|
|
76
|
-
// the reason this row exists at all, so it gets the same tight treatment.
|
|
77
|
-
padding: dots ? '4px 0 2px' : '8px 0 2px',
|
|
78
|
-
fontSize,
|
|
79
|
-
color: VX.muted,
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/** `columnLayout` = the legend itself stacks entries in a column (left/right placement), so the
|
|
84
|
-
* divider between role groups must be a horizontal hairline rather than a vertical bar. */
|
|
85
|
-
function LegendDivider({ columnLayout }: { columnLayout: boolean }) {
|
|
86
|
-
return (
|
|
87
|
-
<span
|
|
88
|
-
aria-hidden
|
|
89
|
-
style={
|
|
90
|
-
columnLayout
|
|
91
|
-
? { width: '100%', height: 1, backgroundColor: alpha(VX.neutral, 0.25), margin: '2px 0' }
|
|
92
|
-
: { width: 1, alignSelf: 'stretch', backgroundColor: alpha(VX.neutral, 0.25) }
|
|
93
|
-
}
|
|
94
|
-
/>
|
|
95
|
-
)
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
function LegendSwatch({ item, idPrefix }: { item: LegendEntry; idPrefix: string }) {
|
|
99
|
-
if (item.shape === 'splitLine') {
|
|
100
|
-
return (
|
|
101
|
-
<svg width={20} height={14} style={{ flexShrink: 0 }}>
|
|
102
|
-
<line
|
|
103
|
-
x1={0}
|
|
104
|
-
y1={7}
|
|
105
|
-
x2={10}
|
|
106
|
-
y2={7}
|
|
107
|
-
stroke={item.color}
|
|
108
|
-
strokeWidth={item.strokeWidth ?? 2.5}
|
|
109
|
-
strokeOpacity={item.strokeOpacity ?? 1}
|
|
110
|
-
strokeDasharray={item.dashed ? VX.dashArray : undefined}
|
|
111
|
-
/>
|
|
112
|
-
<line
|
|
113
|
-
x1={10}
|
|
114
|
-
y1={7}
|
|
115
|
-
x2={20}
|
|
116
|
-
y2={7}
|
|
117
|
-
stroke={item.secondColor}
|
|
118
|
-
strokeWidth={item.strokeWidth ?? 2.5}
|
|
119
|
-
strokeOpacity={item.strokeOpacity ?? 1}
|
|
120
|
-
strokeDasharray={item.dashed ? VX.dashArray : undefined}
|
|
121
|
-
/>
|
|
122
|
-
</svg>
|
|
123
|
-
)
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
if (item.shape === 'split') {
|
|
127
|
-
const topId = `split-top-${idPrefix}${item.key}`
|
|
128
|
-
const botId = `split-bot-${idPrefix}${item.key}`
|
|
129
|
-
return (
|
|
130
|
-
<svg width={14} height={14} style={{ flexShrink: 0 }}>
|
|
131
|
-
<defs>
|
|
132
|
-
<clipPath id={topId}>
|
|
133
|
-
<polygon points="0,0 14,0 0,14" />
|
|
134
|
-
</clipPath>
|
|
135
|
-
<clipPath id={botId}>
|
|
136
|
-
<polygon points="14,0 14,14 0,14" />
|
|
137
|
-
</clipPath>
|
|
138
|
-
</defs>
|
|
139
|
-
<rect width={14} height={14} rx={2} fill={item.color} clipPath={`url(#${topId})`} />
|
|
140
|
-
<rect width={14} height={14} rx={2} fill={item.secondColor} clipPath={`url(#${botId})`} />
|
|
141
|
-
</svg>
|
|
142
|
-
)
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
if (item.shape === 'bar') {
|
|
146
|
-
return (
|
|
147
|
-
<span
|
|
148
|
-
style={{
|
|
149
|
-
width: 11,
|
|
150
|
-
height: 11,
|
|
151
|
-
borderRadius: 3, // theme-allow raw-surface — sub-scale legend-swatch corner, below the 4px radius floor
|
|
152
|
-
backgroundColor: item.color,
|
|
153
|
-
opacity: item.fillOpacity ?? 0.7,
|
|
154
|
-
flexShrink: 0,
|
|
155
|
-
}}
|
|
156
|
-
/>
|
|
157
|
-
)
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
// Line series — a 16×3px radius-2 pill (docs/DESIGN-SPEC.md §5). A thick, round-capped stroke
|
|
161
|
-
// reads as a filled pill when solid while still supporting the dashed variant.
|
|
162
|
-
return (
|
|
163
|
-
<svg width={16} height={6} style={{ flexShrink: 0 }}>
|
|
164
|
-
<line
|
|
165
|
-
x1={0}
|
|
166
|
-
y1={3}
|
|
167
|
-
x2={16}
|
|
168
|
-
y2={3}
|
|
169
|
-
stroke={item.color}
|
|
170
|
-
strokeWidth={item.strokeWidth ?? 3}
|
|
171
|
-
strokeOpacity={item.strokeOpacity ?? 1}
|
|
172
|
-
strokeLinecap="round"
|
|
173
|
-
strokeDasharray={item.dashed ? VX.dashArray : undefined}
|
|
174
|
-
/>
|
|
175
|
-
</svg>
|
|
176
|
-
)
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
// Same dimming as `LEGEND_CHILD_STYLE` below — the legend wrapper already sets the base text color
|
|
180
|
-
// to `VX.muted` (`wrapperStyle`), so subordinate text is just that color at reduced opacity, never
|
|
181
|
-
// a second color token.
|
|
182
|
-
const LEGEND_NOTE_STYLE: CSSProperties = {
|
|
183
|
-
opacity: 0.75,
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
const LEGEND_CHILD_STYLE: CSSProperties = {
|
|
187
|
-
display: 'flex',
|
|
188
|
-
alignItems: 'center',
|
|
189
|
-
gap: 4,
|
|
190
|
-
marginLeft: 4,
|
|
191
|
-
fontSize: '0.85em',
|
|
192
|
-
opacity: 0.75,
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
/**
|
|
196
|
-
* The whole entry collapses to its color, in 'dots' mode (`docs/CHARTS-SPEC.md` §5: a short or
|
|
197
|
-
* `compact`-container header has no room for a text label per entry) — a plain 8px circle
|
|
198
|
-
* regardless of the series' own shape, since a two-tone `split`/`splitLine` swatch cannot express
|
|
199
|
-
* two colors in one dot. The name survives via the button's own `aria-label`; sighted users get
|
|
200
|
-
* color-coded identity only, same trade the `compact` container class already made for the y axis.
|
|
201
|
-
*/
|
|
202
|
-
function LegendDot({ item }: { item: LegendEntry }) {
|
|
203
|
-
return (
|
|
204
|
-
<span
|
|
205
|
-
style={{
|
|
206
|
-
width: LEGEND_DOT_SIZE,
|
|
207
|
-
height: LEGEND_DOT_SIZE,
|
|
208
|
-
borderRadius: '50%', // theme-allow raw-surface — a circle shape, not a surface corner
|
|
209
|
-
backgroundColor: item.color,
|
|
210
|
-
flexShrink: 0,
|
|
211
|
-
}}
|
|
212
|
-
/>
|
|
213
|
-
)
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
/** Compact swatch for a folded child entry — smaller than {@link LegendSwatch}, line/bar only
|
|
217
|
-
* (folded companions are simple line or bar series; `split`/`splitLine` never fold). */
|
|
218
|
-
function LegendChildSwatch({ item }: { item: LegendEntry }) {
|
|
219
|
-
if (item.shape === 'bar') {
|
|
220
|
-
return (
|
|
221
|
-
<span
|
|
222
|
-
style={{
|
|
223
|
-
width: 10,
|
|
224
|
-
height: 10,
|
|
225
|
-
borderRadius: 2, // theme-allow raw-surface — sub-scale legend-swatch corner, below the 4px radius floor
|
|
226
|
-
backgroundColor: item.color,
|
|
227
|
-
opacity: item.fillOpacity ?? 0.7,
|
|
228
|
-
flexShrink: 0,
|
|
229
|
-
}}
|
|
230
|
-
/>
|
|
231
|
-
)
|
|
232
|
-
}
|
|
233
|
-
return (
|
|
234
|
-
<svg width={14} height={10} style={{ flexShrink: 0 }}>
|
|
235
|
-
<line
|
|
236
|
-
x1={0}
|
|
237
|
-
y1={5}
|
|
238
|
-
x2={14}
|
|
239
|
-
y2={5}
|
|
240
|
-
stroke={item.color}
|
|
241
|
-
strokeWidth={item.strokeWidth ?? 2}
|
|
242
|
-
strokeOpacity={item.strokeOpacity ?? 1}
|
|
243
|
-
strokeDasharray={item.dashed ? VX.dashArray : undefined}
|
|
244
|
-
/>
|
|
245
|
-
</svg>
|
|
246
|
-
)
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
/** A folded companion, rendered subordinate to (and inside) its parent's legend entry. */
|
|
250
|
-
function LegendChild({ item }: { item: LegendEntry }) {
|
|
251
|
-
return (
|
|
252
|
-
<span style={LEGEND_CHILD_STYLE}>
|
|
253
|
-
<LegendChildSwatch item={item} />
|
|
254
|
-
<span>{item.label}</span>
|
|
255
|
-
{/* No LEGEND_NOTE_STYLE here — LEGEND_CHILD_STYLE already dims the whole child block, and
|
|
256
|
-
compounding the two opacities would push a folded companion's note near-invisible. */}
|
|
257
|
-
{item.note ? <span>{item.note}</span> : null}
|
|
258
|
-
</span>
|
|
259
|
-
)
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
/**
|
|
263
|
-
* Shared legend for all non-sparkline charts. `highlighted`/`onHighlight` are optional — omit for
|
|
264
|
-
* static legends without hover interactivity. `chartId` namespaces `split` clipPath ids so two
|
|
265
|
-
* legends on the same page never collide. `groups` renders series → hairline divider → overlay →
|
|
266
|
-
* reference bands instead of one flat smear. `maxRows` caps the number of rendered ENTRIES and
|
|
267
|
-
* rolls the remainder into an `All N` disclosure chip — it is an entry count, not a row count, in
|
|
268
|
-
* spite of the name (`entries.slice(0, cap)` below is the whole of it). `ChartFrame` derives the
|
|
269
|
-
* cap from the measured fit (`resolveChartLayout().legend`); a caller-stated value wins.
|
|
270
|
-
*
|
|
271
|
-
* `onToggle` makes an entry a real toggle: clicking it hides the series in the plot, the tooltip,
|
|
272
|
-
* and the auto y-domain together (`ChartFrame` owns the `hidden` set — see `docs/CHARTS-SPEC.md`
|
|
273
|
-
* §5). A hidden entry is announced via `aria-pressed`.
|
|
274
|
-
*
|
|
275
|
-
* **The rollup is a disclosure, not a label.** `All N` is a `<button>` carrying `aria-expanded`
|
|
276
|
-
* that opens EVERY entry, toggles included, in a popover under the chip on a fine pointer and a
|
|
277
|
-
* bottom sheet on a coarse one. Both are fixed-position and portalled, so opening one never grows
|
|
278
|
-
* the legend band or moves the plot. Escape, an outside press, a scroll or a resize closes it, and
|
|
279
|
-
* focus returns to the chip on every close.
|
|
280
|
-
*/
|
|
281
|
-
export function ChartLegend({
|
|
282
|
-
items,
|
|
283
|
-
highlighted = null,
|
|
284
|
-
onHighlight,
|
|
285
|
-
hidden = NO_HIDDEN,
|
|
286
|
-
onToggle,
|
|
287
|
-
chartId = '',
|
|
288
|
-
placement = 'bottom',
|
|
289
|
-
groups = false,
|
|
290
|
-
maxRows,
|
|
291
|
-
mode = 'chips',
|
|
292
|
-
className,
|
|
293
|
-
style,
|
|
294
|
-
}: BasaltProps & {
|
|
295
|
-
items: LegendEntry[]
|
|
296
|
-
highlighted?: string | null
|
|
297
|
-
onHighlight?: (key: string | null) => void
|
|
298
|
-
/** Keys currently toggled off. */
|
|
299
|
-
hidden?: ReadonlySet<string>
|
|
300
|
-
/** Present = entries are clickable toggles. */
|
|
301
|
-
onToggle?: (key: string) => void
|
|
302
|
-
chartId?: string
|
|
303
|
-
placement?: LegendPlacement
|
|
304
|
-
groups?: boolean
|
|
305
|
-
maxRows?: number
|
|
306
|
-
/**
|
|
307
|
-
* `'dots'` collapses every VISIBLE entry to a plain color dot with no label (the name still
|
|
308
|
-
* reaches assistive tech via `aria-label`) — `resolveChartLayout`'s header-slot legend forces
|
|
309
|
-
* this for a short `ChartCard` (wave 11, `docs/CHARTS-SPEC.md` §5) so the legend band's height and
|
|
310
|
-
* width both shrink before it eats plot space. The `All N` disclosure panel is unaffected: it
|
|
311
|
-
* always shows the full swatch + label, `mode` only governs the inline row. Default `'chips'`
|
|
312
|
-
* (today's swatch + label rendering) for every other caller.
|
|
313
|
-
*/
|
|
314
|
-
mode?: 'dots' | 'chips'
|
|
315
|
-
}) {
|
|
316
|
-
const tier = useChartMetrics()
|
|
317
|
-
const coarse = useCoarsePointer()
|
|
318
|
-
const { open, panelId, openFrom, close, panel } = useLegendDisclosure(coarse)
|
|
319
|
-
|
|
320
|
-
const handleEnter = (key: string) => onHighlight?.(key)
|
|
321
|
-
const handleLeave = () => onHighlight?.(null)
|
|
322
|
-
|
|
323
|
-
const idPrefix = chartId ? `${chartId}-` : ''
|
|
324
|
-
const vertical = placement === 'left' || placement === 'right'
|
|
325
|
-
const { entries, dividerAfter } = orderEntries(items, groups)
|
|
326
|
-
const rolledUp = maxRows === undefined ? 0 : Math.max(entries.length - maxRows, 0)
|
|
327
|
-
const visible = rolledUp > 0 ? entries.slice(0, maxRows) : entries
|
|
328
|
-
|
|
329
|
-
// The disclosure panel is a second copy of the same entries: it gets its own id namespace and
|
|
330
|
-
// no `data-legend-key`, so a page query for the band's entries never finds the panel's twins.
|
|
331
|
-
const entryButton = (item: LegendEntry, inPanel = false): ReactNode => {
|
|
332
|
-
// A dots-mode entry names nothing on its own face — its whole point is the color — so a tap
|
|
333
|
-
// opens the same All-N sheet the overflow chip does, rather than silently hiding a series the
|
|
334
|
-
// reader was trying to identify (R2C-8: "what is this?" used to toggle it off instead). Gated
|
|
335
|
-
// on `mode` alone: with `legend.toggle: false` (no `onToggle`) a dots entry still has no OTHER
|
|
336
|
-
// way to name itself, so it still needs the title + disclosure — `onToggle !== undefined` used
|
|
337
|
-
// to suppress both just because toggling happened to be off.
|
|
338
|
-
const isDotTrigger = !inPanel && mode === 'dots'
|
|
339
|
-
return (
|
|
340
|
-
<button
|
|
341
|
-
key={item.key}
|
|
342
|
-
type="button"
|
|
343
|
-
data-basalt-hit
|
|
344
|
-
{...(!inPanel && { 'data-legend-key': item.key })}
|
|
345
|
-
// The note is the whole point for a series that is invisible in the plot, so it has to
|
|
346
|
-
// reach a screen reader too — an explicit aria-label would otherwise replace it.
|
|
347
|
-
aria-label={item.note ? `${item.label} — ${item.note}` : item.label}
|
|
348
|
-
{...(isDotTrigger && { title: item.label, 'aria-haspopup': 'dialog' as const })}
|
|
349
|
-
{...(isDotTrigger
|
|
350
|
-
? { 'aria-expanded': open, 'aria-controls': panelId }
|
|
351
|
-
: onToggle !== undefined && { 'aria-pressed': !hidden.has(item.key) })}
|
|
352
|
-
style={{
|
|
353
|
-
...LEGEND_ITEM_BUTTON,
|
|
354
|
-
cursor: onToggle === undefined && !isDotTrigger ? 'default' : 'pointer',
|
|
355
|
-
// Toggled-off wins over hover-dimming: a hidden series must read as hidden even while
|
|
356
|
-
// it is the one being hovered.
|
|
357
|
-
opacity: hidden.has(item.key)
|
|
358
|
-
? 0.35
|
|
359
|
-
: highlighted === null || highlighted === item.key
|
|
360
|
-
? 1
|
|
361
|
-
: 0.3,
|
|
362
|
-
textDecoration: hidden.has(item.key) ? 'line-through' : 'none',
|
|
363
|
-
}}
|
|
364
|
-
{...(isDotTrigger
|
|
365
|
-
? { onClick: (e: MouseEvent<HTMLButtonElement>) => openFrom(e.currentTarget) }
|
|
366
|
-
: onToggle !== undefined && { onClick: () => onToggle(item.key) })}
|
|
367
|
-
onMouseEnter={() => handleEnter(item.key)}
|
|
368
|
-
onMouseLeave={handleLeave}
|
|
369
|
-
onFocus={() => handleEnter(item.key)}
|
|
370
|
-
onBlur={handleLeave}
|
|
371
|
-
>
|
|
372
|
-
{!inPanel && mode === 'dots' ? (
|
|
373
|
-
<LegendDot item={item} />
|
|
374
|
-
) : (
|
|
375
|
-
<>
|
|
376
|
-
<LegendSwatch item={item} idPrefix={inPanel ? `${idPrefix}disclosure-` : idPrefix} />
|
|
377
|
-
<span>{item.label}</span>
|
|
378
|
-
{item.note ? <span style={LEGEND_NOTE_STYLE}>{item.note}</span> : null}
|
|
379
|
-
{item.children?.map((child) => (
|
|
380
|
-
<LegendChild key={child.key} item={child} />
|
|
381
|
-
))}
|
|
382
|
-
</>
|
|
383
|
-
)}
|
|
384
|
-
</button>
|
|
385
|
-
)
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
const nodes: ReactNode[] = []
|
|
389
|
-
visible.forEach((item, i) => {
|
|
390
|
-
nodes.push(entryButton(item))
|
|
391
|
-
if (dividerAfter.has(i))
|
|
392
|
-
nodes.push(<LegendDivider key={`divider-${item.key}`} columnLayout={vertical} />)
|
|
393
|
-
})
|
|
394
|
-
if (rolledUp > 0) {
|
|
395
|
-
nodes.push(
|
|
396
|
-
<button
|
|
397
|
-
key="legend-more"
|
|
398
|
-
type="button"
|
|
399
|
-
data-basalt-hit
|
|
400
|
-
aria-expanded={open}
|
|
401
|
-
aria-haspopup="dialog"
|
|
402
|
-
aria-controls={panelId}
|
|
403
|
-
onClick={(e) => (open ? close() : openFrom(e.currentTarget))}
|
|
404
|
-
style={{ ...LEGEND_ITEM_BUTTON, cursor: 'pointer', textDecoration: 'underline' }}
|
|
405
|
-
>
|
|
406
|
-
{`All ${entries.length}`}
|
|
407
|
-
</button>,
|
|
408
|
-
)
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
return (
|
|
412
|
-
<div
|
|
413
|
-
{...(className !== undefined && { className })}
|
|
414
|
-
style={{ ...wrapperStyle(placement, tier.legendFontSize, mode === 'dots'), ...style }}
|
|
415
|
-
>
|
|
416
|
-
{nodes}
|
|
417
|
-
<LegendDisclosure {...panel} fontSize={tier.legendFontSize}>
|
|
418
|
-
{entries.map((item) => entryButton(item, true))}
|
|
419
|
-
</LegendDisclosure>
|
|
420
|
-
</div>
|
|
421
|
-
)
|
|
422
|
-
}
|
|
@@ -1,243 +0,0 @@
|
|
|
1
|
-
import type { CSSProperties, ReactNode } from 'react'
|
|
2
|
-
import type { BasaltProps } from '../../common/props'
|
|
3
|
-
import { VX } from '../../tokens'
|
|
4
|
-
|
|
5
|
-
export type ChartCenterProps = BasaltProps & {
|
|
6
|
-
/** A block body (a title-less pending `ChartCard`, a non-`ChartFrame` body) has no measured
|
|
7
|
-
* plot width to reserve — `'100%'` fills its container instead of a pixel figure. */
|
|
8
|
-
width: number | string
|
|
9
|
-
height: number
|
|
10
|
-
children: ReactNode
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
const centerStyle = (width: number | string, height: number): CSSProperties => ({
|
|
14
|
-
width,
|
|
15
|
-
height,
|
|
16
|
-
display: 'flex',
|
|
17
|
-
alignItems: 'center',
|
|
18
|
-
justifyContent: 'center',
|
|
19
|
-
})
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Minimal layout primitive: centers `children` inside a `width` × `height` box. Exists because
|
|
23
|
-
* `src/charts/**` cannot import Mantine's `Flex`/`Group`/`Center` (the Mantine-free boundary), so
|
|
24
|
-
* there was previously nothing to reach for when a chart file needed to center something. Not a
|
|
25
|
-
* general layout system — width, height, children, nothing else.
|
|
26
|
-
*/
|
|
27
|
-
export function ChartCenter({
|
|
28
|
-
width,
|
|
29
|
-
height,
|
|
30
|
-
className,
|
|
31
|
-
style,
|
|
32
|
-
children,
|
|
33
|
-
}: ChartCenterProps): ReactNode {
|
|
34
|
-
return (
|
|
35
|
-
<div
|
|
36
|
-
{...(className !== undefined && { className })}
|
|
37
|
-
style={{ ...centerStyle(width, height), ...style }}
|
|
38
|
-
>
|
|
39
|
-
{children}
|
|
40
|
-
</div>
|
|
41
|
-
)
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export type ChartPendingProps = BasaltProps & {
|
|
45
|
-
width: number | string
|
|
46
|
-
height: number
|
|
47
|
-
/** Default `'Loading…'`. */
|
|
48
|
-
label?: string
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const labelStyle: CSSProperties = {
|
|
52
|
-
color: VX.faint,
|
|
53
|
-
fontSize: VX.text.sm,
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* The placeholder for a chart whose data hasn't arrived yet — the third "nothing to draw" state
|
|
58
|
-
* alongside measured-and-empty and measured-and-absent (a real gap in coverage). Collapsing an
|
|
59
|
-
* in-flight query into either of those (the `data ?? []` idiom) densifies it into a fully-hatched
|
|
60
|
-
* "not measured" window: a positive claim that the series WAS watched and carried nothing, when in
|
|
61
|
-
* fact it was never asked. `ChartPending` makes "not asked yet" its own rendered state instead of
|
|
62
|
-
* borrowing one of the other two.
|
|
63
|
-
*
|
|
64
|
-
* Reserves exactly the plot's footprint and draws NOTHING that could be mistaken for a
|
|
65
|
-
* measurement — no axes, no gridlines, no hatching, no data marks — just a faint, static, centered
|
|
66
|
-
* label. No animation: the package's motion doctrine bans looping/pulsing idle motion, so a static
|
|
67
|
-
* reserved box is the correct answer here, not a compromise.
|
|
68
|
-
*
|
|
69
|
-
* The label is `role="status"` (polite), so a screen reader hears the chart resolve through all
|
|
70
|
-
* three states rather than only its failure: `ChartError` was `role="alert"` and its two siblings
|
|
71
|
-
* were silent, which announced the one outcome and swallowed the other two. Polite, not assertive —
|
|
72
|
-
* a loading placeholder must not interrupt what the reader is already being told.
|
|
73
|
-
*/
|
|
74
|
-
export function ChartPending({
|
|
75
|
-
width,
|
|
76
|
-
height,
|
|
77
|
-
label = 'Loading…',
|
|
78
|
-
className,
|
|
79
|
-
style,
|
|
80
|
-
}: ChartPendingProps): ReactNode {
|
|
81
|
-
return (
|
|
82
|
-
<ChartCenter
|
|
83
|
-
width={width}
|
|
84
|
-
height={height}
|
|
85
|
-
{...(className !== undefined && { className })}
|
|
86
|
-
{...(style !== undefined && { style })}
|
|
87
|
-
>
|
|
88
|
-
{/* `<output>` is the tag oxlint suggests, and it is the wrong one: it means "the result of
|
|
89
|
-
a calculation", owns form semantics (`form`/`name`/`for`), and this box is precisely the
|
|
90
|
-
state in which there IS no result yet. A polite live region on a plain span is the
|
|
91
|
-
standard pattern. */}
|
|
92
|
-
{/* oxlint-disable-next-line jsx-a11y/prefer-tag-over-role */}
|
|
93
|
-
<span style={labelStyle} role="status">
|
|
94
|
-
{label}
|
|
95
|
-
</span>
|
|
96
|
-
</ChartCenter>
|
|
97
|
-
)
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* The three "nothing to draw" states a chart can be in, in ONE prop — the shape a
|
|
102
|
-
* `@tanstack/react-query` result (or anything derived from one) already has.
|
|
103
|
-
*
|
|
104
|
-
* It exists because the answer that already existed, `dashboard/QueryState`, renders Mantine and
|
|
105
|
-
* therefore cannot be reached from `./charts` at all (the Mantine-free boundary). A chart consumer
|
|
106
|
-
* without that import was left writing the four-way branch by hand, which is the exact bug
|
|
107
|
-
* `QueryState` was built for: the shape suggests `empty` and a 500 renders "No data".
|
|
108
|
-
*
|
|
109
|
-
* Precedence is fixed and is the whole product: **pending → error → empty**. A refetch that is
|
|
110
|
-
* both in flight and carrying a stale error is pending, not failed; a query that errored has no
|
|
111
|
-
* standing to claim its result was empty.
|
|
112
|
-
*/
|
|
113
|
-
export type ChartState = {
|
|
114
|
-
/** The query has not resolved yet. Wins over every other flag. */
|
|
115
|
-
pending?: boolean
|
|
116
|
-
/** Truthy = the query failed. Any thrown value; an `Error`'s `message` is used as the label. */
|
|
117
|
-
error?: unknown
|
|
118
|
-
/**
|
|
119
|
-
* The query resolved and there is genuinely nothing to plot. `true`, or the empty label
|
|
120
|
-
* itself — a string is truthy AND the copy `ChartEmpty` paints, so a consumer with its own
|
|
121
|
-
* "No data" wording never needs a ternary around the placeholder.
|
|
122
|
-
*/
|
|
123
|
-
empty?: boolean | string
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
/** Which placeholder {@link ChartState} resolves to, or `null` to draw the chart. */
|
|
127
|
-
export type ResolvedChartState = 'pending' | 'error' | 'empty' | null
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
* Resolve {@link ChartState} (plus the older standalone `isPending` flag, which stays a supported
|
|
131
|
-
* alias) into the ONE placeholder to render. Pure and exported so a hand-composed plot applies the
|
|
132
|
-
* same precedence rather than re-deriving it.
|
|
133
|
-
*/
|
|
134
|
-
export function resolveChartState(input: {
|
|
135
|
-
state?: ChartState
|
|
136
|
-
isPending?: boolean
|
|
137
|
-
}): ResolvedChartState {
|
|
138
|
-
const { state, isPending } = input
|
|
139
|
-
if (isPending === true || state?.pending === true) return 'pending'
|
|
140
|
-
if (state?.error !== undefined && state.error !== null && state.error !== false) return 'error'
|
|
141
|
-
if (state?.empty) return 'empty'
|
|
142
|
-
return null
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
export type ChartEmptyProps = BasaltProps & {
|
|
146
|
-
width: number | string
|
|
147
|
-
height: number
|
|
148
|
-
/** Default `'No data'`. */
|
|
149
|
-
label?: string
|
|
150
|
-
/** Optional affordance under the label — a "clear filters" button, a range reset. Rendered as
|
|
151
|
-
* given: this layer is Mantine-free, so the caller owns whatever it puts here. */
|
|
152
|
-
action?: ReactNode
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
const stackStyle: CSSProperties = {
|
|
156
|
-
display: 'flex',
|
|
157
|
-
flexDirection: 'column',
|
|
158
|
-
alignItems: 'center',
|
|
159
|
-
gap: 8,
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
/**
|
|
163
|
-
* Measured and EMPTY — the query resolved and there is nothing to plot. Distinct from
|
|
164
|
-
* {@link ChartPending} ("not asked yet") and from a hatched absence ("watched, measured nothing"):
|
|
165
|
-
* collapsing any of the three into another is the honesty bug this trio exists to prevent.
|
|
166
|
-
*
|
|
167
|
-
* Same footprint discipline as `ChartPending`: it reserves the plot rect and draws nothing that
|
|
168
|
-
* could be read as a measurement — no axes, no gridlines, no marks. Announced `role="status"`
|
|
169
|
-
* (polite) like `ChartPending`, so the resolution is heard; only `ChartError` is an `alert`.
|
|
170
|
-
*/
|
|
171
|
-
export function ChartEmpty({
|
|
172
|
-
width,
|
|
173
|
-
height,
|
|
174
|
-
label = 'No data',
|
|
175
|
-
action,
|
|
176
|
-
className,
|
|
177
|
-
style,
|
|
178
|
-
}: ChartEmptyProps): ReactNode {
|
|
179
|
-
return (
|
|
180
|
-
<ChartCenter
|
|
181
|
-
width={width}
|
|
182
|
-
height={height}
|
|
183
|
-
{...(className !== undefined && { className })}
|
|
184
|
-
{...(style !== undefined && { style })}
|
|
185
|
-
>
|
|
186
|
-
{/* Same waiver, same reason, as `ChartPending` — see the comment there. */}
|
|
187
|
-
{/* oxlint-disable-next-line jsx-a11y/prefer-tag-over-role */}
|
|
188
|
-
<span style={stackStyle} role="status">
|
|
189
|
-
<span style={labelStyle}>{label}</span>
|
|
190
|
-
{action}
|
|
191
|
-
</span>
|
|
192
|
-
</ChartCenter>
|
|
193
|
-
)
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
export type ChartErrorProps = BasaltProps & {
|
|
197
|
-
width: number | string
|
|
198
|
-
height: number
|
|
199
|
-
/** Overrides the text outright. Omitted, an `Error`'s own `message` is used, else
|
|
200
|
-
* `'Could not load chart'` — a failure never borrows the empty state's copy. */
|
|
201
|
-
label?: string
|
|
202
|
-
/** The thrown value, used for the default label. */
|
|
203
|
-
error?: unknown
|
|
204
|
-
/** Optional affordance under the label — typically a retry. */
|
|
205
|
-
action?: ReactNode
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
/** The message an unknown thrown value gets to state for itself. Kept local rather than importing
|
|
209
|
-
* `./query`'s `toErrorMessage`: `./charts` resolves with no other basalt subpath installed, and a
|
|
210
|
-
* chart placeholder needs one line, not the HTTP-status vocabulary that helper carries. */
|
|
211
|
-
function errorLabel(error: unknown): string {
|
|
212
|
-
if (error instanceof Error && error.message !== '') return error.message
|
|
213
|
-
if (typeof error === 'string' && error !== '') return error
|
|
214
|
-
return 'Could not load chart'
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
/**
|
|
218
|
-
* Measured and FAILED. The branch a hand-written chart switch reliably gets wrong — a 500 rendered
|
|
219
|
-
* as "No data" is a positive claim that the server answered and had nothing, which it did not.
|
|
220
|
-
*/
|
|
221
|
-
export function ChartError({
|
|
222
|
-
width,
|
|
223
|
-
height,
|
|
224
|
-
label,
|
|
225
|
-
error,
|
|
226
|
-
action,
|
|
227
|
-
className,
|
|
228
|
-
style,
|
|
229
|
-
}: ChartErrorProps): ReactNode {
|
|
230
|
-
return (
|
|
231
|
-
<ChartCenter
|
|
232
|
-
width={width}
|
|
233
|
-
height={height}
|
|
234
|
-
{...(className !== undefined && { className })}
|
|
235
|
-
{...(style !== undefined && { style })}
|
|
236
|
-
>
|
|
237
|
-
<span style={stackStyle} role="alert">
|
|
238
|
-
<span style={labelStyle}>{label ?? errorLabel(error)}</span>
|
|
239
|
-
{action}
|
|
240
|
-
</span>
|
|
241
|
-
</ChartCenter>
|
|
242
|
-
)
|
|
243
|
-
}
|