{"version":3,"file":"mosaic-design-infosec-components-components-clamped-text.mjs","sources":["../../../libs/components/clamped-text/src/lib/constants/i18n.ts","../../../libs/components/clamped-text/src/lib/constants/rows.ts","../../../libs/components/clamped-text/src/lib/components/clamped-text/clamped-text.component.ts","../../../libs/components/clamped-text/src/lib/components/clamped-text/clamped-text.component.html","../../../libs/components/clamped-text/src/lib/clamped-text.module.ts","../../../libs/components/clamped-text/mosaic-design-infosec-components-components-clamped-text.ts"],"sourcesContent":["import { clampedTextTranslates } from '@mosaic-design/infosec-components/i18n-resources';\nimport { LocalizationScopeConfig, IcTranslocoScopeAlias } from '@mosaic-design/infosec-components/types';\n\nexport const scopeConfig: LocalizationScopeConfig = {\n    alias: IcTranslocoScopeAlias.ClampedText,\n    localTranslates: clampedTextTranslates\n};\n","export const defaultRowsCount = 5;\n","import {\n    AfterViewInit,\n    ChangeDetectionStrategy,\n    Component,\n    ElementRef,\n    EventEmitter,\n    Input,\n    NgZone,\n    Output,\n    ViewChild\n} from '@angular/core';\nimport { BehaviorSubject, distinctUntilChanged, Observable, skip, takeUntil } from 'rxjs';\n\nimport { DestroyService } from '@mosaic-design/infosec-components/services';\nimport { IcTranslocoScopeAlias } from '@mosaic-design/infosec-components/types';\nimport { nodeResize$, runInZone, uniq } from '@mosaic-design/infosec-components/utils';\n\nimport { defaultRowsCount } from '../../constants';\n\n@Component({\n    selector: 'ic-clamped-text',\n    templateUrl: './clamped-text.component.html',\n    styleUrls: ['./clamped-text.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [DestroyService],\n    host: {\n        class: 'ic-clamped-text'\n    }\n})\nexport class ClampedTextComponent implements AfterViewInit {\n    protected readonly IcTranslocoScopeAlias = IcTranslocoScopeAlias;\n\n    @Input() set rows(value: number | undefined) {\n        this.#rows = value ?? defaultRowsCount;\n\n        if (this.#isViewInitialized) {\n            this.updateLineClamp();\n        }\n    }\n\n    get rows(): number {\n        return this.#rows;\n    }\n\n    #rows = defaultRowsCount;\n\n    @Input() set isCollapsed(value: boolean | undefined) {\n        this.isCollapsed$.next(value);\n    }\n\n    protected isCollapsed$ = new BehaviorSubject<boolean | undefined>(undefined);\n\n    @Output() isCollapsedChange = new EventEmitter<boolean>();\n\n    /**\n     * У text должен быть display=inline для корректного подсчета строк с помощью getClientRects.\n     * А у textContainer должен быть display!=inline для работы ResizeObserver.\n     */\n    @ViewChild('text') text: ElementRef<HTMLElement> | undefined;\n    @ViewChild('textContainer') textContainer: ElementRef<HTMLElement> | undefined;\n\n    #hasExpander$ = new BehaviorSubject<boolean>(false);\n    #isViewInitialized = false;\n\n    protected hasExpander$: Observable<boolean>;\n\n    constructor(\n        private ngZone: NgZone,\n        private destroyed$: DestroyService\n    ) {\n        this.isCollapsed$\n            .pipe(skip(1), distinctUntilChanged(), runInZone(this.ngZone), takeUntil(this.destroyed$))\n            .subscribe((isCollapsed) => {\n                this.isCollapsedChange.emit(isCollapsed);\n            });\n\n        this.hasExpander$ = this.#hasExpander$.pipe(distinctUntilChanged(), runInZone(this.ngZone));\n    }\n\n    ngAfterViewInit(): void {\n        this.#isViewInitialized = true;\n\n        this.updateLineClamp();\n        this.createResizeObserver();\n    }\n\n    toggleIsCollapsed(event: Event): void {\n        event.stopPropagation();\n        this.isCollapsed$.next(!this.isCollapsed$.value);\n    }\n\n    private updateLineClamp(): void {\n        const textContainer = this.textContainer?.nativeElement;\n\n        if (textContainer) {\n            textContainer.style.webkitLineClamp = this.rows.toString();\n        }\n    }\n\n    private updateCollapsedState(): void {\n        // обновляем состояние, если оно не передано извне\n        if (this.#hasExpander$.value && this.isCollapsed$.value === undefined) {\n            this.isCollapsed$.next(true);\n        }\n    }\n\n    private updateExpanderState(text: HTMLElement): void {\n        const rows = this.getRowsCount(text);\n        this.#hasExpander$.next(rows > this.rows);\n    }\n\n    /**\n     * Если на одной строке есть несколько контейнеров, то в DOMRectList будет несколько элементов\n     * с одинаковым top (или y). Для получения реального количества строк оставляем только уникальные.\n     */\n    private getRowsCount(element: HTMLElement): number {\n        const rects = element.getClientRects();\n        const top = Array.from(rects, (rect) => rect.top);\n\n        return uniq(top).length;\n    }\n\n    private createResizeObserver(): void {\n        const text = this.text?.nativeElement;\n        const textContainer = this.textContainer?.nativeElement;\n\n        if (text && textContainer) {\n            nodeResize$(textContainer)\n                .pipe(takeUntil(this.destroyed$))\n                .subscribe(() => {\n                    this.updateExpanderState(text);\n                    this.updateCollapsedState();\n                });\n        }\n    }\n}\n","<ng-container *icLet=\"isCollapsed$ | icPush; let isCollapsed\">\n    <div [ngClass]=\"{ 'ic-clamped-text__container_collapsed': isCollapsed }\" #textContainer>\n        <span #text><ng-content></ng-content></span>\n    </div>\n\n    <div *ngIf=\"hasExpander$ | icPush\" class=\"ic-clamped-text__collapse-link\">\n        <span kbq-link pseudo (click)=\"toggleIsCollapsed($event)\">\n            <ng-container *ngIf=\"isCollapsed; else expanded\">\n                <i kbq-icon=\"kbq-chevron-down_16\"></i>\n                <span class=\"kbq-link__text\">\n                    <ic-coalesce-content\n                        [items]=\"[{ alias: IcTranslocoScopeAlias.ClampedText, key: 'ClampedText.Link.Text.Expand' }]\"\n                    ></ic-coalesce-content>\n                </span>\n            </ng-container>\n\n            <ng-template #expanded>\n                <i kbq-icon=\"kbq-chevron-up_16\"></i>\n                <span class=\"kbq-link__text\">\n                    <ic-coalesce-content\n                        [items]=\"[\n                            {\n                                alias: IcTranslocoScopeAlias.ClampedText,\n                                key: 'ClampedText.Link.Text.Collapse'\n                            }\n                        ]\"\n                    ></ic-coalesce-content>\n                </span>\n            </ng-template>\n        </span>\n    </div>\n</ng-container>\n","import { NgClass, NgIf, NgTemplateOutlet } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { KbqIconModule } from '@koobiq/components/icon';\nimport { KbqLinkModule } from '@koobiq/components/link';\n\nimport { IcCoalesceContentModule } from '@mosaic-design/infosec-components/components/coalesce-content';\nimport { IcLetDirective } from '@mosaic-design/infosec-components/directives';\nimport { IcPushPipe } from '@mosaic-design/infosec-components/external/ngrx-component/pipes';\n\nimport { ClampedTextComponent } from './components';\n\n/**\n * @deprecated Будет удален в 19 версии. Компоненты будут standalone\n */\n@NgModule({\n    imports: [\n        NgIf,\n        NgTemplateOutlet,\n        NgClass,\n\n        KbqLinkModule,\n        KbqIconModule,\n\n        IcPushPipe,\n        IcLetDirective,\n        IcCoalesceContentModule\n    ],\n\n    declarations: [ClampedTextComponent],\n    exports: [ClampedTextComponent]\n})\nexport class IcClampedTextModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}