@eclipse-lyra/extension-media-viewer 0.7.57 → 0.7.59
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.
- package/dist/i18n.de-BgRO7Rh7.js +11 -0
- package/dist/i18n.de-BgRO7Rh7.js.map +1 -0
- package/dist/i18n.en-DyeoJm7D.js +11 -0
- package/dist/i18n.en-DyeoJm7D.js.map +1 -0
- package/dist/index.js +14 -8
- package/dist/index.js.map +1 -1
- package/dist/{media-viewer-extension-B7CpFkFz.js → media-viewer-extension-DIdiRDeO.js} +122 -139
- package/dist/media-viewer-extension-DIdiRDeO.js.map +1 -0
- package/package.json +3 -3
- package/dist/i18n.de-Dg_5Bnbh.js +0 -12
- package/dist/i18n.de-Dg_5Bnbh.js.map +0 -1
- package/dist/i18n.en-CvZfcZjj.js +0 -12
- package/dist/i18n.en-CvZfcZjj.js.map +0 -1
- package/dist/media-viewer-extension-B7CpFkFz.js.map +0 -1
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
//#region src/i18n.de.json
|
|
2
|
+
var EXT_MEDIAVIEWER_NAME = "Medien-Viewer";
|
|
3
|
+
var EXT_MEDIAVIEWER_DESC = "PDF-, Bild- und HTML-Dateien im Browser anzeigen";
|
|
4
|
+
var i18n_de_default = {
|
|
5
|
+
EXT_MEDIAVIEWER_NAME,
|
|
6
|
+
EXT_MEDIAVIEWER_DESC
|
|
7
|
+
};
|
|
8
|
+
//#endregion
|
|
9
|
+
export { EXT_MEDIAVIEWER_DESC, EXT_MEDIAVIEWER_NAME, i18n_de_default as default };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=i18n.de-BgRO7Rh7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.de-BgRO7Rh7.js","names":[],"sources":["../src/i18n.de.json"],"sourcesContent":["{\n \"EXT_MEDIAVIEWER_NAME\": \"Medien-Viewer\",\n \"EXT_MEDIAVIEWER_DESC\": \"PDF-, Bild- und HTML-Dateien im Browser anzeigen\"\n}\n"],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
//#region src/i18n.en.json
|
|
2
|
+
var EXT_MEDIAVIEWER_NAME = "Media Viewer";
|
|
3
|
+
var EXT_MEDIAVIEWER_DESC = "View PDF, image, and HTML files in the browser";
|
|
4
|
+
var i18n_en_default = {
|
|
5
|
+
EXT_MEDIAVIEWER_NAME,
|
|
6
|
+
EXT_MEDIAVIEWER_DESC
|
|
7
|
+
};
|
|
8
|
+
//#endregion
|
|
9
|
+
export { EXT_MEDIAVIEWER_DESC, EXT_MEDIAVIEWER_NAME, i18n_en_default as default };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=i18n.en-DyeoJm7D.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.en-DyeoJm7D.js","names":[],"sources":["../src/i18n.en.json"],"sourcesContent":["{\n \"EXT_MEDIAVIEWER_NAME\": \"Media Viewer\",\n \"EXT_MEDIAVIEWER_DESC\": \"View PDF, image, and HTML files in the browser\"\n}\n"],"mappings":""}
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { extensionRegistry, i18n } from "@eclipse-lyra/core";
|
|
2
2
|
import pkg from "../package.json";
|
|
3
|
-
|
|
3
|
+
//#region src/index.ts
|
|
4
|
+
var t = await i18n(/* @__PURE__ */ Object.assign({
|
|
5
|
+
"./i18n.de.json": () => import("./i18n.de-BgRO7Rh7.js"),
|
|
6
|
+
"./i18n.en.json": () => import("./i18n.en-DyeoJm7D.js")
|
|
7
|
+
}), true);
|
|
4
8
|
extensionRegistry.registerExtension({
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
id: pkg.name,
|
|
10
|
+
name: t.EXT_MEDIAVIEWER_NAME,
|
|
11
|
+
description: t.EXT_MEDIAVIEWER_DESC,
|
|
12
|
+
loader: () => import("./media-viewer-extension-DIdiRDeO.js"),
|
|
13
|
+
icon: "image"
|
|
10
14
|
});
|
|
11
|
-
//#
|
|
15
|
+
//#endregion
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import { extensionRegistry, i18n } from '@eclipse-lyra/core';\nimport pkg from '../package.json';\n\nconst t = await i18n(import.meta.glob('./i18n*.json'), true);\n\nextensionRegistry.registerExtension({\n id: pkg.name,\n name: t.EXT_MEDIAVIEWER_NAME,\n description: t.EXT_MEDIAVIEWER_DESC,\n loader: () => import(\"./media-viewer-extension\"),\n icon: \"image\",\n\n\n});\n"],"
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { extensionRegistry, i18n } from '@eclipse-lyra/core';\nimport pkg from '../package.json';\n\nconst t = await i18n(import.meta.glob('./i18n*.json'), true);\n\nextensionRegistry.registerExtension({\n id: pkg.name,\n name: t.EXT_MEDIAVIEWER_NAME,\n description: t.EXT_MEDIAVIEWER_DESC,\n loader: () => import(\"./media-viewer-extension\"),\n icon: \"image\",\n\n\n});\n"],"mappings":";;;AAGA,IAAM,IAAI,MAAM,KAAK,uBAAA,OAAA;CAAA,wBAAA,OAAA;CAAA,wBAAA,OAAA;CAAA,CAAgC,EAAE,KAAK;AAE5D,kBAAkB,kBAAkB;CAClC,IAAI,IAAI;CACR,MAAM,EAAE;CACR,aAAa,EAAE;CACf,cAAc,OAAO;CACrB,MAAM;CAGP,CAAC"}
|
|
@@ -1,127 +1,121 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
var
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
".jpg",
|
|
17
|
-
".jpeg",
|
|
18
|
-
".png",
|
|
19
|
-
".gif",
|
|
20
|
-
".svg",
|
|
21
|
-
".webp",
|
|
22
|
-
".bmp",
|
|
23
|
-
".ico"
|
|
1
|
+
import { File, LyraPart, editorRegistry } from "@eclipse-lyra/core";
|
|
2
|
+
import { customElement, property, state } from "lit/decorators.js";
|
|
3
|
+
import { css, html, nothing } from "lit";
|
|
4
|
+
import _decorate from "@oxc-project/runtime/helpers/decorate";
|
|
5
|
+
//#region src/media-viewer-extension.ts
|
|
6
|
+
var SUPPORTED_EXTENSIONS = [
|
|
7
|
+
".pdf",
|
|
8
|
+
".jpg",
|
|
9
|
+
".jpeg",
|
|
10
|
+
".png",
|
|
11
|
+
".gif",
|
|
12
|
+
".svg",
|
|
13
|
+
".webp",
|
|
14
|
+
".bmp",
|
|
15
|
+
".ico"
|
|
24
16
|
];
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
17
|
+
var getFileIcon = (fileName) => {
|
|
18
|
+
const lowerName = fileName.toLowerCase();
|
|
19
|
+
if (lowerName.endsWith(".pdf")) return "file-pdf";
|
|
20
|
+
if (lowerName.match(/\.(jpg|jpeg|png|gif|webp|bmp|ico|svg)$/)) return "image";
|
|
21
|
+
return "file";
|
|
30
22
|
};
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
23
|
+
var isSupportedMediaFile = (file) => {
|
|
24
|
+
const fileName = file.getName().toLowerCase();
|
|
25
|
+
return SUPPORTED_EXTENSIONS.some((ext) => fileName.endsWith(ext));
|
|
34
26
|
};
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
27
|
+
var IMAGE_EXTENSIONS = [
|
|
28
|
+
".jpg",
|
|
29
|
+
".jpeg",
|
|
30
|
+
".png",
|
|
31
|
+
".gif",
|
|
32
|
+
".svg",
|
|
33
|
+
".webp",
|
|
34
|
+
".bmp",
|
|
35
|
+
".ico"
|
|
36
|
+
];
|
|
37
|
+
var isImageFile = (file) => {
|
|
38
|
+
const name = file.getName().toLowerCase();
|
|
39
|
+
return IMAGE_EXTENSIONS.some((ext) => name.endsWith(ext));
|
|
39
40
|
};
|
|
40
41
|
editorRegistry.registerEditorInputHandler({
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
42
|
+
editorId: "system.media-viewer",
|
|
43
|
+
label: "Media viewer",
|
|
44
|
+
canHandle: (input) => input instanceof File && isSupportedMediaFile(input),
|
|
45
|
+
handle: async (input) => {
|
|
46
|
+
const editorInput = {
|
|
47
|
+
title: input.getWorkspacePath(),
|
|
48
|
+
data: input,
|
|
49
|
+
key: input.getWorkspacePath(),
|
|
50
|
+
icon: getFileIcon(input.getName()),
|
|
51
|
+
state: {}
|
|
52
|
+
};
|
|
53
|
+
editorInput.component = (id) => html`
|
|
53
54
|
<lyra-media-viewer id="${id}" .input=${editorInput}></lyra-media-viewer>`;
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
return editorInput;
|
|
56
|
+
},
|
|
57
|
+
ranking: 1e3
|
|
57
58
|
});
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
}
|
|
114
|
-
renderContent() {
|
|
115
|
-
if (!this.mediaUrl) {
|
|
116
|
-
return html`
|
|
59
|
+
var LyraMediaViewer = class LyraMediaViewer extends LyraPart {
|
|
60
|
+
constructor(..._args) {
|
|
61
|
+
super(..._args);
|
|
62
|
+
this.scrollMode = "native";
|
|
63
|
+
this.imageNaturalWidth = 0;
|
|
64
|
+
this.imageNaturalHeight = 0;
|
|
65
|
+
this.overlays = [];
|
|
66
|
+
this.onImageLoad = (e) => {
|
|
67
|
+
const img = e.target;
|
|
68
|
+
if (img?.naturalWidth && img?.naturalHeight) {
|
|
69
|
+
this.imageNaturalWidth = img.naturalWidth;
|
|
70
|
+
this.imageNaturalHeight = img.naturalHeight;
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
getMediaUrl() {
|
|
75
|
+
return this.mediaUrl;
|
|
76
|
+
}
|
|
77
|
+
getIsImage() {
|
|
78
|
+
return !!(this.input?.data instanceof File && this.mediaUrl && isImageFile(this.input.data));
|
|
79
|
+
}
|
|
80
|
+
getImageDimensions() {
|
|
81
|
+
return {
|
|
82
|
+
width: this.imageNaturalWidth,
|
|
83
|
+
height: this.imageNaturalHeight
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/** Set overlays drawn on the image (e.g. from object detection or other extensions). Coordinates in 0–1. */
|
|
87
|
+
setOverlays(overlays) {
|
|
88
|
+
this.overlays = overlays ?? [];
|
|
89
|
+
}
|
|
90
|
+
getOverlays() {
|
|
91
|
+
return [...this.overlays];
|
|
92
|
+
}
|
|
93
|
+
clearOverlays() {
|
|
94
|
+
this.overlays = [];
|
|
95
|
+
}
|
|
96
|
+
doClose() {
|
|
97
|
+
if (this.mediaUrl && this.mediaUrl.startsWith("blob:")) URL.revokeObjectURL(this.mediaUrl);
|
|
98
|
+
this.input = void 0;
|
|
99
|
+
this.mediaUrl = void 0;
|
|
100
|
+
this.overlays = [];
|
|
101
|
+
this.imageNaturalWidth = 0;
|
|
102
|
+
this.imageNaturalHeight = 0;
|
|
103
|
+
}
|
|
104
|
+
async doInitUI() {
|
|
105
|
+
await this.loadMedia();
|
|
106
|
+
}
|
|
107
|
+
async loadMedia() {
|
|
108
|
+
if (!this.input?.data || !(this.input.data instanceof File)) return;
|
|
109
|
+
this.mediaUrl = await this.input.data.getContents({ uri: true });
|
|
110
|
+
this.overlays = [];
|
|
111
|
+
}
|
|
112
|
+
renderContent() {
|
|
113
|
+
if (!this.mediaUrl) return html`
|
|
117
114
|
<div style="display: flex; align-items: center; justify-content: center; height: 100%;">
|
|
118
115
|
<wa-spinner></wa-spinner>
|
|
119
116
|
</div>
|
|
120
117
|
`;
|
|
121
|
-
|
|
122
|
-
const isImage = this.getIsImage();
|
|
123
|
-
if (isImage) {
|
|
124
|
-
return html`
|
|
118
|
+
if (this.getIsImage()) return html`
|
|
125
119
|
<div class="image-container">
|
|
126
120
|
<div class="image-wrapper">
|
|
127
121
|
<img
|
|
@@ -153,8 +147,7 @@ let LyraMediaViewer = class extends LyraPart {
|
|
|
153
147
|
</div>
|
|
154
148
|
</div>
|
|
155
149
|
`;
|
|
156
|
-
|
|
157
|
-
return html`
|
|
150
|
+
return html`
|
|
158
151
|
<div class="media-iframe-container">
|
|
159
152
|
<iframe
|
|
160
153
|
src="${this.mediaUrl}"
|
|
@@ -162,9 +155,9 @@ let LyraMediaViewer = class extends LyraPart {
|
|
|
162
155
|
title="Media Viewer"></iframe>
|
|
163
156
|
</div>
|
|
164
157
|
`;
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
158
|
+
}
|
|
159
|
+
static {
|
|
160
|
+
this.styles = css`
|
|
168
161
|
:host {
|
|
169
162
|
display: flex;
|
|
170
163
|
flex-direction: column;
|
|
@@ -248,25 +241,15 @@ LyraMediaViewer.styles = css`
|
|
|
248
241
|
pointer-events: none;
|
|
249
242
|
}
|
|
250
243
|
`;
|
|
251
|
-
|
|
252
|
-
property({ attribute: false })
|
|
253
|
-
], LyraMediaViewer.prototype, "input", 2);
|
|
254
|
-
__decorateClass([
|
|
255
|
-
state()
|
|
256
|
-
], LyraMediaViewer.prototype, "mediaUrl", 2);
|
|
257
|
-
__decorateClass([
|
|
258
|
-
state()
|
|
259
|
-
], LyraMediaViewer.prototype, "imageNaturalWidth", 2);
|
|
260
|
-
__decorateClass([
|
|
261
|
-
state()
|
|
262
|
-
], LyraMediaViewer.prototype, "imageNaturalHeight", 2);
|
|
263
|
-
__decorateClass([
|
|
264
|
-
state()
|
|
265
|
-
], LyraMediaViewer.prototype, "overlays", 2);
|
|
266
|
-
LyraMediaViewer = __decorateClass([
|
|
267
|
-
customElement("lyra-media-viewer")
|
|
268
|
-
], LyraMediaViewer);
|
|
269
|
-
export {
|
|
270
|
-
LyraMediaViewer
|
|
244
|
+
}
|
|
271
245
|
};
|
|
272
|
-
|
|
246
|
+
_decorate([property({ attribute: false })], LyraMediaViewer.prototype, "input", void 0);
|
|
247
|
+
_decorate([state()], LyraMediaViewer.prototype, "mediaUrl", void 0);
|
|
248
|
+
_decorate([state()], LyraMediaViewer.prototype, "imageNaturalWidth", void 0);
|
|
249
|
+
_decorate([state()], LyraMediaViewer.prototype, "imageNaturalHeight", void 0);
|
|
250
|
+
_decorate([state()], LyraMediaViewer.prototype, "overlays", void 0);
|
|
251
|
+
LyraMediaViewer = _decorate([customElement("lyra-media-viewer")], LyraMediaViewer);
|
|
252
|
+
//#endregion
|
|
253
|
+
export { LyraMediaViewer };
|
|
254
|
+
|
|
255
|
+
//# sourceMappingURL=media-viewer-extension-DIdiRDeO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-viewer-extension-DIdiRDeO.js","names":[],"sources":["../src/media-viewer-extension.ts"],"sourcesContent":["import { customElement, property, state } from \"lit/decorators.js\";\nimport { css, html, nothing } from \"lit\";\nimport { LyraPart, EditorInput, editorRegistry, File } from \"@eclipse-lyra/core\";\n\nconst SUPPORTED_EXTENSIONS = [\n '.pdf',\n '.jpg', '.jpeg', '.png', '.gif', '.svg', '.webp', '.bmp', '.ico'\n];\n\nconst getFileIcon = (fileName: string): string => {\n const lowerName = fileName.toLowerCase();\n if (lowerName.endsWith('.pdf')) return 'file-pdf';\n if (lowerName.match(/\\.(jpg|jpeg|png|gif|webp|bmp|ico|svg)$/)) return 'image';\n return 'file';\n};\n\nconst isSupportedMediaFile = (file: File): boolean => {\n const fileName = file.getName().toLowerCase();\n return SUPPORTED_EXTENSIONS.some(ext => fileName.endsWith(ext));\n};\n\nconst IMAGE_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.gif', '.svg', '.webp', '.bmp', '.ico'];\n\nconst isImageFile = (file: File): boolean => {\n const name = file.getName().toLowerCase();\n return IMAGE_EXTENSIONS.some(ext => name.endsWith(ext));\n};\n\n/** Normalized bounding box overlay (0–1). Used by extensions to draw on the image. */\nexport interface BboxOverlay {\n type: 'bbox';\n left: number;\n top: number;\n width: number;\n height: number;\n label?: string;\n /** CSS color for border and label (e.g. by category). */\n color?: string;\n}\n\n/** Segment mask overlay: PNG data URL (alpha where segment is), drawn over the image. */\nexport interface MaskOverlay {\n type: 'mask';\n /** Data URL of the mask image (e.g. image/png with alpha). */\n dataUrl: string;\n label?: string;\n color?: string;\n}\n\nexport type MediaViewerOverlay = BboxOverlay | MaskOverlay;\n\neditorRegistry.registerEditorInputHandler({\n editorId: \"system.media-viewer\",\n label: \"Media viewer\",\n canHandle: input => input instanceof File && isSupportedMediaFile(input),\n handle: async (input: File) => {\n const editorInput = {\n title: input.getWorkspacePath(),\n data: input,\n key: input.getWorkspacePath(),\n icon: getFileIcon(input.getName()),\n state: {},\n } as EditorInput\n editorInput.component = (id: string) => html`\n <lyra-media-viewer id=\"${id}\" .input=${editorInput}></lyra-media-viewer>`\n return editorInput;\n },\n ranking: 1000\n})\n\n@customElement('lyra-media-viewer')\nexport class LyraMediaViewer extends LyraPart {\n protected scrollMode: 'scroller' | 'native' = 'native';\n @property({attribute: false})\n public input?: EditorInput\n\n @state()\n private mediaUrl?: string\n\n @state()\n private imageNaturalWidth = 0\n\n @state()\n private imageNaturalHeight = 0\n\n @state()\n private overlays: MediaViewerOverlay[] = []\n\n getMediaUrl(): string | undefined {\n return this.mediaUrl;\n }\n\n getIsImage(): boolean {\n return !!(this.input?.data instanceof File && this.mediaUrl && isImageFile(this.input.data));\n }\n\n getImageDimensions(): { width: number; height: number } {\n return { width: this.imageNaturalWidth, height: this.imageNaturalHeight };\n }\n\n /** Set overlays drawn on the image (e.g. from object detection or other extensions). Coordinates in 0–1. */\n setOverlays(overlays: MediaViewerOverlay[]): void {\n this.overlays = overlays ?? [];\n }\n\n getOverlays(): MediaViewerOverlay[] {\n return [...this.overlays];\n }\n\n clearOverlays(): void {\n this.overlays = [];\n }\n\n protected doClose() {\n if (this.mediaUrl && this.mediaUrl.startsWith('blob:')) {\n URL.revokeObjectURL(this.mediaUrl)\n }\n this.input = undefined\n this.mediaUrl = undefined\n this.overlays = []\n this.imageNaturalWidth = 0\n this.imageNaturalHeight = 0\n }\n\n protected async doInitUI() {\n await this.loadMedia()\n }\n\n private async loadMedia() {\n if (!this.input?.data || !(this.input.data instanceof File)) {\n return\n }\n\n const file = this.input.data\n const url = await file.getContents({uri: true}) as string\n this.mediaUrl = url\n this.overlays = []\n }\n\n private onImageLoad = (e: Event): void => {\n const img = e.target as HTMLImageElement;\n if (img?.naturalWidth && img?.naturalHeight) {\n this.imageNaturalWidth = img.naturalWidth;\n this.imageNaturalHeight = img.naturalHeight;\n }\n }\n\n protected renderContent() {\n if (!this.mediaUrl) {\n return html`\n <div style=\"display: flex; align-items: center; justify-content: center; height: 100%;\">\n <wa-spinner></wa-spinner>\n </div>\n `\n }\n\n const isImage = this.getIsImage();\n if (isImage) {\n return html`\n <div class=\"image-container\">\n <div class=\"image-wrapper\">\n <img\n class=\"media-image\"\n src=\"${this.mediaUrl}\"\n alt=\"\"\n @load=${this.onImageLoad}\n />\n ${this.overlays.length > 0 ? html`\n <div class=\"overlay-layer\">\n ${this.overlays.map((o) => o.type === 'bbox' ? html`\n <div\n class=\"overlay-bbox\"\n style=\"left: ${o.left * 100}%; top: ${o.top * 100}%; width: ${o.width * 100}%; height: ${o.height * 100}%;${o.color ? ` --overlay-color: ${o.color};` : ''}\"\n title=\"${o.label ?? ''}\"\n >\n ${o.label ? html`<span class=\"overlay-label\">${o.label}</span>` : nothing}\n </div>\n ` : o.type === 'mask' ? html`\n <img\n class=\"overlay-mask\"\n src=\"${o.dataUrl}\"\n alt=\"${o.label ?? ''}\"\n title=\"${o.label ?? ''}\"\n />\n ` : nothing)}\n </div>\n ` : nothing}\n </div>\n </div>\n `;\n }\n\n return html`\n <div class=\"media-iframe-container\">\n <iframe\n src=\"${this.mediaUrl}\"\n class=\"media-iframe\"\n title=\"Media Viewer\"></iframe>\n </div>\n `\n }\n\n static styles = css`\n :host {\n display: flex;\n flex-direction: column;\n position: relative;\n width: 100%;\n height: 100%;\n background: var(--wa-color-surface-default, #1a1a1a);\n }\n\n .image-container {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n }\n\n .image-wrapper {\n position: relative;\n width: 100%;\n height: 100%;\n max-width: 100%;\n max-height: 100%;\n overflow: hidden;\n }\n\n .media-iframe-container {\n position: absolute;\n inset: 0;\n min-height: 0;\n }\n\n .media-iframe {\n display: block;\n width: 100%;\n height: 100%;\n border: 0;\n }\n\n .media-image {\n display: block;\n width: 100%;\n height: 100%;\n object-fit: contain;\n }\n\n .overlay-layer {\n position: absolute;\n inset: 0;\n pointer-events: none;\n }\n\n .overlay-bbox {\n position: absolute;\n border: 2px solid var(--overlay-color, var(--wa-color-brand-fill, #0d6efd));\n background: color-mix(in srgb, var(--overlay-color, #0d6efd) 15%, transparent);\n pointer-events: auto;\n box-sizing: border-box;\n }\n\n .overlay-label {\n position: absolute;\n left: 0;\n top: -1.25em;\n font-size: 0.7rem;\n white-space: nowrap;\n background: var(--overlay-color, var(--wa-color-brand-fill, #0d6efd));\n color: var(--wa-color-surface-default, #fff);\n padding: 1px 4px;\n border-radius: 2px;\n }\n\n .overlay-mask {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n object-fit: fill;\n pointer-events: none;\n }\n `\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'lyra-media-viewer': LyraMediaViewer\n }\n}\n\n"],"mappings":";;;;;AAIA,IAAM,uBAAuB;CACzB;CACA;CAAQ;CAAS;CAAQ;CAAQ;CAAQ;CAAS;CAAQ;CAC7D;AAED,IAAM,eAAe,aAA6B;CAC9C,MAAM,YAAY,SAAS,aAAa;AACxC,KAAI,UAAU,SAAS,OAAO,CAAE,QAAO;AACvC,KAAI,UAAU,MAAM,yCAAyC,CAAE,QAAO;AACtE,QAAO;;AAGX,IAAM,wBAAwB,SAAwB;CAClD,MAAM,WAAW,KAAK,SAAS,CAAC,aAAa;AAC7C,QAAO,qBAAqB,MAAK,QAAO,SAAS,SAAS,IAAI,CAAC;;AAGnE,IAAM,mBAAmB;CAAC;CAAQ;CAAS;CAAQ;CAAQ;CAAQ;CAAS;CAAQ;CAAO;AAE3F,IAAM,eAAe,SAAwB;CACzC,MAAM,OAAO,KAAK,SAAS,CAAC,aAAa;AACzC,QAAO,iBAAiB,MAAK,QAAO,KAAK,SAAS,IAAI,CAAC;;AA0B3D,eAAe,2BAA2B;CACtC,UAAU;CACV,OAAO;CACP,YAAW,UAAS,iBAAiB,QAAQ,qBAAqB,MAAM;CACxE,QAAQ,OAAO,UAAgB;EAC3B,MAAM,cAAc;GAChB,OAAO,MAAM,kBAAkB;GAC/B,MAAM;GACN,KAAK,MAAM,kBAAkB;GAC7B,MAAM,YAAY,MAAM,SAAS,CAAC;GAClC,OAAO,EAAE;GACZ;AACD,cAAY,aAAa,OAAe,IAAI;qCACf,GAAG,WAAW,YAAY;AACvD,SAAO;;CAEX,SAAS;CACZ,CAAC;AAGK,IAAA,kBAAA,MAAM,wBAAwB,SAAS;;;oBACI;2BAQlB;4BAGC;kBAGY,EAAE;sBAqDpB,MAAmB;GACtC,MAAM,MAAM,EAAE;AACd,OAAI,KAAK,gBAAgB,KAAK,eAAe;AACzC,SAAK,oBAAoB,IAAI;AAC7B,SAAK,qBAAqB,IAAI;;;;CAvDtC,cAAkC;AAC9B,SAAO,KAAK;;CAGhB,aAAsB;AAClB,SAAO,CAAC,EAAE,KAAK,OAAO,gBAAgB,QAAQ,KAAK,YAAY,YAAY,KAAK,MAAM,KAAK;;CAG/F,qBAAwD;AACpD,SAAO;GAAE,OAAO,KAAK;GAAmB,QAAQ,KAAK;GAAoB;;;CAI7E,YAAY,UAAsC;AAC9C,OAAK,WAAW,YAAY,EAAE;;CAGlC,cAAoC;AAChC,SAAO,CAAC,GAAG,KAAK,SAAS;;CAG7B,gBAAsB;AAClB,OAAK,WAAW,EAAE;;CAGtB,UAAoB;AAChB,MAAI,KAAK,YAAY,KAAK,SAAS,WAAW,QAAQ,CAClD,KAAI,gBAAgB,KAAK,SAAS;AAEtC,OAAK,QAAQ,KAAA;AACb,OAAK,WAAW,KAAA;AAChB,OAAK,WAAW,EAAE;AAClB,OAAK,oBAAoB;AACzB,OAAK,qBAAqB;;CAG9B,MAAgB,WAAW;AACvB,QAAM,KAAK,WAAW;;CAG1B,MAAc,YAAY;AACtB,MAAI,CAAC,KAAK,OAAO,QAAQ,EAAE,KAAK,MAAM,gBAAgB,MAClD;AAKJ,OAAK,WADO,MADC,KAAK,MAAM,KACD,YAAY,EAAC,KAAK,MAAK,CAAC;AAE/C,OAAK,WAAW,EAAE;;CAWtB,gBAA0B;AACtB,MAAI,CAAC,KAAK,SACN,QAAO,IAAI;;;;;AAQf,MADgB,KAAK,YAAY,CAE7B,QAAO,IAAI;;;;;mCAKY,KAAK,SAAS;;oCAEb,KAAK,YAAY;;0BAE3B,KAAK,SAAS,SAAS,IAAI,IAAI;;kCAEvB,KAAK,SAAS,KAAK,MAAM,EAAE,SAAS,SAAS,IAAI;;;uDAG5B,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,IAAI,YAAY,EAAE,QAAQ,IAAI,aAAa,EAAE,SAAS,IAAI,IAAI,EAAE,QAAQ,qBAAqB,EAAE,MAAM,KAAK,GAAG;iDAClJ,EAAE,SAAS,GAAG;;0CAErB,EAAE,QAAQ,IAAI,+BAA+B,EAAE,MAAM,WAAW,QAAQ;;oCAE9E,EAAE,SAAS,SAAS,IAAI;;;+CAGb,EAAE,QAAQ;+CACV,EAAE,SAAS,GAAG;iDACZ,EAAE,SAAS,GAAG;;oCAE3B,QAAQ,CAAC;;4BAEjB,QAAQ;;;;AAM5B,SAAO,IAAI;;;2BAGQ,KAAK,SAAS;;;;;;;gBAOrB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAjIlB,SAAS,EAAC,WAAW,OAAM,CAAC,CAAA,EAAA,gBAAA,WAAA,SAAA,KAAA,EAAA;WAG5B,OAAO,CAAA,EAAA,gBAAA,WAAA,YAAA,KAAA,EAAA;WAGP,OAAO,CAAA,EAAA,gBAAA,WAAA,qBAAA,KAAA,EAAA;WAGP,OAAO,CAAA,EAAA,gBAAA,WAAA,sBAAA,KAAA,EAAA;WAGP,OAAO,CAAA,EAAA,gBAAA,WAAA,YAAA,KAAA,EAAA;6BAfX,cAAc,oBAAoB,CAAA,EAAA,gBAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eclipse-lyra/extension-media-viewer",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.59",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"exports": {
|
|
@@ -13,8 +13,8 @@
|
|
|
13
13
|
"@eclipse-lyra/core": "*"
|
|
14
14
|
},
|
|
15
15
|
"devDependencies": {
|
|
16
|
-
"typescript": "^
|
|
17
|
-
"vite": "^
|
|
16
|
+
"typescript": "^6.0.0",
|
|
17
|
+
"vite": "^8.0.0",
|
|
18
18
|
"vite-plugin-dts": "^4.5.4"
|
|
19
19
|
},
|
|
20
20
|
"module": "./dist/index.js",
|
package/dist/i18n.de-Dg_5Bnbh.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
const EXT_MEDIAVIEWER_NAME = "Medien-Viewer";
|
|
2
|
-
const EXT_MEDIAVIEWER_DESC = "PDF-, Bild- und HTML-Dateien im Browser anzeigen";
|
|
3
|
-
const i18n_de = {
|
|
4
|
-
EXT_MEDIAVIEWER_NAME,
|
|
5
|
-
EXT_MEDIAVIEWER_DESC
|
|
6
|
-
};
|
|
7
|
-
export {
|
|
8
|
-
EXT_MEDIAVIEWER_DESC,
|
|
9
|
-
EXT_MEDIAVIEWER_NAME,
|
|
10
|
-
i18n_de as default
|
|
11
|
-
};
|
|
12
|
-
//# sourceMappingURL=i18n.de-Dg_5Bnbh.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.de-Dg_5Bnbh.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
package/dist/i18n.en-CvZfcZjj.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
const EXT_MEDIAVIEWER_NAME = "Media Viewer";
|
|
2
|
-
const EXT_MEDIAVIEWER_DESC = "View PDF, image, and HTML files in the browser";
|
|
3
|
-
const i18n_en = {
|
|
4
|
-
EXT_MEDIAVIEWER_NAME,
|
|
5
|
-
EXT_MEDIAVIEWER_DESC
|
|
6
|
-
};
|
|
7
|
-
export {
|
|
8
|
-
EXT_MEDIAVIEWER_DESC,
|
|
9
|
-
EXT_MEDIAVIEWER_NAME,
|
|
10
|
-
i18n_en as default
|
|
11
|
-
};
|
|
12
|
-
//# sourceMappingURL=i18n.en-CvZfcZjj.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.en-CvZfcZjj.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"media-viewer-extension-B7CpFkFz.js","sources":["../src/media-viewer-extension.ts"],"sourcesContent":["import { customElement, property, state } from \"lit/decorators.js\";\nimport { css, html, nothing } from \"lit\";\nimport { LyraPart, EditorInput, editorRegistry, File } from \"@eclipse-lyra/core\";\n\nconst SUPPORTED_EXTENSIONS = [\n '.pdf',\n '.jpg', '.jpeg', '.png', '.gif', '.svg', '.webp', '.bmp', '.ico'\n];\n\nconst getFileIcon = (fileName: string): string => {\n const lowerName = fileName.toLowerCase();\n if (lowerName.endsWith('.pdf')) return 'file-pdf';\n if (lowerName.match(/\\.(jpg|jpeg|png|gif|webp|bmp|ico|svg)$/)) return 'image';\n return 'file';\n};\n\nconst isSupportedMediaFile = (file: File): boolean => {\n const fileName = file.getName().toLowerCase();\n return SUPPORTED_EXTENSIONS.some(ext => fileName.endsWith(ext));\n};\n\nconst IMAGE_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.gif', '.svg', '.webp', '.bmp', '.ico'];\n\nconst isImageFile = (file: File): boolean => {\n const name = file.getName().toLowerCase();\n return IMAGE_EXTENSIONS.some(ext => name.endsWith(ext));\n};\n\n/** Normalized bounding box overlay (0–1). Used by extensions to draw on the image. */\nexport interface BboxOverlay {\n type: 'bbox';\n left: number;\n top: number;\n width: number;\n height: number;\n label?: string;\n /** CSS color for border and label (e.g. by category). */\n color?: string;\n}\n\n/** Segment mask overlay: PNG data URL (alpha where segment is), drawn over the image. */\nexport interface MaskOverlay {\n type: 'mask';\n /** Data URL of the mask image (e.g. image/png with alpha). */\n dataUrl: string;\n label?: string;\n color?: string;\n}\n\nexport type MediaViewerOverlay = BboxOverlay | MaskOverlay;\n\neditorRegistry.registerEditorInputHandler({\n editorId: \"system.media-viewer\",\n label: \"Media viewer\",\n canHandle: input => input instanceof File && isSupportedMediaFile(input),\n handle: async (input: File) => {\n const editorInput = {\n title: input.getWorkspacePath(),\n data: input,\n key: input.getWorkspacePath(),\n icon: getFileIcon(input.getName()),\n state: {},\n } as EditorInput\n editorInput.component = (id: string) => html`\n <lyra-media-viewer id=\"${id}\" .input=${editorInput}></lyra-media-viewer>`\n return editorInput;\n },\n ranking: 1000\n})\n\n@customElement('lyra-media-viewer')\nexport class LyraMediaViewer extends LyraPart {\n protected scrollMode: 'scroller' | 'native' = 'native';\n @property({attribute: false})\n public input?: EditorInput\n\n @state()\n private mediaUrl?: string\n\n @state()\n private imageNaturalWidth = 0\n\n @state()\n private imageNaturalHeight = 0\n\n @state()\n private overlays: MediaViewerOverlay[] = []\n\n getMediaUrl(): string | undefined {\n return this.mediaUrl;\n }\n\n getIsImage(): boolean {\n return !!(this.input?.data instanceof File && this.mediaUrl && isImageFile(this.input.data));\n }\n\n getImageDimensions(): { width: number; height: number } {\n return { width: this.imageNaturalWidth, height: this.imageNaturalHeight };\n }\n\n /** Set overlays drawn on the image (e.g. from object detection or other extensions). Coordinates in 0–1. */\n setOverlays(overlays: MediaViewerOverlay[]): void {\n this.overlays = overlays ?? [];\n }\n\n getOverlays(): MediaViewerOverlay[] {\n return [...this.overlays];\n }\n\n clearOverlays(): void {\n this.overlays = [];\n }\n\n protected doClose() {\n if (this.mediaUrl && this.mediaUrl.startsWith('blob:')) {\n URL.revokeObjectURL(this.mediaUrl)\n }\n this.input = undefined\n this.mediaUrl = undefined\n this.overlays = []\n this.imageNaturalWidth = 0\n this.imageNaturalHeight = 0\n }\n\n protected async doInitUI() {\n await this.loadMedia()\n }\n\n private async loadMedia() {\n if (!this.input?.data || !(this.input.data instanceof File)) {\n return\n }\n\n const file = this.input.data\n const url = await file.getContents({uri: true}) as string\n this.mediaUrl = url\n this.overlays = []\n }\n\n private onImageLoad = (e: Event): void => {\n const img = e.target as HTMLImageElement;\n if (img?.naturalWidth && img?.naturalHeight) {\n this.imageNaturalWidth = img.naturalWidth;\n this.imageNaturalHeight = img.naturalHeight;\n }\n }\n\n protected renderContent() {\n if (!this.mediaUrl) {\n return html`\n <div style=\"display: flex; align-items: center; justify-content: center; height: 100%;\">\n <wa-spinner></wa-spinner>\n </div>\n `\n }\n\n const isImage = this.getIsImage();\n if (isImage) {\n return html`\n <div class=\"image-container\">\n <div class=\"image-wrapper\">\n <img\n class=\"media-image\"\n src=\"${this.mediaUrl}\"\n alt=\"\"\n @load=${this.onImageLoad}\n />\n ${this.overlays.length > 0 ? html`\n <div class=\"overlay-layer\">\n ${this.overlays.map((o) => o.type === 'bbox' ? html`\n <div\n class=\"overlay-bbox\"\n style=\"left: ${o.left * 100}%; top: ${o.top * 100}%; width: ${o.width * 100}%; height: ${o.height * 100}%;${o.color ? ` --overlay-color: ${o.color};` : ''}\"\n title=\"${o.label ?? ''}\"\n >\n ${o.label ? html`<span class=\"overlay-label\">${o.label}</span>` : nothing}\n </div>\n ` : o.type === 'mask' ? html`\n <img\n class=\"overlay-mask\"\n src=\"${o.dataUrl}\"\n alt=\"${o.label ?? ''}\"\n title=\"${o.label ?? ''}\"\n />\n ` : nothing)}\n </div>\n ` : nothing}\n </div>\n </div>\n `;\n }\n\n return html`\n <div class=\"media-iframe-container\">\n <iframe\n src=\"${this.mediaUrl}\"\n class=\"media-iframe\"\n title=\"Media Viewer\"></iframe>\n </div>\n `\n }\n\n static styles = css`\n :host {\n display: flex;\n flex-direction: column;\n position: relative;\n width: 100%;\n height: 100%;\n background: var(--wa-color-surface-default, #1a1a1a);\n }\n\n .image-container {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n }\n\n .image-wrapper {\n position: relative;\n width: 100%;\n height: 100%;\n max-width: 100%;\n max-height: 100%;\n overflow: hidden;\n }\n\n .media-iframe-container {\n position: absolute;\n inset: 0;\n min-height: 0;\n }\n\n .media-iframe {\n display: block;\n width: 100%;\n height: 100%;\n border: 0;\n }\n\n .media-image {\n display: block;\n width: 100%;\n height: 100%;\n object-fit: contain;\n }\n\n .overlay-layer {\n position: absolute;\n inset: 0;\n pointer-events: none;\n }\n\n .overlay-bbox {\n position: absolute;\n border: 2px solid var(--overlay-color, var(--wa-color-brand-fill, #0d6efd));\n background: color-mix(in srgb, var(--overlay-color, #0d6efd) 15%, transparent);\n pointer-events: auto;\n box-sizing: border-box;\n }\n\n .overlay-label {\n position: absolute;\n left: 0;\n top: -1.25em;\n font-size: 0.7rem;\n white-space: nowrap;\n background: var(--overlay-color, var(--wa-color-brand-fill, #0d6efd));\n color: var(--wa-color-surface-default, #fff);\n padding: 1px 4px;\n border-radius: 2px;\n }\n\n .overlay-mask {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n object-fit: fill;\n pointer-events: none;\n }\n `\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'lyra-media-viewer': LyraMediaViewer\n }\n}\n\n"],"names":[],"mappings":"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"}
|