Getting Started
Framework-agnostic form engine with its own compact JSON-based definition format. Define a form once, render it anywhere in code or Figma.
Install
npm install @formhaus/coreIf you need a framework adapter:
npm install @formhaus/react # React
npm install @formhaus/vue # VueOr use @formhaus/core directly with any framework. See the Svelte example in the playground.
Quick start
<script setup>
import { FormRenderer } from '@formhaus/vue';
import definition from '@formhaus/core/fixtures/basic-form.json';
function onSubmit(values) {
console.log(values);
}
</script>
<template>
<FormRenderer :definition="definition" @submit="onSubmit" />
</template>import { FormRenderer } from '@formhaus/react';
import definition from '@formhaus/core/fixtures/basic-form.json';
function MyForm() {
return (
<FormRenderer
definition={definition}
onSubmit={(values) => console.log(values)}
/>
);
}The renderer reads the form definition, renders fields, handles validation, and gives you values on submit.
How it works
Form Definition --> FormEngine (pure TS) --> Adapter --> UI Components
|
|-- values, errors, step state
|-- visibility (show/hide fields)
|-- validation (required, pattern, etc.)
+-- subscribe/getSnapshot (React)
computed refs (Vue)3 packages:
| Package | What it does | Dependencies |
|---|---|---|
@formhaus/core | Types, validation, visibility, FormEngine class | None (pure TS) |
@formhaus/vue | Vue adapter with default HTML field components | @formhaus/core |
@formhaus/react | React adapter with default HTML field components | @formhaus/core |
The engine is framework-agnostic. It holds form state, runs validation, tracks field visibility, and manages step navigation. Adapters connect the engine to framework-specific reactivity and render UI components.
Packages
@formhaus/core
Pure TypeScript, zero deps. Contains:
- Type definitions for the form definition format
FormEngineclass (state machine for the form)- Visibility evaluation (
show/showAnyconditions) - Validation (built-in rules + custom validators)
- Definition validation (DAG cycle detection for show conditions)
@formhaus/vue
Vue 3.3+. Renders native HTML form elements by default. Override any field type with your own components via the components prop.
@formhaus/react
React 18+. Same idea as the Vue adapter. Native HTML by default, override via components prop.
Next steps
- Field Types: all supported form field types
- Validation: add rules to your fields
- Examples: working form definitions to learn from