@weave-framework/ui 0.2.107
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/LICENSE +21 -0
- package/README.md +17 -0
- package/dist/autocomplete/autocomplete.d.ts +86 -0
- package/dist/autocomplete/autocomplete.d.ts.map +1 -0
- package/dist/autocomplete/autocomplete.js +263 -0
- package/dist/autocomplete/autocomplete.js.map +1 -0
- package/dist/badge/badge.d.ts +39 -0
- package/dist/badge/badge.d.ts.map +1 -0
- package/dist/badge/badge.js +59 -0
- package/dist/badge/badge.js.map +1 -0
- package/dist/bottom-sheet/bottom-sheet.d.ts +21 -0
- package/dist/bottom-sheet/bottom-sheet.d.ts.map +1 -0
- package/dist/bottom-sheet/bottom-sheet.js +82 -0
- package/dist/bottom-sheet/bottom-sheet.js.map +1 -0
- package/dist/button/button.d.ts +47 -0
- package/dist/button/button.d.ts.map +1 -0
- package/dist/button/button.js +47 -0
- package/dist/button/button.js.map +1 -0
- package/dist/button-toggle/button-toggle.d.ts +65 -0
- package/dist/button-toggle/button-toggle.d.ts.map +1 -0
- package/dist/button-toggle/button-toggle.js +127 -0
- package/dist/button-toggle/button-toggle.js.map +1 -0
- package/dist/card/card.d.ts +30 -0
- package/dist/card/card.d.ts.map +1 -0
- package/dist/card/card.js +32 -0
- package/dist/card/card.js.map +1 -0
- package/dist/cdk/bidi.d.ts +19 -0
- package/dist/cdk/bidi.d.ts.map +1 -0
- package/dist/cdk/bidi.js +32 -0
- package/dist/cdk/bidi.js.map +1 -0
- package/dist/cdk/breakpoints.d.ts +21 -0
- package/dist/cdk/breakpoints.d.ts.map +1 -0
- package/dist/cdk/breakpoints.js +39 -0
- package/dist/cdk/breakpoints.js.map +1 -0
- package/dist/cdk/clipboard.d.ts +8 -0
- package/dist/cdk/clipboard.d.ts.map +1 -0
- package/dist/cdk/clipboard.js +38 -0
- package/dist/cdk/clipboard.js.map +1 -0
- package/dist/cdk/data-source.d.ts +41 -0
- package/dist/cdk/data-source.d.ts.map +1 -0
- package/dist/cdk/data-source.js +36 -0
- package/dist/cdk/data-source.js.map +1 -0
- package/dist/cdk/date-adapter.d.ts +63 -0
- package/dist/cdk/date-adapter.d.ts.map +1 -0
- package/dist/cdk/date-adapter.js +155 -0
- package/dist/cdk/date-adapter.js.map +1 -0
- package/dist/cdk/drag-drop.d.ts +77 -0
- package/dist/cdk/drag-drop.d.ts.map +1 -0
- package/dist/cdk/drag-drop.js +268 -0
- package/dist/cdk/drag-drop.js.map +1 -0
- package/dist/cdk/focus-monitor.d.ts +27 -0
- package/dist/cdk/focus-monitor.d.ts.map +1 -0
- package/dist/cdk/focus-monitor.js +66 -0
- package/dist/cdk/focus-monitor.js.map +1 -0
- package/dist/cdk/focus-trap.d.ts +39 -0
- package/dist/cdk/focus-trap.d.ts.map +1 -0
- package/dist/cdk/focus-trap.js +127 -0
- package/dist/cdk/focus-trap.js.map +1 -0
- package/dist/cdk/index.d.ts +29 -0
- package/dist/cdk/index.d.ts.map +1 -0
- package/dist/cdk/index.js +29 -0
- package/dist/cdk/index.js.map +1 -0
- package/dist/cdk/interactivity.d.ts +19 -0
- package/dist/cdk/interactivity.d.ts.map +1 -0
- package/dist/cdk/interactivity.js +70 -0
- package/dist/cdk/interactivity.js.map +1 -0
- package/dist/cdk/key-manager.d.ts +41 -0
- package/dist/cdk/key-manager.d.ts.map +1 -0
- package/dist/cdk/key-manager.js +126 -0
- package/dist/cdk/key-manager.js.map +1 -0
- package/dist/cdk/live-announcer.d.ts +19 -0
- package/dist/cdk/live-announcer.d.ts.map +1 -0
- package/dist/cdk/live-announcer.js +48 -0
- package/dist/cdk/live-announcer.js.map +1 -0
- package/dist/cdk/observers.d.ts +17 -0
- package/dist/cdk/observers.d.ts.map +1 -0
- package/dist/cdk/observers.js +35 -0
- package/dist/cdk/observers.js.map +1 -0
- package/dist/cdk/overlay.d.ts +73 -0
- package/dist/cdk/overlay.d.ts.map +1 -0
- package/dist/cdk/overlay.js +154 -0
- package/dist/cdk/overlay.js.map +1 -0
- package/dist/cdk/platform.d.ts +22 -0
- package/dist/cdk/platform.d.ts.map +1 -0
- package/dist/cdk/platform.js +55 -0
- package/dist/cdk/platform.js.map +1 -0
- package/dist/cdk/portal.d.ts +31 -0
- package/dist/cdk/portal.d.ts.map +1 -0
- package/dist/cdk/portal.js +55 -0
- package/dist/cdk/portal.js.map +1 -0
- package/dist/cdk/positioning.d.ts +53 -0
- package/dist/cdk/positioning.d.ts.map +1 -0
- package/dist/cdk/positioning.js +140 -0
- package/dist/cdk/positioning.js.map +1 -0
- package/dist/cdk/scroll.d.ts +43 -0
- package/dist/cdk/scroll.d.ts.map +1 -0
- package/dist/cdk/scroll.js +97 -0
- package/dist/cdk/scroll.js.map +1 -0
- package/dist/cdk/selection-model.d.ts +50 -0
- package/dist/cdk/selection-model.d.ts.map +1 -0
- package/dist/cdk/selection-model.js +77 -0
- package/dist/cdk/selection-model.js.map +1 -0
- package/dist/cdk/virtual-scroll.d.ts +50 -0
- package/dist/cdk/virtual-scroll.d.ts.map +1 -0
- package/dist/cdk/virtual-scroll.js +92 -0
- package/dist/cdk/virtual-scroll.js.map +1 -0
- package/dist/checkbox/checkbox.d.ts +65 -0
- package/dist/checkbox/checkbox.d.ts.map +1 -0
- package/dist/checkbox/checkbox.js +82 -0
- package/dist/checkbox/checkbox.js.map +1 -0
- package/dist/chips/chips.d.ts +65 -0
- package/dist/chips/chips.d.ts.map +1 -0
- package/dist/chips/chips.js +119 -0
- package/dist/chips/chips.js.map +1 -0
- package/dist/context-menu/context-menu.d.ts +32 -0
- package/dist/context-menu/context-menu.d.ts.map +1 -0
- package/dist/context-menu/context-menu.js +63 -0
- package/dist/context-menu/context-menu.js.map +1 -0
- package/dist/datepicker/datepicker.d.ts +100 -0
- package/dist/datepicker/datepicker.d.ts.map +1 -0
- package/dist/datepicker/datepicker.js +440 -0
- package/dist/datepicker/datepicker.js.map +1 -0
- package/dist/dialog/dialog.d.ts +27 -0
- package/dist/dialog/dialog.d.ts.map +1 -0
- package/dist/dialog/dialog.js +47 -0
- package/dist/dialog/dialog.js.map +1 -0
- package/dist/dialog/modal-core.d.ts +42 -0
- package/dist/dialog/modal-core.d.ts.map +1 -0
- package/dist/dialog/modal-core.js +103 -0
- package/dist/dialog/modal-core.js.map +1 -0
- package/dist/expansion/expansion.d.ts +71 -0
- package/dist/expansion/expansion.d.ts.map +1 -0
- package/dist/expansion/expansion.js +127 -0
- package/dist/expansion/expansion.js.map +1 -0
- package/dist/form-field/form-field.d.ts +48 -0
- package/dist/form-field/form-field.d.ts.map +1 -0
- package/dist/form-field/form-field.js +89 -0
- package/dist/form-field/form-field.js.map +1 -0
- package/dist/grid-list/grid-list.d.ts +25 -0
- package/dist/grid-list/grid-list.d.ts.map +1 -0
- package/dist/grid-list/grid-list.js +22 -0
- package/dist/grid-list/grid-list.js.map +1 -0
- package/dist/icon/icon.d.ts +40 -0
- package/dist/icon/icon.d.ts.map +1 -0
- package/dist/icon/icon.js +99 -0
- package/dist/icon/icon.js.map +1 -0
- package/dist/icon/icons.d.ts +60 -0
- package/dist/icon/icons.d.ts.map +1 -0
- package/dist/icon/icons.js +126 -0
- package/dist/icon/icons.js.map +1 -0
- package/dist/icon/lucide-icons.d.ts +11 -0
- package/dist/icon/lucide-icons.d.ts.map +1 -0
- package/dist/icon/lucide-icons.js +65 -0
- package/dist/icon/lucide-icons.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/input/input.d.ts +90 -0
- package/dist/input/input.d.ts.map +1 -0
- package/dist/input/input.js +138 -0
- package/dist/input/input.js.map +1 -0
- package/dist/internal/compose.d.ts +26 -0
- package/dist/internal/compose.d.ts.map +1 -0
- package/dist/internal/compose.js +32 -0
- package/dist/internal/compose.js.map +1 -0
- package/dist/list/list.d.ts +70 -0
- package/dist/list/list.d.ts.map +1 -0
- package/dist/list/list.js +144 -0
- package/dist/list/list.js.map +1 -0
- package/dist/menu/menu-core.d.ts +56 -0
- package/dist/menu/menu-core.d.ts.map +1 -0
- package/dist/menu/menu-core.js +122 -0
- package/dist/menu/menu-core.js.map +1 -0
- package/dist/menu/menu.d.ts +31 -0
- package/dist/menu/menu.d.ts.map +1 -0
- package/dist/menu/menu.js +68 -0
- package/dist/menu/menu.js.map +1 -0
- package/dist/menubar/menubar.d.ts +49 -0
- package/dist/menubar/menubar.d.ts.map +1 -0
- package/dist/menubar/menubar.js +162 -0
- package/dist/menubar/menubar.js.map +1 -0
- package/dist/paginator/paginator.d.ts +89 -0
- package/dist/paginator/paginator.d.ts.map +1 -0
- package/dist/paginator/paginator.js +159 -0
- package/dist/paginator/paginator.js.map +1 -0
- package/dist/popover-edit/popover-edit.d.ts +33 -0
- package/dist/popover-edit/popover-edit.d.ts.map +1 -0
- package/dist/popover-edit/popover-edit.js +107 -0
- package/dist/popover-edit/popover-edit.js.map +1 -0
- package/dist/progress-bar/progress-bar.d.ts +32 -0
- package/dist/progress-bar/progress-bar.d.ts.map +1 -0
- package/dist/progress-bar/progress-bar.js +42 -0
- package/dist/progress-bar/progress-bar.js.map +1 -0
- package/dist/progress-spinner/progress-spinner.d.ts +25 -0
- package/dist/progress-spinner/progress-spinner.d.ts.map +1 -0
- package/dist/progress-spinner/progress-spinner.js +25 -0
- package/dist/progress-spinner/progress-spinner.js.map +1 -0
- package/dist/radio/radio.d.ts +68 -0
- package/dist/radio/radio.d.ts.map +1 -0
- package/dist/radio/radio.js +81 -0
- package/dist/radio/radio.js.map +1 -0
- package/dist/ripple/ripple.d.ts +20 -0
- package/dist/ripple/ripple.d.ts.map +1 -0
- package/dist/ripple/ripple.js +41 -0
- package/dist/ripple/ripple.js.map +1 -0
- package/dist/select/select.d.ts +83 -0
- package/dist/select/select.d.ts.map +1 -0
- package/dist/select/select.js +320 -0
- package/dist/select/select.js.map +1 -0
- package/dist/shared/options.d.ts +44 -0
- package/dist/shared/options.d.ts.map +1 -0
- package/dist/shared/options.js +59 -0
- package/dist/shared/options.js.map +1 -0
- package/dist/shared/positions.d.ts +20 -0
- package/dist/shared/positions.d.ts.map +1 -0
- package/dist/shared/positions.js +27 -0
- package/dist/shared/positions.js.map +1 -0
- package/dist/sidenav/sidenav.d.ts +65 -0
- package/dist/sidenav/sidenav.d.ts.map +1 -0
- package/dist/sidenav/sidenav.js +120 -0
- package/dist/sidenav/sidenav.js.map +1 -0
- package/dist/slide-toggle/slide-toggle.d.ts +56 -0
- package/dist/slide-toggle/slide-toggle.d.ts.map +1 -0
- package/dist/slide-toggle/slide-toggle.js +62 -0
- package/dist/slide-toggle/slide-toggle.js.map +1 -0
- package/dist/slider/slider.d.ts +69 -0
- package/dist/slider/slider.d.ts.map +1 -0
- package/dist/slider/slider.js +184 -0
- package/dist/slider/slider.js.map +1 -0
- package/dist/snackbar/snackbar.d.ts +25 -0
- package/dist/snackbar/snackbar.d.ts.map +1 -0
- package/dist/snackbar/snackbar.js +135 -0
- package/dist/snackbar/snackbar.js.map +1 -0
- package/dist/stepper/stepper.d.ts +87 -0
- package/dist/stepper/stepper.d.ts.map +1 -0
- package/dist/stepper/stepper.js +142 -0
- package/dist/stepper/stepper.js.map +1 -0
- package/dist/table/table.d.ts +140 -0
- package/dist/table/table.d.ts.map +1 -0
- package/dist/table/table.js +312 -0
- package/dist/table/table.js.map +1 -0
- package/dist/tabs/tabs.d.ts +64 -0
- package/dist/tabs/tabs.d.ts.map +1 -0
- package/dist/tabs/tabs.js +126 -0
- package/dist/tabs/tabs.js.map +1 -0
- package/dist/timepicker/timepicker.d.ts +83 -0
- package/dist/timepicker/timepicker.d.ts.map +1 -0
- package/dist/timepicker/timepicker.js +303 -0
- package/dist/timepicker/timepicker.js.map +1 -0
- package/dist/toolbar/toolbar.d.ts +34 -0
- package/dist/toolbar/toolbar.d.ts.map +1 -0
- package/dist/toolbar/toolbar.js +35 -0
- package/dist/toolbar/toolbar.js.map +1 -0
- package/dist/tooltip/tooltip.d.ts +30 -0
- package/dist/tooltip/tooltip.d.ts.map +1 -0
- package/dist/tooltip/tooltip.js +109 -0
- package/dist/tooltip/tooltip.js.map +1 -0
- package/dist/tree/tree.d.ts +100 -0
- package/dist/tree/tree.d.ts.map +1 -0
- package/dist/tree/tree.js +288 -0
- package/dist/tree/tree.js.map +1 -0
- package/package.json +230 -0
- package/src/styles/_api.scss +384 -0
- package/src/styles/_helpers.scss +101 -0
- package/src/styles/_index.scss +12 -0
- package/src/styles/_ref.scss +20 -0
- package/src/styles/_sass-utils.scss +14 -0
- package/src/styles/_token-utils.scss +24 -0
- package/src/styles/components/autocomplete/_index.scss +10 -0
- package/src/styles/components/autocomplete/_styles.scss +46 -0
- package/src/styles/components/autocomplete/_tokens.scss +28 -0
- package/src/styles/components/badge/_index.scss +12 -0
- package/src/styles/components/badge/_styles.scss +72 -0
- package/src/styles/components/badge/_tokens.scss +27 -0
- package/src/styles/components/bottom-sheet/_index.scss +9 -0
- package/src/styles/components/bottom-sheet/_styles.scss +77 -0
- package/src/styles/components/bottom-sheet/_tokens.scss +33 -0
- package/src/styles/components/button/_index.scss +12 -0
- package/src/styles/components/button/_styles.scss +106 -0
- package/src/styles/components/button/_tokens.scss +36 -0
- package/src/styles/components/button-toggle/_index.scss +12 -0
- package/src/styles/components/button-toggle/_styles.scss +57 -0
- package/src/styles/components/button-toggle/_tokens.scss +25 -0
- package/src/styles/components/card/_index.scss +15 -0
- package/src/styles/components/card/_styles.scss +68 -0
- package/src/styles/components/card/_tokens.scss +26 -0
- package/src/styles/components/checkbox/_index.scss +13 -0
- package/src/styles/components/checkbox/_styles.scss +108 -0
- package/src/styles/components/checkbox/_tokens.scss +25 -0
- package/src/styles/components/chips/_index.scss +12 -0
- package/src/styles/components/chips/_styles.scss +83 -0
- package/src/styles/components/chips/_tokens.scss +28 -0
- package/src/styles/components/datepicker/_index.scss +10 -0
- package/src/styles/components/datepicker/_styles.scss +203 -0
- package/src/styles/components/datepicker/_tokens.scss +50 -0
- package/src/styles/components/dialog/_index.scss +9 -0
- package/src/styles/components/dialog/_styles.scss +54 -0
- package/src/styles/components/dialog/_tokens.scss +29 -0
- package/src/styles/components/divider/_index.scss +8 -0
- package/src/styles/components/divider/_styles.scss +18 -0
- package/src/styles/components/divider/_tokens.scss +12 -0
- package/src/styles/components/expansion/_index.scss +14 -0
- package/src/styles/components/expansion/_styles.scss +128 -0
- package/src/styles/components/expansion/_tokens.scss +32 -0
- package/src/styles/components/form-field/_index.scss +13 -0
- package/src/styles/components/form-field/_styles.scss +39 -0
- package/src/styles/components/form-field/_tokens.scss +19 -0
- package/src/styles/components/grid-list/_index.scss +12 -0
- package/src/styles/components/grid-list/_styles.scss +31 -0
- package/src/styles/components/grid-list/_tokens.scss +18 -0
- package/src/styles/components/icon/_index.scss +8 -0
- package/src/styles/components/icon/_styles.scss +18 -0
- package/src/styles/components/icon/_tokens.scss +8 -0
- package/src/styles/components/input/_index.scss +13 -0
- package/src/styles/components/input/_styles.scss +111 -0
- package/src/styles/components/input/_tokens.scss +21 -0
- package/src/styles/components/list/_index.scss +12 -0
- package/src/styles/components/list/_styles.scss +87 -0
- package/src/styles/components/list/_tokens.scss +31 -0
- package/src/styles/components/menu/_index.scss +9 -0
- package/src/styles/components/menu/_styles.scss +60 -0
- package/src/styles/components/menu/_tokens.scss +33 -0
- package/src/styles/components/menubar/_index.scss +9 -0
- package/src/styles/components/menubar/_styles.scss +41 -0
- package/src/styles/components/menubar/_tokens.scss +25 -0
- package/src/styles/components/overlay/_index.scss +8 -0
- package/src/styles/components/overlay/_styles.scss +25 -0
- package/src/styles/components/overlay/_tokens.scss +21 -0
- package/src/styles/components/paginator/_index.scss +14 -0
- package/src/styles/components/paginator/_styles.scss +77 -0
- package/src/styles/components/paginator/_tokens.scss +28 -0
- package/src/styles/components/popover-edit/_index.scss +9 -0
- package/src/styles/components/popover-edit/_styles.scss +31 -0
- package/src/styles/components/popover-edit/_tokens.scss +21 -0
- package/src/styles/components/progress-bar/_index.scss +11 -0
- package/src/styles/components/progress-bar/_styles.scss +39 -0
- package/src/styles/components/progress-bar/_tokens.scss +17 -0
- package/src/styles/components/progress-spinner/_index.scss +11 -0
- package/src/styles/components/progress-spinner/_styles.scss +26 -0
- package/src/styles/components/progress-spinner/_tokens.scss +15 -0
- package/src/styles/components/radio/_index.scss +14 -0
- package/src/styles/components/radio/_styles.scss +92 -0
- package/src/styles/components/radio/_tokens.scss +24 -0
- package/src/styles/components/ripple/_index.scss +8 -0
- package/src/styles/components/ripple/_styles.scss +20 -0
- package/src/styles/components/ripple/_tokens.scss +12 -0
- package/src/styles/components/select/_index.scss +9 -0
- package/src/styles/components/select/_styles.scss +120 -0
- package/src/styles/components/select/_tokens.scss +35 -0
- package/src/styles/components/sidenav/_index.scss +14 -0
- package/src/styles/components/sidenav/_styles.scss +105 -0
- package/src/styles/components/sidenav/_tokens.scss +24 -0
- package/src/styles/components/slide-toggle/_index.scss +13 -0
- package/src/styles/components/slide-toggle/_styles.scss +86 -0
- package/src/styles/components/slide-toggle/_tokens.scss +24 -0
- package/src/styles/components/slider/_index.scss +13 -0
- package/src/styles/components/slider/_styles.scss +77 -0
- package/src/styles/components/slider/_tokens.scss +21 -0
- package/src/styles/components/snackbar/_index.scss +8 -0
- package/src/styles/components/snackbar/_styles.scss +59 -0
- package/src/styles/components/snackbar/_tokens.scss +28 -0
- package/src/styles/components/stepper/_index.scss +14 -0
- package/src/styles/components/stepper/_styles.scss +129 -0
- package/src/styles/components/stepper/_tokens.scss +44 -0
- package/src/styles/components/table/_index.scss +14 -0
- package/src/styles/components/table/_styles.scss +202 -0
- package/src/styles/components/table/_tokens.scss +47 -0
- package/src/styles/components/tabs/_index.scss +13 -0
- package/src/styles/components/tabs/_styles.scss +76 -0
- package/src/styles/components/tabs/_tokens.scss +28 -0
- package/src/styles/components/timepicker/_index.scss +9 -0
- package/src/styles/components/timepicker/_styles.scss +136 -0
- package/src/styles/components/timepicker/_tokens.scss +46 -0
- package/src/styles/components/toolbar/_index.scss +12 -0
- package/src/styles/components/toolbar/_styles.scss +41 -0
- package/src/styles/components/toolbar/_tokens.scss +17 -0
- package/src/styles/components/tooltip/_index.scss +8 -0
- package/src/styles/components/tooltip/_styles.scss +29 -0
- package/src/styles/components/tooltip/_tokens.scss +22 -0
- package/src/styles/components/tree/_index.scss +13 -0
- package/src/styles/components/tree/_styles.scss +99 -0
- package/src/styles/components/tree/_tokens.scss +38 -0
- package/src/styles/theme/_defaults.scss +50 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Connected positioning — the in-house "floating" engine (our @floating-ui / Material
|
|
3
|
+
* `FlexibleConnectedPositionStrategy`, zero-dep). Anchors an overlay panel to an origin
|
|
4
|
+
* element via a list of preferred connected positions, then:
|
|
5
|
+
* • picks the first preferred position that fully fits the viewport,
|
|
6
|
+
* • **flips** to a fallback when the preferred one overflows,
|
|
7
|
+
* • **shifts** (clamps) along the axes to keep the panel on-screen if none fit,
|
|
8
|
+
* • reports the position it actually applied (for arrow placement / transform-origin),
|
|
9
|
+
* • repositions on scroll/resize while attached.
|
|
10
|
+
*
|
|
11
|
+
* Pure geometry against `getBoundingClientRect` + the viewport. RTL-aware: `start`/`end`
|
|
12
|
+
* resolve through `activeDirection()`. Plugs into the overlay as a `PositionStrategy`.
|
|
13
|
+
*/
|
|
14
|
+
import { signal } from '@weave-framework/runtime';
|
|
15
|
+
import { activeDirection } from './bidi.js';
|
|
16
|
+
import { isBrowser } from './platform.js';
|
|
17
|
+
/** Map a preset to an explicit pairing, baking the `offset` onto the connection axis. */
|
|
18
|
+
function presetToPosition(name, offset) {
|
|
19
|
+
switch (name) {
|
|
20
|
+
case 'bottom': return { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: offset };
|
|
21
|
+
case 'bottom-start': return { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: offset };
|
|
22
|
+
case 'bottom-end': return { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: offset };
|
|
23
|
+
case 'top': return { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -offset };
|
|
24
|
+
case 'top-start': return { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -offset };
|
|
25
|
+
case 'top-end': return { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom', offsetY: -offset };
|
|
26
|
+
case 'right': return { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: offset };
|
|
27
|
+
case 'right-start': return { originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'top', offsetX: offset };
|
|
28
|
+
case 'right-end': return { originX: 'end', originY: 'bottom', overlayX: 'start', overlayY: 'bottom', offsetX: offset };
|
|
29
|
+
case 'left': return { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -offset };
|
|
30
|
+
case 'left-start': return { originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'top', offsetX: -offset };
|
|
31
|
+
case 'left-end': return { originX: 'start', originY: 'bottom', overlayX: 'end', overlayY: 'bottom', offsetX: -offset };
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function resolve(pos, offset) {
|
|
35
|
+
return typeof pos === 'string' ? presetToPosition(pos, offset) : pos;
|
|
36
|
+
}
|
|
37
|
+
/** X coordinate of an origin anchor (RTL resolves start↔end to right↔left). */
|
|
38
|
+
function originPointX(rect, x, rtl) {
|
|
39
|
+
if (x === 'center')
|
|
40
|
+
return rect.left + rect.width / 2;
|
|
41
|
+
const atStart = (x === 'start') !== rtl;
|
|
42
|
+
return atStart ? rect.left : rect.right;
|
|
43
|
+
}
|
|
44
|
+
function originPointY(rect, y) {
|
|
45
|
+
if (y === 'center')
|
|
46
|
+
return rect.top + rect.height / 2;
|
|
47
|
+
return y === 'top' ? rect.top : rect.bottom;
|
|
48
|
+
}
|
|
49
|
+
/** Fraction of the overlay width its anchor edge sits at (0 = left … 1 = right). */
|
|
50
|
+
function overlayFracX(x, rtl) {
|
|
51
|
+
if (x === 'center')
|
|
52
|
+
return 0.5;
|
|
53
|
+
const atStart = (x === 'start') !== rtl;
|
|
54
|
+
return atStart ? 0 : 1;
|
|
55
|
+
}
|
|
56
|
+
function overlayFracY(y) {
|
|
57
|
+
return y === 'top' ? 0 : y === 'center' ? 0.5 : 1;
|
|
58
|
+
}
|
|
59
|
+
function clamp(v, lo, hi) {
|
|
60
|
+
return Math.min(Math.max(v, lo), Math.max(lo, hi));
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Create a connected position strategy anchoring the overlay to `origin`. Pass it as
|
|
64
|
+
* `createOverlay({ positionStrategy })`, or call `apply(el)` directly on an attached
|
|
65
|
+
* element.
|
|
66
|
+
*/
|
|
67
|
+
export function connectedPosition(origin, options = {}) {
|
|
68
|
+
const offset = options.offset ?? 0;
|
|
69
|
+
const margin = options.viewportMargin ?? 8;
|
|
70
|
+
const autoUpdate = options.autoUpdate !== false;
|
|
71
|
+
const positions = (options.positions ?? ['bottom-start', 'top-start']).map((p) => resolve(p, offset));
|
|
72
|
+
const _applied = signal(null);
|
|
73
|
+
let currentEl = null;
|
|
74
|
+
let listening = false;
|
|
75
|
+
function place(el, pos, rtl, vw, vh) {
|
|
76
|
+
const rect = origin.getBoundingClientRect();
|
|
77
|
+
const w = el.offsetWidth;
|
|
78
|
+
const h = el.offsetHeight;
|
|
79
|
+
const left = originPointX(rect, pos.originX, rtl) - overlayFracX(pos.overlayX, rtl) * w + (pos.offsetX ?? 0);
|
|
80
|
+
const top = originPointY(rect, pos.originY) - overlayFracY(pos.overlayY) * h + (pos.offsetY ?? 0);
|
|
81
|
+
const overflow = Math.max(0, margin - left) +
|
|
82
|
+
Math.max(0, left + w - (vw - margin)) +
|
|
83
|
+
Math.max(0, margin - top) +
|
|
84
|
+
Math.max(0, top + h - (vh - margin));
|
|
85
|
+
return { left, top, overflow, pos };
|
|
86
|
+
}
|
|
87
|
+
function apply(el) {
|
|
88
|
+
currentEl = el;
|
|
89
|
+
const rtl = activeDirection() === 'rtl';
|
|
90
|
+
const vw = isBrowser ? window.innerWidth : 0;
|
|
91
|
+
const vh = isBrowser ? window.innerHeight : 0;
|
|
92
|
+
// First fully-fitting position wins; else the least-overflowing one, then shift.
|
|
93
|
+
let best = null;
|
|
94
|
+
for (const pos of positions) {
|
|
95
|
+
const p = place(el, pos, rtl, vw, vh);
|
|
96
|
+
if (p.overflow === 0) {
|
|
97
|
+
best = p;
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
if (!best || p.overflow < best.overflow)
|
|
101
|
+
best = p;
|
|
102
|
+
}
|
|
103
|
+
if (!best)
|
|
104
|
+
return;
|
|
105
|
+
const w = el.offsetWidth;
|
|
106
|
+
const h = el.offsetHeight;
|
|
107
|
+
const left = clamp(best.left, margin, vw - margin - w);
|
|
108
|
+
const top = clamp(best.top, margin, vh - margin - h);
|
|
109
|
+
el.style.position = 'absolute';
|
|
110
|
+
el.style.left = `${Math.round(left)}px`;
|
|
111
|
+
el.style.top = `${Math.round(top)}px`;
|
|
112
|
+
el.style.right = '';
|
|
113
|
+
el.style.bottom = '';
|
|
114
|
+
el.style.transform = '';
|
|
115
|
+
_applied.set(best.pos);
|
|
116
|
+
if (autoUpdate && isBrowser && !listening) {
|
|
117
|
+
listening = true;
|
|
118
|
+
window.addEventListener('scroll', reposition, { passive: true, capture: true });
|
|
119
|
+
window.addEventListener('resize', reposition, { passive: true });
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
function reposition() {
|
|
123
|
+
if (currentEl && currentEl.isConnected)
|
|
124
|
+
apply(currentEl);
|
|
125
|
+
}
|
|
126
|
+
function dispose() {
|
|
127
|
+
if (listening && isBrowser) {
|
|
128
|
+
window.removeEventListener('scroll', reposition, { capture: true });
|
|
129
|
+
window.removeEventListener('resize', reposition);
|
|
130
|
+
listening = false;
|
|
131
|
+
}
|
|
132
|
+
currentEl = null;
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
apply,
|
|
136
|
+
dispose,
|
|
137
|
+
appliedPosition: () => _applied(),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=positioning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"positioning.js","sourceRoot":"","sources":["../../src/cdk/positioning.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scroll strategies — how an open overlay reacts when the page (or a scrollable
|
|
3
|
+
* ancestor) scrolls. Four behaviors, plus a shared scroll dispatcher so every
|
|
4
|
+
* overlay listens through **one** capture-phase window listener rather than N.
|
|
5
|
+
*
|
|
6
|
+
* • `repositionScroll` — recompute the panel's position (anchored dropdowns).
|
|
7
|
+
* • `closeScroll` — detach the overlay (menus / tooltips).
|
|
8
|
+
* • `blockScroll` — lock body scroll while open (dialogs), no layout jump.
|
|
9
|
+
* • `noopScroll` — do nothing.
|
|
10
|
+
*
|
|
11
|
+
* Each is a factory `(ref) => ScrollStrategy`, so it drops straight into
|
|
12
|
+
* `createOverlay({ scrollStrategy })`. Zero-dep, signal-friendly. (Note: a
|
|
13
|
+
* `connectedPosition` with `autoUpdate` already repositions on scroll — use that OR
|
|
14
|
+
* `repositionScroll`, not both.)
|
|
15
|
+
*/
|
|
16
|
+
import type { OverlayRef } from './overlay.js';
|
|
17
|
+
/** Enable/disable hook an overlay calls on attach/detach. */
|
|
18
|
+
export interface ScrollStrategy {
|
|
19
|
+
enable(): void;
|
|
20
|
+
disable(): void;
|
|
21
|
+
}
|
|
22
|
+
/** A factory the overlay invokes with its own ref. */
|
|
23
|
+
export type ScrollStrategyFactory = (ref: OverlayRef) => ScrollStrategy;
|
|
24
|
+
type Handler = () => void;
|
|
25
|
+
/**
|
|
26
|
+
* Subscribe to scrolls anywhere in the document (capture phase catches scrollable
|
|
27
|
+
* ancestors, not just `window`). Returns an unsubscribe. One shared listener backs
|
|
28
|
+
* all subscribers.
|
|
29
|
+
*/
|
|
30
|
+
export declare function onScroll(handler: Handler): () => void;
|
|
31
|
+
/** Do nothing on scroll. */
|
|
32
|
+
export declare function noopScroll(_ref?: OverlayRef): ScrollStrategy;
|
|
33
|
+
/** Recompute the overlay's position on every scroll. */
|
|
34
|
+
export declare function repositionScroll(ref: OverlayRef): ScrollStrategy;
|
|
35
|
+
/** Detach the overlay on the first scroll (typical for menus / tooltips). */
|
|
36
|
+
export declare function closeScroll(ref: OverlayRef): ScrollStrategy;
|
|
37
|
+
/**
|
|
38
|
+
* Lock `<body>` scroll while the overlay is open, compensating for the scrollbar
|
|
39
|
+
* width so the page doesn't shift. Restores the exact prior inline styles on disable.
|
|
40
|
+
*/
|
|
41
|
+
export declare function blockScroll(_ref?: OverlayRef): ScrollStrategy;
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=scroll.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scroll.d.ts","sourceRoot":"","sources":["../../src/cdk/scroll.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,6DAA6D;AAC7D,MAAM,WAAW,cAAc;IAC7B,MAAM,IAAI,IAAI,CAAC;IACf,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,sDAAsD;AACtD,MAAM,MAAM,qBAAqB,GAAG,CAAC,GAAG,EAAE,UAAU,KAAK,cAAc,CAAC;AAIxE,KAAK,OAAO,GAAG,MAAM,IAAI,CAAC;AAQ1B;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,IAAI,CASrD;AAID,4BAA4B;AAC5B,wBAAgB,UAAU,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,cAAc,CAE5D;AAED,wDAAwD;AACxD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,UAAU,GAAG,cAAc,CAWhE;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,GAAG,EAAE,UAAU,GAAG,cAAc,CAW3D;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,cAAc,CAoB7D"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scroll strategies — how an open overlay reacts when the page (or a scrollable
|
|
3
|
+
* ancestor) scrolls. Four behaviors, plus a shared scroll dispatcher so every
|
|
4
|
+
* overlay listens through **one** capture-phase window listener rather than N.
|
|
5
|
+
*
|
|
6
|
+
* • `repositionScroll` — recompute the panel's position (anchored dropdowns).
|
|
7
|
+
* • `closeScroll` — detach the overlay (menus / tooltips).
|
|
8
|
+
* • `blockScroll` — lock body scroll while open (dialogs), no layout jump.
|
|
9
|
+
* • `noopScroll` — do nothing.
|
|
10
|
+
*
|
|
11
|
+
* Each is a factory `(ref) => ScrollStrategy`, so it drops straight into
|
|
12
|
+
* `createOverlay({ scrollStrategy })`. Zero-dep, signal-friendly. (Note: a
|
|
13
|
+
* `connectedPosition` with `autoUpdate` already repositions on scroll — use that OR
|
|
14
|
+
* `repositionScroll`, not both.)
|
|
15
|
+
*/
|
|
16
|
+
import { isBrowser } from './platform.js';
|
|
17
|
+
const handlers = new Set();
|
|
18
|
+
let installed = false;
|
|
19
|
+
function fanout() {
|
|
20
|
+
for (const h of [...handlers])
|
|
21
|
+
h();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Subscribe to scrolls anywhere in the document (capture phase catches scrollable
|
|
25
|
+
* ancestors, not just `window`). Returns an unsubscribe. One shared listener backs
|
|
26
|
+
* all subscribers.
|
|
27
|
+
*/
|
|
28
|
+
export function onScroll(handler) {
|
|
29
|
+
if (!installed && isBrowser) {
|
|
30
|
+
window.addEventListener('scroll', fanout, { capture: true, passive: true });
|
|
31
|
+
installed = true;
|
|
32
|
+
}
|
|
33
|
+
handlers.add(handler);
|
|
34
|
+
return () => {
|
|
35
|
+
handlers.delete(handler);
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/* ─────────────────────── strategies ─────────────────────── */
|
|
39
|
+
/** Do nothing on scroll. */
|
|
40
|
+
export function noopScroll(_ref) {
|
|
41
|
+
return { enable: () => { }, disable: () => { } };
|
|
42
|
+
}
|
|
43
|
+
/** Recompute the overlay's position on every scroll. */
|
|
44
|
+
export function repositionScroll(ref) {
|
|
45
|
+
let off = null;
|
|
46
|
+
return {
|
|
47
|
+
enable: () => {
|
|
48
|
+
off ??= onScroll(() => ref.updatePosition());
|
|
49
|
+
},
|
|
50
|
+
disable: () => {
|
|
51
|
+
off?.();
|
|
52
|
+
off = null;
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/** Detach the overlay on the first scroll (typical for menus / tooltips). */
|
|
57
|
+
export function closeScroll(ref) {
|
|
58
|
+
let off = null;
|
|
59
|
+
return {
|
|
60
|
+
enable: () => {
|
|
61
|
+
off ??= onScroll(() => ref.detach());
|
|
62
|
+
},
|
|
63
|
+
disable: () => {
|
|
64
|
+
off?.();
|
|
65
|
+
off = null;
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Lock `<body>` scroll while the overlay is open, compensating for the scrollbar
|
|
71
|
+
* width so the page doesn't shift. Restores the exact prior inline styles on disable.
|
|
72
|
+
*/
|
|
73
|
+
export function blockScroll(_ref) {
|
|
74
|
+
let prev = null;
|
|
75
|
+
return {
|
|
76
|
+
enable: () => {
|
|
77
|
+
if (!isBrowser || prev)
|
|
78
|
+
return;
|
|
79
|
+
const scrollbar = window.innerWidth - document.documentElement.clientWidth;
|
|
80
|
+
prev = {
|
|
81
|
+
overflow: document.body.style.overflow,
|
|
82
|
+
paddingRight: document.body.style.paddingRight,
|
|
83
|
+
};
|
|
84
|
+
document.body.style.overflow = 'hidden';
|
|
85
|
+
if (scrollbar > 0)
|
|
86
|
+
document.body.style.paddingRight = `${scrollbar}px`;
|
|
87
|
+
},
|
|
88
|
+
disable: () => {
|
|
89
|
+
if (!prev)
|
|
90
|
+
return;
|
|
91
|
+
document.body.style.overflow = prev.overflow;
|
|
92
|
+
document.body.style.paddingRight = prev.paddingRight;
|
|
93
|
+
prev = null;
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=scroll.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scroll.js","sourceRoot":"","sources":["../../src/cdk/scroll.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAe1C,MAAM,QAAQ,GAAiB,IAAI,GAAG,EAAW,CAAC;AAClD,IAAI,SAAS,GAAY,KAAK,CAAC;AAE/B,SAAS,MAAM;IACb,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;QAAE,CAAC,EAAE,CAAC;AACrC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,OAAgB;IACvC,IAAI,CAAC,SAAS,IAAI,SAAS,EAAE,CAAC;QAC5B,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5E,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC;IACD,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACtB,OAAO,GAAG,EAAE;QACV,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC,CAAC;AACJ,CAAC;AAED,gEAAgE;AAEhE,4BAA4B;AAC5B,MAAM,UAAU,UAAU,CAAC,IAAiB;IAC1C,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC;AACjD,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,gBAAgB,CAAC,GAAe;IAC9C,IAAI,GAAG,GAAwB,IAAI,CAAC;IACpC,OAAO;QACL,MAAM,EAAE,GAAG,EAAE;YACX,GAAG,KAAK,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,EAAE,GAAG,EAAE;YACZ,GAAG,EAAE,EAAE,CAAC;YACR,GAAG,GAAG,IAAI,CAAC;QACb,CAAC;KACF,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,WAAW,CAAC,GAAe;IACzC,IAAI,GAAG,GAAwB,IAAI,CAAC;IACpC,OAAO;QACL,MAAM,EAAE,GAAG,EAAE;YACX,GAAG,KAAK,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,EAAE,GAAG,EAAE;YACZ,GAAG,EAAE,EAAE,CAAC;YACR,GAAG,GAAG,IAAI,CAAC;QACb,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAiB;IAC3C,IAAI,IAAI,GAAsD,IAAI,CAAC;IACnE,OAAO;QACL,MAAM,EAAE,GAAG,EAAE;YACX,IAAI,CAAC,SAAS,IAAI,IAAI;gBAAE,OAAO;YAC/B,MAAM,SAAS,GAAW,MAAM,CAAC,UAAU,GAAG,QAAQ,CAAC,eAAe,CAAC,WAAW,CAAC;YACnF,IAAI,GAAG;gBACL,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ;gBACtC,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY;aAC/C,CAAC;YACF,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;YACxC,IAAI,SAAS,GAAG,CAAC;gBAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,GAAG,SAAS,IAAI,CAAC;QACzE,CAAC;QACD,OAAO,EAAE,GAAG,EAAE;YACZ,IAAI,CAAC,IAAI;gBAAE,OAAO;YAClB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC7C,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;YACrD,IAAI,GAAG,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SelectionModel — the signal-native selection engine under Table rows, Tree nodes and
|
|
3
|
+
* List/Select multi-select. Tracks a set of selected values (insertion-ordered) with
|
|
4
|
+
* `select`/`deselect`/`toggle`/`clear`, `single` vs `multiple` modes, an optional identity
|
|
5
|
+
* comparator (so object copies match by key), and a `changed` callback carrying the
|
|
6
|
+
* added/removed delta. Headless: no DOM, no ARIA — a component maps `selected()` /
|
|
7
|
+
* `isSelected()` onto `aria-selected`/checkboxes itself. Zero-dep.
|
|
8
|
+
*/
|
|
9
|
+
/** The delta emitted after a selection change. */
|
|
10
|
+
export interface SelectionChange<T> {
|
|
11
|
+
/** Values added to the selection by this change. */
|
|
12
|
+
added: T[];
|
|
13
|
+
/** Values removed from the selection by this change. */
|
|
14
|
+
removed: T[];
|
|
15
|
+
}
|
|
16
|
+
export interface SelectionModelOptions<T> {
|
|
17
|
+
/** Allow more than one selected value. Default false (single-select). */
|
|
18
|
+
multiple?: boolean;
|
|
19
|
+
/** Values selected up-front (deduped, and truncated to one in single mode). */
|
|
20
|
+
initial?: T[];
|
|
21
|
+
/** Identity comparator (default `===`) — lets distinct object copies match by key. */
|
|
22
|
+
compareWith?: (a: T, b: T) => boolean;
|
|
23
|
+
/** Called after every actual change with the added/removed delta. */
|
|
24
|
+
onChange?: (change: SelectionChange<T>) => void;
|
|
25
|
+
}
|
|
26
|
+
export interface SelectionModel<T> {
|
|
27
|
+
/** The selected values, insertion-ordered. Reactive (stable ref until it changes). */
|
|
28
|
+
selected(): T[];
|
|
29
|
+
/** Whether nothing is selected. Reactive. */
|
|
30
|
+
isEmpty(): boolean;
|
|
31
|
+
/** How many values are selected. Reactive. */
|
|
32
|
+
count(): number;
|
|
33
|
+
/** Whether `value` is currently selected. Reactive. */
|
|
34
|
+
isSelected(value: T): boolean;
|
|
35
|
+
/** Add value(s) to the selection (single mode keeps only the last given). */
|
|
36
|
+
select(...values: T[]): void;
|
|
37
|
+
/** Remove value(s) from the selection. */
|
|
38
|
+
deselect(...values: T[]): void;
|
|
39
|
+
/** Flip a single value's selected state. */
|
|
40
|
+
toggle(value: T): void;
|
|
41
|
+
/** Replace the whole selection with exactly these value(s). */
|
|
42
|
+
setSelection(...values: T[]): void;
|
|
43
|
+
/** Clear the selection. */
|
|
44
|
+
clear(): void;
|
|
45
|
+
/** True when this model allows multiple selected values. */
|
|
46
|
+
readonly multiple: boolean;
|
|
47
|
+
}
|
|
48
|
+
/** Create a selection model. */
|
|
49
|
+
export declare function selectionModel<T>(options?: SelectionModelOptions<T>): SelectionModel<T>;
|
|
50
|
+
//# sourceMappingURL=selection-model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection-model.d.ts","sourceRoot":"","sources":["../../src/cdk/selection-model.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,kDAAkD;AAClD,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,oDAAoD;IACpD,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,wDAAwD;IACxD,OAAO,EAAE,CAAC,EAAE,CAAC;CACd;AAED,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACtC,yEAAyE;IACzE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+EAA+E;IAC/E,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;IACd,sFAAsF;IACtF,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC;IACtC,qEAAqE;IACrE,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;CACjD;AAED,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,sFAAsF;IACtF,QAAQ,IAAI,CAAC,EAAE,CAAC;IAChB,6CAA6C;IAC7C,OAAO,IAAI,OAAO,CAAC;IACnB,8CAA8C;IAC9C,KAAK,IAAI,MAAM,CAAC;IAChB,uDAAuD;IACvD,UAAU,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC;IAC9B,6EAA6E;IAC7E,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC;IAC7B,0CAA0C;IAC1C,QAAQ,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC;IAC/B,4CAA4C;IAC5C,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IACvB,+DAA+D;IAC/D,YAAY,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC;IACnC,2BAA2B;IAC3B,KAAK,IAAI,IAAI,CAAC;IACd,4DAA4D;IAC5D,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED,gCAAgC;AAChC,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,GAAE,qBAAqB,CAAC,CAAC,CAAM,GAAG,cAAc,CAAC,CAAC,CAAC,CAiE3F"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SelectionModel — the signal-native selection engine under Table rows, Tree nodes and
|
|
3
|
+
* List/Select multi-select. Tracks a set of selected values (insertion-ordered) with
|
|
4
|
+
* `select`/`deselect`/`toggle`/`clear`, `single` vs `multiple` modes, an optional identity
|
|
5
|
+
* comparator (so object copies match by key), and a `changed` callback carrying the
|
|
6
|
+
* added/removed delta. Headless: no DOM, no ARIA — a component maps `selected()` /
|
|
7
|
+
* `isSelected()` onto `aria-selected`/checkboxes itself. Zero-dep.
|
|
8
|
+
*/
|
|
9
|
+
import { signal } from '@weave-framework/runtime';
|
|
10
|
+
/** Create a selection model. */
|
|
11
|
+
export function selectionModel(options = {}) {
|
|
12
|
+
const multiple = options.multiple ?? false;
|
|
13
|
+
const compareWith = options.compareWith ?? ((a, b) => a === b);
|
|
14
|
+
const onChange = options.onChange;
|
|
15
|
+
const has = (arr, v) => arr.some((x) => compareWith(x, v));
|
|
16
|
+
/** Dedupe with the comparator, preserving first-seen order. */
|
|
17
|
+
const dedupe = (arr) => {
|
|
18
|
+
const out = [];
|
|
19
|
+
for (const v of arr)
|
|
20
|
+
if (!has(out, v))
|
|
21
|
+
out.push(v);
|
|
22
|
+
return out;
|
|
23
|
+
};
|
|
24
|
+
const seedAll = dedupe(options.initial ?? []);
|
|
25
|
+
const seed = multiple ? seedAll : seedAll.slice(-1);
|
|
26
|
+
const _selected = signal(seed);
|
|
27
|
+
/** Commit `next` if it differs from the current set, emitting the delta. */
|
|
28
|
+
const commit = (next) => {
|
|
29
|
+
const cur = _selected();
|
|
30
|
+
const added = next.filter((v) => !has(cur, v));
|
|
31
|
+
const removed = cur.filter((v) => !has(next, v));
|
|
32
|
+
if (added.length === 0 && removed.length === 0)
|
|
33
|
+
return;
|
|
34
|
+
_selected.set(next);
|
|
35
|
+
onChange?.({ added, removed });
|
|
36
|
+
};
|
|
37
|
+
return {
|
|
38
|
+
multiple,
|
|
39
|
+
selected: () => _selected(),
|
|
40
|
+
isEmpty: () => _selected().length === 0,
|
|
41
|
+
count: () => _selected().length,
|
|
42
|
+
isSelected: (value) => has(_selected(), value),
|
|
43
|
+
select: (...values) => {
|
|
44
|
+
const add = dedupe(values);
|
|
45
|
+
if (add.length === 0)
|
|
46
|
+
return;
|
|
47
|
+
if (multiple) {
|
|
48
|
+
const cur = _selected();
|
|
49
|
+
commit([...cur, ...add.filter((v) => !has(cur, v))]);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
commit([add[add.length - 1]]);
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
deselect: (...values) => {
|
|
56
|
+
if (values.length === 0)
|
|
57
|
+
return;
|
|
58
|
+
const cur = _selected();
|
|
59
|
+
commit(cur.filter((x) => !has(values, x)));
|
|
60
|
+
},
|
|
61
|
+
toggle: (value) => {
|
|
62
|
+
const cur = _selected();
|
|
63
|
+
if (has(cur, value))
|
|
64
|
+
commit(cur.filter((x) => !compareWith(x, value)));
|
|
65
|
+
else if (multiple)
|
|
66
|
+
commit([...cur, value]);
|
|
67
|
+
else
|
|
68
|
+
commit([value]);
|
|
69
|
+
},
|
|
70
|
+
setSelection: (...values) => {
|
|
71
|
+
const next = dedupe(values);
|
|
72
|
+
commit(multiple ? next : next.slice(-1));
|
|
73
|
+
},
|
|
74
|
+
clear: () => commit([]),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=selection-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection-model.js","sourceRoot":"","sources":["../../src/cdk/selection-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Virtual Scroll — the headless rendered-window engine under large Table/Tree bodies and
|
|
3
|
+
* long lists. Given a scroll viewport + a fixed row height + a total count, it computes the
|
|
4
|
+
* slice of items to actually render (a buffered window around the visible range) plus the
|
|
5
|
+
* top/bottom spacer sizes that keep the scrollbar honest — all as signals. The consumer
|
|
6
|
+
* renders only `items.slice(renderedRange().start, renderedRange().end)`, pads the top with
|
|
7
|
+
* `scrollOffset()` px and the bottom with `endOffset()` px, and the native scrollbar behaves
|
|
8
|
+
* as if the whole list were present.
|
|
9
|
+
*
|
|
10
|
+
* Fixed-size strategy first (`itemSize`); an autosize/variable-height strategy is a follow-on.
|
|
11
|
+
* Built on the U1 `onScroll` dispatcher + `resizeSignal` (viewport height). Zero styling, zero-dep.
|
|
12
|
+
*
|
|
13
|
+
* const vs = virtualScroll({ itemSize: 32, total: () => rows().length, viewport: () => elRef() });
|
|
14
|
+
* effect(() => { const { start, end } = vs.renderedRange(); render(rows().slice(start, end)); });
|
|
15
|
+
* // spacer top = vs.scrollOffset(), spacer bottom = vs.endOffset(), scroller height = vs.totalSize()
|
|
16
|
+
*/
|
|
17
|
+
/** The rendered item index range, `[start, end)` (end exclusive). */
|
|
18
|
+
export interface RenderedRange {
|
|
19
|
+
start: number;
|
|
20
|
+
end: number;
|
|
21
|
+
}
|
|
22
|
+
export interface VirtualScrollOptions {
|
|
23
|
+
/** Fixed row height in px (the fixed-size strategy). */
|
|
24
|
+
itemSize: number;
|
|
25
|
+
/** Total number of items — a number, or a getter for a reactive count. */
|
|
26
|
+
total: number | (() => number);
|
|
27
|
+
/** The scroll viewport element, or a getter (so a ref set after render is picked up). */
|
|
28
|
+
viewport: HTMLElement | (() => HTMLElement | null);
|
|
29
|
+
/** Rows rendered above + below the visible window (overscan). Default 4. */
|
|
30
|
+
buffer?: number;
|
|
31
|
+
}
|
|
32
|
+
export interface VirtualScroller {
|
|
33
|
+
/** The item index range to render, `[start, end)`. Reactive; only changes when the window does. */
|
|
34
|
+
renderedRange(): RenderedRange;
|
|
35
|
+
/** Top spacer height in px — the offset of the first rendered item. Reactive. */
|
|
36
|
+
scrollOffset(): number;
|
|
37
|
+
/** Bottom spacer height in px — space below the last rendered item. Reactive. */
|
|
38
|
+
endOffset(): number;
|
|
39
|
+
/** Total scrollable height in px (`itemSize * total`). Reactive. */
|
|
40
|
+
totalSize(): number;
|
|
41
|
+
/** Scroll the viewport so `index` sits at the top (clamped to range). */
|
|
42
|
+
scrollToIndex(index: number): void;
|
|
43
|
+
/** Force a resync of scroll position + viewport height (after a manual layout change). */
|
|
44
|
+
measure(): void;
|
|
45
|
+
/** Tear down listeners (also runs automatically on owner disposal). */
|
|
46
|
+
destroy(): void;
|
|
47
|
+
}
|
|
48
|
+
/** Create a virtual-scroll engine over a fixed-height list. */
|
|
49
|
+
export declare function virtualScroll(options: VirtualScrollOptions): VirtualScroller;
|
|
50
|
+
//# sourceMappingURL=virtual-scroll.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"virtual-scroll.d.ts","sourceRoot":"","sources":["../../src/cdk/virtual-scroll.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,qEAAqE;AACrE,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,oBAAoB;IACnC,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,KAAK,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;IAC/B,yFAAyF;IACzF,QAAQ,EAAE,WAAW,GAAG,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC;IACnD,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,mGAAmG;IACnG,aAAa,IAAI,aAAa,CAAC;IAC/B,iFAAiF;IACjF,YAAY,IAAI,MAAM,CAAC;IACvB,iFAAiF;IACjF,SAAS,IAAI,MAAM,CAAC;IACpB,oEAAoE;IACpE,SAAS,IAAI,MAAM,CAAC;IACpB,yEAAyE;IACzE,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,0FAA0F;IAC1F,OAAO,IAAI,IAAI,CAAC;IAChB,uEAAuE;IACvE,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,+DAA+D;AAC/D,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,eAAe,CA+E5E"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Virtual Scroll — the headless rendered-window engine under large Table/Tree bodies and
|
|
3
|
+
* long lists. Given a scroll viewport + a fixed row height + a total count, it computes the
|
|
4
|
+
* slice of items to actually render (a buffered window around the visible range) plus the
|
|
5
|
+
* top/bottom spacer sizes that keep the scrollbar honest — all as signals. The consumer
|
|
6
|
+
* renders only `items.slice(renderedRange().start, renderedRange().end)`, pads the top with
|
|
7
|
+
* `scrollOffset()` px and the bottom with `endOffset()` px, and the native scrollbar behaves
|
|
8
|
+
* as if the whole list were present.
|
|
9
|
+
*
|
|
10
|
+
* Fixed-size strategy first (`itemSize`); an autosize/variable-height strategy is a follow-on.
|
|
11
|
+
* Built on the U1 `onScroll` dispatcher + `resizeSignal` (viewport height). Zero styling, zero-dep.
|
|
12
|
+
*
|
|
13
|
+
* const vs = virtualScroll({ itemSize: 32, total: () => rows().length, viewport: () => elRef() });
|
|
14
|
+
* effect(() => { const { start, end } = vs.renderedRange(); render(rows().slice(start, end)); });
|
|
15
|
+
* // spacer top = vs.scrollOffset(), spacer bottom = vs.endOffset(), scroller height = vs.totalSize()
|
|
16
|
+
*/
|
|
17
|
+
import { signal, computed, effect, onDispose } from '@weave-framework/runtime';
|
|
18
|
+
import { onScroll } from './scroll.js';
|
|
19
|
+
import { resizeSignal } from './observers.js';
|
|
20
|
+
/** Create a virtual-scroll engine over a fixed-height list. */
|
|
21
|
+
export function virtualScroll(options) {
|
|
22
|
+
const itemSize = options.itemSize;
|
|
23
|
+
const buffer = options.buffer ?? 4;
|
|
24
|
+
const totalFn = typeof options.total === 'function' ? options.total : () => options.total;
|
|
25
|
+
const getViewport = typeof options.viewport === 'function' ? options.viewport : () => options.viewport;
|
|
26
|
+
const scrollTop = signal(0);
|
|
27
|
+
// Bumped when the viewport attaches, so `viewportHeight` re-pulls the (lazy) resize signal
|
|
28
|
+
// into the reactive graph.
|
|
29
|
+
const ready = signal(0);
|
|
30
|
+
let el = null;
|
|
31
|
+
let size = null;
|
|
32
|
+
let unsub = null;
|
|
33
|
+
const attach = (v) => {
|
|
34
|
+
el = v;
|
|
35
|
+
scrollTop.set(v.scrollTop);
|
|
36
|
+
size = resizeSignal(v); // seeds from getBoundingClientRect, then ResizeObserver-driven
|
|
37
|
+
unsub = onScroll(() => {
|
|
38
|
+
if (el)
|
|
39
|
+
scrollTop.set(el.scrollTop);
|
|
40
|
+
});
|
|
41
|
+
ready.set(ready.peek() + 1);
|
|
42
|
+
};
|
|
43
|
+
// Attach once, as soon as the viewport element is available (a ref may set it post-render).
|
|
44
|
+
effect(() => {
|
|
45
|
+
const v = getViewport();
|
|
46
|
+
if (v && !el)
|
|
47
|
+
attach(v);
|
|
48
|
+
});
|
|
49
|
+
const viewportHeight = () => {
|
|
50
|
+
ready();
|
|
51
|
+
return size ? size().height : 0;
|
|
52
|
+
};
|
|
53
|
+
const renderedRange = computed(() => {
|
|
54
|
+
const n = Math.max(0, totalFn());
|
|
55
|
+
if (n === 0)
|
|
56
|
+
return { start: 0, end: 0 };
|
|
57
|
+
const first = Math.max(0, Math.floor(scrollTop() / itemSize));
|
|
58
|
+
const visible = Math.max(1, Math.ceil(viewportHeight() / itemSize));
|
|
59
|
+
const start = Math.max(0, first - buffer);
|
|
60
|
+
const end = Math.min(n, first + visible + buffer);
|
|
61
|
+
return { start, end };
|
|
62
|
+
}, { equals: (a, b) => !!a && !!b && a.start === b.start && a.end === b.end });
|
|
63
|
+
const totalSize = () => Math.max(0, totalFn()) * itemSize;
|
|
64
|
+
const scrollOffset = () => renderedRange().start * itemSize;
|
|
65
|
+
const endOffset = () => totalSize() - renderedRange().end * itemSize;
|
|
66
|
+
const destroy = () => {
|
|
67
|
+
unsub?.();
|
|
68
|
+
unsub = null;
|
|
69
|
+
};
|
|
70
|
+
onDispose(destroy);
|
|
71
|
+
return {
|
|
72
|
+
renderedRange: () => renderedRange(),
|
|
73
|
+
scrollOffset,
|
|
74
|
+
endOffset,
|
|
75
|
+
totalSize,
|
|
76
|
+
scrollToIndex: (index) => {
|
|
77
|
+
const n = Math.max(0, totalFn());
|
|
78
|
+
const clamped = Math.max(0, Math.min(index, n - 1));
|
|
79
|
+
if (el) {
|
|
80
|
+
el.scrollTop = clamped * itemSize;
|
|
81
|
+
scrollTop.set(el.scrollTop);
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
measure: () => {
|
|
85
|
+
if (el)
|
|
86
|
+
scrollTop.set(el.scrollTop);
|
|
87
|
+
ready.set(ready.peek() + 1);
|
|
88
|
+
},
|
|
89
|
+
destroy,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=virtual-scroll.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"virtual-scroll.js","sourceRoot":"","sources":["../../src/cdk/virtual-scroll.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAA8B,MAAM,0BAA0B,CAAC;AAC3G,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,YAAY,EAAa,MAAM,gBAAgB,CAAC;AAoCzD,+DAA+D;AAC/D,MAAM,UAAU,aAAa,CAAC,OAA6B;IACzD,MAAM,QAAQ,GAAW,OAAO,CAAC,QAAQ,CAAC;IAC1C,MAAM,MAAM,GAAW,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAiB,OAAO,OAAO,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAW,EAAE,CAAC,OAAO,CAAC,KAAe,CAAC;IAC1H,MAAM,WAAW,GACf,OAAO,OAAO,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAgB,EAAE,CAAC,OAAO,CAAC,QAAuB,CAAC;IAEjH,MAAM,SAAS,GAAmB,MAAM,CAAS,CAAC,CAAC,CAAC;IACpD,2FAA2F;IAC3F,2BAA2B;IAC3B,MAAM,KAAK,GAAmB,MAAM,CAAS,CAAC,CAAC,CAAC;IAEhD,IAAI,EAAE,GAAuB,IAAI,CAAC;IAClC,IAAI,IAAI,GAAwB,IAAI,CAAC;IACrC,IAAI,KAAK,GAAwB,IAAI,CAAC;IAEtC,MAAM,MAAM,GAAG,CAAC,CAAc,EAAQ,EAAE;QACtC,EAAE,GAAG,CAAC,CAAC;QACP,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC3B,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,+DAA+D;QACvF,KAAK,GAAG,QAAQ,CAAC,GAAG,EAAE;YACpB,IAAI,EAAE;gBAAE,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IAC9B,CAAC,CAAC;IAEF,4FAA4F;IAC5F,MAAM,CAAC,GAAG,EAAE;QACV,MAAM,CAAC,GAAuB,WAAW,EAAE,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,GAAW,EAAE;QAClC,KAAK,EAAE,CAAC;QACR,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC;IAEF,MAAM,aAAa,GAA4B,QAAQ,CACrD,GAAkB,EAAE;QAClB,MAAM,CAAC,GAAW,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;QACzC,MAAM,KAAK,GAAW,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC;QACtE,MAAM,OAAO,GAAW,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC;QAC5E,MAAM,KAAK,GAAW,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;QAClD,MAAM,GAAG,GAAW,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC,CAAC;QAC1D,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IACxB,CAAC,EACD,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,EAAE,CAC3E,CAAC;IAEF,MAAM,SAAS,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,QAAQ,CAAC;IAClE,MAAM,YAAY,GAAG,GAAW,EAAE,CAAC,aAAa,EAAE,CAAC,KAAK,GAAG,QAAQ,CAAC;IACpE,MAAM,SAAS,GAAG,GAAW,EAAE,CAAC,SAAS,EAAE,GAAG,aAAa,EAAE,CAAC,GAAG,GAAG,QAAQ,CAAC;IAE7E,MAAM,OAAO,GAAG,GAAS,EAAE;QACzB,KAAK,EAAE,EAAE,CAAC;QACV,KAAK,GAAG,IAAI,CAAC;IACf,CAAC,CAAC;IACF,SAAS,CAAC,OAAO,CAAC,CAAC;IAEnB,OAAO;QACL,aAAa,EAAE,GAAkB,EAAE,CAAC,aAAa,EAAE;QACnD,YAAY;QACZ,SAAS;QACT,SAAS;QACT,aAAa,EAAE,CAAC,KAAa,EAAQ,EAAE;YACrC,MAAM,CAAC,GAAW,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;YACzC,MAAM,OAAO,GAAW,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC5D,IAAI,EAAE,EAAE,CAAC;gBACP,EAAE,CAAC,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;gBAClC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QACD,OAAO,EAAE,GAAS,EAAE;YAClB,IAAI,EAAE;gBAAE,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;YACpC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO;KACR,CAAC;AACJ,CAAC"}
|