MonoStack
Functionalities

Forms & Validation

Schema-driven forms that auto-generate from Zod schemas.

Package: @repo/form Built on: SuperForms, Zod

Basic Usage

<script lang="ts">
  import { createUserForm } from '$lib/domains/users/database/users.remote'
  import { userInsertSchema } from '$lib/domains/users/utils/schemas'
  import { TypedForm } from '@repo/form'
</script>

<TypedForm.Remote form={createUserForm} schema={userInsertSchema} />

Custom Field Layout

Use TypedForm.RemoteField for custom layouts:

<TypedForm.Remote form={createInvitationForm} schema={invitationInsertSchema}>
  {#snippet children({ fields })}
    <TypedForm.RemoteField field={fields.name} />
    <TypedForm.RemoteField field={fields.email} />
    <TypedForm.RemoteField field={fields.roles} optionItems={roles} />
  {/snippet}
</TypedForm.Remote>

Field Customization with zaf()

Customize field rendering in schemas:

import { TypedForm, zaf } from '@repo/form'

const schema = z.object({
  name: zaf(z.string(), {
    label: 'Full Name',
    placeholder: 'John Doe',
  }),
  message: zaf(z.string().optional(), {
    component: TypedForm.TextareaInput,
  }),
})

Server-Side Form Definition

// users.remote.ts
import { form } from '$app/server'
import { userInsertSchema } from '$lib/domains/users/utils/schemas'

export const createUserForm = form(userInsertSchema, async (data) => {
  const { db, usersTable } = await getTenantDb()
  await db.insert(usersTable).values(data)
  redirect(303, '/users')
})

Pre-Population (Edit Forms)

Set initial values before rendering:

<script lang="ts">
  import { updateUserForm, getUserQuery } from '$lib/domains/users/database/users.remote'
  import { userInsertSchema } from '$lib/domains/users/utils/schemas'

  const { params } = $props()
  updateUserForm.fields.set(await getUserQuery({ id: params.id }))
</script>

<TypedForm.Remote form={updateUserForm} schema={userInsertSchema} />

Full Documentation

See @repo/form for complete API reference.

On this page