opensource / ruso-sasha-mision.html
🕵️
Misión Moscú
Juego de espías en la Guerra Fría. Ayudá a Sasha a elegir las palabras correctas en ruso antes de que se acabe el tiempo.
🇷🇺 Ruso HTML CSS JavaScript Timer Russian MIT License
1 archivo 1008 líneas MIT
Ver en AlpacaViajes Volver
ruso-sasha-mision.html 1008 líneas
HTML · CSS · JavaScript
1 <!DOCTYPE html>
2 class="tok-tag"><htmlclass="tok-attr"> lang="es"class="tok-tag">>
3 class="tok-tag"><headclass="tok-attr">class="tok-tag">>
4 class="tok-tag"><metaclass="tok-attr"> charset="UTF-8"class="tok-tag">>
5 class="tok-tag"><metaclass="tok-attr"> name="viewport" content="width=device-width, initial-scale=1.0"class="tok-tag">>
6 class="tok-tag"><titleclass="tok-attr">class="tok-tag">>Sasha — Misión Moscúclass="tok-tag"></titleclass="tok-attr">class="tok-tag">>
7 class="tok-tag"><linkclass="tok-attr"> href="class="tok-prop">https:class="tok-val">//fonts.googleapis.com/css2?family=Share+Tech+Mono&;family=class="tok-prop">Oswald:class="tok-val">wght@300;400;600&family=Noto+class="tok-prop">Sans:class="tok-val">ital,wght@0,300;0,400;1,300&display=swap" rel="stylesheet"class="tok-tag">>
8 class="tok-tag"><styleclass="tok-attr">class="tok-tag">>
9 :root {
10 class="tok-prop">--bg: class="tok-val">#080a08;
11 class="tok-prop">--surface: class="tok-val">#0d100d;
12 class="tok-prop">--panel: class="tok-val">#101410;
13 class="tok-prop">--red: class="tok-val">#cc1a1a;
14 class="tok-prop">--red-dim: class="tok-val">#7a1010;
15 class="tok-prop">--green: class="tok-val">#1aaa4a;
16 class="tok-prop">--green-dim: class="tok-val">#0d5525;
17 class="tok-prop">--amber: class="tok-val">#d4820a;
18 class="tok-prop">--text: class="tok-val">#c8cfc8;
19 class="tok-prop">--text-dim: class="tok-val">#556055;
20 class="tok-prop">--text-bright: class="tok-val">#e8f0e8;
21 class="tok-prop">--mono: class="tok-val">';Share Tech Mono', monospace;
22 class="tok-prop">--head: class="tok-val">';Oswald', sans-serif;
23 class="tok-prop">--body: class="tok-val">';Noto Sans', sans-serif;
24 class="tok-prop">--scanline: class="tok-val">rgba(0,255,60,0.03);
25 }
26
27 * { class="tok-prop">margin:class="tok-val">0; class="tok-prop">padding:class="tok-val">0; class="tok-prop">box-sizing:class="tok-val">border-box; }
28
29 body {
30 class="tok-prop">background: class="tok-val">class="tok-kw">var(--bg);
31 class="tok-prop">color: class="tok-val">class="tok-kw">var(--text);
32 class="tok-prop">font-family: class="tok-val">class="tok-kw">var(--body);
33 class="tok-prop">min-height: class="tok-val">100vh;
34 class="tok-prop">display: class="tok-val">flex;
35 class="tok-prop">align-items: class="tok-val">center;
36 class="tok-prop">justify-content: class="tok-val">center;
37 class="tok-prop">overflow-x: class="tok-val">hidden;
38 class="tok-prop">cursor: class="tok-val">crosshair;
39 class="tok-prop">position: class="tok-val">relative;
40 }
41
42 /* CRT scanlines */
43 class="tok-prop">body:class="tok-val">:before {
44 class="tok-prop">content: class="tok-val">';';
45 class="tok-prop">position: class="tok-val">fixed; class="tok-prop">inset: class="tok-val">0;
46 class="tok-prop">background: class="tok-val">repeating-linear-gradient(
47 0deg,
48 transparent,
49 transparent 2px,
50 class="tok-kw">var(--scanline) 2px,
51 class="tok-kw">var(--scanline) 4px
52 );
53 class="tok-prop">pointer-events: class="tok-val">none;
54 class="tok-prop">z-index: class="tok-val">999;
55 }
56
57 /* Vignette */
58 class="tok-prop">body:class="tok-val">:after {
59 class="tok-prop">content: class="tok-val">';';
60 class="tok-prop">position: class="tok-val">fixed; class="tok-prop">inset: class="tok-val">0;
61 class="tok-prop">background: class="tok-val">radial-gradient(ellipse at center, transparent 50%, rgba(0,0,0,0.8) 100%);
62 class="tok-prop">pointer-events: class="tok-val">none;
63 class="tok-prop">z-index: class="tok-val">998;
64 }
65
66 /* Noise texture */
67 .noise {
68 class="tok-prop">position: class="tok-val">fixed; class="tok-prop">inset: class="tok-val">0;
69 class="tok-prop">opacity: class="tok-val">0.03;
70 class="tok-prop">pointer-events: class="tok-val">none;
71 class="tok-prop">z-index: class="tok-val">997;
72 class="tok-prop">background-image: class="tok-val">url(";class="tok-prop">data:class="tok-val">image/svg+xml,%3Csvg viewBox=';0 0 256 256' xmlns='class="tok-prop">http:class="tok-val">//www.w3.org/2000/svg';%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E");
73 }
74
75 .wrapper {
76 class="tok-prop">width: class="tok-val">100%;
77 class="tok-prop">max-width: class="tok-val">700px;
78 class="tok-prop">min-height: class="tok-val">100vh;
79 class="tok-prop">display: class="tok-val">flex;
80 class="tok-prop">flex-direction: class="tok-val">column;
81 class="tok-prop">align-items: class="tok-val">center;
82 class="tok-prop">justify-content: class="tok-val">center;
83 class="tok-prop">padding: class="tok-val">40px 20px;
84 class="tok-prop">position: class="tok-val">relative;
85 class="tok-prop">z-index: class="tok-val">1;
86 }
87
88 /* ── SCREENS ── */
89 .screen { class="tok-prop">display: class="tok-val">none; class="tok-prop">width: class="tok-val">100%; class="tok-prop">flex-direction: class="tok-val">column; class="tok-prop">align-items: class="tok-val">center; }
90 .screen.active { class="tok-prop">display: class="tok-val">flex; class="tok-prop">animation: class="tok-val">flicker 0.4s ease both; }
91
92 @keyframes flicker {
93 0% { class="tok-prop">opacity: class="tok-val">0; }
94 20% { class="tok-prop">opacity: class="tok-val">0.8; }
95 40% { class="tok-prop">opacity: class="tok-val">0.3; }
96 60% { class="tok-prop">opacity: class="tok-val">0.9; }
97 80% { class="tok-prop">opacity: class="tok-val">0.5; }
98 100%{ class="tok-prop">opacity: class="tok-val">1; }
99 }
100
101 /* ── HEADER DECO ── */
102 .top-bar {
103 class="tok-prop">width: class="tok-val">100%;
104 class="tok-prop">display: class="tok-val">flex;
105 class="tok-prop">justify-content: class="tok-val">space-between;
106 class="tok-prop">align-items: class="tok-val">center;
107 class="tok-prop">border-bottom: class="tok-val">1px solid rgba(204,26,26,0.3);
108 class="tok-prop">padding-bottom: class="tok-val">10px;
109 class="tok-prop">margin-bottom: class="tok-val">32px;
110 class="tok-prop">font-family: class="tok-val">class="tok-kw">var(--mono);
111 class="tok-prop">font-size: class="tok-val">10px;
112 class="tok-prop">color: class="tok-val">class="tok-kw">var(--text-dim);
113 class="tok-prop">letter-spacing: class="tok-val">2px;
114 }
115
116 .top-bar .red { class="tok-prop">color: class="tok-val">class="tok-kw">var(--red); }
117 .top-bar .blink {
118 class="tok-prop">animation: class="tok-val">blink 1.2s step-end infinite;
119 }
120 @keyframes blink { 50% { class="tok-prop">opacity: class="tok-val">0; } }
121
122 /* ── INTRO ── */
123 .classified-stamp {
124 class="tok-prop">font-family: class="tok-val">class="tok-kw">var(--head);
125 class="tok-prop">font-size: class="tok-val">11px;
126 class="tok-prop">font-weight: class="tok-val">600;
127 class="tok-prop">letter-spacing: class="tok-val">8px;
128 class="tok-prop">color: class="tok-val">class="tok-kw">var(--red);
129 class="tok-prop">border: class="tok-val">2px solid class="tok-kw">var(--red);
130 class="tok-prop">padding: class="tok-val">4px 16px;
131 class="tok-prop">margin-bottom: class="tok-val">28px;
132 class="tok-prop">opacity: class="tok-val">0.8;
133 class="tok-prop">transform: class="tok-val">rotate(-2deg);
134 class="tok-prop">display: class="tok-val">inline-block;
135 }
136
137 .intro-title {
138 class="tok-prop">font-family: class="tok-val">class="tok-kw">var(--head);
139 class="tok-prop">font-size: class="tok-val">clamp(2rem, 7vw, 3.8rem);
140 class="tok-prop">font-weight: class="tok-val">600;
141 class="tok-prop">color: class="tok-val">class="tok-kw">var(--text-bright);
142 class="tok-prop">letter-spacing: class="tok-val">4px;
143 class="tok-prop">text-align: class="tok-val">center;
144 class="tok-prop">line-height: class="tok-val">1.1;
145 class="tok-prop">margin-bottom: class="tok-val">4px;
146 class="tok-prop">text-shadow: class="tok-val">0 0 40px rgba(204,26,26,0.3);
147 }
148
149 .intro-cyrillic {
150 class="tok-prop">font-family: class="tok-val">class="tok-kw">var(--mono);
151 class="tok-prop">font-size: class="tok-val">13px;
152 class="tok-prop">color: class="tok-val">class="tok-kw">var(--text-dim);
153 class="tok-prop">letter-spacing: class="tok-val">6px;
154 class="tok-prop">margin-bottom: class="tok-val">40px;
155 class="tok-prop">text-align: class="tok-val">center;
156 }
157
158 /* Terminal box */
159 .terminal {
160 class="tok-prop">background: class="tok-val">class="tok-kw">var(--panel);
161 class="tok-prop">border: class="tok-val">1px solid rgba(26,170,74,0.2);
162 class="tok-prop">border-left: class="tok-val">3px solid class="tok-kw">var(--green);
163 class="tok-prop">padding: class="tok-val">28px 32px;
164 class="tok-prop">width: class="tok-val">100%;
165 class="tok-prop">max-width: class="tok-val">580px;
166 class="tok-prop">margin-bottom: class="tok-val">32px;
167 class="tok-prop">position: class="tok-val">relative;
168 class="tok-prop">box-shadow: class="tok-val">0 0 40px rgba(26,170,74,0.05), inset 0 0 60px rgba(0,0,0,0.5);
169 }
170
171 .terminal-header {
172 class="tok-prop">font-family: class="tok-val">class="tok-kw">var(--mono);
173 class="tok-prop">font-size: class="tok-val">10px;
174 class="tok-prop">color: class="tok-val">class="tok-kw">var(--green);
175 class="tok-prop">letter-spacing: class="tok-val">3px;
176 class="tok-prop">margin-bottom: class="tok-val">18px;
177 class="tok-prop">display: class="tok-val">flex;
178 class="tok-prop">align-items: class="tok-val">center;
179 class="tok-prop">gap: class="tok-val">8px;
180 }
181
182 .terminal-dot {
183 class="tok-prop">width: class="tok-val">6px; class="tok-prop">height: class="tok-val">6px;
184 class="tok-prop">border-radius: class="tok-val">50%;
185 class="tok-prop">background: class="tok-val">class="tok-kw">var(--green);
186 class="tok-prop">box-shadow: class="tok-val">0 0 8px class="tok-kw">var(--green);
187 class="tok-prop">animation: class="tok-val">blink 1.4s step-end infinite;
188 }
189
190 .terminal-text {
191 class="tok-prop">font-family: class="tok-val">class="tok-kw">var(--mono);
192 class="tok-prop">font-size: class="tok-val">13px;
193 class="tok-prop">color: class="tok-val">class="tok-kw">var(--text);
194 class="tok-prop">line-height: class="tok-val">2;
195 }
196
197 .terminal-text .highlight { class="tok-prop">color: class="tok-val">class="tok-kw">var(--amber); }
198 .terminal-text .danger { class="tok-prop">color: class="tok-val">class="tok-kw">var(--red); }
199 .terminal-text .name { class="tok-prop">color: class="tok-val">class="tok-kw">var(--green); class="tok-prop">font-weight: class="tok-val">bold; }
200
201 .class="tok-prop">cursor-blink:class="tok-val">:after {
202 class="tok-prop">content: class="tok-val">';█';
203 class="tok-prop">animation: class="tok-val">blink 0.8s step-end infinite;
204 class="tok-prop">color: class="tok-val">class="tok-kw">var(--green);
205 class="tok-prop">font-size: class="tok-val">12px;
206 }
207
208 /* Buttons */
209 .btn-mission {
210 class="tok-prop">background: class="tok-val">transparent;
211 class="tok-prop">border: class="tok-val">1px solid class="tok-kw">var(--red);
212 class="tok-prop">color: class="tok-val">class="tok-kw">var(--red);
213 class="tok-prop">padding: class="tok-val">14px 48px;
214 class="tok-prop">font-family: class="tok-val">class="tok-kw">var(--head);
215 class="tok-prop">font-size: class="tok-val">14px;
216 class="tok-prop">font-weight: class="tok-val">600;
217 class="tok-prop">letter-spacing: class="tok-val">6px;
218 class="tok-prop">text-transform: class="tok-val">uppercase;
219 class="tok-prop">cursor: class="tok-val">crosshair;
220 class="tok-prop">transition: class="tok-val">all 0.2s ease;
221 class="tok-prop">position: class="tok-val">relative;
222 class="tok-prop">overflow: class="tok-val">hidden;
223 }
224
225 .class="tok-prop">btn-mission:class="tok-val">:before {
226 class="tok-prop">content: class="tok-val">';';
227 class="tok-prop">position: class="tok-val">absolute;
228 class="tok-prop">inset: class="tok-val">0;
229 class="tok-prop">background: class="tok-val">class="tok-kw">var(--red);
230 class="tok-prop">transform: class="tok-val">translateX(-101%);
231 class="tok-prop">transition: class="tok-val">transform 0.25s ease;
232 }
233
234 .class="tok-prop">btn-mission:class="tok-val">hover::before { class="tok-prop">transform: class="tok-val">translateX(0); }
235 .class="tok-prop">btn-mission:class="tok-val">hover { class="tok-prop">color: class="tok-val">class="tok-kw">var(--text-bright); }
236 .btn-mission span { class="tok-prop">position: class="tok-val">relative; class="tok-prop">z-index: class="tok-val">1; }
237
238 /* ── LESSON ── */
239 .mission-header {
240 class="tok-prop">width: class="tok-val">100%;
241 class="tok-prop">display: class="tok-val">flex;
242 class="tok-prop">justify-content: class="tok-val">space-between;
243 class="tok-prop">align-items: class="tok-val">flex-start;
244 class="tok-prop">margin-bottom: class="tok-val">24px;
245 class="tok-prop">gap: class="tok-val">20px;
246 }
247
248 .mission-status {
249 class="tok-prop">flex: class="tok-val">1;
250 }
251
252 .status-label {
253 class="tok-prop">font-family: class="tok-val">class="tok-kw">var(--mono);
254 class="tok-prop">font-size: class="tok-val">9px;
255 class="tok-prop">color: class="tok-val">class="tok-kw">var(--text-dim);
256 class="tok-prop">letter-spacing: class="tok-val">3px;
257 class="tok-prop">margin-bottom: class="tok-val">4px;
258 }
259
260 .status-val {
261 class="tok-prop">font-family: class="tok-val">class="tok-kw">var(--head);
262 class="tok-prop">font-size: class="tok-val">18px;
263 class="tok-prop">font-weight: class="tok-val">400;
264 class="tok-prop">color: class="tok-val">class="tok-kw">var(--text-bright);
265 class="tok-prop">letter-spacing: class="tok-val">2px;
266 }
267
268 /* Timer */
269 .timer-wrap {
270 class="tok-prop">text-align: class="tok-val">right;
271 }
272
273 .timer-display {
274 class="tok-prop">font-family: class="tok-val">class="tok-kw">var(--mono);
275 class="tok-prop">font-size: class="tok-val">28px;
276 class="tok-prop">color: class="tok-val">class="tok-kw">var(--amber);
277 class="tok-prop">text-shadow: class="tok-val">0 0 20px rgba(212,130,10,0.5);
278 class="tok-prop">line-height: class="tok-val">1;
279 }
280
281 .timer-display.danger-time {
282 class="tok-prop">color: class="tok-val">class="tok-kw">var(--red);
283 class="tok-prop">text-shadow: class="tok-val">0 0 20px rgba(204,26,26,0.6);
284 class="tok-prop">animation: class="tok-val">pulse-red 0.5s ease infinite;
285 }
286
287 @keyframes pulse-red {
288 0%,100% { class="tok-prop">opacity: class="tok-val">1; }
289 50% { class="tok-prop">opacity: class="tok-val">0.6; }
290 }
291
292 /* Transmission / bubble */
293 .transmission {
294 class="tok-prop">width: class="tok-val">100%;
295 class="tok-prop">max-width: class="tok-val">580px;
296 class="tok-prop">background: class="tok-val">class="tok-kw">var(--panel);
297 class="tok-prop">border: class="tok-val">1px solid rgba(204,26,26,0.15);
298 class="tok-prop">border-left: class="tok-val">3px solid class="tok-kw">var(--red-dim);
299 class="tok-prop">padding: class="tok-val">20px 24px;
300 class="tok-prop">margin-bottom: class="tok-val">24px;
301 class="tok-prop">position: class="tok-val">relative;
302 }
303
304 .trans-header {
305 class="tok-prop">font-family: class="tok-val">class="tok-kw">var(--mono);
306 class="tok-prop">font-size: class="tok-val">9px;
307 class="tok-prop">color: class="tok-val">class="tok-kw">var(--red);
308 class="tok-prop">letter-spacing: class="tok-val">3px;
309 class="tok-prop">margin-bottom: class="tok-val">10px;
310 class="tok-prop">display: class="tok-val">flex;
311 class="tok-prop">align-items: class="tok-val">center;
312 class="tok-prop">gap: class="tok-val">8px;
313 }
314
315 .trans-dot {
316 class="tok-prop">width: class="tok-val">5px; class="tok-prop">height: class="tok-val">5px;
317 class="tok-prop">border-radius: class="tok-val">50%;
318 class="tok-prop">background: class="tok-val">class="tok-kw">var(--red);
319 class="tok-prop">box-shadow: class="tok-val">0 0 6px class="tok-kw">var(--red);
320 class="tok-prop">animation: class="tok-val">blink 0.9s step-end infinite;
321 }
322
323 .trans-text {
324 class="tok-prop">font-family: class="tok-val">class="tok-kw">var(--body);
325 class="tok-prop">font-size: class="tok-val">14px;
326 class="tok-prop">color: class="tok-val">class="tok-kw">var(--text);
327 class="tok-prop">line-height: class="tok-val">1.8;
328 class="tok-prop">font-style: class="tok-val">italic;
329 }
330
331 .trans-text em {
332 class="tok-prop">color: class="tok-val">class="tok-kw">var(--amber);
333 class="tok-prop">font-style: class="tok-val">normal;
334 class="tok-prop">font-weight: class="tok-val">bold;
335 }
336
337 /* FLIP CARD */
338 .flip-area {
339 class="tok-prop">perspective: class="tok-val">1200px;
340 class="tok-prop">width: class="tok-val">300px;
341 class="tok-prop">height: class="tok-val">320px;
342 class="tok-prop">margin: class="tok-val">0 auto 24px;
343 class="tok-prop">cursor: class="tok-val">crosshair;
344 }
345
346 .flip-inner {
347 class="tok-prop">width: class="tok-val">100%; class="tok-prop">height: class="tok-val">100%;
348 class="tok-prop">position: class="tok-val">relative;
349 class="tok-prop">transform-style: class="tok-val">preserve-3d;
350 class="tok-prop">transition: class="tok-val">transform 0.55s cubic-bezier(0.4,0,0.2,1);
351 }
352
353 .flip-inner.flipped { class="tok-prop">transform: class="tok-val">rotateY(180deg); }
354
355 .flip-face {
356 class="tok-prop">position: class="tok-val">absolute; class="tok-prop">inset: class="tok-val">0;
357 class="tok-prop">backface-visibility: class="tok-val">hidden;
358 class="tok-prop">display: class="tok-val">flex;
359 class="tok-prop">flex-direction: class="tok-val">column;
360 class="tok-prop">align-items: class="tok-val">center;
361 class="tok-prop">justify-content: class="tok-val">center;
362 class="tok-prop">padding: class="tok-val">28px 24px;
363 }
364
365 .flip-front {
366 class="tok-prop">background: class="tok-val">class="tok-kw">var(--panel);
367 class="tok-prop">border: class="tok-val">1px solid rgba(26,170,74,0.15);
368 class="tok-prop">box-shadow: class="tok-val">0 0 60px rgba(0,0,0,0.8), 0 0 0 1px rgba(26,170,74,0.05);
369 }
370
371 .flip-back {
372 class="tok-prop">background: class="tok-val">#0a0c0a;
373 class="tok-prop">border: class="tok-val">1px solid rgba(204,26,26,0.3);
374 class="tok-prop">box-shadow: class="tok-val">0 0 60px rgba(204,26,26,0.1), inset 0 0 40px rgba(0,0,0,0.5);
375 class="tok-prop">transform: class="tok-val">rotateY(180deg);
376 }
377
378 .card-code {
379 class="tok-prop">font-family: class="tok-val">class="tok-kw">var(--mono);
380 class="tok-prop">font-size: class="tok-val">9px;
381 class="tok-prop">color: class="tok-val">class="tok-kw">var(--text-dim);
382 class="tok-prop">letter-spacing: class="tok-val">3px;
383 class="tok-prop">position: class="tok-val">absolute;
384 class="tok-prop">top: class="tok-val">14px; class="tok-prop">left: class="tok-val">16px;
385 }
386
387 .hint-emoji { class="tok-prop">font-size: class="tok-val">52px; class="tok-prop">margin-bottom: class="tok-val">14px; class="tok-prop">filter: class="tok-val">grayscale(0.3); }
388
389 .hint-text {
390 class="tok-prop">font-family: class="tok-val">class="tok-kw">var(--mono);
391 class="tok-prop">font-size: class="tok-val">12px;
392 class="tok-prop">color: class="tok-val">class="tok-kw">var(--text-dim);
393 class="tok-prop">text-align: class="tok-val">center;
394 class="tok-prop">line-height: class="tok-val">1.8;
395 class="tok-prop">max-width: class="tok-val">200px;
396 }
397
398 .tap-hint {
399 class="tok-prop">position: class="tok-val">absolute; class="tok-prop">bottom: class="tok-val">14px;
400 class="tok-prop">font-family: class="tok-val">class="tok-kw">var(--mono);
401 class="tok-prop">font-size: class="tok-val">9px;
402 class="tok-prop">color: class="tok-val">rgba(200,207,200,0.2);
403 class="tok-prop">letter-spacing: class="tok-val">2px;
404 }
405
406 /* Back */
407 .cyrillic-main {
408 class="tok-prop">font-family: class="tok-val">class="tok-kw">var(--mono);
409 class="tok-prop">font-size: class="tok-val">72px;
410 class="tok-prop">color: class="tok-val">class="tok-kw">var(--text-bright);
411 class="tok-prop">line-height: class="tok-val">1;
412 class="tok-prop">margin-bottom: class="tok-val">8px;
413 class="tok-prop">text-shadow: class="tok-val">0 0 30px rgba(204,26,26,0.4);
414 class="tok-prop">letter-spacing: class="tok-val">-2px;
415 }
416
417 .transliteration {
418 class="tok-prop">font-family: class="tok-val">class="tok-kw">var(--mono);
419 class="tok-prop">font-size: class="tok-val">14px;
420 class="tok-prop">color: class="tok-val">class="tok-kw">var(--amber);
421 class="tok-prop">letter-spacing: class="tok-val">4px;
422 class="tok-prop">margin-bottom: class="tok-val">8px;
423 }
424
425 .meaning-ru {
426 class="tok-prop">font-size: class="tok-val">16px;
427 class="tok-prop">color: class="tok-val">class="tok-kw">var(--text-bright);
428 class="tok-prop">font-family: class="tok-val">class="tok-kw">var(--head);
429 class="tok-prop">font-weight: class="tok-val">300;
430 class="tok-prop">letter-spacing: class="tok-val">2px;
431 class="tok-prop">margin-bottom: class="tok-val">10px;
432 }
433
434 .example-ru {
435 class="tok-prop">font-family: class="tok-val">class="tok-kw">var(--mono);
436 class="tok-prop">font-size: class="tok-val">10px;
437 class="tok-prop">color: class="tok-val">class="tok-kw">var(--text-dim);
438 class="tok-prop">text-align: class="tok-val">center;
439 class="tok-prop">line-height: class="tok-val">1.9;
440 }
441
442 /* Answer row */
443 .answer-row {
444 class="tok-prop">display: class="tok-val">flex;
445 class="tok-prop">gap: class="tok-val">12px;
446 class="tok-prop">justify-content: class="tok-val">center;
447 class="tok-prop">margin-bottom: class="tok-val">8px;
448 }
449
450 .btn-ans {
451 class="tok-prop">padding: class="tok-val">11px 24px;
452 class="tok-prop">border: class="tok-val">1px solid;
453 class="tok-prop">font-family: class="tok-val">class="tok-kw">var(--head);
454 class="tok-prop">font-size: class="tok-val">12px;
455 class="tok-prop">font-weight: class="tok-val">600;
456 class="tok-prop">letter-spacing: class="tok-val">3px;
457 class="tok-prop">text-transform: class="tok-val">uppercase;
458 class="tok-prop">cursor: class="tok-val">crosshair;
459 class="tok-prop">transition: class="tok-val">all 0.2s ease;
460 class="tok-prop">background: class="tok-val">transparent;
461 }
462
463 .class="tok-prop">btn-ans:class="tok-val">disabled { class="tok-prop">opacity: class="tok-val">0.2; class="tok-prop">cursor: class="tok-val">not-allowed; }
464
465 .btn-success {
466 class="tok-prop">border-color: class="tok-val">class="tok-kw">var(--green);
467 class="tok-prop">color: class="tok-val">class="tok-kw">var(--green);
468 }
469 .class="tok-prop">btn-success:class="tok-val">not(:disabled):hover {
470 class="tok-prop">background: class="tok-val">class="tok-kw">var(--green-dim);
471 }
472
473 .btn-fail {
474 class="tok-prop">border-color: class="tok-val">class="tok-kw">var(--red-dim);
475 class="tok-prop">color: class="tok-val">#aa5555;
476 }
477 .class="tok-prop">btn-fail:class="tok-val">not(:disabled):hover {
478 class="tok-prop">background: class="tok-val">rgba(204,26,26,0.1);
479 }
480
481 .btn-flip-sm {
482 class="tok-prop">background: class="tok-val">transparent;
483 class="tok-prop">border: class="tok-val">1px solid rgba(200,207,200,0.1);
484 class="tok-prop">color: class="tok-val">class="tok-kw">var(--text-dim);
485 class="tok-prop">padding: class="tok-val">10px 18px;
486 class="tok-prop">font-family: class="tok-val">class="tok-kw">var(--mono);
487 class="tok-prop">font-size: class="tok-val">10px;
488 class="tok-prop">letter-spacing: class="tok-val">2px;
489 class="tok-prop">cursor: class="tok-val">crosshair;
490 class="tok-prop">transition: class="tok-val">all 0.2s;
491 }
492 .class="tok-prop">btn-flip-sm:class="tok-val">hover { class="tok-prop">border-color: class="tok-val">rgba(200,207,200,0.3); class="tok-prop">color: class="tok-val">class="tok-kw">var(--text); }
493
494 /* Progress bar */
495 .prog-wrap {
496 class="tok-prop">width: class="tok-val">100%;
497 class="tok-prop">max-width: class="tok-val">580px;
498 class="tok-prop">margin-top: class="tok-val">20px;
499 }
500
501 .prog-info {
502 class="tok-prop">display: class="tok-val">flex;
503 class="tok-prop">justify-content: class="tok-val">space-between;
504 class="tok-prop">font-family: class="tok-val">class="tok-kw">var(--mono);
505 class="tok-prop">font-size: class="tok-val">9px;
506 class="tok-prop">color: class="tok-val">class="tok-kw">var(--text-dim);
507 class="tok-prop">letter-spacing: class="tok-val">2px;
508 class="tok-prop">margin-bottom: class="tok-val">6px;
509 }
510
511 .prog-bar {
512 class="tok-prop">height: class="tok-val">2px;
513 class="tok-prop">background: class="tok-val">rgba(200,207,200,0.08);
514 }
515
516 .prog-fill {
517 class="tok-prop">height: class="tok-val">100%;
518 class="tok-prop">background: class="tok-val">class="tok-kw">var(--red);
519 class="tok-prop">box-shadow: class="tok-val">0 0 8px class="tok-kw">var(--red);
520 class="tok-prop">transition: class="tok-val">width 0.4s ease;
521 }
522
523 /* ── RESULT ── */
524 .result-terminal {
525 class="tok-prop">background: class="tok-val">class="tok-kw">var(--panel);
526 class="tok-prop">border: class="tok-val">1px solid rgba(26,170,74,0.2);
527 class="tok-prop">border-left: class="tok-val">3px solid class="tok-kw">var(--green);
528 class="tok-prop">padding: class="tok-val">36px 40px;
529 class="tok-prop">width: class="tok-val">100%;
530 class="tok-prop">max-width: class="tok-val">580px;
531 class="tok-prop">margin-bottom: class="tok-val">28px;
532 class="tok-prop">box-shadow: class="tok-val">0 0 60px rgba(26,170,74,0.05);
533 }
534
535 .result-terminal.failed {
536 class="tok-prop">border-left-color: class="tok-val">class="tok-kw">var(--red);
537 class="tok-prop">box-shadow: class="tok-val">0 0 60px rgba(204,26,26,0.08);
538 }
539
540 .result-code {
541 class="tok-prop">font-family: class="tok-val">class="tok-kw">var(--mono);
542 class="tok-prop">font-size: class="tok-val">9px;
543 class="tok-prop">color: class="tok-val">class="tok-kw">var(--green);
544 class="tok-prop">letter-spacing: class="tok-val">3px;
545 class="tok-prop">margin-bottom: class="tok-val">20px;
546 }
547
548 .result-terminal.failed .result-code { class="tok-prop">color: class="tok-val">class="tok-kw">var(--red); }
549
550 .result-big {
551 class="tok-prop">font-family: class="tok-val">class="tok-kw">var(--head);
552 class="tok-prop">font-size: class="tok-val">clamp(1.4rem, 4vw, 2rem);
553 class="tok-prop">font-weight: class="tok-val">600;
554 class="tok-prop">color: class="tok-val">class="tok-kw">var(--text-bright);
555 class="tok-prop">letter-spacing: class="tok-val">3px;
556 class="tok-prop">margin-bottom: class="tok-val">10px;
557 class="tok-prop">line-height: class="tok-val">1.2;
558 }
559
560 .result-sub {
561 class="tok-prop">font-family: class="tok-val">class="tok-kw">var(--body);
562 class="tok-prop">font-size: class="tok-val">13px;
563 class="tok-prop">color: class="tok-val">class="tok-kw">var(--text-dim);
564 class="tok-prop">line-height: class="tok-val">1.9;
565 class="tok-prop">font-style: class="tok-val">italic;
566 class="tok-prop">margin-bottom: class="tok-val">24px;
567 }
568
569 .result-stats {
570 class="tok-prop">display: class="tok-val">flex;
571 class="tok-prop">gap: class="tok-val">32px;
572 class="tok-prop">border-top: class="tok-val">1px solid rgba(200,207,200,0.08);
573 class="tok-prop">padding-top: class="tok-val">20px;
574 }
575
576 .stat-item { class="tok-prop">display: class="tok-val">flex; class="tok-prop">flex-direction: class="tok-val">column; class="tok-prop">gap: class="tok-val">4px; }
577 .stat-num {
578 class="tok-prop">font-family: class="tok-val">class="tok-kw">var(--mono);
579 class="tok-prop">font-size: class="tok-val">28px;
580 class="tok-prop">color: class="tok-val">class="tok-kw">var(--text-bright);
581 class="tok-prop">line-height: class="tok-val">1;
582 }
583 .stat-label {
584 class="tok-prop">font-family: class="tok-val">class="tok-kw">var(--mono);
585 class="tok-prop">font-size: class="tok-val">9px;
586 class="tok-prop">color: class="tok-val">class="tok-kw">var(--text-dim);
587 class="tok-prop">letter-spacing: class="tok-val">2px;
588 }
589
590 /* Decode lines in result */
591 .decode-line {
592 class="tok-prop">display: class="tok-val">flex;
593 class="tok-prop">align-items: class="tok-val">center;
594 class="tok-prop">gap: class="tok-val">16px;
595 class="tok-prop">padding: class="tok-val">10px 0;
596 class="tok-prop">border-bottom: class="tok-val">1px solid rgba(200,207,200,0.05);
597 class="tok-prop">opacity: class="tok-val">0;
598 class="tok-prop">animation: class="tok-val">lineIn 0.4s ease forwards;
599 }
600
601 @keyframes lineIn {
602 from { class="tok-prop">opacity: class="tok-val">0; class="tok-prop">transform: class="tok-val">translateX(-10px); }
603 to { class="tok-prop">opacity: class="tok-val">1; class="tok-prop">transform: class="tok-val">translateX(0); }
604 }
605
606 .decode-ru {
607 class="tok-prop">font-family: class="tok-val">class="tok-kw">var(--mono);
608 class="tok-prop">font-size: class="tok-val">18px;
609 class="tok-prop">color: class="tok-val">class="tok-kw">var(--text-bright);
610 class="tok-prop">min-width: class="tok-val">80px;
611 }
612
613 .decode-arrow {
614 class="tok-prop">font-family: class="tok-val">class="tok-kw">var(--mono);
615 class="tok-prop">font-size: class="tok-val">10px;
616 class="tok-prop">color: class="tok-val">class="tok-kw">var(--text-dim);
617 }
618
619 .decode-es {
620 class="tok-prop">font-size: class="tok-val">13px;
621 class="tok-prop">color: class="tok-val">class="tok-kw">var(--text-dim);
622 class="tok-prop">font-style: class="tok-val">italic;
623 class="tok-prop">flex: class="tok-val">1;
624 }
625
626 .decode-status {
627 class="tok-prop">font-family: class="tok-val">class="tok-kw">var(--mono);
628 class="tok-prop">font-size: class="tok-val">10px;
629 class="tok-prop">letter-spacing: class="tok-val">1px;
630 }
631
632 /* Animations */
633 @keyframes shake {
634 0%,100% { class="tok-prop">transform: class="tok-val">translateX(0); }
635 20% { class="tok-prop">transform: class="tok-val">translateX(-10px); }
636 40% { class="tok-prop">transform: class="tok-val">translateX(10px); }
637 60% { class="tok-prop">transform: class="tok-val">translateX(-7px); }
638 80% { class="tok-prop">transform: class="tok-val">translateX(7px); }
639 }
640 .shake { class="tok-prop">animation: class="tok-val">shake 0.4s ease; }
641 class="tok-tag"></styleclass="tok-attr">class="tok-tag">>
642 class="tok-tag"></headclass="tok-attr">class="tok-tag">>
643 class="tok-tag"><bodyclass="tok-attr">class="tok-tag">>
644 class="tok-tag"><divclass="tok-attr"> class="noise"class="tok-tag">>class="tok-tag"></divclass="tok-attr">class="tok-tag">>
645
646 class="tok-tag"><divclass="tok-attr"> class="wrapper"class="tok-tag">>
647
648 <!-- ══ INTRO ══ -->
649 class="tok-tag"><divclass="tok-attr"> class="screen active" id="screen-intro"class="tok-tag">>
650 class="tok-tag"><divclass="tok-attr"> class="top-bar"class="tok-tag">>
651 class="tok-tag"><spanclass="tok-attr"> class="red"class="tok-tag">>● TRANSMISIÓN ACTIVAclass="tok-tag"></spanclass="tok-attr">class="tok-tag">>
652 class="tok-tag"><spanclass="tok-attr">class="tok-tag">>МОСКОВСКОЕ ВРЕМЯ class="tok-tag"><spanclass="tok-attr"> class="blink"class="tok-tag">>23:47class="tok-tag"></spanclass="tok-attr">class="tok-tag">>class="tok-tag"></spanclass="tok-attr">class="tok-tag">>
653 class="tok-tag"></divclass="tok-attr">class="tok-tag">>
654
655 class="tok-tag"><divclass="tok-attr"> class="classified-stamp"class="tok-tag">>CLASIFICADOclass="tok-tag"></divclass="tok-attr">class="tok-tag">>
656
657 class="tok-tag"><h1class="tok-attr"> class="intro-title"class="tok-tag">>MISIÓNclass="tok-tag"><brclass="tok-attr">class="tok-tag">>MOSCÚclass="tok-tag"></h1class="tok-attr">class="tok-tag">>
658 class="tok-tag"><divclass="tok-attr"> class="intro-cyrillic"class="tok-tag">>МИССИЯ МОСКВА · 1973class="tok-tag"></divclass="tok-attr">class="tok-tag">>
659
660 class="tok-tag"><divclass="tok-attr"> class="terminal" style="class="tok-prop">max-width:class="tok-val">580px";class="tok-tag">>
661 class="tok-tag"><divclass="tok-attr"> class="terminal-header"class="tok-tag">>
662 class="tok-tag"><divclass="tok-attr"> class="terminal-dot"class="tok-tag">>class="tok-tag"></divclass="tok-attr">class="tok-tag">>
663 TRANSMISIÓN ENTRANTE · CANAL SEGURO
664 class="tok-tag"></divclass="tok-attr">class="tok-tag">>
665 class="tok-tag"><divclass="tok-attr"> class="terminal-text"class="tok-tag">>
666 > class="tok-prop">AGENTE: class="tok-val">class="tok-tag"><;spanclass="tok-attr"> class="name"class="tok-tag">>SASHAclass="tok-tag"></spanclass="tok-attr">class="tok-tag">>class="tok-tag"><brclass="tok-attr">class="tok-tag">>
667 > UBICACIÓclass="tok-prop">N: class="tok-val">class="tok-tag"><;spanclass="tok-attr"> class="highlight"class="tok-tag">>Moscú, sector norteclass="tok-tag"></spanclass="tok-attr">class="tok-tag">>class="tok-tag"><brclass="tok-attr">class="tok-tag">>
668 > MISIÓclass="tok-prop">N: class="tok-val">Infiltración edificio K-7class="tok-tag"><;brclass="tok-attr">class="tok-tag">>
669 > class="tok-prop">ESTADO: class="tok-val">class="tok-tag"><;spanclass="tok-attr"> class="danger"class="tok-tag">>CRÍTICOclass="tok-tag"></spanclass="tok-attr">class="tok-tag">>class="tok-tag"><brclass="tok-attr">class="tok-tag">>
670 class="tok-tag"><brclass="tok-attr">class="tok-tag">>
671 > "Necesito las palabras correctas antesclass="tok-tag"><brclass="tok-attr">class="tok-tag">>
672 &nbsp;&nbsp;de entrar. class="tok-tag"><spanclass="tok-attr"> class="danger"class="tok-tag">>Una sola equivocaciónclass="tok-tag"></spanclass="tok-attr">class="tok-tag">> yclass="tok-tag"><brclass="tok-attr">class="tok-tag">>
673 &nbsp;&nbsp;todo se derrumba."class="tok-tag"><brclass="tok-attr">class="tok-tag">>
674 class="tok-tag"><brclass="tok-attr">class="tok-tag">>
675 > TU class="tok-prop">ROL: class="tok-val">class="tok-tag"><;spanclass="tok-attr"> class="name"class="tok-tag">>CONTACTO DE CAMPOclass="tok-tag"></spanclass="tok-attr">class="tok-tag">>class="tok-tag"><brclass="tok-attr">class="tok-tag">>
676 > Pásale las palabras. No falles. class="tok-tag"><spanclass="tok-attr"> class="cursor-blink"class="tok-tag">>class="tok-tag"></spanclass="tok-attr">class="tok-tag">>
677 class="tok-tag"></divclass="tok-attr">class="tok-tag">>
678 class="tok-tag"></divclass="tok-attr">class="tok-tag">>
679
680 class="tok-tag"><buttonclass="tok-attr"> class="btn-mission" onclick="startMission()"class="tok-tag">>
681 class="tok-tag"><spanclass="tok-attr">class="tok-tag">>▶ INICIAR MISIÓNclass="tok-tag"></spanclass="tok-attr">class="tok-tag">>
682 class="tok-tag"></buttonclass="tok-attr">class="tok-tag">>
683 class="tok-tag"></divclass="tok-attr">class="tok-tag">>
684
685 <!-- ══ LESSON ══ -->
686 class="tok-tag"><divclass="tok-attr"> class="screen" id="screen-lesson"class="tok-tag">>
687 class="tok-tag"><divclass="tok-attr"> class="top-bar"class="tok-tag">>
688 class="tok-tag"><spanclass="tok-attr"> class="red blink"class="tok-tag">>● EN CAMPOclass="tok-tag"></spanclass="tok-attr">class="tok-tag">>
689 class="tok-tag"><spanclass="tok-attr"> id="time-label"class="tok-tag">>МОСКОВСКОЕ ВРЕМЯ 23:47class="tok-tag"></spanclass="tok-attr">class="tok-tag">>
690 class="tok-tag"></divclass="tok-attr">class="tok-tag">>
691
692 class="tok-tag"><divclass="tok-attr"> class="mission-header" style="class="tok-prop">max-width:class="tok-val">580px;class="tok-prop">width:class="tok-val">100%";class="tok-tag">>
693 class="tok-tag"><divclass="tok-attr"> class="mission-status"class="tok-tag">>
694 class="tok-tag"><divclass="tok-attr"> class="status-label"class="tok-tag">>PALABRA CLAVEclass="tok-tag"></divclass="tok-attr">class="tok-tag">>
695 class="tok-tag"><divclass="tok-attr"> class="status-val" id="step-val"class="tok-tag">>1 / 5class="tok-tag"></divclass="tok-attr">class="tok-tag">>
696 class="tok-tag"></divclass="tok-attr">class="tok-tag">>
697 class="tok-tag"><divclass="tok-attr"> class="timer-wrap"class="tok-tag">>
698 class="tok-tag"><divclass="tok-attr"> class="status-label" style="class="tok-prop">text-align:class="tok-val">right";class="tok-tag">>TIEMPOclass="tok-tag"></divclass="tok-attr">class="tok-tag">>
699 class="tok-tag"><divclass="tok-attr"> class="timer-display" id="timer-display"class="tok-tag">>00:30class="tok-tag"></divclass="tok-attr">class="tok-tag">>
700 class="tok-tag"></divclass="tok-attr">class="tok-tag">>
701 class="tok-tag"></divclass="tok-attr">class="tok-tag">>
702
703 class="tok-tag"><divclass="tok-attr"> class="transmission" style="class="tok-prop">max-width:class="tok-val">580px;class="tok-prop">width:class="tok-val">100%";class="tok-tag">>
704 class="tok-tag"><divclass="tok-attr"> class="trans-header"class="tok-tag">>
705 class="tok-tag"><divclass="tok-attr"> class="trans-dot"class="tok-tag">>class="tok-tag"></divclass="tok-attr">class="tok-tag">>
706 SASHA · VOZ CODIFICADA
707 class="tok-tag"></divclass="tok-attr">class="tok-tag">>
708 class="tok-tag"><divclass="tok-attr"> class="trans-text" id="trans-text"class="tok-tag">>...class="tok-tag"></divclass="tok-attr">class="tok-tag">>
709 class="tok-tag"></divclass="tok-attr">class="tok-tag">>
710
711 class="tok-tag"><divclass="tok-attr"> class="flip-area" onclick="revealCard()"class="tok-tag">>
712 class="tok-tag"><divclass="tok-attr"> class="flip-inner" id="flip-inner"class="tok-tag">>
713 class="tok-tag"><divclass="tok-attr"> class="flip-face flip-front"class="tok-tag">>
714 class="tok-tag"><divclass="tok-attr"> class="card-code" id="card-code"class="tok-tag">>CÓDIGO-01class="tok-tag"></divclass="tok-attr">class="tok-tag">>
715 class="tok-tag"><divclass="tok-attr"> class="hint-emoji" id="hint-emoji"class="tok-tag">>🔍class="tok-tag"></divclass="tok-attr">class="tok-tag">>
716 class="tok-tag"><divclass="tok-attr"> class="hint-text" id="hint-text"class="tok-tag">>...class="tok-tag"></divclass="tok-attr">class="tok-tag">>
717 class="tok-tag"><divclass="tok-attr"> class="tap-hint"class="tok-tag">>[ TOCA PARA DESCIFRAR ]class="tok-tag"></divclass="tok-attr">class="tok-tag">>
718 class="tok-tag"></divclass="tok-attr">class="tok-tag">>
719 class="tok-tag"><divclass="tok-attr"> class="flip-face flip-back"class="tok-tag">>
720 class="tok-tag"><divclass="tok-attr"> class="card-code" id="card-code-back"class="tok-tag">>DESCIFRADOclass="tok-tag"></divclass="tok-attr">class="tok-tag">>
721 class="tok-tag"><divclass="tok-attr"> class="cyrillic-main" id="cyrillic-main"class="tok-tag">>словоclass="tok-tag"></divclass="tok-attr">class="tok-tag">>
722 class="tok-tag"><divclass="tok-attr"> class="transliteration" id="transliteration"class="tok-tag">>slovoclass="tok-tag"></divclass="tok-attr">class="tok-tag">>
723 class="tok-tag"><divclass="tok-attr"> class="meaning-ru" id="meaning-ru"class="tok-tag">>palabraclass="tok-tag"></divclass="tok-attr">class="tok-tag">>
724 class="tok-tag"><divclass="tok-attr"> class="example-ru" id="example-ru"class="tok-tag">>class="tok-tag"></divclass="tok-attr">class="tok-tag">>
725 class="tok-tag"></divclass="tok-attr">class="tok-tag">>
726 class="tok-tag"></divclass="tok-attr">class="tok-tag">>
727 class="tok-tag"></divclass="tok-attr">class="tok-tag">>
728
729 class="tok-tag"><divclass="tok-attr"> class="answer-row"class="tok-tag">>
730 class="tok-tag"><buttonclass="tok-attr"> class="btn-ans btn-fail" id="btn-fail" onclick="answer(false)" disabledclass="tok-tag">>✗ FALLÉclass="tok-tag"></buttonclass="tok-attr">class="tok-tag">>
731 class="tok-tag"><buttonclass="tok-attr"> class="btn-flip-sm" onclick="revealCard()"class="tok-tag">>↺ descifrarclass="tok-tag"></buttonclass="tok-attr">class="tok-tag">>
732 class="tok-tag"><buttonclass="tok-attr"> class="btn-ans btn-success" id="btn-success" onclick="answer(true)" disabledclass="tok-tag">>✓ LO SÉclass="tok-tag"></buttonclass="tok-attr">class="tok-tag">>
733 class="tok-tag"></divclass="tok-attr">class="tok-tag">>
734
735 class="tok-tag"><divclass="tok-attr"> class="prog-wrap"class="tok-tag">>
736 class="tok-tag"><divclass="tok-attr"> class="prog-info"class="tok-tag">>
737 class="tok-tag"><spanclass="tok-attr">class="tok-tag">>PROGRESO DE MISIÓNclass="tok-tag"></spanclass="tok-attr">class="tok-tag">>
738 class="tok-tag"><spanclass="tok-attr"> id="prog-pct"class="tok-tag">>0%class="tok-tag"></spanclass="tok-attr">class="tok-tag">>
739 class="tok-tag"></divclass="tok-attr">class="tok-tag">>
740 class="tok-tag"><divclass="tok-attr"> class="prog-bar"class="tok-tag">>
741 class="tok-tag"><divclass="tok-attr"> class="prog-fill" id="prog-fill" style="class="tok-prop">width:class="tok-val">0%";class="tok-tag">>class="tok-tag"></divclass="tok-attr">class="tok-tag">>
742 class="tok-tag"></divclass="tok-attr">class="tok-tag">>
743 class="tok-tag"></divclass="tok-attr">class="tok-tag">>
744 class="tok-tag"></divclass="tok-attr">class="tok-tag">>
745
746 <!-- ══ RESULT ══ -->
747 class="tok-tag"><divclass="tok-attr"> class="screen" id="screen-result"class="tok-tag">>
748 class="tok-tag"><divclass="tok-attr"> class="top-bar"class="tok-tag">>
749 class="tok-tag"><spanclass="tok-attr"> id="res-status-top"class="tok-tag">>● MISIÓN COMPLETADAclass="tok-tag"></spanclass="tok-attr">class="tok-tag">>
750 class="tok-tag"><spanclass="tok-attr">class="tok-tag">>МОСКОВСКОЕ ВРЕМЯ 23:52class="tok-tag"></spanclass="tok-attr">class="tok-tag">>
751 class="tok-tag"></divclass="tok-attr">class="tok-tag">>
752
753 class="tok-tag"><divclass="tok-attr"> class="result-terminal" id="result-terminal"class="tok-tag">>
754 class="tok-tag"><divclass="tok-attr"> class="result-code" id="res-code"class="tok-tag">>// INFORME DE MISIÓN · CANAL SEGUROclass="tok-tag"></divclass="tok-attr">class="tok-tag">>
755 class="tok-tag"><divclass="tok-attr"> class="result-big" id="res-title"class="tok-tag">>SASHA CRUZÓclass="tok-tag"><brclass="tok-attr">class="tok-tag">>LA FRONTERAclass="tok-tag"></divclass="tok-attr">class="tok-tag">>
756 class="tok-tag"><divclass="tok-attr"> class="result-sub" id="res-sub"class="tok-tag">>Las palabras correctas abrieron cada puerta. Esta vez.class="tok-tag"></divclass="tok-attr">class="tok-tag">>
757
758 class="tok-tag"><divclass="tok-attr"> class="result-stats"class="tok-tag">>
759 class="tok-tag"><divclass="tok-attr"> class="stat-item"class="tok-tag">>
760 class="tok-tag"><divclass="tok-attr"> class="stat-num" id="res-ok" style="class="tok-prop">color:class="tok-val">class="tok-kw">var(--green)";class="tok-tag">>0class="tok-tag"></divclass="tok-attr">class="tok-tag">>
761 class="tok-tag"><divclass="tok-attr"> class="stat-label"class="tok-tag">>CORRECTASclass="tok-tag"></divclass="tok-attr">class="tok-tag">>
762 class="tok-tag"></divclass="tok-attr">class="tok-tag">>
763 class="tok-tag"><divclass="tok-attr"> class="stat-item"class="tok-tag">>
764 class="tok-tag"><divclass="tok-attr"> class="stat-num" id="res-fail" style="class="tok-prop">color:class="tok-val">class="tok-kw">var(--red)";class="tok-tag">>0class="tok-tag"></divclass="tok-attr">class="tok-tag">>
765 class="tok-tag"><divclass="tok-attr"> class="stat-label"class="tok-tag">>FALLADASclass="tok-tag"></divclass="tok-attr">class="tok-tag">>
766 class="tok-tag"></divclass="tok-attr">class="tok-tag">>
767 class="tok-tag"><divclass="tok-attr"> class="stat-item"class="tok-tag">>
768 class="tok-tag"><divclass="tok-attr"> class="stat-num" id="res-pct"class="tok-tag">>0%class="tok-tag"></divclass="tok-attr">class="tok-tag">>
769 class="tok-tag"><divclass="tok-attr"> class="stat-label"class="tok-tag">>EFECTIVIDADclass="tok-tag"></divclass="tok-attr">class="tok-tag">>
770 class="tok-tag"></divclass="tok-attr">class="tok-tag">>
771 class="tok-tag"></divclass="tok-attr">class="tok-tag">>
772 class="tok-tag"></divclass="tok-attr">class="tok-tag">>
773
774 class="tok-tag"><divclass="tok-attr"> style="class="tok-prop">width:class="tok-val">100%;class="tok-prop">max-width:class="tok-val">580px;class="tok-prop">margin-bottom:class="tok-val">28px;"class="tok-tag">>
775 class="tok-tag"><divclass="tok-attr"> style="class="tok-prop">font-family:class="tok-val">class="tok-kw">var(--mono);class="tok-prop">font-size:class="tok-val">9px;class="tok-prop">color:class="tok-val">class="tok-kw">var(--text-dim);class="tok-prop">letter-spacing:class="tok-val">3px;class="tok-prop">margin-bottom:class="tok-val">16px;"class="tok-tag">>
776 // PALABRAS DESCIFRADAS EN MISIÓN
777 class="tok-tag"></divclass="tok-attr">class="tok-tag">>
778 class="tok-tag"><divclass="tok-attr"> id="decode-list"class="tok-tag">>class="tok-tag"></divclass="tok-attr">class="tok-tag">>
779 class="tok-tag"></divclass="tok-attr">class="tok-tag">>
780
781 class="tok-tag"><buttonclass="tok-attr"> class="btn-mission" onclick="restartGame()"class="tok-tag">>
782 class="tok-tag"><spanclass="tok-attr">class="tok-tag">>↺ NUEVA MISIÓNclass="tok-tag"></spanclass="tok-attr">class="tok-tag">>
783 class="tok-tag"></buttonclass="tok-attr">class="tok-tag">>
784 class="tok-tag"></divclass="tok-attr">class="tok-tag">>
785
786 class="tok-tag"></divclass="tok-attr">class="tok-tag">>
787
788 class="tok-tag"><scriptclass="tok-attr">class="tok-tag">>
789 class="tok-kw">const words = [
790 {
791 class="tok-prop">trans: class="tok-val">';"Necesito decirles quién soy... dame la palabra para class="tok-tag"><emclass="tok-attr">class="tok-tag">>nombreclass="tok-tag"></emclass="tok-attr">class="tok-tag">>."',
792 class="tok-prop">emoji: class="tok-val">';🪪',
793 class="tok-prop">hint: class="tok-val">';Lo que te distingue,\nlo que eres ante el mundo',
794 class="tok-prop">code: class="tok-val">';CÓDIGO-01',
795 class="tok-prop">cyrillic: class="tok-val">';имя',
796 class="tok-prop">roman: class="tok-val">';imya',
797 class="tok-prop">meaning: class="tok-val">';nombre',
798 class="tok-prop">example: class="tok-val">';Моё имя Саша. = Mi nombre es Sasha.',
799 decode_class="tok-prop">es: class="tok-val">';nombre / identidad'
800 },
801 {
802 class="tok-prop">trans: class="tok-val">';"Debo decirles que class="tok-tag"><emclass="tok-attr">class="tok-tag">>no habloclass="tok-tag"></emclass="tok-attr">class="tok-tag">> bien el idioma... ¿cómo lo digo sin levantar sospechas?"',
803 class="tok-prop">emoji: class="tok-val">';🤫',
804 class="tok-prop">hint: class="tok-val">';Silencio, cautela,\nno revelar demasiado',
805 class="tok-prop">code: class="tok-val">';CÓDIGO-02',
806 class="tok-prop">cyrillic: class="tok-val">';нет',
807 class="tok-prop">roman: class="tok-val">';nyet',
808 class="tok-prop">meaning: class="tok-val">';no',
809 class="tok-prop">example: class="tok-val">';Нет, спасибо. = No, gracias.',
810 decode_class="tok-prop">es: class="tok-val">';no / negación'
811 },
812 {
813 class="tok-prop">trans: class="tok-val">';"Necesito pedir class="tok-tag"><emclass="tok-attr">class="tok-tag">>ayudaclass="tok-tag"></emclass="tok-attr">class="tok-tag">> sin que sepan que soy agente... ¿cómo?"',
814 class="tok-prop">emoji: class="tok-val">';🤝',
815 class="tok-prop">hint: class="tok-val">';Extender la mano,\npedir sin revelar nada',
816 class="tok-prop">code: class="tok-val">';CÓDIGO-03',
817 class="tok-prop">cyrillic: class="tok-val">';помощь',
818 class="tok-prop">roman: class="tok-val">';pomoshch',
819 class="tok-prop">meaning: class="tok-val">';ayuda',
820 class="tok-prop">example: class="tok-val">';Мне нужна помощь. = Necesito ayuda.',
821 decode_class="tok-prop">es: class="tok-val">';ayuda / asistencia'
822 },
823 {
824 class="tok-prop">trans: class="tok-val">';"Si me preguntan adónde voy... necesito decir class="tok-tag"><emclass="tok-attr">class="tok-tag">>salidaclass="tok-tag"></emclass="tok-attr">class="tok-tag">> con calma."',
825 class="tok-prop">emoji: class="tok-val">';🚪',
826 class="tok-prop">hint: class="tok-val">';La puerta al otro lado,\nel camino de escape',
827 class="tok-prop">code: class="tok-val">';CÓDIGO-04',
828 class="tok-prop">cyrillic: class="tok-val">';выход',
829 class="tok-prop">roman: class="tok-val">';vykhod',
830 class="tok-prop">meaning: class="tok-val">';salida',
831 class="tok-prop">example: class="tok-val">';Где выход? = ¿Dónde está la salida?',
832 decode_class="tok-prop">es: class="tok-val">';salida / escape'
833 },
834 {
835 class="tok-prop">trans: class="tok-val">';"Una última palabra... si algo sale mal necesito decir class="tok-tag"><emclass="tok-attr">class="tok-tag">>peligroclass="tok-tag"></emclass="tok-attr">class="tok-tag">>."',
836 class="tok-prop">emoji: class="tok-val">';⚠️',
837 class="tok-prop">hint: class="tok-val">';Señal de alarma,\ncuando todo puede fallar',
838 class="tok-prop">code: class="tok-val">';CÓDIGO-05',
839 class="tok-prop">cyrillic: class="tok-val">';опасно',
840 class="tok-prop">roman: class="tok-val">';opasno',
841 class="tok-prop">meaning: class="tok-val">';peligro / peligroso',
842 class="tok-prop">example: class="tok-val">';Это опасно! = ¡Esto es peligroso!',
843 decode_class="tok-prop">es: class="tok-val">';peligro / alerta'
844 }
845 ];
846
847 class="tok-kw">let current = 0;
848 class="tok-kw">let revealed = false;
849 class="tok-kw">let score = 0;
850 class="tok-kw">let timerInterval = null;
851 class="tok-kw">let timeLeft = 30;
852 class="tok-kw">let results = [];
853
854 class="tok-kw">function startMission() {
855 current = 0; score = 0; revealed = false; results = [];
856 loadWord(0);
857 showScreen('screen-lesson');
858 }
859
860 class="tok-kw">function showScreen(id) {
861 document.querySelectorAll('.screen').forEach(s => s.classList.remove('active'));
862 document.getElementById(id).classList.add('active');
863 }
864
865 class="tok-kw">function loadWord(idx) {
866 class="tok-kw">const w = words[idx];
867 revealed = false;
868
869 document.getElementById('trans-text').innerHTML = w.trans;
870 document.getElementById('hint-emoji').textContent = w.emoji;
871 document.getElementById('hint-text').textContent = w.hint;
872 document.getElementById('card-code').textContent = w.code;
873 document.getElementById('card-code-back').textContent = '// DESCIFRADO';
874 document.getElementById('cyrillic-main').textContent = w.cyrillic;
875 document.getElementById('transliteration').textContent = w.roman;
876 document.getElementById('meaning-ru').textContent = w.meaning;
877 document.getElementById('example-ru').textContent = w.example;
878 document.getElementById('step-val').textContent = `${idx+1} / ${words.length}`;
879
880 document.getElementById('flip-inner').classList.remove('flipped');
881 document.getElementById('btn-success').disabled = true;
882 document.getElementById('btn-fail').disabled = true;
883
884 class="tok-kw">const pct = Math.round((idx / words.length) * 100);
885 document.getElementById('prog-fill').style.width = pct + '%';
886 document.getElementById('prog-pct').textContent = pct + '%';
887
888 // Timer
889 clearInterval(timerInterval);
890 timeLeft = 30;
891 updateTimerDisplay();
892 timerInterval = setInterval(() => {
893 timeLeft--;
894 updateTimerDisplay();
895 class="tok-kw">if (timeLeft <= 0) {
896 clearInterval(timerInterval);
897 class="tok-kw">if (!revealed) revealCard();
898 }
899 }, 1000);
900 }
901
902 class="tok-kw">function updateTimerDisplay() {
903 class="tok-kw">const el = document.getElementById('timer-display');
904 class="tok-kw">const s = String(timeLeft).padStart(2, '0');
905 el.textContent = `00:${s}`;
906 el.classList.toggle('danger-time', timeLeft <= 10);
907 }
908
909 class="tok-kw">function revealCard() {
910 class="tok-kw">if (revealed) class="tok-kw">return;
911 revealed = true;
912 clearInterval(timerInterval);
913 document.getElementById('flip-inner').classList.add('flipped');
914 document.getElementById('btn-success').disabled = false;
915 document.getElementById('btn-fail').disabled = false;
916 }
917
918 class="tok-kw">function answer(knew) {
919 class="tok-kw">if (!revealed) class="tok-kw">return;
920 clearInterval(timerInterval);
921
922 class="tok-kw">const w = words[current];
923 results.push({ class="tok-prop">word: class="tok-val">w, knew });
924
925 class="tok-kw">if (knew) {
926 score++;
927 } class="tok-kw">else {
928 document.querySelector('.flip-area').classList.add('shake');
929 setTimeout(() => document.querySelector('.flip-area').classList.remove('shake'), 450);
930 }
931
932 current++;
933 class="tok-kw">if (current >= words.length) {
934 setTimeout(showResult, 400);
935 } class="tok-kw">else {
936 setTimeout(() => loadWord(current), 350);
937 }
938 }
939
940 class="tok-kw">function showResult() {
941 clearInterval(timerInterval);
942 class="tok-kw">const pct = Math.round((score / words.length) * 100);
943 class="tok-kw">const failed = words.length - score;
944
945 document.getElementById('res-ok').textContent = score;
946 document.getElementById('res-fail').textContent = failed;
947 document.getElementById('res-pct').textContent = pct + '%';
948
949 class="tok-kw">const terminal = document.getElementById('result-terminal');
950 class="tok-kw">let title, sub, code, statusTop;
951
952 class="tok-kw">if (pct === 100) {
953 title = 'SASHA CRUZÓclass="tok-tag"><brclass="tok-attr">class="tok-tag">>LA FRONTERA';
954 sub = 'Cada palabra fue perfecta. La misión fue un éxito. Sasha regresa mañana.';
955 code = '// MISIÓN COMPLETADA · SIN BAJAS';
956 statusTop = '● MISIÓN EXITOSA';
957 terminal.classList.remove('failed');
958 document.getElementById('res-status-top').style.color = 'class="tok-kw">var(--green)';
959 } class="tok-kw">else class="tok-kw">if (pct >= 60) {
960 title = 'SASHA ESCAPÓclass="tok-tag"><brclass="tok-attr">class="tok-tag">>POR POCO';
961 sub = 'Hubo errores. Sasha salió, pero dejó rastros. La próxima vez debe ser mejor.';
962 code = '// MISIÓN COMPLETADA · CON RIESGO';
963 statusTop = '● REGRESO COMPLICADO';
964 terminal.classList.remove('failed');
965 document.getElementById('res-status-top').style.color = 'class="tok-kw">var(--amber)';
966 document.getElementById('res-status-top').textContent = statusTop;
967 } class="tok-kw">else {
968 title = 'LA MISIÓNclass="tok-tag"><brclass="tok-attr">class="tok-tag">>FUE ABORTADA';
969 sub = 'Las palabras fallaron. Sasha tuvo que retirarse. Habrá que intentarlo de nuevo.';
970 code = '// MISIÓN FALLIDA · AGENTE A SALVO';
971 statusTop = '● MISIÓN ABORTADA';
972 terminal.classList.add('failed');
973 document.getElementById('res-status-top').style.color = 'class="tok-kw">var(--red)';
974 document.getElementById('res-status-top').textContent = statusTop;
975 }
976
977 document.getElementById('res-code').textContent = code;
978 document.getElementById('res-title').innerHTML = title;
979 document.getElementById('res-sub').textContent = sub;
980 document.getElementById('prog-fill').style.width = '100%';
981 document.getElementById('prog-pct').textContent = '100%';
982
983 // Decode list
984 class="tok-kw">const list = document.getElementById('decode-list');
985 list.innerHTML = '';
986 results.forEach((r, i) => {
987 class="tok-kw">const line = document.createElement('div');
988 line.className = 'decode-line';
989 line.style.animationDelay = (i * 0.15) + 's';
990 line.innerHTML = `
991 class="tok-tag"><divclass="tok-attr"> class="decode-ru"class="tok-tag">>${r.word.cyrillic}class="tok-tag"></divclass="tok-attr">class="tok-tag">>
992 class="tok-tag"><divclass="tok-attr"> class="decode-arrow"class="tok-tag">>──►class="tok-tag"></divclass="tok-attr">class="tok-tag">>
993 class="tok-tag"><divclass="tok-attr"> class="decode-es"class="tok-tag">>${r.word.decode_es}class="tok-tag"></divclass="tok-attr">class="tok-tag">>
994 class="tok-tag"><divclass="tok-attr"> class="decode-status" style="class="tok-prop">color:class="tok-val">${r.knew ? 'class="tok-kw">var(--green)' : 'class="tok-kw">var(--red)'}"class="tok-tag">>${r.knew ? '✓ OK' : '✗ FALLO'}class="tok-tag"></divclass="tok-attr">class="tok-tag">>
995 `;
996 list.appendChild(line);
997 });
998
999 showScreen('screen-result');
1000 }
1001
1002 class="tok-kw">function restartGame() {
1003 showScreen('screen-intro');
1004 }
1005 class="tok-tag"></scriptclass="tok-attr">class="tok-tag">>
1006 class="tok-tag"></bodyclass="tok-attr">class="tok-tag">>
1007 class="tok-tag"></htmlclass="tok-attr">class="tok-tag">>
1008