Section A open
The open attribute is real DOM state: it serializes and renders before JavaScript.
```
`bind="field"` declares a field carried by a form control or a text leaf. `items="name"`
declares a field that is an array of rows. `scope="name"` opens a nested state object read
as `state.name` from the parent; scopes nest to any depth (`state.a.b.n`).
`sap-ignore` on any element makes it and its subtree invisible to sapjs: the pass never
walks into it, the linter skips it whole, and mutations inside it schedule nothing. This is
the escape hatch for third-party widgets and rich-text editors.
## bind: two-way, by control type
The control is the contract. There are no modifiers.
| Control | Value read and written |
|---|---|
| `input[type=text]`, `email`, `url`, `date`, `time`, `search`, `tel`, `password` | string |
| `input[type=number]`, `input[type=range]` | number |
| `input[type=checkbox]` | boolean |
| `input[type=radio]` (put `bind` on each radio in the `name` group) | the checked radio's value |
| `input[type=hidden]` | string |
| `textarea` | string |
| `select` | the selected option's value |
| `select[multiple]` | array of value strings |
| `[contenteditable]` or an empty text leaf such as `