easy-forms

Installation

Install @easy-forms/core and add the UI from the @easy-forms shadcn registry.

Easy Forms is two pieces: the headless engine (@easy-forms/core, an npm package) and the UI, which you add to your own project with the shadcn CLI from the @easy-forms registry. The renderer components are copied into your repo — you own them and can edit them freely.

1. Install the engine

$ pnpm add @easy-forms/core

@easy-forms/core is headless with zero UI dependencies. The renderers you add in the next step import it.

2. Make sure you have a shadcn project

The renderers are shadcn components, so your app needs Tailwind and a components.json. If you don't have one yet, run shadcn's init once:

npx shadcn@latest init

This configures Tailwind theme tokens, @/lib/utils, and components.json. Anything shadcn supports works — Vite, Next.js, Remix, Astro.

3. Register the @easy-forms namespace

Add the registry to the registries field of your components.json:

components.json
{
	"registries": {
		"@easy-forms": "https://chandima301.github.io/easy-forms/r/{name}.json"
	}
}

4. Add the components

Pull the whole kit — every renderer, the assembled registry, and the pre-wired <EasyForm> wrapper — in one command:

npx shadcn@latest add @easy-forms/easy-form

Or add just the controls you need and wire your own registry:

npx shadcn@latest add @easy-forms/text @easy-forms/select

Either way, the renderers land in @/components/easy-forms/ and the canonical shadcn primitives they use (input, select, checkbox, radio-group, popover, label, textarea) are pulled into @/components/ui/.

You own these files

The renderers and the <EasyForm> wrapper now live in your repo. Restyle them, point a control at your own renderer, or edit the chrome stylesheet (easy-forms.css) — see Theming and Custom controls.

Peer dependencies

DependencyVersion
react>= 18
react-dom>= 18
tailwindcss>= 3.4 — your shadcn setup; the renderers use its theme tokens (--background, --primary, --ring, …)

Verify it works

Continue to the Quick start to render your first form with <EasyForm>.