@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,312 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<Table>` — the flagship data surface. A real `<table>` (native `<thead>/<tbody>/
|
|
3
|
+
* <th scope=col>/<td>` semantics) driven by a **column-def + DataSource** API, authored as a
|
|
4
|
+
* Weave template so it **composes the real child components** (RULE #1) — the selection
|
|
5
|
+
* checkboxes ARE the `<Checkbox>` component (full behaviour, one checkbox in the library, not
|
|
6
|
+
* a restyled native input). Rows are a keyed `@for` over the (sorted) data; arbitrary
|
|
7
|
+
* `Node` cells mount via `@render`. Styled by the Weave design (hairline rows, compact 34px,
|
|
8
|
+
* accent as a mark).
|
|
9
|
+
*
|
|
10
|
+
* Features: sortable headers (`aria-sort`, single active, emit `onSort` + convenience client
|
|
11
|
+
* sort for array sources), row selection (composed `<Checkbox>` column, select-all +
|
|
12
|
+
* indeterminate, accentSoft tint + 2px accent left border) via the CDK `SelectionModel`,
|
|
13
|
+
* expandable detail rows, sticky header + sticky columns (`sticky:'start'|'end'`, offsets from
|
|
14
|
+
* column widths), per-column show/hide (`hidden`), and an optional `maxHeight` (the body
|
|
15
|
+
* scrolls vertically inside while the header stays). Virtual body is the noted follow-on.
|
|
16
|
+
*
|
|
17
|
+
* import Table from '@weave-framework/ui/table';
|
|
18
|
+
* import Checkbox from '@weave-framework/ui/checkbox'; // optional — the build auto-resolves the composed <Checkbox>
|
|
19
|
+
* <Table columns={{ cols }} dataSource={{ rows }} selectable expandable />
|
|
20
|
+
*/
|
|
21
|
+
import { signal, onMount } from '@weave-framework/runtime';
|
|
22
|
+
import { selectionModel, isDataSource, draggable } from '../cdk/index.js';
|
|
23
|
+
// Fixed widths of the synthetic leading columns (used for sticky-offset maths + cell width).
|
|
24
|
+
const EXPAND_W = 40;
|
|
25
|
+
const SELECT_W = 44;
|
|
26
|
+
const DEFAULT_STICKY_W = 120;
|
|
27
|
+
const DEFAULT_MIN_W = 48;
|
|
28
|
+
const RESIZE_STEP = 16; // keyboard resize increment (px)
|
|
29
|
+
export const template = '<div class={{ rootClass() }} ref={{ host }}>' +
|
|
30
|
+
'<div class="weave-table__scroll" style={{ scrollStyle() }}>' +
|
|
31
|
+
'<table class="weave-table__grid" aria-label={{ ariaLabel() }}>' +
|
|
32
|
+
'<thead class="weave-table__header"><tr class="weave-table__header-row">' +
|
|
33
|
+
'@if (expandable()) {<th class="weave-table__header-cell weave-table__expand weave-table__cell--sticky-start" style={{ expandStyle() }}></th>}' +
|
|
34
|
+
'@if (selectable()) {<th class="weave-table__header-cell weave-table__select weave-table__cell--sticky-start" style={{ selectStyle() }}>' +
|
|
35
|
+
'@if (showSelectAll()) {<Checkbox checked={{ allChecked() }} indeterminate={{ someChecked() }} onChange={{ onSelectAll }} label="Select all rows" />}' +
|
|
36
|
+
'</th>}' +
|
|
37
|
+
'@for (col of dataCols(); track col.key) {' +
|
|
38
|
+
'<th class={{ headClass(col) }} scope="col" style={{ headStyle(col) }} aria-sort={{ ariaSort(col) }}>' +
|
|
39
|
+
'@if (col.sortable) {<button type="button" class={{ sortClass(col) }} on:click={{ () => cycleSort(col.key) }}>' +
|
|
40
|
+
'@render (headNode(col))<span class="weave-table__sort-arrow" aria-hidden="true">{{ arrow(col) }}</span></button>}' +
|
|
41
|
+
'@if (!col.sortable) {@render (headNode(col))}' +
|
|
42
|
+
'@if (isResizable(col)) {<span class="weave-table__resize-grip" role="separator" aria-orientation="vertical"' +
|
|
43
|
+
' tabindex="0" aria-label={{ resizeLabel(col) }} data-col={{ col.key }}' +
|
|
44
|
+
' aria-valuenow={{ gripValueNow(col) }} aria-valuemin={{ gripValueMin(col) }}' +
|
|
45
|
+
' on:keydown={{ (e) => onGripKeydown(col.key, e) }}></span>}' +
|
|
46
|
+
'</th>}' +
|
|
47
|
+
'</tr></thead>' +
|
|
48
|
+
'<tbody class="weave-table__body">' +
|
|
49
|
+
'@for (row of rows(); track rowKey(row)) {' +
|
|
50
|
+
'<tr class={{ rowClass(row) }} aria-selected={{ ariaSelected(row) }}>' +
|
|
51
|
+
'@if (expandable()) {<td class="weave-table__cell weave-table__expand weave-table__cell--sticky-start" style={{ expandStyle() }}>' +
|
|
52
|
+
'<button type="button" class="weave-table__expand-toggle" aria-label="Toggle row details"' +
|
|
53
|
+
' aria-expanded={{ ariaExpanded(row) }} on:click={{ () => toggleExpand(row) }}></button></td>}' +
|
|
54
|
+
'@if (selectable()) {<td class="weave-table__cell weave-table__select weave-table__cell--sticky-start" style={{ selectStyle() }}>' +
|
|
55
|
+
'<Checkbox checked={{ isSelected(row) }} onChange={{ (checked) => toggleSelect(row, checked) }} label="Select row" /></td>}' +
|
|
56
|
+
'@for (cell of cellsFor(row); track cell.key) {' +
|
|
57
|
+
'<td class={{ cell.cls }} style={{ cell.style }}>@render (cell.node)</td>}' +
|
|
58
|
+
'</tr>' +
|
|
59
|
+
'@if (rowExpanded(row)) {<tr class="weave-table__detail"><td class="weave-table__detail-cell" colspan={{ colSpan() }}>@render (detailNode(row))</td></tr>}' +
|
|
60
|
+
'}' +
|
|
61
|
+
'@if (isEmpty()) {<tr><td class="weave-table__empty" colspan={{ colSpan() }}>{{ emptyText() }}</td></tr>}' +
|
|
62
|
+
'</tbody></table></div></div>';
|
|
63
|
+
export function setup(props) {
|
|
64
|
+
const host = signal(null);
|
|
65
|
+
/* ── data source + client sort ── */
|
|
66
|
+
const rowsView = isDataSource(props.dataSource)
|
|
67
|
+
? props.dataSource.connect()
|
|
68
|
+
: typeof props.dataSource === 'function'
|
|
69
|
+
? props.dataSource
|
|
70
|
+
: (() => props.dataSource);
|
|
71
|
+
const isCustomSource = isDataSource(props.dataSource);
|
|
72
|
+
const _sort = signal(props.sort ?? { active: null, direction: null });
|
|
73
|
+
const sortControlled = () => props.sort !== undefined;
|
|
74
|
+
const sortState = () => (sortControlled() ? props.sort : _sort());
|
|
75
|
+
const cmpValues = (a, b) => {
|
|
76
|
+
if (a == null && b == null)
|
|
77
|
+
return 0;
|
|
78
|
+
if (a == null)
|
|
79
|
+
return -1;
|
|
80
|
+
if (b == null)
|
|
81
|
+
return 1;
|
|
82
|
+
if (typeof a === 'number' && typeof b === 'number')
|
|
83
|
+
return a - b;
|
|
84
|
+
return String(a).localeCompare(String(b));
|
|
85
|
+
};
|
|
86
|
+
const rows = () => {
|
|
87
|
+
const base = rowsView();
|
|
88
|
+
const s = sortState();
|
|
89
|
+
if (isCustomSource || props.clientSort === false || !s.active || !s.direction)
|
|
90
|
+
return base;
|
|
91
|
+
const col = props.columns.find((c) => c.key === s.active);
|
|
92
|
+
if (!col)
|
|
93
|
+
return base;
|
|
94
|
+
const dir = s.direction === 'asc' ? 1 : -1;
|
|
95
|
+
const cmp = col.compare ?? ((a, b) => cmpValues(a[col.key], b[col.key]));
|
|
96
|
+
return [...base].sort((a, b) => cmp(a, b) * dir);
|
|
97
|
+
};
|
|
98
|
+
const cycleSort = (key) => {
|
|
99
|
+
const s = sortState();
|
|
100
|
+
let next;
|
|
101
|
+
if (s.active !== key)
|
|
102
|
+
next = { active: key, direction: 'asc' };
|
|
103
|
+
else if (s.direction === 'asc')
|
|
104
|
+
next = { active: key, direction: 'desc' };
|
|
105
|
+
else if (s.direction === 'desc')
|
|
106
|
+
next = props.disableClear ? { active: key, direction: 'asc' } : { active: null, direction: null };
|
|
107
|
+
else
|
|
108
|
+
next = { active: key, direction: 'asc' };
|
|
109
|
+
if (!sortControlled())
|
|
110
|
+
_sort.set(next);
|
|
111
|
+
props.onSort?.(next);
|
|
112
|
+
};
|
|
113
|
+
/* ── selection + expansion (CDK SelectionModel) ── */
|
|
114
|
+
const selectable = () => !!props.selectable;
|
|
115
|
+
const expandable = () => !!props.expandable;
|
|
116
|
+
const multiple = () => props.selectionMode !== 'single';
|
|
117
|
+
const selection = props.selection ??
|
|
118
|
+
selectionModel({
|
|
119
|
+
multiple: props.selectionMode !== 'single',
|
|
120
|
+
compareWith: props.compareWith,
|
|
121
|
+
onChange: () => props.onSelectionChange?.(selection.selected()),
|
|
122
|
+
});
|
|
123
|
+
const expanded = selectionModel({ multiple: true, compareWith: props.compareWith });
|
|
124
|
+
/* ── columns + sticky offsets (from widths — no DOM measurement) ── */
|
|
125
|
+
const dataCols = () => props.columns.filter((c) => !c.hidden);
|
|
126
|
+
/* ── column resize: an internal width override (px), keyed by column ── */
|
|
127
|
+
const _widths = signal({});
|
|
128
|
+
const isResizable = (c) => c.resizable ?? !!props.resizableColumns;
|
|
129
|
+
const minW = (c) => c.minWidth ?? DEFAULT_MIN_W;
|
|
130
|
+
// Effective px width: controlled prop wins, then an internal resize override, then a numeric `width`.
|
|
131
|
+
const effWidth = (c) => props.columnWidths?.[c.key] ?? _widths()[c.key] ?? (typeof c.width === 'number' ? c.width : undefined);
|
|
132
|
+
const setWidth = (c, width) => {
|
|
133
|
+
const w = Math.max(minW(c), Math.round(width));
|
|
134
|
+
if (props.columnWidths === undefined)
|
|
135
|
+
_widths.set({ ..._widths(), [c.key]: w });
|
|
136
|
+
props.onColumnResize?.({ key: c.key, width: w });
|
|
137
|
+
};
|
|
138
|
+
const colW = (c) => effWidth(c) ?? DEFAULT_STICKY_W;
|
|
139
|
+
const slots = () => {
|
|
140
|
+
const out = [];
|
|
141
|
+
if (expandable())
|
|
142
|
+
out.push({ id: '__expand', width: EXPAND_W, sticky: 'start' });
|
|
143
|
+
if (selectable())
|
|
144
|
+
out.push({ id: '__select', width: SELECT_W, sticky: 'start' });
|
|
145
|
+
for (const c of dataCols())
|
|
146
|
+
out.push({ id: c.key, width: colW(c), sticky: c.sticky });
|
|
147
|
+
return out;
|
|
148
|
+
};
|
|
149
|
+
const stickyStyleFor = (id) => {
|
|
150
|
+
const s = slots();
|
|
151
|
+
const idx = s.findIndex((x) => x.id === id);
|
|
152
|
+
if (idx < 0 || !s[idx].sticky)
|
|
153
|
+
return '';
|
|
154
|
+
if (s[idx].sticky === 'start') {
|
|
155
|
+
let px = 0;
|
|
156
|
+
for (let i = 0; i < idx; i++)
|
|
157
|
+
if (s[i].sticky === 'start')
|
|
158
|
+
px += s[i].width;
|
|
159
|
+
return `left:${px}px`;
|
|
160
|
+
}
|
|
161
|
+
let px = 0;
|
|
162
|
+
for (let i = s.length - 1; i > idx; i--)
|
|
163
|
+
if (s[i].sticky === 'end')
|
|
164
|
+
px += s[i].width;
|
|
165
|
+
return `right:${px}px`;
|
|
166
|
+
};
|
|
167
|
+
const alignOf = (c) => c.align ?? (c.numeric ? 'end' : 'start');
|
|
168
|
+
const widthCss = (c) => {
|
|
169
|
+
const eff = effWidth(c);
|
|
170
|
+
if (eff != null)
|
|
171
|
+
return `width:${eff}px`;
|
|
172
|
+
return c.width == null ? '' : `width:${c.width}`; // a string width passes through
|
|
173
|
+
};
|
|
174
|
+
const joinStyle = (...parts) => parts.filter(Boolean).join(';');
|
|
175
|
+
/* ── resize interaction: pointer drag (CDK draggable) + keyboard on the grip ── */
|
|
176
|
+
const resizeCol = (key) => props.columns.find((c) => c.key === key);
|
|
177
|
+
let dragStartWidth = 0;
|
|
178
|
+
const onGripKeydown = (key, event) => {
|
|
179
|
+
const col = resizeCol(key);
|
|
180
|
+
if (!col)
|
|
181
|
+
return;
|
|
182
|
+
const cur = effWidth(col) ?? DEFAULT_STICKY_W;
|
|
183
|
+
if (event.key === 'ArrowLeft') {
|
|
184
|
+
setWidth(col, cur - RESIZE_STEP);
|
|
185
|
+
event.preventDefault();
|
|
186
|
+
}
|
|
187
|
+
else if (event.key === 'ArrowRight') {
|
|
188
|
+
setWidth(col, cur + RESIZE_STEP);
|
|
189
|
+
event.preventDefault();
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
// Attach a pointer-drag to each header grip once the table is in the DOM.
|
|
193
|
+
onMount(() => {
|
|
194
|
+
const el = host();
|
|
195
|
+
if (!el)
|
|
196
|
+
return;
|
|
197
|
+
el.querySelectorAll('.weave-table__resize-grip').forEach((grip) => {
|
|
198
|
+
const key = grip.getAttribute('data-col') ?? '';
|
|
199
|
+
const col = resizeCol(key);
|
|
200
|
+
if (!col)
|
|
201
|
+
return;
|
|
202
|
+
draggable(grip, {
|
|
203
|
+
axis: 'x',
|
|
204
|
+
onStart: () => {
|
|
205
|
+
dragStartWidth = effWidth(col) ?? grip.closest('th')?.offsetWidth ?? DEFAULT_STICKY_W;
|
|
206
|
+
el.setAttribute('data-resizing', 'true');
|
|
207
|
+
},
|
|
208
|
+
onMove: ({ dx }) => setWidth(col, dragStartWidth + dx),
|
|
209
|
+
onEnd: () => el.removeAttribute('data-resizing'),
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
// Key rows by a stable id (trackBy) or by object identity — NOT by index, so a sort
|
|
214
|
+
// reorders the existing DOM by identity (content stays with its row) instead of rebinding
|
|
215
|
+
// positions (which, with one-shot `@render` cells, would strand stale content).
|
|
216
|
+
const rowKey = (row) => (props.trackBy ? String(props.trackBy(row)) : row);
|
|
217
|
+
const asNode = (content) => (typeof content === 'string' ? document.createTextNode(content) : content);
|
|
218
|
+
const cellClassOf = (col) => {
|
|
219
|
+
const parts = ['weave-table__cell'];
|
|
220
|
+
if (col.numeric)
|
|
221
|
+
parts.push('weave-table__cell--numeric');
|
|
222
|
+
if (col.sticky)
|
|
223
|
+
parts.push(`weave-table__cell--sticky-${col.sticky}`);
|
|
224
|
+
return parts.join(' ');
|
|
225
|
+
};
|
|
226
|
+
const cellStyleOf = (col) => joinStyle(widthCss(col), `text-align:${alignOf(col)}`, stickyStyleFor(col.key));
|
|
227
|
+
const cellNodeOf = (row, col) => asNode(col.cell ? col.cell(row) : String(row[col.key] ?? ''));
|
|
228
|
+
return {
|
|
229
|
+
host,
|
|
230
|
+
rootClass: () => {
|
|
231
|
+
const parts = ['weave-table'];
|
|
232
|
+
if (selectable())
|
|
233
|
+
parts.push('weave-table--selectable');
|
|
234
|
+
if (props.class)
|
|
235
|
+
parts.push(props.class);
|
|
236
|
+
return parts.join(' ');
|
|
237
|
+
},
|
|
238
|
+
scrollStyle: () => props.maxHeight == null ? '' : `max-height:${typeof props.maxHeight === 'number' ? `${props.maxHeight}px` : props.maxHeight}`,
|
|
239
|
+
ariaLabel: () => props.ariaLabel,
|
|
240
|
+
selectable,
|
|
241
|
+
expandable,
|
|
242
|
+
showSelectAll: () => multiple(),
|
|
243
|
+
dataCols,
|
|
244
|
+
colSpan: () => dataCols().length + (selectable() ? 1 : 0) + (expandable() ? 1 : 0),
|
|
245
|
+
isEmpty: () => rows().length === 0,
|
|
246
|
+
emptyText: () => props.emptyText ?? 'No data',
|
|
247
|
+
rows,
|
|
248
|
+
rowKey,
|
|
249
|
+
rowClass: (row) => (expanded.isSelected(row) ? 'weave-table__row weave-table__row--expanded' : 'weave-table__row'),
|
|
250
|
+
ariaSelected: (row) => (selection.isSelected(row) ? 'true' : 'false'),
|
|
251
|
+
isSelected: (row) => selection.isSelected(row),
|
|
252
|
+
// The composed <Checkbox>'s onChange delivers the next checked state as a boolean (only
|
|
253
|
+
// real `on:X` events are auto-forwarded, so a data-callback prop fires exactly once).
|
|
254
|
+
toggleSelect: (row, checked) => {
|
|
255
|
+
if (checked)
|
|
256
|
+
selection.select(row);
|
|
257
|
+
else
|
|
258
|
+
selection.deselect(row);
|
|
259
|
+
},
|
|
260
|
+
allChecked: () => {
|
|
261
|
+
const data = rows();
|
|
262
|
+
return data.length > 0 && data.every((r) => selection.isSelected(r));
|
|
263
|
+
},
|
|
264
|
+
someChecked: () => {
|
|
265
|
+
const data = rows();
|
|
266
|
+
const n = data.filter((r) => selection.isSelected(r)).length;
|
|
267
|
+
return n > 0 && n < data.length;
|
|
268
|
+
},
|
|
269
|
+
onSelectAll: (checked) => {
|
|
270
|
+
if (checked)
|
|
271
|
+
selection.setSelection(...rows());
|
|
272
|
+
else
|
|
273
|
+
selection.clear();
|
|
274
|
+
},
|
|
275
|
+
isExpanded: (row) => expanded.isSelected(row),
|
|
276
|
+
ariaExpanded: (row) => (expanded.isSelected(row) ? 'true' : 'false'),
|
|
277
|
+
rowExpanded: (row) => expandable() && expanded.isSelected(row),
|
|
278
|
+
toggleExpand: (row) => expanded.toggle(row),
|
|
279
|
+
headNode: (col) => typeof col.header === 'function' ? col.header() : document.createTextNode(col.header ?? col.key),
|
|
280
|
+
headClass: (col) => col.sticky ? `weave-table__header-cell weave-table__cell--sticky-${col.sticky}` : 'weave-table__header-cell',
|
|
281
|
+
headStyle: (col) => joinStyle(widthCss(col), `text-align:${alignOf(col)}`, stickyStyleFor(col.key)),
|
|
282
|
+
sortClass: (col) => sortState().active === col.key ? 'weave-table__sort weave-table__sort--active' : 'weave-table__sort',
|
|
283
|
+
ariaSort: (col) => {
|
|
284
|
+
const s = sortState();
|
|
285
|
+
if (s.active !== col.key || !s.direction)
|
|
286
|
+
return 'none';
|
|
287
|
+
return s.direction === 'asc' ? 'ascending' : 'descending';
|
|
288
|
+
},
|
|
289
|
+
arrow: (col) => {
|
|
290
|
+
const s = sortState();
|
|
291
|
+
if (s.active !== col.key || !s.direction)
|
|
292
|
+
return '';
|
|
293
|
+
return s.direction === 'desc' ? '↓' : '↑';
|
|
294
|
+
},
|
|
295
|
+
cycleSort,
|
|
296
|
+
isResizable,
|
|
297
|
+
resizeLabel: (col) => `Resize ${typeof col.header === 'string' ? col.header : col.key} column`,
|
|
298
|
+
// APG window-splitter: the separator exposes its current width (once known — reactive on resize)
|
|
299
|
+
// and the min it can shrink to. No hard max, so aria-valuemax is intentionally omitted.
|
|
300
|
+
gripValueNow: (col) => {
|
|
301
|
+
const w = effWidth(col);
|
|
302
|
+
return w != null ? String(Math.round(w)) : undefined;
|
|
303
|
+
},
|
|
304
|
+
gripValueMin: (col) => String(minW(col)),
|
|
305
|
+
onGripKeydown,
|
|
306
|
+
cellsFor: (row) => dataCols().map((col) => ({ key: col.key, cls: cellClassOf(col), style: cellStyleOf(col), node: cellNodeOf(row, col) })),
|
|
307
|
+
detailNode: (row) => asNode(props.detail ? props.detail(row) : ''),
|
|
308
|
+
expandStyle: () => joinStyle('width:' + EXPAND_W + 'px', stickyStyleFor('__expand')),
|
|
309
|
+
selectStyle: () => joinStyle('width:' + SELECT_W + 'px', stickyStyleFor('__select')),
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
//# sourceMappingURL=table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.js","sourceRoot":"","sources":["../../src/table/table.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<Tabs>` — a tablist with one visible panel (WAI-ARIA tabs pattern).
|
|
3
|
+
*
|
|
4
|
+
* A row of real `<button role=tab>`s over a 1px rule; the active tab is inked and
|
|
5
|
+
* marked with a small accent square before its label (the Weave "mark" — no sliding
|
|
6
|
+
* underline, which reads as Material). Exactly one `role=tabpanel` is shown; the rest
|
|
7
|
+
* are `hidden`. Selection is the **active index** (design), controlled via `value` +
|
|
8
|
+
* `onChange` or uncontrolled from `defaultIndex`.
|
|
9
|
+
*
|
|
10
|
+
* Tabs are an items-prop (`tabs`); each tab's **content is arbitrary** — a `Node`, a
|
|
11
|
+
* string, or a factory `() => Node` — appended into its panel on mount. Roving tabindex
|
|
12
|
+
* via the CDK `listKeyManager` (horizontal, wrap, skip-disabled): Left/Right/Home/End
|
|
13
|
+
* move focus; **activation is manual by default** (Enter/Space/click selects) or follows
|
|
14
|
+
* focus when `activateOnFocus`.
|
|
15
|
+
*
|
|
16
|
+
* import Tabs from '@weave-framework/ui/tabs';
|
|
17
|
+
* <Tabs tabs={{ tabs }} value={{ index() }} onChange={{ setIndex }} />
|
|
18
|
+
*/
|
|
19
|
+
import { type Signal } from '@weave-framework/runtime';
|
|
20
|
+
/** A tab panel's content: a DOM node, a plain string, or a factory returning a node. */
|
|
21
|
+
export type TabContent = Node | string | (() => Node);
|
|
22
|
+
export interface TabItem {
|
|
23
|
+
/** Tab label text. */
|
|
24
|
+
label: string;
|
|
25
|
+
/** Panel content, shown when this tab is active. */
|
|
26
|
+
content: TabContent;
|
|
27
|
+
/** Disable just this tab (not selectable, skipped in keyboard nav). */
|
|
28
|
+
disabled?: boolean;
|
|
29
|
+
}
|
|
30
|
+
export interface TabsProps {
|
|
31
|
+
/** The tabs, left to right. */
|
|
32
|
+
tabs: TabItem[];
|
|
33
|
+
/** Controlled selected index. */
|
|
34
|
+
value?: number;
|
|
35
|
+
/** Called with the next index on selection. */
|
|
36
|
+
onChange?: (index: number) => void;
|
|
37
|
+
/** Uncontrolled initial index (ignored when `value` is provided). Default 0. */
|
|
38
|
+
defaultIndex?: number;
|
|
39
|
+
/** Selection follows focus as you arrow (auto-activation). Default false (manual). */
|
|
40
|
+
activateOnFocus?: boolean;
|
|
41
|
+
/** Disable the whole tab set. */
|
|
42
|
+
disabled?: boolean;
|
|
43
|
+
/** Accessible name for the tablist. */
|
|
44
|
+
label?: string;
|
|
45
|
+
/** Extra classes, forwarded onto the container. */
|
|
46
|
+
class?: string;
|
|
47
|
+
}
|
|
48
|
+
export declare const template: string;
|
|
49
|
+
export interface TabsContext {
|
|
50
|
+
host: Signal<Element | null>;
|
|
51
|
+
tabs: () => TabItem[];
|
|
52
|
+
rootClass: () => string;
|
|
53
|
+
label: () => string | undefined;
|
|
54
|
+
tabId: (index: number) => string;
|
|
55
|
+
panelId: (index: number) => string;
|
|
56
|
+
selectedAttr: (index: number) => string;
|
|
57
|
+
disabledAttr: (tab: TabItem) => string | undefined;
|
|
58
|
+
tabTabindex: (index: number) => number;
|
|
59
|
+
isHidden: (index: number) => boolean;
|
|
60
|
+
select: (index: number) => void;
|
|
61
|
+
onKeydown: (event: KeyboardEvent) => void;
|
|
62
|
+
}
|
|
63
|
+
export declare function setup(props: TabsProps): TabsContext;
|
|
64
|
+
//# sourceMappingURL=tabs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../src/tabs/tabs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAmB,KAAK,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAGxE,wFAAwF;AACxF,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;AAEtD,MAAM,WAAW,OAAO;IACtB,sBAAsB;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,OAAO,EAAE,UAAU,CAAC;IACpB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,+BAA+B;IAC/B,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,gFAAgF;IAChF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sFAAsF;IACtF,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,iCAAiC;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,QAAQ,EAAE,MAgBb,CAAC;AAEX,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC7B,IAAI,EAAE,MAAM,OAAO,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IAChC,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACjC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACnC,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACxC,YAAY,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,GAAG,SAAS,CAAC;IACnD,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACvC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IACrC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,SAAS,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;CAC3C;AAUD,wBAAgB,KAAK,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,CAkFnD"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<Tabs>` — a tablist with one visible panel (WAI-ARIA tabs pattern).
|
|
3
|
+
*
|
|
4
|
+
* A row of real `<button role=tab>`s over a 1px rule; the active tab is inked and
|
|
5
|
+
* marked with a small accent square before its label (the Weave "mark" — no sliding
|
|
6
|
+
* underline, which reads as Material). Exactly one `role=tabpanel` is shown; the rest
|
|
7
|
+
* are `hidden`. Selection is the **active index** (design), controlled via `value` +
|
|
8
|
+
* `onChange` or uncontrolled from `defaultIndex`.
|
|
9
|
+
*
|
|
10
|
+
* Tabs are an items-prop (`tabs`); each tab's **content is arbitrary** — a `Node`, a
|
|
11
|
+
* string, or a factory `() => Node` — appended into its panel on mount. Roving tabindex
|
|
12
|
+
* via the CDK `listKeyManager` (horizontal, wrap, skip-disabled): Left/Right/Home/End
|
|
13
|
+
* move focus; **activation is manual by default** (Enter/Space/click selects) or follows
|
|
14
|
+
* focus when `activateOnFocus`.
|
|
15
|
+
*
|
|
16
|
+
* import Tabs from '@weave-framework/ui/tabs';
|
|
17
|
+
* <Tabs tabs={{ tabs }} value={{ index() }} onChange={{ setIndex }} />
|
|
18
|
+
*/
|
|
19
|
+
import { signal, onMount } from '@weave-framework/runtime';
|
|
20
|
+
import { listKeyManager } from '../cdk/key-manager.js';
|
|
21
|
+
export const template = '<div class={{ rootClass() }} ref={{ host }}>' +
|
|
22
|
+
'<div class="weave-tabs__list" role="tablist" aria-label={{ label() }} on:keydown={{ onKeydown }}>' +
|
|
23
|
+
'@for (tab of tabs(); track $index) {' +
|
|
24
|
+
'<button class="weave-tabs__tab" type="button" role="tab" id={{ tabId($index) }}' +
|
|
25
|
+
' aria-controls={{ panelId($index) }} aria-selected={{ selectedAttr($index) }}' +
|
|
26
|
+
' aria-disabled={{ disabledAttr(tab) }} tabindex={{ tabTabindex($index) }}' +
|
|
27
|
+
' on:click={{ () => select($index) }}>' +
|
|
28
|
+
'<span class="weave-tabs__label">{{ tab.label }}</span>' +
|
|
29
|
+
'</button>' +
|
|
30
|
+
'}' +
|
|
31
|
+
'</div>' +
|
|
32
|
+
'@for (tab of tabs(); track $index) {' +
|
|
33
|
+
'<div class="weave-tabs__panel" role="tabpanel" id={{ panelId($index) }}' +
|
|
34
|
+
' aria-labelledby={{ tabId($index) }} tabindex="0" .hidden={{ isHidden($index) }}></div>' +
|
|
35
|
+
'}' +
|
|
36
|
+
'</div>';
|
|
37
|
+
let _uid = 0;
|
|
38
|
+
function toNode(content) {
|
|
39
|
+
if (typeof content === 'function')
|
|
40
|
+
return content();
|
|
41
|
+
if (typeof content === 'string')
|
|
42
|
+
return document.createTextNode(content);
|
|
43
|
+
return content;
|
|
44
|
+
}
|
|
45
|
+
export function setup(props) {
|
|
46
|
+
const host = signal(null);
|
|
47
|
+
const uid = (_uid += 1);
|
|
48
|
+
const uncontrolled = signal(props.defaultIndex ?? 0);
|
|
49
|
+
const tabs = () => props.tabs ?? [];
|
|
50
|
+
const selectedIndex = () => (props.value !== undefined ? props.value : uncontrolled());
|
|
51
|
+
const isTabDisabled = (tab) => !!props.disabled || !!tab.disabled;
|
|
52
|
+
const tabId = (index) => `weave-tabs-${uid}-tab-${index}`;
|
|
53
|
+
const panelId = (index) => `weave-tabs-${uid}-panel-${index}`;
|
|
54
|
+
const manager = listKeyManager(tabs, {
|
|
55
|
+
orientation: 'horizontal',
|
|
56
|
+
wrap: true,
|
|
57
|
+
skipDisabled: true,
|
|
58
|
+
isDisabled: isTabDisabled,
|
|
59
|
+
});
|
|
60
|
+
// The single tabbable tab: the one the keyboard moved to, else the selected one.
|
|
61
|
+
const rovingIndex = () => {
|
|
62
|
+
const active = manager.activeIndex();
|
|
63
|
+
return active >= 0 ? active : selectedIndex();
|
|
64
|
+
};
|
|
65
|
+
const focusTab = (index) => {
|
|
66
|
+
const el = host();
|
|
67
|
+
el?.querySelectorAll('.weave-tabs__tab')[index]?.focus();
|
|
68
|
+
};
|
|
69
|
+
const select = (index) => {
|
|
70
|
+
const tab = tabs()[index];
|
|
71
|
+
if (!tab || isTabDisabled(tab))
|
|
72
|
+
return;
|
|
73
|
+
manager.setActiveItem(index); // roving tab stop follows the interaction
|
|
74
|
+
if (index === selectedIndex())
|
|
75
|
+
return;
|
|
76
|
+
if (props.value === undefined)
|
|
77
|
+
uncontrolled.set(index);
|
|
78
|
+
props.onChange?.(index);
|
|
79
|
+
};
|
|
80
|
+
const onKeydown = (event) => {
|
|
81
|
+
// Sync the manager to the current tab stop before it navigates, so the first Arrow
|
|
82
|
+
// moves relative to the selected/focused tab (not from index 0).
|
|
83
|
+
if (manager.activeIndex() < 0)
|
|
84
|
+
manager.setActiveItem(rovingIndex());
|
|
85
|
+
if (event.key === 'Enter' || event.key === ' ') {
|
|
86
|
+
select(manager.activeIndex());
|
|
87
|
+
event.preventDefault();
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
if (manager.onKeydown(event)) {
|
|
91
|
+
event.preventDefault();
|
|
92
|
+
focusTab(manager.activeIndex());
|
|
93
|
+
if (props.activateOnFocus)
|
|
94
|
+
select(manager.activeIndex());
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
// Panel contents are arbitrary — append them into their panels once in the DOM.
|
|
98
|
+
onMount(() => {
|
|
99
|
+
const el = host();
|
|
100
|
+
if (!el)
|
|
101
|
+
return;
|
|
102
|
+
const panels = el.querySelectorAll('.weave-tabs__panel');
|
|
103
|
+
tabs().forEach((tab, i) => {
|
|
104
|
+
panels[i]?.append(toNode(tab.content));
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
return {
|
|
108
|
+
host,
|
|
109
|
+
tabs,
|
|
110
|
+
rootClass: () => (props.class ? `weave-tabs ${props.class}` : 'weave-tabs'),
|
|
111
|
+
label: () => props.label,
|
|
112
|
+
tabId,
|
|
113
|
+
panelId,
|
|
114
|
+
selectedAttr: (index) => (index === selectedIndex() ? 'true' : 'false'),
|
|
115
|
+
disabledAttr: (tab) => (isTabDisabled(tab) ? 'true' : undefined),
|
|
116
|
+
tabTabindex: (index) => {
|
|
117
|
+
if (isTabDisabled(tabs()[index]))
|
|
118
|
+
return -1;
|
|
119
|
+
return index === rovingIndex() ? 0 : -1;
|
|
120
|
+
},
|
|
121
|
+
isHidden: (index) => index !== selectedIndex(),
|
|
122
|
+
select,
|
|
123
|
+
onKeydown,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=tabs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../src/tabs/tabs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<Timepicker>` — a time field + spinner popover (the design's h : m + AM/PM columns). A
|
|
3
|
+
* Select-style trigger field (shares Input's chrome via the `field-underline` helper) shows
|
|
4
|
+
* the formatted time + a clock icon; clicking (or ↓/Enter/Space) opens a CDK-overlay panel of
|
|
5
|
+
* **spinbutton columns** — hour ▲/▼, minute ▲/▼ (by `step`), and an AM/PM toggle (12-hour
|
|
6
|
+
* locales). 12h vs 24h is derived from the locale (override with `use24`).
|
|
7
|
+
*
|
|
8
|
+
* - **Value** — a neutral `{ hours, minutes }` (24-hour internally). Binding follows the Weave
|
|
9
|
+
* form convention: `value` + `onChange`, OR a structural `control` (a forms `Field`).
|
|
10
|
+
* - **Bounds** — `min`/`max` clamp the committed time; `step` (minutes, default 5) sets the
|
|
11
|
+
* minute increment.
|
|
12
|
+
* - **Keyboard** — each column is a `role=spinbutton`: Arrow Up/Down inc/dec, with
|
|
13
|
+
* `aria-valuenow`/`-valuetext`. Non-modal popover (click-away + Esc).
|
|
14
|
+
*
|
|
15
|
+
* import Timepicker from '@weave-framework/ui/timepicker';
|
|
16
|
+
* <Timepicker control={{ form.controls.start }} step={{ 15 }} />
|
|
17
|
+
*/
|
|
18
|
+
import { type Signal } from '@weave-framework/runtime';
|
|
19
|
+
import { type MenuPosition } from '../shared/positions.js';
|
|
20
|
+
/** A time of day, 24-hour internally. */
|
|
21
|
+
export interface TimeValue {
|
|
22
|
+
hours: number;
|
|
23
|
+
minutes: number;
|
|
24
|
+
}
|
|
25
|
+
/** The subset of a forms `Field<TimeValue>` a Timepicker binds to. */
|
|
26
|
+
export interface TimepickerControl {
|
|
27
|
+
value: Signal<TimeValue | null | undefined>;
|
|
28
|
+
touched?: Signal<boolean>;
|
|
29
|
+
error?: () => string | null;
|
|
30
|
+
}
|
|
31
|
+
export interface TimepickerProps {
|
|
32
|
+
/** Controlled value (a getter). Ignored when `control` is set. */
|
|
33
|
+
value?: TimeValue | null;
|
|
34
|
+
/** Called with the next value on change/clear. Ignored when `control` is set. */
|
|
35
|
+
onChange?: (value: TimeValue | null) => void;
|
|
36
|
+
/** A forms `Field<TimeValue>` — two-way value + touched-on-close + error state. */
|
|
37
|
+
control?: TimepickerControl;
|
|
38
|
+
/** Earliest selectable time (inclusive). */
|
|
39
|
+
min?: TimeValue;
|
|
40
|
+
/** Latest selectable time (inclusive). */
|
|
41
|
+
max?: TimeValue;
|
|
42
|
+
/** Minute increment. Default 5. */
|
|
43
|
+
step?: number;
|
|
44
|
+
/** Force 24-hour display (else derived from the locale). */
|
|
45
|
+
use24?: boolean;
|
|
46
|
+
/** Locale for the display format + 12/24h default. */
|
|
47
|
+
locale?: string;
|
|
48
|
+
/** Shown when nothing is selected. */
|
|
49
|
+
placeholder?: string;
|
|
50
|
+
/** Disable the control. */
|
|
51
|
+
disabled?: boolean;
|
|
52
|
+
/** Mark required (aria). */
|
|
53
|
+
required?: boolean;
|
|
54
|
+
/** Show a clear (`×`) button when a time is set. */
|
|
55
|
+
clearable?: boolean;
|
|
56
|
+
/** Accessible name (when not wrapped by a FormField label). */
|
|
57
|
+
label?: string;
|
|
58
|
+
/** Accessible name for the clear button. Default 'Clear'. */
|
|
59
|
+
clearLabel?: string;
|
|
60
|
+
/** Panel position relative to the field. Default `'bottom-start'`. */
|
|
61
|
+
position?: MenuPosition;
|
|
62
|
+
/** Extra classes, forwarded onto the root. */
|
|
63
|
+
class?: string;
|
|
64
|
+
}
|
|
65
|
+
export declare const template: string;
|
|
66
|
+
export interface TimepickerContext {
|
|
67
|
+
root: Signal<HTMLElement | null>;
|
|
68
|
+
trigger: Signal<HTMLElement | null>;
|
|
69
|
+
rootClass: () => string;
|
|
70
|
+
valueClass: () => string;
|
|
71
|
+
displayText: () => string;
|
|
72
|
+
tabindex: () => number;
|
|
73
|
+
label: () => string | undefined;
|
|
74
|
+
ariaRequired: () => 'true' | undefined;
|
|
75
|
+
ariaDisabled: () => 'true' | undefined;
|
|
76
|
+
showClear: () => boolean;
|
|
77
|
+
clearLabel: () => string;
|
|
78
|
+
onFieldClick: () => void;
|
|
79
|
+
onTriggerKeydown: (event: KeyboardEvent) => void;
|
|
80
|
+
onClearClick: (event: MouseEvent) => void;
|
|
81
|
+
}
|
|
82
|
+
export declare function setup(props: TimepickerProps): TimepickerContext;
|
|
83
|
+
//# sourceMappingURL=timepicker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timepicker.d.ts","sourceRoot":"","sources":["../../src/timepicker/timepicker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAA6B,KAAK,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAElF,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3E,yCAAyC;AACzC,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,sEAAsE;AACtE,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC,SAAS,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,kEAAkE;IAClE,KAAK,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,KAAK,IAAI,CAAC;IAC7C,mFAAmF;IACnF,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,4CAA4C;IAC5C,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,0CAA0C;IAC1C,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,mCAAmC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oDAAoD;IACpD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,QAAQ,EAAE,MAYb,CAAC;AAEX,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACpC,SAAS,EAAE,MAAM,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IAChC,YAAY,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACvC,YAAY,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACvC,SAAS,EAAE,MAAM,OAAO,CAAC;IACzB,UAAU,EAAE,MAAM,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,gBAAgB,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IACjD,YAAY,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CAC3C;AAYD,wBAAgB,KAAK,CAAC,KAAK,EAAE,eAAe,GAAG,iBAAiB,CAsQ/D"}
|