@zap-wunschlachen/wl-shared-components 1.0.37 → 1.0.38
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 +33 -43
- 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/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 -118
- package/src/components/Button/Button.vue +174 -174
- package/src/components/CheckBox/CheckBox.css +214 -214
- package/src/components/CheckBox/Checkbox.vue +138 -138
- 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 -38
- 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 -253
- 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 -71
- 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 -316
- package/src/components/StagingBanner/StagingBanner.css +19 -0
- package/src/components/StagingBanner/StagingBanner.vue +82 -0
- 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 -218
- package/src/components/index.ts +29 -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 -469
- package/tests/unit/components/Accordion/AccordionGroup.spec.ts +228 -228
- package/tests/unit/components/Accordion/AccordionGroup.spec.ts.skip +342 -342
- package/tests/unit/components/Accordion/AccordionItem.spec.ts +292 -292
- package/tests/unit/components/Accordion/AccordionItem.spec.ts.skip +383 -383
- package/tests/unit/components/Appointment/AnamneseNotification.spec.ts +176 -176
- 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 -177
- 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 -313
- package/tests/unit/components/ErrorPage/ErrorPageLogo.spec.ts +153 -153
- 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 -61
- 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 -228
- package/tests/unit/components/Icons/MiniLogo.spec.ts +38 -38
- package/tests/unit/components/Icons/RingNotification.spec.ts +393 -393
- package/tests/unit/components/Icons/SolidArrowRight.spec.ts +49 -49
- 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 -197
- package/tests/unit/components/MaintenanceBanner/MaintenanceBanner.spec.ts +302 -302
- 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 -318
- package/tsconfig.json +26 -26
- package/vite.config.ts +29 -29
- package/vitest.config.ts +83 -83
- package/public/audio/test.aac +0 -0
|
@@ -1,126 +1,126 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<v-checkbox
|
|
3
|
-
class="tick-box"
|
|
4
|
-
:class="checkboxClass"
|
|
5
|
-
true-icon="heroicons:outline-checked"
|
|
6
|
-
false-icon="heroicons:outline"
|
|
7
|
-
:disabled="disabled"
|
|
8
|
-
:value="value"
|
|
9
|
-
:density="density"
|
|
10
|
-
v-model="internalValue"
|
|
11
|
-
:color="hoverColor"
|
|
12
|
-
:base-color="hoverColor"
|
|
13
|
-
data-testid="root"
|
|
14
|
-
>
|
|
15
|
-
<!-- Custom label slot with dynamic style -->
|
|
16
|
-
<template #label>
|
|
17
|
-
<span :style="labelStyles">{{ label }}</span>
|
|
18
|
-
</template>
|
|
19
|
-
</v-checkbox>
|
|
20
|
-
</template>
|
|
21
|
-
|
|
22
|
-
<script setup>
|
|
23
|
-
import { computed } from 'vue';
|
|
24
|
-
import './TickBox.css';
|
|
25
|
-
|
|
26
|
-
// Define props for the TickBox component
|
|
27
|
-
const props = defineProps({
|
|
28
|
-
/**
|
|
29
|
-
* The label text displayed next to the tick box.
|
|
30
|
-
* This prop is required.
|
|
31
|
-
*/
|
|
32
|
-
label: {
|
|
33
|
-
type: String,
|
|
34
|
-
required: true,
|
|
35
|
-
},
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Indicates if the tick box is in a success state.
|
|
39
|
-
* When true, the success styling will be applied.
|
|
40
|
-
*/
|
|
41
|
-
success: {
|
|
42
|
-
type: Boolean,
|
|
43
|
-
default: false,
|
|
44
|
-
},
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Indicates if the tick box is in an error state.
|
|
48
|
-
* When true, the error styling will be applied.
|
|
49
|
-
*/
|
|
50
|
-
error: {
|
|
51
|
-
type: Boolean,
|
|
52
|
-
default: false,
|
|
53
|
-
},
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Disables the tick box when true, making it non-interactive.
|
|
57
|
-
*/
|
|
58
|
-
disabled: {
|
|
59
|
-
type: Boolean,
|
|
60
|
-
default: false,
|
|
61
|
-
},
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* The value that the tick box represents when checked.
|
|
65
|
-
* Can be a string, number, or boolean. Default is `true`.
|
|
66
|
-
*/
|
|
67
|
-
value: {
|
|
68
|
-
type: [String, Number, Boolean],
|
|
69
|
-
default: true,
|
|
70
|
-
},
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* The current value bound to the tick box for v-model.
|
|
74
|
-
* Can be an array for multiple selection or boolean for single selection.
|
|
75
|
-
* This prop is required.
|
|
76
|
-
*/
|
|
77
|
-
modelValue: {
|
|
78
|
-
type: [Array, Boolean],
|
|
79
|
-
required: true,
|
|
80
|
-
},
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* Controls the density of the tick box, such as padding and size.
|
|
84
|
-
* Default is 'comfortable'.
|
|
85
|
-
*/
|
|
86
|
-
density: {
|
|
87
|
-
type: String,
|
|
88
|
-
required: false,
|
|
89
|
-
default: 'comfortable',
|
|
90
|
-
},
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
// Emit event for v-model binding
|
|
94
|
-
const emit = defineEmits(['update:modelValue']);
|
|
95
|
-
|
|
96
|
-
// Computed property for v-model binding (two-way binding)
|
|
97
|
-
const internalValue = computed({
|
|
98
|
-
get() {
|
|
99
|
-
return props.modelValue; // Get the current modelValue from the parent
|
|
100
|
-
},
|
|
101
|
-
set(newValue) {
|
|
102
|
-
emit('update:modelValue', newValue); // Emit the updated value to the parent
|
|
103
|
-
},
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
// Computed property for dynamic class based on error or success state
|
|
107
|
-
const checkboxClass = computed(() => {
|
|
108
|
-
if (props.error) return 'error-state'; // Return error class if in error state
|
|
109
|
-
if (props.success) return 'success-state'; // Return success class if in success state
|
|
110
|
-
return 'default-state'; // Default class when no error or success
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
// Computed property for dynamic label styles based on state
|
|
114
|
-
const labelStyles = computed(() => {
|
|
115
|
-
if (props.error) return { color: 'var(--Error-Red-0)' }; // Error styling for label
|
|
116
|
-
if (props.success) return { color: 'var(--Success-Green-1)' }; // Success styling for label
|
|
117
|
-
return { color: 'var(--Dental-Blue-0)' }; // Default label styling
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
// Computed property for dynamic color based on error or success state
|
|
121
|
-
const hoverColor = computed(() => {
|
|
122
|
-
if (props.error) return 'var(--Error-Red-0)';
|
|
123
|
-
if (props.success) return 'var(--Success-Green-1)';
|
|
124
|
-
return 'var(--Dental-Blue-0)';
|
|
125
|
-
});
|
|
126
|
-
</script>
|
|
1
|
+
<template>
|
|
2
|
+
<v-checkbox
|
|
3
|
+
class="tick-box"
|
|
4
|
+
:class="checkboxClass"
|
|
5
|
+
true-icon="heroicons:outline-checked"
|
|
6
|
+
false-icon="heroicons:outline"
|
|
7
|
+
:disabled="disabled"
|
|
8
|
+
:value="value"
|
|
9
|
+
:density="density"
|
|
10
|
+
v-model="internalValue"
|
|
11
|
+
:color="hoverColor"
|
|
12
|
+
:base-color="hoverColor"
|
|
13
|
+
data-testid="root"
|
|
14
|
+
>
|
|
15
|
+
<!-- Custom label slot with dynamic style -->
|
|
16
|
+
<template #label>
|
|
17
|
+
<span :style="labelStyles">{{ label }}</span>
|
|
18
|
+
</template>
|
|
19
|
+
</v-checkbox>
|
|
20
|
+
</template>
|
|
21
|
+
|
|
22
|
+
<script setup>
|
|
23
|
+
import { computed } from 'vue';
|
|
24
|
+
import './TickBox.css';
|
|
25
|
+
|
|
26
|
+
// Define props for the TickBox component
|
|
27
|
+
const props = defineProps({
|
|
28
|
+
/**
|
|
29
|
+
* The label text displayed next to the tick box.
|
|
30
|
+
* This prop is required.
|
|
31
|
+
*/
|
|
32
|
+
label: {
|
|
33
|
+
type: String,
|
|
34
|
+
required: true,
|
|
35
|
+
},
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Indicates if the tick box is in a success state.
|
|
39
|
+
* When true, the success styling will be applied.
|
|
40
|
+
*/
|
|
41
|
+
success: {
|
|
42
|
+
type: Boolean,
|
|
43
|
+
default: false,
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Indicates if the tick box is in an error state.
|
|
48
|
+
* When true, the error styling will be applied.
|
|
49
|
+
*/
|
|
50
|
+
error: {
|
|
51
|
+
type: Boolean,
|
|
52
|
+
default: false,
|
|
53
|
+
},
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Disables the tick box when true, making it non-interactive.
|
|
57
|
+
*/
|
|
58
|
+
disabled: {
|
|
59
|
+
type: Boolean,
|
|
60
|
+
default: false,
|
|
61
|
+
},
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* The value that the tick box represents when checked.
|
|
65
|
+
* Can be a string, number, or boolean. Default is `true`.
|
|
66
|
+
*/
|
|
67
|
+
value: {
|
|
68
|
+
type: [String, Number, Boolean],
|
|
69
|
+
default: true,
|
|
70
|
+
},
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* The current value bound to the tick box for v-model.
|
|
74
|
+
* Can be an array for multiple selection or boolean for single selection.
|
|
75
|
+
* This prop is required.
|
|
76
|
+
*/
|
|
77
|
+
modelValue: {
|
|
78
|
+
type: [Array, Boolean],
|
|
79
|
+
required: true,
|
|
80
|
+
},
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Controls the density of the tick box, such as padding and size.
|
|
84
|
+
* Default is 'comfortable'.
|
|
85
|
+
*/
|
|
86
|
+
density: {
|
|
87
|
+
type: String,
|
|
88
|
+
required: false,
|
|
89
|
+
default: 'comfortable',
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
// Emit event for v-model binding
|
|
94
|
+
const emit = defineEmits(['update:modelValue']);
|
|
95
|
+
|
|
96
|
+
// Computed property for v-model binding (two-way binding)
|
|
97
|
+
const internalValue = computed({
|
|
98
|
+
get() {
|
|
99
|
+
return props.modelValue; // Get the current modelValue from the parent
|
|
100
|
+
},
|
|
101
|
+
set(newValue) {
|
|
102
|
+
emit('update:modelValue', newValue); // Emit the updated value to the parent
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
// Computed property for dynamic class based on error or success state
|
|
107
|
+
const checkboxClass = computed(() => {
|
|
108
|
+
if (props.error) return 'error-state'; // Return error class if in error state
|
|
109
|
+
if (props.success) return 'success-state'; // Return success class if in success state
|
|
110
|
+
return 'default-state'; // Default class when no error or success
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
// Computed property for dynamic label styles based on state
|
|
114
|
+
const labelStyles = computed(() => {
|
|
115
|
+
if (props.error) return { color: 'var(--Error-Red-0)' }; // Error styling for label
|
|
116
|
+
if (props.success) return { color: 'var(--Success-Green-1)' }; // Success styling for label
|
|
117
|
+
return { color: 'var(--Dental-Blue-0)' }; // Default label styling
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
// Computed property for dynamic color based on error or success state
|
|
121
|
+
const hoverColor = computed(() => {
|
|
122
|
+
if (props.error) return 'var(--Error-Red-0)';
|
|
123
|
+
if (props.success) return 'var(--Success-Green-1)';
|
|
124
|
+
return 'var(--Dental-Blue-0)';
|
|
125
|
+
});
|
|
126
|
+
</script>
|
|
@@ -1,218 +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
|
+
/**
|
|
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
|
+
|