/* ================================================================
   PORTFOLIO — Magazine-Style CSS
   ================================================================
   Table of Contents:
   1.  CSS Custom Properties (Light & Dark themes)
   2.  Reset & Base Styles
   3.  Typography
   4.  Navbar
   5.  Hero Section
   6.  Section Shared Styles
   7.  About Me
   8.  Projects
   9.  Resume & Experience
   10. Contact
   11. Footer
   12. Animations & Reveal Effects
   13. Responsive Breakpoints
   ================================================================ */

/* ================================================================
   1. CSS CUSTOM PROPERTIES
   We define all colors, fonts, and spacings as variables so the
   entire theme can be swapped by toggling data-theme on <html>.
   ================================================================ */
:root {
  /* -- Fonts -- */
  --font-heading: 'Playfair Display', 'Georgia', serif;
  --font-body: 'League Spartan', 'Helvetica Neue', sans-serif;

  /* -- Palette (semantic mapping) --
     Primary Greens:
       #364023  Palm Leaf        → --color-primary
       #6a823e  Beyond the Pines → --color-primary-mid  (main accent)
       #9c9f69  Willow Leaf      → --color-primary-light
     Accents / Secondary Pinks:
       #c7a39b  Parfait          → --color-secondary
       #e6b1c4  Fallen Blossoms  → --color-secondary-mid
       #efd4dd  Dolce Pink       → --color-surface
  ---------------------------------------------------- */
  --color-primary: #364023;
  --color-primary-mid: #6a823e;
  --color-primary-light: #9c9f69;
  --color-secondary: #c7a39b;
  --color-secondary-mid: #e6b1c4;
  --color-surface: #efd4dd;

  /* -- Spacing scale -- */
  --space-xs: 0.5rem;
  --space-sm: 1rem;
  --space-md: 2rem;
  --space-lg: 4rem;
  --space-xl: 6rem;
  --space-2xl: 8rem;

  /* -- Layout -- */
  --max-width: 1280px;
  --section-padding: var(--space-xl) var(--space-md);
  --border-radius: 8px;

  /* -- Transitions -- */
  --transition-fast: 0.2s ease;
  --transition-base: 0.4s ease;
  --transition-slow: 0.8s cubic-bezier(0.16, 1, 0.3, 1);
}

/* ---- Light theme (default) ----
   All text is #000 for max contrast per brief.
   Accent = Beyond the Pines green; surfaces use the pink palette.
   ------------------------------------------------ */
[data-theme="light"] {
  --color-bg: #ffffff;
  --color-bg-alt: #efd4dd;              /* Dolce Pink — alt section bg        */
  --color-bg-dark: #364023;             /* Palm Leaf — dark surface            */
  --color-text: #000000;                /* Pure black text for high contrast   */
  --color-text-muted: #2a2a2a;          /* Near-black for secondary text       */
  --color-text-on-dark: #ffffff;
  --color-accent: #6a823e;              /* Beyond the Pines — links, buttons   */
  --color-accent-hover: #364023;        /* Palm Leaf — darker on hover         */
  --color-border: #e6b1c4;             /* Fallen Blossoms — subtle border     */
  --color-card-bg: #ffffff;
  --color-overlay: rgba(54, 64, 35, 0.65);
  --color-navbar-bg: rgba(255, 255, 255, 0.9);
  --color-navbar-scrolled: rgba(255, 255, 255, 0.97);
  --color-input-bg: #ffffff;
  --shadow-sm: 0 1px 3px rgba(54, 64, 35, 0.08);
  --shadow-md: 0 4px 20px rgba(54, 64, 35, 0.10);
  --shadow-lg: 0 12px 40px rgba(54, 64, 35, 0.14);
}

/* ---- Dark theme ----
   Uses the deep Palm Leaf green as the base. Text lightens to
   white for readability on dark backgrounds. Accent shifts to
   the lighter greens so interactive elements stay visible.
   ------------------------------------------------ */
[data-theme="dark"] {
  --color-bg: #1a2012;                 /* Very dark green-tinted black         */
  --color-bg-alt: #232c18;             /* Slightly lighter panel bg            */
  --color-bg-dark: #111710;
  --color-text: #f0ede8;               /* Warm off-white for readability       */
  --color-text-muted: #b0b0a8;
  --color-text-on-dark: #f0ede8;
  --color-accent: #9c9f69;             /* Willow Leaf — lighter green accent   */
  --color-accent-hover: #c7a39b;       /* Parfait — pink accent on hover       */
  --color-border: #3a4428;
  --color-card-bg: #232c18;
  --color-overlay: rgba(17, 23, 16, 0.75);
  --color-navbar-bg: rgba(26, 32, 18, 0.9);
  --color-navbar-scrolled: rgba(26, 32, 18, 0.97);
  --color-input-bg: #232c18;
  --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.25);
  --shadow-md: 0 4px 20px rgba(0, 0, 0, 0.35);
  --shadow-lg: 0 12px 40px rgba(0, 0, 0, 0.45);
}


/* ================================================================
   2. RESET & BASE STYLES
   ================================================================ */
*,
*::before,
*::after {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

html {
  scroll-behavior: smooth;
  font-size: 16px;
}

body {
  font-family: var(--font-body);
  background-color: var(--color-bg);
  color: var(--color-text);
  line-height: 1.7;
  overflow-x: hidden;
  transition: background-color var(--transition-base),
              color var(--transition-base);
}

img {
  max-width: 100%;
  height: auto;
  display: block;
}

a {
  text-decoration: none;
  color: var(--color-accent);
  transition: color var(--transition-fast);
}

a:hover {
  color: var(--color-accent-hover);
}

ul {
  list-style: none;
}

button {
  cursor: pointer;
  border: none;
  background: none;
  font-family: inherit;
  color: inherit;
}

::selection {
  background-color: var(--color-primary-mid);
  color: #ffffff;
}


/* ================================================================
   3. TYPOGRAPHY
   Playfair Display for headings/titles; League Spartan for body
   text, UI elements, and sub-headings. All text is black (#000)
   in light mode for maximum contrast.
   ================================================================ */
h1, h2, h3, h4 {
  font-family: var(--font-heading);
  font-weight: 700;
  line-height: 1.2;
}

/* Drop cap — used in editorial layouts for the first letter */
.drop-cap {
  float: left;
  font-family: var(--font-heading);
  font-size: 4.5rem;
  line-height: 0.8;
  padding-right: 0.6rem;
  padding-top: 0.15rem;
  color: var(--color-accent);
  font-weight: 900;
}


/* ================================================================
   4. NAVBAR
   Fixed at top; transparent initially, gains background on scroll.
   ================================================================ */
.navbar {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  z-index: 1000;
  padding: 1.25rem 0;
  transition: background-color var(--transition-base),
              box-shadow var(--transition-base),
              padding var(--transition-base);
}

.navbar--scrolled {
  background-color: var(--color-navbar-scrolled);
  box-shadow: var(--shadow-sm);
  padding: 0.75rem 0;
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
}

.navbar__container {
  max-width: var(--max-width);
  margin: 0 auto;
  padding: 0 var(--space-md);
  display: flex;
  align-items: center;
  justify-content: space-between;
}

/* Brand */
.navbar__brand {
  font-family: var(--font-heading);
  font-size: 1.5rem;
  font-weight: 900;
  color: var(--color-text);
  letter-spacing: 0.02em;
  transition: color var(--transition-fast);
}

.navbar__brand-accent {
  color: var(--color-accent);
}

/* Nav Links */
.navbar__links {
  display: flex;
  gap: 2.5rem;
}

.navbar__link {
  font-size: 0.85rem;
  font-weight: 500;
  color: var(--color-text-muted);
  text-transform: uppercase;
  letter-spacing: 0.1em;
  position: relative;
  transition: color var(--transition-fast);
}

.navbar__link::after {
  content: '';
  position: absolute;
  bottom: -4px;
  left: 0;
  width: 0;
  height: 2px;
  background-color: var(--color-accent);
  transition: width var(--transition-base);
}

.navbar__link:hover,
.navbar__link--active {
  color: var(--color-text);
}

.navbar__link:hover::after,
.navbar__link--active::after {
  width: 100%;
}

/* Navbar Actions (theme toggle + hamburger) */
.navbar__actions {
  display: flex;
  align-items: center;
  gap: 1rem;
}

/* Theme Toggle Button */
.theme-toggle {
  position: relative;
  width: 40px;
  height: 40px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  transition: background-color var(--transition-fast);
}

.theme-toggle:hover {
  background-color: var(--color-bg-alt);
}

.theme-toggle__icon {
  position: absolute;
  transition: opacity var(--transition-base), transform var(--transition-base);
}

/* In light mode: show moon, hide sun */
[data-theme="light"] .theme-toggle__moon { opacity: 1; transform: rotate(0deg); }
[data-theme="light"] .theme-toggle__sun  { opacity: 0; transform: rotate(90deg); }

/* In dark mode: show sun, hide moon */
[data-theme="dark"] .theme-toggle__moon { opacity: 0; transform: rotate(-90deg); }
[data-theme="dark"] .theme-toggle__sun  { opacity: 1; transform: rotate(0deg); }

/* Hamburger Menu (mobile only) */
.navbar__hamburger {
  display: none;
  flex-direction: column;
  gap: 5px;
  width: 28px;
  padding: 4px 0;
}

.navbar__hamburger span {
  display: block;
  height: 2px;
  background-color: var(--color-text);
  border-radius: 2px;
  transition: transform var(--transition-base), opacity var(--transition-fast);
}

/* Hamburger active state (X shape) */
.navbar__hamburger--active span:nth-child(1) {
  transform: translateY(7px) rotate(45deg);
}
.navbar__hamburger--active span:nth-child(2) {
  opacity: 0;
}
.navbar__hamburger--active span:nth-child(3) {
  transform: translateY(-7px) rotate(-45deg);
}


/* ================================================================
   5. HERO SECTION — Infinite Scrolling Photo Collage
   ================================================================
   Three horizontal rows of photos scroll infinitely in alternating
   directions. The entire collage is tilted -8deg for a dynamic,
   editorial feel. A glassmorphism card sits centred on top.

   Architecture:
     .hero                       → viewport container
       .hero__collage             → tilted wrapper
         .hero__row               → single scrolling strip
           .hero__row-inner       → animated flex container (2× images)
             .hero__photo         → individual photo cell (masonry widths)
       .hero__overlay             → darken layer for contrast
       .hero__glass               → glassmorphism title card
       .hero__scroll-indicator    → bouncing arrow
   ================================================================ */
.hero {
  position: relative;
  height: 100vh;
  min-height: 650px;
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
  background-color: #f5f5f5;                /* light fallback while images load */
}

/* ── Floating gradient orbs — sit behind the collage ── */
.hero__orb {
  position: absolute;
  border-radius: 50%;
  filter: blur(100px);
  opacity: 0.5;
  z-index: 0;
  pointer-events: none;
}

.hero__orb--green {
  width: 55vw;
  height: 55vw;
  max-width: 700px;
  max-height: 700px;
  background: radial-gradient(circle, #6a823e 0%, transparent 70%);
  top: -10%;
  left: -15%;
  animation: orb-float-1 14s ease-in-out infinite;
}

.hero__orb--pink {
  width: 50vw;
  height: 50vw;
  max-width: 650px;
  max-height: 650px;
  background: radial-gradient(circle, #e6b1c4 0%, transparent 70%);
  bottom: -10%;
  right: -10%;
  animation: orb-float-2 16s ease-in-out infinite;
}

@keyframes orb-float-1 {
  0%, 100% { transform: translate(0, 0) scale(1); }
  33%      { transform: translate(5%, 8%) scale(1.05); }
  66%      { transform: translate(-3%, -5%) scale(0.97); }
}

@keyframes orb-float-2 {
  0%, 100% { transform: translate(0, 0) scale(1); }
  33%      { transform: translate(-6%, -4%) scale(0.95); }
  66%      { transform: translate(4%, 6%) scale(1.04); }
}

/* ── Collage wrapper — tilted for magazine dynamism ── */
.hero__collage {
  position: absolute;
  /* Overshoot bounds so rotation doesn't expose corners */
  inset: -20%;
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: 14px;
  transform: rotate(-8deg);
  z-index: 0;
}

/* ── Individual row strip ── */
.hero__row {
  overflow: hidden;
  width: 100%;
}

/* ── Inner container that holds all photos and slides ── */
.hero__row-inner {
  display: flex;
  gap: 14px;
  width: max-content;           /* shrink-wrap to total photo width  */
  will-change: transform;       /* GPU-promote for smooth animation  */
}

/* Row 1 — scrolls left */
.hero__row--1 .hero__row-inner {
  animation: collage-scroll-left 45s linear infinite;
}

/* Row 2 — scrolls right (starts offset so seam is hidden) */
.hero__row--2 .hero__row-inner {
  animation: collage-scroll-right 55s linear infinite;
}

/* Row 3 — scrolls left, different speed */
.hero__row--3 .hero__row-inner {
  animation: collage-scroll-left 50s linear infinite;
}

/* ── Keyframes ──
   Each row contains 2 identical sets of photos, so shifting by
   -50% brings us back to the exact same visual position.          */
@keyframes collage-scroll-left {
  0%   { transform: translateX(0); }
  100% { transform: translateX(-50%); }
}

@keyframes collage-scroll-right {
  0%   { transform: translateX(-50%); }
  100% { transform: translateX(0); }
}

/* ── Pause animation on hover for accessibility ── */
.hero__collage:hover .hero__row-inner,
.hero__collage.paused .hero__row-inner {
  animation-play-state: paused;
}

/* ── Respect prefers-reduced-motion ── */
@media (prefers-reduced-motion: reduce) {
  .hero__row-inner {
    animation-play-state: paused !important;
  }
}

/* ── Photo cells (masonry-like varying widths) ── */
.hero__photo {
  flex-shrink: 0;
  width: 300px;
  height: 220px;
  border-radius: 10px;
  overflow: hidden;
}

.hero__photo--wide {
  width: 400px;
}

.hero__photo--tall {
  width: 230px;
}

.hero__photo img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

/* ── Dark overlay for text legibility over busy images ── */
.hero__overlay {
  position: absolute;
  inset: 0;
  background: radial-gradient(
    ellipse at center,
    rgba(255, 255, 255, 0.35) 0%,
    rgba(255, 255, 255, 0.55) 70%,
    rgba(255, 255, 255, 0.72) 100%
  );
  z-index: 1;
}

/* ── SVG used for the grain filter (hidden off-screen) ── */
.hero__grain-svg {
  position: absolute;
  width: 0;
  height: 0;
  pointer-events: none;
}

/* ── Glassmorphism title card with grainy texture ── */
.hero__glass {
  position: relative;
  z-index: 2;
  text-align: center;
  padding: 3.5rem 4.5rem;
  /* Glass effect: translucent bg + backdrop blur + subtle border */
  background: rgba(255, 255, 255, 0.42);
  backdrop-filter: blur(22px) saturate(1.4);
  -webkit-backdrop-filter: blur(22px) saturate(1.4);
  border: 1px solid rgba(255, 255, 255, 0.5);
  border-radius: 28px;
  color: #000000;
  max-width: 700px;
  width: 90%;
  overflow: hidden;
}

/* Grain texture overlay inside the glass card */
/* Grain pseudo-element: the SVG filter needs a painted surface to act on.
   We fill the div with white, apply the noise filter, then reduce opacity. */
.hero__glass-grain {
  position: absolute;
  inset: -2px;                    /* slight overflow to avoid edge gaps      */
  border-radius: inherit;
  background: #ffffff;            /* surface for the feTurbulence to render  */
  filter: url(#grainFilter);
  opacity: 0.10;
  pointer-events: none;
  z-index: 0;
}

/* Ensure all glass card content sits above the grain */
.hero__glass > *:not(.hero__glass-grain) {
  position: relative;
  z-index: 1;
}

.hero__label {
  font-family: var(--font-body);
  font-size: 0.8rem;
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: 0.3em;
  margin-bottom: var(--space-xs);
  opacity: 0.75;
}

.hero__title {
  font-family: var(--font-heading);
  font-size: clamp(2.8rem, 7vw, 5.5rem);
  font-weight: 900;
  line-height: 1.05;
  margin-bottom: 0.6rem;
  letter-spacing: -0.02em;
}

.hero__subtitle {
  font-family: var(--font-body);
  font-size: clamp(0.85rem, 1.8vw, 1.15rem);
  font-weight: 400;
  letter-spacing: 0.15em;
  text-transform: uppercase;
  opacity: 0.8;
  margin-bottom: var(--space-md);
}

.hero__cta {
  display: inline-block;
  padding: 0.9rem 2.2rem;
  border: 2px solid var(--color-primary);
  border-radius: 6px;
  color: var(--color-primary);
  font-family: var(--font-body);
  font-size: 0.85rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.12em;
  transition: background-color var(--transition-base),
              color var(--transition-base),
              border-color var(--transition-base),
              transform var(--transition-fast);
}

.hero__cta:hover {
  background-color: var(--color-primary);
  border-color: var(--color-primary);
  color: #ffffff;
  transform: translateY(-2px);
}

/* ── Scroll indicator at bottom ── */
.hero__scroll-indicator {
  position: absolute;
  bottom: 2rem;
  left: 50%;
  transform: translateX(-50%);
  z-index: 2;
  color: var(--color-primary);
  opacity: 0.6;
  animation: bounce 2.2s ease-in-out infinite;
}

@keyframes bounce {
  0%, 20%, 50%, 80%, 100% { transform: translateX(-50%) translateY(0); }
  40%  { transform: translateX(-50%) translateY(-10px); }
  60%  { transform: translateX(-50%) translateY(-5px); }
}


/* ================================================================
   6. SECTION SHARED STYLES
   Reusable section header, numbering, and divider.
   ================================================================ */
/* ── Gradient-fade between sections ──
   ALL sections are now full-bleed (width: 100%) so gradient pseudo-
   elements span the entire viewport.  Content is capped at
   --max-width via direct-child rules below.                          */

.section {
  position: relative;
  width: 100%;
  max-width: 100%;            /* full bleed — no clipping             */
  padding: var(--space-2xl) var(--space-md);
  margin: 0 auto;
  background-color: var(--color-bg);
}

/* Cap content children at readable width */
.section > * {
  position: relative;
  z-index: 1;
  max-width: var(--max-width);
  margin-left: auto;
  margin-right: auto;
}

/* Light section: top gradient (pink → white)
   Fades from the previous dark section's pink into this section's white. */
.section::before {
  content: '';
  position: absolute;
  top: -1px;                  /* -1px eliminates sub-pixel gaps         */
  left: 0;
  width: 100%;
  height: 200px;
  background: linear-gradient(
    to bottom,
    var(--color-bg-alt) 0%,
    var(--color-bg) 100%
  );
  pointer-events: none;
  z-index: 0;
}

/* About Me is the first section after the hero (white),
   so there's no pink above it — hide the gradient.      */
.about.section::before {
  display: none;
}

/* Resume & Experience — solid white, no gradient.
   The Projects section (dark) already fades to white at its bottom
   via ::after, so Resume just needs a clean flat background.        */
.resume.section::before {
  display: none;
}

/* ── Dark section variant — full bleed background ── */
.section--dark {
  position: relative;
  width: 100%;
  max-width: 100%;
  background-color: var(--color-bg-alt);
  padding: var(--space-2xl) var(--space-md);
  margin-top: -1px;           /* seal sub-pixel gap with section above  */
}

/* Cap dark-section content children too */
.section--dark > * {
  position: relative;
  z-index: 1;
  max-width: var(--max-width);
  margin-left: auto;
  margin-right: auto;
}

/* Dark section: top gradient (white → pink)
   Blends from the previous light section's white into pink.  */
.section--dark::before {
  content: '';
  position: absolute;
  top: -1px;
  left: 0;
  width: 100%;
  height: 200px;
  background: linear-gradient(
    to bottom,
    var(--color-bg) 0%,
    var(--color-bg-alt) 100%
  );
  pointer-events: none;
  z-index: 0;
}

/* Dark section: bottom gradient (pink → white)
   Smooths the exit so the next light section starts cleanly.  */
.section--dark::after {
  content: '';
  position: absolute;
  bottom: -1px;
  left: 0;
  width: 100%;
  height: 200px;
  background: linear-gradient(
    to bottom,
    var(--color-bg-alt) 0%,
    var(--color-bg) 100%
  );
  pointer-events: none;
  z-index: 0;
}

.section__header {
  text-align: center;
  margin-bottom: var(--space-xl);
}

.section__number {
  display: block;
  font-family: var(--font-heading);
  font-size: 0.85rem;
  font-weight: 400;
  color: var(--color-accent);
  letter-spacing: 0.2em;
  margin-bottom: var(--space-xs);
}

.section__title {
  font-size: clamp(2rem, 5vw, 3.5rem);
  font-weight: 900;
  margin-bottom: var(--space-sm);
  letter-spacing: -0.01em;
}

.section__divider {
  width: 60px;
  height: 3px;
  background-color: var(--color-accent);
  margin: var(--space-sm) auto;
}

.section__subtitle {
  font-size: 1.1rem;
  color: var(--color-text-muted);
  max-width: 550px;
  margin: var(--space-sm) auto 0;
  line-height: 1.6;
}


/* ================================================================
   7. ABOUT ME
   Two-column editorial spread: photo left, bio right.
   ================================================================ */
.about__grid {
  display: grid;
  grid-template-columns: 1fr 1.2fr;
  gap: var(--space-xl);
  align-items: start;
}

.about__image-wrapper {
  position: relative;
  overflow: hidden;
  border-radius: var(--border-radius);
  max-width: 380px;
  animation: float 6s ease-in-out infinite;
  /* Color-cycling glow behind the photo */
  box-shadow: 0 8px 60px 15px rgba(106, 130, 62, 0.35);
  transition: box-shadow 0.4s ease;
  animation: float 6s ease-in-out infinite,
             glow-cycle 8s ease-in-out infinite;
}

/* Alternates between green (Beyond the Pines) and pink (Fallen Blossoms) */
@keyframes glow-cycle {
  0%, 100% { box-shadow: 0 8px 60px 15px rgba(106, 130, 62, 0.35); }   /* green  */
  50%      { box-shadow: 0 8px 60px 15px rgba(230, 177, 196, 0.45); }   /* pink   */
}

@keyframes float {
  0%, 100% { transform: translateY(0); }
  50%      { transform: translateY(-12px); }
}

.about__image {
  width: 100%;
  height: auto;
  aspect-ratio: 3 / 4;
  object-fit: cover;
  transition: transform var(--transition-slow);
}

.about__image-wrapper:hover .about__image {
  transform: scale(1.05);
}

/* Pause the float on hover so the zoom feels intentional */
.about__image-wrapper:hover {
  animation-play-state: paused;
}

/* Respect reduced motion preference */
@media (prefers-reduced-motion: reduce) {
  .about__image-wrapper {
    animation: none;
    box-shadow: 0 8px 60px 15px rgba(106, 130, 62, 0.35);
  }
  .about__text {
    animation: none;
  }
}

.about__image-caption {
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  padding: 1rem 1.5rem;
  background: linear-gradient(transparent, rgba(54, 64, 35, 0.7));
  color: #fff;
  font-size: 0.8rem;
  font-style: italic;
  letter-spacing: 0.05em;
}

.about__text {
  padding-top: var(--space-md);
  animation: float 6s ease-in-out infinite;
  animation-delay: -3s;   /* offset half-cycle so text & photo drift opposite */
}

.about__lead {
  font-size: 1.15rem;
  line-height: 1.8;
  margin-bottom: var(--space-md);
}

.about__text p {
  margin-bottom: var(--space-sm);
  color: var(--color-text-muted);
  line-height: 1.8;
}

.about__text .about__lead {
  color: var(--color-text);
}

/* Stats row */
.about__stats {
  display: flex;
  gap: var(--space-lg);
  margin-top: var(--space-lg);
  padding-top: var(--space-md);
  border-top: 1px solid var(--color-border);
}

.about__stat {
  display: flex;
  flex-direction: column;
}

.about__stat-number {
  font-family: var(--font-heading);
  font-size: 2.5rem;
  font-weight: 900;
  color: var(--color-accent);
  line-height: 1;
}

.about__stat-label {
  font-size: 0.8rem;
  color: var(--color-text-muted);
  text-transform: uppercase;
  letter-spacing: 0.1em;
  margin-top: 0.4rem;
}


/* ================================================================
   8. PROJECTS
   Card grid with hover overlay effects. The first card is a
   featured (larger) card spanning 2 columns.
   ================================================================ */
/* ── Horizontal scroll display ── */
.projects__grid {
  display: flex;
  gap: var(--space-lg);
  overflow-x: auto;
  overflow-y: visible;           /* let bubbles escape upward          */
  scroll-snap-type: x mandatory;
  -webkit-overflow-scrolling: touch;
  padding: var(--space-md) calc(50vw - 240px) var(--space-xl);
  max-width: 100%;
  /* Hide scrollbar but keep scroll functionality */
  scrollbar-width: thin;
  scrollbar-color: rgba(156, 159, 105, 0.4) transparent;
}

.projects__grid::-webkit-scrollbar {
  height: 6px;
}

.projects__grid::-webkit-scrollbar-track {
  background: transparent;
}

.projects__grid::-webkit-scrollbar-thumb {
  background: rgba(156, 159, 105, 0.4);
  border-radius: 3px;
}

.projects__grid::-webkit-scrollbar-thumb:hover {
  background: rgba(156, 159, 105, 0.7);
}

/* Override the section child max-width so the scroll area uses full width */
.projects__grid {
  max-width: 100% !important;
  margin-left: 0 !important;
  margin-right: 0 !important;
}

/* ── "scroll to explore" hint ── */
.projects__hint {
  font-family: var(--font-body);
  font-size: 0.9rem;
  font-weight: 500;
  font-style: italic;
  letter-spacing: 0.08em;
  color: var(--color-text-muted);
  margin-top: var(--space-sm);
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.6rem;
}

.projects__hint-arrow {
  display: inline-block;
  font-style: normal;
  animation: hint-sway 1.8s ease-in-out infinite;
}

.projects__hint-arrow:first-child {
  animation-direction: alternate-reverse;
}

@keyframes hint-sway {
  0%, 100% { transform: translateX(0); opacity: 0.4; }
  50%      { transform: translateX(5px); opacity: 1; }
}

/* ── Bubble wrapper — allows bubbles to overflow outside the card ── */
.bubble-wrap {
  position: relative;
  flex-shrink: 0;
  width: 480px;
  scroll-snap-align: center;
  /* Inactive cards are slightly smaller and dimmer */
  transform: scale(0.88);
  opacity: 0.55;
  filter: blur(1px);
  transition: transform 0.5s cubic-bezier(0.25, 1, 0.5, 1),
              opacity 0.5s ease,
              filter 0.5s ease;
}

/* The card closest to the center gets the "active" class via JS */
.bubble-wrap.active {
  transform: scale(1);
  opacity: 1;
  filter: blur(0);
}

/* First and last cards can't always reach center — keep them visible */
.bubble-wrap:first-child,
.bubble-wrap:last-child {
  opacity: 0.85;
  filter: blur(0);
}

/* Active state still takes full priority on first/last */
.bubble-wrap:first-child.active,
.bubble-wrap:last-child.active {
  transform: scale(1);
  opacity: 1;
  filter: blur(0);
}

/* ── Individual bubble particle ── */
.bubble {
  position: absolute;
  border-radius: 50%;
  pointer-events: none;
  z-index: 10;
  opacity: 0;
  filter: url(#grainFilter) blur(2px);     /* grainy + soft blur      */
  will-change: transform, opacity;
}

@keyframes bubble-rise {
  0% {
    opacity: 0.85;
    transform: translateY(0) translateX(0) scale(1);
  }
  50% {
    opacity: 0.5;
  }
  100% {
    opacity: 0;
    transform: translateY(-140px) translateX(var(--drift, 0px)) scale(0.25);
  }
}


/* ================================================================
   SPECIMEN GALLERY — "display case" card design
   Silver border, corner brackets, REF label, grayscale → colour,
   3D tilt, glassmorphism title pill with grain.
   ================================================================ */

/* ── Project card — specimen display case ── */
.project-card {
  position: relative;
  border-radius: 4px;                      /* sharp, clinical corners  */
  overflow: hidden;
  background-color: #0a0a0a;
  border: 1px solid rgba(192, 192, 192, 0.55); /* silver border        */
  box-shadow: 0 0 0 1px rgba(192, 192, 192, 0.12);
  aspect-ratio: 4 / 3;                      /* taller for gallery feel  */
  transition: box-shadow 0.4s ease;
  /* 3D tilt perspective — the tilt itself is applied via JS */
  transform-style: preserve-3d;
  will-change: transform;
}

/* Hover shadow — the 3D tilt transform is applied via JS */
.project-card:hover {
  box-shadow: 0 12px 40px rgba(0, 0, 0, 0.25),
              0 0 0 1px rgba(192, 192, 192, 0.25);
}

/* Smooth spring-back transition for the JS tilt */
.project-card {
  transition: box-shadow 0.4s ease, transform 0.15s ease-out;
}

/* ── Corner brackets (CSS pseudo-elements) ──
   Four L-shaped corners that mimic a high-end display frame.
   We use ::before on the card for top-left + bottom-right,
   and ::after for the remaining hue overlay + corner hints.      */

.project-card .project-card__image-wrapper::before,
.project-card .project-card__image-wrapper::after {
  content: '';
  position: absolute;
  width: 22px;
  height: 22px;
  border-color: rgba(192, 192, 192, 0.6);
  border-style: solid;
  z-index: 4;
  pointer-events: none;
  transition: border-color 0.3s ease;
}

/* Top-left corner bracket */
.project-card .project-card__image-wrapper::before {
  top: 10px;
  left: 10px;
  border-width: 2px 0 0 2px;
}

/* Bottom-right corner bracket */
.project-card .project-card__image-wrapper::after {
  bottom: 10px;
  right: 10px;
  border-width: 0 2px 2px 0;
}

/* ── Additional corners via the bubble-wrap pseudo-elements ── */
.bubble-wrap::before,
.bubble-wrap::after {
  content: '';
  position: absolute;
  width: 22px;
  height: 22px;
  border-color: rgba(192, 192, 192, 0.6);
  border-style: solid;
  z-index: 4;
  pointer-events: none;
  transition: border-color 0.3s ease;
}

/* Top-right corner bracket */
.bubble-wrap::before {
  top: 10px;
  right: 10px;
  border-width: 2px 2px 0 0;
}

/* Bottom-left corner bracket */
.bubble-wrap::after {
  bottom: 10px;
  left: 10px;
  border-width: 0 0 2px 2px;
}

/* Brighten brackets on hover */
.bubble-wrap:hover::before,
.bubble-wrap:hover::after,
.bubble-wrap:hover .project-card__image-wrapper::before,
.bubble-wrap:hover .project-card__image-wrapper::after {
  border-color: rgba(255, 255, 255, 0.85);
}

/* ── REF label — monospace specimen tag in top-left ── */
.project-card[data-ref]::before {
  content: attr(data-ref);
  position: absolute;
  top: 14px;
  left: 38px;                              /* clear the corner bracket */
  z-index: 5;
  font-family: 'Courier New', Courier, monospace;
  font-size: 0.65rem;
  font-weight: 600;
  letter-spacing: 0.12em;
  color: #000000;
  background: rgba(255, 255, 255, 0.55);
  backdrop-filter: blur(4px);
  -webkit-backdrop-filter: blur(4px);
  padding: 0.15rem 0.5rem;
  border-radius: 2px;
  pointer-events: none;
  transition: opacity 0.3s ease;
}

/* Hide REF label when overlay is visible */
.project-card:hover[data-ref]::before {
  opacity: 0;
}


/* ── Image — full colour by default, grayscale on hover ── */
.project-card__image-wrapper {
  position: absolute;
  inset: 0;
  overflow: hidden;
}

.project-card__image {
  width: 100%;
  height: 100%;
  object-fit: cover;
  filter: grayscale(0%) brightness(1);
  transition: filter 0.5s ease, transform 0.6s ease;
}

.project-card:hover .project-card__image {
  filter: grayscale(100%) brightness(0.7);
  transform: scale(1.06);
}


/* ── Centered title — glassmorphism pill with grainy overlay ── */
.project-card__title {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  z-index: 2;
  font-family: var(--font-heading);
  font-size: 1.4rem;
  font-weight: 700;
  color: #000000;
  text-align: center;
  /* Glassmorphism pill */
  background: rgba(255, 255, 255, 0.5);
  backdrop-filter: blur(10px) saturate(1.3);
  -webkit-backdrop-filter: blur(10px) saturate(1.3);
  border: 1px solid rgba(255, 255, 255, 0.35);
  padding: 0.55rem 1.6rem;
  border-radius: 50px;                     /* pill shape               */
  pointer-events: none;
  transition: opacity 0.35s ease, transform 0.35s ease;
  width: max-content;
  max-width: 88%;
  overflow: hidden;                        /* clip grain inside pill   */
}

/* Grain overlay inside the title pill */
.project-card__title::after {
  content: '';
  position: absolute;
  inset: -2px;
  border-radius: inherit;
  background: #ffffff;
  filter: url(#grainFilter);
  opacity: 0.08;
  pointer-events: none;
}

/* Fade title out on hover (overlay takes over) */
.project-card:hover .project-card__title {
  opacity: 0;
  transform: translate(-50%, -60%);
}


/* The grayscale filter provides the dimmed/desaturated look by default.
   On hover the full colour snaps in — no separate hue overlay needed. */


/* ── Description overlay — centered, fades in on hover ── */
.project-card__overlay {
  position: absolute;
  inset: 0;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  text-align: center;
  padding: 1.6rem;
  background: rgba(54, 64, 35, 0.90);
  color: #ffffff;
  opacity: 0;
  z-index: 6;
  transition: opacity 0.4s ease;
  overflow-y: auto;
}

.project-card:hover .project-card__overlay {
  opacity: 1;
}

.project-card__tag {
  display: inline-block;
  font-size: 0.7rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.15em;
  padding: 0.3rem 0.8rem;
  background-color: var(--color-surface);
  color: var(--color-primary);
  border-radius: 3px;
  margin-bottom: 0.6rem;
}

.project-card__desc {
  font-size: 0.85rem;
  line-height: 1.55;
  opacity: 0.9;
  margin-bottom: 0.8rem;
  max-width: 420px;
}

.project-card__tech {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 0.4rem;
  margin-bottom: 0.8rem;
}

.project-card__tech span {
  font-size: 0.72rem;
  padding: 0.2rem 0.5rem;
  border: 1px solid rgba(255, 255, 255, 0.3);
  border-radius: 3px;
  color: rgba(255, 255, 255, 0.8);
}

.project-card__links {
  display: flex;
  gap: 1.5rem;
}

.project-card__link {
  font-size: 0.85rem;
  font-weight: 600;
  color: var(--color-accent);
  transition: color var(--transition-fast);
}

.project-card__link:hover {
  color: #ffffff;
}

/* ── Custom cursor expansion on project cards ── */
.custom-cursor--card {
  transform: translate(-50%, -50%) scale(2.5);
  mix-blend-mode: difference;
  opacity: 0.6;
  background: radial-gradient(circle, currentColor 40%, transparent 70%);
}


/* ================================================================
   9. RESUME & EXPERIENCE
   Two-column: timeline on left, skills/education on right.
   ================================================================ */

/* ── Floating resume image — sticky as you scroll ── */
.resume__floating-img {
  position: sticky;
  top: 120px;                              /* below the fixed navbar    */
  float: right;
  width: 580px;
  margin-left: var(--space-lg);
  margin-bottom: var(--space-md);
  z-index: 2;
  border-radius: 10px;
  overflow: hidden;
  box-shadow: 0 8px 40px rgba(0, 0, 0, 0.15),
              0 0 0 1px rgba(156, 159, 105, 0.3);
  border: 1px solid rgba(156, 159, 105, 0.4);  /* Willow Leaf accent  */
  animation: resume-float 5s ease-in-out infinite;
  transform-origin: center center;
}

.resume__floating-img img {
  width: 100%;
  height: auto;
  display: block;
}

@keyframes resume-float {
  0%, 100% { transform: translateY(0) rotate(0.5deg); }
  50%      { transform: translateY(-12px) rotate(-0.5deg); }
}

/* Respect reduced-motion */
@media (prefers-reduced-motion: reduce) {
  .resume__floating-img {
    animation: none;
  }
}

.resume__grid {
  display: grid;
  grid-template-columns: 1.3fr 1fr;
  gap: var(--space-xl);
}

.resume__category-title {
  font-size: 1.1rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.15em;
  margin-bottom: var(--space-md);
  color: var(--color-accent);
}

/* Timeline */
.timeline {
  position: relative;
  padding-left: 2.5rem;
}

/* Vertical line */
.timeline::before {
  content: '';
  position: absolute;
  left: 8px;
  top: 0;
  bottom: 0;
  width: 2px;
  background-color: var(--color-border);
}

.timeline__item {
  position: relative;
  margin-bottom: var(--space-lg);
}

.timeline__item:last-child {
  margin-bottom: 0;
}

/* Timeline dot */
.timeline__dot {
  position: absolute;
  left: -2.5rem;
  top: 0.35rem;
  width: 16px;
  height: 16px;
  border-radius: 50%;
  background-color: var(--color-bg);
  border: 3px solid var(--color-accent);
  z-index: 1;
  transition: background-color var(--transition-fast);
}

.timeline__item:hover .timeline__dot {
  background-color: var(--color-accent);
}

.timeline__content {
  padding-bottom: var(--space-sm);
}

.timeline__date {
  display: inline-block;
  font-size: 0.8rem;
  font-weight: 600;
  color: var(--color-accent);
  text-transform: uppercase;
  letter-spacing: 0.1em;
  margin-bottom: 0.5rem;
}

.timeline__role {
  font-size: 1.25rem;
  font-weight: 700;
  margin-bottom: 0.25rem;
}

.timeline__company {
  font-size: 0.95rem;
  color: var(--color-text-muted);
  font-style: italic;
  margin-bottom: 0.75rem;
}

.timeline__desc {
  font-size: 0.95rem;
  color: var(--color-text-muted);
  line-height: 1.7;
}

/* Skills Tags */
.resume__skills {
  display: flex;
  flex-wrap: wrap;
  gap: 0.6rem;
  margin-bottom: var(--space-lg);
}

.skill-tag {
  padding: 0.5rem 1.2rem;
  font-size: 0.8rem;
  font-weight: 500;
  border: 1px solid var(--color-border);
  border-radius: 100px;
  color: var(--color-text);
  transition: all var(--transition-fast);
  cursor: default;
}

.skill-tag:hover {
  background-color: var(--color-primary-mid);
  border-color: var(--color-primary-mid);
  color: #ffffff;
  transform: translateY(-2px);
}

/* Education */
.resume__education {
  margin-bottom: var(--space-lg);
}

.resume__edu-item {
  padding-bottom: var(--space-md);
  border-bottom: 1px solid var(--color-border);
  margin-bottom: var(--space-md);
}

/* Resume Download Button */
.resume__download {
  display: inline-flex;
  align-items: center;
  gap: 0.6rem;
  padding: 1rem 2rem;
  background-color: var(--color-primary);
  color: #ffffff;
  font-size: 0.85rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  border-radius: var(--border-radius);
  transition: all var(--transition-fast);
}

.resume__download:hover {
  background-color: var(--color-primary-mid);
  color: #ffffff;
  transform: translateY(-2px);
  box-shadow: var(--shadow-md);
}


/* ================================================================
   10. CONTACT
   Centered layout — info & social links only, no form.
   ================================================================ */

/* Centered contact block */
.contact__center {
  max-width: 640px;
  margin: 0 auto;
  text-align: center;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--space-md);
}

.contact__info-title {
  font-size: 2.2rem;
  margin-bottom: 0.25rem;
}

.contact__info-text {
  color: var(--color-text-muted);
  line-height: 1.7;
  max-width: 500px;
}

.contact__details {
  display: flex;
  gap: var(--space-xl);
  justify-content: center;
  margin-top: var(--space-sm);
}

.contact__info-block {
  text-align: center;
}

.contact__info-label {
  font-size: 0.8rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: var(--color-accent);
  margin-bottom: 0.3rem;
}

.contact__info-link {
  font-size: 1.05rem;
  font-weight: 500;
}

/* Social Links — large icons */
.contact__socials {
  display: flex;
  gap: 1.8rem;
  margin-top: var(--space-md);
  justify-content: center;
}

.contact__social-link {
  width: 72px;
  height: 72px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  border: 1px solid var(--color-border);
  color: var(--color-text);
  transition: all var(--transition-fast);
}

.contact__social-link:hover {
  background-color: var(--color-primary-mid);
  border-color: var(--color-primary-mid);
  color: #ffffff;
  transform: translateY(-3px);
  box-shadow: var(--shadow-md);
}


/* ================================================================
   11. FOOTER
   ================================================================ */
.footer {
  padding: var(--space-md);
  border-top: 1px solid var(--color-border);
}

.footer__container {
  max-width: var(--max-width);
  margin: 0 auto;
  display: flex;
  align-items: center;
  justify-content: space-between;
}

.footer__text {
  font-size: 0.85rem;
  color: var(--color-text-muted);
}

.footer__back-to-top {
  width: 40px;
  height: 40px;
  display: flex;
  align-items: center;
  justify-content: center;
  border: 1px solid var(--color-border);
  border-radius: 50%;
  color: var(--color-text);
  transition: all var(--transition-fast);
}

.footer__back-to-top:hover {
  background-color: var(--color-primary-mid);
  border-color: var(--color-primary-mid);
  color: #ffffff;
  transform: translateY(-3px);
}


/* ================================================================
   12. ANIMATIONS & REVEAL EFFECTS
   Elements with class "reveal" are hidden by default and animated
   into view via JavaScript (Intersection Observer). We define the
   initial hidden state and the visible state here.
   ================================================================ */

/* Base reveal: fade up */
.reveal {
  opacity: 0;
  transform: translateY(40px);
  transition: opacity 0.8s cubic-bezier(0.16, 1, 0.3, 1),
              transform 0.8s cubic-bezier(0.16, 1, 0.3, 1);
}

/* Slide from left */
.reveal--left {
  transform: translateX(-40px);
}

/* Slide from right */
.reveal--right {
  transform: translateX(40px);
}

/* When revealed by Intersection Observer */
.reveal--visible {
  opacity: 1;
  transform: translate(0, 0);
}

/* Stagger delay for children (optional, applied via JS) */
.reveal--delay-1 { transition-delay: 0.1s; }
.reveal--delay-2 { transition-delay: 0.2s; }
.reveal--delay-3 { transition-delay: 0.3s; }
.reveal--delay-4 { transition-delay: 0.4s; }


/* ================================================================
   13. CUSTOM CURSOR
   Replaces the system cursor with a color-toggling circle.
   Green (#364023) ↔ Pink (#efd4dd) on click.
   ================================================================ */

/* Hide system cursor everywhere */
*, *::before, *::after {
  cursor: none !important;
}

.custom-cursor {
  position: fixed;
  top: 0;
  left: 0;
  width: 24px;
  height: 24px;
  border-radius: 50%;
  background-color: #364023;
  pointer-events: none;
  z-index: 99999;
  transform: translate(-50%, -50%);
  transition: background-color 0.25s ease, transform 0.15s ease;
  mix-blend-mode: exclusion;
  will-change: top, left, transform;
}

/* Pink state — toggled via JS */
.custom-cursor--pink {
  background-color: #efd4dd;
}

/* Scale-up pop on click */
.custom-cursor--click {
  transform: translate(-50%, -50%) scale(1.6);
}

/* Enlarge on interactive elements for UX feedback */
a:hover ~ .custom-cursor,
button:hover ~ .custom-cursor,
.custom-cursor--hover {
  transform: translate(-50%, -50%) scale(1.5);
}

/* Disable custom cursor on touch devices */
@media (hover: none) and (pointer: coarse) {
  *, *::before, *::after {
    cursor: auto !important;
  }
  .custom-cursor {
    display: none;
  }
}

/* Disable orb animations on reduced-motion */
@media (prefers-reduced-motion: reduce) {
  .hero__orb {
    animation: none !important;
  }
}


/* ================================================================
   14. RESPONSIVE BREAKPOINTS
   Tablet: 1024px  |  Mobile: 768px  |  Small: 480px
   ================================================================ */

/* -- Tablet (max-width: 1024px) -- */
@media (max-width: 1024px) {
  .about__grid {
    grid-template-columns: 1fr;
    gap: var(--space-lg);
  }

  .about__image {
    aspect-ratio: 16 / 9;
  }

  .resume__grid {
    grid-template-columns: 1fr;
    gap: var(--space-lg);
  }

  /* Slightly smaller floating resume on tablet */
  .resume__floating-img {
    width: 420px;
  }

  .bubble-wrap {
    width: 380px;
  }

  .projects__grid {
    padding-left: calc(50vw - 190px);
    padding-right: calc(50vw - 190px);
  }

  .contact__details {
    flex-direction: column;
    gap: var(--space-md);
  }

  .contact__social-link {
    width: 60px;
    height: 60px;
  }
}

/* -- Mobile (max-width: 768px) -- */
@media (max-width: 768px) {
  :root {
    --section-padding: var(--space-lg) var(--space-sm);
  }

  .section {
    padding: var(--space-xl) var(--space-sm);
  }

  .section--dark {
    padding: var(--space-xl) var(--space-sm);
  }

  /* Shorter gradient blends on smaller screens */
  .section::before,
  .section--dark::before,
  .section--dark::after {
    height: 120px;
  }

  /* Navbar: hamburger visible, links hidden by default */
  .navbar__links {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100vh;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 2rem;
    background-color: var(--color-bg);
    opacity: 0;
    pointer-events: none;
    transition: opacity var(--transition-base);
    z-index: 999;
  }

  .navbar__links--open {
    opacity: 1;
    pointer-events: all;
  }

  .navbar__links--open .navbar__link {
    font-size: 1.2rem;
  }

  .navbar__hamburger {
    display: flex;
    z-index: 1001;
  }

  /* Hero adjustments */
  .hero__collage {
    inset: -30%;            /* extra overshoot to cover rotation gaps on small screens */
    gap: 10px;
  }

  .hero__photo {
    width: 220px;
    height: 160px;
    border-radius: 8px;
  }

  .hero__photo--wide  { width: 300px; }
  .hero__photo--tall  { width: 170px; }

  .hero__row-inner { gap: 10px; }

  .hero__glass {
    padding: 2.5rem 2rem;
    border-radius: 22px;
    max-width: 480px;
  }

  .hero__title {
    font-size: clamp(2.2rem, 9vw, 3.5rem);
  }

  /* About stats */
  .about__stats {
    gap: var(--space-md);
  }

  .about__stat-number {
    font-size: 2rem;
  }

  /* Hide floating resume on small screens — too cramped */
  .resume__floating-img {
    display: none;
  }

  /* Projects — smaller cards on mobile, still horizontal scroll */
  .bubble-wrap {
    width: 80vw;
    max-width: 340px;
  }

  .projects__grid {
    padding-left: calc(50vw - 40vw);
    padding-right: calc(50vw - 40vw);
  }

  .project-card {
    aspect-ratio: 4 / 3;
  }

  /* On mobile (no hover), show full-colour image + overlay */
  .project-card__image {
    filter: grayscale(0%) brightness(1);
  }

  .project-card__overlay {
    opacity: 1;
  }

  .project-card__title {
    opacity: 0;
  }

  .project-card[data-ref]::before {
    opacity: 0;
  }

  .projects__hint {
    display: none;
  }

  /* No bubbles on mobile */
  .bubble {
    display: none;
  }

  /* Hide corner brackets on mobile */
  .bubble-wrap::before,
  .bubble-wrap::after {
    display: none;
  }

  /* Drop cap smaller on mobile */
  .drop-cap {
    font-size: 3.5rem;
  }
}

/* -- Small screens (max-width: 480px) -- */
@media (max-width: 480px) {
  .about__stats {
    flex-direction: column;
    gap: var(--space-sm);
  }

  .hero__collage {
    inset: -40%;
    gap: 8px;
    transform: rotate(-6deg);    /* softer tilt on very small screens */
  }

  .hero__photo {
    width: 180px;
    height: 130px;
  }

  .hero__photo--wide  { width: 250px; }
  .hero__photo--tall  { width: 140px; }

  .hero__row-inner { gap: 8px; }

  .hero__glass {
    padding: 2rem 1.5rem;
    border-radius: 18px;
  }

  .hero__cta {
    padding: 0.75rem 1.4rem;
    font-size: 0.8rem;
  }
}
