* required bool * autocomplete, maxlength, rows (textarea) * options[] + placeholder (select) * hint optionaler Hilfetext (aria-describedby) * label_html NUR für vertrauenswürdiges Markup aus Komponenten-Code * (z. B. Datenschutz-Link im Checkbox-Label) — nie Nutzereingaben! * * Jedes Feld bekommt ein leeres Fehler-Element (#-error), das form.js bei * ungültiger Eingabe mit der Browser-Validierungsmeldung füllt (aria-describedby). */ $type = $field['type'] ?? 'text'; $name = $field['name']; $id = $field['id'] ?? 'field-' . $name; $required = !empty($field['required']); $errorId = $id . '-error'; $hintId = $id . '-hint'; $describedBy = (!empty($field['hint']) ? $hintId . ' ' : '') . $errorId; // Sichtbarer roter Stern (aria-hidden) + pro Feld erklärendes Pflicht-Wort für // Screenreader — ersetzt die frühere globale „Pflichtfelder mit *"-Hinweiszeile. $requiredMark = $required ? ' (Pflichtfeld)' : ''; $commonAttrs = 'name="' . e($name) . '" id="' . e($id) . '"' . ($required ? ' required' : '') . ' aria-describedby="' . e($describedBy) . '"' . (!empty($field['autocomplete']) ? ' autocomplete="' . e($field['autocomplete']) . '"' : '') . (!empty($field['maxlength']) ? ' maxlength="' . e($field['maxlength']) . '"' : '') . (isset($field['min']) ? ' min="' . e((string) $field['min']) . '"' : '') . (isset($field['max']) ? ' max="' . e((string) $field['max']) . '"' : ''); ?>
value="1">
placeholder=" ">