@zap-wunschlachen/wl-shared-components 1.0.76 → 1.0.78

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 (227) hide show
  1. package/.github/workflows/playwright.yml +229 -229
  2. package/.github/workflows/static.yml +61 -61
  3. package/.github/workflows/update-snapshots.yml +37 -37
  4. package/.prettierrc.json +8 -8
  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 +139 -139
  10. package/README.md +56 -56
  11. package/docs/assets.md +62 -62
  12. package/heroicons.ts +75 -75
  13. package/index.html +19 -19
  14. package/package.json +71 -71
  15. package/playwright.config.ts +48 -48
  16. package/public/background.svg +60 -60
  17. package/public/style.css +187 -187
  18. package/public/technologies.svg +22 -22
  19. package/scripts/check-translations.ts +352 -352
  20. package/src/assets/css/base.css +242 -242
  21. package/src/assets/css/variables.css +176 -176
  22. package/src/components/Accordion/Accordion.css +65 -65
  23. package/src/components/Accordion/AccordionGroup.vue +88 -88
  24. package/src/components/Accordion/AccordionItem.vue +272 -272
  25. package/src/components/Accordion/presets/default.css +4 -4
  26. package/src/components/Accordion/presets/elevated.css +25 -25
  27. package/src/components/Accordion/presets/filled.css +26 -26
  28. package/src/components/Accordion/presets/index.css +5 -5
  29. package/src/components/Accordion/presets/plain.css +34 -34
  30. package/src/components/Appointment/Card/Actions.css +54 -54
  31. package/src/components/Appointment/Card/Actions.vue +99 -99
  32. package/src/components/Appointment/Card/AnamneseNotification.css +20 -20
  33. package/src/components/Appointment/Card/AnamneseNotification.vue +23 -23
  34. package/src/components/Appointment/Card/Card.css +99 -99
  35. package/src/components/Appointment/Card/Card.vue +97 -97
  36. package/src/components/Appointment/Card/Details.css +62 -62
  37. package/src/components/Appointment/Card/Details.vue +44 -44
  38. package/src/components/Audio/Audio.vue +187 -187
  39. package/src/components/Audio/Waveform.vue +118 -118
  40. package/src/components/Banner/Banner.css +29 -29
  41. package/src/components/Banner/Banner.vue +89 -89
  42. package/src/components/Button/Button.vue +257 -257
  43. package/src/components/CheckBox/CheckBox.css +234 -234
  44. package/src/components/CheckBox/Checkbox.vue +184 -184
  45. package/src/components/DateInput/DateInput.css +2 -2
  46. package/src/components/DateInput/DateInput.vue +376 -370
  47. package/src/components/Dialog/Dialog.css +6 -6
  48. package/src/components/Dialog/Dialog.vue +46 -46
  49. package/src/components/EditField/EditField.css +19 -19
  50. package/src/components/EditField/EditField.vue +211 -211
  51. package/src/components/ErrorPage/ErrorPage.css +172 -172
  52. package/src/components/IconBullet/IconBullet.vue +104 -104
  53. package/src/components/IconBullet/IconBulletList.vue +55 -55
  54. package/src/components/Icons/AdvanceAppointments.vue +161 -161
  55. package/src/components/Icons/Audio/CloudFailed.vue +27 -27
  56. package/src/components/Icons/Audio/CloudSaved.vue +28 -28
  57. package/src/components/Icons/Audio/Delete.vue +22 -22
  58. package/src/components/Icons/Audio/Pause.vue +25 -25
  59. package/src/components/Icons/Audio/Play.vue +22 -22
  60. package/src/components/Icons/Calendar.vue +28 -28
  61. package/src/components/Icons/CalendarNotification.vue +137 -137
  62. package/src/components/Icons/Chair.vue +43 -43
  63. package/src/components/Icons/ChairNotification.vue +46 -46
  64. package/src/components/Icons/Circle.vue +66 -66
  65. package/src/components/Icons/FavIcon.vue +69 -69
  66. package/src/components/Icons/FilledCircle.vue +11 -11
  67. package/src/components/Icons/Group3.vue +57 -57
  68. package/src/components/Icons/Play.vue +16 -16
  69. package/src/components/Icons/RingNotification.vue +65 -65
  70. package/src/components/Icons/SolidArrowRight.vue +14 -14
  71. package/src/components/Icons/checkbox.vue +19 -19
  72. package/src/components/Icons/outlineChecked.vue +38 -38
  73. package/src/components/Input/Input.css +234 -234
  74. package/src/components/Input/Input.vue +281 -281
  75. package/src/components/Laboratory/AppointmentCard/AppointmentCard.css +7 -7
  76. package/src/components/Laboratory/AppointmentCard/AppointmentCard.vue +116 -116
  77. package/src/components/Laboratory/ChatBoxImage/ChatBoxImage.vue +81 -81
  78. package/src/components/Laboratory/ChatMessage/ChatMessage.vue +113 -113
  79. package/src/components/Laboratory/ChatMessage/ChatMessageBadge.css +4 -4
  80. package/src/components/Laboratory/ChatMessage/ChatMessageBadge.vue +99 -99
  81. package/src/components/Laboratory/ChatNotification/ChatNotification.vue +130 -130
  82. package/src/components/Laboratory/DocumentCard/DocumentCard.css +3 -3
  83. package/src/components/Laboratory/DocumentCard/DocumentCard.vue +50 -50
  84. package/src/components/Laboratory/DocumentCard/DocumentCardItem.vue +53 -53
  85. package/src/components/Laboratory/InfoCard/InfoCard.vue +162 -162
  86. package/src/components/Laboratory/MainColumnsBar/MainColumnsBar.vue +102 -102
  87. package/src/components/Laboratory/ProgressCircle/ProgressCircle.vue +152 -152
  88. package/src/components/Laboratory/ProgressLinear/ProgressLinear.css +33 -33
  89. package/src/components/Laboratory/ProgressLinear/ProgressLinear.vue +75 -75
  90. package/src/components/Laboratory/SelectionColumnBar/SelectionColumnBar.vue +92 -92
  91. package/src/components/Laboratory/StatusNotification/StatusNotification.vue +49 -49
  92. package/src/components/Laboratory/TagLabel/TagLabel.vue +126 -126
  93. package/src/components/Laboratory/TagLabelGroup/TagLabelGroup.vue +97 -97
  94. package/src/components/Laboratory/TicketCard/TicketCard.css +3 -3
  95. package/src/components/Laboratory/TicketCard/TicketCard.vue +143 -143
  96. package/src/components/Laboratory/TimeLine/TimeLineEvent.css +18 -18
  97. package/src/components/Laboratory/TimeLine/TimeLineEvent.vue +119 -119
  98. package/src/components/Laboratory/TimeLine/Timeline.css +4 -4
  99. package/src/components/Laboratory/TimeLine/Timeline.vue +30 -30
  100. package/src/components/Loader/Loader.css +78 -78
  101. package/src/components/MaintenanceBanner/MaintenanceBanner.css +353 -353
  102. package/src/components/MaintenanceBanner/MaintenanceBanner.vue +140 -140
  103. package/src/components/MaintenanceBanner/MaintenanceIllustration.vue +54 -54
  104. package/src/components/Modal/Modal.css +5 -5
  105. package/src/components/Modal/Modal.vue +29 -29
  106. package/src/components/NotificationBubble/NotificationBubble.css +4 -4
  107. package/src/components/NotificationBubble/NotificationBubble.vue +90 -90
  108. package/src/components/OtpInput/OtpInput.css +43 -43
  109. package/src/components/OtpInput/OtpInput.vue +181 -181
  110. package/src/components/PhoneInput/PhoneInput.css +151 -126
  111. package/src/components/PhoneInput/PhoneInput.vue +230 -139
  112. package/src/components/RadioGroup/RadioGroup.css +65 -0
  113. package/src/components/RadioGroup/RadioGroup.vue +134 -0
  114. package/src/components/Select/Select.css +172 -172
  115. package/src/components/Select/Select.vue +377 -377
  116. package/src/components/SelectAutocomplete/SelectAutocomplete.css +172 -172
  117. package/src/components/SelectAutocomplete/SelectAutocomplete.vue +414 -414
  118. package/src/components/TextArea/TextArea.css +269 -269
  119. package/src/components/TextArea/TextArea.vue +207 -207
  120. package/src/components/TickBox/TickBox.css +116 -116
  121. package/src/components/TickBox/TickBox.vue +172 -172
  122. package/src/components/Tile/Tile.css +106 -106
  123. package/src/components/Tile/Tile.vue +173 -173
  124. package/src/components/accessibility.css +218 -218
  125. package/src/components/index.ts +110 -109
  126. package/src/constants/iconEnums.ts +3 -3
  127. package/src/i18n/i18n.ts +15 -15
  128. package/src/i18n/locales/de.json +30 -30
  129. package/src/i18n/locales/en.json +30 -30
  130. package/src/index.ts +43 -43
  131. package/src/main.ts +11 -11
  132. package/src/pages/AccordionGroupPage.vue +873 -873
  133. package/src/pages/AllPage.vue +2483 -2365
  134. package/src/pages/SelectPage.vue +1302 -1302
  135. package/src/pages/TilePage.vue +902 -902
  136. package/src/plugins/vuetify.ts +54 -54
  137. package/src/shims-vue.d.ts +30 -30
  138. package/src/utils/index.ts +733 -733
  139. package/src/vite-env.d.ts +1 -1
  140. package/tests/unit/accessibility/component-a11y.spec.ts +657 -657
  141. package/tests/unit/components/Accordion/AccordionGroup.spec.ts +228 -228
  142. package/tests/unit/components/Accordion/AccordionItem.spec.ts +257 -257
  143. package/tests/unit/components/Appointment/AnamneseNotification.spec.ts +176 -176
  144. package/tests/unit/components/Appointment/Card/Actions.spec.ts +436 -436
  145. package/tests/unit/components/Appointment/Card/Card.spec.ts +531 -531
  146. package/tests/unit/components/Appointment/Card/Details.spec.ts +395 -395
  147. package/tests/unit/components/Audio/Audio.spec.ts +403 -403
  148. package/tests/unit/components/Audio/Waveform.spec.ts +483 -483
  149. package/tests/unit/components/Background/Background.spec.ts +177 -177
  150. package/tests/unit/components/Core/AnamneseAnswerDialog.spec.ts +344 -0
  151. package/tests/unit/components/Core/Banner.spec.ts +187 -0
  152. package/tests/unit/components/Core/Button.spec.ts +346 -346
  153. package/tests/unit/components/Core/Checkbox.spec.ts +544 -544
  154. package/tests/unit/components/Core/DateInput.spec.ts +702 -702
  155. package/tests/unit/components/Core/Dialog.spec.ts +448 -448
  156. package/tests/unit/components/Core/EditField.spec.ts +541 -541
  157. package/tests/unit/components/Core/Input.spec.ts +512 -512
  158. package/tests/unit/components/Core/List.spec.ts +163 -0
  159. package/tests/unit/components/Core/ListItem.spec.ts +205 -0
  160. package/tests/unit/components/Core/Modal.spec.ts +518 -518
  161. package/tests/unit/components/Core/NotificationBubble.spec.ts +606 -606
  162. package/tests/unit/components/Core/OtpInput.spec.ts +708 -708
  163. package/tests/unit/components/Core/PhoneInput.spec.ts +757 -619
  164. package/tests/unit/components/Core/RadioGroup.spec.ts +318 -0
  165. package/tests/unit/components/Core/Select.spec.ts +712 -712
  166. package/tests/unit/components/Core/SelectAutocomplete.spec.ts +361 -0
  167. package/tests/unit/components/Core/TextArea.spec.ts +565 -565
  168. package/tests/unit/components/Core/TickBox.spec.ts +836 -836
  169. package/tests/unit/components/Core/Tile.spec.ts +286 -0
  170. package/tests/unit/components/DateInput/DateInput.spec.ts +128 -0
  171. package/tests/unit/components/ErrorPage/ErrorPage.spec.ts +313 -313
  172. package/tests/unit/components/ErrorPage/ErrorPageLogo.spec.ts +153 -153
  173. package/tests/unit/components/IconBullet/IconBullet.spec.ts +356 -356
  174. package/tests/unit/components/IconBullet/IconBulletList.spec.ts +371 -371
  175. package/tests/unit/components/Icons/AdvanceAppointments.spec.ts +186 -186
  176. package/tests/unit/components/Icons/Audio/CloudFailed.spec.ts +108 -108
  177. package/tests/unit/components/Icons/Audio/CloudSaved.spec.ts +149 -149
  178. package/tests/unit/components/Icons/Audio/Delete.spec.ts +158 -158
  179. package/tests/unit/components/Icons/Audio/Pause.spec.ts +208 -208
  180. package/tests/unit/components/Icons/Audio/Play.spec.ts +217 -217
  181. package/tests/unit/components/Icons/CalendarNotification.spec.ts +193 -193
  182. package/tests/unit/components/Icons/Chair.spec.ts +241 -241
  183. package/tests/unit/components/Icons/ChairNotification.spec.ts +318 -318
  184. package/tests/unit/components/Icons/Circle.spec.ts +255 -255
  185. package/tests/unit/components/Icons/FavIcon.spec.ts +259 -259
  186. package/tests/unit/components/Icons/FilledCircle.spec.ts +274 -274
  187. package/tests/unit/components/Icons/Group3.spec.ts +362 -362
  188. package/tests/unit/components/Icons/Logo.spec.ts +229 -229
  189. package/tests/unit/components/Icons/MiniLogo.spec.ts +38 -38
  190. package/tests/unit/components/Icons/RingNotification.spec.ts +400 -400
  191. package/tests/unit/components/Icons/SolidArrowRight.spec.ts +49 -49
  192. package/tests/unit/components/Icons/calendar.spec.ts +293 -293
  193. package/tests/unit/components/Icons/checkbox.spec.ts +315 -315
  194. package/tests/unit/components/Icons/outlineChecked.spec.ts +441 -441
  195. package/tests/unit/components/Icons/play.spec.ts +315 -315
  196. package/tests/unit/components/Laboratory/AppointmentCard.spec.ts +167 -167
  197. package/tests/unit/components/Laboratory/ChatBoxImage.spec.ts +179 -179
  198. package/tests/unit/components/Laboratory/ChatMessage.spec.ts +263 -263
  199. package/tests/unit/components/Laboratory/ChatMessageBadge.spec.ts +282 -282
  200. package/tests/unit/components/Laboratory/ChatNotification.spec.ts +256 -256
  201. package/tests/unit/components/Laboratory/DocumentCard.spec.ts +228 -228
  202. package/tests/unit/components/Laboratory/DocumentCardItem.spec.ts +236 -236
  203. package/tests/unit/components/Laboratory/InfoCard.spec.ts +308 -308
  204. package/tests/unit/components/Laboratory/MainColumnsBar.spec.ts +251 -251
  205. package/tests/unit/components/Laboratory/ProgressCircle.spec.ts +290 -290
  206. package/tests/unit/components/Laboratory/ProgressLinear.spec.ts +275 -275
  207. package/tests/unit/components/Laboratory/SelectionColumnBar.spec.ts +288 -288
  208. package/tests/unit/components/Laboratory/StatusNotification.spec.ts +296 -296
  209. package/tests/unit/components/Laboratory/TagLabel.spec.ts +353 -353
  210. package/tests/unit/components/Laboratory/TagLabelGroup.spec.ts +377 -377
  211. package/tests/unit/components/Laboratory/TicketCard.spec.ts +351 -351
  212. package/tests/unit/components/Laboratory/TimeLineEvent.spec.ts +381 -381
  213. package/tests/unit/components/Laboratory/Timeline.spec.ts +419 -419
  214. package/tests/unit/components/Loader/Loader.spec.ts +197 -197
  215. package/tests/unit/components/MaintenanceBanner/MaintenanceBanner.spec.ts +302 -302
  216. package/tests/unit/constants/iconEnums.spec.ts +39 -39
  217. package/tests/unit/i18n/i18n.spec.ts +88 -88
  218. package/tests/unit/plugins/vuetify.spec.ts +182 -182
  219. package/tests/unit/setup.ts +237 -237
  220. package/tests/unit/src/components/index.spec.ts.skip +192 -192
  221. package/tests/unit/src/index.spec.ts.skip +182 -182
  222. package/tests/unit/src/main.spec.ts +111 -111
  223. package/tests/unit/utils/accessibility.spec.ts +318 -318
  224. package/tests/unit/utils/anamnese.spec.ts +531 -0
  225. package/tsconfig.json +26 -26
  226. package/vite.config.ts +29 -29
  227. package/vitest.config.ts +91 -91
@@ -1,238 +1,238 @@
1
- import { config } from '@vue/test-utils';
2
- import { vi } from 'vitest';
3
- import { h } from 'vue';
4
-
5
- // Mock specific problematic CSS imports
6
- vi.mock('vuetify/lib/components/VCode/VCode.css', () => ({}));
7
- vi.mock('vuetify/styles', () => ({}));
8
- vi.mock('vuetify/lib/styles', () => ({}));
9
- vi.mock('flag-icons/css/flag-icons.min.css', () => ({}));
10
- vi.mock('v-phone-input/dist/v-phone-input.css', () => ({}));
11
-
12
- // Mock v-phone-input to prevent it from loading vuetify/components
13
- vi.mock('v-phone-input', () => ({
14
- VPhoneInput: {
15
- name: 'VPhoneInput',
16
- props: ['modelValue', 'placeholder', 'label', 'variant', 'density', 'countryLabel', 'countryAriaLabel', 'phoneAriaLabel', 'preferredCountries', 'ignoredCountries', 'includedCountries', 'includeCountries', 'ariaLabel', 'appendInnerIcon', 'placeHolder', 'displayFormat', 'defaultCountry', 'hideDetails', 'ariaInvalid', 'countryIconMode', 'id', 'class'],
17
- emits: ['update:modelValue', 'update:phone'],
18
- setup(props: any, { emit }: any) {
19
- return () => h('div', {
20
- class: 'v-phone-input mocked-v-phone-input',
21
- 'data-testid': 'v-phone-input'
22
- });
23
- }
24
- }
25
- }));
26
-
27
- // Mock vuetify/components to prevent CSS import issues
28
- vi.mock('vuetify/components', () => ({
29
- VIcon: {
30
- name: 'VIcon',
31
- props: ['icon', 'size', 'color'],
32
- emits: ['click'],
33
- setup(props: any, { emit }: any) {
34
- return () => h('i', {
35
- class: 'v-icon mocked-v-icon',
36
- 'data-testid': 'v-icon',
37
- onClick: () => emit('click')
38
- });
39
- }
40
- },
41
- VTextField: {
42
- name: 'VTextField',
43
- template: '<input data-testid="v-text-field" />',
44
- props: ['modelValue']
45
- },
46
- VSelect: {
47
- name: 'VSelect',
48
- template: '<select data-testid="v-select"></select>',
49
- props: ['modelValue', 'items']
50
- },
51
- VListItem: {
52
- name: 'VListItem',
53
- template: '<div data-testid="v-list-item"><slot /></div>'
54
- }
55
- }));
56
-
57
- // Mock Vuetify
58
- vi.mock('vuetify', () => ({
59
- createVuetify: () => ({
60
- install: () => {},
61
- }),
62
- }));
63
-
64
- // Global test configuration
65
- config.global.stubs = {
66
- // Stub Vuetify components that are commonly used
67
- 'v-btn': {
68
- template: '<button class="v-btn" :disabled="disabled" :readonly="readonly" @click="handleClick" data-testid="root" v-bind="$attrs"><span v-if="prependIcon" class="prepend-icon"></span><slot /><span v-if="appendIcon" class="append-icon"></span></button>',
69
- props: ['disabled', 'loading', 'variant', 'color', 'size', 'density', 'rounded', 'elevation', 'flat', 'readonly', 'prependIcon', 'appendIcon'],
70
- emits: ['click'],
71
- inheritAttrs: false,
72
- methods: {
73
- handleClick(event) {
74
- if (!this.disabled) {
75
- this.$emit('click', event);
76
- }
77
- }
78
- }
79
- },
80
- 'v-text-field': {
81
- template: '<div data-testid="root" class="v-text-field" :class="classes"><input :id="id" :type="type || \'text\'" :placeholder="placeholder" :value="modelValue" @input="$emit(\'update:modelValue\', $event.target.value)" /><slot name="prepend"></slot><slot name="prepend-inner"></slot><slot name="append"></slot><slot name="append-inner"></slot><slot name="details"></slot></div>',
82
- props: ['modelValue', 'disabled', 'error', 'label', 'placeholder', 'variant', 'density', 'hideDetails', 'persistentHint', 'prependIcon', 'prependInnerIcon', 'appendIcon', 'appendInnerIcon', 'success', 'warning', 'borderOnHover', 'class', 'type', 'id'],
83
- emits: ['update:modelValue', 'click:prepend', 'click:prepend-inner', 'click:append', 'click:append-inner'],
84
- computed: {
85
- classes() {
86
- return this.$props.class || '';
87
- }
88
- }
89
- },
90
- 'v-icon': {
91
- template: '<i class="v-icon" data-testid="v-icon" :icon="icon" :size="size" :color="color" v-bind="$attrs"></i>',
92
- props: ['icon', 'color', 'size'],
93
- inheritAttrs: false
94
- },
95
- 'v-card': {
96
- template: '<div class="v-card" data-testid="v-card" :elevation="elevation" :rounded="rounded" :color="color" :variant="variant" :style="style"><div class="v-card-item"><slot name="title" /></div><div class="v-card-text"><slot name="text" /></div><slot /></div>',
97
- props: ['elevation', 'rounded', 'color', 'variant', 'style'],
98
- },
99
- 'v-dialog': {
100
- template: '<div data-testid="v-dialog" class="v-dialog"><slot /></div>',
101
- props: ['modelValue', 'width'],
102
- },
103
- 'v-checkbox': {
104
- template: '<div data-testid="root" class="v-checkbox tick-box" :class="$props.class"><input type="checkbox" /><slot name="label"></slot></div>',
105
- props: ['modelValue', 'disabled', 'label', 'value', 'density', 'color', 'baseColor', 'trueIcon', 'falseIcon', 'class'],
106
- },
107
- 'v-select': {
108
- template: '<select data-testid="v-select"></select>',
109
- props: ['modelValue', 'items', 'disabled'],
110
- },
111
- 'v-combobox': {
112
- template: '<div data-testid="root" class="v-combobox"><input /><select><option v-for="item in items" :key="item.value" :value="item.value">{{ item.title }}</option></select><slot name="menu"></slot><slot name="prepend"></slot><slot name="prepend-inner"></slot><slot name="append"></slot><slot name="append-inner"></slot></div>',
113
- props: ['modelValue', 'items', 'disabled', 'multiple', 'chips', 'clearable', 'variant', 'density', 'label', 'appendIcon', 'appendInnerIcon', 'prependIcon', 'prependInnerIcon', 'menuIcon', 'clearIcon', 'closableChips', 'hideDetails', 'error', 'itemTitle', 'itemValue', 'returnObject'],
114
- emits: ['update:modelValue', 'click:append', 'click:appendInner', 'click:clear', 'click:prepend', 'click:prependInner', 'update:search']
115
- },
116
- 'v-textarea': {
117
- template: '<textarea data-testid="root" class="text-area v-textarea"></textarea>',
118
- props: ['modelValue', 'disabled', 'clearable', 'clearIcon', 'label', 'prependIcon', 'prependInnerIcon', 'appendIcon', 'appendInnerIcon', 'baseColor', 'bgColor', 'variant', 'color', 'rounded'],
119
- emits: ['update:modelValue', 'click:append', 'click:appendInner', 'click:clear', 'click:control', 'click:prepend', 'click:prependInner']
120
- },
121
- 'v-expansion-panels': {
122
- template: '<div data-testid="root" class="wl-accordion"><slot /></div>',
123
- props: ['modelValue', 'multiple', 'variant', 'rounded', 'expandIcon', 'collapseIcon'],
124
- emits: ['update:modelValue'],
125
- },
126
- 'v-expansion-panel': {
127
- template: '<div data-testid="root"><slot /></div>',
128
- props: ['value', 'bgColor'],
129
- },
130
- 'v-expansion-panel-title': {
131
- template: '<div data-testid="v-expansion-panel-title"><slot /></div>',
132
- },
133
- 'v-expansion-panel-text': {
134
- template: '<div data-testid="v-expansion-panel-text"><slot /></div>',
135
- },
136
- 'v-alert': {
137
- template: '<div class="v-alert" data-testid="v-alert" :color="color" :rounded="rounded"><div class="v-alert__content"><slot name="title" /><slot name="text" /></div><slot /></div>',
138
- props: ['type', 'color', 'rounded'],
139
- },
140
- 'v-progress-circular': {
141
- template: '<div data-testid="v-progress-circular"></div>',
142
- props: ['value', 'size'],
143
- },
144
- 'v-timeline': {
145
- template: '<div class="v-timeline" data-testid="v-timeline" data-testid="root"><slot /></div>',
146
- props: ['density', 'align']
147
- },
148
- 'v-timeline-item': {
149
- template: '<div class="v-timeline-item" data-testid="v-timeline-item"><template #icon><slot name="icon" /></template><slot /></div>',
150
- props: ['size']
151
- },
152
- 'v-list': {
153
- template: '<div data-testid="v-list"><slot /></div>',
154
- },
155
- 'v-list-item': {
156
- template: '<div data-testid="v-list-item"><slot /></div>',
157
- },
158
- 'v-hover': {
159
- template: '<div data-testid="v-hover"><slot /></div>',
160
- },
161
- 'v-sheet': {
162
- template: '<div class="v-sheet" data-testid="v-sheet" :style="style" :elevation="elevation" :border="border" :rounded="rounded" v-bind="$attrs"><slot /></div>',
163
- props: ['border', 'rounded', 'elevation', 'style'],
164
- inheritAttrs: false
165
- },
166
- 'v-divider': {
167
- template: '<hr class="v-divider" data-testid="v-divider" v-bind="$attrs" />',
168
- props: ['vertical', 'thickness'],
169
- inheritAttrs: false
170
- },
171
- 'v-fab': {
172
- template: '<button class="v-fab" data-testid="v-fab"><slot /></button>',
173
- props: ['baseColor', 'color', 'readonly', 'icon', 'size']
174
- },
175
- 'v-badge': {
176
- template: '<div class="v-badge" data-testid="v-badge"><slot /><template #badge><slot name="badge" /></template></div>',
177
- props: ['color']
178
- },
179
- 'v-img': {
180
- template: '<img class="v-img" data-testid="v-img" :src="src" :aspect-ratio="aspectRatio" :rounded="rounded" :cover="cover" />',
181
- props: ['src', 'aspectRatio', 'rounded', 'cover']
182
- },
183
- 'v-card-actions': {
184
- template: '<div class="v-card-actions" data-testid="v-card-actions"><slot /></div>',
185
- },
186
- 'v-progress-linear': {
187
- template: '<div class="v-progress-linear custom-progress-linear" data-testid="v-progress-linear" v-bind="$attrs"></div>',
188
- props: ['modelValue', 'height', 'color', 'bgColor', 'bgOpacity'],
189
- inheritAttrs: false
190
- },
191
- 'teleport': {
192
- template: '<div data-testid="teleport"><slot /></div>',
193
- props: ['to']
194
- },
195
- 'VPhoneInput': {
196
- template: '<div data-testid="root" class="wl-phone-input"><input /></div>',
197
- props: ['modelValue', 'placeholder', 'label', 'variant', 'density', 'countryLabel', 'countryAriaLabel', 'phoneAriaLabel', 'preferredCountries', 'ignoredCountries', 'includedCountries', 'includeCountries', 'ariaLabel', 'appendInnerIcon', 'placeHolder', 'displayFormat', 'defaultCountry', 'hideDetails', 'ariaInvalid', 'countryIconMode', 'id', 'class'],
198
- emits: ['update:modelValue', 'update:phone']
199
- },
200
- 'v-otp-input': {
201
- template: '<div data-testid="v-otp-input"></div>',
202
- props: ['modelValue', 'autofocus', 'rounded', 'loading', 'error', 'focus-all', 'focused', 'type'],
203
- emits: ['update:modelValue']
204
- },
205
- 'i18n-t': {
206
- template: '<p data-testid="i18n-t"><slot></slot><slot name="phoneNumber"></slot></p>',
207
- props: ['keypath', 'tag'],
208
- },
209
- };
210
-
211
- // Mock window.matchMedia
212
- Object.defineProperty(window, 'matchMedia', {
213
- writable: true,
214
- value: vi.fn().mockImplementation(query => ({
215
- matches: false,
216
- media: query,
217
- onchange: null,
218
- addListener: vi.fn(),
219
- removeListener: vi.fn(),
220
- addEventListener: vi.fn(),
221
- removeEventListener: vi.fn(),
222
- dispatchEvent: vi.fn(),
223
- })),
224
- });
225
-
226
- // Mock IntersectionObserver
227
- global.IntersectionObserver = vi.fn().mockImplementation(() => ({
228
- observe: vi.fn(),
229
- unobserve: vi.fn(),
230
- disconnect: vi.fn(),
231
- }));
232
-
233
- // Mock ResizeObserver
234
- global.ResizeObserver = vi.fn().mockImplementation(() => ({
235
- observe: vi.fn(),
236
- unobserve: vi.fn(),
237
- disconnect: vi.fn(),
1
+ import { config } from '@vue/test-utils';
2
+ import { vi } from 'vitest';
3
+ import { h } from 'vue';
4
+
5
+ // Mock specific problematic CSS imports
6
+ vi.mock('vuetify/lib/components/VCode/VCode.css', () => ({}));
7
+ vi.mock('vuetify/styles', () => ({}));
8
+ vi.mock('vuetify/lib/styles', () => ({}));
9
+ vi.mock('flag-icons/css/flag-icons.min.css', () => ({}));
10
+ vi.mock('v-phone-input/dist/v-phone-input.css', () => ({}));
11
+
12
+ // Mock v-phone-input to prevent it from loading vuetify/components
13
+ vi.mock('v-phone-input', () => ({
14
+ VPhoneInput: {
15
+ name: 'VPhoneInput',
16
+ props: ['modelValue', 'placeholder', 'label', 'variant', 'density', 'countryLabel', 'countryAriaLabel', 'phoneAriaLabel', 'preferredCountries', 'ignoredCountries', 'includedCountries', 'includeCountries', 'ariaLabel', 'appendInnerIcon', 'placeHolder', 'displayFormat', 'defaultCountry', 'hideDetails', 'ariaInvalid', 'countryIconMode', 'id', 'class'],
17
+ emits: ['update:modelValue', 'update:phone'],
18
+ setup(props: any, { emit }: any) {
19
+ return () => h('div', {
20
+ class: 'v-phone-input mocked-v-phone-input',
21
+ 'data-testid': 'v-phone-input'
22
+ });
23
+ }
24
+ }
25
+ }));
26
+
27
+ // Mock vuetify/components to prevent CSS import issues
28
+ vi.mock('vuetify/components', () => ({
29
+ VIcon: {
30
+ name: 'VIcon',
31
+ props: ['icon', 'size', 'color'],
32
+ emits: ['click'],
33
+ setup(props: any, { emit }: any) {
34
+ return () => h('i', {
35
+ class: 'v-icon mocked-v-icon',
36
+ 'data-testid': 'v-icon',
37
+ onClick: () => emit('click')
38
+ });
39
+ }
40
+ },
41
+ VTextField: {
42
+ name: 'VTextField',
43
+ template: '<input data-testid="v-text-field" />',
44
+ props: ['modelValue']
45
+ },
46
+ VSelect: {
47
+ name: 'VSelect',
48
+ template: '<select data-testid="v-select"></select>',
49
+ props: ['modelValue', 'items']
50
+ },
51
+ VListItem: {
52
+ name: 'VListItem',
53
+ template: '<div data-testid="v-list-item"><slot /></div>'
54
+ }
55
+ }));
56
+
57
+ // Mock Vuetify
58
+ vi.mock('vuetify', () => ({
59
+ createVuetify: () => ({
60
+ install: () => {},
61
+ }),
62
+ }));
63
+
64
+ // Global test configuration
65
+ config.global.stubs = {
66
+ // Stub Vuetify components that are commonly used
67
+ 'v-btn': {
68
+ template: '<button class="v-btn" :disabled="disabled" :readonly="readonly" @click="handleClick" data-testid="root" v-bind="$attrs"><span v-if="prependIcon" class="prepend-icon"></span><slot /><span v-if="appendIcon" class="append-icon"></span></button>',
69
+ props: ['disabled', 'loading', 'variant', 'color', 'size', 'density', 'rounded', 'elevation', 'flat', 'readonly', 'prependIcon', 'appendIcon'],
70
+ emits: ['click'],
71
+ inheritAttrs: false,
72
+ methods: {
73
+ handleClick(event) {
74
+ if (!this.disabled) {
75
+ this.$emit('click', event);
76
+ }
77
+ }
78
+ }
79
+ },
80
+ 'v-text-field': {
81
+ template: '<div data-testid="root" class="v-text-field" :class="classes"><input :id="id" :type="type || \'text\'" :placeholder="placeholder" :value="modelValue" @input="$emit(\'update:modelValue\', $event.target.value)" /><slot name="prepend"></slot><slot name="prepend-inner"></slot><slot name="append"></slot><slot name="append-inner"></slot><slot name="details"></slot></div>',
82
+ props: ['modelValue', 'disabled', 'error', 'label', 'placeholder', 'variant', 'density', 'hideDetails', 'persistentHint', 'prependIcon', 'prependInnerIcon', 'appendIcon', 'appendInnerIcon', 'success', 'warning', 'borderOnHover', 'class', 'type', 'id'],
83
+ emits: ['update:modelValue', 'click:prepend', 'click:prepend-inner', 'click:append', 'click:append-inner'],
84
+ computed: {
85
+ classes() {
86
+ return this.$props.class || '';
87
+ }
88
+ }
89
+ },
90
+ 'v-icon': {
91
+ template: '<i class="v-icon" data-testid="v-icon" :icon="icon" :size="size" :color="color" v-bind="$attrs"></i>',
92
+ props: ['icon', 'color', 'size'],
93
+ inheritAttrs: false
94
+ },
95
+ 'v-card': {
96
+ template: '<div class="v-card" data-testid="v-card" :elevation="elevation" :rounded="rounded" :color="color" :variant="variant" :style="style"><div class="v-card-item"><slot name="title" /></div><div class="v-card-text"><slot name="text" /></div><slot /></div>',
97
+ props: ['elevation', 'rounded', 'color', 'variant', 'style'],
98
+ },
99
+ 'v-dialog': {
100
+ template: '<div data-testid="v-dialog" class="v-dialog"><slot /></div>',
101
+ props: ['modelValue', 'width'],
102
+ },
103
+ 'v-checkbox': {
104
+ template: '<div data-testid="root" class="v-checkbox tick-box" :class="$props.class"><input type="checkbox" /><slot name="label"></slot></div>',
105
+ props: ['modelValue', 'disabled', 'label', 'value', 'density', 'color', 'baseColor', 'trueIcon', 'falseIcon', 'class'],
106
+ },
107
+ 'v-select': {
108
+ template: '<select data-testid="v-select"></select>',
109
+ props: ['modelValue', 'items', 'disabled'],
110
+ },
111
+ 'v-combobox': {
112
+ template: '<div data-testid="root" class="v-combobox"><input /><select><option v-for="item in items" :key="item.value" :value="item.value">{{ item.title }}</option></select><slot name="menu"></slot><slot name="prepend"></slot><slot name="prepend-inner"></slot><slot name="append"></slot><slot name="append-inner"></slot></div>',
113
+ props: ['modelValue', 'items', 'disabled', 'multiple', 'chips', 'clearable', 'variant', 'density', 'label', 'appendIcon', 'appendInnerIcon', 'prependIcon', 'prependInnerIcon', 'menuIcon', 'clearIcon', 'closableChips', 'hideDetails', 'error', 'itemTitle', 'itemValue', 'returnObject'],
114
+ emits: ['update:modelValue', 'click:append', 'click:appendInner', 'click:clear', 'click:prepend', 'click:prependInner', 'update:search']
115
+ },
116
+ 'v-textarea': {
117
+ template: '<textarea data-testid="root" class="text-area v-textarea"></textarea>',
118
+ props: ['modelValue', 'disabled', 'clearable', 'clearIcon', 'label', 'prependIcon', 'prependInnerIcon', 'appendIcon', 'appendInnerIcon', 'baseColor', 'bgColor', 'variant', 'color', 'rounded'],
119
+ emits: ['update:modelValue', 'click:append', 'click:appendInner', 'click:clear', 'click:control', 'click:prepend', 'click:prependInner']
120
+ },
121
+ 'v-expansion-panels': {
122
+ template: '<div data-testid="root" class="wl-accordion"><slot /></div>',
123
+ props: ['modelValue', 'multiple', 'variant', 'rounded', 'expandIcon', 'collapseIcon'],
124
+ emits: ['update:modelValue'],
125
+ },
126
+ 'v-expansion-panel': {
127
+ template: '<div data-testid="root"><slot /></div>',
128
+ props: ['value', 'bgColor'],
129
+ },
130
+ 'v-expansion-panel-title': {
131
+ template: '<div data-testid="v-expansion-panel-title"><slot /></div>',
132
+ },
133
+ 'v-expansion-panel-text': {
134
+ template: '<div data-testid="v-expansion-panel-text"><slot /></div>',
135
+ },
136
+ 'v-alert': {
137
+ template: '<div class="v-alert" data-testid="v-alert" :color="color" :rounded="rounded"><div class="v-alert__content"><slot name="title" /><slot name="text" /></div><slot /></div>',
138
+ props: ['type', 'color', 'rounded'],
139
+ },
140
+ 'v-progress-circular': {
141
+ template: '<div data-testid="v-progress-circular"></div>',
142
+ props: ['value', 'size'],
143
+ },
144
+ 'v-timeline': {
145
+ template: '<div class="v-timeline" data-testid="v-timeline" data-testid="root"><slot /></div>',
146
+ props: ['density', 'align']
147
+ },
148
+ 'v-timeline-item': {
149
+ template: '<div class="v-timeline-item" data-testid="v-timeline-item"><template #icon><slot name="icon" /></template><slot /></div>',
150
+ props: ['size']
151
+ },
152
+ 'v-list': {
153
+ template: '<div data-testid="v-list"><slot /></div>',
154
+ },
155
+ 'v-list-item': {
156
+ template: '<div data-testid="v-list-item"><slot /></div>',
157
+ },
158
+ 'v-hover': {
159
+ template: '<div data-testid="v-hover"><slot /></div>',
160
+ },
161
+ 'v-sheet': {
162
+ template: '<div class="v-sheet" data-testid="v-sheet" :style="style" :elevation="elevation" :border="border" :rounded="rounded" v-bind="$attrs"><slot /></div>',
163
+ props: ['border', 'rounded', 'elevation', 'style'],
164
+ inheritAttrs: false
165
+ },
166
+ 'v-divider': {
167
+ template: '<hr class="v-divider" data-testid="v-divider" v-bind="$attrs" />',
168
+ props: ['vertical', 'thickness'],
169
+ inheritAttrs: false
170
+ },
171
+ 'v-fab': {
172
+ template: '<button class="v-fab" data-testid="v-fab"><slot /></button>',
173
+ props: ['baseColor', 'color', 'readonly', 'icon', 'size']
174
+ },
175
+ 'v-badge': {
176
+ template: '<div class="v-badge" data-testid="v-badge"><slot /><template #badge><slot name="badge" /></template></div>',
177
+ props: ['color']
178
+ },
179
+ 'v-img': {
180
+ template: '<img class="v-img" data-testid="v-img" :src="src" :aspect-ratio="aspectRatio" :rounded="rounded" :cover="cover" />',
181
+ props: ['src', 'aspectRatio', 'rounded', 'cover']
182
+ },
183
+ 'v-card-actions': {
184
+ template: '<div class="v-card-actions" data-testid="v-card-actions"><slot /></div>',
185
+ },
186
+ 'v-progress-linear': {
187
+ template: '<div class="v-progress-linear custom-progress-linear" data-testid="v-progress-linear" v-bind="$attrs"></div>',
188
+ props: ['modelValue', 'height', 'color', 'bgColor', 'bgOpacity'],
189
+ inheritAttrs: false
190
+ },
191
+ 'teleport': {
192
+ template: '<div data-testid="teleport"><slot /></div>',
193
+ props: ['to']
194
+ },
195
+ 'VPhoneInput': {
196
+ template: '<div data-testid="root" class="wl-phone-input"><input /></div>',
197
+ props: ['modelValue', 'placeholder', 'label', 'variant', 'density', 'countryLabel', 'countryAriaLabel', 'phoneAriaLabel', 'preferredCountries', 'ignoredCountries', 'includedCountries', 'includeCountries', 'ariaLabel', 'appendInnerIcon', 'placeHolder', 'displayFormat', 'defaultCountry', 'hideDetails', 'ariaInvalid', 'countryIconMode', 'id', 'class'],
198
+ emits: ['update:modelValue', 'update:phone']
199
+ },
200
+ 'v-otp-input': {
201
+ template: '<div data-testid="v-otp-input"></div>',
202
+ props: ['modelValue', 'autofocus', 'rounded', 'loading', 'error', 'focus-all', 'focused', 'type'],
203
+ emits: ['update:modelValue']
204
+ },
205
+ 'i18n-t': {
206
+ template: '<p data-testid="i18n-t"><slot></slot><slot name="phoneNumber"></slot></p>',
207
+ props: ['keypath', 'tag'],
208
+ },
209
+ };
210
+
211
+ // Mock window.matchMedia
212
+ Object.defineProperty(window, 'matchMedia', {
213
+ writable: true,
214
+ value: vi.fn().mockImplementation(query => ({
215
+ matches: false,
216
+ media: query,
217
+ onchange: null,
218
+ addListener: vi.fn(),
219
+ removeListener: vi.fn(),
220
+ addEventListener: vi.fn(),
221
+ removeEventListener: vi.fn(),
222
+ dispatchEvent: vi.fn(),
223
+ })),
224
+ });
225
+
226
+ // Mock IntersectionObserver
227
+ global.IntersectionObserver = vi.fn().mockImplementation(() => ({
228
+ observe: vi.fn(),
229
+ unobserve: vi.fn(),
230
+ disconnect: vi.fn(),
231
+ }));
232
+
233
+ // Mock ResizeObserver
234
+ global.ResizeObserver = vi.fn().mockImplementation(() => ({
235
+ observe: vi.fn(),
236
+ unobserve: vi.fn(),
237
+ disconnect: vi.fn(),
238
238
  }));