@getmicdrop/svelte-components 5.5.1 → 5.5.5

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 (472) hide show
  1. package/dist/calendar/AboutShow/AboutShow.spec.d.ts +2 -0
  2. package/dist/calendar/AboutShow/AboutShow.spec.d.ts.map +1 -0
  3. package/dist/calendar/AboutShow/AboutShow.spec.js +791 -0
  4. package/dist/calendar/AboutShow/AboutShow.svelte +172 -172
  5. package/dist/calendar/Calendar/MiniMonthCalendar.spec.d.ts +2 -0
  6. package/dist/calendar/Calendar/MiniMonthCalendar.spec.d.ts.map +1 -0
  7. package/dist/calendar/Calendar/MiniMonthCalendar.spec.js +1191 -0
  8. package/dist/calendar/Calendar/MiniMonthCalendar.svelte +782 -782
  9. package/dist/calendar/FAQs/FAQs.spec.d.ts +2 -0
  10. package/dist/calendar/FAQs/FAQs.spec.d.ts.map +1 -0
  11. package/dist/calendar/FAQs/FAQs.spec.js +238 -0
  12. package/dist/calendar/FAQs/FAQs.svelte +75 -75
  13. package/dist/calendar/MonthSwitcher/MonthSwitcher.spec.d.ts +2 -0
  14. package/dist/calendar/MonthSwitcher/MonthSwitcher.spec.d.ts.map +1 -0
  15. package/dist/calendar/MonthSwitcher/MonthSwitcher.spec.js +420 -0
  16. package/dist/calendar/MonthSwitcher/MonthSwitcher.svelte +126 -126
  17. package/dist/calendar/OrderSummary/OrderSummary.spec.d.ts +2 -0
  18. package/dist/calendar/OrderSummary/OrderSummary.spec.d.ts.map +1 -0
  19. package/dist/calendar/OrderSummary/OrderSummary.spec.js +808 -0
  20. package/dist/calendar/OrderSummary/OrderSummary.svelte +367 -367
  21. package/dist/calendar/PublicCard/PublicCard.spec.d.ts +2 -0
  22. package/dist/calendar/PublicCard/PublicCard.spec.d.ts.map +1 -0
  23. package/dist/calendar/PublicCard/PublicCard.spec.js +301 -0
  24. package/dist/calendar/PublicCard/PublicCard.svelte +134 -134
  25. package/dist/calendar/ShowCard/ShowCard.spec.d.ts +2 -0
  26. package/dist/calendar/ShowCard/ShowCard.spec.d.ts.map +1 -0
  27. package/dist/calendar/ShowCard/ShowCard.spec.js +714 -0
  28. package/dist/calendar/ShowCard/ShowCard.svelte +157 -157
  29. package/dist/calendar/ShowTimeCard/ShowTimeCard.spec.d.ts +2 -0
  30. package/dist/calendar/ShowTimeCard/ShowTimeCard.spec.d.ts.map +1 -0
  31. package/dist/calendar/ShowTimeCard/ShowTimeCard.spec.js +241 -0
  32. package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte +61 -61
  33. package/dist/components/Layout/Grid.svelte +4 -4
  34. package/dist/components/Layout/Section.spec.d.ts +2 -0
  35. package/dist/components/Layout/Section.spec.d.ts.map +1 -0
  36. package/dist/components/Layout/Section.spec.js +149 -0
  37. package/dist/components/Layout/Section.svelte +80 -80
  38. package/dist/components/Layout/Sidebar.spec.d.ts +2 -0
  39. package/dist/components/Layout/Sidebar.spec.d.ts.map +1 -0
  40. package/dist/components/Layout/Sidebar.spec.js +186 -0
  41. package/dist/components/Layout/Sidebar.svelte +108 -108
  42. package/dist/components/Layout/Stack.spec.js +3 -3
  43. package/dist/components/Layout/Stack.svelte +6 -6
  44. package/dist/constants/formOptions.spec.js +9 -5
  45. package/dist/constants/validation.js +91 -91
  46. package/dist/constants/validation.spec.js +64 -64
  47. package/dist/datetime/__tests__/format.test.js +1 -1
  48. package/dist/datetime/__tests__/parse.test.js +1 -1
  49. package/dist/datetime/__tests__/timezone.test.js +124 -2
  50. package/dist/datetime/parse.js +1 -1
  51. package/dist/forms/createFieldTracker.spec.d.ts +2 -0
  52. package/dist/forms/createFieldTracker.spec.d.ts.map +1 -0
  53. package/dist/forms/createFieldTracker.spec.js +343 -0
  54. package/dist/forms/createFormStore.spec.d.ts +2 -0
  55. package/dist/forms/createFormStore.spec.d.ts.map +1 -0
  56. package/dist/forms/createFormStore.spec.js +689 -0
  57. package/dist/forms/createFormStore.svelte.js +0 -1
  58. package/dist/index.d.ts +5 -112
  59. package/dist/index.js +40 -225
  60. package/dist/patterns/data/DataGrid.spec.d.ts +2 -0
  61. package/dist/patterns/data/DataGrid.spec.d.ts.map +1 -0
  62. package/dist/patterns/data/DataGrid.spec.js +159 -0
  63. package/dist/patterns/data/DataGrid.svelte +45 -45
  64. package/dist/patterns/data/DataList.spec.d.ts +2 -0
  65. package/dist/patterns/data/DataList.spec.d.ts.map +1 -0
  66. package/dist/patterns/data/DataList.spec.js +158 -0
  67. package/dist/patterns/data/DataList.svelte +24 -24
  68. package/dist/patterns/data/DataTable.spec.d.ts +2 -0
  69. package/dist/patterns/data/DataTable.spec.d.ts.map +1 -0
  70. package/dist/patterns/data/DataTable.spec.js +196 -0
  71. package/dist/patterns/data/DataTable.svelte +36 -36
  72. package/dist/patterns/forms/FormActions.spec.js +95 -88
  73. package/dist/patterns/forms/FormActions.stories.svelte +97 -97
  74. package/dist/patterns/forms/FormActions.svelte +46 -46
  75. package/dist/patterns/forms/FormGrid.spec.d.ts +2 -0
  76. package/dist/patterns/forms/FormGrid.spec.d.ts.map +1 -0
  77. package/dist/patterns/forms/FormGrid.spec.js +125 -0
  78. package/dist/patterns/forms/FormGrid.svelte +33 -33
  79. package/dist/patterns/forms/FormSection.spec.d.ts +2 -0
  80. package/dist/patterns/forms/FormSection.spec.d.ts.map +1 -0
  81. package/dist/patterns/forms/FormSection.spec.js +153 -0
  82. package/dist/patterns/forms/FormSection.svelte +32 -32
  83. package/dist/patterns/forms/FormValidationSummary.stories.svelte +83 -83
  84. package/dist/patterns/forms/FormValidationSummary.svelte +33 -33
  85. package/dist/patterns/layout/Sidebar.spec.d.ts +2 -0
  86. package/dist/patterns/layout/Sidebar.spec.d.ts.map +1 -0
  87. package/dist/patterns/layout/Sidebar.spec.js +159 -0
  88. package/dist/patterns/layout/Sidebar.svelte +39 -39
  89. package/dist/patterns/navigation/BottomNav.stories.svelte +117 -117
  90. package/dist/patterns/navigation/BottomNav.svelte +20 -20
  91. package/dist/patterns/navigation/Header.spec.js +33 -24
  92. package/dist/patterns/navigation/Header.stories.svelte +77 -77
  93. package/dist/patterns/navigation/Header.svelte +193 -193
  94. package/dist/patterns/page/PageHeader.spec.d.ts +2 -0
  95. package/dist/patterns/page/PageHeader.spec.d.ts.map +1 -0
  96. package/dist/patterns/page/PageHeader.spec.js +167 -0
  97. package/dist/patterns/page/PageHeader.svelte +18 -18
  98. package/dist/patterns/page/PageLayout.spec.d.ts +2 -0
  99. package/dist/patterns/page/PageLayout.spec.d.ts.map +1 -0
  100. package/dist/patterns/page/PageLayout.spec.js +145 -0
  101. package/dist/patterns/page/PageLayout.svelte +40 -40
  102. package/dist/patterns/page/PageLoader.spec.js +57 -54
  103. package/dist/patterns/page/PageLoader.stories.svelte +137 -137
  104. package/dist/patterns/page/PageLoader.svelte +24 -24
  105. package/dist/patterns/page/SectionHeader.spec.d.ts +2 -0
  106. package/dist/patterns/page/SectionHeader.spec.d.ts.map +1 -0
  107. package/dist/patterns/page/SectionHeader.spec.js +197 -0
  108. package/dist/patterns/page/SectionHeader.svelte +29 -29
  109. package/dist/presets/badges.js +112 -112
  110. package/dist/presets/badges.spec.d.ts +2 -0
  111. package/dist/presets/badges.spec.d.ts.map +1 -0
  112. package/dist/presets/badges.spec.js +172 -0
  113. package/dist/presets/buttons.js +76 -76
  114. package/dist/presets/buttons.spec.d.ts +2 -0
  115. package/dist/presets/buttons.spec.d.ts.map +1 -0
  116. package/dist/presets/buttons.spec.js +135 -0
  117. package/dist/presets/index.js +9 -9
  118. package/dist/primitives/Accordion/Accordion.spec.d.ts +2 -0
  119. package/dist/primitives/Accordion/Accordion.spec.d.ts.map +1 -0
  120. package/dist/primitives/Accordion/Accordion.spec.js +83 -0
  121. package/dist/primitives/Accordion/Accordion.stories.svelte +75 -75
  122. package/dist/primitives/Accordion/Accordion.svelte +42 -42
  123. package/dist/primitives/Accordion/AccordionItem.spec.d.ts +2 -0
  124. package/dist/primitives/Accordion/AccordionItem.spec.d.ts.map +1 -0
  125. package/dist/primitives/Accordion/AccordionItem.spec.js +661 -0
  126. package/dist/primitives/Accordion/AccordionItem.svelte +95 -95
  127. package/dist/primitives/Accordion/AccordionItemWrapper.test.svelte +107 -0
  128. package/dist/primitives/Accordion/AccordionItemWrapper.test.svelte.d.ts +35 -0
  129. package/dist/primitives/Accordion/AccordionItemWrapper.test.svelte.d.ts.map +1 -0
  130. package/dist/primitives/Alert/Alert.spec.js +173 -170
  131. package/dist/primitives/Alert/Alert.stories.svelte +88 -88
  132. package/dist/primitives/Alert/Alert.svelte +27 -27
  133. package/dist/primitives/Avatar/Avatar.spec.d.ts +2 -0
  134. package/dist/primitives/Avatar/Avatar.spec.d.ts.map +1 -0
  135. package/dist/primitives/Avatar/Avatar.spec.js +211 -0
  136. package/dist/primitives/Avatar/Avatar.stories.svelte +94 -94
  137. package/dist/primitives/Avatar/Avatar.svelte +66 -66
  138. package/dist/primitives/Badges/Badge.spec.js +144 -103
  139. package/dist/primitives/Badges/Badge.stories.svelte +86 -86
  140. package/dist/primitives/Badges/Badge.svelte +79 -79
  141. package/dist/primitives/BottomSheet/BottomSheet.spec.js +136 -127
  142. package/dist/primitives/BottomSheet/BottomSheet.stories.svelte +83 -83
  143. package/dist/primitives/BottomSheet/BottomSheet.svelte +100 -100
  144. package/dist/primitives/BottomSheet/BottomSheetWrapper.test.svelte +13 -0
  145. package/dist/primitives/BottomSheet/BottomSheetWrapper.test.svelte.d.ts +7 -0
  146. package/dist/primitives/BottomSheet/BottomSheetWrapper.test.svelte.d.ts.map +1 -0
  147. package/dist/primitives/Breadcrumb/Breadcrumb.spec.js +122 -120
  148. package/dist/primitives/Breadcrumb/Breadcrumb.stories.svelte +23 -23
  149. package/dist/primitives/Breadcrumb/Breadcrumb.svelte +89 -89
  150. package/dist/primitives/Button/Button.spec.js +223 -211
  151. package/dist/primitives/Button/Button.stories.svelte +76 -76
  152. package/dist/primitives/Button/Button.svelte +270 -270
  153. package/dist/primitives/Button/ButtonSaveDemo.spec.js +146 -48
  154. package/dist/primitives/Button/ButtonSaveDemo.svelte +25 -25
  155. package/dist/primitives/Button/ButtonVariantShowcase.spec.d.ts +2 -0
  156. package/dist/primitives/Button/ButtonVariantShowcase.spec.d.ts.map +1 -0
  157. package/dist/primitives/Button/ButtonVariantShowcase.spec.js +202 -0
  158. package/dist/primitives/Button/ButtonVariantShowcase.svelte +129 -129
  159. package/dist/primitives/Card.spec.js +49 -49
  160. package/dist/primitives/Card.stories.svelte +22 -22
  161. package/dist/primitives/Card.svelte +28 -28
  162. package/dist/primitives/Checkbox/Checkbox.spec.d.ts +2 -0
  163. package/dist/primitives/Checkbox/Checkbox.spec.d.ts.map +1 -0
  164. package/dist/primitives/Checkbox/Checkbox.spec.js +252 -0
  165. package/dist/primitives/Checkbox/Checkbox.stories.svelte +84 -84
  166. package/dist/primitives/Checkbox/Checkbox.svelte +88 -88
  167. package/dist/primitives/DarkModeToggle.spec.js +390 -357
  168. package/dist/primitives/DarkModeToggle.stories.svelte +57 -57
  169. package/dist/primitives/DarkModeToggle.svelte +136 -136
  170. package/dist/primitives/Drawer/Drawer.spec.d.ts +2 -0
  171. package/dist/primitives/Drawer/Drawer.spec.d.ts.map +1 -0
  172. package/dist/primitives/Drawer/Drawer.spec.js +212 -0
  173. package/dist/primitives/Drawer/Drawer.stories.svelte +80 -80
  174. package/dist/primitives/Drawer/Drawer.svelte +120 -120
  175. package/dist/primitives/Dropdown/Dropdown.spec.d.ts +2 -0
  176. package/dist/primitives/Dropdown/Dropdown.spec.d.ts.map +1 -0
  177. package/dist/primitives/Dropdown/Dropdown.spec.js +366 -0
  178. package/dist/primitives/Dropdown/Dropdown.stories.svelte +137 -137
  179. package/dist/primitives/Dropdown/Dropdown.svelte +14 -14
  180. package/dist/primitives/Dropdown/DropdownItem.spec.d.ts +2 -0
  181. package/dist/primitives/Dropdown/DropdownItem.spec.d.ts.map +1 -0
  182. package/dist/primitives/Dropdown/DropdownItem.spec.js +182 -0
  183. package/dist/primitives/Dropdown/DropdownItem.svelte +80 -80
  184. package/dist/primitives/Icons/ArrowLeft.svelte +8 -8
  185. package/dist/primitives/Icons/ArrowRight.svelte +8 -8
  186. package/dist/primitives/Icons/Availability.svelte +14 -14
  187. package/dist/primitives/Icons/Back.svelte +14 -14
  188. package/dist/primitives/Icons/CheckCircle.svelte +6 -6
  189. package/dist/primitives/Icons/CheckCircleOutline.svelte +15 -15
  190. package/dist/primitives/Icons/ChevronLeft.svelte +4 -4
  191. package/dist/primitives/Icons/ChevronRight.svelte +4 -4
  192. package/dist/primitives/Icons/Copy.svelte +15 -15
  193. package/dist/primitives/Icons/Cross.svelte +5 -5
  194. package/dist/primitives/Icons/DownArrow.svelte +8 -8
  195. package/dist/primitives/Icons/ErrorCircle.svelte +6 -6
  196. package/dist/primitives/Icons/FacebookIcon.svelte +2 -2
  197. package/dist/primitives/Icons/Home.svelte +15 -15
  198. package/dist/primitives/Icons/Icon.spec.js +169 -169
  199. package/dist/primitives/Icons/Icon.stories.svelte +100 -100
  200. package/dist/primitives/Icons/Icon.svelte +52 -52
  201. package/dist/primitives/Icons/IconGallery.stories.svelte +235 -235
  202. package/dist/primitives/Icons/Info.svelte +7 -7
  203. package/dist/primitives/Icons/InstagramIcon.svelte +4 -4
  204. package/dist/primitives/Icons/LogoInstagram.svelte +2 -2
  205. package/dist/primitives/Icons/Message.svelte +15 -15
  206. package/dist/primitives/Icons/MoonIcon.svelte +5 -5
  207. package/dist/primitives/Icons/More.svelte +21 -21
  208. package/dist/primitives/Icons/MoreHori.spec.js +61 -61
  209. package/dist/primitives/Icons/MoreHori.svelte +22 -22
  210. package/dist/primitives/Icons/Notification.svelte +14 -14
  211. package/dist/primitives/Icons/Payment.svelte +14 -14
  212. package/dist/primitives/Icons/Profile.svelte +21 -21
  213. package/dist/primitives/Icons/Reload.svelte +29 -29
  214. package/dist/primitives/Icons/Shows.svelte +21 -21
  215. package/dist/primitives/Icons/Signout.svelte +21 -21
  216. package/dist/primitives/Icons/SunIcon.svelte +8 -8
  217. package/dist/primitives/Icons/TiktokIcon.svelte +2 -2
  218. package/dist/primitives/Icons/TwitterIcon.svelte +2 -2
  219. package/dist/primitives/Icons/WarningIcon.spec.js +18 -18
  220. package/dist/primitives/Icons/WarningIcon.svelte +5 -5
  221. package/dist/primitives/Icons/iconTestUtils.spec.d.ts +2 -0
  222. package/dist/primitives/Icons/iconTestUtils.spec.d.ts.map +1 -0
  223. package/dist/primitives/Icons/iconTestUtils.spec.js +235 -0
  224. package/dist/primitives/Input/Input.spec.js +573 -573
  225. package/dist/primitives/Input/Input.stories.svelte +139 -139
  226. package/dist/primitives/Input/Input.svelte +384 -397
  227. package/dist/primitives/Input/Input.svelte.d.ts.map +1 -1
  228. package/dist/primitives/Input/Select.spec.js +212 -218
  229. package/dist/primitives/Input/Select.stories.svelte +112 -112
  230. package/dist/primitives/Input/Select.svelte +128 -128
  231. package/dist/primitives/Input/Textarea.spec.d.ts +2 -0
  232. package/dist/primitives/Input/Textarea.spec.d.ts.map +1 -0
  233. package/dist/primitives/Input/Textarea.spec.js +255 -0
  234. package/dist/primitives/Input/Textarea.stories.svelte +137 -137
  235. package/dist/primitives/Input/Textarea.svelte +35 -35
  236. package/dist/primitives/Label/Label.spec.d.ts +2 -0
  237. package/dist/primitives/Label/Label.spec.d.ts.map +1 -0
  238. package/dist/primitives/Label/Label.spec.js +157 -0
  239. package/dist/primitives/Label/Label.svelte +37 -37
  240. package/dist/primitives/Modal/Modal.spec.js +99 -95
  241. package/dist/primitives/Modal/Modal.stories.svelte +86 -86
  242. package/dist/primitives/Modal/Modal.svelte +158 -158
  243. package/dist/primitives/Modal/ModalTestWrapper.svelte +65 -0
  244. package/dist/primitives/Modal/ModalTestWrapper.svelte.d.ts +23 -0
  245. package/dist/primitives/Modal/ModalTestWrapper.svelte.d.ts.map +1 -0
  246. package/dist/primitives/NumberInput/NumberInput.spec.d.ts +2 -0
  247. package/dist/primitives/NumberInput/NumberInput.spec.d.ts.map +1 -0
  248. package/dist/primitives/NumberInput/NumberInput.spec.js +235 -0
  249. package/dist/primitives/NumberInput/NumberInput.svelte +106 -106
  250. package/dist/primitives/Pagination/Pagination.spec.d.ts +2 -0
  251. package/dist/primitives/Pagination/Pagination.spec.d.ts.map +1 -0
  252. package/dist/primitives/Pagination/Pagination.spec.js +266 -0
  253. package/dist/primitives/Pagination/Pagination.stories.svelte +76 -76
  254. package/dist/primitives/Pagination/Pagination.svelte +261 -261
  255. package/dist/primitives/Radio/Radio.spec.d.ts +2 -0
  256. package/dist/primitives/Radio/Radio.spec.d.ts.map +1 -0
  257. package/dist/primitives/Radio/Radio.spec.js +206 -0
  258. package/dist/primitives/Radio/Radio.stories.svelte +80 -80
  259. package/dist/primitives/Radio/Radio.svelte +67 -67
  260. package/dist/primitives/Skeleton/CardPlaceholder.spec.d.ts +2 -0
  261. package/dist/primitives/Skeleton/CardPlaceholder.spec.d.ts.map +1 -0
  262. package/dist/primitives/Skeleton/CardPlaceholder.spec.js +156 -0
  263. package/dist/primitives/Skeleton/CardPlaceholder.svelte +87 -87
  264. package/dist/primitives/Skeleton/ImagePlaceholder.spec.d.ts +2 -0
  265. package/dist/primitives/Skeleton/ImagePlaceholder.spec.d.ts.map +1 -0
  266. package/dist/primitives/Skeleton/ImagePlaceholder.spec.js +120 -0
  267. package/dist/primitives/Skeleton/ImagePlaceholder.svelte +59 -59
  268. package/dist/primitives/Skeleton/ListPlaceholder.spec.d.ts +2 -0
  269. package/dist/primitives/Skeleton/ListPlaceholder.spec.d.ts.map +1 -0
  270. package/dist/primitives/Skeleton/ListPlaceholder.spec.js +220 -0
  271. package/dist/primitives/Skeleton/ListPlaceholder.svelte +76 -76
  272. package/dist/primitives/Skeleton/Skeleton.spec.d.ts +2 -0
  273. package/dist/primitives/Skeleton/Skeleton.spec.d.ts.map +1 -0
  274. package/dist/primitives/Skeleton/Skeleton.spec.js +173 -0
  275. package/dist/primitives/Skeleton/Skeleton.stories.svelte +151 -151
  276. package/dist/primitives/Skeleton/Skeleton.svelte +26 -26
  277. package/dist/primitives/Spinner/Spinner.spec.js +71 -75
  278. package/dist/primitives/Spinner/Spinner.stories.svelte +29 -29
  279. package/dist/primitives/Spinner/Spinner.svelte +20 -20
  280. package/dist/primitives/Tabs/TabItem.spec.d.ts +2 -0
  281. package/dist/primitives/Tabs/TabItem.spec.d.ts.map +1 -0
  282. package/dist/primitives/Tabs/TabItem.spec.js +130 -0
  283. package/dist/primitives/Tabs/TabItem.svelte +49 -49
  284. package/dist/primitives/Tabs/Tabs.spec.d.ts +2 -0
  285. package/dist/primitives/Tabs/Tabs.spec.d.ts.map +1 -0
  286. package/dist/primitives/Tabs/Tabs.spec.js +295 -0
  287. package/dist/primitives/Tabs/Tabs.stories.svelte +112 -112
  288. package/dist/primitives/Tabs/Tabs.svelte +123 -123
  289. package/dist/primitives/Tabs/TabsWithItems.test.svelte +18 -0
  290. package/dist/primitives/Tabs/TabsWithItems.test.svelte.d.ts +16 -0
  291. package/dist/primitives/Tabs/TabsWithItems.test.svelte.d.ts.map +1 -0
  292. package/dist/primitives/Toggle.spec.js +143 -127
  293. package/dist/primitives/Toggle.stories.svelte +92 -92
  294. package/dist/primitives/Toggle.svelte +71 -71
  295. package/dist/primitives/Typography/Typography.spec.d.ts +2 -0
  296. package/dist/primitives/Typography/Typography.spec.d.ts.map +1 -0
  297. package/dist/primitives/Typography/Typography.spec.js +183 -0
  298. package/dist/primitives/Typography/Typography.svelte +53 -53
  299. package/dist/primitives/ValidationError.spec.js +103 -103
  300. package/dist/primitives/ValidationError.stories.svelte +69 -69
  301. package/dist/primitives/ValidationError.svelte +29 -29
  302. package/dist/primitives/index.d.ts +1 -0
  303. package/dist/primitives/index.js +3 -0
  304. package/dist/recipes/CropImage/CropImage.spec.js +208 -216
  305. package/dist/recipes/CropImage/CropImage.stories.svelte +104 -104
  306. package/dist/recipes/CropImage/CropImage.svelte +238 -238
  307. package/dist/recipes/ImageUploader/ImageUploader.spec.d.ts +2 -0
  308. package/dist/recipes/ImageUploader/ImageUploader.spec.d.ts.map +1 -0
  309. package/dist/recipes/ImageUploader/ImageUploader.spec.js +1351 -0
  310. package/dist/recipes/ImageUploader/ImageUploader.stories.svelte +125 -125
  311. package/dist/recipes/ImageUploader/ImageUploader.svelte +804 -804
  312. package/dist/recipes/SuperLogin/SuperLogin.spec.d.ts +2 -0
  313. package/dist/recipes/SuperLogin/SuperLogin.spec.d.ts.map +1 -0
  314. package/dist/recipes/SuperLogin/SuperLogin.spec.js +1436 -0
  315. package/dist/recipes/SuperLogin/SuperLogin.svelte +7 -6
  316. package/dist/recipes/SuperLogin/SuperLogin.svelte.d.ts.map +1 -1
  317. package/dist/recipes/Toaster/Toaster.stories.svelte +62 -62
  318. package/dist/recipes/feedback/EmptyState/EmptyState.spec.d.ts +2 -0
  319. package/dist/recipes/feedback/EmptyState/EmptyState.spec.d.ts.map +1 -0
  320. package/dist/recipes/feedback/EmptyState/EmptyState.spec.js +202 -0
  321. package/dist/recipes/feedback/EmptyState/EmptyState.svelte +1 -1
  322. package/dist/recipes/feedback/ErrorDisplay.spec.js +69 -69
  323. package/dist/recipes/feedback/ErrorDisplay.stories.svelte +101 -101
  324. package/dist/recipes/feedback/ErrorDisplay.svelte +1 -1
  325. package/dist/recipes/feedback/StatusIndicator/StatusIndicator.spec.js +133 -129
  326. package/dist/recipes/feedback/StatusIndicator/StatusIndicator.svelte +157 -157
  327. package/dist/recipes/fields/CheckboxField.spec.d.ts +2 -0
  328. package/dist/recipes/fields/CheckboxField.spec.d.ts.map +1 -0
  329. package/dist/recipes/fields/CheckboxField.spec.js +135 -0
  330. package/dist/recipes/fields/CheckboxField.svelte +85 -85
  331. package/dist/recipes/fields/FormField.spec.d.ts +2 -0
  332. package/dist/recipes/fields/FormField.spec.d.ts.map +1 -0
  333. package/dist/recipes/fields/FormField.spec.js +159 -0
  334. package/dist/recipes/fields/FormField.svelte +58 -58
  335. package/dist/recipes/fields/RadioGroup.spec.d.ts +2 -0
  336. package/dist/recipes/fields/RadioGroup.spec.d.ts.map +1 -0
  337. package/dist/recipes/fields/RadioGroup.spec.js +199 -0
  338. package/dist/recipes/fields/RadioGroup.svelte +95 -95
  339. package/dist/recipes/fields/SelectField.spec.d.ts +2 -0
  340. package/dist/recipes/fields/SelectField.spec.d.ts.map +1 -0
  341. package/dist/recipes/fields/SelectField.spec.js +188 -0
  342. package/dist/recipes/fields/SelectField.svelte +80 -80
  343. package/dist/recipes/fields/TextareaField.spec.d.ts +2 -0
  344. package/dist/recipes/fields/TextareaField.spec.d.ts.map +1 -0
  345. package/dist/recipes/fields/TextareaField.spec.js +205 -0
  346. package/dist/recipes/fields/TextareaField.svelte +97 -97
  347. package/dist/recipes/fields/ToggleField.spec.d.ts +2 -0
  348. package/dist/recipes/fields/ToggleField.spec.d.ts.map +1 -0
  349. package/dist/recipes/fields/ToggleField.spec.js +153 -0
  350. package/dist/recipes/fields/ToggleField.svelte +60 -60
  351. package/dist/recipes/fields/index.js +7 -7
  352. package/dist/recipes/inputs/MultiSelect.spec.js +258 -257
  353. package/dist/recipes/inputs/MultiSelect.stories.svelte +133 -133
  354. package/dist/recipes/inputs/MultiSelect.svelte +256 -249
  355. package/dist/recipes/inputs/MultiSelect.svelte.d.ts +2 -0
  356. package/dist/recipes/inputs/MultiSelect.svelte.d.ts.map +1 -1
  357. package/dist/recipes/inputs/OTPInput.spec.js +251 -238
  358. package/dist/recipes/inputs/OTPInput.stories.svelte +162 -162
  359. package/dist/recipes/inputs/OTPInput.svelte +29 -29
  360. package/dist/recipes/inputs/PasswordInput.spec.d.ts +2 -0
  361. package/dist/recipes/inputs/PasswordInput.spec.d.ts.map +1 -0
  362. package/dist/recipes/inputs/PasswordInput.spec.js +410 -0
  363. package/dist/recipes/inputs/PasswordInput.svelte +22 -22
  364. package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.spec.js +245 -165
  365. package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte +43 -43
  366. package/dist/recipes/inputs/PasswordStrengthIndicator/TestWrapper.svelte +71 -0
  367. package/dist/recipes/inputs/PasswordStrengthIndicator/TestWrapper.svelte.d.ts +9 -0
  368. package/dist/recipes/inputs/PasswordStrengthIndicator/TestWrapper.svelte.d.ts.map +1 -0
  369. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.spec.js +1139 -193
  370. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.stories.svelte +123 -123
  371. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte +326 -326
  372. package/dist/recipes/inputs/Search.spec.d.ts +2 -0
  373. package/dist/recipes/inputs/Search.spec.d.ts.map +1 -0
  374. package/dist/recipes/inputs/Search.spec.js +177 -0
  375. package/dist/recipes/inputs/Search.svelte +37 -37
  376. package/dist/recipes/inputs/SelectDropdown.spec.d.ts +2 -0
  377. package/dist/recipes/inputs/SelectDropdown.spec.d.ts.map +1 -0
  378. package/dist/recipes/inputs/SelectDropdown.spec.js +512 -0
  379. package/dist/recipes/inputs/SelectDropdown.svelte +57 -57
  380. package/dist/recipes/modals/AlertModal.spec.d.ts +2 -0
  381. package/dist/recipes/modals/AlertModal.spec.d.ts.map +1 -0
  382. package/dist/recipes/modals/AlertModal.spec.js +432 -0
  383. package/dist/recipes/modals/AlertModal.svelte +130 -130
  384. package/dist/recipes/modals/ConfirmationModal.spec.js +206 -191
  385. package/dist/recipes/modals/ConfirmationModal.stories.svelte +119 -119
  386. package/dist/recipes/modals/ConfirmationModal.svelte +152 -152
  387. package/dist/recipes/modals/InputModal.spec.d.ts +2 -0
  388. package/dist/recipes/modals/InputModal.spec.d.ts.map +1 -0
  389. package/dist/recipes/modals/InputModal.spec.js +872 -0
  390. package/dist/recipes/modals/InputModal.svelte +182 -182
  391. package/dist/recipes/modals/ModalStateManager.spec.js +100 -100
  392. package/dist/recipes/modals/ModalStateManager.svelte +77 -77
  393. package/dist/recipes/modals/ModalTestWrapper.spec.d.ts +2 -0
  394. package/dist/recipes/modals/ModalTestWrapper.spec.d.ts.map +1 -0
  395. package/dist/recipes/modals/ModalTestWrapper.spec.js +502 -0
  396. package/dist/recipes/modals/ModalTestWrapper.svelte +65 -65
  397. package/dist/recipes/modals/StatusModal.spec.d.ts +2 -0
  398. package/dist/recipes/modals/StatusModal.spec.d.ts.map +1 -0
  399. package/dist/recipes/modals/StatusModal.spec.js +599 -0
  400. package/dist/recipes/modals/StatusModal.svelte +206 -206
  401. package/dist/services/EventService.js +75 -75
  402. package/dist/services/EventService.spec.js +217 -217
  403. package/dist/services/ShowService.spec.js +345 -342
  404. package/dist/stores/auth.js +36 -36
  405. package/dist/stores/auth.spec.js +139 -139
  406. package/dist/stores/toaster.js +13 -13
  407. package/dist/stories/ButtonAuditDashboard.spec.d.ts +2 -0
  408. package/dist/stories/ButtonAuditDashboard.spec.d.ts.map +1 -0
  409. package/dist/stories/ButtonAuditDashboard.spec.js +913 -0
  410. package/dist/stories/ButtonAuditReview.spec.d.ts +2 -0
  411. package/dist/stories/ButtonAuditReview.spec.d.ts.map +1 -0
  412. package/dist/stories/ButtonAuditReview.spec.js +422 -0
  413. package/dist/stories/ButtonAuditReview.stories.svelte +14 -14
  414. package/dist/stories/ButtonAuditReview.svelte +427 -427
  415. package/dist/stories/ButtonGridView.spec.d.ts +2 -0
  416. package/dist/stories/ButtonGridView.spec.d.ts.map +1 -0
  417. package/dist/stories/ButtonGridView.spec.js +667 -0
  418. package/dist/stories/ButtonShowcase.spec.d.ts +2 -0
  419. package/dist/stories/ButtonShowcase.spec.d.ts.map +1 -0
  420. package/dist/stories/ButtonShowcase.spec.js +499 -0
  421. package/dist/stories/PatternsGallery.spec.d.ts +2 -0
  422. package/dist/stories/PatternsGallery.spec.d.ts.map +1 -0
  423. package/dist/stories/PatternsGallery.spec.js +514 -0
  424. package/dist/stories/PatternsGallery.stories.svelte +19 -19
  425. package/dist/stories/PatternsGallery.svelte +206 -206
  426. package/dist/stories/PrimitivesGallery.spec.d.ts +2 -0
  427. package/dist/stories/PrimitivesGallery.spec.d.ts.map +1 -0
  428. package/dist/stories/PrimitivesGallery.spec.js +813 -0
  429. package/dist/stories/PrimitivesGallery.stories.svelte +19 -19
  430. package/dist/stories/PrimitivesGallery.svelte +725 -725
  431. package/dist/stories/RecipesGallery.spec.d.ts +2 -0
  432. package/dist/stories/RecipesGallery.spec.d.ts.map +1 -0
  433. package/dist/stories/RecipesGallery.spec.js +299 -0
  434. package/dist/stories/RecipesGallery.stories.svelte +19 -19
  435. package/dist/stories/RecipesGallery.svelte +271 -271
  436. package/dist/stories/button-audit-manifest.json +11186 -11186
  437. package/dist/stripe/useStripeTheme.spec.d.ts +2 -0
  438. package/dist/stripe/useStripeTheme.spec.d.ts.map +1 -0
  439. package/dist/stripe/useStripeTheme.spec.js +793 -0
  440. package/dist/tailwind/preset.cjs +82 -82
  441. package/dist/telemetry.d.ts.map +1 -1
  442. package/dist/telemetry.js +6 -5
  443. package/dist/telemetry.spec.js +495 -12
  444. package/dist/tokens/__tests__/colors.test.d.ts +2 -0
  445. package/dist/tokens/__tests__/colors.test.d.ts.map +1 -0
  446. package/dist/tokens/__tests__/colors.test.js +152 -0
  447. package/dist/tokens/__tests__/radius.test.d.ts +2 -0
  448. package/dist/tokens/__tests__/radius.test.d.ts.map +1 -0
  449. package/dist/tokens/__tests__/radius.test.js +118 -0
  450. package/dist/tokens/__tests__/shadows.test.d.ts +2 -0
  451. package/dist/tokens/__tests__/shadows.test.d.ts.map +1 -0
  452. package/dist/tokens/__tests__/shadows.test.js +105 -0
  453. package/dist/tokens/__tests__/spacing.test.js +11 -8
  454. package/dist/tokens/__tests__/typography.test.d.ts +2 -0
  455. package/dist/tokens/__tests__/typography.test.d.ts.map +1 -0
  456. package/dist/tokens/__tests__/typography.test.js +156 -0
  457. package/dist/tokens/__tests__/z-index.test.d.ts +2 -0
  458. package/dist/tokens/__tests__/z-index.test.d.ts.map +1 -0
  459. package/dist/tokens/__tests__/z-index.test.js +121 -0
  460. package/dist/tokens/tokens.css +87 -87
  461. package/dist/utils/apiConfig.spec.js +102 -1
  462. package/dist/utils/formatters.spec.d.ts +2 -0
  463. package/dist/utils/formatters.spec.d.ts.map +1 -0
  464. package/dist/utils/formatters.spec.js +82 -0
  465. package/dist/utils/transitions.d.ts +24 -0
  466. package/dist/utils/transitions.d.ts.map +1 -0
  467. package/dist/utils/transitions.js +62 -0
  468. package/dist/utils/transitions.spec.d.ts +2 -0
  469. package/dist/utils/transitions.spec.d.ts.map +1 -0
  470. package/dist/utils/transitions.spec.js +130 -0
  471. package/dist/utils/utils.js +354 -354
  472. package/package.json +288 -283
@@ -1,367 +1,367 @@
1
- <script>
2
- import { fly, fade } from 'svelte/transition';
3
- import { cubicOut } from 'svelte/easing';
4
- import { ChevronDownOutline, CloseOutline } from '../../primitives/Icons';
5
- import Spinner from '../../primitives/Spinner/Spinner.svelte';
6
- import { typography } from '../../tokens/typography';
7
-
8
- let {
9
- loading = false,
10
- quantities = {},
11
- donationAmounts = {}, // Map of ticketId -> donation amount string
12
- eventTickets = [],
13
- checkoutTicket = null,
14
- isAgreed = true,
15
- btnText = 'Checkout',
16
- promoApplied = false,
17
- promoDiscount = 0,
18
- currentPromoRule = null,
19
- executePurchase = null,
20
- elements = null,
21
- venueServiceCharge = {
22
- serviceFeeCents: 0,
23
- serviceFeePercentage: 0,
24
- serviceFeeChargeType: 'both',
25
- maxServiceFeeCents: 0,
26
- taxPercentage: 0,
27
- },
28
- onPriceUpdate,
29
- } = $props();
30
-
31
- // Helper to get effective price for a ticket (handles donation tickets)
32
- function getEffectivePrice(ticket) {
33
- // Donation ticket (type 2): use user-entered donation amount
34
- if (isDonationTicket(ticket)) {
35
- const donationAmount = donationAmounts[ticket.ID];
36
- return parseFloat(donationAmount) || 0;
37
- }
38
- // Regular ticket: use ticket price
39
- return parseFloat(ticket.price) || 0;
40
- }
41
-
42
- // Check if ticket is a donation ticket
43
- // Handle both 'type' and 'ticketType' fields, and coerce to number for comparison
44
- function isDonationTicket(ticket) {
45
- const ticketType = ticket.type ?? ticket.ticketType ?? 0;
46
- return Number(ticketType) === 2;
47
- }
48
-
49
- let showOrderSummaryOnMobile = $state(false);
50
-
51
- function feeFor(price) {
52
- const chargeType = venueServiceCharge.serviceFeeChargeType || 'both';
53
- let fee = 0;
54
-
55
- if (chargeType === 'flat' || chargeType === 'both') {
56
- fee += (venueServiceCharge.serviceFeeCents || 0) / 100;
57
- }
58
- if (chargeType === 'percent' || chargeType === 'both') {
59
- fee += ((venueServiceCharge.serviceFeePercentage || 0) / 100) * price;
60
- }
61
-
62
- const maxFee = venueServiceCharge.maxServiceFeeCents || 0;
63
- if (maxFee > 0 && fee > maxFee / 100) {
64
- fee = maxFee / 100;
65
- }
66
-
67
- return fee;
68
- }
69
-
70
- function makeOrderSummaryVisible() {
71
- showOrderSummaryOnMobile = !showOrderSummaryOnMobile;
72
- }
73
-
74
- function getDiscountedPrice(ticket) {
75
- if (!currentPromoRule?.provideDiscount) return null;
76
-
77
- const discountTicketIds = currentPromoRule.discountTicketIds || [];
78
- if (discountTicketIds.length > 0 && !discountTicketIds.includes(ticket.ID)) {
79
- return null;
80
- }
81
-
82
- const basePrice = parseFloat(ticket.price) || 0;
83
- const discountAmount = parseFloat(currentPromoRule?.amount || '0') || 0;
84
- if (currentPromoRule.discountType === '%') {
85
- return (basePrice * (1 - discountAmount / 100)).toFixed(2);
86
- } else if (currentPromoRule.discountType === '$') {
87
- return Math.max(0, basePrice - discountAmount).toFixed(2);
88
- }
89
- return null;
90
- }
91
-
92
- let totalQuantity = $derived(Object.values(quantities).reduce((sum, q) => sum + q, 0));
93
- let showFooter = $derived(totalQuantity > 0);
94
-
95
- let subtotalWithoutDiscount = $derived(Object.keys(quantities).reduce((acc, key) => {
96
- const ticket = eventTickets.find(t => t.ID == key);
97
- if (!ticket) return acc;
98
- // For donation tickets, use the donation amount; otherwise use ticket price
99
- const effectivePrice = getEffectivePrice(ticket);
100
- return acc + quantities[key] * effectivePrice;
101
- }, 0));
102
-
103
- let subtotal = $derived(Object.keys(quantities).reduce((acc, key) => {
104
- const ticket = eventTickets.find(t => t.ID == key);
105
- if (!ticket) return acc;
106
- // For donation tickets, use the donation amount (no discounts apply)
107
- if (isDonationTicket(ticket)) {
108
- const effectivePrice = getEffectivePrice(ticket);
109
- return acc + quantities[key] * effectivePrice;
110
- }
111
- // For regular tickets, apply discounts as usual
112
- const discountedPrice = getDiscountedPrice(ticket);
113
- const priceToUse = discountedPrice !== null ? parseFloat(discountedPrice) : ticket.price;
114
- return acc + quantities[key] * priceToUse;
115
- }, 0));
116
-
117
- let promoSavings = $derived(currentPromoRule?.provideDiscount ? (subtotalWithoutDiscount - subtotal) : 0);
118
-
119
- let fees = $derived(Object.keys(quantities).reduce((acc, key) => {
120
- const ticket = eventTickets.find(t => t.ID == key);
121
- // Skip fees for: no ticket, free tickets, and donation tickets (type 2)
122
- if (!ticket || ticket.price == 0 || isDonationTicket(ticket)) return acc;
123
- const discountedPrice = getDiscountedPrice(ticket);
124
- const priceToUse = discountedPrice !== null ? parseFloat(discountedPrice) : ticket.price;
125
- return acc + quantities[key] * feeFor(priceToUse);
126
- }, 0));
127
-
128
- let taxRate = $derived((venueServiceCharge.taxPercentage || 0) / 100);
129
- let taxes = $derived(subtotal > 0 ? subtotal * taxRate : 0);
130
- let total = $derived(Math.max(0, subtotal + fees + taxes - (promoApplied && !currentPromoRule?.provideDiscount ? promoDiscount : 0)));
131
-
132
- $effect(() => {
133
- onPriceUpdate?.({ subtotal, fees, taxes, total, promoSavings });
134
- });
135
- </script>
136
-
137
- <div
138
- id="orderSummary"
139
- class="hidden min-[872px]:block h-fit rounded-lg bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-600"
140
- >
141
- <div class="px-5 py-4 border-b border-gray-200 dark:border-gray-600">
142
- <h3 class={typography.h3}>
143
- Order summary
144
- </h3>
145
- </div>
146
-
147
- <div class="px-5 pb-5">
148
- {#if totalQuantity === 0}
149
- <div class="py-8 text-center">
150
- <p class="{typography.smMuted}">Select tickets to continue</p>
151
- </div>
152
- {:else}
153
- {#each Object.keys(quantities) as key}
154
- {#if quantities[key] > 0}
155
- {#each eventTickets as ticket}
156
- {#if ticket.ID == key}
157
- {@const effectivePrice = getEffectivePrice(ticket)}
158
- {@const isDonation = isDonationTicket(ticket)}
159
- <div class="flex justify-between py-3 border-b border-gray-200/50 dark:border-gray-600/50">
160
- <div>
161
- <p class="{typography.label}">{ticket.name}</p>
162
- <p class="{typography.smMuted}">
163
- {#if ticket.price === 0 && !isDonation}
164
- Free x {quantities[key]}
165
- {:else if isDonation}
166
- ${effectivePrice.toFixed(2)} x {quantities[key]}
167
- {:else}
168
- ${ticket.price.toFixed(2)} x {quantities[key]}
169
- {/if}
170
- </p>
171
- </div>
172
- <div class="{typography.label}">
173
- {#if ticket.price === 0 && !isDonation}
174
- Free
175
- {:else}
176
- ${(effectivePrice * quantities[key]).toFixed(2)}
177
- {/if}
178
- </div>
179
- </div>
180
- {/if}
181
- {/each}
182
- {/if}
183
- {/each}
184
-
185
- <div class="{`${typography.sm} flex flex-col py-3 gap-2`}">
186
- {#if promoSavings > 0 || (promoDiscount > 0 && !currentPromoRule?.provideDiscount)}
187
- <div class="flex justify-between text-gray-600 dark:text-gray-300">
188
- <span>Full Price</span><span>${subtotalWithoutDiscount.toFixed(2)}</span>
189
- </div>
190
- {/if}
191
- {#if promoSavings > 0}
192
- <div class="flex justify-between text-green-600 dark:text-green-500">
193
- <span>Discount</span><span>-${promoSavings.toFixed(2)}</span>
194
- </div>
195
- {:else if promoDiscount > 0 && !currentPromoRule?.provideDiscount}
196
- <div class="flex justify-between text-green-600 dark:text-green-500">
197
- <span>Discount</span><span>-${promoDiscount.toFixed(2)}</span>
198
- </div>
199
- {/if}
200
- <div class="flex justify-between text-gray-600 dark:text-gray-300">
201
- <span>Subtotal</span><span>${subtotal.toFixed(2)}</span>
202
- </div>
203
- <div class="flex justify-between text-gray-600 dark:text-gray-300">
204
- <span>Fees</span><span>${fees.toFixed(2)}</span>
205
- </div>
206
- <div class="flex justify-between text-gray-600 dark:text-gray-300">
207
- <span>Taxes</span><span>${taxes.toFixed(2)}</span>
208
- </div>
209
- </div>
210
-
211
- <div class="flex justify-between {typography.h3} py-4 text-lg border-t border-gray-200 dark:border-gray-600">
212
- <span>Total</span><span>${total.toFixed(2)}</span>
213
- </div>
214
- {/if}
215
-
216
- {#if totalQuantity > 0 && btnText === 'Place order'}
217
- <p class="{typography.xsMuted} text-center mb-3">
218
- By selecting Place order, I agree to the <a href="https://get-micdrop.com/tos" class="text-blue-700 dark:text-blue-500 underline hover:opacity-80" target="_blank" rel="noopener noreferrer">terms of service</a>
219
- </p>
220
- {/if}
221
-
222
- <button
223
- class="w-full h-12 font-semibold rounded-lg flex items-center justify-center transition-colors select-none touch-manipulation {totalQuantity === 0 ? 'bg-gray-200 dark:bg-gray-700 text-gray-500 dark:text-gray-400 cursor-not-allowed' : 'bg-blue-700 dark:bg-blue-600 text-white hover:bg-blue-800 dark:hover:bg-blue-700'}"
224
- onclick={() => {
225
- if (totalQuantity === 0) return;
226
- if (executePurchase) {
227
- executePurchase(elements);
228
- } else if (checkoutTicket) {
229
- checkoutTicket();
230
- }
231
- }}
232
- disabled={totalQuantity === 0}
233
- >
234
- {#if loading}
235
- <Spinner size="sm" color="white" />
236
- {:else}
237
- <span translate="no">{btnText}</span>
238
- {/if}
239
- </button>
240
- </div>
241
- </div>
242
-
243
- {#if showOrderSummaryOnMobile}
244
- <button
245
- class="min-[872px]:hidden fixed inset-0 bg-black/50 z-40 border-none cursor-pointer"
246
- onclick={() => (showOrderSummaryOnMobile = false)}
247
- aria-label="Close order summary"
248
- transition:fade={{ duration: 200 }}
249
- ></button>
250
- <div
251
- in:fly={{ y: 800, duration: 300, easing: cubicOut }}
252
- out:fly={{ y: 800, duration: 300, easing: cubicOut }}
253
- class="min-[872px]:hidden fixed bottom-0 left-0 w-full overflow-x-hidden overflow-y-auto z-50 max-h-[80vh] rounded-t-lg shadow-xl bg-white dark:bg-gray-800"
254
- >
255
- <div class="flex flex-row justify-between items-center px-5 py-4 border-b border-gray-200 dark:border-gray-600">
256
- <h2 class="{typography.h2} text-xl">
257
- Order summary
258
- </h2>
259
- <button
260
- onclick={() => (showOrderSummaryOnMobile = false)}
261
- class="transition-colors p-2 rounded-lg text-gray-500 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white hover:bg-gray-50 dark:hover:bg-gray-700"
262
- aria-label="Close order summary"
263
- >
264
- <CloseOutline class="w-7 h-7" />
265
- </button>
266
- </div>
267
-
268
- <div class="px-5 pb-5">
269
- {#each Object.keys(quantities) as key}
270
- {#if quantities[key] > 0}
271
- {#each eventTickets as ticket}
272
- {#if ticket.ID == key}
273
- {@const effectivePrice = getEffectivePrice(ticket)}
274
- {@const isDonation = isDonationTicket(ticket)}
275
- <div class="flex justify-between py-4 border-b border-gray-200 dark:border-gray-600">
276
- <div>
277
- <p class="{typography.h5}">{ticket.name}</p>
278
- <p class="{typography.smMuted}">
279
- {#if ticket.price === 0 && !isDonation}
280
- Free x {quantities[key]}
281
- {:else if isDonation}
282
- ${effectivePrice.toFixed(2)} x {quantities[key]}
283
- {:else}
284
- ${ticket.price.toFixed(2)} x {quantities[key]}
285
- {/if}
286
- </p>
287
- </div>
288
- <div class="{typography.h5}">
289
- {#if ticket.price === 0 && !isDonation}
290
- Free
291
- {:else}
292
- ${(effectivePrice * quantities[key]).toFixed(2)}
293
- {/if}
294
- </div>
295
- </div>
296
- {/if}
297
- {/each}
298
- {/if}
299
- {/each}
300
-
301
- <div class="flex flex-col py-4 gap-3 text-gray-600 dark:text-gray-300">
302
- {#if promoSavings > 0 || (promoDiscount > 0 && !currentPromoRule?.provideDiscount)}
303
- <div class="flex justify-between">
304
- <span>Full Price</span><span>${subtotalWithoutDiscount.toFixed(2)}</span>
305
- </div>
306
- {/if}
307
- {#if promoSavings > 0}
308
- <div class="flex justify-between text-green-600 dark:text-green-500">
309
- <span>Discount</span><span>-${promoSavings.toFixed(2)}</span>
310
- </div>
311
- {:else if promoDiscount > 0 && !currentPromoRule?.provideDiscount}
312
- <div class="flex justify-between text-green-600 dark:text-green-500">
313
- <span>Discount</span><span>-${promoDiscount.toFixed(2)}</span>
314
- </div>
315
- {/if}
316
- <div class="flex justify-between">
317
- <span>Subtotal</span><span>${subtotal.toFixed(2)}</span>
318
- </div>
319
- <div class="flex justify-between">
320
- <span>Fees</span><span>${fees.toFixed(2)}</span>
321
- </div>
322
- <div class="flex justify-between">
323
- <span>Taxes</span><span>${taxes.toFixed(2)}</span>
324
- </div>
325
- </div>
326
-
327
- <div class="flex justify-between {typography.h3} py-5 border-t border-gray-200 dark:border-gray-600">
328
- <span>Total</span><span>${total.toFixed(2)}</span>
329
- </div>
330
- </div>
331
- </div>
332
- {/if}
333
-
334
- {#if showFooter}
335
- <div
336
- transition:fly={{ y: 100, duration: 200 }}
337
- class="min-[872px]:hidden fixed bottom-0 left-0 right-0 z-40 bg-white dark:bg-gray-800 border-t border-gray-200 dark:border-gray-600 shadow-xl p-4 pb-[max(16px,calc(env(safe-area-inset-bottom)+8px))] select-none touch-manipulation"
338
- >
339
- <div class="flex items-stretch gap-3">
340
- <button class="flex flex-col justify-between items-start shrink-0 whitespace-nowrap bg-transparent border-none p-0 cursor-pointer touch-manipulation" onclick={makeOrderSummaryVisible}>
341
- <span class="{`${typography.sm} flex items-center gap-1 text-gray-600 dark:text-gray-300`}">
342
- {totalQuantity} {totalQuantity > 1 ? 'tickets' : 'ticket'}
343
- <ChevronDownOutline class={`w-4 h-4 ${typography.iconMuted} transition-transform duration-200 ${showOrderSummaryOnMobile ? 'rotate-180' : ''}`} />
344
- </span>
345
- <span class="{typography.h2} text-xl">${total.toFixed(2)}</span>
346
- </button>
347
-
348
- <button
349
- class="{`${typography.label} flex-1 min-w-36 h-12 rounded-lg touch-manipulation flex items-center justify-center ${totalQuantity === 0 || !isAgreed ? 'bg-gray-200 dark:bg-gray-700 text-gray-500 dark:text-gray-400 cursor-not-allowed' : 'bg-blue-700 dark:bg-blue-600 text-white hover:bg-blue-800 dark:hover:bg-blue-700'}`}"
350
- onclick={() => {
351
- if (executePurchase) {
352
- executePurchase(elements);
353
- } else if (checkoutTicket) {
354
- checkoutTicket();
355
- }
356
- }}
357
- disabled={totalQuantity === 0 || !isAgreed}
358
- >
359
- {#if loading}
360
- <Spinner size="sm" color="white" />
361
- {:else}
362
- <span translate="no">Checkout</span>
363
- {/if}
364
- </button>
365
- </div>
366
- </div>
367
- {/if}
1
+ <script>
2
+ import { fly, fade } from 'svelte/transition';
3
+ import { cubicOut } from 'svelte/easing';
4
+ import { ChevronDownOutline, CloseOutline } from '../../primitives/Icons';
5
+ import Spinner from '../../primitives/Spinner/Spinner.svelte';
6
+ import { typography } from '../../tokens/typography';
7
+
8
+ let {
9
+ loading = false,
10
+ quantities = {},
11
+ donationAmounts = {}, // Map of ticketId -> donation amount string
12
+ eventTickets = [],
13
+ checkoutTicket = null,
14
+ isAgreed = true,
15
+ btnText = 'Checkout',
16
+ promoApplied = false,
17
+ promoDiscount = 0,
18
+ currentPromoRule = null,
19
+ executePurchase = null,
20
+ elements = null,
21
+ venueServiceCharge = {
22
+ serviceFeeCents: 0,
23
+ serviceFeePercentage: 0,
24
+ serviceFeeChargeType: 'both',
25
+ maxServiceFeeCents: 0,
26
+ taxPercentage: 0,
27
+ },
28
+ onPriceUpdate,
29
+ } = $props();
30
+
31
+ // Helper to get effective price for a ticket (handles donation tickets)
32
+ function getEffectivePrice(ticket) {
33
+ // Donation ticket (type 2): use user-entered donation amount
34
+ if (isDonationTicket(ticket)) {
35
+ const donationAmount = donationAmounts[ticket.ID];
36
+ return parseFloat(donationAmount) || 0;
37
+ }
38
+ // Regular ticket: use ticket price
39
+ return parseFloat(ticket.price) || 0;
40
+ }
41
+
42
+ // Check if ticket is a donation ticket
43
+ // Handle both 'type' and 'ticketType' fields, and coerce to number for comparison
44
+ function isDonationTicket(ticket) {
45
+ const ticketType = ticket.type ?? ticket.ticketType ?? 0;
46
+ return Number(ticketType) === 2;
47
+ }
48
+
49
+ let showOrderSummaryOnMobile = $state(false);
50
+
51
+ function feeFor(price) {
52
+ const chargeType = venueServiceCharge.serviceFeeChargeType || 'both';
53
+ let fee = 0;
54
+
55
+ if (chargeType === 'flat' || chargeType === 'both') {
56
+ fee += (venueServiceCharge.serviceFeeCents || 0) / 100;
57
+ }
58
+ if (chargeType === 'percent' || chargeType === 'both') {
59
+ fee += ((venueServiceCharge.serviceFeePercentage || 0) / 100) * price;
60
+ }
61
+
62
+ const maxFee = venueServiceCharge.maxServiceFeeCents || 0;
63
+ if (maxFee > 0 && fee > maxFee / 100) {
64
+ fee = maxFee / 100;
65
+ }
66
+
67
+ return fee;
68
+ }
69
+
70
+ function makeOrderSummaryVisible() {
71
+ showOrderSummaryOnMobile = !showOrderSummaryOnMobile;
72
+ }
73
+
74
+ function getDiscountedPrice(ticket) {
75
+ if (!currentPromoRule?.provideDiscount) return null;
76
+
77
+ const discountTicketIds = currentPromoRule.discountTicketIds || [];
78
+ if (discountTicketIds.length > 0 && !discountTicketIds.includes(ticket.ID)) {
79
+ return null;
80
+ }
81
+
82
+ const basePrice = parseFloat(ticket.price) || 0;
83
+ const discountAmount = parseFloat(currentPromoRule?.amount || '0') || 0;
84
+ if (currentPromoRule.discountType === '%') {
85
+ return (basePrice * (1 - discountAmount / 100)).toFixed(2);
86
+ } else if (currentPromoRule.discountType === '$') {
87
+ return Math.max(0, basePrice - discountAmount).toFixed(2);
88
+ }
89
+ return null;
90
+ }
91
+
92
+ let totalQuantity = $derived(Object.values(quantities).reduce((sum, q) => sum + q, 0));
93
+ let showFooter = $derived(totalQuantity > 0);
94
+
95
+ let subtotalWithoutDiscount = $derived(Object.keys(quantities).reduce((acc, key) => {
96
+ const ticket = eventTickets.find(t => t.ID == key);
97
+ if (!ticket) return acc;
98
+ // For donation tickets, use the donation amount; otherwise use ticket price
99
+ const effectivePrice = getEffectivePrice(ticket);
100
+ return acc + quantities[key] * effectivePrice;
101
+ }, 0));
102
+
103
+ let subtotal = $derived(Object.keys(quantities).reduce((acc, key) => {
104
+ const ticket = eventTickets.find(t => t.ID == key);
105
+ if (!ticket) return acc;
106
+ // For donation tickets, use the donation amount (no discounts apply)
107
+ if (isDonationTicket(ticket)) {
108
+ const effectivePrice = getEffectivePrice(ticket);
109
+ return acc + quantities[key] * effectivePrice;
110
+ }
111
+ // For regular tickets, apply discounts as usual
112
+ const discountedPrice = getDiscountedPrice(ticket);
113
+ const priceToUse = discountedPrice !== null ? parseFloat(discountedPrice) : ticket.price;
114
+ return acc + quantities[key] * priceToUse;
115
+ }, 0));
116
+
117
+ let promoSavings = $derived(currentPromoRule?.provideDiscount ? (subtotalWithoutDiscount - subtotal) : 0);
118
+
119
+ let fees = $derived(Object.keys(quantities).reduce((acc, key) => {
120
+ const ticket = eventTickets.find(t => t.ID == key);
121
+ // Skip fees for: no ticket, free tickets, and donation tickets (type 2)
122
+ if (!ticket || ticket.price == 0 || isDonationTicket(ticket)) return acc;
123
+ const discountedPrice = getDiscountedPrice(ticket);
124
+ const priceToUse = discountedPrice !== null ? parseFloat(discountedPrice) : ticket.price;
125
+ return acc + quantities[key] * feeFor(priceToUse);
126
+ }, 0));
127
+
128
+ let taxRate = $derived((venueServiceCharge.taxPercentage || 0) / 100);
129
+ let taxes = $derived(subtotal > 0 ? subtotal * taxRate : 0);
130
+ let total = $derived(Math.max(0, subtotal + fees + taxes - (promoApplied && !currentPromoRule?.provideDiscount ? promoDiscount : 0)));
131
+
132
+ $effect(() => {
133
+ onPriceUpdate?.({ subtotal, fees, taxes, total, promoSavings });
134
+ });
135
+ </script>
136
+
137
+ <div
138
+ id="orderSummary"
139
+ class="hidden min-[872px]:block h-fit rounded-lg bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-600"
140
+ >
141
+ <div class="px-5 py-4 border-b border-gray-200 dark:border-gray-600">
142
+ <h3 class={typography.h3}>
143
+ Order summary
144
+ </h3>
145
+ </div>
146
+
147
+ <div class="px-5 pb-5">
148
+ {#if totalQuantity === 0}
149
+ <div class="py-8 text-center">
150
+ <p class="{typography.smMuted}">Select tickets to continue</p>
151
+ </div>
152
+ {:else}
153
+ {#each Object.keys(quantities) as key}
154
+ {#if quantities[key] > 0}
155
+ {#each eventTickets as ticket}
156
+ {#if ticket.ID == key}
157
+ {@const effectivePrice = getEffectivePrice(ticket)}
158
+ {@const isDonation = isDonationTicket(ticket)}
159
+ <div class="flex justify-between py-3 border-b border-gray-200/50 dark:border-gray-600/50">
160
+ <div>
161
+ <p class="{typography.label}">{ticket.name}</p>
162
+ <p class="{typography.smMuted}">
163
+ {#if ticket.price === 0 && !isDonation}
164
+ Free x {quantities[key]}
165
+ {:else if isDonation}
166
+ ${effectivePrice.toFixed(2)} x {quantities[key]}
167
+ {:else}
168
+ ${ticket.price.toFixed(2)} x {quantities[key]}
169
+ {/if}
170
+ </p>
171
+ </div>
172
+ <div class="{typography.label}">
173
+ {#if ticket.price === 0 && !isDonation}
174
+ Free
175
+ {:else}
176
+ ${(effectivePrice * quantities[key]).toFixed(2)}
177
+ {/if}
178
+ </div>
179
+ </div>
180
+ {/if}
181
+ {/each}
182
+ {/if}
183
+ {/each}
184
+
185
+ <div class="{`${typography.sm} flex flex-col py-3 gap-2`}">
186
+ {#if promoSavings > 0 || (promoDiscount > 0 && !currentPromoRule?.provideDiscount)}
187
+ <div class="flex justify-between text-gray-600 dark:text-gray-300">
188
+ <span>Full Price</span><span>${subtotalWithoutDiscount.toFixed(2)}</span>
189
+ </div>
190
+ {/if}
191
+ {#if promoSavings > 0}
192
+ <div class="flex justify-between text-green-600 dark:text-green-500">
193
+ <span>Discount</span><span>-${promoSavings.toFixed(2)}</span>
194
+ </div>
195
+ {:else if promoDiscount > 0 && !currentPromoRule?.provideDiscount}
196
+ <div class="flex justify-between text-green-600 dark:text-green-500">
197
+ <span>Discount</span><span>-${promoDiscount.toFixed(2)}</span>
198
+ </div>
199
+ {/if}
200
+ <div class="flex justify-between text-gray-600 dark:text-gray-300">
201
+ <span>Subtotal</span><span>${subtotal.toFixed(2)}</span>
202
+ </div>
203
+ <div class="flex justify-between text-gray-600 dark:text-gray-300">
204
+ <span>Fees</span><span>${fees.toFixed(2)}</span>
205
+ </div>
206
+ <div class="flex justify-between text-gray-600 dark:text-gray-300">
207
+ <span>Taxes</span><span>${taxes.toFixed(2)}</span>
208
+ </div>
209
+ </div>
210
+
211
+ <div class="flex justify-between {typography.h3} py-4 text-lg border-t border-gray-200 dark:border-gray-600">
212
+ <span>Total</span><span>${total.toFixed(2)}</span>
213
+ </div>
214
+ {/if}
215
+
216
+ {#if totalQuantity > 0 && btnText === 'Place order'}
217
+ <p class="{typography.xsMuted} text-center mb-3">
218
+ By selecting Place order, I agree to the <a href="https://get-micdrop.com/tos" class="text-blue-700 dark:text-blue-500 underline hover:opacity-80" target="_blank" rel="noopener noreferrer">terms of service</a>
219
+ </p>
220
+ {/if}
221
+
222
+ <button
223
+ class="w-full h-12 font-semibold rounded-lg flex items-center justify-center transition-colors select-none touch-manipulation {totalQuantity === 0 ? 'bg-gray-200 dark:bg-gray-700 text-gray-500 dark:text-gray-400 cursor-not-allowed' : 'bg-blue-700 dark:bg-blue-600 text-white hover:bg-blue-800 dark:hover:bg-blue-700'}"
224
+ onclick={() => {
225
+ if (totalQuantity === 0) return;
226
+ if (executePurchase) {
227
+ executePurchase(elements);
228
+ } else if (checkoutTicket) {
229
+ checkoutTicket();
230
+ }
231
+ }}
232
+ disabled={totalQuantity === 0}
233
+ >
234
+ {#if loading}
235
+ <Spinner size="sm" color="white" />
236
+ {:else}
237
+ <span translate="no">{btnText}</span>
238
+ {/if}
239
+ </button>
240
+ </div>
241
+ </div>
242
+
243
+ {#if showOrderSummaryOnMobile}
244
+ <button
245
+ class="min-[872px]:hidden fixed inset-0 bg-black/50 z-40 border-none cursor-pointer"
246
+ onclick={() => (showOrderSummaryOnMobile = false)}
247
+ aria-label="Close order summary"
248
+ transition:fade={{ duration: 200 }}
249
+ ></button>
250
+ <div
251
+ in:fly={{ y: 800, duration: 300, easing: cubicOut }}
252
+ out:fly={{ y: 800, duration: 300, easing: cubicOut }}
253
+ class="min-[872px]:hidden fixed bottom-0 left-0 w-full overflow-x-hidden overflow-y-auto z-50 max-h-[80vh] rounded-t-lg shadow-xl bg-white dark:bg-gray-800"
254
+ >
255
+ <div class="flex flex-row justify-between items-center px-5 py-4 border-b border-gray-200 dark:border-gray-600">
256
+ <h2 class="{typography.h2} text-xl">
257
+ Order summary
258
+ </h2>
259
+ <button
260
+ onclick={() => (showOrderSummaryOnMobile = false)}
261
+ class="transition-colors p-2 rounded-lg text-gray-500 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white hover:bg-gray-50 dark:hover:bg-gray-700"
262
+ aria-label="Close order summary"
263
+ >
264
+ <CloseOutline class="w-7 h-7" />
265
+ </button>
266
+ </div>
267
+
268
+ <div class="px-5 pb-5">
269
+ {#each Object.keys(quantities) as key}
270
+ {#if quantities[key] > 0}
271
+ {#each eventTickets as ticket}
272
+ {#if ticket.ID == key}
273
+ {@const effectivePrice = getEffectivePrice(ticket)}
274
+ {@const isDonation = isDonationTicket(ticket)}
275
+ <div class="flex justify-between py-4 border-b border-gray-200 dark:border-gray-600">
276
+ <div>
277
+ <p class="{typography.h5}">{ticket.name}</p>
278
+ <p class="{typography.smMuted}">
279
+ {#if ticket.price === 0 && !isDonation}
280
+ Free x {quantities[key]}
281
+ {:else if isDonation}
282
+ ${effectivePrice.toFixed(2)} x {quantities[key]}
283
+ {:else}
284
+ ${ticket.price.toFixed(2)} x {quantities[key]}
285
+ {/if}
286
+ </p>
287
+ </div>
288
+ <div class="{typography.h5}">
289
+ {#if ticket.price === 0 && !isDonation}
290
+ Free
291
+ {:else}
292
+ ${(effectivePrice * quantities[key]).toFixed(2)}
293
+ {/if}
294
+ </div>
295
+ </div>
296
+ {/if}
297
+ {/each}
298
+ {/if}
299
+ {/each}
300
+
301
+ <div class="flex flex-col py-4 gap-3 text-gray-600 dark:text-gray-300">
302
+ {#if promoSavings > 0 || (promoDiscount > 0 && !currentPromoRule?.provideDiscount)}
303
+ <div class="flex justify-between">
304
+ <span>Full Price</span><span>${subtotalWithoutDiscount.toFixed(2)}</span>
305
+ </div>
306
+ {/if}
307
+ {#if promoSavings > 0}
308
+ <div class="flex justify-between text-green-600 dark:text-green-500">
309
+ <span>Discount</span><span>-${promoSavings.toFixed(2)}</span>
310
+ </div>
311
+ {:else if promoDiscount > 0 && !currentPromoRule?.provideDiscount}
312
+ <div class="flex justify-between text-green-600 dark:text-green-500">
313
+ <span>Discount</span><span>-${promoDiscount.toFixed(2)}</span>
314
+ </div>
315
+ {/if}
316
+ <div class="flex justify-between">
317
+ <span>Subtotal</span><span>${subtotal.toFixed(2)}</span>
318
+ </div>
319
+ <div class="flex justify-between">
320
+ <span>Fees</span><span>${fees.toFixed(2)}</span>
321
+ </div>
322
+ <div class="flex justify-between">
323
+ <span>Taxes</span><span>${taxes.toFixed(2)}</span>
324
+ </div>
325
+ </div>
326
+
327
+ <div class="flex justify-between {typography.h3} py-5 border-t border-gray-200 dark:border-gray-600">
328
+ <span>Total</span><span>${total.toFixed(2)}</span>
329
+ </div>
330
+ </div>
331
+ </div>
332
+ {/if}
333
+
334
+ {#if showFooter}
335
+ <div
336
+ transition:fly={{ y: 100, duration: 200 }}
337
+ class="min-[872px]:hidden fixed bottom-0 left-0 right-0 z-40 bg-white dark:bg-gray-800 border-t border-gray-200 dark:border-gray-600 shadow-xl p-4 pb-[max(16px,calc(env(safe-area-inset-bottom)+8px))] select-none touch-manipulation"
338
+ >
339
+ <div class="flex items-stretch gap-3">
340
+ <button class="flex flex-col justify-between items-start shrink-0 whitespace-nowrap bg-transparent border-none p-0 cursor-pointer touch-manipulation" onclick={makeOrderSummaryVisible}>
341
+ <span class="{`${typography.sm} flex items-center gap-1 text-gray-600 dark:text-gray-300`}">
342
+ {totalQuantity} {totalQuantity > 1 ? 'tickets' : 'ticket'}
343
+ <ChevronDownOutline class={`w-4 h-4 ${typography.iconMuted} transition-transform duration-200 ${showOrderSummaryOnMobile ? 'rotate-180' : ''}`} />
344
+ </span>
345
+ <span class="{typography.h2} text-xl">${total.toFixed(2)}</span>
346
+ </button>
347
+
348
+ <button
349
+ class="{`${typography.label} flex-1 min-w-36 h-12 rounded-lg touch-manipulation flex items-center justify-center ${totalQuantity === 0 || !isAgreed ? 'bg-gray-200 dark:bg-gray-700 text-gray-500 dark:text-gray-400 cursor-not-allowed' : 'bg-blue-700 dark:bg-blue-600 text-white hover:bg-blue-800 dark:hover:bg-blue-700'}`}"
350
+ onclick={() => {
351
+ if (executePurchase) {
352
+ executePurchase(elements);
353
+ } else if (checkoutTicket) {
354
+ checkoutTicket();
355
+ }
356
+ }}
357
+ disabled={totalQuantity === 0 || !isAgreed}
358
+ >
359
+ {#if loading}
360
+ <Spinner size="sm" color="white" />
361
+ {:else}
362
+ <span translate="no">Checkout</span>
363
+ {/if}
364
+ </button>
365
+ </div>
366
+ </div>
367
+ {/if}