/* ---------- Design tokens ---------- */
:root {
  --bg: #000000;
  --surface: #0a0a0a;
  --text-primary: #f5f5f7;
  --text-secondary: #86868b;
  --border: rgba(255, 255, 255, 0.1);
  --border-bright: rgba(255, 255, 255, 0.28);
  --glow: rgba(255, 255, 255, 0.07);
  --font-system: -apple-system, BlinkMacSystemFont, "SF Pro Display",
    "SF Pro Text", "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
  --ease-standard: cubic-bezier(0.22, 1, 0.36, 1);
}

/* ---------- Base ---------- */
*,
*::before,
*::after {
  box-sizing: border-box;
}

html {
  -webkit-text-size-adjust: 100%;
  scroll-behavior: smooth;
}

body {
  margin: 0;
  min-height: 100vh;
  background-color: var(--bg);
  color: var(--text-primary);
  font-family: var(--font-system);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
  /* Hard guarantee: nothing may ever cause horizontal page scroll. */
  overflow-x: clip;
}

::selection {
  background: rgba(255, 255, 255, 0.22);
}

.site {
  min-height: 100vh;
  min-height: 100dvh;
  display: flex;
  flex-direction: column;
}

/* ---------- Site-wide galaxy background ----------
   Fixed full-screen layer behind all content: layered starfields whose
   box-shadow clusters form a disc around the viewport center (vmax units
   keep the disc circular at any aspect ratio) and ORBIT it at different
   speeds/directions — a slow galaxy rotation (transform-only, compositor
   cheap), plus a desaturated nebula in slow swirl. Cards above are frosted
   glass; the hero text floats in space. No JS involved. */
.site-galaxy {
  position: fixed;
  inset: 0;
  z-index: 0;
  overflow: hidden;
  pointer-events: none;
}

/* Very subtle, desaturated nebula glow (cool + faint warm counter).
   inset -45%: oversized so the swirl never reveals clipped corners. */
.site-galaxy .nebula {
  position: absolute;
  inset: -45%;
  background:
    radial-gradient(ellipse 55% 65% at 72% 18%, rgba(158, 176, 205, 0.07), transparent 70%),
    radial-gradient(ellipse 45% 55% at 18% 82%, rgba(205, 188, 158, 0.05), transparent 70%);
  animation: nebula-spin 216s linear infinite;
  will-change: transform;
}

/* Star layers: tiny rounded dots pinned at the VIEWPORT CENTER; rotating
   a layer orbits its whole cluster around the page like a galaxy. */
.site-galaxy .stars {
  position: absolute;
  top: 50%;
  left: 50%;
  border-radius: 50%;
  background-color: transparent;
  will-change: opacity, transform;
}

/* Layer xs — 144 × 0.8px stars. */
.site-galaxy .stars-xs {
  width: 0.8px;
  height: 0.8px;
  box-shadow:
    19.9vmax 43.1vmax rgba(196, 160, 255, 0.86),
    -7vmax -60.1vmax rgba(255, 195, 140, 0.59),
    -22.5vmax 15.8vmax rgba(196, 160, 255, 0.73),
    14.7vmax -55.5vmax rgba(255, 195, 140, 0.48),
    20.4vmax -11.7vmax rgba(255, 195, 140, 0.64),
    37.4vmax -7.1vmax rgba(196, 160, 255, 0.45),
    75.7vmax -14.3vmax rgba(196, 160, 255, 0.58),
    10.7vmax 46.5vmax rgba(255, 255, 255, 0.56),
    39.8vmax -51.1vmax rgba(255, 195, 140, 0.45),
    7.2vmax -0.3vmax rgba(140, 230, 175, 0.37),
    -25.6vmax 63.8vmax rgba(196, 160, 255, 0.65),
    50.5vmax -53.9vmax rgba(255, 195, 140, 0.55),
    -0.5vmax 52.2vmax rgba(140, 190, 255, 0.74),
    38.3vmax 63.4vmax rgba(140, 230, 175, 0.72),
    14.3vmax 41.4vmax rgba(140, 190, 255, 0.35),
    46.8vmax 42vmax rgba(140, 190, 255, 0.42),
    25.7vmax -52.9vmax rgba(196, 160, 255, 0.64),
    -39.9vmax -66.2vmax rgba(140, 190, 255, 0.77),
    -0.4vmax 46.5vmax rgba(255, 255, 255, 0.86),
    60.4vmax 1.3vmax rgba(255, 255, 255, 0.64),
    -17.7vmax -65vmax rgba(140, 230, 175, 0.68),
    -60.4vmax 35.1vmax rgba(196, 160, 255, 0.4),
    -13.7vmax -60.9vmax rgba(196, 160, 255, 0.56),
    8.5vmax 37.9vmax rgba(255, 255, 255, 0.8),
    -40vmax -61.1vmax rgba(255, 255, 255, 0.62),
    2.1vmax -41.9vmax rgba(140, 230, 175, 0.62),
    -55.7vmax -35.8vmax rgba(140, 230, 175, 0.35),
    -35.2vmax -54.9vmax rgba(140, 230, 175, 0.53),
    62.6vmax 4.9vmax rgba(255, 195, 140, 0.79),
    31.5vmax -14.9vmax rgba(255, 195, 140, 0.89),
    69.6vmax 25.9vmax rgba(255, 255, 255, 0.86),
    57.1vmax 32.5vmax rgba(140, 190, 255, 0.85),
    67vmax 7.2vmax rgba(140, 230, 175, 0.87),
    46.4vmax -13.3vmax rgba(140, 230, 175, 0.57),
    -74.6vmax 19.6vmax rgba(196, 160, 255, 0.62),
    -65.3vmax 19.9vmax rgba(140, 190, 255, 0.69),
    -8.2vmax 27.2vmax rgba(255, 255, 255, 0.75),
    49.3vmax -32.5vmax rgba(140, 190, 255, 0.76),
    -47.4vmax -35.4vmax rgba(140, 190, 255, 0.58),
    -40.3vmax -2.1vmax rgba(196, 160, 255, 0.36),
    63.5vmax 15.5vmax rgba(140, 190, 255, 0.48),
    -9.7vmax 66.6vmax rgba(255, 195, 140, 0.72),
    -50.5vmax -34.6vmax rgba(255, 195, 140, 0.52),
    54.2vmax 25.9vmax rgba(140, 230, 175, 0.58),
    -40.7vmax -35.1vmax rgba(196, 160, 255, 0.77),
    -71vmax 17vmax rgba(255, 195, 140, 0.9),
    -11.2vmax 17.7vmax rgba(140, 190, 255, 0.48),
    44.5vmax 50.3vmax rgba(196, 160, 255, 0.38),
    -7.2vmax -35.2vmax rgba(196, 160, 255, 0.45),
    -71.2vmax -15.3vmax rgba(196, 160, 255, 0.89),
    -6.7vmax 41.1vmax rgba(140, 230, 175, 0.47),
    -8.6vmax -9.2vmax rgba(196, 160, 255, 0.87),
    -10.7vmax -56.3vmax rgba(255, 195, 140, 0.53),
    -43.6vmax -37.7vmax rgba(140, 230, 175, 0.38),
    12.3vmax -0.2vmax rgba(140, 230, 175, 0.45),
    -54.7vmax 27.5vmax rgba(255, 195, 140, 0.65),
    -72.3vmax -1vmax rgba(140, 190, 255, 0.77),
    -20.6vmax 1.1vmax rgba(140, 190, 255, 0.84),
    -35vmax -67.5vmax rgba(140, 190, 255, 0.83),
    6.4vmax -33.8vmax rgba(255, 195, 140, 0.64),
    -30.6vmax -9.7vmax rgba(196, 160, 255, 0.39),
    49vmax -46.3vmax rgba(255, 195, 140, 0.79),
    -5.8vmax -29.7vmax rgba(255, 195, 140, 0.45),
    -35.6vmax 26.3vmax rgba(140, 230, 175, 0.89),
    57vmax -53.2vmax rgba(140, 230, 175, 0.87),
    57.2vmax 10.4vmax rgba(255, 195, 140, 0.73),
    -14.5vmax 52.1vmax rgba(255, 195, 140, 0.82),
    -34.1vmax -16.4vmax rgba(255, 195, 140, 0.55),
    35.2vmax -32.8vmax rgba(140, 190, 255, 0.53),
    50.3vmax 42.4vmax rgba(140, 230, 175, 0.46),
    11.2vmax 28.6vmax rgba(255, 255, 255, 0.54),
    -17.8vmax 74.1vmax rgba(255, 255, 255, 0.84),
    -43.3vmax -18.8vmax rgba(140, 190, 255, 0.88),
    18.2vmax -30.5vmax rgba(255, 255, 255, 0.39),
    -38.2vmax 38.8vmax rgba(196, 160, 255, 0.83),
    -20vmax 35.6vmax rgba(255, 195, 140, 0.81),
    44.3vmax 63.9vmax rgba(140, 230, 175, 0.63),
    -8.3vmax 24.7vmax rgba(140, 190, 255, 0.68),
    -23.1vmax -23.1vmax rgba(140, 190, 255, 0.81),
    67.3vmax -24.7vmax rgba(255, 255, 255, 0.85),
    22.8vmax 35.3vmax rgba(196, 160, 255, 0.83),
    -48.4vmax 53vmax rgba(140, 230, 175, 0.75),
    -35.4vmax -49.4vmax rgba(255, 255, 255, 0.87),
    -17.5vmax 41.5vmax rgba(255, 195, 140, 0.37),
    -25.3vmax -28.3vmax rgba(196, 160, 255, 0.57),
    45.5vmax 62.8vmax rgba(255, 255, 255, 0.64),
    8.1vmax 49vmax rgba(140, 230, 175, 0.79),
    26.1vmax 65.6vmax rgba(255, 195, 140, 0.73),
    58.8vmax -0.8vmax rgba(140, 190, 255, 0.56),
    -67vmax 6vmax rgba(140, 230, 175, 0.49),
    -6.4vmax 50.5vmax rgba(140, 190, 255, 0.47),
    -20.9vmax 15.1vmax rgba(255, 255, 255, 0.78),
    -49.6vmax -26.1vmax rgba(255, 255, 255, 0.73),
    -59.6vmax -31.2vmax rgba(255, 195, 140, 0.55),
    41.1vmax 19.9vmax rgba(140, 230, 175, 0.53),
    -10.7vmax -18.4vmax rgba(140, 190, 255, 0.67),
    -48vmax 4.3vmax rgba(196, 160, 255, 0.88),
    76.8vmax -11.8vmax rgba(255, 255, 255, 0.88),
    28vmax 14vmax rgba(140, 230, 175, 0.79),
    -12.3vmax -10.4vmax rgba(255, 255, 255, 0.84),
    28.4vmax 70.4vmax rgba(196, 160, 255, 0.66),
    -17vmax 73.8vmax rgba(255, 195, 140, 0.5),
    71.3vmax -7.4vmax rgba(140, 190, 255, 0.38),
    -7.9vmax -38.9vmax rgba(140, 190, 255, 0.54),
    58.5vmax -20.1vmax rgba(140, 190, 255, 0.72),
    51.8vmax 29.2vmax rgba(255, 195, 140, 0.87),
    0.2vmax 44.9vmax rgba(255, 255, 255, 0.74),
    -24.4vmax -13vmax rgba(255, 255, 255, 0.72),
    59.9vmax -6.4vmax rgba(196, 160, 255, 0.63),
    -61vmax 5.8vmax rgba(140, 230, 175, 0.82),
    15.1vmax 31.7vmax rgba(140, 230, 175, 0.81),
    -49.9vmax -36.1vmax rgba(255, 195, 140, 0.51),
    -54.7vmax 38.9vmax rgba(140, 190, 255, 0.71),
    3.3vmax -67.4vmax rgba(196, 160, 255, 0.59),
    -38.1vmax -23.2vmax rgba(255, 255, 255, 0.83),
    -22.2vmax 20.8vmax rgba(255, 255, 255, 0.66),
    -10.1vmax 51.7vmax rgba(196, 160, 255, 0.38),
    37.4vmax -27.6vmax rgba(255, 195, 140, 0.65),
    -36vmax -65.8vmax rgba(255, 195, 140, 0.56),
    -1.1vmax -26.9vmax rgba(140, 230, 175, 0.57),
    -66.2vmax -26.5vmax rgba(255, 255, 255, 0.5),
    41.1vmax 37.8vmax rgba(140, 190, 255, 0.71),
    55.9vmax 1.5vmax rgba(255, 255, 255, 0.82),
    29.5vmax -68.8vmax rgba(255, 195, 140, 0.62),
    -55.4vmax -49.2vmax rgba(140, 230, 175, 0.7),
    -22.5vmax 50.9vmax rgba(140, 230, 175, 0.62),
    29.9vmax -15.9vmax rgba(140, 190, 255, 0.73),
    -15.4vmax 16.6vmax rgba(140, 230, 175, 0.48),
    41.5vmax -5.6vmax rgba(255, 255, 255, 0.44),
    -32.7vmax 17.7vmax rgba(255, 195, 140, 0.52),
    -37.8vmax -19.4vmax rgba(140, 190, 255, 0.87),
    34vmax -16.9vmax rgba(255, 195, 140, 0.51),
    -4.8vmax 45.9vmax rgba(140, 230, 175, 0.58),
    18.9vmax 21vmax rgba(255, 255, 255, 0.77),
    -47.8vmax -57.9vmax rgba(255, 255, 255, 0.85),
    -6.8vmax 12.8vmax rgba(255, 195, 140, 0.82),
    -0.7vmax 38.5vmax rgba(196, 160, 255, 0.68),
    0.3vmax -14vmax rgba(196, 160, 255, 0.69),
    9.4vmax 49.7vmax rgba(140, 230, 175, 0.42),
    -14.5vmax 30.2vmax rgba(140, 230, 175, 0.84),
    17.4vmax -11.6vmax rgba(255, 255, 255, 0.5),
    -6.6vmax -35.4vmax rgba(140, 230, 175, 0.58),
    -17.2vmax -47.6vmax rgba(196, 160, 255, 0.39),
    6.9vmax 69.4vmax rgba(140, 230, 175, 0.61);
  animation:
    twinkle-a 4.2s ease-in-out infinite alternate,
    spin-a 342s linear infinite;
}

/* Layer sm — 112 × 1.2px stars. */
.site-galaxy .stars-sm {
  width: 1.2px;
  height: 1.2px;
  box-shadow:
    -65.8vmax -9.5vmax rgba(140, 190, 255, 0.51),
    22.6vmax 13.8vmax rgba(255, 195, 140, 0.47),
    -10.1vmax 20.3vmax rgba(196, 160, 255, 0.73),
    -0.7vmax -52.7vmax rgba(140, 190, 255, 0.43),
    -14.1vmax 20.7vmax rgba(255, 195, 140, 0.4),
    -48.9vmax -47.3vmax rgba(140, 230, 175, 0.48),
    -52.1vmax -5.2vmax rgba(255, 195, 140, 0.53),
    26.9vmax -33.6vmax rgba(196, 160, 255, 0.82),
    -40.8vmax 4.3vmax rgba(140, 230, 175, 0.4),
    7.1vmax -39.7vmax rgba(255, 255, 255, 0.54),
    42.6vmax -64vmax rgba(140, 230, 175, 0.47),
    50.1vmax 40.4vmax rgba(140, 190, 255, 0.6),
    -54.1vmax -49.6vmax rgba(255, 195, 140, 0.71),
    36.9vmax -4.1vmax rgba(255, 255, 255, 0.61),
    -22.8vmax 14.8vmax rgba(196, 160, 255, 0.57),
    -19.6vmax -13.6vmax rgba(140, 190, 255, 0.59),
    -21.3vmax -55.1vmax rgba(196, 160, 255, 0.41),
    37.8vmax 65.4vmax rgba(255, 195, 140, 0.71),
    13.8vmax 60.6vmax rgba(196, 160, 255, 0.43),
    -4.4vmax -76.6vmax rgba(196, 160, 255, 0.54),
    33.1vmax 30.1vmax rgba(255, 195, 140, 0.51),
    -11.7vmax 38.5vmax rgba(140, 190, 255, 0.81),
    -26.2vmax -32.7vmax rgba(140, 230, 175, 0.59),
    42.9vmax -52.2vmax rgba(196, 160, 255, 0.71),
    44vmax -13.8vmax rgba(140, 230, 175, 0.52),
    -40.6vmax -14.7vmax rgba(140, 230, 175, 0.71),
    32.3vmax 16.3vmax rgba(140, 190, 255, 0.65),
    53.6vmax -25vmax rgba(140, 190, 255, 0.54),
    5.7vmax -22.7vmax rgba(140, 190, 255, 0.83),
    -34.3vmax 63.8vmax rgba(140, 190, 255, 0.63),
    -71.6vmax 29vmax rgba(255, 255, 255, 0.64),
    6.7vmax 37.5vmax rgba(255, 255, 255, 0.44),
    35vmax -0.7vmax rgba(196, 160, 255, 0.51),
    0.5vmax 33vmax rgba(196, 160, 255, 0.46),
    38.8vmax 60.5vmax rgba(255, 255, 255, 0.84),
    -29.3vmax -21.6vmax rgba(255, 255, 255, 0.38),
    -54.5vmax 12.3vmax rgba(140, 190, 255, 0.78),
    28.2vmax 52.3vmax rgba(255, 195, 140, 0.7),
    -61.7vmax 0.4vmax rgba(140, 230, 175, 0.65),
    51.6vmax 47.4vmax rgba(255, 195, 140, 0.51),
    44.3vmax -61vmax rgba(140, 190, 255, 0.54),
    -68.7vmax -7.7vmax rgba(255, 195, 140, 0.75),
    55.7vmax 49.3vmax rgba(140, 190, 255, 0.73),
    47.5vmax -41.3vmax rgba(255, 195, 140, 0.85),
    60.4vmax -16.5vmax rgba(140, 230, 175, 0.4),
    34.5vmax -42.6vmax rgba(140, 230, 175, 0.66),
    -44.4vmax 55.4vmax rgba(140, 230, 175, 0.44),
    -2.5vmax 23vmax rgba(255, 195, 140, 0.78),
    -22.9vmax -68.5vmax rgba(255, 255, 255, 0.42),
    16.7vmax -53.7vmax rgba(255, 255, 255, 0.68),
    38.2vmax 1.6vmax rgba(255, 255, 255, 0.55),
    28.5vmax -17.4vmax rgba(255, 195, 140, 0.35),
    -53.5vmax -55vmax rgba(140, 230, 175, 0.69),
    52.9vmax 14.3vmax rgba(255, 195, 140, 0.8),
    -63.5vmax -43.4vmax rgba(255, 195, 140, 0.5),
    27vmax 10.9vmax rgba(255, 195, 140, 0.7),
    24.9vmax -62.6vmax rgba(255, 195, 140, 0.59),
    -17.3vmax 22.1vmax rgba(140, 230, 175, 0.63),
    2.6vmax 41vmax rgba(140, 190, 255, 0.58),
    7.6vmax 21.8vmax rgba(140, 230, 175, 0.37),
    -62.6vmax -4.5vmax rgba(255, 195, 140, 0.75),
    32.4vmax 15.1vmax rgba(140, 190, 255, 0.74),
    -70.3vmax 31.6vmax rgba(196, 160, 255, 0.79),
    12.5vmax -47.8vmax rgba(140, 190, 255, 0.47),
    -62.2vmax -41.9vmax rgba(255, 195, 140, 0.55),
    24.6vmax -42.2vmax rgba(196, 160, 255, 0.7),
    44.5vmax -53.2vmax rgba(196, 160, 255, 0.7),
    21.1vmax 6vmax rgba(255, 255, 255, 0.67),
    -66.4vmax 31.7vmax rgba(140, 230, 175, 0.85),
    -46.2vmax 26.6vmax rgba(140, 190, 255, 0.58),
    74.1vmax -10.5vmax rgba(140, 230, 175, 0.74),
    61.9vmax -19.5vmax rgba(140, 190, 255, 0.54),
    62.2vmax -46.3vmax rgba(196, 160, 255, 0.63),
    2vmax -42.6vmax rgba(196, 160, 255, 0.65),
    -16.4vmax 48vmax rgba(255, 195, 140, 0.37),
    -56.4vmax -17.8vmax rgba(140, 190, 255, 0.65),
    74.6vmax -20.5vmax rgba(140, 190, 255, 0.59),
    -46.1vmax -39.9vmax rgba(255, 195, 140, 0.81),
    32.2vmax 34vmax rgba(255, 255, 255, 0.51),
    -55.7vmax 37.3vmax rgba(255, 195, 140, 0.67),
    -47.4vmax 10.1vmax rgba(255, 195, 140, 0.84),
    -21.7vmax 61.7vmax rgba(255, 255, 255, 0.72),
    -4.4vmax 31.2vmax rgba(196, 160, 255, 0.82),
    24.4vmax 59.1vmax rgba(255, 255, 255, 0.66),
    -19.8vmax 57.8vmax rgba(255, 255, 255, 0.82),
    25.9vmax 68vmax rgba(140, 230, 175, 0.38),
    37.5vmax 5vmax rgba(196, 160, 255, 0.72),
    -75.5vmax 18.7vmax rgba(255, 255, 255, 0.77),
    56.7vmax -40vmax rgba(140, 190, 255, 0.78),
    56.7vmax -0.9vmax rgba(255, 255, 255, 0.82),
    44.4vmax 9.7vmax rgba(255, 255, 255, 0.35),
    -24.5vmax 46.9vmax rgba(255, 195, 140, 0.6),
    49.8vmax -45.7vmax rgba(196, 160, 255, 0.38),
    52.5vmax 55.1vmax rgba(140, 230, 175, 0.78),
    71.3vmax 10.5vmax rgba(255, 255, 255, 0.59),
    11.2vmax 57.1vmax rgba(196, 160, 255, 0.65),
    -54.4vmax -49.2vmax rgba(140, 190, 255, 0.36),
    6.7vmax -50.1vmax rgba(140, 230, 175, 0.44),
    -29.9vmax 70.4vmax rgba(196, 160, 255, 0.69),
    67.7vmax 24.6vmax rgba(255, 255, 255, 0.7),
    -70.2vmax -13.8vmax rgba(140, 230, 175, 0.77),
    58.8vmax -30.4vmax rgba(255, 195, 140, 0.47),
    -54.5vmax 9.3vmax rgba(196, 160, 255, 0.78),
    -23.2vmax 26.2vmax rgba(196, 160, 255, 0.48),
    23.5vmax 17.5vmax rgba(255, 195, 140, 0.85),
    -73.3vmax 26vmax rgba(196, 160, 255, 0.5),
    -5.2vmax -29.7vmax rgba(196, 160, 255, 0.58),
    -15.5vmax 26.2vmax rgba(140, 230, 175, 0.8),
    30.9vmax -69.1vmax rgba(140, 230, 175, 0.67),
    -76.7vmax -3.7vmax rgba(255, 255, 255, 0.55),
    53.7vmax 18.7vmax rgba(196, 160, 255, 0.47),
    59.6vmax 40.4vmax rgba(255, 255, 255, 0.71);
  animation:
    twinkle-b 5.6s ease-in-out 0.8s infinite alternate,
    spin-b 306s linear infinite;
}

/* Layer md — 96 × 1.6px stars. */
.site-galaxy .stars-md {
  width: 1.6px;
  height: 1.6px;
  box-shadow:
    54.7vmax 52.5vmax rgba(140, 190, 255, 0.59),
    20.4vmax 10.5vmax rgba(140, 190, 255, 0.83),
    -19.6vmax 25.6vmax rgba(196, 160, 255, 0.55),
    23.3vmax -13.9vmax rgba(196, 160, 255, 0.82),
    19.9vmax -4.2vmax rgba(196, 160, 255, 0.48),
    -19.2vmax -46.5vmax rgba(255, 195, 140, 0.72),
    20vmax -54.1vmax rgba(196, 160, 255, 0.82),
    59.5vmax 6.6vmax rgba(140, 190, 255, 0.7),
    -47.2vmax -17.4vmax rgba(196, 160, 255, 0.8),
    -0.8vmax 34.2vmax rgba(255, 195, 140, 0.76),
    -67.2vmax -5.5vmax rgba(140, 230, 175, 0.72),
    -8vmax -64.1vmax rgba(255, 195, 140, 0.6),
    -54.5vmax 45.3vmax rgba(255, 195, 140, 0.89),
    30.9vmax 41vmax rgba(255, 255, 255, 0.84),
    62.9vmax -38.1vmax rgba(255, 195, 140, 0.76),
    8.3vmax -63.9vmax rgba(196, 160, 255, 0.63),
    9.4vmax -10.6vmax rgba(196, 160, 255, 0.53),
    -48vmax -36.8vmax rgba(140, 230, 175, 0.68),
    8.4vmax -41vmax rgba(255, 255, 255, 0.77),
    -8.2vmax 14.9vmax rgba(140, 230, 175, 0.7),
    4.4vmax -35.7vmax rgba(255, 255, 255, 0.86),
    26.3vmax 65vmax rgba(255, 195, 140, 0.41),
    42vmax -10.2vmax rgba(140, 230, 175, 0.78),
    50.9vmax 5.6vmax rgba(255, 195, 140, 0.59),
    -33.7vmax -5vmax rgba(140, 190, 255, 0.84),
    -27.8vmax 67.3vmax rgba(140, 230, 175, 0.61),
    18.4vmax -9.1vmax rgba(140, 230, 175, 0.68),
    50.5vmax -37.5vmax rgba(140, 190, 255, 0.57),
    -10.9vmax -66.7vmax rgba(140, 190, 255, 0.73),
    53.6vmax -31.1vmax rgba(255, 195, 140, 0.48),
    -9.5vmax -28.8vmax rgba(196, 160, 255, 0.71),
    36.5vmax 25.5vmax rgba(196, 160, 255, 0.41),
    9vmax -17.6vmax rgba(140, 190, 255, 0.66),
    5.7vmax 8.6vmax rgba(140, 230, 175, 0.41),
    -18.3vmax -7.1vmax rgba(255, 255, 255, 0.47),
    75.6vmax -1.2vmax rgba(140, 230, 175, 0.62),
    -1.9vmax -39.2vmax rgba(255, 255, 255, 0.49),
    22.9vmax 51.5vmax rgba(255, 195, 140, 0.78),
    36.7vmax 34.4vmax rgba(196, 160, 255, 0.87),
    35.5vmax 37.5vmax rgba(140, 190, 255, 0.74),
    48.5vmax 31.3vmax rgba(140, 230, 175, 0.59),
    -22.8vmax 19.5vmax rgba(255, 195, 140, 0.4),
    43.3vmax 43.5vmax rgba(140, 230, 175, 0.62),
    -6.9vmax -74.7vmax rgba(255, 255, 255, 0.86),
    -30.5vmax -26.6vmax rgba(140, 190, 255, 0.74),
    28.2vmax -33.3vmax rgba(140, 190, 255, 0.7),
    43.5vmax -45.1vmax rgba(140, 190, 255, 0.57),
    -57.1vmax 23.1vmax rgba(140, 190, 255, 0.65),
    -13.5vmax -20.5vmax rgba(255, 195, 140, 0.55),
    -31vmax -24.5vmax rgba(255, 195, 140, 0.74),
    66.7vmax -26.8vmax rgba(255, 255, 255, 0.75),
    -5.5vmax -9.3vmax rgba(196, 160, 255, 0.52),
    1.9vmax 16.6vmax rgba(140, 190, 255, 0.77),
    -31.3vmax -25.6vmax rgba(140, 230, 175, 0.5),
    4.7vmax 70vmax rgba(255, 255, 255, 0.67),
    15.6vmax 43vmax rgba(140, 190, 255, 0.68),
    -20.5vmax 55.8vmax rgba(140, 190, 255, 0.7),
    -31.6vmax -44.8vmax rgba(140, 190, 255, 0.41),
    25.8vmax 18.5vmax rgba(255, 195, 140, 0.66),
    8.9vmax -7.4vmax rgba(140, 190, 255, 0.84),
    -71.1vmax -23.4vmax rgba(255, 255, 255, 0.75),
    5.2vmax 6.9vmax rgba(255, 255, 255, 0.62),
    35.3vmax -51.5vmax rgba(196, 160, 255, 0.75),
    -1.5vmax 8.2vmax rgba(255, 195, 140, 0.56),
    -35.5vmax -18.5vmax rgba(255, 255, 255, 0.88),
    -43.9vmax -37vmax rgba(140, 230, 175, 0.78),
    -30.2vmax -45.3vmax rgba(255, 255, 255, 0.76),
    -33.3vmax 26.4vmax rgba(196, 160, 255, 0.61),
    61.3vmax -16.6vmax rgba(196, 160, 255, 0.56),
    -16.1vmax -27.5vmax rgba(255, 255, 255, 0.54),
    71.2vmax -25.5vmax rgba(255, 255, 255, 0.7),
    39.9vmax 59.4vmax rgba(140, 190, 255, 0.48),
    77.8vmax 4.1vmax rgba(255, 195, 140, 0.66),
    -38.7vmax 9.8vmax rgba(140, 230, 175, 0.75),
    -42.3vmax 62.6vmax rgba(255, 195, 140, 0.55),
    -37vmax -62.5vmax rgba(140, 190, 255, 0.79),
    -16vmax 45.8vmax rgba(196, 160, 255, 0.6),
    3.2vmax 27.9vmax rgba(255, 255, 255, 0.7),
    46.4vmax -2.5vmax rgba(255, 255, 255, 0.59),
    10.7vmax 60.9vmax rgba(140, 230, 175, 0.43),
    49vmax -50.3vmax rgba(255, 195, 140, 0.87),
    -14.1vmax -40.2vmax rgba(196, 160, 255, 0.52),
    25.5vmax 20.2vmax rgba(255, 255, 255, 0.7),
    31.6vmax 45.2vmax rgba(255, 195, 140, 0.49),
    19.7vmax -69.3vmax rgba(140, 230, 175, 0.85),
    5vmax -18.2vmax rgba(140, 230, 175, 0.55),
    56.7vmax -53.1vmax rgba(140, 230, 175, 0.71),
    -11.4vmax -7vmax rgba(140, 190, 255, 0.44),
    18.4vmax 73vmax rgba(140, 230, 175, 0.52),
    -25.9vmax -72.1vmax rgba(196, 160, 255, 0.67),
    49.7vmax 36.7vmax rgba(140, 230, 175, 0.74),
    -0.6vmax 24.5vmax rgba(255, 255, 255, 0.75),
    -18.5vmax -35.4vmax rgba(196, 160, 255, 0.56),
    32.1vmax -51.2vmax rgba(140, 230, 175, 0.62),
    31.7vmax 3.2vmax rgba(196, 160, 255, 0.63),
    -0.7vmax 71.4vmax rgba(140, 230, 175, 0.5);
  animation:
    twinkle-c 3.4s ease-in-out 0.4s infinite alternate,
    spin-a 270s linear infinite;
}

/* Layer lg — 80 × 2.2px stars. */
.site-galaxy .stars-lg {
  width: 2.2px;
  height: 2.2px;
  box-shadow:
    73.9vmax -6.6vmax rgba(196, 160, 255, 0.42),
    -24vmax 54.6vmax rgba(255, 195, 140, 0.81),
    -55.7vmax -8.5vmax rgba(255, 195, 140, 0.81),
    -52.2vmax -40.6vmax rgba(196, 160, 255, 0.49),
    -42.1vmax -13vmax rgba(196, 160, 255, 0.44),
    -48.5vmax -14.3vmax rgba(196, 160, 255, 0.66),
    -29.9vmax 43.7vmax rgba(255, 255, 255, 0.78),
    20.8vmax -66.4vmax rgba(255, 195, 140, 0.42),
    -52.3vmax 25.6vmax rgba(255, 255, 255, 0.54),
    -22.3vmax -26.7vmax rgba(255, 195, 140, 0.75),
    1.7vmax -38.2vmax rgba(255, 255, 255, 0.79),
    -42.7vmax -56.4vmax rgba(255, 195, 140, 0.83),
    -16.1vmax 14.2vmax rgba(255, 255, 255, 0.79),
    -3.6vmax -41.3vmax rgba(255, 255, 255, 0.73),
    5.9vmax 61.8vmax rgba(196, 160, 255, 0.8),
    -14.4vmax 62.4vmax rgba(140, 230, 175, 0.46),
    52.2vmax -29.3vmax rgba(140, 190, 255, 0.6),
    48.8vmax 5.4vmax rgba(255, 255, 255, 0.48),
    -44.6vmax -41.9vmax rgba(255, 255, 255, 0.49),
    -42.2vmax 20.6vmax rgba(140, 230, 175, 0.71),
    -44.4vmax -39.7vmax rgba(196, 160, 255, 0.71),
    -18.5vmax -47.3vmax rgba(196, 160, 255, 0.45),
    -58.8vmax 38.8vmax rgba(255, 255, 255, 0.52),
    9.2vmax 13.8vmax rgba(255, 195, 140, 0.49),
    17.1vmax -49.6vmax rgba(255, 255, 255, 0.66),
    -23.1vmax 30.6vmax rgba(255, 255, 255, 0.74),
    -52.6vmax 40.1vmax rgba(196, 160, 255, 0.84),
    -16.4vmax -59.9vmax rgba(196, 160, 255, 0.8),
    -31.3vmax 65.6vmax rgba(140, 230, 175, 0.75),
    8.5vmax 59.5vmax rgba(140, 190, 255, 0.74),
    31.6vmax 54.2vmax rgba(255, 255, 255, 0.51),
    42.9vmax -6.5vmax rgba(255, 255, 255, 0.81),
    -43.2vmax -41.8vmax rgba(140, 230, 175, 0.54),
    -24.5vmax 13.8vmax rgba(255, 255, 255, 0.63),
    -19.2vmax 67.6vmax rgba(255, 195, 140, 0.5),
    23.7vmax -70.9vmax rgba(140, 230, 175, 0.43),
    -66.3vmax 35.3vmax rgba(255, 195, 140, 0.82),
    65.3vmax -41.5vmax rgba(140, 230, 175, 0.84),
    19vmax -38.3vmax rgba(255, 255, 255, 0.64),
    -41.7vmax -23.4vmax rgba(140, 190, 255, 0.42),
    6.1vmax 57.8vmax rgba(140, 190, 255, 0.72),
    6.6vmax -48.1vmax rgba(140, 230, 175, 0.69),
    25.5vmax 54.8vmax rgba(140, 190, 255, 0.54),
    8.6vmax -26.6vmax rgba(196, 160, 255, 0.67),
    -43.9vmax -52.6vmax rgba(140, 230, 175, 0.64),
    67.9vmax -5.1vmax rgba(140, 190, 255, 0.78),
    -26.7vmax -45.1vmax rgba(255, 195, 140, 0.72),
    7.1vmax -32vmax rgba(196, 160, 255, 0.71),
    -23vmax 23.7vmax rgba(140, 230, 175, 0.76),
    40.8vmax -20.5vmax rgba(196, 160, 255, 0.6),
    -14.7vmax 39.3vmax rgba(140, 230, 175, 0.8),
    8.4vmax -11.3vmax rgba(140, 190, 255, 0.66),
    -9.5vmax -39.5vmax rgba(255, 255, 255, 0.63),
    -1.8vmax 32.6vmax rgba(196, 160, 255, 0.48),
    63.2vmax -26.9vmax rgba(255, 255, 255, 0.63),
    -19.6vmax -23.2vmax rgba(196, 160, 255, 0.49),
    20.9vmax 26vmax rgba(255, 255, 255, 0.52),
    46.1vmax -25.6vmax rgba(255, 195, 140, 0.81),
    52.9vmax -45.1vmax rgba(140, 190, 255, 0.46),
    41.6vmax 24.7vmax rgba(196, 160, 255, 0.46),
    -48vmax 14.8vmax rgba(140, 190, 255, 0.76),
    28.9vmax 30vmax rgba(140, 190, 255, 0.44),
    51.5vmax -57vmax rgba(140, 190, 255, 0.51),
    -38.6vmax 36.1vmax rgba(255, 195, 140, 0.78),
    72vmax -25.1vmax rgba(196, 160, 255, 0.54),
    14vmax -30.5vmax rgba(255, 195, 140, 0.78),
    55.3vmax 51.6vmax rgba(140, 230, 175, 0.53),
    -9.3vmax 4vmax rgba(140, 230, 175, 0.8),
    -45.4vmax -3.1vmax rgba(255, 195, 140, 0.47),
    3.4vmax -11vmax rgba(255, 195, 140, 0.76),
    -35vmax 66.4vmax rgba(140, 230, 175, 0.83),
    52.2vmax 47.3vmax rgba(196, 160, 255, 0.71),
    -35.5vmax 37vmax rgba(196, 160, 255, 0.71),
    -54.5vmax 15.4vmax rgba(140, 190, 255, 0.75),
    58.8vmax -40.7vmax rgba(255, 255, 255, 0.56),
    -17.1vmax -13.2vmax rgba(196, 160, 255, 0.58),
    45.3vmax -56.8vmax rgba(255, 195, 140, 0.47),
    -51.9vmax -28vmax rgba(255, 255, 255, 0.43),
    34.8vmax -15.4vmax rgba(255, 195, 140, 0.8),
    -10.5vmax -40.1vmax rgba(196, 160, 255, 0.49);
  animation:
    twinkle-a 4.8s ease-in-out 0.3s infinite alternate,
    spin-b 234s linear infinite;
}

/* Layer xl — 56 × 2.9px stars. */
.site-galaxy .stars-xl {
  width: 2.9px;
  height: 2.9px;
  box-shadow:
    61.1vmax 3vmax rgba(196, 160, 255, 0.66),
    -21.7vmax 28.5vmax rgba(255, 195, 140, 0.67),
    23.6vmax -55vmax rgba(140, 230, 175, 0.87),
    13.1vmax -4.1vmax rgba(140, 230, 175, 0.82),
    -19.7vmax 47.2vmax rgba(196, 160, 255, 0.95),
    15.5vmax 75.1vmax rgba(255, 255, 255, 1.0),
    8.5vmax 70.1vmax rgba(196, 160, 255, 0.96),
    23.4vmax 67.2vmax rgba(140, 230, 175, 0.85),
    -70.5vmax -29.6vmax rgba(140, 190, 255, 0.65),
    60.2vmax -4.7vmax rgba(255, 255, 255, 0.95),
    25.4vmax 55.5vmax rgba(196, 160, 255, 0.86),
    -8.6vmax -65.1vmax rgba(255, 255, 255, 0.8),
    15.5vmax -42vmax rgba(140, 230, 175, 0.82),
    15vmax 50.6vmax rgba(140, 230, 175, 0.89),
    0.6vmax 61.9vmax rgba(140, 230, 175, 0.86),
    49.6vmax 56.4vmax rgba(140, 190, 255, 0.71),
    -2.2vmax 71.8vmax rgba(255, 255, 255, 0.86),
    -18.7vmax -50vmax rgba(140, 230, 175, 0.99),
    38.6vmax -15.4vmax rgba(255, 255, 255, 0.72),
    -53vmax -41.3vmax rgba(196, 160, 255, 0.98),
    55.4vmax -1.6vmax rgba(255, 195, 140, 0.71),
    -0.1vmax 50.4vmax rgba(140, 190, 255, 0.69),
    -0.6vmax 60.6vmax rgba(255, 255, 255, 0.81),
    30.2vmax -38.7vmax rgba(255, 195, 140, 0.95),
    -45.6vmax -45vmax rgba(255, 255, 255, 0.83),
    -6.3vmax -43.8vmax rgba(255, 195, 140, 0.92),
    46.2vmax 21.1vmax rgba(140, 190, 255, 0.87),
    -35.9vmax -62.4vmax rgba(196, 160, 255, 0.97),
    18.6vmax -19.3vmax rgba(255, 195, 140, 0.76),
    -6.5vmax -52.1vmax rgba(196, 160, 255, 0.95),
    72.8vmax -8.1vmax rgba(140, 190, 255, 0.85),
    -45.3vmax 20.6vmax rgba(255, 195, 140, 0.79),
    -13.8vmax -11.1vmax rgba(255, 195, 140, 0.88),
    -68.6vmax -7.2vmax rgba(196, 160, 255, 0.98),
    8.1vmax -8.5vmax rgba(255, 255, 255, 0.86),
    -43.5vmax 37.8vmax rgba(140, 230, 175, 0.83),
    68.4vmax -22.4vmax rgba(255, 255, 255, 0.88),
    53.1vmax 49.6vmax rgba(196, 160, 255, 0.97),
    -14vmax 15vmax rgba(255, 255, 255, 0.75),
    -34.8vmax 22.8vmax rgba(196, 160, 255, 0.68),
    52.4vmax 10.3vmax rgba(140, 190, 255, 0.8),
    52.1vmax -22.5vmax rgba(255, 255, 255, 0.71),
    65.9vmax 3.4vmax rgba(255, 255, 255, 0.72),
    75.7vmax -7.6vmax rgba(255, 195, 140, 0.92),
    -64.7vmax -23.9vmax rgba(140, 230, 175, 0.86),
    -53.5vmax 46.8vmax rgba(140, 230, 175, 0.99),
    -5.2vmax 13.8vmax rgba(255, 255, 255, 0.83),
    68.6vmax -15.9vmax rgba(140, 190, 255, 0.99),
    -37.1vmax 32.2vmax rgba(196, 160, 255, 0.96),
    36vmax 45.3vmax rgba(196, 160, 255, 0.71),
    21.8vmax 40vmax rgba(140, 230, 175, 0.71),
    1.6vmax 60.2vmax rgba(255, 255, 255, 0.94),
    26.5vmax -19.9vmax rgba(140, 190, 255, 0.86),
    42.4vmax -35.3vmax rgba(255, 255, 255, 0.77),
    1.1vmax -77.1vmax rgba(255, 255, 255, 0.76),
    5.2vmax -5.3vmax rgba(140, 190, 255, 0.66);
  animation:
    twinkle-c 3.8s ease-in-out 0.6s infinite alternate,
    spin-a 198s linear infinite;
}

@keyframes twinkle-a {
  from {
    opacity: 0.5;
  }

  to {
    opacity: 0.95;
  }
}

@keyframes twinkle-b {
  from {
    opacity: 0.35;
  }

  to {
    opacity: 0.85;
  }
}

@keyframes twinkle-c {
  from {
    opacity: 0.55;
  }

  to {
    opacity: 1;
  }
}

/* Galaxy spin — each layer orbits the viewport center at its own pace;
   B runs counter-clockwise for depth. Full loops: transform-only. */
@keyframes spin-a {
  to {
    transform: rotate(360deg);
  }
}

@keyframes spin-b {
  to {
    transform: rotate(-360deg);
  }
}

@keyframes nebula-spin {
  to {
    transform: rotate(360deg);
  }
}

.site-main {
  position: relative;
  z-index: 1;
  flex: 1 0 auto;
}

.visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
  border: 0;
}

/* ---------- Entrance motion (staggered fade-in / slide-up) ---------- */
@keyframes fade-slide-up {
  from {
    opacity: 0;
    transform: translateY(28px);
  }

  to {
    opacity: 1;
    transform: translateY(0);
  }
}

.reveal {
  animation: fade-slide-up 0.9s var(--ease-standard) both;
}

.hero .reveal-1 {
  animation-delay: 0.1s;
}

.hero .reveal-2 {
  animation-delay: 0.28s;
}

.hero .reveal-3 {
  animation-delay: 0.45s;
}

/* Apps and links stagger in after the hero (same cadence per fold). */
.apps .app-item:nth-child(1) {
  animation-delay: 0.45s;
}

.apps .app-item:nth-child(2) {
  animation-delay: 0.57s;
}

.apps .app-item:nth-child(3) {
  animation-delay: 0.69s;
}

.apps .app-item:nth-child(4) {
  animation-delay: 0.81s;
}

.links .link-item:nth-child(1) {
  animation-delay: 0.45s;
}

.links .link-item:nth-child(2) {
  animation-delay: 0.57s;
}

.links .link-item:nth-child(3) {
  animation-delay: 0.69s;
}

.links .link-item:nth-child(4) {
  animation-delay: 0.81s;
}

/* ---------- Hero (first fold) ---------- */
.hero {
  position: relative;
  min-height: 100vh;
  /* svh: always fits, even with the mobile browser's dynamic bar visible. */
  min-height: 100svh;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
  padding: 2rem 1.5rem;
  padding-left: calc(1.5rem + env(safe-area-inset-left, 0px));
  padding-right: calc(1.5rem + env(safe-area-inset-right, 0px));
}

.hero-title {
  margin: 0;
  /* Never bleed off the edges on narrow phones: cap + wrap gracefully. */
  max-width: 100%;
  text-wrap: balance;
  font-size: clamp(2.75rem, 11vw, 7rem);
  font-weight: 700;
  letter-spacing: -0.032em;
  line-height: 1.05;
  color: var(--text-primary);
}

.hero-tagline {
  margin: 1.125rem 0 0;
  font-family: ui-monospace, "SF Mono", SFMono-Regular, Menlo, Consolas,
    "Liberation Mono", monospace;
  font-size: clamp(1.125rem, 3.2vw, 1.5rem);
  font-weight: 500;
  letter-spacing: 0;
  color: var(--text-secondary);
}

/* Terminal prompt: path in soft green (Blog tint), "$" dimmed, and a
   blinking block cursor — personality without breaking the elegance. */
.term-path {
  color: rgba(140, 230, 175, 0.85);
}

.term-prompt {
  margin-left: 0.5em;
  color: rgba(140, 230, 175, 0.85);
}

.term-cursor {
  display: inline-block;
  width: 0.58em;
  height: 1.05em;
  margin-left: 0.35em;
  vertical-align: text-bottom;
  background-color: rgba(140, 230, 175, 0.85);
  animation: cursor-blink 1.1s step-end infinite;
}

@keyframes cursor-blink {

  0%,
  100% {
    opacity: 1;
  }

  50% {
    opacity: 0;
  }
}

/* Scroll hint: discreet chevron anchored to the links section. */
.scroll-hint {
  position: absolute;
  /* Clear of the mobile home indicator / dynamic browser bar. */
  bottom: calc(1.5rem + env(safe-area-inset-bottom, 0px));
  left: 0;
  right: 0;
  /* >= 44px tall touch target around the 22px glyph. */
  padding: 0.75rem 0;
  text-align: center;
  color: var(--text-secondary);
  transition: color 0.25s var(--ease-standard);
  -webkit-tap-highlight-color: transparent;
}

.scroll-hint-icon {
  width: 1.375rem;
  height: 1.375rem;
  fill: none;
  stroke: currentColor;
  stroke-width: 2;
  stroke-linecap: round;
  stroke-linejoin: round;
  animation: hint-float 2.4s var(--ease-standard) 1.4s infinite;
}

@keyframes hint-float {

  0%,
  100% {
    transform: translateY(0);
    opacity: 0.75;
  }

  50% {
    transform: translateY(6px);
    opacity: 1;
  }
}

/* ---------- Apps & Links (second and third folds) ---------- */
.links,
.apps {
  min-height: 100vh;
  min-height: 100svh;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  padding: 4rem 1.5rem;
  padding-left: calc(1.5rem + env(safe-area-inset-left, 0px));
  padding-right: calc(1.5rem + env(safe-area-inset-right, 0px));
}

.links-grid {
  list-style: none;
  margin: 0;
  padding: 0;
  width: 100%;
  max-width: 35rem;
  /* Flex-item min-width:auto quirk: allow the grid to actually shrink. */
  min-width: 0;
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 1.25rem;
}

.link-item {
  display: block;
  min-width: 0;
}

/* Apps: same 2-up card sizing as the links grid, but as a centered flex
   row — any number of cards (1, 2, 3+) stays centered in the fold. */
.apps-grid {
  list-style: none;
  margin: 0;
  padding: 0;
  width: 100%;
  max-width: 35rem;
  min-width: 0;
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 1.25rem;
}

.app-item {
  display: block;
  min-width: 0;
  /* Half of the row minus half the gap — identical to a links-grid cell. */
  width: calc(50% - 0.625rem);
}

.link-card,
.app-card {
  position: relative;
  isolation: isolate;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 0.875rem;
  aspect-ratio: 1 / 1;
  padding: 1.25rem;
  text-align: center;
  /* Frosted glass over the site-wide galaxy: mostly transparent + blur. */
  background-color: rgba(255, 255, 255, 0.03);
  -webkit-backdrop-filter: blur(14px);
  backdrop-filter: blur(14px);
  border: 1px solid var(--border);
  border-radius: 1.375rem;
  color: var(--text-primary);
  text-decoration: none;
  -webkit-tap-highlight-color: transparent;
  transition:
    transform 0.25s var(--ease-standard),
    border-color 0.25s var(--ease-standard),
    box-shadow 0.25s var(--ease-standard),
    background-color 0.25s var(--ease-standard);
}

.link-card:focus-visible,
.app-card:focus-visible {
  outline: 2px solid var(--text-primary);
  outline-offset: 3px;
}

/* Spotlight: radial glow that follows the cursor. --mx/--my are updated by
   the tiny inline pointermove script; --glow is per-card (brand color).
   Sits below the starfield and the content; alpha kept low so text stays
   crisp. Falls back to a centered glow when there is no pointer/JS. */
.link-card::before,
.app-card::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  background: radial-gradient(500px circle at var(--mx, 50%) var(--my, 50%),
      var(--glow),
      transparent 45%);
  opacity: 0;
  transition: opacity 0.35s var(--ease-standard);
  pointer-events: none;
}

.link-card:focus-visible::before,
.app-card:focus-visible::before {
  opacity: 1;
}

/* Brand glow color per card (moderate saturation, glow not floodlight). */
.link-item:nth-child(1) .link-card {
  --glow: rgba(137, 87, 229, 0.15);
  /* GitHub — discreet purple */
}

.link-item:nth-child(2) .link-card {
  --glow: rgba(252, 109, 38, 0.14);
  /* GitLab — orange */
}

.link-item:nth-child(3) .link-card {
  --glow: rgba(10, 102, 194, 0.17);
  /* LinkedIn — blue */
}

.link-item:nth-child(4) .link-card {
  --glow: rgba(34, 197, 94, 0.16);
  /* Blog — emerald */
}

.app-item:nth-child(1) .app-card {
  --glow: rgba(239, 68, 68, 0.15);
  /* CALCULADORA AHA — red */
}

.link-icon {
  position: relative;
  z-index: 1;
  width: 1.75rem;
  height: 1.75rem;
  flex: none;
  fill: currentColor;
}

.link-text {
  position: relative;
  z-index: 1;
  display: flex;
  flex-direction: column;
  gap: 0.2rem;
  min-width: 0;
}

.link-name {
  font-size: 1.25rem;
  font-weight: 600;
  letter-spacing: -0.015em;
}

.link-handle {
  font-size: 0.9375rem;
  color: var(--text-secondary);
  letter-spacing: -0.005em;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* App card internals: full-color image icon + name + uppercase tag pill
   (the tag sits where the handle sits on link cards). */
.app-icon {
  position: relative;
  z-index: 1;
  width: 1.75rem;
  height: 1.75rem;
  flex: none;
  object-fit: contain;
}

.app-text {
  position: relative;
  z-index: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.45rem;
  min-width: 0;
}

.app-name {
  font-size: 1.25rem;
  font-weight: 600;
  letter-spacing: -0.015em;
}

/* Category tag: small, uppercase, tinted in the app's accent (red). */
.app-tag {
  padding: 0.2rem 0.55rem;
  font-size: 0.625rem;
  font-weight: 600;
  letter-spacing: 0.1em;
  line-height: 1.3;
  color: rgba(248, 113, 113, 0.95);
  background-color: rgba(239, 68, 68, 0.09);
  border: 1px solid rgba(239, 68, 68, 0.3);
  border-radius: 999px;
}

/* ---------- Hover effects (real pointers only) ----------
   On touch devices hover styles "stick" after the tap; scoping them to
   precise pointers keeps cards/arrow from getting stuck in the hover state. */
@media (hover: hover) and (pointer: fine) {

  .link-card:hover,
  .app-card:hover {
    transform: translateY(-3px);
    border-color: var(--border-bright);
    background-color: rgba(255, 255, 255, 0.06);
    box-shadow:
      0 14px 40px -10px var(--glow),
      0 0 0 1px rgba(255, 255, 255, 0.04);
  }

  .link-card:hover::before,
  .app-card:hover::before {
    opacity: 1;
  }

  .scroll-hint:hover {
    color: var(--text-primary);
  }
}

/* ---------- Footer ---------- */
.site-footer {
  position: relative;
  z-index: 1;
  flex: none;
  padding: 2.5rem 1.5rem 2rem;
  padding-left: calc(1.5rem + env(safe-area-inset-left, 0px));
  padding-right: calc(1.5rem + env(safe-area-inset-right, 0px));
  padding-bottom: calc(2rem + env(safe-area-inset-bottom, 0px));
  text-align: center;
}

.site-footer-text {
  margin: 0;
  color: var(--text-secondary);
  font-size: 0.75rem;
  font-weight: 400;
  letter-spacing: 0.12em;
  /* Wraps gracefully into two centered lines on narrow screens. */
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  column-gap: 0.5em;
}

/* ---------- Reduced motion ---------- */
@media (prefers-reduced-motion: reduce) {

  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }

  /* Galaxy: stars stay fully visible but static (no twinkle, no drift). */
  .stars {
    animation: none !important;
    opacity: 0.85;
  }

  /* Scroll hint: no floating animation. */
  .scroll-hint-icon {
    animation: none !important;
  }

  /* Site galaxy: static, no spin/swirl (stars covered by the .stars rule). */
  .site-galaxy .nebula {
    animation: none !important;
  }

  html {
    scroll-behavior: auto !important;
  }
}

/* ---------- Responsive ---------- */
@media (max-width: 40rem) {

  .links-grid,
  .apps-grid {
    gap: 0.875rem;
    max-width: 24rem;
  }

  .link-card,
  .app-card {
    padding: 1rem;
    gap: 0.625rem;
    border-radius: 1.125rem;
  }

  .link-icon,
  .app-icon {
    width: 1.5rem;
    height: 1.5rem;
  }

  .link-name,
  .app-name {
    font-size: 1.0625rem;
  }

  .link-handle {
    font-size: 0.8125rem;
  }

  .app-tag {
    font-size: 0.5625rem;
  }
}

@media (max-width: 22.5rem) {

  /* On very narrow screens the long blog handle doesn't fit the small
     squares — keep the hierarchy: icon + name only. (The app tag stays:
     it is the app's secondary information.) */
  .link-handle {
    display: none;
  }
}

@media (max-width: 22rem) {

  .links-grid,
  .apps-grid {
    gap: 0.625rem;
  }

  .link-card,
  .app-card {
    padding: 0.75rem;
    gap: 0.5rem;
    border-radius: 1rem;
  }

  .link-icon,
  .app-icon {
    width: 1.25rem;
    height: 1.25rem;
  }

  .link-name,
  .app-name {
    font-size: 0.9375rem;
  }
}