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.
Files changed (50) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/LICENSE +21 -0
  3. package/README.es.md +79 -0
  4. package/README.ja.md +79 -0
  5. package/README.ko.md +79 -0
  6. package/README.md +392 -0
  7. package/README.zh-CN.md +79 -0
  8. package/dist/core/index.cjs +184 -0
  9. package/dist/core/index.cjs.map +1 -0
  10. package/dist/core/index.d.cts +97 -0
  11. package/dist/core/index.d.ts +97 -0
  12. package/dist/core/index.mjs +150 -0
  13. package/dist/core/index.mjs.map +1 -0
  14. package/dist/main/index.cjs +1637 -0
  15. package/dist/main/index.cjs.map +1 -0
  16. package/dist/main/index.d.cts +283 -0
  17. package/dist/main/index.d.ts +283 -0
  18. package/dist/main/index.mjs +1599 -0
  19. package/dist/main/index.mjs.map +1 -0
  20. package/dist/messages-DYY0MpGh.d.ts +76 -0
  21. package/dist/messages-ifub9bae.d.cts +76 -0
  22. package/dist/overlay/assets/index-7dVRGn83.css +1 -0
  23. package/dist/overlay/assets/index-CJf5iC1U.js +2 -0
  24. package/dist/overlay/assets/index-CJf5iC1U.js.map +1 -0
  25. package/dist/overlay/index.html +316 -0
  26. package/dist/overlay/preload.cjs +97 -0
  27. package/dist/overlay/preload.cjs.map +1 -0
  28. package/dist/overlay/preload.d.cts +16 -0
  29. package/dist/overlay/preload.d.ts +16 -0
  30. package/dist/overlay/preload.mjs +80 -0
  31. package/dist/overlay/preload.mjs.map +1 -0
  32. package/dist/preload/auto.cjs +24 -0
  33. package/dist/preload/auto.cjs.map +1 -0
  34. package/dist/preload/auto.d.cts +2 -0
  35. package/dist/preload/auto.d.ts +2 -0
  36. package/dist/preload/auto.mjs +22 -0
  37. package/dist/preload/auto.mjs.map +1 -0
  38. package/dist/preload/index.cjs +46 -0
  39. package/dist/preload/index.cjs.map +1 -0
  40. package/dist/preload/index.d.cts +18 -0
  41. package/dist/preload/index.d.ts +18 -0
  42. package/dist/preload/index.mjs +19 -0
  43. package/dist/preload/index.mjs.map +1 -0
  44. package/dist/types/index.cjs +19 -0
  45. package/dist/types/index.cjs.map +1 -0
  46. package/dist/types/index.d.cts +92 -0
  47. package/dist/types/index.d.ts +92 -0
  48. package/dist/types/index.mjs +1 -0
  49. package/dist/types/index.mjs.map +1 -0
  50. 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,2 @@
1
+
2
+ export { }
@@ -0,0 +1,2 @@
1
+
2
+ export { }
@@ -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":[]}