adam-os 0.1.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 (53) hide show
  1. package/README.md +1 -0
  2. package/app/globals.css +2 -0
  3. package/app/layout.tsx +42 -0
  4. package/app/page.tsx +38 -0
  5. package/bin/adam-os.js +144 -0
  6. package/components/Apps/AboutMe.tsx +378 -0
  7. package/components/Apps/ContactForm.tsx +113 -0
  8. package/components/Apps/MyComputer.tsx +117 -0
  9. package/components/Apps/RecycleBin.tsx +131 -0
  10. package/components/Apps/Welcome.tsx +212 -0
  11. package/components/Desktop/Desktop.tsx +128 -0
  12. package/components/Desktop/DesktopIcon.tsx +176 -0
  13. package/components/Desktop/IconGrid.tsx +34 -0
  14. package/components/Mobile/MobileCard.tsx +82 -0
  15. package/components/Mobile/MobileLayout.tsx +58 -0
  16. package/components/Mobile/MobileToggle.tsx +18 -0
  17. package/components/Portfolio/GallerySection.tsx +158 -0
  18. package/components/Portfolio/ImageSection.tsx +40 -0
  19. package/components/Portfolio/PortfolioViewer.tsx +87 -0
  20. package/components/Portfolio/SectionRenderer.tsx +145 -0
  21. package/components/Portfolio/TextSection.tsx +36 -0
  22. package/components/Portfolio/VideoSection.tsx +41 -0
  23. package/components/Taskbar/StartButton.tsx +138 -0
  24. package/components/Taskbar/Taskbar.tsx +77 -0
  25. package/components/Taskbar/TaskbarClock.tsx +27 -0
  26. package/components/Taskbar/TaskbarItem.tsx +33 -0
  27. package/components/Window/AppWindow.tsx +168 -0
  28. package/components/Window/ResizeHandles.tsx +35 -0
  29. package/components/Window/TitleBar.tsx +112 -0
  30. package/context/WindowManager.tsx +386 -0
  31. package/data/portfolio.json +200 -0
  32. package/data/types.ts +30 -0
  33. package/hooks/useDraggable.ts +77 -0
  34. package/hooks/useResizable.ts +133 -0
  35. package/hooks/useWindowManager.ts +12 -0
  36. package/lib/constants.ts +27 -0
  37. package/lib/sounds.ts +56 -0
  38. package/next-env.d.ts +6 -0
  39. package/next.config.ts +7 -0
  40. package/package.json +50 -0
  41. package/postcss.config.mjs +7 -0
  42. package/public/icons/chrome.webp +0 -0
  43. package/public/icons/folder.webp +0 -0
  44. package/public/icons/ie.webp +0 -0
  45. package/public/icons/my-computer.webp +0 -0
  46. package/public/icons/recycle-bin.webp +0 -0
  47. package/public/icons/welcome.webp +0 -0
  48. package/public/pro-pic.jpg +0 -0
  49. package/public/wallpaper.jpg +0 -0
  50. package/site.config.ts +40 -0
  51. package/styles/win95.css +698 -0
  52. package/tailwind.config.ts +69 -0
  53. package/tsconfig.json +41 -0
@@ -0,0 +1,698 @@
1
+ /* ============================================================
2
+ AdamOS — Modernized Win95 Theme
3
+ Colors: authentic Win95 palette. Everything else: 2025 execution.
4
+ ============================================================ */
5
+
6
+ :root {
7
+ /* === Win95 Color Palette — UNCHANGED === */
8
+ --win95-bg: #008080;
9
+ --win95-chrome: #c0c0c0;
10
+ --win95-border-light: #dfdfdf;
11
+ --win95-border-dark: #808080;
12
+ --win95-border-darkest: #404040;
13
+ --win95-titlebar: #000080;
14
+ --win95-titlebar-end: #1084d0;
15
+ --win95-titlebar-inactive: #808080;
16
+ --win95-titlebar-inactive-end: #b0b0b0;
17
+ --win95-text: #000000;
18
+ --win95-text-disabled: #555555;
19
+ --win95-highlight: #000080;
20
+ --win95-highlight-text: #ffffff;
21
+ --win95-window-bg: #ffffff;
22
+
23
+ /* === Modern Design Layer === */
24
+ --radius-sm: 4px;
25
+ --radius-md: 6px;
26
+ --radius-lg: 8px;
27
+ --radius-xl: 12px;
28
+
29
+ --shadow-raised: 0 1px 2px rgba(0,0,0,0.10), inset 0 1px 0 rgba(255,255,255,0.15);
30
+ --shadow-pressed: inset 0 2px 4px rgba(0,0,0,0.15);
31
+ --shadow-window: 0 0 0 1px rgba(0,0,0,0.08), 0 4px 16px rgba(0,0,0,0.12), 0 12px 40px rgba(0,0,0,0.08);
32
+ --shadow-inset: inset 0 1px 3px rgba(0,0,0,0.12);
33
+
34
+ --transition-fast: 0.1s ease;
35
+ --transition-normal: 0.15s ease;
36
+ --transition-smooth: 0.2s ease;
37
+
38
+ --font-body: var(--font-inter), "Inter", -apple-system, BlinkMacSystemFont, sans-serif;
39
+ --font-mono: var(--font-jetbrains), "JetBrains Mono", "SF Mono", "Fira Code", monospace;
40
+
41
+ --font-size-xs: 11px;
42
+ --font-size-sm: 12px;
43
+ --font-size-base: 14px;
44
+ --font-size-md: 16px;
45
+ --font-size-lg: 20px;
46
+ --font-size-xl: 24px;
47
+ --font-size-2xl: 32px;
48
+ --font-size-3xl: 40px;
49
+
50
+ --taskbar-height: 44px;
51
+ --titlebar-height: 36px;
52
+
53
+ /* Legacy aliases */
54
+ --win95-font: var(--font-body);
55
+ --win95-font-size: var(--font-size-base);
56
+ }
57
+
58
+ /* ─── Reset ─────────────────────────────────────────────────────────────── */
59
+
60
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
61
+
62
+ html, body {
63
+ width: 100%;
64
+ height: 100%;
65
+ overflow: hidden;
66
+ font-family: var(--font-body);
67
+ font-size: var(--font-size-base);
68
+ color: var(--win95-text);
69
+ background: var(--win95-bg);
70
+ -webkit-font-smoothing: antialiased;
71
+ -moz-osx-font-smoothing: grayscale;
72
+ }
73
+
74
+ /* ─── Raised surface ────────────────────────────────────────────────────── */
75
+
76
+ .win95-raised {
77
+ border: 1px solid var(--win95-border-dark);
78
+ border-radius: var(--radius-sm);
79
+ box-shadow: var(--shadow-raised);
80
+ }
81
+
82
+ /* ─── Inset surface ─────────────────────────────────────────────────────── */
83
+
84
+ .win95-inset {
85
+ border: 1px solid var(--win95-border-dark);
86
+ border-radius: var(--radius-sm);
87
+ box-shadow: var(--shadow-inset);
88
+ background: var(--win95-window-bg);
89
+ }
90
+
91
+ /* ─── Window chrome ─────────────────────────────────────────────────────── */
92
+
93
+ .win95-window {
94
+ border: none;
95
+ border-radius: var(--radius-md);
96
+ box-shadow: var(--shadow-window);
97
+ background: var(--win95-chrome);
98
+ display: flex;
99
+ flex-direction: column;
100
+ position: absolute;
101
+ overflow: hidden;
102
+ animation: windowOpen 150ms ease-out both;
103
+ }
104
+
105
+ .win95-window.window-closing {
106
+ animation: windowClose 100ms ease-in forwards;
107
+ pointer-events: none;
108
+ }
109
+
110
+ .win95-window.window-maximizing {
111
+ transition: left var(--transition-smooth), top var(--transition-smooth),
112
+ width var(--transition-smooth), height var(--transition-smooth);
113
+ }
114
+
115
+ /* ─── Title bar ─────────────────────────────────────────────────────────── */
116
+
117
+ .win95-titlebar {
118
+ background: linear-gradient(90deg, var(--win95-titlebar) 0%, var(--win95-titlebar-end) 100%);
119
+ color: #fff;
120
+ font-family: var(--font-mono);
121
+ font-size: var(--font-size-sm);
122
+ font-weight: 500;
123
+ letter-spacing: 0.01em;
124
+ padding: 0 10px;
125
+ height: var(--titlebar-height);
126
+ display: flex;
127
+ align-items: center;
128
+ gap: 8px;
129
+ user-select: none;
130
+ flex-shrink: 0;
131
+ border-radius: var(--radius-md) var(--radius-md) 0 0;
132
+ }
133
+
134
+ .win95-titlebar.inactive {
135
+ background: linear-gradient(90deg, var(--win95-titlebar-inactive) 0%, var(--win95-titlebar-inactive-end) 100%);
136
+ }
137
+
138
+ .win95-titlebar-title {
139
+ flex: 1;
140
+ overflow: hidden;
141
+ white-space: nowrap;
142
+ text-overflow: ellipsis;
143
+ font-size: var(--font-size-sm);
144
+ opacity: 0.95;
145
+ }
146
+
147
+ /* ─── Title bar control buttons ─────────────────────────────────────────── */
148
+
149
+ .win95-titlebar-btn {
150
+ width: 24px;
151
+ height: 24px;
152
+ border-radius: var(--radius-sm);
153
+ border: none;
154
+ background: rgba(255,255,255,0.12);
155
+ color: #fff;
156
+ display: flex;
157
+ align-items: center;
158
+ justify-content: center;
159
+ cursor: pointer;
160
+ flex-shrink: 0;
161
+ transition: background var(--transition-fast), transform var(--transition-fast);
162
+ padding: 0;
163
+ }
164
+
165
+ .win95-titlebar-btn:hover {
166
+ background: rgba(255,255,255,0.22);
167
+ }
168
+
169
+ .win95-titlebar-btn:active {
170
+ background: rgba(0,0,0,0.15);
171
+ transform: scale(0.92);
172
+ }
173
+
174
+ .win95-titlebar-btn.btn-close:hover {
175
+ background: rgba(196,43,28,0.75);
176
+ }
177
+
178
+ .win95-titlebar.inactive .win95-titlebar-btn {
179
+ opacity: 0.55;
180
+ }
181
+
182
+ /* ─── Generic button ────────────────────────────────────────────────────── */
183
+
184
+ .win95-btn {
185
+ font-family: var(--font-body);
186
+ font-size: var(--font-size-sm);
187
+ background: var(--win95-chrome);
188
+ border: 1px solid var(--win95-border-dark);
189
+ border-radius: var(--radius-sm);
190
+ box-shadow: var(--shadow-raised);
191
+ padding: 6px 16px;
192
+ min-height: 32px;
193
+ cursor: pointer;
194
+ white-space: nowrap;
195
+ transition: background var(--transition-fast), box-shadow var(--transition-fast),
196
+ transform var(--transition-fast);
197
+ display: inline-flex;
198
+ align-items: center;
199
+ justify-content: center;
200
+ gap: 6px;
201
+ color: var(--win95-text);
202
+ text-decoration: none;
203
+ line-height: 1;
204
+ }
205
+
206
+ .win95-btn:hover {
207
+ background: var(--win95-border-light);
208
+ }
209
+
210
+ .win95-btn:active, .win95-btn.pressed {
211
+ box-shadow: var(--shadow-pressed);
212
+ border-color: var(--win95-border-darkest);
213
+ transform: translateY(1px);
214
+ }
215
+
216
+ .win95-btn:focus-visible {
217
+ outline: 2px solid var(--win95-titlebar);
218
+ outline-offset: 2px;
219
+ }
220
+
221
+ /* ─── Taskbar ───────────────────────────────────────────────────────────── */
222
+
223
+ .win95-taskbar {
224
+ position: fixed;
225
+ bottom: 0;
226
+ left: 0;
227
+ right: 0;
228
+ height: var(--taskbar-height);
229
+ background: rgba(192,192,192,0.92);
230
+ backdrop-filter: blur(10px);
231
+ -webkit-backdrop-filter: blur(10px);
232
+ border-top: 1px solid var(--win95-border-light);
233
+ box-shadow: 0 -1px 0 var(--win95-border-dark), 0 -4px 20px rgba(0,0,0,0.07);
234
+ display: flex;
235
+ align-items: center;
236
+ padding: 4px 8px;
237
+ gap: 6px;
238
+ z-index: 9000;
239
+ }
240
+
241
+ /* ─── Taskbar window item ───────────────────────────────────────────────── */
242
+
243
+ .win95-taskbar-item {
244
+ font-family: var(--font-mono);
245
+ font-size: var(--font-size-sm);
246
+ background: transparent;
247
+ border: 1px solid transparent;
248
+ border-radius: var(--radius-md);
249
+ padding: 0 10px;
250
+ height: 32px;
251
+ min-width: 120px;
252
+ max-width: 180px;
253
+ cursor: pointer;
254
+ display: flex;
255
+ align-items: center;
256
+ gap: 6px;
257
+ overflow: hidden;
258
+ white-space: nowrap;
259
+ color: var(--win95-text);
260
+ transition: background var(--transition-normal), border-color var(--transition-normal);
261
+ }
262
+
263
+ .win95-taskbar-item:hover {
264
+ background: rgba(0,0,0,0.06);
265
+ border-color: var(--win95-border-dark);
266
+ }
267
+
268
+ .win95-taskbar-item.active {
269
+ background: rgba(0,0,0,0.09);
270
+ border-color: var(--win95-border-dark);
271
+ box-shadow: inset 0 1px 3px rgba(0,0,0,0.10);
272
+ }
273
+
274
+ .win95-taskbar-item span {
275
+ overflow: hidden;
276
+ text-overflow: ellipsis;
277
+ white-space: nowrap;
278
+ flex: 1;
279
+ }
280
+
281
+ /* ─── Clock ─────────────────────────────────────────────────────────────── */
282
+
283
+ .win95-clock {
284
+ font-family: var(--font-mono);
285
+ font-size: var(--font-size-sm);
286
+ padding: 0 10px;
287
+ height: 32px;
288
+ display: flex;
289
+ align-items: center;
290
+ border: 1px solid var(--win95-border-dark);
291
+ border-radius: var(--radius-sm);
292
+ box-shadow: var(--shadow-inset);
293
+ background: rgba(0,0,0,0.04);
294
+ white-space: nowrap;
295
+ flex-shrink: 0;
296
+ }
297
+
298
+ /* ─── Start button ──────────────────────────────────────────────────────── */
299
+
300
+ .win95-start-btn {
301
+ font-family: var(--font-body);
302
+ font-size: var(--font-size-sm);
303
+ font-weight: 600;
304
+ background: var(--win95-chrome);
305
+ border: 1px solid var(--win95-border-dark);
306
+ border-radius: var(--radius-sm);
307
+ box-shadow: var(--shadow-raised);
308
+ padding: 0 12px;
309
+ height: 32px;
310
+ cursor: pointer;
311
+ display: flex;
312
+ align-items: center;
313
+ gap: 6px;
314
+ flex-shrink: 0;
315
+ transition: background var(--transition-fast), box-shadow var(--transition-fast),
316
+ transform var(--transition-fast);
317
+ color: var(--win95-text);
318
+ }
319
+
320
+ .win95-start-btn:hover {
321
+ background: var(--win95-border-light);
322
+ }
323
+
324
+ .win95-start-btn:active, .win95-start-btn.open {
325
+ box-shadow: var(--shadow-pressed);
326
+ border-color: var(--win95-border-darkest);
327
+ transform: translateY(1px);
328
+ }
329
+
330
+ /* ─── Start menu ────────────────────────────────────────────────────────── */
331
+
332
+ .win95-start-menu {
333
+ position: absolute;
334
+ bottom: calc(var(--taskbar-height) + 6px);
335
+ left: 0;
336
+ background: var(--win95-chrome);
337
+ border: 1px solid var(--win95-border-dark);
338
+ border-radius: var(--radius-md);
339
+ box-shadow: 0 -4px 20px rgba(0,0,0,0.10), 0 8px 28px rgba(0,0,0,0.12);
340
+ display: flex;
341
+ z-index: 9500;
342
+ min-width: 200px;
343
+ overflow: hidden;
344
+ animation: menuOpen 150ms ease-out both;
345
+ }
346
+
347
+ .win95-start-menu-sidebar {
348
+ width: 28px;
349
+ background: linear-gradient(180deg, var(--win95-titlebar) 0%, var(--win95-titlebar-inactive) 100%);
350
+ display: flex;
351
+ align-items: flex-end;
352
+ justify-content: center;
353
+ padding-bottom: 12px;
354
+ flex-shrink: 0;
355
+ }
356
+
357
+ .win95-start-menu-sidebar span {
358
+ writing-mode: vertical-rl;
359
+ transform: rotate(180deg);
360
+ color: #fff;
361
+ font-family: var(--font-body);
362
+ font-size: 13px;
363
+ font-weight: 700;
364
+ letter-spacing: 3px;
365
+ white-space: nowrap;
366
+ opacity: 0.85;
367
+ }
368
+
369
+ .win95-start-menu-items {
370
+ flex: 1;
371
+ display: flex;
372
+ flex-direction: column;
373
+ padding: 4px;
374
+ }
375
+
376
+ .win95-start-menu-item {
377
+ display: flex;
378
+ align-items: center;
379
+ gap: 10px;
380
+ padding: 8px 12px;
381
+ cursor: pointer;
382
+ font-family: var(--font-body);
383
+ font-size: var(--font-size-sm);
384
+ white-space: nowrap;
385
+ border-radius: var(--radius-sm);
386
+ transition: background var(--transition-fast), color var(--transition-fast);
387
+ color: var(--win95-text);
388
+ }
389
+
390
+ .win95-start-menu-item:hover {
391
+ background: var(--win95-highlight);
392
+ color: var(--win95-highlight-text);
393
+ }
394
+
395
+ .win95-start-menu-divider {
396
+ height: 1px;
397
+ background: var(--win95-border-dark);
398
+ margin: 4px 8px;
399
+ opacity: 0.35;
400
+ }
401
+
402
+ /* ─── Desktop icons ─────────────────────────────────────────────────────── */
403
+
404
+ .win95-desktop-icon {
405
+ display: flex;
406
+ flex-direction: column;
407
+ align-items: center;
408
+ width: 80px;
409
+ padding: 8px 4px;
410
+ cursor: default;
411
+ gap: 5px;
412
+ border-radius: var(--radius-lg);
413
+ border: 1px solid transparent;
414
+ transition: transform var(--transition-normal);
415
+ }
416
+
417
+ .win95-desktop-icon:hover {
418
+ transform: scale(1.05);
419
+ }
420
+
421
+ .win95-desktop-icon:focus {
422
+ outline: none;
423
+ }
424
+
425
+ .win95-desktop-icon.selected {
426
+ background: rgba(0,0,128,0.14);
427
+ border-color: rgba(0,0,128,0.25);
428
+ }
429
+
430
+ .win95-icon-label {
431
+ font-family: var(--font-body);
432
+ font-size: var(--font-size-sm);
433
+ font-weight: 500;
434
+ color: #fff;
435
+ text-shadow: 0 1px 4px rgba(0,0,0,0.9), 0 0 10px rgba(0,0,0,0.5);
436
+ text-align: center;
437
+ padding: 2px 4px;
438
+ max-width: 76px;
439
+ word-break: break-word;
440
+ line-height: 1.3;
441
+ border-radius: 3px;
442
+ }
443
+
444
+ .win95-desktop-icon.selected .win95-icon-label {
445
+ background: var(--win95-highlight);
446
+ color: var(--win95-highlight-text);
447
+ text-shadow: none;
448
+ }
449
+
450
+ /* ─── Scrollbars ────────────────────────────────────────────────────────── */
451
+
452
+ .win95-scrollable {
453
+ overflow-y: auto;
454
+ overflow-x: hidden;
455
+ scrollbar-width: thin;
456
+ scrollbar-color: var(--win95-border-dark) transparent;
457
+ }
458
+
459
+ .win95-scrollable::-webkit-scrollbar {
460
+ width: 8px;
461
+ }
462
+
463
+ .win95-scrollable::-webkit-scrollbar-track {
464
+ background: transparent;
465
+ }
466
+
467
+ .win95-scrollable::-webkit-scrollbar-thumb {
468
+ background: var(--win95-border-dark);
469
+ border-radius: 99px;
470
+ border: 2px solid transparent;
471
+ background-clip: content-box;
472
+ }
473
+
474
+ .win95-scrollable::-webkit-scrollbar-thumb:hover {
475
+ background: var(--win95-border-darkest);
476
+ background-clip: content-box;
477
+ }
478
+
479
+ /* ─── Menu bar (inside windows) ─────────────────────────────────────────── */
480
+
481
+ .win95-menubar {
482
+ display: flex;
483
+ padding: 2px 4px;
484
+ font-family: var(--font-body);
485
+ font-size: var(--font-size-sm);
486
+ flex-shrink: 0;
487
+ border-bottom: 1px solid rgba(0,0,0,0.08);
488
+ }
489
+
490
+ .win95-menubar-item {
491
+ padding: 3px 8px;
492
+ cursor: default;
493
+ border-radius: var(--radius-sm);
494
+ transition: background var(--transition-fast), color var(--transition-fast);
495
+ }
496
+
497
+ .win95-menubar-item:hover, .win95-menubar-item.active {
498
+ background: var(--win95-highlight);
499
+ color: var(--win95-highlight-text);
500
+ }
501
+
502
+ /* ─── Status bar ────────────────────────────────────────────────────────── */
503
+
504
+ .win95-statusbar {
505
+ display: flex;
506
+ align-items: center;
507
+ height: 24px;
508
+ padding: 0 8px;
509
+ gap: 6px;
510
+ flex-shrink: 0;
511
+ border-top: 1px solid rgba(0,0,0,0.08);
512
+ font-family: var(--font-mono);
513
+ font-size: var(--font-size-xs);
514
+ color: var(--win95-text-disabled);
515
+ }
516
+
517
+ .win95-statusbar-panel {
518
+ font-family: var(--font-mono);
519
+ font-size: var(--font-size-xs);
520
+ padding: 0 6px;
521
+ border: 1px solid var(--win95-border-dark);
522
+ border-radius: 3px;
523
+ height: 16px;
524
+ display: flex;
525
+ align-items: center;
526
+ box-shadow: var(--shadow-inset);
527
+ }
528
+
529
+ /* ─── Resize handles ────────────────────────────────────────────────────── */
530
+
531
+ .resize-handle { position: absolute; z-index: 10; }
532
+ .resize-handle-n { top: -4px; left: 8px; right: 8px; height: 8px; cursor: n-resize; }
533
+ .resize-handle-s { bottom: -4px; left: 8px; right: 8px; height: 8px; cursor: s-resize; }
534
+ .resize-handle-e { right: -4px; top: 8px; bottom: 8px; width: 8px; cursor: e-resize; }
535
+ .resize-handle-w { left: -4px; top: 8px; bottom: 8px; width: 8px; cursor: w-resize; }
536
+ .resize-handle-ne { top: -4px; right: -4px; width: 12px; height: 12px; cursor: ne-resize; }
537
+ .resize-handle-nw { top: -4px; left: -4px; width: 12px; height: 12px; cursor: nw-resize; }
538
+ .resize-handle-se { bottom: -4px; right: -4px; width: 12px; height: 12px; cursor: se-resize; }
539
+ .resize-handle-sw { bottom: -4px; left: -4px; width: 12px; height: 12px; cursor: sw-resize; }
540
+
541
+ /* ─── Portfolio content ─────────────────────────────────────────────────── */
542
+
543
+ .portfolio-hero {
544
+ width: 100%;
545
+ display: block;
546
+ }
547
+
548
+ .portfolio-section {
549
+ padding: 24px;
550
+ border-bottom: 1px solid rgba(0,0,0,0.06);
551
+ }
552
+
553
+ .portfolio-section:last-child {
554
+ border-bottom: none;
555
+ }
556
+
557
+ .portfolio-text {
558
+ font-family: var(--font-body);
559
+ font-size: var(--font-size-base);
560
+ line-height: 1.75;
561
+ color: var(--win95-text);
562
+ }
563
+
564
+ .portfolio-gallery-img {
565
+ flex-shrink: 0;
566
+ max-height: 220px;
567
+ cursor: zoom-in;
568
+ border-radius: var(--radius-lg);
569
+ box-shadow: 0 2px 8px rgba(0,0,0,0.10);
570
+ transition: transform var(--transition-normal), box-shadow var(--transition-normal);
571
+ }
572
+
573
+ .portfolio-gallery-img:hover {
574
+ transform: scale(1.02);
575
+ box-shadow: 0 6px 20px rgba(0,0,0,0.16);
576
+ }
577
+
578
+ /* ─── Lightbox ──────────────────────────────────────────────────────────── */
579
+
580
+ .win95-lightbox {
581
+ position: fixed;
582
+ inset: 0;
583
+ background: rgba(0,0,0,0.88);
584
+ backdrop-filter: blur(6px);
585
+ -webkit-backdrop-filter: blur(6px);
586
+ display: flex;
587
+ align-items: center;
588
+ justify-content: center;
589
+ z-index: 99999;
590
+ animation: fadeIn 150ms ease-out both;
591
+ }
592
+
593
+ .win95-lightbox img {
594
+ max-width: 90vw;
595
+ max-height: 90vh;
596
+ object-fit: contain;
597
+ border-radius: var(--radius-lg);
598
+ box-shadow: 0 24px 64px rgba(0,0,0,0.5);
599
+ }
600
+
601
+ /* ─── Animations ────────────────────────────────────────────────────────── */
602
+
603
+ @keyframes windowOpen {
604
+ from { opacity: 0; transform: scale(0.96); }
605
+ to { opacity: 1; transform: scale(1); }
606
+ }
607
+
608
+ @keyframes windowClose {
609
+ from { opacity: 1; transform: scale(1); }
610
+ to { opacity: 0; transform: scale(0.96); }
611
+ }
612
+
613
+ @keyframes menuOpen {
614
+ from { opacity: 0; transform: translateY(6px); }
615
+ to { opacity: 1; transform: translateY(0); }
616
+ }
617
+
618
+ @keyframes fadeIn {
619
+ from { opacity: 0; }
620
+ to { opacity: 1; }
621
+ }
622
+
623
+ /* ─── Mobile ────────────────────────────────────────────────────────────── */
624
+
625
+ .mobile-layout {
626
+ position: fixed;
627
+ inset: 0;
628
+ background: #f0f0f0;
629
+ overflow-y: auto;
630
+ font-family: var(--font-body);
631
+ -webkit-font-smoothing: antialiased;
632
+ }
633
+
634
+ .mobile-header {
635
+ background: linear-gradient(135deg, var(--win95-titlebar) 0%, var(--win95-titlebar-end) 100%);
636
+ color: #fff;
637
+ padding: 36px 24px 28px;
638
+ }
639
+
640
+ .mobile-card {
641
+ background: #fff;
642
+ border-radius: var(--radius-xl);
643
+ overflow: hidden;
644
+ box-shadow: 0 2px 12px rgba(0,0,0,0.06);
645
+ margin: 12px 16px;
646
+ transition: box-shadow var(--transition-normal), transform var(--transition-normal);
647
+ }
648
+
649
+ .mobile-card:hover {
650
+ box-shadow: 0 6px 24px rgba(0,0,0,0.10);
651
+ transform: translateY(-1px);
652
+ }
653
+
654
+ .mobile-card-hero {
655
+ width: 100%;
656
+ aspect-ratio: 16 / 9;
657
+ object-fit: cover;
658
+ }
659
+
660
+ .mobile-card-body {
661
+ padding: 20px;
662
+ }
663
+
664
+ .mobile-tag {
665
+ display: inline-block;
666
+ background: #e8e8f0;
667
+ color: #444;
668
+ font-size: 11px;
669
+ font-weight: 500;
670
+ padding: 3px 10px;
671
+ border-radius: 99px;
672
+ margin: 0 4px 4px 0;
673
+ }
674
+
675
+ .mobile-toggle {
676
+ position: fixed;
677
+ bottom: 24px;
678
+ right: 24px;
679
+ z-index: 99998;
680
+ background: var(--win95-titlebar);
681
+ color: #fff;
682
+ border: none;
683
+ border-radius: var(--radius-lg);
684
+ padding: 10px 16px;
685
+ font-family: var(--font-body);
686
+ font-size: var(--font-size-sm);
687
+ font-weight: 500;
688
+ cursor: pointer;
689
+ box-shadow: 0 4px 16px rgba(0,0,128,0.35);
690
+ transition: background var(--transition-normal), box-shadow var(--transition-normal),
691
+ transform var(--transition-normal);
692
+ }
693
+
694
+ .mobile-toggle:hover {
695
+ background: var(--win95-titlebar-end);
696
+ box-shadow: 0 6px 22px rgba(0,0,128,0.45);
697
+ transform: translateY(-1px);
698
+ }