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