zabi-components 7.0.2 → 8.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (433) hide show
  1. package/CHANGELOG.md +1924 -0
  2. package/README.md +287 -11
  3. package/THEME.md +149 -332
  4. package/THEMING.md +1329 -163
  5. package/dist/atoms/ActionPanel.svelte +24 -9
  6. package/dist/atoms/ActionPanel.svelte.d.ts +2 -0
  7. package/dist/atoms/Avatar.svelte +104 -0
  8. package/dist/atoms/Avatar.svelte.d.ts +34 -0
  9. package/dist/atoms/Badge.svelte +124 -58
  10. package/dist/atoms/Badge.svelte.d.ts +17 -5
  11. package/dist/atoms/Button.svelte +212 -62
  12. package/dist/atoms/Button.svelte.d.ts +33 -2
  13. package/dist/atoms/Card.svelte +31 -28
  14. package/dist/atoms/Card.svelte.d.ts +5 -2
  15. package/dist/atoms/CardContent.svelte +10 -2
  16. package/dist/atoms/CardContent.svelte.d.ts +2 -0
  17. package/dist/atoms/CardFooter.svelte +10 -2
  18. package/dist/atoms/CardFooter.svelte.d.ts +2 -0
  19. package/dist/atoms/CardHeader.svelte +26 -6
  20. package/dist/atoms/CardHeader.svelte.d.ts +2 -0
  21. package/dist/atoms/Checkbox.svelte +52 -21
  22. package/dist/atoms/Checkbox.svelte.d.ts +6 -2
  23. package/dist/atoms/CodeBlock.svelte +35 -9
  24. package/dist/atoms/CodeBlock.svelte.d.ts +13 -3
  25. package/dist/atoms/ColorPicker.svelte +272 -52
  26. package/dist/atoms/ColorPicker.svelte.d.ts +6 -1
  27. package/dist/atoms/Container.svelte +17 -10
  28. package/dist/atoms/DateField.svelte +107 -0
  29. package/dist/atoms/DateField.svelte.d.ts +53 -0
  30. package/dist/atoms/Divider.svelte +4 -4
  31. package/dist/atoms/FeatureCard.svelte +4 -3
  32. package/dist/atoms/FieldMessages.svelte +69 -0
  33. package/dist/atoms/FieldMessages.svelte.d.ts +23 -0
  34. package/dist/atoms/FloatingActionButton.svelte +174 -0
  35. package/dist/atoms/FloatingActionButton.svelte.d.ts +51 -0
  36. package/dist/atoms/Heading.svelte +93 -32
  37. package/dist/atoms/Heading.svelte.d.ts +24 -4
  38. package/dist/atoms/IconButton.svelte +242 -53
  39. package/dist/atoms/IconButton.svelte.d.ts +49 -4
  40. package/dist/atoms/Input.svelte +267 -74
  41. package/dist/atoms/Input.svelte.d.ts +32 -2
  42. package/dist/atoms/List.svelte +13 -2
  43. package/dist/atoms/List.svelte.d.ts +2 -0
  44. package/dist/atoms/ListItem.svelte +44 -11
  45. package/dist/atoms/ListItem.svelte.d.ts +5 -0
  46. package/dist/atoms/ListItemLeading.svelte +4 -2
  47. package/dist/atoms/ListItemLeading.svelte.d.ts +1 -1
  48. package/dist/atoms/OptimizedImage.svelte +11 -2
  49. package/dist/atoms/OptimizedImage.svelte.d.ts +2 -0
  50. package/dist/atoms/Progress.svelte +31 -9
  51. package/dist/atoms/Progress.svelte.d.ts +6 -0
  52. package/dist/atoms/Radio.svelte +23 -3
  53. package/dist/atoms/Radio.svelte.d.ts +6 -2
  54. package/dist/atoms/Rating.svelte +494 -0
  55. package/dist/atoms/Rating.svelte.d.ts +56 -0
  56. package/dist/atoms/Select.svelte +475 -135
  57. package/dist/atoms/Select.svelte.d.ts +52 -2
  58. package/dist/atoms/SelectionControl.svelte +99 -18
  59. package/dist/atoms/SelectionControl.svelte.d.ts +6 -3
  60. package/dist/atoms/Skeleton.svelte +5 -3
  61. package/dist/atoms/Slider.svelte +309 -0
  62. package/dist/atoms/Slider.svelte.d.ts +40 -0
  63. package/dist/atoms/Spinner.svelte +57 -0
  64. package/dist/atoms/Spinner.svelte.d.ts +19 -0
  65. package/dist/atoms/Table.svelte +152 -6
  66. package/dist/atoms/Table.svelte.d.ts +15 -3
  67. package/dist/atoms/TemporalField.svelte +140 -0
  68. package/dist/atoms/TemporalField.svelte.d.ts +32 -0
  69. package/dist/atoms/Text.svelte +56 -15
  70. package/dist/atoms/Text.svelte.d.ts +13 -4
  71. package/dist/atoms/Textarea.svelte +57 -45
  72. package/dist/atoms/Textarea.svelte.d.ts +14 -2
  73. package/dist/atoms/ThemeToggle.svelte +238 -56
  74. package/dist/atoms/ThemeToggle.svelte.d.ts +28 -3
  75. package/dist/atoms/TimeField.svelte +108 -0
  76. package/dist/atoms/TimeField.svelte.d.ts +54 -0
  77. package/dist/atoms/Toast.svelte +25 -10
  78. package/dist/atoms/Toast.svelte.d.ts +2 -0
  79. package/dist/atoms/Toggle.svelte +60 -19
  80. package/dist/atoms/Toggle.svelte.d.ts +18 -2
  81. package/dist/atoms/Tooltip.svelte +583 -40
  82. package/dist/atoms/Tooltip.svelte.d.ts +26 -0
  83. package/dist/atoms/ZabiStringsProvider.svelte +45 -0
  84. package/dist/atoms/ZabiStringsProvider.svelte.d.ts +27 -0
  85. package/dist/atoms/index.d.ts +17 -0
  86. package/dist/atoms/index.js +12 -0
  87. package/dist/atoms/selection-control.styles.d.ts +36 -5
  88. package/dist/atoms/selection-control.styles.js +40 -9
  89. package/dist/components/atoms/index.d.ts +17 -0
  90. package/dist/components/atoms/index.d.ts.map +1 -1
  91. package/dist/components/atoms/selection-control.styles.d.ts +36 -5
  92. package/dist/components/atoms/selection-control.styles.d.ts.map +1 -1
  93. package/dist/components/index.d.ts +83 -3
  94. package/dist/components/index.d.ts.map +1 -1
  95. package/dist/components/molecules/index.d.ts +46 -0
  96. package/dist/components/molecules/index.d.ts.map +1 -1
  97. package/dist/components/molecules/toast-store.d.ts +53 -7
  98. package/dist/components/molecules/toast-store.d.ts.map +1 -1
  99. package/dist/components/organisms/index.d.ts +6 -0
  100. package/dist/components/organisms/index.d.ts.map +1 -1
  101. package/dist/components/types/variants.d.ts +15 -1
  102. package/dist/components/types/variants.d.ts.map +1 -1
  103. package/dist/components/util/app-shell.d.ts +28 -0
  104. package/dist/components/util/app-shell.d.ts.map +1 -0
  105. package/dist/components/util/avatar.d.ts +36 -0
  106. package/dist/components/util/avatar.d.ts.map +1 -0
  107. package/dist/components/util/bottom-sheet.d.ts +30 -0
  108. package/dist/components/util/bottom-sheet.d.ts.map +1 -0
  109. package/dist/components/util/bottom-tab-bar.d.ts +35 -0
  110. package/dist/components/util/bottom-tab-bar.d.ts.map +1 -0
  111. package/dist/components/util/calendar.d.ts +56 -0
  112. package/dist/components/util/calendar.d.ts.map +1 -0
  113. package/dist/components/util/cn.d.ts +8 -0
  114. package/dist/components/util/cn.d.ts.map +1 -0
  115. package/dist/components/util/collapsible.d.ts +58 -0
  116. package/dist/components/util/collapsible.d.ts.map +1 -0
  117. package/dist/components/util/confirm-dialog.d.ts +12 -0
  118. package/dist/components/util/confirm-dialog.d.ts.map +1 -0
  119. package/dist/components/util/date.d.ts +96 -0
  120. package/dist/components/util/date.d.ts.map +1 -0
  121. package/dist/components/util/drawer.d.ts +13 -0
  122. package/dist/components/util/drawer.d.ts.map +1 -0
  123. package/dist/components/util/dropdown.d.ts +47 -0
  124. package/dist/components/util/dropdown.d.ts.map +1 -0
  125. package/dist/components/util/field.d.ts +39 -0
  126. package/dist/components/util/field.d.ts.map +1 -0
  127. package/dist/components/util/fit-in-viewport.d.ts +201 -0
  128. package/dist/components/util/fit-in-viewport.d.ts.map +1 -0
  129. package/dist/components/util/focus-utils.d.ts +75 -2
  130. package/dist/components/util/focus-utils.d.ts.map +1 -1
  131. package/dist/components/util/hydration.d.ts +45 -0
  132. package/dist/components/util/hydration.d.ts.map +1 -0
  133. package/dist/components/util/keyboard-inset.d.ts +18 -0
  134. package/dist/components/util/keyboard-inset.d.ts.map +1 -0
  135. package/dist/components/util/media-grid.d.ts +51 -0
  136. package/dist/components/util/media-grid.d.ts.map +1 -0
  137. package/dist/components/util/media.d.ts +6 -0
  138. package/dist/components/util/media.d.ts.map +1 -0
  139. package/dist/components/util/overlay-chrome.d.ts +53 -0
  140. package/dist/components/util/overlay-chrome.d.ts.map +1 -0
  141. package/dist/components/util/overlay.d.ts +72 -0
  142. package/dist/components/util/overlay.d.ts.map +1 -0
  143. package/dist/components/util/photo.d.ts +215 -0
  144. package/dist/components/util/photo.d.ts.map +1 -0
  145. package/dist/components/util/portal.d.ts +23 -0
  146. package/dist/components/util/portal.d.ts.map +1 -0
  147. package/dist/components/util/pull-to-refresh.d.ts +27 -0
  148. package/dist/components/util/pull-to-refresh.d.ts.map +1 -0
  149. package/dist/components/util/radio-keys.d.ts +25 -0
  150. package/dist/components/util/radio-keys.d.ts.map +1 -0
  151. package/dist/components/util/rating.d.ts +23 -0
  152. package/dist/components/util/rating.d.ts.map +1 -0
  153. package/dist/components/util/ready-made-strings.d.ts +77 -0
  154. package/dist/components/util/ready-made-strings.d.ts.map +1 -0
  155. package/dist/components/util/scroll-padding.d.ts +20 -0
  156. package/dist/components/util/scroll-padding.d.ts.map +1 -0
  157. package/dist/components/util/segmented-control.d.ts +16 -0
  158. package/dist/components/util/segmented-control.d.ts.map +1 -0
  159. package/dist/components/util/select.d.ts +41 -0
  160. package/dist/components/util/select.d.ts.map +1 -0
  161. package/dist/components/util/sheet-drag.d.ts +60 -0
  162. package/dist/components/util/sheet-drag.d.ts.map +1 -0
  163. package/dist/components/util/sidebar.d.ts +63 -0
  164. package/dist/components/util/sidebar.d.ts.map +1 -0
  165. package/dist/components/util/sortable-list.d.ts +65 -0
  166. package/dist/components/util/sortable-list.d.ts.map +1 -0
  167. package/dist/components/util/ssr-safe.d.ts +4 -4
  168. package/dist/components/util/ssr-safe.d.ts.map +1 -1
  169. package/dist/components/util/stepper.d.ts +40 -0
  170. package/dist/components/util/stepper.d.ts.map +1 -0
  171. package/dist/components/util/swipeable-list-item.d.ts +36 -0
  172. package/dist/components/util/swipeable-list-item.d.ts.map +1 -0
  173. package/dist/components/util/theme-mode.d.ts +80 -0
  174. package/dist/components/util/theme-mode.d.ts.map +1 -0
  175. package/dist/components/util/toaster.d.ts +93 -0
  176. package/dist/components/util/toaster.d.ts.map +1 -0
  177. package/dist/components/util/tooltip.d.ts +10 -0
  178. package/dist/components/util/tooltip.d.ts.map +1 -0
  179. package/dist/components/util/top-navbar.d.ts +11 -0
  180. package/dist/components/util/top-navbar.d.ts.map +1 -0
  181. package/dist/components/util/touch-target.d.ts +31 -0
  182. package/dist/components/util/touch-target.d.ts.map +1 -0
  183. package/dist/components/util/zabi-strings.d.ts +133 -0
  184. package/dist/components/util/zabi-strings.d.ts.map +1 -0
  185. package/dist/create-theme/cli.js +169 -0
  186. package/dist/create-theme/index.d.ts +176 -0
  187. package/dist/create-theme/index.js +817 -0
  188. package/dist/create-theme/lib/ramp-math.js +128 -0
  189. package/dist/create-theme/lib/resolve.js +141 -0
  190. package/dist/create-theme/theme-data.js +1116 -0
  191. package/dist/index.d.ts +83 -3
  192. package/dist/index.js +60 -8
  193. package/dist/molecules/Alert.svelte +73 -66
  194. package/dist/molecules/Alert.svelte.d.ts +9 -1
  195. package/dist/molecules/AppBar.svelte +415 -0
  196. package/dist/molecules/AppBar.svelte.d.ts +69 -0
  197. package/dist/molecules/AvatarGroup.svelte +116 -0
  198. package/dist/molecules/AvatarGroup.svelte.d.ts +40 -0
  199. package/dist/molecules/BottomSheet.svelte +540 -0
  200. package/dist/molecules/BottomSheet.svelte.d.ts +93 -0
  201. package/dist/molecules/BottomTabBar.svelte +297 -0
  202. package/dist/molecules/BottomTabBar.svelte.d.ts +64 -0
  203. package/dist/molecules/Calendar.svelte +597 -0
  204. package/dist/molecules/Calendar.svelte.d.ts +72 -0
  205. package/dist/molecules/Collapsible.svelte +243 -0
  206. package/dist/molecules/Collapsible.svelte.d.ts +44 -0
  207. package/dist/molecules/CollapsibleGroup.svelte +126 -0
  208. package/dist/molecules/CollapsibleGroup.svelte.d.ts +14 -0
  209. package/dist/molecules/ComponentDemo.svelte +25 -5
  210. package/dist/molecules/ComponentDemo.svelte.d.ts +5 -0
  211. package/dist/molecules/ConfirmDialog.svelte +253 -0
  212. package/dist/molecules/ConfirmDialog.svelte.d.ts +55 -0
  213. package/dist/molecules/ContactForm.svelte +46 -19
  214. package/dist/molecules/ContactForm.svelte.d.ts +10 -0
  215. package/dist/molecules/Drawer.svelte +394 -0
  216. package/dist/molecules/Drawer.svelte.d.ts +55 -0
  217. package/dist/molecules/Dropdown.svelte +540 -50
  218. package/dist/molecules/Dropdown.svelte.d.ts +49 -6
  219. package/dist/molecules/DropdownItem.svelte +122 -0
  220. package/dist/molecules/DropdownItem.svelte.d.ts +28 -0
  221. package/dist/molecules/EmptyState.svelte +56 -10
  222. package/dist/molecules/EmptyState.svelte.d.ts +8 -0
  223. package/dist/molecules/Form.svelte +25 -14
  224. package/dist/molecules/Form.svelte.d.ts +13 -5
  225. package/dist/molecules/FormField.svelte +11 -2
  226. package/dist/molecules/FormField.svelte.d.ts +2 -0
  227. package/dist/molecules/Header.svelte +13 -3
  228. package/dist/molecules/Header.svelte.d.ts +2 -0
  229. package/dist/molecules/ImageUpload.svelte +422 -70
  230. package/dist/molecules/ImageUpload.svelte.d.ts +61 -5
  231. package/dist/molecules/MediaGrid.svelte +527 -0
  232. package/dist/molecules/MediaGrid.svelte.d.ts +77 -0
  233. package/dist/molecules/Modal.svelte +340 -45
  234. package/dist/molecules/Modal.svelte.d.ts +59 -7
  235. package/dist/molecules/NavigationMenu.svelte +15 -3
  236. package/dist/molecules/NavigationMenu.svelte.d.ts +4 -0
  237. package/dist/molecules/NavigationMenuContent.svelte +91 -36
  238. package/dist/molecules/NavigationMenuContent.svelte.d.ts +2 -0
  239. package/dist/molecules/NavigationMenuItem.svelte +10 -3
  240. package/dist/molecules/NavigationMenuItem.svelte.d.ts +2 -0
  241. package/dist/molecules/NavigationMenuLink.svelte +10 -2
  242. package/dist/molecules/NavigationMenuLink.svelte.d.ts +2 -0
  243. package/dist/molecules/NavigationMenuList.svelte +19 -4
  244. package/dist/molecules/NavigationMenuList.svelte.d.ts +2 -0
  245. package/dist/molecules/NavigationMenuTrigger.svelte +16 -3
  246. package/dist/molecules/NavigationMenuTrigger.svelte.d.ts +2 -0
  247. package/dist/molecules/Page.svelte +38 -2
  248. package/dist/molecules/Page.svelte.d.ts +13 -0
  249. package/dist/molecules/PhotoGrid.svelte +433 -0
  250. package/dist/molecules/PhotoGrid.svelte.d.ts +62 -0
  251. package/dist/molecules/PhotoViewer.svelte +1116 -0
  252. package/dist/molecules/PhotoViewer.svelte.d.ts +56 -0
  253. package/dist/molecules/PropsTable.svelte +26 -11
  254. package/dist/molecules/PropsTable.svelte.d.ts +5 -0
  255. package/dist/molecules/PullToRefresh.svelte +263 -0
  256. package/dist/molecules/PullToRefresh.svelte.d.ts +52 -0
  257. package/dist/molecules/RadioGroup.svelte +57 -15
  258. package/dist/molecules/RadioGroup.svelte.d.ts +16 -3
  259. package/dist/molecules/Section.svelte +13 -5
  260. package/dist/molecules/Section.svelte.d.ts +3 -1
  261. package/dist/molecules/SegmentedControl.svelte +323 -0
  262. package/dist/molecules/SegmentedControl.svelte.d.ts +34 -0
  263. package/dist/molecules/SidebarBrandHeader.svelte +24 -5
  264. package/dist/molecules/SidebarBrandHeader.svelte.d.ts +5 -0
  265. package/dist/molecules/SidebarFooter.svelte +39 -8
  266. package/dist/molecules/SidebarFooter.svelte.d.ts +5 -0
  267. package/dist/molecules/SidebarNavSection.svelte +12 -4
  268. package/dist/molecules/SidebarNavSection.svelte.d.ts +2 -0
  269. package/dist/molecules/SlideUp.svelte +253 -30
  270. package/dist/molecules/SlideUp.svelte.d.ts +31 -4
  271. package/dist/molecules/SortableList.svelte +632 -0
  272. package/dist/molecules/SortableList.svelte.d.ts +69 -0
  273. package/dist/molecules/Stepper.svelte +548 -0
  274. package/dist/molecules/Stepper.svelte.d.ts +39 -0
  275. package/dist/molecules/StickyActionBar.svelte +191 -0
  276. package/dist/molecules/StickyActionBar.svelte.d.ts +65 -0
  277. package/dist/molecules/SwipeableListItem.svelte +334 -0
  278. package/dist/molecules/SwipeableListItem.svelte.d.ts +54 -0
  279. package/dist/molecules/Tabs.svelte +254 -24
  280. package/dist/molecules/Tabs.svelte.d.ts +15 -4
  281. package/dist/molecules/Toaster.svelte +352 -6
  282. package/dist/molecules/Toaster.svelte.d.ts +95 -2
  283. package/dist/molecules/ToasterToast.svelte +279 -62
  284. package/dist/molecules/ToasterToast.svelte.d.ts +11 -0
  285. package/dist/molecules/UnsavedChangesBar.svelte +212 -0
  286. package/dist/molecules/UnsavedChangesBar.svelte.d.ts +43 -0
  287. package/dist/molecules/index.d.ts +46 -0
  288. package/dist/molecules/index.js +27 -0
  289. package/dist/molecules/toast-store.d.ts +53 -7
  290. package/dist/molecules/toast-store.js +21 -0
  291. package/dist/organisms/AppShell.svelte +196 -0
  292. package/dist/organisms/AppShell.svelte.d.ts +61 -0
  293. package/dist/organisms/SidebarAccountPanel.svelte +111 -12
  294. package/dist/organisms/SidebarAccountPanel.svelte.d.ts +21 -0
  295. package/dist/organisms/SidebarNavigation.svelte +193 -69
  296. package/dist/organisms/SidebarNavigation.svelte.d.ts +31 -1
  297. package/dist/organisms/SidebarPanel.svelte +45 -16
  298. package/dist/organisms/SidebarPanel.svelte.d.ts +2 -0
  299. package/dist/organisms/SidebarShell.svelte +263 -0
  300. package/dist/organisms/SidebarShell.svelte.d.ts +106 -0
  301. package/dist/organisms/TopNavbar.svelte +329 -33
  302. package/dist/organisms/TopNavbar.svelte.d.ts +28 -0
  303. package/dist/organisms/index.d.ts +6 -0
  304. package/dist/organisms/index.js +4 -0
  305. package/dist/routes/lib/variant-utils.d.ts +26 -0
  306. package/dist/routes/lib/{variant-utils.ts → variant-utils.js} +15 -46
  307. package/dist/types/components.d.ts +4 -0
  308. package/dist/types/components.d.ts.map +1 -1
  309. package/dist/types/events.js +1 -0
  310. package/dist/types/index.d.ts +605 -25
  311. package/dist/types/index.d.ts.map +1 -1
  312. package/dist/types/index.js +3 -0
  313. package/dist/types/variants.ts +17 -1
  314. package/dist/util/app-shell.d.ts +27 -0
  315. package/dist/util/app-shell.js +72 -0
  316. package/dist/util/avatar.d.ts +35 -0
  317. package/dist/util/avatar.js +52 -0
  318. package/dist/util/bottom-sheet.d.ts +29 -0
  319. package/dist/util/bottom-sheet.js +43 -0
  320. package/dist/util/bottom-tab-bar.d.ts +34 -0
  321. package/dist/util/bottom-tab-bar.js +54 -0
  322. package/dist/util/calendar.d.ts +55 -0
  323. package/dist/util/calendar.js +74 -0
  324. package/dist/util/cn.d.ts +7 -0
  325. package/dist/util/cn.js +48 -0
  326. package/dist/util/collapsible.d.ts +57 -0
  327. package/dist/util/collapsible.js +23 -0
  328. package/dist/util/confirm-dialog.d.ts +11 -0
  329. package/dist/util/confirm-dialog.js +2 -0
  330. package/dist/util/date.d.ts +95 -0
  331. package/dist/util/date.js +237 -0
  332. package/dist/util/drawer.d.ts +12 -0
  333. package/dist/util/drawer.js +7 -0
  334. package/dist/util/dropdown.d.ts +46 -0
  335. package/dist/util/dropdown.js +21 -0
  336. package/dist/util/field.d.ts +38 -0
  337. package/dist/util/field.js +38 -0
  338. package/dist/util/fit-in-viewport.d.ts +200 -0
  339. package/dist/util/fit-in-viewport.js +399 -0
  340. package/dist/util/focus-utils.d.ts +75 -2
  341. package/dist/util/focus-utils.js +182 -9
  342. package/dist/util/hydration.d.ts +44 -0
  343. package/dist/util/hydration.js +58 -0
  344. package/dist/util/keyboard-inset.d.ts +17 -0
  345. package/dist/util/keyboard-inset.js +53 -0
  346. package/dist/util/media-grid.d.ts +50 -0
  347. package/dist/util/media-grid.js +81 -0
  348. package/dist/util/media.d.ts +5 -0
  349. package/dist/util/media.js +10 -0
  350. package/dist/util/overlay-chrome.d.ts +52 -0
  351. package/dist/util/overlay-chrome.js +56 -0
  352. package/dist/util/overlay.d.ts +71 -0
  353. package/dist/util/overlay.js +240 -0
  354. package/dist/util/photo.d.ts +214 -0
  355. package/dist/util/photo.js +206 -0
  356. package/dist/util/portal.d.ts +22 -0
  357. package/dist/util/portal.js +50 -0
  358. package/dist/util/pull-to-refresh.d.ts +26 -0
  359. package/dist/util/pull-to-refresh.js +30 -0
  360. package/dist/util/radio-keys.d.ts +24 -0
  361. package/dist/util/radio-keys.js +49 -0
  362. package/dist/util/rating.d.ts +22 -0
  363. package/dist/util/rating.js +26 -0
  364. package/dist/util/ready-made-strings.d.ts +76 -0
  365. package/dist/util/ready-made-strings.js +67 -0
  366. package/dist/util/scroll-padding.d.ts +19 -0
  367. package/dist/util/scroll-padding.js +44 -0
  368. package/dist/util/segmented-control.d.ts +15 -0
  369. package/dist/util/segmented-control.js +1 -0
  370. package/dist/util/select.d.ts +40 -0
  371. package/dist/util/select.js +63 -0
  372. package/dist/util/sheet-drag.d.ts +59 -0
  373. package/dist/util/sheet-drag.js +241 -0
  374. package/dist/util/sidebar.d.ts +62 -0
  375. package/dist/util/sidebar.js +38 -0
  376. package/dist/util/sortable-list.d.ts +64 -0
  377. package/dist/util/sortable-list.js +53 -0
  378. package/dist/util/ssr-safe.d.ts +4 -4
  379. package/dist/util/stepper.d.ts +39 -0
  380. package/dist/util/stepper.js +38 -0
  381. package/dist/util/swipeable-list-item.d.ts +35 -0
  382. package/dist/util/swipeable-list-item.js +32 -0
  383. package/dist/util/theme-mode.d.ts +79 -0
  384. package/dist/util/theme-mode.js +121 -0
  385. package/dist/util/toaster.d.ts +92 -0
  386. package/dist/util/toaster.js +75 -0
  387. package/dist/util/tooltip.d.ts +9 -0
  388. package/dist/util/tooltip.js +18 -0
  389. package/dist/util/top-navbar.d.ts +10 -0
  390. package/dist/util/top-navbar.js +5 -0
  391. package/dist/util/touch-target.d.ts +30 -0
  392. package/dist/util/touch-target.js +30 -0
  393. package/dist/util/zabi-strings.d.ts +132 -0
  394. package/dist/util/zabi-strings.js +105 -0
  395. package/dist/zabi-components-colors.css +5 -2
  396. package/dist/zabi-components-theme-dark-only.css +574 -225
  397. package/dist/zabi-components-theme-dark.css +574 -225
  398. package/dist/zabi-components-theme-only.css +1680 -317
  399. package/dist/zabi-components-theme.css +1680 -317
  400. package/dist/zabi-components.css +4473 -1158
  401. package/docs/lucide-icons.md +41 -16
  402. package/docs/theme-imports.md +81 -11
  403. package/package.json +51 -29
  404. package/dist/lib/layout-width-tokens.d.ts +0 -17
  405. package/dist/lib/layout-width-tokens.d.ts.map +0 -1
  406. package/dist/lib/showcase/component-docs/Button.d.ts +0 -3
  407. package/dist/lib/showcase/component-docs/Button.d.ts.map +0 -1
  408. package/dist/lib/showcase/component-docs/Input.d.ts +0 -3
  409. package/dist/lib/showcase/component-docs/Input.d.ts.map +0 -1
  410. package/dist/lib/showcase/component-docs/List.d.ts +0 -3
  411. package/dist/lib/showcase/component-docs/List.d.ts.map +0 -1
  412. package/dist/lib/showcase/component-docs/Modal.d.ts +0 -3
  413. package/dist/lib/showcase/component-docs/Modal.d.ts.map +0 -1
  414. package/dist/lib/showcase/component-docs/Radio.d.ts +0 -3
  415. package/dist/lib/showcase/component-docs/Radio.d.ts.map +0 -1
  416. package/dist/lib/showcase/component-docs/SidebarNavigation.d.ts +0 -3
  417. package/dist/lib/showcase/component-docs/SidebarNavigation.d.ts.map +0 -1
  418. package/dist/lib/showcase/component-docs/Skeleton.d.ts +0 -3
  419. package/dist/lib/showcase/component-docs/Skeleton.d.ts.map +0 -1
  420. package/dist/lib/showcase/component-docs/_shared.d.ts +0 -12
  421. package/dist/lib/showcase/component-docs/_shared.d.ts.map +0 -1
  422. package/dist/lib/showcase/component-docs/index.d.ts +0 -4
  423. package/dist/lib/showcase/component-docs/index.d.ts.map +0 -1
  424. package/dist/lib/showcase/components-catalog.d.ts +0 -3
  425. package/dist/lib/showcase/components-catalog.d.ts.map +0 -1
  426. package/dist/lib/showcase/components-showcase-constants.d.ts +0 -89
  427. package/dist/lib/showcase/components-showcase-constants.d.ts.map +0 -1
  428. package/dist/lib/showcase/docs-sidebar-helpers.d.ts +0 -15
  429. package/dist/lib/showcase/docs-sidebar-helpers.d.ts.map +0 -1
  430. package/dist/routes/lib/focus-utils.d.ts +0 -12
  431. package/dist/routes/lib/focus-utils.ts +0 -110
  432. package/dist/routes/lib/ssr-safe.ts +0 -58
  433. package/scripts/fix-lucide-svelte-icon-dts.js +0 -35
@@ -1,7 +1,9 @@
1
1
  <script lang="ts">
2
2
  import type { Snippet } from "svelte";
3
3
  import { getContext } from "svelte";
4
- import { onMount } from "svelte";
4
+ import { cn } from "../util/cn.js";
5
+ import { isInsideToastRegion } from "../util/focus-utils.js";
6
+ import { measurePlacement, watchViewport } from "../util/fit-in-viewport.js";
5
7
  import {
6
8
  NAVIGATION_MENU_CONTEXT_KEY,
7
9
  navigationMenuPanelId,
@@ -10,19 +12,25 @@
10
12
 
11
13
  interface Props {
12
14
  value?: string;
15
+ class?: string;
16
+ /** @deprecated use `class`. */
13
17
  className?: string;
14
18
  children?: Snippet;
15
19
  }
16
20
 
17
21
  let {
18
22
  value = "",
19
- className = "",
23
+ class: classAttr = "",
24
+ className: legacyClass = "",
20
25
  children,
21
26
  ...restProps
22
27
  }: Props = $props();
23
28
 
29
+ /** `class` is the public prop; `className` is a deprecated alias.
30
+ * Both are merged here so existing call sites keep working. */
31
+ const className = $derived(cn(`${classAttr} ${legacyClass}`));
32
+
24
33
  let contentElement = $state<HTMLElement | null>(null);
25
- let parentItem = $state<HTMLElement | null>(null);
26
34
 
27
35
  const context = getContext<NavigationMenuContextValue>(
28
36
  NAVIGATION_MENU_CONTEXT_KEY,
@@ -36,42 +44,85 @@
36
44
  : "",
37
45
  );
38
46
 
39
- function handleKeydown(event: KeyboardEvent) {
40
- if (event.key === "Escape") {
41
- event.preventDefault();
42
- context?.setActiveItem(null);
43
- const trigger = parentItem?.querySelector('[data-navigation-menu-trigger]') as HTMLElement;
44
- trigger?.focus();
45
- }
46
- }
47
+ /** Room kept between the panel and each side of the screen: its width is the viewport less 16px at most. */
48
+ const VIEWPORT_MARGIN = 8;
47
49
 
48
- function handleClickOutside(event: MouseEvent) {
49
- if (
50
- contentElement &&
51
- !contentElement.contains(event.target as Node) &&
52
- parentItem &&
53
- !parentItem.contains(event.target as Node)
54
- ) {
55
- context?.setActiveItem(null);
56
- }
57
- }
50
+ /**
51
+ * How far the panel is moved from under the left edge of its item to stay on
52
+ * screen, and its width limit when it is wider than the screen. The panel
53
+ * of the second trigger used to span x 182 to 382 in a 375px viewport.
54
+ */
55
+ let leftOffset = $state(0);
56
+ let maxWidth = $state<number | null>(null);
57
+ /**
58
+ * Set when a box that scrolls around the menu would cut the panel off: it
59
+ * is then placed against the viewport with `position: fixed`, which such
60
+ * a box does not clip, at these coordinates. It stays where it is in the
61
+ * DOM, so Escape, the outside press and focus work as before.
62
+ */
63
+ let fixedAt = $state<{ left: number; top: number; width: number } | null>(null);
58
64
 
59
- onMount(() => {
60
- if (contentElement) {
61
- parentItem = contentElement.closest('[data-navigation-menu-item]') as HTMLElement;
62
- }
63
- if (isActive) {
64
- document.addEventListener("mousedown", handleClickOutside);
65
+ // After the panel is in the DOM and before it is painted, then whenever the screen changes.
66
+ $effect(() => {
67
+ if (!isActive || !contentElement) {
68
+ leftOffset = 0;
69
+ maxWidth = null;
70
+ fixedAt = null;
71
+ return;
65
72
  }
73
+ const panel: HTMLElement = contentElement;
74
+ const anchor = panel.closest<HTMLElement>("[data-navigation-menu-item]") ?? panel;
75
+ const update = () => {
76
+ // The panel always opens below, from the left edge of its item
77
+ // (`left-0`, in either writing direction, as it always has), and
78
+ // is slid along that edge only as far as it takes to fit.
79
+ const fit = measurePlacement(
80
+ anchor,
81
+ panel,
82
+ { block: "bottom", inline: "start" },
83
+ { margin: VIEWPORT_MARGIN, flipBlock: false, flipInline: false, rtl: false },
84
+ );
85
+ leftOffset = fit.inlineOffset;
86
+ maxWidth = fit.maxWidth;
87
+ fixedAt = fit.fixed;
88
+ };
89
+ update();
90
+ return watchViewport(update, panel);
66
91
  });
67
92
 
93
+ /** Disclosure panel: one document listener while open, removed on close/unmount. */
68
94
  $effect(() => {
69
- if (isActive) {
70
- document.addEventListener("mousedown", handleClickOutside);
71
- return () => {
72
- document.removeEventListener("mousedown", handleClickOutside);
73
- };
95
+ if (!isActive || !contentElement) return;
96
+ const panel: HTMLElement = contentElement;
97
+
98
+ const parentItem = panel.closest<HTMLElement>(
99
+ "[data-navigation-menu-item]",
100
+ );
101
+
102
+ function handleClickOutside(event: MouseEvent) {
103
+ const target = event.target as Node;
104
+ // A toast lies over the panel; a press on it is for the toast.
105
+ if (isInsideToastRegion(target)) return;
106
+ if (!panel.contains(target) && !parentItem?.contains(target)) {
107
+ context?.setActiveItem(null);
108
+ }
109
+ }
110
+
111
+ function handleKeydown(event: KeyboardEvent) {
112
+ if (event.key !== "Escape") return;
113
+ event.preventDefault();
114
+ context?.setActiveItem(null);
115
+ parentItem
116
+ ?.querySelector<HTMLElement>("[data-navigation-menu-trigger]")
117
+ ?.focus();
74
118
  }
119
+
120
+ document.addEventListener("mousedown", handleClickOutside);
121
+ panel.addEventListener("keydown", handleKeydown);
122
+ return () => {
123
+ document.removeEventListener("mousedown", handleClickOutside);
124
+ panel.removeEventListener("keydown", handleKeydown);
125
+ };
75
126
  });
76
127
  </script>
77
128
 
@@ -79,11 +130,15 @@
79
130
  <div
80
131
  bind:this={contentElement}
81
132
  id={panelId || undefined}
82
- class="absolute left-0 top-full mt-2 bg-card rounded-lg shadow-lg border border-border p-4 z-dropdown min-w-[200px] transition-all duration-200 ease-in-out {className}"
83
- role="menu"
84
- onkeydown={handleKeydown}
133
+ class={cn("absolute left-0 top-full mt-2 bg-surface-overlay rounded-overlay shadow-lg border border-border-overlay p-4 z-dropdown min-w-[200px] transition-[opacity,translate] duration-200 ease-in-out", className)}
134
+ style:position={fixedAt ? "fixed" : undefined}
135
+ style:top={fixedAt ? `${fixedAt.top}px` : undefined}
136
+ style:left={fixedAt ? `${fixedAt.left}px` : leftOffset !== 0 ? `${leftOffset}px` : undefined}
137
+ style:margin={fixedAt ? "0" : undefined}
138
+ style:width={fixedAt ? `${fixedAt.width}px` : undefined}
139
+ style:max-width={maxWidth !== null ? `${maxWidth}px` : undefined}
140
+ style:min-width={maxWidth !== null ? "0" : undefined}
85
141
  data-navigation-menu-content
86
- tabindex="-1"
87
142
  {...restProps}
88
143
  >
89
144
  {@render children?.()}
@@ -1,6 +1,8 @@
1
1
  import type { Snippet } from "svelte";
2
2
  interface Props {
3
3
  value?: string;
4
+ class?: string;
5
+ /** @deprecated use `class`. */
4
6
  className?: string;
5
7
  children?: Snippet;
6
8
  }
@@ -1,6 +1,7 @@
1
1
  <script lang="ts">
2
2
  import type { Snippet } from "svelte";
3
3
  import { getContext } from "svelte";
4
+ import { cn } from "../util/cn.js";
4
5
  import {
5
6
  NAVIGATION_MENU_CONTEXT_KEY,
6
7
  type NavigationMenuContextValue,
@@ -8,17 +9,24 @@
8
9
 
9
10
  interface Props {
10
11
  value?: string;
12
+ class?: string;
13
+ /** @deprecated use `class`. */
11
14
  className?: string;
12
15
  children?: Snippet;
13
16
  }
14
17
 
15
18
  let {
16
19
  value = "",
17
- className = "",
20
+ class: classAttr = "",
21
+ className: legacyClass = "",
18
22
  children,
19
23
  ...restProps
20
24
  }: Props = $props();
21
25
 
26
+ /** `class` is the public prop; `className` is a deprecated alias.
27
+ * Both are merged here so existing call sites keep working. */
28
+ const className = $derived(cn(`${classAttr} ${legacyClass}`));
29
+
22
30
  const context = getContext<NavigationMenuContextValue>(
23
31
  NAVIGATION_MENU_CONTEXT_KEY,
24
32
  );
@@ -27,8 +35,7 @@
27
35
  </script>
28
36
 
29
37
  <li
30
- class="relative {className}"
31
- role="none"
38
+ class={cn("relative", className)}
32
39
  data-navigation-menu-item
33
40
  data-active={isActive}
34
41
  {...restProps}
@@ -1,6 +1,8 @@
1
1
  import type { Snippet } from "svelte";
2
2
  interface Props {
3
3
  value?: string;
4
+ class?: string;
5
+ /** @deprecated use `class`. */
4
6
  className?: string;
5
7
  children?: Snippet;
6
8
  }
@@ -1,6 +1,7 @@
1
1
  <script lang="ts">
2
2
  import type { Snippet } from "svelte";
3
3
  import { getContext } from "svelte";
4
+ import { cn } from "../util/cn.js";
4
5
  import {
5
6
  NAVIGATION_MENU_CONTEXT_KEY,
6
7
  type NavigationMenuContextValue,
@@ -9,6 +10,8 @@
9
10
  interface Props {
10
11
  href?: string;
11
12
  asChild?: boolean;
13
+ class?: string;
14
+ /** @deprecated use `class`. */
12
15
  className?: string;
13
16
  children?: Snippet;
14
17
  }
@@ -16,11 +19,16 @@
16
19
  let {
17
20
  href = "#",
18
21
  asChild = false,
19
- className = "",
22
+ class: classAttr = "",
23
+ className: legacyClass = "",
20
24
  children,
21
25
  ...restProps
22
26
  }: Props = $props();
23
27
 
28
+ /** `class` is the public prop; `className` is a deprecated alias.
29
+ * Both are merged here so existing call sites keep working. */
30
+ const className = $derived(cn(`${classAttr} ${legacyClass}`));
31
+
24
32
  const context = getContext<NavigationMenuContextValue>(
25
33
  NAVIGATION_MENU_CONTEXT_KEY,
26
34
  );
@@ -30,7 +38,7 @@
30
38
  }
31
39
 
32
40
  const linkClasses =
33
- "focus-ring focus-ring--nav block cursor-pointer rounded-md px-4 py-2 text-sm text-nav-menu-item no-underline transition-colors duration-150 outline-none hover:bg-nav-menu-hover hover:text-nav-menu-item-hover {className}";
41
+ "focus-ring focus-ring--nav block cursor-pointer rounded-control px-4 py-2 pointer-coarse:py-3 text-sm text-nav-menu-item no-underline transition-colors duration-150 outline-none hover:bg-nav-menu-hover hover:text-nav-menu-item-hover active:bg-nav-menu-active {className}";
34
42
  </script>
35
43
 
36
44
  {#if asChild}
@@ -2,6 +2,8 @@ import type { Snippet } from "svelte";
2
2
  interface Props {
3
3
  href?: string;
4
4
  asChild?: boolean;
5
+ class?: string;
6
+ /** @deprecated use `class`. */
5
7
  className?: string;
6
8
  children?: Snippet;
7
9
  }
@@ -1,22 +1,37 @@
1
1
  <script lang="ts">
2
2
  import type { Snippet } from "svelte";
3
+ import { cn } from "../util/cn.js";
3
4
 
4
5
  interface Props {
6
+ class?: string;
7
+ /** @deprecated use `class`. */
5
8
  className?: string;
6
9
  children?: Snippet;
7
10
  }
8
11
 
9
12
  let {
10
- className = "",
13
+ class: classAttr = "",
14
+ className: legacyClass = "",
11
15
  children,
12
16
  ...restProps
13
17
  }: Props = $props();
18
+
19
+ /** `class` is the public prop; `className` is a deprecated alias.
20
+ * Both are merged here so existing call sites keep working. */
21
+ const className = $derived(cn(`${classAttr} ${legacyClass}`));
14
22
  </script>
15
23
 
24
+ <!-- A list of links and disclosure buttons inside the `<nav>`, which is what
25
+ the WAI-ARIA practices recommend for site navigation. It was `role="menubar"`,
26
+ which promises arrow keys between the items and `menuitem` children; it had
27
+ neither, so a screen reader announced a menu bar that did not behave like one.
28
+ `role="list"` restates what `list-none` makes Safari forget.
29
+
30
+ `flex-wrap`: a list that does not fit goes onto a further row. It used
31
+ to run out of its container (310px of items in a 215px box at 375px). -->
16
32
  <ul
17
- class="flex flex-row items-center gap-1 list-none m-0 p-0 {className}"
18
- role="menubar"
19
- aria-orientation="horizontal"
33
+ class={cn("flex flex-row flex-wrap items-center gap-1 list-none m-0 p-0", className)}
34
+ role="list"
20
35
  data-navigation-menu-list
21
36
  {...restProps}
22
37
  >
@@ -1,5 +1,7 @@
1
1
  import type { Snippet } from "svelte";
2
2
  interface Props {
3
+ class?: string;
4
+ /** @deprecated use `class`. */
3
5
  className?: string;
4
6
  children?: Snippet;
5
7
  }
@@ -1,6 +1,7 @@
1
1
  <script lang="ts">
2
2
  import type { Snippet } from "svelte";
3
3
  import { getContext } from "svelte";
4
+ import { cn } from "../util/cn.js";
4
5
  import {
5
6
  NAVIGATION_MENU_CONTEXT_KEY,
6
7
  navigationMenuPanelId,
@@ -9,17 +10,24 @@
9
10
 
10
11
  interface Props {
11
12
  value?: string;
13
+ class?: string;
14
+ /** @deprecated use `class`. */
12
15
  className?: string;
13
16
  children?: Snippet;
14
17
  }
15
18
 
16
19
  let {
17
20
  value = "",
18
- className = "",
21
+ class: classAttr = "",
22
+ className: legacyClass = "",
19
23
  children,
20
24
  ...restProps
21
25
  }: Props = $props();
22
26
 
27
+ /** `class` is the public prop; `className` is a deprecated alias.
28
+ * Both are merged here so existing call sites keep working. */
29
+ const className = $derived(cn(`${classAttr} ${legacyClass}`));
30
+
23
31
  const context = getContext<NavigationMenuContextValue>(
24
32
  NAVIGATION_MENU_CONTEXT_KEY,
25
33
  );
@@ -58,10 +66,15 @@
58
66
 
59
67
  <button
60
68
  type="button"
61
- class="focus-ring focus-ring--nav inline-flex cursor-pointer items-center justify-center gap-2 rounded-lg bg-transparent px-4 py-2 text-sm font-medium text-nav-menu-item transition-colors duration-150 outline-none hover:bg-nav-menu-hover hover:text-nav-menu-item-hover data-[active=true]:bg-nav-menu-active data-[active=true]:text-nav-menu-item-active {className}"
69
+ class={cn(
70
+ "focus-ring focus-ring--nav inline-flex cursor-pointer items-center justify-center gap-2 rounded-control bg-transparent px-4 py-2 pointer-coarse:py-3 text-sm font-medium transition-colors duration-150 outline-none",
71
+ isActive
72
+ ? "bg-nav-menu-active text-nav-menu-item-active"
73
+ : "text-nav-menu-item hover:bg-nav-menu-hover hover:text-nav-menu-item-hover active:bg-nav-menu-active",
74
+ className,
75
+ )}
62
76
  aria-expanded={isActive ? 'true' : 'false'}
63
77
  aria-controls={panelId || undefined}
64
- aria-haspopup="true"
65
78
  onclick={handleClick}
66
79
  onkeydown={handleKeydown}
67
80
  data-navigation-menu-trigger
@@ -1,6 +1,8 @@
1
1
  import type { Snippet } from "svelte";
2
2
  interface Props {
3
3
  value?: string;
4
+ class?: string;
5
+ /** @deprecated use `class`. */
4
6
  className?: string;
5
7
  children?: Snippet;
6
8
  }
@@ -1,15 +1,51 @@
1
1
  <script lang="ts">
2
2
  import type { Snippet } from "svelte";
3
+ import { isInsideAppShell } from "../util/app-shell.js";
4
+ import { cn } from "../util/cn.js";
3
5
 
4
6
  interface Props {
5
7
  children?: Snippet;
8
+ /**
9
+ * Keeps the content out from under a notch at the side (a phone held
10
+ * sideways) and the home indicator at the bottom, by padding the page
11
+ * with the safe-area insets. They are zero on a screen without them,
12
+ * and until the app asks for them with `viewport-fit=cover`.
13
+ *
14
+ * Inside an `AppShell` the page adds nothing, whatever this says: the
15
+ * shell has already kept its content clear. Set it to false when
16
+ * something else of yours has, such as padding on `<body>`.
17
+ */
18
+ safeArea?: boolean;
19
+ class?: string;
20
+ /** @deprecated use `class`. */
6
21
  className?: string;
7
22
  }
8
23
 
9
- let { children, className = "" }: Props = $props();
24
+ let {
25
+ children,
26
+ safeArea = true,
27
+ class: classAttr = "",
28
+ className: legacyClass = "",
29
+ }: Props = $props();
30
+
31
+ const inShell = isInsideAppShell();
32
+
33
+ /** `class` is the public prop; `className` is a deprecated alias. */
34
+ const className = $derived(cn(`${classAttr} ${legacyClass}`));
10
35
  </script>
11
36
 
12
- <div class="mx-auto w-full space-y-10 {className}">
37
+ <div
38
+ class={cn(
39
+ "mx-auto w-full space-y-10",
40
+ // Left and right, not start and end: a notch is on a side of the
41
+ // device, whichever way the text runs.
42
+ safeArea &&
43
+ !inShell &&
44
+ "pb-[env(safe-area-inset-bottom,0px)] pl-[env(safe-area-inset-left,0px)] pr-[env(safe-area-inset-right,0px)]",
45
+ className,
46
+ )}
47
+ data-safe-area={safeArea && !inShell ? "" : undefined}
48
+ >
13
49
  {#if children}
14
50
  {@render children()}
15
51
  {/if}
@@ -1,6 +1,19 @@
1
1
  import type { Snippet } from "svelte";
2
2
  interface Props {
3
3
  children?: Snippet;
4
+ /**
5
+ * Keeps the content out from under a notch at the side (a phone held
6
+ * sideways) and the home indicator at the bottom, by padding the page
7
+ * with the safe-area insets. They are zero on a screen without them,
8
+ * and until the app asks for them with `viewport-fit=cover`.
9
+ *
10
+ * Inside an `AppShell` the page adds nothing, whatever this says: the
11
+ * shell has already kept its content clear. Set it to false when
12
+ * something else of yours has, such as padding on `<body>`.
13
+ */
14
+ safeArea?: boolean;
15
+ class?: string;
16
+ /** @deprecated use `class`. */
4
17
  className?: string;
5
18
  }
6
19
  declare const Page: import("svelte").Component<Props, {}, "">;