Text input
Campo de texto de línea única con etiqueta, texto de ayuda y soporte para estados de validación.
1. Control base (md)
Mostrar HTML
<div class="gn-input">
<input aria-label="Nombre completo" type="text" class="gn-input__control" placeholder="Ej: Juan Pérez" />
</div>
2. Control base con icono search
Mostrar HTML
<div class="gn-input gn-input--icon-search">
<input aria-label="Buscar expediente" type="text" class="gn-input__control" placeholder="Buscar..." />
</div>
3. Control base con error
Mostrar HTML
<div class="gn-input gn-input--error">
<input aria-label="DNI o NIE" type="text" class="gn-input__control" value="12345678" aria-invalid="true" />
</div>
4. Control base disabled
Mostrar HTML
<div class="gn-input gn-input--disabled">
<input aria-label="Identificador interno" type="text" class="gn-input__control" value="ID-4091" disabled />
</div>
5. Control base small
Mostrar HTML
<div class="gn-input gn-input--sm gn-input--icon-search">
<input aria-label="Buscar filtro" type="text" class="gn-input__control" value="Navarra" />
</div>
6. Composición de campo (label + hint + required + clear)
Escribe tu nombre completo.
Mostrar HTML
<div class="gn-field">
<label class="gn-field__label" for="input-composed">
Nombre<span class="gn-field__required" aria-hidden="true">*</span><span class="sr-only">obligatorio</span>
</label>
<span class="gn-field__hint" id="input-composed-hint">Escribe tu nombre completo.</span>
<div class="gn-input gn-input--with-clear gn-input--icon-search">
<input id="input-composed" type="text" class="gn-input__control" value="Texto de ejemplo" required aria-describedby="input-composed-hint" />
<button type="button" class="gn-input__clear" data-gn-input-clear aria-label="Borrar texto">
<svg focusable="false" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
<path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" />
</svg>
</button>
</div>
</div>
Mostrar JS
document.addEventListener('DOMContentLoaded', () => {
window.GNDS.initInputClearButtons();
});
7. Composición de campo con error
Error: Formato inválido.
Mostrar HTML
<div class="gn-field">
<label class="gn-field__label" for="input-error-composed">Código de expediente</label>
<div class="gn-input gn-input--error">
<input id="input-error-composed" class="gn-input__control" type="text" value="12" aria-invalid="true" aria-describedby="input-error-msg" />
</div>
<p class="gn-field__error" id="input-error-msg">
<svg class="gn-field__error-icon" xmlns="http://www.w3.org/2000/svg" width="3" height="15" viewBox="0 0 3 15" fill="none" aria-hidden="true" focusable="false">
<path d="M1.50193 14.8389C1.91494 14.8389 2.26787 14.6975 2.56071 14.4146C2.85356 14.1317 3 13.7916 3 13.3944C3 12.9972 2.85291 12.6577 2.55879 12.3761C2.26466 12.0944 1.91109 11.9536 1.49807 11.9536C1.08506 11.9536 0.732128 12.095 0.439286 12.3779C0.146443 12.6608 0 13.0009 0 13.3981C0 13.7953 0.147085 14.1348 0.441214 14.4164C0.735343 14.6981 1.08891 14.8389 1.50193 14.8389ZM3 9.89262V0H0V9.89262H3Z" fill="currentColor"/>
</svg>
<span class="gn-field__error-prefix">Error:</span>
<span class="gn-field__error-text">Formato inválido.</span>
</p>
</div>
8. Character count (vacío)
10 caracteres permitidos
Mostrar HTML
<div class="gn-field">
<label class="gn-field__label" for="input-cc-empty">Alias</label>
<div class="gn-input">
<input class="gn-input__control" id="input-cc-empty" name="input-cc-empty" type="text" data-gn-character-count-max="10" aria-describedby="input-cc-empty-counter">
</div>
<p id="input-cc-empty-counter" class="gn-field__character-count" data-gn-character-count aria-live="polite">10 caracteres permitidos</p>
</div>
Mostrar JS
document.addEventListener('DOMContentLoaded', () => {
window.GNDS.initCharacterCounts();
});
9. Character count (dentro del límite)
3 caracteres restantes
Mostrar HTML
<div class="gn-field">
<label class="gn-field__label" for="input-cc-ok">Alias</label>
<div class="gn-input">
<input class="gn-input__control" id="input-cc-ok" name="input-cc-ok" type="text" value="0000000" data-gn-character-count-max="10" aria-describedby="input-cc-ok-counter">
</div>
<p id="input-cc-ok-counter" class="gn-field__character-count" data-gn-character-count aria-live="polite">3 caracteres restantes</p>
</div>
Mostrar JS
document.addEventListener('DOMContentLoaded', () => {
window.GNDS.initCharacterCounts();
});
10. Character count (excedido)
2 caracteres más de los permitidos
Mostrar HTML
<div class="gn-field">
<label class="gn-field__label" for="input-cc-over">Alias</label>
<div class="gn-input">
<input class="gn-input__control" id="input-cc-over" name="input-cc-over" type="text" value="000000000000" data-gn-character-count-max="10" aria-describedby="input-cc-over-counter">
</div>
<p id="input-cc-over-counter" class="gn-field__character-count" data-gn-character-count aria-live="polite">2 caracteres más de los permitidos</p>
</div>
Mostrar JS
document.addEventListener('DOMContentLoaded', () => {
window.GNDS.initCharacterCounts();
});
Componente Text input
Text input define un control de una línea con arquitectura BEM explícita:
- Bloque:
.gn-input - Elemento nativo:
.gn-input__control
Arquitectura
- Control base:
<div class="gn-input"><input class="gn-input__control"></div>. - Composición de campo: usar
.gn-fieldcon.gn-field__label,.gn-field__hint,.gn-field__errory.gn-field__character-count.
Variantes
- Default:
.gn-input. - Small:
.gn-input.gn-input--sm. - Icono decorativo izquierda:
.gn-input--icon-search,.gn-input--icon-datepicker. - Error:
aria-invalid="true"en el control o modificador.gn-input--error. - Disabled:
disableden el control o.gn-input--disabled. - Clear interactivo:
.gn-input--with-clear+ botón real.gn-input__clear.
Accesibilidad
- Asociar siempre
labely control mediantefor/id. - Usar
aria-describedbypara hint/error/count cuando corresponda. - Mantener
aria-invaliden estado de error.