@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,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<Button>` — a real native `<button>` with the Weave variants, a ripple, and a
|
|
3
|
+
* focus-visible ring. Content is projected (`<Button>Save</Button>`), so it carries
|
|
4
|
+
* any label/icon. Lean DOM: one `<button>`, no wrappers.
|
|
5
|
+
*
|
|
6
|
+
* Variants (REAL Weave): default = Primary (ink fill); `outline` (inverts on hover);
|
|
7
|
+
* `marked` (2px accent underline); `ghost` (text only); `icon` (34px square — pass an
|
|
8
|
+
* `<Icon>` and a `label` for the accessible name).
|
|
9
|
+
*
|
|
10
|
+
* Native-first: the real `<button>` gives keyboard, focus, and form-submit for free —
|
|
11
|
+
* `type="submit"` participates in a form with zero extra wiring. `disabled` is the
|
|
12
|
+
* native attribute (also suppresses the ripple). `class` is forwarded so layout stays
|
|
13
|
+
* the consumer's job.
|
|
14
|
+
*
|
|
15
|
+
* import Button from '@weave-framework/ui/button';
|
|
16
|
+
* <Button on:click={{ save }}>Save</Button>
|
|
17
|
+
* <Button variant={{ 'outline' }}>Cancel</Button>
|
|
18
|
+
* <Button variant={{ 'icon' }} label={{ 'Delete' }}><Icon name={{ 'trash-2' }} /></Button>
|
|
19
|
+
*/
|
|
20
|
+
import { ripple, type RippleOptions } from '../ripple/ripple.js';
|
|
21
|
+
export type ButtonVariant = 'primary' | 'outline' | 'marked' | 'ghost' | 'icon';
|
|
22
|
+
export interface ButtonProps {
|
|
23
|
+
/** Weave variant. Default `'primary'` (no modifier class). */
|
|
24
|
+
variant?: ButtonVariant;
|
|
25
|
+
/** Native button type. Default `'button'` (so it never submits by accident). */
|
|
26
|
+
type?: 'button' | 'submit' | 'reset';
|
|
27
|
+
/** Native disabled state — greys the button and suppresses click/ripple. */
|
|
28
|
+
disabled?: boolean;
|
|
29
|
+
/** Accessible name. Required for an icon-only (`variant="icon"`) button. */
|
|
30
|
+
label?: string;
|
|
31
|
+
/** `aria-current` (e.g. `'page'` for a paginator's active page button). */
|
|
32
|
+
ariaCurrent?: string;
|
|
33
|
+
/** Extra classes, forwarded onto the host `<button>`. */
|
|
34
|
+
class?: string;
|
|
35
|
+
}
|
|
36
|
+
export declare const template: string;
|
|
37
|
+
export interface ButtonContext {
|
|
38
|
+
classes: () => string;
|
|
39
|
+
type: () => string;
|
|
40
|
+
disabled: () => boolean;
|
|
41
|
+
label: () => string | undefined;
|
|
42
|
+
ariaCurrent: () => string | undefined;
|
|
43
|
+
rippleOptions: RippleOptions;
|
|
44
|
+
ripple: typeof ripple;
|
|
45
|
+
}
|
|
46
|
+
export declare function setup(props: ButtonProps): ButtonContext;
|
|
47
|
+
//# sourceMappingURL=button.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../src/button/button.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEjE,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AAEhF,MAAM,WAAW,WAAW;IAC1B,8DAA8D;IAC9D,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,gFAAgF;IAChF,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACrC,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID,eAAO,MAAM,QAAQ,EAAE,MAE6F,CAAC;AAErH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,OAAO,CAAC;IACxB,KAAK,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IAChC,WAAW,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACtC,aAAa,EAAE,aAAa,CAAC;IAC7B,MAAM,EAAE,OAAO,MAAM,CAAC;CACvB;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,WAAW,GAAG,aAAa,CAqBvD"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<Button>` — a real native `<button>` with the Weave variants, a ripple, and a
|
|
3
|
+
* focus-visible ring. Content is projected (`<Button>Save</Button>`), so it carries
|
|
4
|
+
* any label/icon. Lean DOM: one `<button>`, no wrappers.
|
|
5
|
+
*
|
|
6
|
+
* Variants (REAL Weave): default = Primary (ink fill); `outline` (inverts on hover);
|
|
7
|
+
* `marked` (2px accent underline); `ghost` (text only); `icon` (34px square — pass an
|
|
8
|
+
* `<Icon>` and a `label` for the accessible name).
|
|
9
|
+
*
|
|
10
|
+
* Native-first: the real `<button>` gives keyboard, focus, and form-submit for free —
|
|
11
|
+
* `type="submit"` participates in a form with zero extra wiring. `disabled` is the
|
|
12
|
+
* native attribute (also suppresses the ripple). `class` is forwarded so layout stays
|
|
13
|
+
* the consumer's job.
|
|
14
|
+
*
|
|
15
|
+
* import Button from '@weave-framework/ui/button';
|
|
16
|
+
* <Button on:click={{ save }}>Save</Button>
|
|
17
|
+
* <Button variant={{ 'outline' }}>Cancel</Button>
|
|
18
|
+
* <Button variant={{ 'icon' }} label={{ 'Delete' }}><Icon name={{ 'trash-2' }} /></Button>
|
|
19
|
+
*/
|
|
20
|
+
import { ripple } from '../ripple/ripple.js';
|
|
21
|
+
// `<Button on:click={{…}}>` works with no wiring here — defineComponent auto-forwards
|
|
22
|
+
// component-level `on:X` handlers to the rendered root `<button>`.
|
|
23
|
+
export const template = '<button class={{ classes() }} type={{ type() }} disabled={{ disabled() }}' +
|
|
24
|
+
' aria-label={{ label() }} aria-current={{ ariaCurrent() }} use:ripple={{ rippleOptions }}><slot></slot></button>';
|
|
25
|
+
export function setup(props) {
|
|
26
|
+
return {
|
|
27
|
+
// `.weave-button` + variant modifier (Primary = none) + forwarded classes.
|
|
28
|
+
classes: () => {
|
|
29
|
+
const variant = props.variant ?? 'primary';
|
|
30
|
+
const modifier = variant === 'primary' ? '' : ` weave-button--${variant}`;
|
|
31
|
+
const extra = props.class ? ` ${props.class}` : '';
|
|
32
|
+
return `weave-button${modifier}${extra}`;
|
|
33
|
+
},
|
|
34
|
+
type: () => props.type ?? 'button',
|
|
35
|
+
disabled: () => !!props.disabled,
|
|
36
|
+
label: () => props.label,
|
|
37
|
+
ariaCurrent: () => props.ariaCurrent,
|
|
38
|
+
// Ripple reads `disabled` at pointerdown time, so a disabled button never ripples.
|
|
39
|
+
rippleOptions: {
|
|
40
|
+
get disabled() {
|
|
41
|
+
return !!props.disabled;
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
ripple,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=button.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button.js","sourceRoot":"","sources":["../../src/button/button.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,MAAM,EAAsB,MAAM,qBAAqB,CAAC;AAmBjE,sFAAsF;AACtF,mEAAmE;AACnE,MAAM,CAAC,MAAM,QAAQ,GACnB,2EAA2E;IAC3E,kHAAkH,CAAC;AAYrH,MAAM,UAAU,KAAK,CAAC,KAAkB;IACtC,OAAO;QACL,2EAA2E;QAC3E,OAAO,EAAE,GAAW,EAAE;YACpB,MAAM,OAAO,GAAkB,KAAK,CAAC,OAAO,IAAI,SAAS,CAAC;YAC1D,MAAM,QAAQ,GAAW,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,kBAAkB,OAAO,EAAE,CAAC;YAClF,MAAM,KAAK,GAAW,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,OAAO,eAAe,QAAQ,GAAG,KAAK,EAAE,CAAC;QAC3C,CAAC;QACD,IAAI,EAAE,GAAW,EAAE,CAAC,KAAK,CAAC,IAAI,IAAI,QAAQ;QAC1C,QAAQ,EAAE,GAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ;QACzC,KAAK,EAAE,GAAuB,EAAE,CAAC,KAAK,CAAC,KAAK;QAC5C,WAAW,EAAE,GAAuB,EAAE,CAAC,KAAK,CAAC,WAAW;QACxD,mFAAmF;QACnF,aAAa,EAAE;YACb,IAAI,QAAQ;gBACV,OAAO,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;YAC1B,CAAC;SACF;QACD,MAAM;KACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<ButtonToggle>` — a segmented control (a row of connected buttons where one, or in
|
|
3
|
+
* multi mode several, is "on"). Two modes:
|
|
4
|
+
*
|
|
5
|
+
* - **Single-select (default)** — radio-group semantics: `role=radiogroup` with
|
|
6
|
+
* `role=radio` segments, `aria-checked`, roving tabindex, and Arrow keys that move
|
|
7
|
+
* BOTH focus and selection (WAI-ARIA APG radiogroup). Value = the selected key.
|
|
8
|
+
* - **Multi-select (`multiple`)** — a toolbar of independent toggles: `role=group`
|
|
9
|
+
* with `aria-pressed` buttons; Arrow keys move focus only, Space/Enter toggles the
|
|
10
|
+
* focused one (e.g. B / I / U). Value = an array of the pressed keys.
|
|
11
|
+
*
|
|
12
|
+
* Headless nav is the CDK `listKeyManager` (horizontal, wrap, skip-disabled). Selection
|
|
13
|
+
* state is exposed via the native ARIA attribute (`aria-checked` / `aria-pressed`), so
|
|
14
|
+
* the styling hooks off `[aria-checked=true]` — no state class. Value binding is
|
|
15
|
+
* controlled: pass `value` (a getter) + `onChange`; forms (`use:control`) integration
|
|
16
|
+
* lands with the Checkbox pass that fixes the control-binding convention.
|
|
17
|
+
*
|
|
18
|
+
* import ButtonToggle from '@weave-framework/ui/button-toggle';
|
|
19
|
+
* <ButtonToggle options={{ opts }} value={{ view() }} onChange={{ setView }} />
|
|
20
|
+
* <ButtonToggle multiple options={{ marks }} value={{ active() }} onChange={{ setActive }} />
|
|
21
|
+
*/
|
|
22
|
+
import { type Signal } from '@weave-framework/runtime';
|
|
23
|
+
export interface ButtonToggleOption {
|
|
24
|
+
/** The value this segment carries (what `value`/`onChange` speak in). */
|
|
25
|
+
value: string;
|
|
26
|
+
/** Visible text. Defaults to `value` when omitted. */
|
|
27
|
+
label?: string;
|
|
28
|
+
/** Optional leading icon — a name in the active `<Icon>` registry (Lucide by default). */
|
|
29
|
+
icon?: string;
|
|
30
|
+
/** Disable just this segment (skipped in keyboard nav, not selectable). */
|
|
31
|
+
disabled?: boolean;
|
|
32
|
+
}
|
|
33
|
+
export interface ButtonToggleProps {
|
|
34
|
+
/** The segments, left to right. */
|
|
35
|
+
options: ButtonToggleOption[];
|
|
36
|
+
/** Multi-select (toolbar of toggles) instead of single-select (radio group). */
|
|
37
|
+
multiple?: boolean;
|
|
38
|
+
/** Controlled value: a key (single) or an array of keys (multi). */
|
|
39
|
+
value?: string | string[] | null;
|
|
40
|
+
/** Called with the next value (a key, or the next array) on select/toggle. */
|
|
41
|
+
onChange?: (value: string | string[]) => void;
|
|
42
|
+
/** Disable the whole group. */
|
|
43
|
+
disabled?: boolean;
|
|
44
|
+
/** Accessible name for the group. */
|
|
45
|
+
label?: string;
|
|
46
|
+
/** Extra classes, forwarded onto the container. */
|
|
47
|
+
class?: string;
|
|
48
|
+
}
|
|
49
|
+
export declare const template: string;
|
|
50
|
+
export interface ButtonToggleContext {
|
|
51
|
+
host: Signal<Element | null>;
|
|
52
|
+
options: () => ButtonToggleOption[];
|
|
53
|
+
groupClass: () => string;
|
|
54
|
+
groupRole: () => string;
|
|
55
|
+
segmentRole: () => string | undefined;
|
|
56
|
+
label: () => string | undefined;
|
|
57
|
+
ariaChecked: (opt: ButtonToggleOption) => string | undefined;
|
|
58
|
+
ariaPressed: (opt: ButtonToggleOption) => string | undefined;
|
|
59
|
+
tabindexFor: (opt: ButtonToggleOption) => number;
|
|
60
|
+
isOptionDisabled: (opt: ButtonToggleOption) => boolean;
|
|
61
|
+
activate: (opt: ButtonToggleOption) => void;
|
|
62
|
+
onKeydown: (event: KeyboardEvent) => void;
|
|
63
|
+
}
|
|
64
|
+
export declare function setup(props: ButtonToggleProps): ButtonToggleContext;
|
|
65
|
+
//# sourceMappingURL=button-toggle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button-toggle.d.ts","sourceRoot":"","sources":["../../src/button-toggle/button-toggle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAU,KAAK,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAG/D,MAAM,WAAW,kBAAkB;IACjC,yEAAyE;IACzE,KAAK,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0FAA0F;IAC1F,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,mCAAmC;IACnC,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,gFAAgF;IAChF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;IACjC,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,IAAI,CAAC;IAC9C,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,QAAQ,EAAE,MAYb,CAAC;AAEX,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC7B,OAAO,EAAE,MAAM,kBAAkB,EAAE,CAAC;IACpC,UAAU,EAAE,MAAM,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACtC,KAAK,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IAChC,WAAW,EAAE,CAAC,GAAG,EAAE,kBAAkB,KAAK,MAAM,GAAG,SAAS,CAAC;IAC7D,WAAW,EAAE,CAAC,GAAG,EAAE,kBAAkB,KAAK,MAAM,GAAG,SAAS,CAAC;IAC7D,WAAW,EAAE,CAAC,GAAG,EAAE,kBAAkB,KAAK,MAAM,CAAC;IACjD,gBAAgB,EAAE,CAAC,GAAG,EAAE,kBAAkB,KAAK,OAAO,CAAC;IACvD,QAAQ,EAAE,CAAC,GAAG,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC5C,SAAS,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;CAC3C;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,iBAAiB,GAAG,mBAAmB,CA0FnE"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<ButtonToggle>` — a segmented control (a row of connected buttons where one, or in
|
|
3
|
+
* multi mode several, is "on"). Two modes:
|
|
4
|
+
*
|
|
5
|
+
* - **Single-select (default)** — radio-group semantics: `role=radiogroup` with
|
|
6
|
+
* `role=radio` segments, `aria-checked`, roving tabindex, and Arrow keys that move
|
|
7
|
+
* BOTH focus and selection (WAI-ARIA APG radiogroup). Value = the selected key.
|
|
8
|
+
* - **Multi-select (`multiple`)** — a toolbar of independent toggles: `role=group`
|
|
9
|
+
* with `aria-pressed` buttons; Arrow keys move focus only, Space/Enter toggles the
|
|
10
|
+
* focused one (e.g. B / I / U). Value = an array of the pressed keys.
|
|
11
|
+
*
|
|
12
|
+
* Headless nav is the CDK `listKeyManager` (horizontal, wrap, skip-disabled). Selection
|
|
13
|
+
* state is exposed via the native ARIA attribute (`aria-checked` / `aria-pressed`), so
|
|
14
|
+
* the styling hooks off `[aria-checked=true]` — no state class. Value binding is
|
|
15
|
+
* controlled: pass `value` (a getter) + `onChange`; forms (`use:control`) integration
|
|
16
|
+
* lands with the Checkbox pass that fixes the control-binding convention.
|
|
17
|
+
*
|
|
18
|
+
* import ButtonToggle from '@weave-framework/ui/button-toggle';
|
|
19
|
+
* <ButtonToggle options={{ opts }} value={{ view() }} onChange={{ setView }} />
|
|
20
|
+
* <ButtonToggle multiple options={{ marks }} value={{ active() }} onChange={{ setActive }} />
|
|
21
|
+
*/
|
|
22
|
+
import { signal } from '@weave-framework/runtime';
|
|
23
|
+
import { listKeyManager } from '../cdk/key-manager.js';
|
|
24
|
+
export const template = '<div class={{ groupClass() }} ref={{ host }} role={{ groupRole() }} aria-label={{ label() }}' +
|
|
25
|
+
' on:keydown={{ onKeydown }}>' +
|
|
26
|
+
'@for (opt of options(); track opt.value) {' +
|
|
27
|
+
'<button type="button" class="weave-button-toggle__segment" role={{ segmentRole() }}' +
|
|
28
|
+
' aria-checked={{ ariaChecked(opt) }} aria-pressed={{ ariaPressed(opt) }}' +
|
|
29
|
+
' tabindex={{ tabindexFor(opt) }} disabled={{ isOptionDisabled(opt) }}' +
|
|
30
|
+
' on:click={{ () => activate(opt) }}>' +
|
|
31
|
+
'@if (opt.icon) {<Icon name={{ opt.icon }} />}' +
|
|
32
|
+
'<span class="weave-button-toggle__label">{{ opt.label ?? opt.value }}</span>' +
|
|
33
|
+
'</button>' +
|
|
34
|
+
'}' +
|
|
35
|
+
'</div>';
|
|
36
|
+
export function setup(props) {
|
|
37
|
+
const host = signal(null);
|
|
38
|
+
const options = () => props.options ?? [];
|
|
39
|
+
const multiple = () => !!props.multiple;
|
|
40
|
+
const groupDisabled = () => !!props.disabled;
|
|
41
|
+
const isOptionDisabled = (opt) => groupDisabled() || !!opt.disabled;
|
|
42
|
+
const currentValues = () => (Array.isArray(props.value) ? props.value : []);
|
|
43
|
+
const isSelected = (opt) => multiple() ? currentValues().includes(opt.value) : props.value === opt.value;
|
|
44
|
+
const manager = listKeyManager(options, {
|
|
45
|
+
orientation: 'horizontal',
|
|
46
|
+
wrap: true,
|
|
47
|
+
skipDisabled: true,
|
|
48
|
+
isDisabled: isOptionDisabled,
|
|
49
|
+
});
|
|
50
|
+
const emit = (value) => props.onChange?.(value);
|
|
51
|
+
// The single tabbable segment: the active one (once the keyboard has moved), else
|
|
52
|
+
// the selected one, else the first enabled — so the group always has a tab stop.
|
|
53
|
+
const rovingIndex = () => {
|
|
54
|
+
const active = manager.activeIndex();
|
|
55
|
+
if (active >= 0)
|
|
56
|
+
return active;
|
|
57
|
+
const opts = options();
|
|
58
|
+
const selected = opts.findIndex(isSelected);
|
|
59
|
+
if (selected >= 0)
|
|
60
|
+
return selected;
|
|
61
|
+
const firstEnabled = opts.findIndex((o) => !isOptionDisabled(o));
|
|
62
|
+
return firstEnabled >= 0 ? firstEnabled : 0;
|
|
63
|
+
};
|
|
64
|
+
const focusSegment = (index) => {
|
|
65
|
+
const el = host();
|
|
66
|
+
if (!el)
|
|
67
|
+
return;
|
|
68
|
+
const seg = el.querySelectorAll('.weave-button-toggle__segment')[index];
|
|
69
|
+
seg?.focus();
|
|
70
|
+
};
|
|
71
|
+
const activate = (opt) => {
|
|
72
|
+
if (isOptionDisabled(opt))
|
|
73
|
+
return;
|
|
74
|
+
manager.setActiveItem(opt); // roving tab stop follows the interaction
|
|
75
|
+
if (multiple()) {
|
|
76
|
+
const next = new Set(currentValues());
|
|
77
|
+
if (next.has(opt.value))
|
|
78
|
+
next.delete(opt.value);
|
|
79
|
+
else
|
|
80
|
+
next.add(opt.value);
|
|
81
|
+
emit([...next]);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
emit(opt.value);
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
const onKeydown = (event) => {
|
|
88
|
+
// Sync the manager to the current tab stop before it navigates, so the first Arrow
|
|
89
|
+
// moves relative to the selected/focused segment (not from index 0).
|
|
90
|
+
if (manager.activeIndex() < 0)
|
|
91
|
+
manager.setActiveItem(rovingIndex());
|
|
92
|
+
if (event.key === ' ' || event.key === 'Enter') {
|
|
93
|
+
const opt = options()[manager.activeIndex()];
|
|
94
|
+
if (opt) {
|
|
95
|
+
activate(opt);
|
|
96
|
+
event.preventDefault();
|
|
97
|
+
}
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (manager.onKeydown(event)) {
|
|
101
|
+
event.preventDefault();
|
|
102
|
+
const index = manager.activeIndex();
|
|
103
|
+
focusSegment(index);
|
|
104
|
+
// Radio group: Arrow moves selection too (focus already followed above).
|
|
105
|
+
if (!multiple()) {
|
|
106
|
+
const opt = options()[index];
|
|
107
|
+
if (opt)
|
|
108
|
+
emit(opt.value);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
return {
|
|
113
|
+
host,
|
|
114
|
+
options,
|
|
115
|
+
groupClass: () => (props.class ? `weave-button-toggle ${props.class}` : 'weave-button-toggle'),
|
|
116
|
+
groupRole: () => (multiple() ? 'group' : 'radiogroup'),
|
|
117
|
+
segmentRole: () => (multiple() ? undefined : 'radio'),
|
|
118
|
+
label: () => props.label,
|
|
119
|
+
ariaChecked: (opt) => (multiple() ? undefined : isSelected(opt) ? 'true' : 'false'),
|
|
120
|
+
ariaPressed: (opt) => (multiple() ? (isSelected(opt) ? 'true' : 'false') : undefined),
|
|
121
|
+
tabindexFor: (opt) => (options().indexOf(opt) === rovingIndex() ? 0 : -1),
|
|
122
|
+
isOptionDisabled,
|
|
123
|
+
activate,
|
|
124
|
+
onKeydown,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=button-toggle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button-toggle.js","sourceRoot":"","sources":["../../src/button-toggle/button-toggle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<Card>` — a surface panel (Keyline: 1px border, radius 4px, no shadow). Pure layout:
|
|
3
|
+
* a vertical stack you compose from the part classes, which are the class contract:
|
|
4
|
+
*
|
|
5
|
+
* <Card>
|
|
6
|
+
* <img class="weave-card__media" src="…" alt="…" />
|
|
7
|
+
* <h3 class="weave-card__title">Title</h3>
|
|
8
|
+
* <p class="weave-card__body">Body text.</p>
|
|
9
|
+
* <p class="weave-card__meta">Secondary meta.</p>
|
|
10
|
+
* <div class="weave-card__actions">
|
|
11
|
+
* <Button variant={{ 'marked' }}>Open</Button>
|
|
12
|
+
* <Button variant={{ 'ghost' }}>Dismiss</Button>
|
|
13
|
+
* </div>
|
|
14
|
+
* </Card>
|
|
15
|
+
*
|
|
16
|
+
* No behavior beyond forwarding `class`. `interactive` adds a hover tint — to make the
|
|
17
|
+
* card actually clickable + accessible, wrap its content (or the card) in a link/button.
|
|
18
|
+
*/
|
|
19
|
+
export interface CardProps {
|
|
20
|
+
/** Add a hover tint (for cards that act as a link/button). */
|
|
21
|
+
interactive?: boolean;
|
|
22
|
+
/** Extra classes, forwarded onto the container. */
|
|
23
|
+
class?: string;
|
|
24
|
+
}
|
|
25
|
+
export declare const template: string;
|
|
26
|
+
export interface CardContext {
|
|
27
|
+
cardClass: () => string;
|
|
28
|
+
}
|
|
29
|
+
export declare function setup(props: CardProps): CardContext;
|
|
30
|
+
//# sourceMappingURL=card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card.d.ts","sourceRoot":"","sources":["../../src/card/card.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,WAAW,SAAS;IACxB,8DAA8D;IAC9D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,QAAQ,EAAE,MAA2D,CAAC;AAEnF,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,MAAM,CAAC;CACzB;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,CASnD"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<Card>` — a surface panel (Keyline: 1px border, radius 4px, no shadow). Pure layout:
|
|
3
|
+
* a vertical stack you compose from the part classes, which are the class contract:
|
|
4
|
+
*
|
|
5
|
+
* <Card>
|
|
6
|
+
* <img class="weave-card__media" src="…" alt="…" />
|
|
7
|
+
* <h3 class="weave-card__title">Title</h3>
|
|
8
|
+
* <p class="weave-card__body">Body text.</p>
|
|
9
|
+
* <p class="weave-card__meta">Secondary meta.</p>
|
|
10
|
+
* <div class="weave-card__actions">
|
|
11
|
+
* <Button variant={{ 'marked' }}>Open</Button>
|
|
12
|
+
* <Button variant={{ 'ghost' }}>Dismiss</Button>
|
|
13
|
+
* </div>
|
|
14
|
+
* </Card>
|
|
15
|
+
*
|
|
16
|
+
* No behavior beyond forwarding `class`. `interactive` adds a hover tint — to make the
|
|
17
|
+
* card actually clickable + accessible, wrap its content (or the card) in a link/button.
|
|
18
|
+
*/
|
|
19
|
+
export const template = '<div class={{ cardClass() }}><slot></slot></div>';
|
|
20
|
+
export function setup(props) {
|
|
21
|
+
return {
|
|
22
|
+
cardClass: () => {
|
|
23
|
+
const parts = ['weave-card'];
|
|
24
|
+
if (props.interactive)
|
|
25
|
+
parts.push('weave-card--interactive');
|
|
26
|
+
if (props.class)
|
|
27
|
+
parts.push(props.class);
|
|
28
|
+
return parts.join(' ');
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card.js","sourceRoot":"","sources":["../../src/card/card.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AASH,MAAM,CAAC,MAAM,QAAQ,GAAW,kDAAkD,CAAC;AAMnF,MAAM,UAAU,KAAK,CAAC,KAAgB;IACpC,OAAO;QACL,SAAS,EAAE,GAAW,EAAE;YACtB,MAAM,KAAK,GAAa,CAAC,YAAY,CAAC,CAAC;YACvC,IAAI,KAAK,CAAC,WAAW;gBAAE,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YAC7D,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;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bidi — the reactive text direction for the CDK, signal-native and zero-dep. One
|
|
3
|
+
* global `direction()` signal (seeded from `<html dir>`) backs everything; a subtree
|
|
4
|
+
* can override it via `DirectionContext`. The connected-positioning engine and any
|
|
5
|
+
* direction-aware component read `activeDirection()` so a change (or a provided
|
|
6
|
+
* subtree direction) re-runs their effects with no reload — mirrors the global +
|
|
7
|
+
* context shape of `@weave-framework/i18n` and the icon registry.
|
|
8
|
+
*/
|
|
9
|
+
import { type Context } from '@weave-framework/runtime';
|
|
10
|
+
export type Direction = 'ltr' | 'rtl';
|
|
11
|
+
/** The global text direction. Reactive — read it to subscribe. */
|
|
12
|
+
export declare function direction(): Direction;
|
|
13
|
+
/** Set the global text direction; every consumer re-runs. */
|
|
14
|
+
export declare function setDirection(dir: Direction): void;
|
|
15
|
+
/** Context token: `provide(DirectionContext, 'rtl')` to override the direction within a subtree. */
|
|
16
|
+
export declare const DirectionContext: Context<Direction | undefined>;
|
|
17
|
+
/** The active direction: a context-provided one wins, else the global signal. Reactive. */
|
|
18
|
+
export declare function activeDirection(): Direction;
|
|
19
|
+
//# sourceMappingURL=bidi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bidi.d.ts","sourceRoot":"","sources":["../../src/cdk/bidi.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAA8C,KAAK,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAGpG,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK,CAAC;AAUtC,kEAAkE;AAClE,wBAAgB,SAAS,IAAI,SAAS,CAErC;AAED,6DAA6D;AAC7D,wBAAgB,YAAY,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAEjD;AAED,oGAAoG;AACpG,eAAO,MAAM,gBAAgB,EAAE,OAAO,CAAC,SAAS,GAAG,SAAS,CAAmD,CAAC;AAEhH,2FAA2F;AAC3F,wBAAgB,eAAe,IAAI,SAAS,CAE3C"}
|
package/dist/cdk/bidi.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bidi — the reactive text direction for the CDK, signal-native and zero-dep. One
|
|
3
|
+
* global `direction()` signal (seeded from `<html dir>`) backs everything; a subtree
|
|
4
|
+
* can override it via `DirectionContext`. The connected-positioning engine and any
|
|
5
|
+
* direction-aware component read `activeDirection()` so a change (or a provided
|
|
6
|
+
* subtree direction) re-runs their effects with no reload — mirrors the global +
|
|
7
|
+
* context shape of `@weave-framework/i18n` and the icon registry.
|
|
8
|
+
*/
|
|
9
|
+
import { signal, createContext, inject } from '@weave-framework/runtime';
|
|
10
|
+
import { isBrowser } from './platform.js';
|
|
11
|
+
function initialDirection() {
|
|
12
|
+
if (!isBrowser)
|
|
13
|
+
return 'ltr';
|
|
14
|
+
const dir = document.documentElement.dir || getComputedStyle(document.documentElement).direction;
|
|
15
|
+
return dir === 'rtl' ? 'rtl' : 'ltr';
|
|
16
|
+
}
|
|
17
|
+
const _direction = signal(initialDirection());
|
|
18
|
+
/** The global text direction. Reactive — read it to subscribe. */
|
|
19
|
+
export function direction() {
|
|
20
|
+
return _direction();
|
|
21
|
+
}
|
|
22
|
+
/** Set the global text direction; every consumer re-runs. */
|
|
23
|
+
export function setDirection(dir) {
|
|
24
|
+
_direction.set(dir);
|
|
25
|
+
}
|
|
26
|
+
/** Context token: `provide(DirectionContext, 'rtl')` to override the direction within a subtree. */
|
|
27
|
+
export const DirectionContext = createContext(undefined);
|
|
28
|
+
/** The active direction: a context-provided one wins, else the global signal. Reactive. */
|
|
29
|
+
export function activeDirection() {
|
|
30
|
+
return inject(DirectionContext) ?? _direction();
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=bidi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bidi.js","sourceRoot":"","sources":["../../src/cdk/bidi.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAA6B,MAAM,0BAA0B,CAAC;AACpG,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAI1C,SAAS,gBAAgB;IACvB,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAC7B,MAAM,GAAG,GAAW,QAAQ,CAAC,eAAe,CAAC,GAAG,IAAI,gBAAgB,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,SAAS,CAAC;IACzG,OAAO,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,GAAsB,MAAM,CAAY,gBAAgB,EAAE,CAAC,CAAC;AAE5E,kEAAkE;AAClE,MAAM,UAAU,SAAS;IACvB,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,YAAY,CAAC,GAAc;IACzC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACtB,CAAC;AAED,oGAAoG;AACpG,MAAM,CAAC,MAAM,gBAAgB,GAAmC,aAAa,CAAwB,SAAS,CAAC,CAAC;AAEhH,2FAA2F;AAC3F,MAAM,UAAU,eAAe;IAC7B,OAAO,MAAM,CAAC,gBAAgB,CAAC,IAAI,UAAU,EAAE,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BreakpointObserver — `matchMedia` as a boolean signal, so responsive layout is
|
|
3
|
+
* reactive (a component re-renders when the viewport crosses a breakpoint). SSR-safe:
|
|
4
|
+
* `false` when there's no `matchMedia`. Auto-unsubscribes on owner disposal.
|
|
5
|
+
*
|
|
6
|
+
* Weave's canonical breakpoint is **900px** (`narrow` — README §Responsive); the
|
|
7
|
+
* convenience tiers are provided for apps that want finer control.
|
|
8
|
+
*/
|
|
9
|
+
/** A boolean signal that tracks whether `query` currently matches. */
|
|
10
|
+
export declare function breakpointSignal(query: string): () => boolean;
|
|
11
|
+
/** A non-reactive snapshot of whether `query` matches right now. */
|
|
12
|
+
export declare function matchesBreakpoint(query: string): boolean;
|
|
13
|
+
/** Named media queries — Weave's `Narrow`/`Wide` (900px) plus convenience tiers. */
|
|
14
|
+
export declare const Breakpoints: {
|
|
15
|
+
readonly Narrow: '(max-width: 899px)';
|
|
16
|
+
readonly Wide: '(min-width: 900px)';
|
|
17
|
+
readonly Handset: '(max-width: 599px)';
|
|
18
|
+
readonly Tablet: '(min-width: 600px) and (max-width: 1023px)';
|
|
19
|
+
readonly Desktop: '(min-width: 1024px)';
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=breakpoints.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"breakpoints.d.ts","sourceRoot":"","sources":["../../src/cdk/breakpoints.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,sEAAsE;AACtE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,OAAO,CAa7D;AAED,oEAAoE;AACpE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,oFAAoF;AACpF,eAAO,MAAM,WAAW,EAAE;IACxB,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;IACtC,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,4CAA4C,CAAC;IAC9D,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;CAQhC,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BreakpointObserver — `matchMedia` as a boolean signal, so responsive layout is
|
|
3
|
+
* reactive (a component re-renders when the viewport crosses a breakpoint). SSR-safe:
|
|
4
|
+
* `false` when there's no `matchMedia`. Auto-unsubscribes on owner disposal.
|
|
5
|
+
*
|
|
6
|
+
* Weave's canonical breakpoint is **900px** (`narrow` — README §Responsive); the
|
|
7
|
+
* convenience tiers are provided for apps that want finer control.
|
|
8
|
+
*/
|
|
9
|
+
import { signal, onDispose } from '@weave-framework/runtime';
|
|
10
|
+
import { isBrowser } from './platform.js';
|
|
11
|
+
/** A boolean signal that tracks whether `query` currently matches. */
|
|
12
|
+
export function breakpointSignal(query) {
|
|
13
|
+
if (!isBrowser || typeof matchMedia !== 'function') {
|
|
14
|
+
const off = signal(false);
|
|
15
|
+
return () => off();
|
|
16
|
+
}
|
|
17
|
+
const mql = matchMedia(query);
|
|
18
|
+
const state = signal(mql.matches);
|
|
19
|
+
const onChange = () => {
|
|
20
|
+
state.set(mql.matches);
|
|
21
|
+
};
|
|
22
|
+
mql.addEventListener('change', onChange);
|
|
23
|
+
onDispose(() => mql.removeEventListener('change', onChange));
|
|
24
|
+
return () => state();
|
|
25
|
+
}
|
|
26
|
+
/** A non-reactive snapshot of whether `query` matches right now. */
|
|
27
|
+
export function matchesBreakpoint(query) {
|
|
28
|
+
return isBrowser && typeof matchMedia === 'function' ? matchMedia(query).matches : false;
|
|
29
|
+
}
|
|
30
|
+
/** Named media queries — Weave's `Narrow`/`Wide` (900px) plus convenience tiers. */
|
|
31
|
+
export const Breakpoints = {
|
|
32
|
+
/** Weave `narrow` state (single-column reflow). */
|
|
33
|
+
Narrow: '(max-width: 899px)',
|
|
34
|
+
Wide: '(min-width: 900px)',
|
|
35
|
+
Handset: '(max-width: 599px)',
|
|
36
|
+
Tablet: '(min-width: 600px) and (max-width: 1023px)',
|
|
37
|
+
Desktop: '(min-width: 1024px)',
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=breakpoints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"breakpoints.js","sourceRoot":"","sources":["../../src/cdk/breakpoints.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,EAAE,SAAS,EAAe,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,sEAAsE;AACtE,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,IAAI,CAAC,SAAS,IAAI,OAAO,UAAU,KAAK,UAAU,EAAE,CAAC;QACnD,MAAM,GAAG,GAAoB,MAAM,CAAU,KAAK,CAAC,CAAC;QACpD,OAAO,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;IACrB,CAAC;IACD,MAAM,GAAG,GAAmB,UAAU,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAoB,MAAM,CAAU,GAAG,CAAC,OAAO,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,GAAS,EAAE;QAC1B,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC,CAAC;IACF,GAAG,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACzC,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC7D,OAAO,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;AACvB,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAO,SAAS,IAAI,OAAO,UAAU,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AAC3F,CAAC;AAED,oFAAoF;AACpF,MAAM,CAAC,MAAM,WAAW,GAMpB;IACF,mDAAmD;IACnD,MAAM,EAAE,oBAAoB;IAC5B,IAAI,EAAE,oBAAoB;IAC1B,OAAO,EAAE,oBAAoB;IAC7B,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,qBAAqB;CACtB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Clipboard — copy text with the async Clipboard API, falling back to a hidden
|
|
3
|
+
* `<textarea>` + `execCommand('copy')` where the API is unavailable or blocked.
|
|
4
|
+
* Returns whether the copy succeeded. Zero-dep.
|
|
5
|
+
*/
|
|
6
|
+
/** Copy `text` to the clipboard. Resolves `true` on success, `false` otherwise. */
|
|
7
|
+
export declare function copy(text: string): Promise<boolean>;
|
|
8
|
+
//# sourceMappingURL=clipboard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clipboard.d.ts","sourceRoot":"","sources":["../../src/cdk/clipboard.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,mFAAmF;AACnF,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUzD"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Clipboard — copy text with the async Clipboard API, falling back to a hidden
|
|
3
|
+
* `<textarea>` + `execCommand('copy')` where the API is unavailable or blocked.
|
|
4
|
+
* Returns whether the copy succeeded. Zero-dep.
|
|
5
|
+
*/
|
|
6
|
+
/** Copy `text` to the clipboard. Resolves `true` on success, `false` otherwise. */
|
|
7
|
+
export async function copy(text) {
|
|
8
|
+
if (typeof navigator !== 'undefined' && navigator.clipboard && typeof navigator.clipboard.writeText === 'function') {
|
|
9
|
+
try {
|
|
10
|
+
await navigator.clipboard.writeText(text);
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
// Permission denied / not focused — fall back below.
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return legacyCopy(text);
|
|
18
|
+
}
|
|
19
|
+
function legacyCopy(text) {
|
|
20
|
+
if (typeof document === 'undefined')
|
|
21
|
+
return false;
|
|
22
|
+
const textarea = document.createElement('textarea');
|
|
23
|
+
textarea.value = text;
|
|
24
|
+
textarea.setAttribute('readonly', '');
|
|
25
|
+
textarea.style.cssText = 'position:fixed;top:0;left:0;opacity:0;pointer-events:none;';
|
|
26
|
+
document.body.appendChild(textarea);
|
|
27
|
+
textarea.select();
|
|
28
|
+
let ok = false;
|
|
29
|
+
try {
|
|
30
|
+
ok = document.execCommand('copy');
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
ok = false;
|
|
34
|
+
}
|
|
35
|
+
textarea.remove();
|
|
36
|
+
return ok;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=clipboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clipboard.js","sourceRoot":"","sources":["../../src/cdk/clipboard.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,mFAAmF;AACnF,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAY;IACrC,IAAI,OAAO,SAAS,KAAK,WAAW,IAAI,SAAS,CAAC,SAAS,IAAI,OAAO,SAAS,CAAC,SAAS,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;QACnH,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,qDAAqD;QACvD,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IAClD,MAAM,QAAQ,GAAwB,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IACzE,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC;IACtB,QAAQ,CAAC,YAAY,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACtC,QAAQ,CAAC,KAAK,CAAC,OAAO,GAAG,4DAA4D,CAAC;IACtF,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,GAAY,KAAK,CAAC;IACxB,IAAI,CAAC;QACH,EAAE,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,EAAE,GAAG,KAAK,CAAC;IACb,CAAC;IACD,QAAQ,CAAC,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DataSource — the collection-viewer contract a Table/Tree consumes so paging, sorting,
|
|
3
|
+
* filtering and virtualization can be swapped underneath without the component knowing.
|
|
4
|
+
* A component calls `connect()` to get a **read-only signal of the rows to render** and
|
|
5
|
+
* `disconnect()` to release resources; the concrete source (a static array, a signal, a
|
|
6
|
+
* paged fetcher…) lives behind the interface. Signal-native — our streams are signals,
|
|
7
|
+
* not RxJS. Zero-dep.
|
|
8
|
+
*
|
|
9
|
+
* const ds = new ArrayDataSource(rows); // rows: T[] | Signal<T[]>
|
|
10
|
+
* const view = ds.connect(); // () => T[] (reactive, read-only)
|
|
11
|
+
* effect(() => render(view()));
|
|
12
|
+
* // …later: ds.disconnect();
|
|
13
|
+
*/
|
|
14
|
+
import { type Computed, type Signal } from '@weave-framework/runtime';
|
|
15
|
+
/** The window of rows a viewer currently needs (drives virtual scroll). All optional. */
|
|
16
|
+
export interface CollectionViewer {
|
|
17
|
+
/** The rendered index range the viewer needs, as a signal — for virtual scrolling. */
|
|
18
|
+
viewChange?: Computed<{
|
|
19
|
+
start: number;
|
|
20
|
+
end: number;
|
|
21
|
+
}>;
|
|
22
|
+
}
|
|
23
|
+
export interface DataSource<T> {
|
|
24
|
+
/** Connect a viewer; returns a read-only reactive signal of the rows to render. */
|
|
25
|
+
connect(viewer?: CollectionViewer): Computed<T[]>;
|
|
26
|
+
/** Disconnect the viewer and release any resources held for it. */
|
|
27
|
+
disconnect(viewer?: CollectionViewer): void;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* The trivial concrete DataSource — wraps a static array OR a signal/getter of rows. When
|
|
31
|
+
* given a signal, reactive updates propagate straight through `connect()`.
|
|
32
|
+
*/
|
|
33
|
+
export declare class ArrayDataSource<T> implements DataSource<T> {
|
|
34
|
+
private readonly view;
|
|
35
|
+
constructor(source: T[] | Computed<T[]> | Signal<T[]>);
|
|
36
|
+
connect(): Computed<T[]>;
|
|
37
|
+
disconnect(): void;
|
|
38
|
+
}
|
|
39
|
+
/** True when `value` implements the DataSource contract (vs a plain array/signal). */
|
|
40
|
+
export declare function isDataSource<T>(value: unknown): value is DataSource<T>;
|
|
41
|
+
//# sourceMappingURL=data-source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-source.d.ts","sourceRoot":"","sources":["../../src/cdk/data-source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAEtE,yFAAyF;AACzF,MAAM,WAAW,gBAAgB;IAC/B,sFAAsF;IACtF,UAAU,CAAC,EAAE,QAAQ,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACvD;AAED,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,mFAAmF;IACnF,OAAO,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;IAClD,mEAAmE;IACnE,UAAU,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC7C;AAED;;;GAGG;AACH,qBAAa,eAAe,CAAC,CAAC,CAAE,YAAW,UAAU,CAAC,CAAC,CAAC;IACtD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgB;gBAEzB,MAAM,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC;IAIrD,OAAO,IAAI,QAAQ,CAAC,CAAC,EAAE,CAAC;IAIxB,UAAU,IAAI,IAAI;CAGnB;AAED,sFAAsF;AACtF,wBAAgB,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC,CAMtE"}
|