@sapudex/web-components 2.26.0 → 2.27.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 (42) hide show
  1. package/cypress/specs/TabNavigation.cy.tsx +1024 -0
  2. package/cypress/support/component-imports.src.ts +4 -0
  3. package/dist/Tab.d.ts +57 -0
  4. package/dist/Tab.js +67 -0
  5. package/dist/Tab.js.map +1 -1
  6. package/dist/TabNavigation.d.ts +25 -3
  7. package/dist/TabNavigation.js +96 -18
  8. package/dist/TabNavigation.js.map +1 -1
  9. package/dist/assets/{InputSuggestions-CG5owMFQ.js → InputSuggestions-Bm_0fOBQ.js} +1 -1
  10. package/dist/assets/{ListItemStandardExpandableTextTemplate-DpVr7qdn.js → ListItemStandardExpandableTextTemplate-CHXlUP-E.js} +1 -1
  11. package/dist/assets/{bundle.esm-CTkLMr6f.js → bundle.esm-D_SXCGNu.js} +218 -218
  12. package/dist/css/themes/RatingIndicator.css +1 -1
  13. package/dist/css/themes/Slider.css +1 -1
  14. package/dist/css/themes/TabNavigation.css +1 -1
  15. package/dist/custom-elements-internal.json +205 -154
  16. package/dist/custom-elements.json +186 -139
  17. package/dist/generated/templates/TabHeaderTemplate.lit.js +30 -11
  18. package/dist/generated/templates/TabHeaderTemplate.lit.js.map +1 -1
  19. package/dist/generated/templates/TabNavigationTemplate.lit.js +8 -6
  20. package/dist/generated/templates/TabNavigationTemplate.lit.js.map +1 -1
  21. package/dist/generated/themes/RatingIndicator.css.d.ts +1 -1
  22. package/dist/generated/themes/RatingIndicator.css.js +1 -1
  23. package/dist/generated/themes/RatingIndicator.css.js.map +1 -1
  24. package/dist/generated/themes/Slider.css.d.ts +1 -1
  25. package/dist/generated/themes/Slider.css.js +1 -1
  26. package/dist/generated/themes/Slider.css.js.map +1 -1
  27. package/dist/generated/themes/TabNavigation.css.d.ts +1 -1
  28. package/dist/generated/themes/TabNavigation.css.js +1 -1
  29. package/dist/generated/themes/TabNavigation.css.js.map +1 -1
  30. package/dist/vscode.html-custom-data.json +11 -1
  31. package/dist/web-types.json +29 -2
  32. package/package.json +1 -1
  33. package/src/Tab.ts +98 -0
  34. package/src/TabHeader.hbs +85 -33
  35. package/src/TabNavigation.hbs +16 -0
  36. package/src/TabNavigation.ts +109 -21
  37. package/src/generated/templates/TabHeaderTemplate.lit.ts +29 -10
  38. package/src/generated/templates/TabNavigationTemplate.lit.ts +8 -6
  39. package/src/generated/themes/RatingIndicator.css.ts +1 -1
  40. package/src/generated/themes/Slider.css.ts +1 -1
  41. package/src/generated/themes/TabNavigation.css.ts +1 -1
  42. package/src/themes/TabNavigation.css +203 -1
@@ -52,6 +52,8 @@ import UDExSocialMediaButton from "../../src/SocialMediaButton.js";
52
52
  import UDExStatusBadge from "../../src/StatusBadge.js";
53
53
  import UDExStatusMessage from "../../src/StatusMessage.js";
54
54
  import UDExSwitch from "../../src/Switch.js";
55
+ import UDExTab from "../../src/Tab.js";
56
+ import UDExTabNavigation from "../../src/TabNavigation.js";
55
57
  import UDExTable from "../../src/Table.js";
56
58
  import UDExTableCell from "../../src/TableCell.js";
57
59
  import UDExTableGroupRow from "../../src/TableGroupRow.js";
@@ -125,6 +127,8 @@ export {
125
127
  UDExStatusBadge,
126
128
  UDExStatusMessage,
127
129
  UDExSwitch,
130
+ UDExTab,
131
+ UDExTabNavigation,
128
132
  UDExTable,
129
133
  UDExTableCell,
130
134
  UDExTableGroupRow,
package/dist/Tab.d.ts CHANGED
@@ -10,14 +10,18 @@ export interface ITab extends UI5Element {
10
10
  selected?: boolean;
11
11
  numberBadge?: string;
12
12
  text?: string;
13
+ bodyText?: string;
13
14
  showAttentionBadge?: boolean;
14
15
  accessibleName?: string;
15
16
  href?: string;
16
17
  content?: Array<Node>;
18
+ link?: Array<HTMLElement>;
17
19
  hasIcon: boolean;
20
+ isMobile: boolean;
18
21
  isOnSelectedTab: boolean;
19
22
  hasNotIcon: boolean;
20
23
  hasNotHref: boolean;
24
+ hasLinkSlot: boolean;
21
25
  selectedClass: string;
22
26
  tabNavigation: any;
23
27
  _individualSlot: string;
@@ -25,6 +29,8 @@ export interface ITab extends UI5Element {
25
29
  _slotName: string;
26
30
  _selected?: boolean;
27
31
  _tabIndex: string;
32
+ _isMobile: boolean;
33
+ _isVertical: boolean;
28
34
  _iconWithoutBackground: boolean;
29
35
  _posinset?: number;
30
36
  _setsize?: number;
@@ -65,6 +71,13 @@ declare class UDExTab extends UI5Element implements ITab {
65
71
  * @public
66
72
  */
67
73
  text: string;
74
+ /**
75
+ * Defines the body text (supplementary description) of the tab.
76
+ * Optional text to provide additional context or explanation.
77
+ *
78
+ * @public
79
+ */
80
+ bodyText?: string;
68
81
  /**
69
82
  * Accessible name for tab.
70
83
  *
@@ -123,6 +136,26 @@ declare class UDExTab extends UI5Element implements ITab {
123
136
  * @default false
124
137
  */
125
138
  _tabIndex: string;
139
+ /**
140
+ * Defines if the viewport is mobile size.
141
+ *
142
+ * @private
143
+ * @default false
144
+ */
145
+ _isMobile: boolean;
146
+ /**
147
+ * Defines if the tab navigation is in vertical orientation.
148
+ *
149
+ * @private
150
+ * @default false
151
+ */
152
+ _isVertical: boolean;
153
+ /**
154
+ * Defines the width of the tab.
155
+ *
156
+ * @private
157
+ */
158
+ _width?: string;
126
159
  /**
127
160
  * Defines the background color of the component.
128
161
  *
@@ -137,6 +170,14 @@ declare class UDExTab extends UI5Element implements ITab {
137
170
  * @public
138
171
  */
139
172
  content: Array<Node>;
173
+ /**
174
+ * Defines the link(s) to be displayed in the tab header (vertical orientation only).
175
+ * Use this slot to add one or more udex-link elements to the tab button.
176
+ *
177
+ * @slot link
178
+ * @public
179
+ */
180
+ link: Array<HTMLElement>;
140
181
  static i18nBundle: I18nBundle;
141
182
  getElementInHeader?: () => ITab | null;
142
183
  _individualSlot: string;
@@ -146,8 +187,23 @@ declare class UDExTab extends UI5Element implements ITab {
146
187
  get hasIcon(): boolean;
147
188
  get classWithIcon(): string;
148
189
  get buttonClassWithIcon(): string;
190
+ get isMobile(): boolean;
191
+ get isMobileVertical(): boolean;
149
192
  get hasNotIcon(): boolean;
150
193
  get hasNotHref(): boolean;
194
+ get hasBodyText(): boolean;
195
+ /**
196
+ * Returns true if aria-describedby should point to bodyText.
197
+ * Only applies to selected tabs with bodyText in vertical orientation.
198
+ */
199
+ get ariaDescribedByBodyText(): boolean;
200
+ get hasLinkSlot(): boolean;
201
+ /**
202
+ * Returns the HTML content of the link slot elements.
203
+ * This is used to render the links in the TabHeader template.
204
+ */
205
+ get linkSlotHtml(): string;
206
+ get hasBodyTextOrLink(): boolean;
151
207
  get effectiveSelected(): boolean;
152
208
  get selectedClass(): string;
153
209
  get classWithIconWithoutBackground(): string;
@@ -155,6 +211,7 @@ declare class UDExTab extends UI5Element implements ITab {
155
211
  get ariaLabelledBy(): string;
156
212
  get accessibleNameText(): string;
157
213
  get linkTabIndex(): string;
214
+ get widthStyle(): string;
158
215
  get tabNavigation(): object;
159
216
  get tabInOverflow(): object;
160
217
  static get headerTemplate(): typeof TabHeaderTemplate;
package/dist/Tab.js CHANGED
@@ -50,6 +50,20 @@ let UDExTab = UDExTab_1 = class UDExTab extends UI5Element {
50
50
  * @public
51
51
  */
52
52
  this.target = UDExTarget._self;
53
+ /**
54
+ * Defines if the viewport is mobile size.
55
+ *
56
+ * @private
57
+ * @default false
58
+ */
59
+ this._isMobile = false;
60
+ /**
61
+ * Defines if the tab navigation is in vertical orientation.
62
+ *
63
+ * @private
64
+ * @default false
65
+ */
66
+ this._isVertical = false;
53
67
  }
54
68
  getTabInHeaderDomRef() {
55
69
  if (this.getElementInHeader) {
@@ -72,12 +86,44 @@ let UDExTab = UDExTab_1 = class UDExTab extends UI5Element {
72
86
  get buttonClassWithIcon() {
73
87
  return this.hasIcon ? " udex-tab-navigation__button-tab--icon" : "";
74
88
  }
89
+ get isMobile() {
90
+ return this._isMobile;
91
+ }
92
+ get isMobileVertical() {
93
+ return this._isMobile && this._isVertical;
94
+ }
75
95
  get hasNotIcon() {
76
96
  return !this.icon && this.showAttentionBadge;
77
97
  }
78
98
  get hasNotHref() {
79
99
  return !this.href;
80
100
  }
101
+ get hasBodyText() {
102
+ return !!this.bodyText;
103
+ }
104
+ /**
105
+ * Returns true if aria-describedby should point to bodyText.
106
+ * Only applies to selected tabs with bodyText in vertical orientation.
107
+ */
108
+ get ariaDescribedByBodyText() {
109
+ return this.effectiveSelected && this.hasBodyText && this._isVertical;
110
+ }
111
+ get hasLinkSlot() {
112
+ return this.link && this.link.length > 0;
113
+ }
114
+ /**
115
+ * Returns the HTML content of the link slot elements.
116
+ * This is used to render the links in the TabHeader template.
117
+ */
118
+ get linkSlotHtml() {
119
+ if (!this.link || this.link.length === 0) {
120
+ return "";
121
+ }
122
+ return this.link.map(l => l.outerHTML).join("");
123
+ }
124
+ get hasBodyTextOrLink() {
125
+ return this._isVertical && (this.hasBodyText || this.hasLinkSlot);
126
+ }
81
127
  get effectiveSelected() {
82
128
  return this.selected || this._selected;
83
129
  }
@@ -106,6 +152,12 @@ let UDExTab = UDExTab_1 = class UDExTab extends UI5Element {
106
152
  get linkTabIndex() {
107
153
  return this.href && this.effectiveSelected ? "1" : "-1";
108
154
  }
155
+ get widthStyle() {
156
+ if (this._width && this._width !== "auto") {
157
+ return `width: ${this._width};`;
158
+ }
159
+ return "";
160
+ }
109
161
  get tabNavigation() {
110
162
  return executeTemplate(UDExTab_1.headerTemplate, this);
111
163
  }
@@ -125,6 +177,9 @@ __decorate([
125
177
  __decorate([
126
178
  property({ type: String })
127
179
  ], UDExTab.prototype, "text", void 0);
180
+ __decorate([
181
+ property({ type: String })
182
+ ], UDExTab.prototype, "bodyText", void 0);
128
183
  __decorate([
129
184
  property({ type: String })
130
185
  ], UDExTab.prototype, "accessibleName", void 0);
@@ -152,12 +207,24 @@ __decorate([
152
207
  __decorate([
153
208
  property({ type: String })
154
209
  ], UDExTab.prototype, "_tabIndex", void 0);
210
+ __decorate([
211
+ property({ type: Boolean, noAttribute: true })
212
+ ], UDExTab.prototype, "_isMobile", void 0);
213
+ __decorate([
214
+ property({ type: Boolean, noAttribute: true })
215
+ ], UDExTab.prototype, "_isVertical", void 0);
216
+ __decorate([
217
+ property({ type: String, noAttribute: true })
218
+ ], UDExTab.prototype, "_width", void 0);
155
219
  __decorate([
156
220
  property({ type: Boolean })
157
221
  ], UDExTab.prototype, "_iconWithoutBackground", void 0);
158
222
  __decorate([
159
223
  slot({ type: Node, "default": true })
160
224
  ], UDExTab.prototype, "content", void 0);
225
+ __decorate([
226
+ slot({ type: HTMLElement })
227
+ ], UDExTab.prototype, "link", void 0);
161
228
  __decorate([
162
229
  i18n("@sapudex/web-components")
163
230
  ], UDExTab, "i18nBundle", void 0);
package/dist/Tab.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Tab.js","sourceRoot":"","sources":["../src/Tab.ts"],"names":[],"mappings":"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","sourcesContent":["import UI5Element from \"@ui5/webcomponents-base/dist/UI5Element.js\";\nimport customElement from \"@ui5/webcomponents-base/dist/decorators/customElement.js\";\nimport property from \"@ui5/webcomponents-base/dist/decorators/property.js\";\nimport slot from \"@ui5/webcomponents-base/dist/decorators/slot.js\";\nimport litRender from \"@ui5/webcomponents-base/dist/renderer/LitRenderer.js\";\nimport executeTemplate from \"@ui5/webcomponents-base/dist/renderer/executeTemplate.js\";\nimport TabNavigation from \"./TabNavigation.js\";\nimport UDExBadge from \"./Badge.js\";\nimport { UDExTarget } from \"./types/common.js\";\nimport TabTemplate from \"./generated/templates/TabTemplate.lit.js\";\nimport TabHeaderTemplate from \"./generated/templates/TabHeaderTemplate.lit.js\";\nimport TabInOverflowTemplate from \"./generated/templates/TabInOverflowTemplate.lit.js\";\nimport i18n from \"@ui5/webcomponents-base/dist/decorators/i18n.js\";\nimport type I18nBundle from \"@ui5/webcomponents-base/dist/i18nBundle.js\";\nimport { ATTENTION_BADGE } from \"./generated/i18n/i18n-defaults.js\";\n\n// Styles\nimport TabInOverflowCss from \"./generated/themes/TabInOverflow.css.js\";\nimport translate from \"./utils/translate.js\";\n\nexport interface ITab extends UI5Element {\n getTabInHeaderDomRef: () => ITab | null;\n disabled?: boolean;\n icon?: string;\n selected?: boolean;\n numberBadge?: string;\n text?: string;\n showAttentionBadge?: boolean;\n accessibleName?: string;\n href?: string;\n content?: Array<Node>;\n hasIcon: boolean;\n isOnSelectedTab: boolean;\n hasNotIcon: boolean;\n hasNotHref: boolean;\n selectedClass: string;\n tabNavigation: any;\n _individualSlot: string;\n _effectiveSlotName: string;\n _slotName: string;\n _selected?: boolean;\n _tabIndex: string;\n _iconWithoutBackground: boolean;\n _posinset?: number;\n _setsize?: number;\n _contentId?: string;\n getElementInHeader?: () => ITab | null;\n _realTab?: UDExTab;\n _width?: string;\n}\n\n/**\n * @class\n *\n * <h3 class=\"comment-api-title\">Overview</h3>\n *\n *\n * <h3>Usage</h3>\n *\n * For the <code>udex-tab</code>\n * <h3>ES6 Module Import</h3>\n *\n * <code>import \"@sapudex/web-components/dist/Tab.js\";</code>\n *\n * @constructor\n * @author SAP SE\n * @extends UI5Element\n * @tagname udex-tab\n * @public\n */\n@customElement({\n tag: \"udex-tab\",\n renderer: litRender,\n template: TabTemplate,\n dependencies: [UDExBadge],\n})\n\nclass UDExTab extends UI5Element implements ITab {\n /**\n * Defines the Badge at the end of the Tab item.\n *\n * @public\n */\n @property({ type: String })\n numberBadge?: string;\n\n /**\n * Defines the text of tab.\n *\n * @public\n */\n @property({ type: String })\n text!: string;\n /**\n * Accessible name for tab.\n *\n * @public\n */\n @property({ type: String })\n accessibleName!: string;\n\n /**\n * Defines the selected tab.\n *\n * @public\n * @default false\n */\n @property({ type: Boolean })\n selected!: boolean;\n\n /**\n * Defines the displaying attention badge.\n *\n * @public\n * @default false\n */\n @property({ type: Boolean })\n showAttentionBadge!: boolean;\n\n /**\n * Defines the icon in the tab.\n *\n * @public\n */\n @property({ type: String })\n icon!: string;\n\n /**\n * Defines the href of the tab.\n *\n * @public\n */\n @property({ type: String })\n href!: string;\n\n /**\n * Define the target of the tab\n *\n * @public\n */\n @property()\n target: `${UDExTarget}` = UDExTarget._self;\n\n /**\n * Defines the tab.\n *\n * @private\n */\n @property({ type: Object })\n _realTab!: UDExTab;\n\n /**\n * Defines the selected tab for private use.\n *\n * @private\n * @default false\n */\n @property({ type: Boolean })\n _selected!: boolean;\n\n /**\n * Defines the tabindex of the tab.\n *\n * @private\n * @default false\n */\n @property({ type: String })\n _tabIndex!: string;\n\n /**\n * Defines the background color of the component.\n *\n * @private\n * @default false\n */\n @property({ type: Boolean })\n _iconWithoutBackground!: boolean;\n\n /**\n * Defines the content of the tab.\n *\n * @slot content\n * @public\n */\n @slot({ type: Node, \"default\": true })\n content!: Array<Node>;\n\n @i18n(\"@sapudex/web-components\")\n static i18nBundle: I18nBundle;\n\n getElementInHeader?: () => ITab | null;\n _individualSlot!: string;\n\n getTabInHeaderDomRef(): ITab | null {\n if (this.getElementInHeader) {\n return this.getElementInHeader();\n }\n\n return null;\n }\n\n get isOnSelectedTab(): boolean {\n return this._realTab === this;\n }\n\n get _effectiveSlotName(): string {\n return this.isOnSelectedTab ? this._individualSlot : `disabled-${this._individualSlot}`;\n }\n\n get hasIcon(): boolean {\n return !!this.icon;\n }\n\n get classWithIcon(): string {\n return this.hasIcon ? \"udex-tab-navigation__button-text--icon\" : \"\";\n }\n\n get buttonClassWithIcon(): string {\n return this.hasIcon ? \" udex-tab-navigation__button-tab--icon\" : \"\";\n }\n\n get hasNotIcon(): boolean {\n return !this.icon && this.showAttentionBadge;\n }\n\n get hasNotHref(): boolean {\n return !this.href;\n }\n\n get effectiveSelected(): boolean {\n return this.selected || this._selected;\n }\n\n get selectedClass(): string {\n return this.effectiveSelected ? \"udex-tab-navigation__button-tab--active\" : \"\";\n }\n\n get classWithIconWithoutBackground(): string {\n return this.hasIcon && !this._iconWithoutBackground ? \" udex-tab-navigation__button-tab--icon-tab\" : \"\";\n }\n\n get _slotName(): string {\n return this.isOnSelectedTab ? this._individualSlot : `disabled-${this._individualSlot}`;\n }\n\n get ariaLabelledBy(): string {\n const labels = [];\n\n if (this.text) {\n labels.push(`${this.__id!}-text`);\n }\n\n if (this.icon) {\n labels.push(`${this.__id!}-icon`);\n }\n\n return labels.join(\" \");\n }\n\n get accessibleNameText(): string {\n return this.accessibleName || (this.showAttentionBadge ? `, ${translate(UDExTab, ATTENTION_BADGE)}` : \"\");\n }\n\n get linkTabIndex(): string {\n return this.href && this.effectiveSelected ? \"1\" : \"-1\";\n }\n\n get tabNavigation() {\n return executeTemplate(UDExTab.headerTemplate, this);\n }\n\n get tabInOverflow() {\n return executeTemplate(UDExTab.overflowTemplate, this);\n }\n\n static get headerTemplate() {\n return TabHeaderTemplate;\n }\n\n static get overflowTemplate() {\n return TabInOverflowTemplate;\n }\n}\n\nUDExTab.define();\n\nTabNavigation.registerStaticAreaTabStyles(TabInOverflowCss);\n\nexport default UDExTab;\n"]}
1
+ {"version":3,"file":"Tab.js","sourceRoot":"","sources":["../src/Tab.ts"],"names":[],"mappings":"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","sourcesContent":["import UI5Element from \"@ui5/webcomponents-base/dist/UI5Element.js\";\nimport customElement from \"@ui5/webcomponents-base/dist/decorators/customElement.js\";\nimport property from \"@ui5/webcomponents-base/dist/decorators/property.js\";\nimport slot from \"@ui5/webcomponents-base/dist/decorators/slot.js\";\nimport litRender from \"@ui5/webcomponents-base/dist/renderer/LitRenderer.js\";\nimport executeTemplate from \"@ui5/webcomponents-base/dist/renderer/executeTemplate.js\";\nimport TabNavigation from \"./TabNavigation.js\";\nimport UDExBadge from \"./Badge.js\";\nimport { UDExTarget } from \"./types/common.js\";\nimport TabTemplate from \"./generated/templates/TabTemplate.lit.js\";\nimport TabHeaderTemplate from \"./generated/templates/TabHeaderTemplate.lit.js\";\nimport TabInOverflowTemplate from \"./generated/templates/TabInOverflowTemplate.lit.js\";\nimport i18n from \"@ui5/webcomponents-base/dist/decorators/i18n.js\";\nimport type I18nBundle from \"@ui5/webcomponents-base/dist/i18nBundle.js\";\nimport { ATTENTION_BADGE } from \"./generated/i18n/i18n-defaults.js\";\n\n// Styles\nimport TabInOverflowCss from \"./generated/themes/TabInOverflow.css.js\";\nimport translate from \"./utils/translate.js\";\n\nexport interface ITab extends UI5Element {\n getTabInHeaderDomRef: () => ITab | null;\n disabled?: boolean;\n icon?: string;\n selected?: boolean;\n numberBadge?: string;\n text?: string;\n bodyText?: string;\n showAttentionBadge?: boolean;\n accessibleName?: string;\n href?: string;\n content?: Array<Node>;\n link?: Array<HTMLElement>;\n hasIcon: boolean;\n isMobile: boolean;\n isOnSelectedTab: boolean;\n hasNotIcon: boolean;\n hasNotHref: boolean;\n hasLinkSlot: boolean;\n selectedClass: string;\n tabNavigation: any;\n _individualSlot: string;\n _effectiveSlotName: string;\n _slotName: string;\n _selected?: boolean;\n _tabIndex: string;\n _isMobile: boolean;\n _isVertical: boolean;\n _iconWithoutBackground: boolean;\n _posinset?: number;\n _setsize?: number;\n _contentId?: string;\n getElementInHeader?: () => ITab | null;\n _realTab?: UDExTab;\n _width?: string;\n}\n\n/**\n * @class\n *\n * <h3 class=\"comment-api-title\">Overview</h3>\n *\n *\n * <h3>Usage</h3>\n *\n * For the <code>udex-tab</code>\n * <h3>ES6 Module Import</h3>\n *\n * <code>import \"@sapudex/web-components/dist/Tab.js\";</code>\n *\n * @constructor\n * @author SAP SE\n * @extends UI5Element\n * @tagname udex-tab\n * @public\n */\n@customElement({\n tag: \"udex-tab\",\n renderer: litRender,\n template: TabTemplate,\n dependencies: [UDExBadge],\n})\n\nclass UDExTab extends UI5Element implements ITab {\n /**\n * Defines the Badge at the end of the Tab item.\n *\n * @public\n */\n @property({ type: String })\n numberBadge?: string;\n\n /**\n * Defines the text of tab.\n *\n * @public\n */\n @property({ type: String })\n text!: string;\n\n /**\n * Defines the body text (supplementary description) of the tab.\n * Optional text to provide additional context or explanation.\n *\n * @public\n */\n @property({ type: String })\n bodyText?: string;\n\n /**\n * Accessible name for tab.\n *\n * @public\n */\n @property({ type: String })\n accessibleName!: string;\n\n /**\n * Defines the selected tab.\n *\n * @public\n * @default false\n */\n @property({ type: Boolean })\n selected!: boolean;\n\n /**\n * Defines the displaying attention badge.\n *\n * @public\n * @default false\n */\n @property({ type: Boolean })\n showAttentionBadge!: boolean;\n\n /**\n * Defines the icon in the tab.\n *\n * @public\n */\n @property({ type: String })\n icon!: string;\n\n /**\n * Defines the href of the tab.\n *\n * @public\n */\n @property({ type: String })\n href!: string;\n\n /**\n * Define the target of the tab\n *\n * @public\n */\n @property()\n target: `${UDExTarget}` = UDExTarget._self;\n\n /**\n * Defines the tab.\n *\n * @private\n */\n @property({ type: Object })\n _realTab!: UDExTab;\n\n /**\n * Defines the selected tab for private use.\n *\n * @private\n * @default false\n */\n @property({ type: Boolean })\n _selected!: boolean;\n\n /**\n * Defines the tabindex of the tab.\n *\n * @private\n * @default false\n */\n @property({ type: String })\n _tabIndex!: string;\n\n /**\n * Defines if the viewport is mobile size.\n *\n * @private\n * @default false\n */\n @property({ type: Boolean, noAttribute: true })\n _isMobile: boolean = false;\n\n /**\n * Defines if the tab navigation is in vertical orientation.\n *\n * @private\n * @default false\n */\n @property({ type: Boolean, noAttribute: true })\n _isVertical: boolean = false;\n\n /**\n * Defines the width of the tab.\n *\n * @private\n */\n @property({ type: String, noAttribute: true })\n _width?: string;\n\n /**\n * Defines the background color of the component.\n *\n * @private\n * @default false\n */\n @property({ type: Boolean })\n _iconWithoutBackground!: boolean;\n\n /**\n * Defines the content of the tab.\n *\n * @slot content\n * @public\n */\n @slot({ type: Node, \"default\": true })\n content!: Array<Node>;\n\n /**\n * Defines the link(s) to be displayed in the tab header (vertical orientation only).\n * Use this slot to add one or more udex-link elements to the tab button.\n *\n * @slot link\n * @public\n */\n @slot({ type: HTMLElement })\n link!: Array<HTMLElement>;\n\n @i18n(\"@sapudex/web-components\")\n static i18nBundle: I18nBundle;\n\n getElementInHeader?: () => ITab | null;\n _individualSlot!: string;\n\n getTabInHeaderDomRef(): ITab | null {\n if (this.getElementInHeader) {\n return this.getElementInHeader();\n }\n\n return null;\n }\n\n get isOnSelectedTab(): boolean {\n return this._realTab === this;\n }\n\n get _effectiveSlotName(): string {\n return this.isOnSelectedTab ? this._individualSlot : `disabled-${this._individualSlot}`;\n }\n\n get hasIcon(): boolean {\n return !!this.icon;\n }\n\n get classWithIcon(): string {\n return this.hasIcon ? \"udex-tab-navigation__button-text--icon\" : \"\";\n }\n\n get buttonClassWithIcon(): string {\n return this.hasIcon ? \" udex-tab-navigation__button-tab--icon\" : \"\";\n }\n\n get isMobile(): boolean {\n return this._isMobile;\n }\n\n get isMobileVertical(): boolean {\n return this._isMobile && this._isVertical;\n }\n\n get hasNotIcon(): boolean {\n return !this.icon && this.showAttentionBadge;\n }\n\n get hasNotHref(): boolean {\n return !this.href;\n }\n\n get hasBodyText(): boolean {\n return !!this.bodyText;\n }\n\n /**\n * Returns true if aria-describedby should point to bodyText.\n * Only applies to selected tabs with bodyText in vertical orientation.\n */\n get ariaDescribedByBodyText(): boolean {\n return this.effectiveSelected && this.hasBodyText && this._isVertical;\n }\n\n get hasLinkSlot(): boolean {\n return this.link && this.link.length > 0;\n }\n\n /**\n * Returns the HTML content of the link slot elements.\n * This is used to render the links in the TabHeader template.\n */\n get linkSlotHtml(): string {\n if (!this.link || this.link.length === 0) {\n return \"\";\n }\n return this.link.map(l => l.outerHTML).join(\"\");\n }\n\n get hasBodyTextOrLink(): boolean {\n return this._isVertical && (this.hasBodyText || this.hasLinkSlot);\n }\n\n get effectiveSelected(): boolean {\n return this.selected || this._selected;\n }\n\n get selectedClass(): string {\n return this.effectiveSelected ? \"udex-tab-navigation__button-tab--active\" : \"\";\n }\n\n get classWithIconWithoutBackground(): string {\n return this.hasIcon && !this._iconWithoutBackground ? \" udex-tab-navigation__button-tab--icon-tab\" : \"\";\n }\n\n get _slotName(): string {\n return this.isOnSelectedTab ? this._individualSlot : `disabled-${this._individualSlot}`;\n }\n\n get ariaLabelledBy(): string {\n const labels = [];\n\n if (this.text) {\n labels.push(`${this.__id!}-text`);\n }\n\n if (this.icon) {\n labels.push(`${this.__id!}-icon`);\n }\n\n return labels.join(\" \");\n }\n\n get accessibleNameText(): string {\n return this.accessibleName || (this.showAttentionBadge ? `, ${translate(UDExTab, ATTENTION_BADGE)}` : \"\");\n }\n\n get linkTabIndex(): string {\n return this.href && this.effectiveSelected ? \"1\" : \"-1\";\n }\n\n get widthStyle(): string {\n if (this._width && this._width !== \"auto\") {\n return `width: ${this._width};`;\n }\n return \"\";\n }\n\n get tabNavigation() {\n return executeTemplate(UDExTab.headerTemplate, this);\n }\n\n get tabInOverflow() {\n return executeTemplate(UDExTab.overflowTemplate, this);\n }\n\n static get headerTemplate() {\n return TabHeaderTemplate;\n }\n\n static get overflowTemplate() {\n return TabInOverflowTemplate;\n }\n}\n\nUDExTab.define();\n\nTabNavigation.registerStaticAreaTabStyles(TabInOverflowCss);\n\nexport default UDExTab;\n"]}
@@ -5,6 +5,7 @@ import type { ITab } from "./Tab.js";
5
5
  import type Tab from "./Tab.js";
6
6
  import "@ui5/webcomponents-icons/dist/navigation-down-arrow.js";
7
7
  import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
8
+ import "@ui5/webcomponents-icons/dist/slim-arrow-right.js";
8
9
  import TabNavigationPopoverTemplate from "./generated/templates/TabNavigationPopoverTemplate.lit.js";
9
10
  export declare enum UDExSizeMoreButton {
10
11
  Small = "Small",
@@ -14,6 +15,10 @@ export declare enum Mode {
14
15
  Light = "Light",
15
16
  Dark = "Dark"
16
17
  }
18
+ export declare enum UDExTabNavigationOrientation {
19
+ Horizontal = "Horizontal",
20
+ Vertical = "Vertical"
21
+ }
17
22
  type UDExTabNavigationClickDetail = {
18
23
  currentPage: number;
19
24
  };
@@ -58,6 +63,13 @@ declare class UDExTabNavigation extends UI5Element {
58
63
  * @default "Light"
59
64
  */
60
65
  mode: `${Mode}`;
66
+ /**
67
+ * Defines the orientation of the tab navigation.
68
+ *
69
+ * @public
70
+ * @default "Horizontal"
71
+ */
72
+ orientation: `${UDExTabNavigationOrientation}`;
61
73
  /**
62
74
  * Defines the background color of the component.
63
75
  *
@@ -93,6 +105,7 @@ declare class UDExTabNavigation extends UI5Element {
93
105
  items: Array<ITab>;
94
106
  static i18nBundle: I18nBundle;
95
107
  _handleResizeBound: () => void;
108
+ _handleWindowResizeBound: () => void;
96
109
  _popover?: Popover;
97
110
  _visibleTabs?: Array<ITab | HTMLElement>;
98
111
  _isExpanded: boolean;
@@ -102,6 +115,7 @@ declare class UDExTabNavigation extends UI5Element {
102
115
  onAfterRendering(): void;
103
116
  onEnterDOM(): void;
104
117
  onExitDOM(): void;
118
+ _handleWindowResize(): void;
105
119
  _handleResize(): void;
106
120
  emitClickEvent(pageIndex: number): void;
107
121
  onBeforeRendering(): void;
@@ -150,11 +164,13 @@ declare class UDExTabNavigation extends UI5Element {
150
164
  handleClosePopover(): void;
151
165
  handleOpenPopover(): void;
152
166
  handleKeyDown(e: KeyboardEvent): void;
153
- handleRightArrow(e: KeyboardEvent): void;
154
- onFocusRightItem(target: HTMLElement): void;
155
167
  getTabIndexById(id: string): number;
156
168
  handleLeftArrow(e: KeyboardEvent): void;
157
- onFocusLeftItem(target: HTMLElement): void;
169
+ handleRightArrow(e: KeyboardEvent): void;
170
+ handleUpArrow(e: KeyboardEvent): void;
171
+ handleDownArrow(e: KeyboardEvent): void;
172
+ onFocusPreviousItem(target: HTMLElement): void;
173
+ onFocusNextItem(target: HTMLElement): void;
158
174
  handleHomeKey(e: KeyboardEvent): void;
159
175
  handleEndKey(e: KeyboardEvent): void;
160
176
  onEndKey(): void;
@@ -177,10 +193,16 @@ declare class UDExTabNavigation extends UI5Element {
177
193
  handleHome(e: KeyboardEvent): void;
178
194
  handleEnd(e: KeyboardEvent): void;
179
195
  getResponsePopover(): Popover;
196
+ get isHorizontal(): boolean;
197
+ get isVertical(): boolean;
198
+ get ariaOrientationValue(): string;
199
+ get isDesktop(): boolean;
180
200
  get moreButtonText(): string;
181
201
  static registerStaticAreaTabStyles(styles: StyleData): void;
182
202
  static get tabNavigationPopoverTemplate(): typeof TabNavigationPopoverTemplate;
183
203
  get tabNavigationPopover(): object;
204
+ applyTabWidthToVerticalTabs(): void;
205
+ updateMobileState(): void;
184
206
  }
185
207
  export default UDExTabNavigation;
186
208
  export type { UDExTabNavigationClickDetail, UDExTabContainerTabSelectEventDetail };
@@ -20,6 +20,9 @@ import Icon from "@ui5/webcomponents/dist/Icon.js";
20
20
  import "@ui5/webcomponents-icons/dist/navigation-down-arrow.js";
21
21
  import i18n from "@ui5/webcomponents-base/dist/decorators/i18n.js";
22
22
  import { MORE } from "./generated/i18n/i18n-defaults.js";
23
+ import { BreakpointUtils } from "./utils/Breakpoints.js";
24
+ import "@ui5/webcomponents-icons/dist/slim-arrow-right.js";
25
+ import UDExButton from "./Button.js";
23
26
  // Templates
24
27
  import TabNavigationTemplate from "./generated/templates/TabNavigationTemplate.lit.js";
25
28
  import TabNavigationPopoverTemplate from "./generated/templates/TabNavigationPopoverTemplate.lit.js";
@@ -38,6 +41,11 @@ export var Mode;
38
41
  Mode["Light"] = "Light";
39
42
  Mode["Dark"] = "Dark";
40
43
  })(Mode || (Mode = {}));
44
+ export var UDExTabNavigationOrientation;
45
+ (function (UDExTabNavigationOrientation) {
46
+ UDExTabNavigationOrientation["Horizontal"] = "Horizontal";
47
+ UDExTabNavigationOrientation["Vertical"] = "Vertical";
48
+ })(UDExTabNavigationOrientation || (UDExTabNavigationOrientation = {}));
41
49
  /**
42
50
  * @class
43
51
  *
@@ -73,11 +81,19 @@ let UDExTabNavigation = UDExTabNavigation_1 = class UDExTabNavigation extends UI
73
81
  * @default "Light"
74
82
  */
75
83
  this.mode = Mode.Light;
84
+ /**
85
+ * Defines the orientation of the tab navigation.
86
+ *
87
+ * @public
88
+ * @default "Horizontal"
89
+ */
90
+ this.orientation = UDExTabNavigationOrientation.Horizontal;
76
91
  this.tabWidth = "auto";
77
92
  this._isExpanded = false;
78
93
  this._maxTitleLength = 25;
79
94
  this._maxTitleLengthInSecondLines = this._maxTitleLength * 2;
80
95
  this._handleResizeBound = this._handleResize.bind(this);
96
+ this._handleWindowResizeBound = this._handleWindowResize.bind(this);
81
97
  }
82
98
  onAfterRendering() {
83
99
  if (this.items.length) {
@@ -89,19 +105,26 @@ let UDExTabNavigation = UDExTabNavigation_1 = class UDExTabNavigation extends UI
89
105
  console.warn("You have to add the 'udex-tab' as a default slot to the udex-tab-navigation.");
90
106
  }
91
107
  this.initOutsideClick();
108
+ this.applyTabWidthToVerticalTabs();
92
109
  }
93
110
  onEnterDOM() {
94
111
  ResizeHandler.register(this.getHeader(), this._handleResizeBound);
112
+ window.addEventListener("resize", this._handleWindowResizeBound);
95
113
  if (isDesktop()) {
96
114
  this.setAttribute("desktop", "");
97
115
  }
98
116
  }
99
117
  onExitDOM() {
100
118
  ResizeHandler.deregister(this.getHeader(), this._handleResizeBound);
119
+ window.removeEventListener("resize", this._handleWindowResizeBound);
120
+ }
121
+ _handleWindowResize() {
122
+ this.updateMobileState();
101
123
  }
102
124
  _handleResize() {
103
125
  this.handleClosePopover();
104
126
  this._width = this.offsetWidth;
127
+ this.updateMobileState();
105
128
  }
106
129
  emitClickEvent(pageIndex) {
107
130
  this.fireDecoratorEvent("click", { currentPage: pageIndex });
@@ -109,6 +132,7 @@ let UDExTabNavigation = UDExTabNavigation_1 = class UDExTabNavigation extends UI
109
132
  onBeforeRendering() {
110
133
  this.updateOverflowItems();
111
134
  this.setSelectedTab();
135
+ this.updateMobileState();
112
136
  }
113
137
  setSelectedTab() {
114
138
  if (!this.items.length) {
@@ -130,6 +154,7 @@ let UDExTabNavigation = UDExTabNavigation_1 = class UDExTabNavigation extends UI
130
154
  this._selectedTab._selected = Boolean(selectedTabs.length ? selectedTabs.length : this.items[0]);
131
155
  }
132
156
  setRealTabToItems() {
157
+ const isMobile = BreakpointUtils.isAtMost("S");
133
158
  this.items.forEach((tab, index, arr) => {
134
159
  tab._iconWithoutBackground = this.iconWithoutBackground;
135
160
  tab._posinset = index + 1;
@@ -137,6 +162,8 @@ let UDExTabNavigation = UDExTabNavigation_1 = class UDExTabNavigation extends UI
137
162
  tab._contentId = this.getContentId(index);
138
163
  tab._realTab = this._selectedTab;
139
164
  tab._width = this.tabWidth;
165
+ tab._isMobile = isMobile;
166
+ tab._isVertical = this.isVertical;
140
167
  });
141
168
  }
142
169
  getContentId(index) {
@@ -187,7 +214,7 @@ let UDExTabNavigation = UDExTabNavigation_1 = class UDExTabNavigation extends UI
187
214
  }
188
215
  getTab(el) {
189
216
  while (el) {
190
- if (el.localName === "button" && el.getAttribute("role") === "tab") {
217
+ if (el.getAttribute("role") === "tab") {
191
218
  return el;
192
219
  }
193
220
  el = el.parentElement;
@@ -205,12 +232,16 @@ let UDExTabNavigation = UDExTabNavigation_1 = class UDExTabNavigation extends UI
205
232
  this.fireDecoratorEvent("tab-select", { tab: this._selectedTab, tabIndex: selectedTabIndex });
206
233
  }
207
234
  setItemsInHeader() {
235
+ const itemsDomRefs = this.items.map(item => item.getTabInHeaderDomRef());
236
+ // Skip overflow logic for vertical tabs - show all tabs
237
+ if (this.isVertical) {
238
+ return;
239
+ }
208
240
  const tabHeader = this.getTabHeader();
209
241
  let allItemsWidth = 0;
210
242
  if (!this._selectedTab) {
211
243
  return;
212
244
  }
213
- const itemsDomRefs = this.items.map(item => item.getTabInHeaderDomRef());
214
245
  this.getMoreButton()?.setAttribute("hidden", "");
215
246
  this.removeHiddenAttributeInAllTabs(itemsDomRefs);
216
247
  allItemsWidth += this.getTotalItemsWidth(itemsDomRefs);
@@ -430,40 +461,61 @@ let UDExTabNavigation = UDExTabNavigation_1 = class UDExTabNavigation extends UI
430
461
  }
431
462
  }
432
463
  handleKeyDown(e) {
433
- this.handleRightArrow(e);
434
- this.handleLeftArrow(e);
464
+ if (this.isHorizontal) {
465
+ this.handleRightArrow(e);
466
+ this.handleLeftArrow(e);
467
+ }
468
+ else {
469
+ this.handleDownArrow(e);
470
+ this.handleUpArrow(e);
471
+ }
435
472
  this.handleHomeKey(e);
436
473
  this.handleEndKey(e);
437
474
  }
475
+ getTabIndexById(id) {
476
+ return this._visibleTabs.findIndex(tab => tab.id === id);
477
+ }
478
+ handleLeftArrow(e) {
479
+ if (isLeft(e)) {
480
+ e.preventDefault();
481
+ e.stopPropagation();
482
+ this.onFocusPreviousItem(e.target);
483
+ }
484
+ }
438
485
  handleRightArrow(e) {
439
486
  if (isRight(e)) {
440
487
  e.preventDefault();
441
488
  e.stopPropagation();
442
- this.onFocusRightItem(e.target);
489
+ // For horizontal tabs, right arrow always moves focus to the next tab
490
+ this.onFocusNextItem(e.target);
443
491
  }
444
492
  }
445
- onFocusRightItem(target) {
446
- const previousSelectedIndex = this.getTabIndexById(target.id);
447
- const lastIndex = this._visibleTabs.length;
448
- const nextSelectIndex = previousSelectedIndex + 1 < lastIndex ? previousSelectedIndex + 1 : 0;
449
- this._visibleTabs[nextSelectIndex].focus();
450
- }
451
- getTabIndexById(id) {
452
- return this._visibleTabs.findIndex(tab => tab.id === id);
493
+ handleUpArrow(e) {
494
+ if (isUp(e)) {
495
+ e.preventDefault();
496
+ e.stopPropagation();
497
+ this.onFocusPreviousItem(e.target);
498
+ }
453
499
  }
454
- handleLeftArrow(e) {
455
- if (isLeft(e)) {
500
+ handleDownArrow(e) {
501
+ if (isDown(e)) {
456
502
  e.preventDefault();
457
503
  e.stopPropagation();
458
- this.onFocusLeftItem(e.target);
504
+ this.onFocusNextItem(e.target);
459
505
  }
460
506
  }
461
- onFocusLeftItem(target) {
507
+ onFocusPreviousItem(target) {
462
508
  const previousSelectedIndex = this.getTabIndexById(target.id);
463
509
  const lastIndex = this._visibleTabs.length - 1;
464
510
  const previousSelectIndex = previousSelectedIndex - 1 < 0 ? lastIndex : previousSelectedIndex - 1;
465
511
  this._visibleTabs[previousSelectIndex].focus();
466
512
  }
513
+ onFocusNextItem(target) {
514
+ const previousSelectedIndex = this.getTabIndexById(target.id);
515
+ const lastIndex = this._visibleTabs.length;
516
+ const nextSelectIndex = previousSelectedIndex + 1 < lastIndex ? previousSelectedIndex + 1 : 0;
517
+ this._visibleTabs[nextSelectIndex].focus();
518
+ }
467
519
  handleHomeKey(e) {
468
520
  if (isHome(e)) {
469
521
  e.preventDefault();
@@ -606,6 +658,18 @@ let UDExTabNavigation = UDExTabNavigation_1 = class UDExTabNavigation extends UI
606
658
  getResponsePopover() {
607
659
  return this.shadowRoot.querySelector("[ui5-popover]");
608
660
  }
661
+ get isHorizontal() {
662
+ return this.orientation === UDExTabNavigationOrientation.Horizontal;
663
+ }
664
+ get isVertical() {
665
+ return this.orientation === UDExTabNavigationOrientation.Vertical;
666
+ }
667
+ get ariaOrientationValue() {
668
+ return this.isVertical ? "vertical" : "horizontal";
669
+ }
670
+ get isDesktop() {
671
+ return isDesktop();
672
+ }
609
673
  get moreButtonText() {
610
674
  return translate(UDExTabNavigation_1, MORE);
611
675
  }
@@ -618,6 +682,17 @@ let UDExTabNavigation = UDExTabNavigation_1 = class UDExTabNavigation extends UI
618
682
  get tabNavigationPopover() {
619
683
  return executeTemplate(UDExTabNavigation_1.tabNavigationPopoverTemplate, this);
620
684
  }
685
+ applyTabWidthToVerticalTabs() {
686
+ if (this.isVertical && this.tabWidth && this.tabWidth !== "auto") {
687
+ this.style.setProperty("--udex-tab-header-width", this.tabWidth);
688
+ }
689
+ }
690
+ updateMobileState() {
691
+ const isMobile = BreakpointUtils.isAtMost("S");
692
+ this.items.forEach(tab => {
693
+ tab._isMobile = isMobile;
694
+ });
695
+ }
621
696
  };
622
697
  __decorate([
623
698
  property()
@@ -625,6 +700,9 @@ __decorate([
625
700
  __decorate([
626
701
  property()
627
702
  ], UDExTabNavigation.prototype, "mode", void 0);
703
+ __decorate([
704
+ property()
705
+ ], UDExTabNavigation.prototype, "orientation", void 0);
628
706
  __decorate([
629
707
  property({ type: Boolean })
630
708
  ], UDExTabNavigation.prototype, "iconWithoutBackground", void 0);
@@ -657,7 +735,7 @@ UDExTabNavigation = UDExTabNavigation_1 = __decorate([
657
735
  renderer: litRender,
658
736
  styles: [TabNavigationCss, TabInOverflowCss],
659
737
  template: TabNavigationTemplate,
660
- dependencies: [Popover, Icon],
738
+ dependencies: [Popover, Icon, UDExButton],
661
739
  })
662
740
  /**
663
741
  * Fires when the tab was clicked.