Components (registry)Layout
Footer con newsletter
Layout template: footer-newsletter
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
{{newsletterHeading}}{{newsletterBody}}{{newsletterCta}}{{logo}}{{col1_title}}{{link1_url}}{{link1_label}}{{link2_url}}{{link2_label}}{{col2_title}}{{link3_url}}{{link3_label}}{{link4_url}}{{link4_label}}{{legal}}- Componentes requeridos
nav-linkinputbuttontypographydividerimage
Anatomía CSS
<div class="layoutFooterNewsletter"> </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 | border | #e5e5e5 | border |
CSS mínimo funcional
Autocontenido: sin imports ni tokens. Para previews y prototipos — en producción se consume el CSS del DS.
/* Layout: footer-newsletter — structure only */
.l-footer-newsletter {
display: flex;
flex-direction: column;
gap: 32px;
padding: 48px 32px;
border-top: 1px solid #e5e5e5;
}
.l-footer-newsletter__newsletter {
text-align: center;
max-width: 480px;
margin: 0 auto;
}
.l-footer-newsletter__newsletter-heading {
font-size: var(--text-lg);
font-weight: 600;
}
.l-footer-newsletter__form {
display: flex;
gap: 8px;
margin-top: 8px;
}
.l-footer-newsletter__brand {
max-width: 200px;
}
.l-footer-newsletter__cols {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 32px;
}
@media (max-width: 768px) {
.l-footer-newsletter__cols {
grid-template-columns: 1fr;
}
}
.l-footer-newsletter__col-title {
font-weight: 600;
margin-bottom: 8px;
}
.l-footer-newsletter__legal {
margin-top: 16px;
}
Codigo fuente
layouts/footer-newsletter.css
/* Layout: footer-newsletter — structure only */ .l-footer-newsletter { display: flex; flex-direction: column; gap: var(--spacing-8); padding: var(--spacing-12) var(--spacing-8); border-top: 1px solid var(--border); } .l-footer-newsletter__newsletter { text-align: center; max-width: 480px; margin: 0 auto; } .l-footer-newsletter__newsletter-heading { font-size: var(--text-lg); font-weight: 600; } .l-footer-newsletter__form { display: flex; gap: var(--spacing-2); margin-top: var(--spacing-2); } .l-footer-newsletter__brand { max-width: 200px; } .l-footer-newsletter__cols { display: grid; grid-template-columns: repeat(2, 1fr); gap: var(--spacing-8); } @media (max-width: 768px) { .l-footer-newsletter__cols { grid-template-columns: 1fr; } } .l-footer-newsletter__col-title { font-weight: 600; margin-bottom: var(--spacing-2); } .l-footer-newsletter__legal { margin-top: var(--spacing-4); }