@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=EmptyState.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyState.spec.d.ts","sourceRoot":"","sources":["../../../../src/lib/recipes/feedback/EmptyState/EmptyState.spec.js"],"names":[],"mappings":""}
@@ -0,0 +1,202 @@
1
+ import { render, screen } from '@testing-library/svelte';
2
+ import { expect, describe, test } from 'vitest';
3
+ import EmptyState from './EmptyState.svelte';
4
+
5
+ describe('EmptyState Component', () => {
6
+ test('renders a wrapper div', () => {
7
+ const { container } = render(EmptyState);
8
+ expect(container.querySelector('div')).toBeInTheDocument();
9
+ });
10
+
11
+ test('has flex centering classes', () => {
12
+ const { container } = render(EmptyState);
13
+ const wrapper = container.querySelector('div');
14
+ expect(wrapper).toHaveClass('flex');
15
+ expect(wrapper).toHaveClass('flex-col');
16
+ expect(wrapper).toHaveClass('items-center');
17
+ expect(wrapper).toHaveClass('justify-center');
18
+ });
19
+
20
+ test('has text-center class', () => {
21
+ const { container } = render(EmptyState);
22
+ const wrapper = container.querySelector('div');
23
+ expect(wrapper).toHaveClass('text-center');
24
+ });
25
+
26
+ test('has padding classes', () => {
27
+ const { container } = render(EmptyState);
28
+ const wrapper = container.querySelector('div');
29
+ expect(wrapper).toHaveClass('px-6');
30
+ expect(wrapper).toHaveClass('py-10');
31
+ });
32
+
33
+ test('applies custom className', () => {
34
+ const { container } = render(EmptyState, { props: { class: 'custom-empty' } });
35
+ const wrapper = container.querySelector('div');
36
+ expect(wrapper).toHaveClass('custom-empty');
37
+ });
38
+ });
39
+
40
+ describe('EmptyState Title/Message', () => {
41
+ test('shows default "No results found" when no title', () => {
42
+ render(EmptyState);
43
+ expect(screen.getByText('No results found')).toBeInTheDocument();
44
+ });
45
+
46
+ test('title prop displays custom title', () => {
47
+ render(EmptyState, { props: { title: 'No items' } });
48
+ expect(screen.getByText('No items')).toBeInTheDocument();
49
+ });
50
+
51
+ test('message prop displays custom message', () => {
52
+ render(EmptyState, { props: { message: 'Nothing here' } });
53
+ expect(screen.getByText('Nothing here')).toBeInTheDocument();
54
+ });
55
+
56
+ test('title takes precedence over message', () => {
57
+ render(EmptyState, { props: { title: 'Title', message: 'Message' } });
58
+ expect(screen.getByText('Title')).toBeInTheDocument();
59
+ expect(screen.queryByText('Message')).not.toBeInTheDocument();
60
+ });
61
+
62
+ test('title is in h3 element', () => {
63
+ const { container } = render(EmptyState, { props: { title: 'Test Title' } });
64
+ const h3 = container.querySelector('h3');
65
+ expect(h3).toBeInTheDocument();
66
+ expect(h3).toHaveTextContent('Test Title');
67
+ });
68
+ });
69
+
70
+ describe('EmptyState Description/Subtext', () => {
71
+ test('no subtext by default', () => {
72
+ const { container } = render(EmptyState);
73
+ expect(container.querySelector('p')).not.toBeInTheDocument();
74
+ });
75
+
76
+ test('description prop displays text', () => {
77
+ render(EmptyState, { props: { description: 'Try different filters' } });
78
+ expect(screen.getByText('Try different filters')).toBeInTheDocument();
79
+ });
80
+
81
+ test('subtext prop displays text', () => {
82
+ render(EmptyState, { props: { subtext: 'Check back later' } });
83
+ expect(screen.getByText('Check back later')).toBeInTheDocument();
84
+ });
85
+
86
+ test('description takes precedence over subtext', () => {
87
+ render(EmptyState, { props: { description: 'Description', subtext: 'Subtext' } });
88
+ expect(screen.getByText('Description')).toBeInTheDocument();
89
+ expect(screen.queryByText('Subtext')).not.toBeInTheDocument();
90
+ });
91
+
92
+ test('subtext is in p element', () => {
93
+ const { container } = render(EmptyState, { props: { subtext: 'Subtext here' } });
94
+ const p = container.querySelector('p');
95
+ expect(p).toBeInTheDocument();
96
+ expect(p).toHaveTextContent('Subtext here');
97
+ });
98
+
99
+ test('p element has mt-1 margin', () => {
100
+ const { container } = render(EmptyState, { props: { description: 'Desc' } });
101
+ const p = container.querySelector('p');
102
+ expect(p).toHaveClass('mt-1');
103
+ });
104
+ });
105
+
106
+ describe('EmptyState Icon/Image', () => {
107
+ test('no icon section when no icon or image', () => {
108
+ const { container } = render(EmptyState);
109
+ expect(container.querySelector('img')).not.toBeInTheDocument();
110
+ });
111
+
112
+ test('imageSrc renders img element', () => {
113
+ const { container } = render(EmptyState, {
114
+ props: { imageSrc: '/empty.png', iconType: 'image' }
115
+ });
116
+ const img = container.querySelector('img');
117
+ expect(img).toBeInTheDocument();
118
+ expect(img).toHaveAttribute('src', '/empty.png');
119
+ });
120
+
121
+ test('img has empty alt for decorative', () => {
122
+ const { container } = render(EmptyState, {
123
+ props: { imageSrc: '/empty.png', iconType: 'image' }
124
+ });
125
+ const img = container.querySelector('img');
126
+ expect(img).toHaveAttribute('alt', '');
127
+ });
128
+
129
+ test('img has mb-3 margin', () => {
130
+ const { container } = render(EmptyState, {
131
+ props: { imageSrc: '/empty.png', iconType: 'image' }
132
+ });
133
+ const img = container.querySelector('img');
134
+ expect(img).toHaveClass('mb-3');
135
+ });
136
+
137
+ test('iconSize prop sets size classes on image', () => {
138
+ const { container } = render(EmptyState, {
139
+ props: { imageSrc: '/empty.png', iconType: 'image', iconSize: 'w-32 h-32' }
140
+ });
141
+ const img = container.querySelector('img');
142
+ expect(img).toHaveClass('w-32');
143
+ expect(img).toHaveClass('h-32');
144
+ });
145
+
146
+ test('default iconSize is w-20 h-20', () => {
147
+ const { container } = render(EmptyState, {
148
+ props: { imageSrc: '/empty.png', iconType: 'image' }
149
+ });
150
+ const img = container.querySelector('img');
151
+ expect(img).toHaveClass('w-20');
152
+ expect(img).toHaveClass('h-20');
153
+ });
154
+ });
155
+
156
+ describe('EmptyState Props', () => {
157
+ test('iconType defaults to component', () => {
158
+ // When iconType is 'component' and no icon provided, no image renders
159
+ const { container } = render(EmptyState, { props: { imageSrc: '/test.png' } });
160
+ // Since iconType defaults to 'component', the image won't render
161
+ expect(container.querySelector('img')).not.toBeInTheDocument();
162
+ });
163
+
164
+ test('iconType=image with imageSrc renders image', () => {
165
+ const { container } = render(EmptyState, {
166
+ props: { imageSrc: '/test.png', iconType: 'image' }
167
+ });
168
+ expect(container.querySelector('img')).toBeInTheDocument();
169
+ });
170
+ });
171
+
172
+ describe('EmptyState Combinations', () => {
173
+ test('title and description together', () => {
174
+ render(EmptyState, { props: { title: 'Empty', description: 'Add some items' } });
175
+ expect(screen.getByText('Empty')).toBeInTheDocument();
176
+ expect(screen.getByText('Add some items')).toBeInTheDocument();
177
+ });
178
+
179
+ test('message and subtext together', () => {
180
+ render(EmptyState, { props: { message: 'No data', subtext: 'Try again' } });
181
+ expect(screen.getByText('No data')).toBeInTheDocument();
182
+ expect(screen.getByText('Try again')).toBeInTheDocument();
183
+ });
184
+
185
+ test('all props together', () => {
186
+ const { container } = render(EmptyState, {
187
+ props: {
188
+ title: 'Nothing Found',
189
+ description: 'Your search returned no results',
190
+ imageSrc: '/empty.svg',
191
+ iconType: 'image',
192
+ iconSize: 'w-24 h-24',
193
+ class: 'min-h-screen'
194
+ }
195
+ });
196
+ const wrapper = container.querySelector('div');
197
+ expect(wrapper).toHaveClass('min-h-screen');
198
+ expect(container.querySelector('img')).toBeInTheDocument();
199
+ expect(screen.getByText('Nothing Found')).toBeInTheDocument();
200
+ expect(screen.getByText('Your search returned no results')).toBeInTheDocument();
201
+ });
202
+ });
@@ -22,15 +22,15 @@ describe("ErrorDisplay Component Tests", () => {
22
22
  const { container } = render(ErrorDisplay, {
23
23
  props: { error: "Error", show: true },
24
24
  });
25
- const wrapper = container.firstChild;
26
- expect(wrapper).toHaveClass("text-red-600");
25
+ const icon = container.querySelector("svg");
26
+ expect(icon).toHaveClass("text-red-600");
27
27
  });
28
28
 
29
29
  test("Has shake class when shake is true", () => {
30
30
  const { container } = render(ErrorDisplay, {
31
31
  props: { error: "Error", show: true, shake: true },
32
32
  });
33
- const wrapper = container.firstChild;
33
+ const wrapper = container.querySelector("div.flex");
34
34
  expect(wrapper).toHaveClass("animate-shake");
35
35
  });
36
36
 
@@ -38,7 +38,7 @@ describe("ErrorDisplay Component Tests", () => {
38
38
  const { container } = render(ErrorDisplay, {
39
39
  props: { error: "Error", show: true, shake: false },
40
40
  });
41
- const wrapper = container.firstChild;
41
+ const wrapper = container.querySelector("div.flex");
42
42
  expect(wrapper).not.toHaveClass("animate-shake");
43
43
  });
44
44
 
@@ -54,7 +54,7 @@ describe("ErrorDisplay Component Tests", () => {
54
54
  const { container } = render(ErrorDisplay, {
55
55
  props: { error: "Error", show: true },
56
56
  });
57
- const wrapper = container.firstChild;
57
+ const wrapper = container.querySelector("div.flex");
58
58
  expect(wrapper).toHaveClass("flex");
59
59
  expect(wrapper).toHaveClass("items-center");
60
60
  });
@@ -63,7 +63,7 @@ describe("ErrorDisplay Component Tests", () => {
63
63
  const { container } = render(ErrorDisplay, {
64
64
  props: { error: "Error", show: true, className: "mt-2" },
65
65
  });
66
- const wrapper = container.firstChild;
66
+ const wrapper = container.querySelector("div.flex");
67
67
  expect(wrapper).toHaveClass("mt-2");
68
68
  });
69
69
  });
@@ -6,15 +6,18 @@ describe('StatusIndicator', () => {
6
6
  describe('idle state', () => {
7
7
  it('renders empty container when status is idle', () => {
8
8
  const { container } = render(StatusIndicator, { status: 'idle' });
9
- const indicator = container.querySelector('.status-indicator');
10
- expect(indicator).toBeTruthy();
11
- expect(indicator.children.length).toBe(0);
9
+ // Check that no status indicators are rendered
10
+ expect(container.querySelector('.spinner')).toBeFalsy();
11
+ expect(container.querySelector('.success-circle')).toBeFalsy();
12
+ expect(container.querySelector('.error-circle')).toBeFalsy();
12
13
  });
13
14
 
14
15
  it('uses default status of idle', () => {
15
16
  const { container } = render(StatusIndicator);
16
- const indicator = container.querySelector('.status-indicator');
17
- expect(indicator.children.length).toBe(0);
17
+ // Default status is idle - no status indicators should be rendered
18
+ expect(container.querySelector('.spinner')).toBeFalsy();
19
+ expect(container.querySelector('.success-circle')).toBeFalsy();
20
+ expect(container.querySelector('.error-circle')).toBeFalsy();
18
21
  });
19
22
  });
20
23
 
@@ -25,11 +28,12 @@ describe('StatusIndicator', () => {
25
28
  expect(spinner).toBeTruthy();
26
29
  });
27
30
 
28
- it('renders spinner SVG with track and head circles', () => {
31
+ it('renders spinner SVG with circles', () => {
29
32
  const { container } = render(StatusIndicator, { status: 'loading' });
30
33
  const spinner = container.querySelector('.spinner');
31
34
  expect(spinner.querySelector('svg')).toBeTruthy();
32
- expect(spinner.querySelector('.spinner-track')).toBeTruthy();
35
+ const circles = spinner.querySelectorAll('circle');
36
+ expect(circles.length).toBe(2); // Background circle and animated spinner head
33
37
  expect(spinner.querySelector('.spinner-head')).toBeTruthy();
34
38
  });
35
39
 
@@ -48,11 +52,11 @@ describe('StatusIndicator', () => {
48
52
  expect(success).toBeTruthy();
49
53
  });
50
54
 
51
- it('renders success SVG with background and checkmark', () => {
55
+ it('renders success SVG with circle and checkmark', () => {
52
56
  const { container } = render(StatusIndicator, { status: 'success' });
53
57
  const success = container.querySelector('.success-circle');
54
58
  expect(success.querySelector('svg')).toBeTruthy();
55
- expect(success.querySelector('.success-bg')).toBeTruthy();
59
+ expect(success.querySelector('circle')).toBeTruthy();
56
60
  expect(success.querySelector('.checkmark')).toBeTruthy();
57
61
  });
58
62
 
@@ -71,11 +75,11 @@ describe('StatusIndicator', () => {
71
75
  expect(error).toBeTruthy();
72
76
  });
73
77
 
74
- it('renders error SVG with background and X lines', () => {
78
+ it('renders error SVG with circle and X lines', () => {
75
79
  const { container } = render(StatusIndicator, { status: 'error' });
76
80
  const error = container.querySelector('.error-circle');
77
81
  expect(error.querySelector('svg')).toBeTruthy();
78
- expect(error.querySelector('.error-bg')).toBeTruthy();
82
+ expect(error.querySelector('circle')).toBeTruthy();
79
83
  const xLines = error.querySelectorAll('.error-x');
80
84
  expect(xLines.length).toBe(2);
81
85
  });
@@ -91,16 +95,16 @@ describe('StatusIndicator', () => {
91
95
  describe('size prop', () => {
92
96
  it('uses default size of 48px', () => {
93
97
  const { container } = render(StatusIndicator, { status: 'loading' });
94
- const indicator = container.querySelector('.status-indicator');
95
- expect(indicator.style.width).toBe('48px');
96
- expect(indicator.style.height).toBe('48px');
98
+ const spinner = container.querySelector('.spinner');
99
+ expect(spinner.style.width).toBe('48px');
100
+ expect(spinner.style.height).toBe('48px');
97
101
  });
98
102
 
99
103
  it('accepts custom size', () => {
100
104
  const { container } = render(StatusIndicator, { status: 'loading', size: 100 });
101
- const indicator = container.querySelector('.status-indicator');
102
- expect(indicator.style.width).toBe('100px');
103
- expect(indicator.style.height).toBe('100px');
105
+ const spinner = container.querySelector('.spinner');
106
+ expect(spinner.style.width).toBe('100px');
107
+ expect(spinner.style.height).toBe('100px');
104
108
  });
105
109
  });
106
110
 
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=CheckboxField.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CheckboxField.spec.d.ts","sourceRoot":"","sources":["../../../src/lib/recipes/fields/CheckboxField.spec.js"],"names":[],"mappings":""}
@@ -0,0 +1,135 @@
1
+ import { render, screen } from '@testing-library/svelte';
2
+ import { expect, describe, test } from 'vitest';
3
+ import CheckboxField from './CheckboxField.svelte';
4
+
5
+ describe('CheckboxField Component', () => {
6
+ test('renders a wrapper div', () => {
7
+ const { container } = render(CheckboxField);
8
+ expect(container.querySelector('div')).toBeInTheDocument();
9
+ });
10
+
11
+ test('applies custom className', () => {
12
+ const { container } = render(CheckboxField, { props: { class: 'custom-field' } });
13
+ const wrapper = container.firstElementChild;
14
+ expect(wrapper).toHaveClass('custom-field');
15
+ });
16
+
17
+ test('renders a checkbox input', () => {
18
+ const { container } = render(CheckboxField);
19
+ expect(container.querySelector('input[type="checkbox"]')).toBeInTheDocument();
20
+ });
21
+ });
22
+
23
+ describe('CheckboxField Label', () => {
24
+ test('no label renders no label text', () => {
25
+ render(CheckboxField);
26
+ expect(screen.queryByText(/test label/i)).not.toBeInTheDocument();
27
+ });
28
+
29
+ test('label prop displays label text', () => {
30
+ render(CheckboxField, { props: { label: 'Accept terms' } });
31
+ expect(screen.getByText('Accept terms')).toBeInTheDocument();
32
+ });
33
+
34
+ test('required adds asterisk to label', () => {
35
+ render(CheckboxField, { props: { label: 'Name', required: true } });
36
+ expect(screen.getByText('*')).toBeInTheDocument();
37
+ });
38
+
39
+ test('error state applies error styling to label', () => {
40
+ const { container } = render(CheckboxField, { props: { label: 'Test', error: 'Required' } });
41
+ const labelSpan = container.querySelector('span');
42
+ expect(labelSpan).toHaveClass('text-red-500');
43
+ });
44
+ });
45
+
46
+ describe('CheckboxField Description', () => {
47
+ test('no description renders no description', () => {
48
+ const { container } = render(CheckboxField);
49
+ const spans = container.querySelectorAll('span');
50
+ expect(spans.length).toBeLessThanOrEqual(1);
51
+ });
52
+
53
+ test('description prop displays description text', () => {
54
+ render(CheckboxField, { props: { description: 'You agree to our terms' } });
55
+ expect(screen.getByText('You agree to our terms')).toBeInTheDocument();
56
+ });
57
+
58
+ test('label and description together', () => {
59
+ render(CheckboxField, { props: { label: 'Terms', description: 'Read carefully' } });
60
+ expect(screen.getByText('Terms')).toBeInTheDocument();
61
+ expect(screen.getByText('Read carefully')).toBeInTheDocument();
62
+ });
63
+ });
64
+
65
+ describe('CheckboxField Error', () => {
66
+ test('no error shows no validation message', () => {
67
+ const { container } = render(CheckboxField);
68
+ const errorDiv = container.querySelector('.text-red-600');
69
+ expect(errorDiv).not.toBeInTheDocument();
70
+ });
71
+
72
+ test('error prop shows validation message', () => {
73
+ render(CheckboxField, { props: { error: 'This field is required' } });
74
+ expect(screen.getByText('This field is required')).toBeInTheDocument();
75
+ });
76
+ });
77
+
78
+ describe('CheckboxField Props', () => {
79
+ test('name prop is passed to checkbox', () => {
80
+ const { container } = render(CheckboxField, { props: { name: 'terms' } });
81
+ const input = container.querySelector('input');
82
+ expect(input).toHaveAttribute('name', 'terms');
83
+ });
84
+
85
+ test('value prop is passed to checkbox', () => {
86
+ const { container } = render(CheckboxField, { props: { value: 'accepted' } });
87
+ const input = container.querySelector('input');
88
+ expect(input).toHaveAttribute('value', 'accepted');
89
+ });
90
+
91
+ test('disabled prop disables checkbox', () => {
92
+ const { container } = render(CheckboxField, { props: { disabled: true } });
93
+ const input = container.querySelector('input');
94
+ expect(input).toBeDisabled();
95
+ });
96
+ });
97
+
98
+ describe('CheckboxField Layout', () => {
99
+ test('has flex container for checkbox and label', () => {
100
+ const { container } = render(CheckboxField, { props: { label: 'Test' } });
101
+ const flexDiv = container.querySelector('.flex.items-start');
102
+ expect(flexDiv).toBeInTheDocument();
103
+ });
104
+
105
+ test('has gap between checkbox and label', () => {
106
+ const { container } = render(CheckboxField, { props: { label: 'Test' } });
107
+ const flexDiv = container.querySelector('.flex.items-start');
108
+ expect(flexDiv).toHaveClass('gap-3');
109
+ });
110
+ });
111
+
112
+ describe('CheckboxField Combinations', () => {
113
+ test('all props together', () => {
114
+ const { container } = render(CheckboxField, {
115
+ props: {
116
+ label: 'Newsletter',
117
+ description: 'Receive updates',
118
+ error: 'Please accept',
119
+ name: 'newsletter',
120
+ value: 'yes',
121
+ disabled: true,
122
+ required: true,
123
+ class: 'my-field'
124
+ }
125
+ });
126
+ const wrapper = container.firstElementChild;
127
+ expect(wrapper).toHaveClass('my-field');
128
+ expect(screen.getByText('Newsletter')).toBeInTheDocument();
129
+ expect(screen.getByText('Receive updates')).toBeInTheDocument();
130
+ expect(screen.getByText('Please accept')).toBeInTheDocument();
131
+ expect(screen.getByText('*')).toBeInTheDocument();
132
+ const input = container.querySelector('input');
133
+ expect(input).toBeDisabled();
134
+ });
135
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=FormField.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormField.spec.d.ts","sourceRoot":"","sources":["../../../src/lib/recipes/fields/FormField.spec.js"],"names":[],"mappings":""}
@@ -0,0 +1,159 @@
1
+ import { render, screen } from '@testing-library/svelte';
2
+ import { expect, describe, test } from 'vitest';
3
+ import FormField from './FormField.svelte';
4
+
5
+ describe('FormField Component', () => {
6
+ test('renders a wrapper div', () => {
7
+ const { container } = render(FormField);
8
+ expect(container.querySelector('div')).toBeInTheDocument();
9
+ });
10
+
11
+ test('wrapper has space-y-1 class', () => {
12
+ const { container } = render(FormField);
13
+ const wrapper = container.firstElementChild;
14
+ expect(wrapper).toHaveClass('space-y-1');
15
+ });
16
+
17
+ test('applies custom className', () => {
18
+ const { container } = render(FormField, { props: { class: 'custom-form-field' } });
19
+ const wrapper = container.firstElementChild;
20
+ expect(wrapper).toHaveClass('custom-form-field');
21
+ });
22
+ });
23
+
24
+ describe('FormField Label', () => {
25
+ test('no label renders no label element', () => {
26
+ const { container } = render(FormField);
27
+ expect(container.querySelector('label')).not.toBeInTheDocument();
28
+ });
29
+
30
+ test('label prop displays label text', () => {
31
+ render(FormField, { props: { label: 'Email Address' } });
32
+ expect(screen.getByText('Email Address')).toBeInTheDocument();
33
+ });
34
+
35
+ test('label uses Label component', () => {
36
+ const { container } = render(FormField, { props: { label: 'Name' } });
37
+ const label = container.querySelector('label');
38
+ expect(label).toBeInTheDocument();
39
+ });
40
+
41
+ test('required shows asterisk', () => {
42
+ render(FormField, { props: { label: 'Username', required: true } });
43
+ expect(screen.getByText('*')).toBeInTheDocument();
44
+ });
45
+
46
+ test('required asterisk has red color', () => {
47
+ const { container } = render(FormField, { props: { label: 'Name', required: true } });
48
+ const asterisk = container.querySelector('.text-red-500');
49
+ expect(asterisk).toHaveTextContent('*');
50
+ });
51
+
52
+ test('error changes label color to red', () => {
53
+ const { container } = render(FormField, { props: { label: 'Email', error: 'Invalid' } });
54
+ const label = container.querySelector('label');
55
+ expect(label).toHaveClass('text-red-700');
56
+ });
57
+
58
+ test('no error keeps label gray', () => {
59
+ const { container } = render(FormField, { props: { label: 'Email' } });
60
+ const label = container.querySelector('label');
61
+ expect(label).toHaveClass('text-gray-900');
62
+ });
63
+ });
64
+
65
+ describe('FormField Hint', () => {
66
+ test('no hint renders no hint text', () => {
67
+ const { container } = render(FormField, { props: { label: 'Name' } });
68
+ const paragraphs = container.querySelectorAll('p');
69
+ expect(paragraphs.length).toBe(0);
70
+ });
71
+
72
+ test('hint prop displays hint text', () => {
73
+ render(FormField, { props: { hint: 'Enter your full name' } });
74
+ expect(screen.getByText('Enter your full name')).toBeInTheDocument();
75
+ });
76
+
77
+ test('hint is displayed in paragraph', () => {
78
+ const { container } = render(FormField, { props: { hint: 'Helper text' } });
79
+ const paragraph = container.querySelector('p');
80
+ expect(paragraph).toBeInTheDocument();
81
+ expect(paragraph).toHaveTextContent('Helper text');
82
+ });
83
+
84
+ test('hint is hidden when error is present', () => {
85
+ render(FormField, { props: { hint: 'Helper text', error: 'Error message' } });
86
+ expect(screen.queryByText('Helper text')).not.toBeInTheDocument();
87
+ });
88
+ });
89
+
90
+ describe('FormField Error', () => {
91
+ test('no error shows no validation message', () => {
92
+ const { container } = render(FormField);
93
+ expect(container.querySelector('[role="alert"]')).not.toBeInTheDocument();
94
+ });
95
+
96
+ test('error prop shows validation message', () => {
97
+ render(FormField, { props: { error: 'This field is required' } });
98
+ expect(screen.getByText('This field is required')).toBeInTheDocument();
99
+ });
100
+
101
+ test('error message uses ValidationError component', () => {
102
+ const { container } = render(FormField, { props: { error: 'Invalid input' } });
103
+ const errorDiv = container.querySelector('.text-red-600');
104
+ expect(errorDiv).toBeInTheDocument();
105
+ });
106
+ });
107
+
108
+ describe('FormField ID', () => {
109
+ test('generates random id by default', () => {
110
+ const { container } = render(FormField, { props: { label: 'Test' } });
111
+ const label = container.querySelector('label');
112
+ expect(label.getAttribute('for')).toBeTruthy();
113
+ });
114
+
115
+ test('custom id is used when provided', () => {
116
+ const { container } = render(FormField, { props: { label: 'Test', id: 'my-custom-id' } });
117
+ const label = container.querySelector('label');
118
+ expect(label.getAttribute('for')).toBe('my-custom-id');
119
+ });
120
+ });
121
+
122
+ describe('FormField Combinations', () => {
123
+ test('label with hint', () => {
124
+ render(FormField, { props: { label: 'Email', hint: 'We won\'t share your email' } });
125
+ expect(screen.getByText('Email')).toBeInTheDocument();
126
+ expect(screen.getByText("We won't share your email")).toBeInTheDocument();
127
+ });
128
+
129
+ test('label with required and error', () => {
130
+ const { container } = render(FormField, {
131
+ props: { label: 'Password', required: true, error: 'Too short' }
132
+ });
133
+ expect(screen.getByText('Password')).toBeInTheDocument();
134
+ expect(screen.getByText('*')).toBeInTheDocument();
135
+ expect(screen.getByText('Too short')).toBeInTheDocument();
136
+ });
137
+
138
+ test('all props together', () => {
139
+ const { container } = render(FormField, {
140
+ props: {
141
+ label: 'Username',
142
+ hint: 'Choose a unique username',
143
+ error: 'Username taken',
144
+ required: true,
145
+ id: 'username-field',
146
+ class: 'custom-field'
147
+ }
148
+ });
149
+ const wrapper = container.firstElementChild;
150
+ expect(wrapper).toHaveClass('custom-field');
151
+ expect(screen.getByText('Username')).toBeInTheDocument();
152
+ expect(screen.getByText('*')).toBeInTheDocument();
153
+ expect(screen.getByText('Username taken')).toBeInTheDocument();
154
+ // Hint should be hidden when error is present
155
+ expect(screen.queryByText('Choose a unique username')).not.toBeInTheDocument();
156
+ const label = container.querySelector('label');
157
+ expect(label.getAttribute('for')).toBe('username-field');
158
+ });
159
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=RadioGroup.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RadioGroup.spec.d.ts","sourceRoot":"","sources":["../../../src/lib/recipes/fields/RadioGroup.spec.js"],"names":[],"mappings":""}