Files
pokesql/style.css
T

795 lines
24 KiB
CSS

@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; }