/* ══════════════════════════════════════════════════════ THEME: Kunsthalle — photographs hung on a grey gallery wall ══════════════════════════════════════════════════════ The grey surround (tokens.css) is the point: lighter than every dark preset, darker than every light one, as in an ISO 3664 viewing booth. Everything else is a museum signage system: one family (Libre Franklin), sentence-case titles, small tracked labels, and petrol reserved for wayfinding — links and hover, never decoration. */ [data-preset='kunsthalle'] { /* The hung shadow: a tight contact shadow plus a soft drop below. */ --kh-hang: 0 1px 2px rgba(0, 0, 0, 0.14), 0 14px 28px -14px rgba(0, 0, 0, 0.28); --kh-hang-hover: 0 2px 4px rgba(0, 0, 0, 0.18), 0 20px 36px -16px rgba(0, 0, 0, 0.36); } [data-preset='kunsthalle'][data-theme='light'] { --kh-hang: 0 1px 2px rgba(0, 0, 0, 0.1), 0 14px 28px -16px rgba(0, 0, 0, 0.22); --kh-hang-hover: 0 2px 4px rgba(0, 0, 0, 0.12), 0 20px 36px -16px rgba(0, 0, 0, 0.3); } /* ── Header: wall colour, no rule ─────────────────── */ [data-preset='kunsthalle'] .header { background: color-mix(in srgb, var(--bg-primary) 94%, transparent); border-bottom-color: transparent; } [data-preset='kunsthalle'] .header__wordmark { display: flex; align-items: center; margin-right: 24px; font-family: var(--font-serif); font-size: 0.9rem; font-weight: 600; color: var(--text-primary); white-space: nowrap; } [data-preset='kunsthalle'] .header__nav-link { font-size: 0.8rem; font-weight: 400; letter-spacing: 0; text-transform: none; } [data-preset='kunsthalle'] .header__nav-link:hover { color: var(--accent-text, var(--accent)); border-bottom-color: transparent; } [data-preset='kunsthalle'] .header__nav-link.active { color: var(--text-primary); border-bottom-color: var(--text-primary); } /* ── Titles: sentence case, Franklin 500 ──────────── */ [data-preset='kunsthalle'] .hero__title, [data-preset='kunsthalle'] .album-header__title, [data-preset='kunsthalle'] .subpage-title { font-weight: 500; letter-spacing: -0.01em; text-transform: none; } [data-preset='kunsthalle'] .hero__subtitle, [data-preset='kunsthalle'] .album-header__meta, [data-preset='kunsthalle'] .subpage-subtitle { font-style: normal; letter-spacing: 0; text-transform: none; } /* Labels: the small caps line on a wall text. */ [data-preset='kunsthalle'] .section-label, [data-preset='kunsthalle'] .subpage-section__desc { font-size: 0.68rem; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; color: var(--text-secondary); } /* ── Photo grid: hung works with wall between them ── */ /* Each photo hangs with a wall label below it: PhotoGrid's figcaption (.photo-grid__label), in flow under the tile, so a long caption pushes the next row down instead of running into it. The rows and columns between the works are wall: at least 16px even when settings.yaml sets a tighter grid.gap, which lands inline and beats the preset's 56px. */ [data-preset='kunsthalle'] .photo-grid { --grid-gap: 56px; row-gap: max(var(--grid-gap), 16px); } [data-preset='kunsthalle'] .photo-grid .photo-grid__item { margin-bottom: 0; transition: box-shadow var(--transition-fast); } /* Masonry: the work and its label stay together in one column, and the wall below them is the figure's, not the tile's. */ [data-preset='kunsthalle'] .photo-grid--masonry > .fade-in { break-inside: avoid; margin-bottom: max(var(--grid-gap), 16px); } /* Justified: the tile keeps the row height and the label hangs below it, so the figure grows rather than the photo shrinking. */ [data-preset='kunsthalle'] .photo-grid--justified > .fade-in { height: auto; } [data-preset='kunsthalle'] .photo-grid--justified .photo-grid__item { height: var(--grid-row-height); } /* The shadow frame, retuned from a soft halo to a hung shadow. */ [data-preset='kunsthalle'][data-photo-frame='shadow'] .photo-grid__item { box-shadow: var(--kh-hang); } [data-preset='kunsthalle'][data-photo-frame='shadow'] .photo-grid__item:hover { box-shadow: var(--kh-hang-hover); } /* Still photos: no zoom, no dimming. */ [data-preset='kunsthalle'] .photo-grid__item:hover img { transform: none; filter: none; } /* The EXIF line moves from the photo to the wall label. Under passepartout it stays printed on the mat (that frame's rule outranks this one), and the label drops its copy below. */ [data-preset='kunsthalle'] .photo-grid__item-exif { display: none; } [data-preset='kunsthalle'][data-photo-frame='passepartout'] .photo-grid__label-exif { display: none; } /* Wall label: catalogue number, the photo's caption when the site publishes one, then camera and lens, in small Franklin on the wall. */ [data-preset='kunsthalle'] .photo-grid__label { display: flex; flex-direction: column; gap: 2px; /* As wide as the photo and never wider: a filmstrip frame sizes to its content, and a long caption must not stretch it. */ width: 0; min-width: 100%; padding-top: 12px; font-family: var(--font-caption); font-size: 0.68rem; font-weight: 400; letter-spacing: 0.01em; line-height: 1.45; color: var(--text-muted); transition: color var(--transition-fast); } [data-preset='kunsthalle'] .photo-grid__label-no { font-weight: 600; letter-spacing: 0.04em; font-variant-numeric: tabular-nums; color: var(--text-secondary); } [data-preset='kunsthalle'] .photo-grid__label-no::before { content: 'No. '; } /* The caption reads as the work's title; three lines at most on the wall, the lightbox has the rest. */ [data-preset='kunsthalle'] .photo-grid__label-title { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; line-clamp: 3; overflow: hidden; overflow-wrap: anywhere; font-size: 0.8rem; font-weight: 500; letter-spacing: 0; color: var(--text-primary); } [data-preset='kunsthalle'] .photo-grid__item:is(:hover, :focus-visible) + .photo-grid__label { color: var(--text-secondary); } /* ── Album covers: hung, with a wall label below ──── */ [data-preset='kunsthalle'] .subpage-grid { --subpage-gap: 40px; } [data-preset='kunsthalle'] .subpage-grid__item { aspect-ratio: auto; overflow: visible; } [data-preset='kunsthalle'] .subpage-grid__item-media { aspect-ratio: 3 / 2; height: auto; box-shadow: var(--kh-hang); transition: box-shadow var(--transition-fast); } [data-preset='kunsthalle'] .subpage-grid__item:hover .subpage-grid__item-media { box-shadow: var(--kh-hang-hover); } [data-preset='kunsthalle'] .subpage-grid__item:hover img { transform: none; filter: none; } [data-preset='kunsthalle'] .subpage-grid__item-overlay, [data-preset='kunsthalle'] .subpage-grid__item-badge { display: none; } [data-preset='kunsthalle'] .subpage-grid__item-caption { display: grid; grid-template-columns: auto 1fr; gap: 0 12px; padding: 14px 0 0; line-height: 1.4; } [data-preset='kunsthalle'] .subpage-grid__item-index { grid-row: span 2; font-size: 0.68rem; font-weight: 600; letter-spacing: 0.04em; color: var(--text-muted); font-variant-numeric: tabular-nums; } [data-preset='kunsthalle'] .subpage-grid__item-index::before { content: 'No. '; } [data-preset='kunsthalle'] .subpage-grid__item-caption-title { font-size: 0.9rem; font-weight: 500; color: var(--text-primary); transition: color var(--transition-fast); } [data-preset='kunsthalle'] .subpage-grid__item:hover .subpage-grid__item-caption-title { color: var(--accent-text, var(--accent)); } [data-preset='kunsthalle'] .subpage-grid__item-caption-count { font-size: 0.72rem; color: var(--text-muted); } /* Standalone album cards on the home page */ [data-preset='kunsthalle'] .album-card { border: none; box-shadow: var(--kh-hang); } [data-preset='kunsthalle'] .album-card:hover { transform: none; box-shadow: var(--kh-hang-hover); } [data-preset='kunsthalle'] .album-card:hover .album-card__image { transform: none; } /* ── Mosaic hero: a wall of works, the title below ── */ [data-preset='kunsthalle'] .hero--mosaic { min-height: 0; } [data-preset='kunsthalle'] .hero__mosaic-grid { gap: 28px; min-height: 0; height: clamp(360px, 64vh, 760px); padding: 40px 40px 0; max-width: var(--max-width); margin: 0 auto; } [data-preset='kunsthalle'] .hero__mosaic-cell { box-shadow: var(--kh-hang); } [data-preset='kunsthalle'] .hero__mosaic-overlay { position: static; transform: none; max-width: var(--max-width); margin: 0 auto; padding: 32px 40px 72px; text-align: left; background: none; backdrop-filter: none; -webkit-backdrop-filter: none; border: none; border-radius: 0; } [data-preset='kunsthalle'] .hero--mosaic .hero__title { font-size: clamp(1.75rem, 3vw, 2.5rem); font-weight: 500; letter-spacing: -0.01em; text-transform: none; color: var(--text-primary); } [data-preset='kunsthalle'] .hero--mosaic .hero__subtitle { font-size: 0.85rem; font-weight: 400; letter-spacing: 0; text-transform: none; color: var(--text-muted); margin-bottom: 20px; } [data-preset='kunsthalle'] .hero--mosaic .hero__nav { justify-content: flex-start; gap: 8px 24px; } [data-preset='kunsthalle'] .hero--mosaic .hero__nav-link { font-size: 0.85rem; letter-spacing: 0; text-transform: none; color: var(--text-secondary); } [data-preset='kunsthalle'] .hero--mosaic .hero__nav-link:hover { color: var(--accent-text, var(--accent)); border-bottom-color: var(--accent); } /* The other hero styles keep their own layout; only the type follows. */ [data-preset='kunsthalle'] .hero__nav-link { text-decoration-color: var(--border-hover); } /* ── Footer ───────────────────────────────────────── */ [data-preset='kunsthalle'] .footer { border-top-color: transparent; } @media (max-width: 640px) { [data-preset='kunsthalle'] .header__wordmark { display: none; } [data-preset='kunsthalle'] .photo-grid { --grid-gap: 44px; } [data-preset='kunsthalle'] .hero__mosaic-grid { gap: 16px; height: 72vh; height: 72svh; padding: 24px 20px 0; } [data-preset='kunsthalle'] .hero__mosaic-overlay { padding: 24px 20px 56px; } }