@dotglitch/ngx-common
Version:
Angular components and utilities that are commonly used.
1 lines • 45.8 kB
Source Map (JSON)
{"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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"}