@eui/ecl 22.0.0-alpha.51 → 22.0.0-alpha.53
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.
- package/assets/i18n-ecl/bg.json +6 -2
- package/assets/i18n-ecl/cs.json +6 -2
- package/assets/i18n-ecl/da.json +6 -2
- package/assets/i18n-ecl/de.json +6 -2
- package/assets/i18n-ecl/el.json +6 -2
- package/assets/i18n-ecl/en.json +6 -2
- package/assets/i18n-ecl/es.json +6 -2
- package/assets/i18n-ecl/et.json +6 -2
- package/assets/i18n-ecl/fi.json +6 -2
- package/assets/i18n-ecl/fr.json +6 -2
- package/assets/i18n-ecl/ga.json +6 -2
- package/assets/i18n-ecl/hr.json +6 -2
- package/assets/i18n-ecl/hu.json +6 -2
- package/assets/i18n-ecl/it.json +6 -2
- package/assets/i18n-ecl/lt.json +6 -2
- package/assets/i18n-ecl/lv.json +6 -2
- package/assets/i18n-ecl/mt.json +6 -2
- package/assets/i18n-ecl/nl.json +6 -2
- package/assets/i18n-ecl/pl.json +6 -2
- package/assets/i18n-ecl/pt.json +6 -2
- package/assets/i18n-ecl/ro.json +6 -2
- package/assets/i18n-ecl/sk.json +6 -2
- package/assets/i18n-ecl/sl.json +6 -2
- package/assets/i18n-ecl/sv.json +6 -2
- package/components/ecl-slider/package.json +4 -0
- package/docs/changelog.html +29 -0
- package/docs/components/EclAccordionSummaryComponent.html +1 -1
- package/docs/components/EclAddToCalendarComponent.html +1 -1
- package/docs/components/EclAnimatedNumbersComponent.html +1 -1
- package/docs/components/EclAnimatedNumbersItemComponent.html +1 -1
- package/docs/components/EclAppComponent.html +1 -1
- package/docs/components/EclBannerComponent.html +1 -1
- package/docs/components/EclBlockquoteComponent.html +1 -1
- package/docs/components/EclBreadcrumbComponent.html +1 -1
- package/docs/components/EclBreadcrumbSegmentComponent.html +1 -1
- package/docs/components/EclButtonComponent.html +1 -1
- package/docs/components/EclCardBodyComponent.html +1 -1
- package/docs/components/EclCardComponent.html +1 -1
- package/docs/components/EclCarouselComponent.html +182 -898
- package/docs/components/EclCarouselItemComponent.html +32 -1
- package/docs/components/EclCategoryFilterComponent.html +1 -1
- package/docs/components/EclCategoryFilterItemComponent.html +1 -1
- package/docs/components/EclCategoryFilterListComponent.html +1 -1
- package/docs/components/EclCheckboxHelpComponent.html +1 -1
- package/docs/components/EclCheckboxLabelComponent.html +1 -1
- package/docs/components/EclContentBlockComponent.html +1 -1
- package/docs/components/EclContentItemComponent.html +1 -1
- package/docs/components/EclDateBlockComponent.html +1 -1
- package/docs/components/EclDescriptionListDefinitionComponent.html +1 -1
- package/docs/components/EclExpandableComponent.html +1 -1
- package/docs/components/EclFactFiguresComponent.html +1 -1
- package/docs/components/EclFactFiguresItemComponent.html +1 -1
- package/docs/components/EclFactFiguresViewAllComponent.html +1 -1
- package/docs/components/EclFeaturedComponent.html +1 -1
- package/docs/components/EclFeaturedItemComponent.html +1 -1
- package/docs/components/EclFeaturedItemDescriptionComponent.html +1 -1
- package/docs/components/EclFileComponent.html +1 -1
- package/docs/components/EclFileItemComponent.html +1 -1
- package/docs/components/EclFileItemsComponent.html +1 -1
- package/docs/components/EclFileListsComponent.html +1 -1
- package/docs/components/EclFormGroupComponent.html +1 -1
- package/docs/components/EclFormLabelComponent.html +1 -1
- package/docs/components/EclGalleryComponent.html +1 -1
- package/docs/components/EclGalleryFooterComponent.html +1 -1
- package/docs/components/EclGalleryItemComponent.html +1 -1
- package/docs/components/EclHighlightBoxComponent.html +1 -1
- package/docs/components/EclHighlightedSearchComponent.html +1 -1
- package/docs/components/EclIconComponent.html +1 -10
- package/docs/components/EclIndicatorComponent.html +1 -1
- package/docs/components/EclInpageNavigationComponent.html +1 -1
- package/docs/components/EclInpageNavigationItemComponent.html +1 -1
- package/docs/components/EclLayoutWrapperComponent.html +1 -1
- package/docs/components/EclListIllustrationComponent.html +1 -1
- package/docs/components/EclListIllustrationItemComponent.html +1 -1
- package/docs/components/EclLoadingIndicatorComponent.html +1 -1
- package/docs/components/EclMediaContainerComponent.html +1 -1
- package/docs/components/EclMegaMenuComponent.html +1 -1
- package/docs/components/EclMegaMenuFeaturedComponent.html +1 -1
- package/docs/components/EclMegaMenuInfoComponent.html +1 -1
- package/docs/components/EclMegaMenuItemComponent.html +1 -1
- package/docs/components/EclMegaMenuSubitemComponent.html +1 -1
- package/docs/components/EclMenuComponent.html +1 -1
- package/docs/components/EclMenuItemComponent.html +1 -1
- package/docs/components/EclMenuMegaComponent.html +1 -1
- package/docs/components/EclMenuMegaItemComponent.html +1 -1
- package/docs/components/EclModalBodyComponent.html +1 -1
- package/docs/components/EclModalComponent.html +1 -1
- package/docs/components/EclModalFooterComponent.html +1 -1
- package/docs/components/EclModalHeaderComponent.html +1 -1
- package/docs/components/EclMultiselectComponent.html +1 -1
- package/docs/components/EclMultiselectDropdownComponent.html +1 -1
- package/docs/components/EclMultiselectInputComponent.html +1 -1
- package/docs/components/EclMultiselectOptgroupComponent.html +1 -1
- package/docs/components/EclMultiselectOptionComponent.html +1 -1
- package/docs/components/EclNavigationListComponent.html +1 -1
- package/docs/components/EclNavigationListItemComponent.html +1 -1
- package/docs/components/EclNewsTickerComponent.html +1 -1
- package/docs/components/EclNewsTickerItemComponent.html +1 -1
- package/docs/components/EclNotificationComponent.html +1 -1
- package/docs/components/EclPageHeaderComponent.html +1 -1
- package/docs/components/EclPageHeaderDescriptionContainerComponent.html +1 -1
- package/docs/components/EclPageHeaderExpandableComponent.html +1 -1
- package/docs/components/EclPageHeaderSectionComponent.html +1 -1
- package/docs/components/EclPageHeaderSectionInfoComponent.html +1 -1
- package/docs/components/EclPageSummaryComponent.html +1 -1
- package/docs/components/EclPaginationComponent.html +1 -1
- package/docs/components/EclPaginationItemComponent.html +1 -1
- package/docs/components/EclPopoverComponent.html +1 -1
- package/docs/components/EclQuizCardComponent.html +113 -44
- package/docs/components/EclQuizComponent.html +4 -9
- package/docs/components/EclRadioLabelComponent.html +1 -1
- package/docs/components/EclRangeBubbleComponent.html +1 -1
- package/docs/components/EclRangeValueComponent.html +1 -1
- package/docs/components/EclRatingFieldComponent.html +1 -1
- package/docs/components/EclSearchFormComponent.html +1 -1
- package/docs/components/EclSelectContainerComponent.html +1 -1
- package/docs/components/EclSiteFooterComponent.html +1 -1
- package/docs/components/EclSiteFooterCoownerComponent.html +1 -1
- package/docs/components/EclSiteFooterCoreComponent.html +1 -1
- package/docs/components/EclSiteFooterFeedbackComponent.html +1 -1
- package/docs/components/EclSiteFooterFixedContentEUComponent.html +1 -1
- package/docs/components/EclSiteFooterRowCommonComponent.html +1 -1
- package/docs/components/EclSiteHeaderActionComponent.html +1 -1
- package/docs/components/EclSiteHeaderBannerTopComponent.html +1 -1
- package/docs/components/EclSiteHeaderComponent.html +1 -1
- package/docs/components/EclSiteHeaderCustomActionComponent.html +1 -1
- package/docs/components/EclSiteHeaderEnvironmentComponent.html +1 -1
- package/docs/components/EclSiteHeaderLanguageComponent.html +1 -1
- package/docs/components/EclSiteHeaderLanguagePopoverComponent.html +1 -1
- package/docs/components/EclSiteHeaderLoginComponent.html +1 -1
- package/docs/components/EclSiteHeaderNotificationComponent.html +1 -1
- package/docs/components/EclSiteHeaderSearchComponent.html +1 -1
- package/docs/components/EclSliderPagerComponent.html +1159 -0
- package/docs/components/EclSloganTickerComponent.html +1 -1
- package/docs/components/EclSocialMediaFollowComponent.html +1 -1
- package/docs/components/EclSocialMediaFollowItemComponent.html +1 -1
- package/docs/components/EclSplashPageComponent.html +1 -1
- package/docs/components/EclSplashPageLanguageCategoryComponent.html +1 -1
- package/docs/components/EclSplashPageLanguageContainerComponent.html +1 -1
- package/docs/components/EclSplashPageLanguageLinkComponent.html +1 -1
- package/docs/components/EclSpotlightComponent.html +1 -1
- package/docs/components/EclSpotlightLinkComponent.html +1 -1
- package/docs/components/EclStickyContainerComponent.html +1 -1
- package/docs/components/EclStoryCardComponent.html +4 -4
- package/docs/components/EclStoryCardGridDetailsComponent.html +57 -2
- package/docs/components/EclStoryCardItemComponent.html +77 -2
- package/docs/components/EclTabComponent.html +1 -1
- package/docs/components/EclTabLabelComponent.html +1 -1
- package/docs/components/EclTableSortButtonComponent.html +1 -1
- package/docs/components/EclTabsComponent.html +1 -1
- package/docs/components/EclTagComponent.html +1 -1
- package/docs/components/EclTextMediaComponent.html +1 -1
- package/docs/components/EclTimelineComponent.html +1 -1
- package/docs/components/EclTimelineItemComponent.html +1 -1
- package/docs/components/EclTimelineItemTogglerComponent.html +1 -1
- package/docs/js/menu-wc.js +3 -0
- package/docs/js/search/search_index.js +2 -2
- package/docs/json/EclCarouselComponent.md +8 -4
- package/docs/json/EclCarouselItemComponent.md +1 -0
- package/docs/json/EclQuizCardComponent.md +6 -3
- package/docs/json/EclSliderPagerComponent.md +55 -0
- package/docs/json/EclStoryCardGridDetailsComponent.md +1 -0
- package/docs/json/EclStoryCardItemComponent.md +1 -0
- package/docs/json/documentation.json +1889 -565
- package/docs/llms.txt +67 -32
- package/docs/miscellaneous/variables.html +112 -0
- package/docs/overview.html +1 -1
- package/docs/properties.html +1 -1
- package/fesm2022/eui-ecl-components-ecl-carousel.mjs +405 -407
- package/fesm2022/eui-ecl-components-ecl-carousel.mjs.map +1 -1
- package/fesm2022/eui-ecl-components-ecl-menu.mjs +15 -15
- package/fesm2022/eui-ecl-components-ecl-menu.mjs.map +1 -1
- package/fesm2022/eui-ecl-components-ecl-quiz.mjs +93 -55
- package/fesm2022/eui-ecl-components-ecl-quiz.mjs.map +1 -1
- package/fesm2022/eui-ecl-components-ecl-slider.mjs +187 -0
- package/fesm2022/eui-ecl-components-ecl-slider.mjs.map +1 -0
- package/fesm2022/eui-ecl-components-ecl-story-card.mjs +96 -18
- package/fesm2022/eui-ecl-components-ecl-story-card.mjs.map +1 -1
- package/package.json +18 -12
- package/types/eui-ecl-components-ecl-carousel.d.ts +234 -202
- package/types/eui-ecl-components-ecl-carousel.d.ts.map +1 -1
- package/types/eui-ecl-components-ecl-menu.d.ts +0 -2
- package/types/eui-ecl-components-ecl-menu.d.ts.map +1 -1
- package/types/eui-ecl-components-ecl-quiz.d.ts +94 -57
- package/types/eui-ecl-components-ecl-quiz.d.ts.map +1 -1
- package/types/eui-ecl-components-ecl-slider.d.ts +118 -0
- package/types/eui-ecl-components-ecl-slider.d.ts.map +1 -0
- package/types/eui-ecl-components-ecl-story-card.d.ts +78 -48
- package/types/eui-ecl-components-ecl-story-card.d.ts.map +1 -1
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { Directive, input, signal, output, contentChild, ElementRef, computed, ChangeDetectionStrategy, Component, booleanAttribute, inject, contentChildren,
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
2
|
+
import { Directive, input, signal, output, contentChild, ElementRef, viewChild, computed, ChangeDetectionStrategy, Component, effect, booleanAttribute, inject, contentChildren, viewChildren, afterNextRender, untracked } from '@angular/core';
|
|
3
|
+
import * as i1 from '@eui/ecl/components/ecl-slider';
|
|
4
|
+
import { EUI_ECL_SLIDER } from '@eui/ecl/components/ecl-slider';
|
|
5
|
+
import { ECLBaseDirective, EclRtlService, KeyCode } from '@eui/ecl/core';
|
|
6
|
+
import { TranslateService, TranslatePipe } from '@ngx-translate/core';
|
|
6
7
|
import { EmblaCarouselDirective } from 'embla-carousel-angular';
|
|
7
8
|
import { Subject, takeUntil } from 'rxjs';
|
|
8
9
|
import { toSignal, outputToObservable } from '@angular/core/rxjs-interop';
|
|
@@ -99,30 +100,44 @@ class EclStoryCardItemComponent extends ECLBaseDirective {
|
|
|
99
100
|
this.itemClick = output();
|
|
100
101
|
/** Emitted when the loading bar CSS animation ends, signalling to advance to the next item. */
|
|
101
102
|
this.loadingBarAnimationEnd = output();
|
|
103
|
+
/**
|
|
104
|
+
* Emitted when a keydown occurs on the tab button. The parent story card
|
|
105
|
+
* orchestrates keyboard navigation (arrows, Home, End) across all items.
|
|
106
|
+
*/
|
|
107
|
+
this.keydownTab = output();
|
|
102
108
|
/** Reference to the projected `picture[eclStoryCardPicture]` element for cloning into the mobile carousel. */
|
|
103
109
|
this.pictureRef = contentChild(EclStoryCardPictureDirective, { ...(ngDevMode ? { debugName: "pictureRef" } : /* istanbul ignore next */ {}), read: ElementRef });
|
|
110
|
+
this.buttonRef = viewChild('tabButton', /* @ts-ignore */
|
|
111
|
+
...(ngDevMode ? [{ debugName: "buttonRef" }] : /* istanbul ignore next */ []));
|
|
104
112
|
this.cssClasses = computed(() => [
|
|
105
113
|
super.getCssClasses('ecl-story-card__grid-item'),
|
|
106
114
|
this.isExpanded() ? 'ecl-story-card__grid-item--expanded' : '',
|
|
107
115
|
].join(' ').trim(), /* @ts-ignore */
|
|
108
116
|
...(ngDevMode ? [{ debugName: "cssClasses" }] : /* istanbul ignore next */ []));
|
|
109
117
|
}
|
|
118
|
+
/** Move focus to this item's tab button. Called by the parent during keyboard navigation. */
|
|
119
|
+
focusButton() {
|
|
120
|
+
this.buttonRef()?.nativeElement.focus();
|
|
121
|
+
}
|
|
110
122
|
onButtonClick() {
|
|
111
123
|
this.itemClick.emit(this.index());
|
|
112
124
|
}
|
|
113
125
|
onAnimationEnd() {
|
|
114
126
|
this.loadingBarAnimationEnd.emit();
|
|
115
127
|
}
|
|
128
|
+
onKeydown(event) {
|
|
129
|
+
this.keydownTab.emit(event);
|
|
130
|
+
}
|
|
116
131
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: EclStoryCardItemComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
117
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.2", type: EclStoryCardItemComponent, isStandalone: true, selector: "li[eclStoryCardItem]", inputs: { gridTitle: { classPropertyName: "gridTitle", publicName: "gridTitle", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: "itemClick", loadingBarAnimationEnd: "loadingBarAnimationEnd" }, host: { attributes: { "role": "presentation" }, properties: { "class": "cssClasses()" } }, queries: [{ propertyName: "pictureRef", first: true, predicate: EclStoryCardPictureDirective, descendants: true, read: ElementRef, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<button class=\"ecl-story-card__grid-card\"\n type=\"button\"\n [attr.id]=\"tabId()\"\n role=\"tab\"\n [attr.aria-selected]=\"isExpanded()\"\n [attr.aria-controls]=\"panelId()\"\n (click)=\"onButtonClick()\">\n <div class=\"ecl-story-card__grid-image\">\n <ng-content select=\"picture[eclStoryCardPicture]\"></ng-content>\n <div class=\"ecl-story-card__grid-loading-bar\">\n <div class=\"ecl-story-card__grid-loading-bar-completion\"\n [class.is-paused]=\"!isExpanded() || !isAutoPlaying()\"\n (animationend)=\"onAnimationEnd()\">\n </div>\n </div>\n </div>\n <div class=\"ecl-story-card__grid-title-wrapper\">\n @if (gridTitle()) {\n <div class=\"ecl-story-card__grid-title\">{{ gridTitle() }}</div>\n }\n </div>\n</button>\n", changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
132
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.2", type: EclStoryCardItemComponent, isStandalone: true, selector: "li[eclStoryCardItem]", inputs: { gridTitle: { classPropertyName: "gridTitle", publicName: "gridTitle", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: "itemClick", loadingBarAnimationEnd: "loadingBarAnimationEnd", keydownTab: "keydownTab" }, host: { attributes: { "role": "presentation" }, properties: { "class": "cssClasses()" } }, queries: [{ propertyName: "pictureRef", first: true, predicate: EclStoryCardPictureDirective, descendants: true, read: ElementRef, isSignal: true }], viewQueries: [{ propertyName: "buttonRef", first: true, predicate: ["tabButton"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<button class=\"ecl-story-card__grid-card\"\n #tabButton\n type=\"button\"\n [attr.id]=\"tabId()\"\n role=\"tab\"\n [attr.aria-selected]=\"isExpanded()\"\n [attr.aria-controls]=\"panelId()\"\n [attr.tabindex]=\"isExpanded() ? 0 : -1\"\n (click)=\"onButtonClick()\"\n (keydown)=\"onKeydown($event)\">\n <div class=\"ecl-story-card__grid-image\">\n <ng-content select=\"picture[eclStoryCardPicture]\"></ng-content>\n <div class=\"ecl-story-card__grid-loading-bar\">\n <div class=\"ecl-story-card__grid-loading-bar-completion\"\n [class.is-paused]=\"!isExpanded() || !isAutoPlaying()\"\n (animationend)=\"onAnimationEnd()\">\n </div>\n </div>\n </div>\n <div class=\"ecl-story-card__grid-title-wrapper\">\n @if (gridTitle()) {\n <div class=\"ecl-story-card__grid-title\">{{ gridTitle() }}</div>\n }\n </div>\n</button>\n", changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
118
133
|
}
|
|
119
134
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: EclStoryCardItemComponent, decorators: [{
|
|
120
135
|
type: Component,
|
|
121
136
|
args: [{ selector: 'li[eclStoryCardItem]', host: {
|
|
122
137
|
role: 'presentation',
|
|
123
138
|
'[class]': 'cssClasses()',
|
|
124
|
-
}, changeDetection: ChangeDetectionStrategy.OnPush, template: "<button class=\"ecl-story-card__grid-card\"\n type=\"button\"\n [attr.id]=\"tabId()\"\n role=\"tab\"\n [attr.aria-selected]=\"isExpanded()\"\n [attr.aria-controls]=\"panelId()\"\n (click)=\"onButtonClick()\">\n <div class=\"ecl-story-card__grid-image\">\n <ng-content select=\"picture[eclStoryCardPicture]\"></ng-content>\n <div class=\"ecl-story-card__grid-loading-bar\">\n <div class=\"ecl-story-card__grid-loading-bar-completion\"\n [class.is-paused]=\"!isExpanded() || !isAutoPlaying()\"\n (animationend)=\"onAnimationEnd()\">\n </div>\n </div>\n </div>\n <div class=\"ecl-story-card__grid-title-wrapper\">\n @if (gridTitle()) {\n <div class=\"ecl-story-card__grid-title\">{{ gridTitle() }}</div>\n }\n </div>\n</button>\n" }]
|
|
125
|
-
}], propDecorators: { gridTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "gridTitle", required: false }] }], itemClick: [{ type: i0.Output, args: ["itemClick"] }], loadingBarAnimationEnd: [{ type: i0.Output, args: ["loadingBarAnimationEnd"] }], pictureRef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => EclStoryCardPictureDirective), { ...{ read: ElementRef }, isSignal: true }] }] } });
|
|
139
|
+
}, changeDetection: ChangeDetectionStrategy.OnPush, template: "<button class=\"ecl-story-card__grid-card\"\n #tabButton\n type=\"button\"\n [attr.id]=\"tabId()\"\n role=\"tab\"\n [attr.aria-selected]=\"isExpanded()\"\n [attr.aria-controls]=\"panelId()\"\n [attr.tabindex]=\"isExpanded() ? 0 : -1\"\n (click)=\"onButtonClick()\"\n (keydown)=\"onKeydown($event)\">\n <div class=\"ecl-story-card__grid-image\">\n <ng-content select=\"picture[eclStoryCardPicture]\"></ng-content>\n <div class=\"ecl-story-card__grid-loading-bar\">\n <div class=\"ecl-story-card__grid-loading-bar-completion\"\n [class.is-paused]=\"!isExpanded() || !isAutoPlaying()\"\n (animationend)=\"onAnimationEnd()\">\n </div>\n </div>\n </div>\n <div class=\"ecl-story-card__grid-title-wrapper\">\n @if (gridTitle()) {\n <div class=\"ecl-story-card__grid-title\">{{ gridTitle() }}</div>\n }\n </div>\n</button>\n" }]
|
|
140
|
+
}], propDecorators: { gridTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "gridTitle", required: false }] }], itemClick: [{ type: i0.Output, args: ["itemClick"] }], loadingBarAnimationEnd: [{ type: i0.Output, args: ["loadingBarAnimationEnd"] }], keydownTab: [{ type: i0.Output, args: ["keydownTab"] }], pictureRef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => EclStoryCardPictureDirective), { ...{ read: ElementRef }, isSignal: true }] }], buttonRef: [{ type: i0.ViewChild, args: ['tabButton', { isSignal: true }] }] } });
|
|
126
141
|
|
|
127
142
|
/**
|
|
128
143
|
* Details panel sub-component (`tabpanel` role) within the ECL Story Card grid accordion.
|
|
@@ -137,7 +152,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImpor
|
|
|
137
152
|
*/
|
|
138
153
|
class EclStoryCardGridDetailsComponent extends ECLBaseDirective {
|
|
139
154
|
constructor() {
|
|
140
|
-
super(
|
|
155
|
+
super();
|
|
156
|
+
/** Optional teaser label shown above the title. Hidden by CSS in the testimonial variant. */
|
|
157
|
+
this.teaserLabel = input('', /* @ts-ignore */
|
|
158
|
+
...(ngDevMode ? [{ debugName: "teaserLabel" }] : /* istanbul ignore next */ []));
|
|
141
159
|
/** Title shown in the details panel. */
|
|
142
160
|
this.eclTitle = input('', /* @ts-ignore */
|
|
143
161
|
...(ngDevMode ? [{ debugName: "eclTitle" }] : /* istanbul ignore next */ []));
|
|
@@ -170,9 +188,19 @@ class EclStoryCardGridDetailsComponent extends ECLBaseDirective {
|
|
|
170
188
|
...(ngDevMode ? [{ debugName: "tabId" }] : /* istanbul ignore next */ []));
|
|
171
189
|
/** Reference to the projected `[eclStoryCardLink]` element for cloning into the mobile carousel. */
|
|
172
190
|
this.linkRef = contentChild(EclStoryCardLinkDirective, { ...(ngDevMode ? { debugName: "linkRef" } : /* istanbul ignore next */ {}), read: ElementRef });
|
|
191
|
+
// Associate the "Read more" link with its corresponding tab so assistive
|
|
192
|
+
// technologies announce the tab label as context for the link.
|
|
193
|
+
// Set before the parent clones the link into the carousel slide.
|
|
194
|
+
effect(() => {
|
|
195
|
+
const link = this.linkRef();
|
|
196
|
+
const tabId = this.tabId();
|
|
197
|
+
if (link && tabId) {
|
|
198
|
+
link.nativeElement.setAttribute('aria-describedby', tabId);
|
|
199
|
+
}
|
|
200
|
+
});
|
|
173
201
|
}
|
|
174
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: EclStoryCardGridDetailsComponent, deps:
|
|
175
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.2", type: EclStoryCardGridDetailsComponent, isStandalone: true, selector: "[eclStoryCardGridDetails]", inputs: { eclTitle: { classPropertyName: "eclTitle", publicName: "eclTitle", isSignal: true, isRequired: false, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null }, author: { classPropertyName: "author", publicName: "author", isSignal: true, isRequired: false, transformFunction: null }, role: { classPropertyName: "role", publicName: "role", isSignal: true, isRequired: false, transformFunction: null }, source: { classPropertyName: "source", publicName: "source", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "getCssClasses(\"ecl-story-card__grid-details\")", "attr.id": "panelId()", "attr.role": "\"tabpanel\"", "attr.aria-labelledby": "tabId()", "hidden": "!isActive()" } }, queries: [{ propertyName: "linkRef", first: true, predicate: EclStoryCardLinkDirective, descendants: true, read: ElementRef, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<article class=\"ecl-story-card__grid-details-content\">\n <div class=\"ecl-story-card__content\">\n @if (isTestimonial()) {\n <div class=\"ecl-story-card__content-icon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"45\" viewBox=\"0 0 22 45\" fill=\"none\">\n <path d=\"M0 0H22V23.3143L0 44.5714V0Z\" fill=\"currentColor\"/>\n </svg>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"45\" viewBox=\"0 0 22 45\" fill=\"none\">\n <path d=\"M0 0H22V23.3143L0 44.5714V0Z\" fill=\"currentColor\"/>\n </svg>\n </div>\n }\n @if (eclTitle()) {\n <div class=\"ecl-story-card__card-title\">{{ eclTitle() }}</div>\n }\n @if (author() || role() || source()) {\n <div class=\"ecl-story-card__testimonial\">\n @if (author()) {\n <span class=\"ecl-story-card__author\">{{ author() }}</span>\n }\n @if (role()) {\n <span class=\"ecl-story-card__role\">{{ role() }}</span>\n }\n @if (source()) {\n <cite class=\"ecl-story-card__source\">{{ source() }}</cite>\n }\n </div>\n }\n @if (description()) {\n <div class=\"ecl-story-card__card-description\">{{ description() }}</div>\n }\n <ng-content select=\"[eclStoryCardLink]\"></ng-content>\n </div>\n</article>\n", changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
202
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: EclStoryCardGridDetailsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
203
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.2", type: EclStoryCardGridDetailsComponent, isStandalone: true, selector: "[eclStoryCardGridDetails]", inputs: { teaserLabel: { classPropertyName: "teaserLabel", publicName: "teaserLabel", isSignal: true, isRequired: false, transformFunction: null }, eclTitle: { classPropertyName: "eclTitle", publicName: "eclTitle", isSignal: true, isRequired: false, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null }, author: { classPropertyName: "author", publicName: "author", isSignal: true, isRequired: false, transformFunction: null }, role: { classPropertyName: "role", publicName: "role", isSignal: true, isRequired: false, transformFunction: null }, source: { classPropertyName: "source", publicName: "source", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "getCssClasses(\"ecl-story-card__grid-details\")", "attr.id": "panelId()", "attr.role": "\"tabpanel\"", "attr.aria-labelledby": "tabId()", "attr.tabindex": "isActive() ? 0 : -1", "hidden": "!isActive()" } }, queries: [{ propertyName: "linkRef", first: true, predicate: EclStoryCardLinkDirective, descendants: true, read: ElementRef, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<article class=\"ecl-story-card__grid-details-content\">\n <div class=\"ecl-story-card__content\">\n @if (isTestimonial()) {\n <div class=\"ecl-story-card__content-icon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"45\" viewBox=\"0 0 22 45\" fill=\"none\">\n <path d=\"M0 0H22V23.3143L0 44.5714V0Z\" fill=\"currentColor\"/>\n </svg>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"45\" viewBox=\"0 0 22 45\" fill=\"none\">\n <path d=\"M0 0H22V23.3143L0 44.5714V0Z\" fill=\"currentColor\"/>\n </svg>\n </div>\n }\n @if (teaserLabel()) {\n <div class=\"ecl-story-card__teaser-label\">{{ teaserLabel() }}</div>\n }\n @if (eclTitle()) {\n <div class=\"ecl-story-card__card-title\">{{ eclTitle() }}</div>\n }\n @if (author() || role() || source()) {\n <div class=\"ecl-story-card__testimonial\">\n @if (author()) {\n <span class=\"ecl-story-card__author\">{{ author() }}</span>\n }\n @if (role()) {\n <span class=\"ecl-story-card__role\">{{ role() }}</span>\n }\n @if (source()) {\n <cite class=\"ecl-story-card__source\">{{ source() }}</cite>\n }\n </div>\n }\n @if (description()) {\n <div class=\"ecl-story-card__card-description\">{{ description() }}</div>\n }\n <ng-content select=\"[eclStoryCardLink]\"></ng-content>\n </div>\n</article>\n", changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
176
204
|
}
|
|
177
205
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: EclStoryCardGridDetailsComponent, decorators: [{
|
|
178
206
|
type: Component,
|
|
@@ -181,9 +209,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImpor
|
|
|
181
209
|
'[attr.id]': 'panelId()',
|
|
182
210
|
'[attr.role]': '"tabpanel"',
|
|
183
211
|
'[attr.aria-labelledby]': 'tabId()',
|
|
212
|
+
'[attr.tabindex]': 'isActive() ? 0 : -1',
|
|
184
213
|
'[hidden]': '!isActive()',
|
|
185
|
-
}, changeDetection: ChangeDetectionStrategy.OnPush, template: "<article class=\"ecl-story-card__grid-details-content\">\n <div class=\"ecl-story-card__content\">\n @if (isTestimonial()) {\n <div class=\"ecl-story-card__content-icon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"45\" viewBox=\"0 0 22 45\" fill=\"none\">\n <path d=\"M0 0H22V23.3143L0 44.5714V0Z\" fill=\"currentColor\"/>\n </svg>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"45\" viewBox=\"0 0 22 45\" fill=\"none\">\n <path d=\"M0 0H22V23.3143L0 44.5714V0Z\" fill=\"currentColor\"/>\n </svg>\n </div>\n }\n @if (eclTitle()) {\n <div class=\"ecl-story-card__card-title\">{{ eclTitle() }}</div>\n }\n @if (author() || role() || source()) {\n <div class=\"ecl-story-card__testimonial\">\n @if (author()) {\n <span class=\"ecl-story-card__author\">{{ author() }}</span>\n }\n @if (role()) {\n <span class=\"ecl-story-card__role\">{{ role() }}</span>\n }\n @if (source()) {\n <cite class=\"ecl-story-card__source\">{{ source() }}</cite>\n }\n </div>\n }\n @if (description()) {\n <div class=\"ecl-story-card__card-description\">{{ description() }}</div>\n }\n <ng-content select=\"[eclStoryCardLink]\"></ng-content>\n </div>\n</article>\n" }]
|
|
186
|
-
}], propDecorators: { eclTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "eclTitle", required: false }] }], description: [{ type: i0.Input, args: [{ isSignal: true, alias: "description", required: false }] }], author: [{ type: i0.Input, args: [{ isSignal: true, alias: "author", required: false }] }], role: [{ type: i0.Input, args: [{ isSignal: true, alias: "role", required: false }] }], source: [{ type: i0.Input, args: [{ isSignal: true, alias: "source", required: false }] }], linkRef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => EclStoryCardLinkDirective), { ...{ read: ElementRef }, isSignal: true }] }] } });
|
|
214
|
+
}, changeDetection: ChangeDetectionStrategy.OnPush, template: "<article class=\"ecl-story-card__grid-details-content\">\n <div class=\"ecl-story-card__content\">\n @if (isTestimonial()) {\n <div class=\"ecl-story-card__content-icon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"45\" viewBox=\"0 0 22 45\" fill=\"none\">\n <path d=\"M0 0H22V23.3143L0 44.5714V0Z\" fill=\"currentColor\"/>\n </svg>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"45\" viewBox=\"0 0 22 45\" fill=\"none\">\n <path d=\"M0 0H22V23.3143L0 44.5714V0Z\" fill=\"currentColor\"/>\n </svg>\n </div>\n }\n @if (teaserLabel()) {\n <div class=\"ecl-story-card__teaser-label\">{{ teaserLabel() }}</div>\n }\n @if (eclTitle()) {\n <div class=\"ecl-story-card__card-title\">{{ eclTitle() }}</div>\n }\n @if (author() || role() || source()) {\n <div class=\"ecl-story-card__testimonial\">\n @if (author()) {\n <span class=\"ecl-story-card__author\">{{ author() }}</span>\n }\n @if (role()) {\n <span class=\"ecl-story-card__role\">{{ role() }}</span>\n }\n @if (source()) {\n <cite class=\"ecl-story-card__source\">{{ source() }}</cite>\n }\n </div>\n }\n @if (description()) {\n <div class=\"ecl-story-card__card-description\">{{ description() }}</div>\n }\n <ng-content select=\"[eclStoryCardLink]\"></ng-content>\n </div>\n</article>\n" }]
|
|
215
|
+
}], ctorParameters: () => [], propDecorators: { teaserLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "teaserLabel", required: false }] }], eclTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "eclTitle", required: false }] }], description: [{ type: i0.Input, args: [{ isSignal: true, alias: "description", required: false }] }], author: [{ type: i0.Input, args: [{ isSignal: true, alias: "author", required: false }] }], role: [{ type: i0.Input, args: [{ isSignal: true, alias: "role", required: false }] }], source: [{ type: i0.Input, args: [{ isSignal: true, alias: "source", required: false }] }], linkRef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => EclStoryCardLinkDirective), { ...{ read: ElementRef }, isSignal: true }] }] } });
|
|
187
216
|
|
|
188
217
|
/**
|
|
189
218
|
* ECL Story Card component that presents a collection of stories or testimonials in a
|
|
@@ -221,11 +250,10 @@ class EclStoryCardComponent extends ECLBaseDirective {
|
|
|
221
250
|
/** Emitted when the active grid item index changes. Payload: `{ index: number }`. */
|
|
222
251
|
this.selectionChange = output();
|
|
223
252
|
this.eclRtlService = inject(EclRtlService);
|
|
253
|
+
this.translate = inject(TranslateService);
|
|
224
254
|
this.generatedId = `story-card-${crypto.randomUUID().slice(0, 8)}`;
|
|
225
255
|
this.componentId = computed(() => this.eclId() || this.generatedId, /* @ts-ignore */
|
|
226
256
|
...(ngDevMode ? [{ debugName: "componentId" }] : /* istanbul ignore next */ []));
|
|
227
|
-
this.titleId = computed(() => `${this.componentId()}-title`, /* @ts-ignore */
|
|
228
|
-
...(ngDevMode ? [{ debugName: "titleId" }] : /* istanbul ignore next */ []));
|
|
229
257
|
/** Current RTL state, derived reactively from the RTL service. */
|
|
230
258
|
this.isRtl = toSignal(this.eclRtlService.currentRtlState$, { initialValue: false });
|
|
231
259
|
/** Embla carousel options. Direction tracks the RTL state reactively. */
|
|
@@ -271,6 +299,18 @@ class EclStoryCardComponent extends ECLBaseDirective {
|
|
|
271
299
|
...(ngDevMode ? [{ debugName: "cssClasses" }] : /* istanbul ignore next */ []));
|
|
272
300
|
this.slideDuration = computed(() => `${this.autoplayDelay()}ms`, /* @ts-ignore */
|
|
273
301
|
...(ngDevMode ? [{ debugName: "slideDuration" }] : /* istanbul ignore next */ []));
|
|
302
|
+
/**
|
|
303
|
+
* Pre-translated accessible label for each carousel dot, passed to the shared
|
|
304
|
+
* slider pager. Translated here since the pager receives plain strings.
|
|
305
|
+
*/
|
|
306
|
+
this.dotAriaLabels = computed(() => {
|
|
307
|
+
const total = this.totalSlides();
|
|
308
|
+
return Array.from({ length: total }, (_unused, dotIndex) => this.translate.instant('ecl.story-card.GO-TO-SLIDE', {
|
|
309
|
+
current: dotIndex + 1,
|
|
310
|
+
total,
|
|
311
|
+
}));
|
|
312
|
+
}, /* @ts-ignore */
|
|
313
|
+
...(ngDevMode ? [{ debugName: "dotAriaLabels" }] : /* istanbul ignore next */ []));
|
|
274
314
|
afterNextRender(() => {
|
|
275
315
|
setTimeout(() => this.clonePicturesToCarousel());
|
|
276
316
|
});
|
|
@@ -302,6 +342,7 @@ class EclStoryCardComponent extends ECLBaseDirective {
|
|
|
302
342
|
item.isAutoPlaying.set(this.isAutoPlaying());
|
|
303
343
|
outputToObservable(item.itemClick).pipe(takeUntil(this.setupTeardown$)).subscribe((index) => this.onGridItemClick(index));
|
|
304
344
|
outputToObservable(item.loadingBarAnimationEnd).pipe(takeUntil(this.setupTeardown$)).subscribe(() => this.onLoadingBarAnimationEnd());
|
|
345
|
+
outputToObservable(item.keydownTab).pipe(takeUntil(this.setupTeardown$)).subscribe((event) => this.onGridItemKeydown(event, i));
|
|
305
346
|
});
|
|
306
347
|
detailsArray.forEach((panel, i) => {
|
|
307
348
|
panel.index.set(i);
|
|
@@ -351,6 +392,44 @@ class EclStoryCardComponent extends ECLBaseDirective {
|
|
|
351
392
|
onGridNextClick() {
|
|
352
393
|
this.setGridItem(this.expandedIndex() + 1);
|
|
353
394
|
}
|
|
395
|
+
/**
|
|
396
|
+
* Orchestrates keyboard navigation across the grid tablist (WAI-ARIA tabs
|
|
397
|
+
* pattern). Moves focus only; selection still happens on click/Enter.
|
|
398
|
+
*
|
|
399
|
+
* - ArrowRight: focus the next tab, wrapping to the first.
|
|
400
|
+
* - ArrowLeft: focus the previous tab, wrapping to the last.
|
|
401
|
+
* - Home: focus the first tab.
|
|
402
|
+
* - End: focus the last tab.
|
|
403
|
+
*
|
|
404
|
+
* @param event the originating keydown from the focused item's button
|
|
405
|
+
* @param index the index of the item that emitted the event
|
|
406
|
+
*/
|
|
407
|
+
onGridItemKeydown(event, index) {
|
|
408
|
+
const itemsArray = this.items();
|
|
409
|
+
const count = itemsArray.length;
|
|
410
|
+
if (count === 0) {
|
|
411
|
+
return;
|
|
412
|
+
}
|
|
413
|
+
let targetIndex = null;
|
|
414
|
+
switch (event.key) {
|
|
415
|
+
case KeyCode.ARROW_RIGHT:
|
|
416
|
+
targetIndex = (index + 1) % count;
|
|
417
|
+
break;
|
|
418
|
+
case KeyCode.ARROW_LEFT:
|
|
419
|
+
targetIndex = (index - 1 + count) % count;
|
|
420
|
+
break;
|
|
421
|
+
case KeyCode.HOME:
|
|
422
|
+
targetIndex = 0;
|
|
423
|
+
break;
|
|
424
|
+
case KeyCode.END:
|
|
425
|
+
targetIndex = count - 1;
|
|
426
|
+
break;
|
|
427
|
+
default:
|
|
428
|
+
return;
|
|
429
|
+
}
|
|
430
|
+
event.preventDefault();
|
|
431
|
+
itemsArray[targetIndex]?.focusButton();
|
|
432
|
+
}
|
|
354
433
|
/** Handle animation end on the loading bar (advance to next). */
|
|
355
434
|
onLoadingBarAnimationEnd() {
|
|
356
435
|
if (this.isAutoPlaying()) {
|
|
@@ -432,20 +511,19 @@ class EclStoryCardComponent extends ECLBaseDirective {
|
|
|
432
511
|
return Array.from({ length: this.totalSlides() }, (_, i) => i);
|
|
433
512
|
}
|
|
434
513
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: EclStoryCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
435
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.2", type: EclStoryCardComponent, isStandalone: true, selector: "section[eclStoryCard]", inputs: { eclTitle: { classPropertyName: "eclTitle", publicName: "eclTitle", isSignal: true, isRequired: false, transformFunction: null }, eclDescription: { classPropertyName: "eclDescription", publicName: "eclDescription", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, isAutoplay: { classPropertyName: "isAutoplay", publicName: "isAutoplay", isSignal: true, isRequired: false, transformFunction: null }, autoplayDelay: { classPropertyName: "autoplayDelay", publicName: "autoplayDelay", isSignal: true, isRequired: false, transformFunction: null }, eclId: { classPropertyName: "eclId", publicName: "id", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectionChange: "selectionChange" }, host: { properties: { "id": "componentId()", "class": "cssClasses()", "
|
|
514
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.2", type: EclStoryCardComponent, isStandalone: true, selector: "section[eclStoryCard]", inputs: { eclTitle: { classPropertyName: "eclTitle", publicName: "eclTitle", isSignal: true, isRequired: false, transformFunction: null }, eclDescription: { classPropertyName: "eclDescription", publicName: "eclDescription", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, isAutoplay: { classPropertyName: "isAutoplay", publicName: "isAutoplay", isSignal: true, isRequired: false, transformFunction: null }, autoplayDelay: { classPropertyName: "autoplayDelay", publicName: "autoplayDelay", isSignal: true, isRequired: false, transformFunction: null }, eclId: { classPropertyName: "eclId", publicName: "id", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectionChange: "selectionChange" }, host: { properties: { "id": "componentId()", "class": "cssClasses()", "style.--ecl-story-card-slide-duration": "slideDuration()" } }, queries: [{ propertyName: "items", predicate: EclStoryCardItemComponent, descendants: true, isSignal: true }, { propertyName: "detailsPanels", predicate: EclStoryCardGridDetailsComponent, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "emblaRef", first: true, predicate: EmblaCarouselDirective, descendants: true, isSignal: true }, { propertyName: "carouselImageWrappers", predicate: ["carouselImageWrapper"], descendants: true, isSignal: true }, { propertyName: "carouselContentWrappers", predicate: ["carouselContentWrapper"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "@if (eclTitle() || eclDescription()) {\n<div class=\"ecl-story-card__header\">\n @if (eclTitle()) {\n <div class=\"ecl-story-card__title\">{{ eclTitle() }}</div>\n }\n @if (eclDescription()) {\n <div class=\"ecl-story-card__description\">{{ eclDescription() }}</div>\n }\n</div>\n}\n\n<!-- Mobile: Embla Carousel (auto-generated from items + details) -->\n<div class=\"ecl-story-card__carousel\">\n <div class=\"ecl-story-card__carousel-viewport\"\n role=\"region\"\n [attr.aria-label]=\"'ecl.story-card.SLIDER-LABEL' | translate\"\n emblaCarousel\n [options]=\"emblaOptions()\"\n [subscribeToEvents]=\"subscribeToEvents\"\n (emblaChange)=\"onEmblaChange($event)\">\n <ul class=\"ecl-story-card__carousel-container\">\n @for (item of items(); track i; let i = $index) {\n <li class=\"ecl-story-card__carousel-slide\"\n [attr.aria-hidden]=\"i !== activeSlideIndex() ? true : null\">\n <article class=\"ecl-story-card__card\">\n <div class=\"ecl-story-card__image-wrapper\" #carouselImageWrapper>\n </div>\n <div class=\"ecl-story-card__content\" #carouselContentWrapper>\n @if (detailsPanels()[i]; as panel) {\n @if (panel.teaserLabel()) {\n <div class=\"ecl-story-card__teaser-label\">{{ panel.teaserLabel() }}</div>\n }\n @if (panel.eclTitle()) {\n <div class=\"ecl-story-card__card-title\">{{ panel.eclTitle() }}</div>\n }\n @if (panel.description()) {\n <div class=\"ecl-story-card__card-description\">{{ panel.description() }}</div>\n }\n }\n </div>\n </article>\n </li>\n }\n </ul>\n </div>\n\n <!-- Carousel Controls -->\n @if (totalSlides() > 1) {\n <ecl-slider-pager\n class=\"ecl-story-card__pager\"\n variant=\"dots\"\n size=\"s\"\n prevExtraClasses=\"ecl-story-card__prev\"\n nextExtraClasses=\"ecl-story-card__next\"\n dotsExtraClasses=\"ecl-story-card__dots\"\n dotExtraClasses=\"ecl-story-card__dot\"\n [activeIndex]=\"activeSlideIndex()\"\n [isPrevDisabled]=\"prevDisabled()\"\n [isNextDisabled]=\"nextDisabled()\"\n [dotIndices]=\"getDotIndices()\"\n [dotAriaLabels]=\"dotAriaLabels()\"\n (prev)=\"onCarouselPrevClick()\"\n (next)=\"onCarouselNextClick()\"\n (goTo)=\"goToSlide($event)\">\n </ecl-slider-pager>\n }\n</div>\n\n<!-- Desktop: Grid with Accordion (user-authored content projected here) -->\n<div class=\"ecl-story-card__grid\">\n <!-- Grid Controls -->\n @if (totalSlides() > 1) {\n <ecl-slider-pager\n class=\"ecl-story-card__grid-controls\"\n variant=\"play-pause\"\n size=\"l\"\n [isPlaying]=\"isAutoPlaying()\"\n prevExtraClasses=\"ecl-story-card__grid-prev\"\n nextExtraClasses=\"ecl-story-card__grid-next\"\n playExtraClasses=\"ecl-story-card__grid-play\"\n pauseExtraClasses=\"ecl-story-card__grid-pause\"\n (prev)=\"onGridPrevClick()\"\n (next)=\"onGridNextClick()\"\n (play)=\"onPlayClick()\"\n (pause)=\"onPauseClick()\">\n </ecl-slider-pager>\n }\n\n <ng-content select=\"ul[eclStoryCardList]\"></ng-content>\n <ng-content select=\"[eclStoryCardGridDetails]\"></ng-content>\n</div>\n", dependencies: [{ kind: "component", type: i1.EclSliderPagerComponent, selector: "ecl-slider-pager", inputs: ["size", "variant", "isPlaying", "isPrevDisabled", "isNextDisabled", "activeIndex", "dotIndices", "dotAriaLabels", "prevExtraClasses", "nextExtraClasses", "dotsExtraClasses", "dotExtraClasses", "playExtraClasses", "pauseExtraClasses"], outputs: ["prev", "next", "goTo", "play", "pause"] }, { kind: "directive", type: EmblaCarouselDirective, selector: "[emblaCarousel]", inputs: ["options", "plugins", "subscribeToEvents", "eventsThrottleTime"], outputs: ["emblaChange"], exportAs: ["emblaCarousel"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
436
515
|
}
|
|
437
516
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: EclStoryCardComponent, decorators: [{
|
|
438
517
|
type: Component,
|
|
439
518
|
args: [{ selector: 'section[eclStoryCard]', host: {
|
|
440
519
|
'[id]': 'componentId()',
|
|
441
520
|
'[class]': 'cssClasses()',
|
|
442
|
-
'[attr.aria-labelledby]': 'titleId()',
|
|
443
521
|
'[style.--ecl-story-card-slide-duration]': 'slideDuration()',
|
|
444
522
|
}, imports: [
|
|
445
523
|
TranslatePipe,
|
|
446
|
-
|
|
524
|
+
...EUI_ECL_SLIDER,
|
|
447
525
|
EmblaCarouselDirective,
|
|
448
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (eclTitle() || eclDescription()) {\n<div class=\"ecl-story-card__header\">\n @if (eclTitle()) {\n <div class=\"ecl-story-card__title\"
|
|
526
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (eclTitle() || eclDescription()) {\n<div class=\"ecl-story-card__header\">\n @if (eclTitle()) {\n <div class=\"ecl-story-card__title\">{{ eclTitle() }}</div>\n }\n @if (eclDescription()) {\n <div class=\"ecl-story-card__description\">{{ eclDescription() }}</div>\n }\n</div>\n}\n\n<!-- Mobile: Embla Carousel (auto-generated from items + details) -->\n<div class=\"ecl-story-card__carousel\">\n <div class=\"ecl-story-card__carousel-viewport\"\n role=\"region\"\n [attr.aria-label]=\"'ecl.story-card.SLIDER-LABEL' | translate\"\n emblaCarousel\n [options]=\"emblaOptions()\"\n [subscribeToEvents]=\"subscribeToEvents\"\n (emblaChange)=\"onEmblaChange($event)\">\n <ul class=\"ecl-story-card__carousel-container\">\n @for (item of items(); track i; let i = $index) {\n <li class=\"ecl-story-card__carousel-slide\"\n [attr.aria-hidden]=\"i !== activeSlideIndex() ? true : null\">\n <article class=\"ecl-story-card__card\">\n <div class=\"ecl-story-card__image-wrapper\" #carouselImageWrapper>\n </div>\n <div class=\"ecl-story-card__content\" #carouselContentWrapper>\n @if (detailsPanels()[i]; as panel) {\n @if (panel.teaserLabel()) {\n <div class=\"ecl-story-card__teaser-label\">{{ panel.teaserLabel() }}</div>\n }\n @if (panel.eclTitle()) {\n <div class=\"ecl-story-card__card-title\">{{ panel.eclTitle() }}</div>\n }\n @if (panel.description()) {\n <div class=\"ecl-story-card__card-description\">{{ panel.description() }}</div>\n }\n }\n </div>\n </article>\n </li>\n }\n </ul>\n </div>\n\n <!-- Carousel Controls -->\n @if (totalSlides() > 1) {\n <ecl-slider-pager\n class=\"ecl-story-card__pager\"\n variant=\"dots\"\n size=\"s\"\n prevExtraClasses=\"ecl-story-card__prev\"\n nextExtraClasses=\"ecl-story-card__next\"\n dotsExtraClasses=\"ecl-story-card__dots\"\n dotExtraClasses=\"ecl-story-card__dot\"\n [activeIndex]=\"activeSlideIndex()\"\n [isPrevDisabled]=\"prevDisabled()\"\n [isNextDisabled]=\"nextDisabled()\"\n [dotIndices]=\"getDotIndices()\"\n [dotAriaLabels]=\"dotAriaLabels()\"\n (prev)=\"onCarouselPrevClick()\"\n (next)=\"onCarouselNextClick()\"\n (goTo)=\"goToSlide($event)\">\n </ecl-slider-pager>\n }\n</div>\n\n<!-- Desktop: Grid with Accordion (user-authored content projected here) -->\n<div class=\"ecl-story-card__grid\">\n <!-- Grid Controls -->\n @if (totalSlides() > 1) {\n <ecl-slider-pager\n class=\"ecl-story-card__grid-controls\"\n variant=\"play-pause\"\n size=\"l\"\n [isPlaying]=\"isAutoPlaying()\"\n prevExtraClasses=\"ecl-story-card__grid-prev\"\n nextExtraClasses=\"ecl-story-card__grid-next\"\n playExtraClasses=\"ecl-story-card__grid-play\"\n pauseExtraClasses=\"ecl-story-card__grid-pause\"\n (prev)=\"onGridPrevClick()\"\n (next)=\"onGridNextClick()\"\n (play)=\"onPlayClick()\"\n (pause)=\"onPauseClick()\">\n </ecl-slider-pager>\n }\n\n <ng-content select=\"ul[eclStoryCardList]\"></ng-content>\n <ng-content select=\"[eclStoryCardGridDetails]\"></ng-content>\n</div>\n" }]
|
|
449
527
|
}], ctorParameters: () => [], propDecorators: { eclTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "eclTitle", required: false }] }], eclDescription: [{ type: i0.Input, args: [{ isSignal: true, alias: "eclDescription", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], isAutoplay: [{ type: i0.Input, args: [{ isSignal: true, alias: "isAutoplay", required: false }] }], autoplayDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoplayDelay", required: false }] }], eclId: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], items: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => EclStoryCardItemComponent), { ...{ descendants: true }, isSignal: true }] }], detailsPanels: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => EclStoryCardGridDetailsComponent), { ...{ descendants: true }, isSignal: true }] }], emblaRef: [{ type: i0.ViewChild, args: [i0.forwardRef(() => EmblaCarouselDirective), { isSignal: true }] }], carouselImageWrappers: [{ type: i0.ViewChildren, args: ['carouselImageWrapper', { isSignal: true }] }], carouselContentWrappers: [{ type: i0.ViewChildren, args: ['carouselContentWrapper', { isSignal: true }] }] } });
|
|
450
528
|
|
|
451
529
|
const EUI_ECL_STORY_CARD = [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eui-ecl-components-ecl-story-card.mjs","sources":["../../components/ecl-story-card/ecl-story-card-directives.ts","../../components/ecl-story-card/ecl-story-card-item/ecl-story-card-item.component.ts","../../components/ecl-story-card/ecl-story-card-item/ecl-story-card-item.component.html","../../components/ecl-story-card/ecl-story-card-grid-details/ecl-story-card-grid-details.component.ts","../../components/ecl-story-card/ecl-story-card-grid-details/ecl-story-card-grid-details.component.html","../../components/ecl-story-card/ecl-story-card.component.ts","../../components/ecl-story-card/ecl-story-card.component.html","../../components/ecl-story-card/index.ts","../../components/ecl-story-card/eui-ecl-components-ecl-story-card.ts"],"sourcesContent":["import { Directive } from '@angular/core';\nimport { ECLBaseDirective } from '@eui/ecl/core';\n\n/**\n * Directive applied to the <ul> element that holds the story card items.\n * Adds the grid container class and tablist role.\n */\n@Directive({\n selector: 'ul[eclStoryCardList]',\n host: {\n role: 'tablist',\n '[class]': 'getCssClasses(\"ecl-story-card__grid-container\")',\n },\n})\nexport class EclStoryCardListDirective extends ECLBaseDirective {}\n\n/**\n * Directive applied to <picture> elements inside a story card item.\n * Adds the ECL picture classes.\n */\n@Directive({\n selector: 'picture[eclStoryCardPicture]',\n host: {\n '[class]': 'getCssClasses(\"ecl-picture ecl-story-card__picture\")',\n },\n})\nexport class EclStoryCardPictureDirective extends ECLBaseDirective {}\n\n/**\n * Directive applied to <a> elements inside story card grid details.\n * Adds the ECL link classes for the \"Read more\" link.\n */\n@Directive({\n selector: '[eclStoryCardLink]',\n host: {\n '[class]': 'getCssClasses(\"ecl-link ecl-link--standalone ecl-link--icon ecl-story-card__link\")',\n },\n})\nexport class EclStoryCardLinkDirective extends ECLBaseDirective {}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n ElementRef,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { ECLBaseDirective } from '@eui/ecl/core';\nimport { EclStoryCardPictureDirective } from '../ecl-story-card-directives';\n\n/**\n * Individual grid item (tab role) within the ECL Story Card desktop accordion.\n * Applied to `<li>` elements inside `ul[eclStoryCardList]`.\n * Renders the accordion tab button with the loading bar animation.\n * For the mobile carousel, the parent `EclStoryCardComponent` clones the projected\n * `picture[eclStoryCardPicture]` into the carousel slide via `pictureRef`.\n *\n * - Selector: `li[eclStoryCardItem]`.\n * - `gridTitle` is the short label shown in the tab button.\n * - `isExpanded`, `isAutoPlaying`, `index`, `tabId`, and `panelId` are writable signals\n * set by the parent `EclStoryCardComponent` during grid setup.\n * - Emits `itemClick` (with item index) when the tab button is clicked.\n * - Emits `loadingBarAnimationEnd` when the autoplay loading bar animation finishes.\n */\n@Component({\n selector: 'li[eclStoryCardItem]',\n templateUrl: './ecl-story-card-item.component.html',\n host: {\n role: 'presentation',\n '[class]': 'cssClasses()',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EclStoryCardItemComponent extends ECLBaseDirective {\n\n /** Short title displayed in the accordion tab button. */\n gridTitle = input<string>('');\n\n /** Whether this item is currently expanded/selected. Set by the parent `EclStoryCardComponent`. */\n isExpanded = signal(false);\n\n /** Whether autoplay is active for this item (controls the loading bar animation). Set by parent. */\n isAutoPlaying = signal(false);\n\n /** Zero-based index of this item in the list. Set by parent. */\n index = signal(0);\n\n /** Generated ID for the tab button element. Set by parent. */\n tabId = signal('');\n\n /** ID of the controlled `tabpanel` (`eclStoryCardGridDetails`). Set by parent. */\n panelId = signal('');\n\n /** Emitted when the tab button is clicked; payload is this item's index. */\n itemClick = output<number>();\n\n /** Emitted when the loading bar CSS animation ends, signalling to advance to the next item. */\n loadingBarAnimationEnd = output<void>();\n\n /** Reference to the projected `picture[eclStoryCardPicture]` element for cloning into the mobile carousel. */\n pictureRef = contentChild(EclStoryCardPictureDirective, { read: ElementRef });\n\n readonly cssClasses = computed(() => [\n super.getCssClasses('ecl-story-card__grid-item'),\n this.isExpanded() ? 'ecl-story-card__grid-item--expanded' : '',\n ].join(' ').trim());\n\n protected onButtonClick(): void {\n this.itemClick.emit(this.index());\n }\n\n protected onAnimationEnd(): void {\n this.loadingBarAnimationEnd.emit();\n }\n}\n","<button class=\"ecl-story-card__grid-card\"\n type=\"button\"\n [attr.id]=\"tabId()\"\n role=\"tab\"\n [attr.aria-selected]=\"isExpanded()\"\n [attr.aria-controls]=\"panelId()\"\n (click)=\"onButtonClick()\">\n <div class=\"ecl-story-card__grid-image\">\n <ng-content select=\"picture[eclStoryCardPicture]\"></ng-content>\n <div class=\"ecl-story-card__grid-loading-bar\">\n <div class=\"ecl-story-card__grid-loading-bar-completion\"\n [class.is-paused]=\"!isExpanded() || !isAutoPlaying()\"\n (animationend)=\"onAnimationEnd()\">\n </div>\n </div>\n </div>\n <div class=\"ecl-story-card__grid-title-wrapper\">\n @if (gridTitle()) {\n <div class=\"ecl-story-card__grid-title\">{{ gridTitle() }}</div>\n }\n </div>\n</button>\n","import {\n ChangeDetectionStrategy,\n Component,\n contentChild,\n ElementRef,\n input,\n signal,\n} from '@angular/core';\nimport { ECLBaseDirective } from '@eui/ecl/core';\nimport { EclStoryCardLinkDirective } from '../ecl-story-card-directives';\n\n/**\n * Details panel sub-component (`tabpanel` role) within the ECL Story Card grid accordion.\n * Renders the expanded content for a selected story or testimonial item:\n * title, description, and an optional projected read-more link.\n * For the `'testimonial'` variant, additional `author`, `role`, and `source` inputs are shown.\n *\n * - Selector: `[eclStoryCardGridDetails]`.\n * - `isActive`, `isTestimonial`, `index`, `panelId`, and `tabId` are writable signals\n * set by the parent `EclStoryCardComponent` during grid setup.\n * - `linkRef` is a `contentChild` query used by the parent to clone the link into the mobile carousel.\n */\n@Component({\n selector: '[eclStoryCardGridDetails]',\n templateUrl: './ecl-story-card-grid-details.component.html',\n host: {\n '[class]': 'getCssClasses(\"ecl-story-card__grid-details\")',\n '[attr.id]': 'panelId()',\n '[attr.role]': '\"tabpanel\"',\n '[attr.aria-labelledby]': 'tabId()',\n '[hidden]': '!isActive()',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EclStoryCardGridDetailsComponent extends ECLBaseDirective {\n\n /** Title shown in the details panel. */\n eclTitle = input<string>('');\n\n /** Description shown in the details panel. */\n description = input<string>('');\n\n /** Author name for the testimonial variant. */\n author = input<string>('');\n\n /** Author role/position for the testimonial variant. */\n role = input<string>('');\n\n /** Publication source for the testimonial variant. */\n source = input<string>('');\n\n /** Whether this panel is currently visible. Set by the parent `EclStoryCardComponent`. */\n isActive = signal(false);\n\n /** Whether the parent story card is in the `'testimonial'` variant. Set by parent. */\n isTestimonial = signal(false);\n\n /** Zero-based index of this panel. Set by parent. */\n index = signal(0);\n\n /** Generated panel `id`. Set by parent. */\n panelId = signal('');\n\n /** `id` of the controlling tab button. Set by parent. */\n tabId = signal('');\n\n /** Reference to the projected `[eclStoryCardLink]` element for cloning into the mobile carousel. */\n linkRef = contentChild(EclStoryCardLinkDirective, { read: ElementRef });\n}\n","<article class=\"ecl-story-card__grid-details-content\">\n <div class=\"ecl-story-card__content\">\n @if (isTestimonial()) {\n <div class=\"ecl-story-card__content-icon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"45\" viewBox=\"0 0 22 45\" fill=\"none\">\n <path d=\"M0 0H22V23.3143L0 44.5714V0Z\" fill=\"currentColor\"/>\n </svg>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"45\" viewBox=\"0 0 22 45\" fill=\"none\">\n <path d=\"M0 0H22V23.3143L0 44.5714V0Z\" fill=\"currentColor\"/>\n </svg>\n </div>\n }\n @if (eclTitle()) {\n <div class=\"ecl-story-card__card-title\">{{ eclTitle() }}</div>\n }\n @if (author() || role() || source()) {\n <div class=\"ecl-story-card__testimonial\">\n @if (author()) {\n <span class=\"ecl-story-card__author\">{{ author() }}</span>\n }\n @if (role()) {\n <span class=\"ecl-story-card__role\">{{ role() }}</span>\n }\n @if (source()) {\n <cite class=\"ecl-story-card__source\">{{ source() }}</cite>\n }\n </div>\n }\n @if (description()) {\n <div class=\"ecl-story-card__card-description\">{{ description() }}</div>\n }\n <ng-content select=\"[eclStoryCardLink]\"></ng-content>\n </div>\n</article>\n","import {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n effect,\n ElementRef,\n inject,\n input,\n OnDestroy,\n output,\n signal,\n untracked,\n viewChild,\n viewChildren,\n} from '@angular/core';\nimport { EclIconComponent } from '@eui/ecl/components/ecl-icon';\nimport { ECLBaseDirective, EclRtlService } from '@eui/ecl/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { EmblaCarouselDirective } from 'embla-carousel-angular';\nimport { Subject, takeUntil } from 'rxjs';\nimport { outputToObservable, toSignal } from '@angular/core/rxjs-interop';\n\nimport { EclStoryCardItemComponent } from './ecl-story-card-item/ecl-story-card-item.component';\nimport { EclStoryCardGridDetailsComponent } from './ecl-story-card-grid-details/ecl-story-card-grid-details.component';\nimport { EmblaCarouselType, EmblaEventType } from 'embla-carousel';\n\nexport interface EclStoryCardSelectionEvent {\n index: number;\n}\n\n/**\n * ECL Story Card component that presents a collection of stories or testimonials in a\n * desktop grid-accordion with autoplay and a mobile Embla carousel.\n * On desktop, projected `li[eclStoryCardItem]` items form a tab/tabpanel accordion;\n * on mobile the same items are cloned into a carousel automatically.\n *\n * - Selector: `section[eclStoryCard]`.\n * - `variant`: `'story'` (default) or `'testimonial'`.\n * - `isAutoplay` enables auto-advancing through grid items. `autoplayDelay` sets the interval (ms, default 10000).\n * - All internal IDs derive from `eclId` (alias `id`); a UUID is generated when omitted.\n * - Emits `selectionChange` whenever the active grid item changes.\n * - Structural composition: `ul[eclStoryCardList]` > `li[eclStoryCardItem]` + `[eclStoryCardGridDetails]`\n * with `picture[eclStoryCardPicture]` and `[eclStoryCardLink]` projected inside each.\n */\n@Component({\n selector: 'section[eclStoryCard]',\n templateUrl: './ecl-story-card.component.html',\n host: {\n '[id]': 'componentId()',\n '[class]': 'cssClasses()',\n '[attr.aria-labelledby]': 'titleId()',\n '[style.--ecl-story-card-slide-duration]': 'slideDuration()',\n },\n imports: [\n TranslatePipe,\n EclIconComponent,\n EmblaCarouselDirective,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EclStoryCardComponent extends ECLBaseDirective implements OnDestroy {\n\n /** Title displayed in the story card header. */\n eclTitle = input<string>('');\n\n /** Description text displayed below the title. */\n eclDescription = input<string>('');\n\n /** Variant of the story card: `'story'` (default) or `'testimonial'`. */\n variant = input<'story' | 'testimonial'>('story');\n\n /** When `true`, enables autoplay for the desktop grid accordion. */\n isAutoplay = input(false, { transform: booleanAttribute });\n\n /** Autoplay slide duration in milliseconds. Default: `10000`. */\n autoplayDelay = input<number>(10000);\n\n /** HTML `id` for the component; all internal IDs derive from it. Auto-generated when omitted. */\n eclId = input<string>('', { alias: 'id' });\n\n /** Emitted when the active grid item index changes. Payload: `{ index: number }`. */\n selectionChange = output<EclStoryCardSelectionEvent>();\n\n private eclRtlService = inject(EclRtlService);\n\n private generatedId = `story-card-${crypto.randomUUID().slice(0, 8)}`;\n protected componentId = computed(() => this.eclId() || this.generatedId);\n protected titleId = computed(() => `${this.componentId()}-title`);\n\n /** Current RTL state, derived reactively from the RTL service. */\n private isRtl = toSignal(this.eclRtlService.currentRtlState$, { initialValue: false });\n\n /** Embla carousel options. Direction tracks the RTL state reactively. */\n protected emblaOptions = computed<{ loop: boolean; direction: 'ltr' | 'rtl' }>(() => ({\n loop: true,\n direction: this.isRtl() ? 'rtl' : 'ltr',\n }));\n\n /** Subscribed Embla events. */\n protected subscribeToEvents: EmblaEventType[] = ['select', 'init', 'reInit'];\n\n /** Current carousel snap index. */\n protected activeSlideIndex = signal(0);\n\n /** Total number of items. */\n protected totalSlides = computed(() => this.items().length);\n\n /** Previous button disabled state (carousel). */\n protected prevDisabled = signal(false);\n\n /** Next button disabled state (carousel). */\n protected nextDisabled = signal(false);\n\n /** Currently expanded grid item index. */\n protected expandedIndex = signal(0);\n\n /** Whether grid autoplay is currently playing. */\n protected isAutoPlaying = signal(false);\n\n protected items = contentChildren(EclStoryCardItemComponent, { descendants: true });\n\n protected detailsPanels = contentChildren(EclStoryCardGridDetailsComponent, { descendants: true });\n\n private emblaRef = viewChild(EmblaCarouselDirective);\n private carouselImageWrappers = viewChildren<ElementRef>('carouselImageWrapper');\n private carouselContentWrappers = viewChildren<ElementRef>('carouselContentWrapper');\n\n private setupTeardown$ = new Subject<void>();\n private emblaApi: EmblaCarouselType | undefined;\n\n constructor() {\n super();\n afterNextRender(() => {\n setTimeout(() => this.clonePicturesToCarousel());\n });\n\n effect(() => {\n const itemsArray = this.items();\n const detailsArray = this.detailsPanels();\n\n untracked(() => {\n this.setupGrid(itemsArray, detailsArray);\n });\n }, { allowSignalWrites: true });\n }\n\n readonly cssClasses = computed(() => [\n super.getCssClasses('ecl-story-card'),\n this.eclDescription() ? 'ecl-story-card--has-description' : '',\n this.variant() === 'testimonial' ? 'ecl-story-card--testimonial' : '',\n ].join(' ').trim());\n\n readonly slideDuration = computed(() => `${this.autoplayDelay()}ms`);\n\n ngOnDestroy(): void {\n this.setupTeardown$.next();\n this.setupTeardown$.complete();\n }\n\n /**\n * Configures the grid accordion: assigns IDs, indices, and initial state\n * to each item and details panel, subscribes to item interaction events,\n * and starts autoplay if enabled.\n */\n private setupGrid(\n itemsArray: readonly EclStoryCardItemComponent[],\n detailsArray: readonly EclStoryCardGridDetailsComponent[],\n ): void {\n this.setupTeardown$.next();\n const id = this.componentId();\n\n itemsArray.forEach((item, i) => {\n item.index.set(i);\n item.tabId.set(`${id}-tab-${i}`);\n item.panelId.set(`${id}-details-${i}`);\n item.isExpanded.set(i === this.expandedIndex());\n item.isAutoPlaying.set(this.isAutoPlaying());\n\n outputToObservable(item.itemClick).pipe(\n takeUntil(this.setupTeardown$),\n ).subscribe((index: number) => this.onGridItemClick(index));\n\n outputToObservable(item.loadingBarAnimationEnd).pipe(\n takeUntil(this.setupTeardown$),\n ).subscribe(() => this.onLoadingBarAnimationEnd());\n });\n\n detailsArray.forEach((panel, i) => {\n panel.index.set(i);\n panel.panelId.set(`${id}-details-${i}`);\n panel.tabId.set(`${id}-tab-${i}`);\n panel.isActive.set(i === this.expandedIndex());\n panel.isTestimonial.set(this.variant() === 'testimonial');\n });\n\n if (this.isAutoplay()) {\n this.playAutoplay();\n }\n }\n\n /** Set the expanded grid item by index. */\n private setGridItem(index: number): void {\n const itemsArray = this.items();\n const detailsArray = this.detailsPanels();\n if (itemsArray.length === 0) return;\n\n const nextIndex = ((index % itemsArray.length) + itemsArray.length) % itemsArray.length;\n\n itemsArray.forEach((item, i) => {\n item.isExpanded.set(i === nextIndex);\n item.isAutoPlaying.set(this.isAutoPlaying());\n });\n\n detailsArray.forEach((panel, i) => {\n panel.isActive.set(i === nextIndex);\n });\n\n this.expandedIndex.set(nextIndex);\n this.selectionChange.emit({ index: nextIndex });\n }\n\n /** Handle click on a grid item button. */\n private onGridItemClick(index: number): void {\n const itemsArray = this.items();\n const isCurrentlyExpanded = itemsArray[index]?.isExpanded();\n\n if (isCurrentlyExpanded && !this.isAutoPlaying()) {\n this.playAutoplay();\n } else {\n this.pauseAutoplay();\n }\n\n this.setGridItem(index);\n }\n\n /** Go to the previous grid item. */\n protected onGridPrevClick(): void {\n this.setGridItem(this.expandedIndex() - 1);\n }\n\n /** Go to the next grid item. */\n protected onGridNextClick(): void {\n this.setGridItem(this.expandedIndex() + 1);\n }\n\n /** Handle animation end on the loading bar (advance to next). */\n private onLoadingBarAnimationEnd(): void {\n if (this.isAutoPlaying()) {\n this.setGridItem(this.expandedIndex() + 1);\n }\n }\n\n /** Start autoplay. */\n protected playAutoplay(): void {\n if (this.items().length < 2) return;\n this.isAutoPlaying.set(true);\n this.items().forEach(item => item.isAutoPlaying.set(true));\n }\n\n protected pauseAutoplay(): void {\n this.isAutoPlaying.set(false);\n this.items().forEach(item => item.isAutoPlaying.set(false));\n }\n\n /** Play button click. */\n protected onPlayClick(): void {\n this.playAutoplay();\n }\n\n /** Pause button click. */\n protected onPauseClick(): void {\n this.pauseAutoplay();\n }\n\n /** Clone each item's projected picture and link into the corresponding carousel slide. */\n private clonePicturesToCarousel(): void {\n const imageWrappers = this.carouselImageWrappers();\n const contentWrappers = this.carouselContentWrappers();\n const itemsArray = this.items();\n const detailsArray = this.detailsPanels();\n\n itemsArray.forEach((item, i) => {\n const pictureEl = item.pictureRef();\n if (pictureEl && imageWrappers[i]) {\n const clone = pictureEl.nativeElement.cloneNode(true) as HTMLElement;\n imageWrappers[i].nativeElement.appendChild(clone);\n }\n });\n\n detailsArray.forEach((panel, i) => {\n const linkEl = panel.linkRef();\n if (linkEl && contentWrappers[i]) {\n const clone = linkEl.nativeElement.cloneNode(true) as HTMLElement;\n contentWrappers[i].nativeElement.appendChild(clone);\n }\n });\n }\n\n protected onEmblaChange(eventName: string): void {\n if (!this.emblaApi) {\n this.emblaApi = this.emblaRef()?.emblaApi;\n }\n if (!this.emblaApi) return;\n\n if (eventName === 'select' || eventName === 'init' || eventName === 'reInit') {\n this.syncCarouselState();\n }\n }\n\n /** Sync carousel state from Embla API. */\n private syncCarouselState(): void {\n if (!this.emblaApi) return;\n\n this.activeSlideIndex.set(this.emblaApi.selectedScrollSnap());\n this.prevDisabled.set(!this.emblaApi.canScrollPrev());\n this.nextDisabled.set(!this.emblaApi.canScrollNext());\n }\n\n /** Navigate carousel to previous slide. */\n protected onCarouselPrevClick(): void {\n this.emblaRef()?.scrollPrev();\n }\n\n /** Navigate carousel to next slide. */\n protected onCarouselNextClick(): void {\n this.emblaRef()?.scrollNext();\n }\n\n /** Navigate carousel to a specific slide. */\n protected goToSlide(index: number): void {\n this.emblaRef()?.scrollTo(index);\n }\n\n /** Returns dot indices for rendering. */\n protected getDotIndices(): number[] {\n return Array.from({ length: this.totalSlides() }, (_, i) => i);\n }\n}\n","@if (eclTitle() || eclDescription()) {\n<div class=\"ecl-story-card__header\">\n @if (eclTitle()) {\n <div class=\"ecl-story-card__title\" [attr.id]=\"titleId()\">{{ eclTitle() }}</div>\n }\n @if (eclDescription()) {\n <div class=\"ecl-story-card__description\">{{ eclDescription() }}</div>\n }\n</div>\n}\n\n<!-- Mobile: Embla Carousel (auto-generated from items + details) -->\n<div class=\"ecl-story-card__carousel\">\n <div class=\"ecl-story-card__carousel-viewport\"\n role=\"region\"\n [attr.aria-label]=\"'ecl.story-card.SLIDER-LABEL' | translate\"\n emblaCarousel\n [options]=\"emblaOptions()\"\n [subscribeToEvents]=\"subscribeToEvents\"\n (emblaChange)=\"onEmblaChange($event)\">\n <ul class=\"ecl-story-card__carousel-container\">\n @for (item of items(); track i; let i = $index) {\n <li class=\"ecl-story-card__carousel-slide\"\n [attr.aria-hidden]=\"i !== activeSlideIndex() ? true : null\">\n <article class=\"ecl-story-card__card\">\n <div class=\"ecl-story-card__image-wrapper\" #carouselImageWrapper>\n </div>\n <div class=\"ecl-story-card__content\" #carouselContentWrapper>\n @if (detailsPanels()[i]; as panel) {\n @if (panel.eclTitle()) {\n <div class=\"ecl-story-card__card-title\">{{ panel.eclTitle() }}</div>\n }\n @if (panel.description()) {\n <div class=\"ecl-story-card__card-description\">{{ panel.description() }}</div>\n }\n }\n </div>\n </article>\n </li>\n }\n </ul>\n </div>\n\n <!-- Carousel Controls -->\n @if (totalSlides() > 1) {\n <div class=\"ecl-story-card__pager\">\n <button class=\"ecl-story-card__prev\"\n [disabled]=\"prevDisabled()\"\n (click)=\"onCarouselPrevClick()\"\n [attr.aria-label]=\"'ecl.story-card.SHOW-PREV-SLIDE' | translate\">\n <ecl-icon icon=\"corner-arrow\" size=\"s\" transform=\"rotate-270\"></ecl-icon>\n <span class=\"ecl-story-card__prev-label\">\n {{ 'ecl.story-card.PREVIOUS' | translate }}\n </span>\n </button>\n\n <div class=\"ecl-story-card__dots\">\n @for (dotIndex of getDotIndices(); track dotIndex) {\n <button\n #dotButton\n class=\"ecl-story-card__dot\"\n [class.ecl-story-card__dot--active]=\"dotIndex === activeSlideIndex()\"\n [class.is-prev]=\"dotIndex === activeSlideIndex() - 1\"\n [attr.aria-label]=\"'ecl.story-card.GO-TO-SLIDE' | translate: { current: dotIndex + 1, total: totalSlides() }\"\n (click)=\"goToSlide(dotIndex)\">\n </button>\n }\n </div>\n\n <button class=\"ecl-story-card__next\"\n [disabled]=\"nextDisabled()\"\n (click)=\"onCarouselNextClick()\"\n [attr.aria-label]=\"'ecl.story-card.SHOW-NEXT-SLIDE' | translate\">\n <span class=\"ecl-story-card__next-label\">\n {{ 'ecl.story-card.NEXT' | translate }}\n </span>\n <ecl-icon icon=\"corner-arrow\" size=\"s\" transform=\"rotate-90\"></ecl-icon>\n </button>\n </div>\n }\n</div>\n\n<!-- Desktop: Grid with Accordion (user-authored content projected here) -->\n<div class=\"ecl-story-card__grid\">\n <ng-content select=\"ul[eclStoryCardList]\"></ng-content>\n <ng-content select=\"[eclStoryCardGridDetails]\"></ng-content>\n\n <!-- Grid Controls -->\n @if (totalSlides() > 1) {\n <div class=\"ecl-story-card__grid-controls\">\n <button class=\"ecl-button ecl-button--tertiary ecl-button--neutral ecl-story-card__grid-prev ecl-button--icon-only\"\n type=\"button\"\n (click)=\"onGridPrevClick()\"\n [attr.aria-label]=\"'ecl.story-card.PREVIOUS' | translate\">\n <span class=\"ecl-button__container\">\n <span class=\"ecl-button__label\">\n {{ 'ecl.story-card.PREVIOUS' | translate }}\n </span>\n <ecl-icon iconSet=\"phosphor\" icon=\"caret-left\" size=\"l\"></ecl-icon>\n </span>\n </button>\n\n <button class=\"ecl-button ecl-button--secondary ecl-button--neutral ecl-story-card__grid-play ecl-button--icon-only\"\n type=\"button\"\n [style.display]=\"isAutoPlaying() ? 'none' : 'flex'\"\n (click)=\"onPlayClick()\"\n [attr.aria-label]=\"'ecl.story-card.PLAY' | translate\">\n <span class=\"ecl-button__container\">\n <span class=\"ecl-button__label\">\n {{ 'ecl.story-card.PLAY' | translate }}\n </span>\n <ecl-icon iconSet=\"phosphor-fill\" icon=\"play\" size=\"l\"></ecl-icon>\n </span>\n </button>\n\n <button class=\"ecl-button ecl-button--secondary ecl-button--neutral ecl-story-card__grid-pause ecl-button--icon-only\"\n type=\"button\"\n [style.display]=\"isAutoPlaying() ? 'flex' : 'none'\"\n (click)=\"onPauseClick()\"\n [attr.aria-label]=\"'ecl.story-card.PAUSE' | translate\">\n <span class=\"ecl-button__container\">\n <span class=\"ecl-button__label\">\n {{ 'ecl.story-card.PAUSE' | translate }}\n </span>\n <ecl-icon iconSet=\"phosphor-fill\" icon=\"pause\" size=\"l\"></ecl-icon>\n </span>\n </button>\n\n <button class=\"ecl-button ecl-button--tertiary ecl-button--neutral ecl-story-card__grid-next ecl-button--icon-only\"\n type=\"button\"\n (click)=\"onGridNextClick()\"\n [attr.aria-label]=\"'ecl.story-card.NEXT' | translate\">\n <span class=\"ecl-button__container\">\n <span class=\"ecl-button__label\">\n {{ 'ecl.story-card.NEXT' | translate }}\n </span>\n <ecl-icon iconSet=\"phosphor\" icon=\"caret-right\" size=\"l\"></ecl-icon>\n </span>\n </button>\n </div>\n }\n</div>\n","import { EclStoryCardComponent } from './ecl-story-card.component';\nimport { EclStoryCardItemComponent } from './ecl-story-card-item/ecl-story-card-item.component';\nimport { EclStoryCardGridDetailsComponent } from './ecl-story-card-grid-details/ecl-story-card-grid-details.component';\nimport {\n EclStoryCardListDirective,\n EclStoryCardPictureDirective,\n EclStoryCardLinkDirective,\n} from './ecl-story-card-directives';\n\nexport * from './ecl-story-card.component';\nexport * from './ecl-story-card-item/ecl-story-card-item.component';\nexport * from './ecl-story-card-grid-details/ecl-story-card-grid-details.component';\nexport * from './ecl-story-card-directives';\n\nexport const EUI_ECL_STORY_CARD = [\n EclStoryCardComponent,\n EclStoryCardItemComponent,\n EclStoryCardGridDetailsComponent,\n EclStoryCardListDirective,\n EclStoryCardPictureDirective,\n EclStoryCardLinkDirective,\n] as const;\n","/**\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-story-card.mjs","sources":["../../components/ecl-story-card/ecl-story-card-directives.ts","../../components/ecl-story-card/ecl-story-card-item/ecl-story-card-item.component.ts","../../components/ecl-story-card/ecl-story-card-item/ecl-story-card-item.component.html","../../components/ecl-story-card/ecl-story-card-grid-details/ecl-story-card-grid-details.component.ts","../../components/ecl-story-card/ecl-story-card-grid-details/ecl-story-card-grid-details.component.html","../../components/ecl-story-card/ecl-story-card.component.ts","../../components/ecl-story-card/ecl-story-card.component.html","../../components/ecl-story-card/index.ts","../../components/ecl-story-card/eui-ecl-components-ecl-story-card.ts"],"sourcesContent":["import { Directive } from '@angular/core';\nimport { ECLBaseDirective } from '@eui/ecl/core';\n\n/**\n * Directive applied to the <ul> element that holds the story card items.\n * Adds the grid container class and tablist role.\n */\n@Directive({\n selector: 'ul[eclStoryCardList]',\n host: {\n role: 'tablist',\n '[class]': 'getCssClasses(\"ecl-story-card__grid-container\")',\n },\n})\nexport class EclStoryCardListDirective extends ECLBaseDirective {}\n\n/**\n * Directive applied to <picture> elements inside a story card item.\n * Adds the ECL picture classes.\n */\n@Directive({\n selector: 'picture[eclStoryCardPicture]',\n host: {\n '[class]': 'getCssClasses(\"ecl-picture ecl-story-card__picture\")',\n },\n})\nexport class EclStoryCardPictureDirective extends ECLBaseDirective {}\n\n/**\n * Directive applied to <a> elements inside story card grid details.\n * Adds the ECL link classes for the \"Read more\" link.\n */\n@Directive({\n selector: '[eclStoryCardLink]',\n host: {\n '[class]': 'getCssClasses(\"ecl-link ecl-link--standalone ecl-link--icon ecl-story-card__link\")',\n },\n})\nexport class EclStoryCardLinkDirective extends ECLBaseDirective {}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n ElementRef,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ECLBaseDirective } from '@eui/ecl/core';\nimport { EclStoryCardPictureDirective } from '../ecl-story-card-directives';\n\n/**\n * Individual grid item (tab role) within the ECL Story Card desktop accordion.\n * Applied to `<li>` elements inside `ul[eclStoryCardList]`.\n * Renders the accordion tab button with the loading bar animation.\n * For the mobile carousel, the parent `EclStoryCardComponent` clones the projected\n * `picture[eclStoryCardPicture]` into the carousel slide via `pictureRef`.\n *\n * - Selector: `li[eclStoryCardItem]`.\n * - `gridTitle` is the short label shown in the tab button.\n * - `isExpanded`, `isAutoPlaying`, `index`, `tabId`, and `panelId` are writable signals\n * set by the parent `EclStoryCardComponent` during grid setup.\n * - Emits `itemClick` (with item index) when the tab button is clicked.\n * - Emits `loadingBarAnimationEnd` when the autoplay loading bar animation finishes.\n */\n@Component({\n selector: 'li[eclStoryCardItem]',\n templateUrl: './ecl-story-card-item.component.html',\n host: {\n role: 'presentation',\n '[class]': 'cssClasses()',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EclStoryCardItemComponent extends ECLBaseDirective {\n\n /** Short title displayed in the accordion tab button. */\n readonly gridTitle = input<string>('');\n\n /** Whether this item is currently expanded/selected. Set by the parent `EclStoryCardComponent`. */\n readonly isExpanded = signal(false);\n\n /** Whether autoplay is active for this item (controls the loading bar animation). Set by parent. */\n readonly isAutoPlaying = signal(false);\n\n /** Zero-based index of this item in the list. Set by parent. */\n readonly index = signal(0);\n\n /** Generated ID for the tab button element. Set by parent. */\n readonly tabId = signal('');\n\n /** ID of the controlled `tabpanel` (`eclStoryCardGridDetails`). Set by parent. */\n readonly panelId = signal('');\n\n /** Emitted when the tab button is clicked; payload is this item's index. */\n readonly itemClick = output<number>();\n\n /** Emitted when the loading bar CSS animation ends, signalling to advance to the next item. */\n readonly loadingBarAnimationEnd = output<void>();\n\n /**\n * Emitted when a keydown occurs on the tab button. The parent story card\n * orchestrates keyboard navigation (arrows, Home, End) across all items.\n */\n readonly keydownTab = output<KeyboardEvent>();\n\n /** Reference to the projected `picture[eclStoryCardPicture]` element for cloning into the mobile carousel. */\n readonly pictureRef = contentChild(EclStoryCardPictureDirective, { read: ElementRef });\n\n private readonly buttonRef = viewChild<ElementRef<HTMLButtonElement>>('tabButton');\n\n readonly cssClasses = computed(() => [\n super.getCssClasses('ecl-story-card__grid-item'),\n this.isExpanded() ? 'ecl-story-card__grid-item--expanded' : '',\n ].join(' ').trim());\n\n /** Move focus to this item's tab button. Called by the parent during keyboard navigation. */\n focusButton(): void {\n this.buttonRef()?.nativeElement.focus();\n }\n\n protected onButtonClick(): void {\n this.itemClick.emit(this.index());\n }\n\n protected onAnimationEnd(): void {\n this.loadingBarAnimationEnd.emit();\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n this.keydownTab.emit(event);\n }\n}\n","<button class=\"ecl-story-card__grid-card\"\n #tabButton\n type=\"button\"\n [attr.id]=\"tabId()\"\n role=\"tab\"\n [attr.aria-selected]=\"isExpanded()\"\n [attr.aria-controls]=\"panelId()\"\n [attr.tabindex]=\"isExpanded() ? 0 : -1\"\n (click)=\"onButtonClick()\"\n (keydown)=\"onKeydown($event)\">\n <div class=\"ecl-story-card__grid-image\">\n <ng-content select=\"picture[eclStoryCardPicture]\"></ng-content>\n <div class=\"ecl-story-card__grid-loading-bar\">\n <div class=\"ecl-story-card__grid-loading-bar-completion\"\n [class.is-paused]=\"!isExpanded() || !isAutoPlaying()\"\n (animationend)=\"onAnimationEnd()\">\n </div>\n </div>\n </div>\n <div class=\"ecl-story-card__grid-title-wrapper\">\n @if (gridTitle()) {\n <div class=\"ecl-story-card__grid-title\">{{ gridTitle() }}</div>\n }\n </div>\n</button>\n","import {\n ChangeDetectionStrategy,\n Component,\n contentChild,\n effect,\n ElementRef,\n input,\n signal,\n} from '@angular/core';\nimport { ECLBaseDirective } from '@eui/ecl/core';\nimport { EclStoryCardLinkDirective } from '../ecl-story-card-directives';\n\n/**\n * Details panel sub-component (`tabpanel` role) within the ECL Story Card grid accordion.\n * Renders the expanded content for a selected story or testimonial item:\n * title, description, and an optional projected read-more link.\n * For the `'testimonial'` variant, additional `author`, `role`, and `source` inputs are shown.\n *\n * - Selector: `[eclStoryCardGridDetails]`.\n * - `isActive`, `isTestimonial`, `index`, `panelId`, and `tabId` are writable signals\n * set by the parent `EclStoryCardComponent` during grid setup.\n * - `linkRef` is a `contentChild` query used by the parent to clone the link into the mobile carousel.\n */\n@Component({\n selector: '[eclStoryCardGridDetails]',\n templateUrl: './ecl-story-card-grid-details.component.html',\n host: {\n '[class]': 'getCssClasses(\"ecl-story-card__grid-details\")',\n '[attr.id]': 'panelId()',\n '[attr.role]': '\"tabpanel\"',\n '[attr.aria-labelledby]': 'tabId()',\n '[attr.tabindex]': 'isActive() ? 0 : -1',\n '[hidden]': '!isActive()',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EclStoryCardGridDetailsComponent extends ECLBaseDirective {\n\n /** Optional teaser label shown above the title. Hidden by CSS in the testimonial variant. */\n readonly teaserLabel = input<string>('');\n\n /** Title shown in the details panel. */\n readonly eclTitle = input<string>('');\n\n /** Description shown in the details panel. */\n readonly description = input<string>('');\n\n /** Author name for the testimonial variant. */\n readonly author = input<string>('');\n\n /** Author role/position for the testimonial variant. */\n readonly role = input<string>('');\n\n /** Publication source for the testimonial variant. */\n readonly source = input<string>('');\n\n /** Whether this panel is currently visible. Set by the parent `EclStoryCardComponent`. */\n readonly isActive = signal(false);\n\n /** Whether the parent story card is in the `'testimonial'` variant. Set by parent. */\n readonly isTestimonial = signal(false);\n\n /** Zero-based index of this panel. Set by parent. */\n readonly index = signal(0);\n\n /** Generated panel `id`. Set by parent. */\n readonly panelId = signal('');\n\n /** `id` of the controlling tab button. Set by parent. */\n readonly tabId = signal('');\n\n /** Reference to the projected `[eclStoryCardLink]` element for cloning into the mobile carousel. */\n readonly linkRef = contentChild(EclStoryCardLinkDirective, { read: ElementRef });\n\n constructor() {\n super();\n\n // Associate the \"Read more\" link with its corresponding tab so assistive\n // technologies announce the tab label as context for the link.\n // Set before the parent clones the link into the carousel slide.\n effect(() => {\n const link = this.linkRef();\n const tabId = this.tabId();\n if (link && tabId) {\n link.nativeElement.setAttribute('aria-describedby', tabId);\n }\n });\n }\n}\n","<article class=\"ecl-story-card__grid-details-content\">\n <div class=\"ecl-story-card__content\">\n @if (isTestimonial()) {\n <div class=\"ecl-story-card__content-icon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"45\" viewBox=\"0 0 22 45\" fill=\"none\">\n <path d=\"M0 0H22V23.3143L0 44.5714V0Z\" fill=\"currentColor\"/>\n </svg>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"45\" viewBox=\"0 0 22 45\" fill=\"none\">\n <path d=\"M0 0H22V23.3143L0 44.5714V0Z\" fill=\"currentColor\"/>\n </svg>\n </div>\n }\n @if (teaserLabel()) {\n <div class=\"ecl-story-card__teaser-label\">{{ teaserLabel() }}</div>\n }\n @if (eclTitle()) {\n <div class=\"ecl-story-card__card-title\">{{ eclTitle() }}</div>\n }\n @if (author() || role() || source()) {\n <div class=\"ecl-story-card__testimonial\">\n @if (author()) {\n <span class=\"ecl-story-card__author\">{{ author() }}</span>\n }\n @if (role()) {\n <span class=\"ecl-story-card__role\">{{ role() }}</span>\n }\n @if (source()) {\n <cite class=\"ecl-story-card__source\">{{ source() }}</cite>\n }\n </div>\n }\n @if (description()) {\n <div class=\"ecl-story-card__card-description\">{{ description() }}</div>\n }\n <ng-content select=\"[eclStoryCardLink]\"></ng-content>\n </div>\n</article>\n","import {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n effect,\n ElementRef,\n inject,\n input,\n OnDestroy,\n output,\n signal,\n untracked,\n viewChild,\n viewChildren,\n} from '@angular/core';\nimport { EUI_ECL_SLIDER } from '@eui/ecl/components/ecl-slider';\nimport { ECLBaseDirective, EclRtlService, KeyCode } from '@eui/ecl/core';\nimport { TranslatePipe, TranslateService } from '@ngx-translate/core';\nimport { EmblaCarouselDirective } from 'embla-carousel-angular';\nimport { Subject, takeUntil } from 'rxjs';\nimport { outputToObservable, toSignal } from '@angular/core/rxjs-interop';\n\nimport { EclStoryCardItemComponent } from './ecl-story-card-item/ecl-story-card-item.component';\nimport { EclStoryCardGridDetailsComponent } from './ecl-story-card-grid-details/ecl-story-card-grid-details.component';\nimport { EmblaCarouselType, EmblaEventType } from 'embla-carousel';\n\nexport interface EclStoryCardSelectionEvent {\n index: number;\n}\n\n/**\n * ECL Story Card component that presents a collection of stories or testimonials in a\n * desktop grid-accordion with autoplay and a mobile Embla carousel.\n * On desktop, projected `li[eclStoryCardItem]` items form a tab/tabpanel accordion;\n * on mobile the same items are cloned into a carousel automatically.\n *\n * - Selector: `section[eclStoryCard]`.\n * - `variant`: `'story'` (default) or `'testimonial'`.\n * - `isAutoplay` enables auto-advancing through grid items. `autoplayDelay` sets the interval (ms, default 10000).\n * - All internal IDs derive from `eclId` (alias `id`); a UUID is generated when omitted.\n * - Emits `selectionChange` whenever the active grid item changes.\n * - Structural composition: `ul[eclStoryCardList]` > `li[eclStoryCardItem]` + `[eclStoryCardGridDetails]`\n * with `picture[eclStoryCardPicture]` and `[eclStoryCardLink]` projected inside each.\n */\n@Component({\n selector: 'section[eclStoryCard]',\n templateUrl: './ecl-story-card.component.html',\n host: {\n '[id]': 'componentId()',\n '[class]': 'cssClasses()',\n '[style.--ecl-story-card-slide-duration]': 'slideDuration()',\n },\n imports: [\n TranslatePipe,\n ...EUI_ECL_SLIDER,\n EmblaCarouselDirective,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EclStoryCardComponent extends ECLBaseDirective implements OnDestroy {\n\n /** Title displayed in the story card header. */\n readonly eclTitle = input<string>('');\n\n /** Description text displayed below the title. */\n readonly eclDescription = input<string>('');\n\n /** Variant of the story card: `'story'` (default) or `'testimonial'`. */\n readonly variant = input<'story' | 'testimonial'>('story');\n\n /** When `true`, enables autoplay for the desktop grid accordion. */\n readonly isAutoplay = input(false, { transform: booleanAttribute });\n\n /** Autoplay slide duration in milliseconds. Default: `10000`. */\n readonly autoplayDelay = input<number>(10000);\n\n /** HTML `id` for the component; all internal IDs derive from it. Auto-generated when omitted. */\n readonly eclId = input<string>('', { alias: 'id' });\n\n /** Emitted when the active grid item index changes. Payload: `{ index: number }`. */\n readonly selectionChange = output<EclStoryCardSelectionEvent>();\n\n private readonly eclRtlService = inject(EclRtlService);\n private readonly translate = inject(TranslateService);\n\n private readonly generatedId = `story-card-${crypto.randomUUID().slice(0, 8)}`;\n protected readonly componentId = computed(() => this.eclId() || this.generatedId);\n\n /** Current RTL state, derived reactively from the RTL service. */\n private readonly isRtl = toSignal(this.eclRtlService.currentRtlState$, { initialValue: false });\n\n /** Embla carousel options. Direction tracks the RTL state reactively. */\n protected readonly emblaOptions = computed<{ loop: boolean; direction: 'ltr' | 'rtl' }>(() => ({\n loop: true,\n direction: this.isRtl() ? 'rtl' : 'ltr',\n }));\n\n /** Subscribed Embla events. */\n protected readonly subscribeToEvents: EmblaEventType[] = ['select', 'init', 'reInit'];\n\n /** Current carousel snap index. */\n protected readonly activeSlideIndex = signal(0);\n\n /** Total number of items. */\n protected readonly totalSlides = computed(() => this.items().length);\n\n /** Previous button disabled state (carousel). */\n protected readonly prevDisabled = signal(false);\n\n /** Next button disabled state (carousel). */\n protected readonly nextDisabled = signal(false);\n\n /** Currently expanded grid item index. */\n protected readonly expandedIndex = signal(0);\n\n /** Whether grid autoplay is currently playing. */\n protected readonly isAutoPlaying = signal(false);\n\n protected readonly items = contentChildren(EclStoryCardItemComponent, { descendants: true });\n\n protected readonly detailsPanels = contentChildren(EclStoryCardGridDetailsComponent, { descendants: true });\n\n private readonly emblaRef = viewChild(EmblaCarouselDirective);\n private readonly carouselImageWrappers = viewChildren<ElementRef>('carouselImageWrapper');\n private readonly carouselContentWrappers = viewChildren<ElementRef>('carouselContentWrapper');\n\n private readonly setupTeardown$ = new Subject<void>();\n private emblaApi: EmblaCarouselType | undefined;\n\n constructor() {\n super();\n afterNextRender(() => {\n setTimeout(() => this.clonePicturesToCarousel());\n });\n\n effect(() => {\n const itemsArray = this.items();\n const detailsArray = this.detailsPanels();\n\n untracked(() => {\n this.setupGrid(itemsArray, detailsArray);\n });\n }, { allowSignalWrites: true });\n }\n\n readonly cssClasses = computed(() => [\n super.getCssClasses('ecl-story-card'),\n this.eclDescription() ? 'ecl-story-card--has-description' : '',\n this.variant() === 'testimonial' ? 'ecl-story-card--testimonial' : '',\n ].join(' ').trim());\n\n readonly slideDuration = computed(() => `${this.autoplayDelay()}ms`);\n\n ngOnDestroy(): void {\n this.setupTeardown$.next();\n this.setupTeardown$.complete();\n }\n\n /**\n * Configures the grid accordion: assigns IDs, indices, and initial state\n * to each item and details panel, subscribes to item interaction events,\n * and starts autoplay if enabled.\n */\n private setupGrid(\n itemsArray: readonly EclStoryCardItemComponent[],\n detailsArray: readonly EclStoryCardGridDetailsComponent[],\n ): void {\n this.setupTeardown$.next();\n const id = this.componentId();\n\n itemsArray.forEach((item, i) => {\n item.index.set(i);\n item.tabId.set(`${id}-tab-${i}`);\n item.panelId.set(`${id}-details-${i}`);\n item.isExpanded.set(i === this.expandedIndex());\n item.isAutoPlaying.set(this.isAutoPlaying());\n\n outputToObservable(item.itemClick).pipe(\n takeUntil(this.setupTeardown$),\n ).subscribe((index: number) => this.onGridItemClick(index));\n\n outputToObservable(item.loadingBarAnimationEnd).pipe(\n takeUntil(this.setupTeardown$),\n ).subscribe(() => this.onLoadingBarAnimationEnd());\n\n outputToObservable(item.keydownTab).pipe(\n takeUntil(this.setupTeardown$),\n ).subscribe((event: KeyboardEvent) => this.onGridItemKeydown(event, i));\n });\n\n detailsArray.forEach((panel, i) => {\n panel.index.set(i);\n panel.panelId.set(`${id}-details-${i}`);\n panel.tabId.set(`${id}-tab-${i}`);\n panel.isActive.set(i === this.expandedIndex());\n panel.isTestimonial.set(this.variant() === 'testimonial');\n });\n\n if (this.isAutoplay()) {\n this.playAutoplay();\n }\n }\n\n /** Set the expanded grid item by index. */\n private setGridItem(index: number): void {\n const itemsArray = this.items();\n const detailsArray = this.detailsPanels();\n if (itemsArray.length === 0) return;\n\n const nextIndex = ((index % itemsArray.length) + itemsArray.length) % itemsArray.length;\n\n itemsArray.forEach((item, i) => {\n item.isExpanded.set(i === nextIndex);\n item.isAutoPlaying.set(this.isAutoPlaying());\n });\n\n detailsArray.forEach((panel, i) => {\n panel.isActive.set(i === nextIndex);\n });\n\n this.expandedIndex.set(nextIndex);\n this.selectionChange.emit({ index: nextIndex });\n }\n\n /** Handle click on a grid item button. */\n private onGridItemClick(index: number): void {\n const itemsArray = this.items();\n const isCurrentlyExpanded = itemsArray[index]?.isExpanded();\n\n if (isCurrentlyExpanded && !this.isAutoPlaying()) {\n this.playAutoplay();\n } else {\n this.pauseAutoplay();\n }\n\n this.setGridItem(index);\n }\n\n /** Go to the previous grid item. */\n protected onGridPrevClick(): void {\n this.setGridItem(this.expandedIndex() - 1);\n }\n\n /** Go to the next grid item. */\n protected onGridNextClick(): void {\n this.setGridItem(this.expandedIndex() + 1);\n }\n\n /**\n * Orchestrates keyboard navigation across the grid tablist (WAI-ARIA tabs\n * pattern). Moves focus only; selection still happens on click/Enter.\n *\n * - ArrowRight: focus the next tab, wrapping to the first.\n * - ArrowLeft: focus the previous tab, wrapping to the last.\n * - Home: focus the first tab.\n * - End: focus the last tab.\n *\n * @param event the originating keydown from the focused item's button\n * @param index the index of the item that emitted the event\n */\n private onGridItemKeydown(event: KeyboardEvent, index: number): void {\n const itemsArray = this.items();\n const count = itemsArray.length;\n if (count === 0) {\n return;\n }\n\n let targetIndex: number | null = null;\n\n switch (event.key) {\n case KeyCode.ARROW_RIGHT:\n targetIndex = (index + 1) % count;\n break;\n case KeyCode.ARROW_LEFT:\n targetIndex = (index - 1 + count) % count;\n break;\n case KeyCode.HOME:\n targetIndex = 0;\n break;\n case KeyCode.END:\n targetIndex = count - 1;\n break;\n default:\n return;\n }\n\n event.preventDefault();\n itemsArray[targetIndex]?.focusButton();\n }\n\n /** Handle animation end on the loading bar (advance to next). */\n private onLoadingBarAnimationEnd(): void {\n if (this.isAutoPlaying()) {\n this.setGridItem(this.expandedIndex() + 1);\n }\n }\n\n /** Start autoplay. */\n protected playAutoplay(): void {\n if (this.items().length < 2) return;\n this.isAutoPlaying.set(true);\n this.items().forEach(item => item.isAutoPlaying.set(true));\n }\n\n protected pauseAutoplay(): void {\n this.isAutoPlaying.set(false);\n this.items().forEach(item => item.isAutoPlaying.set(false));\n }\n\n /** Play button click. */\n protected onPlayClick(): void {\n this.playAutoplay();\n }\n\n /** Pause button click. */\n protected onPauseClick(): void {\n this.pauseAutoplay();\n }\n\n /** Clone each item's projected picture and link into the corresponding carousel slide. */\n private clonePicturesToCarousel(): void {\n const imageWrappers = this.carouselImageWrappers();\n const contentWrappers = this.carouselContentWrappers();\n const itemsArray = this.items();\n const detailsArray = this.detailsPanels();\n\n itemsArray.forEach((item, i) => {\n const pictureEl = item.pictureRef();\n if (pictureEl && imageWrappers[i]) {\n const clone = pictureEl.nativeElement.cloneNode(true) as HTMLElement;\n imageWrappers[i].nativeElement.appendChild(clone);\n }\n });\n\n detailsArray.forEach((panel, i) => {\n const linkEl = panel.linkRef();\n if (linkEl && contentWrappers[i]) {\n const clone = linkEl.nativeElement.cloneNode(true) as HTMLElement;\n contentWrappers[i].nativeElement.appendChild(clone);\n }\n });\n }\n\n protected onEmblaChange(eventName: string): void {\n if (!this.emblaApi) {\n this.emblaApi = this.emblaRef()?.emblaApi;\n }\n if (!this.emblaApi) return;\n\n if (eventName === 'select' || eventName === 'init' || eventName === 'reInit') {\n this.syncCarouselState();\n }\n }\n\n /** Sync carousel state from Embla API. */\n private syncCarouselState(): void {\n if (!this.emblaApi) return;\n\n this.activeSlideIndex.set(this.emblaApi.selectedScrollSnap());\n this.prevDisabled.set(!this.emblaApi.canScrollPrev());\n this.nextDisabled.set(!this.emblaApi.canScrollNext());\n }\n\n /** Navigate carousel to previous slide. */\n protected onCarouselPrevClick(): void {\n this.emblaRef()?.scrollPrev();\n }\n\n /** Navigate carousel to next slide. */\n protected onCarouselNextClick(): void {\n this.emblaRef()?.scrollNext();\n }\n\n /** Navigate carousel to a specific slide. */\n protected goToSlide(index: number): void {\n this.emblaRef()?.scrollTo(index);\n }\n\n /** Returns dot indices for rendering. */\n protected getDotIndices(): number[] {\n return Array.from({ length: this.totalSlides() }, (_, i) => i);\n }\n\n /**\n * Pre-translated accessible label for each carousel dot, passed to the shared\n * slider pager. Translated here since the pager receives plain strings.\n */\n protected readonly dotAriaLabels = computed<string[]>(() => {\n const total = this.totalSlides();\n return Array.from({ length: total }, (_unused, dotIndex) =>\n this.translate.instant('ecl.story-card.GO-TO-SLIDE', {\n current: dotIndex + 1,\n total,\n }),\n );\n });\n}\n","@if (eclTitle() || eclDescription()) {\n<div class=\"ecl-story-card__header\">\n @if (eclTitle()) {\n <div class=\"ecl-story-card__title\">{{ eclTitle() }}</div>\n }\n @if (eclDescription()) {\n <div class=\"ecl-story-card__description\">{{ eclDescription() }}</div>\n }\n</div>\n}\n\n<!-- Mobile: Embla Carousel (auto-generated from items + details) -->\n<div class=\"ecl-story-card__carousel\">\n <div class=\"ecl-story-card__carousel-viewport\"\n role=\"region\"\n [attr.aria-label]=\"'ecl.story-card.SLIDER-LABEL' | translate\"\n emblaCarousel\n [options]=\"emblaOptions()\"\n [subscribeToEvents]=\"subscribeToEvents\"\n (emblaChange)=\"onEmblaChange($event)\">\n <ul class=\"ecl-story-card__carousel-container\">\n @for (item of items(); track i; let i = $index) {\n <li class=\"ecl-story-card__carousel-slide\"\n [attr.aria-hidden]=\"i !== activeSlideIndex() ? true : null\">\n <article class=\"ecl-story-card__card\">\n <div class=\"ecl-story-card__image-wrapper\" #carouselImageWrapper>\n </div>\n <div class=\"ecl-story-card__content\" #carouselContentWrapper>\n @if (detailsPanels()[i]; as panel) {\n @if (panel.teaserLabel()) {\n <div class=\"ecl-story-card__teaser-label\">{{ panel.teaserLabel() }}</div>\n }\n @if (panel.eclTitle()) {\n <div class=\"ecl-story-card__card-title\">{{ panel.eclTitle() }}</div>\n }\n @if (panel.description()) {\n <div class=\"ecl-story-card__card-description\">{{ panel.description() }}</div>\n }\n }\n </div>\n </article>\n </li>\n }\n </ul>\n </div>\n\n <!-- Carousel Controls -->\n @if (totalSlides() > 1) {\n <ecl-slider-pager\n class=\"ecl-story-card__pager\"\n variant=\"dots\"\n size=\"s\"\n prevExtraClasses=\"ecl-story-card__prev\"\n nextExtraClasses=\"ecl-story-card__next\"\n dotsExtraClasses=\"ecl-story-card__dots\"\n dotExtraClasses=\"ecl-story-card__dot\"\n [activeIndex]=\"activeSlideIndex()\"\n [isPrevDisabled]=\"prevDisabled()\"\n [isNextDisabled]=\"nextDisabled()\"\n [dotIndices]=\"getDotIndices()\"\n [dotAriaLabels]=\"dotAriaLabels()\"\n (prev)=\"onCarouselPrevClick()\"\n (next)=\"onCarouselNextClick()\"\n (goTo)=\"goToSlide($event)\">\n </ecl-slider-pager>\n }\n</div>\n\n<!-- Desktop: Grid with Accordion (user-authored content projected here) -->\n<div class=\"ecl-story-card__grid\">\n <!-- Grid Controls -->\n @if (totalSlides() > 1) {\n <ecl-slider-pager\n class=\"ecl-story-card__grid-controls\"\n variant=\"play-pause\"\n size=\"l\"\n [isPlaying]=\"isAutoPlaying()\"\n prevExtraClasses=\"ecl-story-card__grid-prev\"\n nextExtraClasses=\"ecl-story-card__grid-next\"\n playExtraClasses=\"ecl-story-card__grid-play\"\n pauseExtraClasses=\"ecl-story-card__grid-pause\"\n (prev)=\"onGridPrevClick()\"\n (next)=\"onGridNextClick()\"\n (play)=\"onPlayClick()\"\n (pause)=\"onPauseClick()\">\n </ecl-slider-pager>\n }\n\n <ng-content select=\"ul[eclStoryCardList]\"></ng-content>\n <ng-content select=\"[eclStoryCardGridDetails]\"></ng-content>\n</div>\n","import { EclStoryCardComponent } from './ecl-story-card.component';\nimport { EclStoryCardItemComponent } from './ecl-story-card-item/ecl-story-card-item.component';\nimport { EclStoryCardGridDetailsComponent } from './ecl-story-card-grid-details/ecl-story-card-grid-details.component';\nimport {\n EclStoryCardListDirective,\n EclStoryCardPictureDirective,\n EclStoryCardLinkDirective,\n} from './ecl-story-card-directives';\n\nexport * from './ecl-story-card.component';\nexport * from './ecl-story-card-item/ecl-story-card-item.component';\nexport * from './ecl-story-card-grid-details/ecl-story-card-grid-details.component';\nexport * from './ecl-story-card-directives';\n\nexport const EUI_ECL_STORY_CARD = [\n EclStoryCardComponent,\n EclStoryCardItemComponent,\n EclStoryCardGridDetailsComponent,\n EclStoryCardListDirective,\n EclStoryCardPictureDirective,\n EclStoryCardLinkDirective,\n] as const;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;AAGA;;;AAGG;AAQG,MAAO,yBAA0B,SAAQ,gBAAgB,CAAA;8GAAlD,yBAAyB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,SAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,mDAAA,EAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAAzB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAPrC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,sBAAsB;AAChC,oBAAA,IAAI,EAAE;AACF,wBAAA,IAAI,EAAE,SAAS;AACf,wBAAA,SAAS,EAAE,iDAAiD;AAC/D,qBAAA;AACJ,iBAAA;;AAGD;;;AAGG;AAOG,MAAO,4BAA6B,SAAQ,gBAAgB,CAAA;8GAArD,4BAA4B,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAA5B,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,wDAAA,EAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAA5B,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBANxC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,8BAA8B;AACxC,oBAAA,IAAI,EAAE;AACF,wBAAA,SAAS,EAAE,sDAAsD;AACpE,qBAAA;AACJ,iBAAA;;AAGD;;;AAGG;AAOG,MAAO,yBAA0B,SAAQ,gBAAgB,CAAA;8GAAlD,yBAAyB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,sFAAA,EAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAAzB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBANrC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,oBAAoB;AAC9B,oBAAA,IAAI,EAAE;AACF,wBAAA,SAAS,EAAE,oFAAoF;AAClG,qBAAA;AACJ,iBAAA;;;ACvBD;;;;;;;;;;;;;AAaG;AAUG,MAAO,yBAA0B,SAAQ,gBAAgB,CAAA;AAT/D,IAAA,WAAA,GAAA;;;QAYa,IAAA,CAAA,SAAS,GAAG,KAAK,CAAS,EAAE;sFAAC;;QAG7B,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,KAAK;uFAAC;;QAG1B,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,KAAK;0FAAC;;QAG7B,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,CAAC;kFAAC;;QAGjB,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,EAAE;kFAAC;;QAGlB,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,EAAE;oFAAC;;QAGpB,IAAA,CAAA,SAAS,GAAG,MAAM,EAAU;;QAG5B,IAAA,CAAA,sBAAsB,GAAG,MAAM,EAAQ;AAEhD;;;AAGG;QACM,IAAA,CAAA,UAAU,GAAG,MAAM,EAAiB;;QAGpC,IAAA,CAAA,UAAU,GAAG,YAAY,CAAC,4BAA4B,kFAAI,IAAI,EAAE,UAAU,EAAA,CAAG;QAErE,IAAA,CAAA,SAAS,GAAG,SAAS,CAAgC,WAAW;sFAAC;AAEzE,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAAM;AACjC,YAAA,KAAK,CAAC,aAAa,CAAC,2BAA2B,CAAC;YAChD,IAAI,CAAC,UAAU,EAAE,GAAG,qCAAqC,GAAG,EAAE;AACjE,SAAA,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE;uFAAC;AAkBtB,IAAA;;IAfG,WAAW,GAAA;QACP,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE;IAC3C;IAEU,aAAa,GAAA;QACnB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACrC;IAEU,cAAc,GAAA;AACpB,QAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE;IACtC;AAEU,IAAA,SAAS,CAAC,KAAoB,EAAA;AACpC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/B;8GAzDS,yBAAyB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,cAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,cAAA,EAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAiCC,4BAA4B,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EAAU,UAAU,4LCtEvF,47BAyBA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FDYa,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBATrC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,EAAA,IAAA,EAE1B;AACF,wBAAA,IAAI,EAAE,cAAc;AACpB,wBAAA,SAAS,EAAE,cAAc;qBAC5B,EAAA,eAAA,EACgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,47BAAA,EAAA;AAmCZ,SAAA,CAAA,EAAA,cAAA,EAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,sBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,wBAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAAA,4BAA4B,QAAE,EAAE,IAAI,EAAE,UAAU,EAAE,iEAEf,WAAW,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AE5DrF;;;;;;;;;;AAUG;AAcG,MAAO,gCAAiC,SAAQ,gBAAgB,CAAA;AAsClE,IAAA,WAAA,GAAA;AACI,QAAA,KAAK,EAAE;;QApCF,IAAA,CAAA,WAAW,GAAG,KAAK,CAAS,EAAE;wFAAC;;QAG/B,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAS,EAAE;qFAAC;;QAG5B,IAAA,CAAA,WAAW,GAAG,KAAK,CAAS,EAAE;wFAAC;;QAG/B,IAAA,CAAA,MAAM,GAAG,KAAK,CAAS,EAAE;mFAAC;;QAG1B,IAAA,CAAA,IAAI,GAAG,KAAK,CAAS,EAAE;iFAAC;;QAGxB,IAAA,CAAA,MAAM,GAAG,KAAK,CAAS,EAAE;mFAAC;;QAG1B,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,KAAK;qFAAC;;QAGxB,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,KAAK;0FAAC;;QAG7B,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,CAAC;kFAAC;;QAGjB,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,EAAE;oFAAC;;QAGpB,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,EAAE;kFAAC;;QAGlB,IAAA,CAAA,OAAO,GAAG,YAAY,CAAC,yBAAyB,+EAAI,IAAI,EAAE,UAAU,EAAA,CAAG;;;;QAQ5E,MAAM,CAAC,MAAK;AACR,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE;AAC3B,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,YAAA,IAAI,IAAI,IAAI,KAAK,EAAE;gBACf,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,kBAAkB,EAAE,KAAK,CAAC;YAC9D;AACJ,QAAA,CAAC,CAAC;IACN;8GAnDS,gCAAgC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAhC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,gCAAgC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,iDAAA,EAAA,SAAA,EAAA,WAAA,EAAA,WAAA,EAAA,cAAA,EAAA,sBAAA,EAAA,SAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAoCT,yBAAyB,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EAAU,UAAU,oECxEjF,wpDAqCA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FDDa,gCAAgC,EAAA,UAAA,EAAA,CAAA;kBAb5C,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,2BAA2B,EAAA,IAAA,EAE/B;AACF,wBAAA,SAAS,EAAE,+CAA+C;AAC1D,wBAAA,WAAW,EAAE,WAAW;AACxB,wBAAA,aAAa,EAAE,YAAY;AAC3B,wBAAA,wBAAwB,EAAE,SAAS;AACnC,wBAAA,iBAAiB,EAAE,qBAAqB;AACxC,wBAAA,UAAU,EAAE,aAAa;qBAC5B,EAAA,eAAA,EACgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,wpDAAA,EAAA;AAsCf,SAAA,CAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAAA,yBAAyB,CAAA,EAAA,EAAA,GAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEvCnF;;;;;;;;;;;;;AAaG;AAgBG,MAAO,qBAAsB,SAAQ,gBAAgB,CAAA;AAsEvD,IAAA,WAAA,GAAA;AACI,QAAA,KAAK,EAAE;;QApEF,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAS,EAAE;qFAAC;;QAG5B,IAAA,CAAA,cAAc,GAAG,KAAK,CAAS,EAAE;2FAAC;;QAGlC,IAAA,CAAA,OAAO,GAAG,KAAK,CAA0B,OAAO;oFAAC;;QAGjD,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,KAAK,kFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;QAG1D,IAAA,CAAA,aAAa,GAAG,KAAK,CAAS,KAAK;0FAAC;;QAGpC,IAAA,CAAA,KAAK,GAAG,KAAK,CAAS,EAAE,6EAAI,KAAK,EAAE,IAAI,EAAA,CAAG;;QAG1C,IAAA,CAAA,eAAe,GAAG,MAAM,EAA8B;AAE9C,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AACrC,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAEpC,QAAA,IAAA,CAAA,WAAW,GAAG,CAAA,WAAA,EAAc,MAAM,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;AAC3D,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,WAAW;wFAAC;;AAGhE,QAAA,IAAA,CAAA,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;;AAG5E,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAA8C,OAAO;AAC3F,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,KAAK;SAC1C,CAAC;yFAAC;;QAGgB,IAAA,CAAA,iBAAiB,GAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;;QAGlE,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,CAAC;6FAAC;;QAG5B,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM;wFAAC;;QAGjD,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,KAAK;yFAAC;;QAG5B,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,KAAK;yFAAC;;QAG5B,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,CAAC;0FAAC;;QAGzB,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,KAAK;0FAAC;QAE7B,IAAA,CAAA,KAAK,GAAG,eAAe,CAAC,yBAAyB,6EAAI,WAAW,EAAE,IAAI,EAAA,CAAG;QAEzE,IAAA,CAAA,aAAa,GAAG,eAAe,CAAC,gCAAgC,qFAAI,WAAW,EAAE,IAAI,EAAA,CAAG;QAE1F,IAAA,CAAA,QAAQ,GAAG,SAAS,CAAC,sBAAsB;qFAAC;QAC5C,IAAA,CAAA,qBAAqB,GAAG,YAAY,CAAa,sBAAsB;kGAAC;QACxE,IAAA,CAAA,uBAAuB,GAAG,YAAY,CAAa,wBAAwB;oGAAC;AAE5E,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,OAAO,EAAQ;AAmB5C,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAAM;AACjC,YAAA,KAAK,CAAC,aAAa,CAAC,gBAAgB,CAAC;YACrC,IAAI,CAAC,cAAc,EAAE,GAAG,iCAAiC,GAAG,EAAE;AAC9D,YAAA,IAAI,CAAC,OAAO,EAAE,KAAK,aAAa,GAAG,6BAA6B,GAAG,EAAE;AACxE,SAAA,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE;uFAAC;QAEV,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,aAAa,EAAE,CAAA,EAAA,CAAI;0FAAC;AAwOpE;;;AAGG;AACgB,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAW,MAAK;AACvD,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE;YAChC,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,QAAQ,KACnD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,4BAA4B,EAAE;gBACjD,OAAO,EAAE,QAAQ,GAAG,CAAC;gBACrB,KAAK;AACR,aAAA,CAAC,CACL;QACL,CAAC;0FAAC;QAxQE,eAAe,CAAC,MAAK;YACjB,UAAU,CAAC,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;AACpD,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;AACR,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE;AAC/B,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,EAAE;YAEzC,SAAS,CAAC,MAAK;AACX,gBAAA,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,YAAY,CAAC;AAC5C,YAAA,CAAC,CAAC;AACN,QAAA,CAAC,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;IACnC;IAUA,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;AAC1B,QAAA,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE;IAClC;AAEA;;;;AAIG;IACK,SAAS,CACb,UAAgD,EAChD,YAAyD,EAAA;AAEzD,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;AAC1B,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE;QAE7B,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,KAAI;AAC3B,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YACjB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,KAAA,EAAQ,CAAC,CAAA,CAAE,CAAC;YAChC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,SAAA,EAAY,CAAC,CAAA,CAAE,CAAC;AACtC,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,aAAa,EAAE,CAAC;YAC/C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;AAE5C,YAAA,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CACnC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CACjC,CAAC,SAAS,CAAC,CAAC,KAAa,KAAK,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAE3D,kBAAkB,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAChD,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CACjC,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,wBAAwB,EAAE,CAAC;AAElD,YAAA,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CACpC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CACjC,CAAC,SAAS,CAAC,CAAC,KAAoB,KAAK,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAC3E,QAAA,CAAC,CAAC;QAEF,YAAY,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,KAAI;AAC9B,YAAA,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YAClB,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,SAAA,EAAY,CAAC,CAAA,CAAE,CAAC;YACvC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,KAAA,EAAQ,CAAC,CAAA,CAAE,CAAC;AACjC,YAAA,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,aAAa,EAAE,CAAC;AAC9C,YAAA,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,aAAa,CAAC;AAC7D,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YACnB,IAAI,CAAC,YAAY,EAAE;QACvB;IACJ;;AAGQ,IAAA,WAAW,CAAC,KAAa,EAAA;AAC7B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE;AAC/B,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,EAAE;AACzC,QAAA,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE;AAE7B,QAAA,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,GAAG,UAAU,CAAC,MAAM,IAAI,UAAU,CAAC,MAAM,IAAI,UAAU,CAAC,MAAM;QAEvF,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,KAAI;YAC3B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,SAAS,CAAC;YACpC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;AAChD,QAAA,CAAC,CAAC;QAEF,YAAY,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,KAAI;YAC9B,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,SAAS,CAAC;AACvC,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC;QACjC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IACnD;;AAGQ,IAAA,eAAe,CAAC,KAAa,EAAA;AACjC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE;QAC/B,MAAM,mBAAmB,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE;QAE3D,IAAI,mBAAmB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE;YAC9C,IAAI,CAAC,YAAY,EAAE;QACvB;aAAO;YACH,IAAI,CAAC,aAAa,EAAE;QACxB;AAEA,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;IAC3B;;IAGU,eAAe,GAAA;QACrB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;IAC9C;;IAGU,eAAe,GAAA;QACrB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;IAC9C;AAEA;;;;;;;;;;;AAWG;IACK,iBAAiB,CAAC,KAAoB,EAAE,KAAa,EAAA;AACzD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE;AAC/B,QAAA,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM;AAC/B,QAAA,IAAI,KAAK,KAAK,CAAC,EAAE;YACb;QACJ;QAEA,IAAI,WAAW,GAAkB,IAAI;AAErC,QAAA,QAAQ,KAAK,CAAC,GAAG;YACb,KAAK,OAAO,CAAC,WAAW;gBACpB,WAAW,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK;gBACjC;YACJ,KAAK,OAAO,CAAC,UAAU;gBACnB,WAAW,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,KAAK,IAAI,KAAK;gBACzC;YACJ,KAAK,OAAO,CAAC,IAAI;gBACb,WAAW,GAAG,CAAC;gBACf;YACJ,KAAK,OAAO,CAAC,GAAG;AACZ,gBAAA,WAAW,GAAG,KAAK,GAAG,CAAC;gBACvB;AACJ,YAAA;gBACI;;QAGR,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,UAAU,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE;IAC1C;;IAGQ,wBAAwB,GAAA;AAC5B,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;YACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QAC9C;IACJ;;IAGU,YAAY,GAAA;AAClB,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,GAAG,CAAC;YAAE;AAC7B,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5B,QAAA,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9D;IAEU,aAAa,GAAA;AACnB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7B,QAAA,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC/D;;IAGU,WAAW,GAAA;QACjB,IAAI,CAAC,YAAY,EAAE;IACvB;;IAGU,YAAY,GAAA;QAClB,IAAI,CAAC,aAAa,EAAE;IACxB;;IAGQ,uBAAuB,GAAA;AAC3B,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,qBAAqB,EAAE;AAClD,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,uBAAuB,EAAE;AACtD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE;AAC/B,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,EAAE;QAEzC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,KAAI;AAC3B,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE;AACnC,YAAA,IAAI,SAAS,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE;gBAC/B,MAAM,KAAK,GAAG,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAgB;gBACpE,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC;YACrD;AACJ,QAAA,CAAC,CAAC;QAEF,YAAY,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,KAAI;AAC9B,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,EAAE;AAC9B,YAAA,IAAI,MAAM,IAAI,eAAe,CAAC,CAAC,CAAC,EAAE;gBAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAgB;gBACjE,eAAe,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC;YACvD;AACJ,QAAA,CAAC,CAAC;IACN;AAEU,IAAA,aAAa,CAAC,SAAiB,EAAA;AACrC,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAChB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,QAAQ;QAC7C;QACA,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE;AAEpB,QAAA,IAAI,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,QAAQ,EAAE;YAC1E,IAAI,CAAC,iBAAiB,EAAE;QAC5B;IACJ;;IAGQ,iBAAiB,GAAA;QACrB,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE;AAEpB,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;AAC7D,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;AACrD,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;IACzD;;IAGU,mBAAmB,GAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE;IACjC;;IAGU,mBAAmB,GAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE;IACjC;;AAGU,IAAA,SAAS,CAAC,KAAa,EAAA;QAC7B,IAAI,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC;IACpC;;IAGU,aAAa,GAAA;QACnB,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IAClE;8GAlUS,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,IAAA,EAAA,eAAA,EAAA,OAAA,EAAA,cAAA,EAAA,uCAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,OAAA,EAAA,SAAA,EA2Da,yBAAyB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,eAAA,EAAA,SAAA,EAEjB,gCAAgC,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAE7C,sBAAsB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,uBAAA,EAAA,SAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,yBAAA,EAAA,SAAA,EAAA,CAAA,wBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7HhE,omHA2FA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,YAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,mBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDjCQ,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,oBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAFtB,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAMR,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAfjC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,EAAA,IAAA,EAE3B;AACF,wBAAA,MAAM,EAAE,eAAe;AACvB,wBAAA,SAAS,EAAE,cAAc;AACzB,wBAAA,yCAAyC,EAAE,iBAAiB;qBAC/D,EAAA,OAAA,EACQ;wBACL,aAAa;AACb,wBAAA,GAAG,cAAc;wBACjB,sBAAsB;qBACzB,EAAA,eAAA,EACgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,omHAAA,EAAA;AA6DJ,SAAA,CAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,eAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,IAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAAA,yBAAyB,QAAE,EAAE,WAAW,EAAE,IAAI,EAAE,+FAExC,gCAAgC,CAAA,EAAA,EAAA,GAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAEpE,sBAAsB,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,qBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CACM,sBAAsB,oFACpB,wBAAwB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEjHzF,MAAM,kBAAkB,GAAG;IAC9B,qBAAqB;IACrB,yBAAyB;IACzB,gCAAgC;IAChC,yBAAyB;IACzB,4BAA4B;IAC5B,yBAAyB;;;ACpB7B;;AAEG;;"}
|