zabi-components 7.0.2 → 8.1.0
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 +1924 -0
- package/README.md +287 -11
- package/THEME.md +149 -332
- package/THEMING.md +1329 -163
- package/dist/atoms/ActionPanel.svelte +24 -9
- package/dist/atoms/ActionPanel.svelte.d.ts +2 -0
- package/dist/atoms/Avatar.svelte +104 -0
- package/dist/atoms/Avatar.svelte.d.ts +34 -0
- package/dist/atoms/Badge.svelte +124 -58
- package/dist/atoms/Badge.svelte.d.ts +17 -5
- package/dist/atoms/Button.svelte +212 -62
- package/dist/atoms/Button.svelte.d.ts +33 -2
- package/dist/atoms/Card.svelte +31 -28
- package/dist/atoms/Card.svelte.d.ts +5 -2
- package/dist/atoms/CardContent.svelte +10 -2
- package/dist/atoms/CardContent.svelte.d.ts +2 -0
- package/dist/atoms/CardFooter.svelte +10 -2
- package/dist/atoms/CardFooter.svelte.d.ts +2 -0
- package/dist/atoms/CardHeader.svelte +26 -6
- package/dist/atoms/CardHeader.svelte.d.ts +2 -0
- package/dist/atoms/Checkbox.svelte +52 -21
- package/dist/atoms/Checkbox.svelte.d.ts +6 -2
- package/dist/atoms/CodeBlock.svelte +35 -9
- package/dist/atoms/CodeBlock.svelte.d.ts +13 -3
- package/dist/atoms/ColorPicker.svelte +272 -52
- package/dist/atoms/ColorPicker.svelte.d.ts +6 -1
- package/dist/atoms/Container.svelte +17 -10
- package/dist/atoms/DateField.svelte +107 -0
- package/dist/atoms/DateField.svelte.d.ts +53 -0
- package/dist/atoms/Divider.svelte +4 -4
- package/dist/atoms/FeatureCard.svelte +4 -3
- package/dist/atoms/FieldMessages.svelte +69 -0
- package/dist/atoms/FieldMessages.svelte.d.ts +23 -0
- package/dist/atoms/FloatingActionButton.svelte +174 -0
- package/dist/atoms/FloatingActionButton.svelte.d.ts +51 -0
- package/dist/atoms/Heading.svelte +93 -32
- package/dist/atoms/Heading.svelte.d.ts +24 -4
- package/dist/atoms/IconButton.svelte +242 -53
- package/dist/atoms/IconButton.svelte.d.ts +49 -4
- package/dist/atoms/Input.svelte +267 -74
- package/dist/atoms/Input.svelte.d.ts +32 -2
- package/dist/atoms/List.svelte +13 -2
- package/dist/atoms/List.svelte.d.ts +2 -0
- package/dist/atoms/ListItem.svelte +44 -11
- package/dist/atoms/ListItem.svelte.d.ts +5 -0
- package/dist/atoms/ListItemLeading.svelte +4 -2
- package/dist/atoms/ListItemLeading.svelte.d.ts +1 -1
- package/dist/atoms/OptimizedImage.svelte +11 -2
- package/dist/atoms/OptimizedImage.svelte.d.ts +2 -0
- package/dist/atoms/Progress.svelte +31 -9
- package/dist/atoms/Progress.svelte.d.ts +6 -0
- package/dist/atoms/Radio.svelte +23 -3
- package/dist/atoms/Radio.svelte.d.ts +6 -2
- package/dist/atoms/Rating.svelte +494 -0
- package/dist/atoms/Rating.svelte.d.ts +56 -0
- package/dist/atoms/Select.svelte +475 -135
- package/dist/atoms/Select.svelte.d.ts +52 -2
- package/dist/atoms/SelectionControl.svelte +99 -18
- package/dist/atoms/SelectionControl.svelte.d.ts +6 -3
- package/dist/atoms/Skeleton.svelte +5 -3
- package/dist/atoms/Slider.svelte +309 -0
- package/dist/atoms/Slider.svelte.d.ts +40 -0
- package/dist/atoms/Spinner.svelte +57 -0
- package/dist/atoms/Spinner.svelte.d.ts +19 -0
- package/dist/atoms/Table.svelte +152 -6
- package/dist/atoms/Table.svelte.d.ts +15 -3
- package/dist/atoms/TemporalField.svelte +140 -0
- package/dist/atoms/TemporalField.svelte.d.ts +32 -0
- package/dist/atoms/Text.svelte +56 -15
- package/dist/atoms/Text.svelte.d.ts +13 -4
- package/dist/atoms/Textarea.svelte +57 -45
- package/dist/atoms/Textarea.svelte.d.ts +14 -2
- package/dist/atoms/ThemeToggle.svelte +238 -56
- package/dist/atoms/ThemeToggle.svelte.d.ts +28 -3
- package/dist/atoms/TimeField.svelte +108 -0
- package/dist/atoms/TimeField.svelte.d.ts +54 -0
- package/dist/atoms/Toast.svelte +25 -10
- package/dist/atoms/Toast.svelte.d.ts +2 -0
- package/dist/atoms/Toggle.svelte +60 -19
- package/dist/atoms/Toggle.svelte.d.ts +18 -2
- package/dist/atoms/Tooltip.svelte +583 -40
- package/dist/atoms/Tooltip.svelte.d.ts +26 -0
- package/dist/atoms/ZabiStringsProvider.svelte +45 -0
- package/dist/atoms/ZabiStringsProvider.svelte.d.ts +27 -0
- package/dist/atoms/index.d.ts +17 -0
- package/dist/atoms/index.js +12 -0
- package/dist/atoms/selection-control.styles.d.ts +36 -5
- package/dist/atoms/selection-control.styles.js +40 -9
- package/dist/components/atoms/index.d.ts +17 -0
- package/dist/components/atoms/index.d.ts.map +1 -1
- package/dist/components/atoms/selection-control.styles.d.ts +36 -5
- package/dist/components/atoms/selection-control.styles.d.ts.map +1 -1
- package/dist/components/index.d.ts +83 -3
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/molecules/index.d.ts +46 -0
- package/dist/components/molecules/index.d.ts.map +1 -1
- package/dist/components/molecules/toast-store.d.ts +53 -7
- package/dist/components/molecules/toast-store.d.ts.map +1 -1
- package/dist/components/organisms/index.d.ts +6 -0
- package/dist/components/organisms/index.d.ts.map +1 -1
- package/dist/components/types/variants.d.ts +15 -1
- package/dist/components/types/variants.d.ts.map +1 -1
- package/dist/components/util/app-shell.d.ts +28 -0
- package/dist/components/util/app-shell.d.ts.map +1 -0
- package/dist/components/util/avatar.d.ts +36 -0
- package/dist/components/util/avatar.d.ts.map +1 -0
- package/dist/components/util/bottom-sheet.d.ts +30 -0
- package/dist/components/util/bottom-sheet.d.ts.map +1 -0
- package/dist/components/util/bottom-tab-bar.d.ts +35 -0
- package/dist/components/util/bottom-tab-bar.d.ts.map +1 -0
- package/dist/components/util/calendar.d.ts +56 -0
- package/dist/components/util/calendar.d.ts.map +1 -0
- package/dist/components/util/cn.d.ts +8 -0
- package/dist/components/util/cn.d.ts.map +1 -0
- package/dist/components/util/collapsible.d.ts +58 -0
- package/dist/components/util/collapsible.d.ts.map +1 -0
- package/dist/components/util/confirm-dialog.d.ts +12 -0
- package/dist/components/util/confirm-dialog.d.ts.map +1 -0
- package/dist/components/util/date.d.ts +96 -0
- package/dist/components/util/date.d.ts.map +1 -0
- package/dist/components/util/drawer.d.ts +13 -0
- package/dist/components/util/drawer.d.ts.map +1 -0
- package/dist/components/util/dropdown.d.ts +47 -0
- package/dist/components/util/dropdown.d.ts.map +1 -0
- package/dist/components/util/field.d.ts +39 -0
- package/dist/components/util/field.d.ts.map +1 -0
- package/dist/components/util/fit-in-viewport.d.ts +201 -0
- package/dist/components/util/fit-in-viewport.d.ts.map +1 -0
- package/dist/components/util/focus-utils.d.ts +75 -2
- package/dist/components/util/focus-utils.d.ts.map +1 -1
- package/dist/components/util/hydration.d.ts +45 -0
- package/dist/components/util/hydration.d.ts.map +1 -0
- package/dist/components/util/keyboard-inset.d.ts +18 -0
- package/dist/components/util/keyboard-inset.d.ts.map +1 -0
- package/dist/components/util/media-grid.d.ts +51 -0
- package/dist/components/util/media-grid.d.ts.map +1 -0
- package/dist/components/util/media.d.ts +6 -0
- package/dist/components/util/media.d.ts.map +1 -0
- package/dist/components/util/overlay-chrome.d.ts +53 -0
- package/dist/components/util/overlay-chrome.d.ts.map +1 -0
- package/dist/components/util/overlay.d.ts +72 -0
- package/dist/components/util/overlay.d.ts.map +1 -0
- package/dist/components/util/photo.d.ts +215 -0
- package/dist/components/util/photo.d.ts.map +1 -0
- package/dist/components/util/portal.d.ts +23 -0
- package/dist/components/util/portal.d.ts.map +1 -0
- package/dist/components/util/pull-to-refresh.d.ts +27 -0
- package/dist/components/util/pull-to-refresh.d.ts.map +1 -0
- package/dist/components/util/radio-keys.d.ts +25 -0
- package/dist/components/util/radio-keys.d.ts.map +1 -0
- package/dist/components/util/rating.d.ts +23 -0
- package/dist/components/util/rating.d.ts.map +1 -0
- package/dist/components/util/ready-made-strings.d.ts +77 -0
- package/dist/components/util/ready-made-strings.d.ts.map +1 -0
- package/dist/components/util/scroll-padding.d.ts +20 -0
- package/dist/components/util/scroll-padding.d.ts.map +1 -0
- package/dist/components/util/segmented-control.d.ts +16 -0
- package/dist/components/util/segmented-control.d.ts.map +1 -0
- package/dist/components/util/select.d.ts +41 -0
- package/dist/components/util/select.d.ts.map +1 -0
- package/dist/components/util/sheet-drag.d.ts +60 -0
- package/dist/components/util/sheet-drag.d.ts.map +1 -0
- package/dist/components/util/sidebar.d.ts +63 -0
- package/dist/components/util/sidebar.d.ts.map +1 -0
- package/dist/components/util/sortable-list.d.ts +65 -0
- package/dist/components/util/sortable-list.d.ts.map +1 -0
- package/dist/components/util/ssr-safe.d.ts +4 -4
- package/dist/components/util/ssr-safe.d.ts.map +1 -1
- package/dist/components/util/stepper.d.ts +40 -0
- package/dist/components/util/stepper.d.ts.map +1 -0
- package/dist/components/util/swipeable-list-item.d.ts +36 -0
- package/dist/components/util/swipeable-list-item.d.ts.map +1 -0
- package/dist/components/util/theme-mode.d.ts +80 -0
- package/dist/components/util/theme-mode.d.ts.map +1 -0
- package/dist/components/util/toaster.d.ts +93 -0
- package/dist/components/util/toaster.d.ts.map +1 -0
- package/dist/components/util/tooltip.d.ts +10 -0
- package/dist/components/util/tooltip.d.ts.map +1 -0
- package/dist/components/util/top-navbar.d.ts +11 -0
- package/dist/components/util/top-navbar.d.ts.map +1 -0
- package/dist/components/util/touch-target.d.ts +31 -0
- package/dist/components/util/touch-target.d.ts.map +1 -0
- package/dist/components/util/zabi-strings.d.ts +133 -0
- package/dist/components/util/zabi-strings.d.ts.map +1 -0
- package/dist/create-theme/cli.js +169 -0
- package/dist/create-theme/index.d.ts +176 -0
- package/dist/create-theme/index.js +817 -0
- package/dist/create-theme/lib/ramp-math.js +128 -0
- package/dist/create-theme/lib/resolve.js +141 -0
- package/dist/create-theme/theme-data.js +1116 -0
- package/dist/index.d.ts +83 -3
- package/dist/index.js +60 -8
- package/dist/molecules/Alert.svelte +73 -66
- package/dist/molecules/Alert.svelte.d.ts +9 -1
- package/dist/molecules/AppBar.svelte +415 -0
- package/dist/molecules/AppBar.svelte.d.ts +69 -0
- package/dist/molecules/AvatarGroup.svelte +116 -0
- package/dist/molecules/AvatarGroup.svelte.d.ts +40 -0
- package/dist/molecules/BottomSheet.svelte +540 -0
- package/dist/molecules/BottomSheet.svelte.d.ts +93 -0
- package/dist/molecules/BottomTabBar.svelte +297 -0
- package/dist/molecules/BottomTabBar.svelte.d.ts +64 -0
- package/dist/molecules/Calendar.svelte +597 -0
- package/dist/molecules/Calendar.svelte.d.ts +72 -0
- package/dist/molecules/Collapsible.svelte +243 -0
- package/dist/molecules/Collapsible.svelte.d.ts +44 -0
- package/dist/molecules/CollapsibleGroup.svelte +126 -0
- package/dist/molecules/CollapsibleGroup.svelte.d.ts +14 -0
- package/dist/molecules/ComponentDemo.svelte +25 -5
- package/dist/molecules/ComponentDemo.svelte.d.ts +5 -0
- package/dist/molecules/ConfirmDialog.svelte +253 -0
- package/dist/molecules/ConfirmDialog.svelte.d.ts +55 -0
- package/dist/molecules/ContactForm.svelte +46 -19
- package/dist/molecules/ContactForm.svelte.d.ts +10 -0
- package/dist/molecules/Drawer.svelte +394 -0
- package/dist/molecules/Drawer.svelte.d.ts +55 -0
- package/dist/molecules/Dropdown.svelte +540 -50
- package/dist/molecules/Dropdown.svelte.d.ts +49 -6
- package/dist/molecules/DropdownItem.svelte +122 -0
- package/dist/molecules/DropdownItem.svelte.d.ts +28 -0
- package/dist/molecules/EmptyState.svelte +56 -10
- package/dist/molecules/EmptyState.svelte.d.ts +8 -0
- package/dist/molecules/Form.svelte +25 -14
- package/dist/molecules/Form.svelte.d.ts +13 -5
- package/dist/molecules/FormField.svelte +11 -2
- package/dist/molecules/FormField.svelte.d.ts +2 -0
- package/dist/molecules/Header.svelte +13 -3
- package/dist/molecules/Header.svelte.d.ts +2 -0
- package/dist/molecules/ImageUpload.svelte +422 -70
- package/dist/molecules/ImageUpload.svelte.d.ts +61 -5
- package/dist/molecules/MediaGrid.svelte +527 -0
- package/dist/molecules/MediaGrid.svelte.d.ts +77 -0
- package/dist/molecules/Modal.svelte +340 -45
- package/dist/molecules/Modal.svelte.d.ts +59 -7
- package/dist/molecules/NavigationMenu.svelte +15 -3
- package/dist/molecules/NavigationMenu.svelte.d.ts +4 -0
- package/dist/molecules/NavigationMenuContent.svelte +91 -36
- package/dist/molecules/NavigationMenuContent.svelte.d.ts +2 -0
- package/dist/molecules/NavigationMenuItem.svelte +10 -3
- package/dist/molecules/NavigationMenuItem.svelte.d.ts +2 -0
- package/dist/molecules/NavigationMenuLink.svelte +10 -2
- package/dist/molecules/NavigationMenuLink.svelte.d.ts +2 -0
- package/dist/molecules/NavigationMenuList.svelte +19 -4
- package/dist/molecules/NavigationMenuList.svelte.d.ts +2 -0
- package/dist/molecules/NavigationMenuTrigger.svelte +16 -3
- package/dist/molecules/NavigationMenuTrigger.svelte.d.ts +2 -0
- package/dist/molecules/Page.svelte +38 -2
- package/dist/molecules/Page.svelte.d.ts +13 -0
- package/dist/molecules/PhotoGrid.svelte +433 -0
- package/dist/molecules/PhotoGrid.svelte.d.ts +62 -0
- package/dist/molecules/PhotoViewer.svelte +1116 -0
- package/dist/molecules/PhotoViewer.svelte.d.ts +56 -0
- package/dist/molecules/PropsTable.svelte +26 -11
- package/dist/molecules/PropsTable.svelte.d.ts +5 -0
- package/dist/molecules/PullToRefresh.svelte +263 -0
- package/dist/molecules/PullToRefresh.svelte.d.ts +52 -0
- package/dist/molecules/RadioGroup.svelte +57 -15
- package/dist/molecules/RadioGroup.svelte.d.ts +16 -3
- package/dist/molecules/Section.svelte +13 -5
- package/dist/molecules/Section.svelte.d.ts +3 -1
- package/dist/molecules/SegmentedControl.svelte +323 -0
- package/dist/molecules/SegmentedControl.svelte.d.ts +34 -0
- package/dist/molecules/SidebarBrandHeader.svelte +24 -5
- package/dist/molecules/SidebarBrandHeader.svelte.d.ts +5 -0
- package/dist/molecules/SidebarFooter.svelte +39 -8
- package/dist/molecules/SidebarFooter.svelte.d.ts +5 -0
- package/dist/molecules/SidebarNavSection.svelte +12 -4
- package/dist/molecules/SidebarNavSection.svelte.d.ts +2 -0
- package/dist/molecules/SlideUp.svelte +253 -30
- package/dist/molecules/SlideUp.svelte.d.ts +31 -4
- package/dist/molecules/SortableList.svelte +632 -0
- package/dist/molecules/SortableList.svelte.d.ts +69 -0
- package/dist/molecules/Stepper.svelte +548 -0
- package/dist/molecules/Stepper.svelte.d.ts +39 -0
- package/dist/molecules/StickyActionBar.svelte +191 -0
- package/dist/molecules/StickyActionBar.svelte.d.ts +65 -0
- package/dist/molecules/SwipeableListItem.svelte +334 -0
- package/dist/molecules/SwipeableListItem.svelte.d.ts +54 -0
- package/dist/molecules/Tabs.svelte +254 -24
- package/dist/molecules/Tabs.svelte.d.ts +15 -4
- package/dist/molecules/Toaster.svelte +352 -6
- package/dist/molecules/Toaster.svelte.d.ts +95 -2
- package/dist/molecules/ToasterToast.svelte +279 -62
- package/dist/molecules/ToasterToast.svelte.d.ts +11 -0
- package/dist/molecules/UnsavedChangesBar.svelte +212 -0
- package/dist/molecules/UnsavedChangesBar.svelte.d.ts +43 -0
- package/dist/molecules/index.d.ts +46 -0
- package/dist/molecules/index.js +27 -0
- package/dist/molecules/toast-store.d.ts +53 -7
- package/dist/molecules/toast-store.js +21 -0
- package/dist/organisms/AppShell.svelte +196 -0
- package/dist/organisms/AppShell.svelte.d.ts +61 -0
- package/dist/organisms/SidebarAccountPanel.svelte +111 -12
- package/dist/organisms/SidebarAccountPanel.svelte.d.ts +21 -0
- package/dist/organisms/SidebarNavigation.svelte +193 -69
- package/dist/organisms/SidebarNavigation.svelte.d.ts +31 -1
- package/dist/organisms/SidebarPanel.svelte +45 -16
- package/dist/organisms/SidebarPanel.svelte.d.ts +2 -0
- package/dist/organisms/SidebarShell.svelte +263 -0
- package/dist/organisms/SidebarShell.svelte.d.ts +106 -0
- package/dist/organisms/TopNavbar.svelte +329 -33
- package/dist/organisms/TopNavbar.svelte.d.ts +28 -0
- package/dist/organisms/index.d.ts +6 -0
- package/dist/organisms/index.js +4 -0
- package/dist/routes/lib/variant-utils.d.ts +26 -0
- package/dist/routes/lib/{variant-utils.ts → variant-utils.js} +15 -46
- package/dist/types/components.d.ts +4 -0
- package/dist/types/components.d.ts.map +1 -1
- package/dist/types/events.js +1 -0
- package/dist/types/index.d.ts +605 -25
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +3 -0
- package/dist/types/variants.ts +17 -1
- package/dist/util/app-shell.d.ts +27 -0
- package/dist/util/app-shell.js +72 -0
- package/dist/util/avatar.d.ts +35 -0
- package/dist/util/avatar.js +52 -0
- package/dist/util/bottom-sheet.d.ts +29 -0
- package/dist/util/bottom-sheet.js +43 -0
- package/dist/util/bottom-tab-bar.d.ts +34 -0
- package/dist/util/bottom-tab-bar.js +54 -0
- package/dist/util/calendar.d.ts +55 -0
- package/dist/util/calendar.js +74 -0
- package/dist/util/cn.d.ts +7 -0
- package/dist/util/cn.js +48 -0
- package/dist/util/collapsible.d.ts +57 -0
- package/dist/util/collapsible.js +23 -0
- package/dist/util/confirm-dialog.d.ts +11 -0
- package/dist/util/confirm-dialog.js +2 -0
- package/dist/util/date.d.ts +95 -0
- package/dist/util/date.js +237 -0
- package/dist/util/drawer.d.ts +12 -0
- package/dist/util/drawer.js +7 -0
- package/dist/util/dropdown.d.ts +46 -0
- package/dist/util/dropdown.js +21 -0
- package/dist/util/field.d.ts +38 -0
- package/dist/util/field.js +38 -0
- package/dist/util/fit-in-viewport.d.ts +200 -0
- package/dist/util/fit-in-viewport.js +399 -0
- package/dist/util/focus-utils.d.ts +75 -2
- package/dist/util/focus-utils.js +182 -9
- package/dist/util/hydration.d.ts +44 -0
- package/dist/util/hydration.js +58 -0
- package/dist/util/keyboard-inset.d.ts +17 -0
- package/dist/util/keyboard-inset.js +53 -0
- package/dist/util/media-grid.d.ts +50 -0
- package/dist/util/media-grid.js +81 -0
- package/dist/util/media.d.ts +5 -0
- package/dist/util/media.js +10 -0
- package/dist/util/overlay-chrome.d.ts +52 -0
- package/dist/util/overlay-chrome.js +56 -0
- package/dist/util/overlay.d.ts +71 -0
- package/dist/util/overlay.js +240 -0
- package/dist/util/photo.d.ts +214 -0
- package/dist/util/photo.js +206 -0
- package/dist/util/portal.d.ts +22 -0
- package/dist/util/portal.js +50 -0
- package/dist/util/pull-to-refresh.d.ts +26 -0
- package/dist/util/pull-to-refresh.js +30 -0
- package/dist/util/radio-keys.d.ts +24 -0
- package/dist/util/radio-keys.js +49 -0
- package/dist/util/rating.d.ts +22 -0
- package/dist/util/rating.js +26 -0
- package/dist/util/ready-made-strings.d.ts +76 -0
- package/dist/util/ready-made-strings.js +67 -0
- package/dist/util/scroll-padding.d.ts +19 -0
- package/dist/util/scroll-padding.js +44 -0
- package/dist/util/segmented-control.d.ts +15 -0
- package/dist/util/segmented-control.js +1 -0
- package/dist/util/select.d.ts +40 -0
- package/dist/util/select.js +63 -0
- package/dist/util/sheet-drag.d.ts +59 -0
- package/dist/util/sheet-drag.js +241 -0
- package/dist/util/sidebar.d.ts +62 -0
- package/dist/util/sidebar.js +38 -0
- package/dist/util/sortable-list.d.ts +64 -0
- package/dist/util/sortable-list.js +53 -0
- package/dist/util/ssr-safe.d.ts +4 -4
- package/dist/util/stepper.d.ts +39 -0
- package/dist/util/stepper.js +38 -0
- package/dist/util/swipeable-list-item.d.ts +35 -0
- package/dist/util/swipeable-list-item.js +32 -0
- package/dist/util/theme-mode.d.ts +79 -0
- package/dist/util/theme-mode.js +121 -0
- package/dist/util/toaster.d.ts +92 -0
- package/dist/util/toaster.js +75 -0
- package/dist/util/tooltip.d.ts +9 -0
- package/dist/util/tooltip.js +18 -0
- package/dist/util/top-navbar.d.ts +10 -0
- package/dist/util/top-navbar.js +5 -0
- package/dist/util/touch-target.d.ts +30 -0
- package/dist/util/touch-target.js +30 -0
- package/dist/util/zabi-strings.d.ts +132 -0
- package/dist/util/zabi-strings.js +105 -0
- package/dist/zabi-components-colors.css +5 -2
- package/dist/zabi-components-theme-dark-only.css +574 -225
- package/dist/zabi-components-theme-dark.css +574 -225
- package/dist/zabi-components-theme-only.css +1680 -317
- package/dist/zabi-components-theme.css +1680 -317
- package/dist/zabi-components.css +4473 -1158
- package/docs/lucide-icons.md +41 -16
- package/docs/theme-imports.md +81 -11
- package/package.json +51 -29
- package/dist/lib/layout-width-tokens.d.ts +0 -17
- package/dist/lib/layout-width-tokens.d.ts.map +0 -1
- package/dist/lib/showcase/component-docs/Button.d.ts +0 -3
- package/dist/lib/showcase/component-docs/Button.d.ts.map +0 -1
- package/dist/lib/showcase/component-docs/Input.d.ts +0 -3
- package/dist/lib/showcase/component-docs/Input.d.ts.map +0 -1
- package/dist/lib/showcase/component-docs/List.d.ts +0 -3
- package/dist/lib/showcase/component-docs/List.d.ts.map +0 -1
- package/dist/lib/showcase/component-docs/Modal.d.ts +0 -3
- package/dist/lib/showcase/component-docs/Modal.d.ts.map +0 -1
- package/dist/lib/showcase/component-docs/Radio.d.ts +0 -3
- package/dist/lib/showcase/component-docs/Radio.d.ts.map +0 -1
- package/dist/lib/showcase/component-docs/SidebarNavigation.d.ts +0 -3
- package/dist/lib/showcase/component-docs/SidebarNavigation.d.ts.map +0 -1
- package/dist/lib/showcase/component-docs/Skeleton.d.ts +0 -3
- package/dist/lib/showcase/component-docs/Skeleton.d.ts.map +0 -1
- package/dist/lib/showcase/component-docs/_shared.d.ts +0 -12
- package/dist/lib/showcase/component-docs/_shared.d.ts.map +0 -1
- package/dist/lib/showcase/component-docs/index.d.ts +0 -4
- package/dist/lib/showcase/component-docs/index.d.ts.map +0 -1
- package/dist/lib/showcase/components-catalog.d.ts +0 -3
- package/dist/lib/showcase/components-catalog.d.ts.map +0 -1
- package/dist/lib/showcase/components-showcase-constants.d.ts +0 -89
- package/dist/lib/showcase/components-showcase-constants.d.ts.map +0 -1
- package/dist/lib/showcase/docs-sidebar-helpers.d.ts +0 -15
- package/dist/lib/showcase/docs-sidebar-helpers.d.ts.map +0 -1
- package/dist/routes/lib/focus-utils.d.ts +0 -12
- package/dist/routes/lib/focus-utils.ts +0 -110
- package/dist/routes/lib/ssr-safe.ts +0 -58
- package/scripts/fix-lucide-svelte-icon-dts.js +0 -35
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import type { Snippet } from "svelte";
|
|
3
|
+
import { cn } from "../util/cn.js";
|
|
3
4
|
|
|
4
5
|
interface Props {
|
|
5
6
|
title?: string;
|
|
@@ -8,6 +9,8 @@
|
|
|
8
9
|
/** `aria-label` on the `<ul>` (required when title is hidden in collapsed mode). */
|
|
9
10
|
listAriaLabel: string;
|
|
10
11
|
collapsed?: boolean;
|
|
12
|
+
class?: string;
|
|
13
|
+
/** @deprecated use `class`. */
|
|
11
14
|
className?: string;
|
|
12
15
|
children: Snippet;
|
|
13
16
|
}
|
|
@@ -17,10 +20,15 @@
|
|
|
17
20
|
sectionKey = "",
|
|
18
21
|
listAriaLabel,
|
|
19
22
|
collapsed = false,
|
|
20
|
-
|
|
23
|
+
class: classAttr = "",
|
|
24
|
+
className: legacyClass = "",
|
|
21
25
|
children,
|
|
22
26
|
}: Props = $props();
|
|
23
27
|
|
|
28
|
+
/** `class` is the public prop; `className` is a deprecated alias.
|
|
29
|
+
* Both are merged here so existing call sites keep working. */
|
|
30
|
+
const className = $derived(cn(`${classAttr} ${legacyClass}`));
|
|
31
|
+
|
|
24
32
|
const trimmedTitle = $derived(title.trim());
|
|
25
33
|
const headingId = $derived(
|
|
26
34
|
trimmedTitle
|
|
@@ -30,17 +38,17 @@
|
|
|
30
38
|
const showHeading = $derived(Boolean(trimmedTitle) && !collapsed);
|
|
31
39
|
</script>
|
|
32
40
|
|
|
33
|
-
<div class={`flex w-full flex-col gap-
|
|
41
|
+
<div class={cn(`flex w-full flex-col gap-2 ${className}`)}>
|
|
34
42
|
{#if showHeading && headingId}
|
|
35
43
|
<h2
|
|
36
|
-
class="px-0 text-
|
|
44
|
+
class="px-0 text-xs font-semibold uppercase tracking-wider text-description"
|
|
37
45
|
id={headingId}
|
|
38
46
|
>
|
|
39
47
|
{trimmedTitle}
|
|
40
48
|
</h2>
|
|
41
49
|
{/if}
|
|
42
50
|
<ul
|
|
43
|
-
class="flex w-full flex-col gap-
|
|
51
|
+
class="flex w-full flex-col gap-1 px-0"
|
|
44
52
|
aria-labelledby={showHeading && headingId ? headingId : undefined}
|
|
45
53
|
aria-label={showHeading ? undefined : listAriaLabel}
|
|
46
54
|
>
|
|
@@ -1,40 +1,128 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
+
import { zabiCommonStrings } from "../util/zabi-strings.js";
|
|
3
|
+
import type { Snippet } from 'svelte';
|
|
2
4
|
import {
|
|
3
5
|
focusFirstElement,
|
|
6
|
+
joinOverlayStack,
|
|
7
|
+
recoverStrayFocus,
|
|
4
8
|
returnFocus,
|
|
5
9
|
saveFocus,
|
|
6
|
-
trapFocus,
|
|
7
10
|
} from '../util/focus-utils.js';
|
|
11
|
+
import {
|
|
12
|
+
followKeyboard,
|
|
13
|
+
lockBodyScroll,
|
|
14
|
+
registerOverlayFooter,
|
|
15
|
+
registerOverlayHeader,
|
|
16
|
+
trapTabKey,
|
|
17
|
+
} from '../util/overlay.js';
|
|
18
|
+
import { TOUCH_HIT_AREA } from '../util/touch-target.js';
|
|
8
19
|
import { generateId } from "../util/ssr-safe.js";
|
|
20
|
+
import { cn } from "../util/cn.js";
|
|
21
|
+
import {
|
|
22
|
+
OVERLAY_CHROME,
|
|
23
|
+
OVERLAY_CLOSE_GLYPH,
|
|
24
|
+
OVERLAY_TITLE_2XL,
|
|
25
|
+
OVERLAY_TITLE_HYPHENS,
|
|
26
|
+
OVERLAY_TITLE_WRAP,
|
|
27
|
+
textIsEnlarged,
|
|
28
|
+
} from "../util/overlay-chrome.js";
|
|
29
|
+
import { attachSheetDrag, FLICK_VELOCITY } from "../util/sheet-drag.js";
|
|
9
30
|
|
|
10
31
|
interface Props {
|
|
32
|
+
/** Extra classes for the host element. */
|
|
33
|
+
class?: string;
|
|
11
34
|
isOpen?: boolean;
|
|
12
35
|
title?: string;
|
|
36
|
+
/** Accessible name of the close button. */
|
|
37
|
+
closeLabel?: string;
|
|
38
|
+
/**
|
|
39
|
+
* CSS selector, looked up inside the sheet, of the control that takes
|
|
40
|
+
* focus when it opens. Without it, or with no match, the first control does.
|
|
41
|
+
*/
|
|
42
|
+
initialFocus?: string;
|
|
43
|
+
/**
|
|
44
|
+
* Adds a grip at the top and lets a swipe down close the sheet. The
|
|
45
|
+
* grip drags from anywhere; a swipe on the content closes only when
|
|
46
|
+
* the content is at its top, and scrolls it otherwise. The close
|
|
47
|
+
* button, the backdrop and Escape stay, so nothing depends on the
|
|
48
|
+
* gesture.
|
|
49
|
+
*/
|
|
50
|
+
swipeToClose?: boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Runs when the sheet closes itself, with the event that closed it:
|
|
53
|
+
* the click, the Escape keydown, or the end of a swipe.
|
|
54
|
+
*/
|
|
13
55
|
onclick?: (event: Event) => void;
|
|
14
56
|
onkeydown?: (event: Event) => void;
|
|
57
|
+
children?: Snippet;
|
|
58
|
+
/**
|
|
59
|
+
* Pinned to the bottom of the sheet, below the content, which then
|
|
60
|
+
* scrolls on its own: for the buttons of a form. It stays above the
|
|
61
|
+
* on-screen keyboard, and toasts keep off it. Without it the sheet is
|
|
62
|
+
* as it always was: one box that scrolls as a whole.
|
|
63
|
+
*/
|
|
64
|
+
footer?: Snippet;
|
|
15
65
|
}
|
|
16
66
|
|
|
17
67
|
let {
|
|
18
|
-
|
|
68
|
+
class: className = "",
|
|
69
|
+
isOpen = $bindable<Exclude<Props["isOpen"], undefined>>(),
|
|
19
70
|
title = '',
|
|
71
|
+
closeLabel: closeLabelGiven,
|
|
72
|
+
initialFocus,
|
|
73
|
+
swipeToClose = false,
|
|
20
74
|
onclick,
|
|
21
75
|
onkeydown,
|
|
22
76
|
children,
|
|
77
|
+
footer,
|
|
23
78
|
...restProps
|
|
24
|
-
} = $props
|
|
79
|
+
}: Props = $props();
|
|
80
|
+
|
|
81
|
+
/** Words many components share: a `ZabiStringsProvider` above this one may give them; else English. */
|
|
82
|
+
const common = zabiCommonStrings();
|
|
83
|
+
const closeLabel = $derived(closeLabelGiven ?? common().close);
|
|
84
|
+
|
|
85
|
+
// No fallback on a bindable prop: Svelte refuses `bind:…={undefined}` on
|
|
86
|
+
// one that has a fallback (`props_invalid_value`), and a page that throws
|
|
87
|
+
// while it hydrates never becomes interactive. The default is applied
|
|
88
|
+
// here instead: at once, for the server and the first render, and again
|
|
89
|
+
// whenever a parent hands back `undefined`.
|
|
90
|
+
const applyDefaults = () => {
|
|
91
|
+
if (isOpen === undefined) isOpen = false;
|
|
92
|
+
};
|
|
93
|
+
applyDefaults();
|
|
94
|
+
$effect.pre(applyDefaults);
|
|
25
95
|
|
|
26
96
|
const slideTitleId = generateId('slideup-title');
|
|
27
97
|
|
|
28
98
|
let slideUpContainer = $state<HTMLDivElement>();
|
|
29
|
-
let
|
|
99
|
+
let grip = $state<HTMLDivElement>();
|
|
100
|
+
let headerElement = $state<HTMLDivElement>();
|
|
101
|
+
let footerElement = $state<HTMLDivElement>();
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Read as the overlay opens: with the text enlarged, a long word in the
|
|
105
|
+
* title is hyphenated before it is cut (util/overlay-chrome.ts).
|
|
106
|
+
*/
|
|
107
|
+
let enlargedText = $state(false);
|
|
108
|
+
$effect(() => {
|
|
109
|
+
if (isOpen) enlargedText = textIsEnlarged();
|
|
110
|
+
});
|
|
111
|
+
/** With a footer: the content, which is then what scrolls. */
|
|
112
|
+
let scroller = $state<HTMLDivElement>();
|
|
113
|
+
/** How far a swipe has pulled the sheet down, in px. */
|
|
114
|
+
let dragOffset = $state(0);
|
|
115
|
+
let dragging = $state(false);
|
|
116
|
+
let focusActive = false;
|
|
117
|
+
/** Position among the open overlays; lifts a sheet opened later above the earlier ones. */
|
|
118
|
+
let depth = $state(0);
|
|
30
119
|
|
|
31
120
|
function closeSlideUp(event?: Event) {
|
|
32
121
|
isOpen = false;
|
|
33
|
-
if (
|
|
34
|
-
|
|
35
|
-
|
|
122
|
+
if (focusActive) {
|
|
123
|
+
focusActive = false;
|
|
124
|
+
returnFocus();
|
|
36
125
|
}
|
|
37
|
-
returnFocus();
|
|
38
126
|
if (onclick && event) {
|
|
39
127
|
onclick(event);
|
|
40
128
|
}
|
|
@@ -44,17 +132,87 @@
|
|
|
44
132
|
const container = slideUpContainer;
|
|
45
133
|
if (isOpen && container) {
|
|
46
134
|
saveFocus();
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
135
|
+
focusActive = true;
|
|
136
|
+
const unlockScroll = lockBodyScroll();
|
|
137
|
+
const overlay = joinOverlayStack(container);
|
|
138
|
+
depth = overlay.depth;
|
|
139
|
+
const t = setTimeout(() => {
|
|
140
|
+
// Something inside has taken focus already (a field that
|
|
141
|
+
// focuses itself as it mounts): leave it there. `initialFocus`
|
|
142
|
+
// is the consumer saying where focus goes, so it still decides.
|
|
143
|
+
const active = document.activeElement;
|
|
144
|
+
const inside = !!active && active !== container && container.contains(active);
|
|
145
|
+
if (inside && !(initialFocus && container.querySelector(initialFocus))) return;
|
|
146
|
+
focusFirstElement(container, initialFocus);
|
|
50
147
|
}, 0);
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
148
|
+
// If the focused control is disabled or removed, focus lands on
|
|
149
|
+
// `<body>`; take Tab and Escape back from there.
|
|
150
|
+
const stopRecovery = recoverStrayFocus(container, {
|
|
151
|
+
onEscape: (event) => closeSlideUp(event),
|
|
152
|
+
});
|
|
153
|
+
// Where the on-screen keyboard covers the page, the overlay
|
|
154
|
+
// keeps to what is left above it.
|
|
155
|
+
const stopKeyboard = container.parentElement
|
|
156
|
+
? followKeyboard(container.parentElement)
|
|
157
|
+
: undefined;
|
|
158
|
+
return () => {
|
|
159
|
+
clearTimeout(t);
|
|
160
|
+
stopRecovery();
|
|
161
|
+
stopKeyboard?.();
|
|
162
|
+
overlay.leave();
|
|
163
|
+
unlockScroll();
|
|
164
|
+
if (focusActive) {
|
|
165
|
+
focusActive = false;
|
|
166
|
+
returnFocus();
|
|
167
|
+
}
|
|
168
|
+
};
|
|
55
169
|
}
|
|
56
170
|
});
|
|
57
171
|
|
|
172
|
+
// For the toast stack: it starts below the header, which holds the close
|
|
173
|
+
// button, and stays off a pinned footer.
|
|
174
|
+
$effect(() => {
|
|
175
|
+
const top = headerElement;
|
|
176
|
+
if (!isOpen || !top) return;
|
|
177
|
+
return registerOverlayHeader(top);
|
|
178
|
+
});
|
|
179
|
+
$effect(() => {
|
|
180
|
+
const pinned = footerElement;
|
|
181
|
+
if (!isOpen || !pinned) return;
|
|
182
|
+
return registerOverlayFooter(pinned);
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
$effect(() => {
|
|
186
|
+
const container = slideUpContainer;
|
|
187
|
+
const zone = grip;
|
|
188
|
+
// With a footer the content scrolls, not the panel.
|
|
189
|
+
const scrolls = footer ? scroller : container;
|
|
190
|
+
if (!isOpen || !swipeToClose || !container || !zone || !scrolls) return;
|
|
191
|
+
const settle = () => {
|
|
192
|
+
dragging = false;
|
|
193
|
+
dragOffset = 0;
|
|
194
|
+
};
|
|
195
|
+
const stop = attachSheetDrag(
|
|
196
|
+
// Without a footer the panel is its own scrolling box.
|
|
197
|
+
{ handleZone: zone, scroller: scrolls },
|
|
198
|
+
{
|
|
199
|
+
onStart: () => (dragging = true),
|
|
200
|
+
// Down only: there is nowhere for it to go upwards.
|
|
201
|
+
onMove: (distance) => (dragOffset = Math.max(0, distance)),
|
|
202
|
+
onEnd(distance, velocity, event) {
|
|
203
|
+
const far = distance > container.getBoundingClientRect().height * 0.3;
|
|
204
|
+
settle();
|
|
205
|
+
if (distance > 0 && (far || velocity >= FLICK_VELOCITY)) closeSlideUp(event);
|
|
206
|
+
},
|
|
207
|
+
onCancel: settle,
|
|
208
|
+
},
|
|
209
|
+
);
|
|
210
|
+
return () => {
|
|
211
|
+
stop();
|
|
212
|
+
settle();
|
|
213
|
+
};
|
|
214
|
+
});
|
|
215
|
+
|
|
58
216
|
function handleBackdropClick(event: Event) {
|
|
59
217
|
if (event.target === event.currentTarget) {
|
|
60
218
|
closeSlideUp(event);
|
|
@@ -63,7 +221,8 @@
|
|
|
63
221
|
|
|
64
222
|
function handleKeydown(event: Event) {
|
|
65
223
|
const keyboardEvent = event as KeyboardEvent;
|
|
66
|
-
if (keyboardEvent.key === 'Escape') {
|
|
224
|
+
if (keyboardEvent.key === 'Escape' && !keyboardEvent.defaultPrevented) {
|
|
225
|
+
keyboardEvent.preventDefault();
|
|
67
226
|
closeSlideUp(event);
|
|
68
227
|
}
|
|
69
228
|
onkeydown?.(event);
|
|
@@ -71,42 +230,106 @@
|
|
|
71
230
|
</script>
|
|
72
231
|
|
|
73
232
|
{#if isOpen}
|
|
233
|
+
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
74
234
|
<div
|
|
75
|
-
class="fixed inset-0 z-modal cursor-pointer bg-overlay"
|
|
235
|
+
class="group/overlay fixed inset-0 z-modal cursor-pointer bg-overlay"
|
|
236
|
+
style:z-index={depth > 0 ? `calc(var(--z-modal) + ${depth})` : undefined}
|
|
237
|
+
data-overlay-depth={depth}
|
|
76
238
|
onclick={handleBackdropClick}
|
|
77
239
|
onkeydown={handleKeydown}
|
|
78
|
-
role="
|
|
79
|
-
aria-modal="true"
|
|
80
|
-
aria-labelledby={title ? slideTitleId : undefined}
|
|
81
|
-
tabindex="-1"
|
|
82
|
-
{...restProps}
|
|
240
|
+
role="presentation"
|
|
83
241
|
>
|
|
84
242
|
<div
|
|
85
243
|
bind:this={slideUpContainer}
|
|
86
|
-
class=
|
|
244
|
+
class={cn(
|
|
245
|
+
"group-data-keyboard-open/overlay:max-h-full",
|
|
246
|
+
"absolute bottom-0 left-0 right-0 z-modal flex max-h-[90dvh] cursor-default flex-col overflow-y-auto rounded-t-overlay border-t border-border-overlay bg-surface-overlay shadow-lg animate-[slideUp_0.3s_ease-out] motion-reduce:animate-none",
|
|
247
|
+
// With a footer the content scrolls between the header and it.
|
|
248
|
+
footer && "overflow-y-hidden",
|
|
249
|
+
// Back to rest after a swipe that did not close it.
|
|
250
|
+
swipeToClose &&
|
|
251
|
+
"overscroll-contain transition-transform duration-200 ease-out motion-reduce:transition-none",
|
|
252
|
+
className,
|
|
253
|
+
)}
|
|
254
|
+
style:transform={dragOffset > 0 ? `translateY(${dragOffset}px)` : undefined}
|
|
255
|
+
style:transition={dragging ? "none" : undefined}
|
|
256
|
+
data-dragging={dragging ? "true" : undefined}
|
|
257
|
+
role="dialog"
|
|
258
|
+
aria-modal="true"
|
|
259
|
+
aria-labelledby={title ? slideTitleId : undefined}
|
|
260
|
+
tabindex="-1"
|
|
261
|
+
onkeydown={(event) => trapTabKey(slideUpContainer, event)}
|
|
262
|
+
{...restProps}
|
|
87
263
|
>
|
|
264
|
+
{#if swipeToClose}
|
|
265
|
+
<!-- Decorative: it adds a gesture, and the close button is the
|
|
266
|
+
control. It stays at the top while the content scrolls.
|
|
267
|
+
`touch-none`: otherwise the browser takes a touch here for
|
|
268
|
+
itself. The bar is drawn in the text colour where colours are
|
|
269
|
+
forced, since a background is dropped there. -->
|
|
270
|
+
<div
|
|
271
|
+
bind:this={grip}
|
|
272
|
+
data-sheet-grip
|
|
273
|
+
aria-hidden="true"
|
|
274
|
+
class="sticky top-0 z-10 flex h-[28px] shrink-0 cursor-grab touch-none items-start justify-center bg-surface-overlay pt-[10px] active:cursor-grabbing {OVERLAY_CHROME}"
|
|
275
|
+
>
|
|
276
|
+
<span
|
|
277
|
+
class="block h-1 w-9 rounded-pill bg-current text-description forced-colors:bg-[CanvasText]"
|
|
278
|
+
></span>
|
|
279
|
+
</div>
|
|
280
|
+
{/if}
|
|
88
281
|
{#if title}
|
|
89
|
-
|
|
282
|
+
<!-- Chrome: laid out in px, with a title that stops at 1.3
|
|
283
|
+
times its size (util/overlay-chrome.ts). 12px between a long
|
|
284
|
+
title and the button: the title wraps, the button keeps its size. -->
|
|
285
|
+
<div
|
|
286
|
+
bind:this={headerElement}
|
|
287
|
+
class="flex shrink-0 items-center justify-between gap-[12px] px-6 pb-4 {OVERLAY_CHROME} {swipeToClose
|
|
288
|
+
? 'pt-2'
|
|
289
|
+
: 'pt-6'}"
|
|
290
|
+
>
|
|
90
291
|
<h2
|
|
91
292
|
id={slideTitleId}
|
|
92
|
-
class="
|
|
293
|
+
class="min-w-0 {OVERLAY_TITLE_2XL} font-normal tracking-normal text-headline {OVERLAY_TITLE_WRAP} {enlargedText ? OVERLAY_TITLE_HYPHENS : ''}"
|
|
93
294
|
>
|
|
94
295
|
{title}
|
|
95
296
|
</h2>
|
|
96
297
|
<button
|
|
97
298
|
type="button"
|
|
98
299
|
onclick={closeSlideUp}
|
|
99
|
-
class="flex h-8 w-8 cursor-pointer items-center justify-center rounded-full
|
|
100
|
-
aria-label=
|
|
300
|
+
class="focus-ring pointer-coarse:relative flex h-8 w-8 shrink-0 cursor-pointer items-center justify-center rounded-full {OVERLAY_CLOSE_GLYPH} text-description transition-colors hover:bg-surface-overlay-hover hover:text-headline active:bg-surface-active {TOUCH_HIT_AREA}"
|
|
301
|
+
aria-label={closeLabel}
|
|
101
302
|
>
|
|
102
303
|
×
|
|
103
304
|
</button>
|
|
104
305
|
</div>
|
|
105
306
|
{/if}
|
|
106
307
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
308
|
+
{#if footer}
|
|
309
|
+
<!-- `pt-1`: a scroll container clips, and the focus ring of a
|
|
310
|
+
first control needs the room. -->
|
|
311
|
+
<div
|
|
312
|
+
bind:this={scroller}
|
|
313
|
+
data-slide-up-content
|
|
314
|
+
class="min-h-0 flex-1 overflow-y-auto overscroll-contain px-[24px] pt-[4px] pb-[16px]"
|
|
315
|
+
>
|
|
316
|
+
{@render children?.()}
|
|
317
|
+
</div>
|
|
318
|
+
<!-- Clear of the home indicator on a phone; over the keyboard
|
|
319
|
+
that is under the keyboard, and 16px is enough. -->
|
|
320
|
+
<div
|
|
321
|
+
bind:this={footerElement}
|
|
322
|
+
data-slide-up-footer
|
|
323
|
+
class="flex shrink-0 flex-wrap justify-end gap-[8px] border-t border-border-overlay px-[24px] pt-[16px] pb-[calc(16px+env(safe-area-inset-bottom,0px))] group-data-keyboard-open/overlay:pb-[16px]"
|
|
324
|
+
>
|
|
325
|
+
{@render footer()}
|
|
326
|
+
</div>
|
|
327
|
+
{:else}
|
|
328
|
+
<!-- Clear of the home indicator on a phone. -->
|
|
329
|
+
<div class="flex-1 px-[24px] pb-[calc(1.5rem+env(safe-area-inset-bottom,0px))]">
|
|
330
|
+
{@render children?.()}
|
|
331
|
+
</div>
|
|
332
|
+
{/if}
|
|
110
333
|
</div>
|
|
111
334
|
</div>
|
|
112
335
|
{/if}
|
|
@@ -1,12 +1,39 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
1
2
|
interface Props {
|
|
3
|
+
/** Extra classes for the host element. */
|
|
4
|
+
class?: string;
|
|
2
5
|
isOpen?: boolean;
|
|
3
6
|
title?: string;
|
|
7
|
+
/** Accessible name of the close button. */
|
|
8
|
+
closeLabel?: string;
|
|
9
|
+
/**
|
|
10
|
+
* CSS selector, looked up inside the sheet, of the control that takes
|
|
11
|
+
* focus when it opens. Without it, or with no match, the first control does.
|
|
12
|
+
*/
|
|
13
|
+
initialFocus?: string;
|
|
14
|
+
/**
|
|
15
|
+
* Adds a grip at the top and lets a swipe down close the sheet. The
|
|
16
|
+
* grip drags from anywhere; a swipe on the content closes only when
|
|
17
|
+
* the content is at its top, and scrolls it otherwise. The close
|
|
18
|
+
* button, the backdrop and Escape stay, so nothing depends on the
|
|
19
|
+
* gesture.
|
|
20
|
+
*/
|
|
21
|
+
swipeToClose?: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Runs when the sheet closes itself, with the event that closed it:
|
|
24
|
+
* the click, the Escape keydown, or the end of a swipe.
|
|
25
|
+
*/
|
|
4
26
|
onclick?: (event: Event) => void;
|
|
5
27
|
onkeydown?: (event: Event) => void;
|
|
28
|
+
children?: Snippet;
|
|
29
|
+
/**
|
|
30
|
+
* Pinned to the bottom of the sheet, below the content, which then
|
|
31
|
+
* scrolls on its own: for the buttons of a form. It stays above the
|
|
32
|
+
* on-screen keyboard, and toasts keep off it. Without it the sheet is
|
|
33
|
+
* as it always was: one box that scrolls as a whole.
|
|
34
|
+
*/
|
|
35
|
+
footer?: Snippet;
|
|
6
36
|
}
|
|
7
|
-
|
|
8
|
-
children?: any;
|
|
9
|
-
};
|
|
10
|
-
declare const SlideUp: import("svelte").Component<$$ComponentProps, {}, "isOpen">;
|
|
37
|
+
declare const SlideUp: import("svelte").Component<Props, {}, "isOpen">;
|
|
11
38
|
type SlideUp = ReturnType<typeof SlideUp>;
|
|
12
39
|
export default SlideUp;
|