@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,207 +1,207 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<v-textarea
|
|
3
|
-
:class="{
|
|
4
|
-
'text-area': true,
|
|
5
|
-
'is-success': success,
|
|
6
|
-
'is-error': error,
|
|
7
|
-
'is-warning': warning,
|
|
8
|
-
}"
|
|
9
|
-
:style="{ color: colors['primary-color'] }"
|
|
10
|
-
v-model="internalValue"
|
|
11
|
-
:clearable="clearable"
|
|
12
|
-
:clear-icon="clearIcon"
|
|
13
|
-
:label="label"
|
|
14
|
-
:placeholder="placeholder"
|
|
15
|
-
:prepend-icon="prependIcon"
|
|
16
|
-
:prepend-inner-icon="prependInnerIcon"
|
|
17
|
-
:append-icon="appendIcon"
|
|
18
|
-
:append-inner-icon="appendInnerIcon"
|
|
19
|
-
variant="outlined"
|
|
20
|
-
rounded="lg"
|
|
21
|
-
:disabled="disabled"
|
|
22
|
-
:density="density"
|
|
23
|
-
:hide-details="hideDetails"
|
|
24
|
-
:rows="rows"
|
|
25
|
-
:auto-grow="autoGrow"
|
|
26
|
-
:error="error"
|
|
27
|
-
@click:append="emit('click:append', $event)"
|
|
28
|
-
@click:appendInner="emit('click:appendInner', $event)"
|
|
29
|
-
@click:clear="emit('click:clear', $event)"
|
|
30
|
-
@click:control="emit('click:control', $event)"
|
|
31
|
-
@click:prepend="emit('click:prepend', $event)"
|
|
32
|
-
@click:prependInner="emit('click:prependInner', $event)"
|
|
33
|
-
data-testid="root"
|
|
34
|
-
>
|
|
35
|
-
<!-- You can include slots if needed -->
|
|
36
|
-
</v-textarea>
|
|
37
|
-
</template>
|
|
38
|
-
<script setup>
|
|
39
|
-
import './TextArea.css';
|
|
40
|
-
import { computed, inject } from 'vue';
|
|
41
|
-
import { siteColors } from "../../utils/index";
|
|
42
|
-
|
|
43
|
-
// Inject theme colors from ThemeProvider, fallback to global siteColors
|
|
44
|
-
const injectedThemeColors = inject('themeColors', null);
|
|
45
|
-
const colors = computed(() => {
|
|
46
|
-
if (injectedThemeColors) {
|
|
47
|
-
return injectedThemeColors.value;
|
|
48
|
-
}
|
|
49
|
-
return siteColors;
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
// Define props for the TextArea component
|
|
53
|
-
const props = defineProps({
|
|
54
|
-
/**
|
|
55
|
-
* The value bound to the textarea, supporting both String and Number types.
|
|
56
|
-
* Default is an empty string.
|
|
57
|
-
*/
|
|
58
|
-
modelValue: {
|
|
59
|
-
type: [String, Number],
|
|
60
|
-
default: '',
|
|
61
|
-
},
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Indicates if the textarea is in a success state.
|
|
65
|
-
* When true, the success style will be applied.
|
|
66
|
-
*/
|
|
67
|
-
success: Boolean,
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Indicates if the textarea is in an error state.
|
|
71
|
-
* When true, the error style will be applied.
|
|
72
|
-
*/
|
|
73
|
-
error: Boolean,
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Indicates if the textarea is in a warning state.
|
|
77
|
-
* When true, the warning style will be applied.
|
|
78
|
-
*/
|
|
79
|
-
warning: Boolean,
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Disables the textarea if true, making it non-interactive.
|
|
83
|
-
*/
|
|
84
|
-
disabled: Boolean,
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Whether to show the clear icon.
|
|
88
|
-
*/
|
|
89
|
-
clearable: {
|
|
90
|
-
type: Boolean,
|
|
91
|
-
default: false,
|
|
92
|
-
},
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Icon for clearing the textarea content.
|
|
96
|
-
*/
|
|
97
|
-
clearIcon: {
|
|
98
|
-
type: String,
|
|
99
|
-
default: 'mdi-close',
|
|
100
|
-
},
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* Label for the textarea field.
|
|
104
|
-
*/
|
|
105
|
-
label: {
|
|
106
|
-
type: String,
|
|
107
|
-
default: '',
|
|
108
|
-
},
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Placeholder text for the textarea.
|
|
112
|
-
*/
|
|
113
|
-
placeholder: {
|
|
114
|
-
type: String,
|
|
115
|
-
default: '',
|
|
116
|
-
},
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Icon displayed before the textarea.
|
|
120
|
-
* Default is null, meaning no icon is displayed by default.
|
|
121
|
-
*/
|
|
122
|
-
prependIcon: {
|
|
123
|
-
type: String,
|
|
124
|
-
default: null,
|
|
125
|
-
},
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* Inner icon displayed before the textarea, inside the input field.
|
|
129
|
-
* Default is null.
|
|
130
|
-
*/
|
|
131
|
-
prependInnerIcon: {
|
|
132
|
-
type: String,
|
|
133
|
-
default: null,
|
|
134
|
-
},
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
* Icon displayed after the textarea.
|
|
138
|
-
* Default is null.
|
|
139
|
-
*/
|
|
140
|
-
appendIcon: {
|
|
141
|
-
type: String,
|
|
142
|
-
default: null,
|
|
143
|
-
},
|
|
144
|
-
|
|
145
|
-
/**
|
|
146
|
-
* Inner icon displayed after the textarea, inside the input field.
|
|
147
|
-
* Default is null.
|
|
148
|
-
*/
|
|
149
|
-
appendInnerIcon: {
|
|
150
|
-
type: String,
|
|
151
|
-
default: null,
|
|
152
|
-
},
|
|
153
|
-
|
|
154
|
-
/**
|
|
155
|
-
* Controls the size and spacing of the textarea.
|
|
156
|
-
*/
|
|
157
|
-
density: {
|
|
158
|
-
type: String,
|
|
159
|
-
default: 'compact',
|
|
160
|
-
},
|
|
161
|
-
|
|
162
|
-
/**
|
|
163
|
-
* Hides the details or additional text when true.
|
|
164
|
-
*/
|
|
165
|
-
hideDetails: {
|
|
166
|
-
type: Boolean,
|
|
167
|
-
default: true,
|
|
168
|
-
},
|
|
169
|
-
|
|
170
|
-
/**
|
|
171
|
-
* Number of rows to display.
|
|
172
|
-
*/
|
|
173
|
-
rows: {
|
|
174
|
-
type: [String, Number],
|
|
175
|
-
default: 3,
|
|
176
|
-
},
|
|
177
|
-
|
|
178
|
-
/**
|
|
179
|
-
* Whether the textarea should auto-grow.
|
|
180
|
-
*/
|
|
181
|
-
autoGrow: {
|
|
182
|
-
type: Boolean,
|
|
183
|
-
default: false,
|
|
184
|
-
},
|
|
185
|
-
});
|
|
186
|
-
|
|
187
|
-
// Define emits for event handling
|
|
188
|
-
const emit = defineEmits([
|
|
189
|
-
'update:modelValue', // Emitted when the model value is updated
|
|
190
|
-
'click:append', // Emitted when the append icon is clicked
|
|
191
|
-
'click:appendInner', // Emitted when the append inner icon is clicked
|
|
192
|
-
'click:clear', // Emitted when the clear button is clicked
|
|
193
|
-
'click:control', // Emitted when the main textarea control is clicked
|
|
194
|
-
'click:prepend', // Emitted when the prepend icon is clicked
|
|
195
|
-
'click:prependInner', // Emitted when the prepend inner icon is clicked
|
|
196
|
-
]);
|
|
197
|
-
|
|
198
|
-
// Computed property to create two-way binding for v-model
|
|
199
|
-
const internalValue = computed({
|
|
200
|
-
get() {
|
|
201
|
-
return props.modelValue; // Getter returns the current modelValue prop
|
|
202
|
-
},
|
|
203
|
-
set(val) {
|
|
204
|
-
emit('update:modelValue', val); // Setter emits the updated value to parent component
|
|
205
|
-
},
|
|
206
|
-
});
|
|
207
|
-
</script>
|
|
1
|
+
<template>
|
|
2
|
+
<v-textarea
|
|
3
|
+
:class="{
|
|
4
|
+
'text-area': true,
|
|
5
|
+
'is-success': success,
|
|
6
|
+
'is-error': error,
|
|
7
|
+
'is-warning': warning,
|
|
8
|
+
}"
|
|
9
|
+
:style="{ color: colors['primary-color'] }"
|
|
10
|
+
v-model="internalValue"
|
|
11
|
+
:clearable="clearable"
|
|
12
|
+
:clear-icon="clearIcon"
|
|
13
|
+
:label="label"
|
|
14
|
+
:placeholder="placeholder"
|
|
15
|
+
:prepend-icon="prependIcon"
|
|
16
|
+
:prepend-inner-icon="prependInnerIcon"
|
|
17
|
+
:append-icon="appendIcon"
|
|
18
|
+
:append-inner-icon="appendInnerIcon"
|
|
19
|
+
variant="outlined"
|
|
20
|
+
rounded="lg"
|
|
21
|
+
:disabled="disabled"
|
|
22
|
+
:density="density"
|
|
23
|
+
:hide-details="hideDetails"
|
|
24
|
+
:rows="rows"
|
|
25
|
+
:auto-grow="autoGrow"
|
|
26
|
+
:error="error"
|
|
27
|
+
@click:append="emit('click:append', $event)"
|
|
28
|
+
@click:appendInner="emit('click:appendInner', $event)"
|
|
29
|
+
@click:clear="emit('click:clear', $event)"
|
|
30
|
+
@click:control="emit('click:control', $event)"
|
|
31
|
+
@click:prepend="emit('click:prepend', $event)"
|
|
32
|
+
@click:prependInner="emit('click:prependInner', $event)"
|
|
33
|
+
data-testid="root"
|
|
34
|
+
>
|
|
35
|
+
<!-- You can include slots if needed -->
|
|
36
|
+
</v-textarea>
|
|
37
|
+
</template>
|
|
38
|
+
<script setup>
|
|
39
|
+
import './TextArea.css';
|
|
40
|
+
import { computed, inject } from 'vue';
|
|
41
|
+
import { siteColors } from "../../utils/index";
|
|
42
|
+
|
|
43
|
+
// Inject theme colors from ThemeProvider, fallback to global siteColors
|
|
44
|
+
const injectedThemeColors = inject('themeColors', null);
|
|
45
|
+
const colors = computed(() => {
|
|
46
|
+
if (injectedThemeColors) {
|
|
47
|
+
return injectedThemeColors.value;
|
|
48
|
+
}
|
|
49
|
+
return siteColors;
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
// Define props for the TextArea component
|
|
53
|
+
const props = defineProps({
|
|
54
|
+
/**
|
|
55
|
+
* The value bound to the textarea, supporting both String and Number types.
|
|
56
|
+
* Default is an empty string.
|
|
57
|
+
*/
|
|
58
|
+
modelValue: {
|
|
59
|
+
type: [String, Number],
|
|
60
|
+
default: '',
|
|
61
|
+
},
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Indicates if the textarea is in a success state.
|
|
65
|
+
* When true, the success style will be applied.
|
|
66
|
+
*/
|
|
67
|
+
success: Boolean,
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Indicates if the textarea is in an error state.
|
|
71
|
+
* When true, the error style will be applied.
|
|
72
|
+
*/
|
|
73
|
+
error: Boolean,
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Indicates if the textarea is in a warning state.
|
|
77
|
+
* When true, the warning style will be applied.
|
|
78
|
+
*/
|
|
79
|
+
warning: Boolean,
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Disables the textarea if true, making it non-interactive.
|
|
83
|
+
*/
|
|
84
|
+
disabled: Boolean,
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Whether to show the clear icon.
|
|
88
|
+
*/
|
|
89
|
+
clearable: {
|
|
90
|
+
type: Boolean,
|
|
91
|
+
default: false,
|
|
92
|
+
},
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Icon for clearing the textarea content.
|
|
96
|
+
*/
|
|
97
|
+
clearIcon: {
|
|
98
|
+
type: String,
|
|
99
|
+
default: 'mdi-close',
|
|
100
|
+
},
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Label for the textarea field.
|
|
104
|
+
*/
|
|
105
|
+
label: {
|
|
106
|
+
type: String,
|
|
107
|
+
default: '',
|
|
108
|
+
},
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Placeholder text for the textarea.
|
|
112
|
+
*/
|
|
113
|
+
placeholder: {
|
|
114
|
+
type: String,
|
|
115
|
+
default: '',
|
|
116
|
+
},
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Icon displayed before the textarea.
|
|
120
|
+
* Default is null, meaning no icon is displayed by default.
|
|
121
|
+
*/
|
|
122
|
+
prependIcon: {
|
|
123
|
+
type: String,
|
|
124
|
+
default: null,
|
|
125
|
+
},
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Inner icon displayed before the textarea, inside the input field.
|
|
129
|
+
* Default is null.
|
|
130
|
+
*/
|
|
131
|
+
prependInnerIcon: {
|
|
132
|
+
type: String,
|
|
133
|
+
default: null,
|
|
134
|
+
},
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Icon displayed after the textarea.
|
|
138
|
+
* Default is null.
|
|
139
|
+
*/
|
|
140
|
+
appendIcon: {
|
|
141
|
+
type: String,
|
|
142
|
+
default: null,
|
|
143
|
+
},
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Inner icon displayed after the textarea, inside the input field.
|
|
147
|
+
* Default is null.
|
|
148
|
+
*/
|
|
149
|
+
appendInnerIcon: {
|
|
150
|
+
type: String,
|
|
151
|
+
default: null,
|
|
152
|
+
},
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Controls the size and spacing of the textarea.
|
|
156
|
+
*/
|
|
157
|
+
density: {
|
|
158
|
+
type: String,
|
|
159
|
+
default: 'compact',
|
|
160
|
+
},
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Hides the details or additional text when true.
|
|
164
|
+
*/
|
|
165
|
+
hideDetails: {
|
|
166
|
+
type: Boolean,
|
|
167
|
+
default: true,
|
|
168
|
+
},
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Number of rows to display.
|
|
172
|
+
*/
|
|
173
|
+
rows: {
|
|
174
|
+
type: [String, Number],
|
|
175
|
+
default: 3,
|
|
176
|
+
},
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Whether the textarea should auto-grow.
|
|
180
|
+
*/
|
|
181
|
+
autoGrow: {
|
|
182
|
+
type: Boolean,
|
|
183
|
+
default: false,
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
// Define emits for event handling
|
|
188
|
+
const emit = defineEmits([
|
|
189
|
+
'update:modelValue', // Emitted when the model value is updated
|
|
190
|
+
'click:append', // Emitted when the append icon is clicked
|
|
191
|
+
'click:appendInner', // Emitted when the append inner icon is clicked
|
|
192
|
+
'click:clear', // Emitted when the clear button is clicked
|
|
193
|
+
'click:control', // Emitted when the main textarea control is clicked
|
|
194
|
+
'click:prepend', // Emitted when the prepend icon is clicked
|
|
195
|
+
'click:prependInner', // Emitted when the prepend inner icon is clicked
|
|
196
|
+
]);
|
|
197
|
+
|
|
198
|
+
// Computed property to create two-way binding for v-model
|
|
199
|
+
const internalValue = computed({
|
|
200
|
+
get() {
|
|
201
|
+
return props.modelValue; // Getter returns the current modelValue prop
|
|
202
|
+
},
|
|
203
|
+
set(val) {
|
|
204
|
+
emit('update:modelValue', val); // Setter emits the updated value to parent component
|
|
205
|
+
},
|
|
206
|
+
});
|
|
207
|
+
</script>
|
|
@@ -1,116 +1,116 @@
|
|
|
1
|
-
/* Wrapper */
|
|
2
|
-
.tick-box-wrapper {
|
|
3
|
-
display: contents;
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
/* Common styles for the checkbox label */
|
|
7
|
-
.tick-box .v-label {
|
|
8
|
-
opacity: 1 !important;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
/* Label styles */
|
|
12
|
-
.tick-box-label.label-default {
|
|
13
|
-
color: var(--tickbox-default-text);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
.tick-box-label.label-error {
|
|
17
|
-
color: var(--tickbox-error-text);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
.tick-box-label.label-success {
|
|
21
|
-
color: var(--tickbox-success-text);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
.tick-box-label.label-disabled {
|
|
25
|
-
color: var(--tickbox-disabled-text);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/* Default state */
|
|
29
|
-
.tick-box.default-state .v-icon {
|
|
30
|
-
color: var(--tickbox-default-checkmark) !important;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
.tick-box.default-state svg path {
|
|
34
|
-
stroke: var(--tickbox-default-checkmark);
|
|
35
|
-
fill: var(--tickbox-default-bg);
|
|
36
|
-
stroke-width: 3px;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
.tick-box.default-state svg rect {
|
|
40
|
-
stroke: var(--tickbox-default-border);
|
|
41
|
-
fill: var(--tickbox-default-bg);
|
|
42
|
-
stroke-width: 1px;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
.tick-box.default-state:hover svg rect {
|
|
46
|
-
stroke: var(--tickbox-hovered-border);
|
|
47
|
-
fill: var(--tickbox-hovered-bg);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
.tick-box.default-state:hover svg path {
|
|
51
|
-
stroke: var(--tickbox-hovered-checkmark);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/* Success state */
|
|
55
|
-
.tick-box.success-state .v-icon {
|
|
56
|
-
color: var(--tickbox-success-checkmark) !important;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
.tick-box.success-state svg rect {
|
|
60
|
-
stroke: var(--tickbox-success-border);
|
|
61
|
-
fill: var(--tickbox-success-bg);
|
|
62
|
-
stroke-width: 1px;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
.tick-box.success-state svg path {
|
|
66
|
-
stroke: var(--tickbox-success-checkmark);
|
|
67
|
-
fill: var(--tickbox-success-bg);
|
|
68
|
-
stroke-width: 3px;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/* Error state */
|
|
72
|
-
.tick-box.error-state .v-icon {
|
|
73
|
-
color: var(--tickbox-error-checkmark) !important;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
.tick-box.error-state svg path {
|
|
77
|
-
stroke: var(--tickbox-error-checkmark);
|
|
78
|
-
fill: var(--tickbox-error-bg);
|
|
79
|
-
stroke-width: 3px;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
.tick-box.error-state svg rect {
|
|
83
|
-
stroke: var(--tickbox-error-border);
|
|
84
|
-
fill: var(--tickbox-error-bg);
|
|
85
|
-
stroke-width: 1px;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/* Disabled state */
|
|
89
|
-
.tick-box.disabled-state .v-icon {
|
|
90
|
-
color: var(--tickbox-disabled-checkmark) !important;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
.tick-box.disabled-state svg path {
|
|
94
|
-
stroke: var(--tickbox-disabled-checkmark);
|
|
95
|
-
fill: var(--tickbox-disabled-bg);
|
|
96
|
-
stroke-width: 3px;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
.tick-box.disabled-state svg rect {
|
|
100
|
-
stroke: var(--tickbox-disabled-border);
|
|
101
|
-
fill: var(--tickbox-disabled-bg);
|
|
102
|
-
stroke-width: 1px;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
.tick-box.disabled-state {
|
|
106
|
-
cursor: not-allowed;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
.tick-box.disabled-state:hover svg rect {
|
|
110
|
-
stroke: var(--tickbox-disabled-border);
|
|
111
|
-
fill: var(--tickbox-disabled-bg);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
.tick-box.disabled-state:hover svg path {
|
|
115
|
-
stroke: var(--tickbox-disabled-checkmark);
|
|
116
|
-
}
|
|
1
|
+
/* Wrapper */
|
|
2
|
+
.tick-box-wrapper {
|
|
3
|
+
display: contents;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
/* Common styles for the checkbox label */
|
|
7
|
+
.tick-box .v-label {
|
|
8
|
+
opacity: 1 !important;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/* Label styles */
|
|
12
|
+
.tick-box-label.label-default {
|
|
13
|
+
color: var(--tickbox-default-text);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.tick-box-label.label-error {
|
|
17
|
+
color: var(--tickbox-error-text);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.tick-box-label.label-success {
|
|
21
|
+
color: var(--tickbox-success-text);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.tick-box-label.label-disabled {
|
|
25
|
+
color: var(--tickbox-disabled-text);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/* Default state */
|
|
29
|
+
.tick-box.default-state .v-icon {
|
|
30
|
+
color: var(--tickbox-default-checkmark) !important;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.tick-box.default-state svg path {
|
|
34
|
+
stroke: var(--tickbox-default-checkmark);
|
|
35
|
+
fill: var(--tickbox-default-bg);
|
|
36
|
+
stroke-width: 3px;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.tick-box.default-state svg rect {
|
|
40
|
+
stroke: var(--tickbox-default-border);
|
|
41
|
+
fill: var(--tickbox-default-bg);
|
|
42
|
+
stroke-width: 1px;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.tick-box.default-state:hover svg rect {
|
|
46
|
+
stroke: var(--tickbox-hovered-border);
|
|
47
|
+
fill: var(--tickbox-hovered-bg);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.tick-box.default-state:hover svg path {
|
|
51
|
+
stroke: var(--tickbox-hovered-checkmark);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/* Success state */
|
|
55
|
+
.tick-box.success-state .v-icon {
|
|
56
|
+
color: var(--tickbox-success-checkmark) !important;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.tick-box.success-state svg rect {
|
|
60
|
+
stroke: var(--tickbox-success-border);
|
|
61
|
+
fill: var(--tickbox-success-bg);
|
|
62
|
+
stroke-width: 1px;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.tick-box.success-state svg path {
|
|
66
|
+
stroke: var(--tickbox-success-checkmark);
|
|
67
|
+
fill: var(--tickbox-success-bg);
|
|
68
|
+
stroke-width: 3px;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/* Error state */
|
|
72
|
+
.tick-box.error-state .v-icon {
|
|
73
|
+
color: var(--tickbox-error-checkmark) !important;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.tick-box.error-state svg path {
|
|
77
|
+
stroke: var(--tickbox-error-checkmark);
|
|
78
|
+
fill: var(--tickbox-error-bg);
|
|
79
|
+
stroke-width: 3px;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.tick-box.error-state svg rect {
|
|
83
|
+
stroke: var(--tickbox-error-border);
|
|
84
|
+
fill: var(--tickbox-error-bg);
|
|
85
|
+
stroke-width: 1px;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/* Disabled state */
|
|
89
|
+
.tick-box.disabled-state .v-icon {
|
|
90
|
+
color: var(--tickbox-disabled-checkmark) !important;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.tick-box.disabled-state svg path {
|
|
94
|
+
stroke: var(--tickbox-disabled-checkmark);
|
|
95
|
+
fill: var(--tickbox-disabled-bg);
|
|
96
|
+
stroke-width: 3px;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.tick-box.disabled-state svg rect {
|
|
100
|
+
stroke: var(--tickbox-disabled-border);
|
|
101
|
+
fill: var(--tickbox-disabled-bg);
|
|
102
|
+
stroke-width: 1px;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.tick-box.disabled-state {
|
|
106
|
+
cursor: not-allowed;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.tick-box.disabled-state:hover svg rect {
|
|
110
|
+
stroke: var(--tickbox-disabled-border);
|
|
111
|
+
fill: var(--tickbox-disabled-bg);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.tick-box.disabled-state:hover svg path {
|
|
115
|
+
stroke: var(--tickbox-disabled-checkmark);
|
|
116
|
+
}
|