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
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { type Snippet } from "svelte";
|
|
2
|
+
import type { HTMLAttributes } from "svelte/elements";
|
|
3
|
+
import { type SortableListReorderDetail, type SortableListRow, type SortableListStrings } from "../util/sortable-list.js";
|
|
4
|
+
declare function $$render<T>(): {
|
|
5
|
+
props: Omit<HTMLAttributes<HTMLDivElement>, "class" | "aria-label" | "aria-labelledby"> & {
|
|
6
|
+
/** Extra classes for the host element. */
|
|
7
|
+
class?: string;
|
|
8
|
+
/** Extra classes for the `<ul>`, for example a different gap. */
|
|
9
|
+
listClass?: string;
|
|
10
|
+
/** The items, in order; supports `bind:items`. */
|
|
11
|
+
items: T[];
|
|
12
|
+
/** Stable identity of an item. Rows are keyed by it. */
|
|
13
|
+
getKey: (item: T) => string | number;
|
|
14
|
+
/** Name of an item, used in the button names and the announcements. */
|
|
15
|
+
getLabel: (item: T) => string;
|
|
16
|
+
/** Content of one row. The second argument carries the row state and its controls. */
|
|
17
|
+
item: Snippet<[T, SortableListRow]>;
|
|
18
|
+
/** Called once per move (each arrow-key step is a move), after `items` has the new order. */
|
|
19
|
+
onreorder?: (detail: SortableListReorderDetail<T>) => void;
|
|
20
|
+
/**
|
|
21
|
+
* `auto` lays out handle, content and move buttons in a row. `manual`
|
|
22
|
+
* renders only your snippet, which places `row.handle` (and
|
|
23
|
+
* `row.moveButtons` if wanted) itself, for example in a card header.
|
|
24
|
+
* Put them beside a header toggle, never inside another `<button>`
|
|
25
|
+
* or link: a button inside a button is invalid and unreachable. A
|
|
26
|
+
* click on either does not bubble, so a clickable (non-button) header
|
|
27
|
+
* around them is not toggled by it.
|
|
28
|
+
*/
|
|
29
|
+
controls?: "auto" | "manual";
|
|
30
|
+
/**
|
|
31
|
+
* Show the move up / move down buttons when `controls="auto"`. A screen
|
|
32
|
+
* reader in browse mode does not pass arrow keys to the handle, so
|
|
33
|
+
* hiding them removes that way of reordering.
|
|
34
|
+
*/
|
|
35
|
+
showMoveButtons?: boolean;
|
|
36
|
+
/** Disables every handle and move button. */
|
|
37
|
+
disabled?: boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Disables one item's own controls. Other items can still move past it,
|
|
40
|
+
* so its index can change; it is not pinned in place.
|
|
41
|
+
*/
|
|
42
|
+
isItemDisabled?: (item: T) => boolean;
|
|
43
|
+
/** Overrides for the built-in strings. */
|
|
44
|
+
strings?: Partial<SortableListStrings>;
|
|
45
|
+
"aria-label"?: string;
|
|
46
|
+
"aria-labelledby"?: string;
|
|
47
|
+
};
|
|
48
|
+
exports: {};
|
|
49
|
+
bindings: "items";
|
|
50
|
+
slots: {};
|
|
51
|
+
events: {};
|
|
52
|
+
};
|
|
53
|
+
declare class __sveltets_Render<T> {
|
|
54
|
+
props(): ReturnType<typeof $$render<T>>['props'];
|
|
55
|
+
events(): ReturnType<typeof $$render<T>>['events'];
|
|
56
|
+
slots(): ReturnType<typeof $$render<T>>['slots'];
|
|
57
|
+
bindings(): "items";
|
|
58
|
+
exports(): {};
|
|
59
|
+
}
|
|
60
|
+
interface $$IsomorphicComponent {
|
|
61
|
+
new <T>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
|
|
62
|
+
$$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
|
|
63
|
+
} & ReturnType<__sveltets_Render<T>['exports']>;
|
|
64
|
+
<T>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
|
|
65
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
66
|
+
}
|
|
67
|
+
declare const SortableList: $$IsomorphicComponent;
|
|
68
|
+
type SortableList<T> = InstanceType<typeof SortableList<T>>;
|
|
69
|
+
export default SortableList;
|
|
@@ -0,0 +1,548 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { mergeStrings } from "../util/ready-made-strings.js";
|
|
3
|
+
import { zabiStringsFor } from "../util/zabi-strings.js";
|
|
4
|
+
import Check from "@lucide/svelte/icons/check";
|
|
5
|
+
import { tick, untrack } from "svelte";
|
|
6
|
+
import type { HTMLAttributes } from "svelte/elements";
|
|
7
|
+
import type { SizeVariant } from "../types/variants.js";
|
|
8
|
+
import { cn } from "../util/cn.js";
|
|
9
|
+
import {
|
|
10
|
+
STEPPER_STRINGS,
|
|
11
|
+
clampStep,
|
|
12
|
+
normalizeSteps,
|
|
13
|
+
stepState,
|
|
14
|
+
type StepperItem,
|
|
15
|
+
type StepperStep,
|
|
16
|
+
type StepperStepState,
|
|
17
|
+
type StepperStrings,
|
|
18
|
+
} from "../util/stepper.js";
|
|
19
|
+
|
|
20
|
+
/** Other attributes (`data-*`, `id`, `aria-labelledby`, ...) land on the host element. */
|
|
21
|
+
type Props = Omit<HTMLAttributes<HTMLElement>, "class"> & {
|
|
22
|
+
/** Extra classes for the host element. */
|
|
23
|
+
class?: string;
|
|
24
|
+
/** The steps, in order: labels, or objects with a label and a description. */
|
|
25
|
+
steps: StepperItem[];
|
|
26
|
+
/**
|
|
27
|
+
* Index of the current step, counted from 0; supports `bind:current`.
|
|
28
|
+
* A value outside the steps is shown as the nearest step (below the
|
|
29
|
+
* first: the first; past the last: the last) and the bound value is
|
|
30
|
+
* left as it was given.
|
|
31
|
+
*/
|
|
32
|
+
current?: number;
|
|
33
|
+
/** Size of the markers and the text. */
|
|
34
|
+
size?: SizeVariant;
|
|
35
|
+
/**
|
|
36
|
+
* `full` draws every step with its marker and label; `compact` draws
|
|
37
|
+
* one line of text under a segmented bar. `auto` is compact while the
|
|
38
|
+
* Stepper itself is narrower than 30rem, and full from there.
|
|
39
|
+
*/
|
|
40
|
+
layout?: "auto" | "full" | "compact";
|
|
41
|
+
/**
|
|
42
|
+
* Makes the completed steps buttons that go back to that step. The
|
|
43
|
+
* current step and the ones after it are never buttons.
|
|
44
|
+
*/
|
|
45
|
+
interactive?: boolean;
|
|
46
|
+
/** Accessible name of the navigation landmark. */
|
|
47
|
+
label?: string;
|
|
48
|
+
/** Overrides for the built-in strings. */
|
|
49
|
+
strings?: Partial<StepperStrings>;
|
|
50
|
+
/** Called with the index of the step a press went back to. Only with `interactive`. */
|
|
51
|
+
onstepchange?: (index: number) => void;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
let {
|
|
55
|
+
class: className = "",
|
|
56
|
+
steps,
|
|
57
|
+
current = $bindable<Exclude<Props["current"], undefined>>(),
|
|
58
|
+
size = "md",
|
|
59
|
+
layout = "auto",
|
|
60
|
+
interactive = false,
|
|
61
|
+
label = "Progress",
|
|
62
|
+
strings,
|
|
63
|
+
onstepchange,
|
|
64
|
+
...restProps
|
|
65
|
+
}: Props = $props();
|
|
66
|
+
|
|
67
|
+
// No fallback on a bindable prop: Svelte refuses `bind:…={undefined}` on
|
|
68
|
+
// one that has a fallback (`props_invalid_value`), and a page that throws
|
|
69
|
+
// while it hydrates never becomes interactive. The default is applied
|
|
70
|
+
// here instead: at once, for the server and the first render, and again
|
|
71
|
+
// whenever a parent hands back `undefined`.
|
|
72
|
+
const applyDefaults = () => {
|
|
73
|
+
if (current === undefined) current = 0;
|
|
74
|
+
};
|
|
75
|
+
applyDefaults();
|
|
76
|
+
$effect.pre(applyDefaults);
|
|
77
|
+
|
|
78
|
+
/** The app-wide words for this component, from a `ZabiStringsProvider` above it, if there is one. */
|
|
79
|
+
const provided = zabiStringsFor("stepper");
|
|
80
|
+
const text = $derived(mergeStrings(STEPPER_STRINGS, provided(), strings));
|
|
81
|
+
const items = $derived(normalizeSteps(steps));
|
|
82
|
+
/** The step shown as current: `current` held within the steps. */
|
|
83
|
+
const shown = $derived(clampStep(current, items.length));
|
|
84
|
+
const currentStep = $derived(items[shown]);
|
|
85
|
+
|
|
86
|
+
/** What a step is drawn in: a button while it can be pressed, a span otherwise. */
|
|
87
|
+
const bodies: (HTMLElement | undefined)[] = $state([]);
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Only a completed step is a button, so the press is never on the current
|
|
91
|
+
* one and a repeat press has nothing to clear. The button turns into the
|
|
92
|
+
* current step's plain text as it is pressed; focus is put on that text,
|
|
93
|
+
* so it is not dropped onto the page.
|
|
94
|
+
*/
|
|
95
|
+
async function go(index: number) {
|
|
96
|
+
if (index >= shown) return;
|
|
97
|
+
current = index;
|
|
98
|
+
onstepchange?.(index);
|
|
99
|
+
await tick();
|
|
100
|
+
bodies[index]?.focus();
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** Read out once when the current step changes, and never for the first render. */
|
|
104
|
+
let announced = $state("");
|
|
105
|
+
let previous: number | undefined;
|
|
106
|
+
|
|
107
|
+
$effect(() => {
|
|
108
|
+
const index = shown;
|
|
109
|
+
if (previous === undefined || index === previous || index < 0) {
|
|
110
|
+
previous = index;
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
previous = index;
|
|
114
|
+
announced = untrack(() =>
|
|
115
|
+
text.announcement(index + 1, items.length, items[index].label),
|
|
116
|
+
);
|
|
117
|
+
// Taken away again, so the list stays the one place the steps are read from.
|
|
118
|
+
const timer = setTimeout(() => (announced = ""), 3000);
|
|
119
|
+
return () => clearTimeout(timer);
|
|
120
|
+
});
|
|
121
|
+
</script>
|
|
122
|
+
|
|
123
|
+
{#snippet content(step: StepperStep, index: number, state: StepperStepState)}
|
|
124
|
+
<span class="stepper-marker" aria-hidden="true">
|
|
125
|
+
{#if state === "completed"}
|
|
126
|
+
<Check />
|
|
127
|
+
{:else}
|
|
128
|
+
<span class="stepper-number">{index + 1}</span>
|
|
129
|
+
{/if}
|
|
130
|
+
</span>
|
|
131
|
+
<span class="stepper-text">
|
|
132
|
+
<!-- One sentence with the number, the label and the state, so a
|
|
133
|
+
translation can order them; the visible label is a repeat of it. -->
|
|
134
|
+
<span class="sr-only">{text.stepLabel(index + 1, items.length, step.label, state)}</span>
|
|
135
|
+
<span class="stepper-label" aria-hidden="true">{step.label}</span>
|
|
136
|
+
{#if step.description}
|
|
137
|
+
<span class="stepper-description">{step.description}</span>
|
|
138
|
+
{/if}
|
|
139
|
+
</span>
|
|
140
|
+
{/snippet}
|
|
141
|
+
|
|
142
|
+
{#if items.length > 0}
|
|
143
|
+
<nav
|
|
144
|
+
class={cn("stepper", className)}
|
|
145
|
+
data-stepper
|
|
146
|
+
data-size={size}
|
|
147
|
+
data-layout={layout}
|
|
148
|
+
data-interactive={interactive ? "" : undefined}
|
|
149
|
+
aria-label={restProps["aria-labelledby"] ? undefined : label}
|
|
150
|
+
{...restProps}
|
|
151
|
+
>
|
|
152
|
+
<div class="stepper-frame">
|
|
153
|
+
<!-- The one list, in both layouts: the compact layout draws its
|
|
154
|
+
markers as the segments of a bar and clips the text, so a screen
|
|
155
|
+
reader reads the same steps either way. `role`, because a list
|
|
156
|
+
without bullets loses its role in Safari. -->
|
|
157
|
+
<ol class="stepper-list" role="list">
|
|
158
|
+
{#each items as step, index (index)}
|
|
159
|
+
{@const state = stepState(index, shown)}
|
|
160
|
+
<li
|
|
161
|
+
class="stepper-step"
|
|
162
|
+
data-state={state}
|
|
163
|
+
aria-current={state === "current" ? "step" : undefined}
|
|
164
|
+
>
|
|
165
|
+
{#if interactive && state === "completed"}
|
|
166
|
+
<button
|
|
167
|
+
bind:this={bodies[index]}
|
|
168
|
+
type="button"
|
|
169
|
+
class="stepper-body focus-ring"
|
|
170
|
+
onclick={() => go(index)}
|
|
171
|
+
>
|
|
172
|
+
{@render content(step, index, state)}
|
|
173
|
+
</button>
|
|
174
|
+
{:else}
|
|
175
|
+
<!-- Never a Tab stop: -1, so that a step can take
|
|
176
|
+
focus from the button that was pressed to reach it. -->
|
|
177
|
+
<!-- svelte-ignore a11y_no_noninteractive_tabindex -->
|
|
178
|
+
<span
|
|
179
|
+
bind:this={bodies[index]}
|
|
180
|
+
class="stepper-body focus-ring"
|
|
181
|
+
tabindex={interactive ? -1 : undefined}
|
|
182
|
+
>
|
|
183
|
+
{@render content(step, index, state)}
|
|
184
|
+
</span>
|
|
185
|
+
{/if}
|
|
186
|
+
{#if index < items.length - 1}
|
|
187
|
+
<span class="stepper-connector" aria-hidden="true"></span>
|
|
188
|
+
{/if}
|
|
189
|
+
</li>
|
|
190
|
+
{/each}
|
|
191
|
+
</ol>
|
|
192
|
+
<!-- What the compact layout shows instead of the labels. Not in
|
|
193
|
+
the layout at all in the full one, and never read: the list says it. -->
|
|
194
|
+
<div class="stepper-summary" aria-hidden="true" data-stepper-summary>
|
|
195
|
+
<p class="stepper-summary-line">
|
|
196
|
+
<span>{text.position(shown + 1, items.length)}</span>
|
|
197
|
+
<span>—</span>
|
|
198
|
+
<span class="stepper-summary-label">{currentStep.label}</span>
|
|
199
|
+
</p>
|
|
200
|
+
{#if currentStep.description}
|
|
201
|
+
<p class="stepper-summary-description">{currentStep.description}</p>
|
|
202
|
+
{/if}
|
|
203
|
+
</div>
|
|
204
|
+
</div>
|
|
205
|
+
<span class="sr-only" role="status" data-stepper-status>{announced}</span>
|
|
206
|
+
</nav>
|
|
207
|
+
{/if}
|
|
208
|
+
|
|
209
|
+
<style>
|
|
210
|
+
/*
|
|
211
|
+
* One list, two drawings. The full layout is the default; the compact one
|
|
212
|
+
* is a set of values on `.stepper-frame`, switched on by `layout="compact"`
|
|
213
|
+
* or, for `auto`, by the width of the Stepper itself. The rules below read
|
|
214
|
+
* those values, so the two ways in cannot drift apart: `COMPACT` appears
|
|
215
|
+
* twice and must be the same list both times.
|
|
216
|
+
*/
|
|
217
|
+
.stepper {
|
|
218
|
+
container-type: inline-size;
|
|
219
|
+
/*
|
|
220
|
+
* A size container has no width of its own: as an item of a flex row,
|
|
221
|
+
* or centred in a column or a grid, it would be 0px wide and nothing
|
|
222
|
+
* of it would show. So it asks for the width at which the full layout
|
|
223
|
+
* begins, and gives way to what there is: narrower than that, it is
|
|
224
|
+
* as wide as the room it gets and compact.
|
|
225
|
+
*/
|
|
226
|
+
contain-intrinsic-inline-size: 30rem;
|
|
227
|
+
min-inline-size: 0;
|
|
228
|
+
--zabi-stepper-marker: 2rem;
|
|
229
|
+
--zabi-stepper-bar: 8px;
|
|
230
|
+
--zabi-stepper-leading: 1.25rem;
|
|
231
|
+
/* The least height of a step that can be pressed. */
|
|
232
|
+
--zabi-stepper-min-row: 0px;
|
|
233
|
+
font-size: 0.875rem;
|
|
234
|
+
line-height: var(--zabi-stepper-leading);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
.stepper[data-size="sm"] {
|
|
238
|
+
--zabi-stepper-marker: 1.5rem;
|
|
239
|
+
--zabi-stepper-bar: 6px;
|
|
240
|
+
--zabi-stepper-leading: 1rem;
|
|
241
|
+
font-size: 0.75rem;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
.stepper[data-size="lg"] {
|
|
245
|
+
--zabi-stepper-marker: 2.5rem;
|
|
246
|
+
--zabi-stepper-bar: 10px;
|
|
247
|
+
--zabi-stepper-leading: 1.5rem;
|
|
248
|
+
font-size: 1rem;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
.stepper[data-interactive] {
|
|
252
|
+
--zabi-stepper-min-row: 24px;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/* A finger is the same size whatever the text size is, so the target is in px. */
|
|
256
|
+
@media (pointer: coarse) {
|
|
257
|
+
.stepper[data-interactive] {
|
|
258
|
+
--zabi-stepper-min-row: 44px;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
.stepper-frame {
|
|
263
|
+
--zabi-stepper-row: max(var(--zabi-stepper-min-row), var(--zabi-stepper-marker));
|
|
264
|
+
--zabi-stepper-gap: 0px;
|
|
265
|
+
--zabi-stepper-step-flex: 1 1 auto;
|
|
266
|
+
--zabi-stepper-last-flex: 0 1 auto;
|
|
267
|
+
--zabi-stepper-body-size: auto;
|
|
268
|
+
--zabi-stepper-body-least: var(--zabi-stepper-min-row);
|
|
269
|
+
--zabi-stepper-marker-inline: var(--zabi-stepper-marker);
|
|
270
|
+
--zabi-stepper-marker-block: var(--zabi-stepper-marker);
|
|
271
|
+
--zabi-stepper-marker-edge: 2px;
|
|
272
|
+
--zabi-stepper-current-gap: 2px;
|
|
273
|
+
--zabi-stepper-glyph: flex;
|
|
274
|
+
--zabi-stepper-connector: block;
|
|
275
|
+
--zabi-stepper-summary: none;
|
|
276
|
+
--zabi-stepper-text-position: static;
|
|
277
|
+
--zabi-stepper-text-size: auto;
|
|
278
|
+
--zabi-stepper-text-overflow: visible;
|
|
279
|
+
--zabi-stepper-text-clip: none;
|
|
280
|
+
--zabi-stepper-text-space: normal;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/* COMPACT */
|
|
284
|
+
.stepper[data-layout="compact"] .stepper-frame {
|
|
285
|
+
--zabi-stepper-row: max(var(--zabi-stepper-min-row), var(--zabi-stepper-bar));
|
|
286
|
+
--zabi-stepper-gap: 4px;
|
|
287
|
+
--zabi-stepper-step-flex: 1 1 0;
|
|
288
|
+
--zabi-stepper-last-flex: 1 1 0;
|
|
289
|
+
--zabi-stepper-body-size: 100%;
|
|
290
|
+
--zabi-stepper-body-least: 0px;
|
|
291
|
+
--zabi-stepper-marker-inline: 100%;
|
|
292
|
+
--zabi-stepper-marker-block: var(--zabi-stepper-bar);
|
|
293
|
+
--zabi-stepper-marker-edge: 1px;
|
|
294
|
+
--zabi-stepper-current-gap: 0px;
|
|
295
|
+
--zabi-stepper-glyph: none;
|
|
296
|
+
--zabi-stepper-connector: none;
|
|
297
|
+
--zabi-stepper-summary: block;
|
|
298
|
+
--zabi-stepper-text-position: absolute;
|
|
299
|
+
--zabi-stepper-text-size: 1px;
|
|
300
|
+
--zabi-stepper-text-overflow: hidden;
|
|
301
|
+
--zabi-stepper-text-clip: inset(50%);
|
|
302
|
+
--zabi-stepper-text-space: nowrap;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/* COMPACT, again: in rem, so enlarged text goes compact sooner. */
|
|
306
|
+
@container (width < 30rem) {
|
|
307
|
+
.stepper[data-layout="auto"] .stepper-frame {
|
|
308
|
+
--zabi-stepper-row: max(var(--zabi-stepper-min-row), var(--zabi-stepper-bar));
|
|
309
|
+
--zabi-stepper-gap: 4px;
|
|
310
|
+
--zabi-stepper-step-flex: 1 1 0;
|
|
311
|
+
--zabi-stepper-last-flex: 1 1 0;
|
|
312
|
+
--zabi-stepper-body-size: 100%;
|
|
313
|
+
--zabi-stepper-body-least: 0px;
|
|
314
|
+
--zabi-stepper-marker-inline: 100%;
|
|
315
|
+
--zabi-stepper-marker-block: var(--zabi-stepper-bar);
|
|
316
|
+
--zabi-stepper-marker-edge: 1px;
|
|
317
|
+
--zabi-stepper-current-gap: 0px;
|
|
318
|
+
--zabi-stepper-glyph: none;
|
|
319
|
+
--zabi-stepper-connector: none;
|
|
320
|
+
--zabi-stepper-summary: block;
|
|
321
|
+
--zabi-stepper-text-position: absolute;
|
|
322
|
+
--zabi-stepper-text-size: 1px;
|
|
323
|
+
--zabi-stepper-text-overflow: hidden;
|
|
324
|
+
--zabi-stepper-text-clip: inset(50%);
|
|
325
|
+
--zabi-stepper-text-space: nowrap;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
.stepper-list {
|
|
330
|
+
display: flex;
|
|
331
|
+
align-items: flex-start;
|
|
332
|
+
gap: var(--zabi-stepper-gap);
|
|
333
|
+
margin: 0;
|
|
334
|
+
padding: 0;
|
|
335
|
+
list-style: none;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
.stepper-step {
|
|
339
|
+
position: relative;
|
|
340
|
+
display: flex;
|
|
341
|
+
flex: var(--zabi-stepper-step-flex);
|
|
342
|
+
align-items: flex-start;
|
|
343
|
+
min-width: 0;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
.stepper-step:last-child {
|
|
347
|
+
flex: var(--zabi-stepper-last-flex);
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
.stepper-body {
|
|
351
|
+
display: flex;
|
|
352
|
+
align-items: flex-start;
|
|
353
|
+
/* Between a marker and its label; not a distance that should grow with the text. */
|
|
354
|
+
gap: 8px;
|
|
355
|
+
width: var(--zabi-stepper-body-size);
|
|
356
|
+
min-width: 0;
|
|
357
|
+
min-height: var(--zabi-stepper-row);
|
|
358
|
+
margin: 0;
|
|
359
|
+
padding: 0;
|
|
360
|
+
border: 0;
|
|
361
|
+
/* A pill, as the marker in it is: the focus ring follows it. */
|
|
362
|
+
border-radius: 9999px;
|
|
363
|
+
background: none;
|
|
364
|
+
color: inherit;
|
|
365
|
+
font: inherit;
|
|
366
|
+
text-align: start;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
/* A segment of the bar is as wide as its share of the bar, and no wider:
|
|
370
|
+
a least width there would lay the segments over each other. */
|
|
371
|
+
button.stepper-body {
|
|
372
|
+
min-width: var(--zabi-stepper-body-least);
|
|
373
|
+
cursor: pointer;
|
|
374
|
+
-webkit-tap-highlight-color: transparent;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
/*
|
|
378
|
+
* Completed and current are filled, upcoming is an outline: a difference
|
|
379
|
+
* of shape. Completed has a check where the others have their number, and
|
|
380
|
+
* the current one stands inside a ring of its own.
|
|
381
|
+
*/
|
|
382
|
+
.stepper-marker {
|
|
383
|
+
display: flex;
|
|
384
|
+
flex: none;
|
|
385
|
+
align-items: center;
|
|
386
|
+
justify-content: center;
|
|
387
|
+
box-sizing: border-box;
|
|
388
|
+
width: var(--zabi-stepper-marker-inline);
|
|
389
|
+
height: var(--zabi-stepper-marker-block);
|
|
390
|
+
margin-block: calc((var(--zabi-stepper-row) - var(--zabi-stepper-marker-block)) / 2);
|
|
391
|
+
/* `--zabi-stepper-fill` is what a hovered or pressed step changes. */
|
|
392
|
+
border: var(--zabi-stepper-marker-edge) solid
|
|
393
|
+
var(--zabi-stepper-fill, var(--color-action-primary));
|
|
394
|
+
border-radius: 9999px;
|
|
395
|
+
background-color: var(--zabi-stepper-fill, var(--color-action-primary));
|
|
396
|
+
color: var(--color-on-brand);
|
|
397
|
+
font-weight: 600;
|
|
398
|
+
font-variant-numeric: tabular-nums;
|
|
399
|
+
line-height: 1;
|
|
400
|
+
transition:
|
|
401
|
+
background-color 150ms,
|
|
402
|
+
border-color 150ms,
|
|
403
|
+
transform 150ms;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
.stepper-marker > :global(*) {
|
|
407
|
+
display: var(--zabi-stepper-glyph);
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
.stepper-marker > :global(svg) {
|
|
411
|
+
width: 60%;
|
|
412
|
+
height: 60%;
|
|
413
|
+
stroke-width: 3;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
/* The ring: the fill stops 2px short of the edge, and the surface shows between. */
|
|
417
|
+
.stepper-step[data-state="current"] .stepper-marker {
|
|
418
|
+
padding: var(--zabi-stepper-current-gap);
|
|
419
|
+
background-clip: content-box;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
/* The edge is all there is of an upcoming marker, so it is the control
|
|
423
|
+
boundary: 3:1 or better on every surface level of both themes. */
|
|
424
|
+
.stepper-step[data-state="upcoming"] .stepper-marker {
|
|
425
|
+
border-color: var(--color-control-border);
|
|
426
|
+
background-color: transparent;
|
|
427
|
+
color: var(--color-description);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
.stepper-text {
|
|
431
|
+
position: var(--zabi-stepper-text-position);
|
|
432
|
+
display: flex;
|
|
433
|
+
flex-direction: column;
|
|
434
|
+
width: var(--zabi-stepper-text-size);
|
|
435
|
+
height: var(--zabi-stepper-text-size);
|
|
436
|
+
min-width: 0;
|
|
437
|
+
overflow: var(--zabi-stepper-text-overflow);
|
|
438
|
+
clip-path: var(--zabi-stepper-text-clip);
|
|
439
|
+
white-space: var(--zabi-stepper-text-space);
|
|
440
|
+
padding-block: calc((var(--zabi-stepper-row) - var(--zabi-stepper-leading)) / 2);
|
|
441
|
+
overflow-wrap: anywhere;
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
.stepper-label {
|
|
445
|
+
color: var(--color-body);
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
.stepper-step[data-state="current"] .stepper-label {
|
|
449
|
+
font-weight: 600;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
.stepper-step[data-state="upcoming"] .stepper-label {
|
|
453
|
+
color: var(--color-description);
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
.stepper-description,
|
|
457
|
+
.stepper-summary-description {
|
|
458
|
+
color: var(--color-description);
|
|
459
|
+
font-size: 0.75rem;
|
|
460
|
+
line-height: 1rem;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
/* Solid up to the current step and dashed after it: not by colour alone. */
|
|
464
|
+
.stepper-connector {
|
|
465
|
+
display: var(--zabi-stepper-connector);
|
|
466
|
+
flex: 1 1 1rem;
|
|
467
|
+
min-width: 1rem;
|
|
468
|
+
margin-inline: 8px;
|
|
469
|
+
margin-block-start: calc(var(--zabi-stepper-row) / 2 - 1px);
|
|
470
|
+
border-block-start: 2px dashed var(--color-control-border);
|
|
471
|
+
transition: border-color 150ms;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
.stepper-step[data-state="completed"] > .stepper-connector {
|
|
475
|
+
border-block-start: 2px solid var(--color-action-primary);
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
.stepper-summary {
|
|
479
|
+
display: var(--zabi-stepper-summary);
|
|
480
|
+
margin-block-start: 8px;
|
|
481
|
+
color: var(--color-description);
|
|
482
|
+
overflow-wrap: anywhere;
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
.stepper-summary-line {
|
|
486
|
+
margin: 0;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
.stepper-summary-label {
|
|
490
|
+
color: var(--color-body);
|
|
491
|
+
font-weight: 600;
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
.stepper-summary-description {
|
|
495
|
+
margin: 2px 0 0;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
@media (hover: hover) {
|
|
499
|
+
button.stepper-body:hover {
|
|
500
|
+
--zabi-stepper-fill: var(--color-action-primary-hover);
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
button.stepper-body:hover .stepper-label {
|
|
504
|
+
text-decoration: underline;
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
/* Pressed, on every pointer. */
|
|
509
|
+
button.stepper-body:active {
|
|
510
|
+
--zabi-stepper-fill: var(--color-action-primary-active);
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
button.stepper-body:active .stepper-marker {
|
|
514
|
+
transform: scale(0.92);
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
/*
|
|
518
|
+
* Forced colours take every background away. The filled markers are put
|
|
519
|
+
* back in the system's own pair, so filled still differs from outlined;
|
|
520
|
+
* the connectors are borders, which are kept, solid and dashed. A hovered
|
|
521
|
+
* or pressed step changes `--zabi-stepper-fill`, which is not read here.
|
|
522
|
+
*/
|
|
523
|
+
@media (forced-colors: active) {
|
|
524
|
+
.stepper-marker {
|
|
525
|
+
forced-color-adjust: none;
|
|
526
|
+
border-color: Highlight;
|
|
527
|
+
background-color: Highlight;
|
|
528
|
+
color: HighlightText;
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
.stepper-step[data-state="upcoming"] .stepper-marker {
|
|
532
|
+
border-color: CanvasText;
|
|
533
|
+
background-color: Canvas;
|
|
534
|
+
color: CanvasText;
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
@media (prefers-reduced-motion: reduce) {
|
|
539
|
+
.stepper-marker,
|
|
540
|
+
.stepper-connector {
|
|
541
|
+
transition: none;
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
button.stepper-body:active .stepper-marker {
|
|
545
|
+
transform: none;
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
</style>
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { HTMLAttributes } from "svelte/elements";
|
|
2
|
+
import type { SizeVariant } from "../types/variants.js";
|
|
3
|
+
import { type StepperItem, type StepperStrings } from "../util/stepper.js";
|
|
4
|
+
/** Other attributes (`data-*`, `id`, `aria-labelledby`, ...) land on the host element. */
|
|
5
|
+
type Props = Omit<HTMLAttributes<HTMLElement>, "class"> & {
|
|
6
|
+
/** Extra classes for the host element. */
|
|
7
|
+
class?: string;
|
|
8
|
+
/** The steps, in order: labels, or objects with a label and a description. */
|
|
9
|
+
steps: StepperItem[];
|
|
10
|
+
/**
|
|
11
|
+
* Index of the current step, counted from 0; supports `bind:current`.
|
|
12
|
+
* A value outside the steps is shown as the nearest step (below the
|
|
13
|
+
* first: the first; past the last: the last) and the bound value is
|
|
14
|
+
* left as it was given.
|
|
15
|
+
*/
|
|
16
|
+
current?: number;
|
|
17
|
+
/** Size of the markers and the text. */
|
|
18
|
+
size?: SizeVariant;
|
|
19
|
+
/**
|
|
20
|
+
* `full` draws every step with its marker and label; `compact` draws
|
|
21
|
+
* one line of text under a segmented bar. `auto` is compact while the
|
|
22
|
+
* Stepper itself is narrower than 30rem, and full from there.
|
|
23
|
+
*/
|
|
24
|
+
layout?: "auto" | "full" | "compact";
|
|
25
|
+
/**
|
|
26
|
+
* Makes the completed steps buttons that go back to that step. The
|
|
27
|
+
* current step and the ones after it are never buttons.
|
|
28
|
+
*/
|
|
29
|
+
interactive?: boolean;
|
|
30
|
+
/** Accessible name of the navigation landmark. */
|
|
31
|
+
label?: string;
|
|
32
|
+
/** Overrides for the built-in strings. */
|
|
33
|
+
strings?: Partial<StepperStrings>;
|
|
34
|
+
/** Called with the index of the step a press went back to. Only with `interactive`. */
|
|
35
|
+
onstepchange?: (index: number) => void;
|
|
36
|
+
};
|
|
37
|
+
declare const Stepper: import("svelte").Component<Props, {}, "current">;
|
|
38
|
+
type Stepper = ReturnType<typeof Stepper>;
|
|
39
|
+
export default Stepper;
|