@getmicdrop/svelte-components 5.17.0 → 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 (391) 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/datetime/timezone.d.ts.map +1 -1
  39. package/dist/datetime/timezone.js +1 -2
  40. package/dist/forms/createFormStore.svelte.d.ts +1 -1
  41. package/dist/forms/createFormStore.svelte.d.ts.map +1 -1
  42. package/dist/forms/createFormStore.svelte.js +1 -0
  43. package/dist/forms/createFormStore.svelte.spec.d.ts +2 -0
  44. package/dist/forms/createFormStore.svelte.spec.d.ts.map +1 -0
  45. package/dist/forms/createFormStore.svelte.spec.js +388 -0
  46. package/dist/index.js +57 -57
  47. package/dist/index.spec.js +369 -369
  48. package/dist/patterns/chat/ChatActivityNotice.spec.d.ts +2 -0
  49. package/dist/patterns/chat/ChatActivityNotice.spec.d.ts.map +1 -0
  50. package/dist/patterns/chat/ChatActivityNotice.spec.js +59 -0
  51. package/dist/patterns/chat/ChatActivityNotice.svelte +41 -41
  52. package/dist/patterns/chat/ChatBubble.spec.d.ts +2 -0
  53. package/dist/patterns/chat/ChatBubble.spec.d.ts.map +1 -0
  54. package/dist/patterns/chat/ChatBubble.spec.js +91 -0
  55. package/dist/patterns/chat/ChatBubble.svelte +95 -95
  56. package/dist/patterns/chat/ChatContainer.spec.d.ts +2 -0
  57. package/dist/patterns/chat/ChatContainer.spec.d.ts.map +1 -0
  58. package/dist/patterns/chat/ChatContainer.spec.js +30 -0
  59. package/dist/patterns/chat/ChatContainer.svelte +46 -46
  60. package/dist/patterns/chat/ChatDateDivider.spec.d.ts +2 -0
  61. package/dist/patterns/chat/ChatDateDivider.spec.d.ts.map +1 -0
  62. package/dist/patterns/chat/ChatDateDivider.spec.js +30 -0
  63. package/dist/patterns/chat/ChatDateDivider.svelte +27 -27
  64. package/dist/patterns/chat/ChatInvitationBubble.spec.d.ts +2 -0
  65. package/dist/patterns/chat/ChatInvitationBubble.spec.d.ts.map +1 -0
  66. package/dist/patterns/chat/ChatInvitationBubble.spec.js +46 -0
  67. package/dist/patterns/chat/ChatInvitationBubble.svelte +37 -37
  68. package/dist/patterns/chat/ChatInvitationNotice.spec.d.ts +2 -0
  69. package/dist/patterns/chat/ChatInvitationNotice.spec.d.ts.map +1 -0
  70. package/dist/patterns/chat/ChatInvitationNotice.spec.js +32 -0
  71. package/dist/patterns/chat/ChatInvitationNotice.svelte +27 -27
  72. package/dist/patterns/chat/ChatMessageGroup.spec.d.ts +2 -0
  73. package/dist/patterns/chat/ChatMessageGroup.spec.d.ts.map +1 -0
  74. package/dist/patterns/chat/ChatMessageGroup.spec.js +58 -0
  75. package/dist/patterns/chat/ChatMessageGroup.svelte +57 -57
  76. package/dist/patterns/chat/ChatSlotUpdate.spec.d.ts +2 -0
  77. package/dist/patterns/chat/ChatSlotUpdate.spec.d.ts.map +1 -0
  78. package/dist/patterns/chat/ChatSlotUpdate.spec.js +65 -0
  79. package/dist/patterns/chat/ChatSlotUpdate.svelte +46 -46
  80. package/dist/patterns/chat/ChatStatusBadge.spec.d.ts +2 -0
  81. package/dist/patterns/chat/ChatStatusBadge.spec.d.ts.map +1 -0
  82. package/dist/patterns/chat/ChatStatusBadge.spec.js +79 -0
  83. package/dist/patterns/chat/ChatStatusBadge.svelte +91 -91
  84. package/dist/patterns/chat/ChatStatusTransition.spec.d.ts +2 -0
  85. package/dist/patterns/chat/ChatStatusTransition.spec.d.ts.map +1 -0
  86. package/dist/patterns/chat/ChatStatusTransition.spec.js +81 -0
  87. package/dist/patterns/chat/ChatStatusTransition.svelte +64 -64
  88. package/dist/patterns/chat/ChatTextBubble.spec.d.ts +2 -0
  89. package/dist/patterns/chat/ChatTextBubble.spec.d.ts.map +1 -0
  90. package/dist/patterns/chat/ChatTextBubble.spec.js +35 -0
  91. package/dist/patterns/chat/ChatTextBubble.svelte +41 -41
  92. package/dist/patterns/chat/index.js +22 -22
  93. package/dist/patterns/data/DataGrid.svelte +45 -45
  94. package/dist/patterns/data/DataList.svelte +24 -24
  95. package/dist/patterns/data/DataTable.spec.js +61 -0
  96. package/dist/patterns/data/DataTable.svelte +36 -36
  97. package/dist/patterns/forms/FormActions.spec.js +95 -95
  98. package/dist/patterns/forms/FormActions.stories.svelte +97 -97
  99. package/dist/patterns/forms/FormActions.svelte +46 -46
  100. package/dist/patterns/forms/FormGrid.spec.js +34 -0
  101. package/dist/patterns/forms/FormGrid.svelte +33 -33
  102. package/dist/patterns/forms/FormSection.svelte +32 -32
  103. package/dist/patterns/forms/FormValidationSummary.stories.svelte +83 -83
  104. package/dist/patterns/forms/FormValidationSummary.svelte +74 -74
  105. package/dist/patterns/index.js +21 -21
  106. package/dist/patterns/layout/Sidebar.spec.js +240 -1
  107. package/dist/patterns/layout/Sidebar.svelte +39 -39
  108. package/dist/patterns/layout/SidebarTestWrapper.svelte +34 -0
  109. package/dist/patterns/layout/SidebarTestWrapper.svelte.d.ts +23 -0
  110. package/dist/patterns/layout/SidebarTestWrapper.svelte.d.ts.map +1 -0
  111. package/dist/patterns/layout/index.js +29 -29
  112. package/dist/patterns/navigation/BottomNav.stories.svelte +117 -117
  113. package/dist/patterns/navigation/BottomNav.svelte +74 -74
  114. package/dist/patterns/navigation/Header.spec.js +123 -0
  115. package/dist/patterns/navigation/Header.stories.svelte +77 -77
  116. package/dist/patterns/navigation/Header.svelte +251 -251
  117. package/dist/patterns/page/PageHeader.svelte +18 -18
  118. package/dist/patterns/page/PageLayout.svelte +40 -40
  119. package/dist/patterns/page/PageLoader.spec.js +57 -57
  120. package/dist/patterns/page/PageLoader.stories.svelte +137 -137
  121. package/dist/patterns/page/PageLoader.svelte +24 -24
  122. package/dist/patterns/page/SectionHeader.svelte +29 -29
  123. package/dist/presets/badges.js +112 -112
  124. package/dist/presets/buttons.js +76 -76
  125. package/dist/presets/index.js +9 -9
  126. package/dist/primitives/Accordion/Accordion.spec.js +112 -2
  127. package/dist/primitives/Accordion/Accordion.stories.svelte +75 -75
  128. package/dist/primitives/Accordion/Accordion.svelte +42 -42
  129. package/dist/primitives/Accordion/AccordionItem.svelte +95 -95
  130. package/dist/primitives/Accordion/AccordionToggleWrapper.test.svelte +28 -0
  131. package/dist/primitives/Accordion/AccordionToggleWrapper.test.svelte.d.ts +7 -0
  132. package/dist/primitives/Accordion/AccordionToggleWrapper.test.svelte.d.ts.map +1 -0
  133. package/dist/primitives/Alert/Alert.spec.js +173 -173
  134. package/dist/primitives/Alert/Alert.stories.svelte +88 -88
  135. package/dist/primitives/Alert/Alert.svelte +27 -27
  136. package/dist/primitives/Avatar/Avatar.spec.js +23 -0
  137. package/dist/primitives/Avatar/Avatar.stories.svelte +94 -94
  138. package/dist/primitives/Avatar/Avatar.svelte +66 -66
  139. package/dist/primitives/AvatarButton/AvatarButton.svelte +57 -57
  140. package/dist/primitives/Badges/Badge.spec.js +144 -144
  141. package/dist/primitives/Badges/Badge.stories.svelte +86 -86
  142. package/dist/primitives/Badges/Badge.svelte +99 -99
  143. package/dist/primitives/BottomSheet/BottomSheet.spec.js +238 -136
  144. package/dist/primitives/BottomSheet/BottomSheet.stories.svelte +83 -83
  145. package/dist/primitives/BottomSheet/BottomSheet.svelte +115 -115
  146. package/dist/primitives/BottomSheet/BottomSheetWithActions.test.svelte +20 -0
  147. package/dist/primitives/BottomSheet/BottomSheetWithActions.test.svelte.d.ts +10 -0
  148. package/dist/primitives/BottomSheet/BottomSheetWithActions.test.svelte.d.ts.map +1 -0
  149. package/dist/primitives/Breadcrumb/Breadcrumb.spec.js +123 -123
  150. package/dist/primitives/Breadcrumb/Breadcrumb.stories.svelte +23 -23
  151. package/dist/primitives/Breadcrumb/Breadcrumb.svelte +99 -99
  152. package/dist/primitives/Button/Button.spec.js +225 -225
  153. package/dist/primitives/Button/Button.stories.svelte +76 -76
  154. package/dist/primitives/Button/Button.svelte +278 -278
  155. package/dist/primitives/Button/ButtonGroup.spec.d.ts +2 -0
  156. package/dist/primitives/Button/ButtonGroup.spec.d.ts.map +1 -0
  157. package/dist/primitives/Button/ButtonGroup.spec.js +44 -0
  158. package/dist/primitives/Button/ButtonGroup.svelte +50 -50
  159. package/dist/primitives/Button/ButtonSaveDemo.spec.js +146 -146
  160. package/dist/primitives/Button/ButtonSaveDemo.svelte +25 -25
  161. package/dist/primitives/Button/ButtonVariantShowcase.svelte +129 -129
  162. package/dist/primitives/Card.spec.js +49 -49
  163. package/dist/primitives/Card.stories.svelte +22 -22
  164. package/dist/primitives/Card.svelte +28 -28
  165. package/dist/primitives/CardAction/CardAction.svelte +68 -68
  166. package/dist/primitives/Checkbox/Checkbox.spec.js +32 -0
  167. package/dist/primitives/Checkbox/Checkbox.stories.svelte +84 -84
  168. package/dist/primitives/Checkbox/Checkbox.svelte +88 -88
  169. package/dist/primitives/DarkModeToggle.spec.js +390 -390
  170. package/dist/primitives/DarkModeToggle.stories.svelte +57 -57
  171. package/dist/primitives/DarkModeToggle.svelte +136 -136
  172. package/dist/primitives/Drawer/Drawer.spec.js +437 -0
  173. package/dist/primitives/Drawer/Drawer.stories.svelte +80 -80
  174. package/dist/primitives/Drawer/Drawer.svelte +224 -224
  175. package/dist/primitives/Drawer/DrawerTestWrapper.svelte +86 -0
  176. package/dist/primitives/Drawer/DrawerTestWrapper.svelte.d.ts +26 -0
  177. package/dist/primitives/Drawer/DrawerTestWrapper.svelte.d.ts.map +1 -0
  178. package/dist/primitives/Dropdown/Dropdown.spec.js +116 -0
  179. package/dist/primitives/Dropdown/Dropdown.stories.svelte +137 -137
  180. package/dist/primitives/Dropdown/Dropdown.svelte +170 -170
  181. package/dist/primitives/Dropdown/DropdownDivider.spec.d.ts +2 -0
  182. package/dist/primitives/Dropdown/DropdownDivider.spec.d.ts.map +1 -0
  183. package/dist/primitives/Dropdown/DropdownDivider.spec.js +30 -0
  184. package/dist/primitives/Dropdown/DropdownDivider.svelte +9 -9
  185. package/dist/primitives/Dropdown/DropdownItem.spec.js +155 -1
  186. package/dist/primitives/Dropdown/DropdownItem.svelte +80 -80
  187. package/dist/primitives/Dropdown/DropdownItemTestWrapper.svelte +43 -0
  188. package/dist/primitives/Dropdown/DropdownItemTestWrapper.svelte.d.ts +17 -0
  189. package/dist/primitives/Dropdown/DropdownItemTestWrapper.svelte.d.ts.map +1 -0
  190. package/dist/primitives/Helper/Helper.spec.d.ts +2 -0
  191. package/dist/primitives/Helper/Helper.spec.d.ts.map +1 -0
  192. package/dist/primitives/Helper/Helper.spec.js +57 -0
  193. package/dist/primitives/Helper/Helper.svelte +33 -33
  194. package/dist/primitives/Icons/ArrowLeft.svelte +8 -8
  195. package/dist/primitives/Icons/ArrowRight.svelte +8 -8
  196. package/dist/primitives/Icons/Availability.svelte +14 -14
  197. package/dist/primitives/Icons/Back.svelte +14 -14
  198. package/dist/primitives/Icons/CheckCircle.svelte +6 -6
  199. package/dist/primitives/Icons/CheckCircleOutline.svelte +15 -15
  200. package/dist/primitives/Icons/ChevronLeft.svelte +4 -4
  201. package/dist/primitives/Icons/ChevronRight.svelte +4 -4
  202. package/dist/primitives/Icons/Copy.svelte +15 -15
  203. package/dist/primitives/Icons/Cross.svelte +5 -5
  204. package/dist/primitives/Icons/DownArrow.svelte +8 -8
  205. package/dist/primitives/Icons/ErrorCircle.svelte +6 -6
  206. package/dist/primitives/Icons/FacebookIcon.svelte +2 -2
  207. package/dist/primitives/Icons/Home.svelte +15 -15
  208. package/dist/primitives/Icons/Icon.spec.js +169 -169
  209. package/dist/primitives/Icons/Icon.stories.svelte +100 -100
  210. package/dist/primitives/Icons/Icon.svelte +52 -52
  211. package/dist/primitives/Icons/IconGallery.stories.svelte +235 -235
  212. package/dist/primitives/Icons/Info.svelte +7 -7
  213. package/dist/primitives/Icons/InstagramIcon.svelte +4 -4
  214. package/dist/primitives/Icons/LogoInstagram.svelte +2 -2
  215. package/dist/primitives/Icons/Message.svelte +15 -15
  216. package/dist/primitives/Icons/MoonIcon.svelte +5 -5
  217. package/dist/primitives/Icons/More.svelte +21 -21
  218. package/dist/primitives/Icons/MoreHori.spec.js +61 -61
  219. package/dist/primitives/Icons/MoreHori.svelte +22 -22
  220. package/dist/primitives/Icons/Notification.svelte +14 -14
  221. package/dist/primitives/Icons/Payment.svelte +14 -14
  222. package/dist/primitives/Icons/Profile.svelte +21 -21
  223. package/dist/primitives/Icons/Reload.svelte +29 -29
  224. package/dist/primitives/Icons/Shows.svelte +21 -21
  225. package/dist/primitives/Icons/Signout.svelte +21 -21
  226. package/dist/primitives/Icons/SunIcon.svelte +8 -8
  227. package/dist/primitives/Icons/TiktokIcon.svelte +2 -2
  228. package/dist/primitives/Icons/TwitterIcon.svelte +2 -2
  229. package/dist/primitives/Icons/WarningIcon.spec.js +18 -18
  230. package/dist/primitives/Icons/WarningIcon.svelte +5 -5
  231. package/dist/primitives/Input/Input.spec.js +1235 -573
  232. package/dist/primitives/Input/Input.stories.svelte +139 -139
  233. package/dist/primitives/Input/Input.svelte +423 -423
  234. package/dist/primitives/Input/Select.spec.js +632 -218
  235. package/dist/primitives/Input/Select.stories.svelte +112 -112
  236. package/dist/primitives/Input/Select.svelte +252 -252
  237. package/dist/primitives/Input/Textarea.stories.svelte +137 -137
  238. package/dist/primitives/Input/Textarea.svelte +105 -105
  239. package/dist/primitives/Label/Label.spec.js +9 -0
  240. package/dist/primitives/Label/Label.svelte +37 -37
  241. package/dist/primitives/LandingButton/LandingButton.spec.d.ts +2 -0
  242. package/dist/primitives/LandingButton/LandingButton.spec.d.ts.map +1 -0
  243. package/dist/primitives/LandingButton/LandingButton.spec.js +61 -0
  244. package/dist/primitives/LandingButton/LandingButton.svelte +92 -92
  245. package/dist/primitives/MenuItem/MenuItem.spec.d.ts +2 -0
  246. package/dist/primitives/MenuItem/MenuItem.spec.d.ts.map +1 -0
  247. package/dist/primitives/MenuItem/MenuItem.spec.js +130 -0
  248. package/dist/primitives/MenuItem/MenuItem.svelte +85 -85
  249. package/dist/primitives/Modal/Modal.spec.js +314 -99
  250. package/dist/primitives/Modal/Modal.stories.svelte +86 -86
  251. package/dist/primitives/Modal/Modal.svelte +181 -181
  252. package/dist/primitives/NavItem/NavItem.spec.d.ts +2 -0
  253. package/dist/primitives/NavItem/NavItem.spec.d.ts.map +1 -0
  254. package/dist/primitives/NavItem/NavItem.spec.js +97 -0
  255. package/dist/primitives/NavItem/NavItem.svelte +75 -75
  256. package/dist/primitives/Pagination/Pagination.stories.svelte +76 -76
  257. package/dist/primitives/Pagination/Pagination.svelte +261 -261
  258. package/dist/primitives/Radio/Radio.stories.svelte +80 -80
  259. package/dist/primitives/Radio/Radio.svelte +67 -67
  260. package/dist/primitives/SearchResultItem/SearchResultItem.spec.d.ts +2 -0
  261. package/dist/primitives/SearchResultItem/SearchResultItem.spec.d.ts.map +1 -0
  262. package/dist/primitives/SearchResultItem/SearchResultItem.spec.js +78 -0
  263. package/dist/primitives/SearchResultItem/SearchResultItem.svelte +109 -109
  264. package/dist/primitives/SidebarToggle/SidebarToggle.spec.d.ts +2 -0
  265. package/dist/primitives/SidebarToggle/SidebarToggle.spec.d.ts.map +1 -0
  266. package/dist/primitives/SidebarToggle/SidebarToggle.spec.js +61 -0
  267. package/dist/primitives/SidebarToggle/SidebarToggle.svelte +55 -55
  268. package/dist/primitives/Skeleton/CardPlaceholder.svelte +87 -87
  269. package/dist/primitives/Skeleton/ImagePlaceholder.svelte +59 -59
  270. package/dist/primitives/Skeleton/ListPlaceholder.svelte +76 -76
  271. package/dist/primitives/Skeleton/Skeleton.stories.svelte +151 -151
  272. package/dist/primitives/Skeleton/Skeleton.svelte +26 -26
  273. package/dist/primitives/Spinner/Spinner.spec.js +84 -71
  274. package/dist/primitives/Spinner/Spinner.stories.svelte +29 -29
  275. package/dist/primitives/Spinner/Spinner.svelte +20 -20
  276. package/dist/primitives/Tabs/TabItem.svelte +49 -49
  277. package/dist/primitives/Tabs/Tabs.stories.svelte +112 -112
  278. package/dist/primitives/Tabs/Tabs.svelte +137 -137
  279. package/dist/primitives/Toggle.spec.js +221 -146
  280. package/dist/primitives/Toggle.stories.svelte +92 -92
  281. package/dist/primitives/Toggle.svelte +141 -141
  282. package/dist/primitives/ToggleTestWrapper.svelte +30 -0
  283. package/dist/primitives/ToggleTestWrapper.svelte.d.ts +29 -0
  284. package/dist/primitives/ToggleTestWrapper.svelte.d.ts.map +1 -0
  285. package/dist/primitives/Tooltip/Tooltip.spec.d.ts +2 -0
  286. package/dist/primitives/Tooltip/Tooltip.spec.d.ts.map +1 -0
  287. package/dist/primitives/Tooltip/Tooltip.spec.js +126 -0
  288. package/dist/primitives/Tooltip/Tooltip.svelte +83 -83
  289. package/dist/primitives/Typography/Typography.svelte +53 -53
  290. package/dist/primitives/ValidationError.spec.js +103 -103
  291. package/dist/primitives/ValidationError.stories.svelte +69 -69
  292. package/dist/primitives/ValidationError.svelte +29 -29
  293. package/dist/primitives/index.js +113 -113
  294. package/dist/recipes/CropImage/CropImage.spec.js +208 -208
  295. package/dist/recipes/CropImage/CropImage.stories.svelte +104 -104
  296. package/dist/recipes/CropImage/CropImage.svelte +241 -241
  297. package/dist/recipes/ImageUploader/ImageUploader.stories.svelte +125 -125
  298. package/dist/recipes/ImageUploader/ImageUploader.svelte +992 -992
  299. package/dist/recipes/SuperLogin/SuperLogin.spec.js +21 -21
  300. package/dist/recipes/SuperLogin/SuperLogin.svelte +4 -4
  301. package/dist/recipes/Toaster/Toaster.stories.svelte +62 -62
  302. package/dist/recipes/feedback/EmptyState/EmptyState.svelte +1 -1
  303. package/dist/recipes/feedback/ErrorDisplay.spec.js +69 -69
  304. package/dist/recipes/feedback/ErrorDisplay.stories.svelte +101 -101
  305. package/dist/recipes/feedback/ErrorDisplay.svelte +1 -1
  306. package/dist/recipes/feedback/StatusIndicator/StatusIndicator.spec.js +133 -133
  307. package/dist/recipes/feedback/StatusIndicator/StatusIndicator.svelte +157 -157
  308. package/dist/recipes/fields/CheckboxField.svelte +85 -85
  309. package/dist/recipes/fields/FormField.svelte +58 -58
  310. package/dist/recipes/fields/RadioGroup.svelte +95 -95
  311. package/dist/recipes/fields/SelectField.svelte +82 -82
  312. package/dist/recipes/fields/TextareaField.svelte +97 -97
  313. package/dist/recipes/fields/ToggleField.svelte +60 -60
  314. package/dist/recipes/fields/index.js +7 -7
  315. package/dist/recipes/inputs/MultiSelect.spec.js +263 -263
  316. package/dist/recipes/inputs/MultiSelect.stories.svelte +133 -133
  317. package/dist/recipes/inputs/MultiSelect.svelte +283 -283
  318. package/dist/recipes/inputs/OTPInput.spec.js +251 -251
  319. package/dist/recipes/inputs/OTPInput.stories.svelte +162 -162
  320. package/dist/recipes/inputs/OTPInput.svelte +117 -117
  321. package/dist/recipes/inputs/PasswordInput.svelte +22 -22
  322. package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte +131 -131
  323. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.spec.js +19 -19
  324. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.stories.svelte +123 -123
  325. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte +336 -339
  326. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte.d.ts.map +1 -1
  327. package/dist/recipes/inputs/Search.spec.js +66 -2
  328. package/dist/recipes/inputs/Search.svelte +102 -102
  329. package/dist/recipes/inputs/index.js +7 -7
  330. package/dist/recipes/modals/AlertModal.svelte +130 -130
  331. package/dist/recipes/modals/ConfirmationModal.spec.js +396 -206
  332. package/dist/recipes/modals/ConfirmationModal.stories.svelte +119 -119
  333. package/dist/recipes/modals/ConfirmationModal.svelte +162 -162
  334. package/dist/recipes/modals/InputModal.svelte +182 -182
  335. package/dist/recipes/modals/ModalStateManager.spec.js +100 -100
  336. package/dist/recipes/modals/ModalStateManager.svelte +77 -77
  337. package/dist/recipes/modals/ModalTestWrapper.svelte +65 -65
  338. package/dist/recipes/modals/StatusModal.svelte +206 -206
  339. package/dist/services/EventService.d.ts +1 -1
  340. package/dist/services/EventService.d.ts.map +1 -1
  341. package/dist/services/EventService.js +79 -75
  342. package/dist/services/EventService.spec.js +217 -217
  343. package/dist/services/ShowService.js +144 -143
  344. package/dist/services/ShowService.spec.js +345 -345
  345. package/dist/stores/auth.svelte.spec.d.ts +2 -0
  346. package/dist/stores/auth.svelte.spec.d.ts.map +1 -0
  347. package/dist/stores/auth.svelte.spec.js +112 -0
  348. package/dist/stores/formDataStore.svelte.spec.d.ts +2 -0
  349. package/dist/stores/formDataStore.svelte.spec.d.ts.map +1 -0
  350. package/dist/stores/formDataStore.svelte.spec.js +150 -0
  351. package/dist/stores/formSave.svelte.spec.d.ts +2 -0
  352. package/dist/stores/formSave.svelte.spec.d.ts.map +1 -0
  353. package/dist/stores/formSave.svelte.spec.js +196 -0
  354. package/dist/stores/navigation.spec.d.ts +2 -0
  355. package/dist/stores/navigation.spec.d.ts.map +1 -0
  356. package/dist/stores/navigation.spec.js +53 -0
  357. package/dist/stores/toaster.js +13 -13
  358. package/dist/stories/ButtonAuditReview.stories.svelte +14 -14
  359. package/dist/stories/ButtonAuditReview.svelte +427 -427
  360. package/dist/stories/PatternsGallery.stories.svelte +19 -19
  361. package/dist/stories/PatternsGallery.svelte +206 -206
  362. package/dist/stories/PrimitivesGallery.stories.svelte +19 -19
  363. package/dist/stories/PrimitivesGallery.svelte +756 -756
  364. package/dist/stories/RecipesGallery.stories.svelte +19 -19
  365. package/dist/stories/RecipesGallery.svelte +454 -454
  366. package/dist/stories/button-audit-manifest.json +11186 -11186
  367. package/dist/tailwind/preset.cjs +82 -82
  368. package/dist/telemetry.d.ts.map +1 -1
  369. package/dist/telemetry.js +402 -405
  370. package/dist/telemetry.server.js +212 -212
  371. package/dist/telemetry.server.spec.js +437 -438
  372. package/dist/telemetry.spec.js +1168 -1169
  373. package/dist/tokens/tokens.css +87 -87
  374. package/dist/tokens/typography-base.css +163 -163
  375. package/dist/tokens/utilities.css +353 -353
  376. package/dist/utils/apiConfig.js +117 -120
  377. package/dist/utils/apiConfig.spec.js +219 -219
  378. package/dist/utils/greetings.js +187 -187
  379. package/dist/utils/haptic.spec.d.ts +2 -0
  380. package/dist/utils/haptic.spec.d.ts.map +1 -0
  381. package/dist/utils/haptic.spec.js +153 -0
  382. package/dist/utils/imageOptimizer.spec.d.ts +2 -0
  383. package/dist/utils/imageOptimizer.spec.d.ts.map +1 -0
  384. package/dist/utils/imageOptimizer.spec.js +201 -0
  385. package/dist/utils/imageValidation.js +121 -121
  386. package/dist/utils/logger.spec.d.ts +2 -0
  387. package/dist/utils/logger.spec.d.ts.map +1 -0
  388. package/dist/utils/logger.spec.js +95 -0
  389. package/dist/utils/transitions.js +4 -4
  390. package/dist/utils/utils.js +693 -693
  391. package/package.json +292 -294
@@ -1,252 +1,252 @@
1
- <script lang="ts">
2
- import { onMount, tick } from "svelte";
3
- import { ChevronDownOutline } from "../Icons";
4
- import { portal as portalAction } from "../../utils/portal.js";
5
- import { typography } from "../../tokens/typography";
6
- import { formControlSizes } from "../../tokens/sizing";
7
- import { bloom } from "../../utils/transitions.js";
8
-
9
- interface SelectItem {
10
- value: string;
11
- name: string;
12
- }
13
-
14
- interface Props {
15
- value?: string;
16
- items?: SelectItem[];
17
- placeholder?: string;
18
- label?: string;
19
- required?: boolean;
20
- disabled?: boolean;
21
- error?: string;
22
- name?: string;
23
- id?: string;
24
- size?: "sm" | "md" | "lg";
25
- portal?: boolean;
26
- onchange?: (detail: { value: string; item: SelectItem }) => void;
27
- [key: string]: unknown;
28
- }
29
-
30
- let {
31
- value = $bindable(""),
32
- items = [],
33
- placeholder = "",
34
- label = "",
35
- required = false,
36
- disabled = false,
37
- error = "",
38
- name = "",
39
- id = "",
40
- size = "md",
41
- portal = false,
42
- onchange,
43
- ...restProps
44
- }: Props = $props();
45
-
46
- let isOpen = $state(false);
47
- let triggerElement = $state<HTMLButtonElement | null>(null);
48
- let dropdownElement = $state<HTMLUListElement | null>(null);
49
- let focusedIndex = $state(-1);
50
- let dropdownPosition = $state({ top: 0, left: 0, width: 0 });
51
-
52
- const instanceId = Math.random().toString(36).substring(2, 9);
53
-
54
- let selectedItem = $derived(items.find((item) => item.value === value));
55
- let displayText = $derived(selectedItem ? selectedItem.name : placeholder);
56
-
57
- let sizeClass = $derived(formControlSizes[size] || formControlSizes.md);
58
-
59
- function updateDropdownPosition() {
60
- if (!triggerElement || !portal) return;
61
- const rect = triggerElement.getBoundingClientRect();
62
- dropdownPosition = {
63
- top: rect.bottom + 4,
64
- left: rect.left,
65
- width: rect.width
66
- };
67
- }
68
-
69
- async function toggle() {
70
- if (disabled) return;
71
- isOpen = !isOpen;
72
- if (isOpen) {
73
- focusedIndex = items.findIndex((item) => item.value === value);
74
- window.dispatchEvent(new CustomEvent('select-opened', { detail: { instanceId } }));
75
- if (portal) {
76
- await tick();
77
- updateDropdownPosition();
78
- }
79
- }
80
- }
81
-
82
- function handleOtherSelectOpened(event: Event) {
83
- const customEvent = event as CustomEvent<{ instanceId: string }>;
84
- if (customEvent.detail.instanceId !== instanceId && isOpen) {
85
- close();
86
- }
87
- }
88
-
89
- function close() {
90
- isOpen = false;
91
- focusedIndex = -1;
92
- }
93
-
94
- function selectItem(item: SelectItem) {
95
- value = item.value;
96
- onchange?.({ value: item.value, item });
97
- close();
98
- triggerElement?.focus();
99
- }
100
-
101
- function handleKeydown(event: KeyboardEvent) {
102
- if (disabled) return;
103
-
104
- switch (event.key) {
105
- case "Enter":
106
- case " ":
107
- event.preventDefault();
108
- if (isOpen && focusedIndex >= 0) {
109
- selectItem(items[focusedIndex]);
110
- } else {
111
- toggle();
112
- }
113
- break;
114
- case "ArrowDown":
115
- event.preventDefault();
116
- if (!isOpen) {
117
- isOpen = true;
118
- focusedIndex = 0;
119
- } else {
120
- focusedIndex = Math.min(focusedIndex + 1, items.length - 1);
121
- }
122
- break;
123
- case "ArrowUp":
124
- event.preventDefault();
125
- if (isOpen) {
126
- focusedIndex = Math.max(focusedIndex - 1, 0);
127
- }
128
- break;
129
- case "Escape":
130
- event.preventDefault();
131
- close();
132
- break;
133
- case "Tab":
134
- close();
135
- break;
136
- }
137
- }
138
-
139
- function handleClickOutside(event: MouseEvent) {
140
- if (!isOpen) return;
141
- const clickedOutsideTrigger = triggerElement && !triggerElement.contains(event.target as Node);
142
- const clickedOutsideDropdown = !dropdownElement || !dropdownElement.contains(event.target as Node);
143
- if (clickedOutsideTrigger && clickedOutsideDropdown) {
144
- close();
145
- }
146
- }
147
-
148
- onMount(() => {
149
- document.addEventListener("click", handleClickOutside, true);
150
- window.addEventListener("select-opened", handleOtherSelectOpened);
151
-
152
- // Update position on scroll/resize when portal is enabled
153
- if (portal) {
154
- window.addEventListener("scroll", updateDropdownPosition, true);
155
- window.addEventListener("resize", updateDropdownPosition);
156
- }
157
-
158
- return () => {
159
- document.removeEventListener("click", handleClickOutside, true);
160
- window.removeEventListener("select-opened", handleOtherSelectOpened);
161
- if (portal) {
162
- window.removeEventListener("scroll", updateDropdownPosition, true);
163
- window.removeEventListener("resize", updateDropdownPosition);
164
- }
165
- };
166
- });
167
- </script>
168
-
169
- <div class="w-full flex flex-col gap-2" {...restProps}>
170
- {#if label}
171
- <div class="flex justify-start items-center gap-1">
172
- <label for={id || name} class={typography.label}>
173
- {label}{#if required}<span class="text-red-500 font-medium text-sm ml-0.5">*</span>{/if}
174
- </label>
175
- </div>
176
- {/if}
177
-
178
- <div class="relative w-full">
179
- <button
180
- type="button"
181
- bind:this={triggerElement}
182
- {id}
183
- {name}
184
- class="flex items-center justify-between w-full {sizeClass} bg-gray-50 dark:bg-gray-800 border rounded-lg cursor-pointer transition-colors text-left focus:outline-hidden focus:ring-4 focus:ring-blue-300 dark:focus:ring-blue-800 {error ? 'border-red-500 dark:border-red-500' : 'border-gray-300 dark:border-gray-600 hover:border-blue-500 dark:hover:border-blue-500'} {disabled ? 'opacity-50 cursor-not-allowed' : ''} {!selectedItem ? `${typography.textMuted}` : `${typography.body}`}"
185
- {disabled}
186
- aria-haspopup="listbox"
187
- aria-expanded={isOpen}
188
- onclick={toggle}
189
- onkeydown={handleKeydown}
190
- >
191
- <span class="flex-1 overflow-hidden text-ellipsis whitespace-nowrap">{displayText}</span>
192
- <ChevronDownOutline class="w-4 h-4 shrink-0 {typography.iconMuted} transition-transform duration-200 {isOpen ? 'rotate-180' : ''}" />
193
- </button>
194
-
195
- {#if isOpen && !portal}
196
- <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
197
- <ul
198
- bind:this={dropdownElement}
199
- class="absolute top-full left-0 right-0 z-50 mt-1 bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg shadow-lg max-h-60 overflow-y-auto py-1"
200
- role="listbox"
201
- tabindex="-1"
202
- transition:bloom={{ origin: "top left" }}
203
- >
204
- {#each items as item, index}
205
- <!-- svelte-ignore a11y_click_events_have_key_events -->
206
- <li
207
- id="{id || name}-option-{index}"
208
- class={`px-4 py-2 cursor-pointer ${typography.sm} transition-colors ${item.value === value ? '' : `${typography.textMuted}`} ${index === focusedIndex ? 'bg-gray-100 dark:bg-gray-600' : 'hover:bg-gray-100 dark:hover:bg-gray-600'}`}
209
- role="option"
210
- aria-selected={item.value === value}
211
- onclick={() => selectItem(item)}
212
- onmouseenter={() => (focusedIndex = index)}
213
- >
214
- {item.name}
215
- </li>
216
- {/each}
217
- </ul>
218
- {/if}
219
- </div>
220
-
221
- {#if error}
222
- <p class={typography.error}>{error}</p>
223
- {/if}
224
- </div>
225
-
226
- {#if isOpen && portal}
227
- <!-- Portal dropdown - truly moved to document.body to escape overflow containers and transforms -->
228
- <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
229
- <ul
230
- bind:this={dropdownElement}
231
- use:portalAction
232
- class="fixed z-[9999] bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg shadow-lg max-h-60 overflow-y-auto py-1"
233
- style="top: {dropdownPosition.top}px; left: {dropdownPosition.left}px; width: {dropdownPosition.width}px;"
234
- role="listbox"
235
- tabindex="-1"
236
- transition:bloom={{ origin: "top left" }}
237
- >
238
- {#each items as item, index}
239
- <!-- svelte-ignore a11y_click_events_have_key_events -->
240
- <li
241
- id="{id || name}-option-{index}"
242
- class={`px-4 py-2 cursor-pointer ${typography.sm} transition-colors ${item.value === value ? '' : `${typography.textMuted}`} ${index === focusedIndex ? 'bg-gray-100 dark:bg-gray-600' : 'hover:bg-gray-100 dark:hover:bg-gray-600'}`}
243
- role="option"
244
- aria-selected={item.value === value}
245
- onclick={() => selectItem(item)}
246
- onmouseenter={() => (focusedIndex = index)}
247
- >
248
- {item.name}
249
- </li>
250
- {/each}
251
- </ul>
252
- {/if}
1
+ <script lang="ts">
2
+ import { onMount, tick } from "svelte";
3
+ import { ChevronDownOutline } from "../Icons";
4
+ import { portal as portalAction } from "../../utils/portal.js";
5
+ import { typography } from "../../tokens/typography";
6
+ import { formControlSizes } from "../../tokens/sizing";
7
+ import { bloom } from "../../utils/transitions.js";
8
+
9
+ interface SelectItem {
10
+ value: string;
11
+ name: string;
12
+ }
13
+
14
+ interface Props {
15
+ value?: string;
16
+ items?: SelectItem[];
17
+ placeholder?: string;
18
+ label?: string;
19
+ required?: boolean;
20
+ disabled?: boolean;
21
+ error?: string;
22
+ name?: string;
23
+ id?: string;
24
+ size?: "sm" | "md" | "lg";
25
+ portal?: boolean;
26
+ onchange?: (detail: { value: string; item: SelectItem }) => void;
27
+ [key: string]: unknown;
28
+ }
29
+
30
+ let {
31
+ value = $bindable(""),
32
+ items = [],
33
+ placeholder = "",
34
+ label = "",
35
+ required = false,
36
+ disabled = false,
37
+ error = "",
38
+ name = "",
39
+ id = "",
40
+ size = "md",
41
+ portal = false,
42
+ onchange,
43
+ ...restProps
44
+ }: Props = $props();
45
+
46
+ let isOpen = $state(false);
47
+ let triggerElement = $state<HTMLButtonElement | null>(null);
48
+ let dropdownElement = $state<HTMLUListElement | null>(null);
49
+ let focusedIndex = $state(-1);
50
+ let dropdownPosition = $state({ top: 0, left: 0, width: 0 });
51
+
52
+ const instanceId = Math.random().toString(36).substring(2, 9);
53
+
54
+ let selectedItem = $derived(items.find((item) => item.value === value));
55
+ let displayText = $derived(selectedItem ? selectedItem.name : placeholder);
56
+
57
+ let sizeClass = $derived(formControlSizes[size] || formControlSizes.md);
58
+
59
+ function updateDropdownPosition() {
60
+ if (!triggerElement || !portal) return;
61
+ const rect = triggerElement.getBoundingClientRect();
62
+ dropdownPosition = {
63
+ top: rect.bottom + 4,
64
+ left: rect.left,
65
+ width: rect.width
66
+ };
67
+ }
68
+
69
+ async function toggle() {
70
+ if (disabled) return;
71
+ isOpen = !isOpen;
72
+ if (isOpen) {
73
+ focusedIndex = items.findIndex((item) => item.value === value);
74
+ window.dispatchEvent(new CustomEvent('select-opened', { detail: { instanceId } }));
75
+ if (portal) {
76
+ await tick();
77
+ updateDropdownPosition();
78
+ }
79
+ }
80
+ }
81
+
82
+ function handleOtherSelectOpened(event: Event) {
83
+ const customEvent = event as CustomEvent<{ instanceId: string }>;
84
+ if (customEvent.detail.instanceId !== instanceId && isOpen) {
85
+ close();
86
+ }
87
+ }
88
+
89
+ function close() {
90
+ isOpen = false;
91
+ focusedIndex = -1;
92
+ }
93
+
94
+ function selectItem(item: SelectItem) {
95
+ value = item.value;
96
+ onchange?.({ value: item.value, item });
97
+ close();
98
+ triggerElement?.focus();
99
+ }
100
+
101
+ function handleKeydown(event: KeyboardEvent) {
102
+ if (disabled) return;
103
+
104
+ switch (event.key) {
105
+ case "Enter":
106
+ case " ":
107
+ event.preventDefault();
108
+ if (isOpen && focusedIndex >= 0) {
109
+ selectItem(items[focusedIndex]);
110
+ } else {
111
+ toggle();
112
+ }
113
+ break;
114
+ case "ArrowDown":
115
+ event.preventDefault();
116
+ if (!isOpen) {
117
+ isOpen = true;
118
+ focusedIndex = 0;
119
+ } else {
120
+ focusedIndex = Math.min(focusedIndex + 1, items.length - 1);
121
+ }
122
+ break;
123
+ case "ArrowUp":
124
+ event.preventDefault();
125
+ if (isOpen) {
126
+ focusedIndex = Math.max(focusedIndex - 1, 0);
127
+ }
128
+ break;
129
+ case "Escape":
130
+ event.preventDefault();
131
+ close();
132
+ break;
133
+ case "Tab":
134
+ close();
135
+ break;
136
+ }
137
+ }
138
+
139
+ function handleClickOutside(event: MouseEvent) {
140
+ if (!isOpen) return;
141
+ const clickedOutsideTrigger = triggerElement && !triggerElement.contains(event.target as Node);
142
+ const clickedOutsideDropdown = !dropdownElement || !dropdownElement.contains(event.target as Node);
143
+ if (clickedOutsideTrigger && clickedOutsideDropdown) {
144
+ close();
145
+ }
146
+ }
147
+
148
+ onMount(() => {
149
+ document.addEventListener("click", handleClickOutside, true);
150
+ window.addEventListener("select-opened", handleOtherSelectOpened);
151
+
152
+ // Update position on scroll/resize when portal is enabled
153
+ if (portal) {
154
+ window.addEventListener("scroll", updateDropdownPosition, true);
155
+ window.addEventListener("resize", updateDropdownPosition);
156
+ }
157
+
158
+ return () => {
159
+ document.removeEventListener("click", handleClickOutside, true);
160
+ window.removeEventListener("select-opened", handleOtherSelectOpened);
161
+ if (portal) {
162
+ window.removeEventListener("scroll", updateDropdownPosition, true);
163
+ window.removeEventListener("resize", updateDropdownPosition);
164
+ }
165
+ };
166
+ });
167
+ </script>
168
+
169
+ <div class="w-full flex flex-col gap-2" {...restProps}>
170
+ {#if label}
171
+ <div class="flex justify-start items-center gap-1">
172
+ <label for={id || name} class={typography.label}>
173
+ {label}{#if required}<span class="text-red-500 font-medium text-sm ml-0.5">*</span>{/if}
174
+ </label>
175
+ </div>
176
+ {/if}
177
+
178
+ <div class="relative w-full">
179
+ <button
180
+ type="button"
181
+ bind:this={triggerElement}
182
+ {id}
183
+ {name}
184
+ class="flex items-center justify-between w-full {sizeClass} bg-gray-50 dark:bg-gray-800 border rounded-lg cursor-pointer transition-colors text-left focus:outline-hidden focus:ring-4 focus:ring-blue-300 dark:focus:ring-blue-800 {error ? 'border-red-500 dark:border-red-500' : 'border-gray-300 dark:border-gray-600 hover:border-blue-500 dark:hover:border-blue-500'} {disabled ? 'opacity-50 cursor-not-allowed' : ''} {!selectedItem ? `${typography.textMuted}` : `${typography.body}`}"
185
+ {disabled}
186
+ aria-haspopup="listbox"
187
+ aria-expanded={isOpen}
188
+ onclick={toggle}
189
+ onkeydown={handleKeydown}
190
+ >
191
+ <span class="flex-1 overflow-hidden text-ellipsis whitespace-nowrap">{displayText}</span>
192
+ <ChevronDownOutline class="w-4 h-4 shrink-0 {typography.iconMuted} transition-transform duration-200 {isOpen ? 'rotate-180' : ''}" />
193
+ </button>
194
+
195
+ {#if isOpen && !portal}
196
+ <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
197
+ <ul
198
+ bind:this={dropdownElement}
199
+ class="absolute top-full left-0 right-0 z-50 mt-1 bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg shadow-lg max-h-60 overflow-y-auto py-1"
200
+ role="listbox"
201
+ tabindex="-1"
202
+ transition:bloom={{ origin: "top left" }}
203
+ >
204
+ {#each items as item, index}
205
+ <!-- svelte-ignore a11y_click_events_have_key_events -->
206
+ <li
207
+ id="{id || name}-option-{index}"
208
+ class={`px-4 py-2 cursor-pointer ${typography.sm} transition-colors ${item.value === value ? '' : `${typography.textMuted}`} ${index === focusedIndex ? 'bg-gray-100 dark:bg-gray-600' : 'hover:bg-gray-100 dark:hover:bg-gray-600'}`}
209
+ role="option"
210
+ aria-selected={item.value === value}
211
+ onclick={() => selectItem(item)}
212
+ onmouseenter={() => (focusedIndex = index)}
213
+ >
214
+ {item.name}
215
+ </li>
216
+ {/each}
217
+ </ul>
218
+ {/if}
219
+ </div>
220
+
221
+ {#if error}
222
+ <p class={typography.error}>{error}</p>
223
+ {/if}
224
+ </div>
225
+
226
+ {#if isOpen && portal}
227
+ <!-- Portal dropdown - truly moved to document.body to escape overflow containers and transforms -->
228
+ <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
229
+ <ul
230
+ bind:this={dropdownElement}
231
+ use:portalAction
232
+ class="fixed z-[9999] bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg shadow-lg max-h-60 overflow-y-auto py-1"
233
+ style="top: {dropdownPosition.top}px; left: {dropdownPosition.left}px; width: {dropdownPosition.width}px;"
234
+ role="listbox"
235
+ tabindex="-1"
236
+ transition:bloom={{ origin: "top left" }}
237
+ >
238
+ {#each items as item, index}
239
+ <!-- svelte-ignore a11y_click_events_have_key_events -->
240
+ <li
241
+ id="{id || name}-option-{index}"
242
+ class={`px-4 py-2 cursor-pointer ${typography.sm} transition-colors ${item.value === value ? '' : `${typography.textMuted}`} ${index === focusedIndex ? 'bg-gray-100 dark:bg-gray-600' : 'hover:bg-gray-100 dark:hover:bg-gray-600'}`}
243
+ role="option"
244
+ aria-selected={item.value === value}
245
+ onclick={() => selectItem(item)}
246
+ onmouseenter={() => (focusedIndex = index)}
247
+ >
248
+ {item.name}
249
+ </li>
250
+ {/each}
251
+ </ul>
252
+ {/if}