@zap-wunschlachen/wl-shared-components 1.0.76 → 1.0.78
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/playwright.yml +229 -229
- package/.github/workflows/static.yml +61 -61
- package/.github/workflows/update-snapshots.yml +37 -37
- package/.prettierrc.json +8 -8
- 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 +139 -139
- package/README.md +56 -56
- package/docs/assets.md +62 -62
- package/heroicons.ts +75 -75
- package/index.html +19 -19
- package/package.json +71 -71
- 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/scripts/check-translations.ts +352 -352
- package/src/assets/css/base.css +242 -242
- package/src/assets/css/variables.css +176 -176
- package/src/components/Accordion/Accordion.css +65 -65
- package/src/components/Accordion/AccordionGroup.vue +88 -88
- package/src/components/Accordion/AccordionItem.vue +272 -272
- package/src/components/Accordion/presets/default.css +4 -4
- package/src/components/Accordion/presets/elevated.css +25 -25
- package/src/components/Accordion/presets/filled.css +26 -26
- package/src/components/Accordion/presets/index.css +5 -5
- package/src/components/Accordion/presets/plain.css +34 -34
- 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 +20 -20
- package/src/components/Appointment/Card/AnamneseNotification.vue +23 -23
- package/src/components/Appointment/Card/Card.css +99 -99
- package/src/components/Appointment/Card/Card.vue +97 -97
- package/src/components/Appointment/Card/Details.css +62 -62
- package/src/components/Appointment/Card/Details.vue +44 -44
- package/src/components/Audio/Audio.vue +187 -187
- package/src/components/Audio/Waveform.vue +118 -118
- package/src/components/Banner/Banner.css +29 -29
- package/src/components/Banner/Banner.vue +89 -89
- package/src/components/Button/Button.vue +257 -257
- package/src/components/CheckBox/CheckBox.css +234 -234
- package/src/components/CheckBox/Checkbox.vue +184 -184
- package/src/components/DateInput/DateInput.css +2 -2
- package/src/components/DateInput/DateInput.vue +376 -370
- package/src/components/Dialog/Dialog.css +6 -6
- package/src/components/Dialog/Dialog.vue +46 -46
- package/src/components/EditField/EditField.css +19 -19
- package/src/components/EditField/EditField.vue +211 -211
- package/src/components/ErrorPage/ErrorPage.css +172 -172
- package/src/components/IconBullet/IconBullet.vue +104 -104
- package/src/components/IconBullet/IconBulletList.vue +55 -55
- package/src/components/Icons/AdvanceAppointments.vue +161 -161
- package/src/components/Icons/Audio/CloudFailed.vue +27 -27
- package/src/components/Icons/Audio/CloudSaved.vue +28 -28
- package/src/components/Icons/Audio/Delete.vue +22 -22
- package/src/components/Icons/Audio/Pause.vue +25 -25
- package/src/components/Icons/Audio/Play.vue +22 -22
- package/src/components/Icons/Calendar.vue +28 -28
- package/src/components/Icons/CalendarNotification.vue +137 -137
- package/src/components/Icons/Chair.vue +43 -43
- package/src/components/Icons/ChairNotification.vue +46 -46
- package/src/components/Icons/Circle.vue +66 -66
- package/src/components/Icons/FavIcon.vue +69 -69
- package/src/components/Icons/FilledCircle.vue +11 -11
- package/src/components/Icons/Group3.vue +57 -57
- package/src/components/Icons/Play.vue +16 -16
- package/src/components/Icons/RingNotification.vue +65 -65
- package/src/components/Icons/SolidArrowRight.vue +14 -14
- package/src/components/Icons/checkbox.vue +19 -19
- package/src/components/Icons/outlineChecked.vue +38 -38
- package/src/components/Input/Input.css +234 -234
- package/src/components/Input/Input.vue +281 -281
- 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 +78 -78
- package/src/components/MaintenanceBanner/MaintenanceBanner.css +353 -353
- package/src/components/MaintenanceBanner/MaintenanceBanner.vue +140 -140
- package/src/components/MaintenanceBanner/MaintenanceIllustration.vue +54 -54
- package/src/components/Modal/Modal.css +5 -5
- package/src/components/Modal/Modal.vue +29 -29
- package/src/components/NotificationBubble/NotificationBubble.css +4 -4
- package/src/components/NotificationBubble/NotificationBubble.vue +90 -90
- package/src/components/OtpInput/OtpInput.css +43 -43
- package/src/components/OtpInput/OtpInput.vue +181 -181
- package/src/components/PhoneInput/PhoneInput.css +151 -126
- package/src/components/PhoneInput/PhoneInput.vue +230 -139
- package/src/components/RadioGroup/RadioGroup.css +65 -0
- package/src/components/RadioGroup/RadioGroup.vue +134 -0
- package/src/components/Select/Select.css +172 -172
- package/src/components/Select/Select.vue +377 -377
- package/src/components/SelectAutocomplete/SelectAutocomplete.css +172 -172
- package/src/components/SelectAutocomplete/SelectAutocomplete.vue +414 -414
- package/src/components/TextArea/TextArea.css +269 -269
- package/src/components/TextArea/TextArea.vue +207 -207
- package/src/components/TickBox/TickBox.css +116 -116
- package/src/components/TickBox/TickBox.vue +172 -172
- package/src/components/Tile/Tile.css +106 -106
- package/src/components/Tile/Tile.vue +173 -173
- package/src/components/accessibility.css +218 -218
- package/src/components/index.ts +110 -109
- 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 +43 -43
- package/src/main.ts +11 -11
- package/src/pages/AccordionGroupPage.vue +873 -873
- package/src/pages/AllPage.vue +2483 -2365
- package/src/pages/SelectPage.vue +1302 -1302
- package/src/pages/TilePage.vue +902 -902
- package/src/plugins/vuetify.ts +54 -54
- package/src/shims-vue.d.ts +30 -30
- package/src/utils/index.ts +733 -733
- package/src/vite-env.d.ts +1 -1
- package/tests/unit/accessibility/component-a11y.spec.ts +657 -657
- package/tests/unit/components/Accordion/AccordionGroup.spec.ts +228 -228
- package/tests/unit/components/Accordion/AccordionItem.spec.ts +257 -257
- package/tests/unit/components/Appointment/AnamneseNotification.spec.ts +176 -176
- package/tests/unit/components/Appointment/Card/Actions.spec.ts +436 -436
- package/tests/unit/components/Appointment/Card/Card.spec.ts +531 -531
- package/tests/unit/components/Appointment/Card/Details.spec.ts +395 -395
- 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/AnamneseAnswerDialog.spec.ts +344 -0
- package/tests/unit/components/Core/Banner.spec.ts +187 -0
- package/tests/unit/components/Core/Button.spec.ts +346 -346
- package/tests/unit/components/Core/Checkbox.spec.ts +544 -544
- package/tests/unit/components/Core/DateInput.spec.ts +702 -702
- package/tests/unit/components/Core/Dialog.spec.ts +448 -448
- package/tests/unit/components/Core/EditField.spec.ts +541 -541
- package/tests/unit/components/Core/Input.spec.ts +512 -512
- package/tests/unit/components/Core/List.spec.ts +163 -0
- package/tests/unit/components/Core/ListItem.spec.ts +205 -0
- 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 +757 -619
- package/tests/unit/components/Core/RadioGroup.spec.ts +318 -0
- package/tests/unit/components/Core/Select.spec.ts +712 -712
- package/tests/unit/components/Core/SelectAutocomplete.spec.ts +361 -0
- package/tests/unit/components/Core/TextArea.spec.ts +565 -565
- package/tests/unit/components/Core/TickBox.spec.ts +836 -836
- package/tests/unit/components/Core/Tile.spec.ts +286 -0
- package/tests/unit/components/DateInput/DateInput.spec.ts +128 -0
- 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 +186 -186
- 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 +193 -193
- package/tests/unit/components/Icons/Chair.spec.ts +241 -241
- package/tests/unit/components/Icons/ChairNotification.spec.ts +318 -318
- package/tests/unit/components/Icons/Circle.spec.ts +255 -255
- package/tests/unit/components/Icons/FavIcon.spec.ts +259 -259
- package/tests/unit/components/Icons/FilledCircle.spec.ts +274 -274
- package/tests/unit/components/Icons/Group3.spec.ts +362 -362
- package/tests/unit/components/Icons/Logo.spec.ts +229 -229
- package/tests/unit/components/Icons/MiniLogo.spec.ts +38 -38
- package/tests/unit/components/Icons/RingNotification.spec.ts +400 -400
- package/tests/unit/components/Icons/SolidArrowRight.spec.ts +49 -49
- package/tests/unit/components/Icons/calendar.spec.ts +293 -293
- package/tests/unit/components/Icons/checkbox.spec.ts +315 -315
- package/tests/unit/components/Icons/outlineChecked.spec.ts +441 -441
- package/tests/unit/components/Icons/play.spec.ts +315 -315
- 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 +182 -182
- package/tests/unit/setup.ts +237 -237
- 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 +111 -111
- package/tests/unit/utils/accessibility.spec.ts +318 -318
- package/tests/unit/utils/anamnese.spec.ts +531 -0
- package/tsconfig.json +26 -26
- package/vite.config.ts +29 -29
- package/vitest.config.ts +91 -91
|
@@ -1,172 +1,172 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div class="tick-box-wrapper" :style="tickBoxCssVars">
|
|
3
|
-
<v-checkbox
|
|
4
|
-
class="tick-box"
|
|
5
|
-
:class="checkboxClass"
|
|
6
|
-
true-icon="heroicons:outline-checked"
|
|
7
|
-
false-icon="heroicons:outline"
|
|
8
|
-
:disabled="disabled"
|
|
9
|
-
:value="value"
|
|
10
|
-
:density="density"
|
|
11
|
-
v-model="internalValue"
|
|
12
|
-
:color="hoverColor"
|
|
13
|
-
:base-color="hoverColor"
|
|
14
|
-
data-testid="root"
|
|
15
|
-
>
|
|
16
|
-
<!-- Custom label slot with dynamic style -->
|
|
17
|
-
<template #label>
|
|
18
|
-
<span class="tick-box-label" :class="labelClass">{{ label }}</span>
|
|
19
|
-
</template>
|
|
20
|
-
</v-checkbox>
|
|
21
|
-
</div>
|
|
22
|
-
</template>
|
|
23
|
-
|
|
24
|
-
<script setup>
|
|
25
|
-
import { computed, inject } from 'vue';
|
|
26
|
-
import './TickBox.css';
|
|
27
|
-
import { siteColors } from "../../utils/index";
|
|
28
|
-
|
|
29
|
-
// Inject theme colors from ThemeProvider, fallback to global siteColors
|
|
30
|
-
const injectedThemeColors = inject('themeColors', null);
|
|
31
|
-
const colors = computed(() => {
|
|
32
|
-
if (injectedThemeColors) {
|
|
33
|
-
return injectedThemeColors.value;
|
|
34
|
-
}
|
|
35
|
-
return siteColors;
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
// Define props for the TickBox component
|
|
39
|
-
const props = defineProps({
|
|
40
|
-
/**
|
|
41
|
-
* The label text displayed next to the tick box.
|
|
42
|
-
* This prop is required.
|
|
43
|
-
*/
|
|
44
|
-
label: {
|
|
45
|
-
type: String,
|
|
46
|
-
required: true,
|
|
47
|
-
},
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Indicates if the tick box is in a success state.
|
|
51
|
-
* When true, the success styling will be applied.
|
|
52
|
-
*/
|
|
53
|
-
success: {
|
|
54
|
-
type: Boolean,
|
|
55
|
-
default: false,
|
|
56
|
-
},
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Indicates if the tick box is in an error state.
|
|
60
|
-
* When true, the error styling will be applied.
|
|
61
|
-
*/
|
|
62
|
-
error: {
|
|
63
|
-
type: Boolean,
|
|
64
|
-
default: false,
|
|
65
|
-
},
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Disables the tick box when true, making it non-interactive.
|
|
69
|
-
*/
|
|
70
|
-
disabled: {
|
|
71
|
-
type: Boolean,
|
|
72
|
-
default: false,
|
|
73
|
-
},
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* The value that the tick box represents when checked.
|
|
77
|
-
* Can be a string, number, or boolean. Default is `true`.
|
|
78
|
-
*/
|
|
79
|
-
value: {
|
|
80
|
-
type: [String, Number, Boolean],
|
|
81
|
-
default: true,
|
|
82
|
-
},
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* The current value bound to the tick box for v-model.
|
|
86
|
-
* Can be an array for multiple selection or boolean for single selection.
|
|
87
|
-
* This prop is required.
|
|
88
|
-
*/
|
|
89
|
-
modelValue: {
|
|
90
|
-
type: [Array, Boolean],
|
|
91
|
-
required: true,
|
|
92
|
-
},
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Controls the density of the tick box, such as padding and size.
|
|
96
|
-
* Default is 'comfortable'.
|
|
97
|
-
*/
|
|
98
|
-
density: {
|
|
99
|
-
type: String,
|
|
100
|
-
required: false,
|
|
101
|
-
default: 'comfortable',
|
|
102
|
-
},
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
// Emit event for v-model binding
|
|
106
|
-
const emit = defineEmits(['update:modelValue']);
|
|
107
|
-
|
|
108
|
-
// Computed property for v-model binding (two-way binding)
|
|
109
|
-
const internalValue = computed({
|
|
110
|
-
get() {
|
|
111
|
-
return props.modelValue; // Get the current modelValue from the parent
|
|
112
|
-
},
|
|
113
|
-
set(newValue) {
|
|
114
|
-
emit('update:modelValue', newValue); // Emit the updated value to the parent
|
|
115
|
-
},
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
// Computed property for dynamic class based on error, success, or disabled state
|
|
119
|
-
const checkboxClass = computed(() => {
|
|
120
|
-
if (props.disabled) return 'disabled-state';
|
|
121
|
-
if (props.error) return 'error-state';
|
|
122
|
-
if (props.success) return 'success-state';
|
|
123
|
-
return 'default-state';
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
// Computed property for dynamic label class
|
|
127
|
-
const labelClass = computed(() => {
|
|
128
|
-
if (props.disabled) return 'label-disabled';
|
|
129
|
-
if (props.error) return 'label-error';
|
|
130
|
-
if (props.success) return 'label-success';
|
|
131
|
-
return 'label-default';
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
// Computed property for dynamic color based on error or success state
|
|
135
|
-
const hoverColor = computed(() => {
|
|
136
|
-
if (props.disabled) return colors.value['checkbox_disabled_checkmark'];
|
|
137
|
-
if (props.error) return colors.value['checkbox_error_checkmark'];
|
|
138
|
-
if (props.success) return colors.value['checkbox_success_checkmark'];
|
|
139
|
-
return colors.value['checkbox_default_checkmark'];
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
// Computed CSS custom properties for tickbox theming (uses same checkbox colors)
|
|
143
|
-
const tickBoxCssVars = computed(() => ({
|
|
144
|
-
// Default state
|
|
145
|
-
'--tickbox-default-text': colors.value['checkbox_default_text'],
|
|
146
|
-
'--tickbox-default-border': colors.value['checkbox_defaut_border'],
|
|
147
|
-
'--tickbox-default-bg': colors.value['checkbox_default_bg'],
|
|
148
|
-
'--tickbox-default-checkmark': colors.value['checkbox_default_checkmark'],
|
|
149
|
-
// Hover state
|
|
150
|
-
'--tickbox-hovered-border': colors.value['checkbox_hovered_border'],
|
|
151
|
-
'--tickbox-hovered-bg': colors.value['checkbox_hovered_bg'],
|
|
152
|
-
'--tickbox-hovered-checkmark': colors.value['checkbox_hovered_checkmark'],
|
|
153
|
-
// Checked state
|
|
154
|
-
'--tickbox-checked-border': colors.value['checkbox_checked_border'],
|
|
155
|
-
'--tickbox-checked-bg': colors.value['checkbox_checked_bg'],
|
|
156
|
-
// Error state
|
|
157
|
-
'--tickbox-error-border': colors.value['checkbox_error_border'],
|
|
158
|
-
'--tickbox-error-bg': colors.value['checkbox_error_bg'],
|
|
159
|
-
'--tickbox-error-text': colors.value['checkbox_error_text'],
|
|
160
|
-
'--tickbox-error-checkmark': colors.value['checkbox_error_checkmark'],
|
|
161
|
-
// Success state
|
|
162
|
-
'--tickbox-success-border': colors.value['checkbox_success_border'],
|
|
163
|
-
'--tickbox-success-bg': colors.value['checkbox_success_bg'],
|
|
164
|
-
'--tickbox-success-text': colors.value['checkbox_success_text'],
|
|
165
|
-
'--tickbox-success-checkmark': colors.value['checkbox_success_checkmark'],
|
|
166
|
-
// Disabled state
|
|
167
|
-
'--tickbox-disabled-border': colors.value['checkbox_disabled_border'],
|
|
168
|
-
'--tickbox-disabled-bg': colors.value['checkbox_disabled_bg'],
|
|
169
|
-
'--tickbox-disabled-text': colors.value['checkbox_disabled_text'],
|
|
170
|
-
'--tickbox-disabled-checkmark': colors.value['checkbox_disabled_checkmark'],
|
|
171
|
-
}));
|
|
172
|
-
</script>
|
|
1
|
+
<template>
|
|
2
|
+
<div class="tick-box-wrapper" :style="tickBoxCssVars">
|
|
3
|
+
<v-checkbox
|
|
4
|
+
class="tick-box"
|
|
5
|
+
:class="checkboxClass"
|
|
6
|
+
true-icon="heroicons:outline-checked"
|
|
7
|
+
false-icon="heroicons:outline"
|
|
8
|
+
:disabled="disabled"
|
|
9
|
+
:value="value"
|
|
10
|
+
:density="density"
|
|
11
|
+
v-model="internalValue"
|
|
12
|
+
:color="hoverColor"
|
|
13
|
+
:base-color="hoverColor"
|
|
14
|
+
data-testid="root"
|
|
15
|
+
>
|
|
16
|
+
<!-- Custom label slot with dynamic style -->
|
|
17
|
+
<template #label>
|
|
18
|
+
<span class="tick-box-label" :class="labelClass">{{ label }}</span>
|
|
19
|
+
</template>
|
|
20
|
+
</v-checkbox>
|
|
21
|
+
</div>
|
|
22
|
+
</template>
|
|
23
|
+
|
|
24
|
+
<script setup>
|
|
25
|
+
import { computed, inject } from 'vue';
|
|
26
|
+
import './TickBox.css';
|
|
27
|
+
import { siteColors } from "../../utils/index";
|
|
28
|
+
|
|
29
|
+
// Inject theme colors from ThemeProvider, fallback to global siteColors
|
|
30
|
+
const injectedThemeColors = inject('themeColors', null);
|
|
31
|
+
const colors = computed(() => {
|
|
32
|
+
if (injectedThemeColors) {
|
|
33
|
+
return injectedThemeColors.value;
|
|
34
|
+
}
|
|
35
|
+
return siteColors;
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
// Define props for the TickBox component
|
|
39
|
+
const props = defineProps({
|
|
40
|
+
/**
|
|
41
|
+
* The label text displayed next to the tick box.
|
|
42
|
+
* This prop is required.
|
|
43
|
+
*/
|
|
44
|
+
label: {
|
|
45
|
+
type: String,
|
|
46
|
+
required: true,
|
|
47
|
+
},
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Indicates if the tick box is in a success state.
|
|
51
|
+
* When true, the success styling will be applied.
|
|
52
|
+
*/
|
|
53
|
+
success: {
|
|
54
|
+
type: Boolean,
|
|
55
|
+
default: false,
|
|
56
|
+
},
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Indicates if the tick box is in an error state.
|
|
60
|
+
* When true, the error styling will be applied.
|
|
61
|
+
*/
|
|
62
|
+
error: {
|
|
63
|
+
type: Boolean,
|
|
64
|
+
default: false,
|
|
65
|
+
},
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Disables the tick box when true, making it non-interactive.
|
|
69
|
+
*/
|
|
70
|
+
disabled: {
|
|
71
|
+
type: Boolean,
|
|
72
|
+
default: false,
|
|
73
|
+
},
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* The value that the tick box represents when checked.
|
|
77
|
+
* Can be a string, number, or boolean. Default is `true`.
|
|
78
|
+
*/
|
|
79
|
+
value: {
|
|
80
|
+
type: [String, Number, Boolean],
|
|
81
|
+
default: true,
|
|
82
|
+
},
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* The current value bound to the tick box for v-model.
|
|
86
|
+
* Can be an array for multiple selection or boolean for single selection.
|
|
87
|
+
* This prop is required.
|
|
88
|
+
*/
|
|
89
|
+
modelValue: {
|
|
90
|
+
type: [Array, Boolean],
|
|
91
|
+
required: true,
|
|
92
|
+
},
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Controls the density of the tick box, such as padding and size.
|
|
96
|
+
* Default is 'comfortable'.
|
|
97
|
+
*/
|
|
98
|
+
density: {
|
|
99
|
+
type: String,
|
|
100
|
+
required: false,
|
|
101
|
+
default: 'comfortable',
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
// Emit event for v-model binding
|
|
106
|
+
const emit = defineEmits(['update:modelValue']);
|
|
107
|
+
|
|
108
|
+
// Computed property for v-model binding (two-way binding)
|
|
109
|
+
const internalValue = computed({
|
|
110
|
+
get() {
|
|
111
|
+
return props.modelValue; // Get the current modelValue from the parent
|
|
112
|
+
},
|
|
113
|
+
set(newValue) {
|
|
114
|
+
emit('update:modelValue', newValue); // Emit the updated value to the parent
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
// Computed property for dynamic class based on error, success, or disabled state
|
|
119
|
+
const checkboxClass = computed(() => {
|
|
120
|
+
if (props.disabled) return 'disabled-state';
|
|
121
|
+
if (props.error) return 'error-state';
|
|
122
|
+
if (props.success) return 'success-state';
|
|
123
|
+
return 'default-state';
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
// Computed property for dynamic label class
|
|
127
|
+
const labelClass = computed(() => {
|
|
128
|
+
if (props.disabled) return 'label-disabled';
|
|
129
|
+
if (props.error) return 'label-error';
|
|
130
|
+
if (props.success) return 'label-success';
|
|
131
|
+
return 'label-default';
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
// Computed property for dynamic color based on error or success state
|
|
135
|
+
const hoverColor = computed(() => {
|
|
136
|
+
if (props.disabled) return colors.value['checkbox_disabled_checkmark'];
|
|
137
|
+
if (props.error) return colors.value['checkbox_error_checkmark'];
|
|
138
|
+
if (props.success) return colors.value['checkbox_success_checkmark'];
|
|
139
|
+
return colors.value['checkbox_default_checkmark'];
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
// Computed CSS custom properties for tickbox theming (uses same checkbox colors)
|
|
143
|
+
const tickBoxCssVars = computed(() => ({
|
|
144
|
+
// Default state
|
|
145
|
+
'--tickbox-default-text': colors.value['checkbox_default_text'],
|
|
146
|
+
'--tickbox-default-border': colors.value['checkbox_defaut_border'],
|
|
147
|
+
'--tickbox-default-bg': colors.value['checkbox_default_bg'],
|
|
148
|
+
'--tickbox-default-checkmark': colors.value['checkbox_default_checkmark'],
|
|
149
|
+
// Hover state
|
|
150
|
+
'--tickbox-hovered-border': colors.value['checkbox_hovered_border'],
|
|
151
|
+
'--tickbox-hovered-bg': colors.value['checkbox_hovered_bg'],
|
|
152
|
+
'--tickbox-hovered-checkmark': colors.value['checkbox_hovered_checkmark'],
|
|
153
|
+
// Checked state
|
|
154
|
+
'--tickbox-checked-border': colors.value['checkbox_checked_border'],
|
|
155
|
+
'--tickbox-checked-bg': colors.value['checkbox_checked_bg'],
|
|
156
|
+
// Error state
|
|
157
|
+
'--tickbox-error-border': colors.value['checkbox_error_border'],
|
|
158
|
+
'--tickbox-error-bg': colors.value['checkbox_error_bg'],
|
|
159
|
+
'--tickbox-error-text': colors.value['checkbox_error_text'],
|
|
160
|
+
'--tickbox-error-checkmark': colors.value['checkbox_error_checkmark'],
|
|
161
|
+
// Success state
|
|
162
|
+
'--tickbox-success-border': colors.value['checkbox_success_border'],
|
|
163
|
+
'--tickbox-success-bg': colors.value['checkbox_success_bg'],
|
|
164
|
+
'--tickbox-success-text': colors.value['checkbox_success_text'],
|
|
165
|
+
'--tickbox-success-checkmark': colors.value['checkbox_success_checkmark'],
|
|
166
|
+
// Disabled state
|
|
167
|
+
'--tickbox-disabled-border': colors.value['checkbox_disabled_border'],
|
|
168
|
+
'--tickbox-disabled-bg': colors.value['checkbox_disabled_bg'],
|
|
169
|
+
'--tickbox-disabled-text': colors.value['checkbox_disabled_text'],
|
|
170
|
+
'--tickbox-disabled-checkmark': colors.value['checkbox_disabled_checkmark'],
|
|
171
|
+
}));
|
|
172
|
+
</script>
|
|
@@ -1,106 +1,106 @@
|
|
|
1
|
-
.wl-tile {
|
|
2
|
-
position: relative;
|
|
3
|
-
display: flex;
|
|
4
|
-
flex-direction: column;
|
|
5
|
-
gap: 8px;
|
|
6
|
-
padding: 16px;
|
|
7
|
-
border: 1.5px solid var(--tile-border, #C1C1C2);
|
|
8
|
-
border-radius: 8px;
|
|
9
|
-
background-color: var(--tile-bg, #FFFFFF);
|
|
10
|
-
overflow: visible;
|
|
11
|
-
cursor: pointer;
|
|
12
|
-
user-select: none;
|
|
13
|
-
transition: background-color 0.2s ease, border-color 0.2s ease;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
.wl-tile:hover {
|
|
17
|
-
background-color: var(--tile-hover-bg, #F6F6F8);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
.wl-tile:active {
|
|
21
|
-
background-color: var(--tile-pressed-bg, #E5E6EE);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/* Disabled state */
|
|
25
|
-
.wl-tile--disabled {
|
|
26
|
-
opacity: 0.5;
|
|
27
|
-
pointer-events: none;
|
|
28
|
-
cursor: default;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/* Body wraps all content */
|
|
32
|
-
.wl-tile__body {
|
|
33
|
-
display: flex;
|
|
34
|
-
flex-direction: column;
|
|
35
|
-
gap: 8px;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/* Header row: icon + title + label inline */
|
|
39
|
-
.wl-tile__header {
|
|
40
|
-
display: flex;
|
|
41
|
-
align-items: center;
|
|
42
|
-
gap: 8px;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/* Icon area */
|
|
46
|
-
.wl-tile__icon {
|
|
47
|
-
flex-shrink: 0;
|
|
48
|
-
display: flex;
|
|
49
|
-
align-items: center;
|
|
50
|
-
justify-content: center;
|
|
51
|
-
overflow: hidden;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/* Label area — inline in header row */
|
|
55
|
-
.wl-tile__label {
|
|
56
|
-
display: flex;
|
|
57
|
-
flex-shrink: 0;
|
|
58
|
-
margin-left: auto;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/* Title — fills remaining space */
|
|
62
|
-
.wl-tile__title {
|
|
63
|
-
flex: 1;
|
|
64
|
-
min-width: 0;
|
|
65
|
-
color: var(--tile-title-color, #172774);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/* Banner mode — ribbon sticking out on the right */
|
|
69
|
-
.wl-tile__label--banner {
|
|
70
|
-
position: absolute;
|
|
71
|
-
right: -9px;
|
|
72
|
-
top: 10px;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/* Default plain text label */
|
|
76
|
-
.wl-tile__label-text {
|
|
77
|
-
display: inline-block;
|
|
78
|
-
font-family: 'Outfit', sans-serif;
|
|
79
|
-
font-weight: 300;
|
|
80
|
-
font-size: 11px;
|
|
81
|
-
line-height: 1.2;
|
|
82
|
-
letter-spacing: 0.22px;
|
|
83
|
-
color: var(--tile-label-text-color, #172774);
|
|
84
|
-
background-color: var(--tile-label-bg, #C5E1FC);
|
|
85
|
-
border-radius: 2px;
|
|
86
|
-
padding: 4px 12px;
|
|
87
|
-
white-space: nowrap;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/* Description text */
|
|
91
|
-
.wl-tile__description {
|
|
92
|
-
color: var(--tile-description-color, #172774);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/* Accessibility: Focus Indicators (WCAG 2.4.7) */
|
|
96
|
-
.wl-tile:focus-visible {
|
|
97
|
-
outline: 2px solid var(--tile-focus-ring, #172774);
|
|
98
|
-
outline-offset: 2px;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/* High contrast mode support */
|
|
102
|
-
@media (forced-colors: active) {
|
|
103
|
-
.wl-tile {
|
|
104
|
-
border: 2px solid currentColor;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
1
|
+
.wl-tile {
|
|
2
|
+
position: relative;
|
|
3
|
+
display: flex;
|
|
4
|
+
flex-direction: column;
|
|
5
|
+
gap: 8px;
|
|
6
|
+
padding: 16px;
|
|
7
|
+
border: 1.5px solid var(--tile-border, #C1C1C2);
|
|
8
|
+
border-radius: 8px;
|
|
9
|
+
background-color: var(--tile-bg, #FFFFFF);
|
|
10
|
+
overflow: visible;
|
|
11
|
+
cursor: pointer;
|
|
12
|
+
user-select: none;
|
|
13
|
+
transition: background-color 0.2s ease, border-color 0.2s ease;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.wl-tile:hover {
|
|
17
|
+
background-color: var(--tile-hover-bg, #F6F6F8);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.wl-tile:active {
|
|
21
|
+
background-color: var(--tile-pressed-bg, #E5E6EE);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/* Disabled state */
|
|
25
|
+
.wl-tile--disabled {
|
|
26
|
+
opacity: 0.5;
|
|
27
|
+
pointer-events: none;
|
|
28
|
+
cursor: default;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/* Body wraps all content */
|
|
32
|
+
.wl-tile__body {
|
|
33
|
+
display: flex;
|
|
34
|
+
flex-direction: column;
|
|
35
|
+
gap: 8px;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* Header row: icon + title + label inline */
|
|
39
|
+
.wl-tile__header {
|
|
40
|
+
display: flex;
|
|
41
|
+
align-items: center;
|
|
42
|
+
gap: 8px;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/* Icon area */
|
|
46
|
+
.wl-tile__icon {
|
|
47
|
+
flex-shrink: 0;
|
|
48
|
+
display: flex;
|
|
49
|
+
align-items: center;
|
|
50
|
+
justify-content: center;
|
|
51
|
+
overflow: hidden;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/* Label area — inline in header row */
|
|
55
|
+
.wl-tile__label {
|
|
56
|
+
display: flex;
|
|
57
|
+
flex-shrink: 0;
|
|
58
|
+
margin-left: auto;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/* Title — fills remaining space */
|
|
62
|
+
.wl-tile__title {
|
|
63
|
+
flex: 1;
|
|
64
|
+
min-width: 0;
|
|
65
|
+
color: var(--tile-title-color, #172774);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/* Banner mode — ribbon sticking out on the right */
|
|
69
|
+
.wl-tile__label--banner {
|
|
70
|
+
position: absolute;
|
|
71
|
+
right: -9px;
|
|
72
|
+
top: 10px;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/* Default plain text label */
|
|
76
|
+
.wl-tile__label-text {
|
|
77
|
+
display: inline-block;
|
|
78
|
+
font-family: 'Outfit', sans-serif;
|
|
79
|
+
font-weight: 300;
|
|
80
|
+
font-size: 11px;
|
|
81
|
+
line-height: 1.2;
|
|
82
|
+
letter-spacing: 0.22px;
|
|
83
|
+
color: var(--tile-label-text-color, #172774);
|
|
84
|
+
background-color: var(--tile-label-bg, #C5E1FC);
|
|
85
|
+
border-radius: 2px;
|
|
86
|
+
padding: 4px 12px;
|
|
87
|
+
white-space: nowrap;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/* Description text */
|
|
91
|
+
.wl-tile__description {
|
|
92
|
+
color: var(--tile-description-color, #172774);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/* Accessibility: Focus Indicators (WCAG 2.4.7) */
|
|
96
|
+
.wl-tile:focus-visible {
|
|
97
|
+
outline: 2px solid var(--tile-focus-ring, #172774);
|
|
98
|
+
outline-offset: 2px;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/* High contrast mode support */
|
|
102
|
+
@media (forced-colors: active) {
|
|
103
|
+
.wl-tile {
|
|
104
|
+
border: 2px solid currentColor;
|
|
105
|
+
}
|
|
106
|
+
}
|