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
@@ -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
- .dark {
4
- /* Mirror @theme --zabi-base-* ramp (same physical hex; required for standalone dark import) */
5
- --zabi-base-50: #fafafa
6
- --zabi-base-75: #f7f7f7
7
- --zabi-base-100: #f4f4f5
8
- --zabi-base-150: #ececee
9
- --zabi-base-200: #e4e4e7
10
- --zabi-base-250: #dcdcdf
11
- --zabi-base-300: #d4d4d8
12
- --zabi-base-350: #babac1
13
- --zabi-base-400: #a1a1aa
14
- --zabi-base-450: #898992
15
- --zabi-base-500: #71717a
16
- --zabi-base-550: #61616a
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
- /* Mirror @theme --zabi-pine-* ramp (same physical hex; required for standalone dark import) */
75
- --zabi-pine-50: #f0f8f5
76
- --zabi-pine-100: #e2f1eb
77
- --zabi-pine-200: #c5e4d7
78
- --zabi-pine-300: #9fd1bd
79
- --zabi-pine-400: #70ba9e
80
- --zabi-pine-500: #399c7a
81
- --zabi-pine-600: #00805e
82
- --zabi-pine-700: #00674a
83
- --zabi-pine-800: #004f37
84
- --zabi-pine-900: #003826
85
- --zabi-pine-950: #002518
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: #09090b
172
- --color-base-75: #101013
173
- --color-base-100: #18181b
174
- --color-base-150: #1f1f22
175
- --color-base-200: #27272a
176
- --color-base-250: #333338
177
- --color-base-300: #3f3f46
178
- --color-base-350: #484850
179
- --color-base-400: #52525b
180
- --color-base-450: #61616a
181
- --color-base-500: #71717a
182
- --color-base-550: #898992
183
- --color-base-600: #a1a1aa
184
- --color-base-650: #babac1
185
- --color-base-700: #d4d4d8
186
- --color-base-750: #dcdcdf
187
- --color-base-800: #e4e4e7
188
- --color-base-850: #ececee
189
- --color-base-900: #f4f4f5
190
- --color-base-925: #f7f7f7
191
- --color-base-950: #fafafa
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 #fafafa (the same light as the dark hover tint) washed over the page at
199
- * 6.4% / 13.1% / 19.7%, so every level is the one below it with more light on it. Baked to
200
- * opaque hex so the static checks can still resolve them and a modal stays opaque.
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: #18181b
203
- --color-surface-raised: #262629
204
- --color-surface-elevated: #363638
205
- --color-surface-overlay: #454547
206
- --color-surface-overlay-hover: #52525b
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-overlay: var(--color-base-450)
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-base-150)
241
- --color-input-border: var(--color-base-300)
242
- --color-input-hover: var(--color-base-200)
243
- --color-input-focus: var(--color-base-150)
244
- --color-input-disabled: var(--color-base-100)
245
- --color-input-placeholder: var(--color-base-500)
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 - No dark mode overrides needed, base colors are already inverted */
248
- /* Focus Colors - No dark mode overrides needed, brand colors are already inverted */
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
- /* Success Colors — no overrides: @theme uses --color-pine-*; semantic pine resolves to mirrored physical ramp inside .dark */
252
- /* Warning Colors — no overrides: @theme uses --color-warning-* scale; it mirrors in .dark via --zabi-warning-* */
253
- /* Error Colors — no overrides: @theme uses --color-error-* scale; it mirrors in .dark via --zabi-error-* */
254
- /* Energetic Colors — no overrides: @theme uses --color-citron-*; citron mirrors in .dark via --zabi-citron-* */
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 above (semantic --color-brand-* follows mirror) */
264
- /* Text color - the physical dark end of the brand ramp, on the physical
265
- * light end used as the dark-mode primary fill. 7.21:1. */
266
- --color-action-primary-text: var(--zabi-brand-950)
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-opacity: 0.3
287
- --shadow-sm: 0 1px 3px 0 rgb(var(--shadow-color) / var(--shadow-opacity)), 0 1px 2px -1px rgb(var(--shadow-color) / var(--shadow-opacity))
288
- --shadow-md: 0 4px 6px -1px rgb(var(--shadow-color) / var(--shadow-opacity)), 0 2px 4px -2px rgb(var(--shadow-color) / var(--shadow-opacity))
289
- --shadow-lg: 0 10px 15px -3px rgb(var(--shadow-color) / var(--shadow-opacity)), 0 4px 6px -4px rgb(var(--shadow-color) / var(--shadow-opacity))
290
- --shadow-xl: 0 20px 25px -5px rgb(var(--shadow-color) / var(--shadow-opacity)), 0 8px 10px -6px rgb(var(--shadow-color) / var(--shadow-opacity))
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
+ }