basalt-ui 1.41.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +46 -43
- package/CHANGELOG.md +542 -518
- package/MIGRATING.md +964 -37
- package/README.md +171 -366
- package/agent/rules/basalt-batteries.md +19 -74
- package/agent/rules/basalt-charts.md +21 -95
- package/agent/rules/basalt-controls.md +23 -131
- package/agent/rules/basalt-mantine.md +26 -99
- package/agent/rules/basalt-state.md +21 -103
- package/agent/rules/basalt-tokens.md +33 -114
- package/agent/skills/basalt-app/SKILL.md +229 -72
- package/agent/skills/basalt-charts/SKILL.md +23 -57
- package/agent/skills/basalt-design/SKILL.md +12 -70
- package/agent/templates/AGENTS-block.md.tpl +16 -26
- package/agent/templates/DESIGN.md.tpl +1 -1
- package/agent/templates/__root.tpl +9 -16
- package/agent/templates/main.tpl +21 -0
- package/agent/templates/nav.tpl +18 -0
- package/configs/oxlint-basalt.json +4 -10
- package/configs/oxlint-plugin.js +465 -844
- package/configs/oxlint-plugin.test.ts +661 -709
- package/configs/oxlint.json +10 -2
- package/dist/agent/ai-sdk-transport.d.ts +19 -7
- package/dist/agent/ai-sdk-transport.d.ts.map +1 -1
- package/dist/agent/ai-sdk-transport.js +10 -7
- package/dist/{agent-chat → agent/chat}/composer.d.ts +16 -16
- package/dist/agent/chat/composer.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/composer.js +10 -9
- package/dist/{agent-chat → agent/chat}/message-affordances.d.ts +7 -6
- package/dist/agent/chat/message-affordances.d.ts.map +1 -0
- package/dist/agent/chat/relative-time.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-feed-row.d.ts +18 -16
- package/dist/agent/chat/thread-feed-row.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-feed-row.js +12 -11
- package/dist/{agent-chat → agent/chat}/thread-feed.d.ts +8 -8
- package/dist/agent/chat/thread-feed.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-feed.js +12 -10
- package/dist/{agent-chat → agent/chat}/thread-message.d.ts +12 -9
- package/dist/agent/chat/thread-message.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-message.js +15 -13
- package/dist/{agent-chat → agent/chat}/thread-outcome-card.d.ts +2 -2
- package/dist/agent/chat/thread-outcome-card.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-outcome-card.js +3 -3
- package/dist/{agent-chat → agent/chat}/tool-chip.d.ts +5 -5
- package/dist/agent/chat/tool-chip.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/tool-chip.js +4 -4
- package/dist/agent/chat/use-keyboard-inset.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/use-keyboard-inset.js +1 -1
- package/dist/{agent-chat → agent/chat}/virtualize.d.ts +7 -7
- package/dist/agent/chat/virtualize.d.ts.map +1 -0
- package/dist/agent/error.d.ts +31 -0
- package/dist/agent/error.d.ts.map +1 -0
- package/dist/agent/error.js +18 -0
- package/dist/agent/history.d.ts +2 -36
- package/dist/agent/history.d.ts.map +1 -1
- package/dist/agent/history.js +0 -32
- package/dist/agent/id.d.ts +4 -5
- package/dist/agent/id.d.ts.map +1 -1
- package/dist/agent/index.d.ts +19 -52
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +10 -32
- package/dist/agent/outcome.d.ts +3 -14
- package/dist/agent/outcome.d.ts.map +1 -1
- package/dist/agent/outcome.js +0 -30
- package/dist/agent/part-list.d.ts +3 -3
- package/dist/agent/part-list.d.ts.map +1 -1
- package/dist/agent/parts.d.ts +23 -24
- package/dist/agent/parts.d.ts.map +1 -1
- package/dist/agent/run-committer.d.ts +23 -0
- package/dist/agent/run-committer.d.ts.map +1 -0
- package/dist/agent/run-committer.js +41 -0
- package/dist/agent/run-records.d.ts +77 -0
- package/dist/agent/run-records.d.ts.map +1 -0
- package/dist/agent/run-records.js +69 -0
- package/dist/agent/thread.d.ts +23 -47
- package/dist/agent/thread.d.ts.map +1 -1
- package/dist/agent/thread.js +3 -134
- package/dist/agent/transport.d.ts +6 -69
- package/dist/agent/transport.d.ts.map +1 -1
- package/dist/agent/transport.js +0 -18
- package/dist/agent/use-agent-thread-runs.d.ts +63 -26
- package/dist/agent/use-agent-thread-runs.d.ts.map +1 -1
- package/dist/agent/use-agent-thread-runs.js +202 -66
- package/dist/charts/BandStrip.d.ts +46 -0
- package/dist/charts/BandStrip.d.ts.map +1 -0
- package/dist/charts/BandStrip.js +151 -0
- package/dist/charts/Bars.d.ts +19 -0
- package/dist/charts/Bars.d.ts.map +1 -0
- package/dist/charts/Bars.js +77 -0
- package/dist/charts/CartesianChart.d.ts +57 -0
- package/dist/charts/CartesianChart.d.ts.map +1 -0
- package/dist/charts/CartesianChart.js +121 -0
- package/dist/charts/ChartCard.d.ts +34 -0
- package/dist/charts/ChartCard.d.ts.map +1 -0
- package/dist/charts/ChartCard.js +115 -0
- package/dist/charts/Donut.d.ts +25 -0
- package/dist/charts/Donut.d.ts.map +1 -0
- package/dist/charts/Donut.js +191 -0
- package/dist/charts/DualPanel.d.ts +47 -0
- package/dist/charts/DualPanel.d.ts.map +1 -0
- package/dist/charts/DualPanel.js +214 -0
- package/dist/charts/Heatmap.d.ts +41 -0
- package/dist/charts/Heatmap.d.ts.map +1 -0
- package/dist/charts/Heatmap.js +216 -0
- package/dist/charts/Lines.d.ts +11 -0
- package/dist/charts/Lines.d.ts.map +1 -0
- package/dist/charts/Lines.js +114 -0
- package/dist/charts/MirroredBars.d.ts +44 -0
- package/dist/charts/MirroredBars.d.ts.map +1 -0
- package/dist/charts/MirroredBars.js +190 -0
- package/dist/charts/Sparkline.d.ts +22 -0
- package/dist/charts/Sparkline.d.ts.map +1 -0
- package/dist/charts/Sparkline.js +129 -0
- package/dist/charts/StackedArea.d.ts +15 -0
- package/dist/charts/StackedArea.d.ts.map +1 -0
- package/dist/charts/StackedArea.js +46 -0
- package/dist/charts/box.d.ts +38 -0
- package/dist/charts/box.d.ts.map +1 -0
- package/dist/charts/box.js +72 -0
- package/dist/charts/card-context.d.ts +3 -0
- package/dist/charts/card-context.d.ts.map +1 -0
- package/dist/charts/card-context.js +7 -0
- package/dist/charts/chart-box.module.css +64 -0
- package/{src/content/article-card.module.css.d.ts → dist/charts/chart-box.module.css.d.ts} +5 -9
- package/dist/charts/chart-card.module.css +25 -0
- package/dist/{dashboard/widget-grid.module.css.d.ts → charts/chart-card.module.css.d.ts} +1 -3
- package/dist/charts/chart-legend.module.css +38 -0
- package/{src/dashboard/widget-grid.module.css.d.ts → dist/charts/chart-legend.module.css.d.ts} +3 -3
- package/dist/charts/compile.d.ts +62 -0
- package/dist/charts/compile.d.ts.map +1 -0
- package/dist/charts/compile.js +386 -0
- package/dist/charts/cursor.d.ts +50 -0
- package/dist/charts/cursor.d.ts.map +1 -0
- package/dist/charts/cursor.js +157 -0
- package/dist/charts/curves.d.ts +12 -0
- package/dist/charts/curves.d.ts.map +1 -0
- package/dist/charts/curves.js +86 -0
- package/dist/charts/donut.module.css +54 -0
- package/dist/{content/article-card.module.css.d.ts → charts/donut.module.css.d.ts} +2 -9
- package/dist/charts/host.d.ts +17 -0
- package/dist/charts/host.d.ts.map +1 -0
- package/dist/charts/host.js +35 -0
- package/dist/charts/index.d.ts +18 -53
- package/dist/charts/index.d.ts.map +1 -1
- package/dist/charts/index.js +17 -189
- package/dist/charts/legend.d.ts +23 -0
- package/dist/charts/legend.d.ts.map +1 -0
- package/dist/charts/legend.js +160 -0
- package/dist/charts/marks.d.ts +25 -0
- package/dist/charts/marks.d.ts.map +1 -0
- package/dist/charts/marks.js +128 -0
- package/dist/charts/panel.d.ts +56 -0
- package/dist/charts/panel.d.ts.map +1 -0
- package/dist/charts/panel.js +123 -0
- package/dist/charts/scales.d.ts +44 -0
- package/dist/charts/scales.d.ts.map +1 -0
- package/dist/charts/scales.js +163 -0
- package/dist/charts/sizing.d.ts +12 -0
- package/dist/charts/sizing.d.ts.map +1 -0
- package/dist/charts/sizing.js +33 -0
- package/dist/charts/state.d.ts +17 -0
- package/dist/charts/state.d.ts.map +1 -0
- package/dist/charts/state.js +53 -0
- package/dist/charts/theme.d.ts +38 -19
- package/dist/charts/theme.d.ts.map +1 -1
- package/dist/charts/theme.js +48 -26
- package/dist/charts/types.d.ts +227 -0
- package/dist/charts/types.d.ts.map +1 -0
- package/dist/charts/types.js +4 -0
- package/dist/cli/audit-allows.d.ts +4 -17
- package/dist/cli/audit-allows.d.ts.map +1 -1
- package/dist/cli/config.d.ts +18 -43
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +6 -0
- package/dist/cli/doctor-upgrade.d.ts +43 -0
- package/dist/cli/doctor-upgrade.d.ts.map +1 -0
- package/dist/cli/doctor-upgrade.js +314 -0
- package/dist/cli/doctor.d.ts +14 -29
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +58 -9
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +2 -4
- package/dist/cli/index.d.ts +48 -172
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +39 -132
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +43 -37
- package/dist/cli/sync.d.ts +5 -21
- package/dist/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js +4 -23
- package/dist/cli/tokens-css.d.ts +7 -28
- package/dist/cli/tokens-css.d.ts.map +1 -1
- package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
- package/dist/commands/ShortcutsHelp.js +4 -5
- package/dist/commands/define-commands.d.ts +15 -31
- package/dist/commands/define-commands.d.ts.map +1 -1
- package/dist/commands/define-commands.js +1 -11
- package/dist/commands/define-overlays.d.ts +5 -19
- package/dist/commands/define-overlays.d.ts.map +1 -1
- package/dist/commands/define-overlays.js +3 -11
- package/dist/commands/index.d.ts +10 -40
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +9 -46
- package/dist/{notifications → commands/notifications}/bell.d.ts +1 -1
- package/dist/commands/notifications/bell.d.ts.map +1 -0
- package/dist/{notifications → commands/notifications}/center.d.ts +2 -2
- package/dist/commands/notifications/center.d.ts.map +1 -0
- package/dist/{notifications → commands/notifications}/center.js +2 -2
- package/dist/{notifications → commands/notifications}/define-notifications.d.ts +3 -3
- package/dist/commands/notifications/define-notifications.d.ts.map +1 -0
- package/dist/commands/notifications/notify.d.ts +44 -0
- package/dist/commands/notifications/notify.d.ts.map +1 -0
- package/dist/commands/notifications/notify.js +79 -0
- package/dist/{notifications → commands/notifications}/store.d.ts +2 -0
- package/dist/commands/notifications/store.d.ts.map +1 -0
- package/dist/{notifications → commands/notifications}/store.js +4 -0
- package/dist/commands/projectors.d.ts +1 -131
- package/dist/commands/projectors.d.ts.map +1 -1
- package/dist/commands/projectors.js +2 -73
- package/dist/commands/shell-bridge.d.ts +3 -3
- package/dist/commands/shortcut-format.d.ts +5 -4
- package/dist/commands/shortcut-format.d.ts.map +1 -1
- package/dist/common/errors.d.ts +3 -3
- package/dist/common/use-measured-widths.d.ts.map +1 -1
- package/dist/common/use-measured-widths.js +5 -3
- package/dist/common/validate.d.ts +2 -2
- package/dist/content/article-layout.d.ts.map +1 -1
- package/dist/content/article-layout.js +3 -3
- package/dist/content/article-model.d.ts +1 -46
- package/dist/content/article-model.d.ts.map +1 -1
- package/dist/content/article-model.js +1 -29
- package/dist/content/index.d.ts +11 -41
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +3 -35
- package/dist/content/markdown.d.ts +1 -1
- package/dist/content/markdown.d.ts.map +1 -1
- package/dist/content/markdown.js +1 -1
- package/dist/content/mermaid.d.ts.map +1 -1
- package/dist/content/mermaid.js +7 -7
- package/dist/content/slug.d.ts +1 -8
- package/dist/content/slug.d.ts.map +1 -1
- package/dist/content/slug.js +1 -8
- package/dist/content/url-hardening.d.ts +2 -2
- package/dist/content/url-hardening.d.ts.map +1 -1
- package/dist/content/url-hardening.js +2 -0
- package/dist/controls/actions.d.ts +16 -1
- package/dist/controls/actions.d.ts.map +1 -1
- package/dist/controls/enum-filter.d.ts +1 -1
- package/dist/controls/enum-filter.d.ts.map +1 -1
- package/dist/controls/filter-context.d.ts.map +1 -1
- package/dist/controls/filter-context.js +3 -1
- package/dist/controls/filter-set.js +4 -6
- package/dist/controls/form-layout.d.ts +1 -1
- package/dist/controls/form-layout.d.ts.map +1 -1
- package/dist/controls/form-layout.js +1 -1
- package/dist/controls/glyphs.d.ts +0 -2
- package/dist/controls/glyphs.d.ts.map +1 -1
- package/dist/controls/glyphs.js +0 -7
- package/dist/controls/index.d.ts +12 -17
- package/dist/controls/index.d.ts.map +1 -1
- package/dist/controls/index.js +5 -39
- package/dist/controls/multi-select-filter.d.ts +4 -3
- package/dist/controls/multi-select-filter.d.ts.map +1 -1
- package/dist/controls/number-filter.d.ts +4 -3
- package/dist/controls/number-filter.d.ts.map +1 -1
- package/dist/controls/number-filter.js +3 -1
- package/dist/controls/range-filter.d.ts +4 -3
- package/dist/controls/range-filter.d.ts.map +1 -1
- package/dist/controls/search-filter.d.ts +4 -3
- package/dist/controls/search-filter.d.ts.map +1 -1
- package/dist/controls/search-filter.js +19 -14
- package/dist/controls/select-filter.d.ts +4 -3
- package/dist/controls/select-filter.d.ts.map +1 -1
- package/dist/controls/sync-button.d.ts.map +1 -1
- package/dist/controls/sync-button.js +12 -15
- package/dist/controls/toggle-filter.d.ts +4 -3
- package/dist/controls/toggle-filter.d.ts.map +1 -1
- package/dist/controls/uncontrolled.d.ts +12 -0
- package/dist/controls/uncontrolled.d.ts.map +1 -0
- package/dist/controls/view-tabs.d.ts +2 -2
- package/dist/controls/view-tabs.d.ts.map +1 -1
- package/dist/controls-dates/index.d.ts +0 -1
- package/dist/controls-dates/index.d.ts.map +1 -1
- package/dist/dashboard/index.d.ts +7 -9
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/index.js +3 -23
- package/dist/dashboard/section.d.ts +4 -6
- package/dist/dashboard/section.d.ts.map +1 -1
- package/dist/dashboard/section.js +4 -10
- package/dist/dashboard/stat-card.d.ts +4 -4
- package/dist/dashboard/stat-card.d.ts.map +1 -1
- package/dist/dashboard/stat-card.js +3 -3
- package/dist/dashboard/widget-header.module.css +9 -7
- package/dist/dev-dock.d.ts.map +1 -1
- package/dist/dev-dock.js +6 -1
- package/dist/format/date.d.ts +0 -34
- package/dist/format/date.d.ts.map +1 -1
- package/dist/format/date.js +0 -54
- package/dist/format/index.d.ts +7 -22
- package/dist/format/index.d.ts.map +1 -1
- package/dist/format/index.js +2 -43
- package/dist/format/number.d.ts +3 -14
- package/dist/format/number.d.ts.map +1 -1
- package/dist/format/number.js +0 -13
- package/dist/format/shared.d.ts +2 -3
- package/dist/format/shared.d.ts.map +1 -1
- package/dist/forms/index.d.ts +0 -11
- package/dist/forms/index.d.ts.map +1 -1
- package/dist/forms/index.js +1 -14
- package/dist/guard/index.d.ts +6 -21
- package/dist/guard/index.d.ts.map +1 -1
- package/dist/guard/index.js +27 -115
- package/dist/guard/types.d.ts +7 -18
- package/dist/guard/types.d.ts.map +1 -1
- package/dist/index.d.ts +16 -48
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -117
- package/dist/provider/create-router.d.ts +44 -0
- package/dist/provider/create-router.d.ts.map +1 -0
- package/dist/provider/create-router.js +62 -0
- package/dist/provider/hotkeys.d.ts +8 -0
- package/dist/provider/hotkeys.d.ts.map +1 -0
- package/dist/provider/hotkeys.js +50 -0
- package/dist/provider/index.d.ts +33 -110
- package/dist/provider/index.d.ts.map +1 -1
- package/dist/provider/index.js +182 -82
- package/dist/provider/lab-theme.d.ts.map +1 -1
- package/dist/provider/route-transition.d.ts +76 -0
- package/dist/provider/route-transition.d.ts.map +1 -0
- package/dist/provider/route-transition.js +98 -0
- package/dist/provider/spotlight-actions.d.ts +10 -0
- package/dist/provider/spotlight-actions.d.ts.map +1 -0
- package/dist/provider/spotlight-actions.js +55 -0
- package/dist/provider/test-router.d.ts +6 -0
- package/dist/provider/test-router.d.ts.map +1 -0
- package/dist/provider/test-router.js +18 -0
- package/dist/query-client.d.ts +4 -20
- package/dist/query-client.d.ts.map +1 -1
- package/dist/query-client.js +2 -2
- package/dist/router-tanstack/index.d.ts +18 -64
- package/dist/router-tanstack/index.d.ts.map +1 -1
- package/dist/router-tanstack/index.js +2 -16
- package/dist/router-tanstack/nav.d.ts +12 -1
- package/dist/router-tanstack/nav.d.ts.map +1 -1
- package/dist/router-tanstack/nav.js +8 -1
- package/dist/router-tanstack/search-store.d.ts +1 -1
- package/dist/router-tanstack/search-store.d.ts.map +1 -1
- package/dist/router-tanstack/use-nav.d.ts +8 -9
- package/dist/router-tanstack/use-nav.d.ts.map +1 -1
- package/dist/router-tanstack/use-nav.js +20 -1
- package/dist/shell/app-mobile-nav.d.ts.map +1 -1
- package/dist/shell/app-sidebar.js +1 -1
- package/dist/shell/index.d.ts +31 -10
- package/dist/shell/index.d.ts.map +1 -1
- package/dist/shell/index.js +14 -3
- package/dist/shell/page-aside.d.ts +2 -2
- package/dist/shell/page-aside.d.ts.map +1 -1
- package/dist/shell/page-aside.js +31 -12
- package/dist/shell/page-bar.d.ts +2 -2
- package/dist/shell/page-bar.d.ts.map +1 -1
- package/dist/shell/page-bar.js +1 -1
- package/dist/state.d.ts +10 -12
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +4 -6
- package/dist/styles.css +107 -7
- package/dist/surfaces.d.ts +28 -103
- package/dist/surfaces.d.ts.map +1 -1
- package/dist/surfaces.js +54 -143
- package/dist/{data → table}/data-table-state.d.ts +1 -1
- package/dist/table/data-table-state.d.ts.map +1 -0
- package/dist/{data → table}/data-table-state.js +4 -3
- package/dist/{data → table}/data-table.d.ts +28 -49
- package/dist/table/data-table.d.ts.map +1 -0
- package/dist/{data → table}/data-table.js +74 -60
- package/dist/table/index.d.ts +18 -0
- package/dist/table/index.d.ts.map +1 -0
- package/dist/{data/table.js → table/index.js} +1 -1
- package/dist/table/query-branch.d.ts.map +1 -0
- package/dist/table/table-features.d.ts +69 -0
- package/dist/table/table-features.d.ts.map +1 -0
- package/dist/table/table-features.js +49 -0
- package/dist/telemetry.d.ts +77 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +33 -0
- package/dist/theme/index.d.ts +10 -21
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +3 -14
- package/dist/theme/theme-toggle.d.ts.map +1 -1
- package/dist/theme/theme-toggle.js +7 -33
- package/dist/theme/theme-toggle.module.css +30 -0
- package/dist/theme/theme-toggle.module.css.d.ts +10 -0
- package/dist/theme-lab/derive-controls.d.ts.map +1 -1
- package/dist/theme-lab/derive-controls.js +5 -3
- package/dist/theme-lab/derive-state.d.ts.map +1 -1
- package/dist/theme-lab/derive-state.js +2 -1
- package/dist/tokens/core.d.ts +360 -0
- package/dist/tokens/core.d.ts.map +1 -0
- package/dist/tokens/core.js +708 -0
- package/dist/tokens/derive.d.ts +1 -1
- package/dist/tokens/derive.d.ts.map +1 -1
- package/dist/tokens/index.d.ts +5 -373
- package/dist/tokens/index.d.ts.map +1 -1
- package/dist/tokens/index.js +8 -700
- package/dist/tokens/palette.d.ts +2 -6
- package/dist/tokens/palette.d.ts.map +1 -1
- package/dist/tokens/palette.js +1 -4
- package/dist/vite.d.ts +4 -3
- package/dist/vite.d.ts.map +1 -1
- package/llms.txt +43 -85
- package/package.json +80 -173
- package/src/agent/ai-sdk-transport.ts +57 -37
- package/src/{agent-chat → agent/chat}/composer.tsx +29 -30
- package/src/{agent-chat → agent/chat}/message-affordances.ts +8 -5
- package/src/{agent-chat → agent/chat}/thread-feed-row.tsx +30 -35
- package/src/{agent-chat → agent/chat}/thread-feed.tsx +40 -35
- package/src/{agent-chat → agent/chat}/thread-message.tsx +37 -35
- package/src/{agent-chat → agent/chat}/thread-outcome-card.tsx +5 -5
- package/src/{agent-chat → agent/chat}/tool-chip.tsx +12 -12
- package/src/{agent-chat → agent/chat}/use-keyboard-inset.ts +1 -1
- package/src/{agent-chat → agent/chat}/virtualize.ts +5 -5
- package/src/agent/error.ts +43 -0
- package/src/agent/history.ts +2 -107
- package/src/agent/id.ts +4 -5
- package/src/agent/index.ts +23 -112
- package/src/agent/outcome.ts +3 -56
- package/src/agent/part-list.tsx +3 -3
- package/src/agent/parts.ts +23 -22
- package/src/agent/run-committer.ts +64 -0
- package/src/agent/run-records.ts +147 -0
- package/src/agent/thread.ts +24 -231
- package/src/agent/transport.ts +6 -96
- package/src/agent/use-agent-thread-runs.ts +364 -199
- package/src/charts/BandStrip.tsx +276 -0
- package/src/charts/Bars.tsx +141 -0
- package/src/charts/CartesianChart.tsx +206 -0
- package/src/charts/ChartCard.tsx +178 -0
- package/src/charts/Donut.tsx +256 -0
- package/src/charts/DualPanel.tsx +326 -0
- package/src/charts/Heatmap.tsx +282 -0
- package/src/charts/Lines.tsx +151 -0
- package/src/charts/MirroredBars.tsx +303 -0
- package/src/charts/Sparkline.tsx +176 -0
- package/src/charts/StackedArea.tsx +80 -0
- package/src/charts/box.tsx +96 -0
- package/src/charts/card-context.ts +11 -0
- package/src/charts/chart-box.module.css +64 -0
- package/src/charts/chart-box.module.css.d.ts +12 -0
- package/src/charts/chart-card.module.css +25 -0
- package/src/charts/chart-card.module.css.d.ts +8 -0
- package/src/charts/chart-legend.module.css +38 -0
- package/src/charts/chart-legend.module.css.d.ts +10 -0
- package/src/charts/compile.ts +585 -0
- package/src/charts/cursor.ts +282 -0
- package/src/charts/curves.ts +111 -0
- package/src/charts/donut.module.css +54 -0
- package/src/charts/donut.module.css.d.ts +9 -0
- package/src/charts/host.tsx +60 -0
- package/src/charts/index.ts +41 -178
- package/src/charts/legend.tsx +204 -0
- package/src/charts/marks.ts +201 -0
- package/src/charts/panel.tsx +227 -0
- package/src/charts/scales.ts +237 -0
- package/src/charts/sizing.ts +47 -0
- package/src/charts/state.tsx +80 -0
- package/src/charts/theme.ts +65 -0
- package/src/charts/types.ts +242 -0
- package/src/cli/audit-allows.ts +8 -30
- package/src/cli/config.ts +26 -43
- package/src/cli/doctor-upgrade.ts +457 -0
- package/src/cli/doctor.ts +89 -72
- package/src/cli/help.ts +2 -4
- package/src/cli/index.ts +100 -384
- package/src/cli/init.ts +60 -51
- package/src/cli/sync.ts +13 -68
- package/src/cli/tokens-css.ts +7 -28
- package/src/commands/ShortcutsHelp.tsx +8 -9
- package/src/commands/define-commands.ts +16 -43
- package/src/commands/define-overlays.ts +12 -36
- package/src/commands/index.ts +11 -94
- package/src/{notifications → commands/notifications}/bell.tsx +2 -2
- package/src/{notifications → commands/notifications}/center.tsx +7 -5
- package/src/{notifications → commands/notifications}/define-notifications.ts +3 -3
- package/src/commands/notifications/notify.tsx +158 -0
- package/src/{notifications → commands/notifications}/store.ts +10 -2
- package/src/commands/projectors.ts +5 -225
- package/src/commands/shell-bridge.ts +5 -5
- package/src/commands/shortcut-format.ts +5 -4
- package/src/common/errors.ts +3 -3
- package/src/common/use-measured-widths.ts +6 -3
- package/src/common/validate.ts +2 -2
- package/src/content/article-layout.tsx +37 -38
- package/src/content/article-model.ts +1 -84
- package/src/content/index.ts +12 -83
- package/src/content/markdown.tsx +4 -3
- package/src/content/mermaid.tsx +9 -7
- package/src/content/slug.ts +1 -16
- package/src/content/url-hardening.ts +8 -2
- package/src/controls/actions.tsx +24 -1
- package/src/controls/enum-filter.tsx +1 -1
- package/src/controls/filter-context.tsx +3 -1
- package/src/controls/filter-set.tsx +5 -7
- package/src/controls/form-layout.tsx +2 -2
- package/src/controls/glyphs.tsx +0 -10
- package/src/controls/index.ts +13 -64
- package/src/controls/multi-select-filter.tsx +5 -4
- package/src/controls/number-filter.tsx +8 -4
- package/src/controls/range-filter.tsx +5 -4
- package/src/controls/search-filter.tsx +25 -19
- package/src/controls/select-filter.tsx +5 -4
- package/src/controls/sync-button.tsx +18 -20
- package/src/controls/toggle-filter.tsx +5 -4
- package/src/controls/uncontrolled.ts +12 -0
- package/src/controls/view-tabs.tsx +3 -3
- package/src/controls-dates/date-range-picker.tsx +1 -1
- package/src/controls-dates/index.ts +0 -1
- package/src/dashboard/index.ts +7 -48
- package/src/dashboard/section.tsx +11 -40
- package/src/dashboard/stat-card.tsx +14 -16
- package/src/dashboard/widget-header.module.css +9 -7
- package/src/dev-dock.tsx +14 -27
- package/src/format/date.ts +2 -92
- package/src/format/index.ts +7 -53
- package/src/format/number.ts +3 -26
- package/src/format/shared.ts +2 -3
- package/src/forms/index.ts +0 -23
- package/src/guard/index.ts +36 -191
- package/src/guard/types.ts +6 -19
- package/src/index.ts +30 -282
- package/src/provider/create-router.tsx +138 -0
- package/src/provider/hotkeys.ts +70 -0
- package/src/provider/index.tsx +260 -230
- package/src/provider/lab-theme.ts +3 -2
- package/src/provider/route-transition.ts +199 -0
- package/src/provider/spotlight-actions.tsx +69 -0
- package/src/provider/test-router.tsx +25 -0
- package/src/query-client.ts +4 -22
- package/src/router-tanstack/index.ts +18 -112
- package/src/router-tanstack/nav.ts +28 -2
- package/src/router-tanstack/search-store.ts +9 -2
- package/src/router-tanstack/use-nav.ts +47 -13
- package/src/shell/app-mobile-nav.tsx +3 -2
- package/src/shell/app-sidebar.tsx +1 -1
- package/src/shell/aside-docking.ts +1 -1
- package/src/shell/index.tsx +61 -20
- package/src/shell/page-aside.tsx +47 -23
- package/src/shell/page-bar.tsx +3 -3
- package/src/shell/page-title.tsx +1 -1
- package/src/state.ts +11 -37
- package/src/styles.css +107 -7
- package/src/surfaces.ts +56 -151
- package/src/{data → table}/data-table-state.ts +5 -4
- package/src/{data → table}/data-table.tsx +170 -161
- package/src/table/index.ts +18 -0
- package/src/table/table-features.ts +102 -0
- package/src/telemetry.ts +110 -0
- package/src/theme/index.ts +22 -47
- package/src/theme/theme-toggle.module.css +30 -0
- package/src/theme/theme-toggle.module.css.d.ts +10 -0
- package/src/theme/theme-toggle.tsx +15 -43
- package/src/theme-lab/derive-controls.tsx +5 -3
- package/src/theme-lab/derive-state.ts +2 -1
- package/src/tokens/core.ts +1163 -0
- package/src/tokens/derive.ts +1 -1
- package/src/tokens/index.ts +14 -1181
- package/src/tokens/palette.ts +3 -7
- package/src/vite.ts +3 -3
- package/agent/templates/query-client.ts.tpl +0 -26
- package/dist/agent/adapter.d.ts +0 -150
- package/dist/agent/adapter.d.ts.map +0 -1
- package/dist/agent/adapter.js +0 -482
- package/dist/agent/use-agent-stream.d.ts +0 -35
- package/dist/agent/use-agent-stream.d.ts.map +0 -1
- package/dist/agent/use-agent-stream.js +0 -59
- package/dist/agent-chat/composer.d.ts.map +0 -1
- package/dist/agent-chat/index.d.ts +0 -31
- package/dist/agent-chat/index.d.ts.map +0 -1
- package/dist/agent-chat/index.js +0 -19
- package/dist/agent-chat/message-affordances.d.ts.map +0 -1
- package/dist/agent-chat/relative-time.d.ts.map +0 -1
- package/dist/agent-chat/thread-detail-panel.d.ts +0 -28
- package/dist/agent-chat/thread-detail-panel.d.ts.map +0 -1
- package/dist/agent-chat/thread-detail-panel.js +0 -115
- package/dist/agent-chat/thread-feed-row.d.ts.map +0 -1
- package/dist/agent-chat/thread-feed.d.ts.map +0 -1
- package/dist/agent-chat/thread-message.d.ts.map +0 -1
- package/dist/agent-chat/thread-outcome-card.d.ts.map +0 -1
- package/dist/agent-chat/thread-workspace.d.ts +0 -44
- package/dist/agent-chat/thread-workspace.d.ts.map +0 -1
- package/dist/agent-chat/thread-workspace.js +0 -153
- package/dist/agent-chat/tool-chip.d.ts.map +0 -1
- package/dist/agent-chat/use-keyboard-inset.d.ts.map +0 -1
- package/dist/agent-chat/virtualize.d.ts.map +0 -1
- package/dist/charts/cursor/resolve.d.ts +0 -75
- package/dist/charts/cursor/resolve.d.ts.map +0 -1
- package/dist/charts/cursor/resolve.js +0 -91
- package/dist/charts/cursor/scope.d.ts +0 -20
- package/dist/charts/cursor/scope.d.ts.map +0 -1
- package/dist/charts/cursor/scope.js +0 -20
- package/dist/charts/cursor/store.d.ts +0 -35
- package/dist/charts/cursor/store.d.ts.map +0 -1
- package/dist/charts/cursor/store.js +0 -25
- package/dist/charts/cursor/touch-pin.d.ts +0 -45
- package/dist/charts/cursor/touch-pin.d.ts.map +0 -1
- package/dist/charts/cursor/touch-pin.js +0 -79
- package/dist/charts/hooks/use-discrete-cursor.d.ts +0 -66
- package/dist/charts/hooks/use-discrete-cursor.d.ts.map +0 -1
- package/dist/charts/hooks/use-discrete-cursor.js +0 -198
- package/dist/charts/hooks/use-hysteresis.d.ts +0 -18
- package/dist/charts/hooks/use-hysteresis.d.ts.map +0 -1
- package/dist/charts/hooks/use-hysteresis.js +0 -12
- package/dist/charts/hooks/useBandPlot.d.ts +0 -145
- package/dist/charts/hooks/useBandPlot.d.ts.map +0 -1
- package/dist/charts/hooks/useBandPlot.js +0 -178
- package/dist/charts/hooks/useChartCursor.d.ts +0 -75
- package/dist/charts/hooks/useChartCursor.d.ts.map +0 -1
- package/dist/charts/hooks/useChartCursor.js +0 -200
- package/dist/charts/hooks/useChartSize.d.ts +0 -29
- package/dist/charts/hooks/useChartSize.d.ts.map +0 -1
- package/dist/charts/hooks/useChartSize.js +0 -8
- package/dist/charts/kinds/BandStrip.d.ts +0 -132
- package/dist/charts/kinds/BandStrip.d.ts.map +0 -1
- package/dist/charts/kinds/BandStrip.js +0 -241
- package/dist/charts/kinds/Bars.d.ts +0 -141
- package/dist/charts/kinds/Bars.d.ts.map +0 -1
- package/dist/charts/kinds/Bars.js +0 -343
- package/dist/charts/kinds/Donut.d.ts +0 -77
- package/dist/charts/kinds/Donut.d.ts.map +0 -1
- package/dist/charts/kinds/Donut.js +0 -245
- package/dist/charts/kinds/DualPanel.d.ts +0 -111
- package/dist/charts/kinds/DualPanel.d.ts.map +0 -1
- package/dist/charts/kinds/DualPanel.js +0 -471
- package/dist/charts/kinds/Heatmap.d.ts +0 -85
- package/dist/charts/kinds/Heatmap.d.ts.map +0 -1
- package/dist/charts/kinds/Heatmap.js +0 -243
- package/dist/charts/kinds/MirroredBars.d.ts +0 -98
- package/dist/charts/kinds/MirroredBars.d.ts.map +0 -1
- package/dist/charts/kinds/MirroredBars.js +0 -292
- package/dist/charts/kinds/MultiLine.d.ts +0 -87
- package/dist/charts/kinds/MultiLine.d.ts.map +0 -1
- package/dist/charts/kinds/MultiLine.js +0 -176
- package/dist/charts/kinds/StackedArea.d.ts +0 -73
- package/dist/charts/kinds/StackedArea.d.ts.map +0 -1
- package/dist/charts/kinds/StackedArea.js +0 -135
- package/dist/charts/kinds/ZonedLine.d.ts +0 -97
- package/dist/charts/kinds/ZonedLine.d.ts.map +0 -1
- package/dist/charts/kinds/ZonedLine.js +0 -155
- package/dist/charts/kinds/band-chrome.d.ts +0 -31
- package/dist/charts/kinds/band-chrome.d.ts.map +0 -1
- package/dist/charts/kinds/band-chrome.js +0 -71
- package/dist/charts/kinds/donut-layout.d.ts +0 -47
- package/dist/charts/kinds/donut-layout.d.ts.map +0 -1
- package/dist/charts/kinds/donut-layout.js +0 -52
- package/dist/charts/layout/auto-margin.d.ts +0 -122
- package/dist/charts/layout/auto-margin.d.ts.map +0 -1
- package/dist/charts/layout/auto-margin.js +0 -81
- package/dist/charts/layout/end-labels.d.ts +0 -64
- package/dist/charts/layout/end-labels.d.ts.map +0 -1
- package/dist/charts/layout/end-labels.js +0 -76
- package/dist/charts/layout/log-ticks.d.ts +0 -27
- package/dist/charts/layout/log-ticks.d.ts.map +0 -1
- package/dist/charts/layout/log-ticks.js +0 -42
- package/dist/charts/primitives/AreaGradient.d.ts +0 -18
- package/dist/charts/primitives/AreaGradient.d.ts.map +0 -1
- package/dist/charts/primitives/AreaGradient.js +0 -13
- package/dist/charts/primitives/Axes.d.ts +0 -83
- package/dist/charts/primitives/Axes.d.ts.map +0 -1
- package/dist/charts/primitives/Axes.js +0 -168
- package/dist/charts/primitives/CartesianChart.d.ts +0 -257
- package/dist/charts/primitives/CartesianChart.d.ts.map +0 -1
- package/dist/charts/primitives/CartesianChart.js +0 -549
- package/dist/charts/primitives/ChartCard.d.ts +0 -66
- package/dist/charts/primitives/ChartCard.d.ts.map +0 -1
- package/dist/charts/primitives/ChartCard.js +0 -143
- package/dist/charts/primitives/ChartFrame.d.ts +0 -156
- package/dist/charts/primitives/ChartFrame.d.ts.map +0 -1
- package/dist/charts/primitives/ChartFrame.js +0 -241
- package/dist/charts/primitives/ChartLegend.d.ts +0 -67
- package/dist/charts/primitives/ChartLegend.d.ts.map +0 -1
- package/dist/charts/primitives/ChartLegend.js +0 -292
- package/dist/charts/primitives/ChartPending.d.ts +0 -113
- package/dist/charts/primitives/ChartPending.d.ts.map +0 -1
- package/dist/charts/primitives/ChartPending.js +0 -117
- package/dist/charts/primitives/ChartTooltip.d.ts +0 -59
- package/dist/charts/primitives/ChartTooltip.d.ts.map +0 -1
- package/dist/charts/primitives/ChartTooltip.js +0 -197
- package/dist/charts/primitives/Crosshair.d.ts +0 -26
- package/dist/charts/primitives/Crosshair.d.ts.map +0 -1
- package/dist/charts/primitives/Crosshair.js +0 -23
- package/dist/charts/primitives/HatchPattern.d.ts +0 -31
- package/dist/charts/primitives/HatchPattern.d.ts.map +0 -1
- package/dist/charts/primitives/HatchPattern.js +0 -31
- package/dist/charts/primitives/HoverOverlay.d.ts +0 -45
- package/dist/charts/primitives/HoverOverlay.d.ts.map +0 -1
- package/dist/charts/primitives/HoverOverlay.js +0 -72
- package/dist/charts/primitives/HoverOverlay.module.css +0 -13
- package/dist/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
- package/dist/charts/primitives/XZoneRects.d.ts +0 -54
- package/dist/charts/primitives/XZoneRects.d.ts.map +0 -1
- package/dist/charts/primitives/XZoneRects.js +0 -65
- package/dist/charts/primitives/ZoneRects.d.ts +0 -38
- package/dist/charts/primitives/ZoneRects.d.ts.map +0 -1
- package/dist/charts/primitives/ZoneRects.js +0 -30
- package/dist/charts/primitives/chart-card-context.d.ts +0 -33
- package/dist/charts/primitives/chart-card-context.d.ts.map +0 -1
- package/dist/charts/primitives/chart-card-context.js +0 -18
- package/dist/charts/primitives/chart-frame-layout.d.ts +0 -185
- package/dist/charts/primitives/chart-frame-layout.d.ts.map +0 -1
- package/dist/charts/primitives/chart-frame-layout.js +0 -175
- package/dist/charts/primitives/chart-layout.d.ts +0 -112
- package/dist/charts/primitives/chart-layout.d.ts.map +0 -1
- package/dist/charts/primitives/chart-layout.js +0 -175
- package/dist/charts/primitives/chart-tier.d.ts +0 -16
- package/dist/charts/primitives/chart-tier.d.ts.map +0 -1
- package/dist/charts/primitives/chart-tier.js +0 -44
- package/dist/charts/primitives/legend-disclosure.d.ts +0 -27
- package/dist/charts/primitives/legend-disclosure.d.ts.map +0 -1
- package/dist/charts/primitives/legend-disclosure.js +0 -153
- package/dist/charts/series.d.ts +0 -189
- package/dist/charts/series.d.ts.map +0 -1
- package/dist/charts/series.js +0 -84
- package/dist/charts/sparklines/BarSparkline.d.ts +0 -37
- package/dist/charts/sparklines/BarSparkline.d.ts.map +0 -1
- package/dist/charts/sparklines/BarSparkline.js +0 -53
- package/dist/charts/sparklines/LineSparkline.d.ts +0 -15
- package/dist/charts/sparklines/LineSparkline.d.ts.map +0 -1
- package/dist/charts/sparklines/LineSparkline.js +0 -51
- package/dist/charts/sparklines/index.d.ts +0 -3
- package/dist/charts/sparklines/index.d.ts.map +0 -1
- package/dist/charts/sparklines/index.js +0 -6
- package/dist/charts/utils/domain.d.ts +0 -35
- package/dist/charts/utils/domain.d.ts.map +0 -1
- package/dist/charts/utils/domain.js +0 -12
- package/dist/charts/utils/format.d.ts +0 -8
- package/dist/charts/utils/format.d.ts.map +0 -1
- package/dist/charts/utils/format.js +0 -20
- package/dist/charts/utils/measure-text.d.ts +0 -25
- package/dist/charts/utils/measure-text.d.ts.map +0 -1
- package/dist/charts/utils/measure-text.js +0 -64
- package/dist/charts/utils/ticks.d.ts +0 -103
- package/dist/charts/utils/ticks.d.ts.map +0 -1
- package/dist/charts/utils/ticks.js +0 -92
- package/dist/commands/overlays-mount.d.ts +0 -122
- package/dist/commands/overlays-mount.d.ts.map +0 -1
- package/dist/commands/overlays-mount.js +0 -125
- package/dist/commands/useCommandHotkeys.d.ts +0 -14
- package/dist/commands/useCommandHotkeys.d.ts.map +0 -1
- package/dist/commands/useCommandHotkeys.js +0 -45
- package/dist/content/article-actions.d.ts +0 -39
- package/dist/content/article-actions.d.ts.map +0 -1
- package/dist/content/article-actions.js +0 -28
- package/dist/content/article-card.d.ts +0 -58
- package/dist/content/article-card.d.ts.map +0 -1
- package/dist/content/article-card.js +0 -79
- package/dist/content/article-card.module.css +0 -111
- package/dist/content/mdx.d.ts +0 -20
- package/dist/content/mdx.d.ts.map +0 -1
- package/dist/content/mdx.js +0 -64
- package/dist/controls/compare-filter.d.ts +0 -42
- package/dist/controls/compare-filter.d.ts.map +0 -1
- package/dist/controls/compare-filter.js +0 -38
- package/dist/controls/slider-control.d.ts +0 -36
- package/dist/controls/slider-control.d.ts.map +0 -1
- package/dist/controls/slider-control.js +0 -64
- package/dist/dashboard/widget-grid.d.ts +0 -27
- package/dist/dashboard/widget-grid.d.ts.map +0 -1
- package/dist/dashboard/widget-grid.js +0 -40
- package/dist/dashboard/widget-grid.module.css +0 -69
- package/dist/data/data-table-state.d.ts.map +0 -1
- package/dist/data/data-table.d.ts.map +0 -1
- package/dist/data/query-branch.d.ts.map +0 -1
- package/dist/data/table.d.ts +0 -24
- package/dist/data/table.d.ts.map +0 -1
- package/dist/data/virtual-list.d.ts +0 -133
- package/dist/data/virtual-list.d.ts.map +0 -1
- package/dist/data/virtual-list.js +0 -157
- package/dist/data/virtual.d.ts +0 -21
- package/dist/data/virtual.d.ts.map +0 -1
- package/dist/data/virtual.js +0 -4
- package/dist/forms/FormErrorSummary.d.ts +0 -30
- package/dist/forms/FormErrorSummary.d.ts.map +0 -1
- package/dist/forms/FormErrorSummary.js +0 -30
- package/dist/forms/use-field-array.d.ts +0 -60
- package/dist/forms/use-field-array.d.ts.map +0 -1
- package/dist/forms/use-field-array.js +0 -20
- package/dist/forms/use-form-draft.d.ts +0 -76
- package/dist/forms/use-form-draft.d.ts.map +0 -1
- package/dist/forms/use-form-draft.js +0 -92
- package/dist/forms/use-form-submit.d.ts +0 -88
- package/dist/forms/use-form-submit.d.ts.map +0 -1
- package/dist/forms/use-form-submit.js +0 -63
- package/dist/notifications/bell.d.ts.map +0 -1
- package/dist/notifications/center.d.ts.map +0 -1
- package/dist/notifications/define-notifications.d.ts.map +0 -1
- package/dist/notifications/index.d.ts +0 -40
- package/dist/notifications/index.d.ts.map +0 -1
- package/dist/notifications/index.js +0 -54
- package/dist/notifications/mount-guard.d.ts +0 -8
- package/dist/notifications/mount-guard.d.ts.map +0 -1
- package/dist/notifications/mount-guard.js +0 -18
- package/dist/notifications/notify.d.ts +0 -149
- package/dist/notifications/notify.d.ts.map +0 -1
- package/dist/notifications/notify.js +0 -171
- package/dist/notifications/store.d.ts.map +0 -1
- package/dist/provider/connectivity-indicator.d.ts +0 -13
- package/dist/provider/connectivity-indicator.d.ts.map +0 -1
- package/dist/provider/connectivity-indicator.js +0 -205
- package/dist/provider/connectivity-provider.d.ts +0 -7
- package/dist/provider/connectivity-provider.d.ts.map +0 -1
- package/dist/provider/connectivity-provider.js +0 -128
- package/dist/provider/connectivity-types.d.ts +0 -36
- package/dist/provider/connectivity-types.d.ts.map +0 -1
- package/dist/provider/use-connectivity.d.ts +0 -3
- package/dist/provider/use-connectivity.d.ts.map +0 -1
- package/dist/provider/use-connectivity.js +0 -14
- package/dist/query-devtools.d.ts +0 -21
- package/dist/query-devtools.d.ts.map +0 -1
- package/dist/query-devtools.js +0 -13
- package/src/agent/adapter.ts +0 -945
- package/src/agent/use-agent-stream.ts +0 -154
- package/src/agent-chat/index.ts +0 -54
- package/src/agent-chat/thread-detail-panel.tsx +0 -201
- package/src/agent-chat/thread-workspace.tsx +0 -279
- package/src/charts/cursor/resolve.ts +0 -198
- package/src/charts/cursor/scope.tsx +0 -35
- package/src/charts/cursor/store.ts +0 -58
- package/src/charts/cursor/touch-pin.ts +0 -138
- package/src/charts/hooks/use-discrete-cursor.ts +0 -335
- package/src/charts/hooks/use-hysteresis.ts +0 -26
- package/src/charts/hooks/useBandPlot.ts +0 -383
- package/src/charts/hooks/useChartCursor.ts +0 -367
- package/src/charts/hooks/useChartSize.ts +0 -35
- package/src/charts/kinds/BandStrip.tsx +0 -449
- package/src/charts/kinds/Bars.tsx +0 -589
- package/src/charts/kinds/Donut.tsx +0 -368
- package/src/charts/kinds/DualPanel.tsx +0 -712
- package/src/charts/kinds/Heatmap.tsx +0 -396
- package/src/charts/kinds/MirroredBars.tsx +0 -469
- package/src/charts/kinds/MultiLine.tsx +0 -322
- package/src/charts/kinds/StackedArea.tsx +0 -267
- package/src/charts/kinds/ZonedLine.tsx +0 -301
- package/src/charts/kinds/band-chrome.tsx +0 -91
- package/src/charts/kinds/donut-layout.ts +0 -82
- package/src/charts/layout/auto-margin.ts +0 -242
- package/src/charts/layout/end-labels.ts +0 -135
- package/src/charts/layout/log-ticks.ts +0 -90
- package/src/charts/primitives/AreaGradient.tsx +0 -26
- package/src/charts/primitives/Axes.tsx +0 -271
- package/src/charts/primitives/CartesianChart.tsx +0 -1002
- package/src/charts/primitives/ChartCard.tsx +0 -280
- package/src/charts/primitives/ChartFrame.tsx +0 -493
- package/src/charts/primitives/ChartLegend.tsx +0 -422
- package/src/charts/primitives/ChartPending.tsx +0 -243
- package/src/charts/primitives/ChartTooltip.tsx +0 -265
- package/src/charts/primitives/Crosshair.tsx +0 -43
- package/src/charts/primitives/HatchPattern.tsx +0 -55
- package/src/charts/primitives/HoverOverlay.module.css +0 -13
- package/src/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
- package/src/charts/primitives/HoverOverlay.tsx +0 -109
- package/src/charts/primitives/XZoneRects.tsx +0 -132
- package/src/charts/primitives/ZoneRects.tsx +0 -67
- package/src/charts/primitives/chart-card-context.ts +0 -46
- package/src/charts/primitives/chart-frame-layout.ts +0 -430
- package/src/charts/primitives/chart-layout.ts +0 -318
- package/src/charts/primitives/chart-tier.tsx +0 -76
- package/src/charts/primitives/legend-disclosure.tsx +0 -178
- package/src/charts/series.ts +0 -276
- package/src/charts/sparklines/BarSparkline.tsx +0 -94
- package/src/charts/sparklines/LineSparkline.tsx +0 -71
- package/src/charts/sparklines/index.ts +0 -2
- package/src/charts/theme.tsx +0 -53
- package/src/charts/utils/domain.ts +0 -41
- package/src/charts/utils/format.ts +0 -19
- package/src/charts/utils/measure-text.ts +0 -109
- package/src/charts/utils/ticks.ts +0 -239
- package/src/commands/overlays-mount.tsx +0 -333
- package/src/commands/useCommandHotkeys.ts +0 -114
- package/src/content/article-actions.ts +0 -72
- package/src/content/article-card.module.css +0 -111
- package/src/content/article-card.tsx +0 -174
- package/src/content/mdx.tsx +0 -127
- package/src/controls/compare-filter.tsx +0 -81
- package/src/controls/slider-control.tsx +0 -159
- package/src/dashboard/widget-grid.module.css +0 -69
- package/src/dashboard/widget-grid.tsx +0 -146
- package/src/data/table.ts +0 -39
- package/src/data/virtual-list.tsx +0 -356
- package/src/data/virtual.ts +0 -26
- package/src/forms/FormErrorSummary.tsx +0 -71
- package/src/forms/use-field-array.ts +0 -94
- package/src/forms/use-form-draft.ts +0 -262
- package/src/forms/use-form-submit.ts +0 -199
- package/src/notifications/index.ts +0 -88
- package/src/notifications/mount-guard.ts +0 -38
- package/src/notifications/notify.tsx +0 -379
- package/src/provider/connectivity-indicator.tsx +0 -267
- package/src/provider/connectivity-provider.tsx +0 -189
- package/src/provider/connectivity-types.ts +0 -42
- package/src/provider/use-connectivity.ts +0 -26
- package/src/query-devtools.tsx +0 -40
- /package/dist/{agent-chat → agent/chat}/message-affordances.js +0 -0
- /package/dist/{agent-chat → agent/chat}/relative-time.d.ts +0 -0
- /package/dist/{agent-chat → agent/chat}/relative-time.js +0 -0
- /package/dist/{agent-chat → agent/chat}/use-keyboard-inset.d.ts +0 -0
- /package/dist/{agent-chat → agent/chat}/virtualize.js +0 -0
- /package/dist/{notifications → commands/notifications}/bell.js +0 -0
- /package/dist/{notifications → commands/notifications}/define-notifications.js +0 -0
- /package/dist/{provider/connectivity-types.js → controls/uncontrolled.js} +0 -0
- /package/dist/{data → table}/data-table.module.css +0 -0
- /package/dist/{data → table}/data-table.module.css.d.ts +0 -0
- /package/dist/{data → table}/query-branch.d.ts +0 -0
- /package/dist/{data → table}/query-branch.js +0 -0
- /package/src/{agent-chat → agent/chat}/relative-time.ts +0 -0
- /package/src/{data → table}/data-table.module.css +0 -0
- /package/src/{data → table}/data-table.module.css.d.ts +0 -0
- /package/src/{data → table}/query-branch.ts +0 -0
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { createContext } from 'react'
|
|
2
|
-
import type { Dispatch } from 'react'
|
|
3
|
-
|
|
4
|
-
/** One frame claiming or releasing the card's header legend slot. */
|
|
5
|
-
export type LegendSlotAction = { type: 'claim' | 'release'; id: string }
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* The ONE owner of the legend-slot protocol (`docs/waves/PLAN.md` wave 3, P2-9): claimants in claim
|
|
9
|
-
* order, and the head owns the slot. A later claimant is denied simply by not being the head, and
|
|
10
|
-
* it takes over the moment everything ahead of it releases — no retry signal, no ownership mirrored
|
|
11
|
-
* in a ref. Returns the same array on a no-op so a repeated claim/release never re-renders the card.
|
|
12
|
-
*/
|
|
13
|
-
export function legendSlotReducer(
|
|
14
|
-
claimants: readonly string[],
|
|
15
|
-
{ type, id }: LegendSlotAction,
|
|
16
|
-
): readonly string[] {
|
|
17
|
-
const held = claimants.includes(id)
|
|
18
|
-
if (type === 'claim') return held ? claimants : [...claimants, id]
|
|
19
|
-
return held ? claimants.filter((c) => c !== id) : claimants
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* `ChartCard`'s internal context: `inCard` (a frame inside a card treats its computed height as a
|
|
24
|
-
* MINIMUM and grows into the card body), the legend slot — the empty header-row box a chart will portal its legend into
|
|
25
|
-
* (`docs/CHARTS-SPEC.md` §5, Legend), so a card has one chrome band, not two — and `short`, the same
|
|
26
|
-
* `measuredHeight < CARD_SHORT_HEIGHT` flag `ChartCard` already computes for the header-fold law
|
|
27
|
-
* (`data-basalt-card-short`), threaded through so `ChartFrame` can fold its header-slot legend to
|
|
28
|
-
* 'dots' before it eats the plot floor (`docs/CHARTS-SPEC.md` §5, wave 11). `null`/`false` until the slot
|
|
29
|
-
* mounts, and outside any card. Deliberately not exported from any barrel.
|
|
30
|
-
*
|
|
31
|
-
* `legendClaimants` is {@link legendSlotReducer}'s queue (its head owns the slot) and
|
|
32
|
-
* `dispatchLegendSlot` feeds it. Outside any card there is no slot, so nothing ever claims.
|
|
33
|
-
*/
|
|
34
|
-
export const ChartCardContext = createContext<{
|
|
35
|
-
legendSlot: HTMLDivElement | null
|
|
36
|
-
inCard: boolean
|
|
37
|
-
short: boolean
|
|
38
|
-
legendClaimants: readonly string[]
|
|
39
|
-
dispatchLegendSlot: Dispatch<LegendSlotAction>
|
|
40
|
-
}>({
|
|
41
|
-
legendSlot: null,
|
|
42
|
-
inCard: false,
|
|
43
|
-
short: false,
|
|
44
|
-
legendClaimants: [],
|
|
45
|
-
dispatchLegendSlot: () => {},
|
|
46
|
-
})
|
|
@@ -1,430 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Pure, DOM-free layout math behind `ChartFrame`'s plot/legend split — extracted so the arithmetic
|
|
3
|
-
* is testable without a `ResizeObserver` and `ChartFrame.tsx` stays the measuring/rendering shell.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { HIT_COARSE } from '../../common/hit-floor'
|
|
7
|
-
import { VX } from '../../tokens'
|
|
8
|
-
import type { ContainerClass } from '../../tokens/size-classes'
|
|
9
|
-
import type { ChartMargin } from '../../tokens'
|
|
10
|
-
import type { LegendEntry } from './ChartLegend'
|
|
11
|
-
import type { SeriesRole } from '../series'
|
|
12
|
-
import { measureText } from '../utils/measure-text'
|
|
13
|
-
|
|
14
|
-
/** Line box of one legend row at `VX.legendFontSize`. */
|
|
15
|
-
const LEGEND_LINE_H = Math.ceil(VX.legendFontSize * 1.35)
|
|
16
|
-
/** `ChartLegend`'s own vertical wrapper padding (`8px 0 2px`). */
|
|
17
|
-
const LEGEND_PAD_Y = 10
|
|
18
|
-
/** Gap between two wrapped legend rows — tight (4-6px); the wider `VX.legendGap` separates entries. */
|
|
19
|
-
export const LEGEND_ROW_GAP = 6
|
|
20
|
-
/** Swatch plus the gap to its label — the fixed part of a legend entry's width. */
|
|
21
|
-
const LEGEND_SWATCH_W = 24
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* The real gap a dots-mode entry needs so its `[data-basalt-hit]::after` overlay can reach the
|
|
25
|
-
* full 44px coarse floor with NO overlap into its neighbour's overlay (`hit-floor.layout.test.ts` +
|
|
26
|
-
* `hit-overlap.layout.test.ts`, wave 4's cap: `styles.css`'s `::after` grows to
|
|
27
|
-
* `min(max(size,44), size + 2 + gap)`). Two 44px-wide overlays centred on same-size hosts touch
|
|
28
|
-
* with zero overlap only once their PITCH (real gap + host size) is itself >= 44 — below that, the
|
|
29
|
-
* cap can only shrink the overlay below 44 (honouring WCAG 2.5.8's spacing route) or let it overlap;
|
|
30
|
-
* there is no gap value that lets it hit 44 exactly while staying flush against a same-size sibling.
|
|
31
|
-
* `LEGEND_DOT_SIZE` is 8px, so the floor is 44 − 8 − 2 = 34; a few px of headroom against rounding.
|
|
32
|
-
*/
|
|
33
|
-
export const LEGEND_DOT_SIZE = 8
|
|
34
|
-
export const DOTS_HIT_GAP = HIT_COARSE - LEGEND_DOT_SIZE - 2 + 4
|
|
35
|
-
/** One dot's full visual footprint in a wrapped row — the fit basis for dots mode. A chip's
|
|
36
|
-
* swatch+label width badly overstates what a dot costs, so measuring dots as chips wrapped a
|
|
37
|
-
* 4-entry legend to its own `All N` row. */
|
|
38
|
-
const DOT_PITCH = LEGEND_DOT_SIZE + DOTS_HIT_GAP
|
|
39
|
-
|
|
40
|
-
const GROUP_ORDER: SeriesRole[] = ['series', 'overlay', 'reference']
|
|
41
|
-
const roleOf = (item: LegendEntry): SeriesRole => item.role ?? 'series'
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Order entries series → overlay → reference and record where a divider belongs — the ONE ordering
|
|
45
|
-
* both `ChartLegend`'s render and the resolver's fit math (`chart-layout.ts`) use, so a dots-mode
|
|
46
|
-
* fit never disagrees with what actually wraps (a grouped legend renders dividers as flex items).
|
|
47
|
-
*/
|
|
48
|
-
export function orderEntries(
|
|
49
|
-
items: readonly LegendEntry[],
|
|
50
|
-
groups: boolean,
|
|
51
|
-
): { entries: LegendEntry[]; dividerAfter: ReadonlySet<number> } {
|
|
52
|
-
if (!groups) return { entries: [...items], dividerAfter: new Set() }
|
|
53
|
-
|
|
54
|
-
const dividerAfter = new Set<number>()
|
|
55
|
-
const entries: LegendEntry[] = []
|
|
56
|
-
const nonEmptyGroups = GROUP_ORDER.map((role) =>
|
|
57
|
-
items.filter((item) => roleOf(item) === role),
|
|
58
|
-
).filter((group) => group.length > 0)
|
|
59
|
-
nonEmptyGroups.forEach((group, i) => {
|
|
60
|
-
entries.push(...group)
|
|
61
|
-
if (i < nonEmptyGroups.length - 1) dividerAfter.add(entries.length - 1)
|
|
62
|
-
})
|
|
63
|
-
return { entries, dividerAfter }
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* The two metric sets a chart's chrome resolves to. Internally the container class
|
|
68
|
-
* (`micro`/`compact` → `'phone'`, `regular`/`wide` → `'desktop'`) picks one; there is no `tablet`.
|
|
69
|
-
* Internal only — not on any public barrel.
|
|
70
|
-
*/
|
|
71
|
-
export type ChartTier = 'phone' | 'desktop'
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* A chart height stated per container step instead of as one number — the declarative escape from
|
|
75
|
-
* "every chart on this page is 260px tall on a 375px phone too".
|
|
76
|
-
*
|
|
77
|
-
* `base` is the height below the `regular` class; `regular` and `wide` take effect from
|
|
78
|
-
* `CONTAINER_CLASSES.regular` / `.wide` of the frame's MEASURED width (never the viewport).
|
|
79
|
-
*
|
|
80
|
-
* ```tsx
|
|
81
|
-
* <ChartFrame series={series} height={{ base: 180, wide: 260 }}>{…}</ChartFrame>
|
|
82
|
-
* ```
|
|
83
|
-
*/
|
|
84
|
-
export type ResponsiveChartHeight = {
|
|
85
|
-
base: number
|
|
86
|
-
/** From the `regular` container class (480px) up. */
|
|
87
|
-
regular?: number
|
|
88
|
-
/** From the `wide` container class (800px) up. */
|
|
89
|
-
wide?: number
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* Resolve a `height` prop — a plain number, or a {@link ResponsiveChartHeight} — for a container
|
|
94
|
-
* class. A plain number passes through untouched. The class is the measured one, or, before the
|
|
95
|
-
* first measurement, the one implied by the viewport ({@link resolveChartLayout}), so the first
|
|
96
|
-
* frame is not a different height from the second.
|
|
97
|
-
*/
|
|
98
|
-
export function resolveFrameHeight(
|
|
99
|
-
height: number | ResponsiveChartHeight,
|
|
100
|
-
containerClass: ContainerClass,
|
|
101
|
-
): number {
|
|
102
|
-
if (typeof height === 'number') return height
|
|
103
|
-
if (containerClass === 'wide') return height.wide ?? height.regular ?? height.base
|
|
104
|
-
if (containerClass === 'regular') return height.regular ?? height.base
|
|
105
|
-
return height.base
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* How much of `VX.margin` a phone-tier chart keeps as its FLOOR. The measured law is unchanged —
|
|
110
|
-
* a side may still only grow past its floor (`autoMargin`) — this only stops a static token from
|
|
111
|
-
* spending 44px of a 360px chart on a gutter three characters wide.
|
|
112
|
-
*/
|
|
113
|
-
const PHONE_MARGIN_SCALE = 0.75
|
|
114
|
-
|
|
115
|
-
/** Phone-tier crosshair dot radius. One step in, so the marker still reads as a punched hole at
|
|
116
|
-
* the smaller stroke widths a narrow chart draws. */
|
|
117
|
-
const PHONE_DOT_R = Math.max(VX.dotR - 1, 2)
|
|
118
|
-
|
|
119
|
-
/** Tooltip `minWidth`, per tier — 140px is 39% of a 360px screen. */
|
|
120
|
-
const TOOLTIP_MIN_WIDTH = { desktop: 140, phone: 110 } as const
|
|
121
|
-
|
|
122
|
-
/**
|
|
123
|
-
* Every size a chart's chrome resolves per tier. One object so a new tier-sensitive size is added
|
|
124
|
-
* in one place and read by name, rather than each primitive branching on the tier itself. Internal
|
|
125
|
-
* only — not on any public barrel.
|
|
126
|
-
*/
|
|
127
|
-
export type ChartTierMetrics = {
|
|
128
|
-
/** Which tier these are, so a consumer of the metrics never needs both values threaded. */
|
|
129
|
-
tier: ChartTier
|
|
130
|
-
/** Axis tick label font size, px. Threaded into BOTH `autoMargin`'s measurement and the painted
|
|
131
|
-
* axis — measured labels must be the painted labels (`docs/CHARTS-SPEC.md` §1). */
|
|
132
|
-
axisFont: number
|
|
133
|
-
/** Legend label font size, px. */
|
|
134
|
-
legendFontSize: number
|
|
135
|
-
/** Crosshair dot radius, px. */
|
|
136
|
-
dotR: number
|
|
137
|
-
/** Floating tooltip `minWidth`, px. */
|
|
138
|
-
tooltipMinWidth: number
|
|
139
|
-
/** Per-side margin FLOORS (`VX.margin` is a floor, never a ceiling — §1). */
|
|
140
|
-
margin: ChartMargin
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
const DESKTOP_METRICS: ChartTierMetrics = {
|
|
144
|
-
tier: 'desktop',
|
|
145
|
-
axisFont: VX.axisFont,
|
|
146
|
-
legendFontSize: VX.legendFontSize,
|
|
147
|
-
dotR: VX.dotR,
|
|
148
|
-
tooltipMinWidth: TOOLTIP_MIN_WIDTH.desktop,
|
|
149
|
-
margin: VX.margin,
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
const PHONE_METRICS: ChartTierMetrics = {
|
|
153
|
-
tier: 'phone',
|
|
154
|
-
// One step DOWN the shared type ladder, never an arbitrary px value: micro → nano for ticks,
|
|
155
|
-
// sm → xs for the legend (`TEXT` in tokens/index.ts).
|
|
156
|
-
axisFont: VX.text.nano,
|
|
157
|
-
legendFontSize: VX.text.xs,
|
|
158
|
-
dotR: PHONE_DOT_R,
|
|
159
|
-
tooltipMinWidth: TOOLTIP_MIN_WIDTH.phone,
|
|
160
|
-
margin: {
|
|
161
|
-
top: Math.round(VX.margin.top * PHONE_MARGIN_SCALE),
|
|
162
|
-
right: Math.round(VX.margin.right * PHONE_MARGIN_SCALE),
|
|
163
|
-
bottom: Math.round(VX.margin.bottom * PHONE_MARGIN_SCALE),
|
|
164
|
-
left: Math.round(VX.margin.left * PHONE_MARGIN_SCALE),
|
|
165
|
-
},
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
/** The metric set a container class resolves to (`micro`/`compact` → phone, else desktop). */
|
|
169
|
-
export function chartMetrics(containerClass: ContainerClass): ChartTierMetrics {
|
|
170
|
-
return containerClass === 'micro' || containerClass === 'compact'
|
|
171
|
-
? PHONE_METRICS
|
|
172
|
-
: DESKTOP_METRICS
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
/**
|
|
176
|
-
* The whole legend-cap decision in one place: which cap `ChartLegend` gets, and whether the plot
|
|
177
|
-
* pays for it. Pure, because the COMPOSITION is what once broke (1.30.0 ran a measured fit over a
|
|
178
|
-
* caller's stated number) and the frame that combines them needs a `ResizeObserver` to test.
|
|
179
|
-
*
|
|
180
|
-
* Three cases, in order:
|
|
181
|
-
* 1. The caller STATED `legend.maxRows` (deprecated, still honoured) → it is the cap, and on a
|
|
182
|
-
* `fill` band the plot yields (`legendWins`). Nothing measured trims it.
|
|
183
|
-
* 2. No `fill` band → the resolver's width-measured fit (`fittedMaxRows`), because the frame grows.
|
|
184
|
-
* 3. A `fill` band with nothing stated → the tighter of that fit and the height-measured
|
|
185
|
-
* {@link legendEntryCap}, because a `fill` box cannot grow.
|
|
186
|
-
*/
|
|
187
|
-
export function resolveLegendRollup(input: {
|
|
188
|
-
/** The caller's own `legend.maxRows`. */
|
|
189
|
-
statedMaxRows?: number | undefined
|
|
190
|
-
/** `resolveChartLayout().legend.visible` when it overflows, else `undefined`. */
|
|
191
|
-
fittedMaxRows?: number | undefined
|
|
192
|
-
/** A visible top/bottom legend on a `fill` frame — the one shape whose box cannot grow. */
|
|
193
|
-
fillBand: boolean
|
|
194
|
-
items: readonly LegendEntry[]
|
|
195
|
-
containerW: number
|
|
196
|
-
/** Frame height the legend may consume — `resolvedHeight - VX.minPlotHeight`. */
|
|
197
|
-
available: number
|
|
198
|
-
}): { maxRows: number | undefined; legendWins: boolean } {
|
|
199
|
-
const { statedMaxRows, fittedMaxRows, fillBand, items, containerW, available } = input
|
|
200
|
-
if (statedMaxRows !== undefined) return { maxRows: statedMaxRows, legendWins: fillBand }
|
|
201
|
-
if (!fillBand) return { maxRows: fittedMaxRows, legendWins: false }
|
|
202
|
-
return {
|
|
203
|
-
maxRows: legendEntryCap({
|
|
204
|
-
items,
|
|
205
|
-
containerW,
|
|
206
|
-
available,
|
|
207
|
-
...(fittedMaxRows !== undefined && { defaultMaxRows: fittedMaxRows }),
|
|
208
|
-
}),
|
|
209
|
-
legendWins: false,
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
/**
|
|
214
|
-
* Resolve the plot rect from the measured box and the measured legend band. Pure and exported so
|
|
215
|
-
* the two floors below are testable without a `ResizeObserver`.
|
|
216
|
-
*
|
|
217
|
-
* `minWidth` is a FIRST-FRAME guard, applied only while `containerW` is still 0 (unmeasured, or
|
|
218
|
-
* SSR); once measured the plot tracks the box exactly, floored at 1 so no scale divides by zero.
|
|
219
|
-
* The legend band is subtracted first, and the remainder stops at `VX.minPlotHeight` — the frame's
|
|
220
|
-
* flex box grows by the difference under a fixed height, and under `fill` (which cannot grow) the
|
|
221
|
-
* legend is capped instead ({@link legendEntryCap}). A caller-stated `legend.maxRows` yields the
|
|
222
|
-
* floor itself (`legendWins`) as far as the box has room ({@link SELF_MEASURED_SLACK}); an
|
|
223
|
-
* unmeasured box (`resolvedHeight <= 0`) stays 0 and renders nothing.
|
|
224
|
-
*/
|
|
225
|
-
export function resolvePlotRect(input: {
|
|
226
|
-
containerW: number
|
|
227
|
-
resolvedHeight: number
|
|
228
|
-
minWidth: number
|
|
229
|
-
sideLegendWidth: number
|
|
230
|
-
topBottomLegendHeight: number
|
|
231
|
-
/**
|
|
232
|
-
* The caller stated `legend.maxRows` on a `fill` frame, so the legend takes the rows it asked
|
|
233
|
-
* for and the plot takes what is left — `VX.minPlotHeight` stops being a floor. Without this the
|
|
234
|
-
* honoured cap would push the frame's content PAST its own cell (the plot holds 120px, the legend
|
|
235
|
-
* band adds its own) and paint over whatever sits below it; with it, the cost of the caller's
|
|
236
|
-
* number lands where they can see it. Spend the whole box on legend rows and there is no plot
|
|
237
|
-
* left to draw — that is their arithmetic, made visible rather than silently rolled up.
|
|
238
|
-
*/
|
|
239
|
-
legendWins?: boolean
|
|
240
|
-
}): { width: number; height: number } {
|
|
241
|
-
const {
|
|
242
|
-
containerW,
|
|
243
|
-
resolvedHeight,
|
|
244
|
-
minWidth,
|
|
245
|
-
sideLegendWidth,
|
|
246
|
-
topBottomLegendHeight,
|
|
247
|
-
legendWins = false,
|
|
248
|
-
} = input
|
|
249
|
-
const room = resolvedHeight - topBottomLegendHeight
|
|
250
|
-
const plotFloor = legendWins && !isSelfMeasured(room) ? 0 : VX.minPlotHeight
|
|
251
|
-
return {
|
|
252
|
-
width: containerW === 0 ? minWidth : Math.max(containerW - sideLegendWidth, 1),
|
|
253
|
-
height: resolvedHeight <= 0 ? 0 : Math.max(room, plotFloor),
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
/** Sub-pixel slack on "the frame measures its own legend band and nothing else" — absorbs a
|
|
258
|
-
* future rounding or border difference between the two observers without re-opening the zero
|
|
259
|
-
* fixpoint below. */
|
|
260
|
-
const SELF_MEASURED_SLACK = 0.5
|
|
261
|
-
|
|
262
|
-
/**
|
|
263
|
-
* Is the frame's height its OWN content rather than a box something else stated?
|
|
264
|
-
*
|
|
265
|
-
* Under `fill` a frame in an unsized parent resolves its height to `auto`; its only children are
|
|
266
|
-
* the plot and the legend, so `room === 0` means the box IS the legend band. There `legendWins`
|
|
267
|
-
* must NOT yield the floor — with the floor gone the sequence has a fixpoint at zero (plot 0 →
|
|
268
|
-
* content is the legend → box = band → room 0 → plot 0 forever). A NEGATIVE `room` is not this
|
|
269
|
-
* case: a self-measured box can never be shorter than its own content, so the box was stated by
|
|
270
|
-
* something else, and spending all of it on legend rows is the caller's arithmetic.
|
|
271
|
-
*/
|
|
272
|
-
function isSelfMeasured(room: number): boolean {
|
|
273
|
-
return room >= 0 && room < SELF_MEASURED_SLACK
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
/** Height of a legend band `rows` rows tall, wrapper padding included. */
|
|
277
|
-
const legendBandHeight = (rows: number): number =>
|
|
278
|
-
LEGEND_PAD_Y + rows * LEGEND_LINE_H + Math.max(rows - 1, 0) * LEGEND_ROW_GAP
|
|
279
|
-
|
|
280
|
-
/** Width one legend entry occupies — swatch, gap, label, and the note that rides after it. */
|
|
281
|
-
const legendEntryWidth = (item: LegendEntry): number =>
|
|
282
|
-
LEGEND_SWATCH_W +
|
|
283
|
-
measureText(
|
|
284
|
-
item.note === undefined ? item.label : `${item.label} ${item.note}`,
|
|
285
|
-
VX.legendFontSize,
|
|
286
|
-
)
|
|
287
|
-
|
|
288
|
-
/**
|
|
289
|
-
* The ONE greedy wrap every legend fit runs — the same wrap the flex container performs, measured
|
|
290
|
-
* rather than assumed. Each item costs `widthOf(item)` (plus `gap` after the row's first) and
|
|
291
|
-
* `extraAfter(i)` more once placed (a group divider is its own flex item). `allowZero` (default
|
|
292
|
-
* false) drops the "the first entry always fits" guarantee a bare row-fit needs: a reserved pass
|
|
293
|
-
* (the `All N` chip already took its room) must be able to answer 0, or the SAME entry the caller
|
|
294
|
-
* is about to draw the chip beside would always count as fitting even when the two provably don't.
|
|
295
|
-
*/
|
|
296
|
-
function fitGreedyRows<T>(
|
|
297
|
-
items: readonly T[],
|
|
298
|
-
fit: {
|
|
299
|
-
widthOf: (item: T) => number
|
|
300
|
-
gap: number
|
|
301
|
-
width: number
|
|
302
|
-
rows: number
|
|
303
|
-
allowZero?: boolean
|
|
304
|
-
extraAfter?: (index: number) => number
|
|
305
|
-
},
|
|
306
|
-
): number {
|
|
307
|
-
let row = 1
|
|
308
|
-
let x = 0
|
|
309
|
-
let fitted = 0
|
|
310
|
-
for (const [i, item] of items.entries()) {
|
|
311
|
-
const w = fit.widthOf(item)
|
|
312
|
-
const next = x === 0 ? w : x + fit.gap + w
|
|
313
|
-
if (x === 0 && fit.allowZero === true && next > fit.width) return 0
|
|
314
|
-
if (next > fit.width && x > 0) {
|
|
315
|
-
row += 1
|
|
316
|
-
if (row > fit.rows) return fitted
|
|
317
|
-
x = w
|
|
318
|
-
} else {
|
|
319
|
-
x = next
|
|
320
|
-
}
|
|
321
|
-
fitted += 1
|
|
322
|
-
x += fit.extraAfter?.(i) ?? 0
|
|
323
|
-
}
|
|
324
|
-
return fitted
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
const chipFit = { widthOf: legendEntryWidth, gap: VX.legendGap }
|
|
328
|
-
|
|
329
|
-
/** How many of `items` fit in `rows` wrapped rows of `width` — the same greedy wrap the flex
|
|
330
|
-
* container performs, measured rather than assumed (`docs/CHARTS-SPEC.md` §1). */
|
|
331
|
-
export function entriesWithinRows(
|
|
332
|
-
items: readonly LegendEntry[],
|
|
333
|
-
width: number,
|
|
334
|
-
rows: number,
|
|
335
|
-
): number {
|
|
336
|
-
return fitGreedyRows(items, { ...chipFit, width, rows })
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
/**
|
|
340
|
-
* Chips-mode counterpart of {@link entriesWithinDotRows}: once the un-reserved fit overflows, a
|
|
341
|
-
* second pass measures against the width LESS the `All N` chip's own footprint, so the count this
|
|
342
|
-
* returns still leaves the chip room to sit beside it in the same row — same reserve law the dots
|
|
343
|
-
* fit already applied, now applied to chip width instead of a dot's pitch. Returns 0 when not even
|
|
344
|
-
* the first chip fits once the chip's width is reserved, so the row renders the disclosure alone
|
|
345
|
-
* rather than one crowded chip plus a chip that doesn't actually fit next to it.
|
|
346
|
-
*/
|
|
347
|
-
export function entriesWithinChipRows(
|
|
348
|
-
items: readonly LegendEntry[],
|
|
349
|
-
width: number,
|
|
350
|
-
rows: number,
|
|
351
|
-
): number {
|
|
352
|
-
const total = items.length
|
|
353
|
-
const fittedNoReserve = entriesWithinRows(items, width, rows)
|
|
354
|
-
if (fittedNoReserve >= total) return fittedNoReserve
|
|
355
|
-
const reserve = measureText(`All ${total}`, VX.legendFontSize) + VX.legendGap
|
|
356
|
-
return fitGreedyRows(items, {
|
|
357
|
-
...chipFit,
|
|
358
|
-
width: Math.max(width - reserve, 0),
|
|
359
|
-
rows,
|
|
360
|
-
allowZero: true,
|
|
361
|
-
})
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
/**
|
|
365
|
-
* How many of `items` fit as DOTS in `rows` wrapped rows of `width` — the dots-mode counterpart of
|
|
366
|
-
* {@link entriesWithinRows}, measured at the dot's own pitch rather than a chip's width.
|
|
367
|
-
* `dividerAfter` (from {@link orderEntries}) counts a rendered group divider's own gap.
|
|
368
|
-
*
|
|
369
|
-
* Two passes: every entry visible with no `All N` chip (if that fits, no chip is drawn); otherwise
|
|
370
|
-
* reserve the chip's measured width up front so it can never wrap to a row of its own — and, once
|
|
371
|
-
* reserved, allow the answer to be 0: a chip wide enough to leave no room for even the first dot
|
|
372
|
-
* means the row draws the disclosure alone, not one dot crowding a chip that no longer fits beside it.
|
|
373
|
-
*/
|
|
374
|
-
export function entriesWithinDotRows(
|
|
375
|
-
items: readonly LegendEntry[],
|
|
376
|
-
width: number,
|
|
377
|
-
rows: number,
|
|
378
|
-
dividerAfter: ReadonlySet<number> = new Set(),
|
|
379
|
-
): number {
|
|
380
|
-
// A dot is `LEGEND_DOT_SIZE` wide and `DOT_PITCH` already IS its full footprint (size plus the
|
|
381
|
-
// gap to a neighbour) — so the gap is the pitch LESS the dot; adding the dot again double-counted
|
|
382
|
-
// every dot after the row's first and wrapped to `All N` well before it overflowed.
|
|
383
|
-
const dotFit = {
|
|
384
|
-
widthOf: () => LEGEND_DOT_SIZE,
|
|
385
|
-
gap: DOT_PITCH - LEGEND_DOT_SIZE,
|
|
386
|
-
rows,
|
|
387
|
-
extraAfter: (i: number) => (dividerAfter.has(i) ? DOT_PITCH : 0),
|
|
388
|
-
}
|
|
389
|
-
const total = items.length
|
|
390
|
-
const fittedNoReserve = fitGreedyRows(items, { ...dotFit, width })
|
|
391
|
-
if (fittedNoReserve >= total) return fittedNoReserve
|
|
392
|
-
const reserve = measureText(`All ${total}`, VX.legendFontSize) + DOT_PITCH
|
|
393
|
-
return fitGreedyRows(items, { ...dotFit, width: Math.max(width - reserve, 0), allowZero: true })
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
/**
|
|
397
|
-
* The entry cap a `fill` frame's legend must respect so the plot keeps `VX.minPlotHeight`. A
|
|
398
|
-
* `fill` frame is pinned to its cell, so the only lever is `ChartLegend`'s `maxRows` rollup; how
|
|
399
|
-
* many entries fit follows from MEASURING the labels, not assuming one per row. Returns
|
|
400
|
-
* `undefined` when the whole legend already fits.
|
|
401
|
-
*
|
|
402
|
-
* Resolves an ABSENT cap only: a caller who stated `legend.maxRows` never reaches here
|
|
403
|
-
* ({@link resolveLegendRollup} routes around it), so the documented escape is never made inert.
|
|
404
|
-
*/
|
|
405
|
-
export function legendEntryCap(input: {
|
|
406
|
-
items: readonly LegendEntry[]
|
|
407
|
-
containerW: number
|
|
408
|
-
/** Frame height the legend may consume — `resolvedHeight - VX.minPlotHeight`. */
|
|
409
|
-
available: number
|
|
410
|
-
/**
|
|
411
|
-
* The cap that applies when nothing explicit was stated — the resolver's width fit. Two
|
|
412
|
-
* defaults contending: the smaller wins.
|
|
413
|
-
*/
|
|
414
|
-
defaultMaxRows?: number
|
|
415
|
-
}): number | undefined {
|
|
416
|
-
const { items, containerW, available, defaultMaxRows } = input
|
|
417
|
-
if (containerW <= 0 || items.length === 0) return defaultMaxRows
|
|
418
|
-
const rows = Math.max(
|
|
419
|
-
1,
|
|
420
|
-
Math.floor((available - LEGEND_PAD_Y + LEGEND_ROW_GAP) / (LEGEND_LINE_H + LEGEND_ROW_GAP)),
|
|
421
|
-
)
|
|
422
|
-
if (
|
|
423
|
-
legendBandHeight(rows) <= available &&
|
|
424
|
-
entriesWithinRows(items, containerW, rows) >= items.length
|
|
425
|
-
) {
|
|
426
|
-
return defaultMaxRows
|
|
427
|
-
}
|
|
428
|
-
const fitted = Math.max(1, entriesWithinRows(items, containerW, rows))
|
|
429
|
-
return defaultMaxRows === undefined ? fitted : Math.min(fitted, defaultMaxRows)
|
|
430
|
-
}
|