@eclipse-docks/core 0.7.113 → 0.7.118

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 (63) hide show
  1. package/dist/api/index.js +4 -4
  2. package/dist/api/services.d.ts +1 -1
  3. package/dist/api/services.d.ts.map +1 -1
  4. package/dist/{api-BWhUdgQ_.js → api-N5AbUtyH.js} +299 -190
  5. package/dist/api-N5AbUtyH.js.map +1 -0
  6. package/dist/components/attribution.d.ts +14 -0
  7. package/dist/components/attribution.d.ts.map +1 -0
  8. package/dist/components/index.d.ts.map +1 -1
  9. package/dist/components/npm-packages.d.ts +11 -0
  10. package/dist/components/npm-packages.d.ts.map +1 -0
  11. package/dist/components/release-history.d.ts +19 -0
  12. package/dist/components/release-history.d.ts.map +1 -0
  13. package/dist/core/constants.d.ts +1 -15
  14. package/dist/core/constants.d.ts.map +1 -1
  15. package/dist/core/contribution-names.d.ts +28 -0
  16. package/dist/core/contribution-names.d.ts.map +1 -0
  17. package/dist/core/contribution-targets.d.ts +20 -0
  18. package/dist/core/contribution-targets.d.ts.map +1 -0
  19. package/dist/core/contributionregistry.d.ts +5 -0
  20. package/dist/core/contributionregistry.d.ts.map +1 -1
  21. package/dist/core/ui-ids.d.ts +1 -23
  22. package/dist/core/ui-ids.d.ts.map +1 -1
  23. package/dist/dialogs/index.d.ts +1 -0
  24. package/dist/dialogs/index.d.ts.map +1 -1
  25. package/dist/dialogs/version-info-dialog.d.ts +14 -0
  26. package/dist/dialogs/version-info-dialog.d.ts.map +1 -0
  27. package/dist/index.js +4 -4
  28. package/dist/parts/index.js +1 -1
  29. package/dist/parts/tabs.d.ts.map +1 -1
  30. package/dist/{parts-D1n2XZVE.js → parts-BvITdiV3.js} +83 -18
  31. package/dist/parts-BvITdiV3.js.map +1 -0
  32. package/dist/{widget-DbolQH0C.js → widget-DFbJNLqB.js} +2 -1
  33. package/dist/widget-DFbJNLqB.js.map +1 -0
  34. package/dist/widgets/index.js +1 -1
  35. package/dist/{widgets-SScpQQr9.js → widgets-CuO5lmjL.js} +2 -2
  36. package/dist/{widgets-SScpQQr9.js.map → widgets-CuO5lmjL.js.map} +1 -1
  37. package/package.json +1 -1
  38. package/src/api/services.ts +1 -0
  39. package/src/commands/global.ts +2 -2
  40. package/src/commands/open-view-as-editor.ts +1 -1
  41. package/src/commands/version-info.ts +10 -219
  42. package/src/components/attribution.ts +93 -0
  43. package/src/components/index.ts +4 -1
  44. package/src/components/npm-packages.ts +53 -0
  45. package/src/components/part-name.ts +2 -2
  46. package/src/components/release-history.ts +177 -0
  47. package/src/components/tasks.ts +2 -2
  48. package/src/contributions/default-layout-contributions.ts +1 -1
  49. package/src/contributions/default-ui-contributions.ts +49 -2
  50. package/src/core/apploader.ts +1 -1
  51. package/src/core/constants.ts +2 -22
  52. package/src/core/contribution-names.ts +34 -0
  53. package/src/core/contribution-targets.ts +24 -0
  54. package/src/core/contributionregistry.ts +6 -0
  55. package/src/core/editorregistry.ts +1 -1
  56. package/src/core/ui-ids.ts +1 -29
  57. package/src/dialogs/index.ts +2 -1
  58. package/src/dialogs/version-info-dialog.ts +82 -0
  59. package/src/layouts/standard-layout.ts +1 -1
  60. package/src/parts/tabs.ts +2 -1
  61. package/dist/api-BWhUdgQ_.js.map +0 -1
  62. package/dist/parts-D1n2XZVE.js.map +0 -1
  63. package/dist/widget-DbolQH0C.js.map +0 -1
@@ -1,9 +1,9 @@
1
- import { A as SIDEBAR_MAIN, B as TOOLBAR_MAIN_RIGHT, C as appSettings, F as TOOLBAR_BOTTOM, I as TOOLBAR_BOTTOM_CENTER, L as TOOLBAR_BOTTOM_END, M as SIDEBAR_MAIN_TOOLBAR, N as SYSTEM_LAYOUTS, O as PANEL_BOTTOM, R as TOOLBAR_MAIN, S as TOPIC_SETTINGS_CHANGED, T as EDITOR_AREA_MAIN, V as constants_exports, _ as DocksElement, a as filebrowserDialog, b as esmShService, f as promptDialog, j as SIDEBAR_MAIN_BOTTOM, k as SIDEBAR_AUXILIARY, m as deleteIndexedDbWorkspaceData, n as DocksContainer, p as appLoaderService, r as icon, s as confirmDialog, t as DocksPart, v as TOPIC_EXTENSIONS_CHANGED, x as taskService, y as extensionRegistry, z as TOOLBAR_MAIN_CENTER } from "./parts-D1n2XZVE.js";
1
+ import { A as EDITOR_AREA_MAIN, B as TOOLBAR_BOTTOM_CENTER, C as TOPIC_SETTINGS_CHANGED, F as SIDEBAR_MAIN_TOOLBAR, H as TOOLBAR_MAIN, I as SYSTEM_ATTRIBUTIONS, L as SYSTEM_LAYOUTS, M as SIDEBAR_AUXILIARY, N as SIDEBAR_MAIN, O as constants_exports, P as SIDEBAR_MAIN_BOTTOM, S as taskService, U as TOOLBAR_MAIN_CENTER, V as TOOLBAR_BOTTOM_END, W as TOOLBAR_MAIN_RIGHT, a as versionInfoDialog, b as extensionRegistry, c as confirmDialog, h as deleteIndexedDbWorkspaceData, j as PANEL_BOTTOM, k 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 appSettings, x as esmShService, y as TOPIC_EXTENSIONS_CHANGED, z as TOOLBAR_BOTTOM } from "./parts-BvITdiV3.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, w as toastInfo } from "./widget-DbolQH0C.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-DFbJNLqB.js";
4
4
  import { n as subscribe, t as publish } from "./events-B_ZxkU_G.js";
5
5
  import { a as File, c as TOPIC_WORKSPACE_CHANGED, f as workspaceService, i as Directory, l as TOPIC_WORKSPACE_CONNECTED, o as FileContentType, u as UnavailableWorkspaceFolderDirectory } from "./fs-access-D-fDaJ8V.js";
6
- import "./widgets-SScpQQr9.js";
6
+ import "./widgets-CuO5lmjL.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";
@@ -300,7 +300,7 @@ var treeNodeComparator = (c1, c2) => {
300
300
  //#endregion
301
301
  //#region src/components/filebrowser.ts
302
302
  var _DocksFileBrowser;
303
- var logger$1 = createLogger("DocksFileBrowser");
303
+ var logger$2 = createLogger("DocksFileBrowser");
304
304
  var t$6 = await i18n(/* @__PURE__ */ Object.assign({
305
305
  "./filebrowser.de.json": () => import("./filebrowser.de-GEf6Eilh.js"),
306
306
  "./filebrowser.en.json": () => import("./filebrowser.en-o0Ad5f7Z.js")
@@ -485,7 +485,7 @@ var DocksFileBrowser = class DocksFileBrowser extends DocksPart {
485
485
  }
486
486
  if (info?.backendName) node.workspaceTag = info.backendName;
487
487
  } catch (e) {
488
- logger$1.debug("Failed to get workspace info for directory", e);
488
+ logger$2.debug("Failed to get workspace info for directory", e);
489
489
  }
490
490
  if (resource instanceof Directory && loadChildren) {
491
491
  try {
@@ -513,7 +513,7 @@ var DocksFileBrowser = class DocksFileBrowser extends DocksPart {
513
513
  return node;
514
514
  }
515
515
  node.loadError = error instanceof Error ? error.message : String(error);
516
- logger$1.error("Failed to load directory children:", error);
516
+ logger$2.error("Failed to load directory children:", error);
517
517
  }
518
518
  node.loaded = true;
519
519
  }
@@ -612,7 +612,7 @@ var DocksFileBrowser = class DocksFileBrowser extends DocksPart {
612
612
  return;
613
613
  }
614
614
  node.loadError = error instanceof Error ? error.message : String(error);
615
- logger$1.error("Failed to load directory children:", error);
615
+ logger$2.error("Failed to load directory children:", error);
616
616
  this.requestUpdate();
617
617
  } finally {
618
618
  this.loadingNodes.delete(node);
@@ -746,7 +746,7 @@ var DocksFileBrowser = class DocksFileBrowser extends DocksPart {
746
746
  if (paths.length === 0) return;
747
747
  const workspace = await workspaceService.getWorkspace();
748
748
  if (!workspace) {
749
- logger$1.warn("Workspace drop ignored because no workspace is connected");
749
+ logger$2.warn("Workspace drop ignored because no workspace is connected");
750
750
  return;
751
751
  }
752
752
  const moveWithinSameBackend = async (src) => {
@@ -763,7 +763,7 @@ var DocksFileBrowser = class DocksFileBrowser extends DocksPart {
763
763
  for (const path of paths) try {
764
764
  const src = await workspace.getResource(path);
765
765
  if (!src) {
766
- logger$1.warn(`Workspace drop: source not found for path "${path}"`);
766
+ logger$2.warn(`Workspace drop: source not found for path "${path}"`);
767
767
  failed++;
768
768
  continue;
769
769
  }
@@ -774,11 +774,11 @@ var DocksFileBrowser = class DocksFileBrowser extends DocksPart {
774
774
  const root = src.getWorkspace();
775
775
  if (root) srcRoots.add(root);
776
776
  } catch (error) {
777
- logger$1.error(`Failed to handle workspace drop for "${path}":`, error);
777
+ logger$2.error(`Failed to handle workspace drop for "${path}":`, error);
778
778
  failed++;
779
779
  }
780
780
  if (sources.length === 0) {
781
- if (failed > 0) logger$1.info(`Workspace drop failed for ${failed} item(s)`);
781
+ if (failed > 0) logger$2.info(`Workspace drop failed for ${failed} item(s)`);
782
782
  return;
783
783
  }
784
784
  let isCrossConnection = false;
@@ -800,17 +800,17 @@ var DocksFileBrowser = class DocksFileBrowser extends DocksPart {
800
800
  destBackend
801
801
  }))) return;
802
802
  } catch (err) {
803
- logger$1.debug("Failed to resolve cross-connection info for DnD", err);
803
+ logger$2.debug("Failed to resolve cross-connection info for DnD", err);
804
804
  }
805
805
  for (const { path, resource } of sources) try {
806
806
  const move = await moveWithinSameBackend(resource);
807
807
  await workspaceService.copyResource(resource, targetDir, { move });
808
808
  processed++;
809
809
  } catch (error) {
810
- logger$1.error(`Failed to handle workspace drop for "${path}":`, error);
810
+ logger$2.error(`Failed to handle workspace drop for "${path}":`, error);
811
811
  failed++;
812
812
  }
813
- logger$1.info(`Workspace drop completed: ${processed}/${sources.length} items ${failed > 0 ? `, ${failed} failed` : ""}`);
813
+ logger$2.info(`Workspace drop completed: ${processed}/${sources.length} items ${failed > 0 ? `, ${failed} failed` : ""}`);
814
814
  await this.loadWorkspace(this.workspaceDir, true);
815
815
  }
816
816
  async handleFilesDrop(files, targetDir) {
@@ -829,10 +829,10 @@ var DocksFileBrowser = class DocksFileBrowser extends DocksPart {
829
829
  await (await this.workspaceDir.getResource(targetPath, { create: true })).saveContents(file);
830
830
  processed++;
831
831
  } catch (error) {
832
- logger$1.error(`Failed to upload ${file.name}:`, error);
832
+ logger$2.error(`Failed to upload ${file.name}:`, error);
833
833
  failed++;
834
834
  }
835
- logger$1.info(`Uploaded ${processed}/${total} files${skipped > 0 ? `, ${skipped} skipped` : ""}${failed > 0 ? `, ${failed} failed` : ""}`);
835
+ logger$2.info(`Uploaded ${processed}/${total} files${skipped > 0 ? `, ${skipped} skipped` : ""}${failed > 0 ? `, ${failed} failed` : ""}`);
836
836
  await this.loadWorkspace(this.workspaceDir);
837
837
  }
838
838
  buildTargetPath(targetDir, fileName) {
@@ -935,7 +935,7 @@ _decorate([state()], DocksFileBrowser.prototype, "root", void 0);
935
935
  _decorate([state()], DocksFileBrowser.prototype, "fileEditorOptions", void 0);
936
936
  DocksFileBrowser = _DocksFileBrowser = _decorate([customElement("docks-filebrowser")], DocksFileBrowser);
937
937
  //#endregion
938
- //#region src/core/ui-ids.ts
938
+ //#region src/core/contribution-names.ts
939
939
  var VIEW_FILEBROWSER = "view.filebrowser";
940
940
  var VIEW_LOG_TERMINAL = "view.logTerminal";
941
941
  var TOOLBAR_INFO = "toolbar.info";
@@ -955,6 +955,10 @@ var TOOLBAR_TASKS = "toolbar.tasks";
955
955
  var SIDEBAR_TOOLBAR_EXTENSIONS = "sidebar.toolbar.extensions";
956
956
  /** Default file-type → icon mappings on `system.icons`. */
957
957
  var SYSTEM_DEFAULT_FILE_ICONS = "system.icons.default";
958
+ var ABOUT_TAB_RELEASE = "about.tab.release";
959
+ var ABOUT_TAB_PACKAGES = "about.tab.packages";
960
+ var ABOUT_TAB_ATTRIBUTIONS = "about.tab.attributions";
961
+ var ATTRIBUTION_ECLIPSE_DOCKS = "attribution.eclipse-docks";
958
962
  var TOOLBAR_FILEBROWSER_RENAME = "toolbar.filebrowser.rename";
959
963
  var TOOLBAR_FILEBROWSER_DELETE = "toolbar.filebrowser.delete";
960
964
  var CTXMENU_FILEBROWSER_RENAME = "contextmenu.filebrowser.rename";
@@ -1264,7 +1268,7 @@ var DocksPartName = class DocksPartName extends DocksElement {
1264
1268
  DocksPartName = _decorate([customElement("docks-part-name")], DocksPartName);
1265
1269
  //#endregion
1266
1270
  //#region src/components/extensions.ts
1267
- var logger = createLogger("DocksExtensions");
1271
+ var logger$1 = createLogger("DocksExtensions");
1268
1272
  var t$2 = await i18n(/* @__PURE__ */ Object.assign({
1269
1273
  "./extensions.de.json": () => import("./extensions.de-Ct1DIybE.js"),
1270
1274
  "./extensions.en.json": () => import("./extensions.en-DRPFtVHT.js")
@@ -1375,7 +1379,7 @@ var DocksExtensions = class DocksExtensions extends DocksPart {
1375
1379
  this.showRegisterDialog = true;
1376
1380
  this.requestUpdate();
1377
1381
  } catch (error) {
1378
- logger.warn(`Could not fetch package.json, using defaults: ${error}`);
1382
+ logger$1.warn(`Could not fetch package.json, using defaults: ${error}`);
1379
1383
  this.registerExtensionData = {
1380
1384
  url,
1381
1385
  id: "",
@@ -2552,6 +2556,237 @@ var DocksLayoutSwitcher = class DocksLayoutSwitcher extends DocksElement {
2552
2556
  _decorate([state()], DocksLayoutSwitcher.prototype, "currentLayoutId", void 0);
2553
2557
  DocksLayoutSwitcher = _decorate([customElement("docks-layout-switcher")], DocksLayoutSwitcher);
2554
2558
  //#endregion
2559
+ //#region src/components/release-history.ts
2560
+ var logger = createLogger("ReleaseHistory");
2561
+ async function loadReleases(releaseHistory) {
2562
+ if (!releaseHistory) return [];
2563
+ if (typeof releaseHistory !== "function") return releaseHistory;
2564
+ try {
2565
+ return await releaseHistory();
2566
+ } catch (error) {
2567
+ logger.error(`Failed to load release history from app: ${error instanceof Error ? error.message : String(error)}`);
2568
+ return [];
2569
+ }
2570
+ }
2571
+ function semverEqual(a, b) {
2572
+ return a.replace(/^v/i, "") === b.replace(/^v/i, "");
2573
+ }
2574
+ function isNewerThan(releaseTag, currentVersion) {
2575
+ const currentParts = currentVersion.replace(/^v/i, "").split(".").map(Number);
2576
+ const releaseParts = releaseTag.replace(/^v/i, "").split(".").map(Number);
2577
+ for (let i = 0; i < Math.max(currentParts.length, releaseParts.length); i++) {
2578
+ const current = currentParts[i] || 0;
2579
+ const releasePart = releaseParts[i] || 0;
2580
+ if (releasePart > current) return true;
2581
+ if (releasePart < current) return false;
2582
+ }
2583
+ return false;
2584
+ }
2585
+ var DocksReleaseHistory = class DocksReleaseHistory extends DocksPart {
2586
+ constructor(..._args) {
2587
+ super(..._args);
2588
+ this.scrollMode = "none";
2589
+ this.appVersion = "0.0.0";
2590
+ this.releases = [];
2591
+ this.currentReleaseIndex = 0;
2592
+ }
2593
+ static {
2594
+ this.styles = [css`
2595
+ .release-panel {
2596
+ display: flex;
2597
+ flex-direction: column;
2598
+ gap: 0.5rem;
2599
+ height: 100%;
2600
+ padding: 0.75rem;
2601
+ box-sizing: border-box;
2602
+ }
2603
+
2604
+ .release-panel wa-scroller {
2605
+ flex: 1;
2606
+ min-height: 0;
2607
+ }
2608
+
2609
+ .release-nav {
2610
+ display: flex;
2611
+ gap: 0.5rem;
2612
+ }
2613
+ `];
2614
+ }
2615
+ doInitUI() {
2616
+ this.load();
2617
+ }
2618
+ async load() {
2619
+ const app = appLoaderService.getCurrentApp();
2620
+ this.appVersion = app?.version ?? "0.0.0";
2621
+ this.releases = await loadReleases(app?.releaseHistory);
2622
+ const currentIndex = this.releases.findIndex((release) => semverEqual(release.tag_name, this.appVersion));
2623
+ this.currentReleaseIndex = currentIndex >= 0 ? currentIndex : 0;
2624
+ }
2625
+ showOlder() {
2626
+ if (this.currentReleaseIndex < this.releases.length - 1) this.currentReleaseIndex += 1;
2627
+ }
2628
+ showNewer() {
2629
+ if (this.currentReleaseIndex > 0) this.currentReleaseIndex -= 1;
2630
+ }
2631
+ renderContent() {
2632
+ const release = this.releases[this.currentReleaseIndex];
2633
+ if (!release) return html`<div class="release-panel">No release history available.</div>`;
2634
+ const isCurrent = semverEqual(release.tag_name, this.appVersion);
2635
+ const showUpdateHint = !isCurrent && isNewerThan(release.tag_name, this.appVersion);
2636
+ const atOldest = this.currentReleaseIndex === this.releases.length - 1;
2637
+ const atNewest = this.currentReleaseIndex === 0;
2638
+ const bodyHtml = release.body ? marked.parse(release.body, { async: false }) : "";
2639
+ return html`
2640
+ <div class="release-panel">
2641
+ <p>
2642
+ <strong>Version:</strong> ${release.tag_name}${isCurrent ? " (Current)" : ""}
2643
+ </p>
2644
+ <p>
2645
+ <strong>Released:</strong>
2646
+ <wa-format-date
2647
+ .date=${release.published_at}
2648
+ month="short"
2649
+ day="numeric"
2650
+ year="numeric"
2651
+ ></wa-format-date>
2652
+ </p>
2653
+ ${showUpdateHint ? html`
2654
+ <wa-callout variant="warning">
2655
+ <wa-icon slot="icon" name="triangle-exclamation"></wa-icon>
2656
+ Update available — reload the page to update
2657
+ </wa-callout>
2658
+ ` : ""}
2659
+ <wa-scroller orientation="vertical">
2660
+ ${bodyHtml ? html`<div style="white-space: normal;">${unsafeHTML(bodyHtml)}</div>` : ""}
2661
+ </wa-scroller>
2662
+ ${this.releases.length > 1 ? html`
2663
+ <div class="release-nav">
2664
+ <wa-button-group>
2665
+ <wa-button
2666
+ variant="default"
2667
+ ?disabled=${atOldest}
2668
+ @click=${() => this.showOlder()}
2669
+ >
2670
+ ← Previous
2671
+ </wa-button>
2672
+ <wa-button
2673
+ variant="default"
2674
+ ?disabled=${atNewest}
2675
+ @click=${() => this.showNewer()}
2676
+ >
2677
+ Next →
2678
+ </wa-button>
2679
+ </wa-button-group>
2680
+ </div>
2681
+ ` : ""}
2682
+ </div>
2683
+ `;
2684
+ }
2685
+ };
2686
+ _decorate([state()], DocksReleaseHistory.prototype, "appVersion", void 0);
2687
+ _decorate([state()], DocksReleaseHistory.prototype, "releases", void 0);
2688
+ _decorate([state()], DocksReleaseHistory.prototype, "currentReleaseIndex", void 0);
2689
+ DocksReleaseHistory = _decorate([customElement("docks-release-history")], DocksReleaseHistory);
2690
+ //#endregion
2691
+ //#region src/components/npm-packages.ts
2692
+ var DocksNpmPackages = class DocksNpmPackages extends DocksPart {
2693
+ static {
2694
+ this.styles = [css`
2695
+ .packages-panel {
2696
+ padding: 0.75rem;
2697
+ box-sizing: border-box;
2698
+ }
2699
+
2700
+ wa-tree-item > span small {
2701
+ color: var(--wa-color-neutral-60);
2702
+ font-size: 0.875em;
2703
+ margin-left: 0.5rem;
2704
+ }
2705
+ `];
2706
+ }
2707
+ renderContent() {
2708
+ const app = appLoaderService.getCurrentApp();
2709
+ const entries = Object.entries(app?.dependencies ?? {});
2710
+ if (entries.length === 0) return html`<div class="packages-panel">No package information available.</div>`;
2711
+ return html`
2712
+ <div class="packages-panel">
2713
+ <wa-tree style="--indent-guide-width: 1px;">
2714
+ <wa-tree-item expanded>
2715
+ <span>${app?.name ?? ""}</span>
2716
+ ${entries.map(([name, version]) => html`
2717
+ <wa-tree-item>
2718
+ <span>${name} <small>${version}</small></span>
2719
+ </wa-tree-item>
2720
+ `)}
2721
+ </wa-tree-item>
2722
+ </wa-tree>
2723
+ </div>
2724
+ `;
2725
+ }
2726
+ };
2727
+ DocksNpmPackages = _decorate([customElement("docks-npm-packages")], DocksNpmPackages);
2728
+ //#endregion
2729
+ //#region src/components/attribution.ts
2730
+ function renderHtmlContribution(contribution) {
2731
+ const contents = contribution.component;
2732
+ if (contents instanceof Function) return contents();
2733
+ return unsafeHTML(contents);
2734
+ }
2735
+ var DocksAttributionPart = class DocksAttributionPart extends DocksPart {
2736
+ constructor(..._args) {
2737
+ super(..._args);
2738
+ this.attributions = [];
2739
+ }
2740
+ static {
2741
+ this.styles = [css`
2742
+ .attributions {
2743
+ display: flex;
2744
+ flex-direction: column;
2745
+ gap: 1.25rem;
2746
+ padding: 0.75rem;
2747
+ box-sizing: border-box;
2748
+ }
2749
+
2750
+ .attribution h3 {
2751
+ margin: 0 0 0.5rem;
2752
+ font-size: var(--wa-font-size-m);
2753
+ }
2754
+
2755
+ .attribution p {
2756
+ margin: 0 0 0.5rem;
2757
+ }
2758
+
2759
+ .attribution p:last-child {
2760
+ margin-bottom: 0;
2761
+ }
2762
+ `];
2763
+ }
2764
+ doBeforeUI() {
2765
+ this.loadAttributions();
2766
+ this.subscribe(TOPIC_CONTRIBUTEIONS_CHANGED, (event) => {
2767
+ if (event.target === "system.attributions") this.loadAttributions();
2768
+ });
2769
+ }
2770
+ loadAttributions() {
2771
+ this.attributions = contributionRegistry.getContributions(SYSTEM_ATTRIBUTIONS).filter((contribution) => "component" in contribution && getContributionVisible(contribution));
2772
+ }
2773
+ renderContent() {
2774
+ if (this.attributions.length === 0) return html`<div class="attributions">No attributions to display.</div>`;
2775
+ return html`
2776
+ <div class="attributions">
2777
+ ${this.attributions.map((contribution) => html`
2778
+ <section class="attribution">
2779
+ ${contribution.label ? html`<h3>${contribution.label}</h3>` : nothing}
2780
+ ${renderHtmlContribution(contribution)}
2781
+ </section>
2782
+ `)}
2783
+ </div>
2784
+ `;
2785
+ }
2786
+ };
2787
+ _decorate([state()], DocksAttributionPart.prototype, "attributions", void 0);
2788
+ DocksAttributionPart = _decorate([customElement("docks-attribution")], DocksAttributionPart);
2789
+ //#endregion
2555
2790
  //#region src/contributions/default-ui-contributions.ts
2556
2791
  contributionRegistry.registerContribution(SIDEBAR_MAIN, {
2557
2792
  name: VIEW_FILEBROWSER,
@@ -2565,6 +2800,43 @@ contributionRegistry.registerContribution(PANEL_BOTTOM, {
2565
2800
  icon: "list",
2566
2801
  component: (id) => html`<docks-log-terminal id="${id}"></docks-log-terminal>`
2567
2802
  });
2803
+ contributionRegistry.registerContribution(ABOUT_TABS, {
2804
+ name: ABOUT_TAB_ATTRIBUTIONS,
2805
+ label: "Attributions",
2806
+ icon: "copyright",
2807
+ ranking: 100,
2808
+ toolbar: false,
2809
+ contextMenu: false,
2810
+ component: (id) => html`<docks-attribution id="${id}"></docks-attribution>`
2811
+ });
2812
+ contributionRegistry.registerContribution(ABOUT_TABS, {
2813
+ name: ABOUT_TAB_RELEASE,
2814
+ label: "Release History",
2815
+ icon: "clock-rotate-left",
2816
+ ranking: 50,
2817
+ toolbar: false,
2818
+ contextMenu: false,
2819
+ component: (id) => html`<docks-release-history id="${id}"></docks-release-history>`
2820
+ });
2821
+ contributionRegistry.registerContribution(ABOUT_TABS, {
2822
+ name: ABOUT_TAB_PACKAGES,
2823
+ label: "NPM Packages",
2824
+ icon: "cubes",
2825
+ ranking: 0,
2826
+ toolbar: false,
2827
+ contextMenu: false,
2828
+ component: (id) => html`<docks-npm-packages id="${id}"></docks-npm-packages>`
2829
+ });
2830
+ contributionRegistry.registerContribution(SYSTEM_ATTRIBUTIONS, {
2831
+ name: ATTRIBUTION_ECLIPSE_DOCKS,
2832
+ label: "Eclipse Docks",
2833
+ component: () => html`
2834
+ <p>
2835
+ Eclipse Docks is made available under the
2836
+ <a href="https://www.eclipse.org/legal/epl-2.0" target="_blank" rel="noopener noreferrer">Eclipse Public License 2.0</a>.
2837
+ </p>
2838
+ `
2839
+ });
2568
2840
  contributionRegistry.registerContribution(TOOLBAR_BOTTOM_END, {
2569
2841
  name: TOOLBAR_INFO,
2570
2842
  label: "Info",
@@ -3124,182 +3396,19 @@ registerAll({
3124
3396
  });
3125
3397
  //#endregion
3126
3398
  //#region src/commands/version-info.ts
3127
- /** Compare semver strings whether GitHub uses a leading "v" (e.g. v0.7.83) or package.json does not. */
3128
- function semverEqual(a, b) {
3129
- return a.replace(/^v/i, "") === b.replace(/^v/i, "");
3130
- }
3131
3399
  registerAll({
3132
3400
  command: {
3133
- "id": "show_version_info",
3134
- "name": "Show Version Info",
3135
- "description": "Shows application version information",
3136
- "parameters": []
3401
+ id: "show_version_info",
3402
+ name: "Show Version Info",
3403
+ description: "Shows application version information",
3404
+ parameters: []
3137
3405
  },
3138
3406
  handler: { execute: async (_context) => {
3139
- const app = appLoaderService.getCurrentApp();
3140
- if (!app) {
3407
+ if (!appLoaderService.getCurrentApp()) {
3141
3408
  toastError("No app loaded");
3142
3409
  return;
3143
3410
  }
3144
- const deps = app.dependencies ?? {};
3145
- const hasPackages = Object.keys(deps).length > 0;
3146
- const packagesTree = hasPackages ? html`
3147
- <wa-tree style="--indent-guide-width: 1px;">
3148
- <wa-tree-item expanded>
3149
- <span>${app.name ?? ""}</span>
3150
- ${Object.entries(deps).map(([name, version]) => html`
3151
- <wa-tree-item>
3152
- <span>${name} <small>${version}</small></span>
3153
- </wa-tree-item>
3154
- `)}
3155
- </wa-tree-item>
3156
- </wa-tree>
3157
- ` : html``;
3158
- let dialogContainer = null;
3159
- const getDialogContainer = () => {
3160
- if (!dialogContainer) {
3161
- dialogContainer = document.getElementById("global-dialog-container") || document.createElement("div");
3162
- if (!dialogContainer.id) {
3163
- dialogContainer.id = "global-dialog-container";
3164
- document.body.appendChild(dialogContainer);
3165
- }
3166
- }
3167
- return dialogContainer;
3168
- };
3169
- const cleanup = () => {
3170
- if (dialogContainer) render(html``, dialogContainer);
3171
- };
3172
- const renderReleaseContent = (releaseContent) => {
3173
- return html`${unsafeHTML(marked.parse(releaseContent, { async: false }))}`;
3174
- };
3175
- let releases = [];
3176
- if (app.releaseHistory) if (typeof app.releaseHistory === "function") try {
3177
- releases = await app.releaseHistory();
3178
- } catch (error) {
3179
- console.error("Failed to load release history from app:", error);
3180
- releases = [];
3181
- }
3182
- else releases = app.releaseHistory;
3183
- const appVersion = app.version ?? "0.0.0";
3184
- const currentIndex = releases.length > 0 ? releases.findIndex((r) => semverEqual(r.tag_name, appVersion)) : -1;
3185
- const startIndex = currentIndex >= 0 ? currentIndex : 0;
3186
- let currentReleaseIndex = startIndex;
3187
- const buildReleaseContent = (index) => {
3188
- if (releases.length === 0) return "";
3189
- const release = releases[index];
3190
- const isCurrentVersion = semverEqual(release.tag_name, appVersion);
3191
- let message = `**Version:** ${release.tag_name}`;
3192
- if (isCurrentVersion) message += ` (Current)`;
3193
- message += `\n\n`;
3194
- const publishDate = new Date(release.published_at).toLocaleDateString();
3195
- message += `**Released:** ${publishDate}\n\n`;
3196
- if (!isCurrentVersion) {
3197
- const cleanCurrent = appVersion.replace(/^v/, "");
3198
- const cleanRelease = release.tag_name.replace(/^v/, "");
3199
- const currentParts = cleanCurrent.split(".").map(Number);
3200
- const releaseParts = cleanRelease.split(".").map(Number);
3201
- let isNewer = false;
3202
- for (let i = 0; i < Math.max(currentParts.length, releaseParts.length); i++) {
3203
- const current = currentParts[i] || 0;
3204
- const releasePart = releaseParts[i] || 0;
3205
- if (releasePart > current) {
3206
- isNewer = true;
3207
- break;
3208
- }
3209
- if (releasePart < current) break;
3210
- }
3211
- if (isNewer) message += `⚠️ **Update available - reload page to update**\n\n`;
3212
- }
3213
- if (release.body) message += `---\n\n${release.body}`;
3214
- return message;
3215
- };
3216
- const handleClose = () => {
3217
- cleanup();
3218
- };
3219
- const handleAfterHide = () => {
3220
- cleanup();
3221
- };
3222
- const updateDialog = (index) => {
3223
- const releaseContent = buildReleaseContent(index);
3224
- const hasNavigation = releases.length > 0;
3225
- render(html`
3226
- <wa-dialog
3227
- label="About ${app.name ?? ""} - ${appVersion}"
3228
- open
3229
- light-dismiss
3230
- style="--width: 600px;"
3231
- @wa-request-close=${handleClose}
3232
- @wa-after-hide=${handleAfterHide}
3233
- >
3234
- <style>
3235
- .dialog-content {
3236
- height: 600px;
3237
- }
3238
-
3239
- wa-tree-item > span small {
3240
- color: var(--wa-color-neutral-60);
3241
- font-size: 0.875em;
3242
- margin-left: 0.5rem;
3243
- }
3244
- </style>
3245
- <small>${app.description ?? ""}</small>
3246
- <div class="dialog-content">
3247
- <wa-tab-group>
3248
- ${releases.length > 0 ? html`
3249
- <wa-tab slot="nav" panel="release">Release History</wa-tab>
3250
- <wa-tab-panel name="release">
3251
- ${renderReleaseContent(releaseContent)}
3252
- </wa-tab-panel>
3253
- ` : ""}
3254
-
3255
- ${hasPackages ? html`
3256
- <wa-tab slot="nav" panel="packages">NPM Packages</wa-tab>
3257
- <wa-tab-panel name="packages">
3258
- ${packagesTree}
3259
- </wa-tab-panel>
3260
- ` : ""}
3261
- </wa-tab-group>
3262
- </div>
3263
- <div slot="footer">
3264
- ${hasNavigation ? html`
3265
- <wa-button
3266
- variant="default"
3267
- ?disabled=${index === releases.length - 1}
3268
- @click=${() => {
3269
- if (index < releases.length - 1) {
3270
- currentReleaseIndex = index + 1;
3271
- updateDialog(currentReleaseIndex);
3272
- }
3273
- }}
3274
- >
3275
- ← Previous
3276
- </wa-button>
3277
- <wa-button
3278
- variant="default"
3279
- ?disabled=${index === 0}
3280
- @click=${() => {
3281
- if (index > 0) {
3282
- currentReleaseIndex = index - 1;
3283
- updateDialog(currentReleaseIndex);
3284
- }
3285
- }}
3286
- >
3287
- Next →
3288
- </wa-button>
3289
- ` : ""}
3290
- <wa-button variant="primary" data-dialog="close">Close</wa-button>
3291
- </div>
3292
- </wa-dialog>
3293
- `, getDialogContainer());
3294
- };
3295
- updateDialog(startIndex);
3296
- return new Promise((resolve) => {
3297
- const checkClosed = () => {
3298
- if (!dialogContainer?.querySelector("wa-dialog[open]")) resolve();
3299
- else setTimeout(checkClosed, 100);
3300
- };
3301
- checkClosed();
3302
- });
3411
+ await versionInfoDialog();
3303
3412
  } }
3304
3413
  });
3305
3414
  //#endregion
@@ -4364,6 +4473,6 @@ function getFrameworkConfig() {
4364
4473
  return { ...frameworkConfig };
4365
4474
  }
4366
4475
  //#endregion
4367
- export { editorRegistry as C, treeNodeComparator as S, i18n as T, TOOLBAR_LAYOUT_SWITCHER as _, DocksStandardLayout as a, VIEW_FILEBROWSER as b, SIDEBAR_TOOLBAR_EXTENSIONS as c, TOOLBAR_FAST_VIEWS as d, TOOLBAR_FILEBROWSER_DELETE as f, TOOLBAR_LANGUAGE_SELECTOR as g, TOOLBAR_INFO as h, createJsRuntime as i, SYSTEM_DEFAULT_FILE_ICONS as l, TOOLBAR_FULLSCREEN as m, getFrameworkConfig as n, CTXMENU_FILEBROWSER_DELETE as o, TOOLBAR_FILEBROWSER_RENAME as p, runJavaScriptCode as r, CTXMENU_FILEBROWSER_RENAME as s, configureFramework as t, TOOLBAR_ACTIVE_PART_NAME as u, TOOLBAR_TASKS as v, createLazyLabel as w, VIEW_LOG_TERMINAL as x, TOOLBAR_THEME_SWITCHER as y };
4476
+ 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 };
4368
4477
 
4369
- //# sourceMappingURL=api-BWhUdgQ_.js.map
4478
+ //# sourceMappingURL=api-N5AbUtyH.js.map