@eui/ecl 22.0.0-alpha.37 → 22.0.0-alpha.39

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.
@@ -47,8 +47,53 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImpor
47
47
  * Uses Embla Carousel (via embla-carousel-angular) with the auto-scroll plugin
48
48
  * to match the ECL vanilla implementation.
49
49
  *
50
- * The component clones projected slides internally to ensure the track is wide
51
- * enough for seamless infinite scrolling (matching the vanilla ECL approach).
50
+ * ## Why two lists (hidden source + generated track)
51
+ *
52
+ * The consumer provides a plain, semantic list:
53
+ *
54
+ * ```html
55
+ * <ecl-slogan-ticker>
56
+ * <ul eclSloganTickerList>
57
+ * <li eclSloganTickerSlide>SLOGAN ONE</li>
58
+ * <li eclSloganTickerSlide>SLOGAN TWO</li>
59
+ * </ul>
60
+ * </ecl-slogan-ticker>
61
+ * ```
62
+ *
63
+ * This authored `<ul eclSloganTickerList>` is NOT the list you see scrolling.
64
+ * `EclSloganTickerListDirective` hides it with `display: none`, and it stays in
65
+ * the light DOM as the single accessible source of truth. The component reads
66
+ * the slide texts out of it via a `contentChildren` query (see `slides`) and
67
+ * builds a SEPARATE, component-owned `<ul class="ecl-slogan-ticker__track">`
68
+ * from the `trackSlides` signal. That generated track is what Embla animates.
69
+ *
70
+ * Reasons for the split (rather than just scrolling the authored `<ul>`):
71
+ *
72
+ * - Seamless infinite loop needs more content than the author gives. The track
73
+ * must be several times wider than the viewport or the loop visibly jumps, so
74
+ * `ensureEnoughContent()` measures the originals and appends CLONE sets until
75
+ * the total width reaches `CLONE_MULTIPLIER` × the container width.
76
+ * - Clones must not pollute accessibility. The authored list stays the one
77
+ * accessible list; every generated clone is rendered with `aria-hidden` so a
78
+ * screen reader announces each slogan once, not once per clone.
79
+ * - You cannot meaningfully grow the authored `<ul>`. Its `<li>` children are
80
+ * Angular-projected content that Angular owns; imperatively appending clone
81
+ * `<li>` nodes into it fights change detection. Building our own track signal
82
+ * and letting `@for` render it is clean and safe. `<li>` is also only valid
83
+ * inside a list element, so the `<ul eclSloganTickerList>` wrapper keeps the
84
+ * consumer's authored markup valid and self-contained.
85
+ *
86
+ * This mirrors the vanilla ECL slogan ticker (hidden source list + measured,
87
+ * cloned, auto-scrolling track).
88
+ *
89
+ * ## Testing note
90
+ *
91
+ * The visible track is only built after a real width measurement
92
+ * (`offsetWidth`). Under jsdom every element reports a width of 0, so
93
+ * `ensureEnoughContent()` bails early and the generated track stays empty. Unit
94
+ * tests should therefore assert slide-driven behavior through its observable
95
+ * effects (e.g. the play/pause controls appearing) rather than through the
96
+ * generated track DOM.
52
97
  */
53
98
  class EclSloganTickerComponent extends ECLBaseDirective {
54
99
  get cssClasses() {
@@ -96,6 +141,12 @@ class EclSloganTickerComponent extends ECLBaseDirective {
96
141
  ...(ngDevMode ? [{ debugName: "trackSlides" }] : /* istanbul ignore next */ []));
97
142
  /** Subscribed Embla events. */
98
143
  this.subscribeToEvents = ['init', 'reInit'];
144
+ /**
145
+ * Slides read from the consumer's hidden `<ul eclSloganTickerList>` source
146
+ * list. This is the DATA source only; the visible track is a separate,
147
+ * component-generated list built from `trackSlides`. See the class-level
148
+ * doc for why the authored list and the rendered track are kept separate.
149
+ */
99
150
  this.slides = contentChildren(EclSloganTickerSlideDirective, { ...(ngDevMode ? { debugName: "slides" } : /* istanbul ignore next */ {}), descendants: true });
100
151
  this.cd = inject(ChangeDetectorRef);
101
152
  this.elementRef = inject(ElementRef);
@@ -1 +1 @@
1
- {"version":3,"file":"eui-ecl-components-ecl-slogan-ticker.mjs","sources":["../../components/ecl-slogan-ticker/ecl-slogan-ticker-slide.directive.ts","../../components/ecl-slogan-ticker/ecl-slogan-ticker.component.ts","../../components/ecl-slogan-ticker/ecl-slogan-ticker.component.html","../../components/ecl-slogan-ticker/ecl-slogan-ticker-list.directive.ts","../../components/ecl-slogan-ticker/index.ts","../../components/ecl-slogan-ticker/eui-ecl-components-ecl-slogan-ticker.ts"],"sourcesContent":["import {\n Directive,\n ElementRef,\n inject,\n} from '@angular/core';\n\n/**\n * Directive marking a single slide item within the ECL Slogan Ticker.\n * Applied to `<li>` elements to identify them as ticker slides.\n *\n * The parent `ecl-slogan-ticker` component uses ContentChildren to query these\n * directives and clones them in the DOM to ensure seamless looping.\n *\n * Usage:\n * ```html\n * <li eclSloganTickerSlide>GENERATE YOUR OWN ENERGY</li>\n * ```\n */\n@Directive({\n selector: 'li[eclSloganTickerSlide]',\n host: {\n class: 'ecl-slogan-ticker__slide',\n },\n})\nexport class EclSloganTickerSlideDirective {\n\n /** Element reference for text extraction and width measurement. */\n el = inject(ElementRef);\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n contentChildren,\n effect,\n ElementRef,\n inject,\n input,\n OnDestroy,\n PLATFORM_ID,\n signal,\n viewChild,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { EUI_ECL_ICON } 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 { EmblaCarouselType, EmblaEventType, EmblaPluginType } from 'embla-carousel';\nimport AutoScroll from 'embla-carousel-auto-scroll';\nimport { Subject, takeUntil } from 'rxjs';\nimport { EclSloganTickerSlideDirective } from './ecl-slogan-ticker-slide.directive';\n\n/**\n * ECL Slogan Ticker component – renders a continuously auto-scrolling horizontal\n * ticker of slogan items. Supports play/pause controls, RTL layouts, and pauses\n * when off-screen via IntersectionObserver.\n *\n * Uses Embla Carousel (via embla-carousel-angular) with the auto-scroll plugin\n * to match the ECL vanilla implementation.\n *\n * The component clones projected slides internally to ensure the track is wide\n * enough for seamless infinite scrolling (matching the vanilla ECL approach).\n */\n@Component({\n selector: 'ecl-slogan-ticker',\n templateUrl: './ecl-slogan-ticker.component.html',\n host: {\n '[class]': 'cssClasses',\n },\n imports: [\n TranslatePipe,\n ...EUI_ECL_ICON,\n EmblaCarouselDirective,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EclSloganTickerComponent extends ECLBaseDirective implements AfterViewInit, OnDestroy {\n\n /** Aria-label for the ticker region. */\n eclAriaLabel = input<string>('Slogan ticker');\n\n /** Embla carousel options. */\n protected emblaOptions: { loop: boolean; align: 'start'; dragFree: boolean; direction: 'ltr' | 'rtl' } = {\n loop: true,\n align: 'start',\n dragFree: true,\n direction: 'ltr',\n };\n\n /** Embla plugins array (auto-scroll). */\n protected emblaPlugins: EmblaPluginType[] = [];\n\n protected emblaRef = viewChild(EmblaCarouselDirective);\n protected playButton = viewChild<ElementRef>('playButton');\n protected pauseButton = viewChild<ElementRef>('pauseButton');\n protected viewportElement = viewChild<ElementRef>('viewport');\n private trackElement = viewChild<ElementRef>('track');\n\n /** Whether auto-scroll is currently playing. */\n protected isPlaying = signal(false);\n\n /** Whether the user explicitly paused. */\n protected isPaused = signal(false);\n\n /** Whether play/pause controls should be visible. */\n protected showControls = signal(false);\n\n /**\n * Array of slide texts used to render the track.\n * Contains the original slides plus clones for seamless looping.\n * Each item has `text` and `isClone` (for aria-hidden on duplicates).\n */\n protected trackSlides = signal<{ text: string; isClone: boolean }[]>([]);\n\n /** Subscribed Embla events. */\n protected subscribeToEvents: EmblaEventType[] = ['init', 'reInit'];\n\n private slides = contentChildren(EclSloganTickerSlideDirective, { descendants: true });\n private cd = inject(ChangeDetectorRef);\n private elementRef = inject(ElementRef);\n private eclRtlService = inject(EclRtlService);\n private platformId = inject(PLATFORM_ID);\n private destroy$ = new Subject<void>();\n private emblaApi: EmblaCarouselType | undefined;\n private visibilityObserver: IntersectionObserver | null = null;\n private readonly autoplay = true;\n private readonly autoScrollSpeed = 0.9;\n private readonly CLONE_MULTIPLIER = 3;\n\n protected get cssClasses(): string {\n return [super.getCssClasses('ecl-slogan-ticker')].join(' ').trim();\n }\n\n constructor() {\n super();\n\n // React to slides changes\n effect(() => {\n this.showControls.set(this.slides().length >= 1);\n });\n\n // React to RTL changes\n this.eclRtlService.currentRtlState$.pipe(takeUntil(this.destroy$)).subscribe((isRtl) => {\n const direction = isRtl ? 'rtl' : 'ltr';\n if (this.emblaOptions.direction !== direction) {\n this.emblaOptions = { ...this.emblaOptions, direction };\n this.buildPlugins(isRtl);\n this.cd.detectChanges();\n }\n });\n }\n\n ngAfterViewInit(): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n\n this.buildPlugins();\n this.cd.detectChanges();\n\n setTimeout(() => {\n this.ensureEnoughContent();\n this.initEmbla();\n this.setupVisibilityObserver();\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n\n if (this.visibilityObserver) {\n this.visibilityObserver.disconnect();\n this.visibilityObserver = null;\n }\n }\n\n /** Called by the emblaChange event from the directive. */\n protected onEmblaChange(eventName: string): void {\n if (!this.emblaApi) {\n this.emblaApi = this.emblaRef()?.emblaApi;\n }\n if (!this.emblaApi) {\n return;\n }\n\n if (eventName === 'init' || eventName === 'reInit') {\n if (this.autoplay && !this.isPaused()) {\n this.startAutoScroll();\n }\n }\n }\n\n /** Start the auto-scroll (play button click). */\n protected onPlayClick(): void {\n this.isPaused.set(false);\n this.startAutoScroll();\n this.pauseButton()?.nativeElement?.focus();\n }\n\n /** Pause the auto-scroll (pause button click). */\n protected onPauseClick(): void {\n this.isPaused.set(true);\n this.stopAutoScroll();\n this.playButton()?.nativeElement?.focus();\n }\n\n /** Start auto-scroll and update state. */\n private startAutoScroll(): void {\n this.isPlaying.set(true);\n const autoScroll = this.emblaApi?.plugins()?.autoScroll;\n (autoScroll as any)?.play();\n this.cd.detectChanges();\n }\n\n /** Stop auto-scroll and update state. */\n private stopAutoScroll(): void {\n this.isPlaying.set(false);\n const autoScroll = this.emblaApi?.plugins()?.autoScroll;\n (autoScroll as any)?.stop();\n this.cd.detectChanges();\n }\n\n /**\n * Clone slides until the track width exceeds 3× container width.\n * Mirrors the vanilla ECL `ensureEnoughContent()` logic.\n */\n private ensureEnoughContent(): void {\n const slides = this.slides();\n if (!slides || slides.length === 0) {\n this.trackSlides.set([]);\n return;\n }\n\n const containerWidth = this.elementRef.nativeElement.offsetWidth;\n if (containerWidth === 0) {\n return;\n }\n\n const originals = slides.map((slide) => ({\n text: slide.el.nativeElement.textContent?.trim() || '',\n isClone: false,\n }));\n\n // Render originals first to measure individual slide widths\n this.trackSlides.set(originals);\n this.cd.detectChanges();\n\n const track = this.trackElement()?.nativeElement;\n if (!track) {\n return;\n }\n\n // Measure each rendered slide's width\n const renderedSlides = track.querySelectorAll('.ecl-slogan-ticker__slide');\n const slideWidths: number[] = [];\n let totalWidth = 0;\n renderedSlides.forEach((el: Element) => {\n const width = (el as HTMLElement).offsetWidth;\n slideWidths.push(width);\n totalWidth += width;\n });\n\n if (totalWidth === 0) {\n return;\n }\n\n // Add clones in full sets until total width >= required width\n const requiredWidth = containerWidth * this.CLONE_MULTIPLIER;\n const allSlides = [...originals];\n\n while (totalWidth < requiredWidth) {\n for (let i = 0; i < originals.length; i++) {\n allSlides.push({ ...originals[i], isClone: true });\n totalWidth += slideWidths[i];\n }\n }\n\n this.trackSlides.set(allSlides);\n this.cd.detectChanges();\n }\n\n /** Build the auto-scroll plugin with current settings. */\n private buildPlugins(isRtl = this.emblaOptions.direction === 'rtl'): void {\n this.emblaPlugins = [\n AutoScroll({\n speed: this.autoScrollSpeed,\n startDelay: 0,\n stopOnInteraction: false,\n playOnInit: this.autoplay,\n direction: isRtl ? 'backward' : 'forward',\n }) as unknown as EmblaPluginType,\n ];\n }\n\n /** Initialize Embla API reference. */\n private initEmbla(): void {\n const embla = this.emblaRef();\n if (!embla) {\n return;\n }\n\n this.emblaApi = embla.emblaApi;\n\n if (!this.emblaApi) {\n return;\n }\n\n if (this.autoplay && !this.isPaused()) {\n this.startAutoScroll();\n }\n\n this.cd.detectChanges();\n }\n\n /**\n * Observe visibility to pause auto-scroll when the component is off-screen\n * and resume when it comes back into view.\n */\n private setupVisibilityObserver(): void {\n this.visibilityObserver = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n if (!this.isPlaying() && !this.isPaused()) {\n this.startAutoScroll();\n }\n } else if (this.isPlaying()) {\n this.stopAutoScroll();\n }\n },\n { threshold: 0 },\n );\n\n this.visibilityObserver.observe(this.elementRef.nativeElement);\n }\n}\n","<div\n #viewport\n class=\"ecl-slogan-ticker__viewport\"\n [attr.aria-label]=\"eclAriaLabel()\"\n emblaCarousel\n [options]=\"emblaOptions\"\n [plugins]=\"emblaPlugins\"\n [subscribeToEvents]=\"subscribeToEvents\"\n (emblaChange)=\"onEmblaChange($event)\">\n\n <ul #track class=\"ecl-slogan-ticker__track\">\n @for (slide of trackSlides(); track $index) {\n <li class=\"ecl-slogan-ticker__slide\" [attr.aria-hidden]=\"slide.isClone ? true : null\">{{ slide.text }}</li>\n }\n </ul>\n</div>\n\n@if (showControls()) {\n<div class=\"ecl-slogan-ticker__controls\">\n <button\n #playButton\n class=\"ecl-button ecl-button--tertiary ecl-slogan-ticker__button ecl-slogan-ticker__play ecl-button--icon-only\"\n type=\"button\"\n [style.display]=\"isPlaying() ? 'none' : 'flex'\"\n (click)=\"onPlayClick()\">\n <span class=\"ecl-button__container\">\n <span class=\"ecl-button__label\">\n {{ 'ecl.slogan-ticker.PLAY' | translate }}\n </span>\n <ecl-icon icon=\"play\" size=\"l\" iconSet=\"phosphor-fill\" class=\"ecl-button__icon\"></ecl-icon>\n </span>\n </button>\n\n <button\n #pauseButton\n class=\"ecl-button ecl-button--tertiary ecl-slogan-ticker__button ecl-slogan-ticker__pause ecl-button--icon-only\"\n type=\"button\"\n [style.display]=\"isPlaying() ? 'flex' : 'none'\"\n (click)=\"onPauseClick()\">\n <span class=\"ecl-button__container\">\n <span class=\"ecl-button__label\">\n {{ 'ecl.slogan-ticker.PAUSE' | translate }}\n </span>\n <ecl-icon icon=\"pause\" iconSet=\"phosphor-fill\" size=\"l\" class=\"ecl-button__icon\"></ecl-icon>\n </span>\n </button>\n</div>\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Directive applied to the `<ul>` element wrapping slogan ticker slides.\n * Provides semantic structure for the ticker content.\n *\n * Usage:\n * ```html\n * <ecl-slogan-ticker>\n * <ul eclSloganTickerList>\n * <li eclSloganTickerSlide>Slide 1</li>\n * <li eclSloganTickerSlide>Slide 2</li>\n * </ul>\n * </ecl-slogan-ticker>\n * ```\n */\n@Directive({\n selector: 'ul[eclSloganTickerList]',\n host: {\n style: 'display: none',\n },\n})\nexport class EclSloganTickerListDirective {}\n","import { EclSloganTickerComponent } from './ecl-slogan-ticker.component';\nimport { EclSloganTickerListDirective } from './ecl-slogan-ticker-list.directive';\nimport { EclSloganTickerSlideDirective } from './ecl-slogan-ticker-slide.directive';\n\nexport * from './ecl-slogan-ticker.component';\nexport * from './ecl-slogan-ticker-list.directive';\nexport * from './ecl-slogan-ticker-slide.directive';\n\nexport const EUI_ECL_SLOGAN_TICKER = [\n EclSloganTickerComponent,\n EclSloganTickerListDirective,\n EclSloganTickerSlideDirective,\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-slogan-ticker.mjs","sources":["../../components/ecl-slogan-ticker/ecl-slogan-ticker-slide.directive.ts","../../components/ecl-slogan-ticker/ecl-slogan-ticker.component.ts","../../components/ecl-slogan-ticker/ecl-slogan-ticker.component.html","../../components/ecl-slogan-ticker/ecl-slogan-ticker-list.directive.ts","../../components/ecl-slogan-ticker/index.ts","../../components/ecl-slogan-ticker/eui-ecl-components-ecl-slogan-ticker.ts"],"sourcesContent":["import {\n Directive,\n ElementRef,\n inject,\n} from '@angular/core';\n\n/**\n * Directive marking a single slide item within the ECL Slogan Ticker.\n * Applied to `<li>` elements to identify them as ticker slides.\n *\n * The parent `ecl-slogan-ticker` component uses ContentChildren to query these\n * directives and clones them in the DOM to ensure seamless looping.\n *\n * Usage:\n * ```html\n * <li eclSloganTickerSlide>GENERATE YOUR OWN ENERGY</li>\n * ```\n */\n@Directive({\n selector: 'li[eclSloganTickerSlide]',\n host: {\n class: 'ecl-slogan-ticker__slide',\n },\n})\nexport class EclSloganTickerSlideDirective {\n\n /** Element reference for text extraction and width measurement. */\n el = inject(ElementRef);\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n contentChildren,\n effect,\n ElementRef,\n inject,\n input,\n OnDestroy,\n PLATFORM_ID,\n signal,\n viewChild,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { EUI_ECL_ICON } 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 { EmblaCarouselType, EmblaEventType, EmblaPluginType } from 'embla-carousel';\nimport AutoScroll from 'embla-carousel-auto-scroll';\nimport { Subject, takeUntil } from 'rxjs';\nimport { EclSloganTickerSlideDirective } from './ecl-slogan-ticker-slide.directive';\n\n/**\n * ECL Slogan Ticker component – renders a continuously auto-scrolling horizontal\n * ticker of slogan items. Supports play/pause controls, RTL layouts, and pauses\n * when off-screen via IntersectionObserver.\n *\n * Uses Embla Carousel (via embla-carousel-angular) with the auto-scroll plugin\n * to match the ECL vanilla implementation.\n *\n * ## Why two lists (hidden source + generated track)\n *\n * The consumer provides a plain, semantic list:\n *\n * ```html\n * <ecl-slogan-ticker>\n * <ul eclSloganTickerList>\n * <li eclSloganTickerSlide>SLOGAN ONE</li>\n * <li eclSloganTickerSlide>SLOGAN TWO</li>\n * </ul>\n * </ecl-slogan-ticker>\n * ```\n *\n * This authored `<ul eclSloganTickerList>` is NOT the list you see scrolling.\n * `EclSloganTickerListDirective` hides it with `display: none`, and it stays in\n * the light DOM as the single accessible source of truth. The component reads\n * the slide texts out of it via a `contentChildren` query (see `slides`) and\n * builds a SEPARATE, component-owned `<ul class=\"ecl-slogan-ticker__track\">`\n * from the `trackSlides` signal. That generated track is what Embla animates.\n *\n * Reasons for the split (rather than just scrolling the authored `<ul>`):\n *\n * - Seamless infinite loop needs more content than the author gives. The track\n * must be several times wider than the viewport or the loop visibly jumps, so\n * `ensureEnoughContent()` measures the originals and appends CLONE sets until\n * the total width reaches `CLONE_MULTIPLIER` × the container width.\n * - Clones must not pollute accessibility. The authored list stays the one\n * accessible list; every generated clone is rendered with `aria-hidden` so a\n * screen reader announces each slogan once, not once per clone.\n * - You cannot meaningfully grow the authored `<ul>`. Its `<li>` children are\n * Angular-projected content that Angular owns; imperatively appending clone\n * `<li>` nodes into it fights change detection. Building our own track signal\n * and letting `@for` render it is clean and safe. `<li>` is also only valid\n * inside a list element, so the `<ul eclSloganTickerList>` wrapper keeps the\n * consumer's authored markup valid and self-contained.\n *\n * This mirrors the vanilla ECL slogan ticker (hidden source list + measured,\n * cloned, auto-scrolling track).\n *\n * ## Testing note\n *\n * The visible track is only built after a real width measurement\n * (`offsetWidth`). Under jsdom every element reports a width of 0, so\n * `ensureEnoughContent()` bails early and the generated track stays empty. Unit\n * tests should therefore assert slide-driven behavior through its observable\n * effects (e.g. the play/pause controls appearing) rather than through the\n * generated track DOM.\n */\n@Component({\n selector: 'ecl-slogan-ticker',\n templateUrl: './ecl-slogan-ticker.component.html',\n host: {\n '[class]': 'cssClasses',\n },\n imports: [\n TranslatePipe,\n ...EUI_ECL_ICON,\n EmblaCarouselDirective,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EclSloganTickerComponent extends ECLBaseDirective implements AfterViewInit, OnDestroy {\n\n /** Aria-label for the ticker region. */\n eclAriaLabel = input<string>('Slogan ticker');\n\n /** Embla carousel options. */\n protected emblaOptions: { loop: boolean; align: 'start'; dragFree: boolean; direction: 'ltr' | 'rtl' } = {\n loop: true,\n align: 'start',\n dragFree: true,\n direction: 'ltr',\n };\n\n /** Embla plugins array (auto-scroll). */\n protected emblaPlugins: EmblaPluginType[] = [];\n\n protected emblaRef = viewChild(EmblaCarouselDirective);\n protected playButton = viewChild<ElementRef>('playButton');\n protected pauseButton = viewChild<ElementRef>('pauseButton');\n protected viewportElement = viewChild<ElementRef>('viewport');\n private trackElement = viewChild<ElementRef>('track');\n\n /** Whether auto-scroll is currently playing. */\n protected isPlaying = signal(false);\n\n /** Whether the user explicitly paused. */\n protected isPaused = signal(false);\n\n /** Whether play/pause controls should be visible. */\n protected showControls = signal(false);\n\n /**\n * Array of slide texts used to render the track.\n * Contains the original slides plus clones for seamless looping.\n * Each item has `text` and `isClone` (for aria-hidden on duplicates).\n */\n protected trackSlides = signal<{ text: string; isClone: boolean }[]>([]);\n\n /** Subscribed Embla events. */\n protected subscribeToEvents: EmblaEventType[] = ['init', 'reInit'];\n\n /**\n * Slides read from the consumer's hidden `<ul eclSloganTickerList>` source\n * list. This is the DATA source only; the visible track is a separate,\n * component-generated list built from `trackSlides`. See the class-level\n * doc for why the authored list and the rendered track are kept separate.\n */\n private slides = contentChildren(EclSloganTickerSlideDirective, { descendants: true });\n private cd = inject(ChangeDetectorRef);\n private elementRef = inject(ElementRef);\n private eclRtlService = inject(EclRtlService);\n private platformId = inject(PLATFORM_ID);\n private destroy$ = new Subject<void>();\n private emblaApi: EmblaCarouselType | undefined;\n private visibilityObserver: IntersectionObserver | null = null;\n private readonly autoplay = true;\n private readonly autoScrollSpeed = 0.9;\n private readonly CLONE_MULTIPLIER = 3;\n\n protected get cssClasses(): string {\n return [super.getCssClasses('ecl-slogan-ticker')].join(' ').trim();\n }\n\n constructor() {\n super();\n\n // React to slides changes\n effect(() => {\n this.showControls.set(this.slides().length >= 1);\n });\n\n // React to RTL changes\n this.eclRtlService.currentRtlState$.pipe(takeUntil(this.destroy$)).subscribe((isRtl) => {\n const direction = isRtl ? 'rtl' : 'ltr';\n if (this.emblaOptions.direction !== direction) {\n this.emblaOptions = { ...this.emblaOptions, direction };\n this.buildPlugins(isRtl);\n this.cd.detectChanges();\n }\n });\n }\n\n ngAfterViewInit(): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n\n this.buildPlugins();\n this.cd.detectChanges();\n\n setTimeout(() => {\n this.ensureEnoughContent();\n this.initEmbla();\n this.setupVisibilityObserver();\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n\n if (this.visibilityObserver) {\n this.visibilityObserver.disconnect();\n this.visibilityObserver = null;\n }\n }\n\n /** Called by the emblaChange event from the directive. */\n protected onEmblaChange(eventName: string): void {\n if (!this.emblaApi) {\n this.emblaApi = this.emblaRef()?.emblaApi;\n }\n if (!this.emblaApi) {\n return;\n }\n\n if (eventName === 'init' || eventName === 'reInit') {\n if (this.autoplay && !this.isPaused()) {\n this.startAutoScroll();\n }\n }\n }\n\n /** Start the auto-scroll (play button click). */\n protected onPlayClick(): void {\n this.isPaused.set(false);\n this.startAutoScroll();\n this.pauseButton()?.nativeElement?.focus();\n }\n\n /** Pause the auto-scroll (pause button click). */\n protected onPauseClick(): void {\n this.isPaused.set(true);\n this.stopAutoScroll();\n this.playButton()?.nativeElement?.focus();\n }\n\n /** Start auto-scroll and update state. */\n private startAutoScroll(): void {\n this.isPlaying.set(true);\n const autoScroll = this.emblaApi?.plugins()?.autoScroll;\n (autoScroll as any)?.play();\n this.cd.detectChanges();\n }\n\n /** Stop auto-scroll and update state. */\n private stopAutoScroll(): void {\n this.isPlaying.set(false);\n const autoScroll = this.emblaApi?.plugins()?.autoScroll;\n (autoScroll as any)?.stop();\n this.cd.detectChanges();\n }\n\n /**\n * Clone slides until the track width exceeds 3× container width.\n * Mirrors the vanilla ECL `ensureEnoughContent()` logic.\n */\n private ensureEnoughContent(): void {\n const slides = this.slides();\n if (!slides || slides.length === 0) {\n this.trackSlides.set([]);\n return;\n }\n\n const containerWidth = this.elementRef.nativeElement.offsetWidth;\n if (containerWidth === 0) {\n return;\n }\n\n const originals = slides.map((slide) => ({\n text: slide.el.nativeElement.textContent?.trim() || '',\n isClone: false,\n }));\n\n // Render originals first to measure individual slide widths\n this.trackSlides.set(originals);\n this.cd.detectChanges();\n\n const track = this.trackElement()?.nativeElement;\n if (!track) {\n return;\n }\n\n // Measure each rendered slide's width\n const renderedSlides = track.querySelectorAll('.ecl-slogan-ticker__slide');\n const slideWidths: number[] = [];\n let totalWidth = 0;\n renderedSlides.forEach((el: Element) => {\n const width = (el as HTMLElement).offsetWidth;\n slideWidths.push(width);\n totalWidth += width;\n });\n\n if (totalWidth === 0) {\n return;\n }\n\n // Add clones in full sets until total width >= required width\n const requiredWidth = containerWidth * this.CLONE_MULTIPLIER;\n const allSlides = [...originals];\n\n while (totalWidth < requiredWidth) {\n for (let i = 0; i < originals.length; i++) {\n allSlides.push({ ...originals[i], isClone: true });\n totalWidth += slideWidths[i];\n }\n }\n\n this.trackSlides.set(allSlides);\n this.cd.detectChanges();\n }\n\n /** Build the auto-scroll plugin with current settings. */\n private buildPlugins(isRtl = this.emblaOptions.direction === 'rtl'): void {\n this.emblaPlugins = [\n AutoScroll({\n speed: this.autoScrollSpeed,\n startDelay: 0,\n stopOnInteraction: false,\n playOnInit: this.autoplay,\n direction: isRtl ? 'backward' : 'forward',\n }) as unknown as EmblaPluginType,\n ];\n }\n\n /** Initialize Embla API reference. */\n private initEmbla(): void {\n const embla = this.emblaRef();\n if (!embla) {\n return;\n }\n\n this.emblaApi = embla.emblaApi;\n\n if (!this.emblaApi) {\n return;\n }\n\n if (this.autoplay && !this.isPaused()) {\n this.startAutoScroll();\n }\n\n this.cd.detectChanges();\n }\n\n /**\n * Observe visibility to pause auto-scroll when the component is off-screen\n * and resume when it comes back into view.\n */\n private setupVisibilityObserver(): void {\n this.visibilityObserver = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n if (!this.isPlaying() && !this.isPaused()) {\n this.startAutoScroll();\n }\n } else if (this.isPlaying()) {\n this.stopAutoScroll();\n }\n },\n { threshold: 0 },\n );\n\n this.visibilityObserver.observe(this.elementRef.nativeElement);\n }\n}\n","<div\n #viewport\n class=\"ecl-slogan-ticker__viewport\"\n [attr.aria-label]=\"eclAriaLabel()\"\n emblaCarousel\n [options]=\"emblaOptions\"\n [plugins]=\"emblaPlugins\"\n [subscribeToEvents]=\"subscribeToEvents\"\n (emblaChange)=\"onEmblaChange($event)\">\n\n <ul #track class=\"ecl-slogan-ticker__track\">\n @for (slide of trackSlides(); track $index) {\n <li class=\"ecl-slogan-ticker__slide\" [attr.aria-hidden]=\"slide.isClone ? true : null\">{{ slide.text }}</li>\n }\n </ul>\n</div>\n\n@if (showControls()) {\n<div class=\"ecl-slogan-ticker__controls\">\n <button\n #playButton\n class=\"ecl-button ecl-button--tertiary ecl-slogan-ticker__button ecl-slogan-ticker__play ecl-button--icon-only\"\n type=\"button\"\n [style.display]=\"isPlaying() ? 'none' : 'flex'\"\n (click)=\"onPlayClick()\">\n <span class=\"ecl-button__container\">\n <span class=\"ecl-button__label\">\n {{ 'ecl.slogan-ticker.PLAY' | translate }}\n </span>\n <ecl-icon icon=\"play\" size=\"l\" iconSet=\"phosphor-fill\" class=\"ecl-button__icon\"></ecl-icon>\n </span>\n </button>\n\n <button\n #pauseButton\n class=\"ecl-button ecl-button--tertiary ecl-slogan-ticker__button ecl-slogan-ticker__pause ecl-button--icon-only\"\n type=\"button\"\n [style.display]=\"isPlaying() ? 'flex' : 'none'\"\n (click)=\"onPauseClick()\">\n <span class=\"ecl-button__container\">\n <span class=\"ecl-button__label\">\n {{ 'ecl.slogan-ticker.PAUSE' | translate }}\n </span>\n <ecl-icon icon=\"pause\" iconSet=\"phosphor-fill\" size=\"l\" class=\"ecl-button__icon\"></ecl-icon>\n </span>\n </button>\n</div>\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Directive applied to the `<ul>` element wrapping slogan ticker slides.\n * Provides semantic structure for the ticker content.\n *\n * Usage:\n * ```html\n * <ecl-slogan-ticker>\n * <ul eclSloganTickerList>\n * <li eclSloganTickerSlide>Slide 1</li>\n * <li eclSloganTickerSlide>Slide 2</li>\n * </ul>\n * </ecl-slogan-ticker>\n * ```\n */\n@Directive({\n selector: 'ul[eclSloganTickerList]',\n host: {\n style: 'display: none',\n },\n})\nexport class EclSloganTickerListDirective {}\n","import { EclSloganTickerComponent } from './ecl-slogan-ticker.component';\nimport { EclSloganTickerListDirective } from './ecl-slogan-ticker-list.directive';\nimport { EclSloganTickerSlideDirective } from './ecl-slogan-ticker-slide.directive';\n\nexport * from './ecl-slogan-ticker.component';\nexport * from './ecl-slogan-ticker-list.directive';\nexport * from './ecl-slogan-ticker-slide.directive';\n\nexport const EUI_ECL_SLOGAN_TICKER = [\n EclSloganTickerComponent,\n EclSloganTickerListDirective,\n EclSloganTickerSlideDirective,\n] as const;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;AAMA;;;;;;;;;;;AAWG;MAOU,6BAA6B,CAAA;AAN1C,IAAA,WAAA,GAAA;;AASI,QAAA,IAAA,CAAA,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC;AAC1B,IAAA;8GAJY,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAA7B,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,0BAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAA7B,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBANzC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,0BAA0B;AACpC,oBAAA,IAAI,EAAE;AACF,wBAAA,KAAK,EAAE,0BAA0B;AACpC,qBAAA;AACJ,iBAAA;;;ACED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuDG;AAcG,MAAO,wBAAyB,SAAQ,gBAAgB,CAAA;AA2D1D,IAAA,IAAc,UAAU,GAAA;AACpB,QAAA,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE;IACtE;AAEA,IAAA,WAAA,GAAA;AACI,QAAA,KAAK,EAAE;;QA7DX,IAAA,CAAA,YAAY,GAAG,KAAK,CAAS,eAAe;yFAAC;;AAGnC,QAAA,IAAA,CAAA,YAAY,GAAmF;AACrG,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,SAAS,EAAE,KAAK;SACnB;;QAGS,IAAA,CAAA,YAAY,GAAsB,EAAE;QAEpC,IAAA,CAAA,QAAQ,GAAG,SAAS,CAAC,sBAAsB;qFAAC;QAC5C,IAAA,CAAA,UAAU,GAAG,SAAS,CAAa,YAAY;uFAAC;QAChD,IAAA,CAAA,WAAW,GAAG,SAAS,CAAa,aAAa;wFAAC;QAClD,IAAA,CAAA,eAAe,GAAG,SAAS,CAAa,UAAU;4FAAC;QACrD,IAAA,CAAA,YAAY,GAAG,SAAS,CAAa,OAAO;yFAAC;;QAG3C,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,KAAK;sFAAC;;QAGzB,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,KAAK;qFAAC;;QAGxB,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,KAAK;yFAAC;AAEtC;;;;AAIG;QACO,IAAA,CAAA,WAAW,GAAG,MAAM,CAAuC,EAAE;wFAAC;;AAG9D,QAAA,IAAA,CAAA,iBAAiB,GAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC;AAElE;;;;;AAKG;QACK,IAAA,CAAA,MAAM,GAAG,eAAe,CAAC,6BAA6B,8EAAI,WAAW,EAAE,IAAI,EAAA,CAAG;AAC9E,QAAA,IAAA,CAAA,EAAE,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC9B,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AACrC,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;AAChC,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;QAE9B,IAAA,CAAA,kBAAkB,GAAgC,IAAI;QAC7C,IAAA,CAAA,QAAQ,GAAG,IAAI;QACf,IAAA,CAAA,eAAe,GAAG,GAAG;QACrB,IAAA,CAAA,gBAAgB,GAAG,CAAC;;QAUjC,MAAM,CAAC,MAAK;AACR,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,IAAI,CAAC,CAAC;AACpD,QAAA,CAAC,CAAC;;QAGF,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,KAAI;YACnF,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK;YACvC,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,KAAK,SAAS,EAAE;gBAC3C,IAAI,CAAC,YAAY,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,SAAS,EAAE;AACvD,gBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AACxB,gBAAA,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE;YAC3B;AACJ,QAAA,CAAC,CAAC;IACN;IAEA,eAAe,GAAA;QACX,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YACrC;QACJ;QAEA,IAAI,CAAC,YAAY,EAAE;AACnB,QAAA,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE;QAEvB,UAAU,CAAC,MAAK;YACZ,IAAI,CAAC,mBAAmB,EAAE;YAC1B,IAAI,CAAC,SAAS,EAAE;YAChB,IAAI,CAAC,uBAAuB,EAAE;AAClC,QAAA,CAAC,CAAC;IACN;IAEA,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;AAExB,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;AACzB,YAAA,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE;AACpC,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;QAClC;IACJ;;AAGU,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;AACA,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAChB;QACJ;QAEA,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,QAAQ,EAAE;YAChD,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;gBACnC,IAAI,CAAC,eAAe,EAAE;YAC1B;QACJ;IACJ;;IAGU,WAAW,GAAA;AACjB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,eAAe,EAAE;QACtB,IAAI,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE;IAC9C;;IAGU,YAAY,GAAA;AAClB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,cAAc,EAAE;QACrB,IAAI,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE;IAC7C;;IAGQ,eAAe,GAAA;AACnB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;QACxB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,UAAU;QACtD,UAAkB,EAAE,IAAI,EAAE;AAC3B,QAAA,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE;IAC3B;;IAGQ,cAAc,GAAA;AAClB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,UAAU;QACtD,UAAkB,EAAE,IAAI,EAAE;AAC3B,QAAA,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE;IAC3B;AAEA;;;AAGG;IACK,mBAAmB,GAAA;AACvB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;QAC5B,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;AAChC,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB;QACJ;QAEA,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,WAAW;AAChE,QAAA,IAAI,cAAc,KAAK,CAAC,EAAE;YACtB;QACJ;QAEA,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,MAAM;AACrC,YAAA,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE;AACtD,YAAA,OAAO,EAAE,KAAK;AACjB,SAAA,CAAC,CAAC;;AAGH,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC;AAC/B,QAAA,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE;QAEvB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa;QAChD,IAAI,CAAC,KAAK,EAAE;YACR;QACJ;;QAGA,MAAM,cAAc,GAAG,KAAK,CAAC,gBAAgB,CAAC,2BAA2B,CAAC;QAC1E,MAAM,WAAW,GAAa,EAAE;QAChC,IAAI,UAAU,GAAG,CAAC;AAClB,QAAA,cAAc,CAAC,OAAO,CAAC,CAAC,EAAW,KAAI;AACnC,YAAA,MAAM,KAAK,GAAI,EAAkB,CAAC,WAAW;AAC7C,YAAA,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;YACvB,UAAU,IAAI,KAAK;AACvB,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,UAAU,KAAK,CAAC,EAAE;YAClB;QACJ;;AAGA,QAAA,MAAM,aAAa,GAAG,cAAc,GAAG,IAAI,CAAC,gBAAgB;AAC5D,QAAA,MAAM,SAAS,GAAG,CAAC,GAAG,SAAS,CAAC;AAEhC,QAAA,OAAO,UAAU,GAAG,aAAa,EAAE;AAC/B,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACvC,gBAAA,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAClD,gBAAA,UAAU,IAAI,WAAW,CAAC,CAAC,CAAC;YAChC;QACJ;AAEA,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC;AAC/B,QAAA,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE;IAC3B;;IAGQ,YAAY,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,KAAK,KAAK,EAAA;QAC9D,IAAI,CAAC,YAAY,GAAG;AAChB,YAAA,UAAU,CAAC;gBACP,KAAK,EAAE,IAAI,CAAC,eAAe;AAC3B,gBAAA,UAAU,EAAE,CAAC;AACb,gBAAA,iBAAiB,EAAE,KAAK;gBACxB,UAAU,EAAE,IAAI,CAAC,QAAQ;gBACzB,SAAS,EAAE,KAAK,GAAG,UAAU,GAAG,SAAS;aAC5C,CAA+B;SACnC;IACL;;IAGQ,SAAS,GAAA;AACb,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;QAC7B,IAAI,CAAC,KAAK,EAAE;YACR;QACJ;AAEA,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ;AAE9B,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAChB;QACJ;QAEA,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;YACnC,IAAI,CAAC,eAAe,EAAE;QAC1B;AAEA,QAAA,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE;IAC3B;AAEA;;;AAGG;IACK,uBAAuB,GAAA;QAC3B,IAAI,CAAC,kBAAkB,GAAG,IAAI,oBAAoB,CAC9C,CAAC,CAAC,KAAK,CAAC,KAAI;AACR,YAAA,IAAI,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;oBACvC,IAAI,CAAC,eAAe,EAAE;gBAC1B;YACJ;AAAO,iBAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;gBACzB,IAAI,CAAC,cAAc,EAAE;YACzB;AACJ,QAAA,CAAC,EACD,EAAE,SAAS,EAAE,CAAC,EAAE,CACnB;QAED,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;IAClE;8GAxQS,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,YAAA,EAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,QAAA,EAAA,SAAA,EA+CA,6BAA6B,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EA/B/B,sBAAsB,qgBC9GzD,2yDAgDA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,WAAA,EAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED0CQ,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,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAbpC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,EAAA,IAAA,EAEvB;AACF,wBAAA,SAAS,EAAE,YAAY;qBAC1B,EAAA,OAAA,EACQ;wBACL,aAAa;AACb,wBAAA,GAAG,YAAY;wBACf,sBAAsB;qBACzB,EAAA,eAAA,EACgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,2yDAAA,EAAA;AAkBhB,SAAA,CAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAAA,sBAAsB,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CACR,YAAY,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CACX,aAAa,yEACT,UAAU,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CACf,OAAO,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MA2BnB,6BAA6B,CAAA,EAAA,EAAA,GAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AE3IzF;;;;;;;;;;;;;AAaG;MAOU,4BAA4B,CAAA;8GAA5B,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAA5B,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,eAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAA5B,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBANxC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,yBAAyB;AACnC,oBAAA,IAAI,EAAE;AACF,wBAAA,KAAK,EAAE,eAAe;AACzB,qBAAA;AACJ,iBAAA;;;ACbM,MAAM,qBAAqB,GAAG;IACjC,wBAAwB;IACxB,4BAA4B;IAC5B,6BAA6B;;;ACXjC;;AAEG;;;;"}
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { input, booleanAttribute, Component, output, inject, contentChild, HostBinding, Directive } from '@angular/core';
2
+ import { input, booleanAttribute, Component, output, inject, contentChild, effect, Directive } from '@angular/core';
3
3
  import { ECLBaseDirective, EclBaseEvent } from '@eui/ecl/core';
4
4
  import { NgTemplateOutlet } from '@angular/common';
5
5
  import * as i1 from '@eui/ecl/components/ecl-icon';
@@ -42,7 +42,7 @@ class EclSocialMediaFollowItemClickEvent extends EclBaseEvent {
42
42
  class EclSocialMediaFollowItemComponent extends ECLBaseDirective {
43
43
  constructor() {
44
44
  super(...arguments);
45
- this.isInverted = input(undefined, { ...(ngDevMode ? { debugName: "isInverted" } : /* istanbul ignore next */ {}), transform: (booleanAttribute) });
45
+ this.isInverted = input(false, { ...(ngDevMode ? { debugName: "isInverted" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
46
46
  this.icon = input(/* @ts-ignore */
47
47
  ...(ngDevMode ? [undefined, { debugName: "icon" }] : /* istanbul ignore next */ []));
48
48
  this.iconSet = input('social-media', /* @ts-ignore */
@@ -85,30 +85,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImpor
85
85
 
86
86
  class EclSocialMediaFollowLinkDirective extends ECLBaseDirective {
87
87
  constructor() {
88
- super(...arguments);
88
+ super();
89
89
  this.eclIcon = contentChild(EclIconComponent, /* @ts-ignore */
90
90
  ...(ngDevMode ? [{ debugName: "eclIcon" }] : /* istanbul ignore next */ []));
91
+ // Add the icon modifier class to a projected icon reactively.
92
+ effect(() => {
93
+ this.eclIcon()?.addExtraClass('ecl-social-media-follow__icon');
94
+ });
91
95
  }
92
96
  get cssClasses() {
93
97
  return [super.getCssClasses('ecl-social-media-follow__link')].join(' ').trim();
94
98
  }
95
- ngAfterContentInit() {
96
- if (this.eclIcon()) {
97
- setTimeout(() => (this.eclIcon().baseDirective.class = [this.eclIcon().baseDirective.class, 'ecl-social-media-follow__icon'].join(' ')));
98
- }
99
- }
100
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: EclSocialMediaFollowLinkDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
101
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "22.1.2", type: EclSocialMediaFollowLinkDirective, isStandalone: true, selector: "[eclSocialMediaFollowLink]", host: { properties: { "class": "this.cssClasses" } }, queries: [{ propertyName: "eclIcon", first: true, predicate: EclIconComponent, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0 }); }
99
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: EclSocialMediaFollowLinkDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
100
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "22.1.2", type: EclSocialMediaFollowLinkDirective, isStandalone: true, selector: "[eclSocialMediaFollowLink]", host: { properties: { "class": "cssClasses" } }, queries: [{ propertyName: "eclIcon", first: true, predicate: EclIconComponent, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0 }); }
102
101
  }
103
102
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: EclSocialMediaFollowLinkDirective, decorators: [{
104
103
  type: Directive,
105
104
  args: [{
106
105
  selector: '[eclSocialMediaFollowLink]',
106
+ host: {
107
+ '[class]': 'cssClasses',
108
+ },
107
109
  }]
108
- }], propDecorators: { eclIcon: [{ type: i0.ContentChild, args: [i0.forwardRef(() => EclIconComponent), { isSignal: true }] }], cssClasses: [{
109
- type: HostBinding,
110
- args: ['class']
111
- }] } });
110
+ }], ctorParameters: () => [], propDecorators: { eclIcon: [{ type: i0.ContentChild, args: [i0.forwardRef(() => EclIconComponent), { isSignal: true }] }] } });
112
111
 
113
112
  const EUI_ECL_SOCIAL_MEDIA_FOLLOW = [
114
113
  EclSocialMediaFollowComponent,
@@ -1 +1 @@
1
- {"version":3,"file":"eui-ecl-components-ecl-social-media-follow.mjs","sources":["../../components/ecl-social-media-follow/ecl-social-media-follow.component.ts","../../components/ecl-social-media-follow/ecl-social-media-follow.component.html","../../components/ecl-social-media-follow/ecl-social-media-follow-item.component.ts","../../components/ecl-social-media-follow/ecl-social-media-follow-item.component.html","../../components/ecl-social-media-follow/ecl-social-media-follow-link.directive.ts","../../components/ecl-social-media-follow/index.ts","../../components/ecl-social-media-follow/eui-ecl-components-ecl-social-media-follow.ts"],"sourcesContent":["import { Component, booleanAttribute, input } from '@angular/core';\nimport { ECLBaseDirective } from '@eui/ecl/core';\n\n@Component({\n selector: 'ecl-social-media-follow',\n templateUrl: './ecl-social-media-follow.component.html',\n host: {\n '[class]': 'cssClasses',\n },\n})\nexport class EclSocialMediaFollowComponent extends ECLBaseDirective {\n readonly description = input<string>(undefined);\n readonly isIconOnly = input(false, { transform: booleanAttribute });\n readonly isVertical = input(false, { transform: booleanAttribute });\n readonly horizontalAlignment = input<'right' | 'left' | string>('left');\n\n get cssClasses(): string {\n return [\n super.getCssClasses('ecl-social-media-follow'),\n this.isVertical() ? 'ecl-social-media-follow--vertical' : '',\n `ecl-social-media-follow--${this.horizontalAlignment()}`,\n ]\n .join(' ')\n .trim();\n }\n}\n","@if (description()) {\n <p class=\"ecl-social-media-follow__description\">{{ description() }}</p>\n}\n<ul class=\"ecl-social-media-follow__list\">\n <ng-content></ng-content>\n</ul>\n","import { booleanAttribute, Component, inject, input, output } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { EclIconSet, EUI_ECL_ICON } from '@eui/ecl/components/ecl-icon';\nimport { EclBaseEvent } from '@eui/ecl/core';\nimport { ECLBaseDirective } from '@eui/ecl/core';\nimport { EUI_ECL_LINK } from '@eui/ecl/components/ecl-link';\nimport { RouterLink, RouterLinkWithHref } from '@angular/router';\nimport { EclSocialMediaFollowComponent } from './ecl-social-media-follow.component';\n\nexport class EclSocialMediaFollowItemClickEvent extends EclBaseEvent {}\n\n@Component({\n selector: 'ecl-social-media-follow-item',\n templateUrl: './ecl-social-media-follow-item.component.html',\n imports: [...EUI_ECL_ICON, ...EUI_ECL_LINK, NgTemplateOutlet, RouterLink, RouterLinkWithHref],\n host: {\n role: 'listitem',\n '[class]': 'cssClasses',\n },\n})\nexport class EclSocialMediaFollowItemComponent extends ECLBaseDirective {\n readonly isInverted = input<false, unknown>(undefined, { transform: (booleanAttribute) as any });\n icon = input<string>();\n iconSet = input<EclIconSet>('social-media');\n readonly href = input('');\n readonly routerLink = input('');\n readonly target = input<string>(undefined);\n readonly size = input('m');\n readonly extraAttributes = input<{\n name: string;\n value?: string | null;\n }[]>(undefined);\n\n get cssClasses(): string {\n return [super.getCssClasses('ecl-social-media-follow__item')].join(' ').trim();\n }\n\n readonly itemClick = output<EclSocialMediaFollowItemClickEvent>();\n\n private parent = inject(EclSocialMediaFollowComponent);\n\n get isIconOnly(): boolean {\n return this.parent?.isIconOnly() ?? false;\n }\n\n onItemClick(evt: Event): void {\n this.itemClick.emit(new EclSocialMediaFollowItemClickEvent());\n if (!this.href() && !this.routerLink()) {\n evt.preventDefault();\n }\n }\n}\n","@if(href()) {\n<a eclLink (click)=\"onItemClick($event)\" variant=\"standalone\" [href]=\"href()\" [attr.target]=\"target()\"\n class=\"ecl-social-media-follow__link\" [isInverted]=\"isInverted()\" [isIconOnly]=\"isIconOnly\" [extraAttributes]=\"extraAttributes()\">\n @if(icon()) {\n <ecl-icon [iconSet]=\"iconSet()\" icon=\"{{ icon() }}\" [size]=\"size()\" class=\"ecl-social-media-follow__icon\"> </ecl-icon>\n }\n <span eclLinkLabel>\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </span>\n</a>\n}\n\n@if(!href() && routerLink()) {\n<a eclLink (click)=\"onItemClick($event)\" variant=\"standalone\" [routerLink]=\"routerLink()\" [attr.target]=\"target()\"\n class=\"ecl-social-media-follow__link\" [isInverted]=\"isInverted()\" [isIconOnly]=\"isIconOnly\" [extraAttributes]=\"extraAttributes()\">\n @if(icon()) {\n <ecl-icon [iconSet]=\"iconSet()\" icon=\"{{ icon() }}\" [size]=\"size()\" class=\"ecl-social-media-follow__icon\"> </ecl-icon>\n }\n <span eclLinkLabel>\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </span>\n</a>\n}\n\n@if(!href() && !routerLink()) {\n<ng-container *ngTemplateOutlet=\"content\"></ng-container>\n}\n\n<ng-template #content>\n <ng-content></ng-content>\n</ng-template>\n","import { Directive, HostBinding, AfterContentInit, contentChild } from '@angular/core';\nimport { ECLBaseDirective } from '@eui/ecl/core';\nimport { EclIconComponent } from '@eui/ecl/components/ecl-icon';\n\n@Directive({\n selector: '[eclSocialMediaFollowLink]',\n})\nexport class EclSocialMediaFollowLinkDirective extends ECLBaseDirective implements AfterContentInit {\n readonly eclIcon = contentChild(EclIconComponent);\n\n @HostBinding('class')\n get cssClasses(): string {\n return [super.getCssClasses('ecl-social-media-follow__link')].join(' ').trim();\n }\n\n ngAfterContentInit(): void {\n if (this.eclIcon()) {\n setTimeout(() => (this.eclIcon().baseDirective.class = [this.eclIcon().baseDirective.class, 'ecl-social-media-follow__icon'].join(' ')));\n }\n }\n}\n","import { EclSocialMediaFollowComponent } from './ecl-social-media-follow.component';\nimport { EclSocialMediaFollowItemComponent } from './ecl-social-media-follow-item.component';\nimport { EclSocialMediaFollowLinkDirective } from './ecl-social-media-follow-link.directive';\n\nexport * from './ecl-social-media-follow.component';\nexport * from './ecl-social-media-follow-item.component';\nexport * from './ecl-social-media-follow-link.directive';\n\nexport const EUI_ECL_SOCIAL_MEDIA_FOLLOW = [\n EclSocialMediaFollowComponent,\n EclSocialMediaFollowItemComponent,\n EclSocialMediaFollowLinkDirective,\n] as const;","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"eui-ecl-components-ecl-social-media-follow.mjs","sources":["../../components/ecl-social-media-follow/ecl-social-media-follow.component.ts","../../components/ecl-social-media-follow/ecl-social-media-follow.component.html","../../components/ecl-social-media-follow/ecl-social-media-follow-item.component.ts","../../components/ecl-social-media-follow/ecl-social-media-follow-item.component.html","../../components/ecl-social-media-follow/ecl-social-media-follow-link.directive.ts","../../components/ecl-social-media-follow/index.ts","../../components/ecl-social-media-follow/eui-ecl-components-ecl-social-media-follow.ts"],"sourcesContent":["import { Component, booleanAttribute, input } from '@angular/core';\nimport { ECLBaseDirective } from '@eui/ecl/core';\n\n@Component({\n selector: 'ecl-social-media-follow',\n templateUrl: './ecl-social-media-follow.component.html',\n host: {\n '[class]': 'cssClasses',\n },\n})\nexport class EclSocialMediaFollowComponent extends ECLBaseDirective {\n readonly description = input<string>(undefined);\n readonly isIconOnly = input(false, { transform: booleanAttribute });\n readonly isVertical = input(false, { transform: booleanAttribute });\n readonly horizontalAlignment = input<'right' | 'left' | string>('left');\n\n get cssClasses(): string {\n return [\n super.getCssClasses('ecl-social-media-follow'),\n this.isVertical() ? 'ecl-social-media-follow--vertical' : '',\n `ecl-social-media-follow--${this.horizontalAlignment()}`,\n ]\n .join(' ')\n .trim();\n }\n}\n","@if (description()) {\n <p class=\"ecl-social-media-follow__description\">{{ description() }}</p>\n}\n<ul class=\"ecl-social-media-follow__list\">\n <ng-content></ng-content>\n</ul>\n","import { booleanAttribute, Component, inject, input, output } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { EclIconSet, EUI_ECL_ICON } from '@eui/ecl/components/ecl-icon';\nimport { EclBaseEvent } from '@eui/ecl/core';\nimport { ECLBaseDirective } from '@eui/ecl/core';\nimport { EUI_ECL_LINK } from '@eui/ecl/components/ecl-link';\nimport { RouterLink, RouterLinkWithHref } from '@angular/router';\nimport { EclSocialMediaFollowComponent } from './ecl-social-media-follow.component';\n\nexport class EclSocialMediaFollowItemClickEvent extends EclBaseEvent {}\n\n@Component({\n selector: 'ecl-social-media-follow-item',\n templateUrl: './ecl-social-media-follow-item.component.html',\n imports: [...EUI_ECL_ICON, ...EUI_ECL_LINK, NgTemplateOutlet, RouterLink, RouterLinkWithHref],\n host: {\n role: 'listitem',\n '[class]': 'cssClasses',\n },\n})\nexport class EclSocialMediaFollowItemComponent extends ECLBaseDirective {\n readonly isInverted = input(false, { transform: booleanAttribute });\n icon = input<string>();\n iconSet = input<EclIconSet>('social-media');\n readonly href = input('');\n readonly routerLink = input('');\n readonly target = input<string>(undefined);\n readonly size = input('m');\n readonly extraAttributes = input<{\n name: string;\n value?: string | null;\n }[]>(undefined);\n\n get cssClasses(): string {\n return [super.getCssClasses('ecl-social-media-follow__item')].join(' ').trim();\n }\n\n readonly itemClick = output<EclSocialMediaFollowItemClickEvent>();\n\n private parent = inject(EclSocialMediaFollowComponent);\n\n get isIconOnly(): boolean {\n return this.parent?.isIconOnly() ?? false;\n }\n\n onItemClick(evt: Event): void {\n this.itemClick.emit(new EclSocialMediaFollowItemClickEvent());\n if (!this.href() && !this.routerLink()) {\n evt.preventDefault();\n }\n }\n}\n","@if(href()) {\n<a eclLink (click)=\"onItemClick($event)\" variant=\"standalone\" [href]=\"href()\" [attr.target]=\"target()\"\n class=\"ecl-social-media-follow__link\" [isInverted]=\"isInverted()\" [isIconOnly]=\"isIconOnly\" [extraAttributes]=\"extraAttributes()\">\n @if(icon()) {\n <ecl-icon [iconSet]=\"iconSet()\" icon=\"{{ icon() }}\" [size]=\"size()\" class=\"ecl-social-media-follow__icon\"> </ecl-icon>\n }\n <span eclLinkLabel>\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </span>\n</a>\n}\n\n@if(!href() && routerLink()) {\n<a eclLink (click)=\"onItemClick($event)\" variant=\"standalone\" [routerLink]=\"routerLink()\" [attr.target]=\"target()\"\n class=\"ecl-social-media-follow__link\" [isInverted]=\"isInverted()\" [isIconOnly]=\"isIconOnly\" [extraAttributes]=\"extraAttributes()\">\n @if(icon()) {\n <ecl-icon [iconSet]=\"iconSet()\" icon=\"{{ icon() }}\" [size]=\"size()\" class=\"ecl-social-media-follow__icon\"> </ecl-icon>\n }\n <span eclLinkLabel>\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </span>\n</a>\n}\n\n@if(!href() && !routerLink()) {\n<ng-container *ngTemplateOutlet=\"content\"></ng-container>\n}\n\n<ng-template #content>\n <ng-content></ng-content>\n</ng-template>\n","import { Directive, contentChild, effect } from '@angular/core';\nimport { ECLBaseDirective } from '@eui/ecl/core';\nimport { EclIconComponent } from '@eui/ecl/components/ecl-icon';\n\n@Directive({\n selector: '[eclSocialMediaFollowLink]',\n host: {\n '[class]': 'cssClasses',\n },\n})\nexport class EclSocialMediaFollowLinkDirective extends ECLBaseDirective {\n readonly eclIcon = contentChild(EclIconComponent);\n\n constructor() {\n super();\n // Add the icon modifier class to a projected icon reactively.\n effect(() => {\n this.eclIcon()?.addExtraClass('ecl-social-media-follow__icon');\n });\n }\n\n get cssClasses(): string {\n return [super.getCssClasses('ecl-social-media-follow__link')].join(' ').trim();\n }\n}\n","import { EclSocialMediaFollowComponent } from './ecl-social-media-follow.component';\nimport { EclSocialMediaFollowItemComponent } from './ecl-social-media-follow-item.component';\nimport { EclSocialMediaFollowLinkDirective } from './ecl-social-media-follow-link.directive';\n\nexport * from './ecl-social-media-follow.component';\nexport * from './ecl-social-media-follow-item.component';\nexport * from './ecl-social-media-follow-link.directive';\n\nexport const EUI_ECL_SOCIAL_MEDIA_FOLLOW = [\n EclSocialMediaFollowComponent,\n EclSocialMediaFollowItemComponent,\n EclSocialMediaFollowLinkDirective,\n] as const;","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eui/ecl",
3
- "version": "22.0.0-alpha.37",
3
+ "version": "22.0.0-alpha.39",
4
4
  "tag": "next",
5
5
  "description": "eUI ECL components package",
6
6
  "homepage": "https://eui.ecdevops.eu",
@@ -12,8 +12,53 @@ import { EmblaPluginType, EmblaEventType } from 'embla-carousel';
12
12
  * Uses Embla Carousel (via embla-carousel-angular) with the auto-scroll plugin
13
13
  * to match the ECL vanilla implementation.
14
14
  *
15
- * The component clones projected slides internally to ensure the track is wide
16
- * enough for seamless infinite scrolling (matching the vanilla ECL approach).
15
+ * ## Why two lists (hidden source + generated track)
16
+ *
17
+ * The consumer provides a plain, semantic list:
18
+ *
19
+ * ```html
20
+ * <ecl-slogan-ticker>
21
+ * <ul eclSloganTickerList>
22
+ * <li eclSloganTickerSlide>SLOGAN ONE</li>
23
+ * <li eclSloganTickerSlide>SLOGAN TWO</li>
24
+ * </ul>
25
+ * </ecl-slogan-ticker>
26
+ * ```
27
+ *
28
+ * This authored `<ul eclSloganTickerList>` is NOT the list you see scrolling.
29
+ * `EclSloganTickerListDirective` hides it with `display: none`, and it stays in
30
+ * the light DOM as the single accessible source of truth. The component reads
31
+ * the slide texts out of it via a `contentChildren` query (see `slides`) and
32
+ * builds a SEPARATE, component-owned `<ul class="ecl-slogan-ticker__track">`
33
+ * from the `trackSlides` signal. That generated track is what Embla animates.
34
+ *
35
+ * Reasons for the split (rather than just scrolling the authored `<ul>`):
36
+ *
37
+ * - Seamless infinite loop needs more content than the author gives. The track
38
+ * must be several times wider than the viewport or the loop visibly jumps, so
39
+ * `ensureEnoughContent()` measures the originals and appends CLONE sets until
40
+ * the total width reaches `CLONE_MULTIPLIER` × the container width.
41
+ * - Clones must not pollute accessibility. The authored list stays the one
42
+ * accessible list; every generated clone is rendered with `aria-hidden` so a
43
+ * screen reader announces each slogan once, not once per clone.
44
+ * - You cannot meaningfully grow the authored `<ul>`. Its `<li>` children are
45
+ * Angular-projected content that Angular owns; imperatively appending clone
46
+ * `<li>` nodes into it fights change detection. Building our own track signal
47
+ * and letting `@for` render it is clean and safe. `<li>` is also only valid
48
+ * inside a list element, so the `<ul eclSloganTickerList>` wrapper keeps the
49
+ * consumer's authored markup valid and self-contained.
50
+ *
51
+ * This mirrors the vanilla ECL slogan ticker (hidden source list + measured,
52
+ * cloned, auto-scrolling track).
53
+ *
54
+ * ## Testing note
55
+ *
56
+ * The visible track is only built after a real width measurement
57
+ * (`offsetWidth`). Under jsdom every element reports a width of 0, so
58
+ * `ensureEnoughContent()` bails early and the generated track stays empty. Unit
59
+ * tests should therefore assert slide-driven behavior through its observable
60
+ * effects (e.g. the play/pause controls appearing) rather than through the
61
+ * generated track DOM.
17
62
  */
18
63
  declare class EclSloganTickerComponent extends ECLBaseDirective implements AfterViewInit, OnDestroy {
19
64
  /** Aria-label for the ticker region. */
@@ -49,6 +94,12 @@ declare class EclSloganTickerComponent extends ECLBaseDirective implements After
49
94
  }[]>;
50
95
  /** Subscribed Embla events. */
51
96
  protected subscribeToEvents: EmblaEventType[];
97
+ /**
98
+ * Slides read from the consumer's hidden `<ul eclSloganTickerList>` source
99
+ * list. This is the DATA source only; the visible track is a separate,
100
+ * component-generated list built from `trackSlides`. See the class-level
101
+ * doc for why the authored list and the rendered track are kept separate.
102
+ */
52
103
  private slides;
53
104
  private cd;
54
105
  private elementRef;
@@ -1 +1 @@
1
- {"version":3,"file":"eui-ecl-components-ecl-slogan-ticker.d.ts","sources":["../../components/ecl-slogan-ticker/ecl-slogan-ticker.component.ts","../../components/ecl-slogan-ticker/ecl-slogan-ticker-list.directive.ts","../../components/ecl-slogan-ticker/ecl-slogan-ticker-slide.directive.ts","../../components/ecl-slogan-ticker/index.ts"],"mappings":";;;;;;AAyBA;;;;;;;;;;AAUG;AACH,cAaa,wBAAyB,SAAQ,gBAAiB,YAAW,aAAa,EAAE,SAAS;;AAG9F,kBAAY,aAAA,CAAA,WAAA;;;;;;AAGgE;;;AAQ5E,4BAAwB,eAAe;wBAErB,aAAA,CAAA,MAAA,CAAA,sBAAA;0BACE,aAAA,CAAA,MAAA,CAAA,UAAA;2BACC,aAAA,CAAA,MAAA,CAAA,UAAA;+BACI,aAAA,CAAA,MAAA,CAAA,UAAA;;;yBAIN,aAAA,CAAA,cAAA;;wBAGD,aAAA,CAAA,cAAA;;4BAGI,aAAA,CAAA,cAAA;AAEtB;;;;AAIG;AACH,2BAAqB,aAAA,CAAA,cAAA;;;AAAoD;;AAGzE,iCAA6B,cAAc;;;;;;;;;AAU3C;AACA;AACA;AAEA;;AAuBA;AAeA;;AAWA;;;;;;AA8BA;;AAQA;AAOA;;;AAGG;AACH;;AAwDA;;AAaA;AAmBA;;;AAGG;AACH;oDAnPS,wBAAwB;sDAAxB,wBAAwB;AAmQpC;;AClTD;;;;;;;;;;;;;AAaG;AACH,cAMa,4BAA4B;oDAA5B,4BAA4B;sDAA5B,4BAA4B;AAAG;;AChB5C;;;;;;;;;;;AAWG;AACH,cAMa,6BAA6B;;AAGtC,QAAE,UAAA;oDAHO,6BAA6B;sDAA7B,6BAA6B;AAIzC;;ACpBD,cAAa,qBAAqB,mBAAA,wBAAA,SAAA,4BAAA,SAAA,6BAAA;;;;","names":[]}
1
+ {"version":3,"file":"eui-ecl-components-ecl-slogan-ticker.d.ts","sources":["../../components/ecl-slogan-ticker/ecl-slogan-ticker.component.ts","../../components/ecl-slogan-ticker/ecl-slogan-ticker-list.directive.ts","../../components/ecl-slogan-ticker/ecl-slogan-ticker-slide.directive.ts","../../components/ecl-slogan-ticker/index.ts"],"mappings":";;;;;;AAyBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuDG;AACH,cAaa,wBAAyB,SAAQ,gBAAiB,YAAW,aAAa,EAAE,SAAS;;AAG9F,kBAAY,aAAA,CAAA,WAAA;;;;;;AAGgE;;;AAQ5E,4BAAwB,eAAe;wBAErB,aAAA,CAAA,MAAA,CAAA,sBAAA;0BACE,aAAA,CAAA,MAAA,CAAA,UAAA;2BACC,aAAA,CAAA,MAAA,CAAA,UAAA;+BACI,aAAA,CAAA,MAAA,CAAA,UAAA;;;yBAIN,aAAA,CAAA,cAAA;;wBAGD,aAAA,CAAA,cAAA;;4BAGI,aAAA,CAAA,cAAA;AAEtB;;;;AAIG;AACH,2BAAqB,aAAA,CAAA,cAAA;;;AAAoD;;AAGzE,iCAA6B,cAAc;AAE3C;;;;;AAKG;;;;;;;;;AASH;AACA;AACA;AAEA;;AAuBA;AAeA;;AAWA;;;;;;AA8BA;;AAQA;AAOA;;;AAGG;AACH;;AAwDA;;AAaA;AAmBA;;;AAGG;AACH;oDAzPS,wBAAwB;sDAAxB,wBAAwB;AAyQpC;;ACrWD;;;;;;;;;;;;;AAaG;AACH,cAMa,4BAA4B;oDAA5B,4BAA4B;sDAA5B,4BAA4B;AAAG;;AChB5C;;;;;;;;;;;AAWG;AACH,cAMa,6BAA6B;;AAGtC,QAAE,UAAA;oDAHO,6BAA6B;sDAA7B,6BAA6B;AAIzC;;ACpBD,cAAa,qBAAqB,mBAAA,wBAAA,SAAA,4BAAA,SAAA,6BAAA;;;;","names":[]}
@@ -1,5 +1,4 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { AfterContentInit } from '@angular/core';
3
2
  import { ECLBaseDirective, EclBaseEvent } from '@eui/ecl/core';
4
3
  import { EclIconSet, EclIconComponent } from '@eui/ecl/components/ecl-icon';
5
4
 
@@ -16,7 +15,7 @@ declare class EclSocialMediaFollowComponent extends ECLBaseDirective {
16
15
  declare class EclSocialMediaFollowItemClickEvent extends EclBaseEvent {
17
16
  }
18
17
  declare class EclSocialMediaFollowItemComponent extends ECLBaseDirective {
19
- readonly isInverted: _angular_core.InputSignalWithTransform<false, unknown>;
18
+ readonly isInverted: _angular_core.InputSignalWithTransform<boolean, unknown>;
20
19
  icon: _angular_core.InputSignal<string>;
21
20
  iconSet: _angular_core.InputSignal<EclIconSet>;
22
21
  readonly href: _angular_core.InputSignal<string>;
@@ -36,10 +35,10 @@ declare class EclSocialMediaFollowItemComponent extends ECLBaseDirective {
36
35
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<EclSocialMediaFollowItemComponent, "ecl-social-media-follow-item", never, { "isInverted": { "alias": "isInverted"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "iconSet": { "alias": "iconSet"; "required": false; "isSignal": true; }; "href": { "alias": "href"; "required": false; "isSignal": true; }; "routerLink": { "alias": "routerLink"; "required": false; "isSignal": true; }; "target": { "alias": "target"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "extraAttributes": { "alias": "extraAttributes"; "required": false; "isSignal": true; }; }, { "itemClick": "itemClick"; }, never, ["*"], true, never>;
37
36
  }
38
37
 
39
- declare class EclSocialMediaFollowLinkDirective extends ECLBaseDirective implements AfterContentInit {
38
+ declare class EclSocialMediaFollowLinkDirective extends ECLBaseDirective {
40
39
  readonly eclIcon: _angular_core.Signal<EclIconComponent>;
40
+ constructor();
41
41
  get cssClasses(): string;
42
- ngAfterContentInit(): void;
43
42
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<EclSocialMediaFollowLinkDirective, never>;
44
43
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<EclSocialMediaFollowLinkDirective, "[eclSocialMediaFollowLink]", never, {}, {}, ["eclIcon"], never, true, never>;
45
44
  }
@@ -1 +1 @@
1
- {"version":3,"file":"eui-ecl-components-ecl-social-media-follow.d.ts","sources":["../../components/ecl-social-media-follow/ecl-social-media-follow.component.ts","../../components/ecl-social-media-follow/ecl-social-media-follow-item.component.ts","../../components/ecl-social-media-follow/ecl-social-media-follow-link.directive.ts","../../components/ecl-social-media-follow/index.ts"],"mappings":";;;;;AAGA,cAOa,6BAA8B,SAAQ,gBAAgB;0BAC3C,aAAA,CAAA,WAAA;yBACD,aAAA,CAAA,wBAAA;yBACA,aAAA,CAAA,wBAAA;kCACS,aAAA,CAAA,WAAA;;oDAJnB,6BAA6B;sDAA7B,6BAA6B;AAezC;;AChBD,cAAa,kCAAmC,SAAQ,YAAY;AAAG;AAEvE,cASa,iCAAkC,SAAQ,gBAAgB;yBAChD,aAAA,CAAA,wBAAA;AACnB,UAAI,aAAA,CAAA,WAAA;AACJ,aAAO,aAAA,CAAA,WAAA,CAAA,UAAA;mBACM,aAAA,CAAA,WAAA;yBACM,aAAA,CAAA,WAAA;qBACJ,aAAA,CAAA,WAAA;mBACF,aAAA,CAAA,WAAA;AACb,8BAAwB,aAAA,CAAA,WAAA;;AAEZ;AACI;;wBAME,aAAA,CAAA,gBAAA,CAAA,kCAAA;;;AAQlB,qBAAiB,KAAK;oDAzBb,iCAAiC;sDAAjC,iCAAiC;AA+B7C;;AC/CD,cAGa,iCAAkC,SAAQ,gBAAiB,YAAW,gBAAgB;sBAC/E,aAAA,CAAA,MAAA,CAAA,gBAAA;;AAOhB;oDARS,iCAAiC;sDAAjC,iCAAiC;AAa7C;;ACZD,cAAa,2BAA2B,mBAAA,6BAAA,SAAA,iCAAA,SAAA,iCAAA;;;;","names":[]}
1
+ {"version":3,"file":"eui-ecl-components-ecl-social-media-follow.d.ts","sources":["../../components/ecl-social-media-follow/ecl-social-media-follow.component.ts","../../components/ecl-social-media-follow/ecl-social-media-follow-item.component.ts","../../components/ecl-social-media-follow/ecl-social-media-follow-link.directive.ts","../../components/ecl-social-media-follow/index.ts"],"mappings":";;;;AAGA,cAOa,6BAA8B,SAAQ,gBAAgB;0BAC3C,aAAA,CAAA,WAAA;yBACD,aAAA,CAAA,wBAAA;yBACA,aAAA,CAAA,wBAAA;kCACS,aAAA,CAAA,WAAA;;oDAJnB,6BAA6B;sDAA7B,6BAA6B;AAezC;;AChBD,cAAa,kCAAmC,SAAQ,YAAY;AAAG;AAEvE,cASa,iCAAkC,SAAQ,gBAAgB;yBAChD,aAAA,CAAA,wBAAA;AACnB,UAAI,aAAA,CAAA,WAAA;AACJ,aAAO,aAAA,CAAA,WAAA,CAAA,UAAA;mBACM,aAAA,CAAA,WAAA;yBACM,aAAA,CAAA,WAAA;qBACJ,aAAA,CAAA,WAAA;mBACF,aAAA,CAAA,WAAA;AACb,8BAAwB,aAAA,CAAA,WAAA;;AAEZ;AACI;;wBAME,aAAA,CAAA,gBAAA,CAAA,kCAAA;;;AAQlB,qBAAiB,KAAK;oDAzBb,iCAAiC;sDAAjC,iCAAiC;AA+B7C;;AC/CD,cAMa,iCAAkC,SAAQ,gBAAgB;sBACnD,aAAA,CAAA,MAAA,CAAA,gBAAA;;;oDADP,iCAAiC;sDAAjC,iCAAiC;AAc7C;;AChBD,cAAa,2BAA2B,mBAAA,6BAAA,SAAA,iCAAA,SAAA,iCAAA;;;;","names":[]}