  <style>
    /* ── Demo frame / shadow vars (same system as library.html) ─── */
    body .dn-mockup--framed .dn-mockup__bezel {
      background:              var(--demo-bezel-bg)      !important;
      border:                  var(--demo-bezel-border)  !important;
      padding:                 var(--demo-bezel-padding) !important;
      box-shadow:              var(--demo-shadow-outer), var(--demo-bezel-rim) !important;
      transition: background 0.3s, border-color 0.3s, box-shadow 0.3s, padding 0.3s;
    }
    /* backdrop-filter lives on the bezel's ::after pseudo per
       src/phone-mockup.css to avoid the rectangular-corner bleed bug. */
    body .dn-mockup--framed .dn-mockup__bezel::before {
      background: var(--demo-refraction) !important;
    }

    /* ── Scene stacking ────────────────────────────────────────────
       Multiple .dn-mockup__stage elements share .dn-mockup__screen.
       Each is position:absolute;inset:0 (from phone-mockup.css),
       so they naturally stack. We drive visibility via opacity only.
    ─────────────────────────────────────────────────────────────── */

    /* Solid floor so the glass bezel never shows through during fades */
    .dn-mockup__screen {
      background-color: var(--dn-color-bg-screen);
    }

    .dn-mockup__stage {
      opacity: 0;
      transition: opacity 0.75s ease;
    }
    .dn-mockup__stage.is-visible {
      opacity: 1;
    }

    /* ── Notification slide-down + fade ─────────────────────── */
    /* Short travel: starts just above resting position (behind the clock area) */
    .anim-notif {
      transform: translateY(-48px);
      opacity: 0;
      transition: transform 0.6s cubic-bezier(0.34, 1.10, 0.64, 1), opacity 0.35s ease;
    }
    .anim-notif.is-visible {
      transform: translateY(0);
      opacity: 1;
    }

    /* ── Notification tap ────────────────────────────────────── */
    @keyframes anim-notif-tap {
      0%   { transform: translateY(0) scale(1); }
      35%  { transform: translateY(0) scale(0.95); }
      70%  { transform: translateY(0) scale(1.015); }
      100% { transform: translateY(0) scale(1); }
    }
    .anim-notif.is-tapped {
      animation: anim-notif-tap 0.42s cubic-bezier(0.34, 1.2, 0.64, 1);
    }

    /* ── Note field active/typed states ───────────────────────── */
    /* Active border: interactive/primary (#003328) per design system */
    .anim-note-active .dn-mockup__note-input {
      background: #fff !important;
      border-color: var(--dn-color-primary) !important;
    }
    .anim-note-placeholder { transition: opacity 0.25s ease; }
    .anim-note-text {
      display: none;
      color: var(--dn-color-content-primary);
      font-size: 13px;
      line-height: 1.4;
    }
    .anim-cursor {
      display: none;
      color: var(--dn-color-brand);
      font-weight: 300;
      margin-left: 1px;
      animation: anim-blink 0.75s step-end infinite;
    }
    .anim-note-active .anim-note-placeholder { opacity: 0; pointer-events: none; }
    .anim-note-active .anim-note-text        { display: inline-flex; align-items: center; }
    @keyframes anim-blink { 0%, 100% { opacity: 1; } 50% { opacity: 0; } }

    /* ── Trip card fade on review ─────────────────────────────── */
    .dn-mockup__trip-card-large {
      transition: opacity 0.5s ease, transform 0.5s ease;
    }
    .anim-trip-reviewed .dn-mockup__trip-card-large {
      opacity: 0 !important;
      transform: translateY(-10px) !important;
      pointer-events: none;
    }

    /* ── Inbox zero overlay ───────────────────────────────────── */
    .anim-inbox-zero {
      position: absolute;
      inset: 0;
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
      gap: 10px;
      padding: 0 32px;
      opacity: 0;
      transition: opacity 0.5s ease 0.2s;
      pointer-events: none;
    }
    .anim-trip-reviewed .anim-inbox-zero { opacity: 1; }

    /* ── Send modal overlay ───────────────────────────────────── */
    .anim-modal-overlay {
      position: absolute;
      inset: 0;
      background: rgba(0, 0, 0, 0.5);
      display: flex;
      align-items: center;
      justify-content: center;
      padding: 0 16px;
      opacity: 0;
      transition: opacity 0.5s ease;
      pointer-events: none;
      z-index: 20;
    }
    .anim-modal-visible .anim-modal-overlay {
      opacity: 1;
      pointer-events: auto;
    }

    /* ── Form field fill-in ───────────────────────────────────── */
    .anim-field-wrap { position: relative; }
    .anim-field-value {
      position: absolute;
      inset: 0;
      opacity: 0;
      transition: opacity 0.4s ease;
      font-size: 13px;
      color: var(--dn-color-content-primary);
      display: flex;
      align-items: center;
      padding: 0 10px;
    }
    .anim-field-value.is-visible { opacity: 1; }
    .anim-field-placeholder { transition: opacity 0.4s ease; }
    .anim-field-value.is-visible ~ .anim-field-placeholder { opacity: 0; }

    /* ── Review button tap ───────────────────────────────────── */
    .anim-review-btn-pressed .dn-mockup__btn-review {
      opacity: 0.65 !important;
      transform: scale(0.97) !important;
      transition: opacity 0.15s, transform 0.15s !important;
    }

    /* ── Send pressed ─────────────────────────────────────────── */
    .anim-send-pressed .dn-mockup__modal-btn-send {
      opacity: 0.65 !important;
      transform: scale(0.97) !important;
      transition: opacity 0.15s, transform 0.15s !important;
    }

    /* ── Inbox scene: iOS app-open (slide up + fade) ─────────── */
    /* Base state: no transform transition so exit is opacity-only (no slide-down) */
    #scene-inbox {
      transform: scale(calc(100cqi / 390px)) translateY(60px);
      transition: opacity 0.75s ease;
    }
    /* Entering: slide up + fade with spring. Transition on .is-visible fires on enter. */
    #scene-inbox.is-visible {
      transform: scale(calc(100cqi / 390px)) translateY(0);
      opacity: 1;
      transition: opacity 0.8s ease, transform 0.8s cubic-bezier(0.2, 0.8, 0.3, 1);
    }

    /* ── Playback controls (Mobbin outlined pill on light bg) ─── */
    .ctrl-btn {
      display: inline-flex;
      align-items: center;
      gap: 6px;
      font-family: 'Inter', sans-serif;
      font-size: 12px;
      font-weight: 500;
      padding: 7px 16px;
      border-radius: 9999px;
      border: 1px solid var(--color-graphite);
      background: transparent;
      color: var(--color-midnight-forest);
      cursor: pointer;
      transition: background 0.15s, color 0.15s, border-color 0.15s;
      user-select: none;
    }
    .ctrl-btn:hover {
      background: var(--color-mist);
      border-color: var(--color-midnight-forest);
    }

    /* ── Progress bar ─────────────────────────────────────────── */
    .anim-progress-track {
      width: 360px;
      height: 4px;
      background: var(--color-slate-shadow);
      border-radius: 9999px;
      overflow: hidden;
      margin-top: 20px;
      cursor: pointer;
    }
    .anim-progress-fill {
      height: 100%;
      background: var(--color-midnight-forest);
      border-radius: inherit;
      width: 0%;
    }

    /* ── Timeline scene labels ────────────────────────────────── */
    .anim-scene-labels {
      width: 360px;
      display: flex;
      margin-top: 7px;
      font-family: 'Inter', sans-serif;
      font-size: 10px;
      color: var(--color-graphite);
    }
    .anim-scene-labels span { flex: 1; }
    .anim-scene-labels span:nth-child(2) { flex: 4.2; }
    .anim-scene-labels span:nth-child(3) { flex: 4.7; }
