basalt-ui 1.41.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +46 -43
- package/CHANGELOG.md +535 -518
- package/MIGRATING.md +945 -37
- package/README.md +171 -366
- package/agent/rules/basalt-batteries.md +19 -74
- package/agent/rules/basalt-charts.md +21 -95
- package/agent/rules/basalt-controls.md +23 -131
- package/agent/rules/basalt-mantine.md +26 -99
- package/agent/rules/basalt-state.md +21 -103
- package/agent/rules/basalt-tokens.md +33 -114
- package/agent/skills/basalt-app/SKILL.md +229 -72
- package/agent/skills/basalt-charts/SKILL.md +23 -57
- package/agent/skills/basalt-design/SKILL.md +12 -70
- package/agent/templates/AGENTS-block.md.tpl +16 -26
- package/agent/templates/DESIGN.md.tpl +1 -1
- package/agent/templates/__root.tpl +9 -16
- package/agent/templates/main.tpl +21 -0
- package/agent/templates/nav.tpl +18 -0
- package/configs/oxlint-basalt.json +4 -10
- package/configs/oxlint-plugin.js +465 -844
- package/configs/oxlint-plugin.test.ts +661 -709
- package/configs/oxlint.json +10 -2
- package/dist/agent/ai-sdk-transport.d.ts +19 -7
- package/dist/agent/ai-sdk-transport.d.ts.map +1 -1
- package/dist/agent/ai-sdk-transport.js +10 -7
- package/dist/{agent-chat → agent/chat}/composer.d.ts +16 -16
- package/dist/agent/chat/composer.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/composer.js +10 -9
- package/dist/{agent-chat → agent/chat}/message-affordances.d.ts +7 -6
- package/dist/agent/chat/message-affordances.d.ts.map +1 -0
- package/dist/agent/chat/relative-time.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-feed-row.d.ts +18 -16
- package/dist/agent/chat/thread-feed-row.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-feed-row.js +12 -11
- package/dist/{agent-chat → agent/chat}/thread-feed.d.ts +8 -8
- package/dist/agent/chat/thread-feed.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-feed.js +12 -10
- package/dist/{agent-chat → agent/chat}/thread-message.d.ts +12 -9
- package/dist/agent/chat/thread-message.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-message.js +15 -13
- package/dist/{agent-chat → agent/chat}/thread-outcome-card.d.ts +2 -2
- package/dist/agent/chat/thread-outcome-card.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/thread-outcome-card.js +3 -3
- package/dist/{agent-chat → agent/chat}/tool-chip.d.ts +5 -5
- package/dist/agent/chat/tool-chip.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/tool-chip.js +4 -4
- package/dist/agent/chat/use-keyboard-inset.d.ts.map +1 -0
- package/dist/{agent-chat → agent/chat}/use-keyboard-inset.js +1 -1
- package/dist/{agent-chat → agent/chat}/virtualize.d.ts +7 -7
- package/dist/agent/chat/virtualize.d.ts.map +1 -0
- package/dist/agent/error.d.ts +31 -0
- package/dist/agent/error.d.ts.map +1 -0
- package/dist/agent/error.js +18 -0
- package/dist/agent/history.d.ts +2 -36
- package/dist/agent/history.d.ts.map +1 -1
- package/dist/agent/history.js +0 -32
- package/dist/agent/id.d.ts +4 -5
- package/dist/agent/id.d.ts.map +1 -1
- package/dist/agent/index.d.ts +19 -52
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +10 -32
- package/dist/agent/outcome.d.ts +3 -14
- package/dist/agent/outcome.d.ts.map +1 -1
- package/dist/agent/outcome.js +0 -30
- package/dist/agent/part-list.d.ts +3 -3
- package/dist/agent/part-list.d.ts.map +1 -1
- package/dist/agent/parts.d.ts +23 -24
- package/dist/agent/parts.d.ts.map +1 -1
- package/dist/agent/run-committer.d.ts +23 -0
- package/dist/agent/run-committer.d.ts.map +1 -0
- package/dist/agent/run-committer.js +41 -0
- package/dist/agent/run-records.d.ts +77 -0
- package/dist/agent/run-records.d.ts.map +1 -0
- package/dist/agent/run-records.js +69 -0
- package/dist/agent/thread.d.ts +23 -47
- package/dist/agent/thread.d.ts.map +1 -1
- package/dist/agent/thread.js +3 -134
- package/dist/agent/transport.d.ts +6 -69
- package/dist/agent/transport.d.ts.map +1 -1
- package/dist/agent/transport.js +0 -18
- package/dist/agent/use-agent-thread-runs.d.ts +63 -26
- package/dist/agent/use-agent-thread-runs.d.ts.map +1 -1
- package/dist/agent/use-agent-thread-runs.js +202 -66
- package/dist/charts/BandStrip.d.ts +46 -0
- package/dist/charts/BandStrip.d.ts.map +1 -0
- package/dist/charts/BandStrip.js +151 -0
- package/dist/charts/Bars.d.ts +19 -0
- package/dist/charts/Bars.d.ts.map +1 -0
- package/dist/charts/Bars.js +77 -0
- package/dist/charts/CartesianChart.d.ts +57 -0
- package/dist/charts/CartesianChart.d.ts.map +1 -0
- package/dist/charts/CartesianChart.js +121 -0
- package/dist/charts/ChartCard.d.ts +34 -0
- package/dist/charts/ChartCard.d.ts.map +1 -0
- package/dist/charts/ChartCard.js +115 -0
- package/dist/charts/Donut.d.ts +25 -0
- package/dist/charts/Donut.d.ts.map +1 -0
- package/dist/charts/Donut.js +191 -0
- package/dist/charts/DualPanel.d.ts +47 -0
- package/dist/charts/DualPanel.d.ts.map +1 -0
- package/dist/charts/DualPanel.js +214 -0
- package/dist/charts/Heatmap.d.ts +41 -0
- package/dist/charts/Heatmap.d.ts.map +1 -0
- package/dist/charts/Heatmap.js +216 -0
- package/dist/charts/Lines.d.ts +11 -0
- package/dist/charts/Lines.d.ts.map +1 -0
- package/dist/charts/Lines.js +114 -0
- package/dist/charts/MirroredBars.d.ts +44 -0
- package/dist/charts/MirroredBars.d.ts.map +1 -0
- package/dist/charts/MirroredBars.js +190 -0
- package/dist/charts/Sparkline.d.ts +22 -0
- package/dist/charts/Sparkline.d.ts.map +1 -0
- package/dist/charts/Sparkline.js +129 -0
- package/dist/charts/StackedArea.d.ts +15 -0
- package/dist/charts/StackedArea.d.ts.map +1 -0
- package/dist/charts/StackedArea.js +46 -0
- package/dist/charts/box.d.ts +38 -0
- package/dist/charts/box.d.ts.map +1 -0
- package/dist/charts/box.js +72 -0
- package/dist/charts/card-context.d.ts +3 -0
- package/dist/charts/card-context.d.ts.map +1 -0
- package/dist/charts/card-context.js +7 -0
- package/dist/charts/chart-box.module.css +64 -0
- package/{src/content/article-card.module.css.d.ts → dist/charts/chart-box.module.css.d.ts} +5 -9
- package/dist/charts/chart-card.module.css +25 -0
- package/dist/{dashboard/widget-grid.module.css.d.ts → charts/chart-card.module.css.d.ts} +1 -3
- package/dist/charts/chart-legend.module.css +38 -0
- package/{src/dashboard/widget-grid.module.css.d.ts → dist/charts/chart-legend.module.css.d.ts} +3 -3
- package/dist/charts/compile.d.ts +62 -0
- package/dist/charts/compile.d.ts.map +1 -0
- package/dist/charts/compile.js +386 -0
- package/dist/charts/cursor.d.ts +50 -0
- package/dist/charts/cursor.d.ts.map +1 -0
- package/dist/charts/cursor.js +157 -0
- package/dist/charts/curves.d.ts +12 -0
- package/dist/charts/curves.d.ts.map +1 -0
- package/dist/charts/curves.js +86 -0
- package/dist/charts/donut.module.css +54 -0
- package/dist/{content/article-card.module.css.d.ts → charts/donut.module.css.d.ts} +2 -9
- package/dist/charts/host.d.ts +17 -0
- package/dist/charts/host.d.ts.map +1 -0
- package/dist/charts/host.js +35 -0
- package/dist/charts/index.d.ts +18 -53
- package/dist/charts/index.d.ts.map +1 -1
- package/dist/charts/index.js +17 -189
- package/dist/charts/legend.d.ts +23 -0
- package/dist/charts/legend.d.ts.map +1 -0
- package/dist/charts/legend.js +160 -0
- package/dist/charts/marks.d.ts +25 -0
- package/dist/charts/marks.d.ts.map +1 -0
- package/dist/charts/marks.js +128 -0
- package/dist/charts/panel.d.ts +56 -0
- package/dist/charts/panel.d.ts.map +1 -0
- package/dist/charts/panel.js +123 -0
- package/dist/charts/scales.d.ts +44 -0
- package/dist/charts/scales.d.ts.map +1 -0
- package/dist/charts/scales.js +163 -0
- package/dist/charts/sizing.d.ts +12 -0
- package/dist/charts/sizing.d.ts.map +1 -0
- package/dist/charts/sizing.js +33 -0
- package/dist/charts/state.d.ts +17 -0
- package/dist/charts/state.d.ts.map +1 -0
- package/dist/charts/state.js +53 -0
- package/dist/charts/theme.d.ts +38 -19
- package/dist/charts/theme.d.ts.map +1 -1
- package/dist/charts/theme.js +48 -26
- package/dist/charts/types.d.ts +227 -0
- package/dist/charts/types.d.ts.map +1 -0
- package/dist/charts/types.js +4 -0
- package/dist/cli/audit-allows.d.ts +4 -17
- package/dist/cli/audit-allows.d.ts.map +1 -1
- package/dist/cli/config.d.ts +14 -43
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/doctor-upgrade.d.ts +31 -0
- package/dist/cli/doctor-upgrade.d.ts.map +1 -0
- package/dist/cli/doctor-upgrade.js +269 -0
- package/dist/cli/doctor.d.ts +13 -29
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +51 -9
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +2 -4
- package/dist/cli/index.d.ts +48 -172
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +39 -132
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +43 -37
- package/dist/cli/sync.d.ts +5 -21
- package/dist/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js +4 -23
- package/dist/cli/tokens-css.d.ts +7 -28
- package/dist/cli/tokens-css.d.ts.map +1 -1
- package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
- package/dist/commands/ShortcutsHelp.js +4 -5
- package/dist/commands/define-commands.d.ts +15 -31
- package/dist/commands/define-commands.d.ts.map +1 -1
- package/dist/commands/define-commands.js +1 -11
- package/dist/commands/define-overlays.d.ts +5 -19
- package/dist/commands/define-overlays.d.ts.map +1 -1
- package/dist/commands/define-overlays.js +3 -11
- package/dist/commands/index.d.ts +10 -40
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +9 -46
- package/dist/{notifications → commands/notifications}/bell.d.ts +1 -1
- package/dist/commands/notifications/bell.d.ts.map +1 -0
- package/dist/{notifications → commands/notifications}/center.d.ts +2 -2
- package/dist/commands/notifications/center.d.ts.map +1 -0
- package/dist/{notifications → commands/notifications}/center.js +2 -2
- package/dist/{notifications → commands/notifications}/define-notifications.d.ts +3 -3
- package/dist/commands/notifications/define-notifications.d.ts.map +1 -0
- package/dist/commands/notifications/notify.d.ts +44 -0
- package/dist/commands/notifications/notify.d.ts.map +1 -0
- package/dist/commands/notifications/notify.js +79 -0
- package/dist/{notifications → commands/notifications}/store.d.ts +2 -0
- package/dist/commands/notifications/store.d.ts.map +1 -0
- package/dist/{notifications → commands/notifications}/store.js +4 -0
- package/dist/commands/projectors.d.ts +1 -131
- package/dist/commands/projectors.d.ts.map +1 -1
- package/dist/commands/projectors.js +2 -73
- package/dist/commands/shell-bridge.d.ts +3 -3
- package/dist/commands/shortcut-format.d.ts +5 -4
- package/dist/commands/shortcut-format.d.ts.map +1 -1
- package/dist/common/errors.d.ts +3 -3
- package/dist/common/use-measured-widths.d.ts.map +1 -1
- package/dist/common/use-measured-widths.js +5 -3
- package/dist/common/validate.d.ts +2 -2
- package/dist/content/article-layout.d.ts.map +1 -1
- package/dist/content/article-layout.js +3 -3
- package/dist/content/article-model.d.ts +1 -46
- package/dist/content/article-model.d.ts.map +1 -1
- package/dist/content/article-model.js +1 -29
- package/dist/content/index.d.ts +11 -41
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +3 -35
- package/dist/content/markdown.d.ts +1 -1
- package/dist/content/markdown.d.ts.map +1 -1
- package/dist/content/markdown.js +1 -1
- package/dist/content/mermaid.d.ts.map +1 -1
- package/dist/content/mermaid.js +7 -7
- package/dist/content/slug.d.ts +1 -8
- package/dist/content/slug.d.ts.map +1 -1
- package/dist/content/slug.js +1 -8
- package/dist/content/url-hardening.d.ts +2 -2
- package/dist/content/url-hardening.d.ts.map +1 -1
- package/dist/content/url-hardening.js +2 -0
- package/dist/controls/actions.d.ts +16 -1
- package/dist/controls/actions.d.ts.map +1 -1
- package/dist/controls/enum-filter.d.ts +1 -1
- package/dist/controls/enum-filter.d.ts.map +1 -1
- package/dist/controls/filter-context.d.ts.map +1 -1
- package/dist/controls/filter-context.js +3 -1
- package/dist/controls/filter-set.js +4 -6
- package/dist/controls/form-layout.d.ts +1 -1
- package/dist/controls/form-layout.d.ts.map +1 -1
- package/dist/controls/form-layout.js +1 -1
- package/dist/controls/glyphs.d.ts +0 -2
- package/dist/controls/glyphs.d.ts.map +1 -1
- package/dist/controls/glyphs.js +0 -7
- package/dist/controls/index.d.ts +12 -17
- package/dist/controls/index.d.ts.map +1 -1
- package/dist/controls/index.js +5 -39
- package/dist/controls/multi-select-filter.d.ts +4 -3
- package/dist/controls/multi-select-filter.d.ts.map +1 -1
- package/dist/controls/number-filter.d.ts +4 -3
- package/dist/controls/number-filter.d.ts.map +1 -1
- package/dist/controls/number-filter.js +3 -1
- package/dist/controls/range-filter.d.ts +4 -3
- package/dist/controls/range-filter.d.ts.map +1 -1
- package/dist/controls/search-filter.d.ts +4 -3
- package/dist/controls/search-filter.d.ts.map +1 -1
- package/dist/controls/search-filter.js +19 -14
- package/dist/controls/select-filter.d.ts +4 -3
- package/dist/controls/select-filter.d.ts.map +1 -1
- package/dist/controls/sync-button.d.ts.map +1 -1
- package/dist/controls/sync-button.js +12 -15
- package/dist/controls/toggle-filter.d.ts +4 -3
- package/dist/controls/toggle-filter.d.ts.map +1 -1
- package/dist/controls/uncontrolled.d.ts +12 -0
- package/dist/controls/uncontrolled.d.ts.map +1 -0
- package/dist/controls/view-tabs.d.ts +2 -2
- package/dist/controls/view-tabs.d.ts.map +1 -1
- package/dist/controls-dates/index.d.ts +0 -1
- package/dist/controls-dates/index.d.ts.map +1 -1
- package/dist/dashboard/index.d.ts +7 -9
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/index.js +3 -23
- package/dist/dashboard/section.d.ts +4 -6
- package/dist/dashboard/section.d.ts.map +1 -1
- package/dist/dashboard/section.js +4 -10
- package/dist/dashboard/stat-card.d.ts +4 -4
- package/dist/dashboard/stat-card.d.ts.map +1 -1
- package/dist/dashboard/stat-card.js +3 -3
- package/dist/dashboard/widget-header.module.css +9 -7
- package/dist/dev-dock.d.ts.map +1 -1
- package/dist/dev-dock.js +6 -1
- package/dist/format/date.d.ts +0 -34
- package/dist/format/date.d.ts.map +1 -1
- package/dist/format/date.js +0 -54
- package/dist/format/index.d.ts +7 -22
- package/dist/format/index.d.ts.map +1 -1
- package/dist/format/index.js +2 -43
- package/dist/format/number.d.ts +3 -14
- package/dist/format/number.d.ts.map +1 -1
- package/dist/format/number.js +0 -13
- package/dist/format/shared.d.ts +2 -3
- package/dist/format/shared.d.ts.map +1 -1
- package/dist/forms/index.d.ts +0 -11
- package/dist/forms/index.d.ts.map +1 -1
- package/dist/forms/index.js +1 -14
- package/dist/guard/index.d.ts +6 -21
- package/dist/guard/index.d.ts.map +1 -1
- package/dist/guard/index.js +27 -115
- package/dist/guard/types.d.ts +7 -18
- package/dist/guard/types.d.ts.map +1 -1
- package/dist/index.d.ts +16 -48
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -117
- package/dist/provider/create-router.d.ts +44 -0
- package/dist/provider/create-router.d.ts.map +1 -0
- package/dist/provider/create-router.js +62 -0
- package/dist/provider/hotkeys.d.ts +8 -0
- package/dist/provider/hotkeys.d.ts.map +1 -0
- package/dist/provider/hotkeys.js +50 -0
- package/dist/provider/index.d.ts +33 -110
- package/dist/provider/index.d.ts.map +1 -1
- package/dist/provider/index.js +182 -82
- package/dist/provider/lab-theme.d.ts.map +1 -1
- package/dist/provider/route-transition.d.ts +76 -0
- package/dist/provider/route-transition.d.ts.map +1 -0
- package/dist/provider/route-transition.js +98 -0
- package/dist/provider/spotlight-actions.d.ts +10 -0
- package/dist/provider/spotlight-actions.d.ts.map +1 -0
- package/dist/provider/spotlight-actions.js +55 -0
- package/dist/provider/test-router.d.ts +6 -0
- package/dist/provider/test-router.d.ts.map +1 -0
- package/dist/provider/test-router.js +18 -0
- package/dist/query-client.d.ts +4 -20
- package/dist/query-client.d.ts.map +1 -1
- package/dist/query-client.js +2 -2
- package/dist/router-tanstack/index.d.ts +18 -64
- package/dist/router-tanstack/index.d.ts.map +1 -1
- package/dist/router-tanstack/index.js +2 -16
- package/dist/router-tanstack/nav.d.ts +12 -1
- package/dist/router-tanstack/nav.d.ts.map +1 -1
- package/dist/router-tanstack/nav.js +8 -1
- package/dist/router-tanstack/search-store.d.ts +1 -1
- package/dist/router-tanstack/search-store.d.ts.map +1 -1
- package/dist/router-tanstack/use-nav.d.ts +8 -9
- package/dist/router-tanstack/use-nav.d.ts.map +1 -1
- package/dist/router-tanstack/use-nav.js +20 -1
- package/dist/shell/app-mobile-nav.d.ts.map +1 -1
- package/dist/shell/app-sidebar.js +1 -1
- package/dist/shell/index.d.ts +31 -10
- package/dist/shell/index.d.ts.map +1 -1
- package/dist/shell/index.js +14 -3
- package/dist/shell/page-aside.d.ts +2 -2
- package/dist/shell/page-aside.d.ts.map +1 -1
- package/dist/shell/page-aside.js +31 -12
- package/dist/shell/page-bar.d.ts +2 -2
- package/dist/shell/page-bar.d.ts.map +1 -1
- package/dist/shell/page-bar.js +1 -1
- package/dist/state.d.ts +10 -12
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +4 -6
- package/dist/styles.css +107 -7
- package/dist/surfaces.d.ts +28 -103
- package/dist/surfaces.d.ts.map +1 -1
- package/dist/surfaces.js +54 -143
- package/dist/{data → table}/data-table-state.d.ts +1 -1
- package/dist/table/data-table-state.d.ts.map +1 -0
- package/dist/{data → table}/data-table-state.js +4 -3
- package/dist/{data → table}/data-table.d.ts +28 -49
- package/dist/table/data-table.d.ts.map +1 -0
- package/dist/{data → table}/data-table.js +74 -60
- package/dist/table/index.d.ts +18 -0
- package/dist/table/index.d.ts.map +1 -0
- package/dist/{data/table.js → table/index.js} +1 -1
- package/dist/table/query-branch.d.ts.map +1 -0
- package/dist/table/table-features.d.ts +69 -0
- package/dist/table/table-features.d.ts.map +1 -0
- package/dist/table/table-features.js +49 -0
- package/dist/telemetry.d.ts +77 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +33 -0
- package/dist/theme/index.d.ts +10 -21
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +3 -14
- package/dist/theme/theme-toggle.d.ts.map +1 -1
- package/dist/theme/theme-toggle.js +7 -33
- package/dist/theme/theme-toggle.module.css +30 -0
- package/dist/theme/theme-toggle.module.css.d.ts +10 -0
- package/dist/theme-lab/derive-controls.d.ts.map +1 -1
- package/dist/theme-lab/derive-controls.js +5 -3
- package/dist/theme-lab/derive-state.d.ts.map +1 -1
- package/dist/theme-lab/derive-state.js +2 -1
- package/dist/tokens/core.d.ts +360 -0
- package/dist/tokens/core.d.ts.map +1 -0
- package/dist/tokens/core.js +708 -0
- package/dist/tokens/derive.d.ts +1 -1
- package/dist/tokens/derive.d.ts.map +1 -1
- package/dist/tokens/index.d.ts +5 -373
- package/dist/tokens/index.d.ts.map +1 -1
- package/dist/tokens/index.js +8 -700
- package/dist/tokens/palette.d.ts +2 -6
- package/dist/tokens/palette.d.ts.map +1 -1
- package/dist/tokens/palette.js +1 -4
- package/dist/vite.d.ts +4 -3
- package/dist/vite.d.ts.map +1 -1
- package/llms.txt +43 -85
- package/package.json +77 -170
- package/src/agent/ai-sdk-transport.ts +57 -37
- package/src/{agent-chat → agent/chat}/composer.tsx +29 -30
- package/src/{agent-chat → agent/chat}/message-affordances.ts +8 -5
- package/src/{agent-chat → agent/chat}/thread-feed-row.tsx +30 -35
- package/src/{agent-chat → agent/chat}/thread-feed.tsx +40 -35
- package/src/{agent-chat → agent/chat}/thread-message.tsx +37 -35
- package/src/{agent-chat → agent/chat}/thread-outcome-card.tsx +5 -5
- package/src/{agent-chat → agent/chat}/tool-chip.tsx +12 -12
- package/src/{agent-chat → agent/chat}/use-keyboard-inset.ts +1 -1
- package/src/{agent-chat → agent/chat}/virtualize.ts +5 -5
- package/src/agent/error.ts +43 -0
- package/src/agent/history.ts +2 -107
- package/src/agent/id.ts +4 -5
- package/src/agent/index.ts +23 -112
- package/src/agent/outcome.ts +3 -56
- package/src/agent/part-list.tsx +3 -3
- package/src/agent/parts.ts +23 -22
- package/src/agent/run-committer.ts +64 -0
- package/src/agent/run-records.ts +147 -0
- package/src/agent/thread.ts +24 -231
- package/src/agent/transport.ts +6 -96
- package/src/agent/use-agent-thread-runs.ts +364 -199
- package/src/charts/BandStrip.tsx +276 -0
- package/src/charts/Bars.tsx +141 -0
- package/src/charts/CartesianChart.tsx +206 -0
- package/src/charts/ChartCard.tsx +178 -0
- package/src/charts/Donut.tsx +256 -0
- package/src/charts/DualPanel.tsx +326 -0
- package/src/charts/Heatmap.tsx +282 -0
- package/src/charts/Lines.tsx +151 -0
- package/src/charts/MirroredBars.tsx +303 -0
- package/src/charts/Sparkline.tsx +176 -0
- package/src/charts/StackedArea.tsx +80 -0
- package/src/charts/box.tsx +96 -0
- package/src/charts/card-context.ts +11 -0
- package/src/charts/chart-box.module.css +64 -0
- package/src/charts/chart-box.module.css.d.ts +12 -0
- package/src/charts/chart-card.module.css +25 -0
- package/src/charts/chart-card.module.css.d.ts +8 -0
- package/src/charts/chart-legend.module.css +38 -0
- package/src/charts/chart-legend.module.css.d.ts +10 -0
- package/src/charts/compile.ts +585 -0
- package/src/charts/cursor.ts +282 -0
- package/src/charts/curves.ts +111 -0
- package/src/charts/donut.module.css +54 -0
- package/src/charts/donut.module.css.d.ts +9 -0
- package/src/charts/host.tsx +60 -0
- package/src/charts/index.ts +41 -178
- package/src/charts/legend.tsx +204 -0
- package/src/charts/marks.ts +201 -0
- package/src/charts/panel.tsx +227 -0
- package/src/charts/scales.ts +237 -0
- package/src/charts/sizing.ts +47 -0
- package/src/charts/state.tsx +80 -0
- package/src/charts/theme.ts +65 -0
- package/src/charts/types.ts +242 -0
- package/src/cli/audit-allows.ts +8 -30
- package/src/cli/config.ts +14 -43
- package/src/cli/doctor-upgrade.ts +392 -0
- package/src/cli/doctor.ts +81 -72
- package/src/cli/help.ts +2 -4
- package/src/cli/index.ts +100 -384
- package/src/cli/init.ts +60 -51
- package/src/cli/sync.ts +13 -68
- package/src/cli/tokens-css.ts +7 -28
- package/src/commands/ShortcutsHelp.tsx +8 -9
- package/src/commands/define-commands.ts +16 -43
- package/src/commands/define-overlays.ts +12 -36
- package/src/commands/index.ts +11 -94
- package/src/{notifications → commands/notifications}/bell.tsx +2 -2
- package/src/{notifications → commands/notifications}/center.tsx +7 -5
- package/src/{notifications → commands/notifications}/define-notifications.ts +3 -3
- package/src/commands/notifications/notify.tsx +158 -0
- package/src/{notifications → commands/notifications}/store.ts +10 -2
- package/src/commands/projectors.ts +5 -225
- package/src/commands/shell-bridge.ts +5 -5
- package/src/commands/shortcut-format.ts +5 -4
- package/src/common/errors.ts +3 -3
- package/src/common/use-measured-widths.ts +6 -3
- package/src/common/validate.ts +2 -2
- package/src/content/article-layout.tsx +37 -38
- package/src/content/article-model.ts +1 -84
- package/src/content/index.ts +12 -83
- package/src/content/markdown.tsx +4 -3
- package/src/content/mermaid.tsx +9 -7
- package/src/content/slug.ts +1 -16
- package/src/content/url-hardening.ts +8 -2
- package/src/controls/actions.tsx +24 -1
- package/src/controls/enum-filter.tsx +1 -1
- package/src/controls/filter-context.tsx +3 -1
- package/src/controls/filter-set.tsx +5 -7
- package/src/controls/form-layout.tsx +2 -2
- package/src/controls/glyphs.tsx +0 -10
- package/src/controls/index.ts +13 -64
- package/src/controls/multi-select-filter.tsx +5 -4
- package/src/controls/number-filter.tsx +8 -4
- package/src/controls/range-filter.tsx +5 -4
- package/src/controls/search-filter.tsx +25 -19
- package/src/controls/select-filter.tsx +5 -4
- package/src/controls/sync-button.tsx +18 -20
- package/src/controls/toggle-filter.tsx +5 -4
- package/src/controls/uncontrolled.ts +12 -0
- package/src/controls/view-tabs.tsx +3 -3
- package/src/controls-dates/date-range-picker.tsx +1 -1
- package/src/controls-dates/index.ts +0 -1
- package/src/dashboard/index.ts +7 -48
- package/src/dashboard/section.tsx +11 -40
- package/src/dashboard/stat-card.tsx +14 -16
- package/src/dashboard/widget-header.module.css +9 -7
- package/src/dev-dock.tsx +14 -27
- package/src/format/date.ts +2 -92
- package/src/format/index.ts +7 -53
- package/src/format/number.ts +3 -26
- package/src/format/shared.ts +2 -3
- package/src/forms/index.ts +0 -23
- package/src/guard/index.ts +36 -191
- package/src/guard/types.ts +6 -19
- package/src/index.ts +30 -282
- package/src/provider/create-router.tsx +138 -0
- package/src/provider/hotkeys.ts +70 -0
- package/src/provider/index.tsx +260 -230
- package/src/provider/lab-theme.ts +3 -2
- package/src/provider/route-transition.ts +199 -0
- package/src/provider/spotlight-actions.tsx +69 -0
- package/src/provider/test-router.tsx +25 -0
- package/src/query-client.ts +4 -22
- package/src/router-tanstack/index.ts +18 -112
- package/src/router-tanstack/nav.ts +28 -2
- package/src/router-tanstack/search-store.ts +9 -2
- package/src/router-tanstack/use-nav.ts +47 -13
- package/src/shell/app-mobile-nav.tsx +3 -2
- package/src/shell/app-sidebar.tsx +1 -1
- package/src/shell/aside-docking.ts +1 -1
- package/src/shell/index.tsx +61 -20
- package/src/shell/page-aside.tsx +47 -23
- package/src/shell/page-bar.tsx +3 -3
- package/src/shell/page-title.tsx +1 -1
- package/src/state.ts +11 -37
- package/src/styles.css +107 -7
- package/src/surfaces.ts +56 -151
- package/src/{data → table}/data-table-state.ts +5 -4
- package/src/{data → table}/data-table.tsx +170 -161
- package/src/table/index.ts +18 -0
- package/src/table/table-features.ts +102 -0
- package/src/telemetry.ts +110 -0
- package/src/theme/index.ts +22 -47
- package/src/theme/theme-toggle.module.css +30 -0
- package/src/theme/theme-toggle.module.css.d.ts +10 -0
- package/src/theme/theme-toggle.tsx +15 -43
- package/src/theme-lab/derive-controls.tsx +5 -3
- package/src/theme-lab/derive-state.ts +2 -1
- package/src/tokens/core.ts +1163 -0
- package/src/tokens/derive.ts +1 -1
- package/src/tokens/index.ts +14 -1181
- package/src/tokens/palette.ts +3 -7
- package/src/vite.ts +3 -3
- package/agent/templates/query-client.ts.tpl +0 -26
- package/dist/agent/adapter.d.ts +0 -150
- package/dist/agent/adapter.d.ts.map +0 -1
- package/dist/agent/adapter.js +0 -482
- package/dist/agent/use-agent-stream.d.ts +0 -35
- package/dist/agent/use-agent-stream.d.ts.map +0 -1
- package/dist/agent/use-agent-stream.js +0 -59
- package/dist/agent-chat/composer.d.ts.map +0 -1
- package/dist/agent-chat/index.d.ts +0 -31
- package/dist/agent-chat/index.d.ts.map +0 -1
- package/dist/agent-chat/index.js +0 -19
- package/dist/agent-chat/message-affordances.d.ts.map +0 -1
- package/dist/agent-chat/relative-time.d.ts.map +0 -1
- package/dist/agent-chat/thread-detail-panel.d.ts +0 -28
- package/dist/agent-chat/thread-detail-panel.d.ts.map +0 -1
- package/dist/agent-chat/thread-detail-panel.js +0 -115
- package/dist/agent-chat/thread-feed-row.d.ts.map +0 -1
- package/dist/agent-chat/thread-feed.d.ts.map +0 -1
- package/dist/agent-chat/thread-message.d.ts.map +0 -1
- package/dist/agent-chat/thread-outcome-card.d.ts.map +0 -1
- package/dist/agent-chat/thread-workspace.d.ts +0 -44
- package/dist/agent-chat/thread-workspace.d.ts.map +0 -1
- package/dist/agent-chat/thread-workspace.js +0 -153
- package/dist/agent-chat/tool-chip.d.ts.map +0 -1
- package/dist/agent-chat/use-keyboard-inset.d.ts.map +0 -1
- package/dist/agent-chat/virtualize.d.ts.map +0 -1
- package/dist/charts/cursor/resolve.d.ts +0 -75
- package/dist/charts/cursor/resolve.d.ts.map +0 -1
- package/dist/charts/cursor/resolve.js +0 -91
- package/dist/charts/cursor/scope.d.ts +0 -20
- package/dist/charts/cursor/scope.d.ts.map +0 -1
- package/dist/charts/cursor/scope.js +0 -20
- package/dist/charts/cursor/store.d.ts +0 -35
- package/dist/charts/cursor/store.d.ts.map +0 -1
- package/dist/charts/cursor/store.js +0 -25
- package/dist/charts/cursor/touch-pin.d.ts +0 -45
- package/dist/charts/cursor/touch-pin.d.ts.map +0 -1
- package/dist/charts/cursor/touch-pin.js +0 -79
- package/dist/charts/hooks/use-discrete-cursor.d.ts +0 -66
- package/dist/charts/hooks/use-discrete-cursor.d.ts.map +0 -1
- package/dist/charts/hooks/use-discrete-cursor.js +0 -198
- package/dist/charts/hooks/use-hysteresis.d.ts +0 -18
- package/dist/charts/hooks/use-hysteresis.d.ts.map +0 -1
- package/dist/charts/hooks/use-hysteresis.js +0 -12
- package/dist/charts/hooks/useBandPlot.d.ts +0 -145
- package/dist/charts/hooks/useBandPlot.d.ts.map +0 -1
- package/dist/charts/hooks/useBandPlot.js +0 -178
- package/dist/charts/hooks/useChartCursor.d.ts +0 -75
- package/dist/charts/hooks/useChartCursor.d.ts.map +0 -1
- package/dist/charts/hooks/useChartCursor.js +0 -200
- package/dist/charts/hooks/useChartSize.d.ts +0 -29
- package/dist/charts/hooks/useChartSize.d.ts.map +0 -1
- package/dist/charts/hooks/useChartSize.js +0 -8
- package/dist/charts/kinds/BandStrip.d.ts +0 -132
- package/dist/charts/kinds/BandStrip.d.ts.map +0 -1
- package/dist/charts/kinds/BandStrip.js +0 -241
- package/dist/charts/kinds/Bars.d.ts +0 -141
- package/dist/charts/kinds/Bars.d.ts.map +0 -1
- package/dist/charts/kinds/Bars.js +0 -343
- package/dist/charts/kinds/Donut.d.ts +0 -77
- package/dist/charts/kinds/Donut.d.ts.map +0 -1
- package/dist/charts/kinds/Donut.js +0 -245
- package/dist/charts/kinds/DualPanel.d.ts +0 -111
- package/dist/charts/kinds/DualPanel.d.ts.map +0 -1
- package/dist/charts/kinds/DualPanel.js +0 -471
- package/dist/charts/kinds/Heatmap.d.ts +0 -85
- package/dist/charts/kinds/Heatmap.d.ts.map +0 -1
- package/dist/charts/kinds/Heatmap.js +0 -243
- package/dist/charts/kinds/MirroredBars.d.ts +0 -98
- package/dist/charts/kinds/MirroredBars.d.ts.map +0 -1
- package/dist/charts/kinds/MirroredBars.js +0 -292
- package/dist/charts/kinds/MultiLine.d.ts +0 -87
- package/dist/charts/kinds/MultiLine.d.ts.map +0 -1
- package/dist/charts/kinds/MultiLine.js +0 -176
- package/dist/charts/kinds/StackedArea.d.ts +0 -73
- package/dist/charts/kinds/StackedArea.d.ts.map +0 -1
- package/dist/charts/kinds/StackedArea.js +0 -135
- package/dist/charts/kinds/ZonedLine.d.ts +0 -97
- package/dist/charts/kinds/ZonedLine.d.ts.map +0 -1
- package/dist/charts/kinds/ZonedLine.js +0 -155
- package/dist/charts/kinds/band-chrome.d.ts +0 -31
- package/dist/charts/kinds/band-chrome.d.ts.map +0 -1
- package/dist/charts/kinds/band-chrome.js +0 -71
- package/dist/charts/kinds/donut-layout.d.ts +0 -47
- package/dist/charts/kinds/donut-layout.d.ts.map +0 -1
- package/dist/charts/kinds/donut-layout.js +0 -52
- package/dist/charts/layout/auto-margin.d.ts +0 -122
- package/dist/charts/layout/auto-margin.d.ts.map +0 -1
- package/dist/charts/layout/auto-margin.js +0 -81
- package/dist/charts/layout/end-labels.d.ts +0 -64
- package/dist/charts/layout/end-labels.d.ts.map +0 -1
- package/dist/charts/layout/end-labels.js +0 -76
- package/dist/charts/layout/log-ticks.d.ts +0 -27
- package/dist/charts/layout/log-ticks.d.ts.map +0 -1
- package/dist/charts/layout/log-ticks.js +0 -42
- package/dist/charts/primitives/AreaGradient.d.ts +0 -18
- package/dist/charts/primitives/AreaGradient.d.ts.map +0 -1
- package/dist/charts/primitives/AreaGradient.js +0 -13
- package/dist/charts/primitives/Axes.d.ts +0 -83
- package/dist/charts/primitives/Axes.d.ts.map +0 -1
- package/dist/charts/primitives/Axes.js +0 -168
- package/dist/charts/primitives/CartesianChart.d.ts +0 -257
- package/dist/charts/primitives/CartesianChart.d.ts.map +0 -1
- package/dist/charts/primitives/CartesianChart.js +0 -549
- package/dist/charts/primitives/ChartCard.d.ts +0 -66
- package/dist/charts/primitives/ChartCard.d.ts.map +0 -1
- package/dist/charts/primitives/ChartCard.js +0 -143
- package/dist/charts/primitives/ChartFrame.d.ts +0 -156
- package/dist/charts/primitives/ChartFrame.d.ts.map +0 -1
- package/dist/charts/primitives/ChartFrame.js +0 -241
- package/dist/charts/primitives/ChartLegend.d.ts +0 -67
- package/dist/charts/primitives/ChartLegend.d.ts.map +0 -1
- package/dist/charts/primitives/ChartLegend.js +0 -292
- package/dist/charts/primitives/ChartPending.d.ts +0 -113
- package/dist/charts/primitives/ChartPending.d.ts.map +0 -1
- package/dist/charts/primitives/ChartPending.js +0 -117
- package/dist/charts/primitives/ChartTooltip.d.ts +0 -59
- package/dist/charts/primitives/ChartTooltip.d.ts.map +0 -1
- package/dist/charts/primitives/ChartTooltip.js +0 -197
- package/dist/charts/primitives/Crosshair.d.ts +0 -26
- package/dist/charts/primitives/Crosshair.d.ts.map +0 -1
- package/dist/charts/primitives/Crosshair.js +0 -23
- package/dist/charts/primitives/HatchPattern.d.ts +0 -31
- package/dist/charts/primitives/HatchPattern.d.ts.map +0 -1
- package/dist/charts/primitives/HatchPattern.js +0 -31
- package/dist/charts/primitives/HoverOverlay.d.ts +0 -45
- package/dist/charts/primitives/HoverOverlay.d.ts.map +0 -1
- package/dist/charts/primitives/HoverOverlay.js +0 -72
- package/dist/charts/primitives/HoverOverlay.module.css +0 -13
- package/dist/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
- package/dist/charts/primitives/XZoneRects.d.ts +0 -54
- package/dist/charts/primitives/XZoneRects.d.ts.map +0 -1
- package/dist/charts/primitives/XZoneRects.js +0 -65
- package/dist/charts/primitives/ZoneRects.d.ts +0 -38
- package/dist/charts/primitives/ZoneRects.d.ts.map +0 -1
- package/dist/charts/primitives/ZoneRects.js +0 -30
- package/dist/charts/primitives/chart-card-context.d.ts +0 -33
- package/dist/charts/primitives/chart-card-context.d.ts.map +0 -1
- package/dist/charts/primitives/chart-card-context.js +0 -18
- package/dist/charts/primitives/chart-frame-layout.d.ts +0 -185
- package/dist/charts/primitives/chart-frame-layout.d.ts.map +0 -1
- package/dist/charts/primitives/chart-frame-layout.js +0 -175
- package/dist/charts/primitives/chart-layout.d.ts +0 -112
- package/dist/charts/primitives/chart-layout.d.ts.map +0 -1
- package/dist/charts/primitives/chart-layout.js +0 -175
- package/dist/charts/primitives/chart-tier.d.ts +0 -16
- package/dist/charts/primitives/chart-tier.d.ts.map +0 -1
- package/dist/charts/primitives/chart-tier.js +0 -44
- package/dist/charts/primitives/legend-disclosure.d.ts +0 -27
- package/dist/charts/primitives/legend-disclosure.d.ts.map +0 -1
- package/dist/charts/primitives/legend-disclosure.js +0 -153
- package/dist/charts/series.d.ts +0 -189
- package/dist/charts/series.d.ts.map +0 -1
- package/dist/charts/series.js +0 -84
- package/dist/charts/sparklines/BarSparkline.d.ts +0 -37
- package/dist/charts/sparklines/BarSparkline.d.ts.map +0 -1
- package/dist/charts/sparklines/BarSparkline.js +0 -53
- package/dist/charts/sparklines/LineSparkline.d.ts +0 -15
- package/dist/charts/sparklines/LineSparkline.d.ts.map +0 -1
- package/dist/charts/sparklines/LineSparkline.js +0 -51
- package/dist/charts/sparklines/index.d.ts +0 -3
- package/dist/charts/sparklines/index.d.ts.map +0 -1
- package/dist/charts/sparklines/index.js +0 -6
- package/dist/charts/utils/domain.d.ts +0 -35
- package/dist/charts/utils/domain.d.ts.map +0 -1
- package/dist/charts/utils/domain.js +0 -12
- package/dist/charts/utils/format.d.ts +0 -8
- package/dist/charts/utils/format.d.ts.map +0 -1
- package/dist/charts/utils/format.js +0 -20
- package/dist/charts/utils/measure-text.d.ts +0 -25
- package/dist/charts/utils/measure-text.d.ts.map +0 -1
- package/dist/charts/utils/measure-text.js +0 -64
- package/dist/charts/utils/ticks.d.ts +0 -103
- package/dist/charts/utils/ticks.d.ts.map +0 -1
- package/dist/charts/utils/ticks.js +0 -92
- package/dist/commands/overlays-mount.d.ts +0 -122
- package/dist/commands/overlays-mount.d.ts.map +0 -1
- package/dist/commands/overlays-mount.js +0 -125
- package/dist/commands/useCommandHotkeys.d.ts +0 -14
- package/dist/commands/useCommandHotkeys.d.ts.map +0 -1
- package/dist/commands/useCommandHotkeys.js +0 -45
- package/dist/content/article-actions.d.ts +0 -39
- package/dist/content/article-actions.d.ts.map +0 -1
- package/dist/content/article-actions.js +0 -28
- package/dist/content/article-card.d.ts +0 -58
- package/dist/content/article-card.d.ts.map +0 -1
- package/dist/content/article-card.js +0 -79
- package/dist/content/article-card.module.css +0 -111
- package/dist/content/mdx.d.ts +0 -20
- package/dist/content/mdx.d.ts.map +0 -1
- package/dist/content/mdx.js +0 -64
- package/dist/controls/compare-filter.d.ts +0 -42
- package/dist/controls/compare-filter.d.ts.map +0 -1
- package/dist/controls/compare-filter.js +0 -38
- package/dist/controls/slider-control.d.ts +0 -36
- package/dist/controls/slider-control.d.ts.map +0 -1
- package/dist/controls/slider-control.js +0 -64
- package/dist/dashboard/widget-grid.d.ts +0 -27
- package/dist/dashboard/widget-grid.d.ts.map +0 -1
- package/dist/dashboard/widget-grid.js +0 -40
- package/dist/dashboard/widget-grid.module.css +0 -69
- package/dist/data/data-table-state.d.ts.map +0 -1
- package/dist/data/data-table.d.ts.map +0 -1
- package/dist/data/query-branch.d.ts.map +0 -1
- package/dist/data/table.d.ts +0 -24
- package/dist/data/table.d.ts.map +0 -1
- package/dist/data/virtual-list.d.ts +0 -133
- package/dist/data/virtual-list.d.ts.map +0 -1
- package/dist/data/virtual-list.js +0 -157
- package/dist/data/virtual.d.ts +0 -21
- package/dist/data/virtual.d.ts.map +0 -1
- package/dist/data/virtual.js +0 -4
- package/dist/forms/FormErrorSummary.d.ts +0 -30
- package/dist/forms/FormErrorSummary.d.ts.map +0 -1
- package/dist/forms/FormErrorSummary.js +0 -30
- package/dist/forms/use-field-array.d.ts +0 -60
- package/dist/forms/use-field-array.d.ts.map +0 -1
- package/dist/forms/use-field-array.js +0 -20
- package/dist/forms/use-form-draft.d.ts +0 -76
- package/dist/forms/use-form-draft.d.ts.map +0 -1
- package/dist/forms/use-form-draft.js +0 -92
- package/dist/forms/use-form-submit.d.ts +0 -88
- package/dist/forms/use-form-submit.d.ts.map +0 -1
- package/dist/forms/use-form-submit.js +0 -63
- package/dist/notifications/bell.d.ts.map +0 -1
- package/dist/notifications/center.d.ts.map +0 -1
- package/dist/notifications/define-notifications.d.ts.map +0 -1
- package/dist/notifications/index.d.ts +0 -40
- package/dist/notifications/index.d.ts.map +0 -1
- package/dist/notifications/index.js +0 -54
- package/dist/notifications/mount-guard.d.ts +0 -8
- package/dist/notifications/mount-guard.d.ts.map +0 -1
- package/dist/notifications/mount-guard.js +0 -18
- package/dist/notifications/notify.d.ts +0 -149
- package/dist/notifications/notify.d.ts.map +0 -1
- package/dist/notifications/notify.js +0 -171
- package/dist/notifications/store.d.ts.map +0 -1
- package/dist/provider/connectivity-indicator.d.ts +0 -13
- package/dist/provider/connectivity-indicator.d.ts.map +0 -1
- package/dist/provider/connectivity-indicator.js +0 -205
- package/dist/provider/connectivity-provider.d.ts +0 -7
- package/dist/provider/connectivity-provider.d.ts.map +0 -1
- package/dist/provider/connectivity-provider.js +0 -128
- package/dist/provider/connectivity-types.d.ts +0 -36
- package/dist/provider/connectivity-types.d.ts.map +0 -1
- package/dist/provider/use-connectivity.d.ts +0 -3
- package/dist/provider/use-connectivity.d.ts.map +0 -1
- package/dist/provider/use-connectivity.js +0 -14
- package/dist/query-devtools.d.ts +0 -21
- package/dist/query-devtools.d.ts.map +0 -1
- package/dist/query-devtools.js +0 -13
- package/src/agent/adapter.ts +0 -945
- package/src/agent/use-agent-stream.ts +0 -154
- package/src/agent-chat/index.ts +0 -54
- package/src/agent-chat/thread-detail-panel.tsx +0 -201
- package/src/agent-chat/thread-workspace.tsx +0 -279
- package/src/charts/cursor/resolve.ts +0 -198
- package/src/charts/cursor/scope.tsx +0 -35
- package/src/charts/cursor/store.ts +0 -58
- package/src/charts/cursor/touch-pin.ts +0 -138
- package/src/charts/hooks/use-discrete-cursor.ts +0 -335
- package/src/charts/hooks/use-hysteresis.ts +0 -26
- package/src/charts/hooks/useBandPlot.ts +0 -383
- package/src/charts/hooks/useChartCursor.ts +0 -367
- package/src/charts/hooks/useChartSize.ts +0 -35
- package/src/charts/kinds/BandStrip.tsx +0 -449
- package/src/charts/kinds/Bars.tsx +0 -589
- package/src/charts/kinds/Donut.tsx +0 -368
- package/src/charts/kinds/DualPanel.tsx +0 -712
- package/src/charts/kinds/Heatmap.tsx +0 -396
- package/src/charts/kinds/MirroredBars.tsx +0 -469
- package/src/charts/kinds/MultiLine.tsx +0 -322
- package/src/charts/kinds/StackedArea.tsx +0 -267
- package/src/charts/kinds/ZonedLine.tsx +0 -301
- package/src/charts/kinds/band-chrome.tsx +0 -91
- package/src/charts/kinds/donut-layout.ts +0 -82
- package/src/charts/layout/auto-margin.ts +0 -242
- package/src/charts/layout/end-labels.ts +0 -135
- package/src/charts/layout/log-ticks.ts +0 -90
- package/src/charts/primitives/AreaGradient.tsx +0 -26
- package/src/charts/primitives/Axes.tsx +0 -271
- package/src/charts/primitives/CartesianChart.tsx +0 -1002
- package/src/charts/primitives/ChartCard.tsx +0 -280
- package/src/charts/primitives/ChartFrame.tsx +0 -493
- package/src/charts/primitives/ChartLegend.tsx +0 -422
- package/src/charts/primitives/ChartPending.tsx +0 -243
- package/src/charts/primitives/ChartTooltip.tsx +0 -265
- package/src/charts/primitives/Crosshair.tsx +0 -43
- package/src/charts/primitives/HatchPattern.tsx +0 -55
- package/src/charts/primitives/HoverOverlay.module.css +0 -13
- package/src/charts/primitives/HoverOverlay.module.css.d.ts +0 -8
- package/src/charts/primitives/HoverOverlay.tsx +0 -109
- package/src/charts/primitives/XZoneRects.tsx +0 -132
- package/src/charts/primitives/ZoneRects.tsx +0 -67
- package/src/charts/primitives/chart-card-context.ts +0 -46
- package/src/charts/primitives/chart-frame-layout.ts +0 -430
- package/src/charts/primitives/chart-layout.ts +0 -318
- package/src/charts/primitives/chart-tier.tsx +0 -76
- package/src/charts/primitives/legend-disclosure.tsx +0 -178
- package/src/charts/series.ts +0 -276
- package/src/charts/sparklines/BarSparkline.tsx +0 -94
- package/src/charts/sparklines/LineSparkline.tsx +0 -71
- package/src/charts/sparklines/index.ts +0 -2
- package/src/charts/theme.tsx +0 -53
- package/src/charts/utils/domain.ts +0 -41
- package/src/charts/utils/format.ts +0 -19
- package/src/charts/utils/measure-text.ts +0 -109
- package/src/charts/utils/ticks.ts +0 -239
- package/src/commands/overlays-mount.tsx +0 -333
- package/src/commands/useCommandHotkeys.ts +0 -114
- package/src/content/article-actions.ts +0 -72
- package/src/content/article-card.module.css +0 -111
- package/src/content/article-card.tsx +0 -174
- package/src/content/mdx.tsx +0 -127
- package/src/controls/compare-filter.tsx +0 -81
- package/src/controls/slider-control.tsx +0 -159
- package/src/dashboard/widget-grid.module.css +0 -69
- package/src/dashboard/widget-grid.tsx +0 -146
- package/src/data/table.ts +0 -39
- package/src/data/virtual-list.tsx +0 -356
- package/src/data/virtual.ts +0 -26
- package/src/forms/FormErrorSummary.tsx +0 -71
- package/src/forms/use-field-array.ts +0 -94
- package/src/forms/use-form-draft.ts +0 -262
- package/src/forms/use-form-submit.ts +0 -199
- package/src/notifications/index.ts +0 -88
- package/src/notifications/mount-guard.ts +0 -38
- package/src/notifications/notify.tsx +0 -379
- package/src/provider/connectivity-indicator.tsx +0 -267
- package/src/provider/connectivity-provider.tsx +0 -189
- package/src/provider/connectivity-types.ts +0 -42
- package/src/provider/use-connectivity.ts +0 -26
- package/src/query-devtools.tsx +0 -40
- /package/dist/{agent-chat → agent/chat}/message-affordances.js +0 -0
- /package/dist/{agent-chat → agent/chat}/relative-time.d.ts +0 -0
- /package/dist/{agent-chat → agent/chat}/relative-time.js +0 -0
- /package/dist/{agent-chat → agent/chat}/use-keyboard-inset.d.ts +0 -0
- /package/dist/{agent-chat → agent/chat}/virtualize.js +0 -0
- /package/dist/{notifications → commands/notifications}/bell.js +0 -0
- /package/dist/{notifications → commands/notifications}/define-notifications.js +0 -0
- /package/dist/{provider/connectivity-types.js → controls/uncontrolled.js} +0 -0
- /package/dist/{data → table}/data-table.module.css +0 -0
- /package/dist/{data → table}/data-table.module.css.d.ts +0 -0
- /package/dist/{data → table}/query-branch.d.ts +0 -0
- /package/dist/{data → table}/query-branch.js +0 -0
- /package/src/{agent-chat → agent/chat}/relative-time.ts +0 -0
- /package/src/{data → table}/data-table.module.css +0 -0
- /package/src/{data → table}/data-table.module.css.d.ts +0 -0
- /package/src/{data → table}/query-branch.ts +0 -0
|
@@ -1,242 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Plot-rect margins derived from the labels that will actually be painted.
|
|
3
|
-
*
|
|
4
|
-
* `VX.margin` is a static token, so charts used to clip (or get hand-nudged) whenever a tick label
|
|
5
|
-
* outgrew it — the "I always push the charts around" failure mode. Here the token becomes a
|
|
6
|
-
* FLOOR: a measured side may only ever grow past it, never shrink below it, so no chart gets
|
|
7
|
-
* tighter than it was, and a wide label widens its own gutter automatically.
|
|
8
|
-
*
|
|
9
|
-
* See `docs/CHARTS-SPEC.md` §1.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import { scaleLinear } from '@visx/scale'
|
|
13
|
-
import { VX } from '../../tokens'
|
|
14
|
-
import type { ChartMargin } from '../../tokens'
|
|
15
|
-
import { maxTextWidth } from '../utils/measure-text'
|
|
16
|
-
import { logTickValues, niceLogDomain } from './log-ticks'
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Distance from the plot edge to the near edge of a tick LABEL: visx's default `tickLength` (8)
|
|
20
|
-
* plus the ±4 `dx` the themed axes in `primitives/Axes.tsx` apply. Kept in one place so the
|
|
21
|
-
* measured gutter and the painted axis agree.
|
|
22
|
-
*/
|
|
23
|
-
const AXIS_TICK_GAP = 12
|
|
24
|
-
|
|
25
|
-
/** Line box of a single-line tick label at `fontPx`. */
|
|
26
|
-
const lineHeight = (fontPx: number): number => Math.ceil(fontPx * 1.35)
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* The line box split at the baseline. Only the DESCENT falls below it and only the ASCENT reaches
|
|
30
|
-
* back over the anchor, and a rotated label needs the two apart — its box is measured from the
|
|
31
|
-
* baseline point the axis anchors it at, not from a centred line box. The two ratios sum to
|
|
32
|
-
* {@link lineHeight}'s 1.35em, so nothing moves for the unrotated case.
|
|
33
|
-
*/
|
|
34
|
-
const DESCENT_RATIO = 0.3
|
|
35
|
-
const descent = (fontPx: number): number => fontPx * DESCENT_RATIO
|
|
36
|
-
const ascent = (fontPx: number): number => lineHeight(fontPx) - descent(fontPx)
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* visx's own `tickLength` (`@visx/axis`'s `Axis` default) and the extra drop `Ticks` applies to a
|
|
40
|
-
* bottom-axis label — `to.y + max(10, fontSize)`. Together they are the distance from the axis LINE
|
|
41
|
-
* to the tick label's BASELINE, which is where a rotated label's box is measured from.
|
|
42
|
-
*/
|
|
43
|
-
const AXIS_TICK_LENGTH = 8
|
|
44
|
-
const VISX_MIN_LABEL_FONT = 10
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* The `dx`/`dy` nudge `primitives/Axes.tsx` paints a rotated tick label through — the d3 idiom
|
|
48
|
-
* that puts a 45° label under its tick's lower-left and centres a 90° one on its vertical line.
|
|
49
|
-
*
|
|
50
|
-
* It lives HERE, and the axis imports it, because it is the one number that must be in both
|
|
51
|
-
* places: the nudge was applied at paint and absent from the measure, so §1's measured-equals-
|
|
52
|
-
* painted law broke in exactly the rotated case §8 introduced (the first label crossed the SVG's
|
|
53
|
-
* left edge by 3.2px at 390 and 5.7px at 320, and every rotated label's descender row sat on the
|
|
54
|
-
* bottom clip line). Move a value here and the gutter moves with it.
|
|
55
|
-
*/
|
|
56
|
-
export const ROTATED_LABEL_OFFSET: Record<45 | 90, { dx: number; dy: number }> = {
|
|
57
|
-
45: { dx: -6, dy: 2 },
|
|
58
|
-
90: { dx: -4, dy: 4 },
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/** Breathing room between a rotated label's painted box and the SVG's own clip edge. One px reads
|
|
62
|
-
* as flush; two is the smallest gap that reads as deliberate. */
|
|
63
|
-
const ROTATED_CLEARANCE = 2
|
|
64
|
-
|
|
65
|
-
const rotatedOffset = (rotate: number): { dx: number; dy: number } =>
|
|
66
|
-
ROTATED_LABEL_OFFSET[rotate as 45 | 90] ?? { dx: 0, dy: 0 }
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* How far a rotated x label reaches LEFT of the plot's left edge, and how far BELOW the axis line —
|
|
70
|
-
* measured from the baseline point the axis anchors it at, through the same `dx`/`dy` the axis
|
|
71
|
-
* paints it with.
|
|
72
|
-
*
|
|
73
|
-
* `AxisBottomDate` anchors a rotated label at its right edge (`textAnchor: 'end'`) and rotates it
|
|
74
|
-
* counter-clockwise about that point, so the string runs down-and-to-the-LEFT from the tick it
|
|
75
|
-
* belongs to. The FIRST tick sits at the plot's left edge, so its label hangs into the left gutter;
|
|
76
|
-
* the LAST row of glyphs hangs below the axis. Rotating the label's box about its anchor gives both
|
|
77
|
-
* extents exactly:
|
|
78
|
-
*
|
|
79
|
-
* - left = `cos θ · (width + ascent) − dx` — zero at 90°, where the string runs straight down.
|
|
80
|
-
* - below = `tickLength + max(10, fontPx) + dy + sin θ · width + cos θ · descent`.
|
|
81
|
-
*
|
|
82
|
-
* Both carry {@link ROTATED_CLEARANCE} so the painted box clears the SVG's clip rather than
|
|
83
|
-
* touching it.
|
|
84
|
-
*/
|
|
85
|
-
export function rotatedLabelExtents(input: {
|
|
86
|
-
/** Width of the widest x tick label, already measured at the painted font. */
|
|
87
|
-
labelWidth: number
|
|
88
|
-
fontPx: number
|
|
89
|
-
rotate: number
|
|
90
|
-
}): { left: number; below: number } {
|
|
91
|
-
const { labelWidth, fontPx, rotate } = input
|
|
92
|
-
if (rotate === 0) return { left: 0, below: 0 }
|
|
93
|
-
const radians = (rotate * Math.PI) / 180
|
|
94
|
-
const cos = Math.abs(Math.cos(radians))
|
|
95
|
-
const sin = Math.abs(Math.sin(radians))
|
|
96
|
-
const { dx, dy } = rotatedOffset(rotate)
|
|
97
|
-
return {
|
|
98
|
-
left: cos * (labelWidth + ascent(fontPx)) - dx + ROTATED_CLEARANCE,
|
|
99
|
-
below:
|
|
100
|
-
AXIS_TICK_LENGTH +
|
|
101
|
-
Math.max(VISX_MIN_LABEL_FONT, fontPx) +
|
|
102
|
-
dy +
|
|
103
|
-
sin * labelWidth +
|
|
104
|
-
cos * descent(fontPx) +
|
|
105
|
-
ROTATED_CLEARANCE,
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* The grouped-thousands default for a log axis with no explicit `format` — parity with the linear
|
|
111
|
-
* branch's own `probe.tickFormat(ticks)`, which already groups (`"100,000"`). Unbounded fraction
|
|
112
|
-
* digits (rather than `toLocaleString`'s default of 3) so a sub-unit log tick (`1e-7`) still prints
|
|
113
|
-
* its digits instead of truncating to `"0"`.
|
|
114
|
-
*/
|
|
115
|
-
const LOG_TICK_FORMAT = new Intl.NumberFormat('en-US', { maximumFractionDigits: 20 })
|
|
116
|
-
|
|
117
|
-
export type AutoMarginInput = {
|
|
118
|
-
/** Left-axis tick labels, already formatted. */
|
|
119
|
-
left?: readonly string[]
|
|
120
|
-
/** Right-axis tick labels, already formatted. Presence (not a flag) is what widens `right`. */
|
|
121
|
-
right?: readonly string[]
|
|
122
|
-
/** X-axis tick labels, already formatted. */
|
|
123
|
-
bottom?: readonly string[]
|
|
124
|
-
/** Degrees of counter-clockwise rotation applied to the x tick labels. Default 0. */
|
|
125
|
-
rotate?: number
|
|
126
|
-
/** Tick-label font size. Default `VX.axisFont`. A phone-tier chart passes its own smaller size
|
|
127
|
-
* (`chartMetrics().axisFont`) — the measured label must be the painted label. */
|
|
128
|
-
fontPx?: number
|
|
129
|
-
/**
|
|
130
|
-
* Per-side FLOORS. Default `VX.margin`. The phone tier passes its tightened set
|
|
131
|
-
* (`chartMetrics().margin`) so a static 44px left gutter does not spend an eighth of a 360px
|
|
132
|
-
* chart on a three-character label. The law itself does not move: a side may still only ever
|
|
133
|
-
* grow past its floor.
|
|
134
|
-
*/
|
|
135
|
-
floor?: ChartMargin
|
|
136
|
-
/** X labels anchored inward at the terminals (`AxisBottomDate anchorTerminals`): the last label
|
|
137
|
-
* no longer centres on the right edge, so the half-label right reservation is dropped. */
|
|
138
|
-
anchorTerminals?: boolean
|
|
139
|
-
/** Lines the tallest (wrapped) x label takes. Default 1. */
|
|
140
|
-
bottomLines?: number
|
|
141
|
-
/** Explicit per-side overrides — applied LAST, so an escape hatch always wins. */
|
|
142
|
-
override?: Partial<ChartMargin>
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
/**
|
|
146
|
-
* Resolve the four margins from measured labels.
|
|
147
|
-
*
|
|
148
|
-
* Law, per side (the floors are `VX.margin` by default; a tier may tighten them via `floor`):
|
|
149
|
-
* - `left` — widest left label + gap, floored at `VX.margin.left`. When the x labels are ROTATED
|
|
150
|
-
* they also reach into this gutter, so the left side additionally clears their leftward
|
|
151
|
-
* extent — see {@link rotatedLabelExtents}.
|
|
152
|
-
* - `right` — with a right axis: widest right label + gap. Without one, and the x labels are NOT
|
|
153
|
-
* rotated: half the widest x label, so the LAST x tick (centered on the plot's right edge)
|
|
154
|
-
* cannot clip. Without one AND rotated: nothing — a rotated label is anchored at its right edge
|
|
155
|
-
* (`textAnchor: 'end'`, same as {@link rotatedLabelExtents}), so it hangs left of its tick, not
|
|
156
|
-
* right, and reserving half its width would pad a side nothing paints into. Every case is
|
|
157
|
-
* floored at `VX.margin.right`.
|
|
158
|
-
* - `bottom` — one label line + gap; when ROTATED, the label's measured drop below the axis line
|
|
159
|
-
* ({@link rotatedLabelExtents}) instead. Floored at `VX.margin.bottom`.
|
|
160
|
-
* - `top` — `VX.margin.top`. Nothing measures into it; a chart that draws into the top gutter
|
|
161
|
-
* passes an override.
|
|
162
|
-
*/
|
|
163
|
-
export function autoMargin(input: AutoMarginInput = {}): ChartMargin {
|
|
164
|
-
const fontPx = input.fontPx ?? VX.axisFont
|
|
165
|
-
const {
|
|
166
|
-
left = [],
|
|
167
|
-
right = [],
|
|
168
|
-
bottom = [],
|
|
169
|
-
rotate = 0,
|
|
170
|
-
floor = VX.margin,
|
|
171
|
-
anchorTerminals = false,
|
|
172
|
-
bottomLines = 1,
|
|
173
|
-
override,
|
|
174
|
-
} = input
|
|
175
|
-
|
|
176
|
-
const leftWidth = maxTextWidth(left, fontPx)
|
|
177
|
-
const rightWidth = maxTextWidth(right, fontPx)
|
|
178
|
-
const bottomWidth = maxTextWidth(bottom, fontPx)
|
|
179
|
-
|
|
180
|
-
// Measured EXACTLY as painted: through the same `dx`/`dy` `primitives/Axes.tsx` nudges a rotated
|
|
181
|
-
// label by, and from the baseline the axis anchors it at.
|
|
182
|
-
const rotated = rotatedLabelExtents({ labelWidth: bottomWidth, fontPx, rotate })
|
|
183
|
-
const bottomExtent =
|
|
184
|
-
rotate === 0 ? lineHeight(fontPx) * Math.max(bottomLines, 1) + AXIS_TICK_GAP : rotated.below
|
|
185
|
-
|
|
186
|
-
return {
|
|
187
|
-
top: override?.top ?? floor.top,
|
|
188
|
-
right:
|
|
189
|
-
override?.right ??
|
|
190
|
-
Math.ceil(
|
|
191
|
-
Math.max(
|
|
192
|
-
floor.right,
|
|
193
|
-
right.length > 0
|
|
194
|
-
? rightWidth + AXIS_TICK_GAP
|
|
195
|
-
: rotate === 0 && !anchorTerminals
|
|
196
|
-
? bottomWidth / 2
|
|
197
|
-
: 0,
|
|
198
|
-
),
|
|
199
|
-
),
|
|
200
|
-
bottom: override?.bottom ?? Math.ceil(Math.max(floor.bottom, bottomExtent)),
|
|
201
|
-
left:
|
|
202
|
-
override?.left ??
|
|
203
|
-
Math.ceil(
|
|
204
|
-
Math.max(floor.left, left.length > 0 ? leftWidth + AXIS_TICK_GAP : 0, rotated.left),
|
|
205
|
-
),
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
/**
|
|
210
|
-
* The tick labels a linear axis WILL paint, derived before the plot rect exists.
|
|
211
|
-
*
|
|
212
|
-
* This is what breaks the margin/scale circularity: a linear scale's tick VALUES depend only on
|
|
213
|
-
* its domain, so a throwaway-range probe yields the exact label strings {@link autoMargin} needs
|
|
214
|
-
* to measure — and returning the resolved `format` alongside them guarantees the measured string
|
|
215
|
-
* and the painted string are the same one. Shared by `CartesianChart` and by hand-composed kinds
|
|
216
|
-
* (`DualPanel`) so the two can't drift.
|
|
217
|
-
*/
|
|
218
|
-
export function probeAxisLabels(opts: {
|
|
219
|
-
domain: [number, number]
|
|
220
|
-
ticks: number
|
|
221
|
-
/** Overrides d3's own tick format. */
|
|
222
|
-
format?: (v: number) => string
|
|
223
|
-
/** Must match the real scale's `nice` — niceing changes which ticks exist. */
|
|
224
|
-
nice?: boolean
|
|
225
|
-
/** `'log'` measures through {@link logTickValues} instead of a linear probe scale — the same
|
|
226
|
-
* helper the axis paints from (CHARTS-SPEC §1: measured labels == painted labels). Default
|
|
227
|
-
* `'linear'`. */
|
|
228
|
-
scale?: 'linear' | 'log'
|
|
229
|
-
}): { labels: string[]; format: (v: number) => string } {
|
|
230
|
-
if (opts.scale === 'log') {
|
|
231
|
-
const domain = opts.nice === true ? niceLogDomain(opts.domain) : opts.domain
|
|
232
|
-
const format = opts.format ?? ((v: number) => LOG_TICK_FORMAT.format(v))
|
|
233
|
-
return { labels: logTickValues(domain, opts.ticks).map(format), format }
|
|
234
|
-
}
|
|
235
|
-
const probe = scaleLinear<number>({
|
|
236
|
-
domain: opts.domain,
|
|
237
|
-
range: [1, 0],
|
|
238
|
-
...(opts.nice === true && { nice: true }),
|
|
239
|
-
})
|
|
240
|
-
const format = opts.format ?? probe.tickFormat(opts.ticks)
|
|
241
|
-
return { labels: probe.ticks(opts.ticks).map(format), format }
|
|
242
|
-
}
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
import type { ContainerClass } from '../../tokens/size-classes'
|
|
2
|
-
import type { ChartSeries } from '../series'
|
|
3
|
-
import { measureText } from '../utils/measure-text'
|
|
4
|
-
|
|
5
|
-
/** Space between the plot edge and an end label's first glyph. */
|
|
6
|
-
export const END_LABEL_GAP = 6
|
|
7
|
-
|
|
8
|
-
/** End labels are for a handful of lines; past this the legend alone names them. */
|
|
9
|
-
export const MAX_END_LABELS = 3
|
|
10
|
-
|
|
11
|
-
/** Line box of one end label, as a multiple of its font size — the collision gap. */
|
|
12
|
-
export const END_LABEL_LINE_HEIGHT = 1.3
|
|
13
|
-
|
|
14
|
-
/** The gutter may take at most this share of the plot width; past it the labels are not drawn. */
|
|
15
|
-
const MAX_GUTTER_SHARE = 0.25
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Greedy collision nudging for direct labels. Each `ys` entry is a label's preferred CENTRE; the
|
|
19
|
-
* result keeps input order and holds every label at least `minGap` from its neighbours, inside
|
|
20
|
-
* `[min, max]`. Sorted by y, each label yields to the one above it, then a backward pass pulls the
|
|
21
|
-
* stack up off the bottom edge. Returns `null` when the labels cannot all fit — the caller draws
|
|
22
|
-
* none (the legend still names every series) rather than a partial or overlapping set.
|
|
23
|
-
*/
|
|
24
|
-
export function nudgeLabels(input: {
|
|
25
|
-
ys: readonly number[]
|
|
26
|
-
minGap: number
|
|
27
|
-
min: number
|
|
28
|
-
max: number
|
|
29
|
-
}): number[] | null {
|
|
30
|
-
const { ys, minGap, min, max } = input
|
|
31
|
-
if (ys.length === 0) return []
|
|
32
|
-
if (ys.some((y) => !Number.isFinite(y))) return null
|
|
33
|
-
if ((ys.length - 1) * minGap > max - min) return null
|
|
34
|
-
|
|
35
|
-
const order = ys.map((y, i) => ({ y, i })).toSorted((a, b) => a.y - b.y)
|
|
36
|
-
|
|
37
|
-
let prev = Number.NEGATIVE_INFINITY
|
|
38
|
-
const forward = order.map(({ y, i }) => {
|
|
39
|
-
prev = Math.max(y, min, prev + minGap)
|
|
40
|
-
return { i, y: prev }
|
|
41
|
-
})
|
|
42
|
-
|
|
43
|
-
let next = Number.POSITIVE_INFINITY
|
|
44
|
-
const back = forward.toReversed().map(({ i, y }) => {
|
|
45
|
-
next = Math.min(y, max, next - minGap)
|
|
46
|
-
return { i, y: next }
|
|
47
|
-
})
|
|
48
|
-
if (next < min) return null
|
|
49
|
-
|
|
50
|
-
return back.toSorted((a, b) => a.i - b.i).map((p) => p.y)
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* The right gutter the end labels need: the widest label plus the gap. `null` when it would eat
|
|
55
|
-
* more than a quarter of the plot — a label longer than that has no honest place in a gutter.
|
|
56
|
-
*/
|
|
57
|
-
export function endLabelGutter(input: {
|
|
58
|
-
labels: readonly string[]
|
|
59
|
-
fontPx: number
|
|
60
|
-
plotWidth: number
|
|
61
|
-
}): number | null {
|
|
62
|
-
const { labels, fontPx, plotWidth } = input
|
|
63
|
-
if (labels.length === 0) return null
|
|
64
|
-
const widest = labels.reduce((max, label) => Math.max(max, measureText(label, fontPx)), 0)
|
|
65
|
-
const gutter = Math.ceil(widest) + END_LABEL_GAP
|
|
66
|
-
return gutter > plotWidth * MAX_GUTTER_SHARE ? null : gutter
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/** One drawn end label: the series it names and its nudged centre y. */
|
|
70
|
-
export type EndLabel<T> = { series: ChartSeries<T>; y: number }
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Whether and how a chart draws end-of-line labels. Eligible only on a wide container with one y
|
|
74
|
-
* axis, no consumer `margin.right`, no header legend already naming every series for free (R2C-10:
|
|
75
|
-
* end labels REPLACE the legend, they never duplicate it), and 2..{@link MAX_END_LABELS} visible
|
|
76
|
-
* series that are all lines — a single line has its own title doing that job already (the same law
|
|
77
|
-
* that already suppresses a single-entry legend, `ChartFrame.resolveLegend`'s JSDoc). Each label
|
|
78
|
-
* sits at its line's last non-null value, nudged apart; the plan is `null` — no gutter reserved,
|
|
79
|
-
* nothing drawn — when any rule fails, a series has no plottable value, the stack cannot fit, or
|
|
80
|
-
* the gutter would be too wide. The gutter is measured from the label text.
|
|
81
|
-
*/
|
|
82
|
-
export function planEndLabels<T>(input: {
|
|
83
|
-
containerClass: ContainerClass
|
|
84
|
-
hasY2: boolean
|
|
85
|
-
hasMarginRight: boolean
|
|
86
|
-
/** A `ChartCard` header slot already named every visible series — end labels would only repeat
|
|
87
|
-
* it, at the cost of a right-hand gutter the header slot cost nothing (R2C-10). */
|
|
88
|
-
hasHeaderLegend: boolean
|
|
89
|
-
visible: readonly ChartSeries<T>[]
|
|
90
|
-
data: readonly T[]
|
|
91
|
-
yScale: (value: number) => number
|
|
92
|
-
yMax: number
|
|
93
|
-
fontPx: number
|
|
94
|
-
/** Plot width before any gutter is taken. */
|
|
95
|
-
plotWidth: number
|
|
96
|
-
}): { gutter: number; labels: EndLabel<T>[] } | null {
|
|
97
|
-
const {
|
|
98
|
-
containerClass,
|
|
99
|
-
hasY2,
|
|
100
|
-
hasMarginRight,
|
|
101
|
-
hasHeaderLegend,
|
|
102
|
-
visible,
|
|
103
|
-
data,
|
|
104
|
-
yScale,
|
|
105
|
-
yMax,
|
|
106
|
-
fontPx,
|
|
107
|
-
plotWidth,
|
|
108
|
-
} = input
|
|
109
|
-
if (containerClass !== 'wide' || hasY2 || hasMarginRight || hasHeaderLegend) return null
|
|
110
|
-
if (visible.length < 2 || visible.length > MAX_END_LABELS) return null
|
|
111
|
-
if (!visible.every((s) => s.mark === 'line')) return null
|
|
112
|
-
|
|
113
|
-
const gutter = endLabelGutter({ labels: visible.map((s) => s.label), fontPx, plotWidth })
|
|
114
|
-
if (gutter === null) return null
|
|
115
|
-
|
|
116
|
-
const placed = visible.flatMap((s) => {
|
|
117
|
-
const last = data.findLast((d) => s.getValue(d) !== null)
|
|
118
|
-
if (last === undefined) return []
|
|
119
|
-
const value = s.getValue(last)
|
|
120
|
-
if (value === null) return []
|
|
121
|
-
const y = yScale(value)
|
|
122
|
-
return Number.isFinite(y) ? [{ series: s, y }] : []
|
|
123
|
-
})
|
|
124
|
-
if (placed.length !== visible.length) return null
|
|
125
|
-
|
|
126
|
-
const lineHeight = Math.ceil(fontPx * END_LABEL_LINE_HEIGHT)
|
|
127
|
-
const ys = nudgeLabels({
|
|
128
|
-
ys: placed.map((p) => p.y),
|
|
129
|
-
minGap: lineHeight,
|
|
130
|
-
min: lineHeight / 2,
|
|
131
|
-
max: yMax - lineHeight / 2,
|
|
132
|
-
})
|
|
133
|
-
if (ys === null) return null
|
|
134
|
-
return { gutter, labels: placed.map((p, i) => ({ series: p.series, y: ys[i] ?? p.y })) }
|
|
135
|
-
}
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 1-2-5 mantissa tick law for a log axis (`docs/CHARTS-SPEC.md` §2).
|
|
3
|
-
*
|
|
4
|
-
* d3's own `scaleLog().ticks()` multiplies the mantissa density by the number of decades the
|
|
5
|
-
* domain spans, so a wide financial range (e.g. $10k–$300k) reads `$316,228 / $100,000 / $31,623 /
|
|
6
|
-
* $10,000` — every finance reference instead ticks a log price axis at `{1, 2, 5} × 10^n`
|
|
7
|
-
* (`$10,000 · $20,000 · $50,000 · $100,000`). Pure, no visx dependency, so both the measured
|
|
8
|
-
* (`probeAxisLabels`) and painted (`CartesianChart`) sides can share the exact same tick list.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Escalating mantissa sets: the strict {1, 2, 5} law first, then progressively denser sets used
|
|
13
|
-
* only when the stricter one leaves too few in-domain candidates to read — a short span (a
|
|
14
|
-
* one-year BTC window, say, $58k–$139k) collapses {1, 2, 5} to a single tick, which is
|
|
15
|
-
* unreadable. Each set is ascending and never crosses a decade boundary within itself
|
|
16
|
-
* (`9 × 10^k < 1 × 10^(k+1)`), so the flatMap output stays sorted with no explicit sort.
|
|
17
|
-
*/
|
|
18
|
-
const MANTISSA_SETS = [
|
|
19
|
-
[1, 2, 5],
|
|
20
|
-
[1, 1.5, 2, 3, 4, 5, 7],
|
|
21
|
-
[1, 1.5, 2, 2.5, 3, 4, 5, 6, 7, 8, 9],
|
|
22
|
-
] as const
|
|
23
|
-
|
|
24
|
-
/** Below this many in-domain candidates, escalate to the next denser mantissa set. */
|
|
25
|
-
const DENSIFY_BELOW = 4
|
|
26
|
-
|
|
27
|
-
/** Every base-10 exponent whose decade touches `[min, max]`. */
|
|
28
|
-
function decadeExponents(min: number, max: number): number[] {
|
|
29
|
-
const lo = Math.floor(Math.log10(min))
|
|
30
|
-
const hi = Math.ceil(Math.log10(max))
|
|
31
|
-
const exponents: number[] = []
|
|
32
|
-
for (let k = lo; k <= hi; k++) exponents.push(k)
|
|
33
|
-
return exponents
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Thin an ascending, over-budget value list toward `ticks`, keeping both extremes — a stride
|
|
38
|
-
* derived from the budget (`Math.ceil(length / ticks)`) rather than a fixed 2, so the result
|
|
39
|
-
* actually tracks `ticks` instead of only ever halving regardless of how far over budget the input
|
|
40
|
-
* is. May return one more than `ticks` when the last value doesn't land on the stride (an even
|
|
41
|
-
* decade count, say): keeping the axis's top labeled matters more than the exact count.
|
|
42
|
-
*/
|
|
43
|
-
function thinToBudget(values: number[], ticks: number): number[] {
|
|
44
|
-
if (values.length <= ticks) return values
|
|
45
|
-
const stride = Math.ceil(values.length / ticks)
|
|
46
|
-
const thinned = values.filter((_, i) => i % stride === 0)
|
|
47
|
-
const last = values[values.length - 1] as number
|
|
48
|
-
return thinned[thinned.length - 1] === last ? thinned : [...thinned, last]
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Every `{1, 2, 5} × 10^k` value for every decade touching `[min, max]`, filtered to the domain —
|
|
53
|
-
* escalating through {@link MANTISSA_SETS} while a set leaves fewer than {@link DENSIFY_BELOW}
|
|
54
|
-
* candidates (a short span collapses the strict law to one tick). The exact same list is what
|
|
55
|
-
* `probeAxisLabels` measures and what `CartesianChart` paints, so the two can never disagree.
|
|
56
|
-
* An over-budget result collapses to whole decades only when the decades ALONE form a readable
|
|
57
|
-
* axis ({@link DENSIFY_BELOW}+ in-domain); otherwise it is thinned by a budget-derived stride
|
|
58
|
-
* (may exceed `ticks` by one — see {@link thinToBudget}). Collapsing to decades unconditionally
|
|
59
|
-
* is the bug this ordering exists to prevent: a 4-year BTC window ($15.5k–$139k) holds ONE whole
|
|
60
|
-
* decade, so the collapse produced a single-tick axis. Never returns a non-positive value; a
|
|
61
|
-
* non-positive or inverted domain (a log axis has no zero and no reversed extent) returns `[]`.
|
|
62
|
-
*/
|
|
63
|
-
export function logTickValues([min, max]: readonly [number, number], ticks: number): number[] {
|
|
64
|
-
if (min <= 0 || max <= 0 || min >= max) return []
|
|
65
|
-
|
|
66
|
-
const exponents = decadeExponents(min, max)
|
|
67
|
-
const inDomain = (v: number): boolean => v >= min && v <= max
|
|
68
|
-
const collect = (mantissas: readonly number[]): number[] =>
|
|
69
|
-
exponents.flatMap((k) => mantissas.map((m) => m * 10 ** k)).filter(inDomain)
|
|
70
|
-
|
|
71
|
-
let resolved: number[] = []
|
|
72
|
-
for (const mantissas of MANTISSA_SETS) {
|
|
73
|
-
resolved = collect(mantissas)
|
|
74
|
-
if (resolved.length >= DENSIFY_BELOW) break
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
if (resolved.length <= ticks) return resolved
|
|
78
|
-
|
|
79
|
-
const decades = exponents.map((k) => 10 ** k).filter(inDomain)
|
|
80
|
-
if (decades.length >= DENSIFY_BELOW) return thinToBudget(decades, ticks)
|
|
81
|
-
|
|
82
|
-
return thinToBudget(resolved, ticks)
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/** Round a domain outward to the nearest enclosing power-of-10 bounds — the log analog of
|
|
86
|
-
* `scale.nice()`, used to keep `probeAxisLabels` (measurement) and the real niced scale
|
|
87
|
-
* (rendering) computing ticks from the same rounded domain. */
|
|
88
|
-
export function niceLogDomain([min, max]: readonly [number, number]): [number, number] {
|
|
89
|
-
return [10 ** Math.floor(Math.log10(min)), 10 ** Math.ceil(Math.log10(max))]
|
|
90
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* AreaGradient — the single source for the soft single-hue area fill under a line.
|
|
3
|
-
*
|
|
4
|
-
* Renders a vertical <linearGradient> that fades a series/line color from `--vx-area-top`
|
|
5
|
-
* opacity at the data peak to `--vx-area-bottom` at the baseline. Both stops are
|
|
6
|
-
* `color-mix` of a CSS-var color, so they stay theme-aware AND the dev theme lab can retune
|
|
7
|
-
* the whole app's gradient strength by overriding two vars on :root — no chart edits.
|
|
8
|
-
*
|
|
9
|
-
* Usage (inside an <svg>):
|
|
10
|
-
* <defs><AreaGradient id={`${chartId}-area`} color={VX.line} /></defs>
|
|
11
|
-
* <AreaClosed ... fill={areaFillUrl(`${chartId}-area`)} />
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
const areaStop = (color: string, edge: 'top' | 'bottom'): string =>
|
|
15
|
-
`color-mix(in srgb, ${color} var(--vx-area-${edge}), transparent)`
|
|
16
|
-
|
|
17
|
-
export function AreaGradient({ id, color }: { id: string; color: string }) {
|
|
18
|
-
return (
|
|
19
|
-
<linearGradient id={id} x1="0" x2="0" y1="0" y2="1">
|
|
20
|
-
<stop offset="0%" stopColor={areaStop(color, 'top')} />
|
|
21
|
-
<stop offset="100%" stopColor={areaStop(color, 'bottom')} />
|
|
22
|
-
</linearGradient>
|
|
23
|
-
)
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export const areaFillUrl = (id: string): string => `url(#${id})`
|