{"version":3,"file":"seniorsistemas-angular-components-tabs.mjs","sources":["../../projects/angular-components/tabs/src/lib/tab-item/tab-item.component.ts","../../projects/angular-components/tabs/src/lib/tab-item/tab-item.component.html","../../projects/angular-components/tabs/src/lib/tabs/tabs.component.ts","../../projects/angular-components/tabs/src/lib/tabs/tabs.component.html","../../projects/angular-components/tabs/src/seniorsistemas-angular-components-tabs.ts"],"sourcesContent":["import {\n    AfterViewInit,\n    Component,\n    computed,\n    contentChildren,\n    input,\n    model,\n    TemplateRef,\n    viewChild,\n} from '@angular/core';\nimport { TemplateDirective } from '@seniorsistemas/angular-components/template';\n\n/**\n * @description Componente de item de aba, utilizado como filho direto de `TabsComponent`.\n * Define o rótulo, ícone e conteúdo de cada aba individualmente.\n * Suporta templates customizados para cabeçalho e corpo via `TemplateDirective`.\n *\n * @example\n * ```html\n * <s-tab-item header=\"Detalhes\" value=\"details\" [disabled]=\"false\">\n *   Conteúdo da aba\n * </s-tab-item>\n * ```\n *\n * @category Navegação\n */\n@Component({\n    selector: 's-tab-item',\n    standalone: true,\n    templateUrl: './tab-item.component.html',\n})\nexport class TabItemComponent implements AfterViewInit {\n    readonly _template = viewChild<TemplateRef<any>>('template');\n    readonly headerTemplateDirectives = contentChildren(TemplateDirective);\n    readonly templateContent = computed(() => {\n        return this.headerTemplateDirectives()?.find((x) => x.type === 'body')?.template;\n    });\n\n    /** @description Classe de ícone exibida ao lado do rótulo da aba (ex: classe de Font Awesome. */\n    icon = input<string>();\n\n    /** @description Texto do rótulo exibido na aba. */\n    header = input<string>();\n\n    /**\n     * @description Quando `true`, a aba fica desabilitada e não pode ser selecionada pelo usuário.\n     *\n     * @default false\n     */\n    disabled = input<boolean>(false);\n\n    /**\n     * @description Valor identificador único da aba, utilizado pelo `TabsComponent` para controlar a aba ativa.\n     * Quando não informado, é atribuído automaticamente o índice da aba (baseado em zero).\n     */\n    value = model<string | number>();\n\n    /**\n     * @description Quando `true`, destrói o conteúdo da aba ao escondê-la, liberando recursos.\n     * Exige que o conteúdo seja envolvido em um template com `sTemplate=\"body\"`.\n     *\n     * @default false\n     */\n    destroyOnHide = input(false);\n    template = computed(() => {\n        const _template = this._template();\n        const templateContent = this.templateContent();\n        return templateContent ? templateContent : _template;\n    });\n    headerElement = computed(() => {\n        return this.headerTemplateDirectives()?.find((x) => x.type === 'header')?.template;\n    });\n\n    ngAfterViewInit(): void {\n        if (this.destroyOnHide() && !this.templateContent()) {\n            console.error(\"When destroyOnHide is true sTemplate='body' is required\");\n        }\n        return;\n    }\n}\n\n","<ng-template #template>\n    <ng-content></ng-content>\n</ng-template>\n","import { NgClass, NgTemplateOutlet } from '@angular/common';\nimport { Component, computed, contentChildren, input, model, OnDestroy } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { TooltipDirective } from '@seniorsistemas/angular-components/tooltip';\nimport { Subject, takeUntil } from 'rxjs';\nimport { TabItemComponent } from '../tab-item/tab-item.component';\nimport { InteractiveContentDirective } from '@seniorsistemas/angular-components/interactive-content';\n\n/**\n * @description Componente de abas (tabs) que organiza o conteúdo em painéis acessíveis por rótulos clicáveis.\n * Suporta layout horizontal e vertical, two-way binding da aba ativa e renderização condicional\n * do conteúdo de cada aba via `TabItemComponent`.\n *\n * @example\n * ```html\n * <s-tabs [(activeTab)]=\"activeTab\" layoutType=\"horizontal\">\n *   <s-tab-item header=\"Aba 1\" value=\"tab1\">Conteúdo 1</s-tab-item>\n *   <s-tab-item header=\"Aba 2\" value=\"tab2\">Conteúdo 2</s-tab-item>\n * </s-tabs>\n * ```\n *\n * @category Navegação\n */\n@Component({\n    selector: 's-tabs',\n    standalone: true,\n    imports: [InteractiveContentDirective, NgTemplateOutlet, NgClass, TooltipDirective],\n    templateUrl: './tabs.component.html',\n    styleUrls: ['./tabs.component.scss'],\n})\nexport class TabsComponent implements OnDestroy {\n    private readonly onDestroy$ = new Subject<void>();\n    protected readonly tabItems = contentChildren(TabItemComponent);\n\n    protected readonly activeTabComponent = computed(() => {\n        return this.tabItems()\n            .find((tab) => tab.value() === this.activeTab() && tab.destroyOnHide())\n            ?.template();\n    });\n\n    protected readonly keepAliveTabsContent = computed(() => {\n        return this.tabItems().filter((tab) => !tab.destroyOnHide());\n    });\n\n    /**\n     * @description Valor da aba atualmente ativa. Suporta two-way binding via `[(activeTab)]`.\n     * Por padrão, ativa a primeira aba (índice `0`).\n     *\n     * @default 0\n     */\n    activeTab = model<string | number>(0);\n\n    /**\n     * @description Orientação visual das abas.\n     * - `'horizontal'`: abas exibidas em linha, acima do conteúdo (padrão).\n     * - `'vertical'`: abas exibidas em coluna, à esquerda do conteúdo.\n     *\n     * @default 'horizontal'\n     */\n    layoutType = input<'horizontal' | 'vertical'>('horizontal');\n\n    constructor() {\n        toObservable(this.tabItems)\n            .pipe(takeUntil(this.onDestroy$))\n            .subscribe(() => {\n                const tabs = this.tabItems();\n                tabs.forEach((tab, $index) => {\n                    const tabHasValue = !!tab.value();\n                    if (!tabHasValue) {\n                        tab.value.set($index);\n                    }\n                });\n            });\n    }\n\n    ngOnDestroy(): void {\n        this.onDestroy$.next();\n    }\n\n    protected onActiveTab(tab: TabItemComponent) {\n        if (tab.disabled()) {\n            return;\n        }\n        const _previousTab = this.tabItems().find((tab) => tab.value() === this.activeTab());\n        if (_previousTab && !_previousTab.templateContent() && _previousTab.destroyOnHide()) {\n            _previousTab.template();\n        }\n        this.activeTab.set(tab.value() as string | number);\n    }\n}\n\n","@let layout = layoutType();\n@let isHorizontal = layout === 'horizontal';\n@let isVertical = layout === 'vertical';\n<ng-template #buttonsRender>\n    @for (tab of tabItems(); track $index) {\n        @let isActiveTab = tab.value() === activeTab();\n        @let disabledTab = tab.disabled();\n        <button\n            #tabButton\n            (sInteractiveContent)=\"onActiveTab(tab)\"\n            class=\"flex min-h-11 min-w-24 justify-start overflow-hidden text-ellipsis whitespace-nowrap border-primary p-2 hover:transition-all disabled:border-grayscale-30 disabled:text-grayscale-30\"\n            [class.active-tab]=\"isActiveTab\"\n            [disabled]=\"disabledTab\"\n            [ngClass]=\"{\n                'font-bold': isActiveTab,\n                'text-primary': !isActiveTab,\n                'border-b-4': isActiveTab && isHorizontal,\n                'border-r-4': isActiveTab && isVertical,\n                'hover:border-b-4': isHorizontal && !disabledTab,\n                'hover:border-r-4': isVertical && !disabledTab,\n                'flex items-center gap-2': tab.icon(),\n            }\"\n        >\n            @let headerElement = tab.headerElement();\n            @if (headerElement) {\n                <ng-container *ngTemplateOutlet=\"headerElement\"></ng-container>\n            } @else {\n                @if (tab.icon()) {\n                    <i\n                        class=\"text-grayscale-100\"\n                        [class]=\"tab.icon()\"\n                    ></i>\n                }\n                <span\n                    class=\"block overflow-hidden text-ellipsis whitespace-nowrap text-left\"\n                    [class.max-w-28]=\"isHorizontal\"\n                    [sTooltip]=\"tab.header()\"\n                    [visible]=\"!disabledTab\"\n                    [checkTruncatedText]=\"true\"\n                >\n                    {{ tab.header() }}\n                </span>\n            }\n        </button>\n    }\n</ng-template>\n\n<ng-template #renderComponent>\n    @let template = activeTabComponent();\n    @if (template) {\n        <section class=\"h-full min-h-10 bg-grayscale-0 p-2\">\n            <ng-container *ngTemplateOutlet=\"template\" />\n        </section>\n    }\n    @for (keepAliveTab of keepAliveTabsContent(); track $index) {\n        @let isActiveTab = keepAliveTab.value() === activeTab();\n\n        <section\n            class=\"h-full min-h-10 bg-grayscale-0 p-2\"\n            [class.hidden]=\"!isActiveTab\"\n            [class.block]=\"isActiveTab\"\n        >\n            @if (keepAliveTab.template()) {\n                <ng-container *ngTemplateOutlet=\"keepAliveTab.template()!\"></ng-container>\n            }\n        </section>\n    }\n</ng-template>\n\n@if (isHorizontal) {\n    <section class=\"p-2\">\n        <div class=\"flex grid-flow-col overflow-auto border-b-[1px] border-b-grayscale-20\">\n            <ng-container *ngTemplateOutlet=\"buttonsRender\"></ng-container>\n        </div>\n        <ng-container *ngTemplateOutlet=\"renderComponent\"></ng-container>\n    </section>\n} @else if (isVertical) {\n    <section class=\"vertical-tab flex w-full flex-wrap gap-2\">\n        <aside class=\"vertical-tab-buttons flex max-h-96 flex-col overflow-auto\">\n            <ng-container *ngTemplateOutlet=\"buttonsRender\"></ng-container>\n        </aside>\n        <aside class=\"vertical-tab-content flex-1\">\n            <ng-container *ngTemplateOutlet=\"renderComponent\"></ng-container>\n        </aside>\n    </section>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}