zabi-components 8.0.0 → 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 +243 -10
- package/THEME.md +149 -332
- package/THEMING.md +1192 -266
- package/dist/atoms/ActionPanel.svelte +15 -5
- package/dist/atoms/Avatar.svelte +104 -0
- package/dist/atoms/Avatar.svelte.d.ts +34 -0
- package/dist/atoms/Badge.svelte +36 -7
- package/dist/atoms/Badge.svelte.d.ts +2 -2
- package/dist/atoms/Button.svelte +177 -27
- package/dist/atoms/Button.svelte.d.ts +30 -2
- package/dist/atoms/Card.svelte +4 -4
- package/dist/atoms/CardHeader.svelte +16 -4
- package/dist/atoms/Checkbox.svelte +48 -21
- package/dist/atoms/Checkbox.svelte.d.ts +4 -2
- package/dist/atoms/CodeBlock.svelte +20 -2
- package/dist/atoms/CodeBlock.svelte.d.ts +4 -0
- package/dist/atoms/ColorPicker.svelte +259 -49
- package/dist/atoms/ColorPicker.svelte.d.ts +3 -0
- package/dist/atoms/Container.svelte +16 -8
- package/dist/atoms/DateField.svelte +107 -0
- package/dist/atoms/DateField.svelte.d.ts +53 -0
- 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 +37 -5
- package/dist/atoms/Heading.svelte.d.ts +7 -0
- package/dist/atoms/IconButton.svelte +220 -24
- package/dist/atoms/IconButton.svelte.d.ts +49 -4
- package/dist/atoms/Input.svelte +253 -52
- package/dist/atoms/Input.svelte.d.ts +32 -2
- package/dist/atoms/List.svelte +4 -1
- package/dist/atoms/ListItem.svelte +44 -11
- package/dist/atoms/ListItem.svelte.d.ts +5 -0
- package/dist/atoms/Progress.svelte +27 -8
- package/dist/atoms/Progress.svelte.d.ts +4 -0
- package/dist/atoms/Radio.svelte +19 -3
- package/dist/atoms/Radio.svelte.d.ts +4 -2
- package/dist/atoms/Rating.svelte +494 -0
- package/dist/atoms/Rating.svelte.d.ts +56 -0
- package/dist/atoms/Select.svelte +433 -91
- package/dist/atoms/Select.svelte.d.ts +49 -3
- package/dist/atoms/SelectionControl.svelte +94 -17
- package/dist/atoms/SelectionControl.svelte.d.ts +4 -3
- package/dist/atoms/Skeleton.svelte +1 -1
- 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 +151 -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 +23 -11
- package/dist/atoms/Text.svelte.d.ts +6 -3
- package/dist/atoms/Textarea.svelte +55 -44
- package/dist/atoms/Textarea.svelte.d.ts +14 -2
- package/dist/atoms/ThemeToggle.svelte +223 -44
- package/dist/atoms/ThemeToggle.svelte.d.ts +26 -3
- package/dist/atoms/TimeField.svelte +108 -0
- package/dist/atoms/TimeField.svelte.d.ts +54 -0
- package/dist/atoms/Toast.svelte +17 -4
- package/dist/atoms/Toast.svelte.d.ts +2 -0
- package/dist/atoms/Toggle.svelte +41 -8
- package/dist/atoms/Toggle.svelte.d.ts +11 -2
- package/dist/atoms/Tooltip.svelte +508 -23
- package/dist/atoms/Tooltip.svelte.d.ts +11 -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 +80 -2
- 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 +5 -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/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/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 +80 -2
- package/dist/index.js +57 -2
- package/dist/molecules/Alert.svelte +33 -5
- package/dist/molecules/Alert.svelte.d.ts +2 -0
- 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 +16 -4
- package/dist/molecules/ComponentDemo.svelte.d.ts +3 -0
- package/dist/molecules/ConfirmDialog.svelte +253 -0
- package/dist/molecules/ConfirmDialog.svelte.d.ts +55 -0
- package/dist/molecules/ContactForm.svelte +34 -17
- package/dist/molecules/ContactForm.svelte.d.ts +8 -0
- package/dist/molecules/Drawer.svelte +394 -0
- package/dist/molecules/Drawer.svelte.d.ts +55 -0
- package/dist/molecules/Dropdown.svelte +509 -48
- package/dist/molecules/Dropdown.svelte.d.ts +45 -6
- package/dist/molecules/DropdownItem.svelte +122 -0
- package/dist/molecules/DropdownItem.svelte.d.ts +28 -0
- package/dist/molecules/EmptyState.svelte +55 -10
- package/dist/molecules/EmptyState.svelte.d.ts +8 -0
- package/dist/molecules/FormField.svelte +9 -1
- package/dist/molecules/FormField.svelte.d.ts +2 -0
- package/dist/molecules/Header.svelte +1 -1
- package/dist/molecules/ImageUpload.svelte +383 -70
- package/dist/molecules/ImageUpload.svelte.d.ts +47 -2
- package/dist/molecules/MediaGrid.svelte +527 -0
- package/dist/molecules/MediaGrid.svelte.d.ts +77 -0
- package/dist/molecules/Modal.svelte +288 -72
- package/dist/molecules/Modal.svelte.d.ts +51 -2
- package/dist/molecules/NavigationMenuContent.svelte +58 -1
- package/dist/molecules/NavigationMenuItem.svelte +0 -1
- package/dist/molecules/NavigationMenuLink.svelte +1 -1
- package/dist/molecules/NavigationMenuList.svelte +10 -3
- package/dist/molecules/NavigationMenuTrigger.svelte +2 -2
- package/dist/molecules/Page.svelte +32 -2
- package/dist/molecules/Page.svelte.d.ts +11 -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 +22 -10
- package/dist/molecules/PropsTable.svelte.d.ts +3 -0
- package/dist/molecules/PullToRefresh.svelte +263 -0
- package/dist/molecules/PullToRefresh.svelte.d.ts +52 -0
- package/dist/molecules/RadioGroup.svelte +52 -14
- package/dist/molecules/RadioGroup.svelte.d.ts +14 -3
- package/dist/molecules/Section.svelte +1 -1
- package/dist/molecules/SegmentedControl.svelte +323 -0
- package/dist/molecules/SegmentedControl.svelte.d.ts +34 -0
- package/dist/molecules/SidebarBrandHeader.svelte +11 -1
- package/dist/molecules/SidebarBrandHeader.svelte.d.ts +3 -0
- package/dist/molecules/SidebarFooter.svelte +29 -6
- package/dist/molecules/SidebarFooter.svelte.d.ts +3 -0
- package/dist/molecules/SlideUp.svelte +220 -61
- package/dist/molecules/SlideUp.svelte.d.ts +26 -0
- 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 +233 -9
- package/dist/molecules/Tabs.svelte.d.ts +7 -0
- package/dist/molecules/Toaster.svelte +350 -5
- package/dist/molecules/Toaster.svelte.d.ts +95 -2
- package/dist/molecules/ToasterToast.svelte +253 -67
- package/dist/molecules/ToasterToast.svelte.d.ts +9 -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 +107 -12
- package/dist/organisms/SidebarAccountPanel.svelte.d.ts +19 -0
- package/dist/organisms/SidebarNavigation.svelte +96 -15
- package/dist/organisms/SidebarNavigation.svelte.d.ts +29 -1
- package/dist/organisms/SidebarPanel.svelte +31 -10
- package/dist/organisms/SidebarShell.svelte +162 -11
- package/dist/organisms/SidebarShell.svelte.d.ts +56 -2
- package/dist/organisms/TopNavbar.svelte +256 -31
- package/dist/organisms/TopNavbar.svelte.d.ts +26 -0
- package/dist/organisms/index.d.ts +5 -0
- package/dist/organisms/index.js +3 -0
- package/dist/types/components.d.ts +4 -0
- package/dist/types/components.d.ts.map +1 -1
- package/dist/types/index.d.ts +605 -25
- package/dist/types/index.d.ts.map +1 -1
- 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/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/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 +543 -241
- package/dist/zabi-components-theme-dark.css +543 -241
- package/dist/zabi-components-theme-only.css +1584 -367
- package/dist/zabi-components-theme.css +1584 -367
- package/dist/zabi-components.css +3885 -518
- package/docs/lucide-icons.md +40 -17
- package/docs/theme-imports.md +81 -11
- package/package.json +35 -8
package/THEME.md
CHANGED
|
@@ -1,370 +1,239 @@
|
|
|
1
1
|
# Zabi Components Theme Guide
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
How to load the Zabi Components theme in an app that uses Tailwind CSS v4, and
|
|
4
|
+
how to use its tokens in your own CSS.
|
|
5
|
+
|
|
6
|
+
To give the library your own brand, read [THEMING.md](./THEMING.md). It lists
|
|
7
|
+
the tokens an app may set and documents the `zabi-theme` generator. This file
|
|
8
|
+
does not repeat it.
|
|
4
9
|
|
|
5
10
|
## Table of Contents
|
|
6
11
|
|
|
7
12
|
- [Quick Start](#quick-start)
|
|
8
13
|
- [Theme Files](#theme-files)
|
|
9
|
-
- [Import Options](#import-options)
|
|
10
|
-
- [Theme Extension](#theme-extension)
|
|
11
14
|
- [Dark Mode](#dark-mode)
|
|
12
|
-
- [
|
|
13
|
-
- [
|
|
15
|
+
- [Using the Tokens](#using-the-tokens)
|
|
16
|
+
- [Your Brand](#your-brand)
|
|
17
|
+
- [Adding Your Own Tokens](#adding-your-own-tokens)
|
|
14
18
|
- [Common Pitfalls](#common-pitfalls)
|
|
19
|
+
- [Troubleshooting](#troubleshooting)
|
|
15
20
|
|
|
16
21
|
## Quick Start
|
|
17
22
|
|
|
18
|
-
###
|
|
19
|
-
|
|
20
|
-
If you don't have Tailwind CSS set up yet:
|
|
23
|
+
### With Tailwind in the app
|
|
21
24
|
|
|
22
25
|
```css
|
|
23
26
|
/* app.css */
|
|
24
|
-
@import
|
|
25
|
-
@import
|
|
27
|
+
@import "tailwindcss";
|
|
28
|
+
@import "zabi-components/theme-only";
|
|
29
|
+
@import "zabi-components/theme-dark-only";
|
|
26
30
|
```
|
|
27
31
|
|
|
28
|
-
|
|
32
|
+
That is everything. The theme file tells Tailwind to scan the package's
|
|
33
|
+
components, so the classes they use are generated by your build; there is no
|
|
34
|
+
second stylesheet to import.
|
|
29
35
|
|
|
30
|
-
|
|
36
|
+
### Without Tailwind in the app
|
|
31
37
|
|
|
32
38
|
```css
|
|
33
39
|
/* app.css */
|
|
34
|
-
@import "
|
|
35
|
-
@import 'zabi-components/theme-only';
|
|
36
|
-
@import 'zabi-components/dist/zabi-components.css';
|
|
40
|
+
@import "zabi-components/css";
|
|
37
41
|
```
|
|
38
42
|
|
|
39
|
-
|
|
43
|
+
The compiled stylesheet holds the utilities the components use, in light and
|
|
44
|
+
dark.
|
|
45
|
+
|
|
46
|
+
### Standalone theme files
|
|
47
|
+
|
|
48
|
+
`zabi-components/theme` and `zabi-components/theme-dark` are the same two theme
|
|
49
|
+
files with `@import "tailwindcss"` at the top, for a stylesheet that does not
|
|
50
|
+
import Tailwind itself. They still go through Tailwind's build.
|
|
40
51
|
|
|
41
52
|
```css
|
|
42
53
|
/* app.css */
|
|
43
|
-
@import "
|
|
44
|
-
@import
|
|
45
|
-
@import 'zabi-components/theme-dark-only';
|
|
46
|
-
@import 'zabi-components/dist/zabi-components.css';
|
|
54
|
+
@import "zabi-components/theme";
|
|
55
|
+
@import "zabi-components/theme-dark";
|
|
47
56
|
```
|
|
48
57
|
|
|
49
58
|
## Theme Files
|
|
50
59
|
|
|
51
|
-
Zabi Components provides multiple theme file variants:
|
|
52
|
-
|
|
53
60
|
| File | Description | Use Case |
|
|
54
61
|
|------|-------------|----------|
|
|
55
|
-
| `zabi-components/theme` |
|
|
56
|
-
| `zabi-components/theme-only` |
|
|
57
|
-
| `zabi-components/theme
|
|
58
|
-
| `zabi-components/theme-dark-only`
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
You can also import using direct paths:
|
|
63
|
-
|
|
64
|
-
```css
|
|
65
|
-
@import 'zabi-components/dist/zabi-components-theme.css';
|
|
66
|
-
@import 'zabi-components/dist/zabi-components-theme-only.css';
|
|
67
|
-
@import 'zabi-components/dist/zabi-components-theme-dark.css';
|
|
68
|
-
@import 'zabi-components/dist/zabi-components-theme-dark-only.css';
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
## Import Options
|
|
72
|
-
|
|
73
|
-
### Option 1: Standalone (No Existing Tailwind)
|
|
74
|
-
|
|
75
|
-
Best for new projects or projects without Tailwind:
|
|
76
|
-
|
|
77
|
-
```css
|
|
78
|
-
@import 'zabi-components/theme';
|
|
79
|
-
@import 'zabi-components/theme-dark'; /* Optional: for dark mode */
|
|
80
|
-
@import 'zabi-components/dist/zabi-components.css';
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
**Pros:**
|
|
84
|
-
- Simple setup
|
|
85
|
-
- No Tailwind configuration needed
|
|
86
|
-
- Everything included
|
|
87
|
-
|
|
88
|
-
**Cons:**
|
|
89
|
-
- Less control over Tailwind configuration
|
|
90
|
-
- Slightly larger bundle if you need custom Tailwind config
|
|
91
|
-
|
|
92
|
-
### Option 2: With Existing Tailwind
|
|
93
|
-
|
|
94
|
-
Best for projects already using Tailwind CSS:
|
|
95
|
-
|
|
96
|
-
```css
|
|
97
|
-
@import "tailwindcss";
|
|
98
|
-
@import 'zabi-components/theme-only';
|
|
99
|
-
@import 'zabi-components/theme-dark-only'; /* Optional: for dark mode */
|
|
100
|
-
@import 'zabi-components/dist/zabi-components.css';
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
**Pros:**
|
|
104
|
-
- Full control over Tailwind configuration
|
|
105
|
-
- Can customize Tailwind before importing theme
|
|
106
|
-
- Smaller bundle (no duplicate Tailwind import)
|
|
62
|
+
| `zabi-components/theme-only` | Every token, light values. No Tailwind import. | Apps that import Tailwind themselves |
|
|
63
|
+
| `zabi-components/theme-dark-only` | Dark role remaps. No Tailwind import. Needs the light theme. | The same apps, for dark mode |
|
|
64
|
+
| `zabi-components/theme` | `theme-only` with `@import "tailwindcss"` | A stylesheet without its own Tailwind import |
|
|
65
|
+
| `zabi-components/theme-dark` | `theme-dark-only` with `@import "tailwindcss"`. Needs the light theme. | The same, for dark mode |
|
|
66
|
+
| `zabi-components/css` | The compiled stylesheet | Apps without Tailwind |
|
|
67
|
+
| `zabi-components/colors` | The tokens as plain custom properties, light and dark | Apps that want only the variables |
|
|
107
68
|
|
|
108
|
-
|
|
109
|
-
-
|
|
110
|
-
- Must import Tailwind first
|
|
111
|
-
|
|
112
|
-
## Theme Extension
|
|
113
|
-
|
|
114
|
-
You can extend the Zabi theme with your own customizations using additional `@theme` blocks:
|
|
115
|
-
|
|
116
|
-
```css
|
|
117
|
-
@import "tailwindcss";
|
|
118
|
-
@import 'zabi-components/theme-only';
|
|
119
|
-
|
|
120
|
-
/* Your custom theme extensions */
|
|
121
|
-
@theme {
|
|
122
|
-
/* Custom font families */
|
|
123
|
-
--font-family-title: 'Your Font', sans-serif;
|
|
124
|
-
--font-family-body: 'Another Font', sans-serif;
|
|
125
|
-
|
|
126
|
-
/* Custom colors */
|
|
127
|
-
--color-custom-primary: #ff0000;
|
|
128
|
-
--color-custom-secondary: #00ff00;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
@import 'zabi-components/dist/zabi-components.css';
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
### Important: Import Order
|
|
135
|
-
|
|
136
|
-
The import order is critical:
|
|
137
|
-
|
|
138
|
-
1. **First:** `@import "tailwindcss"` (if using theme-only)
|
|
139
|
-
2. **Second:** `@import 'zabi-components/theme-only'` (or theme)
|
|
140
|
-
3. **Third:** Your custom `@theme` block (extends zabi theme)
|
|
141
|
-
4. **Fourth:** `@import 'zabi-components/dist/zabi-components.css'` (uses the theme)
|
|
142
|
-
|
|
143
|
-
This order ensures:
|
|
144
|
-
- Tailwind is available for `theme()` function calls
|
|
145
|
-
- Zabi theme is defined first
|
|
146
|
-
- Your extensions override zabi defaults
|
|
147
|
-
- Components can use all theme values
|
|
69
|
+
The full matrix, the legacy `dist/` paths and what each file contains are in
|
|
70
|
+
[docs/theme-imports.md](./docs/theme-imports.md).
|
|
148
71
|
|
|
149
72
|
## Dark Mode
|
|
150
73
|
|
|
151
|
-
|
|
74
|
+
Import the dark theme file after the light one. It only remaps roles; the raw
|
|
75
|
+
palettes (`--zabi-brand-*`, `--zabi-accent-*`, `--zabi-base-*` and the other
|
|
76
|
+
ramps) are declared once, in the light theme, so the dark file does nothing on
|
|
77
|
+
its own.
|
|
152
78
|
|
|
153
|
-
|
|
79
|
+
Dark is switched on the `<html>` element, by an attribute or by a class:
|
|
154
80
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
The dark theme file uses `@media (prefers-color-scheme: dark)` to automatically switch based on system preference.
|
|
81
|
+
| On `<html>` | Result |
|
|
82
|
+
|---|---|
|
|
83
|
+
| nothing | light, also on a dark system |
|
|
84
|
+
| `data-theme="light"` | light |
|
|
85
|
+
| `data-theme="dark"` | dark |
|
|
86
|
+
| `data-theme="auto"` | follows the system (`prefers-color-scheme`) |
|
|
87
|
+
| `class="dark"` | dark, the same as `data-theme="dark"` |
|
|
163
88
|
|
|
164
|
-
|
|
89
|
+
Following the system is opt-in:
|
|
165
90
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
// Toggle dark mode
|
|
170
|
-
document.documentElement.classList.toggle('dark');
|
|
91
|
+
```html
|
|
92
|
+
<!-- Follow the phone's setting, with no script -->
|
|
93
|
+
<html data-theme="auto">
|
|
171
94
|
```
|
|
172
95
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
### Custom Dark Mode Colors
|
|
176
|
-
|
|
177
|
-
You can override dark mode colors in your custom theme:
|
|
178
|
-
|
|
179
|
-
```css
|
|
180
|
-
@import "tailwindcss";
|
|
181
|
-
@import 'zabi-components/theme-only';
|
|
182
|
-
@import 'zabi-components/theme-dark-only';
|
|
183
|
-
|
|
184
|
-
@theme {
|
|
185
|
-
/* Your light mode customizations */
|
|
186
|
-
--color-custom: #ff0000;
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
/* Custom dark mode overrides */
|
|
190
|
-
.dark {
|
|
191
|
-
--color-custom: #ff6666; /* Lighter red for dark mode */
|
|
192
|
-
}
|
|
96
|
+
To switch from a script:
|
|
193
97
|
|
|
194
|
-
|
|
98
|
+
```javascript
|
|
99
|
+
document.documentElement.dataset.theme = "dark"; // "light" | "auto"
|
|
100
|
+
// or
|
|
101
|
+
document.documentElement.classList.toggle("dark");
|
|
195
102
|
```
|
|
196
103
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
Zabi Components uses a semantic color system with the following color scales:
|
|
200
|
-
|
|
201
|
-
### Color Scales
|
|
202
|
-
|
|
203
|
-
- **Brand** - Primary brand colors (blue palette)
|
|
204
|
-
- **Citron** - Energetic/yellow colors
|
|
205
|
-
- **Pine** - Success/green colors
|
|
206
|
-
- **Iris** - Info/purple colors
|
|
104
|
+
The details (`color-scheme`, why the attribute goes on `<html>` only, what
|
|
105
|
+
`ThemeToggle` reads) are in [THEMING.md](./THEMING.md#light-dark-and-auto).
|
|
207
106
|
|
|
208
|
-
|
|
107
|
+
## Using the Tokens
|
|
209
108
|
|
|
210
|
-
|
|
109
|
+
Components paint with **roles**: tokens that say what a colour is for and are
|
|
110
|
+
already the right value in each mode. Use the same roles in your own CSS.
|
|
211
111
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
- `--color-
|
|
215
|
-
- `--color-headline` - Headings and titles
|
|
216
|
-
- `--color-body` - Body text
|
|
217
|
-
- `--color-description` - Secondary/description text
|
|
218
|
-
- `--color-caption` - Captions and labels
|
|
112
|
+
- `--color-surface-base` / `-raised` / `-elevated` / `-overlay` - Surface levels: page, cards, nested cards, floating panels
|
|
113
|
+
- `--color-surface-inset` - A recessed area on a card (a well); see THEMING.md, Surface elevation levels
|
|
114
|
+
- `--color-headline`, `--color-body`, `--color-description`, `--color-caption` - Text
|
|
219
115
|
- `--color-border` - Borders and dividers
|
|
220
|
-
- `--color-
|
|
221
|
-
- `--color-
|
|
222
|
-
- `--color-
|
|
223
|
-
- `--color-
|
|
224
|
-
- `--color-
|
|
225
|
-
- `--color-
|
|
226
|
-
- `--color-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
116
|
+
- `--color-action-primary`, `-hover`, `-active` - Primary actions
|
|
117
|
+
- `--color-on-brand` - Text on a primary fill (`--color-action-primary-text` follows it)
|
|
118
|
+
- `--color-accent`, `-hover`, `-active`, `-subtle`, `-border`, `-text` - The second brand colour
|
|
119
|
+
- `--color-on-accent` - Text on a solid accent fill
|
|
120
|
+
- `--color-link`, `--color-focus-ring` - Links and the focus ring
|
|
121
|
+
- `--color-focus-ring-muted` - The neutral ring of ghost and link controls (`.focus-ring--muted`)
|
|
122
|
+
- `--color-focus-ring-danger` - The ring of a destructive control (`.focus-ring--danger`); `--color-error` by default
|
|
123
|
+
- `--color-control-border` (`border-control-border`) - The edge of a control that has nothing else to be seen by, such as the outline of an empty Rating star. `--color-border-strong` is a decorative edge and is under 3:1 on the dark elevated and overlay surfaces
|
|
124
|
+
- `--color-input-border` (`border-input-border`) - The edge of a form field (Input, Textarea, Select, DateField, TimeField). Held to 3:1 on the field fill (`--color-input`), the page and the card in both themes (WCAG 1.4.11); `--color-input-border-hover` is one step darker in light
|
|
125
|
+
- `--color-progress-fill`, `--color-progress-track` (`bg-progress-fill`, `bg-progress-track`) - The fill and the track of Progress. The fill is `--color-action-primary` and the track `--color-input`, so the bar follows a pinned primary action. Held to 3:1 (fill on track) in both themes
|
|
126
|
+
- `--color-success`, `--color-warning`, `--color-error`, `--color-info` - States, each with `-subtle`, `-border` and `-text`
|
|
127
|
+
|
|
128
|
+
The full list is in [THEMING.md](./THEMING.md#roles-read-them-do-not-set-them).
|
|
129
|
+
|
|
130
|
+
### In CSS
|
|
231
131
|
|
|
232
132
|
```css
|
|
233
133
|
.my-element {
|
|
234
|
-
background-color: var(--color-primary);
|
|
235
|
-
color: var(--color-
|
|
134
|
+
background-color: var(--color-action-primary);
|
|
135
|
+
color: var(--color-on-brand);
|
|
236
136
|
}
|
|
237
137
|
```
|
|
238
138
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
Zabi Components provides utility classes:
|
|
139
|
+
### In Tailwind classes
|
|
242
140
|
|
|
243
141
|
```html
|
|
244
|
-
<div class="bg-
|
|
245
|
-
|
|
142
|
+
<div class="bg-card text-headline border border-border">
|
|
143
|
+
A card surface with headline text
|
|
246
144
|
</div>
|
|
247
145
|
```
|
|
248
146
|
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
```css
|
|
252
|
-
.custom-class {
|
|
253
|
-
color: theme(colors.brand.600);
|
|
254
|
-
background: theme(colors.surface.elevated);
|
|
255
|
-
}
|
|
256
|
-
```
|
|
257
|
-
|
|
258
|
-
## Customization Examples
|
|
259
|
-
|
|
260
|
-
### Example 1: Custom Brand Colors
|
|
261
|
-
|
|
262
|
-
```css
|
|
263
|
-
@import "tailwindcss";
|
|
264
|
-
@import 'zabi-components/theme-only';
|
|
147
|
+
## Your Brand
|
|
265
148
|
|
|
149
|
+
Generate one file from your brand colour and import it after the theme. It
|
|
150
|
+
covers light and dark.
|
|
266
151
|
|
|
267
|
-
|
|
152
|
+
```bash
|
|
153
|
+
npx zabi-theme --brand "#C17B00" --neutral "#78716c" --out src/lib/brand.generated.css
|
|
268
154
|
```
|
|
269
155
|
|
|
270
|
-
### Example 2: Custom Fonts
|
|
271
|
-
|
|
272
156
|
```css
|
|
273
157
|
@import "tailwindcss";
|
|
274
|
-
@import
|
|
158
|
+
@import "zabi-components/theme-only";
|
|
159
|
+
@import "zabi-components/theme-dark-only";
|
|
160
|
+
@import "./lib/brand.generated.css";
|
|
275
161
|
|
|
276
|
-
|
|
277
|
-
--font-family-
|
|
278
|
-
--font-family-body: 'Inter', 'Helvetica', sans-serif;
|
|
279
|
-
--font-family-sans: 'Inter', ui-sans-serif, system-ui, sans-serif;
|
|
162
|
+
:root {
|
|
163
|
+
--font-family-heading: "Your Display Font", var(--font-family-sans);
|
|
280
164
|
}
|
|
281
|
-
|
|
282
|
-
@import 'zabi-components/dist/zabi-components.css';
|
|
283
165
|
```
|
|
284
166
|
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
```css
|
|
288
|
-
@import "tailwindcss";
|
|
289
|
-
@import 'zabi-components/theme-only';
|
|
290
|
-
|
|
291
|
-
@theme {
|
|
292
|
-
/* Custom primary color */
|
|
293
|
-
--color-primary: theme(colors.purple.600);
|
|
294
|
-
--color-primary-weak: theme(colors.purple.700);
|
|
295
|
-
--color-primary-medium: theme(colors.purple.800);
|
|
296
|
-
--color-primary-strong: theme(colors.purple.900);
|
|
297
|
-
}
|
|
167
|
+
Which tokens an app may set, what the generator checks and what does not
|
|
168
|
+
follow an override: [THEMING.md](./THEMING.md).
|
|
298
169
|
|
|
299
|
-
|
|
300
|
-
```
|
|
170
|
+
## Adding Your Own Tokens
|
|
301
171
|
|
|
302
|
-
|
|
172
|
+
A token of your own goes in a `@theme` block after the theme import. Tailwind
|
|
173
|
+
then generates utilities for it (`bg-quiz-gold` here), next to the library's.
|
|
303
174
|
|
|
304
175
|
```css
|
|
305
176
|
@import "tailwindcss";
|
|
306
|
-
@import
|
|
177
|
+
@import "zabi-components/theme-only";
|
|
307
178
|
|
|
308
|
-
/* Default theme */
|
|
309
179
|
@theme {
|
|
310
|
-
--color-
|
|
180
|
+
--color-quiz-gold: #d4a017;
|
|
311
181
|
}
|
|
312
|
-
|
|
313
|
-
/* Custom variant */
|
|
314
|
-
.variant-custom {
|
|
315
|
-
--color-primary: theme(colors.purple.600);
|
|
316
|
-
--color-secondary: theme(colors.pink.600);
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
@import 'zabi-components/dist/zabi-components.css';
|
|
320
182
|
```
|
|
321
183
|
|
|
184
|
+
Use a name the library does not use. The library's own tokens are set on
|
|
185
|
+
`:root`, as THEMING.md describes, not redeclared in `@theme`.
|
|
186
|
+
|
|
322
187
|
## Common Pitfalls
|
|
323
188
|
|
|
324
|
-
### Pitfall 1:
|
|
189
|
+
### Pitfall 1: Importing the compiled stylesheet as well
|
|
325
190
|
|
|
326
191
|
**Wrong:**
|
|
327
192
|
```css
|
|
328
|
-
@import
|
|
329
|
-
@import
|
|
193
|
+
@import "tailwindcss";
|
|
194
|
+
@import "zabi-components/theme-only";
|
|
195
|
+
@import "zabi-components/css"; /* a second, finished Tailwind build */
|
|
330
196
|
```
|
|
331
197
|
|
|
332
198
|
**Correct:**
|
|
333
199
|
```css
|
|
334
200
|
@import "tailwindcss";
|
|
335
|
-
@import
|
|
336
|
-
@import 'zabi-components/dist/zabi-components.css';
|
|
201
|
+
@import "zabi-components/theme-only";
|
|
337
202
|
```
|
|
338
203
|
|
|
204
|
+
Two Tailwind builds cannot be sorted into one order, so responsive variants
|
|
205
|
+
lose to plain utilities from the other build. See
|
|
206
|
+
[docs/theme-imports.md](./docs/theme-imports.md), "Tailwind together with the
|
|
207
|
+
compiled stylesheet".
|
|
208
|
+
|
|
339
209
|
### Pitfall 2: Double Tailwind Import
|
|
340
210
|
|
|
341
211
|
**Wrong:**
|
|
342
212
|
```css
|
|
343
213
|
@import "tailwindcss";
|
|
344
|
-
@import
|
|
214
|
+
@import "zabi-components/theme"; /* This also imports Tailwind! */
|
|
345
215
|
```
|
|
346
216
|
|
|
347
217
|
**Correct:**
|
|
348
218
|
```css
|
|
349
219
|
@import "tailwindcss";
|
|
350
|
-
@import
|
|
220
|
+
@import "zabi-components/theme-only"; /* Use theme-only */
|
|
351
221
|
```
|
|
352
222
|
|
|
353
|
-
### Pitfall 3:
|
|
223
|
+
### Pitfall 3: Overrides Before the Theme
|
|
354
224
|
|
|
355
225
|
**Wrong:**
|
|
356
226
|
```css
|
|
357
|
-
@import
|
|
358
|
-
@import
|
|
359
|
-
@theme
|
|
227
|
+
@import "./lib/brand.generated.css"; /* the dark theme below wins where both set a token */
|
|
228
|
+
@import "zabi-components/theme-only";
|
|
229
|
+
@import "zabi-components/theme-dark-only";
|
|
360
230
|
```
|
|
361
231
|
|
|
362
232
|
**Correct:**
|
|
363
233
|
```css
|
|
364
|
-
@import "
|
|
365
|
-
@import
|
|
366
|
-
@
|
|
367
|
-
@import 'zabi-components/dist/zabi-components.css';
|
|
234
|
+
@import "zabi-components/theme-only";
|
|
235
|
+
@import "zabi-components/theme-dark-only";
|
|
236
|
+
@import "./lib/brand.generated.css";
|
|
368
237
|
```
|
|
369
238
|
|
|
370
239
|
### Pitfall 4: Missing Dark Mode Import
|
|
@@ -373,101 +242,49 @@ If you want dark mode support, you must import the dark theme file:
|
|
|
373
242
|
|
|
374
243
|
```css
|
|
375
244
|
@import "tailwindcss";
|
|
376
|
-
@import
|
|
377
|
-
@import
|
|
378
|
-
@import 'zabi-components/dist/zabi-components.css';
|
|
245
|
+
@import "zabi-components/theme-only";
|
|
246
|
+
@import "zabi-components/theme-dark-only"; /* Don't forget this! */
|
|
379
247
|
```
|
|
380
248
|
|
|
381
|
-
### Pitfall 5:
|
|
249
|
+
### Pitfall 5: `theme()` for a Colour
|
|
382
250
|
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
--color-custom: theme(colors.brand.600); /* Works */
|
|
387
|
-
--color-other: theme(colors.custom.500); /* Fails - custom not defined yet */
|
|
388
|
-
}
|
|
389
|
-
```
|
|
251
|
+
Tailwind's `theme()` function is replaced at build time with the token's light
|
|
252
|
+
definition, so `theme(colors.brand.600)` is the light step in dark mode too.
|
|
253
|
+
Use the variable, which is resolved in the browser:
|
|
390
254
|
|
|
391
|
-
**Correct:**
|
|
392
255
|
```css
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
--color-custom-500: #ff0000;
|
|
397
|
-
--color-other: var(--color-custom-500); /* Use var() for custom colors */
|
|
256
|
+
.custom-class {
|
|
257
|
+
color: var(--color-brand-600);
|
|
258
|
+
background: var(--color-surface-elevated);
|
|
398
259
|
}
|
|
399
260
|
```
|
|
400
261
|
|
|
401
262
|
## Troubleshooting
|
|
402
263
|
|
|
403
|
-
###
|
|
264
|
+
### Components Look Unstyled
|
|
404
265
|
|
|
405
|
-
1. Check
|
|
406
|
-
2.
|
|
407
|
-
3.
|
|
408
|
-
4. Check browser console for CSS errors
|
|
266
|
+
1. Check that the theme is imported, after Tailwind
|
|
267
|
+
2. Check the package version: the theme files in 8.0.0 and earlier left components unstyled
|
|
268
|
+
3. Check the browser console for CSS errors
|
|
409
269
|
|
|
410
270
|
### Dark Mode Not Working
|
|
411
271
|
|
|
412
272
|
1. Ensure dark theme file is imported
|
|
413
|
-
2. Check that
|
|
414
|
-
3.
|
|
415
|
-
4. Check that dark
|
|
416
|
-
|
|
417
|
-
### Colors Not Updating
|
|
418
|
-
|
|
419
|
-
1. Clear browser cache
|
|
420
|
-
2. Restart dev server
|
|
421
|
-
3. Check for CSS specificity issues
|
|
422
|
-
4. Verify theme extension is after zabi theme import
|
|
423
|
-
|
|
424
|
-
## Advanced Usage
|
|
273
|
+
2. Check that `class="dark"` or `data-theme="dark"` is on `<html>`, not on an element inside it
|
|
274
|
+
3. To follow the system, set `data-theme="auto"`; nothing follows it by default
|
|
275
|
+
4. Check that the light theme is imported too: the dark file only remaps its tokens
|
|
425
276
|
|
|
426
|
-
###
|
|
277
|
+
### Brand Colours Not Updating
|
|
427
278
|
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
// Switch to light mode
|
|
433
|
-
document.documentElement.classList.remove('dark');
|
|
434
|
-
|
|
435
|
-
// Toggle
|
|
436
|
-
document.documentElement.classList.toggle('dark');
|
|
437
|
-
```
|
|
438
|
-
|
|
439
|
-
### Theme with Svelte
|
|
440
|
-
|
|
441
|
-
```svelte
|
|
442
|
-
<script>
|
|
443
|
-
import { onMount } from 'svelte';
|
|
444
|
-
|
|
445
|
-
let isDark = $state(false);
|
|
446
|
-
|
|
447
|
-
onMount(() => {
|
|
448
|
-
// Check system preference
|
|
449
|
-
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
450
|
-
isDark = prefersDark;
|
|
451
|
-
updateTheme();
|
|
452
|
-
});
|
|
453
|
-
|
|
454
|
-
function updateTheme() {
|
|
455
|
-
if (isDark) {
|
|
456
|
-
document.documentElement.classList.add('dark');
|
|
457
|
-
} else {
|
|
458
|
-
document.documentElement.classList.remove('dark');
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
</script>
|
|
462
|
-
|
|
463
|
-
<button on:click={() => { isDark = !isDark; updateTheme(); }}>
|
|
464
|
-
Toggle Theme
|
|
465
|
-
</button>
|
|
466
|
-
```
|
|
279
|
+
1. Check that the brand file is imported after both theme files
|
|
280
|
+
2. Check that the overrides are on `:root`, not on an element inside the page
|
|
281
|
+
3. Check that it sets `--zabi-brand-*`, not `--color-brand-*`
|
|
282
|
+
4. Restart the dev server
|
|
467
283
|
|
|
468
284
|
## Additional Resources
|
|
469
285
|
|
|
286
|
+
- [THEMING.md](./THEMING.md): the theming guide and token API
|
|
287
|
+
- [docs/theme-imports.md](./docs/theme-imports.md): every CSS export
|
|
470
288
|
- [Tailwind CSS v4 Documentation](https://tailwindcss.com/docs)
|
|
471
289
|
- [CSS Custom Properties](https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties)
|
|
472
|
-
- [Zabi Components GitHub](https://github.com/
|
|
473
|
-
|
|
290
|
+
- [Zabi Components on GitHub](https://github.com/sabnor/zabi-components)
|