{"version":3,"file":"taiga-ui-kit-components-pagination.mjs","sources":["../../../projects/kit/components/pagination/pagination.options.ts","../../../projects/kit/components/pagination/pagination.component.ts","../../../projects/kit/components/pagination/pagination.template.html","../../../projects/kit/components/pagination/taiga-ui-kit-components-pagination.ts"],"sourcesContent":["import {type TuiStringHandler} from '@taiga-ui/cdk/types';\nimport {tuiCreateOptions} from '@taiga-ui/cdk/utils/di';\nimport {type TuiSizeL} from '@taiga-ui/core/types';\n\nexport interface TuiPaginationOptions {\n    readonly size: TuiSizeL;\n    readonly appearance: TuiStringHandler<boolean>;\n}\n\nexport const [TUI_PAGINATION_OPTIONS, tuiPaginationOptionsProvider] =\n    tuiCreateOptions<TuiPaginationOptions>({\n        size: 'l',\n        appearance: (isActive) => (isActive ? 'primary' : 'flat'),\n    });\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    computed,\n    ElementRef,\n    inject,\n    input,\n    model,\n    viewChildren,\n} from '@angular/core';\nimport {type TuiContext} from '@taiga-ui/cdk/types';\nimport {tuiInjectElement} from '@taiga-ui/cdk/utils/dom';\nimport {tuiIsFocusedIn} from '@taiga-ui/cdk/utils/focus';\nimport {tuiClamp} from '@taiga-ui/cdk/utils/math';\nimport {TuiButton} from '@taiga-ui/core/components/button';\nimport {TUI_COMMON_ICONS} from '@taiga-ui/core/tokens';\nimport {TUI_PAGINATION_TEXTS} from '@taiga-ui/kit/tokens';\nimport {type PolymorpheusContent, PolymorpheusOutlet} from '@taiga-ui/polymorpheus';\n\nimport {TUI_PAGINATION_OPTIONS} from './pagination.options';\n\nconst ELLIPSIS_ITEM_LENGTH = 1;\nconst ACTIVE_ITEM_LENGTH = 1;\n\n@Component({\n    selector: 'tui-pagination',\n    imports: [PolymorpheusOutlet, TuiButton],\n    templateUrl: './pagination.template.html',\n    styleUrl: './pagination.style.less',\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TuiPagination {\n    private readonly els = viewChildren('element', {read: ElementRef});\n    private readonly el = tuiInjectElement();\n\n    private readonly maxHalfLength = computed(\n        () => this.sidePadding() + ELLIPSIS_ITEM_LENGTH + this.activePadding(),\n    );\n\n    private readonly maxElementsLength = computed(\n        () => this.maxHalfLength() * 2 + ACTIVE_ITEM_LENGTH,\n    );\n\n    private readonly lastElementIndex = computed(() => this.elementsLength() - 1);\n    private readonly itemsFit = computed(() => this.length() <= this.maxElementsLength());\n    private readonly lastIndex = computed(() => this.length() - 1);\n\n    private readonly reverseIndex = computed(\n        (): number => this.lastIndex() - this.index(),\n    );\n\n    protected readonly texts = inject(TUI_PAGINATION_TEXTS);\n    protected readonly icons = inject(TUI_COMMON_ICONS);\n    protected readonly options = inject(TUI_PAGINATION_OPTIONS);\n    protected readonly buttonSize = computed(() => (this.size() === 'm' ? 'xs' : 's'));\n\n    protected readonly elementsLength = computed(() =>\n        this.itemsFit() ? this.length() : this.maxElementsLength(),\n    );\n\n    public readonly length = input(1);\n    public readonly focusable = input(true);\n    public readonly size = input(this.options.size);\n    public readonly disabled = input(false);\n    public readonly activePadding = input(1);\n    public readonly sidePadding = input(1);\n    public readonly content = input<PolymorpheusContent<TuiContext<number>>>();\n    public readonly index = model(0);\n    public readonly arrowIsDisabledRight = computed(() => this.reverseIndex() === 0);\n    public readonly arrowIsDisabledLeft = computed(() => this.index() === 0);\n\n    public readonly nativeFocusableElement = computed((): HTMLElement | null => {\n        if (this.disabled()) {\n            return null;\n        }\n\n        let activeElementIndex = 0;\n\n        for (let i = 0; i < this.elementsLength(); i++) {\n            const itemIndex = this.getItemIndexByElementIndex(i);\n\n            if (itemIndex) {\n                activeElementIndex++;\n            }\n\n            if (itemIndex === this.index()) {\n                break;\n            }\n        }\n\n        return (\n            this.els().find((_, index) => index === activeElementIndex)?.nativeElement ??\n            null\n        );\n    });\n\n    public get focused(): boolean {\n        return tuiIsFocusedIn(this.el);\n    }\n\n    protected elementIsFocusable(index: number): boolean {\n        return this.index() === index && !this.focused;\n    }\n\n    /**\n     * Get index by element index\n     * @param elementIndex\n     * @returns index or null (for '…')\n     */\n    protected getItemIndexByElementIndex(elementIndex: number): number | null {\n        const reverseElementIndex = this.lastElementIndex() - elementIndex;\n\n        if (elementIndex < this.sidePadding()) {\n            return elementIndex;\n        }\n\n        if (reverseElementIndex < this.sidePadding()) {\n            return this.lastIndex() - reverseElementIndex;\n        }\n\n        if (\n            (elementIndex === this.sidePadding() &&\n                this.hasCollapsedItems(this.index())) ||\n            (reverseElementIndex === this.sidePadding() &&\n                this.hasCollapsedItems(this.reverseIndex()))\n        ) {\n            return null;\n        }\n\n        const computedIndex = this.index() - this.maxHalfLength() + elementIndex;\n\n        return tuiClamp(\n            computedIndex,\n            elementIndex,\n            this.lastIndex() - reverseElementIndex,\n        );\n    }\n\n    protected getElementMode(index = -1): string {\n        return this.options.appearance(this.index() === index);\n    }\n\n    protected onElementClick(index: number): void {\n        this.updateIndex(index);\n    }\n\n    protected onElementKeyDownArrowLeft(element: HTMLElement): void {\n        if (element === this.els()[0]?.nativeElement) {\n            return;\n        }\n\n        const previous = this.els().find(\n            (_, index, array) => array[index + 1]?.nativeElement === element,\n        );\n\n        previous?.nativeElement.focus();\n    }\n\n    protected onElementKeyDownArrowRight(element: HTMLElement): void {\n        if (element === this.els()[this.els().length - 1]?.nativeElement) {\n            return;\n        }\n\n        const next = this.els().find(\n            (_, index, array) => array[index - 1]?.nativeElement === element,\n        );\n\n        next?.nativeElement.focus();\n    }\n\n    protected onArrowClick(step: -1 | 1): void {\n        this.tryChangeTo(step);\n        this.nativeFocusableElement()?.focus();\n    }\n\n    /**\n     * Are there collapsed items at that index\n     * @param index\n     * @returns there are collapsed items\n     */\n    private hasCollapsedItems(index: number): boolean {\n        return !this.itemsFit() && index > this.maxHalfLength();\n    }\n\n    private tryChangeTo(step: -1 | 1): void {\n        this.updateIndex(tuiClamp(this.index() + step, 0, this.lastIndex()));\n    }\n\n    private updateIndex(index: number): void {\n        if (this.index() !== index) {\n            this.index.set(index);\n        }\n    }\n}\n","<div class=\"t-content\">\n    <button\n        tabIndex=\"-1\"\n        tuiIconButton\n        type=\"button\"\n        class=\"t-button\"\n        [appearance]=\"getElementMode()\"\n        [disabled]=\"arrowIsDisabledLeft()\"\n        [iconStart]=\"icons.decrement\"\n        [size]=\"buttonSize()\"\n        (click)=\"onArrowClick(-1)\"\n        (mousedown.zoneless.prevent)=\"(0)\"\n    >\n        {{ texts()[0] }}\n    </button>\n    @for (_ of '-'.repeat(elementsLength()); track $index) {\n        @let index = getItemIndexByElementIndex($index);\n        @if (index !== null) {\n            <button\n                #element\n                automation-id=\"tui-pagination__element\"\n                tuiButton\n                type=\"button\"\n                class=\"t-button\"\n                [appearance]=\"getElementMode(index)\"\n                [disabled]=\"disabled()\"\n                [size]=\"buttonSize()\"\n                [tabIndex]=\"elementIsFocusable(index) ? 0 : -1\"\n                (click)=\"onElementClick(index)\"\n                (keydown.arrowLeft.prevent)=\"onElementKeyDownArrowLeft(element)\"\n                (keydown.arrowRight.prevent)=\"onElementKeyDownArrowRight(element)\"\n            >\n                <ng-container *polymorpheusOutlet=\"content() || index + 1 as text; context: {$implicit: index}\">\n                    {{ text }}\n                </ng-container>\n            </button>\n        } @else {\n            <div\n                automation-id=\"tui-pagination__element\"\n                class=\"t-ellipsis\"\n                [class.t-ellipsis_small]=\"size() === 'm'\"\n            ></div>\n        }\n    }\n\n    <button\n        tabIndex=\"-1\"\n        tuiIconButton\n        type=\"button\"\n        class=\"t-button\"\n        [appearance]=\"getElementMode()\"\n        [disabled]=\"arrowIsDisabledRight()\"\n        [iconStart]=\"icons.increment\"\n        [size]=\"buttonSize()\"\n        (click)=\"onArrowClick(1)\"\n        (mousedown.zoneless.prevent)=\"(0)\"\n    >\n        {{ texts()[1] }}\n    </button>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}