zabi-components 8.0.0 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (456) hide show
  1. package/CHANGELOG.md +2935 -0
  2. package/README.md +243 -10
  3. package/THEME.md +162 -332
  4. package/THEMING.md +1419 -259
  5. package/dist/atoms/ActionPanel.svelte +15 -5
  6. package/dist/atoms/Avatar.svelte +120 -0
  7. package/dist/atoms/Avatar.svelte.d.ts +46 -0
  8. package/dist/atoms/Badge.svelte +71 -13
  9. package/dist/atoms/Badge.svelte.d.ts +8 -2
  10. package/dist/atoms/Block.svelte +74 -0
  11. package/dist/atoms/Block.svelte.d.ts +29 -0
  12. package/dist/atoms/Button.svelte +217 -30
  13. package/dist/atoms/Button.svelte.d.ts +33 -4
  14. package/dist/atoms/Card.svelte +182 -26
  15. package/dist/atoms/Card.svelte.d.ts +55 -3
  16. package/dist/atoms/CardHeader.svelte +16 -4
  17. package/dist/atoms/Checkbox.svelte +81 -21
  18. package/dist/atoms/Checkbox.svelte.d.ts +31 -2
  19. package/dist/atoms/Chip.svelte +351 -0
  20. package/dist/atoms/Chip.svelte.d.ts +57 -0
  21. package/dist/atoms/CodeBlock.svelte +20 -2
  22. package/dist/atoms/CodeBlock.svelte.d.ts +4 -0
  23. package/dist/atoms/CodeField.svelte +385 -0
  24. package/dist/atoms/CodeField.svelte.d.ts +61 -0
  25. package/dist/atoms/ColorPicker.svelte +260 -49
  26. package/dist/atoms/ColorPicker.svelte.d.ts +3 -0
  27. package/dist/atoms/Container.svelte +16 -8
  28. package/dist/atoms/DateField.svelte +145 -0
  29. package/dist/atoms/DateField.svelte.d.ts +81 -0
  30. package/dist/atoms/FieldMessages.svelte +69 -0
  31. package/dist/atoms/FieldMessages.svelte.d.ts +23 -0
  32. package/dist/atoms/FloatingActionButton.svelte +176 -0
  33. package/dist/atoms/FloatingActionButton.svelte.d.ts +51 -0
  34. package/dist/atoms/Heading.svelte +63 -5
  35. package/dist/atoms/Heading.svelte.d.ts +14 -0
  36. package/dist/atoms/IconButton.svelte +294 -26
  37. package/dist/atoms/IconButton.svelte.d.ts +62 -4
  38. package/dist/atoms/Input.svelte +259 -53
  39. package/dist/atoms/Input.svelte.d.ts +33 -2
  40. package/dist/atoms/List.svelte +5 -1
  41. package/dist/atoms/ListItem.svelte +70 -13
  42. package/dist/atoms/ListItem.svelte.d.ts +11 -0
  43. package/dist/atoms/PickerField.svelte +239 -0
  44. package/dist/atoms/PickerField.svelte.d.ts +67 -0
  45. package/dist/atoms/Progress.svelte +99 -19
  46. package/dist/atoms/Progress.svelte.d.ts +15 -1
  47. package/dist/atoms/Radio.svelte +51 -3
  48. package/dist/atoms/Radio.svelte.d.ts +30 -2
  49. package/dist/atoms/Rating.svelte +620 -0
  50. package/dist/atoms/Rating.svelte.d.ts +77 -0
  51. package/dist/atoms/Select.svelte +438 -98
  52. package/dist/atoms/Select.svelte.d.ts +61 -3
  53. package/dist/atoms/SelectionControl.svelte +193 -23
  54. package/dist/atoms/SelectionControl.svelte.d.ts +29 -3
  55. package/dist/atoms/Skeleton.svelte +114 -18
  56. package/dist/atoms/Skeleton.svelte.d.ts +30 -3
  57. package/dist/atoms/SkeletonGroup.svelte +43 -0
  58. package/dist/atoms/SkeletonGroup.svelte.d.ts +20 -0
  59. package/dist/atoms/Slider.svelte +344 -0
  60. package/dist/atoms/Slider.svelte.d.ts +40 -0
  61. package/dist/atoms/Sparkline.svelte +109 -0
  62. package/dist/atoms/Sparkline.svelte.d.ts +27 -0
  63. package/dist/atoms/SpeechBubble.svelte +187 -0
  64. package/dist/atoms/SpeechBubble.svelte.d.ts +33 -0
  65. package/dist/atoms/Spinner.svelte +57 -0
  66. package/dist/atoms/Spinner.svelte.d.ts +19 -0
  67. package/dist/atoms/Stat.svelte +72 -0
  68. package/dist/atoms/Stat.svelte.d.ts +19 -0
  69. package/dist/atoms/Table.svelte +151 -6
  70. package/dist/atoms/Table.svelte.d.ts +15 -3
  71. package/dist/atoms/TemporalField.svelte +472 -0
  72. package/dist/atoms/TemporalField.svelte.d.ts +48 -0
  73. package/dist/atoms/Text.svelte +23 -11
  74. package/dist/atoms/Text.svelte.d.ts +6 -3
  75. package/dist/atoms/Textarea.svelte +150 -44
  76. package/dist/atoms/Textarea.svelte.d.ts +35 -2
  77. package/dist/atoms/ThemeToggle.svelte +223 -44
  78. package/dist/atoms/ThemeToggle.svelte.d.ts +26 -3
  79. package/dist/atoms/TimeColumn.svelte +150 -0
  80. package/dist/atoms/TimeColumn.svelte.d.ts +25 -0
  81. package/dist/atoms/TimeField.svelte +151 -0
  82. package/dist/atoms/TimeField.svelte.d.ts +85 -0
  83. package/dist/atoms/Toast.svelte +22 -8
  84. package/dist/atoms/Toast.svelte.d.ts +2 -0
  85. package/dist/atoms/Toggle.svelte +98 -14
  86. package/dist/atoms/Toggle.svelte.d.ts +26 -2
  87. package/dist/atoms/Tooltip.svelte +528 -24
  88. package/dist/atoms/Tooltip.svelte.d.ts +18 -0
  89. package/dist/atoms/ZabiStringsProvider.svelte +45 -0
  90. package/dist/atoms/ZabiStringsProvider.svelte.d.ts +27 -0
  91. package/dist/atoms/index.d.ts +38 -0
  92. package/dist/atoms/index.js +29 -0
  93. package/dist/atoms/selection-control.styles.d.ts +47 -5
  94. package/dist/atoms/selection-control.styles.js +52 -10
  95. package/dist/components/atoms/index.d.ts +38 -0
  96. package/dist/components/atoms/index.d.ts.map +1 -1
  97. package/dist/components/atoms/selection-control.styles.d.ts +47 -5
  98. package/dist/components/atoms/selection-control.styles.d.ts.map +1 -1
  99. package/dist/components/index.d.ts +104 -2
  100. package/dist/components/index.d.ts.map +1 -1
  101. package/dist/components/map.d.ts +11 -0
  102. package/dist/components/map.d.ts.map +1 -0
  103. package/dist/components/molecules/index.d.ts +51 -0
  104. package/dist/components/molecules/index.d.ts.map +1 -1
  105. package/dist/components/molecules/toast-store.d.ts +83 -7
  106. package/dist/components/molecules/toast-store.d.ts.map +1 -1
  107. package/dist/components/organisms/index.d.ts +10 -0
  108. package/dist/components/organisms/index.d.ts.map +1 -1
  109. package/dist/components/types/variants.d.ts +24 -1
  110. package/dist/components/types/variants.d.ts.map +1 -1
  111. package/dist/components/util/app-shell.d.ts +79 -0
  112. package/dist/components/util/app-shell.d.ts.map +1 -0
  113. package/dist/components/util/avatar.d.ts +39 -0
  114. package/dist/components/util/avatar.d.ts.map +1 -0
  115. package/dist/components/util/bottom-sheet.d.ts +30 -0
  116. package/dist/components/util/bottom-sheet.d.ts.map +1 -0
  117. package/dist/components/util/bottom-tab-bar.d.ts +41 -0
  118. package/dist/components/util/bottom-tab-bar.d.ts.map +1 -0
  119. package/dist/components/util/calendar.d.ts +56 -0
  120. package/dist/components/util/calendar.d.ts.map +1 -0
  121. package/dist/components/util/chart.d.ts +140 -0
  122. package/dist/components/util/chart.d.ts.map +1 -0
  123. package/dist/components/util/chip.d.ts +66 -0
  124. package/dist/components/util/chip.d.ts.map +1 -0
  125. package/dist/components/util/cn.d.ts.map +1 -1
  126. package/dist/components/util/code-field.d.ts +63 -0
  127. package/dist/components/util/code-field.d.ts.map +1 -0
  128. package/dist/components/util/collapsible.d.ts +64 -0
  129. package/dist/components/util/collapsible.d.ts.map +1 -0
  130. package/dist/components/util/confirm-dialog.d.ts +12 -0
  131. package/dist/components/util/confirm-dialog.d.ts.map +1 -0
  132. package/dist/components/util/date.d.ts +96 -0
  133. package/dist/components/util/date.d.ts.map +1 -0
  134. package/dist/components/util/display-voice.d.ts +10 -0
  135. package/dist/components/util/display-voice.d.ts.map +1 -0
  136. package/dist/components/util/drawer.d.ts +13 -0
  137. package/dist/components/util/drawer.d.ts.map +1 -0
  138. package/dist/components/util/dropdown.d.ts +47 -0
  139. package/dist/components/util/dropdown.d.ts.map +1 -0
  140. package/dist/components/util/field-control.d.ts +30 -0
  141. package/dist/components/util/field-control.d.ts.map +1 -0
  142. package/dist/components/util/field.d.ts +45 -0
  143. package/dist/components/util/field.d.ts.map +1 -0
  144. package/dist/components/util/fit-in-viewport.d.ts +201 -0
  145. package/dist/components/util/fit-in-viewport.d.ts.map +1 -0
  146. package/dist/components/util/focus-utils.d.ts +77 -2
  147. package/dist/components/util/focus-utils.d.ts.map +1 -1
  148. package/dist/components/util/hydration.d.ts +45 -0
  149. package/dist/components/util/hydration.d.ts.map +1 -0
  150. package/dist/components/util/keyboard-inset.d.ts +18 -0
  151. package/dist/components/util/keyboard-inset.d.ts.map +1 -0
  152. package/dist/components/util/map-view.d.ts +144 -0
  153. package/dist/components/util/map-view.d.ts.map +1 -0
  154. package/dist/components/util/media-grid.d.ts +51 -0
  155. package/dist/components/util/media-grid.d.ts.map +1 -0
  156. package/dist/components/util/media.d.ts +6 -0
  157. package/dist/components/util/media.d.ts.map +1 -0
  158. package/dist/components/util/overlay-chrome.d.ts +53 -0
  159. package/dist/components/util/overlay-chrome.d.ts.map +1 -0
  160. package/dist/components/util/overlay.d.ts +72 -0
  161. package/dist/components/util/overlay.d.ts.map +1 -0
  162. package/dist/components/util/photo.d.ts +234 -0
  163. package/dist/components/util/photo.d.ts.map +1 -0
  164. package/dist/components/util/portal.d.ts +23 -0
  165. package/dist/components/util/portal.d.ts.map +1 -0
  166. package/dist/components/util/progress.d.ts +19 -0
  167. package/dist/components/util/progress.d.ts.map +1 -0
  168. package/dist/components/util/pull-to-refresh.d.ts +27 -0
  169. package/dist/components/util/pull-to-refresh.d.ts.map +1 -0
  170. package/dist/components/util/radio-keys.d.ts +25 -0
  171. package/dist/components/util/radio-keys.d.ts.map +1 -0
  172. package/dist/components/util/rating.d.ts +23 -0
  173. package/dist/components/util/rating.d.ts.map +1 -0
  174. package/dist/components/util/ready-made-strings.d.ts +77 -0
  175. package/dist/components/util/ready-made-strings.d.ts.map +1 -0
  176. package/dist/components/util/scroll-edge.d.ts +33 -0
  177. package/dist/components/util/scroll-edge.d.ts.map +1 -0
  178. package/dist/components/util/scroll-padding.d.ts +20 -0
  179. package/dist/components/util/scroll-padding.d.ts.map +1 -0
  180. package/dist/components/util/segmented-control.d.ts +16 -0
  181. package/dist/components/util/segmented-control.d.ts.map +1 -0
  182. package/dist/components/util/select.d.ts +41 -0
  183. package/dist/components/util/select.d.ts.map +1 -0
  184. package/dist/components/util/sheet-drag.d.ts +84 -0
  185. package/dist/components/util/sheet-drag.d.ts.map +1 -0
  186. package/dist/components/util/sidebar.d.ts +63 -0
  187. package/dist/components/util/sidebar.d.ts.map +1 -0
  188. package/dist/components/util/skeleton.d.ts +15 -0
  189. package/dist/components/util/skeleton.d.ts.map +1 -0
  190. package/dist/components/util/sliding-indicator.d.ts +25 -0
  191. package/dist/components/util/sliding-indicator.d.ts.map +1 -0
  192. package/dist/components/util/sortable-list.d.ts +65 -0
  193. package/dist/components/util/sortable-list.d.ts.map +1 -0
  194. package/dist/components/util/stepper.d.ts +40 -0
  195. package/dist/components/util/stepper.d.ts.map +1 -0
  196. package/dist/components/util/swipeable-list-item.d.ts +36 -0
  197. package/dist/components/util/swipeable-list-item.d.ts.map +1 -0
  198. package/dist/components/util/temporal-field.d.ts +89 -0
  199. package/dist/components/util/temporal-field.d.ts.map +1 -0
  200. package/dist/components/util/theme-mode.d.ts +80 -0
  201. package/dist/components/util/theme-mode.d.ts.map +1 -0
  202. package/dist/components/util/toaster.d.ts +133 -0
  203. package/dist/components/util/toaster.d.ts.map +1 -0
  204. package/dist/components/util/tone-surface.d.ts +34 -0
  205. package/dist/components/util/tone-surface.d.ts.map +1 -0
  206. package/dist/components/util/tooltip.d.ts +10 -0
  207. package/dist/components/util/tooltip.d.ts.map +1 -0
  208. package/dist/components/util/top-navbar.d.ts +35 -0
  209. package/dist/components/util/top-navbar.d.ts.map +1 -0
  210. package/dist/components/util/touch-target.d.ts +31 -0
  211. package/dist/components/util/touch-target.d.ts.map +1 -0
  212. package/dist/components/util/zabi-strings.d.ts +142 -0
  213. package/dist/components/util/zabi-strings.d.ts.map +1 -0
  214. package/dist/create-theme/cli.js +173 -0
  215. package/dist/create-theme/index.d.ts +190 -0
  216. package/dist/create-theme/index.js +1034 -0
  217. package/dist/create-theme/lib/ramp-math.js +128 -0
  218. package/dist/create-theme/lib/resolve.js +238 -0
  219. package/dist/create-theme/theme-data.js +2644 -0
  220. package/dist/index.d.ts +104 -2
  221. package/dist/index.js +75 -2
  222. package/dist/map.d.ts +10 -0
  223. package/dist/map.js +9 -0
  224. package/dist/molecules/Alert.svelte +63 -16
  225. package/dist/molecules/Alert.svelte.d.ts +14 -1
  226. package/dist/molecules/AppBar.svelte +674 -0
  227. package/dist/molecules/AppBar.svelte.d.ts +131 -0
  228. package/dist/molecules/AvatarGroup.svelte +116 -0
  229. package/dist/molecules/AvatarGroup.svelte.d.ts +40 -0
  230. package/dist/molecules/BarChart.svelte +381 -0
  231. package/dist/molecules/BarChart.svelte.d.ts +45 -0
  232. package/dist/molecules/BottomSheet.svelte +608 -0
  233. package/dist/molecules/BottomSheet.svelte.d.ts +109 -0
  234. package/dist/molecules/BottomTabBar.svelte +403 -0
  235. package/dist/molecules/BottomTabBar.svelte.d.ts +98 -0
  236. package/dist/molecules/Calendar.svelte +597 -0
  237. package/dist/molecules/Calendar.svelte.d.ts +72 -0
  238. package/dist/molecules/ChipGroup.svelte +325 -0
  239. package/dist/molecules/ChipGroup.svelte.d.ts +41 -0
  240. package/dist/molecules/Collapsible.svelte +347 -0
  241. package/dist/molecules/Collapsible.svelte.d.ts +61 -0
  242. package/dist/molecules/CollapsibleGroup.svelte +136 -0
  243. package/dist/molecules/CollapsibleGroup.svelte.d.ts +14 -0
  244. package/dist/molecules/ComponentDemo.svelte +16 -4
  245. package/dist/molecules/ComponentDemo.svelte.d.ts +3 -0
  246. package/dist/molecules/ConfirmDialog.svelte +257 -0
  247. package/dist/molecules/ConfirmDialog.svelte.d.ts +58 -0
  248. package/dist/molecules/ContactForm.svelte +34 -17
  249. package/dist/molecules/ContactForm.svelte.d.ts +8 -0
  250. package/dist/molecules/Drawer.svelte +415 -0
  251. package/dist/molecules/Drawer.svelte.d.ts +55 -0
  252. package/dist/molecules/Dropdown.svelte +517 -48
  253. package/dist/molecules/Dropdown.svelte.d.ts +47 -6
  254. package/dist/molecules/DropdownItem.svelte +122 -0
  255. package/dist/molecules/DropdownItem.svelte.d.ts +28 -0
  256. package/dist/molecules/EmptyState.svelte +55 -10
  257. package/dist/molecules/EmptyState.svelte.d.ts +8 -0
  258. package/dist/molecules/FormField.svelte +9 -1
  259. package/dist/molecules/FormField.svelte.d.ts +2 -0
  260. package/dist/molecules/Header.svelte +1 -1
  261. package/dist/molecules/ImageUpload.svelte +492 -69
  262. package/dist/molecules/ImageUpload.svelte.d.ts +82 -2
  263. package/dist/molecules/LineChart.svelte +459 -0
  264. package/dist/molecules/LineChart.svelte.d.ts +53 -0
  265. package/dist/molecules/MapView.svelte +565 -0
  266. package/dist/molecules/MapView.svelte.d.ts +88 -0
  267. package/dist/molecules/MediaGrid.svelte +527 -0
  268. package/dist/molecules/MediaGrid.svelte.d.ts +77 -0
  269. package/dist/molecules/Modal.svelte +293 -72
  270. package/dist/molecules/Modal.svelte.d.ts +51 -2
  271. package/dist/molecules/NavigationMenuContent.svelte +58 -1
  272. package/dist/molecules/NavigationMenuItem.svelte +0 -1
  273. package/dist/molecules/NavigationMenuLink.svelte +1 -1
  274. package/dist/molecules/NavigationMenuList.svelte +10 -3
  275. package/dist/molecules/NavigationMenuTrigger.svelte +2 -2
  276. package/dist/molecules/Page.svelte +32 -2
  277. package/dist/molecules/Page.svelte.d.ts +11 -0
  278. package/dist/molecules/PhotoGrid.svelte +523 -0
  279. package/dist/molecules/PhotoGrid.svelte.d.ts +73 -0
  280. package/dist/molecules/PhotoViewer.svelte +1213 -0
  281. package/dist/molecules/PhotoViewer.svelte.d.ts +74 -0
  282. package/dist/molecules/PieChart.svelte +421 -0
  283. package/dist/molecules/PieChart.svelte.d.ts +51 -0
  284. package/dist/molecules/PropsTable.svelte +22 -10
  285. package/dist/molecules/PropsTable.svelte.d.ts +3 -0
  286. package/dist/molecules/PullToRefresh.svelte +263 -0
  287. package/dist/molecules/PullToRefresh.svelte.d.ts +52 -0
  288. package/dist/molecules/RadioGroup.svelte +72 -18
  289. package/dist/molecules/RadioGroup.svelte.d.ts +19 -3
  290. package/dist/molecules/Section.svelte +1 -1
  291. package/dist/molecules/SegmentedControl.svelte +456 -0
  292. package/dist/molecules/SegmentedControl.svelte.d.ts +40 -0
  293. package/dist/molecules/SidebarBrandHeader.svelte +11 -1
  294. package/dist/molecules/SidebarBrandHeader.svelte.d.ts +3 -0
  295. package/dist/molecules/SidebarFooter.svelte +30 -7
  296. package/dist/molecules/SidebarFooter.svelte.d.ts +3 -0
  297. package/dist/molecules/SidebarNavSection.svelte +1 -1
  298. package/dist/molecules/SlideUp.svelte +220 -61
  299. package/dist/molecules/SlideUp.svelte.d.ts +26 -0
  300. package/dist/molecules/SortableList.svelte +633 -0
  301. package/dist/molecules/SortableList.svelte.d.ts +69 -0
  302. package/dist/molecules/Stepper.svelte +562 -0
  303. package/dist/molecules/Stepper.svelte.d.ts +39 -0
  304. package/dist/molecules/StickyActionBar.svelte +250 -0
  305. package/dist/molecules/StickyActionBar.svelte.d.ts +78 -0
  306. package/dist/molecules/SwipeableListItem.svelte +334 -0
  307. package/dist/molecules/SwipeableListItem.svelte.d.ts +54 -0
  308. package/dist/molecules/Tabs.svelte +310 -9
  309. package/dist/molecules/Tabs.svelte.d.ts +7 -0
  310. package/dist/molecules/Toaster.svelte +514 -5
  311. package/dist/molecules/Toaster.svelte.d.ts +153 -2
  312. package/dist/molecules/ToasterToast.svelte +495 -77
  313. package/dist/molecules/ToasterToast.svelte.d.ts +15 -0
  314. package/dist/molecules/UnsavedChangesBar.svelte +223 -0
  315. package/dist/molecules/UnsavedChangesBar.svelte.d.ts +43 -0
  316. package/dist/molecules/index.d.ts +51 -0
  317. package/dist/molecules/index.js +31 -0
  318. package/dist/molecules/toast-store.d.ts +83 -7
  319. package/dist/molecules/toast-store.js +25 -1
  320. package/dist/organisms/AppNavigation.svelte +440 -0
  321. package/dist/organisms/AppNavigation.svelte.d.ts +72 -0
  322. package/dist/organisms/AppShell.svelte +696 -0
  323. package/dist/organisms/AppShell.svelte.d.ts +157 -0
  324. package/dist/organisms/AppShellHeaderPart.svelte +163 -0
  325. package/dist/organisms/AppShellHeaderPart.svelte.d.ts +57 -0
  326. package/dist/organisms/SidebarAccountPanel.svelte +107 -12
  327. package/dist/organisms/SidebarAccountPanel.svelte.d.ts +19 -0
  328. package/dist/organisms/SidebarNavigation.svelte +111 -43
  329. package/dist/organisms/SidebarNavigation.svelte.d.ts +29 -1
  330. package/dist/organisms/SidebarPanel.svelte +34 -17
  331. package/dist/organisms/SidebarPanel.svelte.d.ts +1 -0
  332. package/dist/organisms/SidebarShell.svelte +164 -14
  333. package/dist/organisms/SidebarShell.svelte.d.ts +56 -2
  334. package/dist/organisms/TopNavbar.svelte +353 -39
  335. package/dist/organisms/TopNavbar.svelte.d.ts +47 -0
  336. package/dist/organisms/TopNavbarSheetContent.svelte +145 -0
  337. package/dist/organisms/TopNavbarSheetContent.svelte.d.ts +24 -0
  338. package/dist/organisms/index.d.ts +10 -0
  339. package/dist/organisms/index.js +7 -0
  340. package/dist/types/components.d.ts +21 -1
  341. package/dist/types/components.d.ts.map +1 -1
  342. package/dist/types/index.d.ts +1093 -26
  343. package/dist/types/index.d.ts.map +1 -1
  344. package/dist/types/variants.ts +28 -1
  345. package/dist/util/app-shell.d.ts +78 -0
  346. package/dist/util/app-shell.js +97 -0
  347. package/dist/util/avatar.d.ts +38 -0
  348. package/dist/util/avatar.js +52 -0
  349. package/dist/util/bottom-sheet.d.ts +29 -0
  350. package/dist/util/bottom-sheet.js +43 -0
  351. package/dist/util/bottom-tab-bar.d.ts +40 -0
  352. package/dist/util/bottom-tab-bar.js +54 -0
  353. package/dist/util/calendar.d.ts +55 -0
  354. package/dist/util/calendar.js +74 -0
  355. package/dist/util/chart.d.ts +139 -0
  356. package/dist/util/chart.js +305 -0
  357. package/dist/util/chip.d.ts +65 -0
  358. package/dist/util/chip.js +58 -0
  359. package/dist/util/cn.js +28 -2
  360. package/dist/util/code-field.d.ts +62 -0
  361. package/dist/util/code-field.js +112 -0
  362. package/dist/util/collapsible.d.ts +63 -0
  363. package/dist/util/collapsible.js +23 -0
  364. package/dist/util/confirm-dialog.d.ts +11 -0
  365. package/dist/util/confirm-dialog.js +2 -0
  366. package/dist/util/date.d.ts +95 -0
  367. package/dist/util/date.js +237 -0
  368. package/dist/util/display-voice.d.ts +9 -0
  369. package/dist/util/display-voice.js +9 -0
  370. package/dist/util/drawer.d.ts +12 -0
  371. package/dist/util/drawer.js +7 -0
  372. package/dist/util/dropdown.d.ts +46 -0
  373. package/dist/util/dropdown.js +21 -0
  374. package/dist/util/field-control.d.ts +29 -0
  375. package/dist/util/field-control.js +32 -0
  376. package/dist/util/field.d.ts +44 -0
  377. package/dist/util/field.js +38 -0
  378. package/dist/util/fit-in-viewport.d.ts +200 -0
  379. package/dist/util/fit-in-viewport.js +399 -0
  380. package/dist/util/focus-utils.d.ts +77 -2
  381. package/dist/util/focus-utils.js +186 -9
  382. package/dist/util/hydration.d.ts +44 -0
  383. package/dist/util/hydration.js +58 -0
  384. package/dist/util/keyboard-inset.d.ts +17 -0
  385. package/dist/util/keyboard-inset.js +53 -0
  386. package/dist/util/map-view.d.ts +143 -0
  387. package/dist/util/map-view.js +121 -0
  388. package/dist/util/media-grid.d.ts +50 -0
  389. package/dist/util/media-grid.js +81 -0
  390. package/dist/util/media.d.ts +5 -0
  391. package/dist/util/media.js +10 -0
  392. package/dist/util/overlay-chrome.d.ts +52 -0
  393. package/dist/util/overlay-chrome.js +56 -0
  394. package/dist/util/overlay.d.ts +71 -0
  395. package/dist/util/overlay.js +240 -0
  396. package/dist/util/photo.d.ts +233 -0
  397. package/dist/util/photo.js +209 -0
  398. package/dist/util/portal.d.ts +22 -0
  399. package/dist/util/portal.js +50 -0
  400. package/dist/util/progress.d.ts +18 -0
  401. package/dist/util/progress.js +17 -0
  402. package/dist/util/pull-to-refresh.d.ts +26 -0
  403. package/dist/util/pull-to-refresh.js +30 -0
  404. package/dist/util/radio-keys.d.ts +24 -0
  405. package/dist/util/radio-keys.js +49 -0
  406. package/dist/util/rating.d.ts +22 -0
  407. package/dist/util/rating.js +26 -0
  408. package/dist/util/ready-made-strings.d.ts +76 -0
  409. package/dist/util/ready-made-strings.js +67 -0
  410. package/dist/util/scroll-edge.d.ts +32 -0
  411. package/dist/util/scroll-edge.js +87 -0
  412. package/dist/util/scroll-padding.d.ts +19 -0
  413. package/dist/util/scroll-padding.js +44 -0
  414. package/dist/util/segmented-control.d.ts +15 -0
  415. package/dist/util/segmented-control.js +1 -0
  416. package/dist/util/select.d.ts +40 -0
  417. package/dist/util/select.js +63 -0
  418. package/dist/util/sheet-drag.d.ts +83 -0
  419. package/dist/util/sheet-drag.js +311 -0
  420. package/dist/util/sidebar.d.ts +62 -0
  421. package/dist/util/sidebar.js +38 -0
  422. package/dist/util/skeleton.d.ts +14 -0
  423. package/dist/util/skeleton.js +22 -0
  424. package/dist/util/sliding-indicator.d.ts +24 -0
  425. package/dist/util/sliding-indicator.js +44 -0
  426. package/dist/util/sortable-list.d.ts +64 -0
  427. package/dist/util/sortable-list.js +53 -0
  428. package/dist/util/stepper.d.ts +39 -0
  429. package/dist/util/stepper.js +38 -0
  430. package/dist/util/swipeable-list-item.d.ts +35 -0
  431. package/dist/util/swipeable-list-item.js +32 -0
  432. package/dist/util/temporal-field.d.ts +88 -0
  433. package/dist/util/temporal-field.js +136 -0
  434. package/dist/util/theme-mode.d.ts +79 -0
  435. package/dist/util/theme-mode.js +121 -0
  436. package/dist/util/toaster.d.ts +132 -0
  437. package/dist/util/toaster.js +130 -0
  438. package/dist/util/tone-surface.d.ts +33 -0
  439. package/dist/util/tone-surface.js +35 -0
  440. package/dist/util/tooltip.d.ts +9 -0
  441. package/dist/util/tooltip.js +18 -0
  442. package/dist/util/top-navbar.d.ts +34 -0
  443. package/dist/util/top-navbar.js +28 -0
  444. package/dist/util/touch-target.d.ts +30 -0
  445. package/dist/util/touch-target.js +30 -0
  446. package/dist/util/zabi-strings.d.ts +141 -0
  447. package/dist/util/zabi-strings.js +105 -0
  448. package/dist/zabi-components-colors.css +11 -2
  449. package/dist/zabi-components-theme-dark-only.css +870 -258
  450. package/dist/zabi-components-theme-dark.css +870 -258
  451. package/dist/zabi-components-theme-only.css +2419 -368
  452. package/dist/zabi-components-theme.css +2419 -368
  453. package/dist/zabi-components.css +6032 -711
  454. package/docs/lucide-icons.md +40 -17
  455. package/docs/theme-imports.md +81 -11
  456. package/package.json +45 -8
@@ -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,562 @@
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 { inSkeletonGroup } from "../util/skeleton.js";
10
+ import {
11
+ STEPPER_STRINGS,
12
+ clampStep,
13
+ normalizeSteps,
14
+ stepState,
15
+ type StepperItem,
16
+ type StepperStep,
17
+ type StepperStepState,
18
+ type StepperStrings,
19
+ } from "../util/stepper.js";
20
+
21
+ /** Other attributes (`data-*`, `id`, `aria-labelledby`, ...) land on the host element. */
22
+ type Props = Omit<HTMLAttributes<HTMLElement>, "class"> & {
23
+ /** Extra classes for the host element. */
24
+ class?: string;
25
+ /** The steps, in order: labels, or objects with a label and a description. */
26
+ steps: StepperItem[];
27
+ /**
28
+ * Index of the current step, counted from 0; supports `bind:current`.
29
+ * A value outside the steps is shown as the nearest step (below the
30
+ * first: the first; past the last: the last) and the bound value is
31
+ * left as it was given.
32
+ */
33
+ current?: number;
34
+ /** Size of the markers and the text. */
35
+ size?: SizeVariant;
36
+ /**
37
+ * `full` draws every step with its marker and label; `compact` draws
38
+ * one line of text under a segmented bar. `auto` is compact while the
39
+ * Stepper itself is narrower than 30rem, and full from there.
40
+ */
41
+ layout?: "auto" | "full" | "compact";
42
+ /**
43
+ * Makes the completed steps buttons that go back to that step. The
44
+ * current step and the ones after it are never buttons.
45
+ */
46
+ interactive?: boolean;
47
+ /** Accessible name of the navigation landmark. */
48
+ label?: string;
49
+ /** Overrides for the built-in strings. */
50
+ strings?: Partial<StepperStrings>;
51
+ /** Called with the index of the step a press went back to. Only with `interactive`. */
52
+ onstepchange?: (index: number) => void;
53
+ };
54
+
55
+ let {
56
+ class: className = "",
57
+ steps,
58
+ current = $bindable<Exclude<Props["current"], undefined>>(),
59
+ size = "md",
60
+ layout = "auto",
61
+ interactive = false,
62
+ label = "Progress",
63
+ strings,
64
+ onstepchange,
65
+ ...restProps
66
+ }: Props = $props();
67
+
68
+ // No fallback on a bindable prop: Svelte refuses `bind:…={undefined}` on
69
+ // one that has a fallback (`props_invalid_value`), and a page that throws
70
+ // while it hydrates never becomes interactive. The default is applied
71
+ // here instead: at once, for the server and the first render, and again
72
+ // whenever a parent hands back `undefined`.
73
+ const applyDefaults = () => {
74
+ if (current === undefined) current = 0;
75
+ };
76
+ applyDefaults();
77
+ $effect.pre(applyDefaults);
78
+
79
+ /** The app-wide words for this component, from a `ZabiStringsProvider` above it, if there is one. */
80
+ const provided = zabiStringsFor("stepper");
81
+ const text = $derived(mergeStrings(STEPPER_STRINGS, provided(), strings));
82
+ const items = $derived(normalizeSteps(steps));
83
+ /** The step shown as current: `current` held within the steps. */
84
+ const shown = $derived(clampStep(current, items.length));
85
+ const currentStep = $derived(items[shown]);
86
+
87
+ /** What a step is drawn in: a button while it can be pressed, a span otherwise. */
88
+ const bodies: (HTMLElement | undefined)[] = $state([]);
89
+
90
+ /**
91
+ * Only a completed step is a button, so the press is never on the current
92
+ * one and a repeat press has nothing to clear. The button turns into the
93
+ * current step's plain text as it is pressed; focus is put on that text,
94
+ * so it is not dropped onto the page.
95
+ */
96
+ async function go(index: number) {
97
+ if (index >= shown) return;
98
+ current = index;
99
+ onstepchange?.(index);
100
+ await tick();
101
+ bodies[index]?.focus();
102
+ }
103
+
104
+ /** Inside a `SkeletonGroup` the group is the one status; a second one in it would be a live region in a live region. */
105
+ const inGroup = inSkeletonGroup();
106
+
107
+ /** Read out once when the current step changes, and never for the first render. */
108
+ let announced = $state("");
109
+ let previous: number | undefined;
110
+
111
+ $effect(() => {
112
+ const index = shown;
113
+ if (previous === undefined || index === previous || index < 0) {
114
+ previous = index;
115
+ return;
116
+ }
117
+ previous = index;
118
+ announced = untrack(() =>
119
+ text.announcement(index + 1, items.length, items[index].label),
120
+ );
121
+ // Taken away again, so the list stays the one place the steps are read from.
122
+ const timer = setTimeout(() => (announced = ""), 3000);
123
+ return () => clearTimeout(timer);
124
+ });
125
+ </script>
126
+
127
+ {#snippet content(step: StepperStep, index: number, state: StepperStepState)}
128
+ <span class="stepper-marker" aria-hidden="true">
129
+ {#if state === "completed"}
130
+ <Check />
131
+ {:else}
132
+ <span class="stepper-number">{index + 1}</span>
133
+ {/if}
134
+ </span>
135
+ <span class="stepper-text">
136
+ <!-- One sentence with the number, the label and the state, so a
137
+ translation can order them; the visible label is a repeat of it. -->
138
+ <span class="sr-only">{text.stepLabel(index + 1, items.length, step.label, state)}</span>
139
+ <span class="stepper-label" aria-hidden="true">{step.label}</span>
140
+ {#if step.description}
141
+ <span class="stepper-description">{step.description}</span>
142
+ {/if}
143
+ </span>
144
+ {/snippet}
145
+
146
+ {#if items.length > 0}
147
+ <nav
148
+ class={cn("stepper", className)}
149
+ data-stepper
150
+ data-size={size}
151
+ data-layout={layout}
152
+ data-interactive={interactive ? "" : undefined}
153
+ aria-label={restProps["aria-labelledby"] ? undefined : label}
154
+ {...restProps}
155
+ >
156
+ <div class="stepper-frame">
157
+ <!-- The one list, in both layouts: the compact layout draws its
158
+ markers as the segments of a bar and clips the text, so a screen
159
+ reader reads the same steps either way. `role`, because a list
160
+ without bullets loses its role in Safari. -->
161
+ <ol class="stepper-list" role="list">
162
+ {#each items as step, index (index)}
163
+ {@const state = stepState(index, shown)}
164
+ <li
165
+ class="stepper-step"
166
+ data-state={state}
167
+ aria-current={state === "current" ? "step" : undefined}
168
+ >
169
+ {#if interactive && state === "completed"}
170
+ <button
171
+ bind:this={bodies[index]}
172
+ type="button"
173
+ class="stepper-body focus-ring"
174
+ onclick={() => go(index)}
175
+ >
176
+ {@render content(step, index, state)}
177
+ </button>
178
+ {:else}
179
+ <!-- Never a Tab stop: -1, so that a step can take
180
+ focus from the button that was pressed to reach it. -->
181
+ <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
182
+ <span
183
+ bind:this={bodies[index]}
184
+ class="stepper-body focus-ring"
185
+ tabindex={interactive ? -1 : undefined}
186
+ >
187
+ {@render content(step, index, state)}
188
+ </span>
189
+ {/if}
190
+ {#if index < items.length - 1}
191
+ <span class="stepper-connector" aria-hidden="true"></span>
192
+ {/if}
193
+ </li>
194
+ {/each}
195
+ </ol>
196
+ <!-- What the compact layout shows instead of the labels. Not in
197
+ the layout at all in the full one, and never read: the list says it. -->
198
+ <div class="stepper-summary" aria-hidden="true" data-stepper-summary>
199
+ <p class="stepper-summary-line">
200
+ <span>{text.position(shown + 1, items.length)}</span>
201
+ <span>—</span>
202
+ <span class="stepper-summary-label">{currentStep.label}</span>
203
+ </p>
204
+ {#if currentStep.description}
205
+ <p class="stepper-summary-description">{currentStep.description}</p>
206
+ {/if}
207
+ </div>
208
+ </div>
209
+ {#if !inGroup}
210
+ <span class="sr-only" role="status" data-stepper-status>{announced}</span>
211
+ {/if}
212
+ </nav>
213
+ {/if}
214
+
215
+ <style>
216
+ /*
217
+ * One list, two drawings. The full layout is the default; the compact one
218
+ * is a set of values on `.stepper-frame`, switched on by `layout="compact"`
219
+ * or, for `auto`, by the width of the Stepper itself. The rules below read
220
+ * those values, so the two ways in cannot drift apart: `COMPACT` appears
221
+ * twice and must be the same list both times.
222
+ */
223
+ .stepper {
224
+ container-type: inline-size;
225
+ /*
226
+ * A size container has no width of its own: as an item of a flex row,
227
+ * or centred in a column or a grid, it would be 0px wide and nothing
228
+ * of it would show. So it asks for the width at which the full layout
229
+ * begins, and gives way to what there is: narrower than that, it is
230
+ * as wide as the room it gets and compact.
231
+ */
232
+ contain-intrinsic-inline-size: 30rem;
233
+ min-inline-size: 0;
234
+ --zabi-stepper-marker: 2rem;
235
+ --zabi-stepper-bar: 8px;
236
+ --zabi-stepper-leading: 1.25rem;
237
+ /* The least height of a step that can be pressed. */
238
+ --zabi-stepper-min-row: 0px;
239
+ font-size: 0.875rem;
240
+ line-height: var(--zabi-stepper-leading);
241
+ }
242
+
243
+ .stepper[data-size="sm"] {
244
+ --zabi-stepper-marker: 1.5rem;
245
+ --zabi-stepper-bar: 6px;
246
+ --zabi-stepper-leading: 1rem;
247
+ font-size: 0.75rem;
248
+ }
249
+
250
+ .stepper[data-size="lg"] {
251
+ --zabi-stepper-marker: 2.5rem;
252
+ --zabi-stepper-bar: 10px;
253
+ --zabi-stepper-leading: 1.5rem;
254
+ font-size: 1rem;
255
+ }
256
+
257
+ .stepper[data-interactive] {
258
+ --zabi-stepper-min-row: 24px;
259
+ }
260
+
261
+ /* A finger is the same size whatever the text size is, so the target is in px. */
262
+ @media (pointer: coarse) {
263
+ .stepper[data-interactive] {
264
+ --zabi-stepper-min-row: 44px;
265
+ }
266
+ }
267
+
268
+ .stepper-frame {
269
+ --zabi-stepper-row: max(var(--zabi-stepper-min-row), var(--zabi-stepper-marker));
270
+ --zabi-stepper-gap: 0px;
271
+ --zabi-stepper-step-flex: 1 1 auto;
272
+ --zabi-stepper-last-flex: 0 1 auto;
273
+ --zabi-stepper-body-size: auto;
274
+ --zabi-stepper-body-least: var(--zabi-stepper-min-row);
275
+ --zabi-stepper-marker-inline: var(--zabi-stepper-marker);
276
+ --zabi-stepper-marker-block: var(--zabi-stepper-marker);
277
+ --zabi-stepper-marker-edge: 2px;
278
+ --zabi-stepper-current-gap: 2px;
279
+ --zabi-stepper-glyph: flex;
280
+ --zabi-stepper-connector: block;
281
+ --zabi-stepper-summary: none;
282
+ --zabi-stepper-text-position: static;
283
+ --zabi-stepper-text-size: auto;
284
+ --zabi-stepper-text-overflow: visible;
285
+ --zabi-stepper-text-clip: none;
286
+ --zabi-stepper-text-space: normal;
287
+ }
288
+
289
+ /* COMPACT */
290
+ .stepper[data-layout="compact"] .stepper-frame {
291
+ --zabi-stepper-row: max(var(--zabi-stepper-min-row), var(--zabi-stepper-bar));
292
+ --zabi-stepper-gap: 4px;
293
+ --zabi-stepper-step-flex: 1 1 0;
294
+ --zabi-stepper-last-flex: 1 1 0;
295
+ --zabi-stepper-body-size: 100%;
296
+ --zabi-stepper-body-least: 0px;
297
+ --zabi-stepper-marker-inline: 100%;
298
+ --zabi-stepper-marker-block: var(--zabi-stepper-bar);
299
+ --zabi-stepper-marker-edge: 1px;
300
+ --zabi-stepper-current-gap: 0px;
301
+ --zabi-stepper-glyph: none;
302
+ --zabi-stepper-connector: none;
303
+ --zabi-stepper-summary: block;
304
+ --zabi-stepper-text-position: absolute;
305
+ --zabi-stepper-text-size: 1px;
306
+ --zabi-stepper-text-overflow: hidden;
307
+ --zabi-stepper-text-clip: inset(50%);
308
+ --zabi-stepper-text-space: nowrap;
309
+ }
310
+
311
+ /* COMPACT, again: in rem, so enlarged text goes compact sooner. */
312
+ @container (width < 30rem) {
313
+ .stepper[data-layout="auto"] .stepper-frame {
314
+ --zabi-stepper-row: max(var(--zabi-stepper-min-row), var(--zabi-stepper-bar));
315
+ --zabi-stepper-gap: 4px;
316
+ --zabi-stepper-step-flex: 1 1 0;
317
+ --zabi-stepper-last-flex: 1 1 0;
318
+ --zabi-stepper-body-size: 100%;
319
+ --zabi-stepper-body-least: 0px;
320
+ --zabi-stepper-marker-inline: 100%;
321
+ --zabi-stepper-marker-block: var(--zabi-stepper-bar);
322
+ --zabi-stepper-marker-edge: 1px;
323
+ --zabi-stepper-current-gap: 0px;
324
+ --zabi-stepper-glyph: none;
325
+ --zabi-stepper-connector: none;
326
+ --zabi-stepper-summary: block;
327
+ --zabi-stepper-text-position: absolute;
328
+ --zabi-stepper-text-size: 1px;
329
+ --zabi-stepper-text-overflow: hidden;
330
+ --zabi-stepper-text-clip: inset(50%);
331
+ --zabi-stepper-text-space: nowrap;
332
+ }
333
+ }
334
+
335
+ .stepper-list {
336
+ display: flex;
337
+ align-items: flex-start;
338
+ gap: var(--zabi-stepper-gap);
339
+ margin: 0;
340
+ padding: 0;
341
+ list-style: none;
342
+ }
343
+
344
+ .stepper-step {
345
+ position: relative;
346
+ display: flex;
347
+ flex: var(--zabi-stepper-step-flex);
348
+ align-items: flex-start;
349
+ min-width: 0;
350
+ }
351
+
352
+ .stepper-step:last-child {
353
+ flex: var(--zabi-stepper-last-flex);
354
+ }
355
+
356
+ .stepper-body {
357
+ display: flex;
358
+ align-items: flex-start;
359
+ /* Between a marker and its label; not a distance that should grow with the text. */
360
+ gap: 8px;
361
+ width: var(--zabi-stepper-body-size);
362
+ min-width: 0;
363
+ min-height: var(--zabi-stepper-row);
364
+ margin: 0;
365
+ padding: 0;
366
+ border: 0;
367
+ /* A pill, as the marker in it is: the focus ring follows it. */
368
+ border-radius: 9999px;
369
+ background: none;
370
+ color: inherit;
371
+ font: inherit;
372
+ text-align: start;
373
+ }
374
+
375
+ /* A segment of the bar is as wide as its share of the bar, and no wider:
376
+ a least width there would lay the segments over each other. */
377
+ button.stepper-body {
378
+ min-width: var(--zabi-stepper-body-least);
379
+ cursor: pointer;
380
+ -webkit-tap-highlight-color: transparent;
381
+ }
382
+
383
+ /*
384
+ * Completed and current are filled in the brand colour, upcoming is the
385
+ * lighter track: a difference of shape too. Completed has a check where the others have their number, and
386
+ * the current one stands inside a ring of its own.
387
+ */
388
+ .stepper-marker {
389
+ display: flex;
390
+ flex: none;
391
+ align-items: center;
392
+ justify-content: center;
393
+ box-sizing: border-box;
394
+ width: var(--zabi-stepper-marker-inline);
395
+ height: var(--zabi-stepper-marker-block);
396
+ margin-block: calc((var(--zabi-stepper-row) - var(--zabi-stepper-marker-block)) / 2);
397
+ /* `--zabi-stepper-fill` is what a hovered or pressed step changes. */
398
+ border: var(--zabi-stepper-marker-edge) solid
399
+ var(--zabi-stepper-fill, var(--color-action-primary));
400
+ border-radius: 9999px;
401
+ background-color: var(--zabi-stepper-fill, var(--color-action-primary));
402
+ color: var(--color-on-brand);
403
+ font-weight: 600;
404
+ font-variant-numeric: tabular-nums;
405
+ line-height: 1;
406
+ transition:
407
+ background-color 150ms,
408
+ border-color 150ms,
409
+ transform 150ms;
410
+ }
411
+
412
+ .stepper-marker > :global(*) {
413
+ display: var(--zabi-stepper-glyph);
414
+ }
415
+
416
+ .stepper-marker > :global(svg) {
417
+ width: 60%;
418
+ height: 60%;
419
+ stroke-width: 3;
420
+ }
421
+
422
+ /* The ring: the fill stops 2px short of the edge, and the surface shows between. */
423
+ .stepper-step[data-state="current"] .stepper-marker {
424
+ padding: var(--zabi-stepper-current-gap);
425
+ background-clip: content-box;
426
+ }
427
+
428
+ /*
429
+ * An upcoming marker is the progress track: a filled pill in the bar
430
+ * layout, with the track's own edge. An app that themes the progress
431
+ * track (an edgeless one that reaches 3:1 on its own) gets the same here.
432
+ * `--zabi-stepper-upcoming-fill` and `--zabi-stepper-upcoming-edge` are
433
+ * declared nowhere, so any ancestor can set them. The 8.1 look, a hollow
434
+ * outline, is
435
+ * `--zabi-stepper-upcoming-fill: transparent;
436
+ * --zabi-stepper-upcoming-edge: var(--color-control-border);`
437
+ */
438
+ .stepper-step[data-state="upcoming"] .stepper-marker {
439
+ border-color: var(--zabi-stepper-upcoming-edge, var(--color-progress-track-border));
440
+ background-color: var(--zabi-stepper-upcoming-fill, var(--color-progress-track));
441
+ color: var(--color-description);
442
+ }
443
+
444
+ .stepper-text {
445
+ position: var(--zabi-stepper-text-position);
446
+ display: flex;
447
+ flex-direction: column;
448
+ width: var(--zabi-stepper-text-size);
449
+ height: var(--zabi-stepper-text-size);
450
+ min-width: 0;
451
+ overflow: var(--zabi-stepper-text-overflow);
452
+ clip-path: var(--zabi-stepper-text-clip);
453
+ white-space: var(--zabi-stepper-text-space);
454
+ padding-block: calc((var(--zabi-stepper-row) - var(--zabi-stepper-leading)) / 2);
455
+ overflow-wrap: anywhere;
456
+ }
457
+
458
+ .stepper-label {
459
+ color: var(--color-body);
460
+ }
461
+
462
+ .stepper-step[data-state="current"] .stepper-label {
463
+ font-weight: 600;
464
+ }
465
+
466
+ .stepper-step[data-state="upcoming"] .stepper-label {
467
+ color: var(--color-description);
468
+ }
469
+
470
+ .stepper-description,
471
+ .stepper-summary-description {
472
+ color: var(--color-description);
473
+ font-size: 0.75rem;
474
+ line-height: 1rem;
475
+ }
476
+
477
+ /* Solid up to the current step and dashed after it: not by colour alone. */
478
+ .stepper-connector {
479
+ display: var(--zabi-stepper-connector);
480
+ flex: 1 1 1rem;
481
+ min-width: 1rem;
482
+ margin-inline: 8px;
483
+ margin-block-start: calc(var(--zabi-stepper-row) / 2 - 1px);
484
+ border-block-start: 2px dashed var(--color-control-border);
485
+ transition: border-color 150ms;
486
+ }
487
+
488
+ .stepper-step[data-state="completed"] > .stepper-connector {
489
+ border-block-start: 2px solid var(--color-action-primary);
490
+ }
491
+
492
+ .stepper-summary {
493
+ display: var(--zabi-stepper-summary);
494
+ margin-block-start: 8px;
495
+ color: var(--color-description);
496
+ overflow-wrap: anywhere;
497
+ }
498
+
499
+ .stepper-summary-line {
500
+ margin: 0;
501
+ }
502
+
503
+ .stepper-summary-label {
504
+ color: var(--color-body);
505
+ font-weight: 600;
506
+ }
507
+
508
+ .stepper-summary-description {
509
+ margin: 2px 0 0;
510
+ }
511
+
512
+ @media (hover: hover) {
513
+ button.stepper-body:hover {
514
+ --zabi-stepper-fill: var(--color-action-primary-hover);
515
+ }
516
+
517
+ button.stepper-body:hover .stepper-label {
518
+ text-decoration: underline;
519
+ }
520
+ }
521
+
522
+ /* Pressed, on every pointer. */
523
+ button.stepper-body:active {
524
+ --zabi-stepper-fill: var(--color-action-primary-active);
525
+ }
526
+
527
+ button.stepper-body:active .stepper-marker {
528
+ transform: scale(0.92);
529
+ }
530
+
531
+ /*
532
+ * Forced colours take every background away. The filled markers are put
533
+ * back in the system's own pair, so filled still differs from outlined;
534
+ * the connectors are borders, which are kept, solid and dashed. A hovered
535
+ * or pressed step changes `--zabi-stepper-fill`, which is not read here.
536
+ */
537
+ @media (forced-colors: active) {
538
+ .stepper-marker {
539
+ forced-color-adjust: none;
540
+ border-color: Highlight;
541
+ background-color: Highlight;
542
+ color: HighlightText;
543
+ }
544
+
545
+ .stepper-step[data-state="upcoming"] .stepper-marker {
546
+ border-color: CanvasText;
547
+ background-color: Canvas;
548
+ color: CanvasText;
549
+ }
550
+ }
551
+
552
+ @media (prefers-reduced-motion: reduce) {
553
+ .stepper-marker,
554
+ .stepper-connector {
555
+ transition: none;
556
+ }
557
+
558
+ button.stepper-body:active .stepper-marker {
559
+ transform: none;
560
+ }
561
+ }
562
+ </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;