dimsum-e2e-tests 3.70.0-next.7 → 3.70.0-next.71

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (297) hide show
  1. package/CHANGELOG.md +1079 -721
  2. package/ds-accordion/DSAccordion.visual.spec.js +6 -0
  3. package/ds-accordion/DSAccordionCO.js +15 -3
  4. package/ds-accordion/QA_NOTES.md +105 -0
  5. package/ds-accordion/controlled/DSAccordion.controlled.func.spec.js +23 -0
  6. package/ds-accordion/header-structure/DSAccordion.header-structure.func.spec.js +65 -0
  7. package/ds-accordion/input-inside/DSAccordion.input-inside.func.spec.js +19 -0
  8. package/ds-apppicker/DSAppPickerCO.js +101 -3
  9. package/ds-apppicker/aria-pattern/DSAppPicker.aria-pattern.func.spec.js +100 -0
  10. package/ds-apppicker/basic/DSAppPicker.basic.keyboard-nav.func.spec.js +18 -7
  11. package/ds-apppicker/closeAfterSelection/DSAppPicker.closeAfterSelection.func.spec.js +1 -1
  12. package/ds-apppicker/custom-trigger-focus/DSAppPicker.custom-trigger-focus.func.spec.js +82 -0
  13. package/ds-apppicker/label-expansion-dismissal/DSAppPicker.label-expansion-dismissal.visual.spec.js +108 -0
  14. package/ds-apppicker/reflow/DSAppPicker.reflow.func.spec.js +32 -0
  15. package/ds-apppicker/reflow/DSAppPicker.reflow.visual.spec.js +5 -6
  16. package/ds-apppicker/truncation/DSAppPicker.truncation.visual.spec.js +5 -9
  17. package/ds-autocomplete/DSAutocomplete.visual.spec.js +34 -0
  18. package/ds-autocomplete/DSAutocompleteCO.js +36 -1
  19. package/ds-autocomplete/aria-busy-loading/DSAutocomplete.aria-busy-loading.axe-core.func.spec.js +50 -0
  20. package/ds-autocomplete/aria-busy-loading/DSAutocomplete.aria-busy-loading.func.spec.js +122 -0
  21. package/ds-autocomplete/aria-busy-loading/DSAutocomplete.aria-busy-loading.visual.spec.js +48 -0
  22. package/ds-autocomplete/slots/DSAutocomplete.slots.func.spec.js +6 -1
  23. package/ds-banner/DSBanner.text-resize.visual.spec.js +5 -2
  24. package/ds-banner/DSBannerCO.js +4 -0
  25. package/ds-button-v3/DSButtonV3.aria-disabled-attribute.func.spec.js +33 -0
  26. package/ds-button-v3/DSButtonV3CO.js +10 -0
  27. package/ds-button-v3/theme-font/DSButtonV3.theme-font.func.spec.js +30 -0
  28. package/ds-card/DSCard.cardv2_v1.func.spec.js +54 -0
  29. package/ds-card/DSCard.cardv2_v1.visual.spec.js +29 -0
  30. package/ds-card/DSCardCO.js +50 -0
  31. package/ds-card/detail-slots/DSCard.detail-slots.axe-core.func.spec.js +29 -0
  32. package/ds-card/detail-slots/DSCard.detail-slots.func.spec.js +72 -0
  33. package/ds-card/detail-slots/DSCard.detail-slots.visual.spec.js +19 -0
  34. package/ds-card-v3/DSCardV3CO.js +93 -1
  35. package/ds-card-v3/accordion/DSCardV3.accordion-aria-structure.func.spec.js +41 -0
  36. package/ds-card-v3/accordion/DSCardV3.accordion-aria.keyboard.func.spec.js +49 -0
  37. package/ds-card-v3/accordion/DSCardV3.accordion.axe-core.func.spec.js +28 -0
  38. package/ds-card-v3/accordion/DSCardV3.accordion.visual.spec.js +4 -6
  39. package/ds-card-v3/action/DSCardV3.action.axe-core.func.spec.js +24 -0
  40. package/ds-card-v3/action/DSCardV3.action.func.spec.js +53 -0
  41. package/ds-card-v3/action/DSCardV3.action.visual.spec.js +28 -0
  42. package/ds-card-v3/drag-n-drop/DSCardV3.DnD.axe-core.func.spec.js +42 -0
  43. package/ds-card-v3/drag-n-drop/DSCardV3.DnD.func.spec.js +129 -0
  44. package/ds-card-v3/drag-n-drop/DSCardV3.DnD.reorder.func.spec.js +73 -0
  45. package/ds-card-v3/drag-n-drop/DSCardV3.DnD.visual.spec.js +5 -12
  46. package/ds-card-v3/global-attributes/DSCardV3.global-attributes.axe-core.func.spec.js +33 -0
  47. package/ds-card-v3/global-attributes/DSCardV3.global-attributes.visual.spec.js +20 -0
  48. package/ds-card-v3/multi-select/DSCardV3.multi-select.aria-grouping.func.spec.js +24 -0
  49. package/ds-card-v3/multi-select/DSCardV3.multiselect.axe-core.func.spec.js +47 -0
  50. package/ds-card-v3/multi-select/DSCardV3.multiselect.keyboard.func.spec.js +65 -0
  51. package/ds-card-v3/multi-select/DSCardV3.multiselect.visual.spec.js +17 -0
  52. package/ds-card-v3/multiple-action/DSCardV3.multiple-action.axe-core.func.spec.js +35 -0
  53. package/ds-card-v3/multiple-action/DSCardV3.multiple-action.func.spec.js +53 -0
  54. package/ds-card-v3/multiple-action/DSCardV3.multiple-action.visual.spec.js +18 -0
  55. package/ds-card-v3/multiple-control/DSCardV3.multi-control.axe-core.func.spec.js +34 -0
  56. package/ds-card-v3/multiple-control/DSCardV3.multi-control.func.spec.js +26 -0
  57. package/ds-card-v3/multiple-control/DSCardV3.multi-control.visual.spec.js +29 -0
  58. package/ds-card-v3/no-action/DSCardV3.no-action.axe-core.func.spec.js +22 -0
  59. package/ds-card-v3/no-action/DSCardV3.no-action.func.spec.js +23 -0
  60. package/ds-card-v3/no-action/DSCardV3.no-action.visual.spec.js +15 -0
  61. package/ds-card-v3/notification-badges/DSCardV3.notification-badges.axe-core.func.spec.js +33 -0
  62. package/ds-card-v3/notification-badges/DSCardV3.notification-badges.func.spec.js +19 -0
  63. package/ds-card-v3/notification-badges/DSCardV3.notification-badges.visual.spec.js +28 -0
  64. package/ds-card-v3/reflow/DSCardV3.reflow.axe-core.func.spec.js +28 -0
  65. package/ds-card-v3/reflow/DSCardV3.reflow.func.spec.js +36 -0
  66. package/ds-card-v3/reflow/DSCardV3.reflow.visual.spec.js +3 -2
  67. package/ds-card-v3/single-select/DSCardV3.single-select.aria-grouping.func.spec.js +24 -0
  68. package/ds-card-v3/single-select/DSCardV3.single-select.axe-core.func.spec.js +37 -0
  69. package/ds-card-v3/single-select/DSCardV3.single-select.visual.spec.js +1 -2
  70. package/ds-card-v3/slots/DSCardV3.slots.visual.spec.js +1 -2
  71. package/ds-card-v3/variant-accented/DSCardV3.variant-accented.axe-core.func.spec.js +45 -0
  72. package/ds-card-v3/variant-accented/DSCardV3.variant-accented.func.spec.js +28 -0
  73. package/ds-card-v3/variant-accented/DSCardV3.variant-accented.visual.spec.js +35 -0
  74. package/ds-card-v3/variant-accented-disabled/DSCardV3.variant-accented-disabled.axe-core.func.spec.js +35 -0
  75. package/ds-card-v3/variant-accented-disabled/DSCardV3.variant-accented-disabled.func.spec.js +53 -0
  76. package/ds-card-v3/variant-accented-disabled/DSCardV3.variant-accented-disabled.visual.spec.js +28 -0
  77. package/ds-card-v3/variant-disabled/DSCardV3.variant-disabled.axe-core.func.spec.js +22 -0
  78. package/ds-card-v3/variant-disabled/DSCardV3.variant-disabled.func.spec.js +61 -0
  79. package/ds-card-v3/variant-disabled/DSCardV3.variant-disabled.visual.spec.js +20 -0
  80. package/ds-card-v3/variant-disabled/DSCardV3.variantDisabled-non-interactive.func.spec.js +25 -0
  81. package/ds-chat/DSChat.axe-core.func.spec.js +2 -2
  82. package/ds-chat/DSChat.visual.spec.js +4 -4
  83. package/ds-chat/DSChatCO.js +18 -24
  84. package/ds-chat/bubbles/slots/DSChatBubble.slots.axe-core.func.spec.js +24 -0
  85. package/ds-chat/bubbles/slots/DSChatBubble.slots.func.spec.js +49 -0
  86. package/ds-chat/bubbles/slots/DSChatBubble.slots.visual.spec.js +25 -0
  87. package/ds-chat/card/slots/DSChatCard.slots.axe-core.func.spec.js +24 -0
  88. package/ds-chat/card/slots/DSChatCard.slots.func.spec.js +47 -0
  89. package/ds-chat/card/slots/DSChatCard.slots.visual.spec.js +18 -0
  90. package/ds-chat/card/truncated-text/DSChatCard.truncated-text.func.spec.js +32 -0
  91. package/ds-chat/card/truncated-text/DSChatCard.truncated-text.visual.spec.js +26 -0
  92. package/ds-chat/card/with-notification-badges/DSChatCard.with-notification-badges.axe-core.func.spec.js +23 -0
  93. package/ds-chat/card/with-notification-badges/DSChatCard.with-notification-badges.visual.spec.js +17 -0
  94. package/ds-chat/components/BubbleCO.js +46 -3
  95. package/ds-chat/components/CardCO.js +75 -0
  96. package/ds-chat/components/ComposerCO.js +6 -6
  97. package/ds-chat/components/FloatingButtonCO.js +5 -3
  98. package/ds-chat/components/HeaderCO.js +2 -2
  99. package/ds-chat/components/TileCO.js +82 -0
  100. package/ds-chat/components/index.js +3 -2
  101. package/ds-chat/floatingbutton/DSChat-floating-button.visual.spec.js +1 -1
  102. package/ds-chat/loadmore/DSChat-loadmore.func.spec.js +1 -1
  103. package/{ds-chat-tile → ds-chat/tile}/DSChat-tile.axe-core.func.spec.js +2 -2
  104. package/{ds-chat-tile → ds-chat/tile}/DSChat-tile.func.spec.js +1 -1
  105. package/{ds-chat-tile → ds-chat/tile}/DSChat-tile.visual.spec.js +2 -2
  106. package/{ds-chat-tile → ds-chat/tile}/aria-disabled/DSChat-tile.aria-disabled.axe-core.func.spec.js +2 -2
  107. package/{ds-chat-tile → ds-chat/tile}/aria-disabled/DSChat-tile.aria-disabled.visual.spec.js +1 -1
  108. package/ds-chat/tile/slots/DSChatTile.slots.func.spec.js +53 -0
  109. package/ds-chat/tile/slots/DSChatTile.slots.visual.spec.js +18 -0
  110. package/ds-chip/label-expansion-dismissal/DSChip.label-expansion-dismissal.visual.spec.js +84 -0
  111. package/ds-controlled-form/ds-combobox/creatable/DSCombobox.creatable-tooltip.func.spec.js +47 -0
  112. package/ds-controlled-form/ds-combobox/creatable/DSCombobox.creatable.visual.spec.js +12 -21
  113. package/ds-controlled-form/ds-combobox/disabled/DSCombobox.disabled.visual.spec.js +6 -1
  114. package/ds-controlled-form/ds-controlled-checkbox/Basic/DSControlledCheckbox.axe-core.basic.func.spec.js +4 -4
  115. package/ds-controlled-form/ds-controlled-checkbox/Basic/DSControlledCheckbox.basic.visual.spec.js +56 -0
  116. package/ds-controlled-form/ds-controlled-checkbox/DSControlledCheckboxCO.js +54 -1
  117. package/ds-controlled-form/ds-controlled-checkbox/Disabled/DSControlledCheckbox.axe-core.disabled.func.spec.js +1 -1
  118. package/ds-controlled-form/ds-controlled-checkbox/Disabled/DSControlledCheckbox.disabled.visual.spec.js +1 -1
  119. package/ds-controlled-form/ds-controlled-checkbox/HasError/DSControlledCheckbox.axe-core.hasError.func.spec.js +4 -4
  120. package/ds-controlled-form/ds-controlled-checkbox/HasError/DSControlledCheckbox.has-error.visual.spec.js +71 -1
  121. package/ds-controlled-form/ds-controlled-checkbox/Mixed/DSControlledCheckbox.axe-core.mixed.func.spec.js +4 -4
  122. package/ds-controlled-form/ds-controlled-checkbox/Mixed/DSControlledCheckbox.mixed.visual.spec.js +1 -1
  123. package/ds-controlled-form/ds-controlled-checkbox/ReadOnly/DSControlledCheckbox.axe-core.read-only.func.spec.js +3 -3
  124. package/ds-controlled-form/ds-controlled-checkbox/ReadOnly/DSControlledCheckbox.read-only.visual.spec.js +1 -1
  125. package/ds-controlled-form/ds-controlled-checkbox/WithTooltip/DSControlledCheckbox.axe-core.with-tooltip.func.spec.js +1 -1
  126. package/ds-controlled-form/ds-controlled-checkbox/WithTooltip/DSControlledCheckbox.with-tooltip.visual.spec.js +1 -3
  127. package/ds-controlled-form/ds-controlled-checkbox/WrapLabel/DSControlledCheckbox.axe-core.wrap-label.func.spec.js +1 -1
  128. package/ds-controlled-form/ds-controlled-checkbox/WrapLabel/DSControlledCheckbox.wrap-label.visual.spec.js +1 -1
  129. package/ds-controlled-form/ds-controlled-checkbox/aria-disabled/DSControlledCheckbox.aria-disabled.visual.spec.js +2 -6
  130. package/ds-controlled-form/ds-controlled-checkbox/aria-disabled/DSControlledCheckbox.axe-core.aria-disabled.func.spec.js +1 -1
  131. package/ds-controlled-form/ds-controlled-checkbox/slots/DSControlledCheckbox.slots.func.spec.js +78 -0
  132. package/ds-controlled-form/ds-controlled-checkbox/theme-font/DSControlledCheckbox.theme-font.func.spec.js +30 -0
  133. package/ds-controlled-form/ds-controlled-checkbox-group/DSControlledCheckboxGroup.axe-core.func.spec.js +4 -4
  134. package/ds-controlled-form/ds-controlled-checkbox-group/DSControlledCheckboxGroup.visual.spec.js +1 -1
  135. package/ds-controlled-form/ds-controlled-radio/DSControlledRadioCO.js +50 -1
  136. package/ds-controlled-form/ds-controlled-radio/aria-disabled/DSControlledRadio.aria-disabled.axe-core.func.spec.js +16 -2
  137. package/ds-controlled-form/ds-controlled-radio/aria-disabled/DSControlledRadio.aria-disabled.func.spec.js +37 -0
  138. package/ds-controlled-form/ds-controlled-radio/slots/DSControlledRadio.slots.func.spec.js +78 -0
  139. package/ds-controlled-form/ds-controlled-radio/theme-font/DSControlledRadio.theme-font.func.spec.js +30 -0
  140. package/ds-controlled-form/react-hook-form/ReactHook.func.spec.js +1 -3
  141. package/ds-data-table-async/DSDataTableCO.js +187 -10
  142. package/ds-data-table-async/basic/DSDataTable.basic.visual.spec.js +1 -1
  143. package/ds-data-table-async/components/FilterBarCO.js +7 -0
  144. package/ds-data-table-async/components/FiltersCO.js +1 -1
  145. package/ds-data-table-async/components/HeaderCO.js +37 -1
  146. package/ds-data-table-async/dnd/DSDataTable.dnd-keyboard-scroll.func.spec.js +51 -0
  147. package/ds-data-table-async/filter-menu-close/DSDataTable.filter-menu-close.func.spec.js +77 -0
  148. package/ds-data-table-async/filter-popover-boundary/DSDataTable.filter-popover-boundary.func.spec.js +98 -0
  149. package/ds-data-table-async/filters/DSDataTable.filters-creatable-active-descendant.func.spec.js +51 -0
  150. package/ds-data-table-async/filters/DSDataTable.filters-creatable.func.spec.js +55 -0
  151. package/ds-data-table-async/filters/DSDataTable.filters.axe-core.func.spec.js +11 -9
  152. package/ds-data-table-async/filtersV2/DSDataTable.filtersV2-creatablemultiselect.keyboard.func.spec.js +2 -2
  153. package/ds-data-table-async/filtersV2/DSDataTable.filtersV2-creatableselect.keyboard.func.spec.js +2 -2
  154. package/ds-data-table-async/filtersV2/DSDataTable.filtersV2.axe-core.func.spec.js +45 -29
  155. package/ds-data-table-async/filtersV2/pill-label/DSDataTable.pillLabel.axe-core.func.spec.js +23 -0
  156. package/ds-data-table-async/filtersV2/pill-label/DSDataTable.pillLabel.func.spec.js +50 -0
  157. package/ds-data-table-async/filtersV2/pill-label/DSDataTable.pillLabel.visual.spec.js +21 -0
  158. package/ds-data-table-async/header-affordances/DSDataTable.header-affordances.func.spec.js +92 -0
  159. package/ds-data-table-async/helpers/getInputSelection.js +6 -0
  160. package/ds-data-table-async/helpers/index.js +1 -0
  161. package/ds-data-table-async/keyboard-scroll/DSDataTable.keyboard-scroll.func.spec.js +39 -0
  162. package/ds-data-table-async/menubutton/DSDataTable.MenuButton.keyboard.func.spec.js +8 -7
  163. package/ds-data-table-async/menubutton/DSDataTable.MenuButton.mouse.func.spec.js +6 -7
  164. package/ds-data-table-async/pagination/DSDataTable.pagination.func.spec.js +3 -2
  165. package/ds-data-table-async/resizable/DSDataTable.resize-min-clamp.func.spec.js +72 -0
  166. package/ds-data-table-async/resizable/DSDataTable.resizerA11y.axe-core.func.spec.js +42 -0
  167. package/ds-data-table-async/resizable/DSDataTable.resizerA11y.func.spec.js +98 -0
  168. package/ds-data-table-async/textwrapping/DSDataTable.header-wrap-alignment.axe-core.func.spec.js +23 -0
  169. package/ds-data-table-async/textwrapping/DSDataTable.header-wrap-alignment.visual.spec.js +106 -0
  170. package/ds-data-table-async/textwrapping/DSDataTable.text-wrap-toolbar.visual.spec.js +27 -0
  171. package/ds-data-table-async/toggle-cell-focus/DSDataTable.toggle-cell-enter-focus.func.spec.js +31 -0
  172. package/ds-data-table-async/vissibility/DSDataTable.vissibility.visual.spec.js +2 -0
  173. package/ds-dataviz/DSDataViz.axis.visual.spec.js +1 -2
  174. package/ds-dataviz/DSDataViz.ticks.visual.spec.js +1 -2
  175. package/ds-dataviz/DSDataVizCO.js +2 -0
  176. package/ds-dataviz/axecore/DSDataViz.axis.axe-core.func.spec.js +1 -1
  177. package/ds-floating-context/DSFloatingContextCO.js +10 -0
  178. package/ds-floating-context/placement/DSFloatingContext.placement.visual.spec.js +48 -0
  179. package/ds-form-combobox-multi/DSComboboxMultiCO.js +36 -9
  180. package/ds-form-combobox-multi/aria-busy-loading/DSComboboxMulti.aria-busy-loading.axe-core.func.spec.js +55 -0
  181. package/ds-form-combobox-multi/aria-busy-loading/DSComboboxMulti.aria-busy-loading.func.spec.js +57 -0
  182. package/ds-form-combobox-multi/aria-disabled/DSComboboxMulti.aria-disabled.visual.spec.js +19 -2
  183. package/ds-form-combobox-multi/disabled/DSComboboxMulti.disabled.axe-core.func.spec.js +24 -0
  184. package/ds-form-combobox-multi/disabled/DSComboboxMulti.disabled.mouse.func.spec.js +0 -2
  185. package/ds-form-combobox-multi/disabled/DSComboboxMulti.disabled.visual.spec.js +22 -0
  186. package/ds-form-combobox-multi/grouped/DSComboboxMulti.grouped.visual.spec.js +42 -0
  187. package/ds-form-combobox-multi/inline/DSComboboxMulti.inline.visual.spec.js +21 -0
  188. package/ds-form-combobox-multi/pills/DSComboboxMulti.pills.func.spec.js +59 -0
  189. package/ds-form-combobox-multi/pills/DSComboboxMulti.pills.visual.spec.js +39 -0
  190. package/ds-form-combobox-multi/skeleton/DSComboboxMulti.skeleton.visual.spec.js +25 -0
  191. package/ds-form-combobox-multi/theme-font/DSComboboxMulti.theme-font.func.spec.js +38 -0
  192. package/ds-form-combobox-multi/with-tooltip/DSComboboxMulti.with-tooltip.axe-core.func.spec.js +39 -0
  193. package/ds-form-combobox-multi/with-tooltip/DSComboboxMulti.with-tooltip.func.spec.js +39 -0
  194. package/ds-form-combobox-multi/with-tooltip/DSComboboxMulti.with-tooltip.visual.spec.js +29 -0
  195. package/ds-form-combobox-single/DSComboboxSingleCO.js +25 -9
  196. package/ds-form-combobox-single/aria-busy-loading/DSComboboxSingle.aria-busy-loading.axe-core.func.spec.js +49 -0
  197. package/ds-form-combobox-single/aria-busy-loading/DSComboboxSingle.aria-busy-loading.func.spec.js +54 -0
  198. package/ds-form-combobox-single/aria-disabled/DSComboboxSingle.aria-disabled.visual.spec.js +18 -0
  199. package/ds-form-combobox-single/creatable/DSComboboxSingle.creatable.visual.spec.js +30 -0
  200. package/ds-form-combobox-single/disabled/DSComboboxSingle.disabled.axe-core.func.spec.js +24 -0
  201. package/ds-form-combobox-single/disabled/DSComboboxSingle.disabled.mouse.func.spec.js +0 -2
  202. package/ds-form-combobox-single/disabled/DSComboboxSingle.disabled.visual.spec.js +22 -0
  203. package/ds-form-combobox-single/grouped/DSComboboxSingle.grouped.visual.spec.js +45 -0
  204. package/ds-form-combobox-single/inline/DSComboboxSingle.inline.visual.spec.js +23 -0
  205. package/ds-form-combobox-single/skeleton/DSComboboxSingle.skeleton.visual.spec.js +25 -0
  206. package/ds-form-combobox-single/theme-font/DSComboboxSingle.theme-font.func.spec.js +34 -0
  207. package/ds-form-combobox-single/with-tooltip/DSComboboxSingle.with-tooltip.axe-core.func.spec.js +39 -0
  208. package/ds-form-combobox-single/with-tooltip/DSComboboxSingle.with-tooltip.func.spec.js +39 -0
  209. package/ds-form-combobox-single/with-tooltip/DSComboboxSingle.with-tooltip.visual.spec.js +29 -0
  210. package/ds-form-date-range-picker/DateRangePicker.axe-core.spec.js +5 -0
  211. package/ds-form-date-range-picker/DateRangePicker.functional.spec.js +80 -18
  212. package/ds-form-date-range-picker/DateRangePickerCO.js +19 -0
  213. package/ds-form-date-range-picker/date-segment-aria-labels/DateRangePicker.date-segment-aria-labels.func.spec.js +66 -0
  214. package/ds-form-date-range-picker/grouped-field-error-announcement/DateRangePicker.grouped-field-error-announcement.func.spec.js +59 -0
  215. package/ds-form-date-range-picker/picker-callbacks/DateRangePicker.picker-callbacks.func.spec.js +36 -0
  216. package/ds-form-date-time-picker/DSControlledDateTimePickerCO.js +7 -0
  217. package/ds-form-date-time-picker/date-time-full/DateTimeFull.axe-core.func.spec.js +8 -1
  218. package/ds-form-date-time-picker/date-time-full/DateTimePicker.DateTimeFull.visual.spec.js +9 -0
  219. package/ds-form-date-time-picker/partial-date-open-focus/DateTimePicker.partial-date-open-focus.func.spec.js +45 -0
  220. package/ds-form-native-select/NativeSelect.axe-core.func.spec.js +39 -0
  221. package/ds-form-native-select/NativeSelect.visual.spec.js +33 -0
  222. package/ds-form-native-select/NativeSelectCO.js +6 -0
  223. package/ds-form-native-select/option-selection/NativeSelect.option-selection.func.spec.js +25 -0
  224. package/ds-form-toggle/DSToggle.func.spec.js +20 -23
  225. package/ds-form-toggle/DSToggleCO.js +11 -2
  226. package/ds-global-header/GlobalHeader.announcements.func.spec.js +27 -0
  227. package/ds-global-header/GlobalHeader.axe-core.func.spec.js +15 -15
  228. package/ds-global-header/GlobalHeader.func.spec.js +70 -1
  229. package/ds-global-header/GlobalHeaderCO.js +120 -2
  230. package/ds-global-header/app-picker-passthrough/GlobalHeader.app-picker-passthrough.func.spec.js +113 -0
  231. package/ds-global-header/popup-menu-focus/GlobalHeader.popup-menu-focus.func.spec.js +63 -0
  232. package/ds-global-header/popup-menu-slots/GlobalHeader.popup-menu-slots.func.spec.js +70 -0
  233. package/ds-global-header/search-toggle-slots/GlobalHeader.search-toggle-slots.func.spec.js +118 -0
  234. package/ds-global-header/toolbar-item-attributes/GlobalHeader.toolbar-item-attributes.func.spec.js +53 -0
  235. package/ds-grid/DSGridCO.js +20 -0
  236. package/ds-grid/layout-mode/DSGrid.layout-mode.func.spec.js +51 -0
  237. package/ds-grid/layout-mode/DSGrid.layout-mode.visual.spec.js +22 -0
  238. package/ds-hooks/DSHook.UseFontSizeMedia.visual.spec.js +5 -2
  239. package/ds-hooks/DSHook.usetree.func.spec.js +3 -2
  240. package/ds-hooks/DSHookCO.js +56 -23
  241. package/ds-hooks/useFocusStack/DSHook.useFocusStack.func.spec.js +83 -0
  242. package/ds-hooks/useFocusTrap/UseFocusTrapCO.js +2 -0
  243. package/ds-hooks/useFocusTrap/UseFocusTrapToggle.func.spec.js +48 -0
  244. package/ds-hooks/useMask/Number/UseNumberMask.axe-core.func.spec.js +48 -0
  245. package/ds-menu-button/DSMenuButtonCO.js +23 -0
  246. package/ds-menu-button/slots/DSMenuButton.slots.axe-core.func.spec.js +28 -0
  247. package/ds-menu-button/slots/DSMenuButton.slots.func.spec.js +59 -0
  248. package/ds-menu-button/slots/DSMenuButton.slots.visual.spec.js +26 -0
  249. package/ds-modal-slide/ModalSlideCO.js +7 -0
  250. package/ds-modal-slide/custom-header/ModalSlide.customHeader.focusRing.visual.spec.js +2 -1
  251. package/ds-modal-slide/heading-level/ModalSlide.headingLevel.axe-core.func.spec.js +25 -0
  252. package/ds-modal-slide/heading-level/ModalSlide.headingLevel.func.spec.js +25 -0
  253. package/ds-modal-slide/slots/ModalSlide.slots.func.spec.js +18 -0
  254. package/ds-notification-badge/DSNotificationBadge.visual.spec.js +17 -20
  255. package/ds-page-layout/PageLayoutCO.js +4 -4
  256. package/ds-pills-v2/DSPillsV2CO.js +12 -0
  257. package/ds-pills-v2/apply-aria-disabled/DSPills.applyAriaDisabled.func.spec.js +53 -0
  258. package/ds-pills-v2/apply-aria-disabled/DSPills.applyAriaDisabled.visual.spec.js +26 -0
  259. package/ds-pills-v2/disabled/DSPills.disabled.func.spec.js +53 -0
  260. package/ds-pills-v2/disabled/DSPills.disabled.visual.spec.js +33 -0
  261. package/ds-progress-indicator/DSProgressIndicator.axe-core.func.spec.js +2 -0
  262. package/ds-progress-indicator/DSProgressIndicatorCO.js +1 -1
  263. package/ds-query-builder/DSQueryBuilder.visual.spec.js +6 -6
  264. package/ds-shuttle-v2/DSShuttleV2CO.js +15 -1
  265. package/ds-shuttle-v2/breadcrumb-a11y/DSShuttleV2.breadcrumb-a11y.func.spec.js +43 -0
  266. package/ds-shuttle-v2/explicit-selection-ui/DSShuttleV2.explicit-selection-ui.func.spec.js +37 -0
  267. package/ds-shuttle-v2/explicit-selection-ui/DSShuttleV2.explicit-selection-ui.visual.spec.js +30 -0
  268. package/ds-shuttle-v2/extra/DSShuttleV2.extra.visual.spec.js +8 -3
  269. package/ds-shuttle-v2/items/DSShuttleV2.items.func.spec.js +4 -2
  270. package/ds-shuttle-v2/skipped/DSShuttleV2.extra.axe-core.skipped.js +1 -1
  271. package/ds-shuttle-v2/skipped/DSShuttleV2.filter.axe-core.skipped.js +1 -1
  272. package/ds-shuttle-v2/skipped/DSShuttleV2.globalcheckbox.axe-core.skipped.js +1 -1
  273. package/ds-shuttle-v2/skipped/DSShuttleV2.items.axe-core.skipped.js +3 -3
  274. package/ds-shuttle-v2/skipped/DSShuttleV2.skipped.js +5 -5
  275. package/ds-slider-v2/DSSliderV2.func.spec.js +36 -25
  276. package/ds-slider-v2/DSSliderV2CO.js +10 -0
  277. package/ds-slider-v2/min-range/DSSliderV2.min-range.func.spec.js +69 -0
  278. package/ds-tab-button/DSTabButton.func.spec.js +1 -1
  279. package/ds-tabs/DSTabsCO.js +4 -0
  280. package/ds-tabs/notification-badge/DSTabs.notification-badge.axe-core.func.spec.js +28 -0
  281. package/ds-tabs/notification-badge/DSTabs.notification-badge.func.spec.js +51 -0
  282. package/ds-tooltip-v3/DSTooltipV3CO.js +21 -0
  283. package/ds-tooltip-v3/aria-tooltip-pattern/DSTooltipV3.aria-tooltip-pattern.axe-core.func.spec.js +23 -0
  284. package/ds-tooltip-v3/aria-tooltip-pattern/DSTooltipV3.aria-tooltip-pattern.func.spec.js +29 -0
  285. package/ds-tooltip-v3/dialog/DSTooltipV3.dialog.func.spec.js +45 -0
  286. package/ds-tooltip-v3/dialog/DSTooltipV3.dialog.visual.spec.js +29 -0
  287. package/ds-treeview/DSTreeViewCO.js +23 -0
  288. package/ds-treeview/dragAndDrop/TreeView-dnd_keyboard.func.spec.js +96 -0
  289. package/ds-typography/DSTypographyCO.js +10 -0
  290. package/ds-typography/theme-font/DSTypography.theme-font.func.spec.js +30 -0
  291. package/package.json +150 -153
  292. package/paths.js +16 -6
  293. package/ds-card-v3/disabled/DSCardV3.disabled.visual.spec.js +0 -17
  294. package/ds-chat-tile/TileCO.js +0 -35
  295. package/ds-hooks/DSHook.func.spec.js +0 -60
  296. package/ds-hooks/useFocusStack/DSHook.useFocusStack.skipped.js +0 -57
  297. package/ds-treeview/dragAndDrop/TreeView-dnd_mouse.func.spec.js +0 -61
@@ -0,0 +1,108 @@
1
+ import { Key } from 'webdriverio';
2
+ import DSAppPickerCO from '../DSAppPickerCO';
3
+ import { mouseOver } from '../../helpers';
4
+
5
+ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
6
+ const PARKED_X = 10;
7
+ const PARKED_Y = 10;
8
+
9
+ // Enabled and long enough to truncate. Chip 1 of the apps list is used rather than the first one,
10
+ // which is natively disabled and tracked separately under PUI-18981.
11
+ const TRUNCATING_CHIP = 'Pipeline but with a really long label that will truncate';
12
+
13
+ const ARIA_DISABLED_CHIP = 'Dashboard but with a really long label that will truncate';
14
+
15
+ describe('PUI-18986 - DSAppPicker:: Escape dismisses the expanded chip label - Visual', () => {
16
+ before('loading page', async () => {
17
+ const errorOnGo = await DSAppPickerCO.basicURL.go();
18
+ if (errorOnGo) throw errorOnGo;
19
+ await browser.maximizeWindow();
20
+ await DSAppPickerCO.openPanel();
21
+ });
22
+
23
+ it('01: truncated chip expands its label on hover', async () => {
24
+ await mouseOver(await DSAppPickerCO.getChipByLabel(TRUNCATING_CHIP));
25
+ const snapshot = await browser.percyCheckScreenshot(DSAppPickerCO.snapshotPath('esc-dismiss-hover-expanded'));
26
+ await expect(snapshot).toEqual(0);
27
+ });
28
+
29
+ it('02: Escape collapses the hover-expanded label and keeps the panel open', async () => {
30
+ await browser.keys(Key.Escape);
31
+ const snapshot = await browser.percyCheckScreenshot(DSAppPickerCO.snapshotPath('esc-dismiss-hover-collapsed'));
32
+ await expect(snapshot).toEqual(0);
33
+ });
34
+
35
+ it('03: label expands again once the pointer leaves and returns', async () => {
36
+ await mouseOver(null, PARKED_X, PARKED_Y);
37
+ await mouseOver(await DSAppPickerCO.getChipByLabel(TRUNCATING_CHIP));
38
+ const snapshot = await browser.percyCheckScreenshot(DSAppPickerCO.snapshotPath('esc-dismiss-rehover-expanded'));
39
+ await expect(snapshot).toEqual(0);
40
+ });
41
+
42
+ it('04: truncated chip expands its label on focus alone', async () => {
43
+ await mouseOver(null, PARKED_X, PARKED_Y);
44
+ await browser.keys(Key.Tab);
45
+ await expect(await DSAppPickerCO.getChipByLabel(TRUNCATING_CHIP)).toBeFocused();
46
+ const snapshot = await browser.percyCheckScreenshot(DSAppPickerCO.snapshotPath('esc-dismiss-focus-expanded'));
47
+ await expect(snapshot).toEqual(0);
48
+ });
49
+
50
+ it('05: Escape collapses the focus-expanded label without moving focus', async () => {
51
+ await browser.keys(Key.Escape);
52
+ await expect(await DSAppPickerCO.getChipByLabel(TRUNCATING_CHIP)).toBeFocused();
53
+ const snapshot = await browser.percyCheckScreenshot(DSAppPickerCO.snapshotPath('esc-dismiss-focus-collapsed'));
54
+ await expect(snapshot).toEqual(0);
55
+ });
56
+
57
+ it('06: a further Escape closes the panel once the label is collapsed', async () => {
58
+ await browser.keys(Key.Escape);
59
+ await (await DSAppPickerCO.getAppPickerRoot()).waitForDisplayed({ reverse: true });
60
+ const snapshot = await browser.percyCheckScreenshot(DSAppPickerCO.snapshotPath('esc-dismiss-panel-closed'));
61
+ await expect(snapshot).toEqual(0);
62
+ });
63
+ });
64
+
65
+ describe('PUI-18987 - DSAppPicker:: Escape dismisses the expanded aria-disabled chip label - Visual', () => {
66
+ before('loading page', async () => {
67
+ const errorOnGo = await DSAppPickerCO.applyAriaDisabledURL.go();
68
+ if (errorOnGo) throw errorOnGo;
69
+ await browser.maximizeWindow();
70
+ await DSAppPickerCO.openPanel();
71
+ });
72
+
73
+ it('01: aria-disabled truncated chip expands its label on hover', async () => {
74
+ await mouseOver(await DSAppPickerCO.getChipByLabel(ARIA_DISABLED_CHIP));
75
+ const snapshot = await browser.percyCheckScreenshot(
76
+ DSAppPickerCO.snapshotPath('aria-disabled-esc-dismiss-hover-expanded'),
77
+ );
78
+ await expect(snapshot).toEqual(0);
79
+ });
80
+
81
+ it('02: Escape collapses the hover-expanded label and keeps the panel open', async () => {
82
+ await browser.keys(Key.Escape);
83
+ const snapshot = await browser.percyCheckScreenshot(
84
+ DSAppPickerCO.snapshotPath('aria-disabled-esc-dismiss-hover-collapsed'),
85
+ );
86
+ await expect(snapshot).toEqual(0);
87
+ });
88
+
89
+ it('03: aria-disabled truncated chip expands its label on keyboard focus', async () => {
90
+ await mouseOver(null, PARKED_X, PARKED_Y);
91
+ await browser.keys(Key.Tab);
92
+ await expect(await DSAppPickerCO.getChipByLabel(ARIA_DISABLED_CHIP)).toBeFocused();
93
+ const snapshot = await browser.percyCheckScreenshot(
94
+ DSAppPickerCO.snapshotPath('aria-disabled-esc-dismiss-focus-expanded'),
95
+ );
96
+ await expect(snapshot).toEqual(0);
97
+ });
98
+
99
+ it('04: Escape collapses the focus-expanded label without moving focus', async () => {
100
+ await browser.keys(Key.Escape);
101
+ await expect(await DSAppPickerCO.getChipByLabel(ARIA_DISABLED_CHIP)).toBeFocused();
102
+ const snapshot = await browser.percyCheckScreenshot(
103
+ DSAppPickerCO.snapshotPath('aria-disabled-esc-dismiss-focus-collapsed'),
104
+ );
105
+ await expect(snapshot).toEqual(0);
106
+ });
107
+ });
108
+ }
@@ -0,0 +1,32 @@
1
+ import DSAppPickerCO from '../DSAppPickerCO';
2
+
3
+ // Tests for the fix introduced in PUI-17860 (chips don't keep a consistent height). The chip's own
4
+ // wrapper was not a flex container, so a stretched grid row handed no height down to the chip root:
5
+ // a single-line chip ("Pipeline") stayed short next to a chip whose label wrapped onto two lines.
6
+ //
7
+ // The assertion is relational — every chip in a row matches the tallest chip in that row — so it
8
+ // pins no pixel value and survives any typography or spacing token change. The Reflow story is the
9
+ // right surface: it raises the font size so labels genuinely wrap and rows genuinely stretch.
10
+ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
11
+ describe('PUI-18912 - DSAppPicker:: chip height uniform within a grid row - Func', () => {
12
+ before('loading page', async () => {
13
+ const errorOnGo = await DSAppPickerCO.reflowURL.go();
14
+ if (errorOnGo) throw errorOnGo;
15
+ await browser.maximizeWindow();
16
+ await DSAppPickerCO.openPanel();
17
+ });
18
+
19
+ it('01: should render every chip in a row at the height of that row tallest chip', async () => {
20
+ const rows = await DSAppPickerCO.getChipRowsGeometry();
21
+ await expect(rows.length).toBeGreaterThan(0);
22
+
23
+ // At least one row must hold more than one chip, otherwise the story no longer reproduces the
24
+ // uneven-height condition (a one-chip row is trivially uniform) and a pass would mean nothing.
25
+ const multiChipRows = rows.filter((row) => row.chipCount > 1);
26
+ await expect(multiChipRows.length).toBeGreaterThan(0);
27
+
28
+ const unevenRows = rows.filter((row) => row.tallest !== row.shortest);
29
+ await expect(unevenRows.map((row) => row.breakdown)).toEqual([]);
30
+ });
31
+ });
32
+ }
@@ -1,18 +1,19 @@
1
1
  /* eslint-disable wdio/no-pause */
2
2
  import DSAppPickerCO from '../DSAppPickerCO';
3
+ import { setTextSize } from '../../helpers';
3
4
 
4
5
  if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
5
6
  describe('PUI-17867 - AppPicker:: Reflow test -visual', () => {
6
7
  before('loading page', async () => {
7
8
  const errorOnGo = await DSAppPickerCO.reflowURL.go();
8
9
  if (errorOnGo) throw errorOnGo;
9
- await browser.maximizeWindow();
10
+ await setTextSize('26');
10
11
  });
11
12
 
12
13
  it('01: should show appPicker open', async () => {
13
14
  const openAppPickerBtn = await DSAppPickerCO.getOpenAppPicker();
14
15
  await openAppPickerBtn.click();
15
- const snapshot = await browser.percyCheckScreenshot(DSAppPickerCO.snapshotPath('reflow-appPicker-open'));
16
+ const snapshot = await browser.percyCheckScreenshot();
16
17
  await expect(snapshot).toEqual(0);
17
18
  });
18
19
 
@@ -20,16 +21,14 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
20
21
  const secondPipelineChip = await DSAppPickerCO.getChipByLabelAndIndex('Pipeline', 1);
21
22
  await secondPipelineChip.scrollIntoView();
22
23
  await browser.pause(300);
23
- const snapshot = await browser.percyCheckScreenshot(DSAppPickerCO.snapshotPath('reflow-appPicker-scrolled'));
24
+ const snapshot = await browser.percyCheckScreenshot();
24
25
  await expect(snapshot).toEqual(0);
25
26
  });
26
27
 
27
28
  it('03: should select the 2nd Pipeline chip', async () => {
28
29
  const secondPipelineChip = await DSAppPickerCO.getChipByLabelAndIndex('Pipeline', 1);
29
30
  await secondPipelineChip.click();
30
- const snapshot = await browser.percyCheckScreenshot(
31
- DSAppPickerCO.snapshotPath('reflow-appPicker-pipeline-selected'),
32
- );
31
+ const snapshot = await browser.percyCheckScreenshot();
33
32
  await expect(snapshot).toEqual(0);
34
33
  });
35
34
  });
@@ -11,35 +11,31 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
11
11
  await browser.maximizeWindow();
12
12
  });
13
13
  it('01: should show the full label on hover', async () => {
14
- // applitools is losing the hover when taking the snapshot
15
- await browser.eyesOpen();
16
14
  await (await DSAppPickerCO.getOpenAppPicker()).waitForDisplayed();
17
15
  const openAppPickerBtn = await DSAppPickerCO.getOpenAppPicker();
18
16
  await openAppPickerBtn.click();
19
17
  const secondChip = await DSAppPickerCO.getChipByLabel('Pipeline but with a really long label that will truncate');
20
18
  await mouseOver(secondChip);
21
19
  await browser.pause(500);
22
- const snapshot = await browser.eyesCheckSnapshot(DSAppPickerCO.snapshotPath('appPicker-truncation-hover'));
20
+ const snapshot = await browser.percyCheckScreenshot();
23
21
  await expect(snapshot).toEqual(0);
24
22
  });
25
23
  it('02: should show the full label on hover - disabled Chip', async () => {
26
- await browser.eyesOpen();
27
24
  const DisabledChip = await DSAppPickerCO.getChipByLabel(
28
25
  'Dashboard but with a really long label that will truncate',
29
26
  );
30
27
  await mouseOver(DisabledChip);
31
28
  await browser.pause(500);
32
- const snapshot = await browser.eyesCheckSnapshot(DSAppPickerCO.snapshotPath('appPicker-truncation-disabled'));
29
+ const snapshot = await browser.percyCheckScreenshot();
33
30
  await expect(snapshot).toEqual(0);
34
31
  });
35
32
  it('03: should show the full label on focus', async () => {
36
- await browser.eyesOpen();
37
- const openAppPickerBtn = await DSAppPickerCO.getOpenAppPicker();
38
- await openAppPickerBtn.click();
33
+ // the panel is already open from test 01 - since PUI-18354 the trigger
34
+ // toggles, so clicking it again would close it
39
35
  await browser.keys(Key.Tab);
40
36
  await browser.keys(Key.Enter);
41
37
  await browser.pause(500);
42
- const snapshot = await browser.eyesCheckSnapshot(DSAppPickerCO.snapshotPath('appPicker-truncation-focus'));
38
+ const snapshot = await browser.percyCheckScreenshot();
43
39
  await expect(snapshot).toEqual(0);
44
40
  });
45
41
  });
@@ -18,4 +18,38 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
18
18
  await expect(snapshot).toEqual(0);
19
19
  });
20
20
  });
21
+ describe('PUI-17180 - Autocomplete:: Floating After Filtering -Visual', () => {
22
+ before('loading page', async () => {
23
+ const errorOnGo = await DSAutocompleteCO.floatingAfterFiltering.go();
24
+ if (errorOnGo) throw errorOnGo;
25
+ });
26
+ it('01: should display menu correctly - after filtering', async () => {
27
+ await browser.keys(Key.Tab);
28
+ await type('44444-');
29
+ const menulist = await DSAutocompleteCO.getAutocompleteMenuList();
30
+ await menulist.waitForDisplayed({ timeout: 2000 });
31
+ const snapshot = await browser.percyCheckScreenshot(
32
+ DSAutocompleteCO.snapshotPath('autocomplete-floating-after-filtering'),
33
+ );
34
+ await expect(snapshot).toEqual(0);
35
+ });
36
+ it('02: should display menu correctly - after re filtering', async () => {
37
+ await type('6');
38
+ const menulist = await DSAutocompleteCO.getAutocompleteMenuList();
39
+ await menulist.waitForDisplayed({ timeout: 2000 });
40
+ const snapshot = await browser.percyCheckScreenshot(
41
+ DSAutocompleteCO.snapshotPath('autocomplete-floating-after-re-filtering'),
42
+ );
43
+ await expect(snapshot).toEqual(0);
44
+ });
45
+ it('03: should display menu correctly - after backspace', async () => {
46
+ await browser.keys(Key.Backspace);
47
+ const menulist = await DSAutocompleteCO.getAutocompleteMenuList();
48
+ await menulist.waitForDisplayed({ timeout: 2000 });
49
+ const snapshot = await browser.percyCheckScreenshot(
50
+ DSAutocompleteCO.snapshotPath('autocomplete-floating-after-backspace'),
51
+ );
52
+ await expect(snapshot).toEqual(0);
53
+ });
54
+ });
21
55
  }
@@ -12,6 +12,16 @@ export default class DSAutocompleteCO extends PageObject {
12
12
 
13
13
  static sectionTitles = new Urlbuilder(PATH_E2E_AUTOCOMPLETE, 'with-section-titles-test');
14
14
 
15
+ static floatingAfterFiltering = new Urlbuilder(PATH_E2E_AUTOCOMPLETE, 'floating-after-filtering');
16
+
17
+ static loadingTest = new Urlbuilder(PATH_E2E_AUTOCOMPLETE, 'loading-test');
18
+
19
+ static skeletonTest = new Urlbuilder(PATH_E2E_AUTOCOMPLETE, 'skeleton-test');
20
+
21
+ static loadingInputProps = new Urlbuilder(PATH_E2E_AUTOCOMPLETE, 'loading-input-props-test');
22
+
23
+ static skeletonInputProps = new Urlbuilder(PATH_E2E_AUTOCOMPLETE, 'skeleton-input-props-test');
24
+
15
25
  // Snapshots
16
26
  static snapshotPath(example = 'basic') {
17
27
  return PageObject.getSnapshotPathBuilder('Autocomplete', example);
@@ -35,8 +45,10 @@ export default class DSAutocompleteCO extends PageObject {
35
45
  return $$('[data-dimsum-slot="dsAutocompleteContainer"]')[index];
36
46
  }
37
47
 
48
+ // the option is a nested slot: the rendered element owns dsMenuitemMenuItemWrapper and carries the
49
+ // autocomplete slot on data-dimsum-parent-slot, which is where the custom attributes land
38
50
  static async getOptionSlot(index = 0) {
39
- return $$('[data-dimsum-slot="dsAutocompleteOption"]')[index];
51
+ return $$('[data-dimsum-parent-slot="dsAutocompleteOption"]')[index];
40
52
  }
41
53
 
42
54
  static async getInputSlot(index = 0) {
@@ -46,4 +58,27 @@ export default class DSAutocompleteCO extends PageObject {
46
58
  static async getMenulistSlot(index = 0) {
47
59
  return $$('[data-dimsum-slot="dsAutocompleteMenuList"]')[index];
48
60
  }
61
+
62
+ // loading / skeleton (busy listbox) states
63
+ static async getLoadingListbox() {
64
+ return $('[data-testid="autocomplete-loading"]');
65
+ }
66
+
67
+ static async getLoadingIndicator() {
68
+ return $('[data-testid="ds-autocomplete-loading-indicator"]');
69
+ }
70
+
71
+ static async getSkeletonListbox() {
72
+ return $('[data-testid="autocomplete-skeleton"]');
73
+ }
74
+
75
+ static async getSkeletonMenuItems() {
76
+ return $$('[data-testid="ds-autocomplete-skeleton-menu-item"]');
77
+ }
78
+
79
+ // the input Autocomplete renders itself (onValueChange / inputProps API); the deprecated
80
+ // children API renders a consumer-owned DSInputText instead, which carries no autocomplete testid
81
+ static async getAutocompleteInput() {
82
+ return $('[data-testid="ds-autocomplete-input"]');
83
+ }
49
84
  }
@@ -0,0 +1,50 @@
1
+ import { Key } from 'webdriverio';
2
+ import DSAutocompleteCO from '../DSAutocompleteCO';
3
+ import { axeCoreCheck, type } from '../../helpers';
4
+
5
+ // Coverage for the loading state added in PUI-17137 ([Autocomplete] Add Support for Loading State).
6
+ // The busy listbox surfaces are the riskiest part for axe: role="listbox" normally requires option
7
+ // children (satisfied via aria-busy) and the spinner's role="status" is a forbidden listbox child
8
+ // (removed from the accessibility tree via aria-hidden). This spec guards both.
9
+ if (
10
+ (!browser.capabilities['ice:options'].isPhone &&
11
+ !browser.capabilities['ice:options'].isTablet &&
12
+ browser.capabilities.browserName === 'chrome') ||
13
+ browser.capabilities.browserName === 'Chrome'
14
+ ) {
15
+ describe('PUI-18864 - DSAutocomplete:: busy listbox while isLoading -Axe-Core', () => {
16
+ before('loading page', async () => {
17
+ const errorOnGo = await DSAutocompleteCO.loadingTest.go();
18
+ if (errorOnGo) throw errorOnGo;
19
+ });
20
+
21
+ it('01: should have no accessibility violations while the loading spinner is shown', async () => {
22
+ await browser.keys(Key.Tab);
23
+ await type('4');
24
+
25
+ const loading = await DSAutocompleteCO.getLoadingListbox();
26
+ await loading.waitForDisplayed();
27
+
28
+ const result = await axeCoreCheck();
29
+ expect(result.length).toBe(0);
30
+ });
31
+ });
32
+
33
+ describe('PUI-18865 - DSAutocomplete:: busy listbox while isSkeleton -Axe-Core', () => {
34
+ before('loading page', async () => {
35
+ const errorOnGo = await DSAutocompleteCO.skeletonTest.go();
36
+ if (errorOnGo) throw errorOnGo;
37
+ });
38
+
39
+ it('01: should have no accessibility violations while the skeleton menu is shown', async () => {
40
+ await browser.keys(Key.Tab);
41
+ await type('4');
42
+
43
+ const skeleton = await DSAutocompleteCO.getSkeletonListbox();
44
+ await skeleton.waitForDisplayed();
45
+
46
+ const result = await axeCoreCheck();
47
+ expect(result.length).toBe(0);
48
+ });
49
+ });
50
+ }
@@ -0,0 +1,122 @@
1
+ import { Key } from 'webdriverio';
2
+ import DSAutocompleteCO from '../DSAutocompleteCO';
3
+ import { type } from '../../helpers';
4
+
5
+ // Coverage for the loading state added in PUI-17137 ([Autocomplete] Add Support for Loading State).
6
+ // While options are being fetched the options array is still empty, so LoadingContainer /
7
+ // SkeletonContainer keep the popover open on their own and carry the canonical listbox id +
8
+ // role="listbox" + aria-busy + aria-label. Only one of skeleton / loading / options list is ever
9
+ // mounted at a time, so the listbox id is never duplicated in the DOM.
10
+ //
11
+ // The last two describes exercise the `onValueChange` + `inputProps` API, which is the only path
12
+ // where Autocomplete renders its own input and therefore wires role="combobox" + aria-expanded +
13
+ // aria-controls onto it. The deprecated `children` API (first two describes) renders a
14
+ // consumer-owned input that receives none of those attributes.
15
+ //
16
+ // Pure DOM-attribute assertions -> Chrome-only guard.
17
+ if (
18
+ (!browser.capabilities['ice:options'].isPhone &&
19
+ !browser.capabilities['ice:options'].isTablet &&
20
+ browser.capabilities.browserName === 'chrome') ||
21
+ browser.capabilities.browserName === 'Chrome'
22
+ ) {
23
+ describe('PUI-18860 - DSAutocomplete:: busy listbox while isLoading -Func', () => {
24
+ before('loading page', async () => {
25
+ const errorOnGo = await DSAutocompleteCO.loadingTest.go();
26
+ if (errorOnGo) throw errorOnGo;
27
+ });
28
+
29
+ it('01: should render a busy loading listbox and hide the options list', async () => {
30
+ await browser.keys(Key.Tab);
31
+ await type('4');
32
+
33
+ const loading = await DSAutocompleteCO.getLoadingListbox();
34
+ await loading.waitForDisplayed();
35
+
36
+ await expect(loading).toHaveAttribute('role', 'listbox');
37
+ await expect(loading).toHaveAttribute('aria-busy', 'true');
38
+ await expect(loading).toHaveAttribute('aria-label', 'Loading options please wait');
39
+
40
+ // the spinner exposes role="status", a forbidden child of role="listbox", so it must be
41
+ // removed from the accessibility tree while staying visible
42
+ const indicator = await DSAutocompleteCO.getLoadingIndicator();
43
+ await expect(indicator).toBeDisplayedInViewport();
44
+ await expect(indicator).toHaveAttribute('aria-hidden', 'true');
45
+
46
+ // only one of loading / skeleton / options list is mounted at a time
47
+ const menulist = await DSAutocompleteCO.getAutocompleteMenuList();
48
+ await expect(menulist).not.toBeExisting();
49
+ });
50
+ });
51
+
52
+ describe('PUI-18861 - DSAutocomplete:: busy listbox while isSkeleton -Func', () => {
53
+ before('loading page', async () => {
54
+ const errorOnGo = await DSAutocompleteCO.skeletonTest.go();
55
+ if (errorOnGo) throw errorOnGo;
56
+ });
57
+
58
+ it('01: should render a busy skeleton listbox with five presentational items', async () => {
59
+ await browser.keys(Key.Tab);
60
+ await type('4');
61
+
62
+ const skeleton = await DSAutocompleteCO.getSkeletonListbox();
63
+ await skeleton.waitForDisplayed();
64
+
65
+ await expect(skeleton).toHaveAttribute('role', 'listbox');
66
+ await expect(skeleton).toHaveAttribute('aria-busy', 'true');
67
+ await expect(skeleton).toHaveAttribute('aria-label', 'Loading options please wait');
68
+
69
+ const skeletonItems = await DSAutocompleteCO.getSkeletonMenuItems();
70
+ await expect(skeletonItems).toHaveLength(5);
71
+ // the count above is what pins SKELETON_AMOUNT; every item is rendered from the same JSX
72
+ // literal, so one sample is enough to prove role="presentation" reaches the DOM and keeps
73
+ // the busy listbox free of fake options
74
+ await expect(skeletonItems[2]).toHaveAttribute('role', 'presentation');
75
+
76
+ const menulist = await DSAutocompleteCO.getAutocompleteMenuList();
77
+ await expect(menulist).not.toBeExisting();
78
+ });
79
+ });
80
+
81
+ describe('PUI-18862 - DSAutocomplete:: input aria-controls linkage while isLoading -Func', () => {
82
+ before('loading page', async () => {
83
+ const errorOnGo = await DSAutocompleteCO.loadingInputProps.go();
84
+ if (errorOnGo) throw errorOnGo;
85
+ });
86
+
87
+ it('01: should point the input aria-controls at the busy loading listbox', async () => {
88
+ await browser.keys(Key.Tab);
89
+ await type('4');
90
+
91
+ const loading = await DSAutocompleteCO.getLoadingListbox();
92
+ await loading.waitForDisplayed();
93
+ const loadingId = await loading.getAttribute('id');
94
+
95
+ const input = await DSAutocompleteCO.getAutocompleteInput();
96
+ await expect(input).toHaveAttribute('role', 'combobox');
97
+ await expect(input).toHaveAttribute('aria-expanded', 'true');
98
+ await expect(input).toHaveAttribute('aria-controls', loadingId);
99
+ });
100
+ });
101
+
102
+ describe('PUI-18863 - DSAutocomplete:: input aria-controls linkage while isSkeleton -Func', () => {
103
+ before('loading page', async () => {
104
+ const errorOnGo = await DSAutocompleteCO.skeletonInputProps.go();
105
+ if (errorOnGo) throw errorOnGo;
106
+ });
107
+
108
+ it('01: should point the input aria-controls at the busy skeleton listbox', async () => {
109
+ await browser.keys(Key.Tab);
110
+ await type('4');
111
+
112
+ const skeleton = await DSAutocompleteCO.getSkeletonListbox();
113
+ await skeleton.waitForDisplayed();
114
+ const skeletonId = await skeleton.getAttribute('id');
115
+
116
+ const input = await DSAutocompleteCO.getAutocompleteInput();
117
+ await expect(input).toHaveAttribute('role', 'combobox');
118
+ await expect(input).toHaveAttribute('aria-expanded', 'true');
119
+ await expect(input).toHaveAttribute('aria-controls', skeletonId);
120
+ });
121
+ });
122
+ }
@@ -0,0 +1,48 @@
1
+ import { Key } from 'webdriverio';
2
+ import DSAutocompleteCO from '../DSAutocompleteCO';
3
+ import { type } from '../../helpers';
4
+
5
+ // Coverage for the loading state added in PUI-17137 ([Autocomplete] Add Support for Loading State).
6
+ // The acceptance criteria is the loading example from the InputText spec, so these snapshots pin the
7
+ // two menu appearances: the centered indeterminate spinner and the five skeleton menu items.
8
+ // Percy freezes CSS animations, so both the spinner rotation and the skeleton shimmer are captured
9
+ // deterministically.
10
+ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
11
+ describe('PUI-18866 - DSAutocomplete:: loading spinner menu -Visual', () => {
12
+ before('loading page', async () => {
13
+ const errorOnGo = await DSAutocompleteCO.loadingTest.go();
14
+ if (errorOnGo) throw errorOnGo;
15
+ });
16
+
17
+ it('01: should display the loading spinner centered in the menu', async () => {
18
+ await browser.keys(Key.Tab);
19
+ await type('4');
20
+
21
+ const loading = await DSAutocompleteCO.getLoadingListbox();
22
+ await loading.waitForDisplayed();
23
+
24
+ const snapshot = await browser.percyCheckScreenshot(
25
+ DSAutocompleteCO.snapshotPath('autocomplete-loading-spinner-menu'),
26
+ );
27
+ await expect(snapshot).toEqual(0);
28
+ });
29
+ });
30
+
31
+ describe('PUI-18867 - DSAutocomplete:: skeleton menu items -Visual', () => {
32
+ before('loading page', async () => {
33
+ const errorOnGo = await DSAutocompleteCO.skeletonTest.go();
34
+ if (errorOnGo) throw errorOnGo;
35
+ });
36
+
37
+ it('01: should display five skeleton menu items in the menu', async () => {
38
+ await browser.keys(Key.Tab);
39
+ await type('4');
40
+
41
+ const skeleton = await DSAutocompleteCO.getSkeletonListbox();
42
+ await skeleton.waitForDisplayed();
43
+
44
+ const snapshot = await browser.percyCheckScreenshot(DSAutocompleteCO.snapshotPath('autocomplete-skeleton-menu'));
45
+ await expect(snapshot).toEqual(0);
46
+ });
47
+ });
48
+ }
@@ -1,7 +1,12 @@
1
1
  import { Key } from 'webdriverio';
2
2
  import DSAutocompleteCO from '../DSAutocompleteCO';
3
3
 
4
- if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
4
+ if (
5
+ (!browser.capabilities['ice:options'].isPhone &&
6
+ !browser.capabilities['ice:options'].isTablet &&
7
+ browser.capabilities.browserName === 'chrome') ||
8
+ browser.capabilities.browserName === 'Chrome'
9
+ ) {
5
10
  describe('PUI-17529 - Autocomplete:: Slots -Func', () => {
6
11
  before('loading page', async () => {
7
12
  const errorOnGo = await DSAutocompleteCO.slots.go();
@@ -1,14 +1,17 @@
1
1
  import DSBannerCO from './DSBannerCO';
2
+ import { setTextSize } from '../helpers';
2
3
 
3
4
  if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
4
5
  describe('PUI-17535 - DSBanner - Text Resize In Different Layouts - Visual Test', () => {
5
6
  before('loading page', async () => {
6
7
  const errorOnGo = await DSBannerCO.textResizeInDifferentLayoutsTest.go();
7
8
  if (errorOnGo) throw errorOnGo;
9
+ await setTextSize('26');
8
10
  });
9
11
  it('01: should display text resize in different layouts properly', async () => {
10
- await browser.eyesOpen();
11
- const snapshot = await browser.eyesCheckSnapshot(DSBannerCO.snapshotPath('text-resize-in-different-layouts'));
12
+ const banner = await DSBannerCO.getBannerByIndex();
13
+ await banner.waitForDisplayed();
14
+ const snapshot = await browser.percyCheckScreenshot();
12
15
  await expect(snapshot).toEqual(0);
13
16
  });
14
17
  });
@@ -62,6 +62,10 @@ export default class DSBannerCO extends PageObject {
62
62
  return $('[data-testid="ds-banner"');
63
63
  }
64
64
 
65
+ static async getBannerByIndex(index = 0) {
66
+ return $$('[data-testid="ds-banner"]')[index];
67
+ }
68
+
65
69
  static async getBannerContainer() {
66
70
  return $('[data-testid="ds-banner-container"]');
67
71
  }
@@ -0,0 +1,33 @@
1
+ import DSButtonV3CO from './DSButtonV3CO';
2
+
3
+ // Tests for the fix introduced in PUI-17909:
4
+ // aria-disabled is no longer emitted as "false" on interactive buttons. A default (enabled) button
5
+ // carries no aria-disabled at all, and a native `disabled` button conveys its state via the native
6
+ // `disabled` attribute, so aria-disabled is intentionally absent there too (it was dropped from the
7
+ // emission condition, which is now applyAriaDisabled || readOnly).
8
+ // Both states already exist in the ShowcaseTest story (index 0 = enabled, index 3 = disabled).
9
+ // Pure DOM-attribute assertions produce identical results in every browser, so this runs Chrome-only.
10
+ if (
11
+ (!browser.capabilities['ice:options'].isPhone &&
12
+ !browser.capabilities['ice:options'].isTablet &&
13
+ browser.capabilities.browserName === 'chrome') ||
14
+ browser.capabilities.browserName === 'Chrome'
15
+ ) {
16
+ describe('PUI-18796 - DSButtonV3:: aria-disabled absent on enabled and disabled buttons - Func', () => {
17
+ before('loading page', async () => {
18
+ const errorOnGo = await DSButtonV3CO.showcaseURL.go();
19
+ if (errorOnGo) throw errorOnGo;
20
+ });
21
+
22
+ it('01: should not emit aria-disabled on enabled or native-disabled buttons', async () => {
23
+ // Enabled (default): aria-disabled must be entirely absent — the core PUI-17909 fix.
24
+ const enabled = await DSButtonV3CO.getButtonByIndex(0);
25
+ await expect(enabled).not.toHaveAttribute('aria-disabled');
26
+
27
+ // Native disabled: relies on the native `disabled` attribute, aria-disabled stays absent.
28
+ const disabled = await DSButtonV3CO.getButtonByIndex(3);
29
+ await expect(disabled).toHaveAttribute('disabled');
30
+ await expect(disabled).not.toHaveAttribute('aria-disabled');
31
+ });
32
+ });
33
+ }
@@ -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);