155 lines
3.6 KiB
CSS
155 lines
3.6 KiB
CSS
/* Project card: thumbnail, summary, stretched-link Open control, links. */
|
|
@layer components {
|
|
.project-card {
|
|
position: relative;
|
|
display: grid;
|
|
grid-template-columns: 1fr;
|
|
grid-template-areas:
|
|
'thumb'
|
|
'summary';
|
|
min-width: 0;
|
|
overflow: hidden;
|
|
border: 1px solid var(--color-rule);
|
|
border-radius: var(--radius-lg);
|
|
background: var(--color-bg);
|
|
transition: border-color 150ms ease;
|
|
}
|
|
|
|
.project-card:hover,
|
|
.project-card:focus-within,
|
|
.project-card:target {
|
|
border-color: var(--color-rule-strong);
|
|
}
|
|
|
|
.project-card .project-thumbnail {
|
|
grid-area: thumb;
|
|
width: 100%;
|
|
height: auto;
|
|
border: 0;
|
|
border-bottom: 1px solid var(--color-rule);
|
|
border-radius: 0;
|
|
aspect-ratio: 4 / 3;
|
|
}
|
|
|
|
.project-card__summary {
|
|
grid-area: summary;
|
|
display: flex;
|
|
flex-direction: column;
|
|
justify-content: space-between;
|
|
gap: var(--space-3);
|
|
min-width: 0;
|
|
padding: var(--space-3) var(--space-4);
|
|
}
|
|
|
|
.project-card p {
|
|
margin: 0;
|
|
}
|
|
|
|
.project-card .project-description {
|
|
color: var(--color-fg);
|
|
font-size: var(--fs-base);
|
|
line-height: var(--leading-snug);
|
|
}
|
|
|
|
.project-card__head {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: var(--space-1);
|
|
min-width: 0;
|
|
}
|
|
|
|
.project-card__actions {
|
|
display: flex;
|
|
align-items: center;
|
|
flex-wrap: wrap;
|
|
gap: var(--space-2) var(--space-3);
|
|
margin-top: var(--space-3);
|
|
}
|
|
|
|
/* Stretched link: the Open control's overlay covers the whole card so any
|
|
click opens the project website. The Article link sits above the overlay
|
|
via a higher z-index and stays independently clickable. */
|
|
.project-card__open::after {
|
|
content: '';
|
|
position: absolute;
|
|
inset: 0;
|
|
z-index: 1;
|
|
/* Cover the whole card, not the Open button's pill radius. The card's own
|
|
overflow:hidden + border-radius clips this to the rounded card shape. */
|
|
border-radius: 0;
|
|
}
|
|
|
|
.project-card__open {
|
|
margin-left: auto;
|
|
display: inline-flex;
|
|
align-items: center;
|
|
gap: 0.3em;
|
|
min-height: 36px;
|
|
padding: 0.25em 0.85em;
|
|
border: 1px solid var(--color-rule-strong);
|
|
border-radius: var(--radius-pill);
|
|
background: var(--color-bg);
|
|
color: var(--color-link);
|
|
font-size: var(--fs-caption);
|
|
font-weight: var(--weight-semibold);
|
|
text-decoration: none;
|
|
transition:
|
|
background-color 150ms ease,
|
|
border-color 150ms ease,
|
|
color 150ms ease;
|
|
}
|
|
|
|
.project-card:hover .project-card__open,
|
|
.project-card:focus-within .project-card__open {
|
|
border-color: var(--color-link);
|
|
background: var(--color-callout-bg);
|
|
color: var(--color-link-hover);
|
|
}
|
|
|
|
.project-article-link {
|
|
position: relative;
|
|
z-index: 2;
|
|
display: inline-flex;
|
|
align-items: center;
|
|
gap: 0.3em;
|
|
min-height: 36px;
|
|
color: var(--color-link);
|
|
font-size: var(--fs-caption);
|
|
font-weight: var(--weight-medium);
|
|
text-decoration: none;
|
|
}
|
|
|
|
.project-article-link:hover,
|
|
.project-article-link:focus-visible {
|
|
color: var(--color-link-hover);
|
|
text-decoration: underline;
|
|
}
|
|
|
|
.project-links {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
gap: var(--space-1) var(--space-3);
|
|
margin: var(--space-3) 0 0;
|
|
padding: 0;
|
|
list-style: none;
|
|
}
|
|
|
|
.project-links a {
|
|
min-height: 44px;
|
|
min-width: 44px;
|
|
display: inline-flex;
|
|
align-items: center;
|
|
color: var(--color-link);
|
|
}
|
|
|
|
.project-links a:hover,
|
|
.project-links a:focus-visible {
|
|
color: var(--color-link-hover);
|
|
}
|
|
|
|
.project-links a .download-indicator {
|
|
margin-left: 0.25em;
|
|
color: var(--color-muted);
|
|
font-size: 0.85em;
|
|
}
|
|
}
|