dimsum-e2e-tests 3.70.0-next.49 → 3.70.0-next.50

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.50 (2026-07-24)
7
+
8
+ **Note:** Version bump only for package dimsum-e2e-tests
9
+
6
10
  ## 3.70.0-next.49 (2026-07-21)
7
11
 
8
12
  ### Bug Fixes
@@ -1,3 +1,4 @@
1
+ import { Key } from 'webdriverio';
1
2
  import { axeCoreCheck } from '../../../helpers';
2
3
  import DSControlledRadioCO from '../DSControlledRadioCO';
3
4
 
@@ -13,10 +14,23 @@ if (
13
14
  if (errorOnGo) throw errorOnGo;
14
15
  });
15
16
  it('01: should display radio with aria-disabled and pass axe-core scann', async () => {
16
- const radio = await DSControlledRadioCO.getRadioByIndex(1);
17
+ const result = await axeCoreCheck();
18
+ await expect(result).toHaveLength(0);
19
+ });
20
+ it('02: should focus and select first radio with aria-disabled and pass axe-core scann', async () => {
21
+ const radio = await DSControlledRadioCO.getRadioByIndex(0);
17
22
  await radio.click();
23
+ await expect(radio).toBeFocused();
24
+ await expect(radio).toBeSelected();
25
+ const result = await axeCoreCheck();
26
+ await expect(result).toHaveLength(0);
27
+ });
28
+ it('03: should focus second radio with aria-disabled and pass axe-core scann', async () => {
29
+ await browser.keys(Key.ArrowDown);
30
+ const radio = await DSControlledRadioCO.getRadioByIndex(1);
31
+ await expect(radio).toBeFocused();
18
32
  const result = await axeCoreCheck();
19
- expect(result.length).toBe(0);
33
+ await expect(result).toHaveLength(0);
20
34
  });
21
35
  });
22
36
  }
@@ -0,0 +1,37 @@
1
+ import { Key } from 'webdriverio';
2
+ import DSControlledRadioCO from '../DSControlledRadioCO';
3
+
4
+ if (
5
+ !browser.capabilities['ice:options'].isPhone &&
6
+ !browser.capabilities['ice:options'].isTablet &&
7
+ (browser.capabilities.browserName === 'Chrome' || browser.capabilities.browserName === 'chrome')
8
+ ) {
9
+ describe('PUI-18777 - DSControlledRadio:: aria-disabled group Tab navigation - Func', () => {
10
+ before('loading page', async () => {
11
+ const errorOnGo = await DSControlledRadioCO.applyAriaDisabled.go();
12
+ if (errorOnGo) throw errorOnGo;
13
+ });
14
+
15
+ it('01: should focus the checked option when tabbing into the aria-disabled group', async () => {
16
+ const firstRadio = await DSControlledRadioCO.getRadioByIndex(0);
17
+ await browser.keys(Key.Tab);
18
+ await expect(firstRadio).toBeFocused();
19
+ await expect(firstRadio).toBeSelected();
20
+ });
21
+ it('02: should focus the second option when arrow down is pressed', async () => {
22
+ const secondRadio = await DSControlledRadioCO.getRadioByIndex(1);
23
+ await browser.keys(Key.ArrowDown);
24
+ await expect(secondRadio).toBeFocused();
25
+ });
26
+
27
+ it('03: should tab out of the group instead of moving to the next option', async () => {
28
+ const firstRadio = await DSControlledRadioCO.getRadioByIndex(0);
29
+ const secondRadio = await DSControlledRadioCO.getRadioByIndex(1);
30
+ const thirdRadio = await DSControlledRadioCO.getRadioByIndex(2);
31
+ await browser.keys(Key.Tab);
32
+ await expect(firstRadio).not.toBeFocused();
33
+ await expect(secondRadio).not.toBeFocused();
34
+ await expect(thirdRadio).not.toBeFocused();
35
+ });
36
+ });
37
+ }
@@ -265,6 +265,8 @@ export default class DataTableCO extends PageObject {
265
265
 
266
266
  static customCellRowAndHeaderTest = new Urlbuilder(PATH_E2E_DATATABLE_CELL, 'custom-cell-row-and-header');
267
267
 
268
+ static toggleCellEnterFocus = new Urlbuilder(PATH_E2E_DATATABLE_CELL, 'toggle-cell-enter-focus-test');
269
+
268
270
  // Use Cases
269
271
 
270
272
  static integratedExampleWithFilters = new Urlbuilder(PATH_E2E_DATATABLE_USE_CASES, 'integrated-example-with-filters');
@@ -71,6 +71,14 @@ export default class HeaderCO extends PageObject {
71
71
  return headerCell.$('[data-testid="data-table-sort-button"]');
72
72
  };
73
73
 
74
+ // Filter icon wrapper scoped to a single header cell. The wrapper span carries the
75
+ // display:none/opacity:0 "hide" styling driven by the header's hover/focus state (PUI-15154),
76
+ // so its isDisplayed() reflects filter-icon visibility for that specific column.
77
+ static getFilterButtonInHeader = async (index) => {
78
+ const headerCell = await this.getHeaderCellByIndex(index);
79
+ return headerCell.$('[data-testid="data-table-filter-menu-button"]');
80
+ };
81
+
74
82
  // PUI-17786: a11y accessors for the resize handle. Targets the same [data-testid="ds-datatable-resizer"]
75
83
  // as the getResizeHandler selector fix (separate PR); kept distinct so these a11y specs run standalone.
76
84
  static getResizer = async (index) => $$('[data-testid="ds-datatable-resizer"]')[index];
@@ -0,0 +1,39 @@
1
+ import { mouseOver } from '../../helpers';
2
+ import DSDataTableCO from '../DSDataTableCO';
3
+ import { HeaderCO, FiltersCO } from '../components';
4
+
5
+ // SKIPPED pending fix for defect PUI-18785: an open per-column filter menu does not close when the
6
+ // user clicks the column header cell or its drag-and-drop handle — the column can even be dragged
7
+ // with the menu open, and the menu drops alongside the column and stays open. These tests capture
8
+ // the EXPECTED behavior (the menu must close on those interactions). Un-skip them once PUI-18785
9
+ // lands, then create the Test ticket and replace PUI-XXXXX.
10
+ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
11
+ describe.skip('PUI-XXXXX - DSDataTable:: filter menu closes on column header or drag interaction - Func', () => {
12
+ beforeEach(async () => {
13
+ const errorOnGo = await DSDataTableCO.sortByColumn.go();
14
+ if (errorOnGo) throw errorOnGo;
15
+ await DSDataTableCO.waitForDataTable();
16
+ });
17
+
18
+ it('01: clicking the column drag handle closes an open filter menu', async () => {
19
+ const idHeader = await HeaderCO.getHeaderCellByIndex(0);
20
+ await mouseOver(idHeader);
21
+ await (await HeaderCO.getFilterBtnByIndex(0)).click();
22
+ await expect(await FiltersCO.getFilterMenuContent()).toBeDisplayed();
23
+
24
+ const dragHandle = await HeaderCO.getHeaderCellDragHandler(idHeader);
25
+ await dragHandle.click();
26
+ await expect(await FiltersCO.getFilterMenuContent()).not.toBeDisplayed();
27
+ });
28
+
29
+ it('02: clicking the column header cell closes an open filter menu', async () => {
30
+ const idHeader = await HeaderCO.getHeaderCellByIndex(0);
31
+ await mouseOver(idHeader);
32
+ await (await HeaderCO.getFilterBtnByIndex(0)).click();
33
+ await expect(await FiltersCO.getFilterMenuContent()).toBeDisplayed();
34
+
35
+ await idHeader.click();
36
+ await expect(await FiltersCO.getFilterMenuContent()).not.toBeDisplayed();
37
+ });
38
+ });
39
+ }
@@ -0,0 +1,92 @@
1
+ import { mouseOver } from '../../helpers';
2
+ import DSDataTableCO from '../DSDataTableCO';
3
+ import { HeaderCO, RowCO } from '../components';
4
+
5
+ // Coverage for PUI-15154 (fixed): the column-header affordances — DnD drag handle, neutral sort
6
+ // caret and filter icon — stayed visibly stuck after focus/hover left the header (null-vs-null
7
+ // false match in the onBlur guard; missing resetAllHeadersExcept between columns). They must only
8
+ // show while the header has focus or hover. jsdom can't move real focus or hover, so this is
9
+ // verified in a real browser here (the shipped unit test fakes it with synthetic relatedTarget).
10
+ //
11
+ // SortByColumn columns: id(0) name(1, actively sorted) position(2) country(3) salary(4) date(5).
12
+ // position = drag handle + neutral sort caret + filter icon; date = the reported-bug column
13
+ // (drag handle + neutral sort caret, no filter). All columns are draggable.
14
+ const POSITION_COL = 2;
15
+ const DATE_COL = 5;
16
+
17
+ const expectAffordances = async (colIndex, shown, hasFilter) => {
18
+ const cell = await HeaderCO.getHeaderCellByIndex(colIndex);
19
+ const dragHandle = await HeaderCO.getHeaderCellDragHandler(cell);
20
+ const sortCaret = await HeaderCO.getSortBtnByIndex(colIndex);
21
+ if (shown) {
22
+ await expect(dragHandle).toBeExisting();
23
+ await expect(sortCaret).toBeDisplayed();
24
+ if (hasFilter) await expect(await HeaderCO.getFilterButtonInHeader(colIndex)).toBeDisplayed();
25
+ } else {
26
+ await expect(dragHandle).not.toBeExisting();
27
+ await expect(sortCaret).not.toBeDisplayed();
28
+ if (hasFilter) await expect(await HeaderCO.getFilterButtonInHeader(colIndex)).not.toBeDisplayed();
29
+ }
30
+ };
31
+
32
+ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
33
+ describe('PUI-18778 - DSDataTable:: header affordance visibility on focus and hover - Func', () => {
34
+ before(async () => {
35
+ const errorOnGo = await DSDataTableCO.sortByColumn.go();
36
+ if (errorOnGo) throw errorOnGo;
37
+ await DSDataTableCO.waitForDataTable();
38
+ });
39
+
40
+ it('01: focusing a column header shows its drag handle, sort caret and filter icon', async () => {
41
+ // Focus programmatically: the header cell has onClick=handleSort, so clicking it would also
42
+ // sort the column, and an actively-sorted column's caret then stays visible regardless of
43
+ // focus — masking the hide-on-blur behavior under test. Focusing fires onFocus without sorting.
44
+ await browser.execute((el) => el.focus(), await HeaderCO.getHeaderCellByIndex(POSITION_COL));
45
+ await expectAffordances(POSITION_COL, true, true);
46
+ });
47
+
48
+ it('02: clicking another column drag handle hides the first column drag handle', async () => {
49
+ // Marcos #2 (handle-to-handle): reveal + click column A's drag handle, then column B's.
50
+ // Focusing B's handle clears A via resetAllHeadersExcept, so A's handle no longer stays stuck.
51
+ const positionHeader = await HeaderCO.getHeaderCellByIndex(POSITION_COL);
52
+ await mouseOver(positionHeader);
53
+ const positionHandle = await HeaderCO.getHeaderCellDragHandler(positionHeader);
54
+ await positionHandle.waitForDisplayed({ timeout: 3000 });
55
+ await positionHandle.click();
56
+
57
+ const dateHeader = await HeaderCO.getHeaderCellByIndex(DATE_COL);
58
+ await mouseOver(dateHeader);
59
+ const dateHandle = await HeaderCO.getHeaderCellDragHandler(dateHeader);
60
+ await dateHandle.waitForDisplayed({ timeout: 3000 });
61
+ await dateHandle.click();
62
+
63
+ // Column A's (position) drag handle is gone; column B's (date) handle is present.
64
+ const positionCell = await HeaderCO.getHeaderCellByIndex(POSITION_COL);
65
+ await expect(await HeaderCO.getHeaderCellDragHandler(positionCell)).not.toBeExisting();
66
+ const dateCell = await HeaderCO.getHeaderCellByIndex(DATE_COL);
67
+ await expect(await HeaderCO.getHeaderCellDragHandler(dateCell)).toBeExisting();
68
+ });
69
+
70
+ it('03: blurring focus away entirely hides the affordances', async () => {
71
+ // Reported bug: focus leaves with nowhere to land. Ensure the pointer is off any header (so
72
+ // hover isn't keeping the column visible), then drop focus. onBlur fires with relatedTarget
73
+ // null and, since date has no filter, filterIconRef is null too: the null-vs-null false match
74
+ // that used to skip the reset (PUI-15154) must no longer keep the affordances stuck visible.
75
+ await mouseOver(await RowCO.getRowByIndex(3));
76
+ await browser.execute(() => {
77
+ if (document.activeElement instanceof HTMLElement) document.activeElement.blur();
78
+ });
79
+ await expectAffordances(DATE_COL, false, false);
80
+ });
81
+
82
+ it('04: hovering a column header shows its drag handle, sort caret and filter icon', async () => {
83
+ await mouseOver(await HeaderCO.getHeaderCellByIndex(POSITION_COL));
84
+ await expectAffordances(POSITION_COL, true, true);
85
+ });
86
+
87
+ it('05: moving the mouse away from the header hides the affordances', async () => {
88
+ await mouseOver(await RowCO.getRowByIndex(3));
89
+ await expectAffordances(POSITION_COL, false, true);
90
+ });
91
+ });
92
+ }
@@ -0,0 +1,31 @@
1
+ import { Key } from 'webdriverio';
2
+ import DSDataTableCO from '../DSDataTableCO';
3
+ import { RowCO, CellCO } from '../components';
4
+ import DSToggleCO from '../../ds-form-toggle/DSToggleCO';
5
+
6
+ // Coverage for PUI-14730 (fixed): a toggle (DSControlledToggle) used as a custom cell did not
7
+ // receive focus on the first Enter — it dropped its ref (containerProps only reached the wrapper
8
+ // div; innerRef was discarded). Fixed in ds-form-toggle by forwarding innerRef to the underlying
9
+ // <button role="switch">. The story renders the toggle as the FIRST focusable cell, so Enter on a
10
+ // focused row must land focus on the toggle button (row.cells.find(c => c.ref.current).focus()).
11
+ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
12
+ describe('PUI-18783 - DSDataTable:: toggle custom cell focus on row Enter - Func', () => {
13
+ before(async () => {
14
+ const errorOnGo = await DSDataTableCO.toggleCellEnterFocus.go();
15
+ if (errorOnGo) throw errorOnGo;
16
+ await DSDataTableCO.waitForDataTable();
17
+ });
18
+
19
+ it('01: pressing Enter on a focused row moves focus to the toggle custom cell', async () => {
20
+ // Focus the row by clicking its first cell (the focusable row-content, role="row", receives
21
+ // focus), then press Enter — matches the editable-cell Enter-to-first-cell pattern.
22
+ const row = await RowCO.getRowByIndex(0);
23
+ const firstCell = await CellCO.getRowCellByIndex(row, 0);
24
+ await firstCell.click();
25
+ await browser.keys(Key.Return);
26
+
27
+ const toggle = await DSToggleCO.getToggleFocuseableByIndex(0);
28
+ await expect(toggle).toBeFocused();
29
+ });
30
+ });
31
+ }
@@ -17,6 +17,11 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
17
17
  it('02: should have expanded calendar, empty input and pass axe-core scan', async () => {
18
18
  const calendarTrigger = await DateRangePickerCO.getPickerBtn();
19
19
  await calendarTrigger.click();
20
+ // PUI-15571: the calendar popover must be announced as a dialog (it used to expose
21
+ // role="region"), with an accessible name (WCAG 4.1.2 Name, Role, Value).
22
+ const dialog = await DateRangePickerCO.getCalendarDialog();
23
+ await expect(dialog).toHaveAttribute('role', 'dialog');
24
+ await expect(dialog).toHaveAttribute('aria-label', 'calendar header');
20
25
  const result = await axeCoreCheck();
21
26
  expect(result.length).toBe(0);
22
27
  });
@@ -34,8 +34,16 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
34
34
  await openPickerBtn.click();
35
35
  const startDate = await DateRangePickerCO.getRangeStartDay();
36
36
  const endDate = await DateRangePickerCO.getRangeEndDay();
37
- await expect(startDate).toHaveAttribute('aria-label', 'February third 2020, Monday');
38
- await expect(endDate).toHaveAttribute('aria-label', 'February eighth 2020, Saturday');
37
+ // PUI-18279 (a11y): days inside the selected range announce the whole range instead of a
38
+ // bare weekday label, so screen-reader users hear the full selection on every range day.
39
+ await expect(startDate).toHaveAttribute(
40
+ 'aria-label',
41
+ 'February third 2020, range from February third 2020 to February eighth 2020 selected.',
42
+ );
43
+ await expect(endDate).toHaveAttribute(
44
+ 'aria-label',
45
+ 'February eighth 2020, range from February third 2020 to February eighth 2020 selected.',
46
+ );
39
47
  });
40
48
  it('03: should change the text input to the picked date (mouse)', async () => {
41
49
  const exampleDate1 = await DateRangePickerCO.getDayOnCalendarByIndex(16);
@@ -55,24 +63,78 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
55
63
  await expect(endingDay).toHaveValue(expect.stringContaining('09'));
56
64
  await expect(endingYear).toHaveValue(expect.stringContaining('2020'));
57
65
  });
58
- it('04: should change the text input to the picked date (KB)', async () => {
59
- await browser.keys(Key.ArrowDown);
60
- await browser.keys(Key.Return);
66
+ // Keyboard range selection previously lived here as a 4th step, but it re-picked over the range
67
+ // typed in test 01 (a stateful re-pick whose result is hard to reason about). It now has
68
+ // dedicated, deterministic, fresh-state coverage in the PUI-15572 describe below (mouse +
69
+ // keyboard + auto-ordering).
70
+ });
71
+
72
+ // PUI-15572 (WCAG 3.2.2 On Input): completing the range must close the calendar automatically and
73
+ // return focus to the trigger so the user knows the selection succeeded. beforeEach reloads a
74
+ // fresh empty picker so each scenario is independent (the stateful Basic flow above re-picks over
75
+ // an existing range and is intentionally not used to assert closure). The story fixes
76
+ // onCalendarOpenFocusedDay to 12/27/2000, so keyboard navigation lands on deterministic days.
77
+ describe('PUI-18775 - DSControlledDateRangePicker:: calendar closes on completed range -Func', () => {
78
+ beforeEach('loading page', async () => {
79
+ const errorOnGo = await DateRangePickerCO.basic.go();
80
+ if (errorOnGo) throw errorOnGo;
81
+ });
82
+
83
+ it('01: should stay open on start pick, then close and refocus trigger on end pick (mouse)', async () => {
84
+ const openPickerBtn = await DateRangePickerCO.getPickerBtn();
85
+ await openPickerBtn.click();
86
+ const dialog = await DateRangePickerCO.getCalendarDialog();
87
+ await expect(dialog).toBeDisplayedInViewport();
88
+
89
+ // first pick = start date -> range incomplete, calendar must stay open
90
+ await (await DateRangePickerCO.getDayOnCalendarByIndex(16)).click();
91
+ await expect(dialog).toBeDisplayedInViewport();
92
+
93
+ // second pick = end date -> range complete, calendar must close and focus returns to trigger
94
+ await (await DateRangePickerCO.getDayOnCalendarByIndex(20)).click();
95
+ await expect(dialog).not.toBeDisplayedInViewport();
96
+ await expect(openPickerBtn).toBeFocused();
97
+ });
98
+
99
+ it('02: should complete the range via keyboard, closing the calendar and refocusing the trigger', async () => {
100
+ const openPickerBtn = await DateRangePickerCO.getPickerBtn();
101
+ await openPickerBtn.click();
102
+ const dialog = await DateRangePickerCO.getCalendarDialog();
103
+ await expect(dialog).toBeDisplayedInViewport();
104
+
105
+ // focus opens on Dec 27 2000; ArrowRight -> Dec 28, Enter picks the start (range incomplete)
61
106
  await browser.keys(Key.ArrowRight);
107
+ await browser.keys(Key.Enter);
108
+ await expect(dialog).toBeDisplayedInViewport();
109
+
110
+ // ArrowRight x2 -> Dec 30, Enter completes the range -> calendar closes and focus returns
62
111
  await browser.keys(Key.ArrowRight);
63
- await browser.keys(Key.Space);
64
- const startingMonth = await DateRangePickerCO.getMonthInputByIndex(0);
65
- const startingDay = await DateRangePickerCO.getDayInputByIndex(0);
66
- const startingYear = await DateRangePickerCO.getYearInputByIndex(0);
67
- const endingMonth = await DateRangePickerCO.getMonthInputByIndex(1);
68
- const endingDay = await DateRangePickerCO.getDayInputByIndex(1);
69
- const endingYear = await DateRangePickerCO.getYearInputByIndex(1);
70
- await expect(startingMonth).toHaveValue(expect.stringContaining('02'));
71
- await expect(startingDay).toHaveValue(expect.stringContaining('14'));
72
- await expect(startingYear).toHaveValue(expect.stringContaining('2020'));
73
- await expect(endingMonth).toHaveValue(expect.stringContaining('02'));
74
- await expect(endingDay).toHaveValue(expect.stringContaining('16'));
75
- await expect(endingYear).toHaveValue(expect.stringContaining('2020'));
112
+ await browser.keys(Key.ArrowRight);
113
+ await browser.keys(Key.Enter);
114
+ await expect(dialog).not.toBeDisplayedInViewport();
115
+ await expect(openPickerBtn).toBeFocused();
116
+
117
+ await expect(await DateRangePickerCO.getMonthInputByIndex(0)).toHaveValue(expect.stringContaining('12'));
118
+ await expect(await DateRangePickerCO.getDayInputByIndex(0)).toHaveValue(expect.stringContaining('28'));
119
+ await expect(await DateRangePickerCO.getMonthInputByIndex(1)).toHaveValue(expect.stringContaining('12'));
120
+ await expect(await DateRangePickerCO.getDayInputByIndex(1)).toHaveValue(expect.stringContaining('30'));
121
+ });
122
+
123
+ it('03: should auto-order the range when the completing pick precedes the start pick', async () => {
124
+ const openPickerBtn = await DateRangePickerCO.getPickerBtn();
125
+ await openPickerBtn.click();
126
+ const dialog = await DateRangePickerCO.getCalendarDialog();
127
+
128
+ // pick the start (Dec 28), then pick an earlier day (ArrowUp = -1 week -> Dec 21)
129
+ await browser.keys(Key.ArrowRight);
130
+ await browser.keys(Key.Enter);
131
+ await browser.keys(Key.ArrowUp);
132
+ await browser.keys(Key.Enter);
133
+
134
+ // the earlier day becomes the start (from < to) and the range completes -> calendar closes
135
+ await expect(dialog).not.toBeDisplayedInViewport();
136
+ await expect(await DateRangePickerCO.getDayInputByIndex(0)).toHaveValue(expect.stringContaining('21'));
137
+ await expect(await DateRangePickerCO.getDayInputByIndex(1)).toHaveValue(expect.stringContaining('28'));
76
138
  });
77
139
  });
78
140
 
@@ -118,6 +118,12 @@ export default class DateRangePickerCO extends PageObject {
118
118
  return $(`[data-testid="ds-controlled-date-time-picker-calendar-context-content-wrapper"]`);
119
119
  }
120
120
 
121
+ // The open calendar popover is the modal dialog (role="dialog"); it is the same DOM node as
122
+ // the contextual-menu wrapper above, exposed here under an accessibility-semantic name.
123
+ static async getCalendarDialog() {
124
+ return $(`[data-testid="ds-controlled-date-time-picker-calendar-context-content-wrapper"]`);
125
+ }
126
+
121
127
  static async getCalendarHeaderLabel() {
122
128
  return $(`[data-testid="ds-controlled-date-time-picker-calendar-header-label"]`);
123
129
  }
@@ -0,0 +1,45 @@
1
+ import DateTimePickerCO from '../DSControlledDateTimePickerCO';
2
+ import { type } from '../../helpers';
3
+
4
+ // Tests for the fix introduced in PUI-15900 (focus lost when the input holds a partial date
5
+ // while onCalendarOpenFocusedDay is set — the displayed month must follow the focused day so
6
+ // the prop date is rendered and receives focus on open).
7
+ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
8
+ describe('PUI-18784 - DSControlledDateTimePicker:: focus on calendar open with partial date -Func', () => {
9
+ beforeEach('loading page', async () => {
10
+ const errorOnGo = await DateTimePickerCO.emptyDatePickerStartingMonth.go();
11
+ if (errorOnGo) throw errorOnGo;
12
+ });
13
+
14
+ it('01: empty input focuses the onCalendarOpenFocusedDay day (Dec 27) on open', async () => {
15
+ const trigger = await DateTimePickerCO.getTrigger();
16
+ await trigger.click();
17
+
18
+ const focusedDay = await DateTimePickerCO.getCalendarFocusedDay();
19
+ await expect(focusedDay).toHaveText('27');
20
+ await expect(focusedDay).toBeFocused();
21
+ });
22
+
23
+ it('02: partial month still focuses the onCalendarOpenFocusedDay day (Dec 27) on open', async () => {
24
+ const month = await DateTimePickerCO.getMonthInput();
25
+ await month.click();
26
+ await type('1'); // partial date — month typed, no day/year
27
+
28
+ const trigger = await DateTimePickerCO.getTrigger();
29
+ await trigger.click();
30
+
31
+ // grid follows the focused day's month (December) so the prop date is visible + focused
32
+ const focusedDay = await DateTimePickerCO.getCalendarFocusedDay();
33
+ await expect(focusedDay).toHaveText('27');
34
+ await expect(focusedDay).toBeFocused();
35
+
36
+ // the displayed month must be December 2000 (the prop's month), not the typed January
37
+ const headerLabel = await DateTimePickerCO.getCalendarHeaderLabel();
38
+ await expect(headerLabel).toHaveText('December 2000');
39
+
40
+ // focus must NOT have landed on the previous-month navigation button
41
+ const prevMonthBtn = await DateTimePickerCO.getCalendarPrevMonthBtn();
42
+ await expect(prevMonthBtn).not.toBeFocused();
43
+ });
44
+ });
45
+ }
@@ -0,0 +1,27 @@
1
+ import GlobalHeader from './GlobalHeaderCO';
2
+
3
+ if (
4
+ (!browser.capabilities['ice:options'].isPhone &&
5
+ !browser.capabilities['ice:options'].isTablet &&
6
+ browser.capabilities.browserName === 'chrome') ||
7
+ browser.capabilities.browserName === 'Chrome'
8
+ ) {
9
+ describe('PUI-18771 - GlobalHeader: SearchToggle result announcement -Func', () => {
10
+ before(async () => {
11
+ const errorOnGo = await GlobalHeader.withSearchToggleURL.go();
12
+ if (errorOnGo) throw errorOnGo;
13
+ await GlobalHeader.openAndPopulateSearchToggle();
14
+ });
15
+ it('01: search input should expose the accessible name guiding users to the result navigation', async () => {
16
+ const searchInput = await GlobalHeader.getSearchToggleInput();
17
+ await expect(searchInput).toHaveAttribute(
18
+ 'aria-label',
19
+ 'Search among the content of the page. Press Tab twice to reach the result navigation.',
20
+ );
21
+ });
22
+ it('02: results spinbutton should announce the total result count after typing', async () => {
23
+ const spinButton = await GlobalHeader.getSearchToggleSpinbutton();
24
+ await expect(spinButton).toHaveAttribute('aria-valuetext', '3 total results');
25
+ });
26
+ });
27
+ }
@@ -19,14 +19,14 @@ if (
19
19
  await browser.keys(Key.Tab);
20
20
  await browser.keys(Key.Tab);
21
21
  const result = await axeCoreCheck();
22
- expect(result.length).toBe(0);
22
+ await expect(result).toHaveLength(0);
23
23
  });
24
24
  it('02: should have global header with expanded appPicker and pass axe-core scan', async () => {
25
25
  await browser.keys(Key.Tab);
26
26
  await browser.keys(Key.Enter);
27
27
 
28
28
  const result = await axeCoreCheck();
29
- expect(result.length).toBe(0);
29
+ await expect(result).toHaveLength(0);
30
30
  });
31
31
  it('03: should have global header with expanded menu-list and pass axe-core scan', async () => {
32
32
  await browser.keys(Key.Escape);
@@ -34,7 +34,7 @@ if (
34
34
  await browser.keys(Key.Tab);
35
35
  await browser.keys(Key.Enter);
36
36
  const result = await axeCoreCheck();
37
- expect(result.length).toBe(0);
37
+ await expect(result).toHaveLength(0);
38
38
  });
39
39
  });
40
40
 
@@ -47,12 +47,12 @@ if (
47
47
  const globalHeader = await GlobalHeaderCO.getGlobalHeader();
48
48
  await globalHeader.waitForDisplayed();
49
49
  const result = await axeCoreCheck();
50
- expect(result.length).toBe(0);
50
+ await expect(result).toHaveLength(0);
51
51
  });
52
52
  });
53
53
 
54
54
  // Skipped due to defect PUI-17970
55
- describe.skip('PUI-12447 - GlobalHeader: toggle search -AxeCore', () => {
55
+ describe('PUI-12447 - GlobalHeader: toggle search -AxeCore', () => {
56
56
  before(async () => {
57
57
  const errorOnGo = await GlobalHeaderCO.withSearchToggleURL.go();
58
58
  if (errorOnGo) throw errorOnGo;
@@ -61,19 +61,19 @@ if (
61
61
  const globalHeader = await GlobalHeaderCO.getGlobalHeader();
62
62
  await globalHeader.waitForDisplayed();
63
63
  const result = await axeCoreCheck();
64
- expect(result.length).toBe(0);
64
+ await expect(result).toHaveLength(0);
65
65
  });
66
66
  it('02: should have global header with toggle-search expanded and pass axe-core scan', async () => {
67
67
  const toggleSearch = await GlobalHeaderCO.getGHToolbarItem(0);
68
68
  await toggleSearch.click();
69
69
  await type('Hola');
70
70
  const result = await axeCoreCheck();
71
- expect(result.length).toBe(0);
71
+ await expect(result).toHaveLength(0);
72
72
  });
73
73
  it('03: should have global header with populated toggle-search and pass axe-core scan', async () => {
74
74
  await type('Hola');
75
75
  const result = await axeCoreCheck();
76
- expect(result.length).toBe(0);
76
+ await expect(result).toHaveLength(0);
77
77
  });
78
78
  });
79
79
 
@@ -86,12 +86,12 @@ if (
86
86
  const globalHeader = await GlobalHeaderCO.getGlobalHeader();
87
87
  await globalHeader.waitForDisplayed();
88
88
  const result = await axeCoreCheck();
89
- expect(result.length).toBe(0);
89
+ await expect(result).toHaveLength(0);
90
90
  });
91
91
  });
92
92
 
93
93
  // Skipped due to defect PUI-17970
94
- describe.skip('PUI-18379 - GlobalHeader: with search toggle -AxeCore', () => {
94
+ describe('PUI-18379 - GlobalHeader: with search toggle -AxeCore', () => {
95
95
  before(async () => {
96
96
  const errorOnGo = await GlobalHeaderCO.withSearchToggleURL.go();
97
97
  if (errorOnGo) throw errorOnGo;
@@ -103,7 +103,7 @@ if (
103
103
  await expect(toggleSearch).toHaveAttribute('aria-expanded', 'false');
104
104
  await expect(toggleSearch).toHaveAttribute('aria-controls');
105
105
  const result = await axeCoreCheck();
106
- expect(result.length).toBe(0);
106
+ await expect(result).toHaveLength(0);
107
107
  });
108
108
  it('02: should have global header with search toggle expanded and pass axe-core scan', async () => {
109
109
  const toggleSearch = await GlobalHeaderCO.getGHToolbarItem(0);
@@ -111,17 +111,17 @@ if (
111
111
  await expect(toggleSearch).toHaveAttribute('aria-expanded', 'true');
112
112
  await expect(toggleSearch).toHaveAttribute('aria-controls', /^ds-global-header/);
113
113
  const result = await axeCoreCheck();
114
- expect(result.length).toBe(0);
114
+ await expect(result).toHaveLength(0);
115
115
  });
116
116
  it('03: should have global header with populated search toggle and pass axe-core scan', async () => {
117
117
  await type('Labor');
118
118
  const result = await axeCoreCheck();
119
- expect(result.length).toBe(0);
119
+ await expect(result).toHaveLength(0);
120
120
  });
121
121
  });
122
122
 
123
123
  // Skipped due to defect PUI-17970
124
- describe.skip('PUI-16270 - GlobalHeader: Controled with Iframe -AxeCore', () => {
124
+ describe('PUI-16270 - GlobalHeader: Controled with Iframe -AxeCore', () => {
125
125
  before(async () => {
126
126
  const errorOnGo = await GlobalHeaderCO.iframeURL.go();
127
127
  if (errorOnGo) throw errorOnGo;
@@ -130,7 +130,7 @@ if (
130
130
  const globalHeader = await GlobalHeaderCO.getGlobalHeader();
131
131
  await globalHeader.waitForDisplayed();
132
132
  const result = await axeCoreCheck({ extraDisabledRules: ['landmark-one-main'] });
133
- expect(result.length).toBe(0);
133
+ await expect(result).toHaveLength(0);
134
134
  });
135
135
  });
136
136
  }
@@ -1,7 +1,19 @@
1
1
  import { Key } from 'webdriverio';
2
2
  import GlobalHeader from './GlobalHeaderCO';
3
3
 
4
- if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
4
+ // Asserts the search-toggle spinbutton reflects the expected selected-result state.
5
+ const expectSelectedResult = async (valuenow, valuetext) => {
6
+ const spinButton = await GlobalHeader.getSearchToggleSpinbutton();
7
+ await expect(spinButton).toHaveAttribute('aria-valuenow', valuenow);
8
+ await expect(spinButton).toHaveAttribute('aria-valuetext', valuetext);
9
+ };
10
+
11
+ if (
12
+ (!browser.capabilities['ice:options'].isPhone &&
13
+ !browser.capabilities['ice:options'].isTablet &&
14
+ browser.capabilities.browserName === 'chrome') ||
15
+ browser.capabilities.browserName === 'Chrome'
16
+ ) {
5
17
  describe('PUI-10036 - GlobalHeader: title and aria attributes', () => {
6
18
  before(async () => {
7
19
  const errorOnGo = await GlobalHeader.customAttributes.go();
@@ -80,4 +92,61 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
80
92
  await expect(firstToolbarItem).not.toBeFocused();
81
93
  });
82
94
  });
95
+
96
+ // Tests for the fix in PUI-17974 (SearchToggle arrow navigation could not start with ArrowDown nor cycle)
97
+ describe('PUI-18772 - GlobalHeader: SearchToggle result navigation with ArrowDown -Func', () => {
98
+ before(async () => {
99
+ const errorOnGo = await GlobalHeader.withSearchToggleURL.go();
100
+ if (errorOnGo) throw errorOnGo;
101
+ await GlobalHeader.openAndPopulateSearchToggle();
102
+ });
103
+ it('01: should be idle (no result selected) before navigation starts', async () => {
104
+ await expectSelectedResult('0', '3 total results');
105
+ });
106
+ it('02: should start navigation on last result when pressing ArrowDown from idle', async () => {
107
+ await browser.keys(Key.ArrowDown);
108
+ await expectSelectedResult('3', 'result 3 of 3');
109
+ });
110
+ it('03: should move to the previous result on subsequent ArrowDown', async () => {
111
+ await browser.keys(Key.ArrowDown);
112
+ await expectSelectedResult('2', 'result 2 of 3');
113
+ });
114
+ it('04: should reach the first result on ArrowDown', async () => {
115
+ await browser.keys(Key.ArrowDown);
116
+ await expectSelectedResult('1', 'result 1 of 3');
117
+ });
118
+ it('05: should cycle from the first result back to the last on ArrowDown', async () => {
119
+ await browser.keys(Key.ArrowDown);
120
+ await expectSelectedResult('3', 'result 3 of 3');
121
+ });
122
+ });
123
+
124
+ // Tests for the fix in PUI-17974 (SearchToggle arrow navigation could not start with ArrowDown nor cycle)
125
+ describe('PUI-18773 - GlobalHeader: SearchToggle result navigation with ArrowUp -Func', () => {
126
+ // same setup as above; here the ArrowUp navigation is exercised from idle
127
+ before(async () => {
128
+ const errorOnGo = await GlobalHeader.withSearchToggleURL.go();
129
+ if (errorOnGo) throw errorOnGo;
130
+ await GlobalHeader.openAndPopulateSearchToggle();
131
+ });
132
+ it('01: should be idle (no result selected) before navigation starts', async () => {
133
+ await expectSelectedResult('0', '3 total results');
134
+ });
135
+ it('02: should start navigation on the first result when pressing ArrowUp from idle', async () => {
136
+ await browser.keys(Key.ArrowUp);
137
+ await expectSelectedResult('1', 'result 1 of 3');
138
+ });
139
+ it('03: should move to the next result on subsequent ArrowUp', async () => {
140
+ await browser.keys(Key.ArrowUp);
141
+ await expectSelectedResult('2', 'result 2 of 3');
142
+ });
143
+ it('04: should reach the last result on ArrowUp', async () => {
144
+ await browser.keys(Key.ArrowUp);
145
+ await expectSelectedResult('3', 'result 3 of 3');
146
+ });
147
+ it('05: should cycle from the last result back to the first on ArrowUp', async () => {
148
+ await browser.keys(Key.ArrowUp);
149
+ await expectSelectedResult('1', 'result 1 of 3');
150
+ });
151
+ });
83
152
  }
@@ -1,6 +1,6 @@
1
1
  /* eslint-disable import/no-relative-packages */
2
2
  import { PATH_E2E_GLOBAL_HEADER } from '../paths';
3
- import { PageObject, Urlbuilder } from '../helpers';
3
+ import { PageObject, Urlbuilder, type } from '../helpers';
4
4
 
5
5
  export default class GlobalHeader extends PageObject {
6
6
  static basicURL = new Urlbuilder(PATH_E2E_GLOBAL_HEADER, 'basic');
@@ -84,6 +84,30 @@ export default class GlobalHeader extends PageObject {
84
84
  return $('button*=Skip');
85
85
  }
86
86
 
87
+ static async getSearchToggleInput() {
88
+ return $('[data-testid="ds-globalheader-searchtoggle-textinput"]');
89
+ }
90
+
91
+ static async getSearchToggleSpinbutton() {
92
+ return $('[data-testid="ds-globalheader-searchtoggle-spinbutton-text"]');
93
+ }
94
+
95
+ // Opens the search toggle, runs a query, and focuses the populated results spinbutton
96
+ // so result navigation can be exercised. Waits for results to load before returning.
97
+ static async openAndPopulateSearchToggle(searchText = 'Labor') {
98
+ const toggleSearch = await GlobalHeader.getGHToolbarItem(0);
99
+ await toggleSearch.click();
100
+ const searchInput = await GlobalHeader.getSearchToggleInput();
101
+ await searchInput.click();
102
+ await type(searchText);
103
+ const spinButton = await GlobalHeader.getSearchToggleSpinbutton();
104
+ await browser.waitUntil(async () => (await spinButton.getText()) !== 'n/a', {
105
+ timeout: 3000,
106
+ timeoutMsg: 'search results did not populate after typing',
107
+ });
108
+ await spinButton.click();
109
+ }
110
+
87
111
  // Slots
88
112
 
89
113
  static async getGHBreadcrumbChevronlotByIndex(index = 0) {
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.49",
4
+ "version": "3.70.0-next.50",
5
5
  "description": "End-to-end tests for dimsum library",
6
6
  "dependencies": {
7
7
  "@elliemae/ds-legacy-button": "1.0.16",
@@ -38,154 +38,154 @@
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-app-picker": "3.70.0-next.49",
42
- "@elliemae/ds-accordion": "3.70.0-next.49",
43
- "@elliemae/ds-backdrop": "3.70.0-next.49",
44
- "@elliemae/ds-breadcrumb": "3.70.0-next.49",
45
- "@elliemae/ds-card-navigation": "3.70.0-next.49",
46
- "@elliemae/ds-basic": "3.70.0-next.49",
47
- "@elliemae/ds-card-v1": "3.70.0-next.49",
48
- "@elliemae/ds-banner": "3.70.0-next.49",
49
- "@elliemae/ds-card-v1-detail": "3.70.0-next.49",
50
- "@elliemae/ds-card-v2": "3.70.0-next.49",
51
- "@elliemae/ds-card-v3": "3.70.0-next.49",
52
- "@elliemae/ds-card-v2-action-addon": "3.70.0-next.49",
53
- "@elliemae/ds-card-v2-group": "3.70.0-next.49",
54
- "@elliemae/ds-button-v2": "3.70.0-next.49",
55
- "@elliemae/ds-card-v3-poc": "3.70.0-next.49",
56
- "@elliemae/ds-chat": "3.70.0-next.49",
57
- "@elliemae/ds-chat-card": "3.70.0-next.49",
58
- "@elliemae/ds-chat-bubble": "3.70.0-next.49",
59
- "@elliemae/ds-accessibility": "3.70.0-next.49",
60
- "@elliemae/ds-chat-container-header": "3.70.0-next.49",
61
- "@elliemae/ds-chat-container": "3.70.0-next.49",
62
- "@elliemae/ds-chat-empty-state": "3.70.0-next.49",
63
- "@elliemae/ds-card": "3.70.0-next.49",
64
- "@elliemae/ds-chat-floating-button": "3.70.0-next.49",
65
- "@elliemae/ds-chat-message-delimeter": "3.70.0-next.49",
66
- "@elliemae/ds-chat-sidebar": "3.70.0-next.49",
67
- "@elliemae/ds-chat-system-message": "3.70.0-next.49",
68
- "@elliemae/ds-chat-tile": "3.70.0-next.49",
69
- "@elliemae/ds-chip": "3.70.0-next.49",
70
- "@elliemae/ds-codeeditor": "3.70.0-next.49",
71
- "@elliemae/ds-comments": "3.70.0-next.49",
72
- "@elliemae/ds-classnames": "3.70.0-next.49",
73
- "@elliemae/ds-circular-progress-indicator": "3.70.0-next.49",
74
- "@elliemae/ds-controlled-form": "3.70.0-next.49",
75
- "@elliemae/ds-csv-converter": "3.70.0-next.49",
76
- "@elliemae/ds-data-table-action-cell": "3.70.0-next.49",
77
- "@elliemae/ds-data-table-cell": "3.70.0-next.49",
78
- "@elliemae/ds-data-table": "3.70.0-next.49",
79
- "@elliemae/ds-data-table-cell-header": "3.70.0-next.49",
80
- "@elliemae/ds-data-table-drag-and-drop-cell": "3.70.0-next.49",
81
- "@elliemae/ds-data-table-expand-cell": "3.70.0-next.49",
82
- "@elliemae/ds-data-table-multi-select-cell": "3.70.0-next.49",
83
- "@elliemae/ds-data-table-single-select-cell": "3.70.0-next.49",
84
- "@elliemae/ds-data-table-filters": "3.70.0-next.49",
85
- "@elliemae/ds-dataviz-pie": "3.70.0-next.49",
86
- "@elliemae/ds-dialog": "3.70.0-next.49",
87
- "@elliemae/ds-decision-graph": "3.70.0-next.49",
88
- "@elliemae/ds-dataviz": "3.70.0-next.49",
89
- "@elliemae/ds-date-time-picker": "3.70.0-next.49",
90
- "@elliemae/ds-dropzone": "3.70.0-next.49",
91
- "@elliemae/ds-drag-and-drop": "3.70.0-next.49",
92
- "@elliemae/ds-dropdownmenu-v2": "3.70.0-next.49",
93
- "@elliemae/ds-filter-bar": "3.70.0-next.49",
94
- "@elliemae/ds-form-checkbox": "3.70.0-next.49",
95
- "@elliemae/ds-fast-list": "3.70.0-next.49",
96
- "@elliemae/ds-form-combobox": "3.70.0-next.49",
97
- "@elliemae/ds-form-date-range-picker": "3.70.0-next.49",
98
- "@elliemae/ds-floating-context": "3.70.0-next.49",
99
- "@elliemae/ds-form-helpers-mask-hooks": "3.70.0-next.49",
100
- "@elliemae/ds-form-input-text": "3.70.0-next.49",
101
- "@elliemae/ds-form-date-time-picker": "3.70.0-next.49",
102
- "@elliemae/ds-form-input-textarea": "3.70.0-next.49",
103
- "@elliemae/ds-form-layout-autocomplete": "3.70.0-next.49",
104
- "@elliemae/ds-form-layout-input-group": "3.70.0-next.49",
105
- "@elliemae/ds-form-native-select": "3.70.0-next.49",
106
- "@elliemae/ds-form-radio": "3.70.0-next.49",
107
- "@elliemae/ds-form-select": "3.70.0-next.49",
108
- "@elliemae/ds-form-layout-blocks": "3.70.0-next.49",
109
- "@elliemae/ds-form-toggle": "3.70.0-next.49",
110
- "@elliemae/ds-form-single-combobox": "3.70.0-next.49",
111
- "@elliemae/ds-grid": "3.70.0-next.49",
112
- "@elliemae/ds-hooks-focus-stack": "3.70.0-next.49",
113
- "@elliemae/ds-global-header": "3.70.0-next.49",
114
- "@elliemae/ds-hooks-fontsize-detector": "3.70.0-next.49",
115
- "@elliemae/ds-hooks-focus-trap": "3.70.0-next.49",
116
- "@elliemae/ds-form-layout-label": "3.70.0-next.49",
117
- "@elliemae/ds-hooks-fontsize-media": "3.70.0-next.49",
118
- "@elliemae/ds-hooks-keyboard-navigation": "3.70.0-next.49",
119
- "@elliemae/ds-hooks-headless-tooltip": "3.70.0-next.49",
120
- "@elliemae/ds-hooks-is-mobile": "3.70.0-next.49",
121
- "@elliemae/ds-hooks-is-showing-ellipsis": "3.70.0-next.49",
122
- "@elliemae/ds-hooks-on-blur-out": "3.70.0-next.49",
123
- "@elliemae/ds-hooks-on-first-focus-in": "3.70.0-next.49",
124
- "@elliemae/ds-image": "3.70.0-next.49",
125
- "@elliemae/ds-form-multi-combobox": "3.70.0-next.49",
126
- "@elliemae/ds-icon": "3.70.0-next.49",
127
- "@elliemae/ds-imagelibrarymodal": "3.70.0-next.49",
128
- "@elliemae/ds-icons": "3.70.0-next.49",
129
- "@elliemae/ds-left-navigation": "3.70.0-next.49",
130
- "@elliemae/ds-indeterminate-progress-indicator": "3.70.0-next.49",
131
- "@elliemae/ds-menu-button": "3.70.0-next.49",
132
- "@elliemae/ds-layout-provider": "3.70.0-next.49",
133
- "@elliemae/ds-loading-indicator": "3.70.0-next.49",
134
- "@elliemae/ds-menu-items-action": "3.70.0-next.49",
135
- "@elliemae/ds-menu-items": "3.70.0-next.49",
136
- "@elliemae/ds-menu-items-multi": "3.70.0-next.49",
137
- "@elliemae/ds-menu-items-commons": "3.70.0-next.49",
138
- "@elliemae/ds-menu-items-section": "3.70.0-next.49",
139
- "@elliemae/ds-menu-items-separator": "3.70.0-next.49",
140
- "@elliemae/ds-menu-items-single-with-submenu": "3.70.0-next.49",
141
- "@elliemae/ds-menu-items-single": "3.70.0-next.49",
142
- "@elliemae/ds-menu-items-skeleton": "3.70.0-next.49",
143
- "@elliemae/ds-menu-tree-item": "3.70.0-next.49",
144
- "@elliemae/ds-mobile": "3.70.0-next.49",
145
- "@elliemae/ds-menu-items-submenu": "3.70.0-next.49",
146
- "@elliemae/ds-modal-slide": "3.70.0-next.49",
147
- "@elliemae/ds-notification-badge": "3.70.0-next.49",
148
- "@elliemae/ds-overlay": "3.70.0-next.49",
149
- "@elliemae/ds-page-header-v1": "3.70.0-next.49",
150
- "@elliemae/ds-page-header-v2": "3.70.0-next.49",
151
- "@elliemae/ds-page-header": "3.70.0-next.49",
152
- "@elliemae/ds-pagination": "3.70.0-next.49",
153
- "@elliemae/ds-pills-v2": "3.70.0-next.49",
154
- "@elliemae/ds-portal": "3.70.0-next.49",
155
- "@elliemae/ds-page-layout": "3.70.0-next.49",
156
- "@elliemae/ds-props-helpers": "3.70.0-next.49",
157
- "@elliemae/ds-progress-indicator": "3.70.0-next.49",
158
- "@elliemae/ds-query-builder": "3.70.0-next.49",
159
- "@elliemae/ds-resizeable-container": "3.70.0-next.49",
160
- "@elliemae/ds-read-more": "3.70.0-next.49",
161
- "@elliemae/ds-scrollable-container": "3.70.0-next.49",
162
- "@elliemae/ds-ribbon": "3.70.0-next.49",
163
- "@elliemae/ds-separator": "3.70.0-next.49",
164
- "@elliemae/ds-shared": "3.70.0-next.49",
165
- "@elliemae/ds-shuttle-v2": "3.70.0-next.49",
166
- "@elliemae/ds-side-panel-header": "3.70.0-next.49",
167
- "@elliemae/ds-side-panel": "3.70.0-next.49",
168
- "@elliemae/ds-skeleton": "3.70.0-next.49",
169
- "@elliemae/ds-slider-v2": "3.70.0-next.49",
170
- "@elliemae/ds-square-indicator": "3.70.0-next.49",
171
- "@elliemae/ds-svg": "3.70.0-next.49",
172
- "@elliemae/ds-tabs": "3.70.0-next.49",
173
- "@elliemae/ds-test-utils": "3.70.0-next.49",
174
- "@elliemae/ds-stepper": "3.70.0-next.49",
175
- "@elliemae/ds-toolbar-v1": "3.70.0-next.49",
176
- "@elliemae/ds-system": "3.70.0-next.49",
177
- "@elliemae/ds-toast": "3.70.0-next.49",
178
- "@elliemae/ds-toolbar-v2": "3.70.0-next.49",
179
- "@elliemae/ds-transition": "3.70.0-next.49",
180
- "@elliemae/ds-tree-model": "3.70.0-next.49",
181
- "@elliemae/ds-tooltip-v3": "3.70.0-next.49",
182
- "@elliemae/ds-treeview": "3.70.0-next.49",
183
- "@elliemae/ds-truncated-expandable-text": "3.70.0-next.49",
184
- "@elliemae/ds-typography": "3.70.0-next.49",
185
- "@elliemae/ds-typescript-helpers": "3.70.0-next.49",
186
- "@elliemae/ds-virtual-list": "3.70.0-next.49",
187
- "@elliemae/ds-zustand-helpers": "3.70.0-next.49",
188
- "@elliemae/ds-wizard": "3.70.0-next.49"
41
+ "@elliemae/ds-accessibility": "3.70.0-next.50",
42
+ "@elliemae/ds-accordion": "3.70.0-next.50",
43
+ "@elliemae/ds-backdrop": "3.70.0-next.50",
44
+ "@elliemae/ds-app-picker": "3.70.0-next.50",
45
+ "@elliemae/ds-banner": "3.70.0-next.50",
46
+ "@elliemae/ds-basic": "3.70.0-next.50",
47
+ "@elliemae/ds-breadcrumb": "3.70.0-next.50",
48
+ "@elliemae/ds-button-v2": "3.70.0-next.50",
49
+ "@elliemae/ds-card": "3.70.0-next.50",
50
+ "@elliemae/ds-card-navigation": "3.70.0-next.50",
51
+ "@elliemae/ds-card-v1": "3.70.0-next.50",
52
+ "@elliemae/ds-card-v1-detail": "3.70.0-next.50",
53
+ "@elliemae/ds-card-v2": "3.70.0-next.50",
54
+ "@elliemae/ds-card-v2-action-addon": "3.70.0-next.50",
55
+ "@elliemae/ds-card-v2-group": "3.70.0-next.50",
56
+ "@elliemae/ds-card-v3": "3.70.0-next.50",
57
+ "@elliemae/ds-card-v3-poc": "3.70.0-next.50",
58
+ "@elliemae/ds-chat": "3.70.0-next.50",
59
+ "@elliemae/ds-chat-bubble": "3.70.0-next.50",
60
+ "@elliemae/ds-chat-card": "3.70.0-next.50",
61
+ "@elliemae/ds-chat-container": "3.70.0-next.50",
62
+ "@elliemae/ds-chat-container-header": "3.70.0-next.50",
63
+ "@elliemae/ds-chat-empty-state": "3.70.0-next.50",
64
+ "@elliemae/ds-chat-floating-button": "3.70.0-next.50",
65
+ "@elliemae/ds-chat-message-delimeter": "3.70.0-next.50",
66
+ "@elliemae/ds-chat-system-message": "3.70.0-next.50",
67
+ "@elliemae/ds-chat-tile": "3.70.0-next.50",
68
+ "@elliemae/ds-chat-sidebar": "3.70.0-next.50",
69
+ "@elliemae/ds-circular-progress-indicator": "3.70.0-next.50",
70
+ "@elliemae/ds-classnames": "3.70.0-next.50",
71
+ "@elliemae/ds-chip": "3.70.0-next.50",
72
+ "@elliemae/ds-codeeditor": "3.70.0-next.50",
73
+ "@elliemae/ds-comments": "3.70.0-next.50",
74
+ "@elliemae/ds-controlled-form": "3.70.0-next.50",
75
+ "@elliemae/ds-csv-converter": "3.70.0-next.50",
76
+ "@elliemae/ds-data-table-action-cell": "3.70.0-next.50",
77
+ "@elliemae/ds-data-table-cell": "3.70.0-next.50",
78
+ "@elliemae/ds-data-table": "3.70.0-next.50",
79
+ "@elliemae/ds-data-table-cell-header": "3.70.0-next.50",
80
+ "@elliemae/ds-data-table-expand-cell": "3.70.0-next.50",
81
+ "@elliemae/ds-data-table-drag-and-drop-cell": "3.70.0-next.50",
82
+ "@elliemae/ds-data-table-multi-select-cell": "3.70.0-next.50",
83
+ "@elliemae/ds-data-table-single-select-cell": "3.70.0-next.50",
84
+ "@elliemae/ds-dataviz-pie": "3.70.0-next.50",
85
+ "@elliemae/ds-data-table-filters": "3.70.0-next.50",
86
+ "@elliemae/ds-dataviz": "3.70.0-next.50",
87
+ "@elliemae/ds-decision-graph": "3.70.0-next.50",
88
+ "@elliemae/ds-date-time-picker": "3.70.0-next.50",
89
+ "@elliemae/ds-dialog": "3.70.0-next.50",
90
+ "@elliemae/ds-drag-and-drop": "3.70.0-next.50",
91
+ "@elliemae/ds-dropdownmenu-v2": "3.70.0-next.50",
92
+ "@elliemae/ds-dropzone": "3.70.0-next.50",
93
+ "@elliemae/ds-fast-list": "3.70.0-next.50",
94
+ "@elliemae/ds-filter-bar": "3.70.0-next.50",
95
+ "@elliemae/ds-form-combobox": "3.70.0-next.50",
96
+ "@elliemae/ds-form-checkbox": "3.70.0-next.50",
97
+ "@elliemae/ds-floating-context": "3.70.0-next.50",
98
+ "@elliemae/ds-form-date-range-picker": "3.70.0-next.50",
99
+ "@elliemae/ds-form-date-time-picker": "3.70.0-next.50",
100
+ "@elliemae/ds-form-input-text": "3.70.0-next.50",
101
+ "@elliemae/ds-form-helpers-mask-hooks": "3.70.0-next.50",
102
+ "@elliemae/ds-form-input-textarea": "3.70.0-next.50",
103
+ "@elliemae/ds-form-layout-autocomplete": "3.70.0-next.50",
104
+ "@elliemae/ds-form-layout-input-group": "3.70.0-next.50",
105
+ "@elliemae/ds-form-layout-blocks": "3.70.0-next.50",
106
+ "@elliemae/ds-form-multi-combobox": "3.70.0-next.50",
107
+ "@elliemae/ds-form-native-select": "3.70.0-next.50",
108
+ "@elliemae/ds-form-layout-label": "3.70.0-next.50",
109
+ "@elliemae/ds-form-radio": "3.70.0-next.50",
110
+ "@elliemae/ds-form-select": "3.70.0-next.50",
111
+ "@elliemae/ds-form-single-combobox": "3.70.0-next.50",
112
+ "@elliemae/ds-form-toggle": "3.70.0-next.50",
113
+ "@elliemae/ds-global-header": "3.70.0-next.50",
114
+ "@elliemae/ds-grid": "3.70.0-next.50",
115
+ "@elliemae/ds-hooks-focus-stack": "3.70.0-next.50",
116
+ "@elliemae/ds-hooks-focus-trap": "3.70.0-next.50",
117
+ "@elliemae/ds-hooks-fontsize-detector": "3.70.0-next.50",
118
+ "@elliemae/ds-hooks-fontsize-media": "3.70.0-next.50",
119
+ "@elliemae/ds-hooks-headless-tooltip": "3.70.0-next.50",
120
+ "@elliemae/ds-hooks-is-showing-ellipsis": "3.70.0-next.50",
121
+ "@elliemae/ds-hooks-keyboard-navigation": "3.70.0-next.50",
122
+ "@elliemae/ds-hooks-on-blur-out": "3.70.0-next.50",
123
+ "@elliemae/ds-hooks-is-mobile": "3.70.0-next.50",
124
+ "@elliemae/ds-hooks-on-first-focus-in": "3.70.0-next.50",
125
+ "@elliemae/ds-image": "3.70.0-next.50",
126
+ "@elliemae/ds-icon": "3.70.0-next.50",
127
+ "@elliemae/ds-indeterminate-progress-indicator": "3.70.0-next.50",
128
+ "@elliemae/ds-layout-provider": "3.70.0-next.50",
129
+ "@elliemae/ds-left-navigation": "3.70.0-next.50",
130
+ "@elliemae/ds-menu-items": "3.70.0-next.50",
131
+ "@elliemae/ds-imagelibrarymodal": "3.70.0-next.50",
132
+ "@elliemae/ds-icons": "3.70.0-next.50",
133
+ "@elliemae/ds-loading-indicator": "3.70.0-next.50",
134
+ "@elliemae/ds-menu-button": "3.70.0-next.50",
135
+ "@elliemae/ds-menu-items-action": "3.70.0-next.50",
136
+ "@elliemae/ds-menu-items-commons": "3.70.0-next.50",
137
+ "@elliemae/ds-menu-items-multi": "3.70.0-next.50",
138
+ "@elliemae/ds-menu-items-section": "3.70.0-next.50",
139
+ "@elliemae/ds-menu-items-single": "3.70.0-next.50",
140
+ "@elliemae/ds-menu-items-single-with-submenu": "3.70.0-next.50",
141
+ "@elliemae/ds-menu-items-separator": "3.70.0-next.50",
142
+ "@elliemae/ds-menu-items-skeleton": "3.70.0-next.50",
143
+ "@elliemae/ds-menu-items-submenu": "3.70.0-next.50",
144
+ "@elliemae/ds-mobile": "3.70.0-next.50",
145
+ "@elliemae/ds-menu-tree-item": "3.70.0-next.50",
146
+ "@elliemae/ds-notification-badge": "3.70.0-next.50",
147
+ "@elliemae/ds-overlay": "3.70.0-next.50",
148
+ "@elliemae/ds-modal-slide": "3.70.0-next.50",
149
+ "@elliemae/ds-page-header": "3.70.0-next.50",
150
+ "@elliemae/ds-page-header-v1": "3.70.0-next.50",
151
+ "@elliemae/ds-page-header-v2": "3.70.0-next.50",
152
+ "@elliemae/ds-pagination": "3.70.0-next.50",
153
+ "@elliemae/ds-page-layout": "3.70.0-next.50",
154
+ "@elliemae/ds-pills-v2": "3.70.0-next.50",
155
+ "@elliemae/ds-portal": "3.70.0-next.50",
156
+ "@elliemae/ds-progress-indicator": "3.70.0-next.50",
157
+ "@elliemae/ds-query-builder": "3.70.0-next.50",
158
+ "@elliemae/ds-read-more": "3.70.0-next.50",
159
+ "@elliemae/ds-resizeable-container": "3.70.0-next.50",
160
+ "@elliemae/ds-ribbon": "3.70.0-next.50",
161
+ "@elliemae/ds-props-helpers": "3.70.0-next.50",
162
+ "@elliemae/ds-separator": "3.70.0-next.50",
163
+ "@elliemae/ds-scrollable-container": "3.70.0-next.50",
164
+ "@elliemae/ds-shared": "3.70.0-next.50",
165
+ "@elliemae/ds-shuttle-v2": "3.70.0-next.50",
166
+ "@elliemae/ds-skeleton": "3.70.0-next.50",
167
+ "@elliemae/ds-side-panel": "3.70.0-next.50",
168
+ "@elliemae/ds-side-panel-header": "3.70.0-next.50",
169
+ "@elliemae/ds-slider-v2": "3.70.0-next.50",
170
+ "@elliemae/ds-square-indicator": "3.70.0-next.50",
171
+ "@elliemae/ds-stepper": "3.70.0-next.50",
172
+ "@elliemae/ds-svg": "3.70.0-next.50",
173
+ "@elliemae/ds-system": "3.70.0-next.50",
174
+ "@elliemae/ds-tabs": "3.70.0-next.50",
175
+ "@elliemae/ds-test-utils": "3.70.0-next.50",
176
+ "@elliemae/ds-toast": "3.70.0-next.50",
177
+ "@elliemae/ds-toolbar-v2": "3.70.0-next.50",
178
+ "@elliemae/ds-toolbar-v1": "3.70.0-next.50",
179
+ "@elliemae/ds-tooltip-v3": "3.70.0-next.50",
180
+ "@elliemae/ds-transition": "3.70.0-next.50",
181
+ "@elliemae/ds-tree-model": "3.70.0-next.50",
182
+ "@elliemae/ds-treeview": "3.70.0-next.50",
183
+ "@elliemae/ds-typescript-helpers": "3.70.0-next.50",
184
+ "@elliemae/ds-truncated-expandable-text": "3.70.0-next.50",
185
+ "@elliemae/ds-typography": "3.70.0-next.50",
186
+ "@elliemae/ds-virtual-list": "3.70.0-next.50",
187
+ "@elliemae/ds-wizard": "3.70.0-next.50",
188
+ "@elliemae/ds-zustand-helpers": "3.70.0-next.50"
189
189
  },
190
190
  "publishConfig": {
191
191
  "access": "public"