@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
@@ -1,173 +1,253 @@
1
- import { render, screen, waitFor } from "@testing-library/svelte";
2
- import { expect, describe, test, vi } from "vitest";
3
- import PasswordStrengthIndicator from "./PasswordStrengthIndicator.svelte";
4
-
5
- // Debounce delay + buffer
6
- const DEBOUNCE_WAIT = 500;
7
-
8
- function setupTest(args = {}) {
9
- const { component, container } = render(PasswordStrengthIndicator, {
10
- props: {
11
- password: "",
12
- ...args,
13
- },
14
- });
15
- return { component, container };
16
- }
17
-
18
- describe("PasswordStrengthIndicator Component Tests", () => {
19
- test("Does not render when password is empty", () => {
20
- const { container } = setupTest({ password: "" });
21
- const indicator = container.querySelector(".pt-2");
22
- expect(indicator).not.toBeInTheDocument();
23
- });
24
-
25
- test("Renders after debounce when password has value", async () => {
26
- const { container } = setupTest({ password: "test" });
27
- await waitFor(
28
- () => {
29
- const indicator = container.querySelector(".pt-2");
30
- expect(indicator).toBeInTheDocument();
31
- },
32
- { timeout: DEBOUNCE_WAIT }
33
- );
34
- });
35
-
36
- test("Has three strength bars", async () => {
37
- const { container } = setupTest({ password: "test" });
38
- await waitFor(
39
- () => {
40
- const bars = container.querySelectorAll(".h-1.flex-1.rounded-full");
41
- expect(bars.length).toBe(3);
42
- },
43
- { timeout: DEBOUNCE_WAIT }
44
- );
45
- });
46
-
47
- test("Shows filled bars for weak password", async () => {
48
- const { container } = setupTest({ password: "ab" });
49
- await waitFor(
50
- () => {
51
- // At least one bar should be filled with a color
52
- const coloredBars = container.querySelectorAll(
53
- ".bg-red-600, .bg-green-600"
54
- );
55
- expect(coloredBars.length).toBeGreaterThan(0);
56
- },
57
- { timeout: DEBOUNCE_WAIT }
58
- );
59
- });
60
-
61
- test("Shows filled bars for good password", async () => {
62
- const { container } = setupTest({ password: "Abc12345" });
63
- await waitFor(
64
- () => {
65
- // All 3 bars should be filled for a good password
66
- const successBars = container.querySelectorAll(".bg-green-600");
67
- expect(successBars.length).toBe(3);
68
- },
69
- { timeout: DEBOUNCE_WAIT }
70
- );
71
- });
72
-
73
- test("Exports score prop", () => {
74
- const { component } = setupTest({ password: "test123" });
75
- // Score should be accessible
76
- expect(component).toBeDefined();
77
- });
78
-
79
- test("Exports strengthText prop", () => {
80
- const { component } = setupTest({ password: "test123" });
81
- expect(component).toBeDefined();
82
- });
83
-
84
- test("Exports textColor prop", () => {
85
- const { component } = setupTest({ password: "test123" });
86
- expect(component).toBeDefined();
87
- });
88
-
89
- test("Uses danger color for weak passwords", async () => {
90
- const { container } = setupTest({ password: "weak" });
91
- await waitFor(
92
- () => {
93
- const dangerBars = container.querySelectorAll(".bg-red-600");
94
- expect(dangerBars.length).toBeGreaterThan(0);
95
- },
96
- { timeout: DEBOUNCE_WAIT }
97
- );
98
- });
99
-
100
- test("Uses success color for good/strong passwords", async () => {
101
- const { container } = setupTest({ password: "StrongP@ss123" });
102
- await waitFor(
103
- () => {
104
- const successBars = container.querySelectorAll(".bg-green-600");
105
- expect(successBars.length).toBe(3);
106
- },
107
- { timeout: DEBOUNCE_WAIT }
108
- );
109
- });
110
-
111
- test("Has transition animation classes on bars", async () => {
112
- const { container } = setupTest({ password: "test" });
113
- await waitFor(
114
- () => {
115
- const bars = container.querySelectorAll(".h-1.flex-1.rounded-full");
116
- expect(bars.length).toBe(3);
117
- bars.forEach((bar) => {
118
- expect(bar).toHaveClass("transition-colors");
119
- expect(bar).toHaveClass("duration-300");
120
- });
121
- },
122
- { timeout: DEBOUNCE_WAIT }
123
- );
124
- });
125
-
126
- test("Very long password shows strong indicator", async () => {
127
- const { container } = setupTest({ password: "1234567890123" }); // 13 chars
128
- await waitFor(
129
- () => {
130
- const successBars = container.querySelectorAll(".bg-green-600");
131
- expect(successBars.length).toBe(3);
132
- },
133
- { timeout: DEBOUNCE_WAIT }
134
- );
135
- });
136
- });
137
-
138
- describe("Password Strength Scoring", () => {
139
- test("Score 2+ (Good) shows 3 success bars - 8+ chars with 2 diversity", async () => {
140
- const { container } = setupTest({ password: "Abcdefgh" }); // Upper + lower
141
- await waitFor(
142
- () => {
143
- const successBars = container.querySelectorAll(".bg-green-600");
144
- expect(successBars.length).toBe(3);
145
- },
146
- { timeout: DEBOUNCE_WAIT }
147
- );
148
- });
149
-
150
- test("Score 3 (Strong) - 10+ chars, multiple diversity", async () => {
151
- const { container } = setupTest({ password: "Abcdefgh1!" }); // Upper, lower, number, symbol
152
- await waitFor(
153
- () => {
154
- const successBars = container.querySelectorAll(".bg-green-600");
155
- expect(successBars.length).toBe(3);
156
- },
157
- { timeout: DEBOUNCE_WAIT }
158
- );
159
- });
160
-
161
- test("Weak password shows danger color bars", async () => {
162
- const { container } = setupTest({ password: "abcdef" });
163
- await waitFor(
164
- () => {
165
- const coloredBars = container.querySelectorAll(
166
- ".bg-red-600, .bg-green-600"
167
- );
168
- expect(coloredBars.length).toBeGreaterThan(0);
169
- },
170
- { timeout: DEBOUNCE_WAIT }
171
- );
172
- });
173
- });
1
+ import { render } from '@testing-library/svelte';
2
+ import { expect, describe, test } from 'vitest';
3
+ import TestWrapper from './TestWrapper.svelte';
4
+
5
+ describe('PasswordStrengthIndicator Component - Basic Rendering', () => {
6
+ test('does not render when password is empty', () => {
7
+ const { container } = render(TestWrapper, {
8
+ props: { password: '' }
9
+ });
10
+ const indicator = container.querySelector('.pt-2.space-y-2');
11
+ expect(indicator).not.toBeInTheDocument();
12
+ });
13
+
14
+ test('renders with non-empty password', () => {
15
+ const { container } = render(TestWrapper, {
16
+ props: { password: 'test' }
17
+ });
18
+ const indicator = container.querySelector('.pt-2.space-y-2');
19
+ expect(indicator).toBeInTheDocument();
20
+ });
21
+
22
+ test('renders three strength bars', () => {
23
+ const { container } = render(TestWrapper, {
24
+ props: { password: 'test123' }
25
+ });
26
+ const bars = container.querySelectorAll('.h-1.flex-1.rounded-full');
27
+ expect(bars).toHaveLength(3);
28
+ });
29
+ });
30
+
31
+ describe('PasswordStrengthIndicator Component - Strength Calculation', () => {
32
+ test('shows indicator for very short passwords', () => {
33
+ const { container } = render(TestWrapper, {
34
+ props: { password: 'abc' }
35
+ });
36
+ expect(container.querySelector('.pt-2.space-y-2')).toBeInTheDocument();
37
+ });
38
+
39
+ test('shows indicator for passwords with low diversity', () => {
40
+ const { container } = render(TestWrapper, {
41
+ props: { password: 'test12' }
42
+ });
43
+ expect(container.querySelector('.pt-2.space-y-2')).toBeInTheDocument();
44
+ });
45
+
46
+ test('shows indicator for passwords with moderate strength', () => {
47
+ const { container } = render(TestWrapper, {
48
+ props: { password: 'Test1234' }
49
+ });
50
+ expect(container.querySelector('.pt-2.space-y-2')).toBeInTheDocument();
51
+ });
52
+
53
+ test('shows indicator for passwords over 12 characters', () => {
54
+ const { container } = render(TestWrapper, {
55
+ props: { password: 'VeryStrongPass123!' }
56
+ });
57
+ expect(container.querySelector('.pt-2.space-y-2')).toBeInTheDocument();
58
+ const greenBars = container.querySelectorAll('.bg-green-600');
59
+ expect(greenBars.length).toBeGreaterThan(0);
60
+ });
61
+
62
+ test('shows indicator for diverse passwords meeting minimum length', () => {
63
+ const { container } = render(TestWrapper, {
64
+ props: { password: 'Test@123AB' }
65
+ });
66
+ expect(container.querySelector('.pt-2.space-y-2')).toBeInTheDocument();
67
+ });
68
+ });
69
+
70
+ describe('PasswordStrengthIndicator Component - Visual Indicators', () => {
71
+ test('shows 1 filled bar for "Too weak" password', () => {
72
+ const { container } = render(TestWrapper, {
73
+ props: { password: 'ab' }
74
+ });
75
+ const filledBars = container.querySelectorAll('.bg-red-600');
76
+ expect(filledBars.length).toBeGreaterThanOrEqual(1);
77
+ });
78
+
79
+ test('shows filled bars for "Weak" password', () => {
80
+ const { container } = render(TestWrapper, {
81
+ props: { password: 'test12' }
82
+ });
83
+ const indicator = container.querySelector('.pt-2.space-y-2');
84
+ expect(indicator).toBeInTheDocument();
85
+ });
86
+
87
+ test('shows filled bars for "Good" password', () => {
88
+ const { container } = render(TestWrapper, {
89
+ props: { password: 'Test1234' }
90
+ });
91
+ const indicator = container.querySelector('.pt-2.space-y-2');
92
+ expect(indicator).toBeInTheDocument();
93
+ });
94
+
95
+ test('shows 3 filled bars for "Strong" password', () => {
96
+ const { container } = render(TestWrapper, {
97
+ props: { password: 'VeryStrongPass123!' }
98
+ });
99
+ const indicator = container.querySelector('.pt-2.space-y-2');
100
+ expect(indicator).toBeInTheDocument();
101
+ const greenBars = container.querySelectorAll('.bg-green-600');
102
+ expect(greenBars.length).toBe(3);
103
+ });
104
+
105
+ test('unfilled bars have gray background', () => {
106
+ const { container } = render(TestWrapper, {
107
+ props: { password: 'ab' }
108
+ });
109
+ const grayBars = container.querySelectorAll('.bg-gray-200');
110
+ expect(grayBars.length).toBeGreaterThan(0);
111
+ });
112
+
113
+ test('bars have rounded-full class', () => {
114
+ const { container } = render(TestWrapper, {
115
+ props: { password: 'test' }
116
+ });
117
+ const bars = container.querySelectorAll('.rounded-full');
118
+ expect(bars.length).toBeGreaterThanOrEqual(3);
119
+ });
120
+
121
+ test('bars have transition-colors class for smooth color changes', () => {
122
+ const { container } = render(TestWrapper, {
123
+ props: { password: 'test' }
124
+ });
125
+ const bars = container.querySelectorAll('.transition-colors');
126
+ expect(bars.length).toBeGreaterThanOrEqual(3);
127
+ });
128
+ });
129
+
130
+ describe('PasswordStrengthIndicator Component - Color Coding', () => {
131
+ test('uses red color for weak passwords (score 0)', () => {
132
+ const { container } = render(TestWrapper, {
133
+ props: { password: 'ab' }
134
+ });
135
+ const redBars = container.querySelectorAll('.bg-red-600');
136
+ expect(redBars.length).toBeGreaterThan(0);
137
+ });
138
+
139
+ test('uses red color for weak passwords (score 1)', () => {
140
+ const { container } = render(TestWrapper, {
141
+ props: { password: 'test12' }
142
+ });
143
+ expect(container.querySelector('.pt-2.space-y-2')).toBeInTheDocument();
144
+ const redBars = container.querySelectorAll('.bg-red-600');
145
+ expect(redBars.length).toBeGreaterThan(0);
146
+ });
147
+
148
+ test('uses green color for good passwords (score 2)', () => {
149
+ const { container } = render(TestWrapper, {
150
+ props: { password: 'Test1234' }
151
+ });
152
+ expect(container.querySelector('.pt-2.space-y-2')).toBeInTheDocument();
153
+ const greenBars = container.querySelectorAll('.bg-green-600');
154
+ expect(greenBars.length).toBeGreaterThan(0);
155
+ });
156
+
157
+ test('uses green color for strong passwords (score 3)', () => {
158
+ const { container } = render(TestWrapper, {
159
+ props: { password: 'VeryStrongPass123!' }
160
+ });
161
+ const greenBars = container.querySelectorAll('.bg-green-600');
162
+ expect(greenBars.length).toBeGreaterThan(0);
163
+ });
164
+ });
165
+
166
+ describe('PasswordStrengthIndicator Component - Empty Password', () => {
167
+ test('does not show indicator when password is empty', () => {
168
+ const { container } = render(TestWrapper, {
169
+ props: { password: '' }
170
+ });
171
+ expect(container.querySelector('.pt-2.space-y-2')).not.toBeInTheDocument();
172
+ });
173
+ });
174
+
175
+ describe('PasswordStrengthIndicator Component - Edge Cases', () => {
176
+ test('handles very long passwords', () => {
177
+ const longPassword = 'A'.repeat(50) + '1@';
178
+ const { container } = render(TestWrapper, {
179
+ props: { password: longPassword }
180
+ });
181
+ expect(container.querySelector('.pt-2.space-y-2')).toBeInTheDocument();
182
+ const greenBars = container.querySelectorAll('.bg-green-600');
183
+ expect(greenBars.length).toBe(3);
184
+ });
185
+
186
+ test('handles passwords with special characters', () => {
187
+ const { container } = render(TestWrapper, {
188
+ props: { password: 'Test@123!#$' }
189
+ });
190
+ expect(container.querySelector('.pt-2.space-y-2')).toBeInTheDocument();
191
+ });
192
+
193
+ test('handles password exactly 13 characters (triggers >12 rule)', () => {
194
+ const { container } = render(TestWrapper, {
195
+ props: { password: 'TestPass12345' }
196
+ });
197
+ expect(container.querySelector('.pt-2.space-y-2')).toBeInTheDocument();
198
+ const greenBars = container.querySelectorAll('.bg-green-600');
199
+ expect(greenBars.length).toBe(3);
200
+ });
201
+
202
+ test('handles single character password', () => {
203
+ const { container } = render(TestWrapper, {
204
+ props: { password: 'a' }
205
+ });
206
+ expect(container.querySelector('.pt-2.space-y-2')).toBeInTheDocument();
207
+ });
208
+
209
+ test('handles whitespace in password', () => {
210
+ const { container } = render(TestWrapper, {
211
+ props: { password: 'test 123 abc' }
212
+ });
213
+ expect(container.querySelector('.pt-2.space-y-2')).toBeInTheDocument();
214
+ });
215
+ });
216
+
217
+ describe('PasswordStrengthIndicator Component - Dark Mode Support', () => {
218
+ test('unfilled bars have dark mode class', () => {
219
+ const { container } = render(TestWrapper, {
220
+ props: { password: 'abc' }
221
+ });
222
+ const bars = container.querySelectorAll('.dark\\:bg-gray-700');
223
+ expect(bars.length).toBeGreaterThan(0);
224
+ });
225
+ });
226
+
227
+ describe('PasswordStrengthIndicator Component - Bar Filling', () => {
228
+ test('fills appropriate number of bars based on strength', () => {
229
+ const { container } = render(TestWrapper, {
230
+ props: { password: 'Test1234' }
231
+ });
232
+ const allBars = container.querySelectorAll('.h-1.flex-1.rounded-full');
233
+ expect(allBars).toHaveLength(3);
234
+
235
+ const filledBars = container.querySelectorAll('.bg-red-600, .bg-green-600');
236
+ expect(filledBars.length).toBeGreaterThan(0);
237
+ });
238
+
239
+ test('all bars are rendered with consistent styling', () => {
240
+ const { container } = render(TestWrapper, {
241
+ props: { password: 'TestPassword123' }
242
+ });
243
+ const bars = container.querySelectorAll('.h-1.flex-1.rounded-full.transition-colors');
244
+ expect(bars).toHaveLength(3);
245
+
246
+ bars.forEach(bar => {
247
+ expect(bar).toHaveClass('h-1');
248
+ expect(bar).toHaveClass('flex-1');
249
+ expect(bar).toHaveClass('rounded-full');
250
+ expect(bar).toHaveClass('transition-colors');
251
+ });
252
+ });
253
+ });
@@ -0,0 +1,71 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ import { passwordStrength } from "check-password-strength";
4
+
5
+ interface Props {
6
+ password?: string;
7
+ children?: Snippet;
8
+ }
9
+
10
+ let {
11
+ password = "",
12
+ children,
13
+ }: Props = $props();
14
+
15
+ const customOptions = [
16
+ {
17
+ id: 0,
18
+ value: "Too weak",
19
+ minDiversity: 0,
20
+ minLength: 0,
21
+ },
22
+ {
23
+ id: 1,
24
+ value: "Weak",
25
+ minDiversity: 1,
26
+ minLength: 6,
27
+ },
28
+ {
29
+ id: 2,
30
+ value: "Good",
31
+ minDiversity: 2,
32
+ minLength: 8,
33
+ },
34
+ {
35
+ id: 3,
36
+ value: "Strong",
37
+ minDiversity: 3,
38
+ minLength: 10,
39
+ },
40
+ ] as const;
41
+
42
+ // No debouncing - directly use password for testing
43
+ let strength = $derived(password
44
+ ? passwordStrength(password, customOptions as any)
45
+ : null);
46
+
47
+ // Compute score based on password length and strength
48
+ let score = $derived(password.length > 12 ? 3 : (strength?.id ?? -1));
49
+
50
+ let strengthColor = $derived(score <= 1 ? "bg-red-600" : "bg-green-600");
51
+
52
+ // Calculate how many bars to fill (1-3)
53
+ let filledBars = $derived(score === 0 ? 1 : score === 1 ? 2 : score >= 2 ? 3 : 0);
54
+ </script>
55
+
56
+ {#if password.length > 0}
57
+ <div class="pt-2 space-y-2">
58
+ <!-- 3 segment bars -->
59
+ <div class="flex gap-1.5">
60
+ {#each [0, 1, 2] as barIndex}
61
+ <div
62
+ class="h-1 flex-1 rounded-full transition-colors duration-300 {barIndex <
63
+ filledBars
64
+ ? strengthColor
65
+ : 'bg-gray-200 dark:bg-gray-700'}"
66
+ ></div>
67
+ {/each}
68
+ </div>
69
+ {@render children?.()}
70
+ </div>
71
+ {/if}
@@ -0,0 +1,9 @@
1
+ import type { Snippet } from 'svelte';
2
+ interface Props {
3
+ password?: string;
4
+ children?: Snippet;
5
+ }
6
+ declare const TestWrapper: import("svelte").Component<Props, {}, "">;
7
+ type TestWrapper = ReturnType<typeof TestWrapper>;
8
+ export default TestWrapper;
9
+ //# sourceMappingURL=TestWrapper.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestWrapper.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/recipes/inputs/PasswordStrengthIndicator/TestWrapper.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAIlC,UAAU,KAAK;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAqEL,QAAA,MAAM,WAAW,2CAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}