{"version":3,"file":"seniorsistemas-angular-components-rating-scale.mjs","sources":["../../projects/angular-components/rating-scale/src/lib/rating-scale/rating-scale.component.ts","../../projects/angular-components/rating-scale/src/lib/rating-scale/rating-scale.component.html","../../projects/angular-components/rating-scale/src/lib/rating-scale/rating-scale.module.ts","../../projects/angular-components/rating-scale/src/seniorsistemas-angular-components-rating-scale.ts"],"sourcesContent":["import { NgClass } from '@angular/common';\r\nimport { Component, Input, OnChanges, SimpleChanges, forwardRef } from '@angular/core';\r\n\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { RatingScaleNode } from './models/rating-scale-node';\r\n\r\n/**\r\n * @description Componente de escala de avaliação que permite ao usuário selecionar um nó de uma escala visual.\r\n * Implementa `ControlValueAccessor` para integração com Reactive Forms e Template-Driven Forms.\r\n * Ideal para pesquisas de satisfação (NPS, CSAT) e questionários de feedback.\r\n *\r\n * @example\r\n * ```html\r\n * <s-rating-scale\r\n *   [nodes]=\"ratingNodes\"\r\n *   startLabel=\"Péssimo\"\r\n *   endLabel=\"Ótimo\"\r\n *   [(ngModel)]=\"rating\"\r\n * />\r\n * ```\r\n *\r\n * @category Feedback\r\n */\r\n@Component({\r\n    selector: 's-rating-scale',\r\n    templateUrl: './rating-scale.component.html',\r\n    providers: [\r\n        {\r\n            provide: NG_VALUE_ACCESSOR,\r\n            useExisting: forwardRef(() => RatingScaleComponent),\r\n            multi: true,\r\n        },\r\n    ],\r\n    standalone: true,\r\n    imports: [NgClass],\r\n})\r\nexport class RatingScaleComponent implements ControlValueAccessor, OnChanges {\r\n    /**\r\n     * @description Lista de nós que compõem a escala de avaliação. Campo obrigatório.\r\n     * Cada `RatingScaleNode` define o valor, rótulo e cor do item na escala.\r\n     */\r\n    @Input({ required: true })\r\n    public nodes!: RatingScaleNode[];\r\n\r\n    /** @description Rótulo exibido no início (extremidade esquerda) da escala. */\r\n    @Input()\r\n    public startLabel?: string;\r\n\r\n    /** @description Rótulo exibido no final (extremidade direita) da escala. */\r\n    @Input()\r\n    public endLabel?: string;\r\n\r\n    /**\r\n     * @description Quando `true`, a escala fica desabilitada e o usuário não pode selecionar nenhum nó.\r\n     *\r\n     * @default false\r\n     */\r\n    @Input()\r\n    public disabled = false;\r\n\r\n    public value?: RatingScaleNode;\r\n    private _onChange?: (value: RatingScaleNode) => void;\r\n    private _onTouched?: (value: RatingScaleNode) => void;\r\n\r\n    public ngOnChanges(changes: SimpleChanges): void {\r\n        if (changes['nodes']) {\r\n            this.nodes?.forEach((node) => {\r\n                const hasSelectedIcon = !!node.selectedIcon;\r\n                const hasUnselectedIcon = !!node.unselectedIcon;\r\n                if (hasSelectedIcon !== hasUnselectedIcon) {\r\n                    console.warn(\r\n                        `s-rating-scale: o nó \"${node.id}\" informou apenas um de \"selectedIcon\"/\"unselectedIcon\" — os dois devem ser informados juntos. Nenhum ícone será exibido para esse nó até que ambos sejam informados.`,\r\n                    );\r\n                }\r\n            });\r\n        }\r\n    }\r\n\r\n    public getNodeIconClass(node: RatingScaleNode): string | undefined {\r\n        if (node.selectedIcon && node.unselectedIcon) {\r\n            return this.value?.id === node.id ? node.selectedIcon : node.unselectedIcon;\r\n        }\r\n        if (node.selectedIcon || node.unselectedIcon) {\r\n            return undefined;\r\n        }\r\n        return node.icon ? `fas ${node.icon}` : undefined;\r\n    }\r\n\r\n    public writeValue(value: RatingScaleNode): void {\r\n        if (!this.disabled) {\r\n            this.value = value;\r\n        }\r\n    }\r\n    public registerOnChange(onChange: (value: RatingScaleNode) => void): void {\r\n        this._onChange = onChange;\r\n    }\r\n    public registerOnTouched(onTouched: (value: RatingScaleNode) => void): void {\r\n        this._onTouched = onTouched;\r\n    }\r\n\r\n    public onSelect(rating: RatingScaleNode) {\r\n        this.value = rating;\r\n        if (this._onChange) {\r\n            this._onChange(this.value);\r\n        }\r\n    }\r\n}\r\n","<div\n    class=\"flex flex-col\"\n    [class.opacity-50]=\"disabled\">\n    <div class=\"flex\">\n        @for (node of nodes; track node.id) {\n            <button\n                class=\"flex flex-grow items-center justify-center rounded-xbig border border-secondary bg-grayscale-0 p-2 mx-0.5 first:ml-0 last:mr-0\"\n                [class.bg-hippie-blue-100]=\"value?.id === node.id && !disabled\"\n                [class.border-criticality-blue]=\"value?.id === node.id && !disabled\"\n                [class.text-criticality-blue]=\"value?.id === node.id && !disabled\"\n                [class.cursor-pointer]=\"!disabled\"\n                [class.hover:bg-grayscale-20]=\"!disabled\"\n                [class.focus:border-2]=\"!disabled\"\n                [class.focus:outline-none]=\"!disabled\"\n                tabindex=\"0\"\n                (click)=\"onSelect(node)\">\n                @let nodeIconClass = getNodeIconClass(node);\n                @if (nodeIconClass) {\n                    <span\n                        class=\"m-1.5 text-base text-grayscale-60\"\n                        [ngClass]=\"nodeIconClass\">\n                    </span>\n                }\n                @if (node.title) {\n                    <span class=\"m-1.5 text-sm font-normal leading-[150%] text-grayscale-90\">{{ node.title }}</span>\n                }\n            </button>\n        }\n    </div>\n    <div class=\"flex justify-between py-3\">\n        <span class=\"font-open-sans text-sm font-normal leading-[150%] text-[#080808]\">{{ startLabel }}</span>\n        <span class=\"font-open-sans text-sm font-normal leading-[150%] text-[#080808]\">{{ endLabel }}</span>\n    </div>\n</div>","import { NgModule } from '@angular/core';\r\n\r\nimport { RatingScaleComponent } from './rating-scale.component';\r\n\r\n@NgModule({\r\n    imports: [RatingScaleComponent],\r\n    exports: [RatingScaleComponent],\r\n})\r\nexport class RatingScaleModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}