zabi-components 8.0.0 → 8.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (364) hide show
  1. package/CHANGELOG.md +1924 -0
  2. package/README.md +243 -10
  3. package/THEME.md +149 -332
  4. package/THEMING.md +1192 -266
  5. package/dist/atoms/ActionPanel.svelte +15 -5
  6. package/dist/atoms/Avatar.svelte +104 -0
  7. package/dist/atoms/Avatar.svelte.d.ts +34 -0
  8. package/dist/atoms/Badge.svelte +36 -7
  9. package/dist/atoms/Badge.svelte.d.ts +2 -2
  10. package/dist/atoms/Button.svelte +177 -27
  11. package/dist/atoms/Button.svelte.d.ts +30 -2
  12. package/dist/atoms/Card.svelte +4 -4
  13. package/dist/atoms/CardHeader.svelte +16 -4
  14. package/dist/atoms/Checkbox.svelte +48 -21
  15. package/dist/atoms/Checkbox.svelte.d.ts +4 -2
  16. package/dist/atoms/CodeBlock.svelte +20 -2
  17. package/dist/atoms/CodeBlock.svelte.d.ts +4 -0
  18. package/dist/atoms/ColorPicker.svelte +259 -49
  19. package/dist/atoms/ColorPicker.svelte.d.ts +3 -0
  20. package/dist/atoms/Container.svelte +16 -8
  21. package/dist/atoms/DateField.svelte +107 -0
  22. package/dist/atoms/DateField.svelte.d.ts +53 -0
  23. package/dist/atoms/FieldMessages.svelte +69 -0
  24. package/dist/atoms/FieldMessages.svelte.d.ts +23 -0
  25. package/dist/atoms/FloatingActionButton.svelte +174 -0
  26. package/dist/atoms/FloatingActionButton.svelte.d.ts +51 -0
  27. package/dist/atoms/Heading.svelte +37 -5
  28. package/dist/atoms/Heading.svelte.d.ts +7 -0
  29. package/dist/atoms/IconButton.svelte +220 -24
  30. package/dist/atoms/IconButton.svelte.d.ts +49 -4
  31. package/dist/atoms/Input.svelte +253 -52
  32. package/dist/atoms/Input.svelte.d.ts +32 -2
  33. package/dist/atoms/List.svelte +4 -1
  34. package/dist/atoms/ListItem.svelte +44 -11
  35. package/dist/atoms/ListItem.svelte.d.ts +5 -0
  36. package/dist/atoms/Progress.svelte +27 -8
  37. package/dist/atoms/Progress.svelte.d.ts +4 -0
  38. package/dist/atoms/Radio.svelte +19 -3
  39. package/dist/atoms/Radio.svelte.d.ts +4 -2
  40. package/dist/atoms/Rating.svelte +494 -0
  41. package/dist/atoms/Rating.svelte.d.ts +56 -0
  42. package/dist/atoms/Select.svelte +433 -91
  43. package/dist/atoms/Select.svelte.d.ts +49 -3
  44. package/dist/atoms/SelectionControl.svelte +94 -17
  45. package/dist/atoms/SelectionControl.svelte.d.ts +4 -3
  46. package/dist/atoms/Skeleton.svelte +1 -1
  47. package/dist/atoms/Slider.svelte +309 -0
  48. package/dist/atoms/Slider.svelte.d.ts +40 -0
  49. package/dist/atoms/Spinner.svelte +57 -0
  50. package/dist/atoms/Spinner.svelte.d.ts +19 -0
  51. package/dist/atoms/Table.svelte +151 -6
  52. package/dist/atoms/Table.svelte.d.ts +15 -3
  53. package/dist/atoms/TemporalField.svelte +140 -0
  54. package/dist/atoms/TemporalField.svelte.d.ts +32 -0
  55. package/dist/atoms/Text.svelte +23 -11
  56. package/dist/atoms/Text.svelte.d.ts +6 -3
  57. package/dist/atoms/Textarea.svelte +55 -44
  58. package/dist/atoms/Textarea.svelte.d.ts +14 -2
  59. package/dist/atoms/ThemeToggle.svelte +223 -44
  60. package/dist/atoms/ThemeToggle.svelte.d.ts +26 -3
  61. package/dist/atoms/TimeField.svelte +108 -0
  62. package/dist/atoms/TimeField.svelte.d.ts +54 -0
  63. package/dist/atoms/Toast.svelte +17 -4
  64. package/dist/atoms/Toast.svelte.d.ts +2 -0
  65. package/dist/atoms/Toggle.svelte +41 -8
  66. package/dist/atoms/Toggle.svelte.d.ts +11 -2
  67. package/dist/atoms/Tooltip.svelte +508 -23
  68. package/dist/atoms/Tooltip.svelte.d.ts +11 -0
  69. package/dist/atoms/ZabiStringsProvider.svelte +45 -0
  70. package/dist/atoms/ZabiStringsProvider.svelte.d.ts +27 -0
  71. package/dist/atoms/index.d.ts +17 -0
  72. package/dist/atoms/index.js +12 -0
  73. package/dist/atoms/selection-control.styles.d.ts +36 -5
  74. package/dist/atoms/selection-control.styles.js +40 -9
  75. package/dist/components/atoms/index.d.ts +17 -0
  76. package/dist/components/atoms/index.d.ts.map +1 -1
  77. package/dist/components/atoms/selection-control.styles.d.ts +36 -5
  78. package/dist/components/atoms/selection-control.styles.d.ts.map +1 -1
  79. package/dist/components/index.d.ts +80 -2
  80. package/dist/components/index.d.ts.map +1 -1
  81. package/dist/components/molecules/index.d.ts +46 -0
  82. package/dist/components/molecules/index.d.ts.map +1 -1
  83. package/dist/components/molecules/toast-store.d.ts +53 -7
  84. package/dist/components/molecules/toast-store.d.ts.map +1 -1
  85. package/dist/components/organisms/index.d.ts +5 -0
  86. package/dist/components/organisms/index.d.ts.map +1 -1
  87. package/dist/components/types/variants.d.ts +15 -1
  88. package/dist/components/types/variants.d.ts.map +1 -1
  89. package/dist/components/util/app-shell.d.ts +28 -0
  90. package/dist/components/util/app-shell.d.ts.map +1 -0
  91. package/dist/components/util/avatar.d.ts +36 -0
  92. package/dist/components/util/avatar.d.ts.map +1 -0
  93. package/dist/components/util/bottom-sheet.d.ts +30 -0
  94. package/dist/components/util/bottom-sheet.d.ts.map +1 -0
  95. package/dist/components/util/bottom-tab-bar.d.ts +35 -0
  96. package/dist/components/util/bottom-tab-bar.d.ts.map +1 -0
  97. package/dist/components/util/calendar.d.ts +56 -0
  98. package/dist/components/util/calendar.d.ts.map +1 -0
  99. package/dist/components/util/collapsible.d.ts +58 -0
  100. package/dist/components/util/collapsible.d.ts.map +1 -0
  101. package/dist/components/util/confirm-dialog.d.ts +12 -0
  102. package/dist/components/util/confirm-dialog.d.ts.map +1 -0
  103. package/dist/components/util/date.d.ts +96 -0
  104. package/dist/components/util/date.d.ts.map +1 -0
  105. package/dist/components/util/drawer.d.ts +13 -0
  106. package/dist/components/util/drawer.d.ts.map +1 -0
  107. package/dist/components/util/dropdown.d.ts +47 -0
  108. package/dist/components/util/dropdown.d.ts.map +1 -0
  109. package/dist/components/util/field.d.ts +39 -0
  110. package/dist/components/util/field.d.ts.map +1 -0
  111. package/dist/components/util/fit-in-viewport.d.ts +201 -0
  112. package/dist/components/util/fit-in-viewport.d.ts.map +1 -0
  113. package/dist/components/util/focus-utils.d.ts +75 -2
  114. package/dist/components/util/focus-utils.d.ts.map +1 -1
  115. package/dist/components/util/hydration.d.ts +45 -0
  116. package/dist/components/util/hydration.d.ts.map +1 -0
  117. package/dist/components/util/keyboard-inset.d.ts +18 -0
  118. package/dist/components/util/keyboard-inset.d.ts.map +1 -0
  119. package/dist/components/util/media-grid.d.ts +51 -0
  120. package/dist/components/util/media-grid.d.ts.map +1 -0
  121. package/dist/components/util/media.d.ts +6 -0
  122. package/dist/components/util/media.d.ts.map +1 -0
  123. package/dist/components/util/overlay-chrome.d.ts +53 -0
  124. package/dist/components/util/overlay-chrome.d.ts.map +1 -0
  125. package/dist/components/util/overlay.d.ts +72 -0
  126. package/dist/components/util/overlay.d.ts.map +1 -0
  127. package/dist/components/util/photo.d.ts +215 -0
  128. package/dist/components/util/photo.d.ts.map +1 -0
  129. package/dist/components/util/portal.d.ts +23 -0
  130. package/dist/components/util/portal.d.ts.map +1 -0
  131. package/dist/components/util/pull-to-refresh.d.ts +27 -0
  132. package/dist/components/util/pull-to-refresh.d.ts.map +1 -0
  133. package/dist/components/util/radio-keys.d.ts +25 -0
  134. package/dist/components/util/radio-keys.d.ts.map +1 -0
  135. package/dist/components/util/rating.d.ts +23 -0
  136. package/dist/components/util/rating.d.ts.map +1 -0
  137. package/dist/components/util/ready-made-strings.d.ts +77 -0
  138. package/dist/components/util/ready-made-strings.d.ts.map +1 -0
  139. package/dist/components/util/scroll-padding.d.ts +20 -0
  140. package/dist/components/util/scroll-padding.d.ts.map +1 -0
  141. package/dist/components/util/segmented-control.d.ts +16 -0
  142. package/dist/components/util/segmented-control.d.ts.map +1 -0
  143. package/dist/components/util/select.d.ts +41 -0
  144. package/dist/components/util/select.d.ts.map +1 -0
  145. package/dist/components/util/sheet-drag.d.ts +60 -0
  146. package/dist/components/util/sheet-drag.d.ts.map +1 -0
  147. package/dist/components/util/sidebar.d.ts +63 -0
  148. package/dist/components/util/sidebar.d.ts.map +1 -0
  149. package/dist/components/util/sortable-list.d.ts +65 -0
  150. package/dist/components/util/sortable-list.d.ts.map +1 -0
  151. package/dist/components/util/stepper.d.ts +40 -0
  152. package/dist/components/util/stepper.d.ts.map +1 -0
  153. package/dist/components/util/swipeable-list-item.d.ts +36 -0
  154. package/dist/components/util/swipeable-list-item.d.ts.map +1 -0
  155. package/dist/components/util/theme-mode.d.ts +80 -0
  156. package/dist/components/util/theme-mode.d.ts.map +1 -0
  157. package/dist/components/util/toaster.d.ts +93 -0
  158. package/dist/components/util/toaster.d.ts.map +1 -0
  159. package/dist/components/util/tooltip.d.ts +10 -0
  160. package/dist/components/util/tooltip.d.ts.map +1 -0
  161. package/dist/components/util/top-navbar.d.ts +11 -0
  162. package/dist/components/util/top-navbar.d.ts.map +1 -0
  163. package/dist/components/util/touch-target.d.ts +31 -0
  164. package/dist/components/util/touch-target.d.ts.map +1 -0
  165. package/dist/components/util/zabi-strings.d.ts +133 -0
  166. package/dist/components/util/zabi-strings.d.ts.map +1 -0
  167. package/dist/create-theme/cli.js +169 -0
  168. package/dist/create-theme/index.d.ts +176 -0
  169. package/dist/create-theme/index.js +817 -0
  170. package/dist/create-theme/lib/ramp-math.js +128 -0
  171. package/dist/create-theme/lib/resolve.js +141 -0
  172. package/dist/create-theme/theme-data.js +1116 -0
  173. package/dist/index.d.ts +80 -2
  174. package/dist/index.js +57 -2
  175. package/dist/molecules/Alert.svelte +33 -5
  176. package/dist/molecules/Alert.svelte.d.ts +2 -0
  177. package/dist/molecules/AppBar.svelte +415 -0
  178. package/dist/molecules/AppBar.svelte.d.ts +69 -0
  179. package/dist/molecules/AvatarGroup.svelte +116 -0
  180. package/dist/molecules/AvatarGroup.svelte.d.ts +40 -0
  181. package/dist/molecules/BottomSheet.svelte +540 -0
  182. package/dist/molecules/BottomSheet.svelte.d.ts +93 -0
  183. package/dist/molecules/BottomTabBar.svelte +297 -0
  184. package/dist/molecules/BottomTabBar.svelte.d.ts +64 -0
  185. package/dist/molecules/Calendar.svelte +597 -0
  186. package/dist/molecules/Calendar.svelte.d.ts +72 -0
  187. package/dist/molecules/Collapsible.svelte +243 -0
  188. package/dist/molecules/Collapsible.svelte.d.ts +44 -0
  189. package/dist/molecules/CollapsibleGroup.svelte +126 -0
  190. package/dist/molecules/CollapsibleGroup.svelte.d.ts +14 -0
  191. package/dist/molecules/ComponentDemo.svelte +16 -4
  192. package/dist/molecules/ComponentDemo.svelte.d.ts +3 -0
  193. package/dist/molecules/ConfirmDialog.svelte +253 -0
  194. package/dist/molecules/ConfirmDialog.svelte.d.ts +55 -0
  195. package/dist/molecules/ContactForm.svelte +34 -17
  196. package/dist/molecules/ContactForm.svelte.d.ts +8 -0
  197. package/dist/molecules/Drawer.svelte +394 -0
  198. package/dist/molecules/Drawer.svelte.d.ts +55 -0
  199. package/dist/molecules/Dropdown.svelte +509 -48
  200. package/dist/molecules/Dropdown.svelte.d.ts +45 -6
  201. package/dist/molecules/DropdownItem.svelte +122 -0
  202. package/dist/molecules/DropdownItem.svelte.d.ts +28 -0
  203. package/dist/molecules/EmptyState.svelte +55 -10
  204. package/dist/molecules/EmptyState.svelte.d.ts +8 -0
  205. package/dist/molecules/FormField.svelte +9 -1
  206. package/dist/molecules/FormField.svelte.d.ts +2 -0
  207. package/dist/molecules/Header.svelte +1 -1
  208. package/dist/molecules/ImageUpload.svelte +383 -70
  209. package/dist/molecules/ImageUpload.svelte.d.ts +47 -2
  210. package/dist/molecules/MediaGrid.svelte +527 -0
  211. package/dist/molecules/MediaGrid.svelte.d.ts +77 -0
  212. package/dist/molecules/Modal.svelte +288 -72
  213. package/dist/molecules/Modal.svelte.d.ts +51 -2
  214. package/dist/molecules/NavigationMenuContent.svelte +58 -1
  215. package/dist/molecules/NavigationMenuItem.svelte +0 -1
  216. package/dist/molecules/NavigationMenuLink.svelte +1 -1
  217. package/dist/molecules/NavigationMenuList.svelte +10 -3
  218. package/dist/molecules/NavigationMenuTrigger.svelte +2 -2
  219. package/dist/molecules/Page.svelte +32 -2
  220. package/dist/molecules/Page.svelte.d.ts +11 -0
  221. package/dist/molecules/PhotoGrid.svelte +433 -0
  222. package/dist/molecules/PhotoGrid.svelte.d.ts +62 -0
  223. package/dist/molecules/PhotoViewer.svelte +1116 -0
  224. package/dist/molecules/PhotoViewer.svelte.d.ts +56 -0
  225. package/dist/molecules/PropsTable.svelte +22 -10
  226. package/dist/molecules/PropsTable.svelte.d.ts +3 -0
  227. package/dist/molecules/PullToRefresh.svelte +263 -0
  228. package/dist/molecules/PullToRefresh.svelte.d.ts +52 -0
  229. package/dist/molecules/RadioGroup.svelte +52 -14
  230. package/dist/molecules/RadioGroup.svelte.d.ts +14 -3
  231. package/dist/molecules/Section.svelte +1 -1
  232. package/dist/molecules/SegmentedControl.svelte +323 -0
  233. package/dist/molecules/SegmentedControl.svelte.d.ts +34 -0
  234. package/dist/molecules/SidebarBrandHeader.svelte +11 -1
  235. package/dist/molecules/SidebarBrandHeader.svelte.d.ts +3 -0
  236. package/dist/molecules/SidebarFooter.svelte +29 -6
  237. package/dist/molecules/SidebarFooter.svelte.d.ts +3 -0
  238. package/dist/molecules/SlideUp.svelte +220 -61
  239. package/dist/molecules/SlideUp.svelte.d.ts +26 -0
  240. package/dist/molecules/SortableList.svelte +632 -0
  241. package/dist/molecules/SortableList.svelte.d.ts +69 -0
  242. package/dist/molecules/Stepper.svelte +548 -0
  243. package/dist/molecules/Stepper.svelte.d.ts +39 -0
  244. package/dist/molecules/StickyActionBar.svelte +191 -0
  245. package/dist/molecules/StickyActionBar.svelte.d.ts +65 -0
  246. package/dist/molecules/SwipeableListItem.svelte +334 -0
  247. package/dist/molecules/SwipeableListItem.svelte.d.ts +54 -0
  248. package/dist/molecules/Tabs.svelte +233 -9
  249. package/dist/molecules/Tabs.svelte.d.ts +7 -0
  250. package/dist/molecules/Toaster.svelte +350 -5
  251. package/dist/molecules/Toaster.svelte.d.ts +95 -2
  252. package/dist/molecules/ToasterToast.svelte +253 -67
  253. package/dist/molecules/ToasterToast.svelte.d.ts +9 -0
  254. package/dist/molecules/UnsavedChangesBar.svelte +212 -0
  255. package/dist/molecules/UnsavedChangesBar.svelte.d.ts +43 -0
  256. package/dist/molecules/index.d.ts +46 -0
  257. package/dist/molecules/index.js +27 -0
  258. package/dist/molecules/toast-store.d.ts +53 -7
  259. package/dist/molecules/toast-store.js +21 -0
  260. package/dist/organisms/AppShell.svelte +196 -0
  261. package/dist/organisms/AppShell.svelte.d.ts +61 -0
  262. package/dist/organisms/SidebarAccountPanel.svelte +107 -12
  263. package/dist/organisms/SidebarAccountPanel.svelte.d.ts +19 -0
  264. package/dist/organisms/SidebarNavigation.svelte +96 -15
  265. package/dist/organisms/SidebarNavigation.svelte.d.ts +29 -1
  266. package/dist/organisms/SidebarPanel.svelte +31 -10
  267. package/dist/organisms/SidebarShell.svelte +162 -11
  268. package/dist/organisms/SidebarShell.svelte.d.ts +56 -2
  269. package/dist/organisms/TopNavbar.svelte +256 -31
  270. package/dist/organisms/TopNavbar.svelte.d.ts +26 -0
  271. package/dist/organisms/index.d.ts +5 -0
  272. package/dist/organisms/index.js +3 -0
  273. package/dist/types/components.d.ts +4 -0
  274. package/dist/types/components.d.ts.map +1 -1
  275. package/dist/types/index.d.ts +605 -25
  276. package/dist/types/index.d.ts.map +1 -1
  277. package/dist/types/variants.ts +17 -1
  278. package/dist/util/app-shell.d.ts +27 -0
  279. package/dist/util/app-shell.js +72 -0
  280. package/dist/util/avatar.d.ts +35 -0
  281. package/dist/util/avatar.js +52 -0
  282. package/dist/util/bottom-sheet.d.ts +29 -0
  283. package/dist/util/bottom-sheet.js +43 -0
  284. package/dist/util/bottom-tab-bar.d.ts +34 -0
  285. package/dist/util/bottom-tab-bar.js +54 -0
  286. package/dist/util/calendar.d.ts +55 -0
  287. package/dist/util/calendar.js +74 -0
  288. package/dist/util/collapsible.d.ts +57 -0
  289. package/dist/util/collapsible.js +23 -0
  290. package/dist/util/confirm-dialog.d.ts +11 -0
  291. package/dist/util/confirm-dialog.js +2 -0
  292. package/dist/util/date.d.ts +95 -0
  293. package/dist/util/date.js +237 -0
  294. package/dist/util/drawer.d.ts +12 -0
  295. package/dist/util/drawer.js +7 -0
  296. package/dist/util/dropdown.d.ts +46 -0
  297. package/dist/util/dropdown.js +21 -0
  298. package/dist/util/field.d.ts +38 -0
  299. package/dist/util/field.js +38 -0
  300. package/dist/util/fit-in-viewport.d.ts +200 -0
  301. package/dist/util/fit-in-viewport.js +399 -0
  302. package/dist/util/focus-utils.d.ts +75 -2
  303. package/dist/util/focus-utils.js +182 -9
  304. package/dist/util/hydration.d.ts +44 -0
  305. package/dist/util/hydration.js +58 -0
  306. package/dist/util/keyboard-inset.d.ts +17 -0
  307. package/dist/util/keyboard-inset.js +53 -0
  308. package/dist/util/media-grid.d.ts +50 -0
  309. package/dist/util/media-grid.js +81 -0
  310. package/dist/util/media.d.ts +5 -0
  311. package/dist/util/media.js +10 -0
  312. package/dist/util/overlay-chrome.d.ts +52 -0
  313. package/dist/util/overlay-chrome.js +56 -0
  314. package/dist/util/overlay.d.ts +71 -0
  315. package/dist/util/overlay.js +240 -0
  316. package/dist/util/photo.d.ts +214 -0
  317. package/dist/util/photo.js +206 -0
  318. package/dist/util/portal.d.ts +22 -0
  319. package/dist/util/portal.js +50 -0
  320. package/dist/util/pull-to-refresh.d.ts +26 -0
  321. package/dist/util/pull-to-refresh.js +30 -0
  322. package/dist/util/radio-keys.d.ts +24 -0
  323. package/dist/util/radio-keys.js +49 -0
  324. package/dist/util/rating.d.ts +22 -0
  325. package/dist/util/rating.js +26 -0
  326. package/dist/util/ready-made-strings.d.ts +76 -0
  327. package/dist/util/ready-made-strings.js +67 -0
  328. package/dist/util/scroll-padding.d.ts +19 -0
  329. package/dist/util/scroll-padding.js +44 -0
  330. package/dist/util/segmented-control.d.ts +15 -0
  331. package/dist/util/segmented-control.js +1 -0
  332. package/dist/util/select.d.ts +40 -0
  333. package/dist/util/select.js +63 -0
  334. package/dist/util/sheet-drag.d.ts +59 -0
  335. package/dist/util/sheet-drag.js +241 -0
  336. package/dist/util/sidebar.d.ts +62 -0
  337. package/dist/util/sidebar.js +38 -0
  338. package/dist/util/sortable-list.d.ts +64 -0
  339. package/dist/util/sortable-list.js +53 -0
  340. package/dist/util/stepper.d.ts +39 -0
  341. package/dist/util/stepper.js +38 -0
  342. package/dist/util/swipeable-list-item.d.ts +35 -0
  343. package/dist/util/swipeable-list-item.js +32 -0
  344. package/dist/util/theme-mode.d.ts +79 -0
  345. package/dist/util/theme-mode.js +121 -0
  346. package/dist/util/toaster.d.ts +92 -0
  347. package/dist/util/toaster.js +75 -0
  348. package/dist/util/tooltip.d.ts +9 -0
  349. package/dist/util/tooltip.js +18 -0
  350. package/dist/util/top-navbar.d.ts +10 -0
  351. package/dist/util/top-navbar.js +5 -0
  352. package/dist/util/touch-target.d.ts +30 -0
  353. package/dist/util/touch-target.js +30 -0
  354. package/dist/util/zabi-strings.d.ts +132 -0
  355. package/dist/util/zabi-strings.js +105 -0
  356. package/dist/zabi-components-colors.css +5 -2
  357. package/dist/zabi-components-theme-dark-only.css +543 -241
  358. package/dist/zabi-components-theme-dark.css +543 -241
  359. package/dist/zabi-components-theme-only.css +1584 -367
  360. package/dist/zabi-components-theme.css +1584 -367
  361. package/dist/zabi-components.css +3885 -518
  362. package/docs/lucide-icons.md +40 -17
  363. package/docs/theme-imports.md +81 -11
  364. package/package.json +35 -8
package/THEME.md CHANGED
@@ -1,370 +1,239 @@
1
1
  # Zabi Components Theme Guide
2
2
 
3
- Complete guide to using and customizing the Zabi Components theme system with Tailwind CSS v4.
3
+ How to load the Zabi Components theme in an app that uses Tailwind CSS v4, and
4
+ how to use its tokens in your own CSS.
5
+
6
+ To give the library your own brand, read [THEMING.md](./THEMING.md). It lists
7
+ the tokens an app may set and documents the `zabi-theme` generator. This file
8
+ does not repeat it.
4
9
 
5
10
  ## Table of Contents
6
11
 
7
12
  - [Quick Start](#quick-start)
8
13
  - [Theme Files](#theme-files)
9
- - [Import Options](#import-options)
10
- - [Theme Extension](#theme-extension)
11
14
  - [Dark Mode](#dark-mode)
12
- - [Color System](#color-system)
13
- - [Customization Examples](#customization-examples)
15
+ - [Using the Tokens](#using-the-tokens)
16
+ - [Your Brand](#your-brand)
17
+ - [Adding Your Own Tokens](#adding-your-own-tokens)
14
18
  - [Common Pitfalls](#common-pitfalls)
19
+ - [Troubleshooting](#troubleshooting)
15
20
 
16
21
  ## Quick Start
17
22
 
18
- ### Basic Setup (Standalone)
19
-
20
- If you don't have Tailwind CSS set up yet:
23
+ ### With Tailwind in the app
21
24
 
22
25
  ```css
23
26
  /* app.css */
24
- @import 'zabi-components/theme';
25
- @import 'zabi-components/dist/zabi-components.css';
27
+ @import "tailwindcss";
28
+ @import "zabi-components/theme-only";
29
+ @import "zabi-components/theme-dark-only";
26
30
  ```
27
31
 
28
- ### Setup with Existing Tailwind
32
+ That is everything. The theme file tells Tailwind to scan the package's
33
+ components, so the classes they use are generated by your build; there is no
34
+ second stylesheet to import.
29
35
 
30
- If you already have Tailwind CSS configured:
36
+ ### Without Tailwind in the app
31
37
 
32
38
  ```css
33
39
  /* app.css */
34
- @import "tailwindcss";
35
- @import 'zabi-components/theme-only';
36
- @import 'zabi-components/dist/zabi-components.css';
40
+ @import "zabi-components/css";
37
41
  ```
38
42
 
39
- ### With Dark Mode
43
+ The compiled stylesheet holds the utilities the components use, in light and
44
+ dark.
45
+
46
+ ### Standalone theme files
47
+
48
+ `zabi-components/theme` and `zabi-components/theme-dark` are the same two theme
49
+ files with `@import "tailwindcss"` at the top, for a stylesheet that does not
50
+ import Tailwind itself. They still go through Tailwind's build.
40
51
 
41
52
  ```css
42
53
  /* app.css */
43
- @import "tailwindcss";
44
- @import 'zabi-components/theme-only';
45
- @import 'zabi-components/theme-dark-only';
46
- @import 'zabi-components/dist/zabi-components.css';
54
+ @import "zabi-components/theme";
55
+ @import "zabi-components/theme-dark";
47
56
  ```
48
57
 
49
58
  ## Theme Files
50
59
 
51
- Zabi Components provides multiple theme file variants:
52
-
53
60
  | File | Description | Use Case |
54
61
  |------|-------------|----------|
55
- | `zabi-components/theme` | Full theme with Tailwind import | Standalone projects |
56
- | `zabi-components/theme-only` | Theme without Tailwind import | Projects with existing Tailwind |
57
- | `zabi-components/theme-dark` | Dark mode with Tailwind import | Standalone + dark mode |
58
- | `zabi-components/theme-dark-only` | Dark mode without Tailwind import | Existing Tailwind + dark mode |
59
-
60
- ### Direct Path Imports
61
-
62
- You can also import using direct paths:
63
-
64
- ```css
65
- @import 'zabi-components/dist/zabi-components-theme.css';
66
- @import 'zabi-components/dist/zabi-components-theme-only.css';
67
- @import 'zabi-components/dist/zabi-components-theme-dark.css';
68
- @import 'zabi-components/dist/zabi-components-theme-dark-only.css';
69
- ```
70
-
71
- ## Import Options
72
-
73
- ### Option 1: Standalone (No Existing Tailwind)
74
-
75
- Best for new projects or projects without Tailwind:
76
-
77
- ```css
78
- @import 'zabi-components/theme';
79
- @import 'zabi-components/theme-dark'; /* Optional: for dark mode */
80
- @import 'zabi-components/dist/zabi-components.css';
81
- ```
82
-
83
- **Pros:**
84
- - Simple setup
85
- - No Tailwind configuration needed
86
- - Everything included
87
-
88
- **Cons:**
89
- - Less control over Tailwind configuration
90
- - Slightly larger bundle if you need custom Tailwind config
91
-
92
- ### Option 2: With Existing Tailwind
93
-
94
- Best for projects already using Tailwind CSS:
95
-
96
- ```css
97
- @import "tailwindcss";
98
- @import 'zabi-components/theme-only';
99
- @import 'zabi-components/theme-dark-only'; /* Optional: for dark mode */
100
- @import 'zabi-components/dist/zabi-components.css';
101
- ```
102
-
103
- **Pros:**
104
- - Full control over Tailwind configuration
105
- - Can customize Tailwind before importing theme
106
- - Smaller bundle (no duplicate Tailwind import)
62
+ | `zabi-components/theme-only` | Every token, light values. No Tailwind import. | Apps that import Tailwind themselves |
63
+ | `zabi-components/theme-dark-only` | Dark role remaps. No Tailwind import. Needs the light theme. | The same apps, for dark mode |
64
+ | `zabi-components/theme` | `theme-only` with `@import "tailwindcss"` | A stylesheet without its own Tailwind import |
65
+ | `zabi-components/theme-dark` | `theme-dark-only` with `@import "tailwindcss"`. Needs the light theme. | The same, for dark mode |
66
+ | `zabi-components/css` | The compiled stylesheet | Apps without Tailwind |
67
+ | `zabi-components/colors` | The tokens as plain custom properties, light and dark | Apps that want only the variables |
107
68
 
108
- **Cons:**
109
- - Requires Tailwind setup
110
- - Must import Tailwind first
111
-
112
- ## Theme Extension
113
-
114
- You can extend the Zabi theme with your own customizations using additional `@theme` blocks:
115
-
116
- ```css
117
- @import "tailwindcss";
118
- @import 'zabi-components/theme-only';
119
-
120
- /* Your custom theme extensions */
121
- @theme {
122
- /* Custom font families */
123
- --font-family-title: 'Your Font', sans-serif;
124
- --font-family-body: 'Another Font', sans-serif;
125
-
126
- /* Custom colors */
127
- --color-custom-primary: #ff0000;
128
- --color-custom-secondary: #00ff00;
129
- }
130
-
131
- @import 'zabi-components/dist/zabi-components.css';
132
- ```
133
-
134
- ### Important: Import Order
135
-
136
- The import order is critical:
137
-
138
- 1. **First:** `@import "tailwindcss"` (if using theme-only)
139
- 2. **Second:** `@import 'zabi-components/theme-only'` (or theme)
140
- 3. **Third:** Your custom `@theme` block (extends zabi theme)
141
- 4. **Fourth:** `@import 'zabi-components/dist/zabi-components.css'` (uses the theme)
142
-
143
- This order ensures:
144
- - Tailwind is available for `theme()` function calls
145
- - Zabi theme is defined first
146
- - Your extensions override zabi defaults
147
- - Components can use all theme values
69
+ The full matrix, the legacy `dist/` paths and what each file contains are in
70
+ [docs/theme-imports.md](./docs/theme-imports.md).
148
71
 
149
72
  ## Dark Mode
150
73
 
151
- Zabi Components supports dark mode through CSS custom properties in the `.dark` class.
74
+ Import the dark theme file after the light one. It only remaps roles; the raw
75
+ palettes (`--zabi-brand-*`, `--zabi-accent-*`, `--zabi-base-*` and the other
76
+ ramps) are declared once, in the light theme, so the dark file does nothing on
77
+ its own.
152
78
 
153
- ### Automatic Dark Mode (System Preference)
79
+ Dark is switched on the `<html>` element, by an attribute or by a class:
154
80
 
155
- ```css
156
- @import "tailwindcss";
157
- @import 'zabi-components/theme-only';
158
- @import 'zabi-components/theme-dark-only'; /* Supports system preference */
159
- @import 'zabi-components/dist/zabi-components.css';
160
- ```
161
-
162
- The dark theme file uses `@media (prefers-color-scheme: dark)` to automatically switch based on system preference.
81
+ | On `<html>` | Result |
82
+ |---|---|
83
+ | nothing | light, also on a dark system |
84
+ | `data-theme="light"` | light |
85
+ | `data-theme="dark"` | dark |
86
+ | `data-theme="auto"` | follows the system (`prefers-color-scheme`) |
87
+ | `class="dark"` | dark, the same as `data-theme="dark"` |
163
88
 
164
- ### Manual Dark Mode Toggle
89
+ Following the system is opt-in:
165
90
 
166
- For manual dark mode toggling, add the `.dark` class to your HTML element:
167
-
168
- ```javascript
169
- // Toggle dark mode
170
- document.documentElement.classList.toggle('dark');
91
+ ```html
92
+ <!-- Follow the phone's setting, with no script -->
93
+ <html data-theme="auto">
171
94
  ```
172
95
 
173
- The dark theme file also includes `.dark` class support, so both system preference and manual toggle work.
174
-
175
- ### Custom Dark Mode Colors
176
-
177
- You can override dark mode colors in your custom theme:
178
-
179
- ```css
180
- @import "tailwindcss";
181
- @import 'zabi-components/theme-only';
182
- @import 'zabi-components/theme-dark-only';
183
-
184
- @theme {
185
- /* Your light mode customizations */
186
- --color-custom: #ff0000;
187
- }
188
-
189
- /* Custom dark mode overrides */
190
- .dark {
191
- --color-custom: #ff6666; /* Lighter red for dark mode */
192
- }
96
+ To switch from a script:
193
97
 
194
- @import 'zabi-components/dist/zabi-components.css';
98
+ ```javascript
99
+ document.documentElement.dataset.theme = "dark"; // "light" | "auto"
100
+ // or
101
+ document.documentElement.classList.toggle("dark");
195
102
  ```
196
103
 
197
- ## Color System
198
-
199
- Zabi Components uses a semantic color system with the following color scales:
200
-
201
- ### Color Scales
202
-
203
- - **Brand** - Primary brand colors (blue palette)
204
- - **Citron** - Energetic/yellow colors
205
- - **Pine** - Success/green colors
206
- - **Iris** - Info/purple colors
104
+ The details (`color-scheme`, why the attribute goes on `<html>` only, what
105
+ `ThemeToggle` reads) are in [THEMING.md](./THEMING.md#light-dark-and-auto).
207
106
 
208
- Each scale includes shades from 50 (lightest) to 950 (darkest).
107
+ ## Using the Tokens
209
108
 
210
- ### Semantic Colors
109
+ Components paint with **roles**: tokens that say what a colour is for and are
110
+ already the right value in each mode. Use the same roles in your own CSS.
211
111
 
212
- Semantic colors map to specific use cases:
213
-
214
- - `--color-background` - Main background
215
- - `--color-headline` - Headings and titles
216
- - `--color-body` - Body text
217
- - `--color-description` - Secondary/description text
218
- - `--color-caption` - Captions and labels
112
+ - `--color-surface-base` / `-raised` / `-elevated` / `-overlay` - Surface levels: page, cards, nested cards, floating panels
113
+ - `--color-surface-inset` - A recessed area on a card (a well); see THEMING.md, Surface elevation levels
114
+ - `--color-headline`, `--color-body`, `--color-description`, `--color-caption` - Text
219
115
  - `--color-border` - Borders and dividers
220
- - `--color-surface-elevated` - Elevated surfaces (cards, modals)
221
- - `--color-surface-level-0/1/2` - Surface hierarchy
222
- - `--color-primary` - Primary actions
223
- - `--color-secondary` - Secondary actions
224
- - `--color-success` - Success states
225
- - `--color-warning` - Warning states
226
- - `--color-error` - Error states
227
-
228
- ### Using Colors
229
-
230
- #### In CSS
116
+ - `--color-action-primary`, `-hover`, `-active` - Primary actions
117
+ - `--color-on-brand` - Text on a primary fill (`--color-action-primary-text` follows it)
118
+ - `--color-accent`, `-hover`, `-active`, `-subtle`, `-border`, `-text` - The second brand colour
119
+ - `--color-on-accent` - Text on a solid accent fill
120
+ - `--color-link`, `--color-focus-ring` - Links and the focus ring
121
+ - `--color-focus-ring-muted` - The neutral ring of ghost and link controls (`.focus-ring--muted`)
122
+ - `--color-focus-ring-danger` - The ring of a destructive control (`.focus-ring--danger`); `--color-error` by default
123
+ - `--color-control-border` (`border-control-border`) - The edge of a control that has nothing else to be seen by, such as the outline of an empty Rating star. `--color-border-strong` is a decorative edge and is under 3:1 on the dark elevated and overlay surfaces
124
+ - `--color-input-border` (`border-input-border`) - The edge of a form field (Input, Textarea, Select, DateField, TimeField). Held to 3:1 on the field fill (`--color-input`), the page and the card in both themes (WCAG 1.4.11); `--color-input-border-hover` is one step darker in light
125
+ - `--color-progress-fill`, `--color-progress-track` (`bg-progress-fill`, `bg-progress-track`) - The fill and the track of Progress. The fill is `--color-action-primary` and the track `--color-input`, so the bar follows a pinned primary action. Held to 3:1 (fill on track) in both themes
126
+ - `--color-success`, `--color-warning`, `--color-error`, `--color-info` - States, each with `-subtle`, `-border` and `-text`
127
+
128
+ The full list is in [THEMING.md](./THEMING.md#roles-read-them-do-not-set-them).
129
+
130
+ ### In CSS
231
131
 
232
132
  ```css
233
133
  .my-element {
234
- background-color: var(--color-primary);
235
- color: var(--color-headline);
134
+ background-color: var(--color-action-primary);
135
+ color: var(--color-on-brand);
236
136
  }
237
137
  ```
238
138
 
239
- #### In Tailwind Classes
240
-
241
- Zabi Components provides utility classes:
139
+ ### In Tailwind classes
242
140
 
243
141
  ```html
244
- <div class="bg-primary text-headline">
245
- Primary background with headline text
142
+ <div class="bg-card text-headline border border-border">
143
+ A card surface with headline text
246
144
  </div>
247
145
  ```
248
146
 
249
- #### In Tailwind theme() Function
250
-
251
- ```css
252
- .custom-class {
253
- color: theme(colors.brand.600);
254
- background: theme(colors.surface.elevated);
255
- }
256
- ```
257
-
258
- ## Customization Examples
259
-
260
- ### Example 1: Custom Brand Colors
261
-
262
- ```css
263
- @import "tailwindcss";
264
- @import 'zabi-components/theme-only';
147
+ ## Your Brand
265
148
 
149
+ Generate one file from your brand colour and import it after the theme. It
150
+ covers light and dark.
266
151
 
267
- @import 'zabi-components/dist/zabi-components.css';
152
+ ```bash
153
+ npx zabi-theme --brand "#C17B00" --neutral "#78716c" --out src/lib/brand.generated.css
268
154
  ```
269
155
 
270
- ### Example 2: Custom Fonts
271
-
272
156
  ```css
273
157
  @import "tailwindcss";
274
- @import 'zabi-components/theme-only';
158
+ @import "zabi-components/theme-only";
159
+ @import "zabi-components/theme-dark-only";
160
+ @import "./lib/brand.generated.css";
275
161
 
276
- @theme {
277
- --font-family-title: 'Inter', 'Helvetica', sans-serif;
278
- --font-family-body: 'Inter', 'Helvetica', sans-serif;
279
- --font-family-sans: 'Inter', ui-sans-serif, system-ui, sans-serif;
162
+ :root {
163
+ --font-family-heading: "Your Display Font", var(--font-family-sans);
280
164
  }
281
-
282
- @import 'zabi-components/dist/zabi-components.css';
283
165
  ```
284
166
 
285
- ### Example 3: Custom Semantic Colors
286
-
287
- ```css
288
- @import "tailwindcss";
289
- @import 'zabi-components/theme-only';
290
-
291
- @theme {
292
- /* Custom primary color */
293
- --color-primary: theme(colors.purple.600);
294
- --color-primary-weak: theme(colors.purple.700);
295
- --color-primary-medium: theme(colors.purple.800);
296
- --color-primary-strong: theme(colors.purple.900);
297
- }
167
+ Which tokens an app may set, what the generator checks and what does not
168
+ follow an override: [THEMING.md](./THEMING.md).
298
169
 
299
- @import 'zabi-components/dist/zabi-components.css';
300
- ```
170
+ ## Adding Your Own Tokens
301
171
 
302
- ### Example 4: Multiple Theme Variants
172
+ A token of your own goes in a `@theme` block after the theme import. Tailwind
173
+ then generates utilities for it (`bg-quiz-gold` here), next to the library's.
303
174
 
304
175
  ```css
305
176
  @import "tailwindcss";
306
- @import 'zabi-components/theme-only';
177
+ @import "zabi-components/theme-only";
307
178
 
308
- /* Default theme */
309
179
  @theme {
310
- --color-primary: theme(colors.blue.600);
180
+ --color-quiz-gold: #d4a017;
311
181
  }
312
-
313
- /* Custom variant */
314
- .variant-custom {
315
- --color-primary: theme(colors.purple.600);
316
- --color-secondary: theme(colors.pink.600);
317
- }
318
-
319
- @import 'zabi-components/dist/zabi-components.css';
320
182
  ```
321
183
 
184
+ Use a name the library does not use. The library's own tokens are set on
185
+ `:root`, as THEMING.md describes, not redeclared in `@theme`.
186
+
322
187
  ## Common Pitfalls
323
188
 
324
- ### Pitfall 1: Wrong Import Order
189
+ ### Pitfall 1: Importing the compiled stylesheet as well
325
190
 
326
191
  **Wrong:**
327
192
  ```css
328
- @import 'zabi-components/dist/zabi-components.css';
329
- @import 'zabi-components/theme-only'; /* Too late! */
193
+ @import "tailwindcss";
194
+ @import "zabi-components/theme-only";
195
+ @import "zabi-components/css"; /* a second, finished Tailwind build */
330
196
  ```
331
197
 
332
198
  **Correct:**
333
199
  ```css
334
200
  @import "tailwindcss";
335
- @import 'zabi-components/theme-only';
336
- @import 'zabi-components/dist/zabi-components.css';
201
+ @import "zabi-components/theme-only";
337
202
  ```
338
203
 
204
+ Two Tailwind builds cannot be sorted into one order, so responsive variants
205
+ lose to plain utilities from the other build. See
206
+ [docs/theme-imports.md](./docs/theme-imports.md), "Tailwind together with the
207
+ compiled stylesheet".
208
+
339
209
  ### Pitfall 2: Double Tailwind Import
340
210
 
341
211
  **Wrong:**
342
212
  ```css
343
213
  @import "tailwindcss";
344
- @import 'zabi-components/theme'; /* This also imports Tailwind! */
214
+ @import "zabi-components/theme"; /* This also imports Tailwind! */
345
215
  ```
346
216
 
347
217
  **Correct:**
348
218
  ```css
349
219
  @import "tailwindcss";
350
- @import 'zabi-components/theme-only'; /* Use theme-only */
220
+ @import "zabi-components/theme-only"; /* Use theme-only */
351
221
  ```
352
222
 
353
- ### Pitfall 3: Theme Extension After Components
223
+ ### Pitfall 3: Overrides Before the Theme
354
224
 
355
225
  **Wrong:**
356
226
  ```css
357
- @import 'zabi-components/theme-only';
358
- @import 'zabi-components/dist/zabi-components.css';
359
- @theme { /* Too late! */ }
227
+ @import "./lib/brand.generated.css"; /* the dark theme below wins where both set a token */
228
+ @import "zabi-components/theme-only";
229
+ @import "zabi-components/theme-dark-only";
360
230
  ```
361
231
 
362
232
  **Correct:**
363
233
  ```css
364
- @import "tailwindcss";
365
- @import 'zabi-components/theme-only';
366
- @theme { /* Extend before components */ }
367
- @import 'zabi-components/dist/zabi-components.css';
234
+ @import "zabi-components/theme-only";
235
+ @import "zabi-components/theme-dark-only";
236
+ @import "./lib/brand.generated.css";
368
237
  ```
369
238
 
370
239
  ### Pitfall 4: Missing Dark Mode Import
@@ -373,101 +242,49 @@ If you want dark mode support, you must import the dark theme file:
373
242
 
374
243
  ```css
375
244
  @import "tailwindcss";
376
- @import 'zabi-components/theme-only';
377
- @import 'zabi-components/theme-dark-only'; /* Don't forget this! */
378
- @import 'zabi-components/dist/zabi-components.css';
245
+ @import "zabi-components/theme-only";
246
+ @import "zabi-components/theme-dark-only"; /* Don't forget this! */
379
247
  ```
380
248
 
381
- ### Pitfall 5: Using theme() Before Theme is Defined
249
+ ### Pitfall 5: `theme()` for a Colour
382
250
 
383
- **Wrong:**
384
- ```css
385
- @theme {
386
- --color-custom: theme(colors.brand.600); /* Works */
387
- --color-other: theme(colors.custom.500); /* Fails - custom not defined yet */
388
- }
389
- ```
251
+ Tailwind's `theme()` function is replaced at build time with the token's light
252
+ definition, so `theme(colors.brand.600)` is the light step in dark mode too.
253
+ Use the variable, which is resolved in the browser:
390
254
 
391
- **Correct:**
392
255
  ```css
393
- @theme {
394
- --color-custom: theme(colors.brand.600);
395
- /* Define custom colors first, then reference them */
396
- --color-custom-500: #ff0000;
397
- --color-other: var(--color-custom-500); /* Use var() for custom colors */
256
+ .custom-class {
257
+ color: var(--color-brand-600);
258
+ background: var(--color-surface-elevated);
398
259
  }
399
260
  ```
400
261
 
401
262
  ## Troubleshooting
402
263
 
403
- ### Theme Variables Not Working
264
+ ### Components Look Unstyled
404
265
 
405
- 1. Check import order (theme must come before components CSS)
406
- 2. Verify you're using the correct theme file variant
407
- 3. Ensure Tailwind is imported if using `theme-only`
408
- 4. Check browser console for CSS errors
266
+ 1. Check that the theme is imported, after Tailwind
267
+ 2. Check the package version: the theme files in 8.0.0 and earlier left components unstyled
268
+ 3. Check the browser console for CSS errors
409
269
 
410
270
  ### Dark Mode Not Working
411
271
 
412
272
  1. Ensure dark theme file is imported
413
- 2. Check that `.dark` class is applied to `<html>` or root element
414
- 3. Verify system preference detection (if using automatic mode)
415
- 4. Check that dark mode CSS custom properties are defined
416
-
417
- ### Colors Not Updating
418
-
419
- 1. Clear browser cache
420
- 2. Restart dev server
421
- 3. Check for CSS specificity issues
422
- 4. Verify theme extension is after zabi theme import
423
-
424
- ## Advanced Usage
273
+ 2. Check that `class="dark"` or `data-theme="dark"` is on `<html>`, not on an element inside it
274
+ 3. To follow the system, set `data-theme="auto"`; nothing follows it by default
275
+ 4. Check that the light theme is imported too: the dark file only remaps its tokens
425
276
 
426
- ### Programmatic Theme Switching
277
+ ### Brand Colours Not Updating
427
278
 
428
- ```javascript
429
- // Switch to dark mode
430
- document.documentElement.classList.add('dark');
431
-
432
- // Switch to light mode
433
- document.documentElement.classList.remove('dark');
434
-
435
- // Toggle
436
- document.documentElement.classList.toggle('dark');
437
- ```
438
-
439
- ### Theme with Svelte
440
-
441
- ```svelte
442
- <script>
443
- import { onMount } from 'svelte';
444
-
445
- let isDark = $state(false);
446
-
447
- onMount(() => {
448
- // Check system preference
449
- const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
450
- isDark = prefersDark;
451
- updateTheme();
452
- });
453
-
454
- function updateTheme() {
455
- if (isDark) {
456
- document.documentElement.classList.add('dark');
457
- } else {
458
- document.documentElement.classList.remove('dark');
459
- }
460
- }
461
- </script>
462
-
463
- <button on:click={() => { isDark = !isDark; updateTheme(); }}>
464
- Toggle Theme
465
- </button>
466
- ```
279
+ 1. Check that the brand file is imported after both theme files
280
+ 2. Check that the overrides are on `:root`, not on an element inside the page
281
+ 3. Check that it sets `--zabi-brand-*`, not `--color-brand-*`
282
+ 4. Restart the dev server
467
283
 
468
284
  ## Additional Resources
469
285
 
286
+ - [THEMING.md](./THEMING.md): the theming guide and token API
287
+ - [docs/theme-imports.md](./docs/theme-imports.md): every CSS export
470
288
  - [Tailwind CSS v4 Documentation](https://tailwindcss.com/docs)
471
289
  - [CSS Custom Properties](https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties)
472
- - [Zabi Components GitHub](https://github.com/zabi-components/zabi-components)
473
-
290
+ - [Zabi Components on GitHub](https://github.com/sabnor/zabi-components)