@prosophia/lab-classic 0.0.1 → 0.0.3

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.
@@ -0,0 +1 @@
1
+ "use strict";
File without changes
@@ -0,0 +1 @@
1
+ "use strict";
File without changes
@@ -0,0 +1,1169 @@
1
+ /* globals.css - Sciences Template (Verdant Edition) */
2
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=IBM+Plex+Mono:wght@400;500;600&display=swap');
3
+
4
+ /* ===================================
5
+ DESIGN SYSTEM - SCIENCES TEMPLATE
6
+ Academic • Clean • Research-Focused
7
+ Scholar Edition v1.0
8
+ =================================== */
9
+
10
+ :root {
11
+ /* Verdant Color Scheme - Exact Vite Theme */
12
+ /* Dark Mode Colors */
13
+ --dark-bg-primary: #0A1810;
14
+ --dark-bg-secondary: #0F2419;
15
+ --dark-bg-tertiary: #153021;
16
+ --dark-text-primary: #E8F9ED;
17
+ --dark-text-secondary: #8BDAA3;
18
+ --dark-text-muted: #5C6366;
19
+ --dark-border: rgba(139, 218, 163, 0.15);
20
+ --dark-card-bg: rgba(21, 48, 33, 0.4);
21
+
22
+ /* Light Mode Colors */
23
+ --light-bg-primary: #FAFBFB;
24
+ --light-bg-secondary: #F2F4F5;
25
+ --light-bg-tertiary: var(--light-bg-tint, #E8F9ED);
26
+ --light-text-primary: #0A1810;
27
+ --light-text-secondary: #153021;
28
+ --light-text-muted: #7F878B;
29
+ --light-border: rgba(21, 48, 33, 0.12);
30
+ --light-card-bg: rgba(255, 255, 255, 0.8);
31
+
32
+ /* Accent Colors */
33
+ --accent-primary: #2A6847;
34
+ --accent-secondary: #3A8F62;
35
+ --accent-tertiary: #5CB87A;
36
+ --accent-gold: #D4A574;
37
+ --accent-bright: #9ACD32;
38
+
39
+ /* Legacy Compatibility */
40
+ --color-brand-primary: #2A6847;
41
+ --color-brand-secondary: #3A8F62;
42
+ --color-brand-tertiary: #5CB87A;
43
+ --color-brand-accent: #5CB87A;
44
+ --color-brand-neutral: #2A6847;
45
+
46
+ /* Background Colors */
47
+ --color-background-primary: var(--light-bg-primary);
48
+ --color-background-secondary: var(--light-bg-secondary);
49
+ --color-background-tertiary: var(--light-bg-tertiary);
50
+ --color-background-card: var(--light-card-bg);
51
+ --color-background-elevated: #FFFFFF;
52
+ --color-footer-background: var(--dark-bg-primary);
53
+
54
+ /* Text Colors */
55
+ --color-text-primary: var(--light-text-primary);
56
+ --color-text-secondary: var(--light-text-secondary);
57
+ --color-text-tertiary: var(--light-text-muted);
58
+ --color-text-muted: var(--light-text-muted);
59
+ --color-text-accent: var(--accent-tertiary);
60
+ --color-text-purple: var(--accent-tertiary);
61
+ --color-text-inverse: #FFFFFF;
62
+
63
+ /* Border Colors */
64
+ --color-border: var(--light-border);
65
+ --color-border-light: var(--light-border);
66
+ --color-border-medium: rgba(21, 48, 33, 0.2);
67
+ --color-border-dark: rgba(21, 48, 33, 0.3);
68
+ --color-border-accent: var(--accent-tertiary);
69
+
70
+ /* Status Colors */
71
+ --color-success: #10B981;
72
+ --color-warning: #F59E0B;
73
+ --color-error: #EF4444;
74
+ --color-info: #3B82F6;
75
+
76
+ /* Gradients */
77
+ --gradient-primary: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary));
78
+ --gradient-secondary: linear-gradient(135deg, var(--accent-secondary), var(--accent-gold));
79
+ --gradient-accent: linear-gradient(90deg, var(--accent-primary) 0%, var(--accent-secondary) 100%);
80
+ --gradient-hero: linear-gradient(135deg, rgba(250, 251, 251, 0.9) 0%, rgba(232, 249, 237, 0.8) 50%, rgba(250, 251, 251, 0.9) 100%);
81
+ --gradient-card-hover: linear-gradient(135deg, rgba(92, 184, 122, 0.02) 0%, rgba(92, 184, 122, 0.01) 100%);
82
+
83
+ /* Typography - Inter (Verdant) */
84
+ --font-heading: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
85
+ --font-body: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
86
+ --font-mono: 'IBM Plex Mono', 'Courier New', monospace;
87
+
88
+ /* Font Sizes - Fluid Typography */
89
+ --font-size-xs: clamp(0.7rem, 0.8vw, 0.75rem);
90
+ --font-size-sm: clamp(0.8rem, 0.9vw, 0.875rem);
91
+ --font-size-base: clamp(0.9rem, 1vw, 1rem);
92
+ --font-size-lg: clamp(1rem, 1.1vw, 1.125rem);
93
+ --font-size-xl: clamp(1.1rem, 1.25vw, 1.25rem);
94
+ --font-size-2xl: clamp(1.25rem, 1.5vw, 1.5rem);
95
+ --font-size-3xl: clamp(1.5rem, 2vw, 1.875rem);
96
+ --font-size-4xl: clamp(1.875rem, 2.5vw, 2.25rem);
97
+ --font-size-5xl: clamp(2.25rem, 3.5vw, 3rem);
98
+ --font-size-6xl: clamp(2.75rem, 4.5vw, 3.75rem);
99
+
100
+ /* Font Weights */
101
+ --font-weight-light: 300;
102
+ --font-weight-normal: 400;
103
+ --font-weight-medium: 500;
104
+ --font-weight-semibold: 600;
105
+ --font-weight-bold: 700;
106
+ --font-weight-black: 900;
107
+
108
+ /* Line Heights */
109
+ --line-height-tight: 1.2;
110
+ --line-height-snug: 1.375;
111
+ --line-height-normal: 1.5;
112
+ --line-height-relaxed: 1.625;
113
+ --line-height-loose: 1.75;
114
+
115
+ /* Spacing */
116
+ --spacing-xs: 0.25rem;
117
+ --spacing-sm: 0.5rem;
118
+ --spacing-md: 0.75rem;
119
+ --spacing-lg: 1rem;
120
+ --spacing-xl: 1.5rem;
121
+ --spacing-2xl: 2rem;
122
+ --spacing-3xl: 3rem;
123
+ --spacing-4xl: 4rem;
124
+ --spacing-5xl: 6rem;
125
+ --spacing-6xl: 8rem;
126
+
127
+ /* Verdant Spacing (aliases) */
128
+ --space-xs: 0.5rem;
129
+ --space-sm: 1rem;
130
+ --space-md: 1.5rem;
131
+ --space-lg: 2rem;
132
+ --space-xl: 3rem;
133
+ --space-2xl: 4rem;
134
+ --space-3xl: 6rem;
135
+
136
+ /* Border Radius */
137
+ --border-radius-none: 0;
138
+ --border-radius-sm: 0.25rem;
139
+ --border-radius-md: 0.5rem;
140
+ --border-radius-lg: 0.75rem;
141
+ --border-radius-xl: 1rem;
142
+ --border-radius-2xl: 1.5rem;
143
+ --border-radius-full: 9999px;
144
+
145
+ /* Verdant Radius (aliases) */
146
+ --radius-sm: 8px;
147
+ --radius-md: 12px;
148
+ --radius-lg: 16px;
149
+ --radius-xl: 20px;
150
+ --radius-2xl: 24px;
151
+ --radius-full: 9999px;
152
+
153
+ /* Shadows */
154
+ --shadow-xs: 0 1px 2px 0 rgba(0, 0, 0, 0.03);
155
+ --shadow-sm: 0 1px 3px 0 rgba(0, 0, 0, 0.05), 0 1px 2px -1px rgba(0, 0, 0, 0.05);
156
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.07), 0 2px 4px -2px rgba(0, 0, 0, 0.05);
157
+ --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.08), 0 4px 6px -4px rgba(0, 0, 0, 0.04);
158
+ --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.08), 0 8px 10px -6px rgba(0, 0, 0, 0.04);
159
+ --shadow-2xl: 0 25px 50px -12px rgba(0, 0, 0, 0.15);
160
+ --shadow-accent: 0 10px 25px -5px rgba(5, 150, 105, 0.2), 0 4px 10px -4px rgba(5, 150, 105, 0.1);
161
+ --shadow-inner: inset 0 2px 4px 0 rgba(0, 0, 0, 0.05);
162
+
163
+ /* Transitions */
164
+ --transition-fast: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
165
+ --transition-base: 0.3s cubic-bezier(0.4, 0, 0.2, 1);
166
+ --transition-slow: 0.5s cubic-bezier(0.65, 0, 0.35, 1);
167
+ --transition-bounce: 500ms cubic-bezier(0.68, -0.55, 0.265, 1.55);
168
+
169
+ /* Layout */
170
+ --max-width-content: 1280px;
171
+ --max-width-prose: 70ch;
172
+ --max-width-narrow: 640px;
173
+ --header-height: 80px;
174
+
175
+ /* Z-Index Scale */
176
+ --z-dropdown: 100;
177
+ --z-sticky: 200;
178
+ --z-fixed: 300;
179
+ --z-modal-backdrop: 400;
180
+ --z-modal: 500;
181
+ --z-popover: 600;
182
+ --z-tooltip: 700;
183
+ }
184
+
185
+ @media (max-width: 1023.98px) {
186
+ :root {
187
+ --header-height: 64px;
188
+ }
189
+ }
190
+
191
+ /* Dark Mode */
192
+ body.dark-mode,
193
+ .dark {
194
+ --color-background-primary: var(--dark-bg-primary);
195
+ --color-background-secondary: var(--dark-bg-secondary);
196
+ --color-background-tertiary: var(--dark-bg-tertiary);
197
+ --color-background-card: var(--dark-bg-tertiary);
198
+ --color-background-elevated: var(--dark-bg-tertiary);
199
+ --color-footer-background: var(--dark-bg-secondary);
200
+
201
+ --color-text-primary: var(--dark-text-primary);
202
+ --color-text-secondary: var(--dark-text-secondary);
203
+ --color-text-tertiary: var(--dark-text-muted);
204
+ --color-text-muted: var(--dark-text-muted);
205
+ --color-text-accent: var(--accent-tertiary);
206
+ --color-text-purple: var(--accent-tertiary);
207
+ --color-text-inverse: var(--dark-bg-primary);
208
+
209
+ --color-border: var(--dark-border);
210
+ --color-border-light: var(--dark-border);
211
+ --color-border-medium: rgba(var(--accent-primary-rgb, 139, 218, 163), 0.25);
212
+ --color-border-dark: rgba(var(--accent-primary-rgb, 139, 218, 163), 0.35);
213
+ --color-border-accent: var(--accent-tertiary);
214
+
215
+ --gradient-hero: linear-gradient(135deg, var(--dark-bg-primary) 0%, var(--dark-bg-secondary) 50%, var(--dark-bg-primary) 100%);
216
+ --gradient-card-hover: linear-gradient(135deg, rgba(var(--accent-primary-rgb, 92, 184, 122), 0.05) 0%, rgba(var(--accent-primary-rgb, 92, 184, 122), 0.02) 100%);
217
+
218
+ --shadow-xs: 0 1px 2px 0 rgba(0, 0, 0, 0.3);
219
+ --shadow-sm: 0 1px 3px 0 rgba(0, 0, 0, 0.4), 0 1px 2px -1px rgba(0, 0, 0, 0.3);
220
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.45), 0 2px 4px -2px rgba(0, 0, 0, 0.35);
221
+ --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.45), 0 4px 6px -4px rgba(0, 0, 0, 0.35);
222
+ --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.5), 0 8px 10px -6px rgba(0, 0, 0, 0.4);
223
+ --shadow-accent: 0 10px 25px -5px rgba(var(--accent-primary-rgb, 92, 184, 122), 0.25), 0 4px 10px -4px rgba(var(--accent-primary-rgb, 92, 184, 122), 0.15);
224
+ }
225
+
226
+ /* Light Mode */
227
+ body.light-mode {
228
+ background-color: var(--light-bg-primary);
229
+ color: var(--light-text-primary);
230
+ }
231
+
232
+ /* ===================================
233
+ GLOBAL RESETS & BASE STYLES
234
+ =================================== */
235
+
236
+ *,
237
+ *::before,
238
+ *::after {
239
+ margin: 0;
240
+ padding: 0;
241
+ box-sizing: border-box;
242
+ }
243
+
244
+ html {
245
+ -webkit-font-smoothing: antialiased;
246
+ -moz-osx-font-smoothing: grayscale;
247
+ text-rendering: optimizeLegibility;
248
+ scroll-behavior: smooth;
249
+ }
250
+
251
+ @media (prefers-reduced-motion: reduce) {
252
+ html {
253
+ scroll-behavior: auto;
254
+ }
255
+ }
256
+
257
+ body {
258
+ font-family: var(--font-body);
259
+ font-size: var(--font-size-base);
260
+ line-height: var(--line-height-normal);
261
+ color: var(--color-text-primary);
262
+ background-color: var(--color-background-primary);
263
+ min-height: 100vh;
264
+ overflow-x: hidden;
265
+ }
266
+
267
+ /* Typography Defaults */
268
+ h1, h2, h3, h4, h5, h6 {
269
+ font-family: var(--font-heading);
270
+ font-weight: var(--font-weight-bold);
271
+ line-height: var(--line-height-tight);
272
+ color: var(--color-text-primary);
273
+ text-wrap: balance;
274
+ }
275
+
276
+ p {
277
+ text-wrap: pretty;
278
+ }
279
+
280
+ a {
281
+ color: var(--color-text-accent);
282
+ text-decoration: none;
283
+ transition: color var(--transition-fast);
284
+ }
285
+
286
+ a:hover {
287
+ color: var(--color-text-purple);
288
+ }
289
+
290
+ a:focus-visible {
291
+ outline: 2px solid var(--color-brand-primary);
292
+ outline-offset: 2px;
293
+ border-radius: var(--border-radius-sm);
294
+ }
295
+
296
+ img {
297
+ max-width: 100%;
298
+ height: auto;
299
+ display: block;
300
+ }
301
+
302
+ button {
303
+ font-family: inherit;
304
+ cursor: pointer;
305
+ }
306
+
307
+ button:focus-visible {
308
+ outline: 2px solid var(--color-brand-primary);
309
+ outline-offset: 2px;
310
+ }
311
+
312
+ /* Selection */
313
+ ::selection {
314
+ background-color: rgba(5, 150, 105, 0.2);
315
+ color: var(--color-text-primary);
316
+ }
317
+
318
+ /* Scrollbar Styling */
319
+ ::-webkit-scrollbar {
320
+ width: 10px;
321
+ height: 10px;
322
+ }
323
+
324
+ ::-webkit-scrollbar-track {
325
+ background: var(--color-background-secondary);
326
+ }
327
+
328
+ ::-webkit-scrollbar-thumb {
329
+ background: var(--color-border-medium);
330
+ border-radius: var(--border-radius-full);
331
+ border: 2px solid var(--color-background-secondary);
332
+ }
333
+
334
+ ::-webkit-scrollbar-thumb:hover {
335
+ background: var(--color-border-dark);
336
+ }
337
+
338
+ /* ===================================
339
+ UTILITY CLASSES
340
+ =================================== */
341
+
342
+ .container {
343
+ max-width: var(--max-width-content);
344
+ margin: 0 auto;
345
+ padding: 0 var(--spacing-lg);
346
+ }
347
+
348
+ .prose {
349
+ max-width: var(--max-width-prose);
350
+ }
351
+
352
+ .visually-hidden {
353
+ position: absolute;
354
+ width: 1px;
355
+ height: 1px;
356
+ padding: 0;
357
+ margin: -1px;
358
+ overflow: hidden;
359
+ clip: rect(0, 0, 0, 0);
360
+ white-space: nowrap;
361
+ border-width: 0;
362
+ }
363
+
364
+ /* Skip Link for Accessibility */
365
+ .skip-link {
366
+ position: absolute;
367
+ top: -100%;
368
+ left: 50%;
369
+ transform: translateX(-50%);
370
+ background: var(--color-brand-primary);
371
+ color: var(--color-text-inverse);
372
+ padding: var(--spacing-sm) var(--spacing-lg);
373
+ border-radius: var(--border-radius-md);
374
+ z-index: var(--z-tooltip);
375
+ transition: top var(--transition-fast);
376
+ }
377
+
378
+ .skip-link:focus {
379
+ top: var(--spacing-lg);
380
+ }
381
+
382
+ /* Academic Style Accents */
383
+ .academic-border-top {
384
+ border-top: 2px solid var(--color-border-accent);
385
+ }
386
+
387
+ .academic-border-left {
388
+ border-left: 3px solid var(--color-border-accent);
389
+ padding-left: var(--spacing-lg);
390
+ }
391
+
392
+ /* Section Divider */
393
+ .section-divider {
394
+ width: 100%;
395
+ height: 1px;
396
+ background: linear-gradient(
397
+ to right,
398
+ transparent,
399
+ var(--color-border-medium) 20%,
400
+ var(--color-border-medium) 80%,
401
+ transparent
402
+ );
403
+ margin: var(--spacing-4xl) 0;
404
+ }
405
+
406
+ /* Page Wrapper */
407
+ .pageWrapper {
408
+ background-color: var(--color-background-primary);
409
+ color: var(--color-text-primary);
410
+ font-family: var(--font-body);
411
+ position: relative;
412
+ overflow-x: hidden;
413
+ min-height: 100vh;
414
+ display: flex;
415
+ flex-direction: column;
416
+ }
417
+
418
+ .pageWrapper > main {
419
+ flex: 1;
420
+ }
421
+
422
+ /* ===================================
423
+ GLASS MORPHISM
424
+ =================================== */
425
+
426
+ .glass-card {
427
+ backdrop-filter: blur(20px) saturate(180%);
428
+ -webkit-backdrop-filter: blur(20px) saturate(180%);
429
+ border-radius: var(--border-radius-xl);
430
+ border: 1px solid;
431
+ transition: all var(--transition-slow);
432
+ }
433
+
434
+ .light-mode .glass-card,
435
+ :not(.dark) .glass-card {
436
+ background: rgba(255, 255, 255, 0.7);
437
+ border-color: rgba(21, 48, 33, 0.08);
438
+ box-shadow: 0 8px 32px rgba(10, 24, 16, 0.08);
439
+ }
440
+
441
+ .dark .glass-card {
442
+ background: var(--dark-bg-tertiary);
443
+ border-color: rgba(var(--accent-primary-rgb, 139, 218, 163), 0.12);
444
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
445
+ }
446
+
447
+ .glass-nav {
448
+ backdrop-filter: blur(24px) saturate(200%);
449
+ -webkit-backdrop-filter: blur(24px) saturate(200%);
450
+ }
451
+
452
+ /* ===================================
453
+ VITE-STYLE GRID SYSTEMS
454
+ =================================== */
455
+
456
+ /* Grid */
457
+ .grid {
458
+ display: grid;
459
+ gap: var(--spacing-lg);
460
+ width: 100%;
461
+ }
462
+
463
+ .grid-2 {
464
+ grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
465
+ }
466
+
467
+ .grid-3 {
468
+ grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
469
+ }
470
+
471
+ .grid-4 {
472
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
473
+ }
474
+
475
+ /* Asymmetric Grid Layouts */
476
+ .grid-staggered {
477
+ display: grid;
478
+ grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
479
+ gap: var(--spacing-lg);
480
+ width: 100%;
481
+ }
482
+
483
+ .grid-staggered > *:nth-child(even) {
484
+ margin-top: var(--spacing-2xl);
485
+ }
486
+
487
+ .grid-offset {
488
+ display: grid;
489
+ grid-template-columns: 1.2fr 0.8fr;
490
+ gap: var(--spacing-xl);
491
+ align-items: start;
492
+ width: 100%;
493
+ }
494
+
495
+ .grid-asymmetric-3 {
496
+ display: grid;
497
+ grid-template-columns: repeat(3, 1fr);
498
+ gap: var(--spacing-lg);
499
+ width: 100%;
500
+ }
501
+
502
+ .grid-asymmetric-3 > *:nth-child(3n+1) {
503
+ transform: translateY(-1rem);
504
+ }
505
+
506
+ .grid-asymmetric-3 > *:nth-child(3n+2) {
507
+ transform: translateY(1rem);
508
+ }
509
+
510
+ @media (max-width: 768px) {
511
+ .grid-2,
512
+ .grid-3,
513
+ .grid-4,
514
+ .grid-asymmetric-3 {
515
+ grid-template-columns: 1fr;
516
+ }
517
+
518
+ .grid-staggered > *:nth-child(even),
519
+ .grid-asymmetric-3 > *:nth-child(3n+1),
520
+ .grid-asymmetric-3 > *:nth-child(3n+2) {
521
+ margin-top: 0;
522
+ transform: translateY(0);
523
+ }
524
+
525
+ .grid-staggered,
526
+ .grid-offset,
527
+ .grid-asymmetric-3 {
528
+ grid-template-columns: 1fr;
529
+ }
530
+ }
531
+
532
+ /* ===================================
533
+ COMPONENT UTILITIES
534
+ =================================== */
535
+
536
+ /* Card Base - Vite Style */
537
+ .card {
538
+ border-radius: var(--border-radius-xl);
539
+ overflow: hidden;
540
+ transition: all var(--transition-slow);
541
+ position: relative;
542
+ }
543
+
544
+ .card:hover {
545
+ transform: translateY(-8px);
546
+ }
547
+
548
+ .dark .card:hover {
549
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4);
550
+ border-color: rgba(var(--accent-primary-rgb, 139, 218, 163), 0.25);
551
+ }
552
+
553
+ .light-mode .card:hover,
554
+ :not(.dark) .card:hover {
555
+ box-shadow: 0 20px 60px rgba(10, 24, 16, 0.15);
556
+ border-color: rgba(42, 104, 71, 0.25);
557
+ }
558
+
559
+ .card-image {
560
+ width: 100%;
561
+ aspect-ratio: 16 / 9;
562
+ overflow: hidden;
563
+ position: relative;
564
+ }
565
+
566
+ .card-image img {
567
+ width: 100%;
568
+ height: 100%;
569
+ object-fit: cover;
570
+ transition: transform var(--transition-slow);
571
+ }
572
+
573
+ .card:hover .card-image img {
574
+ transform: scale(1.08);
575
+ }
576
+
577
+ .card-content {
578
+ padding: var(--spacing-lg);
579
+ }
580
+
581
+ .card-category {
582
+ font-size: 0.75rem;
583
+ font-weight: 600;
584
+ letter-spacing: 0.1em;
585
+ text-transform: uppercase;
586
+ margin-bottom: var(--spacing-xs);
587
+ color: var(--accent-tertiary);
588
+ }
589
+
590
+ .card-title {
591
+ font-size: 1.25rem;
592
+ font-weight: 600;
593
+ line-height: 1.4;
594
+ margin-bottom: var(--spacing-sm);
595
+ transition: color var(--transition-base);
596
+ }
597
+
598
+ .card:hover .card-title {
599
+ color: var(--accent-tertiary);
600
+ }
601
+
602
+ .card-description {
603
+ font-size: 0.9375rem;
604
+ line-height: 1.6;
605
+ margin-bottom: var(--spacing-md);
606
+ display: -webkit-box;
607
+ -webkit-line-clamp: 3;
608
+ -webkit-box-orient: vertical;
609
+ overflow: hidden;
610
+ }
611
+
612
+ .dark .card-description {
613
+ color: var(--dark-text-muted);
614
+ }
615
+
616
+ .light-mode .card-description,
617
+ :not(.dark) .card-description {
618
+ color: var(--light-text-muted);
619
+ }
620
+
621
+ .card-meta {
622
+ display: flex;
623
+ gap: var(--spacing-md);
624
+ font-size: 0.875rem;
625
+ margin-bottom: var(--spacing-md);
626
+ }
627
+
628
+ .dark .card-meta {
629
+ color: var(--dark-text-muted);
630
+ }
631
+
632
+ .light-mode .card-meta,
633
+ :not(.dark) .card-meta {
634
+ color: var(--light-text-muted);
635
+ }
636
+
637
+ .card-link {
638
+ display: inline-flex;
639
+ align-items: center;
640
+ gap: 0.5rem;
641
+ font-size: 0.9375rem;
642
+ font-weight: 500;
643
+ color: var(--accent-tertiary);
644
+ text-decoration: none;
645
+ transition: gap var(--transition-base);
646
+ }
647
+
648
+ .card-link:hover {
649
+ gap: 0.75rem);
650
+ }
651
+
652
+ /* Research Card - Special Layout */
653
+ .research-card {
654
+ display: flex;
655
+ flex-direction: column;
656
+ }
657
+
658
+ /* Team Card */
659
+ .team-card {
660
+ text-align: center;
661
+ }
662
+
663
+ .team-card .card-image {
664
+ aspect-ratio: 3 / 4;
665
+ }
666
+
667
+ .team-card .card-image img {
668
+ filter: grayscale(100%);
669
+ }
670
+
671
+ .team-card:hover .card-image img {
672
+ filter: grayscale(0%);
673
+ }
674
+
675
+ .team-name {
676
+ font-size: 1.125rem;
677
+ font-weight: 600;
678
+ margin-bottom: var(--spacing-xs);
679
+ }
680
+
681
+ .team-role {
682
+ font-size: 0.875rem;
683
+ font-weight: 500;
684
+ text-transform: uppercase;
685
+ letter-spacing: 0.05em;
686
+ margin-bottom: var(--spacing-sm);
687
+ }
688
+
689
+ .dark .team-role {
690
+ color: var(--dark-text-muted);
691
+ }
692
+
693
+ .light-mode .team-role,
694
+ :not(.dark) .team-role {
695
+ color: var(--light-text-muted);
696
+ }
697
+
698
+ .team-bio {
699
+ font-size: 0.875rem;
700
+ line-height: 1.6;
701
+ margin-bottom: var(--spacing-md);
702
+ }
703
+
704
+ /* Gallery Grid */
705
+ .gallery-grid {
706
+ display: grid;
707
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
708
+ gap: var(--spacing-md);
709
+ width: 100%;
710
+ }
711
+
712
+ .gallery-item {
713
+ border-radius: var(--border-radius-lg);
714
+ overflow: hidden;
715
+ cursor: pointer;
716
+ transition: all var(--transition-base);
717
+ }
718
+
719
+ .gallery-item:hover {
720
+ transform: scale(1.05);
721
+ }
722
+
723
+ .gallery-item img {
724
+ width: 100%;
725
+ height: 100%;
726
+ object-fit: cover;
727
+ display: block;
728
+ }
729
+
730
+ /* Section Headers - Vite Style */
731
+ .section {
732
+ padding: var(--spacing-3xl) var(--spacing-lg);
733
+ position: relative;
734
+ }
735
+
736
+ .section-header-left {
737
+ text-align: left;
738
+ margin-bottom: var(--spacing-3xl);
739
+ max-width: 800px;
740
+ }
741
+
742
+ .section-label {
743
+ font-size: 0.875rem;
744
+ font-weight: 600;
745
+ letter-spacing: 0.12em;
746
+ text-transform: uppercase;
747
+ margin-bottom: var(--spacing-sm);
748
+ }
749
+
750
+ .dark .section-label {
751
+ color: var(--dark-text-secondary);
752
+ }
753
+
754
+ .light-mode .section-label,
755
+ :not(.dark) .section-label {
756
+ color: var(--accent-secondary);
757
+ }
758
+
759
+ .section-title {
760
+ font-size: clamp(2rem, 4vw, 3rem);
761
+ font-weight: 500;
762
+ line-height: 1.2;
763
+ letter-spacing: -0.01em;
764
+ margin-bottom: var(--spacing-md);
765
+ }
766
+
767
+ .section-description {
768
+ font-size: 1.125rem;
769
+ line-height: 1.7;
770
+ max-width: 800px;
771
+ }
772
+
773
+ .section-header-left .section-description {
774
+ margin: 0;
775
+ }
776
+
777
+ .dark .section-description {
778
+ color: var(--dark-text-muted);
779
+ }
780
+
781
+ .light-mode .section-description,
782
+ :not(.dark) .section-description {
783
+ color: var(--light-text-muted);
784
+ }
785
+
786
+ /* Accent Line for Left Headers */
787
+ .accent-line {
788
+ position: relative;
789
+ padding-left: var(--spacing-lg);
790
+ }
791
+
792
+ .accent-line::before {
793
+ content: '';
794
+ position: absolute;
795
+ left: 0;
796
+ top: 0;
797
+ width: 4px;
798
+ height: 100%;
799
+ background: linear-gradient(180deg, var(--accent-tertiary), var(--accent-gold));
800
+ border-radius: 2px;
801
+ }
802
+
803
+ .diagonal-accent {
804
+ position: relative;
805
+ }
806
+
807
+ .diagonal-accent::after {
808
+ content: '';
809
+ position: absolute;
810
+ top: -2rem;
811
+ right: -2rem;
812
+ width: 200px;
813
+ height: 200px;
814
+ background: linear-gradient(135deg, var(--accent-tertiary), transparent);
815
+ opacity: 0.05;
816
+ border-radius: var(--border-radius-2xl);
817
+ transform: rotate(15deg);
818
+ pointer-events: none;
819
+ }
820
+
821
+ /* Publication List - Vite Style */
822
+ .publication-list {
823
+ display: flex;
824
+ flex-direction: column;
825
+ gap: var(--spacing-md);
826
+ width: 100%;
827
+ }
828
+
829
+ .publication-item {
830
+ padding: var(--spacing-lg);
831
+ border-radius: var(--border-radius-lg);
832
+ display: flex;
833
+ justify-content: space-between;
834
+ align-items: flex-start;
835
+ gap: var(--spacing-lg);
836
+ transition: all var(--transition-base);
837
+ }
838
+
839
+ .dark .publication-item {
840
+ background: var(--dark-bg-tertiary);
841
+ border: 1px solid rgba(var(--accent-primary-rgb, 139, 218, 163), 0.08);
842
+ }
843
+
844
+ .light-mode .publication-item,
845
+ :not(.dark) .publication-item {
846
+ background: rgba(255, 255, 255, 0.6);
847
+ border: 1px solid rgba(21, 48, 33, 0.08);
848
+ }
849
+
850
+ .publication-item:hover {
851
+ transform: translateX(8px);
852
+ }
853
+
854
+ .dark .publication-item:hover {
855
+ background: var(--dark-bg-secondary);
856
+ border-color: rgba(var(--accent-primary-rgb, 139, 218, 163), 0.15);
857
+ }
858
+
859
+ .light-mode .publication-item:hover,
860
+ :not(.dark) .publication-item:hover {
861
+ background: rgba(255, 255, 255, 0.9);
862
+ border-color: rgba(42, 104, 71, 0.15);
863
+ }
864
+
865
+ .publication-date {
866
+ font-size: 0.875rem;
867
+ font-weight: 600;
868
+ padding: 0.5rem 1rem;
869
+ border-radius: var(--border-radius-sm);
870
+ white-space: nowrap;
871
+ }
872
+
873
+ .dark .publication-date {
874
+ background: rgba(var(--accent-primary-rgb, 139, 218, 163), 0.1);
875
+ color: var(--accent-tertiary);
876
+ }
877
+
878
+ .light-mode .publication-date,
879
+ :not(.dark) .publication-date {
880
+ background: rgba(42, 104, 71, 0.1);
881
+ color: var(--accent-primary);
882
+ }
883
+
884
+ .publication-info {
885
+ flex: 1;
886
+ }
887
+
888
+ .publication-title {
889
+ font-size: 1.125rem;
890
+ font-weight: 600;
891
+ margin-bottom: var(--spacing-xs);
892
+ line-height: 1.4;
893
+ }
894
+
895
+ .publication-authors {
896
+ font-size: 0.875rem;
897
+ margin-bottom: var(--spacing-xs);
898
+ }
899
+
900
+ .dark .publication-authors {
901
+ color: var(--dark-text-muted);
902
+ }
903
+
904
+ .light-mode .publication-authors,
905
+ :not(.dark) .publication-authors {
906
+ color: var(--light-text-muted);
907
+ }
908
+
909
+ /* Steps Section - Vite Style */
910
+ .steps-grid {
911
+ display: grid;
912
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
913
+ gap: var(--spacing-xl);
914
+ margin-top: var(--spacing-3xl);
915
+ width: 100%;
916
+ }
917
+
918
+ .step-card {
919
+ text-align: center;
920
+ padding: var(--spacing-xl);
921
+ }
922
+
923
+ .step-number {
924
+ font-size: 6rem;
925
+ font-weight: 300;
926
+ line-height: 1;
927
+ margin-bottom: var(--spacing-md);
928
+ background: linear-gradient(135deg, var(--accent-secondary), var(--accent-gold));
929
+ -webkit-background-clip: text;
930
+ -webkit-text-fill-color: transparent;
931
+ background-clip: text;
932
+ }
933
+
934
+ .step-title {
935
+ font-size: 1.25rem;
936
+ font-weight: 600;
937
+ margin-bottom: var(--spacing-sm);
938
+ }
939
+
940
+ .step-description {
941
+ font-size: 0.9375rem;
942
+ line-height: 1.6;
943
+ }
944
+
945
+ .dark .step-description {
946
+ color: var(--dark-text-muted);
947
+ }
948
+
949
+ .light-mode .step-description,
950
+ :not(.dark) .step-description {
951
+ color: var(--light-text-muted);
952
+ }
953
+
954
+ /* Button Base */
955
+ .btn {
956
+ display: inline-flex;
957
+ align-items: center;
958
+ justify-content: center;
959
+ gap: var(--spacing-sm);
960
+ padding: var(--spacing-md) var(--spacing-xl);
961
+ border-radius: var(--border-radius-md);
962
+ font-weight: var(--font-weight-semibold);
963
+ font-size: var(--font-size-base);
964
+ text-decoration: none;
965
+ transition: all var(--transition-base);
966
+ border: none;
967
+ cursor: pointer;
968
+ }
969
+
970
+ .btn-primary {
971
+ background: var(--gradient-primary);
972
+ color: var(--color-text-inverse);
973
+ box-shadow: var(--shadow-sm);
974
+ }
975
+
976
+ .btn-primary:hover {
977
+ transform: translateY(-2px);
978
+ box-shadow: var(--shadow-accent);
979
+ }
980
+
981
+ .btn-secondary {
982
+ background: var(--color-background-card);
983
+ color: var(--color-text-primary);
984
+ border: 1px solid var(--color-border-medium);
985
+ }
986
+
987
+ .btn-secondary:hover {
988
+ background: var(--color-background-secondary);
989
+ border-color: var(--color-border-accent);
990
+ }
991
+
992
+ /* Badge */
993
+ .badge {
994
+ display: inline-flex;
995
+ align-items: center;
996
+ gap: var(--spacing-xs);
997
+ padding: var(--spacing-xs) var(--spacing-md);
998
+ border-radius: var(--border-radius-full);
999
+ font-size: var(--font-size-xs);
1000
+ font-weight: var(--font-weight-semibold);
1001
+ text-transform: uppercase;
1002
+ letter-spacing: 0.5px;
1003
+ }
1004
+
1005
+ .badge-primary {
1006
+ background: rgba(5, 150, 105, 0.1);
1007
+ color: var(--color-brand-primary);
1008
+ border: 1px solid var(--color-border-accent);
1009
+ }
1010
+
1011
+ .badge-secondary {
1012
+ background: rgba(124, 58, 237, 0.1);
1013
+ color: var(--color-brand-accent);
1014
+ }
1015
+
1016
+ /* ===================================
1017
+ ACCESSIBILITY
1018
+ =================================== */
1019
+
1020
+ @media (prefers-reduced-motion: reduce) {
1021
+ *,
1022
+ *::before,
1023
+ *::after {
1024
+ animation-duration: 0.01ms !important;
1025
+ animation-iteration-count: 1 !important;
1026
+ transition-duration: 0.01ms !important;
1027
+ scroll-behavior: auto !important;
1028
+ }
1029
+ }
1030
+
1031
+ /* Focus styles for keyboard navigation */
1032
+ :focus-visible {
1033
+ outline: 2px solid var(--color-brand-primary);
1034
+ outline-offset: 2px;
1035
+ }
1036
+
1037
+ /* High contrast mode support */
1038
+ @media (prefers-contrast: high) {
1039
+ :root {
1040
+ --color-border-light: #000000;
1041
+ --color-border-medium: #000000;
1042
+ --shadow-sm: none;
1043
+ --shadow-md: none;
1044
+ --shadow-lg: none;
1045
+ }
1046
+ }
1047
+
1048
+ /* ===================================
1049
+ PRINT STYLES
1050
+ =================================== */
1051
+
1052
+ @media print {
1053
+ *,
1054
+ *::before,
1055
+ *::after {
1056
+ background: transparent !important;
1057
+ color: #000 !important;
1058
+ box-shadow: none !important;
1059
+ text-shadow: none !important;
1060
+ }
1061
+
1062
+ body {
1063
+ font-size: 12pt;
1064
+ line-height: 1.5;
1065
+ }
1066
+
1067
+ h1, h2, h3, h4, h5, h6 {
1068
+ page-break-after: avoid;
1069
+ page-break-inside: avoid;
1070
+ }
1071
+
1072
+ img {
1073
+ max-width: 100% !important;
1074
+ page-break-inside: avoid;
1075
+ }
1076
+
1077
+ p, h2, h3 {
1078
+ orphans: 3;
1079
+ widows: 3;
1080
+ }
1081
+
1082
+ a {
1083
+ text-decoration: underline;
1084
+ }
1085
+
1086
+ a[href^="http"]::after {
1087
+ content: " (" attr(href) ")";
1088
+ font-size: 0.8em;
1089
+ }
1090
+
1091
+ .no-print,
1092
+ header,
1093
+ footer,
1094
+ nav {
1095
+ display: none !important;
1096
+ }
1097
+ }
1098
+
1099
+ /* ===================================
1100
+ LOADING STATES
1101
+ =================================== */
1102
+
1103
+ .skeleton {
1104
+ background: linear-gradient(
1105
+ 90deg,
1106
+ var(--color-background-secondary) 25%,
1107
+ var(--color-background-tertiary) 50%,
1108
+ var(--color-background-secondary) 75%
1109
+ );
1110
+ background-size: 200% 100%;
1111
+ animation: skeleton-loading 1.5s infinite;
1112
+ border-radius: var(--border-radius-md);
1113
+ }
1114
+
1115
+ @keyframes skeleton-loading {
1116
+ 0% {
1117
+ background-position: 200% 0;
1118
+ }
1119
+ 100% {
1120
+ background-position: -200% 0;
1121
+ }
1122
+ }
1123
+
1124
+ /* ===================================
1125
+ ANIMATIONS
1126
+ =================================== */
1127
+
1128
+ @keyframes fadeIn {
1129
+ from {
1130
+ opacity: 0;
1131
+ }
1132
+ to {
1133
+ opacity: 1;
1134
+ }
1135
+ }
1136
+
1137
+ @keyframes fadeInUp {
1138
+ from {
1139
+ opacity: 0;
1140
+ transform: translateY(20px);
1141
+ }
1142
+ to {
1143
+ opacity: 1;
1144
+ transform: translateY(0);
1145
+ }
1146
+ }
1147
+
1148
+ @keyframes slideInRight {
1149
+ from {
1150
+ opacity: 0;
1151
+ transform: translateX(20px);
1152
+ }
1153
+ to {
1154
+ opacity: 1;
1155
+ transform: translateX(0);
1156
+ }
1157
+ }
1158
+
1159
+ .animate-fade-in {
1160
+ animation: fadeIn var(--transition-base) ease-out;
1161
+ }
1162
+
1163
+ .animate-fade-in-up {
1164
+ animation: fadeInUp var(--transition-slow) ease-out;
1165
+ }
1166
+
1167
+ .animate-slide-in-right {
1168
+ animation: slideInRight var(--transition-slow) ease-out;
1169
+ }
package/package.json CHANGED
@@ -1,21 +1,25 @@
1
1
  {
2
2
  "name": "@prosophia/lab-classic",
3
- "version": "0.0.1",
3
+ "version": "0.0.3",
4
4
  "description": "Classic lab website template for Prosophia",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
7
- "types": "./dist/index.d.ts",
8
7
  "exports": {
9
8
  ".": {
10
9
  "import": "./dist/index.mjs",
11
- "require": "./dist/index.js",
12
- "types": "./dist/index.d.ts"
10
+ "require": "./dist/index.js"
13
11
  },
14
- "./styles": "./dist/styles/index.css"
12
+ "./schemas": {
13
+ "import": "./dist/schemas/index.mjs",
14
+ "require": "./dist/schemas/index.js"
15
+ },
16
+ "./layouts": {
17
+ "import": "./dist/layouts/index.mjs",
18
+ "require": "./dist/layouts/index.js"
19
+ },
20
+ "./styles": "./dist/styles/globals.css"
15
21
  },
16
- "files": [
17
- "dist"
18
- ],
22
+ "files": ["dist"],
19
23
  "scripts": {
20
24
  "build": "tsup",
21
25
  "dev": "tsup --watch",
@@ -23,9 +27,9 @@
23
27
  },
24
28
  "peerDependencies": {
25
29
  "framer-motion": "^11.0.0",
26
- "next": "^14.0.0",
27
- "react": "^18.0.0",
28
- "react-dom": "^18.0.0"
30
+ "next": ">=14.0.0",
31
+ "react": ">=18.0.0",
32
+ "react-dom": ">=18.0.0"
29
33
  },
30
34
  "devDependencies": {
31
35
  "@types/react": "^18.0.0",