basalt-ui 1.40.3 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +50 -45
- package/CHANGELOG.md +543 -513
- package/MIGRATING.md +969 -37
- package/README.md +172 -367
- package/agent/rules/basalt-batteries.md +19 -74
- package/agent/rules/basalt-charts.md +21 -95
- package/agent/rules/basalt-controls.md +23 -131
- package/agent/rules/basalt-mantine.md +26 -99
- package/agent/rules/basalt-state.md +21 -103
- package/agent/rules/basalt-tokens.md +33 -114
- package/agent/skills/basalt-app/SKILL.md +229 -72
- package/agent/skills/basalt-charts/SKILL.md +23 -57
- package/agent/skills/basalt-design/SKILL.md +12 -70
- package/agent/templates/AGENTS-block.md.tpl +30 -0
- package/agent/templates/DESIGN.md.tpl +2 -2
- package/agent/templates/__root.tpl +9 -16
- package/agent/templates/main.tpl +21 -0
- package/agent/templates/nav.tpl +18 -0
- package/configs/check.yml +1 -1
- package/configs/oxlint-basalt.json +4 -10
- package/configs/oxlint-plugin.js +468 -847
- package/configs/oxlint-plugin.test.ts +662 -710
- package/configs/oxlint.json +10 -2
- package/dist/agent/ai-sdk-transport.d.ts +19 -7
- package/dist/agent/ai-sdk-transport.d.ts.map +1 -1
- package/dist/agent/ai-sdk-transport.js +10 -7
- package/dist/{agent-chat → agent/chat}/composer.d.ts +16 -16
- package/dist/agent/chat/composer.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/composer.js +10 -9
- package/dist/{agent-chat → agent/chat}/message-affordances.d.ts +7 -6
- package/dist/agent/chat/message-affordances.d.ts.map +1 -0
- package/dist/agent/chat/relative-time.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-feed-row.d.ts +18 -16
- package/dist/agent/chat/thread-feed-row.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-feed-row.js +12 -11
- package/dist/{agent-chat → agent/chat}/thread-feed.d.ts +8 -8
- package/dist/agent/chat/thread-feed.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-feed.js +12 -10
- package/dist/{agent-chat → agent/chat}/thread-message.d.ts +12 -9
- package/dist/agent/chat/thread-message.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-message.js +15 -13
- package/dist/{agent-chat → agent/chat}/thread-outcome-card.d.ts +2 -2
- package/dist/agent/chat/thread-outcome-card.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-outcome-card.js +3 -3
- package/dist/{agent-chat → agent/chat}/tool-chip.d.ts +5 -5
- package/dist/agent/chat/tool-chip.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/tool-chip.js +4 -4
- package/dist/agent/chat/use-keyboard-inset.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/use-keyboard-inset.js +1 -1
- package/dist/{agent-chat → agent/chat}/virtualize.d.ts +7 -7
- package/dist/agent/chat/virtualize.d.ts.map +1 -0
- package/dist/agent/error.d.ts +31 -0
- package/dist/agent/error.d.ts.map +1 -0
- package/dist/agent/error.js +18 -0
- package/dist/agent/foreign.d.ts +3 -2
- package/dist/agent/foreign.d.ts.map +1 -1
- package/dist/agent/history.d.ts +2 -36
- package/dist/agent/history.d.ts.map +1 -1
- package/dist/agent/history.js +0 -32
- package/dist/agent/id.d.ts +4 -5
- package/dist/agent/id.d.ts.map +1 -1
- package/dist/agent/index.d.ts +19 -52
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +10 -32
- package/dist/agent/outcome.d.ts +3 -14
- package/dist/agent/outcome.d.ts.map +1 -1
- package/dist/agent/outcome.js +0 -30
- package/dist/agent/part-list.d.ts +3 -3
- package/dist/agent/part-list.d.ts.map +1 -1
- package/dist/agent/parts.d.ts +23 -24
- package/dist/agent/parts.d.ts.map +1 -1
- package/dist/agent/run-committer.d.ts +23 -0
- package/dist/agent/run-committer.d.ts.map +1 -0
- package/dist/agent/run-committer.js +41 -0
- package/dist/agent/run-records.d.ts +77 -0
- package/dist/agent/run-records.d.ts.map +1 -0
- package/dist/agent/run-records.js +69 -0
- package/dist/agent/thread.d.ts +23 -47
- package/dist/agent/thread.d.ts.map +1 -1
- package/dist/agent/thread.js +3 -134
- package/dist/agent/transport.d.ts +6 -69
- package/dist/agent/transport.d.ts.map +1 -1
- package/dist/agent/transport.js +0 -18
- package/dist/agent/use-agent-thread-runs.d.ts +63 -26
- package/dist/agent/use-agent-thread-runs.d.ts.map +1 -1
- package/dist/agent/use-agent-thread-runs.js +202 -66
- package/dist/charts/BandStrip.d.ts +46 -0
- package/dist/charts/BandStrip.d.ts.map +1 -0
- package/dist/charts/BandStrip.js +151 -0
- package/dist/charts/Bars.d.ts +19 -0
- package/dist/charts/Bars.d.ts.map +1 -0
- package/dist/charts/Bars.js +77 -0
- package/dist/charts/CartesianChart.d.ts +57 -0
- package/dist/charts/CartesianChart.d.ts.map +1 -0
- package/dist/charts/CartesianChart.js +121 -0
- package/dist/charts/ChartCard.d.ts +34 -0
- package/dist/charts/ChartCard.d.ts.map +1 -0
- package/dist/charts/ChartCard.js +115 -0
- package/dist/charts/Donut.d.ts +25 -0
- package/dist/charts/Donut.d.ts.map +1 -0
- package/dist/charts/Donut.js +191 -0
- package/dist/charts/DualPanel.d.ts +47 -0
- package/dist/charts/DualPanel.d.ts.map +1 -0
- package/dist/charts/DualPanel.js +214 -0
- package/dist/charts/Heatmap.d.ts +41 -0
- package/dist/charts/Heatmap.d.ts.map +1 -0
- package/dist/charts/Heatmap.js +216 -0
- package/dist/charts/Lines.d.ts +11 -0
- package/dist/charts/Lines.d.ts.map +1 -0
- package/dist/charts/Lines.js +114 -0
- package/dist/charts/MirroredBars.d.ts +44 -0
- package/dist/charts/MirroredBars.d.ts.map +1 -0
- package/dist/charts/MirroredBars.js +190 -0
- package/dist/charts/Sparkline.d.ts +22 -0
- package/dist/charts/Sparkline.d.ts.map +1 -0
- package/dist/charts/Sparkline.js +129 -0
- package/dist/charts/StackedArea.d.ts +15 -0
- package/dist/charts/StackedArea.d.ts.map +1 -0
- package/dist/charts/StackedArea.js +46 -0
- package/dist/charts/box.d.ts +38 -0
- package/dist/charts/box.d.ts.map +1 -0
- package/dist/charts/box.js +72 -0
- package/dist/charts/card-context.d.ts +3 -0
- package/dist/charts/card-context.d.ts.map +1 -0
- package/dist/charts/card-context.js +7 -0
- package/dist/charts/chart-box.module.css +64 -0
- package/{src/content/article-card.module.css.d.ts → dist/charts/chart-box.module.css.d.ts} +5 -9
- package/dist/charts/chart-card.module.css +25 -0
- package/dist/{dashboard/widget-grid.module.css.d.ts → charts/chart-card.module.css.d.ts} +1 -3
- package/dist/charts/chart-legend.module.css +38 -0
- package/{src/dashboard/widget-grid.module.css.d.ts → dist/charts/chart-legend.module.css.d.ts} +3 -3
- package/dist/charts/compile.d.ts +62 -0
- package/dist/charts/compile.d.ts.map +1 -0
- package/dist/charts/compile.js +386 -0
- package/dist/charts/cursor.d.ts +50 -0
- package/dist/charts/cursor.d.ts.map +1 -0
- package/dist/charts/cursor.js +157 -0
- package/dist/charts/curves.d.ts +12 -0
- package/dist/charts/curves.d.ts.map +1 -0
- package/dist/charts/curves.js +86 -0
- package/dist/charts/donut.module.css +54 -0
- package/dist/{content/article-card.module.css.d.ts → charts/donut.module.css.d.ts} +2 -9
- package/dist/charts/host.d.ts +17 -0
- package/dist/charts/host.d.ts.map +1 -0
- package/dist/charts/host.js +35 -0
- package/dist/charts/index.d.ts +18 -53
- package/dist/charts/index.d.ts.map +1 -1
- package/dist/charts/index.js +17 -189
- package/dist/charts/legend.d.ts +23 -0
- package/dist/charts/legend.d.ts.map +1 -0
- package/dist/charts/legend.js +160 -0
- package/dist/charts/marks.d.ts +25 -0
- package/dist/charts/marks.d.ts.map +1 -0
- package/dist/charts/marks.js +128 -0
- package/dist/charts/panel.d.ts +56 -0
- package/dist/charts/panel.d.ts.map +1 -0
- package/dist/charts/panel.js +123 -0
- package/dist/charts/scales.d.ts +44 -0
- package/dist/charts/scales.d.ts.map +1 -0
- package/dist/charts/scales.js +163 -0
- package/dist/charts/sizing.d.ts +12 -0
- package/dist/charts/sizing.d.ts.map +1 -0
- package/dist/charts/sizing.js +33 -0
- package/dist/charts/state.d.ts +17 -0
- package/dist/charts/state.d.ts.map +1 -0
- package/dist/charts/state.js +53 -0
- package/dist/charts/theme.d.ts +38 -19
- package/dist/charts/theme.d.ts.map +1 -1
- package/dist/charts/theme.js +48 -26
- package/dist/charts/types.d.ts +227 -0
- package/dist/charts/types.d.ts.map +1 -0
- package/dist/charts/types.js +4 -0
- package/dist/cli/audit-allows.d.ts +4 -17
- package/dist/cli/audit-allows.d.ts.map +1 -1
- package/dist/cli/config.d.ts +14 -43
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/doctor-upgrade.d.ts +31 -0
- package/dist/cli/doctor-upgrade.d.ts.map +1 -0
- package/dist/cli/doctor-upgrade.js +269 -0
- package/dist/cli/doctor.d.ts +13 -26
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +79 -8
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +2 -4
- package/dist/cli/index.d.ts +68 -135
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +89 -76
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +43 -27
- package/dist/cli/sync.d.ts +5 -21
- package/dist/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js +4 -6
- package/dist/cli/tokens-css.d.ts +7 -28
- package/dist/cli/tokens-css.d.ts.map +1 -1
- package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
- package/dist/commands/ShortcutsHelp.js +4 -5
- package/dist/commands/define-commands.d.ts +15 -31
- package/dist/commands/define-commands.d.ts.map +1 -1
- package/dist/commands/define-commands.js +1 -11
- package/dist/commands/define-overlays.d.ts +5 -19
- package/dist/commands/define-overlays.d.ts.map +1 -1
- package/dist/commands/define-overlays.js +3 -11
- package/dist/commands/index.d.ts +10 -40
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +9 -46
- package/dist/{notifications → commands/notifications}/bell.d.ts +1 -1
- package/dist/commands/notifications/bell.d.ts.map +1 -0
- package/dist/{notifications → commands/notifications}/center.d.ts +2 -2
- package/dist/commands/notifications/center.d.ts.map +1 -0
- package/dist/{notifications → commands/notifications}/center.js +2 -2
- package/dist/{notifications → commands/notifications}/define-notifications.d.ts +3 -3
- package/dist/commands/notifications/define-notifications.d.ts.map +1 -0
- package/dist/commands/notifications/notify.d.ts +44 -0
- package/dist/commands/notifications/notify.d.ts.map +1 -0
- package/dist/commands/notifications/notify.js +79 -0
- package/dist/{notifications → commands/notifications}/store.d.ts +2 -0
- package/dist/commands/notifications/store.d.ts.map +1 -0
- package/dist/{notifications → commands/notifications}/store.js +4 -0
- package/dist/commands/projectors.d.ts +1 -131
- package/dist/commands/projectors.d.ts.map +1 -1
- package/dist/commands/projectors.js +2 -73
- package/dist/commands/shell-bridge.d.ts +3 -3
- package/dist/commands/shortcut-format.d.ts +5 -4
- package/dist/commands/shortcut-format.d.ts.map +1 -1
- package/dist/common/errors.d.ts +3 -3
- package/dist/common/use-measured-widths.d.ts.map +1 -1
- package/dist/common/use-measured-widths.js +5 -3
- package/dist/common/validate.d.ts +2 -2
- package/dist/content/article-layout.d.ts.map +1 -1
- package/dist/content/article-layout.js +3 -3
- package/dist/content/article-model.d.ts +1 -46
- package/dist/content/article-model.d.ts.map +1 -1
- package/dist/content/article-model.js +1 -29
- package/dist/content/copy-action.d.ts +1 -1
- package/dist/content/glyphs.d.ts +1 -1
- package/dist/content/index.d.ts +11 -41
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +3 -35
- package/dist/content/markdown.d.ts +1 -1
- package/dist/content/markdown.d.ts.map +1 -1
- package/dist/content/markdown.js +1 -1
- package/dist/content/mermaid.d.ts.map +1 -1
- package/dist/content/mermaid.js +7 -7
- package/dist/content/slug.d.ts +1 -8
- package/dist/content/slug.d.ts.map +1 -1
- package/dist/content/slug.js +1 -8
- package/dist/content/url-hardening.d.ts +2 -2
- package/dist/content/url-hardening.d.ts.map +1 -1
- package/dist/content/url-hardening.js +2 -0
- package/dist/controls/actions.d.ts +16 -1
- package/dist/controls/actions.d.ts.map +1 -1
- package/dist/controls/enum-filter.d.ts +1 -1
- package/dist/controls/enum-filter.d.ts.map +1 -1
- package/dist/controls/filter-context.d.ts.map +1 -1
- package/dist/controls/filter-context.js +3 -1
- package/dist/controls/filter-set.js +4 -6
- package/dist/controls/form-layout.d.ts +1 -1
- package/dist/controls/form-layout.d.ts.map +1 -1
- package/dist/controls/form-layout.js +1 -1
- package/dist/controls/glyphs.d.ts +0 -2
- package/dist/controls/glyphs.d.ts.map +1 -1
- package/dist/controls/glyphs.js +0 -7
- package/dist/controls/index.d.ts +12 -17
- package/dist/controls/index.d.ts.map +1 -1
- package/dist/controls/index.js +5 -39
- package/dist/controls/multi-select-filter.d.ts +4 -3
- package/dist/controls/multi-select-filter.d.ts.map +1 -1
- package/dist/controls/number-filter.d.ts +4 -3
- package/dist/controls/number-filter.d.ts.map +1 -1
- package/dist/controls/number-filter.js +3 -1
- package/dist/controls/range-filter.d.ts +4 -3
- package/dist/controls/range-filter.d.ts.map +1 -1
- package/dist/controls/search-filter.d.ts +4 -3
- package/dist/controls/search-filter.d.ts.map +1 -1
- package/dist/controls/search-filter.js +19 -14
- package/dist/controls/select-filter.d.ts +4 -3
- package/dist/controls/select-filter.d.ts.map +1 -1
- package/dist/controls/sync-button.d.ts.map +1 -1
- package/dist/controls/sync-button.js +12 -15
- package/dist/controls/toggle-filter.d.ts +4 -3
- package/dist/controls/toggle-filter.d.ts.map +1 -1
- package/dist/controls/uncontrolled.d.ts +12 -0
- package/dist/controls/uncontrolled.d.ts.map +1 -0
- package/dist/controls/view-tabs.d.ts +2 -2
- package/dist/controls/view-tabs.d.ts.map +1 -1
- package/dist/controls-dates/index.d.ts +0 -1
- package/dist/controls-dates/index.d.ts.map +1 -1
- package/dist/dashboard/index.d.ts +7 -9
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/index.js +3 -23
- package/dist/dashboard/section.d.ts +4 -6
- package/dist/dashboard/section.d.ts.map +1 -1
- package/dist/dashboard/section.js +4 -10
- package/dist/dashboard/stat-card.d.ts +4 -4
- package/dist/dashboard/stat-card.d.ts.map +1 -1
- package/dist/dashboard/stat-card.js +3 -3
- package/dist/dashboard/widget-header.module.css +9 -7
- package/dist/dev-dock.d.ts.map +1 -1
- package/dist/dev-dock.js +6 -1
- package/dist/format/date.d.ts +0 -34
- package/dist/format/date.d.ts.map +1 -1
- package/dist/format/date.js +0 -54
- package/dist/format/index.d.ts +7 -22
- package/dist/format/index.d.ts.map +1 -1
- package/dist/format/index.js +2 -43
- package/dist/format/number.d.ts +3 -14
- package/dist/format/number.d.ts.map +1 -1
- package/dist/format/number.js +0 -13
- package/dist/format/shared.d.ts +2 -3
- package/dist/format/shared.d.ts.map +1 -1
- package/dist/forms/index.d.ts +0 -11
- package/dist/forms/index.d.ts.map +1 -1
- package/dist/forms/index.js +1 -14
- package/dist/guard/index.d.ts +6 -21
- package/dist/guard/index.d.ts.map +1 -1
- package/dist/guard/index.js +27 -115
- package/dist/guard/types.d.ts +7 -18
- package/dist/guard/types.d.ts.map +1 -1
- package/dist/index.d.ts +16 -48
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -117
- package/dist/provider/create-router.d.ts +44 -0
- package/dist/provider/create-router.d.ts.map +1 -0
- package/dist/provider/create-router.js +62 -0
- package/dist/provider/hotkeys.d.ts +8 -0
- package/dist/provider/hotkeys.d.ts.map +1 -0
- package/dist/provider/hotkeys.js +50 -0
- package/dist/provider/index.d.ts +33 -110
- package/dist/provider/index.d.ts.map +1 -1
- package/dist/provider/index.js +182 -82
- package/dist/provider/lab-theme.d.ts.map +1 -1
- package/dist/provider/route-transition.d.ts +76 -0
- package/dist/provider/route-transition.d.ts.map +1 -0
- package/dist/provider/route-transition.js +98 -0
- package/dist/provider/spotlight-actions.d.ts +10 -0
- package/dist/provider/spotlight-actions.d.ts.map +1 -0
- package/dist/provider/spotlight-actions.js +55 -0
- package/dist/provider/test-router.d.ts +6 -0
- package/dist/provider/test-router.d.ts.map +1 -0
- package/dist/provider/test-router.js +18 -0
- package/dist/query-client.d.ts +4 -20
- package/dist/query-client.d.ts.map +1 -1
- package/dist/query-client.js +2 -2
- package/dist/router-tanstack/index.d.ts +18 -64
- package/dist/router-tanstack/index.d.ts.map +1 -1
- package/dist/router-tanstack/index.js +2 -16
- package/dist/router-tanstack/nav.d.ts +12 -1
- package/dist/router-tanstack/nav.d.ts.map +1 -1
- package/dist/router-tanstack/nav.js +8 -1
- package/dist/router-tanstack/search-store.d.ts +1 -1
- package/dist/router-tanstack/search-store.d.ts.map +1 -1
- package/dist/router-tanstack/use-nav.d.ts +8 -9
- package/dist/router-tanstack/use-nav.d.ts.map +1 -1
- package/dist/router-tanstack/use-nav.js +20 -1
- package/dist/shell/app-mobile-nav.d.ts.map +1 -1
- package/dist/shell/app-sidebar.js +1 -1
- package/dist/shell/index.d.ts +31 -10
- package/dist/shell/index.d.ts.map +1 -1
- package/dist/shell/index.js +14 -3
- package/dist/shell/page-aside.d.ts +2 -2
- package/dist/shell/page-aside.d.ts.map +1 -1
- package/dist/shell/page-aside.js +31 -12
- package/dist/shell/page-bar.d.ts +2 -2
- package/dist/shell/page-bar.d.ts.map +1 -1
- package/dist/shell/page-bar.js +1 -1
- package/dist/state.d.ts +10 -12
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +4 -6
- package/dist/styles.css +107 -7
- package/dist/surfaces.d.ts +28 -103
- package/dist/surfaces.d.ts.map +1 -1
- package/dist/surfaces.js +54 -143
- package/dist/{data → table}/data-table-state.d.ts +1 -1
- package/dist/table/data-table-state.d.ts.map +1 -0
- package/dist/{data → table}/data-table-state.js +4 -3
- package/dist/{data → table}/data-table.d.ts +28 -49
- package/dist/table/data-table.d.ts.map +1 -0
- package/dist/{data → table}/data-table.js +74 -60
- package/dist/table/index.d.ts +18 -0
- package/dist/table/index.d.ts.map +1 -0
- package/dist/{data/table.js → table/index.js} +1 -1
- package/dist/table/query-branch.d.ts.map +1 -0
- package/dist/table/table-features.d.ts +69 -0
- package/dist/table/table-features.d.ts.map +1 -0
- package/dist/table/table-features.js +49 -0
- package/dist/telemetry.d.ts +77 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +33 -0
- package/dist/theme/index.d.ts +10 -21
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +3 -14
- package/dist/theme/theme-toggle.d.ts.map +1 -1
- package/dist/theme/theme-toggle.js +7 -33
- package/dist/theme/theme-toggle.module.css +30 -0
- package/dist/theme/theme-toggle.module.css.d.ts +10 -0
- package/dist/theme-lab/derive-controls.d.ts.map +1 -1
- package/dist/theme-lab/derive-controls.js +5 -3
- package/dist/theme-lab/derive-state.d.ts.map +1 -1
- package/dist/theme-lab/derive-state.js +2 -1
- package/dist/tokens/core.d.ts +360 -0
- package/dist/tokens/core.d.ts.map +1 -0
- package/dist/tokens/core.js +708 -0
- package/dist/tokens/derive.d.ts +1 -1
- package/dist/tokens/derive.d.ts.map +1 -1
- package/dist/tokens/index.d.ts +5 -373
- package/dist/tokens/index.d.ts.map +1 -1
- package/dist/tokens/index.js +8 -700
- package/dist/tokens/palette.d.ts +2 -6
- package/dist/tokens/palette.d.ts.map +1 -1
- package/dist/tokens/palette.js +1 -4
- package/dist/vite.d.ts +4 -3
- package/dist/vite.d.ts.map +1 -1
- package/llms.txt +43 -85
- package/package.json +77 -170
- package/src/agent/ai-sdk-transport.ts +57 -37
- package/src/{agent-chat → agent/chat}/composer.tsx +29 -30
- package/src/{agent-chat → agent/chat}/message-affordances.ts +8 -5
- package/src/{agent-chat → agent/chat}/thread-feed-row.tsx +30 -35
- package/src/{agent-chat → agent/chat}/thread-feed.tsx +40 -35
- package/src/{agent-chat → agent/chat}/thread-message.tsx +37 -35
- package/src/{agent-chat → agent/chat}/thread-outcome-card.tsx +5 -5
- package/src/{agent-chat → agent/chat}/tool-chip.tsx +12 -12
- package/src/{agent-chat → agent/chat}/use-keyboard-inset.ts +1 -1
- package/src/{agent-chat → agent/chat}/virtualize.ts +5 -5
- package/src/agent/error.ts +43 -0
- package/src/agent/foreign.ts +3 -2
- package/src/agent/history.ts +2 -107
- package/src/agent/id.ts +4 -5
- package/src/agent/index.ts +23 -112
- package/src/agent/outcome.ts +3 -56
- package/src/agent/part-list.tsx +3 -3
- package/src/agent/parts.ts +23 -22
- package/src/agent/run-committer.ts +64 -0
- package/src/agent/run-records.ts +147 -0
- package/src/agent/thread.ts +24 -231
- package/src/agent/transport.ts +6 -96
- package/src/agent/use-agent-thread-runs.ts +364 -199
- package/src/charts/BandStrip.tsx +276 -0
- package/src/charts/Bars.tsx +141 -0
- package/src/charts/CartesianChart.tsx +206 -0
- package/src/charts/ChartCard.tsx +178 -0
- package/src/charts/Donut.tsx +256 -0
- package/src/charts/DualPanel.tsx +326 -0
- package/src/charts/Heatmap.tsx +282 -0
- package/src/charts/Lines.tsx +151 -0
- package/src/charts/MirroredBars.tsx +303 -0
- package/src/charts/Sparkline.tsx +176 -0
- package/src/charts/StackedArea.tsx +80 -0
- package/src/charts/box.tsx +96 -0
- package/src/charts/card-context.ts +11 -0
- package/src/charts/chart-box.module.css +64 -0
- package/src/charts/chart-box.module.css.d.ts +12 -0
- package/src/charts/chart-card.module.css +25 -0
- package/src/charts/chart-card.module.css.d.ts +8 -0
- package/src/charts/chart-legend.module.css +38 -0
- package/src/charts/chart-legend.module.css.d.ts +10 -0
- package/src/charts/compile.ts +585 -0
- package/src/charts/cursor.ts +282 -0
- package/src/charts/curves.ts +111 -0
- package/src/charts/donut.module.css +54 -0
- package/src/charts/donut.module.css.d.ts +9 -0
- package/src/charts/host.tsx +60 -0
- package/src/charts/index.ts +41 -178
- package/src/charts/legend.tsx +204 -0
- package/src/charts/marks.ts +201 -0
- package/src/charts/panel.tsx +227 -0
- package/src/charts/scales.ts +237 -0
- package/src/charts/sizing.ts +47 -0
- package/src/charts/state.tsx +80 -0
- package/src/charts/theme.ts +65 -0
- package/src/charts/types.ts +242 -0
- package/src/cli/audit-allows.ts +8 -30
- package/src/cli/config.ts +14 -43
- package/src/cli/doctor-upgrade.ts +392 -0
- package/src/cli/doctor.ts +120 -68
- package/src/cli/help.ts +2 -4
- package/src/cli/index.ts +161 -276
- package/src/cli/init.ts +60 -37
- package/src/cli/sync.ts +13 -45
- package/src/cli/tokens-css.ts +7 -28
- package/src/commands/ShortcutsHelp.tsx +8 -9
- package/src/commands/define-commands.ts +16 -43
- package/src/commands/define-overlays.ts +12 -36
- package/src/commands/index.ts +11 -94
- package/src/{notifications → commands/notifications}/bell.tsx +2 -2
- package/src/{notifications → commands/notifications}/center.tsx +7 -5
- package/src/{notifications → commands/notifications}/define-notifications.ts +3 -3
- package/src/commands/notifications/notify.tsx +158 -0
- package/src/{notifications → commands/notifications}/store.ts +10 -2
- package/src/commands/projectors.ts +5 -225
- package/src/commands/shell-bridge.ts +5 -5
- package/src/commands/shortcut-format.ts +5 -4
- package/src/common/errors.ts +3 -3
- package/src/common/use-measured-widths.ts +6 -3
- package/src/common/validate.ts +2 -2
- package/src/content/article-layout.tsx +37 -38
- package/src/content/article-model.ts +1 -84
- package/src/content/copy-action.tsx +1 -1
- package/src/content/glyphs.tsx +1 -1
- package/src/content/index.ts +12 -83
- package/src/content/markdown.tsx +4 -3
- package/src/content/mermaid.tsx +9 -7
- package/src/content/slug.ts +1 -16
- package/src/content/url-hardening.ts +8 -2
- package/src/controls/actions.tsx +24 -1
- package/src/controls/enum-filter.tsx +1 -1
- package/src/controls/filter-context.tsx +3 -1
- package/src/controls/filter-set.tsx +5 -7
- package/src/controls/form-layout.tsx +2 -2
- package/src/controls/glyphs.tsx +0 -10
- package/src/controls/index.ts +13 -64
- package/src/controls/multi-select-filter.tsx +5 -4
- package/src/controls/number-filter.tsx +8 -4
- package/src/controls/range-filter.tsx +5 -4
- package/src/controls/search-filter.tsx +25 -19
- package/src/controls/select-filter.tsx +5 -4
- package/src/controls/sync-button.tsx +18 -20
- package/src/controls/toggle-filter.tsx +5 -4
- package/src/controls/uncontrolled.ts +12 -0
- package/src/controls/view-tabs.tsx +3 -3
- package/src/controls-dates/date-range-picker.tsx +1 -1
- package/src/controls-dates/index.ts +0 -1
- package/src/dashboard/index.ts +7 -48
- package/src/dashboard/section.tsx +11 -40
- package/src/dashboard/stat-card.tsx +14 -16
- package/src/dashboard/widget-header.module.css +9 -7
- package/src/dev-dock.tsx +14 -27
- package/src/format/date.ts +2 -92
- package/src/format/index.ts +7 -53
- package/src/format/number.ts +3 -26
- package/src/format/shared.ts +2 -3
- package/src/forms/index.ts +0 -23
- package/src/guard/index.ts +37 -192
- package/src/guard/types.ts +6 -19
- package/src/index.ts +30 -282
- package/src/provider/create-router.tsx +138 -0
- package/src/provider/hotkeys.ts +70 -0
- package/src/provider/index.tsx +260 -230
- package/src/provider/lab-theme.ts +3 -2
- package/src/provider/route-transition.ts +199 -0
- package/src/provider/spotlight-actions.tsx +69 -0
- package/src/provider/test-router.tsx +25 -0
- package/src/query-client.ts +4 -22
- package/src/router-tanstack/index.ts +18 -112
- package/src/router-tanstack/nav.ts +28 -2
- package/src/router-tanstack/search-store.ts +9 -2
- package/src/router-tanstack/use-nav.ts +47 -13
- package/src/shell/app-mobile-nav.tsx +3 -2
- package/src/shell/app-sidebar.tsx +1 -1
- package/src/shell/aside-docking.ts +1 -1
- package/src/shell/index.tsx +61 -20
- package/src/shell/page-aside.tsx +47 -23
- package/src/shell/page-bar.tsx +3 -3
- package/src/shell/page-title.tsx +1 -1
- package/src/state.ts +11 -37
- package/src/styles.css +107 -7
- package/src/surfaces.ts +56 -151
- package/src/{data → table}/data-table-state.ts +5 -4
- package/src/{data → table}/data-table.tsx +170 -161
- package/src/table/index.ts +18 -0
- package/src/table/table-features.ts +102 -0
- package/src/telemetry.ts +110 -0
- package/src/theme/index.ts +22 -47
- package/src/theme/theme-toggle.module.css +30 -0
- package/src/theme/theme-toggle.module.css.d.ts +10 -0
- package/src/theme/theme-toggle.tsx +15 -43
- package/src/theme-lab/derive-controls.tsx +5 -3
- package/src/theme-lab/derive-state.ts +2 -1
- package/src/tokens/core.ts +1163 -0
- package/src/tokens/derive.ts +1 -1
- package/src/tokens/index.ts +14 -1181
- package/src/tokens/palette.ts +3 -7
- package/src/vite.ts +3 -3
- package/agent/templates/CLAUDE-block.md.tpl +0 -40
- package/agent/templates/query-client.ts.tpl +0 -26
- package/dist/agent/adapter.d.ts +0 -150
- package/dist/agent/adapter.d.ts.map +0 -1
- package/dist/agent/adapter.js +0 -482
- package/dist/agent/use-agent-stream.d.ts +0 -35
- package/dist/agent/use-agent-stream.d.ts.map +0 -1
- package/dist/agent/use-agent-stream.js +0 -59
- package/dist/agent-chat/composer.d.ts.map +0 -1
- package/dist/agent-chat/index.d.ts +0 -31
- package/dist/agent-chat/index.d.ts.map +0 -1
- package/dist/agent-chat/index.js +0 -19
- package/dist/agent-chat/message-affordances.d.ts.map +0 -1
- package/dist/agent-chat/relative-time.d.ts.map +0 -1
- package/dist/agent-chat/thread-detail-panel.d.ts +0 -28
- package/dist/agent-chat/thread-detail-panel.d.ts.map +0 -1
- package/dist/agent-chat/thread-detail-panel.js +0 -115
- package/dist/agent-chat/thread-feed-row.d.ts.map +0 -1
- package/dist/agent-chat/thread-feed.d.ts.map +0 -1
- package/dist/agent-chat/thread-message.d.ts.map +0 -1
- package/dist/agent-chat/thread-outcome-card.d.ts.map +0 -1
- package/dist/agent-chat/thread-workspace.d.ts +0 -44
- package/dist/agent-chat/thread-workspace.d.ts.map +0 -1
- package/dist/agent-chat/thread-workspace.js +0 -153
- package/dist/agent-chat/tool-chip.d.ts.map +0 -1
- package/dist/agent-chat/use-keyboard-inset.d.ts.map +0 -1
- package/dist/agent-chat/virtualize.d.ts.map +0 -1
- package/dist/charts/cursor/resolve.d.ts +0 -75
- package/dist/charts/cursor/resolve.d.ts.map +0 -1
- package/dist/charts/cursor/resolve.js +0 -91
- package/dist/charts/cursor/scope.d.ts +0 -20
- package/dist/charts/cursor/scope.d.ts.map +0 -1
- package/dist/charts/cursor/scope.js +0 -20
- package/dist/charts/cursor/store.d.ts +0 -35
- package/dist/charts/cursor/store.d.ts.map +0 -1
- package/dist/charts/cursor/store.js +0 -25
- package/dist/charts/cursor/touch-pin.d.ts +0 -45
- package/dist/charts/cursor/touch-pin.d.ts.map +0 -1
- package/dist/charts/cursor/touch-pin.js +0 -79
- package/dist/charts/hooks/use-discrete-cursor.d.ts +0 -66
- package/dist/charts/hooks/use-discrete-cursor.d.ts.map +0 -1
- package/dist/charts/hooks/use-discrete-cursor.js +0 -198
- package/dist/charts/hooks/use-hysteresis.d.ts +0 -18
- package/dist/charts/hooks/use-hysteresis.d.ts.map +0 -1
- package/dist/charts/hooks/use-hysteresis.js +0 -12
- package/dist/charts/hooks/useBandPlot.d.ts +0 -145
- package/dist/charts/hooks/useBandPlot.d.ts.map +0 -1
- package/dist/charts/hooks/useBandPlot.js +0 -178
- package/dist/charts/hooks/useChartCursor.d.ts +0 -75
- package/dist/charts/hooks/useChartCursor.d.ts.map +0 -1
- package/dist/charts/hooks/useChartCursor.js +0 -200
- package/dist/charts/hooks/useChartSize.d.ts +0 -29
- package/dist/charts/hooks/useChartSize.d.ts.map +0 -1
- package/dist/charts/hooks/useChartSize.js +0 -8
- package/dist/charts/kinds/BandStrip.d.ts +0 -132
- package/dist/charts/kinds/BandStrip.d.ts.map +0 -1
- package/dist/charts/kinds/BandStrip.js +0 -241
- package/dist/charts/kinds/Bars.d.ts +0 -141
- package/dist/charts/kinds/Bars.d.ts.map +0 -1
- package/dist/charts/kinds/Bars.js +0 -343
- package/dist/charts/kinds/Donut.d.ts +0 -77
- package/dist/charts/kinds/Donut.d.ts.map +0 -1
- package/dist/charts/kinds/Donut.js +0 -245
- package/dist/charts/kinds/DualPanel.d.ts +0 -111
- package/dist/charts/kinds/DualPanel.d.ts.map +0 -1
- package/dist/charts/kinds/DualPanel.js +0 -471
- package/dist/charts/kinds/Heatmap.d.ts +0 -85
- package/dist/charts/kinds/Heatmap.d.ts.map +0 -1
- package/dist/charts/kinds/Heatmap.js +0 -243
- package/dist/charts/kinds/MirroredBars.d.ts +0 -98
- package/dist/charts/kinds/MirroredBars.d.ts.map +0 -1
- package/dist/charts/kinds/MirroredBars.js +0 -292
- package/dist/charts/kinds/MultiLine.d.ts +0 -87
- package/dist/charts/kinds/MultiLine.d.ts.map +0 -1
- package/dist/charts/kinds/MultiLine.js +0 -176
- package/dist/charts/kinds/StackedArea.d.ts +0 -73
- package/dist/charts/kinds/StackedArea.d.ts.map +0 -1
- package/dist/charts/kinds/StackedArea.js +0 -135
- package/dist/charts/kinds/ZonedLine.d.ts +0 -97
- package/dist/charts/kinds/ZonedLine.d.ts.map +0 -1
- package/dist/charts/kinds/ZonedLine.js +0 -155
- package/dist/charts/kinds/band-chrome.d.ts +0 -31
- package/dist/charts/kinds/band-chrome.d.ts.map +0 -1
- package/dist/charts/kinds/band-chrome.js +0 -71
- package/dist/charts/kinds/donut-layout.d.ts +0 -47
- package/dist/charts/kinds/donut-layout.d.ts.map +0 -1
- package/dist/charts/kinds/donut-layout.js +0 -52
- package/dist/charts/layout/auto-margin.d.ts +0 -122
- package/dist/charts/layout/auto-margin.d.ts.map +0 -1
- package/dist/charts/layout/auto-margin.js +0 -81
- package/dist/charts/layout/end-labels.d.ts +0 -64
- package/dist/charts/layout/end-labels.d.ts.map +0 -1
- package/dist/charts/layout/end-labels.js +0 -76
- package/dist/charts/layout/log-ticks.d.ts +0 -27
- package/dist/charts/layout/log-ticks.d.ts.map +0 -1
- package/dist/charts/layout/log-ticks.js +0 -42
- package/dist/charts/primitives/AreaGradient.d.ts +0 -18
- package/dist/charts/primitives/AreaGradient.d.ts.map +0 -1
- package/dist/charts/primitives/AreaGradient.js +0 -13
- package/dist/charts/primitives/Axes.d.ts +0 -83
- package/dist/charts/primitives/Axes.d.ts.map +0 -1
- package/dist/charts/primitives/Axes.js +0 -168
- package/dist/charts/primitives/CartesianChart.d.ts +0 -257
- package/dist/charts/primitives/CartesianChart.d.ts.map +0 -1
- package/dist/charts/primitives/CartesianChart.js +0 -549
- package/dist/charts/primitives/ChartCard.d.ts +0 -66
- package/dist/charts/primitives/ChartCard.d.ts.map +0 -1
- package/dist/charts/primitives/ChartCard.js +0 -143
- package/dist/charts/primitives/ChartFrame.d.ts +0 -156
- package/dist/charts/primitives/ChartFrame.d.ts.map +0 -1
- package/dist/charts/primitives/ChartFrame.js +0 -241
- package/dist/charts/primitives/ChartLegend.d.ts +0 -67
- package/dist/charts/primitives/ChartLegend.d.ts.map +0 -1
- package/dist/charts/primitives/ChartLegend.js +0 -292
- package/dist/charts/primitives/ChartPending.d.ts +0 -113
- package/dist/charts/primitives/ChartPending.d.ts.map +0 -1
- package/dist/charts/primitives/ChartPending.js +0 -117
- package/dist/charts/primitives/ChartTooltip.d.ts +0 -59
- package/dist/charts/primitives/ChartTooltip.d.ts.map +0 -1
- package/dist/charts/primitives/ChartTooltip.js +0 -197
- package/dist/charts/primitives/Crosshair.d.ts +0 -26
- package/dist/charts/primitives/Crosshair.d.ts.map +0 -1
- package/dist/charts/primitives/Crosshair.js +0 -23
- package/dist/charts/primitives/HatchPattern.d.ts +0 -31
- package/dist/charts/primitives/HatchPattern.d.ts.map +0 -1
- package/dist/charts/primitives/HatchPattern.js +0 -31
- package/dist/charts/primitives/HoverOverlay.d.ts +0 -45
- package/dist/charts/primitives/HoverOverlay.d.ts.map +0 -1
- package/dist/charts/primitives/HoverOverlay.js +0 -72
- package/dist/charts/primitives/HoverOverlay.module.css +0 -13
- package/dist/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
- package/dist/charts/primitives/XZoneRects.d.ts +0 -54
- package/dist/charts/primitives/XZoneRects.d.ts.map +0 -1
- package/dist/charts/primitives/XZoneRects.js +0 -65
- package/dist/charts/primitives/ZoneRects.d.ts +0 -38
- package/dist/charts/primitives/ZoneRects.d.ts.map +0 -1
- package/dist/charts/primitives/ZoneRects.js +0 -30
- package/dist/charts/primitives/chart-card-context.d.ts +0 -33
- package/dist/charts/primitives/chart-card-context.d.ts.map +0 -1
- package/dist/charts/primitives/chart-card-context.js +0 -18
- package/dist/charts/primitives/chart-frame-layout.d.ts +0 -185
- package/dist/charts/primitives/chart-frame-layout.d.ts.map +0 -1
- package/dist/charts/primitives/chart-frame-layout.js +0 -175
- package/dist/charts/primitives/chart-layout.d.ts +0 -112
- package/dist/charts/primitives/chart-layout.d.ts.map +0 -1
- package/dist/charts/primitives/chart-layout.js +0 -175
- package/dist/charts/primitives/chart-tier.d.ts +0 -16
- package/dist/charts/primitives/chart-tier.d.ts.map +0 -1
- package/dist/charts/primitives/chart-tier.js +0 -44
- package/dist/charts/primitives/legend-disclosure.d.ts +0 -27
- package/dist/charts/primitives/legend-disclosure.d.ts.map +0 -1
- package/dist/charts/primitives/legend-disclosure.js +0 -153
- package/dist/charts/series.d.ts +0 -189
- package/dist/charts/series.d.ts.map +0 -1
- package/dist/charts/series.js +0 -84
- package/dist/charts/sparklines/BarSparkline.d.ts +0 -37
- package/dist/charts/sparklines/BarSparkline.d.ts.map +0 -1
- package/dist/charts/sparklines/BarSparkline.js +0 -53
- package/dist/charts/sparklines/LineSparkline.d.ts +0 -15
- package/dist/charts/sparklines/LineSparkline.d.ts.map +0 -1
- package/dist/charts/sparklines/LineSparkline.js +0 -51
- package/dist/charts/sparklines/index.d.ts +0 -3
- package/dist/charts/sparklines/index.d.ts.map +0 -1
- package/dist/charts/sparklines/index.js +0 -6
- package/dist/charts/utils/domain.d.ts +0 -35
- package/dist/charts/utils/domain.d.ts.map +0 -1
- package/dist/charts/utils/domain.js +0 -12
- package/dist/charts/utils/format.d.ts +0 -8
- package/dist/charts/utils/format.d.ts.map +0 -1
- package/dist/charts/utils/format.js +0 -20
- package/dist/charts/utils/measure-text.d.ts +0 -25
- package/dist/charts/utils/measure-text.d.ts.map +0 -1
- package/dist/charts/utils/measure-text.js +0 -64
- package/dist/charts/utils/ticks.d.ts +0 -103
- package/dist/charts/utils/ticks.d.ts.map +0 -1
- package/dist/charts/utils/ticks.js +0 -92
- package/dist/commands/overlays-mount.d.ts +0 -122
- package/dist/commands/overlays-mount.d.ts.map +0 -1
- package/dist/commands/overlays-mount.js +0 -125
- package/dist/commands/useCommandHotkeys.d.ts +0 -14
- package/dist/commands/useCommandHotkeys.d.ts.map +0 -1
- package/dist/commands/useCommandHotkeys.js +0 -45
- package/dist/content/article-actions.d.ts +0 -39
- package/dist/content/article-actions.d.ts.map +0 -1
- package/dist/content/article-actions.js +0 -28
- package/dist/content/article-card.d.ts +0 -58
- package/dist/content/article-card.d.ts.map +0 -1
- package/dist/content/article-card.js +0 -79
- package/dist/content/article-card.module.css +0 -111
- package/dist/content/mdx.d.ts +0 -20
- package/dist/content/mdx.d.ts.map +0 -1
- package/dist/content/mdx.js +0 -64
- package/dist/controls/compare-filter.d.ts +0 -42
- package/dist/controls/compare-filter.d.ts.map +0 -1
- package/dist/controls/compare-filter.js +0 -38
- package/dist/controls/slider-control.d.ts +0 -36
- package/dist/controls/slider-control.d.ts.map +0 -1
- package/dist/controls/slider-control.js +0 -64
- package/dist/dashboard/widget-grid.d.ts +0 -27
- package/dist/dashboard/widget-grid.d.ts.map +0 -1
- package/dist/dashboard/widget-grid.js +0 -40
- package/dist/dashboard/widget-grid.module.css +0 -69
- package/dist/data/data-table-state.d.ts.map +0 -1
- package/dist/data/data-table.d.ts.map +0 -1
- package/dist/data/query-branch.d.ts.map +0 -1
- package/dist/data/table.d.ts +0 -24
- package/dist/data/table.d.ts.map +0 -1
- package/dist/data/virtual-list.d.ts +0 -133
- package/dist/data/virtual-list.d.ts.map +0 -1
- package/dist/data/virtual-list.js +0 -157
- package/dist/data/virtual.d.ts +0 -21
- package/dist/data/virtual.d.ts.map +0 -1
- package/dist/data/virtual.js +0 -4
- package/dist/forms/FormErrorSummary.d.ts +0 -30
- package/dist/forms/FormErrorSummary.d.ts.map +0 -1
- package/dist/forms/FormErrorSummary.js +0 -30
- package/dist/forms/use-field-array.d.ts +0 -60
- package/dist/forms/use-field-array.d.ts.map +0 -1
- package/dist/forms/use-field-array.js +0 -20
- package/dist/forms/use-form-draft.d.ts +0 -76
- package/dist/forms/use-form-draft.d.ts.map +0 -1
- package/dist/forms/use-form-draft.js +0 -92
- package/dist/forms/use-form-submit.d.ts +0 -88
- package/dist/forms/use-form-submit.d.ts.map +0 -1
- package/dist/forms/use-form-submit.js +0 -63
- package/dist/notifications/bell.d.ts.map +0 -1
- package/dist/notifications/center.d.ts.map +0 -1
- package/dist/notifications/define-notifications.d.ts.map +0 -1
- package/dist/notifications/index.d.ts +0 -40
- package/dist/notifications/index.d.ts.map +0 -1
- package/dist/notifications/index.js +0 -54
- package/dist/notifications/mount-guard.d.ts +0 -8
- package/dist/notifications/mount-guard.d.ts.map +0 -1
- package/dist/notifications/mount-guard.js +0 -18
- package/dist/notifications/notify.d.ts +0 -149
- package/dist/notifications/notify.d.ts.map +0 -1
- package/dist/notifications/notify.js +0 -171
- package/dist/notifications/store.d.ts.map +0 -1
- package/dist/provider/connectivity-indicator.d.ts +0 -13
- package/dist/provider/connectivity-indicator.d.ts.map +0 -1
- package/dist/provider/connectivity-indicator.js +0 -205
- package/dist/provider/connectivity-provider.d.ts +0 -7
- package/dist/provider/connectivity-provider.d.ts.map +0 -1
- package/dist/provider/connectivity-provider.js +0 -128
- package/dist/provider/connectivity-types.d.ts +0 -36
- package/dist/provider/connectivity-types.d.ts.map +0 -1
- package/dist/provider/use-connectivity.d.ts +0 -3
- package/dist/provider/use-connectivity.d.ts.map +0 -1
- package/dist/provider/use-connectivity.js +0 -14
- package/dist/query-devtools.d.ts +0 -21
- package/dist/query-devtools.d.ts.map +0 -1
- package/dist/query-devtools.js +0 -13
- package/src/agent/adapter.ts +0 -945
- package/src/agent/use-agent-stream.ts +0 -154
- package/src/agent-chat/index.ts +0 -54
- package/src/agent-chat/thread-detail-panel.tsx +0 -201
- package/src/agent-chat/thread-workspace.tsx +0 -279
- package/src/charts/cursor/resolve.ts +0 -198
- package/src/charts/cursor/scope.tsx +0 -35
- package/src/charts/cursor/store.ts +0 -58
- package/src/charts/cursor/touch-pin.ts +0 -138
- package/src/charts/hooks/use-discrete-cursor.ts +0 -335
- package/src/charts/hooks/use-hysteresis.ts +0 -26
- package/src/charts/hooks/useBandPlot.ts +0 -383
- package/src/charts/hooks/useChartCursor.ts +0 -367
- package/src/charts/hooks/useChartSize.ts +0 -35
- package/src/charts/kinds/BandStrip.tsx +0 -449
- package/src/charts/kinds/Bars.tsx +0 -589
- package/src/charts/kinds/Donut.tsx +0 -368
- package/src/charts/kinds/DualPanel.tsx +0 -712
- package/src/charts/kinds/Heatmap.tsx +0 -396
- package/src/charts/kinds/MirroredBars.tsx +0 -469
- package/src/charts/kinds/MultiLine.tsx +0 -322
- package/src/charts/kinds/StackedArea.tsx +0 -267
- package/src/charts/kinds/ZonedLine.tsx +0 -301
- package/src/charts/kinds/band-chrome.tsx +0 -91
- package/src/charts/kinds/donut-layout.ts +0 -82
- package/src/charts/layout/auto-margin.ts +0 -242
- package/src/charts/layout/end-labels.ts +0 -135
- package/src/charts/layout/log-ticks.ts +0 -90
- package/src/charts/primitives/AreaGradient.tsx +0 -26
- package/src/charts/primitives/Axes.tsx +0 -271
- package/src/charts/primitives/CartesianChart.tsx +0 -1002
- package/src/charts/primitives/ChartCard.tsx +0 -280
- package/src/charts/primitives/ChartFrame.tsx +0 -493
- package/src/charts/primitives/ChartLegend.tsx +0 -422
- package/src/charts/primitives/ChartPending.tsx +0 -243
- package/src/charts/primitives/ChartTooltip.tsx +0 -265
- package/src/charts/primitives/Crosshair.tsx +0 -43
- package/src/charts/primitives/HatchPattern.tsx +0 -55
- package/src/charts/primitives/HoverOverlay.module.css +0 -13
- package/src/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
- package/src/charts/primitives/HoverOverlay.tsx +0 -109
- package/src/charts/primitives/XZoneRects.tsx +0 -132
- package/src/charts/primitives/ZoneRects.tsx +0 -67
- package/src/charts/primitives/chart-card-context.ts +0 -46
- package/src/charts/primitives/chart-frame-layout.ts +0 -430
- package/src/charts/primitives/chart-layout.ts +0 -318
- package/src/charts/primitives/chart-tier.tsx +0 -76
- package/src/charts/primitives/legend-disclosure.tsx +0 -178
- package/src/charts/series.ts +0 -276
- package/src/charts/sparklines/BarSparkline.tsx +0 -94
- package/src/charts/sparklines/LineSparkline.tsx +0 -71
- package/src/charts/sparklines/index.ts +0 -2
- package/src/charts/theme.tsx +0 -53
- package/src/charts/utils/domain.ts +0 -41
- package/src/charts/utils/format.ts +0 -19
- package/src/charts/utils/measure-text.ts +0 -109
- package/src/charts/utils/ticks.ts +0 -239
- package/src/commands/overlays-mount.tsx +0 -333
- package/src/commands/useCommandHotkeys.ts +0 -114
- package/src/content/article-actions.ts +0 -72
- package/src/content/article-card.module.css +0 -111
- package/src/content/article-card.tsx +0 -174
- package/src/content/mdx.tsx +0 -127
- package/src/controls/compare-filter.tsx +0 -81
- package/src/controls/slider-control.tsx +0 -159
- package/src/dashboard/widget-grid.module.css +0 -69
- package/src/dashboard/widget-grid.tsx +0 -146
- package/src/data/table.ts +0 -39
- package/src/data/virtual-list.tsx +0 -356
- package/src/data/virtual.ts +0 -26
- package/src/forms/FormErrorSummary.tsx +0 -71
- package/src/forms/use-field-array.ts +0 -94
- package/src/forms/use-form-draft.ts +0 -262
- package/src/forms/use-form-submit.ts +0 -199
- package/src/notifications/index.ts +0 -88
- package/src/notifications/mount-guard.ts +0 -38
- package/src/notifications/notify.tsx +0 -379
- package/src/provider/connectivity-indicator.tsx +0 -267
- package/src/provider/connectivity-provider.tsx +0 -189
- package/src/provider/connectivity-types.ts +0 -42
- package/src/provider/use-connectivity.ts +0 -26
- package/src/query-devtools.tsx +0 -40
- /package/dist/{agent-chat → agent/chat}/message-affordances.js +0 -0
- /package/dist/{agent-chat → agent/chat}/relative-time.d.ts +0 -0
- /package/dist/{agent-chat → agent/chat}/relative-time.js +0 -0
- /package/dist/{agent-chat → agent/chat}/use-keyboard-inset.d.ts +0 -0
- /package/dist/{agent-chat → agent/chat}/virtualize.js +0 -0
- /package/dist/{notifications → commands/notifications}/bell.js +0 -0
- /package/dist/{notifications → commands/notifications}/define-notifications.js +0 -0
- /package/dist/{provider/connectivity-types.js → controls/uncontrolled.js} +0 -0
- /package/dist/{data → table}/data-table.module.css +0 -0
- /package/dist/{data → table}/data-table.module.css.d.ts +0 -0
- /package/dist/{data → table}/query-branch.d.ts +0 -0
- /package/dist/{data → table}/query-branch.js +0 -0
- /package/src/{agent-chat → agent/chat}/relative-time.ts +0 -0
- /package/src/{data → table}/data-table.module.css +0 -0
- /package/src/{data → table}/data-table.module.css.d.ts +0 -0
- /package/src/{data → table}/query-branch.ts +0 -0
|
@@ -1,318 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `resolveChartLayout` — the single, pure decision point for a chart's space
|
|
3
|
-
* (`docs/CHARTS-SPEC.md` §8): container class, height and legend fit. Also hosts the axis-economy
|
|
4
|
-
* ladder (`resolveYPlacement`, `planXLabels`, `yTickCount`, `compactNumber`, …) that
|
|
5
|
-
* `CartesianChart`/`useBandPlot` call directly. DOM-free and Mantine-free; deliberately not on any
|
|
6
|
-
* public barrel.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { resolveContainerClass } from '../../tokens/size-classes'
|
|
10
|
-
import type { ContainerClass, SIZE_CLASSES } from '../../tokens/size-classes'
|
|
11
|
-
import { VX } from '../../tokens'
|
|
12
|
-
import type { ChartMargin } from '../../tokens'
|
|
13
|
-
import { measureText } from '../utils/measure-text'
|
|
14
|
-
import type { LegendEntry } from './ChartLegend'
|
|
15
|
-
import {
|
|
16
|
-
entriesWithinChipRows,
|
|
17
|
-
entriesWithinDotRows,
|
|
18
|
-
entriesWithinRows,
|
|
19
|
-
orderEntries,
|
|
20
|
-
} from './chart-frame-layout'
|
|
21
|
-
|
|
22
|
-
export type ChartLayout = {
|
|
23
|
-
containerClass: ContainerClass
|
|
24
|
-
height: number
|
|
25
|
-
legend:
|
|
26
|
-
| { mode: 'none' }
|
|
27
|
-
| { mode: 'dots' | 'chips'; where: 'header' | 'band'; visible: number; overflow: number }
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export type ChartLayoutInput = {
|
|
31
|
-
/** The chart frame's MEASURED width; `<= 0` is unmeasured (SSR, first paint). */
|
|
32
|
-
frameW: number
|
|
33
|
-
/** Width of the card's header legend slot; `0` when there is none (the legend takes a band). */
|
|
34
|
-
slotW: number
|
|
35
|
-
/** Viewport height in px (`0` unknown). Only read on a coarse pointer. */
|
|
36
|
-
viewportH: number
|
|
37
|
-
legendItems: readonly LegendEntry[]
|
|
38
|
-
/** Viewport class — decides the container class until the frame is measured. */
|
|
39
|
-
sizeClass: keyof typeof SIZE_CLASSES
|
|
40
|
-
coarse: boolean
|
|
41
|
-
/**
|
|
42
|
-
* The card's own `short` flag (`ChartCard`'s `measuredHeight < CARD_SHORT_HEIGHT`) — the ONE
|
|
43
|
-
* source of truth for "this legend gets at most one row", not a second narrower threshold.
|
|
44
|
-
* Default `false` (no card, or an unmeasured/tall one).
|
|
45
|
-
*/
|
|
46
|
-
cardShort?: boolean
|
|
47
|
-
/** The legend's own `groups` config — whether role dividers render (and so count toward the
|
|
48
|
-
* dots-mode fit). Default `false`. */
|
|
49
|
-
groups?: boolean
|
|
50
|
-
/** Consumer-stated values; each wins over the derived one. */
|
|
51
|
-
override?: { height?: number }
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/** Height = width × ratio, per container class. */
|
|
55
|
-
const HEIGHT_RATIO = { micro: 0.5, compact: 0.62, regular: 0.5, wide: 0.4 } as const
|
|
56
|
-
const HEIGHT_MIN = 160
|
|
57
|
-
const HEIGHT_MAX = 420
|
|
58
|
-
/** A coarse pointer never gets a chart taller than this share of the viewport. */
|
|
59
|
-
const COARSE_VIEWPORT_SHARE = 0.45
|
|
60
|
-
/** Width assumed per class before the frame is measured. */
|
|
61
|
-
const UNMEASURED_WIDTH = { micro: 200, compact: 360, regular: 640, wide: 960 } as const
|
|
62
|
-
/** A y-axis tick every ~44px of plot height. */
|
|
63
|
-
const TICK_SPACING = 44
|
|
64
|
-
const COMPACT_LABEL_CHARS = 4
|
|
65
|
-
/** Gap kept between two adjacent x labels. */
|
|
66
|
-
const X_LABEL_GAP = 8
|
|
67
|
-
/** A legend shares one header row; in the band it may wrap to two. */
|
|
68
|
-
const LEGEND_ROWS = { header: 1, band: 2 } as const
|
|
69
|
-
|
|
70
|
-
/** Before the first measurement a compact viewport implies a compact container. */
|
|
71
|
-
const CONTAINER_CLASS_OF_SIZE_CLASS = {
|
|
72
|
-
compact: 'compact',
|
|
73
|
-
medium: 'regular',
|
|
74
|
-
expanded: 'wide',
|
|
75
|
-
} as const satisfies Record<keyof typeof SIZE_CLASSES, ContainerClass>
|
|
76
|
-
|
|
77
|
-
function containerClassFromSizeClass(sizeClass: keyof typeof SIZE_CLASSES): ContainerClass {
|
|
78
|
-
return CONTAINER_CLASS_OF_SIZE_CLASS[sizeClass]
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
const clamp = (value: number, min: number, max: number): number =>
|
|
82
|
-
Math.min(Math.max(value, min), max)
|
|
83
|
-
|
|
84
|
-
function resolveHeight(input: ChartLayoutInput, containerClass: ContainerClass): number {
|
|
85
|
-
const override = input.override?.height
|
|
86
|
-
const width = input.frameW > 0 ? input.frameW : UNMEASURED_WIDTH[containerClass]
|
|
87
|
-
const derived =
|
|
88
|
-
override ?? clamp(Math.round(width * HEIGHT_RATIO[containerClass]), HEIGHT_MIN, HEIGHT_MAX)
|
|
89
|
-
if (!input.coarse || input.viewportH <= 0) return derived
|
|
90
|
-
// A viewport safety cap: it applies to a consumer's literal `height` too, so a fixed-height chart
|
|
91
|
-
// cannot overflow a short landscape-phone viewport.
|
|
92
|
-
return Math.min(derived, Math.round(input.viewportH * COARSE_VIEWPORT_SHARE))
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* A legend never rolls up fewer than 2 entries: "+1 more" hides nothing a chip would not show.
|
|
97
|
-
* `fitted` may legitimately be 0 — not even the first chip/dot fits once the `All N` chip's own
|
|
98
|
-
* width is reserved beside it — in which case the row is the disclosure alone (`visible: 0`),
|
|
99
|
-
* unless that would roll up the single-entry case the "fewer than 2" rule already protects.
|
|
100
|
-
*/
|
|
101
|
-
function rollUp(total: number, fitted: number): { visible: number; overflow: number } {
|
|
102
|
-
const visible = total - fitted < 2 ? total : fitted
|
|
103
|
-
return { visible, overflow: total - visible }
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
function resolveLegend(
|
|
107
|
-
input: ChartLayoutInput,
|
|
108
|
-
containerClass: ContainerClass,
|
|
109
|
-
): ChartLayout['legend'] {
|
|
110
|
-
const total = input.legendItems.length
|
|
111
|
-
if (containerClass === 'micro' || total === 0) return { mode: 'none' }
|
|
112
|
-
const where = input.slotW > 0 ? 'header' : 'band'
|
|
113
|
-
const width = where === 'header' ? input.slotW : input.frameW
|
|
114
|
-
// Unmeasured (first paint, before P2-8's synchronous slot seed lands): assume everything fits
|
|
115
|
-
// rather than guessing a fold nothing has measured yet.
|
|
116
|
-
if (width <= 0) return { mode: 'chips', where, visible: total, overflow: 0 }
|
|
117
|
-
|
|
118
|
-
const { entries: ordered, dividerAfter } = orderEntries(input.legendItems, input.groups === true)
|
|
119
|
-
const chipFit = entriesWithinRows(ordered, width, LEGEND_ROWS[where])
|
|
120
|
-
const allChipsFit = chipFit >= total
|
|
121
|
-
|
|
122
|
-
// Chips whenever every entry fits one header row; dots is a header-only FALLBACK for when chips
|
|
123
|
-
// do not fit, and only while the card is short or the container itself is compact
|
|
124
|
-
// (`docs/CHARTS-SPEC.md` §5, Legend). A band legend always stays 'chips'.
|
|
125
|
-
const wantsDots =
|
|
126
|
-
where === 'header' && !allChipsFit && (input.cardShort === true || containerClass === 'compact')
|
|
127
|
-
|
|
128
|
-
if (!wantsDots) {
|
|
129
|
-
// Re-measured with the `All N` chip's own width reserved whenever there IS overflow — `chipFit`
|
|
130
|
-
// above is deliberately the un-reserved number (the `allChipsFit` check needs the answer to
|
|
131
|
-
// "does everything fit with no chip at all"), so it is not reused for the final count here.
|
|
132
|
-
const fitted = allChipsFit ? chipFit : entriesWithinChipRows(ordered, width, LEGEND_ROWS[where])
|
|
133
|
-
const { visible, overflow } = rollUp(total, fitted)
|
|
134
|
-
return { mode: 'chips', where, visible, overflow }
|
|
135
|
-
}
|
|
136
|
-
const dotFit = entriesWithinDotRows(ordered, width, LEGEND_ROWS[where], dividerAfter)
|
|
137
|
-
const { visible, overflow } = rollUp(total, dotFit)
|
|
138
|
-
return { mode: 'dots', where, visible, overflow }
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/** Compact and micro plots are tight: y labels move inside and terminal x labels anchor inward. */
|
|
142
|
-
export function isTightClass(containerClass: ContainerClass): boolean {
|
|
143
|
-
return containerClass === 'compact' || containerClass === 'micro'
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* At a tight container class the y labels move inside the plot (micro: no y axis at all), so the
|
|
148
|
-
* left gutter drops to its floor. Not-tight, no left axis, or an explicit `margin.left` all keep
|
|
149
|
-
* the axis outside — the single implementation `CartesianChart`/`useBandPlot` both call.
|
|
150
|
-
*/
|
|
151
|
-
export function resolveYPlacement(
|
|
152
|
-
containerClass: ContainerClass,
|
|
153
|
-
opts: { hasLeftAxis?: boolean | undefined; marginOverrideLeft?: number | undefined } = {},
|
|
154
|
-
): 'outside' | 'inside' | 'none' {
|
|
155
|
-
const { hasLeftAxis = true, marginOverrideLeft } = opts
|
|
156
|
-
if (!isTightClass(containerClass) || !hasLeftAxis || marginOverrideLeft !== undefined)
|
|
157
|
-
return 'outside'
|
|
158
|
-
return containerClass === 'micro' ? 'none' : 'inside'
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
/**
|
|
162
|
-
* Left-margin floor once `resolveYPlacement` moves the labels INSIDE the plot: just enough for the
|
|
163
|
-
* axis line and a hair of breathing room, not the outside axis's full label-width floor. Passing
|
|
164
|
-
* the tier's own `margin.left` here reserves a gutter for a label that no longer paints.
|
|
165
|
-
*/
|
|
166
|
-
export const INSIDE_Y_FLOOR = 4
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* The `autoMargin` FLOOR to measure against, once `resolveYPlacement` has decided where the left
|
|
170
|
-
* axis paints — an axis placed `'outside'` keeps the tier's ordinary margin floor; one placed
|
|
171
|
-
* `'inside'` (or dropped, `'none'`) paints IN the plot, so the outside label-width floor is dead
|
|
172
|
-
* space on that side and only {@link INSIDE_Y_FLOOR} applies. `CartesianChart` and `useBandPlot`
|
|
173
|
-
* used to each spell this same ternary out by hand.
|
|
174
|
-
*/
|
|
175
|
-
export function resolveMarginFloor(
|
|
176
|
-
yPlacement: 'outside' | 'inside' | 'none',
|
|
177
|
-
tierMargin: ChartMargin,
|
|
178
|
-
): ChartMargin {
|
|
179
|
-
return yPlacement === 'outside' ? tierMargin : { ...tierMargin, left: INSIDE_Y_FLOOR }
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
const COMPACT_UNITS = [
|
|
183
|
-
[1e12, 'T'],
|
|
184
|
-
[1e9, 'B'],
|
|
185
|
-
[1e6, 'M'],
|
|
186
|
-
[1e3, 'k'],
|
|
187
|
-
] as const
|
|
188
|
-
|
|
189
|
-
const roundTenth = (value: number): number => Math.round(value * 10) / 10
|
|
190
|
-
|
|
191
|
-
/**
|
|
192
|
-
* Ladder step 1: `12500` -> `12.5k`, `1_200_000` -> `1.2M`; `null` below 1000 or non-finite. Rounds
|
|
193
|
-
* BEFORE choosing the unit's suffix, so `999_950` reads `1M`, never `1000k`; the largest unit caps.
|
|
194
|
-
*/
|
|
195
|
-
export function compactNumber(value: number): string | null {
|
|
196
|
-
const abs = Math.abs(value)
|
|
197
|
-
if (!Number.isFinite(value) || abs < 1000) return null
|
|
198
|
-
let index = COMPACT_UNITS.findIndex(([unit]) => abs >= unit)
|
|
199
|
-
let scaled = roundTenth(abs / COMPACT_UNITS[index]![0])
|
|
200
|
-
if (scaled >= 1000 && index > 0) {
|
|
201
|
-
index -= 1
|
|
202
|
-
scaled = roundTenth(abs / COMPACT_UNITS[index]![0])
|
|
203
|
-
}
|
|
204
|
-
return `${value < 0 ? '-' : ''}${scaled}${COMPACT_UNITS[index]![1]}`
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
/** Ladder step 1's rule: compact only when the longest y label is over 4 chars. */
|
|
208
|
-
export function shouldCompactYLabels(labels: readonly string[]): boolean {
|
|
209
|
-
return labels.some((label) => label.length > COMPACT_LABEL_CHARS)
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
/** Ladder step 2 + the `VX.minPlotHeight` guard: one tick per ~44px, 2 when the plot is under the floor. */
|
|
213
|
-
export function yTickCount(plotHeight: number): number {
|
|
214
|
-
if (plotHeight < VX.minPlotHeight) return 2
|
|
215
|
-
return clamp(Math.round(plotHeight / TICK_SPACING), 2, 6)
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
/** Greedy word wrap by measured px; a single word wider than `maxPx` keeps its own line. */
|
|
219
|
-
export function wrapLabel(label: string, maxPx: number, fontPx: number): string[] {
|
|
220
|
-
const words = label.split(/\s+/).filter((word) => word !== '')
|
|
221
|
-
const lines: string[] = []
|
|
222
|
-
let current = ''
|
|
223
|
-
for (const word of words) {
|
|
224
|
-
const candidate = current === '' ? word : `${current} ${word}`
|
|
225
|
-
if (current !== '' && measureText(candidate, fontPx) > maxPx) {
|
|
226
|
-
lines.push(current)
|
|
227
|
-
current = word
|
|
228
|
-
continue
|
|
229
|
-
}
|
|
230
|
-
current = candidate
|
|
231
|
-
}
|
|
232
|
-
if (current !== '') lines.push(current)
|
|
233
|
-
return lines.length > 0 ? lines : [label]
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
export type XLabelPlan = {
|
|
237
|
-
wrap: boolean
|
|
238
|
-
rotate: 0 | 45
|
|
239
|
-
/** Lines the tallest label takes once wrapped (1 when it does not). */
|
|
240
|
-
lines: number
|
|
241
|
-
/** Px one tick label needs: measured width (wrapped width when wrapping) plus the gap. */
|
|
242
|
-
labelPx: number
|
|
243
|
-
/** Width labels wrap to; `0` when they do not wrap. */
|
|
244
|
-
wrapPx: number
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
/**
|
|
248
|
-
* Ladder step 4: x labels that do not all fit side by side wrap — categorical (band) domains
|
|
249
|
-
* only, and only when wrapping shows EVERY key. A wrap that would still drop keys buys nothing
|
|
250
|
-
* (it costs a line of bottom gutter to thin the same way flat already would), so it falls back to
|
|
251
|
-
* flat/thinned instead. Rotating is the last resort, reached only once even a full wrap can't fit.
|
|
252
|
-
*/
|
|
253
|
-
export function planXLabels(input: {
|
|
254
|
-
labels: readonly string[]
|
|
255
|
-
plotWidth: number
|
|
256
|
-
fontPx: number
|
|
257
|
-
categorical: boolean
|
|
258
|
-
}): XLabelPlan {
|
|
259
|
-
const { labels, plotWidth, fontPx, categorical } = input
|
|
260
|
-
const count = labels.length
|
|
261
|
-
const widest = labels.reduce((max, label) => Math.max(max, measureText(label, fontPx)), 0)
|
|
262
|
-
const flatPx = widest + X_LABEL_GAP
|
|
263
|
-
const fit = plotWidth > 0 && widest > 0 ? Math.floor(plotWidth / flatPx) : count
|
|
264
|
-
const flat = {
|
|
265
|
-
wrap: false,
|
|
266
|
-
rotate: 0,
|
|
267
|
-
lines: 1,
|
|
268
|
-
labelPx: flatPx,
|
|
269
|
-
wrapPx: 0,
|
|
270
|
-
} as const satisfies XLabelPlan
|
|
271
|
-
if (!categorical || count <= fit || plotWidth <= 0) return flat
|
|
272
|
-
|
|
273
|
-
const widestWord = labels.reduce(
|
|
274
|
-
(max, label) => Math.max(max, ...label.split(/\s+/).map((word) => measureText(word, fontPx))),
|
|
275
|
-
0,
|
|
276
|
-
)
|
|
277
|
-
const wrapPx = Math.min(widest, Math.max(widestWord, Math.floor(plotWidth / count) - X_LABEL_GAP))
|
|
278
|
-
const wrapped = labels.map((label) => wrapLabel(label, wrapPx, fontPx))
|
|
279
|
-
const lines = wrapped.reduce((max, parts) => Math.max(max, parts.length), 1)
|
|
280
|
-
if (lines === 1) {
|
|
281
|
-
// Nothing to wrap (single words): rotating is the only remaining answer.
|
|
282
|
-
return count > 2 * Math.max(fit, 1) ? { ...flat, rotate: 45 } : flat
|
|
283
|
-
}
|
|
284
|
-
const wrappedWidest = wrapped.reduce(
|
|
285
|
-
(max, parts) => Math.max(max, ...parts.map((part) => measureText(part, fontPx))),
|
|
286
|
-
0,
|
|
287
|
-
)
|
|
288
|
-
const wrappedFit = Math.max(Math.floor(plotWidth / (wrappedWidest + X_LABEL_GAP)), 1)
|
|
289
|
-
if (wrappedFit >= count) {
|
|
290
|
-
return {
|
|
291
|
-
wrap: true,
|
|
292
|
-
rotate: 0,
|
|
293
|
-
lines,
|
|
294
|
-
labelPx: wrappedWidest + X_LABEL_GAP,
|
|
295
|
-
wrapPx,
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
return count > 2 * wrappedFit ? { ...flat, rotate: 45 } : flat
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
/** The container class: the measured width's, or the viewport-implied one while unmeasured. */
|
|
302
|
-
export function resolveFrameClass(input: {
|
|
303
|
-
frameW: number
|
|
304
|
-
sizeClass: keyof typeof SIZE_CLASSES
|
|
305
|
-
}): ContainerClass {
|
|
306
|
-
return input.frameW > 0
|
|
307
|
-
? resolveContainerClass(input.frameW)
|
|
308
|
-
: containerClassFromSizeClass(input.sizeClass)
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
export function resolveChartLayout(input: ChartLayoutInput): ChartLayout {
|
|
312
|
-
const containerClass = resolveFrameClass(input)
|
|
313
|
-
return {
|
|
314
|
-
containerClass,
|
|
315
|
-
height: resolveHeight(input, containerClass),
|
|
316
|
-
legend: resolveLegend(input, containerClass),
|
|
317
|
-
}
|
|
318
|
-
}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import { createContext, useContext, useSyncExternalStore } from 'react'
|
|
2
|
-
import type { ReactNode } from 'react'
|
|
3
|
-
import type { ContainerClass } from '../../tokens/size-classes'
|
|
4
|
-
import { chartMetrics } from './chart-frame-layout'
|
|
5
|
-
import type { ChartTierMetrics } from './chart-frame-layout'
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Ambient container class. `ChartFrame` publishes the class it resolved (`resolveChartLayout`:
|
|
9
|
-
* its own MEASURED width, or the viewport-implied class before the first measurement); the axes,
|
|
10
|
-
* the legend, the crosshair dots and the tooltip read their metrics back without every kind
|
|
11
|
-
* threading a prop it does not otherwise care about.
|
|
12
|
-
*
|
|
13
|
-
* Default `'regular'` (desktop metrics), so a primitive rendered outside a `ChartFrame` (a
|
|
14
|
-
* hand-composed plot, a `TooltipRow` in a consumer's own tooltip) keeps today's sizes.
|
|
15
|
-
*/
|
|
16
|
-
const ChartContainerClassContext = createContext<ContainerClass>('regular')
|
|
17
|
-
|
|
18
|
-
export type ChartTierProviderProps = {
|
|
19
|
-
containerClass: ContainerClass
|
|
20
|
-
children: ReactNode
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/** Publishes a resolved container class to the subtree. Mounted once, by `ChartFrame`. */
|
|
24
|
-
export function ChartTierProvider({ containerClass, children }: ChartTierProviderProps): ReactNode {
|
|
25
|
-
return (
|
|
26
|
-
<ChartContainerClassContext.Provider value={containerClass}>
|
|
27
|
-
{children}
|
|
28
|
-
</ChartContainerClassContext.Provider>
|
|
29
|
-
)
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/** The ambient container class (`'regular'` outside a `ChartFrame`). Internal. */
|
|
33
|
-
export function useChartContainerClass(): ContainerClass {
|
|
34
|
-
return useContext(ChartContainerClassContext)
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/** The resolved sizes for the ambient container class — what every internal primitive wants. */
|
|
38
|
-
export function useChartMetrics(): ChartTierMetrics {
|
|
39
|
-
return chartMetrics(useChartContainerClass())
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const subscribeNothing = (): (() => void) => () => {}
|
|
43
|
-
|
|
44
|
-
/** Viewport height is quantized so a mobile URL bar collapsing does not re-lay-out every chart. */
|
|
45
|
-
const VIEWPORT_H_STEP = 50
|
|
46
|
-
|
|
47
|
-
// One shared `resize` listener for the whole page (like `common/use-media-query.ts`'s one
|
|
48
|
-
// `MediaQueryList` per query) rather than every mounted `ChartFrame` installing its own — a
|
|
49
|
-
// dashboard with a dozen charts used to mean a dozen native listeners for the same value.
|
|
50
|
-
const viewportHListeners = new Set<() => void>()
|
|
51
|
-
let viewportHListenerAttached = false
|
|
52
|
-
|
|
53
|
-
function ensureViewportHListener(): void {
|
|
54
|
-
if (viewportHListenerAttached || typeof window === 'undefined') return
|
|
55
|
-
viewportHListenerAttached = true
|
|
56
|
-
window.addEventListener('resize', () => {
|
|
57
|
-
for (const listener of viewportHListeners) listener()
|
|
58
|
-
})
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
function subscribeViewportH(onChange: () => void): () => void {
|
|
62
|
-
if (typeof window === 'undefined') return subscribeNothing()
|
|
63
|
-
ensureViewportHListener()
|
|
64
|
-
viewportHListeners.add(onChange)
|
|
65
|
-
return () => viewportHListeners.delete(onChange)
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
function readViewportH(): number {
|
|
69
|
-
if (typeof window === 'undefined') return 0
|
|
70
|
-
return Math.round(window.innerHeight / VIEWPORT_H_STEP) * VIEWPORT_H_STEP
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/** Viewport height in px (`0` on the server). Only the coarse-pointer height clamp reads it. */
|
|
74
|
-
export function useViewportHeight(): number {
|
|
75
|
-
return useSyncExternalStore(subscribeViewportH, readViewportH, () => 0)
|
|
76
|
-
}
|
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
import type { CSSProperties, ReactNode } from 'react'
|
|
2
|
-
import { useCallback, useEffect, useId, useRef, useState } from 'react'
|
|
3
|
-
import { createPortal } from 'react-dom'
|
|
4
|
-
import { alpha, VX } from '../../tokens'
|
|
5
|
-
import { useDismissOnOutside } from '../cursor/touch-pin'
|
|
6
|
-
import { LEGEND_ROW_GAP } from './chart-frame-layout'
|
|
7
|
-
|
|
8
|
-
const DISCLOSURE_PANEL: CSSProperties = {
|
|
9
|
-
position: 'fixed',
|
|
10
|
-
zIndex: VX.zIndexFloating,
|
|
11
|
-
display: 'flex',
|
|
12
|
-
flexDirection: 'column',
|
|
13
|
-
gap: LEGEND_ROW_GAP,
|
|
14
|
-
// theme-allow raw-scroll-container — a fixed floating panel of one legend, not app chrome
|
|
15
|
-
overflowY: 'auto',
|
|
16
|
-
// `<dialog open>` brings UA chrome (centring margin, border, fit-content box) this resets.
|
|
17
|
-
margin: 0,
|
|
18
|
-
border: 'none',
|
|
19
|
-
width: 'auto',
|
|
20
|
-
height: 'auto',
|
|
21
|
-
padding: 10,
|
|
22
|
-
boxSizing: 'border-box',
|
|
23
|
-
backgroundColor: VX.surface.overlay,
|
|
24
|
-
boxShadow: VX.shadowOverlay,
|
|
25
|
-
color: VX.muted,
|
|
26
|
-
borderRadius: VX.radiusCard,
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/** A popover never collapses below one usable row, however little room the chip leaves. */
|
|
30
|
-
const DISCLOSURE_MIN_HEIGHT = 96
|
|
31
|
-
|
|
32
|
-
/** A popover hangs off its chip (flipping above when there is no room below); a sheet is docked. */
|
|
33
|
-
function disclosurePlacement(chip: DOMRect, coarse: boolean): CSSProperties {
|
|
34
|
-
if (coarse) {
|
|
35
|
-
return {
|
|
36
|
-
left: 0,
|
|
37
|
-
right: 0,
|
|
38
|
-
bottom: 0,
|
|
39
|
-
maxHeight: '60dvh',
|
|
40
|
-
borderBottomLeftRadius: 0,
|
|
41
|
-
borderBottomRightRadius: 0,
|
|
42
|
-
padding: '12px 16px calc(12px + env(safe-area-inset-bottom, 0px))',
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
const below = window.innerHeight - chip.bottom
|
|
46
|
-
// theme-allow raw-breakpoint — clamps a fixed panel inside the viewport; a position, not a breakpoint
|
|
47
|
-
const left = Math.max(8, Math.min(chip.left, window.innerWidth - 248))
|
|
48
|
-
const base = { left, right: 'auto', minWidth: 200, maxWidth: 'calc(100vw - 16px)' }
|
|
49
|
-
return below >= 200 || below >= chip.top
|
|
50
|
-
? { ...base, top: chip.bottom + 4, maxHeight: Math.max(below - 12, DISCLOSURE_MIN_HEIGHT) }
|
|
51
|
-
: {
|
|
52
|
-
...base,
|
|
53
|
-
bottom: window.innerHeight - chip.top + 4,
|
|
54
|
-
maxHeight: Math.max(chip.top - 12, DISCLOSURE_MIN_HEIGHT),
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* `ChartLegend`'s `All N` disclosure state: which button opened it (the chip, or a dots-mode entry)
|
|
60
|
-
* and where the fixed panel sits. Focus moves into the panel on open and back to that trigger on
|
|
61
|
-
* EVERY close path; a scroll outside the panel or a resize closes it, since it is fixed to where the
|
|
62
|
-
* trigger WAS.
|
|
63
|
-
*/
|
|
64
|
-
export function useLegendDisclosure(coarse: boolean) {
|
|
65
|
-
const [placement, setPlacement] = useState<CSSProperties | null>(null)
|
|
66
|
-
const triggerRef = useRef<HTMLButtonElement | null>(null)
|
|
67
|
-
const panelRef = useRef<HTMLDialogElement>(null)
|
|
68
|
-
const panelId = useId()
|
|
69
|
-
const wasOpen = useRef(false)
|
|
70
|
-
const open = placement !== null
|
|
71
|
-
const close = useCallback(() => setPlacement(null), [])
|
|
72
|
-
const openFrom = (trigger: HTMLButtonElement) => {
|
|
73
|
-
triggerRef.current = trigger
|
|
74
|
-
setPlacement(disclosurePlacement(trigger.getBoundingClientRect(), coarse))
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
useEffect(() => {
|
|
78
|
-
if (open) panelRef.current?.focus()
|
|
79
|
-
else if (wasOpen.current) triggerRef.current?.focus()
|
|
80
|
-
wasOpen.current = open
|
|
81
|
-
}, [open])
|
|
82
|
-
|
|
83
|
-
// Shared with the chart cursors' own outside-dismiss (`useChartCursor`/`useDiscreteCursor`, see
|
|
84
|
-
// `touch-pin.ts`); the panel's own scroll is not an outside one.
|
|
85
|
-
const isInsidePanel = useCallback(
|
|
86
|
-
(target: Node): boolean =>
|
|
87
|
-
panelRef.current?.contains(target) === true || triggerRef.current?.contains(target) === true,
|
|
88
|
-
[],
|
|
89
|
-
)
|
|
90
|
-
useDismissOnOutside({
|
|
91
|
-
enabled: open,
|
|
92
|
-
isInside: isInsidePanel,
|
|
93
|
-
onDismiss: close,
|
|
94
|
-
dismissOnResize: true,
|
|
95
|
-
scrollExemptInside: true,
|
|
96
|
-
})
|
|
97
|
-
|
|
98
|
-
// The coarse sheet claims `aria-modal` (below), which is a claim that Tab cannot leave it — a
|
|
99
|
-
// native `<dialog open>` (no `showModal()`) does not enforce that on its own (B14). Wrap Tab at
|
|
100
|
-
// the panel's own first/last focusable rather than the fine popover, which is dismissed by an
|
|
101
|
-
// outside click/Escape just as easily and never claimed to be modal in the first place.
|
|
102
|
-
useEffect(() => {
|
|
103
|
-
if (!open || !coarse) return
|
|
104
|
-
const panel = panelRef.current
|
|
105
|
-
if (panel === null) return
|
|
106
|
-
const onKeyDown = (e: KeyboardEvent) => {
|
|
107
|
-
if (e.key !== 'Tab') return
|
|
108
|
-
const focusable = panel.querySelectorAll<HTMLElement>(
|
|
109
|
-
'button, [tabindex]:not([tabindex="-1"])',
|
|
110
|
-
)
|
|
111
|
-
const first = focusable[0]
|
|
112
|
-
const last = focusable[focusable.length - 1]
|
|
113
|
-
if (first === undefined || last === undefined) return
|
|
114
|
-
if (e.shiftKey && document.activeElement === first) {
|
|
115
|
-
e.preventDefault()
|
|
116
|
-
last.focus()
|
|
117
|
-
} else if (!e.shiftKey && document.activeElement === last) {
|
|
118
|
-
e.preventDefault()
|
|
119
|
-
first.focus()
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
panel.addEventListener('keydown', onKeyDown)
|
|
123
|
-
return () => panel.removeEventListener('keydown', onKeyDown)
|
|
124
|
-
}, [open, coarse])
|
|
125
|
-
|
|
126
|
-
return { open, panelId, openFrom, close, panel: { panelRef, panelId, coarse, placement, close } }
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
/** The portalled panel itself — a popover under the chip on a fine pointer, a docked sheet (over a
|
|
130
|
-
* scrim) on a coarse one. Fixed-position, so opening it never grows the legend band. */
|
|
131
|
-
export function LegendDisclosure({
|
|
132
|
-
panelRef,
|
|
133
|
-
panelId,
|
|
134
|
-
coarse,
|
|
135
|
-
placement,
|
|
136
|
-
close,
|
|
137
|
-
fontSize,
|
|
138
|
-
children,
|
|
139
|
-
}: ReturnType<typeof useLegendDisclosure>['panel'] & {
|
|
140
|
-
fontSize: number
|
|
141
|
-
children: ReactNode
|
|
142
|
-
}) {
|
|
143
|
-
if (placement === null) return null
|
|
144
|
-
return createPortal(
|
|
145
|
-
<>
|
|
146
|
-
{coarse && (
|
|
147
|
-
<div
|
|
148
|
-
aria-hidden
|
|
149
|
-
onPointerDown={(e) => {
|
|
150
|
-
e.stopPropagation()
|
|
151
|
-
close()
|
|
152
|
-
}}
|
|
153
|
-
style={{
|
|
154
|
-
position: 'fixed',
|
|
155
|
-
inset: 0,
|
|
156
|
-
// One below the panel it sits behind — still `VX.zIndexFloating`-derived, never a
|
|
157
|
-
// second unrelated literal (B14).
|
|
158
|
-
zIndex: VX.zIndexFloating - 1,
|
|
159
|
-
backgroundColor: alpha(VX.neutral, 0.35),
|
|
160
|
-
}}
|
|
161
|
-
/>
|
|
162
|
-
)}
|
|
163
|
-
<dialog
|
|
164
|
-
ref={panelRef}
|
|
165
|
-
id={panelId}
|
|
166
|
-
open
|
|
167
|
-
tabIndex={-1}
|
|
168
|
-
aria-label="Legend"
|
|
169
|
-
{...(coarse && { 'aria-modal': true })}
|
|
170
|
-
data-basalt-legend-disclosure={coarse ? 'sheet' : 'popover'}
|
|
171
|
-
style={{ ...DISCLOSURE_PANEL, fontSize, ...placement }}
|
|
172
|
-
>
|
|
173
|
-
{children}
|
|
174
|
-
</dialog>
|
|
175
|
-
</>,
|
|
176
|
-
document.body,
|
|
177
|
-
)
|
|
178
|
-
}
|