Aller au contenu

Commencer

Bien démarrer

À la fin de cette page, vous aurez un formulaire construit visuellement, affiché dans votre framework et validé sur votre serveur — le tout depuis le même fichier. Cela demande une installation et une vingtaine de lignes de code.

Choisissez le package correspondant à votre application. Les wrappers de framework embarquent les Web Components et le core transitivement.

Terminal window
npm install @streamline-pulse/formkrafter-react

Le builder produit un spec ; le renderer le consomme. Brancher les deux ensemble, c’est toute l’intégration :

  1. Montez le builder et conservez le spec qu’il émet. Chaque édition déclenche specChange avec le nouveau spec — plus les patches RFC 6902 qui l’ont produit, si vous voulez de l’undo/redo ou une piste d’audit.

  2. Passez ce spec au renderer. C’est du JSON pur : stockez-le, versionnez-le, récupérez-le plus tard.

  3. Importez la feuille de style une fois. Elle est opt-in et pèse environ 6 Ko — ignorez-la et stylez vous-même les classes .fk-* si vous préférez.

FormStudio.tsx
import { useState } from 'react'
import { FkFormBuilder, FkFormRender } from '@streamline-pulse/formkrafter-react'
import '@streamline-pulse/formkrafter-wc/styles.css'
import type { BrickSpec } from '@streamline-pulse/formkrafter-core'
export function FormStudio() {
const [spec, setSpec] = useState<BrickSpec>()
return (
<>
<FkFormBuilder onSpecChange={(e) => setSpec(e.detail.spec)} />
{spec && (
<FkFormRender
spec={spec}
onFormSubmit={(e) => console.log(e.detail.data)}
/>
)}
</>
)
}

Le verdict du navigateur est un confort pour vos utilisateurs ; le verdict du serveur est celui qui compte. Les deux viennent du même spec :

server/submit.ts
import { validateFormData } from '@streamline-pulse/formkrafter-core'
import type { BrickSpec } from '@streamline-pulse/formkrafter-core'
export async function submit(spec: BrickSpec, payload: unknown) {
const { valid, errors } = validateFormData(spec, payload, 'fr')
if (!valid) {
// { fullName: 'Ce champ est obligatoire', 'contacts[0].email': 'Email invalide' }
return { status: 422, errors }
}
return { status: 200, data: payload }
}

Un projet de Streamline Pulse