@getmicdrop/svelte-components 5.17.1 → 5.17.3

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 (382) hide show
  1. package/dist/calendar/AboutShow/AboutShow.svelte +187 -187
  2. package/dist/calendar/Calendar/MiniMonthCalendar.svelte +782 -782
  3. package/dist/calendar/FAQs/FAQs.svelte +77 -77
  4. package/dist/calendar/MonthSwitcher/MonthSwitcher.svelte +126 -126
  5. package/dist/calendar/OrderSummary/OrderSummary.svelte +457 -457
  6. package/dist/calendar/PublicCard/PublicCard.svelte +146 -146
  7. package/dist/calendar/ShowCard/ShowCard.svelte +157 -157
  8. package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte +61 -61
  9. package/dist/components/Heading.spec.d.ts +2 -0
  10. package/dist/components/Heading.spec.d.ts.map +1 -0
  11. package/dist/components/Heading.spec.js +89 -0
  12. package/dist/components/Heading.svelte +60 -60
  13. package/dist/components/Layout/AppShell.svelte +104 -104
  14. package/dist/components/Layout/ContentSection.svelte +80 -80
  15. package/dist/components/Layout/Grid.svelte +4 -4
  16. package/dist/components/Layout/Heading.svelte +81 -81
  17. package/dist/components/Layout/PageContainer.svelte +69 -69
  18. package/dist/components/Layout/Responsive.svelte +75 -75
  19. package/dist/components/Layout/Section.svelte +80 -80
  20. package/dist/components/Layout/ShowOnDesktop.svelte +37 -37
  21. package/dist/components/Layout/ShowOnMobile.svelte +37 -37
  22. package/dist/components/Layout/Sidebar.svelte +108 -108
  23. package/dist/components/Layout/Stack.spec.js +1 -1
  24. package/dist/components/Layout/Stack.svelte +6 -6
  25. package/dist/components/Layout/Text.svelte +87 -87
  26. package/dist/components/Layout/TwoColumn.svelte +108 -108
  27. package/dist/components/Layout/__tests__/AppShell.test.js +140 -0
  28. package/dist/components/Text.spec.d.ts +2 -0
  29. package/dist/components/Text.spec.d.ts.map +1 -0
  30. package/dist/components/Text.spec.js +89 -0
  31. package/dist/components/Text.svelte +53 -53
  32. package/dist/constants/validation.js +91 -91
  33. package/dist/constants/validation.spec.js +64 -64
  34. package/dist/datetime/__tests__/format.test.js +1 -1
  35. package/dist/datetime/__tests__/parse.test.js +1 -1
  36. package/dist/datetime/__tests__/timezone.test.js +1 -1
  37. package/dist/datetime/parse.js +1 -1
  38. package/dist/forms/createFormStore.svelte.js +1 -0
  39. package/dist/forms/createFormStore.svelte.spec.d.ts +2 -0
  40. package/dist/forms/createFormStore.svelte.spec.d.ts.map +1 -0
  41. package/dist/forms/createFormStore.svelte.spec.js +388 -0
  42. package/dist/index.js +57 -57
  43. package/dist/index.spec.js +369 -369
  44. package/dist/patterns/chat/ChatActivityNotice.spec.d.ts +2 -0
  45. package/dist/patterns/chat/ChatActivityNotice.spec.d.ts.map +1 -0
  46. package/dist/patterns/chat/ChatActivityNotice.spec.js +59 -0
  47. package/dist/patterns/chat/ChatActivityNotice.svelte +41 -41
  48. package/dist/patterns/chat/ChatBubble.spec.d.ts +2 -0
  49. package/dist/patterns/chat/ChatBubble.spec.d.ts.map +1 -0
  50. package/dist/patterns/chat/ChatBubble.spec.js +91 -0
  51. package/dist/patterns/chat/ChatBubble.svelte +95 -95
  52. package/dist/patterns/chat/ChatContainer.spec.d.ts +2 -0
  53. package/dist/patterns/chat/ChatContainer.spec.d.ts.map +1 -0
  54. package/dist/patterns/chat/ChatContainer.spec.js +30 -0
  55. package/dist/patterns/chat/ChatContainer.svelte +46 -46
  56. package/dist/patterns/chat/ChatDateDivider.spec.d.ts +2 -0
  57. package/dist/patterns/chat/ChatDateDivider.spec.d.ts.map +1 -0
  58. package/dist/patterns/chat/ChatDateDivider.spec.js +30 -0
  59. package/dist/patterns/chat/ChatDateDivider.svelte +27 -27
  60. package/dist/patterns/chat/ChatInvitationBubble.spec.d.ts +2 -0
  61. package/dist/patterns/chat/ChatInvitationBubble.spec.d.ts.map +1 -0
  62. package/dist/patterns/chat/ChatInvitationBubble.spec.js +46 -0
  63. package/dist/patterns/chat/ChatInvitationBubble.svelte +37 -37
  64. package/dist/patterns/chat/ChatInvitationNotice.spec.d.ts +2 -0
  65. package/dist/patterns/chat/ChatInvitationNotice.spec.d.ts.map +1 -0
  66. package/dist/patterns/chat/ChatInvitationNotice.spec.js +32 -0
  67. package/dist/patterns/chat/ChatInvitationNotice.svelte +27 -27
  68. package/dist/patterns/chat/ChatMessageGroup.spec.d.ts +2 -0
  69. package/dist/patterns/chat/ChatMessageGroup.spec.d.ts.map +1 -0
  70. package/dist/patterns/chat/ChatMessageGroup.spec.js +58 -0
  71. package/dist/patterns/chat/ChatMessageGroup.svelte +57 -57
  72. package/dist/patterns/chat/ChatSlotUpdate.spec.d.ts +2 -0
  73. package/dist/patterns/chat/ChatSlotUpdate.spec.d.ts.map +1 -0
  74. package/dist/patterns/chat/ChatSlotUpdate.spec.js +65 -0
  75. package/dist/patterns/chat/ChatSlotUpdate.svelte +46 -46
  76. package/dist/patterns/chat/ChatStatusBadge.spec.d.ts +2 -0
  77. package/dist/patterns/chat/ChatStatusBadge.spec.d.ts.map +1 -0
  78. package/dist/patterns/chat/ChatStatusBadge.spec.js +79 -0
  79. package/dist/patterns/chat/ChatStatusBadge.svelte +91 -91
  80. package/dist/patterns/chat/ChatStatusTransition.spec.d.ts +2 -0
  81. package/dist/patterns/chat/ChatStatusTransition.spec.d.ts.map +1 -0
  82. package/dist/patterns/chat/ChatStatusTransition.spec.js +81 -0
  83. package/dist/patterns/chat/ChatStatusTransition.svelte +64 -64
  84. package/dist/patterns/chat/ChatTextBubble.spec.d.ts +2 -0
  85. package/dist/patterns/chat/ChatTextBubble.spec.d.ts.map +1 -0
  86. package/dist/patterns/chat/ChatTextBubble.spec.js +35 -0
  87. package/dist/patterns/chat/ChatTextBubble.svelte +41 -41
  88. package/dist/patterns/chat/index.js +22 -22
  89. package/dist/patterns/data/DataGrid.svelte +45 -45
  90. package/dist/patterns/data/DataList.svelte +24 -24
  91. package/dist/patterns/data/DataTable.spec.js +61 -0
  92. package/dist/patterns/data/DataTable.svelte +36 -36
  93. package/dist/patterns/forms/FormActions.spec.js +95 -95
  94. package/dist/patterns/forms/FormActions.stories.svelte +97 -97
  95. package/dist/patterns/forms/FormActions.svelte +46 -46
  96. package/dist/patterns/forms/FormGrid.spec.js +34 -0
  97. package/dist/patterns/forms/FormGrid.svelte +33 -33
  98. package/dist/patterns/forms/FormSection.svelte +32 -32
  99. package/dist/patterns/forms/FormValidationSummary.stories.svelte +83 -83
  100. package/dist/patterns/forms/FormValidationSummary.svelte +74 -74
  101. package/dist/patterns/index.js +21 -21
  102. package/dist/patterns/layout/Sidebar.spec.js +240 -1
  103. package/dist/patterns/layout/Sidebar.svelte +39 -39
  104. package/dist/patterns/layout/SidebarTestWrapper.svelte +34 -0
  105. package/dist/patterns/layout/SidebarTestWrapper.svelte.d.ts +23 -0
  106. package/dist/patterns/layout/SidebarTestWrapper.svelte.d.ts.map +1 -0
  107. package/dist/patterns/layout/index.js +29 -29
  108. package/dist/patterns/navigation/BottomNav.stories.svelte +117 -117
  109. package/dist/patterns/navigation/BottomNav.svelte +74 -74
  110. package/dist/patterns/navigation/Header.spec.js +123 -0
  111. package/dist/patterns/navigation/Header.stories.svelte +77 -77
  112. package/dist/patterns/navigation/Header.svelte +251 -251
  113. package/dist/patterns/page/PageHeader.svelte +18 -18
  114. package/dist/patterns/page/PageLayout.svelte +40 -40
  115. package/dist/patterns/page/PageLoader.spec.js +57 -57
  116. package/dist/patterns/page/PageLoader.stories.svelte +137 -137
  117. package/dist/patterns/page/PageLoader.svelte +24 -24
  118. package/dist/patterns/page/SectionHeader.svelte +29 -29
  119. package/dist/presets/badges.js +112 -112
  120. package/dist/presets/buttons.js +76 -76
  121. package/dist/presets/index.js +9 -9
  122. package/dist/primitives/Accordion/Accordion.spec.js +112 -2
  123. package/dist/primitives/Accordion/Accordion.stories.svelte +75 -75
  124. package/dist/primitives/Accordion/Accordion.svelte +42 -42
  125. package/dist/primitives/Accordion/AccordionItem.svelte +95 -95
  126. package/dist/primitives/Accordion/AccordionToggleWrapper.test.svelte +28 -0
  127. package/dist/primitives/Accordion/AccordionToggleWrapper.test.svelte.d.ts +7 -0
  128. package/dist/primitives/Accordion/AccordionToggleWrapper.test.svelte.d.ts.map +1 -0
  129. package/dist/primitives/Alert/Alert.spec.js +173 -173
  130. package/dist/primitives/Alert/Alert.stories.svelte +88 -88
  131. package/dist/primitives/Alert/Alert.svelte +27 -27
  132. package/dist/primitives/Avatar/Avatar.spec.js +23 -0
  133. package/dist/primitives/Avatar/Avatar.stories.svelte +94 -94
  134. package/dist/primitives/Avatar/Avatar.svelte +66 -66
  135. package/dist/primitives/AvatarButton/AvatarButton.svelte +57 -57
  136. package/dist/primitives/Badges/Badge.spec.js +144 -144
  137. package/dist/primitives/Badges/Badge.stories.svelte +86 -86
  138. package/dist/primitives/Badges/Badge.svelte +99 -99
  139. package/dist/primitives/BottomSheet/BottomSheet.spec.js +238 -136
  140. package/dist/primitives/BottomSheet/BottomSheet.stories.svelte +83 -83
  141. package/dist/primitives/BottomSheet/BottomSheet.svelte +115 -115
  142. package/dist/primitives/BottomSheet/BottomSheetWithActions.test.svelte +20 -0
  143. package/dist/primitives/BottomSheet/BottomSheetWithActions.test.svelte.d.ts +10 -0
  144. package/dist/primitives/BottomSheet/BottomSheetWithActions.test.svelte.d.ts.map +1 -0
  145. package/dist/primitives/Breadcrumb/Breadcrumb.spec.js +123 -123
  146. package/dist/primitives/Breadcrumb/Breadcrumb.stories.svelte +23 -23
  147. package/dist/primitives/Breadcrumb/Breadcrumb.svelte +99 -99
  148. package/dist/primitives/Button/Button.spec.js +225 -225
  149. package/dist/primitives/Button/Button.stories.svelte +76 -76
  150. package/dist/primitives/Button/Button.svelte +278 -278
  151. package/dist/primitives/Button/ButtonGroup.spec.d.ts +2 -0
  152. package/dist/primitives/Button/ButtonGroup.spec.d.ts.map +1 -0
  153. package/dist/primitives/Button/ButtonGroup.spec.js +44 -0
  154. package/dist/primitives/Button/ButtonGroup.svelte +50 -50
  155. package/dist/primitives/Button/ButtonSaveDemo.spec.js +146 -146
  156. package/dist/primitives/Button/ButtonSaveDemo.svelte +25 -25
  157. package/dist/primitives/Button/ButtonVariantShowcase.svelte +129 -129
  158. package/dist/primitives/Card.spec.js +49 -49
  159. package/dist/primitives/Card.stories.svelte +22 -22
  160. package/dist/primitives/Card.svelte +28 -28
  161. package/dist/primitives/CardAction/CardAction.svelte +68 -68
  162. package/dist/primitives/Checkbox/Checkbox.spec.js +32 -0
  163. package/dist/primitives/Checkbox/Checkbox.stories.svelte +84 -84
  164. package/dist/primitives/Checkbox/Checkbox.svelte +88 -88
  165. package/dist/primitives/DarkModeToggle.spec.js +390 -390
  166. package/dist/primitives/DarkModeToggle.stories.svelte +57 -57
  167. package/dist/primitives/DarkModeToggle.svelte +136 -136
  168. package/dist/primitives/Drawer/Drawer.spec.js +437 -0
  169. package/dist/primitives/Drawer/Drawer.stories.svelte +80 -80
  170. package/dist/primitives/Drawer/Drawer.svelte +224 -224
  171. package/dist/primitives/Drawer/DrawerTestWrapper.svelte +86 -0
  172. package/dist/primitives/Drawer/DrawerTestWrapper.svelte.d.ts +26 -0
  173. package/dist/primitives/Drawer/DrawerTestWrapper.svelte.d.ts.map +1 -0
  174. package/dist/primitives/Dropdown/Dropdown.spec.js +116 -0
  175. package/dist/primitives/Dropdown/Dropdown.stories.svelte +137 -137
  176. package/dist/primitives/Dropdown/Dropdown.svelte +170 -170
  177. package/dist/primitives/Dropdown/DropdownDivider.spec.d.ts +2 -0
  178. package/dist/primitives/Dropdown/DropdownDivider.spec.d.ts.map +1 -0
  179. package/dist/primitives/Dropdown/DropdownDivider.spec.js +30 -0
  180. package/dist/primitives/Dropdown/DropdownDivider.svelte +9 -9
  181. package/dist/primitives/Dropdown/DropdownItem.spec.js +155 -1
  182. package/dist/primitives/Dropdown/DropdownItem.svelte +80 -80
  183. package/dist/primitives/Dropdown/DropdownItemTestWrapper.svelte +43 -0
  184. package/dist/primitives/Dropdown/DropdownItemTestWrapper.svelte.d.ts +17 -0
  185. package/dist/primitives/Dropdown/DropdownItemTestWrapper.svelte.d.ts.map +1 -0
  186. package/dist/primitives/Helper/Helper.spec.d.ts +2 -0
  187. package/dist/primitives/Helper/Helper.spec.d.ts.map +1 -0
  188. package/dist/primitives/Helper/Helper.spec.js +57 -0
  189. package/dist/primitives/Helper/Helper.svelte +33 -33
  190. package/dist/primitives/Icons/ArrowLeft.svelte +8 -8
  191. package/dist/primitives/Icons/ArrowRight.svelte +8 -8
  192. package/dist/primitives/Icons/Availability.svelte +14 -14
  193. package/dist/primitives/Icons/Back.svelte +14 -14
  194. package/dist/primitives/Icons/CheckCircle.svelte +6 -6
  195. package/dist/primitives/Icons/CheckCircleOutline.svelte +15 -15
  196. package/dist/primitives/Icons/ChevronLeft.svelte +4 -4
  197. package/dist/primitives/Icons/ChevronRight.svelte +4 -4
  198. package/dist/primitives/Icons/Copy.svelte +15 -15
  199. package/dist/primitives/Icons/Cross.svelte +5 -5
  200. package/dist/primitives/Icons/DownArrow.svelte +8 -8
  201. package/dist/primitives/Icons/ErrorCircle.svelte +6 -6
  202. package/dist/primitives/Icons/FacebookIcon.svelte +2 -2
  203. package/dist/primitives/Icons/Home.svelte +15 -15
  204. package/dist/primitives/Icons/Icon.spec.js +169 -169
  205. package/dist/primitives/Icons/Icon.stories.svelte +100 -100
  206. package/dist/primitives/Icons/Icon.svelte +52 -52
  207. package/dist/primitives/Icons/IconGallery.stories.svelte +235 -235
  208. package/dist/primitives/Icons/Info.svelte +7 -7
  209. package/dist/primitives/Icons/InstagramIcon.svelte +4 -4
  210. package/dist/primitives/Icons/LogoInstagram.svelte +2 -2
  211. package/dist/primitives/Icons/Message.svelte +15 -15
  212. package/dist/primitives/Icons/MoonIcon.svelte +5 -5
  213. package/dist/primitives/Icons/More.svelte +21 -21
  214. package/dist/primitives/Icons/MoreHori.spec.js +61 -61
  215. package/dist/primitives/Icons/MoreHori.svelte +22 -22
  216. package/dist/primitives/Icons/Notification.svelte +14 -14
  217. package/dist/primitives/Icons/Payment.svelte +14 -14
  218. package/dist/primitives/Icons/Profile.svelte +21 -21
  219. package/dist/primitives/Icons/Reload.svelte +29 -29
  220. package/dist/primitives/Icons/Shows.svelte +21 -21
  221. package/dist/primitives/Icons/Signout.svelte +21 -21
  222. package/dist/primitives/Icons/SunIcon.svelte +8 -8
  223. package/dist/primitives/Icons/TiktokIcon.svelte +2 -2
  224. package/dist/primitives/Icons/TwitterIcon.svelte +2 -2
  225. package/dist/primitives/Icons/WarningIcon.spec.js +18 -18
  226. package/dist/primitives/Icons/WarningIcon.svelte +5 -5
  227. package/dist/primitives/Input/Input.spec.js +1235 -573
  228. package/dist/primitives/Input/Input.stories.svelte +139 -139
  229. package/dist/primitives/Input/Input.svelte +423 -423
  230. package/dist/primitives/Input/Select.spec.js +632 -218
  231. package/dist/primitives/Input/Select.stories.svelte +112 -112
  232. package/dist/primitives/Input/Select.svelte +252 -252
  233. package/dist/primitives/Input/Textarea.stories.svelte +137 -137
  234. package/dist/primitives/Input/Textarea.svelte +105 -105
  235. package/dist/primitives/Label/Label.spec.js +9 -0
  236. package/dist/primitives/Label/Label.svelte +37 -37
  237. package/dist/primitives/LandingButton/LandingButton.spec.d.ts +2 -0
  238. package/dist/primitives/LandingButton/LandingButton.spec.d.ts.map +1 -0
  239. package/dist/primitives/LandingButton/LandingButton.spec.js +61 -0
  240. package/dist/primitives/LandingButton/LandingButton.svelte +92 -92
  241. package/dist/primitives/MenuItem/MenuItem.spec.d.ts +2 -0
  242. package/dist/primitives/MenuItem/MenuItem.spec.d.ts.map +1 -0
  243. package/dist/primitives/MenuItem/MenuItem.spec.js +130 -0
  244. package/dist/primitives/MenuItem/MenuItem.svelte +85 -85
  245. package/dist/primitives/Modal/Modal.spec.js +314 -99
  246. package/dist/primitives/Modal/Modal.stories.svelte +86 -86
  247. package/dist/primitives/Modal/Modal.svelte +181 -181
  248. package/dist/primitives/NavItem/NavItem.spec.d.ts +2 -0
  249. package/dist/primitives/NavItem/NavItem.spec.d.ts.map +1 -0
  250. package/dist/primitives/NavItem/NavItem.spec.js +97 -0
  251. package/dist/primitives/NavItem/NavItem.svelte +75 -75
  252. package/dist/primitives/Pagination/Pagination.stories.svelte +76 -76
  253. package/dist/primitives/Pagination/Pagination.svelte +261 -261
  254. package/dist/primitives/Radio/Radio.stories.svelte +80 -80
  255. package/dist/primitives/Radio/Radio.svelte +67 -67
  256. package/dist/primitives/SearchResultItem/SearchResultItem.spec.d.ts +2 -0
  257. package/dist/primitives/SearchResultItem/SearchResultItem.spec.d.ts.map +1 -0
  258. package/dist/primitives/SearchResultItem/SearchResultItem.spec.js +78 -0
  259. package/dist/primitives/SearchResultItem/SearchResultItem.svelte +109 -109
  260. package/dist/primitives/SidebarToggle/SidebarToggle.spec.d.ts +2 -0
  261. package/dist/primitives/SidebarToggle/SidebarToggle.spec.d.ts.map +1 -0
  262. package/dist/primitives/SidebarToggle/SidebarToggle.spec.js +61 -0
  263. package/dist/primitives/SidebarToggle/SidebarToggle.svelte +55 -55
  264. package/dist/primitives/Skeleton/CardPlaceholder.svelte +87 -87
  265. package/dist/primitives/Skeleton/ImagePlaceholder.svelte +59 -59
  266. package/dist/primitives/Skeleton/ListPlaceholder.svelte +76 -76
  267. package/dist/primitives/Skeleton/Skeleton.stories.svelte +151 -151
  268. package/dist/primitives/Skeleton/Skeleton.svelte +26 -26
  269. package/dist/primitives/Spinner/Spinner.spec.js +84 -71
  270. package/dist/primitives/Spinner/Spinner.stories.svelte +29 -29
  271. package/dist/primitives/Spinner/Spinner.svelte +20 -20
  272. package/dist/primitives/Tabs/TabItem.svelte +49 -49
  273. package/dist/primitives/Tabs/Tabs.stories.svelte +112 -112
  274. package/dist/primitives/Tabs/Tabs.svelte +137 -137
  275. package/dist/primitives/Toggle.spec.js +221 -146
  276. package/dist/primitives/Toggle.stories.svelte +92 -92
  277. package/dist/primitives/Toggle.svelte +141 -141
  278. package/dist/primitives/ToggleTestWrapper.svelte +30 -0
  279. package/dist/primitives/ToggleTestWrapper.svelte.d.ts +29 -0
  280. package/dist/primitives/ToggleTestWrapper.svelte.d.ts.map +1 -0
  281. package/dist/primitives/Tooltip/Tooltip.spec.d.ts +2 -0
  282. package/dist/primitives/Tooltip/Tooltip.spec.d.ts.map +1 -0
  283. package/dist/primitives/Tooltip/Tooltip.spec.js +126 -0
  284. package/dist/primitives/Tooltip/Tooltip.svelte +83 -83
  285. package/dist/primitives/Typography/Typography.svelte +53 -53
  286. package/dist/primitives/ValidationError.spec.js +103 -103
  287. package/dist/primitives/ValidationError.stories.svelte +69 -69
  288. package/dist/primitives/ValidationError.svelte +29 -29
  289. package/dist/primitives/index.js +113 -113
  290. package/dist/recipes/CropImage/CropImage.spec.js +208 -208
  291. package/dist/recipes/CropImage/CropImage.stories.svelte +104 -104
  292. package/dist/recipes/CropImage/CropImage.svelte +241 -241
  293. package/dist/recipes/ImageUploader/ImageUploader.stories.svelte +125 -125
  294. package/dist/recipes/ImageUploader/ImageUploader.svelte +992 -992
  295. package/dist/recipes/SuperLogin/SuperLogin.spec.js +2 -2
  296. package/dist/recipes/SuperLogin/SuperLogin.svelte +1 -1
  297. package/dist/recipes/Toaster/Toaster.stories.svelte +62 -62
  298. package/dist/recipes/feedback/EmptyState/EmptyState.svelte +1 -1
  299. package/dist/recipes/feedback/ErrorDisplay.spec.js +69 -69
  300. package/dist/recipes/feedback/ErrorDisplay.stories.svelte +101 -101
  301. package/dist/recipes/feedback/ErrorDisplay.svelte +1 -1
  302. package/dist/recipes/feedback/StatusIndicator/StatusIndicator.spec.js +133 -133
  303. package/dist/recipes/feedback/StatusIndicator/StatusIndicator.svelte +157 -157
  304. package/dist/recipes/fields/CheckboxField.svelte +85 -85
  305. package/dist/recipes/fields/FormField.svelte +58 -58
  306. package/dist/recipes/fields/RadioGroup.svelte +95 -95
  307. package/dist/recipes/fields/SelectField.svelte +82 -82
  308. package/dist/recipes/fields/TextareaField.svelte +97 -97
  309. package/dist/recipes/fields/ToggleField.svelte +60 -60
  310. package/dist/recipes/fields/index.js +7 -7
  311. package/dist/recipes/inputs/MultiSelect.spec.js +263 -263
  312. package/dist/recipes/inputs/MultiSelect.stories.svelte +133 -133
  313. package/dist/recipes/inputs/MultiSelect.svelte +283 -283
  314. package/dist/recipes/inputs/OTPInput.spec.js +251 -251
  315. package/dist/recipes/inputs/OTPInput.stories.svelte +162 -162
  316. package/dist/recipes/inputs/OTPInput.svelte +117 -117
  317. package/dist/recipes/inputs/PasswordInput.svelte +22 -22
  318. package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte +131 -131
  319. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.stories.svelte +123 -123
  320. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte +336 -336
  321. package/dist/recipes/inputs/Search.spec.js +66 -2
  322. package/dist/recipes/inputs/Search.svelte +102 -102
  323. package/dist/recipes/inputs/index.js +7 -7
  324. package/dist/recipes/modals/AlertModal.svelte +130 -130
  325. package/dist/recipes/modals/ConfirmationModal.spec.js +396 -206
  326. package/dist/recipes/modals/ConfirmationModal.stories.svelte +119 -119
  327. package/dist/recipes/modals/ConfirmationModal.svelte +162 -162
  328. package/dist/recipes/modals/InputModal.svelte +182 -182
  329. package/dist/recipes/modals/ModalStateManager.spec.js +100 -100
  330. package/dist/recipes/modals/ModalStateManager.svelte +77 -77
  331. package/dist/recipes/modals/ModalTestWrapper.svelte +65 -65
  332. package/dist/recipes/modals/StatusModal.svelte +206 -206
  333. package/dist/services/EventService.js +79 -79
  334. package/dist/services/EventService.spec.js +217 -217
  335. package/dist/services/ShowService.js +144 -144
  336. package/dist/services/ShowService.spec.js +345 -345
  337. package/dist/stores/auth.svelte.spec.d.ts +2 -0
  338. package/dist/stores/auth.svelte.spec.d.ts.map +1 -0
  339. package/dist/stores/auth.svelte.spec.js +112 -0
  340. package/dist/stores/formDataStore.svelte.spec.d.ts +2 -0
  341. package/dist/stores/formDataStore.svelte.spec.d.ts.map +1 -0
  342. package/dist/stores/formDataStore.svelte.spec.js +150 -0
  343. package/dist/stores/formSave.svelte.spec.d.ts +2 -0
  344. package/dist/stores/formSave.svelte.spec.d.ts.map +1 -0
  345. package/dist/stores/formSave.svelte.spec.js +196 -0
  346. package/dist/stores/navigation.spec.d.ts +2 -0
  347. package/dist/stores/navigation.spec.d.ts.map +1 -0
  348. package/dist/stores/navigation.spec.js +53 -0
  349. package/dist/stores/toaster.js +13 -13
  350. package/dist/stories/ButtonAuditReview.stories.svelte +14 -14
  351. package/dist/stories/ButtonAuditReview.svelte +427 -427
  352. package/dist/stories/PatternsGallery.stories.svelte +19 -19
  353. package/dist/stories/PatternsGallery.svelte +206 -206
  354. package/dist/stories/PrimitivesGallery.stories.svelte +19 -19
  355. package/dist/stories/PrimitivesGallery.svelte +756 -756
  356. package/dist/stories/RecipesGallery.stories.svelte +19 -19
  357. package/dist/stories/RecipesGallery.svelte +454 -454
  358. package/dist/stories/button-audit-manifest.json +11186 -11186
  359. package/dist/tailwind/preset.cjs +82 -82
  360. package/dist/telemetry.js +402 -402
  361. package/dist/telemetry.server.js +212 -212
  362. package/dist/telemetry.server.spec.js +437 -437
  363. package/dist/telemetry.spec.js +1168 -1168
  364. package/dist/tokens/tokens.css +87 -87
  365. package/dist/tokens/typography-base.css +163 -163
  366. package/dist/tokens/utilities.css +353 -353
  367. package/dist/utils/apiConfig.js +117 -117
  368. package/dist/utils/apiConfig.spec.js +219 -219
  369. package/dist/utils/greetings.js +187 -187
  370. package/dist/utils/haptic.spec.d.ts +2 -0
  371. package/dist/utils/haptic.spec.d.ts.map +1 -0
  372. package/dist/utils/haptic.spec.js +153 -0
  373. package/dist/utils/imageOptimizer.spec.d.ts +2 -0
  374. package/dist/utils/imageOptimizer.spec.d.ts.map +1 -0
  375. package/dist/utils/imageOptimizer.spec.js +201 -0
  376. package/dist/utils/imageValidation.js +121 -121
  377. package/dist/utils/logger.spec.d.ts +2 -0
  378. package/dist/utils/logger.spec.d.ts.map +1 -0
  379. package/dist/utils/logger.spec.js +95 -0
  380. package/dist/utils/transitions.js +4 -4
  381. package/dist/utils/utils.js +693 -693
  382. package/package.json +292 -293
@@ -1,99 +1,99 @@
1
- <script lang="ts">
2
- import type { Snippet } from 'svelte';
3
- import { classNames } from "./../../utils/utils.js";
4
- import { badgeColorVariants, type BadgeColorVariant } from '../../tokens/variants.js';
5
- import { badgeSizes, badgeSizeLegacyMap, type BadgeSize, type BadgeSizeLegacy } from '../../tokens/sizing.js';
6
-
7
- type Size = BadgeSize | BadgeSizeLegacy;
8
- type Variant = BadgeColorVariant;
9
-
10
- interface Props {
11
- /** Size variant */
12
- size?: Size;
13
- /** Additional CSS classes */
14
- className?: string;
15
- /** Semantic or color variant */
16
- variant?: Variant;
17
- /** Custom text color (hex) - overrides variant */
18
- textColor?: string | null;
19
- /** Custom background color (hex or rgba) - overrides variant */
20
- bgColor?: string | null;
21
- /** Show status dot before text (uses variant color) */
22
- showDot?: boolean;
23
- /** Pill mode for counts/notifications (circular, minimal padding) */
24
- pill?: boolean;
25
- /** Border radius style - default or full pill */
26
- shape?: "rounded" | "pill";
27
- /** Large size (Flowbite API compatibility) */
28
- large?: boolean;
29
- /** Click handler callback */
30
- onclick?: (e: MouseEvent) => void;
31
- /** Left icon slot */
32
- leftIcon?: Snippet;
33
- /** Child content */
34
- children?: Snippet;
35
- }
36
-
37
- let {
38
- size = "md",
39
- className = '',
40
- variant = "neutral",
41
- textColor = null,
42
- bgColor = null,
43
- showDot = false,
44
- pill = false,
45
- shape = "rounded",
46
- large = false,
47
- onclick,
48
- leftIcon,
49
- children
50
- }: Props = $props();
51
-
52
- let resolvedSize = $derived((): BadgeSize => {
53
- if (large) return 'lg';
54
- const legacyMapped = badgeSizeLegacyMap[size];
55
- if (legacyMapped) return legacyMapped;
56
- return (size as BadgeSize) || 'md';
57
- });
58
-
59
- let sizeClasses = $derived(badgeSizes[resolvedSize()] || badgeSizes.md);
60
-
61
- let shapeClasses = $derived((() => {
62
- if (pill) return "rounded-full min-w-5 h-5 px-1.5 justify-center";
63
- return shape === "pill" ? "rounded-full" : "rounded";
64
- })());
65
-
66
- let normalizedVariant = $derived(String(variant).toLowerCase());
67
-
68
- let variantClasses = $derived(
69
- badgeColorVariants[normalizedVariant as BadgeColorVariant] ||
70
- badgeColorVariants.neutral
71
- );
72
-
73
- let customStyle = $derived((() => {
74
- const styles: string[] = [];
75
- if (textColor) styles.push(`color: ${textColor}`);
76
- if (bgColor) styles.push(`background-color: ${bgColor}`);
77
- return styles.length > 0 ? styles.join("; ") : undefined;
78
- })());
79
- </script>
80
-
81
- <!-- svelte-ignore a11y_click_events_have_key_events -->
82
- <!-- svelte-ignore a11y_no_static_element_interactions -->
83
- <div
84
- class={classNames(
85
- "inline-flex items-center gap-1.5",
86
- sizeClasses,
87
- variantClasses,
88
- shapeClasses,
89
- className
90
- )}
91
- style={customStyle}
92
- onclick={(e) => onclick?.(e)}
93
- >
94
- {#if showDot}
95
- <span class="w-1.5 h-1.5 rounded-full bg-current shrink-0"></span>
96
- {/if}
97
- {@render leftIcon?.()}
98
- {@render children?.()}
99
- </div>
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ import { classNames } from "./../../utils/utils.js";
4
+ import { badgeColorVariants, type BadgeColorVariant } from '../../tokens/variants.js';
5
+ import { badgeSizes, badgeSizeLegacyMap, type BadgeSize, type BadgeSizeLegacy } from '../../tokens/sizing.js';
6
+
7
+ type Size = BadgeSize | BadgeSizeLegacy;
8
+ type Variant = BadgeColorVariant;
9
+
10
+ interface Props {
11
+ /** Size variant */
12
+ size?: Size;
13
+ /** Additional CSS classes */
14
+ className?: string;
15
+ /** Semantic or color variant */
16
+ variant?: Variant;
17
+ /** Custom text color (hex) - overrides variant */
18
+ textColor?: string | null;
19
+ /** Custom background color (hex or rgba) - overrides variant */
20
+ bgColor?: string | null;
21
+ /** Show status dot before text (uses variant color) */
22
+ showDot?: boolean;
23
+ /** Pill mode for counts/notifications (circular, minimal padding) */
24
+ pill?: boolean;
25
+ /** Border radius style - default or full pill */
26
+ shape?: "rounded" | "pill";
27
+ /** Large size (Flowbite API compatibility) */
28
+ large?: boolean;
29
+ /** Click handler callback */
30
+ onclick?: (e: MouseEvent) => void;
31
+ /** Left icon slot */
32
+ leftIcon?: Snippet;
33
+ /** Child content */
34
+ children?: Snippet;
35
+ }
36
+
37
+ let {
38
+ size = "md",
39
+ className = '',
40
+ variant = "neutral",
41
+ textColor = null,
42
+ bgColor = null,
43
+ showDot = false,
44
+ pill = false,
45
+ shape = "rounded",
46
+ large = false,
47
+ onclick,
48
+ leftIcon,
49
+ children
50
+ }: Props = $props();
51
+
52
+ let resolvedSize = $derived((): BadgeSize => {
53
+ if (large) return 'lg';
54
+ const legacyMapped = badgeSizeLegacyMap[size];
55
+ if (legacyMapped) return legacyMapped;
56
+ return (size as BadgeSize) || 'md';
57
+ });
58
+
59
+ let sizeClasses = $derived(badgeSizes[resolvedSize()] || badgeSizes.md);
60
+
61
+ let shapeClasses = $derived((() => {
62
+ if (pill) return "rounded-full min-w-5 h-5 px-1.5 justify-center";
63
+ return shape === "pill" ? "rounded-full" : "rounded";
64
+ })());
65
+
66
+ let normalizedVariant = $derived(String(variant).toLowerCase());
67
+
68
+ let variantClasses = $derived(
69
+ badgeColorVariants[normalizedVariant as BadgeColorVariant] ||
70
+ badgeColorVariants.neutral
71
+ );
72
+
73
+ let customStyle = $derived((() => {
74
+ const styles: string[] = [];
75
+ if (textColor) styles.push(`color: ${textColor}`);
76
+ if (bgColor) styles.push(`background-color: ${bgColor}`);
77
+ return styles.length > 0 ? styles.join("; ") : undefined;
78
+ })());
79
+ </script>
80
+
81
+ <!-- svelte-ignore a11y_click_events_have_key_events -->
82
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
83
+ <div
84
+ class={classNames(
85
+ "inline-flex items-center gap-1.5",
86
+ sizeClasses,
87
+ variantClasses,
88
+ shapeClasses,
89
+ className
90
+ )}
91
+ style={customStyle}
92
+ onclick={(e) => onclick?.(e)}
93
+ >
94
+ {#if showDot}
95
+ <span class="w-1.5 h-1.5 rounded-full bg-current shrink-0"></span>
96
+ {/if}
97
+ {@render leftIcon?.()}
98
+ {@render children?.()}
99
+ </div>
@@ -1,136 +1,238 @@
1
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
- import { render, fireEvent, cleanup } from '@testing-library/svelte';
3
- import BottomSheet from './BottomSheet.svelte';
4
- import BottomSheetWrapper from './BottomSheetWrapper.test.svelte';
5
-
6
- describe('BottomSheet Component', () => {
7
- beforeEach(() => {
8
- // Reset body overflow
9
- document.body.style.overflow = '';
10
- });
11
-
12
- afterEach(() => {
13
- document.body.style.overflow = '';
14
- cleanup();
15
- });
16
-
17
- it('does not render when open is false', () => {
18
- const { container } = render(BottomSheet, { props: { open: false } });
19
- const backdrop = container.querySelector('.fixed.inset-0');
20
- expect(backdrop).toBeFalsy();
21
- });
22
-
23
- it('renders when open is true', () => {
24
- const { container } = render(BottomSheet, { props: { open: true } });
25
- const backdrop = container.querySelector('.fixed.inset-0');
26
- expect(backdrop).toBeTruthy();
27
- });
28
-
29
- it('renders title when provided', () => {
30
- const { getByText } = render(BottomSheet, {
31
- props: { open: true, title: 'Test Title' },
32
- });
33
- expect(getByText('Test Title')).toBeTruthy();
34
- });
35
-
36
- it('does not render title when not provided', () => {
37
- const { container } = render(BottomSheet, { props: { open: true } });
38
- const title = container.querySelector('h3');
39
- expect(title).toBeFalsy();
40
- });
41
-
42
- it('locks body scroll when open', async () => {
43
- render(BottomSheet, { props: { open: true } });
44
- // Wait for reactive update
45
- await new Promise((resolve) => setTimeout(resolve, 10));
46
- expect(document.body.style.overflow).toBe('hidden');
47
- });
48
-
49
- it('unlocks body scroll when closed', async () => {
50
- const { rerender } = render(BottomSheetWrapper, { props: { open: true } });
51
- await new Promise((resolve) => setTimeout(resolve, 10));
52
- expect(document.body.style.overflow).toBe('hidden');
53
-
54
- await rerender({ open: false });
55
- await new Promise((resolve) => setTimeout(resolve, 10));
56
-
57
- expect(document.body.style.overflow).toBe('');
58
- });
59
-
60
- it('dispatches close event on backdrop click', async () => {
61
- let closeCalled = false;
62
- const onclose = () => {
63
- closeCalled = true;
64
- };
65
-
66
- const { container } = render(BottomSheet, {
67
- props: { open: true, onclose }
68
- });
69
- const backdrop = container.querySelector('.fixed.inset-0');
70
-
71
- await fireEvent.click(backdrop);
72
- expect(closeCalled).toBe(true);
73
- });
74
-
75
- it('does not dispatch close when clicking sheet content', async () => {
76
- let closeCalled = false;
77
- const onclose = () => {
78
- closeCalled = true;
79
- };
80
-
81
- const { container } = render(BottomSheet, {
82
- props: { open: true, onclose }
83
- });
84
- const sheet = container.querySelector('.bg-white, .dark\\:bg-gray-800');
85
-
86
- await fireEvent.click(sheet);
87
- expect(closeCalled).toBe(false);
88
- });
89
-
90
- it('dispatches close event on Escape key', async () => {
91
- let closeCalled = false;
92
- const onclose = () => {
93
- closeCalled = true;
94
- };
95
-
96
- render(BottomSheet, { props: { open: true, onclose } });
97
-
98
- await fireEvent.keyDown(window, { key: 'Escape' });
99
- expect(closeCalled).toBe(true);
100
- });
101
-
102
- it('does not dispatch close on Escape when not open', async () => {
103
- let closeCalled = false;
104
- const onclose = () => {
105
- closeCalled = true;
106
- };
107
-
108
- render(BottomSheet, { props: { open: false, onclose } });
109
-
110
- await fireEvent.keyDown(window, { key: 'Escape' });
111
- expect(closeCalled).toBe(false);
112
- });
113
-
114
- it('has handle bar element', () => {
115
- const { container } = render(BottomSheet, { props: { open: true } });
116
- // The handle is the gray bar with rounded corners
117
- const handle = container.querySelector('.w-10.h-1.bg-gray-300');
118
- expect(handle).toBeTruthy();
119
- });
120
-
121
- it('has content area for slot content', () => {
122
- const { container } = render(BottomSheet, { props: { open: true } });
123
- // The content area has overflow-y-auto class
124
- const content = container.querySelector('.overflow-y-auto');
125
- expect(content).toBeTruthy();
126
- });
127
-
128
- it('cleans up body overflow on destroy', () => {
129
- document.body.style.overflow = 'hidden';
130
- const { unmount } = render(BottomSheet, { props: { open: true } });
131
-
132
- unmount();
133
-
134
- expect(document.body.style.overflow).toBe('');
135
- });
136
- });
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import { render, fireEvent, cleanup } from '@testing-library/svelte';
3
+ import BottomSheet from './BottomSheet.svelte';
4
+ import BottomSheetWrapper from './BottomSheetWrapper.test.svelte';
5
+ import BottomSheetWithActions from './BottomSheetWithActions.test.svelte';
6
+
7
+ describe('BottomSheet Component', () => {
8
+ beforeEach(() => {
9
+ // Reset body overflow
10
+ document.body.style.overflow = '';
11
+ });
12
+
13
+ afterEach(() => {
14
+ document.body.style.overflow = '';
15
+ cleanup();
16
+ });
17
+
18
+ it('does not render when open is false', () => {
19
+ const { container } = render(BottomSheet, { props: { open: false } });
20
+ const backdrop = container.querySelector('.fixed.inset-0');
21
+ expect(backdrop).toBeFalsy();
22
+ });
23
+
24
+ it('renders when open is true', () => {
25
+ const { container } = render(BottomSheet, { props: { open: true } });
26
+ const backdrop = container.querySelector('.fixed.inset-0');
27
+ expect(backdrop).toBeTruthy();
28
+ });
29
+
30
+ it('renders title when provided', () => {
31
+ const { getByText } = render(BottomSheet, {
32
+ props: { open: true, title: 'Test Title' },
33
+ });
34
+ expect(getByText('Test Title')).toBeTruthy();
35
+ });
36
+
37
+ it('does not render title when not provided', () => {
38
+ const { container } = render(BottomSheet, { props: { open: true } });
39
+ const title = container.querySelector('h3');
40
+ expect(title).toBeFalsy();
41
+ });
42
+
43
+ it('locks body scroll when open', async () => {
44
+ render(BottomSheet, { props: { open: true } });
45
+ // Wait for reactive update
46
+ await new Promise((resolve) => setTimeout(resolve, 10));
47
+ expect(document.body.style.overflow).toBe('hidden');
48
+ });
49
+
50
+ it('unlocks body scroll when closed', async () => {
51
+ const { rerender } = render(BottomSheetWrapper, { props: { open: true } });
52
+ await new Promise((resolve) => setTimeout(resolve, 10));
53
+ expect(document.body.style.overflow).toBe('hidden');
54
+
55
+ await rerender({ open: false });
56
+ await new Promise((resolve) => setTimeout(resolve, 10));
57
+
58
+ expect(document.body.style.overflow).toBe('');
59
+ });
60
+
61
+ it('dispatches close event on backdrop click', async () => {
62
+ let closeCalled = false;
63
+ const onclose = () => {
64
+ closeCalled = true;
65
+ };
66
+
67
+ const { container } = render(BottomSheet, {
68
+ props: { open: true, onclose }
69
+ });
70
+ const backdrop = container.querySelector('.fixed.inset-0');
71
+
72
+ await fireEvent.click(backdrop);
73
+ expect(closeCalled).toBe(true);
74
+ });
75
+
76
+ it('does not dispatch close when clicking sheet content', async () => {
77
+ let closeCalled = false;
78
+ const onclose = () => {
79
+ closeCalled = true;
80
+ };
81
+
82
+ const { container } = render(BottomSheet, {
83
+ props: { open: true, onclose }
84
+ });
85
+ const sheet = container.querySelector('.bg-white, .dark\\:bg-gray-800');
86
+
87
+ await fireEvent.click(sheet);
88
+ expect(closeCalled).toBe(false);
89
+ });
90
+
91
+ it('dispatches close event on Escape key', async () => {
92
+ let closeCalled = false;
93
+ const onclose = () => {
94
+ closeCalled = true;
95
+ };
96
+
97
+ render(BottomSheet, { props: { open: true, onclose } });
98
+
99
+ await fireEvent.keyDown(window, { key: 'Escape' });
100
+ expect(closeCalled).toBe(true);
101
+ });
102
+
103
+ it('does not dispatch close on Escape when not open', async () => {
104
+ let closeCalled = false;
105
+ const onclose = () => {
106
+ closeCalled = true;
107
+ };
108
+
109
+ render(BottomSheet, { props: { open: false, onclose } });
110
+
111
+ await fireEvent.keyDown(window, { key: 'Escape' });
112
+ expect(closeCalled).toBe(false);
113
+ });
114
+
115
+ it('has handle bar element', () => {
116
+ const { container } = render(BottomSheet, { props: { open: true } });
117
+ // The handle is the gray bar with rounded corners
118
+ const handle = container.querySelector('.w-10.h-1.bg-gray-300');
119
+ expect(handle).toBeTruthy();
120
+ });
121
+
122
+ it('has content area for slot content', () => {
123
+ const { container } = render(BottomSheet, { props: { open: true } });
124
+ // The content area has overflow-y-auto class
125
+ const content = container.querySelector('.overflow-y-auto');
126
+ expect(content).toBeTruthy();
127
+ });
128
+
129
+ it('cleans up body overflow on destroy', () => {
130
+ document.body.style.overflow = 'hidden';
131
+ const { unmount } = render(BottomSheet, { props: { open: true } });
132
+
133
+ unmount();
134
+
135
+ expect(document.body.style.overflow).toBe('');
136
+ });
137
+
138
+ it('renders actions slot when provided', () => {
139
+ const { container } = render(BottomSheetWithActions, { props: { open: true } });
140
+ // The actions area should contain our buttons
141
+ const saveBtn = container.querySelector('button');
142
+ expect(saveBtn).toBeTruthy();
143
+ // Check both action buttons are rendered
144
+ const buttons = container.querySelectorAll('button');
145
+ const buttonTexts = Array.from(buttons).map(b => b.textContent);
146
+ expect(buttonTexts).toContain('Save');
147
+ expect(buttonTexts).toContain('Cancel');
148
+ });
149
+
150
+ it('does not render actions area when no actions snippet is provided', () => {
151
+ const { container } = render(BottomSheet, { props: { open: true } });
152
+ // The actions footer area should not exist if no actions snippet
153
+ const actionsArea = container.querySelector('.border-t.border-gray-200');
154
+ expect(actionsArea).toBeFalsy();
155
+ });
156
+
157
+ it('applies alwaysSheet class when alwaysSheet is true', () => {
158
+ const { container } = render(BottomSheet, {
159
+ props: { open: true, alwaysSheet: true }
160
+ });
161
+ const backdrop = container.querySelector('.fixed.inset-0');
162
+ // When alwaysSheet is true, backdrop should NOT have md:items-center
163
+ expect(backdrop.classList.contains('md:items-center')).toBe(false);
164
+ });
165
+
166
+ it('applies responsive classes when alwaysSheet is false', () => {
167
+ const { container } = render(BottomSheet, {
168
+ props: { open: true, alwaysSheet: false }
169
+ });
170
+ const backdrop = container.querySelector('.fixed.inset-0');
171
+ // When alwaysSheet is false, backdrop should have md:items-center
172
+ expect(backdrop.classList.contains('md:items-center')).toBe(true);
173
+ });
174
+
175
+ it('does not close on backdrop click when target is not currentTarget', async () => {
176
+ let closeCalled = false;
177
+ const onclose = () => {
178
+ closeCalled = true;
179
+ };
180
+
181
+ const { container } = render(BottomSheet, {
182
+ props: { open: true, onclose }
183
+ });
184
+ // Click the inner sheet panel (not the backdrop itself)
185
+ const sheetPanel = container.querySelector('.bg-white');
186
+ await fireEvent.click(sheetPanel);
187
+ expect(closeCalled).toBe(false);
188
+ });
189
+
190
+ it('does not call onclose on Escape when key is not Escape', async () => {
191
+ let closeCalled = false;
192
+ const onclose = () => {
193
+ closeCalled = true;
194
+ };
195
+
196
+ render(BottomSheet, { props: { open: true, onclose } });
197
+
198
+ await fireEvent.keyDown(window, { key: 'Enter' });
199
+ expect(closeCalled).toBe(false);
200
+ });
201
+
202
+ it('handles open toggling from true to false via effect', async () => {
203
+ const { rerender } = render(BottomSheetWithActions, { props: { open: true } });
204
+ await new Promise((resolve) => setTimeout(resolve, 10));
205
+ expect(document.body.style.overflow).toBe('hidden');
206
+
207
+ await rerender({ open: false });
208
+ await new Promise((resolve) => setTimeout(resolve, 10));
209
+ expect(document.body.style.overflow).toBe('');
210
+ });
211
+
212
+ it('does not close when clicking on the handle bar inside the sheet', async () => {
213
+ let closeCalled = false;
214
+ const onclose = () => { closeCalled = true; };
215
+
216
+ const { container } = render(BottomSheet, {
217
+ props: { open: true, onclose }
218
+ });
219
+ // Click the handle bar (a child of the backdrop)
220
+ const handleBar = container.querySelector('.w-10.h-1.bg-gray-300');
221
+ await fireEvent.click(handleBar);
222
+ expect(closeCalled).toBe(false);
223
+ });
224
+
225
+ it('restores body overflow when initially rendered as closed', async () => {
226
+ // Render initially closed - the $effect should set overflow to ''
227
+ render(BottomSheet, { props: { open: false } });
228
+ await new Promise((resolve) => setTimeout(resolve, 10));
229
+ expect(document.body.style.overflow).toBe('');
230
+ });
231
+
232
+ it('cleans up overflow on destroy when document is available', () => {
233
+ document.body.style.overflow = 'hidden';
234
+ const { unmount } = render(BottomSheetWithActions, { props: { open: true } });
235
+ unmount();
236
+ expect(document.body.style.overflow).toBe('');
237
+ });
238
+ });