Files
autodoc/app/preload.js
T
Iisyourdad 6e790832f5
Template tests / tests (push) Failing after 21s
Complete the app: capture UI, dialogs, template manager, shortcuts help
- Editor topbar reworked: Back | Capture ▾ (full screen/window/region/
  delay/paste/import/session) | Save | Export | Share (.sfgz) | More ▾
  (rename, guide placeholders, backups, linked guide, shortcuts,
  settings)
- New dialogs: backups & snapshots (undoable restore), guide/global
  placeholder editor, keyboard-shortcuts reference, template manager
  (rename/duplicate/delete/share/import .sfglt)
- Export dialog: editable per-format options generated from exporter
  defaults, save-as-template, preview opens the file in the default
  viewer and keeps the dialog open for tweaking
- export:defaults IPC + preload entry
- CSS for blocks panel, focused-view sliders, export options, rows
- ipc-surface test: every preload channel has a main handler; renderer
  api.*/dialogs.* usage stays within the exposed surface (60 tests)
- CHANGELOG/README updated; prompt2.md checklist fully ticked

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 22:15:15 -05:00

100 lines
3.0 KiB
JavaScript

'use strict';
const { contextBridge, ipcRenderer } = require('electron');
/**
* The complete privileged API exposed to the sandboxed renderer. Every call
* is an explicit invoke; no raw ipcRenderer or Node access leaks through.
*/
const invoke = (channel) => (args) => ipcRenderer.invoke(channel, args);
const api = {
library: {
list: invoke('library:list'),
create: invoke('library:create'),
duplicate: invoke('library:duplicate'),
delete: invoke('library:delete'),
setFavorite: invoke('library:setFavorite'),
trashList: invoke('library:trash:list'),
trashRestore: invoke('library:trash:restore'),
trashPurge: invoke('library:trash:purge'),
},
folders: {
create: invoke('folders:create'),
rename: invoke('folders:rename'),
delete: invoke('folders:delete'),
moveGuide: invoke('folders:moveGuide'),
},
guide: {
get: invoke('guide:get'),
save: invoke('guide:save'),
},
step: {
add: invoke('step:add'),
save: invoke('step:save'),
delete: invoke('step:delete'),
reorder: invoke('steps:reorder'),
imagePath: invoke('step:imagePath'),
setWorkingImage: invoke('step:setWorkingImage'),
resetWorkingImage: invoke('step:resetWorkingImage'),
fromClipboard: invoke('step:fromClipboard'),
importImage: invoke('step:importImage'),
},
search: {
query: invoke('search:query'),
titles: invoke('search:titles'),
},
settings: {
all: invoke('settings:all'),
set: invoke('settings:set'),
globalPlaceholders: invoke('placeholders:globals:get'),
setGlobalPlaceholders: invoke('placeholders:globals:set'),
},
capture: {
shoot: invoke('capture:shoot'),
region: invoke('capture:region'),
session: invoke('capture:session'),
state: invoke('capture:state'),
onAdded: (fn) => ipcRenderer.on('capture:added', (e, payload) => fn(payload)),
onState: (fn) => ipcRenderer.on('capture:state', (e, payload) => fn(payload)),
},
archive: {
export: invoke('archive:export'),
open: invoke('archive:open'),
saveLinked: invoke('archive:saveLinked'),
},
snapshots: {
list: invoke('snapshots:list'),
create: invoke('snapshots:create'),
restore: invoke('snapshots:restore'),
},
templates: {
list: invoke('templates:list'),
load: invoke('templates:load'),
save: invoke('templates:save'),
delete: invoke('templates:delete'),
rename: invoke('templates:rename'),
duplicate: invoke('templates:duplicate'),
export: invoke('templates:export'),
import: invoke('templates:import'),
},
export: {
formats: invoke('export:formats'),
defaults: invoke('export:defaults'),
run: invoke('export:run'),
chooseDir: invoke('export:chooseDir'),
preview: invoke('export:preview'),
cleanupPreviews: invoke('preview:cleanup'),
},
shell: {
openPath: invoke('shell:openPath'),
showItemInFolder: invoke('shell:showItemInFolder'),
},
app: {
info: invoke('app:info'),
},
};
contextBridge.exposeInMainWorld('stepforge', api);