@zap-wunschlachen/wl-shared-components 1.0.24 → 1.0.26

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 (246) 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 +34 -176
  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 +107 -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 +54 -54
  24. package/src/components/Appointment/Card/Actions.vue +99 -99
  25. package/src/components/Appointment/Card/AnamneseNotification.css +15 -15
  26. package/src/components/Appointment/Card/AnamneseNotification.vue +23 -23
  27. package/src/components/Appointment/Card/Card.css +80 -80
  28. package/src/components/Appointment/Card/Card.vue +93 -93
  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/Background/Background.css +39 -0
  34. package/src/components/Background/Background.vue +19 -0
  35. package/src/components/Background/WhiteCocoonBackground.vue +9 -0
  36. package/src/components/Background/WunschlachenBackground.vue +11 -0
  37. package/src/components/Button/Button.vue +119 -119
  38. package/src/components/CheckBox/CheckBox.css +185 -185
  39. package/src/components/CheckBox/Checkbox.vue +130 -130
  40. package/src/components/DateInput/DateInput.css +2 -2
  41. package/src/components/DateInput/DateInput.vue +262 -262
  42. package/src/components/Dialog/Dialog.css +6 -6
  43. package/src/components/Dialog/Dialog.vue +29 -29
  44. package/src/components/EditField/EditField.css +19 -19
  45. package/src/components/EditField/EditField.vue +202 -202
  46. package/src/components/ErrorPage/ErrorPage.css +124 -0
  47. package/src/components/ErrorPage/ErrorPage.vue +45 -0
  48. package/src/components/ErrorPage/ErrorPageLogo.vue +26 -0
  49. package/src/components/IconBullet/IconBullet.vue +86 -86
  50. package/src/components/IconBullet/IconBulletList.vue +41 -41
  51. package/src/components/Icons/AdvanceAppointments.vue +153 -153
  52. package/src/components/Icons/Audio/CloudFailed.vue +20 -20
  53. package/src/components/Icons/Audio/CloudSaved.vue +21 -21
  54. package/src/components/Icons/Audio/Delete.vue +15 -15
  55. package/src/components/Icons/Audio/Pause.vue +18 -18
  56. package/src/components/Icons/Audio/Play.vue +15 -15
  57. package/src/components/Icons/CalendarNotification.vue +126 -126
  58. package/src/components/Icons/Chair.vue +32 -32
  59. package/src/components/Icons/ChairNotification.vue +35 -35
  60. package/src/components/Icons/Circle.vue +66 -66
  61. package/src/components/Icons/FavIcon.vue +22 -22
  62. package/src/components/Icons/FilledCircle.vue +11 -11
  63. package/src/components/Icons/Group3.vue +46 -46
  64. package/src/components/Icons/Logo.vue +108 -0
  65. package/src/components/Icons/RingNotification.vue +54 -54
  66. package/src/components/Icons/SolidArrowRight.vue +14 -14
  67. package/src/components/Icons/calendar.vue +17 -17
  68. package/src/components/Icons/checkbox.vue +19 -19
  69. package/src/components/Icons/outlineChecked.vue +27 -27
  70. package/src/components/Icons/play.vue +5 -5
  71. package/src/components/Input/Input.css +187 -187
  72. package/src/components/Input/Input.vue +247 -247
  73. package/src/components/Laboratory/AppointmentCard/AppointmentCard.css +7 -7
  74. package/src/components/Laboratory/AppointmentCard/AppointmentCard.vue +116 -116
  75. package/src/components/Laboratory/ChatBoxImage/ChatBoxImage.vue +81 -81
  76. package/src/components/Laboratory/ChatMessage/ChatMessage.vue +113 -113
  77. package/src/components/Laboratory/ChatMessage/ChatMessageBadge.css +4 -4
  78. package/src/components/Laboratory/ChatMessage/ChatMessageBadge.vue +99 -99
  79. package/src/components/Laboratory/ChatNotification/ChatNotification.vue +130 -130
  80. package/src/components/Laboratory/DocumentCard/DocumentCard.css +3 -3
  81. package/src/components/Laboratory/DocumentCard/DocumentCard.vue +50 -50
  82. package/src/components/Laboratory/DocumentCard/DocumentCardItem.vue +53 -53
  83. package/src/components/Laboratory/InfoCard/InfoCard.vue +162 -162
  84. package/src/components/Laboratory/MainColumnsBar/MainColumnsBar.vue +102 -102
  85. package/src/components/Laboratory/ProgressCircle/ProgressCircle.vue +152 -152
  86. package/src/components/Laboratory/ProgressLinear/ProgressLinear.css +33 -33
  87. package/src/components/Laboratory/ProgressLinear/ProgressLinear.vue +75 -75
  88. package/src/components/Laboratory/SelectionColumnBar/SelectionColumnBar.vue +92 -92
  89. package/src/components/Laboratory/StatusNotification/StatusNotification.vue +49 -49
  90. package/src/components/Laboratory/TagLabel/TagLabel.vue +126 -126
  91. package/src/components/Laboratory/TagLabelGroup/TagLabelGroup.vue +97 -97
  92. package/src/components/Laboratory/TicketCard/TicketCard.css +3 -3
  93. package/src/components/Laboratory/TicketCard/TicketCard.vue +143 -143
  94. package/src/components/Laboratory/TimeLine/TimeLineEvent.css +18 -18
  95. package/src/components/Laboratory/TimeLine/TimeLineEvent.vue +119 -119
  96. package/src/components/Laboratory/TimeLine/Timeline.css +4 -4
  97. package/src/components/Laboratory/TimeLine/Timeline.vue +30 -30
  98. package/src/components/Loader/Loader.css +51 -51
  99. package/src/components/MaintenanceBanner/MaintenanceBanner.css +289 -0
  100. package/src/components/MaintenanceBanner/MaintenanceBanner.vue +127 -0
  101. package/src/components/MaintenanceBanner/MaintenanceIllustration.vue +54 -0
  102. package/src/components/Modal/Modal.css +5 -5
  103. package/src/components/Modal/Modal.vue +22 -22
  104. package/src/components/NotificationBubble/NotificationBubble.css +4 -4
  105. package/src/components/NotificationBubble/NotificationBubble.vue +90 -90
  106. package/src/components/OtpInput/OtpInput.css +39 -39
  107. package/src/components/OtpInput/OtpInput.vue +143 -143
  108. package/src/components/PhoneInput/PhoneInput.css +31 -31
  109. package/src/components/PhoneInput/PhoneInput.vue +113 -113
  110. package/src/components/Select/Select.css +150 -150
  111. package/src/components/Select/Select.vue +315 -304
  112. package/src/components/TextArea/TextArea.css +3 -3
  113. package/src/components/TextArea/TextArea.vue +126 -126
  114. package/src/components/TickBox/TickBox.css +49 -49
  115. package/src/components/TickBox/TickBox.vue +126 -126
  116. package/src/components/index.ts +26 -24
  117. package/src/constants/iconEnums.ts +3 -3
  118. package/src/i18n/i18n.ts +15 -15
  119. package/src/i18n/locales/de.json +30 -30
  120. package/src/i18n/locales/en.json +30 -30
  121. package/src/index.ts +34 -34
  122. package/src/main.ts +11 -11
  123. package/src/plugins/vuetify.ts +139 -131
  124. package/src/shims-vue.d.ts +10 -10
  125. package/src/stories/Accordion.stories.ts +650 -650
  126. package/src/stories/Audio.stories.ts +28 -28
  127. package/src/stories/Button.stories.ts +263 -263
  128. package/src/stories/CheckBox.stories.ts +348 -348
  129. package/src/stories/DateInput.stories.ts +53 -53
  130. package/src/stories/Dialog.stories.ts +147 -147
  131. package/src/stories/EditField.stories.ts +78 -78
  132. package/src/stories/IconBullet/IconBullet.stories.ts +201 -201
  133. package/src/stories/IconBullet/IconBulletList.stories.ts +275 -275
  134. package/src/stories/Input.stories.ts +351 -351
  135. package/src/stories/Laboratory/Cards/AppointmentCard/AppointmentCard.stories.ts +260 -260
  136. package/src/stories/Laboratory/Cards/DocumentCard/DocumentCard.stories.ts +176 -176
  137. package/src/stories/Laboratory/Cards/DocumentCard/DocumentCardItem.stories.ts +119 -119
  138. package/src/stories/Laboratory/Cards/InfoCard/InfoCard.stories.ts +320 -320
  139. package/src/stories/Laboratory/Cards/TicketCard/TicketCard.stories.ts +335 -335
  140. package/src/stories/Laboratory/Chat/ChatBoxImage.stories.ts +82 -82
  141. package/src/stories/Laboratory/Chat/ChatMessage.stories.ts +198 -198
  142. package/src/stories/Laboratory/Chat/ChatMessageBadge.stories.ts +204 -204
  143. package/src/stories/Laboratory/Chat/ChatNotification.stories.ts +144 -144
  144. package/src/stories/Laboratory/Chat/ProgressLinear.stories.ts +186 -186
  145. package/src/stories/Laboratory/Chat/StatusNotification.stories.ts +111 -111
  146. package/src/stories/Laboratory/MainColumnsBar.stories.ts +48 -48
  147. package/src/stories/Laboratory/ProgressCircle.stories.ts +261 -261
  148. package/src/stories/Laboratory/SelectionColumnBar.stories.ts +234 -234
  149. package/src/stories/Laboratory/TagLabel.stories.ts +418 -418
  150. package/src/stories/Laboratory/TagLabelGroup.stories.ts +234 -234
  151. package/src/stories/Laboratory/Timeline.stories.ts +403 -403
  152. package/src/stories/NotificationBubble.stories.ts +194 -194
  153. package/src/stories/OtpInput.stories.ts +100 -100
  154. package/src/stories/PhoneInput.stories.ts +52 -52
  155. package/src/stories/Select.stories.ts +419 -419
  156. package/src/stories/TextArea.stories.ts +112 -112
  157. package/src/stories/TickBox.stories.ts +294 -294
  158. package/src/stories/v-icon.stories.ts +91 -91
  159. package/src/utils/index.ts +106 -100
  160. package/src/vite-env.d.ts +1 -1
  161. package/tests/e2e/README.md +220 -220
  162. package/tests/e2e/accessibility.spec.ts +638 -638
  163. package/tests/e2e/accordion.spec.ts +42 -42
  164. package/tests/e2e/additional-components.spec.ts +437 -437
  165. package/tests/e2e/all-components.spec.ts +135 -135
  166. package/tests/e2e/appointment-card.spec.ts +816 -816
  167. package/tests/e2e/button-fixed.spec.ts +58 -58
  168. package/tests/e2e/button.spec.ts +76 -76
  169. package/tests/e2e/checkbox.spec.ts +50 -50
  170. package/tests/e2e/date-input.spec.ts +46 -46
  171. package/tests/e2e/debug.spec.ts +51 -51
  172. package/tests/e2e/dialog.spec.ts +58 -58
  173. package/tests/e2e/input.spec.ts +55 -55
  174. package/tests/e2e/laboratory-components.spec.ts +320 -320
  175. package/tests/e2e/otp-input.spec.ts +50 -50
  176. package/tests/e2e/select.spec.ts +52 -52
  177. package/tests/e2e/storybook-utils.ts +59 -59
  178. package/tests/e2e/test-basic.spec.ts +33 -33
  179. package/tests/e2e/visual-regression.spec.ts +350 -350
  180. package/tests/unit/components/Accordion/AccordionGroup.spec.ts.skip +342 -342
  181. package/tests/unit/components/Accordion/AccordionItem.spec.ts.skip +383 -383
  182. package/tests/unit/components/Appointment/Card/Actions.spec.ts +407 -407
  183. package/tests/unit/components/Appointment/Card/Card.spec.ts +485 -485
  184. package/tests/unit/components/Appointment/Card/Details.spec.ts +397 -397
  185. package/tests/unit/components/Audio/Audio.spec.ts +403 -403
  186. package/tests/unit/components/Audio/Waveform.spec.ts +483 -483
  187. package/tests/unit/components/Core/Button.spec.ts +336 -336
  188. package/tests/unit/components/Core/Checkbox.spec.ts +544 -544
  189. package/tests/unit/components/Core/DateInput.spec.ts +690 -690
  190. package/tests/unit/components/Core/Dialog.spec.ts +485 -485
  191. package/tests/unit/components/Core/EditField.spec.ts +782 -782
  192. package/tests/unit/components/Core/Input.spec.ts +512 -512
  193. package/tests/unit/components/Core/Modal.spec.ts +518 -518
  194. package/tests/unit/components/Core/NotificationBubble.spec.ts +606 -606
  195. package/tests/unit/components/Core/OtpInput.spec.ts +708 -708
  196. package/tests/unit/components/Core/PhoneInput.spec.ts +619 -619
  197. package/tests/unit/components/Core/Select.spec.ts +712 -712
  198. package/tests/unit/components/Core/TextArea.spec.ts +565 -565
  199. package/tests/unit/components/Core/TickBox.spec.ts +779 -779
  200. package/tests/unit/components/IconBullet/IconBullet.spec.ts +356 -356
  201. package/tests/unit/components/IconBullet/IconBulletList.spec.ts +371 -371
  202. package/tests/unit/components/Icons/Audio/CloudFailed.spec.ts +108 -108
  203. package/tests/unit/components/Icons/Audio/CloudSaved.spec.ts +149 -149
  204. package/tests/unit/components/Icons/Audio/Delete.spec.ts +158 -158
  205. package/tests/unit/components/Icons/Audio/Pause.spec.ts +208 -208
  206. package/tests/unit/components/Icons/Audio/Play.spec.ts +217 -217
  207. package/tests/unit/components/Icons/CalendarNotification.spec.ts +186 -186
  208. package/tests/unit/components/Icons/Chair.spec.ts +234 -234
  209. package/tests/unit/components/Icons/ChairNotification.spec.ts +311 -311
  210. package/tests/unit/components/Icons/Circle.spec.ts +255 -255
  211. package/tests/unit/components/Icons/FavIcon.spec.ts +251 -251
  212. package/tests/unit/components/Icons/FilledCircle.spec.ts +274 -274
  213. package/tests/unit/components/Icons/Group3.spec.ts +355 -355
  214. package/tests/unit/components/Icons/RingNotification.spec.ts +393 -393
  215. package/tests/unit/components/Icons/calendar.spec.ts +286 -286
  216. package/tests/unit/components/Icons/checkbox.spec.ts +315 -315
  217. package/tests/unit/components/Icons/outlineChecked.spec.ts +434 -434
  218. package/tests/unit/components/Icons/play.spec.ts +308 -308
  219. package/tests/unit/components/Laboratory/AppointmentCard.spec.ts +167 -167
  220. package/tests/unit/components/Laboratory/ChatBoxImage.spec.ts +179 -179
  221. package/tests/unit/components/Laboratory/ChatMessage.spec.ts +263 -263
  222. package/tests/unit/components/Laboratory/ChatMessageBadge.spec.ts +282 -282
  223. package/tests/unit/components/Laboratory/ChatNotification.spec.ts +256 -256
  224. package/tests/unit/components/Laboratory/DocumentCard.spec.ts +228 -228
  225. package/tests/unit/components/Laboratory/DocumentCardItem.spec.ts +236 -236
  226. package/tests/unit/components/Laboratory/InfoCard.spec.ts +308 -308
  227. package/tests/unit/components/Laboratory/MainColumnsBar.spec.ts +251 -251
  228. package/tests/unit/components/Laboratory/ProgressCircle.spec.ts +290 -290
  229. package/tests/unit/components/Laboratory/ProgressLinear.spec.ts +275 -275
  230. package/tests/unit/components/Laboratory/SelectionColumnBar.spec.ts +288 -288
  231. package/tests/unit/components/Laboratory/StatusNotification.spec.ts +296 -296
  232. package/tests/unit/components/Laboratory/TagLabel.spec.ts +353 -353
  233. package/tests/unit/components/Laboratory/TagLabelGroup.spec.ts +377 -377
  234. package/tests/unit/components/Laboratory/TicketCard.spec.ts +351 -351
  235. package/tests/unit/components/Laboratory/TimeLineEvent.spec.ts +381 -381
  236. package/tests/unit/components/Laboratory/Timeline.spec.ts +419 -419
  237. package/tests/unit/constants/iconEnums.spec.ts +39 -39
  238. package/tests/unit/i18n/i18n.spec.ts +88 -88
  239. package/tests/unit/plugins/vuetify.spec.ts +220 -220
  240. package/tests/unit/setup.ts +189 -189
  241. package/tests/unit/src/components/index.spec.ts.skip +192 -192
  242. package/tests/unit/src/index.spec.ts.skip +182 -182
  243. package/tests/unit/src/main.spec.ts +151 -151
  244. package/tsconfig.json +26 -26
  245. package/vite.config.ts +29 -29
  246. package/vitest.config.ts +83 -83
@@ -1,419 +1,419 @@
1
- import { Meta, StoryObj } from '@storybook/vue3';
2
- import Select from '../components/Select/Select.vue';
3
- import { action } from '@storybook/addon-actions';
4
- import { ref } from 'vue';
5
-
6
- const meta: Meta<typeof Select> = {
7
- title: 'WL/Select',
8
- component: Select,
9
- tags: ['autodocs'],
10
- argTypes: {
11
- clearable: { control: 'boolean' },
12
- label: { control: 'text' },
13
- chips: { control: 'boolean' },
14
- multiple: { control: 'boolean' },
15
- closableChips: { control: 'boolean' },
16
- items: { control: 'object' },
17
- returnObject: { control: 'boolean' },
18
- 'click:append': { action: 'click:append' },
19
- 'click:prepend': { action: 'click:prepend' },
20
- 'click:append-inner': { action: 'click:append-inner' },
21
- 'click:prepend-inner': { action: 'click:prepend-inner' },
22
- 'click:clear': { action: 'click:clear' },
23
- 'update:modelValue': { action: 'update:modelValue' },
24
- 'update:search': { action: 'update:search' },
25
- },
26
- args: {
27
- items: ['California', 'Colorado', 'Florida', 'Georgia', 'Texas', 'Wyoming'],
28
- label: 'Select a state',
29
- },
30
- parameters: {
31
- docs: {
32
- description: {
33
- component: `
34
- The \`Select\` component allows for a customizable dropdown menu with options for multiple selections, chips, clearable selections, and icons.
35
-
36
- ### Props
37
- - **\`clearable\`**: Allows the selection to be cleared.
38
- - **\`label\`**: Specifies the label for the select input.
39
- - **\`chips\`**: Displays selected items as chips within the input.
40
- - **\`multiple\`**: Enables selection of multiple items.
41
- - **\`closableChips\`**: Allows chips to be individually closed.
42
- - **\`items\`**: An array of items to display in the dropdown.
43
- - **\`returnObject\`**: Returns the entire item object instead of just the value.
44
-
45
- ### Slots
46
- - **\`prependIcon\`**: Adds an icon before the input.
47
- - **\`appendIcon\`**: Adds an icon after the input.
48
-
49
- ### Example Usage
50
- The following examples demonstrate various configurations, including single and multiple selections, clearable, and chips.
51
- `,
52
- },
53
- },
54
- },
55
- };
56
-
57
- export default meta;
58
- type Story = StoryObj<typeof meta>;
59
-
60
- const Template: Story = {
61
- render: (args) => ({
62
- components: { Select },
63
- setup() {
64
- const prependClick = action('click:prepend');
65
- const appendClick = action('click:append');
66
- const prependInnerClick = action('click:prepend-inner');
67
- const appendInnerClick = action('click:append-inner');
68
- const clearClick = action('click:clear');
69
- const updateModelValue = action('update:modelValue');
70
- const updateSearch = action('update:search');
71
-
72
- return {
73
- args,
74
- prependClick,
75
- appendClick,
76
- prependInnerClick,
77
- appendInnerClick,
78
- clearClick,
79
- updateModelValue,
80
- updateSearch,
81
- };
82
- },
83
- template: `
84
- <div style="padding: 16px;">
85
- <Select
86
- v-bind="args"
87
- @click:prepend="prependClick"
88
- @click:append="appendClick"
89
- @click:prepend-inner="prependInnerClick"
90
- @click:append-inner="appendInnerClick"
91
- @click:clear="clearClick"
92
- @update:modelValue="updateModelValue"
93
- @update:search="updateSearch"
94
- />
95
- </div>
96
- `,
97
- }),
98
- };
99
-
100
- // Default story without any additional props like chips or clearable
101
- export const Default: Story = {
102
- ...Template,
103
- args: {},
104
- parameters: {
105
- docs: {
106
- source: {
107
- code: `<Select :items="['California', 'Colorado', 'Florida', 'Georgia', 'Texas', 'Wyoming']" label="Select a state" />`,
108
- },
109
- },
110
- },
111
- };
112
-
113
- // Story with chips enabled and clearable set to true
114
- export const WithChips: Story = {
115
- ...Template,
116
- args: {
117
- chips: true,
118
- closableChips: true,
119
- },
120
- parameters: {
121
- docs: {
122
- source: {
123
- code: `<Select chips closableChips />`,
124
- },
125
- },
126
- },
127
- };
128
-
129
- // Story with prepend and append icons
130
- export const WithPrependAppendIcons: Story = {
131
- ...Template,
132
- args: {
133
- prependIcon: 'heroicons:calendar',
134
- appendIcon: 'heroicons:calendar',
135
- },
136
- parameters: {
137
- docs: {
138
- source: {
139
- code: `<Select prependIcon="heroicons:calendar" appendIcon="heroicons:calendar" />`,
140
- },
141
- },
142
- },
143
- };
144
-
145
- // Disabled state story
146
- export const Disabled: Story = {
147
- ...Template,
148
- args: { disabled: true },
149
- parameters: {
150
- docs: {
151
- source: {
152
- code: `<Select disabled />`,
153
- },
154
- },
155
- },
156
- };
157
-
158
- // Story with compact density
159
- export const CompactSelect: Story = {
160
- ...Template,
161
- args: { density: 'compact' },
162
- parameters: {
163
- docs: {
164
- source: {
165
- code: `<Select density="compact" />`,
166
- },
167
- },
168
- },
169
- };
170
-
171
- // Disabled state with icons
172
- export const DisabledWithIcons: Story = {
173
- ...Template,
174
- args: {
175
- disabled: true,
176
- prependIcon: 'heroicons:calendar',
177
- appendIcon: 'heroicons:calendar',
178
- appendInnerIcon: 'heroicons:calendar',
179
- prependInnerIcon: 'heroicons:calendar',
180
- },
181
- parameters: {
182
- docs: {
183
- source: {
184
- code: `<Select disabled prependIcon="heroicons:calendar" appendIcon="heroicons:calendar" />`,
185
- },
186
- },
187
- },
188
- };
189
-
190
- // Story with custom icons
191
- export const CustomIcons: Story = {
192
- ...Template,
193
- args: {
194
- prependIcon: 'heroicons:sparkles',
195
- appendIcon: 'heroicons:paper-airplane',
196
- },
197
- parameters: {
198
- docs: {
199
- source: {
200
- code: `<Select prependIcon="heroicons:sparkles" appendIcon="heroicons:paper-airplane" />`,
201
- },
202
- },
203
- },
204
- };
205
-
206
- // Without chips
207
- export const WithoutChips: Story = {
208
- ...Template,
209
- args: { chips: false },
210
- parameters: {
211
- docs: {
212
- source: {
213
- code: `<Select chips="false" />`,
214
- },
215
- },
216
- },
217
- };
218
-
219
- // Multiple selection with chips enabled
220
- export const MultipleWithChips: Story = {
221
- ...Template,
222
- args: {
223
- multiple: true,
224
- chips: true,
225
- closableChips: true,
226
- items: ['Apple', 'Banana', 'Cherry', 'Date', 'Elderberry'],
227
- },
228
- parameters: {
229
- docs: {
230
- source: {
231
- code: `<Select multiple chips closableChips :items="['Apple', 'Banana', 'Cherry', 'Date', 'Elderberry']" />`,
232
- },
233
- },
234
- },
235
- };
236
-
237
- // Closable chips story
238
- export const ClosableChips: Story = {
239
- ...Template,
240
- args: {
241
- chips: true,
242
- closableChips: true,
243
- items: ['Red', 'Blue', 'Green', 'Yellow', 'Purple'],
244
- },
245
- parameters: {
246
- docs: {
247
- source: {
248
- code: `<Select chips closableChips :items="['Red', 'Blue', 'Green', 'Yellow', 'Purple']" />`,
249
- },
250
- },
251
- },
252
- };
253
-
254
- // Menu and clear icons
255
- export const WithMenuAndClearIcons: Story = {
256
- ...Template,
257
- args: {
258
- menuIcon: 'heroicons:menu',
259
- clearIcon: 'heroicons:x-circle',
260
- },
261
- parameters: {
262
- docs: {
263
- source: {
264
- code: `<Select menuIcon="heroicons:menu" clearIcon="heroicons:x-circle" />`,
265
- },
266
- },
267
- },
268
- };
269
-
270
- // Clearable and multiple disabled
271
- export const ClearableAndMultiple: Story = {
272
- ...Template,
273
- args: {
274
- clearable: false,
275
- multiple: false,
276
- },
277
- parameters: {
278
- docs: {
279
- source: {
280
- code: `<Select clearable="false" multiple="false" />`,
281
- },
282
- },
283
- },
284
- };
285
-
286
- // Preselected values with returnObject variations
287
- export const PreselectedValues: Story = {
288
- render: (args) => ({
289
- components: { Select },
290
- setup() {
291
- const items = [
292
- { title: 'California', value: 'CA' },
293
- { title: 'Colorado', value: 'CO' },
294
- { title: 'Florida', value: 'FL' },
295
- { title: 'Georgia', value: 'GA' },
296
- { title: 'Texas', value: 'TX' },
297
- { title: 'Wyoming', value: 'WY' },
298
- ];
299
-
300
- const selectedValueFalse = ref('CA'); // Single selection, returnObject: false
301
- const selectedObjectTrue = ref(items.find((item) => item.value === 'FL')); // Single selection, returnObject: true
302
- const selectedValuesFalse = ref(['CA', 'GA']); // Multiple selection, returnObject: false
303
- const selectedObjectsTrue = ref(
304
- items.filter((item) => ['TX', 'WY'].includes(item.value)),
305
- ); // Multiple selection, returnObject: true
306
-
307
- const updateModelValue = action('update:modelValue');
308
-
309
- return {
310
- args: { ...args, items, itemTitle: 'title', itemValue: 'value' },
311
- selectedValueFalse,
312
- selectedObjectTrue,
313
- selectedValuesFalse,
314
- selectedObjectsTrue,
315
- updateModelValue,
316
- };
317
- },
318
- template: `
319
- <div style="padding: 16px; display: flex; flex-direction: column; gap: 24px;">
320
- <!-- Single selection with returnObject: false -->
321
- <Select v-bind="args" :returnObject="false" :multiple="false" v-model="selectedValueFalse" @update:modelValue="updateModelValue" />
322
- <p>Selected Value (returnObject: false): {{ selectedValueFalse }}</p>
323
-
324
- <!-- Single selection with returnObject: true -->
325
- <Select v-bind="args" :returnObject="true" :multiple="false" v-model="selectedObjectTrue" @update:modelValue="updateModelValue" />
326
- <p>Selected Object (returnObject: true): {{ selectedObjectTrue }}</p>
327
-
328
- <!-- Multiple selection with returnObject: false -->
329
- <Select v-bind="args" :returnObject="false" :multiple="true" v-model="selectedValuesFalse" @update:modelValue="updateModelValue" />
330
- <p>Selected Values (multiple, returnObject: false): {{ selectedValuesFalse }}</p>
331
-
332
- <!-- Multiple selection with returnObject: true -->
333
- <Select v-bind="args" :returnObject="true" :multiple="true" v-model="selectedObjectsTrue" @update:modelValue="updateModelValue" />
334
- <p>Selected Objects (multiple, returnObject: true): {{ selectedObjectsTrue }}</p>
335
- </div>
336
- `,
337
- }),
338
- args: {},
339
- parameters: {
340
- docs: {
341
- source: {
342
- code: `
343
- <template>
344
- <Select
345
- :items="[
346
- { title: 'California', value: 'CA' },
347
- { title: 'Colorado', value: 'CO' },
348
- { title: 'Florida', value: 'FL' },
349
- { title: 'Georgia', value: 'GA' },
350
- { title: 'Texas', value: 'TX' },
351
- { title: 'Wyoming', value: 'WY' }
352
- ]"
353
- :returnObject="false"
354
- :multiple="false"
355
- v-model="selectedValueFalse"
356
- />
357
- <Select
358
- :items="[
359
- { title: 'California', value: 'CA' },
360
- { title: 'Colorado', value: 'CO' },
361
- { title: 'Florida', value: 'FL' },
362
- { title: 'Georgia', value: 'GA' },
363
- { title: 'Texas', value: 'TX' },
364
- { title: 'Wyoming', value: 'WY' }
365
- ]"
366
- :returnObject="true"
367
- :multiple="false"
368
- v-model="selectedObjectTrue"
369
- />
370
- <Select
371
- :items="[
372
- { title: 'California', value: 'CA' },
373
- { title: 'Colorado', value: 'CO' },
374
- { title: 'Florida', value: 'FL' },
375
- { title: 'Georgia', value: 'GA' },
376
- { title: 'Texas', value: 'TX' },
377
- { title: 'Wyoming', value: 'WY' }
378
- ]"
379
- :returnObject="false"
380
- :multiple="true"
381
- v-model="selectedValuesFalse"
382
- />
383
- <Select
384
- :items="[
385
- { title: 'California', value: 'CA' },
386
- { title: 'Colorado', value: 'CO' },
387
- { title: 'Florida', value: 'FL' },
388
- { title: 'Georgia', value: 'GA' },
389
- { title: 'Texas', value: 'TX' },
390
- { title: 'Wyoming', value: 'WY' }
391
- ]"
392
- :returnObject="true"
393
- :multiple="true"
394
- v-model="selectedObjectsTrue"
395
- />
396
- </template>
397
-
398
- <script setup>
399
- import { ref } from 'vue';
400
-
401
- const items = [
402
- { title: 'California', value: 'CA' },
403
- { title: 'Colorado', value: 'CO' },
404
- { title: 'Florida', value: 'FL' },
405
- { title: 'Georgia', value: 'GA' },
406
- { title: 'Texas', value: 'TX' },
407
- { title: 'Wyoming', value: 'WY' },
408
- ];
409
-
410
- const selectedValueFalse = ref('CA');
411
- const selectedObjectTrue = ref(items.find((item) => item.value === 'FL'));
412
- const selectedValuesFalse = ref(['CA', 'GA']);
413
- const selectedObjectsTrue = ref(items.filter((item) => ['TX', 'WY'].includes(item.value)));
414
- </script>
415
- `,
416
- },
417
- },
418
- },
419
- };
1
+ import { Meta, StoryObj } from '@storybook/vue3';
2
+ import Select from '../components/Select/Select.vue';
3
+ import { action } from '@storybook/addon-actions';
4
+ import { ref } from 'vue';
5
+
6
+ const meta: Meta<typeof Select> = {
7
+ title: 'WL/Select',
8
+ component: Select,
9
+ tags: ['autodocs'],
10
+ argTypes: {
11
+ clearable: { control: 'boolean' },
12
+ label: { control: 'text' },
13
+ chips: { control: 'boolean' },
14
+ multiple: { control: 'boolean' },
15
+ closableChips: { control: 'boolean' },
16
+ items: { control: 'object' },
17
+ returnObject: { control: 'boolean' },
18
+ 'click:append': { action: 'click:append' },
19
+ 'click:prepend': { action: 'click:prepend' },
20
+ 'click:append-inner': { action: 'click:append-inner' },
21
+ 'click:prepend-inner': { action: 'click:prepend-inner' },
22
+ 'click:clear': { action: 'click:clear' },
23
+ 'update:modelValue': { action: 'update:modelValue' },
24
+ 'update:search': { action: 'update:search' },
25
+ },
26
+ args: {
27
+ items: ['California', 'Colorado', 'Florida', 'Georgia', 'Texas', 'Wyoming'],
28
+ label: 'Select a state',
29
+ },
30
+ parameters: {
31
+ docs: {
32
+ description: {
33
+ component: `
34
+ The \`Select\` component allows for a customizable dropdown menu with options for multiple selections, chips, clearable selections, and icons.
35
+
36
+ ### Props
37
+ - **\`clearable\`**: Allows the selection to be cleared.
38
+ - **\`label\`**: Specifies the label for the select input.
39
+ - **\`chips\`**: Displays selected items as chips within the input.
40
+ - **\`multiple\`**: Enables selection of multiple items.
41
+ - **\`closableChips\`**: Allows chips to be individually closed.
42
+ - **\`items\`**: An array of items to display in the dropdown.
43
+ - **\`returnObject\`**: Returns the entire item object instead of just the value.
44
+
45
+ ### Slots
46
+ - **\`prependIcon\`**: Adds an icon before the input.
47
+ - **\`appendIcon\`**: Adds an icon after the input.
48
+
49
+ ### Example Usage
50
+ The following examples demonstrate various configurations, including single and multiple selections, clearable, and chips.
51
+ `,
52
+ },
53
+ },
54
+ },
55
+ };
56
+
57
+ export default meta;
58
+ type Story = StoryObj<typeof meta>;
59
+
60
+ const Template: Story = {
61
+ render: (args) => ({
62
+ components: { Select },
63
+ setup() {
64
+ const prependClick = action('click:prepend');
65
+ const appendClick = action('click:append');
66
+ const prependInnerClick = action('click:prepend-inner');
67
+ const appendInnerClick = action('click:append-inner');
68
+ const clearClick = action('click:clear');
69
+ const updateModelValue = action('update:modelValue');
70
+ const updateSearch = action('update:search');
71
+
72
+ return {
73
+ args,
74
+ prependClick,
75
+ appendClick,
76
+ prependInnerClick,
77
+ appendInnerClick,
78
+ clearClick,
79
+ updateModelValue,
80
+ updateSearch,
81
+ };
82
+ },
83
+ template: `
84
+ <div style="padding: 16px;">
85
+ <Select
86
+ v-bind="args"
87
+ @click:prepend="prependClick"
88
+ @click:append="appendClick"
89
+ @click:prepend-inner="prependInnerClick"
90
+ @click:append-inner="appendInnerClick"
91
+ @click:clear="clearClick"
92
+ @update:modelValue="updateModelValue"
93
+ @update:search="updateSearch"
94
+ />
95
+ </div>
96
+ `,
97
+ }),
98
+ };
99
+
100
+ // Default story without any additional props like chips or clearable
101
+ export const Default: Story = {
102
+ ...Template,
103
+ args: {},
104
+ parameters: {
105
+ docs: {
106
+ source: {
107
+ code: `<Select :items="['California', 'Colorado', 'Florida', 'Georgia', 'Texas', 'Wyoming']" label="Select a state" />`,
108
+ },
109
+ },
110
+ },
111
+ };
112
+
113
+ // Story with chips enabled and clearable set to true
114
+ export const WithChips: Story = {
115
+ ...Template,
116
+ args: {
117
+ chips: true,
118
+ closableChips: true,
119
+ },
120
+ parameters: {
121
+ docs: {
122
+ source: {
123
+ code: `<Select chips closableChips />`,
124
+ },
125
+ },
126
+ },
127
+ };
128
+
129
+ // Story with prepend and append icons
130
+ export const WithPrependAppendIcons: Story = {
131
+ ...Template,
132
+ args: {
133
+ prependIcon: 'heroicons:calendar',
134
+ appendIcon: 'heroicons:calendar',
135
+ },
136
+ parameters: {
137
+ docs: {
138
+ source: {
139
+ code: `<Select prependIcon="heroicons:calendar" appendIcon="heroicons:calendar" />`,
140
+ },
141
+ },
142
+ },
143
+ };
144
+
145
+ // Disabled state story
146
+ export const Disabled: Story = {
147
+ ...Template,
148
+ args: { disabled: true },
149
+ parameters: {
150
+ docs: {
151
+ source: {
152
+ code: `<Select disabled />`,
153
+ },
154
+ },
155
+ },
156
+ };
157
+
158
+ // Story with compact density
159
+ export const CompactSelect: Story = {
160
+ ...Template,
161
+ args: { density: 'compact' },
162
+ parameters: {
163
+ docs: {
164
+ source: {
165
+ code: `<Select density="compact" />`,
166
+ },
167
+ },
168
+ },
169
+ };
170
+
171
+ // Disabled state with icons
172
+ export const DisabledWithIcons: Story = {
173
+ ...Template,
174
+ args: {
175
+ disabled: true,
176
+ prependIcon: 'heroicons:calendar',
177
+ appendIcon: 'heroicons:calendar',
178
+ appendInnerIcon: 'heroicons:calendar',
179
+ prependInnerIcon: 'heroicons:calendar',
180
+ },
181
+ parameters: {
182
+ docs: {
183
+ source: {
184
+ code: `<Select disabled prependIcon="heroicons:calendar" appendIcon="heroicons:calendar" />`,
185
+ },
186
+ },
187
+ },
188
+ };
189
+
190
+ // Story with custom icons
191
+ export const CustomIcons: Story = {
192
+ ...Template,
193
+ args: {
194
+ prependIcon: 'heroicons:sparkles',
195
+ appendIcon: 'heroicons:paper-airplane',
196
+ },
197
+ parameters: {
198
+ docs: {
199
+ source: {
200
+ code: `<Select prependIcon="heroicons:sparkles" appendIcon="heroicons:paper-airplane" />`,
201
+ },
202
+ },
203
+ },
204
+ };
205
+
206
+ // Without chips
207
+ export const WithoutChips: Story = {
208
+ ...Template,
209
+ args: { chips: false },
210
+ parameters: {
211
+ docs: {
212
+ source: {
213
+ code: `<Select chips="false" />`,
214
+ },
215
+ },
216
+ },
217
+ };
218
+
219
+ // Multiple selection with chips enabled
220
+ export const MultipleWithChips: Story = {
221
+ ...Template,
222
+ args: {
223
+ multiple: true,
224
+ chips: true,
225
+ closableChips: true,
226
+ items: ['Apple', 'Banana', 'Cherry', 'Date', 'Elderberry'],
227
+ },
228
+ parameters: {
229
+ docs: {
230
+ source: {
231
+ code: `<Select multiple chips closableChips :items="['Apple', 'Banana', 'Cherry', 'Date', 'Elderberry']" />`,
232
+ },
233
+ },
234
+ },
235
+ };
236
+
237
+ // Closable chips story
238
+ export const ClosableChips: Story = {
239
+ ...Template,
240
+ args: {
241
+ chips: true,
242
+ closableChips: true,
243
+ items: ['Red', 'Blue', 'Green', 'Yellow', 'Purple'],
244
+ },
245
+ parameters: {
246
+ docs: {
247
+ source: {
248
+ code: `<Select chips closableChips :items="['Red', 'Blue', 'Green', 'Yellow', 'Purple']" />`,
249
+ },
250
+ },
251
+ },
252
+ };
253
+
254
+ // Menu and clear icons
255
+ export const WithMenuAndClearIcons: Story = {
256
+ ...Template,
257
+ args: {
258
+ menuIcon: 'heroicons:menu',
259
+ clearIcon: 'heroicons:x-circle',
260
+ },
261
+ parameters: {
262
+ docs: {
263
+ source: {
264
+ code: `<Select menuIcon="heroicons:menu" clearIcon="heroicons:x-circle" />`,
265
+ },
266
+ },
267
+ },
268
+ };
269
+
270
+ // Clearable and multiple disabled
271
+ export const ClearableAndMultiple: Story = {
272
+ ...Template,
273
+ args: {
274
+ clearable: false,
275
+ multiple: false,
276
+ },
277
+ parameters: {
278
+ docs: {
279
+ source: {
280
+ code: `<Select clearable="false" multiple="false" />`,
281
+ },
282
+ },
283
+ },
284
+ };
285
+
286
+ // Preselected values with returnObject variations
287
+ export const PreselectedValues: Story = {
288
+ render: (args) => ({
289
+ components: { Select },
290
+ setup() {
291
+ const items = [
292
+ { title: 'California', value: 'CA' },
293
+ { title: 'Colorado', value: 'CO' },
294
+ { title: 'Florida', value: 'FL' },
295
+ { title: 'Georgia', value: 'GA' },
296
+ { title: 'Texas', value: 'TX' },
297
+ { title: 'Wyoming', value: 'WY' },
298
+ ];
299
+
300
+ const selectedValueFalse = ref('CA'); // Single selection, returnObject: false
301
+ const selectedObjectTrue = ref(items.find((item) => item.value === 'FL')); // Single selection, returnObject: true
302
+ const selectedValuesFalse = ref(['CA', 'GA']); // Multiple selection, returnObject: false
303
+ const selectedObjectsTrue = ref(
304
+ items.filter((item) => ['TX', 'WY'].includes(item.value)),
305
+ ); // Multiple selection, returnObject: true
306
+
307
+ const updateModelValue = action('update:modelValue');
308
+
309
+ return {
310
+ args: { ...args, items, itemTitle: 'title', itemValue: 'value' },
311
+ selectedValueFalse,
312
+ selectedObjectTrue,
313
+ selectedValuesFalse,
314
+ selectedObjectsTrue,
315
+ updateModelValue,
316
+ };
317
+ },
318
+ template: `
319
+ <div style="padding: 16px; display: flex; flex-direction: column; gap: 24px;">
320
+ <!-- Single selection with returnObject: false -->
321
+ <Select v-bind="args" :returnObject="false" :multiple="false" v-model="selectedValueFalse" @update:modelValue="updateModelValue" />
322
+ <p>Selected Value (returnObject: false): {{ selectedValueFalse }}</p>
323
+
324
+ <!-- Single selection with returnObject: true -->
325
+ <Select v-bind="args" :returnObject="true" :multiple="false" v-model="selectedObjectTrue" @update:modelValue="updateModelValue" />
326
+ <p>Selected Object (returnObject: true): {{ selectedObjectTrue }}</p>
327
+
328
+ <!-- Multiple selection with returnObject: false -->
329
+ <Select v-bind="args" :returnObject="false" :multiple="true" v-model="selectedValuesFalse" @update:modelValue="updateModelValue" />
330
+ <p>Selected Values (multiple, returnObject: false): {{ selectedValuesFalse }}</p>
331
+
332
+ <!-- Multiple selection with returnObject: true -->
333
+ <Select v-bind="args" :returnObject="true" :multiple="true" v-model="selectedObjectsTrue" @update:modelValue="updateModelValue" />
334
+ <p>Selected Objects (multiple, returnObject: true): {{ selectedObjectsTrue }}</p>
335
+ </div>
336
+ `,
337
+ }),
338
+ args: {},
339
+ parameters: {
340
+ docs: {
341
+ source: {
342
+ code: `
343
+ <template>
344
+ <Select
345
+ :items="[
346
+ { title: 'California', value: 'CA' },
347
+ { title: 'Colorado', value: 'CO' },
348
+ { title: 'Florida', value: 'FL' },
349
+ { title: 'Georgia', value: 'GA' },
350
+ { title: 'Texas', value: 'TX' },
351
+ { title: 'Wyoming', value: 'WY' }
352
+ ]"
353
+ :returnObject="false"
354
+ :multiple="false"
355
+ v-model="selectedValueFalse"
356
+ />
357
+ <Select
358
+ :items="[
359
+ { title: 'California', value: 'CA' },
360
+ { title: 'Colorado', value: 'CO' },
361
+ { title: 'Florida', value: 'FL' },
362
+ { title: 'Georgia', value: 'GA' },
363
+ { title: 'Texas', value: 'TX' },
364
+ { title: 'Wyoming', value: 'WY' }
365
+ ]"
366
+ :returnObject="true"
367
+ :multiple="false"
368
+ v-model="selectedObjectTrue"
369
+ />
370
+ <Select
371
+ :items="[
372
+ { title: 'California', value: 'CA' },
373
+ { title: 'Colorado', value: 'CO' },
374
+ { title: 'Florida', value: 'FL' },
375
+ { title: 'Georgia', value: 'GA' },
376
+ { title: 'Texas', value: 'TX' },
377
+ { title: 'Wyoming', value: 'WY' }
378
+ ]"
379
+ :returnObject="false"
380
+ :multiple="true"
381
+ v-model="selectedValuesFalse"
382
+ />
383
+ <Select
384
+ :items="[
385
+ { title: 'California', value: 'CA' },
386
+ { title: 'Colorado', value: 'CO' },
387
+ { title: 'Florida', value: 'FL' },
388
+ { title: 'Georgia', value: 'GA' },
389
+ { title: 'Texas', value: 'TX' },
390
+ { title: 'Wyoming', value: 'WY' }
391
+ ]"
392
+ :returnObject="true"
393
+ :multiple="true"
394
+ v-model="selectedObjectsTrue"
395
+ />
396
+ </template>
397
+
398
+ <script setup>
399
+ import { ref } from 'vue';
400
+
401
+ const items = [
402
+ { title: 'California', value: 'CA' },
403
+ { title: 'Colorado', value: 'CO' },
404
+ { title: 'Florida', value: 'FL' },
405
+ { title: 'Georgia', value: 'GA' },
406
+ { title: 'Texas', value: 'TX' },
407
+ { title: 'Wyoming', value: 'WY' },
408
+ ];
409
+
410
+ const selectedValueFalse = ref('CA');
411
+ const selectedObjectTrue = ref(items.find((item) => item.value === 'FL'));
412
+ const selectedValuesFalse = ref(['CA', 'GA']);
413
+ const selectedObjectsTrue = ref(items.filter((item) => ['TX', 'WY'].includes(item.value)));
414
+ </script>
415
+ `,
416
+ },
417
+ },
418
+ },
419
+ };