zabi-components 8.0.0 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (456) hide show
  1. package/CHANGELOG.md +2935 -0
  2. package/README.md +243 -10
  3. package/THEME.md +162 -332
  4. package/THEMING.md +1419 -259
  5. package/dist/atoms/ActionPanel.svelte +15 -5
  6. package/dist/atoms/Avatar.svelte +120 -0
  7. package/dist/atoms/Avatar.svelte.d.ts +46 -0
  8. package/dist/atoms/Badge.svelte +71 -13
  9. package/dist/atoms/Badge.svelte.d.ts +8 -2
  10. package/dist/atoms/Block.svelte +74 -0
  11. package/dist/atoms/Block.svelte.d.ts +29 -0
  12. package/dist/atoms/Button.svelte +217 -30
  13. package/dist/atoms/Button.svelte.d.ts +33 -4
  14. package/dist/atoms/Card.svelte +182 -26
  15. package/dist/atoms/Card.svelte.d.ts +55 -3
  16. package/dist/atoms/CardHeader.svelte +16 -4
  17. package/dist/atoms/Checkbox.svelte +81 -21
  18. package/dist/atoms/Checkbox.svelte.d.ts +31 -2
  19. package/dist/atoms/Chip.svelte +351 -0
  20. package/dist/atoms/Chip.svelte.d.ts +57 -0
  21. package/dist/atoms/CodeBlock.svelte +20 -2
  22. package/dist/atoms/CodeBlock.svelte.d.ts +4 -0
  23. package/dist/atoms/CodeField.svelte +385 -0
  24. package/dist/atoms/CodeField.svelte.d.ts +61 -0
  25. package/dist/atoms/ColorPicker.svelte +260 -49
  26. package/dist/atoms/ColorPicker.svelte.d.ts +3 -0
  27. package/dist/atoms/Container.svelte +16 -8
  28. package/dist/atoms/DateField.svelte +145 -0
  29. package/dist/atoms/DateField.svelte.d.ts +81 -0
  30. package/dist/atoms/FieldMessages.svelte +69 -0
  31. package/dist/atoms/FieldMessages.svelte.d.ts +23 -0
  32. package/dist/atoms/FloatingActionButton.svelte +176 -0
  33. package/dist/atoms/FloatingActionButton.svelte.d.ts +51 -0
  34. package/dist/atoms/Heading.svelte +63 -5
  35. package/dist/atoms/Heading.svelte.d.ts +14 -0
  36. package/dist/atoms/IconButton.svelte +294 -26
  37. package/dist/atoms/IconButton.svelte.d.ts +62 -4
  38. package/dist/atoms/Input.svelte +259 -53
  39. package/dist/atoms/Input.svelte.d.ts +33 -2
  40. package/dist/atoms/List.svelte +5 -1
  41. package/dist/atoms/ListItem.svelte +70 -13
  42. package/dist/atoms/ListItem.svelte.d.ts +11 -0
  43. package/dist/atoms/PickerField.svelte +239 -0
  44. package/dist/atoms/PickerField.svelte.d.ts +67 -0
  45. package/dist/atoms/Progress.svelte +99 -19
  46. package/dist/atoms/Progress.svelte.d.ts +15 -1
  47. package/dist/atoms/Radio.svelte +51 -3
  48. package/dist/atoms/Radio.svelte.d.ts +30 -2
  49. package/dist/atoms/Rating.svelte +620 -0
  50. package/dist/atoms/Rating.svelte.d.ts +77 -0
  51. package/dist/atoms/Select.svelte +438 -98
  52. package/dist/atoms/Select.svelte.d.ts +61 -3
  53. package/dist/atoms/SelectionControl.svelte +193 -23
  54. package/dist/atoms/SelectionControl.svelte.d.ts +29 -3
  55. package/dist/atoms/Skeleton.svelte +114 -18
  56. package/dist/atoms/Skeleton.svelte.d.ts +30 -3
  57. package/dist/atoms/SkeletonGroup.svelte +43 -0
  58. package/dist/atoms/SkeletonGroup.svelte.d.ts +20 -0
  59. package/dist/atoms/Slider.svelte +344 -0
  60. package/dist/atoms/Slider.svelte.d.ts +40 -0
  61. package/dist/atoms/Sparkline.svelte +109 -0
  62. package/dist/atoms/Sparkline.svelte.d.ts +27 -0
  63. package/dist/atoms/SpeechBubble.svelte +187 -0
  64. package/dist/atoms/SpeechBubble.svelte.d.ts +33 -0
  65. package/dist/atoms/Spinner.svelte +57 -0
  66. package/dist/atoms/Spinner.svelte.d.ts +19 -0
  67. package/dist/atoms/Stat.svelte +72 -0
  68. package/dist/atoms/Stat.svelte.d.ts +19 -0
  69. package/dist/atoms/Table.svelte +151 -6
  70. package/dist/atoms/Table.svelte.d.ts +15 -3
  71. package/dist/atoms/TemporalField.svelte +472 -0
  72. package/dist/atoms/TemporalField.svelte.d.ts +48 -0
  73. package/dist/atoms/Text.svelte +23 -11
  74. package/dist/atoms/Text.svelte.d.ts +6 -3
  75. package/dist/atoms/Textarea.svelte +150 -44
  76. package/dist/atoms/Textarea.svelte.d.ts +35 -2
  77. package/dist/atoms/ThemeToggle.svelte +223 -44
  78. package/dist/atoms/ThemeToggle.svelte.d.ts +26 -3
  79. package/dist/atoms/TimeColumn.svelte +150 -0
  80. package/dist/atoms/TimeColumn.svelte.d.ts +25 -0
  81. package/dist/atoms/TimeField.svelte +151 -0
  82. package/dist/atoms/TimeField.svelte.d.ts +85 -0
  83. package/dist/atoms/Toast.svelte +22 -8
  84. package/dist/atoms/Toast.svelte.d.ts +2 -0
  85. package/dist/atoms/Toggle.svelte +98 -14
  86. package/dist/atoms/Toggle.svelte.d.ts +26 -2
  87. package/dist/atoms/Tooltip.svelte +528 -24
  88. package/dist/atoms/Tooltip.svelte.d.ts +18 -0
  89. package/dist/atoms/ZabiStringsProvider.svelte +45 -0
  90. package/dist/atoms/ZabiStringsProvider.svelte.d.ts +27 -0
  91. package/dist/atoms/index.d.ts +38 -0
  92. package/dist/atoms/index.js +29 -0
  93. package/dist/atoms/selection-control.styles.d.ts +47 -5
  94. package/dist/atoms/selection-control.styles.js +52 -10
  95. package/dist/components/atoms/index.d.ts +38 -0
  96. package/dist/components/atoms/index.d.ts.map +1 -1
  97. package/dist/components/atoms/selection-control.styles.d.ts +47 -5
  98. package/dist/components/atoms/selection-control.styles.d.ts.map +1 -1
  99. package/dist/components/index.d.ts +104 -2
  100. package/dist/components/index.d.ts.map +1 -1
  101. package/dist/components/map.d.ts +11 -0
  102. package/dist/components/map.d.ts.map +1 -0
  103. package/dist/components/molecules/index.d.ts +51 -0
  104. package/dist/components/molecules/index.d.ts.map +1 -1
  105. package/dist/components/molecules/toast-store.d.ts +83 -7
  106. package/dist/components/molecules/toast-store.d.ts.map +1 -1
  107. package/dist/components/organisms/index.d.ts +10 -0
  108. package/dist/components/organisms/index.d.ts.map +1 -1
  109. package/dist/components/types/variants.d.ts +24 -1
  110. package/dist/components/types/variants.d.ts.map +1 -1
  111. package/dist/components/util/app-shell.d.ts +79 -0
  112. package/dist/components/util/app-shell.d.ts.map +1 -0
  113. package/dist/components/util/avatar.d.ts +39 -0
  114. package/dist/components/util/avatar.d.ts.map +1 -0
  115. package/dist/components/util/bottom-sheet.d.ts +30 -0
  116. package/dist/components/util/bottom-sheet.d.ts.map +1 -0
  117. package/dist/components/util/bottom-tab-bar.d.ts +41 -0
  118. package/dist/components/util/bottom-tab-bar.d.ts.map +1 -0
  119. package/dist/components/util/calendar.d.ts +56 -0
  120. package/dist/components/util/calendar.d.ts.map +1 -0
  121. package/dist/components/util/chart.d.ts +140 -0
  122. package/dist/components/util/chart.d.ts.map +1 -0
  123. package/dist/components/util/chip.d.ts +66 -0
  124. package/dist/components/util/chip.d.ts.map +1 -0
  125. package/dist/components/util/cn.d.ts.map +1 -1
  126. package/dist/components/util/code-field.d.ts +63 -0
  127. package/dist/components/util/code-field.d.ts.map +1 -0
  128. package/dist/components/util/collapsible.d.ts +64 -0
  129. package/dist/components/util/collapsible.d.ts.map +1 -0
  130. package/dist/components/util/confirm-dialog.d.ts +12 -0
  131. package/dist/components/util/confirm-dialog.d.ts.map +1 -0
  132. package/dist/components/util/date.d.ts +96 -0
  133. package/dist/components/util/date.d.ts.map +1 -0
  134. package/dist/components/util/display-voice.d.ts +10 -0
  135. package/dist/components/util/display-voice.d.ts.map +1 -0
  136. package/dist/components/util/drawer.d.ts +13 -0
  137. package/dist/components/util/drawer.d.ts.map +1 -0
  138. package/dist/components/util/dropdown.d.ts +47 -0
  139. package/dist/components/util/dropdown.d.ts.map +1 -0
  140. package/dist/components/util/field-control.d.ts +30 -0
  141. package/dist/components/util/field-control.d.ts.map +1 -0
  142. package/dist/components/util/field.d.ts +45 -0
  143. package/dist/components/util/field.d.ts.map +1 -0
  144. package/dist/components/util/fit-in-viewport.d.ts +201 -0
  145. package/dist/components/util/fit-in-viewport.d.ts.map +1 -0
  146. package/dist/components/util/focus-utils.d.ts +77 -2
  147. package/dist/components/util/focus-utils.d.ts.map +1 -1
  148. package/dist/components/util/hydration.d.ts +45 -0
  149. package/dist/components/util/hydration.d.ts.map +1 -0
  150. package/dist/components/util/keyboard-inset.d.ts +18 -0
  151. package/dist/components/util/keyboard-inset.d.ts.map +1 -0
  152. package/dist/components/util/map-view.d.ts +144 -0
  153. package/dist/components/util/map-view.d.ts.map +1 -0
  154. package/dist/components/util/media-grid.d.ts +51 -0
  155. package/dist/components/util/media-grid.d.ts.map +1 -0
  156. package/dist/components/util/media.d.ts +6 -0
  157. package/dist/components/util/media.d.ts.map +1 -0
  158. package/dist/components/util/overlay-chrome.d.ts +53 -0
  159. package/dist/components/util/overlay-chrome.d.ts.map +1 -0
  160. package/dist/components/util/overlay.d.ts +72 -0
  161. package/dist/components/util/overlay.d.ts.map +1 -0
  162. package/dist/components/util/photo.d.ts +234 -0
  163. package/dist/components/util/photo.d.ts.map +1 -0
  164. package/dist/components/util/portal.d.ts +23 -0
  165. package/dist/components/util/portal.d.ts.map +1 -0
  166. package/dist/components/util/progress.d.ts +19 -0
  167. package/dist/components/util/progress.d.ts.map +1 -0
  168. package/dist/components/util/pull-to-refresh.d.ts +27 -0
  169. package/dist/components/util/pull-to-refresh.d.ts.map +1 -0
  170. package/dist/components/util/radio-keys.d.ts +25 -0
  171. package/dist/components/util/radio-keys.d.ts.map +1 -0
  172. package/dist/components/util/rating.d.ts +23 -0
  173. package/dist/components/util/rating.d.ts.map +1 -0
  174. package/dist/components/util/ready-made-strings.d.ts +77 -0
  175. package/dist/components/util/ready-made-strings.d.ts.map +1 -0
  176. package/dist/components/util/scroll-edge.d.ts +33 -0
  177. package/dist/components/util/scroll-edge.d.ts.map +1 -0
  178. package/dist/components/util/scroll-padding.d.ts +20 -0
  179. package/dist/components/util/scroll-padding.d.ts.map +1 -0
  180. package/dist/components/util/segmented-control.d.ts +16 -0
  181. package/dist/components/util/segmented-control.d.ts.map +1 -0
  182. package/dist/components/util/select.d.ts +41 -0
  183. package/dist/components/util/select.d.ts.map +1 -0
  184. package/dist/components/util/sheet-drag.d.ts +84 -0
  185. package/dist/components/util/sheet-drag.d.ts.map +1 -0
  186. package/dist/components/util/sidebar.d.ts +63 -0
  187. package/dist/components/util/sidebar.d.ts.map +1 -0
  188. package/dist/components/util/skeleton.d.ts +15 -0
  189. package/dist/components/util/skeleton.d.ts.map +1 -0
  190. package/dist/components/util/sliding-indicator.d.ts +25 -0
  191. package/dist/components/util/sliding-indicator.d.ts.map +1 -0
  192. package/dist/components/util/sortable-list.d.ts +65 -0
  193. package/dist/components/util/sortable-list.d.ts.map +1 -0
  194. package/dist/components/util/stepper.d.ts +40 -0
  195. package/dist/components/util/stepper.d.ts.map +1 -0
  196. package/dist/components/util/swipeable-list-item.d.ts +36 -0
  197. package/dist/components/util/swipeable-list-item.d.ts.map +1 -0
  198. package/dist/components/util/temporal-field.d.ts +89 -0
  199. package/dist/components/util/temporal-field.d.ts.map +1 -0
  200. package/dist/components/util/theme-mode.d.ts +80 -0
  201. package/dist/components/util/theme-mode.d.ts.map +1 -0
  202. package/dist/components/util/toaster.d.ts +133 -0
  203. package/dist/components/util/toaster.d.ts.map +1 -0
  204. package/dist/components/util/tone-surface.d.ts +34 -0
  205. package/dist/components/util/tone-surface.d.ts.map +1 -0
  206. package/dist/components/util/tooltip.d.ts +10 -0
  207. package/dist/components/util/tooltip.d.ts.map +1 -0
  208. package/dist/components/util/top-navbar.d.ts +35 -0
  209. package/dist/components/util/top-navbar.d.ts.map +1 -0
  210. package/dist/components/util/touch-target.d.ts +31 -0
  211. package/dist/components/util/touch-target.d.ts.map +1 -0
  212. package/dist/components/util/zabi-strings.d.ts +142 -0
  213. package/dist/components/util/zabi-strings.d.ts.map +1 -0
  214. package/dist/create-theme/cli.js +173 -0
  215. package/dist/create-theme/index.d.ts +190 -0
  216. package/dist/create-theme/index.js +1034 -0
  217. package/dist/create-theme/lib/ramp-math.js +128 -0
  218. package/dist/create-theme/lib/resolve.js +238 -0
  219. package/dist/create-theme/theme-data.js +2644 -0
  220. package/dist/index.d.ts +104 -2
  221. package/dist/index.js +75 -2
  222. package/dist/map.d.ts +10 -0
  223. package/dist/map.js +9 -0
  224. package/dist/molecules/Alert.svelte +63 -16
  225. package/dist/molecules/Alert.svelte.d.ts +14 -1
  226. package/dist/molecules/AppBar.svelte +674 -0
  227. package/dist/molecules/AppBar.svelte.d.ts +131 -0
  228. package/dist/molecules/AvatarGroup.svelte +116 -0
  229. package/dist/molecules/AvatarGroup.svelte.d.ts +40 -0
  230. package/dist/molecules/BarChart.svelte +381 -0
  231. package/dist/molecules/BarChart.svelte.d.ts +45 -0
  232. package/dist/molecules/BottomSheet.svelte +608 -0
  233. package/dist/molecules/BottomSheet.svelte.d.ts +109 -0
  234. package/dist/molecules/BottomTabBar.svelte +403 -0
  235. package/dist/molecules/BottomTabBar.svelte.d.ts +98 -0
  236. package/dist/molecules/Calendar.svelte +597 -0
  237. package/dist/molecules/Calendar.svelte.d.ts +72 -0
  238. package/dist/molecules/ChipGroup.svelte +325 -0
  239. package/dist/molecules/ChipGroup.svelte.d.ts +41 -0
  240. package/dist/molecules/Collapsible.svelte +347 -0
  241. package/dist/molecules/Collapsible.svelte.d.ts +61 -0
  242. package/dist/molecules/CollapsibleGroup.svelte +136 -0
  243. package/dist/molecules/CollapsibleGroup.svelte.d.ts +14 -0
  244. package/dist/molecules/ComponentDemo.svelte +16 -4
  245. package/dist/molecules/ComponentDemo.svelte.d.ts +3 -0
  246. package/dist/molecules/ConfirmDialog.svelte +257 -0
  247. package/dist/molecules/ConfirmDialog.svelte.d.ts +58 -0
  248. package/dist/molecules/ContactForm.svelte +34 -17
  249. package/dist/molecules/ContactForm.svelte.d.ts +8 -0
  250. package/dist/molecules/Drawer.svelte +415 -0
  251. package/dist/molecules/Drawer.svelte.d.ts +55 -0
  252. package/dist/molecules/Dropdown.svelte +517 -48
  253. package/dist/molecules/Dropdown.svelte.d.ts +47 -6
  254. package/dist/molecules/DropdownItem.svelte +122 -0
  255. package/dist/molecules/DropdownItem.svelte.d.ts +28 -0
  256. package/dist/molecules/EmptyState.svelte +55 -10
  257. package/dist/molecules/EmptyState.svelte.d.ts +8 -0
  258. package/dist/molecules/FormField.svelte +9 -1
  259. package/dist/molecules/FormField.svelte.d.ts +2 -0
  260. package/dist/molecules/Header.svelte +1 -1
  261. package/dist/molecules/ImageUpload.svelte +492 -69
  262. package/dist/molecules/ImageUpload.svelte.d.ts +82 -2
  263. package/dist/molecules/LineChart.svelte +459 -0
  264. package/dist/molecules/LineChart.svelte.d.ts +53 -0
  265. package/dist/molecules/MapView.svelte +565 -0
  266. package/dist/molecules/MapView.svelte.d.ts +88 -0
  267. package/dist/molecules/MediaGrid.svelte +527 -0
  268. package/dist/molecules/MediaGrid.svelte.d.ts +77 -0
  269. package/dist/molecules/Modal.svelte +293 -72
  270. package/dist/molecules/Modal.svelte.d.ts +51 -2
  271. package/dist/molecules/NavigationMenuContent.svelte +58 -1
  272. package/dist/molecules/NavigationMenuItem.svelte +0 -1
  273. package/dist/molecules/NavigationMenuLink.svelte +1 -1
  274. package/dist/molecules/NavigationMenuList.svelte +10 -3
  275. package/dist/molecules/NavigationMenuTrigger.svelte +2 -2
  276. package/dist/molecules/Page.svelte +32 -2
  277. package/dist/molecules/Page.svelte.d.ts +11 -0
  278. package/dist/molecules/PhotoGrid.svelte +523 -0
  279. package/dist/molecules/PhotoGrid.svelte.d.ts +73 -0
  280. package/dist/molecules/PhotoViewer.svelte +1213 -0
  281. package/dist/molecules/PhotoViewer.svelte.d.ts +74 -0
  282. package/dist/molecules/PieChart.svelte +421 -0
  283. package/dist/molecules/PieChart.svelte.d.ts +51 -0
  284. package/dist/molecules/PropsTable.svelte +22 -10
  285. package/dist/molecules/PropsTable.svelte.d.ts +3 -0
  286. package/dist/molecules/PullToRefresh.svelte +263 -0
  287. package/dist/molecules/PullToRefresh.svelte.d.ts +52 -0
  288. package/dist/molecules/RadioGroup.svelte +72 -18
  289. package/dist/molecules/RadioGroup.svelte.d.ts +19 -3
  290. package/dist/molecules/Section.svelte +1 -1
  291. package/dist/molecules/SegmentedControl.svelte +456 -0
  292. package/dist/molecules/SegmentedControl.svelte.d.ts +40 -0
  293. package/dist/molecules/SidebarBrandHeader.svelte +11 -1
  294. package/dist/molecules/SidebarBrandHeader.svelte.d.ts +3 -0
  295. package/dist/molecules/SidebarFooter.svelte +30 -7
  296. package/dist/molecules/SidebarFooter.svelte.d.ts +3 -0
  297. package/dist/molecules/SidebarNavSection.svelte +1 -1
  298. package/dist/molecules/SlideUp.svelte +220 -61
  299. package/dist/molecules/SlideUp.svelte.d.ts +26 -0
  300. package/dist/molecules/SortableList.svelte +633 -0
  301. package/dist/molecules/SortableList.svelte.d.ts +69 -0
  302. package/dist/molecules/Stepper.svelte +562 -0
  303. package/dist/molecules/Stepper.svelte.d.ts +39 -0
  304. package/dist/molecules/StickyActionBar.svelte +250 -0
  305. package/dist/molecules/StickyActionBar.svelte.d.ts +78 -0
  306. package/dist/molecules/SwipeableListItem.svelte +334 -0
  307. package/dist/molecules/SwipeableListItem.svelte.d.ts +54 -0
  308. package/dist/molecules/Tabs.svelte +310 -9
  309. package/dist/molecules/Tabs.svelte.d.ts +7 -0
  310. package/dist/molecules/Toaster.svelte +514 -5
  311. package/dist/molecules/Toaster.svelte.d.ts +153 -2
  312. package/dist/molecules/ToasterToast.svelte +495 -77
  313. package/dist/molecules/ToasterToast.svelte.d.ts +15 -0
  314. package/dist/molecules/UnsavedChangesBar.svelte +223 -0
  315. package/dist/molecules/UnsavedChangesBar.svelte.d.ts +43 -0
  316. package/dist/molecules/index.d.ts +51 -0
  317. package/dist/molecules/index.js +31 -0
  318. package/dist/molecules/toast-store.d.ts +83 -7
  319. package/dist/molecules/toast-store.js +25 -1
  320. package/dist/organisms/AppNavigation.svelte +440 -0
  321. package/dist/organisms/AppNavigation.svelte.d.ts +72 -0
  322. package/dist/organisms/AppShell.svelte +696 -0
  323. package/dist/organisms/AppShell.svelte.d.ts +157 -0
  324. package/dist/organisms/AppShellHeaderPart.svelte +163 -0
  325. package/dist/organisms/AppShellHeaderPart.svelte.d.ts +57 -0
  326. package/dist/organisms/SidebarAccountPanel.svelte +107 -12
  327. package/dist/organisms/SidebarAccountPanel.svelte.d.ts +19 -0
  328. package/dist/organisms/SidebarNavigation.svelte +111 -43
  329. package/dist/organisms/SidebarNavigation.svelte.d.ts +29 -1
  330. package/dist/organisms/SidebarPanel.svelte +34 -17
  331. package/dist/organisms/SidebarPanel.svelte.d.ts +1 -0
  332. package/dist/organisms/SidebarShell.svelte +164 -14
  333. package/dist/organisms/SidebarShell.svelte.d.ts +56 -2
  334. package/dist/organisms/TopNavbar.svelte +353 -39
  335. package/dist/organisms/TopNavbar.svelte.d.ts +47 -0
  336. package/dist/organisms/TopNavbarSheetContent.svelte +145 -0
  337. package/dist/organisms/TopNavbarSheetContent.svelte.d.ts +24 -0
  338. package/dist/organisms/index.d.ts +10 -0
  339. package/dist/organisms/index.js +7 -0
  340. package/dist/types/components.d.ts +21 -1
  341. package/dist/types/components.d.ts.map +1 -1
  342. package/dist/types/index.d.ts +1093 -26
  343. package/dist/types/index.d.ts.map +1 -1
  344. package/dist/types/variants.ts +28 -1
  345. package/dist/util/app-shell.d.ts +78 -0
  346. package/dist/util/app-shell.js +97 -0
  347. package/dist/util/avatar.d.ts +38 -0
  348. package/dist/util/avatar.js +52 -0
  349. package/dist/util/bottom-sheet.d.ts +29 -0
  350. package/dist/util/bottom-sheet.js +43 -0
  351. package/dist/util/bottom-tab-bar.d.ts +40 -0
  352. package/dist/util/bottom-tab-bar.js +54 -0
  353. package/dist/util/calendar.d.ts +55 -0
  354. package/dist/util/calendar.js +74 -0
  355. package/dist/util/chart.d.ts +139 -0
  356. package/dist/util/chart.js +305 -0
  357. package/dist/util/chip.d.ts +65 -0
  358. package/dist/util/chip.js +58 -0
  359. package/dist/util/cn.js +28 -2
  360. package/dist/util/code-field.d.ts +62 -0
  361. package/dist/util/code-field.js +112 -0
  362. package/dist/util/collapsible.d.ts +63 -0
  363. package/dist/util/collapsible.js +23 -0
  364. package/dist/util/confirm-dialog.d.ts +11 -0
  365. package/dist/util/confirm-dialog.js +2 -0
  366. package/dist/util/date.d.ts +95 -0
  367. package/dist/util/date.js +237 -0
  368. package/dist/util/display-voice.d.ts +9 -0
  369. package/dist/util/display-voice.js +9 -0
  370. package/dist/util/drawer.d.ts +12 -0
  371. package/dist/util/drawer.js +7 -0
  372. package/dist/util/dropdown.d.ts +46 -0
  373. package/dist/util/dropdown.js +21 -0
  374. package/dist/util/field-control.d.ts +29 -0
  375. package/dist/util/field-control.js +32 -0
  376. package/dist/util/field.d.ts +44 -0
  377. package/dist/util/field.js +38 -0
  378. package/dist/util/fit-in-viewport.d.ts +200 -0
  379. package/dist/util/fit-in-viewport.js +399 -0
  380. package/dist/util/focus-utils.d.ts +77 -2
  381. package/dist/util/focus-utils.js +186 -9
  382. package/dist/util/hydration.d.ts +44 -0
  383. package/dist/util/hydration.js +58 -0
  384. package/dist/util/keyboard-inset.d.ts +17 -0
  385. package/dist/util/keyboard-inset.js +53 -0
  386. package/dist/util/map-view.d.ts +143 -0
  387. package/dist/util/map-view.js +121 -0
  388. package/dist/util/media-grid.d.ts +50 -0
  389. package/dist/util/media-grid.js +81 -0
  390. package/dist/util/media.d.ts +5 -0
  391. package/dist/util/media.js +10 -0
  392. package/dist/util/overlay-chrome.d.ts +52 -0
  393. package/dist/util/overlay-chrome.js +56 -0
  394. package/dist/util/overlay.d.ts +71 -0
  395. package/dist/util/overlay.js +240 -0
  396. package/dist/util/photo.d.ts +233 -0
  397. package/dist/util/photo.js +209 -0
  398. package/dist/util/portal.d.ts +22 -0
  399. package/dist/util/portal.js +50 -0
  400. package/dist/util/progress.d.ts +18 -0
  401. package/dist/util/progress.js +17 -0
  402. package/dist/util/pull-to-refresh.d.ts +26 -0
  403. package/dist/util/pull-to-refresh.js +30 -0
  404. package/dist/util/radio-keys.d.ts +24 -0
  405. package/dist/util/radio-keys.js +49 -0
  406. package/dist/util/rating.d.ts +22 -0
  407. package/dist/util/rating.js +26 -0
  408. package/dist/util/ready-made-strings.d.ts +76 -0
  409. package/dist/util/ready-made-strings.js +67 -0
  410. package/dist/util/scroll-edge.d.ts +32 -0
  411. package/dist/util/scroll-edge.js +87 -0
  412. package/dist/util/scroll-padding.d.ts +19 -0
  413. package/dist/util/scroll-padding.js +44 -0
  414. package/dist/util/segmented-control.d.ts +15 -0
  415. package/dist/util/segmented-control.js +1 -0
  416. package/dist/util/select.d.ts +40 -0
  417. package/dist/util/select.js +63 -0
  418. package/dist/util/sheet-drag.d.ts +83 -0
  419. package/dist/util/sheet-drag.js +311 -0
  420. package/dist/util/sidebar.d.ts +62 -0
  421. package/dist/util/sidebar.js +38 -0
  422. package/dist/util/skeleton.d.ts +14 -0
  423. package/dist/util/skeleton.js +22 -0
  424. package/dist/util/sliding-indicator.d.ts +24 -0
  425. package/dist/util/sliding-indicator.js +44 -0
  426. package/dist/util/sortable-list.d.ts +64 -0
  427. package/dist/util/sortable-list.js +53 -0
  428. package/dist/util/stepper.d.ts +39 -0
  429. package/dist/util/stepper.js +38 -0
  430. package/dist/util/swipeable-list-item.d.ts +35 -0
  431. package/dist/util/swipeable-list-item.js +32 -0
  432. package/dist/util/temporal-field.d.ts +88 -0
  433. package/dist/util/temporal-field.js +136 -0
  434. package/dist/util/theme-mode.d.ts +79 -0
  435. package/dist/util/theme-mode.js +121 -0
  436. package/dist/util/toaster.d.ts +132 -0
  437. package/dist/util/toaster.js +130 -0
  438. package/dist/util/tone-surface.d.ts +33 -0
  439. package/dist/util/tone-surface.js +35 -0
  440. package/dist/util/tooltip.d.ts +9 -0
  441. package/dist/util/tooltip.js +18 -0
  442. package/dist/util/top-navbar.d.ts +34 -0
  443. package/dist/util/top-navbar.js +28 -0
  444. package/dist/util/touch-target.d.ts +30 -0
  445. package/dist/util/touch-target.js +30 -0
  446. package/dist/util/zabi-strings.d.ts +141 -0
  447. package/dist/util/zabi-strings.js +105 -0
  448. package/dist/zabi-components-colors.css +11 -2
  449. package/dist/zabi-components-theme-dark-only.css +870 -258
  450. package/dist/zabi-components-theme-dark.css +870 -258
  451. package/dist/zabi-components-theme-only.css +2419 -368
  452. package/dist/zabi-components-theme.css +2419 -368
  453. package/dist/zabi-components.css +6032 -711
  454. package/docs/lucide-icons.md +40 -17
  455. package/docs/theme-imports.md +81 -11
  456. package/package.json +45 -8
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Where a key moves the selection in a radio group laid out in a row, as
3
+ * Rating and SegmentedControl are. Kept out of the components so it can be
4
+ * tested without a DOM.
5
+ *
6
+ * It is the native radio contract: Right and Down go to the next option, Left
7
+ * and Up to the previous one, both wrap, and Left and Right swap in a
8
+ * right-to-left layout.
9
+ *
10
+ * `current` is the option that has focus, which is not always the selected
11
+ * one: a screen reader's cursor can put focus on any radio, and the keys then
12
+ * move from where the user is. It is -1 when focus is on none of them: the
13
+ * next option is then the first, and the previous one the last.
14
+ *
15
+ * `hasSelection` is false while the group is empty. A forward key then selects
16
+ * the focused option itself instead of stepping over it, so Right on an empty
17
+ * rating gives one star, not two.
18
+ *
19
+ * Returns -1 for a key that is not a navigation key, or when there is nothing
20
+ * to move to.
21
+ */
22
+ export function radioKeyIndex(key, current, count, rtl = false, hasSelection = true) {
23
+ if (count <= 0)
24
+ return -1;
25
+ if (key === "Home")
26
+ return 0;
27
+ if (key === "End")
28
+ return count - 1;
29
+ let delta = 0;
30
+ if (key === "ArrowDown")
31
+ delta = 1;
32
+ else if (key === "ArrowUp")
33
+ delta = -1;
34
+ else if (key === "ArrowRight")
35
+ delta = rtl ? -1 : 1;
36
+ else if (key === "ArrowLeft")
37
+ delta = rtl ? 1 : -1;
38
+ if (delta === 0)
39
+ return -1;
40
+ if (current < 0 || current >= count)
41
+ return delta > 0 ? 0 : count - 1;
42
+ if (!hasSelection && delta > 0)
43
+ return current;
44
+ return (current + delta + count) % count;
45
+ }
46
+ /** Whether `node` is laid out right to left. */
47
+ export function isRtl(node) {
48
+ return getComputedStyle(node).direction === "rtl";
49
+ }
@@ -0,0 +1,22 @@
1
+ /** Types and pure helpers for `Rating`. Kept out of the component so they can be tested without a DOM. */
2
+ /** Every built-in string. Pass a partial object to `strings` to translate. */
3
+ export interface RatingStrings {
4
+ /**
5
+ * Accessible name of one star ("4 of 5 stars"), and of a read-only
6
+ * rating as a whole ("3.5 of 5 stars"). `value` is already formatted.
7
+ */
8
+ starLabel: (value: string, max: number) => string;
9
+ /** Accessible name of the clear button that `clearable` adds. */
10
+ clearLabel: string;
11
+ /** Shown, and read, for a read-only rating without a value. */
12
+ noRating: string;
13
+ }
14
+ export declare const RATING_STRINGS: RatingStrings;
15
+ /** Number of stars: a whole number, at least one. */
16
+ export declare function starCount(max: number): number;
17
+ /** `value` held within 0..max; `null` for no rating or a value that is not a number. */
18
+ export declare function clampRating(value: number | null | undefined, max: number): number | null;
19
+ /** How much of star `star` (counted from 1) is filled, 0 to 1. */
20
+ export declare function starFill(value: number | null, star: number): number;
21
+ /** The value with at most one decimal: 4, 3.5, 3.7. */
22
+ export declare function defaultRatingFormat(value: number): string;
@@ -0,0 +1,26 @@
1
+ /** Types and pure helpers for `Rating`. Kept out of the component so they can be tested without a DOM. */
2
+ export const RATING_STRINGS = {
3
+ starLabel: (value, max) => `${value} of ${max} stars`,
4
+ clearLabel: "Clear rating",
5
+ noRating: "No rating",
6
+ };
7
+ /** Number of stars: a whole number, at least one. */
8
+ export function starCount(max) {
9
+ return Number.isFinite(max) ? Math.max(1, Math.floor(max)) : 5;
10
+ }
11
+ /** `value` held within 0..max; `null` for no rating or a value that is not a number. */
12
+ export function clampRating(value, max) {
13
+ if (value === null || value === undefined || !Number.isFinite(value))
14
+ return null;
15
+ return Math.max(0, Math.min(max, value));
16
+ }
17
+ /** How much of star `star` (counted from 1) is filled, 0 to 1. */
18
+ export function starFill(value, star) {
19
+ if (value === null)
20
+ return 0;
21
+ return Math.max(0, Math.min(1, value - (star - 1)));
22
+ }
23
+ /** The value with at most one decimal: 4, 3.5, 3.7. */
24
+ export function defaultRatingFormat(value) {
25
+ return String(Math.round(value * 10) / 10);
26
+ }
@@ -0,0 +1,76 @@
1
+ /**
2
+ * The words of the components that come with text of their own: the colour
3
+ * picker, the ready-made contact form, and the two the docs site is built
4
+ * from. Each takes its own as `strings`; what is left out stays as it is here.
5
+ */
6
+ /** `ColorPicker`. */
7
+ export interface ColorPickerStrings {
8
+ /** Accessible name of the field the hex value is typed in. */
9
+ hexInput: string;
10
+ /** Accessible name of the swatch button that opens the picker. */
11
+ open: string;
12
+ /** Accessible name of the picker that opens. */
13
+ picker: string;
14
+ /** Accessible name of the hue slider in it. */
15
+ hue: string;
16
+ /** Accessible name of the colour map: the two sliders below, on one surface. */
17
+ area: string;
18
+ /** Accessible name of the map's slider that goes across. */
19
+ saturation: string;
20
+ /** Accessible name of the map's slider that goes up and down. */
21
+ lightness: string;
22
+ /** The message under the field while what is typed is not a hex colour. */
23
+ invalidHex: string;
24
+ }
25
+ export declare const DEFAULT_COLOR_PICKER_STRINGS: ColorPickerStrings;
26
+ /** `ContactForm`: every label, placeholder and message of the form. */
27
+ export interface ContactFormStrings {
28
+ heading: string;
29
+ nameLabel: string;
30
+ namePlaceholder: string;
31
+ emailLabel: string;
32
+ emailPlaceholder: string;
33
+ messageLabel: string;
34
+ messagePlaceholder: string;
35
+ subscribeLabel: string;
36
+ submit: string;
37
+ /** Under a field left empty or filled in wrongly. */
38
+ nameRequired: string;
39
+ emailRequired: string;
40
+ emailInvalid: string;
41
+ messageRequired: string;
42
+ /** The box above the fields when the form could not be sent: its three lines. */
43
+ errorTitle: string;
44
+ errorMessage: string;
45
+ errorRecovery: string;
46
+ }
47
+ export declare const DEFAULT_CONTACT_FORM_STRINGS: ContactFormStrings;
48
+ /** `PropsTable`. The caption is the `caption` prop. */
49
+ export interface PropsTableStrings {
50
+ name: string;
51
+ type: string;
52
+ required: string;
53
+ default: string;
54
+ description: string;
55
+ yes: string;
56
+ no: string;
57
+ /** Shown instead of the table when there are no props. */
58
+ empty: string;
59
+ }
60
+ export declare const DEFAULT_PROPS_TABLE_STRINGS: PropsTableStrings;
61
+ /** `ComponentDemo`. */
62
+ export interface ComponentDemoStrings {
63
+ /** The two tabs, and what the switch between them is called. */
64
+ preview: string;
65
+ code: string;
66
+ showPreview: string;
67
+ showCode: string;
68
+ }
69
+ export declare const DEFAULT_COMPONENT_DEMO_STRINGS: ComponentDemoStrings;
70
+ /**
71
+ * Lays `strings` layers over a component's defaults, later layers winning. A
72
+ * key whose value is `undefined` is skipped, so `strings={{ close: t.close }}`
73
+ * with `t.close` missing keeps the default instead of blanking it. `null` and
74
+ * the empty string are kept: those are choices.
75
+ */
76
+ export declare function mergeStrings<T extends object>(defaults: T, ...layers: Array<Partial<T> | null | undefined>): T;
@@ -0,0 +1,67 @@
1
+ /**
2
+ * The words of the components that come with text of their own: the colour
3
+ * picker, the ready-made contact form, and the two the docs site is built
4
+ * from. Each takes its own as `strings`; what is left out stays as it is here.
5
+ */
6
+ export const DEFAULT_COLOR_PICKER_STRINGS = {
7
+ hexInput: "Hex color input",
8
+ open: "Open color picker",
9
+ picker: "Color picker",
10
+ hue: "Hue slider",
11
+ area: "Saturation and lightness",
12
+ saturation: "Saturation",
13
+ lightness: "Lightness",
14
+ invalidHex: "Please enter a valid hex color (e.g., #ff0000 or #f00)",
15
+ };
16
+ export const DEFAULT_CONTACT_FORM_STRINGS = {
17
+ heading: "Get in Touch",
18
+ nameLabel: "Name",
19
+ namePlaceholder: "Enter your name",
20
+ emailLabel: "Email",
21
+ emailPlaceholder: "Enter your email",
22
+ messageLabel: "Message",
23
+ messagePlaceholder: "Enter your message",
24
+ subscribeLabel: "Subscribe to updates",
25
+ submit: "Send Message",
26
+ nameRequired: "Please enter your name.",
27
+ emailRequired: "Please enter your email address.",
28
+ emailInvalid: "Please enter a valid email address.",
29
+ messageRequired: "Please enter a message.",
30
+ errorTitle: "Something went wrong",
31
+ errorMessage: "We could not submit your request. Fix the highlighted fields and try again.",
32
+ errorRecovery: "Recovery action: review your inputs and resubmit.",
33
+ };
34
+ export const DEFAULT_PROPS_TABLE_STRINGS = {
35
+ name: "Name",
36
+ type: "Type",
37
+ required: "Required",
38
+ default: "Default",
39
+ description: "Description",
40
+ yes: "Yes",
41
+ no: "No",
42
+ empty: "No documented props.",
43
+ };
44
+ export const DEFAULT_COMPONENT_DEMO_STRINGS = {
45
+ preview: "Preview",
46
+ code: "Code",
47
+ showPreview: "Show preview",
48
+ showCode: "Show code",
49
+ };
50
+ /**
51
+ * Lays `strings` layers over a component's defaults, later layers winning. A
52
+ * key whose value is `undefined` is skipped, so `strings={{ close: t.close }}`
53
+ * with `t.close` missing keeps the default instead of blanking it. `null` and
54
+ * the empty string are kept: those are choices.
55
+ */
56
+ export function mergeStrings(defaults, ...layers) {
57
+ const merged = { ...defaults };
58
+ for (const layer of layers) {
59
+ if (!layer)
60
+ continue;
61
+ for (const [key, value] of Object.entries(layer)) {
62
+ if (value !== undefined)
63
+ merged[key] = value;
64
+ }
65
+ }
66
+ return merged;
67
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Whether content is under a bar (D123): the one thing a bar needs to know to
3
+ * choose between flush with the page and glass.
4
+ *
5
+ * Pure DOM, no Svelte. `AppShell` uses it on its scroller and shares the
6
+ * result with the bars inside it; a bar on its own uses it on its nearest
7
+ * scroll parent, or on the window.
8
+ */
9
+ /** `scrollEdge` on a bar: follow the scroll position, or force the glass on or off. */
10
+ export type ScrollEdgeMode = "auto" | "always" | "never";
11
+ export interface ScrollEdge {
12
+ /** Scrolled away from the start: content is under a bar at the top. */
13
+ top: boolean;
14
+ /** Not at the end: content is under a bar at the bottom. */
15
+ bottom: boolean;
16
+ }
17
+ /** The edges for a scroll position, clamped against rubber-banding past either end. */
18
+ export declare function measureScrollEdge(position: number, scrollable: number, topThreshold?: number): ScrollEdge;
19
+ /** The value a bar writes as `data-scrolled-under`: the mode, or what the scroll position says. */
20
+ export declare function resolveScrolledUnder(mode: ScrollEdgeMode | undefined, auto: boolean): boolean;
21
+ /**
22
+ * Reports `{ top, bottom }` for `container` (null for the window): once on
23
+ * start, then whenever either changes. It listens to `scroll` (passive) and,
24
+ * where `ResizeObserver` exists, to the size of the container and of what is
25
+ * in it, since content that grows or shrinks moves the end. Returns the
26
+ * cleanup. Call it in the browser.
27
+ *
28
+ * `topThreshold` (px, default 0) is how far it has to scroll before `top` is
29
+ * true: a bar with a large title is only over content once the large row has
30
+ * gone under it. Call it again to change it.
31
+ */
32
+ export declare function watchScrollEdge(container: HTMLElement | null, onChange: (edge: ScrollEdge) => void, topThreshold?: number): () => void;
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Whether content is under a bar (D123): the one thing a bar needs to know to
3
+ * choose between flush with the page and glass.
4
+ *
5
+ * Pure DOM, no Svelte. `AppShell` uses it on its scroller and shares the
6
+ * result with the bars inside it; a bar on its own uses it on its nearest
7
+ * scroll parent, or on the window.
8
+ */
9
+ /** Less than this from the end counts as being at the end (fractional scroll positions). */
10
+ const END_TOLERANCE = 1;
11
+ /** The edges for a scroll position, clamped against rubber-banding past either end. */
12
+ export function measureScrollEdge(position, scrollable, topThreshold = 0) {
13
+ const end = Math.max(0, scrollable);
14
+ const at = Math.min(Math.max(0, position), end);
15
+ return { top: at > topThreshold, bottom: end - at > END_TOLERANCE };
16
+ }
17
+ /** The value a bar writes as `data-scrolled-under`: the mode, or what the scroll position says. */
18
+ export function resolveScrolledUnder(mode, auto) {
19
+ if (mode === "always")
20
+ return true;
21
+ if (mode === "never")
22
+ return false;
23
+ return auto;
24
+ }
25
+ /**
26
+ * Reports `{ top, bottom }` for `container` (null for the window): once on
27
+ * start, then whenever either changes. It listens to `scroll` (passive) and,
28
+ * where `ResizeObserver` exists, to the size of the container and of what is
29
+ * in it, since content that grows or shrinks moves the end. Returns the
30
+ * cleanup. Call it in the browser.
31
+ *
32
+ * `topThreshold` (px, default 0) is how far it has to scroll before `top` is
33
+ * true: a bar with a large title is only over content once the large row has
34
+ * gone under it. Call it again to change it.
35
+ */
36
+ export function watchScrollEdge(container, onChange, topThreshold = 0) {
37
+ const target = container ?? window;
38
+ let last;
39
+ const measure = () => {
40
+ const root = document.documentElement;
41
+ const edge = container
42
+ ? measureScrollEdge(container.scrollTop, container.scrollHeight - container.clientHeight, topThreshold)
43
+ : measureScrollEdge(window.scrollY, root.scrollHeight - window.innerHeight, topThreshold);
44
+ if (last && last.top === edge.top && last.bottom === edge.bottom)
45
+ return;
46
+ last = edge;
47
+ onChange(edge);
48
+ };
49
+ target.addEventListener("scroll", measure, { passive: true });
50
+ measure();
51
+ let sizes;
52
+ let nodes;
53
+ if (typeof ResizeObserver !== "undefined") {
54
+ const sized = new ResizeObserver(measure);
55
+ sizes = sized;
56
+ const watch = () => {
57
+ sized.disconnect();
58
+ if (container) {
59
+ sized.observe(container);
60
+ for (const child of container.children)
61
+ sized.observe(child);
62
+ }
63
+ else {
64
+ sized.observe(document.documentElement);
65
+ sized.observe(document.body);
66
+ }
67
+ };
68
+ watch();
69
+ // What is inside a scroller comes and goes: follow it.
70
+ if (container && typeof MutationObserver !== "undefined") {
71
+ nodes = new MutationObserver(() => {
72
+ watch();
73
+ measure();
74
+ });
75
+ nodes.observe(container, { childList: true });
76
+ }
77
+ }
78
+ if (!container)
79
+ window.addEventListener("resize", measure);
80
+ return () => {
81
+ target.removeEventListener("scroll", measure);
82
+ if (!container)
83
+ window.removeEventListener("resize", measure);
84
+ sizes?.disconnect();
85
+ nodes?.disconnect();
86
+ };
87
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * `scroll-padding-bottom` on a scrolling box, shared between the things that
3
+ * lie over its bottom edge.
4
+ *
5
+ * Each of them saves what was there and puts it back when it leaves. Done one
6
+ * by one that goes wrong as soon as two overlap in time: the second saves the
7
+ * first one's value as "what was there", and if the first leaves first, the
8
+ * second later restores a value nobody owns any more. Here the box's own
9
+ * value is saved once, the largest request is what is set, and the box gets
10
+ * its own value back when the last request is released.
11
+ */
12
+ /**
13
+ * Asks for room at the bottom of `container`. `set` gives or changes the
14
+ * amount in px; `release` withdraws the request. Call it in the browser.
15
+ */
16
+ export declare function reserveScrollPaddingBottom(container: HTMLElement): {
17
+ set: (px: number) => void;
18
+ release: () => void;
19
+ };
@@ -0,0 +1,44 @@
1
+ /**
2
+ * `scroll-padding-bottom` on a scrolling box, shared between the things that
3
+ * lie over its bottom edge.
4
+ *
5
+ * Each of them saves what was there and puts it back when it leaves. Done one
6
+ * by one that goes wrong as soon as two overlap in time: the second saves the
7
+ * first one's value as "what was there", and if the first leaves first, the
8
+ * second later restores a value nobody owns any more. Here the box's own
9
+ * value is saved once, the largest request is what is set, and the box gets
10
+ * its own value back when the last request is released.
11
+ */
12
+ const reservations = new WeakMap();
13
+ function apply(container, reservation) {
14
+ const largest = Math.max(0, ...reservation.requests.values());
15
+ container.style.scrollPaddingBottom = `${largest}px`;
16
+ }
17
+ /**
18
+ * Asks for room at the bottom of `container`. `set` gives or changes the
19
+ * amount in px; `release` withdraws the request. Call it in the browser.
20
+ */
21
+ export function reserveScrollPaddingBottom(container) {
22
+ const key = Symbol("scroll-padding");
23
+ let reservation = reservations.get(container);
24
+ if (!reservation) {
25
+ reservation = { original: container.style.scrollPaddingBottom, requests: new Map() };
26
+ reservations.set(container, reservation);
27
+ }
28
+ const mine = reservation;
29
+ return {
30
+ set(px) {
31
+ mine.requests.set(key, px);
32
+ apply(container, mine);
33
+ },
34
+ release() {
35
+ mine.requests.delete(key);
36
+ if (mine.requests.size > 0) {
37
+ apply(container, mine);
38
+ return;
39
+ }
40
+ container.style.scrollPaddingBottom = mine.original;
41
+ reservations.delete(container);
42
+ },
43
+ };
44
+ }
@@ -0,0 +1,15 @@
1
+ import type { Component } from "svelte";
2
+ /** An icon component, as `@lucide/svelte` icons are. */
3
+ export type SegmentedControlIcon = Component<{
4
+ size?: number;
5
+ class?: string;
6
+ }>;
7
+ /** One entry of SegmentedControl's `options`. */
8
+ export interface SegmentedControlOption {
9
+ value: string;
10
+ label: string;
11
+ /** Rendered before the label. Decorative: the label names the segment. */
12
+ icon?: SegmentedControlIcon;
13
+ /** A disabled segment cannot be chosen, and the arrow keys skip it. */
14
+ disabled?: boolean;
15
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Every word a `Select` says by itself, shown or only read out. An app in
3
+ * another language passes its own through `strings`; what it leaves out stays
4
+ * as it is here. The older props for six of them (`placeholder`,
5
+ * `searchPlaceholder`, `noResultsText`, `loadingText`, `emptyStateTitle`,
6
+ * `emptyStateDescription`) still work, and win over `strings`.
7
+ */
8
+ export interface SelectStrings {
9
+ /** Shown in the field while nothing is chosen, and the first, empty option of the native select. */
10
+ placeholder: string;
11
+ /** Placeholder and accessible name of the search field above the options. */
12
+ searchPlaceholder: string;
13
+ /** Shown in the list when the search matches nothing. */
14
+ noResults: string;
15
+ /** Shown in the field and in the list while `isLoading`. */
16
+ loading: string;
17
+ /** Heading of the box shown in the list when there are no options at all. */
18
+ emptyTitle: string;
19
+ /** The line under that heading. */
20
+ emptyDescription: string;
21
+ /** Accessible name of the list of options. */
22
+ listLabel: string;
23
+ /** Accessible name of the close button of the sheet the list opens in on a phone. */
24
+ closeLabel: string;
25
+ /** Accessible name of that sheet's grip while its button takes the sheet up to full height. */
26
+ expandLabel: string;
27
+ /** The same, while it takes the sheet back down. */
28
+ collapseLabel: string;
29
+ }
30
+ export declare const DEFAULT_SELECT_STRINGS: SelectStrings;
31
+ /** How a Select shows its options. See the `presentation` prop. */
32
+ export type SelectPresentation = "auto" | "popover" | "sheet" | "native";
33
+ /** Marks the native `<select>` a Select renders, so a choice made in it before the page hydrates can be found. */
34
+ export declare const NATIVE_SELECT_ATTRIBUTE = "data-zabi-select";
35
+ /**
36
+ * What the visitor (or the browser, restoring a form) chose in `element`
37
+ * before its component mounted; `undefined` when it still has the value the
38
+ * server rendered, and for an element this module never saw.
39
+ */
40
+ export declare function choiceBeforeMount(element: Element): string | undefined;
@@ -0,0 +1,63 @@
1
+ export const DEFAULT_SELECT_STRINGS = {
2
+ placeholder: "Select an option",
3
+ searchPlaceholder: "Search options",
4
+ noResults: "No results found",
5
+ loading: "Loading options...",
6
+ emptyTitle: "No options available",
7
+ emptyDescription: "Add an option to start making selections.",
8
+ listLabel: "Select options",
9
+ closeLabel: "Close",
10
+ expandLabel: "Expand",
11
+ collapseLabel: "Collapse",
12
+ };
13
+ /** Marks the native `<select>` a Select renders, so a choice made in it before the page hydrates can be found. */
14
+ export const NATIVE_SELECT_ATTRIBUTE = "data-zabi-select";
15
+ /**
16
+ * What a visitor chose in each server-rendered native select before the
17
+ * component took it over.
18
+ *
19
+ * The server's HTML carries a real `<select>`, and it works at once: a
20
+ * visitor can choose from it while the scripts are still on their way, and
21
+ * the browser may put an earlier choice back into it after a reload or a
22
+ * step back. When the component then hydrates it renders the value it was
23
+ * given, which would silently undo that. So when this module loads, which is
24
+ * before anything hydrates, each select's value is noted beside the value
25
+ * the server rendered it with (its `selected` option, or else its first),
26
+ * and every change after that is noted too. The component asks for its own
27
+ * element's when it mounts.
28
+ *
29
+ * Only a value that differs from the rendered one is a choice. A select that
30
+ * nobody touched is not, whatever it shows: it used to be compared with the
31
+ * component's prop instead, and a value with no option of its own (its
32
+ * options still loading, or simply not among them) was replaced by whatever
33
+ * the select happened to fall back to.
34
+ */
35
+ const seenBeforeMount = new WeakMap();
36
+ /** The value a select has when nobody has touched it: that of the option with the `selected` attribute, or of the first. */
37
+ function renderedValue(element) {
38
+ const options = [...element.options];
39
+ return (options.find((option) => option.defaultSelected) ?? options[0])?.value ?? "";
40
+ }
41
+ if (typeof document !== "undefined") {
42
+ const selector = `select[${NATIVE_SELECT_ATTRIBUTE}]`;
43
+ for (const element of document.querySelectorAll(selector)) {
44
+ seenBeforeMount.set(element, { rendered: renderedValue(element), value: element.value });
45
+ }
46
+ document.addEventListener("change", (event) => {
47
+ const target = event.target;
48
+ if (target instanceof HTMLSelectElement && target.matches(selector)) {
49
+ const seen = seenBeforeMount.get(target);
50
+ if (seen)
51
+ seen.value = target.value;
52
+ }
53
+ }, true);
54
+ }
55
+ /**
56
+ * What the visitor (or the browser, restoring a form) chose in `element`
57
+ * before its component mounted; `undefined` when it still has the value the
58
+ * server rendered, and for an element this module never saw.
59
+ */
60
+ export function choiceBeforeMount(element) {
61
+ const seen = seenBeforeMount.get(element);
62
+ return seen && seen.value !== seen.rendered ? seen.value : undefined;
63
+ }
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Dragging a bottom sheet with a finger or a pointer. Shared by `BottomSheet`
3
+ * and `SlideUp`, so the two cannot disagree on what a swipe is.
4
+ *
5
+ * It only reports the gesture: how far the pointer has travelled since the
6
+ * drag began and how fast it was going at the end. What that means (move the
7
+ * panel, snap, close) is the caller's.
8
+ */
9
+ export interface SheetDragCallbacks {
10
+ /** Asked when a gesture could begin. Return false to leave it alone. */
11
+ canStart?: () => boolean;
12
+ onStart?: () => void;
13
+ /** `distance` in px since the drag began; positive is down. */
14
+ onMove: (distance: number) => void;
15
+ /** `velocity` in px per ms over the last moments of the drag; positive is down. */
16
+ onEnd: (distance: number, velocity: number, event: Event) => void;
17
+ /** The browser took the gesture back (a call came in, the pointer was lost). */
18
+ onCancel?: () => void;
19
+ }
20
+ export interface SheetDragTargets {
21
+ /**
22
+ * The grip and the area around it. A drag that starts here moves the
23
+ * sheet in either direction. Give it `touch-action: none`.
24
+ */
25
+ handleZone: HTMLElement;
26
+ /**
27
+ * The scrolling content. A touch that starts here scrolls it; only a
28
+ * downward swipe that begins with the content at its top moves the sheet,
29
+ * and not one that begins on a box inside it that scrolls itself or on
30
+ * something that handles its own gesture: marked `data-sheet-no-drag`,
31
+ * a range input, or with a `touch-action` that gives up vertical
32
+ * panning (`contentTakesTouch`). A swipe that begins sideways stays
33
+ * sideways and never moves the sheet.
34
+ */
35
+ scroller?: HTMLElement | null;
36
+ }
37
+ /** Movement under this many px is a press, not a drag. */
38
+ export declare const DRAG_SLOP = 6;
39
+ /**
40
+ * Movement, on either axis, after which a touch in the content has an axis:
41
+ * more across than down is sideways (a carousel, a row that scrolls, a
42
+ * swipeable item), and stays so until the finger lifts.
43
+ */
44
+ export declare const AXIS_SLOP = 8;
45
+ /**
46
+ * Whether a touch that begins on `target` belongs to the content and not to the
47
+ * sheet: it started on something that is dragged itself (`OWN_DRAG`), or it
48
+ * has, between it and the sheet's `scroller`, a box that scrolls on the y axis
49
+ * or one whose `touch-action` leaves vertical panning to the page's own code
50
+ * (`ownsVerticalGesture`: a map, a canvas, a drawing pad, a slider).
51
+ * A box that can scroll keeps the gesture whether it is at its top or not: a
52
+ * drag that sometimes scrolls a list and sometimes closes the sheet cannot be
53
+ * predicted, and the list does not hand over what it cannot use
54
+ * (`overscroll-contain`). The scroller itself is not asked here; it is the
55
+ * sheet's own content, and hands a pull down at its top to the sheet.
56
+ */
57
+ export declare function contentTakesTouch(target: EventTarget | null, scroller: HTMLElement): boolean;
58
+ /**
59
+ * When a pointer or touch event happened: its own `timeStamp`, which is when
60
+ * the finger moved. The time the handler runs is later by however busy the
61
+ * page is, and unevenly so, which made a flick on a janky frame (or a loaded
62
+ * machine) measure slower than it was and spring back. An event without a
63
+ * usable stamp gets the clock.
64
+ */
65
+ export declare function timeOf(event: Event): number;
66
+ /**
67
+ * How fast a pointer was moving over the last moments of a gesture, on one
68
+ * axis. Also used by `PhotoViewer`, for both axes.
69
+ */
70
+ export declare function createVelocityTracker(): {
71
+ reset(y: number, time: number): void;
72
+ add(y: number, time: number): void;
73
+ velocity(): number;
74
+ };
75
+ /**
76
+ * Listens for drags on a sheet. Call it when the sheet is open, in the
77
+ * browser, and call the returned function when it closes.
78
+ */
79
+ export declare function attachSheetDrag({ handleZone, scroller }: SheetDragTargets, callbacks: SheetDragCallbacks): () => void;
80
+ /** A flick: faster than this, in px per ms, and the direction decides, not the distance. */
81
+ export declare const FLICK_VELOCITY = 0.5;
82
+ /** True where the user has asked for less motion, or where that cannot be asked. */
83
+ export declare function prefersReducedMotion(): boolean;