zabi-components 8.0.0 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (456) hide show
  1. package/CHANGELOG.md +2935 -0
  2. package/README.md +243 -10
  3. package/THEME.md +162 -332
  4. package/THEMING.md +1419 -259
  5. package/dist/atoms/ActionPanel.svelte +15 -5
  6. package/dist/atoms/Avatar.svelte +120 -0
  7. package/dist/atoms/Avatar.svelte.d.ts +46 -0
  8. package/dist/atoms/Badge.svelte +71 -13
  9. package/dist/atoms/Badge.svelte.d.ts +8 -2
  10. package/dist/atoms/Block.svelte +74 -0
  11. package/dist/atoms/Block.svelte.d.ts +29 -0
  12. package/dist/atoms/Button.svelte +217 -30
  13. package/dist/atoms/Button.svelte.d.ts +33 -4
  14. package/dist/atoms/Card.svelte +182 -26
  15. package/dist/atoms/Card.svelte.d.ts +55 -3
  16. package/dist/atoms/CardHeader.svelte +16 -4
  17. package/dist/atoms/Checkbox.svelte +81 -21
  18. package/dist/atoms/Checkbox.svelte.d.ts +31 -2
  19. package/dist/atoms/Chip.svelte +351 -0
  20. package/dist/atoms/Chip.svelte.d.ts +57 -0
  21. package/dist/atoms/CodeBlock.svelte +20 -2
  22. package/dist/atoms/CodeBlock.svelte.d.ts +4 -0
  23. package/dist/atoms/CodeField.svelte +385 -0
  24. package/dist/atoms/CodeField.svelte.d.ts +61 -0
  25. package/dist/atoms/ColorPicker.svelte +260 -49
  26. package/dist/atoms/ColorPicker.svelte.d.ts +3 -0
  27. package/dist/atoms/Container.svelte +16 -8
  28. package/dist/atoms/DateField.svelte +145 -0
  29. package/dist/atoms/DateField.svelte.d.ts +81 -0
  30. package/dist/atoms/FieldMessages.svelte +69 -0
  31. package/dist/atoms/FieldMessages.svelte.d.ts +23 -0
  32. package/dist/atoms/FloatingActionButton.svelte +176 -0
  33. package/dist/atoms/FloatingActionButton.svelte.d.ts +51 -0
  34. package/dist/atoms/Heading.svelte +63 -5
  35. package/dist/atoms/Heading.svelte.d.ts +14 -0
  36. package/dist/atoms/IconButton.svelte +294 -26
  37. package/dist/atoms/IconButton.svelte.d.ts +62 -4
  38. package/dist/atoms/Input.svelte +259 -53
  39. package/dist/atoms/Input.svelte.d.ts +33 -2
  40. package/dist/atoms/List.svelte +5 -1
  41. package/dist/atoms/ListItem.svelte +70 -13
  42. package/dist/atoms/ListItem.svelte.d.ts +11 -0
  43. package/dist/atoms/PickerField.svelte +239 -0
  44. package/dist/atoms/PickerField.svelte.d.ts +67 -0
  45. package/dist/atoms/Progress.svelte +99 -19
  46. package/dist/atoms/Progress.svelte.d.ts +15 -1
  47. package/dist/atoms/Radio.svelte +51 -3
  48. package/dist/atoms/Radio.svelte.d.ts +30 -2
  49. package/dist/atoms/Rating.svelte +620 -0
  50. package/dist/atoms/Rating.svelte.d.ts +77 -0
  51. package/dist/atoms/Select.svelte +438 -98
  52. package/dist/atoms/Select.svelte.d.ts +61 -3
  53. package/dist/atoms/SelectionControl.svelte +193 -23
  54. package/dist/atoms/SelectionControl.svelte.d.ts +29 -3
  55. package/dist/atoms/Skeleton.svelte +114 -18
  56. package/dist/atoms/Skeleton.svelte.d.ts +30 -3
  57. package/dist/atoms/SkeletonGroup.svelte +43 -0
  58. package/dist/atoms/SkeletonGroup.svelte.d.ts +20 -0
  59. package/dist/atoms/Slider.svelte +344 -0
  60. package/dist/atoms/Slider.svelte.d.ts +40 -0
  61. package/dist/atoms/Sparkline.svelte +109 -0
  62. package/dist/atoms/Sparkline.svelte.d.ts +27 -0
  63. package/dist/atoms/SpeechBubble.svelte +187 -0
  64. package/dist/atoms/SpeechBubble.svelte.d.ts +33 -0
  65. package/dist/atoms/Spinner.svelte +57 -0
  66. package/dist/atoms/Spinner.svelte.d.ts +19 -0
  67. package/dist/atoms/Stat.svelte +72 -0
  68. package/dist/atoms/Stat.svelte.d.ts +19 -0
  69. package/dist/atoms/Table.svelte +151 -6
  70. package/dist/atoms/Table.svelte.d.ts +15 -3
  71. package/dist/atoms/TemporalField.svelte +472 -0
  72. package/dist/atoms/TemporalField.svelte.d.ts +48 -0
  73. package/dist/atoms/Text.svelte +23 -11
  74. package/dist/atoms/Text.svelte.d.ts +6 -3
  75. package/dist/atoms/Textarea.svelte +150 -44
  76. package/dist/atoms/Textarea.svelte.d.ts +35 -2
  77. package/dist/atoms/ThemeToggle.svelte +223 -44
  78. package/dist/atoms/ThemeToggle.svelte.d.ts +26 -3
  79. package/dist/atoms/TimeColumn.svelte +150 -0
  80. package/dist/atoms/TimeColumn.svelte.d.ts +25 -0
  81. package/dist/atoms/TimeField.svelte +151 -0
  82. package/dist/atoms/TimeField.svelte.d.ts +85 -0
  83. package/dist/atoms/Toast.svelte +22 -8
  84. package/dist/atoms/Toast.svelte.d.ts +2 -0
  85. package/dist/atoms/Toggle.svelte +98 -14
  86. package/dist/atoms/Toggle.svelte.d.ts +26 -2
  87. package/dist/atoms/Tooltip.svelte +528 -24
  88. package/dist/atoms/Tooltip.svelte.d.ts +18 -0
  89. package/dist/atoms/ZabiStringsProvider.svelte +45 -0
  90. package/dist/atoms/ZabiStringsProvider.svelte.d.ts +27 -0
  91. package/dist/atoms/index.d.ts +38 -0
  92. package/dist/atoms/index.js +29 -0
  93. package/dist/atoms/selection-control.styles.d.ts +47 -5
  94. package/dist/atoms/selection-control.styles.js +52 -10
  95. package/dist/components/atoms/index.d.ts +38 -0
  96. package/dist/components/atoms/index.d.ts.map +1 -1
  97. package/dist/components/atoms/selection-control.styles.d.ts +47 -5
  98. package/dist/components/atoms/selection-control.styles.d.ts.map +1 -1
  99. package/dist/components/index.d.ts +104 -2
  100. package/dist/components/index.d.ts.map +1 -1
  101. package/dist/components/map.d.ts +11 -0
  102. package/dist/components/map.d.ts.map +1 -0
  103. package/dist/components/molecules/index.d.ts +51 -0
  104. package/dist/components/molecules/index.d.ts.map +1 -1
  105. package/dist/components/molecules/toast-store.d.ts +83 -7
  106. package/dist/components/molecules/toast-store.d.ts.map +1 -1
  107. package/dist/components/organisms/index.d.ts +10 -0
  108. package/dist/components/organisms/index.d.ts.map +1 -1
  109. package/dist/components/types/variants.d.ts +24 -1
  110. package/dist/components/types/variants.d.ts.map +1 -1
  111. package/dist/components/util/app-shell.d.ts +79 -0
  112. package/dist/components/util/app-shell.d.ts.map +1 -0
  113. package/dist/components/util/avatar.d.ts +39 -0
  114. package/dist/components/util/avatar.d.ts.map +1 -0
  115. package/dist/components/util/bottom-sheet.d.ts +30 -0
  116. package/dist/components/util/bottom-sheet.d.ts.map +1 -0
  117. package/dist/components/util/bottom-tab-bar.d.ts +41 -0
  118. package/dist/components/util/bottom-tab-bar.d.ts.map +1 -0
  119. package/dist/components/util/calendar.d.ts +56 -0
  120. package/dist/components/util/calendar.d.ts.map +1 -0
  121. package/dist/components/util/chart.d.ts +140 -0
  122. package/dist/components/util/chart.d.ts.map +1 -0
  123. package/dist/components/util/chip.d.ts +66 -0
  124. package/dist/components/util/chip.d.ts.map +1 -0
  125. package/dist/components/util/cn.d.ts.map +1 -1
  126. package/dist/components/util/code-field.d.ts +63 -0
  127. package/dist/components/util/code-field.d.ts.map +1 -0
  128. package/dist/components/util/collapsible.d.ts +64 -0
  129. package/dist/components/util/collapsible.d.ts.map +1 -0
  130. package/dist/components/util/confirm-dialog.d.ts +12 -0
  131. package/dist/components/util/confirm-dialog.d.ts.map +1 -0
  132. package/dist/components/util/date.d.ts +96 -0
  133. package/dist/components/util/date.d.ts.map +1 -0
  134. package/dist/components/util/display-voice.d.ts +10 -0
  135. package/dist/components/util/display-voice.d.ts.map +1 -0
  136. package/dist/components/util/drawer.d.ts +13 -0
  137. package/dist/components/util/drawer.d.ts.map +1 -0
  138. package/dist/components/util/dropdown.d.ts +47 -0
  139. package/dist/components/util/dropdown.d.ts.map +1 -0
  140. package/dist/components/util/field-control.d.ts +30 -0
  141. package/dist/components/util/field-control.d.ts.map +1 -0
  142. package/dist/components/util/field.d.ts +45 -0
  143. package/dist/components/util/field.d.ts.map +1 -0
  144. package/dist/components/util/fit-in-viewport.d.ts +201 -0
  145. package/dist/components/util/fit-in-viewport.d.ts.map +1 -0
  146. package/dist/components/util/focus-utils.d.ts +77 -2
  147. package/dist/components/util/focus-utils.d.ts.map +1 -1
  148. package/dist/components/util/hydration.d.ts +45 -0
  149. package/dist/components/util/hydration.d.ts.map +1 -0
  150. package/dist/components/util/keyboard-inset.d.ts +18 -0
  151. package/dist/components/util/keyboard-inset.d.ts.map +1 -0
  152. package/dist/components/util/map-view.d.ts +144 -0
  153. package/dist/components/util/map-view.d.ts.map +1 -0
  154. package/dist/components/util/media-grid.d.ts +51 -0
  155. package/dist/components/util/media-grid.d.ts.map +1 -0
  156. package/dist/components/util/media.d.ts +6 -0
  157. package/dist/components/util/media.d.ts.map +1 -0
  158. package/dist/components/util/overlay-chrome.d.ts +53 -0
  159. package/dist/components/util/overlay-chrome.d.ts.map +1 -0
  160. package/dist/components/util/overlay.d.ts +72 -0
  161. package/dist/components/util/overlay.d.ts.map +1 -0
  162. package/dist/components/util/photo.d.ts +234 -0
  163. package/dist/components/util/photo.d.ts.map +1 -0
  164. package/dist/components/util/portal.d.ts +23 -0
  165. package/dist/components/util/portal.d.ts.map +1 -0
  166. package/dist/components/util/progress.d.ts +19 -0
  167. package/dist/components/util/progress.d.ts.map +1 -0
  168. package/dist/components/util/pull-to-refresh.d.ts +27 -0
  169. package/dist/components/util/pull-to-refresh.d.ts.map +1 -0
  170. package/dist/components/util/radio-keys.d.ts +25 -0
  171. package/dist/components/util/radio-keys.d.ts.map +1 -0
  172. package/dist/components/util/rating.d.ts +23 -0
  173. package/dist/components/util/rating.d.ts.map +1 -0
  174. package/dist/components/util/ready-made-strings.d.ts +77 -0
  175. package/dist/components/util/ready-made-strings.d.ts.map +1 -0
  176. package/dist/components/util/scroll-edge.d.ts +33 -0
  177. package/dist/components/util/scroll-edge.d.ts.map +1 -0
  178. package/dist/components/util/scroll-padding.d.ts +20 -0
  179. package/dist/components/util/scroll-padding.d.ts.map +1 -0
  180. package/dist/components/util/segmented-control.d.ts +16 -0
  181. package/dist/components/util/segmented-control.d.ts.map +1 -0
  182. package/dist/components/util/select.d.ts +41 -0
  183. package/dist/components/util/select.d.ts.map +1 -0
  184. package/dist/components/util/sheet-drag.d.ts +84 -0
  185. package/dist/components/util/sheet-drag.d.ts.map +1 -0
  186. package/dist/components/util/sidebar.d.ts +63 -0
  187. package/dist/components/util/sidebar.d.ts.map +1 -0
  188. package/dist/components/util/skeleton.d.ts +15 -0
  189. package/dist/components/util/skeleton.d.ts.map +1 -0
  190. package/dist/components/util/sliding-indicator.d.ts +25 -0
  191. package/dist/components/util/sliding-indicator.d.ts.map +1 -0
  192. package/dist/components/util/sortable-list.d.ts +65 -0
  193. package/dist/components/util/sortable-list.d.ts.map +1 -0
  194. package/dist/components/util/stepper.d.ts +40 -0
  195. package/dist/components/util/stepper.d.ts.map +1 -0
  196. package/dist/components/util/swipeable-list-item.d.ts +36 -0
  197. package/dist/components/util/swipeable-list-item.d.ts.map +1 -0
  198. package/dist/components/util/temporal-field.d.ts +89 -0
  199. package/dist/components/util/temporal-field.d.ts.map +1 -0
  200. package/dist/components/util/theme-mode.d.ts +80 -0
  201. package/dist/components/util/theme-mode.d.ts.map +1 -0
  202. package/dist/components/util/toaster.d.ts +133 -0
  203. package/dist/components/util/toaster.d.ts.map +1 -0
  204. package/dist/components/util/tone-surface.d.ts +34 -0
  205. package/dist/components/util/tone-surface.d.ts.map +1 -0
  206. package/dist/components/util/tooltip.d.ts +10 -0
  207. package/dist/components/util/tooltip.d.ts.map +1 -0
  208. package/dist/components/util/top-navbar.d.ts +35 -0
  209. package/dist/components/util/top-navbar.d.ts.map +1 -0
  210. package/dist/components/util/touch-target.d.ts +31 -0
  211. package/dist/components/util/touch-target.d.ts.map +1 -0
  212. package/dist/components/util/zabi-strings.d.ts +142 -0
  213. package/dist/components/util/zabi-strings.d.ts.map +1 -0
  214. package/dist/create-theme/cli.js +173 -0
  215. package/dist/create-theme/index.d.ts +190 -0
  216. package/dist/create-theme/index.js +1034 -0
  217. package/dist/create-theme/lib/ramp-math.js +128 -0
  218. package/dist/create-theme/lib/resolve.js +238 -0
  219. package/dist/create-theme/theme-data.js +2644 -0
  220. package/dist/index.d.ts +104 -2
  221. package/dist/index.js +75 -2
  222. package/dist/map.d.ts +10 -0
  223. package/dist/map.js +9 -0
  224. package/dist/molecules/Alert.svelte +63 -16
  225. package/dist/molecules/Alert.svelte.d.ts +14 -1
  226. package/dist/molecules/AppBar.svelte +674 -0
  227. package/dist/molecules/AppBar.svelte.d.ts +131 -0
  228. package/dist/molecules/AvatarGroup.svelte +116 -0
  229. package/dist/molecules/AvatarGroup.svelte.d.ts +40 -0
  230. package/dist/molecules/BarChart.svelte +381 -0
  231. package/dist/molecules/BarChart.svelte.d.ts +45 -0
  232. package/dist/molecules/BottomSheet.svelte +608 -0
  233. package/dist/molecules/BottomSheet.svelte.d.ts +109 -0
  234. package/dist/molecules/BottomTabBar.svelte +403 -0
  235. package/dist/molecules/BottomTabBar.svelte.d.ts +98 -0
  236. package/dist/molecules/Calendar.svelte +597 -0
  237. package/dist/molecules/Calendar.svelte.d.ts +72 -0
  238. package/dist/molecules/ChipGroup.svelte +325 -0
  239. package/dist/molecules/ChipGroup.svelte.d.ts +41 -0
  240. package/dist/molecules/Collapsible.svelte +347 -0
  241. package/dist/molecules/Collapsible.svelte.d.ts +61 -0
  242. package/dist/molecules/CollapsibleGroup.svelte +136 -0
  243. package/dist/molecules/CollapsibleGroup.svelte.d.ts +14 -0
  244. package/dist/molecules/ComponentDemo.svelte +16 -4
  245. package/dist/molecules/ComponentDemo.svelte.d.ts +3 -0
  246. package/dist/molecules/ConfirmDialog.svelte +257 -0
  247. package/dist/molecules/ConfirmDialog.svelte.d.ts +58 -0
  248. package/dist/molecules/ContactForm.svelte +34 -17
  249. package/dist/molecules/ContactForm.svelte.d.ts +8 -0
  250. package/dist/molecules/Drawer.svelte +415 -0
  251. package/dist/molecules/Drawer.svelte.d.ts +55 -0
  252. package/dist/molecules/Dropdown.svelte +517 -48
  253. package/dist/molecules/Dropdown.svelte.d.ts +47 -6
  254. package/dist/molecules/DropdownItem.svelte +122 -0
  255. package/dist/molecules/DropdownItem.svelte.d.ts +28 -0
  256. package/dist/molecules/EmptyState.svelte +55 -10
  257. package/dist/molecules/EmptyState.svelte.d.ts +8 -0
  258. package/dist/molecules/FormField.svelte +9 -1
  259. package/dist/molecules/FormField.svelte.d.ts +2 -0
  260. package/dist/molecules/Header.svelte +1 -1
  261. package/dist/molecules/ImageUpload.svelte +492 -69
  262. package/dist/molecules/ImageUpload.svelte.d.ts +82 -2
  263. package/dist/molecules/LineChart.svelte +459 -0
  264. package/dist/molecules/LineChart.svelte.d.ts +53 -0
  265. package/dist/molecules/MapView.svelte +565 -0
  266. package/dist/molecules/MapView.svelte.d.ts +88 -0
  267. package/dist/molecules/MediaGrid.svelte +527 -0
  268. package/dist/molecules/MediaGrid.svelte.d.ts +77 -0
  269. package/dist/molecules/Modal.svelte +293 -72
  270. package/dist/molecules/Modal.svelte.d.ts +51 -2
  271. package/dist/molecules/NavigationMenuContent.svelte +58 -1
  272. package/dist/molecules/NavigationMenuItem.svelte +0 -1
  273. package/dist/molecules/NavigationMenuLink.svelte +1 -1
  274. package/dist/molecules/NavigationMenuList.svelte +10 -3
  275. package/dist/molecules/NavigationMenuTrigger.svelte +2 -2
  276. package/dist/molecules/Page.svelte +32 -2
  277. package/dist/molecules/Page.svelte.d.ts +11 -0
  278. package/dist/molecules/PhotoGrid.svelte +523 -0
  279. package/dist/molecules/PhotoGrid.svelte.d.ts +73 -0
  280. package/dist/molecules/PhotoViewer.svelte +1213 -0
  281. package/dist/molecules/PhotoViewer.svelte.d.ts +74 -0
  282. package/dist/molecules/PieChart.svelte +421 -0
  283. package/dist/molecules/PieChart.svelte.d.ts +51 -0
  284. package/dist/molecules/PropsTable.svelte +22 -10
  285. package/dist/molecules/PropsTable.svelte.d.ts +3 -0
  286. package/dist/molecules/PullToRefresh.svelte +263 -0
  287. package/dist/molecules/PullToRefresh.svelte.d.ts +52 -0
  288. package/dist/molecules/RadioGroup.svelte +72 -18
  289. package/dist/molecules/RadioGroup.svelte.d.ts +19 -3
  290. package/dist/molecules/Section.svelte +1 -1
  291. package/dist/molecules/SegmentedControl.svelte +456 -0
  292. package/dist/molecules/SegmentedControl.svelte.d.ts +40 -0
  293. package/dist/molecules/SidebarBrandHeader.svelte +11 -1
  294. package/dist/molecules/SidebarBrandHeader.svelte.d.ts +3 -0
  295. package/dist/molecules/SidebarFooter.svelte +30 -7
  296. package/dist/molecules/SidebarFooter.svelte.d.ts +3 -0
  297. package/dist/molecules/SidebarNavSection.svelte +1 -1
  298. package/dist/molecules/SlideUp.svelte +220 -61
  299. package/dist/molecules/SlideUp.svelte.d.ts +26 -0
  300. package/dist/molecules/SortableList.svelte +633 -0
  301. package/dist/molecules/SortableList.svelte.d.ts +69 -0
  302. package/dist/molecules/Stepper.svelte +562 -0
  303. package/dist/molecules/Stepper.svelte.d.ts +39 -0
  304. package/dist/molecules/StickyActionBar.svelte +250 -0
  305. package/dist/molecules/StickyActionBar.svelte.d.ts +78 -0
  306. package/dist/molecules/SwipeableListItem.svelte +334 -0
  307. package/dist/molecules/SwipeableListItem.svelte.d.ts +54 -0
  308. package/dist/molecules/Tabs.svelte +310 -9
  309. package/dist/molecules/Tabs.svelte.d.ts +7 -0
  310. package/dist/molecules/Toaster.svelte +514 -5
  311. package/dist/molecules/Toaster.svelte.d.ts +153 -2
  312. package/dist/molecules/ToasterToast.svelte +495 -77
  313. package/dist/molecules/ToasterToast.svelte.d.ts +15 -0
  314. package/dist/molecules/UnsavedChangesBar.svelte +223 -0
  315. package/dist/molecules/UnsavedChangesBar.svelte.d.ts +43 -0
  316. package/dist/molecules/index.d.ts +51 -0
  317. package/dist/molecules/index.js +31 -0
  318. package/dist/molecules/toast-store.d.ts +83 -7
  319. package/dist/molecules/toast-store.js +25 -1
  320. package/dist/organisms/AppNavigation.svelte +440 -0
  321. package/dist/organisms/AppNavigation.svelte.d.ts +72 -0
  322. package/dist/organisms/AppShell.svelte +696 -0
  323. package/dist/organisms/AppShell.svelte.d.ts +157 -0
  324. package/dist/organisms/AppShellHeaderPart.svelte +163 -0
  325. package/dist/organisms/AppShellHeaderPart.svelte.d.ts +57 -0
  326. package/dist/organisms/SidebarAccountPanel.svelte +107 -12
  327. package/dist/organisms/SidebarAccountPanel.svelte.d.ts +19 -0
  328. package/dist/organisms/SidebarNavigation.svelte +111 -43
  329. package/dist/organisms/SidebarNavigation.svelte.d.ts +29 -1
  330. package/dist/organisms/SidebarPanel.svelte +34 -17
  331. package/dist/organisms/SidebarPanel.svelte.d.ts +1 -0
  332. package/dist/organisms/SidebarShell.svelte +164 -14
  333. package/dist/organisms/SidebarShell.svelte.d.ts +56 -2
  334. package/dist/organisms/TopNavbar.svelte +353 -39
  335. package/dist/organisms/TopNavbar.svelte.d.ts +47 -0
  336. package/dist/organisms/TopNavbarSheetContent.svelte +145 -0
  337. package/dist/organisms/TopNavbarSheetContent.svelte.d.ts +24 -0
  338. package/dist/organisms/index.d.ts +10 -0
  339. package/dist/organisms/index.js +7 -0
  340. package/dist/types/components.d.ts +21 -1
  341. package/dist/types/components.d.ts.map +1 -1
  342. package/dist/types/index.d.ts +1093 -26
  343. package/dist/types/index.d.ts.map +1 -1
  344. package/dist/types/variants.ts +28 -1
  345. package/dist/util/app-shell.d.ts +78 -0
  346. package/dist/util/app-shell.js +97 -0
  347. package/dist/util/avatar.d.ts +38 -0
  348. package/dist/util/avatar.js +52 -0
  349. package/dist/util/bottom-sheet.d.ts +29 -0
  350. package/dist/util/bottom-sheet.js +43 -0
  351. package/dist/util/bottom-tab-bar.d.ts +40 -0
  352. package/dist/util/bottom-tab-bar.js +54 -0
  353. package/dist/util/calendar.d.ts +55 -0
  354. package/dist/util/calendar.js +74 -0
  355. package/dist/util/chart.d.ts +139 -0
  356. package/dist/util/chart.js +305 -0
  357. package/dist/util/chip.d.ts +65 -0
  358. package/dist/util/chip.js +58 -0
  359. package/dist/util/cn.js +28 -2
  360. package/dist/util/code-field.d.ts +62 -0
  361. package/dist/util/code-field.js +112 -0
  362. package/dist/util/collapsible.d.ts +63 -0
  363. package/dist/util/collapsible.js +23 -0
  364. package/dist/util/confirm-dialog.d.ts +11 -0
  365. package/dist/util/confirm-dialog.js +2 -0
  366. package/dist/util/date.d.ts +95 -0
  367. package/dist/util/date.js +237 -0
  368. package/dist/util/display-voice.d.ts +9 -0
  369. package/dist/util/display-voice.js +9 -0
  370. package/dist/util/drawer.d.ts +12 -0
  371. package/dist/util/drawer.js +7 -0
  372. package/dist/util/dropdown.d.ts +46 -0
  373. package/dist/util/dropdown.js +21 -0
  374. package/dist/util/field-control.d.ts +29 -0
  375. package/dist/util/field-control.js +32 -0
  376. package/dist/util/field.d.ts +44 -0
  377. package/dist/util/field.js +38 -0
  378. package/dist/util/fit-in-viewport.d.ts +200 -0
  379. package/dist/util/fit-in-viewport.js +399 -0
  380. package/dist/util/focus-utils.d.ts +77 -2
  381. package/dist/util/focus-utils.js +186 -9
  382. package/dist/util/hydration.d.ts +44 -0
  383. package/dist/util/hydration.js +58 -0
  384. package/dist/util/keyboard-inset.d.ts +17 -0
  385. package/dist/util/keyboard-inset.js +53 -0
  386. package/dist/util/map-view.d.ts +143 -0
  387. package/dist/util/map-view.js +121 -0
  388. package/dist/util/media-grid.d.ts +50 -0
  389. package/dist/util/media-grid.js +81 -0
  390. package/dist/util/media.d.ts +5 -0
  391. package/dist/util/media.js +10 -0
  392. package/dist/util/overlay-chrome.d.ts +52 -0
  393. package/dist/util/overlay-chrome.js +56 -0
  394. package/dist/util/overlay.d.ts +71 -0
  395. package/dist/util/overlay.js +240 -0
  396. package/dist/util/photo.d.ts +233 -0
  397. package/dist/util/photo.js +209 -0
  398. package/dist/util/portal.d.ts +22 -0
  399. package/dist/util/portal.js +50 -0
  400. package/dist/util/progress.d.ts +18 -0
  401. package/dist/util/progress.js +17 -0
  402. package/dist/util/pull-to-refresh.d.ts +26 -0
  403. package/dist/util/pull-to-refresh.js +30 -0
  404. package/dist/util/radio-keys.d.ts +24 -0
  405. package/dist/util/radio-keys.js +49 -0
  406. package/dist/util/rating.d.ts +22 -0
  407. package/dist/util/rating.js +26 -0
  408. package/dist/util/ready-made-strings.d.ts +76 -0
  409. package/dist/util/ready-made-strings.js +67 -0
  410. package/dist/util/scroll-edge.d.ts +32 -0
  411. package/dist/util/scroll-edge.js +87 -0
  412. package/dist/util/scroll-padding.d.ts +19 -0
  413. package/dist/util/scroll-padding.js +44 -0
  414. package/dist/util/segmented-control.d.ts +15 -0
  415. package/dist/util/segmented-control.js +1 -0
  416. package/dist/util/select.d.ts +40 -0
  417. package/dist/util/select.js +63 -0
  418. package/dist/util/sheet-drag.d.ts +83 -0
  419. package/dist/util/sheet-drag.js +311 -0
  420. package/dist/util/sidebar.d.ts +62 -0
  421. package/dist/util/sidebar.js +38 -0
  422. package/dist/util/skeleton.d.ts +14 -0
  423. package/dist/util/skeleton.js +22 -0
  424. package/dist/util/sliding-indicator.d.ts +24 -0
  425. package/dist/util/sliding-indicator.js +44 -0
  426. package/dist/util/sortable-list.d.ts +64 -0
  427. package/dist/util/sortable-list.js +53 -0
  428. package/dist/util/stepper.d.ts +39 -0
  429. package/dist/util/stepper.js +38 -0
  430. package/dist/util/swipeable-list-item.d.ts +35 -0
  431. package/dist/util/swipeable-list-item.js +32 -0
  432. package/dist/util/temporal-field.d.ts +88 -0
  433. package/dist/util/temporal-field.js +136 -0
  434. package/dist/util/theme-mode.d.ts +79 -0
  435. package/dist/util/theme-mode.js +121 -0
  436. package/dist/util/toaster.d.ts +132 -0
  437. package/dist/util/toaster.js +130 -0
  438. package/dist/util/tone-surface.d.ts +33 -0
  439. package/dist/util/tone-surface.js +35 -0
  440. package/dist/util/tooltip.d.ts +9 -0
  441. package/dist/util/tooltip.js +18 -0
  442. package/dist/util/top-navbar.d.ts +34 -0
  443. package/dist/util/top-navbar.js +28 -0
  444. package/dist/util/touch-target.d.ts +30 -0
  445. package/dist/util/touch-target.js +30 -0
  446. package/dist/util/zabi-strings.d.ts +141 -0
  447. package/dist/util/zabi-strings.js +105 -0
  448. package/dist/zabi-components-colors.css +11 -2
  449. package/dist/zabi-components-theme-dark-only.css +870 -258
  450. package/dist/zabi-components-theme-dark.css +870 -258
  451. package/dist/zabi-components-theme-only.css +2419 -368
  452. package/dist/zabi-components-theme.css +2419 -368
  453. package/dist/zabi-components.css +6032 -711
  454. package/docs/lucide-icons.md +40 -17
  455. package/docs/theme-imports.md +81 -11
  456. package/package.json +45 -8
@@ -1,8 +1,23 @@
1
1
  import { type ToastItem } from './toast-store.js';
2
+ import { type ToastDuration, type ToasterStrings, type ToastPauseChange } from "../util/toaster.js";
2
3
  interface Props {
3
4
  /** Extra classes for the host element. */
4
5
  class?: string;
5
6
  toast: ToastItem;
7
+ /** Every word the toast says by itself; the Toaster passes its own. */
8
+ strings?: ToasterStrings;
9
+ /** Shows the time left as a sentence, with a button that stops the timer. */
10
+ showCountdown?: boolean;
11
+ /** What a toast pushed without a duration gets, in place of medium; the Toaster passes its own. */
12
+ defaultDuration?: ToastDuration;
13
+ /** Called when a pointer, a finger or focus starts or stops holding the timer. */
14
+ onpausechange?: (detail: ToastPauseChange) => void;
15
+ /** The compact form for a phone: one row, docked, sliding out from the edge it sits on. */
16
+ snackbar?: boolean;
17
+ /** A touch or a pen drags the toast away, sideways (and down, in the snackbar). */
18
+ swipeToDismiss?: boolean;
19
+ /** Draws the time bar (`true`/`false`); unset, it is left out of a snackbar toast with nothing to press. */
20
+ timeLine?: boolean;
6
21
  }
7
22
  declare const ToasterToast: import("svelte").Component<Props, {}, "">;
8
23
  type ToasterToast = ReturnType<typeof ToasterToast>;
@@ -0,0 +1,223 @@
1
+ <script lang="ts">
2
+ import { DEFAULT_UNSAVED_CHANGES_BAR_TEXTS, zabiStringsFor } from "../util/zabi-strings.js";
3
+ import { tick, untrack, type Snippet } from "svelte";
4
+ import type { HTMLAttributes } from "svelte/elements";
5
+ import Button from "../atoms/Button.svelte";
6
+ import { getAppShell } from "../util/app-shell.js";
7
+ import { cn } from "../util/cn.js";
8
+
9
+ type Props = Omit<HTMLAttributes<HTMLDivElement>, "class" | "role"> & {
10
+ /** Shows the bar. Set it while the form differs from what is saved. */
11
+ dirty?: boolean;
12
+ /** Shown in the bar, and announced once when it appears. */
13
+ message?: string;
14
+ /** Accessible name of the bar as a landmark. */
15
+ label?: string;
16
+ saveLabel?: string;
17
+ discardLabel?: string;
18
+ /**
19
+ * Save shows its loading state and Discard is disabled. Set by the
20
+ * bar itself while a promise from `onsave` is pending.
21
+ */
22
+ saving?: boolean;
23
+ /**
24
+ * Called when Save is activated. Return a promise to keep the bar in
25
+ * its saving state until it settles. The bar does not hide itself:
26
+ * clear `dirty` once the save has gone through.
27
+ */
28
+ onsave?: () => void | Promise<unknown>;
29
+ /** Called when Discard is activated. */
30
+ ondiscard?: () => void;
31
+ /**
32
+ * Called when the promise from `onsave` rejects; the bar stays.
33
+ * Without it the error goes to the global error handler.
34
+ */
35
+ onerror?: (error: unknown) => void;
36
+ /**
37
+ * Which edge of its scroll container the bar sticks to. It is sticky,
38
+ * not fixed, so it keeps its place in the flow: put it after the
39
+ * form's last field (`bottom`) or before its first (`top`).
40
+ */
41
+ position?: "bottom" | "top";
42
+ /** Extra buttons, placed before Discard. */
43
+ actions?: Snippet;
44
+ /** Extra classes for the bar. */
45
+ class?: string;
46
+ };
47
+
48
+ let {
49
+ dirty = false,
50
+ message: messageGiven,
51
+ label: labelGiven,
52
+ saveLabel: saveLabelGiven,
53
+ discardLabel: discardLabelGiven,
54
+ saving = false,
55
+ onsave,
56
+ ondiscard,
57
+ onerror,
58
+ position = "bottom",
59
+ actions,
60
+ class: className = "",
61
+ ...restProps
62
+ }: Props = $props();
63
+
64
+ /** Each text: the prop, else the app-wide word from a `ZabiStringsProvider` above this one, else English. */
65
+ const provided = zabiStringsFor("unsavedChangesBar");
66
+ const message = $derived(messageGiven ?? provided()?.message ?? DEFAULT_UNSAVED_CHANGES_BAR_TEXTS.message);
67
+ const label = $derived(labelGiven ?? provided()?.label ?? DEFAULT_UNSAVED_CHANGES_BAR_TEXTS.label);
68
+ const saveLabel = $derived(saveLabelGiven ?? provided()?.saveLabel ?? DEFAULT_UNSAVED_CHANGES_BAR_TEXTS.saveLabel);
69
+ const discardLabel = $derived(discardLabelGiven ?? provided()?.discardLabel ?? DEFAULT_UNSAVED_CHANGES_BAR_TEXTS.discardLabel);
70
+
71
+ /** In a shell whose footer lies over the scroller the bar floats above the footer, which already clears the home indicator. */
72
+ const shell = getAppShell();
73
+ const aboveFooter = $derived(shell?.footerOverlays === true);
74
+
75
+ /** True while a promise returned by `onsave` is pending. */
76
+ let pending = $state(false);
77
+ const busy = $derived(saving || pending);
78
+
79
+ let host: HTMLDivElement | undefined = $state();
80
+ /** Where focus was before it came into the bar; it goes back there when the bar leaves. */
81
+ let cameFrom: HTMLElement | null = null;
82
+
83
+ async function save() {
84
+ if (busy) return;
85
+ // A synchronous throw is the caller's bug: it propagates.
86
+ const result = onsave?.();
87
+ if (!(result instanceof Promise)) return;
88
+ pending = true;
89
+ try {
90
+ await result;
91
+ } catch (error) {
92
+ // The bar stays, so the caller can show what went wrong. Never
93
+ // swallowed: with no `onerror` it is reported like any other
94
+ // uncaught error.
95
+ if (onerror) onerror(error);
96
+ else if (typeof reportError === "function") reportError(error);
97
+ else console.error(error);
98
+ } finally {
99
+ pending = false;
100
+ }
101
+ }
102
+
103
+ function discard() {
104
+ if (busy) return;
105
+ ondiscard?.();
106
+ }
107
+
108
+ function handleFocusIn(event: FocusEvent) {
109
+ const from = event.relatedTarget;
110
+ if (from instanceof HTMLElement && !host?.contains(from)) cameFrom = from;
111
+ }
112
+
113
+ function canTakeFocus(element: HTMLElement | null): element is HTMLElement {
114
+ return (
115
+ !!element &&
116
+ element.isConnected &&
117
+ !(element as HTMLButtonElement).disabled &&
118
+ !host?.contains(element)
119
+ );
120
+ }
121
+
122
+ /**
123
+ * While busy, Save is loading and stays focusable, so focus that is on
124
+ * it is left there. Discard is disabled, and a disabled button drops
125
+ * focus on `<body>`: focus that was on it (or on an action that is gone)
126
+ * is held on the bar instead, and handed to Save if the bar is still
127
+ * there afterwards (a rejected save).
128
+ */
129
+ let wasBusy = false;
130
+ $effect.pre(() => {
131
+ const now = busy;
132
+ untrack(() => {
133
+ const changed = now !== wasBusy;
134
+ wasBusy = now;
135
+ // Read before the buttons change: afterwards focus may be gone.
136
+ if (!changed || !host?.contains(document.activeElement)) return;
137
+ void tick().then(() => {
138
+ if (now) {
139
+ const active = document.activeElement;
140
+ const usable =
141
+ !!active &&
142
+ active !== host &&
143
+ !!host?.contains(active) &&
144
+ !(active as HTMLButtonElement).disabled;
145
+ if (!usable) host?.focus();
146
+ } else if (dirty && document.activeElement === host) {
147
+ host?.querySelector<HTMLElement>("[data-unsaved-changes-save]")?.focus();
148
+ }
149
+ });
150
+ });
151
+ });
152
+
153
+ /**
154
+ * When the bar leaves, its buttons go with it. If focus was on one, send
155
+ * it back to where it came from, usually the field the user was editing;
156
+ * failing that it stays on the (now empty) host, which keeps the user's
157
+ * place in the page instead of dropping them at the top.
158
+ */
159
+ let wasDirty = false;
160
+ $effect.pre(() => {
161
+ const now = dirty;
162
+ untrack(() => {
163
+ const leaving = wasDirty && !now;
164
+ wasDirty = now;
165
+ if (!leaving || !host?.contains(document.activeElement)) return;
166
+ const target = canTakeFocus(cameFrom) ? cameFrom : host;
167
+ cameFrom = null;
168
+ void tick().then(() => {
169
+ const active = document.activeElement;
170
+ // Never from an element that has taken focus meanwhile.
171
+ if (active && active !== document.body && !host?.contains(active)) return;
172
+ target.focus();
173
+ });
174
+ });
175
+ });
176
+ </script>
177
+
178
+ <!--
179
+ The host is always rendered and empty until `dirty`. The message is a live
180
+ region, and a live region is only announced when its text changes inside an
181
+ element that was already there. The status is on the message alone, so the
182
+ buttons are not read out with it, and nothing here takes focus on appearing.
183
+ -->
184
+ <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
185
+ <div
186
+ bind:this={host}
187
+ tabindex="-1"
188
+ role={dirty ? "region" : undefined}
189
+ aria-label={dirty ? label : undefined}
190
+ aria-busy={dirty && busy ? "true" : undefined}
191
+ data-position={position}
192
+ data-toast-clear={dirty ? "" : undefined}
193
+ class={cn(
194
+ "focus-ring",
195
+ dirty &&
196
+ "material-layer-regular sticky z-sticky flex flex-wrap items-center justify-between gap-x-4 gap-y-2 rounded-container px-4 py-3",
197
+ // Clear of the home indicator on a phone.
198
+ dirty &&
199
+ (position === "top"
200
+ ? "top-2"
201
+ : aboveFooter
202
+ ? "bottom-[calc(var(--app-shell-footer-overlay,0px)+0.5rem)]"
203
+ : "bottom-[max(0.5rem,env(safe-area-inset-bottom))]"),
204
+ dirty && className,
205
+ )}
206
+ onfocusin={handleFocusIn}
207
+ {...restProps}
208
+ >
209
+ <p role="status" class={dirty ? "min-w-0 text-sm font-medium text-body" : "sr-only"}>
210
+ {dirty ? message : ""}
211
+ </p>
212
+ {#if dirty}
213
+ <div class="flex flex-wrap items-center gap-2">
214
+ {@render actions?.()}
215
+ <Button variant="ghost" onclick={discard} disabled={busy}>
216
+ {discardLabel}
217
+ </Button>
218
+ <Button onclick={save} loading={busy} data-unsaved-changes-save>
219
+ {saveLabel}
220
+ </Button>
221
+ </div>
222
+ {/if}
223
+ </div>
@@ -0,0 +1,43 @@
1
+ import { type Snippet } from "svelte";
2
+ import type { HTMLAttributes } from "svelte/elements";
3
+ type Props = Omit<HTMLAttributes<HTMLDivElement>, "class" | "role"> & {
4
+ /** Shows the bar. Set it while the form differs from what is saved. */
5
+ dirty?: boolean;
6
+ /** Shown in the bar, and announced once when it appears. */
7
+ message?: string;
8
+ /** Accessible name of the bar as a landmark. */
9
+ label?: string;
10
+ saveLabel?: string;
11
+ discardLabel?: string;
12
+ /**
13
+ * Save shows its loading state and Discard is disabled. Set by the
14
+ * bar itself while a promise from `onsave` is pending.
15
+ */
16
+ saving?: boolean;
17
+ /**
18
+ * Called when Save is activated. Return a promise to keep the bar in
19
+ * its saving state until it settles. The bar does not hide itself:
20
+ * clear `dirty` once the save has gone through.
21
+ */
22
+ onsave?: () => void | Promise<unknown>;
23
+ /** Called when Discard is activated. */
24
+ ondiscard?: () => void;
25
+ /**
26
+ * Called when the promise from `onsave` rejects; the bar stays.
27
+ * Without it the error goes to the global error handler.
28
+ */
29
+ onerror?: (error: unknown) => void;
30
+ /**
31
+ * Which edge of its scroll container the bar sticks to. It is sticky,
32
+ * not fixed, so it keeps its place in the flow: put it after the
33
+ * form's last field (`bottom`) or before its first (`top`).
34
+ */
35
+ position?: "bottom" | "top";
36
+ /** Extra buttons, placed before Discard. */
37
+ actions?: Snippet;
38
+ /** Extra classes for the bar. */
39
+ class?: string;
40
+ };
41
+ declare const UnsavedChangesBar: import("svelte").Component<Props, {}, "">;
42
+ type UnsavedChangesBar = ReturnType<typeof UnsavedChangesBar>;
43
+ export default UnsavedChangesBar;
@@ -2,8 +2,12 @@ export { default as Alert } from './Alert.svelte';
2
2
  export { default as ComponentDemo } from './ComponentDemo.svelte';
3
3
  export { default as ContactForm } from './ContactForm.svelte';
4
4
  export { default as Dropdown } from './Dropdown.svelte';
5
+ export { default as DropdownItem } from './DropdownItem.svelte';
6
+ export type { DropdownItemIcon, DropdownItemTone, DropdownOption, } from '../util/dropdown.js';
5
7
  export { default as Form } from './Form.svelte';
6
8
  export { default as ImageUpload } from './ImageUpload.svelte';
9
+ export { default as MediaGrid } from './MediaGrid.svelte';
10
+ export type { MediaGridItemType, MediaGridKey, MediaGridSelectDetail, MediaGridStrings, } from '../util/media-grid.js';
7
11
  export { default as Modal } from './Modal.svelte';
8
12
  export { default as NavigationMenu } from './NavigationMenu.svelte';
9
13
  export { default as NavigationMenuList } from './NavigationMenuList.svelte';
@@ -23,4 +27,51 @@ export { default as Header } from './Header.svelte';
23
27
  export { default as EmptyState } from './EmptyState.svelte';
24
28
  export { default as Toaster } from './Toaster.svelte';
25
29
  export { default as RadioGroup } from './RadioGroup.svelte';
30
+ export { default as ChipGroup } from './ChipGroup.svelte';
31
+ export { default as SegmentedControl } from './SegmentedControl.svelte';
32
+ export type { SegmentedControlIcon, SegmentedControlOption, } from '../util/segmented-control.js';
33
+ export { default as SortableList } from './SortableList.svelte';
34
+ export type { SortableListAnnouncement, SortableListReorderDetail, SortableListRow, SortableListStrings, } from '../util/sortable-list.js';
35
+ export { default as Collapsible } from './Collapsible.svelte';
36
+ export { default as SwipeableListItem } from './SwipeableListItem.svelte';
37
+ export { DEFAULT_SWIPEABLE_LIST_ITEM_STRINGS } from '../util/swipeable-list-item.js';
38
+ export type { SwipeableListItemAction, SwipeableListItemStrings } from '../util/swipeable-list-item.js';
39
+ export { default as PullToRefresh } from './PullToRefresh.svelte';
40
+ export { DEFAULT_PULL_TO_REFRESH_STRINGS } from '../util/pull-to-refresh.js';
41
+ export type { PullToRefreshStrings } from '../util/pull-to-refresh.js';
42
+ export { default as CollapsibleGroup } from './CollapsibleGroup.svelte';
43
+ export type { CollapsibleHeadingLevel, CollapsibleTriggerProps, CollapsibleTriggerState, } from '../util/collapsible.js';
44
+ export { default as ConfirmDialog } from './ConfirmDialog.svelte';
45
+ export type { ConfirmDialogCancelReason, ConfirmDialogResult, ConfirmDialogVariant, } from '../util/confirm-dialog.js';
46
+ export { default as Drawer } from './Drawer.svelte';
47
+ export type { DrawerCloseReason, DrawerSide, DrawerSize, } from '../util/drawer.js';
48
+ export { default as UnsavedChangesBar } from './UnsavedChangesBar.svelte';
49
+ export { default as AppBar } from './AppBar.svelte';
50
+ export { default as BottomTabBar } from './BottomTabBar.svelte';
51
+ export type { BottomTabBarIcon, BottomTabBarItem, } from '../util/bottom-tab-bar.js';
52
+ export { default as BottomSheet } from './BottomSheet.svelte';
53
+ export type { BottomSheetCloseReason, BottomSheetSnap, } from '../util/bottom-sheet.js';
54
+ export { default as StickyActionBar } from './StickyActionBar.svelte';
55
+ export { default as Calendar } from './Calendar.svelte';
56
+ export type { CalendarEvent, CalendarStrings, CalendarTone, } from '../util/calendar.js';
57
+ export { default as PhotoGrid } from './PhotoGrid.svelte';
58
+ export { default as PhotoViewer } from './PhotoViewer.svelte';
59
+ export type { Photo, PhotoGridSelectDetail, PhotoGridStrings, PhotoKey, PhotoStatus, PhotoViewerAction, PhotoViewerCloseReason, PhotoViewerStrings, } from '../util/photo.js';
60
+ export { default as AvatarGroup } from './AvatarGroup.svelte';
61
+ export { DEFAULT_AVATAR_GROUP_STRINGS } from '../util/avatar.js';
62
+ export type { AvatarGroupStrings, AvatarPerson } from '../util/avatar.js';
63
+ export { default as LineChart } from './LineChart.svelte';
64
+ export { default as BarChart } from './BarChart.svelte';
65
+ export { default as PieChart } from './PieChart.svelte';
66
+ export type { ChartColor, ChartColorName, ChartDatum, ChartFormat, ChartSeries, } from '../util/chart.js';
67
+ export { default as Stepper } from './Stepper.svelte';
68
+ export type { StepperItem, StepperLayout, StepperStep, StepperStepState, StepperStrings, } from '../util/stepper.js';
26
69
  export * from './toast-store.js';
70
+ export { DEFAULT_TOASTER_STRINGS, TOAST_DURATIONS } from '../util/toaster.js';
71
+ export type { ToasterStrings, ToasterMode, ToastPauseChange, ToastDuration } from '../util/toaster.js';
72
+ export { DEFAULT_SELECT_STRINGS } from '../util/select.js';
73
+ export type { SelectStrings, SelectPresentation } from '../util/select.js';
74
+ export { DEFAULT_SIDEBAR_BRAND_HEADER_STRINGS, DEFAULT_SIDEBAR_FOOTER_STRINGS, } from '../util/sidebar.js';
75
+ export type { SidebarBrandHeaderStrings, SidebarFooterStrings } from '../util/sidebar.js';
76
+ export { DEFAULT_COMPONENT_DEMO_STRINGS, DEFAULT_CONTACT_FORM_STRINGS, DEFAULT_PROPS_TABLE_STRINGS, } from '../util/ready-made-strings.js';
77
+ export type { ComponentDemoStrings, ContactFormStrings, PropsTableStrings, } from '../util/ready-made-strings.js';
@@ -2,8 +2,10 @@ export { default as Alert } from './Alert.svelte';
2
2
  export { default as ComponentDemo } from './ComponentDemo.svelte';
3
3
  export { default as ContactForm } from './ContactForm.svelte';
4
4
  export { default as Dropdown } from './Dropdown.svelte';
5
+ export { default as DropdownItem } from './DropdownItem.svelte';
5
6
  export { default as Form } from './Form.svelte';
6
7
  export { default as ImageUpload } from './ImageUpload.svelte';
8
+ export { default as MediaGrid } from './MediaGrid.svelte';
7
9
  export { default as Modal } from './Modal.svelte';
8
10
  export { default as NavigationMenu } from './NavigationMenu.svelte';
9
11
  export { default as NavigationMenuList } from './NavigationMenuList.svelte';
@@ -23,4 +25,33 @@ export { default as Header } from './Header.svelte';
23
25
  export { default as EmptyState } from './EmptyState.svelte';
24
26
  export { default as Toaster } from './Toaster.svelte';
25
27
  export { default as RadioGroup } from './RadioGroup.svelte';
28
+ export { default as ChipGroup } from './ChipGroup.svelte';
29
+ export { default as SegmentedControl } from './SegmentedControl.svelte';
30
+ export { default as SortableList } from './SortableList.svelte';
31
+ export { default as Collapsible } from './Collapsible.svelte';
32
+ export { default as SwipeableListItem } from './SwipeableListItem.svelte';
33
+ export { DEFAULT_SWIPEABLE_LIST_ITEM_STRINGS } from '../util/swipeable-list-item.js';
34
+ export { default as PullToRefresh } from './PullToRefresh.svelte';
35
+ export { DEFAULT_PULL_TO_REFRESH_STRINGS } from '../util/pull-to-refresh.js';
36
+ export { default as CollapsibleGroup } from './CollapsibleGroup.svelte';
37
+ export { default as ConfirmDialog } from './ConfirmDialog.svelte';
38
+ export { default as Drawer } from './Drawer.svelte';
39
+ export { default as UnsavedChangesBar } from './UnsavedChangesBar.svelte';
40
+ export { default as AppBar } from './AppBar.svelte';
41
+ export { default as BottomTabBar } from './BottomTabBar.svelte';
42
+ export { default as BottomSheet } from './BottomSheet.svelte';
43
+ export { default as StickyActionBar } from './StickyActionBar.svelte';
44
+ export { default as Calendar } from './Calendar.svelte';
45
+ export { default as PhotoGrid } from './PhotoGrid.svelte';
46
+ export { default as PhotoViewer } from './PhotoViewer.svelte';
47
+ export { default as AvatarGroup } from './AvatarGroup.svelte';
48
+ export { DEFAULT_AVATAR_GROUP_STRINGS } from '../util/avatar.js';
49
+ export { default as LineChart } from './LineChart.svelte';
50
+ export { default as BarChart } from './BarChart.svelte';
51
+ export { default as PieChart } from './PieChart.svelte';
52
+ export { default as Stepper } from './Stepper.svelte';
26
53
  export * from './toast-store.js';
54
+ export { DEFAULT_TOASTER_STRINGS, TOAST_DURATIONS } from '../util/toaster.js';
55
+ export { DEFAULT_SELECT_STRINGS } from '../util/select.js';
56
+ export { DEFAULT_SIDEBAR_BRAND_HEADER_STRINGS, DEFAULT_SIDEBAR_FOOTER_STRINGS, } from '../util/sidebar.js';
57
+ export { DEFAULT_COMPONENT_DEMO_STRINGS, DEFAULT_CONTACT_FORM_STRINGS, DEFAULT_PROPS_TABLE_STRINGS, } from '../util/ready-made-strings.js';
@@ -1,17 +1,70 @@
1
+ import type { ToastDuration } from '../util/toaster.js';
1
2
  export type ToastLevel = 'success' | 'error' | 'warning' | 'info';
3
+ /**
4
+ * One action offered inside a toast, such as Undo.
5
+ *
6
+ * A toast with an action stays until it is dismissed, unless you give it a
7
+ * `duration` (a named length or milliseconds): a keyboard user has to reach the button first, and the toaster
8
+ * may be far away in the tab order (WCAG 2.2.1). `focusToasts()` moves focus
9
+ * there. The action must still not be the only way to do the thing: offer it
10
+ * elsewhere in the page as well.
11
+ */
12
+ export interface ToastAction {
13
+ /** Button text, and its accessible name. */
14
+ label: string;
15
+ onclick: () => void;
16
+ /** Close the toast after the handler runs. Defaults to `true`. */
17
+ dismissOnClick?: boolean;
18
+ }
2
19
  export interface ToastItem {
3
20
  id: string;
4
- /** Primary line (always shown). */
21
+ /**
22
+ * What the toast says. Always shown: as its one line, or under `title`
23
+ * when it has one.
24
+ */
5
25
  message: string;
6
26
  type: ToastLevel;
27
+ /** A heading over the message. Without it the message stands alone. */
7
28
  title?: string;
8
- /** Expandable body; UI can fall back to `message`. */
29
+ /**
30
+ * The long version, kept behind a button that opens it. Only a toast
31
+ * with `detail` has that button.
32
+ */
9
33
  detail?: string;
10
34
  /**
11
- * Auto-dismiss duration in milliseconds.
12
- * When omitted, the toaster uses 14s. Use `0` to keep the toast until dismissed manually.
35
+ * How long the toast stays: `"short"` (3 s, a few words that need no
36
+ * reading time), `"medium"` (7 s), `"long"` (14 s), `"persistent"`
37
+ * (until it is dismissed: what the user has to act on, and errors), or
38
+ * a number of milliseconds, where `0` is persistent too. What is given
39
+ * here always wins.
40
+ *
41
+ * When omitted, the toaster decides: an error and a toast with an
42
+ * `action` stay until dismissed. Everything else goes by its title and
43
+ * message together: up to 120 characters gets `medium` (or the
44
+ * Toaster's `defaultDuration`), 121 to 240 gets `long`, and more than
45
+ * 240 stays until dismissed.
13
46
  */
14
- duration?: number;
47
+ duration?: ToastDuration;
48
+ /** An action button in the toast, such as Undo. */
49
+ action?: ToastAction;
50
+ /**
51
+ * `false` leaves the close button out, for a short timed confirmation
52
+ * that nobody has to act on: the toast then has no control, takes no
53
+ * taps (they reach the page under it) and cannot be held. Ignored, and
54
+ * the button shown, for a toast that stays (an error, one with an
55
+ * action, `"persistent"`), one with `detail`, and under a Toaster with
56
+ * `showCountdown`. Defaults to `true`.
57
+ */
58
+ closable?: boolean;
59
+ /**
60
+ * Whether the thin bar along the bottom, which empties over the toast's
61
+ * time, is drawn. Unset, the Toaster decides: it is drawn, except under
62
+ * a confirmation in the snackbar that has nothing to press (the case
63
+ * `closable: false` makes), where it is left out. `true` or `false`
64
+ * here wins over the Toaster's `timeLine`. The sentence a screen reader
65
+ * finds for the time left stays either way.
66
+ */
67
+ timeLine?: boolean;
15
68
  }
16
69
  export declare const toastStore: {
17
70
  subscribe: (this: void, run: import("svelte/store").Subscriber<ToastItem[]>, invalidate?: () => void) => import("svelte/store").Unsubscriber;
@@ -19,20 +72,43 @@ export declare const toastStore: {
19
72
  message: string;
20
73
  type?: ToastLevel;
21
74
  /** Same semantics as {@link ToastItem.duration}. */
22
- duration?: number;
75
+ duration?: ToastDuration;
23
76
  id?: string;
24
77
  title?: string;
25
78
  detail?: string;
79
+ action?: ToastAction;
80
+ closable?: boolean;
81
+ timeLine?: boolean;
26
82
  }): string;
27
83
  dismiss: (id: string) => void;
28
84
  clear(): void;
29
85
  };
30
86
  export declare function pushToast(options: {
31
87
  message: string;
88
+ /**
89
+ * Gives the toast a name of your own. Pushing with the id of a toast that
90
+ * is showing replaces it in place, with its time started again, so
91
+ * "Saved" pushed three times is one toast.
92
+ */
93
+ id?: string;
32
94
  type?: ToastLevel;
33
95
  /** Same semantics as {@link ToastItem.duration}. */
34
- duration?: number;
96
+ duration?: ToastDuration;
35
97
  title?: string;
36
98
  detail?: string;
99
+ /** An action button in the toast, such as Undo. See {@link ToastAction}. */
100
+ action?: ToastAction;
101
+ /** `false` leaves the close button out of a short timed toast. See {@link ToastItem.closable}. */
102
+ closable?: boolean;
103
+ /** `false` leaves the time bar out, `true` forces it. See {@link ToastItem.timeLine}. */
104
+ timeLine?: boolean;
37
105
  }): string;
38
106
  export declare function dismissToast(id: string): void;
107
+ /**
108
+ * Moves keyboard focus to the newest toast, so its action can be reached
109
+ * without tabbing through the page. Bind it to a shortcut of your own; the
110
+ * library registers none. Returns false when there is no toast to focus.
111
+ *
112
+ * Focus returns to where it was when that toast is dismissed.
113
+ */
114
+ export declare function focusToasts(): boolean;
@@ -15,8 +15,12 @@ function createToastStore() {
15
15
  duration: options.duration,
16
16
  title: options.title,
17
17
  detail: options.detail,
18
+ action: options.action,
19
+ closable: options.closable,
20
+ timeLine: options.timeLine,
18
21
  };
19
- update((list) => [...list, item]);
22
+ // A toast pushed with the id of one that is showing replaces it where it stands.
23
+ update((list) => list.some((t) => t.id === id) ? list.map((t) => (t.id === id ? item : t)) : [...list, item]);
20
24
  return id;
21
25
  },
22
26
  dismiss,
@@ -32,3 +36,23 @@ export function pushToast(options) {
32
36
  export function dismissToast(id) {
33
37
  toastStore.dismiss(id);
34
38
  }
39
+ /**
40
+ * Moves keyboard focus to the newest toast, so its action can be reached
41
+ * without tabbing through the page. Bind it to a shortcut of your own; the
42
+ * library registers none. Returns false when there is no toast to focus.
43
+ *
44
+ * Focus returns to where it was when that toast is dismissed.
45
+ */
46
+ export function focusToasts() {
47
+ if (typeof document === 'undefined')
48
+ return false;
49
+ const toasts = document.querySelectorAll('[data-zabi-toaster] [data-toast-id]');
50
+ const newest = toasts[toasts.length - 1];
51
+ // The action if the toast has one, else its first control.
52
+ const target = newest?.querySelector('[data-toast-action]') ??
53
+ newest?.querySelector('button');
54
+ if (!target)
55
+ return false;
56
+ target.focus();
57
+ return document.activeElement === target;
58
+ }