EDITOR GRATUITO

Integrar via iframe

Qualquer aplicação web pode incorporar o EDITOR GRATUITO em https://editor.app.br/embed com <iframe> e postMessage. O motor, o protocolo e o plugin Agente são software livre sob GNU AGPL v3.

Licença (GNU AGPL v3)

Usar o iframe público não copia o motor OnlyOffice para o seu domínio: o host só troca bytes de documentos. Mesmo assim, se você modificar, redistribuir ou hospedar este editor (incluindo um fork do plugin Agente), a AGPL v3 Seção 13 exige disponibilizar o código-fonte correspondente aos usuários que interagem pelo rede.

Não embuta /v*, sdkjs ou x2t WASM no binário do host. O About do editor e as páginas legais permanecem a atribuição OnlyOffice / CryptPad / ZIZIYI.

Thin embed

  1. Coloque um iframe em https://editor.app.br/embed (ou /embed?warmup=1 só para aquecer o cache).
  2. Espere a mensagem ready (origem https://editor.app.br).
  3. Envie open com o ArrayBuffer do arquivo. O documento fica na memória do navegador; o servidor do editor não guarda cópia.

Origens permitidas: este site, localhost e apps desktop (Tauri). Outros hosts de produção precisam entrar na allowlist (/embed-partner.json no deploy, ou NEXT_PUBLIC_EMBED_PARTNER_HOSTS em desenvolvimento). Peça inclusão em contato@prata.dev.br.

Host → editor

  • open — Abre o documento (ArrayBuffer + fileName, fileType, editing, theme, lang). Opcional: variant, hideChrome, plugins.
  • save — Pede exportação. A resposta chega como saved com os bytes.
  • command — Encaminha um comando ao plugin Agente (name + payload).
  • setTheme — theme: dark | light.
  • print — O embed devolve print; o host decide como imprimir.
  • destroy — Derruba a instância do editor.

Protocolo 1.1.0. Tipos em utils/embed-protocol.ts.

Editor → host

  • ready — Embed pronto para receber open (repete até o host abrir).
  • documentReady — Documento carregado no motor.
  • dirty — value: true quando o usuário edita.
  • saved — Bytes exportados (fileName, fileType, mime, bytes).
  • commandResult — Resultado ou error de um command.
  • completionRequest — Pedido de autocomplete (prefix / suffix) do ghost.
  • ghost — shown / text / accepted da sugestão inline.
  • escape / print / error / warmed — Tecla Esc, pedido de impressão, falha, ou cache de warmup.

Exemplo mínimo

const iframe = document.querySelector("iframe");
const origin = "https://editor.app.br";

window.addEventListener("message", (event) => {
  if (event.origin !== origin) return;
  if (event.data?.type === "ready") {
    iframe.contentWindow.postMessage(
      {
        type: "open",
        requestId: crypto.randomUUID(),
        fileName: "contrato.docx",
        fileType: "docx",
        editing: true,
        lang: "pt",
        theme: "dark",
        plugins: "agent",
        bytes: fileBytes,
      },
      origin,
      [fileBytes],
    );
  }
});

Plugin Agente

Com plugins: "agent" no open, o embed carrega o plugin de sistema (GUID asc.{7E4A1C90-2B6D-4F11-9A33-8C0E5D71B2A4}, /office-plugins/agent/). O host não acessa iframe.contentDocument: envia { type: "command", requestId, name, payload } e recebe commandResult.

  • get_text — Lê o texto (Word, tabelas, slides, planilha ativa).
  • get_outline — Lista títulos (Heading / Título).
  • get_selection — Texto selecionado.
  • insert_text / type — Insere ou digita no cursor (fonte, tamanho, negrito opcionais). HTML inline <b> <i> <u> <br> vira formatação.
  • replace_selection — Substitui a seleção (mesmo HTML inline).
  • format — Negrito, itálico, alinhamento, estilo, lista.
  • table — Insere tabela (rows, cols, data, header).
  • layout — Página (A4/letter, orientação, margens, colunas).
  • goto / select / delete — Navega, seleciona (all ou heading) ou apaga.
  • find_replace — Localizar e substituir (uma ocorrência ou all).
  • get_range / set_range / goto_cell — Células de planilha.
  • suggest / context — Ghost inline; o embed pede completionRequest ao host.
  • undo / redo / ping — Histórico e health-check.

Autocomplete (ghost): o plugin emite completionRequest; o host devolve o texto via command suggest / suggest_update. Preview sem agente: plugins: "none" ou variant: "preview".

Warmup / cache

Um iframe oculto em /embed?warmup=1 faz o navegador persistir JS/WASM no origin editor.app.br (Cache Storage). Isso não é redistribuição: os arquivos não entram no seu app. O HTML de /, /editor e /embed não é cacheado de forma imutável.

Chrome da integração: o embed esconde o avatar dummy e o wordmark EDITOR GRATUITO. O editor público em /editor mantém a marca. Atribuições: /legal.