# Form Patterns - **Library**: React Hook Form + Zod + `@hookform/resolvers` - **Feedback**: FieldError under controls; Sonner for server errors - **Submit**: disable while `mutation.isPending` - **Dirty**: rely on RHF `formState.isDirty` for future autosave - **Server validation**: map `AccountingApiError.message` to toast (field mapping when backend returns field errors) - **Money**: `MoneyInput` only — never plain `` for currency; parse with `parseMoneyInput` before API if needed - **Party / item**: `PartyCombobox` / `ItemCombobox` — AJAX from registered masters, not free text Voucher create uses `useFieldArray` with minimum two balanced lines (enforced by Zod + backend). Operational invoices/orders use line item comboboxes bound to inventory items and party comboboxes bound to customers/suppliers.