{"version":3,"file":"seniorsistemas-angular-components-checkbox.mjs","sources":["../../projects/angular-components/checkbox/src/lib/checkbox/checkbox.component.ts","../../projects/angular-components/checkbox/src/lib/checkbox/checkbox.component.html","../../projects/angular-components/checkbox/src/seniorsistemas-angular-components-checkbox.ts"],"sourcesContent":["import { Component, computed, forwardRef, input, model, signal } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\n/**\r\n * @description Componente de caixa de seleção (checkbox) com suporte a três estados:\r\n * marcado, desmarcado e indeterminado. Implementa {@link ControlValueAccessor} para\r\n * integração com Reactive Forms e Template-driven Forms do Angular.\r\n *\r\n * @example\r\n * ```html\r\n * <s-checkbox\r\n *   formControlName=\"aceito\"\r\n *   label=\"Aceito os termos de uso\"\r\n *   [indeterminate]=\"parcialmenteSelecionado\" />\r\n * ```\r\n *\r\n * @category Inputs\r\n */\r\n@Component({\r\n    selector: 's-checkbox',\r\n    standalone: true,\r\n    imports: [],\r\n    providers: [\r\n        {\r\n            provide: NG_VALUE_ACCESSOR,\r\n            useExisting: forwardRef(() => CheckboxComponent),\r\n            multi: true,\r\n        },\r\n    ],\r\n    templateUrl: './checkbox.component.html',\r\n})\r\nexport class CheckboxComponent implements ControlValueAccessor {\r\n    /** @description Controla o estado desabilitado via two-way binding. @default false */\r\n    public disabled = model(false);\r\n    /** @description Valor marcado/desmarcado do checkbox via two-way binding. @default false */\r\n    public checked = model(false);\r\n    /** @description Quando `true`, o checkbox inicia no estado indeterminado (traço) até a primeira interação do usuário. @default false */\r\n    public indeterminate = input(false);\r\n    /** @description Texto do label exibido ao lado do checkbox. @default '' */\r\n    public label = input<string>('');\r\n    /** @description Rótulo acessível para leitores de tela. Opcional, por padrão usa o valor de `label`. */\r\n    public ariaLabel = input<string | undefined>(undefined);\r\n    /** @description ID do elemento que descreve o checkbox (para usar `<label for=\"...\">`). Opcional. */\r\n    public ariaLabelledBy = input<string | undefined>(undefined);\r\n\r\n    private _onChange: (value: boolean) => void = () => {};\r\n    private _onTouched: () => void = () => {};\r\n    private _hasUserInteracted = signal(false);\r\n\r\n    /**\r\n     * @description Computed que indica se o estado indeterminado deve ser exibido.\r\n     * Retorna `true` enquanto `indeterminate` for `true` e o usuário não tiver interagido.\r\n     */\r\n    public readonly isIndeterminate = computed(() => this.indeterminate() && !this._hasUserInteracted());\r\n\r\n    public toggle(): void {\r\n        if (this.disabled()) {\r\n            return;\r\n        }\r\n\r\n        if (this.indeterminate() && !this._hasUserInteracted()) {\r\n            this._hasUserInteracted.set(true);\r\n            this.checked.set(true);\r\n            this.emit(true);\r\n        } else {\r\n            const newValue = !this.checked();\r\n            this.checked.set(newValue);\r\n            this.emit(newValue);\r\n        }\r\n    }\r\n\r\n    private emit(value: boolean): void {\r\n        this._onChange(value);\r\n    }\r\n\r\n    public writeValue(value: any): void {\r\n        this.checked.set(!!value);\r\n    }\r\n\r\n    public registerOnChange(onChange: (value: boolean) => void): void {\r\n        this._onChange = onChange;\r\n    }\r\n\r\n    public registerOnTouched(onTouched: () => void): void {\r\n        this._onTouched = onTouched;\r\n    }\r\n\r\n    public setDisabledState(disabled: boolean): void {\r\n        this.disabled.set(disabled);\r\n    }\r\n\r\n    public onBlur(): void {\r\n        this._onTouched();\r\n    }\r\n}\r\n","<div\n    class=\"group flex cursor-pointer select-none gap-3 outline-none\"\n    [class.cursor-not-allowed]=\"disabled()\"\n    tabindex=\"0\"\n    role=\"checkbox\"\n    [attr.aria-checked]=\"isIndeterminate() ? 'mixed' : checked()\"\n    [attr.aria-disabled]=\"disabled()\"\n    [attr.aria-label]=\"ariaLabel() || label() || null\"\n    [attr.aria-labelledby]=\"ariaLabelledBy() || null\"\n    (click)=\"toggle()\"\n    (keydown.space)=\"toggle(); $event.preventDefault()\"\n    (blur)=\"onBlur()\"\n>\n    <div\n        class=\"rounded flex h-5 w-5 flex-shrink-0 items-center justify-center border border-grayscale-30\n               transition-all duration-200 hover:border-grayscale-50\n               group-focus-visible:ring-2 group-focus-visible:ring-primary group-focus-visible:ring-offset-1\"\n        [class.bg-primary]=\"checked() || isIndeterminate()\"\n        [class.hover:bg-tarawera-500]=\"checked() || isIndeterminate()\"\n        [class.bg-grayscale-0]=\"!checked() && !isIndeterminate()\"\n        [class.border-primary]=\"checked() || isIndeterminate()\"\n        [class.hover:border-tarawera-500]=\"checked() || isIndeterminate()\"\n        [class.opacity-50]=\"disabled()\"\n    >\n        @if (isIndeterminate()) {\n            <svg\n                class=\"h-3 w-3 text-grayscale-0\"\n                fill=\"none\"\n                stroke=\"white\"\n                stroke-width=\"4\"\n                viewBox=\"0 0 24 24\"\n                aria-hidden=\"true\"\n            >\n                <path d=\"M6 12h12\" />\n            </svg>\n        } @else {\n            @if (checked()) {\n                <svg\n                    class=\"text-grayscale-0 h-3 w-3\"\n                    fill=\"none\"\n                    stroke=\"white\"\n                    stroke-width=\"4\"\n                    stroke-linecap=\"round\"\n                    stroke-linejoin=\"round\"\n                    viewBox=\"0 0 24 24\"\n                    aria-hidden=\"true\"\n                >\n                    <path d=\"M4.5 12.75l5.5 5.5 9.5-9.5\" />\n                </svg>\n            }\n        }\n    </div>\n\n    @if (label()) {\n        <span\n            [class.opacity-50]=\"disabled()\"\n            class=\"text-grayscale-90 ml-2\"\n            aria-hidden=\"true\"\n        >\n            {{ label() }}\n        </span>\n    }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}