@import url('https://fonts.googleapis.com/css2?family=Press+Start+2P&display=swap'); /* ─── TOKENS ─────────────────────────────────────────────── */ :root { --black: #0f0f0f; --darkgray: #2d2d2d; --gray: #4a4a4a; --lightgray: #8a8a8a; --white: #e8e8e8; --cream: #f0e8c8; --dark-bg: #1a1a2e; --red: #c8003a; --red-hover: #e0004a; --blue: #0050a0; --blue-hover: #0068c8; --green: #008a1e; --green-hover:#00b026; --yellow: #f8c030; --dialog-bg: #f0e8c8; --dialog-bd: #202040; --hp-green: #50c020; --hp-yellow: #c8b000; --font: 'Press Start 2P', monospace; /* layout */ --app-w: 420px; --app-h: 680px; --safe-bottom: env(safe-area-inset-bottom, 0px); } /* ─── RESET ──────────────────────────────────────────────── */ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } /* ─── BODY ───────────────────────────────────────────────── */ html, body { height: 100%; overflow: hidden; background: #12082a; background-image: radial-gradient(ellipse at 20% 50%, rgba(80,0,120,.35) 0%, transparent 55%), radial-gradient(ellipse at 80% 50%, rgba(0,40,120,.35) 0%, transparent 55%); display: flex; align-items: center; justify-content: center; font-family: var(--font); } /* ─── APP SHELL ──────────────────────────────────────────── */ #app { position: relative; width: min(var(--app-w), 100vw); height: min(var(--app-h), 100dvh); background: var(--dark-bg); overflow: hidden; /* desktop: device frame */ border: 5px solid #111; border-radius: 6px; box-shadow: 0 0 0 2px #333, 0 0 40px rgba(100,80,200,.55), 0 0 90px rgba(80,60,180,.25); } /* scanline overlay */ #app::after { content: ''; position: absolute; inset: 0; background: repeating-linear-gradient( 0deg, transparent 0px, transparent 2px, rgba(0,0,0,.045) 2px, rgba(0,0,0,.045) 4px ); pointer-events: none; z-index: 900; } /* ─── MOBILE FULL-SCREEN ─────────────────────────────────── */ @media (max-width: 480px), (max-height: 720px) { html, body { align-items: flex-start; } #app { width: 100vw; height: 100dvh; border: none; border-radius: 0; box-shadow: none; } } /* ─── SCREENS ────────────────────────────────────────────── */ .screen { position: absolute; inset: 0; display: none; flex-direction: column; } .screen.active { display: flex; } /* ─── ANIMATIONS ─────────────────────────────────────────── */ @keyframes blink { 0%,100%{opacity:1}50%{opacity:0} } @keyframes fadeIn { from{opacity:0}to{opacity:1} } @keyframes slideUp { from{transform:translateY(16px);opacity:0}to{transform:translateY(0);opacity:1} } @keyframes bounce { 0%,100%{transform:translateY(0)}50%{transform:translateY(-7px)} } @keyframes pop { 0%{transform:scale(.5);opacity:0}65%{transform:scale(1.08)}100%{transform:scale(1);opacity:1} } @keyframes goldShimmer { 0%,100%{color:#f8c030;text-shadow:0 0 8px #f8c030}50%{color:#ffe878;text-shadow:0 0 18px #ffe878,0 0 36px #f8c030} } @keyframes correctPulse{ 0%,100%{background:#c8ffc8;border-color:var(--green)}50%{background:#e0ffe0} } @keyframes wrongShake { 0%,100%{transform:translateX(0)}25%{transform:translateX(-5px)}75%{transform:translateX(5px)} } @keyframes npcFloat { 0%,100%{transform:translateY(0)}50%{transform:translateY(-8px)} } @keyframes treeSway { 0%,100%{transform:rotate(-2deg)}50%{transform:rotate(2deg)} } .blink { animation: blink 1s step-end infinite; } /* ─── SHARED COMPONENTS ──────────────────────────────────── */ /* Dialog box — the heart of the Pokémon look */ .dialog-box { background: var(--dialog-bg); border: 4px solid var(--dialog-bd); position: relative; padding: 16px 14px 12px; flex-shrink: 0; } .dialog-box::before { content: ''; position: absolute; inset: 3px; border: 1px solid rgba(255,255,255,.45); pointer-events: none; } .dialog-speaker { font-size: 7px; color: var(--black); background: var(--dialog-bg); border: 3px solid var(--dialog-bd); padding: 3px 8px; position: absolute; top: -16px; left: 10px; white-space: nowrap; letter-spacing: .5px; } .dialog-text { font-size: clamp(6.5px, 1.8vw, 8px); line-height: 2; color: var(--black); padding-top: 2px; min-height: 52px; } .dialog-arrow { font-size: 10px; color: var(--black); text-align: right; margin-top: 4px; } /* Pixel buttons */ .btn-pixel { display: inline-block; font-family: var(--font); font-size: clamp(7px, 2vw, 9px); padding: 10px 16px; border: 3px solid var(--black); cursor: pointer; box-shadow: 3px 3px 0 var(--black); transition: transform .05s, box-shadow .05s; letter-spacing: .5px; color: var(--white); user-select: none; -webkit-tap-highlight-color: transparent; } .btn-pixel:active { transform: translate(3px,3px); box-shadow: none; } .btn-blue { background: var(--blue); } .btn-blue:hover { background: var(--blue-hover); } .btn-green { background: var(--green); } .btn-green:hover { background: var(--green-hover); } .btn-red { background: var(--red); } .btn-red:hover { background: var(--red-hover); } .btn-full { width: 100%; text-align: center; } /* Overworld background */ .overworld-bg { flex: 1; position: relative; overflow: hidden; background: repeating-linear-gradient(0deg, transparent 0,transparent 31px, rgba(0,80,0,.12) 31px, rgba(0,80,0,.12) 32px), repeating-linear-gradient(90deg, transparent 0,transparent 31px, rgba(0,80,0,.12) 31px, rgba(0,80,0,.12) 32px), linear-gradient(180deg, #6cb84e 0%, #58a83e 100%); } /* ─── BOOT ───────────────────────────────────────────────── */ #screen-boot { background: var(--white); align-items: center; justify-content: center; animation: fadeIn .4s ease; } .boot-logo { text-align: center; } .boot-gameboy { font-size: clamp(8px, 2.5vw, 11px); color: var(--black); letter-spacing: 4px; margin-bottom: 10px; } .boot-ding { font-size: 28px; margin-bottom: 8px; animation: goldShimmer 1.5s ease-in-out infinite; } .boot-copy { font-size: 6px; color: var(--gray); } /* ─── TITLE ──────────────────────────────────────────────── */ #screen-title { background: linear-gradient(180deg, #08031a 0%, #180a44 45%, #240e6a 75%, #120538 100%); overflow: hidden; } .title-bg { position: relative; width: 100%; height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center; } .title-stars { position: absolute; inset: 0; background-image: radial-gradient(1px 1px at 8% 12%, #fff 100%,transparent), radial-gradient(1px 1px at 22% 38%, #fff 100%,transparent), radial-gradient(1px 1px at 43% 8%, #fff 100%,transparent), radial-gradient(1px 1px at 58% 28%, #fff 100%,transparent), radial-gradient(1px 1px at 73% 14%, #fff 100%,transparent), radial-gradient(1px 1px at 87% 42%, #fff 100%,transparent), radial-gradient(1px 1px at 33% 62%, rgba(255,255,255,.5) 100%,transparent), radial-gradient(1px 1px at 52% 72%, rgba(255,255,255,.5) 100%,transparent), radial-gradient(2px 2px at 18% 82%, rgba(255,220,100,.8) 100%,transparent), radial-gradient(2px 2px at 78% 78%, rgba(255,220,100,.8) 100%,transparent); } .title-main { text-align: center; z-index: 1; padding: 24px 16px; } .title-logo { margin-bottom: 16px; line-height: 1; } .title-poke { font-size: clamp(30px, 11vw, 50px); color: var(--yellow); text-shadow: 4px 4px 0 #7a5800, 0 0 24px rgba(248,192,48,.5); animation: goldShimmer 3s ease-in-out infinite; display: inline-block; } .title-query { font-size: clamp(30px, 11vw, 50px); color: #60c8ff; text-shadow: 4px 4px 0 #003d70, 0 0 24px rgba(96,200,255,.5); display: inline-block; } .title-sub { font-size: clamp(6px, 1.8vw, 8px); color: rgba(255,255,255,.75); letter-spacing: 1px; margin: 10px 0 6px; } .title-edition { font-size: clamp(5.5px, 1.6vw, 7px); color: var(--yellow); margin-bottom: 24px; animation: goldShimmer 3s ease-in-out infinite; } .title-deco { font-size: clamp(22px, 6vw, 32px); margin-bottom: 28px; display: flex; gap: 16px; justify-content: center; } .title-deco span:nth-child(1) { animation: npcFloat 2.0s ease-in-out infinite; } .title-deco span:nth-child(2) { animation: npcFloat 2.4s ease-in-out infinite; } .title-deco span:nth-child(3) { animation: npcFloat 2.8s ease-in-out infinite; } .title-tap { font-size: clamp(7px, 2vw, 9px); color: var(--white); letter-spacing: 1px; } .title-footer { position: absolute; bottom: max(12px, var(--safe-bottom)); font-size: 6px; color: rgba(255,255,255,.3); letter-spacing: .5px; } /* ─── CONTINUE ───────────────────────────────────────────── */ #screen-continue { background: linear-gradient(180deg, #08031a 0%, #180a44 100%); align-items: center; justify-content: center; } .continue-bg { width: 90%; max-width: 340px; display: flex; flex-direction: column; align-items: center; gap: 16px; animation: fadeIn .5s ease; } .continue-logo { font-size: clamp(16px, 5vw, 22px); color: var(--yellow); text-shadow: 3px 3px 0 #7a5800; animation: goldShimmer 3s ease-in-out infinite; } .continue-logo span { color: #60c8ff; text-shadow: 3px 3px 0 #003d70; } .continue-card { width: 100%; background: var(--dialog-bg); border: 4px solid var(--dialog-bd); padding: 16px; display: flex; flex-direction: column; gap: 10px; box-shadow: 4px 4px 0 rgba(0,0,0,.5); } .continue-card-header { font-size: 8px; color: var(--black); margin-bottom: 4px; letter-spacing: 1px; } .save-row { display: flex; justify-content: space-between; align-items: center; font-size: clamp(6.5px, 1.8vw, 8px); } .save-lbl { color: var(--gray); } .save-val { color: var(--black); } .continue-or { font-size: 7px; color: rgba(255,255,255,.4); letter-spacing: 1px; } .continue-warn { font-size: 6px; color: rgba(255,80,80,.7); text-align: center; line-height: 1.8; min-height: 14px; } /* ─── NAME ENTRY ─────────────────────────────────────────── */ #screen-name { background: #c8b88a; padding: 14px 10px 10px; gap: 10px; } .name-dialog { flex-shrink: 0; } .name-entry-area { display: flex; flex-direction: column; align-items: center; gap: 8px; flex: 1; } .name-display-box { background: var(--white); border: 3px solid var(--black); padding: 8px 20px; font-size: clamp(14px, 4.5vw, 20px); color: var(--black); min-width: 180px; text-align: center; letter-spacing: 4px; box-shadow: inset 2px 2px 0 rgba(0,0,0,.2); } .keyboard-grid { display: grid; grid-template-columns: repeat(10, 1fr); gap: 3px; width: 100%; } .key-btn { background: var(--white); border: 2px solid var(--black); color: var(--black); font-family: var(--font); font-size: clamp(6px, 1.8vw, 8px); padding: clamp(5px, 1.5vw, 8px) 2px; cursor: pointer; text-align: center; box-shadow: 2px 2px 0 var(--darkgray); user-select: none; -webkit-tap-highlight-color: transparent; transition: transform .05s, box-shadow .05s; } .key-btn:active { transform: translate(2px,2px); box-shadow: none; } .name-controls { display: flex; gap: 12px; margin-top: 4px; } .btn-del { background: var(--red); } .btn-del:hover { background: var(--red-hover); } .btn-ok { background: var(--green); } .btn-ok:hover { background: var(--green-hover); } /* ─── INTRO ──────────────────────────────────────────────── */ #screen-intro { flex-direction: column-reverse; } .intro-dialog { margin: 10px; min-height: 90px; } .intro-npc { position: absolute; right: 22%; bottom: 30%; font-size: clamp(44px, 13vw, 64px); animation: npcFloat 2s ease-in-out infinite; filter: drop-shadow(2px 3px 0 rgba(0,0,0,.4)); } .intro-player { position: absolute; left: 22%; bottom: 28%; font-size: clamp(36px, 10vw, 52px); animation: bounce 1s ease-in-out infinite; filter: drop-shadow(2px 3px 0 rgba(0,0,0,.4)); } .tap-hint { font-size: 6px; color: var(--black); background: rgba(255,255,255,.6); text-align: center; padding: 4px; letter-spacing: 1px; flex-shrink: 0; } /* ─── MAP ────────────────────────────────────────────────── */ .map-header { background: var(--dark-bg); padding: 8px 12px; display: flex; align-items: center; justify-content: space-between; gap: 8px; border-bottom: 3px solid var(--black); flex-shrink: 0; } .map-left { display: flex; align-items: center; gap: 6px; } .map-pin { font-size: 12px; } .map-town-name { font-size: clamp(5.5px, 1.6vw, 7px); color: var(--yellow); letter-spacing: .5px; } .map-right { display: flex; align-items: center; gap: 6px; } .prog-bar-outer { width: 80px; height: 9px; background: var(--black); border: 2px solid var(--lightgray); overflow: hidden; } .prog-bar-inner { height: 100%; width: 0%; background: var(--hp-green); transition: width .5s ease; } .prog-text { font-size: 6px; color: var(--white); } .save-dot { font-size: 12px; animation: blink 3s ease-in-out infinite; } .map-world { position: relative; } .map-trees { position: absolute; top: 12%; left: 0; right: 0; display: flex; justify-content: space-around; padding: 0 8px; } .tree { font-size: clamp(24px, 7vw, 36px); display: inline-block; animation: treeSway 3s ease-in-out infinite; filter: drop-shadow(1px 2px 0 rgba(0,0,0,.3)); } .tree:nth-child(2) { animation-delay: .5s; } .tree:nth-child(3) { animation-delay: 1s; } .tree:nth-child(4) { animation-delay: 1.5s; } .tree:nth-child(5) { animation-delay: 2s; } .map-ground { position: absolute; bottom: 0; left: 0; right: 0; height: 32%; background: linear-gradient(180deg, #c0a060 0%, #a89050 100%); border-top: 3px solid #907840; } .map-npc-wrap { position: absolute; right: 20%; bottom: 30%; text-align: center; } .npc-bubble { font-size: 14px; font-family: var(--font); color: var(--black); background: var(--yellow); border: 2px solid var(--black); width: 20px; height: 20px; display: flex; align-items: center; justify-content: center; margin: 0 auto 2px; animation: bounce .7s ease-in-out infinite; } .map-npc { font-size: clamp(36px, 10vw, 52px); animation: npcFloat 1.8s ease-in-out infinite; filter: drop-shadow(2px 3px 0 rgba(0,0,0,.35)); cursor: pointer; } .map-player { position: absolute; left: 22%; bottom: 28%; font-size: clamp(32px, 9vw, 46px); animation: bounce 1.1s ease-in-out infinite; filter: drop-shadow(2px 3px 0 rgba(0,0,0,.35)); } .map-hud { background: var(--dialog-bg); border-top: 4px solid var(--dialog-bd); padding: 8px 10px; display: flex; gap: 0; flex-shrink: 0; } .hud-cell { flex: 1; text-align: center; border-right: 2px solid rgba(0,0,0,.15); padding: 0 4px; } .hud-cell:last-child { border-right: none; } .hud-lbl { font-size: 5.5px; color: var(--gray); margin-bottom: 3px; } .hud-val { font-size: clamp(7px, 2vw, 9px); color: var(--black); } .btn-walk { margin: 8px 10px max(8px, var(--safe-bottom)); width: calc(100% - 20px); font-size: clamp(7.5px, 2.2vw, 9px); padding: 12px; text-align: center; flex-shrink: 0; } /* ─── BATTLE ─────────────────────────────────────────────── */ #screen-battle { flex-direction: column; } .battle-scene { display: flex; justify-content: space-between; align-items: flex-end; padding: 10px 16px 6px; background: linear-gradient(180deg, #90c8f0 0%, #70b0e0 55%, #c8b880 55%, #b09860 100%); flex-shrink: 0; min-height: clamp(120px, 28vh, 180px); position: relative; } .battle-scene::after { content: ''; position: absolute; top: 55%; left: 0; right: 0; height: 2px; background: rgba(0,0,0,.18); } .battle-npc-side, .battle-player-side { display: flex; flex-direction: column; align-items: center; gap: 4px; } .battle-sprite { font-size: clamp(44px, 13vw, 64px); filter: drop-shadow(2px 3px 0 rgba(0,0,0,.3)); animation: npcFloat 2s ease-in-out infinite; } .battle-player-side .battle-sprite { animation: bounce 1s ease-in-out infinite; } .battle-name-tag { font-size: clamp(5.5px, 1.6vw, 7px); background: rgba(255,255,255,.8); border: 2px solid var(--black); padding: 2px 6px; color: var(--black); } .battle-dialog { margin: 8px; min-height: 80px; } .battle-choices { display: grid; grid-template-columns: 1fr 1fr; gap: 5px; padding: 5px 8px; flex-shrink: 0; } .choice-btn { background: var(--dialog-bg); border: 3px solid var(--dialog-bd); color: var(--black); font-family: var(--font); font-size: clamp(6px, 1.7vw, 7.5px); padding: clamp(7px,2vw,10px) clamp(6px,2vw,10px); cursor: pointer; text-align: left; line-height: 1.8; box-shadow: 2px 2px 0 var(--darkgray); word-break: break-word; hyphens: auto; transition: transform .06s, box-shadow .06s; -webkit-tap-highlight-color: transparent; position: relative; } .choice-btn::before { content: attr(data-letter) ' '; color: var(--blue); } .choice-btn:hover { background: #fffae0; border-color: var(--blue); transform: translate(-1px,-1px); box-shadow: 3px 3px 0 var(--darkgray); } .choice-btn:active { transform: translate(2px,2px); box-shadow: none; } .choice-btn.correct { background: #c8ffc8; border-color: var(--green); animation: correctPulse .5s ease 3; pointer-events: none; } .choice-btn.wrong { background: #ffc8c8; border-color: var(--red); animation: wrongShake .35s ease; pointer-events: none; } .choice-btn.disabled{ opacity: .5; pointer-events: none; } .battle-footer { background: var(--dark-bg); border-top: 3px solid var(--black); padding: clamp(5px,1.5vw,7px) 12px max(6px, var(--safe-bottom)); display: flex; justify-content: space-between; align-items: center; font-size: clamp(6px, 1.7vw, 8px); color: var(--yellow); flex-shrink: 0; } .kbd-hint { font-size: 5.5px; color: rgba(255,255,255,.35); } @media (max-width: 480px) { .kbd-hint { display: none; } } /* ─── RESULT ─────────────────────────────────────────────── */ #screen-result { background: rgba(0,0,0,.86); align-items: center; justify-content: center; } .result-box { background: var(--dialog-bg); border: 4px solid var(--dialog-bd); padding: clamp(18px,5vw,28px) clamp(14px,4vw,22px); width: clamp(280px, 88vw, 400px); text-align: center; box-shadow: 6px 6px 0 rgba(0,0,0,.5); animation: pop .4s cubic-bezier(.175,.885,.32,1.275); display: flex; flex-direction: column; gap: 10px; } .result-icon { font-size: clamp(28px, 9vw, 42px); } .result-label { font-size: clamp(12px, 4vw, 16px); } .result-label.correct { color: var(--green); text-shadow: 2px 2px 0 #003010; } .result-label.wrong { color: var(--red); text-shadow: 2px 2px 0 #400010; } .result-correct-ans { font-size: clamp(6px, 1.8vw, 7.5px); color: var(--green); background: rgba(0,160,30,.1); border: 2px solid rgba(0,160,30,.3); padding: 6px; text-align: left; line-height: 1.8; display: none; } .result-correct-ans.visible { display: block; } .result-explanation { font-size: clamp(6px, 1.8vw, 7.5px); color: var(--black); line-height: 2; text-align: left; padding: 8px; background: rgba(255,255,255,.5); border: 2px solid rgba(0,0,0,.15); } .result-pts { font-size: clamp(10px, 3vw, 13px); color: var(--yellow); text-shadow: 2px 2px 0 #604000; animation: goldShimmer 2s ease-in-out infinite; } /* ─── LEVEL UP ───────────────────────────────────────────── */ #screen-levelup { background: linear-gradient(135deg, #0f0630, #220e5e, #0a0a34); align-items: center; justify-content: center; } .levelup-box { text-align: center; padding: clamp(20px,5vw,32px) clamp(16px,4vw,24px); width: 90%; max-width: 360px; display: flex; flex-direction: column; gap: 14px; animation: fadeIn .5s ease; } .lu-stars { font-size: clamp(7px, 2vw, 9px); color: var(--yellow); text-shadow: 0 0 8px var(--yellow); letter-spacing: 1px; } .lu-sprite { font-size: clamp(56px, 16vw, 80px); animation: bounce 1s ease-in-out infinite; } .lu-text { font-size: clamp(7.5px, 2.2vw, 9px); color: var(--white); line-height: 2; } .lu-badge { font-size: clamp(7px, 2vw, 9px); color: var(--yellow); background: rgba(255,255,255,.08); border: 2px solid var(--yellow); padding: clamp(8px,2.5vw,12px); } .lu-prog-wrap { display: flex; flex-direction: column; gap: 5px; align-items: center; } .lu-prog-outer { width: 80%; height: 12px; background: var(--black); border: 2px solid var(--lightgray); overflow: hidden; } .lu-prog-inner { height: 100%; background: var(--hp-green); transition: width .8s ease; } .lu-prog-label { font-size: 7px; color: var(--white); } /* ─── COMPLETE ───────────────────────────────────────────── */ #screen-complete { background: linear-gradient(180deg, #08031a 0%, #180a44 100%); overflow: hidden; } .complete-scroll { overflow-y: auto; height: 100%; -webkit-overflow-scrolling: touch; } .complete-area { text-align: center; padding: clamp(20px,5vw,32px) clamp(14px,4vw,20px) max(24px,var(--safe-bottom)); display: flex; flex-direction: column; gap: 14px; align-items: center; animation: fadeIn .7s ease; } .complete-trophy { font-size: clamp(48px, 14vw, 68px); animation: goldShimmer 2s ease-in-out infinite; } .complete-title { font-size: clamp(18px, 6vw, 26px); color: var(--yellow); text-shadow: 3px 3px 0 #604000; animation: goldShimmer 2s ease-in-out infinite; } .complete-name { font-size: clamp(10px, 3vw, 14px); color: var(--white); } .complete-msg { font-size: clamp(6px, 1.7vw, 7.5px); color: rgba(255,255,255,.8); line-height: 2.2; max-width: 360px; text-align: left; } .complete-stats { font-size: clamp(7px, 2vw, 8.5px); color: var(--yellow); background: rgba(255,255,255,.08); border: 2px solid rgba(255,255,255,.15); padding: clamp(10px,3vw,16px); line-height: 2.6; width: 100%; max-width: 340px; text-align: left; white-space: pre-line; } .complete-badges { width: 100%; max-width: 340px; display: flex; flex-direction: column; gap: 6px; } .badge-row { font-size: clamp(6.5px, 1.8vw, 8px); color: var(--white); padding: 8px 10px; border: 2px solid rgba(248,192,48,.35); background: rgba(255,255,255,.04); text-align: left; } /* ─── TOAST ──────────────────────────────────────────────── */ .toast { position: absolute; bottom: max(20px, var(--safe-bottom)); left: 50%; transform: translateX(-50%); background: var(--dark-bg); border: 3px solid var(--yellow); color: var(--yellow); font-family: var(--font); font-size: clamp(6.5px, 1.8vw, 8px); padding: 10px 18px; z-index: 950; animation: slideUp .3s ease; white-space: nowrap; max-width: 90%; overflow: hidden; text-overflow: ellipsis; } .hidden { display: none !important; }