@zap-wunschlachen/wl-shared-components 1.0.0

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.
Files changed (254) hide show
  1. package/.github/workflows/playwright.yml +215 -0
  2. package/.github/workflows/static.yml +62 -0
  3. package/.prettierrc +5 -0
  4. package/.storybook/main.ts +18 -0
  5. package/.storybook/preview.ts +37 -0
  6. package/.storybook/storyWrapper.vue +18 -0
  7. package/.storybook/withVuetifyTheme.decorator.ts +21 -0
  8. package/App.vue +95 -0
  9. package/README.md +56 -0
  10. package/heroicons.ts +75 -0
  11. package/index.html +19 -0
  12. package/package.json +66 -0
  13. package/playwright.config.ts +35 -0
  14. package/public/audio/dummy_pink_noise.wav +0 -0
  15. package/public/background.svg +60 -0
  16. package/public/javascript.svg +1 -0
  17. package/public/style.css +187 -0
  18. package/public/technologies.svg +22 -0
  19. package/src/assets/css/base.css +235 -0
  20. package/src/assets/css/variables.css +96 -0
  21. package/src/assets/fonts/Outfit-Black.ttf +0 -0
  22. package/src/assets/fonts/Outfit-Bold.ttf +0 -0
  23. package/src/assets/fonts/Outfit-ExtraBold.ttf +0 -0
  24. package/src/assets/fonts/Outfit-ExtraLight.ttf +0 -0
  25. package/src/assets/fonts/Outfit-Light.ttf +0 -0
  26. package/src/assets/fonts/Outfit-Medium.ttf +0 -0
  27. package/src/assets/fonts/Outfit-Regular.ttf +0 -0
  28. package/src/assets/fonts/Outfit-SemiBold.ttf +0 -0
  29. package/src/assets/fonts/Outfit-Thin.ttf +0 -0
  30. package/src/components/Accordion/Accordion.css +59 -0
  31. package/src/components/Accordion/AccordionGroup.vue +51 -0
  32. package/src/components/Accordion/AccordionItem.vue +66 -0
  33. package/src/components/Appointment/Card/Actions.css +30 -0
  34. package/src/components/Appointment/Card/Actions.vue +66 -0
  35. package/src/components/Appointment/Card/Card.css +49 -0
  36. package/src/components/Appointment/Card/Card.vue +55 -0
  37. package/src/components/Appointment/Card/Details.css +51 -0
  38. package/src/components/Appointment/Card/Details.vue +44 -0
  39. package/src/components/Audio/Audio.vue +188 -0
  40. package/src/components/Audio/Waveform.vue +118 -0
  41. package/src/components/Button/Button.vue +119 -0
  42. package/src/components/CheckBox/CheckBox.css +185 -0
  43. package/src/components/CheckBox/Checkbox.vue +130 -0
  44. package/src/components/DateInput/DateInput.css +3 -0
  45. package/src/components/DateInput/DateInput.vue +263 -0
  46. package/src/components/Dialog/Dialog.css +6 -0
  47. package/src/components/Dialog/Dialog.vue +29 -0
  48. package/src/components/EditField/EditField.css +20 -0
  49. package/src/components/EditField/EditField.vue +202 -0
  50. package/src/components/IconBullet/IconBullet.vue +86 -0
  51. package/src/components/IconBullet/IconBulletList.vue +41 -0
  52. package/src/components/Icons/Audio/CloudFailed.vue +21 -0
  53. package/src/components/Icons/Audio/CloudSaved.vue +22 -0
  54. package/src/components/Icons/Audio/Delete.vue +16 -0
  55. package/src/components/Icons/Audio/Pause.vue +19 -0
  56. package/src/components/Icons/Audio/Play.vue +16 -0
  57. package/src/components/Icons/CalendarNotification.vue +126 -0
  58. package/src/components/Icons/Chair.vue +32 -0
  59. package/src/components/Icons/ChairNotification.vue +35 -0
  60. package/src/components/Icons/Circle.vue +66 -0
  61. package/src/components/Icons/FavIcon.vue +22 -0
  62. package/src/components/Icons/FilledCircle.vue +11 -0
  63. package/src/components/Icons/Group3.vue +46 -0
  64. package/src/components/Icons/RingNotification.vue +54 -0
  65. package/src/components/Icons/SolidArrowRight.vue +14 -0
  66. package/src/components/Icons/calendar.vue +17 -0
  67. package/src/components/Icons/checkbox.vue +19 -0
  68. package/src/components/Icons/outlineChecked.vue +27 -0
  69. package/src/components/Icons/play.vue +6 -0
  70. package/src/components/Input/Input.css +187 -0
  71. package/src/components/Input/Input.vue +247 -0
  72. package/src/components/Laboratory/AppointmentCard/AppointmentCard.css +7 -0
  73. package/src/components/Laboratory/AppointmentCard/AppointmentCard.vue +116 -0
  74. package/src/components/Laboratory/ChatBoxImage/ChatBoxImage.vue +81 -0
  75. package/src/components/Laboratory/ChatMessage/ChatMessage.vue +113 -0
  76. package/src/components/Laboratory/ChatMessage/ChatMessageBadge.css +4 -0
  77. package/src/components/Laboratory/ChatMessage/ChatMessageBadge.vue +99 -0
  78. package/src/components/Laboratory/ChatNotification/ChatNotification.vue +130 -0
  79. package/src/components/Laboratory/DocumentCard/DocumentCard.css +3 -0
  80. package/src/components/Laboratory/DocumentCard/DocumentCard.vue +50 -0
  81. package/src/components/Laboratory/DocumentCard/DocumentCardItem.vue +53 -0
  82. package/src/components/Laboratory/InfoCard/InfoCard.vue +162 -0
  83. package/src/components/Laboratory/MainColumnsBar/MainColumnsBar.vue +102 -0
  84. package/src/components/Laboratory/ProgressCircle/ProgressCircle.vue +152 -0
  85. package/src/components/Laboratory/ProgressLinear/ProgressLinear.css +33 -0
  86. package/src/components/Laboratory/ProgressLinear/ProgressLinear.vue +75 -0
  87. package/src/components/Laboratory/SelectionColumnBar/SelectionColumnBar.vue +92 -0
  88. package/src/components/Laboratory/StatusNotification/StatusNotification.vue +49 -0
  89. package/src/components/Laboratory/TagLabel/TagLabel.vue +126 -0
  90. package/src/components/Laboratory/TagLabelGroup/TagLabelGroup.vue +97 -0
  91. package/src/components/Laboratory/TicketCard/TicketCard.css +3 -0
  92. package/src/components/Laboratory/TicketCard/TicketCard.vue +143 -0
  93. package/src/components/Laboratory/TimeLine/TimeLineEvent.css +18 -0
  94. package/src/components/Laboratory/TimeLine/TimeLineEvent.vue +119 -0
  95. package/src/components/Laboratory/TimeLine/Timeline.css +4 -0
  96. package/src/components/Laboratory/TimeLine/Timeline.vue +30 -0
  97. package/src/components/Modal/Modal.css +6 -0
  98. package/src/components/Modal/Modal.vue +23 -0
  99. package/src/components/NotificationBubble/NotificationBubble.css +4 -0
  100. package/src/components/NotificationBubble/NotificationBubble.vue +90 -0
  101. package/src/components/OtpInput/OtpInput.css +39 -0
  102. package/src/components/OtpInput/OtpInput.vue +144 -0
  103. package/src/components/PhoneInput/PhoneInput.css +32 -0
  104. package/src/components/PhoneInput/PhoneInput.vue +114 -0
  105. package/src/components/Select/Select.css +150 -0
  106. package/src/components/Select/Select.vue +304 -0
  107. package/src/components/TextArea/TextArea.css +3 -0
  108. package/src/components/TextArea/TextArea.vue +126 -0
  109. package/src/components/TickBox/TickBox.css +49 -0
  110. package/src/components/TickBox/TickBox.vue +126 -0
  111. package/src/components/index.ts +20 -0
  112. package/src/constants/buttonEnums.ts +0 -0
  113. package/src/constants/iconEnums.ts +4 -0
  114. package/src/i18n/i18n.ts +16 -0
  115. package/src/i18n/locales/de.json +19 -0
  116. package/src/i18n/locales/en.json +19 -0
  117. package/src/index.ts +31 -0
  118. package/src/main.ts +11 -0
  119. package/src/plugins/vuetify.ts +131 -0
  120. package/src/shims-vue.d.ts +10 -0
  121. package/src/stories/Accordion.stories.ts +650 -0
  122. package/src/stories/Audio.stories.ts +29 -0
  123. package/src/stories/Button.stories.ts +263 -0
  124. package/src/stories/CheckBox.stories.ts +348 -0
  125. package/src/stories/DateInput.stories.ts +54 -0
  126. package/src/stories/Dialog.stories.ts +147 -0
  127. package/src/stories/EditField.stories.ts +79 -0
  128. package/src/stories/IconBullet/IconBullet.stories.ts +201 -0
  129. package/src/stories/IconBullet/IconBulletList.stories.ts +275 -0
  130. package/src/stories/Input.stories.ts +351 -0
  131. package/src/stories/Laboratory/Cards/AppointmentCard/AppointmentCard.stories.ts +260 -0
  132. package/src/stories/Laboratory/Cards/DocumentCard/DocumentCard.stories.ts +176 -0
  133. package/src/stories/Laboratory/Cards/DocumentCard/DocumentCardItem.stories.ts +119 -0
  134. package/src/stories/Laboratory/Cards/InfoCard/InfoCard.stories.ts +320 -0
  135. package/src/stories/Laboratory/Cards/TicketCard/TicketCard.stories.ts +335 -0
  136. package/src/stories/Laboratory/Chat/ChatBoxImage.stories.ts +82 -0
  137. package/src/stories/Laboratory/Chat/ChatMessage.stories.ts +198 -0
  138. package/src/stories/Laboratory/Chat/ChatMessageBadge.stories.ts +204 -0
  139. package/src/stories/Laboratory/Chat/ChatNotification.stories.ts +144 -0
  140. package/src/stories/Laboratory/Chat/ProgressLinear.stories.ts +186 -0
  141. package/src/stories/Laboratory/Chat/StatusNotification.stories.ts +111 -0
  142. package/src/stories/Laboratory/MainColumnsBar.stories.ts +48 -0
  143. package/src/stories/Laboratory/ProgressCircle.stories.ts +261 -0
  144. package/src/stories/Laboratory/SelectionColumnBar.stories.ts +234 -0
  145. package/src/stories/Laboratory/TagLabel.stories.ts +418 -0
  146. package/src/stories/Laboratory/TagLabelGroup.stories.ts +234 -0
  147. package/src/stories/Laboratory/Timeline.stories.ts +403 -0
  148. package/src/stories/NotificationBubble.stories.ts +194 -0
  149. package/src/stories/OtpInput.stories.ts +101 -0
  150. package/src/stories/PhoneInput.stories.ts +53 -0
  151. package/src/stories/Select.stories.ts +419 -0
  152. package/src/stories/TextArea.stories.ts +112 -0
  153. package/src/stories/TickBox.stories.ts +294 -0
  154. package/src/stories/assets/accessibility.png +0 -0
  155. package/src/stories/assets/accessibility.svg +1 -0
  156. package/src/stories/assets/addon-library.png +0 -0
  157. package/src/stories/assets/assets.png +0 -0
  158. package/src/stories/assets/avif-test-image.avif +0 -0
  159. package/src/stories/assets/context.png +0 -0
  160. package/src/stories/assets/discord.svg +1 -0
  161. package/src/stories/assets/docs.png +0 -0
  162. package/src/stories/assets/figma-plugin.png +0 -0
  163. package/src/stories/assets/github.svg +1 -0
  164. package/src/stories/assets/share.png +0 -0
  165. package/src/stories/assets/styling.png +0 -0
  166. package/src/stories/assets/testing.png +0 -0
  167. package/src/stories/assets/theming.png +0 -0
  168. package/src/stories/assets/tutorials.svg +1 -0
  169. package/src/stories/assets/youtube.svg +1 -0
  170. package/src/stories/v-icon.stories.ts +91 -0
  171. package/src/types/index.ts +21 -0
  172. package/src/vite-env.d.ts +1 -0
  173. package/tests/e2e/README.md +221 -0
  174. package/tests/e2e/accessibility.spec.ts +639 -0
  175. package/tests/e2e/accordion.spec.ts +42 -0
  176. package/tests/e2e/additional-components.spec.ts +438 -0
  177. package/tests/e2e/all-components.spec.ts +135 -0
  178. package/tests/e2e/button-fixed.spec.ts +59 -0
  179. package/tests/e2e/button.spec.ts +76 -0
  180. package/tests/e2e/checkbox.spec.ts +50 -0
  181. package/tests/e2e/date-input.spec.ts +46 -0
  182. package/tests/e2e/debug.spec.ts +52 -0
  183. package/tests/e2e/dialog.spec.ts +58 -0
  184. package/tests/e2e/input.spec.ts +55 -0
  185. package/tests/e2e/laboratory-components.spec.ts +321 -0
  186. package/tests/e2e/otp-input.spec.ts +50 -0
  187. package/tests/e2e/select.spec.ts +52 -0
  188. package/tests/e2e/storybook-utils.ts +59 -0
  189. package/tests/e2e/test-basic.spec.ts +34 -0
  190. package/tests/e2e/visual-regression.spec.ts +351 -0
  191. package/tests/unit/components/Accordion/AccordionGroup.spec.ts +343 -0
  192. package/tests/unit/components/Accordion/AccordionItem.spec.ts +384 -0
  193. package/tests/unit/components/Audio/Audio.spec.ts +404 -0
  194. package/tests/unit/components/Audio/Waveform.spec.ts +484 -0
  195. package/tests/unit/components/Core/Button.spec.ts +337 -0
  196. package/tests/unit/components/Core/Checkbox.spec.ts +545 -0
  197. package/tests/unit/components/Core/DateInput.spec.ts +691 -0
  198. package/tests/unit/components/Core/Dialog.spec.ts +486 -0
  199. package/tests/unit/components/Core/EditField.spec.ts +783 -0
  200. package/tests/unit/components/Core/Input.spec.ts +513 -0
  201. package/tests/unit/components/Core/Modal.spec.ts +519 -0
  202. package/tests/unit/components/Core/NotificationBubble.spec.ts +607 -0
  203. package/tests/unit/components/Core/OtpInput.spec.ts +709 -0
  204. package/tests/unit/components/Core/PhoneInput.spec.ts +620 -0
  205. package/tests/unit/components/Core/Select.spec.ts +713 -0
  206. package/tests/unit/components/Core/TextArea.spec.ts +566 -0
  207. package/tests/unit/components/Core/TickBox.spec.ts +780 -0
  208. package/tests/unit/components/IconBullet/IconBullet.spec.ts +357 -0
  209. package/tests/unit/components/IconBullet/IconBulletList.spec.ts +372 -0
  210. package/tests/unit/components/Icons/Audio/CloudFailed.spec.ts +109 -0
  211. package/tests/unit/components/Icons/Audio/CloudSaved.spec.ts +150 -0
  212. package/tests/unit/components/Icons/Audio/Delete.spec.ts +159 -0
  213. package/tests/unit/components/Icons/Audio/Pause.spec.ts +209 -0
  214. package/tests/unit/components/Icons/Audio/Play.spec.ts +218 -0
  215. package/tests/unit/components/Icons/CalendarNotification.spec.ts +187 -0
  216. package/tests/unit/components/Icons/Chair.spec.ts +235 -0
  217. package/tests/unit/components/Icons/ChairNotification.spec.ts +312 -0
  218. package/tests/unit/components/Icons/Circle.spec.ts +256 -0
  219. package/tests/unit/components/Icons/FavIcon.spec.ts +252 -0
  220. package/tests/unit/components/Icons/FilledCircle.spec.ts +275 -0
  221. package/tests/unit/components/Icons/Group3.spec.ts +356 -0
  222. package/tests/unit/components/Icons/RingNotification.spec.ts +394 -0
  223. package/tests/unit/components/Icons/calendar.spec.ts +287 -0
  224. package/tests/unit/components/Icons/checkbox.spec.ts +316 -0
  225. package/tests/unit/components/Icons/outlineChecked.spec.ts +435 -0
  226. package/tests/unit/components/Icons/play.spec.ts +309 -0
  227. package/tests/unit/components/Laboratory/AppointmentCard.spec.ts +168 -0
  228. package/tests/unit/components/Laboratory/ChatBoxImage.spec.ts +180 -0
  229. package/tests/unit/components/Laboratory/ChatMessage.spec.ts +264 -0
  230. package/tests/unit/components/Laboratory/ChatMessageBadge.spec.ts +283 -0
  231. package/tests/unit/components/Laboratory/ChatNotification.spec.ts +257 -0
  232. package/tests/unit/components/Laboratory/DocumentCard.spec.ts +229 -0
  233. package/tests/unit/components/Laboratory/DocumentCardItem.spec.ts +237 -0
  234. package/tests/unit/components/Laboratory/InfoCard.spec.ts +309 -0
  235. package/tests/unit/components/Laboratory/MainColumnsBar.spec.ts +252 -0
  236. package/tests/unit/components/Laboratory/ProgressCircle.spec.ts +291 -0
  237. package/tests/unit/components/Laboratory/ProgressLinear.spec.ts +276 -0
  238. package/tests/unit/components/Laboratory/SelectionColumnBar.spec.ts +289 -0
  239. package/tests/unit/components/Laboratory/StatusNotification.spec.ts +297 -0
  240. package/tests/unit/components/Laboratory/TagLabel.spec.ts +354 -0
  241. package/tests/unit/components/Laboratory/TagLabelGroup.spec.ts +378 -0
  242. package/tests/unit/components/Laboratory/TicketCard.spec.ts +352 -0
  243. package/tests/unit/components/Laboratory/TimeLineEvent.spec.ts +382 -0
  244. package/tests/unit/components/Laboratory/Timeline.spec.ts +420 -0
  245. package/tests/unit/constants/iconEnums.spec.ts +40 -0
  246. package/tests/unit/i18n/i18n.spec.ts +89 -0
  247. package/tests/unit/plugins/vuetify.spec.ts +221 -0
  248. package/tests/unit/setup.ts +190 -0
  249. package/tests/unit/src/components/index.spec.ts +193 -0
  250. package/tests/unit/src/index.spec.ts +183 -0
  251. package/tests/unit/src/main.spec.ts +152 -0
  252. package/tsconfig.json +26 -0
  253. package/vite.config.ts +29 -0
  254. package/vitest.config.ts +84 -0
@@ -0,0 +1,187 @@
1
+ .v-icon {
2
+ opacity: 1 !important;
3
+ }
4
+
5
+ .v-input__details {
6
+ color: var(--Dental-Blue-0);
7
+ opacity: 1 !important;
8
+ }
9
+
10
+ /* -------- Active and Focused Border States -------- */
11
+ /* Custom border color for v-text-field */
12
+ .v-field__outline {
13
+ opacity: 1; /* Set the opacity to 1 */
14
+ --v-field-border-opacity: 1; /* Ensure full opacity for the border */
15
+ color: var(--Soft-Concrete-1); /* border color */
16
+ }
17
+
18
+ /* Active state border color */
19
+ .v-field--active .v-field__outline {
20
+ color: var(--Soft-Concrete-1); /* Active border color */
21
+ opacity: 1;
22
+ --v-field-border-opacity: 1;
23
+ }
24
+
25
+ /* Focused state border color */
26
+ .v-field--focused .v-field__outline {
27
+ color: var(--Dental-Light-Blue-1); /* Focused border color */
28
+ opacity: 1;
29
+ --v-field-border-opacity: 1;
30
+ }
31
+
32
+ /* Default placeholder color */
33
+ .v-field__input::placeholder {
34
+ color: var(--Dental-Blue--4);
35
+ opacity: 1 !important;
36
+ }
37
+
38
+ .v-field--active .v-field__input::placeholder {
39
+ color: var(--Dental-Blue--4);
40
+ opacity: 1;
41
+ }
42
+
43
+ /* Default input text color */
44
+ .v-field__input {
45
+ color: var(--Dental-Blue--4) !important;
46
+ }
47
+
48
+ .v-field--active .v-field__input {
49
+ color: var(--Dental-Blue-0) !important;
50
+ }
51
+
52
+ .v-field--focused .v-field__input {
53
+ color: var(--Dental-Blue-0) !important;
54
+ }
55
+
56
+ /* -------- Success State -------- */
57
+ /* Text and border color for success */
58
+ .is-success .v-field__input {
59
+ color: var(--Success-Green-1) !important; /* Text color */
60
+ }
61
+
62
+ /* Success state outline */
63
+ .is-success .v-field__outline,
64
+ .is-success .v-field__outline__start,
65
+ .is-success .v-field__outline__end {
66
+ border-color: var(
67
+ --Success-Green-0
68
+ ) !important ; /* Apply success border color */
69
+ opacity: 1; /* Ensure visibility */
70
+ }
71
+
72
+ /* Also, for good measure, let's ensure the focus state works too */
73
+ .is-success .v-field--focused .v-field__outline {
74
+ border-color: var(
75
+ --Success-Green-0
76
+ ); /* Apply success border color when focused */
77
+ }
78
+
79
+ /* Success state placeholder */
80
+ .is-success .v-field__input::placeholder {
81
+ color: var(--Success-Green-1); /* Placeholder color */
82
+ }
83
+
84
+ .is-success .v-field--variant-outlined {
85
+ background: var(--Success-Green--1, #f3fdfc);
86
+ }
87
+
88
+ .is-success .v-icon {
89
+ color: var(--Success-Green-0); /* Your custom color */
90
+ opacity: 1;
91
+ }
92
+
93
+ .is-success .v-input__details {
94
+ color: var(--Success-Green-0);
95
+ opacity: 1 !important;
96
+ }
97
+
98
+ /* -------- Error State -------- */
99
+ /* Text and border color for error */
100
+ .is-error .v-field__input {
101
+ color: var(--Error-Red-0) !important; /* Text color */
102
+ opacity: 1;
103
+ }
104
+
105
+ /* Error border color */
106
+ .is-error .v-field__outline,
107
+ .is-error .v-field__outline__start,
108
+ .is-error .v-field__outline__end {
109
+ border-color: var(--Error-Red-0) !important; /* Error border color */
110
+ opacity: 1; /* Ensure visibility */
111
+ }
112
+
113
+ /* Error state placeholder */
114
+ .is-error .v-field__input::placeholder {
115
+ color: var(--Error-Red-0); /* Placeholder color */
116
+ }
117
+
118
+ .is-error .v-field--variant-outlined {
119
+ background: var(--Light-Gum--3, #fef9f9);
120
+ }
121
+
122
+ .is-error .v-icon {
123
+ color: var(--Error-Red-0); /* Your custom color */
124
+ opacity: 1;
125
+ }
126
+
127
+ .is-error .v-input__details {
128
+ color: var(--Error-Red-0);
129
+ opacity: 1;
130
+ }
131
+
132
+ /* -------- Warning State -------- */
133
+ /* Text and border color for warning */
134
+ .is-warning .v-field__input {
135
+ color: var(--Warm-Light-3) !important; /* Text color */
136
+ }
137
+
138
+ /* Warning border color */
139
+ .is-warning .v-field__outline,
140
+ .is-warning .v-field__outline__start,
141
+ .is-warning .v-field__outline__end {
142
+ border-color: var(--Warning-0) !important ; /* Warning border color */
143
+ }
144
+ /* Warning state placeholder */
145
+ .is-warning .v-field__input::placeholder {
146
+ color: var(--Warm-Light-3); /* Placeholder color */
147
+ }
148
+
149
+ .is-warning .v-field--variant-outlined {
150
+ background: var(--Warm-Light--2, #fffbf4);
151
+ }
152
+
153
+ .is-warning .v-icon {
154
+ color: var(--Warm-Light-3); /* Your custom color */
155
+ }
156
+
157
+ .is-warning .v-input__details {
158
+ color: var(--Warm-Light-3);
159
+ opacity: 1 !important;
160
+ }
161
+
162
+ .v-messages {
163
+ display: none;
164
+ }
165
+
166
+ .v-input__details {
167
+ justify-content: start !important;
168
+ }
169
+
170
+ .v-field--variant-outlined {
171
+ background: white;
172
+ }
173
+
174
+ .border-on-hover .v-field__outline {
175
+ opacity: 0;
176
+ --v-field-border-opacity: 0;
177
+ }
178
+
179
+ .border-on-hover:hover .v-field__outline {
180
+ opacity: 1;
181
+ --v-field-border-opacity: 1;
182
+ }
183
+
184
+ .border-on-hover .v-field--focused .v-field__outline {
185
+ opacity: 1;
186
+ --v-field-border-opacity: 1;
187
+ }
@@ -0,0 +1,247 @@
1
+ <template>
2
+ <v-text-field
3
+ :class="{
4
+ 'is-success': success,
5
+ 'is-error': error,
6
+ 'is-warning': warning,
7
+ 'custom-prepend-icon': true,
8
+ 'border-on-hover': borderOnHover,
9
+ }"
10
+ ref="inputRef"
11
+ :placeholder="computedPlaceholder"
12
+ :variant="variant"
13
+ rounded="lg"
14
+ :prepend-icon="prependIcon"
15
+ :prepend-inner-icon="prependInnerIcon"
16
+ :append-inner-icon="appendInnerIcon"
17
+ :append-icon="appendIcon"
18
+ :disabled="disabled"
19
+ :density="density"
20
+ :hide-details="hideDetails"
21
+ :model-value="modelValue"
22
+ @update:modelValue="onInput"
23
+ :persistent-hint="persistentHint"
24
+ @click:prepend="onPrependClick"
25
+ @click:prepend-inner="onPrependInnerClick"
26
+ @click:append="onAppendClick"
27
+ @click:append-inner="onAppendInnerClick"
28
+ data-testid="root"
29
+ >
30
+ <!-- Prepend Slot (before v-field) -->
31
+ <template v-if="$slots.prepend" #prepend>
32
+ <slot name="prepend"></slot>
33
+ </template>
34
+
35
+ <!-- Prepend Inner Slot (at the start of v-field) -->
36
+ <template v-if="$slots['prepend-inner']" #prepend-inner>
37
+ <slot name="prepend-inner"></slot>
38
+ </template>
39
+
40
+ <!-- Append Inner Slot (at the end of v-field) -->
41
+ <template v-if="$slots['append-inner']" #append-inner>
42
+ <slot name="append-inner"></slot>
43
+ </template>
44
+
45
+ <!-- Append Slot (after v-field) -->
46
+ <template v-if="$slots.append" #append>
47
+ <slot name="append"></slot>
48
+ </template>
49
+
50
+ <!-- Details Slot (for messages, hints, etc.) -->
51
+ <template #details>
52
+ <div class="d-flex flex-row ga-1 align-center">
53
+ <v-icon icon="heroicons:exclamation-circle"></v-icon>
54
+ <span>{{ hint }}</span>
55
+ </div>
56
+ </template>
57
+ </v-text-field>
58
+ </template>
59
+ <script setup>
60
+ import { ref, nextTick, computed } from 'vue';
61
+ import './Input.css';
62
+ import { useI18n } from 'vue-i18n';
63
+
64
+ const { t } = useI18n();
65
+
66
+ // Define events that the component can emit
67
+ const emit = defineEmits([
68
+ 'update:modelValue', // Emits when the input value is updated
69
+ 'click:prepend', // Emits when the prepend icon is clicked
70
+ 'click:append', // Emits when the append icon is clicked
71
+ 'click:prepend-inner', // Emits when the prepend inner icon is clicked
72
+ 'click:append-inner', // Emits when the append inner icon is clicked
73
+ ]);
74
+
75
+ const computedPlaceholder = computed(() => {
76
+ return props.placeholder || t('wl.input.placeholder');
77
+ });
78
+
79
+ // Define the component props
80
+ const props = defineProps({
81
+ /**
82
+ * Indicates if the input is in a success state.
83
+ * When true, the success style will be applied.
84
+ */
85
+ success: Boolean,
86
+
87
+ /**
88
+ * Indicates if the input is in an error state.
89
+ * When true, the error style will be applied.
90
+ */
91
+ error: Boolean,
92
+
93
+ /**
94
+ * Indicates if the input is in a warning state.
95
+ * When true, the warning style will be applied.
96
+ */
97
+ warning: Boolean,
98
+
99
+ /**
100
+ * Disables the input if true, making it non-interactive.
101
+ */
102
+ disabled: Boolean,
103
+
104
+ /**
105
+ * The value of the input. It will be synced with v-model.
106
+ */
107
+ modelValue: String,
108
+
109
+ /**
110
+ * Controls the size and spacing of the input.
111
+ * Accepts 'compact' (default) or other values depending on the UI framework.
112
+ */
113
+ density: {
114
+ type: String,
115
+ default: 'compact',
116
+ },
117
+
118
+ /**
119
+ * The placeholder text that appears when the input is empty.
120
+ */
121
+ placeholder: {
122
+ type: String,
123
+ default: '',
124
+ },
125
+
126
+ /**
127
+ * Hides the details or additional text when true.
128
+ */
129
+ hideDetails: {
130
+ type: Boolean,
131
+ default: true,
132
+ },
133
+
134
+ /**
135
+ * Icon to display before the input field.
136
+ */
137
+ prependIcon: {
138
+ type: String,
139
+ default: '',
140
+ },
141
+
142
+ /**
143
+ * Inner icon to display before the input field, but within the field itself.
144
+ */
145
+ prependInnerIcon: {
146
+ type: String,
147
+ default: '',
148
+ },
149
+
150
+ /**
151
+ * Icon to display after the input field.
152
+ */
153
+ appendIcon: {
154
+ type: String,
155
+ default: '',
156
+ },
157
+
158
+ /**
159
+ * Inner icon to display after the input field, but within the field itself.
160
+ */
161
+ appendInnerIcon: {
162
+ type: String,
163
+ default: '',
164
+ },
165
+
166
+ /**
167
+ * Hint text to display below the input.
168
+ */
169
+ hint: {
170
+ type: String,
171
+ default: '',
172
+ },
173
+
174
+ /**
175
+ * Keeps the hint text visible even when the input is focused.
176
+ */
177
+ persistentHint: {
178
+ type: Boolean,
179
+ default: false,
180
+ },
181
+
182
+ variant: {
183
+ type: String,
184
+ default: 'outlined',
185
+ },
186
+
187
+ borderOnHover: {
188
+ type: Boolean,
189
+ default: false,
190
+ }
191
+ });
192
+
193
+ // Handle the event when the prepend icon is clicked
194
+ const onPrependClick = () => {
195
+ emit('click:prepend');
196
+ };
197
+
198
+ // Handle the event when the prepend inner icon is clicked
199
+ const onPrependInnerClick = () => {
200
+ emit('click:prepend-inner');
201
+ };
202
+
203
+ // Handle the event when the append icon is clicked
204
+ const onAppendClick = () => {
205
+ emit('click:append');
206
+ };
207
+
208
+ // Handle the event when the append inner icon is clicked
209
+ const onAppendInnerClick = () => {
210
+ emit('click:append-inner');
211
+ };
212
+
213
+ // Emit the updated value when the input changes, syncing with v-model
214
+ const onInput = (value) => {
215
+ emit('update:modelValue', value);
216
+ };
217
+
218
+ const inputRef = ref(null)
219
+
220
+ const getNativeInput = () => {
221
+ return inputRef.value?.$el?.querySelector('input');
222
+ }
223
+
224
+ const blur = () => {
225
+ nextTick(() => {
226
+ getNativeInput()?.blur();
227
+ });
228
+ };
229
+
230
+ const select = () => {
231
+ nextTick(() => {
232
+ getNativeInput()?.select();
233
+ });
234
+ };
235
+
236
+ const focus = () => {
237
+ nextTick(() => {
238
+ getNativeInput()?.focus();
239
+ });
240
+ };
241
+
242
+ defineExpose({
243
+ blur,
244
+ select,
245
+ focus
246
+ });
247
+ </script>
@@ -0,0 +1,7 @@
1
+ .appointment-card .v-btn {
2
+ padding: 6px 8px !important;
3
+ }
4
+
5
+ .appointment-card .v-icon {
6
+ color: var(--Dental-Blue-0) !important;
7
+ }
@@ -0,0 +1,116 @@
1
+ <template>
2
+ <v-card elevation="0" class="appointment-card" rounded="lg" data-testid="root">
3
+ <template #title>
4
+ <div class="d-flex flex-row align-center pa-1">
5
+ <h5 class="mr-auto">{{ date }}</h5>
6
+ <h5 class="mr-2">Status:</h5>
7
+ <TagLabel :status="status" />
8
+ </div>
9
+ </template>
10
+
11
+ <template #text>
12
+ <div class="d-flex flex-column ga-4">
13
+ <p>{{ treatmentName }}</p>
14
+ <div class="d-flex">
15
+ <v-btn
16
+ rounded="lg"
17
+ readonly
18
+ variant="outlined"
19
+ prepend-icon="heroicons:document-check"
20
+ class="mr-auto text-none"
21
+ size="compact"
22
+ :style="{
23
+ color: `var(${buttonTextColor})`,
24
+ backgroundColor: buttonBackgroundColor,
25
+ border: `2px solid var(${buttonBorderColor})`,
26
+ }"
27
+ >
28
+ <p class="p-small">{{ treatmentName }}</p>
29
+ </v-btn>
30
+ <v-btn
31
+ rounded="lg"
32
+ readonly
33
+ prepend-icon="heroicons:user-circle"
34
+ variant="text"
35
+ size="compact"
36
+ class="text-none"
37
+ >
38
+ <p class="p-small ml-1">{{ dentistName }}</p>
39
+ </v-btn>
40
+ </div>
41
+ </div>
42
+ </template>
43
+ </v-card>
44
+ </template>
45
+
46
+ <script setup>
47
+ import TagLabel from '@components/Laboratory/TagLabel/TagLabel.vue';
48
+ import { defineProps } from 'vue';
49
+ import './AppointmentCard.css';
50
+
51
+ // Define props for the component
52
+ defineProps({
53
+ /**
54
+ * The date associated with the treatment or appointment.
55
+ * This prop is required and should be a string.
56
+ */
57
+ date: {
58
+ type: String,
59
+ required: true,
60
+ },
61
+
62
+ /**
63
+ * The current status of the treatment or process.
64
+ * This prop is required and is expected to be a string representing the status.
65
+ */
66
+ status: {
67
+ type: String,
68
+ required: true,
69
+ },
70
+
71
+ /**
72
+ * The name of the treatment being performed.
73
+ * This prop is required and should be a string.
74
+ */
75
+ treatmentName: {
76
+ type: String,
77
+ required: true,
78
+ },
79
+
80
+ /**
81
+ * The name of the dentist associated with the treatment.
82
+ * If no dentist name is provided, the default value will be 'Martin Paetz'.
83
+ */
84
+ dentistName: {
85
+ type: String,
86
+ default: 'Martin Paetz',
87
+ },
88
+
89
+ /**
90
+ * The color of the text on the button.
91
+ * Default is the CSS variable '--Dental-Blue-0'.
92
+ */
93
+ buttonTextColor: {
94
+ type: String,
95
+ default: '--Dental-Blue-0',
96
+ },
97
+
98
+ /**
99
+ * The background color of the button.
100
+ * Default is a semi-transparent turquoise color.
101
+ */
102
+ buttonBackgroundColor: {
103
+ type: String,
104
+ default: 'rgba(186, 230, 234, 0.10)',
105
+ },
106
+
107
+ /**
108
+ * The border color of the button.
109
+ * Default is the CSS variable '--Trkis'.
110
+ */
111
+ buttonBorderColor: {
112
+ type: String,
113
+ default: '--Trkis',
114
+ },
115
+ });
116
+ </script>
@@ -0,0 +1,81 @@
1
+ <template>
2
+ <v-card :elevation="0" class="pa-2 chat-box-image" rounded="lg">
3
+ <!-- Title slot for dynamic image rendering -->
4
+ <template #title>
5
+ <div class="d-flex flex-wrap">
6
+ <!-- Loop through the imageSources array prop to dynamically display images -->
7
+ <v-img
8
+ v-for="(image, index) in imageSources"
9
+ :key="index"
10
+ class="ma-2 pa-2"
11
+ aspect-ratio="16/9"
12
+ rounded="lg"
13
+ cover
14
+ :src="image"
15
+ ></v-img>
16
+ </div>
17
+ </template>
18
+
19
+ <!-- Text slot for dynamic paragraph -->
20
+ <template #text>
21
+ <p>{{ paragraphText }}</p>
22
+ </template>
23
+
24
+ <!-- Card actions with buttons -->
25
+ <v-card-actions>
26
+ <div class="d-flex flex-row align-center ga-3 w-100 justify-center">
27
+ <Button
28
+ style="width: 150px"
29
+ label="Approved"
30
+ density="default"
31
+ size="large"
32
+ @click="$emit('click:approved')"
33
+ ></Button>
34
+ <Button
35
+ style="width: 150px"
36
+ label="Not Approved"
37
+ density="default"
38
+ size="large"
39
+ variant="outlined"
40
+ @click="$emit('click:not-approved')"
41
+ ></Button>
42
+ </div>
43
+ </v-card-actions>
44
+ </v-card>
45
+ </template>
46
+
47
+ <script setup>
48
+ import Button from '@components/Button/Button.vue';
49
+ import { defineProps } from 'vue';
50
+
51
+ // Define props for the paragraph text and an array of image sources
52
+ const props = defineProps({
53
+ /**
54
+ * The text content to be displayed in the paragraph.
55
+ * Default value is a placeholder text ('Lorem ipsum...').
56
+ */
57
+ paragraphText: {
58
+ type: String,
59
+ default: 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr...',
60
+ },
61
+
62
+ /**
63
+ * An array of image sources to be used in the component.
64
+ * Each element in the array should be a valid image URL.
65
+ * The default is two example images from Vuetify's CDN.
66
+ */
67
+ imageSources: {
68
+ type: Array,
69
+ default: () => [
70
+ 'https://cdn.vuetifyjs.com/images/parallax/material.jpg',
71
+ 'https://cdn.vuetifyjs.com/images/parallax/material.jpg',
72
+ ],
73
+ },
74
+ });
75
+ </script>
76
+
77
+ <style>
78
+ .chat-box-image .v-img__img--cover {
79
+ border: 1px solid var(--Soft-Concrete-1);
80
+ }
81
+ </style>