{"version":3,"file":"chunk-nbf2gibg.js","sources":["packages/sports/libs/common/ui/text-auto-scroll/src/lib/text-auto-scroll.directive.ts"],"sourcesContent":["import { DestroyRef, Directive, ElementRef, HostListener, Input, OnChanges, OnDestroy, OnInit, inject } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { MutationObserverService } from '@frontend/sports/common/core/utils/dom';\nimport { ISimpleChanges } from '@frontend/sports/common/core/utils/simple-change';\nimport { TimerService } from '@frontend/sports/common/core/utils/timer';\nimport { DeviceService } from '@frontend/vanilla/core';\n\n/**\n * A directive that enables automatic scrolling of text for overflowing content, often referred to as a marquee effect.\n * This directive supports responsive interaction, including mouse hover, touch events, and automatic scroll initiation.\n *\n * Usage:\n * Add the `msTextAutoScroll` attribute to an element. Configure behavior using available input properties.\n *\n * Inputs:\n * - `marqueeAutoScroll`: Enables automatic scrolling after a delay (default: `false`).\n * - `ngDisabled`: Disables the marquee functionality (default: `false`).\n * - `ignoreMouseEvents`: Ignores mouse hover events (default: `false`).\n * - `ignoreTouchEvents`: Ignores touch events (default: `false`).\n * - `allowEventPropagation`: Allows events to propagate beyond the directive (default: `false`).\n */\n@Directive({\n selector: '[msTextAutoScroll]',\n standalone: true,\n})\nexport class TextAutoScrollDirective implements OnChanges, OnInit, OnDestroy {\n @Input() marqueeAutoScroll = false;\n @Input() ngDisabled = false;\n @Input() ignoreMouseEvents = false;\n @Input() ignoreTouchEvents = false;\n @Input() allowEventPropagation = false;\n\n private intervalUnsubscribe: (() => void) | null = null;\n private readonly WAIT_DELAY = 25;\n private readonly INTERVAL_DELAY = 30;\n private readonly START_INTERVAL_DELAY = 5000;\n private readonly marqueeWorkingClass = 'marquee-working';\n\n private readonly element: ElementRef = inject(ElementRef) as ElementRef;\n private readonly timerService: TimerService = inject(TimerService);\n private readonly mutationObserver: MutationObserverService = inject(MutationObserverService);\n private readonly deviceService: DeviceService = inject(DeviceService);\n private readonly destroyRef = inject(DestroyRef);\n\n ngOnInit(): void {\n this.initAutoScroll();\n this.initMutationObserver();\n }\n\n ngOnChanges(changes: ISimpleChanges): void {\n if ('ngDisabled' in changes) {\n const value = changes.ngDisabled;\n if ((value && !this.intervalUnsubscribe) || (!value && !!this.intervalUnsubscribe)) {\n this.toggleMarquee();\n }\n }\n }\n\n ngOnDestroy(): void {\n this.stopInterval();\n }\n\n initAutoScroll = () => {\n if (this.marqueeAutoScroll) {\n this.timerService.setTimeout(() => {\n if (!this.intervalUnsubscribe) {\n this.toggleMarquee();\n }\n }, this.START_INTERVAL_DELAY);\n }\n };\n\n stopInterval = () => {\n if (this.intervalUnsubscribe) {\n this.intervalUnsubscribe();\n }\n this.element.nativeElement.classList.remove(this.marqueeWorkingClass);\n this.intervalUnsubscribe = null;\n };\n\n @HostListener('mouseover', ['$event'])\n hoverHandler = (e: Event) => {\n if (!this.deviceService.isMobile && !this.ignoreMouseEvents) {\n if (!this.allowEventPropagation) {\n e.stopPropagation();\n }\n this.toggleMarquee();\n }\n };\n\n @HostListener('mouseout', ['$event'])\n mouseOutHandler = (e: Event) => {\n if (!this.deviceService.isMobile && !this.ignoreMouseEvents) {\n if (!this.allowEventPropagation) {\n e.stopPropagation();\n }\n this.stopInterval();\n this.element.nativeElement.style.textIndent = '0px';\n }\n };\n\n @HostListener('touchend', ['$event'])\n touchHandler = (e: Event) => {\n if (!this.ignoreTouchEvents) {\n if (!this.allowEventPropagation) {\n e.stopPropagation();\n }\n this.toggleMarquee();\n }\n };\n\n toggleMarquee = () => {\n this.element.nativeElement.style.textIndent = '0';\n\n if (this.intervalUnsubscribe) {\n this.stopInterval();\n return;\n }\n\n let counter = 0;\n let clientWidth = this.element.nativeElement.clientWidth;\n let scrollWidth = this.element.nativeElement.scrollWidth;\n // add 1px because clientWidth and scrollWidth return integers and not float\n // this way we always show the full text\n let pixelsToScroll = scrollWidth - clientWidth + 1;\n if (scrollWidth === clientWidth) {\n pixelsToScroll = 0;\n }\n\n this.element.nativeElement.classList.add(this.marqueeWorkingClass);\n\n const intervalCallback = () => {\n clientWidth = this.element.nativeElement.clientWidth;\n scrollWidth = this.element.nativeElement.scrollWidth;\n const crtIndent = parseFloat(this.element.nativeElement.style.textIndent);\n\n if (counter === 0 && pixelsToScroll) {\n this.element.nativeElement.style.textIndent = `${crtIndent - 1}px`;\n pixelsToScroll--;\n } else if (counter === this.WAIT_DELAY) {\n if (crtIndent >= 0) {\n this.element.nativeElement.style.textIndent = '0px';\n this.stopInterval();\n\n return;\n } else {\n this.element.nativeElement.style.textIndent = `${crtIndent + 1}px`;\n counter++;\n }\n } else if (counter > this.WAIT_DELAY && clientWidth <= scrollWidth) {\n if (crtIndent !== 0) {\n this.element.nativeElement.style.textIndent = `${crtIndent + 1}px`;\n } else {\n this.stopInterval();\n\n return;\n }\n } else {\n counter++;\n }\n };\n\n this.intervalUnsubscribe = this.timerService.setInterval(intervalCallback, this.INTERVAL_DELAY);\n };\n\n private initMutationObserver(): void {\n const target = this.element.nativeElement;\n const options = {\n characterData: true,\n characterDataOldValue: true,\n childList: true,\n subtree: true,\n };\n\n this.mutationObserver\n .observe(target, options)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.stopInterval();\n this.element.nativeElement.style.textIndent = '0px';\n this.initAutoScroll();\n });\n }\n}\n"],"names":["TextAutoScrollDirective","constructor","marqueeAutoScroll","ngDisabled","ignoreMouseEvents","ignoreTouchEvents","allowEventPropagation","intervalUnsubscribe","WAIT_DELAY","INTERVAL_DELAY","START_INTERVAL_DELAY","marqueeWorkingClass","element","inject","ElementRef","timerService","TimerService","mutationObserver","MutationObserverService","deviceService","DeviceService","destroyRef","DestroyRef","initAutoScroll","setTimeout","toggleMarquee","stopInterval","nativeElement","classList","remove","hoverHandler","e","isMobile","stopPropagation","mouseOutHandler","style","textIndent","touchHandler","counter","clientWidth","scrollWidth","pixelsToScroll","add","intervalCallback","crtIndent","parseFloat","setInterval","ngOnInit","initMutationObserver","ngOnChanges","changes","value","ngOnDestroy","target","options","characterData","characterDataOldValue","childList","subtree","observe","pipe","takeUntilDestroyed","subscribe","selectors","hostBindings","rf","ctx","ɵɵlistener","$event","u","_TextAutoScrollDirective"],"mappings":"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"}