@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,215 @@
1
+ name: Playwright Tests
2
+
3
+ on:
4
+ push:
5
+ branches: [develop]
6
+ pull_request:
7
+ branches: [develop]
8
+
9
+ jobs:
10
+ test:
11
+ timeout-minutes: 60
12
+ runs-on: ubuntu-latest
13
+
14
+ strategy:
15
+ matrix:
16
+ browser: [chromium, firefox, webkit]
17
+ fail-fast: false
18
+
19
+ steps:
20
+ - uses: actions/checkout@v4
21
+
22
+ - uses: actions/setup-node@v4
23
+ with:
24
+ node-version: 18
25
+ cache: 'npm'
26
+
27
+ - name: Install dependencies
28
+ run: npm ci
29
+
30
+ - name: Install Playwright Browsers
31
+ run: npx playwright install --with-deps ${{ matrix.browser }}
32
+
33
+ - name: Build Storybook
34
+ run: npm run build-storybook
35
+
36
+ - name: Serve Storybook and run tests
37
+ run: |
38
+ npx concurrently -k -s first -n "SB,TEST" -c "magenta,blue" \
39
+ "npx http-server storybook-static --port 7000 --silent" \
40
+ "npx wait-on http://localhost:7000 && npx playwright test --project=${{ matrix.browser }}"
41
+
42
+ - name: Upload test results
43
+ uses: actions/upload-artifact@v4
44
+ if: always()
45
+ with:
46
+ name: playwright-results-${{ matrix.browser }}
47
+ path: |
48
+ test-results/
49
+ playwright-report/
50
+ retention-days: 7
51
+
52
+ accessibility-test:
53
+ timeout-minutes: 30
54
+ runs-on: ubuntu-latest
55
+
56
+ steps:
57
+ - uses: actions/checkout@v4
58
+
59
+ - uses: actions/setup-node@v4
60
+ with:
61
+ node-version: 18
62
+ cache: 'npm'
63
+
64
+ - name: Install dependencies
65
+ run: npm ci
66
+
67
+ - name: Install Playwright Browsers
68
+ run: npx playwright install chromium
69
+
70
+ - name: Build Storybook
71
+ run: npm run build-storybook
72
+
73
+ - name: Run accessibility tests
74
+ run: |
75
+ npx concurrently -k -s first -n "SB,TEST" -c "magenta,blue" \
76
+ "npx http-server storybook-static --port 7000 --silent" \
77
+ "npx wait-on http://localhost:7000 && npx playwright test --grep 'accessibility|Accessibility' --project=chromium"
78
+
79
+ - name: Upload accessibility results
80
+ uses: actions/upload-artifact@v4
81
+ if: always()
82
+ with:
83
+ name: accessibility-results
84
+ path: |
85
+ test-results/
86
+ playwright-report/
87
+ retention-days: 7
88
+
89
+ visual-regression:
90
+ timeout-minutes: 45
91
+ runs-on: ubuntu-latest
92
+
93
+ steps:
94
+ - uses: actions/checkout@v4
95
+
96
+ - uses: actions/setup-node@v4
97
+ with:
98
+ node-version: 18
99
+ cache: 'npm'
100
+
101
+ - name: Install dependencies
102
+ run: npm ci
103
+
104
+ - name: Install Playwright Browsers
105
+ run: npx playwright install chromium
106
+
107
+ - name: Build Storybook
108
+ run: npm run build-storybook
109
+
110
+ - name: Run visual regression tests
111
+ run: |
112
+ npx concurrently -k -s first -n "SB,TEST" -c "magenta,blue" \
113
+ "npx http-server storybook-static --port 7000 --silent" \
114
+ "npx wait-on http://localhost:7000 && npx playwright test tests/e2e/visual-regression.spec.ts --project=chromium"
115
+
116
+ - name: Upload visual test results
117
+ uses: actions/upload-artifact@v4
118
+ if: always()
119
+ with:
120
+ name: visual-regression-results
121
+ path: |
122
+ test-results/
123
+ playwright-report/
124
+ retention-days: 7
125
+
126
+ mobile-test:
127
+ timeout-minutes: 45
128
+ runs-on: ubuntu-latest
129
+
130
+ steps:
131
+ - uses: actions/checkout@v4
132
+
133
+ - uses: actions/setup-node@v4
134
+ with:
135
+ node-version: 18
136
+ cache: 'npm'
137
+
138
+ - name: Install dependencies
139
+ run: npm ci
140
+
141
+ - name: Install Playwright Browsers
142
+ run: npx playwright install chromium
143
+
144
+ - name: Build Storybook
145
+ run: npm run build-storybook
146
+
147
+ - name: Run mobile tests
148
+ run: |
149
+ npx concurrently -k -s first -n "SB,TEST" -c "magenta,blue" \
150
+ "npx http-server storybook-static --port 7000 --silent" \
151
+ "npx wait-on http://localhost:7000 && npx playwright test --project='Mobile Chrome' --project='Mobile Safari'"
152
+
153
+ - name: Upload mobile test results
154
+ uses: actions/upload-artifact@v4
155
+ if: always()
156
+ with:
157
+ name: mobile-test-results
158
+ path: |
159
+ test-results/
160
+ playwright-report/
161
+ retention-days: 7
162
+
163
+ report:
164
+ if: always()
165
+ needs: [test, accessibility-test, visual-regression, mobile-test]
166
+ runs-on: ubuntu-latest
167
+
168
+ steps:
169
+ - uses: actions/checkout@v4
170
+
171
+ - name: Download all artifacts
172
+ uses: actions/download-artifact@v4
173
+ with:
174
+ path: artifacts
175
+
176
+ - name: Generate consolidated report
177
+ run: |
178
+ echo "# Test Results Summary" > test-summary.md
179
+ echo "" >> test-summary.md
180
+ echo "## Browser Tests" >> test-summary.md
181
+ for browser in chromium firefox webkit; do
182
+ if [ -d "artifacts/playwright-results-$browser" ]; then
183
+ echo "- ✅ $browser tests completed" >> test-summary.md
184
+ else
185
+ echo "- ❌ $browser tests failed" >> test-summary.md
186
+ fi
187
+ done
188
+ echo "" >> test-summary.md
189
+ echo "## Accessibility Tests" >> test-summary.md
190
+ if [ -d "artifacts/accessibility-results" ]; then
191
+ echo "- ✅ Accessibility tests completed" >> test-summary.md
192
+ else
193
+ echo "- ❌ Accessibility tests failed" >> test-summary.md
194
+ fi
195
+ echo "" >> test-summary.md
196
+ echo "## Visual Regression Tests" >> test-summary.md
197
+ if [ -d "artifacts/visual-regression-results" ]; then
198
+ echo "- ✅ Visual regression tests completed" >> test-summary.md
199
+ else
200
+ echo "- ❌ Visual regression tests failed" >> test-summary.md
201
+ fi
202
+ echo "" >> test-summary.md
203
+ echo "## Mobile Tests" >> test-summary.md
204
+ if [ -d "artifacts/mobile-test-results" ]; then
205
+ echo "- ✅ Mobile tests completed" >> test-summary.md
206
+ else
207
+ echo "- ❌ Mobile tests failed" >> test-summary.md
208
+ fi
209
+
210
+ - name: Upload consolidated report
211
+ uses: actions/upload-artifact@v4
212
+ with:
213
+ name: consolidated-test-report
214
+ path: test-summary.md
215
+ retention-days: 30
@@ -0,0 +1,62 @@
1
+ # .github/workflows/deploy-github-pages.yaml
2
+
3
+ # Workflow name
4
+ name: Build and Publish Storybook to GitHub Pages
5
+
6
+ on:
7
+ push:
8
+ branches: [develop]
9
+ pull_request:
10
+ branches: [develop]
11
+
12
+ permissions:
13
+ contents: read
14
+ pages: write
15
+ id-token: write
16
+
17
+ # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
18
+ # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
19
+ concurrency:
20
+ group: "pages"
21
+ cancel-in-progress: false
22
+
23
+ jobs:
24
+ # Build job
25
+ build:
26
+ runs-on: ubuntu-latest
27
+ steps:
28
+ - name: Checkout
29
+ uses: actions/checkout@v4
30
+
31
+ - name: Setup Node
32
+ uses: actions/setup-node@v4
33
+ with:
34
+ node-version: '20'
35
+ cache: 'npm'
36
+
37
+ - name: Setup Pages
38
+ uses: actions/configure-pages@v5
39
+
40
+ - name: Install dependencies
41
+ run: npm ci
42
+
43
+ - name: Build Storybook
44
+ run: npm run build-storybook
45
+
46
+ - name: Upload artifact
47
+ uses: actions/upload-pages-artifact@v3
48
+ with:
49
+ path: ./storybook-static
50
+
51
+ # Deployment job
52
+ deploy:
53
+ environment:
54
+ name: github-pages
55
+ url: ${{ steps.deployment.outputs.page_url }}
56
+ runs-on: ubuntu-latest
57
+ needs: build
58
+ if: github.ref == 'refs/heads/develop' && github.event_name == 'push'
59
+ steps:
60
+ - name: Deploy to GitHub Pages
61
+ id: deployment
62
+ uses: actions/deploy-pages@v4
package/.prettierrc ADDED
@@ -0,0 +1,5 @@
1
+ {
2
+ "singleQuote": true,
3
+ "printWidth": 80,
4
+ "tabWidth": 2
5
+ }
@@ -0,0 +1,18 @@
1
+ import type { StorybookConfig } from '@storybook/vue3-vite';
2
+
3
+ const config: StorybookConfig = {
4
+ stories: ['../src/**/*.stories.@(js|jsx|mjs|ts|tsx)'],
5
+ addons: [
6
+ '@storybook/addon-onboarding',
7
+ '@storybook/addon-links',
8
+ '@storybook/addon-essentials',
9
+ '@chromatic-com/storybook',
10
+ '@storybook/addon-interactions',
11
+ '@storybook/addon-docs',
12
+ ],
13
+ framework: {
14
+ name: '@storybook/vue3-vite',
15
+ options: {},
16
+ },
17
+ };
18
+ export default config;
@@ -0,0 +1,37 @@
1
+ import { withVuetifyTheme } from './withVuetifyTheme.decorator';
2
+ import { setup } from '@storybook/vue3';
3
+ import vuetify from '../src/plugins/vuetify';
4
+ import { createInternalI18n } from '../src/i18n/i18n';
5
+
6
+ import '../src/assets/css/base.css'; // Import global CSS
7
+ import '../src/assets/css/variables.css'; // Import global CSS
8
+
9
+ // Setup Vuetify
10
+ setup((app) => {
11
+ app.use(vuetify);
12
+ app.use(createInternalI18n());
13
+ });
14
+
15
+ // Global Types for Theme
16
+ export const globalTypes = {
17
+ theme: {
18
+ docs: {
19
+ source: {
20
+ type: 'dynamic',
21
+ },
22
+ },
23
+ name: 'Theme',
24
+ description: 'Global theme for components',
25
+ toolbar: {
26
+ icon: 'paintbrush',
27
+ items: [
28
+ { value: 'light', title: 'Light', left: '🌞' },
29
+ { value: 'dark', title: 'Dark', left: '🌛' },
30
+ ],
31
+ dynamicTitle: true,
32
+ },
33
+ },
34
+ };
35
+
36
+ // Combine with Existing Decorators
37
+ export const decorators = [withVuetifyTheme];
@@ -0,0 +1,18 @@
1
+ <template>
2
+ <v-app :theme="themeName">
3
+ <v-main style="background: var(--Soft-Concrete-0)" class="pa-2">
4
+ <slot name="story"></slot>
5
+ </v-main>
6
+ </v-app>
7
+ </template>
8
+
9
+ <script>
10
+ export default {
11
+ props: {
12
+ themeName: {
13
+ type: String,
14
+ default: 'light',
15
+ },
16
+ },
17
+ };
18
+ </script>
@@ -0,0 +1,21 @@
1
+ import { h } from 'vue';
2
+ import StoryWrapper from './storyWrapper.vue';
3
+
4
+ export const DEFAULT_THEME = 'light';
5
+
6
+ export const withVuetifyTheme = (storyFn, context) => {
7
+ // Pull our global theme variable, fallback to DEFAULT_THEME
8
+ const themeName = context.globals.theme || DEFAULT_THEME;
9
+ const story = storyFn();
10
+
11
+ return () => {
12
+ return h(
13
+ StoryWrapper,
14
+ // give themeName to StoryWrapper as a prop
15
+ { themeName },
16
+ {
17
+ story: () => h(story, { ...context.args }),
18
+ },
19
+ );
20
+ };
21
+ };
package/App.vue ADDED
@@ -0,0 +1,95 @@
1
+ <template>
2
+ <div class="app">
3
+ <div class="element-container">
4
+ <div style="width: 100%; display: flex; flex-direction: column; gap: 20px;">
5
+ <Card :appointment="value1" :dentist-image-src="value1.dentist.imageSrc" />
6
+ <Card :appointment="value2" :dentist-image-src="value2.dentist.imageSrc" />
7
+ <Card :appointment="value3" :dentist-image-src="value3.dentist.imageSrc" />
8
+ </div>
9
+ </div>
10
+ </div>
11
+ </template>
12
+
13
+ <script setup lang="ts">
14
+ import {ref} from 'vue';
15
+ import Card from '@/components/Appointment/Card/Card.vue';
16
+ import type { AppointmentData } from '@/types';
17
+
18
+ const value1 = ref<AppointmentData>({
19
+ id: "1",
20
+ patientName: "Max Mustermann",
21
+ start: "2025-09-23T16:00:00Z",
22
+ end: "2025-09-23T16:30:00Z",
23
+ status: "upcoming", // Change to 'past' or 'cancelled' to test other states
24
+ is_confirmed: false,
25
+ template_name: ["Routine Checkup", "Cleaning"],
26
+ description: "ABCD-1234",
27
+ dentist: {
28
+ name: "Dr. Erika Mustermann",
29
+ gender: '',
30
+ imageSrc: ''
31
+ },
32
+ type: 0,
33
+ address: "Musterstraße 1, 12345 Musterstadt",
34
+ district: "Musterstadt-Mitte"
35
+ });
36
+
37
+ const value2 = ref<AppointmentData>({
38
+ id: "2",
39
+ patientName: "Erika Mustermann",
40
+ start: "2025-09-23T16:00:00Z",
41
+ end: "2025-09-23T16:30:00Z",
42
+ status: "cancelled", // Change to 'past' or 'cancelled' to test other states
43
+ is_confirmed: false,
44
+ template_name: ["Routine Checkup", "Cleaning"],
45
+ description: "ABCD-1234",
46
+ dentist: {
47
+ name: "Dr. Erika Mustermann",
48
+ gender: '',
49
+ imageSrc: ''
50
+ },
51
+ type: 0,
52
+ address: "Musterstraße 1, 12345 Musterstadt",
53
+ district: "Musterstadt-Mitte"
54
+ });
55
+
56
+ const value3 = ref<AppointmentData>({
57
+ id: "3",
58
+ patientName: "Max Mustermann",
59
+ start: "2025-09-23T16:00:00Z",
60
+ end: "2025-09-23T16:30:00Z",
61
+ status: "past", // Change to 'past' or 'cancelled' to test other states
62
+ is_confirmed: false,
63
+ template_name: ["Routine Checkup", "Cleaning"],
64
+ description: "ABCD-1234",
65
+ dentist: {
66
+ name: "Dr. Erika Mustermann",
67
+ gender: '',
68
+ imageSrc: ''
69
+ },
70
+ type: 0,
71
+ address: "Musterstraße 1, 12345 Musterstadt",
72
+ district: "Musterstadt-Mitte"
73
+ });
74
+ </script>
75
+
76
+ <style scoped>
77
+ .app {
78
+ display: flex;
79
+ flex-direction: column;
80
+ justify-content: center;
81
+ align-items: center;
82
+ width: 100vw;
83
+ height: 100vh;
84
+ background-color: light-blue;
85
+ }
86
+
87
+ .element-container{
88
+ display: flex;
89
+ flex-direction: column;
90
+ justify-content: center;
91
+ align-items: center;
92
+ width: 70%;
93
+ height: 100%;
94
+ }
95
+ </style>
package/README.md ADDED
@@ -0,0 +1,56 @@
1
+ # WL Shared UI Components
2
+
3
+ This library provides a set of UI components used across all applications within the WL ecosystem.
4
+
5
+ ## Adding @wunschlachen/wl-shared-components to a Nuxt Project
6
+
7
+ ### Step 1: Install the Library
8
+
9
+ To add WL components, use Node's package manager:
10
+
11
+ ```
12
+ npm install @wunschlachen/wl-shared-components
13
+ ```
14
+
15
+
16
+ ### Step 2: Create a Vuetify Plugin File
17
+
18
+ Create a new file named `wlSharedComponents.js` inside your `plugins` folder, and add the following code to define the Vuetify plugin:
19
+
20
+ ```javascript
21
+ // plugins/wlSharedComponents.js
22
+ import { defineNuxtPlugin } from "#app";
23
+ import vuetify from "@wunschlachen/wl-shared-components/src/plugins/vuetify";
24
+
25
+ export default defineNuxtPlugin((nuxtApp) => {
26
+ nuxtApp.vueApp.use(vuetify);
27
+ });
28
+ ```
29
+
30
+ ### Step 3: Update Nuxt Configuration
31
+ In your nuxt.config.js, add the following configurations:
32
+
33
+ Add vuetify and @wunschlachen/wl-shared-components to the build.transpile section.
34
+ Register the Vuetify plugin by adding it to the plugins array.
35
+ ```
36
+ export default defineNuxtConfig({
37
+ build: {
38
+ transpile: ["vuetify", "@wunschlachen/wl-shared-components"],
39
+ },
40
+ });
41
+ ```
42
+
43
+ ## Development
44
+ Running Storybook
45
+ To begin development and launch Storybook, execute:
46
+
47
+ ```
48
+ npm install
49
+ npm run storybook
50
+ ```
51
+
52
+ ## Contributing
53
+
54
+ Pull requests are welcome! For major changes, please open an issue first to discuss proposed changes.
55
+
56
+ Ensure that any necessary tests are updated to maintain project integrity.
package/heroicons.ts ADDED
@@ -0,0 +1,75 @@
1
+ import { h } from 'vue';
2
+ import * as HeroIcons from '@heroicons/vue/24/outline'; // Heroicons solid icons
3
+ import type { IconSet, IconProps } from 'vuetify';
4
+
5
+ // Import multiple custom SVG components
6
+ import Outline from './src/components/Icons/checkbox.vue';
7
+ import OutlineChecked from './src/components/Icons/outlineChecked.vue';
8
+ import Circle from './src/components/Icons/Circle.vue';
9
+ import Calender from './src/components/Icons/calendar.vue';
10
+ import CalendarNotification from './src/components/Icons/CalendarNotification.vue';
11
+ import Chair from './src/components/Icons/Chair.vue';
12
+ import ChairNotification from './src/components/Icons/ChairNotification.vue';
13
+ import Group3 from './src/components/Icons/Group3.vue';
14
+ import RingNotification from './src/components/Icons/RingNotification.vue';
15
+ import SolidArrowRight from './src/components/Icons/SolidArrowRight.vue';
16
+ import FilledCircle from './src/components/Icons/FilledCircle.vue';
17
+ import FavIcon from './src/components/Icons/FavIcon.vue';
18
+
19
+ // Register custom SVG icons in an object
20
+ const customIcons: Record<string, typeof Outline> = {
21
+ Outline,
22
+ OutlineChecked,
23
+ Circle,
24
+ Calender,
25
+ CalendarNotification,
26
+ Chair,
27
+ ChairNotification,
28
+ Group3,
29
+ RingNotification,
30
+ SolidArrowRight,
31
+ FilledCircle,
32
+ FavIcon,
33
+ };
34
+
35
+ const heroicons: IconSet = {
36
+ component: (props: IconProps) => {
37
+ let { icon, ...rest } = props;
38
+
39
+ if (typeof icon === 'string') {
40
+ // Convert icon name to PascalCase for custom icons
41
+ const PascalCaseIconName = icon
42
+ .split('-')
43
+ .map((chunk) => chunk.charAt(0).toUpperCase() + chunk.slice(1))
44
+ .join('');
45
+
46
+ const CustomIconComponent =
47
+ customIcons[PascalCaseIconName as keyof typeof customIcons];
48
+
49
+ if (CustomIconComponent) {
50
+ // Render the custom icon if found
51
+ return h(CustomIconComponent, rest);
52
+ }
53
+
54
+ // Otherwise, check for Heroicons
55
+ if (icon.startsWith('heroicons-')) {
56
+ icon = icon.replace('heroicons-', '');
57
+ }
58
+
59
+ const HeroIconComponent = (HeroIcons as any)[`${PascalCaseIconName}Icon`];
60
+
61
+ if (HeroIconComponent) {
62
+ // Render Heroicon if found
63
+ return h(HeroIconComponent, rest);
64
+ }
65
+
66
+ console.warn(`Icon "${icon}" not found.`);
67
+ } else {
68
+ console.warn('Icon value is not a string:', icon);
69
+ }
70
+
71
+ return null;
72
+ },
73
+ };
74
+
75
+ export default heroicons;
package/index.html ADDED
@@ -0,0 +1,19 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>My Vite App</title>
7
+
8
+ <!-- Add the link to the Google Font or custom font here -->
9
+ <link
10
+ href="https://fonts.googleapis.com/css2?family=Outfit:wght@400;500;700&display=swap"
11
+ rel="stylesheet"
12
+ />
13
+ </head>
14
+ <body>
15
+ <div id="app"></div>
16
+
17
+ <script type="module" src="/src/main.ts"></script>
18
+ </body>
19
+ </html>
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "@zap-wunschlachen/wl-shared-components",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "scripts": {
6
+ "dev": "vite",
7
+ "dev host": "vite --host",
8
+ "build": "tsc && vite build",
9
+ "preview": "vite preview",
10
+ "storybook": "storybook dev -p 7000",
11
+ "build-storybook": "storybook build",
12
+ "test": "vitest",
13
+ "test:ui-vitest": "vitest --ui",
14
+ "test:unit": "vitest run",
15
+ "test:unit:watch": "vitest watch",
16
+ "test:coverage": "vitest run --coverage",
17
+ "test:e2e": "playwright test",
18
+ "test:e2e:headed": "playwright test --headed",
19
+ "test:e2e:ui": "playwright test --ui",
20
+ "test:e2e:report": "playwright show-report"
21
+ },
22
+ "devDependencies": {
23
+ "@axe-core/playwright": "^4.10.2",
24
+ "@chromatic-com/storybook": "^1.9.0",
25
+ "@playwright/test": "^1.55.0",
26
+ "@storybook/addon-actions": "^8.3.5",
27
+ "@storybook/addon-docs": "^8.3.6",
28
+ "@storybook/addon-essentials": "^8.3.6",
29
+ "@storybook/addon-interactions": "^8.3.5",
30
+ "@storybook/addon-links": "^8.3.5",
31
+ "@storybook/addon-onboarding": "^8.3.5",
32
+ "@storybook/blocks": "^8.3.5",
33
+ "@storybook/test": "^8.3.5",
34
+ "@storybook/vue3": "^8.3.5",
35
+ "@storybook/vue3-vite": "^8.3.5",
36
+ "@testing-library/user-event": "^14.6.1",
37
+ "@testing-library/vue": "^8.1.0",
38
+ "@vitest/coverage-v8": "^3.2.4",
39
+ "@vitest/ui": "^3.2.4",
40
+ "@vue/test-utils": "^2.4.6",
41
+ "concurrently": "^9.2.1",
42
+ "happy-dom": "^18.0.1",
43
+ "http-server": "^14.1.1",
44
+ "playwright": "^1.55.0",
45
+ "prettier": "^3.3.1",
46
+ "storybook": "^8.3.5",
47
+ "typescript": "^5.2.2",
48
+ "vite": "^5.2.0",
49
+ "vitest": "^3.2.4",
50
+ "vue": "^3.5.11",
51
+ "wait-on": "^8.0.4"
52
+ },
53
+ "dependencies": {
54
+ "@heroicons/vue": "^2.1.5",
55
+ "@mdi/font": "^7.4.47",
56
+ "@vitejs/plugin-vue": "^5.1.4",
57
+ "date-fns": "^4.1.0",
58
+ "flag-icons": "^7.5.0",
59
+ "v-phone-input": "^5.1.0",
60
+ "vue-i18n": "^11.1.11",
61
+ "wavesurfer.js": "^7.9.9"
62
+ },
63
+ "peerDependencies": {
64
+ "vuetify": "^3.7.15"
65
+ }
66
+ }