basalt-ui 1.26.0 → 1.28.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 +23 -23
- package/CHANGELOG.md +67 -0
- package/MIGRATING.md +896 -37
- package/README.md +33 -3
- package/agent/rules/basalt-batteries.md +25 -10
- package/agent/rules/basalt-controls.md +73 -43
- package/agent/rules/basalt-mantine.md +17 -6
- package/agent/rules/basalt-state.md +5 -0
- package/agent/rules/basalt-tokens.md +1 -1
- package/configs/oxlint-plugin.js +1286 -73
- package/configs/oxlint-plugin.test.ts +1338 -29
- package/configs/oxlint.json +12 -5
- 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-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/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 +8 -5
- package/dist/agent-chat/thread-feed-row.d.ts +2 -1
- package/dist/agent-chat/thread-feed-row.d.ts.map +1 -1
- package/dist/agent-chat/thread-feed-row.js +92 -92
- package/dist/agent-chat/thread-feed.d.ts +3 -2
- package/dist/agent-chat/thread-feed.d.ts.map +1 -1
- package/dist/agent-chat/thread-feed.js +8 -3
- 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/charts/hooks/useBandPlot.d.ts.map +1 -1
- package/dist/charts/hooks/useBandPlot.js +15 -8
- package/dist/charts/index.d.ts +8 -7
- package/dist/charts/index.d.ts.map +1 -1
- package/dist/charts/index.js +45 -5
- 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 +12 -6
- 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 +6 -5
- package/dist/charts/kinds/DualPanel.d.ts.map +1 -1
- package/dist/charts/kinds/DualPanel.js +36 -8
- 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 +12 -8
- 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 +11 -2
- package/dist/charts/primitives/Axes.d.ts.map +1 -1
- package/dist/charts/primitives/Axes.js +15 -5
- 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 +27 -2
- package/dist/charts/primitives/ChartCard.d.ts.map +1 -1
- package/dist/charts/primitives/ChartCard.js +37 -17
- 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 +45 -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 +77 -4
- 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 +92 -2
- package/dist/charts/utils/format.d.ts.map +1 -1
- package/dist/charts/utils/format.js +64 -1
- 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/index.d.ts.map +1 -1
- package/dist/cli/index.js +2 -2
- 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 +10 -1
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +3 -1
- package/dist/commands/overlays-mount.d.ts +13 -6
- package/dist/commands/overlays-mount.d.ts.map +1 -1
- package/dist/commands/overlays-mount.js +23 -14
- package/dist/common/errors.d.ts +34 -0
- package/dist/common/errors.d.ts.map +1 -0
- package/dist/common/errors.js +36 -0
- package/dist/common/index.d.ts +15 -0
- package/dist/common/index.d.ts.map +1 -0
- package/dist/common/index.js +29 -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/connectivity/connectivity-indicator.d.ts +3 -1
- package/dist/connectivity/connectivity-indicator.d.ts.map +1 -1
- package/dist/connectivity/connectivity-indicator.js +3 -1
- package/dist/connectivity/connectivity-provider.d.ts.map +1 -1
- package/dist/connectivity/connectivity-provider.js +4 -1
- package/dist/connectivity/index.d.ts +1 -0
- package/dist/connectivity/index.d.ts.map +1 -1
- package/dist/connectivity/types.d.ts +2 -2
- package/dist/connectivity/types.d.ts.map +1 -1
- package/dist/connectivity/use-connectivity.d.ts.map +1 -1
- 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.map +1 -1
- package/dist/content/markdown.js +2 -0
- 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 +49 -6
- 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 +13 -3
- package/dist/controls/enum-filter.d.ts.map +1 -1
- package/dist/controls/enum-filter.js +32 -15
- package/dist/controls/filter-context.d.ts +15 -6
- 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 +3 -0
- package/dist/controls/index.d.ts.map +1 -1
- package/dist/controls/index.js +6 -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 +124 -22
- package/dist/controls/number-filter.d.ts +28 -0
- package/dist/controls/number-filter.d.ts.map +1 -0
- package/dist/controls/number-filter.js +172 -0
- 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 +20 -5
- package/dist/controls/range-filter.d.ts.map +1 -1
- package/dist/controls/range-filter.js +75 -38
- 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 +26 -11
- 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 +29 -12
- 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 +5 -1
- package/dist/dashboard/delta-badge.d.ts.map +1 -1
- package/dist/dashboard/empty-state.d.ts +10 -3
- package/dist/dashboard/empty-state.d.ts.map +1 -1
- package/dist/dashboard/empty-state.js +37 -6
- package/dist/dashboard/index.d.ts +6 -4
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/index.js +10 -2
- package/dist/dashboard/query-state.d.ts +48 -27
- package/dist/dashboard/query-state.d.ts.map +1 -1
- package/dist/dashboard/query-state.js +111 -57
- 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 +74 -25
- package/dist/dashboard/stat-card.d.ts +76 -19
- package/dist/dashboard/stat-card.d.ts.map +1 -1
- package/dist/dashboard/stat-card.js +78 -38
- package/dist/dashboard/stat-card.module.css +112 -26
- package/dist/dashboard/stat-card.module.css.d.ts +5 -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/data/data-table.d.ts +151 -12
- package/dist/data/data-table.d.ts.map +1 -1
- package/dist/data/data-table.js +392 -138
- package/dist/data/data-table.module.css +64 -0
- package/dist/data/data-table.module.css.d.ts +11 -0
- package/dist/data/index.d.ts +2 -2
- package/dist/data/index.d.ts.map +1 -1
- package/dist/data/index.js +24 -2
- 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/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 +1 -1
- package/dist/data/virtual.d.ts.map +1 -1
- 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 +46 -6
- package/dist/forms/field.d.ts.map +1 -1
- package/dist/forms/field.js +10 -5
- 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 -3
- 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 +1 -1
- package/dist/guard/index.d.ts.map +1 -1
- package/dist/guard/index.js +27 -11
- package/dist/index.d.ts +10 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +44 -4
- package/dist/nav/types.d.ts +15 -6
- package/dist/nav/types.d.ts.map +1 -1
- 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 +6 -2
- package/dist/notifications/index.d.ts.map +1 -1
- package/dist/notifications/index.js +5 -1
- 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/overlay.d.ts.map +1 -1
- package/dist/notifications/overlay.js +2 -0
- package/dist/notifications/store.d.ts +7 -0
- package/dist/notifications/store.d.ts.map +1 -1
- package/dist/provider/index.d.ts +37 -5
- package/dist/provider/index.d.ts.map +1 -1
- package/dist/provider/index.js +66 -28
- package/dist/provider/lab-theme.d.ts.map +1 -1
- package/dist/provider/lab-theme.js +2 -1
- package/dist/query/devtools.d.ts.map +1 -1
- package/dist/query/devtools.js +1 -0
- package/dist/router-tanstack/field.d.ts +1 -1
- package/dist/router-tanstack/field.d.ts.map +1 -1
- package/dist/router-tanstack/index.d.ts +1 -1
- package/dist/router-tanstack/index.d.ts.map +1 -1
- package/dist/router-tanstack/search-store.d.ts +4 -1
- package/dist/router-tanstack/search-store.d.ts.map +1 -1
- package/dist/router-tanstack/search-store.js +92 -8
- package/dist/router-tanstack/use-nav.d.ts.map +1 -1
- package/dist/router-tanstack/use-nav.js +1 -1
- package/dist/section/index.d.ts +1 -1
- package/dist/section/index.d.ts.map +1 -1
- package/dist/section/section.d.ts +36 -2
- package/dist/section/section.d.ts.map +1 -1
- package/dist/section/section.js +49 -57
- package/dist/section/section.module.css +11 -0
- 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 +4 -2
- 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 +107 -0
- package/dist/shell/app-main.module.css.d.ts +11 -0
- package/dist/shell/app-mobile-nav.d.ts +3 -2
- package/dist/shell/app-mobile-nav.d.ts.map +1 -1
- package/dist/shell/app-mobile-nav.js +29 -15
- 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 +9 -3
- package/dist/shell/app-sidebar.d.ts.map +1 -1
- package/dist/shell/app-sidebar.js +55 -109
- package/dist/shell/app-sidebar.module.css +53 -96
- package/dist/shell/app-sidebar.module.css.d.ts +0 -5
- package/dist/shell/index.d.ts +14 -6
- package/dist/shell/index.d.ts.map +1 -1
- package/dist/shell/index.js +47 -12
- 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.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/shell/page-aside.d.ts +43 -0
- package/dist/shell/page-aside.d.ts.map +1 -0
- package/dist/shell/page-aside.js +202 -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/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/state/fields.d.ts +227 -34
- package/dist/state/fields.d.ts.map +1 -1
- package/dist/state/fields.js +77 -30
- 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/persisted.d.ts +12 -0
- package/dist/state/persisted.d.ts.map +1 -1
- package/dist/state/persisted.js +36 -18
- package/dist/state.d.ts +1 -1
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +2 -6
- package/dist/surfaces.d.ts +12 -11
- package/dist/surfaces.d.ts.map +1 -1
- package/dist/surfaces.js +43 -12
- 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-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/theme-toggle/index.d.ts +3 -2
- package/dist/theme-toggle/index.d.ts.map +1 -1
- package/dist/theme-toggle/index.js +8 -2
- package/dist/tokens/index.d.ts +42 -0
- package/dist/tokens/index.d.ts.map +1 -1
- package/dist/tokens/index.js +35 -6
- package/dist/tokens/palette.d.ts +45 -25
- package/dist/tokens/palette.d.ts.map +1 -1
- package/dist/tokens/palette.js +31 -14
- package/dist/tokens.css +4 -5
- package/dist/utils/is-dev.d.ts +3 -0
- package/dist/utils/is-dev.d.ts.map +1 -0
- package/dist/utils/is-dev.js +6 -0
- package/dist/widget-header/delta-badge.d.ts +7 -1
- package/dist/widget-header/delta-badge.d.ts.map +1 -1
- package/dist/widget-header/delta-badge.js +8 -1
- package/dist/widget-header/index.d.ts +2 -2
- package/dist/widget-header/index.d.ts.map +1 -1
- package/dist/widget-header/index.js +3 -1
- package/dist/widget-header/widget-header.d.ts +99 -4
- package/dist/widget-header/widget-header.d.ts.map +1 -1
- package/dist/widget-header/widget-header.js +45 -18
- package/dist/widget-header/widget-header.module.css +87 -7
- package/dist/widget-header/widget-header.module.css.d.ts +1 -0
- package/llms.txt +6 -6
- package/package.json +49 -25
- 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-chat/composer.tsx +124 -103
- package/src/agent-chat/relative-time.ts +2 -1
- package/src/agent-chat/thread-detail-panel.tsx +9 -5
- package/src/agent-chat/thread-feed-row.tsx +17 -9
- package/src/agent-chat/thread-feed.tsx +9 -3
- 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/charts/hooks/useBandPlot.ts +26 -8
- package/src/charts/index.ts +39 -4
- package/src/charts/kinds/BandStrip.tsx +36 -14
- package/src/charts/kinds/Bars.tsx +67 -16
- package/src/charts/kinds/Donut.tsx +30 -3
- package/src/charts/kinds/DualPanel.tsx +56 -10
- 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 +71 -31
- package/src/charts/layout/auto-margin.ts +134 -21
- package/src/charts/layout/log-ticks.ts +90 -0
- package/src/charts/primitives/Axes.tsx +33 -5
- package/src/charts/primitives/CartesianChart.tsx +194 -41
- package/src/charts/primitives/ChartCard.tsx +66 -25
- package/src/charts/primitives/ChartFrame.tsx +107 -26
- package/src/charts/primitives/ChartLegend.tsx +43 -13
- package/src/charts/primitives/ChartPending.tsx +185 -7
- 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 +163 -2
- package/src/charts/utils/ticks.ts +149 -4
- package/src/cli/index.ts +8 -3
- 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 +12 -0
- package/src/commands/overlays-mount.tsx +60 -26
- package/src/common/errors.ts +73 -0
- package/src/common/index.ts +21 -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/connectivity/connectivity-indicator.tsx +6 -1
- package/src/connectivity/connectivity-provider.tsx +4 -1
- package/src/connectivity/index.ts +1 -0
- package/src/connectivity/types.ts +5 -2
- package/src/connectivity/use-connectivity.ts +3 -2
- 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 +2 -0
- 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 +89 -9
- 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 +46 -19
- package/src/controls/filter-context.tsx +21 -8
- 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 +8 -0
- package/src/controls/multi-select-filter.tsx +179 -29
- package/src/controls/number-filter.tsx +329 -0
- 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 +133 -43
- package/src/controls/search-filter.tsx +31 -13
- 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 +37 -17
- package/src/controls/view-tabs.tsx +63 -11
- package/src/controls-dates/date-range-picker.tsx +8 -1
- package/src/dashboard/delta-badge.tsx +5 -1
- package/src/dashboard/empty-state.tsx +72 -25
- package/src/dashboard/index.ts +19 -2
- package/src/dashboard/query-state.tsx +154 -84
- package/src/dashboard/settings-section.tsx +87 -31
- package/src/dashboard/stat-card.module.css +112 -26
- package/src/dashboard/stat-card.module.css.d.ts +5 -0
- package/src/dashboard/stat-card.tsx +207 -68
- 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/data/data-table.module.css +64 -0
- package/src/data/data-table.module.css.d.ts +11 -0
- package/src/data/data-table.tsx +927 -346
- package/src/data/index.ts +30 -2
- package/src/data/query-branch.ts +53 -0
- package/src/data/table.ts +5 -0
- package/src/data/virtual-list.tsx +189 -55
- package/src/data/virtual.ts +5 -1
- package/src/forms/FormErrorSummary.tsx +13 -6
- package/src/forms/create-form.ts +2 -2
- package/src/forms/field.ts +60 -11
- 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 +38 -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 +91 -23
- package/src/index.ts +79 -10
- package/src/nav/types.ts +15 -6
- 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 +12 -1
- package/src/notifications/mount-guard.ts +41 -0
- package/src/notifications/notify.tsx +122 -3
- package/src/notifications/overlay.tsx +2 -0
- package/src/notifications/store.ts +7 -0
- package/src/provider/index.tsx +101 -13
- package/src/provider/lab-theme.ts +2 -1
- package/src/query/devtools.tsx +1 -0
- package/src/router-tanstack/field.ts +5 -0
- package/src/router-tanstack/index.ts +4 -0
- package/src/router-tanstack/search-store.ts +171 -12
- package/src/router-tanstack/use-nav.ts +18 -13
- package/src/section/index.ts +1 -1
- package/src/section/section.module.css +11 -0
- package/src/section/section.tsx +163 -96
- 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 +19 -9
- package/src/shell/app-header.module.css +10 -5
- package/src/shell/app-main.module.css +107 -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 +43 -11
- package/src/shell/app-sidebar-account.tsx +29 -6
- package/src/shell/app-sidebar.module.css +53 -96
- package/src/shell/app-sidebar.module.css.d.ts +0 -5
- package/src/shell/app-sidebar.tsx +40 -113
- package/src/shell/index.tsx +156 -65
- package/src/shell/isomorphic-layout-effect.ts +14 -0
- package/src/shell/mobile-nav-model.ts +66 -10
- package/src/shell/nav-count-badge.tsx +6 -1
- 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 +377 -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/sidebar-search.module.css +1 -1
- package/src/shell/sidebar-search.tsx +13 -4
- package/src/state/fields.ts +360 -69
- package/src/state/persisted-or-local.ts +50 -0
- package/src/state/persisted.ts +76 -26
- package/src/state.ts +4 -7
- package/src/surfaces.ts +43 -12
- package/src/theme/ctl-theme.tsx +10 -0
- package/src/theme/index.ts +129 -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-lab/boot.ts +140 -0
- package/src/theme-lab/index.tsx +21 -112
- package/src/theme-toggle/index.tsx +10 -3
- package/src/tokens/index.ts +50 -6
- package/src/tokens/palette.ts +58 -30
- package/src/utils/is-dev.ts +4 -0
- package/src/widget-header/delta-badge.tsx +25 -5
- package/src/widget-header/index.ts +10 -2
- package/src/widget-header/widget-header.module.css +87 -7
- package/src/widget-header/widget-header.module.css.d.ts +1 -0
- package/src/widget-header/widget-header.tsx +166 -42
- 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/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/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/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/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/error-message.test.d.ts +0 -2
- package/dist/query/error-message.test.d.ts.map +0 -1
- 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.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/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/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/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.test.d.ts +0 -2
- package/dist/widget-header/delta-badge.test.d.ts.map +0 -1
- 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.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/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 -637
- 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 -106
- 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 -154
- package/src/data/data-table.test.tsx +0 -434
- package/src/guard/check-source.test.ts +0 -3355
- package/src/guard/grace.test.ts +0 -149
- package/src/guard/guard-hook.test.ts +0 -203
- 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/router-tanstack/multi-search-param-store.test.ts +0 -124
- 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-store.router.test.tsx +0 -661
- package/src/router-tanstack/search-store.test.ts +0 -418
- package/src/router-tanstack/use-nav.test.tsx +0 -187
- package/src/section/section.test.tsx +0 -204
- 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 -258
- 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/no-mantine.test.ts +0 -33
- package/src/widget-header/widget-header.test.tsx +0 -187
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `SyncButton` — the age formatting and the syncing state (law C12, `docs/CONTROLS-SPEC.md` §3).
|
|
3
|
-
*
|
|
4
|
-
* The age is the part that had four hand-rolled copies across consumers, each with its own
|
|
5
|
-
* rounding; `formatAge` is asserted directly so the boundaries are pinned, not inferred from one
|
|
6
|
-
* rendered string.
|
|
7
|
-
*/
|
|
8
|
-
import { MantineProvider } from '@mantine/core'
|
|
9
|
-
import { fireEvent, render, screen } from '@testing-library/react'
|
|
10
|
-
import { renderToStaticMarkup } from 'react-dom/server'
|
|
11
|
-
import { describe, expect, test } from 'bun:test'
|
|
12
|
-
import { AGE_REFRESH_MS, SyncButton, formatAge } from './sync-button'
|
|
13
|
-
|
|
14
|
-
function renderSync(props: Partial<Parameters<typeof SyncButton>[0]> = {}) {
|
|
15
|
-
return render(
|
|
16
|
-
<MantineProvider>
|
|
17
|
-
<SyncButton syncing={false} scope="page" onSync={() => {}} {...props} />
|
|
18
|
-
</MantineProvider>,
|
|
19
|
-
)
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
describe('formatAge', () => {
|
|
23
|
-
test('anything under a minute is `just now`, so a fresh sync stops flickering', () => {
|
|
24
|
-
expect(formatAge(0)).toBe('just now')
|
|
25
|
-
expect(formatAge(59_000)).toBe('just now')
|
|
26
|
-
})
|
|
27
|
-
|
|
28
|
-
test('minutes, then hours, then days', () => {
|
|
29
|
-
expect(formatAge(60_000)).toBe('1m ago')
|
|
30
|
-
expect(formatAge(2 * 60_000)).toBe('2m ago')
|
|
31
|
-
expect(formatAge(59 * 60_000)).toBe('59m ago')
|
|
32
|
-
expect(formatAge(60 * 60_000)).toBe('1h ago')
|
|
33
|
-
expect(formatAge(23 * 60 * 60_000)).toBe('23h ago')
|
|
34
|
-
expect(formatAge(24 * 60 * 60_000)).toBe('1d ago')
|
|
35
|
-
})
|
|
36
|
-
|
|
37
|
-
test('the refresh interval is coarser than the smallest unit it renders', () => {
|
|
38
|
-
expect(AGE_REFRESH_MS).toBeLessThanOrEqual(60_000)
|
|
39
|
-
})
|
|
40
|
-
})
|
|
41
|
-
|
|
42
|
-
describe('SyncButton', () => {
|
|
43
|
-
test('renders the age beside the label on desktop', () => {
|
|
44
|
-
renderSync({ lastCompletedAt: Date.now() - 2 * 60_000 })
|
|
45
|
-
expect(screen.getByRole('button').textContent).toContain('Sync')
|
|
46
|
-
expect(screen.getByRole('button').textContent).toContain('2m ago')
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
test('a Date and an epoch number are the same input', () => {
|
|
50
|
-
renderSync({ lastCompletedAt: new Date(Date.now() - 3 * 60_000) })
|
|
51
|
-
expect(screen.getByRole('button').textContent).toContain('3m ago')
|
|
52
|
-
})
|
|
53
|
-
|
|
54
|
-
test('no age at all when nothing has completed yet', () => {
|
|
55
|
-
renderSync({ lastCompletedAt: null })
|
|
56
|
-
expect(screen.getByRole('button').textContent).toBe('Sync')
|
|
57
|
-
})
|
|
58
|
-
|
|
59
|
-
test('syncing announces itself and refuses a second click — WITHOUT losing focus', () => {
|
|
60
|
-
let presses = 0
|
|
61
|
-
renderSync({
|
|
62
|
-
syncing: true,
|
|
63
|
-
onSync: () => {
|
|
64
|
-
presses += 1
|
|
65
|
-
},
|
|
66
|
-
})
|
|
67
|
-
const button = screen.getByRole('button')
|
|
68
|
-
|
|
69
|
-
expect(button.getAttribute('aria-busy')).toBe('true')
|
|
70
|
-
expect(button.getAttribute('aria-disabled')).toBe('true')
|
|
71
|
-
// The NATIVE attribute is what drops focus to <body> mid-press, so it must stay off: a keyboard
|
|
72
|
-
// user who presses Sync has to still be standing on the button when the sync lands.
|
|
73
|
-
expect(button.hasAttribute('disabled')).toBe(false)
|
|
74
|
-
expect(button.hasAttribute('data-disabled')).toBe(true)
|
|
75
|
-
|
|
76
|
-
button.focus()
|
|
77
|
-
fireEvent.click(button)
|
|
78
|
-
expect(presses).toBe(0)
|
|
79
|
-
expect(document.activeElement).toBe(button)
|
|
80
|
-
})
|
|
81
|
-
|
|
82
|
-
test('an idle press does call onSync — the refusal above is not just a dead handler', () => {
|
|
83
|
-
let presses = 0
|
|
84
|
-
renderSync({
|
|
85
|
-
onSync: () => {
|
|
86
|
-
presses += 1
|
|
87
|
-
},
|
|
88
|
-
})
|
|
89
|
-
fireEvent.click(screen.getByRole('button'))
|
|
90
|
-
expect(presses).toBe(1)
|
|
91
|
-
})
|
|
92
|
-
|
|
93
|
-
test('the age is absent on the server, so hydration cannot mismatch it', () => {
|
|
94
|
-
// `Date.now()` during render is the whole bug: the server renders one age and a client hydrating
|
|
95
|
-
// a minute later renders another. Both must render NO age; the effect fills it in after mount.
|
|
96
|
-
const html = renderToStaticMarkup(
|
|
97
|
-
<MantineProvider>
|
|
98
|
-
<SyncButton
|
|
99
|
-
syncing={false}
|
|
100
|
-
scope="page"
|
|
101
|
-
onSync={() => {}}
|
|
102
|
-
lastCompletedAt={Date.now() - 5 * 60_000}
|
|
103
|
-
/>
|
|
104
|
-
</MantineProvider>,
|
|
105
|
-
)
|
|
106
|
-
expect(html).not.toContain('5m ago')
|
|
107
|
-
expect(html).toContain('Sync')
|
|
108
|
-
})
|
|
109
|
-
|
|
110
|
-
test('an error puts the control in the danger tone', () => {
|
|
111
|
-
renderSync({ error: 'Upstream 503' })
|
|
112
|
-
expect(screen.getByRole('button').getAttribute('data-variant')).toBe('default')
|
|
113
|
-
expect(document.querySelector('[data-basalt-sync-scope="page"]')).not.toBeNull()
|
|
114
|
-
})
|
|
115
|
-
|
|
116
|
-
test('the error message is in the accessible name, not only in a hover tooltip', () => {
|
|
117
|
-
// A tooltip announces only while open, and Mantine's opens on hover ALONE by default — so
|
|
118
|
-
// without this the red colour is the entire signal for a keyboard or screen-reader user.
|
|
119
|
-
renderSync({ error: 'Rate limited' })
|
|
120
|
-
expect(screen.getByRole('button', { name: 'Sync — Rate limited' })).toBeDefined()
|
|
121
|
-
})
|
|
122
|
-
|
|
123
|
-
test('scope reaches the DOM so a call site is readable without reading the props', () => {
|
|
124
|
-
renderSync({ scope: 'global' })
|
|
125
|
-
expect(document.querySelector('[data-basalt-sync-scope="global"]')).not.toBeNull()
|
|
126
|
-
})
|
|
127
|
-
})
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
* The shape per scope. `scope` used to be documentation only; it now picks the form, because the
|
|
131
|
-
* shell header has no room for a labelled button beside the breadcrumb, `PageBar` row 1 and every
|
|
132
|
-
* other global action — and a page bar does (spec §3, law C12).
|
|
133
|
-
*/
|
|
134
|
-
describe('the shape follows the scope', () => {
|
|
135
|
-
test('global renders an ActionIcon with no label text at any width', () => {
|
|
136
|
-
renderSync({ scope: 'global', label: 'Sync all' })
|
|
137
|
-
const button = screen.getByRole('button')
|
|
138
|
-
// Mantine's own class names are static strings (unlike a CSS-module hash), so which PRIMITIVE
|
|
139
|
-
// rendered is assertable — and it is the whole difference between the two forms.
|
|
140
|
-
expect(button.classList.contains('mantine-ActionIcon-root')).toBe(true)
|
|
141
|
-
// Icon-only on EVERY viewport, so there is no text to hide with a media query in the first
|
|
142
|
-
// place: the label reaches the user as the accessible name only.
|
|
143
|
-
expect(button.textContent).toBe('')
|
|
144
|
-
expect(screen.getByRole('button', { name: 'Sync all' })).toBeDefined()
|
|
145
|
-
})
|
|
146
|
-
|
|
147
|
-
test('a global button carries no rendered age either — the tooltip is its only home', () => {
|
|
148
|
-
renderSync({ scope: 'global', lastCompletedAt: Date.now() - 4 * 60_000 })
|
|
149
|
-
expect(screen.getByRole('button').textContent).toBe('')
|
|
150
|
-
})
|
|
151
|
-
|
|
152
|
-
test('page renders the labelled Button, and is named even once the label is hidden below sm', () => {
|
|
153
|
-
renderSync({ scope: 'page' })
|
|
154
|
-
const button = screen.getByRole('button')
|
|
155
|
-
expect(button.classList.contains('mantine-Button-root')).toBe(true)
|
|
156
|
-
expect(button.textContent).toBe('Sync')
|
|
157
|
-
// jsdom evaluates no media query, so the `display: none` below `sm` is not observable here —
|
|
158
|
-
// what IS observable is the half that makes it safe: `display: none` text leaves the
|
|
159
|
-
// accessibility tree, so the name has to come from `aria-label`, not from the children.
|
|
160
|
-
expect(button.getAttribute('aria-label')).toBe('Sync')
|
|
161
|
-
})
|
|
162
|
-
|
|
163
|
-
test('both scopes fold an error into the accessible name, not only into the tone', () => {
|
|
164
|
-
renderSync({ scope: 'global', error: 'Upstream 503' })
|
|
165
|
-
expect(screen.getByRole('button', { name: 'Sync — Upstream 503' })).toBeDefined()
|
|
166
|
-
})
|
|
167
|
-
|
|
168
|
-
test('a global button refuses a second click while syncing, exactly as the page form does', () => {
|
|
169
|
-
let presses = 0
|
|
170
|
-
renderSync({
|
|
171
|
-
scope: 'global',
|
|
172
|
-
syncing: true,
|
|
173
|
-
onSync: () => {
|
|
174
|
-
presses += 1
|
|
175
|
-
},
|
|
176
|
-
})
|
|
177
|
-
const button = screen.getByRole('button')
|
|
178
|
-
expect(button.getAttribute('aria-disabled')).toBe('true')
|
|
179
|
-
expect(button.hasAttribute('disabled')).toBe(false)
|
|
180
|
-
fireEvent.click(button)
|
|
181
|
-
expect(presses).toBe(0)
|
|
182
|
-
})
|
|
183
|
-
})
|
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `QueryState` exists because shipping only `EmptyState` produced a correctness bug in a real
|
|
3
|
-
* consumer: a 500 rendered "No images", a dropped connection rendered "Share not found — it may
|
|
4
|
-
* have been deleted". Every assertion here is aimed at that failure mode rather than at chrome.
|
|
5
|
-
*
|
|
6
|
-
* 1. A FAILED query never renders the empty copy. This is the bug, stated as a test.
|
|
7
|
-
* 2. A failed query WITH cached data keeps the page and adds a banner — a background refetch
|
|
8
|
-
* failing must not blank a screen that already works.
|
|
9
|
-
* 3. `fetchStatus: 'idle'` with no data is EMPTY, not loading (the `enabled: false` case);
|
|
10
|
-
* `'fetching'` with no data is loading.
|
|
11
|
-
* 4. A result missing a branch flag THROWS. `QueryStateLike` is a structural subset on purpose,
|
|
12
|
-
* so the compiler stops policing it — and every field it can lose fails silently in the
|
|
13
|
-
* direction of a false claim about the data.
|
|
14
|
-
*/
|
|
15
|
-
import { MantineProvider } from '@mantine/core'
|
|
16
|
-
import { render, screen } from '@testing-library/react'
|
|
17
|
-
import { describe, expect, test } from 'bun:test'
|
|
18
|
-
import type { ReactNode } from 'react'
|
|
19
|
-
import { QueryState } from './query-state'
|
|
20
|
-
import type { QueryStateLike } from './query-state'
|
|
21
|
-
|
|
22
|
-
type Row = { id: number }
|
|
23
|
-
|
|
24
|
-
function result(over: Partial<QueryStateLike<Row[]>>): QueryStateLike<Row[]> {
|
|
25
|
-
return {
|
|
26
|
-
data: undefined,
|
|
27
|
-
isError: false,
|
|
28
|
-
error: null,
|
|
29
|
-
fetchStatus: 'idle',
|
|
30
|
-
refetch: () => undefined,
|
|
31
|
-
...over,
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const EMPTY = { title: 'No images match', description: 'Widen the capture dates.' }
|
|
36
|
-
|
|
37
|
-
function renderState(query: QueryStateLike<Row[]>, extra?: ReactNode): HTMLElement {
|
|
38
|
-
const { container } = render(
|
|
39
|
-
<MantineProvider>
|
|
40
|
-
<QueryState query={query} empty={EMPTY} errorTitle="Could not load images">
|
|
41
|
-
{(rows) => <div data-testid="body">{rows.length} rows</div>}
|
|
42
|
-
</QueryState>
|
|
43
|
-
{extra}
|
|
44
|
-
</MantineProvider>,
|
|
45
|
-
)
|
|
46
|
-
return container
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
describe('the branch a 500 must not take', () => {
|
|
50
|
-
test('an errored query renders the server message, never the empty copy', () => {
|
|
51
|
-
renderState(
|
|
52
|
-
result({ isError: true, error: { status: 500, value: { message: 'index is rebuilding' } } }),
|
|
53
|
-
)
|
|
54
|
-
expect(screen.getByText('index is rebuilding')).toBeTruthy()
|
|
55
|
-
expect(screen.queryByText('No images match')).toBeNull()
|
|
56
|
-
expect(screen.getByRole('button', { name: 'Retry' })).toBeTruthy()
|
|
57
|
-
})
|
|
58
|
-
|
|
59
|
-
test('an opaque 500 envelope falls back to the errorTitle copy plus the status', () => {
|
|
60
|
-
render(
|
|
61
|
-
<MantineProvider>
|
|
62
|
-
<QueryState
|
|
63
|
-
query={result({ isError: true, error: { status: 500, value: {} } })}
|
|
64
|
-
errorTitle="Could not load images"
|
|
65
|
-
errorFallback="The library did not answer."
|
|
66
|
-
>
|
|
67
|
-
{() => null}
|
|
68
|
-
</QueryState>
|
|
69
|
-
</MantineProvider>,
|
|
70
|
-
)
|
|
71
|
-
expect(screen.getByText('The library did not answer. (HTTP 500)')).toBeTruthy()
|
|
72
|
-
})
|
|
73
|
-
|
|
74
|
-
test('retry calls refetch', () => {
|
|
75
|
-
let calls = 0
|
|
76
|
-
renderState(result({ isError: true, error: new Error('down'), refetch: () => ++calls }))
|
|
77
|
-
;(screen.getByRole('button', { name: 'Retry' }) as HTMLButtonElement).click()
|
|
78
|
-
expect(calls).toBe(1)
|
|
79
|
-
})
|
|
80
|
-
})
|
|
81
|
-
|
|
82
|
-
describe('cached data survives a failed refresh', () => {
|
|
83
|
-
test('error WITH data renders the body plus a banner, not the error page', () => {
|
|
84
|
-
renderState(result({ data: [{ id: 1 }], isError: true, error: new Error('refresh failed') }))
|
|
85
|
-
expect(screen.getByTestId('body').textContent).toBe('1 rows')
|
|
86
|
-
expect(screen.getByText('Showing cached data')).toBeTruthy()
|
|
87
|
-
})
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
describe('empty vs loading', () => {
|
|
91
|
-
test('no data + idle is EMPTY (the enabled:false case)', () => {
|
|
92
|
-
renderState(result({ fetchStatus: 'idle' }))
|
|
93
|
-
expect(screen.getByText('No images match')).toBeTruthy()
|
|
94
|
-
})
|
|
95
|
-
|
|
96
|
-
test('no data + fetching is LOADING', () => {
|
|
97
|
-
renderState(result({ fetchStatus: 'fetching' }))
|
|
98
|
-
expect(screen.queryByText('No images match')).toBeNull()
|
|
99
|
-
expect(screen.getByLabelText('Loading')).toBeTruthy()
|
|
100
|
-
})
|
|
101
|
-
|
|
102
|
-
test('an empty array is empty; a populated one renders children', () => {
|
|
103
|
-
renderState(result({ data: [] }))
|
|
104
|
-
expect(screen.getByText('No images match')).toBeTruthy()
|
|
105
|
-
})
|
|
106
|
-
|
|
107
|
-
test('isEmpty overrides the default test', () => {
|
|
108
|
-
render(
|
|
109
|
-
<MantineProvider>
|
|
110
|
-
<QueryState query={result({ data: [] })} empty={EMPTY} isEmpty={() => false}>
|
|
111
|
-
{(rows) => <div data-testid="body">{rows.length} rows</div>}
|
|
112
|
-
</QueryState>
|
|
113
|
-
</MantineProvider>,
|
|
114
|
-
)
|
|
115
|
-
expect(screen.getByTestId('body').textContent).toBe('0 rows')
|
|
116
|
-
})
|
|
117
|
-
|
|
118
|
-
test('omitting `empty` renders nothing rather than inventing copy', () => {
|
|
119
|
-
render(
|
|
120
|
-
<MantineProvider>
|
|
121
|
-
<QueryState query={result({ data: [] })}>{() => <div>rows</div>}</QueryState>
|
|
122
|
-
</MantineProvider>,
|
|
123
|
-
)
|
|
124
|
-
expect(screen.queryByText('rows')).toBeNull()
|
|
125
|
-
})
|
|
126
|
-
})
|
|
127
|
-
|
|
128
|
-
describe('a malformed result throws instead of asserting absence', () => {
|
|
129
|
-
const cases: [string, unknown][] = [
|
|
130
|
-
['missing isError', { data: undefined, error: null, fetchStatus: 'idle', refetch: () => 0 }],
|
|
131
|
-
[
|
|
132
|
-
'misspelled fetchStatus',
|
|
133
|
-
{ data: undefined, isError: false, error: null, fetchStatus: 'pending', refetch: () => 0 },
|
|
134
|
-
],
|
|
135
|
-
['missing refetch', { data: undefined, isError: false, error: null, fetchStatus: 'idle' }],
|
|
136
|
-
['not an object at all', ['a', 'b']],
|
|
137
|
-
]
|
|
138
|
-
|
|
139
|
-
for (const [name, bad] of cases) {
|
|
140
|
-
test(name, () => {
|
|
141
|
-
expect(() =>
|
|
142
|
-
render(
|
|
143
|
-
<MantineProvider>
|
|
144
|
-
<QueryState query={bad as QueryStateLike<Row[]>} empty={EMPTY}>
|
|
145
|
-
{() => null}
|
|
146
|
-
</QueryState>
|
|
147
|
-
</MantineProvider>,
|
|
148
|
-
),
|
|
149
|
-
).toThrow(/QueryState: `query`/)
|
|
150
|
-
})
|
|
151
|
-
}
|
|
152
|
-
})
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SettingsSection / DangerZone — the WidgetHeader composition (docs/CONTROLS-SPEC.md §2.2):
|
|
3
|
-
* `description` renamed to `subtitle`, both now render an h2 (`tier="section"`) via `WidgetHeader`,
|
|
4
|
-
* and `actions` reaches the header's actions slot.
|
|
5
|
-
*/
|
|
6
|
-
import { MantineProvider } from '@mantine/core'
|
|
7
|
-
import { render, screen } from '@testing-library/react'
|
|
8
|
-
import { describe, expect, test } from 'bun:test'
|
|
9
|
-
import type { ReactElement } from 'react'
|
|
10
|
-
import { DangerZone, SettingsSection } from './settings-section'
|
|
11
|
-
|
|
12
|
-
function renderWith(node: ReactElement) {
|
|
13
|
-
return render(<MantineProvider>{node}</MantineProvider>)
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
describe('SettingsSection composes WidgetHeader at the section tier', () => {
|
|
17
|
-
test('renders an h2 carrying the title', () => {
|
|
18
|
-
renderWith(
|
|
19
|
-
<SettingsSection title="Profile">
|
|
20
|
-
<div>rows</div>
|
|
21
|
-
</SettingsSection>,
|
|
22
|
-
)
|
|
23
|
-
expect(screen.getByRole('heading', { level: 2, name: 'Profile' })).toBeDefined()
|
|
24
|
-
})
|
|
25
|
-
|
|
26
|
-
test('subtitle (renamed from description) renders below the title', () => {
|
|
27
|
-
renderWith(
|
|
28
|
-
<SettingsSection title="Profile" subtitle="Your public identity.">
|
|
29
|
-
<div>rows</div>
|
|
30
|
-
</SettingsSection>,
|
|
31
|
-
)
|
|
32
|
-
expect(screen.getByText('Your public identity.')).toBeDefined()
|
|
33
|
-
})
|
|
34
|
-
|
|
35
|
-
test('actions reach the header actions slot', () => {
|
|
36
|
-
renderWith(
|
|
37
|
-
<SettingsSection title="Profile" actions={<button type="button">Export</button>}>
|
|
38
|
-
<div>rows</div>
|
|
39
|
-
</SettingsSection>,
|
|
40
|
-
)
|
|
41
|
-
expect(screen.getByRole('button', { name: 'Export' })).toBeDefined()
|
|
42
|
-
})
|
|
43
|
-
})
|
|
44
|
-
|
|
45
|
-
describe('DangerZone keeps its eyebrow alongside the WidgetHeader', () => {
|
|
46
|
-
test('renders the eyebrow and an h2 title', () => {
|
|
47
|
-
renderWith(
|
|
48
|
-
<DangerZone title="Delete workspace" subtitle="This action cannot be undone.">
|
|
49
|
-
<div>rows</div>
|
|
50
|
-
</DangerZone>,
|
|
51
|
-
)
|
|
52
|
-
expect(screen.getByText('Danger Zone')).toBeDefined()
|
|
53
|
-
expect(screen.getByRole('heading', { level: 2, name: 'Delete workspace' })).toBeDefined()
|
|
54
|
-
expect(screen.getByText('This action cannot be undone.')).toBeDefined()
|
|
55
|
-
})
|
|
56
|
-
})
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `StatCard`'s threshold rail — the one behavior in this component that carries information rather
|
|
3
|
-
* than layout, and the one where a regression is silent: a wrong rail colour still renders a
|
|
4
|
-
* perfectly good-looking card.
|
|
5
|
-
*
|
|
6
|
-
* Two invariants, both asserted against real rendered markup:
|
|
7
|
-
*
|
|
8
|
-
* 1. EVERY tone states its verdict in TEXT. The rail is `aria-hidden` decoration; colour alone must
|
|
9
|
-
* never be the only carrier of a threshold (WCAG 1.4.1), so a `VisuallyHidden` string ships with
|
|
10
|
-
* it — for `good` no less than for `bad`.
|
|
11
|
-
* 2. OMISSION IS NOT `good`. `tone` undefined means "fine, OR nothing measured", and those two are
|
|
12
|
-
* the same untinted card on purpose. A card with no reading must not be able to render green by
|
|
13
|
-
* leaving the prop off, so the absence case asserts no rail and no verdict text at all — which a
|
|
14
|
-
* future `tone = tone ?? 'good'` style default would immediately fail.
|
|
15
|
-
*
|
|
16
|
-
* A DOM harness now exists (`tests/setup/dom.ts`, preloaded via the root `bunfig.toml`; see
|
|
17
|
-
* `theme/use-basalt-spacing.test.tsx`'s doc) — `renderToStaticMarkup` inside a real `MantineProvider`
|
|
18
|
-
* is used deliberately here instead, since the rail is an inline style on server-rendered markup.
|
|
19
|
-
* Converting to the DOM harness would only be worth it if a future assertion here needed live DOM
|
|
20
|
-
* behavior (e.g. computed styles, focus/hover interaction) rather than the static markup string.
|
|
21
|
-
*/
|
|
22
|
-
import { MantineProvider } from '@mantine/core'
|
|
23
|
-
import { describe, expect, test } from 'bun:test'
|
|
24
|
-
import { renderToStaticMarkup } from 'react-dom/server'
|
|
25
|
-
import { StatCard } from './stat-card'
|
|
26
|
-
import type { StatCardTone } from './stat-card'
|
|
27
|
-
|
|
28
|
-
function render(tone?: StatCardTone) {
|
|
29
|
-
return renderToStaticMarkup(
|
|
30
|
-
<MantineProvider>
|
|
31
|
-
{/* exactOptionalPropertyTypes forbids an explicit tone={undefined} — spread only when set */}
|
|
32
|
-
<StatCard
|
|
33
|
-
title="Downtime · last 24h"
|
|
34
|
-
value="0 min"
|
|
35
|
-
{...(tone !== undefined ? { tone } : {})}
|
|
36
|
-
/>
|
|
37
|
-
</MantineProvider>,
|
|
38
|
-
)
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
const TONES: { tone: StatCardTone; token: string; verdict: string }[] = [
|
|
42
|
-
{ tone: 'good', token: 'var(--vx-status-good)', verdict: 'Within the good threshold' },
|
|
43
|
-
{ tone: 'warn', token: 'var(--vx-status-warn)', verdict: 'Past the warning threshold' },
|
|
44
|
-
{ tone: 'bad', token: 'var(--vx-status-bad)', verdict: 'Past the severe threshold' },
|
|
45
|
-
]
|
|
46
|
-
|
|
47
|
-
describe('every tone draws its rail from the per-scheme status token', () => {
|
|
48
|
-
for (const { tone, token } of TONES) {
|
|
49
|
-
test(tone, () => {
|
|
50
|
-
const markup = render(tone)
|
|
51
|
-
// A hex here would be one scheme's colour frozen into both — the rail has to re-resolve with
|
|
52
|
-
// the palette, including under a consumer's `derive` retune.
|
|
53
|
-
expect(markup).toContain(`background:${token}`)
|
|
54
|
-
expect(markup).toContain(`data-tone="${tone}"`)
|
|
55
|
-
})
|
|
56
|
-
}
|
|
57
|
-
})
|
|
58
|
-
|
|
59
|
-
describe('every tone also states its verdict in text', () => {
|
|
60
|
-
for (const { tone, verdict } of TONES) {
|
|
61
|
-
test(tone, () => {
|
|
62
|
-
expect(render(tone)).toContain(verdict)
|
|
63
|
-
})
|
|
64
|
-
}
|
|
65
|
-
})
|
|
66
|
-
|
|
67
|
-
describe('omitting tone is not "good" — it is untinted, and says nothing', () => {
|
|
68
|
-
const markup = render()
|
|
69
|
-
|
|
70
|
-
test('no rail is drawn', () => {
|
|
71
|
-
expect(markup).not.toContain('var(--vx-status-')
|
|
72
|
-
})
|
|
73
|
-
|
|
74
|
-
test('the card carries no data-tone at all', () => {
|
|
75
|
-
// Part of the same contract, and the half a consumer can style against: `[data-tone]` must not
|
|
76
|
-
// match an unmarked card. A default of any kind — including a placeholder like `tone ?? 'none'`
|
|
77
|
-
// that draws no rail — would put the attribute back and break that selector silently.
|
|
78
|
-
expect(markup).not.toContain('data-tone')
|
|
79
|
-
})
|
|
80
|
-
|
|
81
|
-
test('no verdict is announced', () => {
|
|
82
|
-
for (const { verdict } of TONES) expect(markup).not.toContain(verdict)
|
|
83
|
-
})
|
|
84
|
-
|
|
85
|
-
test('the value still renders — the card is normal, just unmarked', () => {
|
|
86
|
-
expect(markup).toContain('0 min')
|
|
87
|
-
})
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
describe('the header composes WidgetHeader at the widget tier', () => {
|
|
91
|
-
test('renders an h3 carrying the title', () => {
|
|
92
|
-
const markup = renderToStaticMarkup(
|
|
93
|
-
<MantineProvider>
|
|
94
|
-
<StatCard title="Active Users" value="12,483" />
|
|
95
|
-
</MantineProvider>,
|
|
96
|
-
)
|
|
97
|
-
expect(markup).toContain('<h3')
|
|
98
|
-
expect(markup).toContain('Active Users')
|
|
99
|
-
})
|
|
100
|
-
})
|
|
101
|
-
|
|
102
|
-
describe('info and subtitle reach the composed WidgetHeader', () => {
|
|
103
|
-
function renderHeader(props: { info?: string; subtitle?: string }) {
|
|
104
|
-
return renderToStaticMarkup(
|
|
105
|
-
<MantineProvider>
|
|
106
|
-
<StatCard title="Training load" value="412" {...props} />
|
|
107
|
-
</MantineProvider>,
|
|
108
|
-
)
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
test('the subtitle renders as its own line under the hero row', () => {
|
|
112
|
-
expect(renderHeader({ subtitle: 'TSS · 7-day rolling' })).toContain('TSS · 7-day rolling')
|
|
113
|
-
})
|
|
114
|
-
|
|
115
|
-
test('the info text ships with the glyph, and never inside the heading', () => {
|
|
116
|
-
const markup = renderHeader({ info: 'Sum of per-session TSS over 7 days.' })
|
|
117
|
-
// `WidgetHeader` renders the bubble only while open, so the closed markup carries the named
|
|
118
|
-
// trigger — what matters here is that the card FORWARDED the prop and that the text stayed OUT
|
|
119
|
-
// of the `<h3>`, which is what an `info` rendered inside the heading would silently do.
|
|
120
|
-
expect(markup).toContain('aria-label="More information"')
|
|
121
|
-
const heading = /<h3[^>]*>(.*?)<\/h3>/.exec(markup)?.[1] ?? ''
|
|
122
|
-
expect(heading).toContain('Training load')
|
|
123
|
-
expect(heading).not.toContain('Sum of')
|
|
124
|
-
})
|
|
125
|
-
|
|
126
|
-
test('neither prop renders anything when omitted — no glyph, no empty line', () => {
|
|
127
|
-
expect(renderHeader({})).not.toContain('More information')
|
|
128
|
-
})
|
|
129
|
-
})
|
|
130
|
-
|
|
131
|
-
describe('sparklinePlacement', () => {
|
|
132
|
-
function renderWithSparkline(placement?: 'bleed' | 'right') {
|
|
133
|
-
return renderToStaticMarkup(
|
|
134
|
-
<MantineProvider>
|
|
135
|
-
<StatCard
|
|
136
|
-
title="Active Users"
|
|
137
|
-
value="12,483"
|
|
138
|
-
sparkline={<span data-testid="spark">spark</span>}
|
|
139
|
-
{...(placement !== undefined ? { sparklinePlacement: placement } : {})}
|
|
140
|
-
/>
|
|
141
|
-
</MantineProvider>,
|
|
142
|
-
)
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
test('defaults to bleed — the full-width row bled to the card edges', () => {
|
|
146
|
-
const markup = renderWithSparkline()
|
|
147
|
-
expect(markup).toContain('data-placement="bleed"')
|
|
148
|
-
})
|
|
149
|
-
|
|
150
|
-
test('right sits the sparkline beside the hero-value row', () => {
|
|
151
|
-
const markup = renderWithSparkline('right')
|
|
152
|
-
expect(markup).toContain('data-placement="right"')
|
|
153
|
-
})
|
|
154
|
-
})
|