dimsum-e2e-tests 3.70.0-next.43 → 3.70.0-next.44

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 CHANGED
@@ -3,6 +3,10 @@
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.70.0-next.44 (2026-07-13)
7
+
8
+ **Note:** Version bump only for package dimsum-e2e-tests
9
+
6
10
  ## 3.70.0-next.43 (2026-07-08)
7
11
 
8
12
  ### Features
@@ -17,6 +17,8 @@ export default class DSButtonV3CO extends PageObject {
17
17
 
18
18
  static submitBtn = new Urlbuilder(PATH_E2E_BUTTON_V3, 'pui-16729-buttons-can-submit-forms');
19
19
 
20
+ static themeFontURL = new Urlbuilder(PATH_E2E_BUTTON_V3, 'theme-font-family-test');
21
+
20
22
  // selectors
21
23
  static async getButtonByIndex(index) {
22
24
  return $$('[data-testid="ds-button"]')[index];
@@ -38,6 +40,14 @@ export default class DSButtonV3CO extends PageObject {
38
40
  return $(`button*=${label}`);
39
41
  }
40
42
 
43
+ static async getThemedButton() {
44
+ return $('[data-testid="theme-font-sentinel"] [data-testid="ds-button"]');
45
+ }
46
+
47
+ static async getFallbackButton() {
48
+ return $('[data-testid="theme-font-fallback"] [data-testid="ds-button"]');
49
+ }
50
+
41
51
  // Snapshot
42
52
  static snapshotPath(example = 'basic') {
43
53
  return PageObject.getSnapshotPathBuilder('ButtonV3', example);
@@ -0,0 +1,30 @@
1
+ import DSButtonV3CO from '../DSButtonV3CO';
2
+
3
+ // Tests the theme-driven font-family support shipped under PUI-18210
4
+ // (V3 buttons reuse the b1 typography base → typographyFontFamily → theme.fonts.default,
5
+ // falling back to proxima-nova). Theme-agnostic: uses a sentinel font, never the
6
+ // dsConsumer POC theme values, so it survives any future theme change.
7
+ if (
8
+ (!browser.capabilities['ice:options'].isPhone &&
9
+ !browser.capabilities['ice:options'].isTablet &&
10
+ browser.capabilities.browserName === 'chrome') ||
11
+ browser.capabilities.browserName === 'Chrome'
12
+ ) {
13
+ describe('PUI-18708 - DSButtonV3:: theme font-family wiring - Func', () => {
14
+ before('loading page', async () => {
15
+ const errorOnGo = await DSButtonV3CO.themeFontURL.go();
16
+ if (errorOnGo) throw errorOnGo;
17
+ });
18
+
19
+ it('01: should read font-family from theme with proxima-nova fallback', async () => {
20
+ const themed = await DSButtonV3CO.getThemedButton();
21
+ await themed.waitForDisplayed();
22
+ const themedFont = (await themed.getCSSProperty('font-family')).value.toLowerCase();
23
+ await expect(themedFont).toContain('sentinelfont');
24
+
25
+ const fallback = await DSButtonV3CO.getFallbackButton();
26
+ const fallbackFont = (await fallback.getCSSProperty('font-family')).value.toLowerCase();
27
+ await expect(fallbackFont).toContain('proxima-nova');
28
+ });
29
+ });
30
+ }
@@ -24,6 +24,8 @@ export default class DSCardCO extends PageObject {
24
24
 
25
25
  static slotsTest = new Urlbuilder(PATH_E2E_CARD, 'slots-test');
26
26
 
27
+ static detailSlotsTest = new Urlbuilder(PATH_E2E_CARD, 'detail-slots-test');
28
+
27
29
  static ucDetailCardLongTitleURL = new Urlbuilder(PATH_E2E_CARD, 'detail-card-long-title');
28
30
 
29
31
  static detailExpandableURL = new Urlbuilder(PATH_E2E_CARD, 'detail-expandable-test');
@@ -128,4 +130,48 @@ export default class DSCardCO extends PageObject {
128
130
  static async getCardNavigationTypeSlotByIndex(index = 0) {
129
131
  return $$('[data-dimsum-slot="dsCardnavigationType"]')[index];
130
132
  }
133
+
134
+ // DetailCard (ds-card-v1-detail) slots — PUI-15889.
135
+ // SELECTABLE (checkbox) and EXPAND_CONTENT_BUTTON (chevron) are nested Dimsum
136
+ // components, so the consumer slot name surfaces as data-dimsum-parent-slot on
137
+ // the inner root (input / button); the rest use data-dimsum-slot directly.
138
+ static async getDetailContainerSlot() {
139
+ return $('[data-dimsum-slot="dsCardv1detailContainer"]');
140
+ }
141
+
142
+ static async getDetailTitleSlot() {
143
+ return $('[data-dimsum-slot="dsCardv1detailTitle"]');
144
+ }
145
+
146
+ static async getDetailDescriptionSlot() {
147
+ return $('[data-dimsum-slot="dsCardv1detailDescription"]');
148
+ }
149
+
150
+ static async getDetailSelectableSlot() {
151
+ return $('[data-dimsum-parent-slot="dsCardv1detailSelectable"]');
152
+ }
153
+
154
+ static async getDetailExpandContentButtonSlot() {
155
+ return $('[data-dimsum-parent-slot="dsCardv1detailExpandContentButton"]');
156
+ }
157
+
158
+ static async getDetailExpandContentSlot() {
159
+ return $('[data-dimsum-slot="dsCardv1detailExpandContent"]');
160
+ }
161
+
162
+ static async getDetailSeparatorSlot() {
163
+ return $('[data-dimsum-slot="dsCardv1detailSeparator"]');
164
+ }
165
+
166
+ static async getDetailRightAddonSlot() {
167
+ return $('[data-dimsum-slot="dsCardv1detailRightAddon"]');
168
+ }
169
+
170
+ static async getDetailRightDescriptionSlot() {
171
+ return $('[data-dimsum-slot="dsCardv1detailRightDescription"]');
172
+ }
173
+
174
+ static async getDetailRightValueSlot() {
175
+ return $('[data-dimsum-slot="dsCardv1detailRightValue"]');
176
+ }
131
177
  }
@@ -0,0 +1,29 @@
1
+ // Tests for the fix introduced in PUI-15889 (DetailCard selectable/expandable slots).
2
+ import DSCardCO from '../DSCardCO';
3
+ import { axeCoreCheck } from '../../helpers';
4
+
5
+ if (
6
+ (!browser.capabilities['ice:options'].isPhone &&
7
+ !browser.capabilities['ice:options'].isTablet &&
8
+ browser.capabilities.browserName === 'chrome') ||
9
+ browser.capabilities.browserName === 'Chrome'
10
+ ) {
11
+ describe('PUI-18691 - Card:: DetailCard slot attribute injection - Axe-Core', () => {
12
+ before(async () => {
13
+ const errorOnGo = await DSCardCO.detailSlotsTest.go();
14
+ if (errorOnGo) throw errorOnGo;
15
+ });
16
+
17
+ it('01: should have no accessibility violations with slot customizations', async () => {
18
+ await (await DSCardCO.getDetailContainerSlot()).waitForDisplayed();
19
+ // The slots story injects synthetic aria-labels onto every slot to prove
20
+ // attribute pass-through — including decorative elements (the description
21
+ // <p>, the right-side Grid <div>s) whose role prohibits aria-label. That is
22
+ // a test probe, not real consumer usage, so aria-prohibited-attr is disabled
23
+ // here — the same rationale axeCoreCheck already uses to disable valid-lang
24
+ // for the synthetic lang codes these slots tests inject.
25
+ const result = await axeCoreCheck({ extraDisabledRules: ['aria-prohibited-attr'] });
26
+ expect(result.length).toBe(0);
27
+ });
28
+ });
29
+ }
@@ -0,0 +1,72 @@
1
+ /* eslint-disable max-statements */
2
+ // Tests for the fix introduced in PUI-15889 (DetailCard selectable/expandable slots).
3
+ // Verifies consumer slot function props thread aria-label / data-testid / lang through
4
+ // to each DetailCard slot, including the checkbox (SELECTABLE) and chevron
5
+ // (EXPAND_CONTENT_BUTTON) sub-components that previously could not be addressed.
6
+ import DSCardCO from '../DSCardCO';
7
+
8
+ if (
9
+ (!browser.capabilities['ice:options'].isPhone &&
10
+ !browser.capabilities['ice:options'].isTablet &&
11
+ browser.capabilities.browserName === 'chrome') ||
12
+ browser.capabilities.browserName === 'Chrome'
13
+ ) {
14
+ describe('PUI-18689 - Card:: DetailCard slot attribute injection - Func', () => {
15
+ before('loading page', async () => {
16
+ const errorOnGo = await DSCardCO.detailSlotsTest.go();
17
+ if (errorOnGo) throw errorOnGo;
18
+ });
19
+
20
+ it('01: should have custom aria-label for each slot', async () => {
21
+ await (await DSCardCO.getDetailContainerSlot()).waitForDisplayed();
22
+ await expect(await DSCardCO.getDetailContainerSlot()).toHaveAttribute('aria-label', 'container aria');
23
+ await expect(await DSCardCO.getDetailTitleSlot()).toHaveAttribute('aria-label', 'title aria');
24
+ await expect(await DSCardCO.getDetailDescriptionSlot()).toHaveAttribute('aria-label', 'description aria');
25
+ await expect(await DSCardCO.getDetailSelectableSlot()).toHaveAttribute('aria-label', 'selectable aria');
26
+ await expect(await DSCardCO.getDetailExpandContentButtonSlot()).toHaveAttribute(
27
+ 'aria-label',
28
+ 'expand content button aria',
29
+ );
30
+ await expect(await DSCardCO.getDetailExpandContentSlot()).toHaveAttribute('aria-label', 'expand content aria');
31
+ await expect(await DSCardCO.getDetailSeparatorSlot()).toHaveAttribute('aria-label', 'separator aria');
32
+ await expect(await DSCardCO.getDetailRightAddonSlot()).toHaveAttribute('aria-label', 'right addon aria');
33
+ await expect(await DSCardCO.getDetailRightDescriptionSlot()).toHaveAttribute(
34
+ 'aria-label',
35
+ 'right description aria',
36
+ );
37
+ await expect(await DSCardCO.getDetailRightValueSlot()).toHaveAttribute('aria-label', 'right value aria');
38
+ });
39
+
40
+ it('02: should have custom data-testid for each slot', async () => {
41
+ await expect(await DSCardCO.getDetailContainerSlot()).toHaveAttribute('data-testid', 'container data');
42
+ await expect(await DSCardCO.getDetailTitleSlot()).toHaveAttribute('data-testid', 'title data');
43
+ await expect(await DSCardCO.getDetailDescriptionSlot()).toHaveAttribute('data-testid', 'description data');
44
+ await expect(await DSCardCO.getDetailSelectableSlot()).toHaveAttribute('data-testid', 'selectable data');
45
+ await expect(await DSCardCO.getDetailExpandContentButtonSlot()).toHaveAttribute(
46
+ 'data-testid',
47
+ 'expand content button data',
48
+ );
49
+ await expect(await DSCardCO.getDetailExpandContentSlot()).toHaveAttribute('data-testid', 'expand content data');
50
+ await expect(await DSCardCO.getDetailSeparatorSlot()).toHaveAttribute('data-testid', 'separator data');
51
+ await expect(await DSCardCO.getDetailRightAddonSlot()).toHaveAttribute('data-testid', 'right addon data');
52
+ await expect(await DSCardCO.getDetailRightDescriptionSlot()).toHaveAttribute(
53
+ 'data-testid',
54
+ 'right description data',
55
+ );
56
+ await expect(await DSCardCO.getDetailRightValueSlot()).toHaveAttribute('data-testid', 'right value data');
57
+ });
58
+
59
+ it('03: should have custom lang for each slot', async () => {
60
+ await expect(await DSCardCO.getDetailContainerSlot()).toHaveAttribute('lang', 'es');
61
+ await expect(await DSCardCO.getDetailTitleSlot()).toHaveAttribute('lang', 'fr');
62
+ await expect(await DSCardCO.getDetailDescriptionSlot()).toHaveAttribute('lang', 'de');
63
+ await expect(await DSCardCO.getDetailSelectableSlot()).toHaveAttribute('lang', 'it');
64
+ await expect(await DSCardCO.getDetailExpandContentButtonSlot()).toHaveAttribute('lang', 'pt');
65
+ await expect(await DSCardCO.getDetailExpandContentSlot()).toHaveAttribute('lang', 'ja');
66
+ await expect(await DSCardCO.getDetailSeparatorSlot()).toHaveAttribute('lang', 'nl');
67
+ await expect(await DSCardCO.getDetailRightAddonSlot()).toHaveAttribute('lang', 'sv');
68
+ await expect(await DSCardCO.getDetailRightDescriptionSlot()).toHaveAttribute('lang', 'ko');
69
+ await expect(await DSCardCO.getDetailRightValueSlot()).toHaveAttribute('lang', 'en');
70
+ });
71
+ });
72
+ }
@@ -0,0 +1,19 @@
1
+ // Tests for the fix introduced in PUI-15889 (DetailCard selectable/expandable slots).
2
+ // Snapshots the DetailCard with per-slot styleOverrides applied via ThemeProvider,
3
+ // exercising the slot theming API end to end.
4
+ import DSCardCO from '../DSCardCO';
5
+
6
+ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
7
+ describe('PUI-18690 - Card:: DetailCard slot theming - Visual', () => {
8
+ before(async () => {
9
+ const errorOnGo = await DSCardCO.detailSlotsTest.go();
10
+ if (errorOnGo) throw errorOnGo;
11
+ });
12
+
13
+ it('01: should display the detail card with slot theming overrides', async () => {
14
+ await (await DSCardCO.getDetailContainerSlot()).waitForDisplayed();
15
+ const snapshot = await browser.percyCheckScreenshot(DSCardCO.snapshotPath('detail-slot-theming'));
16
+ await expect(snapshot).toEqual(0);
17
+ });
18
+ });
19
+ }
@@ -1,5 +1,6 @@
1
1
  /* eslint-disable import/no-relative-packages */
2
2
  /* eslint-disable max-lines */
3
+ import { Key } from 'webdriverio';
3
4
  import {
4
5
  PATH_E2E_DATATABLE,
5
6
  PATH_E2E_DATATABLE_DND,
@@ -144,6 +145,8 @@ export default class DataTableCO extends PageObject {
144
145
 
145
146
  static responsive = new Urlbuilder(PATH_E2E_DATATABLE_ADVANCED, 'responsive');
146
147
 
148
+ static keyboardScrollIntoView = new Urlbuilder(PATH_E2E_DATATABLE_ADVANCED, 'keyboard-scroll-into-view-test');
149
+
147
150
  // ROW
148
151
 
149
152
  static selectWithNoControl = new Urlbuilder(PATH_E2E_DATATABLE_ROW, 'select-without-column');
@@ -421,6 +424,44 @@ export default class DataTableCO extends PageObject {
421
424
  return $('[data-testid="ds-datatable-empty-state-wrapper"]');
422
425
  }
423
426
 
427
+ // PUI-18626 — keyboard scroll-into-view
428
+
429
+ static getRows = async () => $$('[data-testid="data-table-row"]');
430
+
431
+ static getFirstRow = async () => (await this.getRows())[0];
432
+
433
+ static pressArrow = async (direction = 'down', times = 1) => {
434
+ const key = direction === 'up' ? Key.ArrowUp : Key.ArrowDown;
435
+ for (let i = 0; i < times; i += 1) {
436
+ // eslint-disable-next-line no-await-in-loop
437
+ await browser.keys(key);
438
+ }
439
+ };
440
+
441
+ /**
442
+ * Reads live layout to verify the currently focused row is scrolled fully below the sticky
443
+ * header (not clipped) after keyboard navigation. Returns viewport-relative tops/bottom in px
444
+ * plus the scroll container scrollTop. Selectors live here (not in the spec) by convention.
445
+ */
446
+ static getUpwardNavGeometry = async () =>
447
+ browser.execute(() => {
448
+ const rowSel = '[data-testid="data-table-row"], [data-testid="ds-datatable-row"]';
449
+ const headSel = '[data-testid="ds-datatable-head-wrapper"]';
450
+ const vwSel = '[data-testid="data-table-scrollable-container"]';
451
+ const active = document.activeElement;
452
+ const row = active && active.closest ? active.closest(rowSel) : null;
453
+ const focused = row || active;
454
+ const head = document.querySelector(headSel);
455
+ const vw = document.querySelector(vwSel);
456
+ return {
457
+ hasRow: Boolean(row),
458
+ rowTop: focused ? focused.getBoundingClientRect().top : null,
459
+ headerBottom: head ? head.getBoundingClientRect().bottom : null,
460
+ containerTop: vw ? vw.getBoundingClientRect().top : null,
461
+ scrollTop: vw ? vw.scrollTop : null,
462
+ };
463
+ });
464
+
424
465
  // Snapshots
425
466
  static snapshotPath(example = 'basic') {
426
467
  return PageObject.getSnapshotPathBuilder('DataTable', example, 'ds-data-table');
@@ -0,0 +1,39 @@
1
+ import DSDataTableCO from '../DSDataTableCO';
2
+
3
+ // Tests for the fix introduced in PUI-18626 (focused row clipped behind the sticky header on
4
+ // upward keyboard navigation). The fix applies scroll-padding-top = header height to the scroll
5
+ // container, so the browser-native focus scroll lands the focused row below the sticky header.
6
+ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
7
+ describe('PUI-18709 - DSDataTable:: focused row visible below sticky header on ArrowUp nav - Func', () => {
8
+ before(async () => {
9
+ const errorOnGo = await DSDataTableCO.keyboardScrollIntoView.go();
10
+ if (errorOnGo) throw errorOnGo;
11
+ await DSDataTableCO.waitForDataTable();
12
+ });
13
+
14
+ it('01: focused row lands below sticky header after upward keyboard navigation', async () => {
15
+ // Place focus inside the table, then scroll well past the fold and navigate back up.
16
+ await (await DSDataTableCO.getFirstRow()).click();
17
+ await DSDataTableCO.pressArrow('down', 20);
18
+ await DSDataTableCO.pressArrow('up', 8);
19
+
20
+ const geometry = await DSDataTableCO.getUpwardNavGeometry();
21
+ // Focus must be on a row, and the row must clear the sticky header (not clipped behind it)
22
+ // while staying inside the scroll viewport.
23
+ await expect(geometry.hasRow).toBe(true);
24
+ await expect(geometry.rowTop).toBeGreaterThanOrEqual(geometry.headerBottom - 1);
25
+ await expect(geometry.rowTop).toBeGreaterThanOrEqual(geometry.containerTop - 1);
26
+ });
27
+
28
+ it('02: first row fully visible below header when reached via upward nav', async () => {
29
+ // Continue upward past the top; extra presses at the first row are no-ops.
30
+ await DSDataTableCO.pressArrow('up', 30);
31
+
32
+ const geometry = await DSDataTableCO.getUpwardNavGeometry();
33
+ // The scroll container is at the very top, yet the focused first row still clears the header.
34
+ await expect(geometry.hasRow).toBe(true);
35
+ await expect(geometry.scrollTop).toBeLessThanOrEqual(1);
36
+ await expect(geometry.rowTop).toBeGreaterThanOrEqual(geometry.headerBottom - 1);
37
+ });
38
+ });
39
+ }
@@ -56,6 +56,13 @@ export default class DateRangePickerCO extends PageObject {
56
56
  static getYearInputByIndex = async (index = 0) =>
57
57
  $$('[data-testid="ds-controlled-date-time-picker-year-input"]')[index];
58
58
 
59
+ // Grouped field (DSFormLayoutBlockItem isGroup) a11y wiring
60
+ static getNamedGroupByLabel = async (label) => $$(`[role="group"][aria-label="${label}"]`);
61
+
62
+ static getFieldsetContainer = async () => $('[data-testid="ds-formlayoutblockitem-container"]');
63
+
64
+ static getValidationAlert = async () => $('[data-testid="ds-formlayoutblockitem-error-message"]');
65
+
59
66
  static getClearableBtns = async () => $$(`[data-testid="ds-controlled-date-time-picker-clear-btn"]`);
60
67
 
61
68
  static getClearableByIndex = async (index = 0) =>
@@ -1,20 +1,22 @@
1
1
  import { Key } from 'webdriverio';
2
2
  import DateRangePickerCO from '../DateRangePickerCO';
3
3
 
4
- // Tests for the fix introduced in PUI-15568 each day/month/year segment now exposes a
5
- // name-only aria-label ("day"/"month"/"year") with no native role word and no sibling-field
6
- // state; per-field state lives on role="spinbutton" + aria-valuetext.
4
+ // Tests for the fix introduced in PUI-15569 (lack of clear distinction between start and end date
5
+ // fields). Each day/month/year segment now carries a distinguishing name-only aria-label that
6
+ // encodes which date it belongs to ("Start date month" / "End date year" ...) while per-field value
7
+ // still lives on role="spinbutton" + aria-valuetext. This fix (commit d1ded9edc7b) reversed the
8
+ // earlier PUI-15568 name-only labels ("month"/"day"/"year"), which is why the label strings changed.
7
9
  // Chrome-only: pure DOM-attribute assertions are identical across browsers.
8
10
 
9
- // Asserts a single segment input is name-only: aria-label === field name, spinbutton role,
10
- // empty value-text, and none of the leaked phrases the defect used to inject into the label.
11
- const assertNameOnlyEmptySegment = async (input, name) => {
12
- await expect(input).toHaveAttribute('aria-label', name);
11
+ // Asserts a single segment input carries its full distinguishing aria-label, spinbutton role,
12
+ // empty value-text, and none of the leaked phrases the earlier defect used to inject into the label.
13
+ const assertDistinguishingEmptySegment = async (input, label) => {
14
+ await expect(input).toHaveAttribute('aria-label', label);
13
15
  await expect(input).toHaveAttribute('role', 'spinbutton');
14
16
  await expect(input).toHaveAttribute('aria-valuetext', 'empty');
15
- const label = await input.getAttribute('aria-label');
16
- expect(label).not.toContain('input field');
17
- expect(label).not.toContain('current values');
17
+ const ariaLabel = await input.getAttribute('aria-label');
18
+ expect(ariaLabel).not.toContain('input field');
19
+ expect(ariaLabel).not.toContain('current values');
18
20
  };
19
21
 
20
22
  if (
@@ -23,7 +25,7 @@ if (
23
25
  browser.capabilities.browserName === 'chrome') ||
24
26
  browser.capabilities.browserName === 'Chrome'
25
27
  ) {
26
- describe('PUI-18653 - DSControlledDateRangePicker:: date segment aria-labels - Func', () => {
28
+ describe('PUI-18653 - DSControlledDateRangePicker:: start and end date segment aria-labels - Func', () => {
27
29
  before('loading page', async () => {
28
30
  const errorOnGo = await DateRangePickerCO.basic.go();
29
31
  if (errorOnGo) throw errorOnGo;
@@ -31,15 +33,15 @@ if (
31
33
 
32
34
  // Static reads on the empty initial state — consolidated into one it() (no interaction).
33
35
  // index 0 = Start date group, index 1 = End date group.
34
- it('01: each segment exposes a name-only aria-label, spinbutton role and empty value-text', async () => {
36
+ it('01: each segment names its own date (start/end) with a spinbutton role and empty value', async () => {
35
37
  // Start date group
36
- await assertNameOnlyEmptySegment(await DateRangePickerCO.getMonthInputByIndex(0), 'month');
37
- await assertNameOnlyEmptySegment(await DateRangePickerCO.getDayInputByIndex(0), 'day');
38
- await assertNameOnlyEmptySegment(await DateRangePickerCO.getYearInputByIndex(0), 'year');
38
+ await assertDistinguishingEmptySegment(await DateRangePickerCO.getMonthInputByIndex(0), 'Start date month');
39
+ await assertDistinguishingEmptySegment(await DateRangePickerCO.getDayInputByIndex(0), 'Start date day');
40
+ await assertDistinguishingEmptySegment(await DateRangePickerCO.getYearInputByIndex(0), 'Start date year');
39
41
  // End date group
40
- await assertNameOnlyEmptySegment(await DateRangePickerCO.getMonthInputByIndex(1), 'month');
41
- await assertNameOnlyEmptySegment(await DateRangePickerCO.getDayInputByIndex(1), 'day');
42
- await assertNameOnlyEmptySegment(await DateRangePickerCO.getYearInputByIndex(1), 'year');
42
+ await assertDistinguishingEmptySegment(await DateRangePickerCO.getMonthInputByIndex(1), 'End date month');
43
+ await assertDistinguishingEmptySegment(await DateRangePickerCO.getDayInputByIndex(1), 'End date day');
44
+ await assertDistinguishingEmptySegment(await DateRangePickerCO.getYearInputByIndex(1), 'End date year');
43
45
  });
44
46
 
45
47
  it('02: filling one segment does not leak its value into sibling aria-labels', async () => {
@@ -48,16 +50,16 @@ if (
48
50
  await browser.keys(Key.ArrowUp); // 01 / January
49
51
  await browser.keys(Key.ArrowUp); // 02 / February
50
52
 
51
- // filled field announces its OWN value via aria-valuetext; label stays name-only
52
- await expect(month).toHaveAttribute('aria-label', 'month');
53
+ // filled field announces its OWN value via aria-valuetext; label stays the distinguishing name
54
+ await expect(month).toHaveAttribute('aria-label', 'Start date month');
53
55
  await expect(month).toHaveAttribute('aria-valuetext', 'February');
54
56
 
55
- // siblings stay name-only + empty — no "February" leaks into their names
57
+ // siblings keep their distinguishing names + empty value — no "February" leaks into their labels
56
58
  const day = await DateRangePickerCO.getDayInputByIndex(0);
57
59
  const year = await DateRangePickerCO.getYearInputByIndex(0);
58
- await expect(day).toHaveAttribute('aria-label', 'day');
60
+ await expect(day).toHaveAttribute('aria-label', 'Start date day');
59
61
  await expect(day).toHaveAttribute('aria-valuetext', 'empty');
60
- await expect(year).toHaveAttribute('aria-label', 'year');
62
+ await expect(year).toHaveAttribute('aria-label', 'Start date year');
61
63
  await expect(year).toHaveAttribute('aria-valuetext', 'empty');
62
64
  });
63
65
  });
@@ -0,0 +1,59 @@
1
+ import DateRangePickerCO from '../DateRangePickerCO';
2
+
3
+ // Tests for the fix introduced in PUI-15570 (feedback message announced as part of the group heading
4
+ // and not programmatically associated with any field). When the range picker sits inside a
5
+ // DSFormLayoutBlockItem isGroup fieldset, the fix (commit d1ded9edc7b) removed the nested named
6
+ // role="group" (aria-label="Start date"/"End date") that collided with the fieldset legend, so the
7
+ // legend + validation message now announce correctly. Each field self-identifies via its own
8
+ // aria-label and is marked aria-invalid, telling the user exactly which fields contain errors, while
9
+ // the validation message is announced separately via role="alert".
10
+ // Chrome-only: pure DOM-attribute assertions are identical across browsers.
11
+
12
+ // Asserts a single segment input is marked invalid and keeps its distinguishing name in the error state.
13
+ const assertInvalidNamedSegment = async (input, label) => {
14
+ await expect(input).toHaveAttribute('aria-label', label);
15
+ await expect(input).toHaveAttribute('role', 'spinbutton');
16
+ await expect(input).toHaveAttribute('aria-invalid', 'true');
17
+ };
18
+
19
+ if (
20
+ (!browser.capabilities['ice:options'].isPhone &&
21
+ !browser.capabilities['ice:options'].isTablet &&
22
+ browser.capabilities.browserName === 'chrome') ||
23
+ browser.capabilities.browserName === 'Chrome'
24
+ ) {
25
+ describe('PUI-18711 - DSControlledDateRangePicker:: grouped field error announcement - Func', () => {
26
+ before('loading page', async () => {
27
+ const errorOnGo = await DateRangePickerCO.invalidSelection.go();
28
+ if (errorOnGo) throw errorOnGo;
29
+ });
30
+
31
+ // Static reads on the error-state load — consolidated into one it() (no interaction).
32
+ it('01: drops the nested named group, marks each named field invalid, announces error via alert', async () => {
33
+ // Regression guard for the fix: the nested named role="group" wrappers are gone, so they no
34
+ // longer compete with the DSFormLayoutBlockItem fieldset legend / validation message.
35
+ const startNamedGroups = await DateRangePickerCO.getNamedGroupByLabel('Start date');
36
+ const endNamedGroups = await DateRangePickerCO.getNamedGroupByLabel('End date');
37
+ expect(startNamedGroups.length).toBe(0);
38
+ expect(endNamedGroups.length).toBe(0);
39
+
40
+ // The grouping is still provided by the fieldset container.
41
+ await expect(await DateRangePickerCO.getFieldsetContainer()).toBeExisting();
42
+
43
+ // Each field self-identifies (start/end) and is flagged invalid — tells the user which fields
44
+ // contain errors. index 0 = Start date group, index 1 = End date group.
45
+ await assertInvalidNamedSegment(await DateRangePickerCO.getMonthInputByIndex(0), 'Start date month');
46
+ await assertInvalidNamedSegment(await DateRangePickerCO.getDayInputByIndex(0), 'Start date day');
47
+ await assertInvalidNamedSegment(await DateRangePickerCO.getYearInputByIndex(0), 'Start date year');
48
+ await assertInvalidNamedSegment(await DateRangePickerCO.getMonthInputByIndex(1), 'End date month');
49
+ await assertInvalidNamedSegment(await DateRangePickerCO.getDayInputByIndex(1), 'End date day');
50
+ await assertInvalidNamedSegment(await DateRangePickerCO.getYearInputByIndex(1), 'End date year');
51
+
52
+ // The validation message is a separate element announced on its own via role="alert".
53
+ const alert = await DateRangePickerCO.getValidationAlert();
54
+ await expect(alert).toBeExisting();
55
+ await expect(alert).toHaveAttribute('role', 'alert');
56
+ await expect(alert).toHaveText('The selected range is not valid', { containing: true });
57
+ });
58
+ });
59
+ }
@@ -33,6 +33,8 @@ export default class ModalSlideCO extends PageObject {
33
33
 
34
34
  static slotsTest = new Urlbuilder(PATH_E2E_MODALSLIDE, 'slots-test');
35
35
 
36
+ static headingLevelURL = new Urlbuilder(PATH_E2E_MODALSLIDE, 'heading-level-test');
37
+
36
38
  static async getModalSlide() {
37
39
  return $('[data-testid="ds-modal-slide"]');
38
40
  }
@@ -134,6 +136,11 @@ export default class ModalSlideCO extends PageObject {
134
136
  return $('[data-dimsum-parent-slot="dsModalslideTitle"]');
135
137
  }
136
138
 
139
+ // Title element — the heading whose tag is driven by the `headingLevel` prop
140
+ static async getModalTitle() {
141
+ return $('[data-dimsum-parent-slot="dsModalslideTitle"]');
142
+ }
143
+
137
144
  // Snapshots
138
145
  static snapshotPath(example = 'basic') {
139
146
  return PageObject.getSnapshotPathBuilder('ModalSlide', example, 'ds-modal-slide');
@@ -0,0 +1,25 @@
1
+ // Tests for the feature introduced in PUI-15612 (ModalSlide flexible title heading level).
2
+ // The story models correct usage: an h2 title above h3/h4 content, producing a valid outline.
3
+ import ModalSlideCO from '../ModalSlideCO';
4
+ import { axeCoreCheck } from '../../helpers';
5
+
6
+ if (
7
+ (!browser.capabilities['ice:options'].isPhone &&
8
+ !browser.capabilities['ice:options'].isTablet &&
9
+ browser.capabilities.browserName === 'chrome') ||
10
+ browser.capabilities.browserName === 'Chrome'
11
+ ) {
12
+ describe('PUI-18688 - ModalSlide:: title headingLevel prop - Axe-Core', () => {
13
+ before(async () => {
14
+ const errorOnGo = await ModalSlideCO.headingLevelURL.go();
15
+ if (errorOnGo) throw errorOnGo;
16
+ });
17
+
18
+ it('01: should have no accessibility violations with a nested heading hierarchy', async () => {
19
+ await ModalSlideCO.openModalSlide();
20
+ await (await ModalSlideCO.getModalTitle()).waitForDisplayed();
21
+ const result = await axeCoreCheck();
22
+ expect(result.length).toBe(0);
23
+ });
24
+ });
25
+ }
@@ -0,0 +1,25 @@
1
+ // Tests for the feature introduced in PUI-15612 (ModalSlide flexible title heading level).
2
+ // The `headingLevel` prop drives the semantic tag of the title element; the default is `h3`.
3
+ import ModalSlideCO from '../ModalSlideCO';
4
+
5
+ if (
6
+ (!browser.capabilities['ice:options'].isPhone &&
7
+ !browser.capabilities['ice:options'].isTablet &&
8
+ browser.capabilities.browserName === 'chrome') ||
9
+ browser.capabilities.browserName === 'Chrome'
10
+ ) {
11
+ describe('PUI-18687 - ModalSlide:: title headingLevel prop - Func', () => {
12
+ before(async () => {
13
+ const errorOnGo = await ModalSlideCO.headingLevelURL.go();
14
+ if (errorOnGo) throw errorOnGo;
15
+ });
16
+
17
+ it('01: should render the title with the tag from headingLevel (h2)', async () => {
18
+ await ModalSlideCO.openModalSlide();
19
+ const title = await ModalSlideCO.getModalTitle();
20
+ await title.waitForDisplayed();
21
+ await expect(await title.getTagName()).toBe('h2');
22
+ await expect(title).toHaveText('Loan Summary');
23
+ });
24
+ });
25
+ }
@@ -15,6 +15,8 @@ export default class DSTypographyCO extends PageObject {
15
15
 
16
16
  static interactiveURL = new Urlbuilder(PATH_E2E_TYPOGRAPHY, 'interactive-test');
17
17
 
18
+ static themeFontURL = new Urlbuilder(PATH_E2E_TYPOGRAPHY, 'theme-font-family-test');
19
+
18
20
  // Snapshots
19
21
  static snapshotPath(example = 'basic') {
20
22
  return PageObject.getSnapshotPathBuilder('Typography', example);
@@ -41,4 +43,12 @@ export default class DSTypographyCO extends PageObject {
41
43
  static async getOpenDialog() {
42
44
  return $('[data-testid="open-dialog-button"]');
43
45
  }
46
+
47
+ static async getThemedTypography() {
48
+ return $('[data-testid="theme-font-sentinel"] [data-testid="ds-typography-element"]');
49
+ }
50
+
51
+ static async getFallbackTypography() {
52
+ return $('[data-testid="theme-font-fallback"] [data-testid="ds-typography-element"]');
53
+ }
44
54
  }
@@ -0,0 +1,30 @@
1
+ import DSTypographyCO from '../DSTypographyCO';
2
+
3
+ // Tests the theme-driven font-family mechanism shipped under PUI-18210
4
+ // (ds-typography/src/parts/styled.ts + typographyFontFamily.ts read theme.fonts.default,
5
+ // falling back to proxima-nova). Theme-agnostic: uses a sentinel font, never the
6
+ // dsConsumer POC theme values, so it survives any future theme change.
7
+ if (
8
+ (!browser.capabilities['ice:options'].isPhone &&
9
+ !browser.capabilities['ice:options'].isTablet &&
10
+ browser.capabilities.browserName === 'chrome') ||
11
+ browser.capabilities.browserName === 'Chrome'
12
+ ) {
13
+ describe('PUI-18707 - DSTypography:: theme font-family wiring - Func', () => {
14
+ before('loading page', async () => {
15
+ const errorOnGo = await DSTypographyCO.themeFontURL.go();
16
+ if (errorOnGo) throw errorOnGo;
17
+ });
18
+
19
+ it('01: should read font-family from theme with proxima-nova fallback', async () => {
20
+ const themed = await DSTypographyCO.getThemedTypography();
21
+ await themed.waitForDisplayed();
22
+ const themedFont = (await themed.getCSSProperty('font-family')).value.toLowerCase();
23
+ await expect(themedFont).toContain('sentinelfont');
24
+
25
+ const fallback = await DSTypographyCO.getFallbackTypography();
26
+ const fallbackFont = (await fallback.getCSSProperty('font-family')).value.toLowerCase();
27
+ await expect(fallbackFont).toContain('proxima-nova');
28
+ });
29
+ });
30
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "dimsum-e2e-tests",
4
- "version": "3.70.0-next.43",
4
+ "version": "3.70.0-next.44",
5
5
  "description": "End-to-end tests for dimsum library",
6
6
  "dependencies": {
7
7
  "@elliemae/ds-legacy-button": "1.0.16",
@@ -38,155 +38,155 @@
38
38
  "@elliemae/ds-legacy-wysiwygeditor": "1.0.16",
39
39
  "@elliemae/ds-legacy-zipcode-search": "1.0.16",
40
40
  "@elliemae/ds-legacy-zoom": "1.0.16",
41
- "@elliemae/ds-accordion": "3.70.0-next.43",
42
- "@elliemae/ds-app-picker": "3.70.0-next.43",
43
- "@elliemae/ds-accordion-native": "3.70.0-next.43",
44
- "@elliemae/ds-accessibility": "3.70.0-next.43",
45
- "@elliemae/ds-backdrop": "3.70.0-next.43",
46
- "@elliemae/ds-banner": "3.70.0-next.43",
47
- "@elliemae/ds-basic": "3.70.0-next.43",
48
- "@elliemae/ds-breadcrumb": "3.70.0-next.43",
49
- "@elliemae/ds-button-v2": "3.70.0-next.43",
50
- "@elliemae/ds-card": "3.70.0-next.43",
51
- "@elliemae/ds-card-v1-detail": "3.70.0-next.43",
52
- "@elliemae/ds-card-v2-action-addon": "3.70.0-next.43",
53
- "@elliemae/ds-card-navigation": "3.70.0-next.43",
54
- "@elliemae/ds-card-v2": "3.70.0-next.43",
55
- "@elliemae/ds-card-v3": "3.70.0-next.43",
56
- "@elliemae/ds-card-v1": "3.70.0-next.43",
57
- "@elliemae/ds-card-v2-group": "3.70.0-next.43",
58
- "@elliemae/ds-card-v3-poc": "3.70.0-next.43",
59
- "@elliemae/ds-chat-bubble": "3.70.0-next.43",
60
- "@elliemae/ds-chat-card": "3.70.0-next.43",
61
- "@elliemae/ds-chat-container": "3.70.0-next.43",
62
- "@elliemae/ds-chat-container-header": "3.70.0-next.43",
63
- "@elliemae/ds-chat-floating-button": "3.70.0-next.43",
64
- "@elliemae/ds-chat": "3.70.0-next.43",
65
- "@elliemae/ds-chat-empty-state": "3.70.0-next.43",
66
- "@elliemae/ds-chat-message-delimeter": "3.70.0-next.43",
67
- "@elliemae/ds-chat-sidebar": "3.70.0-next.43",
68
- "@elliemae/ds-chat-system-message": "3.70.0-next.43",
69
- "@elliemae/ds-chat-tile": "3.70.0-next.43",
70
- "@elliemae/ds-circular-progress-indicator": "3.70.0-next.43",
71
- "@elliemae/ds-chip": "3.70.0-next.43",
72
- "@elliemae/ds-classnames": "3.70.0-next.43",
73
- "@elliemae/ds-comments": "3.70.0-next.43",
74
- "@elliemae/ds-controlled-form": "3.70.0-next.43",
75
- "@elliemae/ds-data-table": "3.70.0-next.43",
76
- "@elliemae/ds-codeeditor": "3.70.0-next.43",
77
- "@elliemae/ds-csv-converter": "3.70.0-next.43",
78
- "@elliemae/ds-data-table-cell-header": "3.70.0-next.43",
79
- "@elliemae/ds-data-table-drag-and-drop-cell": "3.70.0-next.43",
80
- "@elliemae/ds-data-table-cell": "3.70.0-next.43",
81
- "@elliemae/ds-data-table-filters": "3.70.0-next.43",
82
- "@elliemae/ds-data-table-action-cell": "3.70.0-next.43",
83
- "@elliemae/ds-data-table-expand-cell": "3.70.0-next.43",
84
- "@elliemae/ds-data-table-single-select-cell": "3.70.0-next.43",
85
- "@elliemae/ds-dataviz": "3.70.0-next.43",
86
- "@elliemae/ds-data-table-multi-select-cell": "3.70.0-next.43",
87
- "@elliemae/ds-dataviz-pie": "3.70.0-next.43",
88
- "@elliemae/ds-date-time-picker": "3.70.0-next.43",
89
- "@elliemae/ds-decision-graph": "3.70.0-next.43",
90
- "@elliemae/ds-drag-and-drop": "3.70.0-next.43",
91
- "@elliemae/ds-dialog": "3.70.0-next.43",
92
- "@elliemae/ds-dropzone": "3.70.0-next.43",
93
- "@elliemae/ds-fast-list": "3.70.0-next.43",
94
- "@elliemae/ds-floating-context": "3.70.0-next.43",
95
- "@elliemae/ds-dropdownmenu-v2": "3.70.0-next.43",
96
- "@elliemae/ds-filter-bar": "3.70.0-next.43",
97
- "@elliemae/ds-form-date-time-picker": "3.70.0-next.43",
98
- "@elliemae/ds-form-checkbox": "3.70.0-next.43",
99
- "@elliemae/ds-form-date-range-picker": "3.70.0-next.43",
100
- "@elliemae/ds-form-helpers-mask-hooks": "3.70.0-next.43",
101
- "@elliemae/ds-form-combobox": "3.70.0-next.43",
102
- "@elliemae/ds-form-input-text": "3.70.0-next.43",
103
- "@elliemae/ds-form-input-textarea": "3.70.0-next.43",
104
- "@elliemae/ds-form-layout-blocks": "3.70.0-next.43",
105
- "@elliemae/ds-form-layout-input-group": "3.70.0-next.43",
106
- "@elliemae/ds-form-native-select": "3.70.0-next.43",
107
- "@elliemae/ds-form-layout-autocomplete": "3.70.0-next.43",
108
- "@elliemae/ds-form-layout-label": "3.70.0-next.43",
109
- "@elliemae/ds-form-multi-combobox": "3.70.0-next.43",
110
- "@elliemae/ds-form-radio": "3.70.0-next.43",
111
- "@elliemae/ds-form-select": "3.70.0-next.43",
112
- "@elliemae/ds-global-header": "3.70.0-next.43",
113
- "@elliemae/ds-form-single-combobox": "3.70.0-next.43",
114
- "@elliemae/ds-form-toggle": "3.70.0-next.43",
115
- "@elliemae/ds-grid": "3.70.0-next.43",
116
- "@elliemae/ds-hooks-focus-trap": "3.70.0-next.43",
117
- "@elliemae/ds-hooks-fontsize-detector": "3.70.0-next.43",
118
- "@elliemae/ds-hooks-fontsize-media": "3.70.0-next.43",
119
- "@elliemae/ds-hooks-is-mobile": "3.70.0-next.43",
120
- "@elliemae/ds-hooks-focus-stack": "3.70.0-next.43",
121
- "@elliemae/ds-hooks-keyboard-navigation": "3.70.0-next.43",
122
- "@elliemae/ds-hooks-is-showing-ellipsis": "3.70.0-next.43",
123
- "@elliemae/ds-hooks-on-blur-out": "3.70.0-next.43",
124
- "@elliemae/ds-icon": "3.70.0-next.43",
125
- "@elliemae/ds-hooks-on-first-focus-in": "3.70.0-next.43",
126
- "@elliemae/ds-hooks-headless-tooltip": "3.70.0-next.43",
127
- "@elliemae/ds-icons": "3.70.0-next.43",
128
- "@elliemae/ds-image": "3.70.0-next.43",
129
- "@elliemae/ds-indeterminate-progress-indicator": "3.70.0-next.43",
130
- "@elliemae/ds-layout-provider": "3.70.0-next.43",
131
- "@elliemae/ds-left-navigation": "3.70.0-next.43",
132
- "@elliemae/ds-imagelibrarymodal": "3.70.0-next.43",
133
- "@elliemae/ds-loading-indicator": "3.70.0-next.43",
134
- "@elliemae/ds-menu-items": "3.70.0-next.43",
135
- "@elliemae/ds-menu-button": "3.70.0-next.43",
136
- "@elliemae/ds-menu-items-action": "3.70.0-next.43",
137
- "@elliemae/ds-menu-items-commons": "3.70.0-next.43",
138
- "@elliemae/ds-menu-items-multi": "3.70.0-next.43",
139
- "@elliemae/ds-menu-items-section": "3.70.0-next.43",
140
- "@elliemae/ds-menu-items-separator": "3.70.0-next.43",
141
- "@elliemae/ds-menu-items-single": "3.70.0-next.43",
142
- "@elliemae/ds-menu-items-single-with-submenu": "3.70.0-next.43",
143
- "@elliemae/ds-menu-items-skeleton": "3.70.0-next.43",
144
- "@elliemae/ds-menu-tree-item": "3.70.0-next.43",
145
- "@elliemae/ds-menu-items-submenu": "3.70.0-next.43",
146
- "@elliemae/ds-mobile": "3.70.0-next.43",
147
- "@elliemae/ds-notification-badge": "3.70.0-next.43",
148
- "@elliemae/ds-page-header": "3.70.0-next.43",
149
- "@elliemae/ds-modal-slide": "3.70.0-next.43",
150
- "@elliemae/ds-page-header-v2": "3.70.0-next.43",
151
- "@elliemae/ds-overlay": "3.70.0-next.43",
152
- "@elliemae/ds-page-layout": "3.70.0-next.43",
153
- "@elliemae/ds-page-header-v1": "3.70.0-next.43",
154
- "@elliemae/ds-pills-v2": "3.70.0-next.43",
155
- "@elliemae/ds-portal": "3.70.0-next.43",
156
- "@elliemae/ds-pagination": "3.70.0-next.43",
157
- "@elliemae/ds-props-helpers": "3.70.0-next.43",
158
- "@elliemae/ds-progress-indicator": "3.70.0-next.43",
159
- "@elliemae/ds-query-builder": "3.70.0-next.43",
160
- "@elliemae/ds-resizeable-container": "3.70.0-next.43",
161
- "@elliemae/ds-ribbon": "3.70.0-next.43",
162
- "@elliemae/ds-read-more": "3.70.0-next.43",
163
- "@elliemae/ds-scrollable-container": "3.70.0-next.43",
164
- "@elliemae/ds-side-panel-header": "3.70.0-next.43",
165
- "@elliemae/ds-side-panel": "3.70.0-next.43",
166
- "@elliemae/ds-separator": "3.70.0-next.43",
167
- "@elliemae/ds-shuttle-v2": "3.70.0-next.43",
168
- "@elliemae/ds-slider-v2": "3.70.0-next.43",
169
- "@elliemae/ds-skeleton": "3.70.0-next.43",
170
- "@elliemae/ds-shared": "3.70.0-next.43",
171
- "@elliemae/ds-svg": "3.70.0-next.43",
172
- "@elliemae/ds-square-indicator": "3.70.0-next.43",
173
- "@elliemae/ds-stepper": "3.70.0-next.43",
174
- "@elliemae/ds-test-utils": "3.70.0-next.43",
175
- "@elliemae/ds-tabs": "3.70.0-next.43",
176
- "@elliemae/ds-system": "3.70.0-next.43",
177
- "@elliemae/ds-toolbar-v1": "3.70.0-next.43",
178
- "@elliemae/ds-toolbar-v2": "3.70.0-next.43",
179
- "@elliemae/ds-toast": "3.70.0-next.43",
180
- "@elliemae/ds-transition": "3.70.0-next.43",
181
- "@elliemae/ds-tooltip-v3": "3.70.0-next.43",
182
- "@elliemae/ds-tree-model": "3.70.0-next.43",
183
- "@elliemae/ds-treeview": "3.70.0-next.43",
184
- "@elliemae/ds-truncated-expandable-text": "3.70.0-next.43",
185
- "@elliemae/ds-typography": "3.70.0-next.43",
186
- "@elliemae/ds-typescript-helpers": "3.70.0-next.43",
187
- "@elliemae/ds-virtual-list": "3.70.0-next.43",
188
- "@elliemae/ds-zustand-helpers": "3.70.0-next.43",
189
- "@elliemae/ds-wizard": "3.70.0-next.43"
41
+ "@elliemae/ds-accessibility": "3.70.0-next.44",
42
+ "@elliemae/ds-accordion": "3.70.0-next.44",
43
+ "@elliemae/ds-app-picker": "3.70.0-next.44",
44
+ "@elliemae/ds-backdrop": "3.70.0-next.44",
45
+ "@elliemae/ds-banner": "3.70.0-next.44",
46
+ "@elliemae/ds-basic": "3.70.0-next.44",
47
+ "@elliemae/ds-accordion-native": "3.70.0-next.44",
48
+ "@elliemae/ds-breadcrumb": "3.70.0-next.44",
49
+ "@elliemae/ds-card": "3.70.0-next.44",
50
+ "@elliemae/ds-button-v2": "3.70.0-next.44",
51
+ "@elliemae/ds-card-navigation": "3.70.0-next.44",
52
+ "@elliemae/ds-card-v1-detail": "3.70.0-next.44",
53
+ "@elliemae/ds-card-v2": "3.70.0-next.44",
54
+ "@elliemae/ds-card-v1": "3.70.0-next.44",
55
+ "@elliemae/ds-card-v2-action-addon": "3.70.0-next.44",
56
+ "@elliemae/ds-card-v2-group": "3.70.0-next.44",
57
+ "@elliemae/ds-card-v3": "3.70.0-next.44",
58
+ "@elliemae/ds-chat": "3.70.0-next.44",
59
+ "@elliemae/ds-card-v3-poc": "3.70.0-next.44",
60
+ "@elliemae/ds-chat-card": "3.70.0-next.44",
61
+ "@elliemae/ds-chat-bubble": "3.70.0-next.44",
62
+ "@elliemae/ds-chat-container": "3.70.0-next.44",
63
+ "@elliemae/ds-chat-container-header": "3.70.0-next.44",
64
+ "@elliemae/ds-chat-empty-state": "3.70.0-next.44",
65
+ "@elliemae/ds-chat-sidebar": "3.70.0-next.44",
66
+ "@elliemae/ds-chat-message-delimeter": "3.70.0-next.44",
67
+ "@elliemae/ds-chat-system-message": "3.70.0-next.44",
68
+ "@elliemae/ds-chat-tile": "3.70.0-next.44",
69
+ "@elliemae/ds-chat-floating-button": "3.70.0-next.44",
70
+ "@elliemae/ds-chip": "3.70.0-next.44",
71
+ "@elliemae/ds-circular-progress-indicator": "3.70.0-next.44",
72
+ "@elliemae/ds-comments": "3.70.0-next.44",
73
+ "@elliemae/ds-codeeditor": "3.70.0-next.44",
74
+ "@elliemae/ds-controlled-form": "3.70.0-next.44",
75
+ "@elliemae/ds-classnames": "3.70.0-next.44",
76
+ "@elliemae/ds-data-table-action-cell": "3.70.0-next.44",
77
+ "@elliemae/ds-csv-converter": "3.70.0-next.44",
78
+ "@elliemae/ds-data-table": "3.70.0-next.44",
79
+ "@elliemae/ds-data-table-cell": "3.70.0-next.44",
80
+ "@elliemae/ds-data-table-expand-cell": "3.70.0-next.44",
81
+ "@elliemae/ds-data-table-drag-and-drop-cell": "3.70.0-next.44",
82
+ "@elliemae/ds-data-table-filters": "3.70.0-next.44",
83
+ "@elliemae/ds-data-table-multi-select-cell": "3.70.0-next.44",
84
+ "@elliemae/ds-data-table-cell-header": "3.70.0-next.44",
85
+ "@elliemae/ds-data-table-single-select-cell": "3.70.0-next.44",
86
+ "@elliemae/ds-dataviz-pie": "3.70.0-next.44",
87
+ "@elliemae/ds-dataviz": "3.70.0-next.44",
88
+ "@elliemae/ds-decision-graph": "3.70.0-next.44",
89
+ "@elliemae/ds-date-time-picker": "3.70.0-next.44",
90
+ "@elliemae/ds-dialog": "3.70.0-next.44",
91
+ "@elliemae/ds-drag-and-drop": "3.70.0-next.44",
92
+ "@elliemae/ds-dropdownmenu-v2": "3.70.0-next.44",
93
+ "@elliemae/ds-dropzone": "3.70.0-next.44",
94
+ "@elliemae/ds-filter-bar": "3.70.0-next.44",
95
+ "@elliemae/ds-fast-list": "3.70.0-next.44",
96
+ "@elliemae/ds-form-checkbox": "3.70.0-next.44",
97
+ "@elliemae/ds-floating-context": "3.70.0-next.44",
98
+ "@elliemae/ds-form-combobox": "3.70.0-next.44",
99
+ "@elliemae/ds-form-date-range-picker": "3.70.0-next.44",
100
+ "@elliemae/ds-form-date-time-picker": "3.70.0-next.44",
101
+ "@elliemae/ds-form-helpers-mask-hooks": "3.70.0-next.44",
102
+ "@elliemae/ds-form-input-textarea": "3.70.0-next.44",
103
+ "@elliemae/ds-form-layout-label": "3.70.0-next.44",
104
+ "@elliemae/ds-form-input-text": "3.70.0-next.44",
105
+ "@elliemae/ds-form-layout-blocks": "3.70.0-next.44",
106
+ "@elliemae/ds-form-layout-autocomplete": "3.70.0-next.44",
107
+ "@elliemae/ds-form-layout-input-group": "3.70.0-next.44",
108
+ "@elliemae/ds-form-multi-combobox": "3.70.0-next.44",
109
+ "@elliemae/ds-form-native-select": "3.70.0-next.44",
110
+ "@elliemae/ds-form-single-combobox": "3.70.0-next.44",
111
+ "@elliemae/ds-form-select": "3.70.0-next.44",
112
+ "@elliemae/ds-form-toggle": "3.70.0-next.44",
113
+ "@elliemae/ds-global-header": "3.70.0-next.44",
114
+ "@elliemae/ds-form-radio": "3.70.0-next.44",
115
+ "@elliemae/ds-grid": "3.70.0-next.44",
116
+ "@elliemae/ds-hooks-focus-trap": "3.70.0-next.44",
117
+ "@elliemae/ds-hooks-focus-stack": "3.70.0-next.44",
118
+ "@elliemae/ds-hooks-fontsize-detector": "3.70.0-next.44",
119
+ "@elliemae/ds-hooks-is-mobile": "3.70.0-next.44",
120
+ "@elliemae/ds-hooks-fontsize-media": "3.70.0-next.44",
121
+ "@elliemae/ds-hooks-is-showing-ellipsis": "3.70.0-next.44",
122
+ "@elliemae/ds-hooks-keyboard-navigation": "3.70.0-next.44",
123
+ "@elliemae/ds-hooks-on-first-focus-in": "3.70.0-next.44",
124
+ "@elliemae/ds-hooks-headless-tooltip": "3.70.0-next.44",
125
+ "@elliemae/ds-hooks-on-blur-out": "3.70.0-next.44",
126
+ "@elliemae/ds-icon": "3.70.0-next.44",
127
+ "@elliemae/ds-image": "3.70.0-next.44",
128
+ "@elliemae/ds-indeterminate-progress-indicator": "3.70.0-next.44",
129
+ "@elliemae/ds-imagelibrarymodal": "3.70.0-next.44",
130
+ "@elliemae/ds-layout-provider": "3.70.0-next.44",
131
+ "@elliemae/ds-loading-indicator": "3.70.0-next.44",
132
+ "@elliemae/ds-icons": "3.70.0-next.44",
133
+ "@elliemae/ds-left-navigation": "3.70.0-next.44",
134
+ "@elliemae/ds-menu-button": "3.70.0-next.44",
135
+ "@elliemae/ds-menu-items-action": "3.70.0-next.44",
136
+ "@elliemae/ds-menu-items-multi": "3.70.0-next.44",
137
+ "@elliemae/ds-menu-items": "3.70.0-next.44",
138
+ "@elliemae/ds-menu-items-commons": "3.70.0-next.44",
139
+ "@elliemae/ds-menu-items-separator": "3.70.0-next.44",
140
+ "@elliemae/ds-menu-items-section": "3.70.0-next.44",
141
+ "@elliemae/ds-menu-items-single": "3.70.0-next.44",
142
+ "@elliemae/ds-menu-items-skeleton": "3.70.0-next.44",
143
+ "@elliemae/ds-menu-items-submenu": "3.70.0-next.44",
144
+ "@elliemae/ds-menu-items-single-with-submenu": "3.70.0-next.44",
145
+ "@elliemae/ds-menu-tree-item": "3.70.0-next.44",
146
+ "@elliemae/ds-mobile": "3.70.0-next.44",
147
+ "@elliemae/ds-modal-slide": "3.70.0-next.44",
148
+ "@elliemae/ds-notification-badge": "3.70.0-next.44",
149
+ "@elliemae/ds-overlay": "3.70.0-next.44",
150
+ "@elliemae/ds-page-header-v1": "3.70.0-next.44",
151
+ "@elliemae/ds-page-header": "3.70.0-next.44",
152
+ "@elliemae/ds-page-header-v2": "3.70.0-next.44",
153
+ "@elliemae/ds-pagination": "3.70.0-next.44",
154
+ "@elliemae/ds-page-layout": "3.70.0-next.44",
155
+ "@elliemae/ds-pills-v2": "3.70.0-next.44",
156
+ "@elliemae/ds-progress-indicator": "3.70.0-next.44",
157
+ "@elliemae/ds-portal": "3.70.0-next.44",
158
+ "@elliemae/ds-props-helpers": "3.70.0-next.44",
159
+ "@elliemae/ds-read-more": "3.70.0-next.44",
160
+ "@elliemae/ds-query-builder": "3.70.0-next.44",
161
+ "@elliemae/ds-ribbon": "3.70.0-next.44",
162
+ "@elliemae/ds-resizeable-container": "3.70.0-next.44",
163
+ "@elliemae/ds-shared": "3.70.0-next.44",
164
+ "@elliemae/ds-shuttle-v2": "3.70.0-next.44",
165
+ "@elliemae/ds-separator": "3.70.0-next.44",
166
+ "@elliemae/ds-side-panel": "3.70.0-next.44",
167
+ "@elliemae/ds-scrollable-container": "3.70.0-next.44",
168
+ "@elliemae/ds-side-panel-header": "3.70.0-next.44",
169
+ "@elliemae/ds-skeleton": "3.70.0-next.44",
170
+ "@elliemae/ds-square-indicator": "3.70.0-next.44",
171
+ "@elliemae/ds-stepper": "3.70.0-next.44",
172
+ "@elliemae/ds-svg": "3.70.0-next.44",
173
+ "@elliemae/ds-slider-v2": "3.70.0-next.44",
174
+ "@elliemae/ds-tabs": "3.70.0-next.44",
175
+ "@elliemae/ds-system": "3.70.0-next.44",
176
+ "@elliemae/ds-toast": "3.70.0-next.44",
177
+ "@elliemae/ds-toolbar-v2": "3.70.0-next.44",
178
+ "@elliemae/ds-toolbar-v1": "3.70.0-next.44",
179
+ "@elliemae/ds-test-utils": "3.70.0-next.44",
180
+ "@elliemae/ds-tooltip-v3": "3.70.0-next.44",
181
+ "@elliemae/ds-transition": "3.70.0-next.44",
182
+ "@elliemae/ds-tree-model": "3.70.0-next.44",
183
+ "@elliemae/ds-treeview": "3.70.0-next.44",
184
+ "@elliemae/ds-truncated-expandable-text": "3.70.0-next.44",
185
+ "@elliemae/ds-typescript-helpers": "3.70.0-next.44",
186
+ "@elliemae/ds-virtual-list": "3.70.0-next.44",
187
+ "@elliemae/ds-typography": "3.70.0-next.44",
188
+ "@elliemae/ds-wizard": "3.70.0-next.44",
189
+ "@elliemae/ds-zustand-helpers": "3.70.0-next.44"
190
190
  },
191
191
  "publishConfig": {
192
192
  "access": "public"