    * { margin: 0; padding: 0; box-sizing: border-box; }
    .nowrap { white-space: nowrap; }

    body {
      background: #e8e3de;
      display: flex;
      justify-content: center;
      align-items: flex-start;
      min-height: 100vh;
      padding: 40px 20px 80px;
    }

    /* ── Card ── */
    .card {
      width: 585px;
      max-width: 90vw;
      background: #faf9f7;
      position: relative;
      overflow: clip; /* clip ribbons but does NOT break position:sticky */
      box-shadow: 0 10px 25px rgba(0,0,0,0.18);
    }

    /* ════════════════════════════
       HEADER
    ════════════════════════════ */
    .top-header {
      padding: 24px 24px 16px;
      position: relative;
      z-index: 20;
      background: #faf9f7;
    }

    .top-title {
      font-family: 'Montserrat', sans-serif;
      font-size: 24px;
      font-weight: 600;
      color: #111;
      letter-spacing: 0.03em;
      line-height: 1.4;
      margin-bottom: 8px;
      /* leave room for vinyl on the right */
      padding-right: 56px;
    }

    .header-right {
      text-align: right;
    }

    .tagline {
      font-family: 'Cormorant Garamond', serif;
      font-size: 25px;
      font-style: italic;
      color: #1a1a1a;
      letter-spacing: 0.03em;
      transition: transform 0.45s cubic-bezier(0.25, 1, 0.5, 1);
    }
    .tagline.shifted {
      transform: translateX(-52px);
    }

    .tagline .heart { display: inline; }

    .wedding-date {
      font-family: 'Montserrat', sans-serif;
      font-size: 19px;
      color: #555;
      letter-spacing: 0.06em;
      margin-top: 6px;
      transition: transform 0.45s cubic-bezier(0.25, 1, 0.5, 1) 0.05s;
    }
    .wedding-date.shifted {
      transform: translateX(-52px);
    }

    /* ════════════════════════════
       PHOTO SECTION
    ════════════════════════════ */
    .photo-section {
      position: relative;
      overflow: visible;
      padding-top: 15%;
      padding-bottom: 8px;  /* space for frame outer shadow ring */
    }

    /* ── Ribbon image overlay ── */
    .ribbon-img {
      position: absolute;
      top: 0;
      right: 3%;
      width: 95%;
      height: auto;
      z-index: 2;
      filter: drop-shadow(1px 2px 5px rgba(0,0,0,0.35));
      pointer-events: none;
    }

    /* ── Photo frame (above ribbons) ── */
    .photo-frame {
      position: relative;   /* flow element — height driven by image */
      width: 72%;
      margin: 0 auto;
      padding: 5px;
      min-height: 300px;    /* fallback when no image */
      overflow: visible;
      z-index: 3;
      /* Gilded frame — half thickness of nhagai */
      background: linear-gradient(145deg,
        #dcc8a8 0%, #c9ad85 25%, #bfa070 50%, #c9ad85 75%, #dcc8a8 100%);
      border: 1px solid #a08058;
      box-shadow:
        inset 0 1px 2px rgba(255,245,220,0.5),
        inset 0 -1px 2px rgba(100,60,20,0.15),
        0 0 0 2px #faf5ee,
        0 0 0 3px rgba(139,26,43,0.12),
        0 2px 6px rgba(160,128,88,0.12);
    }

    /* Inner decorative border — half thickness of nhagai */
    .photo-frame::before {
      content: '';
      position: absolute;
      top: 1.5px; right: 1.5px; bottom: 1.5px; left: 1.5px;
      border: 1px solid rgba(139,26,43,0.18);
      pointer-events: none;
      z-index: 15;
    }
    .photo-frame::after {
      content: '';
      position: absolute;
      top: 3px; right: 3px; bottom: 3px; left: 3px;
      border: 0.5px solid rgba(139,26,43,0.08);
      pointer-events: none;
      z-index: 15;
    }

    /* img: in normal flow, drives frame height, sits above placeholder */
    .photo-frame img.photo-img {
      position: relative !important;
      inset: auto !important;
      width: 100% !important;
      height: auto !important;
      object-fit: unset !important;
      display: block;
      z-index: 2;           /* above placeholder */
    }

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

    /* placeholder: absolute so it doesn't stack below the img */
    .photo-frame .photo-placeholder {
      position: absolute;
      inset: 0;
    }

    .photo-placeholder {
      width: 100%;
      min-height: 300px;
      background: linear-gradient(150deg, #ede5d8 0%, #cbbda5 55%, #aa9070 100%);
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
      gap: 10px;
      color: #8a7460;
    }

    .photo-placeholder svg {
      width: 36px;
      height: 36px;
      opacity: 0.4;
    }

    .photo-placeholder span {
      font-family: 'Montserrat', sans-serif;
      font-size: 11px;
      letter-spacing: 0.1em;
      opacity: 0.6;
    }

    /* ════════════════════════════
       BOTTOM TEXT
    ════════════════════════════ */
    .bottom-text {
      text-align: center;
      padding: 16px 30px 56px;
      position: relative;
      z-index: 10;
      background: #faf9f7;
    }

    .inv-label {
      display: block;
      font-family: 'Cormorant Garamond', serif;
      font-size: 22px;
      font-style: italic;
      font-weight: 400;
      color: #1a1a1a;
      letter-spacing: 0.12em;
      margin-bottom: 12px;
    }

    .couple-names {
      font-family: 'Cormorant Garamond', serif;
      font-size: 28px;
      font-style: italic;
      font-weight: 400;
      color: #1a1a1a;
      letter-spacing: 0.04em;
    }

    .couple-names .amp {
      font-size: 26px;
      color: #1a1a1a;
      margin: 0 8px;
    }

    /* ════════════════════════════
       MUSIC PLAYER
    ════════════════════════════ */
    .music-section {
      padding: 24px 24px 18px;
      background: #faf9f7;
      position: relative;
      z-index: 10;
    }

    .player-card {
      background: #e4e6f5;
      border-radius: 20px;
      padding: 20px 20px 16px;
      position: relative;
      box-shadow: 0 3px 12px rgba(60, 60, 100, 0.18), 0 1px 4px rgba(0,0,0,0.08);
    }

    .player-top {
      display: flex;
      align-items: flex-start;
      justify-content: space-between;
      margin-bottom: 10px;
    }

    .player-meta { flex: 1; padding-right: 10px; }

    .song-title {
      font-family: 'Montserrat', sans-serif;
      font-size: 16px;
      font-weight: 600;
      color: #1a1a2e;
      letter-spacing: 0.02em;
    }

    .playing-status {
      font-family: 'Montserrat', sans-serif;
      font-size: 13px;
      color: #5a5a80;
      margin-top: 4px;
      letter-spacing: 0.05em;
    }

    .player-thumb {
      width: 96px;
      height: 72px;
      border-radius: 10px;
      overflow: hidden;
      flex-shrink: 0;
      background: linear-gradient(135deg, #c8b89a, #9a7a5a);
    }

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

    .progress-row {
      display: flex;
      align-items: center;
      gap: 8px;
      margin-bottom: 10px;
    }

    .time-label {
      font-family: 'Montserrat', sans-serif;
      font-size: 10px;
      color: #5a5a80;
      white-space: nowrap;
      min-width: 32px;
    }
    .time-label.right { text-align: right; }

    .progress-track {
      flex: 1;
      height: 4px;
      background: #c8cadf;
      border-radius: 2px;
      position: relative;
    }

    .progress-fill {
      width: 40%;
      height: 100%;
      background: #3a3a5a;
      border-radius: 2px;
      position: relative;
    }

    .progress-fill::after {
      content: '';
      width: 10px;
      height: 10px;
      background: #3a3a5a;
      border-radius: 50%;
      position: absolute;
      right: -5px;
      top: -3px;
    }

    .player-controls {
      display: flex;
      align-items: center;
      justify-content: center;
      gap: 26px;
    }

    .ctrl-btn {
      background: none;
      border: none;
      cursor: pointer;
      padding: 0;
      display: flex;
      align-items: center;
      justify-content: center;
      color: #2a2a4a;
    }

    .ctrl-btn.play  svg { width: 36px; height: 36px; }
    .ctrl-btn.skip  svg { width: 20px; height: 20px; }
    .ctrl-btn.cast  svg { width: 18px; height: 18px; color: #5a5a80; }

    /* ── Heart icons ── */
    .heart-img {
      display: inline-block;
      width: 0.95em;
      height: 0.95em;
      vertical-align: -0.1em;
      object-fit: contain;
    }

    .heart-double-icon {
      display: inline-block;
      width: 1.3em;
      height: 0.85em;
      vertical-align: -0.06em;
    }

    /* ── Photo slot: overlays placeholder, fades in when loaded ── */
    img.photo-img {
      position: absolute;
      inset: 0;
      width: 100%;
      height: 100%;
      object-fit: cover;
      opacity: 0;
      transition: opacity 0.75s ease;
      z-index: 1;
      display: block;
    }
    /* Main photo frame: contain (show full photo, no crop) — overrides cover default */
    .photo-frame img.photo-img { object-fit: cover; }

    @media (prefers-reduced-motion: reduce) {
      img.photo-img { transition: none; }
    }
