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
|
@@ -1,274 +1,276 @@
|
|
|
1
1
|
/* Dark Mode Theme - CSS Custom Properties */
|
|
2
2
|
/* Import this file after the main theme to enable dark mode support */
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
--zabi-base-600: #52525b
|
|
18
|
-
--zabi-base-650: #484850
|
|
19
|
-
--zabi-base-700: #3f3f46
|
|
20
|
-
--zabi-base-750: #333338
|
|
21
|
-
--zabi-base-800: #27272a
|
|
22
|
-
--zabi-base-850: #1f1f22
|
|
23
|
-
--zabi-base-900: #18181b
|
|
24
|
-
--zabi-base-925: #101013
|
|
25
|
-
--zabi-base-950: #09090b
|
|
26
|
-
/* Mirror @theme --zabi-brand-* ramp (same physical hex; required for standalone dark import) */
|
|
27
|
-
--zabi-brand-50: #f4f6ff
|
|
28
|
-
--zabi-brand-100: #e9eeff
|
|
29
|
-
--zabi-brand-200: #d3dcff
|
|
30
|
-
--zabi-brand-300: #b5c6ff
|
|
31
|
-
--zabi-brand-400: #92a9ff
|
|
32
|
-
--zabi-brand-500: #6d87f1
|
|
33
|
-
--zabi-brand-600: #4f68da
|
|
34
|
-
--zabi-brand-700: #3c52ba
|
|
35
|
-
--zabi-brand-800: #2b3e95
|
|
36
|
-
--zabi-brand-900: #1c2c6d
|
|
37
|
-
--zabi-brand-950: #111d49
|
|
3
|
+
[data-theme="light"] {
|
|
4
|
+
color-scheme: light;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
[data-theme="dark"] {
|
|
8
|
+
color-scheme: dark;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
[data-theme="auto"] {
|
|
12
|
+
color-scheme: light dark;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.dark,
|
|
16
|
+
[data-theme="dark"] {
|
|
38
17
|
/* Brand Color Scale — semantic → physical mirror (1000 − step); 500 fixed point */
|
|
39
|
-
--color-brand-50: var(--zabi-brand-950)
|
|
40
|
-
--color-brand-100: var(--zabi-brand-900)
|
|
41
|
-
--color-brand-200: var(--zabi-brand-800)
|
|
42
|
-
--color-brand-300: var(--zabi-brand-700)
|
|
43
|
-
--color-brand-400: var(--zabi-brand-600)
|
|
44
|
-
--color-brand-500: var(--zabi-brand-500)
|
|
45
|
-
--color-brand-600: var(--zabi-brand-400)
|
|
46
|
-
--color-brand-700: var(--zabi-brand-300)
|
|
47
|
-
--color-brand-800: var(--zabi-brand-200)
|
|
48
|
-
--color-brand-900: var(--zabi-brand-100)
|
|
49
|
-
--color-brand-950: var(--zabi-brand-50)
|
|
50
|
-
/* Mirror @theme --zabi-citron-* ramp (same physical hex; required for standalone dark import) */
|
|
51
|
-
--zabi-citron-50: #f6f7ef
|
|
52
|
-
--zabi-citron-100: #edefdf
|
|
53
|
-
--zabi-citron-200: #dcdfbf
|
|
54
|
-
--zabi-citron-300: #c5ca95
|
|
55
|
-
--zabi-citron-400: #aab063
|
|
56
|
-
--zabi-citron-500: #8c9027
|
|
57
|
-
--zabi-citron-600: #707400
|
|
58
|
-
--zabi-citron-700: #5a5d00
|
|
59
|
-
--zabi-citron-800: #454700
|
|
60
|
-
--zabi-citron-900: #313200
|
|
61
|
-
--zabi-citron-950: #202100
|
|
18
|
+
--color-brand-50: var(--zabi-brand-950);
|
|
19
|
+
--color-brand-100: var(--zabi-brand-900);
|
|
20
|
+
--color-brand-200: var(--zabi-brand-800);
|
|
21
|
+
--color-brand-300: var(--zabi-brand-700);
|
|
22
|
+
--color-brand-400: var(--zabi-brand-600);
|
|
23
|
+
--color-brand-500: var(--zabi-brand-500);
|
|
24
|
+
--color-brand-600: var(--zabi-brand-400);
|
|
25
|
+
--color-brand-700: var(--zabi-brand-300);
|
|
26
|
+
--color-brand-800: var(--zabi-brand-200);
|
|
27
|
+
--color-brand-900: var(--zabi-brand-100);
|
|
28
|
+
--color-brand-950: var(--zabi-brand-50);
|
|
62
29
|
/* Citron Color Scale — semantic → physical mirror (1000 − step); 500 fixed point */
|
|
63
|
-
--color-citron-50: var(--zabi-citron-950)
|
|
64
|
-
--color-citron-100: var(--zabi-citron-900)
|
|
65
|
-
--color-citron-200: var(--zabi-citron-800)
|
|
66
|
-
--color-citron-300: var(--zabi-citron-700)
|
|
67
|
-
--color-citron-400: var(--zabi-citron-600)
|
|
68
|
-
--color-citron-500: var(--zabi-citron-500)
|
|
69
|
-
--color-citron-600: var(--zabi-citron-400)
|
|
70
|
-
--color-citron-700: var(--zabi-citron-300)
|
|
71
|
-
--color-citron-800: var(--zabi-citron-200)
|
|
72
|
-
--color-citron-900: var(--zabi-citron-100)
|
|
73
|
-
--color-citron-950: var(--zabi-citron-50)
|
|
74
|
-
/*
|
|
75
|
-
--
|
|
76
|
-
--
|
|
77
|
-
--
|
|
78
|
-
--
|
|
79
|
-
--
|
|
80
|
-
--
|
|
81
|
-
--
|
|
82
|
-
--
|
|
83
|
-
--
|
|
84
|
-
--
|
|
85
|
-
--
|
|
30
|
+
--color-citron-50: var(--zabi-citron-950);
|
|
31
|
+
--color-citron-100: var(--zabi-citron-900);
|
|
32
|
+
--color-citron-200: var(--zabi-citron-800);
|
|
33
|
+
--color-citron-300: var(--zabi-citron-700);
|
|
34
|
+
--color-citron-400: var(--zabi-citron-600);
|
|
35
|
+
--color-citron-500: var(--zabi-citron-500);
|
|
36
|
+
--color-citron-600: var(--zabi-citron-400);
|
|
37
|
+
--color-citron-700: var(--zabi-citron-300);
|
|
38
|
+
--color-citron-800: var(--zabi-citron-200);
|
|
39
|
+
--color-citron-900: var(--zabi-citron-100);
|
|
40
|
+
--color-citron-950: var(--zabi-citron-50);
|
|
41
|
+
/* Accent Color Scale — semantic → physical mirror (1000 − step); 500 fixed point */
|
|
42
|
+
--color-accent-50: var(--zabi-accent-950);
|
|
43
|
+
--color-accent-100: var(--zabi-accent-900);
|
|
44
|
+
--color-accent-200: var(--zabi-accent-800);
|
|
45
|
+
--color-accent-300: var(--zabi-accent-700);
|
|
46
|
+
--color-accent-400: var(--zabi-accent-600);
|
|
47
|
+
--color-accent-500: var(--zabi-accent-500);
|
|
48
|
+
--color-accent-600: var(--zabi-accent-400);
|
|
49
|
+
--color-accent-700: var(--zabi-accent-300);
|
|
50
|
+
--color-accent-800: var(--zabi-accent-200);
|
|
51
|
+
--color-accent-900: var(--zabi-accent-100);
|
|
52
|
+
--color-accent-950: var(--zabi-accent-50);
|
|
86
53
|
/* Pine Color Scale — semantic → physical mirror (1000 − step); 500 fixed point */
|
|
87
|
-
--color-pine-50: var(--zabi-pine-950)
|
|
88
|
-
--color-pine-100: var(--zabi-pine-900)
|
|
89
|
-
--color-pine-200: var(--zabi-pine-800)
|
|
90
|
-
--color-pine-300: var(--zabi-pine-700)
|
|
91
|
-
--color-pine-400: var(--zabi-pine-600)
|
|
92
|
-
--color-pine-500: var(--zabi-pine-500)
|
|
93
|
-
--color-pine-600: var(--zabi-pine-400)
|
|
94
|
-
--color-pine-700: var(--zabi-pine-300)
|
|
95
|
-
--color-pine-800: var(--zabi-pine-200)
|
|
96
|
-
--color-pine-900: var(--zabi-pine-100)
|
|
97
|
-
--color-pine-950: var(--zabi-pine-50)
|
|
98
|
-
/* Mirror @theme --zabi-iris-* ramp (same physical hex; required for standalone dark import) */
|
|
99
|
-
--zabi-iris-50: #f6f6fd
|
|
100
|
-
--zabi-iris-100: #ecedfb
|
|
101
|
-
--zabi-iris-200: #dadbf6
|
|
102
|
-
--zabi-iris-300: #c1c4ef
|
|
103
|
-
--zabi-iris-400: #a5a7e2
|
|
104
|
-
--zabi-iris-500: #8486cd
|
|
105
|
-
--zabi-iris-600: #6969b4
|
|
106
|
-
--zabi-iris-700: #535397
|
|
107
|
-
--zabi-iris-800: #3f3f78
|
|
108
|
-
--zabi-iris-900: #2c2c58
|
|
109
|
-
--zabi-iris-950: #1d1d3a
|
|
54
|
+
--color-pine-50: var(--zabi-pine-950);
|
|
55
|
+
--color-pine-100: var(--zabi-pine-900);
|
|
56
|
+
--color-pine-200: var(--zabi-pine-800);
|
|
57
|
+
--color-pine-300: var(--zabi-pine-700);
|
|
58
|
+
--color-pine-400: var(--zabi-pine-600);
|
|
59
|
+
--color-pine-500: var(--zabi-pine-500);
|
|
60
|
+
--color-pine-600: var(--zabi-pine-400);
|
|
61
|
+
--color-pine-700: var(--zabi-pine-300);
|
|
62
|
+
--color-pine-800: var(--zabi-pine-200);
|
|
63
|
+
--color-pine-900: var(--zabi-pine-100);
|
|
64
|
+
--color-pine-950: var(--zabi-pine-50);
|
|
110
65
|
/* Iris Color Scale — semantic → physical mirror (1000 − step); 500 fixed point */
|
|
111
|
-
--color-iris-50: var(--zabi-iris-950)
|
|
112
|
-
--color-iris-100: var(--zabi-iris-900)
|
|
113
|
-
--color-iris-200: var(--zabi-iris-800)
|
|
114
|
-
--color-iris-300: var(--zabi-iris-700)
|
|
115
|
-
--color-iris-400: var(--zabi-iris-600)
|
|
116
|
-
--color-iris-500: var(--zabi-iris-500)
|
|
117
|
-
--color-iris-600: var(--zabi-iris-400)
|
|
118
|
-
--color-iris-700: var(--zabi-iris-300)
|
|
119
|
-
--color-iris-800: var(--zabi-iris-200)
|
|
120
|
-
--color-iris-900: var(--zabi-iris-100)
|
|
121
|
-
--color-iris-950: var(--zabi-iris-50)
|
|
122
|
-
/* Mirror @theme --zabi-warning-* ramp (same physical hex; required for standalone dark import) */
|
|
123
|
-
--zabi-warning-50: #fbf6ed
|
|
124
|
-
--zabi-warning-100: #f7ecda
|
|
125
|
-
--zabi-warning-200: #f1d9b6
|
|
126
|
-
--zabi-warning-300: #e8bf87
|
|
127
|
-
--zabi-warning-400: #db9e4c
|
|
128
|
-
--zabi-warning-500: #c17b00
|
|
129
|
-
--zabi-warning-600: #9e6000
|
|
130
|
-
--zabi-warning-700: #824c00
|
|
131
|
-
--zabi-warning-800: #663800
|
|
132
|
-
--zabi-warning-900: #4b2600
|
|
133
|
-
--zabi-warning-950: #341800
|
|
66
|
+
--color-iris-50: var(--zabi-iris-950);
|
|
67
|
+
--color-iris-100: var(--zabi-iris-900);
|
|
68
|
+
--color-iris-200: var(--zabi-iris-800);
|
|
69
|
+
--color-iris-300: var(--zabi-iris-700);
|
|
70
|
+
--color-iris-400: var(--zabi-iris-600);
|
|
71
|
+
--color-iris-500: var(--zabi-iris-500);
|
|
72
|
+
--color-iris-600: var(--zabi-iris-400);
|
|
73
|
+
--color-iris-700: var(--zabi-iris-300);
|
|
74
|
+
--color-iris-800: var(--zabi-iris-200);
|
|
75
|
+
--color-iris-900: var(--zabi-iris-100);
|
|
76
|
+
--color-iris-950: var(--zabi-iris-50);
|
|
134
77
|
/* Warning Color Scale — semantic → physical mirror (1000 − step); 500 fixed point */
|
|
135
|
-
--color-warning-50: var(--zabi-warning-950)
|
|
136
|
-
--color-warning-100: var(--zabi-warning-900)
|
|
137
|
-
--color-warning-200: var(--zabi-warning-800)
|
|
138
|
-
--color-warning-300: var(--zabi-warning-700)
|
|
139
|
-
--color-warning-400: var(--zabi-warning-600)
|
|
140
|
-
--color-warning-500: var(--zabi-warning-500)
|
|
141
|
-
--color-warning-600: var(--zabi-warning-400)
|
|
142
|
-
--color-warning-700: var(--zabi-warning-300)
|
|
143
|
-
--color-warning-800: var(--zabi-warning-200)
|
|
144
|
-
--color-warning-900: var(--zabi-warning-100)
|
|
145
|
-
--color-warning-950: var(--zabi-warning-50)
|
|
146
|
-
/* Mirror @theme --zabi-error-* ramp (same physical hex; required for standalone dark import) */
|
|
147
|
-
--zabi-error-50: #fff4f3
|
|
148
|
-
--zabi-error-100: #ffe9e6
|
|
149
|
-
--zabi-error-200: #ffd2cd
|
|
150
|
-
--zabi-error-300: #ffb2ab
|
|
151
|
-
--zabi-error-400: #ff877d
|
|
152
|
-
--zabi-error-500: #ed564e
|
|
153
|
-
--zabi-error-600: #d22828
|
|
154
|
-
--zabi-error-700: #b20912
|
|
155
|
-
--zabi-error-800: #8c0006
|
|
156
|
-
--zabi-error-900: #660002
|
|
157
|
-
--zabi-error-950: #460202
|
|
78
|
+
--color-warning-50: var(--zabi-warning-950);
|
|
79
|
+
--color-warning-100: var(--zabi-warning-900);
|
|
80
|
+
--color-warning-200: var(--zabi-warning-800);
|
|
81
|
+
--color-warning-300: var(--zabi-warning-700);
|
|
82
|
+
--color-warning-400: var(--zabi-warning-600);
|
|
83
|
+
--color-warning-500: var(--zabi-warning-500);
|
|
84
|
+
--color-warning-600: var(--zabi-warning-400);
|
|
85
|
+
--color-warning-700: var(--zabi-warning-300);
|
|
86
|
+
--color-warning-800: var(--zabi-warning-200);
|
|
87
|
+
--color-warning-900: var(--zabi-warning-100);
|
|
88
|
+
--color-warning-950: var(--zabi-warning-50);
|
|
158
89
|
/* Error Color Scale — semantic → physical mirror (1000 − step); 500 fixed point */
|
|
159
|
-
--color-error-50: var(--zabi-error-950)
|
|
160
|
-
--color-error-100: var(--zabi-error-900)
|
|
161
|
-
--color-error-200: var(--zabi-error-800)
|
|
162
|
-
--color-error-300: var(--zabi-error-700)
|
|
163
|
-
--color-error-400: var(--zabi-error-600)
|
|
164
|
-
--color-error-500: var(--zabi-error-500)
|
|
165
|
-
--color-error-600: var(--zabi-error-400)
|
|
166
|
-
--color-error-700: var(--zabi-error-300)
|
|
167
|
-
--color-error-800: var(--zabi-error-200)
|
|
168
|
-
--color-error-900: var(--zabi-error-100)
|
|
169
|
-
--color-error-950: var(--zabi-error-50)
|
|
90
|
+
--color-error-50: var(--zabi-error-950);
|
|
91
|
+
--color-error-100: var(--zabi-error-900);
|
|
92
|
+
--color-error-200: var(--zabi-error-800);
|
|
93
|
+
--color-error-300: var(--zabi-error-700);
|
|
94
|
+
--color-error-400: var(--zabi-error-600);
|
|
95
|
+
--color-error-500: var(--zabi-error-500);
|
|
96
|
+
--color-error-600: var(--zabi-error-400);
|
|
97
|
+
--color-error-700: var(--zabi-error-300);
|
|
98
|
+
--color-error-800: var(--zabi-error-200);
|
|
99
|
+
--color-error-900: var(--zabi-error-100);
|
|
100
|
+
--color-error-950: var(--zabi-error-50);
|
|
170
101
|
/* Base Color Scale — semantic → physical mirror (1000 − step); 500 is fixed point */
|
|
171
|
-
--color-base-50:
|
|
172
|
-
--color-base-75:
|
|
173
|
-
--color-base-100:
|
|
174
|
-
--color-base-150:
|
|
175
|
-
--color-base-200:
|
|
176
|
-
--color-base-250:
|
|
177
|
-
--color-base-300:
|
|
178
|
-
--color-base-350:
|
|
179
|
-
--color-base-400:
|
|
180
|
-
--color-base-450:
|
|
181
|
-
--color-base-500:
|
|
182
|
-
--color-base-550:
|
|
183
|
-
--color-base-600:
|
|
184
|
-
--color-base-650:
|
|
185
|
-
--color-base-700:
|
|
186
|
-
--color-base-750:
|
|
187
|
-
--color-base-800:
|
|
188
|
-
--color-base-850:
|
|
189
|
-
--color-base-900:
|
|
190
|
-
--color-base-925:
|
|
191
|
-
--color-base-950:
|
|
102
|
+
--color-base-50: var(--zabi-base-950);
|
|
103
|
+
--color-base-75: var(--zabi-base-925);
|
|
104
|
+
--color-base-100: var(--zabi-base-900);
|
|
105
|
+
--color-base-150: var(--zabi-base-850);
|
|
106
|
+
--color-base-200: var(--zabi-base-800);
|
|
107
|
+
--color-base-250: var(--zabi-base-750);
|
|
108
|
+
--color-base-300: var(--zabi-base-700);
|
|
109
|
+
--color-base-350: var(--zabi-base-650);
|
|
110
|
+
--color-base-400: var(--zabi-base-600);
|
|
111
|
+
--color-base-450: var(--zabi-base-550);
|
|
112
|
+
--color-base-500: var(--zabi-base-500);
|
|
113
|
+
--color-base-550: var(--zabi-base-450);
|
|
114
|
+
--color-base-600: var(--zabi-base-400);
|
|
115
|
+
--color-base-650: var(--zabi-base-350);
|
|
116
|
+
--color-base-700: var(--zabi-base-300);
|
|
117
|
+
--color-base-750: var(--zabi-base-250);
|
|
118
|
+
--color-base-800: var(--zabi-base-200);
|
|
119
|
+
--color-base-850: var(--zabi-base-150);
|
|
120
|
+
--color-base-900: var(--zabi-base-100);
|
|
121
|
+
--color-base-925: var(--zabi-base-75);
|
|
122
|
+
--color-base-950: var(--zabi-base-50);
|
|
192
123
|
/* Background Colors - No dark mode overrides needed, base colors are already inverted */
|
|
193
124
|
/* Page Colors - No dark mode overrides needed, base colors are already inverted */
|
|
194
125
|
/* Surface elevation — shadows don't read on dark, so each level steps up +6 OKLCH lightness
|
|
195
126
|
* from the page background (L 21 → 27 → 33 → 39).
|
|
196
127
|
*
|
|
197
128
|
* GENERATED by scripts/generate-surfaces.js from tokens/surface-ladder.js — do not hand-edit.
|
|
198
|
-
* Each level is
|
|
199
|
-
* 6.4% / 13.1% / 19.7%, so every level is the one
|
|
200
|
-
*
|
|
129
|
+
* The page is --zabi-base-900. Each level above it is --zabi-base-50 (the same light as the
|
|
130
|
+
* dark hover tint) washed over the page at 6.4% / 13.1% / 19.7%, so every level is the one
|
|
131
|
+
* below it with more light on it, and a --zabi-base-* override carries the whole ladder.
|
|
132
|
+
* Mixing two opaque colours stays opaque, so a modal never lets the page through. With the
|
|
133
|
+
* default greys these resolve to #18181b / #262629 / #363638 / #454547.
|
|
201
134
|
* Enforced by scripts/check-surface-elevation.js (strictly increasing, 5–8 points). */
|
|
202
|
-
--color-surface-base:
|
|
203
|
-
--color-surface-raised:
|
|
204
|
-
--color-surface-elevated:
|
|
205
|
-
--color-surface-overlay:
|
|
206
|
-
--
|
|
135
|
+
--color-surface-base: var(--zabi-base-900);
|
|
136
|
+
--color-surface-raised: color-mix(in srgb, var(--zabi-base-50) 6.4%, var(--zabi-base-900));
|
|
137
|
+
--color-surface-elevated: color-mix(in srgb, var(--zabi-base-50) 13.1%, var(--zabi-base-900));
|
|
138
|
+
--color-surface-overlay: color-mix(in srgb, var(--zabi-base-50) 19.7%, var(--zabi-base-900));
|
|
139
|
+
/* base-400 mirrors to --zabi-base-600 (#52525b), one step lighter than the overlay. */
|
|
140
|
+
--color-surface-overlay-hover: var(--color-base-400);
|
|
141
|
+
/* Inset — the step between the page and the raised surface (L 24). The input
|
|
142
|
+
* field is the library's own inset; see --color-input below. */
|
|
143
|
+
--color-surface-inset: var(--color-base-150);
|
|
207
144
|
/* Distinct from base, raised AND elevated — a neutral chip has no hue to
|
|
208
145
|
* separate it, so it has to separate on lightness wherever it lands. */
|
|
209
|
-
--color-neutral-subtle: var(--color-base-300)
|
|
210
|
-
--color-border
|
|
146
|
+
--color-neutral-subtle: var(--color-base-300);
|
|
147
|
+
--color-neutral-border: var(--color-base-200);
|
|
148
|
+
--color-border-overlay: var(--color-base-450);
|
|
211
149
|
/* Background Colors */
|
|
212
|
-
--color-background: var(--color-surface-base)
|
|
150
|
+
--color-background: var(--color-surface-base);
|
|
151
|
+
--color-background-tertiary: var(--color-base-100);
|
|
152
|
+
/* Page Colors — pinned: light moved the page to base-150, dark stays on base-100 */
|
|
153
|
+
--color-page: var(--color-base-100);
|
|
213
154
|
/* Card Colors — aliases of the surface levels */
|
|
214
|
-
--color-card: var(--color-surface-raised)
|
|
215
|
-
--color-card-hover: var(--color-surface-elevated)
|
|
216
|
-
--color-card-active: var(--color-surface-overlay)
|
|
217
|
-
--color-card-elevated: var(--color-surface-elevated)
|
|
155
|
+
--color-card: var(--color-surface-raised);
|
|
156
|
+
--color-card-hover: var(--color-surface-elevated);
|
|
157
|
+
--color-card-active: var(--color-surface-overlay);
|
|
158
|
+
--color-card-elevated: var(--color-surface-elevated);
|
|
218
159
|
/* Surfaces — numbered aliases of the surface levels */
|
|
219
|
-
--color-surface-1: var(--color-surface-raised)
|
|
220
|
-
--color-surface-2: var(--color-surface-elevated)
|
|
221
|
-
--color-surface-3: var(--color-surface-overlay)
|
|
222
|
-
--color-surface-4: var(--color-base-400)
|
|
160
|
+
--color-surface-1: var(--color-surface-raised);
|
|
161
|
+
--color-surface-2: var(--color-surface-elevated);
|
|
162
|
+
--color-surface-3: var(--color-surface-overlay);
|
|
163
|
+
--color-surface-4: var(--color-base-400);
|
|
223
164
|
/*
|
|
224
165
|
* Secondary text keeps ≥ 4.5:1 on every surface level, including overlays (L39).
|
|
225
166
|
* Only base-650 and lighter pass on the overlay, so caption takes base-650 and description
|
|
226
167
|
* moves one step up to base-700 to stay visibly stronger than caption.
|
|
227
168
|
*/
|
|
228
|
-
--color-description: var(--color-base-700)
|
|
229
|
-
--color-caption: var(--color-base-650)
|
|
169
|
+
--color-description: var(--color-base-700);
|
|
170
|
+
--color-caption: var(--color-base-650);
|
|
230
171
|
/* Interaction fills — light tint on dark, mirroring the light-mode rule.
|
|
231
172
|
* Alpha keeps these one step away from every surface level, which a fixed
|
|
232
173
|
* ramp step cannot guarantee (base-100 in dark IS the page background). */
|
|
233
|
-
--color-surface-hover: rgba(250, 250, 250, 0.08)
|
|
234
|
-
--color-surface-active: rgba(250, 250, 250, 0.14)
|
|
174
|
+
--color-surface-hover: rgba(250, 250, 250, 0.08);
|
|
175
|
+
--color-surface-active: rgba(250, 250, 250, 0.14);
|
|
235
176
|
/* Overlay Colors */
|
|
236
|
-
--color-overlay: rgba(0, 0, 0, 0.7)
|
|
177
|
+
--color-overlay: rgba(0, 0, 0, 0.7);
|
|
237
178
|
/* Input Colors
|
|
238
179
|
* Dark fields are INSET: one step below the raised surface they sit on,
|
|
239
180
|
* which is the dark-mode equivalent of a white field on a grey page. */
|
|
240
|
-
--color-input: var(--color-
|
|
241
|
-
|
|
242
|
-
--color-
|
|
243
|
-
--color-
|
|
244
|
-
|
|
245
|
-
|
|
181
|
+
--color-input: var(--color-surface-inset);
|
|
182
|
+
/* Restated here: the root value of a var() alias is resolved at :root. */
|
|
183
|
+
--color-progress-fill: var(--color-action-primary);
|
|
184
|
+
--color-progress-track: var(--color-input);
|
|
185
|
+
/* base-500 (the mirror's fixed point): 3.40:1 on the dark field, 3.67:1 on
|
|
186
|
+
* the page and 3.12:1 on the card. base-300 was 1.57, 1.70 and 1.44. */
|
|
187
|
+
--color-input-border: var(--color-base-500);
|
|
188
|
+
--color-input-border-hover: var(--color-input-border);
|
|
189
|
+
--color-input-hover: var(--color-base-200);
|
|
190
|
+
/* One step past hover, and one short of the border (base-300), so the
|
|
191
|
+
* pressed field keeps its edge: 1.31:1 against the resting field. */
|
|
192
|
+
--color-input-active: var(--color-base-250);
|
|
193
|
+
--color-input-focus: var(--color-base-150);
|
|
194
|
+
--color-input-disabled: var(--color-base-100);
|
|
195
|
+
/* base-500 is the mirror's fixed point, the same grey as it was in light,
|
|
196
|
+
* and a dark field is a far lighter ground for it than a white one is dark:
|
|
197
|
+
* 3.40:1 at rest, 3.08:1 on hover, 2.60:1 pressed. base-600 mirrors to
|
|
198
|
+
* --zabi-base-400 (#a1a1aa): 6.41, 5.81 and 4.90. base-550 would be 4.74
|
|
199
|
+
* at rest but under 4.5 on hover. The value text is 2.0:1 stronger. */
|
|
200
|
+
--color-input-placeholder: var(--color-base-600);
|
|
246
201
|
/* Text Colors - No dark mode overrides needed, base colors are already inverted */
|
|
247
|
-
/* Border Colors -
|
|
248
|
-
|
|
202
|
+
/* Border Colors - the decorative edges need no override, base colors are
|
|
203
|
+
* already inverted. The control boundary does: base-500 is the mirror's
|
|
204
|
+
* fixed point (#71717a in both themes), and the dark surfaces above the card
|
|
205
|
+
* are too light for it (2.49:1 on elevated, 1.98:1 on the overlay). base-600
|
|
206
|
+
* mirrors to --zabi-base-400 (#a1a1aa): 3.73:1 on the overlay, the lightest
|
|
207
|
+
* surface, and more on every level below it. base-550 is 2.76:1 there. */
|
|
208
|
+
--color-control-border: var(--color-base-600);
|
|
209
|
+
/* Focus Colors — the same steps as light, through the mirror: brand-600 is
|
|
210
|
+
* --zabi-brand-400 here, which is also the dark primary fill, so on a
|
|
211
|
+
* primary button the ring is separated by its offset gap exactly as in light.
|
|
212
|
+
* Dark used to stay one step back, on brand-500, the mirror's fixed point.
|
|
213
|
+
* That is 5.4:1 on the dark page but only 2.91:1 on the overlay, the
|
|
214
|
+
* lightest surface (2.78:1 for an amber brand), and a ring in a modal or a
|
|
215
|
+
* menu needs 3:1 too. Restated rather than left to inherit, so an app's
|
|
216
|
+
* light-only override of --color-focus does not reach dark. */
|
|
217
|
+
--color-focus: var(--color-brand-600);
|
|
218
|
+
--color-focus-weak: var(--color-brand-700);
|
|
219
|
+
--color-focus-medium: var(--color-brand-800);
|
|
220
|
+
--color-focus-strong: var(--color-brand-900);
|
|
221
|
+
/* The muted ring, for the same reason as the control boundary above: one
|
|
222
|
+
* step lighter than the fixed point, 3.73:1 on the overlay. */
|
|
223
|
+
--color-focus-ring-muted: var(--color-base-600);
|
|
249
224
|
/* Primary Colors - No dark mode overrides needed, brand colors are already inverted */
|
|
250
225
|
/* Secondary Colors - No dark mode overrides needed, base colors are already inverted */
|
|
251
|
-
/*
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
226
|
+
/* Tinted fills and edges — pinned at steps 100 and 200.
|
|
227
|
+
* The solid, weak, medium, strong and text steps need no override: they
|
|
228
|
+
* resolve through the mirrored ramps. The tints do, because light moved them
|
|
229
|
+
* to steps 200 and 300 to read on a white card, and the mirror of those is
|
|
230
|
+
* too heavy on a dark surface. */
|
|
231
|
+
--color-success-subtle: var(--color-pine-100);
|
|
232
|
+
--color-success-border: var(--color-pine-200);
|
|
233
|
+
--color-warning-subtle: var(--color-warning-100);
|
|
234
|
+
--color-warning-border: var(--color-warning-200);
|
|
235
|
+
--color-error-subtle: var(--color-error-100);
|
|
236
|
+
--color-error-border: var(--color-error-200);
|
|
237
|
+
--color-energetic-subtle: var(--color-citron-100);
|
|
238
|
+
--color-energetic-border: var(--color-citron-200);
|
|
239
|
+
--color-accent-subtle: var(--color-accent-100);
|
|
240
|
+
--color-accent-border: var(--color-accent-200);
|
|
241
|
+
/* Label on a solid accent fill: the dark end of the ramp on its light end. */
|
|
242
|
+
--color-on-accent: var(--zabi-on-accent-dark);
|
|
243
|
+
--color-info-subtle: var(--color-iris-100);
|
|
244
|
+
--color-info-border: var(--color-iris-200);
|
|
255
245
|
/* Neutral Colors — base-550 mirrors to L* 57, which is only 4.35:1 on a
|
|
256
246
|
* raised surface. One step lighter clears AA on every dark surface level. */
|
|
257
|
-
--color-neutral: var(--color-base-600)
|
|
258
|
-
/* Info Colors — no overrides: @theme uses --color-iris-* (incl. --color-info-active); iris mirrors in .dark via --zabi-iris-* */
|
|
247
|
+
--color-neutral: var(--color-base-600);
|
|
248
|
+
/* Info Colors — no further overrides: @theme uses --color-iris-* (incl. --color-info-active); iris mirrors in .dark via --zabi-iris-* */
|
|
259
249
|
/* ========================================
|
|
260
250
|
ACTION COLORS - Dark Mode Overrides
|
|
261
251
|
======================================== */
|
|
262
252
|
/* Primary Actions - Background adapts automatically via brand color inversion */
|
|
263
|
-
/* 🎯 TO CHANGE bg-action-primary IN DARK MODE: Edit --zabi-brand-* physical ramp
|
|
264
|
-
/*
|
|
265
|
-
* light end used as the dark-mode primary
|
|
266
|
-
--color-action-primary-text
|
|
253
|
+
/* 🎯 TO CHANGE bg-action-primary IN DARK MODE: Edit the --zabi-brand-* physical ramp in @theme (semantic --color-brand-* follows the mirror) */
|
|
254
|
+
/* "On brand" in dark: --zabi-on-brand-dark, by default the physical dark end
|
|
255
|
+
* of the brand ramp on the physical light end used as the dark-mode primary
|
|
256
|
+
* fill (7.21:1). --color-action-primary-text is restated, as it always
|
|
257
|
+
* was here, so that an app's light-only override of it does not carry a
|
|
258
|
+
* white label onto the light dark-mode fill. */
|
|
259
|
+
--color-on-brand: var(--zabi-on-brand-dark);
|
|
260
|
+
--color-action-primary-text: var(--color-on-brand);
|
|
261
|
+
/* Pinned like the other tints: light moved these a step darker. */
|
|
262
|
+
--color-action-primary-subtle: var(--color-brand-100);
|
|
263
|
+
--color-action-primary-subtle-hover: var(--color-brand-200);
|
|
264
|
+
/* Half a step past the dark hover fill, as in light. */
|
|
265
|
+
--color-action-primary-subtle-active: color-mix(in srgb, var(--color-brand-300) 50%, var(--color-brand-200));
|
|
267
266
|
/* Secondary Actions - light alpha tint instead of the light-mode dark tint */
|
|
268
|
-
--color-action-secondary: rgba(250, 250, 250, 0.09)
|
|
269
|
-
--color-action-secondary-hover: rgba(250, 250, 250, 0.15)
|
|
270
|
-
--color-action-secondary-active: rgba(250, 250, 250, 0.21)
|
|
271
|
-
/* Disabled Actions - base-200 in dark is #27272a, still the quietest fill
|
|
267
|
+
--color-action-secondary: rgba(250, 250, 250, 0.09);
|
|
268
|
+
--color-action-secondary-hover: rgba(250, 250, 250, 0.15);
|
|
269
|
+
--color-action-secondary-active: rgba(250, 250, 250, 0.21);
|
|
270
|
+
/* Disabled Actions - base-200 in dark is #27272a, still the quietest fill.
|
|
271
|
+
* Pinned: light moved a step darker to stay visible on its darker page. */
|
|
272
|
+
--color-action-disabled: var(--color-base-200);
|
|
273
|
+
--color-action-disabled-border: var(--color-base-250);
|
|
272
274
|
/* Danger Actions — restated as aliases, not re-pointed.
|
|
273
275
|
* These resolve through the mirrored --color-error-* scale, so dark danger
|
|
274
276
|
* is the same step of the same ramp as light danger. They are repeated here
|
|
@@ -276,16 +278,316 @@
|
|
|
276
278
|
* complete import (validate-theme.js enforces that). The raw hex this
|
|
277
279
|
* replaced pinned dark danger brighter than light, which is why the
|
|
278
280
|
* destructive action was the loudest element on a dark page. */
|
|
279
|
-
--color-action-danger: var(--color-error-600)
|
|
280
|
-
--color-action-danger-hover: var(--color-error-700)
|
|
281
|
-
--color-action-danger-active: var(--color-error-800)
|
|
282
|
-
--color-action-danger-subtle: var(--color-error-100)
|
|
283
|
-
--color-action-danger-subtle-hover: var(--color-error-200)
|
|
284
|
-
--color-action-danger-text: var(--color-error-50)
|
|
285
|
-
/* Shadow Colors */
|
|
286
|
-
--shadow-
|
|
287
|
-
--shadow-
|
|
288
|
-
--shadow-
|
|
289
|
-
--shadow-
|
|
290
|
-
--shadow-
|
|
291
|
-
|
|
281
|
+
--color-action-danger: var(--color-error-600);
|
|
282
|
+
--color-action-danger-hover: var(--color-error-700);
|
|
283
|
+
--color-action-danger-active: var(--color-error-800);
|
|
284
|
+
--color-action-danger-subtle: var(--color-error-100);
|
|
285
|
+
--color-action-danger-subtle-hover: var(--color-error-200);
|
|
286
|
+
--color-action-danger-text: var(--color-error-50);
|
|
287
|
+
/* Shadow Colors — black, not the light theme's ink tint */
|
|
288
|
+
--shadow-color: 0 0 0;
|
|
289
|
+
--shadow-opacity: 0.3;
|
|
290
|
+
--shadow-sm: 0 1px 3px 0 rgb(var(--shadow-color) / var(--shadow-opacity)), 0 1px 2px -1px rgb(var(--shadow-color) / var(--shadow-opacity));
|
|
291
|
+
--shadow-md: 0 4px 6px -1px rgb(var(--shadow-color) / var(--shadow-opacity)), 0 2px 4px -2px rgb(var(--shadow-color) / var(--shadow-opacity));
|
|
292
|
+
--shadow-lg: 0 10px 15px -3px rgb(var(--shadow-color) / var(--shadow-opacity)), 0 4px 6px -4px rgb(var(--shadow-color) / var(--shadow-opacity));
|
|
293
|
+
--shadow-xl: 0 20px 25px -5px rgb(var(--shadow-color) / var(--shadow-opacity)), 0 8px 10px -6px rgb(var(--shadow-color) / var(--shadow-opacity));
|
|
294
|
+
/* Not a token: tells the browser the page is dark, so what it draws itself
|
|
295
|
+
* (date and time pickers, scrollbars, autofill, the caret of a native
|
|
296
|
+
* select) is dark too. It is the last declaration on purpose:
|
|
297
|
+
* scripts/sync-theme-tokens.js rewrites the ramp aliases at the top of this
|
|
298
|
+
* rule. The build publishes this rule under [data-theme="dark"] and, inside
|
|
299
|
+
* the dark media query, [data-theme="auto"], and every one of them carries
|
|
300
|
+
* it. Until 8.1 only the attributes set it and the class did not. */
|
|
301
|
+
color-scheme: dark;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/* The same declarations again, for data-theme="auto" when the system is dark. */
|
|
305
|
+
@media (prefers-color-scheme: dark) {
|
|
306
|
+
[data-theme="auto"] {
|
|
307
|
+
/* Brand Color Scale — semantic → physical mirror (1000 − step); 500 fixed point */
|
|
308
|
+
--color-brand-50: var(--zabi-brand-950);
|
|
309
|
+
--color-brand-100: var(--zabi-brand-900);
|
|
310
|
+
--color-brand-200: var(--zabi-brand-800);
|
|
311
|
+
--color-brand-300: var(--zabi-brand-700);
|
|
312
|
+
--color-brand-400: var(--zabi-brand-600);
|
|
313
|
+
--color-brand-500: var(--zabi-brand-500);
|
|
314
|
+
--color-brand-600: var(--zabi-brand-400);
|
|
315
|
+
--color-brand-700: var(--zabi-brand-300);
|
|
316
|
+
--color-brand-800: var(--zabi-brand-200);
|
|
317
|
+
--color-brand-900: var(--zabi-brand-100);
|
|
318
|
+
--color-brand-950: var(--zabi-brand-50);
|
|
319
|
+
/* Citron Color Scale — semantic → physical mirror (1000 − step); 500 fixed point */
|
|
320
|
+
--color-citron-50: var(--zabi-citron-950);
|
|
321
|
+
--color-citron-100: var(--zabi-citron-900);
|
|
322
|
+
--color-citron-200: var(--zabi-citron-800);
|
|
323
|
+
--color-citron-300: var(--zabi-citron-700);
|
|
324
|
+
--color-citron-400: var(--zabi-citron-600);
|
|
325
|
+
--color-citron-500: var(--zabi-citron-500);
|
|
326
|
+
--color-citron-600: var(--zabi-citron-400);
|
|
327
|
+
--color-citron-700: var(--zabi-citron-300);
|
|
328
|
+
--color-citron-800: var(--zabi-citron-200);
|
|
329
|
+
--color-citron-900: var(--zabi-citron-100);
|
|
330
|
+
--color-citron-950: var(--zabi-citron-50);
|
|
331
|
+
/* Accent Color Scale — semantic → physical mirror (1000 − step); 500 fixed point */
|
|
332
|
+
--color-accent-50: var(--zabi-accent-950);
|
|
333
|
+
--color-accent-100: var(--zabi-accent-900);
|
|
334
|
+
--color-accent-200: var(--zabi-accent-800);
|
|
335
|
+
--color-accent-300: var(--zabi-accent-700);
|
|
336
|
+
--color-accent-400: var(--zabi-accent-600);
|
|
337
|
+
--color-accent-500: var(--zabi-accent-500);
|
|
338
|
+
--color-accent-600: var(--zabi-accent-400);
|
|
339
|
+
--color-accent-700: var(--zabi-accent-300);
|
|
340
|
+
--color-accent-800: var(--zabi-accent-200);
|
|
341
|
+
--color-accent-900: var(--zabi-accent-100);
|
|
342
|
+
--color-accent-950: var(--zabi-accent-50);
|
|
343
|
+
/* Pine Color Scale — semantic → physical mirror (1000 − step); 500 fixed point */
|
|
344
|
+
--color-pine-50: var(--zabi-pine-950);
|
|
345
|
+
--color-pine-100: var(--zabi-pine-900);
|
|
346
|
+
--color-pine-200: var(--zabi-pine-800);
|
|
347
|
+
--color-pine-300: var(--zabi-pine-700);
|
|
348
|
+
--color-pine-400: var(--zabi-pine-600);
|
|
349
|
+
--color-pine-500: var(--zabi-pine-500);
|
|
350
|
+
--color-pine-600: var(--zabi-pine-400);
|
|
351
|
+
--color-pine-700: var(--zabi-pine-300);
|
|
352
|
+
--color-pine-800: var(--zabi-pine-200);
|
|
353
|
+
--color-pine-900: var(--zabi-pine-100);
|
|
354
|
+
--color-pine-950: var(--zabi-pine-50);
|
|
355
|
+
/* Iris Color Scale — semantic → physical mirror (1000 − step); 500 fixed point */
|
|
356
|
+
--color-iris-50: var(--zabi-iris-950);
|
|
357
|
+
--color-iris-100: var(--zabi-iris-900);
|
|
358
|
+
--color-iris-200: var(--zabi-iris-800);
|
|
359
|
+
--color-iris-300: var(--zabi-iris-700);
|
|
360
|
+
--color-iris-400: var(--zabi-iris-600);
|
|
361
|
+
--color-iris-500: var(--zabi-iris-500);
|
|
362
|
+
--color-iris-600: var(--zabi-iris-400);
|
|
363
|
+
--color-iris-700: var(--zabi-iris-300);
|
|
364
|
+
--color-iris-800: var(--zabi-iris-200);
|
|
365
|
+
--color-iris-900: var(--zabi-iris-100);
|
|
366
|
+
--color-iris-950: var(--zabi-iris-50);
|
|
367
|
+
/* Warning Color Scale — semantic → physical mirror (1000 − step); 500 fixed point */
|
|
368
|
+
--color-warning-50: var(--zabi-warning-950);
|
|
369
|
+
--color-warning-100: var(--zabi-warning-900);
|
|
370
|
+
--color-warning-200: var(--zabi-warning-800);
|
|
371
|
+
--color-warning-300: var(--zabi-warning-700);
|
|
372
|
+
--color-warning-400: var(--zabi-warning-600);
|
|
373
|
+
--color-warning-500: var(--zabi-warning-500);
|
|
374
|
+
--color-warning-600: var(--zabi-warning-400);
|
|
375
|
+
--color-warning-700: var(--zabi-warning-300);
|
|
376
|
+
--color-warning-800: var(--zabi-warning-200);
|
|
377
|
+
--color-warning-900: var(--zabi-warning-100);
|
|
378
|
+
--color-warning-950: var(--zabi-warning-50);
|
|
379
|
+
/* Error Color Scale — semantic → physical mirror (1000 − step); 500 fixed point */
|
|
380
|
+
--color-error-50: var(--zabi-error-950);
|
|
381
|
+
--color-error-100: var(--zabi-error-900);
|
|
382
|
+
--color-error-200: var(--zabi-error-800);
|
|
383
|
+
--color-error-300: var(--zabi-error-700);
|
|
384
|
+
--color-error-400: var(--zabi-error-600);
|
|
385
|
+
--color-error-500: var(--zabi-error-500);
|
|
386
|
+
--color-error-600: var(--zabi-error-400);
|
|
387
|
+
--color-error-700: var(--zabi-error-300);
|
|
388
|
+
--color-error-800: var(--zabi-error-200);
|
|
389
|
+
--color-error-900: var(--zabi-error-100);
|
|
390
|
+
--color-error-950: var(--zabi-error-50);
|
|
391
|
+
/* Base Color Scale — semantic → physical mirror (1000 − step); 500 is fixed point */
|
|
392
|
+
--color-base-50: var(--zabi-base-950);
|
|
393
|
+
--color-base-75: var(--zabi-base-925);
|
|
394
|
+
--color-base-100: var(--zabi-base-900);
|
|
395
|
+
--color-base-150: var(--zabi-base-850);
|
|
396
|
+
--color-base-200: var(--zabi-base-800);
|
|
397
|
+
--color-base-250: var(--zabi-base-750);
|
|
398
|
+
--color-base-300: var(--zabi-base-700);
|
|
399
|
+
--color-base-350: var(--zabi-base-650);
|
|
400
|
+
--color-base-400: var(--zabi-base-600);
|
|
401
|
+
--color-base-450: var(--zabi-base-550);
|
|
402
|
+
--color-base-500: var(--zabi-base-500);
|
|
403
|
+
--color-base-550: var(--zabi-base-450);
|
|
404
|
+
--color-base-600: var(--zabi-base-400);
|
|
405
|
+
--color-base-650: var(--zabi-base-350);
|
|
406
|
+
--color-base-700: var(--zabi-base-300);
|
|
407
|
+
--color-base-750: var(--zabi-base-250);
|
|
408
|
+
--color-base-800: var(--zabi-base-200);
|
|
409
|
+
--color-base-850: var(--zabi-base-150);
|
|
410
|
+
--color-base-900: var(--zabi-base-100);
|
|
411
|
+
--color-base-925: var(--zabi-base-75);
|
|
412
|
+
--color-base-950: var(--zabi-base-50);
|
|
413
|
+
/* Background Colors - No dark mode overrides needed, base colors are already inverted */
|
|
414
|
+
/* Page Colors - No dark mode overrides needed, base colors are already inverted */
|
|
415
|
+
/* Surface elevation — shadows don't read on dark, so each level steps up +6 OKLCH lightness
|
|
416
|
+
* from the page background (L 21 → 27 → 33 → 39).
|
|
417
|
+
*
|
|
418
|
+
* GENERATED by scripts/generate-surfaces.js from tokens/surface-ladder.js — do not hand-edit.
|
|
419
|
+
* The page is --zabi-base-900. Each level above it is --zabi-base-50 (the same light as the
|
|
420
|
+
* dark hover tint) washed over the page at 6.4% / 13.1% / 19.7%, so every level is the one
|
|
421
|
+
* below it with more light on it, and a --zabi-base-* override carries the whole ladder.
|
|
422
|
+
* Mixing two opaque colours stays opaque, so a modal never lets the page through. With the
|
|
423
|
+
* default greys these resolve to #18181b / #262629 / #363638 / #454547.
|
|
424
|
+
* Enforced by scripts/check-surface-elevation.js (strictly increasing, 5–8 points). */
|
|
425
|
+
--color-surface-base: var(--zabi-base-900);
|
|
426
|
+
--color-surface-raised: color-mix(in srgb, var(--zabi-base-50) 6.4%, var(--zabi-base-900));
|
|
427
|
+
--color-surface-elevated: color-mix(in srgb, var(--zabi-base-50) 13.1%, var(--zabi-base-900));
|
|
428
|
+
--color-surface-overlay: color-mix(in srgb, var(--zabi-base-50) 19.7%, var(--zabi-base-900));
|
|
429
|
+
/* base-400 mirrors to --zabi-base-600 (#52525b), one step lighter than the overlay. */
|
|
430
|
+
--color-surface-overlay-hover: var(--color-base-400);
|
|
431
|
+
/* Inset — the step between the page and the raised surface (L 24). The input
|
|
432
|
+
* field is the library's own inset; see --color-input below. */
|
|
433
|
+
--color-surface-inset: var(--color-base-150);
|
|
434
|
+
/* Distinct from base, raised AND elevated — a neutral chip has no hue to
|
|
435
|
+
* separate it, so it has to separate on lightness wherever it lands. */
|
|
436
|
+
--color-neutral-subtle: var(--color-base-300);
|
|
437
|
+
--color-neutral-border: var(--color-base-200);
|
|
438
|
+
--color-border-overlay: var(--color-base-450);
|
|
439
|
+
/* Background Colors */
|
|
440
|
+
--color-background: var(--color-surface-base);
|
|
441
|
+
--color-background-tertiary: var(--color-base-100);
|
|
442
|
+
/* Page Colors — pinned: light moved the page to base-150, dark stays on base-100 */
|
|
443
|
+
--color-page: var(--color-base-100);
|
|
444
|
+
/* Card Colors — aliases of the surface levels */
|
|
445
|
+
--color-card: var(--color-surface-raised);
|
|
446
|
+
--color-card-hover: var(--color-surface-elevated);
|
|
447
|
+
--color-card-active: var(--color-surface-overlay);
|
|
448
|
+
--color-card-elevated: var(--color-surface-elevated);
|
|
449
|
+
/* Surfaces — numbered aliases of the surface levels */
|
|
450
|
+
--color-surface-1: var(--color-surface-raised);
|
|
451
|
+
--color-surface-2: var(--color-surface-elevated);
|
|
452
|
+
--color-surface-3: var(--color-surface-overlay);
|
|
453
|
+
--color-surface-4: var(--color-base-400);
|
|
454
|
+
/*
|
|
455
|
+
* Secondary text keeps ≥ 4.5:1 on every surface level, including overlays (L39).
|
|
456
|
+
* Only base-650 and lighter pass on the overlay, so caption takes base-650 and description
|
|
457
|
+
* moves one step up to base-700 to stay visibly stronger than caption.
|
|
458
|
+
*/
|
|
459
|
+
--color-description: var(--color-base-700);
|
|
460
|
+
--color-caption: var(--color-base-650);
|
|
461
|
+
/* Interaction fills — light tint on dark, mirroring the light-mode rule.
|
|
462
|
+
* Alpha keeps these one step away from every surface level, which a fixed
|
|
463
|
+
* ramp step cannot guarantee (base-100 in dark IS the page background). */
|
|
464
|
+
--color-surface-hover: rgba(250, 250, 250, 0.08);
|
|
465
|
+
--color-surface-active: rgba(250, 250, 250, 0.14);
|
|
466
|
+
/* Overlay Colors */
|
|
467
|
+
--color-overlay: rgba(0, 0, 0, 0.7);
|
|
468
|
+
/* Input Colors
|
|
469
|
+
* Dark fields are INSET: one step below the raised surface they sit on,
|
|
470
|
+
* which is the dark-mode equivalent of a white field on a grey page. */
|
|
471
|
+
--color-input: var(--color-surface-inset);
|
|
472
|
+
/* Restated here: the root value of a var() alias is resolved at :root. */
|
|
473
|
+
--color-progress-fill: var(--color-action-primary);
|
|
474
|
+
--color-progress-track: var(--color-input);
|
|
475
|
+
/* base-500 (the mirror's fixed point): 3.40:1 on the dark field, 3.67:1 on
|
|
476
|
+
* the page and 3.12:1 on the card. base-300 was 1.57, 1.70 and 1.44. */
|
|
477
|
+
--color-input-border: var(--color-base-500);
|
|
478
|
+
--color-input-border-hover: var(--color-input-border);
|
|
479
|
+
--color-input-hover: var(--color-base-200);
|
|
480
|
+
/* One step past hover, and one short of the border (base-300), so the
|
|
481
|
+
* pressed field keeps its edge: 1.31:1 against the resting field. */
|
|
482
|
+
--color-input-active: var(--color-base-250);
|
|
483
|
+
--color-input-focus: var(--color-base-150);
|
|
484
|
+
--color-input-disabled: var(--color-base-100);
|
|
485
|
+
/* base-500 is the mirror's fixed point, the same grey as it was in light,
|
|
486
|
+
* and a dark field is a far lighter ground for it than a white one is dark:
|
|
487
|
+
* 3.40:1 at rest, 3.08:1 on hover, 2.60:1 pressed. base-600 mirrors to
|
|
488
|
+
* --zabi-base-400 (#a1a1aa): 6.41, 5.81 and 4.90. base-550 would be 4.74
|
|
489
|
+
* at rest but under 4.5 on hover. The value text is 2.0:1 stronger. */
|
|
490
|
+
--color-input-placeholder: var(--color-base-600);
|
|
491
|
+
/* Text Colors - No dark mode overrides needed, base colors are already inverted */
|
|
492
|
+
/* Border Colors - the decorative edges need no override, base colors are
|
|
493
|
+
* already inverted. The control boundary does: base-500 is the mirror's
|
|
494
|
+
* fixed point (#71717a in both themes), and the dark surfaces above the card
|
|
495
|
+
* are too light for it (2.49:1 on elevated, 1.98:1 on the overlay). base-600
|
|
496
|
+
* mirrors to --zabi-base-400 (#a1a1aa): 3.73:1 on the overlay, the lightest
|
|
497
|
+
* surface, and more on every level below it. base-550 is 2.76:1 there. */
|
|
498
|
+
--color-control-border: var(--color-base-600);
|
|
499
|
+
/* Focus Colors — the same steps as light, through the mirror: brand-600 is
|
|
500
|
+
* --zabi-brand-400 here, which is also the dark primary fill, so on a
|
|
501
|
+
* primary button the ring is separated by its offset gap exactly as in light.
|
|
502
|
+
* Dark used to stay one step back, on brand-500, the mirror's fixed point.
|
|
503
|
+
* That is 5.4:1 on the dark page but only 2.91:1 on the overlay, the
|
|
504
|
+
* lightest surface (2.78:1 for an amber brand), and a ring in a modal or a
|
|
505
|
+
* menu needs 3:1 too. Restated rather than left to inherit, so an app's
|
|
506
|
+
* light-only override of --color-focus does not reach dark. */
|
|
507
|
+
--color-focus: var(--color-brand-600);
|
|
508
|
+
--color-focus-weak: var(--color-brand-700);
|
|
509
|
+
--color-focus-medium: var(--color-brand-800);
|
|
510
|
+
--color-focus-strong: var(--color-brand-900);
|
|
511
|
+
/* The muted ring, for the same reason as the control boundary above: one
|
|
512
|
+
* step lighter than the fixed point, 3.73:1 on the overlay. */
|
|
513
|
+
--color-focus-ring-muted: var(--color-base-600);
|
|
514
|
+
/* Primary Colors - No dark mode overrides needed, brand colors are already inverted */
|
|
515
|
+
/* Secondary Colors - No dark mode overrides needed, base colors are already inverted */
|
|
516
|
+
/* Tinted fills and edges — pinned at steps 100 and 200.
|
|
517
|
+
* The solid, weak, medium, strong and text steps need no override: they
|
|
518
|
+
* resolve through the mirrored ramps. The tints do, because light moved them
|
|
519
|
+
* to steps 200 and 300 to read on a white card, and the mirror of those is
|
|
520
|
+
* too heavy on a dark surface. */
|
|
521
|
+
--color-success-subtle: var(--color-pine-100);
|
|
522
|
+
--color-success-border: var(--color-pine-200);
|
|
523
|
+
--color-warning-subtle: var(--color-warning-100);
|
|
524
|
+
--color-warning-border: var(--color-warning-200);
|
|
525
|
+
--color-error-subtle: var(--color-error-100);
|
|
526
|
+
--color-error-border: var(--color-error-200);
|
|
527
|
+
--color-energetic-subtle: var(--color-citron-100);
|
|
528
|
+
--color-energetic-border: var(--color-citron-200);
|
|
529
|
+
--color-accent-subtle: var(--color-accent-100);
|
|
530
|
+
--color-accent-border: var(--color-accent-200);
|
|
531
|
+
/* Label on a solid accent fill: the dark end of the ramp on its light end. */
|
|
532
|
+
--color-on-accent: var(--zabi-on-accent-dark);
|
|
533
|
+
--color-info-subtle: var(--color-iris-100);
|
|
534
|
+
--color-info-border: var(--color-iris-200);
|
|
535
|
+
/* Neutral Colors — base-550 mirrors to L* 57, which is only 4.35:1 on a
|
|
536
|
+
* raised surface. One step lighter clears AA on every dark surface level. */
|
|
537
|
+
--color-neutral: var(--color-base-600);
|
|
538
|
+
/* Info Colors — no further overrides: @theme uses --color-iris-* (incl. --color-info-active); iris mirrors in .dark via --zabi-iris-* */
|
|
539
|
+
/* ========================================
|
|
540
|
+
ACTION COLORS - Dark Mode Overrides
|
|
541
|
+
======================================== */
|
|
542
|
+
/* Primary Actions - Background adapts automatically via brand color inversion */
|
|
543
|
+
/* 🎯 TO CHANGE bg-action-primary IN DARK MODE: Edit the --zabi-brand-* physical ramp in @theme (semantic --color-brand-* follows the mirror) */
|
|
544
|
+
/* "On brand" in dark: --zabi-on-brand-dark, by default the physical dark end
|
|
545
|
+
* of the brand ramp on the physical light end used as the dark-mode primary
|
|
546
|
+
* fill (7.21:1). --color-action-primary-text is restated, as it always
|
|
547
|
+
* was here, so that an app's light-only override of it does not carry a
|
|
548
|
+
* white label onto the light dark-mode fill. */
|
|
549
|
+
--color-on-brand: var(--zabi-on-brand-dark);
|
|
550
|
+
--color-action-primary-text: var(--color-on-brand);
|
|
551
|
+
/* Pinned like the other tints: light moved these a step darker. */
|
|
552
|
+
--color-action-primary-subtle: var(--color-brand-100);
|
|
553
|
+
--color-action-primary-subtle-hover: var(--color-brand-200);
|
|
554
|
+
/* Half a step past the dark hover fill, as in light. */
|
|
555
|
+
--color-action-primary-subtle-active: color-mix(in srgb, var(--color-brand-300) 50%, var(--color-brand-200));
|
|
556
|
+
/* Secondary Actions - light alpha tint instead of the light-mode dark tint */
|
|
557
|
+
--color-action-secondary: rgba(250, 250, 250, 0.09);
|
|
558
|
+
--color-action-secondary-hover: rgba(250, 250, 250, 0.15);
|
|
559
|
+
--color-action-secondary-active: rgba(250, 250, 250, 0.21);
|
|
560
|
+
/* Disabled Actions - base-200 in dark is #27272a, still the quietest fill.
|
|
561
|
+
* Pinned: light moved a step darker to stay visible on its darker page. */
|
|
562
|
+
--color-action-disabled: var(--color-base-200);
|
|
563
|
+
--color-action-disabled-border: var(--color-base-250);
|
|
564
|
+
/* Danger Actions — restated as aliases, not re-pointed.
|
|
565
|
+
* These resolve through the mirrored --color-error-* scale, so dark danger
|
|
566
|
+
* is the same step of the same ramp as light danger. They are repeated here
|
|
567
|
+
* only because `zabi-components/theme-dark-only` has to stand alone as a
|
|
568
|
+
* complete import (validate-theme.js enforces that). The raw hex this
|
|
569
|
+
* replaced pinned dark danger brighter than light, which is why the
|
|
570
|
+
* destructive action was the loudest element on a dark page. */
|
|
571
|
+
--color-action-danger: var(--color-error-600);
|
|
572
|
+
--color-action-danger-hover: var(--color-error-700);
|
|
573
|
+
--color-action-danger-active: var(--color-error-800);
|
|
574
|
+
--color-action-danger-subtle: var(--color-error-100);
|
|
575
|
+
--color-action-danger-subtle-hover: var(--color-error-200);
|
|
576
|
+
--color-action-danger-text: var(--color-error-50);
|
|
577
|
+
/* Shadow Colors — black, not the light theme's ink tint */
|
|
578
|
+
--shadow-color: 0 0 0;
|
|
579
|
+
--shadow-opacity: 0.3;
|
|
580
|
+
--shadow-sm: 0 1px 3px 0 rgb(var(--shadow-color) / var(--shadow-opacity)), 0 1px 2px -1px rgb(var(--shadow-color) / var(--shadow-opacity));
|
|
581
|
+
--shadow-md: 0 4px 6px -1px rgb(var(--shadow-color) / var(--shadow-opacity)), 0 2px 4px -2px rgb(var(--shadow-color) / var(--shadow-opacity));
|
|
582
|
+
--shadow-lg: 0 10px 15px -3px rgb(var(--shadow-color) / var(--shadow-opacity)), 0 4px 6px -4px rgb(var(--shadow-color) / var(--shadow-opacity));
|
|
583
|
+
--shadow-xl: 0 20px 25px -5px rgb(var(--shadow-color) / var(--shadow-opacity)), 0 8px 10px -6px rgb(var(--shadow-color) / var(--shadow-opacity));
|
|
584
|
+
/* Not a token: tells the browser the page is dark, so what it draws itself
|
|
585
|
+
* (date and time pickers, scrollbars, autofill, the caret of a native
|
|
586
|
+
* select) is dark too. It is the last declaration on purpose:
|
|
587
|
+
* scripts/sync-theme-tokens.js rewrites the ramp aliases at the top of this
|
|
588
|
+
* rule. The build publishes this rule under [data-theme="dark"] and, inside
|
|
589
|
+
* the dark media query, [data-theme="auto"], and every one of them carries
|
|
590
|
+
* it. Until 8.1 only the attributes set it and the class did not. */
|
|
591
|
+
color-scheme: dark;
|
|
592
|
+
}
|
|
593
|
+
}
|