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
@@ -0,0 +1,69 @@
1
+ import { type Snippet } from "svelte";
2
+ import type { HTMLAttributes } from "svelte/elements";
3
+ import { type SortableListReorderDetail, type SortableListRow, type SortableListStrings } from "../util/sortable-list.js";
4
+ declare function $$render<T>(): {
5
+ props: Omit<HTMLAttributes<HTMLDivElement>, "class" | "aria-label" | "aria-labelledby"> & {
6
+ /** Extra classes for the host element. */
7
+ class?: string;
8
+ /** Extra classes for the `<ul>`, for example a different gap. */
9
+ listClass?: string;
10
+ /** The items, in order; supports `bind:items`. */
11
+ items: T[];
12
+ /** Stable identity of an item. Rows are keyed by it. */
13
+ getKey: (item: T) => string | number;
14
+ /** Name of an item, used in the button names and the announcements. */
15
+ getLabel: (item: T) => string;
16
+ /** Content of one row. The second argument carries the row state and its controls. */
17
+ item: Snippet<[T, SortableListRow]>;
18
+ /** Called once per move (each arrow-key step is a move), after `items` has the new order. */
19
+ onreorder?: (detail: SortableListReorderDetail<T>) => void;
20
+ /**
21
+ * `auto` lays out handle, content and move buttons in a row. `manual`
22
+ * renders only your snippet, which places `row.handle` (and
23
+ * `row.moveButtons` if wanted) itself, for example in a card header.
24
+ * Put them beside a header toggle, never inside another `<button>`
25
+ * or link: a button inside a button is invalid and unreachable. A
26
+ * click on either does not bubble, so a clickable (non-button) header
27
+ * around them is not toggled by it.
28
+ */
29
+ controls?: "auto" | "manual";
30
+ /**
31
+ * Show the move up / move down buttons when `controls="auto"`. A screen
32
+ * reader in browse mode does not pass arrow keys to the handle, so
33
+ * hiding them removes that way of reordering.
34
+ */
35
+ showMoveButtons?: boolean;
36
+ /** Disables every handle and move button. */
37
+ disabled?: boolean;
38
+ /**
39
+ * Disables one item's own controls. Other items can still move past it,
40
+ * so its index can change; it is not pinned in place.
41
+ */
42
+ isItemDisabled?: (item: T) => boolean;
43
+ /** Overrides for the built-in strings. */
44
+ strings?: Partial<SortableListStrings>;
45
+ "aria-label"?: string;
46
+ "aria-labelledby"?: string;
47
+ };
48
+ exports: {};
49
+ bindings: "items";
50
+ slots: {};
51
+ events: {};
52
+ };
53
+ declare class __sveltets_Render<T> {
54
+ props(): ReturnType<typeof $$render<T>>['props'];
55
+ events(): ReturnType<typeof $$render<T>>['events'];
56
+ slots(): ReturnType<typeof $$render<T>>['slots'];
57
+ bindings(): "items";
58
+ exports(): {};
59
+ }
60
+ interface $$IsomorphicComponent {
61
+ new <T>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
62
+ $$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
63
+ } & ReturnType<__sveltets_Render<T>['exports']>;
64
+ <T>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
65
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
66
+ }
67
+ declare const SortableList: $$IsomorphicComponent;
68
+ type SortableList<T> = InstanceType<typeof SortableList<T>>;
69
+ export default SortableList;
@@ -0,0 +1,548 @@
1
+ <script lang="ts">
2
+ import { mergeStrings } from "../util/ready-made-strings.js";
3
+ import { zabiStringsFor } from "../util/zabi-strings.js";
4
+ import Check from "@lucide/svelte/icons/check";
5
+ import { tick, untrack } from "svelte";
6
+ import type { HTMLAttributes } from "svelte/elements";
7
+ import type { SizeVariant } from "../types/variants.js";
8
+ import { cn } from "../util/cn.js";
9
+ import {
10
+ STEPPER_STRINGS,
11
+ clampStep,
12
+ normalizeSteps,
13
+ stepState,
14
+ type StepperItem,
15
+ type StepperStep,
16
+ type StepperStepState,
17
+ type StepperStrings,
18
+ } from "../util/stepper.js";
19
+
20
+ /** Other attributes (`data-*`, `id`, `aria-labelledby`, ...) land on the host element. */
21
+ type Props = Omit<HTMLAttributes<HTMLElement>, "class"> & {
22
+ /** Extra classes for the host element. */
23
+ class?: string;
24
+ /** The steps, in order: labels, or objects with a label and a description. */
25
+ steps: StepperItem[];
26
+ /**
27
+ * Index of the current step, counted from 0; supports `bind:current`.
28
+ * A value outside the steps is shown as the nearest step (below the
29
+ * first: the first; past the last: the last) and the bound value is
30
+ * left as it was given.
31
+ */
32
+ current?: number;
33
+ /** Size of the markers and the text. */
34
+ size?: SizeVariant;
35
+ /**
36
+ * `full` draws every step with its marker and label; `compact` draws
37
+ * one line of text under a segmented bar. `auto` is compact while the
38
+ * Stepper itself is narrower than 30rem, and full from there.
39
+ */
40
+ layout?: "auto" | "full" | "compact";
41
+ /**
42
+ * Makes the completed steps buttons that go back to that step. The
43
+ * current step and the ones after it are never buttons.
44
+ */
45
+ interactive?: boolean;
46
+ /** Accessible name of the navigation landmark. */
47
+ label?: string;
48
+ /** Overrides for the built-in strings. */
49
+ strings?: Partial<StepperStrings>;
50
+ /** Called with the index of the step a press went back to. Only with `interactive`. */
51
+ onstepchange?: (index: number) => void;
52
+ };
53
+
54
+ let {
55
+ class: className = "",
56
+ steps,
57
+ current = $bindable<Exclude<Props["current"], undefined>>(),
58
+ size = "md",
59
+ layout = "auto",
60
+ interactive = false,
61
+ label = "Progress",
62
+ strings,
63
+ onstepchange,
64
+ ...restProps
65
+ }: Props = $props();
66
+
67
+ // No fallback on a bindable prop: Svelte refuses `bind:…={undefined}` on
68
+ // one that has a fallback (`props_invalid_value`), and a page that throws
69
+ // while it hydrates never becomes interactive. The default is applied
70
+ // here instead: at once, for the server and the first render, and again
71
+ // whenever a parent hands back `undefined`.
72
+ const applyDefaults = () => {
73
+ if (current === undefined) current = 0;
74
+ };
75
+ applyDefaults();
76
+ $effect.pre(applyDefaults);
77
+
78
+ /** The app-wide words for this component, from a `ZabiStringsProvider` above it, if there is one. */
79
+ const provided = zabiStringsFor("stepper");
80
+ const text = $derived(mergeStrings(STEPPER_STRINGS, provided(), strings));
81
+ const items = $derived(normalizeSteps(steps));
82
+ /** The step shown as current: `current` held within the steps. */
83
+ const shown = $derived(clampStep(current, items.length));
84
+ const currentStep = $derived(items[shown]);
85
+
86
+ /** What a step is drawn in: a button while it can be pressed, a span otherwise. */
87
+ const bodies: (HTMLElement | undefined)[] = $state([]);
88
+
89
+ /**
90
+ * Only a completed step is a button, so the press is never on the current
91
+ * one and a repeat press has nothing to clear. The button turns into the
92
+ * current step's plain text as it is pressed; focus is put on that text,
93
+ * so it is not dropped onto the page.
94
+ */
95
+ async function go(index: number) {
96
+ if (index >= shown) return;
97
+ current = index;
98
+ onstepchange?.(index);
99
+ await tick();
100
+ bodies[index]?.focus();
101
+ }
102
+
103
+ /** Read out once when the current step changes, and never for the first render. */
104
+ let announced = $state("");
105
+ let previous: number | undefined;
106
+
107
+ $effect(() => {
108
+ const index = shown;
109
+ if (previous === undefined || index === previous || index < 0) {
110
+ previous = index;
111
+ return;
112
+ }
113
+ previous = index;
114
+ announced = untrack(() =>
115
+ text.announcement(index + 1, items.length, items[index].label),
116
+ );
117
+ // Taken away again, so the list stays the one place the steps are read from.
118
+ const timer = setTimeout(() => (announced = ""), 3000);
119
+ return () => clearTimeout(timer);
120
+ });
121
+ </script>
122
+
123
+ {#snippet content(step: StepperStep, index: number, state: StepperStepState)}
124
+ <span class="stepper-marker" aria-hidden="true">
125
+ {#if state === "completed"}
126
+ <Check />
127
+ {:else}
128
+ <span class="stepper-number">{index + 1}</span>
129
+ {/if}
130
+ </span>
131
+ <span class="stepper-text">
132
+ <!-- One sentence with the number, the label and the state, so a
133
+ translation can order them; the visible label is a repeat of it. -->
134
+ <span class="sr-only">{text.stepLabel(index + 1, items.length, step.label, state)}</span>
135
+ <span class="stepper-label" aria-hidden="true">{step.label}</span>
136
+ {#if step.description}
137
+ <span class="stepper-description">{step.description}</span>
138
+ {/if}
139
+ </span>
140
+ {/snippet}
141
+
142
+ {#if items.length > 0}
143
+ <nav
144
+ class={cn("stepper", className)}
145
+ data-stepper
146
+ data-size={size}
147
+ data-layout={layout}
148
+ data-interactive={interactive ? "" : undefined}
149
+ aria-label={restProps["aria-labelledby"] ? undefined : label}
150
+ {...restProps}
151
+ >
152
+ <div class="stepper-frame">
153
+ <!-- The one list, in both layouts: the compact layout draws its
154
+ markers as the segments of a bar and clips the text, so a screen
155
+ reader reads the same steps either way. `role`, because a list
156
+ without bullets loses its role in Safari. -->
157
+ <ol class="stepper-list" role="list">
158
+ {#each items as step, index (index)}
159
+ {@const state = stepState(index, shown)}
160
+ <li
161
+ class="stepper-step"
162
+ data-state={state}
163
+ aria-current={state === "current" ? "step" : undefined}
164
+ >
165
+ {#if interactive && state === "completed"}
166
+ <button
167
+ bind:this={bodies[index]}
168
+ type="button"
169
+ class="stepper-body focus-ring"
170
+ onclick={() => go(index)}
171
+ >
172
+ {@render content(step, index, state)}
173
+ </button>
174
+ {:else}
175
+ <!-- Never a Tab stop: -1, so that a step can take
176
+ focus from the button that was pressed to reach it. -->
177
+ <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
178
+ <span
179
+ bind:this={bodies[index]}
180
+ class="stepper-body focus-ring"
181
+ tabindex={interactive ? -1 : undefined}
182
+ >
183
+ {@render content(step, index, state)}
184
+ </span>
185
+ {/if}
186
+ {#if index < items.length - 1}
187
+ <span class="stepper-connector" aria-hidden="true"></span>
188
+ {/if}
189
+ </li>
190
+ {/each}
191
+ </ol>
192
+ <!-- What the compact layout shows instead of the labels. Not in
193
+ the layout at all in the full one, and never read: the list says it. -->
194
+ <div class="stepper-summary" aria-hidden="true" data-stepper-summary>
195
+ <p class="stepper-summary-line">
196
+ <span>{text.position(shown + 1, items.length)}</span>
197
+ <span>—</span>
198
+ <span class="stepper-summary-label">{currentStep.label}</span>
199
+ </p>
200
+ {#if currentStep.description}
201
+ <p class="stepper-summary-description">{currentStep.description}</p>
202
+ {/if}
203
+ </div>
204
+ </div>
205
+ <span class="sr-only" role="status" data-stepper-status>{announced}</span>
206
+ </nav>
207
+ {/if}
208
+
209
+ <style>
210
+ /*
211
+ * One list, two drawings. The full layout is the default; the compact one
212
+ * is a set of values on `.stepper-frame`, switched on by `layout="compact"`
213
+ * or, for `auto`, by the width of the Stepper itself. The rules below read
214
+ * those values, so the two ways in cannot drift apart: `COMPACT` appears
215
+ * twice and must be the same list both times.
216
+ */
217
+ .stepper {
218
+ container-type: inline-size;
219
+ /*
220
+ * A size container has no width of its own: as an item of a flex row,
221
+ * or centred in a column or a grid, it would be 0px wide and nothing
222
+ * of it would show. So it asks for the width at which the full layout
223
+ * begins, and gives way to what there is: narrower than that, it is
224
+ * as wide as the room it gets and compact.
225
+ */
226
+ contain-intrinsic-inline-size: 30rem;
227
+ min-inline-size: 0;
228
+ --zabi-stepper-marker: 2rem;
229
+ --zabi-stepper-bar: 8px;
230
+ --zabi-stepper-leading: 1.25rem;
231
+ /* The least height of a step that can be pressed. */
232
+ --zabi-stepper-min-row: 0px;
233
+ font-size: 0.875rem;
234
+ line-height: var(--zabi-stepper-leading);
235
+ }
236
+
237
+ .stepper[data-size="sm"] {
238
+ --zabi-stepper-marker: 1.5rem;
239
+ --zabi-stepper-bar: 6px;
240
+ --zabi-stepper-leading: 1rem;
241
+ font-size: 0.75rem;
242
+ }
243
+
244
+ .stepper[data-size="lg"] {
245
+ --zabi-stepper-marker: 2.5rem;
246
+ --zabi-stepper-bar: 10px;
247
+ --zabi-stepper-leading: 1.5rem;
248
+ font-size: 1rem;
249
+ }
250
+
251
+ .stepper[data-interactive] {
252
+ --zabi-stepper-min-row: 24px;
253
+ }
254
+
255
+ /* A finger is the same size whatever the text size is, so the target is in px. */
256
+ @media (pointer: coarse) {
257
+ .stepper[data-interactive] {
258
+ --zabi-stepper-min-row: 44px;
259
+ }
260
+ }
261
+
262
+ .stepper-frame {
263
+ --zabi-stepper-row: max(var(--zabi-stepper-min-row), var(--zabi-stepper-marker));
264
+ --zabi-stepper-gap: 0px;
265
+ --zabi-stepper-step-flex: 1 1 auto;
266
+ --zabi-stepper-last-flex: 0 1 auto;
267
+ --zabi-stepper-body-size: auto;
268
+ --zabi-stepper-body-least: var(--zabi-stepper-min-row);
269
+ --zabi-stepper-marker-inline: var(--zabi-stepper-marker);
270
+ --zabi-stepper-marker-block: var(--zabi-stepper-marker);
271
+ --zabi-stepper-marker-edge: 2px;
272
+ --zabi-stepper-current-gap: 2px;
273
+ --zabi-stepper-glyph: flex;
274
+ --zabi-stepper-connector: block;
275
+ --zabi-stepper-summary: none;
276
+ --zabi-stepper-text-position: static;
277
+ --zabi-stepper-text-size: auto;
278
+ --zabi-stepper-text-overflow: visible;
279
+ --zabi-stepper-text-clip: none;
280
+ --zabi-stepper-text-space: normal;
281
+ }
282
+
283
+ /* COMPACT */
284
+ .stepper[data-layout="compact"] .stepper-frame {
285
+ --zabi-stepper-row: max(var(--zabi-stepper-min-row), var(--zabi-stepper-bar));
286
+ --zabi-stepper-gap: 4px;
287
+ --zabi-stepper-step-flex: 1 1 0;
288
+ --zabi-stepper-last-flex: 1 1 0;
289
+ --zabi-stepper-body-size: 100%;
290
+ --zabi-stepper-body-least: 0px;
291
+ --zabi-stepper-marker-inline: 100%;
292
+ --zabi-stepper-marker-block: var(--zabi-stepper-bar);
293
+ --zabi-stepper-marker-edge: 1px;
294
+ --zabi-stepper-current-gap: 0px;
295
+ --zabi-stepper-glyph: none;
296
+ --zabi-stepper-connector: none;
297
+ --zabi-stepper-summary: block;
298
+ --zabi-stepper-text-position: absolute;
299
+ --zabi-stepper-text-size: 1px;
300
+ --zabi-stepper-text-overflow: hidden;
301
+ --zabi-stepper-text-clip: inset(50%);
302
+ --zabi-stepper-text-space: nowrap;
303
+ }
304
+
305
+ /* COMPACT, again: in rem, so enlarged text goes compact sooner. */
306
+ @container (width < 30rem) {
307
+ .stepper[data-layout="auto"] .stepper-frame {
308
+ --zabi-stepper-row: max(var(--zabi-stepper-min-row), var(--zabi-stepper-bar));
309
+ --zabi-stepper-gap: 4px;
310
+ --zabi-stepper-step-flex: 1 1 0;
311
+ --zabi-stepper-last-flex: 1 1 0;
312
+ --zabi-stepper-body-size: 100%;
313
+ --zabi-stepper-body-least: 0px;
314
+ --zabi-stepper-marker-inline: 100%;
315
+ --zabi-stepper-marker-block: var(--zabi-stepper-bar);
316
+ --zabi-stepper-marker-edge: 1px;
317
+ --zabi-stepper-current-gap: 0px;
318
+ --zabi-stepper-glyph: none;
319
+ --zabi-stepper-connector: none;
320
+ --zabi-stepper-summary: block;
321
+ --zabi-stepper-text-position: absolute;
322
+ --zabi-stepper-text-size: 1px;
323
+ --zabi-stepper-text-overflow: hidden;
324
+ --zabi-stepper-text-clip: inset(50%);
325
+ --zabi-stepper-text-space: nowrap;
326
+ }
327
+ }
328
+
329
+ .stepper-list {
330
+ display: flex;
331
+ align-items: flex-start;
332
+ gap: var(--zabi-stepper-gap);
333
+ margin: 0;
334
+ padding: 0;
335
+ list-style: none;
336
+ }
337
+
338
+ .stepper-step {
339
+ position: relative;
340
+ display: flex;
341
+ flex: var(--zabi-stepper-step-flex);
342
+ align-items: flex-start;
343
+ min-width: 0;
344
+ }
345
+
346
+ .stepper-step:last-child {
347
+ flex: var(--zabi-stepper-last-flex);
348
+ }
349
+
350
+ .stepper-body {
351
+ display: flex;
352
+ align-items: flex-start;
353
+ /* Between a marker and its label; not a distance that should grow with the text. */
354
+ gap: 8px;
355
+ width: var(--zabi-stepper-body-size);
356
+ min-width: 0;
357
+ min-height: var(--zabi-stepper-row);
358
+ margin: 0;
359
+ padding: 0;
360
+ border: 0;
361
+ /* A pill, as the marker in it is: the focus ring follows it. */
362
+ border-radius: 9999px;
363
+ background: none;
364
+ color: inherit;
365
+ font: inherit;
366
+ text-align: start;
367
+ }
368
+
369
+ /* A segment of the bar is as wide as its share of the bar, and no wider:
370
+ a least width there would lay the segments over each other. */
371
+ button.stepper-body {
372
+ min-width: var(--zabi-stepper-body-least);
373
+ cursor: pointer;
374
+ -webkit-tap-highlight-color: transparent;
375
+ }
376
+
377
+ /*
378
+ * Completed and current are filled, upcoming is an outline: a difference
379
+ * of shape. Completed has a check where the others have their number, and
380
+ * the current one stands inside a ring of its own.
381
+ */
382
+ .stepper-marker {
383
+ display: flex;
384
+ flex: none;
385
+ align-items: center;
386
+ justify-content: center;
387
+ box-sizing: border-box;
388
+ width: var(--zabi-stepper-marker-inline);
389
+ height: var(--zabi-stepper-marker-block);
390
+ margin-block: calc((var(--zabi-stepper-row) - var(--zabi-stepper-marker-block)) / 2);
391
+ /* `--zabi-stepper-fill` is what a hovered or pressed step changes. */
392
+ border: var(--zabi-stepper-marker-edge) solid
393
+ var(--zabi-stepper-fill, var(--color-action-primary));
394
+ border-radius: 9999px;
395
+ background-color: var(--zabi-stepper-fill, var(--color-action-primary));
396
+ color: var(--color-on-brand);
397
+ font-weight: 600;
398
+ font-variant-numeric: tabular-nums;
399
+ line-height: 1;
400
+ transition:
401
+ background-color 150ms,
402
+ border-color 150ms,
403
+ transform 150ms;
404
+ }
405
+
406
+ .stepper-marker > :global(*) {
407
+ display: var(--zabi-stepper-glyph);
408
+ }
409
+
410
+ .stepper-marker > :global(svg) {
411
+ width: 60%;
412
+ height: 60%;
413
+ stroke-width: 3;
414
+ }
415
+
416
+ /* The ring: the fill stops 2px short of the edge, and the surface shows between. */
417
+ .stepper-step[data-state="current"] .stepper-marker {
418
+ padding: var(--zabi-stepper-current-gap);
419
+ background-clip: content-box;
420
+ }
421
+
422
+ /* The edge is all there is of an upcoming marker, so it is the control
423
+ boundary: 3:1 or better on every surface level of both themes. */
424
+ .stepper-step[data-state="upcoming"] .stepper-marker {
425
+ border-color: var(--color-control-border);
426
+ background-color: transparent;
427
+ color: var(--color-description);
428
+ }
429
+
430
+ .stepper-text {
431
+ position: var(--zabi-stepper-text-position);
432
+ display: flex;
433
+ flex-direction: column;
434
+ width: var(--zabi-stepper-text-size);
435
+ height: var(--zabi-stepper-text-size);
436
+ min-width: 0;
437
+ overflow: var(--zabi-stepper-text-overflow);
438
+ clip-path: var(--zabi-stepper-text-clip);
439
+ white-space: var(--zabi-stepper-text-space);
440
+ padding-block: calc((var(--zabi-stepper-row) - var(--zabi-stepper-leading)) / 2);
441
+ overflow-wrap: anywhere;
442
+ }
443
+
444
+ .stepper-label {
445
+ color: var(--color-body);
446
+ }
447
+
448
+ .stepper-step[data-state="current"] .stepper-label {
449
+ font-weight: 600;
450
+ }
451
+
452
+ .stepper-step[data-state="upcoming"] .stepper-label {
453
+ color: var(--color-description);
454
+ }
455
+
456
+ .stepper-description,
457
+ .stepper-summary-description {
458
+ color: var(--color-description);
459
+ font-size: 0.75rem;
460
+ line-height: 1rem;
461
+ }
462
+
463
+ /* Solid up to the current step and dashed after it: not by colour alone. */
464
+ .stepper-connector {
465
+ display: var(--zabi-stepper-connector);
466
+ flex: 1 1 1rem;
467
+ min-width: 1rem;
468
+ margin-inline: 8px;
469
+ margin-block-start: calc(var(--zabi-stepper-row) / 2 - 1px);
470
+ border-block-start: 2px dashed var(--color-control-border);
471
+ transition: border-color 150ms;
472
+ }
473
+
474
+ .stepper-step[data-state="completed"] > .stepper-connector {
475
+ border-block-start: 2px solid var(--color-action-primary);
476
+ }
477
+
478
+ .stepper-summary {
479
+ display: var(--zabi-stepper-summary);
480
+ margin-block-start: 8px;
481
+ color: var(--color-description);
482
+ overflow-wrap: anywhere;
483
+ }
484
+
485
+ .stepper-summary-line {
486
+ margin: 0;
487
+ }
488
+
489
+ .stepper-summary-label {
490
+ color: var(--color-body);
491
+ font-weight: 600;
492
+ }
493
+
494
+ .stepper-summary-description {
495
+ margin: 2px 0 0;
496
+ }
497
+
498
+ @media (hover: hover) {
499
+ button.stepper-body:hover {
500
+ --zabi-stepper-fill: var(--color-action-primary-hover);
501
+ }
502
+
503
+ button.stepper-body:hover .stepper-label {
504
+ text-decoration: underline;
505
+ }
506
+ }
507
+
508
+ /* Pressed, on every pointer. */
509
+ button.stepper-body:active {
510
+ --zabi-stepper-fill: var(--color-action-primary-active);
511
+ }
512
+
513
+ button.stepper-body:active .stepper-marker {
514
+ transform: scale(0.92);
515
+ }
516
+
517
+ /*
518
+ * Forced colours take every background away. The filled markers are put
519
+ * back in the system's own pair, so filled still differs from outlined;
520
+ * the connectors are borders, which are kept, solid and dashed. A hovered
521
+ * or pressed step changes `--zabi-stepper-fill`, which is not read here.
522
+ */
523
+ @media (forced-colors: active) {
524
+ .stepper-marker {
525
+ forced-color-adjust: none;
526
+ border-color: Highlight;
527
+ background-color: Highlight;
528
+ color: HighlightText;
529
+ }
530
+
531
+ .stepper-step[data-state="upcoming"] .stepper-marker {
532
+ border-color: CanvasText;
533
+ background-color: Canvas;
534
+ color: CanvasText;
535
+ }
536
+ }
537
+
538
+ @media (prefers-reduced-motion: reduce) {
539
+ .stepper-marker,
540
+ .stepper-connector {
541
+ transition: none;
542
+ }
543
+
544
+ button.stepper-body:active .stepper-marker {
545
+ transform: none;
546
+ }
547
+ }
548
+ </style>
@@ -0,0 +1,39 @@
1
+ import type { HTMLAttributes } from "svelte/elements";
2
+ import type { SizeVariant } from "../types/variants.js";
3
+ import { type StepperItem, type StepperStrings } from "../util/stepper.js";
4
+ /** Other attributes (`data-*`, `id`, `aria-labelledby`, ...) land on the host element. */
5
+ type Props = Omit<HTMLAttributes<HTMLElement>, "class"> & {
6
+ /** Extra classes for the host element. */
7
+ class?: string;
8
+ /** The steps, in order: labels, or objects with a label and a description. */
9
+ steps: StepperItem[];
10
+ /**
11
+ * Index of the current step, counted from 0; supports `bind:current`.
12
+ * A value outside the steps is shown as the nearest step (below the
13
+ * first: the first; past the last: the last) and the bound value is
14
+ * left as it was given.
15
+ */
16
+ current?: number;
17
+ /** Size of the markers and the text. */
18
+ size?: SizeVariant;
19
+ /**
20
+ * `full` draws every step with its marker and label; `compact` draws
21
+ * one line of text under a segmented bar. `auto` is compact while the
22
+ * Stepper itself is narrower than 30rem, and full from there.
23
+ */
24
+ layout?: "auto" | "full" | "compact";
25
+ /**
26
+ * Makes the completed steps buttons that go back to that step. The
27
+ * current step and the ones after it are never buttons.
28
+ */
29
+ interactive?: boolean;
30
+ /** Accessible name of the navigation landmark. */
31
+ label?: string;
32
+ /** Overrides for the built-in strings. */
33
+ strings?: Partial<StepperStrings>;
34
+ /** Called with the index of the step a press went back to. Only with `interactive`. */
35
+ onstepchange?: (index: number) => void;
36
+ };
37
+ declare const Stepper: import("svelte").Component<Props, {}, "current">;
38
+ type Stepper = ReturnType<typeof Stepper>;
39
+ export default Stepper;