From 7663bcbcd0cb92e5cc92b80fe875a86ed9d67169 Mon Sep 17 00:00:00 2001 From: ralksta Date: Sun, 8 Mar 2026 22:57:38 +0100 Subject: [PATCH] refactor: extract individual layout themes from globals.css into modular app/themes/*.css architecture --- app/globals.css | 880 +-------------------------------------- app/themes/classic.css | 193 +++++++++ app/themes/editorial.css | 177 ++++++++ app/themes/minimal.css | 194 +++++++++ app/themes/monograph.css | 330 +++++++++++++++ app/themes/noir.css | 107 +++++ 6 files changed, 1009 insertions(+), 872 deletions(-) create mode 100644 app/themes/classic.css create mode 100644 app/themes/editorial.css create mode 100644 app/themes/minimal.css create mode 100644 app/themes/monograph.css create mode 100644 app/themes/noir.css diff --git a/app/globals.css b/app/globals.css index 6560094..7e5f5f2 100644 --- a/app/globals.css +++ b/app/globals.css @@ -1,3 +1,10 @@ +/* ── THEMES ── */ +@import url('./themes/minimal.css'); +@import url('./themes/editorial.css'); +@import url('./themes/classic.css'); +@import url('./themes/noir.css'); +@import url('./themes/monograph.css'); + @import url('./tokens.css'); /* ── Header / Navigation ──────────────────────────── */ @@ -1290,877 +1297,6 @@ color: var(--accent); } -/* ══════════════════════════════════════════════════════ - THEME: Minimal — Swiss Brutalist - ══════════════════════════════════════════════════════ */ - -/* Header: ultra-stripped, no border, just floating text */ -[data-preset='minimal'] .header { - border-bottom: none; - background: transparent; - backdrop-filter: none; - -webkit-backdrop-filter: none; -} - -[data-preset='minimal'] .header__nav-link { - font-size: 0.6rem; - font-weight: 400; - letter-spacing: 0.18em; - color: var(--text-muted); - border-bottom: none; -} - -[data-preset='minimal'] .header__nav-link:hover, -[data-preset='minimal'] .header__nav-link.active { - color: var(--text-primary); - border-bottom-color: transparent; -} - -/* Hero: fullbleed image, title overlaid bottom-left */ -[data-preset='minimal'] .hero { - grid-template-columns: 1fr; - position: relative; -} - -[data-preset='minimal'] .hero__left { - position: absolute; - bottom: 0; - left: 0; - z-index: 2; - padding: 32px 40px; - background: none; - align-items: flex-start; - justify-content: flex-end; -} - -[data-preset='minimal'] .hero__content { - text-align: left; -} - -[data-preset='minimal'] .hero__title { - font-family: var(--font-sans); - font-size: 0.7rem; - font-weight: 400; - letter-spacing: 0.2em; - text-transform: uppercase; - opacity: 0.6; -} - -[data-preset='minimal'] .hero__subtitle { - font-size: 0.6rem; - letter-spacing: 0.15em; - margin-bottom: 16px; - opacity: 0.4; -} - -[data-preset='minimal'] .hero__nav { - flex-direction: row; - gap: 16px; -} - -[data-preset='minimal'] .hero__nav-link { - font-size: 0.6rem; - letter-spacing: 0.15em; - text-transform: uppercase; - border-bottom: none; - opacity: 0.5; - transition: opacity var(--transition-fast); -} - -[data-preset='minimal'] .hero__nav-link:hover { - opacity: 1; - border-bottom-color: transparent; - color: var(--text-primary); -} - -[data-preset='minimal'] .hero__right { - grid-column: 1; - grid-row: 1; - height: 100vh; - height: 100svh; -} - -/* Photo grid: zero hover effects, clinical stillness */ -[data-preset='minimal'] .photo-grid { - column-gap: 2px; -} - -[data-preset='minimal'] .photo-grid__item { - margin-bottom: 2px; - border-radius: 0; - cursor: pointer; -} - -[data-preset='minimal'] .photo-grid__item:hover img { - filter: none; - transform: none; -} - -[data-preset='minimal'] .photo-grid__item:active img { - filter: brightness(0.8); - transform: none; -} - -/* Album cards: no overlay, text below */ -[data-preset='minimal'] .album-card { - border: none; - border-radius: 0; -} - -[data-preset='minimal'] .album-card:hover { - border-color: transparent; - transform: none; -} - -[data-preset='minimal'] .album-card:hover .album-card__image { - transform: none; - filter: none; -} - -[data-preset='minimal'] .album-card__overlay { - background: linear-gradient(to top, rgba(0, 0, 0, 0.4) 0%, transparent 30%); - opacity: 1; -} - -[data-preset='minimal'] .album-card__title { - font-family: var(--font-sans); - font-size: 0.7rem; - font-weight: 400; - letter-spacing: 0.15em; - text-transform: uppercase; -} - -[data-preset='minimal'] .album-card__count { - font-size: 0.6rem; - font-weight: 400; - letter-spacing: 0.1em; -} - -/* Section labels: numbered indices */ -[data-preset='minimal'] .section-label { - font-size: 0.6rem; - letter-spacing: 0.2em; - color: var(--text-muted); -} - -/* Footer: single line, ultra-minimal */ -[data-preset='minimal'] .footer { - border-top: none; -} - -[data-preset='minimal'] .footer__name { - font-size: 0.6rem; - letter-spacing: 0.15em; -} - -/* Album & Subpage header */ -[data-preset='minimal'] .album-header__title, -[data-preset='minimal'] .subpage-title { - font-family: var(--font-sans); - font-size: 0.85rem; - letter-spacing: 0.2em; - text-transform: uppercase; - font-weight: 400; -} - -[data-preset='minimal'] .album-header__meta, -[data-preset='minimal'] .subpage-subtitle { - font-size: 0.7rem; - letter-spacing: 0.1em; -} - -/* Subpage grid */ -[data-preset='minimal'] .subpage-grid { - gap: 2px; -} - -[data-preset='minimal'] .subpage-grid__item { - border: none; -} - -[data-preset='minimal'] .subpage-grid__item-title { - font-family: var(--font-sans); - font-size: 0.75rem; - letter-spacing: 0.12em; - text-transform: uppercase; -} - -/* ══════════════════════════════════════════════════════ - THEME: Editorial — Cinematic Magazine - ══════════════════════════════════════════════════════ */ - -/* Header: transparent, magazine masthead feel */ -[data-preset='editorial'] .header { - background: transparent; - backdrop-filter: none; - -webkit-backdrop-filter: none; - border-bottom: 1px solid var(--border-subtle); -} - -[data-preset='editorial'] .header__nav-link { - font-family: var(--font-sans); - font-size: 0.65rem; - font-weight: 400; - letter-spacing: 0.18em; -} - -/* Hero: dramatic oversized serif title */ -[data-preset='editorial'] .hero__title { - font-size: 4.5rem; - font-weight: 300; - letter-spacing: 0.02em; - text-transform: none; - line-height: 1; -} - -[data-preset='editorial'] .hero__subtitle { - font-family: var(--font-caption); - font-size: 0.9rem; - font-weight: 400; - letter-spacing: 0.08em; - text-transform: none; - font-style: italic; - margin-bottom: 48px; - opacity: 0.7; -} - -[data-preset='editorial'] .hero__nav-link { - font-family: var(--font-caption); - font-size: 0.8rem; - font-style: italic; - font-weight: 400; - letter-spacing: 0.06em; - text-transform: none; - border-bottom: none; -} - -[data-preset='editorial'] .hero__nav-link:hover { - color: var(--accent); - border-bottom-color: transparent; -} - -/* Photo grid: generous spacing, cinematic transitions */ -[data-preset='editorial'] .photo-grid { - column-gap: 32px; -} - -[data-preset='editorial'] .photo-grid__item { - margin-bottom: 32px; -} - -[data-preset='editorial'] .photo-grid__item img { - transition: - filter 1.5s ease, - transform 1.5s ease; - filter: saturate(0.7) brightness(0.95); -} - -[data-preset='editorial'] .photo-grid__item:hover img { - filter: saturate(1) brightness(1); - transform: scale(1.01); -} - -/* Album cards: text below, editorial layout */ -[data-preset='editorial'] .album-card { - border: none; - border-radius: 0; - aspect-ratio: 16 / 9; -} - -[data-preset='editorial'] .album-card:hover { - transform: none; - border-color: transparent; -} - -[data-preset='editorial'] .album-card__overlay { - justify-content: flex-start; - padding: 28px; - background: linear-gradient(to bottom, rgba(0, 0, 0, 0.5) 0%, transparent 40%); -} - -[data-preset='editorial'] .album-card__title { - font-size: 2rem; - font-weight: 300; - letter-spacing: 0.02em; - text-transform: none; -} - -[data-preset='editorial'] .album-card__count { - font-family: var(--font-caption); - font-style: italic; - font-size: 0.8rem; -} - -[data-preset='editorial'] .album-card:hover .album-card__image { - transform: scale(1.015); - filter: brightness(0.8); - transition: - transform 1.5s ease, - filter 1.5s ease; -} - -/* Section labels: pull-quote style with left border */ -[data-preset='editorial'] .section-label { - font-family: var(--font-caption); - font-size: 0.8rem; - font-style: italic; - font-weight: 400; - letter-spacing: 0.08em; - text-transform: none; - color: var(--text-secondary); - padding-left: 16px; - border-left: 2px solid var(--accent); -} - -/* Album header: large cinematic title */ -[data-preset='editorial'] .album-header__title { - font-size: 3rem; - font-weight: 300; - letter-spacing: 0.02em; - text-transform: none; -} - -/* Album & Subpage Header overrides */ -[data-preset='editorial'] .album-header__title, -[data-preset='editorial'] .subpage-title { - font-family: var(--font-serif); - font-size: 5rem; - font-weight: 400; - letter-spacing: -0.02em; -} - -[data-preset='editorial'] .album-header__meta, -[data-preset='editorial'] .subpage-subtitle { - font-family: var(--font-sans); - font-size: 0.8rem; - letter-spacing: 0.1em; - text-transform: uppercase; -} - -/* Footer: centered italic attribution */ -[data-preset='editorial'] .footer__name { - font-family: var(--font-caption); - font-style: italic; - text-transform: none; - letter-spacing: 0.06em; - font-size: 0.8rem; -} - -/* Subpage grid */ -[data-preset='editorial'] .subpage-grid { - gap: 2px; -} - -[data-preset='editorial'] .subpage-grid__item { - border: none; - aspect-ratio: 16 / 9; -} - -[data-preset='editorial'] .subpage-grid__item-title { - font-size: 1.4rem; - letter-spacing: 0.02em; - font-weight: 300; - text-transform: none; -} - -/* ══════════════════════════════════════════════════════ - THEME: Classic — Gilded Gallery - ══════════════════════════════════════════════════════ */ - -/* Header: centered nav with gold accent */ -[data-preset='classic'] .header { - background: rgba(18, 18, 16, 0.92); - border-bottom: 1px solid rgba(196, 154, 60, 0.15); -} - -[data-preset='classic'][data-theme='light'] .header { - background: rgba(253, 251, 245, 0.92); -} - -[data-preset='classic'] .header__nav { - justify-content: center; -} - -[data-preset='classic'] .header__nav-link { - font-size: 0.7rem; - font-weight: 400; - letter-spacing: 0.14em; - padding: 20px 18px; -} - -/* Hero: elegant centered card above banner */ -[data-preset='classic'] .hero__left { - padding: 80px 48px; -} - -[data-preset='classic'] .hero__title { - font-size: 2.8rem; - font-weight: 400; - letter-spacing: 0.12em; - text-transform: uppercase; - line-height: 1.2; -} - -[data-preset='classic'] .hero__subtitle { - font-family: var(--font-caption); - font-size: 0.85rem; - font-weight: 400; - letter-spacing: 0.15em; - font-style: italic; - margin-bottom: 12px; -} - -/* Decorative ornament beneath subtitle */ -[data-preset='classic'] .hero__subtitle::after { - content: '◆'; - display: block; - margin-top: 20px; - font-size: 0.5rem; - color: var(--accent); - letter-spacing: 0; -} - -[data-preset='classic'] .hero__nav-link { - font-family: var(--font-caption); - font-size: 0.8rem; - font-weight: 400; - letter-spacing: 0.1em; - font-style: italic; - text-transform: none; - border-bottom: none; -} - -[data-preset='classic'] .hero__nav-link:hover { - color: var(--accent); - border-bottom-color: transparent; -} - -/* Photo grid: warm passepartout, elegant hover */ -[data-preset='classic'] .photo-grid { - column-gap: var(--grid-gap, 20px); -} - -[data-preset='classic'] .photo-grid__item { - margin-bottom: var(--grid-gap, 20px); -} - -[data-preset='classic'] .photo-grid__item:hover img { - filter: brightness(0.9); - transform: scale(1.01); -} - -/* Warm passepartout override */ -[data-preset='classic'][data-photo-frame='passepartout'] .photo-grid__item { - background: #1a1816; - border-color: rgba(196, 154, 60, 0.12); -} - -[data-preset='classic'][data-photo-frame='passepartout'][data-theme='light'] .photo-grid__item { - background: #fffdf5; - border-color: rgba(196, 154, 60, 0.2); -} - -/* Album cards: warm rounded, gold hover */ -[data-preset='classic'] .album-card { - border-radius: 12px; - border: 1px solid rgba(196, 154, 60, 0.1); - box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2); -} - -[data-preset='classic'][data-theme='light'] .album-card { - box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08); - border-color: rgba(196, 154, 60, 0.15); -} - -[data-preset='classic'] .album-card:hover { - border-color: var(--accent); - transform: translateY(-3px); - box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3); -} - -[data-preset='classic'] .album-card__title { - font-weight: 400; - letter-spacing: 0.06em; -} - -[data-preset='classic'] .album-card__count { - font-family: var(--font-caption); - font-style: italic; -} - -/* Section labels: decorative centered dividers */ -[data-preset='classic'] .section-label { - text-align: center; - font-family: var(--font-caption); - font-weight: 400; - letter-spacing: 0.25em; - font-size: 0.7rem; - color: var(--text-muted); -} - -[data-preset='classic'] .section-label::before { - content: '— '; - color: var(--accent); -} - -[data-preset='classic'] .section-label::after { - content: ' —'; - color: var(--accent); -} - -/* Album & Subpage header: elegant serif */ -[data-preset='classic'] .album-header__title, -[data-preset='classic'] .subpage-title { - font-weight: 400; - letter-spacing: 0.1em; - font-size: 2.2rem; -} - -[data-preset='classic'] .album-header__meta, -[data-preset='classic'] .subpage-subtitle { - font-family: var(--font-caption); - font-style: italic; -} - -/* Footer: ornamental */ -[data-preset='classic'] .footer { - border-top: 1px solid rgba(196, 154, 60, 0.15); -} - -[data-preset='classic'] .footer__name { - font-family: var(--font-caption); - font-style: italic; - text-transform: none; - letter-spacing: 0.08em; - font-size: 0.8rem; -} - -/* Scroll-to-top: gold border */ -[data-preset='classic'] .scroll-to-top { - border-radius: 12px; -} - -[data-preset='classic'] .scroll-to-top:hover { - border-color: var(--accent); - color: var(--accent); -} - -/* Subpage grid: warm borders */ -[data-preset='classic'] .subpage-grid__item { - border: 1px solid rgba(196, 154, 60, 0.1); - border-radius: 8px; - overflow: hidden; -} - -[data-preset='classic'] .subpage-grid__item-title { - font-weight: 400; - letter-spacing: 0.06em; -} - -/* ══════════════════════════════════════════════════════ - THEME: Noir — Darkroom Analog - ══════════════════════════════════════════════════════ */ - -/* Header: transparent with subtle warm border */ -[data-preset='noir'] .header { - background: transparent; - backdrop-filter: none; - -webkit-backdrop-filter: none; - border-bottom: 1px solid rgba(255, 107, 53, 0.1); -} - -[data-preset='noir'] .header__nav-link { - font-size: 0.65rem; - font-weight: 400; - letter-spacing: 0.15em; -} - -/* Photo grid: warm analog feel */ -[data-preset='noir'] .photo-grid__item img { - filter: sepia(0.08) contrast(1.02); - transition: - filter 0.8s ease, - transform 0.8s ease, - box-shadow 0.8s ease; -} - -[data-preset='noir'] .photo-grid__item:hover img { - filter: sepia(0) contrast(1) brightness(0.88); - transform: scale(1.01); -} - -/* Vignette hover effect */ -[data-preset='noir'] .photo-grid__item::before { - content: ''; - position: absolute; - inset: 0; - z-index: 1; - box-shadow: inset 0 0 60px rgba(0, 0, 0, 0); - pointer-events: none; - transition: box-shadow 0.8s ease; -} - -[data-preset='noir'] .photo-grid__item:hover::before { - box-shadow: inset 0 0 60px rgba(0, 0, 0, 0.4); -} - -/* Film-edge EXIF labels */ -[data-preset='noir'] .photo-grid__item-exif { - font-family: var(--font-caption); - font-size: 0.6rem; - letter-spacing: 0.08em; - text-transform: uppercase; - color: rgba(255, 200, 150, 0.7); -} - -/* Album cards */ -[data-preset='noir'] .album-card { - border: none; - border-radius: 0; -} - -[data-preset='noir'] .album-card:hover { - transform: none; - border-color: transparent; -} - -[data-preset='noir'] .album-card__title { - font-weight: 400; - letter-spacing: 0.04em; -} - -/* Section labels */ -[data-preset='noir'] .section-label { - font-family: var(--font-caption); - font-size: 0.6rem; - letter-spacing: 0.15em; - text-transform: uppercase; -} - -/* Album & Subpage header */ -[data-preset='noir'] .album-header__title, -[data-preset='noir'] .subpage-title { - font-weight: 300; - letter-spacing: 0.04em; -} - -/* Footer */ -[data-preset='noir'] .footer { - border-top: 1px solid rgba(255, 107, 53, 0.1); -} - -[data-preset='noir'] .footer__name { - font-family: var(--font-caption); - font-size: 0.65rem; - letter-spacing: 0.12em; -} - -/* Subpage grid */ -[data-preset='noir'] .subpage-grid__item { - border: none; -} - -[data-preset='noir'] .subpage-grid__item-title { - font-weight: 400; - letter-spacing: 0.05em; -} - -/* ══════════════════════════════════════════════════════ - THEME: Monograph — Typographic / Book - ══════════════════════════════════════════════════════ */ - -/* Header: thin hairline border, centered */ -[data-preset='monograph'] .header { - background: transparent; - backdrop-filter: none; - -webkit-backdrop-filter: none; - border-bottom: 1px solid var(--border-subtle); -} - -[data-preset='monograph'] .header__nav { - justify-content: center; -} - -[data-preset='monograph'] .header__nav-link { - font-size: 0.6rem; - font-weight: 400; - letter-spacing: 0.2em; - color: var(--text-muted); -} - -[data-preset='monograph'] .header__nav-link:hover, -[data-preset='monograph'] .header__nav-link.active { - color: var(--text-primary); - border-bottom-color: var(--text-primary); -} - -/* Photo grid: numbered indices with CSS counter */ -[data-preset='monograph'] .photo-grid { - counter-reset: photo-index; - column-gap: 40px; -} - -[data-preset='monograph'] .photo-grid__item { - counter-increment: photo-index; - margin-bottom: 48px; -} - -[data-preset='monograph'] .photo-grid__item::before { - content: counter(photo-index, decimal-leading-zero); - position: absolute; - top: -28px; - left: 0; - font-family: var(--font-caption); - font-size: 0.65rem; - font-weight: 400; - letter-spacing: 0.1em; - color: var(--text-muted); - z-index: 2; - pointer-events: none; -} - -[data-preset='monograph'] .photo-grid__item:hover img { - filter: none; - transform: none; -} - -[data-preset='monograph'] .photo-grid__item:active img { - filter: brightness(0.85); - transform: none; -} - -/* Caption slide-up on hover */ -[data-preset='monograph'] .photo-grid__item-exif { - position: absolute; - bottom: 0; - left: 0; - right: 0; - background: var(--bg-card); - color: var(--text-secondary); - font-family: var(--font-caption); - font-size: 0.65rem; - letter-spacing: 0.05em; - padding: 10px 12px; - opacity: 0; - transform: translateY(100%); - transition: - opacity 0.4s ease, - transform 0.4s ease; -} - -[data-preset='monograph'] .photo-grid__item:hover .photo-grid__item-exif { - opacity: 1; - transform: translateY(0); -} - -/* Album cards: minimal text below */ -[data-preset='monograph'] .album-card { - border: 1px solid var(--border-subtle); - border-radius: 0; -} - -[data-preset='monograph'] .album-card:hover { - border-color: var(--text-primary); - transform: none; -} - -[data-preset='monograph'] .album-card:hover .album-card__image { - transform: none; - filter: none; -} - -[data-preset='monograph'] .album-card__overlay { - background: linear-gradient(to top, rgba(0, 0, 0, 0.4) 0%, transparent 30%); - opacity: 1; -} - -[data-preset='monograph'] .album-card__title { - font-family: var(--font-sans); - font-size: 0.75rem; - font-weight: 400; - letter-spacing: 0.12em; - text-transform: uppercase; -} - -[data-preset='monograph'] .album-card__count { - font-family: var(--font-caption); - font-size: 0.6rem; - letter-spacing: 0.08em; -} - -/* Section labels: thin hairline rule */ -[data-preset='monograph'] .section-label { - font-family: var(--font-sans); - font-size: 0.6rem; - letter-spacing: 0.2em; - color: var(--text-muted); - padding-bottom: 12px; - border-bottom: 1px solid var(--border-subtle); -} - -/* Album & Subpage header: large serif with wide spacing */ -[data-preset='monograph'] .album-header { - margin-bottom: 72px; -} - -[data-preset='monograph'] .album-header__title, -[data-preset='monograph'] .subpage-title { - font-family: var(--font-serif); - font-size: 3rem; - font-weight: 400; - letter-spacing: 0.02em; - text-transform: none; -} - -[data-preset='monograph'] .album-header__meta, -[data-preset='monograph'] .subpage-subtitle { - font-family: var(--font-caption); - font-size: 0.75rem; - letter-spacing: 0.05em; - margin-top: 12px; -} - -/* Footer */ -[data-preset='monograph'] .footer { - border-top: 1px solid var(--border-subtle); -} - -[data-preset='monograph'] .footer__name { - font-size: 0.6rem; - letter-spacing: 0.15em; -} - -/* Main: extra generous margins */ -[data-preset='monograph']~body .main { - padding: 80px 60px 120px; -} - -/* Subpage grid */ -[data-preset='monograph'] .subpage-grid { - gap: 1px; -} - -[data-preset='monograph'] .subpage-grid__item { - border: 1px solid var(--border-subtle); -} - -[data-preset='monograph'] .subpage-grid__item-title { - font-family: var(--font-sans); - font-size: 0.7rem; - letter-spacing: 0.15em; - text-transform: uppercase; -} - -@media (max-width: 1024px) { - .photo-grid { - --grid-columns: 2; - } - - .album-grid { - grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); - } -} - @media (max-width: 640px) { .hero { grid-template-columns: 1fr; @@ -2294,4 +1430,4 @@ [data-preset='monograph'] .album-header__title { font-size: 2rem; } -} \ No newline at end of file +} diff --git a/app/themes/classic.css b/app/themes/classic.css new file mode 100644 index 0000000..486b154 --- /dev/null +++ b/app/themes/classic.css @@ -0,0 +1,193 @@ +/* ══════════════════════════════════════════════════════ + THEME: Classic — Gilded Gallery + ══════════════════════════════════════════════════════ */ + +/* Header: centered nav with gold accent */ +[data-preset='classic'] .header { + background: rgba(18, 18, 16, 0.92); + border-bottom: 1px solid rgba(196, 154, 60, 0.15); +} + +[data-preset='classic'][data-theme='light'] .header { + background: rgba(253, 251, 245, 0.92); +} + +[data-preset='classic'] .header__nav { + justify-content: center; +} + +[data-preset='classic'] .header__nav-link { + font-size: 0.7rem; + font-weight: 400; + letter-spacing: 0.14em; + padding: 20px 18px; +} + +/* Hero: elegant centered card above banner */ +[data-preset='classic'] .hero__left { + padding: 80px 48px; +} + +[data-preset='classic'] .hero__title { + font-size: 2.8rem; + font-weight: 400; + letter-spacing: 0.12em; + text-transform: uppercase; + line-height: 1.2; +} + +[data-preset='classic'] .hero__subtitle { + font-family: var(--font-caption); + font-size: 0.85rem; + font-weight: 400; + letter-spacing: 0.15em; + font-style: italic; + margin-bottom: 12px; +} + +/* Decorative ornament beneath subtitle */ +[data-preset='classic'] .hero__subtitle::after { + content: '◆'; + display: block; + margin-top: 20px; + font-size: 0.5rem; + color: var(--accent); + letter-spacing: 0; +} + +[data-preset='classic'] .hero__nav-link { + font-family: var(--font-caption); + font-size: 0.8rem; + font-weight: 400; + letter-spacing: 0.1em; + font-style: italic; + text-transform: none; + border-bottom: none; +} + +[data-preset='classic'] .hero__nav-link:hover { + color: var(--accent); + border-bottom-color: transparent; +} + +/* Photo grid: warm passepartout, elegant hover */ +[data-preset='classic'] .photo-grid { + column-gap: var(--grid-gap, 20px); +} + +[data-preset='classic'] .photo-grid__item { + margin-bottom: var(--grid-gap, 20px); +} + +[data-preset='classic'] .photo-grid__item:hover img { + filter: brightness(0.9); + transform: scale(1.01); +} + +/* Warm passepartout override */ +[data-preset='classic'][data-photo-frame='passepartout'] .photo-grid__item { + background: #1a1816; + border-color: rgba(196, 154, 60, 0.12); +} + +[data-preset='classic'][data-photo-frame='passepartout'][data-theme='light'] .photo-grid__item { + background: #fffdf5; + border-color: rgba(196, 154, 60, 0.2); +} + +/* Album cards: warm rounded, gold hover */ +[data-preset='classic'] .album-card { + border-radius: 12px; + border: 1px solid rgba(196, 154, 60, 0.1); + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2); +} + +[data-preset='classic'][data-theme='light'] .album-card { + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08); + border-color: rgba(196, 154, 60, 0.15); +} + +[data-preset='classic'] .album-card:hover { + border-color: var(--accent); + transform: translateY(-3px); + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3); +} + +[data-preset='classic'] .album-card__title { + font-weight: 400; + letter-spacing: 0.06em; +} + +[data-preset='classic'] .album-card__count { + font-family: var(--font-caption); + font-style: italic; +} + +/* Section labels: decorative centered dividers */ +[data-preset='classic'] .section-label { + text-align: center; + font-family: var(--font-caption); + font-weight: 400; + letter-spacing: 0.25em; + font-size: 0.7rem; + color: var(--text-muted); +} + +[data-preset='classic'] .section-label::before { + content: '— '; + color: var(--accent); +} + +[data-preset='classic'] .section-label::after { + content: ' —'; + color: var(--accent); +} + +/* Album & Subpage header: elegant serif */ +[data-preset='classic'] .album-header__title, +[data-preset='classic'] .subpage-title { + font-weight: 400; + letter-spacing: 0.1em; + font-size: 2.2rem; +} + +[data-preset='classic'] .album-header__meta, +[data-preset='classic'] .subpage-subtitle { + font-family: var(--font-caption); + font-style: italic; +} + +/* Footer: ornamental */ +[data-preset='classic'] .footer { + border-top: 1px solid rgba(196, 154, 60, 0.15); +} + +[data-preset='classic'] .footer__name { + font-family: var(--font-caption); + font-style: italic; + text-transform: none; + letter-spacing: 0.08em; + font-size: 0.8rem; +} + +/* Scroll-to-top: gold border */ +[data-preset='classic'] .scroll-to-top { + border-radius: 12px; +} + +[data-preset='classic'] .scroll-to-top:hover { + border-color: var(--accent); + color: var(--accent); +} + +/* Subpage grid: warm borders */ +[data-preset='classic'] .subpage-grid__item { + border: 1px solid rgba(196, 154, 60, 0.1); + border-radius: 8px; + overflow: hidden; +} + +[data-preset='classic'] .subpage-grid__item-title { + font-weight: 400; + letter-spacing: 0.06em; +} diff --git a/app/themes/editorial.css b/app/themes/editorial.css new file mode 100644 index 0000000..0a13307 --- /dev/null +++ b/app/themes/editorial.css @@ -0,0 +1,177 @@ +/* ══════════════════════════════════════════════════════ + THEME: Editorial — Cinematic Magazine + ══════════════════════════════════════════════════════ */ + +/* Header: transparent, magazine masthead feel */ +[data-preset='editorial'] .header { + background: transparent; + backdrop-filter: none; + -webkit-backdrop-filter: none; + border-bottom: 1px solid var(--border-subtle); +} + +[data-preset='editorial'] .header__nav-link { + font-family: var(--font-sans); + font-size: 0.65rem; + font-weight: 400; + letter-spacing: 0.18em; +} + +/* Hero: dramatic oversized serif title */ +[data-preset='editorial'] .hero__title { + font-size: 4.5rem; + font-weight: 300; + letter-spacing: 0.02em; + text-transform: none; + line-height: 1; +} + +[data-preset='editorial'] .hero__subtitle { + font-family: var(--font-caption); + font-size: 0.9rem; + font-weight: 400; + letter-spacing: 0.08em; + text-transform: none; + font-style: italic; + margin-bottom: 48px; + opacity: 0.7; +} + +[data-preset='editorial'] .hero__nav-link { + font-family: var(--font-caption); + font-size: 0.8rem; + font-style: italic; + font-weight: 400; + letter-spacing: 0.06em; + text-transform: none; + border-bottom: none; +} + +[data-preset='editorial'] .hero__nav-link:hover { + color: var(--accent); + border-bottom-color: transparent; +} + +/* Photo grid: generous spacing, cinematic transitions */ +[data-preset='editorial'] .photo-grid { + column-gap: 32px; +} + +[data-preset='editorial'] .photo-grid__item { + margin-bottom: 32px; +} + +[data-preset='editorial'] .photo-grid__item img { + transition: + filter 1.5s ease, + transform 1.5s ease; + filter: saturate(0.7) brightness(0.95); +} + +[data-preset='editorial'] .photo-grid__item:hover img { + filter: saturate(1) brightness(1); + transform: scale(1.01); +} + +/* Album cards: text below, editorial layout */ +[data-preset='editorial'] .album-card { + border: none; + border-radius: 0; + aspect-ratio: 16 / 9; +} + +[data-preset='editorial'] .album-card:hover { + transform: none; + border-color: transparent; +} + +[data-preset='editorial'] .album-card__overlay { + justify-content: flex-start; + padding: 28px; + background: linear-gradient(to bottom, rgba(0, 0, 0, 0.5) 0%, transparent 40%); +} + +[data-preset='editorial'] .album-card__title { + font-size: 2rem; + font-weight: 300; + letter-spacing: 0.02em; + text-transform: none; +} + +[data-preset='editorial'] .album-card__count { + font-family: var(--font-caption); + font-style: italic; + font-size: 0.8rem; +} + +[data-preset='editorial'] .album-card:hover .album-card__image { + transform: scale(1.015); + filter: brightness(0.8); + transition: + transform 1.5s ease, + filter 1.5s ease; +} + +/* Section labels: pull-quote style with left border */ +[data-preset='editorial'] .section-label { + font-family: var(--font-caption); + font-size: 0.8rem; + font-style: italic; + font-weight: 400; + letter-spacing: 0.08em; + text-transform: none; + color: var(--text-secondary); + padding-left: 16px; + border-left: 2px solid var(--accent); +} + +/* Album header: large cinematic title */ +[data-preset='editorial'] .album-header__title { + font-size: 3rem; + font-weight: 300; + letter-spacing: 0.02em; + text-transform: none; +} + +/* Album & Subpage Header overrides */ +[data-preset='editorial'] .album-header__title, +[data-preset='editorial'] .subpage-title { + font-family: var(--font-serif); + font-size: 5rem; + font-weight: 400; + letter-spacing: -0.02em; +} + +[data-preset='editorial'] .album-header__meta, +[data-preset='editorial'] .subpage-subtitle { + font-family: var(--font-sans); + font-size: 0.8rem; + letter-spacing: 0.1em; + text-transform: uppercase; +} + +/* Footer: centered italic attribution */ +[data-preset='editorial'] .footer__name { + font-family: var(--font-caption); + font-style: italic; + text-transform: none; + letter-spacing: 0.06em; + font-size: 0.8rem; +} + +/* Subpage grid */ +[data-preset='editorial'] .subpage-grid { + gap: 2px; +} + +[data-preset='editorial'] .subpage-grid__item { + border: none; + aspect-ratio: 16 / 9; +} + +[data-preset='editorial'] .subpage-grid__item-title { + font-size: 1.4rem; + letter-spacing: 0.02em; + font-weight: 300; + text-transform: none; +} diff --git a/app/themes/minimal.css b/app/themes/minimal.css new file mode 100644 index 0000000..0d6b6d1 --- /dev/null +++ b/app/themes/minimal.css @@ -0,0 +1,194 @@ +/* ══════════════════════════════════════════════════════ + THEME: Minimal — Swiss Brutalist + ══════════════════════════════════════════════════════ */ + +/* Header: ultra-stripped, no border, just floating text */ +[data-preset='minimal'] .header { + border-bottom: none; + background: transparent; + backdrop-filter: none; + -webkit-backdrop-filter: none; +} + +[data-preset='minimal'] .header__nav-link { + font-size: 0.6rem; + font-weight: 400; + letter-spacing: 0.18em; + color: var(--text-muted); + border-bottom: none; +} + +[data-preset='minimal'] .header__nav-link:hover, +[data-preset='minimal'] .header__nav-link.active { + color: var(--text-primary); + border-bottom-color: transparent; +} + +/* Hero: fullbleed image, title overlaid bottom-left */ +[data-preset='minimal'] .hero { + grid-template-columns: 1fr; + position: relative; +} + +[data-preset='minimal'] .hero__left { + position: absolute; + bottom: 0; + left: 0; + z-index: 2; + padding: 32px 40px; + background: none; + align-items: flex-start; + justify-content: flex-end; +} + +[data-preset='minimal'] .hero__content { + text-align: left; +} + +[data-preset='minimal'] .hero__title { + font-family: var(--font-sans); + font-size: 0.7rem; + font-weight: 400; + letter-spacing: 0.2em; + text-transform: uppercase; + opacity: 0.6; +} + +[data-preset='minimal'] .hero__subtitle { + font-size: 0.6rem; + letter-spacing: 0.15em; + margin-bottom: 16px; + opacity: 0.4; +} + +[data-preset='minimal'] .hero__nav { + flex-direction: row; + gap: 16px; +} + +[data-preset='minimal'] .hero__nav-link { + font-size: 0.6rem; + letter-spacing: 0.15em; + text-transform: uppercase; + border-bottom: none; + opacity: 0.5; + transition: opacity var(--transition-fast); +} + +[data-preset='minimal'] .hero__nav-link:hover { + opacity: 1; + border-bottom-color: transparent; + color: var(--text-primary); +} + +[data-preset='minimal'] .hero__right { + grid-column: 1; + grid-row: 1; + height: 100vh; + height: 100svh; +} + +/* Photo grid: zero hover effects, clinical stillness */ +[data-preset='minimal'] .photo-grid { + column-gap: 2px; +} + +[data-preset='minimal'] .photo-grid__item { + margin-bottom: 2px; + border-radius: 0; + cursor: pointer; +} + +[data-preset='minimal'] .photo-grid__item:hover img { + filter: none; + transform: none; +} + +[data-preset='minimal'] .photo-grid__item:active img { + filter: brightness(0.8); + transform: none; +} + +/* Album cards: no overlay, text below */ +[data-preset='minimal'] .album-card { + border: none; + border-radius: 0; +} + +[data-preset='minimal'] .album-card:hover { + border-color: transparent; + transform: none; +} + +[data-preset='minimal'] .album-card:hover .album-card__image { + transform: none; + filter: none; +} + +[data-preset='minimal'] .album-card__overlay { + background: linear-gradient(to top, rgba(0, 0, 0, 0.4) 0%, transparent 30%); + opacity: 1; +} + +[data-preset='minimal'] .album-card__title { + font-family: var(--font-sans); + font-size: 0.7rem; + font-weight: 400; + letter-spacing: 0.15em; + text-transform: uppercase; +} + +[data-preset='minimal'] .album-card__count { + font-size: 0.6rem; + font-weight: 400; + letter-spacing: 0.1em; +} + +/* Section labels: numbered indices */ +[data-preset='minimal'] .section-label { + font-size: 0.6rem; + letter-spacing: 0.2em; + color: var(--text-muted); +} + +/* Footer: single line, ultra-minimal */ +[data-preset='minimal'] .footer { + border-top: none; +} + +[data-preset='minimal'] .footer__name { + font-size: 0.6rem; + letter-spacing: 0.15em; +} + +/* Album & Subpage header */ +[data-preset='minimal'] .album-header__title, +[data-preset='minimal'] .subpage-title { + font-family: var(--font-sans); + font-size: 0.85rem; + letter-spacing: 0.2em; + text-transform: uppercase; + font-weight: 400; +} + +[data-preset='minimal'] .album-header__meta, +[data-preset='minimal'] .subpage-subtitle { + font-size: 0.7rem; + letter-spacing: 0.1em; +} + +/* Subpage grid */ +[data-preset='minimal'] .subpage-grid { + gap: 2px; +} + +[data-preset='minimal'] .subpage-grid__item { + border: none; +} + +[data-preset='minimal'] .subpage-grid__item-title { + font-family: var(--font-sans); + font-size: 0.75rem; + letter-spacing: 0.12em; + text-transform: uppercase; +} diff --git a/app/themes/monograph.css b/app/themes/monograph.css new file mode 100644 index 0000000..92e882f --- /dev/null +++ b/app/themes/monograph.css @@ -0,0 +1,330 @@ +/* ══════════════════════════════════════════════════════ + THEME: Monograph — Typographic / Book + ══════════════════════════════════════════════════════ */ + +/* Header: thin hairline border, centered */ +[data-preset='monograph'] .header { + background: transparent; + backdrop-filter: none; + -webkit-backdrop-filter: none; + border-bottom: 1px solid var(--border-subtle); +} + +[data-preset='monograph'] .header__nav { + justify-content: center; +} + +[data-preset='monograph'] .header__nav-link { + font-size: 0.6rem; + font-weight: 400; + letter-spacing: 0.2em; + color: var(--text-muted); +} + +[data-preset='monograph'] .header__nav-link:hover, +[data-preset='monograph'] .header__nav-link.active { + color: var(--text-primary); + border-bottom-color: var(--text-primary); +} + +/* Photo grid: numbered indices with CSS counter */ +[data-preset='monograph'] .photo-grid { + counter-reset: photo-index; + column-gap: 40px; +} + +[data-preset='monograph'] .photo-grid__item { + counter-increment: photo-index; + margin-bottom: 48px; +} + +[data-preset='monograph'] .photo-grid__item::before { + content: counter(photo-index, decimal-leading-zero); + position: absolute; + top: -28px; + left: 0; + font-family: var(--font-caption); + font-size: 0.65rem; + font-weight: 400; + letter-spacing: 0.1em; + color: var(--text-muted); + z-index: 2; + pointer-events: none; +} + +[data-preset='monograph'] .photo-grid__item:hover img { + filter: none; + transform: none; +} + +[data-preset='monograph'] .photo-grid__item:active img { + filter: brightness(0.85); + transform: none; +} + +/* Caption slide-up on hover */ +[data-preset='monograph'] .photo-grid__item-exif { + position: absolute; + bottom: 0; + left: 0; + right: 0; + background: var(--bg-card); + color: var(--text-secondary); + font-family: var(--font-caption); + font-size: 0.65rem; + letter-spacing: 0.05em; + padding: 10px 12px; + opacity: 0; + transform: translateY(100%); + transition: + opacity 0.4s ease, + transform 0.4s ease; +} + +[data-preset='monograph'] .photo-grid__item:hover .photo-grid__item-exif { + opacity: 1; + transform: translateY(0); +} + +/* Album cards: minimal text below */ +[data-preset='monograph'] .album-card { + border: 1px solid var(--border-subtle); + border-radius: 0; +} + +[data-preset='monograph'] .album-card:hover { + border-color: var(--text-primary); + transform: none; +} + +[data-preset='monograph'] .album-card:hover .album-card__image { + transform: none; + filter: none; +} + +[data-preset='monograph'] .album-card__overlay { + background: linear-gradient(to top, rgba(0, 0, 0, 0.4) 0%, transparent 30%); + opacity: 1; +} + +[data-preset='monograph'] .album-card__title { + font-family: var(--font-sans); + font-size: 0.75rem; + font-weight: 400; + letter-spacing: 0.12em; + text-transform: uppercase; +} + +[data-preset='monograph'] .album-card__count { + font-family: var(--font-caption); + font-size: 0.6rem; + letter-spacing: 0.08em; +} + +/* Section labels: thin hairline rule */ +[data-preset='monograph'] .section-label { + font-family: var(--font-sans); + font-size: 0.6rem; + letter-spacing: 0.2em; + color: var(--text-muted); + padding-bottom: 12px; + border-bottom: 1px solid var(--border-subtle); +} + +/* Album & Subpage header: large serif with wide spacing */ +[data-preset='monograph'] .album-header { + margin-bottom: 72px; +} + +[data-preset='monograph'] .album-header__title, +[data-preset='monograph'] .subpage-title { + font-family: var(--font-serif); + font-size: 3rem; + font-weight: 400; + letter-spacing: 0.02em; + text-transform: none; +} + +[data-preset='monograph'] .album-header__meta, +[data-preset='monograph'] .subpage-subtitle { + font-family: var(--font-caption); + font-size: 0.75rem; + letter-spacing: 0.05em; + margin-top: 12px; +} + +/* Footer */ +[data-preset='monograph'] .footer { + border-top: 1px solid var(--border-subtle); +} + +[data-preset='monograph'] .footer__name { + font-size: 0.6rem; + letter-spacing: 0.15em; +} + +/* Main: extra generous margins */ +[data-preset='monograph']~body .main { + padding: 80px 60px 120px; +} + +/* Subpage grid */ +[data-preset='monograph'] .subpage-grid { + gap: 1px; +} + +[data-preset='monograph'] .subpage-grid__item { + border: 1px solid var(--border-subtle); +} + +[data-preset='monograph'] .subpage-grid__item-title { + font-family: var(--font-sans); + font-size: 0.7rem; + letter-spacing: 0.15em; + text-transform: uppercase; +} + +@media (max-width: 1024px) { + .photo-grid { + --grid-columns: 2; + } + + .album-grid { + grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); + } +} + +@media (max-width: 640px) { + .hero { + grid-template-columns: 1fr; + } + + .hero__right { + order: -1; + height: 50vh; + height: 50svh; + min-height: 200px; + } + + .hero__left { + padding: 40px 24px; + } + + .hero__title { + font-size: 2rem; + } + + .photo-grid { + --grid-columns: 1; + } + + .album-grid { + grid-template-columns: 1fr; + } + + .subpage-grid { + grid-template-columns: 1fr; + } + + .main { + padding: 32px 20px 80px; + } + + .header__nav-link { + padding: 14px 10px; + font-size: 0.6rem; + } + + .album-header__title { + font-size: 1.8rem; + } + + .album-card__overlay { + opacity: 1; + } + + .subpage-grid__item-overlay { + opacity: 1; + } + + [data-photo-frame='passepartout'] .photo-grid__item { + padding: 6px 6px 18px; + } + + /* Minimal: adjust fullbleed hero for mobile */ + [data-preset='minimal'] .hero__left { + padding: 20px 24px; + } + + [data-preset='minimal'] .hero__right { + height: 70vh; + height: 70svh; + } + + /* Editorial: scale down oversized title */ + [data-preset='editorial'] .hero__title { + font-size: 2.5rem; + } + + [data-preset='editorial'] .album-header__title { + font-size: 2rem; + } + + /* Classic: scale title */ + [data-preset='classic'] .hero__title { + font-size: 2rem; + } + + /* Stacked: compact overlay */ + .hero__stacked-overlay { + padding: 24px 20px; + } + + .hero--stacked .hero__title { + font-size: 2rem; + } + + .hero__thumbnail-item { + padding: 12px 20px; + } + + /* Typographic: scale down massive title */ + .hero--typographic { + padding: 40px 24px; + } + + .hero--typographic .hero__title { + font-size: 3.5rem; + } + + /* Mosaic: simplify to 2-column */ + .hero__mosaic-grid { + grid-template-columns: 1fr 1fr; + grid-template-rows: auto; + } + + .hero__mosaic-cell--1 { + grid-row: auto; + } + + .hero__mosaic-cell--2 { + grid-column: auto; + } + + .hero__mosaic-cell:nth-child(n + 5) { + display: none; + } + + .hero__mosaic-overlay { + padding: 24px 28px; + } + + .hero--mosaic .hero__title { + font-size: 2rem; + } + + /* Monograph: scale album header */ + [data-preset='monograph'] .album-header__title { + font-size: 2rem; + } +} diff --git a/app/themes/noir.css b/app/themes/noir.css new file mode 100644 index 0000000..37fef20 --- /dev/null +++ b/app/themes/noir.css @@ -0,0 +1,107 @@ +/* ══════════════════════════════════════════════════════ + THEME: Noir — Darkroom Analog + ══════════════════════════════════════════════════════ */ + +/* Header: transparent with subtle warm border */ +[data-preset='noir'] .header { + background: transparent; + backdrop-filter: none; + -webkit-backdrop-filter: none; + border-bottom: 1px solid rgba(255, 107, 53, 0.1); +} + +[data-preset='noir'] .header__nav-link { + font-size: 0.65rem; + font-weight: 400; + letter-spacing: 0.15em; +} + +/* Photo grid: warm analog feel */ +[data-preset='noir'] .photo-grid__item img { + filter: sepia(0.08) contrast(1.02); + transition: + filter 0.8s ease, + transform 0.8s ease, + box-shadow 0.8s ease; +} + +[data-preset='noir'] .photo-grid__item:hover img { + filter: sepia(0) contrast(1) brightness(0.88); + transform: scale(1.01); +} + +/* Vignette hover effect */ +[data-preset='noir'] .photo-grid__item::before { + content: ''; + position: absolute; + inset: 0; + z-index: 1; + box-shadow: inset 0 0 60px rgba(0, 0, 0, 0); + pointer-events: none; + transition: box-shadow 0.8s ease; +} + +[data-preset='noir'] .photo-grid__item:hover::before { + box-shadow: inset 0 0 60px rgba(0, 0, 0, 0.4); +} + +/* Film-edge EXIF labels */ +[data-preset='noir'] .photo-grid__item-exif { + font-family: var(--font-caption); + font-size: 0.6rem; + letter-spacing: 0.08em; + text-transform: uppercase; + color: rgba(255, 200, 150, 0.7); +} + +/* Album cards */ +[data-preset='noir'] .album-card { + border: none; + border-radius: 0; +} + +[data-preset='noir'] .album-card:hover { + transform: none; + border-color: transparent; +} + +[data-preset='noir'] .album-card__title { + font-weight: 400; + letter-spacing: 0.04em; +} + +/* Section labels */ +[data-preset='noir'] .section-label { + font-family: var(--font-caption); + font-size: 0.6rem; + letter-spacing: 0.15em; + text-transform: uppercase; +} + +/* Album & Subpage header */ +[data-preset='noir'] .album-header__title, +[data-preset='noir'] .subpage-title { + font-weight: 300; + letter-spacing: 0.04em; +} + +/* Footer */ +[data-preset='noir'] .footer { + border-top: 1px solid rgba(255, 107, 53, 0.1); +} + +[data-preset='noir'] .footer__name { + font-family: var(--font-caption); + font-size: 0.65rem; + letter-spacing: 0.12em; +} + +/* Subpage grid */ +[data-preset='noir'] .subpage-grid__item { + border: none; +} + +[data-preset='noir'] .subpage-grid__item-title { + font-weight: 400; + letter-spacing: 0.05em; +}