@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,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `use:popoverEdit` — inline editing of any element's value in a small **non-modal** overlay
|
|
3
|
+
* (the spreadsheet "click a cell → edit in place" gesture). Attaches to a host (a table cell,
|
|
4
|
+
* a label, …); activating it (click / Enter / F2) opens a CDK-overlay popover — the U3 overlay
|
|
5
|
+
* republic chrome — containing an editor seeded with the current value. **Enter or click-away
|
|
6
|
+
* commit** (`onCommit`), **Esc cancels** (restores). Focus moves into the editor on open and
|
|
7
|
+
* back to the host on close.
|
|
8
|
+
*
|
|
9
|
+
* The default editor is a text field sharing Input's underline (the shared `field-underline`
|
|
10
|
+
* helper — RULE #1, one field look); a custom `editor` factory can supply a Select/date/etc.
|
|
11
|
+
*
|
|
12
|
+
* <td use:popoverEdit={{ { value: () => row.name, onCommit: (v) => rename(row, v) } }}>{{ row.name }}</td>
|
|
13
|
+
*/
|
|
14
|
+
import { createOverlay, connectedPosition } from '../cdk/index.js';
|
|
15
|
+
import { buildPositions } from '../shared/positions.js';
|
|
16
|
+
function disabledOf(d) {
|
|
17
|
+
return typeof d === 'function' ? d() : !!d;
|
|
18
|
+
}
|
|
19
|
+
/** Attach inline popover editing to `host`. Returns a ref (also a cleanup contract for Weave). */
|
|
20
|
+
export function popoverEdit(host, config) {
|
|
21
|
+
let overlay = null;
|
|
22
|
+
let editor = null;
|
|
23
|
+
host.setAttribute('aria-haspopup', 'dialog');
|
|
24
|
+
const buildDefaultEditor = (value) => {
|
|
25
|
+
const input = document.createElement('input');
|
|
26
|
+
input.type = 'text';
|
|
27
|
+
input.className = 'weave-popover-edit__input';
|
|
28
|
+
input.value = value;
|
|
29
|
+
if (config.placeholder)
|
|
30
|
+
input.placeholder = config.placeholder;
|
|
31
|
+
if (config.label)
|
|
32
|
+
input.setAttribute('aria-label', config.label);
|
|
33
|
+
return { element: input, read: () => input.value, focusTarget: input };
|
|
34
|
+
};
|
|
35
|
+
function open() {
|
|
36
|
+
if (overlay || disabledOf(config.disabled))
|
|
37
|
+
return;
|
|
38
|
+
const panel = document.createElement('div');
|
|
39
|
+
panel.className = 'weave-popover-edit';
|
|
40
|
+
panel.setAttribute('role', 'dialog');
|
|
41
|
+
panel.setAttribute('aria-label', config.label ?? 'Edit');
|
|
42
|
+
editor = (config.editor ?? buildDefaultEditor)(config.value());
|
|
43
|
+
panel.appendChild(editor.element);
|
|
44
|
+
panel.addEventListener('keydown', onPanelKeydown);
|
|
45
|
+
overlay = createOverlay({
|
|
46
|
+
hasBackdrop: true,
|
|
47
|
+
backdropClass: 'weave-overlay-backdrop--transparent',
|
|
48
|
+
positionStrategy: connectedPosition(host, { positions: buildPositions(config.position, 'bottom-start'), offset: 4 }),
|
|
49
|
+
});
|
|
50
|
+
overlay.onBackdropClick(() => commit()); // click-away commits (spreadsheet feel)
|
|
51
|
+
overlay.attach(panel);
|
|
52
|
+
host.setAttribute('aria-expanded', 'true');
|
|
53
|
+
const focusEl = editor.focusTarget ?? editor.element;
|
|
54
|
+
focusEl.focus();
|
|
55
|
+
if (focusEl instanceof HTMLInputElement)
|
|
56
|
+
focusEl.select();
|
|
57
|
+
}
|
|
58
|
+
function teardown(returnFocus) {
|
|
59
|
+
overlay?.detach();
|
|
60
|
+
overlay?.dispose();
|
|
61
|
+
overlay = null;
|
|
62
|
+
editor = null;
|
|
63
|
+
host.setAttribute('aria-expanded', 'false');
|
|
64
|
+
if (returnFocus)
|
|
65
|
+
host.focus();
|
|
66
|
+
}
|
|
67
|
+
function commit() {
|
|
68
|
+
if (!overlay || !editor)
|
|
69
|
+
return;
|
|
70
|
+
const next = editor.read();
|
|
71
|
+
teardown(true);
|
|
72
|
+
config.onCommit(next);
|
|
73
|
+
}
|
|
74
|
+
function cancel() {
|
|
75
|
+
if (!overlay)
|
|
76
|
+
return;
|
|
77
|
+
teardown(true);
|
|
78
|
+
}
|
|
79
|
+
function onPanelKeydown(event) {
|
|
80
|
+
if (event.key === 'Enter') {
|
|
81
|
+
event.preventDefault();
|
|
82
|
+
commit();
|
|
83
|
+
}
|
|
84
|
+
else if (event.key === 'Escape') {
|
|
85
|
+
event.preventDefault();
|
|
86
|
+
cancel();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
const onHostClick = () => open();
|
|
90
|
+
const onHostKeydown = (event) => {
|
|
91
|
+
if (event.key === 'Enter' || event.key === 'F2') {
|
|
92
|
+
event.preventDefault();
|
|
93
|
+
open();
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
host.addEventListener('click', onHostClick);
|
|
97
|
+
host.addEventListener('keydown', onHostKeydown);
|
|
98
|
+
const destroy = () => {
|
|
99
|
+
teardown(false);
|
|
100
|
+
host.removeEventListener('click', onHostClick);
|
|
101
|
+
host.removeEventListener('keydown', onHostKeydown);
|
|
102
|
+
host.removeAttribute('aria-haspopup');
|
|
103
|
+
host.removeAttribute('aria-expanded');
|
|
104
|
+
};
|
|
105
|
+
return { open, close: () => cancel(), destroy };
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=popover-edit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"popover-edit.js","sourceRoot":"","sources":["../../src/popover-edit/popover-edit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<ProgressBar>` — a thin horizontal progress indicator (Weave: 4px `field` track,
|
|
3
|
+
* accent fill). Two modes:
|
|
4
|
+
*
|
|
5
|
+
* - **Determinate (default)** — an accent fill grows to `value`% (0–100, clamped).
|
|
6
|
+
* `role=progressbar` with `aria-valuemin/max/now`.
|
|
7
|
+
* - **Indeterminate (`indeterminate`)** — a sliding accent segment for work of unknown
|
|
8
|
+
* length; `aria-valuenow` is omitted (only min/max remain), per WAI-ARIA.
|
|
9
|
+
*
|
|
10
|
+
* import ProgressBar from '@weave-framework/ui/progress-bar';
|
|
11
|
+
* <ProgressBar value={{ pct() }} />
|
|
12
|
+
* <ProgressBar indeterminate label={{ 'Loading' }} />
|
|
13
|
+
*/
|
|
14
|
+
export interface ProgressBarProps {
|
|
15
|
+
/** Completion 0–100 (clamped). Ignored when `indeterminate`. Default 0. */
|
|
16
|
+
value?: number;
|
|
17
|
+
/** Unknown-length work: a sliding segment, no `aria-valuenow`. */
|
|
18
|
+
indeterminate?: boolean;
|
|
19
|
+
/** Accessible name for the bar. */
|
|
20
|
+
label?: string;
|
|
21
|
+
/** Extra classes, forwarded onto the container. */
|
|
22
|
+
class?: string;
|
|
23
|
+
}
|
|
24
|
+
export declare const template: string;
|
|
25
|
+
export interface ProgressBarContext {
|
|
26
|
+
barClass: () => string;
|
|
27
|
+
valueNow: () => number | undefined;
|
|
28
|
+
fillStyle: () => string | undefined;
|
|
29
|
+
label: () => string | undefined;
|
|
30
|
+
}
|
|
31
|
+
export declare function setup(props: ProgressBarProps): ProgressBarContext;
|
|
32
|
+
//# sourceMappingURL=progress-bar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress-bar.d.ts","sourceRoot":"","sources":["../../src/progress-bar/progress-bar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,QAAQ,EAAE,MAIb,CAAC;AAEX,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACnC,SAAS,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACpC,KAAK,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;CACjC;AAQD,wBAAgB,KAAK,CAAC,KAAK,EAAE,gBAAgB,GAAG,kBAAkB,CAejE"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<ProgressBar>` — a thin horizontal progress indicator (Weave: 4px `field` track,
|
|
3
|
+
* accent fill). Two modes:
|
|
4
|
+
*
|
|
5
|
+
* - **Determinate (default)** — an accent fill grows to `value`% (0–100, clamped).
|
|
6
|
+
* `role=progressbar` with `aria-valuemin/max/now`.
|
|
7
|
+
* - **Indeterminate (`indeterminate`)** — a sliding accent segment for work of unknown
|
|
8
|
+
* length; `aria-valuenow` is omitted (only min/max remain), per WAI-ARIA.
|
|
9
|
+
*
|
|
10
|
+
* import ProgressBar from '@weave-framework/ui/progress-bar';
|
|
11
|
+
* <ProgressBar value={{ pct() }} />
|
|
12
|
+
* <ProgressBar indeterminate label={{ 'Loading' }} />
|
|
13
|
+
*/
|
|
14
|
+
export const template = '<div class={{ barClass() }} role="progressbar" aria-valuemin="0" aria-valuemax="100"' +
|
|
15
|
+
' aria-valuenow={{ valueNow() }} aria-label={{ label() }}>' +
|
|
16
|
+
'<div class="weave-progress-bar__fill" style={{ fillStyle() }}></div>' +
|
|
17
|
+
'</div>';
|
|
18
|
+
/** Clamp to 0–100; non-finite → 0. */
|
|
19
|
+
function clampPct(value) {
|
|
20
|
+
if (typeof value !== 'number' || !Number.isFinite(value))
|
|
21
|
+
return 0;
|
|
22
|
+
return Math.min(100, Math.max(0, value));
|
|
23
|
+
}
|
|
24
|
+
export function setup(props) {
|
|
25
|
+
const indeterminate = () => !!props.indeterminate;
|
|
26
|
+
return {
|
|
27
|
+
barClass: () => {
|
|
28
|
+
const parts = ['weave-progress-bar'];
|
|
29
|
+
if (indeterminate())
|
|
30
|
+
parts.push('weave-progress-bar--indeterminate');
|
|
31
|
+
if (props.class)
|
|
32
|
+
parts.push(props.class);
|
|
33
|
+
return parts.join(' ');
|
|
34
|
+
},
|
|
35
|
+
// Omit aria-valuenow while indeterminate (WAI-ARIA: value is unknown).
|
|
36
|
+
valueNow: () => (indeterminate() ? undefined : clampPct(props.value)),
|
|
37
|
+
// Determinate drives the fill width inline; indeterminate lets the keyframes drive it.
|
|
38
|
+
fillStyle: () => (indeterminate() ? undefined : `width: ${clampPct(props.value)}%`),
|
|
39
|
+
label: () => props.label,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=progress-bar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress-bar.js","sourceRoot":"","sources":["../../src/progress-bar/progress-bar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAaH,MAAM,CAAC,MAAM,QAAQ,GACnB,sFAAsF;IACtF,2DAA2D;IAC3D,sEAAsE;IACtE,QAAQ,CAAC;AASX,sCAAsC;AACtC,SAAS,QAAQ,CAAC,KAAyB;IACzC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACnE,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,KAAuB;IAC3C,MAAM,aAAa,GAAG,GAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC;IAC3D,OAAO;QACL,QAAQ,EAAE,GAAW,EAAE;YACrB,MAAM,KAAK,GAAa,CAAC,oBAAoB,CAAC,CAAC;YAC/C,IAAI,aAAa,EAAE;gBAAE,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;YACrE,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,uEAAuE;QACvE,QAAQ,EAAE,GAAuB,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACzF,uFAAuF;QACvF,SAAS,EAAE,GAAuB,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;QACvG,KAAK,EAAE,GAAuB,EAAE,CAAC,KAAK,CAAC,KAAK;KAC7C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<ProgressSpinner>` — an indeterminate spinning ring (Weave: a `field` ring with an
|
|
3
|
+
* accent top arc, rotating `.8s linear infinite`). Two sizes: default 26px, `--small`
|
|
4
|
+
* 18px. Pure CSS + a size prop — `role=progressbar` with no `aria-valuenow` (the work
|
|
5
|
+
* is of unknown length).
|
|
6
|
+
*
|
|
7
|
+
* import ProgressSpinner from '@weave-framework/ui/progress-spinner';
|
|
8
|
+
* <ProgressSpinner label={{ 'Loading' }} />
|
|
9
|
+
* <ProgressSpinner small />
|
|
10
|
+
*/
|
|
11
|
+
export interface ProgressSpinnerProps {
|
|
12
|
+
/** The compact 18px ring instead of the default 26px. */
|
|
13
|
+
small?: boolean;
|
|
14
|
+
/** Accessible name for the spinner. */
|
|
15
|
+
label?: string;
|
|
16
|
+
/** Extra classes, forwarded onto the ring. */
|
|
17
|
+
class?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare const template: string;
|
|
20
|
+
export interface ProgressSpinnerContext {
|
|
21
|
+
spinnerClass: () => string;
|
|
22
|
+
label: () => string | undefined;
|
|
23
|
+
}
|
|
24
|
+
export declare function setup(props: ProgressSpinnerProps): ProgressSpinnerContext;
|
|
25
|
+
//# sourceMappingURL=progress-spinner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress-spinner.d.ts","sourceRoot":"","sources":["../../src/progress-spinner/progress-spinner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,oBAAoB;IACnC,yDAAyD;IACzD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,QAAQ,EAAE,MAC+D,CAAC;AAEvF,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,KAAK,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;CACjC;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,oBAAoB,GAAG,sBAAsB,CAUzE"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<ProgressSpinner>` — an indeterminate spinning ring (Weave: a `field` ring with an
|
|
3
|
+
* accent top arc, rotating `.8s linear infinite`). Two sizes: default 26px, `--small`
|
|
4
|
+
* 18px. Pure CSS + a size prop — `role=progressbar` with no `aria-valuenow` (the work
|
|
5
|
+
* is of unknown length).
|
|
6
|
+
*
|
|
7
|
+
* import ProgressSpinner from '@weave-framework/ui/progress-spinner';
|
|
8
|
+
* <ProgressSpinner label={{ 'Loading' }} />
|
|
9
|
+
* <ProgressSpinner small />
|
|
10
|
+
*/
|
|
11
|
+
export const template = '<div class={{ spinnerClass() }} role="progressbar" aria-label={{ label() }}></div>';
|
|
12
|
+
export function setup(props) {
|
|
13
|
+
return {
|
|
14
|
+
spinnerClass: () => {
|
|
15
|
+
const parts = ['weave-progress-spinner'];
|
|
16
|
+
if (props.small)
|
|
17
|
+
parts.push('weave-progress-spinner--small');
|
|
18
|
+
if (props.class)
|
|
19
|
+
parts.push(props.class);
|
|
20
|
+
return parts.join(' ');
|
|
21
|
+
},
|
|
22
|
+
label: () => props.label,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=progress-spinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress-spinner.js","sourceRoot":"","sources":["../../src/progress-spinner/progress-spinner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAWH,MAAM,CAAC,MAAM,QAAQ,GACnB,oFAAoF,CAAC;AAOvF,MAAM,UAAU,KAAK,CAAC,KAA2B;IAC/C,OAAO;QACL,YAAY,EAAE,GAAW,EAAE;YACzB,MAAM,KAAK,GAAa,CAAC,wBAAwB,CAAC,CAAC;YACnD,IAAI,KAAK,CAAC,KAAK;gBAAE,KAAK,CAAC,IAAI,CAAC,+BAA+B,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;QACD,KAAK,EAAE,GAAuB,EAAE,CAAC,KAAK,CAAC,KAAK;KAC7C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<RadioGroup>` — a single-select group of real `<input type=radio>` (Weave: a 20px
|
|
3
|
+
* circle, off = 1.5px ring, on = accent ring + an 8px accent dot). Items-prop API like
|
|
4
|
+
* `<ButtonToggle>` (leaner + more testable than a compound `<Radio>` child API). The
|
|
5
|
+
* inputs share a native `name`, so the browser gives **arrow-key navigation + roving
|
|
6
|
+
* tabindex + single-selection for free** — this component adds only value/forms binding
|
|
7
|
+
* and the visual.
|
|
8
|
+
*
|
|
9
|
+
* Binding follows the **Weave form-control convention** set by Checkbox (here the value
|
|
10
|
+
* is the selected key, a `string`):
|
|
11
|
+
* - **Signal**: `value` (a getter) + `onChange`.
|
|
12
|
+
* - **Forms**: `control` — a structurally-typed `Field<string>` (a real
|
|
13
|
+
* `@weave-framework/forms` Field satisfies it; `@weave-framework/ui` stays decoupled).
|
|
14
|
+
* `control` drives the value two-way, marks `touched` on blur, and reflects
|
|
15
|
+
* `aria-invalid` on the group while touched **and** invalid. `control` wins over
|
|
16
|
+
* `value`/`onChange`.
|
|
17
|
+
*
|
|
18
|
+
* import RadioGroup from '@weave-framework/ui/radio';
|
|
19
|
+
* <RadioGroup options={{ plans }} value={{ plan() }} onChange={{ setPlan }} label={{ 'Plan' }} />
|
|
20
|
+
* <RadioGroup options={{ plans }} control={{ form.controls.plan }} />
|
|
21
|
+
*/
|
|
22
|
+
import { type Signal } from '@weave-framework/runtime';
|
|
23
|
+
/** The subset of a `@weave-framework/forms` `Field<string>` a radio group binds to. */
|
|
24
|
+
export interface RadioControl {
|
|
25
|
+
value: Signal<string>;
|
|
26
|
+
touched?: Signal<boolean>;
|
|
27
|
+
error?: () => string | null;
|
|
28
|
+
}
|
|
29
|
+
export interface RadioOption {
|
|
30
|
+
/** The value this radio carries (what `value`/`onChange` speak in). */
|
|
31
|
+
value: string;
|
|
32
|
+
/** Visible text. Defaults to `value` when omitted. */
|
|
33
|
+
label?: string;
|
|
34
|
+
/** Disable just this radio. */
|
|
35
|
+
disabled?: boolean;
|
|
36
|
+
}
|
|
37
|
+
export interface RadioGroupProps {
|
|
38
|
+
/** The radios, top to bottom. */
|
|
39
|
+
options: RadioOption[];
|
|
40
|
+
/** Controlled selected value (a getter). Ignored when `control` is set. */
|
|
41
|
+
value?: string | null;
|
|
42
|
+
/** Called with the next value on select. Ignored when `control` is set. */
|
|
43
|
+
onChange?: (value: string) => void;
|
|
44
|
+
/** A forms `Field<string>` — two-way value + touched-on-blur + aria-invalid. */
|
|
45
|
+
control?: RadioControl;
|
|
46
|
+
/** Shared native `name` (auto-generated if omitted). */
|
|
47
|
+
name?: string;
|
|
48
|
+
/** Disable the whole group. */
|
|
49
|
+
disabled?: boolean;
|
|
50
|
+
/** Accessible name for the group. */
|
|
51
|
+
label?: string;
|
|
52
|
+
/** Extra classes, forwarded onto the group container. */
|
|
53
|
+
class?: string;
|
|
54
|
+
}
|
|
55
|
+
export declare const template: string;
|
|
56
|
+
export interface RadioGroupContext {
|
|
57
|
+
root: Signal<HTMLElement | null>;
|
|
58
|
+
options: () => RadioOption[];
|
|
59
|
+
groupClass: () => string;
|
|
60
|
+
label: () => string | undefined;
|
|
61
|
+
name: () => string;
|
|
62
|
+
isSelected: (opt: RadioOption) => boolean;
|
|
63
|
+
isOptionDisabled: (opt: RadioOption) => boolean;
|
|
64
|
+
onNativeChange: (event: Event) => void;
|
|
65
|
+
onFocusOut: () => void;
|
|
66
|
+
}
|
|
67
|
+
export declare function setup(props: RadioGroupProps): RadioGroupContext;
|
|
68
|
+
//# sourceMappingURL=radio.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"radio.d.ts","sourceRoot":"","sources":["../../src/radio/radio.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAkB,KAAK,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAEvE,uFAAuF;AACvF,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,iCAAiC;IACjC,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,gFAAgF;IAChF,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,wDAAwD;IACxD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID,eAAO,MAAM,QAAQ,EAAE,MAWb,CAAC;AAEX,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,WAAW,EAAE,CAAC;IAC7B,UAAU,EAAE,MAAM,MAAM,CAAC;IACzB,KAAK,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IAChC,IAAI,EAAE,MAAM,MAAM,CAAC;IACnB,UAAU,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC;IAC1C,gBAAgB,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC;IAChD,cAAc,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACvC,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,eAAe,GAAG,iBAAiB,CA4C/D"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<RadioGroup>` — a single-select group of real `<input type=radio>` (Weave: a 20px
|
|
3
|
+
* circle, off = 1.5px ring, on = accent ring + an 8px accent dot). Items-prop API like
|
|
4
|
+
* `<ButtonToggle>` (leaner + more testable than a compound `<Radio>` child API). The
|
|
5
|
+
* inputs share a native `name`, so the browser gives **arrow-key navigation + roving
|
|
6
|
+
* tabindex + single-selection for free** — this component adds only value/forms binding
|
|
7
|
+
* and the visual.
|
|
8
|
+
*
|
|
9
|
+
* Binding follows the **Weave form-control convention** set by Checkbox (here the value
|
|
10
|
+
* is the selected key, a `string`):
|
|
11
|
+
* - **Signal**: `value` (a getter) + `onChange`.
|
|
12
|
+
* - **Forms**: `control` — a structurally-typed `Field<string>` (a real
|
|
13
|
+
* `@weave-framework/forms` Field satisfies it; `@weave-framework/ui` stays decoupled).
|
|
14
|
+
* `control` drives the value two-way, marks `touched` on blur, and reflects
|
|
15
|
+
* `aria-invalid` on the group while touched **and** invalid. `control` wins over
|
|
16
|
+
* `value`/`onChange`.
|
|
17
|
+
*
|
|
18
|
+
* import RadioGroup from '@weave-framework/ui/radio';
|
|
19
|
+
* <RadioGroup options={{ plans }} value={{ plan() }} onChange={{ setPlan }} label={{ 'Plan' }} />
|
|
20
|
+
* <RadioGroup options={{ plans }} control={{ form.controls.plan }} />
|
|
21
|
+
*/
|
|
22
|
+
import { signal, effect } from '@weave-framework/runtime';
|
|
23
|
+
let _uid = 0;
|
|
24
|
+
export const template = '<div class={{ groupClass() }} ref={{ root }} role="radiogroup" aria-label={{ label() }}' +
|
|
25
|
+
' on:change={{ onNativeChange }} on:focusout={{ onFocusOut }}>' +
|
|
26
|
+
'@for (opt of options(); track opt.value) {' +
|
|
27
|
+
'<label class="weave-radio">' +
|
|
28
|
+
'<input type="radio" class="weave-radio__input" name={{ name() }} value={{ opt.value }}' +
|
|
29
|
+
' .checked={{ isSelected(opt) }} disabled={{ isOptionDisabled(opt) }} />' +
|
|
30
|
+
'<span class="weave-radio__box" aria-hidden="true"></span>' +
|
|
31
|
+
'<span class="weave-radio__label">{{ opt.label ?? opt.value }}</span>' +
|
|
32
|
+
'</label>' +
|
|
33
|
+
'}' +
|
|
34
|
+
'</div>';
|
|
35
|
+
export function setup(props) {
|
|
36
|
+
const root = signal(null);
|
|
37
|
+
const groupName = props.name ?? `weave-radio-${(_uid += 1)}`;
|
|
38
|
+
const options = () => props.options ?? [];
|
|
39
|
+
const groupDisabled = () => !!props.disabled;
|
|
40
|
+
const isOptionDisabled = (opt) => groupDisabled() || !!opt.disabled;
|
|
41
|
+
const currentValue = () => (props.control ? props.control.value() : props.value ?? null);
|
|
42
|
+
// Source → DOM per input, via a `.checked` property binding in the template (each
|
|
43
|
+
// input binds itself, so it's reactive and needs no post-render child query).
|
|
44
|
+
const isSelected = (opt) => currentValue() === opt.value;
|
|
45
|
+
// Forms validity → aria-invalid on the group (touched AND invalid).
|
|
46
|
+
effect(() => {
|
|
47
|
+
const el = root();
|
|
48
|
+
if (!el)
|
|
49
|
+
return;
|
|
50
|
+
const c = props.control;
|
|
51
|
+
if (c && c.touched?.() && c.error?.())
|
|
52
|
+
el.setAttribute('aria-invalid', 'true');
|
|
53
|
+
else
|
|
54
|
+
el.removeAttribute('aria-invalid');
|
|
55
|
+
});
|
|
56
|
+
const onNativeChange = (event) => {
|
|
57
|
+
const target = event.target;
|
|
58
|
+
if (!target.classList?.contains('weave-radio__input'))
|
|
59
|
+
return;
|
|
60
|
+
const next = target.value;
|
|
61
|
+
if (props.control)
|
|
62
|
+
props.control.value.set(next);
|
|
63
|
+
else
|
|
64
|
+
props.onChange?.(next);
|
|
65
|
+
};
|
|
66
|
+
const onFocusOut = () => {
|
|
67
|
+
props.control?.touched?.set(true);
|
|
68
|
+
};
|
|
69
|
+
return {
|
|
70
|
+
root,
|
|
71
|
+
options,
|
|
72
|
+
groupClass: () => (props.class ? `weave-radio-group ${props.class}` : 'weave-radio-group'),
|
|
73
|
+
label: () => props.label,
|
|
74
|
+
name: () => groupName,
|
|
75
|
+
isSelected,
|
|
76
|
+
isOptionDisabled,
|
|
77
|
+
onNativeChange,
|
|
78
|
+
onFocusOut,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=radio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"radio.js","sourceRoot":"","sources":["../../src/radio/radio.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ripple — a click-feedback behavior, applied as a Weave `use:` action to any host:
|
|
3
|
+
*
|
|
4
|
+
* <button use:ripple>Save</button>
|
|
5
|
+
* <button use:ripple={{ { centered: true } }}>Enter-friendly</button>
|
|
6
|
+
*
|
|
7
|
+
* On pointerdown it appends an absolutely-positioned circle at the click point that
|
|
8
|
+
* scales up and fades out (Weave: currentColor, opacity .22, scale→4 over ~.55s),
|
|
9
|
+
* removed on animationend. The visual is driven by `ripple.styles()` (CSS + tokens);
|
|
10
|
+
* this file is only the behavior. Respects prefers-reduced-motion. Zero-dep.
|
|
11
|
+
*/
|
|
12
|
+
export interface RippleOptions {
|
|
13
|
+
/** Emanate from the host centre instead of the pointer (e.g. keyboard activation). */
|
|
14
|
+
centered?: boolean;
|
|
15
|
+
/** Suppress ripples without detaching the action. */
|
|
16
|
+
disabled?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/** Weave `use:` action: `(el, options?) => cleanup`. */
|
|
19
|
+
export declare function ripple(host: HTMLElement, options?: RippleOptions): () => void;
|
|
20
|
+
//# sourceMappingURL=ripple.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ripple.d.ts","sourceRoot":"","sources":["../../src/ripple/ripple.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,WAAW,aAAa;IAC5B,sFAAsF;IACtF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wDAAwD;AACxD,wBAAgB,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,IAAI,CA8BjF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/** Weave `use:` action: `(el, options?) => cleanup`. */
|
|
2
|
+
export function ripple(host, options = {}) {
|
|
3
|
+
ensureHost(host);
|
|
4
|
+
const onPointerDown = (event) => {
|
|
5
|
+
if (options.disabled)
|
|
6
|
+
return;
|
|
7
|
+
const rect = host.getBoundingClientRect();
|
|
8
|
+
const x = options.centered ? rect.width / 2 : event.clientX - rect.left;
|
|
9
|
+
const y = options.centered ? rect.height / 2 : event.clientY - rect.top;
|
|
10
|
+
// Radius reaches the farthest corner so the circle covers the whole host.
|
|
11
|
+
const radius = Math.hypot(Math.max(x, rect.width - x), Math.max(y, rect.height - y));
|
|
12
|
+
const span = document.createElement('span');
|
|
13
|
+
span.className = 'weave-ripple';
|
|
14
|
+
span.setAttribute('aria-hidden', 'true');
|
|
15
|
+
span.style.left = `${x - radius}px`;
|
|
16
|
+
span.style.top = `${y - radius}px`;
|
|
17
|
+
span.style.width = `${radius * 2}px`;
|
|
18
|
+
span.style.height = `${radius * 2}px`;
|
|
19
|
+
host.appendChild(span);
|
|
20
|
+
if (prefersReducedMotion()) {
|
|
21
|
+
span.remove();
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
span.addEventListener('animationend', () => span.remove(), { once: true });
|
|
25
|
+
};
|
|
26
|
+
host.addEventListener('pointerdown', onPointerDown);
|
|
27
|
+
return () => host.removeEventListener('pointerdown', onPointerDown);
|
|
28
|
+
}
|
|
29
|
+
// The ripple is absolutely positioned and must be clipped — nudge the host if the
|
|
30
|
+
// author hasn't (also available as the `weave.ripple-host` mixin for authored styles).
|
|
31
|
+
function ensureHost(host) {
|
|
32
|
+
const cs = getComputedStyle(host);
|
|
33
|
+
if (cs.position === 'static')
|
|
34
|
+
host.style.position = 'relative';
|
|
35
|
+
if (cs.overflow === 'visible')
|
|
36
|
+
host.style.overflow = 'hidden';
|
|
37
|
+
}
|
|
38
|
+
function prefersReducedMotion() {
|
|
39
|
+
return typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion: reduce)').matches;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=ripple.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ripple.js","sourceRoot":"","sources":["../../src/ripple/ripple.ts"],"names":[],"mappings":"AAkBA,wDAAwD;AACxD,MAAM,UAAU,MAAM,CAAC,IAAiB,EAAE,UAAyB,EAAE;IACnE,UAAU,CAAC,IAAI,CAAC,CAAC;IAEjB,MAAM,aAAa,GAAG,CAAC,KAAmB,EAAQ,EAAE;QAClD,IAAI,OAAO,CAAC,QAAQ;YAAE,OAAO;QAE7B,MAAM,IAAI,GAAY,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACnD,MAAM,CAAC,GAAW,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;QAChF,MAAM,CAAC,GAAW,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC;QAChF,0EAA0E;QAC1E,MAAM,MAAM,GAAW,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QAE7F,MAAM,IAAI,GAAoB,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC7D,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC;QAChC,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,MAAM,IAAI,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,MAAM,IAAI,CAAC;QACnC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC;QACrC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC;QACtC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAEvB,IAAI,oBAAoB,EAAE,EAAE,CAAC;YAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QACD,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7E,CAAC,CAAC;IAEF,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IACpD,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AACtE,CAAC;AAED,kFAAkF;AAClF,uFAAuF;AACvF,SAAS,UAAU,CAAC,IAAiB;IACnC,MAAM,EAAE,GAAwB,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACvD,IAAI,EAAE,CAAC,QAAQ,KAAK,QAAQ;QAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;IAC/D,IAAI,EAAE,CAAC,QAAQ,KAAK,SAAS;QAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAChE,CAAC;AAED,SAAS,oBAAoB;IAC3B,OAAO,OAAO,UAAU,KAAK,UAAU,IAAI,UAAU,CAAC,kCAAkC,CAAC,CAAC,OAAO,CAAC;AACpG,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<Select>` — a native-fidelity combobox/listbox form control (WAI-ARIA APG). A trigger
|
|
3
|
+
* field (with Input's prefix/suffix/clear) shows the current selection; clicking (or
|
|
4
|
+
* ↓/Enter) opens a CDK-overlay `role=listbox` panel of options anchored under it. Focus
|
|
5
|
+
* stays on the trigger; the active option is tracked with `aria-activedescendant` (native
|
|
6
|
+
* combobox behaviour), navigated with the CDK `listKeyManager` (typeahead, skip-disabled).
|
|
7
|
+
*
|
|
8
|
+
* - **Single or `multiple`** — multi keeps the panel open, shows check-marked options, and a
|
|
9
|
+
* `"N selected"` summary; the value is an array.
|
|
10
|
+
* - **Any option shape** — the shared drop-list model: `optionValue`/`optionLabel`/
|
|
11
|
+
* `optionDescription`/`optionDisabled` accessors (default `.value`/`.label`/…; plain
|
|
12
|
+
* strings work), `emit: 'value'|'object'`, and a **description subtext** per row.
|
|
13
|
+
* - **Binding** — the Weave form-control convention: `value` (getter) + `onChange`, OR a
|
|
14
|
+
* structural `control` (a forms `Field`). Compose with `<FormField>` for label/hint/error.
|
|
15
|
+
*
|
|
16
|
+
* import Select from '@weave-framework/ui/select';
|
|
17
|
+
* <Select control={{ form.controls.country }} options={{ countries }}
|
|
18
|
+
* optionValue={{ (c) => c.code }} optionLabel={{ (c) => c.name }} />
|
|
19
|
+
*/
|
|
20
|
+
import { type Signal } from '@weave-framework/runtime';
|
|
21
|
+
import { type OptionAccessors } from '../shared/options.js';
|
|
22
|
+
import { type MenuPosition } from '../shared/positions.js';
|
|
23
|
+
/** What a Select's value can be (single or multiple; value strings or whole objects). */
|
|
24
|
+
export type SelectValue<T> = string | T | Array<string | T> | undefined;
|
|
25
|
+
/** The subset of a forms `Field` a Select binds to. */
|
|
26
|
+
export interface SelectControl<T> {
|
|
27
|
+
value: Signal<SelectValue<T>>;
|
|
28
|
+
touched?: Signal<boolean>;
|
|
29
|
+
error?: () => string | null;
|
|
30
|
+
}
|
|
31
|
+
export interface SelectProps<T = {
|
|
32
|
+
value: string;
|
|
33
|
+
label: string;
|
|
34
|
+
}> extends OptionAccessors<T> {
|
|
35
|
+
/** The options — default shape, plain strings, or arbitrary objects (via accessors). */
|
|
36
|
+
options: T[];
|
|
37
|
+
/** Allow multiple selection (value becomes an array; the panel stays open). */
|
|
38
|
+
multiple?: boolean;
|
|
39
|
+
/** Controlled value (a getter). Ignored when `control` is set. */
|
|
40
|
+
value?: SelectValue<T>;
|
|
41
|
+
/** Called with the next value on change. Ignored when `control` is set. */
|
|
42
|
+
onChange?: (value: SelectValue<T>) => void;
|
|
43
|
+
/** A forms `Field` — two-way value + touched-on-close + error state. */
|
|
44
|
+
control?: SelectControl<T>;
|
|
45
|
+
/** Shown when nothing is selected. */
|
|
46
|
+
placeholder?: string;
|
|
47
|
+
/** Disable the control. */
|
|
48
|
+
disabled?: boolean;
|
|
49
|
+
/** Show a clear (`×`) button when something is selected. */
|
|
50
|
+
clearable?: boolean;
|
|
51
|
+
/** Mark required (aria). */
|
|
52
|
+
required?: boolean;
|
|
53
|
+
/** Accessible name (when not wrapped by a FormField label). */
|
|
54
|
+
label?: string;
|
|
55
|
+
/** Panel position relative to the trigger. Default `'bottom-start'`. */
|
|
56
|
+
position?: MenuPosition;
|
|
57
|
+
/** Accessible name for the clear button. Default 'Clear'. */
|
|
58
|
+
clearLabel?: string;
|
|
59
|
+
/** Extra classes, forwarded onto the root. */
|
|
60
|
+
class?: string;
|
|
61
|
+
}
|
|
62
|
+
export declare const template: string;
|
|
63
|
+
export interface SelectContext<T> {
|
|
64
|
+
root: Signal<HTMLElement | null>;
|
|
65
|
+
trigger: Signal<HTMLElement | null>;
|
|
66
|
+
rootClass: () => string;
|
|
67
|
+
valueClass: () => string;
|
|
68
|
+
displayText: () => string;
|
|
69
|
+
tabindex: () => number;
|
|
70
|
+
label: () => string | undefined;
|
|
71
|
+
ariaRequired: () => 'true' | undefined;
|
|
72
|
+
ariaDisabled: () => 'true' | undefined;
|
|
73
|
+
showClear: () => boolean;
|
|
74
|
+
clearLabel: () => string;
|
|
75
|
+
onFieldClick: () => void;
|
|
76
|
+
onTriggerKeydown: (event: KeyboardEvent) => void;
|
|
77
|
+
onClearClick: (event: MouseEvent) => void;
|
|
78
|
+
}
|
|
79
|
+
export declare function setup<T = {
|
|
80
|
+
value: string;
|
|
81
|
+
label: string;
|
|
82
|
+
}>(props: SelectProps<T>): SelectContext<T>;
|
|
83
|
+
//# sourceMappingURL=select.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../src/select/select.ts"],"names":[],"mappings":"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"}
|