Components (registry)Layout
Blog Listing
Layout template: blog-listing
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
{{section_id}}{{tagline}}{{heading}}{{description}}{{post1_url}}{{post1_image}}{{post1_image_alt}}{{post1_category}}{{post1_title}}{{post1_description}}{{post1_avatar}}{{post1_avatar_alt}}{{post1_fullName}}{{post1_date}}{{post1_readTime}}{{post2_url}}{{post2_image}}{{post2_image_alt}}{{post2_category}}{{post2_title}}{{post2_description}}{{post2_avatar}}{{post2_avatar_alt}}{{post2_fullName}}{{post2_date}}{{post2_readTime}}{{post3_url}}{{post3_image}}{{post3_image_alt}}{{post3_category}}{{post3_title}}{{post3_description}}{{post3_avatar}}{{post3_avatar_alt}}{{post3_fullName}}{{post3_date}}{{post3_readTime}}{{cta_href}}{{cta}}- Componentes requeridos
buttontypographyimagelink-button
Anatomía CSS
<div class="layoutBlogListing"> </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: blog-listing — structure only, pure DS tokens */
.l-blog-listing {
padding: 80px 32px;
}
.l-blog-listing__container {
max-width: 1200px;
margin: 0 auto;
}
.l-blog-listing__header {
margin-bottom: 48px;
}
@media (min-width: 768px) {
.l-blog-listing__header {
margin-bottom: var(--spacing-18);
}
}
@media (min-width: 1024px) {
.l-blog-listing__header {
margin-bottom: 80px;
}
}
.l-blog-listing__header-content {
max-width: 32rem;
}
.l-blog-listing__tagline {
font-size: 12.8px;
font-weight: 600;
color: #525252;
margin-bottom: 12px;
}
.l-blog-listing__heading {
font-size: 48.83px;
line-height: 1.15;
font-weight: 700;
letter-spacing: -0.02em;
color: #0a0a0a;
margin-bottom: 20px;
}
@media (min-width: 768px) {
.l-blog-listing__heading {
font-size: 61.04px;
line-height: 1.1;
margin-bottom: 24px;
}
}
@media (min-width: 1024px) {
.l-blog-listing__heading {
font-size: 76.29px;
line-height: 1.05;
}
}
.l-blog-listing__description {
font-size: 16px;
line-height: 1.5;
color: #525252;
}
@media (min-width: 768px) {
.l-blog-listing__description {
font-size: 20px;
line-height: 1.45;
}
}
.l-blog-listing__grid {
display: grid;
grid-template-columns: 1fr;
gap: 32px 48px;
}
@media (min-width: 768px) {
.l-blog-listing__grid {
grid-template-columns: repeat(2, 1fr);
gap: 32px 64px;
}
}
@media (min-width: 1024px) {
.l-blog-listing__grid {
grid-template-columns: repeat(3, 1fr);
}
}
.l-blog-listing__post {
/* individual post */
}
.l-blog-listing__image-link {
display: block;
margin-bottom: 24px;
}
.l-blog-listing__image-wrapper {
width: 100%;
overflow: hidden;
}
.l-blog-listing__image {
aspect-ratio: 3 / 2;
width: 100%;
object-fit: cover;
display: block;
}
.l-blog-listing__category {
display: inline-block;
max-width: 100%;
margin-bottom: 8px;
margin-right: 16px;
font-size: 12.8px;
font-weight: 600;
color: #0a0a0a;
}
.l-blog-listing__title-link {
display: block;
max-width: 100%;
margin-bottom: 8px;
}
.l-blog-listing__title {
font-size: 25px;
font-weight: 700;
color: #0a0a0a;
}
@media (min-width: 768px) {
.l-blog-listing__title {
font-size: 31.25px;
}
}
.l-blog-listing__excerpt {
font-size: 16px;
color: #0a0a0a;
}
.l-blog-listing__author {
margin-top: 24px;
display: flex;
align-items: center;
}
.l-blog-listing__author-avatar-wrapper {
margin-right: 16px;
flex-shrink: 0;
}
.l-blog-listing__author-avatar {
width: 3rem;
height: 3rem;
min-height: 3rem;
min-width: 3rem;
border-radius: 9999px;
object-fit: cover;
}
.l-blog-listing__author-info {
/* text */
}
.l-blog-listing__author-name {
font-size: 12.8px;
font-weight: 600;
color: #0a0a0a;
}
.l-blog-listing__author-meta {
display: flex;
align-items: center;
}
.l-blog-listing__author-date,
.l-blog-listing__author-read-time {
font-size: 12.8px;
color: #525252;
}
.l-blog-listing__author-dot {
margin: 0 8px;
color: #525252;
}
.l-blog-listing__cta-wrapper {
display: flex;
justify-content: flex-end;
margin-top: 40px;
}
@media (min-width: 768px) {
.l-blog-listing__cta-wrapper {
margin-top: 56px;
}
}
@media (min-width: 1024px) {
.l-blog-listing__cta-wrapper {
margin-top: 64px;
}
}
Codigo fuente
layouts/blog-listing.css
/* Layout: blog-listing — structure only, pure DS tokens */ .l-blog-listing { padding: var(--spacing-20) var(--spacing-8); } .l-blog-listing__container { max-width: 1200px; margin: 0 auto; } .l-blog-listing__header { margin-bottom: var(--spacing-12); } @media (min-width: 768px) { .l-blog-listing__header { margin-bottom: var(--spacing-18); } } @media (min-width: 1024px) { .l-blog-listing__header { margin-bottom: var(--spacing-20); } } .l-blog-listing__header-content { max-width: 32rem; } .l-blog-listing__tagline { font-size: var(--font-size-sm); font-weight: var(--font-weight-semibold); color: var(--muted-foreground); margin-bottom: var(--spacing-3); } .l-blog-listing__heading { font-size: var(--font-size-4xl); line-height: var(--line-height-4xl); font-weight: var(--font-weight-bold); letter-spacing: var(--letter-spacing-tight); color: var(--foreground); margin-bottom: var(--spacing-5); } @media (min-width: 768px) { .l-blog-listing__heading { font-size: var(--font-size-5xl); line-height: var(--line-height-5xl); margin-bottom: var(--spacing-6); } } @media (min-width: 1024px) { .l-blog-listing__heading { font-size: var(--font-size-6xl); line-height: var(--line-height-6xl); } } .l-blog-listing__description { font-size: var(--font-size-base); line-height: var(--line-height-base); color: var(--muted-foreground); } @media (min-width: 768px) { .l-blog-listing__description { font-size: var(--font-size-lg); line-height: var(--line-height-lg); } } .l-blog-listing__grid { display: grid; grid-template-columns: 1fr; gap: var(--spacing-8) var(--spacing-12); } @media (min-width: 768px) { .l-blog-listing__grid { grid-template-columns: repeat(2, 1fr); gap: var(--spacing-8) var(--spacing-16); } } @media (min-width: 1024px) { .l-blog-listing__grid { grid-template-columns: repeat(3, 1fr); } } .l-blog-listing__post { /* individual post */ } .l-blog-listing__image-link { display: block; margin-bottom: var(--spacing-6); } .l-blog-listing__image-wrapper { width: 100%; overflow: hidden; } .l-blog-listing__image { aspect-ratio: 3 / 2; width: 100%; object-fit: cover; display: block; } .l-blog-listing__category { display: inline-block; max-width: 100%; margin-bottom: var(--spacing-2); margin-right: var(--spacing-4); font-size: var(--font-size-sm); font-weight: var(--font-weight-semibold); color: var(--foreground); } .l-blog-listing__title-link { display: block; max-width: 100%; margin-bottom: var(--spacing-2); } .l-blog-listing__title { font-size: var(--font-size-xl); font-weight: var(--font-weight-bold); color: var(--foreground); } @media (min-width: 768px) { .l-blog-listing__title { font-size: var(--font-size-2xl); } } .l-blog-listing__excerpt { font-size: var(--font-size-base); color: var(--foreground); } .l-blog-listing__author { margin-top: var(--spacing-6); display: flex; align-items: center; } .l-blog-listing__author-avatar-wrapper { margin-right: var(--spacing-4); flex-shrink: 0; } .l-blog-listing__author-avatar { width: 3rem; height: 3rem; min-height: 3rem; min-width: 3rem; border-radius: var(--radius-full); object-fit: cover; } .l-blog-listing__author-info { /* text */ } .l-blog-listing__author-name { font-size: var(--font-size-sm); font-weight: var(--font-weight-semibold); color: var(--foreground); } .l-blog-listing__author-meta { display: flex; align-items: center; } .l-blog-listing__author-date, .l-blog-listing__author-read-time { font-size: var(--font-size-sm); color: var(--muted-foreground); } .l-blog-listing__author-dot { margin: 0 var(--spacing-2); color: var(--muted-foreground); } .l-blog-listing__cta-wrapper { display: flex; justify-content: flex-end; margin-top: var(--spacing-10); } @media (min-width: 768px) { .l-blog-listing__cta-wrapper { margin-top: var(--spacing-14); } } @media (min-width: 1024px) { .l-blog-listing__cta-wrapper { margin-top: var(--spacing-16); } }