zabi-components 8.0.0 → 9.0.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 (456) hide show
  1. package/CHANGELOG.md +2935 -0
  2. package/README.md +243 -10
  3. package/THEME.md +162 -332
  4. package/THEMING.md +1419 -259
  5. package/dist/atoms/ActionPanel.svelte +15 -5
  6. package/dist/atoms/Avatar.svelte +120 -0
  7. package/dist/atoms/Avatar.svelte.d.ts +46 -0
  8. package/dist/atoms/Badge.svelte +71 -13
  9. package/dist/atoms/Badge.svelte.d.ts +8 -2
  10. package/dist/atoms/Block.svelte +74 -0
  11. package/dist/atoms/Block.svelte.d.ts +29 -0
  12. package/dist/atoms/Button.svelte +217 -30
  13. package/dist/atoms/Button.svelte.d.ts +33 -4
  14. package/dist/atoms/Card.svelte +182 -26
  15. package/dist/atoms/Card.svelte.d.ts +55 -3
  16. package/dist/atoms/CardHeader.svelte +16 -4
  17. package/dist/atoms/Checkbox.svelte +81 -21
  18. package/dist/atoms/Checkbox.svelte.d.ts +31 -2
  19. package/dist/atoms/Chip.svelte +351 -0
  20. package/dist/atoms/Chip.svelte.d.ts +57 -0
  21. package/dist/atoms/CodeBlock.svelte +20 -2
  22. package/dist/atoms/CodeBlock.svelte.d.ts +4 -0
  23. package/dist/atoms/CodeField.svelte +385 -0
  24. package/dist/atoms/CodeField.svelte.d.ts +61 -0
  25. package/dist/atoms/ColorPicker.svelte +260 -49
  26. package/dist/atoms/ColorPicker.svelte.d.ts +3 -0
  27. package/dist/atoms/Container.svelte +16 -8
  28. package/dist/atoms/DateField.svelte +145 -0
  29. package/dist/atoms/DateField.svelte.d.ts +81 -0
  30. package/dist/atoms/FieldMessages.svelte +69 -0
  31. package/dist/atoms/FieldMessages.svelte.d.ts +23 -0
  32. package/dist/atoms/FloatingActionButton.svelte +176 -0
  33. package/dist/atoms/FloatingActionButton.svelte.d.ts +51 -0
  34. package/dist/atoms/Heading.svelte +63 -5
  35. package/dist/atoms/Heading.svelte.d.ts +14 -0
  36. package/dist/atoms/IconButton.svelte +294 -26
  37. package/dist/atoms/IconButton.svelte.d.ts +62 -4
  38. package/dist/atoms/Input.svelte +259 -53
  39. package/dist/atoms/Input.svelte.d.ts +33 -2
  40. package/dist/atoms/List.svelte +5 -1
  41. package/dist/atoms/ListItem.svelte +70 -13
  42. package/dist/atoms/ListItem.svelte.d.ts +11 -0
  43. package/dist/atoms/PickerField.svelte +239 -0
  44. package/dist/atoms/PickerField.svelte.d.ts +67 -0
  45. package/dist/atoms/Progress.svelte +99 -19
  46. package/dist/atoms/Progress.svelte.d.ts +15 -1
  47. package/dist/atoms/Radio.svelte +51 -3
  48. package/dist/atoms/Radio.svelte.d.ts +30 -2
  49. package/dist/atoms/Rating.svelte +620 -0
  50. package/dist/atoms/Rating.svelte.d.ts +77 -0
  51. package/dist/atoms/Select.svelte +438 -98
  52. package/dist/atoms/Select.svelte.d.ts +61 -3
  53. package/dist/atoms/SelectionControl.svelte +193 -23
  54. package/dist/atoms/SelectionControl.svelte.d.ts +29 -3
  55. package/dist/atoms/Skeleton.svelte +114 -18
  56. package/dist/atoms/Skeleton.svelte.d.ts +30 -3
  57. package/dist/atoms/SkeletonGroup.svelte +43 -0
  58. package/dist/atoms/SkeletonGroup.svelte.d.ts +20 -0
  59. package/dist/atoms/Slider.svelte +344 -0
  60. package/dist/atoms/Slider.svelte.d.ts +40 -0
  61. package/dist/atoms/Sparkline.svelte +109 -0
  62. package/dist/atoms/Sparkline.svelte.d.ts +27 -0
  63. package/dist/atoms/SpeechBubble.svelte +187 -0
  64. package/dist/atoms/SpeechBubble.svelte.d.ts +33 -0
  65. package/dist/atoms/Spinner.svelte +57 -0
  66. package/dist/atoms/Spinner.svelte.d.ts +19 -0
  67. package/dist/atoms/Stat.svelte +72 -0
  68. package/dist/atoms/Stat.svelte.d.ts +19 -0
  69. package/dist/atoms/Table.svelte +151 -6
  70. package/dist/atoms/Table.svelte.d.ts +15 -3
  71. package/dist/atoms/TemporalField.svelte +472 -0
  72. package/dist/atoms/TemporalField.svelte.d.ts +48 -0
  73. package/dist/atoms/Text.svelte +23 -11
  74. package/dist/atoms/Text.svelte.d.ts +6 -3
  75. package/dist/atoms/Textarea.svelte +150 -44
  76. package/dist/atoms/Textarea.svelte.d.ts +35 -2
  77. package/dist/atoms/ThemeToggle.svelte +223 -44
  78. package/dist/atoms/ThemeToggle.svelte.d.ts +26 -3
  79. package/dist/atoms/TimeColumn.svelte +150 -0
  80. package/dist/atoms/TimeColumn.svelte.d.ts +25 -0
  81. package/dist/atoms/TimeField.svelte +151 -0
  82. package/dist/atoms/TimeField.svelte.d.ts +85 -0
  83. package/dist/atoms/Toast.svelte +22 -8
  84. package/dist/atoms/Toast.svelte.d.ts +2 -0
  85. package/dist/atoms/Toggle.svelte +98 -14
  86. package/dist/atoms/Toggle.svelte.d.ts +26 -2
  87. package/dist/atoms/Tooltip.svelte +528 -24
  88. package/dist/atoms/Tooltip.svelte.d.ts +18 -0
  89. package/dist/atoms/ZabiStringsProvider.svelte +45 -0
  90. package/dist/atoms/ZabiStringsProvider.svelte.d.ts +27 -0
  91. package/dist/atoms/index.d.ts +38 -0
  92. package/dist/atoms/index.js +29 -0
  93. package/dist/atoms/selection-control.styles.d.ts +47 -5
  94. package/dist/atoms/selection-control.styles.js +52 -10
  95. package/dist/components/atoms/index.d.ts +38 -0
  96. package/dist/components/atoms/index.d.ts.map +1 -1
  97. package/dist/components/atoms/selection-control.styles.d.ts +47 -5
  98. package/dist/components/atoms/selection-control.styles.d.ts.map +1 -1
  99. package/dist/components/index.d.ts +104 -2
  100. package/dist/components/index.d.ts.map +1 -1
  101. package/dist/components/map.d.ts +11 -0
  102. package/dist/components/map.d.ts.map +1 -0
  103. package/dist/components/molecules/index.d.ts +51 -0
  104. package/dist/components/molecules/index.d.ts.map +1 -1
  105. package/dist/components/molecules/toast-store.d.ts +83 -7
  106. package/dist/components/molecules/toast-store.d.ts.map +1 -1
  107. package/dist/components/organisms/index.d.ts +10 -0
  108. package/dist/components/organisms/index.d.ts.map +1 -1
  109. package/dist/components/types/variants.d.ts +24 -1
  110. package/dist/components/types/variants.d.ts.map +1 -1
  111. package/dist/components/util/app-shell.d.ts +79 -0
  112. package/dist/components/util/app-shell.d.ts.map +1 -0
  113. package/dist/components/util/avatar.d.ts +39 -0
  114. package/dist/components/util/avatar.d.ts.map +1 -0
  115. package/dist/components/util/bottom-sheet.d.ts +30 -0
  116. package/dist/components/util/bottom-sheet.d.ts.map +1 -0
  117. package/dist/components/util/bottom-tab-bar.d.ts +41 -0
  118. package/dist/components/util/bottom-tab-bar.d.ts.map +1 -0
  119. package/dist/components/util/calendar.d.ts +56 -0
  120. package/dist/components/util/calendar.d.ts.map +1 -0
  121. package/dist/components/util/chart.d.ts +140 -0
  122. package/dist/components/util/chart.d.ts.map +1 -0
  123. package/dist/components/util/chip.d.ts +66 -0
  124. package/dist/components/util/chip.d.ts.map +1 -0
  125. package/dist/components/util/cn.d.ts.map +1 -1
  126. package/dist/components/util/code-field.d.ts +63 -0
  127. package/dist/components/util/code-field.d.ts.map +1 -0
  128. package/dist/components/util/collapsible.d.ts +64 -0
  129. package/dist/components/util/collapsible.d.ts.map +1 -0
  130. package/dist/components/util/confirm-dialog.d.ts +12 -0
  131. package/dist/components/util/confirm-dialog.d.ts.map +1 -0
  132. package/dist/components/util/date.d.ts +96 -0
  133. package/dist/components/util/date.d.ts.map +1 -0
  134. package/dist/components/util/display-voice.d.ts +10 -0
  135. package/dist/components/util/display-voice.d.ts.map +1 -0
  136. package/dist/components/util/drawer.d.ts +13 -0
  137. package/dist/components/util/drawer.d.ts.map +1 -0
  138. package/dist/components/util/dropdown.d.ts +47 -0
  139. package/dist/components/util/dropdown.d.ts.map +1 -0
  140. package/dist/components/util/field-control.d.ts +30 -0
  141. package/dist/components/util/field-control.d.ts.map +1 -0
  142. package/dist/components/util/field.d.ts +45 -0
  143. package/dist/components/util/field.d.ts.map +1 -0
  144. package/dist/components/util/fit-in-viewport.d.ts +201 -0
  145. package/dist/components/util/fit-in-viewport.d.ts.map +1 -0
  146. package/dist/components/util/focus-utils.d.ts +77 -2
  147. package/dist/components/util/focus-utils.d.ts.map +1 -1
  148. package/dist/components/util/hydration.d.ts +45 -0
  149. package/dist/components/util/hydration.d.ts.map +1 -0
  150. package/dist/components/util/keyboard-inset.d.ts +18 -0
  151. package/dist/components/util/keyboard-inset.d.ts.map +1 -0
  152. package/dist/components/util/map-view.d.ts +144 -0
  153. package/dist/components/util/map-view.d.ts.map +1 -0
  154. package/dist/components/util/media-grid.d.ts +51 -0
  155. package/dist/components/util/media-grid.d.ts.map +1 -0
  156. package/dist/components/util/media.d.ts +6 -0
  157. package/dist/components/util/media.d.ts.map +1 -0
  158. package/dist/components/util/overlay-chrome.d.ts +53 -0
  159. package/dist/components/util/overlay-chrome.d.ts.map +1 -0
  160. package/dist/components/util/overlay.d.ts +72 -0
  161. package/dist/components/util/overlay.d.ts.map +1 -0
  162. package/dist/components/util/photo.d.ts +234 -0
  163. package/dist/components/util/photo.d.ts.map +1 -0
  164. package/dist/components/util/portal.d.ts +23 -0
  165. package/dist/components/util/portal.d.ts.map +1 -0
  166. package/dist/components/util/progress.d.ts +19 -0
  167. package/dist/components/util/progress.d.ts.map +1 -0
  168. package/dist/components/util/pull-to-refresh.d.ts +27 -0
  169. package/dist/components/util/pull-to-refresh.d.ts.map +1 -0
  170. package/dist/components/util/radio-keys.d.ts +25 -0
  171. package/dist/components/util/radio-keys.d.ts.map +1 -0
  172. package/dist/components/util/rating.d.ts +23 -0
  173. package/dist/components/util/rating.d.ts.map +1 -0
  174. package/dist/components/util/ready-made-strings.d.ts +77 -0
  175. package/dist/components/util/ready-made-strings.d.ts.map +1 -0
  176. package/dist/components/util/scroll-edge.d.ts +33 -0
  177. package/dist/components/util/scroll-edge.d.ts.map +1 -0
  178. package/dist/components/util/scroll-padding.d.ts +20 -0
  179. package/dist/components/util/scroll-padding.d.ts.map +1 -0
  180. package/dist/components/util/segmented-control.d.ts +16 -0
  181. package/dist/components/util/segmented-control.d.ts.map +1 -0
  182. package/dist/components/util/select.d.ts +41 -0
  183. package/dist/components/util/select.d.ts.map +1 -0
  184. package/dist/components/util/sheet-drag.d.ts +84 -0
  185. package/dist/components/util/sheet-drag.d.ts.map +1 -0
  186. package/dist/components/util/sidebar.d.ts +63 -0
  187. package/dist/components/util/sidebar.d.ts.map +1 -0
  188. package/dist/components/util/skeleton.d.ts +15 -0
  189. package/dist/components/util/skeleton.d.ts.map +1 -0
  190. package/dist/components/util/sliding-indicator.d.ts +25 -0
  191. package/dist/components/util/sliding-indicator.d.ts.map +1 -0
  192. package/dist/components/util/sortable-list.d.ts +65 -0
  193. package/dist/components/util/sortable-list.d.ts.map +1 -0
  194. package/dist/components/util/stepper.d.ts +40 -0
  195. package/dist/components/util/stepper.d.ts.map +1 -0
  196. package/dist/components/util/swipeable-list-item.d.ts +36 -0
  197. package/dist/components/util/swipeable-list-item.d.ts.map +1 -0
  198. package/dist/components/util/temporal-field.d.ts +89 -0
  199. package/dist/components/util/temporal-field.d.ts.map +1 -0
  200. package/dist/components/util/theme-mode.d.ts +80 -0
  201. package/dist/components/util/theme-mode.d.ts.map +1 -0
  202. package/dist/components/util/toaster.d.ts +133 -0
  203. package/dist/components/util/toaster.d.ts.map +1 -0
  204. package/dist/components/util/tone-surface.d.ts +34 -0
  205. package/dist/components/util/tone-surface.d.ts.map +1 -0
  206. package/dist/components/util/tooltip.d.ts +10 -0
  207. package/dist/components/util/tooltip.d.ts.map +1 -0
  208. package/dist/components/util/top-navbar.d.ts +35 -0
  209. package/dist/components/util/top-navbar.d.ts.map +1 -0
  210. package/dist/components/util/touch-target.d.ts +31 -0
  211. package/dist/components/util/touch-target.d.ts.map +1 -0
  212. package/dist/components/util/zabi-strings.d.ts +142 -0
  213. package/dist/components/util/zabi-strings.d.ts.map +1 -0
  214. package/dist/create-theme/cli.js +173 -0
  215. package/dist/create-theme/index.d.ts +190 -0
  216. package/dist/create-theme/index.js +1034 -0
  217. package/dist/create-theme/lib/ramp-math.js +128 -0
  218. package/dist/create-theme/lib/resolve.js +238 -0
  219. package/dist/create-theme/theme-data.js +2644 -0
  220. package/dist/index.d.ts +104 -2
  221. package/dist/index.js +75 -2
  222. package/dist/map.d.ts +10 -0
  223. package/dist/map.js +9 -0
  224. package/dist/molecules/Alert.svelte +63 -16
  225. package/dist/molecules/Alert.svelte.d.ts +14 -1
  226. package/dist/molecules/AppBar.svelte +674 -0
  227. package/dist/molecules/AppBar.svelte.d.ts +131 -0
  228. package/dist/molecules/AvatarGroup.svelte +116 -0
  229. package/dist/molecules/AvatarGroup.svelte.d.ts +40 -0
  230. package/dist/molecules/BarChart.svelte +381 -0
  231. package/dist/molecules/BarChart.svelte.d.ts +45 -0
  232. package/dist/molecules/BottomSheet.svelte +608 -0
  233. package/dist/molecules/BottomSheet.svelte.d.ts +109 -0
  234. package/dist/molecules/BottomTabBar.svelte +403 -0
  235. package/dist/molecules/BottomTabBar.svelte.d.ts +98 -0
  236. package/dist/molecules/Calendar.svelte +597 -0
  237. package/dist/molecules/Calendar.svelte.d.ts +72 -0
  238. package/dist/molecules/ChipGroup.svelte +325 -0
  239. package/dist/molecules/ChipGroup.svelte.d.ts +41 -0
  240. package/dist/molecules/Collapsible.svelte +347 -0
  241. package/dist/molecules/Collapsible.svelte.d.ts +61 -0
  242. package/dist/molecules/CollapsibleGroup.svelte +136 -0
  243. package/dist/molecules/CollapsibleGroup.svelte.d.ts +14 -0
  244. package/dist/molecules/ComponentDemo.svelte +16 -4
  245. package/dist/molecules/ComponentDemo.svelte.d.ts +3 -0
  246. package/dist/molecules/ConfirmDialog.svelte +257 -0
  247. package/dist/molecules/ConfirmDialog.svelte.d.ts +58 -0
  248. package/dist/molecules/ContactForm.svelte +34 -17
  249. package/dist/molecules/ContactForm.svelte.d.ts +8 -0
  250. package/dist/molecules/Drawer.svelte +415 -0
  251. package/dist/molecules/Drawer.svelte.d.ts +55 -0
  252. package/dist/molecules/Dropdown.svelte +517 -48
  253. package/dist/molecules/Dropdown.svelte.d.ts +47 -6
  254. package/dist/molecules/DropdownItem.svelte +122 -0
  255. package/dist/molecules/DropdownItem.svelte.d.ts +28 -0
  256. package/dist/molecules/EmptyState.svelte +55 -10
  257. package/dist/molecules/EmptyState.svelte.d.ts +8 -0
  258. package/dist/molecules/FormField.svelte +9 -1
  259. package/dist/molecules/FormField.svelte.d.ts +2 -0
  260. package/dist/molecules/Header.svelte +1 -1
  261. package/dist/molecules/ImageUpload.svelte +492 -69
  262. package/dist/molecules/ImageUpload.svelte.d.ts +82 -2
  263. package/dist/molecules/LineChart.svelte +459 -0
  264. package/dist/molecules/LineChart.svelte.d.ts +53 -0
  265. package/dist/molecules/MapView.svelte +565 -0
  266. package/dist/molecules/MapView.svelte.d.ts +88 -0
  267. package/dist/molecules/MediaGrid.svelte +527 -0
  268. package/dist/molecules/MediaGrid.svelte.d.ts +77 -0
  269. package/dist/molecules/Modal.svelte +293 -72
  270. package/dist/molecules/Modal.svelte.d.ts +51 -2
  271. package/dist/molecules/NavigationMenuContent.svelte +58 -1
  272. package/dist/molecules/NavigationMenuItem.svelte +0 -1
  273. package/dist/molecules/NavigationMenuLink.svelte +1 -1
  274. package/dist/molecules/NavigationMenuList.svelte +10 -3
  275. package/dist/molecules/NavigationMenuTrigger.svelte +2 -2
  276. package/dist/molecules/Page.svelte +32 -2
  277. package/dist/molecules/Page.svelte.d.ts +11 -0
  278. package/dist/molecules/PhotoGrid.svelte +523 -0
  279. package/dist/molecules/PhotoGrid.svelte.d.ts +73 -0
  280. package/dist/molecules/PhotoViewer.svelte +1213 -0
  281. package/dist/molecules/PhotoViewer.svelte.d.ts +74 -0
  282. package/dist/molecules/PieChart.svelte +421 -0
  283. package/dist/molecules/PieChart.svelte.d.ts +51 -0
  284. package/dist/molecules/PropsTable.svelte +22 -10
  285. package/dist/molecules/PropsTable.svelte.d.ts +3 -0
  286. package/dist/molecules/PullToRefresh.svelte +263 -0
  287. package/dist/molecules/PullToRefresh.svelte.d.ts +52 -0
  288. package/dist/molecules/RadioGroup.svelte +72 -18
  289. package/dist/molecules/RadioGroup.svelte.d.ts +19 -3
  290. package/dist/molecules/Section.svelte +1 -1
  291. package/dist/molecules/SegmentedControl.svelte +456 -0
  292. package/dist/molecules/SegmentedControl.svelte.d.ts +40 -0
  293. package/dist/molecules/SidebarBrandHeader.svelte +11 -1
  294. package/dist/molecules/SidebarBrandHeader.svelte.d.ts +3 -0
  295. package/dist/molecules/SidebarFooter.svelte +30 -7
  296. package/dist/molecules/SidebarFooter.svelte.d.ts +3 -0
  297. package/dist/molecules/SidebarNavSection.svelte +1 -1
  298. package/dist/molecules/SlideUp.svelte +220 -61
  299. package/dist/molecules/SlideUp.svelte.d.ts +26 -0
  300. package/dist/molecules/SortableList.svelte +633 -0
  301. package/dist/molecules/SortableList.svelte.d.ts +69 -0
  302. package/dist/molecules/Stepper.svelte +562 -0
  303. package/dist/molecules/Stepper.svelte.d.ts +39 -0
  304. package/dist/molecules/StickyActionBar.svelte +250 -0
  305. package/dist/molecules/StickyActionBar.svelte.d.ts +78 -0
  306. package/dist/molecules/SwipeableListItem.svelte +334 -0
  307. package/dist/molecules/SwipeableListItem.svelte.d.ts +54 -0
  308. package/dist/molecules/Tabs.svelte +310 -9
  309. package/dist/molecules/Tabs.svelte.d.ts +7 -0
  310. package/dist/molecules/Toaster.svelte +514 -5
  311. package/dist/molecules/Toaster.svelte.d.ts +153 -2
  312. package/dist/molecules/ToasterToast.svelte +495 -77
  313. package/dist/molecules/ToasterToast.svelte.d.ts +15 -0
  314. package/dist/molecules/UnsavedChangesBar.svelte +223 -0
  315. package/dist/molecules/UnsavedChangesBar.svelte.d.ts +43 -0
  316. package/dist/molecules/index.d.ts +51 -0
  317. package/dist/molecules/index.js +31 -0
  318. package/dist/molecules/toast-store.d.ts +83 -7
  319. package/dist/molecules/toast-store.js +25 -1
  320. package/dist/organisms/AppNavigation.svelte +440 -0
  321. package/dist/organisms/AppNavigation.svelte.d.ts +72 -0
  322. package/dist/organisms/AppShell.svelte +696 -0
  323. package/dist/organisms/AppShell.svelte.d.ts +157 -0
  324. package/dist/organisms/AppShellHeaderPart.svelte +163 -0
  325. package/dist/organisms/AppShellHeaderPart.svelte.d.ts +57 -0
  326. package/dist/organisms/SidebarAccountPanel.svelte +107 -12
  327. package/dist/organisms/SidebarAccountPanel.svelte.d.ts +19 -0
  328. package/dist/organisms/SidebarNavigation.svelte +111 -43
  329. package/dist/organisms/SidebarNavigation.svelte.d.ts +29 -1
  330. package/dist/organisms/SidebarPanel.svelte +34 -17
  331. package/dist/organisms/SidebarPanel.svelte.d.ts +1 -0
  332. package/dist/organisms/SidebarShell.svelte +164 -14
  333. package/dist/organisms/SidebarShell.svelte.d.ts +56 -2
  334. package/dist/organisms/TopNavbar.svelte +353 -39
  335. package/dist/organisms/TopNavbar.svelte.d.ts +47 -0
  336. package/dist/organisms/TopNavbarSheetContent.svelte +145 -0
  337. package/dist/organisms/TopNavbarSheetContent.svelte.d.ts +24 -0
  338. package/dist/organisms/index.d.ts +10 -0
  339. package/dist/organisms/index.js +7 -0
  340. package/dist/types/components.d.ts +21 -1
  341. package/dist/types/components.d.ts.map +1 -1
  342. package/dist/types/index.d.ts +1093 -26
  343. package/dist/types/index.d.ts.map +1 -1
  344. package/dist/types/variants.ts +28 -1
  345. package/dist/util/app-shell.d.ts +78 -0
  346. package/dist/util/app-shell.js +97 -0
  347. package/dist/util/avatar.d.ts +38 -0
  348. package/dist/util/avatar.js +52 -0
  349. package/dist/util/bottom-sheet.d.ts +29 -0
  350. package/dist/util/bottom-sheet.js +43 -0
  351. package/dist/util/bottom-tab-bar.d.ts +40 -0
  352. package/dist/util/bottom-tab-bar.js +54 -0
  353. package/dist/util/calendar.d.ts +55 -0
  354. package/dist/util/calendar.js +74 -0
  355. package/dist/util/chart.d.ts +139 -0
  356. package/dist/util/chart.js +305 -0
  357. package/dist/util/chip.d.ts +65 -0
  358. package/dist/util/chip.js +58 -0
  359. package/dist/util/cn.js +28 -2
  360. package/dist/util/code-field.d.ts +62 -0
  361. package/dist/util/code-field.js +112 -0
  362. package/dist/util/collapsible.d.ts +63 -0
  363. package/dist/util/collapsible.js +23 -0
  364. package/dist/util/confirm-dialog.d.ts +11 -0
  365. package/dist/util/confirm-dialog.js +2 -0
  366. package/dist/util/date.d.ts +95 -0
  367. package/dist/util/date.js +237 -0
  368. package/dist/util/display-voice.d.ts +9 -0
  369. package/dist/util/display-voice.js +9 -0
  370. package/dist/util/drawer.d.ts +12 -0
  371. package/dist/util/drawer.js +7 -0
  372. package/dist/util/dropdown.d.ts +46 -0
  373. package/dist/util/dropdown.js +21 -0
  374. package/dist/util/field-control.d.ts +29 -0
  375. package/dist/util/field-control.js +32 -0
  376. package/dist/util/field.d.ts +44 -0
  377. package/dist/util/field.js +38 -0
  378. package/dist/util/fit-in-viewport.d.ts +200 -0
  379. package/dist/util/fit-in-viewport.js +399 -0
  380. package/dist/util/focus-utils.d.ts +77 -2
  381. package/dist/util/focus-utils.js +186 -9
  382. package/dist/util/hydration.d.ts +44 -0
  383. package/dist/util/hydration.js +58 -0
  384. package/dist/util/keyboard-inset.d.ts +17 -0
  385. package/dist/util/keyboard-inset.js +53 -0
  386. package/dist/util/map-view.d.ts +143 -0
  387. package/dist/util/map-view.js +121 -0
  388. package/dist/util/media-grid.d.ts +50 -0
  389. package/dist/util/media-grid.js +81 -0
  390. package/dist/util/media.d.ts +5 -0
  391. package/dist/util/media.js +10 -0
  392. package/dist/util/overlay-chrome.d.ts +52 -0
  393. package/dist/util/overlay-chrome.js +56 -0
  394. package/dist/util/overlay.d.ts +71 -0
  395. package/dist/util/overlay.js +240 -0
  396. package/dist/util/photo.d.ts +233 -0
  397. package/dist/util/photo.js +209 -0
  398. package/dist/util/portal.d.ts +22 -0
  399. package/dist/util/portal.js +50 -0
  400. package/dist/util/progress.d.ts +18 -0
  401. package/dist/util/progress.js +17 -0
  402. package/dist/util/pull-to-refresh.d.ts +26 -0
  403. package/dist/util/pull-to-refresh.js +30 -0
  404. package/dist/util/radio-keys.d.ts +24 -0
  405. package/dist/util/radio-keys.js +49 -0
  406. package/dist/util/rating.d.ts +22 -0
  407. package/dist/util/rating.js +26 -0
  408. package/dist/util/ready-made-strings.d.ts +76 -0
  409. package/dist/util/ready-made-strings.js +67 -0
  410. package/dist/util/scroll-edge.d.ts +32 -0
  411. package/dist/util/scroll-edge.js +87 -0
  412. package/dist/util/scroll-padding.d.ts +19 -0
  413. package/dist/util/scroll-padding.js +44 -0
  414. package/dist/util/segmented-control.d.ts +15 -0
  415. package/dist/util/segmented-control.js +1 -0
  416. package/dist/util/select.d.ts +40 -0
  417. package/dist/util/select.js +63 -0
  418. package/dist/util/sheet-drag.d.ts +83 -0
  419. package/dist/util/sheet-drag.js +311 -0
  420. package/dist/util/sidebar.d.ts +62 -0
  421. package/dist/util/sidebar.js +38 -0
  422. package/dist/util/skeleton.d.ts +14 -0
  423. package/dist/util/skeleton.js +22 -0
  424. package/dist/util/sliding-indicator.d.ts +24 -0
  425. package/dist/util/sliding-indicator.js +44 -0
  426. package/dist/util/sortable-list.d.ts +64 -0
  427. package/dist/util/sortable-list.js +53 -0
  428. package/dist/util/stepper.d.ts +39 -0
  429. package/dist/util/stepper.js +38 -0
  430. package/dist/util/swipeable-list-item.d.ts +35 -0
  431. package/dist/util/swipeable-list-item.js +32 -0
  432. package/dist/util/temporal-field.d.ts +88 -0
  433. package/dist/util/temporal-field.js +136 -0
  434. package/dist/util/theme-mode.d.ts +79 -0
  435. package/dist/util/theme-mode.js +121 -0
  436. package/dist/util/toaster.d.ts +132 -0
  437. package/dist/util/toaster.js +130 -0
  438. package/dist/util/tone-surface.d.ts +33 -0
  439. package/dist/util/tone-surface.js +35 -0
  440. package/dist/util/tooltip.d.ts +9 -0
  441. package/dist/util/tooltip.js +18 -0
  442. package/dist/util/top-navbar.d.ts +34 -0
  443. package/dist/util/top-navbar.js +28 -0
  444. package/dist/util/touch-target.d.ts +30 -0
  445. package/dist/util/touch-target.js +30 -0
  446. package/dist/util/zabi-strings.d.ts +141 -0
  447. package/dist/util/zabi-strings.js +105 -0
  448. package/dist/zabi-components-colors.css +11 -2
  449. package/dist/zabi-components-theme-dark-only.css +870 -258
  450. package/dist/zabi-components-theme-dark.css +870 -258
  451. package/dist/zabi-components-theme-only.css +2419 -368
  452. package/dist/zabi-components-theme.css +2419 -368
  453. package/dist/zabi-components.css +6032 -711
  454. package/docs/lucide-icons.md +40 -17
  455. package/docs/theme-imports.md +81 -11
  456. package/package.json +45 -8
@@ -1,299 +1,496 @@
1
+ @source "./**/*.{svelte,js}";
2
+
1
3
  @theme {
2
4
  /*
3
5
  * Custom base (gray) ramp — single physical scale for --color-base-*.
4
- * 21 stops: 50 … 950 (lightest → darkest). Edit hex here; mirror the same block in .dark for standalone imports.
6
+ * 21 stops: 50 … 950 (lightest → darkest). Declared ONCE, here: .dark holds no raw palette,
7
+ * so an app that overrides --zabi-base-* on :root restyles both themes.
5
8
  * Dark: semantic step S maps to physical (1000 − S), e.g. 50↔950, 75↔925; 500 stays fixed.
6
9
  * Midpoints are frozen hex values (default mode: fixed).
7
10
  */
8
- --zabi-base-50: #fafafa
9
- --zabi-base-75: #f7f7f7
10
- --zabi-base-100: #f4f4f5
11
- --zabi-base-150: #ececee
12
- --zabi-base-200: #e4e4e7
13
- --zabi-base-250: #dcdcdf
14
- --zabi-base-300: #d4d4d8
15
- --zabi-base-350: #babac1
16
- --zabi-base-400: #a1a1aa
17
- --zabi-base-450: #898992
18
- --zabi-base-500: #71717a
19
- --zabi-base-550: #61616a
20
- --zabi-base-600: #52525b
21
- --zabi-base-650: #484850
22
- --zabi-base-700: #3f3f46
23
- --zabi-base-750: #333338
24
- --zabi-base-800: #27272a
25
- --zabi-base-850: #1f1f22
26
- --zabi-base-900: #18181b
27
- --zabi-base-925: #101013
28
- --zabi-base-950: #09090b
29
- /* Typography - Nunito Sans font family */
30
- --font-family-sans: 'Nunito Sans', ui-sans-serif, system-ui, sans-serif
11
+ --zabi-base-50: #fafafa;
12
+ --zabi-base-75: #f7f7f7;
13
+ --zabi-base-100: #f4f4f5;
14
+ --zabi-base-150: #ececee;
15
+ --zabi-base-200: #e4e4e7;
16
+ --zabi-base-250: #dcdcdf;
17
+ --zabi-base-300: #d4d4d8;
18
+ --zabi-base-350: #babac1;
19
+ --zabi-base-400: #a1a1aa;
20
+ --zabi-base-450: #898992;
21
+ --zabi-base-500: #71717a;
22
+ --zabi-base-550: #61616a;
23
+ --zabi-base-600: #52525b;
24
+ --zabi-base-650: #484850;
25
+ --zabi-base-700: #3f3f46;
26
+ --zabi-base-750: #333338;
27
+ --zabi-base-800: #27272a;
28
+ --zabi-base-850: #1f1f22;
29
+ --zabi-base-900: #18181b;
30
+ --zabi-base-925: #101013;
31
+ --zabi-base-950: #09090b;
32
+ /* Typography - the platform UI face, no font is downloaded */
33
+ --font-family-sans: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
34
+ /* Headings follow the body face until an app sets this to a display font
35
+ * on :root. Applied to h1–h6 in the base layer below and by the Heading
36
+ * component. */
37
+ --font-family-heading: var(--font-family-sans);
38
+ /* A second face for a display line (Heading variant="display", `font-display`):
39
+ * a hero, a score, a big number. Follows the heading face until an app sets
40
+ * it, so a second typeface is one token and not a CSS rule. */
41
+ --font-family-display: var(--font-family-heading);
42
+ /* Code. CodeBlock reads it. */
43
+ --font-family-mono: ui-monospace, "SF Mono", SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;
44
+ /* Tailwind's own names for the same three faces. Its `font-sans` and
45
+ * `font-mono` utilities read --font-sans and --font-mono, which were its
46
+ * system stacks: `class="font-sans"` on a heading left the brand face, and
47
+ * nothing said so. They follow the tokens above now, and `font-heading` is
48
+ * the utility for the heading face. An app sets --font-family-*; these
49
+ * follow. */
50
+ --font-sans: var(--font-family-sans);
51
+ --font-mono: var(--font-family-mono);
52
+ --font-heading: var(--font-family-heading);
53
+ --font-display: var(--font-family-display);
54
+ /* Font weights. These are the variables Tailwind's `font-normal`,
55
+ * `font-medium`, `font-semibold` and `font-bold` read, so every component
56
+ * weight follows an override here. `regular` is the name a brand uses for
57
+ * 400; `font-normal` resolves through it. */
58
+ --font-weight-regular: 400;
59
+ --font-weight-normal: var(--font-weight-regular);
60
+ --font-weight-medium: 500;
61
+ --font-weight-semibold: 600;
62
+ --font-weight-bold: 700;
31
63
  /* Brand Color Scale — physical ramp + semantic aliases (same mirror pattern as pine / base) */
32
- --zabi-brand-50: #f4f6ff
33
- --zabi-brand-100: #e9eeff
34
- --zabi-brand-200: #d3dcff
35
- --zabi-brand-300: #b5c6ff
36
- --zabi-brand-400: #92a9ff
37
- --zabi-brand-500: #6d87f1
38
- --zabi-brand-600: #4f68da
39
- --zabi-brand-700: #3c52ba
40
- --zabi-brand-800: #2b3e95
41
- --zabi-brand-900: #1c2c6d
42
- --zabi-brand-950: #111d49
43
- --color-brand-50: var(--zabi-brand-50)
44
- --color-brand-100: var(--zabi-brand-100)
45
- --color-brand-200: var(--zabi-brand-200)
46
- --color-brand-300: var(--zabi-brand-300)
47
- --color-brand-400: var(--zabi-brand-400)
48
- --color-brand-500: var(--zabi-brand-500)
49
- --color-brand-600: var(--zabi-brand-600)
50
- --color-brand-700: var(--zabi-brand-700)
51
- --color-brand-800: var(--zabi-brand-800)
52
- --color-brand-900: var(--zabi-brand-900)
53
- --color-brand-950: var(--zabi-brand-950)
64
+ --zabi-brand-50: #f4f6ff;
65
+ --zabi-brand-100: #e9eeff;
66
+ --zabi-brand-200: #d3dcff;
67
+ --zabi-brand-300: #b5c6ff;
68
+ --zabi-brand-400: #92a9ff;
69
+ --zabi-brand-500: #6d87f1;
70
+ --zabi-brand-600: #4f68da;
71
+ --zabi-brand-700: #3c52ba;
72
+ --zabi-brand-800: #2b3e95;
73
+ --zabi-brand-900: #1c2c6d;
74
+ --zabi-brand-950: #111d49;
75
+ --color-brand-50: var(--zabi-brand-50);
76
+ --color-brand-100: var(--zabi-brand-100);
77
+ --color-brand-200: var(--zabi-brand-200);
78
+ --color-brand-300: var(--zabi-brand-300);
79
+ --color-brand-400: var(--zabi-brand-400);
80
+ --color-brand-500: var(--zabi-brand-500);
81
+ --color-brand-600: var(--zabi-brand-600);
82
+ --color-brand-700: var(--zabi-brand-700);
83
+ --color-brand-800: var(--zabi-brand-800);
84
+ --color-brand-900: var(--zabi-brand-900);
85
+ --color-brand-950: var(--zabi-brand-950);
54
86
  /* Citron Color Scale — physical ramp + semantic aliases (same mirror pattern as pine / base) */
55
- --zabi-citron-50: #f6f7ef
56
- --zabi-citron-100: #edefdf
57
- --zabi-citron-200: #dcdfbf
58
- --zabi-citron-300: #c5ca95
59
- --zabi-citron-400: #aab063
60
- --zabi-citron-500: #8c9027
61
- --zabi-citron-600: #707400
62
- --zabi-citron-700: #5a5d00
63
- --zabi-citron-800: #454700
64
- --zabi-citron-900: #313200
65
- --zabi-citron-950: #202100
66
- --color-citron-50: var(--zabi-citron-50)
67
- --color-citron-100: var(--zabi-citron-100)
68
- --color-citron-200: var(--zabi-citron-200)
69
- --color-citron-300: var(--zabi-citron-300)
70
- --color-citron-400: var(--zabi-citron-400)
71
- --color-citron-500: var(--zabi-citron-500)
72
- --color-citron-600: var(--zabi-citron-600)
73
- --color-citron-700: var(--zabi-citron-700)
74
- --color-citron-800: var(--zabi-citron-800)
75
- --color-citron-900: var(--zabi-citron-900)
76
- --color-citron-950: var(--zabi-citron-950)
87
+ --zabi-citron-50: #f4f8ee;
88
+ --zabi-citron-100: #e9f0de;
89
+ --zabi-citron-200: #d4e2bd;
90
+ --zabi-citron-300: #b9ce92;
91
+ --zabi-citron-400: #99b55e;
92
+ --zabi-citron-500: #769619;
93
+ --zabi-citron-600: #5d7900;
94
+ --zabi-citron-700: #4a6100;
95
+ --zabi-citron-800: #384a00;
96
+ --zabi-citron-900: #273500;
97
+ --zabi-citron-950: #192300;
98
+ --color-citron-50: var(--zabi-citron-50);
99
+ --color-citron-100: var(--zabi-citron-100);
100
+ --color-citron-200: var(--zabi-citron-200);
101
+ --color-citron-300: var(--zabi-citron-300);
102
+ --color-citron-400: var(--zabi-citron-400);
103
+ --color-citron-500: var(--zabi-citron-500);
104
+ --color-citron-600: var(--zabi-citron-600);
105
+ --color-citron-700: var(--zabi-citron-700);
106
+ --color-citron-800: var(--zabi-citron-800);
107
+ --color-citron-900: var(--zabi-citron-900);
108
+ --color-citron-950: var(--zabi-citron-950);
109
+ /* Accent Color Scale — the second brand colour (highlights, badges,
110
+ * celebrations). Defaults to the citron ramp; an app overrides
111
+ * --zabi-accent-50 … 950 on :root, once, and both themes follow. */
112
+ --zabi-accent-50: var(--zabi-citron-50);
113
+ --zabi-accent-100: var(--zabi-citron-100);
114
+ --zabi-accent-200: var(--zabi-citron-200);
115
+ --zabi-accent-300: var(--zabi-citron-300);
116
+ --zabi-accent-400: var(--zabi-citron-400);
117
+ --zabi-accent-500: var(--zabi-citron-500);
118
+ --zabi-accent-600: var(--zabi-citron-600);
119
+ --zabi-accent-700: var(--zabi-citron-700);
120
+ --zabi-accent-800: var(--zabi-citron-800);
121
+ --zabi-accent-900: var(--zabi-citron-900);
122
+ --zabi-accent-950: var(--zabi-citron-950);
123
+ --color-accent-50: var(--zabi-accent-50);
124
+ --color-accent-100: var(--zabi-accent-100);
125
+ --color-accent-200: var(--zabi-accent-200);
126
+ --color-accent-300: var(--zabi-accent-300);
127
+ --color-accent-400: var(--zabi-accent-400);
128
+ --color-accent-500: var(--zabi-accent-500);
129
+ --color-accent-600: var(--zabi-accent-600);
130
+ --color-accent-700: var(--zabi-accent-700);
131
+ --color-accent-800: var(--zabi-accent-800);
132
+ --color-accent-900: var(--zabi-accent-900);
133
+ --color-accent-950: var(--zabi-accent-950);
77
134
  /* Pine Color Scale — physical ramp + semantic aliases (mirror pattern matches --zabi-base-* / --color-base-*) */
78
- --zabi-pine-50: #f0f8f5
79
- --zabi-pine-100: #e2f1eb
80
- --zabi-pine-200: #c5e4d7
81
- --zabi-pine-300: #9fd1bd
82
- --zabi-pine-400: #70ba9e
83
- --zabi-pine-500: #399c7a
84
- --zabi-pine-600: #00805e
85
- --zabi-pine-700: #00674a
86
- --zabi-pine-800: #004f37
87
- --zabi-pine-900: #003826
88
- --zabi-pine-950: #002518
89
- --color-pine-50: var(--zabi-pine-50)
90
- --color-pine-100: var(--zabi-pine-100)
91
- --color-pine-200: var(--zabi-pine-200)
92
- --color-pine-300: var(--zabi-pine-300)
93
- --color-pine-400: var(--zabi-pine-400)
94
- --color-pine-500: var(--zabi-pine-500)
95
- --color-pine-600: var(--zabi-pine-600)
96
- --color-pine-700: var(--zabi-pine-700)
97
- --color-pine-800: var(--zabi-pine-800)
98
- --color-pine-900: var(--zabi-pine-900)
99
- --color-pine-950: var(--zabi-pine-950)
135
+ --zabi-pine-50: #f0f9f3;
136
+ --zabi-pine-100: #e1f2e8;
137
+ --zabi-pine-200: #c3e5d0;
138
+ --zabi-pine-300: #9cd3b2;
139
+ --zabi-pine-400: #6cbb8e;
140
+ --zabi-pine-500: #319e67;
141
+ --zabi-pine-600: #00804b;
142
+ --zabi-pine-700: #00683b;
143
+ --zabi-pine-800: #00502b;
144
+ --zabi-pine-900: #00391c;
145
+ --zabi-pine-950: #002610;
146
+ --color-pine-50: var(--zabi-pine-50);
147
+ --color-pine-100: var(--zabi-pine-100);
148
+ --color-pine-200: var(--zabi-pine-200);
149
+ --color-pine-300: var(--zabi-pine-300);
150
+ --color-pine-400: var(--zabi-pine-400);
151
+ --color-pine-500: var(--zabi-pine-500);
152
+ --color-pine-600: var(--zabi-pine-600);
153
+ --color-pine-700: var(--zabi-pine-700);
154
+ --color-pine-800: var(--zabi-pine-800);
155
+ --color-pine-900: var(--zabi-pine-900);
156
+ --color-pine-950: var(--zabi-pine-950);
100
157
  /* Iris Color Scale — physical ramp + semantic aliases (same mirror pattern as pine / base) */
101
- --zabi-iris-50: #f6f6fd
102
- --zabi-iris-100: #ecedfb
103
- --zabi-iris-200: #dadbf6
104
- --zabi-iris-300: #c1c4ef
105
- --zabi-iris-400: #a5a7e2
106
- --zabi-iris-500: #8486cd
107
- --zabi-iris-600: #6969b4
108
- --zabi-iris-700: #535397
109
- --zabi-iris-800: #3f3f78
110
- --zabi-iris-900: #2c2c58
111
- --zabi-iris-950: #1d1d3a
112
- --color-iris-50: var(--zabi-iris-50)
113
- --color-iris-100: var(--zabi-iris-100)
114
- --color-iris-200: var(--zabi-iris-200)
115
- --color-iris-300: var(--zabi-iris-300)
116
- --color-iris-400: var(--zabi-iris-400)
117
- --color-iris-500: var(--zabi-iris-500)
118
- --color-iris-600: var(--zabi-iris-600)
119
- --color-iris-700: var(--zabi-iris-700)
120
- --color-iris-800: var(--zabi-iris-800)
121
- --color-iris-900: var(--zabi-iris-900)
122
- --color-iris-950: var(--zabi-iris-950)
158
+ --zabi-iris-50: #f6f6fd;
159
+ --zabi-iris-100: #ecedfb;
160
+ --zabi-iris-200: #dadbf6;
161
+ --zabi-iris-300: #c1c4ef;
162
+ --zabi-iris-400: #a5a7e2;
163
+ --zabi-iris-500: #8486cd;
164
+ --zabi-iris-600: #6969b4;
165
+ --zabi-iris-700: #535397;
166
+ --zabi-iris-800: #3f3f78;
167
+ --zabi-iris-900: #2c2c58;
168
+ --zabi-iris-950: #1d1d3a;
169
+ --color-iris-50: var(--zabi-iris-50);
170
+ --color-iris-100: var(--zabi-iris-100);
171
+ --color-iris-200: var(--zabi-iris-200);
172
+ --color-iris-300: var(--zabi-iris-300);
173
+ --color-iris-400: var(--zabi-iris-400);
174
+ --color-iris-500: var(--zabi-iris-500);
175
+ --color-iris-600: var(--zabi-iris-600);
176
+ --color-iris-700: var(--zabi-iris-700);
177
+ --color-iris-800: var(--zabi-iris-800);
178
+ --color-iris-900: var(--zabi-iris-900);
179
+ --color-iris-950: var(--zabi-iris-950);
123
180
  /* Warning Color Scale — physical ramp + semantic aliases (Tailwind amber) */
124
- --zabi-warning-50: #fbf6ed
125
- --zabi-warning-100: #f7ecda
126
- --zabi-warning-200: #f1d9b6
127
- --zabi-warning-300: #e8bf87
128
- --zabi-warning-400: #db9e4c
129
- --zabi-warning-500: #c17b00
130
- --zabi-warning-600: #9e6000
131
- --zabi-warning-700: #824c00
132
- --zabi-warning-800: #663800
133
- --zabi-warning-900: #4b2600
134
- --zabi-warning-950: #341800
135
- --color-warning-50: var(--zabi-warning-50)
136
- --color-warning-100: var(--zabi-warning-100)
137
- --color-warning-200: var(--zabi-warning-200)
138
- --color-warning-300: var(--zabi-warning-300)
139
- --color-warning-400: var(--zabi-warning-400)
140
- --color-warning-500: var(--zabi-warning-500)
141
- --color-warning-600: var(--zabi-warning-600)
142
- --color-warning-700: var(--zabi-warning-700)
143
- --color-warning-800: var(--zabi-warning-800)
144
- --color-warning-900: var(--zabi-warning-900)
145
- --color-warning-950: var(--zabi-warning-950)
181
+ --zabi-warning-50: #fdf5ec;
182
+ --zabi-warning-100: #fbebda;
183
+ --zabi-warning-200: #f6d7b4;
184
+ --zabi-warning-300: #efbc84;
185
+ --zabi-warning-400: #e49a44;
186
+ --zabi-warning-500: #c67800;
187
+ --zabi-warning-600: #a05f00;
188
+ --zabi-warning-700: #834b00;
189
+ --zabi-warning-800: #663800;
190
+ --zabi-warning-900: #4b2700;
191
+ --zabi-warning-950: #331800;
192
+ --color-warning-50: var(--zabi-warning-50);
193
+ --color-warning-100: var(--zabi-warning-100);
194
+ --color-warning-200: var(--zabi-warning-200);
195
+ --color-warning-300: var(--zabi-warning-300);
196
+ --color-warning-400: var(--zabi-warning-400);
197
+ --color-warning-500: var(--zabi-warning-500);
198
+ --color-warning-600: var(--zabi-warning-600);
199
+ --color-warning-700: var(--zabi-warning-700);
200
+ --color-warning-800: var(--zabi-warning-800);
201
+ --color-warning-900: var(--zabi-warning-900);
202
+ --color-warning-950: var(--zabi-warning-950);
146
203
  /* Error Color Scale — physical ramp + semantic aliases (Tailwind red) */
147
- --zabi-error-50: #fff4f3
148
- --zabi-error-100: #ffe9e6
149
- --zabi-error-200: #ffd2cd
150
- --zabi-error-300: #ffb2ab
151
- --zabi-error-400: #ff877d
152
- --zabi-error-500: #ed564e
153
- --zabi-error-600: #d22828
154
- --zabi-error-700: #b20912
155
- --zabi-error-800: #8c0006
156
- --zabi-error-900: #660002
157
- --zabi-error-950: #460202
158
- --color-error-50: var(--zabi-error-50)
159
- --color-error-100: var(--zabi-error-100)
160
- --color-error-200: var(--zabi-error-200)
161
- --color-error-300: var(--zabi-error-300)
162
- --color-error-400: var(--zabi-error-400)
163
- --color-error-500: var(--zabi-error-500)
164
- --color-error-600: var(--zabi-error-600)
165
- --color-error-700: var(--zabi-error-700)
166
- --color-error-800: var(--zabi-error-800)
167
- --color-error-900: var(--zabi-error-900)
168
- --color-error-950: var(--zabi-error-950)
204
+ --zabi-error-50: #fff4f3;
205
+ --zabi-error-100: #ffe9e6;
206
+ --zabi-error-200: #ffd2cd;
207
+ --zabi-error-300: #ffb2ab;
208
+ --zabi-error-400: #ff877d;
209
+ --zabi-error-500: #ed564e;
210
+ --zabi-error-600: #d22828;
211
+ --zabi-error-700: #b20912;
212
+ --zabi-error-800: #8c0006;
213
+ --zabi-error-900: #660002;
214
+ --zabi-error-950: #460202;
215
+ --color-error-50: var(--zabi-error-50);
216
+ --color-error-100: var(--zabi-error-100);
217
+ --color-error-200: var(--zabi-error-200);
218
+ --color-error-300: var(--zabi-error-300);
219
+ --color-error-400: var(--zabi-error-400);
220
+ --color-error-500: var(--zabi-error-500);
221
+ --color-error-600: var(--zabi-error-600);
222
+ --color-error-700: var(--zabi-error-700);
223
+ --color-error-800: var(--zabi-error-800);
224
+ --color-error-900: var(--zabi-error-900);
225
+ --color-error-950: var(--zabi-error-950);
169
226
  /* Base Color Scale — semantic tokens alias the physical ramp (light: 1:1) */
170
- --color-base-50: var(--zabi-base-50)
171
- --color-base-75: var(--zabi-base-75)
172
- --color-base-100: var(--zabi-base-100)
173
- --color-base-150: var(--zabi-base-150)
174
- --color-base-200: var(--zabi-base-200)
175
- --color-base-250: var(--zabi-base-250)
176
- --color-base-300: var(--zabi-base-300)
177
- --color-base-350: var(--zabi-base-350)
178
- --color-base-400: var(--zabi-base-400)
179
- --color-base-450: var(--zabi-base-450)
180
- --color-base-500: var(--zabi-base-500)
181
- --color-base-550: var(--zabi-base-550)
182
- --color-base-600: var(--zabi-base-600)
183
- --color-base-650: var(--zabi-base-650)
184
- --color-base-700: var(--zabi-base-700)
185
- --color-base-750: var(--zabi-base-750)
186
- --color-base-800: var(--zabi-base-800)
187
- --color-base-850: var(--zabi-base-850)
188
- --color-base-900: var(--zabi-base-900)
189
- --color-base-925: var(--zabi-base-925)
190
- --color-base-950: var(--zabi-base-950)
227
+ --color-base-50: var(--zabi-base-50);
228
+ --color-base-75: var(--zabi-base-75);
229
+ --color-base-100: var(--zabi-base-100);
230
+ --color-base-150: var(--zabi-base-150);
231
+ --color-base-200: var(--zabi-base-200);
232
+ --color-base-250: var(--zabi-base-250);
233
+ --color-base-300: var(--zabi-base-300);
234
+ --color-base-350: var(--zabi-base-350);
235
+ --color-base-400: var(--zabi-base-400);
236
+ --color-base-450: var(--zabi-base-450);
237
+ --color-base-500: var(--zabi-base-500);
238
+ --color-base-550: var(--zabi-base-550);
239
+ --color-base-600: var(--zabi-base-600);
240
+ --color-base-650: var(--zabi-base-650);
241
+ --color-base-700: var(--zabi-base-700);
242
+ --color-base-750: var(--zabi-base-750);
243
+ --color-base-800: var(--zabi-base-800);
244
+ --color-base-850: var(--zabi-base-850);
245
+ --color-base-900: var(--zabi-base-900);
246
+ --color-base-925: var(--zabi-base-925);
247
+ --color-base-950: var(--zabi-base-950);
191
248
  /* Background Colors */
192
249
  /* Surface elevation — four semantic levels, lowest → highest.
193
250
  * base: page/app shell · raised: cards, panels, sidebars · elevated: nested cards, hover/active fills
194
251
  * overlay: modals, sheets, menus, popovers, toasts. Light mode keeps white surfaces + shadows;
195
252
  * dark mode (see .dark) steps each level up in OKLCH lightness because shadows don't read on dark.
253
+ *
254
+ * Light cannot go lighter than white, so the page is a near-white (base-50)
255
+ * and the card, white, is told apart from it by its 1px --color-border edge,
256
+ * not by lightness or a shadow. Nested surfaces step down from the card:
257
+ * elevated and inset (base-100). Enforced by scripts/check-surface-elevation.js:
258
+ * raised and overlay no darker than the page, elevated and inset at least 2
259
+ * points below raised, and the card edge at least 1.2:1 on the page and the card.
260
+ * (Until 8.1 the page was base-150 and the card carried a shadow.)
196
261
  * Keep this block BELOW the "Background Colors" marker: scripts/sync-theme-tokens.js regenerates
197
262
  * everything between the base-scale aliases and that marker. */
198
- --color-surface-base: var(--color-base-100)
199
- --color-surface-raised: #ffffff
200
- --color-surface-elevated: var(--color-base-50)
201
- --color-surface-overlay: #ffffff
263
+ --color-surface-base: var(--color-base-50);
264
+ --color-surface-raised: #ffffff;
265
+ --color-surface-elevated: var(--color-base-100);
266
+ --color-surface-overlay: #ffffff;
267
+ /* Chrome — the surface of bars and sidebars (AppBar, TopNavbar, BottomTabBar,
268
+ * the sidebars). One token so a theme can retint all of them at once. Equal to
269
+ * the page colour in both themes (D108): a bar is flush with the page at
270
+ * rest and takes the material over it once content scrolls under it. Point it
271
+ * at --color-surface-raised for a raised bar fill. */
272
+ --color-surface-chrome: var(--color-surface-base);
273
+ /* Bars (D124), read by .material-bar. The fill at rest, the hairline shown
274
+ * once content is under the bar (decorative, not a guarded edge: the same
275
+ * idea as the material rim), the fill of an on-brand AppBar, and the active
276
+ * tab's pill in the BottomTabBar. */
277
+ --color-bar: var(--color-surface-chrome);
278
+ --color-bar-border: color-mix(in srgb, var(--color-headline) 10%, transparent);
279
+ --color-bar-brand: var(--color-action-primary);
280
+ --color-tabbar-active: var(--color-nav-menu-active);
281
+ /* Inset — a recessed area ON a raised surface (a well, a code sample, a stat
282
+ * strip inside a card). It is the ramp step between the page and the raised
283
+ * surface in both themes, so it always reads as cut into the card, never as
284
+ * floating above it. In dark this is the step the input field already used;
285
+ * --color-input points here. In light it shares base-100 with `elevated`,
286
+ * because below a white card the only direction left is down. */
287
+ --color-surface-inset: var(--color-base-100);
202
288
  /* Hover/active fill for rows and icon buttons inside an overlay (must read above the overlay) */
203
- --color-surface-overlay-hover: var(--color-base-100)
204
- /* 1px edge for overlays: invisible in light (shadow carries elevation), visible in dark */
205
- --color-border-overlay: transparent
206
- --color-background: var(--color-surface-base)
207
- --color-background-secondary: var(--color-base-50)
208
- --color-background-tertiary: var(--color-base-100)
289
+ --color-surface-overlay-hover: var(--color-base-150);
290
+ /* 1px edge for overlays. An ink tint in light, so a white menu on a white
291
+ * card still has an outline where its shadow is thinnest; a solid step in dark. */
292
+ --color-border-overlay: rgba(9, 9, 11, 0.1);
293
+ --color-background: var(--color-surface-base);
294
+ --color-background-secondary: var(--color-base-100);
295
+ /* was base-50, which is now the page itself */
296
+ --color-background-tertiary: var(--color-base-150);
209
297
  /* Page Colors */
210
- --color-page: var(--color-base-100)
211
- --color-page-secondary: var(--color-base-200)
298
+ --color-page: var(--color-surface-base);
299
+ --color-page-secondary: var(--color-base-200);
212
300
  /* Card Colors — aliases of the surface levels (kept for compatibility) */
213
- --color-card: var(--color-surface-raised)
214
- --color-card-hover: var(--color-base-100)
215
- --color-card-active: var(--color-base-100)
216
- --color-card-elevated: var(--color-surface-overlay)
301
+ --color-card: var(--color-surface-raised);
302
+ /* Hover must not read as the page: the page is base-50 now, so base-100 was
303
+ * only ΔE 2.1 from it (the guard wants 2.5). Hover is base-150 (1.18:1 on the
304
+ * white card, ΔE 4.6 from the page), active one step further. */
305
+ --color-card-hover: var(--color-base-150);
306
+ --color-card-active: var(--color-base-200);
307
+ --color-card-elevated: var(--color-surface-overlay);
308
+ /* Card tint — the brand tint as a surface for content (Card tone="tint"): the
309
+ * subtle fill's own step (brand-100), as its own token so an app can move one
310
+ * and not the other. Headline, body, label, description, caption and link
311
+ * hold 4.5:1 on it, and the ring, the field edge and the outline Button's
312
+ * edge 3:1 (a form can sit on it): 15.30, 12.87, 9.02, 6.68, 5.29 and 5.84:1;
313
+ * ring 4.19, field edge 4.17. */
314
+ --color-card-tint: var(--color-brand-100);
315
+ /* Card variant="flat": today's flat fill (the card), opaque. Dark restates it as a translucent step. */
316
+ --color-card-flat: var(--color-card);
317
+ --color-card-flat-hover: var(--color-card-hover);
318
+ --color-card-flat-active: var(--color-card-active);
217
319
  /* Surfaces — numbered aliases (kept for compatibility; prefer surface-base/raised/elevated/overlay) */
218
- --color-surface-1: var(--color-surface-raised)
219
- --color-surface-2: var(--color-surface-elevated)
220
- --color-surface-3: var(--color-base-75)
221
- --color-surface-4: var(--color-base-100)
320
+ --color-surface-1: var(--color-surface-raised);
321
+ --color-surface-2: var(--color-surface-elevated);
322
+ --color-surface-3: var(--color-base-75);
323
+ --color-surface-4: var(--color-base-100);
222
324
  /* Control track — the unselected rail of a Toggle or switch. A real token
223
325
  * rather than a raw ramp step, so the hover/active direction is defined once
224
326
  * and inverts correctly with the theme. */
225
- --color-control-track: var(--color-base-400)
226
- --color-control-track-hover: var(--color-base-450)
227
- --color-control-track-active: var(--color-base-500)
327
+ --color-control-track: var(--color-base-400);
328
+ --color-control-track-hover: var(--color-base-450);
329
+ --color-control-track-active: var(--color-base-500);
330
+ /* Toggle track — the off switch. The shared control track above is a mid
331
+ * grey (base-400) that reads as disabled, so the switch has its own: a light
332
+ * tint, with its edge doing the 3:1 work (WCAG 1.4.11), which a fill this
333
+ * light cannot. The edge is the field edge, 4.63:1 on the page and 4.83:1 on
334
+ * a card. Slider and Progress keep the shared track. */
335
+ --color-toggle-track: var(--color-base-200);
336
+ --color-toggle-track-hover: var(--color-base-250);
337
+ --color-toggle-track-active: var(--color-base-300);
338
+ --color-toggle-track-border: var(--color-input-border);
339
+ /* Toggle knob, by default 3:1 or more on every track fill it sits on (WCAG
340
+ * 1.4.11). Off, a dark knob on the light track: base-500 is 3.81:1 on the
341
+ * resting track, 3.53:1 hovered and 3.27:1 pressed. On, the label colour of
342
+ * the primary fill: 4.86:1 at rest, 6.76:1 hovered and 9.44:1 pressed. The consumer's
343
+ * own `--color-toggle-thumb` and `--color-toggle-thumb-checked` (declared
344
+ * nowhere) come first; see `.bg-toggle-thumb`. */
345
+ --color-toggle-knob: var(--color-base-500);
346
+ --color-toggle-knob-checked: var(--color-action-primary-text);
347
+ /* Progress — the bar of Progress. The fill is the primary action, so it
348
+ * follows a pinned primary; the track is the field fill it always was. */
349
+ --color-progress-fill: var(--color-action-primary);
350
+ --color-progress-track: var(--color-input);
351
+ /* The edge of the track. The default track is the field fill (white on the
352
+ * white card), 1.00:1 on the card and 1.04:1 on the page, so its edge is the
353
+ * field edge, 3:1 on both (the guard holds it). An app whose own track
354
+ * already reaches 3:1 sets this to `transparent`; createTheme does that when
355
+ * it overrides the track. */
356
+ --color-progress-track-border: var(--color-input-border);
228
357
  /* Interaction fills — surface-relative on purpose.
229
358
  * A hard-coded ramp step (e.g. base-100) can coincide exactly with the
230
359
  * surface it sits on, which is how ghost hover became invisible: in dark
231
360
  * mode --color-base-100 IS --color-surface-base. An alpha tint is always
232
361
  * one step away from whatever is underneath it. */
233
- --color-surface-hover: rgba(9, 9, 11, 0.06)
234
- --color-surface-active: rgba(9, 9, 11, 0.11)
362
+ --color-surface-hover: rgba(9, 9, 11, 0.09);
363
+ --color-surface-active: rgba(9, 9, 11, 0.15);
235
364
  /* Overlay Colors */
236
- --color-overlay: rgba(0, 0, 0, 0.5)
365
+ --color-overlay: rgba(0, 0, 0, 0.5);
237
366
  /* Input Colors
238
367
  * The field is a RAISED surface, not a grey well — a grey fill on a grey
239
368
  * page reads as disabled. The disabled state is the only grey field. */
240
- --color-input: var(--color-surface-raised)
241
- --color-input-border: var(--color-base-350)
242
- --color-input-hover: var(--color-base-150)
243
- --color-input-focus: var(--color-surface-raised)
244
- --color-input-disabled: var(--color-base-100)
369
+ --color-input: var(--color-surface-raised);
370
+ /* The edge of a form field (WCAG 1.4.11): 3:1 on the field fill, the page and
371
+ * the card, held by the contrast guard. base-500 is 4.83:1 on white and
372
+ * 4.10:1 on the page; base-450 was 2.94:1 on the page, base-350 1.93:1. */
373
+ --color-input-border: var(--color-base-500);
374
+ /* Hover edge for a field. Light-mode hover is meant to be carried by the
375
+ * border, not by greying the fill; dark keeps its fill step and leaves this
376
+ * equal to the resting border. One step past the resting edge. */
377
+ --color-input-border-hover: var(--color-base-550);
378
+ /* One step off white, and the same step the card hover uses. */
379
+ --color-input-hover: var(--color-base-100);
380
+ /* Pressed, for a field that is pressed rather than typed in: the Select
381
+ * trigger. It borrowed the hover step, 1.10:1 against the resting field,
382
+ * when every other pressed fill is 1.26:1 or more. Derived from the field,
383
+ * not a fixed ramp step: an app that sets the card (and so the field) to
384
+ * another colour through createTheme overrides would otherwise land its
385
+ * field on top of a fixed step (base-200 was 1.21:1 against a base-50 field
386
+ * of #f8faff, below the 1.25 the generator holds). 12% of the ink into the
387
+ * field is the smallest whole percent that keeps the three pairs: 1.25:1
388
+ * against the field (11% is the floor), body and placeholder 4.5:1 on it.
389
+ * Default theme: #e3e3e4 (was #e4e4e7); on a #f8faff field with the
390
+ * ink at 12%: 1.28:1 against it. */
391
+ --color-input-active: color-mix(in srgb, var(--zabi-base-900) 12%, var(--color-input));
392
+ --color-input-focus: var(--color-surface-raised);
393
+ /* The only grey field. It was the page colour; the page is now near white
394
+ * (1.04:1 against the white field), so it takes base-150, 1.18:1 on the field
395
+ * as before. Dark still uses the dark page (base-100). */
396
+ --color-input-disabled: var(--color-base-150);
397
+ /* Light fields are opaque already: inside a colour block they stay as they are. The dark
398
+ * theme restates these as opaque steps (see there). */
399
+ --color-input-solid: var(--color-input);
400
+ --color-input-solid-hover: var(--color-input-hover);
401
+ --color-input-solid-focus: var(--color-input-focus);
402
+ --color-input-solid-active: var(--color-input-active);
245
403
  /* Text Colors */
246
- --color-headline: var(--color-base-900)
247
- --color-body: var(--color-base-800)
248
- --color-description: var(--color-base-600)
249
- --color-caption: var(--color-base-550)
404
+ --color-headline: var(--color-base-900);
405
+ --color-body: var(--color-base-800);
406
+ --color-description: var(--color-base-600);
407
+ --color-caption: var(--color-base-550);
250
408
  /* ≥ 4.5:1 on every surface level (base-500 was 4.40 on surface-base) */
251
- --color-input-placeholder: var(--color-base-500)
252
- --color-label: var(--color-base-700)
409
+ /* Placeholder text, and the format hint of an empty DateField or TimeField.
410
+ * It is text someone has to read, so it is held to 4.5:1 on every fill a
411
+ * field can show: resting, hover, focus and pressed. base-500 was 4.83:1 on
412
+ * the white field but 4.40:1 on the hover fill and 3.81:1 on the pressed
413
+ * one; base-550 is 6.13, 5.58 and 4.83. The value text (--color-body) stays
414
+ * 2.4:1 stronger, so an empty field still reads as empty. */
415
+ --color-input-placeholder: var(--color-base-550);
416
+ --color-label: var(--color-base-700);
253
417
  /* brand-600 clears 4.5:1 on a card but only 4.42:1 on the page surface, so
254
418
  * links sit one step darker. */
255
- --color-link: var(--color-brand-700)
256
- --color-link-hover: var(--color-brand-800)
419
+ --color-link: var(--color-brand-700);
420
+ --color-link-hover: var(--color-brand-800);
257
421
  /* Navigation menu item — menubar triggers, menu links, inline/sidebar nav rows */
258
- --color-nav-menu-item: var(--color-body)
259
- --color-nav-menu-item-hover: var(--color-headline)
260
- --color-nav-menu-item-active: var(--color-link)
422
+ --color-nav-menu-item: var(--color-body);
423
+ --color-nav-menu-item-hover: var(--color-headline);
424
+ --color-nav-menu-item-active: var(--color-link);
261
425
  /* Surface-relative on purpose: base-100 IS surface-base in both themes,
262
426
  * so the old value made sidebar row hover do nothing at all. */
263
- --color-nav-menu-hover: var(--color-surface-hover)
264
- --color-nav-menu-active: var(--color-action-primary-subtle)
265
- --color-nav-menu-active-hover: var(--color-action-primary-subtle-hover)
266
- --color-nav-menu-focus: var(--color-brand-500)
267
- --color-success-text: var(--color-pine-700)
268
- --color-warning-text: var(--color-warning-700)
269
- --color-neutral-text: var(--color-base-700)
270
- --color-energetic-text: var(--color-citron-700)
271
- --color-error-text: var(--color-error-700)
272
- --color-inverse: var(--color-base-100)
273
- --color-disabled: var(--color-base-400)
427
+ --color-nav-menu-hover: var(--color-surface-hover);
428
+ --color-nav-menu-active: var(--color-action-primary-subtle);
429
+ --color-nav-menu-active-hover: var(--color-action-primary-subtle-hover);
430
+ --color-nav-menu-focus: var(--color-focus);
431
+ --color-success-text: var(--color-pine-700);
432
+ --color-warning-text: var(--color-warning-700);
433
+ --color-neutral-text: var(--color-base-700);
434
+ --color-energetic-text: var(--color-citron-700);
435
+ --color-error-text: var(--color-error-700);
436
+ --color-inverse: var(--color-base-100);
437
+ --color-disabled: var(--color-base-400);
274
438
  /* Border Colors */
275
- --color-border: var(--color-base-300)
276
- --color-border-weak: var(--color-base-300)
277
- --color-border-medium: var(--color-base-400)
278
- --color-border-strong: var(--color-base-500)
279
- /* Focus Colors */
280
- --color-focus: var(--color-brand-500)
281
- --color-focus-weak: var(--color-brand-600)
282
- --color-focus-medium: var(--color-brand-700)
283
- --color-focus-strong: var(--color-brand-800)
439
+ --color-border: var(--color-base-300);
440
+ --color-border-weak: var(--color-base-300);
441
+ --color-border-medium: var(--color-base-400);
442
+ --color-border-strong: var(--color-base-500);
443
+ /* Control boundary — the edge of a control that has nothing else to be seen
444
+ * by, such as the outline of an empty Rating star (its first user).
445
+ * WCAG 1.4.11 asks 3:1 for it against whatever it sits on, so it is held to
446
+ * 3:1 on every surface level in both themes (scripts/check-contrast.js).
447
+ * The decorative edges above are not: --color-border-strong is the mirror's
448
+ * fixed point, the same grey in both themes, and is 2.49:1 on the dark
449
+ * elevated surface and 1.98:1 on the dark overlay. .dark pins this one step
450
+ * lighter for that reason. */
451
+ --color-control-border: var(--color-base-500);
452
+ /* Segmented control thumb (tone neutral): the selected segment, a card-coloured
453
+ * piece on the tinted track. The edge is what identifies it (WCAG 1.4.11), as
454
+ * the 1.1:1 fill step alone would not. It is the control boundary, which dark
455
+ * lifts a step (base-600) because the input edge is only 2.4:1 on this track; it is held to 3:1 against the track
456
+ * over the page and over a card (scripts/contrast-pairs.js). */
457
+ --color-segment-thumb: var(--color-surface-raised);
458
+ --color-segment-thumb-text: var(--color-headline);
459
+ --color-segment-thumb-border: var(--color-control-border);
460
+ /* Focus Colors
461
+ * brand-600, not brand-500: a focus indicator needs 3:1 against what is
462
+ * around it, and brand-500 was 2.99:1 on the page. brand-600 is also the
463
+ * primary button fill, so on a primary button the ring is separated by its
464
+ * 2px offset gap (--color-focus-ring-offset), which .focus-ring always draws.
465
+ * .dark restates the same steps; the mirror makes them --zabi-brand-400 and up. */
466
+ --color-focus: var(--color-brand-600);
467
+ --color-focus-weak: var(--color-brand-700);
468
+ --color-focus-medium: var(--color-brand-800);
469
+ --color-focus-strong: var(--color-brand-900);
284
470
  /* Aliases for `ring-focus-ring`, `.focus-ring`, and form utils */
285
- --color-focus-ring: var(--color-focus)
286
- --color-focus-ring-offset: var(--color-card)
471
+ --color-focus-ring: var(--color-focus);
472
+ --color-focus-ring-offset: var(--color-card);
473
+ /* `.focus-ring--muted`: the neutral ring of a ghost or link control, quiet
474
+ * by having no hue, not by having less contrast. The rule used to read
475
+ * --color-base-500 directly, which does not move between themes: 4.1:1 or
476
+ * more in light, 2.49:1 on the dark elevated surface. .dark pins it one step
477
+ * lighter; it is held to 3:1 on every surface level in both themes. */
478
+ --color-focus-ring-muted: var(--color-base-500);
479
+ /* `.focus-ring--danger`: the ring of a destructive control. It is the error
480
+ * colour; a role of its own so that a brand or accent block can re-point
481
+ * it with the other rings (the error colour is about 1:1 on a brand fill,
482
+ * and a focused danger Button there showed no ring). */
483
+ --color-focus-ring-danger: var(--color-error);
287
484
  /* Primary Colors */
288
- --color-primary: var(--color-brand-600)
289
- --color-primary-weak: var(--color-brand-700)
290
- --color-primary-medium: var(--color-brand-800)
291
- --color-primary-strong: var(--color-brand-900)
485
+ --color-primary: var(--color-brand-600);
486
+ --color-primary-weak: var(--color-brand-700);
487
+ --color-primary-medium: var(--color-brand-800);
488
+ --color-primary-strong: var(--color-brand-900);
292
489
  /* Secondary Colors */
293
- --color-secondary: var(--color-base-600)
294
- --color-secondary-weak: var(--color-base-700)
295
- --color-secondary-medium: var(--color-base-800)
296
- --color-secondary-strong: var(--color-base-900)
490
+ --color-secondary: var(--color-base-600);
491
+ --color-secondary-weak: var(--color-base-700);
492
+ --color-secondary-medium: var(--color-base-800);
493
+ --color-secondary-strong: var(--color-base-900);
297
494
  /* ----------------------------------------------------------------
298
495
  * SEMANTIC FAMILIES
299
496
  * Every family resolves to the SAME step on the shared lightness curve, so
@@ -304,8 +501,8 @@
304
501
  * <family>-weak step 700 pressed / emphasis
305
502
  * <family>-medium step 800 strongest fill
306
503
  * <family>-strong step 900 darkest
307
- * <family>-subtle step 100 tinted fill (badges, alerts)
308
- * <family>-border step 200 tinted edge
504
+ * <family>-subtle step 100 tinted fill (badges, alerts); .dark restates step 100
505
+ * <family>-border step 200 tinted edge; .dark restates step 200
309
506
  * <family>-text step 700 text on a subtle fill or a page surface
310
507
  *
311
508
  * Warning, error and energetic previously sat at step 500 — the mirror's
@@ -314,57 +511,74 @@
314
511
  * and fine in dark.
315
512
  * ---------------------------------------------------------------- */
316
513
  /* Success Colors */
317
- --color-success: var(--color-pine-600)
318
- --color-success-weak: var(--color-pine-700)
319
- --color-success-medium: var(--color-pine-800)
320
- --color-success-strong: var(--color-pine-900)
321
- --color-success-subtle: var(--color-pine-100)
322
- --color-success-border: var(--color-pine-200)
514
+ --color-success: var(--color-pine-600);
515
+ --color-success-weak: var(--color-pine-700);
516
+ --color-success-medium: var(--color-pine-800);
517
+ --color-success-strong: var(--color-pine-900);
518
+ --color-success-subtle: var(--color-pine-100);
519
+ --color-success-border: var(--color-pine-200);
323
520
  /* Warning Colors */
324
- --color-warning: var(--color-warning-600)
325
- --color-warning-weak: var(--color-warning-700)
326
- --color-warning-medium: var(--color-warning-800)
327
- --color-warning-strong: var(--color-warning-900)
328
- --color-warning-subtle: var(--color-warning-100)
329
- --color-warning-border: var(--color-warning-200)
521
+ --color-warning: var(--color-warning-600);
522
+ --color-warning-weak: var(--color-warning-700);
523
+ --color-warning-medium: var(--color-warning-800);
524
+ --color-warning-strong: var(--color-warning-900);
525
+ --color-warning-subtle: var(--color-warning-100);
526
+ --color-warning-border: var(--color-warning-200);
330
527
  /* Error Colors */
331
- --color-error: var(--color-error-600)
332
- --color-error-weak: var(--color-error-700)
333
- --color-error-medium: var(--color-error-800)
334
- --color-error-strong: var(--color-error-900)
335
- --color-error-subtle: var(--color-error-100)
336
- --color-error-border: var(--color-error-200)
528
+ --color-error: var(--color-error-600);
529
+ --color-error-weak: var(--color-error-700);
530
+ --color-error-medium: var(--color-error-800);
531
+ --color-error-strong: var(--color-error-900);
532
+ --color-error-subtle: var(--color-error-100);
533
+ --color-error-border: var(--color-error-200);
337
534
  /* Energetic Colors (Citron) */
338
- --color-energetic: var(--color-citron-600)
339
- --color-energetic-weak: var(--color-citron-700)
340
- --color-energetic-medium: var(--color-citron-800)
341
- --color-energetic-strong: var(--color-citron-900)
342
- --color-energetic-subtle: var(--color-citron-100)
343
- --color-energetic-border: var(--color-citron-200)
535
+ --color-energetic: var(--color-citron-600);
536
+ --color-energetic-weak: var(--color-citron-700);
537
+ --color-energetic-medium: var(--color-citron-800);
538
+ --color-energetic-strong: var(--color-citron-900);
539
+ --color-energetic-subtle: var(--color-citron-100);
540
+ --color-energetic-border: var(--color-citron-200);
541
+ /* Accent Colors — the second brand colour, on --zabi-accent-* (citron by
542
+ * default). The same recipe as the primary action: fill at 600, hover 700,
543
+ * active 800, so "more pressed" is "more contrast" in both themes; tint,
544
+ * edge and text as in the families above. `energetic` keeps pointing at
545
+ * citron itself and does not move when an app re-colours the accent. */
546
+ --color-accent: var(--color-accent-600);
547
+ --color-accent-hover: var(--color-accent-700);
548
+ --color-accent-active: var(--color-accent-800);
549
+ --color-accent-subtle: var(--color-accent-100);
550
+ --color-accent-border: var(--color-accent-200);
551
+ --color-accent-text: var(--color-accent-700);
552
+ /* Label on a solid accent fill — see "on brand" below for the two knobs. */
553
+ --zabi-on-accent: #ffffff;
554
+ --zabi-on-accent-dark: var(--zabi-accent-950);
555
+ --color-on-accent: var(--zabi-on-accent);
344
556
  /* Neutral Colors
345
557
  * The base ramp is wider than the chromatic ones on purpose (it also drives
346
558
  * text, borders and surfaces), so neutral cannot sit on exactly the same
347
559
  * step. base-550 is the closest match to the chromatic 600s that still
348
560
  * clears AA; .dark pins base-600, because base-500 is the mirror's fixed
349
561
  * point and would not invert at all. */
350
- --color-neutral: var(--color-base-550)
351
- --color-neutral-weak: var(--color-base-600)
352
- --color-neutral-medium: var(--color-base-700)
353
- --color-neutral-strong: var(--color-base-900)
354
- /* base-200, not base-100: base-100 IS surface-base, which made a neutral
355
- * badge measure 1.00:1 against the page and read as bare text. */
356
- --color-neutral-subtle: var(--color-base-200)
357
- --color-neutral-border: var(--color-base-200)
562
+ --color-neutral: var(--color-base-550);
563
+ --color-neutral-weak: var(--color-base-600);
564
+ --color-neutral-medium: var(--color-base-700);
565
+ --color-neutral-strong: var(--color-base-900);
566
+ /* Visibly past the page (base-50, 1.20:1) and the card (1.27:1). It was
567
+ * base-100 once, which IS the dark page and made a neutral badge measure
568
+ * 1.00:1 and read as bare text; base-150 is only 1.13:1 on the page. The
569
+ * border is a step darker than the fill, like every other family. */
570
+ --color-neutral-subtle: var(--color-base-200);
571
+ --color-neutral-border: var(--color-base-250);
358
572
  /* Info Colors */
359
- --color-info: var(--color-iris-600)
360
- --color-info-weak: var(--color-iris-700)
361
- --color-info-medium: var(--color-iris-800)
362
- --color-info-strong: var(--color-iris-900)
363
- --color-info-active: var(--color-iris-400)
364
- --color-info-subtle: var(--color-iris-100)
365
- --color-info-border: var(--color-iris-200)
573
+ --color-info: var(--color-iris-600);
574
+ --color-info-weak: var(--color-iris-700);
575
+ --color-info-medium: var(--color-iris-800);
576
+ --color-info-strong: var(--color-iris-900);
577
+ --color-info-active: var(--color-iris-400);
578
+ --color-info-subtle: var(--color-iris-100);
579
+ --color-info-border: var(--color-iris-200);
366
580
  /* Text alias */
367
- --color-info-text: var(--color-iris-700)
581
+ --color-info-text: var(--color-iris-700);
368
582
  /* ========================================
369
583
  ACTION COLORS - For interactive elements (buttons, links, etc.)
370
584
  ======================================== */
@@ -377,56 +591,234 @@
377
591
  * contrast against the page" in both themes. Never point active at a step on
378
592
  * the far side of the ramp: active used to be brand-400 against a brand-50
379
593
  * label, which is 1.66:1 — the label vanished while the button was held. */
380
- --color-action-primary: var(--color-brand-600)
381
- --color-action-primary-hover: var(--color-brand-700)
382
- --color-action-primary-active: var(--color-brand-800)
383
- --color-action-primary-subtle: var(--color-brand-100)
384
- --color-action-primary-subtle-hover: var(--color-brand-200)
385
- /* Pinned rather than aliased to brand-50: the ramp's lightest tint lands at
386
- * exactly 4.50:1 on brand-600 — passing, but with no margin. Pure white
387
- * gives 4.86:1. The .dark block pins the inverse. */
388
- --color-action-primary-text: #ffffff
594
+ --color-action-primary: var(--color-brand-600);
595
+ --color-action-primary-hover: var(--color-brand-700);
596
+ --color-action-primary-active: var(--color-brand-800);
597
+ --color-action-primary-subtle: var(--color-brand-100);
598
+ --color-action-primary-subtle-hover: var(--color-brand-200);
599
+ /* Edge of a subtle brand badge when `bordered`; the tint's own darker step. */
600
+ --color-action-primary-border: var(--color-brand-200);
601
+ /* Held down, on a control whose resting fill is the subtle one: a toggled-on
602
+ * ghost IconButton. It used the hover step, which is 1.24:1 against the
603
+ * resting fill and, with a mouse, is what the button already shows. Half a
604
+ * step past hover is 1.42:1 against resting, and the icon (--color-link)
605
+ * keeps 3.50:1 on it; a whole step would leave the icon at 3.01:1. */
606
+ --color-action-primary-subtle-active: color-mix(in srgb, var(--color-brand-300) 50%, var(--color-brand-200));
607
+ /* "On brand" — the label on a primary fill.
608
+ * White rather than brand-50: the ramp's lightest tint lands at exactly
609
+ * 4.50:1 on brand-600 — passing, but with no margin. Pure white gives 4.86:1.
610
+ * Dark has the same fill (step 600, physical) and the same label: white on
611
+ * it is 4.76:1 on any ramp, since every ramp is on one lightness curve.
612
+ *
613
+ * A light brand (amber, yellow) cannot carry white text, so both values are
614
+ * knobs an app sets once on :root, like the ramps:
615
+ * --zabi-on-brand label in light mode
616
+ * --zabi-on-brand-dark label in dark mode: follows the light label (white),
617
+ * since the dark fill is the same step; set it to a dark
618
+ * one for a pale dark primary
619
+ * --color-on-brand is the role, remapped by .dark; components keep using
620
+ * --color-action-primary-text, which follows it. */
621
+ --zabi-on-brand: #ffffff;
622
+ --zabi-on-brand-dark: var(--zabi-on-brand);
623
+ --color-on-brand: var(--zabi-on-brand);
624
+ --color-action-primary-text: var(--color-on-brand);
389
625
  /* Secondary Actions - Used by bg-action-secondary utility class
390
626
  * A neutral alpha tint: reads as a real button on any surface level, and
391
627
  * cannot collide with the background the way a fixed ramp step can. The old
392
628
  * 10%-brand wash was so pale it barely registered as a control. */
393
- --color-action-secondary: rgba(9, 9, 11, 0.07)
394
- --color-action-secondary-hover: rgba(9, 9, 11, 0.12)
395
- --color-action-secondary-active: rgba(9, 9, 11, 0.17)
396
- --color-action-secondary-subtle: var(--color-base-100)
397
- --color-action-secondary-subtle-hover: var(--color-base-200)
398
- --color-action-secondary-text: var(--color-headline)
629
+ --color-action-secondary: rgba(9, 9, 11, 0.1);
630
+ --color-action-secondary-hover: rgba(9, 9, 11, 0.15);
631
+ --color-action-secondary-active: rgba(9, 9, 11, 0.2);
632
+ --color-action-secondary-subtle: var(--color-base-100);
633
+ --color-action-secondary-subtle-hover: var(--color-base-200);
634
+ --color-action-secondary-text: var(--color-headline);
635
+ /* Tonal Actions - Used by bg-action-tonal utility class.
636
+ * A brand-tinted fill with the brand as its label: the quieter action beside
637
+ * a primary, and a chosen answer. It is the subtle tint (brand-100) and its
638
+ * own hover (brand-200) and pressed steps (halfway to brand-300, like the
639
+ * toggled-on ghost button; 1.30:1 against the resting fill). The label is
640
+ * brand-800, the lightest step that holds 4.5:1 on all three fills for any
641
+ * brand, not only the default: step 700 does on the default brand (5.84,
642
+ * 4.97, 4.48:1) but fails the pressed fill by 0.02, and by more on a
643
+ * saturated blue (4.39:1 for #0026EA). 800 gives 8.15, 6.94 and 6.25:1. */
644
+ --color-action-tonal: var(--color-action-primary-subtle);
645
+ --color-action-tonal-hover: var(--color-action-primary-subtle-hover);
646
+ --color-action-tonal-active: color-mix(in srgb, var(--color-brand-300) 50%, var(--color-brand-200));
647
+ --color-action-tonal-text: var(--color-brand-800);
648
+ /* Chip - the filter and choice pill (Chip). At rest a quiet neutral fill that
649
+ * shows on the page and on a card without an edge: base-200 is 1.22:1 on the
650
+ * page and 1.27:1 on the card, hover base-300 and pressed base-350 (1.42 and
651
+ * 1.85 on the page). The label is the headline, 4.5:1 or more on all three
652
+ * (13.96, 11.99 and 9.18:1). */
653
+ --color-chip: var(--color-base-200);
654
+ --color-chip-hover: var(--color-base-300);
655
+ --color-chip-active: var(--color-base-350);
656
+ --color-chip-text: var(--color-headline);
657
+ /* A selected chip is tonal, in both modes (never solid): its own tokens,
658
+ * pointing at the tonal role, so an app that themes tonal gets matching chips
659
+ * and one that wants another selected look sets these. */
660
+ --color-chip-selected: var(--color-action-tonal);
661
+ --color-chip-selected-hover: var(--color-action-tonal-hover);
662
+ --color-chip-selected-active: var(--color-action-tonal-active);
663
+ --color-chip-selected-text: var(--color-action-tonal-text);
664
+ /* Outline Actions - the edge of an outline Button. The border role was the
665
+ * card edge, 1.25:1 on the page: a label in a ghost box. This is the field
666
+ * edge (base-500), already held to 3:1 on the field, the page and a card. */
667
+ --color-action-outline-border: var(--color-input-border);
668
+ --color-action-outline-border-hover: var(--color-input-border-hover);
399
669
  /* Disabled Actions - shared by every variant.
400
670
  * Disabled must be the QUIETEST state, never a brighter colour than the
401
671
  * enabled secondary. It used to be brand-500 plus opacity-50, which made a
402
672
  * disabled primary lighter and more colourful than an enabled secondary. */
403
- --color-action-disabled: var(--color-base-200)
404
- --color-action-disabled-text: var(--color-base-500)
405
- --color-action-disabled-border: var(--color-base-250)
673
+ --color-action-disabled: var(--color-base-250);
674
+ --color-action-disabled-text: var(--color-base-500);
675
+ --color-action-disabled-border: var(--color-base-300);
406
676
  /* Danger Actions - Used by bg-action-danger utility class.
407
677
  * Same ramp step as every other family, so the destructive action no longer
408
678
  * out-shouts the primary one. The bright red is spent on hover, where the
409
679
  * user is already committing. */
410
- --color-action-danger: var(--color-error-600)
411
- --color-action-danger-hover: var(--color-error-700)
412
- --color-action-danger-active: var(--color-error-800)
413
- --color-action-danger-subtle: var(--color-error-100)
414
- --color-action-danger-subtle-hover: var(--color-error-200)
415
- --color-action-danger-text: var(--color-error-50)
416
- /* Shadow Colors */
417
- --shadow-color: 0 0 0
418
- --shadow-opacity: 0.1
419
- --shadow-sm: 0 1px 3px 0 rgb(var(--shadow-color) / var(--shadow-opacity)), 0 1px 2px -1px rgb(var(--shadow-color) / var(--shadow-opacity))
420
- --shadow-md: 0 4px 6px -1px rgb(var(--shadow-color) / var(--shadow-opacity)), 0 2px 4px -2px rgb(var(--shadow-color) / var(--shadow-opacity))
421
- --shadow-lg: 0 10px 15px -3px rgb(var(--shadow-color) / var(--shadow-opacity)), 0 4px 6px -4px rgb(var(--shadow-color) / var(--shadow-opacity))
422
- --shadow-xl: 0 20px 25px -5px rgb(var(--shadow-color) / var(--shadow-opacity)), 0 8px 10px -6px rgb(var(--shadow-color) / var(--shadow-opacity))
680
+ --color-action-danger: var(--color-error-600);
681
+ --color-action-danger-hover: var(--color-error-700);
682
+ --color-action-danger-active: var(--color-error-800);
683
+ --color-action-danger-subtle: var(--color-error-100);
684
+ --color-action-danger-subtle-hover: var(--color-error-200);
685
+ /* The same for a toggled-on danger-tone IconButton: hover was 1.18:1 against
686
+ * the resting fill. Half a step past it is 1.32:1, and the icon
687
+ * (--color-error) keeps 3.36:1; on the whole step it is exactly 3.00. Dark needs no override:
688
+ * the same expression resolves through the mirrored steps. */
689
+ --color-action-danger-subtle-active: color-mix(in srgb, var(--color-error-300) 50%, var(--color-error-200));
690
+ --color-action-danger-text: var(--color-error-50);
691
+ /* Shadow Colors
692
+ * Light elevation is carried by the shadow, so it is the ramp's own ink
693
+ * (base-900). Every step is two layers: a tight contact shadow
694
+ * (--shadow-opacity-contact) that grounds the edge and a wider, softer
695
+ * ambient one (--shadow-opacity) that carries the distance. Until 8.1 both
696
+ * layers shared one flat 14%; the 8.1 values are in CHANGELOG.md. */
697
+ --shadow-color: 24 24 27;
698
+ --shadow-opacity: 0.1;
699
+ --shadow-opacity-contact: 0.06;
700
+ --shadow-sm: 0 1px 2px 0 rgb(var(--shadow-color) / var(--shadow-opacity-contact)), 0 2px 6px -1px rgb(var(--shadow-color) / var(--shadow-opacity));
701
+ --shadow-md: 0 1px 3px 0 rgb(var(--shadow-color) / var(--shadow-opacity-contact)), 0 6px 14px -2px rgb(var(--shadow-color) / var(--shadow-opacity));
702
+ --shadow-lg: 0 1px 2px 0 rgb(var(--shadow-color) / var(--shadow-opacity-contact)), 0 10px 30px 0 rgb(var(--shadow-color) / var(--shadow-opacity));
703
+ --shadow-xl: 0 2px 4px 0 rgb(var(--shadow-color) / var(--shadow-opacity-contact)), 0 20px 50px -8px rgb(var(--shadow-color) / var(--shadow-opacity));
704
+ /* What a material (glass) casts: the lg step. Its own name so a theme can
705
+ * retune glass without moving every floating surface. */
706
+ --shadow-material: 0 1px 2px 0 rgb(var(--shadow-color) / var(--shadow-opacity-contact)), 0 10px 30px 0 rgb(var(--shadow-color) / var(--shadow-opacity));
707
+ /* Motion
708
+ * Four durations and three curves. Tailwind's default transition reads
709
+ * --duration-base and --ease-standard, so every `transition-*` class that
710
+ * sets no duration of its own follows them (150ms, as before; the curve is
711
+ * new). `ease-standard`, `ease-out` and `ease-spring` are utilities;
712
+ * durations are used as `duration-(--duration-moderate)`. --ease-out is
713
+ * Tailwind's own name and value. --ease-spring is a lightly damped spring
714
+ * (one overshoot of about 5%, settled by the end): the cubic-bezier is the
715
+ * fallback, and the @supports block after @theme upgrades it to linear().
716
+ * prefers-reduced-motion re-points all of them (see @motion-reduced). */
717
+ --duration-fast: 100ms;
718
+ --duration-base: 150ms;
719
+ --duration-moderate: 200ms;
720
+ --duration-slow: 300ms;
721
+ --ease-standard: cubic-bezier(0.2, 0, 0, 1);
722
+ --ease-out: cubic-bezier(0, 0, 0.2, 1);
723
+ --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
724
+ --default-transition-duration: var(--duration-base);
725
+ --default-transition-timing-function: var(--ease-standard);
726
+ /* Materials — the frosted layer for what floats over content (bars, sheets,
727
+ * menus). Used through .material-thin|regular|thick (below), never a raw
728
+ * backdrop-blur. A material is a surface at partial alpha, so it is judged
729
+ * over the worst backdrop of the mode, not alone: the alpha floors are
730
+ * enforced by scripts/check-contrast.js (see scripts/contrast-pairs.js,
731
+ * MATERIALS) and by createTheme for an app's own theme. Each alpha is the
732
+ * smallest whole 2% that passes every pair its level carries, plus a little
733
+ * margin (floors against the page-colour chrome: thin 50 / 30, regular 82 / 47,
734
+ * thick 84 / 68, light / dark; light thick has 4 points because a tinted neutral (neutralChroma 0.08) needs 87; dark is judged on the dimmed backdrop, below):
735
+ * thin headline (a control on a bar: an icon, a short label;
736
+ * its focus ring is drawn outside it)
737
+ * regular + body, label, focus ring (bars, the tab bar, a floating sidebar)
738
+ * thick + description, caption (sheets, menus, modals, toasts, tooltips)
739
+ * Dark's worst backdrop is near-white, which its surfaces are close to. The
740
+ * dark filter therefore also dims the backdrop (--material-backdrop-brightness,
741
+ * 0.6: brightness() multiplies the sRGB channels), so the brightest thing
742
+ * that can be behind dark glass is near-white times 0.6, and the guard measures
743
+ * that. It is true to the rendering because the dimming and the translucent
744
+ * fill are switched together: every fallback below drops the filter and makes
745
+ * the fill opaque. Light is brightness(1), an identity.
746
+ * The fallbacks (reduced transparency, more contrast, forced colors, no
747
+ * backdrop-filter, data-materials="opaque") are below the .dark rule. */
748
+ --material-alpha-thin: 58%;
749
+ --material-alpha-regular: 84%;
750
+ --material-alpha-thick: 88%;
751
+ --color-material-thin: color-mix(in srgb, var(--color-surface-chrome) var(--material-alpha-thin), transparent);
752
+ --color-material-regular: color-mix(in srgb, var(--color-surface-chrome) var(--material-alpha-regular), transparent);
753
+ --color-material-thick: color-mix(in srgb, var(--color-surface-overlay) var(--material-alpha-thick), transparent);
754
+ --material-blur-thin: 16px;
755
+ --material-blur-regular: 24px;
756
+ --material-blur-thick: 32px;
757
+ --material-saturate: 180%;
758
+ /* What the filter does to the backdrop's brightness (a number): 1 in light,
759
+ * where it is an identity; below 1 in dark, which dims what shows through the
760
+ * glass. The alpha floors are measured on the dimmed backdrop. */
761
+ --material-backdrop-brightness: 1;
762
+ --material-filter-thin: blur(var(--material-blur-thin)) saturate(var(--material-saturate)) brightness(var(--material-backdrop-brightness));
763
+ --material-filter-regular: blur(var(--material-blur-regular)) saturate(var(--material-saturate)) brightness(var(--material-backdrop-brightness));
764
+ --material-filter-thick: blur(var(--material-blur-thick)) saturate(var(--material-saturate)) brightness(var(--material-backdrop-brightness));
765
+ /* The light top edge and the 1px outline, from the neutral ramp so a
766
+ * neutral override tints them. */
767
+ --color-material-highlight: color-mix(in srgb, var(--zabi-base-50) 60%, transparent);
768
+ --color-material-rim: color-mix(in srgb, var(--zabi-base-900) 9%, transparent);
769
+ /* Gradients (D99). Contrast is never measured against a gradient: each one
770
+ * is built from named stops, and scripts/contrast-pairs.js holds the worst
771
+ * stop of each to the pairs that sit on it. The strengths are the strongest
772
+ * whole 5% (canvas) and whole percent (control veils) at which every pair
773
+ * passes, capped at the prototype (canvas 85 / 45, top veil 22, bottom 14).
774
+ * Light canvas 55 (caption and link on the wash), dark canvas 25 (field edge
775
+ * on the wash).
776
+ *
777
+ * Control veils, light: darken-only. The top is 0%, so the fill at the top
778
+ * is the control's own colour: the label keeps its full contrast and an
779
+ * app's brand colour is not altered. Lightening the top of the brand-600
780
+ * fill took the white label (about 4.6:1) under 4.5:1, which is why it was
781
+ * 4% before. The bottom is 14% of base-950, the strongest whole percent that
782
+ * passes every pair (the label only gains from a darker fill); it is the
783
+ * depth. Dark is the same darken-only veil (the fill is a mid step with a white
784
+ * label, as in light); only the accent, whose dark fill is light under a dark
785
+ * label, keeps the lighter top, 22 / 6, in its own strengths.
786
+ *
787
+ * Canvas: two soft radial washes from brand 300 and accent 300 for glass to
788
+ * show something. A background-image only; .bg-canvas adds the page colour.
789
+ * The library does not paint it on body. */
790
+ --gradient-canvas-strength: 55%;
791
+ --color-canvas-wash-brand: color-mix(in srgb, var(--color-brand-300) var(--gradient-canvas-strength), transparent);
792
+ --color-canvas-wash-accent: color-mix(in srgb, var(--color-accent-300) var(--gradient-canvas-strength), transparent);
793
+ --gradient-canvas:
794
+ radial-gradient(90% 46% at 8% 0%, var(--color-canvas-wash-brand), transparent 70%),
795
+ radial-gradient(80% 40% at 100% 4%, var(--color-canvas-wash-accent), transparent 70%);
796
+ /* Solid controls: a veil laid over the control's own background-color, so
797
+ * hover and pressed fills keep working. The start and end tokens are the veil
798
+ * colours (translucent neutral, from the ramp so a neutral override tints
799
+ * them): a light one on top, a slight dark one at the bottom. It serves the
800
+ * three solid fills: primary, accent and danger (the veil is neutral, so
801
+ * `bg-control-gradient` is the danger one too). The accent has strengths of
802
+ * its own, which follow the shared ones, so an app whose accent carries a
803
+ * dark label can differ (createTheme does that when the pairs need it). */
804
+ --gradient-control-top-strength: 0%;
805
+ --gradient-control-bottom-strength: 14%;
806
+ --gradient-control-accent-top-strength: var(--gradient-control-top-strength);
807
+ --gradient-control-accent-bottom-strength: var(--gradient-control-bottom-strength);
808
+ --color-control-gradient-start: color-mix(in srgb, var(--zabi-base-50) var(--gradient-control-top-strength), transparent);
809
+ --color-control-gradient-end: color-mix(in srgb, var(--zabi-base-950) var(--gradient-control-bottom-strength), transparent);
810
+ --gradient-control: linear-gradient(to bottom, var(--color-control-gradient-start), var(--color-control-gradient-end));
811
+ --color-control-gradient-accent-start: color-mix(in srgb, var(--zabi-base-50) var(--gradient-control-accent-top-strength), transparent);
812
+ --color-control-gradient-accent-end: color-mix(in srgb, var(--zabi-base-950) var(--gradient-control-accent-bottom-strength), transparent);
813
+ --gradient-control-accent: linear-gradient(to bottom, var(--color-control-gradient-accent-start), var(--color-control-gradient-accent-end));
814
+ --shadow-control-highlight: inset 0 1px 0 color-mix(in srgb, var(--zabi-base-50) 40%, transparent);
423
815
  /* Spacing */
424
- --spacing-xs: 0.25rem
425
- --spacing-sm: 0.5rem
426
- --spacing-md: 1rem
427
- --spacing-lg: 1.5rem
428
- --spacing-xl: 2rem
429
- --spacing-2xl: 3rem
816
+ --spacing-xs: 0.25rem;
817
+ --spacing-sm: 0.5rem;
818
+ --spacing-md: 1rem;
819
+ --spacing-lg: 1.5rem;
820
+ --spacing-xl: 2rem;
821
+ --spacing-2xl: 3rem;
430
822
  /*
431
823
  * Sizing names for w-* / min-w-* / max-w-*.
432
824
  * Tailwind v4 resolves these utilities as --max-width-* (or --width-* / --min-width-*) → --spacing-* → --container-*.
@@ -434,65 +826,1724 @@
434
826
  * instead of Tailwind's 32rem container size. These keys are checked before --spacing-*, so they restore
435
827
  * the standard container scale while `p-lg`, `gap-md`, etc. keep using the spacing tokens.
436
828
  */
437
- --max-width-xs: 20rem
438
- --max-width-sm: 24rem
439
- --max-width-md: 28rem
440
- --max-width-lg: 32rem
441
- --max-width-xl: 36rem
442
- --max-width-2xl: 42rem
443
- --width-xs: 20rem
444
- --width-sm: 24rem
445
- --width-md: 28rem
446
- --width-lg: 32rem
447
- --width-xl: 36rem
448
- --width-2xl: 42rem
449
- --min-width-xs: 20rem
450
- --min-width-sm: 24rem
451
- --min-width-md: 28rem
452
- --min-width-lg: 32rem
453
- --min-width-xl: 36rem
454
- --min-width-2xl: 42rem
829
+ --max-width-xs: 20rem;
830
+ --max-width-sm: 24rem;
831
+ --max-width-md: 28rem;
832
+ --max-width-lg: 32rem;
833
+ --max-width-xl: 36rem;
834
+ --max-width-2xl: 42rem;
835
+ --width-xs: 20rem;
836
+ --width-sm: 24rem;
837
+ --width-md: 28rem;
838
+ --width-lg: 32rem;
839
+ --width-xl: 36rem;
840
+ --width-2xl: 42rem;
841
+ --min-width-xs: 20rem;
842
+ --min-width-sm: 24rem;
843
+ --min-width-md: 28rem;
844
+ --min-width-lg: 32rem;
845
+ --min-width-xl: 36rem;
846
+ --min-width-2xl: 42rem;
455
847
  /* ----------------------------------------------------------------
456
848
  * BORDER RADIUS — four values, chosen by ROLE, never by size.
457
849
  * A large button is a bigger box with the same corner as a small one.
458
850
  * Enforced by scripts/check-control-geometry.js.
459
851
  * ---------------------------------------------------------------- */
460
- --radius-control: 0.5rem
852
+ --radius-control: 0.5rem;
461
853
  /* 8px — buttons, inputs, selects, toggles */
462
- --radius-container: 0.75rem
854
+ --radius-container: 0.75rem;
463
855
  /* 12px — cards, alerts, panels, list items */
464
- --radius-overlay: 1rem
856
+ --radius-overlay: 1rem;
465
857
  /* 16px — modals, sheets, menus, popovers */
466
- --radius-pill: 9999px
858
+ --radius-pill: 9999px;
467
859
  /* badges, avatars, status dots */
468
860
  /* Legacy t-shirt radii. Kept so existing consumer overrides keep working;
469
861
  * components must not use them. */
470
- --radius-sm: 0.25rem
471
- --radius-md: 0.375rem
472
- --radius-lg: 0.5rem
473
- --radius-xl: 0.75rem
862
+ --radius-sm: 0.25rem;
863
+ --radius-md: 0.375rem;
864
+ --radius-lg: 0.5rem;
865
+ --radius-xl: 0.75rem;
474
866
  /* ----------------------------------------------------------------
475
867
  * CONTROL GEOMETRY — one height scale shared by every form control, so a
476
868
  * Button, Input, Select and IconButton of the same size are the same height
477
869
  * and line up in a row. They previously rendered at 40/48/64, 38/46/50 and
478
870
  * 32/40/48 respectively. Grid-aligned (8px).
479
871
  * ---------------------------------------------------------------- */
480
- --control-height-sm: 2rem
872
+ --control-height-sm: 2rem;
481
873
  /* 32px */
482
- --control-height-md: 2.5rem
874
+ --control-height-md: 2.5rem;
483
875
  /* 40px */
484
- --control-height-lg: 3rem
876
+ --control-height-lg: 3rem;
485
877
  /* 48px */
486
878
  /* Z-index */
487
- --z-dropdown: 1000
488
- --z-sticky: 1020
489
- --z-fixed: 1030
490
- --z-modal-backdrop: 1040
491
- --z-modal: 1050
492
- --z-popover: 1060
493
- --z-tooltip: 1070
494
- --z-toast: 1080
879
+ --z-dropdown: 1000;
880
+ --z-sticky: 1020;
881
+ --z-fixed: 1030;
882
+ --z-modal-backdrop: 1040;
883
+ --z-modal: 1050;
884
+ --z-popover: 1060;
885
+ --z-tooltip: 1070;
886
+ --z-toast: 1080;
495
887
  /* Tooltip — elevated hint surface (Tooltip.svelte); arrow uses --color-tooltip-bg */
496
- --color-tooltip-bg: var(--color-base-800)
497
- --color-tooltip-fg: var(--color-base-50)
498
- }
888
+ --color-tooltip-bg: var(--color-base-800);
889
+ --color-tooltip-fg: var(--color-base-50);
890
+ }
891
+
892
+ @layer base {
893
+ :root {
894
+ --tw-ring-offset-color: transparent;
895
+ }
896
+ }
897
+
898
+ @media (prefers-contrast: high) {
899
+ :root {
900
+ --color-tooltip-bg: CanvasText;
901
+ --color-tooltip-fg: Canvas;
902
+ }
903
+ }
904
+
905
+ body {
906
+ font-family: var(--font-family-sans);
907
+ }
908
+
909
+ @layer base {
910
+ h1,
911
+ h2,
912
+ h3,
913
+ h4,
914
+ h5,
915
+ h6 {
916
+ font-family: var(--font-family-heading);
917
+ }
918
+ }
919
+
920
+ :root,
921
+ [data-theme="light"] {
922
+ color-scheme: light;
923
+ }
924
+
925
+ @media (prefers-reduced-transparency: reduce), (prefers-contrast: more), (forced-colors: active) {
926
+ :root:root {
927
+ --color-material-thin: var(--color-surface-chrome);
928
+ --color-material-regular: var(--color-surface-chrome);
929
+ --color-material-thick: var(--color-surface-overlay);
930
+ --material-filter-thin: none;
931
+ --material-filter-regular: none;
932
+ --material-filter-thick: none;
933
+ }
934
+ }
935
+
936
+ @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
937
+ :root:root {
938
+ --color-material-thin: var(--color-surface-chrome);
939
+ --color-material-regular: var(--color-surface-chrome);
940
+ --color-material-thick: var(--color-surface-overlay);
941
+ --material-filter-thin: none;
942
+ --material-filter-regular: none;
943
+ --material-filter-thick: none;
944
+ }
945
+ }
946
+
947
+ [data-materials="opaque"][data-materials="opaque"] {
948
+ --color-material-thin: var(--color-surface-chrome);
949
+ --color-material-regular: var(--color-surface-chrome);
950
+ --color-material-thick: var(--color-surface-overlay);
951
+ --material-filter-thin: none;
952
+ --material-filter-regular: none;
953
+ --material-filter-thick: none;
954
+ }
955
+
956
+ @supports (transition-timing-function: linear(0, 1)) {
957
+ :root {
958
+ --ease-spring: linear(0, 0.14, 0.409, 0.668, 0.859, 0.974, 1.029, 1.046, 1.041, 1.03, 1.017, 1.008, 1.002, 0.999, 0.998, 0.998, 1);
959
+ }
960
+ }
961
+
962
+ @media (prefers-reduced-motion: reduce) {
963
+ :root:root {
964
+ --duration-fast: 0s;
965
+ --duration-base: 0s;
966
+ --duration-moderate: 0s;
967
+ --duration-slow: 0s;
968
+ --ease-spring: var(--ease-standard);
969
+ }
970
+ }
971
+
972
+ .material-thin,
973
+ .material-regular,
974
+ .material-thick {
975
+ --tw-shadow:
976
+ inset 0 1px 0 var(--color-material-highlight),
977
+ inset 0 0 0 1px var(--color-material-rim),
978
+ var(--shadow-material);
979
+ box-shadow:
980
+ var(--tw-inset-shadow, 0 0 #0000),
981
+ var(--tw-inset-ring-shadow, 0 0 #0000),
982
+ var(--tw-ring-offset-shadow, 0 0 #0000),
983
+ var(--tw-ring-shadow, 0 0 #0000),
984
+ var(--tw-shadow);
985
+ }
986
+
987
+ .material-thin {
988
+ background-color: var(--color-material-thin);
989
+ -webkit-backdrop-filter: var(--material-filter-thin);
990
+ backdrop-filter: var(--material-filter-thin);
991
+ }
992
+
993
+ .material-regular {
994
+ background-color: var(--color-material-regular);
995
+ -webkit-backdrop-filter: var(--material-filter-regular);
996
+ backdrop-filter: var(--material-filter-regular);
997
+ }
998
+
999
+ .material-thick {
1000
+ background-color: var(--color-material-thick);
1001
+ -webkit-backdrop-filter: var(--material-filter-thick);
1002
+ backdrop-filter: var(--material-filter-thick);
1003
+ }
1004
+
1005
+ @media (forced-colors: active) {
1006
+ .material-thin,
1007
+ .material-regular,
1008
+ .material-thick {
1009
+ outline: 1px solid CanvasText;
1010
+ outline-offset: -1px;
1011
+ }
1012
+ }
1013
+
1014
+ .material-layer-thick {
1015
+ isolation: isolate;
1016
+ background-color: transparent;
1017
+ --tw-shadow: var(--shadow-material);
1018
+ box-shadow:
1019
+ var(--tw-inset-shadow, 0 0 #0000),
1020
+ var(--tw-inset-ring-shadow, 0 0 #0000),
1021
+ var(--tw-ring-offset-shadow, 0 0 #0000),
1022
+ var(--tw-ring-shadow, 0 0 #0000),
1023
+ var(--tw-shadow);
1024
+ }
1025
+
1026
+ .material-layer-thick::before {
1027
+ content: "";
1028
+ position: absolute;
1029
+ inset: 0;
1030
+ z-index: -1;
1031
+ border-radius: inherit;
1032
+ pointer-events: none;
1033
+ background-color: var(--color-material-thick);
1034
+ -webkit-backdrop-filter: var(--material-filter-thick);
1035
+ backdrop-filter: var(--material-filter-thick);
1036
+ box-shadow:
1037
+ inset 0 1px 0 var(--color-material-highlight),
1038
+ inset 0 0 0 1px var(--color-material-rim);
1039
+ }
1040
+
1041
+ @media (forced-colors: active) {
1042
+ .material-layer-thick {
1043
+ outline: 1px solid CanvasText;
1044
+ outline-offset: -1px;
1045
+ }
1046
+ }
1047
+
1048
+ .material-layer-regular {
1049
+ isolation: isolate;
1050
+ background-color: transparent;
1051
+ --tw-shadow: var(--shadow-material);
1052
+ box-shadow:
1053
+ var(--tw-inset-shadow, 0 0 #0000),
1054
+ var(--tw-inset-ring-shadow, 0 0 #0000),
1055
+ var(--tw-ring-offset-shadow, 0 0 #0000),
1056
+ var(--tw-ring-shadow, 0 0 #0000),
1057
+ var(--tw-shadow);
1058
+ }
1059
+
1060
+ .material-layer-regular::before {
1061
+ content: "";
1062
+ position: absolute;
1063
+ inset: 0;
1064
+ z-index: -1;
1065
+ border-radius: inherit;
1066
+ pointer-events: none;
1067
+ background-color: var(--color-material-regular);
1068
+ -webkit-backdrop-filter: var(--material-filter-regular);
1069
+ backdrop-filter: var(--material-filter-regular);
1070
+ box-shadow:
1071
+ inset 0 1px 0 var(--color-material-highlight),
1072
+ inset 0 0 0 1px var(--color-material-rim);
1073
+ }
1074
+
1075
+ @media (forced-colors: active) {
1076
+ .material-layer-regular {
1077
+ outline: 1px solid CanvasText;
1078
+ outline-offset: -1px;
1079
+ }
1080
+ }
1081
+
1082
+ .material-bar {
1083
+ isolation: isolate;
1084
+ background-color: transparent;
1085
+ }
1086
+
1087
+ .material-bar::before {
1088
+ content: "";
1089
+ position: absolute;
1090
+ inset: 0;
1091
+ z-index: -1;
1092
+ box-sizing: border-box;
1093
+ pointer-events: none;
1094
+ background-color: var(--color-bar);
1095
+ border: 0 solid transparent;
1096
+ border-bottom-width: 1px;
1097
+ transition-property: background-color, border-color;
1098
+ transition-duration: var(--duration-moderate);
1099
+ transition-timing-function: var(--ease-standard);
1100
+ }
1101
+
1102
+ .material-bar[data-bar-edge="bottom"]::before {
1103
+ border-bottom-width: 0;
1104
+ border-top-width: 1px;
1105
+ }
1106
+
1107
+ .material-bar[data-scrolled-under="true"]::before {
1108
+ background-color: var(--color-material-regular);
1109
+ -webkit-backdrop-filter: var(--material-filter-regular);
1110
+ backdrop-filter: var(--material-filter-regular);
1111
+ border-color: var(--color-bar-border);
1112
+ }
1113
+
1114
+ @media (forced-colors: active) {
1115
+ .material-bar[data-scrolled-under="true"]::before {
1116
+ border-color: CanvasText;
1117
+ }
1118
+ }
1119
+
1120
+ .bg-canvas {
1121
+ background-color: var(--color-surface-base);
1122
+ background-image: var(--gradient-canvas);
1123
+ background-repeat: no-repeat;
1124
+ }
1125
+
1126
+ .bg-control-gradient,
1127
+ .bg-control-gradient-accent {
1128
+ --tw-inset-shadow: var(--shadow-control-highlight);
1129
+ box-shadow:
1130
+ var(--tw-inset-shadow, 0 0 #0000),
1131
+ var(--tw-inset-ring-shadow, 0 0 #0000),
1132
+ var(--tw-ring-offset-shadow, 0 0 #0000),
1133
+ var(--tw-ring-shadow, 0 0 #0000),
1134
+ var(--tw-shadow, 0 0 #0000);
1135
+ }
1136
+
1137
+ .bg-control-gradient {
1138
+ background-image: var(--gradient-control);
1139
+ }
1140
+
1141
+ .bg-control-gradient-accent {
1142
+ background-image: var(--gradient-control-accent);
1143
+ }
1144
+
1145
+ .ring-toggle-track {
1146
+ --tw-inset-ring-shadow: inset 0 0 0 1px var(--color-toggle-track-border);
1147
+ box-shadow:
1148
+ var(--tw-inset-shadow, 0 0 #0000),
1149
+ var(--tw-inset-ring-shadow, 0 0 #0000),
1150
+ var(--tw-ring-offset-shadow, 0 0 #0000),
1151
+ var(--tw-ring-shadow, 0 0 #0000),
1152
+ var(--tw-shadow, 0 0 #0000);
1153
+ }
1154
+
1155
+ .rounded-button {
1156
+ border-radius: var(--zabi-button-radius, var(--radius-control));
1157
+ }
1158
+
1159
+ .font-button {
1160
+ font-weight: var(--zabi-button-font-weight, 500);
1161
+ }
1162
+
1163
+ .font-button-strong {
1164
+ font-weight: var(--zabi-button-font-weight, 600);
1165
+ }
1166
+
1167
+ .bg-base-50 {
1168
+ background-color: var(--color-base-50);
1169
+ }
1170
+
1171
+ .bg-base-75 {
1172
+ background-color: var(--color-base-75);
1173
+ }
1174
+
1175
+ .bg-base-100 {
1176
+ background-color: var(--color-base-100);
1177
+ }
1178
+
1179
+ .bg-base-150 {
1180
+ background-color: var(--color-base-150);
1181
+ }
1182
+
1183
+ .bg-base-200 {
1184
+ background-color: var(--color-base-200);
1185
+ }
1186
+
1187
+ .bg-base-250 {
1188
+ background-color: var(--color-base-250);
1189
+ }
1190
+
1191
+ .bg-base-300 {
1192
+ background-color: var(--color-base-300);
1193
+ }
1194
+
1195
+ .bg-base-350 {
1196
+ background-color: var(--color-base-350);
1197
+ }
1198
+
1199
+ .bg-base-400 {
1200
+ background-color: var(--color-base-400);
1201
+ }
1202
+
1203
+ .bg-base-450 {
1204
+ background-color: var(--color-base-450);
1205
+ }
1206
+
1207
+ .bg-base-500 {
1208
+ background-color: var(--color-base-500);
1209
+ }
1210
+
1211
+ .bg-base-550 {
1212
+ background-color: var(--color-base-550);
1213
+ }
1214
+
1215
+ .bg-base-600 {
1216
+ background-color: var(--color-base-600);
1217
+ }
1218
+
1219
+ .bg-base-650 {
1220
+ background-color: var(--color-base-650);
1221
+ }
1222
+
1223
+ .bg-base-700 {
1224
+ background-color: var(--color-base-700);
1225
+ }
1226
+
1227
+ .bg-base-750 {
1228
+ background-color: var(--color-base-750);
1229
+ }
1230
+
1231
+ .bg-base-800 {
1232
+ background-color: var(--color-base-800);
1233
+ }
1234
+
1235
+ .bg-base-850 {
1236
+ background-color: var(--color-base-850);
1237
+ }
1238
+
1239
+ .bg-base-900 {
1240
+ background-color: var(--color-base-900);
1241
+ }
1242
+
1243
+ .bg-base-925 {
1244
+ background-color: var(--color-base-925);
1245
+ }
1246
+
1247
+ .bg-base-950 {
1248
+ background-color: var(--color-base-950);
1249
+ }
1250
+
1251
+ @media (hover: hover) {
1252
+ .hover\:bg-base-50:hover {
1253
+ background-color: var(--color-base-50);
1254
+ }
1255
+
1256
+ .hover\:bg-base-75:hover {
1257
+ background-color: var(--color-base-75);
1258
+ }
1259
+
1260
+ .hover\:bg-base-100:hover {
1261
+ background-color: var(--color-base-100);
1262
+ }
1263
+
1264
+ .hover\:bg-base-150:hover {
1265
+ background-color: var(--color-base-150);
1266
+ }
1267
+
1268
+ .hover\:bg-base-200:hover {
1269
+ background-color: var(--color-base-200);
1270
+ }
1271
+
1272
+ .hover\:bg-base-250:hover {
1273
+ background-color: var(--color-base-250);
1274
+ }
1275
+
1276
+ .hover\:bg-base-300:hover {
1277
+ background-color: var(--color-base-300);
1278
+ }
1279
+
1280
+ .hover\:bg-base-350:hover {
1281
+ background-color: var(--color-base-350);
1282
+ }
1283
+
1284
+ .hover\:bg-base-400:hover {
1285
+ background-color: var(--color-base-400);
1286
+ }
1287
+
1288
+ .hover\:bg-base-450:hover {
1289
+ background-color: var(--color-base-450);
1290
+ }
1291
+
1292
+ .hover\:bg-base-500:hover {
1293
+ background-color: var(--color-base-500);
1294
+ }
1295
+
1296
+ .hover\:bg-base-550:hover {
1297
+ background-color: var(--color-base-550);
1298
+ }
1299
+
1300
+ .hover\:bg-base-600:hover {
1301
+ background-color: var(--color-base-600);
1302
+ }
1303
+
1304
+ .hover\:bg-base-650:hover {
1305
+ background-color: var(--color-base-650);
1306
+ }
1307
+
1308
+ .hover\:bg-base-700:hover {
1309
+ background-color: var(--color-base-700);
1310
+ }
1311
+
1312
+ .hover\:bg-base-750:hover {
1313
+ background-color: var(--color-base-750);
1314
+ }
1315
+
1316
+ .hover\:bg-base-800:hover {
1317
+ background-color: var(--color-base-800);
1318
+ }
1319
+
1320
+ .hover\:bg-base-850:hover {
1321
+ background-color: var(--color-base-850);
1322
+ }
1323
+
1324
+ .hover\:bg-base-900:hover {
1325
+ background-color: var(--color-base-900);
1326
+ }
1327
+
1328
+ .hover\:bg-base-925:hover {
1329
+ background-color: var(--color-base-925);
1330
+ }
1331
+
1332
+ .hover\:bg-base-950:hover {
1333
+ background-color: var(--color-base-950);
1334
+ }
1335
+ }
1336
+
1337
+ .bg-card {
1338
+ background-color: var(--color-card);
1339
+ }
1340
+
1341
+ .bg-toggle-thumb {
1342
+ background-color: var(--color-toggle-thumb, var(--color-toggle-knob));
1343
+ }
1344
+
1345
+ .bg-toggle-thumb-checked {
1346
+ background-color: var(--color-toggle-thumb-checked, var(--color-toggle-thumb, var(--color-toggle-knob-checked)));
1347
+ }
1348
+
1349
+ .bg-card-flat {
1350
+ background-color: var(--color-card-flat);
1351
+ }
1352
+
1353
+ @media (hover: hover) {
1354
+ .hover\:bg-card-hover:hover {
1355
+ background-color: var(--color-card-hover);
1356
+ }
1357
+
1358
+ .hover\:bg-card-flat-hover:hover {
1359
+ background-color: var(--color-card-flat-hover);
1360
+ }
1361
+ }
1362
+
1363
+ .bg-surface-1 {
1364
+ background-color: var(--color-surface-1);
1365
+ }
1366
+
1367
+ .bg-surface-2 {
1368
+ background-color: var(--color-surface-2);
1369
+ }
1370
+
1371
+ .bg-surface-3 {
1372
+ background-color: var(--color-surface-3);
1373
+ }
1374
+
1375
+ .bg-surface-4 {
1376
+ background-color: var(--color-surface-4);
1377
+ }
1378
+
1379
+ .bg-overlay {
1380
+ background-color: var(--color-overlay);
1381
+ }
1382
+
1383
+ .bg-input {
1384
+ background-color: var(--color-input);
1385
+ }
1386
+
1387
+ @media (hover: hover) {
1388
+ .hover\:bg-input-hover:hover {
1389
+ background-color: var(--color-input-hover);
1390
+ }
1391
+ }
1392
+
1393
+ .focus-visible\:bg-input-focus:focus-visible {
1394
+ background-color: var(--color-input-focus);
1395
+ }
1396
+
1397
+ .active\:bg-input-focus:active {
1398
+ background-color: var(--color-input-focus);
1399
+ }
1400
+
1401
+ .active\:bg-input-hover:active {
1402
+ background-color: var(--color-input-hover);
1403
+ }
1404
+
1405
+ .active\:bg-input-active:active {
1406
+ background-color: var(--color-input-active, var(--color-input-hover));
1407
+ }
1408
+
1409
+ .active\:bg-card-active:active {
1410
+ background-color: var(--color-card-active);
1411
+ }
1412
+
1413
+ .active\:bg-card-flat-active:active {
1414
+ background-color: var(--color-card-flat-active);
1415
+ }
1416
+
1417
+ .disabled\:bg-input-disabled:disabled {
1418
+ background-color: var(--color-input-disabled);
1419
+ }
1420
+
1421
+ .bg-page {
1422
+ background-color: var(--color-page);
1423
+ }
1424
+
1425
+ .bg-brand-50 {
1426
+ background-color: var(--color-brand-50);
1427
+ }
1428
+
1429
+ .bg-brand-100 {
1430
+ background-color: var(--color-brand-100);
1431
+ }
1432
+
1433
+ .bg-brand-200 {
1434
+ background-color: var(--color-brand-200);
1435
+ }
1436
+
1437
+ .bg-brand-300 {
1438
+ background-color: var(--color-brand-300);
1439
+ }
1440
+
1441
+ .bg-brand-400 {
1442
+ background-color: var(--color-brand-400);
1443
+ }
1444
+
1445
+ .bg-brand-500 {
1446
+ background-color: var(--color-brand-500);
1447
+ }
1448
+
1449
+ .bg-brand-600 {
1450
+ background-color: var(--color-brand-600);
1451
+ }
1452
+
1453
+ .bg-brand-700 {
1454
+ background-color: var(--color-brand-700);
1455
+ }
1456
+
1457
+ .bg-brand-800 {
1458
+ background-color: var(--color-brand-800);
1459
+ }
1460
+
1461
+ .bg-brand-900 {
1462
+ background-color: var(--color-brand-900);
1463
+ }
1464
+
1465
+ .bg-brand-950 {
1466
+ background-color: var(--color-brand-950);
1467
+ }
1468
+
1469
+ @media (hover: hover) {
1470
+ .hover\:bg-brand-50:hover {
1471
+ background-color: var(--color-brand-50);
1472
+ }
1473
+
1474
+ .hover\:bg-brand-100:hover {
1475
+ background-color: var(--color-brand-100);
1476
+ }
1477
+
1478
+ .hover\:bg-brand-200:hover {
1479
+ background-color: var(--color-brand-200);
1480
+ }
1481
+ }
1482
+
1483
+ .text-brand-50 {
1484
+ color: var(--color-brand-50);
1485
+ }
1486
+
1487
+ .text-brand-100 {
1488
+ color: var(--color-brand-100);
1489
+ }
1490
+
1491
+ .text-brand-200 {
1492
+ color: var(--color-brand-200);
1493
+ }
1494
+
1495
+ .text-brand-300 {
1496
+ color: var(--color-brand-300);
1497
+ }
1498
+
1499
+ .text-brand-400 {
1500
+ color: var(--color-brand-400);
1501
+ }
1502
+
1503
+ .text-brand-500 {
1504
+ color: var(--color-brand-500);
1505
+ }
1506
+
1507
+ .text-brand-600 {
1508
+ color: var(--color-brand-600);
1509
+ }
1510
+
1511
+ .text-brand-700 {
1512
+ color: var(--color-brand-700);
1513
+ }
1514
+
1515
+ .text-brand-800 {
1516
+ color: var(--color-brand-800);
1517
+ }
1518
+
1519
+ .text-brand-900 {
1520
+ color: var(--color-brand-900);
1521
+ }
1522
+
1523
+ .text-brand-950 {
1524
+ color: var(--color-brand-950);
1525
+ }
1526
+
1527
+ .border-brand-50 {
1528
+ border-color: var(--color-brand-50);
1529
+ }
1530
+
1531
+ .border-brand-100 {
1532
+ border-color: var(--color-brand-100);
1533
+ }
1534
+
1535
+ .border-brand-500 {
1536
+ border-color: var(--color-brand-500);
1537
+ }
1538
+
1539
+ .border-brand-600 {
1540
+ border-color: var(--color-brand-600);
1541
+ }
1542
+
1543
+ .text-headline {
1544
+ color: var(--color-headline);
1545
+ }
1546
+
1547
+ .text-body {
1548
+ color: var(--color-body);
1549
+ }
1550
+
1551
+ .text-description {
1552
+ color: var(--color-description);
1553
+ }
1554
+
1555
+ .text-caption {
1556
+ color: var(--color-caption);
1557
+ }
1558
+
1559
+ .text-input-placeholder {
1560
+ color: var(--color-input-placeholder);
1561
+ }
1562
+
1563
+ .placeholder\:text-input-placeholder:disabled::placeholder {
1564
+ color: var(--color-action-disabled-text);
1565
+ }
1566
+
1567
+ .text-label {
1568
+ color: var(--color-label);
1569
+ }
1570
+
1571
+ .text-link {
1572
+ color: var(--color-link);
1573
+ }
1574
+
1575
+ @media (hover: hover) {
1576
+ .text-link:hover {
1577
+ color: var(--color-link-hover);
1578
+ }
1579
+ }
1580
+
1581
+ .text-link:active {
1582
+ color: var(--color-link-hover);
1583
+ }
1584
+
1585
+ .text-nav-menu-item {
1586
+ color: var(--color-nav-menu-item);
1587
+ }
1588
+
1589
+ @media (hover: hover) {
1590
+ .hover\:text-nav-menu-item-hover:hover {
1591
+ color: var(--color-nav-menu-item-hover);
1592
+ }
1593
+ }
1594
+
1595
+ .text-nav-menu-item-active {
1596
+ color: var(--color-nav-menu-item-active);
1597
+ }
1598
+
1599
+ .bg-nav-menu-hover {
1600
+ background-color: var(--color-nav-menu-hover);
1601
+ }
1602
+
1603
+ .bg-nav-menu-active {
1604
+ background-color: var(--color-nav-menu-active);
1605
+ }
1606
+
1607
+ .active\:bg-nav-menu-active-hover:active {
1608
+ background-color: var(--color-nav-menu-active-hover);
1609
+ }
1610
+
1611
+ .bg-nav-menu-item-active {
1612
+ background-color: var(--color-nav-menu-item-active);
1613
+ }
1614
+
1615
+ .bg-tabbar-active {
1616
+ background-color: var(--color-tabbar-active);
1617
+ }
1618
+
1619
+ .bg-bar-brand {
1620
+ background-color: var(--color-bar-brand);
1621
+ }
1622
+
1623
+ .border-bar {
1624
+ border-color: var(--color-bar-border);
1625
+ }
1626
+
1627
+ .text-success {
1628
+ color: var(--color-success-text);
1629
+ }
1630
+
1631
+ .text-warning {
1632
+ color: var(--color-warning-text);
1633
+ }
1634
+
1635
+ .text-error {
1636
+ color: var(--color-error-text);
1637
+ }
1638
+
1639
+ .text-info {
1640
+ color: var(--color-info-text);
1641
+ }
1642
+
1643
+ .text-neutral {
1644
+ color: var(--color-neutral-text);
1645
+ }
1646
+
1647
+ .text-energetic {
1648
+ color: var(--color-energetic-text);
1649
+ }
1650
+
1651
+ .text-accent {
1652
+ color: var(--color-accent-text);
1653
+ }
1654
+
1655
+ .text-inverse {
1656
+ color: var(--color-inverse);
1657
+ }
1658
+
1659
+ .text-disabled {
1660
+ color: var(--color-disabled);
1661
+ }
1662
+
1663
+ .border-border {
1664
+ border-color: var(--color-border);
1665
+ }
1666
+
1667
+ .border-border-medium {
1668
+ border-color: var(--color-border-medium);
1669
+ }
1670
+
1671
+ .border-primary {
1672
+ border-color: var(--color-border);
1673
+ }
1674
+
1675
+ .border-secondary {
1676
+ border-color: var(--color-border-secondary);
1677
+ }
1678
+
1679
+ @media (hover: hover) {
1680
+ .border-hover:hover {
1681
+ border-color: var(--color-border-hover);
1682
+ }
1683
+ }
1684
+
1685
+ .border-disabled:disabled {
1686
+ border-color: var(--color-border-disabled);
1687
+ }
1688
+
1689
+ .bg-success {
1690
+ background-color: var(--color-success);
1691
+ }
1692
+
1693
+ .bg-warning {
1694
+ background-color: var(--color-warning);
1695
+ }
1696
+
1697
+ .bg-error {
1698
+ background-color: var(--color-error);
1699
+ }
1700
+
1701
+ .bg-info {
1702
+ background-color: var(--color-info);
1703
+ }
1704
+
1705
+ .bg-neutral {
1706
+ background-color: var(--color-neutral);
1707
+ }
1708
+
1709
+ .bg-energetic {
1710
+ background-color: var(--color-energetic);
1711
+ }
1712
+
1713
+ .bg-accent {
1714
+ background-color: var(--color-accent);
1715
+ }
1716
+
1717
+ .bg-secondary {
1718
+ background-color: var(--color-secondary);
1719
+ }
1720
+
1721
+ .border-success {
1722
+ border-color: var(--color-success);
1723
+ }
1724
+
1725
+ .border-warning {
1726
+ border-color: var(--color-warning);
1727
+ }
1728
+
1729
+ .border-error {
1730
+ border-color: var(--color-error);
1731
+ }
1732
+
1733
+ .border-info {
1734
+ border-color: var(--color-info);
1735
+ }
1736
+
1737
+ .border-neutral {
1738
+ border-color: var(--color-neutral);
1739
+ }
1740
+
1741
+ .border-energetic {
1742
+ border-color: var(--color-energetic);
1743
+ }
1744
+
1745
+ .border-accent {
1746
+ border-color: var(--color-accent);
1747
+ }
1748
+
1749
+ .border-secondary {
1750
+ border-color: var(--color-secondary);
1751
+ }
1752
+
1753
+ @layer components {
1754
+ .focus-ring {
1755
+ --zabi-focus-ring-color: var(--color-focus-ring);
1756
+ --zabi-focus-ring-offset-color: var(--color-focus-ring-offset);
1757
+ outline: none;
1758
+ }
1759
+
1760
+ .focus-ring:focus-visible {
1761
+ outline: none;
1762
+ --tw-ring-offset-shadow:
1763
+ 0 0 0 2px var(--zabi-focus-ring-offset-color),
1764
+ 0 0 0 4px var(--zabi-focus-ring-color);
1765
+ box-shadow:
1766
+ var(--tw-inset-shadow, 0 0 #0000),
1767
+ var(--tw-inset-ring-shadow, 0 0 #0000),
1768
+ var(--tw-ring-offset-shadow),
1769
+ var(--tw-ring-shadow, 0 0 #0000),
1770
+ var(--tw-shadow, 0 0 #0000);
1771
+ }
1772
+ .focus-ring--nav {
1773
+ --zabi-focus-ring-color: var(--color-nav-menu-focus);
1774
+ }
1775
+ .focus-ring--danger {
1776
+ --zabi-focus-ring-color: var(--color-focus-ring-danger, var(--color-error));
1777
+ }
1778
+ .focus-ring--muted {
1779
+ --zabi-focus-ring-color: var(--color-focus-ring-muted, var(--color-base-500));
1780
+ }
1781
+ :where(:has(> .on-brand, > .on-accent, > .on-fill):not(.on-brand, .on-accent, .on-fill, .on-brand *, .on-accent *, .on-fill *)) {
1782
+ --zabi-theme-headline: var(--color-headline);
1783
+ --zabi-theme-body: var(--color-body);
1784
+ --zabi-theme-label: var(--color-label);
1785
+ --zabi-theme-description: var(--color-description);
1786
+ --zabi-theme-caption: var(--color-caption);
1787
+ --zabi-theme-link: var(--color-link);
1788
+ --zabi-theme-link-hover: var(--color-link-hover);
1789
+ --zabi-theme-border: var(--color-border);
1790
+ --zabi-theme-border-medium: var(--color-border-medium);
1791
+ --zabi-theme-border-strong: var(--color-border-strong);
1792
+ --zabi-theme-control-border: var(--color-control-border);
1793
+ --zabi-theme-action-outline-border: var(--color-action-outline-border);
1794
+ --zabi-theme-action-outline-border-hover: var(--color-action-outline-border-hover);
1795
+ --zabi-theme-focus-ring: var(--color-focus-ring);
1796
+ --zabi-theme-focus-ring-muted: var(--color-focus-ring-muted);
1797
+ --zabi-theme-nav-menu-focus: var(--color-nav-menu-focus);
1798
+ --zabi-theme-focus-ring-offset: var(--color-focus-ring-offset);
1799
+ --zabi-theme-focus-ring-danger: var(--color-focus-ring-danger, var(--color-error));
1800
+ }
1801
+
1802
+ .on-brand {
1803
+ color: var(--color-on-brand);
1804
+ --color-focus-ring: var(--color-on-brand);
1805
+ --color-focus-ring-muted: var(--color-on-brand);
1806
+ --color-nav-menu-focus: var(--color-on-brand);
1807
+ --color-focus-ring-offset: var(--color-action-primary);
1808
+ --color-focus-ring-danger: var(--color-on-brand);
1809
+ --color-headline: var(--color-on-brand);
1810
+ --color-body: var(--color-on-brand);
1811
+ --color-label: var(--color-on-brand);
1812
+ --color-description: var(--color-on-brand);
1813
+ --color-caption: var(--color-on-brand);
1814
+ --color-link: var(--color-on-brand);
1815
+ --color-link-hover: var(--color-on-brand);
1816
+ --color-border: var(--color-on-brand);
1817
+ --color-border-medium: var(--color-on-brand);
1818
+ --color-border-strong: var(--color-on-brand);
1819
+ --color-control-border: var(--color-on-brand);
1820
+ --color-action-outline-border: var(--color-on-brand);
1821
+ --color-action-outline-border-hover: var(--color-on-brand);
1822
+ }
1823
+
1824
+ .on-accent {
1825
+ color: var(--color-on-accent);
1826
+ --color-focus-ring: var(--color-on-accent);
1827
+ --color-focus-ring-muted: var(--color-on-accent);
1828
+ --color-nav-menu-focus: var(--color-on-accent);
1829
+ --color-focus-ring-offset: var(--color-accent);
1830
+ --color-focus-ring-danger: var(--color-on-accent);
1831
+ --color-headline: var(--color-on-accent);
1832
+ --color-body: var(--color-on-accent);
1833
+ --color-label: var(--color-on-accent);
1834
+ --color-description: var(--color-on-accent);
1835
+ --color-caption: var(--color-on-accent);
1836
+ --color-link: var(--color-on-accent);
1837
+ --color-link-hover: var(--color-on-accent);
1838
+ --color-border: var(--color-on-accent);
1839
+ --color-border-medium: var(--color-on-accent);
1840
+ --color-border-strong: var(--color-on-accent);
1841
+ --color-control-border: var(--color-on-accent);
1842
+ --color-action-outline-border: var(--color-on-accent);
1843
+ --color-action-outline-border-hover: var(--color-on-accent);
1844
+ }
1845
+ .on-fill {
1846
+ color: var(--zabi-on-fill, currentColor);
1847
+ --color-focus-ring: var(--zabi-on-fill, currentColor);
1848
+ --color-focus-ring-muted: var(--zabi-on-fill, currentColor);
1849
+ --color-nav-menu-focus: var(--zabi-on-fill, currentColor);
1850
+ --color-focus-ring-offset: transparent;
1851
+ --color-focus-ring-danger: var(--zabi-on-fill, currentColor);
1852
+ --color-headline: var(--zabi-on-fill, currentColor);
1853
+ --color-body: var(--zabi-on-fill, currentColor);
1854
+ --color-label: var(--zabi-on-fill, currentColor);
1855
+ --color-description: var(--zabi-on-fill, currentColor);
1856
+ --color-caption: var(--zabi-on-fill, currentColor);
1857
+ --color-link: var(--zabi-on-fill, currentColor);
1858
+ --color-link-hover: var(--zabi-on-fill, currentColor);
1859
+ --color-border: var(--zabi-on-fill, currentColor);
1860
+ --color-border-medium: var(--zabi-on-fill, currentColor);
1861
+ --color-border-strong: var(--zabi-on-fill, currentColor);
1862
+ --color-control-border: var(--zabi-on-fill, currentColor);
1863
+ --color-action-outline-border: var(--zabi-on-fill, currentColor);
1864
+ --color-action-outline-border-hover: var(--zabi-on-fill, currentColor);
1865
+ }
1866
+ :where(.on-brand, .on-accent, .on-fill) {
1867
+ --zabi-inv-primary: var(--color-action-primary);
1868
+ --zabi-inv-primary-hover: var(--color-action-primary-hover);
1869
+ --zabi-inv-primary-active: var(--color-action-primary-active);
1870
+ --zabi-inv-primary-text: var(--color-action-primary-text);
1871
+ --zabi-inv-accent: var(--color-accent);
1872
+ --zabi-inv-accent-hover: var(--color-accent-hover);
1873
+ --zabi-inv-accent-active: var(--color-accent-active);
1874
+ --zabi-inv-accent-text: var(--color-on-accent);
1875
+ --zabi-inv-secondary: var(--color-action-secondary);
1876
+ --zabi-inv-secondary-hover: var(--color-action-secondary-hover);
1877
+ --zabi-inv-secondary-active: var(--color-action-secondary-active);
1878
+ }
1879
+ :where(.on-brand) {
1880
+ --zabi-inv-secondary: rgba(9, 9, 11, 0.1);
1881
+ --zabi-inv-secondary-hover: rgba(9, 9, 11, 0.15);
1882
+ --zabi-inv-secondary-active: rgba(9, 9, 11, 0.2);
1883
+ }
1884
+ :where(.on-brand) {
1885
+ --zabi-inv-primary: var(--color-on-brand);
1886
+ --zabi-inv-primary-hover: color-mix(in srgb, var(--color-on-brand) 88%, var(--color-action-primary));
1887
+ --zabi-inv-primary-active: color-mix(in srgb, var(--color-on-brand) 76%, var(--color-action-primary));
1888
+ --zabi-inv-primary-text: var(--color-action-primary);
1889
+ --zabi-inv-star: var(--color-on-brand);
1890
+ }
1891
+ :where(.on-accent) {
1892
+ --zabi-inv-accent: var(--color-on-accent);
1893
+ --zabi-inv-accent-hover: color-mix(in srgb, var(--color-on-accent) 88%, var(--color-accent));
1894
+ --zabi-inv-accent-active: color-mix(in srgb, var(--color-on-accent) 76%, var(--color-accent));
1895
+ --zabi-inv-accent-text: var(--color-accent);
1896
+ --zabi-inv-star: var(--color-on-accent);
1897
+ }
1898
+ :where(.on-fill) {
1899
+ --zabi-inv-primary: var(--zabi-on-fill, currentColor);
1900
+ --zabi-inv-primary-hover: color-mix(in srgb, var(--zabi-on-fill, currentColor) 88%, var(--zabi-fill, var(--color-card)));
1901
+ --zabi-inv-primary-active: color-mix(in srgb, var(--zabi-on-fill, currentColor) 76%, var(--zabi-fill, var(--color-card)));
1902
+ --zabi-inv-primary-text: var(--zabi-fill, var(--color-card));
1903
+ --zabi-inv-star: var(--zabi-on-fill, currentColor);
1904
+ }
1905
+ :where(.bg-action-primary:not(.on-brand, .on-accent, .on-fill)):where(.on-brand *, .on-accent *, .on-fill *) {
1906
+ --color-action-primary: var(--zabi-inv-primary);
1907
+ --color-action-primary-hover: var(--zabi-inv-primary-hover);
1908
+ --color-action-primary-active: var(--zabi-inv-primary-active);
1909
+ --color-action-primary-text: var(--zabi-inv-primary-text);
1910
+ }
1911
+ :where(.bg-action-secondary, .bg-action-secondary-active):where(.on-brand *, .on-accent *, .on-fill *) {
1912
+ --color-action-secondary: var(--zabi-inv-secondary);
1913
+ --color-action-secondary-hover: var(--zabi-inv-secondary-hover);
1914
+ --color-action-secondary-active: var(--zabi-inv-secondary-active);
1915
+ }
1916
+ :where(.bg-accent:not(.on-brand, .on-accent, .on-fill)):where(.on-brand *, .on-accent *, .on-fill *) {
1917
+ --color-accent: var(--zabi-inv-accent);
1918
+ --color-accent-hover: var(--zabi-inv-accent-hover);
1919
+ --color-accent-active: var(--zabi-inv-accent-active);
1920
+ --color-on-accent: var(--zabi-inv-accent-text);
1921
+ }
1922
+ :where(.rating):where(.on-brand *, .on-accent *, .on-fill *) {
1923
+ --zabi-rating-on: var(--zabi-inv-star);
1924
+ }
1925
+ :where(.on-brand, .on-accent, .on-fill)
1926
+ :where(
1927
+ .bg-card, .bg-card-flat, .bg-card-elevated, .bg-background, .bg-surface-base,
1928
+ .bg-surface-raised, .bg-surface-elevated, .bg-surface-overlay, .bg-surface-overlay-hover,
1929
+ .bg-surface-chrome, .bg-surface-inset, .bg-surface-1, .bg-surface-2, .bg-surface-3,
1930
+ .bg-surface-4, .bg-input, .bg-input-disabled, .bg-accent-subtle,
1931
+ .bg-action-danger-subtle, .bg-action-primary-subtle, .bg-action-tonal, .bg-card-tint, .bg-chip, .bg-chip-selected,
1932
+ .bg-energetic-subtle, .bg-error-subtle,
1933
+ .bg-info-subtle, .bg-neutral-subtle, .bg-badge-neutral, .bg-toggle-thumb, .bg-toggle-thumb-checked, .bg-success-subtle, .bg-warning-subtle,
1934
+ .bg-nav-menu-active, .bg-action-disabled, .list-group, .on-surface
1935
+ ) {
1936
+ color: var(--zabi-theme-body);
1937
+ --color-headline: var(--zabi-theme-headline);
1938
+ --color-body: var(--zabi-theme-body);
1939
+ --color-label: var(--zabi-theme-label);
1940
+ --color-description: var(--zabi-theme-description);
1941
+ --color-caption: var(--zabi-theme-caption);
1942
+ --color-link: var(--zabi-theme-link);
1943
+ --color-link-hover: var(--zabi-theme-link-hover);
1944
+ --color-border: var(--zabi-theme-border);
1945
+ --color-border-medium: var(--zabi-theme-border-medium);
1946
+ --color-border-strong: var(--zabi-theme-border-strong);
1947
+ --color-control-border: var(--zabi-theme-control-border);
1948
+ --color-action-outline-border: var(--zabi-theme-action-outline-border);
1949
+ --color-action-outline-border-hover: var(--zabi-theme-action-outline-border-hover);
1950
+ --zabi-inv-primary: var(--color-action-primary);
1951
+ --zabi-inv-primary-hover: var(--color-action-primary-hover);
1952
+ --zabi-inv-primary-active: var(--color-action-primary-active);
1953
+ --zabi-inv-primary-text: var(--color-action-primary-text);
1954
+ --zabi-inv-accent: var(--color-accent);
1955
+ --zabi-inv-accent-hover: var(--color-accent-hover);
1956
+ --zabi-inv-accent-active: var(--color-accent-active);
1957
+ --zabi-inv-accent-text: var(--color-on-accent);
1958
+ --zabi-inv-secondary: var(--color-action-secondary);
1959
+ --zabi-inv-secondary-hover: var(--color-action-secondary-hover);
1960
+ --zabi-inv-secondary-active: var(--color-action-secondary-active);
1961
+ --zabi-inv-star: initial;
1962
+ }
1963
+ :where(.on-brand, .on-accent, .on-fill) :where(.bg-card-flat) {
1964
+ --color-card-flat: var(--color-card);
1965
+ --color-card-flat-hover: var(--color-card-hover);
1966
+ --color-card-flat-active: var(--color-card-active);
1967
+ }
1968
+ :where(.on-brand, .on-accent, .on-fill) :where(.bg-input) {
1969
+ --color-input: var(--color-input-solid);
1970
+ --color-input-hover: var(--color-input-solid-hover);
1971
+ --color-input-focus: var(--color-input-solid-focus);
1972
+ --color-input-active: var(--color-input-solid-active);
1973
+ }
1974
+ :where(.on-brand, .on-accent, .on-fill)
1975
+ :where(
1976
+ .bg-card, .bg-card-flat, .bg-card-elevated, .bg-background, .bg-surface-base,
1977
+ .bg-surface-raised, .bg-surface-elevated, .bg-surface-overlay, .bg-surface-overlay-hover,
1978
+ .bg-surface-chrome, .bg-surface-inset, .bg-surface-1, .bg-surface-2, .bg-surface-3,
1979
+ .bg-surface-4, .bg-input, .bg-input-disabled, .bg-accent-subtle,
1980
+ .bg-action-danger-subtle, .bg-action-primary-subtle, .bg-action-tonal, .bg-card-tint, .bg-chip, .bg-chip-selected,
1981
+ .bg-energetic-subtle, .bg-error-subtle,
1982
+ .bg-info-subtle, .bg-neutral-subtle, .bg-badge-neutral, .bg-toggle-thumb, .bg-toggle-thumb-checked, .bg-success-subtle, .bg-warning-subtle,
1983
+ .bg-nav-menu-active, .bg-action-disabled, .list-group, .on-surface
1984
+ )
1985
+ > :where(*) {
1986
+ --color-focus-ring: var(--zabi-theme-focus-ring);
1987
+ --color-focus-ring-muted: var(--zabi-theme-focus-ring-muted);
1988
+ --color-nav-menu-focus: var(--zabi-theme-nav-menu-focus);
1989
+ --color-focus-ring-offset: var(--zabi-theme-focus-ring-offset);
1990
+ --color-focus-ring-danger: var(--zabi-theme-focus-ring-danger);
1991
+ }
1992
+ .list-dividers > li + li,
1993
+ .list-group > li + li {
1994
+ position: relative;
1995
+ }
1996
+ .list-dividers > li + li::before,
1997
+ .list-group > li + li::before {
1998
+ content: "";
1999
+ position: absolute;
2000
+ inset-inline: 1rem;
2001
+ top: calc(-0.125rem - 0.5px);
2002
+ height: 1px;
2003
+ background-color: var(--zabi-list-divider-color, var(--color-border));
2004
+ pointer-events: none;
2005
+ }
2006
+ :is(.list-dividers, .list-group) > li:has(> [data-selected="true"])::before,
2007
+ :is(.list-dividers, .list-group) > li:has(> [data-selected="true"]) + li::before {
2008
+ display: none;
2009
+ }
2010
+ .list-group {
2011
+ @apply space-y-1 overflow-hidden rounded-xl border border-border p-1;
2012
+ background-color: var(--color-surface-1);
2013
+ --zabi-list-row-radius: calc(var(--radius-container) - 0.25rem - 1px);
2014
+ }
2015
+ .focus-brand {
2016
+ --zabi-focus-ring-color: var(--color-focus-ring);
2017
+ --zabi-focus-ring-offset-color: var(--color-focus-ring-offset);
2018
+ outline: none;
2019
+ }
2020
+
2021
+ .focus-brand:focus-visible {
2022
+ outline: none;
2023
+ --tw-ring-offset-shadow:
2024
+ 0 0 0 2px var(--zabi-focus-ring-offset-color),
2025
+ 0 0 0 4px var(--zabi-focus-ring-color);
2026
+ box-shadow:
2027
+ var(--tw-inset-shadow, 0 0 #0000),
2028
+ var(--tw-inset-ring-shadow, 0 0 #0000),
2029
+ var(--tw-ring-offset-shadow),
2030
+ var(--tw-ring-shadow, 0 0 #0000),
2031
+ var(--tw-shadow, 0 0 #0000);
2032
+ }
2033
+
2034
+ .focus-nav {
2035
+ --zabi-focus-ring-color: var(--color-nav-menu-focus);
2036
+ --zabi-focus-ring-offset-color: var(--color-focus-ring-offset);
2037
+ outline: none;
2038
+ }
2039
+
2040
+ .focus-nav:focus-visible {
2041
+ outline: none;
2042
+ --tw-ring-offset-shadow:
2043
+ 0 0 0 2px var(--zabi-focus-ring-offset-color),
2044
+ 0 0 0 4px var(--zabi-focus-ring-color);
2045
+ box-shadow:
2046
+ var(--tw-inset-shadow, 0 0 #0000),
2047
+ var(--tw-inset-ring-shadow, 0 0 #0000),
2048
+ var(--tw-ring-offset-shadow),
2049
+ var(--tw-ring-shadow, 0 0 #0000),
2050
+ var(--tw-shadow, 0 0 #0000);
2051
+ }
2052
+ .selection-control-label-row-interaction {
2053
+ @apply rounded-md transition-colors outline-none cursor-pointer hover:bg-surface-hover active:bg-surface-active has-disabled:opacity-50 has-disabled:cursor-not-allowed has-disabled:hover:bg-transparent has-disabled:active:bg-transparent;
2054
+ box-shadow: none;
2055
+ }
2056
+
2057
+ .selection-control-label-row-interaction:has(:focus-visible) {
2058
+ box-shadow:
2059
+ 0 0 0 2px var(--color-focus-ring-offset),
2060
+ 0 0 0 4px var(--color-focus-ring);
2061
+ }
2062
+ .select-container {
2063
+ max-width: 100%;
2064
+ }
2065
+ .selection-control-option-row {
2066
+ box-shadow: none;
2067
+ }
2068
+
2069
+ .selection-control-option-row:has(:checked) {
2070
+ box-shadow:
2071
+ 0 0 0 2px var(--color-focus-ring-offset),
2072
+ 0 0 0 4px var(--color-focus-ring);
2073
+ }
2074
+ .selection-control-option-row-quiet:has(:checked):not(:has(:focus-visible)) {
2075
+ box-shadow: none;
2076
+ }
2077
+ }
2078
+
2079
+ @media (forced-colors: active) {
2080
+ .focus-ring:focus-visible,
2081
+ .focus-brand:focus-visible,
2082
+ .focus-nav:focus-visible,
2083
+ .selection-control-label-row-interaction:has(:focus-visible) {
2084
+ outline: 2px solid Highlight;
2085
+ outline-offset: 2px;
2086
+ }
2087
+ }
2088
+
2089
+ @media (forced-colors: active) {
2090
+ .toggle-switch {
2091
+ border: 1px solid ButtonText;
2092
+ background-color: Canvas;
2093
+ background-image: none;
2094
+ }
2095
+ .toggle-switch-thumb {
2096
+ top: 1px;
2097
+ left: 1px;
2098
+ background-color: ButtonText;
2099
+ }
2100
+ .toggle-switch[aria-checked="true"] {
2101
+ border-color: Highlight;
2102
+ background-color: Highlight;
2103
+ }
2104
+ .toggle-switch[aria-checked="true"] .toggle-switch-thumb {
2105
+ background-color: HighlightText;
2106
+ }
2107
+ .toggle-switch:disabled {
2108
+ border-color: GrayText;
2109
+ opacity: 1;
2110
+ }
2111
+ .toggle-switch:disabled[aria-checked="true"] {
2112
+ background-color: GrayText;
2113
+ }
2114
+ .toggle-switch:disabled .toggle-switch-thumb {
2115
+ background-color: GrayText;
2116
+ }
2117
+ .toggle-switch:disabled[aria-checked="true"] .toggle-switch-thumb,
2118
+ .toggle-switch:disabled[aria-busy="true"] .toggle-switch-thumb {
2119
+ background-color: Canvas;
2120
+ }
2121
+
2122
+ .selection-control-shell {
2123
+ border-color: ButtonText;
2124
+ }
2125
+ .selection-control-shell:has(:checked) {
2126
+ border-color: Highlight;
2127
+ background-color: Highlight;
2128
+ }
2129
+ .selection-control-shell:has(:checked) > svg {
2130
+ color: HighlightText;
2131
+ }
2132
+ .selection-control-shell:has(:checked) > .selection-control-dot {
2133
+ background-color: HighlightText;
2134
+ }
2135
+ .selection-control-shell:has(:disabled) {
2136
+ border-color: GrayText;
2137
+ opacity: 1;
2138
+ }
2139
+ .selection-control-shell:has(:checked):has(:disabled) {
2140
+ background-color: GrayText;
2141
+ }
2142
+ .selection-control-shell:has(:checked):has(:disabled) > svg {
2143
+ color: Canvas;
2144
+ }
2145
+ .selection-control-shell:has(:checked):has(:disabled) > .selection-control-dot {
2146
+ background-color: Canvas;
2147
+ }
2148
+ .selection-control-label-row-interaction:has(:disabled) {
2149
+ opacity: 1;
2150
+ color: GrayText;
2151
+ }
2152
+ }
2153
+
2154
+ .bg-action-primary {
2155
+ background-color: var(--color-action-primary);
2156
+ }
2157
+
2158
+ @media (hover: hover) {
2159
+ .bg-action-primary:hover {
2160
+ background-color: var(--color-action-primary-hover);
2161
+ }
2162
+ }
2163
+
2164
+ .bg-action-primary:active {
2165
+ background-color: var(--color-action-primary-active);
2166
+ }
2167
+
2168
+ .bg-action-primary:disabled {
2169
+ background-color: var(--color-action-disabled);
2170
+ color: var(--color-action-disabled-text);
2171
+ }
2172
+
2173
+ .bg-action-primary-subtle {
2174
+ background-color: var(--color-action-primary-subtle);
2175
+ }
2176
+
2177
+ @media (hover: hover) {
2178
+ .bg-action-primary-subtle:hover {
2179
+ background-color: var(--color-action-primary-subtle-hover);
2180
+ }
2181
+ }
2182
+
2183
+ .text-action-primary {
2184
+ color: var(--color-action-primary-text);
2185
+ }
2186
+
2187
+ .bg-action-secondary {
2188
+ background-color: var(--color-action-secondary);
2189
+ }
2190
+
2191
+ @media (hover: hover) {
2192
+ .bg-action-secondary:hover {
2193
+ background-color: var(--color-action-secondary-hover);
2194
+ }
2195
+ }
2196
+
2197
+ .bg-action-secondary:active {
2198
+ background-color: var(--color-action-secondary-active);
2199
+ }
2200
+
2201
+ .bg-action-secondary:disabled {
2202
+ background-color: var(--color-action-disabled);
2203
+ color: var(--color-action-disabled-text);
2204
+ }
2205
+
2206
+ .bg-action-secondary-subtle {
2207
+ background-color: var(--color-action-secondary-subtle);
2208
+ }
2209
+
2210
+ @media (hover: hover) {
2211
+ .bg-action-secondary-subtle:hover {
2212
+ background-color: var(--color-action-secondary-subtle-hover);
2213
+ }
2214
+ }
2215
+
2216
+ .bg-action-tonal {
2217
+ background-color: var(--color-action-tonal);
2218
+ }
2219
+
2220
+ @media (hover: hover) {
2221
+ .bg-action-tonal:hover {
2222
+ background-color: var(--color-action-tonal-hover);
2223
+ }
2224
+ }
2225
+
2226
+ .bg-action-tonal:active {
2227
+ background-color: var(--color-action-tonal-active);
2228
+ }
2229
+
2230
+ .bg-action-tonal:disabled {
2231
+ background-color: var(--color-action-disabled);
2232
+ color: var(--color-action-disabled-text);
2233
+ }
2234
+
2235
+ .text-action-tonal {
2236
+ color: var(--color-action-tonal-text);
2237
+ }
2238
+
2239
+ @layer utilities {
2240
+ .bg-badge-neutral {
2241
+ background-color: var(--zabi-badge-neutral-fill, var(--color-neutral-subtle));
2242
+ }
2243
+ .text-badge-neutral {
2244
+ color: var(--zabi-badge-neutral-text, var(--color-neutral-text));
2245
+ }
2246
+ }
2247
+
2248
+ @layer utilities {
2249
+ .bg-skeleton-on-color {
2250
+ background-color: var(--zabi-skeleton-fill, color-mix(in srgb, currentColor 24%, transparent));
2251
+ }
2252
+ }
2253
+
2254
+ .bg-chip {
2255
+ background-color: var(--color-chip);
2256
+ }
2257
+
2258
+ .bg-chip-hover {
2259
+ background-color: var(--color-chip-hover);
2260
+ }
2261
+
2262
+ .bg-chip-active {
2263
+ background-color: var(--color-chip-active);
2264
+ }
2265
+
2266
+ @media (hover: hover) {
2267
+ .hover\:bg-chip-hover:hover {
2268
+ background-color: var(--color-chip-hover);
2269
+ }
2270
+ }
2271
+
2272
+ .active\:bg-chip-active:active {
2273
+ background-color: var(--color-chip-active);
2274
+ }
2275
+
2276
+ .text-chip-text {
2277
+ color: var(--color-chip-text);
2278
+ }
2279
+
2280
+ .bg-chip-selected {
2281
+ background-color: var(--color-chip-selected);
2282
+ }
2283
+
2284
+ .bg-chip-selected-hover {
2285
+ background-color: var(--color-chip-selected-hover);
2286
+ }
2287
+
2288
+ .bg-chip-selected-active {
2289
+ background-color: var(--color-chip-selected-active);
2290
+ }
2291
+
2292
+ @media (hover: hover) {
2293
+ .hover\:bg-chip-selected-hover:hover {
2294
+ background-color: var(--color-chip-selected-hover);
2295
+ }
2296
+ }
2297
+
2298
+ .active\:bg-chip-selected-active:active {
2299
+ background-color: var(--color-chip-selected-active);
2300
+ }
2301
+
2302
+ .text-chip-selected-text {
2303
+ color: var(--color-chip-selected-text);
2304
+ }
2305
+
2306
+ .bg-card-tint {
2307
+ background-color: var(--color-card-tint);
2308
+ }
2309
+
2310
+ .border-progress-track-border {
2311
+ border-color: var(--color-progress-track-border);
2312
+ }
2313
+
2314
+ .bg-toggle-track {
2315
+ background-color: var(--color-toggle-track);
2316
+ }
2317
+
2318
+ @media (hover: hover) {
2319
+ .bg-toggle-track:hover {
2320
+ background-color: var(--color-toggle-track-hover);
2321
+ }
2322
+ }
2323
+
2324
+ .bg-toggle-track:active {
2325
+ background-color: var(--color-toggle-track-active);
2326
+ }
2327
+
2328
+ .border-action-outline {
2329
+ border-color: var(--color-action-outline-border);
2330
+ }
2331
+
2332
+ @media (hover: hover) {
2333
+ .border-action-outline:hover,
2334
+ .hover\:border-action-outline-hover:hover {
2335
+ border-color: var(--color-action-outline-border-hover);
2336
+ }
2337
+ }
2338
+
2339
+ .bg-action-danger {
2340
+ background-color: var(--color-action-danger);
2341
+ }
2342
+
2343
+ @media (hover: hover) {
2344
+ .bg-action-danger:hover {
2345
+ background-color: var(--color-action-danger-hover);
2346
+ }
2347
+ }
2348
+
2349
+ .bg-action-danger:active {
2350
+ background-color: var(--color-action-danger-active);
2351
+ }
2352
+
2353
+ .bg-action-danger:disabled {
2354
+ background-color: var(--color-action-disabled);
2355
+ color: var(--color-action-disabled-text);
2356
+ }
2357
+
2358
+ .bg-action-danger-subtle {
2359
+ background-color: var(--color-action-danger-subtle);
2360
+ }
2361
+
2362
+ @media (hover: hover) {
2363
+ .bg-action-danger-subtle:hover {
2364
+ background-color: var(--color-action-danger-subtle-hover);
2365
+ }
2366
+ }
2367
+
2368
+ @media (hover: hover) {
2369
+ .hover\:text-body:hover {
2370
+ color: var(--color-body);
2371
+ }
2372
+
2373
+ .hover\:text-headline:hover {
2374
+ color: var(--color-headline);
2375
+ }
2376
+
2377
+ .hover\:text-link:hover {
2378
+ color: var(--color-link);
2379
+ }
2380
+
2381
+ .enabled\:hover\:text-error-text:enabled:hover {
2382
+ color: var(--color-error-text);
2383
+ }
2384
+
2385
+ .group:hover .group-hover\:text-headline\/90 {
2386
+ color: color-mix(in oklab, var(--color-headline) 90%, transparent);
2387
+ }
2388
+ }
2389
+
2390
+ .active\:text-headline:active {
2391
+ color: var(--color-headline);
2392
+ }
2393
+
2394
+ .active\:text-link:active {
2395
+ color: var(--color-link);
2396
+ }
2397
+
2398
+ .disabled\:text-action-disabled-text:disabled {
2399
+ color: var(--color-action-disabled-text);
2400
+ }
2401
+
2402
+ .disabled\:hover\:text-description:disabled:hover {
2403
+ color: var(--color-description);
2404
+ }
2405
+
2406
+ @media (hover: hover) {
2407
+ .hover\:border-border-medium:hover {
2408
+ border-color: var(--color-border-medium);
2409
+ }
2410
+
2411
+ .enabled\:hover\:border-border-medium:enabled:hover {
2412
+ border-color: var(--color-border-medium);
2413
+ }
2414
+ }
2415
+
2416
+ .disabled\:border-transparent:disabled {
2417
+ border-color: transparent;
2418
+ }
2419
+
2420
+ .disabled\:hover\:border-transparent:disabled:hover {
2421
+ border-color: transparent;
2422
+ }
2423
+
2424
+ @media (hover: hover) {
2425
+ .hover\:bg-accent-hover:hover {
2426
+ background-color: var(--color-accent-hover);
2427
+ }
2428
+
2429
+ .hover\:text-accent-hover:hover {
2430
+ color: var(--color-accent-hover);
2431
+ }
2432
+
2433
+ .hover\:border-accent-hover:hover {
2434
+ border-color: var(--color-accent-hover);
2435
+ }
2436
+
2437
+ .hover\:bg-nav-menu-active-hover:hover {
2438
+ background-color: var(--color-nav-menu-active-hover);
2439
+ }
2440
+ }
2441
+
2442
+ .active\:bg-accent-active:active {
2443
+ background-color: var(--color-accent-active);
2444
+ }
2445
+
2446
+ .active\:text-accent-active:active {
2447
+ color: var(--color-accent-active);
2448
+ }
2449
+
2450
+ .active\:border-accent-active:active {
2451
+ border-color: var(--color-accent-active);
2452
+ }
2453
+
2454
+ .active\:bg-info-active:active {
2455
+ background-color: var(--color-info-active);
2456
+ }
2457
+
2458
+ .active\:text-info-active:active {
2459
+ color: var(--color-info-active);
2460
+ }
2461
+
2462
+ .active\:border-info-active:active {
2463
+ border-color: var(--color-info-active);
2464
+ }
2465
+
2466
+ .active\:bg-action-primary-subtle-hover:active {
2467
+ background-color: var(--color-action-primary-subtle-hover);
2468
+ }
2469
+
2470
+ .active\:bg-action-danger-subtle-hover:active {
2471
+ background-color: var(--color-action-danger-subtle-hover);
2472
+ }
2473
+
2474
+ .active\:bg-action-primary-subtle-active:active {
2475
+ background-color: var(--color-action-primary-subtle-active, var(--color-action-primary-subtle-hover));
2476
+ }
2477
+
2478
+ .active\:bg-action-danger-subtle-active:active {
2479
+ background-color: var(--color-action-danger-subtle-active, var(--color-action-danger-subtle-hover));
2480
+ }
2481
+
2482
+ .disabled\:bg-action-disabled:disabled {
2483
+ background-color: var(--color-action-disabled);
2484
+ }
2485
+
2486
+ .z-sticky {
2487
+ z-index: var(--z-sticky);
2488
+ }
2489
+
2490
+ .z-fixed {
2491
+ z-index: var(--z-fixed);
2492
+ }
2493
+
2494
+ .z-dropdown {
2495
+ z-index: var(--z-dropdown);
2496
+ }
2497
+
2498
+ .z-modal {
2499
+ z-index: var(--z-modal);
2500
+ }
2501
+
2502
+ .z-modal-backdrop {
2503
+ z-index: var(--z-modal-backdrop);
2504
+ }
2505
+
2506
+ .z-popover {
2507
+ z-index: var(--z-popover);
2508
+ }
2509
+
2510
+ .z-tooltip {
2511
+ z-index: var(--z-tooltip);
2512
+ }
2513
+
2514
+ .z-toast {
2515
+ z-index: var(--z-toast);
2516
+ }
2517
+
2518
+ @keyframes slideUp {
2519
+ from {
2520
+ transform: translateY(100%);
2521
+ }
2522
+ to {
2523
+ transform: translateY(0);
2524
+ }
2525
+ }
2526
+
2527
+ .scrollbar-semantic {
2528
+ scrollbar-width: thin;
2529
+ scrollbar-color: var(--color-base-400) var(--color-base-100);
2530
+ }
2531
+
2532
+ .scrollbar-semantic::-webkit-scrollbar {
2533
+ width: 10px;
2534
+ height: 10px;
2535
+ }
2536
+
2537
+ .scrollbar-semantic::-webkit-scrollbar-track {
2538
+ background-color: var(--color-base-100);
2539
+ }
2540
+
2541
+ .scrollbar-semantic::-webkit-scrollbar-thumb {
2542
+ background-color: var(--color-base-400);
2543
+ border-radius: var(--radius-md);
2544
+ border: 2px solid var(--color-base-100);
2545
+ }
2546
+
2547
+ .scrollbar-semantic::-webkit-scrollbar-thumb:hover {
2548
+ background-color: var(--color-base-500);
2549
+ }