zabi-components 7.0.2 → 8.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (433) hide show
  1. package/CHANGELOG.md +1924 -0
  2. package/README.md +287 -11
  3. package/THEME.md +149 -332
  4. package/THEMING.md +1329 -163
  5. package/dist/atoms/ActionPanel.svelte +24 -9
  6. package/dist/atoms/ActionPanel.svelte.d.ts +2 -0
  7. package/dist/atoms/Avatar.svelte +104 -0
  8. package/dist/atoms/Avatar.svelte.d.ts +34 -0
  9. package/dist/atoms/Badge.svelte +124 -58
  10. package/dist/atoms/Badge.svelte.d.ts +17 -5
  11. package/dist/atoms/Button.svelte +212 -62
  12. package/dist/atoms/Button.svelte.d.ts +33 -2
  13. package/dist/atoms/Card.svelte +31 -28
  14. package/dist/atoms/Card.svelte.d.ts +5 -2
  15. package/dist/atoms/CardContent.svelte +10 -2
  16. package/dist/atoms/CardContent.svelte.d.ts +2 -0
  17. package/dist/atoms/CardFooter.svelte +10 -2
  18. package/dist/atoms/CardFooter.svelte.d.ts +2 -0
  19. package/dist/atoms/CardHeader.svelte +26 -6
  20. package/dist/atoms/CardHeader.svelte.d.ts +2 -0
  21. package/dist/atoms/Checkbox.svelte +52 -21
  22. package/dist/atoms/Checkbox.svelte.d.ts +6 -2
  23. package/dist/atoms/CodeBlock.svelte +35 -9
  24. package/dist/atoms/CodeBlock.svelte.d.ts +13 -3
  25. package/dist/atoms/ColorPicker.svelte +272 -52
  26. package/dist/atoms/ColorPicker.svelte.d.ts +6 -1
  27. package/dist/atoms/Container.svelte +17 -10
  28. package/dist/atoms/DateField.svelte +107 -0
  29. package/dist/atoms/DateField.svelte.d.ts +53 -0
  30. package/dist/atoms/Divider.svelte +4 -4
  31. package/dist/atoms/FeatureCard.svelte +4 -3
  32. package/dist/atoms/FieldMessages.svelte +69 -0
  33. package/dist/atoms/FieldMessages.svelte.d.ts +23 -0
  34. package/dist/atoms/FloatingActionButton.svelte +174 -0
  35. package/dist/atoms/FloatingActionButton.svelte.d.ts +51 -0
  36. package/dist/atoms/Heading.svelte +93 -32
  37. package/dist/atoms/Heading.svelte.d.ts +24 -4
  38. package/dist/atoms/IconButton.svelte +242 -53
  39. package/dist/atoms/IconButton.svelte.d.ts +49 -4
  40. package/dist/atoms/Input.svelte +267 -74
  41. package/dist/atoms/Input.svelte.d.ts +32 -2
  42. package/dist/atoms/List.svelte +13 -2
  43. package/dist/atoms/List.svelte.d.ts +2 -0
  44. package/dist/atoms/ListItem.svelte +44 -11
  45. package/dist/atoms/ListItem.svelte.d.ts +5 -0
  46. package/dist/atoms/ListItemLeading.svelte +4 -2
  47. package/dist/atoms/ListItemLeading.svelte.d.ts +1 -1
  48. package/dist/atoms/OptimizedImage.svelte +11 -2
  49. package/dist/atoms/OptimizedImage.svelte.d.ts +2 -0
  50. package/dist/atoms/Progress.svelte +31 -9
  51. package/dist/atoms/Progress.svelte.d.ts +6 -0
  52. package/dist/atoms/Radio.svelte +23 -3
  53. package/dist/atoms/Radio.svelte.d.ts +6 -2
  54. package/dist/atoms/Rating.svelte +494 -0
  55. package/dist/atoms/Rating.svelte.d.ts +56 -0
  56. package/dist/atoms/Select.svelte +475 -135
  57. package/dist/atoms/Select.svelte.d.ts +52 -2
  58. package/dist/atoms/SelectionControl.svelte +99 -18
  59. package/dist/atoms/SelectionControl.svelte.d.ts +6 -3
  60. package/dist/atoms/Skeleton.svelte +5 -3
  61. package/dist/atoms/Slider.svelte +309 -0
  62. package/dist/atoms/Slider.svelte.d.ts +40 -0
  63. package/dist/atoms/Spinner.svelte +57 -0
  64. package/dist/atoms/Spinner.svelte.d.ts +19 -0
  65. package/dist/atoms/Table.svelte +152 -6
  66. package/dist/atoms/Table.svelte.d.ts +15 -3
  67. package/dist/atoms/TemporalField.svelte +140 -0
  68. package/dist/atoms/TemporalField.svelte.d.ts +32 -0
  69. package/dist/atoms/Text.svelte +56 -15
  70. package/dist/atoms/Text.svelte.d.ts +13 -4
  71. package/dist/atoms/Textarea.svelte +57 -45
  72. package/dist/atoms/Textarea.svelte.d.ts +14 -2
  73. package/dist/atoms/ThemeToggle.svelte +238 -56
  74. package/dist/atoms/ThemeToggle.svelte.d.ts +28 -3
  75. package/dist/atoms/TimeField.svelte +108 -0
  76. package/dist/atoms/TimeField.svelte.d.ts +54 -0
  77. package/dist/atoms/Toast.svelte +25 -10
  78. package/dist/atoms/Toast.svelte.d.ts +2 -0
  79. package/dist/atoms/Toggle.svelte +60 -19
  80. package/dist/atoms/Toggle.svelte.d.ts +18 -2
  81. package/dist/atoms/Tooltip.svelte +583 -40
  82. package/dist/atoms/Tooltip.svelte.d.ts +26 -0
  83. package/dist/atoms/ZabiStringsProvider.svelte +45 -0
  84. package/dist/atoms/ZabiStringsProvider.svelte.d.ts +27 -0
  85. package/dist/atoms/index.d.ts +17 -0
  86. package/dist/atoms/index.js +12 -0
  87. package/dist/atoms/selection-control.styles.d.ts +36 -5
  88. package/dist/atoms/selection-control.styles.js +40 -9
  89. package/dist/components/atoms/index.d.ts +17 -0
  90. package/dist/components/atoms/index.d.ts.map +1 -1
  91. package/dist/components/atoms/selection-control.styles.d.ts +36 -5
  92. package/dist/components/atoms/selection-control.styles.d.ts.map +1 -1
  93. package/dist/components/index.d.ts +83 -3
  94. package/dist/components/index.d.ts.map +1 -1
  95. package/dist/components/molecules/index.d.ts +46 -0
  96. package/dist/components/molecules/index.d.ts.map +1 -1
  97. package/dist/components/molecules/toast-store.d.ts +53 -7
  98. package/dist/components/molecules/toast-store.d.ts.map +1 -1
  99. package/dist/components/organisms/index.d.ts +6 -0
  100. package/dist/components/organisms/index.d.ts.map +1 -1
  101. package/dist/components/types/variants.d.ts +15 -1
  102. package/dist/components/types/variants.d.ts.map +1 -1
  103. package/dist/components/util/app-shell.d.ts +28 -0
  104. package/dist/components/util/app-shell.d.ts.map +1 -0
  105. package/dist/components/util/avatar.d.ts +36 -0
  106. package/dist/components/util/avatar.d.ts.map +1 -0
  107. package/dist/components/util/bottom-sheet.d.ts +30 -0
  108. package/dist/components/util/bottom-sheet.d.ts.map +1 -0
  109. package/dist/components/util/bottom-tab-bar.d.ts +35 -0
  110. package/dist/components/util/bottom-tab-bar.d.ts.map +1 -0
  111. package/dist/components/util/calendar.d.ts +56 -0
  112. package/dist/components/util/calendar.d.ts.map +1 -0
  113. package/dist/components/util/cn.d.ts +8 -0
  114. package/dist/components/util/cn.d.ts.map +1 -0
  115. package/dist/components/util/collapsible.d.ts +58 -0
  116. package/dist/components/util/collapsible.d.ts.map +1 -0
  117. package/dist/components/util/confirm-dialog.d.ts +12 -0
  118. package/dist/components/util/confirm-dialog.d.ts.map +1 -0
  119. package/dist/components/util/date.d.ts +96 -0
  120. package/dist/components/util/date.d.ts.map +1 -0
  121. package/dist/components/util/drawer.d.ts +13 -0
  122. package/dist/components/util/drawer.d.ts.map +1 -0
  123. package/dist/components/util/dropdown.d.ts +47 -0
  124. package/dist/components/util/dropdown.d.ts.map +1 -0
  125. package/dist/components/util/field.d.ts +39 -0
  126. package/dist/components/util/field.d.ts.map +1 -0
  127. package/dist/components/util/fit-in-viewport.d.ts +201 -0
  128. package/dist/components/util/fit-in-viewport.d.ts.map +1 -0
  129. package/dist/components/util/focus-utils.d.ts +75 -2
  130. package/dist/components/util/focus-utils.d.ts.map +1 -1
  131. package/dist/components/util/hydration.d.ts +45 -0
  132. package/dist/components/util/hydration.d.ts.map +1 -0
  133. package/dist/components/util/keyboard-inset.d.ts +18 -0
  134. package/dist/components/util/keyboard-inset.d.ts.map +1 -0
  135. package/dist/components/util/media-grid.d.ts +51 -0
  136. package/dist/components/util/media-grid.d.ts.map +1 -0
  137. package/dist/components/util/media.d.ts +6 -0
  138. package/dist/components/util/media.d.ts.map +1 -0
  139. package/dist/components/util/overlay-chrome.d.ts +53 -0
  140. package/dist/components/util/overlay-chrome.d.ts.map +1 -0
  141. package/dist/components/util/overlay.d.ts +72 -0
  142. package/dist/components/util/overlay.d.ts.map +1 -0
  143. package/dist/components/util/photo.d.ts +215 -0
  144. package/dist/components/util/photo.d.ts.map +1 -0
  145. package/dist/components/util/portal.d.ts +23 -0
  146. package/dist/components/util/portal.d.ts.map +1 -0
  147. package/dist/components/util/pull-to-refresh.d.ts +27 -0
  148. package/dist/components/util/pull-to-refresh.d.ts.map +1 -0
  149. package/dist/components/util/radio-keys.d.ts +25 -0
  150. package/dist/components/util/radio-keys.d.ts.map +1 -0
  151. package/dist/components/util/rating.d.ts +23 -0
  152. package/dist/components/util/rating.d.ts.map +1 -0
  153. package/dist/components/util/ready-made-strings.d.ts +77 -0
  154. package/dist/components/util/ready-made-strings.d.ts.map +1 -0
  155. package/dist/components/util/scroll-padding.d.ts +20 -0
  156. package/dist/components/util/scroll-padding.d.ts.map +1 -0
  157. package/dist/components/util/segmented-control.d.ts +16 -0
  158. package/dist/components/util/segmented-control.d.ts.map +1 -0
  159. package/dist/components/util/select.d.ts +41 -0
  160. package/dist/components/util/select.d.ts.map +1 -0
  161. package/dist/components/util/sheet-drag.d.ts +60 -0
  162. package/dist/components/util/sheet-drag.d.ts.map +1 -0
  163. package/dist/components/util/sidebar.d.ts +63 -0
  164. package/dist/components/util/sidebar.d.ts.map +1 -0
  165. package/dist/components/util/sortable-list.d.ts +65 -0
  166. package/dist/components/util/sortable-list.d.ts.map +1 -0
  167. package/dist/components/util/ssr-safe.d.ts +4 -4
  168. package/dist/components/util/ssr-safe.d.ts.map +1 -1
  169. package/dist/components/util/stepper.d.ts +40 -0
  170. package/dist/components/util/stepper.d.ts.map +1 -0
  171. package/dist/components/util/swipeable-list-item.d.ts +36 -0
  172. package/dist/components/util/swipeable-list-item.d.ts.map +1 -0
  173. package/dist/components/util/theme-mode.d.ts +80 -0
  174. package/dist/components/util/theme-mode.d.ts.map +1 -0
  175. package/dist/components/util/toaster.d.ts +93 -0
  176. package/dist/components/util/toaster.d.ts.map +1 -0
  177. package/dist/components/util/tooltip.d.ts +10 -0
  178. package/dist/components/util/tooltip.d.ts.map +1 -0
  179. package/dist/components/util/top-navbar.d.ts +11 -0
  180. package/dist/components/util/top-navbar.d.ts.map +1 -0
  181. package/dist/components/util/touch-target.d.ts +31 -0
  182. package/dist/components/util/touch-target.d.ts.map +1 -0
  183. package/dist/components/util/zabi-strings.d.ts +133 -0
  184. package/dist/components/util/zabi-strings.d.ts.map +1 -0
  185. package/dist/create-theme/cli.js +169 -0
  186. package/dist/create-theme/index.d.ts +176 -0
  187. package/dist/create-theme/index.js +817 -0
  188. package/dist/create-theme/lib/ramp-math.js +128 -0
  189. package/dist/create-theme/lib/resolve.js +141 -0
  190. package/dist/create-theme/theme-data.js +1116 -0
  191. package/dist/index.d.ts +83 -3
  192. package/dist/index.js +60 -8
  193. package/dist/molecules/Alert.svelte +73 -66
  194. package/dist/molecules/Alert.svelte.d.ts +9 -1
  195. package/dist/molecules/AppBar.svelte +415 -0
  196. package/dist/molecules/AppBar.svelte.d.ts +69 -0
  197. package/dist/molecules/AvatarGroup.svelte +116 -0
  198. package/dist/molecules/AvatarGroup.svelte.d.ts +40 -0
  199. package/dist/molecules/BottomSheet.svelte +540 -0
  200. package/dist/molecules/BottomSheet.svelte.d.ts +93 -0
  201. package/dist/molecules/BottomTabBar.svelte +297 -0
  202. package/dist/molecules/BottomTabBar.svelte.d.ts +64 -0
  203. package/dist/molecules/Calendar.svelte +597 -0
  204. package/dist/molecules/Calendar.svelte.d.ts +72 -0
  205. package/dist/molecules/Collapsible.svelte +243 -0
  206. package/dist/molecules/Collapsible.svelte.d.ts +44 -0
  207. package/dist/molecules/CollapsibleGroup.svelte +126 -0
  208. package/dist/molecules/CollapsibleGroup.svelte.d.ts +14 -0
  209. package/dist/molecules/ComponentDemo.svelte +25 -5
  210. package/dist/molecules/ComponentDemo.svelte.d.ts +5 -0
  211. package/dist/molecules/ConfirmDialog.svelte +253 -0
  212. package/dist/molecules/ConfirmDialog.svelte.d.ts +55 -0
  213. package/dist/molecules/ContactForm.svelte +46 -19
  214. package/dist/molecules/ContactForm.svelte.d.ts +10 -0
  215. package/dist/molecules/Drawer.svelte +394 -0
  216. package/dist/molecules/Drawer.svelte.d.ts +55 -0
  217. package/dist/molecules/Dropdown.svelte +540 -50
  218. package/dist/molecules/Dropdown.svelte.d.ts +49 -6
  219. package/dist/molecules/DropdownItem.svelte +122 -0
  220. package/dist/molecules/DropdownItem.svelte.d.ts +28 -0
  221. package/dist/molecules/EmptyState.svelte +56 -10
  222. package/dist/molecules/EmptyState.svelte.d.ts +8 -0
  223. package/dist/molecules/Form.svelte +25 -14
  224. package/dist/molecules/Form.svelte.d.ts +13 -5
  225. package/dist/molecules/FormField.svelte +11 -2
  226. package/dist/molecules/FormField.svelte.d.ts +2 -0
  227. package/dist/molecules/Header.svelte +13 -3
  228. package/dist/molecules/Header.svelte.d.ts +2 -0
  229. package/dist/molecules/ImageUpload.svelte +422 -70
  230. package/dist/molecules/ImageUpload.svelte.d.ts +61 -5
  231. package/dist/molecules/MediaGrid.svelte +527 -0
  232. package/dist/molecules/MediaGrid.svelte.d.ts +77 -0
  233. package/dist/molecules/Modal.svelte +340 -45
  234. package/dist/molecules/Modal.svelte.d.ts +59 -7
  235. package/dist/molecules/NavigationMenu.svelte +15 -3
  236. package/dist/molecules/NavigationMenu.svelte.d.ts +4 -0
  237. package/dist/molecules/NavigationMenuContent.svelte +91 -36
  238. package/dist/molecules/NavigationMenuContent.svelte.d.ts +2 -0
  239. package/dist/molecules/NavigationMenuItem.svelte +10 -3
  240. package/dist/molecules/NavigationMenuItem.svelte.d.ts +2 -0
  241. package/dist/molecules/NavigationMenuLink.svelte +10 -2
  242. package/dist/molecules/NavigationMenuLink.svelte.d.ts +2 -0
  243. package/dist/molecules/NavigationMenuList.svelte +19 -4
  244. package/dist/molecules/NavigationMenuList.svelte.d.ts +2 -0
  245. package/dist/molecules/NavigationMenuTrigger.svelte +16 -3
  246. package/dist/molecules/NavigationMenuTrigger.svelte.d.ts +2 -0
  247. package/dist/molecules/Page.svelte +38 -2
  248. package/dist/molecules/Page.svelte.d.ts +13 -0
  249. package/dist/molecules/PhotoGrid.svelte +433 -0
  250. package/dist/molecules/PhotoGrid.svelte.d.ts +62 -0
  251. package/dist/molecules/PhotoViewer.svelte +1116 -0
  252. package/dist/molecules/PhotoViewer.svelte.d.ts +56 -0
  253. package/dist/molecules/PropsTable.svelte +26 -11
  254. package/dist/molecules/PropsTable.svelte.d.ts +5 -0
  255. package/dist/molecules/PullToRefresh.svelte +263 -0
  256. package/dist/molecules/PullToRefresh.svelte.d.ts +52 -0
  257. package/dist/molecules/RadioGroup.svelte +57 -15
  258. package/dist/molecules/RadioGroup.svelte.d.ts +16 -3
  259. package/dist/molecules/Section.svelte +13 -5
  260. package/dist/molecules/Section.svelte.d.ts +3 -1
  261. package/dist/molecules/SegmentedControl.svelte +323 -0
  262. package/dist/molecules/SegmentedControl.svelte.d.ts +34 -0
  263. package/dist/molecules/SidebarBrandHeader.svelte +24 -5
  264. package/dist/molecules/SidebarBrandHeader.svelte.d.ts +5 -0
  265. package/dist/molecules/SidebarFooter.svelte +39 -8
  266. package/dist/molecules/SidebarFooter.svelte.d.ts +5 -0
  267. package/dist/molecules/SidebarNavSection.svelte +12 -4
  268. package/dist/molecules/SidebarNavSection.svelte.d.ts +2 -0
  269. package/dist/molecules/SlideUp.svelte +253 -30
  270. package/dist/molecules/SlideUp.svelte.d.ts +31 -4
  271. package/dist/molecules/SortableList.svelte +632 -0
  272. package/dist/molecules/SortableList.svelte.d.ts +69 -0
  273. package/dist/molecules/Stepper.svelte +548 -0
  274. package/dist/molecules/Stepper.svelte.d.ts +39 -0
  275. package/dist/molecules/StickyActionBar.svelte +191 -0
  276. package/dist/molecules/StickyActionBar.svelte.d.ts +65 -0
  277. package/dist/molecules/SwipeableListItem.svelte +334 -0
  278. package/dist/molecules/SwipeableListItem.svelte.d.ts +54 -0
  279. package/dist/molecules/Tabs.svelte +254 -24
  280. package/dist/molecules/Tabs.svelte.d.ts +15 -4
  281. package/dist/molecules/Toaster.svelte +352 -6
  282. package/dist/molecules/Toaster.svelte.d.ts +95 -2
  283. package/dist/molecules/ToasterToast.svelte +279 -62
  284. package/dist/molecules/ToasterToast.svelte.d.ts +11 -0
  285. package/dist/molecules/UnsavedChangesBar.svelte +212 -0
  286. package/dist/molecules/UnsavedChangesBar.svelte.d.ts +43 -0
  287. package/dist/molecules/index.d.ts +46 -0
  288. package/dist/molecules/index.js +27 -0
  289. package/dist/molecules/toast-store.d.ts +53 -7
  290. package/dist/molecules/toast-store.js +21 -0
  291. package/dist/organisms/AppShell.svelte +196 -0
  292. package/dist/organisms/AppShell.svelte.d.ts +61 -0
  293. package/dist/organisms/SidebarAccountPanel.svelte +111 -12
  294. package/dist/organisms/SidebarAccountPanel.svelte.d.ts +21 -0
  295. package/dist/organisms/SidebarNavigation.svelte +193 -69
  296. package/dist/organisms/SidebarNavigation.svelte.d.ts +31 -1
  297. package/dist/organisms/SidebarPanel.svelte +45 -16
  298. package/dist/organisms/SidebarPanel.svelte.d.ts +2 -0
  299. package/dist/organisms/SidebarShell.svelte +263 -0
  300. package/dist/organisms/SidebarShell.svelte.d.ts +106 -0
  301. package/dist/organisms/TopNavbar.svelte +329 -33
  302. package/dist/organisms/TopNavbar.svelte.d.ts +28 -0
  303. package/dist/organisms/index.d.ts +6 -0
  304. package/dist/organisms/index.js +4 -0
  305. package/dist/routes/lib/variant-utils.d.ts +26 -0
  306. package/dist/routes/lib/{variant-utils.ts → variant-utils.js} +15 -46
  307. package/dist/types/components.d.ts +4 -0
  308. package/dist/types/components.d.ts.map +1 -1
  309. package/dist/types/events.js +1 -0
  310. package/dist/types/index.d.ts +605 -25
  311. package/dist/types/index.d.ts.map +1 -1
  312. package/dist/types/index.js +3 -0
  313. package/dist/types/variants.ts +17 -1
  314. package/dist/util/app-shell.d.ts +27 -0
  315. package/dist/util/app-shell.js +72 -0
  316. package/dist/util/avatar.d.ts +35 -0
  317. package/dist/util/avatar.js +52 -0
  318. package/dist/util/bottom-sheet.d.ts +29 -0
  319. package/dist/util/bottom-sheet.js +43 -0
  320. package/dist/util/bottom-tab-bar.d.ts +34 -0
  321. package/dist/util/bottom-tab-bar.js +54 -0
  322. package/dist/util/calendar.d.ts +55 -0
  323. package/dist/util/calendar.js +74 -0
  324. package/dist/util/cn.d.ts +7 -0
  325. package/dist/util/cn.js +48 -0
  326. package/dist/util/collapsible.d.ts +57 -0
  327. package/dist/util/collapsible.js +23 -0
  328. package/dist/util/confirm-dialog.d.ts +11 -0
  329. package/dist/util/confirm-dialog.js +2 -0
  330. package/dist/util/date.d.ts +95 -0
  331. package/dist/util/date.js +237 -0
  332. package/dist/util/drawer.d.ts +12 -0
  333. package/dist/util/drawer.js +7 -0
  334. package/dist/util/dropdown.d.ts +46 -0
  335. package/dist/util/dropdown.js +21 -0
  336. package/dist/util/field.d.ts +38 -0
  337. package/dist/util/field.js +38 -0
  338. package/dist/util/fit-in-viewport.d.ts +200 -0
  339. package/dist/util/fit-in-viewport.js +399 -0
  340. package/dist/util/focus-utils.d.ts +75 -2
  341. package/dist/util/focus-utils.js +182 -9
  342. package/dist/util/hydration.d.ts +44 -0
  343. package/dist/util/hydration.js +58 -0
  344. package/dist/util/keyboard-inset.d.ts +17 -0
  345. package/dist/util/keyboard-inset.js +53 -0
  346. package/dist/util/media-grid.d.ts +50 -0
  347. package/dist/util/media-grid.js +81 -0
  348. package/dist/util/media.d.ts +5 -0
  349. package/dist/util/media.js +10 -0
  350. package/dist/util/overlay-chrome.d.ts +52 -0
  351. package/dist/util/overlay-chrome.js +56 -0
  352. package/dist/util/overlay.d.ts +71 -0
  353. package/dist/util/overlay.js +240 -0
  354. package/dist/util/photo.d.ts +214 -0
  355. package/dist/util/photo.js +206 -0
  356. package/dist/util/portal.d.ts +22 -0
  357. package/dist/util/portal.js +50 -0
  358. package/dist/util/pull-to-refresh.d.ts +26 -0
  359. package/dist/util/pull-to-refresh.js +30 -0
  360. package/dist/util/radio-keys.d.ts +24 -0
  361. package/dist/util/radio-keys.js +49 -0
  362. package/dist/util/rating.d.ts +22 -0
  363. package/dist/util/rating.js +26 -0
  364. package/dist/util/ready-made-strings.d.ts +76 -0
  365. package/dist/util/ready-made-strings.js +67 -0
  366. package/dist/util/scroll-padding.d.ts +19 -0
  367. package/dist/util/scroll-padding.js +44 -0
  368. package/dist/util/segmented-control.d.ts +15 -0
  369. package/dist/util/segmented-control.js +1 -0
  370. package/dist/util/select.d.ts +40 -0
  371. package/dist/util/select.js +63 -0
  372. package/dist/util/sheet-drag.d.ts +59 -0
  373. package/dist/util/sheet-drag.js +241 -0
  374. package/dist/util/sidebar.d.ts +62 -0
  375. package/dist/util/sidebar.js +38 -0
  376. package/dist/util/sortable-list.d.ts +64 -0
  377. package/dist/util/sortable-list.js +53 -0
  378. package/dist/util/ssr-safe.d.ts +4 -4
  379. package/dist/util/stepper.d.ts +39 -0
  380. package/dist/util/stepper.js +38 -0
  381. package/dist/util/swipeable-list-item.d.ts +35 -0
  382. package/dist/util/swipeable-list-item.js +32 -0
  383. package/dist/util/theme-mode.d.ts +79 -0
  384. package/dist/util/theme-mode.js +121 -0
  385. package/dist/util/toaster.d.ts +92 -0
  386. package/dist/util/toaster.js +75 -0
  387. package/dist/util/tooltip.d.ts +9 -0
  388. package/dist/util/tooltip.js +18 -0
  389. package/dist/util/top-navbar.d.ts +10 -0
  390. package/dist/util/top-navbar.js +5 -0
  391. package/dist/util/touch-target.d.ts +30 -0
  392. package/dist/util/touch-target.js +30 -0
  393. package/dist/util/zabi-strings.d.ts +132 -0
  394. package/dist/util/zabi-strings.js +105 -0
  395. package/dist/zabi-components-colors.css +5 -2
  396. package/dist/zabi-components-theme-dark-only.css +574 -225
  397. package/dist/zabi-components-theme-dark.css +574 -225
  398. package/dist/zabi-components-theme-only.css +1680 -317
  399. package/dist/zabi-components-theme.css +1680 -317
  400. package/dist/zabi-components.css +4473 -1158
  401. package/docs/lucide-icons.md +41 -16
  402. package/docs/theme-imports.md +81 -11
  403. package/package.json +51 -29
  404. package/dist/lib/layout-width-tokens.d.ts +0 -17
  405. package/dist/lib/layout-width-tokens.d.ts.map +0 -1
  406. package/dist/lib/showcase/component-docs/Button.d.ts +0 -3
  407. package/dist/lib/showcase/component-docs/Button.d.ts.map +0 -1
  408. package/dist/lib/showcase/component-docs/Input.d.ts +0 -3
  409. package/dist/lib/showcase/component-docs/Input.d.ts.map +0 -1
  410. package/dist/lib/showcase/component-docs/List.d.ts +0 -3
  411. package/dist/lib/showcase/component-docs/List.d.ts.map +0 -1
  412. package/dist/lib/showcase/component-docs/Modal.d.ts +0 -3
  413. package/dist/lib/showcase/component-docs/Modal.d.ts.map +0 -1
  414. package/dist/lib/showcase/component-docs/Radio.d.ts +0 -3
  415. package/dist/lib/showcase/component-docs/Radio.d.ts.map +0 -1
  416. package/dist/lib/showcase/component-docs/SidebarNavigation.d.ts +0 -3
  417. package/dist/lib/showcase/component-docs/SidebarNavigation.d.ts.map +0 -1
  418. package/dist/lib/showcase/component-docs/Skeleton.d.ts +0 -3
  419. package/dist/lib/showcase/component-docs/Skeleton.d.ts.map +0 -1
  420. package/dist/lib/showcase/component-docs/_shared.d.ts +0 -12
  421. package/dist/lib/showcase/component-docs/_shared.d.ts.map +0 -1
  422. package/dist/lib/showcase/component-docs/index.d.ts +0 -4
  423. package/dist/lib/showcase/component-docs/index.d.ts.map +0 -1
  424. package/dist/lib/showcase/components-catalog.d.ts +0 -3
  425. package/dist/lib/showcase/components-catalog.d.ts.map +0 -1
  426. package/dist/lib/showcase/components-showcase-constants.d.ts +0 -89
  427. package/dist/lib/showcase/components-showcase-constants.d.ts.map +0 -1
  428. package/dist/lib/showcase/docs-sidebar-helpers.d.ts +0 -15
  429. package/dist/lib/showcase/docs-sidebar-helpers.d.ts.map +0 -1
  430. package/dist/routes/lib/focus-utils.d.ts +0 -12
  431. package/dist/routes/lib/focus-utils.ts +0 -110
  432. package/dist/routes/lib/ssr-safe.ts +0 -58
  433. package/scripts/fix-lucide-svelte-icon-dts.js +0 -35
@@ -1,244 +1,593 @@
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: #f7faff
28
- --zabi-brand-100: #edf2fb
29
- --zabi-brand-200: #dfe7fb
30
- --zabi-brand-300: #ccdbfd
31
- --zabi-brand-400: #abc4ff
32
- --zabi-brand-500: #8fa8ff
33
- --zabi-brand-600: #6e84fa
34
- --zabi-brand-700: #5366e2
35
- --zabi-brand-800: #3f4fc0
36
- --zabi-brand-900: #2f3c99
37
- --zabi-brand-950: #1f2866
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: #f9faeb
52
- --zabi-citron-100: #f1f5cf
53
- --zabi-citron-200: #e4ecaa
54
- --zabi-citron-300: #d5e184
55
- --zabi-citron-400: #c7d460
56
- --zabi-citron-500: #bbbe64
57
- --zabi-citron-600: #a3a852
58
- --zabi-citron-700: #848a43
59
- --zabi-citron-800: #666c35
60
- --zabi-citron-900: #4d5229
61
- --zabi-citron-950: #323518
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: #e9f6f2
76
- --zabi-pine-100: #d2ece4
77
- --zabi-pine-200: #a7d9c9
78
- --zabi-pine-300: #78c4ad
79
- --zabi-pine-400: #49ad91
80
- --zabi-pine-500: #0c5d43
81
- --zabi-pine-600: #0a513a
82
- --zabi-pine-700: #084532
83
- --zabi-pine-800: #063a2a
84
- --zabi-pine-900: #04231a
85
- --zabi-pine-950: #02160f
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: #f4f4fa
100
- --zabi-iris-100: #e9e9f7
101
- --zabi-iris-200: #d6d6f0
102
- --zabi-iris-300: #bdbde6
103
- --zabi-iris-400: #a3a3d8
104
- --zabi-iris-500: #6969b3
105
- --zabi-iris-600: #58589e
106
- --zabi-iris-700: #474788
107
- --zabi-iris-800: #38386f
108
- --zabi-iris-900: #2a2a56
109
- --zabi-iris-950: #1b1b37
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: #fffbeb
124
- --zabi-warning-100: #fef3c7
125
- --zabi-warning-200: #fde68a
126
- --zabi-warning-300: #fcd34d
127
- --zabi-warning-400: #fbbf24
128
- --zabi-warning-500: #f59e0b
129
- --zabi-warning-600: #d97706
130
- --zabi-warning-700: #b45309
131
- --zabi-warning-800: #92400e
132
- --zabi-warning-900: #78350f
133
- --zabi-warning-950: #451a03
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: #fef2f2
148
- --zabi-error-100: #fee2e2
149
- --zabi-error-200: #fecaca
150
- --zabi-error-300: #fca5a5
151
- --zabi-error-400: #f87171
152
- --zabi-error-500: #ef4444
153
- --zabi-error-600: #dc2626
154
- --zabi-error-700: #b91c1c
155
- --zabi-error-800: #991b1b
156
- --zabi-error-900: #7f1d1d
157
- --zabi-error-950: #450a0a
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
- /* Card Colors */
195
- --color-card: var(--color-base-200)
196
- --color-card-hover: var(--color-base-300)
197
- --color-card-active: var(--color-base-400)
198
- --color-card-elevated: var(--color-base-200)
199
- /* Surfaces — layered UI (each step is lighter than the previous to read as "elevated") */
200
- --color-surface-1: var(--color-base-250)
201
- --color-surface-2: var(--color-base-300)
202
- --color-surface-3: var(--color-base-350)
203
- --color-surface-4: var(--color-base-400)
125
+ /* Surface elevation — shadows don't read on dark, so each level steps up +6 OKLCH lightness
126
+ * from the page background (L 21 → 27 → 33 → 39).
127
+ *
128
+ * GENERATED by scripts/generate-surfaces.js from tokens/surface-ladder.js — do not hand-edit.
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.
134
+ * Enforced by scripts/check-surface-elevation.js (strictly increasing, 5–8 points). */
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);
144
+ /* Distinct from base, raised AND elevated — a neutral chip has no hue to
145
+ * separate it, so it has to separate on lightness wherever it lands. */
146
+ --color-neutral-subtle: var(--color-base-300);
147
+ --color-neutral-border: var(--color-base-200);
148
+ --color-border-overlay: var(--color-base-450);
149
+ /* Background Colors */
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);
154
+ /* Card Colors — aliases of the surface levels */
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);
159
+ /* Surfaces — numbered aliases of the surface levels */
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);
164
+ /*
165
+ * Secondary text keeps ≥ 4.5:1 on every surface level, including overlays (L39).
166
+ * Only base-650 and lighter pass on the overlay, so caption takes base-650 and description
167
+ * moves one step up to base-700 to stay visibly stronger than caption.
168
+ */
169
+ --color-description: var(--color-base-700);
170
+ --color-caption: var(--color-base-650);
171
+ /* Interaction fills — light tint on dark, mirroring the light-mode rule.
172
+ * Alpha keeps these one step away from every surface level, which a fixed
173
+ * ramp step cannot guarantee (base-100 in dark IS the page background). */
174
+ --color-surface-hover: rgba(250, 250, 250, 0.08);
175
+ --color-surface-active: rgba(250, 250, 250, 0.14);
204
176
  /* Overlay Colors */
205
- --color-overlay: rgba(0, 0, 0, 0.7)
206
- /* Input Colors */
207
- --color-input: var(--color-base-250)
208
- --color-input-border: var(--color-base-350)
209
- --color-input-hover: var(--color-base-300)
210
- --color-input-focus: var(--color-base-300)
211
- --color-input-disabled: var(--color-base-300)
177
+ --color-overlay: rgba(0, 0, 0, 0.7);
178
+ /* Input Colors
179
+ * Dark fields are INSET: one step below the raised surface they sit on,
180
+ * which is the dark-mode equivalent of a white field on a grey page. */
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);
212
201
  /* Text Colors - No dark mode overrides needed, base colors are already inverted */
213
- /* Border Colors - No dark mode overrides needed, base colors are already inverted */
214
- /* 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);
215
224
  /* Primary Colors - No dark mode overrides needed, brand colors are already inverted */
216
225
  /* Secondary Colors - No dark mode overrides needed, base colors are already inverted */
217
- /* Success Colors — no overrides: @theme uses --color-pine-*; semantic pine resolves to mirrored physical ramp inside .dark */
218
- /* Warning Colors — no overrides: @theme uses --color-warning-* scale; it mirrors in .dark via --zabi-warning-* */
219
- /* Error Colors — no overrides: @theme uses --color-error-* scale; it mirrors in .dark via --zabi-error-* */
220
- /* Energetic Colors — no overrides: @theme uses --color-citron-*; citron mirrors in .dark via --zabi-citron-* */
221
- /* Neutral Colors - No dark mode overrides needed, base colors are already inverted */
222
- /* Info Colors — no overrides: @theme uses --color-iris-* (incl. --color-info-active); iris mirrors in .dark via --zabi-iris-* */
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);
245
+ /* Neutral Colors — base-550 mirrors to L* 57, which is only 4.35:1 on a
246
+ * raised surface. One step lighter clears AA on every dark surface level. */
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-* */
223
249
  /* ========================================
224
250
  ACTION COLORS - Dark Mode Overrides
225
251
  ======================================== */
226
252
  /* Primary Actions - Background adapts automatically via brand color inversion */
227
- /* 🎯 TO CHANGE bg-action-primary IN DARK MODE: Edit --zabi-brand-* physical ramp above (semantic --color-brand-* follows mirror) */
228
- /* Text color - Use brand-50 (semantic; maps across light/dark via --zabi-brand-*) for proper contrast */
229
- --color-action-primary-text: var(--color-brand-50)
230
- /* Secondary Actions - No dark mode overrides needed, base colors are already inverted */
231
- /* Danger Actions */
232
- --color-action-danger: #ef4444
233
- --color-action-danger-hover: #dc2626
234
- --color-action-danger-active: #b91c1c
235
- --color-action-danger-disabled: #b91c1c
236
- --color-action-danger-subtle: #450a0a
237
- --color-action-danger-subtle-hover: #7f1d1d
238
- /* Shadow Colors */
239
- --shadow-opacity: 0.3
240
- --shadow-sm: 0 1px 3px 0 rgb(var(--shadow-color) / var(--shadow-opacity)), 0 1px 2px -1px rgb(var(--shadow-color) / var(--shadow-opacity))
241
- --shadow-md: 0 4px 6px -1px rgb(var(--shadow-color) / var(--shadow-opacity)), 0 2px 4px -2px rgb(var(--shadow-color) / var(--shadow-opacity))
242
- --shadow-lg: 0 10px 15px -3px rgb(var(--shadow-color) / var(--shadow-opacity)), 0 4px 6px -4px rgb(var(--shadow-color) / var(--shadow-opacity))
243
- --shadow-xl: 0 20px 25px -5px rgb(var(--shadow-color) / var(--shadow-opacity)), 0 8px 10px -6px rgb(var(--shadow-color) / var(--shadow-opacity))
244
- }
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));
266
+ /* Secondary Actions - light alpha tint instead of the light-mode dark tint */
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);
274
+ /* Danger Actions — restated as aliases, not re-pointed.
275
+ * These resolve through the mirrored --color-error-* scale, so dark danger
276
+ * is the same step of the same ramp as light danger. They are repeated here
277
+ * only because `zabi-components/theme-dark-only` has to stand alone as a
278
+ * complete import (validate-theme.js enforces that). The raw hex this
279
+ * replaced pinned dark danger brighter than light, which is why the
280
+ * 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 — 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
+ }