dimsum-e2e-tests 3.80.0-next.36 → 3.80.0-next.38
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/CHANGELOG.md +8 -0
- package/ds-banner/DSBanner.text-resize.visual.spec.js +2 -0
- package/ds-banner/DSBannerCO.js +127 -0
- package/ds-banner/aria-and-role/DSBanner.aria-and-role.func.spec.js +113 -2
- package/ds-banner/slide-animation/DSBanner.slide-animation.func.spec.js +105 -0
- package/ds-banner/slots/DSBanner.slots.axe-core.func.spec.js +24 -0
- package/ds-banner/slots/DSBanner.slots.func.spec.js +7 -0
- package/ds-banner/slots/DSBanner.slots.visual.spec.js +2 -0
- package/ds-ribbon/DSRibbonCO.js +21 -0
- package/ds-ribbon/keyboard-accessible-row/DSRibbon.keyboard-accessible-row.visual.spec.js +40 -0
- package/ds-ribbon/wrap-columns/DSRibbon.wrap-columns.visual.spec.js +18 -0
- package/package.json +149 -149
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,14 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [3.80.0-next.38](/github.com/intcx/PLATFORM-UI/compare/v3.80.0-next.36...v3.80.0-next.38) (2026-10-09)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package dimsum-e2e-tests
|
|
9
|
+
|
|
10
|
+
## [3.80.0-next.37](/github.com/intcx/PLATFORM-UI/compare/v3.80.0-next.36...v3.80.0-next.37) (2026-10-09)
|
|
11
|
+
|
|
12
|
+
**Note:** Version bump only for package dimsum-e2e-tests
|
|
13
|
+
|
|
6
14
|
## [3.80.0-next.36](/github.com/intcx/PLATFORM-UI/compare/v3.80.0-next.35...v3.80.0-next.36) (2026-10-08)
|
|
7
15
|
|
|
8
16
|
**Note:** Version bump only for package dimsum-e2e-tests
|
|
@@ -11,6 +11,8 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
|
|
|
11
11
|
it('01: should display text resize in different layouts properly', async () => {
|
|
12
12
|
const banner = await DSBannerCO.getBannerByIndex();
|
|
13
13
|
await banner.waitForDisplayed();
|
|
14
|
+
// the banners are open on load and slide down for 500 ms
|
|
15
|
+
await DSBannerCO.waitForSlideToEnd();
|
|
14
16
|
const snapshot = await browser.percyCheckScreenshot();
|
|
15
17
|
await expect(snapshot).toEqual(0);
|
|
16
18
|
});
|
package/ds-banner/DSBannerCO.js
CHANGED
|
@@ -2,6 +2,12 @@ import { PATH_E2E_BANNER } from '../paths';
|
|
|
2
2
|
import { PageObject, Urlbuilder } from '../helpers';
|
|
3
3
|
|
|
4
4
|
export default class DSBannerCO extends PageObject {
|
|
5
|
+
// label/body rendered by the AriaLive* and RoleAlert E2E stories
|
|
6
|
+
static ANNOUNCEMENT_TITLE = 'Information: Read-only mode';
|
|
7
|
+
|
|
8
|
+
static ANNOUNCEMENT_BODY =
|
|
9
|
+
'You are viewing this page in read-only mode. Editing is currently disabled for your role.';
|
|
10
|
+
|
|
5
11
|
static basicURL = new Urlbuilder(PATH_E2E_BANNER, 'basic-test');
|
|
6
12
|
|
|
7
13
|
static infoURL = new Urlbuilder(PATH_E2E_BANNER, 'info-test');
|
|
@@ -36,6 +42,28 @@ export default class DSBannerCO extends PageObject {
|
|
|
36
42
|
|
|
37
43
|
static roleRegionTest = new Urlbuilder(PATH_E2E_BANNER, 'role-region-test');
|
|
38
44
|
|
|
45
|
+
static roleRegionNoAnnouncementTest = new Urlbuilder(PATH_E2E_BANNER, 'role-region-no-announcement-test');
|
|
46
|
+
|
|
47
|
+
static regionAccessibleNameTest = new Urlbuilder(PATH_E2E_BANNER, 'region-accessible-name-test');
|
|
48
|
+
|
|
49
|
+
// each banner in RegionAccessibleNameTest is wrapped in a div with a per-case data-testid
|
|
50
|
+
static async getRegionByCase(caseTestId) {
|
|
51
|
+
return $(`[data-testid="${caseTestId}"] [role="region"]`);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
static async getRegionNameAttributes(caseTestId) {
|
|
55
|
+
const region = await this.getRegionByCase(caseTestId);
|
|
56
|
+
return {
|
|
57
|
+
ariaLabel: await region.getAttribute('aria-label'),
|
|
58
|
+
ariaLabelledby: await region.getAttribute('aria-labelledby'),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// located by its parent slot, not by tag (the title tag is changing, PUI-19231)
|
|
63
|
+
static async getRegionTitleByCase(caseTestId) {
|
|
64
|
+
return $(`[data-testid="${caseTestId}"] [data-dimsum-parent-slot="dsBannerTitle"]`);
|
|
65
|
+
}
|
|
66
|
+
|
|
39
67
|
static async getButton() {
|
|
40
68
|
return $('[data-testid="ds-button"]');
|
|
41
69
|
}
|
|
@@ -43,6 +71,8 @@ export default class DSBannerCO extends PageObject {
|
|
|
43
71
|
static async openBanner() {
|
|
44
72
|
const button = await this.getButton();
|
|
45
73
|
await button.click();
|
|
74
|
+
// the banner slides down for 500 ms, the callers (visual snapshots included) expect it settled
|
|
75
|
+
await this.waitForSlideToEnd();
|
|
46
76
|
}
|
|
47
77
|
|
|
48
78
|
static async closeBanner() {
|
|
@@ -50,6 +80,73 @@ export default class DSBannerCO extends PageObject {
|
|
|
50
80
|
await closeBtn.click();
|
|
51
81
|
}
|
|
52
82
|
|
|
83
|
+
static async getPushedContent() {
|
|
84
|
+
return $('[data-testid="banner-pushed-content"]');
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
static async getPushedContentTop() {
|
|
88
|
+
return browser.execute(
|
|
89
|
+
() => document.querySelector('[data-testid="banner-pushed-content"]').getBoundingClientRect().top,
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// resolves once no banner has a running animation/transition (the slide down) or is in the DOM
|
|
94
|
+
static async waitForSlideToEnd() {
|
|
95
|
+
await browser.waitUntil(
|
|
96
|
+
async () =>
|
|
97
|
+
browser.execute(() =>
|
|
98
|
+
Array.from(document.querySelectorAll('[data-testid="ds-banner-container"]')).every(
|
|
99
|
+
(container) => container.getAnimations().length === 0,
|
|
100
|
+
),
|
|
101
|
+
),
|
|
102
|
+
{ timeoutMsg: 'the banner slide did not end' },
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Samples, on every animation frame and from the page (so the webdriver latency does not matter), the height of the
|
|
107
|
+
// banner container and the top of the content pushed by it. The click is triggered from the page right after the
|
|
108
|
+
// first sample, so the very first frames after it are recorded. action: 'open' | 'close'.
|
|
109
|
+
static async sampleSlide(action, durationMs = 1200) {
|
|
110
|
+
await browser.execute(
|
|
111
|
+
(actionToRun, duration) => {
|
|
112
|
+
const samples = [];
|
|
113
|
+
window.bannerSlideSampler = { samples, done: false };
|
|
114
|
+
const startedAt = performance.now();
|
|
115
|
+
const sample = () => {
|
|
116
|
+
const container = document.querySelector('[data-testid="ds-banner-container"]');
|
|
117
|
+
const pushed = document.querySelector('[data-testid="banner-pushed-content"]');
|
|
118
|
+
samples.push({
|
|
119
|
+
t: Math.round(performance.now() - startedAt),
|
|
120
|
+
height: container ? container.getBoundingClientRect().height : null,
|
|
121
|
+
pushedTop: pushed.getBoundingClientRect().top,
|
|
122
|
+
inert: container ? container.hasAttribute('inert') : null,
|
|
123
|
+
ariaHidden: container ? container.getAttribute('aria-hidden') : null,
|
|
124
|
+
focusInside: container ? container.contains(document.activeElement) : false,
|
|
125
|
+
});
|
|
126
|
+
};
|
|
127
|
+
sample();
|
|
128
|
+
if (actionToRun === 'open') document.querySelector('[data-testid="ds-button"]').click();
|
|
129
|
+
else {
|
|
130
|
+
const closeButton = document.querySelector('[data-testid="ds-banner-close-button"]');
|
|
131
|
+
closeButton.focus();
|
|
132
|
+
closeButton.click();
|
|
133
|
+
}
|
|
134
|
+
const tick = () => {
|
|
135
|
+
sample();
|
|
136
|
+
if (performance.now() - startedAt < duration) requestAnimationFrame(tick);
|
|
137
|
+
else window.bannerSlideSampler.done = true;
|
|
138
|
+
};
|
|
139
|
+
requestAnimationFrame(tick);
|
|
140
|
+
},
|
|
141
|
+
action,
|
|
142
|
+
durationMs,
|
|
143
|
+
);
|
|
144
|
+
await browser.waitUntil(async () => browser.execute(() => window.bannerSlideSampler.done), {
|
|
145
|
+
timeoutMsg: 'the slide sampler did not finish',
|
|
146
|
+
});
|
|
147
|
+
return browser.execute(() => window.bannerSlideSampler.samples);
|
|
148
|
+
}
|
|
149
|
+
|
|
53
150
|
static async getCloseButton() {
|
|
54
151
|
return $('[data-testid="ds-banner-close-button"]');
|
|
55
152
|
}
|
|
@@ -90,6 +187,36 @@ export default class DSBannerCO extends PageObject {
|
|
|
90
187
|
return $$('[data-dimsum-slot="dsButtonRoot"]')[index];
|
|
91
188
|
}
|
|
92
189
|
|
|
190
|
+
static async getCloseButtonSlotByIndex(index = 0) {
|
|
191
|
+
return $$('[data-dimsum-parent-slot="dsBannerCloseButton"]')[index];
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
static async getLiveRegionPortal() {
|
|
195
|
+
return $('[data-testid="ds-banner-live-region-portal"]');
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// the live region is visually hidden, so read textContent instead of the visible text
|
|
199
|
+
static async getLiveRegionText() {
|
|
200
|
+
const liveRegion = await this.getLiveRegionPortal();
|
|
201
|
+
return ((await liveRegion.getProperty('textContent')) || '').trim();
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
static async waitForLiveRegionText(expected) {
|
|
205
|
+
await browser.waitUntil(async () => (await this.getLiveRegionText()).includes(expected), {
|
|
206
|
+
timeoutMsg: `live region never contained "${expected}"`,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
static async waitForLiveRegionCleared() {
|
|
211
|
+
await browser.waitUntil(async () => (await this.getLiveRegionText()) === '', {
|
|
212
|
+
timeoutMsg: 'live region was not cleared after closing the banner',
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
static async getActiveElementTestId() {
|
|
217
|
+
return browser.execute(() => document.activeElement?.getAttribute('data-testid') ?? null);
|
|
218
|
+
}
|
|
219
|
+
|
|
93
220
|
static async getContainerSlotByIndex(index = 0) {
|
|
94
221
|
return $$('[data-dimsum-slot="dsBannerContainer"]')[index];
|
|
95
222
|
}
|
|
@@ -6,31 +6,76 @@ if (
|
|
|
6
6
|
browser.capabilities.browserName === 'chrome') ||
|
|
7
7
|
browser.capabilities.browserName === 'Chrome'
|
|
8
8
|
) {
|
|
9
|
+
// Announcement behaviour also covers PUI-17840 (banner announcement improvement)
|
|
9
10
|
describe('PUI-17537 - Banner - Aria Assertive -Func', () => {
|
|
10
11
|
before('loading page', async () => {
|
|
11
12
|
const errorOnGo = await DSBannerCO.ariaLiveAssertiveTest.go();
|
|
12
13
|
if (errorOnGo) throw errorOnGo;
|
|
13
14
|
});
|
|
14
|
-
it('01: should
|
|
15
|
+
it('01: should render an empty assertive live region before the banner opens', async () => {
|
|
16
|
+
const liveRegion = await DSBannerCO.getLiveRegionPortal();
|
|
17
|
+
await expect(liveRegion).toExist();
|
|
18
|
+
await expect(liveRegion).toHaveAttribute('aria-live', 'assertive');
|
|
19
|
+
await expect(liveRegion).toHaveAttribute('aria-atomic', 'true');
|
|
20
|
+
await expect(await DSBannerCO.getLiveRegionText()).toBe('');
|
|
21
|
+
});
|
|
22
|
+
it('02: should have aria-live="assertive" attribute on banner after trigger', async () => {
|
|
15
23
|
const triggerButton = await DSBannerCO.getButton();
|
|
16
24
|
await triggerButton.click();
|
|
17
25
|
const banner = await DSBannerCO.getBannerLiveRegionPortalSlotByIndex();
|
|
18
26
|
await banner.waitForDisplayed();
|
|
19
27
|
await expect(banner).toHaveAttribute('aria-live', 'assertive');
|
|
20
28
|
});
|
|
29
|
+
it('03: should announce title and body together without moving focus', async () => {
|
|
30
|
+
const liveRegion = await DSBannerCO.getLiveRegionPortal();
|
|
31
|
+
await DSBannerCO.waitForLiveRegionText(DSBannerCO.ANNOUNCEMENT_TITLE);
|
|
32
|
+
await expect(await DSBannerCO.getLiveRegionText()).toContain(DSBannerCO.ANNOUNCEMENT_BODY);
|
|
33
|
+
await expect(await liveRegion.$$('button, a').length).toBe(0);
|
|
34
|
+
const banner = await DSBannerCO.getBanner();
|
|
35
|
+
await expect(banner).not.toHaveAttribute('role');
|
|
36
|
+
await expect(await DSBannerCO.getActiveElementTestId()).toBe('ds-button');
|
|
37
|
+
});
|
|
38
|
+
it('04: should clear the live region on close and fill it again on reopen', async () => {
|
|
39
|
+
await DSBannerCO.closeBanner();
|
|
40
|
+
await DSBannerCO.waitForLiveRegionCleared();
|
|
41
|
+
await DSBannerCO.openBanner();
|
|
42
|
+
await DSBannerCO.waitForLiveRegionText(DSBannerCO.ANNOUNCEMENT_TITLE);
|
|
43
|
+
});
|
|
21
44
|
});
|
|
22
45
|
describe('PUI-17538 - Banner - Aria Polite -Func', () => {
|
|
23
46
|
before('loading page', async () => {
|
|
24
47
|
const errorOnGo = await DSBannerCO.ariaLivePoliteTest.go();
|
|
25
48
|
if (errorOnGo) throw errorOnGo;
|
|
26
49
|
});
|
|
27
|
-
it('01: should
|
|
50
|
+
it('01: should render an empty polite live region before the banner opens', async () => {
|
|
51
|
+
const liveRegion = await DSBannerCO.getLiveRegionPortal();
|
|
52
|
+
await expect(liveRegion).toExist();
|
|
53
|
+
await expect(liveRegion).toHaveAttribute('aria-live', 'polite');
|
|
54
|
+
await expect(liveRegion).toHaveAttribute('aria-atomic', 'true');
|
|
55
|
+
await expect(await DSBannerCO.getLiveRegionText()).toBe('');
|
|
56
|
+
});
|
|
57
|
+
it('02: should have aria-live="polite" attribute on banner after trigger', async () => {
|
|
28
58
|
const triggerButton = await DSBannerCO.getButton();
|
|
29
59
|
await triggerButton.click();
|
|
30
60
|
const banner = await DSBannerCO.getBannerLiveRegionPortalSlotByIndex();
|
|
31
61
|
await banner.waitForDisplayed();
|
|
32
62
|
await expect(banner).toHaveAttribute('aria-live', 'polite');
|
|
33
63
|
});
|
|
64
|
+
it('03: should announce title and body together without moving focus', async () => {
|
|
65
|
+
const liveRegion = await DSBannerCO.getLiveRegionPortal();
|
|
66
|
+
await DSBannerCO.waitForLiveRegionText(DSBannerCO.ANNOUNCEMENT_TITLE);
|
|
67
|
+
await expect(await DSBannerCO.getLiveRegionText()).toContain(DSBannerCO.ANNOUNCEMENT_BODY);
|
|
68
|
+
await expect(await liveRegion.$$('button, a').length).toBe(0);
|
|
69
|
+
const banner = await DSBannerCO.getBanner();
|
|
70
|
+
await expect(banner).not.toHaveAttribute('role');
|
|
71
|
+
await expect(await DSBannerCO.getActiveElementTestId()).toBe('ds-button');
|
|
72
|
+
});
|
|
73
|
+
it('04: should clear the live region on close and fill it again on reopen', async () => {
|
|
74
|
+
await DSBannerCO.closeBanner();
|
|
75
|
+
await DSBannerCO.waitForLiveRegionCleared();
|
|
76
|
+
await DSBannerCO.openBanner();
|
|
77
|
+
await DSBannerCO.waitForLiveRegionText(DSBannerCO.ANNOUNCEMENT_TITLE);
|
|
78
|
+
});
|
|
34
79
|
});
|
|
35
80
|
describe('PUI-17539 - Banner - Role Alert -Func', () => {
|
|
36
81
|
before('loading page', async () => {
|
|
@@ -44,6 +89,15 @@ if (
|
|
|
44
89
|
await banner.waitForDisplayed();
|
|
45
90
|
await expect(banner).toHaveAttribute('role', 'alert');
|
|
46
91
|
});
|
|
92
|
+
it('02: should announce title and body in the alert without moving focus', async () => {
|
|
93
|
+
const banner = await DSBannerCO.getBanner();
|
|
94
|
+
await expect(banner).toHaveText(expect.stringContaining(DSBannerCO.ANNOUNCEMENT_TITLE));
|
|
95
|
+
await expect(banner).toHaveText(expect.stringContaining(DSBannerCO.ANNOUNCEMENT_BODY));
|
|
96
|
+
await expect(await banner.$$('button, a').length).toBe(0);
|
|
97
|
+
const liveRegion = await DSBannerCO.getLiveRegionPortal();
|
|
98
|
+
await expect(liveRegion).not.toExist();
|
|
99
|
+
await expect(await DSBannerCO.getActiveElementTestId()).toBe('ds-button');
|
|
100
|
+
});
|
|
47
101
|
});
|
|
48
102
|
describe('PUI-17540 - Banner - Role Region and Alert -Func', () => {
|
|
49
103
|
before('loading page', async () => {
|
|
@@ -60,4 +114,61 @@ if (
|
|
|
60
114
|
await expect(banner).toHaveAttribute('role', 'alert');
|
|
61
115
|
});
|
|
62
116
|
});
|
|
117
|
+
// Documented action-link setup (isPageNotice + withLiveRegionAnnouncement="none"), PUI-17840
|
|
118
|
+
describe('PUI-19264 - DSBanner:: region without live announcement - Func', () => {
|
|
119
|
+
before('loading page', async () => {
|
|
120
|
+
const errorOnGo = await DSBannerCO.roleRegionNoAnnouncementTest.go();
|
|
121
|
+
if (errorOnGo) throw errorOnGo;
|
|
122
|
+
});
|
|
123
|
+
it('01: should render a page region that is not announced automatically', async () => {
|
|
124
|
+
const bannerContainer = await DSBannerCO.getBannerContainer();
|
|
125
|
+
await bannerContainer.waitForDisplayed();
|
|
126
|
+
await expect(bannerContainer).toHaveAttribute('role', 'region');
|
|
127
|
+
await expect(await $$('[role="alert"]').length).toBe(0);
|
|
128
|
+
const liveRegion = await DSBannerCO.getLiveRegionPortal();
|
|
129
|
+
await expect(liveRegion).not.toExist();
|
|
130
|
+
const actionLink = await DSBannerCO.getActionLink();
|
|
131
|
+
await expect(actionLink).toHaveAttribute('href');
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
// Tests for the fix introduced in PUI-19088 (isPageNotice region had no accessible name)
|
|
135
|
+
describe('PUI-19265 - DSBanner:: page notice region accessible name - Func', () => {
|
|
136
|
+
before('loading page', async () => {
|
|
137
|
+
const errorOnGo = await DSBannerCO.regionAccessibleNameTest.go();
|
|
138
|
+
if (errorOnGo) throw errorOnGo;
|
|
139
|
+
});
|
|
140
|
+
it('01: should name each page notice region from its title, its label or the consumer name', async () => {
|
|
141
|
+
const defaultRegion = await DSBannerCO.getRegionByCase('region-default-name');
|
|
142
|
+
await defaultRegion.waitForDisplayed();
|
|
143
|
+
const defaultTitle = await DSBannerCO.getRegionTitleByCase('region-default-name');
|
|
144
|
+
const defaultTitleId = await defaultTitle.getAttribute('id');
|
|
145
|
+
await expect(defaultTitleId).toBeTruthy();
|
|
146
|
+
await expect(defaultTitle).toHaveText('Default name from title');
|
|
147
|
+
await expect(await DSBannerCO.getRegionNameAttributes('region-default-name')).toEqual({
|
|
148
|
+
ariaLabel: null,
|
|
149
|
+
ariaLabelledby: defaultTitleId,
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
const secondTitle = await DSBannerCO.getRegionTitleByCase('region-second-default-name');
|
|
153
|
+
const secondTitleId = await secondTitle.getAttribute('id');
|
|
154
|
+
await expect(secondTitleId).not.toBe(defaultTitleId);
|
|
155
|
+
await expect(await DSBannerCO.getRegionNameAttributes('region-second-default-name')).toEqual({
|
|
156
|
+
ariaLabel: null,
|
|
157
|
+
ariaLabelledby: secondTitleId,
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
await expect(await DSBannerCO.getRegionNameAttributes('region-custom-body')).toEqual({
|
|
161
|
+
ariaLabel: 'Custom body label',
|
|
162
|
+
ariaLabelledby: null,
|
|
163
|
+
});
|
|
164
|
+
await expect(await DSBannerCO.getRegionNameAttributes('region-slot-name')).toEqual({
|
|
165
|
+
ariaLabel: 'Name from container slot',
|
|
166
|
+
ariaLabelledby: null,
|
|
167
|
+
});
|
|
168
|
+
await expect(await DSBannerCO.getRegionNameAttributes('region-container-props-name')).toEqual({
|
|
169
|
+
ariaLabel: 'Name from containerProps',
|
|
170
|
+
ariaLabelledby: null,
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
});
|
|
63
174
|
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import DSBannerCO from '../DSBannerCO';
|
|
2
|
+
|
|
3
|
+
// the samples come from the page (requestAnimationFrame), so these tolerances only absorb the machine speed
|
|
4
|
+
const MOTION_MS = 500;
|
|
5
|
+
const MIN_END_MS = MOTION_MS * 0.7;
|
|
6
|
+
const MAX_END_MS = MOTION_MS * 2;
|
|
7
|
+
const MIN_INTERMEDIATE_FRAMES = 5;
|
|
8
|
+
const PX_TOLERANCE = 1;
|
|
9
|
+
|
|
10
|
+
const isIntermediate = (height, fullHeight) => height > PX_TOLERANCE && height < fullHeight - PX_TOLERANCE;
|
|
11
|
+
const heights = (samples) => samples.map(({ height }) => height).filter((height) => height !== null);
|
|
12
|
+
// the frames of the motion: from the first one that is clearly collapsed. Some engines report, in the sampler's very
|
|
13
|
+
// first frame, the size of a layout flushed before their first rendering update (the banner never paints like that)
|
|
14
|
+
const getMotionFrames = (samples, fullHeight) => {
|
|
15
|
+
const start = samples.findIndex(({ height }) => height !== null && height < fullHeight * 0.5);
|
|
16
|
+
return start === -1 ? [] : samples.slice(start);
|
|
17
|
+
};
|
|
18
|
+
const isMonotonic = (values, direction) =>
|
|
19
|
+
values.every((value, index) => index === 0 || (value - values[index - 1]) * direction >= -PX_TOLERANCE);
|
|
20
|
+
|
|
21
|
+
// Banner spec v2, "Motion and Animation": the banner slides down (open) and up (close) in 500 ms, pushing the content
|
|
22
|
+
// below gradually. Tests for the fix introduced in PUI-19232 (the slide was not rendered).
|
|
23
|
+
if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
|
|
24
|
+
describe('PUI-XXXXX - Banner:: open and close slide animation (500 ms) - Func', () => {
|
|
25
|
+
let openSamples;
|
|
26
|
+
let openFrames;
|
|
27
|
+
let closeSamples;
|
|
28
|
+
let closedPushedTop;
|
|
29
|
+
let fullHeight;
|
|
30
|
+
|
|
31
|
+
before('loading page', async () => {
|
|
32
|
+
const errorOnGo = await DSBannerCO.pushesContentURL.go();
|
|
33
|
+
if (errorOnGo) throw errorOnGo;
|
|
34
|
+
closedPushedTop = await DSBannerCO.getPushedContentTop();
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it('01: should grow the banner gradually from 0 to its full height when opening', async () => {
|
|
38
|
+
openSamples = await DSBannerCO.sampleSlide('open');
|
|
39
|
+
const withBanner = openSamples.filter(({ height }) => height !== null);
|
|
40
|
+
fullHeight = withBanner[withBanner.length - 1].height;
|
|
41
|
+
expect(fullHeight).toBeGreaterThan(50);
|
|
42
|
+
// not at full height from the start: there are frames in which the banner is (almost) collapsed
|
|
43
|
+
openFrames = getMotionFrames(openSamples, fullHeight);
|
|
44
|
+
expect(openFrames.length).toBeGreaterThan(0);
|
|
45
|
+
expect(openFrames[0].height).toBeLessThan(fullHeight * 0.25);
|
|
46
|
+
// several frames in between and never shrinking
|
|
47
|
+
expect(heights(openFrames).filter((height) => isIntermediate(height, fullHeight)).length).toBeGreaterThanOrEqual(
|
|
48
|
+
MIN_INTERMEDIATE_FRAMES,
|
|
49
|
+
);
|
|
50
|
+
expect(isMonotonic(heights(openFrames), 1)).toBe(true);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it('02: should take about 500 ms to reach the full height when opening', async () => {
|
|
54
|
+
const reached = openFrames.find(({ height }) => height >= fullHeight - PX_TOLERANCE);
|
|
55
|
+
expect(reached.t).toBeGreaterThanOrEqual(MIN_END_MS);
|
|
56
|
+
expect(reached.t).toBeLessThanOrEqual(MAX_END_MS);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('03: should push the content below gradually and in sync with the banner when opening', async () => {
|
|
60
|
+
const pushedTops = openFrames.map(({ pushedTop }) => pushedTop);
|
|
61
|
+
expect(isMonotonic(pushedTops, 1)).toBe(true);
|
|
62
|
+
expect(
|
|
63
|
+
pushedTops.filter((top) => isIntermediate(top - closedPushedTop, fullHeight)).length,
|
|
64
|
+
).toBeGreaterThanOrEqual(MIN_INTERMEDIATE_FRAMES);
|
|
65
|
+
openFrames.forEach(({ height, pushedTop }) => expect(pushedTop - closedPushedTop).toBeCloseTo(height, 0));
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('04: should keep the banner in the document, closed for everyone, while it slides up', async () => {
|
|
69
|
+
closeSamples = await DSBannerCO.sampleSlide('close');
|
|
70
|
+
// not removed on the first frame
|
|
71
|
+
expect(closeSamples.filter(({ height }) => height !== null).length).toBeGreaterThan(MIN_INTERMEDIATE_FRAMES);
|
|
72
|
+
expect(closeSamples[1].height).toBeGreaterThan(fullHeight * 0.5);
|
|
73
|
+
// from the first rendered frame after the click: not exposed and not interactive
|
|
74
|
+
const sliding = closeSamples.filter(({ height, t }) => height !== null && t > 0);
|
|
75
|
+
sliding.forEach(({ inert, ariaHidden }) => {
|
|
76
|
+
expect(inert).toBe(true);
|
|
77
|
+
expect(ariaHidden).toBe('true');
|
|
78
|
+
});
|
|
79
|
+
// the close button had focus: once inert the focus is not inside the banner anymore
|
|
80
|
+
closeSamples
|
|
81
|
+
.filter(({ height, t }) => height !== null && t > 100)
|
|
82
|
+
.forEach(({ focusInside }) => expect(focusInside).toBe(false));
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it('05: should collapse gradually and be removed after about 500 ms when closing', async () => {
|
|
86
|
+
expect(isMonotonic(heights(closeSamples), -1)).toBe(true);
|
|
87
|
+
expect(
|
|
88
|
+
heights(closeSamples).filter((height) => isIntermediate(height, fullHeight)).length,
|
|
89
|
+
).toBeGreaterThanOrEqual(MIN_INTERMEDIATE_FRAMES);
|
|
90
|
+
const removed = closeSamples.find(({ height }) => height === null);
|
|
91
|
+
expect(removed.t).toBeGreaterThanOrEqual(MIN_END_MS);
|
|
92
|
+
expect(removed.t).toBeLessThanOrEqual(MAX_END_MS);
|
|
93
|
+
await expect(await DSBannerCO.getBannerContainer()).not.toExist();
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it('06: should move the content below back gradually when closing', async () => {
|
|
97
|
+
const pushedTops = closeSamples.map(({ pushedTop }) => pushedTop);
|
|
98
|
+
expect(isMonotonic(pushedTops, -1)).toBe(true);
|
|
99
|
+
expect(
|
|
100
|
+
pushedTops.filter((top) => isIntermediate(top - closedPushedTop, fullHeight)).length,
|
|
101
|
+
).toBeGreaterThanOrEqual(MIN_INTERMEDIATE_FRAMES);
|
|
102
|
+
expect(pushedTops[pushedTops.length - 1]).toBeCloseTo(closedPushedTop, 0);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import DSBannerCO from '../DSBannerCO';
|
|
2
|
+
import { axeCoreCheck } from '../../helpers';
|
|
3
|
+
|
|
4
|
+
if (
|
|
5
|
+
(!browser.capabilities['ice:options'].isPhone &&
|
|
6
|
+
!browser.capabilities['ice:options'].isTablet &&
|
|
7
|
+
browser.capabilities.browserName === 'chrome') ||
|
|
8
|
+
browser.capabilities.browserName === 'Chrome'
|
|
9
|
+
) {
|
|
10
|
+
// Coverage for PUI-17935 (slots implementation and Dimsum slot compliance)
|
|
11
|
+
describe('PUI-19263 - DSBanner:: slots theming - AxeCore', () => {
|
|
12
|
+
before('loading page', async () => {
|
|
13
|
+
const errorOnGo = await DSBannerCO.slotsTest.go();
|
|
14
|
+
if (errorOnGo) throw errorOnGo;
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('01: should display the banners customized using slots and pass axecore test', async () => {
|
|
18
|
+
const banner = await DSBannerCO.getContainerSlotByIndex();
|
|
19
|
+
await banner.waitForDisplayed();
|
|
20
|
+
const result = await axeCoreCheck();
|
|
21
|
+
expect(result.length).toBe(0);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
}
|
|
@@ -30,6 +30,9 @@ if (
|
|
|
30
30
|
await expect(bannerButtonSlot).toBeDisplayed();
|
|
31
31
|
await expect(bannerLayoutSlot).toBeDisplayed();
|
|
32
32
|
await expect(bannerActionLinkSlot).toBeDisplayed();
|
|
33
|
+
// PUI-17935: the close button exposes its parent slot (nested DSButton)
|
|
34
|
+
const bannerCloseButtonSlot = await DSBannerCO.getCloseButtonSlotByIndex();
|
|
35
|
+
await expect(bannerCloseButtonSlot).toBeDisplayed();
|
|
33
36
|
});
|
|
34
37
|
it('02: should find custom aria for each SLOT', async () => {
|
|
35
38
|
const bannerTitleSlot = await DSBannerCO.getTitleSlotByIndex();
|
|
@@ -48,6 +51,8 @@ if (
|
|
|
48
51
|
await expect(bannerIconsSlots).toHaveAttribute('aria-label', 'im iconcontainer aria');
|
|
49
52
|
await expect(bannerButtonSlot).toHaveAttribute('aria-label', 'im closebutton aria');
|
|
50
53
|
await expect(bannerActionLinkSlot).toHaveAttribute('aria-label', 'im actionlink aria');
|
|
54
|
+
const bannerCloseButtonSlot = await DSBannerCO.getCloseButtonSlotByIndex();
|
|
55
|
+
await expect(bannerCloseButtonSlot).toHaveAttribute('aria-label', 'im closebutton aria');
|
|
51
56
|
});
|
|
52
57
|
it('03: should find custom data for each SLOT', async () => {
|
|
53
58
|
const bannerTitleSlot = await DSBannerCO.getTitleSlotByIndex();
|
|
@@ -66,6 +71,8 @@ if (
|
|
|
66
71
|
await expect(bannerIconsSlots).toHaveAttribute('data-testid', 'im iconcontainer data');
|
|
67
72
|
await expect(bannerButtonSlot).toHaveAttribute('data-testid', 'im closebutton data');
|
|
68
73
|
await expect(bannerActionLinkSlot).toHaveAttribute('data-testid', 'im actionlink data');
|
|
74
|
+
const bannerCloseButtonSlot = await DSBannerCO.getCloseButtonSlotByIndex();
|
|
75
|
+
await expect(bannerCloseButtonSlot).toHaveAttribute('data-testid', 'im closebutton data');
|
|
69
76
|
});
|
|
70
77
|
});
|
|
71
78
|
}
|
|
@@ -9,6 +9,8 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
|
|
|
9
9
|
it('should display the banners customized using slots', async () => {
|
|
10
10
|
const banner = await DSBannerCO.getContainerSlotByIndex();
|
|
11
11
|
await banner.waitForDisplayed();
|
|
12
|
+
// the banners are open on load and slide down for 500 ms
|
|
13
|
+
await DSBannerCO.waitForSlideToEnd();
|
|
12
14
|
const snapshot = await browser.percyCheckScreenshot();
|
|
13
15
|
await expect(snapshot).toEqual(0);
|
|
14
16
|
});
|
package/ds-ribbon/DSRibbonCO.js
CHANGED
|
@@ -12,6 +12,10 @@ export default class DSRibbonCO extends PageObject {
|
|
|
12
12
|
|
|
13
13
|
static themingURL = new Urlbuilder(PATH_E2E_RIBBON, 'theming-test');
|
|
14
14
|
|
|
15
|
+
static wrapColumnsURL = new Urlbuilder(PATH_E2E_RIBBON, 'wrap-columns-test');
|
|
16
|
+
|
|
17
|
+
static keyboardAccessibleRowURL = new Urlbuilder(PATH_E2E_RIBBON, 'keyboard-accessible-row-test');
|
|
18
|
+
|
|
15
19
|
static async getRibbon() {
|
|
16
20
|
return $('[data-testid="button-wrapper"]');
|
|
17
21
|
}
|
|
@@ -91,6 +95,23 @@ export default class DSRibbonCO extends PageObject {
|
|
|
91
95
|
return $('[data-testid="ribbon-card-theming"]');
|
|
92
96
|
}
|
|
93
97
|
|
|
98
|
+
// Wrap Columns / Keyboard Accessible Row selectors
|
|
99
|
+
static async getRowInContainer(containerTestId) {
|
|
100
|
+
return $(`[data-testid="${containerTestId}"] [data-dimsum-slot="dsRibbonRibbonRow"]`);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
static async getWrapColumnsRow() {
|
|
104
|
+
return DSRibbonCO.getRowInContainer('ribbon-wrap-columns-container');
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
static async getFocusableRow() {
|
|
108
|
+
return DSRibbonCO.getRowInContainer('ribbon-focusable-row-container');
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
static async getExpandProcessedBtn() {
|
|
112
|
+
return $('[data-testid="expand-processed-btn"]');
|
|
113
|
+
}
|
|
114
|
+
|
|
94
115
|
// Snapshots
|
|
95
116
|
static snapshotPath(example = 'basic') {
|
|
96
117
|
return PageObject.getSnapshotPathBuilder('Ribbon', example, 'ds-modal');
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Key } from 'webdriverio';
|
|
2
|
+
import DSRibbonCO from '../DSRibbonCO';
|
|
3
|
+
|
|
4
|
+
// Kept at module scope so the waitUntil below stays within the max-nested-callbacks limit.
|
|
5
|
+
const readScrollLeft = (el) => el.scrollLeft;
|
|
6
|
+
|
|
7
|
+
if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
|
|
8
|
+
// Tests for the fix introduced in PUI-19188 (scrolling row had no tabindex and could not be reached by keyboard)
|
|
9
|
+
describe('PUI-19230 - DSRibbon:: scrolling row keyboard access - Visual', () => {
|
|
10
|
+
before('loading page', async () => {
|
|
11
|
+
const errorOnGo = await DSRibbonCO.keyboardAccessibleRowURL.go();
|
|
12
|
+
if (errorOnGo) throw errorOnGo;
|
|
13
|
+
const row = await DSRibbonCO.getFocusableRow();
|
|
14
|
+
await row.waitForDisplayed();
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('01: should display the focus indicator on the scrolling row', async () => {
|
|
18
|
+
await browser.keys(Key.Tab);
|
|
19
|
+
const row = await DSRibbonCO.getFocusableRow();
|
|
20
|
+
await expect(row).toBeFocused();
|
|
21
|
+
// The row advertises "use the arrow keys to reach the remaining columns", so drive that before
|
|
22
|
+
// the snapshot: arrow keys keep focus on the row, so the Tab in 02 still reaches the button.
|
|
23
|
+
const scrollLeftBefore = await browser.execute(readScrollLeft, row);
|
|
24
|
+
await browser.keys(Key.ArrowRight);
|
|
25
|
+
await browser.waitUntil(async () => (await browser.execute(readScrollLeft, row)) > scrollLeftBefore, {
|
|
26
|
+
timeoutMsg: 'expected ArrowRight to scroll the focused row towards the off-screen columns',
|
|
27
|
+
});
|
|
28
|
+
const snapshot = await browser.percyCheckScreenshot();
|
|
29
|
+
await expect(snapshot).toEqual(0);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('02: should display the off-screen button scrolled into view with focus', async () => {
|
|
33
|
+
await browser.keys(Key.Tab);
|
|
34
|
+
const btn = await DSRibbonCO.getExpandProcessedBtn();
|
|
35
|
+
await expect(btn).toBeFocused();
|
|
36
|
+
const snapshot = await browser.percyCheckScreenshot();
|
|
37
|
+
await expect(snapshot).toEqual(0);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import DSRibbonCO from '../DSRibbonCO';
|
|
2
|
+
|
|
3
|
+
if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
|
|
4
|
+
// Tests for the fix introduced in PUI-19188 (row scrolled at narrow widths, off-screen columns unreachable)
|
|
5
|
+
describe('PUI-19229 - DSRibbon:: wrapColumns row wrapping - Visual', () => {
|
|
6
|
+
before('loading page', async () => {
|
|
7
|
+
const errorOnGo = await DSRibbonCO.wrapColumnsURL.go();
|
|
8
|
+
if (errorOnGo) throw errorOnGo;
|
|
9
|
+
const row = await DSRibbonCO.getWrapColumnsRow();
|
|
10
|
+
await row.waitForDisplayed();
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it('01: should display the default scrolling row and the wrapped row', async () => {
|
|
14
|
+
const snapshot = await browser.percyCheckScreenshot();
|
|
15
|
+
await expect(snapshot).toEqual(0);
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
}
|
package/package.json
CHANGED
|
@@ -1,100 +1,100 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "dimsum-e2e-tests",
|
|
4
|
-
"version": "3.80.0-next.
|
|
4
|
+
"version": "3.80.0-next.38",
|
|
5
5
|
"description": "End-to-end tests for dimsum library",
|
|
6
6
|
"dependencies": {
|
|
7
|
-
"@elliemae/ds-accessibility": "3.80.0-next.
|
|
8
|
-
"@elliemae/ds-accordion": "3.80.0-next.
|
|
9
|
-
"@elliemae/ds-app-picker": "3.80.0-next.
|
|
10
|
-
"@elliemae/ds-backdrop": "3.80.0-next.
|
|
11
|
-
"@elliemae/ds-banner": "3.80.0-next.
|
|
12
|
-
"@elliemae/ds-basic": "3.80.0-next.
|
|
13
|
-
"@elliemae/ds-breadcrumb": "3.80.0-next.
|
|
14
|
-
"@elliemae/ds-button-v2": "3.80.0-next.
|
|
15
|
-
"@elliemae/ds-card": "3.80.0-next.
|
|
16
|
-
"@elliemae/ds-card-navigation": "3.80.0-next.
|
|
17
|
-
"@elliemae/ds-card-v1": "3.80.0-next.
|
|
18
|
-
"@elliemae/ds-card-v1-detail": "3.80.0-next.
|
|
19
|
-
"@elliemae/ds-card-v2": "3.80.0-next.
|
|
20
|
-
"@elliemae/ds-card-v2-action-addon": "3.80.0-next.
|
|
21
|
-
"@elliemae/ds-card-v2-group": "3.80.0-next.
|
|
22
|
-
"@elliemae/ds-card-v3": "3.80.0-next.
|
|
23
|
-
"@elliemae/ds-card-v3-poc": "3.80.0-next.
|
|
24
|
-
"@elliemae/ds-chat": "3.80.0-next.
|
|
25
|
-
"@elliemae/ds-chat-bubble": "3.80.0-next.
|
|
26
|
-
"@elliemae/ds-chat-card": "3.80.0-next.
|
|
27
|
-
"@elliemae/ds-chat-container": "3.80.0-next.
|
|
28
|
-
"@elliemae/ds-chat-container-header": "3.80.0-next.
|
|
29
|
-
"@elliemae/ds-chat-empty-state": "3.80.0-next.
|
|
30
|
-
"@elliemae/ds-chat-floating-button": "3.80.0-next.
|
|
31
|
-
"@elliemae/ds-chat-message-delimeter": "3.80.0-next.
|
|
32
|
-
"@elliemae/ds-chat-sidebar": "3.80.0-next.
|
|
33
|
-
"@elliemae/ds-chat-system-message": "3.80.0-next.
|
|
34
|
-
"@elliemae/ds-chat-tile": "3.80.0-next.
|
|
35
|
-
"@elliemae/ds-chip": "3.80.0-next.
|
|
36
|
-
"@elliemae/ds-circular-progress-indicator": "3.80.0-next.
|
|
37
|
-
"@elliemae/ds-classnames": "3.80.0-next.
|
|
38
|
-
"@elliemae/ds-codeeditor": "3.80.0-next.
|
|
39
|
-
"@elliemae/ds-comments": "3.80.0-next.
|
|
40
|
-
"@elliemae/ds-controlled-form": "3.80.0-next.
|
|
41
|
-
"@elliemae/ds-csv-converter": "3.80.0-next.
|
|
42
|
-
"@elliemae/ds-data-table": "3.80.0-next.
|
|
43
|
-
"@elliemae/ds-data-table-action-cell": "3.80.0-next.
|
|
44
|
-
"@elliemae/ds-data-table-cell": "3.80.0-next.
|
|
45
|
-
"@elliemae/ds-data-table-cell-header": "3.80.0-next.
|
|
46
|
-
"@elliemae/ds-data-table-drag-and-drop-cell": "3.80.0-next.
|
|
47
|
-
"@elliemae/ds-data-table-expand-cell": "3.80.0-next.
|
|
48
|
-
"@elliemae/ds-data-table-filters": "3.80.0-next.
|
|
49
|
-
"@elliemae/ds-data-table-multi-select-cell": "3.80.0-next.
|
|
50
|
-
"@elliemae/ds-data-table-single-select-cell": "3.80.0-next.
|
|
51
|
-
"@elliemae/ds-dataviz": "3.80.0-next.
|
|
52
|
-
"@elliemae/ds-dataviz-pie": "3.80.0-next.
|
|
53
|
-
"@elliemae/ds-date-time-picker": "3.80.0-next.
|
|
54
|
-
"@elliemae/ds-decision-graph": "3.80.0-next.
|
|
55
|
-
"@elliemae/ds-dialog": "3.80.0-next.
|
|
56
|
-
"@elliemae/ds-drag-and-drop": "3.80.0-next.
|
|
57
|
-
"@elliemae/ds-dropdownmenu-v2": "3.80.0-next.
|
|
58
|
-
"@elliemae/ds-dropzone": "3.80.0-next.
|
|
59
|
-
"@elliemae/ds-fast-list": "3.80.0-next.
|
|
60
|
-
"@elliemae/ds-filter-bar": "3.80.0-next.
|
|
61
|
-
"@elliemae/ds-floating-context": "3.80.0-next.
|
|
62
|
-
"@elliemae/ds-form-checkbox": "3.80.0-next.
|
|
63
|
-
"@elliemae/ds-form-combobox": "3.80.0-next.
|
|
64
|
-
"@elliemae/ds-form-date-range-picker": "3.80.0-next.
|
|
65
|
-
"@elliemae/ds-form-date-time-picker": "3.80.0-next.
|
|
66
|
-
"@elliemae/ds-form-helpers-mask-hooks": "3.80.0-next.
|
|
67
|
-
"@elliemae/ds-form-input-text": "3.80.0-next.
|
|
68
|
-
"@elliemae/ds-form-input-textarea": "3.80.0-next.
|
|
69
|
-
"@elliemae/ds-form-layout-autocomplete": "3.80.0-next.
|
|
70
|
-
"@elliemae/ds-form-layout-blocks": "3.80.0-next.
|
|
71
|
-
"@elliemae/ds-form-layout-input-group": "3.80.0-next.
|
|
72
|
-
"@elliemae/ds-form-layout-label": "3.80.0-next.
|
|
73
|
-
"@elliemae/ds-form-multi-combobox": "3.80.0-next.
|
|
74
|
-
"@elliemae/ds-form-native-select": "3.80.0-next.
|
|
75
|
-
"@elliemae/ds-form-radio": "3.80.0-next.
|
|
76
|
-
"@elliemae/ds-form-select": "3.80.0-next.
|
|
77
|
-
"@elliemae/ds-form-single-combobox": "3.80.0-next.
|
|
78
|
-
"@elliemae/ds-form-toggle": "3.80.0-next.
|
|
79
|
-
"@elliemae/ds-global-header": "3.80.0-next.
|
|
80
|
-
"@elliemae/ds-grid": "3.80.0-next.
|
|
81
|
-
"@elliemae/ds-hooks-focus-stack": "3.80.0-next.
|
|
82
|
-
"@elliemae/ds-hooks-focus-trap": "3.80.0-next.
|
|
83
|
-
"@elliemae/ds-hooks-fontsize-detector": "3.80.0-next.
|
|
84
|
-
"@elliemae/ds-hooks-fontsize-media": "3.80.0-next.
|
|
85
|
-
"@elliemae/ds-hooks-headless-tooltip": "3.80.0-next.
|
|
86
|
-
"@elliemae/ds-hooks-is-mobile": "3.80.0-next.
|
|
87
|
-
"@elliemae/ds-hooks-is-showing-ellipsis": "3.80.0-next.
|
|
88
|
-
"@elliemae/ds-hooks-keyboard-navigation": "3.80.0-next.
|
|
89
|
-
"@elliemae/ds-hooks-on-blur-out": "3.80.0-next.
|
|
90
|
-
"@elliemae/ds-hooks-on-first-focus-in": "3.80.0-next.
|
|
91
|
-
"@elliemae/ds-icon": "3.80.0-next.
|
|
92
|
-
"@elliemae/ds-icons": "3.80.0-next.
|
|
93
|
-
"@elliemae/ds-image": "3.80.0-next.
|
|
94
|
-
"@elliemae/ds-imagelibrarymodal": "3.80.0-next.
|
|
95
|
-
"@elliemae/ds-indeterminate-progress-indicator": "3.80.0-next.
|
|
96
|
-
"@elliemae/ds-layout-provider": "3.80.0-next.
|
|
97
|
-
"@elliemae/ds-left-navigation": "3.80.0-next.
|
|
7
|
+
"@elliemae/ds-accessibility": "3.80.0-next.38",
|
|
8
|
+
"@elliemae/ds-accordion": "3.80.0-next.38",
|
|
9
|
+
"@elliemae/ds-app-picker": "3.80.0-next.38",
|
|
10
|
+
"@elliemae/ds-backdrop": "3.80.0-next.38",
|
|
11
|
+
"@elliemae/ds-banner": "3.80.0-next.38",
|
|
12
|
+
"@elliemae/ds-basic": "3.80.0-next.38",
|
|
13
|
+
"@elliemae/ds-breadcrumb": "3.80.0-next.38",
|
|
14
|
+
"@elliemae/ds-button-v2": "3.80.0-next.38",
|
|
15
|
+
"@elliemae/ds-card": "3.80.0-next.38",
|
|
16
|
+
"@elliemae/ds-card-navigation": "3.80.0-next.38",
|
|
17
|
+
"@elliemae/ds-card-v1": "3.80.0-next.38",
|
|
18
|
+
"@elliemae/ds-card-v1-detail": "3.80.0-next.38",
|
|
19
|
+
"@elliemae/ds-card-v2": "3.80.0-next.38",
|
|
20
|
+
"@elliemae/ds-card-v2-action-addon": "3.80.0-next.38",
|
|
21
|
+
"@elliemae/ds-card-v2-group": "3.80.0-next.38",
|
|
22
|
+
"@elliemae/ds-card-v3": "3.80.0-next.38",
|
|
23
|
+
"@elliemae/ds-card-v3-poc": "3.80.0-next.38",
|
|
24
|
+
"@elliemae/ds-chat": "3.80.0-next.38",
|
|
25
|
+
"@elliemae/ds-chat-bubble": "3.80.0-next.38",
|
|
26
|
+
"@elliemae/ds-chat-card": "3.80.0-next.38",
|
|
27
|
+
"@elliemae/ds-chat-container": "3.80.0-next.38",
|
|
28
|
+
"@elliemae/ds-chat-container-header": "3.80.0-next.38",
|
|
29
|
+
"@elliemae/ds-chat-empty-state": "3.80.0-next.38",
|
|
30
|
+
"@elliemae/ds-chat-floating-button": "3.80.0-next.38",
|
|
31
|
+
"@elliemae/ds-chat-message-delimeter": "3.80.0-next.38",
|
|
32
|
+
"@elliemae/ds-chat-sidebar": "3.80.0-next.38",
|
|
33
|
+
"@elliemae/ds-chat-system-message": "3.80.0-next.38",
|
|
34
|
+
"@elliemae/ds-chat-tile": "3.80.0-next.38",
|
|
35
|
+
"@elliemae/ds-chip": "3.80.0-next.38",
|
|
36
|
+
"@elliemae/ds-circular-progress-indicator": "3.80.0-next.38",
|
|
37
|
+
"@elliemae/ds-classnames": "3.80.0-next.38",
|
|
38
|
+
"@elliemae/ds-codeeditor": "3.80.0-next.38",
|
|
39
|
+
"@elliemae/ds-comments": "3.80.0-next.38",
|
|
40
|
+
"@elliemae/ds-controlled-form": "3.80.0-next.38",
|
|
41
|
+
"@elliemae/ds-csv-converter": "3.80.0-next.38",
|
|
42
|
+
"@elliemae/ds-data-table": "3.80.0-next.38",
|
|
43
|
+
"@elliemae/ds-data-table-action-cell": "3.80.0-next.38",
|
|
44
|
+
"@elliemae/ds-data-table-cell": "3.80.0-next.38",
|
|
45
|
+
"@elliemae/ds-data-table-cell-header": "3.80.0-next.38",
|
|
46
|
+
"@elliemae/ds-data-table-drag-and-drop-cell": "3.80.0-next.38",
|
|
47
|
+
"@elliemae/ds-data-table-expand-cell": "3.80.0-next.38",
|
|
48
|
+
"@elliemae/ds-data-table-filters": "3.80.0-next.38",
|
|
49
|
+
"@elliemae/ds-data-table-multi-select-cell": "3.80.0-next.38",
|
|
50
|
+
"@elliemae/ds-data-table-single-select-cell": "3.80.0-next.38",
|
|
51
|
+
"@elliemae/ds-dataviz": "3.80.0-next.38",
|
|
52
|
+
"@elliemae/ds-dataviz-pie": "3.80.0-next.38",
|
|
53
|
+
"@elliemae/ds-date-time-picker": "3.80.0-next.38",
|
|
54
|
+
"@elliemae/ds-decision-graph": "3.80.0-next.38",
|
|
55
|
+
"@elliemae/ds-dialog": "3.80.0-next.38",
|
|
56
|
+
"@elliemae/ds-drag-and-drop": "3.80.0-next.38",
|
|
57
|
+
"@elliemae/ds-dropdownmenu-v2": "3.80.0-next.38",
|
|
58
|
+
"@elliemae/ds-dropzone": "3.80.0-next.38",
|
|
59
|
+
"@elliemae/ds-fast-list": "3.80.0-next.38",
|
|
60
|
+
"@elliemae/ds-filter-bar": "3.80.0-next.38",
|
|
61
|
+
"@elliemae/ds-floating-context": "3.80.0-next.38",
|
|
62
|
+
"@elliemae/ds-form-checkbox": "3.80.0-next.38",
|
|
63
|
+
"@elliemae/ds-form-combobox": "3.80.0-next.38",
|
|
64
|
+
"@elliemae/ds-form-date-range-picker": "3.80.0-next.38",
|
|
65
|
+
"@elliemae/ds-form-date-time-picker": "3.80.0-next.38",
|
|
66
|
+
"@elliemae/ds-form-helpers-mask-hooks": "3.80.0-next.38",
|
|
67
|
+
"@elliemae/ds-form-input-text": "3.80.0-next.38",
|
|
68
|
+
"@elliemae/ds-form-input-textarea": "3.80.0-next.38",
|
|
69
|
+
"@elliemae/ds-form-layout-autocomplete": "3.80.0-next.38",
|
|
70
|
+
"@elliemae/ds-form-layout-blocks": "3.80.0-next.38",
|
|
71
|
+
"@elliemae/ds-form-layout-input-group": "3.80.0-next.38",
|
|
72
|
+
"@elliemae/ds-form-layout-label": "3.80.0-next.38",
|
|
73
|
+
"@elliemae/ds-form-multi-combobox": "3.80.0-next.38",
|
|
74
|
+
"@elliemae/ds-form-native-select": "3.80.0-next.38",
|
|
75
|
+
"@elliemae/ds-form-radio": "3.80.0-next.38",
|
|
76
|
+
"@elliemae/ds-form-select": "3.80.0-next.38",
|
|
77
|
+
"@elliemae/ds-form-single-combobox": "3.80.0-next.38",
|
|
78
|
+
"@elliemae/ds-form-toggle": "3.80.0-next.38",
|
|
79
|
+
"@elliemae/ds-global-header": "3.80.0-next.38",
|
|
80
|
+
"@elliemae/ds-grid": "3.80.0-next.38",
|
|
81
|
+
"@elliemae/ds-hooks-focus-stack": "3.80.0-next.38",
|
|
82
|
+
"@elliemae/ds-hooks-focus-trap": "3.80.0-next.38",
|
|
83
|
+
"@elliemae/ds-hooks-fontsize-detector": "3.80.0-next.38",
|
|
84
|
+
"@elliemae/ds-hooks-fontsize-media": "3.80.0-next.38",
|
|
85
|
+
"@elliemae/ds-hooks-headless-tooltip": "3.80.0-next.38",
|
|
86
|
+
"@elliemae/ds-hooks-is-mobile": "3.80.0-next.38",
|
|
87
|
+
"@elliemae/ds-hooks-is-showing-ellipsis": "3.80.0-next.38",
|
|
88
|
+
"@elliemae/ds-hooks-keyboard-navigation": "3.80.0-next.38",
|
|
89
|
+
"@elliemae/ds-hooks-on-blur-out": "3.80.0-next.38",
|
|
90
|
+
"@elliemae/ds-hooks-on-first-focus-in": "3.80.0-next.38",
|
|
91
|
+
"@elliemae/ds-icon": "3.80.0-next.38",
|
|
92
|
+
"@elliemae/ds-icons": "3.80.0-next.38",
|
|
93
|
+
"@elliemae/ds-image": "3.80.0-next.38",
|
|
94
|
+
"@elliemae/ds-imagelibrarymodal": "3.80.0-next.38",
|
|
95
|
+
"@elliemae/ds-indeterminate-progress-indicator": "3.80.0-next.38",
|
|
96
|
+
"@elliemae/ds-layout-provider": "3.80.0-next.38",
|
|
97
|
+
"@elliemae/ds-left-navigation": "3.80.0-next.38",
|
|
98
98
|
"@elliemae/ds-legacy-button": "1.0.16",
|
|
99
99
|
"@elliemae/ds-legacy-button-group": "1.0.16",
|
|
100
100
|
"@elliemae/ds-legacy-button-v1": "1.0.16",
|
|
@@ -129,63 +129,63 @@
|
|
|
129
129
|
"@elliemae/ds-legacy-wysiwygeditor": "1.0.16",
|
|
130
130
|
"@elliemae/ds-legacy-zipcode-search": "1.0.16",
|
|
131
131
|
"@elliemae/ds-legacy-zoom": "1.0.16",
|
|
132
|
-
"@elliemae/ds-loading-indicator": "3.80.0-next.
|
|
133
|
-
"@elliemae/ds-menu-button": "3.80.0-next.
|
|
134
|
-
"@elliemae/ds-menu-items": "3.80.0-next.
|
|
135
|
-
"@elliemae/ds-menu-items-action": "3.80.0-next.
|
|
136
|
-
"@elliemae/ds-menu-items-commons": "3.80.0-next.
|
|
137
|
-
"@elliemae/ds-menu-items-multi": "3.80.0-next.
|
|
138
|
-
"@elliemae/ds-menu-items-section": "3.80.0-next.
|
|
139
|
-
"@elliemae/ds-menu-items-separator": "3.80.0-next.
|
|
140
|
-
"@elliemae/ds-menu-items-single": "3.80.0-next.
|
|
141
|
-
"@elliemae/ds-menu-items-single-with-submenu": "3.80.0-next.
|
|
142
|
-
"@elliemae/ds-menu-items-skeleton": "3.80.0-next.
|
|
143
|
-
"@elliemae/ds-menu-items-submenu": "3.80.0-next.
|
|
144
|
-
"@elliemae/ds-menu-tree-item": "3.80.0-next.
|
|
145
|
-
"@elliemae/ds-modal-slide": "3.80.0-next.
|
|
146
|
-
"@elliemae/ds-notification-badge": "3.80.0-next.
|
|
147
|
-
"@elliemae/ds-overlay": "3.80.0-next.
|
|
148
|
-
"@elliemae/ds-page-header": "3.80.0-next.
|
|
149
|
-
"@elliemae/ds-page-header-v1": "3.80.0-next.
|
|
150
|
-
"@elliemae/ds-page-header-v2": "3.80.0-next.
|
|
151
|
-
"@elliemae/ds-page-layout": "3.80.0-next.
|
|
152
|
-
"@elliemae/ds-pagination": "3.80.0-next.
|
|
153
|
-
"@elliemae/ds-panel-header": "3.80.0-next.
|
|
154
|
-
"@elliemae/ds-pills-v2": "3.80.0-next.
|
|
155
|
-
"@elliemae/ds-portal": "3.80.0-next.
|
|
156
|
-
"@elliemae/ds-progress-indicator": "3.80.0-next.
|
|
157
|
-
"@elliemae/ds-props-helpers": "3.80.0-next.
|
|
158
|
-
"@elliemae/ds-query-builder": "3.80.0-next.
|
|
159
|
-
"@elliemae/ds-read-more": "3.80.0-next.
|
|
160
|
-
"@elliemae/ds-resizeable-container": "3.80.0-next.
|
|
161
|
-
"@elliemae/ds-ribbon": "3.80.0-next.
|
|
162
|
-
"@elliemae/ds-scrollable-container": "3.80.0-next.
|
|
163
|
-
"@elliemae/ds-separator": "3.80.0-next.
|
|
164
|
-
"@elliemae/ds-shared": "3.80.0-next.
|
|
165
|
-
"@elliemae/ds-shuttle-v2": "3.80.0-next.
|
|
166
|
-
"@elliemae/ds-side-panel": "3.80.0-next.
|
|
167
|
-
"@elliemae/ds-side-panel-header": "3.80.0-next.
|
|
168
|
-
"@elliemae/ds-skeleton": "3.80.0-next.
|
|
169
|
-
"@elliemae/ds-slider-v2": "3.80.0-next.
|
|
170
|
-
"@elliemae/ds-square-indicator": "3.80.0-next.
|
|
171
|
-
"@elliemae/ds-stepper": "3.80.0-next.
|
|
172
|
-
"@elliemae/ds-svg": "3.80.0-next.
|
|
173
|
-
"@elliemae/ds-system": "3.80.0-next.
|
|
174
|
-
"@elliemae/ds-tabs": "3.80.0-next.
|
|
175
|
-
"@elliemae/ds-test-utils": "3.80.0-next.
|
|
176
|
-
"@elliemae/ds-toast": "3.80.0-next.
|
|
177
|
-
"@elliemae/ds-toolbar-v1": "3.80.0-next.
|
|
178
|
-
"@elliemae/ds-toolbar-v2": "3.80.0-next.
|
|
179
|
-
"@elliemae/ds-tooltip-v3": "3.80.0-next.
|
|
180
|
-
"@elliemae/ds-transition": "3.80.0-next.
|
|
181
|
-
"@elliemae/ds-tree-model": "3.80.0-next.
|
|
182
|
-
"@elliemae/ds-treeview": "3.80.0-next.
|
|
183
|
-
"@elliemae/ds-truncated-expandable-text": "3.80.0-next.
|
|
184
|
-
"@elliemae/ds-typescript-helpers": "3.80.0-next.
|
|
185
|
-
"@elliemae/ds-typography": "3.80.0-next.
|
|
186
|
-
"@elliemae/ds-virtual-list": "3.80.0-next.
|
|
187
|
-
"@elliemae/ds-wizard": "3.80.0-next.
|
|
188
|
-
"@elliemae/ds-zustand-helpers": "3.80.0-next.
|
|
132
|
+
"@elliemae/ds-loading-indicator": "3.80.0-next.38",
|
|
133
|
+
"@elliemae/ds-menu-button": "3.80.0-next.38",
|
|
134
|
+
"@elliemae/ds-menu-items": "3.80.0-next.38",
|
|
135
|
+
"@elliemae/ds-menu-items-action": "3.80.0-next.38",
|
|
136
|
+
"@elliemae/ds-menu-items-commons": "3.80.0-next.38",
|
|
137
|
+
"@elliemae/ds-menu-items-multi": "3.80.0-next.38",
|
|
138
|
+
"@elliemae/ds-menu-items-section": "3.80.0-next.38",
|
|
139
|
+
"@elliemae/ds-menu-items-separator": "3.80.0-next.38",
|
|
140
|
+
"@elliemae/ds-menu-items-single": "3.80.0-next.38",
|
|
141
|
+
"@elliemae/ds-menu-items-single-with-submenu": "3.80.0-next.38",
|
|
142
|
+
"@elliemae/ds-menu-items-skeleton": "3.80.0-next.38",
|
|
143
|
+
"@elliemae/ds-menu-items-submenu": "3.80.0-next.38",
|
|
144
|
+
"@elliemae/ds-menu-tree-item": "3.80.0-next.38",
|
|
145
|
+
"@elliemae/ds-modal-slide": "3.80.0-next.38",
|
|
146
|
+
"@elliemae/ds-notification-badge": "3.80.0-next.38",
|
|
147
|
+
"@elliemae/ds-overlay": "3.80.0-next.38",
|
|
148
|
+
"@elliemae/ds-page-header": "3.80.0-next.38",
|
|
149
|
+
"@elliemae/ds-page-header-v1": "3.80.0-next.38",
|
|
150
|
+
"@elliemae/ds-page-header-v2": "3.80.0-next.38",
|
|
151
|
+
"@elliemae/ds-page-layout": "3.80.0-next.38",
|
|
152
|
+
"@elliemae/ds-pagination": "3.80.0-next.38",
|
|
153
|
+
"@elliemae/ds-panel-header": "3.80.0-next.38",
|
|
154
|
+
"@elliemae/ds-pills-v2": "3.80.0-next.38",
|
|
155
|
+
"@elliemae/ds-portal": "3.80.0-next.38",
|
|
156
|
+
"@elliemae/ds-progress-indicator": "3.80.0-next.38",
|
|
157
|
+
"@elliemae/ds-props-helpers": "3.80.0-next.38",
|
|
158
|
+
"@elliemae/ds-query-builder": "3.80.0-next.38",
|
|
159
|
+
"@elliemae/ds-read-more": "3.80.0-next.38",
|
|
160
|
+
"@elliemae/ds-resizeable-container": "3.80.0-next.38",
|
|
161
|
+
"@elliemae/ds-ribbon": "3.80.0-next.38",
|
|
162
|
+
"@elliemae/ds-scrollable-container": "3.80.0-next.38",
|
|
163
|
+
"@elliemae/ds-separator": "3.80.0-next.38",
|
|
164
|
+
"@elliemae/ds-shared": "3.80.0-next.38",
|
|
165
|
+
"@elliemae/ds-shuttle-v2": "3.80.0-next.38",
|
|
166
|
+
"@elliemae/ds-side-panel": "3.80.0-next.38",
|
|
167
|
+
"@elliemae/ds-side-panel-header": "3.80.0-next.38",
|
|
168
|
+
"@elliemae/ds-skeleton": "3.80.0-next.38",
|
|
169
|
+
"@elliemae/ds-slider-v2": "3.80.0-next.38",
|
|
170
|
+
"@elliemae/ds-square-indicator": "3.80.0-next.38",
|
|
171
|
+
"@elliemae/ds-stepper": "3.80.0-next.38",
|
|
172
|
+
"@elliemae/ds-svg": "3.80.0-next.38",
|
|
173
|
+
"@elliemae/ds-system": "3.80.0-next.38",
|
|
174
|
+
"@elliemae/ds-tabs": "3.80.0-next.38",
|
|
175
|
+
"@elliemae/ds-test-utils": "3.80.0-next.38",
|
|
176
|
+
"@elliemae/ds-toast": "3.80.0-next.38",
|
|
177
|
+
"@elliemae/ds-toolbar-v1": "3.80.0-next.38",
|
|
178
|
+
"@elliemae/ds-toolbar-v2": "3.80.0-next.38",
|
|
179
|
+
"@elliemae/ds-tooltip-v3": "3.80.0-next.38",
|
|
180
|
+
"@elliemae/ds-transition": "3.80.0-next.38",
|
|
181
|
+
"@elliemae/ds-tree-model": "3.80.0-next.38",
|
|
182
|
+
"@elliemae/ds-treeview": "3.80.0-next.38",
|
|
183
|
+
"@elliemae/ds-truncated-expandable-text": "3.80.0-next.38",
|
|
184
|
+
"@elliemae/ds-typescript-helpers": "3.80.0-next.38",
|
|
185
|
+
"@elliemae/ds-typography": "3.80.0-next.38",
|
|
186
|
+
"@elliemae/ds-virtual-list": "3.80.0-next.38",
|
|
187
|
+
"@elliemae/ds-wizard": "3.80.0-next.38",
|
|
188
|
+
"@elliemae/ds-zustand-helpers": "3.80.0-next.38"
|
|
189
189
|
},
|
|
190
190
|
"publishConfig": {
|
|
191
191
|
"access": "public"
|