@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,174 +1,174 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<v-btn
|
|
3
|
-
:color="color"
|
|
4
|
-
:disabled="disabled"
|
|
5
|
-
:prepend-icon="prependIcon"
|
|
6
|
-
:append-icon="appendIcon"
|
|
7
|
-
:loading="loading"
|
|
8
|
-
rounded="lg"
|
|
9
|
-
:density="density"
|
|
10
|
-
class="text-none wl-button"
|
|
11
|
-
:variant="variant"
|
|
12
|
-
:size="size"
|
|
13
|
-
:readonly="readonly"
|
|
14
|
-
:style="rootStyle"
|
|
15
|
-
data-testid="root"
|
|
16
|
-
>
|
|
17
|
-
<slot>{{ label }}</slot>
|
|
18
|
-
</v-btn>
|
|
19
|
-
</template>
|
|
20
|
-
|
|
21
|
-
<script setup lang="ts">
|
|
22
|
-
import { computed } from 'vue';
|
|
23
|
-
import { siteColors } from "../../utils/index";
|
|
24
|
-
|
|
25
|
-
const props = defineProps({
|
|
26
|
-
/**
|
|
27
|
-
* The color of the button.
|
|
28
|
-
* Default is '#172774' (a dark blue color).
|
|
29
|
-
*/
|
|
30
|
-
color: {
|
|
31
|
-
type: String,
|
|
32
|
-
default: siteColors['btn_bg'],
|
|
33
|
-
},
|
|
34
|
-
/**
|
|
35
|
-
* The text color of the button (for flat variant).
|
|
36
|
-
* Default is 'white'.
|
|
37
|
-
*/
|
|
38
|
-
textColor: {
|
|
39
|
-
type: String,
|
|
40
|
-
default: 'white',
|
|
41
|
-
},
|
|
42
|
-
/**
|
|
43
|
-
* Icon to display before the button label.
|
|
44
|
-
* Accepts the name of an icon (String).
|
|
45
|
-
*/
|
|
46
|
-
prependIcon: {
|
|
47
|
-
type: String,
|
|
48
|
-
},
|
|
49
|
-
/**
|
|
50
|
-
* Icon to display after the button label.
|
|
51
|
-
* Can be any valid icon name or value (type not specified for flexibility).
|
|
52
|
-
*/
|
|
53
|
-
appendIcon: {},
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Boolean to set the loading state of the button.
|
|
57
|
-
* When true, it shows a loading spinner.
|
|
58
|
-
* Default is false.
|
|
59
|
-
*/
|
|
60
|
-
loading: {
|
|
61
|
-
type: Boolean,
|
|
62
|
-
default: false,
|
|
63
|
-
},
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Defines the density of the button.
|
|
67
|
-
* Accepts 'default', 'comfortable', or other Vuetify density options.
|
|
68
|
-
* Default is 'default'.
|
|
69
|
-
*/
|
|
70
|
-
density: {
|
|
71
|
-
type: String,
|
|
72
|
-
default: 'default',
|
|
73
|
-
},
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* The visual style of the button.
|
|
77
|
-
* Accepts 'flat', 'outlined', 'contained', etc.
|
|
78
|
-
* Default is 'flat'.
|
|
79
|
-
*/
|
|
80
|
-
variant: {
|
|
81
|
-
type: String,
|
|
82
|
-
default: 'flat',
|
|
83
|
-
},
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Size of the button.
|
|
87
|
-
* Accepts 'small', 'medium', 'large', or 'default'.
|
|
88
|
-
* Default is 'default'.
|
|
89
|
-
*/
|
|
90
|
-
size: {
|
|
91
|
-
type: String,
|
|
92
|
-
default: 'default',
|
|
93
|
-
},
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* The text label to display inside the button.
|
|
97
|
-
* Default is 'Button'.
|
|
98
|
-
*/
|
|
99
|
-
label: {
|
|
100
|
-
type: String,
|
|
101
|
-
default: 'Button',
|
|
102
|
-
},
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Boolean to disable the button.
|
|
106
|
-
* When true, the button is disabled and not clickable.
|
|
107
|
-
* Default is false.
|
|
108
|
-
*/
|
|
109
|
-
disabled: {
|
|
110
|
-
type: Boolean,
|
|
111
|
-
default: false,
|
|
112
|
-
},
|
|
113
|
-
/**
|
|
114
|
-
* Boolean to set the button to read-only state.
|
|
115
|
-
* When true, the button displays the readonly attribute.
|
|
116
|
-
* Default is false.
|
|
117
|
-
*/
|
|
118
|
-
readonly: {
|
|
119
|
-
type: Boolean,
|
|
120
|
-
default: false,
|
|
121
|
-
},
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
const buttonStyle = computed(() => {
|
|
125
|
-
if (props.variant === 'flat') {
|
|
126
|
-
return { color: props.textColor };
|
|
127
|
-
}
|
|
128
|
-
return {};
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
// Compute a CSS variable for focus color to avoid hardcoded values.
|
|
132
|
-
// Use provided color prop, fall back to siteColors.btn_bg, then to a sensible default.
|
|
133
|
-
const focusColor = computed(() => {
|
|
134
|
-
const col = props.color || siteColors['btn_bg'] || '#172774';
|
|
135
|
-
return col;
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
// Expose a style object that includes the focus color custom property.
|
|
139
|
-
const rootStyle = computed(() => ({
|
|
140
|
-
...buttonStyle.value,
|
|
141
|
-
'--wl-button-focus-color': focusColor.value
|
|
142
|
-
}));
|
|
143
|
-
</script>
|
|
144
|
-
|
|
145
|
-
<style>
|
|
146
|
-
.wl-button.v-btn--variant-outlined {
|
|
147
|
-
border-width: 1.5px;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/* Accessibility: Focus Indicators (WCAG 2.4.7) */
|
|
151
|
-
.wl-button:focus-visible {
|
|
152
|
-
outline: 2px solid currentColor;
|
|
153
|
-
outline-offset: 2px;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
.wl-button.v-btn--variant-outlined:focus-visible {
|
|
157
|
-
/* Use component-provided focus color with fallback */
|
|
158
|
-
outline-color: var(--wl-button-focus-color, var(--Dental-Blue-0, #172774));
|
|
159
|
-
outline-width: 3px;
|
|
160
|
-
box-shadow: 0 0 0 4px rgba(0,0,0,0.08), 0 0 0 6px rgba(255,255,255,0.06) inset;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
.wl-button.v-btn--variant-flat:focus-visible {
|
|
164
|
-
outline-color: white;
|
|
165
|
-
box-shadow: 0 0 0 4px rgba(255, 255, 255, 0.3);
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
/* High contrast mode support */
|
|
169
|
-
@media (forced-colors: active) {
|
|
170
|
-
.wl-button {
|
|
171
|
-
border: 2px solid currentColor;
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
</style>
|
|
1
|
+
<template>
|
|
2
|
+
<v-btn
|
|
3
|
+
:color="color"
|
|
4
|
+
:disabled="disabled"
|
|
5
|
+
:prepend-icon="prependIcon"
|
|
6
|
+
:append-icon="appendIcon"
|
|
7
|
+
:loading="loading"
|
|
8
|
+
rounded="lg"
|
|
9
|
+
:density="density"
|
|
10
|
+
class="text-none wl-button"
|
|
11
|
+
:variant="variant"
|
|
12
|
+
:size="size"
|
|
13
|
+
:readonly="readonly"
|
|
14
|
+
:style="rootStyle"
|
|
15
|
+
data-testid="root"
|
|
16
|
+
>
|
|
17
|
+
<slot>{{ label }}</slot>
|
|
18
|
+
</v-btn>
|
|
19
|
+
</template>
|
|
20
|
+
|
|
21
|
+
<script setup lang="ts">
|
|
22
|
+
import { computed } from 'vue';
|
|
23
|
+
import { siteColors } from "../../utils/index";
|
|
24
|
+
|
|
25
|
+
const props = defineProps({
|
|
26
|
+
/**
|
|
27
|
+
* The color of the button.
|
|
28
|
+
* Default is '#172774' (a dark blue color).
|
|
29
|
+
*/
|
|
30
|
+
color: {
|
|
31
|
+
type: String,
|
|
32
|
+
default: siteColors['btn_bg'],
|
|
33
|
+
},
|
|
34
|
+
/**
|
|
35
|
+
* The text color of the button (for flat variant).
|
|
36
|
+
* Default is 'white'.
|
|
37
|
+
*/
|
|
38
|
+
textColor: {
|
|
39
|
+
type: String,
|
|
40
|
+
default: 'white',
|
|
41
|
+
},
|
|
42
|
+
/**
|
|
43
|
+
* Icon to display before the button label.
|
|
44
|
+
* Accepts the name of an icon (String).
|
|
45
|
+
*/
|
|
46
|
+
prependIcon: {
|
|
47
|
+
type: String,
|
|
48
|
+
},
|
|
49
|
+
/**
|
|
50
|
+
* Icon to display after the button label.
|
|
51
|
+
* Can be any valid icon name or value (type not specified for flexibility).
|
|
52
|
+
*/
|
|
53
|
+
appendIcon: {},
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Boolean to set the loading state of the button.
|
|
57
|
+
* When true, it shows a loading spinner.
|
|
58
|
+
* Default is false.
|
|
59
|
+
*/
|
|
60
|
+
loading: {
|
|
61
|
+
type: Boolean,
|
|
62
|
+
default: false,
|
|
63
|
+
},
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Defines the density of the button.
|
|
67
|
+
* Accepts 'default', 'comfortable', or other Vuetify density options.
|
|
68
|
+
* Default is 'default'.
|
|
69
|
+
*/
|
|
70
|
+
density: {
|
|
71
|
+
type: String,
|
|
72
|
+
default: 'default',
|
|
73
|
+
},
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* The visual style of the button.
|
|
77
|
+
* Accepts 'flat', 'outlined', 'contained', etc.
|
|
78
|
+
* Default is 'flat'.
|
|
79
|
+
*/
|
|
80
|
+
variant: {
|
|
81
|
+
type: String,
|
|
82
|
+
default: 'flat',
|
|
83
|
+
},
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Size of the button.
|
|
87
|
+
* Accepts 'small', 'medium', 'large', or 'default'.
|
|
88
|
+
* Default is 'default'.
|
|
89
|
+
*/
|
|
90
|
+
size: {
|
|
91
|
+
type: String,
|
|
92
|
+
default: 'default',
|
|
93
|
+
},
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* The text label to display inside the button.
|
|
97
|
+
* Default is 'Button'.
|
|
98
|
+
*/
|
|
99
|
+
label: {
|
|
100
|
+
type: String,
|
|
101
|
+
default: 'Button',
|
|
102
|
+
},
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Boolean to disable the button.
|
|
106
|
+
* When true, the button is disabled and not clickable.
|
|
107
|
+
* Default is false.
|
|
108
|
+
*/
|
|
109
|
+
disabled: {
|
|
110
|
+
type: Boolean,
|
|
111
|
+
default: false,
|
|
112
|
+
},
|
|
113
|
+
/**
|
|
114
|
+
* Boolean to set the button to read-only state.
|
|
115
|
+
* When true, the button displays the readonly attribute.
|
|
116
|
+
* Default is false.
|
|
117
|
+
*/
|
|
118
|
+
readonly: {
|
|
119
|
+
type: Boolean,
|
|
120
|
+
default: false,
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
const buttonStyle = computed(() => {
|
|
125
|
+
if (props.variant === 'flat') {
|
|
126
|
+
return { color: props.textColor };
|
|
127
|
+
}
|
|
128
|
+
return {};
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
// Compute a CSS variable for focus color to avoid hardcoded values.
|
|
132
|
+
// Use provided color prop, fall back to siteColors.btn_bg, then to a sensible default.
|
|
133
|
+
const focusColor = computed(() => {
|
|
134
|
+
const col = props.color || siteColors['btn_bg'] || '#172774';
|
|
135
|
+
return col;
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
// Expose a style object that includes the focus color custom property.
|
|
139
|
+
const rootStyle = computed(() => ({
|
|
140
|
+
...buttonStyle.value,
|
|
141
|
+
'--wl-button-focus-color': focusColor.value
|
|
142
|
+
}));
|
|
143
|
+
</script>
|
|
144
|
+
|
|
145
|
+
<style>
|
|
146
|
+
.wl-button.v-btn--variant-outlined {
|
|
147
|
+
border-width: 1.5px;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/* Accessibility: Focus Indicators (WCAG 2.4.7) */
|
|
151
|
+
.wl-button:focus-visible {
|
|
152
|
+
outline: 2px solid currentColor;
|
|
153
|
+
outline-offset: 2px;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.wl-button.v-btn--variant-outlined:focus-visible {
|
|
157
|
+
/* Use component-provided focus color with fallback */
|
|
158
|
+
outline-color: var(--wl-button-focus-color, var(--Dental-Blue-0, #172774));
|
|
159
|
+
outline-width: 3px;
|
|
160
|
+
box-shadow: 0 0 0 4px rgba(0,0,0,0.08), 0 0 0 6px rgba(255,255,255,0.06) inset;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
.wl-button.v-btn--variant-flat:focus-visible {
|
|
164
|
+
outline-color: white;
|
|
165
|
+
box-shadow: 0 0 0 4px rgba(255, 255, 255, 0.3);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/* High contrast mode support */
|
|
169
|
+
@media (forced-colors: active) {
|
|
170
|
+
.wl-button {
|
|
171
|
+
border: 2px solid currentColor;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
</style>
|