Skip to main content
Find your symptom below and apply the fix.
EmbedEditor and mountEditor fill their parent’s box. Give the parent a height.
App.tsx
The browser has WebGL 2 off, or blocked for its GPU (a remote desktop, some virtual machines, a GPU blocklist). Your app receives WEBGL_UNAVAILABLE through onLoadError and can offer a plain upload instead. See Browser support.
A URL src is downloaded with fetch, so a cross-origin one needs CORS headers from its server. The same goes for an <img>’s source and for an image link pasted into the empty state.
src is read when the editor opens. Give EmbedEditor a new key, or destroy and mount again.
App.tsx
If your page sets a CSP, allow:
  • connect-src for the URLs you pass as src, and as a watermark’s or signature’s src.
  • img-src blob: for the filter and frame thumbnails and for an SVG source, plus whatever logo points to.
  • font-src data: for a text watermark or signature, and for the annotations’ fonts. Blocked, a fixed or required text mark can’t be drawn (MARK_FAILED, Save stays off), and annotation texts show and save in a system font.
  • worker-src blob: for the HEIC decoder (Chromium and Firefox, HEIC only).
  • The editor’s CSS goes in through a constructable stylesheet, or a <style> element where the browser has none.
Check your policy against the editor before shipping it.
An ancestor has a transform, filter, perspective, contain or will-change: transform. Render the editor nearer <body>.Missing safe areas on a phone mean the page lacks viewport-fit=cover.
That’s on purpose. The editor renders in its own shadow root with its CSS inside, so no page rule reaches in and none of its rules leak out. Sizes are in px, so the page’s root font size changes nothing. To change colors, use the colors prop.
That’s on purpose. The editor declares its own palette, so --ee-* custom properties your page sets, on :root, a wrapper or the editor’s host, never reach it. Give one base color per role through the colors prop instead.
A photo over 16.7 MP is scaled down to it when it opens, and no output passes it, from Save or processImage. The output can’t be larger than the GPU allows either, and the Resize tool’s limits follow it. See Large photos.
A HEIC that carries a color profile has been seen to stop the bundled decoder after about three decodes in one page. The loading screen’s Close keeps the user from getting stuck.
A value the editor can’t take, a misspelt prop or a removed one shows the error screen naming it and calls onLoadError with INVALID_PROPS. error.props lists the props. The editor comes back as soon as the props are valid. See Errors.