basalt-ui 1.24.0 → 1.26.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 +8 -6
- package/CHANGELOG.md +25 -0
- package/MIGRATING.md +547 -21
- package/README.md +46 -33
- package/agent/rules/basalt-batteries.md +205 -0
- package/agent/rules/basalt-charts.md +125 -555
- package/agent/rules/basalt-controls.md +155 -0
- package/agent/rules/basalt-mantine.md +146 -439
- package/agent/rules/basalt-state.md +113 -96
- package/agent/rules/basalt-tokens.md +126 -288
- package/agent/skills/basalt-app/SKILL.md +70 -195
- package/agent/skills/basalt-charts/SKILL.md +54 -234
- package/agent/skills/basalt-design/SKILL.md +56 -248
- package/agent/templates/CLAUDE-block.md.tpl +31 -40
- package/agent/templates/DESIGN.md.tpl +22 -51
- package/configs/oxlint-plugin.js +1275 -31
- package/configs/oxlint-plugin.test.ts +947 -11
- package/configs/oxlint.json +11 -3
- package/dist/charts/cursor/resolve.d.ts +18 -0
- package/dist/charts/cursor/resolve.d.ts.map +1 -1
- package/dist/charts/cursor/resolve.js +15 -6
- package/dist/charts/cursor/scope.d.ts +6 -3
- package/dist/charts/cursor/scope.d.ts.map +1 -1
- package/dist/charts/cursor/store.d.ts +5 -1
- package/dist/charts/cursor/store.d.ts.map +1 -1
- package/dist/charts/cursor/store.js +4 -4
- package/dist/charts/hooks/useChartCursor.d.ts.map +1 -1
- package/dist/charts/hooks/useChartCursor.js +9 -8
- package/dist/charts/index.d.ts +2 -2
- package/dist/charts/index.d.ts.map +1 -1
- package/dist/charts/primitives/ChartCard.d.ts +34 -9
- package/dist/charts/primitives/ChartCard.d.ts.map +1 -1
- package/dist/charts/primitives/ChartCard.js +29 -114
- package/dist/charts/primitives/ChartCard.test.d.ts +2 -0
- package/dist/charts/primitives/ChartCard.test.d.ts.map +1 -0
- package/dist/charts/sparklines/BarSparkline.d.ts +26 -2
- package/dist/charts/sparklines/BarSparkline.d.ts.map +1 -1
- package/dist/charts/sparklines/BarSparkline.js +18 -4
- package/dist/cli/check-coverage.test.d.ts +2 -0
- package/dist/cli/check-coverage.test.d.ts.map +1 -0
- package/dist/cli/index.d.ts +67 -4
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +225 -7
- package/dist/connectivity/connectivity-indicator.d.ts +4 -1
- package/dist/connectivity/connectivity-indicator.d.ts.map +1 -1
- package/dist/connectivity/connectivity-indicator.js +1 -1
- package/dist/content/index.d.ts +5 -3
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +4 -2
- package/dist/content/prose.module.css +7 -28
- package/dist/controls/actions.d.ts +169 -0
- package/dist/controls/actions.d.ts.map +1 -0
- package/dist/controls/actions.js +287 -0
- package/dist/controls/actions.module.css +62 -0
- package/dist/controls/actions.module.css.d.ts +13 -0
- package/dist/controls/actions.test.d.ts +2 -0
- package/dist/controls/actions.test.d.ts.map +1 -0
- package/dist/controls/actions.type-guard.test.d.ts +2 -0
- package/dist/controls/actions.type-guard.test.d.ts.map +1 -0
- package/dist/controls/compare-filter.d.ts +41 -0
- package/dist/controls/compare-filter.d.ts.map +1 -0
- package/dist/controls/compare-filter.js +23 -0
- package/dist/controls/control-group.d.ts +19 -0
- package/dist/controls/control-group.d.ts.map +1 -0
- package/dist/controls/control-group.js +20 -0
- package/dist/controls/control-group.test.d.ts +2 -0
- package/dist/controls/control-group.test.d.ts.map +1 -0
- package/dist/controls/controls.module.css +542 -0
- package/dist/controls/controls.module.css.d.ts +35 -0
- package/dist/controls/controls.router.test.d.ts +2 -0
- package/dist/controls/controls.router.test.d.ts.map +1 -0
- package/dist/controls/enum-filter.d.ts +30 -0
- package/dist/controls/enum-filter.d.ts.map +1 -0
- package/dist/controls/enum-filter.js +91 -0
- package/dist/controls/filter-context.d.ts +55 -0
- package/dist/controls/filter-context.d.ts.map +1 -0
- package/dist/controls/filter-context.js +69 -0
- package/dist/controls/filter-pill.d.ts +28 -0
- package/dist/controls/filter-pill.d.ts.map +1 -0
- package/dist/controls/filter-pill.js +70 -0
- package/dist/controls/filter-set.d.ts +13 -0
- package/dist/controls/filter-set.d.ts.map +1 -0
- package/dist/controls/filter-set.js +125 -0
- package/dist/controls/filter-set.test.d.ts +2 -0
- package/dist/controls/filter-set.test.d.ts.map +1 -0
- package/dist/controls/filter-sheet.d.ts +117 -0
- package/dist/controls/filter-sheet.d.ts.map +1 -0
- package/dist/controls/filter-sheet.js +146 -0
- package/dist/controls/glyphs.d.ts +27 -0
- package/dist/controls/glyphs.d.ts.map +1 -0
- package/dist/controls/glyphs.js +49 -0
- package/dist/controls/index.d.ts +19 -0
- package/dist/controls/index.d.ts.map +1 -0
- package/dist/controls/index.js +44 -0
- package/dist/controls/multi-select-filter.d.ts +23 -0
- package/dist/controls/multi-select-filter.d.ts.map +1 -0
- package/dist/controls/multi-select-filter.js +89 -0
- package/dist/controls/peer-boundary.test.d.ts +2 -0
- package/dist/controls/peer-boundary.test.d.ts.map +1 -0
- package/dist/controls/props-contract.test.d.ts +2 -0
- package/dist/controls/props-contract.test.d.ts.map +1 -0
- package/dist/controls/range-filter.d.ts +29 -0
- package/dist/controls/range-filter.d.ts.map +1 -0
- package/dist/controls/range-filter.js +120 -0
- package/dist/controls/search-filter.d.ts +10 -0
- package/dist/controls/search-filter.d.ts.map +1 -0
- package/dist/controls/search-filter.js +81 -0
- package/dist/controls/select-filter.d.ts +74 -0
- package/dist/controls/select-filter.d.ts.map +1 -0
- package/dist/controls/select-filter.js +10 -0
- package/dist/controls/sync-button.d.ts +38 -0
- package/dist/controls/sync-button.d.ts.map +1 -0
- package/dist/controls/sync-button.js +119 -0
- package/dist/controls/sync-button.module.css +63 -0
- package/dist/controls/sync-button.module.css.d.ts +11 -0
- package/dist/controls/sync-button.test.d.ts +2 -0
- package/dist/controls/sync-button.test.d.ts.map +1 -0
- package/dist/controls/toggle-filter.d.ts +9 -0
- package/dist/controls/toggle-filter.d.ts.map +1 -0
- package/dist/controls/toggle-filter.js +42 -0
- package/dist/controls/view-tabs.d.ts +23 -0
- package/dist/controls/view-tabs.d.ts.map +1 -0
- package/dist/controls/view-tabs.js +59 -0
- package/dist/controls-dates/date-range-picker.d.ts +4 -0
- package/dist/controls-dates/date-range-picker.d.ts.map +1 -0
- package/dist/controls-dates/date-range-picker.js +18 -0
- package/dist/controls-dates/index.d.ts +9 -0
- package/dist/controls-dates/index.d.ts.map +1 -0
- package/dist/controls-dates/index.js +4 -0
- package/dist/dashboard/delta-badge.d.ts +6 -12
- package/dist/dashboard/delta-badge.d.ts.map +1 -1
- package/dist/dashboard/delta-badge.js +1 -50
- package/dist/dashboard/query-state.d.ts +1 -1
- package/dist/dashboard/settings-section.d.ts +6 -4
- package/dist/dashboard/settings-section.d.ts.map +1 -1
- package/dist/dashboard/settings-section.js +23 -16
- package/dist/dashboard/settings-section.module.css +10 -0
- package/dist/dashboard/settings-section.module.css.d.ts +1 -0
- package/dist/dashboard/settings-section.test.d.ts +2 -0
- package/dist/dashboard/settings-section.test.d.ts.map +1 -0
- package/dist/dashboard/stat-card.d.ts +44 -9
- package/dist/dashboard/stat-card.d.ts.map +1 -1
- package/dist/dashboard/stat-card.js +80 -48
- package/dist/dashboard/stat-card.module.css +82 -0
- package/dist/dashboard/stat-card.module.css.d.ts +11 -0
- package/dist/data/data-table.d.ts +102 -20
- package/dist/data/data-table.d.ts.map +1 -1
- package/dist/data/data-table.js +166 -65
- package/dist/data/table.d.ts +1 -1
- package/dist/data/table.d.ts.map +1 -1
- package/dist/guard/grace.test.d.ts +20 -0
- package/dist/guard/grace.test.d.ts.map +1 -0
- package/dist/guard/index.d.ts +66 -3
- package/dist/guard/index.d.ts.map +1 -1
- package/dist/guard/index.js +82 -7
- package/dist/guard/types.d.ts +3 -3
- package/dist/guard/types.d.ts.map +1 -1
- package/dist/index.d.ts +12 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -10
- package/dist/nav/types.d.ts +78 -2
- package/dist/nav/types.d.ts.map +1 -1
- package/dist/notifications/bell.d.ts +4 -1
- package/dist/notifications/bell.d.ts.map +1 -1
- package/dist/notifications/index.d.ts +1 -1
- package/dist/router-tanstack/field.d.ts +14 -0
- package/dist/router-tanstack/field.d.ts.map +1 -0
- package/dist/router-tanstack/field.js +4 -0
- package/dist/router-tanstack/index.d.ts +6 -2
- package/dist/router-tanstack/index.d.ts.map +1 -1
- package/dist/router-tanstack/index.js +4 -0
- package/dist/router-tanstack/multi-search-param-store.d.ts +4 -52
- package/dist/router-tanstack/multi-search-param-store.d.ts.map +1 -1
- package/dist/router-tanstack/multi-search-param-store.js +19 -27
- package/dist/router-tanstack/search-param-store.d.ts +3 -87
- package/dist/router-tanstack/search-param-store.d.ts.map +1 -1
- package/dist/router-tanstack/search-param-store.js +16 -45
- package/dist/router-tanstack/search-store.d.ts +81 -0
- package/dist/router-tanstack/search-store.d.ts.map +1 -0
- package/dist/router-tanstack/search-store.js +187 -0
- package/dist/router-tanstack/search-store.router.test.d.ts +2 -0
- package/dist/router-tanstack/search-store.router.test.d.ts.map +1 -0
- package/dist/router-tanstack/search-store.test.d.ts +2 -0
- package/dist/router-tanstack/search-store.test.d.ts.map +1 -0
- package/dist/router-tanstack/use-nav.d.ts +0 -2
- package/dist/router-tanstack/use-nav.d.ts.map +1 -1
- package/dist/router-tanstack/use-nav.js +34 -12
- package/dist/router-tanstack/use-nav.test.d.ts +2 -0
- package/dist/router-tanstack/use-nav.test.d.ts.map +1 -0
- package/dist/section/index.d.ts +2 -0
- package/dist/section/index.d.ts.map +1 -0
- package/dist/section/index.js +4 -0
- package/dist/section/section.d.ts +24 -0
- package/dist/section/section.d.ts.map +1 -0
- package/dist/section/section.js +126 -0
- package/dist/section/section.module.css +104 -0
- package/dist/section/section.module.css.d.ts +11 -0
- package/dist/section/section.test.d.ts +2 -0
- package/dist/section/section.test.d.ts.map +1 -0
- package/dist/shell/app-breadcrumbs.d.ts.map +1 -1
- package/dist/shell/app-breadcrumbs.js +18 -15
- package/dist/shell/app-header.module.css +77 -37
- package/dist/shell/app-header.module.css.d.ts +2 -1
- package/dist/shell/app-mobile-nav.d.ts +9 -2
- package/dist/shell/app-mobile-nav.d.ts.map +1 -1
- package/dist/shell/app-mobile-nav.js +98 -11
- package/dist/shell/app-mobile-nav.module.css +8 -0
- package/dist/shell/app-mobile-nav.module.css.d.ts +1 -0
- package/dist/shell/app-sidebar.d.ts +55 -28
- package/dist/shell/app-sidebar.d.ts.map +1 -1
- package/dist/shell/app-sidebar.js +116 -67
- package/dist/shell/app-sidebar.module.css +303 -20
- package/dist/shell/app-sidebar.module.css.d.ts +19 -1
- package/dist/shell/index.d.ts +55 -21
- package/dist/shell/index.d.ts.map +1 -1
- package/dist/shell/index.js +40 -18
- package/dist/shell/mobile-nav-model.d.ts +13 -2
- package/dist/shell/mobile-nav-model.d.ts.map +1 -1
- package/dist/shell/mobile-nav-model.js +15 -1
- package/dist/shell/nav-count-badge.d.ts +1 -1
- package/dist/shell/page-bar.d.ts +51 -0
- package/dist/shell/page-bar.d.ts.map +1 -0
- package/dist/shell/page-bar.js +154 -0
- package/dist/shell/page-bar.module.css +178 -0
- package/dist/shell/page-bar.module.css.d.ts +17 -0
- package/dist/shell/page-bar.test.d.ts +2 -0
- package/dist/shell/page-bar.test.d.ts.map +1 -0
- package/dist/shell/sidebar-block-model.d.ts +48 -0
- package/dist/shell/sidebar-block-model.d.ts.map +1 -0
- package/dist/shell/sidebar-block-model.js +39 -0
- package/dist/shell/sidebar-blocks.d.ts +32 -0
- package/dist/shell/sidebar-blocks.d.ts.map +1 -0
- package/dist/shell/sidebar-blocks.js +169 -0
- package/dist/shell/sidebar-search.d.ts +13 -1
- package/dist/shell/sidebar-search.d.ts.map +1 -1
- package/dist/shell/sidebar-search.js +34 -1
- package/dist/shell/sidebar-search.module.css +26 -0
- package/dist/shell/sidebar-search.module.css.d.ts +2 -0
- package/dist/state/fields.d.ts +392 -0
- package/dist/state/fields.d.ts.map +1 -0
- package/dist/state/fields.js +369 -0
- package/dist/state/fields.test.d.ts +2 -0
- package/dist/state/fields.test.d.ts.map +1 -0
- package/dist/state/persisted.d.ts +48 -0
- package/dist/state/persisted.d.ts.map +1 -0
- package/dist/state/persisted.js +105 -0
- package/dist/state.d.ts +11 -56
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +14 -120
- package/dist/styles.css +13 -0
- package/dist/surfaces.d.ts +106 -24
- package/dist/surfaces.d.ts.map +1 -1
- package/dist/surfaces.js +155 -19
- package/dist/theme/controls.module.css +16 -1
- package/dist/theme/ctl-theme.d.ts +32 -0
- package/dist/theme/ctl-theme.d.ts.map +1 -0
- package/dist/theme/ctl-theme.js +54 -0
- package/dist/theme/ctl-theme.test.d.ts +2 -0
- package/dist/theme/ctl-theme.test.d.ts.map +1 -0
- package/dist/theme/ctl-tier-coverage.test.d.ts +2 -0
- package/dist/theme/ctl-tier-coverage.test.d.ts.map +1 -0
- package/dist/theme/divider-law.test.d.ts +2 -0
- package/dist/theme/divider-law.test.d.ts.map +1 -0
- package/dist/theme/icon-slot.d.ts +44 -0
- package/dist/theme/icon-slot.d.ts.map +1 -0
- package/dist/theme/icon-slot.js +21 -0
- package/dist/theme/icon-slot.module.css +47 -0
- package/dist/theme/icon-slot.module.css.d.ts +8 -0
- package/dist/theme/icon-slot.test.d.ts +2 -0
- package/dist/theme/icon-slot.test.d.ts.map +1 -0
- package/dist/theme/index.d.ts +1 -0
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +82 -5
- package/dist/theme/layout-rhythm-css.test.d.ts +2 -0
- package/dist/theme/layout-rhythm-css.test.d.ts.map +1 -0
- package/dist/theme/segmented-control.module.css +20 -0
- package/dist/theme/shadow-surfaces.test.d.ts.map +1 -1
- package/dist/tokens/index.d.ts +12 -0
- package/dist/tokens/index.d.ts.map +1 -1
- package/dist/tokens/index.js +38 -8
- package/dist/tokens/palette.d.ts +97 -61
- package/dist/tokens/palette.d.ts.map +1 -1
- package/dist/tokens/palette.js +76 -38
- package/dist/tokens.css +10 -2
- package/dist/widget-header/delta-badge.d.ts +13 -0
- package/dist/widget-header/delta-badge.d.ts.map +1 -0
- package/dist/widget-header/delta-badge.js +29 -0
- package/dist/widget-header/delta-badge.test.d.ts +2 -0
- package/dist/widget-header/delta-badge.test.d.ts.map +1 -0
- package/dist/widget-header/index.d.ts +3 -0
- package/dist/widget-header/index.d.ts.map +1 -0
- package/dist/widget-header/index.js +6 -0
- package/dist/widget-header/no-mantine.test.d.ts +2 -0
- package/dist/widget-header/no-mantine.test.d.ts.map +1 -0
- package/dist/widget-header/widget-header.d.ts +37 -0
- package/dist/widget-header/widget-header.d.ts.map +1 -0
- package/dist/widget-header/widget-header.js +77 -0
- package/dist/widget-header/widget-header.module.css +335 -0
- package/dist/widget-header/widget-header.module.css.d.ts +24 -0
- package/dist/widget-header/widget-header.test.d.ts +2 -0
- package/dist/widget-header/widget-header.test.d.ts.map +1 -0
- package/llms.txt +30 -17
- package/package.json +14 -1
- package/src/charts/cursor/resolve.test.ts +29 -1
- package/src/charts/cursor/resolve.ts +38 -6
- package/src/charts/cursor/scope.tsx +6 -3
- package/src/charts/cursor/store.test.ts +19 -1
- package/src/charts/cursor/store.ts +10 -5
- package/src/charts/hooks/useChartCursor.ts +16 -8
- package/src/charts/index.ts +2 -2
- package/src/charts/primitives/CartesianChart.test.tsx +124 -0
- package/src/charts/primitives/ChartCard.test.tsx +66 -0
- package/src/charts/primitives/ChartCard.tsx +86 -146
- package/src/charts/sparklines/BarSparkline.tsx +43 -5
- package/src/cli/check-coverage.test.ts +297 -0
- package/src/cli/check-theme.test.ts +38 -14
- package/src/cli/index.ts +392 -16
- package/src/cli/init-sync.test.ts +97 -0
- package/src/connectivity/connectivity-indicator.tsx +16 -9
- package/src/content/index.ts +16 -3
- package/src/content/prose.module.css +7 -28
- package/src/content/prose.module.css.test.ts +8 -24
- package/src/controls/actions.module.css +62 -0
- package/src/controls/actions.module.css.d.ts +13 -0
- package/src/controls/actions.test.tsx +252 -0
- package/src/controls/actions.tsx +655 -0
- package/src/controls/actions.type-guard.test.ts +63 -0
- package/src/controls/compare-filter.tsx +64 -0
- package/src/controls/control-group.test.tsx +229 -0
- package/src/controls/control-group.tsx +63 -0
- package/src/controls/controls.module.css +542 -0
- package/src/controls/controls.module.css.d.ts +35 -0
- package/src/controls/controls.router.test.tsx +637 -0
- package/src/controls/enum-filter.tsx +159 -0
- package/src/controls/filter-context.tsx +153 -0
- package/src/controls/filter-pill.tsx +120 -0
- package/src/controls/filter-set.test.tsx +472 -0
- package/src/controls/filter-set.tsx +225 -0
- package/src/controls/filter-sheet.tsx +285 -0
- package/src/controls/glyphs.tsx +81 -0
- package/src/controls/index.ts +48 -0
- package/src/controls/multi-select-filter.tsx +140 -0
- package/src/controls/peer-boundary.test.ts +85 -0
- package/src/controls/props-contract.test.tsx +106 -0
- package/src/controls/range-filter.tsx +184 -0
- package/src/controls/search-filter.tsx +123 -0
- package/src/controls/select-filter.tsx +89 -0
- package/src/controls/sync-button.module.css +63 -0
- package/src/controls/sync-button.module.css.d.ts +11 -0
- package/src/controls/sync-button.test.tsx +183 -0
- package/src/controls/sync-button.tsx +197 -0
- package/src/controls/toggle-filter.tsx +60 -0
- package/src/controls/view-tabs.tsx +110 -0
- package/src/controls-dates/date-range-picker.tsx +42 -0
- package/src/controls-dates/index.ts +8 -0
- package/src/dashboard/delta-badge.tsx +4 -74
- package/src/dashboard/query-state.tsx +1 -1
- package/src/dashboard/settings-section.module.css +10 -0
- package/src/dashboard/settings-section.module.css.d.ts +1 -0
- package/src/dashboard/settings-section.test.tsx +56 -0
- package/src/dashboard/settings-section.tsx +33 -30
- package/src/dashboard/stat-card.module.css +82 -0
- package/src/dashboard/stat-card.module.css.d.ts +11 -0
- package/src/dashboard/stat-card.test.tsx +67 -1
- package/src/dashboard/stat-card.tsx +209 -68
- package/src/data/data-table.test.tsx +282 -6
- package/src/data/data-table.tsx +429 -94
- package/src/data/table.ts +2 -0
- package/src/guard/check-source.test.ts +126 -13
- package/src/guard/grace.test.ts +149 -0
- package/src/guard/index.ts +172 -29
- package/src/guard/types.ts +4 -2
- package/src/index.ts +46 -5
- package/src/nav/types.ts +84 -2
- package/src/notifications/bell.tsx +6 -3
- package/src/notifications/index.ts +1 -1
- package/src/router-tanstack/field.ts +31 -0
- package/src/router-tanstack/index.ts +24 -2
- package/src/router-tanstack/multi-search-param-store.test.ts +71 -3
- package/src/router-tanstack/multi-search-param-store.ts +46 -77
- package/src/router-tanstack/search-param-store.ts +42 -159
- package/src/router-tanstack/search-store.router.test.tsx +661 -0
- package/src/router-tanstack/search-store.test.ts +418 -0
- package/src/router-tanstack/search-store.ts +380 -0
- package/src/router-tanstack/use-nav.test.tsx +187 -0
- package/src/router-tanstack/use-nav.ts +72 -14
- package/src/section/index.ts +1 -0
- package/src/section/section.module.css +104 -0
- package/src/section/section.module.css.d.ts +11 -0
- package/src/section/section.test.tsx +204 -0
- package/src/section/section.tsx +220 -0
- package/src/shell/app-breadcrumbs.tsx +44 -31
- package/src/shell/app-header.module.css +77 -37
- package/src/shell/app-header.module.css.d.ts +2 -1
- package/src/shell/app-mobile-nav.module.css +8 -0
- package/src/shell/app-mobile-nav.module.css.d.ts +1 -0
- package/src/shell/app-mobile-nav.tsx +147 -8
- package/src/shell/app-sidebar-account.tsx +2 -2
- package/src/shell/app-sidebar.module.css +303 -20
- package/src/shell/app-sidebar.module.css.d.ts +19 -1
- package/src/shell/app-sidebar.test.tsx +456 -41
- package/src/shell/app-sidebar.tsx +276 -140
- package/src/shell/index.test.tsx +291 -5
- package/src/shell/index.tsx +137 -38
- package/src/shell/mobile-nav-model.test.ts +228 -7
- package/src/shell/mobile-nav-model.ts +53 -3
- package/src/shell/nav-count-badge.tsx +1 -1
- package/src/shell/page-bar.module.css +178 -0
- package/src/shell/page-bar.module.css.d.ts +17 -0
- package/src/shell/page-bar.test.tsx +316 -0
- package/src/shell/page-bar.tsx +315 -0
- package/src/shell/sidebar-block-model.ts +83 -0
- package/src/shell/sidebar-blocks.tsx +301 -0
- package/src/shell/sidebar-search.module.css +26 -0
- package/src/shell/sidebar-search.module.css.d.ts +2 -0
- package/src/shell/sidebar-search.tsx +71 -2
- package/src/state/fields.test.tsx +258 -0
- package/src/state/fields.ts +892 -0
- package/src/state/persisted.ts +211 -0
- package/src/state.ts +46 -240
- package/src/styles.css +13 -0
- package/src/surfaces.ts +203 -36
- package/src/theme/controls.module.css +16 -1
- package/src/theme/ctl-theme.test.tsx +275 -0
- package/src/theme/ctl-theme.tsx +138 -0
- package/src/theme/ctl-tier-coverage.test.ts +170 -0
- package/src/theme/density-relations.test.ts +106 -51
- package/src/theme/divider-law.test.ts +259 -0
- package/src/theme/icon-slot.module.css +47 -0
- package/src/theme/icon-slot.module.css.d.ts +8 -0
- package/src/theme/icon-slot.test.tsx +275 -0
- package/src/theme/icon-slot.tsx +59 -0
- package/src/theme/index.ts +165 -3
- package/src/theme/layout-rhythm-css.test.ts +72 -0
- package/src/theme/radius.test.ts +11 -1
- package/src/theme/segmented-control.module.css +20 -0
- package/src/theme/shadow-surfaces.test.ts +20 -7
- package/src/theme/spacing.test.ts +75 -27
- package/src/theme/use-basalt-spacing.ts +2 -2
- package/src/tokens/density.test.ts +7 -25
- package/src/tokens/index.ts +48 -8
- package/src/tokens/palette.ts +107 -73
- package/src/widget-header/delta-badge.test.tsx +60 -0
- package/src/widget-header/delta-badge.tsx +57 -0
- package/src/widget-header/index.ts +2 -0
- package/src/widget-header/no-mantine.test.ts +33 -0
- package/src/widget-header/widget-header.module.css +335 -0
- package/src/widget-header/widget-header.module.css.d.ts +24 -0
- package/src/widget-header/widget-header.test.tsx +187 -0
- package/src/widget-header/widget-header.tsx +168 -0
- package/agent/rules/basalt-agent.md +0 -452
- package/agent/rules/basalt-app.md +0 -246
- package/agent/rules/basalt-commands.md +0 -320
- package/agent/rules/basalt-content.md +0 -409
- package/agent/rules/basalt-data.md +0 -269
- package/agent/rules/basalt-forms.md +0 -186
- package/agent/rules/basalt-notifications.md +0 -264
- package/agent/rules/basalt-query.md +0 -187
- package/agent/rules/basalt-router.md +0 -336
- package/dist/content/article-filter-bar.d.ts +0 -40
- package/dist/content/article-filter-bar.d.ts.map +0 -1
- package/dist/content/article-filter-bar.js +0 -56
- package/dist/shell/page-header.d.ts +0 -13
- package/dist/shell/page-header.d.ts.map +0 -1
- package/dist/shell/page-header.js +0 -23
- package/src/content/article-filter-bar.tsx +0 -88
- package/src/shell/page-header.tsx +0 -35
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which lanes a field lives on, declared ONCE at definition (C4).
|
|
3
|
+
*
|
|
4
|
+
* `url` is the truth; `persist` is the localStorage mirror UNDER it. `history` picks the entry a
|
|
5
|
+
* write creates. Declare the lane inline (`field.boolean(false, { url: false })`) — a lane held in
|
|
6
|
+
* a widened variable still behaves correctly at runtime, but the TYPE-level lane filter that keeps
|
|
7
|
+
* a local-only field out of `validateSearch` can only narrow a literal.
|
|
8
|
+
*
|
|
9
|
+
* @default `{ url: true, persist: true, history: 'replace' }`
|
|
10
|
+
*/
|
|
11
|
+
export type FieldLane = {
|
|
12
|
+
/** Put the field in the URL search. `false` = the mirror-only lane (per-chart selects, compact). */
|
|
13
|
+
url?: boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Mirror the field in localStorage. `false` = the URL-only lane (pagination, one-shot filters);
|
|
16
|
+
* with `url: false` as well, the MEMORY-only lane — shared across every mount of the store for
|
|
17
|
+
* the session, gone on reload, never in localStorage. `createLocalStore` ignores `url`, so
|
|
18
|
+
* `persist: false` alone lands a field there.
|
|
19
|
+
*/
|
|
20
|
+
persist?: boolean;
|
|
21
|
+
/** History entry a write creates. @default 'replace' */
|
|
22
|
+
history?: 'push' | 'replace';
|
|
23
|
+
};
|
|
24
|
+
/** A `FieldLane` with every default applied — what a field descriptor actually carries. */
|
|
25
|
+
export type ResolvedLane = {
|
|
26
|
+
url: boolean;
|
|
27
|
+
persist: boolean;
|
|
28
|
+
history: 'push' | 'replace';
|
|
29
|
+
};
|
|
30
|
+
/** Lane defaults at the type level. Only an inline (const-inferred) lane object narrows. */
|
|
31
|
+
export type ResolveLane<L> = {
|
|
32
|
+
url: L extends {
|
|
33
|
+
url: false;
|
|
34
|
+
} ? false : true;
|
|
35
|
+
persist: L extends {
|
|
36
|
+
persist: false;
|
|
37
|
+
} ? false : true;
|
|
38
|
+
history: L extends {
|
|
39
|
+
history: 'push';
|
|
40
|
+
} ? 'push' : 'replace';
|
|
41
|
+
};
|
|
42
|
+
/** The value of a range field: one preset, plus two ISO dates when the preset is `'custom'`. */
|
|
43
|
+
export type RangeValue<P extends string> = {
|
|
44
|
+
preset: P;
|
|
45
|
+
from?: string | undefined;
|
|
46
|
+
to?: string | undefined;
|
|
47
|
+
};
|
|
48
|
+
/** Renamed URL params for a range field. Defaults: the field's own name, `from`, `to`. */
|
|
49
|
+
export type RangeParams = {
|
|
50
|
+
preset?: string;
|
|
51
|
+
from?: string;
|
|
52
|
+
to?: string;
|
|
53
|
+
};
|
|
54
|
+
export type EnumField<T extends string = string, Ln extends ResolvedLane = ResolvedLane> = {
|
|
55
|
+
readonly kind: 'enum';
|
|
56
|
+
readonly values: readonly T[];
|
|
57
|
+
readonly fallback: T;
|
|
58
|
+
readonly lane: Ln;
|
|
59
|
+
};
|
|
60
|
+
export type MultiField<T extends string = string, Ln extends ResolvedLane = ResolvedLane> = {
|
|
61
|
+
readonly kind: 'multi';
|
|
62
|
+
readonly values: readonly T[];
|
|
63
|
+
readonly fallback: readonly T[];
|
|
64
|
+
readonly lane: Ln;
|
|
65
|
+
};
|
|
66
|
+
export type RangeField<P extends string = string, C extends boolean = boolean, Pm extends RangeParams = RangeParams, Ln extends ResolvedLane = ResolvedLane> = {
|
|
67
|
+
readonly kind: 'range';
|
|
68
|
+
/** The declared presets — `'custom'` is NOT one of them, it is `custom: true`'s consequence. */
|
|
69
|
+
readonly presets: readonly P[];
|
|
70
|
+
readonly fallback: RangeValue<P>;
|
|
71
|
+
/** `true` → the preset `'custom'` plus `from`/`to` ISO dates are legal values. */
|
|
72
|
+
readonly custom: C;
|
|
73
|
+
readonly params: Pm;
|
|
74
|
+
readonly lane: Ln;
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* The preset union a range field's VALUES range over: the declared presets, plus `'custom'` unless
|
|
78
|
+
* the field opted out. `C` widened to `boolean` (a `RangeField<P>` in a control's props) keeps
|
|
79
|
+
* `'custom'`, so a widened handle can still carry a custom window.
|
|
80
|
+
*/
|
|
81
|
+
export type RangePresets<P, C> = (P & string) | (C extends false ? never : 'custom');
|
|
82
|
+
export type NumberField<Ln extends ResolvedLane = ResolvedLane> = {
|
|
83
|
+
readonly kind: 'number';
|
|
84
|
+
readonly fallback: number;
|
|
85
|
+
readonly min: number | undefined;
|
|
86
|
+
readonly max: number | undefined;
|
|
87
|
+
readonly int: boolean;
|
|
88
|
+
readonly lane: Ln;
|
|
89
|
+
};
|
|
90
|
+
export type BooleanField<Ln extends ResolvedLane = ResolvedLane> = {
|
|
91
|
+
readonly kind: 'boolean';
|
|
92
|
+
readonly fallback: boolean;
|
|
93
|
+
readonly lane: Ln;
|
|
94
|
+
};
|
|
95
|
+
export type StringField<Ln extends ResolvedLane = ResolvedLane> = {
|
|
96
|
+
readonly kind: 'string';
|
|
97
|
+
readonly fallback: string;
|
|
98
|
+
readonly max: number | undefined;
|
|
99
|
+
readonly lane: Ln;
|
|
100
|
+
};
|
|
101
|
+
/** Every field kind, widened — the constraint a store's `fields` map satisfies. */
|
|
102
|
+
export type AnyField = EnumField | MultiField | RangeField | NumberField | BooleanField | StringField;
|
|
103
|
+
/** The value `use()` reads and writes for one field. Range fields deal in `RangeValue`. */
|
|
104
|
+
export type FieldValue<F extends AnyField> = F extends {
|
|
105
|
+
kind: 'enum';
|
|
106
|
+
values: readonly (infer T)[];
|
|
107
|
+
} ? T : F extends {
|
|
108
|
+
kind: 'multi';
|
|
109
|
+
values: readonly (infer T)[];
|
|
110
|
+
} ? readonly T[] : F extends {
|
|
111
|
+
kind: 'range';
|
|
112
|
+
presets: readonly (infer P)[];
|
|
113
|
+
custom: infer C;
|
|
114
|
+
} ? RangeValue<RangePresets<P, C>> : F extends {
|
|
115
|
+
kind: 'number';
|
|
116
|
+
} ? number : F extends {
|
|
117
|
+
kind: 'boolean';
|
|
118
|
+
} ? boolean : F extends {
|
|
119
|
+
kind: 'string';
|
|
120
|
+
} ? string : never;
|
|
121
|
+
/** One option of an enum / multi / range field, labelled through `store.labels()`. */
|
|
122
|
+
export type FieldOption = {
|
|
123
|
+
value: string;
|
|
124
|
+
label: string;
|
|
125
|
+
};
|
|
126
|
+
/** `toWindow` exists on a range handle and nowhere else — it is not an optional convenience. */
|
|
127
|
+
type RangeHandleExtras<F> = F extends {
|
|
128
|
+
kind: 'range';
|
|
129
|
+
presets: readonly (infer P)[];
|
|
130
|
+
custom: infer C;
|
|
131
|
+
} ? {
|
|
132
|
+
/**
|
|
133
|
+
* The API-facing projection of a range value: a preset becomes `{ window }`, a custom range
|
|
134
|
+
* becomes `{ from, to }`. Replaces every hand-rolled `presetToParams`.
|
|
135
|
+
*/
|
|
136
|
+
readonly toWindow: (v: RangeValue<RangePresets<P, C>>) => {
|
|
137
|
+
window: RangePresets<P, C>;
|
|
138
|
+
} | {
|
|
139
|
+
from: string;
|
|
140
|
+
to: string;
|
|
141
|
+
};
|
|
142
|
+
} : {
|
|
143
|
+
readonly toWindow?: undefined;
|
|
144
|
+
};
|
|
145
|
+
/**
|
|
146
|
+
* The binding every basalt control takes instead of `value`/`onChange` (C2). One field, both lanes,
|
|
147
|
+
* one resolution law. Handed out by `createSearchStore().field.<name>` /
|
|
148
|
+
* `createLocalStore().field.<name>`; never constructed by hand.
|
|
149
|
+
*/
|
|
150
|
+
export type FieldHandle<F extends AnyField> = {
|
|
151
|
+
readonly kind: F['kind'];
|
|
152
|
+
readonly fallback: FieldValue<F>;
|
|
153
|
+
/** enum / multi / range options, labelled by `labels()`. Empty for the other kinds. */
|
|
154
|
+
readonly options: readonly FieldOption[];
|
|
155
|
+
/**
|
|
156
|
+
* Read + write. Reads the URL when the field is on the URL lane (`useSearch({ strict: false })`,
|
|
157
|
+
* so a control renders on a sibling or child route with no `from`), else localStorage, else the
|
|
158
|
+
* fallback. Writes navigate when the matched route validates the param, then persist.
|
|
159
|
+
*/
|
|
160
|
+
use(): readonly [FieldValue<F>, (next: FieldValue<F>) => void];
|
|
161
|
+
isDefault(v: FieldValue<F>): boolean;
|
|
162
|
+
} & RangeHandleExtras<F>;
|
|
163
|
+
/**
|
|
164
|
+
* The field vocabulary. Every builder returns plain declarative data — no closures, no router, no
|
|
165
|
+
* storage — which is what lets one field definition drive `createSearchStore` (URL + storage) and
|
|
166
|
+
* `createLocalStore` (storage only) without a second description of the same param.
|
|
167
|
+
*
|
|
168
|
+
* @example
|
|
169
|
+
* const store = createSearchStore({
|
|
170
|
+
* key: 'analytics',
|
|
171
|
+
* fields: {
|
|
172
|
+
* range: field.range({ presets: ['7d', '30d', '90d'], fallback: '30d', custom: true }),
|
|
173
|
+
* compare: field.enum(['none', 'previous'], 'none'),
|
|
174
|
+
* channels: field.multi(CHANNELS, []),
|
|
175
|
+
* minDuration: field.number({ fallback: 0, min: 0 }, { persist: false }),
|
|
176
|
+
* compact: field.boolean(false, { url: false }),
|
|
177
|
+
* },
|
|
178
|
+
* })
|
|
179
|
+
*/
|
|
180
|
+
export declare const field: {
|
|
181
|
+
/** A closed string enum — a tab, a compare mode, a single-select filter. */
|
|
182
|
+
enum<const T extends string, const L extends FieldLane = FieldLane>(values: readonly T[], fallback: NoInfer<T>, lane?: L): EnumField<T, ResolveLane<L>>;
|
|
183
|
+
/** An any-of set over the same closed enum. Decoding is deduped and canonically re-sorted. */
|
|
184
|
+
multi<const T extends string, const L extends FieldLane = FieldLane>(values: readonly T[], fallback?: readonly NoInfer<T>[], lane?: L): MultiField<T, ResolveLane<L>>;
|
|
185
|
+
/**
|
|
186
|
+
* A time window: THREE URL params (preset + `from` + `to`, each renamable through `params`), so a
|
|
187
|
+
* consumer's existing deep links and loaders keep their shape. `custom: true` additionally
|
|
188
|
+
* allows the preset `'custom'` with two ISO dates.
|
|
189
|
+
*
|
|
190
|
+
* A second `field.range` in the same store — or a second range store composed into the same
|
|
191
|
+
* route's `validateSearch` — MUST rename `from`/`to` via `params`: every range defaults to the
|
|
192
|
+
* literal param names `'from'`/`'to'`, and two fields silently sharing them makes the later one's
|
|
193
|
+
* `toSearch` overwrite the earlier one's dates. `createStoreCore` throws at definition for the
|
|
194
|
+
* in-store case; the cross-store case is not detectable by either store alone.
|
|
195
|
+
*/
|
|
196
|
+
range<const P extends string, const C extends boolean = false, const Pm extends RangeParams = RangeParams, const L extends FieldLane = FieldLane>(o: {
|
|
197
|
+
presets: readonly P[];
|
|
198
|
+
fallback: NoInfer<P>;
|
|
199
|
+
custom?: C;
|
|
200
|
+
params?: Pm;
|
|
201
|
+
}, lane?: L): RangeField<P, C, Pm, ResolveLane<L>>;
|
|
202
|
+
/** A number — pagination, a threshold. Out-of-range input clamps to `min`/`max`. */
|
|
203
|
+
number<const L extends FieldLane = FieldLane>(o: {
|
|
204
|
+
fallback: number;
|
|
205
|
+
min?: number;
|
|
206
|
+
max?: number;
|
|
207
|
+
int?: boolean;
|
|
208
|
+
}, lane?: L): NumberField<ResolveLane<L>>;
|
|
209
|
+
/** A toggle. Accepts `true`/`false` and the strings `'true'`/`'false'` from a hand-typed URL. */
|
|
210
|
+
boolean<const L extends FieldLane = FieldLane>(fallback: boolean, lane?: L): BooleanField<ResolveLane<L>>;
|
|
211
|
+
/** Free text — a search box. Defaults to `history: 'replace'` like every other field. */
|
|
212
|
+
string<const L extends FieldLane = FieldLane>(o?: {
|
|
213
|
+
fallback?: string;
|
|
214
|
+
max?: number;
|
|
215
|
+
}, lane?: L): StringField<ResolveLane<L>>;
|
|
216
|
+
};
|
|
217
|
+
type UnionToIntersection<U> = (U extends unknown ? (x: U) => void : never) extends (x: infer I) => void ? I : never;
|
|
218
|
+
type Prettify<T> = {
|
|
219
|
+
[K in keyof T]: T[K];
|
|
220
|
+
} & {};
|
|
221
|
+
type RangeParamName<Pm, K extends keyof RangeParams, D extends string> = Pm extends Record<K, infer N> ? (N extends string ? N : D) : D;
|
|
222
|
+
/** The param entries ONE field owns. A range field owns three; every other kind owns one. */
|
|
223
|
+
type FieldSearch<K extends string, F extends AnyField> = F extends {
|
|
224
|
+
kind: 'range';
|
|
225
|
+
presets: readonly (infer P)[];
|
|
226
|
+
custom: infer C;
|
|
227
|
+
params: infer Pm;
|
|
228
|
+
} ? {
|
|
229
|
+
[Q in RangeParamName<Pm, 'preset', K>]: RangePresets<P, C>;
|
|
230
|
+
} & {
|
|
231
|
+
[Q in RangeParamName<Pm, 'from', 'from'>]?: string | undefined;
|
|
232
|
+
} & {
|
|
233
|
+
[Q in RangeParamName<Pm, 'to', 'to'>]?: string | undefined;
|
|
234
|
+
} : {
|
|
235
|
+
[Q in K]: FieldValue<F>;
|
|
236
|
+
};
|
|
237
|
+
type FieldNames<S> = keyof S & string;
|
|
238
|
+
type UrlFieldNames<S> = {
|
|
239
|
+
[K in FieldNames<S>]: S[K] extends {
|
|
240
|
+
lane: {
|
|
241
|
+
url: false;
|
|
242
|
+
};
|
|
243
|
+
} ? never : K;
|
|
244
|
+
}[FieldNames<S>];
|
|
245
|
+
/** The search object of a store's URL-lane fields — `validateSearch`'s return, flat. */
|
|
246
|
+
export type SearchValues<S extends Record<string, AnyField>> = Prettify<UnionToIntersection<{
|
|
247
|
+
[K in UrlFieldNames<S>]: FieldSearch<K, S[K]>;
|
|
248
|
+
}[UrlFieldNames<S>]>>;
|
|
249
|
+
/** The same flat shape over EVERY field, both lanes — what `readStored()` can return. */
|
|
250
|
+
export type StoredValues<S extends Record<string, AnyField>> = Prettify<UnionToIntersection<{
|
|
251
|
+
[K in FieldNames<S>]: FieldSearch<K, S[K]>;
|
|
252
|
+
}[FieldNames<S>]>>;
|
|
253
|
+
/**
|
|
254
|
+
* Everything a store needs to move one field between the URL, localStorage and a control.
|
|
255
|
+
*
|
|
256
|
+
* @internal Reachable on `basalt-ui/state` only because `./router-tanstack`'s store is built on it
|
|
257
|
+
* — the two store factories are the public API, not this seam.
|
|
258
|
+
*/
|
|
259
|
+
export type FieldCodec = {
|
|
260
|
+
readonly kind: AnyField['kind'];
|
|
261
|
+
readonly lane: ResolvedLane;
|
|
262
|
+
/** Every URL param this field owns. */
|
|
263
|
+
readonly params: readonly string[];
|
|
264
|
+
/**
|
|
265
|
+
* The param whose PRESENCE in the current search means "the matched route validates this field".
|
|
266
|
+
* A store's `validateSearch` always returns it, so a route that ran it has the key; a foreign
|
|
267
|
+
* route does not, and a write there persists only (A1).
|
|
268
|
+
*/
|
|
269
|
+
readonly primary: string;
|
|
270
|
+
readonly fallback: unknown;
|
|
271
|
+
/**
|
|
272
|
+
* Validate a STORED (or caller-supplied) value. `null` = unusable.
|
|
273
|
+
*
|
|
274
|
+
* Deliberately a different function from `fromSearch` for one kind: the deprecated multi store
|
|
275
|
+
* reads an empty URL array as "absent", and reusing that rule on the storage side would turn a
|
|
276
|
+
* deliberately CLEARED filter into a miss and resurrect the fallback on upgrade.
|
|
277
|
+
*/
|
|
278
|
+
decode(raw: unknown): unknown;
|
|
279
|
+
/** Pull the field out of a router search object. `null` = absent or invalid. */
|
|
280
|
+
fromSearch(search: Record<string, unknown>): unknown;
|
|
281
|
+
/** The param entries a write puts on the URL. `undefined` values clear a stale param. */
|
|
282
|
+
toSearch(value: unknown): Record<string, unknown>;
|
|
283
|
+
equals(a: unknown, b: unknown): boolean;
|
|
284
|
+
/** Option values in declaration order — enum, multi and range only. */
|
|
285
|
+
readonly optionValues: readonly string[];
|
|
286
|
+
};
|
|
287
|
+
/**
|
|
288
|
+
* Build the codec for one field. `legacyMultiEmpty` restores the DEPRECATED multi-store's rule that
|
|
289
|
+
* an EMPTY url array means "absent, fall through to storage" — the deprecated wrapper's contract,
|
|
290
|
+
* never the new store's, where an empty selection is a value like any other.
|
|
291
|
+
*
|
|
292
|
+
* @internal — see `FieldCodec`.
|
|
293
|
+
*/
|
|
294
|
+
export declare function resolveFieldCodec(name: string, f: AnyField, opts?: {
|
|
295
|
+
legacyMultiEmpty?: boolean;
|
|
296
|
+
}): FieldCodec;
|
|
297
|
+
type StoreRecord = Record<string, unknown>;
|
|
298
|
+
/** One named field plus its codec, in declaration order. @internal — see `FieldCodec`. */
|
|
299
|
+
export type StoreEntry = {
|
|
300
|
+
readonly name: string;
|
|
301
|
+
readonly codec: FieldCodec;
|
|
302
|
+
};
|
|
303
|
+
export type StoreCoreOptions = {
|
|
304
|
+
readonly key: string;
|
|
305
|
+
readonly fields: Record<string, AnyField>;
|
|
306
|
+
readonly version?: number | undefined;
|
|
307
|
+
/**
|
|
308
|
+
* Legacy single-value storage layout: the whole envelope value IS this field's value, the shape
|
|
309
|
+
* `createSearchParamStore` has written since 1.0.0. Set ONLY by the deprecated wrappers — a
|
|
310
|
+
* consumer's already-persisted selection has to keep resolving byte-for-byte.
|
|
311
|
+
*/
|
|
312
|
+
readonly legacyValueField?: string;
|
|
313
|
+
};
|
|
314
|
+
/**
|
|
315
|
+
* The storage + resolution kernel. Deliberately NOT exported from any barrel: it is the seam
|
|
316
|
+
* between `./state`'s router-free store and `./router-tanstack`'s router-coupled one, and both of
|
|
317
|
+
* those are the public API.
|
|
318
|
+
*
|
|
319
|
+
* @internal — see `FieldCodec`.
|
|
320
|
+
*/
|
|
321
|
+
export type StoreCore = {
|
|
322
|
+
readonly entries: readonly StoreEntry[];
|
|
323
|
+
readonly urlEntries: readonly StoreEntry[];
|
|
324
|
+
readonly anyPersisted: boolean;
|
|
325
|
+
usePersistedRecord(): readonly [StoreRecord, (next: StoreRecord) => void];
|
|
326
|
+
readRecord(): StoreRecord;
|
|
327
|
+
setLabels(map: Record<string, Record<string, string> | undefined>): void;
|
|
328
|
+
optionsFor(entry: StoreEntry): readonly FieldOption[];
|
|
329
|
+
/** The resolution law, once: URL ⊳ localStorage ⊳ fallback. `search: null` skips the URL lane. */
|
|
330
|
+
resolve(entry: StoreEntry, search: StoreRecord | null, record: StoreRecord): unknown;
|
|
331
|
+
writeField(setRecord: (next: StoreRecord) => void, name: string, value: unknown): void;
|
|
332
|
+
/**
|
|
333
|
+
* The IN-MEMORY lane's `use()` for one field — a field with neither the URL nor the mirror.
|
|
334
|
+
* Lives here rather than in either factory because BOTH have such a field: `createLocalStore`'s
|
|
335
|
+
* `persist: false`, and `createSearchStore`'s `{ url: false, persist: false }`.
|
|
336
|
+
*/
|
|
337
|
+
memoryUse(entry: StoreEntry): () => readonly [unknown, (next: unknown) => void];
|
|
338
|
+
/** The memory lane's value for one field, resolved — its fallback while nothing was written. */
|
|
339
|
+
readMemoryValue(entry: StoreEntry): unknown;
|
|
340
|
+
/** Subscribes to the whole memory lane. The snapshot is a write counter, so it is always stable. */
|
|
341
|
+
useMemoryVersion(): number;
|
|
342
|
+
/** Drops every memory value, so the next read resolves to the fallback. What `useReset` calls. */
|
|
343
|
+
resetMemory(): void;
|
|
344
|
+
/** Every stored field, flattened into URL-param shape, `undefined` entries dropped. */
|
|
345
|
+
readStoredFlat(): StoreRecord;
|
|
346
|
+
handle(entry: StoreEntry, use: () => readonly [unknown, (next: unknown) => void]): FieldHandle<AnyField>;
|
|
347
|
+
};
|
|
348
|
+
/** @internal — the seam behind `createSearchStore` and `createLocalStore`. */
|
|
349
|
+
export declare function createStoreCore(o: StoreCoreOptions): StoreCore;
|
|
350
|
+
/** `Pick<SearchStore<S>, 'field' | 'readStored' | 'labels'>` — the same handles, no router. */
|
|
351
|
+
export type LocalStore<S extends Record<string, AnyField>> = {
|
|
352
|
+
readonly field: {
|
|
353
|
+
[K in keyof S]: FieldHandle<S[K]>;
|
|
354
|
+
};
|
|
355
|
+
readStored: () => Partial<StoredValues<S>>;
|
|
356
|
+
/**
|
|
357
|
+
* Option labels for enum / multi / range fields — the same chainable contract
|
|
358
|
+
* `createSearchStore` has, so `SelectFilter`/`ViewTabs` read their option labels off a local
|
|
359
|
+
* store too. Call it once, at definition.
|
|
360
|
+
*/
|
|
361
|
+
labels: (map: Partial<{
|
|
362
|
+
[K in keyof S]: Record<string, string>;
|
|
363
|
+
}>) => LocalStore<S>;
|
|
364
|
+
};
|
|
365
|
+
/**
|
|
366
|
+
* A store with no URL lane and no router import: per-chart selects, a section's view tab, a compact
|
|
367
|
+
* toggle. Same `field.*` vocabulary and the same `FieldHandle` every basalt control binds to, so a
|
|
368
|
+
* control cannot tell the two stores apart — which is the point, and why the local lane is not an
|
|
369
|
+
* excuse to reach for `useState` (C3).
|
|
370
|
+
*
|
|
371
|
+
* A field's `url` lane is ignored here (there is no URL to write); `persist: false` is the
|
|
372
|
+
* IN-MEMORY lane — shared across mounts for the session, gone on reload, never in localStorage.
|
|
373
|
+
* That is the honest home for a value a reader should not be handed back tomorrow (a scratch
|
|
374
|
+
* comparison, a temporary drill-down) without dropping to `useState` and losing the handle.
|
|
375
|
+
*
|
|
376
|
+
* @example
|
|
377
|
+
* const chart = createLocalStore({
|
|
378
|
+
* key: 'momentum-chart',
|
|
379
|
+
* fields: {
|
|
380
|
+
* metric: field.enum(['load', 'volume'], 'load'),
|
|
381
|
+
* zoomed: field.boolean(false, { persist: false }), // in-memory, this session only
|
|
382
|
+
* },
|
|
383
|
+
* }).labels({ metric: { load: 'Load', volume: 'Volume' } })
|
|
384
|
+
* // <SelectFilter field={chart.field.metric} label="Metric" />
|
|
385
|
+
*/
|
|
386
|
+
export declare function createLocalStore<const S extends Record<string, AnyField>>(o: {
|
|
387
|
+
key: string;
|
|
388
|
+
fields: S;
|
|
389
|
+
version?: number;
|
|
390
|
+
}): LocalStore<S>;
|
|
391
|
+
export {};
|
|
392
|
+
//# sourceMappingURL=fields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../../src/state/fields.ts"],"names":[],"mappings":"AAgBA;;;;;;;;;GASG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,oGAAoG;IACpG,GAAG,CAAC,EAAE,OAAO,CAAA;IACb;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC7B,CAAA;AAED,2FAA2F;AAC3F,MAAM,MAAM,YAAY,GAAG;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAA;AAE1F,4FAA4F;AAC5F,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;IAC3B,GAAG,EAAE,CAAC,SAAS;QAAE,GAAG,EAAE,KAAK,CAAA;KAAE,GAAG,KAAK,GAAG,IAAI,CAAA;IAC5C,OAAO,EAAE,CAAC,SAAS;QAAE,OAAO,EAAE,KAAK,CAAA;KAAE,GAAG,KAAK,GAAG,IAAI,CAAA;IACpD,OAAO,EAAE,CAAC,SAAS;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,GAAG,SAAS,CAAA;CAC5D,CAAA;AAED,gGAAgG;AAChG,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,MAAM,IAAI;IACzC,MAAM,EAAE,CAAC,CAAA;IACT,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACxB,CAAA;AAED,0FAA0F;AAC1F,MAAM,MAAM,WAAW,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAEzE,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,EAAE,SAAS,YAAY,GAAG,YAAY,IAAI;IACzF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAA;IAC7B,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAA;IACpB,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,EAAE,SAAS,YAAY,GAAG,YAAY,IAAI;IAC1F,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;IACtB,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAA;IAC7B,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAA;IAC/B,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,UAAU,CACpB,CAAC,SAAS,MAAM,GAAG,MAAM,EACzB,CAAC,SAAS,OAAO,GAAG,OAAO,EAC3B,EAAE,SAAS,WAAW,GAAG,WAAW,EACpC,EAAE,SAAS,YAAY,GAAG,YAAY,IACpC;IACF,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;IACtB,gGAAgG;IAChG,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAA;IAC9B,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAA;IAChC,kFAAkF;IAClF,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;IAClB,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAA;IACnB,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAA;CAClB,CAAA;AAED;;;;GAIG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,GAAG,QAAQ,CAAC,CAAA;AAEpF,MAAM,MAAM,WAAW,CAAC,EAAE,SAAS,YAAY,GAAG,YAAY,IAAI;IAChE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;IAChC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,YAAY,CAAC,EAAE,SAAS,YAAY,GAAG,YAAY,IAAI;IACjE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;IACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,WAAW,CAAC,EAAE,SAAS,YAAY,GAAG,YAAY,IAAI;IAChE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;IAChC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAA;CAClB,CAAA;AAED,mFAAmF;AACnF,MAAM,MAAM,QAAQ,GAChB,SAAS,GACT,UAAU,GACV,UAAU,GACV,WAAW,GACX,YAAY,GACZ,WAAW,CAAA;AAEf,2FAA2F;AAC3F,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,QAAQ,IAAI,CAAC,SAAS;IACrD,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAA;CAC7B,GACG,CAAC,GACD,CAAC,SAAS;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAA;CAAE,GACvD,SAAS,CAAC,EAAE,GACZ,CAAC,SAAS;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GACzE,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAC9B,CAAC,SAAS;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC1B,MAAM,GACN,CAAC,SAAS;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GAC3B,OAAO,GACP,CAAC,SAAS;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC1B,MAAM,GACN,KAAK,CAAA;AAEnB,sFAAsF;AACtF,MAAM,MAAM,WAAW,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAE1D,gGAAgG;AAChG,KAAK,iBAAiB,CAAC,CAAC,IAAI,CAAC,SAAS;IACpC,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAA;IAC7B,MAAM,EAAE,MAAM,CAAC,CAAA;CAChB,GACG;IACE;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,CACjB,CAAC,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAC9B;QAAE,MAAM,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAA;CACnE,GACD;IAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,CAAA;AAErC;;;;GAIG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,QAAQ,IAAI;IAC5C,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;IACxB,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAA;IAChC,uFAAuF;IACvF,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAA;IACxC;;;;OAIG;IACH,GAAG,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAA;IAC9D,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO,CAAA;CACrC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAA;AAIxB;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,KAAK;IAChB,4EAA4E;eACjE,CAAC,SAAS,MAAM,QAAQ,CAAC,SAAS,SAAS,sBAC5C,SAAS,CAAC,EAAE,YACV,OAAO,CAAC,CAAC,CAAC,SACb,CAAC,GACP,SAAS,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IAI/B,8FAA8F;gBAClF,CAAC,SAAS,MAAM,QAAQ,CAAC,SAAS,SAAS,sBAC7C,SAAS,CAAC,EAAE,aACV,SAAS,OAAO,CAAC,CAAC,CAAC,EAAE,SACxB,CAAC,GACP,UAAU,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IAIhC;;;;;;;;;;OAUG;gBAEK,CAAC,SAAS,MAAM,QAChB,CAAC,SAAS,OAAO,gBACjB,EAAE,SAAS,WAAW,sBACtB,CAAC,SAAS,SAAS,iBAEtB;QAAE,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAAC,MAAM,CAAC,EAAE,EAAE,CAAA;KAAE,SACpE,CAAC,GACP,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IAavC,oFAAoF;iBACvE,CAAC,SAAS,SAAS,iBAC3B;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,OAAO,CAAA;KAAE,SAC3D,CAAC,GACP,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAW9B,iGAAiG;kBACnF,CAAC,SAAS,SAAS,wBACrB,OAAO,SACV,CAAC,GACP,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAI/B,yFAAyF;iBAC5E,CAAC,SAAS,SAAS,kBAC1B;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,SAChC,CAAC,GACP,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;CAQ/B,CAAA;AAYD,KAAK,mBAAmB,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,GAAG,KAAK,CAAC,SAAS,CACjF,CAAC,EAAE,MAAM,CAAC,KACP,IAAI,GACL,CAAC,GACD,KAAK,CAAA;AAET,KAAK,QAAQ,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG,EAAE,CAAA;AAEhD,KAAK,cAAc,CAAC,EAAE,EAAE,CAAC,SAAS,MAAM,WAAW,EAAE,CAAC,SAAS,MAAM,IACnE,EAAE,SAAS,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;AAEhE,6FAA6F;AAC7F,KAAK,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,QAAQ,IAAI,CAAC,SAAS;IACjE,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAA;IAC7B,MAAM,EAAE,MAAM,CAAC,CAAA;IACf,MAAM,EAAE,MAAM,EAAE,CAAA;CACjB,GACG;KAAG,CAAC,IAAI,cAAc,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;CAAE,GAAG;KAC9D,CAAC,IAAI,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS;CAC/D,GAAG;KAAG,CAAC,IAAI,cAAc,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS;CAAE,GAClE;KAAG,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;CAAE,CAAA;AAE/B,KAAK,UAAU,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,MAAM,CAAA;AAErC,KAAK,aAAa,CAAC,CAAC,IAAI;KACrB,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;QAAE,IAAI,EAAE;YAAE,GAAG,EAAE,KAAK,CAAA;SAAE,CAAA;KAAE,GAAG,KAAK,GAAG,CAAC;CACxE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;AAEhB,wFAAwF;AACxF,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,QAAQ,CACrE,mBAAmB,CAAC;KAAG,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CACzF,CAAA;AAED,yFAAyF;AACzF,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,QAAQ,CACrE,mBAAmB,CAAC;KAAG,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CACnF,CAAA;AAID;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;IAC/B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;IAC3B,uCAAuC;IACvC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;IAClC;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B;;;;;;OAMG;IACH,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAA;IAC7B,gFAAgF;IAChF,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;IACpD,yFAAyF;IACzF,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjD,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAAA;IACvC,uEAAuE;IACvE,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAA;CACzC,CAAA;AA6BD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,CAAC,EAAE,QAAQ,EACX,IAAI,CAAC,EAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAE,GACpC,UAAU,CA6GZ;AA+BD,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAE1C,0FAA0F;AAC1F,MAAM,MAAM,UAAU,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;CAAE,CAAA;AAE9E,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACrC;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CACnC,CAAA;AAED;;;;;;GAMG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,CAAA;IACvC,QAAQ,CAAC,UAAU,EAAE,SAAS,UAAU,EAAE,CAAA;IAC1C,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAA;IAC9B,kBAAkB,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC,CAAA;IACzE,UAAU,IAAI,WAAW,CAAA;IACzB,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,IAAI,CAAA;IACxE,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,WAAW,EAAE,CAAA;IACrD,kGAAkG;IAClG,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAA;IACpF,UAAU,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAA;IACtF;;;;OAIG;IACH,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC,CAAA;IAC/E,gGAAgG;IAChG,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAA;IAC3C,oGAAoG;IACpG,gBAAgB,IAAI,MAAM,CAAA;IAC1B,kGAAkG;IAClG,WAAW,IAAI,IAAI,CAAA;IACnB,uFAAuF;IACvF,cAAc,IAAI,WAAW,CAAA;IAC7B,MAAM,CACJ,KAAK,EAAE,UAAU,EACjB,GAAG,EAAE,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC,GACrD,WAAW,CAAC,QAAQ,CAAC,CAAA;CACzB,CAAA;AAwGD,8EAA8E;AAC9E,wBAAgB,eAAe,CAAC,CAAC,EAAE,gBAAgB,GAAG,SAAS,CA6G9D;AAID,+FAA+F;AAC/F,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI;IAC3D,QAAQ,CAAC,KAAK,EAAE;SAAG,CAAC,IAAI,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KAAE,CAAA;IACrD,UAAU,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAA;IAC1C;;;;OAIG;IACH,MAAM,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC;SAAG,CAAC,IAAI,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;KAAE,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAAA;CACpF,CAAA;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE;IAC5E,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,CAAC,CAAA;IACT,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,GAAG,UAAU,CAAC,CAAC,CAAC,CA2BhB"}
|