## AirForm 0.4.0: SafeHTML and polished dropdowns

`form.render()` returns `SafeHTML`, a str subclass that Air's tag system recognizes and doesn't escape. The pattern for embedding a form in Air tags is now just:

```python
air.Form(form.render(), air.Button("Submit", type_="submit"))
```

No `air.Raw()` wrapping needed.

```sh
uv add AirForm --upgrade
```

### What's new

- **SafeHTML output from render().** `render()` returns a `SafeHTML` instance (a `str` with `__html__ = True`). Air's tag system checks for the `__html__` protocol and skips HTML escaping. This is the same convention Jinja2 and MarkupSafe use. No import between the packages.

- **Clean dropdown placeholders.** Select fields show `Select...` as the default option, styled with `disabled selected hidden` so users can't re-select the placeholder after making a choice.

### What's better

- **AGENTS.md guides form refactoring.** When AI agents encounter hand-written `<input>` and `<select>` tags in templates, they know to suggest `form.render()` instead, with the complete AirModel pattern.

### Contributors

[@audreyfeldroy](https://github.com/audreyfeldroy) (Audrey M. Roy Greenfeld) built this release.
