Skip to main content

Quick Start: Standalone Renderer

Mount eSheet Renderer into any DOM element. No React required in your own app code — React is bundled inside @esheet/renderer-standalone.

Install

npm install @esheet/renderer-standalone

If your app imports core types such as FormDefinition directly, also add @esheet/core as a dependency.

Basic Usage

import { mountStandaloneRenderer } from '@esheet/renderer-standalone';
import type { FormDefinition } from '@esheet/core';

const demoForm: FormDefinition = {
schemaType: 'mieforms-v1.0',
title: 'Standalone Renderer Demo',
fields: [
{
id: 'name',
fieldType: 'text',
question: 'What is your name?',
required: true,
},
],
};

const mountElement = document.getElementById('renderer-mount');

if (mountElement) {
const standalone = mountStandaloneRenderer(mountElement, {
formData: demoForm,
});

console.log('Current response:', standalone.getResponse());
}

HTML Mount Element + Submit Button

<div id="renderer-mount"></div>
<button id="submit-btn" type="button">Submit</button>
const submitButton = document.getElementById('submit-btn');

if (submitButton instanceof HTMLButtonElement) {
submitButton.addEventListener('click', () => {
const result = standalone.getValidResponse();

if (!result) {
alert('Renderer is not ready yet.');
return;
}

if (result.errors.length > 0) {
const messages = result.errors
.map((err) => `Field ${err.fieldId}: ${err.message}`)
.join('\n');
alert(`Validation failed:\n${messages}`);
return;
}

alert(
`Form is valid!\nResponses: ${JSON.stringify(result.response, null, 2)}`
);
});
}

Handle API

mountStandaloneRenderer returns an EsheetRendererStandaloneHandle with three methods:

MethodReturnsDescription
getResponse()response payload or nullCurrent field responses. null before the renderer is ready.
getValidResponse(){ response, errors } or nullValidates before returning. null before renderer is ready.
unmount()voidTears down the React root and cleans up resources.

Cleanup

Call unmount() when the host page/element is removed:

standalone.unmount();

This avoids keeping detached React roots alive.