@eclipse-lyra/core 0.7.5 → 0.7.7

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 (69) hide show
  1. package/dist/api/index.js +28 -29
  2. package/dist/api/services.d.ts +0 -4
  3. package/dist/api/services.d.ts.map +1 -1
  4. package/dist/api/types.d.ts +1 -1
  5. package/dist/api/types.d.ts.map +1 -1
  6. package/dist/components/fastviews.d.ts +1 -1
  7. package/dist/components/index.d.ts.map +1 -1
  8. package/dist/components/{app-switcher.d.ts → layout-switcher.d.ts} +5 -4
  9. package/dist/components/layout-switcher.d.ts.map +1 -0
  10. package/dist/{standard-layout-BSGa06lP.js → config-BiRvaEoO.js} +251 -462
  11. package/dist/config-BiRvaEoO.js.map +1 -0
  12. package/dist/contributions/default-layout-contributions.d.ts +1 -0
  13. package/dist/contributions/default-layout-contributions.d.ts.map +1 -0
  14. package/dist/contributions/index.d.ts.map +1 -1
  15. package/dist/core/apploader.d.ts +40 -30
  16. package/dist/core/apploader.d.ts.map +1 -1
  17. package/dist/core/constants.d.ts +1 -0
  18. package/dist/core/constants.d.ts.map +1 -1
  19. package/dist/core/contributionregistry.d.ts +10 -9
  20. package/dist/core/contributionregistry.d.ts.map +1 -1
  21. package/dist/core/editorregistry.d.ts +1 -1
  22. package/dist/core/editorregistry.d.ts.map +1 -1
  23. package/dist/core/index.d.ts.map +1 -1
  24. package/dist/icon-DN6fp0dg.js.map +1 -1
  25. package/dist/index.js +28 -29
  26. package/dist/parts/contextmenu.d.ts +1 -1
  27. package/dist/parts/index.js +1 -1
  28. package/dist/parts/resizable-grid.d.ts +1 -1
  29. package/dist/{resizable-grid-BRH3MyZK.js → resizable-grid-oWYRVx30.js} +322 -101
  30. package/dist/resizable-grid-oWYRVx30.js.map +1 -0
  31. package/dist/vite-plugin-resolve-deps.d.ts +18 -0
  32. package/dist/vite-plugin-resolve-deps.d.ts.map +1 -0
  33. package/dist/widgets/icon.d.ts +1 -1
  34. package/package.json +8 -1
  35. package/src/api/services.ts +0 -4
  36. package/src/api/types.ts +1 -1
  37. package/src/commands/global.ts +1 -1
  38. package/src/commands/version-info.ts +24 -10
  39. package/src/components/command.ts +2 -2
  40. package/src/components/index.ts +1 -1
  41. package/src/components/layout-switcher.ts +83 -0
  42. package/src/components/part-name.ts +1 -1
  43. package/src/components/tasks.ts +1 -1
  44. package/src/contributions/default-layout-contributions.ts +10 -0
  45. package/src/contributions/default-ui-contributions.ts +3 -3
  46. package/src/contributions/index.ts +1 -0
  47. package/src/contributions/marketplace-catalog-contributions.ts +1 -1
  48. package/src/core/apploader.ts +182 -99
  49. package/src/core/constants.ts +1 -0
  50. package/src/core/contributionregistry.ts +8 -10
  51. package/src/core/editorregistry.ts +4 -4
  52. package/src/core/index.ts +0 -1
  53. package/src/parts/contextmenu.ts +2 -2
  54. package/src/parts/toolbar.ts +3 -3
  55. package/src/vite-env.d.ts +9 -0
  56. package/src/vite-plugin-resolve-deps.ts +112 -0
  57. package/dist/components/app-selector.d.ts +0 -17
  58. package/dist/components/app-selector.d.ts.map +0 -1
  59. package/dist/components/app-switcher.d.ts.map +0 -1
  60. package/dist/core/app-host-config.d.ts +0 -7
  61. package/dist/core/app-host-config.d.ts.map +0 -1
  62. package/dist/core/packageinfoservice.d.ts +0 -16
  63. package/dist/core/packageinfoservice.d.ts.map +0 -1
  64. package/dist/resizable-grid-BRH3MyZK.js.map +0 -1
  65. package/dist/standard-layout-BSGa06lP.js.map +0 -1
  66. package/src/components/app-selector.ts +0 -233
  67. package/src/components/app-switcher.ts +0 -126
  68. package/src/core/app-host-config.ts +0 -23
  69. package/src/core/packageinfoservice.ts +0 -56
@@ -1,233 +0,0 @@
1
- import { html, css } from "lit";
2
- import { customElement, state } from "lit/decorators.js";
3
- import { LyraElement } from "../parts/element";
4
- import { appLoaderService, type AppDefinition } from "../core/apploader";
5
-
6
- @customElement('lyra-app-selector')
7
- export class LyraAppSelector extends LyraElement {
8
- @state()
9
- private apps: AppDefinition[] = [];
10
-
11
- @state()
12
- private loading = true;
13
-
14
- @state()
15
- private error: string | null = null;
16
-
17
- protected async doBeforeUI() {
18
- await this.loadApps();
19
- }
20
-
21
- private async loadApps() {
22
- try {
23
- this.loading = true;
24
- this.apps = appLoaderService.getRegisteredApps();
25
- this.loading = false;
26
- } catch (err) {
27
- this.error = err instanceof Error ? err.message : 'Failed to load apps';
28
- this.loading = false;
29
- }
30
- }
31
-
32
- private async selectApp(app: AppDefinition) {
33
- try {
34
- await appLoaderService.setPreferredAppId(app.id);
35
- await appLoaderService.loadApp(app.id, document.body);
36
- } catch (err) {
37
- this.error = err instanceof Error ? err.message : 'Failed to load app';
38
- }
39
- }
40
-
41
- protected render() {
42
- if (this.loading) {
43
- return html`
44
- <div class="selector-container">
45
- <wa-spinner></wa-spinner>
46
- <p>Loading available apps...</p>
47
- </div>
48
- `;
49
- }
50
-
51
- if (this.error) {
52
- return html`
53
- <div class="selector-container">
54
- <wa-icon name="triangle-exclamation" class="error-icon"></wa-icon>
55
- <p class="error-message">${this.error}</p>
56
- <wa-button @click=${() => this.loadApps()}>Retry</wa-button>
57
- </div>
58
- `;
59
- }
60
-
61
- if (this.apps.length === 0) {
62
- return html`
63
- <div class="selector-container">
64
- <wa-icon name="folder-open" class="empty-icon"></wa-icon>
65
- <h2>No Apps Available</h2>
66
- <p>No applications are currently registered.</p>
67
- </div>
68
- `;
69
- }
70
-
71
- return html`
72
- <div class="selector-container">
73
- <div class="header">
74
- <h1>Select an Application</h1>
75
- <p>Choose an application to load</p>
76
- </div>
77
-
78
- <div class="app-list">
79
- ${this.apps.map(app => html`
80
- <div
81
- class="app-card"
82
- @click=${() => this.selectApp(app)}
83
- @keydown=${(e: KeyboardEvent) => {
84
- if (e.key === 'Enter' || e.key === ' ') {
85
- e.preventDefault();
86
- this.selectApp(app);
87
- }
88
- }}
89
- tabindex="0"
90
- role="button">
91
- <div class="app-header">
92
- <h3 class="app-name">${app.name}</h3>
93
- ${app.version ? html`<span class="app-version">v${app.version}</span>` : ''}
94
- </div>
95
- ${app.description ? html`<p class="app-description">${app.description}</p>` : ''}
96
- <div class="app-id">ID: ${app.id}</div>
97
- </div>
98
- `)}
99
- </div>
100
- </div>
101
- `;
102
- }
103
-
104
- static styles = css`
105
- :host {
106
- display: flex;
107
- flex-direction: column;
108
- width: 100%;
109
- height: 100vh;
110
- align-items: center;
111
- justify-content: center;
112
- background: var(--wa-color-neutral-background-base);
113
- }
114
-
115
- .selector-container {
116
- display: flex;
117
- flex-direction: column;
118
- align-items: center;
119
- justify-content: center;
120
- max-width: 800px;
121
- width: 100%;
122
- padding: 2rem;
123
- box-sizing: border-box;
124
- }
125
-
126
- .header {
127
- text-align: center;
128
- margin-bottom: 2rem;
129
- }
130
-
131
- .header h1 {
132
- margin: 0 0 0.5rem 0;
133
- font-size: 2rem;
134
- font-weight: 600;
135
- color: var(--wa-color-neutral-foreground-loud);
136
- }
137
-
138
- .header p {
139
- margin: 0;
140
- color: var(--wa-color-neutral-foreground-quiet);
141
- }
142
-
143
- .app-list {
144
- display: grid;
145
- grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
146
- gap: 1rem;
147
- width: 100%;
148
- }
149
-
150
- .app-card {
151
- display: flex;
152
- flex-direction: column;
153
- padding: 1.5rem;
154
- border: 1px solid var(--wa-color-neutral-border-loud);
155
- border-radius: var(--wa-border-radius-medium);
156
- background: var(--wa-color-neutral-background-base);
157
- cursor: pointer;
158
- transition: all 0.2s ease;
159
- box-sizing: border-box;
160
- }
161
-
162
- .app-card:hover {
163
- border-color: var(--wa-color-brand-border-loud);
164
- background: var(--wa-color-brand-fill-quiet);
165
- transform: translateY(-2px);
166
- box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
167
- }
168
-
169
- .app-card:focus {
170
- outline: 2px solid var(--wa-color-brand-border-loud);
171
- outline-offset: 2px;
172
- }
173
-
174
- .app-header {
175
- display: flex;
176
- justify-content: space-between;
177
- align-items: flex-start;
178
- margin-bottom: 0.75rem;
179
- }
180
-
181
- .app-name {
182
- margin: 0;
183
- font-size: 1.25rem;
184
- font-weight: 600;
185
- color: var(--wa-color-neutral-foreground-loud);
186
- flex: 1;
187
- }
188
-
189
- .app-version {
190
- font-size: 0.875rem;
191
- color: var(--wa-color-neutral-foreground-quiet);
192
- padding: 0.25rem 0.5rem;
193
- background: var(--wa-color-neutral-fill-quiet);
194
- border-radius: var(--wa-border-radius-small);
195
- }
196
-
197
- .app-description {
198
- margin: 0 0 0.75rem 0;
199
- color: var(--wa-color-neutral-foreground-base);
200
- line-height: 1.5;
201
- }
202
-
203
- .app-id {
204
- font-size: 0.75rem;
205
- color: var(--wa-color-neutral-foreground-quiet);
206
- font-family: monospace;
207
- margin-top: auto;
208
- }
209
-
210
- .empty-icon,
211
- .error-icon {
212
- font-size: 4rem;
213
- color: var(--wa-color-neutral-foreground-quiet);
214
- margin-bottom: 1rem;
215
- }
216
-
217
- .error-message {
218
- color: var(--wa-color-danger-foreground-loud);
219
- margin-bottom: 1rem;
220
- }
221
-
222
- wa-spinner {
223
- margin-bottom: 1rem;
224
- }
225
- `;
226
- }
227
-
228
- declare global {
229
- interface HTMLElementTagNameMap {
230
- 'lyra-app-selector': LyraAppSelector;
231
- }
232
- }
233
-
@@ -1,126 +0,0 @@
1
- import { html, css } from "lit";
2
- import { customElement, state } from "lit/decorators.js";
3
- import { LyraElement } from "../parts/element";
4
- import { appLoaderService, type AppDefinition } from "../core/apploader";
5
- import { contributionRegistry } from "../core/contributionregistry";
6
- import { CLOSE_BUTTON, DIALOG_CONTRIBUTION_TARGET, dialogService } from "../core/dialogservice";
7
-
8
- const APP_SWITCHER_DIALOG_ID = 'app-switcher';
9
-
10
- contributionRegistry.registerContribution(DIALOG_CONTRIBUTION_TARGET, {
11
- id: APP_SWITCHER_DIALOG_ID,
12
- label: "Switch Application",
13
- buttons: [CLOSE_BUTTON],
14
- component: (state?: any) => {
15
- const apps: AppDefinition[] = state?.apps || [];
16
- const currentAppId: string | undefined = state?.currentAppId;
17
- const selectApp = state?.selectApp as (app: AppDefinition) => void;
18
-
19
- return html`
20
- <wa-scroller orientation="vertical" style="min-width: 300px; max-height: 400px; padding: var(--wa-space-m);">
21
- <div style="display: flex; flex-direction: column; gap: var(--wa-space-s);">
22
- ${apps.map(app => html`
23
- <wa-card
24
- style="cursor: pointer;"
25
- variant=${app.id === currentAppId ? 'brand' : 'neutral'}
26
- @click=${() => selectApp(app)}>
27
- <div style="display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: var(--wa-space-xs);">
28
- <span style="font-weight: 600;">${app.name}</span>
29
- ${app.version ? html`<wa-badge variant="neutral">v${app.version}</wa-badge>` : ''}
30
- </div>
31
- ${app.description ? html`<p style="margin: 0; font-size: 0.875rem; line-height: 1.4;">${app.description}</p>` : ''}
32
- <div style="font-size: 0.75rem; color: var(--wa-color-neutral-foreground-quiet); font-family: monospace; margin-top: var(--wa-space-xs);">ID: ${app.id}</div>
33
- </wa-card>
34
- `)}
35
- </div>
36
- </wa-scroller>
37
- `;
38
- },
39
- onButton: async () => true,
40
- });
41
-
42
- const showAppSwitcherDialog = async (): Promise<void> => {
43
- const apps = appLoaderService.getRegisteredApps();
44
- const currentApp = appLoaderService.getCurrentApp();
45
-
46
- if (apps.length === 0) {
47
- return;
48
- }
49
-
50
- const state = {
51
- apps,
52
- currentAppId: currentApp?.id,
53
- selectApp: async (app: AppDefinition) => {
54
- if (app.id === currentApp?.id) {
55
- state.close?.();
56
- return;
57
- }
58
-
59
- try {
60
- await appLoaderService.setPreferredAppId(app.id);
61
- await appLoaderService.loadApp(app.id, document.body);
62
- } catch (error) {
63
- console.error('Failed to switch app:', error);
64
- } finally {
65
- state.close?.();
66
- }
67
- },
68
- close: undefined as (() => void) | undefined,
69
- };
70
-
71
- await dialogService.open(APP_SWITCHER_DIALOG_ID, state);
72
- };
73
-
74
- @customElement('lyra-app-switcher')
75
- export class LyraAppSwitcher extends LyraElement {
76
- @state()
77
- private currentApp: AppDefinition | undefined;
78
-
79
- protected doBeforeUI() {
80
- this.currentApp = appLoaderService.getCurrentApp();
81
-
82
- const updateCurrentApp = () => {
83
- this.currentApp = appLoaderService.getCurrentApp();
84
- this.requestUpdate();
85
- };
86
-
87
- window.addEventListener('app-loaded', updateCurrentApp);
88
-
89
- return () => {
90
- window.removeEventListener('app-loaded', updateCurrentApp);
91
- };
92
- }
93
-
94
- protected render() {
95
- const apps = appLoaderService.getRegisteredApps();
96
- const appName = this.currentApp?.name || 'No App';
97
-
98
- if (apps.length <= 1) {
99
- return html``;
100
- }
101
-
102
- return html`
103
- <wa-button
104
- appearance="plain"
105
- size="small"
106
- title="Current app: ${appName}. Click to switch applications."
107
- @click=${() => showAppSwitcherDialog()}>
108
- <wa-icon name="grip" style="margin-right: 0.5rem;"></wa-icon>
109
- ${appName}
110
- </wa-button>
111
- `;
112
- }
113
-
114
- static styles = css`
115
- :host {
116
- display: inline-block;
117
- }
118
- `;
119
- }
120
-
121
- declare global {
122
- interface HTMLElementTagNameMap {
123
- 'lyra-app-switcher': LyraAppSwitcher;
124
- }
125
- }
126
-
@@ -1,23 +0,0 @@
1
- import type { PackageInfo } from './packageinfoservice';
2
- import { packageInfoService } from './packageinfoservice';
3
- import { marketplaceRegistry } from './marketplaceregistry';
4
-
5
- let applied = false;
6
-
7
- export interface AppHostConfig {
8
- packageInfo?: PackageInfo;
9
- marketplaceCatalogUrls?: string[];
10
- }
11
-
12
- export function applyAppHostConfig(config: AppHostConfig): void {
13
- if (applied) return;
14
- applied = true;
15
- if (config.packageInfo) {
16
- packageInfoService.addPackage(config.packageInfo);
17
- }
18
- if (config.marketplaceCatalogUrls?.length) {
19
- config.marketplaceCatalogUrls.forEach((url) => {
20
- marketplaceRegistry.addCatalogUrl(url).catch(() => {});
21
- });
22
- }
23
- }
@@ -1,56 +0,0 @@
1
- import { html, TemplateResult } from "lit";
2
- import { rootContext } from "./di";
3
-
4
- export interface PackageInfo {
5
- name: string;
6
- version: string;
7
- dependencies?: Record<string, string>;
8
- devDependencies?: Record<string, string>;
9
- }
10
-
11
- class PackageInfoService {
12
- private packages: PackageInfo[] = [];
13
-
14
- addPackage(packageInfo: PackageInfo): void {
15
- this.packages.push(packageInfo);
16
- }
17
-
18
- hasPackages(): boolean {
19
- return this.packages.length > 0 && this.packages.some(pkg =>
20
- pkg.dependencies && Object.keys(pkg.dependencies).length > 0
21
- );
22
- }
23
-
24
- renderTree(): TemplateResult {
25
- if (this.packages.length === 0) {
26
- return html``;
27
- }
28
-
29
- return html`
30
- <wa-tree style="--indent-guide-width: 1px;">
31
- ${this.packages.map(pkg => {
32
- const deps = pkg.dependencies || {};
33
- const depEntries = Object.entries(deps);
34
-
35
- if (depEntries.length === 0) {
36
- return html``;
37
- }
38
-
39
- return html`
40
- <wa-tree-item expanded>
41
- <span>${pkg.name}</span>
42
- ${depEntries.map(([name, version]) => html`
43
- <wa-tree-item>
44
- <span>${name} <small>${version}</small></span>
45
- </wa-tree-item>
46
- `)}
47
- </wa-tree-item>
48
- `;
49
- })}
50
- </wa-tree>
51
- `;
52
- }
53
- }
54
-
55
- export const packageInfoService = new PackageInfoService();
56
- rootContext.put("packageInfoService", packageInfoService);