<div class="rtds-input-field rtds-gap-1 has-error">
<label for="inputId" class="rtds-input-field__label">
Text label
</label>
<div class="rtds-input has-error">
<input id="inputId" class="rtds-text-sm rtds-input-placeholder rtds-pr-12" type="text" aria-describedBy="inputIdError" aria-invalid="true">
<svg class="rtds-icon rtds-fill-current rtds-w-6 rtds-h-6 rtds-absolute rtds-right-4 rtds-content-placeholder rtds-content-error" aria-hidden="true" focusable="false" role="img">
<use href="../../icons.svg#outline--exclamation-circle" />
</svg>
</div>
<span class="rtds-input-field__hint">
<span class="rtds-input-field__error" id="inputIdError" aria-live="assertive">
il campo *nome campo* non può essere vuoto
</span>
</span>
</div>
<div class="rtds-input-field{% if gap %} {{ gap }}{% else %} rtds-gap-1{% endif %}{% if classes %} {{ classes }}{% endif %} {% if inputHasError %} has-error{% endif %}">
<label for="{{ inputId }}" class="rtds-input-field__label{% if hiddenLabel %} rtds-sr-only{% endif %}{% if labelClasses %} {{ labelClasses }}{% endif %}">
{{ label }}
{% if inputRequired %}
<abbr class="rtds-font-bold rtds-no-underline" title="obbligatorio">*</abbr>
{% endif %}
</label>
{% block input %}
{% render '@input', { id: inputId, shortLabel: inputShortLabel, padding: inputPadding, border: inputBorder, radius: inputRadius, classes: inputClasses, type: inputType, placeholder: inputPlaceholder, iconPlaceholder: inputIconPlaceholder, fieldRequired: inputRequired, autocomplete: inputAutocomplete, ariaDescribedBy: inputAriaDescribedBy, hasErrorControl: inputHasErrorControl, ariaInvalid: inputAriaInvalid, iconAlert: inputIconAlert, hasError: inputHasError }, true %}
{% endblock %}
{% if inputRequired or inputAriaDescribedBy or inputHasErrorControl %}
<span class="rtds-input-field__hint">
{% if inputRequired or inputHasErrorControl %}
<span class="rtds-input-field__error" id="{{ inputId }}Error" aria-live="assertive">
{{ errorDescription }}
</span>
{% endif %}
{% if inputDescription %}
<span class="rtds-input-field__description" id="{{ inputAriaDescribedBy }}">
{{ inputDescription }}
</span>
{% endif %}
</span>
{% endif %}
</div>
{
"label": "Text label",
"inputId": "inputId",
"inputType": "text",
"inputAriaDescribedError": "idInputErrorDescription",
"errorDescription": "il campo *nome campo* non può essere vuoto",
"inputHasErrorControl": true,
"inputAriaInvalid": true,
"inputIconAlert": true,
"inputHasError": true
}
/**
* INPUT FIELD
*
*/
@layer components {
.rtds-input-field {
@apply rtds-grid rtds-content-start;
}
.rtds-input-field__label {
@apply rtds-block rtds-text-sm rtds-font-bold rtds-content-03;
}
legend:where(.rtds-input-field__label) {
@apply rtds-mb-1;
}
.rtds-input-field__hint {
@apply rtds-grid;
}
.rtds-input-field__error {
@apply rtds-text-sm rtds-font-medium rtds-content-error;
}
.rtds-input-field__description {
@apply rtds-text-sm rtds-font-medium rtds-content-03;
}
.rtds-input-field.has-error input {
@apply rtds-border-2 rtds-border-error-dark;
}
/* INPUT FIELD INLINE */
.rtds-field-inline {
@apply rtds-flex rtds-items-center rtds-gap-2;
}
.rtds-field-inline .rtds-input,
.rtds-field-inline .rtds-select {
@apply rtds-flex-1;
}
}
Componente composito per campi di input. Include un componente input personalizzabile.
Il componente Input Field è progettato per gestire campi di input con supporto completo per l’accessibilità e la validazione. Include:
Il componente è stato progettato seguendo le best practice di accessibilità WCAG 2.1:
<label>) visibile o nascostartds-sr-onlyfor che corrisponde all’id dell’inputaria-live="assertive"aria-invalid="true"aria-describedbyaria-describedbytitle="obbligatorio"aria-required="true" invece dell’attributo required per una migliore compatibilità con gli screen readerIl componente è strutturato come segue:
<div class="rtds-input-field [gap] [classes] [has-error]">
<label for="[inputId]" class="rtds-input-field__label [hidden] [labelClasses]">
[label]
[asterisco se required]
</label>
[input component]
<span class="rtds-input-field__hint">
[messaggi di errore]
[descrizioni]
</span>
</div>label: Testo dell’etichetta del campolabelClasses: Classi CSS aggiuntive per l’etichettahiddenLabel: Se impostato a true, nasconde visivamente l’etichetta (rimane disponibile per screen reader)inputShortLabel: Versione abbreviata dell’etichetta per la gestione degli errori JavaScriptinputId: ID univoco per il campo inputgap: Personalizzazione dello spazio interno (default: gap-1)inputPadding: Override del padding dell’inputinputBorder: Override del bordo dell’inputinputRadius: Override del border-radius dell’inputinputClasses: Classi CSS aggiuntive per l’inputinputType: Tipo di input (text, tel, email, search, ecc.)inputPlaceholder: Testo del placeholder (da usare con moderazione)inputRequired: Se impostato a true, il campo è obbligatorioinputAutocomplete: Valore per l’autocompletamento (riferimento: MDN Web Docs)inputAriaDescribedBy: ID dell’elemento che descrive il campoinputDescription: Descrizione testuale del campoinputAriaInvalid: Indica se il campo contiene un erroreinputHasErrorControl: Se il campo necessita di validazioneerrorDescription: Descrizione dell’erroreinputIconAlert: Icona di alert per gli erroriinputHasError: Stile di errore per l’inputinputIconPlaceholder: ID dell’icona da mostrare come placeholderinputAlertIcon: ID dell’icona di alertIl componente include diverse varianti preconfigurate nel file input-field.config.yml:
Ogni variante può essere utilizzata come base per personalizzazioni specifiche, mantenendo la coerenza con il design system.