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,7 +1,10 @@
1
1
  <script lang="ts">
2
+ import { zabiCommonStrings } from "../util/zabi-strings.js";
2
3
  import type { Snippet } from "svelte";
3
4
  import type { HTMLAttributes } from "svelte/elements";
5
+ import Drawer from "../molecules/Drawer.svelte";
4
6
  import { cn } from "../util/cn.js";
7
+ import type { DrawerCloseReason } from "../util/drawer.js";
5
8
 
6
9
  /**
7
10
  * The chrome of a sidebar and nothing else: width, surface, collapse
@@ -28,8 +31,37 @@
28
31
  * {/snippet}
29
32
  * </SidebarShell>
30
33
  * ```
34
+ *
35
+ * A sidebar is 266px wide, which a phone does not have beside its
36
+ * content. With `mobile="drawer"` the rail is only there from the `lg`
37
+ * breakpoint (1024px) up; below it the same regions open in a Drawer from
38
+ * the start edge, with the Drawer's focus trap, Escape and backdrop:
39
+ *
40
+ * ```svelte
41
+ * <SidebarShell mobile="drawer" bind:isOpen drawerTitle="Menu">
42
+ * {#snippet trigger({ props, toggle })}
43
+ * <IconButton label="Menu" onclick={toggle} {...props}><Menu /></IconButton>
44
+ * {/snippet}
45
+ * …
46
+ * </SidebarShell>
47
+ * ```
48
+ *
49
+ * `trigger` is rendered where the rail would be, below `lg` only; leave
50
+ * it out and open the drawer from a button of your own by setting
51
+ * `isOpen`. The drawer closes when a link in it is followed.
31
52
  */
32
53
 
54
+ /** What the `trigger` snippet gets. */
55
+ export interface SidebarTriggerContext {
56
+ isOpen: boolean;
57
+ toggle: () => void;
58
+ /** Spread on the button: it says what the button opens, and whether it is open. */
59
+ props: { "aria-haspopup": "dialog"; "aria-expanded": boolean };
60
+ }
61
+
62
+ /** What closed the drawer: the user, a link that was followed, or the screen reaching `lg`. */
63
+ export type SidebarDrawerCloseReason = DrawerCloseReason | "navigate" | "resize";
64
+
33
65
  /** Passed to every region so it can match the shell's collapse and inset. */
34
66
  export interface SidebarRegionContext {
35
67
  collapsed: boolean;
@@ -37,11 +69,34 @@
37
69
  insetX: string;
38
70
  }
39
71
 
40
- type Props = Omit<HTMLAttributes<HTMLElement>, "class"> & {
72
+ // `children` here is a snippet that takes the region context; the one in
73
+ // `HTMLAttributes` takes nothing, and the two together accepted neither.
74
+ type Props = Omit<HTMLAttributes<HTMLElement>, "class" | "onclose" | "children"> & {
41
75
  mode?: "expanded" | "collapsed";
42
76
  /** `rail` attaches to the viewport edge; `card` is a floating panel. */
43
77
  layout?: "rail" | "card";
44
78
  ariaLabel?: string;
79
+ /** Accessible name of the scrolling region between header and footer. */
80
+ label?: string;
81
+ /**
82
+ * What the sidebar is below the `lg` breakpoint. `none`: the rail, as
83
+ * everywhere. `drawer`: the rail is hidden there and its regions open
84
+ * in a Drawer from the start edge instead.
85
+ */
86
+ mobile?: "none" | "drawer";
87
+ /** Whether the drawer is open. Bindable. Only used with `mobile="drawer"`. */
88
+ isOpen?: boolean;
89
+ /** Heading of the drawer, and its accessible name. Without it, `ariaLabel` is. */
90
+ drawerTitle?: string;
91
+ /** Accessible name of the drawer's close button. */
92
+ closeLabel?: string;
93
+ /** Fired when the drawer closes itself, with why. */
94
+ onclose?: (detail: { reason: SidebarDrawerCloseReason }) => void;
95
+ /**
96
+ * The button that opens the drawer, rendered in the rail's place below
97
+ * `lg`. Optional: a button anywhere that sets `isOpen` does the same.
98
+ */
99
+ trigger?: Snippet<[SidebarTriggerContext]>;
45
100
  class?: string;
46
101
  /** @deprecated use `class`. */
47
102
  className?: string;
@@ -57,6 +112,13 @@
57
112
  mode = "expanded",
58
113
  layout = "rail",
59
114
  ariaLabel = "Sidebar navigation",
115
+ label = "Navigation links",
116
+ mobile = "none",
117
+ isOpen = $bindable<Exclude<Props["isOpen"], undefined>>(),
118
+ drawerTitle = undefined,
119
+ closeLabel: closeLabelGiven,
120
+ onclose,
121
+ trigger,
60
122
  class: classAttr = "",
61
123
  className: legacyClass = "",
62
124
  header,
@@ -65,6 +127,21 @@
65
127
  ...restProps
66
128
  }: Props = $props();
67
129
 
130
+ // No fallback on a bindable prop: Svelte refuses `bind:…={undefined}` on
131
+ // one that has a fallback (`props_invalid_value`), and a page that throws
132
+ // while it hydrates never becomes interactive. The default is applied
133
+ // here instead: at once, for the server and the first render, and again
134
+ // whenever a parent hands back `undefined`.
135
+ const applyDefaults = () => {
136
+ if (isOpen === undefined) isOpen = false;
137
+ };
138
+ applyDefaults();
139
+ $effect.pre(applyDefaults);
140
+
141
+ /** Words many components share: a `ZabiStringsProvider` above this one may give them; else English. */
142
+ const common = zabiCommonStrings();
143
+ const closeLabel = $derived(closeLabelGiven ?? common().close);
144
+
68
145
  const className = $derived(cn(classAttr, legacyClass));
69
146
  const isCollapsed = $derived(mode === "collapsed");
70
147
  const isCard = $derived(layout === "card");
@@ -73,40 +150,113 @@
73
150
 
74
151
  const containerClasses = $derived.by(() => {
75
152
  const widthClass = isCollapsed ? "w-[72px]" : "w-[266px]";
76
- const railSurface = "border-r border-border bg-background text-headline";
77
- const cardSurface =
78
- "border-r border-border bg-background text-headline shadow-sm";
153
+ const railSurface = "border-r border-border-weak bg-surface-chrome text-headline";
154
+ const cardSurface = "border-r border-border-weak bg-surface-chrome text-headline";
79
155
  const surfaceClasses = isCard ? cardSurface : railSurface;
80
156
  const verticalPad = isCard ? "py-4" : "py-5";
81
- const baseClasses = `flex h-full min-h-0 max-h-full flex-col overflow-visible ${verticalPad}`;
157
+ // `flex` and `max-lg:hidden` must not both apply below `lg`: with
158
+ // the drawer mode the rail is a flex box from `lg` up only.
159
+ const display = asDrawer ? "hidden lg:flex" : "flex";
160
+ const baseClasses = `${display} h-full min-h-0 max-h-full flex-col overflow-visible ${verticalPad}`;
82
161
 
83
162
  return cn(`${baseClasses} ${widthClass} ${surfaceClasses} ${className}`);
84
163
  });
85
164
 
86
165
  const region = $derived({ collapsed: isCollapsed, insetX });
166
+
167
+ const asDrawer = $derived(mobile === "drawer");
168
+ /** In the drawer the sidebar is always spelled out, and the drawer's own padding is the inset. */
169
+ const drawerRegion: SidebarRegionContext = { collapsed: false, insetX: "px-0" };
170
+
171
+ function closeDrawer(reason: SidebarDrawerCloseReason) {
172
+ if (!isOpen) return;
173
+ isOpen = false;
174
+ onclose?.({ reason });
175
+ }
176
+
177
+ // From `lg` up the rail is there: a drawer left open would cover it.
178
+ $effect(() => {
179
+ if (!asDrawer || typeof window.matchMedia !== "function") return;
180
+ const wide = window.matchMedia("(min-width: 1024px)");
181
+ const onChange = () => {
182
+ if (wide.matches) closeDrawer("resize");
183
+ };
184
+ onChange();
185
+ wide.addEventListener("change", onChange);
186
+ return () => wide.removeEventListener("change", onChange);
187
+ });
188
+
189
+ /** A link in the drawer was followed: the page it leads to is behind the drawer. */
190
+ function handleDrawerClick(event: MouseEvent) {
191
+ if (!(event.target instanceof Element)) return;
192
+ if (event.target.closest("a[href]")) closeDrawer("navigate");
193
+ }
194
+
195
+ const triggerContext = $derived<SidebarTriggerContext>({
196
+ isOpen,
197
+ toggle: () => (isOpen ? closeDrawer("close-button") : (isOpen = true)),
198
+ props: { "aria-haspopup": "dialog", "aria-expanded": isOpen },
199
+ });
87
200
  </script>
88
201
 
89
- <nav class={containerClasses} aria-label={ariaLabel} {...restProps}>
90
- <div class="flex min-h-0 w-full min-w-0 flex-1 flex-col">
202
+ {#snippet regions(context: SidebarRegionContext, inDrawer: boolean)}
203
+ <div class={cn("flex w-full min-w-0 flex-col", !inDrawer && "min-h-0 flex-1")}>
91
204
  {#if header}
92
- <div class={cn("flex w-full shrink-0 flex-col gap-5 pb-3", insetX)}>
93
- {@render header(region)}
205
+ <div class={cn("flex w-full shrink-0 flex-col gap-5 pb-3", context.insetX)}>
206
+ {@render header(context)}
94
207
  </div>
95
208
  {/if}
96
209
 
210
+ <!-- In the drawer the drawer's body scrolls, so this region does not. -->
97
211
  <div
98
212
  class={cn(
99
- "flex min-h-0 min-w-0 flex-1 flex-col gap-3 overflow-y-auto overflow-x-hidden overscroll-y-contain pt-4 pb-2",
100
- insetX,
213
+ "flex min-w-0 flex-col gap-3 pt-4 pb-2",
214
+ !inDrawer &&
215
+ "min-h-0 flex-1 overflow-y-auto overflow-x-hidden overscroll-y-contain",
216
+ context.insetX,
101
217
  )}
102
218
  role="region"
103
- aria-label="Navigation links"
219
+ aria-label={label}
104
220
  >
105
- {@render children?.(region)}
221
+ {@render children?.(context)}
106
222
  </div>
107
223
  </div>
108
224
 
109
225
  {#if footer}
110
- {@render footer(region)}
226
+ {@render footer(context)}
111
227
  {/if}
228
+ {/snippet}
229
+
230
+ <nav class={containerClasses} aria-label={ariaLabel} {...restProps}>
231
+ {@render regions(region, false)}
112
232
  </nav>
233
+
234
+ {#if asDrawer}
235
+ {#if trigger}
236
+ <div class="lg:hidden" data-sidebar-trigger>
237
+ {@render trigger(triggerContext)}
238
+ </div>
239
+ {/if}
240
+ <!-- The same regions, in a Drawer. Rendered only while it is open, so
241
+ nothing of the sidebar is in the page twice until then, and the server
242
+ renders the rail alone. -->
243
+ <Drawer
244
+ bind:isOpen
245
+ side="start"
246
+ size="sm"
247
+ title={drawerTitle || ariaLabel}
248
+ {closeLabel}
249
+ onclose={(detail) => onclose?.(detail)}
250
+ class="lg:hidden"
251
+ >
252
+ <!-- svelte-ignore a11y_click_events_have_key_events, a11y_no_noninteractive_element_interactions -->
253
+ <nav
254
+ class="flex w-full min-w-0 flex-col text-headline"
255
+ aria-label={ariaLabel}
256
+ data-sidebar-drawer
257
+ onclick={handleDrawerClick}
258
+ >
259
+ {@render regions(drawerRegion, true)}
260
+ </nav>
261
+ </Drawer>
262
+ {/if}
@@ -1,5 +1,6 @@
1
1
  import type { Snippet } from "svelte";
2
2
  import type { HTMLAttributes } from "svelte/elements";
3
+ import type { DrawerCloseReason } from "../util/drawer.js";
3
4
  /**
4
5
  * The chrome of a sidebar and nothing else: width, surface, collapse
5
6
  * behaviour, the inset its regions share, and a scroll container for the
@@ -25,18 +26,71 @@ import type { HTMLAttributes } from "svelte/elements";
25
26
  * {/snippet}
26
27
  * </SidebarShell>
27
28
  * ```
29
+ *
30
+ * A sidebar is 266px wide, which a phone does not have beside its
31
+ * content. With `mobile="drawer"` the rail is only there from the `lg`
32
+ * breakpoint (1024px) up; below it the same regions open in a Drawer from
33
+ * the start edge, with the Drawer's focus trap, Escape and backdrop:
34
+ *
35
+ * ```svelte
36
+ * <SidebarShell mobile="drawer" bind:isOpen drawerTitle="Menu">
37
+ * {#snippet trigger({ props, toggle })}
38
+ * <IconButton label="Menu" onclick={toggle} {...props}><Menu /></IconButton>
39
+ * {/snippet}
40
+ * …
41
+ * </SidebarShell>
42
+ * ```
43
+ *
44
+ * `trigger` is rendered where the rail would be, below `lg` only; leave
45
+ * it out and open the drawer from a button of your own by setting
46
+ * `isOpen`. The drawer closes when a link in it is followed.
28
47
  */
48
+ /** What the `trigger` snippet gets. */
49
+ export interface SidebarTriggerContext {
50
+ isOpen: boolean;
51
+ toggle: () => void;
52
+ /** Spread on the button: it says what the button opens, and whether it is open. */
53
+ props: {
54
+ "aria-haspopup": "dialog";
55
+ "aria-expanded": boolean;
56
+ };
57
+ }
58
+ /** What closed the drawer: the user, a link that was followed, or the screen reaching `lg`. */
59
+ export type SidebarDrawerCloseReason = DrawerCloseReason | "navigate" | "resize";
29
60
  /** Passed to every region so it can match the shell's collapse and inset. */
30
61
  export interface SidebarRegionContext {
31
62
  collapsed: boolean;
32
63
  /** Horizontal padding utility the shell's own regions use. */
33
64
  insetX: string;
34
65
  }
35
- type Props = Omit<HTMLAttributes<HTMLElement>, "class"> & {
66
+ type Props = Omit<HTMLAttributes<HTMLElement>, "class" | "onclose" | "children"> & {
36
67
  mode?: "expanded" | "collapsed";
37
68
  /** `rail` attaches to the viewport edge; `card` is a floating panel. */
38
69
  layout?: "rail" | "card";
39
70
  ariaLabel?: string;
71
+ /** Accessible name of the scrolling region between header and footer. */
72
+ label?: string;
73
+ /**
74
+ * What the sidebar is below the `lg` breakpoint. `none`: the rail, as
75
+ * everywhere. `drawer`: the rail is hidden there and its regions open
76
+ * in a Drawer from the start edge instead.
77
+ */
78
+ mobile?: "none" | "drawer";
79
+ /** Whether the drawer is open. Bindable. Only used with `mobile="drawer"`. */
80
+ isOpen?: boolean;
81
+ /** Heading of the drawer, and its accessible name. Without it, `ariaLabel` is. */
82
+ drawerTitle?: string;
83
+ /** Accessible name of the drawer's close button. */
84
+ closeLabel?: string;
85
+ /** Fired when the drawer closes itself, with why. */
86
+ onclose?: (detail: {
87
+ reason: SidebarDrawerCloseReason;
88
+ }) => void;
89
+ /**
90
+ * The button that opens the drawer, rendered in the rail's place below
91
+ * `lg`. Optional: a button anywhere that sets `isOpen` does the same.
92
+ */
93
+ trigger?: Snippet<[SidebarTriggerContext]>;
40
94
  class?: string;
41
95
  /** @deprecated use `class`. */
42
96
  className?: string;
@@ -47,6 +101,6 @@ type Props = Omit<HTMLAttributes<HTMLElement>, "class"> & {
47
101
  /** Account row, logout, theme toggle. Outside the scroll container. */
48
102
  footer?: Snippet<[SidebarRegionContext]>;
49
103
  };
50
- declare const SidebarShell: import("svelte").Component<Props, {}, "">;
104
+ declare const SidebarShell: import("svelte").Component<Props, {}, "isOpen">;
51
105
  type SidebarShell = ReturnType<typeof SidebarShell>;
52
106
  export default SidebarShell;