@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,403 @@
1
+ import { Meta, Story } from '@storybook/vue3';
2
+ import Timeline from '@components/Laboratory/TimeLine/Timeline.vue';
3
+ import TimelineEvent from '@components/Laboratory/TimeLine/TimeLineEvent.vue';
4
+ import TagLabel from '@components/Laboratory/TagLabel/TagLabel.vue';
5
+
6
+ const meta: Meta<typeof Timeline> = {
7
+ title: 'WL/Laboratory/Timeline',
8
+ component: Timeline,
9
+ tags: ['autodocs'],
10
+ argTypes: {
11
+ events: {
12
+ control: 'object',
13
+ description: 'An array of event objects to display in the timeline.',
14
+ },
15
+ },
16
+ parameters: {
17
+ docs: {
18
+ description: {
19
+ component: `
20
+ The \`Timeline\` component displays a series of events in chronological order. Each event can include headers, durations, steps, and status indicators.
21
+
22
+ ### Props
23
+
24
+ - **\`events\`**: An array of event objects. Each event object can have the following properties:
25
+ - **\`status\`**: The status of the event, e.g., 'Done', 'Ready', 'Dispatched'.
26
+ - **\`firstHeader\`**: The main header for the event.
27
+ - **\`secondHeader\`**: A secondary header for the event.
28
+ - **\`firstDuration\`**: Duration text associated with the first header.
29
+ - **\`secondDuration\`**: Duration text associated with the second header.
30
+ - **\`steps\`**: An array of step objects, each containing a date and description.
31
+ - **\`urgent\`**: A boolean indicating if the event is marked as urgent.
32
+
33
+ ### Slots
34
+
35
+ - **\`content\`**: Slot to customize the rendering of each event. Receives \`event\` as a scoped slot prop.
36
+
37
+ ### Example Usage
38
+
39
+ Below are examples of how to use the \`Timeline\` component with various event configurations.
40
+ `,
41
+ },
42
+ },
43
+ },
44
+ };
45
+
46
+ export default meta;
47
+
48
+ const Template: Story = (args) => ({
49
+ components: { Timeline, TimelineEvent, TagLabel },
50
+ setup() {
51
+ return { args };
52
+ },
53
+ template: `
54
+ <div style="padding: 16px;">
55
+ <Timeline v-bind="args">
56
+ <template #content="{ event }">
57
+ <TimelineEvent
58
+ :firstHeader="event.firstHeader"
59
+ :secondHeader="event.secondHeader"
60
+ :firstDuration="event.firstDuration"
61
+ :secondDuration="event.secondDuration"
62
+ :steps="event.steps"
63
+ :urgent="event.urgent"
64
+ >
65
+ <template #icon>
66
+ <TagLabel :status="event.status" />
67
+ </template>
68
+ </TimelineEvent>
69
+ </template>
70
+ </Timeline>
71
+ </div>
72
+ `,
73
+ });
74
+
75
+ export const DefaultTimeline = Template.bind({});
76
+ DefaultTimeline.args = {
77
+ events: [
78
+ {
79
+ status: 'Done',
80
+ firstHeader: 'Projekt A',
81
+ secondHeader: 'Projekt B',
82
+ firstDuration: '10 Tage 5 Stunden',
83
+ secondDuration: '12 Tage 3 Stunden',
84
+ steps: [
85
+ {
86
+ date: '12. Sept. 2021',
87
+ description:
88
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
89
+ },
90
+ {
91
+ date: '15. Sept. 2022',
92
+ description:
93
+ 'Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.',
94
+ },
95
+ ],
96
+ },
97
+ ],
98
+ };
99
+ DefaultTimeline.parameters = {
100
+ docs: {
101
+ source: {
102
+ code: `
103
+ <script setup>
104
+ import Timeline from '@components/Laboratory/TimeLine/Timeline.vue';
105
+ import TimelineEvent from '@components/Laboratory/TimeLine/TimeLineEvent.vue';
106
+ import TagLabel from '@components/Laboratory/TagLabel/TagLabel.vue';
107
+
108
+ const events = [
109
+ {
110
+ status: 'Done',
111
+ firstHeader: 'Projekt A',
112
+ secondHeader: 'Projekt B',
113
+ firstDuration: '10 Tage 5 Stunden',
114
+ secondDuration: '12 Tage 3 Stunden',
115
+ steps: [
116
+ {
117
+ date: '12. Sept. 2021',
118
+ description:
119
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
120
+ },
121
+ {
122
+ date: '15. Sept. 2022',
123
+ description:
124
+ 'Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.',
125
+ },
126
+ ],
127
+ },
128
+ ];
129
+ </script>
130
+
131
+ <template>
132
+ <Timeline :events="events">
133
+ <template #content="{ event }">
134
+ <TimelineEvent
135
+ :firstHeader="event.firstHeader"
136
+ :secondHeader="event.secondHeader"
137
+ :firstDuration="event.firstDuration"
138
+ :secondDuration="event.secondDuration"
139
+ :steps="event.steps"
140
+ :urgent="event.urgent"
141
+ >
142
+ <template #icon>
143
+ <TagLabel :status="event.status" />
144
+ </template>
145
+ </TimelineEvent>
146
+ </template>
147
+ </Timeline>
148
+ </template>
149
+ `,
150
+ },
151
+ },
152
+ };
153
+
154
+ export const MultipleStepsTimeline = Template.bind({});
155
+ MultipleStepsTimeline.args = {
156
+ events: [
157
+ {
158
+ status: 'Done',
159
+ firstHeader: 'Projekt A',
160
+ secondHeader: 'Projekt B',
161
+ firstDuration: '10 Tage 5 Stunden',
162
+ secondDuration: '12 Tage 3 Stunden',
163
+ steps: [
164
+ {
165
+ date: '12. Sept. 2021',
166
+ description:
167
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
168
+ },
169
+ {
170
+ date: '15. Sept. 2022',
171
+ description:
172
+ 'Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.',
173
+ },
174
+ ],
175
+ },
176
+ {
177
+ urgent: true,
178
+ status: 'Ready',
179
+ firstHeader: 'Projekt C',
180
+ secondHeader: 'Estimated',
181
+ firstDuration: '5 Tage 2 Stunden',
182
+ secondDuration: '1 d 5 h',
183
+ steps: [
184
+ {
185
+ date: '18. Sept. 2023',
186
+ description:
187
+ 'Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi.',
188
+ },
189
+ {
190
+ date: '20. Sept. 2024',
191
+ description:
192
+ 'Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.',
193
+ },
194
+ ],
195
+ },
196
+ {
197
+ status: 'Dispatched',
198
+ firstHeader: 'Projekt E',
199
+ secondHeader: 'Projekt F',
200
+ firstDuration: '4 Tage 2 Stunden',
201
+ secondDuration: '6 Tage 3 Stunden',
202
+ steps: [], // No steps for this event
203
+ },
204
+ ],
205
+ };
206
+ MultipleStepsTimeline.parameters = {
207
+ docs: {
208
+ source: {
209
+ code: `
210
+ <script setup>
211
+ import Timeline from '@components/Laboratory/TimeLine/Timeline.vue';
212
+ import TimelineEvent from '@components/Laboratory/TimeLine/TimeLineEvent.vue';
213
+ import TagLabel from '@components/Laboratory/TagLabel/TagLabel.vue';
214
+
215
+ const events = [
216
+ {
217
+ status: 'Done',
218
+ firstHeader: 'Projekt A',
219
+ secondHeader: 'Projekt B',
220
+ firstDuration: '10 Tage 5 Stunden',
221
+ secondDuration: '12 Tage 3 Stunden',
222
+ steps: [
223
+ {
224
+ date: '12. Sept. 2021',
225
+ description:
226
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
227
+ },
228
+ {
229
+ date: '15. Sept. 2022',
230
+ description:
231
+ 'Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.',
232
+ },
233
+ ],
234
+ },
235
+ {
236
+ urgent: true,
237
+ status: 'Ready',
238
+ firstHeader: 'Projekt C',
239
+ secondHeader: 'Estimated',
240
+ firstDuration: '5 Tage 2 Stunden',
241
+ secondDuration: '1 d 5 h',
242
+ steps: [
243
+ {
244
+ date: '18. Sept. 2023',
245
+ description:
246
+ 'Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi.',
247
+ },
248
+ {
249
+ date: '20. Sept. 2024',
250
+ description:
251
+ 'Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.',
252
+ },
253
+ ],
254
+ },
255
+ {
256
+ status: 'Dispatched',
257
+ firstHeader: 'Projekt E',
258
+ secondHeader: 'Projekt F',
259
+ firstDuration: '4 Tage 2 Stunden',
260
+ secondDuration: '6 Tage 3 Stunden',
261
+ steps: [],
262
+ },
263
+ ];
264
+ </script>
265
+
266
+ <template>
267
+ <Timeline :events="events">
268
+ <template #content="{ event }">
269
+ <TimelineEvent
270
+ :firstHeader="event.firstHeader"
271
+ :secondHeader="event.secondHeader"
272
+ :firstDuration="event.firstDuration"
273
+ :secondDuration="event.secondDuration"
274
+ :steps="event.steps"
275
+ :urgent="event.urgent"
276
+ >
277
+ <template #icon>
278
+ <TagLabel :status="event.status" />
279
+ </template>
280
+ </TimelineEvent>
281
+ </template>
282
+ </Timeline>
283
+ </template>
284
+ `,
285
+ },
286
+ },
287
+ };
288
+
289
+ export const NoStepsTimeline = Template.bind({});
290
+ NoStepsTimeline.args = {
291
+ events: [
292
+ {
293
+ status: 'Dispatched',
294
+ firstHeader: 'Projekt E',
295
+ secondHeader: 'Projekt F',
296
+ firstDuration: '4 Tage 2 Stunden',
297
+ secondDuration: '6 Tage 3 Stunden',
298
+ steps: [], // No steps for this event
299
+ },
300
+ ],
301
+ };
302
+ NoStepsTimeline.parameters = {
303
+ docs: {
304
+ source: {
305
+ code: `
306
+ <script setup>
307
+ import Timeline from '@components/Laboratory/TimeLine/Timeline.vue';
308
+ import TimelineEvent from '@components/Laboratory/TimeLine/TimeLineEvent.vue';
309
+ import TagLabel from '@components/Laboratory/TagLabel/TagLabel.vue';
310
+
311
+ const events = [
312
+ {
313
+ status: 'Dispatched',
314
+ firstHeader: 'Projekt E',
315
+ secondHeader: 'Projekt F',
316
+ firstDuration: '4 Tage 2 Stunden',
317
+ secondDuration: '6 Tage 3 Stunden',
318
+ steps: [],
319
+ },
320
+ ];
321
+ </script>
322
+
323
+ <template>
324
+ <Timeline :events="events">
325
+ <template #content="{ event }">
326
+ <TimelineEvent
327
+ :firstHeader="event.firstHeader"
328
+ :secondHeader="event.secondHeader"
329
+ :firstDuration="event.firstDuration"
330
+ :secondDuration="event.secondDuration"
331
+ :steps="event.steps"
332
+ :urgent="event.urgent"
333
+ >
334
+ <template #icon>
335
+ <TagLabel :status="event.status" />
336
+ </template>
337
+ </TimelineEvent>
338
+ </template>
339
+ </Timeline>
340
+ </template>
341
+ `,
342
+ },
343
+ },
344
+ };
345
+
346
+ export const UrgentTimeline = Template.bind({});
347
+ UrgentTimeline.args = {
348
+ events: [
349
+ {
350
+ urgent: true,
351
+ status: 'Done',
352
+ firstHeader: 'Projekt B',
353
+ secondHeader: 'Estimated',
354
+ firstDuration: '4 Tage 2 Stunden',
355
+ secondDuration: '6 Tage 3 Stunden',
356
+ steps: [], // No steps for this event
357
+ },
358
+ ],
359
+ };
360
+ UrgentTimeline.parameters = {
361
+ docs: {
362
+ source: {
363
+ code: `
364
+ <script setup>
365
+ import Timeline from '@components/Laboratory/TimeLine/Timeline.vue';
366
+ import TimelineEvent from '@components/Laboratory/TimeLine/TimeLineEvent.vue';
367
+ import TagLabel from '@components/Laboratory/TagLabel/TagLabel.vue';
368
+
369
+ const events = [
370
+ {
371
+ urgent: true,
372
+ status: 'Done',
373
+ firstHeader: 'Projekt B',
374
+ secondHeader: 'Estimated',
375
+ firstDuration: '4 Tage 2 Stunden',
376
+ secondDuration: '6 Tage 3 Stunden',
377
+ steps: [],
378
+ },
379
+ ];
380
+ </script>
381
+
382
+ <template>
383
+ <Timeline :events="events">
384
+ <template #content="{ event }">
385
+ <TimelineEvent
386
+ :firstHeader="event.firstHeader"
387
+ :secondHeader="event.secondHeader"
388
+ :firstDuration="event.firstDuration"
389
+ :secondDuration="event.secondDuration"
390
+ :steps="event.steps"
391
+ :urgent="event.urgent"
392
+ >
393
+ <template #icon>
394
+ <TagLabel :status="event.status" />
395
+ </template>
396
+ </TimelineEvent>
397
+ </template>
398
+ </Timeline>
399
+ </template>
400
+ `,
401
+ },
402
+ },
403
+ };
@@ -0,0 +1,194 @@
1
+ import { Meta, StoryObj } from '@storybook/vue3';
2
+ import NotificationBubble from '@components/NotificationBubble/NotificationBubble.vue'; // Adjust the import to match your component location
3
+
4
+ // Meta configuration for the NotificationBubble component
5
+ const meta: Meta<typeof NotificationBubble> = {
6
+ title: 'WL/NotificationBubble',
7
+ component: NotificationBubble,
8
+ tags: ['autodocs'],
9
+ argTypes: {
10
+ color: { control: 'color' },
11
+ size: { control: 'text' },
12
+ text: { control: 'text' },
13
+ textColor: { control: 'color' },
14
+ icon: { control: 'text' },
15
+ iconSize: { control: 'text' },
16
+ },
17
+ args: {
18
+ color: 'var(--Dental-Blue-0)',
19
+ size: '40',
20
+ textColor: 'white',
21
+ iconSize: '24',
22
+ },
23
+ parameters: {
24
+ docs: {
25
+ description: {
26
+ component: `
27
+ The \`NotificationBubble\` component is a visual indicator used for displaying notifications with either an icon or text. The component offers customizable properties for color, size, and icon/text options.
28
+
29
+ ### Props
30
+ - **\`color\`**: Sets the background color of the notification bubble.
31
+ - **\`size\`**: Determines the size of the bubble.
32
+ - **\`text\`**: Text displayed inside the bubble, typically used to show a count.
33
+ - **\`textColor\`**: Sets the color of the text within the bubble.
34
+ - **\`icon\`**: Icon name to display if no text is present.
35
+ - **\`iconSize\`**: Controls the size of the icon.
36
+
37
+ ### Example Usage
38
+ Examples below show the \`NotificationBubble\` in different states, including icon-only and text-only modes.
39
+ `,
40
+ },
41
+ },
42
+ },
43
+ };
44
+
45
+ export default meta;
46
+ type Story = StoryObj<typeof meta>;
47
+
48
+ // Common render template for the component
49
+ const Template: Story = {
50
+ render: (args) => ({
51
+ components: { NotificationBubble },
52
+ setup() {
53
+ return { args };
54
+ },
55
+ template: `
56
+ <NotificationBubble v-bind="args" />
57
+ `,
58
+ }),
59
+ };
60
+
61
+ /**
62
+ * Default Notification Bubble Story
63
+ */
64
+ export const Default: Story = {
65
+ ...Template,
66
+ args: {
67
+ icon: 'heroicons:bell',
68
+ text: '',
69
+ },
70
+ parameters: {
71
+ docs: {
72
+ source: {
73
+ code: `
74
+ <template>
75
+ <NotificationBubble icon="heroicons:bell" />
76
+ </template>
77
+ `,
78
+ },
79
+ },
80
+ },
81
+ };
82
+
83
+ /**
84
+ * Story with Text Display
85
+ */
86
+ export const WithText: Story = {
87
+ ...Template,
88
+ args: {
89
+ text: '9',
90
+ icon: '',
91
+ },
92
+ parameters: {
93
+ docs: {
94
+ source: {
95
+ code: `
96
+ <template>
97
+ <NotificationBubble text="9" />
98
+ </template>
99
+ `,
100
+ },
101
+ },
102
+ },
103
+ };
104
+
105
+ /**
106
+ * Custom Color and Text Notification Bubble Story
107
+ */
108
+ export const CustomColorAndText: Story = {
109
+ ...Template,
110
+ args: {
111
+ color: 'red',
112
+ icon: 'heroicons:calendar',
113
+ iconSize: '25',
114
+ textColor: 'white',
115
+ },
116
+ parameters: {
117
+ docs: {
118
+ source: {
119
+ code: `
120
+ <template>
121
+ <NotificationBubble color="red" icon="heroicons:calendar" iconSize="25" textColor="white" />
122
+ </template>
123
+ `,
124
+ },
125
+ },
126
+ },
127
+ };
128
+
129
+ /**
130
+ * Custom Icon Notification Bubble Story
131
+ */
132
+ export const CustomIcon: Story = {
133
+ ...Template,
134
+ args: {
135
+ color: 'green',
136
+ icon: 'heroicons:check-circle',
137
+ iconSize: '30',
138
+ text: '',
139
+ },
140
+ parameters: {
141
+ docs: {
142
+ source: {
143
+ code: `
144
+ <template>
145
+ <NotificationBubble color="green" icon="heroicons:check-circle" iconSize="30" />
146
+ </template>
147
+ `,
148
+ },
149
+ },
150
+ },
151
+ };
152
+
153
+ export const OutlinedIcon: Story = {
154
+ ...Template,
155
+ args: {
156
+ color: 'var(--Dental-Blue-0)',
157
+ icon: 'heroicons:x-mark',
158
+ iconSize: '25',
159
+ textColor: 'var(--Dental-Blue-0)',
160
+ variant: 'outlined',
161
+ },
162
+ parameters: {
163
+ docs: {
164
+ source: {
165
+ code: `
166
+ <template>
167
+ <NotificationBubble color="red" icon="heroicons:calendar" iconSize="25" textColor="white" />
168
+ </template>
169
+ `,
170
+ },
171
+ },
172
+ },
173
+ };
174
+ export const OutlinedText: Story = {
175
+ ...Template,
176
+ args: {
177
+ color: 'var(--Dental-Blue-0)',
178
+ text: '9',
179
+ iconSize: '25',
180
+ textColor: 'var(--Dental-Blue-0)',
181
+ variant: 'outlined',
182
+ },
183
+ parameters: {
184
+ docs: {
185
+ source: {
186
+ code: `
187
+ <template>
188
+ <NotificationBubble color="red" icon="heroicons:calendar" iconSize="25" textColor="white" />
189
+ </template>
190
+ `,
191
+ },
192
+ },
193
+ },
194
+ };
@@ -0,0 +1,101 @@
1
+ import OtpInput from '@/components/OtpInput/OtpInput.vue';
2
+ import { Meta, StoryObj } from '@storybook/vue3';
3
+ import { reactive } from 'vue';
4
+
5
+ const meta: Meta<typeof OtpInput> = {
6
+ title: 'WL/OtpInput',
7
+ component: OtpInput,
8
+ tags: ['autodocs'],
9
+ argTypes: {
10
+ phoneNumber: { control: 'text', description: 'The phone number to send the OTP to' },
11
+ message: { control: 'text', description: 'The status message to display under the input' },
12
+ otpState: { control: 'select', options: ['default', 'error', 'success'], description: 'The state of the OTP input' },
13
+ submitFn: { control: 'function', description: 'The function to call when the OTP is submitted' },
14
+ resendFn: { control: 'function', description: 'The function to call when the resend button is clicked' },
15
+ loading: { control: 'boolean', description: 'Whether the component is loading' },
16
+ colors: { control: 'object', description: 'The colors to use for the component' }
17
+ },
18
+ args: {
19
+ phoneNumber: '+4915211122344',
20
+ message: 'Please enter the OTP sent to your phone.',
21
+ otpState: 'default',
22
+ submitFn: () => {
23
+ console.log('OTP submitted');
24
+ },
25
+ resendFn: () => {
26
+ console.log('Resend OTP');
27
+ },
28
+ loading: false,
29
+ colors: {
30
+ error: 'var(--Error-Red-0)',
31
+ success: 'var(--Success-Green-0)'
32
+ },
33
+ },
34
+ parameters: {
35
+ docs: {
36
+ description: {
37
+ component: ''
38
+ },
39
+ },
40
+ },
41
+ };
42
+
43
+ export default meta;
44
+ type Story = StoryObj<typeof meta>;
45
+
46
+ const Template: Story = {
47
+ render: (args) => ({
48
+ components: { OtpInput },
49
+ setup() {
50
+ const state = reactive({
51
+ otpState: args.otpState,
52
+ message: args.message,
53
+ loading: args.loading,
54
+ });
55
+
56
+ const submitFn = () => {
57
+ state.loading = true;
58
+
59
+ const states = ['error', 'success'] as const;
60
+ const randomState = states[Math.floor(Math.random() * states.length)];
61
+
62
+ setTimeout(() => {
63
+ state.loading = false;
64
+
65
+ state.otpState = randomState;
66
+ state.message =
67
+ randomState === 'error'
68
+ ? 'Invalid OTP. Please try again.'
69
+ : randomState === 'success'
70
+ ? 'OTP verified successfully!'
71
+ : 'Please enter the OTP sent to your phone.';
72
+ }, 1000);
73
+ };
74
+
75
+ const resendFn = () => {
76
+ state.loading = true;
77
+
78
+ setTimeout(() => {
79
+ state.loading = false;
80
+ }, 1000);
81
+ };
82
+
83
+ return { args, state, submitFn, resendFn };
84
+ },
85
+ template: `
86
+ <div style="padding: 16px;">
87
+ <OtpInput
88
+ :phone-number="args.phoneNumber"
89
+ :otp-state="state.otpState"
90
+ :message="state.message"
91
+ :loading="state.loading"
92
+ :submit-fn="submitFn"
93
+ :resend-fn="resendFn"
94
+ :colors="args.colors"
95
+ />
96
+ </div>
97
+ `,
98
+ }),
99
+ };
100
+
101
+ export const Default: Story = { ...Template, args: {} };