{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.