/* Shared motion curves: entrances/exits and on-screen movement respectively. */ :root { --ease-out: cubic-bezier(0.23, 1, 0.32, 1); --ease-in-out: cubic-bezier(0.77, 0, 0.175, 1); } /* Four-second first-visit story: locate, place a pin, read, return to the site. Every keyframe changes only transform/opacity; no per-frame React work. */ .first-visit-intro { position: fixed; inset: 0; width: 100%; height: 100%; max-width: none; max-height: none; margin: 0; padding: 24px 24px 88px; border: 0; overflow: hidden; color: #f4eedb; background: radial-gradient( ellipse at 50% 38%, #1d392b, #0a1812 58%, #07100c ); } .first-visit-intro[open] { display: grid; place-items: center; animation: intro-opacity-in 250ms var(--ease-out) both, intro-opacity-out 250ms var(--ease-out) 3750ms forwards; } .first-visit-intro::backdrop { background: #07100c; animation: intro-opacity-in 250ms var(--ease-out) both, intro-opacity-out 250ms var(--ease-out) 3750ms forwards; } /* The native modal is above the custom cursor layer. */ html.has-site-cursor dialog.first-visit-intro, html.has-site-cursor dialog.first-visit-intro * { cursor: auto !important; } html.has-site-cursor dialog.first-visit-intro button { cursor: pointer !important; } .intro-cartography { position: absolute; inset: 0; pointer-events: none; background: repeating-linear-gradient(90deg, #b4ceaa0b 0 1px, transparent 1px 64px), repeating-linear-gradient(0deg, #b4ceaa0b 0 1px, transparent 1px 64px); mask-image: radial-gradient(ellipse at center, black 10%, transparent 70%); animation: intro-surface-in 500ms var(--ease-out) both, intro-surface-out 250ms var(--ease-out) 3500ms forwards; } .intro-content { position: relative; width: min(100%, 700px); display: grid; justify-items: center; gap: 20px; } .intro-map-stage { position: relative; width: 300px; height: 250px; animation: intro-surface-out 250ms var(--ease-out) 3500ms forwards; } .intro-map-enter { position: absolute; inset: 48px 50px 2px; animation: intro-surface-in 500ms var(--ease-out) 80ms both; } .intro-map-surface { position: relative; width: 200px; height: 200px; border: 1px solid #c4dd9b50; background: repeating-linear-gradient(90deg, transparent 0 24px, #d4eac714 24px 25px), repeating-linear-gradient(0deg, transparent 0 24px, #d4eac714 24px 25px), #365a39; box-shadow: -1px 1px 0 #29452b, -3px 3px 0 #29452b, -5px 5px 0 #1d3524, -7px 7px 0 #1d3524, -9px 9px 0 #15291d, -11px 11px 0 #15291d; transform: perspective(600px) rotateX(56deg) rotateZ(-35deg); overflow: hidden; } .intro-map-water { position: absolute; inset: 0 0 0 150px; background: #497b78; border-left: 12px solid #668c64; } .intro-map-path { position: absolute; left: 20px; top: 100px; width: 80px; height: 72px; border-right: 4px solid #d6c18c; border-bottom: 4px solid #d6c18c; } .intro-map-block { position: absolute; width: 24px; height: 24px; background: #8ea86b; border: 1px solid #d2ddb578; box-shadow: -4px 4px 0 #203c29; } .intro-map-block-one { left: 24px; top: 28px; } .intro-map-block-two { left: 52px; top: 28px; } .intro-map-block-three { left: 24px; top: 56px; } .intro-map-target { position: absolute; left: 82px; top: 82px; width: 34px; height: 34px; border: 1px solid #efcf8b; border-radius: 50%; animation: intro-target-align 500ms var(--ease-in-out) 600ms both; } .intro-pin-anchor { position: absolute; left: 118px; top: 83px; width: 64px; height: 72px; } .intro-pin { width: 64px; height: 72px; color: #f0c876; fill: #624d25; animation: intro-pin-place 500ms var(--ease-out) 540ms both; } .intro-coordinate, .intro-bearing { position: absolute; color: #a9c49d99; font: 10px/1.5 monospace; letter-spacing: 2px; animation: intro-opacity-in 300ms var(--ease-out) 300ms both; } .intro-coordinate { top: 190px; } .intro-coordinate-left { left: 0; } .intro-coordinate-right { right: 0; } .intro-bearing { top: 20px; left: 146px; color: #ebce92; } .intro-title { width: 100%; text-align: center; animation: intro-surface-out 250ms var(--ease-out) 3300ms forwards; } .intro-title .eyebrow { color: #d1ba83; font-size: 10px; letter-spacing: 3px; margin: 0 0 16px; animation: intro-surface-in 300ms var(--ease-out) 720ms both; } .intro-title h2 { margin: 0 0 16px; font: clamp(42px, 8vw, 78px) / 1.15 MineGeoPixel, monospace; letter-spacing: -2px; white-space: nowrap; } .intro-title h2 span { display: inline-block; animation: intro-surface-in 400ms var(--ease-out) 780ms both; } .intro-title h2 span + span { color: #cbe19b; animation-delay: 840ms; } .intro-subtitle { max-width: 420px; margin: 0 auto; color: #bdcbb8; font-size: clamp(13px, 2.4vw, 16px); line-height: 1.6; animation: intro-surface-in 300ms var(--ease-out) 900ms both; } .intro-skip.button { position: absolute; right: 28px; bottom: max(24px, env(safe-area-inset-bottom)); gap: 20px; min-height: 44px; border: 1px solid #c7d5ba50; background: #0d211b; color: #e6eddd; } .intro-skip span { color: #baa779; font: 11px monospace; } @keyframes intro-opacity-in { from { opacity: 0; } to { opacity: 1; } } @keyframes intro-opacity-out { from { opacity: 1; } to { opacity: 0; } } @keyframes intro-surface-in { from { opacity: 0; transform: translateY(12px) scale(0.96); } to { opacity: 1; transform: translateY(0) scale(1); } } @keyframes intro-surface-out { from { opacity: 1; transform: translateY(0) scale(1); } to { opacity: 0; transform: translateY(12px) scale(0.96); } } @keyframes intro-pin-place { from { opacity: 0; transform: translateY(-48%) scale(0.96); } to { opacity: 1; transform: translateY(0) scale(1); } } @keyframes intro-target-align { from { opacity: 0; transform: rotate(-45deg) scale(0.96); } to { opacity: 1; transform: rotate(0) scale(1); } } @media (max-width: 380px) { .first-visit-intro { padding-inline: 16px; } .intro-title h2 { font-size: 40px; } .intro-title .eyebrow { font-size: 9px; letter-spacing: 2px; } } @media (max-height: 540px) and (min-width: 560px) { .first-visit-intro { padding: 20px 28px 72px; } .intro-content { grid-template-columns: 240px 1fr; gap: 24px; width: min(100%, 750px); } .intro-map-stage { width: 240px; } .intro-map-enter { left: 20px; right: 20px; } .intro-pin-anchor { left: 88px; } .intro-bearing { left: 116px; } .intro-title { text-align: left; } .intro-title h2 { font-size: clamp(30px, 6vw, 55px); } .intro-title .eyebrow { letter-spacing: 1.5px; } } @media (prefers-reduced-motion: reduce) { /* Defensive CSS as well as the browser preference check before showModal. */ .first-visit-intro, .first-visit-intro *, .first-visit-intro::backdrop { animation: none !important; } } @media (max-height: 380px) and (min-width: 560px) { .intro-map-stage { height: 200px; } .intro-map-enter { top: 8px; } .intro-pin-anchor { top: 43px; } .intro-coordinate { top: 150px; } .intro-bearing { top: 0; } } .site-trailer { padding-top: 28px; } .site-trailer .eyebrow { display: flex; align-items: center; gap: 9px; } .trailer-duration { color: var(--muted); font: 12px monospace; white-space: nowrap; } .site-trailer-player { display: block; width: 100%; aspect-ratio: 16 / 9; background: #08130e; border: 1px solid var(--line); border-radius: 15px; object-fit: contain; } .trailer-caption { display: flex; justify-content: space-between; align-items: flex-start; gap: 30px; padding-top: 18px; } .trailer-caption p { max-width: 710px; margin: 0; color: var(--muted); font-size: 13px; } .trailer-caption .text-link { white-space: nowrap; font-size: 12px; } @media (max-width: 640px) { .trailer-caption { flex-direction: column; gap: 12px; } .site-trailer .section-heading { align-items: flex-start; gap: 15px; flex-direction: column; } }