{"version":3,"file":"dotglitch-ngx-common-command-palette.mjs","sources":["../../packages/common/command-palette/breadcrumb/breadcrumb.component.ts","../../packages/common/command-palette/breadcrumb/breadcrumb.component.html","../../packages/common/command-palette/shortcut/shortcut.component.ts","../../packages/common/command-palette/shortcut/shortcut.component.html","../../packages/common/command-palette/command-palette.service.ts","../../packages/common/command-palette/command-palette.component.ts","../../packages/common/command-palette/command-palette.component.html","../../packages/common/command-palette/dotglitch-ngx-common-command-palette.ts"],"sourcesContent":["import { Component, Input } from '@angular/core';\nimport { CommandPaletteComponent } from '../command-palette.component';\nimport { CommandAction } from '../command-palette.service';\n\n@Component({\n    selector: 'ngx-commandpalette-breadcrumb',\n    templateUrl: './breadcrumb.component.html',\n    styleUrls: ['./breadcrumb.component.scss'],\n    standalone: true\n})\nexport class BreadcrumbComponent {\n\n    @Input() breadcrumbs: {\n        action: CommandAction,\n        commands: CommandAction[],\n        destroying: boolean,\n        selectedIndex: number;\n    }[] = [];\n\n    constructor(\n        private commandPalette: CommandPaletteComponent\n    ) {\n\n    }\n\n    selectBreadcrumb(crumb) {\n        const index = this.breadcrumbs.indexOf(crumb);\n        if (index == -1)\n            throw new Error(\"Something terrible happened.\");\n\n        const layer = this.breadcrumbs.at(-1);\n        layer.destroying = true;\n        setTimeout(() => {\n            this.commandPalette.setCommandList(this.breadcrumbs.at(-2).commands);\n            this.commandPalette.breadcrumbs.pop();\n            this.commandPalette.activeIndex = layer.selectedIndex;\n        }, 190);\n    }\n}\n","@for (crumb of breadcrumbs; track crumb; let i = $index) {\n    <div class=\"crumb\">\n        <div\n            class=\"crumb_inner\"\n            [class.destroy]=\"crumb.destroying\"\n            [class.root]=\"i == 0\"\n            (click)=\"selectBreadcrumb(crumb)\"\n        >\n                {{crumb.action.label}}\n        </div>\n    </div>\n}\n","import { Component, Input } from '@angular/core';\nimport { KeybindCode } from '../command-palette.service';\n\n@Component({\n    selector: 'ngx-commandpalette-shortcut',\n    templateUrl: './shortcut.component.html',\n    styleUrls: ['./shortcut.component.scss'],\n    standalone: true\n})\nexport class ShortcutComponent {\n\n    @Input() shortcut: KeybindCode;\n\n    keys: string[] = [];\n\n    ngOnChanges() {\n        this.keys = this.shortcut?.split(\"+\");\n    }\n}\n","@for (key of keys; track key; let i = $index) {\n    @if(i > 0) {\n        <span class=\"plus\">+</span>\n    }\n\n    <span class=\"key\">{{key}}</span>\n}\n","import { Injectable } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { LazyLoaderService } from '@dotglitch/ngx-common/core';\nimport { CommandPaletteComponent } from './command-palette.component';\n\ntype KeyCode = \"Backspace\" | \"Tab\" | \"Enter\" | \"ShiftLeft\" | \"ShiftRight\"\n    | \"ControlLeft\" | \"ControlRight\" | \"AltLeft\" | \"AltRight\" | \"Pause\" | \"CapsLock\"\n    | \"Escape\" | \"Space\" | \"PageUp\" | \"PageDown\" | \"End\" | \"Home\" | \"ArrowLeft\"\n    | \"ArrowUp\" | \"ArrowRight\" | \"ArrowDown\" | \"PrintScreen\" | \"Insert\" | \"Delete\"\n    | \"MetaLeft\" | \"MetaRight\" | \"ContextMenu\" | \"Numpad0\" | \"Numpad1\" | \"Numpad2\"\n    | \"Numpad3\" | \"Numpad4\" | \"Numpad5\" | \"Numpad6\" | \"Numpad7\" | \"Numpad8\"\n    | \"Numpad9\" | \"NumpadMultiply\" | \"NumpadAdd\" | \"NumpadSubtract\"\n    | \"NumpadDecimal\" | \"NumpadDivide\"\n    | \"F1\" | \"F2\" | \"F3\" | \"F4\" | \"F5\" | \"F6\" | \"F7\" | \"F8\" | \"F9\" | \"F10\" | \"F11\" | \"F12\"\n    | \"NumLock\" | \"ScrollLock\" | \"Semicolon\" | \"Equal\" | \"Comma\" | \"Minus\"\n    | \"Period\" | \"Slash\" | \"Backquote\" | \"BracketLeft\" | \"Backslash\"\n    | \"BracketRight\" | \"Quote\" | \"backspace\" | \"tab\" | \"enter\" | \"shiftleft\"\n    | \"shiftright\" | \"controlleft\" | \"controlright\" | \"altleft\" | \"altright\"\n    | \"pause\" | \"capslock\" | \"escape\" | \"space\" | \"pageup\" | \"pagedown\" | \"end\"\n    | \"home\" | \"arrowleft\" | \"arrowup\" | \"arrowright\" | \"arrowdown\" | \"printscreen\"\n    | \"insert\" | \"delete\" | \"metaleft\" | \"metaright\" | \"contextmenu\"\n    | \"numpad0\" | \"numpad1\" | \"numpad2\" | \"numpad3\" | \"numpad4\" | \"numpad5\"\n    | \"numpad6\" | \"numpad7\" | \"numpad8\" | \"numpad9\" | \"numpadmultiply\" | \"numpadadd\"\n    | \"numpadsubtract\" | \"numpaddecimal\" | \"numpaddivide\"\n    | \"f1\" | \"f2\" | \"f3\" | \"f4\" | \"f5\" | \"f6\" | \"f7\" | \"f8\" | \"f9\" | \"f10\" | \"f11\" | \"f12\"\n    | \"numlock\" | \"scrolllock\" | \"semicolon\" | \"equal\" | \"comma\" | \"minus\" | \"period\"\n    | \"slash\" | \"backquote\" | \"bracketleft\" | \"backslash\" | \"bracketright\" | \"quote\"\n    | \"A\" | \"B\" | \"C\" | \"D\" | \"E\" | \"F\" | \"G\" | \"H\" | \"I\" | \"J\" | \"K\" | \"L\" | \"M\"\n    | \"N\" | \"O\" | \"P\" | \"Q\" | \"R\" | \"S\" | \"T\" | \"U\" | \"V\" | \"W\" | \"X\" | \"Y\" | \"Z\"\n    | \"a\" | \"b\" | \"c\" | \"d\" | \"e\" | \"f\" | \"g\" | \"h\" | \"i\" | \"j\" | \"k\" | \"l\" | \"m\"\n    | \"n\" | \"o\" | \"p\" | \"q\" | \"r\" | \"s\" | \"t\" | \"u\" | \"v\" | \"w\" | \"x\" | \"y\" | \"z\";\n\n// ctrl+alt+meta+shift\ntype KeyPrefix =\n    `ctrl` |\n    `ctrl+alt` |\n    `ctrl+alt+shift` |\n    `ctrl+alt+shift+meta` |\n    `ctrl+alt+meta` |\n    `ctrl+shift` |\n    `ctrl+shift+meta` |\n    `ctrl+meta` |\n    `alt` |\n    `alt+shift` |\n    `alt+shift+meta` |\n    `alt+meta` |\n    `shift` |\n    `shift+meta` |\n    `meta`;\n\nexport type KeybindEvent = (e: KeyboardEvent) => void;\nexport type KeybindCode = `${KeyPrefix}+${KeyCode}` | KeyCode;\n\n\n\nexport type CommandAction<T = any> = {\n    /**\n     * The non-modifier key(s) that must be pressed for the event to fire.\n     */\n    shortcutKey?: KeybindCode | KeybindCode[],\n\n    /**\n     * Action that is invoked when the keyboard shortcut is pressed or the item\n     * is activated in the GUI menu\n     * If the GUI menu is open, it will show a spinner if the action returns a `Promise`\n     */\n    action?: (evt: KeyboardEvent, data?: T) => Promise<any> | any,\n\n    /**\n     * Arbitrary data object to be passed into the action\n     */\n    data?: T,\n\n    /**\n     * Label in the command palette popup\n     */\n    label?: string,\n\n    /**\n     * Hint that follows the label, subtly\n     */\n    hint?: string,\n\n    /**\n     * Icon for the entry\n     * Can be a mat-icon\n     * Will be a mat-icon if the string is simple\n     * If the string contains a slash or colon, it will be loaded as\n     * an image source\n     */\n    icon?: string,\n\n    /**\n     * Keywords that can help pick this command\n     */\n    keywords?: string | string[],\n\n    /**\n     * Description for the popup\n     * WIP\n     */\n    description?: string,\n\n    /**\n     * The root ancestor element of the action\n     * (This allows scoping commands to specific HTML elements)\n     * This requires that the event target must be a descendant\n     *\n     * If there are multiple matching descendants, only\n     * the furthest descendant will be fired\n     *\n     * For command scoping, we read the data-label attribute\n     * Alternatively, you can set label and element as an object here.\n     */\n    rootElement?: HTMLElement | string | {\n        element: HTMLElement | string,\n        label: string;\n    },\n\n    /**\n     * The label for the root. Used for the UI control and debugging.\n     */\n    rootName?: string,\n\n    /**\n     * Control whether this command action is visible in the popup command\n     * palette GUI.\n     */\n    visibleInList?: boolean,\n\n    /**\n     * Enable selecting an item to show a list of sub-items\n     */\n    subMenu?: CommandAction<T>[] | (() => Promise<CommandAction<T>[]>) | (() => CommandAction<T>[]);\n\n};\n\ntype CommandBlock = {\n    element: HTMLElement,\n    actions: CommandAction[];\n};\n\nexport type CommandPaletteOptions = {\n    keybind: KeybindCode;\n};\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class CommandPaletteService {\n\n    private commandBlocks: CommandBlock[] = [];\n    private interval;\n\n    constructor(\n        private readonly dialog: MatDialog,\n        private readonly lazyLoader: LazyLoaderService\n    ) {\n        window.addEventListener(\"keydown\", (evt) => this.onKeyDown(evt));\n\n        this.interval = setInterval(() => {\n            // Go backwards since we're splicing items out of the array.\n            for (let i = this.commandBlocks.length; i >= 0; i--) {\n                let commandBlock = this.commandBlocks[i];\n\n                // If the current index is somehow null, rip it out of\n                // the array and wait for cleanup to trigger again\n                // for the rest of the array.\n                // TODO: Could this lead to leaks where things at the end\n                // never get cleaned?\n                if (commandBlock == null) {\n                    this.commandBlocks.splice(i, 1);\n                    return;\n                }\n\n                // If the element has been disconnected from the DOM, we will\n                // treat it as having been permanently removed.\n                // TODO: Could this ever cause unintended consequences?\n                if (!commandBlock?.element.isConnected)\n                    this.commandBlocks.splice(i, 1);\n            }\n        }, 5 * 60 * 1000);\n    }\n\n    private ngOnDestroy() {\n        clearInterval(this.interval);\n    }\n\n    private getCommandBlocks(element: HTMLElement = document.body) {\n        const elementPath: HTMLElement[] = [element];\n        let currentTarget: HTMLElement = element;\n        do {\n            elementPath.unshift(currentTarget = currentTarget.parentElement);\n        } while (currentTarget.parentElement);\n\n        // Ordered matching command blocks, closest first\n        const matchingCommandBlocks: CommandBlock[] = [];\n        for (const element of elementPath) {\n            const commandBlock = this.commandBlocks.find(cb => cb.element == element);\n            if (commandBlock) {\n                matchingCommandBlocks.unshift(commandBlock);\n            }\n        }\n\n        return matchingCommandBlocks;\n    }\n\n    /**\n     * Handle keydown events\n     *\n     * If an event has been removed from the DOM tree, we don't need\n     * to explicitly remove the bindings, as they will never fire\n     *\n     * We periodically check and remove unconnected command blocks\n     */\n    private onKeyDown(evt: KeyboardEvent) {\n        const matchingCommandBlocks = this.getCommandBlocks(evt.target as HTMLElement);\n\n        // String in format `ctrl+alt+F`, `ctrl+F` etc.\n        const key = [\n            evt.ctrlKey ? \"ctrl\" : undefined,\n            evt.altKey ? \"alt\" : undefined,\n            evt.shiftKey ? \"shift\" : undefined,\n            evt.metaKey ? \"meta\" : undefined,\n            evt.code.startsWith(\"Key\") ? evt.key : evt.code\n        ].filter(a => a).join('+').toLowerCase();\n\n        for (const commandBlock of matchingCommandBlocks) {\n            const action = commandBlock.actions.find(a => {\n                return Array.isArray(a.shortcutKey)\n                    ? a.shortcutKey.includes(key as any)\n                    : a.shortcutKey == key as any;\n            });\n\n            if (action) {\n                evt.stopPropagation();\n                evt.preventDefault();\n\n                this.invokeAction(action);\n\n                // Execute the action and move on.\n                return;\n            }\n            // Keep checking for matching actions\n        }\n\n        // If execution reaches this point, there were no matching actions on the\n        // path of elements that were registered.\n    }\n\n    private addCommand(element: HTMLElement, action: CommandAction) {\n        const commandBlock = this.commandBlocks.find(b => b.element == element) ?? (() => {\n            const cb = { element, actions: [] };\n            this.commandBlocks.push(cb);\n            return cb;\n        })();\n\n        // This is likely a duplicate entry\n        if (commandBlock.actions.find(a => a.shortcutKey && a.shortcutKey == action.shortcutKey)) {\n            console.warn(`Inserting duplicate action on element`, { element, action });\n        }\n        else {\n            // log(LogIcon.circle_blue, `Inserted action`, action)\n        }\n\n        // Make the shortcut keys lowercase so case sensitivity doesn't scalp someone\n        if (action.shortcutKey) {\n            if (Array.isArray(action.shortcutKey))\n                action.shortcutKey = action.shortcutKey.map(k => k.toLowerCase()) as any;\n            else\n                action.shortcutKey = action.shortcutKey.toLowerCase() as any;\n        }\n\n        commandBlock.actions.push(action);\n    }\n\n    private removeCommand(element: HTMLElement, action: CommandAction | string) {\n        const commandBlock = this.commandBlocks.find(b => b.element == element) ?? { element, actions: [] };\n        const actionIndex = commandBlock?.actions.findIndex(a => typeof action == \"string\" ? a.shortcutKey == action : a == action);\n\n        if (!commandBlock) {\n            console.error(`Cannot remove command: element does not have any commands registered`, { element, action });\n        }\n        else if (actionIndex == -1) {\n            console.warn(`Cannot remove command: not present in list`, { element, action });\n        }\n        else {\n            commandBlock.actions.splice(actionIndex, 1);\n        }\n    }\n\n    /**\n     *\n     */\n    initialize(options: CommandPaletteOptions) {\n        this.attachElementCommands([\n            {\n                shortcutKey: options.keybind,\n                action: () => this.openPalette(),\n                description: \"Open the command palette\",\n                keywords: [\"command\", \"prompt\", \"console\", \"actions\"],\n                label: \"Command Palette\",\n                visibleInList: false\n            }\n        ]);\n    }\n\n    /**\n     * Open the command palette\n     */\n    openPalette() {\n        return this.dialog.open(CommandPaletteComponent, {\n            position: {\n                top: \"8px\"\n            },\n            data: {\n                contextElement: document.activeElement\n            },\n            panelClass: ['ngx-command-palette'],\n            backdropClass: ['ngx-command-palette'],\n            restoreFocus: true,\n            role: 'dialog'\n        });\n    }\n\n    /**\n     * Public helper to invoke an action.\n     */\n    invokeAction(action: CommandAction, args?) {\n        const fn = action.action;\n        if (typeof fn == 'function') {\n\n            try {\n                const res = fn(args);\n\n                // Handle promises so that the GUI can show spinners for them\n                if (res instanceof Promise) {\n                    // TODO\n                }\n                else {\n                    // TODO\n                }\n            }\n            catch (ex) {\n                console.error(`Executing action threw an error`, { action }, ex);\n            }\n        }\n        else {\n            console.warn(`Cannot execute action, type is not \"function\"`, { action });\n        }\n    }\n\n    /**\n     * Attach commands to an Element and it's subtree\n     */\n    attachElementCommands(actions: CommandAction[]);\n    attachElementCommands(element: HTMLElement, actions: CommandAction[]);\n    attachElementCommands(element: CommandAction[] | HTMLElement = document.body, actions: CommandAction[] = []) {\n        if (Array.isArray(element)) {\n            actions = element;\n            element = document.body;\n        }\n\n        actions.forEach(a => this.addCommand(element as any, a));\n    }\n\n    /**\n     * Detach specified commands from an Element subtree\n     */\n    detachElementCommands(element: HTMLElement = document.body, actions: CommandAction[] = []) {\n        actions.forEach(a => this.removeCommand(element, a));\n    }\n\n    /**\n     * Return the list of registered commands under a given element\n     */\n    getRegisteredCommands(element: HTMLElement = document.body) {\n        return this.getCommandBlocks(element).map(c => c.actions).flat();\n    }\n}\n","import { ScrollingModule } from '@angular/cdk/scrolling';\nimport { ChangeDetectorRef, Component, ElementRef, HostListener, Inject, Input, OnInit, ViewChild, isDevMode } from '@angular/core';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { NgScrollbar, NgScrollbarModule } from 'ngx-scrollbar';\nimport { BreadcrumbComponent } from './breadcrumb/breadcrumb.component';\nimport { CommandAction, CommandPaletteService } from './command-palette.service';\nimport { ShortcutComponent } from './shortcut/shortcut.component';\n\n@Component({\n    selector: 'ngx-command-palette',\n    templateUrl: './command-palette.component.html',\n    styleUrls: ['./command-palette.component.scss'],\n    host: {\n        \"(click)\": \"textInput.nativeElement.focus()\"\n    },\n    imports: [\n        MatIconModule,\n        MatInputModule,\n        ScrollingModule,\n        NgScrollbarModule,\n        ShortcutComponent,\n        BreadcrumbComponent\n    ],\n    standalone: true\n})\nexport class CommandPaletteComponent implements OnInit {\n\n    @ViewChild(NgScrollbar) scrollbar: NgScrollbar;\n    @ViewChild('textinput') textInput: ElementRef<HTMLInputElement>;\n\n    @Input() contextElement: HTMLElement;\n\n    get el() { return this.elementRef.nativeElement as HTMLElement; }\n\n    readonly MAT_ICON_REGEX = /[:\\/\\.]/;\n\n    queryString = \"\";\n    activeIndex = 0;\n    readonly rowHeight = 29;\n    readonly padding = 6;\n\n    commands: CommandAction[] = [];\n    filteredCommands: CommandAction[] = [];\n\n    breadcrumbs: {\n        action: CommandAction,\n        commands: CommandAction[],\n        destroying: boolean,\n        selectedIndex: number;\n    }[] = [];\n\n    constructor(\n        private readonly commandPalette: CommandPaletteService,\n        private readonly dialog: MatDialogRef<any>,\n        private readonly elementRef: ElementRef,\n        private readonly changeDetector: ChangeDetectorRef,\n        @Inject(MAT_DIALOG_DATA) data: any\n    ) {\n        this.contextElement = this.contextElement ?? data.contextElement;\n    }\n\n    ngOnInit() {\n        this.commands = this.commandPalette.getRegisteredCommands(this.contextElement);\n        this.setCommandList(this.commands);\n\n        // TODO: custom name\n        this.breadcrumbs.push({\n            action: { label: \"/\" },\n            commands: this.commands,\n            destroying: false,\n            selectedIndex: 0\n        });\n    }\n\n    onKeyDown(evt: KeyboardEvent) {\n        switch (evt.key) {\n            case \"Enter\": {\n                // Fire the first command\n                if (this.filteredCommands.length > 0)\n                    this.executeCommand(this.filteredCommands[this.activeIndex]);\n\n                evt.stopPropagation();\n                return;\n            }\n            case \"ArrowUp\": {\n                this.activeIndex = Math.max(this.activeIndex - 1, 0);\n\n                evt.stopPropagation();\n                this.focusRow();\n                return;\n            }\n            case \"ArrowDown\": {\n                this.activeIndex = Math.min(this.filteredCommands.length - 1, this.activeIndex + 1);\n\n                evt.stopPropagation();\n                this.focusRow();\n                return;\n            }\n            case \"PageUp\": {\n                // Fire the first command\n                this.activeIndex = Math.max(this.activeIndex - 12, 0);\n\n                evt.stopPropagation();\n                this.focusRow();\n                return;\n            }\n            case \"PageDown\": {\n                this.activeIndex = Math.min(this.filteredCommands.length - 1, this.activeIndex + 12);\n\n                evt.stopPropagation();\n                this.focusRow();\n                return;\n            }\n            case \"Escape\": {\n                this.dialog.close();\n                evt.stopPropagation();\n                return;\n            }\n            case \"Backspace\": {\n                // If we have no characters and we're hitting backspace, go back\n                // to the previous menu in the breadcrumb\n                if (this.queryString.length == 0 && this.breadcrumbs.length > 1) {\n                    const layer = this.breadcrumbs.at(-1);\n                    layer.destroying = true;\n                    setTimeout(() => {\n                        this.setCommandList(this.breadcrumbs.at(-2).commands);\n                        this.breadcrumbs.pop();\n                        this.activeIndex = layer.selectedIndex;\n                    }, 190);\n                    return;\n                }\n                else {\n                    break;\n                }\n            }\n            case \"Delete\": {\n\n            }\n        }\n\n        this.activeIndex = 0;\n        this.commands.forEach(c => c['_renderedLabel'] = '');\n\n        // Check in the next tick to get the input's\n        // value so that it's updated\n        setTimeout(() => {\n            this.queryString = (evt.target as HTMLInputElement).value;\n            this.filterResults();\n        });\n    }\n\n    private async filterResults() {\n        // Whitespace doesn't count.\n        if (this.queryString.trim().length == 0) {\n            this.filteredCommands = this.commands;\n            return;\n        }\n\n        const queryChars = this.queryString\n            .toLowerCase()\n            .split('');\n\n        const matchedCommands: CommandAction[] = [];\n\n        for (const command of this.commands) {\n            const { label } = command;\n\n            // Check the label\n            if (command.label) {\n                const commandChars = label\n                    .toLowerCase()\n                    .split('');\n\n                let renderedLabel = '';\n                let lastIndex = 0;\n                let isMatch = true;\n\n                for (const char of queryChars) {\n                    const index = commandChars.indexOf(char, lastIndex);\n\n                    if (index == -1) {\n                        isMatch = false;\n                        break;\n                    }\n                    else {\n                        renderedLabel += label.slice(lastIndex, index) + `<b>${label.slice(index, index + 1)}</b>`;\n                        lastIndex = index + 1;\n                    }\n                }\n\n                renderedLabel += label.slice(lastIndex);\n\n                if (isMatch) {\n                    command['_renderedLabel'] = renderedLabel;\n                    matchedCommands.push(command);\n                }\n            }\n\n            // Check the hint\n            if (command.hint) {\n                const commandChars = label\n                    .toLowerCase()\n                    .split('');\n\n                let renderedHint = '';\n                let lastIndex = 0;\n                let isMatch = true;\n\n                for (const char of queryChars) {\n                    const index = commandChars.indexOf(char, lastIndex);\n\n                    if (index == -1) {\n                        isMatch = false;\n                        break;\n                    }\n                    else {\n                        renderedHint += label.slice(lastIndex, index) + `<b>${label.slice(index, index + 1)}</b>`;\n                        lastIndex = index + 1;\n                    }\n                }\n\n                renderedHint += label.slice(lastIndex);\n\n                if (isMatch) {\n                    command['_renderedHint'] = renderedHint;\n                    matchedCommands.push(command);\n                }\n            }\n        }\n\n        this.filteredCommands = matchedCommands;\n    }\n\n    public setCommandList(commands: CommandAction[]) {\n        this.commands = commands\n            .filter(c => c.visibleInList != false);\n        this.filteredCommands = this.commands;\n        this.queryString = '';\n        this.activeIndex = 0;\n\n        // Reset the filter labels\n        this.commands.forEach(command => command['_renderedLabel'] = '');\n    }\n\n    private focusRow() {\n        const top = this.activeIndex * this.rowHeight;\n        const height = this.rowHeight;\n\n        const viewTop = this.scrollbar?.viewport?.scrollTop;\n        const viewHeight = this.scrollbar?.viewport?.clientHeight;\n        const viewBottom = viewTop + viewHeight;\n\n        if (top < viewTop) {\n            this.scrollbar.viewport.nativeElement.scrollTo({ top: top + this.padding });\n        }\n        else if ((top + height) > viewBottom) {\n            this.scrollbar.viewport.nativeElement.scrollTo({ top: ((top + this.rowHeight) - viewHeight) + this.padding });\n        }\n\n        // Immediately check for changes to update template\n        this.changeDetector.detectChanges();\n    }\n\n    executeCommand(command: CommandAction) {\n        // Open a sub menu of items\n        if (Array.isArray(command.subMenu)) {\n            this.breadcrumbs.push({\n                action: command,\n                commands: command.subMenu,\n                selectedIndex: this.activeIndex,\n                destroying: false\n            });\n\n            this.setCommandList(command.subMenu);\n        }\n        // Directly invoke the action and kill the dialog\n        else {\n            this.commandPalette.invokeAction(command);\n            this.dialog.close();\n        }\n    }\n\n    @HostListener(\"window:blur\")\n    @HostListener(\"window:resize\")\n    onBlur() {\n        if (!isDevMode()) {\n            this.dialog.close();\n        }\n    }\n}\n","<mat-form-field style=\"width: 100%; padding: 8px 8px 0 8px\">\n    <ngx-commandpalette-breadcrumb\n        [breadcrumbs]=\"breadcrumbs\"\n    />\n    <input\n        #textinput\n        matInput\n        type=\"text\"\n        [value]=\"queryString\"\n        (keydown)=\"onKeyDown($event)\"\n    >\n</mat-form-field>\n\n@if (filteredCommands.length == 0) {\n    <div class=\"commands\">\n        <div class=\"command selected\">\n            <div class=\"label\">No matching results.</div>\n        </div>\n    </div>\n}\n@else {\n    <div\n        class=\"commands\"\n        [style.flex]=\"(filteredCommands.length * rowHeight) + 'px'\"\n        [class.shadow]=\"scrollbar?.viewport?.scrollTop > 2\"\n    >\n        <ng-scrollbar #scrollbar>\n            <cdk-virtual-scroll-viewport [itemSize]=\"rowHeight\" scrollViewport [minBufferPx]=\"150\">\n                <div\n                    *cdkVirtualFor=\"let command of filteredCommands; let index = index\"\n                    class=\"command\"\n                    [style.height]=\"rowHeight + 'px'\"\n                    [class.selected]=\"index==activeIndex\"\n                    [class.has-icon]=\"command.icon\"\n                    [attr.index]=\"index\"\n                    (click)=\"executeCommand(command)\"\n                >\n                    @if (command.icon) {\n                        <div class=\"icon\">\n                            @if (!MAT_ICON_REGEX.test(command.icon)) {\n                                <mat-icon [fontIcon]=\"command.icon\"></mat-icon>\n                            }\n                            @else {\n                                <img [src]=\"command.icon\"/>\n                            }\n                        </div>\n                    }\n\n                    <div\n                        class=\"label\"\n                        [innerHTML]=\"command['_renderedLabel'] || command.label || command.description\"\n                    ></div>\n\n                    @if (command['_renderedHint'] || command.hint) {\n                        <div\n                            class=\"hint\"\n                            [innerHTML]=\"command['_renderedHint'] || command.hint\"\n                        ></div>\n                    }\n                    <div style=\"flex: 1\"></div>\n\n                    <div>\n                        @for (shortcut of (command.shortcutKey?.find ? command.shortcutKey : [command.shortcutKey]); track shortcut) {\n                            @if (shortcut) {\n                                <ngx-commandpalette-shortcut [shortcut]=\"shortcut\"/>\n                            }\n                        }\n                    </div>\n                </div>\n            </cdk-virtual-scroll-viewport>\n        </ng-scrollbar>\n    </div>\n}\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.CommandPaletteComponent"],"mappings":"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"}