Components (registry)Layout
Timeline Vertical
Layout template: timeline-vertical
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}}{{cta_primary_href}}{{cta_primary}}{{cta_secondary_href}}{{cta_secondary}}{{timeline1_date}}{{timeline1_heading}}{{timeline1_description}}{{timeline1_cta_primary_href}}{{timeline1_cta_primary}}{{timeline1_cta_secondary_href}}{{timeline1_cta_secondary}}{{timeline2_date}}{{timeline2_heading}}{{timeline2_description}}{{timeline2_cta_primary_href}}{{timeline2_cta_primary}}{{timeline2_cta_secondary_href}}{{timeline2_cta_secondary}}{{timeline3_date}}{{timeline3_heading}}{{timeline3_description}}{{timeline3_cta_primary_href}}{{timeline3_cta_primary}}{{timeline3_cta_secondary_href}}{{timeline3_cta_secondary}}{{timeline4_date}}{{timeline4_heading}}{{timeline4_description}}{{timeline4_cta_primary_href}}{{timeline4_cta_primary}}{{timeline4_cta_secondary_href}}{{timeline4_cta_secondary}}- Componentes requeridos
buttontypography
Anatomía CSS
<div class="layoutTimelineVertical"> </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 | #0a0a0a | foreground |
| all | bg | #e5e5e5 | border |
| 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: timeline-vertical — structure only, pure DS tokens */
.l-timeline-vertical {
padding: 80px 32px;
}
.l-timeline-vertical__grid {
position: relative;
display: grid;
grid-template-columns: 1fr;
gap: 24px;
}
@media (min-width: 768px) {
.l-timeline-vertical__grid {
grid-template-columns: 1fr 1fr;
gap: 96px;
align-items: start;
}
}
@media (min-width: 1024px) {
.l-timeline-vertical__grid {
gap: 128px;
}
}
.l-timeline-vertical__intro {
position: relative;
z-index: 10;
}
@media (min-width: 768px) {
.l-timeline-vertical__intro {
position: sticky;
top: 80px;
z-index: auto;
padding-right: 16px;
}
}
.l-timeline-vertical__tagline {
font-size: 12.8px;
font-weight: 600;
color: #525252;
margin-bottom: 12px;
}
.l-timeline-vertical__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-timeline-vertical__heading {
font-size: 61.04px;
line-height: 1.1;
margin-bottom: 24px;
}
}
@media (min-width: 1024px) {
.l-timeline-vertical__heading {
font-size: 76.29px;
line-height: 1.05;
}
}
.l-timeline-vertical__description {
font-size: 16px;
line-height: 1.5;
color: #525252;
}
@media (min-width: 768px) {
.l-timeline-vertical__description {
font-size: 20px;
line-height: 1.45;
}
}
.l-timeline-vertical__actions {
margin-top: 24px;
display: flex;
flex-wrap: wrap;
gap: 16px;
}
@media (min-width: 768px) {
.l-timeline-vertical__actions {
margin-top: 32px;
}
}
.l-timeline-vertical__line {
position: absolute;
left: 0;
top: 0;
bottom: 0;
z-index: 0;
width: 2rem;
display: flex;
flex-direction: column;
align-items: center;
pointer-events: none;
}
@media (min-width: 768px) {
.l-timeline-vertical__line {
left: 50%;
transform: translateX(-50%);
width: 0.75rem;
}
}
.l-timeline-vertical__line-fade-top {
height: 4rem;
width: 0.25rem;
background: linear-gradient(to bottom, #fafafa, transparent);
flex-shrink: 0;
}
.l-timeline-vertical__line-bar {
width: 3px;
background-color: #e5e5e5;
flex: 1;
}
@media (min-width: 768px) {
.l-timeline-vertical__line-bar {
width: 3px;
}
}
.l-timeline-vertical__line-fade-bottom {
height: 4rem;
width: 0.25rem;
background: linear-gradient(to top, #fafafa, transparent);
flex-shrink: 0;
}
.l-timeline-vertical__items {
position: relative;
z-index: 10;
display: grid;
gap: 32px 48px;
}
@media (min-width: 768px) {
.l-timeline-vertical__items {
gap: 80px 80px;
}
}
@media (min-width: 1024px) {
.l-timeline-vertical__items {
gap: 80px 128px;
}
}
.l-timeline-vertical__item {
position: relative;
padding-left: 3rem;
}
@media (min-width: 768px) {
.l-timeline-vertical__item {
padding-left: 0;
}
}
.l-timeline-vertical__dot {
position: absolute;
left: 0;
top: 1.75rem;
width: 1rem;
height: 1rem;
border-radius: 9999px;
background-color: #e5e5e5;
box-shadow: 0 0 0 8px #fafafa;
z-index: 20;
}
@media (min-width: 768px) {
.l-timeline-vertical__dot {
left: -2.5rem;
}
}
@media (min-width: 1024px) {
.l-timeline-vertical__dot {
left: -3rem;
}
}
.l-timeline-vertical__card {
border: 1px solid #e5e5e5;
padding: 24px;
}
@media (min-width: 768px) {
.l-timeline-vertical__card {
padding: 32px;
}
}
.l-timeline-vertical__date {
font-size: 48.83px;
line-height: 1.2;
font-weight: 700;
color: #0a0a0a;
margin-bottom: 12px;
}
@media (min-width: 768px) {
.l-timeline-vertical__date {
font-size: 61.04px;
margin-bottom: 16px;
}
}
@media (min-width: 1024px) {
.l-timeline-vertical__date {
font-size: 76.29px;
}
}
.l-timeline-vertical__item-heading {
font-size: 25px;
font-weight: 700;
color: #0a0a0a;
margin-bottom: 12px;
}
@media (min-width: 768px) {
.l-timeline-vertical__item-heading {
font-size: 31.25px;
margin-bottom: 16px;
}
}
.l-timeline-vertical__item-description {
font-size: 16px;
color: #0a0a0a;
}
.l-timeline-vertical__item-actions {
margin-top: 24px;
display: flex;
flex-wrap: wrap;
gap: 16px;
}
@media (min-width: 768px) {
.l-timeline-vertical__item-actions {
margin-top: 32px;
}
}
Codigo fuente
layouts/timeline-vertical.css
/* Layout: timeline-vertical — structure only, pure DS tokens */ .l-timeline-vertical { padding: var(--spacing-20) var(--spacing-8); } .l-timeline-vertical__grid { position: relative; display: grid; grid-template-columns: 1fr; gap: var(--spacing-6); } @media (min-width: 768px) { .l-timeline-vertical__grid { grid-template-columns: 1fr 1fr; gap: var(--spacing-24); align-items: start; } } @media (min-width: 1024px) { .l-timeline-vertical__grid { gap: var(--spacing-32); } } .l-timeline-vertical__intro { position: relative; z-index: 10; } @media (min-width: 768px) { .l-timeline-vertical__intro { position: sticky; top: var(--spacing-20); z-index: auto; padding-right: var(--spacing-4); } } .l-timeline-vertical__tagline { font-size: var(--font-size-sm); font-weight: var(--font-weight-semibold); color: var(--muted-foreground); margin-bottom: var(--spacing-3); } .l-timeline-vertical__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-timeline-vertical__heading { font-size: var(--font-size-5xl); line-height: var(--line-height-5xl); margin-bottom: var(--spacing-6); } } @media (min-width: 1024px) { .l-timeline-vertical__heading { font-size: var(--font-size-6xl); line-height: var(--line-height-6xl); } } .l-timeline-vertical__description { font-size: var(--font-size-base); line-height: var(--line-height-base); color: var(--muted-foreground); } @media (min-width: 768px) { .l-timeline-vertical__description { font-size: var(--font-size-lg); line-height: var(--line-height-lg); } } .l-timeline-vertical__actions { margin-top: var(--spacing-6); display: flex; flex-wrap: wrap; gap: var(--spacing-4); } @media (min-width: 768px) { .l-timeline-vertical__actions { margin-top: var(--spacing-8); } } .l-timeline-vertical__line { position: absolute; left: 0; top: 0; bottom: 0; z-index: 0; width: 2rem; display: flex; flex-direction: column; align-items: center; pointer-events: none; } @media (min-width: 768px) { .l-timeline-vertical__line { left: 50%; transform: translateX(-50%); width: 0.75rem; } } .l-timeline-vertical__line-fade-top { height: 4rem; width: 0.25rem; background: linear-gradient(to bottom, var(--background), transparent); flex-shrink: 0; } .l-timeline-vertical__line-bar { width: 3px; background-color: var(--border); flex: 1; } @media (min-width: 768px) { .l-timeline-vertical__line-bar { width: 3px; } } .l-timeline-vertical__line-fade-bottom { height: 4rem; width: 0.25rem; background: linear-gradient(to top, var(--background), transparent); flex-shrink: 0; } .l-timeline-vertical__items { position: relative; z-index: 10; display: grid; gap: var(--spacing-8) var(--spacing-12); } @media (min-width: 768px) { .l-timeline-vertical__items { gap: var(--spacing-20) var(--spacing-20); } } @media (min-width: 1024px) { .l-timeline-vertical__items { gap: var(--spacing-20) var(--spacing-32); } } .l-timeline-vertical__item { position: relative; padding-left: 3rem; } @media (min-width: 768px) { .l-timeline-vertical__item { padding-left: 0; } } .l-timeline-vertical__dot { position: absolute; left: 0; top: 1.75rem; width: 1rem; height: 1rem; border-radius: var(--radius-full); background-color: var(--border); box-shadow: 0 0 0 8px var(--background); z-index: 20; } @media (min-width: 768px) { .l-timeline-vertical__dot { left: -2.5rem; } } @media (min-width: 1024px) { .l-timeline-vertical__dot { left: -3rem; } } .l-timeline-vertical__card { border: 1px solid var(--border); padding: var(--spacing-6); } @media (min-width: 768px) { .l-timeline-vertical__card { padding: var(--spacing-8); } } .l-timeline-vertical__date { font-size: var(--font-size-4xl); line-height: 1.2; font-weight: var(--font-weight-bold); color: var(--foreground); margin-bottom: var(--spacing-3); } @media (min-width: 768px) { .l-timeline-vertical__date { font-size: var(--font-size-5xl); margin-bottom: var(--spacing-4); } } @media (min-width: 1024px) { .l-timeline-vertical__date { font-size: var(--font-size-6xl); } } .l-timeline-vertical__item-heading { font-size: var(--font-size-xl); font-weight: var(--font-weight-bold); color: var(--foreground); margin-bottom: var(--spacing-3); } @media (min-width: 768px) { .l-timeline-vertical__item-heading { font-size: var(--font-size-2xl); margin-bottom: var(--spacing-4); } } .l-timeline-vertical__item-description { font-size: var(--font-size-base); color: var(--foreground); } .l-timeline-vertical__item-actions { margin-top: var(--spacing-6); display: flex; flex-wrap: wrap; gap: var(--spacing-4); } @media (min-width: 768px) { .l-timeline-vertical__item-actions { margin-top: var(--spacing-8); } }