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