@eclipse-docks/extension-terminal 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.
Files changed (38) hide show
  1. package/dist/api.d.ts +8 -0
  2. package/dist/api.d.ts.map +1 -0
  3. package/dist/api.js +2 -0
  4. package/dist/commands-backend.d.ts +24 -0
  5. package/dist/commands-backend.d.ts.map +1 -0
  6. package/dist/i18n.de-BVmQFS_U.js +35 -0
  7. package/dist/i18n.de-BVmQFS_U.js.map +1 -0
  8. package/dist/i18n.en-BzXd1VkS.js +35 -0
  9. package/dist/i18n.en-BzXd1VkS.js.map +1 -0
  10. package/dist/index.d.ts +2 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +17 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/js-terminal-backend-BcQIBeMe.js +741 -0
  15. package/dist/js-terminal-backend-BcQIBeMe.js.map +1 -0
  16. package/dist/js-terminal-backend.d.ts +21 -0
  17. package/dist/js-terminal-backend.d.ts.map +1 -0
  18. package/dist/line-input.d.ts +24 -0
  19. package/dist/line-input.d.ts.map +1 -0
  20. package/dist/shell-parser.d.ts +11 -0
  21. package/dist/shell-parser.d.ts.map +1 -0
  22. package/dist/terminal-api.d.ts +76 -0
  23. package/dist/terminal-api.d.ts.map +1 -0
  24. package/dist/terminal-extension-U1ZIJJzf.js +439 -0
  25. package/dist/terminal-extension-U1ZIJJzf.js.map +1 -0
  26. package/dist/terminal-extension.d.ts +2 -0
  27. package/dist/terminal-extension.d.ts.map +1 -0
  28. package/dist/terminal-panel.d.ts +20 -0
  29. package/dist/terminal-panel.d.ts.map +1 -0
  30. package/dist/terminal-persistence.d.ts +5 -0
  31. package/dist/terminal-persistence.d.ts.map +1 -0
  32. package/dist/terminal-service.d.ts +49 -0
  33. package/dist/terminal-service.d.ts.map +1 -0
  34. package/dist/terminal-theme.d.ts +6 -0
  35. package/dist/terminal-theme.d.ts.map +1 -0
  36. package/dist/terminal-view.d.ts +40 -0
  37. package/dist/terminal-view.d.ts.map +1 -0
  38. package/package.json +40 -0
@@ -0,0 +1,439 @@
1
+ import { _ as VIEW_TERMINAL, a as registerTerminalProfile, c as parseTerminalState, d as TERMINAL_INSTANCES_TABS_ID, f as TERMINAL_NEW_DROPDOWN, g as TOPIC_TERMINAL_OPENED, h as TOPIC_TERMINAL_CLOSED, m as TOPIC_TERMINAL_ACTIVE_CHANGED, n as JsReplBackend, o as terminalService, p as TERMINAL_PANEL_SETTINGS_KEY, r as CommandsBackend, s as emptyTerminalState, t as JS_REPL_PROFILE_ID } from "./js-terminal-backend-BcQIBeMe.js";
2
+ import { DocksPart, PANEL_BOTTOM, appSettings, contributionRegistry, promptDialog, subscribe, unsubscribe } from "@eclipse-docks/core";
3
+ import { createRef, css, customElement, html, property, ref, unsafeCSS } from "@eclipse-docks/core/externals/lit";
4
+ import { Terminal } from "@xterm/xterm";
5
+ import { FitAddon } from "@xterm/addon-fit";
6
+ import xtermStyles from "@xterm/xterm/css/xterm.css?raw";
7
+ import _decorate from "@oxc-project/runtime/helpers/decorate";
8
+ //#region src/terminal-theme.ts
9
+ function cssVar(name, fallback) {
10
+ return getComputedStyle(document.documentElement).getPropertyValue(name).trim() || fallback;
11
+ }
12
+ function isDarkTheme() {
13
+ const root = document.documentElement;
14
+ if (root.classList.contains("wa-dark")) return true;
15
+ if (root.classList.contains("wa-light")) return false;
16
+ return true;
17
+ }
18
+ function getTerminalTheme() {
19
+ const dark = isDarkTheme();
20
+ return {
21
+ background: cssVar("--wa-color-surface-lowered", dark ? "#1e1e1e" : "#f3f3f3"),
22
+ foreground: cssVar("--wa-color-text-normal", dark ? "#d4d4d4" : "#1e1e1e"),
23
+ cursor: cssVar("--wa-color-text-normal", dark ? "#d4d4d4" : "#1e1e1e"),
24
+ cursorAccent: cssVar("--wa-color-surface-lowered", dark ? "#1e1e1e" : "#f3f3f3"),
25
+ selectionBackground: cssVar("--wa-color-brand-fill-quiet", dark ? "#264f7840" : "#add6ff80"),
26
+ selectionForeground: cssVar("--wa-color-text-normal", dark ? "#d4d4d4" : "#1e1e1e"),
27
+ black: cssVar("--wa-color-neutral-10", dark ? "#000000" : "#1e1e1e"),
28
+ red: cssVar("--wa-color-danger-fill-loud", "#cd3131"),
29
+ green: cssVar("--wa-color-success-fill-loud", "#0dbc79"),
30
+ yellow: cssVar("--wa-color-warning-fill-loud", "#e5e510"),
31
+ blue: cssVar("--wa-color-brand-fill-loud", "#2472c8"),
32
+ magenta: cssVar("--wa-color-purple-50", "#bc3fbc"),
33
+ cyan: cssVar("--wa-color-cyan-50", "#11a8cd"),
34
+ white: cssVar("--wa-color-neutral-90", dark ? "#e5e5e5" : "#ffffff"),
35
+ brightBlack: cssVar("--wa-color-neutral-50", "#666666"),
36
+ brightRed: cssVar("--wa-color-danger-50", "#f14c4c"),
37
+ brightGreen: cssVar("--wa-color-success-50", "#23d18b"),
38
+ brightYellow: cssVar("--wa-color-warning-50", "#f5f543"),
39
+ brightBlue: cssVar("--wa-color-brand-50", "#3b8eea"),
40
+ brightMagenta: cssVar("--wa-color-purple-40", "#d670d6"),
41
+ brightCyan: cssVar("--wa-color-cyan-40", "#29b8db"),
42
+ brightWhite: cssVar("--wa-color-neutral-95", "#ffffff")
43
+ };
44
+ }
45
+ /** Watches `wa-dark` / `wa-light` on `<html>`, same pattern as docks-monaco-widget. */
46
+ function observeTerminalTheme(onChange) {
47
+ const root = document.documentElement;
48
+ let dark = isDarkTheme();
49
+ const observer = new MutationObserver(() => {
50
+ const next = isDarkTheme();
51
+ if (next === dark) return;
52
+ dark = next;
53
+ onChange();
54
+ });
55
+ observer.observe(root, {
56
+ attributes: true,
57
+ attributeFilter: ["class"]
58
+ });
59
+ return () => observer.disconnect();
60
+ }
61
+ //#endregion
62
+ //#region src/terminal-view.ts
63
+ var DocksTerminalView = class DocksTerminalView extends DocksPart {
64
+ constructor(..._args) {
65
+ super(..._args);
66
+ this.scrollMode = "none";
67
+ this.xtermRef = createRef();
68
+ this.xterm = null;
69
+ this.fitAddon = null;
70
+ this.unsubscribeWrite = null;
71
+ this.resizeObserver = null;
72
+ this.tabsHost = null;
73
+ this.tabPanelName = null;
74
+ this.onTabShow = null;
75
+ this.backendOpened = false;
76
+ this.unobserveTheme = null;
77
+ }
78
+ connectedCallback() {
79
+ super.connectedCallback();
80
+ this.initTerminal();
81
+ }
82
+ disconnectedCallback() {
83
+ this.teardownTerminal();
84
+ super.disconnectedCallback();
85
+ }
86
+ close() {
87
+ if (this.terminal) terminalService.handleTabClosed(this.terminal.id);
88
+ this.teardownTerminal();
89
+ }
90
+ findTabContext() {
91
+ let panelName = null;
92
+ let tabPanel = null;
93
+ let tabsHost = null;
94
+ let el = this;
95
+ while (el) {
96
+ const tag = el.tagName?.toLowerCase();
97
+ if (tag === "wa-tab-panel" && !tabPanel) {
98
+ tabPanel = el;
99
+ panelName = el.getAttribute("name");
100
+ }
101
+ if (tag === "docks-tabs") {
102
+ tabsHost = el;
103
+ break;
104
+ }
105
+ const parent = el.parentElement;
106
+ if (parent) el = parent;
107
+ else {
108
+ const root = el.getRootNode();
109
+ el = root instanceof ShadowRoot ? root.host : null;
110
+ }
111
+ }
112
+ if (!tabsHost || !tabPanel || !panelName) return null;
113
+ return {
114
+ panelName,
115
+ tabPanel,
116
+ tabsHost
117
+ };
118
+ }
119
+ isTabPanelActive(tabPanel) {
120
+ return tabPanel.hasAttribute("active");
121
+ }
122
+ attachTabVisibilityHandling(context) {
123
+ this.tabsHost = context.tabsHost;
124
+ this.tabPanelName = context.panelName;
125
+ this.onTabShow = (event) => {
126
+ if (event.detail?.name !== context.panelName) return;
127
+ this.onTabShown();
128
+ };
129
+ context.tabsHost.addEventListener("wa-tab-show", this.onTabShow);
130
+ }
131
+ detachTabVisibilityHandling() {
132
+ if (this.tabsHost && this.onTabShow) this.tabsHost.removeEventListener("wa-tab-show", this.onTabShow);
133
+ this.tabsHost = null;
134
+ this.tabPanelName = null;
135
+ this.onTabShow = null;
136
+ }
137
+ scheduleFit(focus = false) {
138
+ requestAnimationFrame(() => {
139
+ requestAnimationFrame(() => {
140
+ this.applyFit();
141
+ if (focus) this.xterm?.focus();
142
+ });
143
+ });
144
+ }
145
+ async openBackendIfNeeded() {
146
+ if (this.backendOpened || !this.terminal?.backend) return;
147
+ this.backendOpened = true;
148
+ await this.terminal.backend.open?.(this.getDimensions());
149
+ }
150
+ onTabShown() {
151
+ this.scheduleFit(true);
152
+ this.openBackendIfNeeded();
153
+ }
154
+ async initTerminal() {
155
+ if (!this.terminal?.backend) return;
156
+ await this.updateComplete;
157
+ const container = this.xtermRef.value;
158
+ if (!container) return;
159
+ this.xterm = new Terminal({
160
+ cursorBlink: true,
161
+ fontFamily: "var(--wa-font-mono, monospace)",
162
+ fontSize: 13,
163
+ theme: getTerminalTheme()
164
+ });
165
+ this.fitAddon = new FitAddon();
166
+ this.xterm.loadAddon(this.fitAddon);
167
+ this.xterm.open(container);
168
+ const backend = this.terminal.backend;
169
+ this.unsubscribeWrite = backend.onDidWrite((data) => {
170
+ this.xterm?.write(data);
171
+ });
172
+ this.xterm.onData((data) => {
173
+ backend.handleInput(data);
174
+ });
175
+ this.terminal.clearScreen = () => {
176
+ this.xterm?.clear();
177
+ };
178
+ this.unobserveTheme = observeTerminalTheme(() => {
179
+ if (!this.xterm) return;
180
+ this.xterm.options.theme = getTerminalTheme();
181
+ });
182
+ this.resizeObserver = new ResizeObserver(() => {
183
+ if (!this.isVisible()) return;
184
+ this.scheduleFit();
185
+ });
186
+ this.resizeObserver.observe(container);
187
+ this.resizeObserver.observe(this);
188
+ this.observeAncestorResizableGrids(container);
189
+ const tabContext = this.findTabContext();
190
+ if (tabContext) this.attachTabVisibilityHandling(tabContext);
191
+ if (!tabContext || this.isTabPanelActive(tabContext.tabPanel)) {
192
+ this.scheduleFit(true);
193
+ this.openBackendIfNeeded();
194
+ }
195
+ }
196
+ observeAncestorResizableGrids(from) {
197
+ if (!this.resizeObserver) return;
198
+ let el = from;
199
+ while (el) {
200
+ if (el.tagName?.toLowerCase() === "docks-resizable-grid") this.resizeObserver.observe(el);
201
+ const parent = el.parentElement;
202
+ if (parent) el = parent;
203
+ else {
204
+ const root = el.getRootNode();
205
+ el = root instanceof ShadowRoot ? root.host : null;
206
+ }
207
+ }
208
+ }
209
+ isVisible() {
210
+ if (!this.tabPanelName) return true;
211
+ return this.offsetParent !== null;
212
+ }
213
+ applyFit() {
214
+ if (!this.fitAddon || !this.xterm || !this.isVisible()) return;
215
+ try {
216
+ this.fitAddon.fit();
217
+ } catch {
218
+ return;
219
+ }
220
+ const dims = this.getDimensions();
221
+ this.terminal?.backend?.setDimensions?.(dims);
222
+ }
223
+ getDimensions() {
224
+ return {
225
+ cols: this.xterm?.cols ?? 80,
226
+ rows: this.xterm?.rows ?? 24
227
+ };
228
+ }
229
+ teardownTerminal() {
230
+ this.detachTabVisibilityHandling();
231
+ this.unobserveTheme?.();
232
+ this.unobserveTheme = null;
233
+ this.backendOpened = false;
234
+ this.resizeObserver?.disconnect();
235
+ this.resizeObserver = null;
236
+ this.unsubscribeWrite?.();
237
+ this.unsubscribeWrite = null;
238
+ this.xterm?.dispose();
239
+ this.xterm = null;
240
+ this.fitAddon = null;
241
+ }
242
+ renderContent() {
243
+ return html`<div class="terminal-host" ${ref(this.xtermRef)}></div>`;
244
+ }
245
+ static {
246
+ this.styles = [unsafeCSS(xtermStyles), css`
247
+ :host {
248
+ display: flex;
249
+ flex-direction: column;
250
+ height: 100%;
251
+ width: 100%;
252
+ min-height: 0;
253
+ }
254
+
255
+ .part-shell {
256
+ display: flex;
257
+ flex-direction: column;
258
+ flex: 1;
259
+ min-height: 0;
260
+ height: 100%;
261
+ }
262
+
263
+ .part-content {
264
+ flex: 1;
265
+ min-height: 0;
266
+ display: flex;
267
+ flex-direction: column;
268
+ }
269
+
270
+ .part-content-inner {
271
+ flex: 1;
272
+ min-height: 0;
273
+ height: 100%;
274
+ display: flex;
275
+ flex-direction: column;
276
+ }
277
+
278
+ .terminal-host {
279
+ flex: 1;
280
+ min-height: 0;
281
+ height: 100%;
282
+ width: 100%;
283
+ overflow: hidden;
284
+ background: var(--wa-color-surface-lowered);
285
+ padding-left: var(--wa-space-s);
286
+ box-sizing: border-box;
287
+ }
288
+
289
+ .terminal-host .xterm {
290
+ height: 100%;
291
+ }
292
+ `];
293
+ }
294
+ };
295
+ _decorate([property({ attribute: false })], DocksTerminalView.prototype, "terminal", void 0);
296
+ DocksTerminalView = _decorate([customElement("docks-terminal-view")], DocksTerminalView);
297
+ //#endregion
298
+ //#region src/terminal-panel.ts
299
+ var DocksTerminalPanel = class DocksTerminalPanel extends DocksPart {
300
+ constructor(..._args) {
301
+ super(..._args);
302
+ this.scrollMode = "none";
303
+ this.unsubscribeTerminalEvents = [];
304
+ }
305
+ connectedCallback() {
306
+ super.connectedCallback();
307
+ terminalService.setPersistenceHandlers(() => this.loadPersistedState(), (state) => this.savePersistedState(state));
308
+ for (const topic of [
309
+ TOPIC_TERMINAL_ACTIVE_CHANGED,
310
+ TOPIC_TERMINAL_OPENED,
311
+ TOPIC_TERMINAL_CLOSED
312
+ ]) {
313
+ const token = subscribe(topic, () => this.requestUpdate());
314
+ this.unsubscribeTerminalEvents.push(() => unsubscribe(token));
315
+ }
316
+ this.updateComplete.then(() => {
317
+ this.bindInstanceTabsHost();
318
+ this.attachTabActivationListener();
319
+ terminalService.restorePersistedTerminals();
320
+ });
321
+ }
322
+ bindInstanceTabsHost() {
323
+ const tabs = this.renderRoot.querySelector(`docks-tabs#${TERMINAL_INSTANCES_TABS_ID}`);
324
+ terminalService.setInstanceTabsHost(tabs);
325
+ }
326
+ attachTabActivationListener() {
327
+ const tabs = this.renderRoot.querySelector("docks-tabs");
328
+ if (!tabs) return;
329
+ tabs.addEventListener("wa-tab-show", (event) => {
330
+ const name = event.detail?.name;
331
+ if (name) terminalService.handleTabActivated(name);
332
+ });
333
+ }
334
+ disconnectedCallback() {
335
+ for (const off of this.unsubscribeTerminalEvents) off();
336
+ this.unsubscribeTerminalEvents = [];
337
+ terminalService.setInstanceTabsHost(null);
338
+ super.disconnectedCallback();
339
+ }
340
+ async loadPersistedState() {
341
+ return parseTerminalState(await appSettings.getDialogSetting("docks-terminal-panel")) ?? emptyTerminalState();
342
+ }
343
+ async savePersistedState(state) {
344
+ await appSettings.setDialogSetting(TERMINAL_PANEL_SETTINGS_KEY, state);
345
+ }
346
+ renderToolbar() {
347
+ const hasActive = !!terminalService.activeTerminal;
348
+ return html`
349
+ <docks-command
350
+ icon="plus"
351
+ title="New Terminal"
352
+ dropdown="${TERMINAL_NEW_DROPDOWN}"
353
+ .action=${() => void terminalService.createTerminal()}
354
+ >
355
+ </docks-command>
356
+ <docks-command
357
+ icon="xmark"
358
+ title="Kill Terminal"
359
+ ?disabled=${!hasActive}
360
+ .action=${async () => {
361
+ await terminalService.activeTerminal?.dispose();
362
+ }}
363
+ ></docks-command>
364
+ <docks-command
365
+ icon="eraser"
366
+ title="Clear"
367
+ ?disabled=${!hasActive}
368
+ .action=${() => {
369
+ terminalService.activeTerminal?.clear?.();
370
+ }}
371
+ ></docks-command>
372
+ <docks-command
373
+ icon="pen"
374
+ title="Rename"
375
+ ?disabled=${!hasActive}
376
+ .action=${async () => {
377
+ const active = terminalService.activeTerminal;
378
+ if (!active) return;
379
+ const name = await promptDialog("Terminal name", active.name);
380
+ if (name?.trim()) terminalService.renameActiveTerminal(name.trim());
381
+ }}
382
+ ></docks-command>
383
+ `;
384
+ }
385
+ renderContent() {
386
+ return html`
387
+ <docks-tabs
388
+ id="${TERMINAL_INSTANCES_TABS_ID}"
389
+ placement="start"
390
+ item-size="small"
391
+ ></docks-tabs>
392
+ `;
393
+ }
394
+ static {
395
+ this.styles = css`
396
+ :host {
397
+ display: flex;
398
+ flex-direction: column;
399
+ height: 100%;
400
+ width: 100%;
401
+ min-height: 0;
402
+ }
403
+
404
+ docks-tabs {
405
+ flex: 1;
406
+ min-height: 0;
407
+ }
408
+ `;
409
+ }
410
+ };
411
+ DocksTerminalPanel = _decorate([customElement("docks-terminal-panel")], DocksTerminalPanel);
412
+ //#endregion
413
+ //#region src/terminal-extension.ts
414
+ var COMMANDS_PROFILE_ID = "terminal.javascript-shell";
415
+ async function activate() {
416
+ registerTerminalProfile({
417
+ id: COMMANDS_PROFILE_ID,
418
+ label: "Commands",
419
+ icon: "terminal",
420
+ isDefault: true,
421
+ create: async () => new CommandsBackend()
422
+ });
423
+ registerTerminalProfile({
424
+ id: JS_REPL_PROFILE_ID,
425
+ label: "JavaScript",
426
+ icon: "code",
427
+ create: async () => new JsReplBackend()
428
+ });
429
+ contributionRegistry.registerContribution(PANEL_BOTTOM, {
430
+ name: VIEW_TERMINAL,
431
+ label: "Terminal",
432
+ icon: "terminal",
433
+ component: (id) => html`<docks-terminal-panel id="${id}"></docks-terminal-panel>`
434
+ });
435
+ }
436
+ //#endregion
437
+ export { activate as default };
438
+
439
+ //# sourceMappingURL=terminal-extension-U1ZIJJzf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-extension-U1ZIJJzf.js","names":[],"sources":["../src/terminal-theme.ts","../src/terminal-view.ts","../src/terminal-panel.ts","../src/terminal-extension.ts"],"sourcesContent":["import type { ITheme } from '@xterm/xterm';\n\nfunction cssVar(name: string, fallback: string): string {\n const value = getComputedStyle(document.documentElement).getPropertyValue(name).trim();\n return value || fallback;\n}\n\nexport function isDarkTheme(): boolean {\n const root = document.documentElement;\n if (root.classList.contains('wa-dark')) return true;\n if (root.classList.contains('wa-light')) return false;\n return true;\n}\n\nexport function getTerminalTheme(): ITheme {\n const dark = isDarkTheme();\n return {\n background: cssVar('--wa-color-surface-lowered', dark ? '#1e1e1e' : '#f3f3f3'),\n foreground: cssVar('--wa-color-text-normal', dark ? '#d4d4d4' : '#1e1e1e'),\n cursor: cssVar('--wa-color-text-normal', dark ? '#d4d4d4' : '#1e1e1e'),\n cursorAccent: cssVar('--wa-color-surface-lowered', dark ? '#1e1e1e' : '#f3f3f3'),\n selectionBackground: cssVar('--wa-color-brand-fill-quiet', dark ? '#264f7840' : '#add6ff80'),\n selectionForeground: cssVar('--wa-color-text-normal', dark ? '#d4d4d4' : '#1e1e1e'),\n black: cssVar('--wa-color-neutral-10', dark ? '#000000' : '#1e1e1e'),\n red: cssVar('--wa-color-danger-fill-loud', '#cd3131'),\n green: cssVar('--wa-color-success-fill-loud', '#0dbc79'),\n yellow: cssVar('--wa-color-warning-fill-loud', '#e5e510'),\n blue: cssVar('--wa-color-brand-fill-loud', '#2472c8'),\n magenta: cssVar('--wa-color-purple-50', '#bc3fbc'),\n cyan: cssVar('--wa-color-cyan-50', '#11a8cd'),\n white: cssVar('--wa-color-neutral-90', dark ? '#e5e5e5' : '#ffffff'),\n brightBlack: cssVar('--wa-color-neutral-50', '#666666'),\n brightRed: cssVar('--wa-color-danger-50', '#f14c4c'),\n brightGreen: cssVar('--wa-color-success-50', '#23d18b'),\n brightYellow: cssVar('--wa-color-warning-50', '#f5f543'),\n brightBlue: cssVar('--wa-color-brand-50', '#3b8eea'),\n brightMagenta: cssVar('--wa-color-purple-40', '#d670d6'),\n brightCyan: cssVar('--wa-color-cyan-40', '#29b8db'),\n brightWhite: cssVar('--wa-color-neutral-95', '#ffffff'),\n };\n}\n\n/** Watches `wa-dark` / `wa-light` on `<html>`, same pattern as docks-monaco-widget. */\nexport function observeTerminalTheme(onChange: () => void): () => void {\n const root = document.documentElement;\n let dark = isDarkTheme();\n\n const observer = new MutationObserver(() => {\n const next = isDarkTheme();\n if (next === dark) return;\n dark = next;\n onChange();\n });\n\n observer.observe(root, { attributes: true, attributeFilter: ['class'] });\n return () => observer.disconnect();\n}\n","import { css, createRef, customElement, html, property, ref, unsafeCSS, type Ref } from '@eclipse-docks/core/externals/lit';\nimport { Terminal } from '@xterm/xterm';\nimport { FitAddon } from '@xterm/addon-fit';\nimport { DocksPart } from '@eclipse-docks/core';\nimport { terminalService } from './terminal-service';\nimport type { TerminalRuntime } from './terminal-api';\nimport { getTerminalTheme, observeTerminalTheme } from './terminal-theme';\nimport xtermStyles from '@xterm/xterm/css/xterm.css?raw';\n\n@customElement('docks-terminal-view')\nexport class DocksTerminalView extends DocksPart {\n protected scrollMode: 'scroller' | 'native' | 'none' = 'none';\n\n @property({ attribute: false })\n terminal?: TerminalRuntime;\n\n private xtermRef: Ref<HTMLDivElement> = createRef();\n private xterm: Terminal | null = null;\n private fitAddon: FitAddon | null = null;\n private unsubscribeWrite: (() => void) | null = null;\n private resizeObserver: ResizeObserver | null = null;\n private tabsHost: Element | null = null;\n private tabPanelName: string | null = null;\n private onTabShow: ((event: Event) => void) | null = null;\n private backendOpened = false;\n private unobserveTheme: (() => void) | null = null;\n\n connectedCallback(): void {\n super.connectedCallback();\n void this.initTerminal();\n }\n\n disconnectedCallback(): void {\n this.teardownTerminal();\n super.disconnectedCallback();\n }\n\n close(): void {\n if (this.terminal) {\n terminalService.handleTabClosed(this.terminal.id);\n }\n this.teardownTerminal();\n }\n\n private findTabContext(): { panelName: string; tabPanel: HTMLElement; tabsHost: Element } | null {\n let panelName: string | null = null;\n let tabPanel: HTMLElement | null = null;\n let tabsHost: Element | null = null;\n let el: Element | null = this;\n\n while (el) {\n const tag = el.tagName?.toLowerCase();\n if (tag === 'wa-tab-panel' && !tabPanel) {\n tabPanel = el as HTMLElement;\n panelName = el.getAttribute('name');\n }\n if (tag === 'docks-tabs') {\n tabsHost = el;\n break;\n }\n const parent: Element | null = el.parentElement;\n if (parent) {\n el = parent;\n } else {\n const root = el.getRootNode();\n el = root instanceof ShadowRoot ? (root.host as Element) : null;\n }\n }\n\n if (!tabsHost || !tabPanel || !panelName) return null;\n return { panelName, tabPanel, tabsHost };\n }\n\n private isTabPanelActive(tabPanel: HTMLElement): boolean {\n return tabPanel.hasAttribute('active');\n }\n\n private attachTabVisibilityHandling(context: {\n panelName: string;\n tabsHost: Element;\n }): void {\n this.tabsHost = context.tabsHost;\n this.tabPanelName = context.panelName;\n this.onTabShow = (event: Event) => {\n const name = (event as CustomEvent<{ name?: string }>).detail?.name;\n if (name !== context.panelName) return;\n this.onTabShown();\n };\n context.tabsHost.addEventListener('wa-tab-show', this.onTabShow);\n }\n\n private detachTabVisibilityHandling(): void {\n if (this.tabsHost && this.onTabShow) {\n this.tabsHost.removeEventListener('wa-tab-show', this.onTabShow);\n }\n this.tabsHost = null;\n this.tabPanelName = null;\n this.onTabShow = null;\n }\n\n private scheduleFit(focus = false): void {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n this.applyFit();\n if (focus) this.xterm?.focus();\n });\n });\n }\n\n private async openBackendIfNeeded(): Promise<void> {\n if (this.backendOpened || !this.terminal?.backend) return;\n this.backendOpened = true;\n await this.terminal.backend.open?.(this.getDimensions());\n }\n\n private onTabShown(): void {\n this.scheduleFit(true);\n void this.openBackendIfNeeded();\n }\n\n private async initTerminal(): Promise<void> {\n if (!this.terminal?.backend) return;\n await this.updateComplete;\n\n const container = this.xtermRef.value;\n if (!container) return;\n\n this.xterm = new Terminal({\n cursorBlink: true,\n fontFamily: 'var(--wa-font-mono, monospace)',\n fontSize: 13,\n theme: getTerminalTheme(),\n });\n this.fitAddon = new FitAddon();\n this.xterm.loadAddon(this.fitAddon);\n this.xterm.open(container);\n\n const backend = this.terminal.backend;\n this.unsubscribeWrite = backend.onDidWrite((data) => {\n this.xterm?.write(data);\n });\n\n this.xterm.onData((data) => {\n backend.handleInput(data);\n });\n\n this.terminal.clearScreen = () => {\n this.xterm?.clear();\n };\n\n this.unobserveTheme = observeTerminalTheme(() => {\n if (!this.xterm) return;\n this.xterm.options.theme = getTerminalTheme();\n });\n\n this.resizeObserver = new ResizeObserver(() => {\n if (!this.isVisible()) return;\n this.scheduleFit();\n });\n this.resizeObserver.observe(container);\n this.resizeObserver.observe(this);\n this.observeAncestorResizableGrids(container);\n\n const tabContext = this.findTabContext();\n if (tabContext) {\n this.attachTabVisibilityHandling(tabContext);\n }\n\n if (!tabContext || this.isTabPanelActive(tabContext.tabPanel)) {\n this.scheduleFit(true);\n void this.openBackendIfNeeded();\n }\n }\n\n private observeAncestorResizableGrids(from: Element): void {\n if (!this.resizeObserver) return;\n let el: Element | null = from;\n while (el) {\n if (el.tagName?.toLowerCase() === 'docks-resizable-grid') {\n this.resizeObserver.observe(el);\n }\n const parent: Element | null = el.parentElement;\n if (parent) {\n el = parent;\n } else {\n const root = el.getRootNode();\n el = root instanceof ShadowRoot ? (root.host as Element) : null;\n }\n }\n }\n\n private isVisible(): boolean {\n if (!this.tabPanelName) return true;\n return this.offsetParent !== null;\n }\n\n private applyFit(): void {\n if (!this.fitAddon || !this.xterm || !this.isVisible()) return;\n try {\n this.fitAddon.fit();\n } catch {\n return;\n }\n const dims = this.getDimensions();\n this.terminal?.backend?.setDimensions?.(dims);\n }\n\n private getDimensions(): { cols: number; rows: number } {\n return {\n cols: this.xterm?.cols ?? 80,\n rows: this.xterm?.rows ?? 24,\n };\n }\n\n private teardownTerminal(): void {\n this.detachTabVisibilityHandling();\n this.unobserveTheme?.();\n this.unobserveTheme = null;\n this.backendOpened = false;\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n this.unsubscribeWrite?.();\n this.unsubscribeWrite = null;\n this.xterm?.dispose();\n this.xterm = null;\n this.fitAddon = null;\n }\n\n protected renderContent() {\n return html`<div class=\"terminal-host\" ${ref(this.xtermRef)}></div>`;\n }\n\n static styles = [\n unsafeCSS(xtermStyles),\n css`\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n min-height: 0;\n }\n\n .part-shell {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n height: 100%;\n }\n\n .part-content {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n }\n\n .part-content-inner {\n flex: 1;\n min-height: 0;\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .terminal-host {\n flex: 1;\n min-height: 0;\n height: 100%;\n width: 100%;\n overflow: hidden;\n background: var(--wa-color-surface-lowered);\n padding-left: var(--wa-space-s);\n box-sizing: border-box;\n }\n\n .terminal-host .xterm {\n height: 100%;\n }\n `,\n ];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'docks-terminal-view': DocksTerminalView;\n }\n}\n","import { css, customElement, html } from '@eclipse-docks/core/externals/lit';\nimport {\n DocksPart,\n appSettings,\n promptDialog,\n subscribe,\n unsubscribe,\n} from '@eclipse-docks/core';\nimport {\n TERMINAL_INSTANCES_TABS_ID,\n TERMINAL_NEW_DROPDOWN,\n TERMINAL_PANEL_SETTINGS_KEY,\n TOPIC_TERMINAL_ACTIVE_CHANGED,\n TOPIC_TERMINAL_CLOSED,\n TOPIC_TERMINAL_OPENED,\n type PersistedTerminalState,\n} from './terminal-api';\nimport { emptyTerminalState, parseTerminalState } from './terminal-persistence';\nimport { terminalService, type TerminalTabsHost } from './terminal-service';\nimport './terminal-view';\n\n@customElement('docks-terminal-panel')\nexport class DocksTerminalPanel extends DocksPart {\n protected scrollMode: 'scroller' | 'native' | 'none' = 'none';\n\n private unsubscribeTerminalEvents: (() => void)[] = [];\n\n connectedCallback(): void {\n super.connectedCallback();\n terminalService.setPersistenceHandlers(\n () => this.loadPersistedState(),\n (state) => this.savePersistedState(state)\n );\n for (const topic of [TOPIC_TERMINAL_ACTIVE_CHANGED, TOPIC_TERMINAL_OPENED, TOPIC_TERMINAL_CLOSED]) {\n const token = subscribe(topic, () => this.requestUpdate());\n this.unsubscribeTerminalEvents.push(() => unsubscribe(token));\n }\n this.updateComplete.then(() => {\n this.bindInstanceTabsHost();\n this.attachTabActivationListener();\n void terminalService.restorePersistedTerminals();\n });\n }\n\n private bindInstanceTabsHost(): void {\n const tabs = this.renderRoot.querySelector(\n `docks-tabs#${TERMINAL_INSTANCES_TABS_ID}`\n ) as TerminalTabsHost | null;\n terminalService.setInstanceTabsHost(tabs);\n }\n\n private attachTabActivationListener(): void {\n const tabs = this.renderRoot.querySelector('docks-tabs');\n if (!tabs) return;\n tabs.addEventListener('wa-tab-show', (event: Event) => {\n const name = (event as CustomEvent<{ name?: string }>).detail?.name;\n if (name) terminalService.handleTabActivated(name);\n });\n }\n\n disconnectedCallback(): void {\n for (const off of this.unsubscribeTerminalEvents) off();\n this.unsubscribeTerminalEvents = [];\n terminalService.setInstanceTabsHost(null);\n super.disconnectedCallback();\n }\n\n private async loadPersistedState(): Promise<PersistedTerminalState | null> {\n const raw = await appSettings.getDialogSetting(TERMINAL_PANEL_SETTINGS_KEY);\n return parseTerminalState(raw) ?? emptyTerminalState();\n }\n\n private async savePersistedState(state: PersistedTerminalState): Promise<void> {\n await appSettings.setDialogSetting(TERMINAL_PANEL_SETTINGS_KEY, state);\n }\n\n protected renderToolbar() {\n const hasActive = !!terminalService.activeTerminal;\n return html`\n <docks-command\n icon=\"plus\"\n title=\"New Terminal\"\n dropdown=\"${TERMINAL_NEW_DROPDOWN}\"\n .action=${() => void terminalService.createTerminal()}\n >\n </docks-command>\n <docks-command\n icon=\"xmark\"\n title=\"Kill Terminal\"\n ?disabled=${!hasActive}\n .action=${async () => {\n await terminalService.activeTerminal?.dispose();\n }}\n ></docks-command>\n <docks-command\n icon=\"eraser\"\n title=\"Clear\"\n ?disabled=${!hasActive}\n .action=${() => {\n terminalService.activeTerminal?.clear?.();\n }}\n ></docks-command>\n <docks-command\n icon=\"pen\"\n title=\"Rename\"\n ?disabled=${!hasActive}\n .action=${async () => {\n const active = terminalService.activeTerminal;\n if (!active) return;\n const name = await promptDialog('Terminal name', active.name);\n if (name?.trim()) terminalService.renameActiveTerminal(name.trim());\n }}\n ></docks-command>\n `;\n }\n\n protected renderContent() {\n return html`\n <docks-tabs\n id=\"${TERMINAL_INSTANCES_TABS_ID}\"\n placement=\"start\"\n item-size=\"small\"\n ></docks-tabs>\n `;\n }\n\n static styles = css`\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n min-height: 0;\n }\n\n docks-tabs {\n flex: 1;\n min-height: 0;\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'docks-terminal-panel': DocksTerminalPanel;\n }\n}\n","import { html } from '@eclipse-docks/core/externals/lit';\nimport { contributionRegistry, PANEL_BOTTOM, registerAll } from '@eclipse-docks/core';\nimport { VIEW_TERMINAL } from './terminal-api';\nimport { CommandsBackend } from './commands-backend';\nimport { JsReplBackend, JS_REPL_PROFILE_ID } from './js-terminal-backend';\nimport { registerTerminalProfile, terminalService } from './terminal-service';\nimport './terminal-panel';\n\nconst COMMANDS_PROFILE_ID = 'terminal.javascript-shell';\n\nexport default async function activate() {\n registerTerminalProfile({\n id: COMMANDS_PROFILE_ID,\n label: 'Commands',\n icon: 'terminal',\n isDefault: true,\n create: async () => new CommandsBackend(),\n });\n\n registerTerminalProfile({\n id: JS_REPL_PROFILE_ID,\n label: 'JavaScript',\n icon: 'code',\n create: async () => new JsReplBackend(),\n });\n\n contributionRegistry.registerContribution(PANEL_BOTTOM, {\n name: VIEW_TERMINAL,\n label: 'Terminal',\n icon: 'terminal',\n component: (id: string) => html`<docks-terminal-panel id=\"${id}\"></docks-terminal-panel>`,\n });\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export default function activate(): Promise<void>;
2
+ //# sourceMappingURL=terminal-extension.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-extension.d.ts","sourceRoot":"","sources":["../src/terminal-extension.ts"],"names":[],"mappings":"AAMA,OAAO,kBAAkB,CAAC;AAI1B,wBAA8B,QAAQ,kBAsBrC"}
@@ -0,0 +1,20 @@
1
+ import { DocksPart } from '@eclipse-docks/core';
2
+ export declare class DocksTerminalPanel extends DocksPart {
3
+ protected scrollMode: 'scroller' | 'native' | 'none';
4
+ private unsubscribeTerminalEvents;
5
+ connectedCallback(): void;
6
+ private bindInstanceTabsHost;
7
+ private attachTabActivationListener;
8
+ disconnectedCallback(): void;
9
+ private loadPersistedState;
10
+ private savePersistedState;
11
+ protected renderToolbar(): import('lit-html').TemplateResult<1>;
12
+ protected renderContent(): import('lit-html').TemplateResult<1>;
13
+ static styles: import('lit').CSSResult;
14
+ }
15
+ declare global {
16
+ interface HTMLElementTagNameMap {
17
+ 'docks-terminal-panel': DocksTerminalPanel;
18
+ }
19
+ }
20
+ //# sourceMappingURL=terminal-panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-panel.d.ts","sourceRoot":"","sources":["../src/terminal-panel.ts"],"names":[],"mappings":"AACA,OAAO,EACL,SAAS,EAKV,MAAM,qBAAqB,CAAC;AAY7B,OAAO,iBAAiB,CAAC;AAEzB,qBACa,kBAAmB,SAAQ,SAAS;IAC/C,SAAS,CAAC,UAAU,EAAE,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAU;IAE9D,OAAO,CAAC,yBAAyB,CAAsB;IAEvD,iBAAiB,IAAI,IAAI;IAiBzB,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,2BAA2B;IASnC,oBAAoB,IAAI,IAAI;YAOd,kBAAkB;YAKlB,kBAAkB;IAIhC,SAAS,CAAC,aAAa;IAwCvB,SAAS,CAAC,aAAa;IAUvB,MAAM,CAAC,MAAM,0BAaX;CACH;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,sBAAsB,EAAE,kBAAkB,CAAC;KAC5C;CACF"}
@@ -0,0 +1,5 @@
1
+ import { PersistedTerminalState } from './terminal-api';
2
+ export declare function serializeTerminalState(state: PersistedTerminalState): PersistedTerminalState;
3
+ export declare function parseTerminalState(raw: unknown): PersistedTerminalState | null;
4
+ export declare function emptyTerminalState(): PersistedTerminalState;
5
+ //# sourceMappingURL=terminal-persistence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-persistence.d.ts","sourceRoot":"","sources":["../src/terminal-persistence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA0B,sBAAsB,EAA2B,MAAM,gBAAgB,CAAC;AAI9G,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,sBAAsB,GAAG,sBAAsB,CAM5F;AAsBD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,sBAAsB,GAAG,IAAI,CA2B9E;AAED,wBAAgB,kBAAkB,IAAI,sBAAsB,CAE3D"}
@@ -0,0 +1,49 @@
1
+ import { TabContribution } from '@eclipse-docks/core';
2
+ import { Terminal, TerminalCreationOptions, TerminalProfileContribution, TerminalTaskPresentation, TerminalTaskRunner, PersistedTerminalState } from './terminal-api';
3
+ interface TerminalTabsHost {
4
+ has(key: string): boolean;
5
+ activate(key: string): void;
6
+ open(contribution: TabContribution): void;
7
+ closeTab(event: Event, tabName: string): Promise<void>;
8
+ updateTabLabel(tabName: string, label: string): void;
9
+ }
10
+ export type { TerminalTabsHost };
11
+ declare class TerminalService implements TerminalTaskRunner {
12
+ private terminals;
13
+ private activeTerminalId;
14
+ private preferredProfileId;
15
+ private persistenceHandler;
16
+ private persistCallback;
17
+ private restoreStarted;
18
+ private instanceTabsHost;
19
+ get activeTerminal(): Terminal | undefined;
20
+ getTerminals(): Terminal[];
21
+ onDidOpenTerminal(callback: (terminal: Terminal) => void): () => void;
22
+ onDidCloseTerminal(callback: (terminal: Terminal) => void): () => void;
23
+ onDidChangeActiveTerminal(callback: (terminal: Terminal | undefined) => void): () => void;
24
+ setPersistenceHandlers(load: () => Promise<PersistedTerminalState | null>, save: (state: PersistedTerminalState) => Promise<void>): void;
25
+ restorePersistedTerminals(): Promise<void>;
26
+ getProfiles(): TerminalProfileContribution[];
27
+ resolveDefaultProfileId(): string | null;
28
+ setInstanceTabsHost(host: TerminalTabsHost | null): void;
29
+ getInstanceTabs(): TerminalTabsHost | null;
30
+ focusTerminalPanel(): void;
31
+ activateTerminal(id: string): void;
32
+ private setActiveTerminal;
33
+ createTerminal(options?: TerminalCreationOptions, forcedId?: string): Promise<Terminal | undefined>;
34
+ private openTerminalTab;
35
+ disposeTerminal(id: string, options?: {
36
+ skipTabRemoval?: boolean;
37
+ }): Promise<void>;
38
+ killAll(): Promise<void>;
39
+ renameActiveTerminal(name: string): void;
40
+ setPreferredProfile(profileId: string): void;
41
+ clearActiveTerminal(): void;
42
+ runTask(presentation: TerminalTaskPresentation, execute: (terminal: Terminal) => Promise<void>): Promise<void>;
43
+ private persistState;
44
+ handleTabActivated(tabName: string): void;
45
+ handleTabClosed(tabName: string): void;
46
+ }
47
+ export declare const terminalService: TerminalService;
48
+ export declare function registerTerminalProfile(contribution: TerminalProfileContribution): void;
49
+ //# sourceMappingURL=terminal-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-service.d.ts","sourceRoot":"","sources":["../src/terminal-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { ITheme } from '@xterm/xterm';
2
+ export declare function isDarkTheme(): boolean;
3
+ export declare function getTerminalTheme(): ITheme;
4
+ /** Watches `wa-dark` / `wa-light` on `<html>`, same pattern as docks-monaco-widget. */
5
+ export declare function observeTerminalTheme(onChange: () => void): () => void;
6
+ //# sourceMappingURL=terminal-theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-theme.d.ts","sourceRoot":"","sources":["../src/terminal-theme.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAO3C,wBAAgB,WAAW,IAAI,OAAO,CAKrC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CA0BzC;AAED,uFAAuF;AACvF,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAarE"}
@@ -0,0 +1,40 @@
1
+ import { DocksPart } from '@eclipse-docks/core';
2
+ import { TerminalRuntime } from './terminal-api';
3
+ export declare class DocksTerminalView extends DocksPart {
4
+ protected scrollMode: 'scroller' | 'native' | 'none';
5
+ terminal?: TerminalRuntime;
6
+ private xtermRef;
7
+ private xterm;
8
+ private fitAddon;
9
+ private unsubscribeWrite;
10
+ private resizeObserver;
11
+ private tabsHost;
12
+ private tabPanelName;
13
+ private onTabShow;
14
+ private backendOpened;
15
+ private unobserveTheme;
16
+ connectedCallback(): void;
17
+ disconnectedCallback(): void;
18
+ close(): void;
19
+ private findTabContext;
20
+ private isTabPanelActive;
21
+ private attachTabVisibilityHandling;
22
+ private detachTabVisibilityHandling;
23
+ private scheduleFit;
24
+ private openBackendIfNeeded;
25
+ private onTabShown;
26
+ private initTerminal;
27
+ private observeAncestorResizableGrids;
28
+ private isVisible;
29
+ private applyFit;
30
+ private getDimensions;
31
+ private teardownTerminal;
32
+ protected renderContent(): import('lit-html').TemplateResult<1>;
33
+ static styles: import('lit').CSSResult[];
34
+ }
35
+ declare global {
36
+ interface HTMLElementTagNameMap {
37
+ 'docks-terminal-view': DocksTerminalView;
38
+ }
39
+ }
40
+ //# sourceMappingURL=terminal-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-view.d.ts","sourceRoot":"","sources":["../src/terminal-view.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAItD,qBACa,iBAAkB,SAAQ,SAAS;IAC9C,SAAS,CAAC,UAAU,EAAE,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAU;IAG9D,QAAQ,CAAC,EAAE,eAAe,CAAC;IAE3B,OAAO,CAAC,QAAQ,CAAoC;IACpD,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,gBAAgB,CAA6B;IACrD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,SAAS,CAAyC;IAC1D,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,cAAc,CAA6B;IAEnD,iBAAiB,IAAI,IAAI;IAKzB,oBAAoB,IAAI,IAAI;IAK5B,KAAK,IAAI,IAAI;IAOb,OAAO,CAAC,cAAc;IA6BtB,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,2BAA2B;IAcnC,OAAO,CAAC,2BAA2B;IASnC,OAAO,CAAC,WAAW;YASL,mBAAmB;IAMjC,OAAO,CAAC,UAAU;YAKJ,YAAY;IAsD1B,OAAO,CAAC,6BAA6B;IAiBrC,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,QAAQ;IAWhB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,gBAAgB;IAcxB,SAAS,CAAC,aAAa;IAIvB,MAAM,CAAC,MAAM,4BAiDX;CACH;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,qBAAqB,EAAE,iBAAiB,CAAC;KAC1C;CACF"}