@zap-wunschlachen/wl-shared-components 1.0.35 → 1.0.37

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 (256) 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 +43 -38
  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/audio/test.aac +0 -0
  16. package/public/background.svg +60 -60
  17. package/public/style.css +187 -187
  18. package/public/technologies.svg +22 -22
  19. package/src/assets/css/base.css +232 -232
  20. package/src/assets/css/variables.css +109 -109
  21. package/src/components/Accordion/Accordion.css +59 -59
  22. package/src/components/Accordion/AccordionGroup.vue +51 -51
  23. package/src/components/Accordion/AccordionItem.vue +66 -66
  24. package/src/components/Appointment/Card/Actions.css +54 -54
  25. package/src/components/Appointment/Card/Actions.vue +99 -99
  26. package/src/components/Appointment/Card/AnamneseNotification.css +15 -15
  27. package/src/components/Appointment/Card/AnamneseNotification.vue +23 -23
  28. package/src/components/Appointment/Card/Card.css +80 -80
  29. package/src/components/Appointment/Card/Card.vue +93 -93
  30. package/src/components/Appointment/Card/Details.css +50 -50
  31. package/src/components/Appointment/Card/Details.vue +43 -43
  32. package/src/components/Audio/Audio.vue +187 -187
  33. package/src/components/Audio/Waveform.vue +118 -117
  34. package/src/components/Button/Button.vue +174 -136
  35. package/src/components/CheckBox/CheckBox.css +214 -185
  36. package/src/components/CheckBox/Checkbox.vue +138 -130
  37. package/src/components/DateInput/DateInput.css +2 -2
  38. package/src/components/DateInput/DateInput.vue +262 -262
  39. package/src/components/Dialog/Dialog.css +6 -6
  40. package/src/components/Dialog/Dialog.vue +38 -29
  41. package/src/components/EditField/EditField.css +19 -19
  42. package/src/components/EditField/EditField.vue +202 -202
  43. package/src/components/ErrorPage/ErrorPage.css +172 -172
  44. package/src/components/IconBullet/IconBullet.vue +86 -86
  45. package/src/components/IconBullet/IconBulletList.vue +41 -41
  46. package/src/components/Icons/AdvanceAppointments.vue +153 -153
  47. package/src/components/Icons/Audio/CloudFailed.vue +20 -20
  48. package/src/components/Icons/Audio/CloudSaved.vue +21 -21
  49. package/src/components/Icons/Audio/Delete.vue +15 -15
  50. package/src/components/Icons/Audio/Pause.vue +18 -18
  51. package/src/components/Icons/Audio/Play.vue +15 -15
  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/calendar.vue +17 -17
  62. package/src/components/Icons/checkbox.vue +19 -19
  63. package/src/components/Icons/outlineChecked.vue +27 -27
  64. package/src/components/Icons/play.vue +5 -5
  65. package/src/components/Input/Input.css +187 -187
  66. package/src/components/Input/Input.vue +253 -247
  67. package/src/components/Laboratory/AppointmentCard/AppointmentCard.css +7 -7
  68. package/src/components/Laboratory/AppointmentCard/AppointmentCard.vue +116 -116
  69. package/src/components/Laboratory/ChatBoxImage/ChatBoxImage.vue +81 -81
  70. package/src/components/Laboratory/ChatMessage/ChatMessage.vue +113 -113
  71. package/src/components/Laboratory/ChatMessage/ChatMessageBadge.css +4 -4
  72. package/src/components/Laboratory/ChatMessage/ChatMessageBadge.vue +99 -99
  73. package/src/components/Laboratory/ChatNotification/ChatNotification.vue +130 -130
  74. package/src/components/Laboratory/DocumentCard/DocumentCard.css +3 -3
  75. package/src/components/Laboratory/DocumentCard/DocumentCard.vue +50 -50
  76. package/src/components/Laboratory/DocumentCard/DocumentCardItem.vue +53 -53
  77. package/src/components/Laboratory/InfoCard/InfoCard.vue +162 -162
  78. package/src/components/Laboratory/MainColumnsBar/MainColumnsBar.vue +102 -102
  79. package/src/components/Laboratory/ProgressCircle/ProgressCircle.vue +152 -152
  80. package/src/components/Laboratory/ProgressLinear/ProgressLinear.css +33 -33
  81. package/src/components/Laboratory/ProgressLinear/ProgressLinear.vue +75 -75
  82. package/src/components/Laboratory/SelectionColumnBar/SelectionColumnBar.vue +92 -92
  83. package/src/components/Laboratory/StatusNotification/StatusNotification.vue +49 -49
  84. package/src/components/Laboratory/TagLabel/TagLabel.vue +126 -126
  85. package/src/components/Laboratory/TagLabelGroup/TagLabelGroup.vue +97 -97
  86. package/src/components/Laboratory/TicketCard/TicketCard.css +3 -3
  87. package/src/components/Laboratory/TicketCard/TicketCard.vue +143 -143
  88. package/src/components/Laboratory/TimeLine/TimeLineEvent.css +18 -18
  89. package/src/components/Laboratory/TimeLine/TimeLineEvent.vue +119 -119
  90. package/src/components/Laboratory/TimeLine/Timeline.css +4 -4
  91. package/src/components/Laboratory/TimeLine/Timeline.vue +30 -30
  92. package/src/components/Loader/Loader.css +71 -51
  93. package/src/components/Loader/Loader.vue +1 -0
  94. package/src/components/MaintenanceBanner/MaintenanceBanner.css +353 -353
  95. package/src/components/MaintenanceBanner/MaintenanceBanner.vue +127 -127
  96. package/src/components/MaintenanceBanner/MaintenanceIllustration.vue +54 -54
  97. package/src/components/Modal/Modal.css +5 -5
  98. package/src/components/Modal/Modal.vue +22 -22
  99. package/src/components/NotificationBubble/NotificationBubble.css +4 -4
  100. package/src/components/NotificationBubble/NotificationBubble.vue +90 -90
  101. package/src/components/OtpInput/OtpInput.css +39 -39
  102. package/src/components/OtpInput/OtpInput.vue +151 -151
  103. package/src/components/PhoneInput/PhoneInput.css +31 -31
  104. package/src/components/PhoneInput/PhoneInput.vue +113 -113
  105. package/src/components/Select/Select.css +150 -150
  106. package/src/components/Select/Select.vue +316 -315
  107. package/src/components/TextArea/TextArea.css +3 -3
  108. package/src/components/TextArea/TextArea.vue +126 -126
  109. package/src/components/TickBox/TickBox.css +49 -49
  110. package/src/components/TickBox/TickBox.vue +126 -126
  111. package/src/components/accessibility.css +218 -0
  112. package/src/components/index.ts +28 -28
  113. package/src/constants/iconEnums.ts +3 -3
  114. package/src/i18n/i18n.ts +15 -15
  115. package/src/i18n/locales/de.json +30 -30
  116. package/src/i18n/locales/en.json +30 -30
  117. package/src/index.ts +34 -34
  118. package/src/main.ts +11 -11
  119. package/src/plugins/vuetify.ts +141 -141
  120. package/src/shims-vue.d.ts +10 -10
  121. package/src/stories/Accordion.stories.ts +650 -650
  122. package/src/stories/Audio.stories.ts +28 -28
  123. package/src/stories/Button.stories.ts +263 -263
  124. package/src/stories/CheckBox.stories.ts +348 -348
  125. package/src/stories/DateInput.stories.ts +53 -53
  126. package/src/stories/Dialog.stories.ts +147 -147
  127. package/src/stories/EditField.stories.ts +78 -78
  128. package/src/stories/IconBullet/IconBullet.stories.ts +201 -201
  129. package/src/stories/IconBullet/IconBulletList.stories.ts +275 -275
  130. package/src/stories/Input.stories.ts +351 -351
  131. package/src/stories/Laboratory/Cards/AppointmentCard/AppointmentCard.stories.ts +260 -260
  132. package/src/stories/Laboratory/Cards/DocumentCard/DocumentCard.stories.ts +176 -176
  133. package/src/stories/Laboratory/Cards/DocumentCard/DocumentCardItem.stories.ts +119 -119
  134. package/src/stories/Laboratory/Cards/InfoCard/InfoCard.stories.ts +320 -320
  135. package/src/stories/Laboratory/Cards/TicketCard/TicketCard.stories.ts +335 -335
  136. package/src/stories/Laboratory/Chat/ChatBoxImage.stories.ts +82 -82
  137. package/src/stories/Laboratory/Chat/ChatMessage.stories.ts +198 -198
  138. package/src/stories/Laboratory/Chat/ChatMessageBadge.stories.ts +204 -204
  139. package/src/stories/Laboratory/Chat/ChatNotification.stories.ts +144 -144
  140. package/src/stories/Laboratory/Chat/ProgressLinear.stories.ts +186 -186
  141. package/src/stories/Laboratory/Chat/StatusNotification.stories.ts +111 -111
  142. package/src/stories/Laboratory/MainColumnsBar.stories.ts +48 -48
  143. package/src/stories/Laboratory/ProgressCircle.stories.ts +261 -261
  144. package/src/stories/Laboratory/SelectionColumnBar.stories.ts +234 -234
  145. package/src/stories/Laboratory/TagLabel.stories.ts +418 -418
  146. package/src/stories/Laboratory/TagLabelGroup.stories.ts +234 -234
  147. package/src/stories/Laboratory/Timeline.stories.ts +403 -403
  148. package/src/stories/NotificationBubble.stories.ts +194 -194
  149. package/src/stories/OtpInput.stories.ts +100 -100
  150. package/src/stories/PhoneInput.stories.ts +52 -52
  151. package/src/stories/Select.stories.ts +419 -419
  152. package/src/stories/TextArea.stories.ts +112 -112
  153. package/src/stories/TickBox.stories.ts +294 -294
  154. package/src/stories/v-icon.stories.ts +91 -91
  155. package/src/utils/index.ts +109 -109
  156. package/src/vite-env.d.ts +1 -1
  157. package/tests/e2e/README.md +220 -220
  158. package/tests/e2e/accessibility.spec.ts +638 -638
  159. package/tests/e2e/accordion.spec.ts +42 -42
  160. package/tests/e2e/additional-components.spec.ts +437 -437
  161. package/tests/e2e/all-components.spec.ts +135 -135
  162. package/tests/e2e/appointment-card.spec.ts +816 -816
  163. package/tests/e2e/button-fixed.spec.ts +58 -58
  164. package/tests/e2e/button.spec.ts +76 -76
  165. package/tests/e2e/checkbox.spec.ts +50 -50
  166. package/tests/e2e/date-input.spec.ts +46 -46
  167. package/tests/e2e/debug.spec.ts +51 -51
  168. package/tests/e2e/dialog.spec.ts +58 -58
  169. package/tests/e2e/input.spec.ts +55 -55
  170. package/tests/e2e/laboratory-components.spec.ts +320 -320
  171. package/tests/e2e/otp-input.spec.ts +50 -50
  172. package/tests/e2e/select.spec.ts +52 -52
  173. package/tests/e2e/storybook-utils.ts +59 -59
  174. package/tests/e2e/test-basic.spec.ts +33 -33
  175. package/tests/e2e/visual-regression.spec.ts +350 -350
  176. package/tests/unit/accessibility/component-a11y.spec.ts +469 -0
  177. package/tests/unit/components/Accordion/AccordionGroup.spec.ts +228 -0
  178. package/tests/unit/components/Accordion/AccordionGroup.spec.ts.skip +342 -342
  179. package/tests/unit/components/Accordion/AccordionItem.spec.ts +292 -0
  180. package/tests/unit/components/Accordion/AccordionItem.spec.ts.skip +383 -383
  181. package/tests/unit/components/Appointment/AnamneseNotification.spec.ts +176 -0
  182. package/tests/unit/components/Appointment/Card/Actions.spec.ts +407 -407
  183. package/tests/unit/components/Appointment/Card/Card.spec.ts +485 -485
  184. package/tests/unit/components/Appointment/Card/Details.spec.ts +397 -397
  185. package/tests/unit/components/Audio/Audio.spec.ts +403 -403
  186. package/tests/unit/components/Audio/Waveform.spec.ts +483 -483
  187. package/tests/unit/components/Background/Background.spec.ts +177 -0
  188. package/tests/unit/components/Core/Button.spec.ts +336 -336
  189. package/tests/unit/components/Core/Checkbox.spec.ts +544 -544
  190. package/tests/unit/components/Core/DateInput.spec.ts +690 -690
  191. package/tests/unit/components/Core/Dialog.spec.ts +485 -485
  192. package/tests/unit/components/Core/EditField.spec.ts +782 -782
  193. package/tests/unit/components/Core/Input.spec.ts +512 -512
  194. package/tests/unit/components/Core/Modal.spec.ts +518 -518
  195. package/tests/unit/components/Core/NotificationBubble.spec.ts +606 -606
  196. package/tests/unit/components/Core/OtpInput.spec.ts +708 -708
  197. package/tests/unit/components/Core/PhoneInput.spec.ts +619 -619
  198. package/tests/unit/components/Core/Select.spec.ts +712 -712
  199. package/tests/unit/components/Core/TextArea.spec.ts +565 -565
  200. package/tests/unit/components/Core/TickBox.spec.ts +779 -779
  201. package/tests/unit/components/ErrorPage/ErrorPage.spec.ts +313 -0
  202. package/tests/unit/components/ErrorPage/ErrorPageLogo.spec.ts +153 -0
  203. package/tests/unit/components/IconBullet/IconBullet.spec.ts +356 -356
  204. package/tests/unit/components/IconBullet/IconBulletList.spec.ts +371 -371
  205. package/tests/unit/components/Icons/AdvanceAppointments.spec.ts +61 -0
  206. package/tests/unit/components/Icons/Audio/CloudFailed.spec.ts +108 -108
  207. package/tests/unit/components/Icons/Audio/CloudSaved.spec.ts +149 -149
  208. package/tests/unit/components/Icons/Audio/Delete.spec.ts +158 -158
  209. package/tests/unit/components/Icons/Audio/Pause.spec.ts +208 -208
  210. package/tests/unit/components/Icons/Audio/Play.spec.ts +217 -217
  211. package/tests/unit/components/Icons/CalendarNotification.spec.ts +186 -186
  212. package/tests/unit/components/Icons/Chair.spec.ts +234 -234
  213. package/tests/unit/components/Icons/ChairNotification.spec.ts +311 -311
  214. package/tests/unit/components/Icons/Circle.spec.ts +255 -255
  215. package/tests/unit/components/Icons/FavIcon.spec.ts +251 -251
  216. package/tests/unit/components/Icons/FilledCircle.spec.ts +274 -274
  217. package/tests/unit/components/Icons/Group3.spec.ts +355 -355
  218. package/tests/unit/components/Icons/Logo.spec.ts +228 -0
  219. package/tests/unit/components/Icons/MiniLogo.spec.ts +38 -0
  220. package/tests/unit/components/Icons/RingNotification.spec.ts +393 -393
  221. package/tests/unit/components/Icons/SolidArrowRight.spec.ts +49 -0
  222. package/tests/unit/components/Icons/calendar.spec.ts +286 -286
  223. package/tests/unit/components/Icons/checkbox.spec.ts +315 -315
  224. package/tests/unit/components/Icons/outlineChecked.spec.ts +434 -434
  225. package/tests/unit/components/Icons/play.spec.ts +308 -308
  226. package/tests/unit/components/Laboratory/AppointmentCard.spec.ts +167 -167
  227. package/tests/unit/components/Laboratory/ChatBoxImage.spec.ts +179 -179
  228. package/tests/unit/components/Laboratory/ChatMessage.spec.ts +263 -263
  229. package/tests/unit/components/Laboratory/ChatMessageBadge.spec.ts +282 -282
  230. package/tests/unit/components/Laboratory/ChatNotification.spec.ts +256 -256
  231. package/tests/unit/components/Laboratory/DocumentCard.spec.ts +228 -228
  232. package/tests/unit/components/Laboratory/DocumentCardItem.spec.ts +236 -236
  233. package/tests/unit/components/Laboratory/InfoCard.spec.ts +308 -308
  234. package/tests/unit/components/Laboratory/MainColumnsBar.spec.ts +251 -251
  235. package/tests/unit/components/Laboratory/ProgressCircle.spec.ts +290 -290
  236. package/tests/unit/components/Laboratory/ProgressLinear.spec.ts +275 -275
  237. package/tests/unit/components/Laboratory/SelectionColumnBar.spec.ts +288 -288
  238. package/tests/unit/components/Laboratory/StatusNotification.spec.ts +296 -296
  239. package/tests/unit/components/Laboratory/TagLabel.spec.ts +353 -353
  240. package/tests/unit/components/Laboratory/TagLabelGroup.spec.ts +377 -377
  241. package/tests/unit/components/Laboratory/TicketCard.spec.ts +351 -351
  242. package/tests/unit/components/Laboratory/TimeLineEvent.spec.ts +381 -381
  243. package/tests/unit/components/Laboratory/Timeline.spec.ts +419 -419
  244. package/tests/unit/components/Loader/Loader.spec.ts +197 -0
  245. package/tests/unit/components/MaintenanceBanner/MaintenanceBanner.spec.ts +302 -0
  246. package/tests/unit/constants/iconEnums.spec.ts +39 -39
  247. package/tests/unit/i18n/i18n.spec.ts +88 -88
  248. package/tests/unit/plugins/vuetify.spec.ts +220 -220
  249. package/tests/unit/setup.ts +189 -189
  250. package/tests/unit/src/components/index.spec.ts.skip +192 -192
  251. package/tests/unit/src/index.spec.ts.skip +182 -182
  252. package/tests/unit/src/main.spec.ts +151 -151
  253. package/tests/unit/utils/accessibility.spec.ts +318 -0
  254. package/tsconfig.json +26 -26
  255. package/vite.config.ts +29 -29
  256. package/vitest.config.ts +83 -83
@@ -0,0 +1,218 @@
1
+ /**
2
+ * Global Accessibility Styles
3
+ *
4
+ * These styles ensure WCAG 2.1 AA compliance for all components.
5
+ * Required for German accessibility requirements (BITV 2.0).
6
+ */
7
+
8
+ /* =====================================================
9
+ FOCUS INDICATORS
10
+ WCAG 2.4.7: Focus Visible (Level AA)
11
+ ===================================================== */
12
+
13
+ /* Universal focus-visible style for all interactive elements */
14
+ .wl-button:focus-visible,
15
+ button:focus-visible,
16
+ a:focus-visible,
17
+ input:focus-visible,
18
+ select:focus-visible,
19
+ textarea:focus-visible,
20
+ [tabindex="0"]:focus-visible {
21
+ outline: 2px solid var(--Dental-Blue-0, #172774);
22
+ outline-offset: 2px;
23
+ }
24
+
25
+ /* High contrast focus for dark backgrounds */
26
+ .wl-button.v-btn--variant-flat:focus-visible {
27
+ outline-color: white;
28
+ box-shadow: 0 0 0 4px rgba(255, 255, 255, 0.5);
29
+ }
30
+
31
+ /* Checkbox focus indicator */
32
+ .input-checkbox:focus-visible {
33
+ outline: 2px solid var(--Dental-Blue-0, #172774);
34
+ outline-offset: 2px;
35
+ }
36
+
37
+ /* Button focus styles */
38
+ .wl-button:focus-visible {
39
+ outline: 2px solid currentColor;
40
+ outline-offset: 2px;
41
+ }
42
+
43
+ .wl-button.v-btn--variant-outlined:focus-visible {
44
+ outline: 2px solid var(--Dental-Blue-0, #172774);
45
+ outline-offset: 2px;
46
+ }
47
+
48
+ /* Input focus styles */
49
+ .v-text-field input:focus-visible,
50
+ .v-textarea textarea:focus-visible {
51
+ outline: none; /* Vuetify handles this via border */
52
+ }
53
+
54
+ .v-text-field:focus-within {
55
+ border-color: var(--Dental-Blue-0, #172774) !important;
56
+ }
57
+
58
+ /* Select/Combobox focus */
59
+ .wl-select .v-field:focus-within {
60
+ border-color: var(--Dental-Blue-0, #172774) !important;
61
+ }
62
+
63
+ /* =====================================================
64
+ REDUCED MOTION
65
+ WCAG 2.3.3: Animation from Interactions (Level AAA)
66
+ ===================================================== */
67
+
68
+ @media (prefers-reduced-motion: reduce) {
69
+ *,
70
+ *::before,
71
+ *::after {
72
+ animation-duration: 0.01ms !important;
73
+ animation-iteration-count: 1 !important;
74
+ transition-duration: 0.01ms !important;
75
+ scroll-behavior: auto !important;
76
+ }
77
+ }
78
+
79
+ /* =====================================================
80
+ HIGH CONTRAST MODE
81
+ Windows High Contrast Mode Support
82
+ ===================================================== */
83
+
84
+ @media (forced-colors: active) {
85
+ .wl-button {
86
+ border: 2px solid currentColor;
87
+ }
88
+
89
+ .input-checkbox {
90
+ border: 2px solid currentColor;
91
+ }
92
+
93
+ .input-checkbox:checked::before {
94
+ background-color: currentColor;
95
+ }
96
+ }
97
+
98
+ /* =====================================================
99
+ DISABLED STATES
100
+ Ensure disabled elements maintain contrast
101
+ WCAG 1.4.3: Contrast (Minimum) - Note: Disabled elements are exempt
102
+ but we still aim for visibility
103
+ ===================================================== */
104
+
105
+ .wl-button:disabled,
106
+ .wl-button[aria-disabled="true"] {
107
+ opacity: 0.6;
108
+ cursor: not-allowed;
109
+ }
110
+
111
+ .input-checkbox:disabled {
112
+ opacity: 0.6;
113
+ cursor: not-allowed;
114
+ }
115
+
116
+ /* =====================================================
117
+ SKIP LINKS
118
+ WCAG 2.4.1: Bypass Blocks (Level A)
119
+ ===================================================== */
120
+
121
+ .skip-link {
122
+ position: absolute;
123
+ top: -40px;
124
+ left: 0;
125
+ background: var(--Dental-Blue-0, #172774);
126
+ color: white;
127
+ padding: 8px 16px;
128
+ z-index: 10000;
129
+ text-decoration: none;
130
+ font-weight: 600;
131
+ }
132
+
133
+ .skip-link:focus {
134
+ top: 0;
135
+ }
136
+
137
+ /* =====================================================
138
+ SCREEN READER ONLY
139
+ Visually hidden but accessible to screen readers
140
+ ===================================================== */
141
+
142
+ .sr-only {
143
+ position: absolute;
144
+ width: 1px;
145
+ height: 1px;
146
+ padding: 0;
147
+ margin: -1px;
148
+ overflow: hidden;
149
+ clip: rect(0, 0, 0, 0);
150
+ white-space: nowrap;
151
+ border: 0;
152
+ }
153
+
154
+ /* =====================================================
155
+ ICON BUTTONS
156
+ Ensure icon-only buttons are accessible
157
+ ===================================================== */
158
+
159
+ .icon-button {
160
+ position: relative;
161
+ }
162
+
163
+ /* Show in development environments */
164
+ body.dev-mode .icon-button:not([aria-label]):not([aria-labelledby])::after {
165
+ content: "Warning: Missing accessible name";
166
+ position: absolute;
167
+ background: red;
168
+ color: white;
169
+ font-size: 10px;
170
+ padding: 2px;
171
+ display: block;
172
+ }
173
+
174
+ /* =====================================================
175
+ LOADING STATES
176
+ WCAG 4.1.3: Status Messages (Level AA)
177
+ ===================================================== */
178
+
179
+ .loading-indicator {
180
+ /* Announce loading state to screen readers */
181
+ }
182
+
183
+ [aria-busy="true"] {
184
+ cursor: wait;
185
+ }
186
+
187
+ /* =====================================================
188
+ ERROR STATES
189
+ Ensure error messages are visible and announced
190
+ ===================================================== */
191
+
192
+ .error-message {
193
+ color: var(--Error-Red-0, #d32f2f);
194
+ font-weight: 500;
195
+ }
196
+
197
+ [aria-invalid="true"] {
198
+ border-color: var(--Error-Red-0, #d32f2f) !important;
199
+ }
200
+
201
+ /* =====================================================
202
+ MINIMUM TOUCH TARGET SIZE
203
+ WCAG 2.5.5: Target Size (Level AAA) - 44x44px minimum
204
+ ===================================================== */
205
+
206
+ .touch-target-min {
207
+ min-width: 44px;
208
+ min-height: 44px;
209
+ }
210
+
211
+ /* =====================================================
212
+ TEXT SPACING
213
+ WCAG 1.4.12: Text Spacing (Level AA)
214
+ Content should support user adjustments
215
+ ===================================================== */
216
+
217
+ /* These rules ensure content adapts when users adjust text spacing */
218
+
@@ -1,28 +1,28 @@
1
- // Components index file
2
-
3
- export { default as AccordionItem } from './Accordion/AccordionItem.vue';
4
- export { default as AccordionGroup } from './Accordion/AccordionGroup.vue';
5
- export { default as Audio } from './Audio/Audio.vue';
6
- export { default as Button } from './Button/Button.vue';
7
- export { default as Checkbox } from './CheckBox/Checkbox.vue';
8
- export { default as DateInput } from './DateInput/DateInput.vue';
9
- export { default as Dialog } from './Dialog/Dialog.vue';
10
- export { default as IconBulletList } from './IconBullet/IconBulletList.vue';
11
- export { default as IconBullet } from './IconBullet/IconBullet.vue';
12
- export { default as Input } from './Input/Input.vue';
13
- export { default as NotificationBubble } from './NotificationBubble/NotificationBubble.vue';
14
- export { default as Select } from './Select/Select.vue';
15
- export { default as TickBox } from './TickBox/TickBox.vue';
16
- export { default as TextArea } from './TextArea/TextArea.vue';
17
- export { default as OtpInput } from './OtpInput/OtpInput.vue';
18
- export { default as PhoneInput } from './PhoneInput/PhoneInput.vue';
19
- export { default as EditField } from './EditField/EditField.vue';
20
- export { default as Modal } from './Modal/Modal.vue';
21
- export { default as AppointmentCard } from './Appointment/Card/Card.vue';
22
- export { default as AdvanceAppointmentIcons } from './Icons/AdvanceAppointments.vue';
23
- export { default as Loader } from './Loader/Loader.vue';
24
- export { default as AnamneseNotification } from './Appointment/Card/AnamneseNotification.vue';
25
- export { default as ErrorPage } from './ErrorPage/ErrorPage.vue';
26
- export { default as MaintenanceBanner } from './MaintenanceBanner/MaintenanceBanner.vue';
27
- export { default as Logo } from './Icons/Logo.vue';
28
- export { default as MiniLogo } from './Icons/MiniLogo.vue';
1
+ // Components index file
2
+
3
+ export { default as AccordionItem } from './Accordion/AccordionItem.vue';
4
+ export { default as AccordionGroup } from './Accordion/AccordionGroup.vue';
5
+ export { default as Audio } from './Audio/Audio.vue';
6
+ export { default as Button } from './Button/Button.vue';
7
+ export { default as Checkbox } from './CheckBox/Checkbox.vue';
8
+ export { default as DateInput } from './DateInput/DateInput.vue';
9
+ export { default as Dialog } from './Dialog/Dialog.vue';
10
+ export { default as IconBulletList } from './IconBullet/IconBulletList.vue';
11
+ export { default as IconBullet } from './IconBullet/IconBullet.vue';
12
+ export { default as Input } from './Input/Input.vue';
13
+ export { default as NotificationBubble } from './NotificationBubble/NotificationBubble.vue';
14
+ export { default as Select } from './Select/Select.vue';
15
+ export { default as TickBox } from './TickBox/TickBox.vue';
16
+ export { default as TextArea } from './TextArea/TextArea.vue';
17
+ export { default as OtpInput } from './OtpInput/OtpInput.vue';
18
+ export { default as PhoneInput } from './PhoneInput/PhoneInput.vue';
19
+ export { default as EditField } from './EditField/EditField.vue';
20
+ export { default as Modal } from './Modal/Modal.vue';
21
+ export { default as AppointmentCard } from './Appointment/Card/Card.vue';
22
+ export { default as AdvanceAppointmentIcons } from './Icons/AdvanceAppointments.vue';
23
+ export { default as Loader } from './Loader/Loader.vue';
24
+ export { default as AnamneseNotification } from './Appointment/Card/AnamneseNotification.vue';
25
+ export { default as ErrorPage } from './ErrorPage/ErrorPage.vue';
26
+ export { default as MaintenanceBanner } from './MaintenanceBanner/MaintenanceBanner.vue';
27
+ export { default as Logo } from './Icons/Logo.vue';
28
+ export { default as MiniLogo } from './Icons/MiniLogo.vue';
@@ -1,4 +1,4 @@
1
- export enum IconEnum {
2
- CALENDAR = 'calendar',
3
- PLAY = 'play',
1
+ export enum IconEnum {
2
+ CALENDAR = 'calendar',
3
+ PLAY = 'play',
4
4
  }
package/src/i18n/i18n.ts CHANGED
@@ -1,16 +1,16 @@
1
- import { createI18n } from 'vue-i18n';
2
- import enMessages from './locales/en.json';
3
- import deMessages from './locales/de.json';
4
-
5
- const libraryMessages = {
6
- en: enMessages,
7
- de: deMessages,
8
- };
9
-
10
- export const createInternalI18n = () => {
11
- return createI18n({
12
- locale: 'de',
13
- fallbackLocale: 'de',
14
- messages: libraryMessages,
15
- });
1
+ import { createI18n } from 'vue-i18n';
2
+ import enMessages from './locales/en.json';
3
+ import deMessages from './locales/de.json';
4
+
5
+ const libraryMessages = {
6
+ en: enMessages,
7
+ de: deMessages,
8
+ };
9
+
10
+ export const createInternalI18n = () => {
11
+ return createI18n({
12
+ locale: 'de',
13
+ fallbackLocale: 'de',
14
+ messages: libraryMessages,
15
+ });
16
16
  };
@@ -1,31 +1,31 @@
1
- {
2
- "wl": {
3
- "date_input": {
4
- "placeholder": "TT.MM.JJJJ",
5
- "invalid_date": "Bitte ein gültiges Datum eingeben",
6
- "min_date_error": "Das Datum darf nicht vor {date} liegen",
7
- "max_date_error": "Das Datum darf nicht nach {date} liegen"
8
- },
9
- "input": {
10
- "placeholder": "Geben Sie Ihren Text ein"
11
- },
12
- "otp_input": {
13
- "enter_sms_code": "Bitte den per SMS gesendeten Code eingeben",
14
- "code_was_sent": "Code an Nummer {phoneNumber} gesendet",
15
- "confirm": "Bestätigen",
16
- "resend": "Code erneut senden"
17
- },
18
- "appointment_card": {
19
- "uhr": "Uhr",
20
- "unknown_patient": "Unbekannter Patient",
21
- "confirm": "Termin bestätigen",
22
- "cancel": "Termin stornieren",
23
- "reschedule": "Termin verschieben",
24
- "reschedule_after_cancellation": "Diesen Termin nochmal buchen",
25
- "cancelled": "Termin storniert",
26
- "fill_form_title": "Anamnesebogen benötigt!",
27
- "fill_form_description": "Bitte füllen Sie diesen vor ihren Termin aus",
28
- "anamnese_form": "Anamnesebogen"
29
- }
30
- }
1
+ {
2
+ "wl": {
3
+ "date_input": {
4
+ "placeholder": "TT.MM.JJJJ",
5
+ "invalid_date": "Bitte ein gültiges Datum eingeben",
6
+ "min_date_error": "Das Datum darf nicht vor {date} liegen",
7
+ "max_date_error": "Das Datum darf nicht nach {date} liegen"
8
+ },
9
+ "input": {
10
+ "placeholder": "Geben Sie Ihren Text ein"
11
+ },
12
+ "otp_input": {
13
+ "enter_sms_code": "Bitte den per SMS gesendeten Code eingeben",
14
+ "code_was_sent": "Code an Nummer {phoneNumber} gesendet",
15
+ "confirm": "Bestätigen",
16
+ "resend": "Code erneut senden"
17
+ },
18
+ "appointment_card": {
19
+ "uhr": "Uhr",
20
+ "unknown_patient": "Unbekannter Patient",
21
+ "confirm": "Termin bestätigen",
22
+ "cancel": "Termin stornieren",
23
+ "reschedule": "Termin verschieben",
24
+ "reschedule_after_cancellation": "Diesen Termin nochmal buchen",
25
+ "cancelled": "Termin storniert",
26
+ "fill_form_title": "Anamnesebogen benötigt!",
27
+ "fill_form_description": "Bitte füllen Sie diesen vor ihren Termin aus",
28
+ "anamnese_form": "Anamnesebogen"
29
+ }
30
+ }
31
31
  }
@@ -1,31 +1,31 @@
1
- {
2
- "wl": {
3
- "date_input": {
4
- "placeholder": "DD.MM.YYYY",
5
- "invalid_date": "Please enter a valid date",
6
- "min_date_error": "The date must not be before {date}",
7
- "max_date_error": "The date must not be after {date}"
8
- },
9
- "input": {
10
- "placeholder": "Enter your text"
11
- },
12
- "otp_input": {
13
- "enter_sms_code": "Please enter the code sent via SMS",
14
- "code_was_sent": "Code sent to number {phoneNumber}",
15
- "confirm": "Confirm",
16
- "resend": "Resend code"
17
- },
18
- "appointment_card": {
19
- "uhr": "o'clock",
20
- "unknown_patient": "Unknown patient",
21
- "confirm": "Confirm appointment",
22
- "cancel": "Cancel appointment",
23
- "reschedule": "Reschedule appointment",
24
- "reschedule_after_cancellation": "Book this appointment again",
25
- "cancelled": "Appointment cancelled",
26
- "fill_form_title": "Medical history form required!",
27
- "fill_form_description": "Please fill this out before your appointment",
28
- "anamnese_form": "Medical history form"
29
- }
30
- }
1
+ {
2
+ "wl": {
3
+ "date_input": {
4
+ "placeholder": "DD.MM.YYYY",
5
+ "invalid_date": "Please enter a valid date",
6
+ "min_date_error": "The date must not be before {date}",
7
+ "max_date_error": "The date must not be after {date}"
8
+ },
9
+ "input": {
10
+ "placeholder": "Enter your text"
11
+ },
12
+ "otp_input": {
13
+ "enter_sms_code": "Please enter the code sent via SMS",
14
+ "code_was_sent": "Code sent to number {phoneNumber}",
15
+ "confirm": "Confirm",
16
+ "resend": "Resend code"
17
+ },
18
+ "appointment_card": {
19
+ "uhr": "o'clock",
20
+ "unknown_patient": "Unknown patient",
21
+ "confirm": "Confirm appointment",
22
+ "cancel": "Cancel appointment",
23
+ "reschedule": "Reschedule appointment",
24
+ "reschedule_after_cancellation": "Book this appointment again",
25
+ "cancelled": "Appointment cancelled",
26
+ "fill_form_title": "Medical history form required!",
27
+ "fill_form_description": "Please fill this out before your appointment",
28
+ "anamnese_form": "Medical history form"
29
+ }
30
+ }
31
31
  }
package/src/index.ts CHANGED
@@ -1,34 +1,34 @@
1
- // src/index.ts
2
-
3
- // Import global CSS files
4
- import './assets/css/base.css';
5
- import './assets/css/variables.css';
6
-
7
- // Import all components
8
- import * as components from './components';
9
-
10
- // Import the App type from Vue
11
- import type { App } from 'vue';
12
- import { createInternalI18n } from './i18n/i18n';
13
-
14
- // Define the install function with proper typing
15
- const install = (app: App) => {
16
- if (!app?.config?.globalProperties?.$i18n) {
17
- const i18n = createInternalI18n();
18
- app.use(i18n);
19
- }
20
-
21
- const prefix = 'WL'; // Hardcoded prefix
22
- for (const [componentName, component] of Object.entries(components)) {
23
- app.component(`${prefix}${componentName}`, component);
24
- }
25
- };
26
-
27
- // Export the install function as a named export
28
- export const WlSharedComponents = { install };
29
-
30
- // Export each individual component
31
- export * from './components';
32
-
33
- // Export utilities
34
- export * from './utils';
1
+ // src/index.ts
2
+
3
+ // Import global CSS files
4
+ import './assets/css/base.css';
5
+ import './assets/css/variables.css';
6
+
7
+ // Import all components
8
+ import * as components from './components';
9
+
10
+ // Import the App type from Vue
11
+ import type { App } from 'vue';
12
+ import { createInternalI18n } from './i18n/i18n';
13
+
14
+ // Define the install function with proper typing
15
+ const install = (app: App) => {
16
+ if (!app?.config?.globalProperties?.$i18n) {
17
+ const i18n = createInternalI18n();
18
+ app.use(i18n);
19
+ }
20
+
21
+ const prefix = 'WL'; // Hardcoded prefix
22
+ for (const [componentName, component] of Object.entries(components)) {
23
+ app.component(`${prefix}${componentName}`, component);
24
+ }
25
+ };
26
+
27
+ // Export the install function as a named export
28
+ export const WlSharedComponents = { install };
29
+
30
+ // Export each individual component
31
+ export * from './components';
32
+
33
+ // Export utilities
34
+ export * from './utils';
package/src/main.ts CHANGED
@@ -1,11 +1,11 @@
1
- import { createApp } from 'vue';
2
- import App from '../App.vue';
3
- import vuetify from './plugins/vuetify'; // Import the Vuetify plugin
4
- import { createInternalI18n } from './i18n/i18n';
5
- import './assets/css/base.css';
6
- import './assets/css/variables.css';
7
-
8
- const app = createApp(App);
9
- app.use(vuetify); // Register Vuetify here
10
- app.use(createInternalI18n());
11
- app.mount('#app');
1
+ import { createApp } from 'vue';
2
+ import App from '../App.vue';
3
+ import vuetify from './plugins/vuetify'; // Import the Vuetify plugin
4
+ import { createInternalI18n } from './i18n/i18n';
5
+ import './assets/css/base.css';
6
+ import './assets/css/variables.css';
7
+
8
+ const app = createApp(App);
9
+ app.use(vuetify); // Register Vuetify here
10
+ app.use(createInternalI18n());
11
+ app.mount('#app');