@eclipse-docks/core 0.7.126 → 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 (106) hide show
  1. package/dist/api/index.js +4 -4
  2. package/dist/api/services.d.ts +4 -0
  3. package/dist/api/services.d.ts.map +1 -1
  4. package/dist/{api-B3RXoez_.js → api-oPg3Bv1S.js} +422 -293
  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 +4 -5
  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/filebrowser.d.ts.map +1 -1
  13. package/dist/components/language-selector.d.ts.map +1 -1
  14. package/dist/components/layout-switcher.d.ts +1 -1
  15. package/dist/components/layout-switcher.d.ts.map +1 -1
  16. package/dist/components/npm-packages.d.ts +1 -0
  17. package/dist/components/npm-packages.d.ts.map +1 -1
  18. package/dist/components/release-history.d.ts +9 -2
  19. package/dist/components/release-history.d.ts.map +1 -1
  20. package/dist/components/tasks.d.ts.map +1 -1
  21. package/dist/core/apploader.d.ts +2 -9
  22. package/dist/core/apploader.d.ts.map +1 -1
  23. package/dist/core/contribution-names.d.ts +0 -2
  24. package/dist/core/contribution-names.d.ts.map +1 -1
  25. package/dist/core/contribution-targets.d.ts +1 -0
  26. package/dist/core/contribution-targets.d.ts.map +1 -1
  27. package/dist/core/contributionregistry.d.ts +3 -0
  28. package/dist/core/contributionregistry.d.ts.map +1 -1
  29. package/dist/core/dialogservice.d.ts +3 -1
  30. package/dist/core/dialogservice.d.ts.map +1 -1
  31. package/dist/core/dropdown-item.d.ts +43 -0
  32. package/dist/core/dropdown-item.d.ts.map +1 -0
  33. package/dist/core/dropdown-menu-utils.d.ts +5 -0
  34. package/dist/core/dropdown-menu-utils.d.ts.map +1 -1
  35. package/dist/core/layout-panels.d.ts +25 -0
  36. package/dist/core/layout-panels.d.ts.map +1 -0
  37. package/dist/dialogs/navigable-info-dialog.d.ts.map +1 -1
  38. package/dist/dialogs/version-info-dialog.d.ts +18 -2
  39. package/dist/dialogs/version-info-dialog.d.ts.map +1 -1
  40. package/dist/externals/lit.js +1 -1
  41. package/dist/externals/webawesome.js +1 -1
  42. package/dist/index.js +4 -4
  43. package/dist/layouts/standard-layout.d.ts +9 -1
  44. package/dist/layouts/standard-layout.d.ts.map +1 -1
  45. package/dist/parts/contextmenu.d.ts +5 -2
  46. package/dist/parts/contextmenu.d.ts.map +1 -1
  47. package/dist/parts/index.d.ts.map +1 -1
  48. package/dist/parts/index.js +1 -1
  49. package/dist/parts/part.d.ts +4 -0
  50. package/dist/parts/part.d.ts.map +1 -1
  51. package/dist/parts/resizable-grid.d.ts +10 -3
  52. package/dist/parts/resizable-grid.d.ts.map +1 -1
  53. package/dist/parts/tabs.d.ts +6 -0
  54. package/dist/parts/tabs.d.ts.map +1 -1
  55. package/dist/{parts-CsoNFVTw.js → parts-CAt8aeU8.js} +1361 -975
  56. package/dist/parts-CAt8aeU8.js.map +1 -0
  57. package/dist/{webawesome-Y1_HnKa_.js → webawesome-BGXn04Mw.js} +18 -10
  58. package/dist/webawesome-BGXn04Mw.js.map +1 -0
  59. package/dist/{widget-DbLusgAH.js → widget-BqQtioK1.js} +11 -5
  60. package/dist/widget-BqQtioK1.js.map +1 -0
  61. package/dist/widgets/index.js +1 -1
  62. package/dist/{widgets-DnnSZhsi.js → widgets-C9V42Mqq.js} +2 -2
  63. package/dist/{widgets-DnnSZhsi.js.map → widgets-C9V42Mqq.js.map} +1 -1
  64. package/package.json +1 -1
  65. package/src/api/services.ts +20 -0
  66. package/src/commands/filebrowser-contributions.ts +0 -16
  67. package/src/components/attribution.ts +2 -0
  68. package/src/components/command.ts +45 -119
  69. package/src/components/extensions.ts +20 -3
  70. package/src/components/filebrowser.ts +15 -12
  71. package/src/components/language-selector.ts +0 -1
  72. package/src/components/layout-switcher.ts +39 -26
  73. package/src/components/npm-packages.ts +2 -0
  74. package/src/components/release-history.ts +29 -40
  75. package/src/components/tasks.ts +0 -1
  76. package/src/contributions/default-layout-contributions.ts +7 -43
  77. package/src/contributions/default-ui-contributions.ts +4 -4
  78. package/src/core/apploader.ts +7 -54
  79. package/src/core/contribution-names.ts +0 -3
  80. package/src/core/contribution-targets.ts +1 -0
  81. package/src/core/contributionregistry.ts +19 -3
  82. package/src/core/dialogservice.ts +76 -19
  83. package/src/core/dropdown-item.ts +187 -0
  84. package/src/core/dropdown-menu-utils.ts +59 -0
  85. package/src/core/layout-panels.ts +121 -0
  86. package/src/dialogs/navigable-info-dialog.ts +5 -2
  87. package/src/dialogs/version-info-dialog.ts +163 -21
  88. package/src/icons/icons.txt +4 -2
  89. package/src/icons/layout-standard-bottom-panel.svg +4 -4
  90. package/src/icons/layout-standard-full.svg +4 -4
  91. package/src/icons/layout-standard-left-aux.svg +8 -0
  92. package/src/icons/layout-standard-left-sidebar.svg +5 -0
  93. package/src/icons/layout-standard-right-aux.svg +8 -0
  94. package/src/icons/layout-standard-right-sidebar.svg +5 -0
  95. package/src/layouts/standard-layout.ts +81 -5
  96. package/src/parts/contextmenu.ts +39 -44
  97. package/src/parts/index.ts +4 -1
  98. package/src/parts/part.ts +26 -0
  99. package/src/parts/resizable-grid.ts +125 -57
  100. package/src/parts/tabs.ts +103 -0
  101. package/dist/api-B3RXoez_.js.map +0 -1
  102. package/dist/parts-CsoNFVTw.js.map +0 -1
  103. package/dist/webawesome-Y1_HnKa_.js.map +0 -1
  104. package/dist/widget-DbLusgAH.js.map +0 -1
  105. package/src/icons/layout-standard-bottom-sidebar.svg +0 -6
  106. package/src/icons/layout-standard.svg +0 -6
@@ -1,9 +1,9 @@
1
- import { A as constants_exports, C as esmShService, E as appSettings, F as SIDEBAR_MAIN, G as TOOLBAR_MAIN_CENTER, H as TOOLBAR_BOTTOM_CENTER, I as SIDEBAR_MAIN_BOTTOM, K as TOOLBAR_MAIN_RIGHT, L as SIDEBAR_MAIN_TOOLBAR, M as EDITOR_AREA_MAIN, N as PANEL_BOTTOM, P as SIDEBAR_AUXILIARY, R as SYSTEM_ATTRIBUTIONS, S as extensionRegistry, T as TOPIC_SETTINGS_CHANGED, U as TOOLBAR_BOTTOM_END, V as TOOLBAR_BOTTOM, W as TOOLBAR_MAIN, a as versionInfoDialog, c as confirmDialog, h as deleteIndexedDbWorkspaceData, j as ABOUT_TABS, m as appLoaderService, n as DocksContainer, o as filebrowserDialog, p as promptDialog, r as icon, t as DocksPart, v as DocksElement, w as taskService, x as TOPIC_EXTENSIONS_CHANGED, y as parseMarkdownHtml, z as SYSTEM_LAYOUTS } from "./parts-CsoNFVTw.js";
1
+ import { A as filebrowserDialog, C as TOOLBAR_INFO, D as TOOLBAR_THEME_SWITCHER, E as TOOLBAR_TASKS, G as keyBindingManager, H as DocksElement, J as esmShService, K as TOPIC_EXTENSIONS_CHANGED, L as promptDialog, M as confirmDialog, O as VIEW_FILEBROWSER, R as appLoaderService, S as TOOLBAR_FULLSCREEN, T as TOOLBAR_LAYOUT_SWITCHER, X as TOPIC_SETTINGS_CHANGED, Y as taskService, Z as appSettings, _t as TOOLBAR_MAIN_CENTER, a as renderDropdownItem, at as SIDEBAR_AUXILIARY, b as TOOLBAR_ACTIVE_PART_NAME, ct as SIDEBAR_MAIN_BOTTOM, d as DocksContainer, dt as SYSTEM_LAYOUTS, f as ABOUT_TAB_ATTRIBUTIONS, gt as TOOLBAR_MAIN, h as ATTRIBUTION_ECLIPSE_DOCKS, ht as TOOLBAR_BOTTOM_END, it as PANEL_BOTTOM, k as VIEW_LOG_TERMINAL, l as versionInfoDialog, lt as SIDEBAR_MAIN_TOOLBAR, m as ABOUT_TAB_RELEASE, mt as TOOLBAR_BOTTOM_CENTER, nt as ABOUT_TABS, o as renderDropdownSubmenu, ot as SIDEBAR_AUXILIARY_BOTTOM, p as ABOUT_TAB_PACKAGES, pt as TOOLBAR_BOTTOM, q as extensionRegistry, r as renderDropdownContribution, rt as EDITOR_AREA_MAIN, s as icon, st as SIDEBAR_MAIN, t as handleDropdownWaSelect, tt as constants_exports, u as DocksPart, ut as SYSTEM_ATTRIBUTIONS, v as SIDEBAR_TOOLBAR_EXTENSIONS, vt as TOOLBAR_MAIN_RIGHT, w as TOOLBAR_LANGUAGE_SELECTOR, x as TOOLBAR_FAST_VIEWS, z as deleteIndexedDbWorkspaceData } from "./parts-CAt8aeU8.js";
2
2
  import { a as unregisterLogHandler, o as rootContext, r as registerLogHandler, s as uiContext, t as createLogger } from "./logger-DT0_NW3S.js";
3
- import { C as toastError, T as toastWarning, d as activeSelectionSignal, f as activeTasksSignal, g as contributionRegistry, h as TOPIC_CONTRIBUTEIONS_CHANGED, n as watchSignal, s as registerAll, t as DocksWidget, u as activePartSignal, v as getContributionVisible, w as toastInfo } from "./widget-DbLusgAH.js";
3
+ import { E as toastWarning, T as toastInfo, d as activeSelectionSignal, f as activeTasksSignal, g as contributionRegistry, h as TOPIC_CONTRIBUTEIONS_CHANGED, n as watchSignal, s as registerAll, t as DocksWidget, u as activePartSignal, v as getContributionVisible, w as toastError } from "./widget-BqQtioK1.js";
4
4
  import { n as subscribe, t as publish } from "./events-B_ZxkU_G.js";
5
5
  import { a as File, d as UnavailableWorkspaceFolderDirectory, i as Directory, l as TOPIC_WORKSPACE_CHANGED, o as FileContentType, p as workspaceService, s as Resource, u as TOPIC_WORKSPACE_CONNECTED } from "./fs-access-DTXPsV1W.js";
6
- import "./widgets-DnnSZhsi.js";
6
+ import "./widgets-C9V42Mqq.js";
7
7
  import { css, html, nothing, render } from "lit";
8
8
  import { signal } from "@lit-labs/signals";
9
9
  import { unsafeHTML } from "lit/directives/unsafe-html.js";
@@ -299,7 +299,7 @@ var treeNodeComparator = (c1, c2) => {
299
299
  //#endregion
300
300
  //#region src/components/filebrowser.ts
301
301
  var _DocksFileBrowser;
302
- var logger$2 = createLogger("DocksFileBrowser");
302
+ var logger$1 = createLogger("DocksFileBrowser");
303
303
  var t$6 = await i18n(/* @__PURE__ */ Object.assign({
304
304
  "./filebrowser.de.json": () => import("./filebrowser.de-GEf6Eilh.js"),
305
305
  "./filebrowser.en.json": () => import("./filebrowser.en-o0Ad5f7Z.js")
@@ -360,7 +360,6 @@ var DocksFileBrowser = class DocksFileBrowser extends DocksPart {
360
360
  renderToolbar() {
361
361
  return html`
362
362
  <docks-command icon="folder-open" title="${t$6.CONNECT_WORKSPACE}" dropdown="filebrowser.connections"></docks-command>
363
- <docks-command cmd="refresh_resource" icon="repeat" title="${t$6.REFRESH_RESOURCE}"></docks-command>
364
363
  <docks-command icon="docks file-plus" title="${t$6.CREATE_NEW}" dropdown="filebrowser.create"></docks-command>
365
364
  `;
366
365
  }
@@ -370,26 +369,37 @@ var DocksFileBrowser = class DocksFileBrowser extends DocksPart {
370
369
  const editorOptions = file ? editorRegistry.getEditorOptionsForInput(file) : [];
371
370
  const hasOpenWith = editorOptions.length > 0;
372
371
  return html`
373
- <docks-command cmd="open_editor" icon="folder-open">${t$6.OPEN}</docks-command>
372
+ ${renderDropdownItem({
373
+ cmd: "open_editor",
374
+ icon: "folder-open",
375
+ label: t$6.OPEN
376
+ })}
374
377
  ${hasOpenWith ? html`
375
378
  <wa-dropdown-item>
376
379
  ${icon("folder-open", { slot: "icon" })}
377
380
  ${t$6.OPEN_WITH}
378
- ${editorOptions.map((opt) => html`
379
- <docks-command
380
- slot="submenu"
381
- cmd="open_editor"
382
- icon="${opt.icon ?? "file"}"
383
- .params=${{
384
- path: file.getWorkspacePath(),
385
- editorId: opt.editorId
386
- }}>
387
- ${opt.title}
388
- </docks-command>
389
- `)}
381
+ ${editorOptions.map((opt) => renderDropdownItem({
382
+ cmd: "open_editor",
383
+ icon: opt.icon ?? "file",
384
+ label: opt.title,
385
+ params: {
386
+ path: file.getWorkspacePath(),
387
+ editorId: opt.editorId
388
+ },
389
+ slot: "submenu"
390
+ }))}
390
391
  </wa-dropdown-item>
391
392
  ` : nothing}
392
- <docks-command icon="docks file-plus" dropdown="filebrowser.create">${t$6.CREATE_NEW}</docks-command>
393
+ ${renderDropdownSubmenu({
394
+ icon: "docks file-plus",
395
+ label: t$6.CREATE_NEW,
396
+ contributionTarget: "filebrowser.create"
397
+ })}
398
+ ${renderDropdownItem({
399
+ cmd: "refresh_resource",
400
+ icon: "repeat",
401
+ label: t$6.REFRESH_RESOURCE
402
+ })}
393
403
  `;
394
404
  }
395
405
  onWorkspaceChanged(workspaceDir) {
@@ -491,7 +501,7 @@ var DocksFileBrowser = class DocksFileBrowser extends DocksPart {
491
501
  }
492
502
  if (info?.backendName) node.workspaceTag = info.backendName;
493
503
  } catch (e) {
494
- logger$2.debug("Failed to get workspace info for directory", e);
504
+ logger$1.debug("Failed to get workspace info for directory", e);
495
505
  }
496
506
  if (resource instanceof Directory && loadChildren) {
497
507
  try {
@@ -519,7 +529,7 @@ var DocksFileBrowser = class DocksFileBrowser extends DocksPart {
519
529
  return node;
520
530
  }
521
531
  node.loadError = error instanceof Error ? error.message : String(error);
522
- logger$2.error("Failed to load directory children:", error);
532
+ logger$1.error("Failed to load directory children:", error);
523
533
  }
524
534
  node.loaded = true;
525
535
  }
@@ -618,7 +628,7 @@ var DocksFileBrowser = class DocksFileBrowser extends DocksPart {
618
628
  return;
619
629
  }
620
630
  node.loadError = error instanceof Error ? error.message : String(error);
621
- logger$2.error("Failed to load directory children:", error);
631
+ logger$1.error("Failed to load directory children:", error);
622
632
  this.requestUpdate();
623
633
  } finally {
624
634
  this.loadingNodes.delete(node);
@@ -760,7 +770,7 @@ var DocksFileBrowser = class DocksFileBrowser extends DocksPart {
760
770
  if (paths.length === 0) return;
761
771
  const workspace = await workspaceService.getWorkspace();
762
772
  if (!workspace) {
763
- logger$2.warn("Workspace drop ignored because no workspace is connected");
773
+ logger$1.warn("Workspace drop ignored because no workspace is connected");
764
774
  return;
765
775
  }
766
776
  const moveWithinSameBackend = async (src) => {
@@ -777,7 +787,7 @@ var DocksFileBrowser = class DocksFileBrowser extends DocksPart {
777
787
  for (const path of paths) try {
778
788
  const src = await workspace.getResource(path);
779
789
  if (!src) {
780
- logger$2.warn(`Workspace drop: source not found for path "${path}"`);
790
+ logger$1.warn(`Workspace drop: source not found for path "${path}"`);
781
791
  failed++;
782
792
  continue;
783
793
  }
@@ -788,11 +798,11 @@ var DocksFileBrowser = class DocksFileBrowser extends DocksPart {
788
798
  const root = src.getWorkspace();
789
799
  if (root) srcRoots.add(root);
790
800
  } catch (error) {
791
- logger$2.error(`Failed to handle workspace drop for "${path}":`, error);
801
+ logger$1.error(`Failed to handle workspace drop for "${path}":`, error);
792
802
  failed++;
793
803
  }
794
804
  if (sources.length === 0) {
795
- if (failed > 0) logger$2.info(`Workspace drop failed for ${failed} item(s)`);
805
+ if (failed > 0) logger$1.info(`Workspace drop failed for ${failed} item(s)`);
796
806
  return;
797
807
  }
798
808
  let isCrossConnection = false;
@@ -814,17 +824,17 @@ var DocksFileBrowser = class DocksFileBrowser extends DocksPart {
814
824
  destBackend
815
825
  }))) return;
816
826
  } catch (err) {
817
- logger$2.debug("Failed to resolve cross-connection info for DnD", err);
827
+ logger$1.debug("Failed to resolve cross-connection info for DnD", err);
818
828
  }
819
829
  for (const { path, resource } of sources) try {
820
830
  const move = await moveWithinSameBackend(resource);
821
831
  await workspaceService.copyResource(resource, targetDir, { move });
822
832
  processed++;
823
833
  } catch (error) {
824
- logger$2.error(`Failed to handle workspace drop for "${path}":`, error);
834
+ logger$1.error(`Failed to handle workspace drop for "${path}":`, error);
825
835
  failed++;
826
836
  }
827
- logger$2.info(`Workspace drop completed: ${processed}/${sources.length} items ${failed > 0 ? `, ${failed} failed` : ""}`);
837
+ logger$1.info(`Workspace drop completed: ${processed}/${sources.length} items ${failed > 0 ? `, ${failed} failed` : ""}`);
828
838
  await this.loadWorkspace(this.workspaceDir, true);
829
839
  }
830
840
  async handleFilesDrop(files, targetDir) {
@@ -843,10 +853,10 @@ var DocksFileBrowser = class DocksFileBrowser extends DocksPart {
843
853
  await (await this.workspaceDir.getResource(targetPath, { create: true })).saveContents(file);
844
854
  processed++;
845
855
  } catch (error) {
846
- logger$2.error(`Failed to upload ${file.name}:`, error);
856
+ logger$1.error(`Failed to upload ${file.name}:`, error);
847
857
  failed++;
848
858
  }
849
- logger$2.info(`Uploaded ${processed}/${total} files${skipped > 0 ? `, ${skipped} skipped` : ""}${failed > 0 ? `, ${failed} failed` : ""}`);
859
+ logger$1.info(`Uploaded ${processed}/${total} files${skipped > 0 ? `, ${skipped} skipped` : ""}${failed > 0 ? `, ${failed} failed` : ""}`);
850
860
  await this.loadWorkspace(this.workspaceDir);
851
861
  }
852
862
  buildTargetPath(targetDir, fileName) {
@@ -948,35 +958,6 @@ var DocksFileBrowser = class DocksFileBrowser extends DocksPart {
948
958
  _decorate([state()], DocksFileBrowser.prototype, "root", void 0);
949
959
  DocksFileBrowser = _DocksFileBrowser = _decorate([customElement("docks-filebrowser")], DocksFileBrowser);
950
960
  //#endregion
951
- //#region src/core/contribution-names.ts
952
- var VIEW_FILEBROWSER = "view.filebrowser";
953
- var VIEW_LOG_TERMINAL = "view.logTerminal";
954
- var TOOLBAR_INFO = "toolbar.info";
955
- var TOOLBAR_FAST_VIEWS = "toolbar.fastViews";
956
- var TOOLBAR_LANGUAGE_SELECTOR = "toolbar.languageSelector";
957
- /** Main toolbar (right): layout picker (`docks-layout-switcher`). */
958
- var TOOLBAR_LAYOUT_SWITCHER = "toolbar.layoutSwitcher";
959
- /** Main toolbar (right): dark/light theme toggle (`switch_theme`). */
960
- var TOOLBAR_THEME_SWITCHER = "toolbar.themeSwitcher";
961
- /** Main toolbar (right): document fullscreen toggle (`fullscreen`). */
962
- var TOOLBAR_FULLSCREEN = "toolbar.fullscreen";
963
- /** Bottom-center toolbar: focused part title / active part indicator (`docks-part-name`). */
964
- var TOOLBAR_ACTIVE_PART_NAME = "toolbar.activePartName";
965
- /** Bottom-center toolbar: background tasks / progress (`docks-tasks`). */
966
- var TOOLBAR_TASKS = "toolbar.tasks";
967
- /** Main sidebar header toolbar: open extensions (`open_extensions` command). */
968
- var SIDEBAR_TOOLBAR_EXTENSIONS = "sidebar.toolbar.extensions";
969
- /** Default file-type → icon mappings on `system.icons`. */
970
- var SYSTEM_DEFAULT_FILE_ICONS = "system.icons.default";
971
- var ABOUT_TAB_RELEASE = "about.tab.release";
972
- var ABOUT_TAB_PACKAGES = "about.tab.packages";
973
- var ABOUT_TAB_ATTRIBUTIONS = "about.tab.attributions";
974
- var ATTRIBUTION_ECLIPSE_DOCKS = "attribution.eclipse-docks";
975
- var TOOLBAR_FILEBROWSER_RENAME = "toolbar.filebrowser.rename";
976
- var TOOLBAR_FILEBROWSER_DELETE = "toolbar.filebrowser.delete";
977
- var CTXMENU_FILEBROWSER_RENAME = "contextmenu.filebrowser.rename";
978
- var CTXMENU_FILEBROWSER_DELETE = "contextmenu.filebrowser.delete";
979
- //#endregion
980
961
  //#region src/components/tasks.ts
981
962
  var t$5 = await i18n(/* @__PURE__ */ Object.assign({
982
963
  "./tasks.de.json": () => import("./tasks.de-y2xPmQ1k.js"),
@@ -1011,10 +992,6 @@ function updateProgressDialog(forceOpen = false) {
1011
992
  }
1012
993
  const existingDialog = getDialogElement();
1013
994
  if (!(forceOpen || existingDialog?.open === true)) return;
1014
- const handleClose = () => {
1015
- const dialog = getDialogElement();
1016
- if (dialog) dialog.open = false;
1017
- };
1018
995
  const handleAfterHide = () => {
1019
996
  render(html``, container);
1020
997
  };
@@ -1024,7 +1001,6 @@ function updateProgressDialog(forceOpen = false) {
1024
1001
  open
1025
1002
  light-dismiss
1026
1003
  style="--width: 600px;"
1027
- @wa-request-close=${handleClose}
1028
1004
  @wa-after-hide=${handleAfterHide}
1029
1005
  >
1030
1006
  <style>
@@ -1281,7 +1257,7 @@ var DocksPartName = class DocksPartName extends DocksElement {
1281
1257
  DocksPartName = _decorate([customElement("docks-part-name")], DocksPartName);
1282
1258
  //#endregion
1283
1259
  //#region src/components/extensions.ts
1284
- var logger$1 = createLogger("DocksExtensions");
1260
+ var logger = createLogger("DocksExtensions");
1285
1261
  var t$2 = await i18n(/* @__PURE__ */ Object.assign({
1286
1262
  "./extensions.de.json": () => import("./extensions.de-Ct1DIybE.js"),
1287
1263
  "./extensions.en.json": () => import("./extensions.en-DRPFtVHT.js")
@@ -1292,6 +1268,9 @@ var DocksExtensions = class DocksExtensions extends DocksPart {
1292
1268
  this.filterText = "";
1293
1269
  this.showRegisterDialog = false;
1294
1270
  this.registerExtensionData = {};
1271
+ this.handleRegisterDialogAfterHide = () => {
1272
+ this.finishRegisterDialogClose();
1273
+ };
1295
1274
  }
1296
1275
  doInitUI() {
1297
1276
  subscribe(TOPIC_EXTENSIONS_CHANGED, () => {
@@ -1392,7 +1371,7 @@ var DocksExtensions = class DocksExtensions extends DocksPart {
1392
1371
  this.showRegisterDialog = true;
1393
1372
  this.requestUpdate();
1394
1373
  } catch (error) {
1395
- logger$1.warn(`Could not fetch package.json, using defaults: ${error}`);
1374
+ logger.warn(`Could not fetch package.json, using defaults: ${error}`);
1396
1375
  this.registerExtensionData = {
1397
1376
  url,
1398
1377
  id: "",
@@ -1431,7 +1410,7 @@ var DocksExtensions = class DocksExtensions extends DocksPart {
1431
1410
  extensionRegistry.registerExtension(extension);
1432
1411
  await extensionRegistry.loadExtensionFromUrl(this.registerExtensionData.url, extension.id);
1433
1412
  toastInfo(`Extension ${extension.name} registered successfully`);
1434
- this.showRegisterDialog = false;
1413
+ this.closeRegisterDialog();
1435
1414
  this.registerExtensionData = {};
1436
1415
  this.requestUpdate();
1437
1416
  });
@@ -1439,11 +1418,22 @@ var DocksExtensions = class DocksExtensions extends DocksPart {
1439
1418
  toastError(`Failed to register extension: ${error}`);
1440
1419
  }
1441
1420
  }
1442
- cancelRegisterExtension() {
1421
+ closeRegisterDialog() {
1422
+ const dialog = this.renderRoot.querySelector("wa-dialog");
1423
+ if (dialog && dialog.open !== false) {
1424
+ dialog.open = false;
1425
+ return;
1426
+ }
1427
+ this.finishRegisterDialogClose();
1428
+ }
1429
+ finishRegisterDialogClose() {
1443
1430
  this.showRegisterDialog = false;
1444
1431
  this.registerExtensionData = {};
1445
1432
  this.requestUpdate();
1446
1433
  }
1434
+ cancelRegisterExtension() {
1435
+ this.closeRegisterDialog();
1436
+ }
1447
1437
  renderToolbar() {
1448
1438
  return html`
1449
1439
  <wa-input
@@ -1474,7 +1464,7 @@ var DocksExtensions = class DocksExtensions extends DocksPart {
1474
1464
  <wa-dialog
1475
1465
  label="Register Extension"
1476
1466
  open
1477
- @wa-request-close=${() => this.cancelRegisterExtension()}
1467
+ @wa-after-hide=${this.handleRegisterDialogAfterHide}
1478
1468
  style="--wa-dialog-width: 500px;">
1479
1469
  <div style="display: flex; flex-direction: column; gap: 1rem; padding: 1rem;">
1480
1470
  <wa-input
@@ -2130,6 +2120,159 @@ _decorate([state()], DocksLogTerminal.prototype, "autoScroll", void 0);
2130
2120
  _decorate([state()], DocksLogTerminal.prototype, "filter", void 0);
2131
2121
  DocksLogTerminal = _decorate([customElement("docks-log-terminal")], DocksLogTerminal);
2132
2122
  //#endregion
2123
+ //#region src/components/command.ts
2124
+ var DocksCommand = class DocksCommand extends DocksWidget {
2125
+ constructor(..._args) {
2126
+ super(..._args);
2127
+ this.cmd = "";
2128
+ this.title = "";
2129
+ this.label = false;
2130
+ this.disabled = false;
2131
+ this.appearance = "plain";
2132
+ this.variant = "neutral";
2133
+ this.size = "s";
2134
+ this.params = {};
2135
+ this.withCaret = true;
2136
+ this.placement = "bottom-start";
2137
+ this.dropdownContributions = [];
2138
+ }
2139
+ handleSelect(event) {
2140
+ handleDropdownWaSelect(event);
2141
+ }
2142
+ getKeybinding() {
2143
+ if (!this.cmd || this.action) return null;
2144
+ const keybindings = keyBindingManager.getKeyBindingsForCommand(this.cmd);
2145
+ return keybindings.length > 0 ? keybindings[0] : null;
2146
+ }
2147
+ hasLightDomContent() {
2148
+ return Array.from(this.childNodes).some((node) => {
2149
+ if (node.nodeType === Node.TEXT_NODE) return (node.textContent?.trim().length ?? 0) > 0;
2150
+ return node.nodeType === Node.ELEMENT_NODE;
2151
+ });
2152
+ }
2153
+ isIconOnlyDropdownTrigger() {
2154
+ return !this.label && !this.hasLightDomContent();
2155
+ }
2156
+ renderDropdownTriggerIcon(iconSlot) {
2157
+ if (!this.icon) return nothing;
2158
+ return icon(this.icon, {
2159
+ label: this.title,
2160
+ slot: iconSlot
2161
+ });
2162
+ }
2163
+ doBeforeUI() {
2164
+ if (this.dropdown) {
2165
+ this.dropdownContributions = contributionRegistry.getContributions(this.dropdown);
2166
+ subscribe(TOPIC_CONTRIBUTEIONS_CHANGED, (event) => {
2167
+ if (this.dropdown && event.target === this.dropdown) this.dropdownContributions = event.contributions;
2168
+ });
2169
+ }
2170
+ }
2171
+ willUpdate(changedProperties) {
2172
+ super.willUpdate?.(changedProperties);
2173
+ if (this.dropdown && changedProperties.has("dropdown")) this.dropdownContributions = contributionRegistry.getContributions(this.dropdown);
2174
+ }
2175
+ handleToolbarClick(event) {
2176
+ if (this.disabled) return;
2177
+ if (event) event.stopPropagation();
2178
+ if (this.action) {
2179
+ this.action(event);
2180
+ return;
2181
+ }
2182
+ if (this.cmd) this.executeCommand(this.cmd, this.params);
2183
+ }
2184
+ render() {
2185
+ const keybinding = this.getKeybinding();
2186
+ if (this.dropdown) {
2187
+ const iconOnlyTrigger = this.isIconOnlyDropdownTrigger();
2188
+ const iconSlot = iconOnlyTrigger ? void 0 : "start";
2189
+ return html`
2190
+ <wa-dropdown
2191
+ placement=${this.placement}
2192
+ @wa-select=${(e) => this.handleSelect(e)}>
2193
+ <wa-button
2194
+ slot="trigger"
2195
+ appearance=${this.appearance}
2196
+ variant=${this.variant}
2197
+ size=${this.size}
2198
+ ?disabled=${this.disabled}
2199
+ ?with-caret=${this.withCaret}
2200
+ title=${keybinding ? `${this.title} (${keybinding})` : this.title}>
2201
+ ${this.renderDropdownTriggerIcon(iconSlot)}
2202
+ ${iconOnlyTrigger ? nothing : html`<slot></slot>`}
2203
+ ${this.label ? this.title : nothing}
2204
+ </wa-button>
2205
+
2206
+ ${this.title ? html`
2207
+ <h6 style="padding: var(--wa-space-xs) var(--wa-space-s); margin: 0; color: var(--wa-color-neutral-50); font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em;">
2208
+ ${this.title}
2209
+ </h6>
2210
+ ` : nothing}
2211
+
2212
+ ${this.dropdownContributions.map((c) => renderDropdownContribution(c))}
2213
+
2214
+ ${this.cmd ? html`
2215
+ <wa-divider></wa-divider>
2216
+ ${renderDropdownItem({
2217
+ cmd: this.cmd,
2218
+ icon: this.icon,
2219
+ label: this.title,
2220
+ params: this.params,
2221
+ disabled: this.disabled
2222
+ })}
2223
+ ` : nothing}
2224
+ </wa-dropdown>
2225
+ `;
2226
+ }
2227
+ return html`
2228
+ <wa-button
2229
+ appearance=${this.appearance}
2230
+ variant=${this.variant}
2231
+ size=${this.size}
2232
+ ?disabled=${this.disabled}
2233
+ title=${keybinding ? `${this.title} (${keybinding})` : this.title}
2234
+ @click=${(e) => this.handleToolbarClick(e)}>
2235
+ ${icon(this.icon, {
2236
+ label: this.title,
2237
+ slot: "start"
2238
+ })}
2239
+ <slot></slot>
2240
+ </wa-button>
2241
+ `;
2242
+ }
2243
+ static {
2244
+ this.styles = css`
2245
+ :host {
2246
+ display: inline-block;
2247
+ }
2248
+ `;
2249
+ }
2250
+ };
2251
+ _decorate([property()], DocksCommand.prototype, "cmd", void 0);
2252
+ _decorate([property({
2253
+ type: Object,
2254
+ attribute: false
2255
+ })], DocksCommand.prototype, "action", void 0);
2256
+ _decorate([property()], DocksCommand.prototype, "title", void 0);
2257
+ _decorate([property()], DocksCommand.prototype, "label", void 0);
2258
+ _decorate([property()], DocksCommand.prototype, "icon", void 0);
2259
+ _decorate([property({ type: Boolean })], DocksCommand.prototype, "disabled", void 0);
2260
+ _decorate([property()], DocksCommand.prototype, "appearance", void 0);
2261
+ _decorate([property()], DocksCommand.prototype, "variant", void 0);
2262
+ _decorate([property()], DocksCommand.prototype, "size", void 0);
2263
+ _decorate([property({
2264
+ type: Object,
2265
+ attribute: false
2266
+ })], DocksCommand.prototype, "params", void 0);
2267
+ _decorate([property()], DocksCommand.prototype, "dropdown", void 0);
2268
+ _decorate([property({
2269
+ type: Boolean,
2270
+ attribute: "with-caret"
2271
+ })], DocksCommand.prototype, "withCaret", void 0);
2272
+ _decorate([property()], DocksCommand.prototype, "placement", void 0);
2273
+ _decorate([state()], DocksCommand.prototype, "dropdownContributions", void 0);
2274
+ DocksCommand = _decorate([customElement("docks-command")], DocksCommand);
2275
+ //#endregion
2133
2276
  //#region src/components/fastviews.ts
2134
2277
  var t = await i18n(/* @__PURE__ */ Object.assign({
2135
2278
  "./fastviews.de.json": () => import("./fastviews.de-BFxFslBz.js"),
@@ -2414,7 +2557,6 @@ var showLanguageSelectorDialog = async () => {
2414
2557
  label="Select Language"
2415
2558
  open
2416
2559
  light-dismiss
2417
- @wa-request-close=${handleClose}
2418
2560
  @wa-after-hide=${handleAfterHide}>
2419
2561
  <style>
2420
2562
  .language-list {
@@ -2497,38 +2639,144 @@ var DocksLanguageSelector = class DocksLanguageSelector extends DocksElement {
2497
2639
  };
2498
2640
  DocksLanguageSelector = _decorate([customElement("docks-language-selector")], DocksLanguageSelector);
2499
2641
  //#endregion
2642
+ //#region src/core/layout-panels.ts
2643
+ var DEFAULT_LAYOUT_PANEL_VISIBILITY = {
2644
+ showLeftSidebar: true,
2645
+ showAuxSidebar: true,
2646
+ showBottomPanel: true,
2647
+ showLeftAux: false,
2648
+ showRightAux: false
2649
+ };
2650
+ function normalizePanelVisibility(stored) {
2651
+ return {
2652
+ showLeftSidebar: stored.showLeftSidebar ?? DEFAULT_LAYOUT_PANEL_VISIBILITY.showLeftSidebar,
2653
+ showAuxSidebar: stored.showAuxSidebar ?? DEFAULT_LAYOUT_PANEL_VISIBILITY.showAuxSidebar,
2654
+ showBottomPanel: stored.showBottomPanel ?? DEFAULT_LAYOUT_PANEL_VISIBILITY.showBottomPanel,
2655
+ showLeftAux: stored.showLeftAux ?? DEFAULT_LAYOUT_PANEL_VISIBILITY.showLeftAux,
2656
+ showRightAux: stored.showRightAux ?? DEFAULT_LAYOUT_PANEL_VISIBILITY.showRightAux
2657
+ };
2658
+ }
2659
+ var LAYOUT_PANEL_SETTINGS_KEY = "layoutPanelVisibility";
2660
+ /** @deprecated Legacy layout id persisted before panel visibility toggles. */
2661
+ var LEGACY_PREFERRED_LAYOUT_KEY = "preferredLayoutId";
2662
+ /** Maps legacy parameterized layout ids to panel visibility. */
2663
+ function layoutIdToPanelVisibility(layoutId) {
2664
+ switch (layoutId) {
2665
+ case "standard-bottom-panel": return {
2666
+ ...DEFAULT_LAYOUT_PANEL_VISIBILITY,
2667
+ showBottomPanel: true,
2668
+ showLeftAux: false,
2669
+ showRightAux: false
2670
+ };
2671
+ case "standard-bottom-sidebar": return {
2672
+ ...DEFAULT_LAYOUT_PANEL_VISIBILITY,
2673
+ showBottomPanel: false,
2674
+ showLeftAux: true,
2675
+ showRightAux: false
2676
+ };
2677
+ case "standard-full": return {
2678
+ ...DEFAULT_LAYOUT_PANEL_VISIBILITY,
2679
+ showLeftAux: true,
2680
+ showRightAux: true
2681
+ };
2682
+ default: return {
2683
+ ...DEFAULT_LAYOUT_PANEL_VISIBILITY,
2684
+ showBottomPanel: false,
2685
+ showLeftAux: false,
2686
+ showRightAux: false
2687
+ };
2688
+ }
2689
+ }
2690
+ function resolveInitialPanelVisibilityFromApp(appLayout) {
2691
+ if (typeof appLayout === "object" && appLayout.props) return {
2692
+ ...DEFAULT_LAYOUT_PANEL_VISIBILITY,
2693
+ showLeftSidebar: appLayout.props.showLeftSidebar !== false,
2694
+ showAuxSidebar: appLayout.props.showAuxSidebar !== false,
2695
+ showBottomPanel: appLayout.props.showBottomPanel === true,
2696
+ showLeftAux: appLayout.props.showLeftAux === true,
2697
+ showRightAux: appLayout.props.showRightAux === true
2698
+ };
2699
+ if (typeof appLayout === "string") return layoutIdToPanelVisibility(appLayout);
2700
+ return { ...DEFAULT_LAYOUT_PANEL_VISIBILITY };
2701
+ }
2702
+ async function resolveStoredPanelVisibility(appLayout) {
2703
+ try {
2704
+ const saved = await appSettings.get(LAYOUT_PANEL_SETTINGS_KEY);
2705
+ if (saved && typeof saved === "object") return normalizePanelVisibility(saved);
2706
+ } catch {}
2707
+ try {
2708
+ const legacyLayoutId = await appSettings.get(LEGACY_PREFERRED_LAYOUT_KEY);
2709
+ if (legacyLayoutId) return layoutIdToPanelVisibility(legacyLayoutId);
2710
+ } catch {}
2711
+ return resolveInitialPanelVisibilityFromApp(appLayout);
2712
+ }
2713
+ function findStandardLayout(container) {
2714
+ const root = container ?? document.getElementById("app-root") ?? document.body;
2715
+ if (!root || typeof root.querySelector !== "function") return null;
2716
+ return root.querySelector("docks-standard-layout");
2717
+ }
2718
+ var LAYOUT_PANEL_OPTIONS = [
2719
+ {
2720
+ key: "showLeftSidebar",
2721
+ label: "Left sidebar",
2722
+ icon: "docks layout-standard-left-sidebar"
2723
+ },
2724
+ {
2725
+ key: "showAuxSidebar",
2726
+ label: "Right sidebar",
2727
+ icon: "docks layout-standard-right-sidebar"
2728
+ },
2729
+ {
2730
+ key: "showBottomPanel",
2731
+ label: "Bottom panel",
2732
+ icon: "docks layout-standard-bottom-panel"
2733
+ },
2734
+ {
2735
+ key: "showLeftAux",
2736
+ label: "Left Aux",
2737
+ icon: "docks layout-standard-left-aux"
2738
+ },
2739
+ {
2740
+ key: "showRightAux",
2741
+ label: "Right Aux",
2742
+ icon: "docks layout-standard-right-aux"
2743
+ }
2744
+ ];
2745
+ //#endregion
2500
2746
  //#region src/components/layout-switcher.ts
2501
2747
  var DocksLayoutSwitcher = class DocksLayoutSwitcher extends DocksElement {
2502
2748
  constructor(..._args) {
2503
2749
  super(..._args);
2504
- this.currentLayoutId = "standard";
2750
+ this.panels = { ...DEFAULT_LAYOUT_PANEL_VISIBILITY };
2505
2751
  }
2506
2752
  doBeforeUI() {
2507
- this.currentLayoutId = appLoaderService.getCurrentLayoutId();
2508
- const updateLayout = () => {
2509
- this.currentLayoutId = appLoaderService.getCurrentLayoutId();
2753
+ const syncPanels = () => {
2754
+ this.panels = findStandardLayout()?.getPanelVisibility() ?? { ...DEFAULT_LAYOUT_PANEL_VISIBILITY };
2510
2755
  this.requestUpdate();
2511
2756
  };
2512
- window.addEventListener("app-loaded", updateLayout);
2513
- window.addEventListener("layout-changed", updateLayout);
2757
+ syncPanels();
2758
+ window.addEventListener("app-loaded", syncPanels);
2759
+ window.addEventListener("layout-panels-changed", syncPanels);
2514
2760
  return () => {
2515
- window.removeEventListener("app-loaded", updateLayout);
2516
- window.removeEventListener("layout-changed", updateLayout);
2761
+ window.removeEventListener("app-loaded", syncPanels);
2762
+ window.removeEventListener("layout-panels-changed", syncPanels);
2517
2763
  };
2518
2764
  }
2519
2765
  async handleSelect(e) {
2520
- const layoutId = e.detail?.item?.value;
2521
- if (!layoutId || layoutId === this.currentLayoutId) return;
2766
+ const layout = findStandardLayout();
2767
+ if (!layout) return;
2768
+ const item = e.detail?.item;
2769
+ const key = item?.value;
2770
+ if (!item || !key) return;
2522
2771
  try {
2523
- await appLoaderService.setPreferredLayoutId(layoutId);
2772
+ await layout.setPanelVisibility({ [key]: item.checked ?? false });
2773
+ this.panels = layout.getPanelVisibility();
2524
2774
  } catch (err) {
2525
- console.error("Failed to switch layout:", err);
2775
+ console.error("Failed to update layout panels:", err);
2526
2776
  }
2527
2777
  }
2528
2778
  render() {
2529
- const layouts = appLoaderService.getRegisteredLayouts();
2530
- if (layouts.length <= 1) return html``;
2531
- const layoutName = layouts.find((l) => l.id === this.currentLayoutId)?.name ?? this.currentLayoutId;
2779
+ if (!findStandardLayout()) return html``;
2532
2780
  return html`
2533
2781
  <wa-dropdown
2534
2782
  placement="bottom-end"
@@ -2540,19 +2788,19 @@ var DocksLayoutSwitcher = class DocksLayoutSwitcher extends DocksElement {
2540
2788
  appearance="plain"
2541
2789
  size="s"
2542
2790
  with-caret
2543
- title="Switch layout (current: ${layoutName})">
2544
- <wa-icon name="table-cells" label="Layout"></wa-icon>
2791
+ title="Show or hide layout panels">
2792
+ ${icon("docks layout-standard-full", { label: "Layout panels" })}
2545
2793
  </wa-button>
2546
- ${layouts.map((layout) => html`
2794
+ ${LAYOUT_PANEL_OPTIONS.map((panel) => html`
2547
2795
  <wa-dropdown-item
2548
- value="${layout.id}"
2796
+ value="${panel.key}"
2549
2797
  type="checkbox"
2550
- ?checked=${layout.id === this.currentLayoutId}>
2551
- ${icon(layout.icon, {
2552
- label: layout.name,
2798
+ ?checked=${this.panels[panel.key]}>
2799
+ ${icon(panel.icon, {
2800
+ label: panel.label,
2553
2801
  slot: "icon"
2554
2802
  })}
2555
- ${layout.name}
2803
+ ${panel.label}
2556
2804
  </wa-dropdown-item>
2557
2805
  `)}
2558
2806
  </wa-dropdown>
@@ -2566,143 +2814,15 @@ var DocksLayoutSwitcher = class DocksLayoutSwitcher extends DocksElement {
2566
2814
  `;
2567
2815
  }
2568
2816
  };
2569
- _decorate([state()], DocksLayoutSwitcher.prototype, "currentLayoutId", void 0);
2817
+ _decorate([state()], DocksLayoutSwitcher.prototype, "panels", void 0);
2570
2818
  DocksLayoutSwitcher = _decorate([customElement("docks-layout-switcher")], DocksLayoutSwitcher);
2571
2819
  //#endregion
2572
- //#region src/components/release-history.ts
2573
- var logger = createLogger("ReleaseHistory");
2574
- async function loadReleases(releaseHistory) {
2575
- if (!releaseHistory) return [];
2576
- if (typeof releaseHistory !== "function") return releaseHistory;
2577
- try {
2578
- return await releaseHistory();
2579
- } catch (error) {
2580
- logger.error(`Failed to load release history from app: ${error instanceof Error ? error.message : String(error)}`);
2581
- return [];
2582
- }
2583
- }
2584
- function semverEqual(a, b) {
2585
- return a.replace(/^v/i, "") === b.replace(/^v/i, "");
2586
- }
2587
- function isNewerThan(releaseTag, currentVersion) {
2588
- const currentParts = currentVersion.replace(/^v/i, "").split(".").map(Number);
2589
- const releaseParts = releaseTag.replace(/^v/i, "").split(".").map(Number);
2590
- for (let i = 0; i < Math.max(currentParts.length, releaseParts.length); i++) {
2591
- const current = currentParts[i] || 0;
2592
- const releasePart = releaseParts[i] || 0;
2593
- if (releasePart > current) return true;
2594
- if (releasePart < current) return false;
2595
- }
2596
- return false;
2597
- }
2598
- var DocksReleaseHistory = class DocksReleaseHistory extends DocksPart {
2820
+ //#region src/components/npm-packages.ts
2821
+ var DocksNpmPackages = class DocksNpmPackages extends DocksPart {
2599
2822
  constructor(..._args) {
2600
2823
  super(..._args);
2601
2824
  this.scrollMode = "none";
2602
- this.appVersion = "0.0.0";
2603
- this.releases = [];
2604
- this.currentReleaseIndex = 0;
2605
- }
2606
- static {
2607
- this.styles = [css`
2608
- .release-panel {
2609
- display: flex;
2610
- flex-direction: column;
2611
- gap: 0.5rem;
2612
- height: 100%;
2613
- padding: 0.75rem;
2614
- box-sizing: border-box;
2615
- }
2616
-
2617
- .release-panel wa-scroller {
2618
- flex: 1;
2619
- min-height: 0;
2620
- }
2621
-
2622
- .release-nav {
2623
- display: flex;
2624
- gap: 0.5rem;
2625
- }
2626
- `];
2627
- }
2628
- doInitUI() {
2629
- this.load();
2630
- }
2631
- async load() {
2632
- const app = appLoaderService.getCurrentApp();
2633
- this.appVersion = app?.version ?? "0.0.0";
2634
- this.releases = await loadReleases(app?.releaseHistory);
2635
- const currentIndex = this.releases.findIndex((release) => semverEqual(release.tag_name, this.appVersion));
2636
- this.currentReleaseIndex = currentIndex >= 0 ? currentIndex : 0;
2637
- }
2638
- showOlder() {
2639
- if (this.currentReleaseIndex < this.releases.length - 1) this.currentReleaseIndex += 1;
2640
- }
2641
- showNewer() {
2642
- if (this.currentReleaseIndex > 0) this.currentReleaseIndex -= 1;
2643
- }
2644
- renderContent() {
2645
- const release = this.releases[this.currentReleaseIndex];
2646
- if (!release) return html`<div class="release-panel">No release history available.</div>`;
2647
- const isCurrent = semverEqual(release.tag_name, this.appVersion);
2648
- const showUpdateHint = !isCurrent && isNewerThan(release.tag_name, this.appVersion);
2649
- const atOldest = this.currentReleaseIndex === this.releases.length - 1;
2650
- const atNewest = this.currentReleaseIndex === 0;
2651
- const bodyHtml = release.body ? parseMarkdownHtml(release.body) : "";
2652
- return html`
2653
- <div class="release-panel">
2654
- <p>
2655
- <strong>Version:</strong> ${release.tag_name}${isCurrent ? " (Current)" : ""}
2656
- </p>
2657
- <p>
2658
- <strong>Released:</strong>
2659
- <wa-format-date
2660
- .date=${release.published_at}
2661
- month="short"
2662
- day="numeric"
2663
- year="numeric"
2664
- ></wa-format-date>
2665
- </p>
2666
- ${showUpdateHint ? html`
2667
- <wa-callout variant="warning">
2668
- <wa-icon slot="icon" name="triangle-exclamation"></wa-icon>
2669
- Update available — reload the page to update
2670
- </wa-callout>
2671
- ` : ""}
2672
- <wa-scroller orientation="vertical">
2673
- ${bodyHtml ? html`<div style="white-space: normal;">${unsafeHTML(bodyHtml)}</div>` : ""}
2674
- </wa-scroller>
2675
- ${this.releases.length > 1 ? html`
2676
- <div class="release-nav">
2677
- <wa-button-group>
2678
- <wa-button
2679
- variant="default"
2680
- ?disabled=${atOldest}
2681
- @click=${() => this.showOlder()}
2682
- >
2683
- ← Previous
2684
- </wa-button>
2685
- <wa-button
2686
- variant="default"
2687
- ?disabled=${atNewest}
2688
- @click=${() => this.showNewer()}
2689
- >
2690
- Next →
2691
- </wa-button>
2692
- </wa-button-group>
2693
- </div>
2694
- ` : ""}
2695
- </div>
2696
- `;
2697
2825
  }
2698
- };
2699
- _decorate([state()], DocksReleaseHistory.prototype, "appVersion", void 0);
2700
- _decorate([state()], DocksReleaseHistory.prototype, "releases", void 0);
2701
- _decorate([state()], DocksReleaseHistory.prototype, "currentReleaseIndex", void 0);
2702
- DocksReleaseHistory = _decorate([customElement("docks-release-history")], DocksReleaseHistory);
2703
- //#endregion
2704
- //#region src/components/npm-packages.ts
2705
- var DocksNpmPackages = class DocksNpmPackages extends DocksPart {
2706
2826
  static {
2707
2827
  this.styles = [css`
2708
2828
  .packages-panel {
@@ -2748,6 +2868,7 @@ function renderHtmlContribution(contribution) {
2748
2868
  var DocksAttributionPart = class DocksAttributionPart extends DocksPart {
2749
2869
  constructor(..._args) {
2750
2870
  super(..._args);
2871
+ this.scrollMode = "none";
2751
2872
  this.attributions = [];
2752
2873
  }
2753
2874
  static {
@@ -2820,7 +2941,7 @@ contributionRegistry.registerContribution(ABOUT_TABS, {
2820
2941
  ranking: 100,
2821
2942
  toolbar: false,
2822
2943
  contextMenu: false,
2823
- component: (id) => html`<docks-attribution id="${id}"></docks-attribution>`
2944
+ component: (id) => html`<docks-attribution id="${id}" embedded></docks-attribution>`
2824
2945
  });
2825
2946
  contributionRegistry.registerContribution(ABOUT_TABS, {
2826
2947
  name: ABOUT_TAB_RELEASE,
@@ -2829,7 +2950,7 @@ contributionRegistry.registerContribution(ABOUT_TABS, {
2829
2950
  ranking: 50,
2830
2951
  toolbar: false,
2831
2952
  contextMenu: false,
2832
- component: (id) => html`<docks-release-history id="${id}"></docks-release-history>`
2953
+ component: (id) => html`<docks-release-history id="${id}" embedded></docks-release-history>`
2833
2954
  });
2834
2955
  contributionRegistry.registerContribution(ABOUT_TABS, {
2835
2956
  name: ABOUT_TAB_PACKAGES,
@@ -2838,7 +2959,7 @@ contributionRegistry.registerContribution(ABOUT_TABS, {
2838
2959
  ranking: 0,
2839
2960
  toolbar: false,
2840
2961
  contextMenu: false,
2841
- component: (id) => html`<docks-npm-packages id="${id}"></docks-npm-packages>`
2962
+ component: (id) => html`<docks-npm-packages id="${id}" embedded></docks-npm-packages>`
2842
2963
  });
2843
2964
  contributionRegistry.registerContribution(SYSTEM_ATTRIBUTIONS, {
2844
2965
  name: ATTRIBUTION_ECLIPSE_DOCKS,
@@ -2869,7 +2990,7 @@ contributionRegistry.registerContribution(TOOLBAR_BOTTOM_END, {
2869
2990
  });
2870
2991
  contributionRegistry.registerContribution(TOOLBAR_MAIN_RIGHT, {
2871
2992
  name: TOOLBAR_LAYOUT_SWITCHER,
2872
- label: "Layout Switcher",
2993
+ label: "Layout panels",
2873
2994
  component: () => html`<docks-layout-switcher></docks-layout-switcher>`
2874
2995
  });
2875
2996
  contributionRegistry.registerContribution(SIDEBAR_MAIN_TOOLBAR, {
@@ -2883,14 +3004,57 @@ contributionRegistry.registerContribution(SIDEBAR_MAIN_TOOLBAR, {
2883
3004
  var DocksStandardLayout = class DocksStandardLayout extends DocksContainer {
2884
3005
  constructor(..._args) {
2885
3006
  super(..._args);
2886
- this.showBottomSidebar = false;
2887
- this.showBottomPanel = false;
3007
+ this.showLeftAux = false;
3008
+ this.showBottomPanel = true;
2888
3009
  this.showLeftSidebar = true;
2889
3010
  this.showAuxSidebar = true;
3011
+ this.showRightAux = false;
3012
+ this.panelsInitialized = false;
2890
3013
  }
2891
3014
  createRenderRoot() {
2892
3015
  return this;
2893
3016
  }
3017
+ getPanelVisibility() {
3018
+ return {
3019
+ showLeftSidebar: this.showLeftSidebar,
3020
+ showAuxSidebar: this.showAuxSidebar,
3021
+ showBottomPanel: this.showBottomPanel,
3022
+ showLeftAux: this.showLeftAux,
3023
+ showRightAux: this.showRightAux
3024
+ };
3025
+ }
3026
+ applyPanelVisibility(panels) {
3027
+ this.showLeftSidebar = panels.showLeftSidebar;
3028
+ this.showAuxSidebar = panels.showAuxSidebar;
3029
+ this.showBottomPanel = panels.showBottomPanel;
3030
+ this.showLeftAux = panels.showLeftAux;
3031
+ this.showRightAux = panels.showRightAux;
3032
+ }
3033
+ async setPanelVisibility(panels) {
3034
+ const next = {
3035
+ ...this.getPanelVisibility(),
3036
+ ...panels
3037
+ };
3038
+ this.applyPanelVisibility(next);
3039
+ try {
3040
+ await appSettings.set(LAYOUT_PANEL_SETTINGS_KEY, next);
3041
+ } catch (error) {
3042
+ console.error("Failed to persist layout panel visibility:", error);
3043
+ throw error;
3044
+ }
3045
+ window.dispatchEvent(new CustomEvent("layout-panels-changed", { detail: { panels: this.getPanelVisibility() } }));
3046
+ }
3047
+ doInitUI() {
3048
+ this.initializePanelVisibility();
3049
+ }
3050
+ async initializePanelVisibility() {
3051
+ if (this.panelsInitialized) return;
3052
+ this.panelsInitialized = true;
3053
+ const appLayout = appLoaderService.getCurrentApp()?.layout;
3054
+ const panels = await resolveStoredPanelVisibility(appLayout);
3055
+ this.applyPanelVisibility(panels);
3056
+ window.dispatchEvent(new CustomEvent("layout-panels-changed", { detail: { panels: this.getPanelVisibility() } }));
3057
+ }
2894
3058
  getGridSizes() {
2895
3059
  if (this.showLeftSidebar && this.showAuxSidebar) return "20%, 60%, 20%";
2896
3060
  if (this.showLeftSidebar) return "20%, 80%";
@@ -2982,7 +3146,7 @@ var DocksStandardLayout = class DocksStandardLayout extends DocksContainer {
2982
3146
  sizes=${this.getGridSizes()}>
2983
3147
 
2984
3148
  ${this.showLeftSidebar ? html`
2985
- ${this.showBottomSidebar ? html`
3149
+ ${this.showLeftAux ? html`
2986
3150
  <docks-resizable-grid
2987
3151
  id="left-sidebar-split"
2988
3152
  orientation="vertical"
@@ -3003,7 +3167,17 @@ var DocksStandardLayout = class DocksStandardLayout extends DocksContainer {
3003
3167
  </docks-resizable-grid>
3004
3168
  ` : html`<docks-tabs id="${EDITOR_AREA_MAIN}"></docks-tabs>`}
3005
3169
 
3006
- ${this.showAuxSidebar ? html`<docks-tabs id="${SIDEBAR_AUXILIARY}"></docks-tabs>` : nothing}
3170
+ ${this.showAuxSidebar ? html`
3171
+ ${this.showRightAux ? html`
3172
+ <docks-resizable-grid
3173
+ id="right-sidebar-split"
3174
+ orientation="vertical"
3175
+ sizes="50%, 50%">
3176
+ <docks-tabs id="${SIDEBAR_AUXILIARY}"></docks-tabs>
3177
+ <docks-tabs id="${SIDEBAR_AUXILIARY_BOTTOM}" placement="start" icon-only></docks-tabs>
3178
+ </docks-resizable-grid>
3179
+ ` : html`<docks-tabs id="${SIDEBAR_AUXILIARY}"></docks-tabs>`}
3180
+ ` : nothing}
3007
3181
  </docks-resizable-grid>
3008
3182
 
3009
3183
  <div class="toolbar-bottom">
@@ -3016,8 +3190,8 @@ var DocksStandardLayout = class DocksStandardLayout extends DocksContainer {
3016
3190
  };
3017
3191
  _decorate([property({
3018
3192
  type: Boolean,
3019
- attribute: "show-bottom-sidebar"
3020
- })], DocksStandardLayout.prototype, "showBottomSidebar", void 0);
3193
+ attribute: "show-left-aux"
3194
+ })], DocksStandardLayout.prototype, "showLeftAux", void 0);
3021
3195
  _decorate([property({
3022
3196
  type: Boolean,
3023
3197
  attribute: "show-bottom-panel"
@@ -3030,51 +3204,20 @@ _decorate([property({
3030
3204
  type: Boolean,
3031
3205
  attribute: "show-aux-sidebar"
3032
3206
  })], DocksStandardLayout.prototype, "showAuxSidebar", void 0);
3207
+ _decorate([property({
3208
+ type: Boolean,
3209
+ attribute: "show-right-aux"
3210
+ })], DocksStandardLayout.prototype, "showRightAux", void 0);
3033
3211
  DocksStandardLayout = _decorate([customElement("docks-standard-layout")], DocksStandardLayout);
3034
3212
  //#endregion
3035
3213
  //#region src/contributions/default-layout-contributions.ts
3036
- for (const layout of [
3037
- {
3038
- id: "standard",
3039
- name: "Standard",
3040
- label: "Standard",
3041
- icon: "docks layout-standard",
3042
- component: "docks-standard-layout"
3043
- },
3044
- {
3045
- id: "standard-bottom-panel",
3046
- name: "Standard (bottom panel)",
3047
- label: "Standard (bottom panel)",
3048
- icon: "docks layout-standard-bottom-panel",
3049
- component: {
3050
- tag: "docks-standard-layout",
3051
- attributes: { "show-bottom-panel": "true" }
3052
- }
3053
- },
3054
- {
3055
- id: "standard-bottom-sidebar",
3056
- name: "Standard (bottom sidebar)",
3057
- label: "Standard (bottom sidebar)",
3058
- icon: "docks layout-standard-bottom-sidebar",
3059
- component: {
3060
- tag: "docks-standard-layout",
3061
- attributes: { "show-bottom-sidebar": "true" }
3062
- }
3063
- },
3064
- {
3065
- id: "standard-full",
3066
- name: "Standard (panel + sidebar)",
3067
- label: "Standard (panel + sidebar)",
3068
- icon: "docks layout-standard-full",
3069
- component: {
3070
- tag: "docks-standard-layout",
3071
- attributes: {
3072
- "show-bottom-panel": "true",
3073
- "show-bottom-sidebar": "true"
3074
- }
3075
- }
3076
- }
3077
- ]) contributionRegistry.registerContribution(SYSTEM_LAYOUTS, layout);
3214
+ contributionRegistry.registerContribution(SYSTEM_LAYOUTS, {
3215
+ id: "standard",
3216
+ name: "Standard",
3217
+ label: "Standard",
3218
+ icon: "docks layout-standard-full",
3219
+ component: "docks-standard-layout"
3220
+ });
3078
3221
  //#endregion
3079
3222
  //#region src/commands/files.ts
3080
3223
  async function getWorkspaceAndPath(params, requirePath = true) {
@@ -3860,20 +4003,6 @@ contributionRegistry.registerContribution("filebrowser.create", {
3860
4003
  label: "Create Folder...",
3861
4004
  params: { ask: true }
3862
4005
  });
3863
- contributionRegistry.registerContribution("toolbar:view.filebrowser", {
3864
- name: "toolbar.filebrowser.rename",
3865
- command: "mv",
3866
- icon: "pen",
3867
- label: "Rename",
3868
- disabled
3869
- });
3870
- contributionRegistry.registerContribution("toolbar:view.filebrowser", {
3871
- name: "toolbar.filebrowser.delete",
3872
- command: "rm",
3873
- icon: "trash",
3874
- label: "Delete",
3875
- disabled: deleteDisabled
3876
- });
3877
4006
  contributionRegistry.registerContribution("contextmenu:view.filebrowser", {
3878
4007
  name: "contextmenu.filebrowser.create-folder",
3879
4008
  command: "mkdir",
@@ -4486,6 +4615,6 @@ function getFrameworkConfig() {
4486
4615
  return { ...frameworkConfig };
4487
4616
  }
4488
4617
  //#endregion
4489
- export { TOOLBAR_THEME_SWITCHER as C, editorRegistry as D, treeNodeComparator as E, createLazyLabel as O, TOOLBAR_TASKS as S, VIEW_LOG_TERMINAL as T, TOOLBAR_FILEBROWSER_RENAME as _, DocksStandardLayout as a, TOOLBAR_LANGUAGE_SELECTOR as b, ABOUT_TAB_RELEASE as c, CTXMENU_FILEBROWSER_RENAME as d, SIDEBAR_TOOLBAR_EXTENSIONS as f, TOOLBAR_FILEBROWSER_DELETE as g, TOOLBAR_FAST_VIEWS as h, createJsRuntime as i, i18n as k, ATTRIBUTION_ECLIPSE_DOCKS as l, TOOLBAR_ACTIVE_PART_NAME as m, getFrameworkConfig as n, ABOUT_TAB_ATTRIBUTIONS as o, SYSTEM_DEFAULT_FILE_ICONS as p, runJavaScriptCode as r, ABOUT_TAB_PACKAGES as s, configureFramework as t, CTXMENU_FILEBROWSER_DELETE as u, TOOLBAR_FULLSCREEN as v, VIEW_FILEBROWSER as w, TOOLBAR_LAYOUT_SWITCHER as x, TOOLBAR_INFO as y };
4618
+ export { i18n as _, DocksStandardLayout as a, LAYOUT_PANEL_SETTINGS_KEY as c, layoutIdToPanelVisibility as d, resolveInitialPanelVisibilityFromApp as f, createLazyLabel as g, editorRegistry as h, createJsRuntime as i, LEGACY_PREFERRED_LAYOUT_KEY as l, treeNodeComparator as m, getFrameworkConfig as n, DEFAULT_LAYOUT_PANEL_VISIBILITY as o, resolveStoredPanelVisibility as p, runJavaScriptCode as r, LAYOUT_PANEL_OPTIONS as s, configureFramework as t, findStandardLayout as u };
4490
4619
 
4491
- //# sourceMappingURL=api-B3RXoez_.js.map
4620
+ //# sourceMappingURL=api-oPg3Bv1S.js.map