@eclipse-lyra/extension-command-palette 0.0.0
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.
- package/dist/command-palette-extension-BWz846HM.js +481 -0
- package/dist/command-palette-extension-BWz846HM.js.map +1 -0
- package/dist/command-palette-extension.d.ts +39 -0
- package/dist/command-palette-extension.d.ts.map +1 -0
- package/dist/commandpalette.json.d.ts +31 -0
- package/dist/i18n.json.d.ts +13 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/package.json +28 -0
|
@@ -0,0 +1,481 @@
|
|
|
1
|
+
import { html, css } from "lit";
|
|
2
|
+
import { state, customElement } from "lit/decorators.js";
|
|
3
|
+
import { createRef, ref } from "lit/directives/ref.js";
|
|
4
|
+
import { SYSTEM_LANGUAGE_BUNDLES, TOOLBAR_MAIN_CENTER, LyraPart, subscribe, commandRegistry, i18n } from "@eclipse-lyra/core";
|
|
5
|
+
const namespace = "commandpalette";
|
|
6
|
+
const en = { "PLACEHOLDER": "Type a command name...", "NO_COMMANDS_FOUND": "No commands found", "PARAMETERS": "Parameters", "ENTER_PARAMETERS": "Enter parameters for {commandName}", "CANCEL": "Cancel", "EXECUTE": "Execute", "OPEN_COMMAND_PALETTE": "Open Command Palette", "OPEN_COMMAND_PALETTE_DESC": "Opens the command palette to execute commands", "MISSING_REQUIRED_PARAMS": "Missing required parameters: {params}", "ENTER_PARAM": "Enter {paramName}" };
|
|
7
|
+
const de = { "PLACEHOLDER": "Befehlsname eingeben...", "NO_COMMANDS_FOUND": "Keine Befehle gefunden", "PARAMETERS": "Parameter", "ENTER_PARAMETERS": "Parameter für {commandName} eingeben", "CANCEL": "Abbrechen", "EXECUTE": "Ausführen", "OPEN_COMMAND_PALETTE": "Befehls-Palette öffnen", "OPEN_COMMAND_PALETTE_DESC": "Öffnet die Befehls-Palette zum Ausführen von Befehlen", "MISSING_REQUIRED_PARAMS": "Erforderliche Parameter fehlen: {params}", "ENTER_PARAM": "{paramName} eingeben" };
|
|
8
|
+
const commandpaletteBundle = {
|
|
9
|
+
namespace,
|
|
10
|
+
en,
|
|
11
|
+
de
|
|
12
|
+
};
|
|
13
|
+
var __defProp = Object.defineProperty;
|
|
14
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
15
|
+
var __decorateClass = (decorators, target, key, kind) => {
|
|
16
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
17
|
+
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
18
|
+
if (decorator = decorators[i])
|
|
19
|
+
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
20
|
+
if (kind && result) __defProp(target, key, result);
|
|
21
|
+
return result;
|
|
22
|
+
};
|
|
23
|
+
const t = i18n("commandpalette");
|
|
24
|
+
const TOPIC_OPEN_COMMAND_PALETTE = "commandpalette/open";
|
|
25
|
+
let LyraCommandPalette = class extends LyraPart {
|
|
26
|
+
constructor() {
|
|
27
|
+
super(...arguments);
|
|
28
|
+
this.inputValue = "";
|
|
29
|
+
this.filteredCommands = [];
|
|
30
|
+
this.allCommands = [];
|
|
31
|
+
this.showParameterPrompt = false;
|
|
32
|
+
this.selectedCommand = null;
|
|
33
|
+
this.parameterValues = {};
|
|
34
|
+
this.isPaletteOpen = false;
|
|
35
|
+
this.inputRef = createRef();
|
|
36
|
+
this.dialogRef = createRef();
|
|
37
|
+
}
|
|
38
|
+
async doInitUI() {
|
|
39
|
+
subscribe(TOPIC_OPEN_COMMAND_PALETTE, () => {
|
|
40
|
+
this.openPalette();
|
|
41
|
+
});
|
|
42
|
+
this.boundDocumentClickHandler = this.handleDocumentClick.bind(this);
|
|
43
|
+
document.addEventListener("click", this.boundDocumentClickHandler);
|
|
44
|
+
}
|
|
45
|
+
async handleDocumentClick(e) {
|
|
46
|
+
if (!this.isPaletteOpen && !this.showParameterPrompt) return;
|
|
47
|
+
await this.updateComplete;
|
|
48
|
+
const target = e.target;
|
|
49
|
+
if (this.contains(target)) return;
|
|
50
|
+
if (this.dialogRef.value) {
|
|
51
|
+
const dialog = this.dialogRef.value;
|
|
52
|
+
if (dialog.contains(target)) return;
|
|
53
|
+
}
|
|
54
|
+
let element = target;
|
|
55
|
+
while (element) {
|
|
56
|
+
if (element.tagName === "WA-DIALOG") return;
|
|
57
|
+
element = element.parentElement;
|
|
58
|
+
}
|
|
59
|
+
this.closePalette();
|
|
60
|
+
this.closeParameterPrompt();
|
|
61
|
+
}
|
|
62
|
+
handleDialogClick(e) {
|
|
63
|
+
e.stopPropagation();
|
|
64
|
+
}
|
|
65
|
+
handleInputFocus() {
|
|
66
|
+
requestAnimationFrame(() => {
|
|
67
|
+
this.isPaletteOpen = true;
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
handleInputClick(e) {
|
|
71
|
+
e.stopPropagation();
|
|
72
|
+
this.openPalette();
|
|
73
|
+
}
|
|
74
|
+
handleInputMouseDown(e) {
|
|
75
|
+
e.stopPropagation();
|
|
76
|
+
}
|
|
77
|
+
updateCommandList() {
|
|
78
|
+
const commands = commandRegistry.listCommands(this.executionContext || {});
|
|
79
|
+
this.allCommands = Object.values(commands).filter((cmd) => cmd.id !== "commandpalette.open").map((cmd) => ({
|
|
80
|
+
id: cmd.id,
|
|
81
|
+
name: cmd.name,
|
|
82
|
+
description: cmd.description,
|
|
83
|
+
icon: cmd.icon,
|
|
84
|
+
keyBinding: cmd.keyBinding
|
|
85
|
+
}));
|
|
86
|
+
this.filteredCommands = [...this.allCommands];
|
|
87
|
+
}
|
|
88
|
+
async openPalette() {
|
|
89
|
+
this.executionContext = commandRegistry.createExecutionContext();
|
|
90
|
+
this.inputValue = "";
|
|
91
|
+
this.updateCommandList();
|
|
92
|
+
this.showParameterPrompt = false;
|
|
93
|
+
this.isPaletteOpen = true;
|
|
94
|
+
await this.updateComplete;
|
|
95
|
+
if (this.inputRef.value) {
|
|
96
|
+
this.inputRef.value.focus();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
closePalette() {
|
|
100
|
+
this.isPaletteOpen = false;
|
|
101
|
+
this.inputValue = "";
|
|
102
|
+
this.showParameterPrompt = false;
|
|
103
|
+
this.executionContext = void 0;
|
|
104
|
+
}
|
|
105
|
+
handleInputChange(e) {
|
|
106
|
+
const input = e.target;
|
|
107
|
+
this.inputValue = input.value;
|
|
108
|
+
this.filterCommands();
|
|
109
|
+
}
|
|
110
|
+
filterCommands() {
|
|
111
|
+
if (!this.inputValue.trim()) {
|
|
112
|
+
this.filteredCommands = [...this.allCommands];
|
|
113
|
+
} else {
|
|
114
|
+
const searchLower = this.inputValue.toLowerCase();
|
|
115
|
+
this.filteredCommands = this.allCommands.filter(
|
|
116
|
+
(cmd) => cmd.name.toLowerCase().includes(searchLower) || cmd.id.toLowerCase().includes(searchLower) || cmd.description && cmd.description.toLowerCase().includes(searchLower)
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
handleKeyDown(e) {
|
|
121
|
+
if (e.key === "Escape") {
|
|
122
|
+
e.preventDefault();
|
|
123
|
+
this.closePalette();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
handleCommandClick(e, command) {
|
|
127
|
+
if (!command) return;
|
|
128
|
+
e.stopPropagation();
|
|
129
|
+
this.inputValue = "";
|
|
130
|
+
this.filterCommands();
|
|
131
|
+
this.runCommand(command);
|
|
132
|
+
}
|
|
133
|
+
handleContainerClick(e) {
|
|
134
|
+
e.stopPropagation();
|
|
135
|
+
}
|
|
136
|
+
runCommand(command) {
|
|
137
|
+
if (!command || !commandRegistry) return;
|
|
138
|
+
const fullCommand = commandRegistry.getCommand(command.id);
|
|
139
|
+
const hasParameters = fullCommand?.parameters && fullCommand.parameters.length > 0;
|
|
140
|
+
if (hasParameters) {
|
|
141
|
+
this.selectedCommand = fullCommand;
|
|
142
|
+
this.parameterValues = {};
|
|
143
|
+
this.showParameterPrompt = true;
|
|
144
|
+
} else {
|
|
145
|
+
this.executeCommandWithParams(command.id, {});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
executeCommandWithParams(commandId, params) {
|
|
149
|
+
try {
|
|
150
|
+
commandRegistry.execute(commandId, { ...this.executionContext || {}, params });
|
|
151
|
+
this.closePalette();
|
|
152
|
+
this.closeParameterPrompt();
|
|
153
|
+
} catch (error) {
|
|
154
|
+
console.error("Failed to execute command:", error);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
closeParameterPrompt() {
|
|
158
|
+
this.showParameterPrompt = false;
|
|
159
|
+
this.selectedCommand = null;
|
|
160
|
+
this.parameterValues = {};
|
|
161
|
+
}
|
|
162
|
+
handleParameterInput(paramName, value) {
|
|
163
|
+
this.parameterValues = {
|
|
164
|
+
...this.parameterValues,
|
|
165
|
+
[paramName]: value
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
executeWithParameters() {
|
|
169
|
+
if (!this.selectedCommand) return;
|
|
170
|
+
const missingParams = this.selectedCommand.parameters?.filter((p) => p.required && !this.parameterValues[p.name]).map((p) => p.name);
|
|
171
|
+
if (missingParams && missingParams.length > 0) {
|
|
172
|
+
if (this.toastError) {
|
|
173
|
+
this.toastError(t("MISSING_REQUIRED_PARAMS", { params: missingParams.join(", ") }));
|
|
174
|
+
}
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
this.executeCommandWithParams(this.selectedCommand.id, this.parameterValues);
|
|
178
|
+
}
|
|
179
|
+
doClose() {
|
|
180
|
+
if (this.boundDocumentClickHandler) {
|
|
181
|
+
document.removeEventListener("click", this.boundDocumentClickHandler);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
render() {
|
|
185
|
+
return html`
|
|
186
|
+
<wa-input
|
|
187
|
+
${ref(this.inputRef)}
|
|
188
|
+
placeholder="${t("PLACEHOLDER")}"
|
|
189
|
+
.value=${this.inputValue}
|
|
190
|
+
@input=${this.handleInputChange}
|
|
191
|
+
@keydown=${this.handleKeyDown}
|
|
192
|
+
@focus=${this.handleInputFocus}
|
|
193
|
+
@click=${this.handleInputClick}
|
|
194
|
+
@mousedown=${this.handleInputMouseDown}
|
|
195
|
+
autocomplete="off"
|
|
196
|
+
size="small"
|
|
197
|
+
>
|
|
198
|
+
<wa-icon slot="start" name="terminal" label="Terminal"></wa-icon>
|
|
199
|
+
</wa-input>
|
|
200
|
+
|
|
201
|
+
<div class="commands-container ${this.isPaletteOpen ? "open" : ""}" @click=${this.handleContainerClick}>
|
|
202
|
+
${this.filteredCommands.length > 0 ? html`
|
|
203
|
+
${this.filteredCommands.map((cmd) => html`
|
|
204
|
+
<div class="command-item" @click=${(e) => this.handleCommandClick(e, cmd)}>
|
|
205
|
+
${cmd.icon ? html`
|
|
206
|
+
<div class="command-icon">
|
|
207
|
+
<wa-icon name="${cmd.icon}" label="${cmd.name}"></wa-icon>
|
|
208
|
+
</div>
|
|
209
|
+
` : html`
|
|
210
|
+
<div class="command-icon">
|
|
211
|
+
<wa-icon name="terminal" label="Command"></wa-icon>
|
|
212
|
+
</div>
|
|
213
|
+
`}
|
|
214
|
+
<div class="command-info">
|
|
215
|
+
<div class="command-name">${cmd.name}</div>
|
|
216
|
+
<div class="command-id">${cmd.id}</div>
|
|
217
|
+
${cmd.description ? html`
|
|
218
|
+
<div class="command-description">${cmd.description}</div>
|
|
219
|
+
` : ""}
|
|
220
|
+
</div>
|
|
221
|
+
${cmd.keyBinding ? html`
|
|
222
|
+
<div class="command-keybinding">${cmd.keyBinding}</div>
|
|
223
|
+
` : ""}
|
|
224
|
+
</div>
|
|
225
|
+
`)}
|
|
226
|
+
` : html`
|
|
227
|
+
<div class="no-results">
|
|
228
|
+
<wa-icon name="search" label="${t("NO_COMMANDS_FOUND")}" style="font-size: 24px; margin-bottom: 4px; opacity: 0.3;"></wa-icon>
|
|
229
|
+
<div>${t("NO_COMMANDS_FOUND")}</div>
|
|
230
|
+
</div>
|
|
231
|
+
`}
|
|
232
|
+
</div>
|
|
233
|
+
|
|
234
|
+
${this.showParameterPrompt && this.selectedCommand ? html`
|
|
235
|
+
<wa-dialog
|
|
236
|
+
${ref(this.dialogRef)}
|
|
237
|
+
label="${this.selectedCommand.name} - ${t("PARAMETERS")}"
|
|
238
|
+
open
|
|
239
|
+
@wa-request-close=${this.closeParameterPrompt}
|
|
240
|
+
@click=${this.handleDialogClick}
|
|
241
|
+
>
|
|
242
|
+
<div class="parameter-prompt-title">
|
|
243
|
+
${t("ENTER_PARAMETERS", { commandName: this.selectedCommand.name })}
|
|
244
|
+
</div>
|
|
245
|
+
${this.selectedCommand.parameters?.map((param) => html`
|
|
246
|
+
<div class="parameter-field">
|
|
247
|
+
<wa-input
|
|
248
|
+
label="${param.name}${param.required ? " *" : ""}"
|
|
249
|
+
hint=${param.description || ""}
|
|
250
|
+
placeholder=${param.description || t("ENTER_PARAM", { paramName: param.name })}
|
|
251
|
+
.value=${this.parameterValues[param.name] || ""}
|
|
252
|
+
@input=${(e) => this.handleParameterInput(param.name, e.target.value)}
|
|
253
|
+
></wa-input>
|
|
254
|
+
</div>
|
|
255
|
+
`)}
|
|
256
|
+
<div class="parameter-actions">
|
|
257
|
+
<wa-button variant="default" @click=${this.closeParameterPrompt}>
|
|
258
|
+
${t("CANCEL")}
|
|
259
|
+
</wa-button>
|
|
260
|
+
<wa-button variant="primary" @click=${this.executeWithParameters}>
|
|
261
|
+
${t("EXECUTE")}
|
|
262
|
+
</wa-button>
|
|
263
|
+
</div>
|
|
264
|
+
</wa-dialog>
|
|
265
|
+
` : ""}
|
|
266
|
+
`;
|
|
267
|
+
}
|
|
268
|
+
};
|
|
269
|
+
LyraCommandPalette.styles = css`
|
|
270
|
+
:host {
|
|
271
|
+
display: block;
|
|
272
|
+
width: 100%;
|
|
273
|
+
max-width: 600px;
|
|
274
|
+
position: relative;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
wa-input {
|
|
278
|
+
max-width: 300px;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
.commands-container {
|
|
282
|
+
position: absolute;
|
|
283
|
+
top: 100%;
|
|
284
|
+
left: 0;
|
|
285
|
+
right: 0;
|
|
286
|
+
margin-top: 4px;
|
|
287
|
+
background: var(--wa-color-neutral-05);
|
|
288
|
+
border: 1px solid var(--wa-color-neutral-25);
|
|
289
|
+
border-radius: 4px;
|
|
290
|
+
max-height: 400px;
|
|
291
|
+
overflow-y: auto;
|
|
292
|
+
z-index: 1000;
|
|
293
|
+
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.8);
|
|
294
|
+
display: none;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
:host-context(.wa-light) .commands-container {
|
|
298
|
+
background: var(--wa-color-neutral-95);
|
|
299
|
+
border: 1px solid var(--wa-color-neutral-75);
|
|
300
|
+
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
.commands-container.open {
|
|
304
|
+
display: block;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
.command-item {
|
|
308
|
+
display: flex;
|
|
309
|
+
align-items: center;
|
|
310
|
+
gap: 12px;
|
|
311
|
+
padding: 10px 16px;
|
|
312
|
+
cursor: pointer;
|
|
313
|
+
transition: background-color 0.15s;
|
|
314
|
+
border-bottom: 1px solid var(--wa-color-neutral-15);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
:host-context(.wa-light) .command-item {
|
|
318
|
+
border-bottom: 1px solid var(--wa-color-neutral-85);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
.command-item:last-child {
|
|
322
|
+
border-bottom: none;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
.command-item:hover {
|
|
326
|
+
background: var(--wa-color-neutral-20);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
:host-context(.wa-light) .command-item:hover {
|
|
330
|
+
background: var(--wa-color-neutral-80);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
.command-icon {
|
|
334
|
+
flex-shrink: 0;
|
|
335
|
+
width: 20px;
|
|
336
|
+
height: 20px;
|
|
337
|
+
display: flex;
|
|
338
|
+
align-items: center;
|
|
339
|
+
justify-content: center;
|
|
340
|
+
opacity: 0.7;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
.command-info {
|
|
344
|
+
flex: 1;
|
|
345
|
+
min-width: 0;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
.command-name {
|
|
349
|
+
font-size: 14px;
|
|
350
|
+
font-weight: 500;
|
|
351
|
+
margin-bottom: 2px;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
.command-id {
|
|
355
|
+
font-size: 11px;
|
|
356
|
+
opacity: 0.5;
|
|
357
|
+
font-family: monospace;
|
|
358
|
+
margin-bottom: 2px;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
.command-description {
|
|
362
|
+
font-size: 12px;
|
|
363
|
+
opacity: 0.7;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
.command-keybinding {
|
|
367
|
+
flex-shrink: 0;
|
|
368
|
+
margin-left: auto;
|
|
369
|
+
padding: 2px 8px;
|
|
370
|
+
background: var(--wa-color-neutral-15);
|
|
371
|
+
border: 1px solid var(--wa-color-neutral-25);
|
|
372
|
+
border-radius: 3px;
|
|
373
|
+
font-size: 11px;
|
|
374
|
+
font-family: monospace;
|
|
375
|
+
opacity: 0.7;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
:host-context(.wa-light) .command-keybinding {
|
|
379
|
+
background: var(--wa-color-neutral-85);
|
|
380
|
+
border: 1px solid var(--wa-color-neutral-75);
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
.no-results {
|
|
384
|
+
padding: 20px;
|
|
385
|
+
text-align: center;
|
|
386
|
+
color: var(--wa-color-neutral-60);
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
:host-context(.wa-light) .no-results {
|
|
390
|
+
color: var(--wa-color-neutral-40);
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
wa-dialog::part(panel) {
|
|
394
|
+
max-width: 600px;
|
|
395
|
+
width: 90vw;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
wa-dialog::part(body) {
|
|
399
|
+
padding: 20px;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
.parameter-prompt-title {
|
|
403
|
+
font-size: 16px;
|
|
404
|
+
font-weight: 600;
|
|
405
|
+
margin-bottom: 16px;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
.parameter-field {
|
|
409
|
+
margin-bottom: 12px;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
.parameter-field wa-input {
|
|
413
|
+
width: 100%;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
.parameter-actions {
|
|
417
|
+
display: flex;
|
|
418
|
+
gap: 8px;
|
|
419
|
+
justify-content: flex-end;
|
|
420
|
+
margin-top: 20px;
|
|
421
|
+
}
|
|
422
|
+
`;
|
|
423
|
+
__decorateClass([
|
|
424
|
+
state()
|
|
425
|
+
], LyraCommandPalette.prototype, "inputValue", 2);
|
|
426
|
+
__decorateClass([
|
|
427
|
+
state()
|
|
428
|
+
], LyraCommandPalette.prototype, "filteredCommands", 2);
|
|
429
|
+
__decorateClass([
|
|
430
|
+
state()
|
|
431
|
+
], LyraCommandPalette.prototype, "allCommands", 2);
|
|
432
|
+
__decorateClass([
|
|
433
|
+
state()
|
|
434
|
+
], LyraCommandPalette.prototype, "showParameterPrompt", 2);
|
|
435
|
+
__decorateClass([
|
|
436
|
+
state()
|
|
437
|
+
], LyraCommandPalette.prototype, "selectedCommand", 2);
|
|
438
|
+
__decorateClass([
|
|
439
|
+
state()
|
|
440
|
+
], LyraCommandPalette.prototype, "parameterValues", 2);
|
|
441
|
+
__decorateClass([
|
|
442
|
+
state()
|
|
443
|
+
], LyraCommandPalette.prototype, "isPaletteOpen", 2);
|
|
444
|
+
LyraCommandPalette = __decorateClass([
|
|
445
|
+
customElement("lyra-command-palette")
|
|
446
|
+
], LyraCommandPalette);
|
|
447
|
+
const commandPaletteExtension = ({ contributionRegistry, commandRegistry: commandRegistry2, toastInfo, toastError, html: html2, publish }) => {
|
|
448
|
+
contributionRegistry.registerContribution(
|
|
449
|
+
SYSTEM_LANGUAGE_BUNDLES,
|
|
450
|
+
commandpaletteBundle
|
|
451
|
+
);
|
|
452
|
+
commandRegistry2.registerHandler("commandpalette.open", {
|
|
453
|
+
execute: () => {
|
|
454
|
+
publish(TOPIC_OPEN_COMMAND_PALETTE, null);
|
|
455
|
+
}
|
|
456
|
+
});
|
|
457
|
+
commandRegistry2.registerCommand({
|
|
458
|
+
id: "commandpalette.open",
|
|
459
|
+
name: t("OPEN_COMMAND_PALETTE"),
|
|
460
|
+
description: t("OPEN_COMMAND_PALETTE_DESC"),
|
|
461
|
+
icon: "terminal",
|
|
462
|
+
keyBinding: "CTRL+SHIFT+P"
|
|
463
|
+
});
|
|
464
|
+
const commandPaletteElement = (() => {
|
|
465
|
+
const element = document.createElement("lyra-command-palette");
|
|
466
|
+
element.commandRegistry = commandRegistry2;
|
|
467
|
+
element.toastInfo = toastInfo;
|
|
468
|
+
element.toastError = toastError;
|
|
469
|
+
return element;
|
|
470
|
+
})();
|
|
471
|
+
contributionRegistry.registerContribution(TOOLBAR_MAIN_CENTER, {
|
|
472
|
+
label: "Command Palette",
|
|
473
|
+
icon: "terminal",
|
|
474
|
+
html: () => html2`${commandPaletteElement}`
|
|
475
|
+
});
|
|
476
|
+
};
|
|
477
|
+
export {
|
|
478
|
+
LyraCommandPalette,
|
|
479
|
+
commandPaletteExtension as default
|
|
480
|
+
};
|
|
481
|
+
//# sourceMappingURL=command-palette-extension-BWz846HM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-palette-extension-BWz846HM.js","sources":["../src/command-palette-extension.ts"],"sourcesContent":["/**\n * Command Palette Extension for geo!space\n * \n * Provides a VS Code-style command palette at the top center of the interface\n * for quick command execution.\n */\n\nimport { html } from \"lit\";\nimport { customElement, state } from \"lit/decorators.js\";\nimport { css } from \"lit\";\nimport { createRef, ref, Ref } from \"lit/directives/ref.js\";\nimport { LyraPart } from \"@eclipse-lyra/core\";\nimport { TOOLBAR_MAIN_CENTER } from \"@eclipse-lyra/core\";\nimport { subscribe } from \"@eclipse-lyra/core\";\nimport { CommandRegistry, ExecutionContext, commandRegistry } from \"@eclipse-lyra/core\";\nimport { SYSTEM_LANGUAGE_BUNDLES, i18n } from \"@eclipse-lyra/core\";\nimport commandpaletteBundle from \"./commandpalette.json\";\n\nconst t = i18n('commandpalette');\n\n// Event topic for opening the command palette\nconst TOPIC_OPEN_COMMAND_PALETTE = \"commandpalette/open\";\n\n@customElement('lyra-command-palette')\nexport class LyraCommandPalette extends LyraPart {\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 async doInitUI() {\n // Subscribe to open command palette event\n subscribe(TOPIC_OPEN_COMMAND_PALETTE, () => {\n this.openPalette();\n });\n\n // Add clicoutside listener to close palette\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 // Check if click is inside the component\n if (this.contains(target)) return;\n\n // Check if click is inside the dialog element\n if (this.dialogRef.value) {\n const dialog = this.dialogRef.value as HTMLElement;\n if (dialog.contains(target)) return;\n }\n\n // Check if the target is inside any wa-dialog (in case of shadow DOM)\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 // Click is outside, close everything\n this.closePalette();\n this.closeParameterPrompt();\n }\n\n private handleDialogClick(e: Event) {\n e.stopPropagation();\n }\n\n private handleInputFocus() {\n // Use requestAnimationFrame to prevent interrupting the focus\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(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 || !commandRegistry) return;\n\n // Get the full command details from registry\n const fullCommand = commandRegistry.getCommand(command.id);\n\n // Check if command has any parameters (required or optional)\n const hasParameters = fullCommand?.parameters && fullCommand.parameters.length > 0;\n\n if (hasParameters) {\n // Show parameter prompt for any command with parameters\n this.selectedCommand = fullCommand;\n this.parameterValues = {};\n this.showParameterPrompt = true;\n } else {\n // Execute directly without parameters\n this.executeCommandWithParams(command.id, {});\n }\n }\n\n private executeCommandWithParams(commandId: string, params: any) {\n try {\n 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 // Validate required parameters\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 if ((this as any).toastError) {\n (this as any).toastError(t('MISSING_REQUIRED_PARAMS', { params: missingParams.join(', ') }));\n }\n return;\n }\n\n this.executeCommandWithParams(this.selectedCommand.id, this.parameterValues);\n }\n\n protected doClose() {\n if (this.boundDocumentClickHandler) {\n document.removeEventListener('click', this.boundDocumentClickHandler);\n }\n }\n\n static styles = css`\n :host {\n display: block;\n width: 100%;\n max-width: 600px;\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-neutral-05);\n border: 1px solid var(--wa-color-neutral-25);\n border-radius: 4px;\n max-height: 400px;\n overflow-y: auto;\n z-index: 1000;\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.8);\n display: none;\n }\n\n :host-context(.wa-light) .commands-container {\n background: var(--wa-color-neutral-95);\n border: 1px solid var(--wa-color-neutral-75);\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);\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-15);\n }\n\n :host-context(.wa-light) .command-item {\n border-bottom: 1px solid var(--wa-color-neutral-85);\n }\n\n .command-item:last-child {\n border-bottom: none;\n }\n\n .command-item:hover {\n background: var(--wa-color-neutral-20);\n }\n\n :host-context(.wa-light) .command-item:hover {\n background: var(--wa-color-neutral-80);\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-15);\n border: 1px solid var(--wa-color-neutral-25);\n border-radius: 3px;\n font-size: 11px;\n font-family: monospace;\n opacity: 0.7;\n }\n\n :host-context(.wa-light) .command-keybinding {\n background: var(--wa-color-neutral-85);\n border: 1px solid var(--wa-color-neutral-75);\n }\n\n .no-results {\n padding: 20px;\n text-align: center;\n color: var(--wa-color-neutral-60);\n }\n\n :host-context(.wa-light) .no-results {\n color: var(--wa-color-neutral-40);\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 render() {\n return html`\n <wa-input\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 ? html`\n ${this.filteredCommands.map(cmd => html`\n <div class=\"command-item\" @click=${(e: Event) => this.handleCommandClick(e, cmd)}>\n ${cmd.icon ? html`\n <div class=\"command-icon\">\n <wa-icon name=\"${cmd.icon}\" label=\"${cmd.name}\"></wa-icon>\n </div>\n ` : html`\n <div class=\"command-icon\">\n <wa-icon name=\"terminal\" label=\"Command\"></wa-icon>\n </div>\n `}\n <div class=\"command-info\">\n <div class=\"command-name\">${cmd.name}</div>\n <div class=\"command-id\">${cmd.id}</div>\n ${cmd.description ? html`\n <div class=\"command-description\">${cmd.description}</div>\n ` : ''}\n </div>\n ${cmd.keyBinding ? html`\n <div class=\"command-keybinding\">${cmd.keyBinding}</div>\n ` : ''}\n </div>\n `)}\n ` : html`\n <div class=\"no-results\">\n <wa-icon name=\"search\" label=\"${t('NO_COMMANDS_FOUND')}\" style=\"font-size: 24px; margin-bottom: 4px; opacity: 0.3;\"></wa-icon>\n <div>${t('NO_COMMANDS_FOUND')}</div>\n </div>\n `}\n </div>\n\n ${this.showParameterPrompt && this.selectedCommand ? html`\n <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((param: any) => html`\n <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}>\n ${t('CANCEL')}\n </wa-button>\n <wa-button variant=\"primary\" @click=${this.executeWithParameters}>\n ${t('EXECUTE')}\n </wa-button>\n </div>\n </wa-dialog>\n ` : ''}\n `;\n }\n}\n\nexport default ({ contributionRegistry, commandRegistry, toastInfo, toastError, html, publish }: any) => {\n // Register language bundle\n contributionRegistry.registerContribution(SYSTEM_LANGUAGE_BUNDLES,\n commandpaletteBundle as any);\n\n // Register command to open palette using events\n commandRegistry.registerHandler('commandpalette.open', {\n execute: () => {\n // Publish event to open the palette\n publish(TOPIC_OPEN_COMMAND_PALETTE, null);\n }\n });\n\n commandRegistry.registerCommand({\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\n // Create the command palette element once and reuse it\n const commandPaletteElement = (() => {\n const element = document.createElement('lyra-command-palette') as any;\n element.commandRegistry = commandRegistry;\n element.toastInfo = toastInfo;\n element.toastError = toastError;\n return element;\n })();\n\n // Register UI component at the top center\n contributionRegistry.registerContribution(TOOLBAR_MAIN_CENTER, {\n label: \"Command Palette\",\n icon: \"terminal\",\n html: () => html`${commandPaletteElement}`\n });\n\n}\n\n"],"names":["commandRegistry","html"],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { LyraPart } from '@eclipse-lyra/core';
|
|
2
|
+
export declare class LyraCommandPalette extends LyraPart {
|
|
3
|
+
private inputValue;
|
|
4
|
+
private filteredCommands;
|
|
5
|
+
private allCommands;
|
|
6
|
+
private showParameterPrompt;
|
|
7
|
+
private selectedCommand;
|
|
8
|
+
private parameterValues;
|
|
9
|
+
private isPaletteOpen;
|
|
10
|
+
private inputRef;
|
|
11
|
+
private dialogRef;
|
|
12
|
+
private boundDocumentClickHandler?;
|
|
13
|
+
private executionContext;
|
|
14
|
+
protected doInitUI(): Promise<void>;
|
|
15
|
+
private handleDocumentClick;
|
|
16
|
+
private handleDialogClick;
|
|
17
|
+
private handleInputFocus;
|
|
18
|
+
private handleInputClick;
|
|
19
|
+
private handleInputMouseDown;
|
|
20
|
+
private updateCommandList;
|
|
21
|
+
openPalette(): Promise<void>;
|
|
22
|
+
private closePalette;
|
|
23
|
+
private handleInputChange;
|
|
24
|
+
private filterCommands;
|
|
25
|
+
private handleKeyDown;
|
|
26
|
+
private handleCommandClick;
|
|
27
|
+
private handleContainerClick;
|
|
28
|
+
private runCommand;
|
|
29
|
+
private executeCommandWithParams;
|
|
30
|
+
private closeParameterPrompt;
|
|
31
|
+
private handleParameterInput;
|
|
32
|
+
private executeWithParameters;
|
|
33
|
+
protected doClose(): void;
|
|
34
|
+
static styles: import('lit').CSSResult;
|
|
35
|
+
render(): import('lit-html').TemplateResult<1>;
|
|
36
|
+
}
|
|
37
|
+
declare const _default: ({ contributionRegistry, commandRegistry, toastInfo, toastError, html, publish }: any) => void;
|
|
38
|
+
export default _default;
|
|
39
|
+
//# sourceMappingURL=command-palette-extension.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-palette-extension.d.ts","sourceRoot":"","sources":["../src/command-palette-extension.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAY9C,qBACa,kBAAmB,SAAQ,QAAQ;IAE5C,OAAO,CAAC,UAAU,CAAc;IAGhC,OAAO,CAAC,gBAAgB,CAAa;IAGrC,OAAO,CAAC,WAAW,CAAa;IAGhC,OAAO,CAAC,mBAAmB,CAAkB;IAG7C,OAAO,CAAC,eAAe,CAAa;IAGpC,OAAO,CAAC,eAAe,CAAiC;IAGxD,OAAO,CAAC,aAAa,CAAkB;IAEvC,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,yBAAyB,CAAC,CAA0B;IAC5D,OAAO,CAAC,gBAAgB,CAA+B;cAEvC,QAAQ;YAWV,mBAAmB;IA2BjC,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,iBAAiB;IAeZ,WAAW;IAcxB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,UAAU;IAoBlB,OAAO,CAAC,wBAAwB;IAUhC,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,qBAAqB;IAkB7B,SAAS,CAAC,OAAO;IAMjB,MAAM,CAAC,MAAM,0BAyJX;IAEF,MAAM;CAoFT;yBAEe,iFAAiF,GAAG;AAApG,wBAqCC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
declare const _default: {
|
|
2
|
+
"namespace": "commandpalette",
|
|
3
|
+
"en": {
|
|
4
|
+
"PLACEHOLDER": "Type a command name...",
|
|
5
|
+
"NO_COMMANDS_FOUND": "No commands found",
|
|
6
|
+
"PARAMETERS": "Parameters",
|
|
7
|
+
"ENTER_PARAMETERS": "Enter parameters for {commandName}",
|
|
8
|
+
"CANCEL": "Cancel",
|
|
9
|
+
"EXECUTE": "Execute",
|
|
10
|
+
"OPEN_COMMAND_PALETTE": "Open Command Palette",
|
|
11
|
+
"OPEN_COMMAND_PALETTE_DESC": "Opens the command palette to execute commands",
|
|
12
|
+
"MISSING_REQUIRED_PARAMS": "Missing required parameters: {params}",
|
|
13
|
+
"ENTER_PARAM": "Enter {paramName}"
|
|
14
|
+
},
|
|
15
|
+
"de": {
|
|
16
|
+
"PLACEHOLDER": "Befehlsname eingeben...",
|
|
17
|
+
"NO_COMMANDS_FOUND": "Keine Befehle gefunden",
|
|
18
|
+
"PARAMETERS": "Parameter",
|
|
19
|
+
"ENTER_PARAMETERS": "Parameter für {commandName} eingeben",
|
|
20
|
+
"CANCEL": "Abbrechen",
|
|
21
|
+
"EXECUTE": "Ausführen",
|
|
22
|
+
"OPEN_COMMAND_PALETTE": "Befehls-Palette öffnen",
|
|
23
|
+
"OPEN_COMMAND_PALETTE_DESC": "Öffnet die Befehls-Palette zum Ausführen von Befehlen",
|
|
24
|
+
"MISSING_REQUIRED_PARAMS": "Erforderliche Parameter fehlen: {params}",
|
|
25
|
+
"ENTER_PARAM": "{paramName} eingeben"
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
;
|
|
30
|
+
|
|
31
|
+
export default _default;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
declare const _default: {
|
|
2
|
+
"namespace": "extensions",
|
|
3
|
+
"en": {
|
|
4
|
+
"EXT_COMMANDPALETTE_NAME": "Command Palette",
|
|
5
|
+
"EXT_COMMANDPALETTE_DESC": "VS Code-style command palette at the top center for quick command execution (Ctrl+Shift+P)"
|
|
6
|
+
},
|
|
7
|
+
"de": {
|
|
8
|
+
"EXT_COMMANDPALETTE_NAME": "Befehls-Palette",
|
|
9
|
+
"EXT_COMMANDPALETTE_DESC": "VS Code-ähnliche Befehls-Palette oben in der Mitte für schnelle Befehlsausführung (Strg+Umschalt+P)"
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export default _default;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { contributionRegistry, SYSTEM_LANGUAGE_BUNDLES, i18nLazy, extensionRegistry } from "@eclipse-lyra/core";
|
|
2
|
+
import pkg from "../package.json";
|
|
3
|
+
const namespace = "extensions";
|
|
4
|
+
const en = { "EXT_COMMANDPALETTE_NAME": "Command Palette", "EXT_COMMANDPALETTE_DESC": "VS Code-style command palette at the top center for quick command execution (Ctrl+Shift+P)" };
|
|
5
|
+
const de = { "EXT_COMMANDPALETTE_NAME": "Befehls-Palette", "EXT_COMMANDPALETTE_DESC": "VS Code-ähnliche Befehls-Palette oben in der Mitte für schnelle Befehlsausführung (Strg+Umschalt+P)" };
|
|
6
|
+
const bundle = {
|
|
7
|
+
namespace,
|
|
8
|
+
en,
|
|
9
|
+
de
|
|
10
|
+
};
|
|
11
|
+
contributionRegistry.registerContribution(SYSTEM_LANGUAGE_BUNDLES, bundle);
|
|
12
|
+
const t = i18nLazy("extensions");
|
|
13
|
+
extensionRegistry.registerExtension({
|
|
14
|
+
id: pkg.name,
|
|
15
|
+
name: t("EXT_COMMANDPALETTE_NAME"),
|
|
16
|
+
description: t("EXT_COMMANDPALETTE_DESC"),
|
|
17
|
+
loader: () => import("./command-palette-extension-BWz846HM.js"),
|
|
18
|
+
icon: "terminal"
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import { extensionRegistry, i18nLazy, contributionRegistry, SYSTEM_LANGUAGE_BUNDLES } from '@eclipse-lyra/core';\nimport bundle from './i18n.json';\nimport pkg from '../package.json';\n\ncontributionRegistry.registerContribution(SYSTEM_LANGUAGE_BUNDLES, bundle as any);\n\nconst t = i18nLazy('extensions');\n\nextensionRegistry.registerExtension({\n id: pkg.name,\n name: t('EXT_COMMANDPALETTE_NAME'),\n description: t('EXT_COMMANDPALETTE_DESC'),\n loader: () => import(\"./command-palette-extension\"),\n icon: \"terminal\",\n \n \n});\n"],"names":[],"mappings":";;;;;;;;;;AAIA,qBAAqB,qBAAqB,yBAAyB,MAAa;AAEhF,MAAM,IAAI,SAAS,YAAY;AAE/B,kBAAkB,kBAAkB;AAAA,EAClC,IAAI,IAAI;AAAA,EACR,MAAM,EAAE,yBAAyB;AAAA,EACjC,aAAa,EAAE,yBAAyB;AAAA,EACxC,QAAQ,MAAM,OAAO,yCAA6B;AAAA,EAClD,MAAM;AAGR,CAAC;"}
|
package/package.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@eclipse-lyra/extension-command-palette",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"module": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "vite build"
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@eclipse-lyra/core": "*"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"typescript": "^5.9.3",
|
|
25
|
+
"vite": "^7.1.12",
|
|
26
|
+
"vite-plugin-dts": "^4.5.4"
|
|
27
|
+
}
|
|
28
|
+
}
|