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,48 @@
1
+ // Tests for the fix introduced in PUI-14527 (useFloatingContext placement string type mismatch)
2
+ import { mouseOver } from '../../helpers';
3
+ import DSFloatingContextCO from '../DSFloatingContextCO';
4
+
5
+ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
6
+ describe('PUI-18529 - DSFloatingContext:: useFloatingContext placement directions - visual', () => {
7
+ before('loading page', async () => {
8
+ const errorOnGo = await DSFloatingContextCO.positionsTestURL.go();
9
+ if (errorOnGo) throw errorOnGo;
10
+ });
11
+
12
+ it('01: should display tooltip with right placement on hover', async () => {
13
+ const buttons = await DSFloatingContextCO.getHelpButtons();
14
+ await mouseOver(buttons[0]);
15
+ const contents = await DSFloatingContextCO.getFloatingContextContents();
16
+ await contents[0].waitForDisplayed();
17
+ const snapshot = await browser.percyCheckScreenshot(DSFloatingContextCO.snapshotPath('placement-right'));
18
+ await expect(snapshot).toEqual(0);
19
+ });
20
+
21
+ it('02: should display tooltip with top placement on hover', async () => {
22
+ const buttons = await DSFloatingContextCO.getHelpButtons();
23
+ await mouseOver(buttons[1]);
24
+ const contents = await DSFloatingContextCO.getFloatingContextContents();
25
+ await contents[0].waitForDisplayed();
26
+ const snapshot = await browser.percyCheckScreenshot(DSFloatingContextCO.snapshotPath('placement-top'));
27
+ await expect(snapshot).toEqual(0);
28
+ });
29
+
30
+ it('03: should display tooltip with bottom placement on hover', async () => {
31
+ const buttons = await DSFloatingContextCO.getHelpButtons();
32
+ await mouseOver(buttons[2]);
33
+ const contents = await DSFloatingContextCO.getFloatingContextContents();
34
+ await contents[0].waitForDisplayed();
35
+ const snapshot = await browser.percyCheckScreenshot(DSFloatingContextCO.snapshotPath('placement-bottom'));
36
+ await expect(snapshot).toEqual(0);
37
+ });
38
+
39
+ it('04: should display tooltip with left placement on hover', async () => {
40
+ const buttons = await DSFloatingContextCO.getHelpButtons();
41
+ await mouseOver(buttons[3]);
42
+ const contents = await DSFloatingContextCO.getFloatingContextContents();
43
+ await contents[0].waitForDisplayed();
44
+ const snapshot = await browser.percyCheckScreenshot(DSFloatingContextCO.snapshotPath('placement-left'));
45
+ await expect(snapshot).toEqual(0);
46
+ });
47
+ });
48
+ }
@@ -6,6 +6,10 @@ export default class DSComboboxMultiCO extends PageObject {
6
6
  // STORIES
7
7
  static basicTest = new Urlbuilder(PATH_E2E_COMBOBOX_MULTI, 'basic-test');
8
8
 
9
+ static loadingTest = new Urlbuilder(PATH_E2E_COMBOBOX_MULTI, 'loading-test');
10
+
11
+ static skeletonTest = new Urlbuilder(PATH_E2E_COMBOBOX_MULTI, 'skeleton-test');
12
+
9
13
  static applyAriaDisabled = new Urlbuilder(PATH_E2E_COMBOBOX_MULTI, 'apply-aria-disabled-test');
10
14
 
11
15
  static readOnly = new Urlbuilder(PATH_E2E_COMBOBOX_MULTI, 'read-only-test');
@@ -29,6 +33,14 @@ export default class DSComboboxMultiCO extends PageObject {
29
33
 
30
34
  static disabled = new Urlbuilder(PATH_E2E_COMBOBOX_MULTI, 'disabled-test');
31
35
 
36
+ static grouped = new Urlbuilder(PATH_E2E_COMBOBOX_MULTI, 'grouped-test');
37
+
38
+ static inlineTest = new Urlbuilder(PATH_E2E_COMBOBOX_MULTI, 'inline-test');
39
+
40
+ static withTooltip = new Urlbuilder(PATH_E2E_COMBOBOX_MULTI, 'with-tooltip-test');
41
+
42
+ static themeFontURL = new Urlbuilder(PATH_E2E_COMBOBOX_MULTI, 'theme-font-family-test');
43
+
32
44
  static controlledMenuStateWithSectionsSlotsTest = new Urlbuilder(
33
45
  PATH_E2E_COMBOBOX_MULTI_SLOTS,
34
46
  'controlled-menu-state-with-section-slots-test',
@@ -71,14 +83,6 @@ export default class DSComboboxMultiCO extends PageObject {
71
83
  return $$('[data-testid="combobox-input"]')[index];
72
84
  }
73
85
 
74
- static async getComboboxHiddenInput() {
75
- return $('input[aria-hidden="true"]');
76
- }
77
-
78
- static async getComboboxHiddenInputByIndex(index) {
79
- return $$('input[aria-hidden="true"]')[index];
80
- }
81
-
82
86
  static async getSelectedValues() {
83
87
  return $('[data-testid="combobox-selected-values"]');
84
88
  }
@@ -128,6 +132,15 @@ export default class DSComboboxMultiCO extends PageObject {
128
132
  return $$('[data-testid="ds-pill-close-icon"]')[index];
129
133
  }
130
134
 
135
+ static async getPillsByComboboxIndex(index) {
136
+ const selectedValues = await this.getSelectedValuesByIndex(index);
137
+ return selectedValues.$$('[data-testid="ds-pill-wrapper"]');
138
+ }
139
+
140
+ static async getPillCloseBtnByPillLabel(label) {
141
+ return $(`[data-testid="ds-pill-wrapper"][data-label="${label}"] [data-testid="ds-pill-close-icon"]`);
142
+ }
143
+
131
144
  // OPTIONS
132
145
  static async getOptionByLabel(label) {
133
146
  return $(`//li[@data-testid="combobox-option"]//span[contains(text(), "${label}")]/ancestor::li`);
@@ -273,7 +286,7 @@ export default class DSComboboxMultiCO extends PageObject {
273
286
  }
274
287
 
275
288
  static async getComboboxSectionLabelByIndex(index) {
276
- return $$('[data-dimsum-slot="dsComboboxSectionLabel"]')[index];
289
+ return $$('[data-dimsum-parent-slot="dsComboboxSectionLabel"]')[index];
277
290
  }
278
291
 
279
292
  static async getComboboxSectionWrapperSlotByIndex(index) {
@@ -283,4 +296,18 @@ export default class DSComboboxMultiCO extends PageObject {
283
296
  static snapshotPath(example = 'basic') {
284
297
  return PageObject.getSnapshotPathBuilder('DSComboboxMulti', example, 'ds-combobox-multi');
285
298
  }
299
+
300
+ // The selection wrapper and the selected pills' labels both render through
301
+ // styled(DSTypography), so the owner slot lands on `data-dimsum-parent-slot`.
302
+ static async getThemedSelection() {
303
+ return $('[data-testid="theme-font-sentinel"] [data-dimsum-parent-slot="dsComboboxSelection"]');
304
+ }
305
+
306
+ static async getFallbackSelection() {
307
+ return $('[data-testid="theme-font-fallback"] [data-dimsum-parent-slot="dsComboboxSelection"]');
308
+ }
309
+
310
+ static async getThemedPillLabel() {
311
+ return $('[data-testid="theme-font-sentinel"] [data-dimsum-parent-slot="dsPillLabel"]');
312
+ }
286
313
  }
@@ -0,0 +1,55 @@
1
+ import DSComboboxMultiCO from '../DSComboboxMultiCO';
2
+ import { axeCoreCheck } from '../../helpers';
3
+
4
+ // Tests for the fix introduced in PUI-18034
5
+ // (busy listbox with aria-busy + aria-label so screen readers announce the
6
+ // in-progress state via the input's aria-controls linkage; this spec verifies
7
+ // the busy listbox surface passes axe-core).
8
+ if (
9
+ (!browser.capabilities['ice:options'].isPhone &&
10
+ !browser.capabilities['ice:options'].isTablet &&
11
+ browser.capabilities.browserName === 'chrome') ||
12
+ browser.capabilities.browserName === 'Chrome'
13
+ ) {
14
+ describe('PUI-18471 - ComboboxMulti:: busy listbox while isLoading - axe-core', () => {
15
+ before('loading page', async () => {
16
+ const errorOnGo = await DSComboboxMultiCO.loadingTest.go();
17
+ if (errorOnGo) throw errorOnGo;
18
+ });
19
+
20
+ it('01: busy listbox while isLoading should pass axe-core scan', async () => {
21
+ const dropdownMenuBtn = await DSComboboxMultiCO.getDropDownMenuBtn();
22
+ await dropdownMenuBtn.click();
23
+
24
+ const listbox = await DSComboboxMultiCO.getComboListbox();
25
+ await listbox.waitForExist();
26
+
27
+ // `scrollable-region-focusable` is disabled here as a documented false positive:
28
+ // in the busy/isLoading state the fast-list container is empty, so the region is
29
+ // not authentically scrollable from a user's perspective — TanStack Virtual leaves
30
+ // a residual scrollHeight that triggers the rule. The container's tabindex=-1 is a
31
+ // long-standing Firefox scroll-prevention workaround. The rule remains active for
32
+ // all other states (open menu with items, read-only, etc.).
33
+ const result = await axeCoreCheck({ extraDisabledRules: ['scrollable-region-focusable'] });
34
+ expect(result.length).toBe(0);
35
+ });
36
+ });
37
+
38
+ describe('PUI-18472 - ComboboxMulti:: busy listbox while isSkeleton - axe-core', () => {
39
+ before('loading page', async () => {
40
+ const errorOnGo = await DSComboboxMultiCO.skeletonTest.go();
41
+ if (errorOnGo) throw errorOnGo;
42
+ });
43
+
44
+ it('01: busy listbox while isSkeleton should pass axe-core scan', async () => {
45
+ const dropdownMenuBtn = await DSComboboxMultiCO.getDropDownMenuBtn();
46
+ await dropdownMenuBtn.click();
47
+
48
+ const listbox = await DSComboboxMultiCO.getComboListbox();
49
+ await listbox.waitForExist();
50
+
51
+ const result = await axeCoreCheck();
52
+ expect(result.length).toBe(0);
53
+ });
54
+ });
55
+ }
@@ -0,0 +1,57 @@
1
+ import DSComboboxMultiCO from '../DSComboboxMultiCO';
2
+
3
+ // Tests for the fix introduced in PUI-18034
4
+ // (carries aria-busy + aria-label on the listbox during loading/skeleton so
5
+ // screen readers announce the in-progress state via the input's aria-controls
6
+ // linkage; replaces the prior racing assertive live region).
7
+ // aria-multiselectable is preserved on the busy listbox.
8
+ if (
9
+ (!browser.capabilities['ice:options'].isPhone &&
10
+ !browser.capabilities['ice:options'].isTablet &&
11
+ browser.capabilities.browserName === 'chrome') ||
12
+ browser.capabilities.browserName === 'Chrome'
13
+ ) {
14
+ describe('PUI-18447 - ComboboxMulti:: busy listbox while isLoading - Func', () => {
15
+ before('loading page', async () => {
16
+ const errorOnGo = await DSComboboxMultiCO.loadingTest.go();
17
+ if (errorOnGo) throw errorOnGo;
18
+ });
19
+
20
+ it('01: listbox is aria-busy + aria-multiselectable and aria-controls linked', async () => {
21
+ const dropdownMenuBtn = await DSComboboxMultiCO.getDropDownMenuBtn();
22
+ await dropdownMenuBtn.click();
23
+
24
+ const listbox = await DSComboboxMultiCO.getComboListbox();
25
+ await listbox.waitForExist();
26
+
27
+ await expect(listbox).toHaveAttribute('role', 'listbox');
28
+ await expect(listbox).toHaveAttribute('aria-busy', 'true');
29
+ await expect(listbox).toHaveAttribute('aria-label', 'Loading options please wait');
30
+ await expect(listbox).toHaveAttribute('aria-multiselectable', 'true');
31
+
32
+ const listboxId = await listbox.getAttribute('id');
33
+ const input = await DSComboboxMultiCO.getComboboxInput();
34
+ await expect(input).toHaveAttribute('aria-controls', listboxId);
35
+ });
36
+ });
37
+
38
+ describe('PUI-18448 - ComboboxMulti:: busy listbox while isSkeleton - Func', () => {
39
+ before('loading page', async () => {
40
+ const errorOnGo = await DSComboboxMultiCO.skeletonTest.go();
41
+ if (errorOnGo) throw errorOnGo;
42
+ });
43
+
44
+ it('01: listbox is aria-busy + aria-multiselectable with aria-label', async () => {
45
+ const dropdownMenuBtn = await DSComboboxMultiCO.getDropDownMenuBtn();
46
+ await dropdownMenuBtn.click();
47
+
48
+ const listbox = await DSComboboxMultiCO.getComboListbox();
49
+ await listbox.waitForExist();
50
+
51
+ await expect(listbox).toHaveAttribute('role', 'listbox');
52
+ await expect(listbox).toHaveAttribute('aria-busy', 'true');
53
+ await expect(listbox).toHaveAttribute('aria-label', 'Loading options please wait');
54
+ await expect(listbox).toHaveAttribute('aria-multiselectable', 'true');
55
+ });
56
+ });
57
+ }
@@ -1,6 +1,7 @@
1
1
  /* eslint-disable max-lines */
2
2
  import { Key } from 'webdriverio';
3
3
  import DSComboboxMultiCO from '../DSComboboxMultiCO';
4
+ import { mouseOver } from '../../helpers';
4
5
 
5
6
  if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
6
7
  describe('PUI-14364 - ComboboxMulti:: applyAriaDisabled prop - visual', () => {
@@ -10,8 +11,10 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
10
11
  });
11
12
  it('01: The first aria-disabled combobox should be focused', async () => {
12
13
  await browser.eyesOpen();
13
- const firstCombobox = await DSComboboxMultiCO.getComboboxByIndex(0);
14
- await firstCombobox.click();
14
+ // the container centre lands on the aria-hidden overlay input, which never focuses the
15
+ // combobox; the selected-values area is the only pointer target that reliably focuses it
16
+ const firstComboboxValues = await DSComboboxMultiCO.getSelectedValuesByIndex(0);
17
+ await firstComboboxValues.click();
15
18
  const snapshot = await browser.eyesCheckSnapshot(
16
19
  DSComboboxMultiCO.snapshotPath('combobox-multi-aria-disabled-click'),
17
20
  );
@@ -43,5 +46,19 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
43
46
  );
44
47
  await expect(snapshot).toEqual(0);
45
48
  });
49
+ // PUI-15476: aria-disabled item text color must change to n600 on hover
50
+ it('04: listbox with aria-disabled item hovered should display n600 text color', async () => {
51
+ await browser.eyesOpen();
52
+ const secondCombobox = await DSComboboxMultiCO.getComboboxWrapperByIndex(1);
53
+ await secondCombobox.click();
54
+ const menuList = await DSComboboxMultiCO.getMenuList();
55
+ await menuList.waitForDisplayed();
56
+ const ariaDisabledOption = await DSComboboxMultiCO.getOptionByIndex(1);
57
+ await mouseOver(ariaDisabledOption);
58
+ const snapshot = await browser.eyesCheckSnapshot(
59
+ DSComboboxMultiCO.snapshotPath('combobox-multi-aria-disabled-item-hovered'),
60
+ );
61
+ await expect(snapshot).toEqual(0);
62
+ });
46
63
  });
47
64
  }
@@ -0,0 +1,24 @@
1
+ import DSComboboxMultiCO from '../DSComboboxMultiCO';
2
+ import { axeCoreCheck } from '../../helpers';
3
+
4
+ if (
5
+ (!browser.capabilities['ice:options'].isPhone &&
6
+ !browser.capabilities['ice:options'].isTablet &&
7
+ browser.capabilities.browserName === 'chrome') ||
8
+ browser.capabilities.browserName === 'Chrome'
9
+ ) {
10
+ describe('PUI-18473 - ComboboxMulti:: disabled - axe-core', () => {
11
+ before('loading page', async () => {
12
+ const errorOnGo = await DSComboboxMultiCO.disabled.go();
13
+ if (errorOnGo) throw errorOnGo;
14
+ });
15
+
16
+ it('01: disabled combobox should pass axe-core scan', async () => {
17
+ const combobox = await DSComboboxMultiCO.getCombobox();
18
+ await combobox.waitForExist();
19
+
20
+ const result = await axeCoreCheck();
21
+ expect(result.length).toBe(0);
22
+ });
23
+ });
24
+ }
@@ -11,10 +11,8 @@ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:o
11
11
  it('01: combobox multi disabled should not be focused - clicking Input', async () => {
12
12
  const combobox = await DSComboboxMultiCO.getCombobox();
13
13
  const input = await DSComboboxMultiCO.getComboboxInput();
14
- const hiddenInput = await DSComboboxMultiCO.getComboboxHiddenInput();
15
14
  await combobox.click();
16
15
  await expect(input).not.toBeFocused();
17
- await expect(hiddenInput).not.toBeFocused();
18
16
  });
19
17
  it('02: listbox should not be displayed when combobox is disabled', async () => {
20
18
  await browser.keys(Key.ArrowDown);
@@ -0,0 +1,22 @@
1
+ import DSComboboxMultiCO from '../DSComboboxMultiCO';
2
+
3
+ // Tests for the fixes in PUI-15502 (disabled input hint/value + pill font color =
4
+ // neutral-600) and PUI-15578 (dropdown chevron fill = neutral-400 in disabled state).
5
+ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
6
+ describe('PUI-18573 - ComboboxMulti:: Disabled -Visual', () => {
7
+ before('loading page', async () => {
8
+ const errorOnGo = await DSComboboxMultiCO.disabled.go();
9
+ if (errorOnGo) throw errorOnGo;
10
+ });
11
+
12
+ it('01: should display disabled combobox with dimmed pill text and chevron', async () => {
13
+ const combobox = await DSComboboxMultiCO.getCombobox();
14
+ await combobox.waitForDisplayed();
15
+
16
+ const snapshot = await browser.percyCheckScreenshot(
17
+ DSComboboxMultiCO.snapshotPath('combobox-multi-disabled-input'),
18
+ );
19
+ await expect(snapshot).toEqual(0);
20
+ });
21
+ });
22
+ }
@@ -0,0 +1,42 @@
1
+ import DSComboboxMultiCO from '../DSComboboxMultiCO';
2
+
3
+ // Tests for the fixes introduced in PUI-15487 (group/section label styled per the
4
+ // b3-strong spec — bold, neutral color, 32px row) and PUI-15473 (menu item idle
5
+ // label color resolves to neutral-700; disabled options fall through to the muted
6
+ // disabledOption color). The open grouped menu surfaces all of these at once.
7
+ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
8
+ describe('PUI-18571 - ComboboxMulti:: Grouped -Visual', () => {
9
+ before('loading page', async () => {
10
+ const errorOnGo = await DSComboboxMultiCO.grouped.go();
11
+ if (errorOnGo) throw errorOnGo;
12
+ });
13
+
14
+ it('01: should display grouped menu with section labels, idle and disabled option text', async () => {
15
+ const menuList = await DSComboboxMultiCO.getMenuList();
16
+ await menuList.waitForDisplayed();
17
+
18
+ const sectionLabel = await DSComboboxMultiCO.getComboboxSectionLabelByIndex(0);
19
+ await sectionLabel.waitForDisplayed();
20
+
21
+ const snapshot = await browser.percyCheckScreenshot(
22
+ DSComboboxMultiCO.snapshotPath('combobox-multi-grouped-menu'),
23
+ );
24
+ await expect(snapshot).toEqual(0);
25
+ });
26
+
27
+ it('02: should display grouped menu with a selected option checked', async () => {
28
+ const option = await DSComboboxMultiCO.getOptionByIndex(0);
29
+ await option.click();
30
+
31
+ // multi select keeps the menu open — the selected option renders its checked
32
+ // styling in place.
33
+ const menuList = await DSComboboxMultiCO.getMenuList();
34
+ await menuList.waitForDisplayed();
35
+
36
+ const snapshot = await browser.percyCheckScreenshot(
37
+ DSComboboxMultiCO.snapshotPath('combobox-multi-grouped-menu-selected'),
38
+ );
39
+ await expect(snapshot).toEqual(0);
40
+ });
41
+ });
42
+ }
@@ -0,0 +1,21 @@
1
+ /* eslint-disable max-lines */
2
+ import DSComboboxMultiCO from '../DSComboboxMultiCO';
3
+
4
+ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
5
+ // Tests for the fix introduced in PUI-15481 (inline padding 8px top/bottom — was 10px)
6
+ describe('PUI-18560 - ComboboxMulti:: inline config padding - visual', () => {
7
+ before('loading page', async () => {
8
+ const errorOnGo = await DSComboboxMultiCO.inlineTest.go();
9
+ if (errorOnGo) throw errorOnGo;
10
+ });
11
+ it('01: inline combobox should render with the corrected 8px padding', async () => {
12
+ await browser.eyesOpen();
13
+ const pillDropdownBtn = await DSComboboxMultiCO.getPillDropDownBtn();
14
+ await pillDropdownBtn.click();
15
+ const menuList = await DSComboboxMultiCO.getMenuList();
16
+ await menuList.waitForDisplayed();
17
+ const snapshot = await browser.eyesCheckSnapshot(DSComboboxMultiCO.snapshotPath('combobox-multi-inline-padding'));
18
+ await expect(snapshot).toEqual(0);
19
+ });
20
+ });
21
+ }
@@ -0,0 +1,59 @@
1
+ import { Key } from 'webdriverio';
2
+ import DSComboboxMultiCO from '../DSComboboxMultiCO';
3
+
4
+ // Reproduces PUI-17870 on the exact surface it was reported on: the SECOND combobox of the
5
+ // `apply-aria-disabled-test` story, whose container is enabled while its two selected values carry
6
+ // per-item state — "Padme Amidala (pill aria-disabled)" (applyAriaDisabled) and
7
+ // "Han Solo (disabled)" (disabled). Both pills stay type `removable`, so their remove button is
8
+ // rendered, and neither must be removable. Fix originally shipped with PUI-17861.
9
+ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
10
+ describe('PUI-18843 - ComboboxMulti:: per-item disabled and aria-disabled pills - Func', () => {
11
+ const ARIA_DISABLED_PILL = 'Padme Amidala (pill aria-disabled)';
12
+ const DISABLED_PILL = 'Han Solo (disabled)';
13
+
14
+ before('loading page', async () => {
15
+ const errorOnGo = await DSComboboxMultiCO.applyAriaDisabled.go();
16
+ if (errorOnGo) throw errorOnGo;
17
+ });
18
+
19
+ it('01: should reflect each per-item state on its own remove button', async () => {
20
+ const ariaDisabledCloseBtn = await DSComboboxMultiCO.getPillCloseBtnByPillLabel(ARIA_DISABLED_PILL);
21
+ await ariaDisabledCloseBtn.waitForDisplayed();
22
+ const disabledCloseBtn = await DSComboboxMultiCO.getPillCloseBtnByPillLabel(DISABLED_PILL);
23
+ const pills = await DSComboboxMultiCO.getPillsByComboboxIndex(1);
24
+
25
+ await expect(pills.length).toEqual(2);
26
+ await expect(ariaDisabledCloseBtn).toHaveAttribute('aria-disabled', 'true');
27
+ await expect(ariaDisabledCloseBtn).toBeEnabled();
28
+ await expect(disabledCloseBtn).toBeDisabled();
29
+ });
30
+
31
+ it('02: should not remove the disabled pill when its remove button is clicked', async () => {
32
+ const disabledCloseBtn = await DSComboboxMultiCO.getPillCloseBtnByPillLabel(DISABLED_PILL);
33
+ await disabledCloseBtn.click();
34
+
35
+ const pills = await DSComboboxMultiCO.getPillsByComboboxIndex(1);
36
+ const disabledCloseBtnAfterClick = await DSComboboxMultiCO.getPillCloseBtnByPillLabel(DISABLED_PILL);
37
+
38
+ await expect(pills.length).toEqual(2);
39
+ await expect(disabledCloseBtnAfterClick).toBeExisting();
40
+ });
41
+
42
+ it('03: should not remove the aria-disabled pill when its remove button is clicked', async () => {
43
+ const ariaDisabledCloseBtn = await DSComboboxMultiCO.getPillCloseBtnByPillLabel(ARIA_DISABLED_PILL);
44
+ await ariaDisabledCloseBtn.click();
45
+
46
+ // The guarded remove handler returns before stopping propagation, so the click reaches the
47
+ // combobox and opens its menu — expected, the container itself is not disabled.
48
+ const menuList = await DSComboboxMultiCO.getMenuList();
49
+ await menuList.waitForDisplayed();
50
+ await browser.keys(Key.Escape);
51
+
52
+ const pills = await DSComboboxMultiCO.getPillsByComboboxIndex(1);
53
+ const ariaDisabledCloseBtnAfterClick = await DSComboboxMultiCO.getPillCloseBtnByPillLabel(ARIA_DISABLED_PILL);
54
+
55
+ await expect(pills.length).toEqual(2);
56
+ await expect(ariaDisabledCloseBtnAfterClick).toBeExisting();
57
+ });
58
+ });
59
+ }
@@ -0,0 +1,39 @@
1
+ import DSComboboxMultiCO from '../DSComboboxMultiCO';
2
+ import { mouseOver } from '../../helpers';
3
+
4
+ // Reproduces the visual half of PUI-17870 on the surface it was reported on: the SECOND combobox of
5
+ // the `apply-aria-disabled-test` story, whose container is enabled while its two selected values
6
+ // carry per-item state. Both pills keep their remove button, and neither must paint the hover
7
+ // background nor the brand icon color that an enabled pill does. Fix shipped with PUI-17861.
8
+ // Applitools Eyes is used instead of Percy on purpose: Percy serializes the DOM and re-renders it
9
+ // without a pointer, so a CSS-only `:hover` state would be lost from the snapshot.
10
+ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
11
+ describe('PUI-18844 - ComboboxMulti:: per-item pill remove button hover - Visual', () => {
12
+ const ARIA_DISABLED_PILL = 'Padme Amidala (pill aria-disabled)';
13
+ const DISABLED_PILL = 'Han Solo (disabled)';
14
+
15
+ before('loading page', async () => {
16
+ const errorOnGo = await DSComboboxMultiCO.applyAriaDisabled.go();
17
+ if (errorOnGo) throw errorOnGo;
18
+ });
19
+
20
+ it('01: should keep the aria-disabled pill remove button dimmed with no hover background', async () => {
21
+ await browser.eyesOpen();
22
+ const closeBtn = await DSComboboxMultiCO.getPillCloseBtnByPillLabel(ARIA_DISABLED_PILL);
23
+ await closeBtn.waitForDisplayed();
24
+ await mouseOver(closeBtn);
25
+ const snapshotName = 'combobox-multi-pill-remove-hover-aria-disabled';
26
+ const snapshot = await browser.eyesCheckSnapshot(DSComboboxMultiCO.snapshotPath(snapshotName));
27
+ await expect(snapshot).toEqual(0);
28
+ });
29
+
30
+ it('02: should keep the disabled pill remove button dimmed with no hover background', async () => {
31
+ await browser.eyesOpen();
32
+ const closeBtn = await DSComboboxMultiCO.getPillCloseBtnByPillLabel(DISABLED_PILL);
33
+ await mouseOver(closeBtn);
34
+ const snapshotName = 'combobox-multi-pill-remove-hover-disabled';
35
+ const snapshot = await browser.eyesCheckSnapshot(DSComboboxMultiCO.snapshotPath(snapshotName));
36
+ await expect(snapshot).toEqual(0);
37
+ });
38
+ });
39
+ }
@@ -0,0 +1,25 @@
1
+ import DSComboboxMultiCO from '../DSComboboxMultiCO';
2
+
3
+ // Tests for the fix introduced in PUI-15485 (skeleton menu items render with the
4
+ // correct region fill — neutral-080 — and a 1px corner radius per the menu spec).
5
+ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
6
+ describe('PUI-18572 - ComboboxMulti:: Skeleton -Visual', () => {
7
+ before('loading page', async () => {
8
+ const errorOnGo = await DSComboboxMultiCO.skeletonTest.go();
9
+ if (errorOnGo) throw errorOnGo;
10
+ });
11
+
12
+ it('01: should display skeleton menu items with region fill and corner radius', async () => {
13
+ const dropdownMenuBtn = await DSComboboxMultiCO.getDropDownMenuBtn();
14
+ await dropdownMenuBtn.click();
15
+
16
+ const skeletonMenuItem = await DSComboboxMultiCO.getComboboxSkeletonMenuItem();
17
+ await skeletonMenuItem.waitForDisplayed();
18
+
19
+ const snapshot = await browser.percyCheckScreenshot(
20
+ DSComboboxMultiCO.snapshotPath('combobox-multi-skeleton-menu'),
21
+ );
22
+ await expect(snapshot).toEqual(0);
23
+ });
24
+ });
25
+ }
@@ -0,0 +1,38 @@
1
+ import DSComboboxMultiCO from '../DSComboboxMultiCO';
2
+
3
+ // Tests the theme-driven font-family mechanism covered by the combobox theming spike PUI-18214
4
+ // (the selection wrapper and the selected pills' labels render through DSTypography, which reads
5
+ // theme.fonts.default, falling back to proxima-nova). Theme-agnostic: uses a sentinel font,
6
+ // never the dsConsumer POC theme values, so it survives any future theme change.
7
+ // Out of scope on purpose: the native <input> that holds typed text mirrors b2 as raw CSS and
8
+ // declares no font-family, so it does NOT follow theme.fonts.default (measured under the sentinel
9
+ // theme it still computes proxima-nova, i.e. the inherited page font, while the selection text
10
+ // switches). Asserting it here would lock in that gap; it is reported separately instead.
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
+ ) {
17
+ describe('PUI-18974 - ComboboxMulti:: theme font-family wiring - Func', () => {
18
+ before('loading page', async () => {
19
+ const errorOnGo = await DSComboboxMultiCO.themeFontURL.go();
20
+ if (errorOnGo) throw errorOnGo;
21
+ });
22
+
23
+ it('01: should read selection and pill font-family from theme with proxima-nova fallback', async () => {
24
+ const themed = await DSComboboxMultiCO.getThemedSelection();
25
+ await themed.waitForDisplayed();
26
+ const themedFont = (await themed.getCSSProperty('font-family')).value.toLowerCase();
27
+ await expect(themedFont).toContain('sentinelfont');
28
+
29
+ const themedPill = await DSComboboxMultiCO.getThemedPillLabel();
30
+ const themedPillFont = (await themedPill.getCSSProperty('font-family')).value.toLowerCase();
31
+ await expect(themedPillFont).toContain('sentinelfont');
32
+
33
+ const fallback = await DSComboboxMultiCO.getFallbackSelection();
34
+ const fallbackFont = (await fallback.getCSSProperty('font-family')).value.toLowerCase();
35
+ await expect(fallbackFont).toContain('proxima-nova');
36
+ });
37
+ });
38
+ }
@@ -0,0 +1,39 @@
1
+ import DSComboboxMultiCO from '../DSComboboxMultiCO';
2
+ import DSTooltipV3CO from '../../ds-tooltip-v3/DSTooltipV3CO';
3
+ import { axeCoreCheck, mouseOver } from '../../helpers';
4
+
5
+ // Remediation for PUI-18660: the accessible path to the truncated values is the DSTooltipV3 wrapping
6
+ // the aria-disabled combobox, so the axe scan must cover the tooltip while it is OPEN (its DOM only
7
+ // exists then) — not just the resting markup.
8
+ if (
9
+ (!browser.capabilities['ice:options'].isPhone &&
10
+ !browser.capabilities['ice:options'].isTablet &&
11
+ browser.capabilities.browserName === 'chrome') ||
12
+ browser.capabilities.browserName === 'Chrome'
13
+ ) {
14
+ describe('PUI-18814 - ComboboxMulti:: aria-disabled truncated values tooltip - Axe-Core', () => {
15
+ before('loading page', async () => {
16
+ const errorOnGo = await DSComboboxMultiCO.withTooltip.go();
17
+ if (errorOnGo) throw errorOnGo;
18
+ });
19
+
20
+ it('01: should have no violations at rest (aria-disabled combobox + describedby wiring)', async () => {
21
+ const combobox = await DSComboboxMultiCO.getComboboxWrapper();
22
+ await combobox.waitForDisplayed();
23
+
24
+ const result = await axeCoreCheck();
25
+ expect(result.length).toBe(0);
26
+ });
27
+
28
+ it('02: should have no violations with the tooltip open over the combobox', async () => {
29
+ const combobox = await DSComboboxMultiCO.getComboboxWrapper();
30
+ await mouseOver(combobox);
31
+
32
+ const tooltip = await DSTooltipV3CO.getTooltip();
33
+ await tooltip.waitForDisplayed();
34
+
35
+ const result = await axeCoreCheck();
36
+ expect(result.length).toBe(0);
37
+ });
38
+ });
39
+ }
@@ -0,0 +1,39 @@
1
+ import { Key } from 'webdriverio';
2
+ import DSComboboxMultiCO from '../DSComboboxMultiCO';
3
+ import DSTooltipV3CO from '../../ds-tooltip-v3/DSTooltipV3CO';
4
+ import { mouseOver } from '../../helpers';
5
+
6
+ // Remediation for PUI-18660: the combobox no longer renders its own truncation tooltip. In an
7
+ // aria-disabled combobox the menu cannot be opened, so the only accessible path to the full,
8
+ // truncated selected values is the consumer-provided DSTooltipV3 wrapping the combobox.
9
+ const FULL_VALUE = 'Luke Skywalker too long this text is super long';
10
+
11
+ if (!browser.capabilities['ice:options'].isPhone && !browser.capabilities['ice:options'].isTablet) {
12
+ describe('PUI-18813 - ComboboxMulti:: aria-disabled truncated values tooltip - Func', () => {
13
+ before('loading page', async () => {
14
+ const errorOnGo = await DSComboboxMultiCO.withTooltip.go();
15
+ if (errorOnGo) throw errorOnGo;
16
+ });
17
+
18
+ it('01: should not display the tooltip before hover', async () => {
19
+ const tooltip = await DSTooltipV3CO.getTooltip();
20
+ await expect(tooltip).not.toBeDisplayed();
21
+ });
22
+
23
+ it('02: should reveal the full selected values via tooltip on hover', async () => {
24
+ const combobox = await DSComboboxMultiCO.getComboboxWrapper();
25
+ await mouseOver(combobox);
26
+
27
+ const tooltip = await DSTooltipV3CO.getTooltip();
28
+ await expect(tooltip).toBeDisplayed();
29
+ await expect(tooltip).toHaveText(expect.stringContaining(FULL_VALUE));
30
+ });
31
+
32
+ it('03: should hide the tooltip on pressing Escape', async () => {
33
+ await browser.keys(Key.Escape);
34
+
35
+ const tooltip = await DSTooltipV3CO.getTooltip();
36
+ await expect(tooltip).not.toBeDisplayed();
37
+ });
38
+ });
39
+ }