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,59 +1,121 @@
1
1
  <script lang="ts">
2
+ import { zabiCommonStrings } from "../util/zabi-strings.js";
2
3
  import type { Snippet } from 'svelte';
3
4
  import {
4
5
  focusFirstElement,
5
- getFocusableElements,
6
+ joinOverlayStack,
7
+ recoverStrayFocus,
6
8
  returnFocus,
7
9
  saveFocus,
8
10
  } from '../util/focus-utils.js';
11
+ import {
12
+ followKeyboard,
13
+ lockBodyScroll,
14
+ registerOverlayFooter,
15
+ registerOverlayHeader,
16
+ trapTabKey,
17
+ } from '../util/overlay.js';
18
+ import { TOUCH_HIT_AREA } from '../util/touch-target.js';
9
19
  import { generateId } from "../util/ssr-safe.js";
10
20
  import { cn } from "../util/cn.js";
21
+ import {
22
+ OVERLAY_CHROME,
23
+ OVERLAY_CLOSE_GLYPH,
24
+ OVERLAY_TITLE_2XL,
25
+ OVERLAY_TITLE_HYPHENS,
26
+ OVERLAY_TITLE_WRAP,
27
+ textIsEnlarged,
28
+ } from "../util/overlay-chrome.js";
29
+ import { attachSheetDrag, FLICK_VELOCITY } from "../util/sheet-drag.js";
11
30
 
12
31
  interface Props {
13
32
  /** Extra classes for the host element. */
14
33
  class?: string;
15
34
  isOpen?: boolean;
16
35
  title?: string;
36
+ /** Accessible name of the close button. */
37
+ closeLabel?: string;
38
+ /**
39
+ * CSS selector, looked up inside the sheet, of the control that takes
40
+ * focus when it opens. Without it, or with no match, the first control does.
41
+ */
42
+ initialFocus?: string;
43
+ /**
44
+ * Adds a grip at the top and lets a swipe down close the sheet. The
45
+ * grip drags from anywhere; a swipe on the content closes only when
46
+ * the content is at its top, and scrolls it otherwise. The close
47
+ * button, the backdrop and Escape stay, so nothing depends on the
48
+ * gesture.
49
+ */
50
+ swipeToClose?: boolean;
51
+ /**
52
+ * Runs when the sheet closes itself, with the event that closed it:
53
+ * the click, the Escape keydown, or the end of a swipe.
54
+ */
17
55
  onclick?: (event: Event) => void;
18
56
  onkeydown?: (event: Event) => void;
19
57
  children?: Snippet;
58
+ /**
59
+ * Pinned to the bottom of the sheet, below the content, which then
60
+ * scrolls on its own: for the buttons of a form. It stays above the
61
+ * on-screen keyboard, and toasts keep off it. Without it the sheet is
62
+ * as it always was: one box that scrolls as a whole.
63
+ */
64
+ footer?: Snippet;
20
65
  }
21
66
 
22
67
  let {
23
68
  class: className = "",
24
- isOpen = $bindable(false),
69
+ isOpen = $bindable<Exclude<Props["isOpen"], undefined>>(),
25
70
  title = '',
71
+ closeLabel: closeLabelGiven,
72
+ initialFocus,
73
+ swipeToClose = false,
26
74
  onclick,
27
75
  onkeydown,
28
76
  children,
77
+ footer,
29
78
  ...restProps
30
79
  }: Props = $props();
31
80
 
81
+ /** Words many components share: a `ZabiStringsProvider` above this one may give them; else English. */
82
+ const common = zabiCommonStrings();
83
+ const closeLabel = $derived(closeLabelGiven ?? common().close);
84
+
85
+ // No fallback on a bindable prop: Svelte refuses `bind:…={undefined}` on
86
+ // one that has a fallback (`props_invalid_value`), and a page that throws
87
+ // while it hydrates never becomes interactive. The default is applied
88
+ // here instead: at once, for the server and the first render, and again
89
+ // whenever a parent hands back `undefined`.
90
+ const applyDefaults = () => {
91
+ if (isOpen === undefined) isOpen = false;
92
+ };
93
+ applyDefaults();
94
+ $effect.pre(applyDefaults);
95
+
32
96
  const slideTitleId = generateId('slideup-title');
33
97
 
34
98
  let slideUpContainer = $state<HTMLDivElement>();
35
- let focusActive = false;
99
+ let grip = $state<HTMLDivElement>();
100
+ let headerElement = $state<HTMLDivElement>();
101
+ let footerElement = $state<HTMLDivElement>();
36
102
 
37
- /** Ref-counted on `<body>`; shares the counter with Modal so nested overlays unlock once. */
38
- function lockBodyScroll(): () => void {
39
- const body = document.body;
40
- const count = Number(body.dataset.zabiScrollLock ?? '0');
41
- if (count === 0) {
42
- body.dataset.zabiScrollLockOverflow = body.style.overflow;
43
- body.style.overflow = 'hidden';
44
- }
45
- body.dataset.zabiScrollLock = String(count + 1);
46
- return () => {
47
- const next = Number(body.dataset.zabiScrollLock ?? '1') - 1;
48
- if (next <= 0) {
49
- body.style.overflow = body.dataset.zabiScrollLockOverflow ?? '';
50
- delete body.dataset.zabiScrollLock;
51
- delete body.dataset.zabiScrollLockOverflow;
52
- } else {
53
- body.dataset.zabiScrollLock = String(next);
54
- }
55
- };
56
- }
103
+ /**
104
+ * Read as the overlay opens: with the text enlarged, a long word in the
105
+ * title is hyphenated before it is cut (util/overlay-chrome.ts).
106
+ */
107
+ let enlargedText = $state(false);
108
+ $effect(() => {
109
+ if (isOpen) enlargedText = textIsEnlarged();
110
+ });
111
+ /** With a footer: the content, which is then what scrolls. */
112
+ let scroller = $state<HTMLDivElement>();
113
+ /** How far a swipe has pulled the sheet down, in px. */
114
+ let dragOffset = $state(0);
115
+ let dragging = $state(false);
116
+ let focusActive = false;
117
+ /** Position among the open overlays; lifts a sheet opened later above the earlier ones. */
118
+ let depth = $state(0);
57
119
 
58
120
  function closeSlideUp(event?: Event) {
59
121
  isOpen = false;
@@ -72,11 +134,32 @@
72
134
  saveFocus();
73
135
  focusActive = true;
74
136
  const unlockScroll = lockBodyScroll();
137
+ const overlay = joinOverlayStack(container);
138
+ depth = overlay.depth;
75
139
  const t = setTimeout(() => {
76
- focusFirstElement(container);
140
+ // Something inside has taken focus already (a field that
141
+ // focuses itself as it mounts): leave it there. `initialFocus`
142
+ // is the consumer saying where focus goes, so it still decides.
143
+ const active = document.activeElement;
144
+ const inside = !!active && active !== container && container.contains(active);
145
+ if (inside && !(initialFocus && container.querySelector(initialFocus))) return;
146
+ focusFirstElement(container, initialFocus);
77
147
  }, 0);
148
+ // If the focused control is disabled or removed, focus lands on
149
+ // `<body>`; take Tab and Escape back from there.
150
+ const stopRecovery = recoverStrayFocus(container, {
151
+ onEscape: (event) => closeSlideUp(event),
152
+ });
153
+ // Where the on-screen keyboard covers the page, the overlay
154
+ // keeps to what is left above it.
155
+ const stopKeyboard = container.parentElement
156
+ ? followKeyboard(container.parentElement)
157
+ : undefined;
78
158
  return () => {
79
159
  clearTimeout(t);
160
+ stopRecovery();
161
+ stopKeyboard?.();
162
+ overlay.leave();
80
163
  unlockScroll();
81
164
  if (focusActive) {
82
165
  focusActive = false;
@@ -86,34 +169,49 @@
86
169
  }
87
170
  });
88
171
 
89
- /** Re-queries focusables on every Tab so late-rendered content stays inside the trap. */
90
- function handleTrapKeydown(event: KeyboardEvent) {
91
- const container = slideUpContainer;
92
- if (event.key !== 'Tab' || !container) return;
93
- const owner = (event.target as Element | null)?.closest?.('[role="dialog"]');
94
- if (owner && owner !== container) return;
95
-
96
- const focusable = getFocusableElements(container);
97
- if (focusable.length === 0) {
98
- event.preventDefault();
99
- container.focus();
100
- return;
101
- }
102
- const first = focusable[0];
103
- const last = focusable[focusable.length - 1];
104
- const active = document.activeElement as HTMLElement | null;
172
+ // For the toast stack: it starts below the header, which holds the close
173
+ // button, and stays off a pinned footer.
174
+ $effect(() => {
175
+ const top = headerElement;
176
+ if (!isOpen || !top) return;
177
+ return registerOverlayHeader(top);
178
+ });
179
+ $effect(() => {
180
+ const pinned = footerElement;
181
+ if (!isOpen || !pinned) return;
182
+ return registerOverlayFooter(pinned);
183
+ });
105
184
 
106
- if (!active || !focusable.includes(active)) {
107
- event.preventDefault();
108
- first.focus();
109
- } else if (event.shiftKey && active === first) {
110
- event.preventDefault();
111
- last.focus();
112
- } else if (!event.shiftKey && active === last) {
113
- event.preventDefault();
114
- first.focus();
115
- }
116
- }
185
+ $effect(() => {
186
+ const container = slideUpContainer;
187
+ const zone = grip;
188
+ // With a footer the content scrolls, not the panel.
189
+ const scrolls = footer ? scroller : container;
190
+ if (!isOpen || !swipeToClose || !container || !zone || !scrolls) return;
191
+ const settle = () => {
192
+ dragging = false;
193
+ dragOffset = 0;
194
+ };
195
+ const stop = attachSheetDrag(
196
+ // Without a footer the panel is its own scrolling box.
197
+ { handleZone: zone, scroller: scrolls },
198
+ {
199
+ onStart: () => (dragging = true),
200
+ // Down only: there is nowhere for it to go upwards.
201
+ onMove: (distance) => (dragOffset = Math.max(0, distance)),
202
+ onEnd(distance, velocity, event) {
203
+ const far = distance > container.getBoundingClientRect().height * 0.3;
204
+ settle();
205
+ if (distance > 0 && (far || velocity >= FLICK_VELOCITY)) closeSlideUp(event);
206
+ },
207
+ onCancel: settle,
208
+ },
209
+ );
210
+ return () => {
211
+ stop();
212
+ settle();
213
+ };
214
+ });
117
215
 
118
216
  function handleBackdropClick(event: Event) {
119
217
  if (event.target === event.currentTarget) {
@@ -134,43 +232,104 @@
134
232
  {#if isOpen}
135
233
  <!-- svelte-ignore a11y_click_events_have_key_events -->
136
234
  <div
137
- class="fixed inset-0 z-modal cursor-pointer bg-overlay"
235
+ class="group/overlay fixed inset-0 z-modal cursor-pointer bg-overlay"
236
+ style:z-index={depth > 0 ? `calc(var(--z-modal) + ${depth})` : undefined}
237
+ data-overlay-depth={depth}
138
238
  onclick={handleBackdropClick}
139
239
  onkeydown={handleKeydown}
140
240
  role="presentation"
141
241
  >
142
242
  <div
143
243
  bind:this={slideUpContainer}
144
- class={cn("fixed bottom-0 left-0 right-0 z-modal flex max-h-[90vh] cursor-default flex-col overflow-y-auto rounded-t-overlay border-t border-border-overlay bg-surface-overlay shadow-lg animate-[slideUp_0.3s_ease-out]", className)}
244
+ class={cn(
245
+ "group-data-keyboard-open/overlay:max-h-full",
246
+ "absolute bottom-0 left-0 right-0 z-modal flex max-h-[90dvh] cursor-default flex-col overflow-y-auto rounded-t-overlay border-t border-border-overlay bg-surface-overlay shadow-lg animate-[slideUp_0.3s_ease-out] motion-reduce:animate-none",
247
+ // With a footer the content scrolls between the header and it.
248
+ footer && "overflow-y-hidden",
249
+ // Back to rest after a swipe that did not close it.
250
+ swipeToClose &&
251
+ "overscroll-contain transition-transform duration-200 ease-out motion-reduce:transition-none",
252
+ className,
253
+ )}
254
+ style:transform={dragOffset > 0 ? `translateY(${dragOffset}px)` : undefined}
255
+ style:transition={dragging ? "none" : undefined}
256
+ data-dragging={dragging ? "true" : undefined}
145
257
  role="dialog"
146
258
  aria-modal="true"
147
259
  aria-labelledby={title ? slideTitleId : undefined}
148
260
  tabindex="-1"
149
- onkeydown={handleTrapKeydown}
261
+ onkeydown={(event) => trapTabKey(slideUpContainer, event)}
150
262
  {...restProps}
151
263
  >
264
+ {#if swipeToClose}
265
+ <!-- Decorative: it adds a gesture, and the close button is the
266
+ control. It stays at the top while the content scrolls.
267
+ `touch-none`: otherwise the browser takes a touch here for
268
+ itself. The bar is drawn in the text colour where colours are
269
+ forced, since a background is dropped there. -->
270
+ <div
271
+ bind:this={grip}
272
+ data-sheet-grip
273
+ aria-hidden="true"
274
+ class="sticky top-0 z-10 flex h-[28px] shrink-0 cursor-grab touch-none items-start justify-center bg-surface-overlay pt-[10px] active:cursor-grabbing {OVERLAY_CHROME}"
275
+ >
276
+ <span
277
+ class="block h-1 w-9 rounded-pill bg-current text-description forced-colors:bg-[CanvasText]"
278
+ ></span>
279
+ </div>
280
+ {/if}
152
281
  {#if title}
153
- <div class="flex items-center justify-between px-6 pb-4 pt-6">
282
+ <!-- Chrome: laid out in px, with a title that stops at 1.3
283
+ times its size (util/overlay-chrome.ts). 12px between a long
284
+ title and the button: the title wraps, the button keeps its size. -->
285
+ <div
286
+ bind:this={headerElement}
287
+ class="flex shrink-0 items-center justify-between gap-[12px] px-6 pb-4 {OVERLAY_CHROME} {swipeToClose
288
+ ? 'pt-2'
289
+ : 'pt-6'}"
290
+ >
154
291
  <h2
155
292
  id={slideTitleId}
156
- class="text-2xl font-normal leading-8 tracking-normal text-headline"
293
+ class="min-w-0 {OVERLAY_TITLE_2XL} font-normal tracking-normal text-headline {OVERLAY_TITLE_WRAP} {enlargedText ? OVERLAY_TITLE_HYPHENS : ''}"
157
294
  >
158
295
  {title}
159
296
  </h2>
160
297
  <button
161
298
  type="button"
162
299
  onclick={closeSlideUp}
163
- class="focus-ring flex h-8 w-8 cursor-pointer items-center justify-center rounded-full text-2xl text-description transition-colors hover:bg-surface-overlay-hover hover:text-headline"
164
- aria-label="Close"
300
+ class="focus-ring pointer-coarse:relative flex h-8 w-8 shrink-0 cursor-pointer items-center justify-center rounded-full {OVERLAY_CLOSE_GLYPH} text-description transition-colors hover:bg-surface-overlay-hover hover:text-headline active:bg-surface-active {TOUCH_HIT_AREA}"
301
+ aria-label={closeLabel}
165
302
  >
166
303
  ×
167
304
  </button>
168
305
  </div>
169
306
  {/if}
170
307
 
171
- <div class="flex-1 px-6 pb-6">
172
- {@render children?.()}
173
- </div>
308
+ {#if footer}
309
+ <!-- `pt-1`: a scroll container clips, and the focus ring of a
310
+ first control needs the room. -->
311
+ <div
312
+ bind:this={scroller}
313
+ data-slide-up-content
314
+ class="min-h-0 flex-1 overflow-y-auto overscroll-contain px-[24px] pt-[4px] pb-[16px]"
315
+ >
316
+ {@render children?.()}
317
+ </div>
318
+ <!-- Clear of the home indicator on a phone; over the keyboard
319
+ that is under the keyboard, and 16px is enough. -->
320
+ <div
321
+ bind:this={footerElement}
322
+ data-slide-up-footer
323
+ class="flex shrink-0 flex-wrap justify-end gap-[8px] border-t border-border-overlay px-[24px] pt-[16px] pb-[calc(16px+env(safe-area-inset-bottom,0px))] group-data-keyboard-open/overlay:pb-[16px]"
324
+ >
325
+ {@render footer()}
326
+ </div>
327
+ {:else}
328
+ <!-- Clear of the home indicator on a phone. -->
329
+ <div class="flex-1 px-[24px] pb-[calc(1.5rem+env(safe-area-inset-bottom,0px))]">
330
+ {@render children?.()}
331
+ </div>
332
+ {/if}
174
333
  </div>
175
334
  </div>
176
335
  {/if}
@@ -4,9 +4,35 @@ interface Props {
4
4
  class?: string;
5
5
  isOpen?: boolean;
6
6
  title?: string;
7
+ /** Accessible name of the close button. */
8
+ closeLabel?: string;
9
+ /**
10
+ * CSS selector, looked up inside the sheet, of the control that takes
11
+ * focus when it opens. Without it, or with no match, the first control does.
12
+ */
13
+ initialFocus?: string;
14
+ /**
15
+ * Adds a grip at the top and lets a swipe down close the sheet. The
16
+ * grip drags from anywhere; a swipe on the content closes only when
17
+ * the content is at its top, and scrolls it otherwise. The close
18
+ * button, the backdrop and Escape stay, so nothing depends on the
19
+ * gesture.
20
+ */
21
+ swipeToClose?: boolean;
22
+ /**
23
+ * Runs when the sheet closes itself, with the event that closed it:
24
+ * the click, the Escape keydown, or the end of a swipe.
25
+ */
7
26
  onclick?: (event: Event) => void;
8
27
  onkeydown?: (event: Event) => void;
9
28
  children?: Snippet;
29
+ /**
30
+ * Pinned to the bottom of the sheet, below the content, which then
31
+ * scrolls on its own: for the buttons of a form. It stays above the
32
+ * on-screen keyboard, and toasts keep off it. Without it the sheet is
33
+ * as it always was: one box that scrolls as a whole.
34
+ */
35
+ footer?: Snippet;
10
36
  }
11
37
  declare const SlideUp: import("svelte").Component<Props, {}, "isOpen">;
12
38
  type SlideUp = ReturnType<typeof SlideUp>;