Eighteen changes since v0.14.0. See CHANGELOG.md for the full list and the upgrade notes (bump IMAGE_CACHE_VERSION).
203 lines
4.8 KiB
CSS
203 lines
4.8 KiB
CSS
/* Photo Essay & Storytelling Mode Styles */
|
|
|
|
.essay-container {
|
|
/*
|
|
* One shared measure for every block, so headings, prose and figures line up
|
|
* on the same left edge. Deliberately in rem, not the `68ch` this replaces:
|
|
* `ch` is relative to each element's own font, so a serif heading resolved to
|
|
* a wider column than the body text and started further left. 40rem matches
|
|
* what 68ch produced for the body font. Custom properties are substituted as
|
|
* raw tokens, so a `ch` value here would be re-resolved per element and bring
|
|
* the bug straight back — keep this font-independent.
|
|
*
|
|
* `--essay-bleed` / `--essay-wide` are viewport-based by default and get
|
|
* overridden where the essay renders inside a narrower box (e.g. the admin
|
|
* Journal Studio preview pane).
|
|
*/
|
|
--essay-measure: 40rem;
|
|
--essay-wide: 1100px;
|
|
--essay-bleed: 100vw;
|
|
|
|
width: 100%;
|
|
max-width: 100%;
|
|
margin: 0 auto;
|
|
padding: 2rem 1.5rem 6rem 1.5rem;
|
|
}
|
|
|
|
/* Header & Cover */
|
|
.essay-header {
|
|
max-width: var(--essay-measure);
|
|
margin: 0 auto 3.5rem auto;
|
|
text-align: center;
|
|
}
|
|
|
|
.essay-header__title {
|
|
font-family: var(--font-serif, serif);
|
|
font-size: clamp(2.2rem, 5vw, 3.8rem);
|
|
font-weight: 700;
|
|
line-height: 1.15;
|
|
margin-bottom: 1rem;
|
|
letter-spacing: -0.02em;
|
|
}
|
|
|
|
.essay-header__subtitle {
|
|
font-family: var(--font-sans, sans-serif);
|
|
font-size: clamp(1.1rem, 2.5vw, 1.4rem);
|
|
opacity: 0.8;
|
|
line-height: 1.5;
|
|
margin-bottom: 1.5rem;
|
|
}
|
|
|
|
.essay-header__meta {
|
|
font-family: var(--font-caption, monospace);
|
|
font-size: 0.85rem;
|
|
opacity: 0.6;
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.05em;
|
|
}
|
|
|
|
/* Reading column */
|
|
.essay-prose {
|
|
max-width: var(--essay-measure);
|
|
margin: 0 auto 2.5rem auto;
|
|
font-family: var(--font-sans, sans-serif);
|
|
font-size: clamp(1.05rem, 2vw, 1.2rem);
|
|
line-height: 1.75;
|
|
color: var(--text-primary, rgba(255, 255, 255, 0.92));
|
|
}
|
|
|
|
.essay-prose p {
|
|
margin-bottom: 1.75rem;
|
|
}
|
|
|
|
.essay-heading {
|
|
font-family: var(--font-serif, serif);
|
|
max-width: var(--essay-measure);
|
|
margin: 3.5rem auto 1.5rem auto;
|
|
font-weight: 600;
|
|
line-height: 1.25;
|
|
}
|
|
|
|
.essay-heading--1 {
|
|
font-size: clamp(1.8rem, 3.5vw, 2.5rem);
|
|
}
|
|
.essay-heading--2 {
|
|
font-size: clamp(1.5rem, 3vw, 2rem);
|
|
}
|
|
.essay-heading--3 {
|
|
font-size: clamp(1.25rem, 2.5vw, 1.6rem);
|
|
}
|
|
|
|
/* Pullquote */
|
|
.essay-quote {
|
|
max-width: var(--essay-measure);
|
|
margin: 3.5rem auto;
|
|
padding: 1.5rem 2rem;
|
|
border-left: 3px solid var(--accent, #e60012);
|
|
background: var(--bg-card, rgba(255, 255, 255, 0.03));
|
|
border-radius: 0 8px 8px 0;
|
|
font-family: var(--font-serif, serif);
|
|
font-style: italic;
|
|
font-size: clamp(1.15rem, 2.2vw, 1.35rem);
|
|
line-height: 1.6;
|
|
}
|
|
|
|
.essay-quote__author {
|
|
display: block;
|
|
margin-top: 0.75rem;
|
|
font-family: var(--font-caption, monospace);
|
|
font-style: normal;
|
|
font-size: 0.85rem;
|
|
opacity: 0.7;
|
|
text-transform: uppercase;
|
|
}
|
|
|
|
/* Essay Photos & Layout Modes */
|
|
.essay-figure {
|
|
margin: 3.5rem auto;
|
|
width: 100%;
|
|
}
|
|
|
|
.essay-figure--contained {
|
|
max-width: var(--essay-measure);
|
|
}
|
|
|
|
.essay-figure--wide {
|
|
max-width: var(--essay-wide);
|
|
}
|
|
|
|
/*
|
|
* `width` has to be set too, not just max-width: .essay-figure is width: 100%,
|
|
* which over-constrains the box so the negative right margin is dropped and only
|
|
* the left side bleeds.
|
|
*/
|
|
.essay-figure--fullbleed {
|
|
width: var(--essay-bleed);
|
|
max-width: var(--essay-bleed);
|
|
margin-left: calc(-0.5 * var(--essay-bleed) + 50%);
|
|
margin-right: calc(-0.5 * var(--essay-bleed) + 50%);
|
|
}
|
|
|
|
.essay-image-wrapper {
|
|
position: relative;
|
|
width: 100%;
|
|
overflow: hidden;
|
|
border-radius: var(--radius-md, 0px);
|
|
max-height: 80vh;
|
|
}
|
|
|
|
.essay-image-wrapper img {
|
|
object-fit: cover;
|
|
width: 100%;
|
|
height: auto;
|
|
max-height: 80vh;
|
|
display: block;
|
|
transition: transform 0.4s ease;
|
|
}
|
|
|
|
.essay-image-wrapper:hover img {
|
|
transform: scale(1.015);
|
|
}
|
|
|
|
.essay-figcaption {
|
|
max-width: var(--essay-measure);
|
|
margin: 0.75rem auto 0 auto;
|
|
text-align: center;
|
|
font-family: var(--font-caption, monospace);
|
|
font-size: 0.85rem;
|
|
opacity: 0.75;
|
|
}
|
|
|
|
/* Side by side photo pair */
|
|
/*
|
|
* Justified row: each photo keeps its own aspect ratio, and its width is given
|
|
* by `flex-grow: <aspect ratio>` (set inline from the asset). Since width ∝ ratio
|
|
* and height = width / ratio, both photos end up exactly the same height without
|
|
* a single pixel being cropped — a shared baseline instead of one portrait
|
|
* towering over a landscape.
|
|
*/
|
|
.essay-pair-grid {
|
|
display: flex;
|
|
gap: 1.5rem;
|
|
width: 100%;
|
|
max-width: var(--essay-wide);
|
|
margin: 3.5rem auto;
|
|
}
|
|
|
|
.essay-pair-grid > .essay-image-wrapper {
|
|
flex-basis: 0;
|
|
min-width: 0;
|
|
}
|
|
|
|
@media (max-width: 640px) {
|
|
/* Stacked: full width each, height from the photo's own ratio. */
|
|
.essay-pair-grid {
|
|
flex-direction: column;
|
|
gap: 1.5rem;
|
|
}
|
|
|
|
.essay-pair-grid > .essay-image-wrapper {
|
|
flex: none;
|
|
}
|
|
}
|