Components (registry)Layout
Contacto con formulario
Layout template: contact-form
Contrato del layout
Un layout transporta anatomia, no pintura: se rellena por slots y depende del CSS de los componentes que lista. Instalarlo sin ellos lo deja sin estilos.
- Slots
{{headline}}{{subtitle}}{{channel1_label}}{{channel1_value}}{{submitCta}}- Componentes requeridos
fieldinputtextareabuttonitemtypography
Anatomía CSS
<div class="layoutContactForm"> </div>
Tokens resueltos
Valores finales tras seguir la cadena de tokens. Derivados del source: si un token cambia, esta tabla cambia sola.
| Variante | Prop | Valor | Token |
|---|---|---|---|
| all | fg | #525252 | muted.foreground |
CSS mínimo funcional
Autocontenido: sin imports ni tokens. Para previews y prototipos — en producción se consume el CSS del DS.
/* Layout: contact-form — structure only */
.l-contact-form {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 32px;
padding: 48px 32px;
}
@media (max-width: 768px) {
.l-contact-form {
grid-template-columns: 1fr;
}
}
.l-contact-form__headline {
font-size: var(--text-xl);
}
.l-contact-form__subtitle {
color: #525252;
}
.l-contact-form__channels {
margin-top: 16px;
}
.l-contact-form__channel-label {
font-weight: 600;
}
.l-contact-form__form {
display: flex;
flex-direction: column;
gap: 16px;
}
Codigo fuente
layouts/contact-form.css
/* Layout: contact-form — structure only */ .l-contact-form { display: grid; grid-template-columns: 1fr 1fr; gap: var(--spacing-8); padding: var(--spacing-12) var(--spacing-8); } @media (max-width: 768px) { .l-contact-form { grid-template-columns: 1fr; } } .l-contact-form__headline { font-size: var(--text-xl); } .l-contact-form__subtitle { color: var(--muted-foreground); } .l-contact-form__channels { margin-top: var(--spacing-4); } .l-contact-form__channel-label { font-weight: 600; } .l-contact-form__form { display: flex; flex-direction: column; gap: var(--spacing-4); }