electron-snapora 1.0.1
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/CHANGELOG.md +21 -0
- package/LICENSE +21 -0
- package/README.es.md +79 -0
- package/README.ja.md +79 -0
- package/README.ko.md +79 -0
- package/README.md +392 -0
- package/README.zh-CN.md +79 -0
- package/dist/core/index.cjs +184 -0
- package/dist/core/index.cjs.map +1 -0
- package/dist/core/index.d.cts +97 -0
- package/dist/core/index.d.ts +97 -0
- package/dist/core/index.mjs +150 -0
- package/dist/core/index.mjs.map +1 -0
- package/dist/main/index.cjs +1637 -0
- package/dist/main/index.cjs.map +1 -0
- package/dist/main/index.d.cts +283 -0
- package/dist/main/index.d.ts +283 -0
- package/dist/main/index.mjs +1599 -0
- package/dist/main/index.mjs.map +1 -0
- package/dist/messages-DYY0MpGh.d.ts +76 -0
- package/dist/messages-ifub9bae.d.cts +76 -0
- package/dist/overlay/assets/index-7dVRGn83.css +1 -0
- package/dist/overlay/assets/index-CJf5iC1U.js +2 -0
- package/dist/overlay/assets/index-CJf5iC1U.js.map +1 -0
- package/dist/overlay/index.html +316 -0
- package/dist/overlay/preload.cjs +97 -0
- package/dist/overlay/preload.cjs.map +1 -0
- package/dist/overlay/preload.d.cts +16 -0
- package/dist/overlay/preload.d.ts +16 -0
- package/dist/overlay/preload.mjs +80 -0
- package/dist/overlay/preload.mjs.map +1 -0
- package/dist/preload/auto.cjs +24 -0
- package/dist/preload/auto.cjs.map +1 -0
- package/dist/preload/auto.d.cts +2 -0
- package/dist/preload/auto.d.ts +2 -0
- package/dist/preload/auto.mjs +22 -0
- package/dist/preload/auto.mjs.map +1 -0
- package/dist/preload/index.cjs +46 -0
- package/dist/preload/index.cjs.map +1 -0
- package/dist/preload/index.d.cts +18 -0
- package/dist/preload/index.d.ts +18 -0
- package/dist/preload/index.mjs +19 -0
- package/dist/preload/index.mjs.map +1 -0
- package/dist/types/index.cjs +19 -0
- package/dist/types/index.cjs.map +1 -0
- package/dist/types/index.d.cts +92 -0
- package/dist/types/index.d.ts +92 -0
- package/dist/types/index.mjs +1 -0
- package/dist/types/index.mjs.map +1 -0
- package/package.json +158 -0
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta
|
|
6
|
+
http-equiv="Content-Security-Policy"
|
|
7
|
+
content="default-src 'self' data:; img-src 'self' data: blob:; style-src 'self' 'unsafe-inline'; script-src 'self'"
|
|
8
|
+
/>
|
|
9
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
10
|
+
<title>Electron Snapora</title>
|
|
11
|
+
<script type="module" crossorigin src="./assets/index-CJf5iC1U.js"></script>
|
|
12
|
+
<link rel="stylesheet" crossorigin href="./assets/index-7dVRGn83.css">
|
|
13
|
+
</head>
|
|
14
|
+
<body>
|
|
15
|
+
<main id="app" aria-live="polite">
|
|
16
|
+
<div class="capture-surface" data-state="waiting">
|
|
17
|
+
<img class="screen-frame" alt="" draggable="false" />
|
|
18
|
+
<canvas class="annotation-canvas" aria-label="Screenshot annotations"></canvas>
|
|
19
|
+
<div class="screen-mask" aria-hidden="true"></div>
|
|
20
|
+
<div class="selection" role="group" aria-label="Screenshot selection" hidden>
|
|
21
|
+
<output class="size-hint" aria-live="off"></output>
|
|
22
|
+
<span
|
|
23
|
+
class="resize-handle handle-nw"
|
|
24
|
+
data-handle="nw"
|
|
25
|
+
aria-hidden="true"
|
|
26
|
+
></span>
|
|
27
|
+
<span
|
|
28
|
+
class="resize-handle handle-n"
|
|
29
|
+
data-handle="n"
|
|
30
|
+
aria-hidden="true"
|
|
31
|
+
></span>
|
|
32
|
+
<span
|
|
33
|
+
class="resize-handle handle-ne"
|
|
34
|
+
data-handle="ne"
|
|
35
|
+
aria-hidden="true"
|
|
36
|
+
></span>
|
|
37
|
+
<span
|
|
38
|
+
class="resize-handle handle-e"
|
|
39
|
+
data-handle="e"
|
|
40
|
+
aria-hidden="true"
|
|
41
|
+
></span>
|
|
42
|
+
<span
|
|
43
|
+
class="resize-handle handle-se"
|
|
44
|
+
data-handle="se"
|
|
45
|
+
aria-hidden="true"
|
|
46
|
+
></span>
|
|
47
|
+
<span
|
|
48
|
+
class="resize-handle handle-s"
|
|
49
|
+
data-handle="s"
|
|
50
|
+
aria-hidden="true"
|
|
51
|
+
></span>
|
|
52
|
+
<span
|
|
53
|
+
class="resize-handle handle-sw"
|
|
54
|
+
data-handle="sw"
|
|
55
|
+
aria-hidden="true"
|
|
56
|
+
></span>
|
|
57
|
+
<span
|
|
58
|
+
class="resize-handle handle-w"
|
|
59
|
+
data-handle="w"
|
|
60
|
+
aria-hidden="true"
|
|
61
|
+
></span>
|
|
62
|
+
</div>
|
|
63
|
+
<div
|
|
64
|
+
class="selection-toolbar"
|
|
65
|
+
role="toolbar"
|
|
66
|
+
aria-label="Screenshot actions"
|
|
67
|
+
hidden
|
|
68
|
+
>
|
|
69
|
+
<div class="toolbar-panel selection-tool-panel">
|
|
70
|
+
<button
|
|
71
|
+
class="tool-button icon-button"
|
|
72
|
+
type="button"
|
|
73
|
+
data-tool="select"
|
|
74
|
+
data-tooltip="Select"
|
|
75
|
+
data-shortcut="V"
|
|
76
|
+
aria-label="Select"
|
|
77
|
+
>
|
|
78
|
+
<svg class="toolbar-icon" aria-hidden="true">
|
|
79
|
+
<use href="#icon-pointer"></use>
|
|
80
|
+
</svg>
|
|
81
|
+
</button>
|
|
82
|
+
</div>
|
|
83
|
+
<div
|
|
84
|
+
class="toolbar-panel toolbar-group tool-group"
|
|
85
|
+
aria-label="Annotation tools"
|
|
86
|
+
>
|
|
87
|
+
<label class="color-control" data-tooltip="Color">
|
|
88
|
+
<span class="sr-only">Color</span>
|
|
89
|
+
<input class="color-input" type="color" value="#ff3b30" />
|
|
90
|
+
</label>
|
|
91
|
+
<button
|
|
92
|
+
class="tool-button icon-button"
|
|
93
|
+
type="button"
|
|
94
|
+
data-tool="rectangle"
|
|
95
|
+
data-tooltip="Rectangle"
|
|
96
|
+
data-shortcut="R"
|
|
97
|
+
aria-label="Rectangle"
|
|
98
|
+
>
|
|
99
|
+
<svg class="toolbar-icon" aria-hidden="true">
|
|
100
|
+
<use href="#icon-rectangle"></use>
|
|
101
|
+
</svg>
|
|
102
|
+
</button>
|
|
103
|
+
<button
|
|
104
|
+
class="tool-button icon-button"
|
|
105
|
+
type="button"
|
|
106
|
+
data-tool="ellipse"
|
|
107
|
+
data-tooltip="Ellipse"
|
|
108
|
+
data-shortcut="O"
|
|
109
|
+
aria-label="Ellipse"
|
|
110
|
+
>
|
|
111
|
+
<svg class="toolbar-icon" aria-hidden="true">
|
|
112
|
+
<use href="#icon-ellipse"></use>
|
|
113
|
+
</svg>
|
|
114
|
+
</button>
|
|
115
|
+
<button
|
|
116
|
+
class="tool-button icon-button"
|
|
117
|
+
type="button"
|
|
118
|
+
data-tool="arrow"
|
|
119
|
+
data-tooltip="Arrow"
|
|
120
|
+
data-shortcut="A"
|
|
121
|
+
aria-label="Arrow"
|
|
122
|
+
>
|
|
123
|
+
<svg class="toolbar-icon" aria-hidden="true">
|
|
124
|
+
<use href="#icon-arrow"></use>
|
|
125
|
+
</svg>
|
|
126
|
+
</button>
|
|
127
|
+
<button
|
|
128
|
+
class="tool-button icon-button"
|
|
129
|
+
type="button"
|
|
130
|
+
data-tool="brush"
|
|
131
|
+
data-tooltip="Brush"
|
|
132
|
+
data-shortcut="P"
|
|
133
|
+
aria-label="Brush"
|
|
134
|
+
>
|
|
135
|
+
<svg class="toolbar-icon" aria-hidden="true">
|
|
136
|
+
<use href="#icon-brush"></use>
|
|
137
|
+
</svg>
|
|
138
|
+
</button>
|
|
139
|
+
<button
|
|
140
|
+
class="tool-button icon-button"
|
|
141
|
+
type="button"
|
|
142
|
+
data-tool="text"
|
|
143
|
+
data-tooltip="Text"
|
|
144
|
+
data-shortcut="T"
|
|
145
|
+
aria-label="Text"
|
|
146
|
+
>
|
|
147
|
+
<svg class="toolbar-icon" aria-hidden="true">
|
|
148
|
+
<use href="#icon-text"></use>
|
|
149
|
+
</svg>
|
|
150
|
+
</button>
|
|
151
|
+
<button
|
|
152
|
+
class="tool-button icon-button"
|
|
153
|
+
type="button"
|
|
154
|
+
data-tool="mosaic"
|
|
155
|
+
data-tooltip="Mosaic"
|
|
156
|
+
data-shortcut="M"
|
|
157
|
+
aria-label="Mosaic"
|
|
158
|
+
>
|
|
159
|
+
<svg class="toolbar-icon icon-mosaic" aria-hidden="true">
|
|
160
|
+
<use href="#icon-mosaic"></use>
|
|
161
|
+
</svg>
|
|
162
|
+
</button>
|
|
163
|
+
</div>
|
|
164
|
+
<div class="toolbar-panel toolbar-group settings-panel">
|
|
165
|
+
<div class="toolbar-group history-group" aria-label="History">
|
|
166
|
+
<button
|
|
167
|
+
class="tool-button icon-button undo-button"
|
|
168
|
+
type="button"
|
|
169
|
+
data-tooltip="Undo"
|
|
170
|
+
data-shortcut="Ctrl/⌘ Z"
|
|
171
|
+
aria-label="Undo"
|
|
172
|
+
disabled
|
|
173
|
+
>
|
|
174
|
+
<svg class="toolbar-icon" aria-hidden="true">
|
|
175
|
+
<use href="#icon-undo"></use>
|
|
176
|
+
</svg>
|
|
177
|
+
</button>
|
|
178
|
+
<button
|
|
179
|
+
class="tool-button icon-button redo-button"
|
|
180
|
+
type="button"
|
|
181
|
+
data-tooltip="Redo"
|
|
182
|
+
data-shortcut="Ctrl/⌘ ⇧ Z"
|
|
183
|
+
aria-label="Redo"
|
|
184
|
+
disabled
|
|
185
|
+
>
|
|
186
|
+
<svg class="toolbar-icon" aria-hidden="true">
|
|
187
|
+
<use href="#icon-redo"></use>
|
|
188
|
+
</svg>
|
|
189
|
+
</button>
|
|
190
|
+
</div>
|
|
191
|
+
<span class="toolbar-divider" aria-hidden="true"></span>
|
|
192
|
+
<div class="toolbar-group style-group" aria-label="Annotation style">
|
|
193
|
+
<label class="select-control line-control" data-tooltip="Line width">
|
|
194
|
+
<span class="sr-only">Line width</span>
|
|
195
|
+
<select class="line-width-select" aria-label="Line width">
|
|
196
|
+
<option value="2">2</option>
|
|
197
|
+
<option value="4" selected>4</option>
|
|
198
|
+
<option value="6">6</option>
|
|
199
|
+
<option value="10">10</option>
|
|
200
|
+
</select>
|
|
201
|
+
</label>
|
|
202
|
+
<label class="select-control font-control" data-tooltip="Font size">
|
|
203
|
+
<span class="sr-only">Font size</span>
|
|
204
|
+
<select class="font-size-select" aria-label="Font size">
|
|
205
|
+
<option value="16">16</option>
|
|
206
|
+
<option value="24" selected>24</option>
|
|
207
|
+
<option value="32">32</option>
|
|
208
|
+
<option value="48">48</option>
|
|
209
|
+
</select>
|
|
210
|
+
</label>
|
|
211
|
+
</div>
|
|
212
|
+
</div>
|
|
213
|
+
<div
|
|
214
|
+
class="toolbar-panel toolbar-group action-group"
|
|
215
|
+
aria-label="Output actions"
|
|
216
|
+
>
|
|
217
|
+
<button
|
|
218
|
+
class="toolbar-button icon-button save-button"
|
|
219
|
+
type="button"
|
|
220
|
+
data-tooltip="Save"
|
|
221
|
+
data-shortcut="Ctrl/⌘ S"
|
|
222
|
+
aria-label="Save"
|
|
223
|
+
>
|
|
224
|
+
<svg class="toolbar-icon" aria-hidden="true">
|
|
225
|
+
<use href="#icon-save"></use>
|
|
226
|
+
</svg>
|
|
227
|
+
</button>
|
|
228
|
+
<button
|
|
229
|
+
class="toolbar-button icon-button cancel-button"
|
|
230
|
+
type="button"
|
|
231
|
+
data-tooltip="Cancel"
|
|
232
|
+
data-shortcut="Esc"
|
|
233
|
+
aria-label="Cancel"
|
|
234
|
+
>
|
|
235
|
+
<svg class="toolbar-icon" aria-hidden="true">
|
|
236
|
+
<use href="#icon-close"></use>
|
|
237
|
+
</svg>
|
|
238
|
+
</button>
|
|
239
|
+
<button
|
|
240
|
+
class="toolbar-button icon-button confirm-button"
|
|
241
|
+
type="button"
|
|
242
|
+
data-tooltip="Copy & Done"
|
|
243
|
+
data-shortcut="Enter / Ctrl/⌘ C"
|
|
244
|
+
aria-label="Copy & Done"
|
|
245
|
+
>
|
|
246
|
+
<svg class="toolbar-icon" aria-hidden="true">
|
|
247
|
+
<use href="#icon-check"></use>
|
|
248
|
+
</svg>
|
|
249
|
+
</button>
|
|
250
|
+
</div>
|
|
251
|
+
</div>
|
|
252
|
+
<textarea
|
|
253
|
+
class="text-editor"
|
|
254
|
+
rows="1"
|
|
255
|
+
maxlength="500"
|
|
256
|
+
aria-label="Annotation text"
|
|
257
|
+
hidden
|
|
258
|
+
></textarea>
|
|
259
|
+
<p class="status">Preparing screenshot…</p>
|
|
260
|
+
<div class="copy-feedback" role="status" aria-live="polite" hidden>
|
|
261
|
+
<span class="copy-feedback-icon" aria-hidden="true">
|
|
262
|
+
<svg class="copy-feedback-check" viewBox="0 0 24 24">
|
|
263
|
+
<path d="m4.8 12.4 4.2 4.2L19.2 6.4l-1.8-1.8L9 13l-2.4-2.4z"></path>
|
|
264
|
+
</svg>
|
|
265
|
+
</span>
|
|
266
|
+
<span class="copy-feedback-text">Copied to clipboard</span>
|
|
267
|
+
</div>
|
|
268
|
+
</div>
|
|
269
|
+
</main>
|
|
270
|
+
<svg class="icon-sprite" aria-hidden="true">
|
|
271
|
+
<symbol id="icon-pointer" viewBox="0 0 24 24">
|
|
272
|
+
<path d="M5 3.8 18.5 14l-6.2 1.1-3.2 5.4L5 3.8Z" />
|
|
273
|
+
</symbol>
|
|
274
|
+
<symbol id="icon-rectangle" viewBox="0 0 24 24">
|
|
275
|
+
<rect x="4.5" y="5" width="15" height="14" rx="1.5" />
|
|
276
|
+
</symbol>
|
|
277
|
+
<symbol id="icon-ellipse" viewBox="0 0 24 24">
|
|
278
|
+
<ellipse cx="12" cy="12" rx="7.5" ry="7" />
|
|
279
|
+
</symbol>
|
|
280
|
+
<symbol id="icon-arrow" viewBox="0 0 24 24">
|
|
281
|
+
<path d="m5 19 14-14M10 5h9v9" />
|
|
282
|
+
</symbol>
|
|
283
|
+
<symbol id="icon-brush" viewBox="0 0 24 24">
|
|
284
|
+
<path d="m10.2 13.8 7.9-9.5a1.8 1.8 0 0 1 2.6 2.5l-9.5 8" />
|
|
285
|
+
<path
|
|
286
|
+
d="M10.2 13.8c-2.5-1.2-4.8.2-5.2 3.2-.2 1.6-1 2.5-2 3 4.2.7 7.3-.4 8.2-3.2.3-1 .1-2-.9-3Z"
|
|
287
|
+
/>
|
|
288
|
+
<path d="m12.6 10.9 2.6 2.6" />
|
|
289
|
+
</symbol>
|
|
290
|
+
<symbol id="icon-text" viewBox="0 0 24 24">
|
|
291
|
+
<path d="M5 7V4.5h14V7M12 4.5v15M8.5 19.5h7" />
|
|
292
|
+
</symbol>
|
|
293
|
+
<symbol id="icon-mosaic" viewBox="0 0 24 24">
|
|
294
|
+
<rect x="4" y="4" width="6" height="6" rx="1" />
|
|
295
|
+
<rect x="14" y="4" width="6" height="6" rx="1" />
|
|
296
|
+
<rect x="4" y="14" width="6" height="6" rx="1" />
|
|
297
|
+
<rect x="14" y="14" width="6" height="6" rx="1" />
|
|
298
|
+
</symbol>
|
|
299
|
+
<symbol id="icon-undo" viewBox="0 0 24 24">
|
|
300
|
+
<path d="m9 7-4 4 4 4M5 11h8.5a5.5 5.5 0 0 1 5.5 5.5" />
|
|
301
|
+
</symbol>
|
|
302
|
+
<symbol id="icon-redo" viewBox="0 0 24 24">
|
|
303
|
+
<path d="m15 7 4 4-4 4M19 11h-8.5A5.5 5.5 0 0 0 5 16.5" />
|
|
304
|
+
</symbol>
|
|
305
|
+
<symbol id="icon-save" viewBox="0 0 24 24">
|
|
306
|
+
<path d="M12 3v11m0 0 4-4m-4 4-4-4M5 16v3h14v-3" />
|
|
307
|
+
</symbol>
|
|
308
|
+
<symbol id="icon-close" viewBox="0 0 24 24">
|
|
309
|
+
<path d="m6 6 12 12M18 6 6 18" />
|
|
310
|
+
</symbol>
|
|
311
|
+
<symbol id="icon-check" viewBox="0 0 24 24">
|
|
312
|
+
<path d="m5 12.5 4.3 4.3L19 7" />
|
|
313
|
+
</symbol>
|
|
314
|
+
</svg>
|
|
315
|
+
</body>
|
|
316
|
+
</html>
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __copyProps = (to, from, except, desc) => {
|
|
7
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
8
|
+
for (let key of __getOwnPropNames(from))
|
|
9
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
10
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
11
|
+
}
|
|
12
|
+
return to;
|
|
13
|
+
};
|
|
14
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
15
|
+
|
|
16
|
+
// src/electron/preload/overlay-preload.ts
|
|
17
|
+
var overlay_preload_exports = {};
|
|
18
|
+
module.exports = __toCommonJS(overlay_preload_exports);
|
|
19
|
+
var import_electron = require("electron");
|
|
20
|
+
|
|
21
|
+
// src/electron/protocol/channels.ts
|
|
22
|
+
var OVERLAY_CHANNELS = {
|
|
23
|
+
ready: "electron-snapora:overlay:ready",
|
|
24
|
+
prepared: "electron-snapora:overlay:prepared",
|
|
25
|
+
initialize: "electron-snapora:overlay:initialize",
|
|
26
|
+
feedback: "electron-snapora:overlay:feedback",
|
|
27
|
+
feedbackReady: "electron-snapora:overlay:feedback-ready",
|
|
28
|
+
confirm: "electron-snapora:overlay:confirm",
|
|
29
|
+
cancel: "electron-snapora:overlay:cancel",
|
|
30
|
+
error: "electron-snapora:overlay:error",
|
|
31
|
+
output: "electron-snapora:overlay:output"
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
// src/electron/protocol/messages.ts
|
|
35
|
+
var SCREENSHOT_PROTOCOL_VERSION = 1;
|
|
36
|
+
|
|
37
|
+
// src/electron/preload/overlay-preload.ts
|
|
38
|
+
var overlayApi = {
|
|
39
|
+
onInitialize(listener) {
|
|
40
|
+
const handler = (_event, payload) => {
|
|
41
|
+
listener(payload);
|
|
42
|
+
};
|
|
43
|
+
import_electron.ipcRenderer.on(OVERLAY_CHANNELS.initialize, handler);
|
|
44
|
+
return () => {
|
|
45
|
+
import_electron.ipcRenderer.removeListener(OVERLAY_CHANNELS.initialize, handler);
|
|
46
|
+
};
|
|
47
|
+
},
|
|
48
|
+
onFeedback(listener) {
|
|
49
|
+
const handler = (_event, payload) => {
|
|
50
|
+
listener(payload);
|
|
51
|
+
};
|
|
52
|
+
import_electron.ipcRenderer.on(OVERLAY_CHANNELS.feedback, handler);
|
|
53
|
+
return () => {
|
|
54
|
+
import_electron.ipcRenderer.removeListener(OVERLAY_CHANNELS.feedback, handler);
|
|
55
|
+
};
|
|
56
|
+
},
|
|
57
|
+
confirm(payload) {
|
|
58
|
+
import_electron.ipcRenderer.send(OVERLAY_CHANNELS.confirm, {
|
|
59
|
+
protocolVersion: SCREENSHOT_PROTOCOL_VERSION,
|
|
60
|
+
...payload
|
|
61
|
+
});
|
|
62
|
+
},
|
|
63
|
+
cancel(jobId) {
|
|
64
|
+
import_electron.ipcRenderer.send(OVERLAY_CHANNELS.cancel, {
|
|
65
|
+
protocolVersion: SCREENSHOT_PROTOCOL_VERSION,
|
|
66
|
+
jobId
|
|
67
|
+
});
|
|
68
|
+
},
|
|
69
|
+
reportError(payload) {
|
|
70
|
+
import_electron.ipcRenderer.send(OVERLAY_CHANNELS.error, {
|
|
71
|
+
protocolVersion: SCREENSHOT_PROTOCOL_VERSION,
|
|
72
|
+
...payload
|
|
73
|
+
});
|
|
74
|
+
},
|
|
75
|
+
output(payload) {
|
|
76
|
+
return import_electron.ipcRenderer.invoke(OVERLAY_CHANNELS.output, {
|
|
77
|
+
protocolVersion: SCREENSHOT_PROTOCOL_VERSION,
|
|
78
|
+
...payload
|
|
79
|
+
});
|
|
80
|
+
},
|
|
81
|
+
feedbackReady() {
|
|
82
|
+
import_electron.ipcRenderer.send(OVERLAY_CHANNELS.feedbackReady);
|
|
83
|
+
},
|
|
84
|
+
ready() {
|
|
85
|
+
import_electron.ipcRenderer.send(OVERLAY_CHANNELS.ready, {
|
|
86
|
+
protocolVersion: SCREENSHOT_PROTOCOL_VERSION
|
|
87
|
+
});
|
|
88
|
+
},
|
|
89
|
+
prepared(jobId) {
|
|
90
|
+
import_electron.ipcRenderer.send(OVERLAY_CHANNELS.prepared, {
|
|
91
|
+
protocolVersion: SCREENSHOT_PROTOCOL_VERSION,
|
|
92
|
+
jobId
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
import_electron.contextBridge.exposeInMainWorld("snaporaOverlay", overlayApi);
|
|
97
|
+
//# sourceMappingURL=preload.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/electron/preload/overlay-preload.ts","../../src/electron/protocol/channels.ts","../../src/electron/protocol/messages.ts"],"sourcesContent":["import { contextBridge, ipcRenderer } from 'electron';\n\nimport { OVERLAY_CHANNELS } from '../protocol/channels.js';\nimport { SCREENSHOT_PROTOCOL_VERSION } from '../protocol/messages.js';\nimport type {\n ScreenshotCompletePayload,\n ScreenshotErrorPayload,\n ScreenshotFeedbackPayload,\n ScreenshotInitializePayload,\n ScreenshotOutputPayload,\n ScreenshotOutputResponse,\n} from '../protocol/messages.js';\n\nexport interface ScreenshotOverlayApi {\n onInitialize(listener: (payload: ScreenshotInitializePayload) => void): () => void;\n onFeedback(listener: (payload: ScreenshotFeedbackPayload) => void): () => void;\n confirm(payload: Omit<ScreenshotCompletePayload, 'protocolVersion'>): void;\n cancel(jobId: string): void;\n reportError(payload: Omit<ScreenshotErrorPayload, 'protocolVersion'>): void;\n output(\n payload: Omit<ScreenshotOutputPayload, 'protocolVersion'>\n ): Promise<ScreenshotOutputResponse>;\n feedbackReady(): void;\n ready(): void;\n prepared(jobId: string): void;\n}\n\nconst overlayApi: ScreenshotOverlayApi = {\n onInitialize(listener) {\n const handler = (\n _event: Electron.IpcRendererEvent,\n payload: ScreenshotInitializePayload\n ) => {\n listener(payload);\n };\n\n ipcRenderer.on(OVERLAY_CHANNELS.initialize, handler);\n return () => {\n ipcRenderer.removeListener(OVERLAY_CHANNELS.initialize, handler);\n };\n },\n onFeedback(listener) {\n const handler = (\n _event: Electron.IpcRendererEvent,\n payload: ScreenshotFeedbackPayload\n ) => {\n listener(payload);\n };\n\n ipcRenderer.on(OVERLAY_CHANNELS.feedback, handler);\n return () => {\n ipcRenderer.removeListener(OVERLAY_CHANNELS.feedback, handler);\n };\n },\n confirm(payload) {\n ipcRenderer.send(OVERLAY_CHANNELS.confirm, {\n protocolVersion: SCREENSHOT_PROTOCOL_VERSION,\n ...payload,\n });\n },\n cancel(jobId) {\n ipcRenderer.send(OVERLAY_CHANNELS.cancel, {\n protocolVersion: SCREENSHOT_PROTOCOL_VERSION,\n jobId,\n });\n },\n reportError(payload) {\n ipcRenderer.send(OVERLAY_CHANNELS.error, {\n protocolVersion: SCREENSHOT_PROTOCOL_VERSION,\n ...payload,\n });\n },\n output(payload) {\n return ipcRenderer.invoke(OVERLAY_CHANNELS.output, {\n protocolVersion: SCREENSHOT_PROTOCOL_VERSION,\n ...payload,\n }) as Promise<ScreenshotOutputResponse>;\n },\n feedbackReady() {\n ipcRenderer.send(OVERLAY_CHANNELS.feedbackReady);\n },\n ready() {\n ipcRenderer.send(OVERLAY_CHANNELS.ready, {\n protocolVersion: SCREENSHOT_PROTOCOL_VERSION,\n });\n },\n prepared(jobId) {\n ipcRenderer.send(OVERLAY_CHANNELS.prepared, {\n protocolVersion: SCREENSHOT_PROTOCOL_VERSION,\n jobId,\n });\n },\n};\n\ncontextBridge.exposeInMainWorld('snaporaOverlay', overlayApi);\n","export const DEFAULT_HOST_CAPTURE_CHANNEL = 'electron-snapora:host:capture';\nexport const DEFAULT_HOST_CANCEL_CHANNEL = 'electron-snapora:host:cancel';\n\nexport const OVERLAY_CHANNELS = {\n ready: 'electron-snapora:overlay:ready',\n prepared: 'electron-snapora:overlay:prepared',\n initialize: 'electron-snapora:overlay:initialize',\n feedback: 'electron-snapora:overlay:feedback',\n feedbackReady: 'electron-snapora:overlay:feedback-ready',\n confirm: 'electron-snapora:overlay:confirm',\n cancel: 'electron-snapora:overlay:cancel',\n error: 'electron-snapora:overlay:error',\n output: 'electron-snapora:overlay:output',\n} as const;\n","import type {\n ScreenshotBounds,\n ScreenshotErrorCode,\n ScreenshotImageResult,\n ScreenshotOptions,\n ScreenshotResult,\n} from '../../types.js';\n\nexport const SCREENSHOT_PROTOCOL_VERSION = 1 as const;\n\nexport interface ScreenshotReadyPayload {\n protocolVersion: typeof SCREENSHOT_PROTOCOL_VERSION;\n}\n\nexport interface ScreenshotPreparedPayload extends ScreenshotReadyPayload {\n jobId: string;\n}\n\nexport interface CaptureDisplay {\n id: string;\n bounds: ScreenshotBounds;\n scaleFactor: number;\n}\n\nexport interface CapturedFrame {\n display: CaptureDisplay;\n dataUrl: string;\n pixelSize: {\n width: number;\n height: number;\n };\n}\n\nexport interface ScreenCaptureAdapter {\n /**\n * 可选的同步目标解析,用于让主进程在屏幕采集期间并行加载隐藏 Overlay。\n * 返回值会作为锁定目标传给紧随其后的 capture(),避免鼠标跨屏造成截图与窗口错位。\n */\n resolveTargetDisplay?(options: ScreenshotOptions): CaptureDisplay;\n capture(\n options: ScreenshotOptions,\n targetDisplay?: CaptureDisplay\n ): Promise<CapturedFrame[]>;\n}\n\nexport interface ScreenshotInitializePayload {\n protocolVersion: typeof SCREENSHOT_PROTOCOL_VERSION;\n jobId: string;\n options: ScreenshotOptions;\n frames: CapturedFrame[];\n}\n\nexport interface ScreenshotFeedbackPayload {\n kind: 'copy';\n durationMs: number;\n options: ScreenshotOptions;\n}\n\nexport interface ScreenshotCompletePayload {\n protocolVersion: typeof SCREENSHOT_PROTOCOL_VERSION;\n jobId: string;\n result: ScreenshotResult;\n}\n\nexport interface ScreenshotCancelPayload {\n protocolVersion: typeof SCREENSHOT_PROTOCOL_VERSION;\n jobId: string;\n}\n\nexport interface ScreenshotErrorPayload {\n protocolVersion: typeof SCREENSHOT_PROTOCOL_VERSION;\n jobId: string;\n code: ScreenshotErrorCode;\n message: string;\n}\n\nexport type ScreenshotOutputAction = 'save' | 'copy';\n\nexport interface ScreenshotOutputPayload {\n protocolVersion: typeof SCREENSHOT_PROTOCOL_VERSION;\n jobId: string;\n action: ScreenshotOutputAction;\n result: ScreenshotImageResult;\n}\n\nexport type ScreenshotOutputResponse =\n | { status: 'completed'; action: 'copy' }\n | { status: 'completed'; action: 'save'; filePath: string }\n | { status: 'cancelled' }\n | { status: 'failed'; code: ScreenshotErrorCode; message: string };\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;AAAA,sBAA2C;;;ACGpC,IAAM,mBAAmB;AAAA,EAC9B,OAAO;AAAA,EACP,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,eAAe;AAAA,EACf,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AACV;;;ACLO,IAAM,8BAA8B;;;AFmB3C,IAAM,aAAmC;AAAA,EACvC,aAAa,UAAU;AACrB,UAAM,UAAU,CACd,QACA,YACG;AACH,eAAS,OAAO;AAAA,IAClB;AAEA,gCAAY,GAAG,iBAAiB,YAAY,OAAO;AACnD,WAAO,MAAM;AACX,kCAAY,eAAe,iBAAiB,YAAY,OAAO;AAAA,IACjE;AAAA,EACF;AAAA,EACA,WAAW,UAAU;AACnB,UAAM,UAAU,CACd,QACA,YACG;AACH,eAAS,OAAO;AAAA,IAClB;AAEA,gCAAY,GAAG,iBAAiB,UAAU,OAAO;AACjD,WAAO,MAAM;AACX,kCAAY,eAAe,iBAAiB,UAAU,OAAO;AAAA,IAC/D;AAAA,EACF;AAAA,EACA,QAAQ,SAAS;AACf,gCAAY,KAAK,iBAAiB,SAAS;AAAA,MACzC,iBAAiB;AAAA,MACjB,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA,EACA,OAAO,OAAO;AACZ,gCAAY,KAAK,iBAAiB,QAAQ;AAAA,MACxC,iBAAiB;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EACA,YAAY,SAAS;AACnB,gCAAY,KAAK,iBAAiB,OAAO;AAAA,MACvC,iBAAiB;AAAA,MACjB,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA,EACA,OAAO,SAAS;AACd,WAAO,4BAAY,OAAO,iBAAiB,QAAQ;AAAA,MACjD,iBAAiB;AAAA,MACjB,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA,EACA,gBAAgB;AACd,gCAAY,KAAK,iBAAiB,aAAa;AAAA,EACjD;AAAA,EACA,QAAQ;AACN,gCAAY,KAAK,iBAAiB,OAAO;AAAA,MACvC,iBAAiB;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EACA,SAAS,OAAO;AACd,gCAAY,KAAK,iBAAiB,UAAU;AAAA,MAC1C,iBAAiB;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,8BAAc,kBAAkB,kBAAkB,UAAU;","names":[]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { S as ScreenshotInitializePayload, a as ScreenshotFeedbackPayload, b as ScreenshotCompletePayload, c as ScreenshotErrorPayload, d as ScreenshotOutputPayload, e as ScreenshotOutputResponse } from '../messages-ifub9bae.cjs';
|
|
2
|
+
import '../types/index.cjs';
|
|
3
|
+
|
|
4
|
+
interface ScreenshotOverlayApi {
|
|
5
|
+
onInitialize(listener: (payload: ScreenshotInitializePayload) => void): () => void;
|
|
6
|
+
onFeedback(listener: (payload: ScreenshotFeedbackPayload) => void): () => void;
|
|
7
|
+
confirm(payload: Omit<ScreenshotCompletePayload, 'protocolVersion'>): void;
|
|
8
|
+
cancel(jobId: string): void;
|
|
9
|
+
reportError(payload: Omit<ScreenshotErrorPayload, 'protocolVersion'>): void;
|
|
10
|
+
output(payload: Omit<ScreenshotOutputPayload, 'protocolVersion'>): Promise<ScreenshotOutputResponse>;
|
|
11
|
+
feedbackReady(): void;
|
|
12
|
+
ready(): void;
|
|
13
|
+
prepared(jobId: string): void;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export type { ScreenshotOverlayApi };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { S as ScreenshotInitializePayload, a as ScreenshotFeedbackPayload, b as ScreenshotCompletePayload, c as ScreenshotErrorPayload, d as ScreenshotOutputPayload, e as ScreenshotOutputResponse } from '../messages-DYY0MpGh.js';
|
|
2
|
+
import '../types/index.js';
|
|
3
|
+
|
|
4
|
+
interface ScreenshotOverlayApi {
|
|
5
|
+
onInitialize(listener: (payload: ScreenshotInitializePayload) => void): () => void;
|
|
6
|
+
onFeedback(listener: (payload: ScreenshotFeedbackPayload) => void): () => void;
|
|
7
|
+
confirm(payload: Omit<ScreenshotCompletePayload, 'protocolVersion'>): void;
|
|
8
|
+
cancel(jobId: string): void;
|
|
9
|
+
reportError(payload: Omit<ScreenshotErrorPayload, 'protocolVersion'>): void;
|
|
10
|
+
output(payload: Omit<ScreenshotOutputPayload, 'protocolVersion'>): Promise<ScreenshotOutputResponse>;
|
|
11
|
+
feedbackReady(): void;
|
|
12
|
+
ready(): void;
|
|
13
|
+
prepared(jobId: string): void;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export type { ScreenshotOverlayApi };
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// src/electron/preload/overlay-preload.ts
|
|
2
|
+
import { contextBridge, ipcRenderer } from "electron";
|
|
3
|
+
|
|
4
|
+
// src/electron/protocol/channels.ts
|
|
5
|
+
var OVERLAY_CHANNELS = {
|
|
6
|
+
ready: "electron-snapora:overlay:ready",
|
|
7
|
+
prepared: "electron-snapora:overlay:prepared",
|
|
8
|
+
initialize: "electron-snapora:overlay:initialize",
|
|
9
|
+
feedback: "electron-snapora:overlay:feedback",
|
|
10
|
+
feedbackReady: "electron-snapora:overlay:feedback-ready",
|
|
11
|
+
confirm: "electron-snapora:overlay:confirm",
|
|
12
|
+
cancel: "electron-snapora:overlay:cancel",
|
|
13
|
+
error: "electron-snapora:overlay:error",
|
|
14
|
+
output: "electron-snapora:overlay:output"
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// src/electron/protocol/messages.ts
|
|
18
|
+
var SCREENSHOT_PROTOCOL_VERSION = 1;
|
|
19
|
+
|
|
20
|
+
// src/electron/preload/overlay-preload.ts
|
|
21
|
+
var overlayApi = {
|
|
22
|
+
onInitialize(listener) {
|
|
23
|
+
const handler = (_event, payload) => {
|
|
24
|
+
listener(payload);
|
|
25
|
+
};
|
|
26
|
+
ipcRenderer.on(OVERLAY_CHANNELS.initialize, handler);
|
|
27
|
+
return () => {
|
|
28
|
+
ipcRenderer.removeListener(OVERLAY_CHANNELS.initialize, handler);
|
|
29
|
+
};
|
|
30
|
+
},
|
|
31
|
+
onFeedback(listener) {
|
|
32
|
+
const handler = (_event, payload) => {
|
|
33
|
+
listener(payload);
|
|
34
|
+
};
|
|
35
|
+
ipcRenderer.on(OVERLAY_CHANNELS.feedback, handler);
|
|
36
|
+
return () => {
|
|
37
|
+
ipcRenderer.removeListener(OVERLAY_CHANNELS.feedback, handler);
|
|
38
|
+
};
|
|
39
|
+
},
|
|
40
|
+
confirm(payload) {
|
|
41
|
+
ipcRenderer.send(OVERLAY_CHANNELS.confirm, {
|
|
42
|
+
protocolVersion: SCREENSHOT_PROTOCOL_VERSION,
|
|
43
|
+
...payload
|
|
44
|
+
});
|
|
45
|
+
},
|
|
46
|
+
cancel(jobId) {
|
|
47
|
+
ipcRenderer.send(OVERLAY_CHANNELS.cancel, {
|
|
48
|
+
protocolVersion: SCREENSHOT_PROTOCOL_VERSION,
|
|
49
|
+
jobId
|
|
50
|
+
});
|
|
51
|
+
},
|
|
52
|
+
reportError(payload) {
|
|
53
|
+
ipcRenderer.send(OVERLAY_CHANNELS.error, {
|
|
54
|
+
protocolVersion: SCREENSHOT_PROTOCOL_VERSION,
|
|
55
|
+
...payload
|
|
56
|
+
});
|
|
57
|
+
},
|
|
58
|
+
output(payload) {
|
|
59
|
+
return ipcRenderer.invoke(OVERLAY_CHANNELS.output, {
|
|
60
|
+
protocolVersion: SCREENSHOT_PROTOCOL_VERSION,
|
|
61
|
+
...payload
|
|
62
|
+
});
|
|
63
|
+
},
|
|
64
|
+
feedbackReady() {
|
|
65
|
+
ipcRenderer.send(OVERLAY_CHANNELS.feedbackReady);
|
|
66
|
+
},
|
|
67
|
+
ready() {
|
|
68
|
+
ipcRenderer.send(OVERLAY_CHANNELS.ready, {
|
|
69
|
+
protocolVersion: SCREENSHOT_PROTOCOL_VERSION
|
|
70
|
+
});
|
|
71
|
+
},
|
|
72
|
+
prepared(jobId) {
|
|
73
|
+
ipcRenderer.send(OVERLAY_CHANNELS.prepared, {
|
|
74
|
+
protocolVersion: SCREENSHOT_PROTOCOL_VERSION,
|
|
75
|
+
jobId
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
contextBridge.exposeInMainWorld("snaporaOverlay", overlayApi);
|
|
80
|
+
//# sourceMappingURL=preload.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/electron/preload/overlay-preload.ts","../../src/electron/protocol/channels.ts","../../src/electron/protocol/messages.ts"],"sourcesContent":["import { contextBridge, ipcRenderer } from 'electron';\n\nimport { OVERLAY_CHANNELS } from '../protocol/channels.js';\nimport { SCREENSHOT_PROTOCOL_VERSION } from '../protocol/messages.js';\nimport type {\n ScreenshotCompletePayload,\n ScreenshotErrorPayload,\n ScreenshotFeedbackPayload,\n ScreenshotInitializePayload,\n ScreenshotOutputPayload,\n ScreenshotOutputResponse,\n} from '../protocol/messages.js';\n\nexport interface ScreenshotOverlayApi {\n onInitialize(listener: (payload: ScreenshotInitializePayload) => void): () => void;\n onFeedback(listener: (payload: ScreenshotFeedbackPayload) => void): () => void;\n confirm(payload: Omit<ScreenshotCompletePayload, 'protocolVersion'>): void;\n cancel(jobId: string): void;\n reportError(payload: Omit<ScreenshotErrorPayload, 'protocolVersion'>): void;\n output(\n payload: Omit<ScreenshotOutputPayload, 'protocolVersion'>\n ): Promise<ScreenshotOutputResponse>;\n feedbackReady(): void;\n ready(): void;\n prepared(jobId: string): void;\n}\n\nconst overlayApi: ScreenshotOverlayApi = {\n onInitialize(listener) {\n const handler = (\n _event: Electron.IpcRendererEvent,\n payload: ScreenshotInitializePayload\n ) => {\n listener(payload);\n };\n\n ipcRenderer.on(OVERLAY_CHANNELS.initialize, handler);\n return () => {\n ipcRenderer.removeListener(OVERLAY_CHANNELS.initialize, handler);\n };\n },\n onFeedback(listener) {\n const handler = (\n _event: Electron.IpcRendererEvent,\n payload: ScreenshotFeedbackPayload\n ) => {\n listener(payload);\n };\n\n ipcRenderer.on(OVERLAY_CHANNELS.feedback, handler);\n return () => {\n ipcRenderer.removeListener(OVERLAY_CHANNELS.feedback, handler);\n };\n },\n confirm(payload) {\n ipcRenderer.send(OVERLAY_CHANNELS.confirm, {\n protocolVersion: SCREENSHOT_PROTOCOL_VERSION,\n ...payload,\n });\n },\n cancel(jobId) {\n ipcRenderer.send(OVERLAY_CHANNELS.cancel, {\n protocolVersion: SCREENSHOT_PROTOCOL_VERSION,\n jobId,\n });\n },\n reportError(payload) {\n ipcRenderer.send(OVERLAY_CHANNELS.error, {\n protocolVersion: SCREENSHOT_PROTOCOL_VERSION,\n ...payload,\n });\n },\n output(payload) {\n return ipcRenderer.invoke(OVERLAY_CHANNELS.output, {\n protocolVersion: SCREENSHOT_PROTOCOL_VERSION,\n ...payload,\n }) as Promise<ScreenshotOutputResponse>;\n },\n feedbackReady() {\n ipcRenderer.send(OVERLAY_CHANNELS.feedbackReady);\n },\n ready() {\n ipcRenderer.send(OVERLAY_CHANNELS.ready, {\n protocolVersion: SCREENSHOT_PROTOCOL_VERSION,\n });\n },\n prepared(jobId) {\n ipcRenderer.send(OVERLAY_CHANNELS.prepared, {\n protocolVersion: SCREENSHOT_PROTOCOL_VERSION,\n jobId,\n });\n },\n};\n\ncontextBridge.exposeInMainWorld('snaporaOverlay', overlayApi);\n","export const DEFAULT_HOST_CAPTURE_CHANNEL = 'electron-snapora:host:capture';\nexport const DEFAULT_HOST_CANCEL_CHANNEL = 'electron-snapora:host:cancel';\n\nexport const OVERLAY_CHANNELS = {\n ready: 'electron-snapora:overlay:ready',\n prepared: 'electron-snapora:overlay:prepared',\n initialize: 'electron-snapora:overlay:initialize',\n feedback: 'electron-snapora:overlay:feedback',\n feedbackReady: 'electron-snapora:overlay:feedback-ready',\n confirm: 'electron-snapora:overlay:confirm',\n cancel: 'electron-snapora:overlay:cancel',\n error: 'electron-snapora:overlay:error',\n output: 'electron-snapora:overlay:output',\n} as const;\n","import type {\n ScreenshotBounds,\n ScreenshotErrorCode,\n ScreenshotImageResult,\n ScreenshotOptions,\n ScreenshotResult,\n} from '../../types.js';\n\nexport const SCREENSHOT_PROTOCOL_VERSION = 1 as const;\n\nexport interface ScreenshotReadyPayload {\n protocolVersion: typeof SCREENSHOT_PROTOCOL_VERSION;\n}\n\nexport interface ScreenshotPreparedPayload extends ScreenshotReadyPayload {\n jobId: string;\n}\n\nexport interface CaptureDisplay {\n id: string;\n bounds: ScreenshotBounds;\n scaleFactor: number;\n}\n\nexport interface CapturedFrame {\n display: CaptureDisplay;\n dataUrl: string;\n pixelSize: {\n width: number;\n height: number;\n };\n}\n\nexport interface ScreenCaptureAdapter {\n /**\n * 可选的同步目标解析,用于让主进程在屏幕采集期间并行加载隐藏 Overlay。\n * 返回值会作为锁定目标传给紧随其后的 capture(),避免鼠标跨屏造成截图与窗口错位。\n */\n resolveTargetDisplay?(options: ScreenshotOptions): CaptureDisplay;\n capture(\n options: ScreenshotOptions,\n targetDisplay?: CaptureDisplay\n ): Promise<CapturedFrame[]>;\n}\n\nexport interface ScreenshotInitializePayload {\n protocolVersion: typeof SCREENSHOT_PROTOCOL_VERSION;\n jobId: string;\n options: ScreenshotOptions;\n frames: CapturedFrame[];\n}\n\nexport interface ScreenshotFeedbackPayload {\n kind: 'copy';\n durationMs: number;\n options: ScreenshotOptions;\n}\n\nexport interface ScreenshotCompletePayload {\n protocolVersion: typeof SCREENSHOT_PROTOCOL_VERSION;\n jobId: string;\n result: ScreenshotResult;\n}\n\nexport interface ScreenshotCancelPayload {\n protocolVersion: typeof SCREENSHOT_PROTOCOL_VERSION;\n jobId: string;\n}\n\nexport interface ScreenshotErrorPayload {\n protocolVersion: typeof SCREENSHOT_PROTOCOL_VERSION;\n jobId: string;\n code: ScreenshotErrorCode;\n message: string;\n}\n\nexport type ScreenshotOutputAction = 'save' | 'copy';\n\nexport interface ScreenshotOutputPayload {\n protocolVersion: typeof SCREENSHOT_PROTOCOL_VERSION;\n jobId: string;\n action: ScreenshotOutputAction;\n result: ScreenshotImageResult;\n}\n\nexport type ScreenshotOutputResponse =\n | { status: 'completed'; action: 'copy' }\n | { status: 'completed'; action: 'save'; filePath: string }\n | { status: 'cancelled' }\n | { status: 'failed'; code: ScreenshotErrorCode; message: string };\n"],"mappings":";AAAA,SAAS,eAAe,mBAAmB;;;ACGpC,IAAM,mBAAmB;AAAA,EAC9B,OAAO;AAAA,EACP,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,eAAe;AAAA,EACf,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AACV;;;ACLO,IAAM,8BAA8B;;;AFmB3C,IAAM,aAAmC;AAAA,EACvC,aAAa,UAAU;AACrB,UAAM,UAAU,CACd,QACA,YACG;AACH,eAAS,OAAO;AAAA,IAClB;AAEA,gBAAY,GAAG,iBAAiB,YAAY,OAAO;AACnD,WAAO,MAAM;AACX,kBAAY,eAAe,iBAAiB,YAAY,OAAO;AAAA,IACjE;AAAA,EACF;AAAA,EACA,WAAW,UAAU;AACnB,UAAM,UAAU,CACd,QACA,YACG;AACH,eAAS,OAAO;AAAA,IAClB;AAEA,gBAAY,GAAG,iBAAiB,UAAU,OAAO;AACjD,WAAO,MAAM;AACX,kBAAY,eAAe,iBAAiB,UAAU,OAAO;AAAA,IAC/D;AAAA,EACF;AAAA,EACA,QAAQ,SAAS;AACf,gBAAY,KAAK,iBAAiB,SAAS;AAAA,MACzC,iBAAiB;AAAA,MACjB,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA,EACA,OAAO,OAAO;AACZ,gBAAY,KAAK,iBAAiB,QAAQ;AAAA,MACxC,iBAAiB;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EACA,YAAY,SAAS;AACnB,gBAAY,KAAK,iBAAiB,OAAO;AAAA,MACvC,iBAAiB;AAAA,MACjB,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA,EACA,OAAO,SAAS;AACd,WAAO,YAAY,OAAO,iBAAiB,QAAQ;AAAA,MACjD,iBAAiB;AAAA,MACjB,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA,EACA,gBAAgB;AACd,gBAAY,KAAK,iBAAiB,aAAa;AAAA,EACjD;AAAA,EACA,QAAQ;AACN,gBAAY,KAAK,iBAAiB,OAAO;AAAA,MACvC,iBAAiB;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EACA,SAAS,OAAO;AACd,gBAAY,KAAK,iBAAiB,UAAU;AAAA,MAC1C,iBAAiB;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,cAAc,kBAAkB,kBAAkB,UAAU;","names":[]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
// src/electron/preload/auto-preload.ts
|
|
4
|
+
var import_electron = require("electron");
|
|
5
|
+
|
|
6
|
+
// src/electron/protocol/channels.ts
|
|
7
|
+
var DEFAULT_HOST_CAPTURE_CHANNEL = "electron-snapora:host:capture";
|
|
8
|
+
var DEFAULT_HOST_CANCEL_CHANNEL = "electron-snapora:host:cancel";
|
|
9
|
+
|
|
10
|
+
// src/electron/preload/host-preload.ts
|
|
11
|
+
function exposeScreenshotApi(options) {
|
|
12
|
+
const channel = options.channel ?? DEFAULT_HOST_CAPTURE_CHANNEL;
|
|
13
|
+
const cancelChannel = options.cancelChannel ?? (options.channel ? `${options.channel}:cancel` : DEFAULT_HOST_CANCEL_CHANNEL);
|
|
14
|
+
const api = {
|
|
15
|
+
capture: (captureOptions) => options.ipcRenderer.invoke(channel, captureOptions),
|
|
16
|
+
cancel: () => options.ipcRenderer.invoke(cancelChannel)
|
|
17
|
+
};
|
|
18
|
+
options.contextBridge.exposeInMainWorld(options.globalName ?? "electronSnapora", api);
|
|
19
|
+
return api;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// src/electron/preload/auto-preload.ts
|
|
23
|
+
exposeScreenshotApi({ contextBridge: import_electron.contextBridge, ipcRenderer: import_electron.ipcRenderer });
|
|
24
|
+
//# sourceMappingURL=auto.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/electron/preload/auto-preload.ts","../../src/electron/protocol/channels.ts","../../src/electron/preload/host-preload.ts"],"sourcesContent":["import { contextBridge, ipcRenderer } from 'electron';\n\nimport { exposeScreenshotApi } from './host-preload.js';\n\n// 默认 Preload 已随 npm 包打包,可直接用于保持 sandbox 开启的独立窗口。\nexposeScreenshotApi({ contextBridge, ipcRenderer });\n","export const DEFAULT_HOST_CAPTURE_CHANNEL = 'electron-snapora:host:capture';\nexport const DEFAULT_HOST_CANCEL_CHANNEL = 'electron-snapora:host:cancel';\n\nexport const OVERLAY_CHANNELS = {\n ready: 'electron-snapora:overlay:ready',\n prepared: 'electron-snapora:overlay:prepared',\n initialize: 'electron-snapora:overlay:initialize',\n feedback: 'electron-snapora:overlay:feedback',\n feedbackReady: 'electron-snapora:overlay:feedback-ready',\n confirm: 'electron-snapora:overlay:confirm',\n cancel: 'electron-snapora:overlay:cancel',\n error: 'electron-snapora:overlay:error',\n output: 'electron-snapora:overlay:output',\n} as const;\n","import type { ContextBridge, IpcRenderer } from 'electron';\n\nimport type {\n ScreenshotOptions,\n ScreenshotRendererApi,\n ScreenshotResult,\n} from '../../types.js';\nimport {\n DEFAULT_HOST_CANCEL_CHANNEL,\n DEFAULT_HOST_CAPTURE_CHANNEL,\n} from '../protocol/channels.js';\n\nexport interface ExposeScreenshotApiOptions {\n contextBridge: ContextBridge;\n ipcRenderer: IpcRenderer;\n globalName?: string;\n channel?: string;\n cancelChannel?: string;\n}\n\n/**\n * 将最小截图接口暴露给宿主页面。调用方显式传入 Electron 能力,\n * 使包本身不依赖 remote,也不要求关闭 contextIsolation。\n */\nexport function exposeScreenshotApi(\n options: ExposeScreenshotApiOptions\n): ScreenshotRendererApi {\n const channel = options.channel ?? DEFAULT_HOST_CAPTURE_CHANNEL;\n const cancelChannel =\n options.cancelChannel ??\n (options.channel ? `${options.channel}:cancel` : DEFAULT_HOST_CANCEL_CHANNEL);\n const api: ScreenshotRendererApi = {\n capture: (captureOptions?: ScreenshotOptions) =>\n options.ipcRenderer.invoke(channel, captureOptions) as Promise<ScreenshotResult>,\n cancel: () => options.ipcRenderer.invoke(cancelChannel) as Promise<boolean>,\n };\n\n options.contextBridge.exposeInMainWorld(options.globalName ?? 'electronSnapora', api);\n return api;\n}\n"],"mappings":";;;AAAA,sBAA2C;;;ACApC,IAAM,+BAA+B;AACrC,IAAM,8BAA8B;;;ACuBpC,SAAS,oBACd,SACuB;AACvB,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,gBACJ,QAAQ,kBACP,QAAQ,UAAU,GAAG,QAAQ,OAAO,YAAY;AACnD,QAAM,MAA6B;AAAA,IACjC,SAAS,CAAC,mBACR,QAAQ,YAAY,OAAO,SAAS,cAAc;AAAA,IACpD,QAAQ,MAAM,QAAQ,YAAY,OAAO,aAAa;AAAA,EACxD;AAEA,UAAQ,cAAc,kBAAkB,QAAQ,cAAc,mBAAmB,GAAG;AACpF,SAAO;AACT;;;AFlCA,oBAAoB,EAAE,8CAAe,yCAAY,CAAC;","names":[]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// src/electron/preload/auto-preload.ts
|
|
2
|
+
import { contextBridge, ipcRenderer } from "electron";
|
|
3
|
+
|
|
4
|
+
// src/electron/protocol/channels.ts
|
|
5
|
+
var DEFAULT_HOST_CAPTURE_CHANNEL = "electron-snapora:host:capture";
|
|
6
|
+
var DEFAULT_HOST_CANCEL_CHANNEL = "electron-snapora:host:cancel";
|
|
7
|
+
|
|
8
|
+
// src/electron/preload/host-preload.ts
|
|
9
|
+
function exposeScreenshotApi(options) {
|
|
10
|
+
const channel = options.channel ?? DEFAULT_HOST_CAPTURE_CHANNEL;
|
|
11
|
+
const cancelChannel = options.cancelChannel ?? (options.channel ? `${options.channel}:cancel` : DEFAULT_HOST_CANCEL_CHANNEL);
|
|
12
|
+
const api = {
|
|
13
|
+
capture: (captureOptions) => options.ipcRenderer.invoke(channel, captureOptions),
|
|
14
|
+
cancel: () => options.ipcRenderer.invoke(cancelChannel)
|
|
15
|
+
};
|
|
16
|
+
options.contextBridge.exposeInMainWorld(options.globalName ?? "electronSnapora", api);
|
|
17
|
+
return api;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// src/electron/preload/auto-preload.ts
|
|
21
|
+
exposeScreenshotApi({ contextBridge, ipcRenderer });
|
|
22
|
+
//# sourceMappingURL=auto.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/electron/preload/auto-preload.ts","../../src/electron/protocol/channels.ts","../../src/electron/preload/host-preload.ts"],"sourcesContent":["import { contextBridge, ipcRenderer } from 'electron';\n\nimport { exposeScreenshotApi } from './host-preload.js';\n\n// 默认 Preload 已随 npm 包打包,可直接用于保持 sandbox 开启的独立窗口。\nexposeScreenshotApi({ contextBridge, ipcRenderer });\n","export const DEFAULT_HOST_CAPTURE_CHANNEL = 'electron-snapora:host:capture';\nexport const DEFAULT_HOST_CANCEL_CHANNEL = 'electron-snapora:host:cancel';\n\nexport const OVERLAY_CHANNELS = {\n ready: 'electron-snapora:overlay:ready',\n prepared: 'electron-snapora:overlay:prepared',\n initialize: 'electron-snapora:overlay:initialize',\n feedback: 'electron-snapora:overlay:feedback',\n feedbackReady: 'electron-snapora:overlay:feedback-ready',\n confirm: 'electron-snapora:overlay:confirm',\n cancel: 'electron-snapora:overlay:cancel',\n error: 'electron-snapora:overlay:error',\n output: 'electron-snapora:overlay:output',\n} as const;\n","import type { ContextBridge, IpcRenderer } from 'electron';\n\nimport type {\n ScreenshotOptions,\n ScreenshotRendererApi,\n ScreenshotResult,\n} from '../../types.js';\nimport {\n DEFAULT_HOST_CANCEL_CHANNEL,\n DEFAULT_HOST_CAPTURE_CHANNEL,\n} from '../protocol/channels.js';\n\nexport interface ExposeScreenshotApiOptions {\n contextBridge: ContextBridge;\n ipcRenderer: IpcRenderer;\n globalName?: string;\n channel?: string;\n cancelChannel?: string;\n}\n\n/**\n * 将最小截图接口暴露给宿主页面。调用方显式传入 Electron 能力,\n * 使包本身不依赖 remote,也不要求关闭 contextIsolation。\n */\nexport function exposeScreenshotApi(\n options: ExposeScreenshotApiOptions\n): ScreenshotRendererApi {\n const channel = options.channel ?? DEFAULT_HOST_CAPTURE_CHANNEL;\n const cancelChannel =\n options.cancelChannel ??\n (options.channel ? `${options.channel}:cancel` : DEFAULT_HOST_CANCEL_CHANNEL);\n const api: ScreenshotRendererApi = {\n capture: (captureOptions?: ScreenshotOptions) =>\n options.ipcRenderer.invoke(channel, captureOptions) as Promise<ScreenshotResult>,\n cancel: () => options.ipcRenderer.invoke(cancelChannel) as Promise<boolean>,\n };\n\n options.contextBridge.exposeInMainWorld(options.globalName ?? 'electronSnapora', api);\n return api;\n}\n"],"mappings":";AAAA,SAAS,eAAe,mBAAmB;;;ACApC,IAAM,+BAA+B;AACrC,IAAM,8BAA8B;;;ACuBpC,SAAS,oBACd,SACuB;AACvB,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,gBACJ,QAAQ,kBACP,QAAQ,UAAU,GAAG,QAAQ,OAAO,YAAY;AACnD,QAAM,MAA6B;AAAA,IACjC,SAAS,CAAC,mBACR,QAAQ,YAAY,OAAO,SAAS,cAAc;AAAA,IACpD,QAAQ,MAAM,QAAQ,YAAY,OAAO,aAAa;AAAA,EACxD;AAEA,UAAQ,cAAc,kBAAkB,QAAQ,cAAc,mBAAmB,GAAG;AACpF,SAAO;AACT;;;AFlCA,oBAAoB,EAAE,eAAe,YAAY,CAAC;","names":[]}
|