@furystack/shades-common-components 11.0.0 → 12.0.1
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/CHANGELOG.md +443 -0
- package/esm/components/accordion/accordion-item.d.ts +31 -0
- package/esm/components/accordion/accordion-item.d.ts.map +1 -0
- package/esm/components/accordion/accordion-item.js +147 -0
- package/esm/components/accordion/accordion-item.js.map +1 -0
- package/esm/components/accordion/accordion.d.ts +27 -0
- package/esm/components/accordion/accordion.d.ts.map +1 -0
- package/esm/components/accordion/accordion.js +39 -0
- package/esm/components/accordion/accordion.js.map +1 -0
- package/esm/components/accordion/accordion.spec.d.ts +2 -0
- package/esm/components/accordion/accordion.spec.d.ts.map +1 -0
- package/esm/components/accordion/accordion.spec.js +284 -0
- package/esm/components/accordion/accordion.spec.js.map +1 -0
- package/esm/components/accordion/index.d.ts +3 -0
- package/esm/components/accordion/index.d.ts.map +1 -0
- package/esm/components/accordion/index.js +3 -0
- package/esm/components/accordion/index.js.map +1 -0
- package/esm/components/alert.d.ts +21 -0
- package/esm/components/alert.d.ts.map +1 -0
- package/esm/components/alert.js +131 -0
- package/esm/components/alert.js.map +1 -0
- package/esm/components/alert.spec.d.ts +2 -0
- package/esm/components/alert.spec.d.ts.map +1 -0
- package/esm/components/alert.spec.js +177 -0
- package/esm/components/alert.spec.js.map +1 -0
- package/esm/components/app-bar-link.d.ts +22 -2
- package/esm/components/app-bar-link.d.ts.map +1 -1
- package/esm/components/app-bar-link.js +20 -7
- package/esm/components/app-bar-link.js.map +1 -1
- package/esm/components/app-bar-link.spec.js +22 -19
- package/esm/components/app-bar-link.spec.js.map +1 -1
- package/esm/components/app-bar.d.ts +2 -0
- package/esm/components/app-bar.d.ts.map +1 -1
- package/esm/components/app-bar.js +16 -11
- package/esm/components/app-bar.js.map +1 -1
- package/esm/components/app-bar.spec.js +67 -52
- package/esm/components/app-bar.spec.js.map +1 -1
- package/esm/components/avatar.d.ts +2 -0
- package/esm/components/avatar.d.ts.map +1 -1
- package/esm/components/avatar.js +40 -37
- package/esm/components/avatar.js.map +1 -1
- package/esm/components/badge.d.ts +35 -0
- package/esm/components/badge.d.ts.map +1 -0
- package/esm/components/badge.js +68 -0
- package/esm/components/badge.js.map +1 -0
- package/esm/components/badge.spec.d.ts +2 -0
- package/esm/components/badge.spec.d.ts.map +1 -0
- package/esm/components/badge.spec.js +157 -0
- package/esm/components/badge.spec.js.map +1 -0
- package/esm/components/breadcrumb.d.ts +103 -0
- package/esm/components/breadcrumb.d.ts.map +1 -0
- package/esm/components/breadcrumb.js +121 -0
- package/esm/components/breadcrumb.js.map +1 -0
- package/esm/components/breadcrumb.spec.d.ts +2 -0
- package/esm/components/breadcrumb.spec.d.ts.map +1 -0
- package/esm/components/breadcrumb.spec.js +251 -0
- package/esm/components/breadcrumb.spec.js.map +1 -0
- package/esm/components/button-group.d.ts +85 -0
- package/esm/components/button-group.d.ts.map +1 -0
- package/esm/components/button-group.js +290 -0
- package/esm/components/button-group.js.map +1 -0
- package/esm/components/button-group.spec.d.ts +2 -0
- package/esm/components/button-group.spec.d.ts.map +1 -0
- package/esm/components/button-group.spec.js +502 -0
- package/esm/components/button-group.spec.js.map +1 -0
- package/esm/components/button.d.ts +44 -2
- package/esm/components/button.d.ts.map +1 -1
- package/esm/components/button.js +82 -73
- package/esm/components/button.js.map +1 -1
- package/esm/components/button.spec.js +205 -50
- package/esm/components/button.spec.js.map +1 -1
- package/esm/components/card.d.ts +117 -0
- package/esm/components/card.d.ts.map +1 -0
- package/esm/components/card.js +181 -0
- package/esm/components/card.js.map +1 -0
- package/esm/components/card.spec.d.ts +2 -0
- package/esm/components/card.spec.d.ts.map +1 -0
- package/esm/components/card.spec.js +278 -0
- package/esm/components/card.spec.js.map +1 -0
- package/esm/components/carousel.d.ts +50 -0
- package/esm/components/carousel.d.ts.map +1 -0
- package/esm/components/carousel.js +263 -0
- package/esm/components/carousel.js.map +1 -0
- package/esm/components/carousel.spec.d.ts +2 -0
- package/esm/components/carousel.spec.d.ts.map +1 -0
- package/esm/components/carousel.spec.js +677 -0
- package/esm/components/carousel.spec.js.map +1 -0
- package/esm/components/chip.d.ts +23 -0
- package/esm/components/chip.d.ts.map +1 -0
- package/esm/components/chip.js +139 -0
- package/esm/components/chip.js.map +1 -0
- package/esm/components/chip.spec.d.ts +2 -0
- package/esm/components/chip.spec.d.ts.map +1 -0
- package/esm/components/chip.spec.js +142 -0
- package/esm/components/chip.spec.js.map +1 -0
- package/esm/components/circular-progress.d.ts +37 -0
- package/esm/components/circular-progress.d.ts.map +1 -0
- package/esm/components/circular-progress.js +84 -0
- package/esm/components/circular-progress.js.map +1 -0
- package/esm/components/circular-progress.spec.d.ts +2 -0
- package/esm/components/circular-progress.spec.d.ts.map +1 -0
- package/esm/components/circular-progress.spec.js +228 -0
- package/esm/components/circular-progress.spec.js.map +1 -0
- package/esm/components/command-palette/command-palette-input.d.ts +3 -0
- package/esm/components/command-palette/command-palette-input.d.ts.map +1 -1
- package/esm/components/command-palette/command-palette-input.js +17 -9
- package/esm/components/command-palette/command-palette-input.js.map +1 -1
- package/esm/components/command-palette/command-palette-input.spec.js +172 -161
- package/esm/components/command-palette/command-palette-input.spec.js.map +1 -1
- package/esm/components/command-palette/command-palette-manager.spec.js +130 -114
- package/esm/components/command-palette/command-palette-manager.spec.js.map +1 -1
- package/esm/components/command-palette/command-palette-suggestion-list.d.ts +2 -0
- package/esm/components/command-palette/command-palette-suggestion-list.d.ts.map +1 -1
- package/esm/components/command-palette/command-palette-suggestion-list.js +20 -20
- package/esm/components/command-palette/command-palette-suggestion-list.js.map +1 -1
- package/esm/components/command-palette/command-palette-suggestion-list.spec.js +296 -278
- package/esm/components/command-palette/command-palette-suggestion-list.spec.js.map +1 -1
- package/esm/components/command-palette/index.d.ts +2 -0
- package/esm/components/command-palette/index.d.ts.map +1 -1
- package/esm/components/command-palette/index.js +25 -94
- package/esm/components/command-palette/index.js.map +1 -1
- package/esm/components/command-palette/index.spec.js +12 -12
- package/esm/components/command-palette/index.spec.js.map +1 -1
- package/esm/components/context-menu/context-menu-item.d.ts +9 -0
- package/esm/components/context-menu/context-menu-item.d.ts.map +1 -0
- package/esm/components/context-menu/context-menu-item.js +56 -0
- package/esm/components/context-menu/context-menu-item.js.map +1 -0
- package/esm/components/context-menu/context-menu-manager.d.ts +52 -0
- package/esm/components/context-menu/context-menu-manager.d.ts.map +1 -0
- package/esm/components/context-menu/context-menu-manager.js +128 -0
- package/esm/components/context-menu/context-menu-manager.js.map +1 -0
- package/esm/components/context-menu/context-menu-manager.spec.d.ts +2 -0
- package/esm/components/context-menu/context-menu-manager.spec.d.ts.map +1 -0
- package/esm/components/context-menu/context-menu-manager.spec.js +326 -0
- package/esm/components/context-menu/context-menu-manager.spec.js.map +1 -0
- package/esm/components/context-menu/context-menu.d.ts +8 -0
- package/esm/components/context-menu/context-menu.d.ts.map +1 -0
- package/esm/components/context-menu/context-menu.js +79 -0
- package/esm/components/context-menu/context-menu.js.map +1 -0
- package/esm/components/context-menu/context-menu.spec.d.ts +2 -0
- package/esm/components/context-menu/context-menu.spec.d.ts.map +1 -0
- package/esm/components/context-menu/context-menu.spec.js +282 -0
- package/esm/components/context-menu/context-menu.spec.js.map +1 -0
- package/esm/components/context-menu/index.d.ts +4 -0
- package/esm/components/context-menu/index.d.ts.map +1 -0
- package/esm/components/context-menu/index.js +4 -0
- package/esm/components/context-menu/index.js.map +1 -0
- package/esm/components/data-grid/body.spec.js +194 -184
- package/esm/components/data-grid/body.spec.js.map +1 -1
- package/esm/components/data-grid/data-grid-row.d.ts.map +1 -1
- package/esm/components/data-grid/data-grid-row.js +66 -54
- package/esm/components/data-grid/data-grid-row.js.map +1 -1
- package/esm/components/data-grid/data-grid-row.spec.js +127 -95
- package/esm/components/data-grid/data-grid-row.spec.js.map +1 -1
- package/esm/components/data-grid/data-grid.d.ts.map +1 -1
- package/esm/components/data-grid/data-grid.js +17 -16
- package/esm/components/data-grid/data-grid.js.map +1 -1
- package/esm/components/data-grid/data-grid.spec.js +364 -430
- package/esm/components/data-grid/data-grid.spec.js.map +1 -1
- package/esm/components/data-grid/footer.spec.js +215 -203
- package/esm/components/data-grid/footer.spec.js.map +1 -1
- package/esm/components/data-grid/header.d.ts +3 -1
- package/esm/components/data-grid/header.d.ts.map +1 -1
- package/esm/components/data-grid/header.js +42 -30
- package/esm/components/data-grid/header.js.map +1 -1
- package/esm/components/data-grid/header.spec.js +330 -307
- package/esm/components/data-grid/header.spec.js.map +1 -1
- package/esm/components/data-grid/selection-cell.d.ts +2 -0
- package/esm/components/data-grid/selection-cell.d.ts.map +1 -1
- package/esm/components/data-grid/selection-cell.js +2 -7
- package/esm/components/data-grid/selection-cell.js.map +1 -1
- package/esm/components/data-grid/selection-cell.spec.js +45 -36
- package/esm/components/data-grid/selection-cell.spec.js.map +1 -1
- package/esm/components/dialog.d.ts +46 -0
- package/esm/components/dialog.d.ts.map +1 -0
- package/esm/components/dialog.js +178 -0
- package/esm/components/dialog.js.map +1 -0
- package/esm/components/dialog.spec.d.ts +2 -0
- package/esm/components/dialog.spec.d.ts.map +1 -0
- package/esm/components/dialog.spec.js +113 -0
- package/esm/components/dialog.spec.js.map +1 -0
- package/esm/components/divider.d.ts +22 -0
- package/esm/components/divider.d.ts.map +1 -0
- package/esm/components/divider.js +113 -0
- package/esm/components/divider.js.map +1 -0
- package/esm/components/divider.spec.d.ts +2 -0
- package/esm/components/divider.spec.d.ts.map +1 -0
- package/esm/components/divider.spec.js +136 -0
- package/esm/components/divider.spec.js.map +1 -0
- package/esm/components/drawer/drawer-toggle-button.d.ts +36 -0
- package/esm/components/drawer/drawer-toggle-button.d.ts.map +1 -0
- package/esm/components/drawer/drawer-toggle-button.js +94 -0
- package/esm/components/drawer/drawer-toggle-button.js.map +1 -0
- package/esm/components/drawer/drawer-toggle-button.spec.d.ts +2 -0
- package/esm/components/drawer/drawer-toggle-button.spec.d.ts.map +1 -0
- package/esm/components/drawer/drawer-toggle-button.spec.js +306 -0
- package/esm/components/drawer/drawer-toggle-button.spec.js.map +1 -0
- package/esm/components/drawer/index.d.ts +56 -0
- package/esm/components/drawer/index.d.ts.map +1 -0
- package/esm/components/drawer/index.js +172 -0
- package/esm/components/drawer/index.js.map +1 -0
- package/esm/components/drawer/index.spec.d.ts +2 -0
- package/esm/components/drawer/index.spec.d.ts.map +1 -0
- package/esm/components/drawer/index.spec.js +538 -0
- package/esm/components/drawer/index.spec.js.map +1 -0
- package/esm/components/dropdown.d.ts +15 -0
- package/esm/components/dropdown.d.ts.map +1 -0
- package/esm/components/dropdown.js +262 -0
- package/esm/components/dropdown.js.map +1 -0
- package/esm/components/dropdown.spec.d.ts +2 -0
- package/esm/components/dropdown.spec.d.ts.map +1 -0
- package/esm/components/dropdown.spec.js +372 -0
- package/esm/components/dropdown.spec.js.map +1 -0
- package/esm/components/fab.d.ts +10 -1
- package/esm/components/fab.d.ts.map +1 -1
- package/esm/components/fab.js +24 -8
- package/esm/components/fab.js.map +1 -1
- package/esm/components/fab.spec.js +50 -39
- package/esm/components/fab.spec.js.map +1 -1
- package/esm/components/form.d.ts.map +1 -1
- package/esm/components/form.js +9 -7
- package/esm/components/form.js.map +1 -1
- package/esm/components/form.spec.js +209 -199
- package/esm/components/form.spec.js.map +1 -1
- package/esm/components/grid.js +10 -10
- package/esm/components/grid.js.map +1 -1
- package/esm/components/grid.spec.js +109 -85
- package/esm/components/grid.spec.js.map +1 -1
- package/esm/components/icons/icon-definitions.d.ts +140 -0
- package/esm/components/icons/icon-definitions.d.ts.map +1 -0
- package/esm/components/icons/icon-definitions.js +432 -0
- package/esm/components/icons/icon-definitions.js.map +1 -0
- package/esm/components/icons/icon-definitions.spec.d.ts +2 -0
- package/esm/components/icons/icon-definitions.spec.d.ts.map +1 -0
- package/esm/components/icons/icon-definitions.spec.js +59 -0
- package/esm/components/icons/icon-definitions.spec.js.map +1 -0
- package/esm/components/icons/icon-types.d.ts +48 -0
- package/esm/components/icons/icon-types.d.ts.map +1 -0
- package/esm/components/icons/icon-types.js +2 -0
- package/esm/components/icons/icon-types.js.map +1 -0
- package/esm/components/icons/icon.d.ts +56 -0
- package/esm/components/icons/icon.d.ts.map +1 -0
- package/esm/components/icons/icon.js +61 -0
- package/esm/components/icons/icon.js.map +1 -0
- package/esm/components/icons/icon.spec.d.ts +2 -0
- package/esm/components/icons/icon.spec.d.ts.map +1 -0
- package/esm/components/icons/icon.spec.js +224 -0
- package/esm/components/icons/icon.spec.js.map +1 -0
- package/esm/components/icons/index.d.ts +5 -0
- package/esm/components/icons/index.d.ts.map +1 -0
- package/esm/components/icons/index.js +3 -0
- package/esm/components/icons/index.js.map +1 -0
- package/esm/components/image.d.ts +62 -0
- package/esm/components/image.d.ts.map +1 -0
- package/esm/components/image.js +348 -0
- package/esm/components/image.js.map +1 -0
- package/esm/components/image.spec.d.ts +2 -0
- package/esm/components/image.spec.d.ts.map +1 -0
- package/esm/components/image.spec.js +542 -0
- package/esm/components/image.spec.js.map +1 -0
- package/esm/components/index.d.ts +32 -4
- package/esm/components/index.d.ts.map +1 -1
- package/esm/components/index.js +32 -4
- package/esm/components/index.js.map +1 -1
- package/esm/components/inputs/autocomplete.d.ts +2 -0
- package/esm/components/inputs/autocomplete.d.ts.map +1 -1
- package/esm/components/inputs/autocomplete.js +10 -6
- package/esm/components/inputs/autocomplete.js.map +1 -1
- package/esm/components/inputs/autocomplete.spec.js +10 -1
- package/esm/components/inputs/autocomplete.spec.js.map +1 -1
- package/esm/components/inputs/checkbox.d.ts +50 -0
- package/esm/components/inputs/checkbox.d.ts.map +1 -0
- package/esm/components/inputs/checkbox.js +126 -0
- package/esm/components/inputs/checkbox.js.map +1 -0
- package/esm/components/inputs/checkbox.spec.d.ts +2 -0
- package/esm/components/inputs/checkbox.spec.d.ts.map +1 -0
- package/esm/components/inputs/checkbox.spec.js +287 -0
- package/esm/components/inputs/checkbox.spec.js.map +1 -0
- package/esm/components/inputs/index.d.ts +7 -0
- package/esm/components/inputs/index.d.ts.map +1 -1
- package/esm/components/inputs/index.js +7 -0
- package/esm/components/inputs/index.js.map +1 -1
- package/esm/components/inputs/input-number.d.ts +79 -0
- package/esm/components/inputs/input-number.d.ts.map +1 -0
- package/esm/components/inputs/input-number.js +232 -0
- package/esm/components/inputs/input-number.js.map +1 -0
- package/esm/components/inputs/input-number.spec.d.ts +2 -0
- package/esm/components/inputs/input-number.spec.d.ts.map +1 -0
- package/esm/components/inputs/input-number.spec.js +516 -0
- package/esm/components/inputs/input-number.spec.js.map +1 -0
- package/esm/components/inputs/input.d.ts +2 -1
- package/esm/components/inputs/input.d.ts.map +1 -1
- package/esm/components/inputs/input.js +86 -116
- package/esm/components/inputs/input.js.map +1 -1
- package/esm/components/inputs/input.spec.js +461 -427
- package/esm/components/inputs/input.spec.js.map +1 -1
- package/esm/components/inputs/radio-group.d.ts +38 -0
- package/esm/components/inputs/radio-group.d.ts.map +1 -0
- package/esm/components/inputs/radio-group.js +58 -0
- package/esm/components/inputs/radio-group.js.map +1 -0
- package/esm/components/inputs/radio-group.spec.d.ts +2 -0
- package/esm/components/inputs/radio-group.spec.d.ts.map +1 -0
- package/esm/components/inputs/radio-group.spec.js +201 -0
- package/esm/components/inputs/radio-group.spec.js.map +1 -0
- package/esm/components/inputs/radio.d.ts +42 -0
- package/esm/components/inputs/radio.d.ts.map +1 -0
- package/esm/components/inputs/radio.js +134 -0
- package/esm/components/inputs/radio.js.map +1 -0
- package/esm/components/inputs/radio.spec.d.ts +2 -0
- package/esm/components/inputs/radio.spec.d.ts.map +1 -0
- package/esm/components/inputs/radio.spec.js +211 -0
- package/esm/components/inputs/radio.spec.js.map +1 -0
- package/esm/components/inputs/select.d.ts +67 -0
- package/esm/components/inputs/select.d.ts.map +1 -0
- package/esm/components/inputs/select.js +581 -0
- package/esm/components/inputs/select.js.map +1 -0
- package/esm/components/inputs/select.spec.d.ts +2 -0
- package/esm/components/inputs/select.spec.d.ts.map +1 -0
- package/esm/components/inputs/select.spec.js +1009 -0
- package/esm/components/inputs/select.spec.js.map +1 -0
- package/esm/components/inputs/slider.d.ts +66 -0
- package/esm/components/inputs/slider.d.ts.map +1 -0
- package/esm/components/inputs/slider.js +526 -0
- package/esm/components/inputs/slider.js.map +1 -0
- package/esm/components/inputs/slider.spec.d.ts +2 -0
- package/esm/components/inputs/slider.spec.d.ts.map +1 -0
- package/esm/components/inputs/slider.spec.js +812 -0
- package/esm/components/inputs/slider.spec.js.map +1 -0
- package/esm/components/inputs/switch.d.ts +50 -0
- package/esm/components/inputs/switch.d.ts.map +1 -0
- package/esm/components/inputs/switch.js +138 -0
- package/esm/components/inputs/switch.js.map +1 -0
- package/esm/components/inputs/switch.spec.d.ts +2 -0
- package/esm/components/inputs/switch.spec.d.ts.map +1 -0
- package/esm/components/inputs/switch.spec.js +313 -0
- package/esm/components/inputs/switch.spec.js.map +1 -0
- package/esm/components/inputs/text-area.d.ts +2 -0
- package/esm/components/inputs/text-area.d.ts.map +1 -1
- package/esm/components/inputs/text-area.js +13 -21
- package/esm/components/inputs/text-area.js.map +1 -1
- package/esm/components/inputs/text-area.spec.js +171 -156
- package/esm/components/inputs/text-area.spec.js.map +1 -1
- package/esm/components/linear-progress.d.ts +32 -0
- package/esm/components/linear-progress.d.ts.map +1 -0
- package/esm/components/linear-progress.js +79 -0
- package/esm/components/linear-progress.js.map +1 -0
- package/esm/components/linear-progress.spec.d.ts +2 -0
- package/esm/components/linear-progress.spec.d.ts.map +1 -0
- package/esm/components/linear-progress.spec.js +251 -0
- package/esm/components/linear-progress.spec.js.map +1 -0
- package/esm/components/list/index.d.ts +3 -0
- package/esm/components/list/index.d.ts.map +1 -0
- package/esm/components/list/index.js +3 -0
- package/esm/components/list/index.js.map +1 -0
- package/esm/components/list/list-item.d.ts +13 -0
- package/esm/components/list/list-item.d.ts.map +1 -0
- package/esm/components/list/list-item.js +81 -0
- package/esm/components/list/list-item.js.map +1 -0
- package/esm/components/list/list.d.ts +18 -0
- package/esm/components/list/list.d.ts.map +1 -0
- package/esm/components/list/list.js +42 -0
- package/esm/components/list/list.js.map +1 -0
- package/esm/components/list/list.spec.d.ts +2 -0
- package/esm/components/list/list.spec.d.ts.map +1 -0
- package/esm/components/list/list.spec.js +540 -0
- package/esm/components/list/list.spec.js.map +1 -0
- package/esm/components/loader.d.ts +2 -0
- package/esm/components/loader.d.ts.map +1 -1
- package/esm/components/loader.js +18 -10
- package/esm/components/loader.js.map +1 -1
- package/esm/components/loader.spec.js +191 -175
- package/esm/components/loader.spec.js.map +1 -1
- package/esm/components/menu/index.d.ts +3 -0
- package/esm/components/menu/index.d.ts.map +1 -0
- package/esm/components/menu/index.js +3 -0
- package/esm/components/menu/index.js.map +1 -0
- package/esm/components/menu/menu-types.d.ts +27 -0
- package/esm/components/menu/menu-types.d.ts.map +1 -0
- package/esm/components/menu/menu-types.js +22 -0
- package/esm/components/menu/menu-types.js.map +1 -0
- package/esm/components/menu/menu-types.spec.d.ts +2 -0
- package/esm/components/menu/menu-types.spec.d.ts.map +1 -0
- package/esm/components/menu/menu-types.spec.js +103 -0
- package/esm/components/menu/menu-types.spec.js.map +1 -0
- package/esm/components/menu/menu.d.ts +17 -0
- package/esm/components/menu/menu.d.ts.map +1 -0
- package/esm/components/menu/menu.js +240 -0
- package/esm/components/menu/menu.js.map +1 -0
- package/esm/components/menu/menu.spec.d.ts +2 -0
- package/esm/components/menu/menu.spec.d.ts.map +1 -0
- package/esm/components/menu/menu.spec.js +427 -0
- package/esm/components/menu/menu.spec.js.map +1 -0
- package/esm/components/modal.d.ts +3 -2
- package/esm/components/modal.d.ts.map +1 -1
- package/esm/components/modal.js +8 -5
- package/esm/components/modal.js.map +1 -1
- package/esm/components/modal.spec.js +50 -43
- package/esm/components/modal.spec.js.map +1 -1
- package/esm/components/noty-list.d.ts +4 -0
- package/esm/components/noty-list.d.ts.map +1 -1
- package/esm/components/noty-list.js +65 -53
- package/esm/components/noty-list.js.map +1 -1
- package/esm/components/noty-list.spec.js +71 -68
- package/esm/components/noty-list.spec.js.map +1 -1
- package/esm/components/page-container/index.d.ts +54 -0
- package/esm/components/page-container/index.d.ts.map +1 -0
- package/esm/components/page-container/index.js +63 -0
- package/esm/components/page-container/index.js.map +1 -0
- package/esm/components/page-container/index.spec.d.ts +2 -0
- package/esm/components/page-container/index.spec.d.ts.map +1 -0
- package/esm/components/page-container/index.spec.js +217 -0
- package/esm/components/page-container/index.spec.js.map +1 -0
- package/esm/components/page-container/page-header.d.ts +57 -0
- package/esm/components/page-container/page-header.d.ts.map +1 -0
- package/esm/components/page-container/page-header.js +93 -0
- package/esm/components/page-container/page-header.js.map +1 -0
- package/esm/components/page-container/page-header.spec.d.ts +2 -0
- package/esm/components/page-container/page-header.spec.d.ts.map +1 -0
- package/esm/components/page-container/page-header.spec.js +230 -0
- package/esm/components/page-container/page-header.spec.js.map +1 -0
- package/esm/components/page-layout/index.d.ts +83 -0
- package/esm/components/page-layout/index.d.ts.map +1 -0
- package/esm/components/page-layout/index.js +288 -0
- package/esm/components/page-layout/index.js.map +1 -0
- package/esm/components/page-layout/index.spec.d.ts +2 -0
- package/esm/components/page-layout/index.spec.d.ts.map +1 -0
- package/esm/components/page-layout/index.spec.js +637 -0
- package/esm/components/page-layout/index.spec.js.map +1 -0
- package/esm/components/pagination.d.ts +43 -0
- package/esm/components/pagination.d.ts.map +1 -0
- package/esm/components/pagination.js +165 -0
- package/esm/components/pagination.js.map +1 -0
- package/esm/components/pagination.spec.d.ts +2 -0
- package/esm/components/pagination.spec.d.ts.map +1 -0
- package/esm/components/pagination.spec.js +195 -0
- package/esm/components/pagination.spec.js.map +1 -0
- package/esm/components/paper.d.ts +3 -1
- package/esm/components/paper.d.ts.map +1 -1
- package/esm/components/paper.js +11 -9
- package/esm/components/paper.js.map +1 -1
- package/esm/components/paper.spec.js +26 -18
- package/esm/components/paper.spec.js.map +1 -1
- package/esm/components/rating.d.ts +62 -0
- package/esm/components/rating.d.ts.map +1 -0
- package/esm/components/rating.js +201 -0
- package/esm/components/rating.js.map +1 -0
- package/esm/components/rating.spec.d.ts +2 -0
- package/esm/components/rating.spec.d.ts.map +1 -0
- package/esm/components/rating.spec.js +663 -0
- package/esm/components/rating.spec.js.map +1 -0
- package/esm/components/result.d.ts +37 -0
- package/esm/components/result.d.ts.map +1 -0
- package/esm/components/result.js +109 -0
- package/esm/components/result.js.map +1 -0
- package/esm/components/result.spec.d.ts +2 -0
- package/esm/components/result.spec.d.ts.map +1 -0
- package/esm/components/result.spec.js +159 -0
- package/esm/components/result.spec.js.map +1 -0
- package/esm/components/searchable-input-styles.d.ts +8 -0
- package/esm/components/searchable-input-styles.d.ts.map +1 -0
- package/esm/components/searchable-input-styles.js +71 -0
- package/esm/components/searchable-input-styles.js.map +1 -0
- package/esm/components/skeleton.d.ts +2 -0
- package/esm/components/skeleton.d.ts.map +1 -1
- package/esm/components/skeleton.js +19 -6
- package/esm/components/skeleton.js.map +1 -1
- package/esm/components/skeleton.spec.js +103 -95
- package/esm/components/skeleton.spec.js.map +1 -1
- package/esm/components/styles.d.ts.map +1 -1
- package/esm/components/styles.js +14 -13
- package/esm/components/styles.js.map +1 -1
- package/esm/components/styles.spec.js +27 -26
- package/esm/components/styles.spec.js.map +1 -1
- package/esm/components/suggest/index.d.ts.map +1 -1
- package/esm/components/suggest/index.js +24 -85
- package/esm/components/suggest/index.js.map +1 -1
- package/esm/components/suggest/index.spec.js +402 -378
- package/esm/components/suggest/index.spec.js.map +1 -1
- package/esm/components/suggest/suggest-input.d.ts +2 -0
- package/esm/components/suggest/suggest-input.d.ts.map +1 -1
- package/esm/components/suggest/suggest-input.js +10 -8
- package/esm/components/suggest/suggest-input.js.map +1 -1
- package/esm/components/suggest/suggest-input.spec.js +83 -71
- package/esm/components/suggest/suggest-input.spec.js.map +1 -1
- package/esm/components/suggest/suggest-manager.spec.js +102 -92
- package/esm/components/suggest/suggest-manager.spec.js.map +1 -1
- package/esm/components/suggest/suggestion-list.d.ts.map +1 -1
- package/esm/components/suggest/suggestion-list.js +21 -22
- package/esm/components/suggest/suggestion-list.js.map +1 -1
- package/esm/components/suggest/suggestion-list.spec.js +165 -146
- package/esm/components/suggest/suggestion-list.spec.js.map +1 -1
- package/esm/components/tabs.d.ts +18 -2
- package/esm/components/tabs.d.ts.map +1 -1
- package/esm/components/tabs.js +154 -14
- package/esm/components/tabs.js.map +1 -1
- package/esm/components/tabs.spec.js +295 -7
- package/esm/components/tabs.spec.js.map +1 -1
- package/esm/components/timeline.d.ts +53 -0
- package/esm/components/timeline.d.ts.map +1 -0
- package/esm/components/timeline.js +162 -0
- package/esm/components/timeline.js.map +1 -0
- package/esm/components/timeline.spec.d.ts +2 -0
- package/esm/components/timeline.spec.d.ts.map +1 -0
- package/esm/components/timeline.spec.js +209 -0
- package/esm/components/timeline.spec.js.map +1 -0
- package/esm/components/tooltip.d.ts +25 -0
- package/esm/components/tooltip.d.ts.map +1 -0
- package/esm/components/tooltip.js +113 -0
- package/esm/components/tooltip.js.map +1 -0
- package/esm/components/tooltip.spec.d.ts +2 -0
- package/esm/components/tooltip.spec.d.ts.map +1 -0
- package/esm/components/tooltip.spec.js +152 -0
- package/esm/components/tooltip.spec.js.map +1 -0
- package/esm/components/tree/index.d.ts +3 -0
- package/esm/components/tree/index.d.ts.map +1 -0
- package/esm/components/tree/index.js +3 -0
- package/esm/components/tree/index.js.map +1 -0
- package/esm/components/tree/tree-item.d.ts +14 -0
- package/esm/components/tree/tree-item.d.ts.map +1 -0
- package/esm/components/tree/tree-item.js +118 -0
- package/esm/components/tree/tree-item.js.map +1 -0
- package/esm/components/tree/tree.d.ts +20 -0
- package/esm/components/tree/tree.d.ts.map +1 -0
- package/esm/components/tree/tree.js +66 -0
- package/esm/components/tree/tree.js.map +1 -0
- package/esm/components/tree/tree.spec.d.ts +2 -0
- package/esm/components/tree/tree.spec.d.ts.map +1 -0
- package/esm/components/tree/tree.spec.js +427 -0
- package/esm/components/tree/tree.spec.js.map +1 -0
- package/esm/components/typography.d.ts +48 -0
- package/esm/components/typography.d.ts.map +1 -0
- package/esm/components/typography.js +223 -0
- package/esm/components/typography.js.map +1 -0
- package/esm/components/typography.spec.d.ts +2 -0
- package/esm/components/typography.spec.d.ts.map +1 -0
- package/esm/components/typography.spec.js +199 -0
- package/esm/components/typography.spec.js.map +1 -0
- package/esm/components/wizard/index.d.ts +2 -0
- package/esm/components/wizard/index.d.ts.map +1 -1
- package/esm/components/wizard/index.spec.js +70 -56
- package/esm/components/wizard/index.spec.js.map +1 -1
- package/esm/services/click-away-service.d.ts +5 -2
- package/esm/services/click-away-service.d.ts.map +1 -1
- package/esm/services/click-away-service.js +7 -1
- package/esm/services/click-away-service.js.map +1 -1
- package/esm/services/click-away-service.spec.js +14 -12
- package/esm/services/click-away-service.spec.js.map +1 -1
- package/esm/services/css-variable-theme.d.ts +167 -1
- package/esm/services/css-variable-theme.d.ts.map +1 -1
- package/esm/services/css-variable-theme.js +102 -0
- package/esm/services/css-variable-theme.js.map +1 -1
- package/esm/services/css-variable-theme.spec.js +131 -1
- package/esm/services/css-variable-theme.spec.js.map +1 -1
- package/esm/services/default-dark-theme.d.ts +107 -2
- package/esm/services/default-dark-theme.d.ts.map +1 -1
- package/esm/services/default-dark-theme.js +87 -1
- package/esm/services/default-dark-theme.js.map +1 -1
- package/esm/services/default-light-theme.d.ts +107 -2
- package/esm/services/default-light-theme.d.ts.map +1 -1
- package/esm/services/default-light-theme.js +86 -0
- package/esm/services/default-light-theme.js.map +1 -1
- package/esm/services/index.d.ts +6 -2
- package/esm/services/index.d.ts.map +1 -1
- package/esm/services/index.js +6 -2
- package/esm/services/index.js.map +1 -1
- package/esm/services/layout-service.d.ts +217 -0
- package/esm/services/layout-service.d.ts.map +1 -0
- package/esm/services/layout-service.js +331 -0
- package/esm/services/layout-service.js.map +1 -0
- package/esm/services/layout-service.spec.d.ts +2 -0
- package/esm/services/layout-service.spec.d.ts.map +1 -0
- package/esm/services/layout-service.spec.js +425 -0
- package/esm/services/layout-service.spec.js.map +1 -0
- package/esm/services/list-service.d.ts +31 -0
- package/esm/services/list-service.d.ts.map +1 -0
- package/esm/services/list-service.js +149 -0
- package/esm/services/list-service.js.map +1 -0
- package/esm/services/list-service.spec.d.ts +2 -0
- package/esm/services/list-service.spec.d.ts.map +1 -0
- package/esm/services/list-service.spec.js +283 -0
- package/esm/services/list-service.spec.js.map +1 -0
- package/esm/services/palette-css-vars.d.ts +12 -0
- package/esm/services/palette-css-vars.d.ts.map +1 -0
- package/esm/services/palette-css-vars.js +44 -0
- package/esm/services/palette-css-vars.js.map +1 -0
- package/esm/services/theme-provider-service.d.ts +387 -2
- package/esm/services/theme-provider-service.d.ts.map +1 -1
- package/esm/services/theme-provider-service.js.map +1 -1
- package/esm/services/tree-service.d.ts +61 -0
- package/esm/services/tree-service.d.ts.map +1 -0
- package/esm/services/tree-service.js +149 -0
- package/esm/services/tree-service.js.map +1 -0
- package/esm/services/tree-service.spec.d.ts +2 -0
- package/esm/services/tree-service.spec.d.ts.map +1 -0
- package/esm/services/tree-service.spec.js +338 -0
- package/esm/services/tree-service.spec.js.map +1 -0
- package/esm/utils/promisify-animation.d.ts.map +1 -1
- package/esm/utils/promisify-animation.js +6 -1
- package/esm/utils/promisify-animation.js.map +1 -1
- package/package.json +7 -8
- package/src/components/accordion/accordion-item.tsx +197 -0
- package/src/components/accordion/accordion.spec.tsx +418 -0
- package/src/components/accordion/accordion.tsx +50 -0
- package/src/components/accordion/index.ts +2 -0
- package/src/components/alert.spec.tsx +256 -0
- package/src/components/alert.tsx +186 -0
- package/src/components/app-bar-link.spec.tsx +22 -19
- package/src/components/app-bar-link.tsx +29 -10
- package/src/components/app-bar.spec.tsx +73 -58
- package/src/components/app-bar.tsx +19 -12
- package/src/components/avatar.tsx +46 -47
- package/src/components/badge.spec.tsx +228 -0
- package/src/components/badge.tsx +104 -0
- package/src/components/breadcrumb.spec.tsx +396 -0
- package/src/components/breadcrumb.tsx +188 -0
- package/src/components/button-group.spec.tsx +611 -0
- package/src/components/button-group.tsx +423 -0
- package/src/components/button.spec.tsx +257 -67
- package/src/components/button.tsx +130 -80
- package/src/components/card.spec.tsx +389 -0
- package/src/components/card.tsx +261 -0
- package/src/components/carousel.spec.tsx +894 -0
- package/src/components/carousel.tsx +376 -0
- package/src/components/chip.spec.tsx +200 -0
- package/src/components/chip.tsx +188 -0
- package/src/components/circular-progress.spec.tsx +289 -0
- package/src/components/circular-progress.tsx +145 -0
- package/src/components/command-palette/command-palette-input.spec.tsx +219 -219
- package/src/components/command-palette/command-palette-input.tsx +25 -9
- package/src/components/command-palette/command-palette-manager.spec.ts +132 -117
- package/src/components/command-palette/command-palette-suggestion-list.spec.tsx +358 -358
- package/src/components/command-palette/command-palette-suggestion-list.tsx +22 -20
- package/src/components/command-palette/index.spec.tsx +12 -12
- package/src/components/command-palette/index.tsx +25 -102
- package/src/components/context-menu/context-menu-item.tsx +85 -0
- package/src/components/context-menu/context-menu-manager.spec.ts +433 -0
- package/src/components/context-menu/context-menu-manager.ts +148 -0
- package/src/components/context-menu/context-menu.spec.tsx +352 -0
- package/src/components/context-menu/context-menu.tsx +116 -0
- package/src/components/context-menu/index.ts +3 -0
- package/src/components/data-grid/body.spec.tsx +287 -283
- package/src/components/data-grid/data-grid-row.spec.tsx +165 -140
- package/src/components/data-grid/data-grid-row.tsx +72 -55
- package/src/components/data-grid/data-grid.spec.tsx +659 -729
- package/src/components/data-grid/data-grid.tsx +19 -15
- package/src/components/data-grid/footer.spec.tsx +249 -237
- package/src/components/data-grid/header.spec.tsx +374 -351
- package/src/components/data-grid/header.tsx +58 -39
- package/src/components/data-grid/selection-cell.spec.tsx +46 -45
- package/src/components/data-grid/selection-cell.tsx +2 -6
- package/src/components/dialog.spec.tsx +135 -0
- package/src/components/dialog.tsx +277 -0
- package/src/components/divider.spec.tsx +197 -0
- package/src/components/divider.tsx +147 -0
- package/src/components/drawer/drawer-toggle-button.spec.tsx +374 -0
- package/src/components/drawer/drawer-toggle-button.tsx +124 -0
- package/src/components/drawer/index.spec.tsx +748 -0
- package/src/components/drawer/index.tsx +227 -0
- package/src/components/dropdown.spec.tsx +445 -0
- package/src/components/dropdown.tsx +343 -0
- package/src/components/fab.spec.tsx +51 -40
- package/src/components/fab.tsx +32 -9
- package/src/components/form.spec.tsx +303 -293
- package/src/components/form.tsx +10 -7
- package/src/components/grid.spec.tsx +276 -183
- package/src/components/grid.tsx +10 -10
- package/src/components/icons/icon-definitions.spec.ts +68 -0
- package/src/components/icons/icon-definitions.ts +509 -0
- package/src/components/icons/icon-types.ts +48 -0
- package/src/components/icons/icon.spec.tsx +314 -0
- package/src/components/icons/icon.tsx +111 -0
- package/src/components/icons/index.ts +4 -0
- package/src/components/image.spec.tsx +748 -0
- package/src/components/image.tsx +520 -0
- package/src/components/index.ts +32 -4
- package/src/components/inputs/autocomplete.spec.tsx +10 -1
- package/src/components/inputs/autocomplete.tsx +13 -7
- package/src/components/inputs/checkbox.spec.tsx +377 -0
- package/src/components/inputs/checkbox.tsx +198 -0
- package/src/components/inputs/index.ts +7 -0
- package/src/components/inputs/input-number.spec.tsx +686 -0
- package/src/components/inputs/input-number.tsx +387 -0
- package/src/components/inputs/input.spec.tsx +544 -508
- package/src/components/inputs/input.tsx +91 -132
- package/src/components/inputs/radio-group.spec.tsx +281 -0
- package/src/components/inputs/radio-group.tsx +108 -0
- package/src/components/inputs/radio.spec.tsx +273 -0
- package/src/components/inputs/radio.tsx +199 -0
- package/src/components/inputs/select.spec.tsx +1237 -0
- package/src/components/inputs/select.tsx +775 -0
- package/src/components/inputs/slider.spec.tsx +1020 -0
- package/src/components/inputs/slider.tsx +696 -0
- package/src/components/inputs/switch.spec.tsx +410 -0
- package/src/components/inputs/switch.tsx +218 -0
- package/src/components/inputs/text-area.spec.tsx +186 -171
- package/src/components/inputs/text-area.tsx +13 -19
- package/src/components/linear-progress.spec.tsx +320 -0
- package/src/components/linear-progress.tsx +127 -0
- package/src/components/list/index.ts +2 -0
- package/src/components/list/list-item.tsx +106 -0
- package/src/components/list/list.spec.tsx +817 -0
- package/src/components/list/list.tsx +92 -0
- package/src/components/loader.spec.tsx +220 -204
- package/src/components/loader.tsx +17 -9
- package/src/components/menu/index.ts +2 -0
- package/src/components/menu/menu-types.spec.ts +122 -0
- package/src/components/menu/menu-types.ts +43 -0
- package/src/components/menu/menu.spec.tsx +483 -0
- package/src/components/menu/menu.tsx +326 -0
- package/src/components/modal.spec.tsx +65 -55
- package/src/components/modal.tsx +9 -6
- package/src/components/noty-list.spec.tsx +78 -75
- package/src/components/noty-list.tsx +76 -68
- package/src/components/page-container/index.spec.tsx +274 -0
- package/src/components/page-container/index.tsx +82 -0
- package/src/components/page-container/page-header.spec.tsx +308 -0
- package/src/components/page-container/page-header.tsx +127 -0
- package/src/components/page-layout/index.spec.tsx +882 -0
- package/src/components/page-layout/index.tsx +392 -0
- package/src/components/pagination.spec.tsx +275 -0
- package/src/components/pagination.tsx +249 -0
- package/src/components/paper.spec.tsx +26 -18
- package/src/components/paper.tsx +12 -10
- package/src/components/rating.spec.tsx +866 -0
- package/src/components/rating.tsx +286 -0
- package/src/components/result.spec.tsx +221 -0
- package/src/components/result.tsx +155 -0
- package/src/components/searchable-input-styles.ts +81 -0
- package/src/components/skeleton.spec.tsx +126 -118
- package/src/components/skeleton.tsx +23 -6
- package/src/components/styles.spec.ts +27 -28
- package/src/components/styles.tsx +15 -13
- package/src/components/suggest/index.spec.tsx +611 -587
- package/src/components/suggest/index.tsx +28 -95
- package/src/components/suggest/suggest-input.spec.tsx +95 -81
- package/src/components/suggest/suggest-input.tsx +9 -7
- package/src/components/suggest/suggest-manager.spec.ts +103 -93
- package/src/components/suggest/suggestion-list.spec.tsx +194 -173
- package/src/components/suggest/suggestion-list.tsx +23 -22
- package/src/components/tabs.spec.tsx +369 -7
- package/src/components/tabs.tsx +221 -18
- package/src/components/timeline.spec.tsx +294 -0
- package/src/components/timeline.tsx +221 -0
- package/src/components/tooltip.spec.tsx +223 -0
- package/src/components/tooltip.tsx +155 -0
- package/src/components/tree/index.ts +2 -0
- package/src/components/tree/tree-item.tsx +161 -0
- package/src/components/tree/tree.spec.tsx +677 -0
- package/src/components/tree/tree.tsx +111 -0
- package/src/components/typography.spec.tsx +235 -0
- package/src/components/typography.tsx +292 -0
- package/src/components/wizard/index.spec.tsx +77 -68
- package/src/services/click-away-service.spec.ts +14 -16
- package/src/services/click-away-service.ts +9 -3
- package/src/services/css-variable-theme.spec.ts +169 -1
- package/src/services/css-variable-theme.ts +107 -2
- package/src/services/default-dark-theme.ts +89 -3
- package/src/services/default-light-theme.ts +88 -2
- package/src/services/index.ts +6 -2
- package/src/services/layout-service.spec.ts +535 -0
- package/src/services/layout-service.ts +391 -0
- package/src/services/list-service.spec.ts +362 -0
- package/src/services/list-service.ts +169 -0
- package/src/services/palette-css-vars.ts +46 -0
- package/src/services/theme-provider-service.ts +246 -1
- package/src/services/tree-service.spec.ts +412 -0
- package/src/services/tree-service.ts +179 -0
- package/src/utils/promisify-animation.ts +7 -1
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
import { ScreenService, Shade, createComponent, type ScreenSize } from '@furystack/shades'
|
|
2
|
+
import type { ValueObserver } from '@furystack/utils'
|
|
3
|
+
import { cssVariableTheme } from '../../services/css-variable-theme.js'
|
|
4
|
+
import { LAYOUT_CSS_VARIABLES, LayoutService } from '../../services/layout-service.js'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* AppBar configuration for PageLayout.
|
|
8
|
+
*/
|
|
9
|
+
export type AppBarConfig = {
|
|
10
|
+
/** AppBar visibility behavior */
|
|
11
|
+
variant: 'permanent' | 'auto-hide'
|
|
12
|
+
/** Height of the AppBar (CSS value). Default: '48px' */
|
|
13
|
+
height?: string
|
|
14
|
+
/** The AppBar component to render */
|
|
15
|
+
component: JSX.Element
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Drawer configuration for a single side.
|
|
20
|
+
*/
|
|
21
|
+
export type DrawerConfig = {
|
|
22
|
+
/** Drawer behavior variant */
|
|
23
|
+
variant: 'permanent' | 'collapsible' | 'temporary'
|
|
24
|
+
/** Width of the drawer (CSS value). Default: '240px' */
|
|
25
|
+
width?: string
|
|
26
|
+
/** The drawer content component */
|
|
27
|
+
component: JSX.Element
|
|
28
|
+
/** Initial open state for collapsible drawers. Default: true */
|
|
29
|
+
defaultOpen?: boolean
|
|
30
|
+
/** Auto-collapse the drawer below this breakpoint (uses ScreenService) */
|
|
31
|
+
collapseOnBreakpoint?: ScreenSize
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Props for the PageLayout component.
|
|
36
|
+
*/
|
|
37
|
+
export type PageLayoutProps = {
|
|
38
|
+
/** AppBar configuration */
|
|
39
|
+
appBar?: AppBarConfig
|
|
40
|
+
/** Drawer configurations for left and/or right sides */
|
|
41
|
+
drawer?: {
|
|
42
|
+
left?: DrawerConfig
|
|
43
|
+
right?: DrawerConfig
|
|
44
|
+
}
|
|
45
|
+
/** Gap between the AppBar and the content area (CSS value). Default: '0px' */
|
|
46
|
+
topGap?: string
|
|
47
|
+
/** Gap between the drawers and the content area (CSS value). Default: '0px' */
|
|
48
|
+
sideGap?: string
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const DEFAULT_APPBAR_HEIGHT = '48px'
|
|
52
|
+
const DEFAULT_DRAWER_WIDTH = '240px'
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* PageLayout component for full-viewport application layouts.
|
|
56
|
+
*
|
|
57
|
+
* Provides a structured layout with:
|
|
58
|
+
* - Optional AppBar (permanent or auto-hide)
|
|
59
|
+
* - Optional left/right drawers (permanent, collapsible, or temporary)
|
|
60
|
+
* - Main content area with automatic margin management
|
|
61
|
+
* - Configurable gaps between AppBar/drawers and content
|
|
62
|
+
* - Responsive drawer collapse via `collapseOnBreakpoint`
|
|
63
|
+
*
|
|
64
|
+
* The LayoutService is scoped to this component, so CSS variables are isolated
|
|
65
|
+
* and automatically cleaned up when navigating away.
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```tsx
|
|
69
|
+
* <PageLayout
|
|
70
|
+
* appBar={{
|
|
71
|
+
* variant: 'permanent',
|
|
72
|
+
* component: <MyAppBar />,
|
|
73
|
+
* }}
|
|
74
|
+
* drawer={{
|
|
75
|
+
* left: {
|
|
76
|
+
* variant: 'collapsible',
|
|
77
|
+
* component: <Sidebar />,
|
|
78
|
+
* collapseOnBreakpoint: 'md', // Auto-collapse below 900px
|
|
79
|
+
* },
|
|
80
|
+
* }}
|
|
81
|
+
* topGap="16px"
|
|
82
|
+
* sideGap="24px"
|
|
83
|
+
* >
|
|
84
|
+
* <MainContent />
|
|
85
|
+
* </PageLayout>
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
export const PageLayout = Shade<PageLayoutProps>({
|
|
89
|
+
shadowDomName: 'shade-page-layout',
|
|
90
|
+
css: {
|
|
91
|
+
display: 'block',
|
|
92
|
+
position: 'fixed',
|
|
93
|
+
top: '0',
|
|
94
|
+
left: '0',
|
|
95
|
+
width: '100%',
|
|
96
|
+
height: '100%',
|
|
97
|
+
overflow: 'hidden',
|
|
98
|
+
background: cssVariableTheme.background.default,
|
|
99
|
+
|
|
100
|
+
'& div[is="shade-paper"]': {
|
|
101
|
+
margin: '0',
|
|
102
|
+
},
|
|
103
|
+
|
|
104
|
+
// AppBar container
|
|
105
|
+
'& .page-layout-appbar': {
|
|
106
|
+
position: 'fixed',
|
|
107
|
+
top: '0',
|
|
108
|
+
left: '0',
|
|
109
|
+
right: '0',
|
|
110
|
+
zIndex: cssVariableTheme.zIndex.appBar,
|
|
111
|
+
transition: `top ${cssVariableTheme.transitions.duration.slow} ${cssVariableTheme.transitions.easing.easeInOut}`,
|
|
112
|
+
height: `var(${LAYOUT_CSS_VARIABLES.appBarHeight})`,
|
|
113
|
+
},
|
|
114
|
+
|
|
115
|
+
// Auto-hide AppBar styles (controlled via host data attributes)
|
|
116
|
+
'&[data-appbar-auto-hide] .page-layout-appbar': {
|
|
117
|
+
top: 'calc(-1 * var(--layout-appbar-height, 48px))',
|
|
118
|
+
},
|
|
119
|
+
'&[data-appbar-auto-hide] .page-layout-appbar:hover': {
|
|
120
|
+
top: '0',
|
|
121
|
+
},
|
|
122
|
+
'&[data-appbar-auto-hide][data-appbar-visible] .page-layout-appbar': {
|
|
123
|
+
top: '0',
|
|
124
|
+
},
|
|
125
|
+
|
|
126
|
+
// Drawer containers - use CSS transitions
|
|
127
|
+
'& .page-layout-drawer': {
|
|
128
|
+
position: 'fixed',
|
|
129
|
+
top: 'var(--layout-appbar-height, 48px)',
|
|
130
|
+
bottom: '0',
|
|
131
|
+
zIndex: cssVariableTheme.zIndex.drawer,
|
|
132
|
+
overflow: 'hidden',
|
|
133
|
+
background: cssVariableTheme.background.paper,
|
|
134
|
+
transition: `transform ${cssVariableTheme.transitions.duration.slow} ${cssVariableTheme.transitions.easing.easeInOut}`,
|
|
135
|
+
},
|
|
136
|
+
'& .page-layout-drawer-left': {
|
|
137
|
+
left: '0',
|
|
138
|
+
width: 'var(--layout-drawer-left-configured-width, 240px)',
|
|
139
|
+
borderRight: `1px solid ${cssVariableTheme.divider}`,
|
|
140
|
+
transform: 'translateX(0)',
|
|
141
|
+
},
|
|
142
|
+
'& .page-layout-drawer-right': {
|
|
143
|
+
right: '0',
|
|
144
|
+
width: 'var(--layout-drawer-right-configured-width, 240px)',
|
|
145
|
+
borderLeft: `1px solid ${cssVariableTheme.divider}`,
|
|
146
|
+
transform: 'translateX(0)',
|
|
147
|
+
},
|
|
148
|
+
|
|
149
|
+
// Drawer closed states (controlled via host data attributes)
|
|
150
|
+
'&[data-drawer-left-closed] .page-layout-drawer-left': {
|
|
151
|
+
transform: 'translateX(-100%)',
|
|
152
|
+
pointerEvents: 'none',
|
|
153
|
+
},
|
|
154
|
+
'&[data-drawer-right-closed] .page-layout-drawer-right': {
|
|
155
|
+
transform: 'translateX(100%)',
|
|
156
|
+
pointerEvents: 'none',
|
|
157
|
+
},
|
|
158
|
+
|
|
159
|
+
// Temporary drawer backdrop
|
|
160
|
+
'& .page-layout-drawer-backdrop': {
|
|
161
|
+
position: 'fixed',
|
|
162
|
+
top: '0',
|
|
163
|
+
left: '0',
|
|
164
|
+
right: '0',
|
|
165
|
+
bottom: '0',
|
|
166
|
+
backgroundColor: cssVariableTheme.action.backdrop,
|
|
167
|
+
zIndex: cssVariableTheme.zIndex.drawer,
|
|
168
|
+
opacity: '0',
|
|
169
|
+
pointerEvents: 'none',
|
|
170
|
+
transition: `opacity ${cssVariableTheme.transitions.duration.slow} ${cssVariableTheme.transitions.easing.easeInOut}`,
|
|
171
|
+
},
|
|
172
|
+
'&[data-backdrop-visible] .page-layout-drawer-backdrop': {
|
|
173
|
+
opacity: '1',
|
|
174
|
+
pointerEvents: 'auto',
|
|
175
|
+
},
|
|
176
|
+
|
|
177
|
+
// Content area - uses CSS variables for positioning
|
|
178
|
+
'& .page-layout-content': {
|
|
179
|
+
position: 'absolute',
|
|
180
|
+
top: '0',
|
|
181
|
+
bottom: '0',
|
|
182
|
+
overflow: 'auto',
|
|
183
|
+
paddingTop: 'var(--layout-content-padding-top, 0px)',
|
|
184
|
+
paddingLeft: 'var(--layout-side-gap, 0px)',
|
|
185
|
+
paddingRight: 'var(--layout-side-gap, 0px)',
|
|
186
|
+
left: 'var(--layout-content-margin-left, 0px)',
|
|
187
|
+
right: 'var(--layout-content-margin-right, 0px)',
|
|
188
|
+
transition: `left ${cssVariableTheme.transitions.duration.slow} ${cssVariableTheme.transitions.easing.easeInOut}, right ${cssVariableTheme.transitions.duration.slow} ${cssVariableTheme.transitions.easing.easeInOut}`,
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
|
|
192
|
+
render: ({ props, children, injector, useObservable, useDisposable, useHostProps }) => {
|
|
193
|
+
// Create scoped LayoutService (CSS variables are set on the host via useHostProps)
|
|
194
|
+
const layoutService = useDisposable('layoutService', () => new LayoutService())
|
|
195
|
+
|
|
196
|
+
// Create a child injector with the scoped LayoutService
|
|
197
|
+
// This allows child components (like DrawerToggleButton) to access it
|
|
198
|
+
const childInjector = useDisposable('childInjector', () => {
|
|
199
|
+
const child = injector.createChild()
|
|
200
|
+
child.setExplicitInstance(layoutService, LayoutService)
|
|
201
|
+
return child
|
|
202
|
+
})
|
|
203
|
+
|
|
204
|
+
// Propagate the child injector on the host so descendants can find it
|
|
205
|
+
useHostProps({ injector: childInjector })
|
|
206
|
+
|
|
207
|
+
const screenService = injector.getInstance(ScreenService)
|
|
208
|
+
|
|
209
|
+
// Initialize AppBar
|
|
210
|
+
const appBarHeight = props.appBar?.height ?? DEFAULT_APPBAR_HEIGHT
|
|
211
|
+
if (props.appBar) {
|
|
212
|
+
layoutService.appBarHeight.setValue(appBarHeight)
|
|
213
|
+
|
|
214
|
+
// Only reset appBarVisible when transitioning to auto-hide (not on every render)
|
|
215
|
+
const prevVariant = layoutService.appBarVariant.getValue()
|
|
216
|
+
layoutService.appBarVariant.setValue(props.appBar.variant)
|
|
217
|
+
if (props.appBar.variant === 'auto-hide' && prevVariant !== 'auto-hide') {
|
|
218
|
+
layoutService.appBarVisible.setValue(false)
|
|
219
|
+
}
|
|
220
|
+
} else {
|
|
221
|
+
layoutService.appBarHeight.setValue('0px')
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// Initialize gaps
|
|
225
|
+
layoutService.setTopGap(props.topGap ?? '0px')
|
|
226
|
+
layoutService.setSideGap(props.sideGap ?? '0px')
|
|
227
|
+
|
|
228
|
+
// Initialize drawers
|
|
229
|
+
const initializeDrawer = (position: 'left' | 'right', config: DrawerConfig) => {
|
|
230
|
+
const width = config.width ?? DEFAULT_DRAWER_WIDTH
|
|
231
|
+
// Permanent drawers are always open
|
|
232
|
+
// Collapsible drawers default to open unless defaultOpen is false
|
|
233
|
+
// Temporary drawers default to closed unless defaultOpen is true
|
|
234
|
+
const isOpen =
|
|
235
|
+
config.variant === 'permanent' ||
|
|
236
|
+
(config.variant === 'collapsible' && (config.defaultOpen ?? true)) ||
|
|
237
|
+
(config.variant === 'temporary' && config.defaultOpen === true)
|
|
238
|
+
const currentState = layoutService.drawerState.getValue()[position]
|
|
239
|
+
|
|
240
|
+
// Only initialize if not already set (preserve user interactions)
|
|
241
|
+
if (!currentState) {
|
|
242
|
+
layoutService.initDrawer(position, { open: isOpen, width, variant: config.variant })
|
|
243
|
+
} else if (currentState.width !== width || currentState.variant !== config.variant) {
|
|
244
|
+
// Update if width or variant changed
|
|
245
|
+
layoutService.initDrawer(position, { ...currentState, width, variant: config.variant })
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
if (props.drawer?.left) {
|
|
250
|
+
initializeDrawer('left', props.drawer.left)
|
|
251
|
+
}
|
|
252
|
+
if (props.drawer?.right) {
|
|
253
|
+
initializeDrawer('right', props.drawer.right)
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// Set up responsive breakpoint listeners for drawers
|
|
257
|
+
const setupBreakpointListener = (position: 'left' | 'right', config: DrawerConfig) => {
|
|
258
|
+
const { collapseOnBreakpoint, variant } = config
|
|
259
|
+
|
|
260
|
+
if (!collapseOnBreakpoint || variant === 'permanent') {
|
|
261
|
+
return { [Symbol.dispose]: () => {} }
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
const breakpointObservable = screenService.screenSize.atLeast[collapseOnBreakpoint]
|
|
265
|
+
|
|
266
|
+
const applyBreakpoint = (isAtLeast: boolean) => {
|
|
267
|
+
const currentState = layoutService.drawerState.getValue()[position]
|
|
268
|
+
const currentlyOpen = currentState?.open ?? false
|
|
269
|
+
|
|
270
|
+
// When screen becomes smaller than breakpoint, close the drawer
|
|
271
|
+
// When screen becomes larger than breakpoint, open the drawer (for collapsible)
|
|
272
|
+
if (variant === 'collapsible') {
|
|
273
|
+
// Only update if the state needs to change
|
|
274
|
+
if (isAtLeast !== currentlyOpen) {
|
|
275
|
+
layoutService.setDrawerOpen(position, isAtLeast)
|
|
276
|
+
}
|
|
277
|
+
} else if (variant === 'temporary' && isAtLeast && currentlyOpen) {
|
|
278
|
+
// For temporary drawers, close when screen is large enough
|
|
279
|
+
layoutService.setDrawerOpen(position, false)
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
const subscription: ValueObserver<boolean> = breakpointObservable.subscribe(applyBreakpoint)
|
|
284
|
+
|
|
285
|
+
// Apply the current breakpoint value immediately since subscribe only fires on changes
|
|
286
|
+
applyBreakpoint(breakpointObservable.getValue())
|
|
287
|
+
|
|
288
|
+
return subscription
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// Set up breakpoint listeners for left and right drawers
|
|
292
|
+
useDisposable('breakpoint-listener-left', () => {
|
|
293
|
+
if (props.drawer?.left?.collapseOnBreakpoint) {
|
|
294
|
+
return setupBreakpointListener('left', props.drawer.left)
|
|
295
|
+
}
|
|
296
|
+
return { [Symbol.dispose]: () => {} }
|
|
297
|
+
})
|
|
298
|
+
|
|
299
|
+
useDisposable('breakpoint-listener-right', () => {
|
|
300
|
+
if (props.drawer?.right?.collapseOnBreakpoint) {
|
|
301
|
+
return setupBreakpointListener('right', props.drawer.right)
|
|
302
|
+
}
|
|
303
|
+
return { [Symbol.dispose]: () => {} }
|
|
304
|
+
})
|
|
305
|
+
|
|
306
|
+
// Subscribe to drawer state and appbar visibility - re-render to update host props
|
|
307
|
+
const [drawerState] = useObservable('drawerState', layoutService.drawerState)
|
|
308
|
+
const [isAppBarVisible] = useObservable('appBarVisible', layoutService.appBarVisible)
|
|
309
|
+
|
|
310
|
+
// Set host classes via useHostProps for CSS-based animations
|
|
311
|
+
const isLeftOpen = drawerState.left?.open ?? false
|
|
312
|
+
const isRightOpen = drawerState.right?.open ?? false
|
|
313
|
+
const isLeftTemporaryOpen = props.drawer?.left?.variant === 'temporary' && isLeftOpen
|
|
314
|
+
const isRightTemporaryOpen = props.drawer?.right?.variant === 'temporary' && isRightOpen
|
|
315
|
+
|
|
316
|
+
// Compute CSS variables from LayoutService state
|
|
317
|
+
const appBarHeightVal = layoutService.appBarHeight.getValue()
|
|
318
|
+
const appBarVariantVal = layoutService.appBarVariant.getValue()
|
|
319
|
+
const topGapVal = layoutService.topGap.getValue()
|
|
320
|
+
const sideGapVal = layoutService.sideGap.getValue()
|
|
321
|
+
const contentPaddingTop = appBarVariantVal === 'auto-hide' ? topGapVal : `calc(${appBarHeightVal} + ${topGapVal})`
|
|
322
|
+
const leftWidth = drawerState.left?.open ? (drawerState.left.width ?? '0px') : '0px'
|
|
323
|
+
const rightWidth = drawerState.right?.open ? (drawerState.right.width ?? '0px') : '0px'
|
|
324
|
+
const leftContentMargin = layoutService.getContentMarginForPosition('left')
|
|
325
|
+
const rightContentMargin = layoutService.getContentMarginForPosition('right')
|
|
326
|
+
|
|
327
|
+
useHostProps({
|
|
328
|
+
...(!isLeftOpen ? { 'data-drawer-left-closed': '' } : {}),
|
|
329
|
+
...(!isRightOpen ? { 'data-drawer-right-closed': '' } : {}),
|
|
330
|
+
...(props.appBar?.variant === 'auto-hide' ? { 'data-appbar-auto-hide': '' } : {}),
|
|
331
|
+
...(props.appBar?.variant === 'auto-hide' && isAppBarVisible ? { 'data-appbar-visible': '' } : {}),
|
|
332
|
+
...(isLeftTemporaryOpen || isRightTemporaryOpen ? { 'data-backdrop-visible': '' } : {}),
|
|
333
|
+
style: {
|
|
334
|
+
'--layout-appbar-height': appBarHeightVal,
|
|
335
|
+
'--layout-top-gap': topGapVal,
|
|
336
|
+
'--layout-side-gap': sideGapVal,
|
|
337
|
+
'--layout-content-padding-top': contentPaddingTop,
|
|
338
|
+
'--layout-content-margin-top': appBarHeightVal,
|
|
339
|
+
'--layout-drawer-left-configured-width': drawerState.left?.width ?? '0px',
|
|
340
|
+
'--layout-drawer-left-width': leftWidth,
|
|
341
|
+
'--layout-content-margin-left': leftContentMargin,
|
|
342
|
+
'--layout-drawer-right-configured-width': drawerState.right?.width ?? '0px',
|
|
343
|
+
'--layout-drawer-right-width': rightWidth,
|
|
344
|
+
'--layout-content-margin-right': rightContentMargin,
|
|
345
|
+
},
|
|
346
|
+
})
|
|
347
|
+
|
|
348
|
+
// Handle temporary drawer backdrop click
|
|
349
|
+
const handleBackdropClick = () => {
|
|
350
|
+
const state = layoutService.drawerState.getValue()
|
|
351
|
+
if (props.drawer?.left?.variant === 'temporary' && state.left?.open) {
|
|
352
|
+
layoutService.setDrawerOpen('left', false)
|
|
353
|
+
}
|
|
354
|
+
if (props.drawer?.right?.variant === 'temporary' && state.right?.open) {
|
|
355
|
+
layoutService.setDrawerOpen('right', false)
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
return (
|
|
360
|
+
<div style={{ display: 'contents' }}>
|
|
361
|
+
{/* AppBar */}
|
|
362
|
+
{props.appBar && (
|
|
363
|
+
<div className="page-layout-appbar" data-testid="page-layout-appbar">
|
|
364
|
+
{props.appBar.component}
|
|
365
|
+
</div>
|
|
366
|
+
)}
|
|
367
|
+
|
|
368
|
+
{/* Backdrop for temporary drawers */}
|
|
369
|
+
<div className="page-layout-drawer-backdrop" onclick={handleBackdropClick} data-testid="page-layout-backdrop" />
|
|
370
|
+
|
|
371
|
+
{/* Left Drawer */}
|
|
372
|
+
{props.drawer?.left && (
|
|
373
|
+
<div className="page-layout-drawer page-layout-drawer-left" data-testid="page-layout-drawer-left">
|
|
374
|
+
{props.drawer.left.component}
|
|
375
|
+
</div>
|
|
376
|
+
)}
|
|
377
|
+
|
|
378
|
+
{/* Right Drawer */}
|
|
379
|
+
{props.drawer?.right && (
|
|
380
|
+
<div className="page-layout-drawer page-layout-drawer-right" data-testid="page-layout-drawer-right">
|
|
381
|
+
{props.drawer.right.component}
|
|
382
|
+
</div>
|
|
383
|
+
)}
|
|
384
|
+
|
|
385
|
+
{/* Main Content */}
|
|
386
|
+
<main className="page-layout-content" data-testid="page-layout-content">
|
|
387
|
+
{children}
|
|
388
|
+
</main>
|
|
389
|
+
</div>
|
|
390
|
+
)
|
|
391
|
+
},
|
|
392
|
+
})
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { createComponent, flushUpdates } from '@furystack/shades'
|
|
2
|
+
import { describe, expect, it, vi } from 'vitest'
|
|
3
|
+
import type { PaginationProps } from './pagination.js'
|
|
4
|
+
import { Pagination } from './pagination.js'
|
|
5
|
+
|
|
6
|
+
describe('Pagination', () => {
|
|
7
|
+
it('should be defined', () => {
|
|
8
|
+
expect(Pagination).toBeDefined()
|
|
9
|
+
expect(typeof Pagination).toBe('function')
|
|
10
|
+
})
|
|
11
|
+
|
|
12
|
+
it('should create a pagination element with required props', () => {
|
|
13
|
+
const onPageChange = vi.fn()
|
|
14
|
+
const el = (<Pagination count={10} page={1} onPageChange={onPageChange} />) as unknown as HTMLElement
|
|
15
|
+
expect(el).toBeDefined()
|
|
16
|
+
expect(el.tagName?.toLowerCase()).toBe('shade-pagination')
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
it('should set props correctly', () => {
|
|
20
|
+
const onPageChange = vi.fn()
|
|
21
|
+
const el = (
|
|
22
|
+
<Pagination
|
|
23
|
+
count={10}
|
|
24
|
+
page={3}
|
|
25
|
+
onPageChange={onPageChange}
|
|
26
|
+
siblingCount={2}
|
|
27
|
+
boundaryCount={1}
|
|
28
|
+
disabled
|
|
29
|
+
size="small"
|
|
30
|
+
color="primary"
|
|
31
|
+
/>
|
|
32
|
+
) as unknown as JSX.Element
|
|
33
|
+
const props = el.props as PaginationProps
|
|
34
|
+
expect(props.count).toBe(10)
|
|
35
|
+
expect(props.page).toBe(3)
|
|
36
|
+
expect(props.siblingCount).toBe(2)
|
|
37
|
+
expect(props.boundaryCount).toBe(1)
|
|
38
|
+
expect(props.disabled).toBe(true)
|
|
39
|
+
expect(props.size).toBe('small')
|
|
40
|
+
expect(props.color).toBe('primary')
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
it('should render page buttons for small page counts', async () => {
|
|
44
|
+
const onPageChange = vi.fn()
|
|
45
|
+
const el = (
|
|
46
|
+
<div>
|
|
47
|
+
<Pagination count={5} page={1} onPageChange={onPageChange} />
|
|
48
|
+
</div>
|
|
49
|
+
)
|
|
50
|
+
const pagination = el.firstElementChild as JSX.Element
|
|
51
|
+
pagination.updateComponent()
|
|
52
|
+
await flushUpdates()
|
|
53
|
+
// Should have prev + 5 page buttons + next = 7 buttons
|
|
54
|
+
const items = pagination.querySelectorAll('.pagination-item')
|
|
55
|
+
expect(items.length).toBe(7) // prev + 5 pages + next
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
it('should render ellipsis for large page counts', async () => {
|
|
59
|
+
const onPageChange = vi.fn()
|
|
60
|
+
const el = (
|
|
61
|
+
<div>
|
|
62
|
+
<Pagination count={20} page={10} onPageChange={onPageChange} />
|
|
63
|
+
</div>
|
|
64
|
+
)
|
|
65
|
+
const pagination = el.firstElementChild as JSX.Element
|
|
66
|
+
pagination.updateComponent()
|
|
67
|
+
await flushUpdates()
|
|
68
|
+
const ellipses = pagination.querySelectorAll('.pagination-ellipsis')
|
|
69
|
+
expect(ellipses.length).toBe(2)
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
it('should mark current page as selected', async () => {
|
|
73
|
+
const onPageChange = vi.fn()
|
|
74
|
+
const el = (
|
|
75
|
+
<div>
|
|
76
|
+
<Pagination count={5} page={3} onPageChange={onPageChange} />
|
|
77
|
+
</div>
|
|
78
|
+
)
|
|
79
|
+
const pagination = el.firstElementChild as JSX.Element
|
|
80
|
+
pagination.updateComponent()
|
|
81
|
+
await flushUpdates()
|
|
82
|
+
const selected = pagination.querySelector('[data-selected]') as HTMLElement
|
|
83
|
+
expect(selected).not.toBeNull()
|
|
84
|
+
expect(selected.textContent).toBe('3')
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
it('should set data-disabled on prev button when on first page', async () => {
|
|
88
|
+
const onPageChange = vi.fn()
|
|
89
|
+
const el = (
|
|
90
|
+
<div>
|
|
91
|
+
<Pagination count={5} page={1} onPageChange={onPageChange} />
|
|
92
|
+
</div>
|
|
93
|
+
)
|
|
94
|
+
const pagination = el.firstElementChild as JSX.Element
|
|
95
|
+
pagination.updateComponent()
|
|
96
|
+
await flushUpdates()
|
|
97
|
+
const prevButton = pagination.querySelector('.pagination-item') as HTMLElement
|
|
98
|
+
expect(prevButton.hasAttribute('data-disabled')).toBe(true)
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
it('should set data-disabled on next button when on last page', async () => {
|
|
102
|
+
const onPageChange = vi.fn()
|
|
103
|
+
const el = (
|
|
104
|
+
<div>
|
|
105
|
+
<Pagination count={5} page={5} onPageChange={onPageChange} />
|
|
106
|
+
</div>
|
|
107
|
+
)
|
|
108
|
+
const pagination = el.firstElementChild as JSX.Element
|
|
109
|
+
pagination.updateComponent()
|
|
110
|
+
await flushUpdates()
|
|
111
|
+
const items = pagination.querySelectorAll('.pagination-item')
|
|
112
|
+
const nextButton = items[items.length - 1] as HTMLElement
|
|
113
|
+
expect(nextButton.hasAttribute('data-disabled')).toBe(true)
|
|
114
|
+
})
|
|
115
|
+
|
|
116
|
+
it('should call onPageChange with the correct page when a page button is clicked', async () => {
|
|
117
|
+
const onPageChange = vi.fn()
|
|
118
|
+
const el = (
|
|
119
|
+
<div>
|
|
120
|
+
<Pagination count={5} page={1} onPageChange={onPageChange} />
|
|
121
|
+
</div>
|
|
122
|
+
)
|
|
123
|
+
const pagination = el.firstElementChild as JSX.Element
|
|
124
|
+
pagination.updateComponent()
|
|
125
|
+
await flushUpdates()
|
|
126
|
+
// Click page 3 (index: prev=0, page1=1, page2=2, page3=3)
|
|
127
|
+
const items = pagination.querySelectorAll('.pagination-item')
|
|
128
|
+
;(items[3] as HTMLElement).click()
|
|
129
|
+
expect(onPageChange).toHaveBeenCalledWith(3)
|
|
130
|
+
})
|
|
131
|
+
|
|
132
|
+
it('should call onPageChange with page-1 when prev button is clicked', async () => {
|
|
133
|
+
const onPageChange = vi.fn()
|
|
134
|
+
const el = (
|
|
135
|
+
<div>
|
|
136
|
+
<Pagination count={5} page={3} onPageChange={onPageChange} />
|
|
137
|
+
</div>
|
|
138
|
+
)
|
|
139
|
+
const pagination = el.firstElementChild as JSX.Element
|
|
140
|
+
pagination.updateComponent()
|
|
141
|
+
await flushUpdates()
|
|
142
|
+
const prevButton = pagination.querySelector('.pagination-item') as HTMLElement
|
|
143
|
+
prevButton.click()
|
|
144
|
+
expect(onPageChange).toHaveBeenCalledWith(2)
|
|
145
|
+
})
|
|
146
|
+
|
|
147
|
+
it('should call onPageChange with page+1 when next button is clicked', async () => {
|
|
148
|
+
const onPageChange = vi.fn()
|
|
149
|
+
const el = (
|
|
150
|
+
<div>
|
|
151
|
+
<Pagination count={5} page={3} onPageChange={onPageChange} />
|
|
152
|
+
</div>
|
|
153
|
+
)
|
|
154
|
+
const pagination = el.firstElementChild as JSX.Element
|
|
155
|
+
pagination.updateComponent()
|
|
156
|
+
await flushUpdates()
|
|
157
|
+
const items = pagination.querySelectorAll('.pagination-item')
|
|
158
|
+
const nextButton = items[items.length - 1] as HTMLElement
|
|
159
|
+
nextButton.click()
|
|
160
|
+
expect(onPageChange).toHaveBeenCalledWith(4)
|
|
161
|
+
})
|
|
162
|
+
|
|
163
|
+
it('should not call onPageChange when clicking the currently selected page', async () => {
|
|
164
|
+
const onPageChange = vi.fn()
|
|
165
|
+
const el = (
|
|
166
|
+
<div>
|
|
167
|
+
<Pagination count={5} page={3} onPageChange={onPageChange} />
|
|
168
|
+
</div>
|
|
169
|
+
)
|
|
170
|
+
const pagination = el.firstElementChild as JSX.Element
|
|
171
|
+
pagination.updateComponent()
|
|
172
|
+
await flushUpdates()
|
|
173
|
+
const selected = pagination.querySelector('[data-selected]') as HTMLElement
|
|
174
|
+
selected.click()
|
|
175
|
+
expect(onPageChange).not.toHaveBeenCalled()
|
|
176
|
+
})
|
|
177
|
+
|
|
178
|
+
it('should set data-size attribute when size is provided', async () => {
|
|
179
|
+
const onPageChange = vi.fn()
|
|
180
|
+
const el = (
|
|
181
|
+
<div>
|
|
182
|
+
<Pagination count={5} page={1} onPageChange={onPageChange} size="small" />
|
|
183
|
+
</div>
|
|
184
|
+
)
|
|
185
|
+
const pagination = el.firstElementChild as JSX.Element
|
|
186
|
+
pagination.updateComponent()
|
|
187
|
+
await flushUpdates()
|
|
188
|
+
expect(pagination.getAttribute('data-size')).toBe('small')
|
|
189
|
+
})
|
|
190
|
+
|
|
191
|
+
it('should set data-disabled on host when disabled', async () => {
|
|
192
|
+
const onPageChange = vi.fn()
|
|
193
|
+
const el = (
|
|
194
|
+
<div>
|
|
195
|
+
<Pagination count={5} page={1} onPageChange={onPageChange} disabled />
|
|
196
|
+
</div>
|
|
197
|
+
)
|
|
198
|
+
const pagination = el.firstElementChild as JSX.Element
|
|
199
|
+
pagination.updateComponent()
|
|
200
|
+
await flushUpdates()
|
|
201
|
+
expect(pagination.hasAttribute('data-disabled')).toBe(true)
|
|
202
|
+
})
|
|
203
|
+
|
|
204
|
+
it('should set CSS custom properties for palette color', async () => {
|
|
205
|
+
const onPageChange = vi.fn()
|
|
206
|
+
const el = (
|
|
207
|
+
<div>
|
|
208
|
+
<Pagination count={5} page={1} onPageChange={onPageChange} color="primary" />
|
|
209
|
+
</div>
|
|
210
|
+
)
|
|
211
|
+
const pagination = el.firstElementChild as JSX.Element
|
|
212
|
+
pagination.updateComponent()
|
|
213
|
+
await flushUpdates()
|
|
214
|
+
expect(pagination.style.getPropertyValue('--pagination-color-main')).toBe(
|
|
215
|
+
'var(--shades-theme-palette-primary-main)',
|
|
216
|
+
)
|
|
217
|
+
})
|
|
218
|
+
|
|
219
|
+
it('should set default CSS custom properties when no color prop', async () => {
|
|
220
|
+
const onPageChange = vi.fn()
|
|
221
|
+
const el = (
|
|
222
|
+
<div>
|
|
223
|
+
<Pagination count={5} page={1} onPageChange={onPageChange} />
|
|
224
|
+
</div>
|
|
225
|
+
)
|
|
226
|
+
const pagination = el.firstElementChild as JSX.Element
|
|
227
|
+
pagination.updateComponent()
|
|
228
|
+
await flushUpdates()
|
|
229
|
+
expect(pagination.style.getPropertyValue('--pagination-color-main')).toBe('var(--shades-theme-text-primary)')
|
|
230
|
+
})
|
|
231
|
+
|
|
232
|
+
it('should render only left ellipsis when near the end', async () => {
|
|
233
|
+
const onPageChange = vi.fn()
|
|
234
|
+
const el = (
|
|
235
|
+
<div>
|
|
236
|
+
<Pagination count={20} page={19} onPageChange={onPageChange} />
|
|
237
|
+
</div>
|
|
238
|
+
)
|
|
239
|
+
const pagination = el.firstElementChild as JSX.Element
|
|
240
|
+
pagination.updateComponent()
|
|
241
|
+
await flushUpdates()
|
|
242
|
+
const ellipses = pagination.querySelectorAll('.pagination-ellipsis')
|
|
243
|
+
expect(ellipses.length).toBe(1)
|
|
244
|
+
})
|
|
245
|
+
|
|
246
|
+
it('should render only right ellipsis when near the start', async () => {
|
|
247
|
+
const onPageChange = vi.fn()
|
|
248
|
+
const el = (
|
|
249
|
+
<div>
|
|
250
|
+
<Pagination count={20} page={2} onPageChange={onPageChange} />
|
|
251
|
+
</div>
|
|
252
|
+
)
|
|
253
|
+
const pagination = el.firstElementChild as JSX.Element
|
|
254
|
+
pagination.updateComponent()
|
|
255
|
+
await flushUpdates()
|
|
256
|
+
const ellipses = pagination.querySelectorAll('.pagination-ellipsis')
|
|
257
|
+
expect(ellipses.length).toBe(1)
|
|
258
|
+
})
|
|
259
|
+
|
|
260
|
+
it('should render all pages without ellipsis for count equal to total display slots', async () => {
|
|
261
|
+
const onPageChange = vi.fn()
|
|
262
|
+
const el = (
|
|
263
|
+
<div>
|
|
264
|
+
<Pagination count={7} page={4} onPageChange={onPageChange} />
|
|
265
|
+
</div>
|
|
266
|
+
)
|
|
267
|
+
const pagination = el.firstElementChild as JSX.Element
|
|
268
|
+
pagination.updateComponent()
|
|
269
|
+
await flushUpdates()
|
|
270
|
+
const ellipses = pagination.querySelectorAll('.pagination-ellipsis')
|
|
271
|
+
expect(ellipses.length).toBe(0)
|
|
272
|
+
const items = pagination.querySelectorAll('.pagination-item')
|
|
273
|
+
expect(items.length).toBe(9) // prev + 7 pages + next
|
|
274
|
+
})
|
|
275
|
+
})
|