@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
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Aidas Josas
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# @weave-framework/ui
|
|
2
|
+
|
|
3
|
+
Weave UI — a signal-native component library (a Material + CDK equivalent) with the Weave design system. Ships SCSS; zero third-party runtime deps.
|
|
4
|
+
|
|
5
|
+
Part of **[Weave](https://weave-framework.github.io/weave/)** — a fine-grained reactive, signal-native UI framework: no Virtual DOM, zero third-party runtime dependencies.
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @weave-framework/ui
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Components import per-subpath (JS + SCSS), e.g. `@weave-framework/ui/button`. You compile the SCSS in your own build.
|
|
12
|
+
|
|
13
|
+
📚 **Guides + full API reference:** [weave-framework.github.io/weave](https://weave-framework.github.io/weave/)
|
|
14
|
+
|
|
15
|
+
## License
|
|
16
|
+
|
|
17
|
+
MIT
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<Autocomplete>` — a text field with a suggestion listbox (WAI-ARIA combobox +
|
|
3
|
+
* `aria-autocomplete=list`). A native `<input>` (Input's field: prefix/suffix/clear) whose
|
|
4
|
+
* typing opens a CDK-overlay `role=listbox` of matching options; focus stays in the input
|
|
5
|
+
* and the active suggestion is tracked with `aria-activedescendant`.
|
|
6
|
+
*
|
|
7
|
+
* **Static or async data (adapts to APIs):**
|
|
8
|
+
* - `options: T[]` — filtered locally by the typed text (`filter`, default: label contains
|
|
9
|
+
* query, case-insensitive), OR
|
|
10
|
+
* - `optionsFor(query) => T[] | Promise<T[]>` — fetch suggestions (e.g. an API call); a
|
|
11
|
+
* promise fills a reactive cache, so the panel re-renders when results land.
|
|
12
|
+
*
|
|
13
|
+
* **Field mapping:** `optionValue`/`optionLabel`/`optionDescription` accessors pick which
|
|
14
|
+
* fields of an arbitrary row are the value / display / subtext (default `.value`/`.label`/
|
|
15
|
+
* `.description`; plain strings work). Selecting fills the input with the label and fires
|
|
16
|
+
* `onSelect(item)`. Free text is allowed. The text value binds like Input (`value`/`onInput`
|
|
17
|
+
* OR a `control` Field<string>). Zero-dep.
|
|
18
|
+
*/
|
|
19
|
+
import { type Signal } from '@weave-framework/runtime';
|
|
20
|
+
import { type OptionAccessors } from '../shared/options.js';
|
|
21
|
+
import { type MenuPosition } from '../shared/positions.js';
|
|
22
|
+
/** The subset of a forms `Field<string>` an Autocomplete binds to (the text value). */
|
|
23
|
+
export interface AutocompleteControl {
|
|
24
|
+
value: Signal<string>;
|
|
25
|
+
touched?: Signal<boolean>;
|
|
26
|
+
error?: () => string | null;
|
|
27
|
+
}
|
|
28
|
+
export interface AutocompleteProps<T = {
|
|
29
|
+
value: string;
|
|
30
|
+
label: string;
|
|
31
|
+
}> extends OptionAccessors<T> {
|
|
32
|
+
/** Static options — filtered locally by the typed text. */
|
|
33
|
+
options?: T[];
|
|
34
|
+
/** Async / dynamic options for a query (e.g. an API call). Overrides `options`. */
|
|
35
|
+
optionsFor?: (query: string) => T[] | Promise<T[]>;
|
|
36
|
+
/** Local filter for static `options`. Default: label contains the query (case-insensitive). */
|
|
37
|
+
filter?: (item: T, query: string) => boolean;
|
|
38
|
+
/** Controlled text value (a getter). Ignored when `control` is set. */
|
|
39
|
+
value?: string;
|
|
40
|
+
/** Called with the next text on every input. Ignored when `control` is set. */
|
|
41
|
+
onInput?: (text: string) => void;
|
|
42
|
+
/** A forms `Field<string>` — two-way text + touched-on-blur + error underline. */
|
|
43
|
+
control?: AutocompleteControl;
|
|
44
|
+
/** Called with the chosen option (the input is filled with its label). */
|
|
45
|
+
onSelect?: (item: T) => void;
|
|
46
|
+
/** Minimum characters before suggestions show. Default 1. */
|
|
47
|
+
minChars?: number;
|
|
48
|
+
/** Placeholder text. */
|
|
49
|
+
placeholder?: string;
|
|
50
|
+
/** Disable the field. */
|
|
51
|
+
disabled?: boolean;
|
|
52
|
+
/** Mark required (native). */
|
|
53
|
+
required?: boolean;
|
|
54
|
+
/** Native `name`. */
|
|
55
|
+
name?: string;
|
|
56
|
+
/** Accessible name (when not wrapped by a FormField label). */
|
|
57
|
+
label?: string;
|
|
58
|
+
/** Show a clear (`×`) button when non-empty. */
|
|
59
|
+
clearable?: boolean;
|
|
60
|
+
/** Accessible name for the clear button. Default 'Clear'. */
|
|
61
|
+
clearLabel?: string;
|
|
62
|
+
/** Text for the empty-results row. Default 'No results'. */
|
|
63
|
+
noResultsText?: string;
|
|
64
|
+
/** Panel position relative to the field. Default `'bottom-start'`. */
|
|
65
|
+
position?: MenuPosition;
|
|
66
|
+
/** Extra classes, forwarded onto the root. */
|
|
67
|
+
class?: string;
|
|
68
|
+
}
|
|
69
|
+
export declare const template: string;
|
|
70
|
+
export interface AutocompleteContext {
|
|
71
|
+
currentText: () => string;
|
|
72
|
+
controlProp: () => AutocompleteControl | undefined;
|
|
73
|
+
onCommit: (value: string) => void;
|
|
74
|
+
clearable: () => boolean;
|
|
75
|
+
placeholder: () => string | undefined;
|
|
76
|
+
isDisabled: () => boolean;
|
|
77
|
+
isRequired: () => boolean;
|
|
78
|
+
name: () => string | undefined;
|
|
79
|
+
label: () => string | undefined;
|
|
80
|
+
bindInput: (el: HTMLInputElement | HTMLTextAreaElement) => void;
|
|
81
|
+
}
|
|
82
|
+
export declare function setup<T = {
|
|
83
|
+
value: string;
|
|
84
|
+
label: string;
|
|
85
|
+
}>(props: AutocompleteProps<T>): AutocompleteContext;
|
|
86
|
+
//# sourceMappingURL=autocomplete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autocomplete.d.ts","sourceRoot":"","sources":["../../src/autocomplete/autocomplete.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<Autocomplete>` — a text field with a suggestion listbox (WAI-ARIA combobox +
|
|
3
|
+
* `aria-autocomplete=list`). A native `<input>` (Input's field: prefix/suffix/clear) whose
|
|
4
|
+
* typing opens a CDK-overlay `role=listbox` of matching options; focus stays in the input
|
|
5
|
+
* and the active suggestion is tracked with `aria-activedescendant`.
|
|
6
|
+
*
|
|
7
|
+
* **Static or async data (adapts to APIs):**
|
|
8
|
+
* - `options: T[]` — filtered locally by the typed text (`filter`, default: label contains
|
|
9
|
+
* query, case-insensitive), OR
|
|
10
|
+
* - `optionsFor(query) => T[] | Promise<T[]>` — fetch suggestions (e.g. an API call); a
|
|
11
|
+
* promise fills a reactive cache, so the panel re-renders when results land.
|
|
12
|
+
*
|
|
13
|
+
* **Field mapping:** `optionValue`/`optionLabel`/`optionDescription` accessors pick which
|
|
14
|
+
* fields of an arbitrary row are the value / display / subtext (default `.value`/`.label`/
|
|
15
|
+
* `.description`; plain strings work). Selecting fills the input with the label and fires
|
|
16
|
+
* `onSelect(item)`. Free text is allowed. The text value binds like Input (`value`/`onInput`
|
|
17
|
+
* OR a `control` Field<string>). Zero-dep.
|
|
18
|
+
*/
|
|
19
|
+
import { signal, effect, onDispose } from '@weave-framework/runtime';
|
|
20
|
+
import { createOverlay, connectedPosition, listKeyManager } from '../cdk/index.js';
|
|
21
|
+
import { optValue, optLabel, optDescription } from '../shared/options.js';
|
|
22
|
+
import { buildPositions } from '../shared/positions.js';
|
|
23
|
+
// The field IS the Input component (Autocomplete = Input + a suggestion listbox). The
|
|
24
|
+
// combobox ARIA + keyboard nav are attached to Input's native field via `onInputRef`;
|
|
25
|
+
// the underline / clear / prefix-suffix / value binding / invalid state are all Input's.
|
|
26
|
+
export const template = '<Input class="weave-autocomplete" value={{ currentText() }} control={{ controlProp() }}' +
|
|
27
|
+
' onInput={{ onCommit }} clearable={{ clearable() }} placeholder={{ placeholder() }}' +
|
|
28
|
+
' disabled={{ isDisabled() }} required={{ isRequired() }} name={{ name() }} label={{ label() }}' +
|
|
29
|
+
' onInputRef={{ bindInput }} />';
|
|
30
|
+
let _seq = 0;
|
|
31
|
+
export function setup(props) {
|
|
32
|
+
const id = ++_seq;
|
|
33
|
+
const input = signal(null);
|
|
34
|
+
const open = signal(false);
|
|
35
|
+
const results = signal([]);
|
|
36
|
+
let overlay = null;
|
|
37
|
+
let listbox = null;
|
|
38
|
+
let requestSeq = 0; // guard against out-of-order async responses
|
|
39
|
+
const currentText = () => (props.control ? props.control.value() : props.value ?? '');
|
|
40
|
+
const isDisabled = () => !!props.disabled;
|
|
41
|
+
const minChars = () => props.minChars ?? 1;
|
|
42
|
+
const commitText = (next) => {
|
|
43
|
+
if (props.control)
|
|
44
|
+
props.control.value.set(next);
|
|
45
|
+
else
|
|
46
|
+
props.onInput?.(next);
|
|
47
|
+
};
|
|
48
|
+
const defaultFilter = (item, query) => optLabel(item, props).toLowerCase().includes(query.toLowerCase());
|
|
49
|
+
const km = listKeyManager(() => results(), {
|
|
50
|
+
orientation: 'vertical',
|
|
51
|
+
wrap: true,
|
|
52
|
+
});
|
|
53
|
+
function renderResults() {
|
|
54
|
+
if (!listbox)
|
|
55
|
+
return;
|
|
56
|
+
const box = listbox;
|
|
57
|
+
box.textContent = '';
|
|
58
|
+
const list = results();
|
|
59
|
+
if (list.length === 0) {
|
|
60
|
+
const empty = document.createElement('div');
|
|
61
|
+
empty.className = 'weave-autocomplete__empty';
|
|
62
|
+
empty.textContent = props.noResultsText ?? 'No results';
|
|
63
|
+
box.appendChild(empty);
|
|
64
|
+
input()?.removeAttribute('aria-activedescendant');
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
list.forEach((item, i) => {
|
|
68
|
+
const opt = document.createElement('div');
|
|
69
|
+
opt.className = 'weave-autocomplete__option';
|
|
70
|
+
opt.id = `weave-autocomplete-${id}-opt-${i}`;
|
|
71
|
+
opt.setAttribute('role', 'option');
|
|
72
|
+
const label = document.createElement('span');
|
|
73
|
+
label.className = 'weave-autocomplete__label';
|
|
74
|
+
label.textContent = optLabel(item, props);
|
|
75
|
+
opt.appendChild(label);
|
|
76
|
+
const desc = optDescription(item, props);
|
|
77
|
+
if (desc) {
|
|
78
|
+
const d = document.createElement('span');
|
|
79
|
+
d.className = 'weave-autocomplete__description';
|
|
80
|
+
d.textContent = desc;
|
|
81
|
+
opt.appendChild(d);
|
|
82
|
+
}
|
|
83
|
+
opt.addEventListener('mousedown', (e) => {
|
|
84
|
+
e.preventDefault(); // keep focus in the input
|
|
85
|
+
select(item);
|
|
86
|
+
});
|
|
87
|
+
box.appendChild(opt);
|
|
88
|
+
});
|
|
89
|
+
syncActive();
|
|
90
|
+
}
|
|
91
|
+
function syncActive() {
|
|
92
|
+
if (!listbox)
|
|
93
|
+
return;
|
|
94
|
+
const active = km.activeItem();
|
|
95
|
+
const activeIdx = km.activeIndex();
|
|
96
|
+
const opts = Array.from(listbox.querySelectorAll('.weave-autocomplete__option'));
|
|
97
|
+
opts.forEach((el, i) => {
|
|
98
|
+
const on = i === activeIdx;
|
|
99
|
+
el.classList.toggle('weave-autocomplete__option--active', on);
|
|
100
|
+
if (on) {
|
|
101
|
+
el.scrollIntoView({ block: 'nearest' });
|
|
102
|
+
input()?.setAttribute('aria-activedescendant', el.id);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
if (active == null)
|
|
106
|
+
input()?.removeAttribute('aria-activedescendant');
|
|
107
|
+
}
|
|
108
|
+
function ensurePanel() {
|
|
109
|
+
if (overlay)
|
|
110
|
+
return;
|
|
111
|
+
const el = input();
|
|
112
|
+
listbox = document.createElement('div');
|
|
113
|
+
listbox.className = 'weave-autocomplete__panel';
|
|
114
|
+
listbox.setAttribute('role', 'listbox');
|
|
115
|
+
listbox.id = `weave-autocomplete-${id}-list`;
|
|
116
|
+
overlay = createOverlay({
|
|
117
|
+
positionStrategy: connectedPosition(el, { positions: buildPositions(props.position, 'bottom-start'), offset: 4 }),
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
function openPanel() {
|
|
121
|
+
if (open() || isDisabled())
|
|
122
|
+
return;
|
|
123
|
+
ensurePanel();
|
|
124
|
+
overlay.attach(listbox);
|
|
125
|
+
input()?.setAttribute('aria-expanded', 'true');
|
|
126
|
+
input()?.setAttribute('aria-controls', listbox.id); // APG: only while the popup is in the DOM
|
|
127
|
+
open.set(true);
|
|
128
|
+
renderResults();
|
|
129
|
+
}
|
|
130
|
+
function closePanel() {
|
|
131
|
+
if (!open())
|
|
132
|
+
return;
|
|
133
|
+
overlay?.detach();
|
|
134
|
+
input()?.setAttribute('aria-expanded', 'false');
|
|
135
|
+
input()?.removeAttribute('aria-activedescendant');
|
|
136
|
+
input()?.removeAttribute('aria-controls'); // the listbox element is detached while closed
|
|
137
|
+
open.set(false);
|
|
138
|
+
}
|
|
139
|
+
function fetchFor(query) {
|
|
140
|
+
if (query.length < minChars()) {
|
|
141
|
+
results.set([]);
|
|
142
|
+
closePanel();
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const seq = ++requestSeq;
|
|
146
|
+
if (props.optionsFor) {
|
|
147
|
+
const out = props.optionsFor(query);
|
|
148
|
+
if (Array.isArray(out)) {
|
|
149
|
+
results.set(out);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
out.then((list) => {
|
|
153
|
+
if (seq === requestSeq)
|
|
154
|
+
results.set(list); // ignore stale responses
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
const filter = props.filter ?? defaultFilter;
|
|
160
|
+
results.set((props.options ?? []).filter((o) => filter(o, query)));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
function select(item) {
|
|
164
|
+
const label = optLabel(item, props);
|
|
165
|
+
commitText(label);
|
|
166
|
+
const el = input();
|
|
167
|
+
if (el)
|
|
168
|
+
el.value = label; // reflect immediately (Input re-renders it from value/control too)
|
|
169
|
+
props.onSelect?.(item);
|
|
170
|
+
results.set([]);
|
|
171
|
+
closePanel();
|
|
172
|
+
void optValue(item, props); // value accessor available to consumers via onSelect(item)
|
|
173
|
+
}
|
|
174
|
+
// The value is Input's job (via value/control); this listener only drives the suggestions.
|
|
175
|
+
const onInputFetch = () => {
|
|
176
|
+
const text = input()?.value ?? '';
|
|
177
|
+
fetchFor(text);
|
|
178
|
+
if (text.length >= minChars())
|
|
179
|
+
openPanel();
|
|
180
|
+
else
|
|
181
|
+
closePanel();
|
|
182
|
+
};
|
|
183
|
+
// Compose Input: forward the consumer's onInput (no-control mode) and attach the
|
|
184
|
+
// combobox ARIA + keyboard nav to Input's native field once it's handed over.
|
|
185
|
+
const onCommit = (value) => props.onInput?.(value);
|
|
186
|
+
const bindInput = (el) => {
|
|
187
|
+
const inp = el;
|
|
188
|
+
input.set(inp);
|
|
189
|
+
inp.setAttribute('role', 'combobox');
|
|
190
|
+
inp.setAttribute('aria-autocomplete', 'list');
|
|
191
|
+
inp.setAttribute('aria-haspopup', 'listbox');
|
|
192
|
+
inp.setAttribute('aria-expanded', 'false');
|
|
193
|
+
inp.addEventListener('input', onInputFetch);
|
|
194
|
+
inp.addEventListener('keydown', onKeydown);
|
|
195
|
+
inp.addEventListener('focus', onFocus);
|
|
196
|
+
inp.addEventListener('blur', onBlur);
|
|
197
|
+
};
|
|
198
|
+
const onFocus = () => {
|
|
199
|
+
if (currentText().length >= minChars()) {
|
|
200
|
+
fetchFor(currentText());
|
|
201
|
+
openPanel();
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
const onKeydown = (event) => {
|
|
205
|
+
if (event.key === 'Escape') {
|
|
206
|
+
if (open()) {
|
|
207
|
+
event.preventDefault();
|
|
208
|
+
closePanel();
|
|
209
|
+
}
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
if (!open()) {
|
|
213
|
+
if (event.key === 'ArrowDown' && currentText().length >= minChars()) {
|
|
214
|
+
event.preventDefault();
|
|
215
|
+
fetchFor(currentText());
|
|
216
|
+
openPanel();
|
|
217
|
+
}
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
if (event.key === 'Enter') {
|
|
221
|
+
const it = km.activeItem();
|
|
222
|
+
if (it != null) {
|
|
223
|
+
event.preventDefault();
|
|
224
|
+
select(it);
|
|
225
|
+
}
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
if (km.onKeydown(event)) {
|
|
229
|
+
event.preventDefault();
|
|
230
|
+
syncActive();
|
|
231
|
+
}
|
|
232
|
+
};
|
|
233
|
+
const onBlur = () => {
|
|
234
|
+
props.control?.touched?.set(true);
|
|
235
|
+
// Defer close so a mousedown-select on an option still fires first.
|
|
236
|
+
closePanel();
|
|
237
|
+
};
|
|
238
|
+
// Re-render the panel whenever results change (async fills land here too).
|
|
239
|
+
effect(() => {
|
|
240
|
+
results();
|
|
241
|
+
if (open())
|
|
242
|
+
renderResults();
|
|
243
|
+
});
|
|
244
|
+
// Forms validity (aria-invalid + the --invalid underline) is the composed Input's job
|
|
245
|
+
// now — Autocomplete passes it the `control`, so Input reflects touched-and-invalid.
|
|
246
|
+
onDispose(() => {
|
|
247
|
+
overlay?.dispose();
|
|
248
|
+
overlay = null;
|
|
249
|
+
});
|
|
250
|
+
return {
|
|
251
|
+
currentText,
|
|
252
|
+
controlProp: () => props.control,
|
|
253
|
+
onCommit,
|
|
254
|
+
clearable: () => !!props.clearable,
|
|
255
|
+
placeholder: () => props.placeholder,
|
|
256
|
+
isDisabled,
|
|
257
|
+
isRequired: () => !!props.required,
|
|
258
|
+
name: () => props.name,
|
|
259
|
+
label: () => props.label,
|
|
260
|
+
bindInput,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=autocomplete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autocomplete.js","sourceRoot":"","sources":["../../src/autocomplete/autocomplete.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<Badge>` — a small status mark. Three variants:
|
|
3
|
+
*
|
|
4
|
+
* - **count** (default) — an accent pill over the top corner of its slotted host
|
|
5
|
+
* (an icon, a button…): `<Badge content={{ 3 }}><Icon name={{ 'bell' }} /></Badge>`.
|
|
6
|
+
* The count is announced via `aria-label` on the host; the pill itself is
|
|
7
|
+
* `aria-hidden` (decorative). `max` caps the display (e.g. `99+`).
|
|
8
|
+
* - **dot** (`variant="dot"`) — a bare 6px status dot over the corner, no text.
|
|
9
|
+
* - **tag** (`variant="tag"`) — a standalone outline label; the slot IS the text
|
|
10
|
+
* (`<Badge variant={{ 'tag' }}>New</Badge>`), no host overlay.
|
|
11
|
+
*
|
|
12
|
+
* Pure display — lean DOM (a wrapper + one positioned mark for count/dot; just the
|
|
13
|
+
* wrapper for tag). `position` places the mark in any corner (default top-end).
|
|
14
|
+
*/
|
|
15
|
+
export type BadgeVariant = 'count' | 'dot' | 'tag';
|
|
16
|
+
export type BadgePosition = 'top-end' | 'top-start' | 'bottom-end' | 'bottom-start';
|
|
17
|
+
export interface BadgeProps {
|
|
18
|
+
/** Which mark to render. Default `'count'`. */
|
|
19
|
+
variant?: BadgeVariant;
|
|
20
|
+
/** The count/text shown in a `count` mark. */
|
|
21
|
+
content?: string | number;
|
|
22
|
+
/** Cap the displayed count (a number over `max` shows `max+`). */
|
|
23
|
+
max?: number;
|
|
24
|
+
/** Corner for the overlaid mark (count/dot). Default `'top-end'`. */
|
|
25
|
+
position?: BadgePosition;
|
|
26
|
+
/** Accessible name for the host (defaults to the count for `count` badges). */
|
|
27
|
+
label?: string;
|
|
28
|
+
/** Extra classes, forwarded onto the container. */
|
|
29
|
+
class?: string;
|
|
30
|
+
}
|
|
31
|
+
export declare const template: string;
|
|
32
|
+
export interface BadgeContext {
|
|
33
|
+
badgeClass: () => string;
|
|
34
|
+
ariaLabel: () => string | undefined;
|
|
35
|
+
showMark: () => boolean;
|
|
36
|
+
markText: () => string;
|
|
37
|
+
}
|
|
38
|
+
export declare function setup(props: BadgeProps): BadgeContext;
|
|
39
|
+
//# sourceMappingURL=badge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge.d.ts","sourceRoot":"","sources":["../../src/badge/badge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,CAAC;AACnD,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,WAAW,GAAG,YAAY,GAAG,cAAc,CAAC;AAEpF,MAAM,WAAW,UAAU;IACzB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,kEAAkE;IAClE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,+EAA+E;IAC/E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,QAAQ,EAAE,MAMZ,CAAC;AAEZ,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,EAAE,MAAM,OAAO,CAAC;IACxB,QAAQ,EAAE,MAAM,MAAM,CAAC;CACxB;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY,CAiCrD"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<Badge>` — a small status mark. Three variants:
|
|
3
|
+
*
|
|
4
|
+
* - **count** (default) — an accent pill over the top corner of its slotted host
|
|
5
|
+
* (an icon, a button…): `<Badge content={{ 3 }}><Icon name={{ 'bell' }} /></Badge>`.
|
|
6
|
+
* The count is announced via `aria-label` on the host; the pill itself is
|
|
7
|
+
* `aria-hidden` (decorative). `max` caps the display (e.g. `99+`).
|
|
8
|
+
* - **dot** (`variant="dot"`) — a bare 6px status dot over the corner, no text.
|
|
9
|
+
* - **tag** (`variant="tag"`) — a standalone outline label; the slot IS the text
|
|
10
|
+
* (`<Badge variant={{ 'tag' }}>New</Badge>`), no host overlay.
|
|
11
|
+
*
|
|
12
|
+
* Pure display — lean DOM (a wrapper + one positioned mark for count/dot; just the
|
|
13
|
+
* wrapper for tag). `position` places the mark in any corner (default top-end).
|
|
14
|
+
*/
|
|
15
|
+
export const template = '<span class={{ badgeClass() }} aria-label={{ ariaLabel() }}>' +
|
|
16
|
+
'<slot></slot>' +
|
|
17
|
+
'@if (showMark()) {' +
|
|
18
|
+
'<span class="weave-badge__mark" aria-hidden="true">{{ markText() }}</span>' +
|
|
19
|
+
'}' +
|
|
20
|
+
'</span>';
|
|
21
|
+
export function setup(props) {
|
|
22
|
+
const variant = () => props.variant ?? 'count';
|
|
23
|
+
const hasContent = () => props.content != null && props.content !== '';
|
|
24
|
+
const markText = () => {
|
|
25
|
+
if (variant() !== 'count')
|
|
26
|
+
return '';
|
|
27
|
+
const value = props.content;
|
|
28
|
+
if (typeof value === 'number' && props.max != null && value > props.max)
|
|
29
|
+
return `${props.max}+`;
|
|
30
|
+
return String(value ?? '');
|
|
31
|
+
};
|
|
32
|
+
// count shows only when there's something to show; dot always; tag never (it IS the mark).
|
|
33
|
+
const showMark = () => (variant() === 'dot' ? true : variant() === 'count' ? hasContent() : false);
|
|
34
|
+
return {
|
|
35
|
+
badgeClass: () => {
|
|
36
|
+
const parts = ['weave-badge'];
|
|
37
|
+
const v = variant();
|
|
38
|
+
if (v !== 'count')
|
|
39
|
+
parts.push(`weave-badge--${v}`);
|
|
40
|
+
const position = props.position ?? 'top-end';
|
|
41
|
+
if (position.startsWith('bottom'))
|
|
42
|
+
parts.push('weave-badge--bottom');
|
|
43
|
+
if (position.endsWith('start'))
|
|
44
|
+
parts.push('weave-badge--start');
|
|
45
|
+
if (props.class)
|
|
46
|
+
parts.push(props.class);
|
|
47
|
+
return parts.join(' ');
|
|
48
|
+
},
|
|
49
|
+
// Host label: explicit `label`, else the count (so the pill's number is announced).
|
|
50
|
+
ariaLabel: () => {
|
|
51
|
+
if (variant() === 'tag')
|
|
52
|
+
return undefined;
|
|
53
|
+
return props.label ?? (variant() === 'count' && hasContent() ? markText() : undefined);
|
|
54
|
+
},
|
|
55
|
+
showMark,
|
|
56
|
+
markText,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=badge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge.js","sourceRoot":"","sources":["../../src/badge/badge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAoBH,MAAM,CAAC,MAAM,QAAQ,GACnB,8DAA8D;IAC9D,eAAe;IACf,oBAAoB;IACpB,4EAA4E;IAC5E,GAAG;IACH,SAAS,CAAC;AASZ,MAAM,UAAU,KAAK,CAAC,KAAiB;IACrC,MAAM,OAAO,GAAG,GAAiB,EAAE,CAAC,KAAK,CAAC,OAAO,IAAI,OAAO,CAAC;IAC7D,MAAM,UAAU,GAAG,GAAY,EAAE,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,KAAK,EAAE,CAAC;IAEhF,MAAM,QAAQ,GAAG,GAAW,EAAE;QAC5B,IAAI,OAAO,EAAE,KAAK,OAAO;YAAE,OAAO,EAAE,CAAC;QACrC,MAAM,KAAK,GAAgC,KAAK,CAAC,OAAO,CAAC;QACzD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,GAAG,IAAI,IAAI,IAAI,KAAK,GAAG,KAAK,CAAC,GAAG;YAAE,OAAO,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC;QAChG,OAAO,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC;IAEF,2FAA2F;IAC3F,MAAM,QAAQ,GAAG,GAAY,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAE5G,OAAO;QACL,UAAU,EAAE,GAAW,EAAE;YACvB,MAAM,KAAK,GAAa,CAAC,aAAa,CAAC,CAAC;YACxC,MAAM,CAAC,GAAiB,OAAO,EAAE,CAAC;YAClC,IAAI,CAAC,KAAK,OAAO;gBAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAkB,KAAK,CAAC,QAAQ,IAAI,SAAS,CAAC;YAC5D,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YACrE,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACjE,IAAI,KAAK,CAAC,KAAK;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACzC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QACD,oFAAoF;QACpF,SAAS,EAAE,GAAuB,EAAE;YAClC,IAAI,OAAO,EAAE,KAAK,KAAK;gBAAE,OAAO,SAAS,CAAC;YAC1C,OAAO,KAAK,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,KAAK,OAAO,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACzF,CAAC;QACD,QAAQ;QACR,QAAQ;KACT,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type ModalContent, type ModalRef } from '../dialog/modal-core.js';
|
|
2
|
+
export type BottomSheetContent = ModalContent;
|
|
3
|
+
export interface BottomSheetOptions {
|
|
4
|
+
/** The body — required, always shown, scrolls vertically when tall. */
|
|
5
|
+
content: BottomSheetContent;
|
|
6
|
+
/** Optional header. `header` node wins over the `title` string. */
|
|
7
|
+
header?: BottomSheetContent;
|
|
8
|
+
title?: string;
|
|
9
|
+
/** Optional footer button area. */
|
|
10
|
+
actions?: BottomSheetContent;
|
|
11
|
+
/** Esc + backdrop-click close. Default true. */
|
|
12
|
+
dismissable?: boolean;
|
|
13
|
+
/** Show a top grab-handle and let a downward drag dismiss the sheet. Default true. */
|
|
14
|
+
dragToDismiss?: boolean;
|
|
15
|
+
/** Called when the sheet closes, with the `close(result)` value. */
|
|
16
|
+
onClose?: (result?: unknown) => void;
|
|
17
|
+
}
|
|
18
|
+
export type BottomSheetRef = ModalRef;
|
|
19
|
+
/** Open a bottom sheet. Returns a {@link BottomSheetRef}. */
|
|
20
|
+
export declare function openBottomSheet(options: BottomSheetOptions): BottomSheetRef;
|
|
21
|
+
//# sourceMappingURL=bottom-sheet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bottom-sheet.d.ts","sourceRoot":"","sources":["../../src/bottom-sheet/bottom-sheet.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAa,KAAK,YAAY,EAAE,KAAK,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEtF,MAAM,MAAM,kBAAkB,GAAG,YAAY,CAAC;AAE9C,MAAM,WAAW,kBAAkB;IACjC,uEAAuE;IACvE,OAAO,EAAE,kBAAkB,CAAC;IAC5B,mEAAmE;IACnE,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,gDAAgD;IAChD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,sFAAsF;IACtF,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,oEAAoE;IACpE,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CACtC;AAED,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC;AAEtC,6DAA6D;AAC7D,wBAAgB,eAAe,CAAC,OAAO,EAAE,kBAAkB,GAAG,cAAc,CA4B3E"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bottom Sheet — a modal panel docked to the bottom edge, opened imperatively:
|
|
3
|
+
*
|
|
4
|
+
* const ref = openBottomSheet({ title: 'Share', content: listNode });
|
|
5
|
+
* ref.afterClosed().then(…);
|
|
6
|
+
*
|
|
7
|
+
* Same modal machinery as Dialog (CDK overlay + dimming backdrop + `blockScroll` +
|
|
8
|
+
* focus-trap/restore + Esc/backdrop close + the three regions header/content/actions),
|
|
9
|
+
* but full-width and anchored to the bottom (`globalPosition({ bottom })`), with top-only
|
|
10
|
+
* corner radius and a slide-up entrance. The panel never exceeds the viewport; the content
|
|
11
|
+
* region scrolls. The visual is `bottom-sheet.styles()` (the `--weave-bottom-sheet-*`
|
|
12
|
+
* republic). Zero-dep.
|
|
13
|
+
*
|
|
14
|
+
* Drag-to-dismiss (U4, via the CDK `draggable`): a top grab-handle drags the sheet down;
|
|
15
|
+
* releasing past a threshold closes it, else it snaps back. Deferred (noted): wide-viewport
|
|
16
|
+
* center-dock.
|
|
17
|
+
*/
|
|
18
|
+
import { globalPosition, draggable } from '../cdk/index.js';
|
|
19
|
+
import { openModal } from '../dialog/modal-core.js';
|
|
20
|
+
/** Open a bottom sheet. Returns a {@link BottomSheetRef}. */
|
|
21
|
+
export function openBottomSheet(options) {
|
|
22
|
+
const useDrag = options.dragToDismiss !== false;
|
|
23
|
+
const ref = openModal({
|
|
24
|
+
block: 'weave-bottom-sheet',
|
|
25
|
+
// Full-width, docked to the bottom edge (not centered).
|
|
26
|
+
positionStrategy: globalPosition({
|
|
27
|
+
centerHorizontally: false,
|
|
28
|
+
centerVertically: false,
|
|
29
|
+
left: '0',
|
|
30
|
+
right: '0',
|
|
31
|
+
bottom: '0',
|
|
32
|
+
}),
|
|
33
|
+
content: options.content,
|
|
34
|
+
header: options.header,
|
|
35
|
+
title: options.title,
|
|
36
|
+
actions: options.actions,
|
|
37
|
+
dismissable: options.dismissable,
|
|
38
|
+
onClose: options.onClose,
|
|
39
|
+
onPanel: (panel) => {
|
|
40
|
+
if (!useDrag)
|
|
41
|
+
return;
|
|
42
|
+
const handle = document.createElement('div');
|
|
43
|
+
handle.className = 'weave-bottom-sheet__handle';
|
|
44
|
+
handle.setAttribute('aria-hidden', 'true');
|
|
45
|
+
panel.insertBefore(handle, panel.firstChild);
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
if (useDrag)
|
|
49
|
+
attachDragDismiss(ref);
|
|
50
|
+
return ref;
|
|
51
|
+
}
|
|
52
|
+
/** Wire the top handle to a downward drag: past a threshold → close, else snap back. */
|
|
53
|
+
function attachDragDismiss(ref) {
|
|
54
|
+
const panel = ref.element;
|
|
55
|
+
const handle = panel.querySelector('.weave-bottom-sheet__handle');
|
|
56
|
+
if (!handle)
|
|
57
|
+
return;
|
|
58
|
+
let height = 0;
|
|
59
|
+
const drag = draggable(handle, {
|
|
60
|
+
axis: 'y',
|
|
61
|
+
onStart: () => {
|
|
62
|
+
height = panel.offsetHeight;
|
|
63
|
+
panel.style.transition = 'none';
|
|
64
|
+
},
|
|
65
|
+
onMove: ({ dy }) => {
|
|
66
|
+
if (dy > 0)
|
|
67
|
+
panel.style.transform = `translateY(${dy}px)`;
|
|
68
|
+
},
|
|
69
|
+
onEnd: ({ dy }) => {
|
|
70
|
+
const threshold = Math.max(80, height * 0.3);
|
|
71
|
+
if (dy > threshold) {
|
|
72
|
+
drag.destroy();
|
|
73
|
+
ref.close();
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
// Snap back with a short ease.
|
|
77
|
+
panel.style.transition = 'transform 0.2s ease';
|
|
78
|
+
panel.style.transform = '';
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=bottom-sheet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bottom-sheet.js","sourceRoot":"","sources":["../../src/bottom-sheet/bottom-sheet.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,cAAc,EAAE,SAAS,EAAqB,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAoC,MAAM,yBAAyB,CAAC;AAsBtF,6DAA6D;AAC7D,MAAM,UAAU,eAAe,CAAC,OAA2B;IACzD,MAAM,OAAO,GAAY,OAAO,CAAC,aAAa,KAAK,KAAK,CAAC;IACzD,MAAM,GAAG,GAAmB,SAAS,CAAC;QACpC,KAAK,EAAE,oBAAoB;QAC3B,wDAAwD;QACxD,gBAAgB,EAAE,cAAc,CAAC;YAC/B,kBAAkB,EAAE,KAAK;YACzB,gBAAgB,EAAE,KAAK;YACvB,IAAI,EAAE,GAAG;YACT,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,GAAG;SACZ,CAAC;QACF,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO,EAAE,CAAC,KAAkB,EAAQ,EAAE;YACpC,IAAI,CAAC,OAAO;gBAAE,OAAO;YACrB,MAAM,MAAM,GAAgB,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC1D,MAAM,CAAC,SAAS,GAAG,4BAA4B,CAAC;YAChD,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;YAC3C,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QAC/C,CAAC;KACF,CAAC,CAAC;IACH,IAAI,OAAO;QAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACpC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,wFAAwF;AACxF,SAAS,iBAAiB,CAAC,GAAmB;IAC5C,MAAM,KAAK,GAAgB,GAAG,CAAC,OAAO,CAAC;IACvC,MAAM,MAAM,GAAuB,KAAK,CAAC,aAAa,CAAC,6BAA6B,CAAC,CAAC;IACtF,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,IAAI,MAAM,GAAW,CAAC,CAAC;IACvB,MAAM,IAAI,GAAiB,SAAS,CAAC,MAAM,EAAE;QAC3C,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,GAAS,EAAE;YAClB,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC;YAC5B,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC;QAClC,CAAC;QACD,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,EAAQ,EAAE;YACvB,IAAI,EAAE,GAAG,CAAC;gBAAE,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,cAAc,EAAE,KAAK,CAAC;QAC5D,CAAC;QACD,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAQ,EAAE;YACtB,MAAM,SAAS,GAAW,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,GAAG,CAAC,CAAC;YACrD,IAAI,EAAE,GAAG,SAAS,EAAE,CAAC;gBACnB,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,GAAG,CAAC,KAAK,EAAE,CAAC;gBACZ,OAAO;YACT,CAAC;YACD,+BAA+B;YAC/B,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,qBAAqB,CAAC;YAC/C,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC;QAC7B,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|