@zap-wunschlachen/wl-shared-components 1.0.38 → 1.0.39

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 (254) hide show
  1. package/.github/workflows/playwright.yml +205 -205
  2. package/.github/workflows/static.yml +61 -61
  3. package/.github/workflows/update-snapshots.yml +37 -37
  4. package/.prettierrc +5 -5
  5. package/.storybook/main.ts +18 -18
  6. package/.storybook/preview.ts +37 -37
  7. package/.storybook/storyWrapper.vue +18 -18
  8. package/.storybook/withVuetifyTheme.decorator.ts +21 -21
  9. package/App.vue +33 -33
  10. package/README.md +56 -56
  11. package/heroicons.ts +75 -75
  12. package/index.html +19 -19
  13. package/package.json +67 -67
  14. package/playwright.config.ts +48 -48
  15. package/public/background.svg +60 -60
  16. package/public/style.css +187 -187
  17. package/public/technologies.svg +22 -22
  18. package/src/assets/css/base.css +234 -232
  19. package/src/assets/css/variables.css +112 -109
  20. package/src/components/Accordion/Accordion.css +59 -59
  21. package/src/components/Accordion/AccordionGroup.vue +51 -51
  22. package/src/components/Accordion/AccordionItem.vue +66 -66
  23. package/src/components/Appointment/Card/Actions.css +54 -54
  24. package/src/components/Appointment/Card/Actions.vue +99 -99
  25. package/src/components/Appointment/Card/AnamneseNotification.css +15 -15
  26. package/src/components/Appointment/Card/AnamneseNotification.vue +23 -23
  27. package/src/components/Appointment/Card/Card.css +80 -80
  28. package/src/components/Appointment/Card/Card.vue +93 -93
  29. package/src/components/Appointment/Card/Details.css +50 -50
  30. package/src/components/Appointment/Card/Details.vue +43 -43
  31. package/src/components/Audio/Audio.vue +187 -187
  32. package/src/components/Audio/Waveform.vue +118 -118
  33. package/src/components/Button/Button.vue +174 -174
  34. package/src/components/CheckBox/CheckBox.css +214 -214
  35. package/src/components/CheckBox/Checkbox.vue +138 -138
  36. package/src/components/DateInput/DateInput.css +2 -2
  37. package/src/components/DateInput/DateInput.vue +262 -262
  38. package/src/components/Dialog/Dialog.css +6 -6
  39. package/src/components/Dialog/Dialog.vue +38 -38
  40. package/src/components/EditField/EditField.css +19 -19
  41. package/src/components/EditField/EditField.vue +202 -202
  42. package/src/components/ErrorPage/ErrorPage.css +172 -172
  43. package/src/components/IconBullet/IconBullet.vue +86 -86
  44. package/src/components/IconBullet/IconBulletList.vue +41 -41
  45. package/src/components/Icons/AdvanceAppointments.vue +153 -153
  46. package/src/components/Icons/Audio/CloudFailed.vue +20 -20
  47. package/src/components/Icons/Audio/CloudSaved.vue +21 -21
  48. package/src/components/Icons/Audio/Delete.vue +15 -15
  49. package/src/components/Icons/Audio/Pause.vue +18 -18
  50. package/src/components/Icons/Audio/Play.vue +15 -15
  51. package/src/components/Icons/{calendar.vue → Calendar.vue} +17 -17
  52. package/src/components/Icons/CalendarNotification.vue +126 -126
  53. package/src/components/Icons/Chair.vue +32 -32
  54. package/src/components/Icons/ChairNotification.vue +35 -35
  55. package/src/components/Icons/Circle.vue +66 -66
  56. package/src/components/Icons/FavIcon.vue +22 -22
  57. package/src/components/Icons/FilledCircle.vue +11 -11
  58. package/src/components/Icons/Group3.vue +46 -46
  59. package/src/components/Icons/RingNotification.vue +54 -54
  60. package/src/components/Icons/SolidArrowRight.vue +14 -14
  61. package/src/components/Icons/checkbox.vue +19 -19
  62. package/src/components/Icons/outlineChecked.vue +27 -27
  63. package/src/components/Icons/play.vue +5 -5
  64. package/src/components/Input/Input.css +187 -187
  65. package/src/components/Input/Input.vue +253 -253
  66. package/src/components/Laboratory/AppointmentCard/AppointmentCard.css +7 -7
  67. package/src/components/Laboratory/AppointmentCard/AppointmentCard.vue +116 -116
  68. package/src/components/Laboratory/ChatBoxImage/ChatBoxImage.vue +81 -81
  69. package/src/components/Laboratory/ChatMessage/ChatMessage.vue +113 -113
  70. package/src/components/Laboratory/ChatMessage/ChatMessageBadge.css +4 -4
  71. package/src/components/Laboratory/ChatMessage/ChatMessageBadge.vue +99 -99
  72. package/src/components/Laboratory/ChatNotification/ChatNotification.vue +130 -130
  73. package/src/components/Laboratory/DocumentCard/DocumentCard.css +3 -3
  74. package/src/components/Laboratory/DocumentCard/DocumentCard.vue +50 -50
  75. package/src/components/Laboratory/DocumentCard/DocumentCardItem.vue +53 -53
  76. package/src/components/Laboratory/InfoCard/InfoCard.vue +162 -162
  77. package/src/components/Laboratory/MainColumnsBar/MainColumnsBar.vue +102 -102
  78. package/src/components/Laboratory/ProgressCircle/ProgressCircle.vue +152 -152
  79. package/src/components/Laboratory/ProgressLinear/ProgressLinear.css +33 -33
  80. package/src/components/Laboratory/ProgressLinear/ProgressLinear.vue +75 -75
  81. package/src/components/Laboratory/SelectionColumnBar/SelectionColumnBar.vue +92 -92
  82. package/src/components/Laboratory/StatusNotification/StatusNotification.vue +49 -49
  83. package/src/components/Laboratory/TagLabel/TagLabel.vue +126 -126
  84. package/src/components/Laboratory/TagLabelGroup/TagLabelGroup.vue +97 -97
  85. package/src/components/Laboratory/TicketCard/TicketCard.css +3 -3
  86. package/src/components/Laboratory/TicketCard/TicketCard.vue +143 -143
  87. package/src/components/Laboratory/TimeLine/TimeLineEvent.css +18 -18
  88. package/src/components/Laboratory/TimeLine/TimeLineEvent.vue +119 -119
  89. package/src/components/Laboratory/TimeLine/Timeline.css +4 -4
  90. package/src/components/Laboratory/TimeLine/Timeline.vue +30 -30
  91. package/src/components/Loader/Loader.css +71 -71
  92. package/src/components/MaintenanceBanner/MaintenanceBanner.css +353 -353
  93. package/src/components/MaintenanceBanner/MaintenanceBanner.vue +127 -127
  94. package/src/components/MaintenanceBanner/MaintenanceIllustration.vue +54 -54
  95. package/src/components/Modal/Modal.css +5 -5
  96. package/src/components/Modal/Modal.vue +22 -22
  97. package/src/components/NotificationBubble/NotificationBubble.css +4 -4
  98. package/src/components/NotificationBubble/NotificationBubble.vue +90 -90
  99. package/src/components/OtpInput/OtpInput.css +39 -39
  100. package/src/components/OtpInput/OtpInput.vue +151 -151
  101. package/src/components/PhoneInput/PhoneInput.css +31 -31
  102. package/src/components/PhoneInput/PhoneInput.vue +113 -113
  103. package/src/components/Select/Select.css +150 -150
  104. package/src/components/Select/Select.vue +316 -316
  105. package/src/components/TextArea/TextArea.css +3 -3
  106. package/src/components/TextArea/TextArea.vue +126 -126
  107. package/src/components/TickBox/TickBox.css +49 -49
  108. package/src/components/TickBox/TickBox.vue +126 -126
  109. package/src/components/accessibility.css +218 -218
  110. package/src/components/index.ts +29 -29
  111. package/src/constants/iconEnums.ts +3 -3
  112. package/src/i18n/i18n.ts +15 -15
  113. package/src/i18n/locales/de.json +30 -30
  114. package/src/i18n/locales/en.json +30 -30
  115. package/src/index.ts +34 -34
  116. package/src/main.ts +11 -11
  117. package/src/plugins/vuetify.ts +141 -141
  118. package/src/shims-vue.d.ts +10 -10
  119. package/src/stories/Accordion.stories.ts +650 -650
  120. package/src/stories/Audio.stories.ts +28 -28
  121. package/src/stories/Button.stories.ts +263 -263
  122. package/src/stories/CheckBox.stories.ts +348 -348
  123. package/src/stories/DateInput.stories.ts +53 -53
  124. package/src/stories/Dialog.stories.ts +147 -147
  125. package/src/stories/EditField.stories.ts +78 -78
  126. package/src/stories/IconBullet/IconBullet.stories.ts +201 -201
  127. package/src/stories/IconBullet/IconBulletList.stories.ts +275 -275
  128. package/src/stories/Input.stories.ts +351 -351
  129. package/src/stories/Laboratory/Cards/AppointmentCard/AppointmentCard.stories.ts +260 -260
  130. package/src/stories/Laboratory/Cards/DocumentCard/DocumentCard.stories.ts +176 -176
  131. package/src/stories/Laboratory/Cards/DocumentCard/DocumentCardItem.stories.ts +119 -119
  132. package/src/stories/Laboratory/Cards/InfoCard/InfoCard.stories.ts +320 -320
  133. package/src/stories/Laboratory/Cards/TicketCard/TicketCard.stories.ts +335 -335
  134. package/src/stories/Laboratory/Chat/ChatBoxImage.stories.ts +82 -82
  135. package/src/stories/Laboratory/Chat/ChatMessage.stories.ts +198 -198
  136. package/src/stories/Laboratory/Chat/ChatMessageBadge.stories.ts +204 -204
  137. package/src/stories/Laboratory/Chat/ChatNotification.stories.ts +144 -144
  138. package/src/stories/Laboratory/Chat/ProgressLinear.stories.ts +186 -186
  139. package/src/stories/Laboratory/Chat/StatusNotification.stories.ts +111 -111
  140. package/src/stories/Laboratory/MainColumnsBar.stories.ts +48 -48
  141. package/src/stories/Laboratory/ProgressCircle.stories.ts +261 -261
  142. package/src/stories/Laboratory/SelectionColumnBar.stories.ts +234 -234
  143. package/src/stories/Laboratory/TagLabel.stories.ts +418 -418
  144. package/src/stories/Laboratory/TagLabelGroup.stories.ts +234 -234
  145. package/src/stories/Laboratory/Timeline.stories.ts +403 -403
  146. package/src/stories/NotificationBubble.stories.ts +194 -194
  147. package/src/stories/OtpInput.stories.ts +100 -100
  148. package/src/stories/PhoneInput.stories.ts +52 -52
  149. package/src/stories/Select.stories.ts +419 -419
  150. package/src/stories/TextArea.stories.ts +112 -112
  151. package/src/stories/TickBox.stories.ts +294 -294
  152. package/src/stories/v-icon.stories.ts +91 -91
  153. package/src/utils/index.ts +116 -109
  154. package/src/vite-env.d.ts +1 -1
  155. package/tests/e2e/README.md +220 -220
  156. package/tests/e2e/accessibility.spec.ts +638 -638
  157. package/tests/e2e/accordion.spec.ts +42 -42
  158. package/tests/e2e/additional-components.spec.ts +437 -437
  159. package/tests/e2e/all-components.spec.ts +135 -135
  160. package/tests/e2e/appointment-card.spec.ts +816 -816
  161. package/tests/e2e/button-fixed.spec.ts +58 -58
  162. package/tests/e2e/button.spec.ts +76 -76
  163. package/tests/e2e/checkbox.spec.ts +50 -50
  164. package/tests/e2e/date-input.spec.ts +46 -46
  165. package/tests/e2e/debug.spec.ts +51 -51
  166. package/tests/e2e/dialog.spec.ts +58 -58
  167. package/tests/e2e/input.spec.ts +55 -55
  168. package/tests/e2e/laboratory-components.spec.ts +320 -320
  169. package/tests/e2e/otp-input.spec.ts +50 -50
  170. package/tests/e2e/select.spec.ts +52 -52
  171. package/tests/e2e/storybook-utils.ts +59 -59
  172. package/tests/e2e/test-basic.spec.ts +33 -33
  173. package/tests/e2e/visual-regression.spec.ts +350 -350
  174. package/tests/unit/accessibility/component-a11y.spec.ts +469 -469
  175. package/tests/unit/components/Accordion/AccordionGroup.spec.ts +228 -228
  176. package/tests/unit/components/Accordion/AccordionGroup.spec.ts.skip +342 -342
  177. package/tests/unit/components/Accordion/AccordionItem.spec.ts +292 -292
  178. package/tests/unit/components/Accordion/AccordionItem.spec.ts.skip +383 -383
  179. package/tests/unit/components/Appointment/AnamneseNotification.spec.ts +176 -176
  180. package/tests/unit/components/Appointment/Card/Actions.spec.ts +407 -407
  181. package/tests/unit/components/Appointment/Card/Card.spec.ts +485 -485
  182. package/tests/unit/components/Appointment/Card/Details.spec.ts +397 -397
  183. package/tests/unit/components/Audio/Audio.spec.ts +403 -403
  184. package/tests/unit/components/Audio/Waveform.spec.ts +483 -483
  185. package/tests/unit/components/Background/Background.spec.ts +177 -177
  186. package/tests/unit/components/Core/Button.spec.ts +336 -336
  187. package/tests/unit/components/Core/Checkbox.spec.ts +544 -544
  188. package/tests/unit/components/Core/DateInput.spec.ts +690 -690
  189. package/tests/unit/components/Core/Dialog.spec.ts +485 -485
  190. package/tests/unit/components/Core/EditField.spec.ts +782 -782
  191. package/tests/unit/components/Core/Input.spec.ts +512 -512
  192. package/tests/unit/components/Core/Modal.spec.ts +518 -518
  193. package/tests/unit/components/Core/NotificationBubble.spec.ts +606 -606
  194. package/tests/unit/components/Core/OtpInput.spec.ts +708 -708
  195. package/tests/unit/components/Core/PhoneInput.spec.ts +619 -619
  196. package/tests/unit/components/Core/Select.spec.ts +712 -712
  197. package/tests/unit/components/Core/TextArea.spec.ts +565 -565
  198. package/tests/unit/components/Core/TickBox.spec.ts +779 -779
  199. package/tests/unit/components/ErrorPage/ErrorPage.spec.ts +313 -313
  200. package/tests/unit/components/ErrorPage/ErrorPageLogo.spec.ts +153 -153
  201. package/tests/unit/components/IconBullet/IconBullet.spec.ts +356 -356
  202. package/tests/unit/components/IconBullet/IconBulletList.spec.ts +371 -371
  203. package/tests/unit/components/Icons/AdvanceAppointments.spec.ts +61 -61
  204. package/tests/unit/components/Icons/Audio/CloudFailed.spec.ts +108 -108
  205. package/tests/unit/components/Icons/Audio/CloudSaved.spec.ts +149 -149
  206. package/tests/unit/components/Icons/Audio/Delete.spec.ts +158 -158
  207. package/tests/unit/components/Icons/Audio/Pause.spec.ts +208 -208
  208. package/tests/unit/components/Icons/Audio/Play.spec.ts +217 -217
  209. package/tests/unit/components/Icons/CalendarNotification.spec.ts +186 -186
  210. package/tests/unit/components/Icons/Chair.spec.ts +234 -234
  211. package/tests/unit/components/Icons/ChairNotification.spec.ts +311 -311
  212. package/tests/unit/components/Icons/Circle.spec.ts +255 -255
  213. package/tests/unit/components/Icons/FavIcon.spec.ts +251 -251
  214. package/tests/unit/components/Icons/FilledCircle.spec.ts +274 -274
  215. package/tests/unit/components/Icons/Group3.spec.ts +355 -355
  216. package/tests/unit/components/Icons/Logo.spec.ts +228 -228
  217. package/tests/unit/components/Icons/MiniLogo.spec.ts +38 -38
  218. package/tests/unit/components/Icons/RingNotification.spec.ts +393 -393
  219. package/tests/unit/components/Icons/SolidArrowRight.spec.ts +49 -49
  220. package/tests/unit/components/Icons/calendar.spec.ts +286 -286
  221. package/tests/unit/components/Icons/checkbox.spec.ts +315 -315
  222. package/tests/unit/components/Icons/outlineChecked.spec.ts +434 -434
  223. package/tests/unit/components/Icons/play.spec.ts +308 -308
  224. package/tests/unit/components/Laboratory/AppointmentCard.spec.ts +167 -167
  225. package/tests/unit/components/Laboratory/ChatBoxImage.spec.ts +179 -179
  226. package/tests/unit/components/Laboratory/ChatMessage.spec.ts +263 -263
  227. package/tests/unit/components/Laboratory/ChatMessageBadge.spec.ts +282 -282
  228. package/tests/unit/components/Laboratory/ChatNotification.spec.ts +256 -256
  229. package/tests/unit/components/Laboratory/DocumentCard.spec.ts +228 -228
  230. package/tests/unit/components/Laboratory/DocumentCardItem.spec.ts +236 -236
  231. package/tests/unit/components/Laboratory/InfoCard.spec.ts +308 -308
  232. package/tests/unit/components/Laboratory/MainColumnsBar.spec.ts +251 -251
  233. package/tests/unit/components/Laboratory/ProgressCircle.spec.ts +290 -290
  234. package/tests/unit/components/Laboratory/ProgressLinear.spec.ts +275 -275
  235. package/tests/unit/components/Laboratory/SelectionColumnBar.spec.ts +288 -288
  236. package/tests/unit/components/Laboratory/StatusNotification.spec.ts +296 -296
  237. package/tests/unit/components/Laboratory/TagLabel.spec.ts +353 -353
  238. package/tests/unit/components/Laboratory/TagLabelGroup.spec.ts +377 -377
  239. package/tests/unit/components/Laboratory/TicketCard.spec.ts +351 -351
  240. package/tests/unit/components/Laboratory/TimeLineEvent.spec.ts +381 -381
  241. package/tests/unit/components/Laboratory/Timeline.spec.ts +419 -419
  242. package/tests/unit/components/Loader/Loader.spec.ts +197 -197
  243. package/tests/unit/components/MaintenanceBanner/MaintenanceBanner.spec.ts +302 -302
  244. package/tests/unit/constants/iconEnums.spec.ts +39 -39
  245. package/tests/unit/i18n/i18n.spec.ts +88 -88
  246. package/tests/unit/plugins/vuetify.spec.ts +220 -220
  247. package/tests/unit/setup.ts +189 -189
  248. package/tests/unit/src/components/index.spec.ts.skip +192 -192
  249. package/tests/unit/src/index.spec.ts.skip +182 -182
  250. package/tests/unit/src/main.spec.ts +151 -151
  251. package/tests/unit/utils/accessibility.spec.ts +318 -318
  252. package/tsconfig.json +26 -26
  253. package/vite.config.ts +29 -29
  254. package/vitest.config.ts +83 -83
@@ -1,435 +1,435 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { mount } from '@vue/test-utils';
3
- import OutlineChecked from '@components/Icons/outlineChecked.vue';
4
-
5
- describe('OutlineChecked Icon', () => {
6
- describe('Rendering', () => {
7
- it('renders as SVG element', () => {
8
- const wrapper = mount(OutlineChecked);
9
- expect(wrapper.find('svg').exists()).toBe(true);
10
- });
11
-
12
- it('has correct SVG attributes', () => {
13
- const wrapper = mount(OutlineChecked);
14
- const svg = wrapper.find('svg');
15
-
16
- expect(svg.attributes('width')).toBe('25');
17
- expect(svg.attributes('height')).toBe('25');
18
- expect(svg.attributes('viewBox')).toBe('0 0 25 25');
19
- expect(svg.attributes('fill')).toBe('none');
20
- expect(svg.attributes('xmlns')).toBe('http://www.w3.org/2000/svg');
21
- });
22
-
23
- it('contains 2 rect elements and 1 path element', () => {
24
- const wrapper = mount(OutlineChecked);
25
- const rects = wrapper.findAll('rect');
26
- const paths = wrapper.findAll('path');
27
-
28
- expect(rects).toHaveLength(2);
29
- expect(paths).toHaveLength(1);
30
- });
31
- });
32
-
33
- describe('Rectangle Structure', () => {
34
- it('first rect represents white background', () => {
35
- const wrapper = mount(OutlineChecked);
36
- const rects = wrapper.findAll('rect');
37
-
38
- const backgroundRect = rects[0];
39
- expect(backgroundRect.attributes('x')).toBe('1');
40
- expect(backgroundRect.attributes('y')).toBe('1');
41
- expect(backgroundRect.attributes('width')).toBe('23');
42
- expect(backgroundRect.attributes('height')).toBe('23');
43
- expect(backgroundRect.attributes('rx')).toBe('3');
44
- expect(backgroundRect.attributes('fill')).toBe('white');
45
- });
46
-
47
- it('second rect represents border stroke', () => {
48
- const wrapper = mount(OutlineChecked);
49
- const rects = wrapper.findAll('rect');
50
-
51
- const borderRect = rects[1];
52
- expect(borderRect.attributes('x')).toBe('1');
53
- expect(borderRect.attributes('y')).toBe('1');
54
- expect(borderRect.attributes('width')).toBe('23');
55
- expect(borderRect.attributes('height')).toBe('23');
56
- expect(borderRect.attributes('rx')).toBe('3');
57
- expect(borderRect.attributes('stroke')).toBe('#172774');
58
- expect(borderRect.attributes('stroke-width')).toBe('2');
59
- });
60
-
61
- it('rects are positioned identically for layering', () => {
62
- const wrapper = mount(OutlineChecked);
63
- const rects = wrapper.findAll('rect');
64
-
65
- const rect1 = rects[0];
66
- const rect2 = rects[1];
67
-
68
- expect(rect1.attributes('x')).toBe(rect2.attributes('x'));
69
- expect(rect1.attributes('y')).toBe(rect2.attributes('y'));
70
- expect(rect1.attributes('width')).toBe(rect2.attributes('width'));
71
- expect(rect1.attributes('height')).toBe(rect2.attributes('height'));
72
- expect(rect1.attributes('rx')).toBe(rect2.attributes('rx'));
73
- });
74
- });
75
-
76
- describe('Checkmark Path', () => {
77
- it('path represents checkmark shape', () => {
78
- const wrapper = mount(OutlineChecked);
79
- const path = wrapper.find('path');
80
-
81
- const pathData = path.attributes('d');
82
- expect(pathData).toBe('M7.8125 12.9688L11.5625 16.7188L17.1875 8.28125');
83
- });
84
-
85
- it('checkmark has correct stroke properties', () => {
86
- const wrapper = mount(OutlineChecked);
87
- const path = wrapper.find('path');
88
-
89
- expect(path.attributes('stroke')).toBe('#172774');
90
- expect(path.attributes('stroke-width')).toBe('2.5');
91
- expect(path.attributes('stroke-linecap')).toBe('round');
92
- expect(path.attributes('stroke-linejoin')).toBe('round');
93
- });
94
-
95
- it('checkmark has proper geometric structure', () => {
96
- const wrapper = mount(OutlineChecked);
97
- const path = wrapper.find('path');
98
-
99
- const pathData = path.attributes('d');
100
- // Should move to start point, line to middle point, line to end point
101
- expect(pathData).toMatch(/^M\d+\.\d+\s+\d+\.\d+L\d+\.\d+\s+\d+\.\d+L\d+\.\d+\s+\d+\.\d+$/);
102
- });
103
-
104
- it('checkmark forms proper check shape', () => {
105
- const wrapper = mount(OutlineChecked);
106
- const path = wrapper.find('path');
107
-
108
- const pathData = path.attributes('d');
109
- // Start at left-middle, go to bottom-middle, then to top-right
110
- expect(pathData).toContain('7.8125 12.9688'); // Start point
111
- expect(pathData).toContain('11.5625 16.7188'); // Middle (bottom of check)
112
- expect(pathData).toContain('17.1875 8.28125'); // End point (top-right)
113
- });
114
- });
115
-
116
- describe('Visual Properties', () => {
117
- it('uses white background with brand color border', () => {
118
- const wrapper = mount(OutlineChecked);
119
- const rects = wrapper.findAll('rect');
120
-
121
- expect(rects[0].attributes('fill')).toBe('white');
122
- expect(rects[1].attributes('stroke')).toBe('#172774');
123
- });
124
-
125
- it('checkmark uses brand color', () => {
126
- const wrapper = mount(OutlineChecked);
127
- const path = wrapper.find('path');
128
-
129
- expect(path.attributes('stroke')).toBe('#172774');
130
- });
131
-
132
- it('svg container has no default fill', () => {
133
- const wrapper = mount(OutlineChecked);
134
- const svg = wrapper.find('svg');
135
-
136
- expect(svg.attributes('fill')).toBe('none');
137
- });
138
-
139
- it('uses appropriate stroke weights for visibility', () => {
140
- const wrapper = mount(OutlineChecked);
141
- const rects = wrapper.findAll('rect');
142
- const path = wrapper.find('path');
143
-
144
- // Border stroke
145
- expect(rects[1].attributes('stroke-width')).toBe('2');
146
-
147
- // Checkmark stroke (slightly thicker for visibility)
148
- expect(path.attributes('stroke-width')).toBe('2.5');
149
- });
150
- });
151
-
152
- describe('Dimensions', () => {
153
- it('uses square aspect ratio', () => {
154
- const wrapper = mount(OutlineChecked);
155
- const svg = wrapper.find('svg');
156
-
157
- expect(svg.attributes('width')).toBe('25');
158
- expect(svg.attributes('height')).toBe('25');
159
- });
160
-
161
- it('has correct viewBox dimensions', () => {
162
- const wrapper = mount(OutlineChecked);
163
- const svg = wrapper.find('svg');
164
-
165
- expect(svg.attributes('viewBox')).toBe('0 0 25 25');
166
- });
167
-
168
- it('rectangles account for stroke positioning', () => {
169
- const wrapper = mount(OutlineChecked);
170
- const rects = wrapper.findAll('rect');
171
-
172
- // Positioned at 1,1 with 23x23 size to account for 2px stroke
173
- expect(rects[0].attributes('x')).toBe('1');
174
- expect(rects[0].attributes('y')).toBe('1');
175
- expect(rects[0].attributes('width')).toBe('23');
176
- expect(rects[0].attributes('height')).toBe('23');
177
- });
178
-
179
- it('suitable for form checkbox size', () => {
180
- const wrapper = mount(OutlineChecked);
181
- const svg = wrapper.find('svg');
182
-
183
- // 25x25 is appropriate for form checkboxes
184
- expect(svg.attributes('width')).toBe('25');
185
- expect(svg.attributes('height')).toBe('25');
186
- });
187
- });
188
-
189
- describe('Checkbox Geometry', () => {
190
- it('checkbox fills most of viewBox', () => {
191
- const wrapper = mount(OutlineChecked);
192
- const rects = wrapper.findAll('rect');
193
-
194
- const rect = rects[0];
195
- const x = parseFloat(rect.attributes('x'));
196
- const y = parseFloat(rect.attributes('y'));
197
- const width = parseFloat(rect.attributes('width'));
198
- const height = parseFloat(rect.attributes('height'));
199
-
200
- // Should span from 1,1 to 24,24 (23x23 + 1px offset)
201
- expect(x + width).toBe(24);
202
- expect(y + height).toBe(24);
203
- });
204
-
205
- it('has rounded corners for modern appearance', () => {
206
- const wrapper = mount(OutlineChecked);
207
- const rects = wrapper.findAll('rect');
208
-
209
- rects.forEach(rect => {
210
- expect(rect.attributes('rx')).toBe('3');
211
- });
212
- });
213
-
214
- it('checkmark is properly centered and sized', () => {
215
- const wrapper = mount(OutlineChecked);
216
- const path = wrapper.find('path');
217
-
218
- const pathData = path.attributes('d');
219
-
220
- // Checkmark should be reasonably centered within the 25x25 box
221
- // Start point: 7.8125 (left side, ~31% from left)
222
- // Middle point: 11.5625, 16.7188 (center-left, bottom)
223
- // End point: 17.1875, 8.28125 (right side, top)
224
-
225
- expect(pathData).toMatch(/7\.8125.*17\.1875/); // Spans left to right
226
- expect(pathData).toMatch(/16\.7188.*8\.28125/); // Spans bottom to top
227
- });
228
- });
229
-
230
- describe('Component Structure', () => {
231
- it('represents checked state clearly', () => {
232
- const wrapper = mount(OutlineChecked);
233
- const rects = wrapper.findAll('rect');
234
- const path = wrapper.find('path');
235
-
236
- // White background with border = checkbox
237
- expect(rects[0].attributes('fill')).toBe('white');
238
- expect(rects[1].attributes('stroke')).toBeTruthy();
239
-
240
- // Visible checkmark = checked state
241
- expect(path.attributes('stroke')).toBeTruthy();
242
- });
243
-
244
- it('uses layered approach for clean appearance', () => {
245
- const wrapper = mount(OutlineChecked);
246
- const elements = wrapper.findAll('rect, path');
247
-
248
- // Background rect, border rect, then checkmark path
249
- expect(elements).toHaveLength(3);
250
- });
251
-
252
- it('suitable for form controls', () => {
253
- const wrapper = mount(OutlineChecked);
254
- const svg = wrapper.find('svg');
255
-
256
- // Standard size and appearance for form checkbox
257
- expect(svg.attributes('width')).toBe('25');
258
- expect(svg.attributes('height')).toBe('25');
259
- });
260
- });
261
-
262
- describe('Accessibility', () => {
263
- it('svg is properly structured for screen readers', () => {
264
- const wrapper = mount(OutlineChecked);
265
- const svg = wrapper.find('svg');
266
-
267
- expect(svg.element.tagName.toLowerCase()).toBe('svg');
268
- });
269
-
270
- it('provides clear checked state visual', () => {
271
- const wrapper = mount(OutlineChecked);
272
- const path = wrapper.find('path');
273
-
274
- // Clear checkmark indicates checked state
275
- expect(path.attributes('stroke')).toBe('#172774');
276
- expect(path.attributes('stroke-width')).toBe('2.5'); // Thick enough to be visible
277
- });
278
-
279
- it('uses high contrast for visibility', () => {
280
- const wrapper = mount(OutlineChecked);
281
- const rects = wrapper.findAll('rect');
282
- const path = wrapper.find('path');
283
-
284
- // White background with dark border and checkmark
285
- expect(rects[0].attributes('fill')).toBe('white');
286
- expect(rects[1].attributes('stroke')).toBe('#172774');
287
- expect(path.attributes('stroke')).toBe('#172774');
288
- });
289
-
290
- it('rounded corners provide friendly appearance', () => {
291
- const wrapper = mount(OutlineChecked);
292
- const rects = wrapper.findAll('rect');
293
-
294
- rects.forEach(rect => {
295
- expect(parseFloat(rect.attributes('rx'))).toBeGreaterThan(0);
296
- });
297
- });
298
- });
299
-
300
- describe('Component Integration', () => {
301
- it('can be mounted without props', () => {
302
- expect(() => {
303
- mount(OutlineChecked);
304
- }).not.toThrow();
305
- });
306
-
307
- it('renders consistently on multiple mounts', () => {
308
- const wrapper1 = mount(OutlineChecked);
309
- const wrapper2 = mount(OutlineChecked);
310
-
311
- expect(wrapper1.html()).toBe(wrapper2.html());
312
- });
313
-
314
- it('maintains checkbox structure integrity', () => {
315
- const wrapper = mount(OutlineChecked);
316
- const rects = wrapper.findAll('rect');
317
- const path = wrapper.find('path');
318
-
319
- expect(rects).toHaveLength(2);
320
- expect(path.exists()).toBe(true);
321
-
322
- rects.forEach(rect => {
323
- expect(rect.attributes('x')).toBeTruthy();
324
- expect(rect.attributes('y')).toBeTruthy();
325
- expect(rect.attributes('width')).toBeTruthy();
326
- expect(rect.attributes('height')).toBeTruthy();
327
- expect(rect.attributes('rx')).toBeTruthy();
328
- });
329
-
330
- expect(path.attributes('d')).toBeTruthy();
331
- expect(path.attributes('stroke')).toBeTruthy();
332
- });
333
-
334
- it('suitable for form checkbox implementations', () => {
335
- const wrapper = mount(OutlineChecked);
336
-
337
- // Standard checkbox requirements
338
- expect(wrapper.find('svg').attributes('width')).toBe('25');
339
- expect(wrapper.find('svg').attributes('height')).toBe('25');
340
- expect(wrapper.findAll('rect')[0].attributes('fill')).toBe('white');
341
- expect(wrapper.find('path').attributes('stroke')).toBe('#172774');
342
- });
343
- });
344
-
345
- describe('Icon Semantics', () => {
346
- it('represents checked/selected state', () => {
347
- const wrapper = mount(OutlineChecked);
348
- const path = wrapper.find('path');
349
- const rects = wrapper.findAll('rect');
350
-
351
- // Checkbox with visible checkmark = checked/selected
352
- expect(rects[0].attributes('fill')).toBe('white'); // Clean background
353
- expect(rects[1].attributes('stroke')).toBe('#172774'); // Defined border
354
- expect(path.attributes('stroke')).toBe('#172774'); // Visible checkmark
355
- });
356
-
357
- it('uses standard checkbox proportions', () => {
358
- const wrapper = mount(OutlineChecked);
359
- const svg = wrapper.find('svg');
360
-
361
- // Square checkbox is universal standard
362
- const width = svg.attributes('width');
363
- const height = svg.attributes('height');
364
- expect(width).toBe(height);
365
- });
366
-
367
- it('checkmark follows standard check pattern', () => {
368
- const wrapper = mount(OutlineChecked);
369
- const path = wrapper.find('path');
370
-
371
- const pathData = path.attributes('d');
372
- // Should go from left-middle, down-right, then up-right (standard check shape)
373
- const coords = pathData.match(/[\d.]+/g).map(parseFloat);
374
-
375
- // First point (start)
376
- const startX = coords[0];
377
- const startY = coords[1];
378
-
379
- // Second point (middle/bottom of check)
380
- const midX = coords[2];
381
- const midY = coords[3];
382
-
383
- // Third point (end/top-right)
384
- const endX = coords[4];
385
- const endY = coords[5];
386
-
387
- // Standard check: moves right and down, then right and up
388
- expect(midX).toBeGreaterThan(startX); // Moves right
389
- expect(midY).toBeGreaterThan(startY); // Moves down
390
- expect(endX).toBeGreaterThan(midX); // Continues right
391
- expect(endY).toBeLessThan(midY); // Moves up
392
- });
393
- });
394
-
395
- describe('Visual Design', () => {
396
- it('provides clear checked state appearance', () => {
397
- const wrapper = mount(OutlineChecked);
398
- const rects = wrapper.findAll('rect');
399
- const path = wrapper.find('path');
400
-
401
- // Clean white interior with defined border
402
- expect(rects[0].attributes('fill')).toBe('white');
403
- expect(rects[1].attributes('stroke')).toBe('#172774');
404
-
405
- // Prominent checkmark
406
- expect(path.attributes('stroke')).toBe('#172774');
407
- expect(parseFloat(path.attributes('stroke-width'))).toBeGreaterThan(2);
408
- });
409
-
410
- it('uses appropriate stroke weights for different elements', () => {
411
- const wrapper = mount(OutlineChecked);
412
- const rects = wrapper.findAll('rect');
413
- const path = wrapper.find('path');
414
-
415
- // Border uses standard weight
416
- expect(rects[1].attributes('stroke-width')).toBe('2');
417
-
418
- // Checkmark uses slightly heavier weight for visibility
419
- expect(path.attributes('stroke-width')).toBe('2.5');
420
- });
421
-
422
- it('maintains clean modern aesthetic', () => {
423
- const wrapper = mount(OutlineChecked);
424
- const rects = wrapper.findAll('rect');
425
- const path = wrapper.find('path');
426
-
427
- // Rounded corners for modern look
428
- expect(rects[0].attributes('rx')).toBe('3');
429
-
430
- // Smooth line caps and joins
431
- expect(path.attributes('stroke-linecap')).toBe('round');
432
- expect(path.attributes('stroke-linejoin')).toBe('round');
433
- });
434
- });
1
+ import { describe, it, expect } from 'vitest';
2
+ import { mount } from '@vue/test-utils';
3
+ import OutlineChecked from '@components/Icons/outlineChecked.vue';
4
+
5
+ describe('OutlineChecked Icon', () => {
6
+ describe('Rendering', () => {
7
+ it('renders as SVG element', () => {
8
+ const wrapper = mount(OutlineChecked);
9
+ expect(wrapper.find('svg').exists()).toBe(true);
10
+ });
11
+
12
+ it('has correct SVG attributes', () => {
13
+ const wrapper = mount(OutlineChecked);
14
+ const svg = wrapper.find('svg');
15
+
16
+ expect(svg.attributes('width')).toBe('25');
17
+ expect(svg.attributes('height')).toBe('25');
18
+ expect(svg.attributes('viewBox')).toBe('0 0 25 25');
19
+ expect(svg.attributes('fill')).toBe('none');
20
+ expect(svg.attributes('xmlns')).toBe('http://www.w3.org/2000/svg');
21
+ });
22
+
23
+ it('contains 2 rect elements and 1 path element', () => {
24
+ const wrapper = mount(OutlineChecked);
25
+ const rects = wrapper.findAll('rect');
26
+ const paths = wrapper.findAll('path');
27
+
28
+ expect(rects).toHaveLength(2);
29
+ expect(paths).toHaveLength(1);
30
+ });
31
+ });
32
+
33
+ describe('Rectangle Structure', () => {
34
+ it('first rect represents white background', () => {
35
+ const wrapper = mount(OutlineChecked);
36
+ const rects = wrapper.findAll('rect');
37
+
38
+ const backgroundRect = rects[0];
39
+ expect(backgroundRect.attributes('x')).toBe('1');
40
+ expect(backgroundRect.attributes('y')).toBe('1');
41
+ expect(backgroundRect.attributes('width')).toBe('23');
42
+ expect(backgroundRect.attributes('height')).toBe('23');
43
+ expect(backgroundRect.attributes('rx')).toBe('3');
44
+ expect(backgroundRect.attributes('fill')).toBe('white');
45
+ });
46
+
47
+ it('second rect represents border stroke', () => {
48
+ const wrapper = mount(OutlineChecked);
49
+ const rects = wrapper.findAll('rect');
50
+
51
+ const borderRect = rects[1];
52
+ expect(borderRect.attributes('x')).toBe('1');
53
+ expect(borderRect.attributes('y')).toBe('1');
54
+ expect(borderRect.attributes('width')).toBe('23');
55
+ expect(borderRect.attributes('height')).toBe('23');
56
+ expect(borderRect.attributes('rx')).toBe('3');
57
+ expect(borderRect.attributes('stroke')).toBe('#172774');
58
+ expect(borderRect.attributes('stroke-width')).toBe('2');
59
+ });
60
+
61
+ it('rects are positioned identically for layering', () => {
62
+ const wrapper = mount(OutlineChecked);
63
+ const rects = wrapper.findAll('rect');
64
+
65
+ const rect1 = rects[0];
66
+ const rect2 = rects[1];
67
+
68
+ expect(rect1.attributes('x')).toBe(rect2.attributes('x'));
69
+ expect(rect1.attributes('y')).toBe(rect2.attributes('y'));
70
+ expect(rect1.attributes('width')).toBe(rect2.attributes('width'));
71
+ expect(rect1.attributes('height')).toBe(rect2.attributes('height'));
72
+ expect(rect1.attributes('rx')).toBe(rect2.attributes('rx'));
73
+ });
74
+ });
75
+
76
+ describe('Checkmark Path', () => {
77
+ it('path represents checkmark shape', () => {
78
+ const wrapper = mount(OutlineChecked);
79
+ const path = wrapper.find('path');
80
+
81
+ const pathData = path.attributes('d');
82
+ expect(pathData).toBe('M7.8125 12.9688L11.5625 16.7188L17.1875 8.28125');
83
+ });
84
+
85
+ it('checkmark has correct stroke properties', () => {
86
+ const wrapper = mount(OutlineChecked);
87
+ const path = wrapper.find('path');
88
+
89
+ expect(path.attributes('stroke')).toBe('#172774');
90
+ expect(path.attributes('stroke-width')).toBe('2.5');
91
+ expect(path.attributes('stroke-linecap')).toBe('round');
92
+ expect(path.attributes('stroke-linejoin')).toBe('round');
93
+ });
94
+
95
+ it('checkmark has proper geometric structure', () => {
96
+ const wrapper = mount(OutlineChecked);
97
+ const path = wrapper.find('path');
98
+
99
+ const pathData = path.attributes('d');
100
+ // Should move to start point, line to middle point, line to end point
101
+ expect(pathData).toMatch(/^M\d+\.\d+\s+\d+\.\d+L\d+\.\d+\s+\d+\.\d+L\d+\.\d+\s+\d+\.\d+$/);
102
+ });
103
+
104
+ it('checkmark forms proper check shape', () => {
105
+ const wrapper = mount(OutlineChecked);
106
+ const path = wrapper.find('path');
107
+
108
+ const pathData = path.attributes('d');
109
+ // Start at left-middle, go to bottom-middle, then to top-right
110
+ expect(pathData).toContain('7.8125 12.9688'); // Start point
111
+ expect(pathData).toContain('11.5625 16.7188'); // Middle (bottom of check)
112
+ expect(pathData).toContain('17.1875 8.28125'); // End point (top-right)
113
+ });
114
+ });
115
+
116
+ describe('Visual Properties', () => {
117
+ it('uses white background with brand color border', () => {
118
+ const wrapper = mount(OutlineChecked);
119
+ const rects = wrapper.findAll('rect');
120
+
121
+ expect(rects[0].attributes('fill')).toBe('white');
122
+ expect(rects[1].attributes('stroke')).toBe('#172774');
123
+ });
124
+
125
+ it('checkmark uses brand color', () => {
126
+ const wrapper = mount(OutlineChecked);
127
+ const path = wrapper.find('path');
128
+
129
+ expect(path.attributes('stroke')).toBe('#172774');
130
+ });
131
+
132
+ it('svg container has no default fill', () => {
133
+ const wrapper = mount(OutlineChecked);
134
+ const svg = wrapper.find('svg');
135
+
136
+ expect(svg.attributes('fill')).toBe('none');
137
+ });
138
+
139
+ it('uses appropriate stroke weights for visibility', () => {
140
+ const wrapper = mount(OutlineChecked);
141
+ const rects = wrapper.findAll('rect');
142
+ const path = wrapper.find('path');
143
+
144
+ // Border stroke
145
+ expect(rects[1].attributes('stroke-width')).toBe('2');
146
+
147
+ // Checkmark stroke (slightly thicker for visibility)
148
+ expect(path.attributes('stroke-width')).toBe('2.5');
149
+ });
150
+ });
151
+
152
+ describe('Dimensions', () => {
153
+ it('uses square aspect ratio', () => {
154
+ const wrapper = mount(OutlineChecked);
155
+ const svg = wrapper.find('svg');
156
+
157
+ expect(svg.attributes('width')).toBe('25');
158
+ expect(svg.attributes('height')).toBe('25');
159
+ });
160
+
161
+ it('has correct viewBox dimensions', () => {
162
+ const wrapper = mount(OutlineChecked);
163
+ const svg = wrapper.find('svg');
164
+
165
+ expect(svg.attributes('viewBox')).toBe('0 0 25 25');
166
+ });
167
+
168
+ it('rectangles account for stroke positioning', () => {
169
+ const wrapper = mount(OutlineChecked);
170
+ const rects = wrapper.findAll('rect');
171
+
172
+ // Positioned at 1,1 with 23x23 size to account for 2px stroke
173
+ expect(rects[0].attributes('x')).toBe('1');
174
+ expect(rects[0].attributes('y')).toBe('1');
175
+ expect(rects[0].attributes('width')).toBe('23');
176
+ expect(rects[0].attributes('height')).toBe('23');
177
+ });
178
+
179
+ it('suitable for form checkbox size', () => {
180
+ const wrapper = mount(OutlineChecked);
181
+ const svg = wrapper.find('svg');
182
+
183
+ // 25x25 is appropriate for form checkboxes
184
+ expect(svg.attributes('width')).toBe('25');
185
+ expect(svg.attributes('height')).toBe('25');
186
+ });
187
+ });
188
+
189
+ describe('Checkbox Geometry', () => {
190
+ it('checkbox fills most of viewBox', () => {
191
+ const wrapper = mount(OutlineChecked);
192
+ const rects = wrapper.findAll('rect');
193
+
194
+ const rect = rects[0];
195
+ const x = parseFloat(rect.attributes('x'));
196
+ const y = parseFloat(rect.attributes('y'));
197
+ const width = parseFloat(rect.attributes('width'));
198
+ const height = parseFloat(rect.attributes('height'));
199
+
200
+ // Should span from 1,1 to 24,24 (23x23 + 1px offset)
201
+ expect(x + width).toBe(24);
202
+ expect(y + height).toBe(24);
203
+ });
204
+
205
+ it('has rounded corners for modern appearance', () => {
206
+ const wrapper = mount(OutlineChecked);
207
+ const rects = wrapper.findAll('rect');
208
+
209
+ rects.forEach(rect => {
210
+ expect(rect.attributes('rx')).toBe('3');
211
+ });
212
+ });
213
+
214
+ it('checkmark is properly centered and sized', () => {
215
+ const wrapper = mount(OutlineChecked);
216
+ const path = wrapper.find('path');
217
+
218
+ const pathData = path.attributes('d');
219
+
220
+ // Checkmark should be reasonably centered within the 25x25 box
221
+ // Start point: 7.8125 (left side, ~31% from left)
222
+ // Middle point: 11.5625, 16.7188 (center-left, bottom)
223
+ // End point: 17.1875, 8.28125 (right side, top)
224
+
225
+ expect(pathData).toMatch(/7\.8125.*17\.1875/); // Spans left to right
226
+ expect(pathData).toMatch(/16\.7188.*8\.28125/); // Spans bottom to top
227
+ });
228
+ });
229
+
230
+ describe('Component Structure', () => {
231
+ it('represents checked state clearly', () => {
232
+ const wrapper = mount(OutlineChecked);
233
+ const rects = wrapper.findAll('rect');
234
+ const path = wrapper.find('path');
235
+
236
+ // White background with border = checkbox
237
+ expect(rects[0].attributes('fill')).toBe('white');
238
+ expect(rects[1].attributes('stroke')).toBeTruthy();
239
+
240
+ // Visible checkmark = checked state
241
+ expect(path.attributes('stroke')).toBeTruthy();
242
+ });
243
+
244
+ it('uses layered approach for clean appearance', () => {
245
+ const wrapper = mount(OutlineChecked);
246
+ const elements = wrapper.findAll('rect, path');
247
+
248
+ // Background rect, border rect, then checkmark path
249
+ expect(elements).toHaveLength(3);
250
+ });
251
+
252
+ it('suitable for form controls', () => {
253
+ const wrapper = mount(OutlineChecked);
254
+ const svg = wrapper.find('svg');
255
+
256
+ // Standard size and appearance for form checkbox
257
+ expect(svg.attributes('width')).toBe('25');
258
+ expect(svg.attributes('height')).toBe('25');
259
+ });
260
+ });
261
+
262
+ describe('Accessibility', () => {
263
+ it('svg is properly structured for screen readers', () => {
264
+ const wrapper = mount(OutlineChecked);
265
+ const svg = wrapper.find('svg');
266
+
267
+ expect(svg.element.tagName.toLowerCase()).toBe('svg');
268
+ });
269
+
270
+ it('provides clear checked state visual', () => {
271
+ const wrapper = mount(OutlineChecked);
272
+ const path = wrapper.find('path');
273
+
274
+ // Clear checkmark indicates checked state
275
+ expect(path.attributes('stroke')).toBe('#172774');
276
+ expect(path.attributes('stroke-width')).toBe('2.5'); // Thick enough to be visible
277
+ });
278
+
279
+ it('uses high contrast for visibility', () => {
280
+ const wrapper = mount(OutlineChecked);
281
+ const rects = wrapper.findAll('rect');
282
+ const path = wrapper.find('path');
283
+
284
+ // White background with dark border and checkmark
285
+ expect(rects[0].attributes('fill')).toBe('white');
286
+ expect(rects[1].attributes('stroke')).toBe('#172774');
287
+ expect(path.attributes('stroke')).toBe('#172774');
288
+ });
289
+
290
+ it('rounded corners provide friendly appearance', () => {
291
+ const wrapper = mount(OutlineChecked);
292
+ const rects = wrapper.findAll('rect');
293
+
294
+ rects.forEach(rect => {
295
+ expect(parseFloat(rect.attributes('rx'))).toBeGreaterThan(0);
296
+ });
297
+ });
298
+ });
299
+
300
+ describe('Component Integration', () => {
301
+ it('can be mounted without props', () => {
302
+ expect(() => {
303
+ mount(OutlineChecked);
304
+ }).not.toThrow();
305
+ });
306
+
307
+ it('renders consistently on multiple mounts', () => {
308
+ const wrapper1 = mount(OutlineChecked);
309
+ const wrapper2 = mount(OutlineChecked);
310
+
311
+ expect(wrapper1.html()).toBe(wrapper2.html());
312
+ });
313
+
314
+ it('maintains checkbox structure integrity', () => {
315
+ const wrapper = mount(OutlineChecked);
316
+ const rects = wrapper.findAll('rect');
317
+ const path = wrapper.find('path');
318
+
319
+ expect(rects).toHaveLength(2);
320
+ expect(path.exists()).toBe(true);
321
+
322
+ rects.forEach(rect => {
323
+ expect(rect.attributes('x')).toBeTruthy();
324
+ expect(rect.attributes('y')).toBeTruthy();
325
+ expect(rect.attributes('width')).toBeTruthy();
326
+ expect(rect.attributes('height')).toBeTruthy();
327
+ expect(rect.attributes('rx')).toBeTruthy();
328
+ });
329
+
330
+ expect(path.attributes('d')).toBeTruthy();
331
+ expect(path.attributes('stroke')).toBeTruthy();
332
+ });
333
+
334
+ it('suitable for form checkbox implementations', () => {
335
+ const wrapper = mount(OutlineChecked);
336
+
337
+ // Standard checkbox requirements
338
+ expect(wrapper.find('svg').attributes('width')).toBe('25');
339
+ expect(wrapper.find('svg').attributes('height')).toBe('25');
340
+ expect(wrapper.findAll('rect')[0].attributes('fill')).toBe('white');
341
+ expect(wrapper.find('path').attributes('stroke')).toBe('#172774');
342
+ });
343
+ });
344
+
345
+ describe('Icon Semantics', () => {
346
+ it('represents checked/selected state', () => {
347
+ const wrapper = mount(OutlineChecked);
348
+ const path = wrapper.find('path');
349
+ const rects = wrapper.findAll('rect');
350
+
351
+ // Checkbox with visible checkmark = checked/selected
352
+ expect(rects[0].attributes('fill')).toBe('white'); // Clean background
353
+ expect(rects[1].attributes('stroke')).toBe('#172774'); // Defined border
354
+ expect(path.attributes('stroke')).toBe('#172774'); // Visible checkmark
355
+ });
356
+
357
+ it('uses standard checkbox proportions', () => {
358
+ const wrapper = mount(OutlineChecked);
359
+ const svg = wrapper.find('svg');
360
+
361
+ // Square checkbox is universal standard
362
+ const width = svg.attributes('width');
363
+ const height = svg.attributes('height');
364
+ expect(width).toBe(height);
365
+ });
366
+
367
+ it('checkmark follows standard check pattern', () => {
368
+ const wrapper = mount(OutlineChecked);
369
+ const path = wrapper.find('path');
370
+
371
+ const pathData = path.attributes('d');
372
+ // Should go from left-middle, down-right, then up-right (standard check shape)
373
+ const coords = pathData.match(/[\d.]+/g).map(parseFloat);
374
+
375
+ // First point (start)
376
+ const startX = coords[0];
377
+ const startY = coords[1];
378
+
379
+ // Second point (middle/bottom of check)
380
+ const midX = coords[2];
381
+ const midY = coords[3];
382
+
383
+ // Third point (end/top-right)
384
+ const endX = coords[4];
385
+ const endY = coords[5];
386
+
387
+ // Standard check: moves right and down, then right and up
388
+ expect(midX).toBeGreaterThan(startX); // Moves right
389
+ expect(midY).toBeGreaterThan(startY); // Moves down
390
+ expect(endX).toBeGreaterThan(midX); // Continues right
391
+ expect(endY).toBeLessThan(midY); // Moves up
392
+ });
393
+ });
394
+
395
+ describe('Visual Design', () => {
396
+ it('provides clear checked state appearance', () => {
397
+ const wrapper = mount(OutlineChecked);
398
+ const rects = wrapper.findAll('rect');
399
+ const path = wrapper.find('path');
400
+
401
+ // Clean white interior with defined border
402
+ expect(rects[0].attributes('fill')).toBe('white');
403
+ expect(rects[1].attributes('stroke')).toBe('#172774');
404
+
405
+ // Prominent checkmark
406
+ expect(path.attributes('stroke')).toBe('#172774');
407
+ expect(parseFloat(path.attributes('stroke-width'))).toBeGreaterThan(2);
408
+ });
409
+
410
+ it('uses appropriate stroke weights for different elements', () => {
411
+ const wrapper = mount(OutlineChecked);
412
+ const rects = wrapper.findAll('rect');
413
+ const path = wrapper.find('path');
414
+
415
+ // Border uses standard weight
416
+ expect(rects[1].attributes('stroke-width')).toBe('2');
417
+
418
+ // Checkmark uses slightly heavier weight for visibility
419
+ expect(path.attributes('stroke-width')).toBe('2.5');
420
+ });
421
+
422
+ it('maintains clean modern aesthetic', () => {
423
+ const wrapper = mount(OutlineChecked);
424
+ const rects = wrapper.findAll('rect');
425
+ const path = wrapper.find('path');
426
+
427
+ // Rounded corners for modern look
428
+ expect(rects[0].attributes('rx')).toBe('3');
429
+
430
+ // Smooth line caps and joins
431
+ expect(path.attributes('stroke-linecap')).toBe('round');
432
+ expect(path.attributes('stroke-linejoin')).toBe('round');
433
+ });
434
+ });
435
435
  });