Skip to main content

Getting Started

Installation

npm install raven-form-engine
# or
yarn add raven-form-engine
# or
pnpm add raven-form-engine

With React Hook Form adapter

npm install raven-form-engine react-hook-form

With ShadCN UI adapter

npm install raven-form-engine react-hook-form
# ShadCN components are added via shadcn CLI
npx shadcn@latest add input textarea select checkbox switch

With Ant Design adapter

npm install raven-form-engine antd

Quickstart (3 steps)

Step 1 — Wrap your app with RavenFormProvider

app/layout.tsx
import { RavenFormProvider } from "raven-form-engine";
import { RavenRHFAdapter } from "raven-form-engine/adapters/ravenRHFAdapter";
import { RavenShadcnUIAdapter } from "raven-form-engine/ui/ravenShadcnAdapter";

export default function RootLayout({ children }) {
return (
<html>
<body>
<RavenFormProvider
formAdapter={RavenRHFAdapter}
uiAdapter={RavenShadcnUIAdapter}
>
{children}
</RavenFormProvider>
</body>
</html>
);
}

Step 2 — Define a schema

schema.ts
import type { FormSchema } from "raven-form-engine";

export const loginSchema: FormSchema = {
fields: [
{
name: "email",
type: "email",
label: "Email address",
placeholder: "you@example.com",
validation: { required: "Email is required" },
colSpan: 12,
},
{
name: "password",
type: "password",
label: "Password",
placeholder: "••••••••",
validation: {
required: "Password is required",
minLength: 8,
},
colSpan: 12,
},
],
};

Step 3 — Render <RavenForm>

LoginForm.tsx
import { RavenForm } from "raven-form-engine";
import { loginSchema } from "./schema";

export function LoginForm() {
return (
<RavenForm
schema={loginSchema}
onSubmit={(values) => console.log(values)}
submitLabel="Sign In"
/>
);
}

That's it! You now have a fully validated, accessible form.


Adapter Variants

Using DevTools in Development

Replace RavenFormProvider with RavenDevToolsProvider to add the floating inspector:

app/layout.tsx
import { RavenDevToolsProvider } from "raven-form-engine/devtools/RavenDevToolsProvider";

<RavenDevToolsProvider
formAdapter={RavenRHFAdapter}
uiAdapter={RavenShadcnUIAdapter}
devTools={process.env.NODE_ENV === "development"}
>
{children}
</RavenDevToolsProvider>;

Per-form adapter override

Every <RavenForm> accepts its own adapter and ui props to override the provider:

<RavenForm
schema={schema}
onSubmit={handleSubmit}
adapter={myCustomFormAdapter} // override form state library
ui={myCustomUIAdapter} // override UI components
/>

TypeScript Support

All exports are fully typed. The main types you will use:

TypeDescription
FormSchemaTop-level schema with fields[] and optional steps[]
FormField<T>Individual field descriptor
FieldTypeUnion of all supported field type strings
FormAdapterContract for form state adapters
UIAdapterContract for UI component adapters
RavenFormPropsProps for <RavenForm>
RavenWizardFormPropsProps for <RavenWizardForm>