@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.
- package/.github/workflows/playwright.yml +205 -205
- package/.github/workflows/static.yml +61 -61
- package/.github/workflows/update-snapshots.yml +37 -37
- package/.prettierrc +5 -5
- package/.storybook/main.ts +18 -18
- package/.storybook/preview.ts +37 -37
- package/.storybook/storyWrapper.vue +18 -18
- package/.storybook/withVuetifyTheme.decorator.ts +21 -21
- package/App.vue +43 -38
- package/README.md +56 -56
- package/heroicons.ts +75 -75
- package/index.html +19 -19
- package/package.json +67 -67
- package/playwright.config.ts +48 -48
- package/public/audio/test.aac +0 -0
- package/public/background.svg +60 -60
- package/public/style.css +187 -187
- package/public/technologies.svg +22 -22
- package/src/assets/css/base.css +232 -232
- package/src/assets/css/variables.css +109 -109
- package/src/components/Accordion/Accordion.css +59 -59
- package/src/components/Accordion/AccordionGroup.vue +51 -51
- package/src/components/Accordion/AccordionItem.vue +66 -66
- package/src/components/Appointment/Card/Actions.css +54 -54
- package/src/components/Appointment/Card/Actions.vue +99 -99
- package/src/components/Appointment/Card/AnamneseNotification.css +15 -15
- package/src/components/Appointment/Card/AnamneseNotification.vue +23 -23
- package/src/components/Appointment/Card/Card.css +80 -80
- package/src/components/Appointment/Card/Card.vue +93 -93
- package/src/components/Appointment/Card/Details.css +50 -50
- package/src/components/Appointment/Card/Details.vue +43 -43
- package/src/components/Audio/Audio.vue +187 -187
- package/src/components/Audio/Waveform.vue +118 -117
- package/src/components/Button/Button.vue +174 -136
- package/src/components/CheckBox/CheckBox.css +214 -185
- package/src/components/CheckBox/Checkbox.vue +138 -130
- package/src/components/DateInput/DateInput.css +2 -2
- package/src/components/DateInput/DateInput.vue +262 -262
- package/src/components/Dialog/Dialog.css +6 -6
- package/src/components/Dialog/Dialog.vue +38 -29
- package/src/components/EditField/EditField.css +19 -19
- package/src/components/EditField/EditField.vue +202 -202
- package/src/components/ErrorPage/ErrorPage.css +172 -172
- package/src/components/IconBullet/IconBullet.vue +86 -86
- package/src/components/IconBullet/IconBulletList.vue +41 -41
- package/src/components/Icons/AdvanceAppointments.vue +153 -153
- package/src/components/Icons/Audio/CloudFailed.vue +20 -20
- package/src/components/Icons/Audio/CloudSaved.vue +21 -21
- package/src/components/Icons/Audio/Delete.vue +15 -15
- package/src/components/Icons/Audio/Pause.vue +18 -18
- package/src/components/Icons/Audio/Play.vue +15 -15
- package/src/components/Icons/CalendarNotification.vue +126 -126
- package/src/components/Icons/Chair.vue +32 -32
- package/src/components/Icons/ChairNotification.vue +35 -35
- package/src/components/Icons/Circle.vue +66 -66
- package/src/components/Icons/FavIcon.vue +22 -22
- package/src/components/Icons/FilledCircle.vue +11 -11
- package/src/components/Icons/Group3.vue +46 -46
- package/src/components/Icons/RingNotification.vue +54 -54
- package/src/components/Icons/SolidArrowRight.vue +14 -14
- package/src/components/Icons/calendar.vue +17 -17
- package/src/components/Icons/checkbox.vue +19 -19
- package/src/components/Icons/outlineChecked.vue +27 -27
- package/src/components/Icons/play.vue +5 -5
- package/src/components/Input/Input.css +187 -187
- package/src/components/Input/Input.vue +253 -247
- package/src/components/Laboratory/AppointmentCard/AppointmentCard.css +7 -7
- package/src/components/Laboratory/AppointmentCard/AppointmentCard.vue +116 -116
- package/src/components/Laboratory/ChatBoxImage/ChatBoxImage.vue +81 -81
- package/src/components/Laboratory/ChatMessage/ChatMessage.vue +113 -113
- package/src/components/Laboratory/ChatMessage/ChatMessageBadge.css +4 -4
- package/src/components/Laboratory/ChatMessage/ChatMessageBadge.vue +99 -99
- package/src/components/Laboratory/ChatNotification/ChatNotification.vue +130 -130
- package/src/components/Laboratory/DocumentCard/DocumentCard.css +3 -3
- package/src/components/Laboratory/DocumentCard/DocumentCard.vue +50 -50
- package/src/components/Laboratory/DocumentCard/DocumentCardItem.vue +53 -53
- package/src/components/Laboratory/InfoCard/InfoCard.vue +162 -162
- package/src/components/Laboratory/MainColumnsBar/MainColumnsBar.vue +102 -102
- package/src/components/Laboratory/ProgressCircle/ProgressCircle.vue +152 -152
- package/src/components/Laboratory/ProgressLinear/ProgressLinear.css +33 -33
- package/src/components/Laboratory/ProgressLinear/ProgressLinear.vue +75 -75
- package/src/components/Laboratory/SelectionColumnBar/SelectionColumnBar.vue +92 -92
- package/src/components/Laboratory/StatusNotification/StatusNotification.vue +49 -49
- package/src/components/Laboratory/TagLabel/TagLabel.vue +126 -126
- package/src/components/Laboratory/TagLabelGroup/TagLabelGroup.vue +97 -97
- package/src/components/Laboratory/TicketCard/TicketCard.css +3 -3
- package/src/components/Laboratory/TicketCard/TicketCard.vue +143 -143
- package/src/components/Laboratory/TimeLine/TimeLineEvent.css +18 -18
- package/src/components/Laboratory/TimeLine/TimeLineEvent.vue +119 -119
- package/src/components/Laboratory/TimeLine/Timeline.css +4 -4
- package/src/components/Laboratory/TimeLine/Timeline.vue +30 -30
- package/src/components/Loader/Loader.css +71 -51
- package/src/components/Loader/Loader.vue +1 -0
- package/src/components/MaintenanceBanner/MaintenanceBanner.css +353 -353
- package/src/components/MaintenanceBanner/MaintenanceBanner.vue +127 -127
- package/src/components/MaintenanceBanner/MaintenanceIllustration.vue +54 -54
- package/src/components/Modal/Modal.css +5 -5
- package/src/components/Modal/Modal.vue +22 -22
- package/src/components/NotificationBubble/NotificationBubble.css +4 -4
- package/src/components/NotificationBubble/NotificationBubble.vue +90 -90
- package/src/components/OtpInput/OtpInput.css +39 -39
- package/src/components/OtpInput/OtpInput.vue +151 -151
- package/src/components/PhoneInput/PhoneInput.css +31 -31
- package/src/components/PhoneInput/PhoneInput.vue +113 -113
- package/src/components/Select/Select.css +150 -150
- package/src/components/Select/Select.vue +316 -315
- package/src/components/TextArea/TextArea.css +3 -3
- package/src/components/TextArea/TextArea.vue +126 -126
- package/src/components/TickBox/TickBox.css +49 -49
- package/src/components/TickBox/TickBox.vue +126 -126
- package/src/components/accessibility.css +218 -0
- package/src/components/index.ts +28 -28
- package/src/constants/iconEnums.ts +3 -3
- package/src/i18n/i18n.ts +15 -15
- package/src/i18n/locales/de.json +30 -30
- package/src/i18n/locales/en.json +30 -30
- package/src/index.ts +34 -34
- package/src/main.ts +11 -11
- package/src/plugins/vuetify.ts +141 -141
- package/src/shims-vue.d.ts +10 -10
- package/src/stories/Accordion.stories.ts +650 -650
- package/src/stories/Audio.stories.ts +28 -28
- package/src/stories/Button.stories.ts +263 -263
- package/src/stories/CheckBox.stories.ts +348 -348
- package/src/stories/DateInput.stories.ts +53 -53
- package/src/stories/Dialog.stories.ts +147 -147
- package/src/stories/EditField.stories.ts +78 -78
- package/src/stories/IconBullet/IconBullet.stories.ts +201 -201
- package/src/stories/IconBullet/IconBulletList.stories.ts +275 -275
- package/src/stories/Input.stories.ts +351 -351
- package/src/stories/Laboratory/Cards/AppointmentCard/AppointmentCard.stories.ts +260 -260
- package/src/stories/Laboratory/Cards/DocumentCard/DocumentCard.stories.ts +176 -176
- package/src/stories/Laboratory/Cards/DocumentCard/DocumentCardItem.stories.ts +119 -119
- package/src/stories/Laboratory/Cards/InfoCard/InfoCard.stories.ts +320 -320
- package/src/stories/Laboratory/Cards/TicketCard/TicketCard.stories.ts +335 -335
- package/src/stories/Laboratory/Chat/ChatBoxImage.stories.ts +82 -82
- package/src/stories/Laboratory/Chat/ChatMessage.stories.ts +198 -198
- package/src/stories/Laboratory/Chat/ChatMessageBadge.stories.ts +204 -204
- package/src/stories/Laboratory/Chat/ChatNotification.stories.ts +144 -144
- package/src/stories/Laboratory/Chat/ProgressLinear.stories.ts +186 -186
- package/src/stories/Laboratory/Chat/StatusNotification.stories.ts +111 -111
- package/src/stories/Laboratory/MainColumnsBar.stories.ts +48 -48
- package/src/stories/Laboratory/ProgressCircle.stories.ts +261 -261
- package/src/stories/Laboratory/SelectionColumnBar.stories.ts +234 -234
- package/src/stories/Laboratory/TagLabel.stories.ts +418 -418
- package/src/stories/Laboratory/TagLabelGroup.stories.ts +234 -234
- package/src/stories/Laboratory/Timeline.stories.ts +403 -403
- package/src/stories/NotificationBubble.stories.ts +194 -194
- package/src/stories/OtpInput.stories.ts +100 -100
- package/src/stories/PhoneInput.stories.ts +52 -52
- package/src/stories/Select.stories.ts +419 -419
- package/src/stories/TextArea.stories.ts +112 -112
- package/src/stories/TickBox.stories.ts +294 -294
- package/src/stories/v-icon.stories.ts +91 -91
- package/src/utils/index.ts +109 -109
- package/src/vite-env.d.ts +1 -1
- package/tests/e2e/README.md +220 -220
- package/tests/e2e/accessibility.spec.ts +638 -638
- package/tests/e2e/accordion.spec.ts +42 -42
- package/tests/e2e/additional-components.spec.ts +437 -437
- package/tests/e2e/all-components.spec.ts +135 -135
- package/tests/e2e/appointment-card.spec.ts +816 -816
- package/tests/e2e/button-fixed.spec.ts +58 -58
- package/tests/e2e/button.spec.ts +76 -76
- package/tests/e2e/checkbox.spec.ts +50 -50
- package/tests/e2e/date-input.spec.ts +46 -46
- package/tests/e2e/debug.spec.ts +51 -51
- package/tests/e2e/dialog.spec.ts +58 -58
- package/tests/e2e/input.spec.ts +55 -55
- package/tests/e2e/laboratory-components.spec.ts +320 -320
- package/tests/e2e/otp-input.spec.ts +50 -50
- package/tests/e2e/select.spec.ts +52 -52
- package/tests/e2e/storybook-utils.ts +59 -59
- package/tests/e2e/test-basic.spec.ts +33 -33
- package/tests/e2e/visual-regression.spec.ts +350 -350
- package/tests/unit/accessibility/component-a11y.spec.ts +469 -0
- package/tests/unit/components/Accordion/AccordionGroup.spec.ts +228 -0
- package/tests/unit/components/Accordion/AccordionGroup.spec.ts.skip +342 -342
- package/tests/unit/components/Accordion/AccordionItem.spec.ts +292 -0
- package/tests/unit/components/Accordion/AccordionItem.spec.ts.skip +383 -383
- package/tests/unit/components/Appointment/AnamneseNotification.spec.ts +176 -0
- package/tests/unit/components/Appointment/Card/Actions.spec.ts +407 -407
- package/tests/unit/components/Appointment/Card/Card.spec.ts +485 -485
- package/tests/unit/components/Appointment/Card/Details.spec.ts +397 -397
- package/tests/unit/components/Audio/Audio.spec.ts +403 -403
- package/tests/unit/components/Audio/Waveform.spec.ts +483 -483
- package/tests/unit/components/Background/Background.spec.ts +177 -0
- package/tests/unit/components/Core/Button.spec.ts +336 -336
- package/tests/unit/components/Core/Checkbox.spec.ts +544 -544
- package/tests/unit/components/Core/DateInput.spec.ts +690 -690
- package/tests/unit/components/Core/Dialog.spec.ts +485 -485
- package/tests/unit/components/Core/EditField.spec.ts +782 -782
- package/tests/unit/components/Core/Input.spec.ts +512 -512
- package/tests/unit/components/Core/Modal.spec.ts +518 -518
- package/tests/unit/components/Core/NotificationBubble.spec.ts +606 -606
- package/tests/unit/components/Core/OtpInput.spec.ts +708 -708
- package/tests/unit/components/Core/PhoneInput.spec.ts +619 -619
- package/tests/unit/components/Core/Select.spec.ts +712 -712
- package/tests/unit/components/Core/TextArea.spec.ts +565 -565
- package/tests/unit/components/Core/TickBox.spec.ts +779 -779
- package/tests/unit/components/ErrorPage/ErrorPage.spec.ts +313 -0
- package/tests/unit/components/ErrorPage/ErrorPageLogo.spec.ts +153 -0
- package/tests/unit/components/IconBullet/IconBullet.spec.ts +356 -356
- package/tests/unit/components/IconBullet/IconBulletList.spec.ts +371 -371
- package/tests/unit/components/Icons/AdvanceAppointments.spec.ts +61 -0
- package/tests/unit/components/Icons/Audio/CloudFailed.spec.ts +108 -108
- package/tests/unit/components/Icons/Audio/CloudSaved.spec.ts +149 -149
- package/tests/unit/components/Icons/Audio/Delete.spec.ts +158 -158
- package/tests/unit/components/Icons/Audio/Pause.spec.ts +208 -208
- package/tests/unit/components/Icons/Audio/Play.spec.ts +217 -217
- package/tests/unit/components/Icons/CalendarNotification.spec.ts +186 -186
- package/tests/unit/components/Icons/Chair.spec.ts +234 -234
- package/tests/unit/components/Icons/ChairNotification.spec.ts +311 -311
- package/tests/unit/components/Icons/Circle.spec.ts +255 -255
- package/tests/unit/components/Icons/FavIcon.spec.ts +251 -251
- package/tests/unit/components/Icons/FilledCircle.spec.ts +274 -274
- package/tests/unit/components/Icons/Group3.spec.ts +355 -355
- package/tests/unit/components/Icons/Logo.spec.ts +228 -0
- package/tests/unit/components/Icons/MiniLogo.spec.ts +38 -0
- package/tests/unit/components/Icons/RingNotification.spec.ts +393 -393
- package/tests/unit/components/Icons/SolidArrowRight.spec.ts +49 -0
- package/tests/unit/components/Icons/calendar.spec.ts +286 -286
- package/tests/unit/components/Icons/checkbox.spec.ts +315 -315
- package/tests/unit/components/Icons/outlineChecked.spec.ts +434 -434
- package/tests/unit/components/Icons/play.spec.ts +308 -308
- package/tests/unit/components/Laboratory/AppointmentCard.spec.ts +167 -167
- package/tests/unit/components/Laboratory/ChatBoxImage.spec.ts +179 -179
- package/tests/unit/components/Laboratory/ChatMessage.spec.ts +263 -263
- package/tests/unit/components/Laboratory/ChatMessageBadge.spec.ts +282 -282
- package/tests/unit/components/Laboratory/ChatNotification.spec.ts +256 -256
- package/tests/unit/components/Laboratory/DocumentCard.spec.ts +228 -228
- package/tests/unit/components/Laboratory/DocumentCardItem.spec.ts +236 -236
- package/tests/unit/components/Laboratory/InfoCard.spec.ts +308 -308
- package/tests/unit/components/Laboratory/MainColumnsBar.spec.ts +251 -251
- package/tests/unit/components/Laboratory/ProgressCircle.spec.ts +290 -290
- package/tests/unit/components/Laboratory/ProgressLinear.spec.ts +275 -275
- package/tests/unit/components/Laboratory/SelectionColumnBar.spec.ts +288 -288
- package/tests/unit/components/Laboratory/StatusNotification.spec.ts +296 -296
- package/tests/unit/components/Laboratory/TagLabel.spec.ts +353 -353
- package/tests/unit/components/Laboratory/TagLabelGroup.spec.ts +377 -377
- package/tests/unit/components/Laboratory/TicketCard.spec.ts +351 -351
- package/tests/unit/components/Laboratory/TimeLineEvent.spec.ts +381 -381
- package/tests/unit/components/Laboratory/Timeline.spec.ts +419 -419
- package/tests/unit/components/Loader/Loader.spec.ts +197 -0
- package/tests/unit/components/MaintenanceBanner/MaintenanceBanner.spec.ts +302 -0
- package/tests/unit/constants/iconEnums.spec.ts +39 -39
- package/tests/unit/i18n/i18n.spec.ts +88 -88
- package/tests/unit/plugins/vuetify.spec.ts +220 -220
- package/tests/unit/setup.ts +189 -189
- package/tests/unit/src/components/index.spec.ts.skip +192 -192
- package/tests/unit/src/index.spec.ts.skip +182 -182
- package/tests/unit/src/main.spec.ts +151 -151
- package/tests/unit/utils/accessibility.spec.ts +318 -0
- package/tsconfig.json +26 -26
- package/vite.config.ts +29 -29
- 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
|
+
|
package/src/components/index.ts
CHANGED
|
@@ -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
|
};
|
package/src/i18n/locales/de.json
CHANGED
|
@@ -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
|
}
|
package/src/i18n/locales/en.json
CHANGED
|
@@ -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');
|