{"version":3,"file":"mayvio-ui-angular-src-commandpalette.mjs","sources":["../../src/commandpalette/commandpalette.component.ts","../../src/commandpalette/mayvio-ui-angular-src-commandpalette.ts"],"sourcesContent":["import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  HostListener,\n  OnInit,\n  OnChanges,\n  SimpleChanges,\n  inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { CommandPaletteItemConfig } from 'mayvio-ui/commandpalette';\nimport 'mayvio-ui/commandpalette/css';\n\n@Component({\n  selector: 'mv-commandpalette',\n  standalone: true,\n  imports: [CommonModule, FormsModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div\n      *ngIf=\"isOpen\"\n      class=\"mv-commandpalette-overlay mv-commandpalette-overlay--open\"\n      (click)=\"closePalette()\"\n    >\n      <div\n        class=\"mv-commandpalette\"\n        [class]=\"className\"\n        role=\"dialog\"\n        aria-modal=\"true\"\n        aria-label=\"Command Palette\"\n        (click)=\"$event.stopPropagation()\"\n      >\n        <div class=\"mv-commandpalette-search-wrapper\">\n          <svg\n            class=\"mv-commandpalette-icon\"\n            width=\"20\"\n            height=\"20\"\n            viewBox=\"0 0 24 24\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            stroke-width=\"2\"\n            stroke-linecap=\"round\"\n            stroke-linejoin=\"round\"\n          >\n            <circle cx=\"11\" cy=\"11\" r=\"8\"></circle>\n            <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line>\n          </svg>\n          <input\n            type=\"text\"\n            class=\"mv-commandpalette-input\"\n            [placeholder]=\"placeholder\"\n            [ngModel]=\"search\"\n            (ngModelChange)=\"onSearchChange($event)\"\n            (keydown)=\"onKeyDown($event)\"\n            #searchInput\n          />\n          <button\n            *ngIf=\"search\"\n            class=\"mv-commandpalette-icon\"\n            style=\"background: none; border: none; cursor: pointer\"\n            (click)=\"onSearchChange('')\"\n            aria-label=\"Clear search\"\n          >\n            <svg\n              width=\"16\"\n              height=\"16\"\n              viewBox=\"0 0 24 24\"\n              fill=\"none\"\n              stroke=\"currentColor\"\n              stroke-width=\"2\"\n              stroke-linecap=\"round\"\n              stroke-linejoin=\"round\"\n            >\n              <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n              <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n            </svg>\n          </button>\n        </div>\n\n        <div class=\"mv-commandpalette-list\" role=\"listbox\">\n          <div *ngIf=\"flattenedList.length === 0\" class=\"mv-commandpalette-empty\">\n            {{ emptyText }}\n          </div>\n\n          <ng-container *ngFor=\"let group of groups\">\n            <div *ngIf=\"groupedCommands[group].length > 0\">\n              <div class=\"mv-commandpalette-group\" *ngIf=\"group\">{{ group }}</div>\n\n              <div\n                *ngFor=\"let cmd of groupedCommands[group]\"\n                class=\"mv-commandpalette-item\"\n                role=\"option\"\n                [attr.aria-selected]=\"isSelected(cmd)\"\n                (click)=\"selectCommand(cmd)\"\n                (mouseenter)=\"onMouseEnter(cmd)\"\n              >\n                <div class=\"mv-commandpalette-item-icon\">\n                  <svg\n                    width=\"16\"\n                    height=\"16\"\n                    viewBox=\"0 0 24 24\"\n                    fill=\"none\"\n                    stroke=\"currentColor\"\n                    stroke-width=\"2\"\n                    stroke-linecap=\"round\"\n                    stroke-linejoin=\"round\"\n                  >\n                    <polyline points=\"9 18 15 12 9 6\"></polyline>\n                  </svg>\n                </div>\n                <div style=\"flex-grow: 1\">{{ cmd.label }}</div>\n                <div *ngIf=\"cmd.shortcut\" style=\"display: flex; gap: 4px;\">\n                  <kbd\n                    *ngFor=\"let key of cmd.shortcut\"\n                    style=\"font-size: 0.75rem; padding: 2px 4px; background: var(--mv-color-bg-subtle); border-radius: var(--mv-radius-sm);\"\n                  >\n                    {{ key }}\n                  </kbd>\n                </div>\n              </div>\n            </div>\n          </ng-container>\n        </div>\n      </div>\n    </div>\n  `,\n})\nexport class CommandPaletteComponent implements OnInit, OnChanges {\n  @Input() isOpen = false;\n  @Input() commands: CommandPaletteItemConfig[] = [];\n  @Input() placeholder = 'Search commands...';\n  @Input() emptyText = 'No results found.';\n  @Input() className = '';\n\n  @Output() close = new EventEmitter<void>();\n  @Output() commandSelect = new EventEmitter<CommandPaletteItemConfig>();\n\n  search = '';\n  selectedIndex = 0;\n\n  filteredCommands: CommandPaletteItemConfig[] = [];\n  groupedCommands: Record<string, CommandPaletteItemConfig[]> = {};\n  groups: string[] = [];\n  flattenedList: CommandPaletteItemConfig[] = [];\n\n  private cdr = inject(ChangeDetectorRef);\n\n  ngOnInit() {\n    this.updateLists();\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes['commands'] || changes['isOpen']) {\n      if (changes['isOpen'] && this.isOpen) {\n        this.search = '';\n        this.selectedIndex = 0;\n        document.body.style.overflow = 'hidden';\n        setTimeout(() => {\n          const input = document.querySelector('.mv-commandpalette-input') as HTMLInputElement;\n          if (input) input.focus();\n        });\n      } else if (changes['isOpen'] && !this.isOpen) {\n        document.body.style.overflow = '';\n      }\n      this.updateLists();\n    }\n  }\n\n  @HostListener('window:keydown', ['$event'])\n  onGlobalKeyDown(e: KeyboardEvent) {\n    if (this.isOpen && e.key === 'Escape') {\n      this.closePalette();\n    }\n  }\n\n  closePalette() {\n    this.close.emit();\n  }\n\n  onSearchChange(val: string) {\n    this.search = val;\n    this.selectedIndex = 0;\n    this.updateLists();\n  }\n\n  updateLists() {\n    if (!this.search) {\n      this.filteredCommands = this.commands;\n    } else {\n      const q = this.search.toLowerCase();\n      this.filteredCommands = this.commands.filter((cmd) => cmd.label.toLowerCase().includes(q));\n    }\n\n    this.groupedCommands = { '': [] };\n    this.filteredCommands.forEach((cmd) => {\n      const g = cmd.group || '';\n      if (!this.groupedCommands[g]) this.groupedCommands[g] = [];\n      this.groupedCommands[g].push(cmd);\n    });\n\n    this.groups = Object.keys(this.groupedCommands).sort();\n\n    this.flattenedList = [];\n    this.groups.forEach((g) => {\n      this.flattenedList.push(...this.groupedCommands[g]);\n    });\n\n    this.cdr.markForCheck();\n  }\n\n  onKeyDown(e: KeyboardEvent) {\n    if (this.flattenedList.length === 0) return;\n\n    if (e.key === 'ArrowDown') {\n      e.preventDefault();\n      this.selectedIndex =\n        this.selectedIndex < this.flattenedList.length - 1 ? this.selectedIndex + 1 : 0;\n      this.cdr.markForCheck();\n    } else if (e.key === 'ArrowUp') {\n      e.preventDefault();\n      this.selectedIndex =\n        this.selectedIndex > 0 ? this.selectedIndex - 1 : this.flattenedList.length - 1;\n      this.cdr.markForCheck();\n    } else if (e.key === 'Enter') {\n      e.preventDefault();\n      this.selectCommand(this.flattenedList[this.selectedIndex]);\n    }\n  }\n\n  onMouseEnter(cmd: CommandPaletteItemConfig) {\n    const idx = this.flattenedList.findIndex((c) => c.id === cmd.id);\n    if (idx !== -1) {\n      this.selectedIndex = idx;\n      this.cdr.markForCheck();\n    }\n  }\n\n  isSelected(cmd: CommandPaletteItemConfig): boolean {\n    return this.flattenedList[this.selectedIndex]?.id === cmd.id;\n  }\n\n  selectCommand(cmd: CommandPaletteItemConfig) {\n    this.commandSelect.emit(cmd);\n    this.closePalette();\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}