{"version":3,"file":"seniorsistemas-angular-components-button.mjs","sources":["../../projects/angular-components/button/src/lib/button/button.component.ts","../../projects/angular-components/button/src/lib/button/button.component.html","../../projects/angular-components/button/src/lib/button/button.module.ts","../../projects/angular-components/button/src/seniorsistemas-angular-components-button.ts"],"sourcesContent":["import { Component, EventEmitter, HostBinding, Input, OnChanges, Output, SimpleChanges } from '@angular/core';\n\nimport { NgClass, NgStyle } from '@angular/common';\nimport { BadgeModule } from '@seniorsistemas/angular-components/badge';\nimport { TieredMenuItemData, TieredMenuModule } from '@seniorsistemas/angular-components/tiered-menu';\nimport { TooltipModule, TooltipPositions } from '@seniorsistemas/angular-components/tooltip';\nimport { randomHash } from '@seniorsistemas/angular-components/utils';\nimport { ButtonAnimations } from './models/button-animations';\nimport { ButtonBadgeConfig } from './models/button-badge-config';\nimport { ButtonPriority } from './models/button-priority';\n\n/**\n * @description Componente de botão versátil que suporta ícones, tooltip, menu de opções\n * (tiered menu), badge, animações e diferentes prioridades visuais. Pode ser configurado\n * como botão de ação simples, botão com menu dropdown ou botão deslizante (slide).\n *\n * @example\n * ```html\n * <s-button\n *   label=\"Salvar\"\n *   iconClass=\"fas fa-save\"\n *   priority=\"primary\"\n *   (clicked)=\"onSave()\" />\n * ```\n *\n * @category Inputs\n */\n@Component({\n    selector: 's-button',\n    templateUrl: './button.component.html',\n    styleUrls: ['./button.component.scss'],\n    host: {\n        '[class.s-button-with-badge]': '!!badge',\n    },\n    standalone: true,\n    imports: [NgClass, NgStyle, BadgeModule, TieredMenuModule, TooltipModule],\n})\nexport class ButtonComponent implements OnChanges {\n    @HostBinding('style.min-width')\n    public minWidth = '40px';\n\n    /**\n     * @description Identificador único do elemento botão no DOM.\n     * Gerado automaticamente se não informado.\n     */\n    @Input()\n    public id? = `s-button-${randomHash()}`;\n\n    /**\n     * @description Texto exibido dentro do botão.\n     */\n    @Input()\n    public label?: string;\n\n    /**\n     * @description Texto do tooltip exibido ao passar o mouse sobre o botão.\n     */\n    @Input()\n    public tooltip?: string;\n\n    /**\n     * @description Posição do tooltip em relação ao botão.\n     *\n     * @default 'top'\n     */\n    @Input()\n    public tooltipPosition: TooltipPositions = 'top';\n\n    /**\n     * @description Classe de ícone exibida à esquerda do label (ex.: `'fas fa-save'`).\n     */\n    @Input()\n    public iconClass?: string;\n\n    /**\n     * @description Classe de ícone exibida à direita do label.\n     */\n    @Input()\n    public rightIconClass?: string;\n\n    /**\n     * @description Exibe o ícone de caret (seta) quando o botão possui um menu de opções.\n     *\n     * @default true\n     */\n    @Input()\n    public caret = true;\n\n    /**\n     * @description Classe CSS adicional aplicada ao elemento `<button>` interno.\n     *\n     * @default ''\n     */\n    @Input()\n    public styleClass = '';\n\n    /**\n     * @description Z-index base do painel do menu dropdown associado ao botão.\n     *\n     * @default 0\n     */\n    @Input()\n    public baseZIndex = 0;\n\n    /**\n     * @description Desabilita o botão, impedindo cliques e interação do usuário.\n     *\n     * @default false\n     */\n    @Input()\n    public disabled = false;\n\n    /**\n     * @description Aplica estilo auxiliar (menos destaque visual) ao botão.\n     *\n     * @default false\n     */\n    @Input()\n    public auxiliary = false;\n\n    /**\n     * @description Tipo do elemento `<button>` HTML (`'button'`, `'submit'`, `'reset'`).\n     *\n     * @default 'button'\n     */\n    @Input()\n    public type? = 'button';\n\n    /**\n     * @description Prioridade visual do botão, que determina seu estilo.\n     * Aceita `'primary'`, `'default'`, `'danger'`, `'link'`, entre outros.\n     *\n     * @default 'primary'\n     */\n    @Input()\n    public priority?: ButtonPriority = 'primary';\n\n    /**\n     * @description Lista de itens do menu dropdown exibido ao clicar no caret do botão.\n     *\n     * @default []\n     */\n    @Input()\n    public menuOptions: TieredMenuItemData[] = [];\n\n    /**\n     * @description Tamanho visual do botão. Aceita `'default'` ou `'small'`.\n     *\n     * @default 'default'\n     */\n    @Input()\n    public size?: 'default' | 'small' = 'default';\n\n    /**\n     * @description Habilita o modo slide, que exibe uma animação de deslize ao passar o mouse.\n     * Requer `priority` igual a `'default'` ou `'link'` e um `label` definido.\n     *\n     * @default false\n     */\n    @Input()\n    public slide = false;\n\n    /**\n     * @description Tipo de animação aplicada ao botão (`'rotate'`, `'pulse'`, etc.).\n     */\n    @Input()\n    public animation?: ButtonAnimations;\n\n    /**\n     * @description Configuração do badge exibido sobre o botão, com contador ou indicador visual.\n     */\n    @Input()\n    public badge?: ButtonBadgeConfig;\n\n    /**\n     * @description Cor aplicada ao ícone do botão, sobrescrevendo a cor padrão do tema.\n     */\n    @Input()\n    public iconColor?: string;\n\n    /**\n     * @description Texto alternativo para o menu associado ao botão, utilizado para acessibilidade.\n     */\n    @Input()\n    public menuAriaLabel?: string;\n\n    /**\n     * @description Emitido ao clicar no botão, desde que não esteja desabilitado.\n     */\n    @Output()\n    public clicked: EventEmitter<any> = new EventEmitter();\n\n    public isMenuOpen = false;\n\n    public validateSlideButton(): boolean {\n        return !!(this.slide && (this.priority === 'default' || this.priority === 'link') && this.label?.length);\n    }\n\n    public ngOnChanges(_: SimpleChanges): void {\n        const hasIcon = this.iconClass;\n        const hasText = this.label;\n\n        const isMultiple = this.menuOptions?.length;\n\n        if (hasText || (hasIcon && isMultiple)) {\n            this.minWidth = '80px';\n        }\n        if (hasText && hasIcon && isMultiple) {\n            this.minWidth = '100px';\n        }\n    }\n\n    public isRotateAnimation(): boolean {\n        return this.animation === 'rotate';\n    }\n\n    public onTieredMenuOpened(): void {\n        this.isMenuOpen = true;\n    }\n\n    public onTieredMenuClosed(): void {\n        this.isMenuOpen = false;\n    }\n}\n\n","<button\n    [id]=\"id\"\n    [type]=\"type\"\n    [class]=\"styleClass\"\n    [ngClass]=\"{\n        's-button-auxiliary': auxiliary,\n        's-button-with-icon': iconClass,\n        's-button-with-text': label,\n        's-button-only-icon': iconClass && !label && !menuOptions.length,\n        's-button-empty': !iconClass && !label,\n        's-button-size-default': size === 'default',\n        's-button-size-small': size === 'small',\n        's-button-priority-default': priority === 'default',\n        's-button-priority-primary': priority === 'primary',\n        's-button-priority-secondary': priority === 'secondary',\n        's-button-priority-link': priority === 'link',\n        's-button-priority-danger': priority === 'danger',\n        's-button-multiple': (caret && menuOptions.length) || rightIconClass,\n        's-button--slide': validateSlideButton(),\n        's-button--rotate-animation': isRotateAnimation(),\n    }\"\n    sTieredMenu\n    [items]=\"menuOptions\"\n    [ariaLabel]=\"menuAriaLabel\"\n    [attr.aria-haspopup]=\"menuOptions.length ? 'menu' : null\"\n    [attr.aria-expanded]=\"menuOptions.length ? isMenuOpen : null\"\n    [disabled]=\"disabled\"\n    [sTooltip]=\"tooltip\"\n    [tooltipPosition]=\"tooltipPosition\"\n    (tieredMenuOpened)=\"onTieredMenuOpened()\"\n    (tieredMenuClosed)=\"onTieredMenuClosed()\"\n    (click)=\"clicked.emit($event)\"\n>\n    @if (iconClass) {\n        <span\n            [class]=\"iconClass\"\n            [ngClass]=\"{\n                's-button-icon': true,\n                's-button-icon-margin-right': !label && menuOptions.length,\n            }\"\n            [ngStyle]=\"{ color: iconColor }\"\n            aria-hidden=\"true\"\n        >\n        </span>\n    }\n    @if (label) {\n        <span\n            class=\"s-button-text\"\n            [ngClass]=\"{\n                's-button-icon-margin-right': !!rightIconClass || menuOptions.length,\n                's-button-icon-margin-left': !!iconClass,\n            }\"\n        >\n            {{ label }}\n        </span>\n    }\n    <ng-content></ng-content>\n    @if (rightIconClass) {\n        <span\n            [class]=\"rightIconClass\"\n            [ngClass]=\"{ 's-button-right-icon': true }\"\n            [ngStyle]=\"{ color: iconColor }\"\n            aria-hidden=\"true\"\n        >\n        </span>\n    }\n    @if ((caret && menuOptions.length) || (menuOptions && menuOptions.length)) {\n        <span\n            class=\"menu-options-icon fa fa-fw fa-caret-down\"\n            aria-hidden=\"true\"\n        >\n        </span>\n    }\n</button>\n@if (badge) {\n    <div class=\"badge\">\n        <s-badge\n            [color]=\"badge.color\"\n            [text]=\"badge.text\"\n            [iconClass]=\"badge.iconClass\"\n        >\n        </s-badge>\n    </div>\n}\n\n","import { NgModule } from '@angular/core';\n\nimport { ButtonComponent } from './button.component';\n\n@NgModule({\n    imports: [\n        ButtonComponent,\n    ],\n    exports: [ButtonComponent],\n})\nexport class ButtonModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}