@eclipse-docks/core 0.7.127 → 0.7.130

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 (85) hide show
  1. package/dist/api/index.js +3 -3
  2. package/dist/api/services.d.ts +3 -1
  3. package/dist/api/services.d.ts.map +1 -1
  4. package/dist/{api-Da9zQcfd.js → api-oPg3Bv1S.js} +243 -264
  5. package/dist/api-oPg3Bv1S.js.map +1 -0
  6. package/dist/components/attribution.d.ts +1 -0
  7. package/dist/components/attribution.d.ts.map +1 -1
  8. package/dist/components/command.d.ts +0 -1
  9. package/dist/components/command.d.ts.map +1 -1
  10. package/dist/components/extensions.d.ts +3 -0
  11. package/dist/components/extensions.d.ts.map +1 -1
  12. package/dist/components/language-selector.d.ts.map +1 -1
  13. package/dist/components/layout-switcher.d.ts +1 -1
  14. package/dist/components/layout-switcher.d.ts.map +1 -1
  15. package/dist/components/npm-packages.d.ts +1 -0
  16. package/dist/components/npm-packages.d.ts.map +1 -1
  17. package/dist/components/release-history.d.ts +9 -2
  18. package/dist/components/release-history.d.ts.map +1 -1
  19. package/dist/components/tasks.d.ts.map +1 -1
  20. package/dist/core/apploader.d.ts +2 -9
  21. package/dist/core/apploader.d.ts.map +1 -1
  22. package/dist/core/contribution-targets.d.ts +1 -0
  23. package/dist/core/contribution-targets.d.ts.map +1 -1
  24. package/dist/core/dialogservice.d.ts +3 -1
  25. package/dist/core/dialogservice.d.ts.map +1 -1
  26. package/dist/core/dropdown-item.d.ts +8 -0
  27. package/dist/core/dropdown-item.d.ts.map +1 -1
  28. package/dist/core/layout-panels.d.ts +25 -0
  29. package/dist/core/layout-panels.d.ts.map +1 -0
  30. package/dist/dialogs/navigable-info-dialog.d.ts.map +1 -1
  31. package/dist/dialogs/version-info-dialog.d.ts +18 -2
  32. package/dist/dialogs/version-info-dialog.d.ts.map +1 -1
  33. package/dist/externals/lit.js +1 -1
  34. package/dist/externals/webawesome.js +1 -1
  35. package/dist/index.js +3 -3
  36. package/dist/layouts/standard-layout.d.ts +9 -1
  37. package/dist/layouts/standard-layout.d.ts.map +1 -1
  38. package/dist/parts/contextmenu.d.ts.map +1 -1
  39. package/dist/parts/index.js +1 -1
  40. package/dist/parts/part.d.ts +2 -0
  41. package/dist/parts/part.d.ts.map +1 -1
  42. package/dist/parts/resizable-grid.d.ts +10 -3
  43. package/dist/parts/resizable-grid.d.ts.map +1 -1
  44. package/dist/parts/tabs.d.ts +6 -0
  45. package/dist/parts/tabs.d.ts.map +1 -1
  46. package/dist/{parts-CRVxaDd-.js → parts-CAt8aeU8.js} +1050 -586
  47. package/dist/parts-CAt8aeU8.js.map +1 -0
  48. package/dist/{webawesome-Y1_HnKa_.js → webawesome-BGXn04Mw.js} +18 -10
  49. package/dist/webawesome-BGXn04Mw.js.map +1 -0
  50. package/package.json +1 -1
  51. package/src/api/services.ts +12 -0
  52. package/src/components/attribution.ts +2 -0
  53. package/src/components/command.ts +2 -8
  54. package/src/components/extensions.ts +20 -3
  55. package/src/components/language-selector.ts +0 -1
  56. package/src/components/layout-switcher.ts +39 -26
  57. package/src/components/npm-packages.ts +2 -0
  58. package/src/components/release-history.ts +29 -40
  59. package/src/components/tasks.ts +0 -1
  60. package/src/contributions/default-layout-contributions.ts +7 -43
  61. package/src/contributions/default-ui-contributions.ts +4 -4
  62. package/src/core/apploader.ts +7 -54
  63. package/src/core/contribution-targets.ts +1 -0
  64. package/src/core/dialogservice.ts +76 -19
  65. package/src/core/dropdown-item.ts +52 -17
  66. package/src/core/layout-panels.ts +121 -0
  67. package/src/dialogs/navigable-info-dialog.ts +5 -2
  68. package/src/dialogs/version-info-dialog.ts +163 -21
  69. package/src/icons/icons.txt +4 -2
  70. package/src/icons/layout-standard-bottom-panel.svg +4 -4
  71. package/src/icons/layout-standard-full.svg +4 -4
  72. package/src/icons/layout-standard-left-aux.svg +8 -0
  73. package/src/icons/layout-standard-left-sidebar.svg +5 -0
  74. package/src/icons/layout-standard-right-aux.svg +8 -0
  75. package/src/icons/layout-standard-right-sidebar.svg +5 -0
  76. package/src/layouts/standard-layout.ts +81 -5
  77. package/src/parts/contextmenu.ts +2 -1
  78. package/src/parts/part.ts +24 -0
  79. package/src/parts/resizable-grid.ts +125 -57
  80. package/src/parts/tabs.ts +103 -0
  81. package/dist/api-Da9zQcfd.js.map +0 -1
  82. package/dist/parts-CRVxaDd-.js.map +0 -1
  83. package/dist/webawesome-Y1_HnKa_.js.map +0 -1
  84. package/src/icons/layout-standard-bottom-sidebar.svg +0 -6
  85. package/src/icons/layout-standard.svg +0 -6
@@ -1,22 +1,42 @@
1
- import { html, css } from "lit";
2
- import { customElement } from "lit/decorators.js";
1
+ import { html, css, nothing } from "lit";
2
+ import { customElement, property, state } from "lit/decorators.js";
3
3
  import type { PropertyValues } from "lit";
4
4
  import { DocksDialogContent } from "../parts/dialog-content";
5
5
  import { contributionRegistry } from "../core/contributionregistry";
6
6
  import {
7
7
  DIALOG_CONTRIBUTION_TARGET,
8
- CLOSE_BUTTON,
9
8
  type DialogContribution,
10
- type DialogButton,
11
9
  dialogService,
12
10
  } from "../core/dialogservice";
13
11
  import { ABOUT_TABS } from "../core/contribution-targets";
12
+ import { ABOUT_TAB_RELEASE } from "../core/contribution-names";
14
13
  import { appLoaderService } from "../core/apploader";
14
+ import { DocksReleaseHistory, type ReleaseHistoryNavState } from "../components/release-history";
15
+ import type { DocksTabs } from "../parts/tabs";
15
16
 
16
- const CLOSE_PRIMARY: DialogButton = { ...CLOSE_BUTTON, variant: "primary" };
17
+ const EMPTY_NAV: ReleaseHistoryNavState = {
18
+ hasMultiple: false,
19
+ atOldest: true,
20
+ atNewest: true,
21
+ };
22
+
23
+ @customElement("docks-version-info-dialog")
24
+ export class DocksVersionInfoDialog extends DocksDialogContent {
25
+ @property({ type: String })
26
+ label = "";
27
+
28
+ @property({ attribute: false })
29
+ close?: () => void;
30
+
31
+ @property({ attribute: false })
32
+ onAfterHide?: () => void;
33
+
34
+ @state()
35
+ private activeTab: string | null = null;
36
+
37
+ @state()
38
+ private releaseNav: ReleaseHistoryNavState = EMPTY_NAV;
17
39
 
18
- @customElement("docks-version-info-dialog-content")
19
- export class DocksVersionInfoDialogContent extends DocksDialogContent {
20
40
  static styles = [
21
41
  ...DocksDialogContent.styles,
22
42
  css`
@@ -24,54 +44,176 @@ export class DocksVersionInfoDialogContent extends DocksDialogContent {
24
44
  display: block;
25
45
  }
26
46
 
47
+ wa-dialog {
48
+ --width: 600px;
49
+ }
50
+
51
+ wa-dialog::part(body) {
52
+ display: flex;
53
+ flex-direction: column;
54
+ min-height: 0;
55
+ overflow: hidden;
56
+ }
57
+
27
58
  .dialog-body {
28
59
  display: flex;
29
60
  flex-direction: column;
30
61
  gap: 0.75rem;
31
62
  min-width: 32rem;
32
- height: 600px;
63
+ height: min(70vh, 36rem);
64
+ min-height: min(70vh, 36rem);
65
+ overflow: hidden;
33
66
  }
34
67
 
35
68
  .dialog-body docks-tabs {
36
- flex: 1;
69
+ flex: 1 1 auto;
37
70
  min-height: 0;
71
+ overflow: hidden;
72
+ }
73
+
74
+ .dialog-footer {
75
+ display: flex;
76
+ gap: 0.5rem;
77
+ justify-content: flex-end;
78
+ width: 100%;
38
79
  }
39
80
  `,
40
81
  ];
41
82
 
42
83
  protected firstUpdated(changed: PropertyValues) {
43
84
  super.firstUpdated(changed);
44
- const dialog = this.closest("wa-dialog");
45
- if (dialog) {
46
- dialog.style.setProperty("--width", "600px");
47
- dialog.setAttribute("light-dismiss", "");
85
+ this.addEventListener("release-history-changed", this.onReleaseHistoryChanged);
86
+ this.updateComplete.then(() => {
87
+ this.attachTabListener();
88
+ this.syncActiveTab();
89
+ this.syncReleaseNav();
90
+ });
91
+ }
92
+
93
+ disconnectedCallback() {
94
+ this.removeEventListener("release-history-changed", this.onReleaseHistoryChanged);
95
+ super.disconnectedCallback();
96
+ }
97
+
98
+ private onReleaseHistoryChanged = () => {
99
+ this.syncReleaseNav();
100
+ };
101
+
102
+ private attachTabListener() {
103
+ const tabGroup = this.getAboutTabs()?.shadowRoot?.querySelector("wa-tab-group");
104
+ if (!tabGroup || tabGroup.hasAttribute("data-version-info-listener")) {
105
+ return;
48
106
  }
107
+ tabGroup.setAttribute("data-version-info-listener", "");
108
+ tabGroup.addEventListener("wa-tab-show", (event: Event) => {
109
+ const name = (event as CustomEvent<{ name: string }>).detail?.name;
110
+ if (name) {
111
+ this.activeTab = name;
112
+ }
113
+ });
114
+ }
115
+
116
+ private getAboutTabs(): DocksTabs | null {
117
+ return this.renderRoot.querySelector("docks-tabs") as DocksTabs | null;
118
+ }
119
+
120
+ private getReleaseHistory(): DocksReleaseHistory | null {
121
+ const part = this.getAboutTabs()?.getTabPart(ABOUT_TAB_RELEASE);
122
+ return part instanceof DocksReleaseHistory ? part : null;
123
+ }
124
+
125
+ private syncActiveTab() {
126
+ const tabGroup = this.getAboutTabs()?.shadowRoot?.querySelector("wa-tab-group") as
127
+ | (HTMLElement & { active?: string })
128
+ | null;
129
+ this.activeTab = tabGroup?.getAttribute("active") || tabGroup?.active || null;
130
+ }
131
+
132
+ private syncReleaseNav() {
133
+ this.releaseNav = this.getReleaseHistory()?.getNavState() ?? EMPTY_NAV;
134
+ }
135
+
136
+ private handleClose() {
137
+ const dialog = this.renderRoot.querySelector("wa-dialog") as (HTMLElement & { open?: boolean }) | null;
138
+ if (dialog && dialog.open !== false) {
139
+ dialog.open = false;
140
+ return;
141
+ }
142
+ this.close?.();
143
+ }
144
+
145
+ private handleAfterHide() {
146
+ this.onAfterHide?.();
147
+ }
148
+
149
+ private showOlderRelease() {
150
+ this.getReleaseHistory()?.showOlder();
151
+ }
152
+
153
+ private showNewerRelease() {
154
+ this.getReleaseHistory()?.showNewer();
49
155
  }
50
156
 
51
157
  render() {
52
158
  const app = appLoaderService.getCurrentApp();
159
+ const onReleaseTab = this.activeTab === ABOUT_TAB_RELEASE;
160
+ const showReleaseNav = onReleaseTab && this.releaseNav.hasMultiple;
53
161
 
54
162
  return html`
55
- <div class="dialog-body">
56
- ${app?.description ? html`<small>${app.description}</small>` : ""}
57
- <docks-tabs id=${ABOUT_TABS}></docks-tabs>
58
- </div>
163
+ <wa-dialog
164
+ label=${this.label}
165
+ open
166
+ light-dismiss
167
+ with-footer
168
+ @wa-after-hide=${this.handleAfterHide}
169
+ >
170
+ <div class="dialog-body">
171
+ ${app?.description ? html`<small>${app.description}</small>` : ""}
172
+ <docks-tabs id=${ABOUT_TABS} fill-height></docks-tabs>
173
+ </div>
174
+ <div slot="footer" class="dialog-footer">
175
+ ${showReleaseNav
176
+ ? html`
177
+ <wa-button
178
+ variant="default"
179
+ ?disabled=${this.releaseNav.atOldest}
180
+ @click=${this.showOlderRelease}
181
+ >
182
+ ← Previous
183
+ </wa-button>
184
+ <wa-button
185
+ variant="default"
186
+ ?disabled=${this.releaseNav.atNewest}
187
+ @click=${this.showNewerRelease}
188
+ >
189
+ Next →
190
+ </wa-button>
191
+ `
192
+ : nothing}
193
+ <wa-button variant="primary" @click=${this.handleClose}>Close</wa-button>
194
+ </div>
195
+ </wa-dialog>
59
196
  `;
60
197
  }
61
198
  }
62
199
 
63
200
  declare global {
64
201
  interface HTMLElementTagNameMap {
65
- "docks-version-info-dialog-content": DocksVersionInfoDialogContent;
202
+ "docks-version-info-dialog": DocksVersionInfoDialog;
66
203
  }
67
204
  }
68
205
 
69
206
  contributionRegistry.registerContribution<DialogContribution>(DIALOG_CONTRIBUTION_TARGET, {
70
207
  id: "version-info",
71
208
  label: "About",
72
- buttons: [CLOSE_PRIMARY],
73
- component: () => html`<docks-version-info-dialog-content></docks-version-info-dialog-content>`,
74
- onButton: async () => true,
209
+ selfContained: true,
210
+ component: (state) => html`
211
+ <docks-version-info-dialog
212
+ .label=${state?.label ?? ""}
213
+ .close=${state?.close}
214
+ .onAfterHide=${state?.onAfterHide}
215
+ ></docks-version-info-dialog>
216
+ `,
75
217
  });
76
218
 
77
219
  export function versionInfoDialog(): Promise<void> {
@@ -4,9 +4,11 @@
4
4
  - python.svg: Licence=MIT, Author=Garuda Technology, Source=https://www.svgrepo.com/svg/452091/python
5
5
  - js.svg: Licence=MIT, Author=Garuda Technology, Source=https://www.svgrepo.com/svg/452045/js
6
6
  - jupyter.svg: Licence=Logo License, Author=gilbarbara, Source=https://www.svgrepo.com/svg/353949/jupyter
7
- - layout-standard.svg: Licence=Project-internal, Author=Eclipse Docks Team
7
+ - layout-standard-left-sidebar.svg: Licence=Project-internal, Author=Eclipse Docks Team
8
+ - layout-standard-right-sidebar.svg: Licence=Project-internal, Author=Eclipse Docks Team
8
9
  - layout-standard-bottom-panel.svg: Licence=Project-internal, Author=Eclipse Docks Team
9
- - layout-standard-bottom-sidebar.svg: Licence=Project-internal, Author=Eclipse Docks Team
10
+ - layout-standard-left-aux.svg: Licence=Project-internal, Author=Eclipse Docks Team
11
+ - layout-standard-right-aux.svg: Licence=Project-internal, Author=Eclipse Docks Team
10
12
  - layout-standard-full.svg: Licence=Project-internal, Author=Eclipse Docks Team
11
13
  - mark-github.svg: Licence=MIT, Author=GitHub, Source=https://github.com/primer/octicons (icons/mark-github-16.svg)
12
14
  - file-plus.svg: Licence=Project-internal, Author=Eclipse Docks Team
@@ -1,6 +1,6 @@
1
1
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true">
2
- <rect x="4" y="3" width="12" height="8" rx="1.25" ry="1.25"
3
- fill="none" stroke="currentColor" stroke-width="1.25" stroke-linejoin="round"/>
4
- <line x1="2" y1="20" x2="18" y2="20" stroke="#3b82f6" stroke-width="2" stroke-linecap="round"/>
5
- <line x1="20" y1="2" x2="20" y2="22" stroke="#3b82f6" stroke-width="2" stroke-linecap="round"/>
2
+ <rect x="4" y="3" width="16" height="11" rx="1.25" ry="1.25"
3
+ fill="none" stroke="#9ca3af" stroke-width="1.25" stroke-linejoin="round"/>
4
+ <rect x="4" y="16" width="16" height="5" rx="1.25" ry="1.25"
5
+ fill="#2563eb" fill-opacity="0.2" stroke="#2563eb" stroke-width="1.25" stroke-linejoin="round"/>
6
6
  </svg>
@@ -1,7 +1,7 @@
1
1
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true">
2
2
  <rect x="8" y="4" width="8" height="8" rx="1.25" ry="1.25"
3
- fill="none" stroke="currentColor" stroke-width="1.25" stroke-linejoin="round"/>
4
- <line x1="2.5" y1="2" x2="2.5" y2="22" stroke="#3b82f6" stroke-width="2" stroke-linecap="round"/>
5
- <line x1="21.5" y1="2" x2="21.5" y2="22" stroke="#3b82f6" stroke-width="2" stroke-linecap="round"/>
6
- <line x1="6" y1="20" x2="18" y2="20" stroke="#3b82f6" stroke-width="2" stroke-linecap="round"/>
3
+ fill="none" stroke="#9ca3af" stroke-width="1.25" stroke-linejoin="round"/>
4
+ <line x1="2.5" y1="2" x2="2.5" y2="22" stroke="#2563eb" stroke-width="2" stroke-linecap="round"/>
5
+ <line x1="21.5" y1="2" x2="21.5" y2="22" stroke="#2563eb" stroke-width="2" stroke-linecap="round"/>
6
+ <line x1="6" y1="20" x2="18" y2="20" stroke="#2563eb" stroke-width="2" stroke-linecap="round"/>
7
7
  </svg>
@@ -0,0 +1,8 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true">
2
+ <rect x="8" y="4" width="12" height="16" rx="1.25" ry="1.25"
3
+ fill="none" stroke="#9ca3af" stroke-width="1.25" stroke-linejoin="round"/>
4
+ <rect x="2" y="4" width="5" height="7" rx="1" ry="1"
5
+ fill="none" stroke="#9ca3af" stroke-width="1.25" stroke-linejoin="round"/>
6
+ <rect x="2" y="13" width="5" height="7" rx="1" ry="1"
7
+ fill="#2563eb" fill-opacity="0.2" stroke="#2563eb" stroke-width="1.25" stroke-linejoin="round"/>
8
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true">
2
+ <rect x="7" y="4" width="13" height="16" rx="1.25" ry="1.25"
3
+ fill="none" stroke="#9ca3af" stroke-width="1.25" stroke-linejoin="round"/>
4
+ <line x1="2.5" y1="2" x2="2.5" y2="22" stroke="#2563eb" stroke-width="2" stroke-linecap="round"/>
5
+ </svg>
@@ -0,0 +1,8 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true">
2
+ <rect x="4" y="4" width="12" height="16" rx="1.25" ry="1.25"
3
+ fill="none" stroke="#9ca3af" stroke-width="1.25" stroke-linejoin="round"/>
4
+ <rect x="17" y="4" width="5" height="7" rx="1" ry="1"
5
+ fill="none" stroke="#9ca3af" stroke-width="1.25" stroke-linejoin="round"/>
6
+ <rect x="17" y="13" width="5" height="7" rx="1" ry="1"
7
+ fill="#2563eb" fill-opacity="0.2" stroke="#2563eb" stroke-width="1.25" stroke-linejoin="round"/>
8
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true">
2
+ <rect x="4" y="4" width="13" height="16" rx="1.25" ry="1.25"
3
+ fill="none" stroke="#9ca3af" stroke-width="1.25" stroke-linejoin="round"/>
4
+ <line x1="21.5" y1="2" x2="21.5" y2="22" stroke="#2563eb" stroke-width="2" stroke-linecap="round"/>
5
+ </svg>
@@ -6,6 +6,7 @@ import {
6
6
  SIDEBAR_MAIN,
7
7
  SIDEBAR_MAIN_BOTTOM,
8
8
  SIDEBAR_AUXILIARY,
9
+ SIDEBAR_AUXILIARY_BOTTOM,
9
10
  PANEL_BOTTOM,
10
11
  TOOLBAR_MAIN,
11
12
  TOOLBAR_MAIN_CENTER,
@@ -14,15 +15,22 @@ import {
14
15
  TOOLBAR_BOTTOM_CENTER,
15
16
  TOOLBAR_BOTTOM_END
16
17
  } from "../core/contribution-targets";
18
+ import { appLoaderService } from "../core/apploader";
19
+ import { appSettings } from "../core/settingsservice";
20
+ import {
21
+ LAYOUT_PANEL_SETTINGS_KEY,
22
+ resolveStoredPanelVisibility,
23
+ type LayoutPanelVisibility,
24
+ } from "../core/layout-panels";
17
25
  import {DocksContainer} from "../parts/container";
18
26
 
19
27
  @customElement('docks-standard-layout')
20
28
  export class DocksStandardLayout extends DocksContainer {
21
- @property({type: Boolean, attribute: 'show-bottom-sidebar'})
22
- showBottomSidebar: boolean = false;
29
+ @property({type: Boolean, attribute: 'show-left-aux'})
30
+ showLeftAux: boolean = false;
23
31
 
24
32
  @property({type: Boolean, attribute: 'show-bottom-panel'})
25
- showBottomPanel: boolean = false;
33
+ showBottomPanel: boolean = true;
26
34
 
27
35
  @property({type: Boolean, attribute: 'show-left-sidebar'})
28
36
  showLeftSidebar: boolean = true;
@@ -30,10 +38,65 @@ export class DocksStandardLayout extends DocksContainer {
30
38
  @property({type: Boolean, attribute: 'show-aux-sidebar'})
31
39
  showAuxSidebar: boolean = true;
32
40
 
41
+ @property({type: Boolean, attribute: 'show-right-aux'})
42
+ showRightAux: boolean = false;
43
+
44
+ private panelsInitialized = false;
45
+
33
46
  createRenderRoot() {
34
47
  return this;
35
48
  }
36
49
 
50
+ getPanelVisibility(): LayoutPanelVisibility {
51
+ return {
52
+ showLeftSidebar: this.showLeftSidebar,
53
+ showAuxSidebar: this.showAuxSidebar,
54
+ showBottomPanel: this.showBottomPanel,
55
+ showLeftAux: this.showLeftAux,
56
+ showRightAux: this.showRightAux,
57
+ };
58
+ }
59
+
60
+ private applyPanelVisibility(panels: LayoutPanelVisibility): void {
61
+ this.showLeftSidebar = panels.showLeftSidebar;
62
+ this.showAuxSidebar = panels.showAuxSidebar;
63
+ this.showBottomPanel = panels.showBottomPanel;
64
+ this.showLeftAux = panels.showLeftAux;
65
+ this.showRightAux = panels.showRightAux;
66
+ }
67
+
68
+ async setPanelVisibility(panels: Partial<LayoutPanelVisibility>): Promise<void> {
69
+ const next = { ...this.getPanelVisibility(), ...panels };
70
+ this.applyPanelVisibility(next);
71
+ try {
72
+ await appSettings.set(LAYOUT_PANEL_SETTINGS_KEY, next);
73
+ } catch (error) {
74
+ console.error('Failed to persist layout panel visibility:', error);
75
+ throw error;
76
+ }
77
+ window.dispatchEvent(new CustomEvent('layout-panels-changed', {
78
+ detail: { panels: this.getPanelVisibility() },
79
+ }));
80
+ }
81
+
82
+ protected doInitUI() {
83
+ void this.initializePanelVisibility();
84
+ }
85
+
86
+ private async initializePanelVisibility(): Promise<void> {
87
+ if (this.panelsInitialized) {
88
+ return;
89
+ }
90
+ this.panelsInitialized = true;
91
+
92
+ const appLayout = appLoaderService.getCurrentApp()?.layout;
93
+ const panels = await resolveStoredPanelVisibility(appLayout);
94
+ this.applyPanelVisibility(panels);
95
+ window.dispatchEvent(new CustomEvent('layout-panels-changed', {
96
+ detail: { panels: this.getPanelVisibility() },
97
+ }));
98
+ }
99
+
37
100
  private getGridSizes(): string {
38
101
  if (this.showLeftSidebar && this.showAuxSidebar) {
39
102
  return "20%, 60%, 20%";
@@ -133,7 +196,7 @@ export class DocksStandardLayout extends DocksContainer {
133
196
 
134
197
  ${this.showLeftSidebar
135
198
  ? html`
136
- ${this.showBottomSidebar
199
+ ${this.showLeftAux
137
200
  ? html`
138
201
  <docks-resizable-grid
139
202
  id="left-sidebar-split"
@@ -163,7 +226,20 @@ export class DocksStandardLayout extends DocksContainer {
163
226
  }
164
227
 
165
228
  ${this.showAuxSidebar
166
- ? html`<docks-tabs id="${SIDEBAR_AUXILIARY}"></docks-tabs>`
229
+ ? html`
230
+ ${this.showRightAux
231
+ ? html`
232
+ <docks-resizable-grid
233
+ id="right-sidebar-split"
234
+ orientation="vertical"
235
+ sizes="50%, 50%">
236
+ <docks-tabs id="${SIDEBAR_AUXILIARY}"></docks-tabs>
237
+ <docks-tabs id="${SIDEBAR_AUXILIARY_BOTTOM}" placement="start" icon-only></docks-tabs>
238
+ </docks-resizable-grid>
239
+ `
240
+ : html`<docks-tabs id="${SIDEBAR_AUXILIARY}"></docks-tabs>`
241
+ }
242
+ `
167
243
  : nothing
168
244
  }
169
245
  </docks-resizable-grid>
@@ -10,7 +10,7 @@ import {
10
10
  import {subscribe} from "../core/events";
11
11
  import {closeSiblingSubmenus} from "../core/dropdown-menu-utils";
12
12
  import {createRef, ref} from "lit/directives/ref.js";
13
- import {renderDropdownContribution} from "../core/dropdown-item";
13
+ import {renderDropdownContribution, handleDropdownWaSelect} from "../core/dropdown-item";
14
14
 
15
15
  interface VirtualPopupAnchor {
16
16
  getBoundingClientRect(): DOMRect;
@@ -276,6 +276,7 @@ export class DocksContextMenu extends DocksElement {
276
276
  ${ref(this.dropdownRef)}
277
277
  ?open=${this.isOpen}
278
278
  @submenu-opening=${this.handleSubmenuOpening}
279
+ @wa-select=${handleDropdownWaSelect}
279
280
  @wa-after-hide=${this.onClose}>
280
281
  <span slot="trigger" hidden aria-hidden="true"></span>
281
282
 
package/src/parts/part.ts CHANGED
@@ -21,6 +21,10 @@ export abstract class DocksPart extends DocksContainer {
21
21
  @property({ type: Boolean, attribute: false })
22
22
  public isEditor: boolean = false;
23
23
 
24
+ /** Compact layout for dialog/tab embedding (no fill-height shell or nested scroll). */
25
+ @property({ type: Boolean, reflect: true })
26
+ embedded = false;
27
+
24
28
  protected commandStack?: CommandStack;
25
29
 
26
30
  public getCommandStack(): CommandStack | undefined {
@@ -294,6 +298,26 @@ export abstract class DocksPart extends DocksContainer {
294
298
  min-height: 100%;
295
299
  }
296
300
 
301
+ :host([embedded]) {
302
+ height: auto;
303
+ }
304
+
305
+ :host([embedded]) .part-shell {
306
+ height: auto;
307
+ overflow: visible;
308
+ grid-template-rows: auto;
309
+ }
310
+
311
+ :host([embedded]) .part-content {
312
+ overflow: visible;
313
+ min-height: 0;
314
+ }
315
+
316
+ :host([embedded]) .part-content-inner {
317
+ height: auto;
318
+ min-height: 0;
319
+ }
320
+
297
321
  .part-toolbar {
298
322
  min-height: 0;
299
323
  }