@eui/ecl 21.2.6 → 21.2.7-snapshot-1780663563127

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 (209) hide show
  1. package/assets/i18n-ecl/bg.json +218 -211
  2. package/assets/i18n-ecl/cs.json +217 -210
  3. package/assets/i18n-ecl/da.json +218 -211
  4. package/assets/i18n-ecl/de.json +218 -211
  5. package/assets/i18n-ecl/el.json +218 -211
  6. package/assets/i18n-ecl/en.json +219 -212
  7. package/assets/i18n-ecl/es.json +218 -211
  8. package/assets/i18n-ecl/et.json +219 -212
  9. package/assets/i18n-ecl/fi.json +219 -212
  10. package/assets/i18n-ecl/fr.json +219 -212
  11. package/assets/i18n-ecl/ga.json +219 -212
  12. package/assets/i18n-ecl/hr.json +219 -212
  13. package/assets/i18n-ecl/hu.json +219 -212
  14. package/assets/i18n-ecl/it.json +219 -212
  15. package/assets/i18n-ecl/lt.json +219 -212
  16. package/assets/i18n-ecl/lv.json +219 -212
  17. package/assets/i18n-ecl/mt.json +219 -212
  18. package/assets/i18n-ecl/nl.json +219 -212
  19. package/assets/i18n-ecl/pl.json +219 -212
  20. package/assets/i18n-ecl/pt.json +219 -212
  21. package/assets/i18n-ecl/ro.json +219 -212
  22. package/assets/i18n-ecl/sk.json +219 -212
  23. package/assets/i18n-ecl/sl.json +219 -212
  24. package/assets/i18n-ecl/sv.json +219 -212
  25. package/components/ecl-add-to-calendar/package.json +4 -0
  26. package/components/ecl-quiz/package.json +4 -0
  27. package/docs/changelog.html +47 -0
  28. package/docs/components/EclAccordionComponent.html +2 -2
  29. package/docs/components/EclAccordionItemComponent.html +2 -2
  30. package/docs/components/EclAccordionSummaryComponent.html +2 -2
  31. package/docs/components/EclAddToCalendarComponent.html +711 -0
  32. package/docs/components/EclAppComponent.html +2 -2
  33. package/docs/components/EclBannerComponent.html +26 -2
  34. package/docs/components/EclBlockquoteComponent.html +2 -2
  35. package/docs/components/EclBreadcrumbComponent.html +2 -2
  36. package/docs/components/EclBreadcrumbSegmentComponent.html +2 -2
  37. package/docs/components/EclButtonComponent.html +2 -2
  38. package/docs/components/EclCardBodyComponent.html +2 -2
  39. package/docs/components/EclCardComponent.html +2 -2
  40. package/docs/components/EclCarouselComponent.html +2 -2
  41. package/docs/components/EclCarouselItemComponent.html +2 -2
  42. package/docs/components/EclCategoryFilterComponent.html +2 -2
  43. package/docs/components/EclCategoryFilterItemComponent.html +2 -2
  44. package/docs/components/EclCategoryFilterListComponent.html +2 -2
  45. package/docs/components/EclCheckboxHelpComponent.html +2 -2
  46. package/docs/components/EclCheckboxLabelComponent.html +2 -2
  47. package/docs/components/EclContentBlockComponent.html +2 -2
  48. package/docs/components/EclContentItemComponent.html +2 -2
  49. package/docs/components/EclDateBlockComponent.html +2 -2
  50. package/docs/components/EclDescriptionListDefinitionComponent.html +2 -2
  51. package/docs/components/EclExpandableComponent.html +2 -2
  52. package/docs/components/EclFactFiguresComponent.html +2 -2
  53. package/docs/components/EclFactFiguresItemComponent.html +2 -2
  54. package/docs/components/EclFactFiguresViewAllComponent.html +2 -2
  55. package/docs/components/EclFeaturedComponent.html +2 -2
  56. package/docs/components/EclFeaturedItemComponent.html +19 -43
  57. package/docs/components/EclFeaturedItemDescriptionComponent.html +2 -2
  58. package/docs/components/EclFileComponent.html +42 -17
  59. package/docs/components/EclFileItemComponent.html +29 -10
  60. package/docs/components/EclFileItemsComponent.html +2 -2
  61. package/docs/components/EclFileTaxonomyComponent.html +2 -2
  62. package/docs/components/EclFormGroupComponent.html +2 -2
  63. package/docs/components/EclFormLabelComponent.html +2 -2
  64. package/docs/components/EclGalleryComponent.html +2 -2
  65. package/docs/components/EclGalleryFooterComponent.html +2 -2
  66. package/docs/components/EclGalleryItemComponent.html +2 -2
  67. package/docs/components/EclIconComponent.html +3 -3
  68. package/docs/components/EclIndicatorComponent-1.html +2 -2
  69. package/docs/components/EclIndicatorComponent.html +2 -2
  70. package/docs/components/EclInpageNavigationComponent.html +2 -2
  71. package/docs/components/EclInpageNavigationItemComponent.html +2 -2
  72. package/docs/components/EclListIllustrationComponent.html +2 -2
  73. package/docs/components/EclListIllustrationItemComponent.html +2 -2
  74. package/docs/components/EclLoadingIndicatorComponent.html +2 -2
  75. package/docs/components/EclMediaContainerComponent.html +2 -2
  76. package/docs/components/EclMegaMenuComponent.html +2 -2
  77. package/docs/components/EclMegaMenuFeaturedComponent.html +2 -2
  78. package/docs/components/EclMegaMenuInfoComponent.html +2 -2
  79. package/docs/components/EclMegaMenuItemComponent.html +2 -2
  80. package/docs/components/EclMegaMenuSubitemComponent.html +2 -2
  81. package/docs/components/EclMenuComponent.html +2 -2
  82. package/docs/components/EclMenuItemComponent.html +15 -15
  83. package/docs/components/EclMenuMegaComponent.html +2 -2
  84. package/docs/components/EclMenuMegaItemComponent.html +2 -2
  85. package/docs/components/EclModalBodyComponent.html +2 -2
  86. package/docs/components/EclModalComponent.html +2 -2
  87. package/docs/components/EclModalFooterComponent.html +2 -2
  88. package/docs/components/EclModalHeaderComponent.html +2 -2
  89. package/docs/components/EclMultiselectComponent.html +148 -12
  90. package/docs/components/EclMultiselectDropdownComponent.html +172 -124
  91. package/docs/components/EclMultiselectInputComponent.html +215 -144
  92. package/docs/components/EclMultiselectOptgroupComponent.html +2 -2
  93. package/docs/components/EclMultiselectOptionComponent.html +2 -2
  94. package/docs/components/EclNavigationListComponent.html +2 -2
  95. package/docs/components/EclNavigationListItemComponent.html +2 -2
  96. package/docs/components/EclNewsTickerComponent.html +2 -2
  97. package/docs/components/EclNewsTickerItemComponent.html +2 -2
  98. package/docs/components/EclNotificationComponent.html +2 -2
  99. package/docs/components/EclPageHeaderComponent.html +2 -2
  100. package/docs/components/EclPageHeaderDescriptionContainerComponent.html +2 -2
  101. package/docs/components/EclPageHeaderExpandableComponent.html +2 -2
  102. package/docs/components/EclPageHeaderNextComponent.html +2 -2
  103. package/docs/components/EclPageHeaderSectionComponent.html +2 -2
  104. package/docs/components/EclPageHeaderSectionInfoComponent.html +2 -2
  105. package/docs/components/EclPaginationComponent.html +2 -2
  106. package/docs/components/EclPaginationItemComponent.html +2 -2
  107. package/docs/components/EclPopoverComponent.html +2 -2
  108. package/docs/components/EclQuizCardComponent.html +2119 -0
  109. package/docs/components/EclQuizComponent.html +1527 -0
  110. package/docs/components/EclRadioHelpComponent.html +2 -2
  111. package/docs/components/EclRadioLabelComponent.html +2 -2
  112. package/docs/components/EclRangeBubbleComponent.html +2 -2
  113. package/docs/components/EclRangeValueComponent.html +2 -2
  114. package/docs/components/EclRatingFieldComponent.html +2 -2
  115. package/docs/components/EclSearchFormComponent.html +2 -2
  116. package/docs/components/EclSelectContainerComponent.html +2 -2
  117. package/docs/components/EclSiteFooterComponent.html +2 -2
  118. package/docs/components/EclSiteFooterCoownerComponent.html +2 -2
  119. package/docs/components/EclSiteFooterCoreComponent.html +2 -2
  120. package/docs/components/EclSiteFooterFixedContentEUComponent.html +2 -2
  121. package/docs/components/EclSiteFooterRowCommonComponent.html +2 -2
  122. package/docs/components/EclSiteHeaderActionComponent.html +2 -2
  123. package/docs/components/EclSiteHeaderBannerTopComponent.html +2 -2
  124. package/docs/components/EclSiteHeaderComponent.html +2 -2
  125. package/docs/components/EclSiteHeaderCustomActionComponent.html +2 -2
  126. package/docs/components/EclSiteHeaderEnvironmentComponent.html +2 -2
  127. package/docs/components/EclSiteHeaderLanguageComponent.html +2 -2
  128. package/docs/components/EclSiteHeaderLanguagePopoverComponent.html +2 -2
  129. package/docs/components/EclSiteHeaderLoginComponent.html +2 -2
  130. package/docs/components/EclSiteHeaderNotificationComponent.html +2 -2
  131. package/docs/components/EclSiteHeaderSearchComponent.html +2 -2
  132. package/docs/components/EclSocialMediaFollowComponent.html +2 -2
  133. package/docs/components/EclSocialMediaFollowItemComponent.html +2 -2
  134. package/docs/components/EclSplashPageComponent.html +2 -2
  135. package/docs/components/EclSplashPageLanguageCategoryComponent.html +2 -2
  136. package/docs/components/EclSplashPageLanguageContainerComponent.html +2 -2
  137. package/docs/components/EclSplashPageLanguageLinkComponent.html +2 -2
  138. package/docs/components/EclSpotlightComponent.html +2 -2
  139. package/docs/components/EclSpotlightLinkComponent.html +2 -2
  140. package/docs/components/EclStickyContainerComponent.html +2 -2
  141. package/docs/components/EclTabComponent.html +2 -2
  142. package/docs/components/EclTabLabelComponent.html +2 -2
  143. package/docs/components/EclTableSortButtonComponent.html +2 -2
  144. package/docs/components/EclTabsComponent.html +111 -131
  145. package/docs/components/EclTagComponent.html +2 -2
  146. package/docs/components/EclTimelineComponent.html +2 -2
  147. package/docs/components/EclTimelineItemComponent.html +2 -2
  148. package/docs/components/EclTimelineItemTogglerComponent.html +2 -2
  149. package/docs/directives/EclAddToCalendarActionDirective.html +253 -0
  150. package/docs/interfaces/EclQuizCardFlipEvent.html +379 -0
  151. package/docs/js/menu-wc.js +15 -0
  152. package/docs/js/menu-wc_es5.js +1 -1
  153. package/docs/js/search/search_index.js +2 -2
  154. package/docs/json/EclAddToCalendarActionDirective.md +8 -0
  155. package/docs/json/EclAddToCalendarComponent.md +21 -0
  156. package/docs/json/EclBannerComponent.md +1 -0
  157. package/docs/json/EclFeaturedItemComponent.md +2 -1
  158. package/docs/json/EclFileComponent.md +2 -1
  159. package/docs/json/EclFileItemComponent.md +2 -1
  160. package/docs/json/EclIconComponent.md +1 -1
  161. package/docs/json/EclMultiselectComponent.md +2 -1
  162. package/docs/json/EclMultiselectInputComponent.md +7 -7
  163. package/docs/json/EclQuizCardComponent.md +30 -0
  164. package/docs/json/EclQuizComponent.md +22 -0
  165. package/docs/json/documentation.json +2658 -714
  166. package/docs/miscellaneous/variables.html +70 -0
  167. package/docs/overview.html +3 -3
  168. package/docs/properties.html +1 -1
  169. package/fesm2022/eui-ecl-components-ecl-add-to-calendar.mjs +73 -0
  170. package/fesm2022/eui-ecl-components-ecl-add-to-calendar.mjs.map +1 -0
  171. package/fesm2022/eui-ecl-components-ecl-app.mjs +5 -3
  172. package/fesm2022/eui-ecl-components-ecl-app.mjs.map +1 -1
  173. package/fesm2022/eui-ecl-components-ecl-banner.mjs +4 -2
  174. package/fesm2022/eui-ecl-components-ecl-banner.mjs.map +1 -1
  175. package/fesm2022/eui-ecl-components-ecl-featured.mjs +9 -13
  176. package/fesm2022/eui-ecl-components-ecl-featured.mjs.map +1 -1
  177. package/fesm2022/eui-ecl-components-ecl-file.mjs +63 -36
  178. package/fesm2022/eui-ecl-components-ecl-file.mjs.map +1 -1
  179. package/fesm2022/eui-ecl-components-ecl-icon.mjs +4 -1
  180. package/fesm2022/eui-ecl-components-ecl-icon.mjs.map +1 -1
  181. package/fesm2022/eui-ecl-components-ecl-menu.mjs +5 -5
  182. package/fesm2022/eui-ecl-components-ecl-menu.mjs.map +1 -1
  183. package/fesm2022/eui-ecl-components-ecl-multiselect.mjs +146 -133
  184. package/fesm2022/eui-ecl-components-ecl-multiselect.mjs.map +1 -1
  185. package/fesm2022/eui-ecl-components-ecl-quiz.mjs +496 -0
  186. package/fesm2022/eui-ecl-components-ecl-quiz.mjs.map +1 -0
  187. package/fesm2022/eui-ecl-components-ecl-range.mjs +1 -0
  188. package/fesm2022/eui-ecl-components-ecl-range.mjs.map +1 -1
  189. package/fesm2022/eui-ecl-components-ecl-tabs.mjs +72 -51
  190. package/fesm2022/eui-ecl-components-ecl-tabs.mjs.map +1 -1
  191. package/package.json +10 -2
  192. package/types/eui-ecl-components-ecl-add-to-calendar.d.ts +42 -0
  193. package/types/eui-ecl-components-ecl-add-to-calendar.d.ts.map +1 -0
  194. package/types/eui-ecl-components-ecl-app.d.ts.map +1 -1
  195. package/types/eui-ecl-components-ecl-banner.d.ts +2 -1
  196. package/types/eui-ecl-components-ecl-banner.d.ts.map +1 -1
  197. package/types/eui-ecl-components-ecl-featured.d.ts +23 -21
  198. package/types/eui-ecl-components-ecl-featured.d.ts.map +1 -1
  199. package/types/eui-ecl-components-ecl-file.d.ts +22 -15
  200. package/types/eui-ecl-components-ecl-file.d.ts.map +1 -1
  201. package/types/eui-ecl-components-ecl-icon.d.ts.map +1 -1
  202. package/types/eui-ecl-components-ecl-menu.d.ts +1 -1
  203. package/types/eui-ecl-components-ecl-multiselect.d.ts +65 -48
  204. package/types/eui-ecl-components-ecl-multiselect.d.ts.map +1 -1
  205. package/types/eui-ecl-components-ecl-quiz.d.ts +203 -0
  206. package/types/eui-ecl-components-ecl-quiz.d.ts.map +1 -0
  207. package/types/eui-ecl-components-ecl-range.d.ts.map +1 -1
  208. package/types/eui-ecl-components-ecl-tabs.d.ts +6 -17
  209. package/types/eui-ecl-components-ecl-tabs.d.ts.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"eui-ecl-components-ecl-range.mjs","sources":["../../components/ecl-range/ecl-range-bubble.component.ts","../../components/ecl-range/ecl-range-bubble.component.html","../../components/ecl-range/ecl-range-value.component.ts","../../components/ecl-range/ecl-range-value.component.html","../../components/ecl-range/events/ecl-range.event.ts","../../components/ecl-range/ecl-range.directive.ts","../../components/ecl-range/index.ts","../../components/ecl-range/eui-ecl-components-ecl-range.ts"],"sourcesContent":["import { Component, ElementRef, HostBinding, inject, signal } from '@angular/core';\nimport { ECLBaseDirective } from '@eui/ecl/core';\n\n/**\n * Component representing a bubble tooltip shown above a range input,\n * used to display the current value with ECL styling.\n */\n@Component({\n\tselector: 'ecl-range-bubble',\n\ttemplateUrl: './ecl-range-bubble.component.html',\n})\nexport class EclRangeBubbleComponent extends ECLBaseDirective {\n\tel = inject(ElementRef);\n\n\t/**\n\t * Value displayed inside the bubble.\n\t */\n\tvalue = signal<number>(0);\n\n\t/**\n\t * Horizontal offset in pixels for positioning the bubble.\n\t * Applied as the left style property of the host element.\n\t */\n\tleft = signal<number>(0);\n\n\t@HostBinding('style.left.px')\n\tget leftBinding() {\n\t\treturn this.left();\n\t}\n\n\t/**\n\t * Controls the visibility of the bubble.\n\t * Adds the `ecl-range__bubble--visible` class when true.\n\t */\n\tisVisible = signal(false);\n\n\t/**\n\t * Returns the CSS classes applied to the host element.\n\t * Always includes `ecl-range__bubble` and optionally adds the visible modifier.\n\t */\n\t@HostBinding('class')\n\tget cssClasses(): string {\n\t\treturn [\n\t\t\tsuper.getCssClasses('ecl-range__bubble'),\n\t\t\tthis.isVisible() ? 'ecl-range__bubble--visible' : '',\n\t\t].join(' ').trim();\n\t}\n}\n","<span class=\"ecl-range__value-bubble\">{{ value() }}</span>","import { Component, HostBinding, signal } from '@angular/core';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { ECLBaseDirective } from '@eui/ecl/core';\n\n/**\n * Component representing the value label displayed next to a range input.\n * Applies ECL styling for the value element.\n */\n@Component({\n selector: 'ecl-range-value',\n templateUrl: './ecl-range-value.component.html',\n imports: [TranslateModule],\n styles: [\n `\n :host {\n display: block;\n }\n `,\n ],\n})\nexport class EclRangeValueComponent extends ECLBaseDirective {\n /**\n * Value to display next to the range input.\n */\n value = signal<number>(0);\n\n /**\n * ID attribute applied to the component's host element.\n */\n id = signal<string>('');\n\n @HostBinding('attr.id')\n get idBinding() {\n return this.id() || null;\n }\n\n /**\n * Returns the CSS classes applied to the host element.\n * Adds the base `ecl-range__value` class for styling.\n */\n @HostBinding('class')\n get cssClasses(): string {\n return [super.getCssClasses('ecl-range__value')].join(' ').trim();\n }\n}\n","{{ 'ecl.common.VALUE' | translate }}: <span class=\"ecl-range__value-current\"> {{ value() }} </span>\n","import { EclBaseEvent } from '@eui/ecl/core';\n\n/**\n * Event emitted by the ECL range directive\n * whenever the range value changes.\n */\nexport class EclRangeEvent extends EclBaseEvent {\n /**\n * The current numeric value of the range input.\n */\n constructor(public value: number) {\n super();\n }\n}\n","import { Directive, ElementRef, HostBinding, HostListener, OnDestroy, OnInit, ViewContainerRef, booleanAttribute, ChangeDetectorRef, inject, input, output, Renderer2, AfterViewInit, ComponentRef } from '@angular/core';\nimport { NgControl } from '@angular/forms';\nimport { Subject, distinctUntilChanged, fromEvent, takeUntil } from 'rxjs';\nimport { ECLBaseDirective } from '@eui/ecl/core';\nimport { EclRtlService } from '@eui/ecl/core';\nimport { EclRangeValueComponent } from './ecl-range-value.component';\nimport { EclRangeBubbleComponent } from './ecl-range-bubble.component';\nimport { EclRangeEvent } from './events/ecl-range.event';\n\n/**\n * Directive enhancing native input[type=range] with ECL styles and behavior.\n * Adds value display, bubble indicator, RTL support and integration with reactive forms.\n */\n@Directive({\n selector: 'input[eclRange]',\n})\nexport class EclRangeDirective extends ECLBaseDirective implements OnInit, AfterViewInit, OnDestroy {\n\n /**\n * Defines the size of the range component.\n * Adds a corresponding size class like `ecl-range--m`.\n */\n eclSize = input('m');\n\n /**\n * Initial value for the range input when used standalone.\n */\n value = input<string>();\n\n /**\n * ID assigned to the projected ECL range value component.\n */\n rangeValueId = input<string>();\n\n /**\n * Adds the `ecl-range--invalid` class when true.\n */\n isInvalid = input(false, { transform: booleanAttribute });\n\n /**\n * Enables or disables the display of a value label.\n */\n hasValueLabel = input(true, { transform: booleanAttribute });\n\n /**\n * Emits when the range value changes.\n */\n rangeChange = output<EclRangeEvent>();\n\n protected ngControl = inject(NgControl, { optional: true, self: true });\n private container: HTMLElement;\n private bubbleRef!: ComponentRef<EclRangeBubbleComponent>;\n private valueRef!: ComponentRef<EclRangeValueComponent>;\n private rangeValueComponent: EclRangeValueComponent;\n private rangeBubbleComponent: EclRangeBubbleComponent;\n private isRtl = false;\n private destroy$: Subject<boolean> = new Subject<boolean>();\n private viewContainerRef = inject(ViewContainerRef);\n private eclRtlService = inject(EclRtlService);\n private cd = inject(ChangeDetectorRef);\n private readonly el = inject(ElementRef<HTMLInputElement>);\n private readonly renderer = inject(Renderer2);\n\n @HostBinding('class')\n get cssClasses(): string {\n return [super.getCssClasses('ecl-range'), this.eclSize() ? `ecl-range--${this.eclSize()}` : ''].join(' ').trim();\n }\n\n @HostBinding('class.ecl-range--invalid')\n get invalidState(): boolean {\n if (this.ngControl) {\n return this.ngControl.status === 'INVALID' && this.ngControl.touched;\n } else {\n return this.isInvalid();\n }\n }\n\n /**\n * Handles native input events on the range element\n * when not used with reactive forms.\n */\n @HostListener('input', ['$any($event)'])\n onInput(evt: InputEvent): void {\n if (!this.ngControl) {\n const target = evt.target as HTMLInputElement;\n this.updateRangeValue(target.value);\n }\n }\n\n /**\n * Angular lifecycle hook.\n * Initializes dynamic components and event listeners.\n */\n ngOnInit(): void {\n this.createRangeValueComponent();\n this.initializeRangeValueComponent();\n this.initializeEventListeners();\n this.observeReactiveFormValueChanges();\n this.handleRtlChangeState();\n }\n\n ngAfterViewInit(): void {\n const input = this.el.nativeElement;\n const parent = input.parentNode as HTMLElement | null;\n if (!parent) return;\n\n // Prevent double-wrapping (e.g., HMR, re-init, etc.)\n if (parent.classList?.contains('ecl-range-container')) return;\n\n this.container = this.renderer.createElement('div');\n this.renderer.addClass(this.container, 'ecl-range-container');\n\n // Insert wrapper before input\n this.renderer.insertBefore(parent, this.container, input);\n\n // Move input inside wrapper\n this.renderer.removeChild(parent, input);\n this.renderer.appendChild(this.container, input);\n\n // Move bubble + value host elements into wrapper too\n const bubbleEl = this.bubbleRef?.location.nativeElement as HTMLElement | undefined;\n const valueEl = this.valueRef?.location.nativeElement as HTMLElement | undefined;\n\n if (bubbleEl?.parentNode) {\n this.renderer.removeChild(bubbleEl.parentNode, bubbleEl);\n this.renderer.appendChild(this.container, bubbleEl);\n }\n\n if (valueEl?.parentNode) {\n this.renderer.removeChild(valueEl.parentNode, valueEl);\n this.renderer.appendChild(this.container, valueEl);\n }\n\n requestAnimationFrame(() => this.recalculateBubblePosition());\n }\n\n /**\n * Angular lifecycle hook.\n * Cleans up subscriptions on destroy.\n */\n ngOnDestroy(): void {\n this.destroy$.next(true);\n this.destroy$.unsubscribe();\n }\n\n private handleRtlChangeState(): void {\n this.eclRtlService.currentRtlState$.pipe(takeUntil(this.destroy$)).subscribe((rtlState) => {\n this.isRtl = rtlState;\n });\n }\n\n private createRangeValueComponent(): void {\n this.bubbleRef = this.viewContainerRef.createComponent(EclRangeBubbleComponent);\n this.valueRef = this.viewContainerRef.createComponent(EclRangeValueComponent);\n\n this.rangeBubbleComponent = this.bubbleRef.instance;\n this.rangeValueComponent = this.valueRef.instance;\n\n const valueId = this.rangeValueId();\n if (valueId) {\n this.rangeValueComponent.id.set(valueId);\n }\n }\n\n private initializeRangeValueComponent(): void {\n const initialValue = this.ngControl ? this.ngControl.value : this.value();\n this.updateRangeValue(initialValue);\n }\n\n private observeReactiveFormValueChanges(): void {\n this.ngControl?.valueChanges.pipe(distinctUntilChanged(), takeUntil(this.destroy$)).subscribe((value: string) => {\n this.updateRangeValue(value);\n });\n }\n\n private updateRangeValue(value: string): void {\n const numberValue = parseInt(value, 10);\n\n this.rangeBubbleComponent.value.set(numberValue);\n this.rangeValueComponent.value.set(numberValue);\n\n this.rangeChange.emit(new EclRangeEvent(numberValue));\n }\n\n private initializeEventListeners(): void {\n const rangeElement = this.el.nativeElement;\n\n const mouseEnter$ = fromEvent(rangeElement, 'mouseenter');\n const mouseLeave$ = fromEvent(rangeElement, 'mouseleave');\n const rangeValueChange$ = fromEvent(rangeElement, 'input');\n\n mouseEnter$.pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.rangeBubbleComponent.isVisible.set(true);\n this.cd.detectChanges();\n this.recalculateBubblePosition();\n });\n\n rangeValueChange$.pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.recalculateBubblePosition();\n });\n\n mouseLeave$.pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.rangeBubbleComponent.isVisible.set(false);\n });\n }\n\n private recalculateBubblePosition(): void {\n let containerLeft = 0;\n const halfThumbWidth = 8;\n const halfLabelWidth = this.rangeBubbleComponent.el.nativeElement.offsetWidth / 2;\n\n const rect = this.el.nativeElement.getBoundingClientRect();\n const center = rect.width / 2;\n\n if (this.container) {\n const containerRect = this.container.getBoundingClientRect();\n containerLeft = containerRect.left;\n }\n\n const min = this.el.nativeElement.min ? Number(this.el.nativeElement.min) : 0;\n const max = Number(this.el.nativeElement.max);\n const val = Number(this.el.nativeElement.value);\n\n const percentOfRange = (val - min) / (max - min);\n\n const valuePxPosition = percentOfRange * rect.width;\n const distFromCenter = valuePxPosition - center;\n const percentDistFromCenter = distFromCenter / center;\n\n const offset = percentDistFromCenter * halfThumbWidth;\n const leftFromParent = rect.left - containerLeft;\n if (this.isRtl) {\n this.rangeBubbleComponent.left.set(leftFromParent + rect.width - valuePxPosition - halfLabelWidth + offset);\n } else {\n this.rangeBubbleComponent.left.set(leftFromParent + valuePxPosition - halfLabelWidth - offset);\n }\n }\n}\n","import { EclRangeBubbleComponent } from './ecl-range-bubble.component';\nimport { EclRangeValueComponent } from './ecl-range-value.component';\nimport { EclRangeDirective } from './ecl-range.directive';\n\nexport * from './ecl-range.directive';\nexport * from './ecl-range-value.component';\nexport * from './ecl-range-bubble.component';\nexport * from './events/ecl-range.event';\n\nexport const EUI_ECL_RANGE = [\n EclRangeDirective, EclRangeValueComponent, EclRangeBubbleComponent,\n] as const;","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"eui-ecl-components-ecl-range.mjs","sources":["../../components/ecl-range/ecl-range-bubble.component.ts","../../components/ecl-range/ecl-range-bubble.component.html","../../components/ecl-range/ecl-range-value.component.ts","../../components/ecl-range/ecl-range-value.component.html","../../components/ecl-range/events/ecl-range.event.ts","../../components/ecl-range/ecl-range.directive.ts","../../components/ecl-range/index.ts","../../components/ecl-range/eui-ecl-components-ecl-range.ts"],"sourcesContent":["import { Component, ElementRef, HostBinding, inject, signal } from '@angular/core';\nimport { ECLBaseDirective } from '@eui/ecl/core';\n\n/**\n * Component representing a bubble tooltip shown above a range input,\n * used to display the current value with ECL styling.\n */\n@Component({\n\tselector: 'ecl-range-bubble',\n\ttemplateUrl: './ecl-range-bubble.component.html',\n})\nexport class EclRangeBubbleComponent extends ECLBaseDirective {\n\tel = inject(ElementRef);\n\n\t/**\n\t * Value displayed inside the bubble.\n\t */\n\tvalue = signal<number>(0);\n\n\t/**\n\t * Horizontal offset in pixels for positioning the bubble.\n\t * Applied as the left style property of the host element.\n\t */\n\tleft = signal<number>(0);\n\n\t@HostBinding('style.left.px')\n\tget leftBinding() {\n\t\treturn this.left();\n\t}\n\n\t/**\n\t * Controls the visibility of the bubble.\n\t * Adds the `ecl-range__bubble--visible` class when true.\n\t */\n\tisVisible = signal(false);\n\n\t/**\n\t * Returns the CSS classes applied to the host element.\n\t * Always includes `ecl-range__bubble` and optionally adds the visible modifier.\n\t */\n\t@HostBinding('class')\n\tget cssClasses(): string {\n\t\treturn [\n\t\t\tsuper.getCssClasses('ecl-range__bubble'),\n\t\t\tthis.isVisible() ? 'ecl-range__bubble--visible' : '',\n\t\t].join(' ').trim();\n\t}\n}\n","<span class=\"ecl-range__value-bubble\">{{ value() }}</span>","import { Component, HostBinding, signal } from '@angular/core';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { ECLBaseDirective } from '@eui/ecl/core';\n\n/**\n * Component representing the value label displayed next to a range input.\n * Applies ECL styling for the value element.\n */\n@Component({\n selector: 'ecl-range-value',\n templateUrl: './ecl-range-value.component.html',\n imports: [TranslateModule],\n styles: [\n `\n :host {\n display: block;\n }\n `,\n ],\n})\nexport class EclRangeValueComponent extends ECLBaseDirective {\n /**\n * Value to display next to the range input.\n */\n value = signal<number>(0);\n\n /**\n * ID attribute applied to the component's host element.\n */\n id = signal<string>('');\n\n @HostBinding('attr.id')\n get idBinding() {\n return this.id() || null;\n }\n\n /**\n * Returns the CSS classes applied to the host element.\n * Adds the base `ecl-range__value` class for styling.\n */\n @HostBinding('class')\n get cssClasses(): string {\n return [super.getCssClasses('ecl-range__value')].join(' ').trim();\n }\n}\n","{{ 'ecl.common.VALUE' | translate }}: <span class=\"ecl-range__value-current\"> {{ value() }} </span>\n","import { EclBaseEvent } from '@eui/ecl/core';\n\n/**\n * Event emitted by the ECL range directive\n * whenever the range value changes.\n */\nexport class EclRangeEvent extends EclBaseEvent {\n /**\n * The current numeric value of the range input.\n */\n constructor(public value: number) {\n super();\n }\n}\n","import { Directive, ElementRef, HostBinding, HostListener, OnDestroy, OnInit, ViewContainerRef, booleanAttribute, ChangeDetectorRef, inject, input, output, Renderer2, AfterViewInit, ComponentRef } from '@angular/core';\nimport { NgControl } from '@angular/forms';\nimport { Subject, distinctUntilChanged, fromEvent, takeUntil } from 'rxjs';\nimport { ECLBaseDirective } from '@eui/ecl/core';\nimport { EclRtlService } from '@eui/ecl/core';\nimport { EclRangeValueComponent } from './ecl-range-value.component';\nimport { EclRangeBubbleComponent } from './ecl-range-bubble.component';\nimport { EclRangeEvent } from './events/ecl-range.event';\n\n/**\n * Directive enhancing native input[type=range] with ECL styles and behavior.\n * Adds value display, bubble indicator, RTL support and integration with reactive forms.\n */\n@Directive({\n selector: 'input[eclRange]',\n})\nexport class EclRangeDirective extends ECLBaseDirective implements OnInit, AfterViewInit, OnDestroy {\n\n /**\n * Defines the size of the range component.\n * Adds a corresponding size class like `ecl-range--m`.\n */\n eclSize = input('m');\n\n /**\n * Initial value for the range input when used standalone.\n */\n value = input<string>();\n\n /**\n * ID assigned to the projected ECL range value component.\n */\n rangeValueId = input<string>();\n\n /**\n * Adds the `ecl-range--invalid` class when true.\n */\n isInvalid = input(false, { transform: booleanAttribute });\n\n /**\n * Enables or disables the display of a value label.\n */\n hasValueLabel = input(true, { transform: booleanAttribute });\n\n /**\n * Emits when the range value changes.\n */\n rangeChange = output<EclRangeEvent>();\n\n protected ngControl = inject(NgControl, { optional: true, self: true });\n private container: HTMLElement;\n private bubbleRef!: ComponentRef<EclRangeBubbleComponent>;\n private valueRef!: ComponentRef<EclRangeValueComponent>;\n private rangeValueComponent: EclRangeValueComponent;\n private rangeBubbleComponent: EclRangeBubbleComponent;\n private isRtl = false;\n private destroy$: Subject<boolean> = new Subject<boolean>();\n private viewContainerRef = inject(ViewContainerRef);\n private eclRtlService = inject(EclRtlService);\n private cd = inject(ChangeDetectorRef);\n private readonly el = inject(ElementRef<HTMLInputElement>);\n private readonly renderer = inject(Renderer2);\n\n @HostBinding('class')\n get cssClasses(): string {\n return [super.getCssClasses('ecl-range'), this.eclSize() ? `ecl-range--${this.eclSize()}` : ''].join(' ').trim();\n }\n\n @HostBinding('class.ecl-range--invalid')\n get invalidState(): boolean {\n if (this.ngControl) {\n return this.ngControl.status === 'INVALID' && this.ngControl.touched;\n } else {\n return this.isInvalid();\n }\n }\n\n /**\n * Handles native input events on the range element\n * when not used with reactive forms.\n */\n @HostListener('input', ['$any($event)'])\n onInput(evt: InputEvent): void {\n if (!this.ngControl) {\n const target = evt.target as HTMLInputElement;\n this.updateRangeValue(target.value);\n }\n }\n\n /**\n * Angular lifecycle hook.\n * Initializes dynamic components and event listeners.\n */\n ngOnInit(): void {\n this.createRangeValueComponent();\n this.initializeRangeValueComponent();\n this.initializeEventListeners();\n this.observeReactiveFormValueChanges();\n this.handleRtlChangeState();\n }\n\n ngAfterViewInit(): void {\n const input = this.el.nativeElement;\n const parent = input.parentNode as HTMLElement | null;\n if (!parent) return;\n\n // Prevent double-wrapping (e.g., HMR, re-init, etc.)\n if (parent.classList?.contains('ecl-range-container')) return;\n\n this.container = this.renderer.createElement('div');\n this.renderer.addClass(this.container, 'ecl-range-container');\n this.renderer.addClass(this.container, `ecl-range-container--${this.eclSize()}`);\n\n // Insert wrapper before input\n this.renderer.insertBefore(parent, this.container, input);\n\n // Move input inside wrapper\n this.renderer.removeChild(parent, input);\n this.renderer.appendChild(this.container, input);\n\n // Move bubble + value host elements into wrapper too\n const bubbleEl = this.bubbleRef?.location.nativeElement as HTMLElement | undefined;\n const valueEl = this.valueRef?.location.nativeElement as HTMLElement | undefined;\n\n if (bubbleEl?.parentNode) {\n this.renderer.removeChild(bubbleEl.parentNode, bubbleEl);\n this.renderer.appendChild(this.container, bubbleEl);\n }\n\n if (valueEl?.parentNode) {\n this.renderer.removeChild(valueEl.parentNode, valueEl);\n this.renderer.appendChild(this.container, valueEl);\n }\n\n requestAnimationFrame(() => this.recalculateBubblePosition());\n }\n\n /**\n * Angular lifecycle hook.\n * Cleans up subscriptions on destroy.\n */\n ngOnDestroy(): void {\n this.destroy$.next(true);\n this.destroy$.unsubscribe();\n }\n\n private handleRtlChangeState(): void {\n this.eclRtlService.currentRtlState$.pipe(takeUntil(this.destroy$)).subscribe((rtlState) => {\n this.isRtl = rtlState;\n });\n }\n\n private createRangeValueComponent(): void {\n this.bubbleRef = this.viewContainerRef.createComponent(EclRangeBubbleComponent);\n this.valueRef = this.viewContainerRef.createComponent(EclRangeValueComponent);\n\n this.rangeBubbleComponent = this.bubbleRef.instance;\n this.rangeValueComponent = this.valueRef.instance;\n\n const valueId = this.rangeValueId();\n if (valueId) {\n this.rangeValueComponent.id.set(valueId);\n }\n }\n\n private initializeRangeValueComponent(): void {\n const initialValue = this.ngControl ? this.ngControl.value : this.value();\n this.updateRangeValue(initialValue);\n }\n\n private observeReactiveFormValueChanges(): void {\n this.ngControl?.valueChanges.pipe(distinctUntilChanged(), takeUntil(this.destroy$)).subscribe((value: string) => {\n this.updateRangeValue(value);\n });\n }\n\n private updateRangeValue(value: string): void {\n const numberValue = parseInt(value, 10);\n\n this.rangeBubbleComponent.value.set(numberValue);\n this.rangeValueComponent.value.set(numberValue);\n\n this.rangeChange.emit(new EclRangeEvent(numberValue));\n }\n\n private initializeEventListeners(): void {\n const rangeElement = this.el.nativeElement;\n\n const mouseEnter$ = fromEvent(rangeElement, 'mouseenter');\n const mouseLeave$ = fromEvent(rangeElement, 'mouseleave');\n const rangeValueChange$ = fromEvent(rangeElement, 'input');\n\n mouseEnter$.pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.rangeBubbleComponent.isVisible.set(true);\n this.cd.detectChanges();\n this.recalculateBubblePosition();\n });\n\n rangeValueChange$.pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.recalculateBubblePosition();\n });\n\n mouseLeave$.pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.rangeBubbleComponent.isVisible.set(false);\n });\n }\n\n private recalculateBubblePosition(): void {\n let containerLeft = 0;\n const halfThumbWidth = 8;\n const halfLabelWidth = this.rangeBubbleComponent.el.nativeElement.offsetWidth / 2;\n\n const rect = this.el.nativeElement.getBoundingClientRect();\n const center = rect.width / 2;\n\n if (this.container) {\n const containerRect = this.container.getBoundingClientRect();\n containerLeft = containerRect.left;\n }\n\n const min = this.el.nativeElement.min ? Number(this.el.nativeElement.min) : 0;\n const max = Number(this.el.nativeElement.max);\n const val = Number(this.el.nativeElement.value);\n\n const percentOfRange = (val - min) / (max - min);\n\n const valuePxPosition = percentOfRange * rect.width;\n const distFromCenter = valuePxPosition - center;\n const percentDistFromCenter = distFromCenter / center;\n\n const offset = percentDistFromCenter * halfThumbWidth;\n const leftFromParent = rect.left - containerLeft;\n if (this.isRtl) {\n this.rangeBubbleComponent.left.set(leftFromParent + rect.width - valuePxPosition - halfLabelWidth + offset);\n } else {\n this.rangeBubbleComponent.left.set(leftFromParent + valuePxPosition - halfLabelWidth - offset);\n }\n }\n}\n","import { EclRangeBubbleComponent } from './ecl-range-bubble.component';\nimport { EclRangeValueComponent } from './ecl-range-value.component';\nimport { EclRangeDirective } from './ecl-range.directive';\n\nexport * from './ecl-range.directive';\nexport * from './ecl-range-value.component';\nexport * from './ecl-range-bubble.component';\nexport * from './events/ecl-range.event';\n\nexport const EUI_ECL_RANGE = [\n EclRangeDirective, EclRangeValueComponent, EclRangeBubbleComponent,\n] as const;","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -214,6 +214,10 @@ class EclTabsComponent extends ECLBaseDirective {
214
214
  * Adds `ecl-tabs` class to the host if not using the deprecated selector.
215
215
  */
216
216
  this.hasClass = !this.isUsingOldSelector;
217
+ /**
218
+ * Marks the component as initialized, enabling ECL CSS that depends on this attribute.
219
+ */
220
+ this.autoInitialized = 'true';
217
221
  /**
218
222
  * Class applied to the tab body container.
219
223
  */
@@ -222,10 +226,6 @@ class EclTabsComponent extends ECLBaseDirective {
222
226
  * Emits an event when a tab is selected.
223
227
  */
224
228
  this.tabSelect = new EventEmitter();
225
- /**
226
- * Tabs displayed in the dropdown.
227
- */
228
- this.dropdownTabs = [];
229
229
  /**
230
230
  * Tabs displayed in the visible list.
231
231
  */
@@ -242,10 +242,6 @@ class EclTabsComponent extends ECLBaseDirective {
242
242
  * Indicates whether the mobile breakpoint is active.
243
243
  */
244
244
  this.isMobileBreakpoint = false;
245
- /**
246
- * Indicates whether the "more" button is shown.
247
- */
248
- this.isMoreButtonShow = signal(true, ...(ngDevMode ? [{ debugName: "isMoreButtonShow" }] : /* istanbul ignore next */ []));
249
245
  /**
250
246
  * Indicates whether the scroll previous button is shown.
251
247
  */
@@ -265,7 +261,6 @@ class EclTabsComponent extends ECLBaseDirective {
265
261
  this.eclRtlService = inject(EclRtlService);
266
262
  this.platformId = inject(PLATFORM_ID);
267
263
  this.destroy$ = new Subject();
268
- this.isFirstCall = true;
269
264
  this.isRtl = false;
270
265
  this.TIMEOUT_INTERVAL = 0;
271
266
  if (this.isUsingOldSelector) {
@@ -344,18 +339,6 @@ class EclTabsComponent extends ECLBaseDirective {
344
339
  onDropdownToggle() {
345
340
  this.isDropdownExpanded.set(!this.isDropdownExpanded());
346
341
  }
347
- /**
348
- * Returns the style value for tab list width.
349
- */
350
- getTabsWidthStyle() {
351
- return this.isMobileBreakpoint ? `${this.getTabsWidth()}px` : 'auto';
352
- }
353
- /**
354
- * Calculates total width of all tabs.
355
- */
356
- getTabsWidth() {
357
- return this.tabs.reduce((total, item) => (total += Math.ceil(item.getWidth())), 0);
358
- }
359
342
  /**
360
343
  * Returns the number of tabs hidden in dropdown.
361
344
  */
@@ -471,7 +454,7 @@ class EclTabsComponent extends ECLBaseDirective {
471
454
  break;
472
455
  }
473
456
  case KeyCode.TAB: {
474
- this.onTabTab(tab);
457
+ this.onTabTab();
475
458
  break;
476
459
  }
477
460
  default: {
@@ -487,7 +470,7 @@ class EclTabsComponent extends ECLBaseDirective {
487
470
  this.moreButton.el.nativeElement.blur();
488
471
  this.focusOnDropdownTab(index);
489
472
  }
490
- onTabTab(tab) {
473
+ onTabTab() {
491
474
  this.closeDropdown();
492
475
  }
493
476
  getCurrentTabIndex(tab) {
@@ -667,42 +650,64 @@ class EclTabsComponent extends ECLBaseDirective {
667
650
  }
668
651
  this.styleTransform = 'translate3d(0px, 0px, 0px)';
669
652
  this.index = 0;
670
- this.initMoreBtnWidth();
671
- let stopWidth = this.moreBtnWidth + 25;
672
- const hiddenItems = [];
673
- const listWidth = this.getTabsListWidth();
674
653
  this.isScrollNextBtnShow.set(false);
675
654
  this.isScrollPrevBtnShow.set(false);
676
- this.isMoreButtonShow.set(false);
677
- this.tabs.forEach((item, i) => {
655
+ // Reset list width to auto for measurement (direct DOM, same as ECL)
656
+ this.tabsList.nativeElement.style.width = 'auto';
657
+ // Temporarily show the more button to get its actual width
658
+ this.moreItem.nativeElement.classList.remove('ecl-tabs__item--hidden');
659
+ this.moreButton.el.nativeElement.classList.remove('ecl-tabs__toggle--hidden');
660
+ const moreButtonWidth = this.moreButton.el.nativeElement.getBoundingClientRect().width;
661
+ this.moreItem.nativeElement.classList.add('ecl-tabs__item--hidden');
662
+ this.moreButton.el.nativeElement.classList.add('ecl-tabs__toggle--hidden');
663
+ const hiddenItems = [];
664
+ const listWidth = this.getTabsListWidth();
665
+ // Measure all items first to check if they fit without the button
666
+ this.tabs.forEach((item) => {
678
667
  item.isHidden = false;
679
- if (listWidth >= stopWidth + item.getWidth() && !hiddenItems.includes(i - 1)) {
680
- stopWidth += item.getWidth();
681
- }
682
- else {
668
+ item.hostElement.classList.remove('ecl-tabs__item--hidden');
669
+ });
670
+ const itemWidths = this.tabs.toArray().map((item) => {
671
+ const itemMargin = parseFloat(getComputedStyle(item.hostElement).marginInlineEnd) || 0;
672
+ return item.hostElement.getBoundingClientRect().width + itemMargin;
673
+ });
674
+ const totalWidth = itemWidths.reduce((sum, w) => sum + w, 0);
675
+ if (totalWidth > listWidth) {
676
+ // Reserve space for the more button and hide items that don't fit
677
+ this.tabs.forEach((item) => {
683
678
  item.isHidden = true;
684
- if (item._isActive()) {
685
- this.listTabs[i]._isActive.set(true);
679
+ item.hostElement.classList.add('ecl-tabs__item--hidden');
680
+ });
681
+ let stopWidth = moreButtonWidth;
682
+ this.tabs.forEach((item, i) => {
683
+ item.isHidden = false;
684
+ item.hostElement.classList.remove('ecl-tabs__item--hidden');
685
+ if (listWidth >= stopWidth + itemWidths[i] && !hiddenItems.includes(i - 1)) {
686
+ stopWidth += itemWidths[i];
686
687
  }
687
- hiddenItems.push(i);
688
- }
689
- });
690
- this.cd.markForCheck();
688
+ else {
689
+ item.isHidden = true;
690
+ item.hostElement.classList.add('ecl-tabs__item--hidden');
691
+ if (item._isActive()) {
692
+ this.listTabs[i]._isActive.set(true);
693
+ }
694
+ hiddenItems.push(i);
695
+ }
696
+ });
697
+ }
698
+ // Toggle the visibility of More button and items in dropdown
691
699
  if (!hiddenItems.length) {
692
- this.isMoreButtonShow.set(false);
700
+ this.moreItem.nativeElement.classList.add('ecl-tabs__item--hidden');
701
+ this.moreButton.el.nativeElement.classList.add('ecl-tabs__toggle--hidden');
693
702
  this.setActiveItemForMainTabs();
694
703
  this.hideAllDropdownTabs();
695
704
  }
696
705
  else {
697
- this.isMoreButtonShow.set(true);
706
+ this.moreItem.nativeElement.classList.remove('ecl-tabs__item--hidden');
707
+ this.moreButton.el.nativeElement.classList.remove('ecl-tabs__toggle--hidden');
698
708
  this.setHiddenItemsForDropdownTabs(hiddenItems);
699
709
  }
700
- }
701
- initMoreBtnWidth() {
702
- if (this.isFirstCall) {
703
- this.moreBtnWidth = this.moreButton.el.nativeElement.getBoundingClientRect().width;
704
- this.isFirstCall = false;
705
- }
710
+ this.cd.markForCheck();
706
711
  }
707
712
  hideAllDropdownTabs() {
708
713
  this.listTabs.forEach(item => item.isHidden = true);
@@ -729,13 +734,23 @@ class EclTabsComponent extends ECLBaseDirective {
729
734
  });
730
735
  }
731
736
  handleMobile() {
732
- this.isMoreButtonShow.set(false);
733
737
  this.isScrollPrevBtnShow.set(false);
734
738
  this.isScrollNextBtnShow.set(true);
735
739
  this.setAllTabsVisible();
740
+ // Hide the more item and button (direct DOM, same as ECL)
741
+ this.moreItem.nativeElement.classList.add('ecl-tabs__item--hidden');
742
+ this.moreButton.el.nativeElement.classList.add('ecl-tabs__toggle--hidden');
743
+ // Reset to auto so scrollWidth reflects the natural content width
744
+ this.tabsList.nativeElement.style.width = 'auto';
745
+ // Remove hidden class directly from DOM elements
746
+ this.tabs.forEach((item) => {
747
+ item.hostElement.classList.remove('ecl-tabs__item--hidden');
748
+ });
749
+ // Use scrollWidth to also include item margins
750
+ this.tabsList.nativeElement.style.width = `${this.tabsList.nativeElement.scrollWidth}px`;
736
751
  }
737
752
  setAllTabsVisible() {
738
- this.tabs.forEach((item, i) => {
753
+ this.tabs.forEach((item) => {
739
754
  item.isHidden = false;
740
755
  });
741
756
  }
@@ -766,14 +781,17 @@ class EclTabsComponent extends ECLBaseDirective {
766
781
  }).observe(this.tabsList.nativeElement);
767
782
  }
768
783
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: EclTabsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
769
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.15", type: EclTabsComponent, isStandalone: true, selector: "div[eclTabs]", inputs: { bodyClass: "bodyClass" }, outputs: { tabSelect: "tabSelect" }, host: { listeners: { "document:click": "onClick($event.target)" }, properties: { "class.ecl-tabs": "this.hasClass" } }, queries: [{ propertyName: "tabs", predicate: i0.forwardRef(() => EclTabComponent) }], viewQueries: [{ propertyName: "tabsList", first: true, predicate: ["tabsList"], descendants: true }, { propertyName: "moreButton", first: true, predicate: ["moreButton"], descendants: true }, { propertyName: "btnPrev", first: true, predicate: ["btnPrev"], descendants: true }, { propertyName: "btnNext", first: true, predicate: ["btnNext"], descendants: true }, { propertyName: "dropdownList", first: true, predicate: ["dropdownList"], descendants: true }], usesInheritance: true, ngImport: i0, template: "@if (isUsingOldSelector) {\n<div class=\"ecl-tabs\">\n <ng-container *ngTemplateOutlet=\"eclTabsTemplate\"></ng-container>\n</div>\n} @else {\n<ng-container *ngTemplateOutlet=\"eclTabsTemplate\"></ng-container>\n}\n\n<ng-template #eclTabsTemplate>\n <div class=\"ecl-tabs__container\" [class.ecl-tabs__container--right]=\"isScrollNextBtnShow()\"\n [class.ecl-tabs__container--left]=\"isScrollPrevBtnShow()\">\n <div class=\"ecl-tabs__list\" role=\"tablist\" #tabsList [style.width]=\"getTabsWidthStyle()\"\n [style.transform]=\"styleTransform\" [style.transition-duration]=\"getTransitionDuration()\">\n <ng-content select=\"ecl-tab, [eclTab]\"></ng-content>\n <div class=\"ecl-tabs__item ecl-tabs__item--more\" [class.ecl-tabs__item--hidden]=\"!isMoreButtonShow\">\n @if (listTabs.length > 0) {\n <div class=\"ecl-tabs__dropdown\" [class.ecl-tabs__dropdown--show]=\"isDropdownExpanded()\">\n <div class=\"ecl-tabs__dropdown-list\" #dropdownList>\n @for (tab of listTabs; track tab.id; let i = $index) {\n <div eclTab [isActive]=\"tab._isActive()\" [isHidden]=\"tab.isHidden\" (click)=\"onTabSelect(tab)\"\n (keydown)=\"onTabKeydown($event, tab)\">\n <ecl-tab-label>{{ getTabLabel(i) }}</ecl-tab-label>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n <button #moreButton eclButton class=\"ecl-tabs__toggle\" variant=\"tertiary\" [tabindex]=\"customTabIndex\"\n [attr.aria-expanded]=\"isDropdownExpanded()\" [class.ecl-tabs__toggle--active]=\"isMoreButtonActive\"\n (click)=\"onDropdownToggle()\" [class.ecl-tabs__toggle--hidden]=\"!isMoreButtonShow()\" (focus)=\"onMoreButtonFocus()\">\n <span eclButtonLabel>\n {{ 'ecl.common.MORE' | translate }}\n ({{ getHiddenTabsCount() }})\n </span>\n <ecl-icon icon=\"corner-arrow\" transform=\"rotate-180\" size=\"fluid\"></ecl-icon>\n </button>\n </div>\n\n <div class=\"ecl-tabs__controls\">\n <button #btnPrev eclButton variant=\"tertiary\" isIconOnly class=\"ecl-tabs__prev\"\n [style.display]=\"isScrollPrevBtnShow() ? 'flex' : 'none'\" (click)=\"onScrollPrev()\">\n <span eclButtonLabel>{{ 'ecl.common.PREVIOUS' | translate }}</span>\n <ecl-icon icon=\"corner-arrow\" transform=\"rotate-270\" size=\"s\" class=\"\"> </ecl-icon>\n </button>\n <button #btnNext eclButton variant=\"tertiary\" isIconOnly class=\"ecl-tabs__next\"\n [style.display]=\"isScrollNextBtnShow() ? 'flex' : 'none'\" (click)=\"onScrollNext()\">\n <span eclButtonLabel>{{ 'ecl.common.NEXT' | translate }}</span>\n <ecl-icon icon=\"corner-arrow\" transform=\"rotate-90\" size=\"s\" class=\"\"> </ecl-icon>\n </button>\n </div>\n</ng-template>\n\n@for (tab of tabs.toArray(); track tab.tabLabel) {\n@if (tab._isActive()) {\n<div id=\"{{tab.finalId()}}-tabpanel\" role=\"tabpanel\" aria-labelledby=\"{{tab.finalId()}}-link\" class=\"{{ bodyClass }}\">\n <ng-container *ngTemplateOutlet=\"tab.contentTemplate\"></ng-container>\n</div>\n}\n}\n@for (tab of listTabs; track tab.tabLabel) {\n@if (tab._isActive()) {\n<div id=\"{{tab.finalId()}}-tabpanel\" role=\"tabpanel\" aria-labelledby=\"{{tab.finalId()}}-link\" class=\"{{ bodyClass }}\">\n <ng-container *ngTemplateOutlet=\"tab.contentTemplate\"></ng-container>\n</div>\n}\n}", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i1$1.EclButtonComponent, selector: "button[eclButton], button[ecl-button], a[eclButton]", inputs: ["isIconOnly", "variant", "eclStyle", "size", "containerStyleClass"] }, { kind: "directive", type: i1$1.EclButtonLabelDirective, selector: "[eclButtonLabel]" }, { kind: "component", type: i2.EclIconComponent, selector: "ecl-icon", inputs: ["iconSet", "icon", "size", "color", "transform", "ariaLabelledby", "role", "title", "ariaHidden", "focusable", "isFlipHorizontal"] }, { kind: "component", type: EclTabComponent, selector: "div[eclTab]", inputs: ["id", "anchorExtraClasses", "isHidden", "isActive"], outputs: ["selectTab", "keydownTab"] }, { kind: "component", type: EclTabLabelComponent, selector: "ecl-tab-label" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
784
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.15", type: EclTabsComponent, isStandalone: true, selector: "div[eclTabs]", inputs: { bodyClass: "bodyClass" }, outputs: { tabSelect: "tabSelect" }, host: { listeners: { "document:click": "onClick($event.target)" }, properties: { "class.ecl-tabs": "this.hasClass", "attr.data-ecl-auto-initialized": "this.autoInitialized" } }, queries: [{ propertyName: "tabs", predicate: i0.forwardRef(() => EclTabComponent) }], viewQueries: [{ propertyName: "tabsList", first: true, predicate: ["tabsList"], descendants: true }, { propertyName: "moreButton", first: true, predicate: ["moreButton"], descendants: true }, { propertyName: "btnPrev", first: true, predicate: ["btnPrev"], descendants: true }, { propertyName: "btnNext", first: true, predicate: ["btnNext"], descendants: true }, { propertyName: "dropdownList", first: true, predicate: ["dropdownList"], descendants: true }, { propertyName: "moreItem", first: true, predicate: ["moreItem"], descendants: true }], usesInheritance: true, ngImport: i0, template: "@if (isUsingOldSelector) {\n<div class=\"ecl-tabs\">\n <ng-container *ngTemplateOutlet=\"eclTabsTemplate\"></ng-container>\n</div>\n} @else {\n<ng-container *ngTemplateOutlet=\"eclTabsTemplate\"></ng-container>\n}\n\n<ng-template #eclTabsTemplate>\n <div class=\"ecl-tabs__container\" [class.ecl-tabs__container--right]=\"isScrollNextBtnShow()\"\n [class.ecl-tabs__container--left]=\"isScrollPrevBtnShow()\">\n <div class=\"ecl-tabs__list\" role=\"tablist\" #tabsList\n [style.transform]=\"styleTransform\" [style.transition-duration]=\"getTransitionDuration()\">\n <ng-content select=\"ecl-tab, [eclTab]\"></ng-content>\n <div class=\"ecl-tabs__item ecl-tabs__item--more\" #moreItem>\n @if (listTabs.length > 0) {\n <div class=\"ecl-tabs__dropdown\" [class.ecl-tabs__dropdown--show]=\"isDropdownExpanded()\">\n <div class=\"ecl-tabs__dropdown-list\" #dropdownList>\n @for (tab of listTabs; track tab.id; let i = $index) {\n <div eclTab [isActive]=\"tab._isActive()\" [isHidden]=\"tab.isHidden\" (click)=\"onTabSelect(tab)\"\n (keydown)=\"onTabKeydown($event, tab)\">\n <ecl-tab-label>{{ getTabLabel(i) }}</ecl-tab-label>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n <button #moreButton eclButton class=\"ecl-tabs__toggle\" variant=\"tertiary\" [tabindex]=\"customTabIndex\"\n [attr.aria-expanded]=\"isDropdownExpanded()\" [class.ecl-tabs__toggle--active]=\"isMoreButtonActive\"\n (click)=\"onDropdownToggle()\" (focus)=\"onMoreButtonFocus()\">\n <span eclButtonLabel>\n {{ 'ecl.common.MORE' | translate }}\n ({{ getHiddenTabsCount() }})\n </span>\n <ecl-icon icon=\"corner-arrow\" transform=\"rotate-180\" size=\"fluid\"></ecl-icon>\n </button>\n </div>\n\n <div class=\"ecl-tabs__controls\">\n <button #btnPrev eclButton variant=\"tertiary\" isIconOnly class=\"ecl-tabs__prev\"\n [style.display]=\"isScrollPrevBtnShow() ? 'flex' : 'none'\" (click)=\"onScrollPrev()\">\n <span eclButtonLabel>{{ 'ecl.common.PREVIOUS' | translate }}</span>\n <ecl-icon icon=\"corner-arrow\" transform=\"rotate-270\" size=\"s\" class=\"\"> </ecl-icon>\n </button>\n <button #btnNext eclButton variant=\"tertiary\" isIconOnly class=\"ecl-tabs__next\"\n [style.display]=\"isScrollNextBtnShow() ? 'flex' : 'none'\" (click)=\"onScrollNext()\">\n <span eclButtonLabel>{{ 'ecl.common.NEXT' | translate }}</span>\n <ecl-icon icon=\"corner-arrow\" transform=\"rotate-90\" size=\"s\" class=\"\"> </ecl-icon>\n </button>\n </div>\n</ng-template>\n\n@for (tab of tabs.toArray(); track tab.tabLabel) {\n@if (tab._isActive()) {\n<div id=\"{{tab.finalId()}}-tabpanel\" role=\"tabpanel\" aria-labelledby=\"{{tab.finalId()}}-link\" class=\"{{ bodyClass }}\">\n <ng-container *ngTemplateOutlet=\"tab.contentTemplate\"></ng-container>\n</div>\n}\n}\n@for (tab of listTabs; track tab.tabLabel) {\n@if (tab._isActive()) {\n<div id=\"{{tab.finalId()}}-tabpanel\" role=\"tabpanel\" aria-labelledby=\"{{tab.finalId()}}-link\" class=\"{{ bodyClass }}\">\n <ng-container *ngTemplateOutlet=\"tab.contentTemplate\"></ng-container>\n</div>\n}\n}", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i1$1.EclButtonComponent, selector: "button[eclButton], button[ecl-button], a[eclButton]", inputs: ["isIconOnly", "variant", "eclStyle", "size", "containerStyleClass"] }, { kind: "directive", type: i1$1.EclButtonLabelDirective, selector: "[eclButtonLabel]" }, { kind: "component", type: i2.EclIconComponent, selector: "ecl-icon", inputs: ["iconSet", "icon", "size", "color", "transform", "ariaLabelledby", "role", "title", "ariaHidden", "focusable", "isFlipHorizontal"] }, { kind: "component", type: EclTabComponent, selector: "div[eclTab]", inputs: ["id", "anchorExtraClasses", "isHidden", "isActive"], outputs: ["selectTab", "keydownTab"] }, { kind: "component", type: EclTabLabelComponent, selector: "ecl-tab-label" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
770
785
  }
771
786
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: EclTabsComponent, decorators: [{
772
787
  type: Component,
773
- args: [{ selector: 'div[eclTabs]', imports: [TranslateModule, NgTemplateOutlet, ...EUI_ECL_BUTTON, ...EUI_ECL_ICON, EclTabComponent, EclTabLabelComponent], encapsulation: ViewEncapsulation.None, template: "@if (isUsingOldSelector) {\n<div class=\"ecl-tabs\">\n <ng-container *ngTemplateOutlet=\"eclTabsTemplate\"></ng-container>\n</div>\n} @else {\n<ng-container *ngTemplateOutlet=\"eclTabsTemplate\"></ng-container>\n}\n\n<ng-template #eclTabsTemplate>\n <div class=\"ecl-tabs__container\" [class.ecl-tabs__container--right]=\"isScrollNextBtnShow()\"\n [class.ecl-tabs__container--left]=\"isScrollPrevBtnShow()\">\n <div class=\"ecl-tabs__list\" role=\"tablist\" #tabsList [style.width]=\"getTabsWidthStyle()\"\n [style.transform]=\"styleTransform\" [style.transition-duration]=\"getTransitionDuration()\">\n <ng-content select=\"ecl-tab, [eclTab]\"></ng-content>\n <div class=\"ecl-tabs__item ecl-tabs__item--more\" [class.ecl-tabs__item--hidden]=\"!isMoreButtonShow\">\n @if (listTabs.length > 0) {\n <div class=\"ecl-tabs__dropdown\" [class.ecl-tabs__dropdown--show]=\"isDropdownExpanded()\">\n <div class=\"ecl-tabs__dropdown-list\" #dropdownList>\n @for (tab of listTabs; track tab.id; let i = $index) {\n <div eclTab [isActive]=\"tab._isActive()\" [isHidden]=\"tab.isHidden\" (click)=\"onTabSelect(tab)\"\n (keydown)=\"onTabKeydown($event, tab)\">\n <ecl-tab-label>{{ getTabLabel(i) }}</ecl-tab-label>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n <button #moreButton eclButton class=\"ecl-tabs__toggle\" variant=\"tertiary\" [tabindex]=\"customTabIndex\"\n [attr.aria-expanded]=\"isDropdownExpanded()\" [class.ecl-tabs__toggle--active]=\"isMoreButtonActive\"\n (click)=\"onDropdownToggle()\" [class.ecl-tabs__toggle--hidden]=\"!isMoreButtonShow()\" (focus)=\"onMoreButtonFocus()\">\n <span eclButtonLabel>\n {{ 'ecl.common.MORE' | translate }}\n ({{ getHiddenTabsCount() }})\n </span>\n <ecl-icon icon=\"corner-arrow\" transform=\"rotate-180\" size=\"fluid\"></ecl-icon>\n </button>\n </div>\n\n <div class=\"ecl-tabs__controls\">\n <button #btnPrev eclButton variant=\"tertiary\" isIconOnly class=\"ecl-tabs__prev\"\n [style.display]=\"isScrollPrevBtnShow() ? 'flex' : 'none'\" (click)=\"onScrollPrev()\">\n <span eclButtonLabel>{{ 'ecl.common.PREVIOUS' | translate }}</span>\n <ecl-icon icon=\"corner-arrow\" transform=\"rotate-270\" size=\"s\" class=\"\"> </ecl-icon>\n </button>\n <button #btnNext eclButton variant=\"tertiary\" isIconOnly class=\"ecl-tabs__next\"\n [style.display]=\"isScrollNextBtnShow() ? 'flex' : 'none'\" (click)=\"onScrollNext()\">\n <span eclButtonLabel>{{ 'ecl.common.NEXT' | translate }}</span>\n <ecl-icon icon=\"corner-arrow\" transform=\"rotate-90\" size=\"s\" class=\"\"> </ecl-icon>\n </button>\n </div>\n</ng-template>\n\n@for (tab of tabs.toArray(); track tab.tabLabel) {\n@if (tab._isActive()) {\n<div id=\"{{tab.finalId()}}-tabpanel\" role=\"tabpanel\" aria-labelledby=\"{{tab.finalId()}}-link\" class=\"{{ bodyClass }}\">\n <ng-container *ngTemplateOutlet=\"tab.contentTemplate\"></ng-container>\n</div>\n}\n}\n@for (tab of listTabs; track tab.tabLabel) {\n@if (tab._isActive()) {\n<div id=\"{{tab.finalId()}}-tabpanel\" role=\"tabpanel\" aria-labelledby=\"{{tab.finalId()}}-link\" class=\"{{ bodyClass }}\">\n <ng-container *ngTemplateOutlet=\"tab.contentTemplate\"></ng-container>\n</div>\n}\n}" }]
788
+ args: [{ selector: 'div[eclTabs]', imports: [TranslateModule, NgTemplateOutlet, ...EUI_ECL_BUTTON, ...EUI_ECL_ICON, EclTabComponent, EclTabLabelComponent], encapsulation: ViewEncapsulation.None, template: "@if (isUsingOldSelector) {\n<div class=\"ecl-tabs\">\n <ng-container *ngTemplateOutlet=\"eclTabsTemplate\"></ng-container>\n</div>\n} @else {\n<ng-container *ngTemplateOutlet=\"eclTabsTemplate\"></ng-container>\n}\n\n<ng-template #eclTabsTemplate>\n <div class=\"ecl-tabs__container\" [class.ecl-tabs__container--right]=\"isScrollNextBtnShow()\"\n [class.ecl-tabs__container--left]=\"isScrollPrevBtnShow()\">\n <div class=\"ecl-tabs__list\" role=\"tablist\" #tabsList\n [style.transform]=\"styleTransform\" [style.transition-duration]=\"getTransitionDuration()\">\n <ng-content select=\"ecl-tab, [eclTab]\"></ng-content>\n <div class=\"ecl-tabs__item ecl-tabs__item--more\" #moreItem>\n @if (listTabs.length > 0) {\n <div class=\"ecl-tabs__dropdown\" [class.ecl-tabs__dropdown--show]=\"isDropdownExpanded()\">\n <div class=\"ecl-tabs__dropdown-list\" #dropdownList>\n @for (tab of listTabs; track tab.id; let i = $index) {\n <div eclTab [isActive]=\"tab._isActive()\" [isHidden]=\"tab.isHidden\" (click)=\"onTabSelect(tab)\"\n (keydown)=\"onTabKeydown($event, tab)\">\n <ecl-tab-label>{{ getTabLabel(i) }}</ecl-tab-label>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n <button #moreButton eclButton class=\"ecl-tabs__toggle\" variant=\"tertiary\" [tabindex]=\"customTabIndex\"\n [attr.aria-expanded]=\"isDropdownExpanded()\" [class.ecl-tabs__toggle--active]=\"isMoreButtonActive\"\n (click)=\"onDropdownToggle()\" (focus)=\"onMoreButtonFocus()\">\n <span eclButtonLabel>\n {{ 'ecl.common.MORE' | translate }}\n ({{ getHiddenTabsCount() }})\n </span>\n <ecl-icon icon=\"corner-arrow\" transform=\"rotate-180\" size=\"fluid\"></ecl-icon>\n </button>\n </div>\n\n <div class=\"ecl-tabs__controls\">\n <button #btnPrev eclButton variant=\"tertiary\" isIconOnly class=\"ecl-tabs__prev\"\n [style.display]=\"isScrollPrevBtnShow() ? 'flex' : 'none'\" (click)=\"onScrollPrev()\">\n <span eclButtonLabel>{{ 'ecl.common.PREVIOUS' | translate }}</span>\n <ecl-icon icon=\"corner-arrow\" transform=\"rotate-270\" size=\"s\" class=\"\"> </ecl-icon>\n </button>\n <button #btnNext eclButton variant=\"tertiary\" isIconOnly class=\"ecl-tabs__next\"\n [style.display]=\"isScrollNextBtnShow() ? 'flex' : 'none'\" (click)=\"onScrollNext()\">\n <span eclButtonLabel>{{ 'ecl.common.NEXT' | translate }}</span>\n <ecl-icon icon=\"corner-arrow\" transform=\"rotate-90\" size=\"s\" class=\"\"> </ecl-icon>\n </button>\n </div>\n</ng-template>\n\n@for (tab of tabs.toArray(); track tab.tabLabel) {\n@if (tab._isActive()) {\n<div id=\"{{tab.finalId()}}-tabpanel\" role=\"tabpanel\" aria-labelledby=\"{{tab.finalId()}}-link\" class=\"{{ bodyClass }}\">\n <ng-container *ngTemplateOutlet=\"tab.contentTemplate\"></ng-container>\n</div>\n}\n}\n@for (tab of listTabs; track tab.tabLabel) {\n@if (tab._isActive()) {\n<div id=\"{{tab.finalId()}}-tabpanel\" role=\"tabpanel\" aria-labelledby=\"{{tab.finalId()}}-link\" class=\"{{ bodyClass }}\">\n <ng-container *ngTemplateOutlet=\"tab.contentTemplate\"></ng-container>\n</div>\n}\n}" }]
774
789
  }], ctorParameters: () => [], propDecorators: { hasClass: [{
775
790
  type: HostBinding,
776
791
  args: ['class.ecl-tabs']
792
+ }], autoInitialized: [{
793
+ type: HostBinding,
794
+ args: ['attr.data-ecl-auto-initialized']
777
795
  }], bodyClass: [{
778
796
  type: Input
779
797
  }], tabSelect: [{
@@ -796,6 +814,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImpo
796
814
  }], dropdownList: [{
797
815
  type: ViewChild,
798
816
  args: ['dropdownList']
817
+ }], moreItem: [{
818
+ type: ViewChild,
819
+ args: ['moreItem']
799
820
  }], onClick: [{
800
821
  type: HostListener,
801
822
  args: ['document:click', ['$event.target']]