{"version":3,"file":"fiscal-io-ds-components-user-menu.mjs","sources":["../../../../projects/fiscal-io/ds-components/src/lib/components/ds-user-menu/ds-user-menu.component.ts","../../../../projects/fiscal-io/ds-components/src/lib/components/ds-user-menu/ds-user-menu.component.html","../../../../projects/fiscal-io/ds-components/src/fiscal-io-ds-components-user-menu.ts"],"sourcesContent":["import {\r\n  Component,\r\n  ElementRef,\r\n  HostListener,\r\n  Inject,\r\n  input,\r\n  output,\r\n  signal,\r\n  ViewChild,\r\n} from '@angular/core';\r\nimport { CommonModule, DOCUMENT } from '@angular/common';\r\n\r\nexport interface UserMenuItem {\r\n  /** Texto exibido no item */\r\n  label: string;\r\n  /** Classe de ícone (ex: 'bi bi-person', 'e-icons e-user') */\r\n  iconCss?: string;\r\n  /** Separador visual antes deste item */\r\n  separator?: boolean;\r\n  /** Identificador único para o evento de clique */\r\n  id: string;\r\n  /** Desabilita o item */\r\n  disabled?: boolean;\r\n}\r\n\r\n@Component({\r\n  selector: 'ds-user-menu',\r\n  standalone: true,\r\n  imports: [CommonModule],\r\n  templateUrl: './ds-user-menu.component.html',\r\n  styleUrl: './ds-user-menu.component.scss',\r\n})\r\nexport class DsUserMenuComponent {\r\n  /** URL da foto do usuário (se fornecida, exibe imagem; senão exibe as iniciais) */\r\n  avatarSrc = input<string>('');\r\n\r\n  /** Iniciais do usuário exibidas quando não há foto */\r\n  initials = input<string>('US');\r\n\r\n  /** Nome completo exibido no cabeçalho do menu */\r\n  userName = input<string>('');\r\n\r\n  /** E-mail exibido no cabeçalho do menu */\r\n  userEmail = input<string>('');\r\n\r\n  /** Itens de menu */\r\n  menuItems = input<UserMenuItem[]>([]);\r\n\r\n  /** Emite o `id` do item clicado */\r\n  menuItemClick = output<string>();\r\n\r\n  protected isOpen = signal(false);\r\n  protected dropdownTop = signal('0px');\r\n  protected dropdownRight = signal('0px');\r\n  protected bsTheme = signal<string | null>(null);\r\n\r\n  @ViewChild('trigger') triggerRef!: ElementRef<HTMLButtonElement>;\r\n\r\n  constructor(\r\n    private elRef: ElementRef,\r\n    @Inject(DOCUMENT) private doc: Document,\r\n  ) {}\r\n\r\n  toggle() {\r\n    if (!this.isOpen()) {\r\n      const rect = this.triggerRef.nativeElement.getBoundingClientRect();\r\n      this.dropdownTop.set(`${rect.bottom + 8}px`);\r\n      this.dropdownRight.set(`${window.innerWidth - rect.right}px`);\r\n      // Espelha o data-bs-theme atual do documento no dropdown\r\n      this.bsTheme.set(this.doc.documentElement.getAttribute('data-bs-theme'));\r\n    }\r\n    this.isOpen.update((v) => !v);\r\n  }\r\n\r\n  close() {\r\n    this.isOpen.set(false);\r\n  }\r\n\r\n  onItemClick(item: UserMenuItem) {\r\n    if (item.disabled) return;\r\n    this.menuItemClick.emit(item.id);\r\n    this.close();\r\n  }\r\n\r\n  @HostListener('document:click', ['$event'])\r\n  onDocumentClick(event: MouseEvent) {\r\n    if (!this.elRef.nativeElement.contains(event.target)) {\r\n      this.close();\r\n    }\r\n  }\r\n\r\n  @HostListener('document:keydown.escape')\r\n  onEscape() {\r\n    this.close();\r\n  }\r\n}\r\n","<div class=\"ds-user-menu\" [class.show]=\"isOpen()\">\n\n  <!-- Trigger: Avatar clicável -->\n  <button\n    #trigger\n    class=\"btn btn-link p-0 d-flex align-items-center gap-1 text-decoration-none border-0\"\n    id=\"ds-user-menu-trigger\"\n    type=\"button\"\n    [attr.aria-expanded]=\"isOpen()\"\n    aria-haspopup=\"true\"\n    (click)=\"toggle()\"\n  >\n    <span class=\"e-avatar e-avatar-small e-avatar-circle ds-user-menu__avatar\">\n      @if (avatarSrc()) {\n        <img [src]=\"avatarSrc()\" [alt]=\"userName() || 'Avatar'\" />\n      } @else {\n        {{ initials() }}\n      }\n    </span>\n  </button>\n\n  <!-- Dropdown usando classes nativas do Bootstrap -->\n  <ul\n    class=\"dropdown-menu dropdown-menu-end shadow-sm ds-user-menu__dropdown\"\n    [class.show]=\"isOpen()\"\n    role=\"menu\"\n    [style.top]=\"dropdownTop()\"\n    [style.right]=\"dropdownRight()\"\n    [style.position]=\"'fixed'\"\n    [style.min-width]=\"'230px'\"\n    [style.max-width]=\"'320px'\"\n    [attr.data-bs-theme]=\"bsTheme()\"\n  >\n\n    <!-- Header: Avatar + Nome + Email -->\n    @if (userName() || userEmail()) {\n      <li class=\"px-3 py-2\">\n        <div class=\"d-flex align-items-center gap-3\">\n          <span class=\"e-avatar e-avatar-circle ds-user-menu__header-avatar flex-shrink-0\">\n            @if (avatarSrc()) {\n              <img [src]=\"avatarSrc()\" [alt]=\"userName()\" />\n            } @else {\n              {{ initials() }}\n            }\n          </span>\n          <div class=\"d-flex flex-column overflow-hidden\" style=\"min-width: 0;\">\n            @if (userName()) {\n              <span class=\"fw-semibold text-body text-truncate\" style=\"font-size: 0.875rem;\">{{ userName() }}</span>\n            }\n            @if (userEmail()) {\n              <span class=\"text-body-tertiary text-truncate\" style=\"font-size: 0.75rem\" [title]=\"userEmail()\">{{ userEmail() }}</span>\n            }\n          </div>\n        </div>\n      </li>\n      <li><hr class=\"dropdown-divider\" /></li>\n    }\n\n    <!-- Itens de menu -->\n    @for (item of menuItems(); track item.id) {\n      @if (item.separator) {\n        <li><hr class=\"dropdown-divider\" /></li>\n      }\n      <li>\n        <button\n          class=\"dropdown-item d-flex align-items-center gap-2\"\n          [class.disabled]=\"item.disabled\"\n          [attr.data-id]=\"item.id\"\n          role=\"menuitem\"\n          type=\"button\"\n          [disabled]=\"item.disabled\"\n          (click)=\"onItemClick(item)\"\n        >\n          @if (item.iconCss) {\n            <span [class]=\"item.iconCss\" style=\"width: 18px; text-align: center; flex-shrink: 0;\"></span>\n          }\n          <span>{{ item.label }}</span>\n        </button>\n      </li>\n    }\n\n  </ul>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './user-menu';\n"],"names":[],"mappings":"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"}