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