Skip to content

Field

BField es la carcasa de un campo de formulario. Proporciona la estructura semántica (label, control, hint, error) y los atributos de datos de estado. No incluye el control en sí — éste se inyecta en el slot default.


Importación

js
import { BField } from '@bedrock/core/vue';
scss
@use '@bedrock/core/field';

Props

PropTipoDefaultDescripción
fieldIdStringautoid que enlaza label y control. Si no se indica, se genera uno único automáticamente.
disabledBooleanfalseAplica data-disabled al campo y deshabilita el control Bedrock del slot.
requiredBooleanfalseAplica data-required al campo y required al control Bedrock del slot.

Cableado automático de accesibilidad

BField provee un contexto (via provide/inject) que los controles Bedrock del slot (BInput, BSelect, BTextarea, BCheckbox, BRadioGroup, BSwitch) consumen automáticamente:

  • id/for — el label queda enlazado al control sin pasar ids a mano.
  • aria-describedby — apunta al hint y/o error cuando existen.
  • aria-invalid — se aplica cuando el slot error está presente.
  • disabled / required — se heredan del campo.

Los atributos explícitos del consumidor siempre tienen prioridad sobre los heredados. Requiere Vue ≥ 3.5.


Slots

SlotDescripción
defaultEl control del campo: BInput, BCheckbox, <select> nativo, etc.
labelTexto del label. Si está presente, se renderiza un <label> vinculado al control via fieldId.
hintTexto de ayuda mostrado bajo el control.
errorMensaje de error. Su presencia también aplica data-error al elemento raíz.

Atributos de datos generados

AtributoCuándo aparece
data-disabledCuando disabled es true.
data-requiredCuando required es true.
data-errorCuando el slot error está presente.

Estructura HTML generada

html
<div class="b-field">
  <label class="label" for="my-input">Email</label>
  <div class="control">
    <!-- slot default -->
  </div>
  <span class="hint">Usaremos este email solo para notificaciones.</span>
  <span class="error" role="alert">El email no es válido.</span>
</div>

Ejemplos de uso

Campo básico con BInput

html
<BField>
  <template #label>Email</template>
  <BInput v-model="email" type="email" />
</BField>

El label y el input quedan enlazados automáticamente — no hace falta pasar ids.

Con hint

html
<BField>
  <template #label>Contraseña</template>
  <BInput v-model="password" type="password" />
  <template #hint>Mínimo 8 caracteres.</template>
</BField>

Con error

html
<BField :required="true">
  <template #label>Usuario</template>
  <BInput v-model="username" />
  <template #error>El nombre de usuario ya existe.</template>
</BField>

Deshabilitado

html
<BField :disabled="true">
  <template #label>Plan actual</template>
  <BInput v-model="plan" :disabled="true" />
</BField>

Estilos en el proyecto consumidor

scss
@use 'bedrock-config' as *;
@use '@bedrock/core/field';

.b-field {
  display: flex;
  flex-direction: column;
  gap: spacing(1);

  .label {
    @include typeset(field-label);
    color: color(text);
  }

  .hint {
    @include typeset(field-hint);
    color: color(text, subtle);
  }

  .error {
    @include typeset(field-hint);
    color: color(error);
  }

  @include attr(disabled) {
    opacity: 0.5;
    pointer-events: none;
  }

  @include attr(required) {
    .label::after {
      content: ' *';
      color: color(error);
    }
  }

  @include attr(error) {
    .control { border-color: color(error); }
  }
}

Publicado bajo licencia MIT.