{"version":3,"file":"seniorsistemas-angular-components-grid-menu.mjs","sources":["../../projects/angular-components/grid-menu/src/lib/grid-menu/components/grid-menu-item/grid-menu-item.component.ts","../../projects/angular-components/grid-menu/src/lib/grid-menu/components/grid-menu-item/grid-menu-item.component.html","../../projects/angular-components/grid-menu/src/lib/grid-menu/grid-menu.component.ts","../../projects/angular-components/grid-menu/src/lib/grid-menu/grid-menu.component.html","../../projects/angular-components/grid-menu/src/lib/grid-menu/grid-menu.module.ts","../../projects/angular-components/grid-menu/src/seniorsistemas-angular-components-grid-menu.ts"],"sourcesContent":["import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { NgClass } from '@angular/common';\r\n\r\nimport { GridMenuItem } from '../../types/grid-menu-item';\r\nimport { InteractiveContentDirective } from '@seniorsistemas/angular-components/interactive-content';\r\n\r\n@Component({\r\n    selector: 's-grid-menu-item',\r\n    templateUrl: './grid-menu-item.component.html',\r\n    standalone: true,\r\n    imports: [InteractiveContentDirective, NgClass],\r\n})\r\nexport class GridMenuItemComponent {\r\n    @Input({ required: true })\r\n    public item!: GridMenuItem;\r\n\r\n    @Input()\r\n    public iconIsFromFontAwesome = false;\r\n\r\n    @Output() clickedGridMenuItem = new EventEmitter<GridMenuItem>();\r\n\r\n    public fontAwesomePrefix: 'fal' | 'fas' = 'fal';\r\n\r\n    public onClick(): void {\r\n        if (this.disabled) {\r\n            return;\r\n        }\r\n        this.item.action?.();\r\n        this.clickedGridMenuItem.emit(this.item);\r\n    }\r\n\r\n    public onMouseEnter() {\r\n        if (this.disabled) {\r\n            return;\r\n        }\r\n        this.fontAwesomePrefix = 'fas';\r\n    }\r\n\r\n    public onMouseLeave() {\r\n        if (this.disabled) {\r\n            return;\r\n        }\r\n        this.fontAwesomePrefix = 'fal';\r\n    }\r\n\r\n    public get iconFontAwesomeClassName() {\r\n        const prefix = this.item.active ? 'fas' : this.fontAwesomePrefix;\r\n        return `${prefix} ${this.item.icon}`;\r\n    }\r\n\r\n    public get initialLetter(): string {\r\n        let initialLetter = '';\r\n        if (this.item.label) {\r\n            const words = this.item.label.split(' ', 2);\r\n            initialLetter = words[0].charAt(0).toUpperCase();\r\n            if (words.length > 1) {\r\n                initialLetter += words[1].charAt(0).toUpperCase();\r\n            }\r\n        }\r\n        return initialLetter;\r\n    }\r\n\r\n    public get disabled(): boolean {\r\n        return typeof this.item?.disabled === 'function' ? !!this.item.disabled() : !!this.item?.disabled;\r\n    }\r\n}\r\n","@if (item) {\n    <button\n        class=\"items-center bg-transparent border-0 inline-flex flex-col gap-3 justify-center p-[5px] transition-transform duration-300 ease-in-out w-[200px]\"\n        [ngClass]=\"{\n            'cursor-pointer group hover:scale-105': !disabled,\n            'cursor-default opacity-50': disabled,\n            'scale-105 rounded-xxbig bg-grayscale-20': item.active,\n            'hover:bg-grayscale-20 hover:rounded-xxbig': iconIsFromFontAwesome && !disabled\n        }\"\n        (sInteractiveContent)=\"onClick()\"\n        [disabled]=\"disabled\"\n        [tabindex]=\"disabled ? -1 : 0\"\n        (mouseenter)=\"onMouseEnter()\"\n        (mouseleave)=\"onMouseLeave()\"\n    >\n        <div\n            class=\"self-center rounded-xxbig flex h-16 justify-center overflow-hidden p-2 w-16 items-center text-[3em]\"\n            [class.bg-grayscale-20]=\"!iconIsFromFontAwesome\"\n        >\n            @if (item.icon) {\n                @if (iconIsFromFontAwesome) {\n                    <i [ngClass]=\"iconFontAwesomeClassName + ' text-[#009494]'\"> </i>\n                } @else {\n                    <span\n                        class=\"bg-center bg-no-repeat bg-cover inline-block h-full w-full\"\n                        style=\"background-image: url('{{ item.icon }}');\"\n                    >\n                    </span>\n                }\n            } @else if (!item.icon) {\n                <span class=\"items-center flex font-open-sans text-xl font-bold group-hover:font-bold\">{{ initialLetter }}</span>\n            }\n        </div>\n        <span\n            class=\"font-open-sans text-sm line-clamp-2 overflow-hidden text-ellipsis w-full group-hover:font-bold\"\n            [style.paddingBottom]=\"iconIsFromFontAwesome ? '1em' : null\"\n        >{{ item.label }}</span>\n    </button>\n}\n","import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core';\r\n\r\nimport { GridMenuItem } from './types/grid-menu-item';\r\nimport { isNullOrUndefined } from '@seniorsistemas/angular-components/utils';\r\nimport { GridMenuItemComponent } from './components/grid-menu-item/grid-menu-item.component';\r\n\r\n/**\r\n * @description Componente de menu em grade que exibe uma coleção de itens como cards clicáveis.\r\n * Suporta seleção de item ativo e pode utilizar ícones do Font Awesome ou ícones padrão.\r\n *\r\n * @example\r\n * ```html\r\n * <s-grid-menu\r\n *   [items]=\"menuItems\"\r\n *   [selectable]=\"true\"\r\n *   [(selected)]=\"selectedItem\"\r\n * />\r\n * ```\r\n *\r\n * @category Navegação\r\n */\r\n@Component({\r\n    selector: 's-grid-menu',\r\n    templateUrl: './grid-menu.component.html',\r\n    standalone: true,\r\n    imports: [GridMenuItemComponent],\r\n})\r\nexport class GridMenuComponent implements OnChanges {\r\n    private previousGridMenuItemClicked: GridMenuItem | undefined;\r\n\r\n    /**\r\n     * @description Lista de itens exibidos no grid. Aceita um único item ou um array de `GridMenuItem`.\r\n     * Valores nulos ou indefinidos resultam em uma lista vazia.\r\n     */\r\n    @Input()\r\n    public set items(items: GridMenuItem[] | GridMenuItem) {\r\n        if (isNullOrUndefined(items)) {\r\n            this.itemsArray = [];\r\n        } else {\r\n            this.itemsArray = Array.isArray(items) ? (items as GridMenuItem[]) : [items];\r\n        }\r\n    }\r\n\r\n    /**\r\n     * @description Quando `true`, utiliza classes de ícones do Font Awesome nos itens do grid.\r\n     * Quando `false`, utiliza o sistema de ícones padrão do projeto.\r\n     *\r\n     * @default false\r\n     */\r\n    @Input() useFontAwesomeIcons = false;\r\n\r\n    public itemsArray: GridMenuItem[] = [];\r\n\r\n    /**\r\n     * @description Habilita o modo de seleção do grid. Quando `true`, permite que o usuário\r\n     * clique em um item para selecioná-lo, marcando-o como ativo.\r\n     *\r\n     * @default false\r\n     */\r\n    @Input() selectable = false;\r\n\r\n    /**\r\n     * @description Item atualmente selecionado no grid. Usado em conjunto com `selectable = true`\r\n     * e suporta two-way binding via `[(selected)]`.\r\n     */\r\n    @Input() selected!: GridMenuItem;\r\n\r\n    /**\r\n     * @description Emitido quando o usuário seleciona um novo item no grid.\r\n     * Retorna o `GridMenuItem` selecionado. Usado para two-way binding com `[(selected)]`.\r\n     */\r\n    @Output() selectedChange = new EventEmitter<GridMenuItem>();\r\n\r\n    ngOnChanges(changes: SimpleChanges): void {\r\n        if (changes['selected'] && changes['selected'].isFirstChange()) {\r\n            if (this.selectable) {\r\n                this.previousGridMenuItemClicked = this.selected;\r\n                this.selected.active = true;\r\n            }\r\n        }\r\n    }\r\n\r\n    onClickGridMenuItem(gridMenuItem: GridMenuItem) {\r\n        if (!this.selectable) {\r\n            return;\r\n        }\r\n        if (this.previousGridMenuItemClicked) {\r\n            this.previousGridMenuItemClicked.active = false;\r\n        }\r\n        gridMenuItem.active = !gridMenuItem.active;\r\n        this.previousGridMenuItemClicked = gridMenuItem;\r\n        this.selectedChange.next(gridMenuItem);\r\n    }\r\n}\r\n","<section class=\"grid gap-5 [grid-template-columns:repeat(auto-fill,200px)] justify-evenly\">\n    @for (item of itemsArray; track $index) {\n        <s-grid-menu-item\n            [item]=\"item\"\n            [iconIsFromFontAwesome]=\"useFontAwesomeIcons\"\n            (clickedGridMenuItem)=\"onClickGridMenuItem($event)\"\n        ></s-grid-menu-item>\n    }\n</section>\n","import { NgModule } from '@angular/core';\r\n\r\nimport { GridMenuItemComponent } from './components/grid-menu-item/grid-menu-item.component';\r\nimport { GridMenuComponent } from './grid-menu.component';\r\n\r\n@NgModule({\r\n    imports: [GridMenuItemComponent, GridMenuComponent],\r\n    exports: [GridMenuItemComponent, GridMenuComponent],\r\n})\r\nexport class GridMenuModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}