@getmicdrop/svelte-components 5.5.4 → 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 (290) 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/Calendar/MiniMonthCalendar.spec.d.ts +2 -0
  5. package/dist/calendar/Calendar/MiniMonthCalendar.spec.d.ts.map +1 -0
  6. package/dist/calendar/Calendar/MiniMonthCalendar.spec.js +1191 -0
  7. package/dist/calendar/FAQs/FAQs.spec.d.ts +2 -0
  8. package/dist/calendar/FAQs/FAQs.spec.d.ts.map +1 -0
  9. package/dist/calendar/FAQs/FAQs.spec.js +238 -0
  10. package/dist/calendar/MonthSwitcher/MonthSwitcher.spec.d.ts +2 -0
  11. package/dist/calendar/MonthSwitcher/MonthSwitcher.spec.d.ts.map +1 -0
  12. package/dist/calendar/MonthSwitcher/MonthSwitcher.spec.js +420 -0
  13. package/dist/calendar/OrderSummary/OrderSummary.spec.d.ts +2 -0
  14. package/dist/calendar/OrderSummary/OrderSummary.spec.d.ts.map +1 -0
  15. package/dist/calendar/OrderSummary/OrderSummary.spec.js +808 -0
  16. package/dist/calendar/PublicCard/PublicCard.spec.d.ts +2 -0
  17. package/dist/calendar/PublicCard/PublicCard.spec.d.ts.map +1 -0
  18. package/dist/calendar/PublicCard/PublicCard.spec.js +301 -0
  19. package/dist/calendar/ShowCard/ShowCard.spec.d.ts +2 -0
  20. package/dist/calendar/ShowCard/ShowCard.spec.d.ts.map +1 -0
  21. package/dist/calendar/ShowCard/ShowCard.spec.js +714 -0
  22. package/dist/calendar/ShowTimeCard/ShowTimeCard.spec.d.ts +2 -0
  23. package/dist/calendar/ShowTimeCard/ShowTimeCard.spec.d.ts.map +1 -0
  24. package/dist/calendar/ShowTimeCard/ShowTimeCard.spec.js +241 -0
  25. package/dist/components/Layout/Section.spec.d.ts +2 -0
  26. package/dist/components/Layout/Section.spec.d.ts.map +1 -0
  27. package/dist/components/Layout/Section.spec.js +149 -0
  28. package/dist/components/Layout/Sidebar.spec.d.ts +2 -0
  29. package/dist/components/Layout/Sidebar.spec.d.ts.map +1 -0
  30. package/dist/components/Layout/Sidebar.spec.js +186 -0
  31. package/dist/components/Layout/Stack.spec.js +3 -3
  32. package/dist/constants/formOptions.spec.js +9 -5
  33. package/dist/datetime/__tests__/format.test.js +1 -1
  34. package/dist/datetime/__tests__/parse.test.js +1 -1
  35. package/dist/datetime/__tests__/timezone.test.js +124 -2
  36. package/dist/datetime/parse.js +1 -1
  37. package/dist/forms/createFieldTracker.spec.d.ts +2 -0
  38. package/dist/forms/createFieldTracker.spec.d.ts.map +1 -0
  39. package/dist/forms/createFieldTracker.spec.js +343 -0
  40. package/dist/forms/createFormStore.spec.d.ts +2 -0
  41. package/dist/forms/createFormStore.spec.d.ts.map +1 -0
  42. package/dist/forms/createFormStore.spec.js +689 -0
  43. package/dist/forms/createFormStore.svelte.js +0 -1
  44. package/dist/index.d.ts +4 -112
  45. package/dist/index.js +4 -190
  46. package/dist/patterns/data/DataGrid.spec.d.ts +2 -0
  47. package/dist/patterns/data/DataGrid.spec.d.ts.map +1 -0
  48. package/dist/patterns/data/DataGrid.spec.js +159 -0
  49. package/dist/patterns/data/DataList.spec.d.ts +2 -0
  50. package/dist/patterns/data/DataList.spec.d.ts.map +1 -0
  51. package/dist/patterns/data/DataList.spec.js +158 -0
  52. package/dist/patterns/data/DataTable.spec.d.ts +2 -0
  53. package/dist/patterns/data/DataTable.spec.d.ts.map +1 -0
  54. package/dist/patterns/data/DataTable.spec.js +196 -0
  55. package/dist/patterns/forms/FormActions.spec.js +10 -3
  56. package/dist/patterns/forms/FormGrid.spec.d.ts +2 -0
  57. package/dist/patterns/forms/FormGrid.spec.d.ts.map +1 -0
  58. package/dist/patterns/forms/FormGrid.spec.js +125 -0
  59. package/dist/patterns/forms/FormSection.spec.d.ts +2 -0
  60. package/dist/patterns/forms/FormSection.spec.d.ts.map +1 -0
  61. package/dist/patterns/forms/FormSection.spec.js +153 -0
  62. package/dist/patterns/layout/Sidebar.spec.d.ts +2 -0
  63. package/dist/patterns/layout/Sidebar.spec.d.ts.map +1 -0
  64. package/dist/patterns/layout/Sidebar.spec.js +159 -0
  65. package/dist/patterns/navigation/BottomNav.svelte +4 -4
  66. package/dist/patterns/navigation/Header.spec.js +33 -24
  67. package/dist/patterns/page/PageHeader.spec.d.ts +2 -0
  68. package/dist/patterns/page/PageHeader.spec.d.ts.map +1 -0
  69. package/dist/patterns/page/PageHeader.spec.js +167 -0
  70. package/dist/patterns/page/PageLayout.spec.d.ts +2 -0
  71. package/dist/patterns/page/PageLayout.spec.d.ts.map +1 -0
  72. package/dist/patterns/page/PageLayout.spec.js +145 -0
  73. package/dist/patterns/page/PageLoader.spec.js +5 -2
  74. package/dist/patterns/page/SectionHeader.spec.d.ts +2 -0
  75. package/dist/patterns/page/SectionHeader.spec.d.ts.map +1 -0
  76. package/dist/patterns/page/SectionHeader.spec.js +197 -0
  77. package/dist/presets/badges.spec.d.ts +2 -0
  78. package/dist/presets/badges.spec.d.ts.map +1 -0
  79. package/dist/presets/badges.spec.js +172 -0
  80. package/dist/presets/buttons.spec.d.ts +2 -0
  81. package/dist/presets/buttons.spec.d.ts.map +1 -0
  82. package/dist/presets/buttons.spec.js +135 -0
  83. package/dist/primitives/Accordion/Accordion.spec.d.ts +2 -0
  84. package/dist/primitives/Accordion/Accordion.spec.d.ts.map +1 -0
  85. package/dist/primitives/Accordion/Accordion.spec.js +83 -0
  86. package/dist/primitives/Accordion/AccordionItem.spec.d.ts +2 -0
  87. package/dist/primitives/Accordion/AccordionItem.spec.d.ts.map +1 -0
  88. package/dist/primitives/Accordion/AccordionItem.spec.js +661 -0
  89. package/dist/primitives/Accordion/AccordionItemWrapper.test.svelte +107 -0
  90. package/dist/primitives/Accordion/AccordionItemWrapper.test.svelte.d.ts +35 -0
  91. package/dist/primitives/Accordion/AccordionItemWrapper.test.svelte.d.ts.map +1 -0
  92. package/dist/primitives/Alert/Alert.spec.js +5 -2
  93. package/dist/primitives/Avatar/Avatar.spec.d.ts +2 -0
  94. package/dist/primitives/Avatar/Avatar.spec.d.ts.map +1 -0
  95. package/dist/primitives/Avatar/Avatar.spec.js +211 -0
  96. package/dist/primitives/Badges/Badge.spec.js +109 -68
  97. package/dist/primitives/BottomSheet/BottomSheet.spec.js +36 -27
  98. package/dist/primitives/BottomSheet/BottomSheetWrapper.test.svelte +13 -0
  99. package/dist/primitives/BottomSheet/BottomSheetWrapper.test.svelte.d.ts +7 -0
  100. package/dist/primitives/BottomSheet/BottomSheetWrapper.test.svelte.d.ts.map +1 -0
  101. package/dist/primitives/Breadcrumb/Breadcrumb.spec.js +15 -13
  102. package/dist/primitives/Breadcrumb/Breadcrumb.svelte +5 -5
  103. package/dist/primitives/Button/Button.spec.js +83 -71
  104. package/dist/primitives/Button/ButtonSaveDemo.spec.js +100 -2
  105. package/dist/primitives/Button/ButtonVariantShowcase.spec.d.ts +2 -0
  106. package/dist/primitives/Button/ButtonVariantShowcase.spec.d.ts.map +1 -0
  107. package/dist/primitives/Button/ButtonVariantShowcase.spec.js +202 -0
  108. package/dist/primitives/Card.spec.js +1 -1
  109. package/dist/primitives/Checkbox/Checkbox.spec.d.ts +2 -0
  110. package/dist/primitives/Checkbox/Checkbox.spec.d.ts.map +1 -0
  111. package/dist/primitives/Checkbox/Checkbox.spec.js +252 -0
  112. package/dist/primitives/DarkModeToggle.spec.js +84 -51
  113. package/dist/primitives/Drawer/Drawer.spec.d.ts +2 -0
  114. package/dist/primitives/Drawer/Drawer.spec.d.ts.map +1 -0
  115. package/dist/primitives/Drawer/Drawer.spec.js +212 -0
  116. package/dist/primitives/Dropdown/Dropdown.spec.d.ts +2 -0
  117. package/dist/primitives/Dropdown/Dropdown.spec.d.ts.map +1 -0
  118. package/dist/primitives/Dropdown/Dropdown.spec.js +366 -0
  119. package/dist/primitives/Dropdown/DropdownItem.spec.d.ts +2 -0
  120. package/dist/primitives/Dropdown/DropdownItem.spec.d.ts.map +1 -0
  121. package/dist/primitives/Dropdown/DropdownItem.spec.js +182 -0
  122. package/dist/primitives/Icons/iconTestUtils.spec.d.ts +2 -0
  123. package/dist/primitives/Icons/iconTestUtils.spec.d.ts.map +1 -0
  124. package/dist/primitives/Icons/iconTestUtils.spec.js +235 -0
  125. package/dist/primitives/Input/Input.spec.js +14 -14
  126. package/dist/primitives/Input/Input.svelte +1 -14
  127. package/dist/primitives/Input/Input.svelte.d.ts.map +1 -1
  128. package/dist/primitives/Input/Select.spec.js +11 -17
  129. package/dist/primitives/Input/Textarea.spec.d.ts +2 -0
  130. package/dist/primitives/Input/Textarea.spec.d.ts.map +1 -0
  131. package/dist/primitives/Input/Textarea.spec.js +255 -0
  132. package/dist/primitives/Label/Label.spec.d.ts +2 -0
  133. package/dist/primitives/Label/Label.spec.d.ts.map +1 -0
  134. package/dist/primitives/Label/Label.spec.js +157 -0
  135. package/dist/primitives/Modal/Modal.spec.js +29 -25
  136. package/dist/primitives/Modal/ModalTestWrapper.svelte +65 -0
  137. package/dist/primitives/Modal/ModalTestWrapper.svelte.d.ts +23 -0
  138. package/dist/primitives/Modal/ModalTestWrapper.svelte.d.ts.map +1 -0
  139. package/dist/primitives/NumberInput/NumberInput.spec.d.ts +2 -0
  140. package/dist/primitives/NumberInput/NumberInput.spec.d.ts.map +1 -0
  141. package/dist/primitives/NumberInput/NumberInput.spec.js +235 -0
  142. package/dist/primitives/Pagination/Pagination.spec.d.ts +2 -0
  143. package/dist/primitives/Pagination/Pagination.spec.d.ts.map +1 -0
  144. package/dist/primitives/Pagination/Pagination.spec.js +266 -0
  145. package/dist/primitives/Radio/Radio.spec.d.ts +2 -0
  146. package/dist/primitives/Radio/Radio.spec.d.ts.map +1 -0
  147. package/dist/primitives/Radio/Radio.spec.js +206 -0
  148. package/dist/primitives/Skeleton/CardPlaceholder.spec.d.ts +2 -0
  149. package/dist/primitives/Skeleton/CardPlaceholder.spec.d.ts.map +1 -0
  150. package/dist/primitives/Skeleton/CardPlaceholder.spec.js +156 -0
  151. package/dist/primitives/Skeleton/ImagePlaceholder.spec.d.ts +2 -0
  152. package/dist/primitives/Skeleton/ImagePlaceholder.spec.d.ts.map +1 -0
  153. package/dist/primitives/Skeleton/ImagePlaceholder.spec.js +120 -0
  154. package/dist/primitives/Skeleton/ListPlaceholder.spec.d.ts +2 -0
  155. package/dist/primitives/Skeleton/ListPlaceholder.spec.d.ts.map +1 -0
  156. package/dist/primitives/Skeleton/ListPlaceholder.spec.js +220 -0
  157. package/dist/primitives/Skeleton/Skeleton.spec.d.ts +2 -0
  158. package/dist/primitives/Skeleton/Skeleton.spec.d.ts.map +1 -0
  159. package/dist/primitives/Skeleton/Skeleton.spec.js +173 -0
  160. package/dist/primitives/Spinner/Spinner.spec.js +25 -29
  161. package/dist/primitives/Tabs/TabItem.spec.d.ts +2 -0
  162. package/dist/primitives/Tabs/TabItem.spec.d.ts.map +1 -0
  163. package/dist/primitives/Tabs/TabItem.spec.js +130 -0
  164. package/dist/primitives/Tabs/Tabs.spec.d.ts +2 -0
  165. package/dist/primitives/Tabs/Tabs.spec.d.ts.map +1 -0
  166. package/dist/primitives/Tabs/Tabs.spec.js +295 -0
  167. package/dist/primitives/Tabs/TabsWithItems.test.svelte +18 -0
  168. package/dist/primitives/Tabs/TabsWithItems.test.svelte.d.ts +16 -0
  169. package/dist/primitives/Tabs/TabsWithItems.test.svelte.d.ts.map +1 -0
  170. package/dist/primitives/Toggle.spec.js +93 -77
  171. package/dist/primitives/Typography/Typography.spec.d.ts +2 -0
  172. package/dist/primitives/Typography/Typography.spec.d.ts.map +1 -0
  173. package/dist/primitives/Typography/Typography.spec.js +183 -0
  174. package/dist/primitives/ValidationError.spec.js +1 -1
  175. package/dist/primitives/index.d.ts +1 -0
  176. package/dist/primitives/index.js +3 -0
  177. package/dist/recipes/CropImage/CropImage.spec.js +1 -9
  178. package/dist/recipes/ImageUploader/ImageUploader.spec.d.ts +2 -0
  179. package/dist/recipes/ImageUploader/ImageUploader.spec.d.ts.map +1 -0
  180. package/dist/recipes/ImageUploader/ImageUploader.spec.js +1351 -0
  181. package/dist/recipes/SuperLogin/SuperLogin.spec.d.ts +2 -0
  182. package/dist/recipes/SuperLogin/SuperLogin.spec.d.ts.map +1 -0
  183. package/dist/recipes/SuperLogin/SuperLogin.spec.js +1436 -0
  184. package/dist/recipes/feedback/EmptyState/EmptyState.spec.d.ts +2 -0
  185. package/dist/recipes/feedback/EmptyState/EmptyState.spec.d.ts.map +1 -0
  186. package/dist/recipes/feedback/EmptyState/EmptyState.spec.js +202 -0
  187. package/dist/recipes/feedback/ErrorDisplay.spec.js +6 -6
  188. package/dist/recipes/feedback/StatusIndicator/StatusIndicator.spec.js +21 -17
  189. package/dist/recipes/fields/CheckboxField.spec.d.ts +2 -0
  190. package/dist/recipes/fields/CheckboxField.spec.d.ts.map +1 -0
  191. package/dist/recipes/fields/CheckboxField.spec.js +135 -0
  192. package/dist/recipes/fields/FormField.spec.d.ts +2 -0
  193. package/dist/recipes/fields/FormField.spec.d.ts.map +1 -0
  194. package/dist/recipes/fields/FormField.spec.js +159 -0
  195. package/dist/recipes/fields/RadioGroup.spec.d.ts +2 -0
  196. package/dist/recipes/fields/RadioGroup.spec.d.ts.map +1 -0
  197. package/dist/recipes/fields/RadioGroup.spec.js +199 -0
  198. package/dist/recipes/fields/SelectField.spec.d.ts +2 -0
  199. package/dist/recipes/fields/SelectField.spec.d.ts.map +1 -0
  200. package/dist/recipes/fields/SelectField.spec.js +188 -0
  201. package/dist/recipes/fields/TextareaField.spec.d.ts +2 -0
  202. package/dist/recipes/fields/TextareaField.spec.d.ts.map +1 -0
  203. package/dist/recipes/fields/TextareaField.spec.js +205 -0
  204. package/dist/recipes/fields/ToggleField.spec.d.ts +2 -0
  205. package/dist/recipes/fields/ToggleField.spec.d.ts.map +1 -0
  206. package/dist/recipes/fields/ToggleField.spec.js +153 -0
  207. package/dist/recipes/inputs/MultiSelect.spec.js +4 -3
  208. package/dist/recipes/inputs/MultiSelect.svelte +10 -3
  209. package/dist/recipes/inputs/MultiSelect.svelte.d.ts +2 -0
  210. package/dist/recipes/inputs/MultiSelect.svelte.d.ts.map +1 -1
  211. package/dist/recipes/inputs/OTPInput.spec.js +52 -39
  212. package/dist/recipes/inputs/PasswordInput.spec.d.ts +2 -0
  213. package/dist/recipes/inputs/PasswordInput.spec.d.ts.map +1 -0
  214. package/dist/recipes/inputs/PasswordInput.spec.js +410 -0
  215. package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.spec.js +253 -173
  216. package/dist/recipes/inputs/PasswordStrengthIndicator/TestWrapper.svelte +71 -0
  217. package/dist/recipes/inputs/PasswordStrengthIndicator/TestWrapper.svelte.d.ts +9 -0
  218. package/dist/recipes/inputs/PasswordStrengthIndicator/TestWrapper.svelte.d.ts.map +1 -0
  219. package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.spec.js +1246 -300
  220. package/dist/recipes/inputs/Search.spec.d.ts +2 -0
  221. package/dist/recipes/inputs/Search.spec.d.ts.map +1 -0
  222. package/dist/recipes/inputs/Search.spec.js +177 -0
  223. package/dist/recipes/inputs/SelectDropdown.spec.d.ts +2 -0
  224. package/dist/recipes/inputs/SelectDropdown.spec.d.ts.map +1 -0
  225. package/dist/recipes/inputs/SelectDropdown.spec.js +512 -0
  226. package/dist/recipes/modals/AlertModal.spec.d.ts +2 -0
  227. package/dist/recipes/modals/AlertModal.spec.d.ts.map +1 -0
  228. package/dist/recipes/modals/AlertModal.spec.js +432 -0
  229. package/dist/recipes/modals/ConfirmationModal.spec.js +36 -21
  230. package/dist/recipes/modals/InputModal.spec.d.ts +2 -0
  231. package/dist/recipes/modals/InputModal.spec.d.ts.map +1 -0
  232. package/dist/recipes/modals/InputModal.spec.js +872 -0
  233. package/dist/recipes/modals/ModalTestWrapper.spec.d.ts +2 -0
  234. package/dist/recipes/modals/ModalTestWrapper.spec.d.ts.map +1 -0
  235. package/dist/recipes/modals/ModalTestWrapper.spec.js +502 -0
  236. package/dist/recipes/modals/StatusModal.spec.d.ts +2 -0
  237. package/dist/recipes/modals/StatusModal.spec.d.ts.map +1 -0
  238. package/dist/recipes/modals/StatusModal.spec.js +599 -0
  239. package/dist/services/ShowService.spec.js +18 -15
  240. package/dist/stories/ButtonAuditDashboard.spec.d.ts +2 -0
  241. package/dist/stories/ButtonAuditDashboard.spec.d.ts.map +1 -0
  242. package/dist/stories/ButtonAuditDashboard.spec.js +913 -0
  243. package/dist/stories/ButtonAuditReview.spec.d.ts +2 -0
  244. package/dist/stories/ButtonAuditReview.spec.d.ts.map +1 -0
  245. package/dist/stories/ButtonAuditReview.spec.js +422 -0
  246. package/dist/stories/ButtonGridView.spec.d.ts +2 -0
  247. package/dist/stories/ButtonGridView.spec.d.ts.map +1 -0
  248. package/dist/stories/ButtonGridView.spec.js +667 -0
  249. package/dist/stories/ButtonShowcase.spec.d.ts +2 -0
  250. package/dist/stories/ButtonShowcase.spec.d.ts.map +1 -0
  251. package/dist/stories/ButtonShowcase.spec.js +499 -0
  252. package/dist/stories/PatternsGallery.spec.d.ts +2 -0
  253. package/dist/stories/PatternsGallery.spec.d.ts.map +1 -0
  254. package/dist/stories/PatternsGallery.spec.js +514 -0
  255. package/dist/stories/PrimitivesGallery.spec.d.ts +2 -0
  256. package/dist/stories/PrimitivesGallery.spec.d.ts.map +1 -0
  257. package/dist/stories/PrimitivesGallery.spec.js +813 -0
  258. package/dist/stories/RecipesGallery.spec.d.ts +2 -0
  259. package/dist/stories/RecipesGallery.spec.d.ts.map +1 -0
  260. package/dist/stories/RecipesGallery.spec.js +299 -0
  261. package/dist/stripe/useStripeTheme.spec.d.ts +2 -0
  262. package/dist/stripe/useStripeTheme.spec.d.ts.map +1 -0
  263. package/dist/stripe/useStripeTheme.spec.js +793 -0
  264. package/dist/telemetry.d.ts.map +1 -1
  265. package/dist/telemetry.js +6 -5
  266. package/dist/telemetry.spec.js +495 -12
  267. package/dist/tokens/__tests__/colors.test.d.ts +2 -0
  268. package/dist/tokens/__tests__/colors.test.d.ts.map +1 -0
  269. package/dist/tokens/__tests__/colors.test.js +152 -0
  270. package/dist/tokens/__tests__/radius.test.d.ts +2 -0
  271. package/dist/tokens/__tests__/radius.test.d.ts.map +1 -0
  272. package/dist/tokens/__tests__/radius.test.js +118 -0
  273. package/dist/tokens/__tests__/shadows.test.d.ts +2 -0
  274. package/dist/tokens/__tests__/shadows.test.d.ts.map +1 -0
  275. package/dist/tokens/__tests__/shadows.test.js +105 -0
  276. package/dist/tokens/__tests__/spacing.test.js +11 -8
  277. package/dist/tokens/__tests__/typography.test.d.ts +2 -0
  278. package/dist/tokens/__tests__/typography.test.d.ts.map +1 -0
  279. package/dist/tokens/__tests__/typography.test.js +156 -0
  280. package/dist/tokens/__tests__/z-index.test.d.ts +2 -0
  281. package/dist/tokens/__tests__/z-index.test.d.ts.map +1 -0
  282. package/dist/tokens/__tests__/z-index.test.js +121 -0
  283. package/dist/utils/apiConfig.spec.js +102 -1
  284. package/dist/utils/formatters.spec.d.ts +2 -0
  285. package/dist/utils/formatters.spec.d.ts.map +1 -0
  286. package/dist/utils/formatters.spec.js +82 -0
  287. package/dist/utils/transitions.spec.d.ts +2 -0
  288. package/dist/utils/transitions.spec.d.ts.map +1 -0
  289. package/dist/utils/transitions.spec.js +130 -0
  290. package/package.json +8 -3
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=FAQs.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FAQs.spec.d.ts","sourceRoot":"","sources":["../../../src/lib/calendar/FAQs/FAQs.spec.js"],"names":[],"mappings":""}
@@ -0,0 +1,238 @@
1
+ import { describe, it, expect, vi, afterEach } from 'vitest';
2
+ import { render, screen, cleanup, fireEvent } from '@testing-library/svelte';
3
+ import FAQs from './FAQs.svelte';
4
+
5
+ describe('FAQs Component', () => {
6
+ afterEach(() => {
7
+ cleanup();
8
+ });
9
+
10
+ describe('basic rendering', () => {
11
+ it('renders empty state when no faqs provided', () => {
12
+ render(FAQs);
13
+ expect(screen.getByText('No FAQs available.')).toBeInTheDocument();
14
+ });
15
+
16
+ it('renders title by default', () => {
17
+ render(FAQs, { props: { faqs: [] } });
18
+ expect(screen.getByRole('heading', { name: 'FAQs' })).toBeInTheDocument();
19
+ });
20
+
21
+ it('renders custom title', () => {
22
+ render(FAQs, { props: { title: 'Questions', faqs: [] } });
23
+ expect(screen.getByRole('heading', { name: 'Questions' })).toBeInTheDocument();
24
+ });
25
+
26
+ it('hides title when showTitle is false', () => {
27
+ render(FAQs, { props: { showTitle: false, faqs: [] } });
28
+ expect(screen.queryByRole('heading')).not.toBeInTheDocument();
29
+ });
30
+ });
31
+
32
+ describe('simple list mode', () => {
33
+ const faqs = [
34
+ { question: 'What is this?', answer: 'This is a FAQ component.' },
35
+ { question: 'How does it work?', answer: 'It displays questions and answers.' },
36
+ ];
37
+
38
+ it('renders questions', () => {
39
+ render(FAQs, { props: { faqs } });
40
+ expect(screen.getByText('What is this?')).toBeInTheDocument();
41
+ expect(screen.getByText('How does it work?')).toBeInTheDocument();
42
+ });
43
+
44
+ it('renders answers', () => {
45
+ render(FAQs, { props: { faqs } });
46
+ expect(screen.getByText('This is a FAQ component.')).toBeInTheDocument();
47
+ expect(screen.getByText('It displays questions and answers.')).toBeInTheDocument();
48
+ });
49
+
50
+ it('handles string-only faqs', () => {
51
+ render(FAQs, { props: { faqs: ['Just an answer', 'Another answer'] } });
52
+ expect(screen.getByText('Just an answer')).toBeInTheDocument();
53
+ expect(screen.getByText('Another answer')).toBeInTheDocument();
54
+ });
55
+
56
+ it('renders faq without question', () => {
57
+ render(FAQs, { props: { faqs: [{ question: '', answer: 'Just the answer' }] } });
58
+ expect(screen.getByText('Just the answer')).toBeInTheDocument();
59
+ });
60
+ });
61
+
62
+ describe('accordion mode', () => {
63
+ const faqs = [
64
+ { question: 'First question?', answer: 'First answer.' },
65
+ { question: 'Second question?', answer: 'Second answer.' },
66
+ ];
67
+
68
+ it('renders accordion buttons', () => {
69
+ render(FAQs, { props: { faqs, accordion: true } });
70
+ expect(screen.getByRole('button', { name: /First question/ })).toBeInTheDocument();
71
+ expect(screen.getByRole('button', { name: /Second question/ })).toBeInTheDocument();
72
+ });
73
+
74
+ it('starts with all items collapsed', () => {
75
+ render(FAQs, { props: { faqs, accordion: true } });
76
+ const buttons = screen.getAllByRole('button');
77
+ buttons.forEach(button => {
78
+ expect(button).toHaveAttribute('aria-expanded', 'false');
79
+ });
80
+ });
81
+
82
+ it('expands item when clicked', async () => {
83
+ render(FAQs, { props: { faqs, accordion: true } });
84
+ const button = screen.getByRole('button', { name: /First question/ });
85
+
86
+ await fireEvent.click(button);
87
+
88
+ expect(button).toHaveAttribute('aria-expanded', 'true');
89
+ });
90
+
91
+ it('collapses item when clicked again', async () => {
92
+ render(FAQs, { props: { faqs, accordion: true } });
93
+ const button = screen.getByRole('button', { name: /First question/ });
94
+
95
+ await fireEvent.click(button);
96
+ expect(button).toHaveAttribute('aria-expanded', 'true');
97
+
98
+ await fireEvent.click(button);
99
+ expect(button).toHaveAttribute('aria-expanded', 'false');
100
+ });
101
+
102
+ it('closes other items when new one is opened', async () => {
103
+ render(FAQs, { props: { faqs, accordion: true } });
104
+ const firstButton = screen.getByRole('button', { name: /First question/ });
105
+ const secondButton = screen.getByRole('button', { name: /Second question/ });
106
+
107
+ await fireEvent.click(firstButton);
108
+ expect(firstButton).toHaveAttribute('aria-expanded', 'true');
109
+
110
+ await fireEvent.click(secondButton);
111
+ expect(firstButton).toHaveAttribute('aria-expanded', 'false');
112
+ expect(secondButton).toHaveAttribute('aria-expanded', 'true');
113
+ });
114
+
115
+ it('shows answer content when expanded', async () => {
116
+ render(FAQs, { props: { faqs, accordion: true } });
117
+ const button = screen.getByRole('button', { name: /First question/ });
118
+
119
+ // Content is hidden initially
120
+ const answerDiv = screen.getByText('First answer.').closest('[id^="accordion-body"]');
121
+ expect(answerDiv).toHaveClass('hidden');
122
+
123
+ await fireEvent.click(button);
124
+
125
+ // Content is visible after click
126
+ expect(answerDiv).not.toHaveClass('hidden');
127
+ });
128
+
129
+ it('uses fallback text for items without question', () => {
130
+ render(FAQs, {
131
+ props: {
132
+ faqs: [{ question: '', answer: 'Answer only' }],
133
+ accordion: true
134
+ }
135
+ });
136
+ expect(screen.getByRole('button', { name: /Item 1/ })).toBeInTheDocument();
137
+ });
138
+ });
139
+
140
+ describe('accessibility', () => {
141
+ const faqs = [
142
+ { question: 'Question 1?', answer: 'Answer 1.' },
143
+ { question: 'Question 2?', answer: 'Answer 2.' },
144
+ ];
145
+
146
+ it('buttons have aria-controls', () => {
147
+ render(FAQs, { props: { faqs, accordion: true } });
148
+ const buttons = screen.getAllByRole('button');
149
+ buttons.forEach((button, index) => {
150
+ expect(button).toHaveAttribute('aria-controls', `accordion-body-${index}`);
151
+ });
152
+ });
153
+
154
+ it('content has aria-labelledby', () => {
155
+ const { container } = render(FAQs, { props: { faqs, accordion: true } });
156
+ const contents = container.querySelectorAll('[id^="accordion-body-"]');
157
+ contents.forEach((content, index) => {
158
+ expect(content).toHaveAttribute('aria-labelledby', `accordion-heading-${index}`);
159
+ });
160
+ });
161
+ });
162
+
163
+ describe('styling', () => {
164
+ const faqs = [
165
+ { question: 'Q1?', answer: 'A1.' },
166
+ { question: 'Q2?', answer: 'A2.' },
167
+ { question: 'Q3?', answer: 'A3.' },
168
+ ];
169
+
170
+ it('applies rounded-t-lg to first accordion item', () => {
171
+ render(FAQs, { props: { faqs, accordion: true } });
172
+ const buttons = screen.getAllByRole('button');
173
+ expect(buttons[0].className).toContain('rounded-t-lg');
174
+ });
175
+
176
+ it('applies rounded-b-lg to last accordion item when collapsed', () => {
177
+ render(FAQs, { props: { faqs, accordion: true } });
178
+ const buttons = screen.getAllByRole('button');
179
+ expect(buttons[buttons.length - 1].className).toContain('rounded-b-lg');
180
+ });
181
+
182
+ it('applies active styling when expanded', async () => {
183
+ render(FAQs, { props: { faqs, accordion: true } });
184
+ const button = screen.getByRole('button', { name: /Q1/ });
185
+
186
+ await fireEvent.click(button);
187
+
188
+ expect(button.className).toContain('text-gray-900');
189
+ expect(button.className).toContain('bg-gray-100');
190
+ });
191
+
192
+ it('chevron rotates when expanded', async () => {
193
+ const { container } = render(FAQs, { props: { faqs, accordion: true } });
194
+ const button = screen.getByRole('button', { name: /Q1/ });
195
+ const chevron = button.querySelector('svg');
196
+
197
+ expect(chevron.className.baseVal).not.toContain('rotate-180');
198
+
199
+ await fireEvent.click(button);
200
+
201
+ expect(chevron.className.baseVal).toContain('rotate-180');
202
+ });
203
+
204
+ it('accordion container has border', () => {
205
+ const { container } = render(FAQs, { props: { faqs, accordion: true } });
206
+ const accordionDiv = container.querySelector('.border.border-gray-200');
207
+ expect(accordionDiv).toBeInTheDocument();
208
+ });
209
+
210
+ it('simple list has space-y-4 gap', () => {
211
+ const { container } = render(FAQs, { props: { faqs, accordion: false } });
212
+ const listDiv = container.querySelector('.space-y-4');
213
+ expect(listDiv).toBeInTheDocument();
214
+ });
215
+ });
216
+
217
+ describe('dark mode', () => {
218
+ const faqs = [{ question: 'Q?', answer: 'A.' }];
219
+
220
+ it('accordion has dark mode border', () => {
221
+ const { container } = render(FAQs, { props: { faqs, accordion: true } });
222
+ const accordionDiv = container.querySelector('.border');
223
+ expect(accordionDiv.className).toContain('dark:border-gray-700');
224
+ });
225
+
226
+ it('accordion buttons have dark mode hover', () => {
227
+ render(FAQs, { props: { faqs, accordion: true } });
228
+ const button = screen.getByRole('button');
229
+ expect(button.className).toContain('dark:hover:bg-gray-800');
230
+ });
231
+
232
+ it('accordion buttons have dark mode focus ring', () => {
233
+ render(FAQs, { props: { faqs, accordion: true } });
234
+ const button = screen.getByRole('button');
235
+ expect(button.className).toContain('dark:focus:ring-gray-800');
236
+ });
237
+ });
238
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=MonthSwitcher.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MonthSwitcher.spec.d.ts","sourceRoot":"","sources":["../../../src/lib/calendar/MonthSwitcher/MonthSwitcher.spec.js"],"names":[],"mappings":""}
@@ -0,0 +1,420 @@
1
+ import { render, screen, fireEvent } from '@testing-library/svelte';
2
+ import { expect, describe, test, vi, beforeEach } from 'vitest';
3
+ import MonthSwitcher from './MonthSwitcher.svelte';
4
+
5
+ describe('MonthSwitcher Component', () => {
6
+ test('renders a header element', () => {
7
+ const { container } = render(MonthSwitcher);
8
+ expect(container.querySelector('header')).toBeInTheDocument();
9
+ });
10
+
11
+ test('renders the month name', () => {
12
+ const { container } = render(MonthSwitcher, {
13
+ props: { currentMonth: 0, currentYear: 2024 }
14
+ });
15
+ expect(screen.getByText('January')).toBeInTheDocument();
16
+ });
17
+
18
+ test('renders three navigation buttons', () => {
19
+ const { container } = render(MonthSwitcher);
20
+ const buttons = container.querySelectorAll('button');
21
+ expect(buttons.length).toBe(3);
22
+ });
23
+
24
+ test('has Today button', () => {
25
+ render(MonthSwitcher);
26
+ expect(screen.getByText('Today')).toBeInTheDocument();
27
+ });
28
+ });
29
+
30
+ describe('MonthSwitcher Accessibility', () => {
31
+ test('prev button has aria-label', () => {
32
+ const { container } = render(MonthSwitcher);
33
+ const prevButton = container.querySelector('[aria-label="Previous month"]');
34
+ expect(prevButton).toBeInTheDocument();
35
+ });
36
+
37
+ test('next button has aria-label', () => {
38
+ const { container } = render(MonthSwitcher);
39
+ const nextButton = container.querySelector('[aria-label="Next month"]');
40
+ expect(nextButton).toBeInTheDocument();
41
+ });
42
+
43
+ test('today button has aria-label', () => {
44
+ const { container } = render(MonthSwitcher);
45
+ const todayButton = container.querySelector('[aria-label="Go to current month"]');
46
+ expect(todayButton).toBeInTheDocument();
47
+ });
48
+ });
49
+
50
+ describe('MonthSwitcher Month Display', () => {
51
+ test('displays February correctly', () => {
52
+ render(MonthSwitcher, {
53
+ props: { currentMonth: 1, currentYear: 2024 }
54
+ });
55
+ expect(screen.getByText('February')).toBeInTheDocument();
56
+ });
57
+
58
+ test('displays December correctly', () => {
59
+ render(MonthSwitcher, {
60
+ props: { currentMonth: 11, currentYear: 2024 }
61
+ });
62
+ expect(screen.getByText('December')).toBeInTheDocument();
63
+ });
64
+
65
+ test('displays June correctly', () => {
66
+ render(MonthSwitcher, {
67
+ props: { currentMonth: 5, currentYear: 2024 }
68
+ });
69
+ expect(screen.getByText('June')).toBeInTheDocument();
70
+ });
71
+ });
72
+
73
+ describe('MonthSwitcher Navigation Callbacks', () => {
74
+ test('calls handleNext when next button clicked', async () => {
75
+ const handleNext = vi.fn();
76
+ const { container } = render(MonthSwitcher, {
77
+ props: { handleNext }
78
+ });
79
+ const nextButton = container.querySelector('[aria-label="Next month"]');
80
+ await fireEvent.click(nextButton);
81
+ expect(handleNext).toHaveBeenCalled();
82
+ });
83
+
84
+ test('calls handlePrev when prev button clicked', async () => {
85
+ const handlePrev = vi.fn();
86
+ const { container } = render(MonthSwitcher, {
87
+ props: {
88
+ handlePrev,
89
+ disablePastNavigation: false
90
+ }
91
+ });
92
+ const prevButton = container.querySelector('[aria-label="Previous month"]');
93
+ await fireEvent.click(prevButton);
94
+ expect(handlePrev).toHaveBeenCalled();
95
+ });
96
+
97
+ test('calls handleToday when today button clicked', async () => {
98
+ const handleToday = vi.fn();
99
+ const { container } = render(MonthSwitcher, {
100
+ props: {
101
+ handleToday,
102
+ currentMonth: 0,
103
+ currentYear: 2020
104
+ }
105
+ });
106
+ const todayButton = container.querySelector('[aria-label="Go to current month"]');
107
+ await fireEvent.click(todayButton);
108
+ expect(handleToday).toHaveBeenCalled();
109
+ });
110
+ });
111
+
112
+ describe('MonthSwitcher Disable Past Navigation', () => {
113
+ test('prev button disabled at current month by default', () => {
114
+ const today = new Date();
115
+ const { container } = render(MonthSwitcher, {
116
+ props: {
117
+ currentMonth: today.getMonth(),
118
+ currentYear: today.getFullYear(),
119
+ disablePastNavigation: true
120
+ }
121
+ });
122
+ const prevButton = container.querySelector('[aria-label="Previous month"]');
123
+ expect(prevButton).toBeDisabled();
124
+ });
125
+
126
+ test('prev button enabled when not at current month', () => {
127
+ const today = new Date();
128
+ const futureMonth = (today.getMonth() + 3) % 12;
129
+ const futureYear = today.getMonth() + 3 > 11 ? today.getFullYear() + 1 : today.getFullYear();
130
+ const { container } = render(MonthSwitcher, {
131
+ props: {
132
+ currentMonth: futureMonth,
133
+ currentYear: futureYear,
134
+ disablePastNavigation: true
135
+ }
136
+ });
137
+ const prevButton = container.querySelector('[aria-label="Previous month"]');
138
+ expect(prevButton).not.toBeDisabled();
139
+ });
140
+
141
+ test('prev button enabled when disablePastNavigation is false', () => {
142
+ const today = new Date();
143
+ const { container } = render(MonthSwitcher, {
144
+ props: {
145
+ currentMonth: today.getMonth(),
146
+ currentYear: today.getFullYear(),
147
+ disablePastNavigation: false
148
+ }
149
+ });
150
+ const prevButton = container.querySelector('[aria-label="Previous month"]');
151
+ expect(prevButton).not.toBeDisabled();
152
+ });
153
+
154
+ test('does not call handlePrev when disabled', async () => {
155
+ const handlePrev = vi.fn();
156
+ const today = new Date();
157
+ const { container } = render(MonthSwitcher, {
158
+ props: {
159
+ handlePrev,
160
+ currentMonth: today.getMonth(),
161
+ currentYear: today.getFullYear(),
162
+ disablePastNavigation: true
163
+ }
164
+ });
165
+ const prevButton = container.querySelector('[aria-label="Previous month"]');
166
+ await fireEvent.click(prevButton);
167
+ expect(handlePrev).not.toHaveBeenCalled();
168
+ });
169
+ });
170
+
171
+ describe('MonthSwitcher Today Button State', () => {
172
+ test('today button disabled at current month', () => {
173
+ const today = new Date();
174
+ const { container } = render(MonthSwitcher, {
175
+ props: {
176
+ currentMonth: today.getMonth(),
177
+ currentYear: today.getFullYear()
178
+ }
179
+ });
180
+ const todayButton = container.querySelector('[aria-label="Go to current month"]');
181
+ expect(todayButton).toBeDisabled();
182
+ });
183
+
184
+ test('today button enabled when not at current month', () => {
185
+ const { container } = render(MonthSwitcher, {
186
+ props: {
187
+ currentMonth: 0,
188
+ currentYear: 2020
189
+ }
190
+ });
191
+ const todayButton = container.querySelector('[aria-label="Go to current month"]');
192
+ expect(todayButton).not.toBeDisabled();
193
+ });
194
+ });
195
+
196
+ describe('MonthSwitcher Styling', () => {
197
+ test('header has flex layout', () => {
198
+ const { container } = render(MonthSwitcher);
199
+ const header = container.querySelector('header');
200
+ expect(header).toHaveClass('flex');
201
+ expect(header).toHaveClass('items-center');
202
+ expect(header).toHaveClass('justify-between');
203
+ });
204
+
205
+ test('navigation buttons container has flex and gap', () => {
206
+ const { container } = render(MonthSwitcher);
207
+ const buttonContainer = container.querySelector('.flex.items-center.gap-2');
208
+ expect(buttonContainer).toBeInTheDocument();
209
+ });
210
+ });
211
+
212
+ describe('MonthSwitcher Mouse Events', () => {
213
+ test('prev button responds to mousedown', async () => {
214
+ const { container } = render(MonthSwitcher, {
215
+ props: { disablePastNavigation: false }
216
+ });
217
+ const prevButton = container.querySelector('[aria-label="Previous month"]');
218
+ await fireEvent.mouseDown(prevButton);
219
+ // Button should have scale-90 class when pressed
220
+ expect(prevButton.className).toContain('scale-90');
221
+ });
222
+
223
+ test('prev button responds to mouseup', async () => {
224
+ const { container } = render(MonthSwitcher, {
225
+ props: { disablePastNavigation: false }
226
+ });
227
+ const prevButton = container.querySelector('[aria-label="Previous month"]');
228
+ await fireEvent.mouseDown(prevButton);
229
+ await fireEvent.mouseUp(prevButton);
230
+ // Button should not have scale-90 class after mouseup
231
+ expect(prevButton.className).not.toContain('scale-90');
232
+ });
233
+
234
+ test('prev button responds to mouseleave', async () => {
235
+ const { container } = render(MonthSwitcher, {
236
+ props: { disablePastNavigation: false }
237
+ });
238
+ const prevButton = container.querySelector('[aria-label="Previous month"]');
239
+ await fireEvent.mouseDown(prevButton);
240
+ await fireEvent.mouseLeave(prevButton);
241
+ expect(prevButton.className).not.toContain('scale-90');
242
+ });
243
+
244
+ test('next button responds to mousedown', async () => {
245
+ const { container } = render(MonthSwitcher);
246
+ const nextButton = container.querySelector('[aria-label="Next month"]');
247
+ await fireEvent.mouseDown(nextButton);
248
+ expect(nextButton.className).toContain('scale-90');
249
+ });
250
+
251
+ test('next button responds to mouseup', async () => {
252
+ const { container } = render(MonthSwitcher);
253
+ const nextButton = container.querySelector('[aria-label="Next month"]');
254
+ await fireEvent.mouseDown(nextButton);
255
+ await fireEvent.mouseUp(nextButton);
256
+ expect(nextButton.className).not.toContain('scale-90');
257
+ });
258
+
259
+ test('next button responds to mouseleave', async () => {
260
+ const { container } = render(MonthSwitcher);
261
+ const nextButton = container.querySelector('[aria-label="Next month"]');
262
+ await fireEvent.mouseDown(nextButton);
263
+ await fireEvent.mouseLeave(nextButton);
264
+ expect(nextButton.className).not.toContain('scale-90');
265
+ });
266
+
267
+ test('today button responds to mousedown', async () => {
268
+ const { container } = render(MonthSwitcher, {
269
+ props: { currentMonth: 0, currentYear: 2020 }
270
+ });
271
+ const todayButton = container.querySelector('[aria-label="Go to current month"]');
272
+ await fireEvent.mouseDown(todayButton);
273
+ expect(todayButton.className).toContain('scale-95');
274
+ });
275
+
276
+ test('today button responds to mouseup', async () => {
277
+ const { container } = render(MonthSwitcher, {
278
+ props: { currentMonth: 0, currentYear: 2020 }
279
+ });
280
+ const todayButton = container.querySelector('[aria-label="Go to current month"]');
281
+ await fireEvent.mouseDown(todayButton);
282
+ await fireEvent.mouseUp(todayButton);
283
+ expect(todayButton.className).not.toContain('scale-95');
284
+ });
285
+
286
+ test('today button responds to mouseleave', async () => {
287
+ const { container } = render(MonthSwitcher, {
288
+ props: { currentMonth: 0, currentYear: 2020 }
289
+ });
290
+ const todayButton = container.querySelector('[aria-label="Go to current month"]');
291
+ await fireEvent.mouseDown(todayButton);
292
+ await fireEvent.mouseLeave(todayButton);
293
+ expect(todayButton.className).not.toContain('scale-95');
294
+ });
295
+ });
296
+
297
+ describe('MonthSwitcher Touch Events', () => {
298
+ test('prev button responds to touchstart', async () => {
299
+ const { container } = render(MonthSwitcher, {
300
+ props: { disablePastNavigation: false }
301
+ });
302
+ const prevButton = container.querySelector('[aria-label="Previous month"]');
303
+ await fireEvent.touchStart(prevButton);
304
+ expect(prevButton.className).toContain('scale-90');
305
+ });
306
+
307
+ test('prev button responds to touchend', async () => {
308
+ const { container } = render(MonthSwitcher, {
309
+ props: { disablePastNavigation: false }
310
+ });
311
+ const prevButton = container.querySelector('[aria-label="Previous month"]');
312
+ await fireEvent.touchStart(prevButton);
313
+ await fireEvent.touchEnd(prevButton);
314
+ expect(prevButton.className).not.toContain('scale-90');
315
+ });
316
+
317
+ test('prev button responds to touchcancel', async () => {
318
+ const { container } = render(MonthSwitcher, {
319
+ props: { disablePastNavigation: false }
320
+ });
321
+ const prevButton = container.querySelector('[aria-label="Previous month"]');
322
+ await fireEvent.touchStart(prevButton);
323
+ await fireEvent.touchCancel(prevButton);
324
+ expect(prevButton.className).not.toContain('scale-90');
325
+ });
326
+
327
+ test('next button responds to touchstart', async () => {
328
+ const { container } = render(MonthSwitcher);
329
+ const nextButton = container.querySelector('[aria-label="Next month"]');
330
+ await fireEvent.touchStart(nextButton);
331
+ expect(nextButton.className).toContain('scale-90');
332
+ });
333
+
334
+ test('next button responds to touchend', async () => {
335
+ const { container } = render(MonthSwitcher);
336
+ const nextButton = container.querySelector('[aria-label="Next month"]');
337
+ await fireEvent.touchStart(nextButton);
338
+ await fireEvent.touchEnd(nextButton);
339
+ expect(nextButton.className).not.toContain('scale-90');
340
+ });
341
+
342
+ test('next button responds to touchcancel', async () => {
343
+ const { container } = render(MonthSwitcher);
344
+ const nextButton = container.querySelector('[aria-label="Next month"]');
345
+ await fireEvent.touchStart(nextButton);
346
+ await fireEvent.touchCancel(nextButton);
347
+ expect(nextButton.className).not.toContain('scale-90');
348
+ });
349
+
350
+ test('today button responds to touchstart', async () => {
351
+ const { container } = render(MonthSwitcher, {
352
+ props: { currentMonth: 0, currentYear: 2020 }
353
+ });
354
+ const todayButton = container.querySelector('[aria-label="Go to current month"]');
355
+ await fireEvent.touchStart(todayButton);
356
+ expect(todayButton.className).toContain('scale-95');
357
+ });
358
+
359
+ test('today button responds to touchend', async () => {
360
+ const { container } = render(MonthSwitcher, {
361
+ props: { currentMonth: 0, currentYear: 2020 }
362
+ });
363
+ const todayButton = container.querySelector('[aria-label="Go to current month"]');
364
+ await fireEvent.touchStart(todayButton);
365
+ await fireEvent.touchEnd(todayButton);
366
+ expect(todayButton.className).not.toContain('scale-95');
367
+ });
368
+
369
+ test('today button responds to touchcancel', async () => {
370
+ const { container } = render(MonthSwitcher, {
371
+ props: { currentMonth: 0, currentYear: 2020 }
372
+ });
373
+ const todayButton = container.querySelector('[aria-label="Go to current month"]');
374
+ await fireEvent.touchStart(todayButton);
375
+ await fireEvent.touchCancel(todayButton);
376
+ expect(todayButton.className).not.toContain('scale-95');
377
+ });
378
+ });
379
+
380
+ describe('MonthSwitcher Haptic Feedback', () => {
381
+ beforeEach(() => {
382
+ // Clean up window mocks
383
+ delete window.webkit;
384
+ delete window.TapticEngine;
385
+ if (navigator.vibrate) {
386
+ vi.spyOn(navigator, 'vibrate').mockImplementation(() => true);
387
+ }
388
+ });
389
+
390
+ test('triggers webkit haptic when available', async () => {
391
+ const postMessage = vi.fn();
392
+ window.webkit = {
393
+ messageHandlers: {
394
+ haptic: { postMessage }
395
+ }
396
+ };
397
+ const { container } = render(MonthSwitcher);
398
+ const nextButton = container.querySelector('[aria-label="Next month"]');
399
+ await fireEvent.click(nextButton);
400
+ expect(postMessage).toHaveBeenCalledWith('light');
401
+ });
402
+
403
+ test('triggers TapticEngine when available', async () => {
404
+ const impact = vi.fn();
405
+ window.TapticEngine = { impact };
406
+ const { container } = render(MonthSwitcher);
407
+ const nextButton = container.querySelector('[aria-label="Next month"]');
408
+ await fireEvent.click(nextButton);
409
+ expect(impact).toHaveBeenCalledWith({ style: 'light' });
410
+ });
411
+
412
+ test('triggers navigator.vibrate as fallback', async () => {
413
+ // Add vibrate to navigator if it doesn't exist
414
+ navigator.vibrate = vi.fn().mockReturnValue(true);
415
+ const { container } = render(MonthSwitcher);
416
+ const nextButton = container.querySelector('[aria-label="Next month"]');
417
+ await fireEvent.click(nextButton);
418
+ expect(navigator.vibrate).toHaveBeenCalledWith(10);
419
+ });
420
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=OrderSummary.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrderSummary.spec.d.ts","sourceRoot":"","sources":["../../../src/lib/calendar/OrderSummary/OrderSummary.spec.js"],"names":[],"mappings":""}