Embed
Embedding is a simple way to include the app in your website. Add the following code to your website:
<iframe id="butterfly" src="https://web.butterfly.linwood.dev/embed" width="100%" height="500px" allowtransparency="true"></iframe>Options
섹션 제목: “Options”| Option | 유형 | Default | 설명 |
|---|---|---|---|
| save | Boolean (true, false) | true | Enable save. If disabled, only an exit button will be shown |
| editable | Boolean (true, false) | true | Enable editing. If disabled, the document will be read-only |
| language | String (…, system, user) | user | Language of the document. If system, the language will be detected from the browser. If user, the language will set to the users preference |
Messaging
섹션 제목: “Messaging”The embed uses browser postMessage events. Send messages to the iframe with
iframe.contentWindow.postMessage({ type, message }, origin). Butterfly sends
messages back to the parent window with the same shape:
{ type: string, message?: unknown }.
See the embedding example for a live page that sends messages to the iframe and listens for messages from it.
<iframe id="butterfly" src="https://web.butterfly.linwood.dev/embed?save=true&editable=true" width="100%" height="500"></iframe>
<script> const butterflyOrigin = 'https://web.butterfly.linwood.dev'; const butterfly = document.querySelector('#butterfly');
function sendToButterfly(type, message) { butterfly.contentWindow.postMessage({ type, message }, butterflyOrigin); }
window.addEventListener('message', (event) => { if ( event.origin !== butterflyOrigin || event.source !== butterfly.contentWindow ) { return; }
const { type, message } = event.data ?? {};
if (type === 'save') { const documentBytes = Array.from(message); console.log('Save requested by the embed', documentBytes); }
if (type === 'change') { console.log('Document changed', message); }
if (type === 'getData') { console.log('Current document bytes', message); }
if (type === 'render') { const image = new Image(); image.src = `data:image/png;base64,${message}`; document.body.append(image); } });
butterfly.addEventListener('load', () => { sendToButterfly('getData');
sendToButterfly('render', { x: 0, y: 0, width: 600, height: 400, scale: 1, renderBackground: true, }); });</script>To load document bytes into the embed, send an array of byte values:
sendToButterfly('setData', documentBytes);Events
섹션 제목: “Events”Listen for events with window.addEventListener('message', ...).
save
섹션 제목: “save”The
saveevent is emitted when the user clicks the save button.
Parameters:
message(TypeList<int>): The data of the document.
exit
섹션 제목: “exit”The
exitevent is emitted when the user clicks the exit button.
Parameters:
message(TypeList<int>): The data of the document.
change
섹션 제목: “change”The
changeevent is emitted when the user changes the document.
Parameters:
message(TypeList<int>): The data of the document.
Methods
섹션 제목: “Methods”Call methods with iframe.contentWindow.postMessage(...). Methods that return
data send another message back with the same type.
getData
섹션 제목: “getData”The
getDatamethod returns the data of the document.
No parameters.
Returns: List<int>
setData
섹션 제목: “setData”The
setDatamethod sets the data of the document.
Parameters:
data(TypeList<int>): The data of the document.
render
섹션 제목: “render”The
rendermethod renders the document to a png image.
Parameters:
x(TypeNumber): The x position of the exported area.y(TypeNumber): The y position of the exported area.width(TypeNumber): The width of the image.height(TypeNumber): The height of the image.scale(TypeNumber): The scale of the image.renderBackground(TypeBoolean): If true, the background will be rendered.
Returns: String (Base64 encoded image)
renderSVG
섹션 제목: “renderSVG”The
renderSVGmethod renders the document to a svg image.
Parameters:
x(TypeNumber): The x position of the exported area.y(TypeNumber): The y position of the exported area.width(TypeNumber): The width of the image.height(TypeNumber): The height of the image.renderBackground(TypeBoolean): If true, the background will be rendered.
Returns: String (SVG)