@zap-wunschlachen/wl-shared-components 1.0.16 → 1.0.18

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 (236) hide show
  1. package/.github/workflows/playwright.yml +205 -205
  2. package/.github/workflows/static.yml +61 -61
  3. package/.github/workflows/update-snapshots.yml +37 -37
  4. package/.prettierrc +5 -5
  5. package/.storybook/main.ts +18 -18
  6. package/.storybook/preview.ts +37 -37
  7. package/.storybook/storyWrapper.vue +18 -18
  8. package/.storybook/withVuetifyTheme.decorator.ts +21 -21
  9. package/App.vue +149 -149
  10. package/README.md +56 -56
  11. package/heroicons.ts +75 -75
  12. package/index.html +19 -19
  13. package/package.json +67 -67
  14. package/playwright.config.ts +48 -48
  15. package/public/background.svg +60 -60
  16. package/public/style.css +187 -187
  17. package/public/technologies.svg +22 -22
  18. package/src/assets/css/base.css +235 -235
  19. package/src/assets/css/variables.css +96 -96
  20. package/src/components/Accordion/Accordion.css +59 -59
  21. package/src/components/Accordion/AccordionGroup.vue +51 -51
  22. package/src/components/Accordion/AccordionItem.vue +66 -66
  23. package/src/components/Appointment/Card/Actions.css +34 -28
  24. package/src/components/Appointment/Card/Actions.vue +73 -72
  25. package/src/components/Appointment/Card/AnamneseNotification.css +16 -0
  26. package/src/components/Appointment/Card/AnamneseNotification.vue +24 -0
  27. package/src/components/Appointment/Card/Card.css +80 -80
  28. package/src/components/Appointment/Card/Card.vue +93 -87
  29. package/src/components/Appointment/Card/Details.css +50 -50
  30. package/src/components/Appointment/Card/Details.vue +43 -43
  31. package/src/components/Audio/Audio.vue +187 -187
  32. package/src/components/Audio/Waveform.vue +117 -117
  33. package/src/components/Button/Button.vue +119 -119
  34. package/src/components/CheckBox/CheckBox.css +185 -185
  35. package/src/components/CheckBox/Checkbox.vue +130 -130
  36. package/src/components/DateInput/DateInput.css +2 -2
  37. package/src/components/DateInput/DateInput.vue +262 -262
  38. package/src/components/Dialog/Dialog.css +6 -6
  39. package/src/components/Dialog/Dialog.vue +29 -29
  40. package/src/components/EditField/EditField.css +19 -19
  41. package/src/components/EditField/EditField.vue +202 -202
  42. package/src/components/IconBullet/IconBullet.vue +86 -86
  43. package/src/components/IconBullet/IconBulletList.vue +41 -41
  44. package/src/components/Icons/AdvanceAppointments.vue +153 -153
  45. package/src/components/Icons/Audio/CloudFailed.vue +20 -20
  46. package/src/components/Icons/Audio/CloudSaved.vue +21 -21
  47. package/src/components/Icons/Audio/Delete.vue +15 -15
  48. package/src/components/Icons/Audio/Pause.vue +18 -18
  49. package/src/components/Icons/Audio/Play.vue +15 -15
  50. package/src/components/Icons/CalendarNotification.vue +126 -126
  51. package/src/components/Icons/Chair.vue +32 -32
  52. package/src/components/Icons/ChairNotification.vue +35 -35
  53. package/src/components/Icons/Circle.vue +66 -66
  54. package/src/components/Icons/FavIcon.vue +22 -22
  55. package/src/components/Icons/FilledCircle.vue +11 -11
  56. package/src/components/Icons/Group3.vue +46 -46
  57. package/src/components/Icons/RingNotification.vue +54 -54
  58. package/src/components/Icons/SolidArrowRight.vue +14 -14
  59. package/src/components/Icons/calendar.vue +17 -17
  60. package/src/components/Icons/checkbox.vue +19 -19
  61. package/src/components/Icons/outlineChecked.vue +27 -27
  62. package/src/components/Icons/play.vue +5 -5
  63. package/src/components/Input/Input.css +187 -187
  64. package/src/components/Input/Input.vue +247 -247
  65. package/src/components/Laboratory/AppointmentCard/AppointmentCard.css +7 -7
  66. package/src/components/Laboratory/AppointmentCard/AppointmentCard.vue +116 -116
  67. package/src/components/Laboratory/ChatBoxImage/ChatBoxImage.vue +81 -81
  68. package/src/components/Laboratory/ChatMessage/ChatMessage.vue +113 -113
  69. package/src/components/Laboratory/ChatMessage/ChatMessageBadge.css +4 -4
  70. package/src/components/Laboratory/ChatMessage/ChatMessageBadge.vue +99 -99
  71. package/src/components/Laboratory/ChatNotification/ChatNotification.vue +130 -130
  72. package/src/components/Laboratory/DocumentCard/DocumentCard.css +3 -3
  73. package/src/components/Laboratory/DocumentCard/DocumentCard.vue +50 -50
  74. package/src/components/Laboratory/DocumentCard/DocumentCardItem.vue +53 -53
  75. package/src/components/Laboratory/InfoCard/InfoCard.vue +162 -162
  76. package/src/components/Laboratory/MainColumnsBar/MainColumnsBar.vue +102 -102
  77. package/src/components/Laboratory/ProgressCircle/ProgressCircle.vue +152 -152
  78. package/src/components/Laboratory/ProgressLinear/ProgressLinear.css +33 -33
  79. package/src/components/Laboratory/ProgressLinear/ProgressLinear.vue +75 -75
  80. package/src/components/Laboratory/SelectionColumnBar/SelectionColumnBar.vue +92 -92
  81. package/src/components/Laboratory/StatusNotification/StatusNotification.vue +49 -49
  82. package/src/components/Laboratory/TagLabel/TagLabel.vue +126 -126
  83. package/src/components/Laboratory/TagLabelGroup/TagLabelGroup.vue +97 -97
  84. package/src/components/Laboratory/TicketCard/TicketCard.css +3 -3
  85. package/src/components/Laboratory/TicketCard/TicketCard.vue +143 -143
  86. package/src/components/Laboratory/TimeLine/TimeLineEvent.css +18 -18
  87. package/src/components/Laboratory/TimeLine/TimeLineEvent.vue +119 -119
  88. package/src/components/Laboratory/TimeLine/Timeline.css +4 -4
  89. package/src/components/Laboratory/TimeLine/Timeline.vue +30 -30
  90. package/src/components/Loader/Loader.css +51 -51
  91. package/src/components/Modal/Modal.css +5 -5
  92. package/src/components/Modal/Modal.vue +22 -22
  93. package/src/components/NotificationBubble/NotificationBubble.css +4 -4
  94. package/src/components/NotificationBubble/NotificationBubble.vue +90 -90
  95. package/src/components/OtpInput/OtpInput.css +39 -39
  96. package/src/components/OtpInput/OtpInput.vue +143 -143
  97. package/src/components/PhoneInput/PhoneInput.css +31 -31
  98. package/src/components/PhoneInput/PhoneInput.vue +113 -113
  99. package/src/components/Select/Select.css +150 -150
  100. package/src/components/Select/Select.vue +304 -304
  101. package/src/components/TextArea/TextArea.css +3 -3
  102. package/src/components/TextArea/TextArea.vue +126 -126
  103. package/src/components/TickBox/TickBox.css +49 -49
  104. package/src/components/TickBox/TickBox.vue +126 -126
  105. package/src/components/index.ts +24 -23
  106. package/src/constants/iconEnums.ts +3 -3
  107. package/src/i18n/i18n.ts +15 -15
  108. package/src/i18n/locales/de.json +30 -27
  109. package/src/i18n/locales/en.json +30 -27
  110. package/src/index.ts +34 -34
  111. package/src/main.ts +11 -11
  112. package/src/plugins/vuetify.ts +131 -131
  113. package/src/shims-vue.d.ts +10 -10
  114. package/src/stories/Accordion.stories.ts +650 -650
  115. package/src/stories/Audio.stories.ts +28 -28
  116. package/src/stories/Button.stories.ts +263 -263
  117. package/src/stories/CheckBox.stories.ts +348 -348
  118. package/src/stories/DateInput.stories.ts +53 -53
  119. package/src/stories/Dialog.stories.ts +147 -147
  120. package/src/stories/EditField.stories.ts +78 -78
  121. package/src/stories/IconBullet/IconBullet.stories.ts +201 -201
  122. package/src/stories/IconBullet/IconBulletList.stories.ts +275 -275
  123. package/src/stories/Input.stories.ts +351 -351
  124. package/src/stories/Laboratory/Cards/AppointmentCard/AppointmentCard.stories.ts +260 -260
  125. package/src/stories/Laboratory/Cards/DocumentCard/DocumentCard.stories.ts +176 -176
  126. package/src/stories/Laboratory/Cards/DocumentCard/DocumentCardItem.stories.ts +119 -119
  127. package/src/stories/Laboratory/Cards/InfoCard/InfoCard.stories.ts +320 -320
  128. package/src/stories/Laboratory/Cards/TicketCard/TicketCard.stories.ts +335 -335
  129. package/src/stories/Laboratory/Chat/ChatBoxImage.stories.ts +82 -82
  130. package/src/stories/Laboratory/Chat/ChatMessage.stories.ts +198 -198
  131. package/src/stories/Laboratory/Chat/ChatMessageBadge.stories.ts +204 -204
  132. package/src/stories/Laboratory/Chat/ChatNotification.stories.ts +144 -144
  133. package/src/stories/Laboratory/Chat/ProgressLinear.stories.ts +186 -186
  134. package/src/stories/Laboratory/Chat/StatusNotification.stories.ts +111 -111
  135. package/src/stories/Laboratory/MainColumnsBar.stories.ts +48 -48
  136. package/src/stories/Laboratory/ProgressCircle.stories.ts +261 -261
  137. package/src/stories/Laboratory/SelectionColumnBar.stories.ts +234 -234
  138. package/src/stories/Laboratory/TagLabel.stories.ts +418 -418
  139. package/src/stories/Laboratory/TagLabelGroup.stories.ts +234 -234
  140. package/src/stories/Laboratory/Timeline.stories.ts +403 -403
  141. package/src/stories/NotificationBubble.stories.ts +194 -194
  142. package/src/stories/OtpInput.stories.ts +100 -100
  143. package/src/stories/PhoneInput.stories.ts +52 -52
  144. package/src/stories/Select.stories.ts +419 -419
  145. package/src/stories/TextArea.stories.ts +112 -112
  146. package/src/stories/TickBox.stories.ts +294 -294
  147. package/src/stories/v-icon.stories.ts +91 -91
  148. package/src/types/index.ts +1 -0
  149. package/src/utils/index.ts +100 -100
  150. package/src/vite-env.d.ts +1 -1
  151. package/tests/e2e/README.md +220 -220
  152. package/tests/e2e/accessibility.spec.ts +638 -638
  153. package/tests/e2e/accordion.spec.ts +42 -42
  154. package/tests/e2e/additional-components.spec.ts +437 -437
  155. package/tests/e2e/all-components.spec.ts +135 -135
  156. package/tests/e2e/appointment-card.spec.ts +816 -816
  157. package/tests/e2e/button-fixed.spec.ts +58 -58
  158. package/tests/e2e/button.spec.ts +76 -76
  159. package/tests/e2e/checkbox.spec.ts +50 -50
  160. package/tests/e2e/date-input.spec.ts +46 -46
  161. package/tests/e2e/debug.spec.ts +51 -51
  162. package/tests/e2e/dialog.spec.ts +58 -58
  163. package/tests/e2e/input.spec.ts +55 -55
  164. package/tests/e2e/laboratory-components.spec.ts +320 -320
  165. package/tests/e2e/otp-input.spec.ts +50 -50
  166. package/tests/e2e/select.spec.ts +52 -52
  167. package/tests/e2e/storybook-utils.ts +59 -59
  168. package/tests/e2e/test-basic.spec.ts +33 -33
  169. package/tests/e2e/visual-regression.spec.ts +350 -350
  170. package/tests/unit/components/Accordion/AccordionGroup.spec.ts.skip +342 -342
  171. package/tests/unit/components/Accordion/AccordionItem.spec.ts.skip +383 -383
  172. package/tests/unit/components/Appointment/Card/Actions.spec.ts +407 -407
  173. package/tests/unit/components/Appointment/Card/Card.spec.ts +485 -485
  174. package/tests/unit/components/Appointment/Card/Details.spec.ts +397 -397
  175. package/tests/unit/components/Audio/Audio.spec.ts +403 -403
  176. package/tests/unit/components/Audio/Waveform.spec.ts +483 -483
  177. package/tests/unit/components/Core/Button.spec.ts +336 -336
  178. package/tests/unit/components/Core/Checkbox.spec.ts +544 -544
  179. package/tests/unit/components/Core/DateInput.spec.ts +690 -690
  180. package/tests/unit/components/Core/Dialog.spec.ts +485 -485
  181. package/tests/unit/components/Core/EditField.spec.ts +782 -782
  182. package/tests/unit/components/Core/Input.spec.ts +512 -512
  183. package/tests/unit/components/Core/Modal.spec.ts +518 -518
  184. package/tests/unit/components/Core/NotificationBubble.spec.ts +606 -606
  185. package/tests/unit/components/Core/OtpInput.spec.ts +708 -708
  186. package/tests/unit/components/Core/PhoneInput.spec.ts +619 -619
  187. package/tests/unit/components/Core/Select.spec.ts +712 -712
  188. package/tests/unit/components/Core/TextArea.spec.ts +565 -565
  189. package/tests/unit/components/Core/TickBox.spec.ts +779 -779
  190. package/tests/unit/components/IconBullet/IconBullet.spec.ts +356 -356
  191. package/tests/unit/components/IconBullet/IconBulletList.spec.ts +371 -371
  192. package/tests/unit/components/Icons/Audio/CloudFailed.spec.ts +108 -108
  193. package/tests/unit/components/Icons/Audio/CloudSaved.spec.ts +149 -149
  194. package/tests/unit/components/Icons/Audio/Delete.spec.ts +158 -158
  195. package/tests/unit/components/Icons/Audio/Pause.spec.ts +208 -208
  196. package/tests/unit/components/Icons/Audio/Play.spec.ts +217 -217
  197. package/tests/unit/components/Icons/CalendarNotification.spec.ts +186 -186
  198. package/tests/unit/components/Icons/Chair.spec.ts +234 -234
  199. package/tests/unit/components/Icons/ChairNotification.spec.ts +311 -311
  200. package/tests/unit/components/Icons/Circle.spec.ts +255 -255
  201. package/tests/unit/components/Icons/FavIcon.spec.ts +251 -251
  202. package/tests/unit/components/Icons/FilledCircle.spec.ts +274 -274
  203. package/tests/unit/components/Icons/Group3.spec.ts +355 -355
  204. package/tests/unit/components/Icons/RingNotification.spec.ts +393 -393
  205. package/tests/unit/components/Icons/calendar.spec.ts +286 -286
  206. package/tests/unit/components/Icons/checkbox.spec.ts +315 -315
  207. package/tests/unit/components/Icons/outlineChecked.spec.ts +434 -434
  208. package/tests/unit/components/Icons/play.spec.ts +308 -308
  209. package/tests/unit/components/Laboratory/AppointmentCard.spec.ts +167 -167
  210. package/tests/unit/components/Laboratory/ChatBoxImage.spec.ts +179 -179
  211. package/tests/unit/components/Laboratory/ChatMessage.spec.ts +263 -263
  212. package/tests/unit/components/Laboratory/ChatMessageBadge.spec.ts +282 -282
  213. package/tests/unit/components/Laboratory/ChatNotification.spec.ts +256 -256
  214. package/tests/unit/components/Laboratory/DocumentCard.spec.ts +228 -228
  215. package/tests/unit/components/Laboratory/DocumentCardItem.spec.ts +236 -236
  216. package/tests/unit/components/Laboratory/InfoCard.spec.ts +308 -308
  217. package/tests/unit/components/Laboratory/MainColumnsBar.spec.ts +251 -251
  218. package/tests/unit/components/Laboratory/ProgressCircle.spec.ts +290 -290
  219. package/tests/unit/components/Laboratory/ProgressLinear.spec.ts +275 -275
  220. package/tests/unit/components/Laboratory/SelectionColumnBar.spec.ts +288 -288
  221. package/tests/unit/components/Laboratory/StatusNotification.spec.ts +296 -296
  222. package/tests/unit/components/Laboratory/TagLabel.spec.ts +353 -353
  223. package/tests/unit/components/Laboratory/TagLabelGroup.spec.ts +377 -377
  224. package/tests/unit/components/Laboratory/TicketCard.spec.ts +351 -351
  225. package/tests/unit/components/Laboratory/TimeLineEvent.spec.ts +381 -381
  226. package/tests/unit/components/Laboratory/Timeline.spec.ts +419 -419
  227. package/tests/unit/constants/iconEnums.spec.ts +39 -39
  228. package/tests/unit/i18n/i18n.spec.ts +88 -88
  229. package/tests/unit/plugins/vuetify.spec.ts +220 -220
  230. package/tests/unit/setup.ts +189 -189
  231. package/tests/unit/src/components/index.spec.ts.skip +192 -192
  232. package/tests/unit/src/index.spec.ts.skip +182 -182
  233. package/tests/unit/src/main.spec.ts +151 -151
  234. package/tsconfig.json +26 -26
  235. package/vite.config.ts +29 -29
  236. package/vitest.config.ts +83 -83
@@ -1,650 +1,650 @@
1
- import { Meta, StoryObj } from '@storybook/vue3';
2
- import AccordionGroup from '@components/Accordion/AccordionGroup.vue';
3
- import AccordionItem from '@components/Accordion/AccordionItem.vue';
4
- import AppointmentCard from '@components/Laboratory/AppointmentCard/AppointmentCard.vue';
5
- import DocumentCard from '@components/Laboratory/DocumentCard/DocumentCard.vue';
6
- import DocumentCardItem from '@components/Laboratory/DocumentCard/DocumentCardItem.vue';
7
- import { ref } from 'vue';
8
- import { action } from '@storybook/addon-actions';
9
-
10
- // Meta configuration for the Accordion components
11
- const meta: Meta<typeof AccordionGroup> = {
12
- title: 'WL/Accordion',
13
- component: AccordionGroup,
14
- tags: ['autodocs'],
15
- argTypes: {
16
- multiple: {
17
- control: 'boolean',
18
- description: 'Allows multiple panels to be open simultaneously.',
19
- },
20
- variant: {
21
- control: 'select',
22
- options: ['plain', 'outlined'],
23
- description:
24
- 'Determines the visual style of the accordion items. Options are "plain" or "outlined".',
25
- },
26
- variantGroup: {
27
- control: 'select',
28
- options: ['inset', 'popout'],
29
- description:
30
- 'Determines the style of the accordion group, allowing for "inset" or "popout".',
31
- },
32
- bgColor: {
33
- control: 'color',
34
- description: 'Sets the background color of each AccordionItem.',
35
- },
36
- },
37
- parameters: {
38
- docs: {
39
- description: {
40
- component: `
41
- The \`AccordionGroup\` component wraps multiple \`AccordionItem\` components, allowing for a collapsible panel layout. The \`AccordionGroup\` manages the state of which panels are open, and allows for single or multiple panels to be open at a time.
42
-
43
- ### AccordionGroup Props
44
- - **\`multiple\`**: Boolean to allow multiple panels to be open simultaneously.
45
- - **\`variantGroup\`**: Specifies the overall styling, either "inset" for embedded or "popout" for standout styling.
46
-
47
- ### AccordionItem Props
48
- - **\`title\`**: Specifies the header text. Default is "Default Title".
49
- - **\`text\`**: Specifies the content text within the panel. Default is "Default text".
50
- - **\`variant\`**: Sets the accordion item style (plain or outlined).
51
- - **\`value\`**: Unique identifier for the accordion item. Required when used inside an \`AccordionGroup\`.
52
- - **\`bgColor\`**: Sets the background color of the accordion item.
53
-
54
- ### Slots
55
- - **\`title\`**: A slot for custom title content in the header.
56
- - **\`content\`**: A slot for custom content within the accordion panel.
57
-
58
- ### Example Usage
59
- The following examples demonstrate how to use \`AccordionGroup\` and \`AccordionItem\` components, including custom content in the \`content\` slot and applying custom background colors.
60
- `,
61
- },
62
- },
63
- },
64
- };
65
-
66
- export default meta;
67
- type Story = StoryObj<typeof meta>;
68
-
69
- // Define the common template
70
- const Template: Story = {
71
- render: (args) => ({
72
- components: {
73
- AccordionGroup,
74
- AccordionItem,
75
- AppointmentCard,
76
- DocumentCard,
77
- DocumentCardItem,
78
- },
79
- setup() {
80
- const panel = ref([]);
81
- const downloadAction = action('download:all');
82
-
83
- function handleDownload() {
84
- downloadAction('Document downloaded');
85
- }
86
-
87
- return {
88
- args,
89
- panel,
90
- downloadAction,
91
- handleDownload,
92
- };
93
- },
94
- template: `
95
- <div :class="[args.variantGroup === 'inset' ? 'inset-style' : 'popout-style']">
96
- <AccordionGroup v-bind="args" v-model="panel">
97
- <!-- Content will be defined in individual stories -->
98
- </AccordionGroup>
99
- </div>
100
- `,
101
- }),
102
- };
103
-
104
- // Story: Outlined variant with inset style
105
- export const OutlinedInset: Story = {
106
- ...Template,
107
- args: {
108
- variant: 'outlined',
109
- variantGroup: 'inset',
110
- multiple: false,
111
- bgColor: '#f5f5f7', // Default background color
112
- },
113
- render: (args) => ({
114
- components: { AccordionGroup, AccordionItem },
115
- setup() {
116
- const panel = ref([]);
117
-
118
- return { args, panel };
119
- },
120
- template: `
121
- <div style="margin: 16px; padding: 16px; border-radius: 8px;">
122
- <AccordionGroup :multiple="args.multiple" :variant-group="args.variantGroup" v-model="panel">
123
- <AccordionItem
124
- title="What is the cost of a complete denture?"
125
- text="Sample text goes here..."
126
- value="panel1"
127
- :variant="args.variant"
128
- :bg-color="args.bgColor"
129
- />
130
- </AccordionGroup>
131
- </div>
132
- `,
133
- }),
134
- parameters: {
135
- docs: {
136
- source: {
137
- code: `
138
- <template>
139
- <div style="margin: 16px; padding: 16px; border-radius: 8px;">
140
- <AccordionGroup :multiple="false" variant-group="inset" v-model="panel">
141
- <AccordionItem
142
- title="What is the cost of a complete denture?"
143
- text="Sample text goes here..."
144
- value="panel1"
145
- variant="outlined"
146
- :bg-color="args.bgColor"
147
- />
148
- </AccordionGroup>
149
- </div>
150
- </template>
151
-
152
- <script setup>
153
- import { ref } from 'vue';
154
- import AccordionGroup from '@components/Accordion/AccordionGroup.vue';
155
- import AccordionItem from '@components/Accordion/AccordionItem.vue';
156
-
157
- const panel = ref([]);
158
- </script>
159
- `,
160
- },
161
- },
162
- },
163
- };
164
-
165
- // Story: Popout style with multiple accordions
166
- export const PopoutWithMultipleAccordions: Story = {
167
- ...Template,
168
- args: {
169
- variant: 'outlined',
170
- variantGroup: 'accordion',
171
- multiple: true,
172
- bgColor: '#f5f5f7', // Default background color
173
- },
174
- render: (args) => ({
175
- components: { AccordionGroup, AccordionItem },
176
- setup() {
177
- const panel = ref([]);
178
-
179
- function selectAll() {
180
- panel.value = ['panel1', 'panel2', 'panel3'];
181
- }
182
-
183
- function selectNone() {
184
- panel.value = [];
185
- }
186
-
187
- return { args, panel, selectAll, selectNone };
188
- },
189
- template: `
190
- <div>
191
- <div class="text-center d-flex pb-4">
192
- <v-btn class="ma-2" @click="selectAll">All</v-btn>
193
- <v-btn class="ma-2" @click="selectNone">None</v-btn>
194
- </div>
195
-
196
- <div class="pb-4">v-model: {{ panel }}</div>
197
-
198
- <AccordionGroup :multiple="args.multiple" :variant-group="args.variantGroup" v-model="panel">
199
- <AccordionItem
200
- title="Accordion Item 1"
201
- text="Content for Accordion Item 1."
202
- value="panel1"
203
- :variant="args.variant"
204
- :bg-color="args.bgColor"
205
- />
206
- <AccordionItem
207
- title="Accordion Item 2"
208
- text="Content for Accordion Item 2."
209
- value="panel2"
210
- :variant="args.variant"
211
- :bg-color="args.bgColor"
212
- />
213
- <AccordionItem
214
- title="Accordion Item 3"
215
- text="Content for Accordion Item 3."
216
- value="panel3"
217
- :variant="args.variant"
218
- :bg-color="args.bgColor"
219
- />
220
- </AccordionGroup>
221
- </div>
222
- `,
223
- }),
224
- parameters: {
225
- docs: {
226
- source: {
227
- code: `
228
- <template>
229
- <div>
230
- <div class="text-center d-flex pb-4">
231
- <v-btn class="ma-2" @click="selectAll">All</v-btn>
232
- <v-btn class="ma-2" @click="selectNone">None</v-btn>
233
- </div>
234
-
235
- <div class="pb-4">v-model: {{ panel }}</div>
236
-
237
- <AccordionGroup :multiple="true" variant-group="popout" v-model="panel">
238
- <AccordionItem
239
- title="Accordion Item 1"
240
- text="Content for Accordion Item 1."
241
- value="panel1"
242
- variant="outlined"
243
- :bg-color="args.bgColor"
244
- />
245
- <AccordionItem
246
- title="Accordion Item 2"
247
- text="Content for Accordion Item 2."
248
- value="panel2"
249
- variant="outlined"
250
- :bg-color="args.bgColor"
251
- />
252
- <AccordionItem
253
- title="Accordion Item 3"
254
- text="Content for Accordion Item 3."
255
- value="panel3"
256
- variant="outlined"
257
- :bg-color="args.bgColor"
258
- />
259
- </AccordionGroup>
260
- </div>
261
- </template>
262
-
263
- <script setup>
264
- import { ref } from 'vue';
265
- import AccordionGroup from '@components/Accordion/AccordionGroup.vue';
266
- import AccordionItem from '@components/Accordion/AccordionItem.vue';
267
-
268
- const panel = ref([]);
269
-
270
- function selectAll() {
271
- panel.value = ['panel1', 'panel2', 'panel3'];
272
- }
273
-
274
- function selectNone() {
275
- panel.value = [];
276
- }
277
- </script>
278
- `,
279
- },
280
- },
281
- },
282
- };
283
-
284
- // Story: Pre-Opened Accordion with Inset Style
285
- export const AccordionWithPreOpenedPanels: Story = {
286
- ...Template,
287
- args: {
288
- variant: 'outlined',
289
- variantGroup: 'accordion',
290
- multiple: true,
291
- bgColor: '#f5f5f7', // Default background color
292
- },
293
- render: (args) => ({
294
- components: { AccordionGroup, AccordionItem },
295
- setup() {
296
- const panel = ref(['panel1', 'panel3']); // Pre-open panels 1 and 3
297
-
298
- function selectAll() {
299
- panel.value = ['panel1', 'panel2', 'panel3'];
300
- }
301
-
302
- function selectNone() {
303
- panel.value = [];
304
- }
305
-
306
- return { args, panel, selectAll, selectNone };
307
- },
308
- template: `
309
- <div>
310
- <div class="text-center d-flex pb-4">
311
- <v-btn class="ma-2" @click="selectAll">All</v-btn>
312
- <v-btn class="ma-2" @click="selectNone">None</v-btn>
313
- </div>
314
-
315
- <div class="pb-4">v-model: {{ panel }}</div>
316
-
317
- <AccordionGroup :multiple="args.multiple" :variant-group="args.variantGroup" v-model="panel">
318
- <AccordionItem
319
- title="Accordion Item 1 (Pre-Opened)"
320
- text="Content for Accordion Item 1."
321
- value="panel1"
322
- :variant="args.variant"
323
- :bg-color="args.bgColor"
324
- />
325
- <AccordionItem
326
- title="Accordion Item 2"
327
- text="Content for Accordion Item 2."
328
- value="panel2"
329
- :variant="args.variant"
330
- :bg-color="args.bgColor"
331
- />
332
- <AccordionItem
333
- title="Accordion Item 3 (Pre-Opened)"
334
- text="Content for Accordion Item 3."
335
- value="panel3"
336
- :variant="args.variant"
337
- :bg-color="args.bgColor"
338
- />
339
- </AccordionGroup>
340
- </div>
341
- `,
342
- }),
343
- parameters: {
344
- docs: {
345
- source: {
346
- code: `
347
- <template>
348
- <div>
349
- <div class="text-center d-flex pb-4">
350
- <v-btn class="ma-2" @click="selectAll">All</v-btn>
351
- <v-btn class="ma-2" @click="selectNone">None</v-btn>
352
- </div>
353
-
354
- <div class="pb-4">v-model: {{ panel }}</div>
355
-
356
- <AccordionGroup :multiple="true" variant-group="inset" v-model="panel">
357
- <AccordionItem
358
- title="Accordion Item 1 (Pre-Opened)"
359
- text="Content for Accordion Item 1."
360
- value="panel1"
361
- variant="outlined"
362
- :bg-color="args.bgColor"
363
- />
364
- <AccordionItem
365
- title="Accordion Item 2"
366
- text="Content for Accordion Item 2."
367
- value="panel2"
368
- variant="outlined"
369
- :bg-color="args.bgColor"
370
- />
371
- <AccordionItem
372
- title="Accordion Item 3 (Pre-Opened)"
373
- text="Content for Accordion Item 3."
374
- value="panel3"
375
- variant="outlined"
376
- :bg-color="args.bgColor"
377
- />
378
- </AccordionGroup>
379
- </div>
380
- </template>
381
-
382
- <script setup>
383
- import { ref } from 'vue';
384
- import AccordionGroup from '@components/Accordion/AccordionGroup.vue';
385
- import AccordionItem from '@components/Accordion/AccordionItem.vue';
386
-
387
- const panel = ref(['panel1', 'panel3']);
388
-
389
- function selectAll() {
390
- panel.value = ['panel1', 'panel2', 'panel3'];
391
- }
392
-
393
- function selectNone() {
394
- panel.value = [];
395
- }
396
- </script>
397
- `,
398
- },
399
- },
400
- },
401
- };
402
-
403
- // Story: Accordion with Document Card
404
- export const AccordionWithDocumentCard: Story = {
405
- ...Template,
406
- args: {
407
- variant: 'plain',
408
- multiple: false,
409
- bgColor: '#f5f5f7', // Default background color
410
- },
411
- render: (args) => ({
412
- components: {
413
- AccordionGroup,
414
- AccordionItem,
415
- DocumentCard,
416
- DocumentCardItem,
417
- },
418
- setup() {
419
- const panel = ref([]);
420
- const downloadAction = action('download:all');
421
-
422
- function handleDownload() {
423
- downloadAction('Document downloaded');
424
- }
425
-
426
- return { args, panel, downloadAction, handleDownload };
427
- },
428
- template: `
429
- <div style="margin: 16px; padding: 16px; border-radius: 8px;">
430
- <AccordionGroup :multiple="args.multiple" v-model="panel">
431
- <AccordionItem value="panel1" :variant="args.variant" :bg-color="args.bgColor">
432
- <template #title>
433
- <h3>Document Card</h3>
434
- </template>
435
- <template #content>
436
- <DocumentCard title="Attachments" @download:all="downloadAction">
437
- <DocumentCardItem
438
- header="06.09.2024 Rainer Zufall, Lzp. 45 Mandibular"
439
- subheader="Uploaded 06.09.24 09:43"
440
- icon="mdi-download"
441
- @click:icon="handleDownload"
442
- />
443
- <DocumentCardItem
444
- header="07.09.2024 Anna Musterfrau, Lzp. 23 Maxillary"
445
- subheader="Uploaded 07.09.24 10:15"
446
- icon="mdi-file"
447
- @click:icon="handleDownload"
448
- />
449
- <DocumentCardItem
450
- header="08.09.2024 John Doe, Lzp. 33 Mandibular"
451
- subheader="Uploaded 08.09.24 11:30"
452
- icon="mdi-file-document"
453
- @click:icon="handleDownload"
454
- />
455
- </DocumentCard>
456
- </template>
457
- </AccordionItem>
458
- </AccordionGroup>
459
- </div>
460
- `,
461
- }),
462
- parameters: {
463
- docs: {
464
- source: {
465
- code: `
466
- <template>
467
- <div style="margin: 16px; padding: 16px; border-radius: 8px;">
468
- <AccordionGroup :multiple="false" v-model="panel">
469
- <AccordionItem value="panel1" variant="plain" :bg-color="args.bgColor">
470
- <template #title>
471
- <h3>Document Card</h3>
472
- </template>
473
- <template #content>
474
- <DocumentCard title="Attachments" @download:all="downloadAction">
475
- <DocumentCardItem
476
- header="06.09.2024 Rainer Zufall, Lzp. 45 Mandibular"
477
- subheader="Uploaded 06.09.24 09:43"
478
- icon="mdi-download"
479
- @click:icon="handleDownload"
480
- />
481
- <DocumentCardItem
482
- header="07.09.2024 Anna Musterfrau, Lzp. 23 Maxillary"
483
- subheader="Uploaded 07.09.24 10:15"
484
- icon="mdi-file"
485
- @click:icon="handleDownload"
486
- />
487
- <DocumentCardItem
488
- header="08.09.2024 John Doe, Lzp. 33 Mandibular"
489
- subheader="Uploaded 08.09.24 11:30"
490
- icon="mdi-file-document"
491
- @click:icon="handleDownload"
492
- />
493
- </DocumentCard>
494
- </template>
495
- </AccordionItem>
496
- </AccordionGroup>
497
- </div>
498
- </template>
499
-
500
- <script setup>
501
- import { ref } from 'vue';
502
- import AccordionGroup from '@components/Accordion/AccordionGroup.vue';
503
- import AccordionItem from '@components/Accordion/AccordionItem.vue';
504
- import DocumentCard from '@components/Laboratory/DocumentCard/DocumentCard.vue';
505
- import DocumentCardItem from '@components/Laboratory/DocumentCard/DocumentCardItem.vue';
506
-
507
- const panel = ref([]);
508
-
509
- function handleDownload() {
510
- // Download action logic
511
- }
512
- </script>
513
- `,
514
- },
515
- },
516
- },
517
- };
518
-
519
- // Story: Accordion with Slots
520
- export const AccordionWithSlots: Story = {
521
- ...Template,
522
- args: {
523
- variant: 'plain',
524
- multiple: false,
525
- bgColor: '#f5f5f7', // Default background color
526
- },
527
- render: (args) => ({
528
- components: { AccordionGroup, AccordionItem, AppointmentCard },
529
- setup() {
530
- const panel = ref([]);
531
-
532
- return { args, panel };
533
- },
534
- template: `
535
- <div style="margin: 16px; padding: 16px; border-radius: 8px;">
536
- <AccordionGroup :multiple="args.multiple" v-model="panel">
537
- <AccordionItem value="panel1" :variant="args.variant" :bg-color="args.bgColor">
538
- <template #title>
539
- <h3>Custom Title via Slot</h3>
540
- </template>
541
- <template #content>
542
- <AppointmentCard
543
- date="18.05.2024"
544
- status="Done"
545
- treatment-name="Checkup"
546
- dentist-name="Dr. Jane Smith"
547
- />
548
- </template>
549
- </AccordionItem>
550
- </AccordionGroup>
551
- </div>
552
- `,
553
- }),
554
- parameters: {
555
- docs: {
556
- source: {
557
- code: `
558
- <template>
559
- <div style="margin: 16px; padding: 16px; border-radius: 8px;">
560
- <AccordionGroup :multiple="false" v-model="panel">
561
- <AccordionItem value="panel1" variant="plain" :bg-color="args.bgColor">
562
- <template #title>
563
- <h3>Custom Title via Slot</h3>
564
- </template>
565
- <template #content>
566
- <AppointmentCard
567
- date="18.05.2024"
568
- status="Done"
569
- treatment-name="Checkup"
570
- dentist-name="Dr. Jane Smith"
571
- />
572
- </template>
573
- </AccordionItem>
574
- </AccordionGroup>
575
- </div>
576
- </template>
577
-
578
- <script setup>
579
- import { ref } from 'vue';
580
- import AccordionGroup from '@components/Accordion/AccordionGroup.vue';
581
- import AccordionItem from '@components/Accordion/AccordionItem.vue';
582
- import AppointmentCard from '@components/Laboratory/AppointmentCard/AppointmentCard.vue';
583
-
584
- const panel = ref([]);
585
- </script>
586
- `,
587
- },
588
- },
589
- },
590
- };
591
-
592
- // Story: Accordion with Custom Colors (Optional - Additional Story)
593
- export const AccordionWithCustomColors: Story = {
594
- args: {
595
- variant: 'outlined',
596
- variantGroup: 'accordion',
597
- multiple: false,
598
- bgColor: 'blue', // Default background color
599
- },
600
- render: (args) => ({
601
- components: { AccordionGroup, AccordionItem },
602
- setup() {
603
- const panel = ref([]);
604
-
605
- return { args, panel };
606
- },
607
- template: `
608
- <div :style="{ padding: '16px', borderRadius: '8px' }">
609
- <AccordionGroup :multiple="args.multiple" :variant-group="args.variantGroup" v-model="panel">
610
- <AccordionItem
611
- title="Custom Colored Accordion"
612
- text="This accordion item has a customizable background color."
613
- value="panel1"
614
- :variant="args.variant"
615
- :bg-color="args.bgColor"
616
- />
617
- </AccordionGroup>
618
- </div>
619
- `,
620
- }),
621
- parameters: {
622
- docs: {
623
- source: {
624
- code: `
625
- <template>
626
- <div :style="{ padding: '16px', borderRadius: '8px' }">
627
- <AccordionGroup :multiple="false" variant-group="inset" v-model="panel">
628
- <AccordionItem
629
- title="Custom Colored Accordion"
630
- text="This accordion item has a customizable background color."
631
- value="panel1"
632
- variant="outlined"
633
- :bg-color="args.bgColor"
634
- />
635
- </AccordionGroup>
636
- </div>
637
- </template>
638
-
639
- <script setup>
640
- import { ref } from 'vue';
641
- import AccordionGroup from '@components/Accordion/AccordionGroup.vue';
642
- import AccordionItem from '@components/Accordion/AccordionItem.vue';
643
-
644
- const panel = ref([]);
645
- </script>
646
- `,
647
- },
648
- },
649
- },
650
- };
1
+ import { Meta, StoryObj } from '@storybook/vue3';
2
+ import AccordionGroup from '@components/Accordion/AccordionGroup.vue';
3
+ import AccordionItem from '@components/Accordion/AccordionItem.vue';
4
+ import AppointmentCard from '@components/Laboratory/AppointmentCard/AppointmentCard.vue';
5
+ import DocumentCard from '@components/Laboratory/DocumentCard/DocumentCard.vue';
6
+ import DocumentCardItem from '@components/Laboratory/DocumentCard/DocumentCardItem.vue';
7
+ import { ref } from 'vue';
8
+ import { action } from '@storybook/addon-actions';
9
+
10
+ // Meta configuration for the Accordion components
11
+ const meta: Meta<typeof AccordionGroup> = {
12
+ title: 'WL/Accordion',
13
+ component: AccordionGroup,
14
+ tags: ['autodocs'],
15
+ argTypes: {
16
+ multiple: {
17
+ control: 'boolean',
18
+ description: 'Allows multiple panels to be open simultaneously.',
19
+ },
20
+ variant: {
21
+ control: 'select',
22
+ options: ['plain', 'outlined'],
23
+ description:
24
+ 'Determines the visual style of the accordion items. Options are "plain" or "outlined".',
25
+ },
26
+ variantGroup: {
27
+ control: 'select',
28
+ options: ['inset', 'popout'],
29
+ description:
30
+ 'Determines the style of the accordion group, allowing for "inset" or "popout".',
31
+ },
32
+ bgColor: {
33
+ control: 'color',
34
+ description: 'Sets the background color of each AccordionItem.',
35
+ },
36
+ },
37
+ parameters: {
38
+ docs: {
39
+ description: {
40
+ component: `
41
+ The \`AccordionGroup\` component wraps multiple \`AccordionItem\` components, allowing for a collapsible panel layout. The \`AccordionGroup\` manages the state of which panels are open, and allows for single or multiple panels to be open at a time.
42
+
43
+ ### AccordionGroup Props
44
+ - **\`multiple\`**: Boolean to allow multiple panels to be open simultaneously.
45
+ - **\`variantGroup\`**: Specifies the overall styling, either "inset" for embedded or "popout" for standout styling.
46
+
47
+ ### AccordionItem Props
48
+ - **\`title\`**: Specifies the header text. Default is "Default Title".
49
+ - **\`text\`**: Specifies the content text within the panel. Default is "Default text".
50
+ - **\`variant\`**: Sets the accordion item style (plain or outlined).
51
+ - **\`value\`**: Unique identifier for the accordion item. Required when used inside an \`AccordionGroup\`.
52
+ - **\`bgColor\`**: Sets the background color of the accordion item.
53
+
54
+ ### Slots
55
+ - **\`title\`**: A slot for custom title content in the header.
56
+ - **\`content\`**: A slot for custom content within the accordion panel.
57
+
58
+ ### Example Usage
59
+ The following examples demonstrate how to use \`AccordionGroup\` and \`AccordionItem\` components, including custom content in the \`content\` slot and applying custom background colors.
60
+ `,
61
+ },
62
+ },
63
+ },
64
+ };
65
+
66
+ export default meta;
67
+ type Story = StoryObj<typeof meta>;
68
+
69
+ // Define the common template
70
+ const Template: Story = {
71
+ render: (args) => ({
72
+ components: {
73
+ AccordionGroup,
74
+ AccordionItem,
75
+ AppointmentCard,
76
+ DocumentCard,
77
+ DocumentCardItem,
78
+ },
79
+ setup() {
80
+ const panel = ref([]);
81
+ const downloadAction = action('download:all');
82
+
83
+ function handleDownload() {
84
+ downloadAction('Document downloaded');
85
+ }
86
+
87
+ return {
88
+ args,
89
+ panel,
90
+ downloadAction,
91
+ handleDownload,
92
+ };
93
+ },
94
+ template: `
95
+ <div :class="[args.variantGroup === 'inset' ? 'inset-style' : 'popout-style']">
96
+ <AccordionGroup v-bind="args" v-model="panel">
97
+ <!-- Content will be defined in individual stories -->
98
+ </AccordionGroup>
99
+ </div>
100
+ `,
101
+ }),
102
+ };
103
+
104
+ // Story: Outlined variant with inset style
105
+ export const OutlinedInset: Story = {
106
+ ...Template,
107
+ args: {
108
+ variant: 'outlined',
109
+ variantGroup: 'inset',
110
+ multiple: false,
111
+ bgColor: '#f5f5f7', // Default background color
112
+ },
113
+ render: (args) => ({
114
+ components: { AccordionGroup, AccordionItem },
115
+ setup() {
116
+ const panel = ref([]);
117
+
118
+ return { args, panel };
119
+ },
120
+ template: `
121
+ <div style="margin: 16px; padding: 16px; border-radius: 8px;">
122
+ <AccordionGroup :multiple="args.multiple" :variant-group="args.variantGroup" v-model="panel">
123
+ <AccordionItem
124
+ title="What is the cost of a complete denture?"
125
+ text="Sample text goes here..."
126
+ value="panel1"
127
+ :variant="args.variant"
128
+ :bg-color="args.bgColor"
129
+ />
130
+ </AccordionGroup>
131
+ </div>
132
+ `,
133
+ }),
134
+ parameters: {
135
+ docs: {
136
+ source: {
137
+ code: `
138
+ <template>
139
+ <div style="margin: 16px; padding: 16px; border-radius: 8px;">
140
+ <AccordionGroup :multiple="false" variant-group="inset" v-model="panel">
141
+ <AccordionItem
142
+ title="What is the cost of a complete denture?"
143
+ text="Sample text goes here..."
144
+ value="panel1"
145
+ variant="outlined"
146
+ :bg-color="args.bgColor"
147
+ />
148
+ </AccordionGroup>
149
+ </div>
150
+ </template>
151
+
152
+ <script setup>
153
+ import { ref } from 'vue';
154
+ import AccordionGroup from '@components/Accordion/AccordionGroup.vue';
155
+ import AccordionItem from '@components/Accordion/AccordionItem.vue';
156
+
157
+ const panel = ref([]);
158
+ </script>
159
+ `,
160
+ },
161
+ },
162
+ },
163
+ };
164
+
165
+ // Story: Popout style with multiple accordions
166
+ export const PopoutWithMultipleAccordions: Story = {
167
+ ...Template,
168
+ args: {
169
+ variant: 'outlined',
170
+ variantGroup: 'accordion',
171
+ multiple: true,
172
+ bgColor: '#f5f5f7', // Default background color
173
+ },
174
+ render: (args) => ({
175
+ components: { AccordionGroup, AccordionItem },
176
+ setup() {
177
+ const panel = ref([]);
178
+
179
+ function selectAll() {
180
+ panel.value = ['panel1', 'panel2', 'panel3'];
181
+ }
182
+
183
+ function selectNone() {
184
+ panel.value = [];
185
+ }
186
+
187
+ return { args, panel, selectAll, selectNone };
188
+ },
189
+ template: `
190
+ <div>
191
+ <div class="text-center d-flex pb-4">
192
+ <v-btn class="ma-2" @click="selectAll">All</v-btn>
193
+ <v-btn class="ma-2" @click="selectNone">None</v-btn>
194
+ </div>
195
+
196
+ <div class="pb-4">v-model: {{ panel }}</div>
197
+
198
+ <AccordionGroup :multiple="args.multiple" :variant-group="args.variantGroup" v-model="panel">
199
+ <AccordionItem
200
+ title="Accordion Item 1"
201
+ text="Content for Accordion Item 1."
202
+ value="panel1"
203
+ :variant="args.variant"
204
+ :bg-color="args.bgColor"
205
+ />
206
+ <AccordionItem
207
+ title="Accordion Item 2"
208
+ text="Content for Accordion Item 2."
209
+ value="panel2"
210
+ :variant="args.variant"
211
+ :bg-color="args.bgColor"
212
+ />
213
+ <AccordionItem
214
+ title="Accordion Item 3"
215
+ text="Content for Accordion Item 3."
216
+ value="panel3"
217
+ :variant="args.variant"
218
+ :bg-color="args.bgColor"
219
+ />
220
+ </AccordionGroup>
221
+ </div>
222
+ `,
223
+ }),
224
+ parameters: {
225
+ docs: {
226
+ source: {
227
+ code: `
228
+ <template>
229
+ <div>
230
+ <div class="text-center d-flex pb-4">
231
+ <v-btn class="ma-2" @click="selectAll">All</v-btn>
232
+ <v-btn class="ma-2" @click="selectNone">None</v-btn>
233
+ </div>
234
+
235
+ <div class="pb-4">v-model: {{ panel }}</div>
236
+
237
+ <AccordionGroup :multiple="true" variant-group="popout" v-model="panel">
238
+ <AccordionItem
239
+ title="Accordion Item 1"
240
+ text="Content for Accordion Item 1."
241
+ value="panel1"
242
+ variant="outlined"
243
+ :bg-color="args.bgColor"
244
+ />
245
+ <AccordionItem
246
+ title="Accordion Item 2"
247
+ text="Content for Accordion Item 2."
248
+ value="panel2"
249
+ variant="outlined"
250
+ :bg-color="args.bgColor"
251
+ />
252
+ <AccordionItem
253
+ title="Accordion Item 3"
254
+ text="Content for Accordion Item 3."
255
+ value="panel3"
256
+ variant="outlined"
257
+ :bg-color="args.bgColor"
258
+ />
259
+ </AccordionGroup>
260
+ </div>
261
+ </template>
262
+
263
+ <script setup>
264
+ import { ref } from 'vue';
265
+ import AccordionGroup from '@components/Accordion/AccordionGroup.vue';
266
+ import AccordionItem from '@components/Accordion/AccordionItem.vue';
267
+
268
+ const panel = ref([]);
269
+
270
+ function selectAll() {
271
+ panel.value = ['panel1', 'panel2', 'panel3'];
272
+ }
273
+
274
+ function selectNone() {
275
+ panel.value = [];
276
+ }
277
+ </script>
278
+ `,
279
+ },
280
+ },
281
+ },
282
+ };
283
+
284
+ // Story: Pre-Opened Accordion with Inset Style
285
+ export const AccordionWithPreOpenedPanels: Story = {
286
+ ...Template,
287
+ args: {
288
+ variant: 'outlined',
289
+ variantGroup: 'accordion',
290
+ multiple: true,
291
+ bgColor: '#f5f5f7', // Default background color
292
+ },
293
+ render: (args) => ({
294
+ components: { AccordionGroup, AccordionItem },
295
+ setup() {
296
+ const panel = ref(['panel1', 'panel3']); // Pre-open panels 1 and 3
297
+
298
+ function selectAll() {
299
+ panel.value = ['panel1', 'panel2', 'panel3'];
300
+ }
301
+
302
+ function selectNone() {
303
+ panel.value = [];
304
+ }
305
+
306
+ return { args, panel, selectAll, selectNone };
307
+ },
308
+ template: `
309
+ <div>
310
+ <div class="text-center d-flex pb-4">
311
+ <v-btn class="ma-2" @click="selectAll">All</v-btn>
312
+ <v-btn class="ma-2" @click="selectNone">None</v-btn>
313
+ </div>
314
+
315
+ <div class="pb-4">v-model: {{ panel }}</div>
316
+
317
+ <AccordionGroup :multiple="args.multiple" :variant-group="args.variantGroup" v-model="panel">
318
+ <AccordionItem
319
+ title="Accordion Item 1 (Pre-Opened)"
320
+ text="Content for Accordion Item 1."
321
+ value="panel1"
322
+ :variant="args.variant"
323
+ :bg-color="args.bgColor"
324
+ />
325
+ <AccordionItem
326
+ title="Accordion Item 2"
327
+ text="Content for Accordion Item 2."
328
+ value="panel2"
329
+ :variant="args.variant"
330
+ :bg-color="args.bgColor"
331
+ />
332
+ <AccordionItem
333
+ title="Accordion Item 3 (Pre-Opened)"
334
+ text="Content for Accordion Item 3."
335
+ value="panel3"
336
+ :variant="args.variant"
337
+ :bg-color="args.bgColor"
338
+ />
339
+ </AccordionGroup>
340
+ </div>
341
+ `,
342
+ }),
343
+ parameters: {
344
+ docs: {
345
+ source: {
346
+ code: `
347
+ <template>
348
+ <div>
349
+ <div class="text-center d-flex pb-4">
350
+ <v-btn class="ma-2" @click="selectAll">All</v-btn>
351
+ <v-btn class="ma-2" @click="selectNone">None</v-btn>
352
+ </div>
353
+
354
+ <div class="pb-4">v-model: {{ panel }}</div>
355
+
356
+ <AccordionGroup :multiple="true" variant-group="inset" v-model="panel">
357
+ <AccordionItem
358
+ title="Accordion Item 1 (Pre-Opened)"
359
+ text="Content for Accordion Item 1."
360
+ value="panel1"
361
+ variant="outlined"
362
+ :bg-color="args.bgColor"
363
+ />
364
+ <AccordionItem
365
+ title="Accordion Item 2"
366
+ text="Content for Accordion Item 2."
367
+ value="panel2"
368
+ variant="outlined"
369
+ :bg-color="args.bgColor"
370
+ />
371
+ <AccordionItem
372
+ title="Accordion Item 3 (Pre-Opened)"
373
+ text="Content for Accordion Item 3."
374
+ value="panel3"
375
+ variant="outlined"
376
+ :bg-color="args.bgColor"
377
+ />
378
+ </AccordionGroup>
379
+ </div>
380
+ </template>
381
+
382
+ <script setup>
383
+ import { ref } from 'vue';
384
+ import AccordionGroup from '@components/Accordion/AccordionGroup.vue';
385
+ import AccordionItem from '@components/Accordion/AccordionItem.vue';
386
+
387
+ const panel = ref(['panel1', 'panel3']);
388
+
389
+ function selectAll() {
390
+ panel.value = ['panel1', 'panel2', 'panel3'];
391
+ }
392
+
393
+ function selectNone() {
394
+ panel.value = [];
395
+ }
396
+ </script>
397
+ `,
398
+ },
399
+ },
400
+ },
401
+ };
402
+
403
+ // Story: Accordion with Document Card
404
+ export const AccordionWithDocumentCard: Story = {
405
+ ...Template,
406
+ args: {
407
+ variant: 'plain',
408
+ multiple: false,
409
+ bgColor: '#f5f5f7', // Default background color
410
+ },
411
+ render: (args) => ({
412
+ components: {
413
+ AccordionGroup,
414
+ AccordionItem,
415
+ DocumentCard,
416
+ DocumentCardItem,
417
+ },
418
+ setup() {
419
+ const panel = ref([]);
420
+ const downloadAction = action('download:all');
421
+
422
+ function handleDownload() {
423
+ downloadAction('Document downloaded');
424
+ }
425
+
426
+ return { args, panel, downloadAction, handleDownload };
427
+ },
428
+ template: `
429
+ <div style="margin: 16px; padding: 16px; border-radius: 8px;">
430
+ <AccordionGroup :multiple="args.multiple" v-model="panel">
431
+ <AccordionItem value="panel1" :variant="args.variant" :bg-color="args.bgColor">
432
+ <template #title>
433
+ <h3>Document Card</h3>
434
+ </template>
435
+ <template #content>
436
+ <DocumentCard title="Attachments" @download:all="downloadAction">
437
+ <DocumentCardItem
438
+ header="06.09.2024 Rainer Zufall, Lzp. 45 Mandibular"
439
+ subheader="Uploaded 06.09.24 09:43"
440
+ icon="mdi-download"
441
+ @click:icon="handleDownload"
442
+ />
443
+ <DocumentCardItem
444
+ header="07.09.2024 Anna Musterfrau, Lzp. 23 Maxillary"
445
+ subheader="Uploaded 07.09.24 10:15"
446
+ icon="mdi-file"
447
+ @click:icon="handleDownload"
448
+ />
449
+ <DocumentCardItem
450
+ header="08.09.2024 John Doe, Lzp. 33 Mandibular"
451
+ subheader="Uploaded 08.09.24 11:30"
452
+ icon="mdi-file-document"
453
+ @click:icon="handleDownload"
454
+ />
455
+ </DocumentCard>
456
+ </template>
457
+ </AccordionItem>
458
+ </AccordionGroup>
459
+ </div>
460
+ `,
461
+ }),
462
+ parameters: {
463
+ docs: {
464
+ source: {
465
+ code: `
466
+ <template>
467
+ <div style="margin: 16px; padding: 16px; border-radius: 8px;">
468
+ <AccordionGroup :multiple="false" v-model="panel">
469
+ <AccordionItem value="panel1" variant="plain" :bg-color="args.bgColor">
470
+ <template #title>
471
+ <h3>Document Card</h3>
472
+ </template>
473
+ <template #content>
474
+ <DocumentCard title="Attachments" @download:all="downloadAction">
475
+ <DocumentCardItem
476
+ header="06.09.2024 Rainer Zufall, Lzp. 45 Mandibular"
477
+ subheader="Uploaded 06.09.24 09:43"
478
+ icon="mdi-download"
479
+ @click:icon="handleDownload"
480
+ />
481
+ <DocumentCardItem
482
+ header="07.09.2024 Anna Musterfrau, Lzp. 23 Maxillary"
483
+ subheader="Uploaded 07.09.24 10:15"
484
+ icon="mdi-file"
485
+ @click:icon="handleDownload"
486
+ />
487
+ <DocumentCardItem
488
+ header="08.09.2024 John Doe, Lzp. 33 Mandibular"
489
+ subheader="Uploaded 08.09.24 11:30"
490
+ icon="mdi-file-document"
491
+ @click:icon="handleDownload"
492
+ />
493
+ </DocumentCard>
494
+ </template>
495
+ </AccordionItem>
496
+ </AccordionGroup>
497
+ </div>
498
+ </template>
499
+
500
+ <script setup>
501
+ import { ref } from 'vue';
502
+ import AccordionGroup from '@components/Accordion/AccordionGroup.vue';
503
+ import AccordionItem from '@components/Accordion/AccordionItem.vue';
504
+ import DocumentCard from '@components/Laboratory/DocumentCard/DocumentCard.vue';
505
+ import DocumentCardItem from '@components/Laboratory/DocumentCard/DocumentCardItem.vue';
506
+
507
+ const panel = ref([]);
508
+
509
+ function handleDownload() {
510
+ // Download action logic
511
+ }
512
+ </script>
513
+ `,
514
+ },
515
+ },
516
+ },
517
+ };
518
+
519
+ // Story: Accordion with Slots
520
+ export const AccordionWithSlots: Story = {
521
+ ...Template,
522
+ args: {
523
+ variant: 'plain',
524
+ multiple: false,
525
+ bgColor: '#f5f5f7', // Default background color
526
+ },
527
+ render: (args) => ({
528
+ components: { AccordionGroup, AccordionItem, AppointmentCard },
529
+ setup() {
530
+ const panel = ref([]);
531
+
532
+ return { args, panel };
533
+ },
534
+ template: `
535
+ <div style="margin: 16px; padding: 16px; border-radius: 8px;">
536
+ <AccordionGroup :multiple="args.multiple" v-model="panel">
537
+ <AccordionItem value="panel1" :variant="args.variant" :bg-color="args.bgColor">
538
+ <template #title>
539
+ <h3>Custom Title via Slot</h3>
540
+ </template>
541
+ <template #content>
542
+ <AppointmentCard
543
+ date="18.05.2024"
544
+ status="Done"
545
+ treatment-name="Checkup"
546
+ dentist-name="Dr. Jane Smith"
547
+ />
548
+ </template>
549
+ </AccordionItem>
550
+ </AccordionGroup>
551
+ </div>
552
+ `,
553
+ }),
554
+ parameters: {
555
+ docs: {
556
+ source: {
557
+ code: `
558
+ <template>
559
+ <div style="margin: 16px; padding: 16px; border-radius: 8px;">
560
+ <AccordionGroup :multiple="false" v-model="panel">
561
+ <AccordionItem value="panel1" variant="plain" :bg-color="args.bgColor">
562
+ <template #title>
563
+ <h3>Custom Title via Slot</h3>
564
+ </template>
565
+ <template #content>
566
+ <AppointmentCard
567
+ date="18.05.2024"
568
+ status="Done"
569
+ treatment-name="Checkup"
570
+ dentist-name="Dr. Jane Smith"
571
+ />
572
+ </template>
573
+ </AccordionItem>
574
+ </AccordionGroup>
575
+ </div>
576
+ </template>
577
+
578
+ <script setup>
579
+ import { ref } from 'vue';
580
+ import AccordionGroup from '@components/Accordion/AccordionGroup.vue';
581
+ import AccordionItem from '@components/Accordion/AccordionItem.vue';
582
+ import AppointmentCard from '@components/Laboratory/AppointmentCard/AppointmentCard.vue';
583
+
584
+ const panel = ref([]);
585
+ </script>
586
+ `,
587
+ },
588
+ },
589
+ },
590
+ };
591
+
592
+ // Story: Accordion with Custom Colors (Optional - Additional Story)
593
+ export const AccordionWithCustomColors: Story = {
594
+ args: {
595
+ variant: 'outlined',
596
+ variantGroup: 'accordion',
597
+ multiple: false,
598
+ bgColor: 'blue', // Default background color
599
+ },
600
+ render: (args) => ({
601
+ components: { AccordionGroup, AccordionItem },
602
+ setup() {
603
+ const panel = ref([]);
604
+
605
+ return { args, panel };
606
+ },
607
+ template: `
608
+ <div :style="{ padding: '16px', borderRadius: '8px' }">
609
+ <AccordionGroup :multiple="args.multiple" :variant-group="args.variantGroup" v-model="panel">
610
+ <AccordionItem
611
+ title="Custom Colored Accordion"
612
+ text="This accordion item has a customizable background color."
613
+ value="panel1"
614
+ :variant="args.variant"
615
+ :bg-color="args.bgColor"
616
+ />
617
+ </AccordionGroup>
618
+ </div>
619
+ `,
620
+ }),
621
+ parameters: {
622
+ docs: {
623
+ source: {
624
+ code: `
625
+ <template>
626
+ <div :style="{ padding: '16px', borderRadius: '8px' }">
627
+ <AccordionGroup :multiple="false" variant-group="inset" v-model="panel">
628
+ <AccordionItem
629
+ title="Custom Colored Accordion"
630
+ text="This accordion item has a customizable background color."
631
+ value="panel1"
632
+ variant="outlined"
633
+ :bg-color="args.bgColor"
634
+ />
635
+ </AccordionGroup>
636
+ </div>
637
+ </template>
638
+
639
+ <script setup>
640
+ import { ref } from 'vue';
641
+ import AccordionGroup from '@components/Accordion/AccordionGroup.vue';
642
+ import AccordionItem from '@components/Accordion/AccordionItem.vue';
643
+
644
+ const panel = ref([]);
645
+ </script>
646
+ `,
647
+ },
648
+ },
649
+ },
650
+ };