Installation
GolemUI is a blazing fast JavaScript library for building dynamic forms from JSON files. It provides a free set of UI widgets with support for React, Angular, Lit, Vue, and Vanilla JS.
This guide walks you from an empty directory to a rendered form in five steps.
-
Scaffold a new project
Section titled “Scaffold a new project”Use Vite (or your favourite scaffolder) to create a fresh project for your framework. For example, with Vite:
Terminal window npm create vite@latest my-form -- --template react-tscd my-form && npm installTerminal window npx @angular/cli new my-formcd my-formTerminal window npm create vite@latest my-form -- --template lit-tscd my-form && npm installTerminal window npm create vite@latest my-form -- --template vue-tscd my-form && npm installTerminal window npm create vite@latest my-form -- --template vanillacd my-form && npm install -
Install GolemUI and the Golem Widgets
Section titled “Install GolemUI and the Golem Widgets”Install
@golemui/core,@golemui/gui-shared, and theReact adapter .@golemui/reactAngular adapter@golemui/angularLit adapter@golemui/litVue adapter@golemui/vueWeb Components runtime@golemui/litTerminal window npm i @golemui/core @golemui/gui-shared @golemui/react @golemui/gui-react --saveTerminal window npm i @golemui/core @golemui/gui-shared @golemui/angular @golemui/gui-angular --saveTerminal window npm i @golemui/core @golemui/gui-shared @golemui/lit @golemui/gui-lit --saveTerminal window npm i @golemui/core @golemui/gui-shared @golemui/vue @golemui/gui-vue --saveTerminal window npm i @golemui/core @golemui/gui-shared @golemui/lit @golemui/gui-lit --saveThe adapter still pulls in
@golemui/gui-componentsand@golemui/gui-validatorsas peer dependencies — you won’t import from those directly. -
Import the Golem Widgets styles
Section titled “Import the Golem Widgets styles”Load the CSS file directly in your HTML or import it in your Sass/CSS file.
@import '@golemui/gui-components/index.css'; -
Define a form and render it
Section titled “Define a form and render it”The easiest way to define a form is through the Programmatic API, using an array of
gui.*shortcuts. Alternatively, the same form can be defined using the JSON API if you prefer.import { gui } from '@golemui/gui-shared';import { GuiForm } from '@golemui/gui-react';const formDef = [gui.inputs.textInput('username')];const formData = { username: 'golemui' };const config = { formDef, data: formData };export function FormPage() {return (<div><GuiForm config={config} /></div>);}import { Component } from '@angular/core';import { CommonModule } from '@angular/common';import { gui } from '@golemui/gui-shared';import { FormComponent } from '@golemui/gui-angular';@Component({imports: [CommonModule, FormComponent],selector: 'app-dynamic-form',template: `<gui-form [config]="config"></gui-form>`,})export class AppFormPage {protected config = {formDef: [gui.inputs.textInput('username')],data: { username: 'golemui' },};}import { LitElement, html } from 'lit';import { customElement } from 'lit/decorators.js';import { gui } from '@golemui/gui-shared';import '@golemui/gui-lit';@customElement('lit-form')export class FormElement extends LitElement {config = {formDef: [gui.inputs.textInput('username')],data: { username: 'golemui' },};override createRenderRoot() {return this;}render() {return html`<gui-form .config=${this.config}></gui-form>`;}}<script setup lang="ts">import { gui } from '@golemui/gui-shared';import { GuiForm } from '@golemui/gui-vue';const formDef = [gui.inputs.textInput('username')];const formData = { username: 'golemui' };const config = { formDef, data: formData };</script><template><div><GuiForm :config="config" /></div></template>index.html <gui-form id="app-form"></gui-form><script type="module" src="/src/main.js"></script>src/main.js import '@golemui/gui-components/index.css';import '@golemui/gui-lit';import { gui } from '@golemui/gui-shared';const formDef = [gui.inputs.textInput('username')];const formData = { username: 'golemui' };const form = document.getElementById('app-form');form.config = { formDef, data: formData };Create a JSON file with your form definition and pass it to the form component:
{"form": [{ "kind": "input", "type": "textinput", "path": "username" }]}Then load and render it in your framework. See the Integration section for framework-specific setup.
-
That’s it
Section titled “That’s it”Run your dev server and you’ll see your form rendered in the browser.
Next steps
Section titled “Next steps”Ready for something more substantial? Walk through the Rent a Car form tutorial, where you’ll build a real, multi-field form with conditional logic, custom item renderers, async data loading, and form submission.
For framework-specific configuration (React, Angular, Lit, Vue), see the Integration section.