@zap-wunschlachen/wl-shared-components 1.0.38 → 1.0.40
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.
- package/.github/workflows/playwright.yml +205 -205
- package/.github/workflows/static.yml +61 -61
- package/.github/workflows/update-snapshots.yml +37 -37
- package/.prettierrc +5 -5
- package/.storybook/main.ts +18 -18
- package/.storybook/preview.ts +37 -37
- package/.storybook/storyWrapper.vue +18 -18
- package/.storybook/withVuetifyTheme.decorator.ts +21 -21
- package/App.vue +33 -33
- package/README.md +56 -56
- package/heroicons.ts +75 -75
- package/index.html +19 -19
- package/package.json +67 -67
- package/playwright.config.ts +48 -48
- package/public/background.svg +60 -60
- package/public/style.css +187 -187
- package/public/technologies.svg +22 -22
- package/src/assets/css/base.css +234 -232
- package/src/assets/css/variables.css +112 -109
- package/src/components/Accordion/Accordion.css +59 -59
- package/src/components/Accordion/AccordionGroup.vue +51 -51
- package/src/components/Accordion/AccordionItem.vue +66 -66
- package/src/components/Appointment/Card/Actions.css +54 -54
- package/src/components/Appointment/Card/Actions.vue +99 -99
- package/src/components/Appointment/Card/AnamneseNotification.css +15 -15
- package/src/components/Appointment/Card/AnamneseNotification.vue +23 -23
- package/src/components/Appointment/Card/Card.css +80 -80
- package/src/components/Appointment/Card/Card.vue +93 -93
- package/src/components/Appointment/Card/Details.css +50 -50
- package/src/components/Appointment/Card/Details.vue +43 -43
- package/src/components/Audio/Audio.vue +187 -187
- package/src/components/Audio/Waveform.vue +118 -118
- package/src/components/Button/Button.vue +174 -174
- package/src/components/CheckBox/CheckBox.css +214 -214
- package/src/components/CheckBox/Checkbox.vue +138 -138
- package/src/components/DateInput/DateInput.css +2 -2
- package/src/components/DateInput/DateInput.vue +262 -262
- package/src/components/Dialog/Dialog.css +6 -6
- package/src/components/Dialog/Dialog.vue +38 -38
- package/src/components/EditField/EditField.css +19 -19
- package/src/components/EditField/EditField.vue +202 -202
- package/src/components/ErrorPage/ErrorPage.css +172 -172
- package/src/components/IconBullet/IconBullet.vue +86 -86
- package/src/components/IconBullet/IconBulletList.vue +41 -41
- package/src/components/Icons/AdvanceAppointments.vue +153 -153
- package/src/components/Icons/Audio/CloudFailed.vue +20 -20
- package/src/components/Icons/Audio/CloudSaved.vue +21 -21
- package/src/components/Icons/Audio/Delete.vue +15 -15
- package/src/components/Icons/Audio/Pause.vue +18 -18
- package/src/components/Icons/Audio/Play.vue +15 -15
- package/src/components/Icons/{calendar.vue → Calendar.vue} +17 -17
- package/src/components/Icons/CalendarNotification.vue +126 -126
- package/src/components/Icons/Chair.vue +32 -32
- package/src/components/Icons/ChairNotification.vue +35 -35
- package/src/components/Icons/Circle.vue +66 -66
- package/src/components/Icons/FavIcon.vue +22 -22
- package/src/components/Icons/FilledCircle.vue +11 -11
- package/src/components/Icons/Group3.vue +46 -46
- package/src/components/Icons/RingNotification.vue +54 -54
- package/src/components/Icons/SolidArrowRight.vue +14 -14
- package/src/components/Icons/checkbox.vue +19 -19
- package/src/components/Icons/outlineChecked.vue +27 -27
- package/src/components/Icons/play.vue +5 -5
- package/src/components/Input/Input.css +187 -187
- package/src/components/Input/Input.vue +253 -253
- package/src/components/Laboratory/AppointmentCard/AppointmentCard.css +7 -7
- package/src/components/Laboratory/AppointmentCard/AppointmentCard.vue +116 -116
- package/src/components/Laboratory/ChatBoxImage/ChatBoxImage.vue +81 -81
- package/src/components/Laboratory/ChatMessage/ChatMessage.vue +113 -113
- package/src/components/Laboratory/ChatMessage/ChatMessageBadge.css +4 -4
- package/src/components/Laboratory/ChatMessage/ChatMessageBadge.vue +99 -99
- package/src/components/Laboratory/ChatNotification/ChatNotification.vue +130 -130
- package/src/components/Laboratory/DocumentCard/DocumentCard.css +3 -3
- package/src/components/Laboratory/DocumentCard/DocumentCard.vue +50 -50
- package/src/components/Laboratory/DocumentCard/DocumentCardItem.vue +53 -53
- package/src/components/Laboratory/InfoCard/InfoCard.vue +162 -162
- package/src/components/Laboratory/MainColumnsBar/MainColumnsBar.vue +102 -102
- package/src/components/Laboratory/ProgressCircle/ProgressCircle.vue +152 -152
- package/src/components/Laboratory/ProgressLinear/ProgressLinear.css +33 -33
- package/src/components/Laboratory/ProgressLinear/ProgressLinear.vue +75 -75
- package/src/components/Laboratory/SelectionColumnBar/SelectionColumnBar.vue +92 -92
- package/src/components/Laboratory/StatusNotification/StatusNotification.vue +49 -49
- package/src/components/Laboratory/TagLabel/TagLabel.vue +126 -126
- package/src/components/Laboratory/TagLabelGroup/TagLabelGroup.vue +97 -97
- package/src/components/Laboratory/TicketCard/TicketCard.css +3 -3
- package/src/components/Laboratory/TicketCard/TicketCard.vue +143 -143
- package/src/components/Laboratory/TimeLine/TimeLineEvent.css +18 -18
- package/src/components/Laboratory/TimeLine/TimeLineEvent.vue +119 -119
- package/src/components/Laboratory/TimeLine/Timeline.css +4 -4
- package/src/components/Laboratory/TimeLine/Timeline.vue +30 -30
- package/src/components/Loader/Loader.css +71 -71
- package/src/components/MaintenanceBanner/MaintenanceBanner.css +353 -353
- package/src/components/MaintenanceBanner/MaintenanceBanner.vue +127 -127
- package/src/components/MaintenanceBanner/MaintenanceIllustration.vue +54 -54
- package/src/components/Modal/Modal.css +5 -5
- package/src/components/Modal/Modal.vue +22 -22
- package/src/components/NotificationBubble/NotificationBubble.css +4 -4
- package/src/components/NotificationBubble/NotificationBubble.vue +90 -90
- package/src/components/OtpInput/OtpInput.css +39 -39
- package/src/components/OtpInput/OtpInput.vue +151 -151
- package/src/components/PhoneInput/PhoneInput.css +31 -31
- package/src/components/PhoneInput/PhoneInput.vue +113 -113
- package/src/components/Select/Select.css +150 -150
- package/src/components/Select/Select.vue +316 -316
- package/src/components/TextArea/TextArea.css +3 -3
- package/src/components/TextArea/TextArea.vue +126 -126
- package/src/components/TickBox/TickBox.css +49 -49
- package/src/components/TickBox/TickBox.vue +126 -126
- package/src/components/accessibility.css +218 -218
- package/src/components/index.ts +29 -29
- package/src/constants/iconEnums.ts +3 -3
- package/src/i18n/i18n.ts +15 -15
- package/src/i18n/locales/de.json +30 -30
- package/src/i18n/locales/en.json +30 -30
- package/src/index.ts +34 -34
- package/src/main.ts +11 -11
- package/src/plugins/vuetify.ts +141 -141
- package/src/shims-vue.d.ts +10 -10
- package/src/stories/Accordion.stories.ts +650 -650
- package/src/stories/Audio.stories.ts +28 -28
- package/src/stories/Button.stories.ts +263 -263
- package/src/stories/CheckBox.stories.ts +348 -348
- package/src/stories/DateInput.stories.ts +53 -53
- package/src/stories/Dialog.stories.ts +147 -147
- package/src/stories/EditField.stories.ts +78 -78
- package/src/stories/IconBullet/IconBullet.stories.ts +201 -201
- package/src/stories/IconBullet/IconBulletList.stories.ts +275 -275
- package/src/stories/Input.stories.ts +351 -351
- package/src/stories/Laboratory/Cards/AppointmentCard/AppointmentCard.stories.ts +260 -260
- package/src/stories/Laboratory/Cards/DocumentCard/DocumentCard.stories.ts +176 -176
- package/src/stories/Laboratory/Cards/DocumentCard/DocumentCardItem.stories.ts +119 -119
- package/src/stories/Laboratory/Cards/InfoCard/InfoCard.stories.ts +320 -320
- package/src/stories/Laboratory/Cards/TicketCard/TicketCard.stories.ts +335 -335
- package/src/stories/Laboratory/Chat/ChatBoxImage.stories.ts +82 -82
- package/src/stories/Laboratory/Chat/ChatMessage.stories.ts +198 -198
- package/src/stories/Laboratory/Chat/ChatMessageBadge.stories.ts +204 -204
- package/src/stories/Laboratory/Chat/ChatNotification.stories.ts +144 -144
- package/src/stories/Laboratory/Chat/ProgressLinear.stories.ts +186 -186
- package/src/stories/Laboratory/Chat/StatusNotification.stories.ts +111 -111
- package/src/stories/Laboratory/MainColumnsBar.stories.ts +48 -48
- package/src/stories/Laboratory/ProgressCircle.stories.ts +261 -261
- package/src/stories/Laboratory/SelectionColumnBar.stories.ts +234 -234
- package/src/stories/Laboratory/TagLabel.stories.ts +418 -418
- package/src/stories/Laboratory/TagLabelGroup.stories.ts +234 -234
- package/src/stories/Laboratory/Timeline.stories.ts +403 -403
- package/src/stories/NotificationBubble.stories.ts +194 -194
- package/src/stories/OtpInput.stories.ts +100 -100
- package/src/stories/PhoneInput.stories.ts +52 -52
- package/src/stories/Select.stories.ts +419 -419
- package/src/stories/TextArea.stories.ts +112 -112
- package/src/stories/TickBox.stories.ts +294 -294
- package/src/stories/v-icon.stories.ts +91 -91
- package/src/utils/index.ts +116 -109
- package/src/vite-env.d.ts +1 -1
- package/tests/e2e/README.md +220 -220
- package/tests/e2e/accessibility.spec.ts +638 -638
- package/tests/e2e/accordion.spec.ts +42 -42
- package/tests/e2e/additional-components.spec.ts +437 -437
- package/tests/e2e/all-components.spec.ts +135 -135
- package/tests/e2e/appointment-card.spec.ts +816 -816
- package/tests/e2e/button-fixed.spec.ts +58 -58
- package/tests/e2e/button.spec.ts +76 -76
- package/tests/e2e/checkbox.spec.ts +50 -50
- package/tests/e2e/date-input.spec.ts +46 -46
- package/tests/e2e/debug.spec.ts +51 -51
- package/tests/e2e/dialog.spec.ts +58 -58
- package/tests/e2e/input.spec.ts +55 -55
- package/tests/e2e/laboratory-components.spec.ts +320 -320
- package/tests/e2e/otp-input.spec.ts +50 -50
- package/tests/e2e/select.spec.ts +52 -52
- package/tests/e2e/storybook-utils.ts +59 -59
- package/tests/e2e/test-basic.spec.ts +33 -33
- package/tests/e2e/visual-regression.spec.ts +350 -350
- package/tests/unit/accessibility/component-a11y.spec.ts +469 -469
- package/tests/unit/components/Accordion/AccordionGroup.spec.ts +228 -228
- package/tests/unit/components/Accordion/AccordionGroup.spec.ts.skip +342 -342
- package/tests/unit/components/Accordion/AccordionItem.spec.ts +292 -292
- package/tests/unit/components/Accordion/AccordionItem.spec.ts.skip +383 -383
- package/tests/unit/components/Appointment/AnamneseNotification.spec.ts +176 -176
- package/tests/unit/components/Appointment/Card/Actions.spec.ts +407 -407
- package/tests/unit/components/Appointment/Card/Card.spec.ts +485 -485
- package/tests/unit/components/Appointment/Card/Details.spec.ts +397 -397
- package/tests/unit/components/Audio/Audio.spec.ts +403 -403
- package/tests/unit/components/Audio/Waveform.spec.ts +483 -483
- package/tests/unit/components/Background/Background.spec.ts +177 -177
- package/tests/unit/components/Core/Button.spec.ts +336 -336
- package/tests/unit/components/Core/Checkbox.spec.ts +544 -544
- package/tests/unit/components/Core/DateInput.spec.ts +690 -690
- package/tests/unit/components/Core/Dialog.spec.ts +485 -485
- package/tests/unit/components/Core/EditField.spec.ts +782 -782
- package/tests/unit/components/Core/Input.spec.ts +512 -512
- package/tests/unit/components/Core/Modal.spec.ts +518 -518
- package/tests/unit/components/Core/NotificationBubble.spec.ts +606 -606
- package/tests/unit/components/Core/OtpInput.spec.ts +708 -708
- package/tests/unit/components/Core/PhoneInput.spec.ts +619 -619
- package/tests/unit/components/Core/Select.spec.ts +712 -712
- package/tests/unit/components/Core/TextArea.spec.ts +565 -565
- package/tests/unit/components/Core/TickBox.spec.ts +779 -779
- package/tests/unit/components/ErrorPage/ErrorPage.spec.ts +313 -313
- package/tests/unit/components/ErrorPage/ErrorPageLogo.spec.ts +153 -153
- package/tests/unit/components/IconBullet/IconBullet.spec.ts +356 -356
- package/tests/unit/components/IconBullet/IconBulletList.spec.ts +371 -371
- package/tests/unit/components/Icons/AdvanceAppointments.spec.ts +61 -61
- package/tests/unit/components/Icons/Audio/CloudFailed.spec.ts +108 -108
- package/tests/unit/components/Icons/Audio/CloudSaved.spec.ts +149 -149
- package/tests/unit/components/Icons/Audio/Delete.spec.ts +158 -158
- package/tests/unit/components/Icons/Audio/Pause.spec.ts +208 -208
- package/tests/unit/components/Icons/Audio/Play.spec.ts +217 -217
- package/tests/unit/components/Icons/CalendarNotification.spec.ts +186 -186
- package/tests/unit/components/Icons/Chair.spec.ts +234 -234
- package/tests/unit/components/Icons/ChairNotification.spec.ts +311 -311
- package/tests/unit/components/Icons/Circle.spec.ts +255 -255
- package/tests/unit/components/Icons/FavIcon.spec.ts +251 -251
- package/tests/unit/components/Icons/FilledCircle.spec.ts +274 -274
- package/tests/unit/components/Icons/Group3.spec.ts +355 -355
- package/tests/unit/components/Icons/Logo.spec.ts +228 -228
- package/tests/unit/components/Icons/MiniLogo.spec.ts +38 -38
- package/tests/unit/components/Icons/RingNotification.spec.ts +393 -393
- package/tests/unit/components/Icons/SolidArrowRight.spec.ts +49 -49
- package/tests/unit/components/Icons/calendar.spec.ts +286 -286
- package/tests/unit/components/Icons/checkbox.spec.ts +315 -315
- package/tests/unit/components/Icons/outlineChecked.spec.ts +434 -434
- package/tests/unit/components/Icons/play.spec.ts +308 -308
- package/tests/unit/components/Laboratory/AppointmentCard.spec.ts +167 -167
- package/tests/unit/components/Laboratory/ChatBoxImage.spec.ts +179 -179
- package/tests/unit/components/Laboratory/ChatMessage.spec.ts +263 -263
- package/tests/unit/components/Laboratory/ChatMessageBadge.spec.ts +282 -282
- package/tests/unit/components/Laboratory/ChatNotification.spec.ts +256 -256
- package/tests/unit/components/Laboratory/DocumentCard.spec.ts +228 -228
- package/tests/unit/components/Laboratory/DocumentCardItem.spec.ts +236 -236
- package/tests/unit/components/Laboratory/InfoCard.spec.ts +308 -308
- package/tests/unit/components/Laboratory/MainColumnsBar.spec.ts +251 -251
- package/tests/unit/components/Laboratory/ProgressCircle.spec.ts +290 -290
- package/tests/unit/components/Laboratory/ProgressLinear.spec.ts +275 -275
- package/tests/unit/components/Laboratory/SelectionColumnBar.spec.ts +288 -288
- package/tests/unit/components/Laboratory/StatusNotification.spec.ts +296 -296
- package/tests/unit/components/Laboratory/TagLabel.spec.ts +353 -353
- package/tests/unit/components/Laboratory/TagLabelGroup.spec.ts +377 -377
- package/tests/unit/components/Laboratory/TicketCard.spec.ts +351 -351
- package/tests/unit/components/Laboratory/TimeLineEvent.spec.ts +381 -381
- package/tests/unit/components/Laboratory/Timeline.spec.ts +419 -419
- package/tests/unit/components/Loader/Loader.spec.ts +197 -197
- package/tests/unit/components/MaintenanceBanner/MaintenanceBanner.spec.ts +302 -302
- package/tests/unit/constants/iconEnums.spec.ts +39 -39
- package/tests/unit/i18n/i18n.spec.ts +88 -88
- package/tests/unit/plugins/vuetify.spec.ts +220 -220
- package/tests/unit/setup.ts +189 -189
- package/tests/unit/src/components/index.spec.ts.skip +192 -192
- package/tests/unit/src/index.spec.ts.skip +182 -182
- package/tests/unit/src/main.spec.ts +151 -151
- package/tests/unit/utils/accessibility.spec.ts +318 -318
- package/tsconfig.json +26 -26
- package/vite.config.ts +29 -29
- package/vitest.config.ts +83 -83
|
@@ -1,50 +1,50 @@
|
|
|
1
|
-
import { test, expect } from '@playwright/test';
|
|
2
|
-
|
|
3
|
-
test.describe('OtpInput Component', () => {
|
|
4
|
-
async function getFrame(page) {
|
|
5
|
-
await page.waitForSelector('#storybook-preview-iframe', { timeout: 30000 });
|
|
6
|
-
const frame = page.frame({ url: /iframe\.html/ });
|
|
7
|
-
if (!frame) throw new Error('Frame not found');
|
|
8
|
-
await frame.waitForSelector('body', { timeout: 10000 });
|
|
9
|
-
return frame;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
test('renders OTP input fields', async ({ page }) => {
|
|
13
|
-
await page.goto('http://localhost:7000/?path=/story/wl-otpinput--default');
|
|
14
|
-
const frame = await getFrame(page);
|
|
15
|
-
|
|
16
|
-
const inputs = frame.locator('input');
|
|
17
|
-
const count = await inputs.count();
|
|
18
|
-
expect(count).toBeGreaterThan(3);
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
test('accepts numeric input', async ({ page }) => {
|
|
22
|
-
await page.goto('http://localhost:7000/?path=/story/wl-otpinput--default');
|
|
23
|
-
const frame = await getFrame(page);
|
|
24
|
-
|
|
25
|
-
const firstInput = frame.locator('input').first();
|
|
26
|
-
await firstInput.fill('1');
|
|
27
|
-
await expect(firstInput).toHaveValue('1');
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
test('moves focus between fields', async ({ page }) => {
|
|
31
|
-
await page.goto('http://localhost:7000/?path=/story/wl-otpinput--default');
|
|
32
|
-
const frame = await getFrame(page);
|
|
33
|
-
|
|
34
|
-
const inputs = frame.locator('input');
|
|
35
|
-
const firstInput = inputs.nth(0);
|
|
36
|
-
const secondInput = inputs.nth(1);
|
|
37
|
-
|
|
38
|
-
await firstInput.fill('1');
|
|
39
|
-
// Focus should move to next field
|
|
40
|
-
await page.waitForTimeout(100);
|
|
41
|
-
|
|
42
|
-
const focusedElement = await frame.evaluateHandle(() => document.activeElement);
|
|
43
|
-
const isFocused = await secondInput.evaluate((el, focused) => el === focused, focusedElement);
|
|
44
|
-
|
|
45
|
-
// Some implementations auto-focus, some don't
|
|
46
|
-
if (isFocused) {
|
|
47
|
-
expect(isFocused).toBeTruthy();
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
});
|
|
1
|
+
import { test, expect } from '@playwright/test';
|
|
2
|
+
|
|
3
|
+
test.describe('OtpInput Component', () => {
|
|
4
|
+
async function getFrame(page) {
|
|
5
|
+
await page.waitForSelector('#storybook-preview-iframe', { timeout: 30000 });
|
|
6
|
+
const frame = page.frame({ url: /iframe\.html/ });
|
|
7
|
+
if (!frame) throw new Error('Frame not found');
|
|
8
|
+
await frame.waitForSelector('body', { timeout: 10000 });
|
|
9
|
+
return frame;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
test('renders OTP input fields', async ({ page }) => {
|
|
13
|
+
await page.goto('http://localhost:7000/?path=/story/wl-otpinput--default');
|
|
14
|
+
const frame = await getFrame(page);
|
|
15
|
+
|
|
16
|
+
const inputs = frame.locator('input');
|
|
17
|
+
const count = await inputs.count();
|
|
18
|
+
expect(count).toBeGreaterThan(3);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
test('accepts numeric input', async ({ page }) => {
|
|
22
|
+
await page.goto('http://localhost:7000/?path=/story/wl-otpinput--default');
|
|
23
|
+
const frame = await getFrame(page);
|
|
24
|
+
|
|
25
|
+
const firstInput = frame.locator('input').first();
|
|
26
|
+
await firstInput.fill('1');
|
|
27
|
+
await expect(firstInput).toHaveValue('1');
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
test('moves focus between fields', async ({ page }) => {
|
|
31
|
+
await page.goto('http://localhost:7000/?path=/story/wl-otpinput--default');
|
|
32
|
+
const frame = await getFrame(page);
|
|
33
|
+
|
|
34
|
+
const inputs = frame.locator('input');
|
|
35
|
+
const firstInput = inputs.nth(0);
|
|
36
|
+
const secondInput = inputs.nth(1);
|
|
37
|
+
|
|
38
|
+
await firstInput.fill('1');
|
|
39
|
+
// Focus should move to next field
|
|
40
|
+
await page.waitForTimeout(100);
|
|
41
|
+
|
|
42
|
+
const focusedElement = await frame.evaluateHandle(() => document.activeElement);
|
|
43
|
+
const isFocused = await secondInput.evaluate((el, focused) => el === focused, focusedElement);
|
|
44
|
+
|
|
45
|
+
// Some implementations auto-focus, some don't
|
|
46
|
+
if (isFocused) {
|
|
47
|
+
expect(isFocused).toBeTruthy();
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
});
|
package/tests/e2e/select.spec.ts
CHANGED
|
@@ -1,52 +1,52 @@
|
|
|
1
|
-
import { test, expect } from '@playwright/test';
|
|
2
|
-
|
|
3
|
-
test.describe('Select Component', () => {
|
|
4
|
-
async function getFrame(page) {
|
|
5
|
-
await page.waitForSelector('#storybook-preview-iframe', { timeout: 30000 });
|
|
6
|
-
const frame = page.frame({ url: /iframe\.html/ });
|
|
7
|
-
if (!frame) throw new Error('Frame not found');
|
|
8
|
-
await frame.waitForSelector('body', { timeout: 30000, state: 'attached' });
|
|
9
|
-
await page.waitForTimeout(1000); // Give time for Vue components to mount
|
|
10
|
-
return frame;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
test('renders default select', async ({ page }) => {
|
|
14
|
-
await page.goto('http://localhost:7000/?path=/story/wl-select--default');
|
|
15
|
-
const frame = await getFrame(page);
|
|
16
|
-
|
|
17
|
-
const select = frame.locator('.wl-select').first();
|
|
18
|
-
await expect(select).toBeVisible({ timeout: 15000 });
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
test('opens dropdown on click', async ({ page }) => {
|
|
22
|
-
await page.goto('http://localhost:7000/?path=/story/wl-select--default');
|
|
23
|
-
const frame = await getFrame(page);
|
|
24
|
-
|
|
25
|
-
const select = frame.locator('.wl-select').first();
|
|
26
|
-
await expect(select).toBeVisible({ timeout: 15000 });
|
|
27
|
-
await select.click();
|
|
28
|
-
|
|
29
|
-
// Wait for menu to open
|
|
30
|
-
await page.waitForTimeout(500);
|
|
31
|
-
const menu = page.locator('.v-menu, .v-overlay').first();
|
|
32
|
-
if (await menu.count() > 0) {
|
|
33
|
-
await expect(menu).toBeVisible();
|
|
34
|
-
}
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
test('displays placeholder', async ({ page }) => {
|
|
38
|
-
await page.goto('http://localhost:7000/?path=/story/wl-select--default');
|
|
39
|
-
const frame = await getFrame(page);
|
|
40
|
-
|
|
41
|
-
const select = frame.locator('.wl-select').first();
|
|
42
|
-
await expect(select).toBeVisible({ timeout: 15000 });
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
test('handles multiple selection', async ({ page }) => {
|
|
46
|
-
await page.goto('http://localhost:7000/?path=/story/wl-select--multiple-with-chips');
|
|
47
|
-
const frame = await getFrame(page);
|
|
48
|
-
|
|
49
|
-
const select = frame.locator('.wl-select').first();
|
|
50
|
-
await expect(select).toBeVisible({ timeout: 15000 });
|
|
51
|
-
});
|
|
52
|
-
});
|
|
1
|
+
import { test, expect } from '@playwright/test';
|
|
2
|
+
|
|
3
|
+
test.describe('Select Component', () => {
|
|
4
|
+
async function getFrame(page) {
|
|
5
|
+
await page.waitForSelector('#storybook-preview-iframe', { timeout: 30000 });
|
|
6
|
+
const frame = page.frame({ url: /iframe\.html/ });
|
|
7
|
+
if (!frame) throw new Error('Frame not found');
|
|
8
|
+
await frame.waitForSelector('body', { timeout: 30000, state: 'attached' });
|
|
9
|
+
await page.waitForTimeout(1000); // Give time for Vue components to mount
|
|
10
|
+
return frame;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
test('renders default select', async ({ page }) => {
|
|
14
|
+
await page.goto('http://localhost:7000/?path=/story/wl-select--default');
|
|
15
|
+
const frame = await getFrame(page);
|
|
16
|
+
|
|
17
|
+
const select = frame.locator('.wl-select').first();
|
|
18
|
+
await expect(select).toBeVisible({ timeout: 15000 });
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
test('opens dropdown on click', async ({ page }) => {
|
|
22
|
+
await page.goto('http://localhost:7000/?path=/story/wl-select--default');
|
|
23
|
+
const frame = await getFrame(page);
|
|
24
|
+
|
|
25
|
+
const select = frame.locator('.wl-select').first();
|
|
26
|
+
await expect(select).toBeVisible({ timeout: 15000 });
|
|
27
|
+
await select.click();
|
|
28
|
+
|
|
29
|
+
// Wait for menu to open
|
|
30
|
+
await page.waitForTimeout(500);
|
|
31
|
+
const menu = page.locator('.v-menu, .v-overlay').first();
|
|
32
|
+
if (await menu.count() > 0) {
|
|
33
|
+
await expect(menu).toBeVisible();
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
test('displays placeholder', async ({ page }) => {
|
|
38
|
+
await page.goto('http://localhost:7000/?path=/story/wl-select--default');
|
|
39
|
+
const frame = await getFrame(page);
|
|
40
|
+
|
|
41
|
+
const select = frame.locator('.wl-select').first();
|
|
42
|
+
await expect(select).toBeVisible({ timeout: 15000 });
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test('handles multiple selection', async ({ page }) => {
|
|
46
|
+
await page.goto('http://localhost:7000/?path=/story/wl-select--multiple-with-chips');
|
|
47
|
+
const frame = await getFrame(page);
|
|
48
|
+
|
|
49
|
+
const select = frame.locator('.wl-select').first();
|
|
50
|
+
await expect(select).toBeVisible({ timeout: 15000 });
|
|
51
|
+
});
|
|
52
|
+
});
|
|
@@ -1,59 +1,59 @@
|
|
|
1
|
-
import { Page, Frame, Locator } from '@playwright/test';
|
|
2
|
-
|
|
3
|
-
export async function getStorybookFrame(page: Page): Promise<Frame> {
|
|
4
|
-
// Wait for iframe with proper timeout
|
|
5
|
-
const iframe = page.locator('#storybook-preview-iframe');
|
|
6
|
-
await iframe.waitFor({ state: 'attached', timeout: 30000 });
|
|
7
|
-
|
|
8
|
-
// Get frame with retries
|
|
9
|
-
let frame: Frame | null = null;
|
|
10
|
-
for (let i = 0; i < 10; i++) {
|
|
11
|
-
frame = page.frame({ url: /iframe\.html/ });
|
|
12
|
-
if (frame) break;
|
|
13
|
-
await page.waitForTimeout(500);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
if (!frame) {
|
|
17
|
-
const iframeElement = page.locator('#storybook-preview-iframe');
|
|
18
|
-
frame = await iframeElement.contentFrame();
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
if (!frame) {
|
|
22
|
-
throw new Error('Could not find Storybook iframe');
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// Wait for content
|
|
26
|
-
await frame.waitForLoadState('domcontentloaded');
|
|
27
|
-
await frame.waitForSelector('body', { state: 'attached', timeout: 30000 });
|
|
28
|
-
await page.waitForTimeout(1000); // Give time for Vue components to mount
|
|
29
|
-
|
|
30
|
-
return frame;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export async function navigateToStory(page: Page, storyPath: string): Promise<Frame> {
|
|
34
|
-
await page.goto(storyPath, { waitUntil: 'domcontentloaded', timeout: 30000 });
|
|
35
|
-
|
|
36
|
-
// Wait for iframe
|
|
37
|
-
await page.waitForSelector('#storybook-preview-iframe', { state: 'attached', timeout: 30000 });
|
|
38
|
-
|
|
39
|
-
// Get frame
|
|
40
|
-
const frame = await getStorybookFrame(page);
|
|
41
|
-
|
|
42
|
-
// Wait for story content
|
|
43
|
-
await frame.waitForSelector('#storybook-root, body > div', { state: 'attached', timeout: 30000 });
|
|
44
|
-
await page.waitForTimeout(500); // Additional time for component rendering
|
|
45
|
-
|
|
46
|
-
return frame;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export function getComponentButton(frame: Frame): Locator {
|
|
50
|
-
return frame.locator('button.v-btn:visible, button.wl-button:visible').first();
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export function getComponentInput(frame: Frame): Locator {
|
|
54
|
-
return frame.locator('#storybook-root input:visible, .v-input input:visible').first();
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
export function getComponentElement(frame: Frame, selector: string): Locator {
|
|
58
|
-
return frame.locator(selector).locator('visible=true').first();
|
|
59
|
-
}
|
|
1
|
+
import { Page, Frame, Locator } from '@playwright/test';
|
|
2
|
+
|
|
3
|
+
export async function getStorybookFrame(page: Page): Promise<Frame> {
|
|
4
|
+
// Wait for iframe with proper timeout
|
|
5
|
+
const iframe = page.locator('#storybook-preview-iframe');
|
|
6
|
+
await iframe.waitFor({ state: 'attached', timeout: 30000 });
|
|
7
|
+
|
|
8
|
+
// Get frame with retries
|
|
9
|
+
let frame: Frame | null = null;
|
|
10
|
+
for (let i = 0; i < 10; i++) {
|
|
11
|
+
frame = page.frame({ url: /iframe\.html/ });
|
|
12
|
+
if (frame) break;
|
|
13
|
+
await page.waitForTimeout(500);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
if (!frame) {
|
|
17
|
+
const iframeElement = page.locator('#storybook-preview-iframe');
|
|
18
|
+
frame = await iframeElement.contentFrame();
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (!frame) {
|
|
22
|
+
throw new Error('Could not find Storybook iframe');
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Wait for content
|
|
26
|
+
await frame.waitForLoadState('domcontentloaded');
|
|
27
|
+
await frame.waitForSelector('body', { state: 'attached', timeout: 30000 });
|
|
28
|
+
await page.waitForTimeout(1000); // Give time for Vue components to mount
|
|
29
|
+
|
|
30
|
+
return frame;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export async function navigateToStory(page: Page, storyPath: string): Promise<Frame> {
|
|
34
|
+
await page.goto(storyPath, { waitUntil: 'domcontentloaded', timeout: 30000 });
|
|
35
|
+
|
|
36
|
+
// Wait for iframe
|
|
37
|
+
await page.waitForSelector('#storybook-preview-iframe', { state: 'attached', timeout: 30000 });
|
|
38
|
+
|
|
39
|
+
// Get frame
|
|
40
|
+
const frame = await getStorybookFrame(page);
|
|
41
|
+
|
|
42
|
+
// Wait for story content
|
|
43
|
+
await frame.waitForSelector('#storybook-root, body > div', { state: 'attached', timeout: 30000 });
|
|
44
|
+
await page.waitForTimeout(500); // Additional time for component rendering
|
|
45
|
+
|
|
46
|
+
return frame;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function getComponentButton(frame: Frame): Locator {
|
|
50
|
+
return frame.locator('button.v-btn:visible, button.wl-button:visible').first();
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function getComponentInput(frame: Frame): Locator {
|
|
54
|
+
return frame.locator('#storybook-root input:visible, .v-input input:visible').first();
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function getComponentElement(frame: Frame, selector: string): Locator {
|
|
58
|
+
return frame.locator(selector).locator('visible=true').first();
|
|
59
|
+
}
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
import { test, expect } from '@playwright/test';
|
|
2
|
-
|
|
3
|
-
test.describe('Basic Storybook Test', () => {
|
|
4
|
-
test('can load storybook', async ({ page }) => {
|
|
5
|
-
await page.goto('http://localhost:7000', { timeout: 30000 });
|
|
6
|
-
await expect(page).toHaveTitle(/Storybook/);
|
|
7
|
-
});
|
|
8
|
-
|
|
9
|
-
test('can load a story directly', async ({ page }) => {
|
|
10
|
-
await page.goto('http://localhost:7000/?path=/story/wl-button--default', { timeout: 30000 });
|
|
11
|
-
|
|
12
|
-
// Wait for iframe
|
|
13
|
-
const iframe = page.locator('#storybook-preview-iframe');
|
|
14
|
-
await expect(iframe).toBeVisible({ timeout: 30000 });
|
|
15
|
-
|
|
16
|
-
// Get the frame
|
|
17
|
-
const frame = page.frame({ url: /iframe\.html/ });
|
|
18
|
-
expect(frame).toBeTruthy();
|
|
19
|
-
|
|
20
|
-
if (frame) {
|
|
21
|
-
// Wait for content
|
|
22
|
-
await frame.waitForSelector('body', { timeout: 10000 });
|
|
23
|
-
|
|
24
|
-
// Look for the actual component button, not Storybook controls
|
|
25
|
-
const componentRoot = frame.locator('#storybook-root').first();
|
|
26
|
-
await expect(componentRoot).toBeVisible({ timeout: 10000 });
|
|
27
|
-
|
|
28
|
-
// Now find the button within the component
|
|
29
|
-
const button = frame.locator('button.v-btn, button.wl-button').locator('visible=true').first();
|
|
30
|
-
await expect(button).toBeVisible({ timeout: 10000 });
|
|
31
|
-
await expect(button).toHaveText('Button');
|
|
32
|
-
}
|
|
33
|
-
});
|
|
1
|
+
import { test, expect } from '@playwright/test';
|
|
2
|
+
|
|
3
|
+
test.describe('Basic Storybook Test', () => {
|
|
4
|
+
test('can load storybook', async ({ page }) => {
|
|
5
|
+
await page.goto('http://localhost:7000', { timeout: 30000 });
|
|
6
|
+
await expect(page).toHaveTitle(/Storybook/);
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
test('can load a story directly', async ({ page }) => {
|
|
10
|
+
await page.goto('http://localhost:7000/?path=/story/wl-button--default', { timeout: 30000 });
|
|
11
|
+
|
|
12
|
+
// Wait for iframe
|
|
13
|
+
const iframe = page.locator('#storybook-preview-iframe');
|
|
14
|
+
await expect(iframe).toBeVisible({ timeout: 30000 });
|
|
15
|
+
|
|
16
|
+
// Get the frame
|
|
17
|
+
const frame = page.frame({ url: /iframe\.html/ });
|
|
18
|
+
expect(frame).toBeTruthy();
|
|
19
|
+
|
|
20
|
+
if (frame) {
|
|
21
|
+
// Wait for content
|
|
22
|
+
await frame.waitForSelector('body', { timeout: 10000 });
|
|
23
|
+
|
|
24
|
+
// Look for the actual component button, not Storybook controls
|
|
25
|
+
const componentRoot = frame.locator('#storybook-root').first();
|
|
26
|
+
await expect(componentRoot).toBeVisible({ timeout: 10000 });
|
|
27
|
+
|
|
28
|
+
// Now find the button within the component
|
|
29
|
+
const button = frame.locator('button.v-btn, button.wl-button').locator('visible=true').first();
|
|
30
|
+
await expect(button).toBeVisible({ timeout: 10000 });
|
|
31
|
+
await expect(button).toHaveText('Button');
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
34
|
});
|