Skip to content

Field

CField 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 { CField } from '@bedrock/core/vue';
scss
@use '@bedrock/core/field';

Props

PropTipoDefaultDescripción
fieldIdStringnullEnlaza el <label> con el control mediante for/id. Debe coincidir con el id del control interior.
disabledBooleanfalseAplica data-disabled al campo completo.
requiredBooleanfalseAplica data-required al campo completo.

Slots

SlotDescripción
defaultEl control del campo: CInput, CCheckbox, <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="c-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 CInput

html
<CField field-id="email">
  <template #label>Email</template>
  <CInput id="email" v-model="email" type="email" />
</CField>

Con hint

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

Con error

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

Deshabilitado

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

Estilos en el proyecto consumidor

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

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