{input 'email', type='email', label='E-mail'} writes a
<label for> and an <input> with the name and an id - the
name with every character an id cannot hold made a dash, so user[email] gets the
id user-email. The name is required: a field without one is an error under the
strict check.
The tag takes type, label, value, id,
checked and rules itself; every other item is an attribute of the
input, written as {attrs} writes it - a bare word such as
required is a bare attribute, a false value leaves the attribute out.
Before a post a field shows value=. After a post of its own
{form} it shows the posted value, escaped, found where PHP files the
name (user[email] is $_POST['user']['email']). A checkbox or radio is
checked when the posted value is its own value - before a post when checked is
given - and its label comes after it. A password or file field is never refilled; a submit,
button, reset or image input has no label and no error.
When padValidate - or the field's own rules= - found something
wrong, the message follows the field in <span class="error" id="email-error">,
worded with the field's label, and the field gets aria-invalid="true" and
aria-describedby, so a screen reader says the message with the field. A file
field shows why padUpload refused its file the same way. Outside a
{form} the tag still writes the field, but it never refills.