@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
@@ -0,0 +1,791 @@
1
+ import { describe, it, expect, vi, afterEach } from 'vitest';
2
+ import { render, screen, cleanup, fireEvent } from '@testing-library/svelte';
3
+ import AboutShow from './AboutShow.svelte';
4
+
5
+ describe('AboutShow Component', () => {
6
+ afterEach(() => {
7
+ cleanup();
8
+ });
9
+
10
+ describe('basic rendering', () => {
11
+ it('renders with default props', () => {
12
+ render(AboutShow);
13
+ expect(screen.getByText('About the Show')).toBeInTheDocument();
14
+ });
15
+
16
+ it('renders custom title', () => {
17
+ render(AboutShow, { props: { title: 'Show Details' } });
18
+ expect(screen.getByText('Show Details')).toBeInTheDocument();
19
+ });
20
+
21
+ it('hides title when showTitle is false', () => {
22
+ render(AboutShow, { props: { showTitle: false } });
23
+ expect(screen.queryByText('About the Show')).not.toBeInTheDocument();
24
+ });
25
+
26
+ it('renders without crashing with empty props', () => {
27
+ const { container } = render(AboutShow);
28
+ expect(container.querySelector('.flex.flex-col.gap-3')).toBeInTheDocument();
29
+ });
30
+ });
31
+
32
+ describe('show image', () => {
33
+ it('renders show image when ShowImage and description are provided', () => {
34
+ render(AboutShow, {
35
+ props: {
36
+ ShowImage: 'https://example.com/image.jpg',
37
+ description: 'Test description'
38
+ }
39
+ });
40
+ const img = screen.getByAltText('');
41
+ expect(img).toBeInTheDocument();
42
+ expect(img).toHaveAttribute('src', 'https://example.com/image.jpg');
43
+ });
44
+
45
+ it('does not render image when ShowImage is empty', () => {
46
+ render(AboutShow, {
47
+ props: {
48
+ ShowImage: '',
49
+ description: 'Test description'
50
+ }
51
+ });
52
+ expect(screen.queryByRole('img')).not.toBeInTheDocument();
53
+ });
54
+
55
+ it('does not render image when description is empty', () => {
56
+ render(AboutShow, {
57
+ props: {
58
+ ShowImage: 'https://example.com/image.jpg',
59
+ description: ''
60
+ }
61
+ });
62
+ expect(screen.queryByRole('img', { name: '' })).not.toBeInTheDocument();
63
+ });
64
+
65
+ it('applies correct styling to show image', () => {
66
+ render(AboutShow, {
67
+ props: {
68
+ ShowImage: 'https://example.com/image.jpg',
69
+ description: 'Test description'
70
+ }
71
+ });
72
+ const img = screen.getByAltText('');
73
+ expect(img.className).toContain('rounded-lg');
74
+ expect(img.className).toContain('object-contain');
75
+ expect(img.className).toContain('w-full');
76
+ });
77
+ });
78
+
79
+ describe('description display', () => {
80
+ it('renders short description without read more', () => {
81
+ const shortDescription = 'This is a short description';
82
+ render(AboutShow, { props: { description: shortDescription } });
83
+ expect(screen.getByText(shortDescription)).toBeInTheDocument();
84
+ expect(screen.queryByText('Show more')).not.toBeInTheDocument();
85
+ });
86
+
87
+ it('renders truncated long description with show more button', () => {
88
+ const longDescription = 'a'.repeat(1600);
89
+ render(AboutShow, { props: { description: longDescription } });
90
+ expect(screen.getByText(/^a+\.\.\.$/)).toBeInTheDocument();
91
+ expect(screen.getByText('Show more')).toBeInTheDocument();
92
+ });
93
+
94
+ it('expands description when show more is clicked', async () => {
95
+ const longDescription = 'a'.repeat(1600);
96
+ render(AboutShow, { props: { description: longDescription } });
97
+
98
+ const showMoreButton = screen.getByText('Show more');
99
+ await fireEvent.click(showMoreButton);
100
+
101
+ expect(screen.getByText('Show less')).toBeInTheDocument();
102
+ expect(screen.queryByText('Show more')).not.toBeInTheDocument();
103
+ });
104
+
105
+ it('collapses description when show less is clicked', async () => {
106
+ const longDescription = 'a'.repeat(1600);
107
+ render(AboutShow, { props: { description: longDescription } });
108
+
109
+ const showMoreButton = screen.getByText('Show more');
110
+ await fireEvent.click(showMoreButton);
111
+
112
+ const showLessButton = screen.getByText('Show less');
113
+ await fireEvent.click(showLessButton);
114
+
115
+ expect(screen.getByText('Show more')).toBeInTheDocument();
116
+ expect(screen.queryByText('Show less')).not.toBeInTheDocument();
117
+ });
118
+
119
+ it('does not show read more when showReadMore is false', () => {
120
+ const longDescription = 'a'.repeat(1600);
121
+ render(AboutShow, {
122
+ props: {
123
+ description: longDescription,
124
+ showReadMore: false
125
+ }
126
+ });
127
+ expect(screen.queryByText('Show more')).not.toBeInTheDocument();
128
+ expect(screen.getByText(longDescription)).toBeInTheDocument();
129
+ });
130
+
131
+ it('preserves whitespace in description with whitespace-pre-line', () => {
132
+ const descriptionWithNewlines = 'Line 1\nLine 2\nLine 3';
133
+ const { container } = render(AboutShow, {
134
+ props: { description: descriptionWithNewlines }
135
+ });
136
+ const paragraph = container.querySelector('p');
137
+ expect(paragraph.className).toContain('whitespace-pre-line');
138
+ });
139
+
140
+ it('does not render description when empty', () => {
141
+ const { container } = render(AboutShow, { props: { description: '' } });
142
+ const paragraphs = container.querySelectorAll('p');
143
+ const descriptionParagraphs = Array.from(paragraphs).filter(p =>
144
+ p.className.includes('whitespace-pre-line')
145
+ );
146
+ expect(descriptionParagraphs.length).toBe(0);
147
+ });
148
+ });
149
+
150
+ describe('performers filtering', () => {
151
+ it('filters out unconfirmed performers', () => {
152
+ const performers = [
153
+ {
154
+ ID: 1,
155
+ acceptedState: 1,
156
+ shouldBeHidden: false,
157
+ RosterPerformer: {
158
+ User: {
159
+ performerProfile: {
160
+ firstName: 'John',
161
+ lastName: 'Doe',
162
+ profileImage: 'image1.jpg'
163
+ }
164
+ }
165
+ }
166
+ }
167
+ ];
168
+ render(AboutShow, { props: { performers } });
169
+ expect(screen.queryByText('John Doe')).not.toBeInTheDocument();
170
+ });
171
+
172
+ it('filters out hidden performers', () => {
173
+ const performers = [
174
+ {
175
+ ID: 1,
176
+ acceptedState: 2,
177
+ shouldBeHidden: true,
178
+ RosterPerformer: {
179
+ User: {
180
+ performerProfile: {
181
+ firstName: 'Jane',
182
+ lastName: 'Smith',
183
+ profileImage: 'image2.jpg'
184
+ }
185
+ }
186
+ }
187
+ }
188
+ ];
189
+ render(AboutShow, { props: { performers } });
190
+ expect(screen.queryByText('Jane Smith')).not.toBeInTheDocument();
191
+ });
192
+
193
+ it('filters out performers without names', () => {
194
+ const performers = [
195
+ {
196
+ ID: 1,
197
+ acceptedState: 2,
198
+ shouldBeHidden: false,
199
+ RosterPerformer: {
200
+ User: {
201
+ performerProfile: {
202
+ profileImage: 'image3.jpg'
203
+ }
204
+ }
205
+ }
206
+ }
207
+ ];
208
+ render(AboutShow, { props: { performers } });
209
+ const performerCards = screen.queryAllByRole('img');
210
+ expect(performerCards.length).toBe(0);
211
+ });
212
+
213
+ it('shows confirmed, non-hidden performers with names', () => {
214
+ const performers = [
215
+ {
216
+ ID: 1,
217
+ acceptedState: 2,
218
+ shouldBeHidden: false,
219
+ RosterPerformer: {
220
+ User: {
221
+ performerProfile: {
222
+ firstName: 'Alice',
223
+ lastName: 'Wonder',
224
+ profileImage: 'alice.jpg'
225
+ }
226
+ }
227
+ }
228
+ }
229
+ ];
230
+ render(AboutShow, { props: { performers } });
231
+ expect(screen.getByText('Alice Wonder')).toBeInTheDocument();
232
+ });
233
+
234
+ it('does not render performers section when no valid performers', () => {
235
+ const { container } = render(AboutShow, { props: { performers: [] } });
236
+ const performerSection = container.querySelector('.py-2');
237
+ expect(performerSection).not.toBeInTheDocument();
238
+ });
239
+ });
240
+
241
+ describe('performer display', () => {
242
+ const validPerformer = {
243
+ ID: 1,
244
+ acceptedState: 2,
245
+ shouldBeHidden: false,
246
+ RosterPerformer: {
247
+ User: {
248
+ performerProfile: {
249
+ firstName: 'Bob',
250
+ lastName: 'Builder',
251
+ profileImage: 'bob.jpg'
252
+ }
253
+ }
254
+ }
255
+ };
256
+
257
+ it('displays performer name', () => {
258
+ render(AboutShow, { props: { performers: [validPerformer] } });
259
+ expect(screen.getByText('Bob Builder')).toBeInTheDocument();
260
+ });
261
+
262
+ it('uses stage name when useStageName is true', () => {
263
+ const performerWithStageName = {
264
+ ...validPerformer,
265
+ RosterPerformer: {
266
+ User: {
267
+ performerProfile: {
268
+ firstName: 'Bob',
269
+ lastName: 'Builder',
270
+ stageName: 'The Builder',
271
+ useStageName: true,
272
+ profileImage: 'bob.jpg'
273
+ }
274
+ }
275
+ }
276
+ };
277
+ render(AboutShow, { props: { performers: [performerWithStageName] } });
278
+ expect(screen.getByText('The Builder')).toBeInTheDocument();
279
+ expect(screen.queryByText('Bob Builder')).not.toBeInTheDocument();
280
+ });
281
+
282
+ it('uses first and last name when useStageName is false', () => {
283
+ const performerWithStageName = {
284
+ ...validPerformer,
285
+ RosterPerformer: {
286
+ User: {
287
+ performerProfile: {
288
+ firstName: 'Bob',
289
+ lastName: 'Builder',
290
+ stageName: 'The Builder',
291
+ useStageName: false,
292
+ profileImage: 'bob.jpg'
293
+ }
294
+ }
295
+ }
296
+ };
297
+ render(AboutShow, { props: { performers: [performerWithStageName] } });
298
+ expect(screen.getByText('Bob Builder')).toBeInTheDocument();
299
+ expect(screen.queryByText('The Builder')).not.toBeInTheDocument();
300
+ });
301
+
302
+ it('uses getImageUrl function for performer images', () => {
303
+ const mockGetImageUrl = vi.fn((url) => `https://cdn.example.com/${url}`);
304
+ render(AboutShow, {
305
+ props: {
306
+ performers: [validPerformer],
307
+ getImageUrl: mockGetImageUrl
308
+ }
309
+ });
310
+ expect(mockGetImageUrl).toHaveBeenCalledWith('bob.jpg');
311
+ });
312
+
313
+ it('handles performer without profileImage', () => {
314
+ const performerNoImage = {
315
+ ...validPerformer,
316
+ RosterPerformer: {
317
+ User: {
318
+ performerProfile: {
319
+ firstName: 'Charlie',
320
+ lastName: 'Brown'
321
+ }
322
+ }
323
+ }
324
+ };
325
+ const { container } = render(AboutShow, {
326
+ props: { performers: [performerNoImage] }
327
+ });
328
+ const img = screen.getByAltText('Charlie Brown');
329
+ expect(img).toHaveAttribute('src', '');
330
+ expect(img.className).toContain('bg-gray-50');
331
+ });
332
+
333
+ it('renders multiple performers', () => {
334
+ const performers = [
335
+ validPerformer,
336
+ {
337
+ ID: 2,
338
+ acceptedState: 2,
339
+ shouldBeHidden: false,
340
+ RosterPerformer: {
341
+ User: {
342
+ performerProfile: {
343
+ firstName: 'Alice',
344
+ lastName: 'Wonder',
345
+ profileImage: 'alice.jpg'
346
+ }
347
+ }
348
+ }
349
+ }
350
+ ];
351
+ render(AboutShow, { props: { performers } });
352
+ expect(screen.getByText('Bob Builder')).toBeInTheDocument();
353
+ expect(screen.getByText('Alice Wonder')).toBeInTheDocument();
354
+ });
355
+ });
356
+
357
+ describe('performer interaction', () => {
358
+ const validPerformer = {
359
+ ID: 1,
360
+ acceptedState: 2,
361
+ shouldBeHidden: false,
362
+ RosterPerformer: {
363
+ User: {
364
+ performerProfile: {
365
+ firstName: 'Bob',
366
+ lastName: 'Builder',
367
+ biography: 'Bob is a builder who builds things.',
368
+ instagram: 'https://instagram.com/bob',
369
+ twitter: 'https://twitter.com/bob',
370
+ profileImage: 'bob.jpg'
371
+ }
372
+ }
373
+ }
374
+ };
375
+
376
+ it('shows performer biography when clicked', async () => {
377
+ render(AboutShow, { props: { performers: [validPerformer] } });
378
+
379
+ const performerCard = screen.getByText('Bob Builder').closest('.cursor-pointer');
380
+ await fireEvent.click(performerCard);
381
+
382
+ expect(screen.getByText('Bob is a builder who builds things.')).toBeInTheDocument();
383
+ });
384
+
385
+ it('hides performer biography when clicked again', async () => {
386
+ render(AboutShow, { props: { performers: [validPerformer] } });
387
+
388
+ const performerCard = screen.getByText('Bob Builder').closest('.cursor-pointer');
389
+ await fireEvent.click(performerCard);
390
+ expect(screen.getByText('Bob is a builder who builds things.')).toBeInTheDocument();
391
+
392
+ await fireEvent.click(performerCard);
393
+ expect(screen.queryByText('Bob is a builder who builds things.')).not.toBeInTheDocument();
394
+ });
395
+
396
+ it('closes performer popup when close button is clicked', async () => {
397
+ render(AboutShow, { props: { performers: [validPerformer] } });
398
+
399
+ const performerCard = screen.getByText('Bob Builder').closest('.cursor-pointer');
400
+ await fireEvent.click(performerCard);
401
+
402
+ const closeButton = screen.getByLabelText('Close');
403
+ await fireEvent.click(closeButton);
404
+
405
+ expect(screen.queryByText('Bob is a builder who builds things.')).not.toBeInTheDocument();
406
+ });
407
+
408
+ it('closes performer popup when backdrop is clicked', async () => {
409
+ const { container } = render(AboutShow, { props: { performers: [validPerformer] } });
410
+
411
+ const performerCard = screen.getByText('Bob Builder').closest('.cursor-pointer');
412
+ await fireEvent.click(performerCard);
413
+
414
+ const backdrop = container.querySelector('.fixed.inset-0.z-40');
415
+ await fireEvent.click(backdrop);
416
+
417
+ expect(screen.queryByText('Bob is a builder who builds things.')).not.toBeInTheDocument();
418
+ });
419
+
420
+ it('stops propagation when clicking inside popup', async () => {
421
+ const { container } = render(AboutShow, { props: { performers: [validPerformer] } });
422
+
423
+ const performerCard = screen.getByText('Bob Builder').closest('.cursor-pointer');
424
+ await fireEvent.click(performerCard);
425
+
426
+ const popup = screen.getByText('Bob is a builder who builds things.').closest('.absolute');
427
+ await fireEvent.click(popup);
428
+
429
+ // Popup should still be visible
430
+ expect(screen.getByText('Bob is a builder who builds things.')).toBeInTheDocument();
431
+ });
432
+
433
+ it('highlights active performer card', async () => {
434
+ render(AboutShow, { props: { performers: [validPerformer] } });
435
+
436
+ const performerCard = screen.getByText('Bob Builder').closest('.cursor-pointer');
437
+ expect(performerCard.className).toContain('border-gray-200');
438
+
439
+ await fireEvent.click(performerCard);
440
+ // Check for the active state border (not the hover state)
441
+ const activeClassPattern = /border-blue-700(?!\s*dark:hover)/;
442
+ expect(performerCard.className).toMatch(activeClassPattern);
443
+ });
444
+
445
+ it('closes other performer when new one is opened', async () => {
446
+ const performers = [
447
+ validPerformer,
448
+ {
449
+ ID: 2,
450
+ acceptedState: 2,
451
+ shouldBeHidden: false,
452
+ RosterPerformer: {
453
+ User: {
454
+ performerProfile: {
455
+ firstName: 'Alice',
456
+ lastName: 'Wonder',
457
+ biography: 'Alice wonders about things.',
458
+ profileImage: 'alice.jpg'
459
+ }
460
+ }
461
+ }
462
+ }
463
+ ];
464
+ render(AboutShow, { props: { performers } });
465
+
466
+ const bobCard = screen.getByText('Bob Builder').closest('.cursor-pointer');
467
+ const aliceCard = screen.getByText('Alice Wonder').closest('.cursor-pointer');
468
+
469
+ await fireEvent.click(bobCard);
470
+ expect(screen.getByText('Bob is a builder who builds things.')).toBeInTheDocument();
471
+
472
+ await fireEvent.click(aliceCard);
473
+ expect(screen.queryByText('Bob is a builder who builds things.')).not.toBeInTheDocument();
474
+ expect(screen.getByText('Alice wonders about things.')).toBeInTheDocument();
475
+ });
476
+ });
477
+
478
+ describe('social media links', () => {
479
+ const performerWithSocials = {
480
+ ID: 1,
481
+ acceptedState: 2,
482
+ shouldBeHidden: false,
483
+ RosterPerformer: {
484
+ User: {
485
+ performerProfile: {
486
+ firstName: 'Bob',
487
+ lastName: 'Builder',
488
+ biography: 'Bob is a builder.',
489
+ instagram: 'https://instagram.com/bob',
490
+ twitter: 'https://twitter.com/bob',
491
+ profileImage: 'bob.jpg'
492
+ }
493
+ }
494
+ }
495
+ };
496
+
497
+ it('displays instagram link when available', async () => {
498
+ render(AboutShow, { props: { performers: [performerWithSocials] } });
499
+
500
+ const performerCard = screen.getByText('Bob Builder').closest('.cursor-pointer');
501
+ await fireEvent.click(performerCard);
502
+
503
+ const instagramLink = screen.getByLabelText('Instagram profile');
504
+ expect(instagramLink).toBeInTheDocument();
505
+ expect(instagramLink).toHaveAttribute('href', 'https://instagram.com/bob');
506
+ expect(instagramLink).toHaveAttribute('target', '_blank');
507
+ expect(instagramLink).toHaveAttribute('rel', 'noopener noreferrer');
508
+ });
509
+
510
+ it('displays twitter link when available', async () => {
511
+ render(AboutShow, { props: { performers: [performerWithSocials] } });
512
+
513
+ const performerCard = screen.getByText('Bob Builder').closest('.cursor-pointer');
514
+ await fireEvent.click(performerCard);
515
+
516
+ const twitterLink = screen.getByLabelText('Twitter profile');
517
+ expect(twitterLink).toBeInTheDocument();
518
+ expect(twitterLink).toHaveAttribute('href', 'https://twitter.com/bob');
519
+ expect(twitterLink).toHaveAttribute('target', '_blank');
520
+ expect(twitterLink).toHaveAttribute('rel', 'noopener noreferrer');
521
+ });
522
+
523
+ it('does not display social section when no socials available', async () => {
524
+ const performerNoSocials = {
525
+ ...performerWithSocials,
526
+ RosterPerformer: {
527
+ User: {
528
+ performerProfile: {
529
+ firstName: 'Bob',
530
+ lastName: 'Builder',
531
+ biography: 'Bob is a builder.',
532
+ profileImage: 'bob.jpg'
533
+ }
534
+ }
535
+ }
536
+ };
537
+ render(AboutShow, { props: { performers: [performerNoSocials] } });
538
+
539
+ const performerCard = screen.getByText('Bob Builder').closest('.cursor-pointer');
540
+ await fireEvent.click(performerCard);
541
+
542
+ expect(screen.queryByText(/Follow/)).not.toBeInTheDocument();
543
+ });
544
+
545
+ it('displays only instagram when twitter not available', async () => {
546
+ const performerInstagramOnly = {
547
+ ...performerWithSocials,
548
+ RosterPerformer: {
549
+ User: {
550
+ performerProfile: {
551
+ firstName: 'Bob',
552
+ lastName: 'Builder',
553
+ biography: 'Bob is a builder.',
554
+ instagram: 'https://instagram.com/bob',
555
+ profileImage: 'bob.jpg'
556
+ }
557
+ }
558
+ }
559
+ };
560
+ render(AboutShow, { props: { performers: [performerInstagramOnly] } });
561
+
562
+ const performerCard = screen.getByText('Bob Builder').closest('.cursor-pointer');
563
+ await fireEvent.click(performerCard);
564
+
565
+ expect(screen.getByLabelText('Instagram profile')).toBeInTheDocument();
566
+ expect(screen.queryByLabelText('Twitter profile')).not.toBeInTheDocument();
567
+ });
568
+
569
+ it('displays only twitter when instagram not available', async () => {
570
+ const performerTwitterOnly = {
571
+ ...performerWithSocials,
572
+ RosterPerformer: {
573
+ User: {
574
+ performerProfile: {
575
+ firstName: 'Bob',
576
+ lastName: 'Builder',
577
+ biography: 'Bob is a builder.',
578
+ twitter: 'https://twitter.com/bob',
579
+ profileImage: 'bob.jpg'
580
+ }
581
+ }
582
+ }
583
+ };
584
+ render(AboutShow, { props: { performers: [performerTwitterOnly] } });
585
+
586
+ const performerCard = screen.getByText('Bob Builder').closest('.cursor-pointer');
587
+ await fireEvent.click(performerCard);
588
+
589
+ expect(screen.getByLabelText('Twitter profile')).toBeInTheDocument();
590
+ expect(screen.queryByLabelText('Instagram profile')).not.toBeInTheDocument();
591
+ });
592
+
593
+ it('displays follow text with performer first name', async () => {
594
+ render(AboutShow, { props: { performers: [performerWithSocials] } });
595
+
596
+ const performerCard = screen.getByText('Bob Builder').closest('.cursor-pointer');
597
+ await fireEvent.click(performerCard);
598
+
599
+ expect(screen.getByText('Follow Bob:')).toBeInTheDocument();
600
+ });
601
+ });
602
+
603
+ describe('popup positioning', () => {
604
+ const performers = [
605
+ {
606
+ ID: 1,
607
+ acceptedState: 2,
608
+ shouldBeHidden: false,
609
+ RosterPerformer: {
610
+ User: {
611
+ performerProfile: {
612
+ firstName: 'First',
613
+ lastName: 'Performer',
614
+ biography: 'First performer bio.',
615
+ profileImage: 'first.jpg'
616
+ }
617
+ }
618
+ }
619
+ },
620
+ {
621
+ ID: 2,
622
+ acceptedState: 2,
623
+ shouldBeHidden: false,
624
+ RosterPerformer: {
625
+ User: {
626
+ performerProfile: {
627
+ firstName: 'Second',
628
+ lastName: 'Performer',
629
+ biography: 'Second performer bio.',
630
+ profileImage: 'second.jpg'
631
+ }
632
+ }
633
+ }
634
+ }
635
+ ];
636
+
637
+ it('positions first performer popup differently', async () => {
638
+ const { container } = render(AboutShow, { props: { performers } });
639
+
640
+ const firstCard = screen.getByText('First Performer').closest('.cursor-pointer');
641
+ await fireEvent.click(firstCard);
642
+
643
+ const popup = screen.getByText('First performer bio.').closest('.absolute');
644
+ expect(popup.className).toContain('left-[190%]');
645
+ });
646
+
647
+ it('positions non-first performer popup centered', async () => {
648
+ const { container } = render(AboutShow, { props: { performers } });
649
+
650
+ const secondCard = screen.getByText('Second Performer').closest('.cursor-pointer');
651
+ await fireEvent.click(secondCard);
652
+
653
+ const popup = screen.getByText('Second performer bio.').closest('.absolute');
654
+ expect(popup.className).toContain('left-1/2');
655
+ expect(popup.className).toContain('-translate-x-1/2');
656
+ });
657
+ });
658
+
659
+ describe('dark mode styling', () => {
660
+ it('has dark mode classes for title', () => {
661
+ const { container } = render(AboutShow);
662
+ const title = screen.getByText('About the Show');
663
+ expect(title.className).toContain('dark:text-white');
664
+ });
665
+
666
+ it('has dark mode classes for show image background', () => {
667
+ render(AboutShow, {
668
+ props: {
669
+ ShowImage: 'https://example.com/image.jpg',
670
+ description: 'Test description'
671
+ }
672
+ });
673
+ const img = screen.getByAltText('');
674
+ expect(img.className).toContain('dark:bg-gray-800');
675
+ });
676
+
677
+ it('has dark mode classes for description', () => {
678
+ const { container } = render(AboutShow, {
679
+ props: { description: 'Test description' }
680
+ });
681
+ const paragraph = screen.getByText('Test description');
682
+ expect(paragraph.className).toContain('dark:text-white');
683
+ });
684
+
685
+ it('has dark mode classes for read more button', () => {
686
+ const longDescription = 'a'.repeat(1600);
687
+ render(AboutShow, { props: { description: longDescription } });
688
+ const button = screen.getByText('Show more');
689
+ expect(button.className).toContain('dark:text-blue-500');
690
+ });
691
+
692
+ it('has dark mode classes for performer card', () => {
693
+ const performer = {
694
+ ID: 1,
695
+ acceptedState: 2,
696
+ shouldBeHidden: false,
697
+ RosterPerformer: {
698
+ User: {
699
+ performerProfile: {
700
+ firstName: 'Bob',
701
+ lastName: 'Builder',
702
+ profileImage: 'bob.jpg'
703
+ }
704
+ }
705
+ }
706
+ };
707
+ render(AboutShow, { props: { performers: [performer] } });
708
+ const card = screen.getByText('Bob Builder').closest('.cursor-pointer');
709
+ expect(card.className).toContain('dark:bg-gray-800');
710
+ expect(card.className).toContain('dark:border-gray-600');
711
+ expect(card.className).toContain('dark:hover:border-blue-500');
712
+ });
713
+ });
714
+
715
+ describe('accessibility', () => {
716
+ it('uses semantic heading for title', () => {
717
+ render(AboutShow);
718
+ expect(screen.getByRole('heading', { name: 'About the Show' })).toBeInTheDocument();
719
+ });
720
+
721
+ it('has proper alt text for performer images', () => {
722
+ const performer = {
723
+ ID: 1,
724
+ acceptedState: 2,
725
+ shouldBeHidden: false,
726
+ RosterPerformer: {
727
+ User: {
728
+ performerProfile: {
729
+ firstName: 'Bob',
730
+ lastName: 'Builder',
731
+ profileImage: 'bob.jpg'
732
+ }
733
+ }
734
+ }
735
+ };
736
+ render(AboutShow, { props: { performers: [performer] } });
737
+ expect(screen.getByAltText('Bob Builder')).toBeInTheDocument();
738
+ });
739
+
740
+ it('has aria-label for close button', async () => {
741
+ const performer = {
742
+ ID: 1,
743
+ acceptedState: 2,
744
+ shouldBeHidden: false,
745
+ RosterPerformer: {
746
+ User: {
747
+ performerProfile: {
748
+ firstName: 'Bob',
749
+ lastName: 'Builder',
750
+ biography: 'Bio',
751
+ profileImage: 'bob.jpg'
752
+ }
753
+ }
754
+ }
755
+ };
756
+ render(AboutShow, { props: { performers: [performer] } });
757
+
758
+ const performerCard = screen.getByText('Bob Builder').closest('.cursor-pointer');
759
+ await fireEvent.click(performerCard);
760
+
761
+ expect(screen.getByLabelText('Close')).toBeInTheDocument();
762
+ });
763
+
764
+ it('has aria-label for social media links', async () => {
765
+ const performer = {
766
+ ID: 1,
767
+ acceptedState: 2,
768
+ shouldBeHidden: false,
769
+ RosterPerformer: {
770
+ User: {
771
+ performerProfile: {
772
+ firstName: 'Bob',
773
+ lastName: 'Builder',
774
+ biography: 'Bio',
775
+ instagram: 'https://instagram.com/bob',
776
+ twitter: 'https://twitter.com/bob',
777
+ profileImage: 'bob.jpg'
778
+ }
779
+ }
780
+ }
781
+ };
782
+ render(AboutShow, { props: { performers: [performer] } });
783
+
784
+ const performerCard = screen.getByText('Bob Builder').closest('.cursor-pointer');
785
+ await fireEvent.click(performerCard);
786
+
787
+ expect(screen.getByLabelText('Instagram profile')).toBeInTheDocument();
788
+ expect(screen.getByLabelText('Twitter profile')).toBeInTheDocument();
789
+ });
790
+ });
791
+ });