basalt-ui 1.27.0 → 1.29.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 +28 -35
- package/CHANGELOG.md +72 -0
- package/MIGRATING.md +759 -22
- package/README.md +56 -69
- package/agent/rules/basalt-batteries.md +60 -168
- package/agent/rules/basalt-charts.md +56 -75
- package/agent/rules/basalt-controls.md +81 -87
- package/agent/rules/basalt-mantine.md +64 -98
- package/agent/rules/basalt-state.md +42 -60
- package/agent/rules/basalt-tokens.md +46 -67
- package/agent/skills/basalt-app/SKILL.md +2 -0
- package/agent/templates/CLAUDE-block.md.tpl +14 -14
- package/configs/oxlint-plugin.js +964 -33
- package/configs/oxlint-plugin.test.ts +902 -2
- package/configs/oxlint.json +6 -0
- package/dist/agent/ai-sdk-transport.d.ts.map +1 -1
- package/dist/agent/ai-sdk-transport.js +7 -4
- package/dist/agent/coalesce.d.ts.map +1 -1
- package/dist/agent/coalesce.js +2 -1
- package/dist/agent/merge.d.ts.map +1 -1
- package/dist/agent/merge.js +2 -1
- package/dist/agent/part-list.d.ts.map +1 -1
- package/dist/agent/part-list.js +2 -0
- package/dist/agent/stick-to-bottom.d.ts +3 -6
- package/dist/agent/stick-to-bottom.d.ts.map +1 -1
- package/dist/agent/stick-to-bottom.js +6 -3
- package/dist/agent/transport.d.ts +13 -2
- package/dist/agent/transport.d.ts.map +1 -1
- package/dist/agent/use-agent-thread-runs.d.ts +12 -1
- package/dist/agent/use-agent-thread-runs.d.ts.map +1 -1
- package/dist/agent/use-agent-thread-runs.js +20 -6
- package/dist/agent-chat/composer.d.ts +6 -2
- package/dist/agent-chat/composer.d.ts.map +1 -1
- package/dist/agent-chat/composer.js +49 -33
- package/dist/agent-chat/index.d.ts +1 -1
- package/dist/agent-chat/index.d.ts.map +1 -1
- package/dist/agent-chat/relative-time.d.ts +0 -9
- package/dist/agent-chat/relative-time.d.ts.map +1 -1
- package/dist/agent-chat/relative-time.js +2 -1
- package/dist/agent-chat/thread-detail-panel.d.ts +3 -2
- package/dist/agent-chat/thread-detail-panel.d.ts.map +1 -1
- package/dist/agent-chat/thread-detail-panel.js +9 -6
- package/dist/agent-chat/thread-feed-row.d.ts +32 -6
- package/dist/agent-chat/thread-feed-row.d.ts.map +1 -1
- package/dist/agent-chat/thread-feed-row.js +61 -26
- package/dist/agent-chat/thread-feed.d.ts +13 -2
- package/dist/agent-chat/thread-feed.d.ts.map +1 -1
- package/dist/agent-chat/thread-feed.js +16 -7
- package/dist/agent-chat/thread-message.d.ts +4 -3
- package/dist/agent-chat/thread-message.d.ts.map +1 -1
- package/dist/agent-chat/thread-message.js +70 -31
- package/dist/agent-chat/thread-outcome-card.d.ts +3 -2
- package/dist/agent-chat/thread-outcome-card.d.ts.map +1 -1
- package/dist/agent-chat/thread-outcome-card.js +9 -2
- package/dist/agent-chat/thread-workspace.d.ts +7 -2
- package/dist/agent-chat/thread-workspace.d.ts.map +1 -1
- package/dist/agent-chat/thread-workspace.js +62 -29
- package/dist/agent-chat/tool-chip.d.ts +3 -2
- package/dist/agent-chat/tool-chip.d.ts.map +1 -1
- package/dist/agent-chat/tool-chip.js +7 -2
- package/dist/agent-chat/virtualize.d.ts +39 -0
- package/dist/agent-chat/virtualize.d.ts.map +1 -1
- package/dist/agent-chat/virtualize.js +15 -0
- package/dist/charts/hooks/useBandPlot.d.ts.map +1 -1
- package/dist/charts/hooks/useBandPlot.js +15 -8
- package/dist/charts/index.d.ts +11 -10
- package/dist/charts/index.d.ts.map +1 -1
- package/dist/charts/index.js +53 -9
- package/dist/charts/kinds/BandStrip.d.ts +10 -7
- package/dist/charts/kinds/BandStrip.d.ts.map +1 -1
- package/dist/charts/kinds/BandStrip.js +12 -7
- package/dist/charts/kinds/Bars.d.ts +13 -9
- package/dist/charts/kinds/Bars.d.ts.map +1 -1
- package/dist/charts/kinds/Bars.js +37 -11
- package/dist/charts/kinds/Donut.d.ts +6 -5
- package/dist/charts/kinds/Donut.d.ts.map +1 -1
- package/dist/charts/kinds/Donut.js +19 -2
- package/dist/charts/kinds/DualPanel.d.ts +9 -6
- package/dist/charts/kinds/DualPanel.d.ts.map +1 -1
- package/dist/charts/kinds/DualPanel.js +37 -9
- package/dist/charts/kinds/Heatmap.d.ts +10 -6
- package/dist/charts/kinds/Heatmap.d.ts.map +1 -1
- package/dist/charts/kinds/Heatmap.js +58 -31
- package/dist/charts/kinds/MirroredBars.d.ts +6 -5
- package/dist/charts/kinds/MirroredBars.d.ts.map +1 -1
- package/dist/charts/kinds/MirroredBars.js +9 -2
- package/dist/charts/kinds/MultiLine.d.ts +11 -6
- package/dist/charts/kinds/MultiLine.d.ts.map +1 -1
- package/dist/charts/kinds/MultiLine.js +24 -15
- package/dist/charts/kinds/StackedArea.d.ts +18 -8
- package/dist/charts/kinds/StackedArea.d.ts.map +1 -1
- package/dist/charts/kinds/StackedArea.js +29 -4
- package/dist/charts/kinds/ZonedLine.d.ts +13 -11
- package/dist/charts/kinds/ZonedLine.d.ts.map +1 -1
- package/dist/charts/kinds/ZonedLine.js +33 -23
- package/dist/charts/layout/auto-margin.d.ts +65 -8
- package/dist/charts/layout/auto-margin.d.ts.map +1 -1
- package/dist/charts/layout/auto-margin.js +45 -10
- package/dist/charts/layout/log-ticks.d.ts +27 -0
- package/dist/charts/layout/log-ticks.d.ts.map +1 -0
- package/dist/charts/layout/log-ticks.js +42 -0
- package/dist/charts/primitives/Axes.d.ts +32 -4
- package/dist/charts/primitives/Axes.d.ts.map +1 -1
- package/dist/charts/primitives/Axes.js +49 -7
- package/dist/charts/primitives/CartesianChart.d.ts +45 -7
- package/dist/charts/primitives/CartesianChart.d.ts.map +1 -1
- package/dist/charts/primitives/CartesianChart.js +86 -28
- package/dist/charts/primitives/ChartCard.d.ts +45 -4
- package/dist/charts/primitives/ChartCard.d.ts.map +1 -1
- package/dist/charts/primitives/ChartCard.js +70 -21
- package/dist/charts/primitives/ChartFrame.d.ts +30 -4
- package/dist/charts/primitives/ChartFrame.d.ts.map +1 -1
- package/dist/charts/primitives/ChartFrame.js +52 -15
- package/dist/charts/primitives/ChartLegend.d.ts +13 -2
- package/dist/charts/primitives/ChartLegend.d.ts.map +1 -1
- package/dist/charts/primitives/ChartLegend.js +33 -13
- package/dist/charts/primitives/ChartPending.d.ts +85 -6
- package/dist/charts/primitives/ChartPending.d.ts.map +1 -1
- package/dist/charts/primitives/ChartPending.js +100 -6
- package/dist/charts/primitives/ChartTooltip.d.ts +7 -0
- package/dist/charts/primitives/ChartTooltip.d.ts.map +1 -1
- package/dist/charts/primitives/ChartTooltip.js +18 -5
- package/dist/charts/primitives/Crosshair.d.ts +3 -0
- package/dist/charts/primitives/Crosshair.d.ts.map +1 -1
- package/dist/charts/primitives/Crosshair.js +3 -1
- package/dist/charts/primitives/chart-frame-layout.d.ts +95 -0
- package/dist/charts/primitives/chart-frame-layout.d.ts.map +1 -0
- package/dist/charts/primitives/chart-frame-layout.js +89 -0
- package/dist/charts/primitives/chart-tier.d.ts +16 -0
- package/dist/charts/primitives/chart-tier.d.ts.map +1 -0
- package/dist/charts/primitives/chart-tier.js +20 -0
- package/dist/charts/series.d.ts +55 -1
- package/dist/charts/series.d.ts.map +1 -1
- package/dist/charts/series.js +27 -1
- package/dist/charts/sparklines/BarSparkline.d.ts +3 -3
- package/dist/charts/sparklines/BarSparkline.d.ts.map +1 -1
- package/dist/charts/sparklines/BarSparkline.js +9 -3
- package/dist/charts/sparklines/LineSparkline.d.ts +3 -3
- package/dist/charts/sparklines/LineSparkline.d.ts.map +1 -1
- package/dist/charts/sparklines/LineSparkline.js +15 -3
- package/dist/charts/sparklines/index.d.ts +2 -2
- package/dist/charts/sparklines/index.d.ts.map +1 -1
- package/dist/charts/utils/format.d.ts +7 -4
- package/dist/charts/utils/format.d.ts.map +1 -1
- package/dist/charts/utils/format.js +17 -24
- package/dist/charts/utils/ticks.d.ts +81 -2
- package/dist/charts/utils/ticks.d.ts.map +1 -1
- package/dist/charts/utils/ticks.js +54 -4
- package/dist/cli/audit-allows.d.ts +24 -0
- package/dist/cli/audit-allows.d.ts.map +1 -0
- package/dist/cli/audit-allows.js +240 -0
- package/dist/cli/check-theme.d.ts +10 -0
- package/dist/cli/check-theme.d.ts.map +1 -0
- package/dist/cli/check-theme.js +139 -0
- package/dist/cli/doctor.d.ts +47 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +197 -0
- package/dist/cli/guard-hook.d.ts +9 -0
- package/dist/cli/guard-hook.d.ts.map +1 -0
- package/dist/cli/guard-hook.js +93 -0
- package/dist/cli/help.d.ts +9 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +53 -0
- package/dist/cli/index.d.ts +360 -270
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +85 -1901
- package/dist/cli/init.d.ts +4 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +165 -0
- package/dist/cli/sync.d.ts +43 -0
- package/dist/cli/sync.d.ts.map +1 -0
- package/dist/cli/sync.js +206 -0
- package/dist/cli/tokens-css.d.ts +51 -0
- package/dist/cli/tokens-css.d.ts.map +1 -0
- package/dist/cli/tokens-css.js +165 -0
- package/dist/commands/ShortcutsHelp.d.ts +3 -2
- package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
- package/dist/commands/ShortcutsHelp.js +8 -2
- package/dist/commands/define-commands.d.ts.map +1 -1
- package/dist/commands/define-commands.js +2 -2
- package/dist/commands/define-overlays.d.ts +102 -0
- package/dist/commands/define-overlays.d.ts.map +1 -1
- package/dist/commands/define-overlays.js +102 -2
- package/dist/commands/index.d.ts +12 -2
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +9 -1
- package/dist/commands/overlays-mount.d.ts +16 -11
- package/dist/commands/overlays-mount.d.ts.map +1 -1
- package/dist/commands/overlays-mount.js +23 -14
- package/dist/commands/shell-bridge.d.ts +57 -0
- package/dist/commands/shell-bridge.d.ts.map +1 -0
- package/dist/commands/shell-bridge.js +32 -0
- package/dist/common/errors.d.ts +69 -0
- package/dist/common/errors.d.ts.map +1 -0
- package/dist/common/errors.js +64 -0
- package/dist/common/index.d.ts +17 -0
- package/dist/common/index.d.ts.map +1 -0
- package/dist/common/index.js +35 -0
- package/dist/common/is-dev.d.ts +3 -0
- package/dist/common/is-dev.d.ts.map +1 -0
- package/dist/common/is-dev.js +6 -0
- package/dist/{motion/index.d.ts → common/motion.d.ts} +1 -1
- package/dist/common/motion.d.ts.map +1 -0
- package/dist/common/props.d.ts +63 -0
- package/dist/common/props.d.ts.map +1 -0
- package/dist/common/props.js +6 -0
- package/dist/common/query-state-like.d.ts +43 -0
- package/dist/common/query-state-like.d.ts.map +1 -0
- package/dist/common/query-state-like.js +20 -0
- package/dist/common/refs.d.ts +29 -0
- package/dist/common/refs.d.ts.map +1 -0
- package/dist/common/refs.js +29 -0
- package/dist/common/scroll-parent.d.ts +23 -0
- package/dist/common/scroll-parent.d.ts.map +1 -0
- package/dist/common/scroll-parent.js +21 -0
- package/dist/common/validate.d.ts +38 -0
- package/dist/common/validate.d.ts.map +1 -0
- package/dist/common/validate.js +36 -0
- package/dist/content/article-layout.module.css +11 -4
- package/dist/content/callout.d.ts +8 -4
- package/dist/content/callout.d.ts.map +1 -1
- package/dist/content/callout.js +15 -8
- package/dist/content/guide.d.ts +5 -4
- package/dist/content/guide.d.ts.map +1 -1
- package/dist/content/guide.js +13 -4
- package/dist/content/heading-anchor.d.ts +24 -2
- package/dist/content/heading-anchor.d.ts.map +1 -1
- package/dist/content/heading-anchor.js +23 -9
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/markdown.d.ts +3 -4
- package/dist/content/markdown.d.ts.map +1 -1
- package/dist/content/markdown.js +3 -4
- package/dist/content/prose.module.css +9 -7
- package/dist/content/reading-progress.d.ts +10 -4
- package/dist/content/reading-progress.d.ts.map +1 -1
- package/dist/content/reading-progress.js +26 -10
- package/dist/content/slug.d.ts +4 -0
- package/dist/content/slug.d.ts.map +1 -1
- package/dist/content/toc.d.ts +11 -0
- package/dist/content/toc.d.ts.map +1 -1
- package/dist/content/toc.js +23 -10
- package/dist/controls/actions.d.ts +50 -7
- package/dist/controls/actions.d.ts.map +1 -1
- package/dist/controls/actions.js +39 -8
- package/dist/controls/compare-filter.d.ts +3 -2
- package/dist/controls/compare-filter.d.ts.map +1 -1
- package/dist/controls/compare-filter.js +17 -2
- package/dist/controls/control-group.d.ts +3 -3
- package/dist/controls/control-group.d.ts.map +1 -1
- package/dist/controls/control-group.js +9 -2
- package/dist/controls/controls.module.css +169 -186
- package/dist/controls/controls.module.css.d.ts +9 -11
- package/dist/controls/enum-filter.d.ts +3 -2
- package/dist/controls/enum-filter.d.ts.map +1 -1
- package/dist/controls/enum-filter.js +28 -13
- package/dist/controls/filter-context.d.ts +8 -4
- package/dist/controls/filter-context.d.ts.map +1 -1
- package/dist/controls/filter-pill.d.ts +3 -3
- package/dist/controls/filter-pill.d.ts.map +1 -1
- package/dist/controls/filter-pill.js +4 -1
- package/dist/controls/filter-set.d.ts +3 -2
- package/dist/controls/filter-set.d.ts.map +1 -1
- package/dist/controls/filter-set.js +66 -41
- package/dist/controls/filter-sheet.d.ts +20 -80
- package/dist/controls/filter-sheet.d.ts.map +1 -1
- package/dist/controls/filter-sheet.js +9 -95
- package/dist/controls/index.d.ts +2 -0
- package/dist/controls/index.d.ts.map +1 -1
- package/dist/controls/index.js +4 -0
- package/dist/controls/multi-select-filter.d.ts +18 -2
- package/dist/controls/multi-select-filter.d.ts.map +1 -1
- package/dist/controls/multi-select-filter.js +122 -20
- package/dist/controls/number-filter.d.ts +7 -5
- package/dist/controls/number-filter.d.ts.map +1 -1
- package/dist/controls/number-filter.js +40 -11
- package/dist/controls/panel-row.d.ts +132 -0
- package/dist/controls/panel-row.d.ts.map +1 -0
- package/dist/controls/panel-row.js +173 -0
- package/dist/controls/panel-row.module.css +86 -0
- package/dist/controls/panel-row.module.css.d.ts +13 -0
- package/dist/controls/range-filter.d.ts +2 -1
- package/dist/controls/range-filter.d.ts.map +1 -1
- package/dist/controls/range-filter.js +57 -35
- package/dist/controls/search-filter.d.ts +3 -2
- package/dist/controls/search-filter.d.ts.map +1 -1
- package/dist/controls/search-filter.js +25 -10
- package/dist/controls/select-filter.d.ts +2 -1
- package/dist/controls/select-filter.d.ts.map +1 -1
- package/dist/controls/select-filter.js +4 -0
- package/dist/controls/slider-control.d.ts +36 -0
- package/dist/controls/slider-control.d.ts.map +1 -0
- package/dist/controls/slider-control.js +64 -0
- package/dist/controls/sync-button.d.ts +3 -2
- package/dist/controls/sync-button.d.ts.map +1 -1
- package/dist/controls/sync-button.js +16 -3
- package/dist/controls/toggle-filter.d.ts +3 -2
- package/dist/controls/toggle-filter.d.ts.map +1 -1
- package/dist/controls/toggle-filter.js +28 -11
- package/dist/controls/view-tabs.d.ts +3 -2
- package/dist/controls/view-tabs.d.ts.map +1 -1
- package/dist/controls/view-tabs.js +43 -11
- package/dist/controls-dates/date-range-picker.d.ts +1 -1
- package/dist/controls-dates/date-range-picker.d.ts.map +1 -1
- package/dist/controls-dates/date-range-picker.js +6 -1
- package/dist/dashboard/delta-badge.d.ts +18 -6
- package/dist/dashboard/delta-badge.d.ts.map +1 -1
- package/dist/dashboard/delta-badge.js +33 -1
- package/dist/dashboard/empty-state.d.ts +8 -4
- package/dist/dashboard/empty-state.d.ts.map +1 -1
- package/dist/dashboard/empty-state.js +36 -6
- package/dist/dashboard/index.d.ts +9 -5
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/index.js +13 -1
- package/dist/dashboard/query-state.d.ts +39 -27
- package/dist/dashboard/query-state.d.ts.map +1 -1
- package/dist/dashboard/query-state.js +109 -58
- package/dist/dashboard/section.d.ts +58 -0
- package/dist/dashboard/section.d.ts.map +1 -0
- package/dist/dashboard/section.js +118 -0
- package/dist/{section → dashboard}/section.module.css +11 -0
- package/dist/dashboard/settings-section.d.ts +19 -9
- package/dist/dashboard/settings-section.d.ts.map +1 -1
- package/dist/dashboard/settings-section.js +75 -26
- package/dist/dashboard/stat-card.d.ts +44 -38
- package/dist/dashboard/stat-card.d.ts.map +1 -1
- package/dist/dashboard/stat-card.js +56 -43
- package/dist/dashboard/stat-card.module.css +46 -31
- package/dist/dashboard/stat-card.module.css.d.ts +1 -0
- package/dist/dashboard/stat-group.d.ts +41 -0
- package/dist/dashboard/stat-group.d.ts.map +1 -0
- package/dist/dashboard/stat-group.js +30 -0
- package/dist/dashboard/stat-group.module.css +66 -0
- package/dist/dashboard/stat-group.module.css.d.ts +8 -0
- package/dist/dashboard/widget-grid.d.ts +27 -0
- package/dist/dashboard/widget-grid.d.ts.map +1 -0
- package/dist/dashboard/widget-grid.js +41 -0
- package/dist/dashboard/widget-grid.module.css +53 -0
- package/dist/dashboard/widget-grid.module.css.d.ts +9 -0
- package/dist/dashboard/widget-header.d.ts +132 -0
- package/dist/dashboard/widget-header.d.ts.map +1 -0
- package/dist/{widget-header → dashboard}/widget-header.js +42 -27
- package/dist/{widget-header → dashboard}/widget-header.module.css +72 -7
- package/dist/data/data-table.d.ts +151 -12
- package/dist/data/data-table.d.ts.map +1 -1
- package/dist/data/data-table.js +385 -139
- package/dist/data/data-table.module.css +64 -0
- package/dist/data/data-table.module.css.d.ts +11 -0
- package/dist/data/query-branch.d.ts +28 -0
- package/dist/data/query-branch.d.ts.map +1 -0
- package/dist/data/query-branch.js +10 -0
- package/dist/data/table.d.ts +2 -2
- package/dist/data/table.d.ts.map +1 -1
- package/dist/data/table.js +2 -16
- package/dist/data/virtual-list.d.ts +65 -6
- package/dist/data/virtual-list.d.ts.map +1 -1
- package/dist/data/virtual-list.js +89 -38
- package/dist/data/virtual.d.ts +4 -4
- package/dist/data/virtual.d.ts.map +1 -1
- package/dist/dev-dock.d.ts +28 -0
- package/dist/dev-dock.d.ts.map +1 -0
- package/dist/dev-dock.js +85 -0
- package/dist/format/date.d.ts +62 -0
- package/dist/format/date.d.ts.map +1 -0
- package/dist/format/date.js +106 -0
- package/dist/format/index.d.ts +39 -0
- package/dist/format/index.d.ts.map +1 -0
- package/dist/format/index.js +54 -0
- package/dist/format/measure.d.ts +15 -0
- package/dist/format/measure.d.ts.map +1 -0
- package/dist/format/measure.js +16 -0
- package/dist/format/number.d.ts +69 -0
- package/dist/format/number.d.ts.map +1 -0
- package/dist/format/number.js +62 -0
- package/dist/format/shared.d.ts +27 -0
- package/dist/format/shared.d.ts.map +1 -0
- package/dist/format/shared.js +29 -0
- package/dist/forms/FormErrorSummary.d.ts +4 -3
- package/dist/forms/FormErrorSummary.d.ts.map +1 -1
- package/dist/forms/FormErrorSummary.js +6 -4
- package/dist/forms/create-form.d.ts +2 -2
- package/dist/forms/field.d.ts +33 -9
- package/dist/forms/field.d.ts.map +1 -1
- package/dist/forms/field.js +7 -6
- package/dist/forms/form-layout.d.ts +142 -0
- package/dist/forms/form-layout.d.ts.map +1 -0
- package/dist/forms/form-layout.js +110 -0
- package/dist/forms/form-layout.module.css +145 -0
- package/dist/forms/form-layout.module.css.d.ts +20 -0
- package/dist/forms/form-state.d.ts +42 -0
- package/dist/forms/form-state.d.ts.map +1 -0
- package/dist/forms/form-state.js +26 -0
- package/dist/forms/index.d.ts +22 -6
- package/dist/forms/index.d.ts.map +1 -1
- package/dist/forms/index.js +19 -4
- package/dist/forms/use-field-array.d.ts +60 -0
- package/dist/forms/use-field-array.d.ts.map +1 -0
- package/dist/forms/use-field-array.js +20 -0
- package/dist/forms/use-form-draft.d.ts +25 -10
- package/dist/forms/use-form-draft.d.ts.map +1 -1
- package/dist/forms/use-form-draft.js +55 -18
- package/dist/forms/use-form-submit.d.ts +88 -0
- package/dist/forms/use-form-submit.d.ts.map +1 -0
- package/dist/forms/use-form-submit.js +63 -0
- package/dist/guard/index.d.ts +2 -9
- package/dist/guard/index.d.ts.map +1 -1
- package/dist/guard/index.js +38 -28
- package/dist/guard/types.d.ts +8 -10
- package/dist/guard/types.d.ts.map +1 -1
- package/dist/index.d.ts +21 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +40 -6
- package/dist/notifications/bell.d.ts +3 -2
- package/dist/notifications/bell.d.ts.map +1 -1
- package/dist/notifications/bell.js +73 -56
- package/dist/notifications/center.d.ts +15 -4
- package/dist/notifications/center.d.ts.map +1 -1
- package/dist/notifications/center.js +5 -2
- package/dist/notifications/define-notifications.d.ts +56 -14
- package/dist/notifications/define-notifications.d.ts.map +1 -1
- package/dist/notifications/define-notifications.js +2 -1
- package/dist/notifications/index.d.ts +11 -7
- package/dist/notifications/index.d.ts.map +1 -1
- package/dist/notifications/index.js +5 -3
- package/dist/notifications/mount-guard.d.ts +8 -0
- package/dist/notifications/mount-guard.d.ts.map +1 -0
- package/dist/notifications/mount-guard.js +19 -0
- package/dist/notifications/notify.d.ts +58 -1
- package/dist/notifications/notify.d.ts.map +1 -1
- package/dist/notifications/notify.js +46 -2
- package/dist/notifications/store.d.ts +7 -0
- package/dist/notifications/store.d.ts.map +1 -1
- package/dist/provider/connectivity-indicator.d.ts +13 -0
- package/dist/provider/connectivity-indicator.d.ts.map +1 -0
- package/dist/{connectivity → provider}/connectivity-indicator.js +3 -1
- package/dist/{connectivity → provider}/connectivity-provider.d.ts +1 -1
- package/dist/provider/connectivity-provider.d.ts.map +1 -0
- package/dist/{connectivity → provider}/connectivity-provider.js +4 -1
- package/dist/{connectivity/types.d.ts → provider/connectivity-types.d.ts} +3 -3
- package/dist/provider/connectivity-types.d.ts.map +1 -0
- package/dist/provider/error-fallback.module.css +21 -0
- package/dist/provider/error-fallback.module.css.d.ts +9 -0
- package/dist/provider/index.d.ts +29 -13
- package/dist/provider/index.d.ts.map +1 -1
- package/dist/provider/index.js +82 -34
- package/dist/provider/lab-theme.d.ts.map +1 -1
- package/dist/provider/lab-theme.js +2 -1
- package/dist/provider/use-connectivity.d.ts +3 -0
- package/dist/provider/use-connectivity.d.ts.map +1 -0
- package/dist/query-client.d.ts +63 -0
- package/dist/query-client.d.ts.map +1 -0
- package/dist/query-client.js +33 -0
- package/dist/{query/devtools.d.ts → query-devtools.d.ts} +2 -2
- package/dist/query-devtools.d.ts.map +1 -0
- package/dist/{query/devtools.js → query-devtools.js} +1 -0
- package/dist/register.d.ts +17 -3
- package/dist/register.d.ts.map +1 -1
- package/dist/router-tanstack/index.d.ts +4 -7
- package/dist/router-tanstack/index.d.ts.map +1 -1
- package/dist/router-tanstack/index.js +1 -9
- package/dist/router-tanstack/nav.d.ts +1 -1
- package/dist/router-tanstack/nav.d.ts.map +1 -1
- package/dist/router-tanstack/search-store.d.ts +3 -6
- package/dist/router-tanstack/search-store.d.ts.map +1 -1
- package/dist/router-tanstack/search-store.js +1 -1
- package/dist/router-tanstack/use-nav.d.ts +1 -1
- package/dist/router-tanstack/use-nav.d.ts.map +1 -1
- package/dist/router-tanstack/use-nav.js +1 -1
- package/dist/shell/account-types.d.ts +5 -2
- package/dist/shell/account-types.d.ts.map +1 -1
- package/dist/shell/app-brand.d.ts +13 -0
- package/dist/shell/app-brand.d.ts.map +1 -0
- package/dist/shell/app-brand.js +94 -0
- package/dist/shell/app-brand.module.css +109 -0
- package/dist/shell/app-brand.module.css.d.ts +14 -0
- package/dist/shell/app-breadcrumbs.d.ts +5 -3
- package/dist/shell/app-breadcrumbs.d.ts.map +1 -1
- package/dist/shell/app-breadcrumbs.js +33 -22
- package/dist/shell/app-header.module.css +10 -5
- package/dist/shell/app-main.module.css +118 -0
- package/dist/shell/app-main.module.css.d.ts +11 -0
- package/dist/shell/app-mobile-nav.d.ts +4 -3
- package/dist/shell/app-mobile-nav.d.ts.map +1 -1
- package/dist/shell/app-mobile-nav.js +53 -17
- package/dist/shell/app-mobile-nav.module.css +48 -27
- package/dist/shell/app-mobile-nav.module.css.d.ts +0 -1
- package/dist/shell/app-sidebar-account.d.ts +2 -1
- package/dist/shell/app-sidebar-account.d.ts.map +1 -1
- package/dist/shell/app-sidebar-account.js +57 -22
- package/dist/shell/app-sidebar.d.ts +10 -4
- package/dist/shell/app-sidebar.d.ts.map +1 -1
- package/dist/shell/app-sidebar.js +78 -103
- package/dist/shell/app-sidebar.module.css +63 -96
- package/dist/shell/app-sidebar.module.css.d.ts +0 -5
- package/dist/shell/index.d.ts +24 -10
- package/dist/shell/index.d.ts.map +1 -1
- package/dist/shell/index.js +60 -29
- package/dist/shell/isomorphic-layout-effect.d.ts +14 -0
- package/dist/shell/isomorphic-layout-effect.d.ts.map +1 -0
- package/dist/shell/isomorphic-layout-effect.js +5 -0
- package/dist/shell/mobile-nav-model.d.ts +1 -1
- package/dist/shell/mobile-nav-model.d.ts.map +1 -1
- package/dist/shell/mobile-nav-model.js +27 -6
- package/dist/shell/nav-count-badge.d.ts +5 -3
- package/dist/shell/nav-count-badge.d.ts.map +1 -1
- package/dist/shell/nav-count-badge.js +3 -1
- package/dist/{nav/types.d.ts → shell/nav-types.d.ts} +16 -7
- package/dist/shell/nav-types.d.ts.map +1 -0
- package/dist/shell/page-aside.d.ts +43 -0
- package/dist/shell/page-aside.d.ts.map +1 -0
- package/dist/shell/page-aside.js +175 -0
- package/dist/shell/page-aside.module.css +174 -0
- package/dist/shell/page-aside.module.css.d.ts +14 -0
- package/dist/shell/page-bar.d.ts +55 -15
- package/dist/shell/page-bar.d.ts.map +1 -1
- package/dist/shell/page-bar.js +130 -41
- package/dist/shell/page-bar.module.css +107 -13
- package/dist/shell/page-bar.module.css.d.ts +4 -1
- package/dist/shell/page-title.d.ts +14 -0
- package/dist/shell/page-title.d.ts.map +1 -0
- package/dist/shell/page-title.js +25 -0
- package/dist/shell/page-title.module.css +33 -0
- package/dist/shell/page-title.module.css.d.ts +11 -0
- package/dist/shell/sidebar-block-model.d.ts +1 -1
- package/dist/shell/sidebar-block-model.d.ts.map +1 -1
- package/dist/shell/sidebar-blocks.d.ts +1 -1
- package/dist/shell/sidebar-blocks.d.ts.map +1 -1
- package/dist/shell/sidebar-search.d.ts +4 -2
- package/dist/shell/sidebar-search.d.ts.map +1 -1
- package/dist/shell/sidebar-search.js +9 -4
- package/dist/shell/sidebar-search.module.css +1 -1
- package/dist/shell/use-breakpoint.d.ts +11 -0
- package/dist/shell/use-breakpoint.d.ts.map +1 -0
- package/dist/shell/use-breakpoint.js +33 -0
- package/dist/state/fields.d.ts +26 -22
- package/dist/state/fields.d.ts.map +1 -1
- package/dist/state/fields.js +19 -18
- package/dist/state/persisted-or-local.d.ts +9 -0
- package/dist/state/persisted-or-local.d.ts.map +1 -0
- package/dist/state/persisted-or-local.js +24 -0
- package/dist/state.d.ts +1 -1
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +2 -6
- package/dist/styles.css +36 -0
- package/dist/surfaces.d.ts +25 -47
- package/dist/surfaces.d.ts.map +1 -1
- package/dist/surfaces.js +72 -55
- package/dist/theme/ctl-theme.d.ts.map +1 -1
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +102 -17
- package/dist/theme/nav-link.module.css +37 -26
- package/dist/theme/segmented-control.module.css +22 -0
- package/dist/theme/segmented-control.module.css.d.ts +1 -0
- package/dist/theme/theme-toggle.d.ts +9 -0
- package/dist/theme/theme-toggle.d.ts.map +1 -0
- package/dist/{theme-toggle/index.js → theme/theme-toggle.js} +9 -3
- package/dist/theme-lab/boot.d.ts +66 -0
- package/dist/theme-lab/boot.d.ts.map +1 -0
- package/dist/theme-lab/boot.js +82 -0
- package/dist/theme-lab/index.d.ts +4 -43
- package/dist/theme-lab/index.d.ts.map +1 -1
- package/dist/theme-lab/index.js +9 -69
- package/dist/tokens/index.d.ts +43 -0
- package/dist/tokens/index.d.ts.map +1 -1
- package/dist/tokens/index.js +45 -6
- package/dist/tokens/palette.d.ts +57 -25
- package/dist/tokens/palette.d.ts.map +1 -1
- package/dist/tokens/palette.js +44 -15
- package/dist/tokens.css +5 -5
- package/llms.txt +11 -26
- package/package.json +54 -34
- package/src/agent/ai-sdk-transport.ts +11 -4
- package/src/agent/coalesce.ts +2 -1
- package/src/agent/merge.ts +2 -1
- package/src/agent/part-list.tsx +2 -0
- package/src/agent/stick-to-bottom.tsx +9 -11
- package/src/agent/transport.ts +15 -2
- package/src/agent/use-agent-thread-runs.ts +65 -15
- package/src/agent-chat/composer.tsx +124 -103
- package/src/agent-chat/index.ts +6 -4
- package/src/agent-chat/relative-time.ts +2 -1
- package/src/agent-chat/thread-detail-panel.tsx +10 -6
- package/src/agent-chat/thread-feed-row.tsx +117 -34
- package/src/agent-chat/thread-feed.tsx +59 -27
- package/src/agent-chat/thread-message.tsx +48 -13
- package/src/agent-chat/thread-outcome-card.tsx +9 -1
- package/src/agent-chat/thread-workspace.tsx +72 -33
- package/src/agent-chat/tool-chip.tsx +8 -2
- package/src/agent-chat/virtualize.ts +48 -0
- package/src/charts/hooks/useBandPlot.ts +26 -8
- package/src/charts/index.ts +46 -14
- package/src/charts/kinds/BandStrip.tsx +36 -14
- package/src/charts/kinds/Bars.tsx +68 -20
- package/src/charts/kinds/Donut.tsx +30 -3
- package/src/charts/kinds/DualPanel.tsx +60 -13
- package/src/charts/kinds/Heatmap.tsx +90 -33
- package/src/charts/kinds/MirroredBars.tsx +21 -3
- package/src/charts/kinds/MultiLine.tsx +61 -18
- package/src/charts/kinds/StackedArea.tsx +77 -6
- package/src/charts/kinds/ZonedLine.tsx +72 -35
- package/src/charts/layout/auto-margin.ts +134 -21
- package/src/charts/layout/log-ticks.ts +90 -0
- package/src/charts/primitives/Axes.tsx +82 -5
- package/src/charts/primitives/CartesianChart.tsx +194 -41
- package/src/charts/primitives/ChartCard.tsx +111 -27
- package/src/charts/primitives/ChartFrame.tsx +111 -26
- package/src/charts/primitives/ChartLegend.tsx +43 -13
- package/src/charts/primitives/ChartPending.tsx +194 -10
- package/src/charts/primitives/ChartTooltip.tsx +37 -5
- package/src/charts/primitives/Crosshair.tsx +6 -3
- package/src/charts/primitives/chart-frame-layout.ts +212 -0
- package/src/charts/primitives/chart-tier.tsx +37 -0
- package/src/charts/series.ts +77 -1
- package/src/charts/sparklines/BarSparkline.tsx +11 -3
- package/src/charts/sparklines/LineSparkline.tsx +18 -4
- package/src/charts/sparklines/index.ts +2 -2
- package/src/charts/utils/format.ts +19 -27
- package/src/charts/utils/ticks.ts +149 -4
- package/src/cli/audit-allows.ts +371 -0
- package/src/cli/check-theme.ts +197 -0
- package/src/cli/doctor.ts +331 -0
- package/src/cli/guard-hook.ts +115 -0
- package/src/cli/help.ts +101 -0
- package/src/cli/index.ts +269 -3434
- package/src/cli/init.ts +247 -0
- package/src/cli/sync.ts +324 -0
- package/src/cli/tokens-css.ts +252 -0
- package/src/commands/ShortcutsHelp.tsx +10 -3
- package/src/commands/define-commands.ts +2 -2
- package/src/commands/define-overlays.ts +216 -1
- package/src/commands/index.ts +22 -1
- package/src/commands/overlays-mount.tsx +63 -31
- package/src/commands/shell-bridge.ts +86 -0
- package/src/common/errors.ts +143 -0
- package/src/common/index.ts +23 -0
- package/src/common/is-dev.ts +4 -0
- package/src/common/props.ts +71 -0
- package/src/common/query-state-like.ts +64 -0
- package/src/common/refs.ts +58 -0
- package/src/common/scroll-parent.ts +42 -0
- package/src/common/validate.ts +94 -0
- package/src/content/article-layout.module.css +11 -4
- package/src/content/callout.tsx +13 -7
- package/src/content/guide.tsx +14 -4
- package/src/content/heading-anchor.tsx +14 -3
- package/src/content/index.ts +2 -0
- package/src/content/markdown.tsx +6 -8
- package/src/content/prose.module.css +9 -7
- package/src/content/reading-progress.tsx +40 -15
- package/src/content/slug.ts +4 -0
- package/src/content/toc.tsx +47 -10
- package/src/controls/actions.tsx +90 -10
- package/src/controls/compare-filter.tsx +20 -3
- package/src/controls/control-group.tsx +11 -4
- package/src/controls/controls.module.css +169 -186
- package/src/controls/controls.module.css.d.ts +9 -11
- package/src/controls/enum-filter.tsx +32 -16
- package/src/controls/filter-context.tsx +14 -6
- package/src/controls/filter-pill.tsx +6 -3
- package/src/controls/filter-set.tsx +32 -13
- package/src/controls/filter-sheet.tsx +44 -194
- package/src/controls/index.ts +7 -0
- package/src/controls/multi-select-filter.tsx +177 -27
- package/src/controls/number-filter.tsx +61 -23
- package/src/controls/panel-row.module.css +86 -0
- package/src/controls/panel-row.module.css.d.ts +13 -0
- package/src/controls/panel-row.tsx +392 -0
- package/src/controls/range-filter.tsx +76 -39
- package/src/controls/search-filter.tsx +30 -12
- package/src/controls/select-filter.tsx +11 -1
- package/src/controls/slider-control.tsx +159 -0
- package/src/controls/sync-button.tsx +13 -3
- package/src/controls/toggle-filter.tsx +36 -16
- package/src/controls/view-tabs.tsx +63 -11
- package/src/controls-dates/date-range-picker.tsx +8 -1
- package/src/dashboard/delta-badge.tsx +75 -4
- package/src/dashboard/empty-state.tsx +67 -24
- package/src/dashboard/index.ts +24 -3
- package/src/dashboard/query-state.tsx +142 -85
- package/src/{section → dashboard}/section.module.css +11 -0
- package/src/dashboard/section.tsx +287 -0
- package/src/dashboard/settings-section.tsx +88 -32
- package/src/dashboard/stat-card.module.css +46 -31
- package/src/dashboard/stat-card.module.css.d.ts +1 -0
- package/src/dashboard/stat-card.tsx +186 -128
- package/src/dashboard/stat-group.module.css +66 -0
- package/src/dashboard/stat-group.module.css.d.ts +8 -0
- package/src/dashboard/stat-group.tsx +74 -0
- package/src/dashboard/widget-grid.module.css +53 -0
- package/src/dashboard/widget-grid.module.css.d.ts +9 -0
- package/src/dashboard/widget-grid.tsx +127 -0
- package/src/{widget-header → dashboard}/widget-header.module.css +72 -7
- package/src/dashboard/widget-header.tsx +292 -0
- package/src/data/data-table.module.css +64 -0
- package/src/data/data-table.module.css.d.ts +11 -0
- package/src/data/data-table.tsx +921 -348
- package/src/data/query-branch.ts +53 -0
- package/src/data/table.ts +9 -23
- package/src/data/virtual-list.tsx +190 -56
- package/src/data/virtual.ts +8 -4
- package/src/dev-dock.tsx +159 -0
- package/src/format/date.ts +184 -0
- package/src/format/index.ts +69 -0
- package/src/format/measure.ts +31 -0
- package/src/format/number.ts +129 -0
- package/src/format/shared.ts +63 -0
- package/src/forms/FormErrorSummary.tsx +13 -6
- package/src/forms/create-form.ts +2 -2
- package/src/forms/field.ts +42 -13
- package/src/forms/form-layout.module.css +145 -0
- package/src/forms/form-layout.module.css.d.ts +20 -0
- package/src/forms/form-layout.tsx +305 -0
- package/src/forms/form-state.tsx +94 -0
- package/src/forms/index.ts +37 -7
- package/src/forms/use-field-array.ts +94 -0
- package/src/forms/use-form-draft.ts +145 -53
- package/src/forms/use-form-submit.ts +199 -0
- package/src/guard/index.ts +99 -70
- package/src/guard/types.ts +7 -10
- package/src/index.ts +92 -19
- package/src/notifications/bell.tsx +18 -4
- package/src/notifications/center.tsx +18 -5
- package/src/notifications/define-notifications.ts +64 -18
- package/src/notifications/index.ts +17 -8
- package/src/notifications/mount-guard.ts +39 -0
- package/src/notifications/notify.tsx +122 -3
- package/src/notifications/store.ts +7 -0
- package/src/{connectivity → provider}/connectivity-indicator.tsx +7 -2
- package/src/{connectivity → provider}/connectivity-provider.tsx +5 -2
- package/src/{connectivity/types.ts → provider/connectivity-types.ts} +5 -2
- package/src/provider/error-fallback.module.css +21 -0
- package/src/provider/error-fallback.module.css.d.ts +9 -0
- package/src/provider/index.tsx +116 -28
- package/src/provider/lab-theme.ts +2 -1
- package/src/{connectivity → provider}/use-connectivity.ts +4 -3
- package/src/query-client.ts +100 -0
- package/src/{query/devtools.tsx → query-devtools.tsx} +6 -4
- package/src/register.ts +20 -4
- package/src/router-tanstack/index.ts +4 -15
- package/src/router-tanstack/nav.ts +1 -1
- package/src/router-tanstack/search-store.ts +6 -14
- package/src/router-tanstack/use-nav.ts +19 -14
- package/src/shell/account-types.ts +5 -2
- package/src/shell/app-brand.module.css +109 -0
- package/src/shell/app-brand.module.css.d.ts +14 -0
- package/src/shell/app-brand.tsx +140 -0
- package/src/shell/app-breadcrumbs.tsx +20 -10
- package/src/shell/app-header.module.css +10 -5
- package/src/shell/app-main.module.css +118 -0
- package/src/shell/app-main.module.css.d.ts +11 -0
- package/src/shell/app-mobile-nav.module.css +48 -27
- package/src/shell/app-mobile-nav.module.css.d.ts +0 -1
- package/src/shell/app-mobile-nav.tsx +71 -12
- package/src/shell/app-sidebar-account.tsx +29 -6
- package/src/shell/app-sidebar.module.css +63 -96
- package/src/shell/app-sidebar.module.css.d.ts +0 -5
- package/src/shell/app-sidebar.tsx +61 -105
- package/src/shell/index.tsx +179 -93
- package/src/shell/isomorphic-layout-effect.ts +14 -0
- package/src/shell/mobile-nav-model.ts +67 -11
- package/src/shell/nav-count-badge.tsx +6 -1
- package/src/{nav/types.ts → shell/nav-types.ts} +15 -6
- package/src/shell/page-aside.module.css +174 -0
- package/src/shell/page-aside.module.css.d.ts +14 -0
- package/src/shell/page-aside.tsx +327 -0
- package/src/shell/page-bar.module.css +107 -13
- package/src/shell/page-bar.module.css.d.ts +4 -1
- package/src/shell/page-bar.tsx +294 -94
- package/src/shell/page-title.module.css +33 -0
- package/src/shell/page-title.module.css.d.ts +11 -0
- package/src/shell/page-title.tsx +57 -0
- package/src/shell/sidebar-block-model.ts +1 -1
- package/src/shell/sidebar-blocks.tsx +1 -1
- package/src/shell/sidebar-search.module.css +1 -1
- package/src/shell/sidebar-search.tsx +13 -4
- package/src/shell/use-breakpoint.ts +73 -0
- package/src/state/fields.ts +50 -53
- package/src/state/persisted-or-local.ts +50 -0
- package/src/state.ts +0 -9
- package/src/styles.css +36 -0
- package/src/surfaces.ts +72 -57
- package/src/theme/ctl-theme.tsx +10 -0
- package/src/theme/index.ts +136 -16
- package/src/theme/nav-link.module.css +37 -26
- package/src/theme/segmented-control.module.css +22 -0
- package/src/theme/segmented-control.module.css.d.ts +1 -0
- package/src/{theme-toggle/index.tsx → theme/theme-toggle.tsx} +11 -4
- package/src/theme-lab/boot.ts +140 -0
- package/src/theme-lab/index.tsx +21 -112
- package/src/tokens/index.ts +60 -6
- package/src/tokens/palette.ts +70 -30
- package/dist/agent/adapter.test.d.ts +0 -2
- package/dist/agent/adapter.test.d.ts.map +0 -1
- package/dist/agent/ai-sdk-transport.test.d.ts +0 -2
- package/dist/agent/ai-sdk-transport.test.d.ts.map +0 -1
- package/dist/agent/coalesce.test.d.ts +0 -2
- package/dist/agent/coalesce.test.d.ts.map +0 -1
- package/dist/agent/foreign.test.d.ts +0 -2
- package/dist/agent/foreign.test.d.ts.map +0 -1
- package/dist/agent/id.test.d.ts +0 -2
- package/dist/agent/id.test.d.ts.map +0 -1
- package/dist/agent/merge.test.d.ts +0 -2
- package/dist/agent/merge.test.d.ts.map +0 -1
- package/dist/agent/part-list.test.d.ts +0 -2
- package/dist/agent/part-list.test.d.ts.map +0 -1
- package/dist/agent/parts.test.d.ts +0 -2
- package/dist/agent/parts.test.d.ts.map +0 -1
- package/dist/agent/thread.test.d.ts +0 -2
- package/dist/agent/thread.test.d.ts.map +0 -1
- package/dist/agent/transport.test.d.ts +0 -2
- package/dist/agent/transport.test.d.ts.map +0 -1
- package/dist/agent/use-agent-stream.test.d.ts +0 -2
- package/dist/agent/use-agent-stream.test.d.ts.map +0 -1
- package/dist/agent/use-agent-thread-runs.foreign.test.d.ts +0 -2
- package/dist/agent/use-agent-thread-runs.foreign.test.d.ts.map +0 -1
- package/dist/agent/use-agent-thread-runs.resume.test.d.ts +0 -2
- package/dist/agent/use-agent-thread-runs.resume.test.d.ts.map +0 -1
- package/dist/agent/use-agent-thread-runs.test.d.ts +0 -2
- package/dist/agent/use-agent-thread-runs.test.d.ts.map +0 -1
- package/dist/agent/use-agent-thread-runs.wedge.test.d.ts +0 -2
- package/dist/agent/use-agent-thread-runs.wedge.test.d.ts.map +0 -1
- package/dist/agent-chat/composer.test.d.ts +0 -2
- package/dist/agent-chat/composer.test.d.ts.map +0 -1
- package/dist/agent-chat/relative-time.test.d.ts +0 -2
- package/dist/agent-chat/relative-time.test.d.ts.map +0 -1
- package/dist/agent-chat/thread-feed-row.test.d.ts +0 -2
- package/dist/agent-chat/thread-feed-row.test.d.ts.map +0 -1
- package/dist/agent-chat/thread-feed.test.d.ts +0 -2
- package/dist/agent-chat/thread-feed.test.d.ts.map +0 -1
- package/dist/agent-chat/thread-message.test.d.ts +0 -2
- package/dist/agent-chat/thread-message.test.d.ts.map +0 -1
- package/dist/agent-chat/thread-workspace.test.d.ts +0 -2
- package/dist/agent-chat/thread-workspace.test.d.ts.map +0 -1
- package/dist/agent-chat/tool-chip.test.d.ts +0 -2
- package/dist/agent-chat/tool-chip.test.d.ts.map +0 -1
- package/dist/agent-chat/virtualize.type-guard.test.d.ts +0 -2
- package/dist/agent-chat/virtualize.type-guard.test.d.ts.map +0 -1
- package/dist/charts/cursor/resolve.test.d.ts +0 -2
- package/dist/charts/cursor/resolve.test.d.ts.map +0 -1
- package/dist/charts/cursor/store.test.d.ts +0 -2
- package/dist/charts/cursor/store.test.d.ts.map +0 -1
- package/dist/charts/kinds/BandStrip.test.d.ts +0 -2
- package/dist/charts/kinds/BandStrip.test.d.ts.map +0 -1
- package/dist/charts/kinds/Bars.test.d.ts +0 -2
- package/dist/charts/kinds/Bars.test.d.ts.map +0 -1
- package/dist/charts/kinds/DualPanel.test.d.ts +0 -2
- package/dist/charts/kinds/DualPanel.test.d.ts.map +0 -1
- package/dist/charts/kinds/MirroredBars.test.d.ts +0 -2
- package/dist/charts/kinds/MirroredBars.test.d.ts.map +0 -1
- package/dist/charts/kinds/MultiLine.test.d.ts +0 -2
- package/dist/charts/kinds/MultiLine.test.d.ts.map +0 -1
- package/dist/charts/kinds/StackedArea.test.d.ts +0 -2
- package/dist/charts/kinds/StackedArea.test.d.ts.map +0 -1
- package/dist/charts/kinds/ZonedLine.test.d.ts +0 -2
- package/dist/charts/kinds/ZonedLine.test.d.ts.map +0 -1
- package/dist/charts/layout/auto-margin.test.d.ts +0 -2
- package/dist/charts/layout/auto-margin.test.d.ts.map +0 -1
- package/dist/charts/primitives/CartesianChart.test.d.ts +0 -2
- package/dist/charts/primitives/CartesianChart.test.d.ts.map +0 -1
- package/dist/charts/primitives/ChartCard.test.d.ts +0 -2
- package/dist/charts/primitives/ChartCard.test.d.ts.map +0 -1
- package/dist/charts/primitives/ChartFrame.test.d.ts +0 -2
- package/dist/charts/primitives/ChartFrame.test.d.ts.map +0 -1
- package/dist/charts/primitives/ChartLegend.test.d.ts +0 -2
- package/dist/charts/primitives/ChartLegend.test.d.ts.map +0 -1
- package/dist/charts/primitives/ChartTooltip.test.d.ts +0 -2
- package/dist/charts/primitives/ChartTooltip.test.d.ts.map +0 -1
- package/dist/charts/primitives/XZoneRects.test.d.ts +0 -2
- package/dist/charts/primitives/XZoneRects.test.d.ts.map +0 -1
- package/dist/charts/series.test.d.ts +0 -2
- package/dist/charts/series.test.d.ts.map +0 -1
- package/dist/charts/utils/domain.test.d.ts +0 -2
- package/dist/charts/utils/domain.test.d.ts.map +0 -1
- package/dist/charts/utils/measure-text.test.d.ts +0 -2
- package/dist/charts/utils/measure-text.test.d.ts.map +0 -1
- package/dist/cli/check-coverage.test.d.ts +0 -2
- package/dist/cli/check-coverage.test.d.ts.map +0 -1
- package/dist/cli/check-theme.test.d.ts +0 -2
- package/dist/cli/check-theme.test.d.ts.map +0 -1
- package/dist/cli/help.test.d.ts +0 -2
- package/dist/cli/help.test.d.ts.map +0 -1
- package/dist/cli/init-sync.test.d.ts +0 -2
- package/dist/cli/init-sync.test.d.ts.map +0 -1
- package/dist/cli/placement-engine.test.d.ts +0 -2
- package/dist/cli/placement-engine.test.d.ts.map +0 -1
- package/dist/cli/shipped-versions.test.d.ts +0 -2
- package/dist/cli/shipped-versions.test.d.ts.map +0 -1
- package/dist/cli/tarball-parity.test.d.ts +0 -2
- package/dist/cli/tarball-parity.test.d.ts.map +0 -1
- package/dist/cli/template-format.test.d.ts +0 -2
- package/dist/cli/template-format.test.d.ts.map +0 -1
- package/dist/cli/template-ledger.test.d.ts +0 -2
- package/dist/cli/template-ledger.test.d.ts.map +0 -1
- package/dist/cli/tokens-css.test.d.ts +0 -2
- package/dist/cli/tokens-css.test.d.ts.map +0 -1
- package/dist/cli/toolchain-wiring.test.d.ts +0 -2
- package/dist/cli/toolchain-wiring.test.d.ts.map +0 -1
- package/dist/cli/waiver-audit.test.d.ts +0 -2
- package/dist/cli/waiver-audit.test.d.ts.map +0 -1
- package/dist/connectivity/connectivity-indicator.d.ts +0 -11
- package/dist/connectivity/connectivity-indicator.d.ts.map +0 -1
- package/dist/connectivity/connectivity-provider.d.ts.map +0 -1
- package/dist/connectivity/index.d.ts +0 -13
- package/dist/connectivity/index.d.ts.map +0 -1
- package/dist/connectivity/index.js +0 -8
- package/dist/connectivity/types.d.ts.map +0 -1
- package/dist/connectivity/use-connectivity.d.ts +0 -3
- package/dist/connectivity/use-connectivity.d.ts.map +0 -1
- package/dist/content/article-actions.test.d.ts +0 -2
- package/dist/content/article-actions.test.d.ts.map +0 -1
- package/dist/content/article-model.test.d.ts +0 -2
- package/dist/content/article-model.test.d.ts.map +0 -1
- package/dist/content/block-split.test.d.ts +0 -2
- package/dist/content/block-split.test.d.ts.map +0 -1
- package/dist/content/heading-components.test.d.ts +0 -2
- package/dist/content/heading-components.test.d.ts.map +0 -1
- package/dist/content/markdown.test.d.ts +0 -2
- package/dist/content/markdown.test.d.ts.map +0 -1
- package/dist/content/prose.module.css.test.d.ts +0 -2
- package/dist/content/prose.module.css.test.d.ts.map +0 -1
- package/dist/content/sanitize.test.d.ts +0 -2
- package/dist/content/sanitize.test.d.ts.map +0 -1
- package/dist/content/slug.test.d.ts +0 -2
- package/dist/content/slug.test.d.ts.map +0 -1
- package/dist/controls/actions.test.d.ts +0 -2
- package/dist/controls/actions.test.d.ts.map +0 -1
- package/dist/controls/actions.type-guard.test.d.ts +0 -2
- package/dist/controls/actions.type-guard.test.d.ts.map +0 -1
- package/dist/controls/control-group.test.d.ts +0 -2
- package/dist/controls/control-group.test.d.ts.map +0 -1
- package/dist/controls/controls.router.test.d.ts +0 -2
- package/dist/controls/controls.router.test.d.ts.map +0 -1
- package/dist/controls/filter-set.test.d.ts +0 -2
- package/dist/controls/filter-set.test.d.ts.map +0 -1
- package/dist/controls/peer-boundary.test.d.ts +0 -2
- package/dist/controls/peer-boundary.test.d.ts.map +0 -1
- package/dist/controls/props-contract.test.d.ts +0 -2
- package/dist/controls/props-contract.test.d.ts.map +0 -1
- package/dist/controls/range-filter.type-guard.test.d.ts +0 -2
- package/dist/controls/range-filter.type-guard.test.d.ts.map +0 -1
- package/dist/controls/sync-button.test.d.ts +0 -2
- package/dist/controls/sync-button.test.d.ts.map +0 -1
- package/dist/dashboard/query-state.test.d.ts +0 -2
- package/dist/dashboard/query-state.test.d.ts.map +0 -1
- package/dist/dashboard/settings-section.test.d.ts +0 -2
- package/dist/dashboard/settings-section.test.d.ts.map +0 -1
- package/dist/dashboard/stat-card.test.d.ts +0 -2
- package/dist/dashboard/stat-card.test.d.ts.map +0 -1
- package/dist/data/data-table.test.d.ts +0 -2
- package/dist/data/data-table.test.d.ts.map +0 -1
- package/dist/data/index.d.ts +0 -38
- package/dist/data/index.d.ts.map +0 -1
- package/dist/data/index.js +0 -2
- package/dist/guard/check-source.test.d.ts +0 -2
- package/dist/guard/check-source.test.d.ts.map +0 -1
- package/dist/guard/grace.test.d.ts +0 -20
- package/dist/guard/grace.test.d.ts.map +0 -1
- package/dist/guard/guard-hook.test.d.ts +0 -2
- package/dist/guard/guard-hook.test.d.ts.map +0 -1
- package/dist/motion/index.d.ts.map +0 -1
- package/dist/nav/types.d.ts.map +0 -1
- package/dist/notifications/overlay.d.ts +0 -20
- package/dist/notifications/overlay.d.ts.map +0 -1
- package/dist/notifications/overlay.js +0 -12
- package/dist/provider/index.test.d.ts +0 -2
- package/dist/provider/index.test.d.ts.map +0 -1
- package/dist/provider/lab-theme.test.d.ts +0 -2
- package/dist/provider/lab-theme.test.d.ts.map +0 -1
- package/dist/query/devtools.d.ts.map +0 -1
- package/dist/query/error-message.d.ts +0 -41
- package/dist/query/error-message.d.ts.map +0 -1
- package/dist/query/error-message.js +0 -30
- package/dist/query/error-message.test.d.ts +0 -2
- package/dist/query/error-message.test.d.ts.map +0 -1
- package/dist/query/index.d.ts +0 -47
- package/dist/query/index.d.ts.map +0 -1
- package/dist/query/index.js +0 -56
- package/dist/router-tanstack/field.d.ts +0 -14
- package/dist/router-tanstack/field.d.ts.map +0 -1
- package/dist/router-tanstack/field.js +0 -4
- package/dist/router-tanstack/multi-search-param-store.d.ts +0 -43
- package/dist/router-tanstack/multi-search-param-store.d.ts.map +0 -1
- package/dist/router-tanstack/multi-search-param-store.js +0 -30
- package/dist/router-tanstack/multi-search-param-store.test.d.ts +0 -2
- package/dist/router-tanstack/multi-search-param-store.test.d.ts.map +0 -1
- package/dist/router-tanstack/nav.test.d.ts +0 -2
- package/dist/router-tanstack/nav.test.d.ts.map +0 -1
- package/dist/router-tanstack/search-param-store.d.ts +0 -42
- package/dist/router-tanstack/search-param-store.d.ts.map +0 -1
- package/dist/router-tanstack/search-param-store.js +0 -25
- package/dist/router-tanstack/search-param-store.test.d.ts +0 -2
- package/dist/router-tanstack/search-param-store.test.d.ts.map +0 -1
- package/dist/router-tanstack/search-store.router.test.d.ts +0 -2
- package/dist/router-tanstack/search-store.router.test.d.ts.map +0 -1
- package/dist/router-tanstack/search-store.test.d.ts +0 -2
- package/dist/router-tanstack/search-store.test.d.ts.map +0 -1
- package/dist/router-tanstack/use-nav.test.d.ts +0 -2
- package/dist/router-tanstack/use-nav.test.d.ts.map +0 -1
- package/dist/section/index.d.ts +0 -2
- package/dist/section/index.d.ts.map +0 -1
- package/dist/section/index.js +0 -4
- package/dist/section/section.d.ts +0 -24
- package/dist/section/section.d.ts.map +0 -1
- package/dist/section/section.js +0 -126
- package/dist/section/section.test.d.ts +0 -2
- package/dist/section/section.test.d.ts.map +0 -1
- package/dist/shell/app-mobile-nav.test.d.ts +0 -2
- package/dist/shell/app-mobile-nav.test.d.ts.map +0 -1
- package/dist/shell/app-sidebar.test.d.ts +0 -2
- package/dist/shell/app-sidebar.test.d.ts.map +0 -1
- package/dist/shell/index.test.d.ts +0 -2
- package/dist/shell/index.test.d.ts.map +0 -1
- package/dist/shell/mobile-nav-model.test.d.ts +0 -2
- package/dist/shell/mobile-nav-model.test.d.ts.map +0 -1
- package/dist/shell/page-bar.test.d.ts +0 -2
- package/dist/shell/page-bar.test.d.ts.map +0 -1
- package/dist/state/fields.test.d.ts +0 -2
- package/dist/state/fields.test.d.ts.map +0 -1
- package/dist/state/persisted.test.d.ts +0 -2
- package/dist/state/persisted.test.d.ts.map +0 -1
- package/dist/styles.floor.test.d.ts +0 -2
- package/dist/styles.floor.test.d.ts.map +0 -1
- package/dist/theme/border-coverage.test.d.ts +0 -18
- package/dist/theme/border-coverage.test.d.ts.map +0 -1
- package/dist/theme/contrast.test.d.ts +0 -2
- package/dist/theme/contrast.test.d.ts.map +0 -1
- package/dist/theme/ctl-theme.test.d.ts +0 -2
- package/dist/theme/ctl-theme.test.d.ts.map +0 -1
- package/dist/theme/ctl-tier-coverage.test.d.ts +0 -2
- package/dist/theme/ctl-tier-coverage.test.d.ts.map +0 -1
- package/dist/theme/density-option.test.d.ts +0 -2
- package/dist/theme/density-option.test.d.ts.map +0 -1
- package/dist/theme/density-relations.test.d.ts +0 -2
- package/dist/theme/density-relations.test.d.ts.map +0 -1
- package/dist/theme/derive-theme.test.d.ts +0 -2
- package/dist/theme/derive-theme.test.d.ts.map +0 -1
- package/dist/theme/divider-law.test.d.ts +0 -2
- package/dist/theme/divider-law.test.d.ts.map +0 -1
- package/dist/theme/fonts-option.test.d.ts +0 -2
- package/dist/theme/fonts-option.test.d.ts.map +0 -1
- package/dist/theme/icon-slot.test.d.ts +0 -2
- package/dist/theme/icon-slot.test.d.ts.map +0 -1
- package/dist/theme/layout-rhythm-css.test.d.ts +0 -2
- package/dist/theme/layout-rhythm-css.test.d.ts.map +0 -1
- package/dist/theme/radius-option.test.d.ts +0 -2
- package/dist/theme/radius-option.test.d.ts.map +0 -1
- package/dist/theme/radius.test.d.ts +0 -2
- package/dist/theme/radius.test.d.ts.map +0 -1
- package/dist/theme/shadow-surfaces.test.d.ts +0 -26
- package/dist/theme/shadow-surfaces.test.d.ts.map +0 -1
- package/dist/theme/spacing.test.d.ts +0 -2
- package/dist/theme/spacing.test.d.ts.map +0 -1
- package/dist/theme/use-basalt-spacing.test.d.ts +0 -2
- package/dist/theme/use-basalt-spacing.test.d.ts.map +0 -1
- package/dist/theme-lab/derive-controls.test.d.ts +0 -2
- package/dist/theme-lab/derive-controls.test.d.ts.map +0 -1
- package/dist/theme-lab/derive-state.test.d.ts +0 -2
- package/dist/theme-lab/derive-state.test.d.ts.map +0 -1
- package/dist/theme-lab/theme-lab.test.d.ts +0 -2
- package/dist/theme-lab/theme-lab.test.d.ts.map +0 -1
- package/dist/theme-toggle/index.d.ts +0 -8
- package/dist/theme-toggle/index.d.ts.map +0 -1
- package/dist/tokens/build-fonts-css.test.d.ts +0 -2
- package/dist/tokens/build-fonts-css.test.d.ts.map +0 -1
- package/dist/tokens/build-radius-css.test.d.ts +0 -2
- package/dist/tokens/build-radius-css.test.d.ts.map +0 -1
- package/dist/tokens/chart-margin.test.d.ts +0 -2
- package/dist/tokens/chart-margin.test.d.ts.map +0 -1
- package/dist/tokens/density.test.d.ts +0 -2
- package/dist/tokens/density.test.d.ts.map +0 -1
- package/dist/tokens/derive-radius.test.d.ts +0 -2
- package/dist/tokens/derive-radius.test.d.ts.map +0 -1
- package/dist/tokens/derive.test.d.ts +0 -2
- package/dist/tokens/derive.test.d.ts.map +0 -1
- package/dist/tokens/palette.test.d.ts +0 -2
- package/dist/tokens/palette.test.d.ts.map +0 -1
- package/dist/tokens/text-scale.test.d.ts +0 -2
- package/dist/tokens/text-scale.test.d.ts.map +0 -1
- package/dist/vite-color-mix.test.d.ts +0 -2
- package/dist/vite-color-mix.test.d.ts.map +0 -1
- package/dist/vite.test.d.ts +0 -2
- package/dist/vite.test.d.ts.map +0 -1
- package/dist/widget-header/delta-badge.d.ts +0 -13
- package/dist/widget-header/delta-badge.d.ts.map +0 -1
- package/dist/widget-header/delta-badge.js +0 -29
- package/dist/widget-header/delta-badge.test.d.ts +0 -2
- package/dist/widget-header/delta-badge.test.d.ts.map +0 -1
- package/dist/widget-header/index.d.ts +0 -3
- package/dist/widget-header/index.d.ts.map +0 -1
- package/dist/widget-header/index.js +0 -6
- package/dist/widget-header/no-mantine.test.d.ts +0 -2
- package/dist/widget-header/no-mantine.test.d.ts.map +0 -1
- package/dist/widget-header/widget-header.d.ts +0 -67
- package/dist/widget-header/widget-header.d.ts.map +0 -1
- package/dist/widget-header/widget-header.test.d.ts +0 -2
- package/dist/widget-header/widget-header.test.d.ts.map +0 -1
- package/src/agent/adapter.test.ts +0 -1640
- package/src/agent/ai-sdk-transport.test.ts +0 -658
- package/src/agent/coalesce.test.ts +0 -387
- package/src/agent/foreign.test.ts +0 -51
- package/src/agent/id.test.ts +0 -169
- package/src/agent/merge.test.ts +0 -206
- package/src/agent/part-list.test.tsx +0 -112
- package/src/agent/parts.test.ts +0 -720
- package/src/agent/thread.test.ts +0 -220
- package/src/agent/transport.test.ts +0 -70
- package/src/agent/use-agent-stream.test.tsx +0 -287
- package/src/agent/use-agent-thread-runs.foreign.test.tsx +0 -138
- package/src/agent/use-agent-thread-runs.resume.test.tsx +0 -294
- package/src/agent/use-agent-thread-runs.test.tsx +0 -1120
- package/src/agent/use-agent-thread-runs.wedge.test.tsx +0 -387
- package/src/agent-chat/composer.test.tsx +0 -924
- package/src/agent-chat/relative-time.test.ts +0 -95
- package/src/agent-chat/thread-feed-row.test.tsx +0 -510
- package/src/agent-chat/thread-feed.test.tsx +0 -241
- package/src/agent-chat/thread-message.test.tsx +0 -1285
- package/src/agent-chat/thread-workspace.test.tsx +0 -169
- package/src/agent-chat/tool-chip.test.tsx +0 -139
- package/src/agent-chat/virtualize.type-guard.test.ts +0 -49
- package/src/charts/cursor/resolve.test.ts +0 -151
- package/src/charts/cursor/store.test.ts +0 -64
- package/src/charts/kinds/BandStrip.test.tsx +0 -282
- package/src/charts/kinds/Bars.test.tsx +0 -183
- package/src/charts/kinds/DualPanel.test.tsx +0 -527
- package/src/charts/kinds/MirroredBars.test.tsx +0 -232
- package/src/charts/kinds/MultiLine.test.tsx +0 -218
- package/src/charts/kinds/StackedArea.test.tsx +0 -114
- package/src/charts/kinds/ZonedLine.test.tsx +0 -147
- package/src/charts/layout/auto-margin.test.ts +0 -42
- package/src/charts/primitives/CartesianChart.test.tsx +0 -647
- package/src/charts/primitives/ChartCard.test.tsx +0 -66
- package/src/charts/primitives/ChartFrame.test.tsx +0 -142
- package/src/charts/primitives/ChartLegend.test.tsx +0 -78
- package/src/charts/primitives/ChartTooltip.test.tsx +0 -44
- package/src/charts/primitives/XZoneRects.test.tsx +0 -123
- package/src/charts/series.test.ts +0 -112
- package/src/charts/utils/domain.test.ts +0 -54
- package/src/charts/utils/measure-text.test.ts +0 -36
- package/src/cli/check-coverage.test.ts +0 -297
- package/src/cli/check-theme.test.ts +0 -837
- package/src/cli/help.test.ts +0 -170
- package/src/cli/init-sync.test.ts +0 -343
- package/src/cli/placement-engine.test.ts +0 -298
- package/src/cli/shipped-versions.test.ts +0 -83
- package/src/cli/tarball-parity.test.ts +0 -44
- package/src/cli/template-format.test.ts +0 -64
- package/src/cli/template-ledger.test.ts +0 -219
- package/src/cli/tokens-css.test.ts +0 -249
- package/src/cli/toolchain-wiring.test.ts +0 -1358
- package/src/cli/waiver-audit.test.ts +0 -215
- package/src/connectivity/index.ts +0 -18
- package/src/content/article-actions.test.ts +0 -78
- package/src/content/article-model.test.ts +0 -119
- package/src/content/block-split.test.ts +0 -75
- package/src/content/heading-components.test.tsx +0 -65
- package/src/content/markdown.test.tsx +0 -603
- package/src/content/prose.module.css.test.ts +0 -39
- package/src/content/sanitize.test.ts +0 -659
- package/src/content/slug.test.ts +0 -62
- package/src/controls/actions.test.tsx +0 -252
- package/src/controls/actions.type-guard.test.ts +0 -63
- package/src/controls/control-group.test.tsx +0 -229
- package/src/controls/controls.router.test.tsx +0 -1053
- package/src/controls/filter-set.test.tsx +0 -472
- package/src/controls/peer-boundary.test.ts +0 -85
- package/src/controls/props-contract.test.tsx +0 -137
- package/src/controls/range-filter.type-guard.test.tsx +0 -122
- package/src/controls/sync-button.test.tsx +0 -183
- package/src/dashboard/query-state.test.tsx +0 -152
- package/src/dashboard/settings-section.test.tsx +0 -56
- package/src/dashboard/stat-card.test.tsx +0 -385
- package/src/data/data-table.test.tsx +0 -434
- package/src/data/index.ts +0 -41
- package/src/guard/check-source.test.ts +0 -3388
- package/src/guard/grace.test.ts +0 -158
- package/src/guard/guard-hook.test.ts +0 -203
- package/src/notifications/overlay.tsx +0 -64
- package/src/provider/index.test.tsx +0 -101
- package/src/provider/lab-theme.test.ts +0 -147
- package/src/query/error-message.test.ts +0 -67
- package/src/query/error-message.ts +0 -70
- package/src/query/index.ts +0 -97
- package/src/router-tanstack/field.ts +0 -35
- package/src/router-tanstack/multi-search-param-store.test.ts +0 -124
- package/src/router-tanstack/multi-search-param-store.ts +0 -106
- package/src/router-tanstack/nav.test.ts +0 -111
- package/src/router-tanstack/search-param-store.test.ts +0 -135
- package/src/router-tanstack/search-param-store.ts +0 -100
- package/src/router-tanstack/search-store.router.test.tsx +0 -882
- package/src/router-tanstack/search-store.test.ts +0 -578
- package/src/router-tanstack/use-nav.test.tsx +0 -187
- package/src/section/index.ts +0 -1
- package/src/section/section.test.tsx +0 -204
- package/src/section/section.tsx +0 -220
- package/src/shell/app-mobile-nav.test.tsx +0 -403
- package/src/shell/app-sidebar.test.tsx +0 -509
- package/src/shell/index.test.tsx +0 -428
- package/src/shell/mobile-nav-model.test.ts +0 -517
- package/src/shell/page-bar.test.tsx +0 -316
- package/src/state/fields.test.tsx +0 -512
- package/src/state/persisted.test.ts +0 -91
- package/src/styles.floor.test.ts +0 -36
- package/src/theme/border-coverage.test.ts +0 -272
- package/src/theme/contrast.test.ts +0 -354
- package/src/theme/ctl-theme.test.tsx +0 -275
- package/src/theme/ctl-tier-coverage.test.ts +0 -170
- package/src/theme/density-option.test.ts +0 -96
- package/src/theme/density-relations.test.ts +0 -506
- package/src/theme/derive-theme.test.ts +0 -101
- package/src/theme/divider-law.test.ts +0 -259
- package/src/theme/fonts-option.test.ts +0 -75
- package/src/theme/icon-slot.test.tsx +0 -275
- package/src/theme/layout-rhythm-css.test.ts +0 -72
- package/src/theme/radius-option.test.ts +0 -86
- package/src/theme/radius.test.ts +0 -142
- package/src/theme/shadow-surfaces.test.ts +0 -488
- package/src/theme/spacing.test.ts +0 -495
- package/src/theme/use-basalt-spacing.test.tsx +0 -55
- package/src/theme-lab/derive-controls.test.ts +0 -94
- package/src/theme-lab/derive-state.test.ts +0 -71
- package/src/theme-lab/theme-lab.test.ts +0 -46
- package/src/tokens/build-fonts-css.test.ts +0 -52
- package/src/tokens/build-radius-css.test.ts +0 -25
- package/src/tokens/chart-margin.test.ts +0 -39
- package/src/tokens/density.test.ts +0 -259
- package/src/tokens/derive-radius.test.ts +0 -62
- package/src/tokens/derive.test.ts +0 -30
- package/src/tokens/palette.test.ts +0 -114
- package/src/tokens/text-scale.test.ts +0 -51
- package/src/vite-color-mix.test.ts +0 -46
- package/src/vite.test.ts +0 -423
- package/src/widget-header/delta-badge.test.tsx +0 -60
- package/src/widget-header/delta-badge.tsx +0 -57
- package/src/widget-header/index.ts +0 -2
- package/src/widget-header/no-mantine.test.ts +0 -33
- package/src/widget-header/widget-header.test.tsx +0 -187
- package/src/widget-header/widget-header.tsx +0 -213
- /package/dist/{motion/index.js → common/motion.js} +0 -0
- /package/dist/{section → dashboard}/section.module.css.d.ts +0 -0
- /package/dist/{widget-header → dashboard}/widget-header.module.css.d.ts +0 -0
- /package/dist/{connectivity/types.js → provider/connectivity-types.js} +0 -0
- /package/dist/{connectivity → provider}/use-connectivity.js +0 -0
- /package/dist/{nav/types.js → shell/nav-types.js} +0 -0
- /package/src/{motion/index.ts → common/motion.ts} +0 -0
- /package/src/{section → dashboard}/section.module.css.d.ts +0 -0
- /package/src/{widget-header → dashboard}/widget-header.module.css.d.ts +0 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prop validation, in the two shapes basalt actually needs (Blueprint audit §3, isomorphic finding
|
|
3
|
+
* F-ERR-1).
|
|
4
|
+
*
|
|
5
|
+
* The split is the design: a MISUSE that would crash anyway throws immediately with a written
|
|
6
|
+
* message (`assertRequiredProps`), while a misuse that merely renders something the caller did not
|
|
7
|
+
* mean warns once in dev and renders on (`useValidateProps`).
|
|
8
|
+
*/
|
|
9
|
+
import { useEffect } from 'react'
|
|
10
|
+
import { isDev } from './is-dev'
|
|
11
|
+
import { requiredProp } from './errors'
|
|
12
|
+
|
|
13
|
+
/** A check returns the message(s) it has, or nothing. `null`/`undefined` entries are ignored. */
|
|
14
|
+
type CheckResult = string | null | undefined | Array<string | null | undefined>
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Module-level so the once-per-message promise survives a re-render, a remount, and a second
|
|
18
|
+
* instance of the same component. A dev warning is about the CODE, and printing it per render is
|
|
19
|
+
* how a real warning gets scrolled out of the console. Keyed by `component` + message, so two
|
|
20
|
+
* different faults in one component both get said.
|
|
21
|
+
*/
|
|
22
|
+
const reported = new Set<string>()
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Dev-only prop validation. `console.error`s each message ONCE per `(component, message)` pair, and
|
|
26
|
+
* is a no-op in production: `isDev()` reads `process.env.NODE_ENV`, which every bundler
|
|
27
|
+
* constant-folds, so the whole body disappears from a production build.
|
|
28
|
+
*
|
|
29
|
+
* **The dedup key is `${component} ${message}`, and nothing else** — not the instance, not the
|
|
30
|
+
* props. Two instances of one component producing the SAME message say it once between them, which
|
|
31
|
+
* is the intent (a dev warning is about the code). A caller that wants it said per instance has to
|
|
32
|
+
* embed the identifying context IN the message — the title, the persist key, the field name — the
|
|
33
|
+
* way `Section` writes `Section "<title>": …`. A message built from nothing instance-specific is a
|
|
34
|
+
* message the second faulty call site never gets.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* useValidateProps(
|
|
38
|
+
* 'Section',
|
|
39
|
+
* () => (persistKey !== undefined && !collapsible ? sectionPersistMessage : null),
|
|
40
|
+
* [persistKey, collapsible],
|
|
41
|
+
* )
|
|
42
|
+
*/
|
|
43
|
+
export function useValidateProps(
|
|
44
|
+
component: string,
|
|
45
|
+
check: () => CheckResult,
|
|
46
|
+
deps: unknown[],
|
|
47
|
+
): void {
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
if (!isDev()) return
|
|
50
|
+
const result = check()
|
|
51
|
+
const messages = Array.isArray(result) ? result : [result]
|
|
52
|
+
for (const raw of messages) {
|
|
53
|
+
if (raw === null || raw === undefined) continue
|
|
54
|
+
const key = `${component} ${raw}`
|
|
55
|
+
if (reported.has(key)) continue
|
|
56
|
+
reported.add(key)
|
|
57
|
+
console.error(raw)
|
|
58
|
+
}
|
|
59
|
+
// The deps ARE the caller's contract: this hook cannot know what `check` closes over.
|
|
60
|
+
// oxlint-disable-next-line react-hooks/exhaustive-deps -- the caller owns the dep list
|
|
61
|
+
}, deps)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** Test seam. The once-per-message Set is module state, so a suite has to be able to clear it. */
|
|
65
|
+
export function resetValidatedProps(): void {
|
|
66
|
+
reported.clear()
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* THROWS on a missing required prop, in every build, before the component reads into it.
|
|
71
|
+
*
|
|
72
|
+
* This is the F-ERR-1 remedy, and the reason it is not dev-gated: the component was going to crash
|
|
73
|
+
* either way (`undefined is not an object (evaluating 'field.use')`), so the only thing in question
|
|
74
|
+
* is whether the stack reaching `BasaltErrorBoundary` names the component and the prop. It does
|
|
75
|
+
* now. A prop that is merely questionable belongs in `useValidateProps`, not here.
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* assertRequiredProps('SelectFilter', props, ['field'])
|
|
79
|
+
*/
|
|
80
|
+
export function assertRequiredProps<P extends object>(
|
|
81
|
+
component: string,
|
|
82
|
+
props: P,
|
|
83
|
+
keys: ReadonlyArray<Extract<keyof P, string>>,
|
|
84
|
+
hints?: Partial<Record<Extract<keyof P, string>, string>>,
|
|
85
|
+
): void {
|
|
86
|
+
for (const key of keys) {
|
|
87
|
+
const value = (props as Record<string, unknown>)[key]
|
|
88
|
+
if (value !== undefined && value !== null) continue
|
|
89
|
+
const hint = hints?.[key]
|
|
90
|
+
throw new Error(
|
|
91
|
+
hint === undefined ? requiredProp(component, key) : requiredProp(component, key, hint),
|
|
92
|
+
)
|
|
93
|
+
}
|
|
94
|
+
}
|
|
@@ -17,6 +17,11 @@
|
|
|
17
17
|
grid-template-columns: minmax(0, var(--vx-prose-measure));
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
+
/* The literal below MUST equal `BREAKPOINTS.article` (src/tokens/index.ts) — a `@media`
|
|
21
|
+
* condition is resolved before custom properties exist, so `max-width: var(--x)` is invalid CSS
|
|
22
|
+
* and a stylesheet with a responsive rule has no choice but to write the number. The token is the
|
|
23
|
+
* readable half; `article-layout.breakpoint.test.ts` asserts the two agree, the same
|
|
24
|
+
* "literal must match the token" idiom as `styles.floor.test.ts`. Change both or neither. */
|
|
20
25
|
@media (max-width: 1200px) {
|
|
21
26
|
.root {
|
|
22
27
|
grid-template-columns: minmax(0, var(--vx-prose-measure));
|
|
@@ -72,10 +77,12 @@
|
|
|
72
77
|
.tocRail {
|
|
73
78
|
grid-column: 2;
|
|
74
79
|
position: sticky;
|
|
75
|
-
/*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
80
|
+
/* The rail sticks inside whatever scrolls it — `AppShell.Main` in a shell, the document without
|
|
81
|
+
* one — and NOTHING overhangs that box: the app header and `PageBar` row 2's band are both shell
|
|
82
|
+
* regions rendered outside the scrollport (`shell/app-main.module.css`). So the offset is
|
|
83
|
+
* `--vx-space-sticky-header-clearance` and nothing else, which is exactly what that token means
|
|
84
|
+
* since it stopped carrying a header height (tokens/palette.ts, `deriveSpacing`;
|
|
85
|
+
* docs/CONTENT-SPEC.md §5). */
|
|
79
86
|
top: var(--vx-space-sticky-header-clearance);
|
|
80
87
|
align-self: start;
|
|
81
88
|
}
|
package/src/content/callout.tsx
CHANGED
|
@@ -8,20 +8,25 @@
|
|
|
8
8
|
* <p>This endpoint is rate-limited to 60 requests/minute.</p>
|
|
9
9
|
* </Callout>
|
|
10
10
|
*/
|
|
11
|
-
import type {
|
|
11
|
+
import type { ReactNode } from 'react'
|
|
12
|
+
import { cx } from '../common/props'
|
|
13
|
+
import type { BasaltProps } from '../common/props'
|
|
12
14
|
import classes from './callout.module.css'
|
|
13
15
|
|
|
16
|
+
/**
|
|
17
|
+
* One of the five `Tone` forks (`common/props.ts`) — kept as its own type because `info` has no
|
|
18
|
+
* `Tone` equivalent: `good`/`warn`/`bad` line up with `Tone` exactly, `info` is the extra kind a
|
|
19
|
+
* callout needs that a status badge does not.
|
|
20
|
+
*/
|
|
14
21
|
export type CalloutKind = 'info' | 'good' | 'warn' | 'bad'
|
|
15
22
|
|
|
16
|
-
export type CalloutProps = {
|
|
23
|
+
export type CalloutProps = BasaltProps & {
|
|
17
24
|
/** Semantic kind — drives the rail/tint color and the default icon. Default `'info'`. */
|
|
18
25
|
readonly kind?: CalloutKind
|
|
19
26
|
readonly title?: string
|
|
20
27
|
/** Overrides the default per-kind icon. Only rendered alongside a `title`. */
|
|
21
28
|
readonly icon?: ReactNode
|
|
22
29
|
readonly children: ReactNode
|
|
23
|
-
readonly className?: string
|
|
24
|
-
readonly style?: CSSProperties
|
|
25
30
|
}
|
|
26
31
|
|
|
27
32
|
const KIND_CLASS: Record<CalloutKind, string> = {
|
|
@@ -80,10 +85,11 @@ const DEFAULT_ICON: Record<CalloutKind, ReactNode> = {
|
|
|
80
85
|
}
|
|
81
86
|
|
|
82
87
|
export function Callout({ kind = 'info', title, icon, children, className, style }: CalloutProps) {
|
|
83
|
-
const rootClass = [classes.root, KIND_CLASS[kind], className].filter(Boolean).join(' ')
|
|
84
|
-
|
|
85
88
|
return (
|
|
86
|
-
<div
|
|
89
|
+
<div
|
|
90
|
+
className={cx(classes.root, KIND_CLASS[kind], className)}
|
|
91
|
+
{...(style !== undefined && { style })}
|
|
92
|
+
>
|
|
87
93
|
{title !== undefined && (
|
|
88
94
|
<div className={classes.titleRow}>
|
|
89
95
|
<span className={classes.icon}>{icon ?? DEFAULT_ICON[kind]}</span>
|
package/src/content/guide.tsx
CHANGED
|
@@ -18,6 +18,8 @@ import type { ReactNode } from 'react'
|
|
|
18
18
|
import { ActionIcon, Button, Drawer } from '@mantine/core'
|
|
19
19
|
import type { DrawerProps } from '@mantine/core'
|
|
20
20
|
import { useDisclosure } from '@mantine/hooks'
|
|
21
|
+
import type { BasaltProps } from '../common/props'
|
|
22
|
+
import { cx } from '../common/props'
|
|
21
23
|
import classes from './guide.module.css'
|
|
22
24
|
import type { ArticleNavTarget } from './article-layout'
|
|
23
25
|
import { Markdown } from './markdown'
|
|
@@ -54,7 +56,7 @@ function GuideGlyph() {
|
|
|
54
56
|
)
|
|
55
57
|
}
|
|
56
58
|
|
|
57
|
-
export type GuideDrawerProps = {
|
|
59
|
+
export type GuideDrawerProps = BasaltProps & {
|
|
58
60
|
readonly opened: boolean
|
|
59
61
|
readonly onClose: () => void
|
|
60
62
|
readonly title: string
|
|
@@ -78,6 +80,8 @@ export function GuideDrawer({
|
|
|
78
80
|
fullPageHref,
|
|
79
81
|
renderLink = defaultRenderLink,
|
|
80
82
|
size = 440,
|
|
83
|
+
className,
|
|
84
|
+
style,
|
|
81
85
|
}: GuideDrawerProps) {
|
|
82
86
|
return (
|
|
83
87
|
<Drawer
|
|
@@ -86,6 +90,8 @@ export function GuideDrawer({
|
|
|
86
90
|
position="right"
|
|
87
91
|
size={size}
|
|
88
92
|
title={<span className={classes.drawerTitle}>{title}</span>}
|
|
93
|
+
{...(className !== undefined && { className })}
|
|
94
|
+
{...(style !== undefined && { style })}
|
|
89
95
|
>
|
|
90
96
|
<div className={classes.body}>
|
|
91
97
|
{markdown !== undefined ? (
|
|
@@ -111,7 +117,7 @@ export function GuideDrawer({
|
|
|
111
117
|
)
|
|
112
118
|
}
|
|
113
119
|
|
|
114
|
-
export type GuideLinkProps = {
|
|
120
|
+
export type GuideLinkProps = BasaltProps & {
|
|
115
121
|
/** Trigger label. Default `'Guide'`. */
|
|
116
122
|
readonly label?: string
|
|
117
123
|
readonly title: string
|
|
@@ -131,6 +137,8 @@ export function GuideLink({
|
|
|
131
137
|
fullPageHref,
|
|
132
138
|
renderLink,
|
|
133
139
|
iconOnly = false,
|
|
140
|
+
className,
|
|
141
|
+
style,
|
|
134
142
|
}: GuideLinkProps) {
|
|
135
143
|
const [opened, { open, close }] = useDisclosure(false)
|
|
136
144
|
|
|
@@ -141,9 +149,10 @@ export function GuideLink({
|
|
|
141
149
|
variant="subtle"
|
|
142
150
|
color="gray"
|
|
143
151
|
size="sm"
|
|
144
|
-
className={classes.trigger}
|
|
152
|
+
className={cx(classes.trigger, className)}
|
|
145
153
|
onClick={open}
|
|
146
154
|
aria-label={label}
|
|
155
|
+
{...(style !== undefined && { style })}
|
|
147
156
|
>
|
|
148
157
|
<GuideGlyph />
|
|
149
158
|
</ActionIcon>
|
|
@@ -152,9 +161,10 @@ export function GuideLink({
|
|
|
152
161
|
variant="subtle"
|
|
153
162
|
color="gray"
|
|
154
163
|
size="compact-xs"
|
|
155
|
-
className={classes.trigger}
|
|
164
|
+
className={cx(classes.trigger, className)}
|
|
156
165
|
leftSection={<GuideGlyph />}
|
|
157
166
|
onClick={open}
|
|
167
|
+
{...(style !== undefined && { style })}
|
|
158
168
|
>
|
|
159
169
|
<span className={classes.triggerLabel}>{label}</span>
|
|
160
170
|
</Button>
|
|
@@ -19,18 +19,25 @@
|
|
|
19
19
|
* <h2 id={id}>Setup<HeadingAnchor id={id} /></h2>
|
|
20
20
|
* </Prose>
|
|
21
21
|
*/
|
|
22
|
+
import type { BasaltProps } from '../common/props'
|
|
23
|
+
import { cx } from '../common/props'
|
|
22
24
|
import { CopyAction } from './copy-action'
|
|
23
25
|
import { LinkGlyph } from './glyphs'
|
|
24
26
|
import classes from './prose.module.css'
|
|
25
27
|
|
|
26
|
-
export type HeadingAnchorProps = {
|
|
28
|
+
export type HeadingAnchorProps = BasaltProps & {
|
|
27
29
|
/** The heading's `id` — the fragment the copied URL points at. */
|
|
28
30
|
readonly id: string
|
|
29
31
|
/** Accessible name for the trigger. */
|
|
30
32
|
readonly label?: string
|
|
31
33
|
}
|
|
32
34
|
|
|
33
|
-
export function HeadingAnchor({
|
|
35
|
+
export function HeadingAnchor({
|
|
36
|
+
id,
|
|
37
|
+
label = 'Copy link to section',
|
|
38
|
+
className,
|
|
39
|
+
style,
|
|
40
|
+
}: HeadingAnchorProps) {
|
|
34
41
|
// Resolved at click time, never at render: the component is SSR-rendered (no `window`), and the
|
|
35
42
|
// live search/pathname is the honest basis for the link a reader is asking to share.
|
|
36
43
|
const resolveUrl = () => {
|
|
@@ -41,7 +48,11 @@ export function HeadingAnchor({ id, label = 'Copy link to section' }: HeadingAnc
|
|
|
41
48
|
// The span owns placement + the hover reveal; CopyAction owns the affordance itself. It also
|
|
42
49
|
// carries `data-heading-anchor`, which `TableOfContents` strips when reading a heading's label.
|
|
43
50
|
return (
|
|
44
|
-
<span
|
|
51
|
+
<span
|
|
52
|
+
className={cx(classes.headingAnchor, className)}
|
|
53
|
+
data-heading-anchor
|
|
54
|
+
{...(style !== undefined && { style })}
|
|
55
|
+
>
|
|
45
56
|
<CopyAction
|
|
46
57
|
value={resolveUrl}
|
|
47
58
|
label="Copy link"
|
package/src/content/index.ts
CHANGED
|
@@ -27,6 +27,8 @@ export type { TableOfContentsProps, TocItem } from './toc'
|
|
|
27
27
|
export { ReadingProgress } from './reading-progress'
|
|
28
28
|
export type { ReadingProgressProps } from './reading-progress'
|
|
29
29
|
|
|
30
|
+
// `SlugTracker` is a PascalCase utility class, not a component — see its own JSDoc `@remarks`
|
|
31
|
+
// (isomorphic harness finding F-DET-1). `new SlugTracker()`, never `<SlugTracker />`.
|
|
30
32
|
export { headingSlug, readingTime, SlugTracker } from './slug'
|
|
31
33
|
export type { ReadingTime } from './slug'
|
|
32
34
|
|
package/src/content/markdown.tsx
CHANGED
|
@@ -101,10 +101,9 @@ export type MarkdownProps = {
|
|
|
101
101
|
* default to same-origin `['/']`; `'trusted'` (your own authored content) keeps
|
|
102
102
|
* `['https://', '/']`. An explicit `allowedImagePrefixes` always wins over both.
|
|
103
103
|
*
|
|
104
|
-
* Default: `'
|
|
105
|
-
*
|
|
106
|
-
*
|
|
107
|
-
* must pin `contentTrust="untrusted"` explicitly rather than lean on `streaming`.
|
|
104
|
+
* Default: `'trusted'`. Settledness has nothing to do with trust: a FINISHED agent message is
|
|
105
|
+
* still model-generated, so any surface rendering agent text must pin `contentTrust="untrusted"`
|
|
106
|
+
* explicitly rather than lean on `streaming`.
|
|
108
107
|
*/
|
|
109
108
|
readonly contentTrust?: MarkdownContentTrust
|
|
110
109
|
/**
|
|
@@ -394,6 +393,7 @@ const LazyReactMarkdown = lazy(() =>
|
|
|
394
393
|
})
|
|
395
394
|
.catch(() => ({ default: ({ text }: BridgeProps) => <PlainTextFallback text={text} /> })),
|
|
396
395
|
)
|
|
396
|
+
Object.assign(LazyReactMarkdown, { displayName: 'LazyReactMarkdown' })
|
|
397
397
|
|
|
398
398
|
// ── Streaming block rendering ──────────────────────────────────────────────────────────────────
|
|
399
399
|
|
|
@@ -443,6 +443,7 @@ function BlockRenderer({
|
|
|
443
443
|
// Referential stability of `components`/`urlTransform` (both memoized by the caller) is what makes
|
|
444
444
|
// this memo skip re-rendering an unchanged settled block — see the module JSDoc.
|
|
445
445
|
const MemoizedBlock = memo(BlockRenderer)
|
|
446
|
+
MemoizedBlock.displayName = 'MemoizedBlock'
|
|
446
447
|
|
|
447
448
|
// ── Lazy-loaded remend ─────────────────────────────────────────────────────────────────────────
|
|
448
449
|
|
|
@@ -616,10 +617,7 @@ export function Markdown({
|
|
|
616
617
|
density = 'article',
|
|
617
618
|
measure,
|
|
618
619
|
streaming = false,
|
|
619
|
-
|
|
620
|
-
// read straight off `streaming`, so dropping it would silently widen every existing streaming
|
|
621
|
-
// call site). It is a floor, never the policy — see the prop's JSDoc.
|
|
622
|
-
contentTrust = streaming ? 'untrusted' : 'trusted',
|
|
620
|
+
contentTrust = 'trusted',
|
|
623
621
|
components,
|
|
624
622
|
fenceRenderers,
|
|
625
623
|
sanitizeSchema,
|
|
@@ -32,16 +32,18 @@
|
|
|
32
32
|
margin-bottom: 0;
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
/*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* `--basalt-page-bar-h`
|
|
39
|
-
*
|
|
40
|
-
*
|
|
35
|
+
/* Anchor clearance. One value on every viewport, and NO chrome height in it: an anchor scroll
|
|
36
|
+
* happens inside the scrollport, and since `BasaltShell` made `AppShell.Main` that box both the
|
|
37
|
+
* AppShell header and `PageBar` row 2's band are regions rendered OUTSIDE it
|
|
38
|
+
* (`shell/app-main.module.css`) — the `--basalt-page-bar-h` term this rule used to add would now
|
|
39
|
+
* push every heading a band below where it belongs, and an `--app-shell-header-height` term (gone
|
|
40
|
+
* since the controls waves) would add a header on top of that. What is left is breathing room,
|
|
41
|
+
* which is precisely what `--vx-space-sticky-header-clearance` means now (tokens/palette.ts). A
|
|
42
|
+
* `./content` consumer with its OWN fixed chrome above the scrollport overrides that token. */
|
|
41
43
|
.root h2,
|
|
42
44
|
.root h3,
|
|
43
45
|
.root h4 {
|
|
44
|
-
scroll-margin-top:
|
|
46
|
+
scroll-margin-top: var(--vx-space-sticky-header-clearance);
|
|
45
47
|
}
|
|
46
48
|
|
|
47
49
|
/* Headings share family/weight/color across densities; size + margin differ below. */
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ReadingProgress — an opt-in, scroll-driven 2px top bar (docs/CONTENT-SPEC.md §3/§7).
|
|
3
3
|
*
|
|
4
|
-
* Progress is how far `target` (default: the whole
|
|
4
|
+
* Progress is how far `target` (default: the whole scrollport) has been scrolled through the
|
|
5
5
|
* viewport — 0 at the top of `target`, 1 once its bottom edge has cleared the viewport.
|
|
6
6
|
*
|
|
7
|
+
* WHICH BOX SCROLLS is resolved, never assumed: inside `BasaltShell` the scroller is
|
|
8
|
+
* `AppShell.Main` (`shell/app-main.module.css`), where `window.scrollY` is pinned at 0 and a
|
|
9
|
+
* `scroll` listener on `window` never fires. `scrollParentOf` answers `null` for a shell-less app
|
|
10
|
+
* and this falls back to the window unchanged.
|
|
11
|
+
*
|
|
7
12
|
* @example
|
|
8
13
|
* import { ReadingProgress } from 'basalt-ui/content'
|
|
9
14
|
*
|
|
@@ -13,35 +18,50 @@
|
|
|
13
18
|
*/
|
|
14
19
|
import type { RefObject } from 'react'
|
|
15
20
|
import { useEffect, useRef, useState } from 'react'
|
|
21
|
+
import type { BasaltProps } from '../common/props'
|
|
22
|
+
import { cx } from '../common/props'
|
|
23
|
+
import { scrollParentOf } from '../common/scroll-parent'
|
|
16
24
|
import classes from './reading-progress.module.css'
|
|
17
25
|
|
|
18
|
-
export type ReadingProgressProps = {
|
|
19
|
-
/** The element to track scroll progress through. Default: the whole
|
|
26
|
+
export type ReadingProgressProps = BasaltProps & {
|
|
27
|
+
/** The element to track scroll progress through. Default: the whole scrollport. */
|
|
20
28
|
readonly target?: RefObject<HTMLElement | null>
|
|
21
29
|
}
|
|
22
30
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
31
|
+
/**
|
|
32
|
+
* `port` is the resolved scrollport, or `null` for "the document scrolls". The only thing that
|
|
33
|
+
* changes between the two is where the four numbers come from — `target`'s offset is measured
|
|
34
|
+
* against the SCROLLER's own top edge rather than the viewport's, which for the window case is the
|
|
35
|
+
* same edge and reduces to the original arithmetic.
|
|
36
|
+
*/
|
|
37
|
+
function computeProgress(target: HTMLElement | null | undefined, port: HTMLElement | null): number {
|
|
38
|
+
const viewport = port ? port.clientHeight : window.innerHeight
|
|
39
|
+
const scrollTop = port ? port.scrollTop : window.scrollY
|
|
40
|
+
const originTop = port ? port.getBoundingClientRect().top : 0
|
|
41
|
+
const scrollable = port ? port.scrollHeight : document.documentElement.scrollHeight
|
|
26
42
|
|
|
27
|
-
const start = target ? target.getBoundingClientRect().top + scrollTop : 0
|
|
28
|
-
const total = target
|
|
29
|
-
? target.offsetHeight - viewport
|
|
30
|
-
: document.documentElement.scrollHeight - viewport
|
|
43
|
+
const start = target ? target.getBoundingClientRect().top - originTop + scrollTop : 0
|
|
44
|
+
const total = target ? target.offsetHeight - viewport : scrollable - viewport
|
|
31
45
|
|
|
32
46
|
if (total <= 0) return 0
|
|
33
47
|
const ratio = (scrollTop - start) / total
|
|
34
48
|
return Math.min(1, Math.max(0, ratio))
|
|
35
49
|
}
|
|
36
50
|
|
|
37
|
-
export function ReadingProgress({ target }: ReadingProgressProps = {}) {
|
|
51
|
+
export function ReadingProgress({ target, className, style }: ReadingProgressProps = {}) {
|
|
38
52
|
const [progress, setProgress] = useState(0)
|
|
39
53
|
const frame = useRef<number | null>(null)
|
|
54
|
+
const rootRef = useRef<HTMLDivElement | null>(null)
|
|
40
55
|
|
|
41
56
|
useEffect(() => {
|
|
57
|
+
// The bar itself is a fine probe when there is no `target`: it is mounted inside whatever
|
|
58
|
+
// region the reader is scrolling, which is the box this is measuring.
|
|
59
|
+
const port = scrollParentOf(target?.current ?? rootRef.current)
|
|
60
|
+
const scroller: Window | HTMLElement = port ?? window
|
|
61
|
+
|
|
42
62
|
const tick = () => {
|
|
43
63
|
frame.current = null
|
|
44
|
-
setProgress(computeProgress(target?.current))
|
|
64
|
+
setProgress(computeProgress(target?.current, port))
|
|
45
65
|
}
|
|
46
66
|
|
|
47
67
|
const onScroll = () => {
|
|
@@ -50,17 +70,22 @@ export function ReadingProgress({ target }: ReadingProgressProps = {}) {
|
|
|
50
70
|
}
|
|
51
71
|
|
|
52
72
|
tick()
|
|
53
|
-
|
|
73
|
+
scroller.addEventListener('scroll', onScroll, { passive: true })
|
|
54
74
|
window.addEventListener('resize', onScroll, { passive: true })
|
|
55
75
|
return () => {
|
|
56
|
-
|
|
76
|
+
scroller.removeEventListener('scroll', onScroll)
|
|
57
77
|
window.removeEventListener('resize', onScroll)
|
|
58
78
|
if (frame.current !== null) cancelAnimationFrame(frame.current)
|
|
59
79
|
}
|
|
60
80
|
}, [target])
|
|
61
81
|
|
|
62
82
|
return (
|
|
63
|
-
<div
|
|
83
|
+
<div
|
|
84
|
+
ref={rootRef}
|
|
85
|
+
className={cx(classes.root, className)}
|
|
86
|
+
aria-hidden
|
|
87
|
+
{...(style !== undefined && { style })}
|
|
88
|
+
>
|
|
64
89
|
<div className={classes.fill} style={{ transform: `scaleX(${progress})` }} />
|
|
65
90
|
</div>
|
|
66
91
|
)
|
package/src/content/slug.ts
CHANGED
|
@@ -28,6 +28,10 @@ export function headingSlug(text: string): string {
|
|
|
28
28
|
* Dedupes repeated slugs within one document — the second occurrence of a slug gets `-1`, the
|
|
29
29
|
* third `-2`, and so on (matches github-slugger's own collision behavior). Create one instance
|
|
30
30
|
* per document/render pass; it carries no global state.
|
|
31
|
+
*
|
|
32
|
+
* @remarks not a component — an ordinary PascalCase utility class on the `content` barrel
|
|
33
|
+
* (isomorphic harness finding F-DET-1). It carries no `prototype.isReactComponent` marker, so
|
|
34
|
+
* `new SlugTracker()`, not `<SlugTracker />`.
|
|
31
35
|
*/
|
|
32
36
|
export class SlugTracker {
|
|
33
37
|
private readonly counts = new Map<string, number>()
|
package/src/content/toc.tsx
CHANGED
|
@@ -6,6 +6,17 @@
|
|
|
6
6
|
* `headingSlug`/`SlugTracker` when authoring the headings. Sticky positioning is the consumer's
|
|
7
7
|
* job; this component is just the rail.
|
|
8
8
|
*
|
|
9
|
+
* The spy resolves WHICH BOX SCROLLS (`scrollParentOf`) instead of assuming the window: inside
|
|
10
|
+
* `BasaltShell` that is `AppShell.Main` (`shell/app-main.module.css`), so both the observer's root
|
|
11
|
+
* and the bottom-edge arithmetic have to be that element — a window listener there never fires and
|
|
12
|
+
* a viewport-rooted observer measures the wrong band. `null` means the document scrolls, which is
|
|
13
|
+
* the shell-less case and behaves exactly as before.
|
|
14
|
+
*
|
|
15
|
+
* The active rail item carries `aria-current="location"` (WAI-ARIA APG's own recommendation for a
|
|
16
|
+
* link set that navigates within one page, rather than `"page"`/`"true"`) — both a genuine a11y fix
|
|
17
|
+
* (previously `activeId` drove `classes.active` alone, so a screen reader had no signal at all) and
|
|
18
|
+
* the one DOM-observable hook for `activeId` that does not depend on a CSS Modules class hash.
|
|
19
|
+
*
|
|
9
20
|
* @example
|
|
10
21
|
* import { TableOfContents, headingSlug } from 'basalt-ui/content'
|
|
11
22
|
*
|
|
@@ -18,6 +29,7 @@
|
|
|
18
29
|
import type { MouseEvent, RefObject } from 'react'
|
|
19
30
|
import { useEffect, useRef, useState } from 'react'
|
|
20
31
|
import { useReducedMotion } from '@mantine/hooks'
|
|
32
|
+
import { scrollParentOf } from '../common/scroll-parent'
|
|
21
33
|
import classes from './toc.module.css'
|
|
22
34
|
|
|
23
35
|
export type TocItem = {
|
|
@@ -79,6 +91,11 @@ export function TableOfContents({
|
|
|
79
91
|
// Set while a clicked item owns the rail; `resolve` stands down until it's released.
|
|
80
92
|
const pinnedRef = useRef<string | null>(null)
|
|
81
93
|
const releasePinRef = useRef<(() => void) | null>(null)
|
|
94
|
+
// The rail's own node — the probe `scrollParentOf` walks from when there is no `containerRef`.
|
|
95
|
+
const navRef = useRef<HTMLElement | null>(null)
|
|
96
|
+
// The resolved scrollport (`null` = the document), published by the spy effect so the click-pin
|
|
97
|
+
// release below listens for `scrollend` on the same box the spy is watching.
|
|
98
|
+
const portRef = useRef<HTMLElement | null>(null)
|
|
82
99
|
|
|
83
100
|
useEffect(() => {
|
|
84
101
|
return () => releasePinRef.current?.()
|
|
@@ -108,6 +125,10 @@ export function TableOfContents({
|
|
|
108
125
|
.filter((el): el is HTMLElement => el !== null)
|
|
109
126
|
if (elements.length === 0) return
|
|
110
127
|
|
|
128
|
+
const port = scrollParentOf(containerRef?.current ?? navRef.current)
|
|
129
|
+
portRef.current = port
|
|
130
|
+
const scroller: Window | HTMLElement = port ?? window
|
|
131
|
+
|
|
111
132
|
const intersecting = new Set<string>()
|
|
112
133
|
|
|
113
134
|
const resolve = () => {
|
|
@@ -118,8 +139,9 @@ export function TableOfContents({
|
|
|
118
139
|
// Bottom edge: the last sections are usually shorter than the observer's 70% dead zone, so
|
|
119
140
|
// their headings can NEVER reach the activation band — the rail would stall on whichever
|
|
120
141
|
// section last made it in. Once the page bottoms out, the final item is the honest answer.
|
|
121
|
-
const
|
|
122
|
-
|
|
142
|
+
const box = port ?? document.documentElement
|
|
143
|
+
const seen = port ? port.clientHeight + port.scrollTop : window.innerHeight + window.scrollY
|
|
144
|
+
if (seen >= box.scrollHeight - 2) {
|
|
123
145
|
const last = elements[elements.length - 1]
|
|
124
146
|
if (last) setActiveId(last.id)
|
|
125
147
|
return
|
|
@@ -134,7 +156,9 @@ export function TableOfContents({
|
|
|
134
156
|
// Nothing intersecting — the last heading already scrolled past, or (above the first one,
|
|
135
157
|
// i.e. at the very top of the article) the first heading, so the rail always marks where the
|
|
136
158
|
// reader actually is instead of showing nothing until the first heading reaches the band.
|
|
137
|
-
|
|
159
|
+
// "Past" is measured against the SCROLLER's top edge, which for the window case is 0.
|
|
160
|
+
const originTop = port ? port.getBoundingClientRect().top : 0
|
|
161
|
+
const passed = elements.filter((el) => el.getBoundingClientRect().top < originTop)
|
|
138
162
|
const current = passed[passed.length - 1] ?? elements[0]
|
|
139
163
|
if (current) setActiveId(current.id)
|
|
140
164
|
}
|
|
@@ -147,19 +171,22 @@ export function TableOfContents({
|
|
|
147
171
|
}
|
|
148
172
|
resolve()
|
|
149
173
|
},
|
|
150
|
-
|
|
174
|
+
// `root: null` IS the viewport — the shell-less case, unchanged. Inside a shell the root has
|
|
175
|
+
// to be the scrollport or the `-70%` dead zone is measured against a box nothing scrolls.
|
|
176
|
+
{ root: port, rootMargin: '-80px 0px -70% 0px' },
|
|
151
177
|
)
|
|
152
178
|
|
|
153
179
|
for (const el of elements) observer.observe(el)
|
|
154
180
|
// The observer only fires when an intersection CHANGES; the bottom edge above resolves on
|
|
155
181
|
// scroll position alone, so it needs a scroll signal too. Re-setting the same id is a no-op
|
|
156
182
|
// for React, so this stays free on every frame that doesn't move the rail.
|
|
157
|
-
|
|
183
|
+
scroller.addEventListener('scroll', resolve, { passive: true })
|
|
158
184
|
return () => {
|
|
159
185
|
observer.disconnect()
|
|
160
|
-
|
|
186
|
+
scroller.removeEventListener('scroll', resolve)
|
|
187
|
+
portRef.current = null
|
|
161
188
|
}
|
|
162
|
-
}, [resolvedItems])
|
|
189
|
+
}, [resolvedItems, containerRef])
|
|
163
190
|
|
|
164
191
|
if (resolvedItems.length === 0) return null
|
|
165
192
|
|
|
@@ -174,15 +201,18 @@ export function TableOfContents({
|
|
|
174
201
|
setActiveId(id)
|
|
175
202
|
pinnedRef.current = id
|
|
176
203
|
|
|
204
|
+
// The same box the spy watches — `scrollend` on `window` never fires for a scroll that happened
|
|
205
|
+
// inside `AppShell.Main`, which would leave the rail pinned for the full `CLICK_PIN_MAX_MS`.
|
|
206
|
+
const scroller: Window | HTMLElement = portRef.current ?? window
|
|
177
207
|
let timer: ReturnType<typeof setTimeout> | null = null
|
|
178
208
|
const release = () => {
|
|
179
209
|
pinnedRef.current = null
|
|
180
210
|
if (timer !== null) clearTimeout(timer)
|
|
181
|
-
|
|
211
|
+
scroller.removeEventListener('scrollend', release)
|
|
182
212
|
releasePinRef.current = null
|
|
183
213
|
}
|
|
184
214
|
timer = setTimeout(release, CLICK_PIN_MAX_MS)
|
|
185
|
-
|
|
215
|
+
scroller.addEventListener('scrollend', release, { once: true })
|
|
186
216
|
releasePinRef.current = release
|
|
187
217
|
}
|
|
188
218
|
|
|
@@ -200,7 +230,7 @@ export function TableOfContents({
|
|
|
200
230
|
const navClass = [classes.root, className].filter(Boolean).join(' ')
|
|
201
231
|
|
|
202
232
|
return (
|
|
203
|
-
<nav className={navClass} aria-label={title}>
|
|
233
|
+
<nav ref={navRef} className={navClass} aria-label={title}>
|
|
204
234
|
<div className={classes.header}>{title}</div>
|
|
205
235
|
<ul className={classes.list}>
|
|
206
236
|
{resolvedItems.map((item) => (
|
|
@@ -214,6 +244,13 @@ export function TableOfContents({
|
|
|
214
244
|
]
|
|
215
245
|
.filter(Boolean)
|
|
216
246
|
.join(' ')}
|
|
247
|
+
// `classes.active` alone used to be the ONLY signal of which item the spy picked —
|
|
248
|
+
// both a real a11y gap (nothing here told assistive tech which section is current)
|
|
249
|
+
// and, incidentally, the reason a consumer/test could not observe `activeId` without
|
|
250
|
+
// reading CSS. `location` (not `page`/`true`) is the value WAI-ARIA's Authoring
|
|
251
|
+
// Practices call out BY NAME for exactly this widget: a set of links navigating
|
|
252
|
+
// within a single page, as opposed to a set of links to different pages.
|
|
253
|
+
aria-current={activeId === item.id ? 'location' : undefined}
|
|
217
254
|
onClick={handleClick(item.id)}
|
|
218
255
|
>
|
|
219
256
|
{item.label}
|