@eclipse-docks/extension-command-palette 0.7.122 → 0.7.125

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -168,7 +168,7 @@ var DocksCommandPalette = class DocksCommandPalette extends DocksWidget {
168
168
  @click=${this.handleInputClick}
169
169
  @mousedown=${this.handleInputMouseDown}
170
170
  autocomplete="off"
171
- size="small"
171
+ size="s"
172
172
  >
173
173
  <wa-icon slot="start" name="terminal" label="Terminal"></wa-icon>
174
174
  </wa-input>
@@ -382,8 +382,8 @@ DocksCommandPalette = _decorate([customElement("docks-command-palette")], DocksC
382
382
  registerAll({
383
383
  command: {
384
384
  id: "commandpalette.open",
385
- name: t.OPEN_COMMAND_PALETTE,
386
- description: t.OPEN_COMMAND_PALETTE_DESC,
385
+ name: String(t.OPEN_COMMAND_PALETTE),
386
+ description: String(t.OPEN_COMMAND_PALETTE_DESC),
387
387
  icon: "terminal",
388
388
  keyBinding: "CTRL+SHIFT+P"
389
389
  },
@@ -400,4 +400,4 @@ contributionRegistry.registerContribution(TOOLBAR_MAIN_CENTER, {
400
400
  });
401
401
  //#endregion
402
402
 
403
- //# sourceMappingURL=command-palette-extension-am2W7u9d.js.map
403
+ //# sourceMappingURL=command-palette-extension-B1qH6ER4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-palette-extension-B1qH6ER4.js","names":[],"sources":["../src/docks-command-palette.ts","../src/command-palette-extension.ts"],"sourcesContent":["import { html } from \"lit\";\nimport { css } from \"lit\";\nimport { customElement, state } from \"lit/decorators.js\";\nimport { createRef, ref, type Ref } from \"lit/directives/ref.js\";\nimport { DocksWidget, commandRegistry, type ExecutionContext, i18n, toastError } from \"@eclipse-docks/core\";\n\nexport const t = await i18n(import.meta.glob(\"./commandpalette*.json\"));\n\n// Event topic for opening the command palette\nexport const TOPIC_OPEN_COMMAND_PALETTE = \"commandpalette/open\";\n\n@customElement(\"docks-command-palette\")\nexport class DocksCommandPalette extends DocksWidget {\n @state()\n private inputValue: string = \"\";\n\n @state()\n private filteredCommands: any[] = [];\n\n @state()\n private allCommands: any[] = [];\n\n @state()\n private showParameterPrompt: boolean = false;\n\n @state()\n private selectedCommand: any = null;\n\n @state()\n private parameterValues: { [key: string]: string } = {};\n\n @state()\n private isPaletteOpen: boolean = false;\n\n private inputRef: Ref<any> = createRef();\n private dialogRef: Ref<any> = createRef();\n private boundDocumentClickHandler?: (e: MouseEvent) => void;\n private executionContext: ExecutionContext | undefined;\n\n protected doInitUI() {\n this.subscribe(TOPIC_OPEN_COMMAND_PALETTE, () => {\n this.openPalette();\n });\n\n this.boundDocumentClickHandler = this.handleDocumentClick.bind(this);\n document.addEventListener(\"click\", this.boundDocumentClickHandler);\n }\n\n private async handleDocumentClick(e: MouseEvent) {\n if (!this.isPaletteOpen && !this.showParameterPrompt) return;\n\n await this.updateComplete;\n const target = e.target as Node;\n\n if (this.contains(target)) return;\n\n if (this.dialogRef.value) {\n const dialog = this.dialogRef.value as HTMLElement;\n if (dialog.contains(target)) return;\n }\n\n let element = target as HTMLElement;\n while (element) {\n if (element.tagName === \"WA-DIALOG\") return;\n element = element.parentElement as HTMLElement;\n }\n\n this.closePalette();\n this.closeParameterPrompt();\n }\n\n private handleDialogClick(e: Event) {\n e.stopPropagation();\n }\n\n private handleInputFocus() {\n requestAnimationFrame(() => {\n this.isPaletteOpen = true;\n });\n }\n\n private handleInputClick(e: Event) {\n e.stopPropagation();\n this.openPalette();\n }\n\n private handleInputMouseDown(e: Event) {\n e.stopPropagation();\n }\n\n private updateCommandList() {\n const commands = commandRegistry.listCommands(this.executionContext || {});\n this.allCommands = Object.values(commands)\n .filter((cmd: any) => cmd.id !== \"commandpalette.open\")\n .map((cmd: any) => ({\n id: cmd.id,\n name: cmd.name,\n description: cmd.description,\n icon: cmd.icon,\n keyBinding: cmd.keyBinding,\n }));\n\n this.filteredCommands = [...this.allCommands];\n }\n\n public async openPalette() {\n this.executionContext = commandRegistry.createExecutionContext();\n this.inputValue = \"\";\n this.updateCommandList();\n this.showParameterPrompt = false;\n this.isPaletteOpen = true;\n\n await this.updateComplete;\n\n if (this.inputRef.value) {\n this.inputRef.value.focus();\n }\n }\n\n private closePalette() {\n this.isPaletteOpen = false;\n this.inputValue = \"\";\n this.showParameterPrompt = false;\n this.executionContext = undefined;\n }\n\n private handleInputChange(e: Event) {\n const input = e.target as any;\n this.inputValue = input.value;\n this.filterCommands();\n }\n\n private filterCommands() {\n if (!this.inputValue.trim()) {\n this.filteredCommands = [...this.allCommands];\n } else {\n const searchLower = this.inputValue.toLowerCase();\n this.filteredCommands = this.allCommands.filter(\n (cmd) =>\n cmd.name.toLowerCase().includes(searchLower) ||\n cmd.id.toLowerCase().includes(searchLower) ||\n (cmd.description && cmd.description.toLowerCase().includes(searchLower)),\n );\n }\n }\n\n private handleKeyDown(e: KeyboardEvent) {\n if (e.key === \"Escape\") {\n e.preventDefault();\n this.closePalette();\n }\n }\n\n private handleCommandClick(e: Event, command: any) {\n if (!command) return;\n e.stopPropagation();\n this.inputValue = \"\";\n this.filterCommands();\n this.runCommand(command);\n }\n\n private handleContainerClick(e: Event) {\n e.stopPropagation();\n }\n\n private runCommand(command: any) {\n if (!command) return;\n\n const fullCommand = commandRegistry.getCommand(command.id);\n const hasParameters = fullCommand?.parameters && fullCommand.parameters.length > 0;\n\n if (hasParameters) {\n this.selectedCommand = fullCommand;\n this.parameterValues = {};\n this.showParameterPrompt = true;\n } else {\n void this.executeCommandWithParams(command.id, {});\n }\n }\n\n private async executeCommandWithParams(commandId: string, params: any) {\n try {\n await commandRegistry.execute(commandId, { ...(this.executionContext || {}), params });\n this.closePalette();\n this.closeParameterPrompt();\n } catch (error: any) {\n console.error(\"Failed to execute command:\", error);\n }\n }\n\n private closeParameterPrompt() {\n this.showParameterPrompt = false;\n this.selectedCommand = null;\n this.parameterValues = {};\n }\n\n private handleParameterInput(paramName: string, value: string) {\n this.parameterValues = {\n ...this.parameterValues,\n [paramName]: value,\n };\n }\n\n private executeWithParameters() {\n if (!this.selectedCommand) return;\n\n const missingParams = this.selectedCommand.parameters\n ?.filter((p: any) => p.required && !this.parameterValues[p.name])\n .map((p: any) => p.name);\n\n if (missingParams && missingParams.length > 0) {\n toastError(t.MISSING_REQUIRED_PARAMS({ params: missingParams.join(\", \") }));\n return;\n }\n\n void this.executeCommandWithParams(this.selectedCommand.id, this.parameterValues);\n }\n\n protected render() {\n return html`\n <wa-input\n appearance=\"filled\"\n ${ref(this.inputRef)}\n placeholder=\"${t.PLACEHOLDER}\"\n .value=${this.inputValue}\n @input=${this.handleInputChange}\n @keydown=${this.handleKeyDown}\n @focus=${this.handleInputFocus}\n @click=${this.handleInputClick}\n @mousedown=${this.handleInputMouseDown}\n autocomplete=\"off\"\n size=\"s\"\n >\n <wa-icon slot=\"start\" name=\"terminal\" label=\"Terminal\"></wa-icon>\n </wa-input>\n\n <div class=\"commands-container ${this.isPaletteOpen ? \"open\" : \"\"}\" @click=${this.handleContainerClick}>\n ${this.filteredCommands.length > 0\n ? html`${this.filteredCommands.map(\n (cmd) => html`\n <div class=\"command-item\" @click=${(e: Event) => this.handleCommandClick(e, cmd)}>\n ${cmd.icon\n ? html`<div class=\"command-icon\">\n <wa-icon name=\"${cmd.icon}\" label=\"${cmd.name}\"></wa-icon>\n </div>`\n : html`<div class=\"command-icon\">\n <wa-icon name=\"terminal\" label=\"Command\"></wa-icon>\n </div>`}\n <div class=\"command-info\">\n <div class=\"command-name\">${cmd.name}</div>\n <div class=\"command-id\">${cmd.id}</div>\n ${cmd.description\n ? html`<div class=\"command-description\">${cmd.description}</div>`\n : \"\"}\n </div>\n ${cmd.keyBinding\n ? html`<div class=\"command-keybinding\">${cmd.keyBinding}</div>`\n : \"\"}\n </div>\n `,\n )}`\n : html`<div class=\"no-results\">\n <wa-icon\n name=\"search\"\n label=\"${t.NO_COMMANDS_FOUND}\"\n style=\"font-size: 24px; margin-bottom: 4px; opacity: 0.3;\"\n ></wa-icon>\n <div>${t.NO_COMMANDS_FOUND}</div>\n </div>`}\n </div>\n\n ${this.showParameterPrompt && this.selectedCommand\n ? html`<wa-dialog\n ${ref(this.dialogRef)}\n label=\"${this.selectedCommand.name} - ${t.PARAMETERS}\"\n open\n @wa-request-close=${this.closeParameterPrompt}\n @click=${this.handleDialogClick}\n >\n <div class=\"parameter-prompt-title\">\n ${t.ENTER_PARAMETERS({ commandName: this.selectedCommand.name })}\n </div>\n ${this.selectedCommand.parameters?.map(\n (param: any) => html`<div class=\"parameter-field\">\n <wa-input\n label=\"${param.name}${param.required ? \" *\" : \"\"}\"\n hint=${param.description || \"\"}\n placeholder=${param.description || t.ENTER_PARAM({ paramName: param.name })}\n .value=${this.parameterValues[param.name] || \"\"}\n @input=${(e: Event) => this.handleParameterInput(param.name, (e.target as any).value)}\n ></wa-input>\n </div>`,\n )}\n <div class=\"parameter-actions\">\n <wa-button variant=\"default\" @click=${this.closeParameterPrompt}>${t.CANCEL}</wa-button>\n <wa-button variant=\"primary\" @click=${this.executeWithParameters}>${t.EXECUTE}</wa-button>\n </div>\n </wa-dialog>`\n : \"\"}\n `;\n }\n\n protected doClose() {\n if (this.boundDocumentClickHandler) {\n document.removeEventListener(\"click\", this.boundDocumentClickHandler);\n this.boundDocumentClickHandler = undefined;\n }\n }\n\n static styles = css`\n :host {\n /* inline-flex + no width:100% keeps this on one row with siblings inside wa-button-group (flex-wrap: wrap). */\n display: inline-flex;\n flex-direction: column;\n align-items: stretch;\n width: auto;\n flex: 0 1 auto;\n max-width: 600px;\n min-width: 300px;\n position: relative;\n }\n\n wa-input {\n max-width: 300px;\n }\n\n .commands-container {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n margin-top: 4px;\n background: var(--wa-color-surface-raised);\n border: 1px solid var(--wa-color-surface-border);\n border-radius: 4px;\n max-height: 400px;\n overflow-y: auto;\n z-index: 1000;\n box-shadow: 0 8px 24px var(--wa-color-shadow);\n display: none;\n }\n\n .commands-container.open {\n display: block;\n }\n\n .command-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 16px;\n cursor: pointer;\n transition: background-color 0.15s;\n border-bottom: 1px solid var(--wa-color-neutral-border-quiet);\n }\n\n .command-item:last-child {\n border-bottom: none;\n }\n\n .command-item:hover {\n background: var(--wa-color-neutral-fill-normal);\n }\n\n .command-icon {\n flex-shrink: 0;\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0.7;\n }\n\n .command-info {\n flex: 1;\n min-width: 0;\n }\n\n .command-name {\n font-size: 14px;\n font-weight: 500;\n margin-bottom: 2px;\n }\n\n .command-id {\n font-size: 11px;\n opacity: 0.5;\n font-family: monospace;\n margin-bottom: 2px;\n }\n\n .command-description {\n font-size: 12px;\n opacity: 0.7;\n }\n\n .command-keybinding {\n flex-shrink: 0;\n margin-left: auto;\n padding: 2px 8px;\n background: var(--wa-color-neutral-fill-quiet);\n border: 1px solid var(--wa-color-neutral-border-quiet);\n border-radius: 3px;\n font-size: 11px;\n font-family: monospace;\n opacity: 0.7;\n }\n\n .no-results {\n padding: 20px;\n text-align: center;\n color: var(--wa-color-neutral-text-subtle);\n }\n\n wa-dialog::part(panel) {\n max-width: 600px;\n width: 90vw;\n }\n\n wa-dialog::part(body) {\n padding: 20px;\n }\n\n .parameter-prompt-title {\n font-size: 16px;\n font-weight: 600;\n margin-bottom: 16px;\n }\n\n .parameter-field {\n margin-bottom: 12px;\n }\n\n .parameter-field wa-input {\n width: 100%;\n }\n\n .parameter-actions {\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n margin-top: 20px;\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"docks-command-palette\": DocksCommandPalette;\n }\n}\n","import { contributionRegistry, registerAll, TOOLBAR_MAIN_CENTER, publish } from \"@eclipse-docks/core\";\nimport { t, TOPIC_OPEN_COMMAND_PALETTE } from \"./docks-command-palette\";\nimport { html } from \"@eclipse-docks/core/externals/lit\";\n\nregisterAll({\n command: {\n id: \"commandpalette.open\",\n name: String(t.OPEN_COMMAND_PALETTE),\n description: String(t.OPEN_COMMAND_PALETTE_DESC),\n icon: \"terminal\",\n keyBinding: \"CTRL+SHIFT+P\",\n },\n handler: {\n execute: () => {\n publish(TOPIC_OPEN_COMMAND_PALETTE, null);\n return null;\n },\n },\n});\n\ncontributionRegistry.registerContribution(TOOLBAR_MAIN_CENTER, {\n name: 'commandPalette.toolbar',\n label: \"Command Palette\",\n icon: \"terminal\",\n component: () => html`<docks-command-palette></docks-command-palette>`,\n});\n\n"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -9,7 +9,7 @@ extensionRegistry.registerExtension({
9
9
  id: pkg.name,
10
10
  name: t.EXT_COMMANDPALETTE_NAME,
11
11
  description: t.EXT_COMMANDPALETTE_DESC,
12
- loader: () => import("./command-palette-extension-am2W7u9d.js"),
12
+ loader: () => import("./command-palette-extension-B1qH6ER4.js"),
13
13
  icon: "terminal"
14
14
  });
15
15
  //#endregion
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eclipse-docks/extension-command-palette",
3
- "version": "0.7.122",
3
+ "version": "0.7.125",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -1 +0,0 @@
1
- {"version":3,"file":"command-palette-extension-am2W7u9d.js","names":[],"sources":["../src/docks-command-palette.ts","../src/command-palette-extension.ts"],"sourcesContent":["import { html } from \"lit\";\nimport { css } from \"lit\";\nimport { customElement, state } from \"lit/decorators.js\";\nimport { createRef, ref, type Ref } from \"lit/directives/ref.js\";\nimport { DocksWidget, commandRegistry, type ExecutionContext, i18n, toastError } from \"@eclipse-docks/core\";\n\nexport const t = await i18n(import.meta.glob(\"./commandpalette*.json\"));\n\n// Event topic for opening the command palette\nexport const TOPIC_OPEN_COMMAND_PALETTE = \"commandpalette/open\";\n\n@customElement(\"docks-command-palette\")\nexport class DocksCommandPalette extends DocksWidget {\n @state()\n private inputValue: string = \"\";\n\n @state()\n private filteredCommands: any[] = [];\n\n @state()\n private allCommands: any[] = [];\n\n @state()\n private showParameterPrompt: boolean = false;\n\n @state()\n private selectedCommand: any = null;\n\n @state()\n private parameterValues: { [key: string]: string } = {};\n\n @state()\n private isPaletteOpen: boolean = false;\n\n private inputRef: Ref<any> = createRef();\n private dialogRef: Ref<any> = createRef();\n private boundDocumentClickHandler?: (e: MouseEvent) => void;\n private executionContext: ExecutionContext | undefined;\n\n protected doInitUI() {\n this.subscribe(TOPIC_OPEN_COMMAND_PALETTE, () => {\n this.openPalette();\n });\n\n this.boundDocumentClickHandler = this.handleDocumentClick.bind(this);\n document.addEventListener(\"click\", this.boundDocumentClickHandler);\n }\n\n private async handleDocumentClick(e: MouseEvent) {\n if (!this.isPaletteOpen && !this.showParameterPrompt) return;\n\n await this.updateComplete;\n const target = e.target as Node;\n\n if (this.contains(target)) return;\n\n if (this.dialogRef.value) {\n const dialog = this.dialogRef.value as HTMLElement;\n if (dialog.contains(target)) return;\n }\n\n let element = target as HTMLElement;\n while (element) {\n if (element.tagName === \"WA-DIALOG\") return;\n element = element.parentElement as HTMLElement;\n }\n\n this.closePalette();\n this.closeParameterPrompt();\n }\n\n private handleDialogClick(e: Event) {\n e.stopPropagation();\n }\n\n private handleInputFocus() {\n requestAnimationFrame(() => {\n this.isPaletteOpen = true;\n });\n }\n\n private handleInputClick(e: Event) {\n e.stopPropagation();\n this.openPalette();\n }\n\n private handleInputMouseDown(e: Event) {\n e.stopPropagation();\n }\n\n private updateCommandList() {\n const commands = commandRegistry.listCommands(this.executionContext || {});\n this.allCommands = Object.values(commands)\n .filter((cmd: any) => cmd.id !== \"commandpalette.open\")\n .map((cmd: any) => ({\n id: cmd.id,\n name: cmd.name,\n description: cmd.description,\n icon: cmd.icon,\n keyBinding: cmd.keyBinding,\n }));\n\n this.filteredCommands = [...this.allCommands];\n }\n\n public async openPalette() {\n this.executionContext = commandRegistry.createExecutionContext();\n this.inputValue = \"\";\n this.updateCommandList();\n this.showParameterPrompt = false;\n this.isPaletteOpen = true;\n\n await this.updateComplete;\n\n if (this.inputRef.value) {\n this.inputRef.value.focus();\n }\n }\n\n private closePalette() {\n this.isPaletteOpen = false;\n this.inputValue = \"\";\n this.showParameterPrompt = false;\n this.executionContext = undefined;\n }\n\n private handleInputChange(e: Event) {\n const input = e.target as any;\n this.inputValue = input.value;\n this.filterCommands();\n }\n\n private filterCommands() {\n if (!this.inputValue.trim()) {\n this.filteredCommands = [...this.allCommands];\n } else {\n const searchLower = this.inputValue.toLowerCase();\n this.filteredCommands = this.allCommands.filter(\n (cmd) =>\n cmd.name.toLowerCase().includes(searchLower) ||\n cmd.id.toLowerCase().includes(searchLower) ||\n (cmd.description && cmd.description.toLowerCase().includes(searchLower)),\n );\n }\n }\n\n private handleKeyDown(e: KeyboardEvent) {\n if (e.key === \"Escape\") {\n e.preventDefault();\n this.closePalette();\n }\n }\n\n private handleCommandClick(e: Event, command: any) {\n if (!command) return;\n e.stopPropagation();\n this.inputValue = \"\";\n this.filterCommands();\n this.runCommand(command);\n }\n\n private handleContainerClick(e: Event) {\n e.stopPropagation();\n }\n\n private runCommand(command: any) {\n if (!command) return;\n\n const fullCommand = commandRegistry.getCommand(command.id);\n const hasParameters = fullCommand?.parameters && fullCommand.parameters.length > 0;\n\n if (hasParameters) {\n this.selectedCommand = fullCommand;\n this.parameterValues = {};\n this.showParameterPrompt = true;\n } else {\n void this.executeCommandWithParams(command.id, {});\n }\n }\n\n private async executeCommandWithParams(commandId: string, params: any) {\n try {\n await commandRegistry.execute(commandId, { ...(this.executionContext || {}), params });\n this.closePalette();\n this.closeParameterPrompt();\n } catch (error: any) {\n console.error(\"Failed to execute command:\", error);\n }\n }\n\n private closeParameterPrompt() {\n this.showParameterPrompt = false;\n this.selectedCommand = null;\n this.parameterValues = {};\n }\n\n private handleParameterInput(paramName: string, value: string) {\n this.parameterValues = {\n ...this.parameterValues,\n [paramName]: value,\n };\n }\n\n private executeWithParameters() {\n if (!this.selectedCommand) return;\n\n const missingParams = this.selectedCommand.parameters\n ?.filter((p: any) => p.required && !this.parameterValues[p.name])\n .map((p: any) => p.name);\n\n if (missingParams && missingParams.length > 0) {\n toastError(t.MISSING_REQUIRED_PARAMS({ params: missingParams.join(\", \") }));\n return;\n }\n\n void this.executeCommandWithParams(this.selectedCommand.id, this.parameterValues);\n }\n\n protected render() {\n return html`\n <wa-input\n appearance=\"filled\"\n ${ref(this.inputRef)}\n placeholder=\"${t.PLACEHOLDER}\"\n .value=${this.inputValue}\n @input=${this.handleInputChange}\n @keydown=${this.handleKeyDown}\n @focus=${this.handleInputFocus}\n @click=${this.handleInputClick}\n @mousedown=${this.handleInputMouseDown}\n autocomplete=\"off\"\n size=\"small\"\n >\n <wa-icon slot=\"start\" name=\"terminal\" label=\"Terminal\"></wa-icon>\n </wa-input>\n\n <div class=\"commands-container ${this.isPaletteOpen ? \"open\" : \"\"}\" @click=${this.handleContainerClick}>\n ${this.filteredCommands.length > 0\n ? html`${this.filteredCommands.map(\n (cmd) => html`\n <div class=\"command-item\" @click=${(e: Event) => this.handleCommandClick(e, cmd)}>\n ${cmd.icon\n ? html`<div class=\"command-icon\">\n <wa-icon name=\"${cmd.icon}\" label=\"${cmd.name}\"></wa-icon>\n </div>`\n : html`<div class=\"command-icon\">\n <wa-icon name=\"terminal\" label=\"Command\"></wa-icon>\n </div>`}\n <div class=\"command-info\">\n <div class=\"command-name\">${cmd.name}</div>\n <div class=\"command-id\">${cmd.id}</div>\n ${cmd.description\n ? html`<div class=\"command-description\">${cmd.description}</div>`\n : \"\"}\n </div>\n ${cmd.keyBinding\n ? html`<div class=\"command-keybinding\">${cmd.keyBinding}</div>`\n : \"\"}\n </div>\n `,\n )}`\n : html`<div class=\"no-results\">\n <wa-icon\n name=\"search\"\n label=\"${t.NO_COMMANDS_FOUND}\"\n style=\"font-size: 24px; margin-bottom: 4px; opacity: 0.3;\"\n ></wa-icon>\n <div>${t.NO_COMMANDS_FOUND}</div>\n </div>`}\n </div>\n\n ${this.showParameterPrompt && this.selectedCommand\n ? html`<wa-dialog\n ${ref(this.dialogRef)}\n label=\"${this.selectedCommand.name} - ${t.PARAMETERS}\"\n open\n @wa-request-close=${this.closeParameterPrompt}\n @click=${this.handleDialogClick}\n >\n <div class=\"parameter-prompt-title\">\n ${t.ENTER_PARAMETERS({ commandName: this.selectedCommand.name })}\n </div>\n ${this.selectedCommand.parameters?.map(\n (param: any) => html`<div class=\"parameter-field\">\n <wa-input\n label=\"${param.name}${param.required ? \" *\" : \"\"}\"\n hint=${param.description || \"\"}\n placeholder=${param.description || t.ENTER_PARAM({ paramName: param.name })}\n .value=${this.parameterValues[param.name] || \"\"}\n @input=${(e: Event) => this.handleParameterInput(param.name, (e.target as any).value)}\n ></wa-input>\n </div>`,\n )}\n <div class=\"parameter-actions\">\n <wa-button variant=\"default\" @click=${this.closeParameterPrompt}>${t.CANCEL}</wa-button>\n <wa-button variant=\"primary\" @click=${this.executeWithParameters}>${t.EXECUTE}</wa-button>\n </div>\n </wa-dialog>`\n : \"\"}\n `;\n }\n\n protected doClose() {\n if (this.boundDocumentClickHandler) {\n document.removeEventListener(\"click\", this.boundDocumentClickHandler);\n this.boundDocumentClickHandler = undefined;\n }\n }\n\n static styles = css`\n :host {\n /* inline-flex + no width:100% keeps this on one row with siblings inside wa-button-group (flex-wrap: wrap). */\n display: inline-flex;\n flex-direction: column;\n align-items: stretch;\n width: auto;\n flex: 0 1 auto;\n max-width: 600px;\n min-width: 300px;\n position: relative;\n }\n\n wa-input {\n max-width: 300px;\n }\n\n .commands-container {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n margin-top: 4px;\n background: var(--wa-color-surface-raised);\n border: 1px solid var(--wa-color-surface-border);\n border-radius: 4px;\n max-height: 400px;\n overflow-y: auto;\n z-index: 1000;\n box-shadow: 0 8px 24px var(--wa-color-shadow);\n display: none;\n }\n\n .commands-container.open {\n display: block;\n }\n\n .command-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 16px;\n cursor: pointer;\n transition: background-color 0.15s;\n border-bottom: 1px solid var(--wa-color-neutral-border-quiet);\n }\n\n .command-item:last-child {\n border-bottom: none;\n }\n\n .command-item:hover {\n background: var(--wa-color-neutral-fill-normal);\n }\n\n .command-icon {\n flex-shrink: 0;\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0.7;\n }\n\n .command-info {\n flex: 1;\n min-width: 0;\n }\n\n .command-name {\n font-size: 14px;\n font-weight: 500;\n margin-bottom: 2px;\n }\n\n .command-id {\n font-size: 11px;\n opacity: 0.5;\n font-family: monospace;\n margin-bottom: 2px;\n }\n\n .command-description {\n font-size: 12px;\n opacity: 0.7;\n }\n\n .command-keybinding {\n flex-shrink: 0;\n margin-left: auto;\n padding: 2px 8px;\n background: var(--wa-color-neutral-fill-quiet);\n border: 1px solid var(--wa-color-neutral-border-quiet);\n border-radius: 3px;\n font-size: 11px;\n font-family: monospace;\n opacity: 0.7;\n }\n\n .no-results {\n padding: 20px;\n text-align: center;\n color: var(--wa-color-neutral-text-subtle);\n }\n\n wa-dialog::part(panel) {\n max-width: 600px;\n width: 90vw;\n }\n\n wa-dialog::part(body) {\n padding: 20px;\n }\n\n .parameter-prompt-title {\n font-size: 16px;\n font-weight: 600;\n margin-bottom: 16px;\n }\n\n .parameter-field {\n margin-bottom: 12px;\n }\n\n .parameter-field wa-input {\n width: 100%;\n }\n\n .parameter-actions {\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n margin-top: 20px;\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"docks-command-palette\": DocksCommandPalette;\n }\n}\n","import { contributionRegistry, registerAll, TOOLBAR_MAIN_CENTER, publish } from \"@eclipse-docks/core\";\nimport { t, TOPIC_OPEN_COMMAND_PALETTE } from \"./docks-command-palette\";\nimport { html } from \"@eclipse-docks/core/externals/lit\";\n\nregisterAll({\n command: {\n id: \"commandpalette.open\",\n name: t.OPEN_COMMAND_PALETTE,\n description: t.OPEN_COMMAND_PALETTE_DESC,\n icon: \"terminal\",\n keyBinding: \"CTRL+SHIFT+P\",\n },\n handler: {\n execute: () => {\n publish(TOPIC_OPEN_COMMAND_PALETTE, null);\n return null;\n },\n },\n});\n\ncontributionRegistry.registerContribution(TOOLBAR_MAIN_CENTER, {\n name: 'commandPalette.toolbar',\n label: \"Command Palette\",\n icon: \"terminal\",\n component: () => html`<docks-command-palette></docks-command-palette>`,\n});\n\n"],"mappings":"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"}