@mtldev514/retro-portfolio-engine 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.md +408 -0
  2. package/bin/cli.js +103 -0
  3. package/engine/admin/admin.css +720 -0
  4. package/engine/admin/admin.html +801 -0
  5. package/engine/admin/admin_api.py +230 -0
  6. package/engine/admin/scripts/backup.sh +116 -0
  7. package/engine/admin/scripts/config_loader.py +180 -0
  8. package/engine/admin/scripts/init.sh +141 -0
  9. package/engine/admin/scripts/manager.py +308 -0
  10. package/engine/admin/scripts/restore.sh +121 -0
  11. package/engine/admin/scripts/server.py +41 -0
  12. package/engine/admin/scripts/update.sh +321 -0
  13. package/engine/admin/scripts/validate_json.py +62 -0
  14. package/engine/fonts.css +37 -0
  15. package/engine/index.html +190 -0
  16. package/engine/js/config-loader.js +370 -0
  17. package/engine/js/config.js +173 -0
  18. package/engine/js/counter.js +17 -0
  19. package/engine/js/effects.js +97 -0
  20. package/engine/js/i18n.js +68 -0
  21. package/engine/js/init.js +107 -0
  22. package/engine/js/media.js +264 -0
  23. package/engine/js/render.js +282 -0
  24. package/engine/js/router.js +133 -0
  25. package/engine/js/sparkle.js +123 -0
  26. package/engine/js/themes.js +607 -0
  27. package/engine/style.css +2037 -0
  28. package/index.js +35 -0
  29. package/package.json +48 -0
  30. package/scripts/admin.js +67 -0
  31. package/scripts/build.js +142 -0
  32. package/scripts/init.js +237 -0
  33. package/scripts/post-install.js +16 -0
  34. package/scripts/serve.js +54 -0
  35. package/templates/user-portfolio/.github/workflows/deploy.yml +57 -0
  36. package/templates/user-portfolio/config/app.json +36 -0
  37. package/templates/user-portfolio/config/categories.json +241 -0
  38. package/templates/user-portfolio/config/languages.json +15 -0
  39. package/templates/user-portfolio/config/media-types.json +59 -0
  40. package/templates/user-portfolio/data/painting.json +3 -0
  41. package/templates/user-portfolio/data/projects.json +3 -0
  42. package/templates/user-portfolio/lang/en.json +114 -0
  43. package/templates/user-portfolio/lang/fr.json +114 -0
@@ -0,0 +1,2037 @@
1
+ /* ── Inline SVG Icons (replaces Font Awesome CDN) ── */
2
+ .icon {
3
+ display: inline-block;
4
+ width: 1em;
5
+ height: 1em;
6
+ vertical-align: -0.125em;
7
+ fill: currentColor;
8
+ }
9
+
10
+ :root {
11
+ /* ═══ JR-16 Palette (Lospec) ═══
12
+ #040404 Black #81f4b1 Mint green
13
+ #00374b Dark teal #72ffff Bright cyan
14
+ #003808 Forest green #a2a2ac Silver
15
+ #00374b Dark teal #4d84ff Bright blue
16
+ #580a0a Bordeaux #d76f6c Salmon pink
17
+ #520a54 Dark violet #d887f0 Lilac
18
+ #7a3820 Sienna #f6f8ad Pale yellow
19
+ #4b4956 Slate gray #f5fffd Off-white
20
+ ══════════════════════════════════ */
21
+
22
+ /* ── Page ── */
23
+ --page-bg: #e8e8f0;
24
+ /* Cool light gray (neutral canvas) */
25
+ --container-bg: #f5fffd;
26
+ /* Off-white */
27
+ --text-primary: #040404;
28
+ /* Black */
29
+ --text-secondary: #4b4956;
30
+ /* Slate gray */
31
+ --text-muted: #7a7a88;
32
+ /* Mid gray (readable) */
33
+ --text-dim: #4b4956;
34
+ /* Slate gray */
35
+ --text-light: #a2a2ac;
36
+ /* Silver */
37
+
38
+ /* ── Header / Branding ── */
39
+ --header-bg: #00374b;
40
+ /* Dark teal — strong identity bar */
41
+ --header-text: #f5fffd;
42
+ /* Off-white on navy */
43
+ --header-border-light: #81f4b1;
44
+ /* Mint green highlight */
45
+ --header-border-dark: #040404;
46
+ /* Black shadow */
47
+ /* Mirror title gradient (chrome text) */
48
+ --mirror-shine: #ffffff;
49
+ --mirror-light: #c0fad8;
50
+ --mirror-mid: #80d8a8;
51
+
52
+ /* ── Win95 Borders (3D effect) ── */
53
+ --border-light: #f5fffd;
54
+ /* Off-white */
55
+ --border-dark: #4b4956;
56
+ /* Slate gray */
57
+ --border-groove: #a2a2ac;
58
+ /* Silver */
59
+ --border-mid: #7a7a88;
60
+ /* Mid gray */
61
+
62
+ /* ── Win95 Buttons ── */
63
+ --btn-bg-start: #f5fffd;
64
+ /* Off-white */
65
+ --btn-bg-mid: #e8e8f0;
66
+ /* Light gray */
67
+ --btn-bg-end: #a2a2ac;
68
+ /* Silver */
69
+ --btn-hover-start: #e0f8ef;
70
+ /* Light mint highlight */
71
+ --btn-hover-mid: #f5fffd;
72
+ /* Off-white */
73
+ --btn-hover-end: #a2a2ac;
74
+ /* Silver */
75
+ --btn-active-start: #a2a2ac;
76
+ /* Silver */
77
+ --btn-active-mid: #4b4956;
78
+ /* Slate */
79
+ --btn-active-end: #e8e8f0;
80
+ /* Light gray */
81
+ --btn-text: #040404;
82
+ /* Black */
83
+ --btn-text-active: #00374b;
84
+ /* Dark teal */
85
+
86
+ /* ── Filter bar ── */
87
+ --filter-bg: #e8e8f0;
88
+ /* Cool light gray */
89
+
90
+ /* ── Lang switcher ── */
91
+ --lang-btn-bg: #a2a2ac;
92
+ /* Silver */
93
+ --lang-dropdown-bg: #f5fffd;
94
+ /* Off-white */
95
+
96
+ /* ── Terminal / CRT ── */
97
+ --term-bg: #040404;
98
+ /* Black */
99
+ --term-green: #81f4b1;
100
+ /* Mint green */
101
+ --term-green-dim: #003808;
102
+ /* Forest green */
103
+ --term-cyan: #72ffff;
104
+ /* Bright cyan */
105
+ --term-text: #a2a2ac;
106
+ /* Silver */
107
+ --term-dim: #4b4956;
108
+ /* Slate gray */
109
+ --term-titlebar: #00374b;
110
+ /* Dark teal */
111
+ --term-titlebar-border: #81f4b1;
112
+ /* Mint green */
113
+ --term-btn-close: #d76f6c;
114
+ /* Salmon (red-ish) */
115
+ --term-btn-min: #f6f8ad;
116
+ /* Pale yellow */
117
+ --term-btn-max: #81f4b1;
118
+ /* Mint green */
119
+
120
+ /* ── Marquee ── */
121
+ --marquee-bg: #040404;
122
+ /* Black */
123
+ --marquee-text: #81f4b1;
124
+ /* Mint green */
125
+
126
+ /* ── Winamp Player ── */
127
+ --wp-bg: #040404;
128
+ /* Black */
129
+ --wp-surface: #4b4956;
130
+ /* Slate gray */
131
+ --wp-display: #040404;
132
+ /* Black */
133
+ --wp-titlebar-start: #00374b;
134
+ /* Dark teal */
135
+ --wp-titlebar-mid: #520a54;
136
+ /* Dark violet */
137
+ --wp-playlist-bg: #040404;
138
+ /* Black */
139
+ --wp-btn-start: #4b4956;
140
+ /* Slate gray */
141
+ --wp-btn-mid: #00374b;
142
+ /* Dark teal */
143
+ --wp-btn-end: #040404;
144
+ /* Black */
145
+ --wp-btn-hover-start: #a2a2ac;
146
+ /* Silver */
147
+ --wp-btn-hover-mid: #4b4956;
148
+ /* Slate gray */
149
+ --wp-btn-hover-end: #00374b;
150
+ /* Dark teal */
151
+ --wp-text: #f6f8ad;
152
+ /* Pale yellow */
153
+ --wp-green: #81f4b1;
154
+ /* Mint green */
155
+ --wp-info: #72ffff;
156
+ /* Bright cyan */
157
+ --wp-selected: #00374b;
158
+ /* Dark teal */
159
+
160
+ /* ── Music / Audio ── */
161
+ --music-bg: #040404;
162
+ /* Black */
163
+ --music-gold: #f6f8ad;
164
+ /* Pale yellow */
165
+ --music-text: #f5fffd;
166
+ /* Off-white */
167
+ --music-text-dim: #a2a2ac;
168
+ /* Silver */
169
+
170
+ /* ── Gallery ── */
171
+ --gallery-border: #00374b;
172
+ /* Dark teal — ties to accent */
173
+
174
+ /* ── Detail page ── */
175
+ --detail-meta-bg: #e8e8f0;
176
+ /* Cool light gray */
177
+
178
+ /* ── Badges ── */
179
+ --badge-public-bg: #e8e8f0;
180
+ --badge-public-text: #4a4a5e;
181
+ --badge-private-bg: #e8e8f0;
182
+ --badge-private-text: #4a4a5e;
183
+
184
+ /* ── Visitor Counter ── */
185
+ --counter-text: #d76f6c;
186
+ /* Salmon — visible accent */
187
+
188
+ /* ── Accent ── */
189
+ --accent-navy: #00374b;
190
+ /* Dark teal */
191
+ --accent-magenta: #d887f0;
192
+ /* Lilac */
193
+ --accent-yellow: #f6f8ad;
194
+ /* Pale yellow */
195
+
196
+ /* ── Fonts (not theme-switched) ── */
197
+ --font-primary: "Verdana", sans-serif;
198
+ --font-mono: "Courier New", monospace;
199
+ --font-digital: "Digital-7", monospace;
200
+ --font-winamp: 'Arial', 'Helvetica', sans-serif;
201
+ --font-admin: 'MS Sans Serif', 'Arial', sans-serif;
202
+
203
+ /* ── Chrome / UI tones (dark widget surfaces) ── */
204
+ --chrome-black: #000;
205
+ /* Pure black */
206
+ --chrome-darkest: #111;
207
+ /* Near-black */
208
+ --chrome-darker: #222;
209
+ /* Very dark gray */
210
+ --chrome-dark: #333;
211
+ /* Dark gray */
212
+ --chrome-mid: #444;
213
+ /* Mid-dark gray */
214
+ --chrome-gray: #555;
215
+ /* Medium gray */
216
+ --chrome-light: #777;
217
+ /* Light-mid gray */
218
+ --chrome-border: #999;
219
+ /* Light border gray */
220
+ --chrome-soft: #ccc;
221
+ /* Soft gray */
222
+ --chrome-active: #252525;
223
+ /* Active pressed bg */
224
+ --chrome-grip-alt: #4a4a4a;
225
+ /* Grip pattern alt */
226
+ --chrome-vol-start: #060;
227
+ /* Volume gradient start */
228
+
229
+ /* ── Sparkle cursor colors ── */
230
+ --sparkle-1: #ffd700;
231
+ /* Gold */
232
+ --sparkle-2: #ff69b4;
233
+ /* Hot pink */
234
+ --sparkle-3: #00ffff;
235
+ /* Cyan */
236
+ --sparkle-4: #ff00ff;
237
+ /* Magenta */
238
+ --sparkle-5: #fff;
239
+ /* White */
240
+ --sparkle-6: #7fff00;
241
+ /* Chartreuse */
242
+ --sparkle-7: #ff4500;
243
+ /* Orange-red */
244
+
245
+ /* ── Petals ── */
246
+ --petal-color: #88d8b0;
247
+ /* Soft mint (JR-16 default) */
248
+
249
+ }
250
+
251
+ body {
252
+ background-color: var(--page-bg);
253
+ background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAMAAAAp4YyKAAAABlBMVEUAAAD///+l2Z/dAAAAbUlEQVR42u3TQQqAIBBF0d9F979mRREInAiaEPR9FzM6eA4A+K8iSioqqqiiiooqqqiiiooqqqiiiooqqqiiiooqqqiiiooqqqiiiooqqqiiiooqqqiiiooqqqiiiooqqqiiiooqqqiiiooqqqiiiooqiioqqiiioooAAAAAElFTkSuQmCC');
254
+ /* Subtle tiled pattern */
255
+ font-family: var(--font-primary);
256
+ color: var(--text-primary);
257
+ margin: 0;
258
+ padding: 20px;
259
+ }
260
+
261
+ /* ===== Petal Rain (Béton theme) ===== */
262
+ #petal-rain {
263
+ position: fixed;
264
+ inset: 0;
265
+ pointer-events: none;
266
+ z-index: 0;
267
+ overflow: hidden;
268
+ }
269
+
270
+ .petal {
271
+ position: absolute;
272
+ top: -20px;
273
+ background: var(--petal-color, #d88ca0);
274
+ border-radius: 50% 0 50% 0;
275
+ animation: petal-fall linear infinite;
276
+ }
277
+
278
+ @keyframes petal-fall {
279
+ 0% {
280
+ transform: translateY(-20px) rotate(0deg) translateX(0);
281
+ }
282
+
283
+ 25% {
284
+ transform: translateY(25vh) rotate(90deg) translateX(15px);
285
+ }
286
+
287
+ 50% {
288
+ transform: translateY(50vh) rotate(180deg) translateX(-10px);
289
+ }
290
+
291
+ 75% {
292
+ transform: translateY(75vh) rotate(270deg) translateX(20px);
293
+ }
294
+
295
+ 100% {
296
+ transform: translateY(105vh) rotate(360deg) translateX(0);
297
+ }
298
+ }
299
+
300
+ .container {
301
+ max-width: 900px;
302
+ margin: 0 auto;
303
+ background-color: var(--container-bg);
304
+ border: 3px solid;
305
+ border-color: var(--border-light) var(--border-dark) var(--border-dark) var(--border-light);
306
+ border-radius: 12px;
307
+ box-shadow:
308
+ 6px 6px 0px rgba(0, 0, 0, 0.35),
309
+ 12px 12px 0px rgba(0, 0, 0, 0.15),
310
+ inset 0 0 0 1px rgba(255, 255, 255, 0.5);
311
+ padding: 20px;
312
+ position: relative;
313
+ z-index: 1;
314
+ }
315
+
316
+ /* Settings Switcher (Theme + Language) */
317
+ .settings-switcher {
318
+ position: absolute;
319
+ top: 50%;
320
+ right: 10px;
321
+ transform: translateY(-50%);
322
+ z-index: 1000;
323
+ }
324
+
325
+ .settings-btn {
326
+ background: linear-gradient(180deg, var(--btn-bg-start) 0%, var(--btn-bg-mid) 50%, var(--btn-bg-end) 100%);
327
+ border: 2px outset var(--container-bg);
328
+ border-radius: 6px;
329
+ padding: 3px 7px;
330
+ cursor: pointer;
331
+ font-size: 16px;
332
+ line-height: 1;
333
+ color: var(--btn-text);
334
+ }
335
+
336
+ .settings-btn:hover {
337
+ background: linear-gradient(180deg, var(--btn-hover-start) 0%, var(--btn-hover-mid) 50%, var(--btn-hover-end) 100%);
338
+ color: var(--btn-text-active);
339
+ }
340
+
341
+ .settings-btn:active {
342
+ border-style: inset;
343
+ }
344
+
345
+ .settings-dropdown {
346
+ display: none;
347
+ position: absolute;
348
+ right: 0;
349
+ top: 100%;
350
+ background: linear-gradient(180deg, var(--btn-bg-start) 0%, var(--btn-bg-mid) 50%, var(--btn-bg-end) 100%);
351
+ border: 2px outset var(--container-bg);
352
+ border-radius: 8px;
353
+ width: 180px;
354
+ box-shadow: 3px 3px 0px rgba(0, 0, 0, 0.2);
355
+ overflow: hidden;
356
+ }
357
+
358
+ .settings-switcher:hover .settings-dropdown {
359
+ display: block;
360
+ }
361
+
362
+ .settings-option {
363
+ padding: 4px 10px;
364
+ cursor: pointer;
365
+ display: flex;
366
+ align-items: center;
367
+ gap: 10px;
368
+ text-decoration: none;
369
+ color: var(--btn-text);
370
+ font-size: 12px;
371
+ }
372
+
373
+ .settings-option:hover {
374
+ background: linear-gradient(180deg, var(--btn-hover-start) 0%, var(--btn-hover-mid) 50%, var(--btn-hover-end) 100%);
375
+ color: var(--btn-text-active);
376
+ }
377
+
378
+ .settings-section-label {
379
+ padding: 4px 10px 2px;
380
+ font-size: 10px;
381
+ font-weight: bold;
382
+ text-transform: uppercase;
383
+ letter-spacing: 1px;
384
+ color: var(--text-muted);
385
+ cursor: default;
386
+ }
387
+
388
+ .settings-divider {
389
+ height: 1px;
390
+ margin: 3px 8px;
391
+ border-top: 1px groove var(--border-groove);
392
+ }
393
+
394
+ .lang-flag {
395
+ font-size: 16px;
396
+ }
397
+
398
+ .theme-icon {
399
+ font-size: 16px;
400
+ }
401
+
402
+ header {
403
+ background-color: var(--header-bg);
404
+ background-image: linear-gradient(180deg, rgba(255, 255, 255, 0.4) 0%, rgba(255, 255, 255, 0) 40%, rgba(0, 0, 0, 0.05) 100%);
405
+ border: 2px solid;
406
+ border-color: var(--header-border-light) var(--header-border-dark) var(--header-border-dark) var(--header-border-light);
407
+ border-radius: 10px;
408
+ padding: 10px;
409
+ margin-bottom: 20px;
410
+ text-align: center;
411
+ box-shadow: inset 1px 1px 0 rgba(255, 255, 255, 0.6), inset -1px -1px 0 rgba(0, 0, 0, 0.1);
412
+ position: relative;
413
+ }
414
+
415
+ h1 {
416
+ font-size: 3.2em;
417
+ font-weight: 900;
418
+ margin: 0;
419
+ letter-spacing: 0.3em;
420
+ text-transform: lowercase;
421
+ background: linear-gradient(135deg,
422
+ var(--mirror-shine) 0%,
423
+ var(--mirror-light) 25%,
424
+ var(--mirror-mid) 50%,
425
+ var(--mirror-light) 75%,
426
+ var(--mirror-shine) 100%);
427
+ -webkit-background-clip: text;
428
+ background-clip: text;
429
+ -webkit-text-fill-color: transparent;
430
+ color: var(--header-text);
431
+ filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.4));
432
+ }
433
+
434
+ nav {
435
+ display: flex;
436
+ justify-content: center;
437
+ gap: 15px;
438
+ background: var(--lang-dropdown-bg);
439
+ padding: 10px;
440
+ border: 2px outset var(--container-bg);
441
+ border-radius: 8px;
442
+ margin-top: 10px;
443
+ }
444
+
445
+ .filter-bar {
446
+ display: flex;
447
+ flex-wrap: nowrap;
448
+ gap: 4px;
449
+ margin-bottom: 15px;
450
+ padding: 8px;
451
+ background: var(--filter-bg);
452
+ border: 2px inset var(--container-bg);
453
+ border-radius: 8px;
454
+ align-items: center;
455
+ overflow-x: auto;
456
+ }
457
+
458
+ .filter-btn {
459
+ flex: 1;
460
+ text-align: center;
461
+ white-space: nowrap;
462
+ text-decoration: none;
463
+ color: var(--btn-text);
464
+ font-weight: bold;
465
+ padding: 5px 4px;
466
+ border: 2px outset var(--container-bg);
467
+ border-radius: 6px;
468
+ background: linear-gradient(180deg, var(--btn-bg-start) 0%, var(--btn-bg-mid) 50%, var(--btn-bg-end) 100%);
469
+ box-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2);
470
+ cursor: pointer;
471
+ font-family: inherit;
472
+ font-size: inherit;
473
+ }
474
+
475
+ .filter-btn:hover {
476
+ background: linear-gradient(180deg, var(--btn-hover-start) 0%, var(--btn-hover-mid) 50%, var(--btn-hover-end) 100%);
477
+ color: var(--btn-text-active);
478
+ }
479
+
480
+ .filter-btn:active {
481
+ border-style: inset;
482
+ background: linear-gradient(180deg, var(--btn-active-start) 0%, var(--btn-active-mid) 50%, var(--btn-active-end) 100%);
483
+ box-shadow: inset 1px 1px 2px rgba(0, 0, 0, 0.3);
484
+ }
485
+
486
+ .filter-btn.active {
487
+ border-style: inset;
488
+ background: linear-gradient(180deg, var(--btn-bg-end) 0%, var(--btn-bg-mid) 50%, var(--btn-hover-mid) 100%);
489
+ color: var(--btn-text-active);
490
+ box-shadow: inset 1px 1px 3px rgba(0, 0, 0, 0.3);
491
+ }
492
+
493
+ .sort-controls {
494
+ margin-left: auto;
495
+ display: flex;
496
+ gap: 2px;
497
+ flex-shrink: 0;
498
+ }
499
+
500
+ .sort-btn {
501
+ padding: 5px 8px;
502
+ border: 2px outset var(--container-bg);
503
+ border-radius: 6px;
504
+ background: linear-gradient(180deg, var(--btn-bg-start) 0%, var(--btn-bg-mid) 50%, var(--btn-bg-end) 100%);
505
+ cursor: pointer;
506
+ font-family: inherit;
507
+ color: var(--btn-text);
508
+ }
509
+
510
+ .sort-btn:hover {
511
+ color: var(--btn-text-active);
512
+ background: linear-gradient(180deg, var(--btn-hover-start) 0%, var(--btn-hover-mid) 50%, var(--btn-hover-end) 100%);
513
+ }
514
+
515
+ .sort-btn.active {
516
+ border-style: inset;
517
+ background: linear-gradient(180deg, var(--btn-bg-end) 0%, var(--btn-bg-mid) 50%, var(--btn-hover-mid) 100%);
518
+ color: var(--btn-text-active);
519
+ box-shadow: inset 1px 1px 2px rgba(0, 0, 0, 0.3);
520
+ }
521
+
522
+ .category-icon {
523
+ font-size: 0.85em;
524
+ }
525
+
526
+ .marquee-container {
527
+ background: var(--marquee-bg);
528
+ color: var(--marquee-text);
529
+ padding: 5px 8px;
530
+ font-family: var(--font-mono);
531
+ margin-bottom: 20px;
532
+ border: 3px solid;
533
+ border-color: var(--text-primary) var(--text-secondary) var(--text-secondary) var(--text-primary);
534
+ border-radius: 8px;
535
+ box-shadow: inset 0 0 10px var(--marquee-glow, rgba(0, 255, 0, 0.1)), inset 2px 2px 4px rgba(0, 0, 0, 0.5);
536
+ text-shadow: 0 0 5px var(--marquee-glow-text, rgba(0, 255, 0, 0.5));
537
+ }
538
+
539
+ .content {
540
+ display: flex;
541
+ gap: 20px;
542
+ align-items: stretch;
543
+ }
544
+
545
+ .sidebar {
546
+ width: 220px;
547
+ min-width: 220px;
548
+ display: flex;
549
+ flex-direction: column;
550
+ }
551
+
552
+ #app {
553
+ flex: 1;
554
+ min-width: 0;
555
+ }
556
+
557
+ .gallery-grid {
558
+ display: grid;
559
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
560
+ gap: 15px;
561
+ }
562
+
563
+ .load-more-btn {
564
+ grid-column: 1 / -1;
565
+ padding: 10px 30px;
566
+ margin: 10px auto;
567
+ background: linear-gradient(180deg, var(--btn-bg-start) 0%, var(--btn-bg-mid) 50%, var(--btn-bg-end) 100%);
568
+ color: var(--btn-text);
569
+ border: 3px ridge var(--border-groove);
570
+ border-radius: 8px;
571
+ cursor: pointer;
572
+ font-family: var(--font-primary);
573
+ font-size: 13px;
574
+ }
575
+
576
+ .load-more-btn:hover {
577
+ background: linear-gradient(180deg, var(--btn-hover-start) 0%, var(--btn-hover-mid) 50%, var(--btn-hover-end) 100%);
578
+ color: var(--btn-text-active);
579
+ }
580
+
581
+ .gallery-item {
582
+ border: 4px ridge rgba(0, 0, 0, 0.1);
583
+ border-radius: 10px;
584
+ padding: 5px;
585
+ background: var(--container-bg);
586
+ box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.2);
587
+ overflow: hidden;
588
+ }
589
+
590
+ .gallery-item img {
591
+ width: 100%;
592
+ height: 180px;
593
+ object-fit: cover;
594
+ border-radius: 6px;
595
+ }
596
+
597
+ .gallery-img-wrap {
598
+ position: relative;
599
+ display: block;
600
+ }
601
+
602
+ .gallery-img-wrap img {
603
+ display: block;
604
+ }
605
+
606
+ .pile-badge {
607
+ position: absolute;
608
+ top: 6px;
609
+ right: 6px;
610
+ background: rgba(0, 0, 0, 0.7);
611
+ color: #fff;
612
+ font-size: 11px;
613
+ font-weight: bold;
614
+ padding: 2px 6px;
615
+ border-radius: 4px;
616
+ pointer-events: none;
617
+ line-height: 1.3;
618
+ letter-spacing: 0.5px;
619
+ }
620
+
621
+ /* ===== TERMINAL FOOTER ===== */
622
+ .footer-terminal {
623
+ margin-top: 30px;
624
+ }
625
+
626
+ .terminal-window {
627
+ background: transparent;
628
+ position: relative;
629
+ overflow: hidden;
630
+ }
631
+
632
+ /* CRT scanlines removed — clean terminal footer */
633
+
634
+ /* Title bar — hidden, keeping terminal feel without window chrome */
635
+ .terminal-titlebar {
636
+ display: none;
637
+ }
638
+
639
+ .terminal-titlebar-btns {
640
+ display: flex;
641
+ gap: 5px;
642
+ }
643
+
644
+ .terminal-tbtn {
645
+ width: 8px;
646
+ height: 8px;
647
+ border-radius: 50%;
648
+ }
649
+
650
+ .terminal-tbtn-close {
651
+ background: var(--term-btn-close);
652
+ }
653
+
654
+ .terminal-tbtn-min {
655
+ background: var(--term-btn-min);
656
+ }
657
+
658
+ .terminal-tbtn-max {
659
+ background: var(--term-btn-max);
660
+ }
661
+
662
+ .terminal-titlebar-text {
663
+ font-family: var(--font-mono);
664
+ font-size: 10px;
665
+ color: var(--term-dim);
666
+ }
667
+
668
+ /* Terminal body */
669
+ .terminal-body {
670
+ padding: 10px 12px;
671
+ font-family: var(--font-mono);
672
+ line-height: 1.7;
673
+ position: relative;
674
+ z-index: 0;
675
+ }
676
+
677
+ .terminal-line {
678
+ color: var(--text-secondary);
679
+ margin-top: 2px;
680
+ }
681
+
682
+ .terminal-line:first-child {
683
+ margin-top: 0;
684
+ }
685
+
686
+ .terminal-line a {
687
+ color: var(--text-primary);
688
+ text-decoration: none;
689
+ font-weight: bold;
690
+ transition: all 0.15s ease;
691
+ }
692
+
693
+ .terminal-line a:hover {
694
+ color: var(--accent-navy);
695
+ }
696
+
697
+ .terminal-line a .fa {
698
+ color: var(--text-muted);
699
+ }
700
+
701
+ .terminal-line a:hover .fa {
702
+ color: var(--accent-navy);
703
+ }
704
+
705
+ .terminal-prompt {
706
+ color: var(--text-primary);
707
+ font-weight: bold;
708
+ }
709
+
710
+ .terminal-output {
711
+ color: var(--term-text);
712
+ padding-left: 14px;
713
+ margin-bottom: 2px;
714
+ }
715
+
716
+ .terminal-dim {
717
+ color: var(--text-muted);
718
+ }
719
+
720
+ /* Social links inline */
721
+ .terminal-links {
722
+ display: flex;
723
+ gap: 12px;
724
+ }
725
+
726
+ .terminal-links a {
727
+ color: var(--term-green);
728
+ text-decoration: none;
729
+ display: inline-flex;
730
+ align-items: center;
731
+ gap: 5px;
732
+ transition: all 0.15s ease;
733
+ }
734
+
735
+ .terminal-links a:hover {
736
+ color: var(--container-bg);
737
+ text-shadow: 0 0 8px var(--term-glow, rgba(0, 255, 0, 0.5));
738
+ }
739
+
740
+ .terminal-links a .fa {
741
+ color: var(--term-green-dim);
742
+ font-size: 12px;
743
+ }
744
+
745
+ .terminal-links a:hover .fa {
746
+ color: var(--term-green);
747
+ }
748
+
749
+ /* Visitor counter in terminal */
750
+ .terminal-body .visitor-counter {
751
+ background: transparent;
752
+ border: none;
753
+ box-shadow: none;
754
+ color: var(--text-muted);
755
+ padding: 0;
756
+ font-family: var(--font-mono);
757
+ text-shadow: none;
758
+ letter-spacing: 1px;
759
+ }
760
+
761
+ /* Blinking cursor */
762
+ .terminal-cursor {
763
+ animation: cursor-blink 1s steps(1) infinite;
764
+ color: var(--text-primary);
765
+ }
766
+
767
+ @keyframes cursor-blink {
768
+
769
+ 0%,
770
+ 49% {
771
+ opacity: 1;
772
+ }
773
+
774
+ 50%,
775
+ 100% {
776
+ opacity: 0;
777
+ }
778
+ }
779
+
780
+ .visitor-counter {
781
+ background: var(--term-bg);
782
+ color: var(--counter-text);
783
+ padding: 2px 8px;
784
+ font-family: var(--font-digital);
785
+ border: 2px inset var(--term-dim);
786
+ border-radius: 4px;
787
+ box-shadow: inset 1px 1px 3px rgba(0, 0, 0, 0.6), 0 0 4px rgba(255, 0, 0, 0.15);
788
+ text-shadow: 0 0 6px rgba(255, 0, 0, 0.5);
789
+ letter-spacing: 2px;
790
+ }
791
+
792
+ .social-links {
793
+ list-style: none;
794
+ padding: 0;
795
+ }
796
+
797
+ .social-links li {
798
+ margin-bottom: 8px;
799
+ }
800
+
801
+ .social-links a {
802
+ display: flex;
803
+ align-items: center;
804
+ gap: 8px;
805
+ text-decoration: none;
806
+ font-weight: bold;
807
+ }
808
+
809
+ .social-links i {
810
+ font-size: 1.2em;
811
+ width: 20px;
812
+ text-align: center;
813
+ color: var(--accent-navy);
814
+ }
815
+
816
+ /* ===== WINAMP PLAYER ===== */
817
+ .winamp {
818
+ background: rgba(0, 0, 0, 0.3);
819
+ border: 1px solid rgba(0, 0, 0, 0.2);
820
+ border-radius: 10px;
821
+ font-family: var(--font-winamp);
822
+ font-size: 10px;
823
+ box-shadow: none;
824
+ overflow: hidden;
825
+ transition: box-shadow 0.5s ease;
826
+ flex: 1;
827
+ display: flex;
828
+ flex-direction: column;
829
+ }
830
+
831
+ /* ── Playing state effects ── */
832
+ .winamp.playing {
833
+ box-shadow:
834
+ 2px 2px 6px rgba(0, 0, 0, 0.5),
835
+ 0 0 8px var(--wp-glow-mid, rgba(0, 255, 0, 0.15)),
836
+ 0 0 20px var(--wp-glow-soft, rgba(0, 255, 0, 0.08));
837
+ animation: winamp-glow 2s ease-in-out infinite;
838
+ }
839
+
840
+ @keyframes winamp-glow {
841
+
842
+ 0%,
843
+ 100% {
844
+ box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.5), 0 0 6px var(--wp-glow-soft, rgba(0, 255, 0, 0.12)), 0 0 16px var(--wp-glow-faint, rgba(0, 255, 0, 0.06));
845
+ }
846
+
847
+ 50% {
848
+ box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.5), 0 0 12px var(--wp-glow-mid, rgba(0, 255, 0, 0.25)), 0 0 28px var(--wp-glow-soft, rgba(0, 255, 0, 0.12));
849
+ }
850
+ }
851
+
852
+ /* CRT scanline overlay when playing */
853
+ .winamp.playing .winamp-display::after {
854
+ content: '';
855
+ position: absolute;
856
+ inset: 0;
857
+ background: repeating-linear-gradient(0deg,
858
+ transparent 0px,
859
+ transparent 1px,
860
+ rgba(0, 0, 0, 0.12) 1px,
861
+ rgba(0, 0, 0, 0.12) 2px);
862
+ pointer-events: none;
863
+ animation: winamp-scanline 4s linear infinite;
864
+ }
865
+
866
+ @keyframes winamp-scanline {
867
+ 0% {
868
+ background-position: 0 0;
869
+ }
870
+
871
+ 100% {
872
+ background-position: 0 40px;
873
+ }
874
+ }
875
+
876
+ /* Pulsing time display when playing */
877
+ .winamp.playing .winamp-time {
878
+ animation: winamp-time-pulse 1.2s ease-in-out infinite;
879
+ }
880
+
881
+ @keyframes winamp-time-pulse {
882
+
883
+ 0%,
884
+ 100% {
885
+ text-shadow: 0 0 6px currentColor;
886
+ }
887
+
888
+ 50% {
889
+ text-shadow: 0 0 10px currentColor;
890
+ }
891
+ }
892
+
893
+ /* Subtle glow on playing ticker text */
894
+ .winamp.playing .winamp-ticker .radio-track-name {
895
+ text-shadow: 0 0 8px currentColor;
896
+ }
897
+
898
+
899
+ /* Active playlist item pulses gently when playing */
900
+ .winamp.playing .winamp-pl-item.active {
901
+ animation: winamp-pl-pulse 2.5s ease-in-out infinite;
902
+ }
903
+
904
+ @keyframes winamp-pl-pulse {
905
+
906
+ 0%,
907
+ 100% {
908
+ background: transparent;
909
+ }
910
+
911
+ 50% {
912
+ background: rgba(0, 0, 0, 0.06);
913
+ }
914
+ }
915
+
916
+ /* Titlebar — dark gradient with grippy texture */
917
+ .winamp-titlebar {
918
+ display: flex;
919
+ align-items: center;
920
+ justify-content: space-between;
921
+ background: transparent;
922
+ padding: 3px 4px;
923
+ gap: 4px;
924
+ cursor: default;
925
+ border-bottom: none;
926
+ }
927
+
928
+ .winamp-title {
929
+ color: var(--text-primary);
930
+ font-weight: bold;
931
+ letter-spacing: 0.5px;
932
+ text-transform: uppercase;
933
+ white-space: nowrap;
934
+ }
935
+
936
+ .winamp-grip {
937
+ flex: 1;
938
+ height: 7px;
939
+ background: repeating-linear-gradient(0deg,
940
+ var(--chrome-gray) 0px, var(--chrome-gray) 1px,
941
+ var(--chrome-dark) 1px, var(--chrome-dark) 2px);
942
+ border-radius: 1px;
943
+ }
944
+
945
+ .winamp-grip-sm {
946
+ flex: 1;
947
+ height: 5px;
948
+ background: repeating-linear-gradient(0deg,
949
+ var(--chrome-grip-alt) 0px, var(--chrome-grip-alt) 1px,
950
+ var(--wp-surface) 1px, var(--wp-surface) 2px);
951
+ }
952
+
953
+ /* Main Display — LCD screen */
954
+ .winamp-display {
955
+ background: transparent;
956
+ margin: 3px;
957
+ padding: 4px 5px;
958
+ border: none;
959
+ position: relative;
960
+ }
961
+
962
+ /* Visualizer bars */
963
+ .winamp-viz {
964
+ display: flex;
965
+ align-items: flex-end;
966
+ gap: 1px;
967
+ height: 18px;
968
+ margin-top: 4px;
969
+ margin-bottom: 3px;
970
+ }
971
+
972
+ .winamp-viz-bar {
973
+ flex: 1;
974
+ min-width: 0;
975
+ background: linear-gradient(0deg, var(--text-muted) 0%, var(--text-secondary) 40%, var(--accent-navy) 70%, var(--text-primary) 100%);
976
+ height: 3%;
977
+ transition: height 0.1s ease-out;
978
+ border-radius: 0 0 0 0;
979
+ }
980
+
981
+ /* Info strip (bitrate, freq) */
982
+ .winamp-info {
983
+ display: flex;
984
+ gap: 8px;
985
+ margin-bottom: 2px;
986
+ }
987
+
988
+ .winamp-bitrate,
989
+ .winamp-freq {
990
+ color: var(--text-muted);
991
+ font-size: 8px;
992
+ font-family: var(--font-mono);
993
+ }
994
+
995
+ .winamp-kbps,
996
+ .winamp-khz {
997
+ color: var(--text-secondary);
998
+ font-weight: bold;
999
+ font-size: 9px;
1000
+ }
1001
+
1002
+ /* Scrolling track name */
1003
+ .winamp-ticker {
1004
+ color: var(--text-primary);
1005
+ font-size: 13px;
1006
+ font-weight: bold;
1007
+ font-family: var(--font-mono);
1008
+ overflow: hidden;
1009
+ white-space: nowrap;
1010
+ position: relative;
1011
+ }
1012
+
1013
+ .winamp-ticker .radio-track-name {
1014
+ display: inline-block;
1015
+ animation: ticker-scroll var(--ticker-speed, 8s) linear infinite;
1016
+ }
1017
+
1018
+ @keyframes ticker-scroll {
1019
+ 0% {
1020
+ transform: translateX(100%);
1021
+ }
1022
+
1023
+ 100% {
1024
+ transform: translateX(var(--ticker-end, -100%));
1025
+ }
1026
+ }
1027
+
1028
+ /* Time row */
1029
+ .winamp-time-row {
1030
+ display: flex;
1031
+ align-items: baseline;
1032
+ gap: 2px;
1033
+ margin-bottom: 4px;
1034
+ }
1035
+
1036
+ .winamp-time {
1037
+ color: var(--text-primary);
1038
+ font-size: 14px;
1039
+ font-weight: bold;
1040
+ font-family: var(--font-mono);
1041
+ letter-spacing: 1px;
1042
+ }
1043
+
1044
+ .winamp-time-sep {
1045
+ color: var(--text-muted);
1046
+ font-size: 11px;
1047
+ font-family: var(--font-mono);
1048
+ }
1049
+
1050
+ .winamp-duration {
1051
+ color: var(--text-muted);
1052
+ font-size: 11px;
1053
+ font-family: var(--font-mono);
1054
+ letter-spacing: 1px;
1055
+ }
1056
+
1057
+ /* Transport buttons row */
1058
+ .winamp-transport {
1059
+ display: flex;
1060
+ justify-content: center;
1061
+ gap: 2px;
1062
+ padding: 3px 3px 2px;
1063
+ background: transparent;
1064
+ border-top: none;
1065
+ }
1066
+
1067
+ .winamp-btn {
1068
+ background: transparent;
1069
+ border: none;
1070
+ border-radius: 5px;
1071
+ color: var(--text-primary);
1072
+ width: 28px;
1073
+ height: 20px;
1074
+ cursor: pointer;
1075
+ font-size: 9px;
1076
+ display: flex;
1077
+ align-items: center;
1078
+ justify-content: center;
1079
+ padding: 0;
1080
+ }
1081
+
1082
+ .winamp-btn:hover {
1083
+ color: var(--accent-navy);
1084
+ }
1085
+
1086
+ .winamp-btn:active {
1087
+ color: var(--text-muted);
1088
+ }
1089
+
1090
+ .winamp-btn .fa {
1091
+ font-size: 9px;
1092
+ }
1093
+
1094
+ /* Volume row */
1095
+ .winamp-volume-row {
1096
+ display: flex;
1097
+ align-items: center;
1098
+ gap: 3px;
1099
+ padding: 2px 5px;
1100
+ background: transparent;
1101
+ }
1102
+
1103
+ .winamp-vol-icon {
1104
+ color: var(--text-secondary);
1105
+ font-size: 8px;
1106
+ }
1107
+
1108
+ .winamp-volume {
1109
+ flex: 1;
1110
+ height: 4px;
1111
+ -webkit-appearance: none;
1112
+ appearance: none;
1113
+ background: transparent;
1114
+ cursor: pointer;
1115
+ }
1116
+
1117
+ .winamp-volume::-webkit-slider-runnable-track {
1118
+ height: 4px;
1119
+ background: linear-gradient(90deg, var(--chrome-vol-start) 0%, var(--text-muted) 50%, var(--text-secondary) 100%);
1120
+ border: 1px solid var(--chrome-darkest);
1121
+ border-radius: 2px;
1122
+ }
1123
+
1124
+ .winamp-volume::-webkit-slider-thumb {
1125
+ -webkit-appearance: none;
1126
+ width: 8px;
1127
+ height: 10px;
1128
+ margin-top: -4px;
1129
+ background: linear-gradient(180deg, var(--text-secondary) 0%, var(--chrome-mid) 100%);
1130
+ border: 1px solid;
1131
+ border-color: var(--text-muted) var(--chrome-darker) var(--chrome-darker) var(--text-muted);
1132
+ border-radius: 2px;
1133
+ cursor: pointer;
1134
+ }
1135
+
1136
+ .winamp-volume::-moz-range-track {
1137
+ height: 4px;
1138
+ background: linear-gradient(90deg, var(--chrome-vol-start) 0%, var(--text-muted) 50%, var(--text-secondary) 100%);
1139
+ border: 1px solid var(--chrome-darkest);
1140
+ border-radius: 2px;
1141
+ }
1142
+
1143
+ .winamp-volume::-moz-range-thumb {
1144
+ width: 8px;
1145
+ height: 10px;
1146
+ background: linear-gradient(180deg, var(--text-secondary) 0%, var(--chrome-mid) 100%);
1147
+ border: 1px solid;
1148
+ border-color: var(--text-muted) var(--chrome-darker) var(--chrome-darker) var(--text-muted);
1149
+ border-radius: 2px;
1150
+ cursor: pointer;
1151
+ }
1152
+
1153
+ /* Seek bar */
1154
+ .winamp-seek-row {
1155
+ padding: 1px 5px 3px;
1156
+ background: transparent;
1157
+ }
1158
+
1159
+ .winamp-seek {
1160
+ width: 100%;
1161
+ height: 6px;
1162
+ -webkit-appearance: none;
1163
+ appearance: none;
1164
+ background: transparent;
1165
+ cursor: pointer;
1166
+ }
1167
+
1168
+ .winamp-seek::-webkit-slider-runnable-track {
1169
+ height: 4px;
1170
+ background: var(--chrome-darkest);
1171
+ border: 1px solid var(--text-primary);
1172
+ border-radius: 2px;
1173
+ }
1174
+
1175
+ .winamp-seek::-webkit-slider-thumb {
1176
+ -webkit-appearance: none;
1177
+ width: 14px;
1178
+ height: 8px;
1179
+ margin-top: -3px;
1180
+ background: linear-gradient(180deg, var(--chrome-light) 0%, var(--term-dim) 50%, var(--text-primary) 100%);
1181
+ border: 1px solid;
1182
+ border-color: var(--chrome-border) var(--chrome-darker) var(--chrome-darker) var(--chrome-border);
1183
+ border-radius: 2px;
1184
+ cursor: pointer;
1185
+ }
1186
+
1187
+ .winamp-seek::-moz-range-track {
1188
+ height: 4px;
1189
+ background: var(--chrome-darkest);
1190
+ border: 1px solid var(--text-primary);
1191
+ border-radius: 2px;
1192
+ }
1193
+
1194
+ .winamp-seek::-moz-range-thumb {
1195
+ width: 14px;
1196
+ height: 8px;
1197
+ background: linear-gradient(180deg, var(--chrome-light) 0%, var(--term-dim) 50%, var(--text-primary) 100%);
1198
+ border: 1px solid;
1199
+ border-color: var(--chrome-border) var(--chrome-darker) var(--chrome-darker) var(--chrome-border);
1200
+ border-radius: 2px;
1201
+ cursor: pointer;
1202
+ }
1203
+
1204
+ /* Playlist title bar */
1205
+ .winamp-playlist-titlebar {
1206
+ display: flex;
1207
+ align-items: center;
1208
+ justify-content: space-between;
1209
+ background: transparent;
1210
+ padding: 2px 4px;
1211
+ gap: 4px;
1212
+ border-top: none;
1213
+ }
1214
+
1215
+ .winamp-pl-title {
1216
+ color: var(--text-secondary);
1217
+ font-size: 8px;
1218
+ font-weight: bold;
1219
+ letter-spacing: 1px;
1220
+ }
1221
+
1222
+ /* Playlist panel */
1223
+ .winamp-playlist {
1224
+ flex: 1;
1225
+ overflow-y: auto;
1226
+ background: transparent;
1227
+ border-top: none;
1228
+ }
1229
+
1230
+ .winamp-pl-item {
1231
+ padding: 2px 5px;
1232
+ color: var(--text-secondary);
1233
+ cursor: default;
1234
+ white-space: nowrap;
1235
+ overflow: hidden;
1236
+ text-overflow: ellipsis;
1237
+ font-family: var(--font-winamp);
1238
+ border-bottom: 1px solid rgba(255, 255, 255, 0.03);
1239
+ }
1240
+
1241
+ .winamp-pl-item:hover {
1242
+ background: rgba(0, 0, 0, 0.05);
1243
+ }
1244
+
1245
+ .winamp-pl-item.selected {
1246
+ background: var(--wp-selected);
1247
+ color: var(--container-bg);
1248
+ }
1249
+
1250
+ .winamp-pl-item.active {
1251
+ color: var(--text-primary);
1252
+ font-weight: bold;
1253
+ }
1254
+
1255
+ .winamp-pl-item.active .winamp-pl-num {
1256
+ color: var(--text-primary);
1257
+ }
1258
+
1259
+ .winamp-pl-num {
1260
+ color: var(--text-muted);
1261
+ margin-right: 3px;
1262
+ }
1263
+
1264
+ .winamp-pl-empty {
1265
+ color: var(--term-dim);
1266
+ cursor: default;
1267
+ font-style: italic;
1268
+ text-align: center;
1269
+ padding: 15px 5px;
1270
+ }
1271
+
1272
+ /* Playlist scrollbar */
1273
+ .winamp-playlist::-webkit-scrollbar {
1274
+ width: 8px;
1275
+ }
1276
+
1277
+ .winamp-playlist::-webkit-scrollbar-track {
1278
+ background: var(--chrome-darkest);
1279
+ }
1280
+
1281
+ .winamp-playlist::-webkit-scrollbar-thumb {
1282
+ background: linear-gradient(180deg, var(--term-dim), var(--text-primary));
1283
+ border: 1px solid var(--text-secondary);
1284
+ }
1285
+
1286
+ .winamp-playlist::-webkit-scrollbar-thumb:hover {
1287
+ background: linear-gradient(180deg, var(--text-secondary), var(--chrome-mid));
1288
+ }
1289
+
1290
+ .btn {
1291
+ text-decoration: none;
1292
+ color: var(--btn-text);
1293
+ font-weight: bold;
1294
+ padding: 5px 15px;
1295
+ border: 2px outset var(--container-bg);
1296
+ border-radius: 6px;
1297
+ background: linear-gradient(180deg, var(--btn-bg-start) 0%, var(--btn-bg-mid) 50%, var(--btn-bg-end) 100%);
1298
+ display: inline-block;
1299
+ box-shadow: 1px 1px 0 rgba(0, 0, 0, 0.2);
1300
+ }
1301
+
1302
+ .btn:hover {
1303
+ background: linear-gradient(180deg, var(--btn-hover-start) 0%, var(--btn-hover-mid) 50%, var(--btn-hover-end) 100%);
1304
+ color: var(--btn-text-active);
1305
+ }
1306
+
1307
+ .btn:active {
1308
+ border-style: inset;
1309
+ background: linear-gradient(180deg, var(--btn-active-start) 0%, var(--btn-active-mid) 50%, var(--btn-active-end) 100%);
1310
+ box-shadow: inset 1px 1px 2px rgba(0, 0, 0, 0.3);
1311
+ }
1312
+
1313
+ .social-links a:hover i {
1314
+ color: var(--accent-magenta);
1315
+ }
1316
+
1317
+
1318
+ /* Video Player */
1319
+ .video-section {
1320
+ margin-top: 15px;
1321
+ }
1322
+
1323
+ .video-frame {
1324
+ position: relative;
1325
+ border: 4px ridge var(--btn-bg-end);
1326
+ background: var(--wp-display);
1327
+ width: 100%;
1328
+ aspect-ratio: 4 / 3;
1329
+ overflow: hidden;
1330
+ box-shadow: inset 2px 2px 6px rgba(0, 0, 0, 0.5), 2px 2px 4px rgba(0, 0, 0, 0.2);
1331
+ }
1332
+
1333
+ .retro-video {
1334
+ width: 100%;
1335
+ height: 100%;
1336
+ object-fit: cover;
1337
+ filter: sepia(0.3) contrast(1.2) brightness(0.8);
1338
+ }
1339
+
1340
+ .video-overlay {
1341
+ position: absolute;
1342
+ bottom: 5px;
1343
+ left: 5px;
1344
+ color: var(--container-bg);
1345
+ font-size: 9px;
1346
+ background: rgba(0, 0, 0, 0.5);
1347
+ padding: 2px 5px;
1348
+ pointer-events: none;
1349
+ }
1350
+
1351
+ .item-date {
1352
+ color: var(--text-secondary);
1353
+ margin-top: 1px;
1354
+ }
1355
+
1356
+ /* Music Page - Track Styles */
1357
+ .track-list {
1358
+ list-style: none;
1359
+ padding: 0;
1360
+ margin: 20px 0;
1361
+ }
1362
+
1363
+ .track-item {
1364
+ background: var(--music-bg);
1365
+ border: 1px solid var(--chrome-mid);
1366
+ padding: 15px;
1367
+ margin-bottom: 10px;
1368
+ display: flex;
1369
+ gap: 15px;
1370
+ align-items: center;
1371
+ }
1372
+
1373
+ .track-info {
1374
+ flex: 1;
1375
+ }
1376
+
1377
+ .track-title {
1378
+ font-size: 14px;
1379
+ font-weight: bold;
1380
+ color: var(--music-gold);
1381
+ margin: 0 0 4px;
1382
+ }
1383
+
1384
+ .track-meta {
1385
+ font-size: 11px;
1386
+ color: var(--music-text-dim);
1387
+ }
1388
+
1389
+ .track-meta span {
1390
+ margin-right: 10px;
1391
+ }
1392
+
1393
+ .track-description {
1394
+ font-size: 12px;
1395
+ color: var(--music-text);
1396
+ margin-top: 5px;
1397
+ font-style: italic;
1398
+ }
1399
+
1400
+ .track-radio-btn {
1401
+ margin-top: 8px;
1402
+ background: linear-gradient(180deg, var(--btn-bg-start) 0%, var(--btn-bg-mid) 50%, var(--btn-bg-end) 100%);
1403
+ border: 2px outset var(--container-bg);
1404
+ border-radius: 6px;
1405
+ color: var(--btn-text);
1406
+ padding: 4px 12px;
1407
+ cursor: pointer;
1408
+ font-family: inherit;
1409
+ font-size: 11px;
1410
+ }
1411
+
1412
+ .track-radio-btn:hover {
1413
+ color: var(--btn-text-active);
1414
+ background: linear-gradient(180deg, var(--btn-hover-start) 0%, var(--btn-hover-mid) 50%, var(--btn-hover-end) 100%);
1415
+ }
1416
+
1417
+ .track-radio-btn:active {
1418
+ border-style: inset;
1419
+ }
1420
+
1421
+ /* Icon placeholder for cards without images */
1422
+ .card-icon {
1423
+ font-size: 48px;
1424
+ text-align: center;
1425
+ padding: 20px 0;
1426
+ line-height: 1;
1427
+ }
1428
+
1429
+ .gallery-item[data-category="music"] {
1430
+ background: var(--container-bg);
1431
+ position: relative;
1432
+ }
1433
+
1434
+ .gallery-item[data-category="music"]::before {
1435
+ content: '♪';
1436
+ position: absolute;
1437
+ font-size: 140px;
1438
+ opacity: 0.06;
1439
+ right: -10px;
1440
+ bottom: -20px;
1441
+ line-height: 1;
1442
+ pointer-events: none;
1443
+ z-index: 0;
1444
+ }
1445
+
1446
+ .gallery-item[data-category="music"] h3 {
1447
+ color: var(--text-primary);
1448
+ }
1449
+
1450
+ .gallery-item[data-category="music"] .item-date {
1451
+ color: var(--text-secondary);
1452
+ }
1453
+
1454
+ .gallery-item[data-category="music"] .gallery-link {
1455
+ color: inherit;
1456
+ display: flex;
1457
+ flex-direction: column;
1458
+ align-items: center;
1459
+ justify-content: center;
1460
+ height: 100%;
1461
+ position: relative;
1462
+ z-index: 1;
1463
+ }
1464
+
1465
+ .track-icon {
1466
+ font-size: 28px;
1467
+ color: var(--music-gold);
1468
+ min-width: 40px;
1469
+ text-align: center;
1470
+ }
1471
+
1472
+ .track-detail-link {
1473
+ color: var(--music-gold);
1474
+ text-decoration: none;
1475
+ }
1476
+
1477
+ .track-detail-link:hover {
1478
+ text-decoration: underline;
1479
+ color: var(--container-bg);
1480
+ }
1481
+
1482
+ .empty-message {
1483
+ text-align: center;
1484
+ color: var(--text-muted);
1485
+ padding: 40px;
1486
+ font-style: italic;
1487
+ }
1488
+
1489
+ /* Gallery clickable links */
1490
+ .gallery-link {
1491
+ display: block;
1492
+ text-decoration: none;
1493
+ color: inherit;
1494
+ cursor: pointer;
1495
+ }
1496
+
1497
+ .gallery-item:hover {
1498
+ box-shadow: 4px 4px 8px rgba(0, 0, 0, 0.3);
1499
+ transform: translateY(-2px);
1500
+ transition: all 0.15s ease;
1501
+ }
1502
+
1503
+ .gallery-link img {
1504
+ transition: filter 0.15s ease;
1505
+ }
1506
+
1507
+ .gallery-item:hover .gallery-link img {
1508
+ filter: brightness(1.05);
1509
+ }
1510
+
1511
+ /* ===== Card Actions ===== */
1512
+ .card-actions {
1513
+ padding: 4px 5px;
1514
+ text-align: center;
1515
+ }
1516
+
1517
+ .card-action-btn {
1518
+ display: inline-block;
1519
+ font-size: 11px;
1520
+ padding: 3px 8px;
1521
+ border: 2px outset var(--container-bg);
1522
+ border-radius: 6px;
1523
+ background: linear-gradient(180deg, var(--btn-bg-start), var(--btn-bg-mid), var(--btn-bg-end));
1524
+ color: var(--btn-text);
1525
+ text-decoration: none;
1526
+ cursor: pointer;
1527
+ }
1528
+
1529
+ .card-action-btn:hover {
1530
+ background: linear-gradient(180deg, var(--btn-hover-start), var(--btn-hover-mid), var(--btn-hover-end));
1531
+ color: var(--btn-text-active);
1532
+ }
1533
+
1534
+ /* Music card play button */
1535
+ .music-card-play {
1536
+ width: 56px;
1537
+ height: 56px;
1538
+ border-radius: 50%;
1539
+ border: 3px outset var(--container-bg);
1540
+ background: linear-gradient(180deg, var(--btn-bg-start), var(--btn-bg-mid), var(--btn-bg-end));
1541
+ color: var(--btn-text);
1542
+ font-size: 22px;
1543
+ cursor: pointer;
1544
+ margin: 10px auto;
1545
+ display: flex;
1546
+ align-items: center;
1547
+ justify-content: center;
1548
+ }
1549
+
1550
+ .music-card-play:hover {
1551
+ background: linear-gradient(180deg, var(--btn-hover-start), var(--btn-hover-mid), var(--btn-hover-end));
1552
+ color: var(--btn-text-active);
1553
+ }
1554
+
1555
+ .music-card-play:active {
1556
+ border-style: inset;
1557
+ }
1558
+
1559
+ /* ===== Detail Page ===== */
1560
+ .detail-page {
1561
+ background: var(--container-bg);
1562
+ border: 3px solid;
1563
+ border-color: var(--container-bg) var(--border-mid) var(--border-mid) var(--container-bg);
1564
+ border-radius: 10px;
1565
+ box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.2);
1566
+ overflow: hidden;
1567
+ }
1568
+
1569
+ .detail-hero {
1570
+ background: var(--wp-display);
1571
+ text-align: center;
1572
+ border-bottom: 2px groove var(--btn-bg-end);
1573
+ padding: 10px;
1574
+ }
1575
+
1576
+ .detail-hero img {
1577
+ max-width: 100%;
1578
+ max-height: 500px;
1579
+ object-fit: contain;
1580
+ border-radius: 8px;
1581
+ box-shadow: 0 0 15px rgba(0, 0, 0, 0.4);
1582
+ }
1583
+
1584
+ .detail-info {
1585
+ padding: 20px;
1586
+ }
1587
+
1588
+ .detail-title {
1589
+ font-size: 1.6em;
1590
+ color: var(--text-primary);
1591
+ text-shadow: 1px 1px 0 var(--container-bg);
1592
+ margin: 0 0 10px;
1593
+ padding-bottom: 8px;
1594
+ border-bottom: 2px groove var(--border-groove);
1595
+ display: flex;
1596
+ align-items: center;
1597
+ gap: 12px;
1598
+ flex-wrap: wrap;
1599
+ }
1600
+
1601
+ .detail-play-inline {
1602
+ font-size: 0.45em;
1603
+ vertical-align: middle;
1604
+ }
1605
+
1606
+ .detail-badge {
1607
+ font-size: 0.5em;
1608
+ padding: 2px 8px;
1609
+ border: 1px outset var(--chrome-soft);
1610
+ border-radius: 4px;
1611
+ vertical-align: middle;
1612
+ font-weight: normal;
1613
+ }
1614
+
1615
+ .detail-badge-public {
1616
+ background: var(--badge-public-bg);
1617
+ color: var(--badge-public-text);
1618
+ }
1619
+
1620
+ .detail-badge-private {
1621
+ background: var(--badge-private-bg);
1622
+ color: var(--badge-private-text);
1623
+ }
1624
+
1625
+ .detail-meta {
1626
+ display: flex;
1627
+ flex-wrap: wrap;
1628
+ gap: 15px;
1629
+ font-size: 0.85em;
1630
+ color: var(--text-secondary);
1631
+ margin-bottom: 15px;
1632
+ padding: 8px 10px;
1633
+ background: var(--detail-meta-bg);
1634
+ border: 1px solid var(--border-groove);
1635
+ font-family: var(--font-mono);
1636
+ }
1637
+
1638
+ .detail-description {
1639
+ margin-top: 15px;
1640
+ }
1641
+
1642
+ .detail-description h3 {
1643
+ font-size: 1em;
1644
+ color: var(--text-dim);
1645
+ margin: 0 0 8px;
1646
+ border-bottom: 1px dashed var(--chrome-soft);
1647
+ padding-bottom: 5px;
1648
+ }
1649
+
1650
+ .detail-description p {
1651
+ line-height: 1.7;
1652
+ color: var(--text-primary);
1653
+ }
1654
+
1655
+ .detail-audio {
1656
+ margin-top: 15px;
1657
+ }
1658
+
1659
+ .detail-audio h3 {
1660
+ font-size: 1em;
1661
+ color: var(--text-dim);
1662
+ margin: 0 0 8px;
1663
+ }
1664
+
1665
+ .detail-actions {
1666
+ margin-top: 15px;
1667
+ text-align: center;
1668
+ }
1669
+
1670
+ /* Detail — Lyrics */
1671
+ .detail-lyrics {
1672
+ margin-top: 15px;
1673
+ }
1674
+
1675
+ .detail-lyrics h3 {
1676
+ font-size: 1em;
1677
+ color: var(--text-dim);
1678
+ margin: 0 0 8px;
1679
+ border-bottom: 1px dotted var(--border-groove);
1680
+ padding-bottom: 5px;
1681
+ }
1682
+
1683
+ .lyrics-text {
1684
+ white-space: pre-wrap;
1685
+ font-family: var(--font-primary);
1686
+ color: var(--text-secondary);
1687
+ line-height: 1.8;
1688
+ padding: 10px;
1689
+ background: var(--filter-bg);
1690
+ border: 2px inset var(--container-bg);
1691
+ border-radius: 8px;
1692
+ margin: 0;
1693
+ }
1694
+
1695
+ /* Detail — Gallery thumbnails */
1696
+ .detail-gallery-thumbs {
1697
+ display: flex;
1698
+ gap: 6px;
1699
+ justify-content: center;
1700
+ padding: 8px 10px;
1701
+ flex-wrap: wrap;
1702
+ }
1703
+
1704
+ .gallery-thumb {
1705
+ width: 60px;
1706
+ height: 60px;
1707
+ object-fit: cover;
1708
+ border-radius: 6px;
1709
+ border: 2px solid var(--border-groove);
1710
+ cursor: pointer;
1711
+ opacity: 0.7;
1712
+ transition: opacity 0.15s;
1713
+ }
1714
+
1715
+ .gallery-thumb:hover {
1716
+ opacity: 1;
1717
+ }
1718
+
1719
+ /* ===== Lightbox ===== */
1720
+ .lightbox-overlay {
1721
+ position: fixed;
1722
+ inset: 0;
1723
+ z-index: 99999;
1724
+ background: rgba(0, 0, 0, 0.92);
1725
+ display: flex;
1726
+ align-items: center;
1727
+ justify-content: center;
1728
+ cursor: pointer;
1729
+ }
1730
+
1731
+ .lightbox-img {
1732
+ max-width: 90vw;
1733
+ max-height: 90vh;
1734
+ object-fit: contain;
1735
+ border-radius: 8px;
1736
+ cursor: default;
1737
+ }
1738
+
1739
+ .lightbox-prev,
1740
+ .lightbox-next {
1741
+ position: absolute;
1742
+ top: 50%;
1743
+ transform: translateY(-50%);
1744
+ background: rgba(255, 255, 255, 0.15);
1745
+ border: none;
1746
+ border-radius: 50%;
1747
+ color: #fff;
1748
+ font-size: 24px;
1749
+ width: 44px;
1750
+ height: 44px;
1751
+ cursor: pointer;
1752
+ }
1753
+
1754
+ .lightbox-prev {
1755
+ left: 20px;
1756
+ }
1757
+
1758
+ .lightbox-next {
1759
+ right: 20px;
1760
+ }
1761
+
1762
+ .lightbox-prev:hover,
1763
+ .lightbox-next:hover {
1764
+ background: rgba(255, 255, 255, 0.3);
1765
+ }
1766
+
1767
+ .lightbox-counter {
1768
+ position: absolute;
1769
+ bottom: 20px;
1770
+ left: 50%;
1771
+ transform: translateX(-50%);
1772
+ color: rgba(255, 255, 255, 0.7);
1773
+ font-size: 14px;
1774
+ }
1775
+
1776
+ /* ===== "Computer Only" — Rotate Overlay ===== */
1777
+ #rotate-overlay {
1778
+ display: none;
1779
+ position: fixed;
1780
+ inset: 0;
1781
+ z-index: 99999;
1782
+ background: var(--accent-navy);
1783
+ color: var(--container-bg);
1784
+ font-family: var(--font-mono);
1785
+ text-align: center;
1786
+ overflow: auto;
1787
+ }
1788
+
1789
+ #rotate-overlay .rotate-content {
1790
+ padding: 40px 20px;
1791
+ max-width: 360px;
1792
+ margin: 0 auto;
1793
+ }
1794
+
1795
+ #rotate-overlay .rotate-icon {
1796
+ font-size: 64px;
1797
+ margin-bottom: 10px;
1798
+ }
1799
+
1800
+ #rotate-overlay h2 {
1801
+ font-size: 24px;
1802
+ color: var(--music-gold);
1803
+ text-shadow: 2px 2px 0 var(--chrome-black);
1804
+ margin: 10px 0;
1805
+ }
1806
+
1807
+ #rotate-overlay p {
1808
+ font-size: 14px;
1809
+ line-height: 1.6;
1810
+ margin: 10px 0;
1811
+ }
1812
+
1813
+ #rotate-overlay .rotate-sub {
1814
+ color: var(--text-light);
1815
+ font-size: 12px;
1816
+ }
1817
+
1818
+ #rotate-overlay .rotate-ascii {
1819
+ font-size: 12px;
1820
+ color: var(--term-green);
1821
+ line-height: 1.3;
1822
+ margin: 20px 0;
1823
+ text-align: center;
1824
+ }
1825
+
1826
+ #rotate-overlay .rotate-blink {
1827
+ color: var(--accent-yellow);
1828
+ font-weight: bold;
1829
+ font-size: 13px;
1830
+ animation: retro-blink 1s steps(1) infinite;
1831
+ }
1832
+
1833
+ @keyframes retro-blink {
1834
+
1835
+ 0%,
1836
+ 49% {
1837
+ opacity: 1;
1838
+ }
1839
+
1840
+ 50%,
1841
+ 100% {
1842
+ opacity: 0;
1843
+ }
1844
+ }
1845
+
1846
+ /* ═══ Glitter Text Effect (90s style!) ═══ */
1847
+ .glitter-text {
1848
+ background: linear-gradient(90deg,
1849
+ #ff00ff 0%,
1850
+ #ff00aa 16%,
1851
+ #ff0055 33%,
1852
+ #ffaa00 50%,
1853
+ #55ff00 66%,
1854
+ #00aaff 83%,
1855
+ #ff00ff 100%
1856
+ );
1857
+ background-size: 400% 100%;
1858
+ -webkit-background-clip: text;
1859
+ -webkit-text-fill-color: transparent;
1860
+ background-clip: text;
1861
+ animation: glitter-shimmer 3s linear infinite, glitter-sparkle 1.5s ease-in-out infinite;
1862
+ text-shadow: 0 0 10px rgba(255, 255, 255, 0.5);
1863
+ position: relative;
1864
+ display: inline-block;
1865
+ }
1866
+
1867
+ @keyframes glitter-shimmer {
1868
+ 0% { background-position: 0% center; }
1869
+ 100% { background-position: 400% center; }
1870
+ }
1871
+
1872
+ @keyframes glitter-sparkle {
1873
+ 0%, 100% { filter: brightness(1) saturate(1); }
1874
+ 50% { filter: brightness(1.3) saturate(1.5); }
1875
+ }
1876
+
1877
+ /* Alternative glitter effect with more sparkle */
1878
+ .glitter-text-alt {
1879
+ background: linear-gradient(45deg,
1880
+ #ffd700 0%,
1881
+ #ff69b4 20%,
1882
+ #00ffff 40%,
1883
+ #ff00ff 60%,
1884
+ #ffff00 80%,
1885
+ #ffd700 100%
1886
+ );
1887
+ background-size: 300% 300%;
1888
+ -webkit-background-clip: text;
1889
+ -webkit-text-fill-color: transparent;
1890
+ background-clip: text;
1891
+ animation: glitter-rainbow 4s ease infinite;
1892
+ filter: drop-shadow(0 0 8px rgba(255, 215, 0, 0.6));
1893
+ }
1894
+
1895
+ @keyframes glitter-rainbow {
1896
+ 0%, 100% { background-position: 0% 50%; }
1897
+ 50% { background-position: 100% 50%; }
1898
+ }
1899
+
1900
+ /* ═══ 90s Decorations ═══ */
1901
+ #retro-decorations {
1902
+ pointer-events: none;
1903
+ position: fixed;
1904
+ top: 0;
1905
+ left: 0;
1906
+ width: 100%;
1907
+ height: 100%;
1908
+ z-index: 99999;
1909
+ }
1910
+
1911
+ .retro-corner {
1912
+ position: fixed;
1913
+ animation: retro-pulse 2s ease-in-out infinite;
1914
+ }
1915
+
1916
+ .retro-corner .retro-emoji {
1917
+ font-size: 48px;
1918
+ display: block;
1919
+ animation: retro-spin 3s linear infinite;
1920
+ }
1921
+
1922
+ .retro-corner img {
1923
+ width: 80px;
1924
+ height: 80px;
1925
+ image-rendering: pixelated;
1926
+ }
1927
+
1928
+ .retro-corner-tl {
1929
+ top: 10px;
1930
+ left: 10px;
1931
+ }
1932
+
1933
+ .retro-corner-tr {
1934
+ top: 10px;
1935
+ right: 10px;
1936
+ }
1937
+
1938
+ .retro-badge {
1939
+ position: fixed;
1940
+ animation: retro-bounce 3s ease-in-out infinite;
1941
+ background: rgba(255, 255, 0, 0.9);
1942
+ border: 3px solid #ff00ff;
1943
+ padding: 8px 16px;
1944
+ font-weight: bold;
1945
+ box-shadow: 4px 4px 0 rgba(0, 0, 0, 0.3);
1946
+ }
1947
+
1948
+ .retro-badge .retro-text {
1949
+ font-size: 14px;
1950
+ color: #000;
1951
+ text-shadow: 1px 1px 0 #fff;
1952
+ white-space: nowrap;
1953
+ }
1954
+
1955
+ .retro-badge img {
1956
+ width: 120px;
1957
+ height: auto;
1958
+ image-rendering: pixelated;
1959
+ }
1960
+
1961
+ .retro-badge-1 {
1962
+ bottom: 20px;
1963
+ left: 20px;
1964
+ }
1965
+
1966
+ .retro-badge-2 {
1967
+ bottom: 20px;
1968
+ right: 20px;
1969
+ }
1970
+
1971
+ .retro-divider {
1972
+ position: fixed;
1973
+ bottom: 100px;
1974
+ left: 0;
1975
+ width: 100%;
1976
+ height: 5px;
1977
+ background: repeating-linear-gradient(
1978
+ 90deg,
1979
+ #ff00ff 0px,
1980
+ #ff00ff 10px,
1981
+ #00ffff 10px,
1982
+ #00ffff 20px,
1983
+ #ffff00 20px,
1984
+ #ffff00 30px,
1985
+ #00ff00 30px,
1986
+ #00ff00 40px
1987
+ );
1988
+ animation: retro-slide 3s linear infinite;
1989
+ opacity: 0.7;
1990
+ }
1991
+
1992
+ @keyframes retro-pulse {
1993
+ 0%, 100% {
1994
+ transform: scale(1);
1995
+ opacity: 1;
1996
+ }
1997
+ 50% {
1998
+ transform: scale(1.1);
1999
+ opacity: 0.8;
2000
+ }
2001
+ }
2002
+
2003
+ @keyframes retro-bounce {
2004
+ 0%, 100% {
2005
+ transform: translateY(0);
2006
+ }
2007
+ 50% {
2008
+ transform: translateY(-10px);
2009
+ }
2010
+ }
2011
+
2012
+ @keyframes retro-slide {
2013
+ 0% {
2014
+ background-position: 0 0;
2015
+ }
2016
+ 100% {
2017
+ background-position: 40px 0;
2018
+ }
2019
+ }
2020
+
2021
+ @keyframes retro-spin {
2022
+ 0% { transform: rotate(0deg); }
2023
+ 100% { transform: rotate(360deg); }
2024
+ }
2025
+
2026
+ /* Show overlay ONLY on portrait screens narrower than 768px */
2027
+ @media screen and (max-width: 768px) and (orientation: portrait) {
2028
+ #rotate-overlay {
2029
+ display: flex;
2030
+ align-items: center;
2031
+ justify-content: center;
2032
+ }
2033
+
2034
+ .container {
2035
+ display: none;
2036
+ }
2037
+ }