# `MishkaGervaz.Form.Web.Events`
[🔗](https://github.com/mishka-group/mishka_gervaz/blob/v0.0.1-alpha.3/lib/mishka_gervaz/form/web/events.ex#L1)

Handles all form events for MishkaGervaz.

This module centralizes event handling for:
- Validation (phx-change)
- Submission (phx-submit)
- Wizard step navigation
- Upload events
- Relation field search/select
- Cancel
- Nested/array field management

## Sub-builders

Events functionality is split into specialized sub-builders:

- `SanitizationHandler` - Input sanitization
- `ValidationHandler` - Form validation
- `SubmitHandler` - Form submission
- `StepHandler` - Wizard step navigation
- `UploadHandler` - File upload events
- `RelationHandler` - Relation field search/select
- `HookRunner` - Hook execution

## Customization

You can override individual sub-builders via DSL:

    mishka_gervaz do
      form do
        events do
          sanitization MyApp.CustomSanitizationHandler
          validation MyApp.CustomValidationHandler
          submit MyApp.CustomSubmitHandler
          step MyApp.CustomStepHandler
          upload MyApp.CustomUploadHandler
          hooks MyApp.CustomHookRunner
        end
      end
    end

Or override the entire Events module:

    mishka_gervaz do
      form do
        events MyApp.CustomFormEvents
      end
    end

See `MishkaGervaz.Form.Web.Events.Helpers` (shared helpers exposed to
sub-handlers and user overrides), `MishkaGervaz.Form.Web.State`,
`MishkaGervaz.Form.Web.DataLoader`,
`MishkaGervaz.Form.Web.Live`, and the sub-handlers
`SanitizationHandler`, `ValidationHandler`, `SubmitHandler`,
`StepHandler`, `UploadHandler`, `RelationHandler`, `HookRunner`.

# `socket`

```elixir
@type socket() :: Phoenix.LiveView.Socket.t()
```

# `state`

```elixir
@type state() :: MishkaGervaz.Form.Web.State.t()
```

# `handle`

```elixir
@callback handle(event :: String.t(), params :: map(), socket :: socket()) ::
  {:noreply, socket()}
```

# `handle`

```elixir
@spec handle(String.t(), map(), socket()) :: {:noreply, socket()}
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
