---
name: FormState
lang: ts
domain: core
version: "1.0.0"
algebraic: product
definition: |
  interface FormState<T extends Record<string, unknown>> {
    values: T
    errors: Partial<Record<keyof T, string>>
    touched: Partial<Record<keyof T, boolean>>
    is_valid: boolean
    is_submitting: boolean
  }
description: "Estado de un formulario con validacion sincrona, tracking de touched y flag de submit en progreso."
tags: [form, state, validation, touched, hook]
uses_types: []
file_path: "frontend/types/core/form_state.ts"
---

## Campos

- `values` — valores actuales del formulario, tipados con el generico T
- `errors` — errores de validacion por campo (string con mensaje), undefined si el campo es valido
- `touched` — true por campo cuando el usuario lo ha modificado (util para mostrar errores solo al tocar)
- `is_valid` — true cuando no hay ningun error de validacion en ningun campo
- `is_submitting` — true mientras el handler de submit esta en ejecucion

## Uso

```typescript
import type { FormState } from '@/types/core/form_state'

interface LoginForm { email: string; password: string }

function LoginPage() {
  const form: FormState<LoginForm> = useForm({ initial_values: { email: '', password: '' } })
}
```

## Notas

Retornado por `use_form_ts_core`. El generico `T extends Record<string, unknown>` permite tipado completo de los campos y sus errores. Para formularios complejos con validacion async o arrays de campos, usar `@mantine/form` directamente.
