@sapudex/web-components 2.34.0 → 2.36.0

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 (178) hide show
  1. package/cypress/specs/Breadcrumbs.cy.tsx +4 -5
  2. package/cypress/specs/ListItem.cy.tsx +25 -21
  3. package/cypress/specs/MastheadMenu.cy.tsx +81 -0
  4. package/cypress/specs/MastheadShell.cy.tsx +79 -0
  5. package/cypress/specs/SecondaryNavigationDesktop.cy.tsx +14 -0
  6. package/cypress/specs/SelectBox.cy.tsx +166 -1
  7. package/cypress/specs/Wizard.cy.tsx +6 -0
  8. package/cypress/support/component-imports.instrumented.ts +2 -0
  9. package/cypress/support/component-imports.src.ts +2 -0
  10. package/dist/BreadcrumbsPopoverTemplate.js +1 -1
  11. package/dist/BreadcrumbsPopoverTemplate.js.map +1 -1
  12. package/dist/BreadcrumbsTemplate.js +1 -1
  13. package/dist/BreadcrumbsTemplate.js.map +1 -1
  14. package/dist/CountrySelector.d.ts +1 -0
  15. package/dist/CountrySelector.js +3 -0
  16. package/dist/CountrySelector.js.map +1 -1
  17. package/dist/FilterMenu.d.ts +1 -0
  18. package/dist/FilterMenu.js +3 -0
  19. package/dist/FilterMenu.js.map +1 -1
  20. package/dist/ListItemBase.d.ts +2 -0
  21. package/dist/ListItemBase.js +6 -0
  22. package/dist/ListItemBase.js.map +1 -1
  23. package/dist/MastheadItem.d.ts +10 -0
  24. package/dist/MastheadItem.js +35 -3
  25. package/dist/MastheadItem.js.map +1 -1
  26. package/dist/MastheadMenu.d.ts +3 -0
  27. package/dist/MastheadMenu.js +16 -6
  28. package/dist/MastheadMenu.js.map +1 -1
  29. package/dist/MediaPlayer.d.ts +1 -1
  30. package/dist/MediaPlayer.js.map +1 -1
  31. package/dist/SecondaryNavigationItem.d.ts +5 -1
  32. package/dist/SecondaryNavigationItem.js +35 -5
  33. package/dist/SecondaryNavigationItem.js.map +1 -1
  34. package/dist/SelectBase.js +13 -4
  35. package/dist/SelectBase.js.map +1 -1
  36. package/dist/SelectBox.d.ts +1 -0
  37. package/dist/SelectBox.js +3 -0
  38. package/dist/SelectBox.js.map +1 -1
  39. package/dist/Wizard.js +2 -2
  40. package/dist/Wizard.js.map +1 -1
  41. package/dist/assets/{InputSuggestions-Bz7HZXUc.js → InputSuggestions-BIR_sdOv.js} +1 -1
  42. package/dist/assets/{ListItemStandardExpandableTextTemplate-CjE7hAvu.js → ListItemStandardExpandableTextTemplate-5xOuY0en.js} +1 -1
  43. package/dist/assets/{bundle.esm-mAR7ytdB.js → bundle.esm-C8GwJvJr.js} +633 -219
  44. package/dist/css/themes/Breadcrumbs.css +1 -1
  45. package/dist/css/themes/BreadcrumbsPopover.css +1 -1
  46. package/dist/css/themes/FilterMenu.css +1 -1
  47. package/dist/css/themes/ListGroupHeader.css +1 -1
  48. package/dist/css/themes/MastheadCountrySelector.css +1 -1
  49. package/dist/css/themes/MastheadItem.css +1 -1
  50. package/dist/css/themes/MastheadMenu.css +1 -1
  51. package/dist/css/themes/MastheadMenuItem.css +1 -1
  52. package/dist/css/themes/MastheadMobileMenu.css +1 -1
  53. package/dist/css/themes/MastheadProfileMenu.css +1 -1
  54. package/dist/css/themes/RatingIndicator.css +1 -1
  55. package/dist/css/themes/SearchableList.css +1 -1
  56. package/dist/css/themes/SecondaryNavigation.css +1 -1
  57. package/dist/css/themes/SecondaryNavigationItem.css +1 -1
  58. package/dist/css/themes/SelectBase.css +1 -1
  59. package/dist/css/themes/Slider.css +1 -1
  60. package/dist/custom-elements-internal.json +166 -166
  61. package/dist/custom-elements.json +151 -151
  62. package/dist/generated/templates/ListGroupHeaderTemplate.lit.js +16 -12
  63. package/dist/generated/templates/ListGroupHeaderTemplate.lit.js.map +1 -1
  64. package/dist/generated/templates/ListItemTemplate.lit.js +40 -36
  65. package/dist/generated/templates/ListItemTemplate.lit.js.map +1 -1
  66. package/dist/generated/templates/MastheadItemTemplate.lit.js +2 -2
  67. package/dist/generated/templates/MastheadItemTemplate.lit.js.map +1 -1
  68. package/dist/generated/templates/MastheadShellTemplate.lit.js +3 -3
  69. package/dist/generated/templates/MastheadShellTemplate.lit.js.map +1 -1
  70. package/dist/generated/templates/SearchableListBaseTemplate.lit.js +1 -1
  71. package/dist/generated/templates/SearchableListBaseTemplate.lit.js.map +1 -1
  72. package/dist/generated/themes/Breadcrumbs.css.d.ts +1 -1
  73. package/dist/generated/themes/Breadcrumbs.css.js +1 -1
  74. package/dist/generated/themes/Breadcrumbs.css.js.map +1 -1
  75. package/dist/generated/themes/BreadcrumbsPopover.css.d.ts +1 -1
  76. package/dist/generated/themes/BreadcrumbsPopover.css.js +1 -1
  77. package/dist/generated/themes/BreadcrumbsPopover.css.js.map +1 -1
  78. package/dist/generated/themes/FilterMenu.css.d.ts +1 -1
  79. package/dist/generated/themes/FilterMenu.css.js +1 -1
  80. package/dist/generated/themes/FilterMenu.css.js.map +1 -1
  81. package/dist/generated/themes/ListGroupHeader.css.d.ts +1 -1
  82. package/dist/generated/themes/ListGroupHeader.css.js +1 -1
  83. package/dist/generated/themes/ListGroupHeader.css.js.map +1 -1
  84. package/dist/generated/themes/MastheadCountrySelector.css.d.ts +1 -1
  85. package/dist/generated/themes/MastheadCountrySelector.css.js +1 -1
  86. package/dist/generated/themes/MastheadCountrySelector.css.js.map +1 -1
  87. package/dist/generated/themes/MastheadItem.css.d.ts +1 -1
  88. package/dist/generated/themes/MastheadItem.css.js +1 -1
  89. package/dist/generated/themes/MastheadItem.css.js.map +1 -1
  90. package/dist/generated/themes/MastheadMenu.css.d.ts +1 -1
  91. package/dist/generated/themes/MastheadMenu.css.js +1 -1
  92. package/dist/generated/themes/MastheadMenu.css.js.map +1 -1
  93. package/dist/generated/themes/MastheadMenuItem.css.d.ts +1 -1
  94. package/dist/generated/themes/MastheadMenuItem.css.js +1 -1
  95. package/dist/generated/themes/MastheadMenuItem.css.js.map +1 -1
  96. package/dist/generated/themes/MastheadMobileMenu.css.d.ts +1 -1
  97. package/dist/generated/themes/MastheadMobileMenu.css.js +1 -1
  98. package/dist/generated/themes/MastheadMobileMenu.css.js.map +1 -1
  99. package/dist/generated/themes/MastheadProfileMenu.css.d.ts +1 -1
  100. package/dist/generated/themes/MastheadProfileMenu.css.js +1 -1
  101. package/dist/generated/themes/MastheadProfileMenu.css.js.map +1 -1
  102. package/dist/generated/themes/RatingIndicator.css.d.ts +1 -1
  103. package/dist/generated/themes/RatingIndicator.css.js +1 -1
  104. package/dist/generated/themes/RatingIndicator.css.js.map +1 -1
  105. package/dist/generated/themes/SearchableList.css.d.ts +1 -1
  106. package/dist/generated/themes/SearchableList.css.js +1 -1
  107. package/dist/generated/themes/SearchableList.css.js.map +1 -1
  108. package/dist/generated/themes/SecondaryNavigation.css.d.ts +1 -1
  109. package/dist/generated/themes/SecondaryNavigation.css.js +1 -1
  110. package/dist/generated/themes/SecondaryNavigation.css.js.map +1 -1
  111. package/dist/generated/themes/SecondaryNavigationItem.css.d.ts +1 -1
  112. package/dist/generated/themes/SecondaryNavigationItem.css.js +1 -1
  113. package/dist/generated/themes/SecondaryNavigationItem.css.js.map +1 -1
  114. package/dist/generated/themes/SelectBase.css.d.ts +1 -1
  115. package/dist/generated/themes/SelectBase.css.js +1 -1
  116. package/dist/generated/themes/SelectBase.css.js.map +1 -1
  117. package/dist/generated/themes/Slider.css.d.ts +1 -1
  118. package/dist/generated/themes/Slider.css.js +1 -1
  119. package/dist/generated/themes/Slider.css.js.map +1 -1
  120. package/dist/types/List.d.ts +2 -0
  121. package/dist/types/List.js +2 -0
  122. package/dist/types/List.js.map +1 -1
  123. package/dist/vscode.html-custom-data.json +72 -12
  124. package/dist/web-types.json +71 -21
  125. package/package.json +1 -1
  126. package/src/BreadcrumbsPopoverTemplate.tsx +1 -1
  127. package/src/BreadcrumbsTemplate.tsx +1 -1
  128. package/src/CountrySelector.ts +3 -0
  129. package/src/FilterMenu.ts +3 -0
  130. package/src/ListGroupHeader.hbs +11 -7
  131. package/src/ListItem.hbs +2 -0
  132. package/src/ListItemBase.ts +8 -0
  133. package/src/MastheadItem.hbs +2 -0
  134. package/src/MastheadItem.ts +37 -3
  135. package/src/MastheadMenu.ts +19 -6
  136. package/src/MastheadShell.hbs +3 -0
  137. package/src/MediaPlayer.ts +1 -1
  138. package/src/SearchableListBase.hbs +9 -1
  139. package/src/SecondaryNavigationItem.ts +37 -5
  140. package/src/SelectBase.ts +14 -4
  141. package/src/SelectBox.ts +3 -0
  142. package/src/Wizard.ts +2 -2
  143. package/src/generated/templates/ListGroupHeaderTemplate.lit.ts +16 -12
  144. package/src/generated/templates/ListItemTemplate.lit.ts +40 -36
  145. package/src/generated/templates/MastheadItemTemplate.lit.ts +2 -2
  146. package/src/generated/templates/MastheadShellTemplate.lit.ts +3 -3
  147. package/src/generated/templates/SearchableListBaseTemplate.lit.ts +1 -1
  148. package/src/generated/themes/Breadcrumbs.css.ts +1 -1
  149. package/src/generated/themes/BreadcrumbsPopover.css.ts +1 -1
  150. package/src/generated/themes/FilterMenu.css.ts +1 -1
  151. package/src/generated/themes/ListGroupHeader.css.ts +1 -1
  152. package/src/generated/themes/MastheadCountrySelector.css.ts +1 -1
  153. package/src/generated/themes/MastheadItem.css.ts +1 -1
  154. package/src/generated/themes/MastheadMenu.css.ts +1 -1
  155. package/src/generated/themes/MastheadMenuItem.css.ts +1 -1
  156. package/src/generated/themes/MastheadMobileMenu.css.ts +1 -1
  157. package/src/generated/themes/MastheadProfileMenu.css.ts +1 -1
  158. package/src/generated/themes/RatingIndicator.css.ts +1 -1
  159. package/src/generated/themes/SearchableList.css.ts +1 -1
  160. package/src/generated/themes/SecondaryNavigation.css.ts +1 -1
  161. package/src/generated/themes/SecondaryNavigationItem.css.ts +1 -1
  162. package/src/generated/themes/SelectBase.css.ts +1 -1
  163. package/src/generated/themes/Slider.css.ts +1 -1
  164. package/src/themes/Breadcrumbs.css +17 -2
  165. package/src/themes/BreadcrumbsPopover.css +18 -3
  166. package/src/themes/FilterMenu.css +4 -9
  167. package/src/themes/ListGroupHeader.css +11 -0
  168. package/src/themes/MastheadCountrySelector.css +8 -4
  169. package/src/themes/MastheadItem.css +44 -10
  170. package/src/themes/MastheadMenu.css +6 -5
  171. package/src/themes/MastheadMenuItem.css +16 -8
  172. package/src/themes/MastheadMobileMenu.css +5 -4
  173. package/src/themes/MastheadProfileMenu.css +2 -1
  174. package/src/themes/SearchableList.css +18 -3
  175. package/src/themes/SecondaryNavigation.css +1 -1
  176. package/src/themes/SecondaryNavigationItem.css +5 -2
  177. package/src/themes/SelectBase.css +0 -9
  178. package/src/types/List.ts +2 -0
@@ -162,18 +162,17 @@ describe("Breadcrumbs", () => {
162
162
  });
163
163
 
164
164
  it("wraps each focusable dropdown link in a <li> element", () => {
165
- // Exclude the current-page <li aria-hidden="true"> which holds a <span>, not a link.
166
165
  cy.get("#breadcrumbs").shadow()
167
- .find(".udex-breadcrumbs__popover-content ol > li:not([aria-hidden])")
168
- .each($li => {
169
- cy.wrap($li).find("[udex-link]").should("exist");
166
+ .find("[udex-link].udex-breadcrumbs__item--hidden")
167
+ .each($link => {
168
+ cy.wrap($link).parent("li").should("exist");
170
169
  });
171
170
  });
172
171
 
173
172
  it("wraps the current-page dropdown entry in a <li> with aria-hidden='true'", () => {
174
173
  cy.get("#breadcrumbs").shadow()
175
- .find("li[aria-hidden='true']")
176
174
  .find(".udex-breadcrumbs__item--current")
175
+ .parent("li[aria-hidden='true']")
177
176
  .should("exist");
178
177
  });
179
178
  });
@@ -6,7 +6,7 @@ import { UDExAdditionalTextState, UDExListStyleType } from "../../src/types/List
6
6
  import UDExStatusBadgeValueState from "../../dist/types/StatusBadgeValueState.js";
7
7
  import { UDExDisplayType } from "../../src/RatingIndicator.js";
8
8
 
9
- const defaultListItem = <UDExListItem
9
+ const defaultListItem = <UDExListItem
10
10
  id="listItem"
11
11
  accessibleName="accessible-name"
12
12
  supportingText="Supporting text"
@@ -21,7 +21,7 @@ const defaultListItem = <UDExListItem
21
21
  Default List Item
22
22
  </UDExListItem>
23
23
 
24
- const listItemSuccess = <UDExListItem
24
+ const listItemSuccess = <UDExListItem
25
25
  id="listItemSuccess"
26
26
  accessibleName="accessible-name"
27
27
  supportingText="Supporting text"
@@ -34,7 +34,7 @@ const listItemSuccess = <UDExListItem
34
34
  Default List Item
35
35
  </UDExListItem>
36
36
 
37
- const listItemError = <UDExListItem
37
+ const listItemError = <UDExListItem
38
38
  id="listItemError"
39
39
  accessibleName="accessible-name"
40
40
  supportingText="Supporting text"
@@ -47,7 +47,7 @@ const listItemError = <UDExListItem
47
47
  Default List Item
48
48
  </UDExListItem>
49
49
 
50
- const listItemWarning = <UDExListItem
50
+ const listItemWarning = <UDExListItem
51
51
  id="listItemWarning"
52
52
  accessibleName="accessible-name"
53
53
  supportingText="Supporting text"
@@ -60,7 +60,7 @@ const listItemWarning = <UDExListItem
60
60
  Default List Item
61
61
  </UDExListItem>
62
62
 
63
- const listItemWithIcons = <UDExListItem
63
+ const listItemWithIcons = <UDExListItem
64
64
  id="listItemIcons"
65
65
  accessible-name="accessible-name"
66
66
  supporting-text="Supporting text"
@@ -88,32 +88,36 @@ describe("ListItem", () => {
88
88
  cy.get("[udex-list-item]").should("exist");
89
89
  });
90
90
  });
91
-
91
+
92
92
  describe("Basic attributes", () => {
93
93
  beforeEach(() => {
94
94
  cy.mount(defaultListItem);
95
95
  });
96
-
96
+
97
97
  it("has correct supporting text", () => {
98
98
  cy.get("#listItem").shadow().find(".udex-list__supporting-text").should("have.text", "Supporting text");
99
99
  });
100
-
100
+
101
101
  it("has correct avatar", () => {
102
102
  cy.get("#listItem").shadow().find(".udex-list__avatar").should("exist");
103
103
  });
104
-
104
+
105
105
  it("has avatar of size M", () => {
106
106
  cy.get("#listItem").shadow().find(".udex-list__avatar").should("have.attr", "size", "M");
107
107
  });
108
-
108
+
109
109
  it("has avatar of shape Square", () => {
110
110
  cy.get("#listItem").shadow().find(".udex-list__avatar").should("have.attr", "shape", "Square");
111
111
  });
112
-
112
+
113
113
  it("has avatar with alternative text", () => {
114
114
  cy.get("#listItem").shadow().find(".udex-list__avatar").find("img").should("have.attr", "alt", "Person Avatar");
115
115
  });
116
-
116
+
117
+ it("renders bullet marker at the start of the item", () => {
118
+ cy.get("#listItem").shadow().find(".udex-list__circle").should("exist");
119
+ });
120
+
117
121
  it("has correct accessibleName", () => {
118
122
  cy.get("#listItem").shadow().find(".udex-list__content-wrap").should(($wrapper) => {
119
123
  const itemId = $wrapper.attr("_id");
@@ -130,48 +134,48 @@ describe("ListItem", () => {
130
134
  cy.get("#listItem").shadow().find("udex-status-badge").should("have.attr", "size", UDExAvatarSize.M);
131
135
  });
132
136
  });
133
-
137
+
134
138
  describe("With Icons", () => {
135
139
  beforeEach(() => {
136
140
  cy.mount(listItemWithIcons);
137
141
  });
138
-
142
+
139
143
  it("renders first and second icons when both slots are filled", () => {
140
144
  cy.get("#listItemIcons").find("udex-button").should("have.length", 2);
141
145
  });
142
-
146
+
143
147
  it("becomes selected when clicking", () => {
144
148
  cy.get("#listItemIcons").shadow().find(".udex-list__item").click();
145
149
  cy.get("#listItemIcons").should("have.attr", "selected");
146
150
  });
147
-
151
+
148
152
  it("pressing Enter sets data-selected", () => {
149
153
  cy.realPress("Enter");
150
154
  cy.get("#listItemIcons").shadow().find(".udex-list__item").should("have.attr", "data-selected");
151
155
  });
152
-
156
+
153
157
  it("pressing Space sets data-selected", () => {
154
158
  cy.realPress("Space");
155
159
  cy.get("#listItemIcons").shadow().find(".udex-list__item").should("have.attr", "data-selected");
156
160
  });
157
161
  });
158
-
162
+
159
163
  describe("Additional Text States", () => {
160
164
  it("shows Information state", () => {
161
165
  cy.mount(defaultListItem);
162
166
  cy.get("#listItem").shadow().find(".udex-list__add-text").should("have.css", "color", "rgb(0, 64, 176)");
163
167
  });
164
-
168
+
165
169
  it("shows Success state", () => {
166
170
  cy.mount(listItemSuccess);
167
171
  cy.get("#listItemSuccess").shadow().find(".udex-list__add-text").should("have.css", "color", "rgb(30, 89, 47)");
168
172
  });
169
-
173
+
170
174
  it("shows Error state", () => {
171
175
  cy.mount(listItemError);
172
176
  cy.get("#listItemError").shadow().find(".udex-list__add-text").should("have.css", "color", "rgb(132, 6, 6)");
173
177
  });
174
-
178
+
175
179
  it("shows Warning state", () => {
176
180
  cy.mount(listItemWarning);
177
181
  cy.get("#listItemWarning").shadow().find(".udex-list__add-text").should("have.css", "color", "rgb(141, 42, 0)");
@@ -495,6 +495,87 @@ describe("UDExMastheadMenu — 3rd-level navigation (sub-items)", () => {
495
495
  });
496
496
  });
497
497
 
498
+ // Added: verifies focusInnerElement is used for Home/End/Tab navigation within the menu
499
+ describe("Keyboard navigation (Home/End/Tab focus inner element)", () => {
500
+ beforeEach(() => {
501
+ cy.mount(
502
+ <UDExMastheadMenu
503
+ id="menu-keyboard"
504
+ subItems={JSON.stringify(itemsWithSubItems)}
505
+ />
506
+ );
507
+ cy.get("[udex-masthead-menu]").shadow().as("shadow");
508
+ });
509
+
510
+ it("Home key focuses the inner element of the first menu item", () => {
511
+ // Focus the last link, then press Home — should move focus to the inner element of the first link
512
+ cy.get("@shadow")
513
+ .find("[udex-masthead-menu-item][url]")
514
+ .last()
515
+ .shadow()
516
+ .find(".udex-masthead-menu-item")
517
+ .focus();
518
+ cy.realPress("Home");
519
+ cy.get("@shadow")
520
+ .find("[udex-masthead-menu-item][url]")
521
+ .first()
522
+ .shadow()
523
+ .find(".udex-masthead-menu-item")
524
+ .should("be.focused");
525
+ });
526
+
527
+ it("End key focuses the inner element of the last menu item", () => {
528
+ // Focus the first link, then press End — should move focus to the inner element of the last link
529
+ cy.get("@shadow")
530
+ .find("[udex-masthead-menu-item][url]")
531
+ .first()
532
+ .shadow()
533
+ .find(".udex-masthead-menu-item")
534
+ .focus();
535
+ cy.realPress("End");
536
+ cy.get("@shadow")
537
+ .find("[udex-masthead-menu-item][url]")
538
+ .last()
539
+ .shadow()
540
+ .find(".udex-masthead-menu-item")
541
+ .should("be.focused");
542
+ });
543
+
544
+ it("Shift+Tab focuses the inner element of the previous menu item", () => {
545
+ // Focus the second link, then press Shift+Tab — should focus the inner element of the first link
546
+ cy.get("@shadow")
547
+ .find("[udex-masthead-menu-item][url]")
548
+ .eq(1)
549
+ .shadow()
550
+ .find(".udex-masthead-menu-item")
551
+ .focus();
552
+ cy.realPress(["Shift", "Tab"]);
553
+ cy.get("@shadow")
554
+ .find("[udex-masthead-menu-item][url]")
555
+ .first()
556
+ .shadow()
557
+ .find(".udex-masthead-menu-item")
558
+ .should("be.focused");
559
+ });
560
+
561
+ it("Tab focuses the inner element of the next menu item", () => {
562
+ // Focus the first link, then press Tab — should focus the inner element of the second link
563
+ cy.get("@shadow")
564
+ .find("[udex-masthead-menu-item][url]")
565
+ .first()
566
+ .shadow()
567
+ .find(".udex-masthead-menu-item")
568
+ .focus();
569
+ cy.realPress("Tab");
570
+ cy.get("@shadow")
571
+ .find("[udex-masthead-menu-item][url]")
572
+ .eq(1)
573
+ .shadow()
574
+ .find(".udex-masthead-menu-item")
575
+ .should("be.focused");
576
+ });
577
+ });
578
+
498
579
  describe("Mixed linked and non-linked sub-categories in the same list", () => {
499
580
  beforeEach(() => {
500
581
  cy.mount(
@@ -407,6 +407,85 @@ describe("MastheadShell Default component", () => {
407
407
  cy.realPress(["Shift", "Tab"]);
408
408
  cy.get("#support-item").should("be.focused");
409
409
  });
410
+
411
+ // Added: verifies Safari Tab-into-dropdown fix — when dropdown is open, Tab moves focus into the first menu item
412
+ it("Tab moves focus into the first dropdown menu item when dropdown is open", () => {
413
+ cy.get("#product-item").realClick();
414
+ cy.get("#product-item").shadow().find(".udex-masthead-item__dropdown").should("be.visible");
415
+ cy.realPress("Tab");
416
+ cy.get("#product-menu")
417
+ .shadow()
418
+ .find("[udex-masthead-menu-item]")
419
+ .first()
420
+ .shadow()
421
+ .find(".udex-masthead-menu-item")
422
+ .should("be.focused");
423
+ });
424
+
425
+ // Updated: unified handleKeyDown uses composedPath() guard to let Tab within dropdown advance normally
426
+ it("Tab on first dropdown item moves focus to second item, not back to first", () => {
427
+ cy.get("#product-item").realClick();
428
+ cy.get("#product-item").shadow().find(".udex-masthead-item__dropdown").should("be.visible");
429
+ // Tab into the dropdown — focuses first item
430
+ cy.realPress("Tab");
431
+ cy.get("#product-menu")
432
+ .shadow()
433
+ .find("[udex-masthead-menu-item]")
434
+ .first()
435
+ .shadow()
436
+ .find(".udex-masthead-menu-item")
437
+ .should("be.focused");
438
+ // Tab again — should advance to second item (not reset to first)
439
+ cy.realPress("Tab");
440
+ cy.get("#product-menu")
441
+ .shadow()
442
+ .find("[udex-masthead-menu-item]")
443
+ .eq(1)
444
+ .shadow()
445
+ .find(".udex-masthead-menu-item")
446
+ .should("be.focused");
447
+ });
448
+
449
+ // Added: verifies Tab on last dropdown item exits dropdown instead of looping back to first item
450
+ it("Tab on last dropdown item exits dropdown and moves focus to the next top-level menu item", () => {
451
+ cy.get("#product-item").realClick();
452
+ cy.get("#product-item").shadow().find(".udex-masthead-item__dropdown").should("be.visible");
453
+
454
+ // Focus the last focusable menu item in the dropdown (items with url only)
455
+ cy.get("#product-menu")
456
+ .shadow()
457
+ .find("[udex-masthead-menu-item]")
458
+ .filter((_, el) => !!el.getAttribute("url"))
459
+ .last()
460
+ .shadow()
461
+ .find(".udex-masthead-menu-item")
462
+ .focus();
463
+
464
+ // Verify we are on the last item before pressing Tab
465
+ cy.get("#product-menu")
466
+ .shadow()
467
+ .find("[udex-masthead-menu-item]")
468
+ .filter((_, el) => !!el.getAttribute("url"))
469
+ .last()
470
+ .shadow()
471
+ .find(".udex-masthead-menu-item")
472
+ .should("be.focused");
473
+
474
+ // Tab should exit the dropdown — NOT loop back to the first item
475
+ cy.realPress("Tab");
476
+
477
+ // The first dropdown item should NOT be focused (no looping)
478
+ cy.get("#product-menu")
479
+ .shadow()
480
+ .find("[udex-masthead-menu-item]")
481
+ .first()
482
+ .shadow()
483
+ .find(".udex-masthead-menu-item")
484
+ .should("not.be.focused");
485
+
486
+ // The dropdown should close because focus left the masthead item
487
+ cy.get("#product-item").shadow().find(".udex-masthead-item__dropdown").should("not.exist");
488
+ });
410
489
  });
411
490
 
412
491
  describe("Component events", () => {
@@ -329,6 +329,20 @@ describe("Desktop", () => {
329
329
  .its("lastCall.args.0.detail").should("not.have.property", "isMore");
330
330
  });
331
331
 
332
+ it("sets CSS variable when dropdown opens on desktop", () => {
333
+ cy.get("#secondary-nav").shadow().find("udex-secondary-navigation-item").first().click()
334
+ .shadow().find(".udex-secondary-navigation__dropdown").should("be.visible");
335
+
336
+ cy.get("#secondary-nav").shadow().find("udex-secondary-navigation-item").first()
337
+ .then($item => {
338
+ const item = $item[0] as HTMLElement;
339
+ const dropdown = item.shadowRoot!.querySelector<HTMLElement>(".udex-secondary-navigation__dropdown")!;
340
+ const { top } = dropdown.getBoundingClientRect();
341
+ const expected = `${window.innerHeight - top - 24}px`;
342
+ expect(item.style.getPropertyValue("--udex-secondary-navigation-item-dropdown-desktop-max-height")).to.eq(expected);
343
+ });
344
+ });
345
+
332
346
  describe("Keyboard Navigation (Disclosure pattern)", () => {
333
347
  it("Tab key moves focus to the next top-level item", () => {
334
348
  cy.get("#secondary-nav").shadow().find("udex-secondary-navigation-item").eq(2)
@@ -1,4 +1,4 @@
1
- import { UDExSelectBox, UDExSelectBoxSelectAll, UDExSelectBoxGroupHeader, UDExSelectBoxItem, UDExButton } from "../support/component-imports.js";
1
+ import { UDExSelectBox, UDExSelectBoxSelectAll, UDExSelectBoxGroupHeader, UDExSelectBoxItem, UDExButton, UDExModal } from "../support/component-imports.js";
2
2
  import { UDExListMode } from "../../src/types/List.js";
3
3
 
4
4
  const selectBoxWithRating = <div style="width: 350px; position:relative;"><UDExSelectBox
@@ -115,6 +115,14 @@ const shortComponent = <div style="width: 350px; position:relative;"><UDExSelect
115
115
  <UDExSelectBoxItem label="Perl"></UDExSelectBoxItem>
116
116
  </UDExSelectBox></div>
117
117
 
118
+ const singleSelectWithRating = <div style="width: 350px; position:relative;"><UDExSelectBox
119
+ id="select-box"
120
+ label="Rating">
121
+ <UDExSelectBoxItem rating="5" ratingCount="5.0" totalCount="23"></UDExSelectBoxItem>
122
+ <UDExSelectBoxItem rating="4" ratingCount="4.0" totalCount="17"></UDExSelectBoxItem>
123
+ <UDExSelectBoxItem rating="3" ratingCount="3.0" totalCount="34"></UDExSelectBoxItem>
124
+ </UDExSelectBox></div>
125
+
118
126
  const groupHeader = <div style="width: 350px; position:relative;"><UDExSelectBox
119
127
  id="select-box"
120
128
  mode={UDExListMode.MultiSelect}
@@ -139,6 +147,18 @@ const selectAll = <div style="width: 350px; position:relative;">
139
147
  <a id="next-focus" href="#">Next focusable element</a>
140
148
  </div>
141
149
 
150
+ const selectBoxInsideModal = <div style="width: 500px; position:relative;">
151
+ <UDExModal id="test-modal" open header-text="Test Modal">
152
+ <UDExSelectBox
153
+ id="select-box-in-modal"
154
+ label="Programming languages">
155
+ <UDExSelectBoxItem label="JavaScript"></UDExSelectBoxItem>
156
+ <UDExSelectBoxItem label="Python"></UDExSelectBoxItem>
157
+ <UDExSelectBoxItem label="Java"></UDExSelectBoxItem>
158
+ </UDExSelectBox>
159
+ </UDExModal>
160
+ </div>
161
+
142
162
  describe("SelectBox", () => {
143
163
  it("tests if web component is correctly rendered", () => {
144
164
  cy.mount(<UDExSelectBox></UDExSelectBox>);
@@ -1125,6 +1145,54 @@ describe("SelectBox", () => {
1125
1145
  .should("exist");
1126
1146
  });
1127
1147
 
1148
+ it("MultiSelect mode - selected rating item tag shows rating value with 'stars' text", () => {
1149
+ cy.mount(selectBoxWithRating);
1150
+ cy.get("#select-box").shadow().find(".udex-text-field__trigger").click();
1151
+
1152
+ cy.get("#select-box").shadow().find("udex-list-item").eq(0).click();
1153
+
1154
+ cy.get("#select-box").shadow()
1155
+ .find("udex-tag-group").shadow()
1156
+ .find("udex-tag")
1157
+ .first()
1158
+ .should("have.attr", "text", "5 stars");
1159
+ });
1160
+
1161
+ it("MultiSelect mode - no single-label shown after opening dropdown and clicking outside", () => {
1162
+ cy.mount(selectBoxWithRating);
1163
+ cy.get("#select-box").shadow().find(".udex-text-field__trigger").click();
1164
+
1165
+ cy.get("#select-box").shadow()
1166
+ .find(".udex-select-box__dropdown")
1167
+ .should("have.attr", "open");
1168
+
1169
+ cy.get("body").realClick();
1170
+
1171
+ cy.get("#select-box").shadow()
1172
+ .find(".udex-text-field__single-label")
1173
+ .should("not.exist");
1174
+ });
1175
+
1176
+ it("no single-label shown after opening dropdown and clicking outside", () => {
1177
+ cy.mount(singleSelectWithRating);
1178
+ cy.get("#select-box").shadow().find(".udex-text-field__trigger").click();
1179
+ cy.get("body").realClick();
1180
+
1181
+ cy.get("#select-box").shadow()
1182
+ .find(".udex-text-field__single-label")
1183
+ .should("not.exist");
1184
+ });
1185
+
1186
+ it("shows ratingCount with 'stars' as the label when item has no text label", () => {
1187
+ cy.mount(singleSelectWithRating);
1188
+ cy.get("#select-box").shadow().find(".udex-text-field__trigger").click();
1189
+ cy.get("#select-box").shadow().find("udex-list-item").eq(0).click();
1190
+
1191
+ cy.get("#select-box").shadow()
1192
+ .find(".udex-text-field__single-label")
1193
+ .should("have.text", "5.0 stars");
1194
+ });
1195
+
1128
1196
  it("filters rating items by ratingCount when searching", () => {
1129
1197
  cy.mount(selectBoxWithRating);
1130
1198
  cy.get("#select-box").shadow().find(".udex-text-field__search").click();
@@ -1134,4 +1202,101 @@ describe("SelectBox", () => {
1134
1202
  .should("have.length", 1);
1135
1203
  });
1136
1204
  });
1205
+
1206
+ describe("SelectBox inside Modal - Escape key propagation", () => {
1207
+ it("pressing Escape closes only the SelectBox dropdown, not the parent Modal", () => {
1208
+ cy.mount(selectBoxInsideModal);
1209
+
1210
+ // Wait for Modal to be rendered and open
1211
+ cy.get("#test-modal").should("have.attr", "open");
1212
+
1213
+ // Open the SelectBox dropdown by clicking the trigger
1214
+ cy.get("#select-box-in-modal").shadow()
1215
+ .find(".udex-text-field__trigger")
1216
+ .click();
1217
+
1218
+ // Verify the dropdown is open
1219
+ cy.get("#select-box-in-modal").shadow()
1220
+ .find(".udex-select-box__dropdown")
1221
+ .should("have.attr", "open");
1222
+
1223
+ // Press Escape to close the dropdown
1224
+ cy.get("#select-box-in-modal").shadow()
1225
+ .find(".udex-text-field__search")
1226
+ .realPress("Escape");
1227
+
1228
+ // Assert the SelectBox dropdown is closed
1229
+ cy.get("#select-box-in-modal").shadow()
1230
+ .find(".udex-select-box__dropdown")
1231
+ .should("not.have.attr", "open");
1232
+
1233
+ // Assert the Modal is still open (Escape did not propagate to close it)
1234
+ cy.get("#test-modal").should("have.attr", "open");
1235
+ });
1236
+
1237
+ it("pressing Escape while navigating dropdown list items closes dropdown, not Modal", () => {
1238
+ cy.mount(selectBoxInsideModal);
1239
+
1240
+ cy.get("#test-modal").should("have.attr", "open");
1241
+
1242
+ // Open dropdown and navigate into list items using keyboard
1243
+ cy.get("#select-box-in-modal").shadow()
1244
+ .find(".udex-text-field__search")
1245
+ .click()
1246
+ .realPress("ArrowDown");
1247
+
1248
+ // Verify the dropdown is open
1249
+ cy.get("#select-box-in-modal").shadow()
1250
+ .find(".udex-select-box__dropdown")
1251
+ .should("have.attr", "open");
1252
+
1253
+ // Press Escape while focus is on a list item
1254
+ cy.realPress("Escape");
1255
+
1256
+ // Assert the SelectBox dropdown is closed
1257
+ cy.get("#select-box-in-modal").shadow()
1258
+ .find(".udex-select-box__dropdown")
1259
+ .should("not.have.attr", "open");
1260
+
1261
+ // Assert the Modal is still open
1262
+ cy.get("#test-modal").should("have.attr", "open");
1263
+ });
1264
+
1265
+ // Updated: covers fix where Escape on search input with dropdown closed now propagates to parent Modal
1266
+ it("pressing Escape with dropdown closed propagates to close the parent Modal", () => {
1267
+ cy.mount(selectBoxInsideModal);
1268
+
1269
+ // Wait for Modal to be rendered and open
1270
+ cy.get("#test-modal").should("have.attr", "open");
1271
+
1272
+ // Focus the search input without opening the dropdown
1273
+ cy.get("#select-box-in-modal").shadow()
1274
+ .find(".udex-text-field__search")
1275
+ .click();
1276
+
1277
+ // Close the dropdown if it opened from the click
1278
+ cy.get("#select-box-in-modal").then($el => {
1279
+ const selectBox = $el[0] as any;
1280
+ selectBox.close();
1281
+ });
1282
+
1283
+ // Verify the dropdown is closed
1284
+ cy.get("#select-box-in-modal").shadow()
1285
+ .find(".udex-select-box__dropdown")
1286
+ .should("not.have.attr", "open");
1287
+
1288
+ // Re-focus the search input (close() may have shifted focus)
1289
+ cy.get("#select-box-in-modal").shadow()
1290
+ .find(".udex-text-field__search")
1291
+ .focus();
1292
+
1293
+ // Press Escape while focused on the search input with dropdown closed
1294
+ cy.get("#select-box-in-modal").shadow()
1295
+ .find(".udex-text-field__search")
1296
+ .realPress("Escape");
1297
+
1298
+ // Assert the Modal is closed (Escape propagated up to the Dialog handler)
1299
+ cy.get("#test-modal").should("not.have.attr", "open");
1300
+ });
1301
+ });
1137
1302
  });
@@ -77,4 +77,10 @@ describe("Wizard", () => {
77
77
  cy.get("#wizard").shadow().find("udex-wizard-tab").first()
78
78
  .shadow().find(".ui5-wiz-step-root").should("have.attr", "aria-label", "Step Access SAP Account 1 Step 1")
79
79
  });
80
+
81
+ it("mounts without throwing when no steps are slotted (dynamic rendering)", () => {
82
+ cy.mount(<UDExWizard id="empty-wizard"></UDExWizard>);
83
+ cy.get("#empty-wizard").should("exist");
84
+ cy.get("#empty-wizard").shadow().find(".ui5-wiz-nav").should("exist");
85
+ });
80
86
  });
@@ -40,6 +40,7 @@ import UDExMastheadMobileMenu from "../../instrumented/MastheadMobileMenu.js";
40
40
  import UDExMastheadProfileMenu from "../../instrumented/MastheadProfileMenu.js";
41
41
  import UDExMastheadShell from "../../instrumented/MastheadShell.js";
42
42
  import UDExMessageStrip from "../../instrumented/MessageStrip.js";
43
+ import UDExModal from "../../instrumented/Modal.js";
43
44
  import UDExSearch from "../../instrumented/Search.js";
44
45
  import UDExMediaPlayer from "../../instrumented/MediaPlayer.js";
45
46
  import UDExPasswordField from "../../instrumented/PasswordField.js";
@@ -124,6 +125,7 @@ export {
124
125
  UDExMastheadProfileMenu,
125
126
  UDExMastheadShell,
126
127
  UDExMessageStrip,
128
+ UDExModal,
127
129
  UDExMediaPlayer,
128
130
  UDExSearch,
129
131
  UDExPasswordField,
@@ -40,6 +40,7 @@ import UDExMastheadMobileMenu from "../../src/MastheadMobileMenu.js";
40
40
  import UDExMastheadProfileMenu from "../../src/MastheadProfileMenu.js";
41
41
  import UDExMastheadShell from "../../src/MastheadShell.js";
42
42
  import UDExMessageStrip from "../../src/MessageStrip.js";
43
+ import UDExModal from "../../src/Modal.js";
43
44
  import UDExSearch from "../../src/Search.js";
44
45
  import UDExMediaPlayer from "../../src/MediaPlayer.js";
45
46
  import UDExPasswordField from "../../src/PasswordField.js";
@@ -124,6 +125,7 @@ export {
124
125
  UDExMastheadProfileMenu,
125
126
  UDExMastheadShell,
126
127
  UDExMessageStrip,
128
+ UDExModal,
127
129
  UDExMediaPlayer,
128
130
  UDExSearch,
129
131
  UDExPasswordField,
@@ -11,7 +11,7 @@ export default function BreadcrumbsPopoverTemplate() {
11
11
  focusablePos++;
12
12
  }
13
13
  const posLabel = `${item.accessibleName || item.textContent || ""}, ${focusablePos} ${ofText} ${focusableCount}`;
14
- return item._isCurrentPageItem ? (_jsx("li", { "aria-hidden": "true", children: _jsx("span", { id: `${item._id}-li`, className: `${this._rootClass}__item ${this._rootClass}__item--current ${this._rootClass}__item--hidden ${this._rootClass}__item--${index}`, "aria-current": "page", "accessible-name": item.accessibleName, "data-ui5-stable": item.stableDomRef, children: item.textContent }) }, index)) : (_jsx("li", { children: item.icon ? (_jsx(UDExLink, { "data-index": index, id: `${item._id}-li`, onClick: this._onDropdownLinkPress, href: item.href, target: item.target, class: `${this._rootClass}__item ${this._rootClass}__item--with-icon ${this._rootClass}__item--hidden ${this._rootClass}__item--${index}`, icon: item.icon, accessibleName: posLabel, "data-ui5-stable": item.stableDomRef, children: item.textContent })) : (_jsx(UDExLink, { "data-index": index, id: `${item._id}-li`, onClick: this._onDropdownLinkPress, href: item.href, target: item.target, class: `${this._rootClass}__item ${this._rootClass}__item--hidden ${this._rootClass}__item--${index}`, accessibleName: posLabel, "data-ui5-stable": item.stableDomRef, children: item.textContent })) }, index));
14
+ return item._isCurrentPageItem ? (_jsx("li", { children: _jsx("span", { id: `${item._id}-li`, className: `${this._rootClass}__item ${this._rootClass}__item--current ${this._rootClass}__item--hidden ${this._rootClass}__item--${index}`, "aria-current": "page", "accessible-name": item.accessibleName, "data-ui5-stable": item.stableDomRef, children: item.textContent }) }, index)) : (_jsx("li", { children: item.icon ? (_jsx(UDExLink, { "data-index": index, id: `${item._id}-li`, onClick: this._onDropdownLinkPress, href: item.href, target: item.target, class: `${this._rootClass}__item ${this._rootClass}__item--with-icon ${this._rootClass}__item--hidden ${this._rootClass}__item--${index}`, icon: item.icon, accessibleName: posLabel, "data-ui5-stable": item.stableDomRef, children: item.textContent })) : (_jsx(UDExLink, { "data-index": index, id: `${item._id}-li`, onClick: this._onDropdownLinkPress, href: item.href, target: item.target, class: `${this._rootClass}__item ${this._rootClass}__item--hidden ${this._rootClass}__item--${index}`, accessibleName: posLabel, "data-ui5-stable": item.stableDomRef, children: item.textContent })) }, index));
15
15
  }) }) }) }));
16
16
  }
17
17
  //# sourceMappingURL=BreadcrumbsPopoverTemplate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BreadcrumbsPopoverTemplate.js","sourceRoot":"","sources":["../src/BreadcrumbsPopoverTemplate.tsx"],"names":[],"mappings":"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","sourcesContent":["import type Breadcrumbs from \"./Breadcrumbs.js\";\nimport UDExDropdown from \"./Dropdown.js\";\nimport UDExLink from \"./Link.js\";\nimport { Placement, HorizontalAlign } from \"./types/Dropdown.js\";\n\nexport default function BreadcrumbsPopoverTemplate(this: Breadcrumbs) {\n const focusableCount = this._dropdownItems.filter(i => !i._isCurrentPageItem).length;\n const ofText = this._ofText;\n let focusablePos = 0;\n\n return (\n <UDExDropdown\n id={`udex-${this._id}-breadcrumbs__popover`}\n opener={`udex-${this._id}-breadcrumbs__opener`}\n class={`${this._rootClass}__popover ui5-breadcrumbs-popover`}\n accessibleName={this._dropdownAccessibleNameText}\n placement={Placement.Bottom}\n horizontalAlign={HorizontalAlign.Start}\n onKeyDown={this._handleKeydown}\n onClose={this._afterDropdownClose}\n onOpen={this._afterDropdownOpen}>\n <nav className={`${this._rootClass}__popover-content`} aria-label={this._breadcrumbsAccessibleNameText}>\n <ol>\n {this._dropdownItems.map((item, index) => {\n if (!item._isCurrentPageItem) { focusablePos++; }\n const posLabel = `${item.accessibleName || item.textContent || \"\"}, ${focusablePos} ${ofText} ${focusableCount}`;\n return item._isCurrentPageItem ? (\n <li key={index} aria-hidden=\"true\">\n <span\n id={`${item._id}-li`}\n className={`${this._rootClass}__item ${this._rootClass}__item--current ${this._rootClass}__item--hidden ${this._rootClass}__item--${index}`}\n aria-current=\"page\"\n accessible-name={item.accessibleName}\n data-ui5-stable={item.stableDomRef}>\n {item.textContent}\n </span>\n </li>\n ) : (\n <li key={index}>\n {item.icon ? (\n <UDExLink\n data-index={index}\n id={`${item._id}-li`}\n onClick={this._onDropdownLinkPress}\n href={item.href}\n target={item.target}\n class={`${this._rootClass}__item ${this._rootClass}__item--with-icon ${this._rootClass}__item--hidden ${this._rootClass}__item--${index}`}\n icon={item.icon}\n accessibleName={posLabel}\n data-ui5-stable={item.stableDomRef}>\n {item.textContent}\n </UDExLink>\n ) : (\n <UDExLink\n data-index={index}\n id={`${item._id}-li`}\n onClick={this._onDropdownLinkPress}\n href={item.href}\n target={item.target}\n class={`${this._rootClass}__item ${this._rootClass}__item--hidden ${this._rootClass}__item--${index}`}\n accessibleName={posLabel}\n data-ui5-stable={item.stableDomRef}>\n {item.textContent}\n </UDExLink>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n </UDExDropdown>\n );\n}\n"]}
1
+ {"version":3,"file":"BreadcrumbsPopoverTemplate.js","sourceRoot":"","sources":["../src/BreadcrumbsPopoverTemplate.tsx"],"names":[],"mappings":"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","sourcesContent":["import type Breadcrumbs from \"./Breadcrumbs.js\";\nimport UDExDropdown from \"./Dropdown.js\";\nimport UDExLink from \"./Link.js\";\nimport { Placement, HorizontalAlign } from \"./types/Dropdown.js\";\n\nexport default function BreadcrumbsPopoverTemplate(this: Breadcrumbs) {\n const focusableCount = this._dropdownItems.filter(i => !i._isCurrentPageItem).length;\n const ofText = this._ofText;\n let focusablePos = 0;\n\n return (\n <UDExDropdown\n id={`udex-${this._id}-breadcrumbs__popover`}\n opener={`udex-${this._id}-breadcrumbs__opener`}\n class={`${this._rootClass}__popover ui5-breadcrumbs-popover`}\n accessibleName={this._dropdownAccessibleNameText}\n placement={Placement.Bottom}\n horizontalAlign={HorizontalAlign.Start}\n onKeyDown={this._handleKeydown}\n onClose={this._afterDropdownClose}\n onOpen={this._afterDropdownOpen}>\n <nav className={`${this._rootClass}__popover-content`} aria-label={this._breadcrumbsAccessibleNameText}>\n <ol>\n {this._dropdownItems.map((item, index) => {\n if (!item._isCurrentPageItem) { focusablePos++; }\n const posLabel = `${item.accessibleName || item.textContent || \"\"}, ${focusablePos} ${ofText} ${focusableCount}`;\n return item._isCurrentPageItem ? (\n <li key={index}>\n <span\n id={`${item._id}-li`}\n className={`${this._rootClass}__item ${this._rootClass}__item--current ${this._rootClass}__item--hidden ${this._rootClass}__item--${index}`}\n aria-current=\"page\"\n accessible-name={item.accessibleName}\n data-ui5-stable={item.stableDomRef}>\n {item.textContent}\n </span>\n </li>\n ) : (\n <li key={index}>\n {item.icon ? (\n <UDExLink\n data-index={index}\n id={`${item._id}-li`}\n onClick={this._onDropdownLinkPress}\n href={item.href}\n target={item.target}\n class={`${this._rootClass}__item ${this._rootClass}__item--with-icon ${this._rootClass}__item--hidden ${this._rootClass}__item--${index}`}\n icon={item.icon}\n accessibleName={posLabel}\n data-ui5-stable={item.stableDomRef}>\n {item.textContent}\n </UDExLink>\n ) : (\n <UDExLink\n data-index={index}\n id={`${item._id}-li`}\n onClick={this._onDropdownLinkPress}\n href={item.href}\n target={item.target}\n class={`${this._rootClass}__item ${this._rootClass}__item--hidden ${this._rootClass}__item--${index}`}\n accessibleName={posLabel}\n data-ui5-stable={item.stableDomRef}>\n {item.textContent}\n </UDExLink>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n </UDExDropdown>\n );\n}\n"]}