@sapudex/web-components 0.184.0 → 0.192.2

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 (145) hide show
  1. package/dist/CountrySelector.d.ts +2 -0
  2. package/dist/CountrySelector.js +5 -1
  3. package/dist/CountrySelector.js.map +1 -1
  4. package/dist/MastheadItem.d.ts +10 -1
  5. package/dist/MastheadItem.js +11 -5
  6. package/dist/MastheadItem.js.map +1 -1
  7. package/dist/MastheadMenu.d.ts +6 -0
  8. package/dist/MastheadMenu.js +3 -0
  9. package/dist/MastheadMenu.js.map +1 -1
  10. package/dist/MastheadMenuItem.d.ts +1 -0
  11. package/dist/MastheadMenuItem.js +3 -0
  12. package/dist/MastheadMenuItem.js.map +1 -1
  13. package/dist/MastheadProfileMenu.d.ts +6 -0
  14. package/dist/MastheadProfileMenu.js +3 -0
  15. package/dist/MastheadProfileMenu.js.map +1 -1
  16. package/dist/MastheadShell.d.ts +34 -4
  17. package/dist/MastheadShell.js +122 -11
  18. package/dist/MastheadShell.js.map +1 -1
  19. package/dist/Pagination.d.ts +3 -2
  20. package/dist/Pagination.js +4 -2
  21. package/dist/Pagination.js.map +1 -1
  22. package/dist/SelectBox.d.ts +2 -0
  23. package/dist/SelectBox.js +5 -1
  24. package/dist/SelectBox.js.map +1 -1
  25. package/dist/Tab.d.ts +4 -13
  26. package/dist/Tab.js +11 -14
  27. package/dist/Tab.js.map +1 -1
  28. package/dist/TabNavigation.js +0 -1
  29. package/dist/TabNavigation.js.map +1 -1
  30. package/dist/TextArea.d.ts +13 -22
  31. package/dist/TextArea.js +30 -33
  32. package/dist/TextArea.js.map +1 -1
  33. package/dist/assets/{bundle.esm-d98e72b5.js → bundle.esm-809b9769.js} +177 -177
  34. package/dist/assets/messagebundle_en-06c0dadc.js +1 -0
  35. package/dist/css/themes/CountrySelector.css +1 -1
  36. package/dist/css/themes/MastheadItem.css +1 -1
  37. package/dist/css/themes/MastheadMenu.css +1 -1
  38. package/dist/css/themes/MastheadMenuItem.css +1 -1
  39. package/dist/css/themes/MastheadProfileMenu.css +1 -1
  40. package/dist/css/themes/MastheadShell.css +1 -1
  41. package/dist/css/themes/MediaPlayer.css +1 -1
  42. package/dist/css/themes/RatingIndicator.css +1 -1
  43. package/dist/css/themes/Search.css +1 -1
  44. package/dist/css/themes/Slider.css +1 -1
  45. package/dist/css/themes/TextArea.css +1 -1
  46. package/dist/custom-elements-internal.json +14 -12
  47. package/dist/custom-elements.json +14 -12
  48. package/dist/generated/assets/i18n/messagebundle_en.json +1 -1
  49. package/dist/generated/i18n/i18n-defaults.d.ts +2 -1
  50. package/dist/generated/i18n/i18n-defaults.js +2 -1
  51. package/dist/generated/i18n/i18n-defaults.js.map +1 -1
  52. package/dist/generated/templates/MastheadItemTemplate.lit.js +3 -3
  53. package/dist/generated/templates/MastheadItemTemplate.lit.js.map +1 -1
  54. package/dist/generated/templates/MastheadMenuItemTemplate.lit.js +2 -2
  55. package/dist/generated/templates/MastheadMenuItemTemplate.lit.js.map +1 -1
  56. package/dist/generated/templates/MastheadShellTemplate.lit.js +8 -9
  57. package/dist/generated/templates/MastheadShellTemplate.lit.js.map +1 -1
  58. package/dist/generated/templates/PaginationTemplate.lit.js +1 -1
  59. package/dist/generated/templates/PaginationTemplate.lit.js.map +1 -1
  60. package/dist/generated/templates/TabHeaderTemplate.lit.js +1 -1
  61. package/dist/generated/templates/TabHeaderTemplate.lit.js.map +1 -1
  62. package/dist/generated/templates/TabNavigationTemplate.lit.js +1 -1
  63. package/dist/generated/templates/TabNavigationTemplate.lit.js.map +1 -1
  64. package/dist/generated/templates/TextAreaTemplate.lit.js +5 -4
  65. package/dist/generated/templates/TextAreaTemplate.lit.js.map +1 -1
  66. package/dist/generated/templates/TextFieldTemplate.lit.js +1 -1
  67. package/dist/generated/templates/TextFieldTemplate.lit.js.map +1 -1
  68. package/dist/generated/themes/CountrySelector.css.js +1 -1
  69. package/dist/generated/themes/CountrySelector.css.js.map +1 -1
  70. package/dist/generated/themes/MastheadItem.css.js +1 -1
  71. package/dist/generated/themes/MastheadItem.css.js.map +1 -1
  72. package/dist/generated/themes/MastheadMenu.css.js +1 -1
  73. package/dist/generated/themes/MastheadMenu.css.js.map +1 -1
  74. package/dist/generated/themes/MastheadMenuItem.css.js +1 -1
  75. package/dist/generated/themes/MastheadMenuItem.css.js.map +1 -1
  76. package/dist/generated/themes/MastheadProfileMenu.css.js +1 -1
  77. package/dist/generated/themes/MastheadProfileMenu.css.js.map +1 -1
  78. package/dist/generated/themes/MastheadShell.css.js +1 -1
  79. package/dist/generated/themes/MastheadShell.css.js.map +1 -1
  80. package/dist/generated/themes/MediaPlayer.css.js +1 -1
  81. package/dist/generated/themes/MediaPlayer.css.js.map +1 -1
  82. package/dist/generated/themes/RatingIndicator.css.js +1 -1
  83. package/dist/generated/themes/RatingIndicator.css.js.map +1 -1
  84. package/dist/generated/themes/Search.css.js +1 -1
  85. package/dist/generated/themes/Search.css.js.map +1 -1
  86. package/dist/generated/themes/Slider.css.js +1 -1
  87. package/dist/generated/themes/Slider.css.js.map +1 -1
  88. package/dist/generated/themes/TextArea.css.js +1 -1
  89. package/dist/generated/themes/TextArea.css.js.map +1 -1
  90. package/dist/i18n/messagebundle.properties +3 -0
  91. package/dist/i18n/messagebundle_en.properties +1 -0
  92. package/dist/web-types.json +3 -3
  93. package/package.json +1 -1
  94. package/src/CountrySelector.hbs +30 -30
  95. package/src/CountrySelector.ts +18 -13
  96. package/src/MastheadItem.hbs +3 -3
  97. package/src/MastheadItem.ts +22 -10
  98. package/src/MastheadMenu.ts +8 -0
  99. package/src/MastheadMenuItem.hbs +2 -1
  100. package/src/MastheadMenuItem.ts +4 -0
  101. package/src/MastheadProfileMenu.ts +8 -0
  102. package/src/MastheadShell.hbs +69 -67
  103. package/src/MastheadShell.ts +154 -16
  104. package/src/Pagination.hbs +2 -2
  105. package/src/Pagination.ts +8 -5
  106. package/src/SelectBox.ts +7 -1
  107. package/src/Tab.ts +18 -29
  108. package/src/TabHeader.hbs +1 -1
  109. package/src/TabNavigation.hbs +1 -2
  110. package/src/TabNavigation.ts +2 -1
  111. package/src/TextArea.hbs +21 -21
  112. package/src/TextArea.ts +82 -78
  113. package/src/TextField.hbs +4 -2
  114. package/src/generated/i18n/i18n-defaults.ts +2 -2
  115. package/src/generated/templates/MastheadItemTemplate.lit.ts +3 -3
  116. package/src/generated/templates/MastheadMenuItemTemplate.lit.ts +2 -2
  117. package/src/generated/templates/MastheadShellTemplate.lit.ts +8 -9
  118. package/src/generated/templates/PaginationTemplate.lit.ts +1 -1
  119. package/src/generated/templates/TabHeaderTemplate.lit.ts +1 -1
  120. package/src/generated/templates/TabNavigationTemplate.lit.ts +1 -1
  121. package/src/generated/templates/TextAreaTemplate.lit.ts +5 -4
  122. package/src/generated/templates/TextFieldTemplate.lit.ts +1 -1
  123. package/src/generated/themes/CountrySelector.css.ts +1 -1
  124. package/src/generated/themes/MastheadItem.css.ts +1 -1
  125. package/src/generated/themes/MastheadMenu.css.ts +1 -1
  126. package/src/generated/themes/MastheadMenuItem.css.ts +1 -1
  127. package/src/generated/themes/MastheadProfileMenu.css.ts +1 -1
  128. package/src/generated/themes/MastheadShell.css.ts +1 -1
  129. package/src/generated/themes/MediaPlayer.css.ts +1 -1
  130. package/src/generated/themes/RatingIndicator.css.ts +1 -1
  131. package/src/generated/themes/Search.css.ts +1 -1
  132. package/src/generated/themes/Slider.css.ts +1 -1
  133. package/src/generated/themes/TextArea.css.ts +1 -1
  134. package/src/i18n/messagebundle.properties +3 -0
  135. package/src/i18n/messagebundle_en.properties +1 -0
  136. package/src/themes/CountrySelector.css +23 -16
  137. package/src/themes/MastheadItem.css +40 -2
  138. package/src/themes/MastheadMenu.css +72 -0
  139. package/src/themes/MastheadMenuItem.css +1 -0
  140. package/src/themes/MastheadProfileMenu.css +8 -0
  141. package/src/themes/MastheadShell.css +59 -27
  142. package/src/themes/MediaPlayer.css +18 -9
  143. package/src/themes/Search.css +4 -4
  144. package/src/themes/TextArea.css +12 -1
  145. package/dist/assets/messagebundle_en-4997b226.js +0 -1
@@ -15,19 +15,22 @@ import "@ui5/webcomponents-icons/dist/search.js";
15
15
  import "@ui5/webcomponents-icons/dist/cart.js";
16
16
  import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
17
17
  import { getI18nBundle } from "@ui5/webcomponents-base/dist/i18nBundle.js";
18
+ import { MAIN_LINKS } from "./generated/i18n/i18n-defaults.js";
18
19
  import UDExMastheadItem from "./MastheadItem.js";
19
20
  import UDExMastheadMenu from "./MastheadMenu.js";
20
21
  import UDExControlButton from "./ControlButton.js";
21
22
  import UDExSearch from "./Search.js";
22
23
  import UDExMastheadMobileMenu from "./MastheadMobileMenu.js";
23
-
24
+ import UDExMastheadProfileMenu from "./MastheadProfileMenu.js";
24
25
  import MastheadShellTemplate from "./generated/templates/MastheadShellTemplate.lit.js";
25
26
 
26
27
  // Styles
27
28
  import MastheadShellCss from "./generated/themes/MastheadShell.css.js";
28
- import { MAIN_LINKS } from "./generated/i18n/i18n-defaults.js";
29
29
 
30
30
  const breakpointSizeM: number = 1279;
31
+ const canvasContentFont = "16px '72 Brand Variable'";
32
+ type MastheadSlottedItem = UDExMastheadItem | UDExMastheadProfileMenu | UDExMastheadMenu | undefined | null;
33
+ type MastheadItemType = UDExMastheadItem | null | undefined;
31
34
  /**
32
35
  * @class
33
36
  *
@@ -293,6 +296,14 @@ class UDExMastheadShell extends UI5Element {
293
296
  @property({ type: Boolean })
294
297
  _isMobileMenuOpen!: boolean;
295
298
 
299
+ /**
300
+ * Defines the mobile mode for component
301
+ *
302
+ * @private
303
+ */
304
+ @property({ type: Boolean })
305
+ _isMobileMode!: boolean;
306
+
296
307
  /**
297
308
  * Defines if the close button was clicked
298
309
  *
@@ -343,11 +354,15 @@ class UDExMastheadShell extends UI5Element {
343
354
  }
344
355
 
345
356
  _handleResize(): void {
357
+ if (this.shouldHandleMobileView) {
358
+ this.handleMobileMode();
359
+ }
360
+
346
361
  if (this.isBreakpointSizeM) {
347
362
  this._isSearchOpened = false;
348
363
  }
349
364
 
350
- if (this._shouldHandleResize && this.isBreakpointSizeM) {
365
+ if (this._shouldHandleResize && this._isMobileMenuOpen) {
351
366
  this.closeMobileMenu();
352
367
  return;
353
368
  }
@@ -355,6 +370,23 @@ class UDExMastheadShell extends UI5Element {
355
370
  this._shouldHandleResize = true;
356
371
  }
357
372
 
373
+ handleMobileMode(): void {
374
+ const rootHolder = this.getDomRef();
375
+ if (rootHolder) {
376
+ const rootHolderWidth = this.getRootHolderWidth(rootHolder);
377
+ const landingHolderWidth = this.getLandingHolderWidth();
378
+ const rightMenuWidth = this.getRightMenuWidth();
379
+ const mainMenuWidth = this.getMainMenuWidth();
380
+ const availableWidth = rootHolderWidth - rightMenuWidth - landingHolderWidth;
381
+
382
+ if (mainMenuWidth >= availableWidth) {
383
+ this.setMobileMode();
384
+ } else {
385
+ this.removeMobileMode();
386
+ }
387
+ }
388
+ }
389
+
358
390
  handleKeyDown(e: KeyboardEvent): void {
359
391
  e.stopPropagation();
360
392
  this.handleLeftArrow(e);
@@ -429,12 +461,14 @@ class UDExMastheadShell extends UI5Element {
429
461
  handleMobileCloseClick(e: CustomEvent) {
430
462
  e.preventDefault();
431
463
  this.closeMobileMenu();
464
+ this.fireMobileMenuCloseEvent();
432
465
  }
433
466
 
434
467
  handleEnterAndSpaceOnCloseBtn(e: KeyboardEvent) {
435
468
  if (isSpace(e) || isEnter(e)) {
436
469
  e.preventDefault();
437
470
  this.closeMobileMenu();
471
+ this.fireMobileMenuCloseEvent();
438
472
  this.mobileBtn?.focus();
439
473
  }
440
474
  }
@@ -442,7 +476,7 @@ class UDExMastheadShell extends UI5Element {
442
476
  handleOutsideClick(): void {
443
477
  document.addEventListener("click", (e: Event) => {
444
478
  const el = e.target as UDExMastheadItem;
445
- const isMobile = window.innerWidth < 1280;
479
+ const isMobile = window.innerWidth < 1280 || this._isMobileMode;
446
480
  const isDropdownSlot = el.getAttribute("slot") === "dropdown";
447
481
  if (!isDropdownSlot && !el.isMenuItem && !isMobile) {
448
482
  this.resetSelectedItems();
@@ -459,16 +493,18 @@ class UDExMastheadShell extends UI5Element {
459
493
  }
460
494
 
461
495
  focusPreviousMenuItem(item: UDExMastheadItem): void {
496
+ const menuItems = this.menuItems;
497
+ const lastItemIndex = menuItems.length - 1;
462
498
  const currentSelectedIndex = this.getCurrentIndex(item);
463
- const lastItemIndex = this.menuItems.length - 1;
464
499
  const previousSelectIndex = currentSelectedIndex - 1 < 0 ? lastItemIndex : currentSelectedIndex - 1;
465
- this.menuItems[previousSelectIndex].focus();
500
+ menuItems[previousSelectIndex].focus();
466
501
  }
467
502
 
468
503
  focusNextMenuItem(item: UDExMastheadItem): void {
504
+ const menuItems = this.menuItems;
469
505
  const currentSelectedIndex = this.getCurrentIndex(item);
470
- const nextSelectIndex = currentSelectedIndex + 1 > this.menuItems.length - 1 ? 0 : currentSelectedIndex + 1;
471
- this.menuItems[nextSelectIndex].focus();
506
+ const nextSelectIndex = currentSelectedIndex + 1 > menuItems.length - 1 ? 0 : currentSelectedIndex + 1;
507
+ menuItems[nextSelectIndex].focus();
472
508
  }
473
509
 
474
510
  resetSelectedItems(): void {
@@ -518,6 +554,74 @@ class UDExMastheadShell extends UI5Element {
518
554
  return buttonsArray.filter(({ selected }) => selected);
519
555
  }
520
556
 
557
+ getRootHolderWidth(root: HTMLElement): number {
558
+ const rootPadding = parseInt(window.getComputedStyle(root).getPropertyValue("padding-left")) * 2;
559
+ const scrollWidth = window.innerWidth - document.documentElement.clientWidth;
560
+ return this.getDomRef()!.clientWidth + scrollWidth - rootPadding;
561
+ }
562
+
563
+ getLandingHolderWidth(): number {
564
+ const landingHolder = this.getDomElement(".udex-masthead-shell__landing-wrap");
565
+ return landingHolder?.offsetWidth || 0;
566
+ }
567
+
568
+ getRightMenuWidth(): number {
569
+ const itemsIcon = [...this.shadowRoot!.querySelectorAll<HTMLDivElement>(".udex-masthead-shell__item_icon")];
570
+ const itemIconWidths = itemsIcon.length * this.getItemIconWidth();
571
+ const itemIconGaps = itemsIcon.length * this.getItemIconGap();
572
+ const exploreSAPWidth = this.hasExploreSAP ? this.getItemWidth(this.exploreSAP[0]) : 0;
573
+ const rightMenuGaps = this.getRightMenuGap() + this.getExploreSapBtnGap() + itemIconGaps;
574
+ return exploreSAPWidth + itemIconWidths + rightMenuGaps;
575
+ }
576
+
577
+ getItemIconWidth(): number {
578
+ const style = window.getComputedStyle(this.profileItem);
579
+ const itemIconWidthVar = style.getPropertyValue("--udex-masthead-item-button-icon-size");
580
+ return parseInt(itemIconWidthVar);
581
+ }
582
+
583
+ getMainMenuWidth(): number {
584
+ const mainItems = this.getSlottedNodes("menuItems");
585
+ const gapItemVar = this.getRootVar("--udex-masthead-shell-item-gap");
586
+ return mainItems.reduce((accumulatedWidth, item, index) => {
587
+ return accumulatedWidth + this.getItemWidth(item as UDExMastheadItem) + (index && parseInt(gapItemVar));
588
+ }, 0);
589
+ }
590
+
591
+ getDomElement(selector: string): HTMLElement | undefined | null {
592
+ return this.shadowRoot?.querySelector(`${selector}`);
593
+ }
594
+
595
+ getItemWidth(item: UDExMastheadItem): number {
596
+ const context = this.getCanvasContext();
597
+ context.font = canvasContentFont;
598
+ return Math.ceil(context.measureText(item.innerText.trim()).width);
599
+ }
600
+
601
+ getCanvasContext(): CanvasRenderingContext2D {
602
+ const canvas = document.createElement("canvas");
603
+ return canvas.getContext("2d")!;
604
+ }
605
+
606
+ getItemIconGap(): number {
607
+ const gapIconItemVar = this.getRootVar("--udex-masthead-shell-item-icon-gap");
608
+ return parseInt(gapIconItemVar);
609
+ }
610
+
611
+ getExploreSapBtnGap(): number {
612
+ const exploreSapBtnGapVar = this.getRootVar("--udex-masthead-shell-explore-margin");
613
+ return this.hasExploreSAP ? parseInt(exploreSapBtnGapVar) : 0;
614
+ }
615
+
616
+ getRightMenuGap(): number {
617
+ const rightMenuGapVar = this.getRootVar("--udex-masthead-right-menu-padding");
618
+ return parseInt(rightMenuGapVar);
619
+ }
620
+
621
+ getRootVar(variableName: string): string {
622
+ return window.getComputedStyle(this.getDomRef()!).getPropertyValue(`${variableName}`);
623
+ }
624
+
521
625
  isNavigationItem(item: UDExMastheadItem): boolean {
522
626
  return this.menuItems.some(menuItem => menuItem === item);
523
627
  }
@@ -541,15 +645,33 @@ class UDExMastheadShell extends UI5Element {
541
645
  if (this.bodyOverflow) {
542
646
  this.removeOverflowBody();
543
647
  }
648
+ }
544
649
 
545
- this.fireMobileMenuCloseEvent();
650
+ setMobileMode(): void {
651
+ this._isMobileMode = true;
652
+ this.slottedItems.forEach((item: MastheadSlottedItem) => {
653
+ if (item) {
654
+ item._isMobileMode = true;
655
+ }
656
+ });
657
+ }
658
+
659
+ removeMobileMode(): void {
660
+ this._isMobileMode = false;
661
+ this.slottedItems.forEach((item: MastheadSlottedItem) => {
662
+ item?.removeAttribute("_is-mobile-mode");
663
+ });
546
664
  }
547
665
 
548
666
  fireMobileMenuCloseEvent(): void {
549
667
  this.fireEvent("mobile-menu-close");
550
668
  }
551
669
 
552
- get searchOpener(): UDExMastheadItem | null | undefined {
670
+ get slottedItems(): (MastheadSlottedItem)[] {
671
+ return [this.profileItem, this.cartItem, this.profileMenu, this.profileMenuLinks];
672
+ }
673
+
674
+ get searchOpener(): MastheadItemType {
553
675
  return this.shadowRoot?.querySelector(".udex-masthead-shell__search-btn");
554
676
  }
555
677
 
@@ -561,14 +683,30 @@ class UDExMastheadShell extends UI5Element {
561
683
  return this.querySelector("[udex-masthead-mobile-menu]");
562
684
  }
563
685
 
564
- get mobileBtn(): UDExMastheadItem | null | undefined {
686
+ get mobileBtn(): MastheadItemType {
565
687
  return this.shadowRoot?.querySelector(".udex-masthead-shell__menu-btn");
566
688
  }
567
689
 
568
- get closeBtn(): UDExMastheadItem | null | undefined {
690
+ get closeBtn(): MastheadItemType {
569
691
  return this.shadowRoot?.querySelector(".udex-masthead-shell__close-btn");
570
692
  }
571
693
 
694
+ get profileItem(): UDExMastheadItem {
695
+ return this.getSlottedNodes<UDExMastheadItem>("profile")[0];
696
+ }
697
+
698
+ get cartItem(): MastheadItemType {
699
+ return this.getSlottedNodes<UDExMastheadItem>("cart")[0];
700
+ }
701
+
702
+ get profileMenu(): UDExMastheadProfileMenu {
703
+ return this.querySelector("[udex-masthead-profile-menu]")!;
704
+ }
705
+
706
+ get profileMenuLinks(): UDExMastheadMenu | undefined | null {
707
+ return this.profileMenu?.shadowRoot?.querySelector("[udex-masthead-menu]");
708
+ }
709
+
572
710
  get hasProfile(): boolean {
573
711
  return !!this.profile.length;
574
712
  }
@@ -597,14 +735,14 @@ class UDExMastheadShell extends UI5Element {
597
735
  return !this.showSearchByDefault && !this._isSearchOpened;
598
736
  }
599
737
 
600
- get isRightMenuVisible(): boolean {
601
- return this.showSearchByDefault || !this._isSearchOpened;
602
- }
603
-
604
738
  get isSearchVisible(): boolean {
605
739
  return this.showSearchByDefault || this._isSearchOpened;
606
740
  }
607
741
 
742
+ get shouldHandleMobileView(): boolean {
743
+ return !this.isBreakpointSizeM && !this.showSearchByDefault;
744
+ }
745
+
608
746
  get mainNavigationAriaLabel(): string {
609
747
  return UDExMastheadShell.i18nBundle.getText(MAIN_LINKS);
610
748
  }
@@ -1,6 +1,6 @@
1
1
  {{#if pages}}
2
- <nav aria-label="pagination" class="{{paginationClass}}">
3
- <ul class="udex-pagination__list" role="navigation" aria-label="{{paginationAccessibleName}}">
2
+ <nav class="{{paginationClass}}" role="navigation" aria-label="{{paginationAccessibleName}}">
3
+ <ul class="udex-pagination__list">
4
4
  {{#if absoluteNavigation}}
5
5
  <li class="udex-pagination__item--first udex-pagination__item">
6
6
  <udex-button
package/src/Pagination.ts CHANGED
@@ -82,9 +82,10 @@ class UDExPagination extends UI5Element {
82
82
  * Defines number of pages.
83
83
  *
84
84
  * @public
85
+ * @default 0
85
86
  */
86
- @property({ validator: Integer })
87
- pages?: number;
87
+ @property({ validator: Integer, defaultValue: 0 })
88
+ pages: number;
88
89
 
89
90
  /**
90
91
  * Defines type of pagination.
@@ -143,6 +144,7 @@ class UDExPagination extends UI5Element {
143
144
 
144
145
  constructor() {
145
146
  super();
147
+ this.pages = 0;
146
148
  this._pages = [];
147
149
  this._visiblePages = [];
148
150
  this.currentPageIndex = 0;
@@ -348,15 +350,16 @@ class UDExPagination extends UI5Element {
348
350
  this.emitChangeEvent();
349
351
  }
350
352
 
351
- setupPages(pages?: number) {
353
+ setupPages(pages: number) {
352
354
  if (!pages) {
353
355
  this._visiblePages = [];
354
356
  return;
355
357
  }
356
358
 
357
- if (!this._pages.length) {
359
+ if (!this._pages.length || this._visiblePages.length < this.displayNumber) {
358
360
  this._firstPageIndex = 0;
359
361
  this._lastPageIndex = pages > this.displayNumber ? this.displayNumber : pages;
362
+ this._pageFocusedManually = false;
360
363
  }
361
364
 
362
365
  this._pages = this.setupPagesData();
@@ -397,7 +400,7 @@ class UDExPagination extends UI5Element {
397
400
  this._lastPageIndex--;
398
401
  }
399
402
  } else {
400
- while (this._lastPageIndex - this.currentPageIndex - 1 < this.pageOffset && this._lastPageIndex < this.pages!) {
403
+ while (this._lastPageIndex - this.currentPageIndex - 1 < this.pageOffset && this._lastPageIndex < this.pages) {
401
404
  this._firstPageIndex++;
402
405
  this._lastPageIndex++;
403
406
  }
package/src/SelectBox.ts CHANGED
@@ -246,6 +246,7 @@ class UDExSelectBox extends UDExSearchableListBase {
246
246
  _showTagsDropdownContent!: boolean;
247
247
 
248
248
  _trigger!: HTMLElement;
249
+ _triggerWrapper!: HTMLElement;
249
250
  _popover!: Popover;
250
251
  _tokenizer!: Tokenizer;
251
252
  _search!: UDExSearch;
@@ -278,6 +279,7 @@ class UDExSelectBox extends UDExSearchableListBase {
278
279
  this._popover = this.getPopover();
279
280
  this._search = this.getSearch();
280
281
  this._trigger = this.getTrigger();
282
+ this._triggerWrapper = this.getTriggerWrapper();
281
283
  this._tags = this.getTags();
282
284
  this.handleDirection();
283
285
  if (this._tokenizer?.tokens.length > 0) {
@@ -298,7 +300,7 @@ class UDExSelectBox extends UDExSearchableListBase {
298
300
  }
299
301
 
300
302
  _handleResize() {
301
- this._popover.style.setProperty("--udex-dropdown-pane-width", `${this.offsetWidth}px`);
303
+ this._popover.style.setProperty("--udex-dropdown-pane-width", `${this._triggerWrapper.offsetWidth}px`);
302
304
  }
303
305
 
304
306
  handleItemPress(e:CustomEvent) {
@@ -588,6 +590,10 @@ class UDExSelectBox extends UDExSearchableListBase {
588
590
  return this.shadowRoot!.querySelector(".udex-text-field__input")!;
589
591
  }
590
592
 
593
+ getTriggerWrapper(): HTMLElement {
594
+ return this.shadowRoot!.querySelector(".udex-text-field__wrap")!;
595
+ }
596
+
591
597
  getTagGroup(): UDExTagGroup {
592
598
  return this.shadowRoot!.querySelector<UDExTagGroup>("[udex-tag-group]")!;
593
599
  }
package/src/Tab.ts CHANGED
@@ -38,7 +38,6 @@ interface ITab extends UI5Element {
38
38
  isOnSelectedTab: boolean;
39
39
  hasNotIcon: boolean;
40
40
  hasNotHref: boolean;
41
- isSelected: boolean;
42
41
  selectedClass: string;
43
42
  tabNavigation: any;
44
43
  _individualSlot: string;
@@ -46,7 +45,6 @@ interface ITab extends UI5Element {
46
45
  _slotName: string;
47
46
  _selected?: boolean;
48
47
  _tabIndex: string;
49
- _contentTabIndex: string;
50
48
  _iconWithoutBackground: boolean;
51
49
  _posinset?: number;
52
50
  _setsize?: number;
@@ -174,15 +172,6 @@ class UDExTab extends UI5Element implements ITab {
174
172
  @property({ type: String })
175
173
  _tabIndex!: string;
176
174
 
177
- /**
178
- * Defines the tabindex of the tab content.
179
- *
180
- * @private
181
- * @default -1
182
- */
183
- @property({ type: String })
184
- _contentTabIndex!: string;
185
-
186
175
  /**
187
176
  * Defines the background color of the component.
188
177
  *
@@ -222,7 +211,7 @@ class UDExTab extends UI5Element implements ITab {
222
211
  return this._realTab === this;
223
212
  }
224
213
 
225
- get _effectiveSlotName() {
214
+ get _effectiveSlotName(): string {
226
215
  return this.isOnSelectedTab ? this._individualSlot : `disabled-${this._individualSlot}`;
227
216
  }
228
217
 
@@ -246,35 +235,23 @@ class UDExTab extends UI5Element implements ITab {
246
235
  return !this.href;
247
236
  }
248
237
 
249
- get isSelected() {
238
+ get effectiveSelected(): boolean {
250
239
  return this.selected || this._selected;
251
240
  }
252
241
 
253
242
  get selectedClass(): string {
254
- return this.isSelected ? "udex-tab-navigation__button-tab--active" : "";
243
+ return this.effectiveSelected ? "udex-tab-navigation__button-tab--active" : "";
255
244
  }
256
245
 
257
246
  get classWithIconWithoutBackground(): string {
258
247
  return this.hasIcon && !this._iconWithoutBackground ? " udex-tab-navigation__button-tab--icon-tab" : "";
259
248
  }
260
249
 
261
- get tabNavigation() {
262
- return executeTemplate(UDExTab.headerTemplate, this);
263
- }
264
-
265
- get tabInOverflow() {
266
- return executeTemplate(UDExTab.overflowTemplate, this);
267
- }
268
-
269
- get _slotName() {
250
+ get _slotName(): string {
270
251
  return this.isOnSelectedTab ? this._individualSlot : `disabled-${this._individualSlot}`;
271
252
  }
272
253
 
273
- get effectiveSelected() {
274
- return this.selected || this._selected;
275
- }
276
-
277
- get ariaLabelledBy() {
254
+ get ariaLabelledBy(): string {
278
255
  const labels = [];
279
256
 
280
257
  if (this.text) {
@@ -288,10 +265,22 @@ class UDExTab extends UI5Element implements ITab {
288
265
  return labels.join(" ");
289
266
  }
290
267
 
291
- get accessibleNameText() {
268
+ get accessibleNameText(): string {
292
269
  return this.accessibleName || (this.showAttentionBadge ? `, ${UDExTab.i18nBundle.getText(ATTENTION_BADGE)}` : "");
293
270
  }
294
271
 
272
+ get linkTabIndex(): string {
273
+ return this.href && this.effectiveSelected ? "1" : "-1";
274
+ }
275
+
276
+ get tabNavigation() {
277
+ return executeTemplate(UDExTab.headerTemplate, this);
278
+ }
279
+
280
+ get tabInOverflow() {
281
+ return executeTemplate(UDExTab.overflowTemplate, this);
282
+ }
283
+
295
284
  static get headerTemplate() {
296
285
  return TabHeaderTemplate;
297
286
  }
package/src/TabHeader.hbs CHANGED
@@ -19,7 +19,7 @@
19
19
  <a
20
20
  id="{{this._id}}"
21
21
  class="udex-tab-navigation__button-tab {{selectedClass}} {{classWithIconWithoutBackground}} {{buttonClassWithIcon}}"
22
- tabindex="-1"
22
+ tabindex="{{this.linkTabIndex}}"
23
23
  role="tab"
24
24
  aria-posinset="{{this._posinset}}"
25
25
  aria-setsize="{{this._setsize}}"
@@ -41,8 +41,7 @@
41
41
  <div
42
42
  class="udex-tab-navigation__content-item"
43
43
  id="{{_contentId}}"
44
- aria-labelledby="{{_id}}"
45
- tabindex="{{_contentTabIndex}}">
44
+ aria-labelledby="{{_id}}">
46
45
  <slot name="{{this._slotName}}"></slot>
47
46
  </div>
48
47
  {{else}}
@@ -74,6 +74,7 @@ export enum Mode {
74
74
  template: TabNavigationTemplate,
75
75
  dependencies: [Popover, Icon],
76
76
  })
77
+
77
78
  /**
78
79
  * Fires when the tab was clicked.
79
80
  *
@@ -86,6 +87,7 @@ export enum Mode {
86
87
  currentPage: { type: Number },
87
88
  },
88
89
  })
90
+
89
91
  class UDExTabNavigation extends UI5Element {
90
92
  /**
91
93
  * Defines the size of the "More" button.
@@ -228,7 +230,6 @@ class UDExTabNavigation extends UI5Element {
228
230
  tab._contentId = this.getContentId(index);
229
231
  tab._realTab = this._selectedTab;
230
232
  tab._width = this.tabWidth;
231
- tab._contentTabIndex = this.getContentTabIndex(tab);
232
233
  });
233
234
  }
234
235
 
package/src/TextArea.hbs CHANGED
@@ -1,16 +1,17 @@
1
1
  <div class="udex-textarea">
2
2
  <div class="udex-textarea__wrapper">
3
3
  {{#if label}}
4
- <label
5
- class="{{labelClasses}}"
6
- for="textarea"
7
- part="label"
8
- >
9
- {{label}}
10
- {{#if required}}
11
- *
12
- {{/if}}
13
- </label>
4
+ <label
5
+ class="{{labelClasses}}"
6
+ for="textarea"
7
+ part="label">
8
+ {{label}}
9
+ {{#if required}}
10
+ *
11
+ {{/if}}
12
+ </label>
13
+ {{else}}
14
+ <label for="textarea" class="hidden-label">{{textHiddenLabel}}</label>
14
15
  {{/if}}
15
16
  <textarea
16
17
  id="textarea"
@@ -32,23 +33,22 @@
32
33
  @focus="{{handleFocus}}"
33
34
  @click="{{handleClick}}"
34
35
  @blur="{{handleBlur}}"
35
- @change="{{handleChange}}"
36
- >
36
+ @change="{{handleChange}}">
37
37
  </textarea>
38
38
  </div>
39
39
  {{#if _supportingText}}
40
40
  <udex-status-message
41
- supporting-text-alignment="Right"
42
- ?disabled="{{disabled}}"
43
- supporting-text="{{_supportingText}}"
44
- value-state="{{fieldState}}">
41
+ supporting-text-alignment="Right"
42
+ ?disabled="{{disabled}}"
43
+ supporting-text="{{_supportingText}}"
44
+ value-state="{{fieldState}}">
45
45
  </udex-status-message>
46
- <span id="{{_id}}-supportingTextDesc" class="hidden-text"> {{_supportingText}} </span>
46
+ <span id="{{_id}}-supportingTextDesc" class="hidden-text">{{_supportingText}}</span>
47
47
  {{/if}}
48
48
  {{#if hasValueState}}
49
- <span id="{{_id}}-valueStateDesc" class="hidden-text"> {{ariaValueStateHiddenText}} </span>
50
- {{/if}}
49
+ <span id="{{_id}}-valueStateDesc" class="hidden-text">{{ariaValueStateHiddenText}}</span>
50
+ {{/if}}
51
51
  {{#if readonly}}
52
- <span id="{{_id}}-readonlyDesc" class="hidden-text"> {{readOnlyText}} </span>
53
- {{/if}}
52
+ <span id="{{_id}}-readonlyDesc" class="hidden-text">{{readOnlyText}}</span>
53
+ {{/if}}
54
54
  </div>