{"version":3,"file":"seniorsistemas-angular-components-stats-card.mjs","sources":["../../projects/angular-components/stats-card/src/lib/stats-card/stats-card.component.ts","../../projects/angular-components/stats-card/src/lib/stats-card/stats-card.component.html","../../projects/angular-components/stats-card/src/lib/stats-card/stats-card.module.ts","../../projects/angular-components/stats-card/src/seniorsistemas-angular-components-stats-card.ts"],"sourcesContent":["import { Component, Input, ViewEncapsulation, Output, EventEmitter } from '@angular/core';\r\n\r\nimport BigNumber from 'bignumber.js';\r\nimport { NgClass, NgStyle, NgTemplateOutlet } from '@angular/common';\r\nimport { InfoSignDirective } from '@seniorsistemas/angular-components/info-sign';\r\nimport { TooltipDirective } from '@seniorsistemas/angular-components/tooltip';\r\n\r\n/**\r\n * @description Card de estatística que exibe um valor numérico com ícone,\r\n * rótulo e animação de contagem. Suporta diferentes estilos visuais\r\n * (borda, versão leve) e pode emitir evento ao ser clicado.\r\n *\r\n * @example\r\n * ```html\r\n * <s-stats-card\r\n *   label=\"Vendas\"\r\n *   [value]=\"'1.234'\"\r\n *   iconClass=\"fas fa-shopping-cart\"\r\n *   color=\"#3399ff\" />\r\n * ```\r\n *\r\n * @category Summary\r\n */\r\n@Component({\r\n    selector: 's-stats-card',\r\n    templateUrl: './stats-card.component.html',\r\n    styleUrls: ['./stats-card.component.scss'],\r\n    encapsulation: ViewEncapsulation.None,\r\n    standalone: true,\r\n    imports: [NgClass, NgStyle, InfoSignDirective, NgTemplateOutlet, TooltipDirective],\r\n})\r\nexport class StatsCardComponent {\r\n    public static nextId = 0;\r\n\r\n    /** @description Identificador único do card no DOM. Gerado automaticamente se não informado. */\r\n    @Input()\r\n    public id = `s-stats-card-${StatsCardComponent.nextId++}`;\r\n\r\n    /** @description Rótulo descritivo da estatística exibida. Campo obrigatório. */\r\n    @Input({ required: true })\r\n    public label!: string;\r\n\r\n    /** @description Texto do tooltip exibido ao passar o mouse sobre o ícone de informação ao lado do label do stats card. */\r\n    @Input()\r\n    public infoSignTooltip?: string;\r\n\r\n    /** @description Exibe borda mesmo quando o card não está em destaque. @default false */\r\n    @Input()\r\n    public alwaysWithBorder = false;\r\n\r\n    /** @description Ativa a versão visual leve (sem sombra e com fundo claro). @default false */\r\n    @Input()\r\n    public lightVersion = false;\r\n\r\n    /** @description Ativa o modo de cores claras para o card. @default true */\r\n    @Input()\r\n    public lightMode = true;\r\n\r\n    /** @description Classe do ícone exibido no card. @default 'fa fa-bar-chart' */\r\n    @Input()\r\n    public iconClass = 'fa fa-bar-chart';\r\n\r\n    /** @description Cor de destaque do card em formato CSS. @default '#339966' */\r\n    @Input()\r\n    public color = '#339966';\r\n\r\n    /** @description Habilita a animação de contagem ao atualizar o valor. @default true */\r\n    @Input()\r\n    public animateNumbers = true;\r\n\r\n    /** @description Habilita o cursor de ponteiro e o evento de clique. @default false */\r\n    @Input()\r\n    public clickable = false;\r\n\r\n    /** @description Texto do tooltip exibido ao passar o mouse sobre o card. @default '' */\r\n    @Input()\r\n    public tooltip = '';\r\n\r\n    /** @description Emitido quando o usuário clica no card (requer `clickable = true`). */\r\n    @Output()\r\n    public clicked = new EventEmitter<MouseEvent>();\r\n\r\n    public displayValue?: string;\r\n\r\n    private _ANIMATION_DURATION_MS = 200;\r\n    private _STEP_DURATION_MS = 20;\r\n    private _previousValue = '0';\r\n    private _intervalId: any;\r\n    private _value = '0';\r\n\r\n    public get value() {\r\n        return this._value;\r\n    }\r\n\r\n    /** @description Valor numérico exibido no card. Quando `animateNumbers` está ativo, a contagem é animada. */\r\n    @Input()\r\n    public set value(value: string) {\r\n        this._previousValue = this._value;\r\n        this._value = String(value);\r\n        if (this.animateNumbers) this._updateDisplayValue();\r\n        else this.displayValue = this.value;\r\n    }\r\n\r\n    public replaceNumericPositions(value: string, newValue?: BigNumber) {\r\n        const rawValue = value.replace(/[^\\d]/g, '');\r\n        const newValueString = newValue ? newValue.toString() : '';\r\n        const formattedNewValue = newValueString.toString().replace(/\\D/g, '').padStart(rawValue.length, '0');\r\n        let newValueIndex = 0;\r\n\r\n        return value\r\n            .split('')\r\n            .map((char) => {\r\n                const number = Number(char);\r\n                if (number || char === '0') return formattedNewValue[newValueIndex++];\r\n                return char;\r\n            })\r\n            .join('');\r\n    }\r\n\r\n    private _updateDisplayValue() {\r\n        const animationDuration = new BigNumber(this._ANIMATION_DURATION_MS);\r\n        const stepDuration = new BigNumber(this._STEP_DURATION_MS);\r\n        const animationCount = animationDuration.dividedBy(stepDuration);\r\n\r\n        const previousRawValue = new BigNumber(this._previousValue.replace(/\\D/g, ''));\r\n        const rawValue = new BigNumber(this.value.replace(/\\D/g, ''));\r\n\r\n        const incrementValue = rawValue.minus(previousRawValue).absoluteValue().dividedBy(animationCount);\r\n        const incremental = previousRawValue.isLessThan(rawValue);\r\n\r\n        clearInterval(this._intervalId);\r\n\r\n        this.displayValue = this.replaceNumericPositions(this.value);\r\n\r\n        let counter = previousRawValue;\r\n\r\n        this._intervalId = setInterval(() => {\r\n            if (incremental && counter.isLessThan(rawValue)) {\r\n                if (this.displayValue) {\r\n                    this.displayValue = this.replaceNumericPositions(this.displayValue, counter);\r\n                }\r\n                counter = counter.plus(incrementValue);\r\n            } else if (!incremental && counter.isGreaterThan(rawValue)) {\r\n                if (this.displayValue) {\r\n                    this.displayValue = this.replaceNumericPositions(this.displayValue, counter);\r\n                }\r\n                counter = counter.minus(incrementValue);\r\n            } else {\r\n                this.displayValue = this.value;\r\n\r\n                clearInterval(this._intervalId);\r\n            }\r\n        }, this._STEP_DURATION_MS);\r\n    }\r\n}\r\n","<div\n    [id]=\"id\"\n    class=\"s-stats-card\"\n    [ngClass]=\"{\n        's-stats-card--always-border': alwaysWithBorder,\n        's-stats-card--light': lightMode,\n        's-stats-card--color': !lightMode,\n        's-stats-card--light-version': lightVersion,\n        's-stats-card--clickable': clickable,\n    }\"\n    (click)=\"clickable && clicked.next($event)\"\n>\n    <div\n        [id]=\"id + '-background'\"\n        class=\"s-stats-card-background\"\n        [ngStyle]=\"{ 'background-color': (!lightMode && color) || '' }\"\n    ></div>\n    <div\n        [id]=\"id + '-overlay'\"\n        class=\"s-stats-card-overlay\"\n    ></div>\n\n    <div\n        [id]=\"id + '-info-container'\"\n        class=\"s-stats-card-info-container\"\n    >\n        <div class=\"s-stats-card-info-inner-container\">\n            <div\n                [id]=\"id + '-icon-container'\"\n                class=\"s-stats-card-icon-container\"\n                [ngStyle]=\"{ 'background-color': (lightMode && color) || '' }\"\n            >\n                <span\n                    [id]=\"id + '-icon'\"\n                    [class]=\"iconClass\"\n                    [ngClass]=\"{ 's-stats-card-icon': true }\"\n                    [ngStyle]=\"{ color: (!lightMode && color) || '' }\"\n                    aria-hidden=\"true\"\n                ></span>\n            </div>\n\n            <div\n                [id]=\"id + '-text-container'\"\n                class=\"s-stats-card-text-container\"\n            >\n                @if (infoSignTooltip) {\n                    <div *sInfoSign=\"infoSignTooltip\">\n                        <ng-container *ngTemplateOutlet=\"labelTemplate\" />\n                    </div>\n                } @else {\n                    <ng-container *ngTemplateOutlet=\"labelTemplate\" />\n                }\n                <span\n                    [id]=\"id + '-value'\"\n                    class=\"s-stats-card-value\"\n                    [sTooltip]=\"displayValue\"\n                >\n                    {{ displayValue }}\n                </span>\n            </div>\n        </div>\n        <div class=\"s-stats-card-content-inner-container\">\n            <div\n                #content\n                class=\"s-stats-card-content-container\"\n            >\n                <ng-content></ng-content>\n            </div>\n            @if (content.children.length) {\n                <div class=\"s-stats-card-content-separator\"></div>\n            }\n        </div>\n        @if (tooltip) {\n            <span\n                class=\"s-status-card-tooltip\"\n                [sTooltip]=\"tooltip\"\n            >\n                <i class=\"fa fa-info-circle s-status-card-tooltip-icon\"></i>\n            </span>\n        }\n    </div>\n</div>\n\n<ng-template #labelTemplate>\n    <h4\n        [id]=\"id + '-label'\"\n        class=\"s-stats-card-label\"\n        [sTooltip]=\"label\"\n    >\n        {{ label }}\n    </h4>\n</ng-template>\n\n","import { NgModule } from '@angular/core';\r\n\r\nimport { StatsCardComponent } from './stats-card.component';\r\n\r\n@NgModule({\r\n    imports: [StatsCardComponent],\r\n    exports: [StatsCardComponent],\r\n})\r\nexport class StatsCardModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}