devfolio-page 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 (115) hide show
  1. package/README.md +219 -0
  2. package/dist/cli/commands/init.js +282 -0
  3. package/dist/cli/commands/render.js +105 -0
  4. package/dist/cli/commands/themes.js +40 -0
  5. package/dist/cli/commands/validate.js +86 -0
  6. package/dist/cli/helpers/validate.js +99 -0
  7. package/dist/cli/index.js +51 -0
  8. package/dist/cli/postinstall.js +20 -0
  9. package/dist/cli/schemas/portfolio.schema.js +299 -0
  10. package/dist/generator/builder.js +551 -0
  11. package/dist/generator/markdown.js +57 -0
  12. package/dist/generator/themes/dark-academia/partials/education.html +15 -0
  13. package/dist/generator/themes/dark-academia/partials/experience.html +23 -0
  14. package/dist/generator/themes/dark-academia/partials/hero.html +15 -0
  15. package/dist/generator/themes/dark-academia/partials/projects.html +17 -0
  16. package/dist/generator/themes/dark-academia/partials/skills.html +11 -0
  17. package/dist/generator/themes/dark-academia/partials/writing.html +15 -0
  18. package/dist/generator/themes/dark-academia/script.js +91 -0
  19. package/dist/generator/themes/dark-academia/styles.css +913 -0
  20. package/dist/generator/themes/dark-academia/template.html +46 -0
  21. package/dist/generator/themes/dark-academia/templates/experiments-index.html +80 -0
  22. package/dist/generator/themes/dark-academia/templates/homepage.html +125 -0
  23. package/dist/generator/themes/dark-academia/templates/project.html +101 -0
  24. package/dist/generator/themes/dark-academia/templates/projects-index.html +80 -0
  25. package/dist/generator/themes/dark-academia/templates/writing-index.html +75 -0
  26. package/dist/generator/themes/modern/partials/education.html +14 -0
  27. package/dist/generator/themes/modern/partials/experience.html +21 -0
  28. package/dist/generator/themes/modern/partials/hero.html +15 -0
  29. package/dist/generator/themes/modern/partials/projects.html +17 -0
  30. package/dist/generator/themes/modern/partials/skills.html +11 -0
  31. package/dist/generator/themes/modern/partials/writing.html +14 -0
  32. package/dist/generator/themes/modern/script.js +136 -0
  33. package/dist/generator/themes/modern/styles.css +835 -0
  34. package/dist/generator/themes/modern/template.html +59 -0
  35. package/dist/generator/themes/modern/templates/experiments-index.html +78 -0
  36. package/dist/generator/themes/modern/templates/homepage.html +125 -0
  37. package/dist/generator/themes/modern/templates/project.html +98 -0
  38. package/dist/generator/themes/modern/templates/projects-index.html +79 -0
  39. package/dist/generator/themes/modern/templates/writing-index.html +73 -0
  40. package/dist/generator/themes/srcl/partials/education.html +27 -0
  41. package/dist/generator/themes/srcl/partials/experience.html +25 -0
  42. package/dist/generator/themes/srcl/partials/hero.html +22 -0
  43. package/dist/generator/themes/srcl/partials/projects.html +24 -0
  44. package/dist/generator/themes/srcl/partials/sections/code.html +8 -0
  45. package/dist/generator/themes/srcl/partials/sections/demo.html +8 -0
  46. package/dist/generator/themes/srcl/partials/sections/gallery.html +12 -0
  47. package/dist/generator/themes/srcl/partials/sections/image.html +6 -0
  48. package/dist/generator/themes/srcl/partials/sections/interactive.html +8 -0
  49. package/dist/generator/themes/srcl/partials/sections/metrics.html +10 -0
  50. package/dist/generator/themes/srcl/partials/sections/outcomes.html +5 -0
  51. package/dist/generator/themes/srcl/partials/sections/overview.html +5 -0
  52. package/dist/generator/themes/srcl/partials/sections/process.html +5 -0
  53. package/dist/generator/themes/srcl/partials/skills.html +21 -0
  54. package/dist/generator/themes/srcl/partials/writing.html +14 -0
  55. package/dist/generator/themes/srcl/script.js +354 -0
  56. package/dist/generator/themes/srcl/styles.css +1260 -0
  57. package/dist/generator/themes/srcl/template.html +46 -0
  58. package/dist/generator/themes/srcl/templates/experiments-index.html +66 -0
  59. package/dist/generator/themes/srcl/templates/homepage.html +136 -0
  60. package/dist/generator/themes/srcl/templates/project.html +96 -0
  61. package/dist/generator/themes/srcl/templates/projects-index.html +70 -0
  62. package/dist/generator/themes/srcl/templates/writing-index.html +61 -0
  63. package/dist/types/portfolio.js +4 -0
  64. package/package.json +58 -0
  65. package/src/generator/themes/dark-academia/partials/education.html +15 -0
  66. package/src/generator/themes/dark-academia/partials/experience.html +23 -0
  67. package/src/generator/themes/dark-academia/partials/hero.html +15 -0
  68. package/src/generator/themes/dark-academia/partials/projects.html +17 -0
  69. package/src/generator/themes/dark-academia/partials/skills.html +11 -0
  70. package/src/generator/themes/dark-academia/partials/writing.html +15 -0
  71. package/src/generator/themes/dark-academia/script.js +91 -0
  72. package/src/generator/themes/dark-academia/styles.css +913 -0
  73. package/src/generator/themes/dark-academia/template.html +46 -0
  74. package/src/generator/themes/dark-academia/templates/experiments-index.html +80 -0
  75. package/src/generator/themes/dark-academia/templates/homepage.html +125 -0
  76. package/src/generator/themes/dark-academia/templates/project.html +101 -0
  77. package/src/generator/themes/dark-academia/templates/projects-index.html +80 -0
  78. package/src/generator/themes/dark-academia/templates/writing-index.html +75 -0
  79. package/src/generator/themes/modern/partials/education.html +14 -0
  80. package/src/generator/themes/modern/partials/experience.html +21 -0
  81. package/src/generator/themes/modern/partials/hero.html +15 -0
  82. package/src/generator/themes/modern/partials/projects.html +17 -0
  83. package/src/generator/themes/modern/partials/skills.html +11 -0
  84. package/src/generator/themes/modern/partials/writing.html +14 -0
  85. package/src/generator/themes/modern/script.js +136 -0
  86. package/src/generator/themes/modern/styles.css +835 -0
  87. package/src/generator/themes/modern/template.html +59 -0
  88. package/src/generator/themes/modern/templates/experiments-index.html +78 -0
  89. package/src/generator/themes/modern/templates/homepage.html +125 -0
  90. package/src/generator/themes/modern/templates/project.html +98 -0
  91. package/src/generator/themes/modern/templates/projects-index.html +79 -0
  92. package/src/generator/themes/modern/templates/writing-index.html +73 -0
  93. package/src/generator/themes/srcl/partials/education.html +27 -0
  94. package/src/generator/themes/srcl/partials/experience.html +25 -0
  95. package/src/generator/themes/srcl/partials/hero.html +22 -0
  96. package/src/generator/themes/srcl/partials/projects.html +24 -0
  97. package/src/generator/themes/srcl/partials/sections/code.html +8 -0
  98. package/src/generator/themes/srcl/partials/sections/demo.html +8 -0
  99. package/src/generator/themes/srcl/partials/sections/gallery.html +12 -0
  100. package/src/generator/themes/srcl/partials/sections/image.html +6 -0
  101. package/src/generator/themes/srcl/partials/sections/interactive.html +8 -0
  102. package/src/generator/themes/srcl/partials/sections/metrics.html +10 -0
  103. package/src/generator/themes/srcl/partials/sections/outcomes.html +5 -0
  104. package/src/generator/themes/srcl/partials/sections/overview.html +5 -0
  105. package/src/generator/themes/srcl/partials/sections/process.html +5 -0
  106. package/src/generator/themes/srcl/partials/skills.html +21 -0
  107. package/src/generator/themes/srcl/partials/writing.html +14 -0
  108. package/src/generator/themes/srcl/script.js +354 -0
  109. package/src/generator/themes/srcl/styles.css +1260 -0
  110. package/src/generator/themes/srcl/template.html +46 -0
  111. package/src/generator/themes/srcl/templates/experiments-index.html +66 -0
  112. package/src/generator/themes/srcl/templates/homepage.html +136 -0
  113. package/src/generator/themes/srcl/templates/project.html +96 -0
  114. package/src/generator/themes/srcl/templates/projects-index.html +70 -0
  115. package/src/generator/themes/srcl/templates/writing-index.html +61 -0
@@ -0,0 +1,835 @@
1
+ /* ============================================
2
+ Modern Theme for dev.page
3
+ Clean, contemporary, minimalist design
4
+ ============================================ */
5
+
6
+ /* --------------------------------------------
7
+ CSS Custom Properties
8
+ -------------------------------------------- */
9
+ :root {
10
+ /* Typography */
11
+ --font-sans: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
12
+ --font-mono: 'SF Mono', 'Fira Code', 'Consolas', monospace;
13
+
14
+ /* Spacing */
15
+ --spacing-xs: 0.25rem;
16
+ --spacing-sm: 0.5rem;
17
+ --spacing-md: 1rem;
18
+ --spacing-lg: 1.5rem;
19
+ --spacing-xl: 2rem;
20
+ --spacing-2xl: 3rem;
21
+ --spacing-3xl: 4rem;
22
+
23
+ /* Layout */
24
+ --content-width: 720px;
25
+ --header-height: 64px;
26
+
27
+ /* Transitions */
28
+ --transition-fast: 150ms ease;
29
+ --transition-base: 200ms ease;
30
+
31
+ /* Border radius */
32
+ --radius-sm: 4px;
33
+ --radius-md: 8px;
34
+ --radius-lg: 12px;
35
+ }
36
+
37
+ /* Light theme (default) */
38
+ [data-theme="light"] {
39
+ --bg-primary: #ffffff;
40
+ --bg-secondary: #f8f9fa;
41
+ --bg-tertiary: #f1f3f4;
42
+ --text-primary: #1a1a1a;
43
+ --text-secondary: #666666;
44
+ --text-tertiary: #999999;
45
+ --border-color: #e5e7eb;
46
+ --accent-color: #2563eb;
47
+ --accent-hover: #1d4ed8;
48
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
49
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
50
+ --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
51
+ }
52
+
53
+ /* Dark theme */
54
+ [data-theme="dark"] {
55
+ --bg-primary: #0a0a0a;
56
+ --bg-secondary: #141414;
57
+ --bg-tertiary: #1f1f1f;
58
+ --text-primary: #fafafa;
59
+ --text-secondary: #a1a1a1;
60
+ --text-tertiary: #666666;
61
+ --border-color: #2e2e2e;
62
+ --accent-color: #3b82f6;
63
+ --accent-hover: #60a5fa;
64
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);
65
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.4);
66
+ --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.5);
67
+ }
68
+
69
+ /* --------------------------------------------
70
+ Reset & Base
71
+ -------------------------------------------- */
72
+ *, *::before, *::after {
73
+ box-sizing: border-box;
74
+ margin: 0;
75
+ padding: 0;
76
+ }
77
+
78
+ html {
79
+ font-size: 16px;
80
+ scroll-behavior: smooth;
81
+ }
82
+
83
+ body {
84
+ font-family: var(--font-sans);
85
+ font-size: 1rem;
86
+ line-height: 1.6;
87
+ color: var(--text-primary);
88
+ background: var(--bg-primary);
89
+ -webkit-font-smoothing: antialiased;
90
+ -moz-osx-font-smoothing: grayscale;
91
+ }
92
+
93
+ /* --------------------------------------------
94
+ Typography
95
+ -------------------------------------------- */
96
+ h1, h2, h3, h4 {
97
+ font-weight: 600;
98
+ line-height: 1.3;
99
+ color: var(--text-primary);
100
+ }
101
+
102
+ h1 { font-size: 2.5rem; }
103
+ h2 { font-size: 1.5rem; }
104
+ h3 { font-size: 1.125rem; }
105
+
106
+ p {
107
+ color: var(--text-secondary);
108
+ }
109
+
110
+ a {
111
+ color: var(--accent-color);
112
+ text-decoration: none;
113
+ transition: color var(--transition-fast);
114
+ }
115
+
116
+ a:hover {
117
+ color: var(--accent-hover);
118
+ }
119
+
120
+ /* --------------------------------------------
121
+ Header
122
+ -------------------------------------------- */
123
+ .site-header {
124
+ position: fixed;
125
+ top: 0;
126
+ left: 0;
127
+ right: 0;
128
+ height: var(--header-height);
129
+ background: var(--bg-primary);
130
+ border-bottom: 1px solid var(--border-color);
131
+ z-index: 100;
132
+ }
133
+
134
+ .header-content {
135
+ width: 100%;
136
+ padding: 0 var(--spacing-xl);
137
+ height: 100%;
138
+ display: flex;
139
+ align-items: center;
140
+ justify-content: space-between;
141
+ position: relative;
142
+ }
143
+
144
+ .logo {
145
+ font-weight: 600;
146
+ font-size: 1.125rem;
147
+ color: var(--text-primary);
148
+ }
149
+
150
+ .logo:hover {
151
+ color: var(--text-primary);
152
+ }
153
+
154
+ .nav {
155
+ position: absolute;
156
+ left: 50%;
157
+ transform: translateX(-50%);
158
+ display: flex;
159
+ gap: var(--spacing-lg);
160
+ }
161
+
162
+ .nav a {
163
+ font-size: 0.875rem;
164
+ color: var(--text-secondary);
165
+ transition: color var(--transition-fast);
166
+ }
167
+
168
+ .nav a:hover {
169
+ color: var(--text-primary);
170
+ }
171
+
172
+ .nav a.active {
173
+ color: var(--text-primary);
174
+ border-bottom: 2px solid var(--accent-color);
175
+ padding-bottom: 2px;
176
+ }
177
+
178
+ .theme-toggle {
179
+ display: flex;
180
+ align-items: center;
181
+ justify-content: center;
182
+ width: 40px;
183
+ height: 40px;
184
+ border: none;
185
+ background: transparent;
186
+ color: var(--text-secondary);
187
+ cursor: pointer;
188
+ border-radius: var(--radius-md);
189
+ transition: background var(--transition-fast), color var(--transition-fast);
190
+ }
191
+
192
+ .theme-toggle:hover {
193
+ background: var(--bg-secondary);
194
+ color: var(--text-primary);
195
+ }
196
+
197
+ [data-theme="light"] .icon-moon { display: none; }
198
+ [data-theme="dark"] .icon-sun { display: none; }
199
+
200
+ /* --------------------------------------------
201
+ Main Content
202
+ -------------------------------------------- */
203
+ .main-content {
204
+ max-width: var(--content-width);
205
+ margin: 0 auto;
206
+ padding: calc(var(--header-height) + var(--spacing-3xl)) var(--spacing-lg) var(--spacing-3xl);
207
+ }
208
+
209
+ /* --------------------------------------------
210
+ Hero Section
211
+ -------------------------------------------- */
212
+ .hero {
213
+ margin-bottom: var(--spacing-3xl);
214
+ }
215
+
216
+ .hero-name {
217
+ font-size: 3rem;
218
+ font-weight: 700;
219
+ margin-bottom: var(--spacing-sm);
220
+ background: linear-gradient(135deg, var(--text-primary) 0%, var(--text-secondary) 100%);
221
+ -webkit-background-clip: text;
222
+ -webkit-text-fill-color: transparent;
223
+ background-clip: text;
224
+ }
225
+
226
+ .hero-title {
227
+ font-size: 1.25rem;
228
+ color: var(--text-secondary);
229
+ margin-bottom: var(--spacing-xs);
230
+ }
231
+
232
+ .hero-location {
233
+ font-size: 0.875rem;
234
+ color: var(--text-tertiary);
235
+ margin-bottom: var(--spacing-xl);
236
+ }
237
+
238
+ .hero-links {
239
+ display: flex;
240
+ flex-wrap: wrap;
241
+ gap: var(--spacing-md);
242
+ margin-bottom: var(--spacing-xl);
243
+ }
244
+
245
+ .hero-link {
246
+ display: inline-flex;
247
+ align-items: center;
248
+ gap: var(--spacing-xs);
249
+ padding: var(--spacing-sm) var(--spacing-md);
250
+ background: var(--bg-secondary);
251
+ border-radius: var(--radius-md);
252
+ font-size: 0.875rem;
253
+ color: var(--text-secondary);
254
+ transition: background var(--transition-fast), color var(--transition-fast);
255
+ }
256
+
257
+ .hero-link:hover {
258
+ background: var(--bg-tertiary);
259
+ color: var(--text-primary);
260
+ }
261
+
262
+ .hero-bio {
263
+ font-size: 1.125rem;
264
+ line-height: 1.7;
265
+ color: var(--text-secondary);
266
+ white-space: pre-wrap;
267
+ }
268
+
269
+ /* --------------------------------------------
270
+ Section Styles
271
+ -------------------------------------------- */
272
+ .section {
273
+ margin-bottom: var(--spacing-3xl);
274
+ }
275
+
276
+ .section-title {
277
+ font-size: 0.75rem;
278
+ font-weight: 600;
279
+ text-transform: uppercase;
280
+ letter-spacing: 0.1em;
281
+ color: var(--text-tertiary);
282
+ margin-bottom: var(--spacing-lg);
283
+ padding-bottom: var(--spacing-sm);
284
+ border-bottom: 1px solid var(--border-color);
285
+ }
286
+
287
+ /* --------------------------------------------
288
+ Experience
289
+ -------------------------------------------- */
290
+ .experience-list {
291
+ display: flex;
292
+ flex-direction: column;
293
+ gap: var(--spacing-xl);
294
+ }
295
+
296
+ .experience-item {
297
+ display: grid;
298
+ grid-template-columns: 1fr auto;
299
+ gap: var(--spacing-md);
300
+ }
301
+
302
+ .experience-header {
303
+ display: flex;
304
+ flex-direction: column;
305
+ gap: var(--spacing-xs);
306
+ }
307
+
308
+ .experience-company {
309
+ font-weight: 600;
310
+ color: var(--text-primary);
311
+ }
312
+
313
+ .experience-role {
314
+ color: var(--text-secondary);
315
+ }
316
+
317
+ .experience-date {
318
+ font-size: 0.875rem;
319
+ color: var(--text-tertiary);
320
+ text-align: right;
321
+ }
322
+
323
+ .experience-highlights {
324
+ grid-column: 1 / -1;
325
+ list-style: none;
326
+ padding-left: 0;
327
+ margin-top: var(--spacing-sm);
328
+ }
329
+
330
+ .experience-highlights li {
331
+ position: relative;
332
+ padding-left: var(--spacing-lg);
333
+ margin-bottom: var(--spacing-sm);
334
+ color: var(--text-secondary);
335
+ font-size: 0.9375rem;
336
+ }
337
+
338
+ .experience-highlights li::before {
339
+ content: '';
340
+ position: absolute;
341
+ left: 0;
342
+ top: 0.6em;
343
+ width: 6px;
344
+ height: 6px;
345
+ background: var(--accent-color);
346
+ border-radius: 50%;
347
+ }
348
+
349
+ /* --------------------------------------------
350
+ Projects
351
+ -------------------------------------------- */
352
+ .projects-grid {
353
+ display: grid;
354
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
355
+ gap: var(--spacing-lg);
356
+ }
357
+
358
+ .project-card {
359
+ background: var(--bg-secondary);
360
+ border-radius: var(--radius-lg);
361
+ padding: var(--spacing-lg);
362
+ transition: transform var(--transition-base), box-shadow var(--transition-base);
363
+ }
364
+
365
+ .project-card:hover {
366
+ transform: translateY(-2px);
367
+ box-shadow: var(--shadow-md);
368
+ }
369
+
370
+ .project-card.featured {
371
+ background: linear-gradient(135deg, var(--bg-secondary) 0%, var(--bg-tertiary) 100%);
372
+ border: 1px solid var(--border-color);
373
+ }
374
+
375
+ .project-header {
376
+ display: flex;
377
+ justify-content: space-between;
378
+ align-items: flex-start;
379
+ margin-bottom: var(--spacing-sm);
380
+ }
381
+
382
+ .project-name {
383
+ font-size: 1rem;
384
+ font-weight: 600;
385
+ }
386
+
387
+ .project-link {
388
+ font-size: 0.75rem;
389
+ padding: var(--spacing-xs) var(--spacing-sm);
390
+ background: var(--accent-color);
391
+ color: white;
392
+ border-radius: var(--radius-sm);
393
+ transition: background var(--transition-fast);
394
+ }
395
+
396
+ .project-link:hover {
397
+ background: var(--accent-hover);
398
+ color: white;
399
+ }
400
+
401
+ .project-description {
402
+ font-size: 0.875rem;
403
+ color: var(--text-secondary);
404
+ margin-bottom: var(--spacing-md);
405
+ }
406
+
407
+ .project-tags {
408
+ display: flex;
409
+ flex-wrap: wrap;
410
+ gap: var(--spacing-xs);
411
+ }
412
+
413
+ .project-tag {
414
+ font-size: 0.75rem;
415
+ padding: var(--spacing-xs) var(--spacing-sm);
416
+ background: var(--bg-tertiary);
417
+ color: var(--text-tertiary);
418
+ border-radius: var(--radius-sm);
419
+ }
420
+
421
+ /* --------------------------------------------
422
+ Skills
423
+ -------------------------------------------- */
424
+ .skills-grid {
425
+ display: grid;
426
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
427
+ gap: var(--spacing-lg);
428
+ }
429
+
430
+ .skill-category {
431
+ background: var(--bg-secondary);
432
+ border-radius: var(--radius-md);
433
+ padding: var(--spacing-md);
434
+ }
435
+
436
+ .skill-category-name {
437
+ font-size: 0.75rem;
438
+ font-weight: 600;
439
+ text-transform: uppercase;
440
+ letter-spacing: 0.05em;
441
+ color: var(--text-tertiary);
442
+ margin-bottom: var(--spacing-sm);
443
+ }
444
+
445
+ .skill-list {
446
+ font-size: 0.875rem;
447
+ color: var(--text-secondary);
448
+ line-height: 1.5;
449
+ }
450
+
451
+ /* --------------------------------------------
452
+ Writing
453
+ -------------------------------------------- */
454
+ .writing-list {
455
+ display: flex;
456
+ flex-direction: column;
457
+ gap: var(--spacing-lg);
458
+ }
459
+
460
+ .writing-item {
461
+ display: flex;
462
+ justify-content: space-between;
463
+ align-items: baseline;
464
+ padding-bottom: var(--spacing-lg);
465
+ border-bottom: 1px solid var(--border-color);
466
+ }
467
+
468
+ .writing-item:last-child {
469
+ border-bottom: none;
470
+ padding-bottom: 0;
471
+ }
472
+
473
+ .writing-title {
474
+ font-weight: 500;
475
+ color: var(--text-primary);
476
+ }
477
+
478
+ .writing-title:hover {
479
+ color: var(--accent-color);
480
+ }
481
+
482
+ .writing-date {
483
+ font-size: 0.875rem;
484
+ color: var(--text-tertiary);
485
+ white-space: nowrap;
486
+ margin-left: var(--spacing-md);
487
+ }
488
+
489
+ .writing-description {
490
+ font-size: 0.875rem;
491
+ color: var(--text-secondary);
492
+ margin-top: var(--spacing-xs);
493
+ }
494
+
495
+ /* --------------------------------------------
496
+ Education
497
+ -------------------------------------------- */
498
+ .education-list {
499
+ display: flex;
500
+ flex-direction: column;
501
+ gap: var(--spacing-xl);
502
+ }
503
+
504
+ .education-item {
505
+ display: grid;
506
+ grid-template-columns: 1fr auto;
507
+ gap: var(--spacing-sm);
508
+ }
509
+
510
+ .education-institution {
511
+ font-weight: 600;
512
+ color: var(--text-primary);
513
+ }
514
+
515
+ .education-degree {
516
+ color: var(--text-secondary);
517
+ }
518
+
519
+ .education-date {
520
+ font-size: 0.875rem;
521
+ color: var(--text-tertiary);
522
+ text-align: right;
523
+ }
524
+
525
+ /* --------------------------------------------
526
+ Footer
527
+ -------------------------------------------- */
528
+ .site-footer {
529
+ max-width: var(--content-width);
530
+ margin: 0 auto;
531
+ padding: var(--spacing-xl) var(--spacing-lg);
532
+ border-top: 1px solid var(--border-color);
533
+ text-align: center;
534
+ }
535
+
536
+ .site-footer p {
537
+ font-size: 0.875rem;
538
+ color: var(--text-tertiary);
539
+ }
540
+
541
+ /* --------------------------------------------
542
+ Responsive
543
+ -------------------------------------------- */
544
+ @media (max-width: 640px) {
545
+ :root {
546
+ --header-height: 56px;
547
+ }
548
+
549
+ .header-content {
550
+ padding: 0 var(--spacing-md);
551
+ }
552
+
553
+ .nav {
554
+ display: none;
555
+ }
556
+
557
+ .main-content {
558
+ padding-left: var(--spacing-md);
559
+ padding-right: var(--spacing-md);
560
+ }
561
+
562
+ .hero-name {
563
+ font-size: 2rem;
564
+ }
565
+
566
+ .experience-item {
567
+ grid-template-columns: 1fr;
568
+ }
569
+
570
+ .experience-date {
571
+ text-align: left;
572
+ order: -1;
573
+ }
574
+
575
+ .projects-grid {
576
+ grid-template-columns: 1fr;
577
+ }
578
+
579
+ .skills-grid {
580
+ grid-template-columns: 1fr;
581
+ }
582
+
583
+ .writing-item {
584
+ flex-direction: column;
585
+ align-items: flex-start;
586
+ gap: var(--spacing-xs);
587
+ }
588
+
589
+ .writing-date {
590
+ margin-left: 0;
591
+ }
592
+
593
+ .education-item {
594
+ grid-template-columns: 1fr;
595
+ }
596
+
597
+ .education-date {
598
+ text-align: left;
599
+ }
600
+ }
601
+
602
+ /* --------------------------------------------
603
+ Multi-Page Styles
604
+ -------------------------------------------- */
605
+
606
+ /* Page Header */
607
+ .page-header {
608
+ margin-bottom: var(--spacing-3xl);
609
+ }
610
+
611
+ .page-header h1 {
612
+ font-size: 2rem;
613
+ margin-bottom: var(--spacing-sm);
614
+ }
615
+
616
+ .page-header p {
617
+ font-size: 1rem;
618
+ color: var(--text-secondary);
619
+ }
620
+
621
+ /* View All Link */
622
+ .view-all-link {
623
+ display: inline-block;
624
+ margin-top: var(--spacing-lg);
625
+ font-size: 0.875rem;
626
+ color: var(--accent-color);
627
+ }
628
+
629
+ .view-all-link:hover {
630
+ color: var(--accent-hover);
631
+ }
632
+
633
+ /* Experiments Grid */
634
+ .experiments-grid {
635
+ display: grid;
636
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
637
+ gap: var(--spacing-lg);
638
+ }
639
+
640
+ .experiment-card {
641
+ background: var(--bg-secondary);
642
+ border-radius: var(--radius-lg);
643
+ padding: var(--spacing-lg);
644
+ }
645
+
646
+ .experiment-card h3 {
647
+ font-size: 1rem;
648
+ margin-bottom: var(--spacing-sm);
649
+ }
650
+
651
+ .experiment-card p {
652
+ font-size: 0.875rem;
653
+ color: var(--text-secondary);
654
+ margin-bottom: var(--spacing-md);
655
+ }
656
+
657
+ .experiment-links {
658
+ display: flex;
659
+ gap: var(--spacing-md);
660
+ font-size: 0.875rem;
661
+ }
662
+
663
+ /* Project Page */
664
+ .project-page .project-page-header {
665
+ margin-bottom: var(--spacing-3xl);
666
+ }
667
+
668
+ .project-page .project-page-header h1 {
669
+ font-size: 2rem;
670
+ margin-bottom: var(--spacing-sm);
671
+ }
672
+
673
+ .project-page .project-page-header .subtitle {
674
+ font-size: 1.125rem;
675
+ color: var(--text-secondary);
676
+ margin-bottom: var(--spacing-xl);
677
+ }
678
+
679
+ .project-page .project-meta {
680
+ display: flex;
681
+ flex-wrap: wrap;
682
+ gap: var(--spacing-xl);
683
+ margin-bottom: var(--spacing-lg);
684
+ padding: var(--spacing-lg) 0;
685
+ border-top: 1px solid var(--border-color);
686
+ border-bottom: 1px solid var(--border-color);
687
+ }
688
+
689
+ .project-page .meta-item {
690
+ display: flex;
691
+ flex-direction: column;
692
+ gap: var(--spacing-xs);
693
+ }
694
+
695
+ .project-page .meta-label {
696
+ font-size: 0.75rem;
697
+ text-transform: uppercase;
698
+ letter-spacing: 0.05em;
699
+ color: var(--text-tertiary);
700
+ }
701
+
702
+ .project-page .meta-value {
703
+ font-size: 0.875rem;
704
+ color: var(--text-primary);
705
+ }
706
+
707
+ .project-page .project-links {
708
+ display: flex;
709
+ flex-wrap: wrap;
710
+ gap: var(--spacing-md);
711
+ margin-top: var(--spacing-lg);
712
+ }
713
+
714
+ .project-link-btn {
715
+ display: inline-block;
716
+ padding: var(--spacing-sm) var(--spacing-md);
717
+ background: var(--bg-secondary);
718
+ border-radius: var(--radius-md);
719
+ font-size: 0.875rem;
720
+ color: var(--text-secondary);
721
+ transition: background var(--transition-fast), color var(--transition-fast);
722
+ }
723
+
724
+ .project-link-btn:hover {
725
+ background: var(--bg-tertiary);
726
+ color: var(--text-primary);
727
+ }
728
+
729
+ .project-meta-inline {
730
+ display: flex;
731
+ gap: var(--spacing-md);
732
+ font-size: 0.75rem;
733
+ color: var(--text-tertiary);
734
+ margin-bottom: var(--spacing-sm);
735
+ }
736
+
737
+ /* Project Content Prose */
738
+ .prose {
739
+ line-height: 1.7;
740
+ }
741
+
742
+ .prose h2 {
743
+ font-size: 1.25rem;
744
+ margin-top: var(--spacing-2xl);
745
+ margin-bottom: var(--spacing-md);
746
+ }
747
+
748
+ .prose h3 {
749
+ font-size: 1rem;
750
+ margin-top: var(--spacing-xl);
751
+ margin-bottom: var(--spacing-sm);
752
+ }
753
+
754
+ .prose p {
755
+ margin-bottom: var(--spacing-md);
756
+ }
757
+
758
+ .prose ul, .prose ol {
759
+ margin-bottom: var(--spacing-md);
760
+ padding-left: var(--spacing-lg);
761
+ }
762
+
763
+ .prose li {
764
+ margin-bottom: var(--spacing-sm);
765
+ }
766
+
767
+ .prose code {
768
+ font-family: var(--font-mono);
769
+ background: var(--bg-secondary);
770
+ padding: 0.125rem 0.375rem;
771
+ border-radius: var(--radius-sm);
772
+ font-size: 0.875em;
773
+ }
774
+
775
+ /* Project Navigation */
776
+ .project-nav {
777
+ padding-top: var(--spacing-xl);
778
+ border-top: 1px solid var(--border-color);
779
+ margin-top: var(--spacing-3xl);
780
+ }
781
+
782
+ .back-link {
783
+ font-size: 0.875rem;
784
+ color: var(--text-secondary);
785
+ }
786
+
787
+ .back-link:hover {
788
+ color: var(--accent-color);
789
+ }
790
+
791
+ /* Writing List Full */
792
+ .writing-item {
793
+ display: flex;
794
+ justify-content: space-between;
795
+ align-items: center;
796
+ padding: var(--spacing-md) 0;
797
+ border-bottom: 1px solid var(--border-color);
798
+ color: var(--text-primary);
799
+ }
800
+
801
+ .writing-item:hover {
802
+ color: var(--accent-color);
803
+ }
804
+
805
+ .writing-item:last-child {
806
+ border-bottom: none;
807
+ }
808
+
809
+ .writing-info {
810
+ display: flex;
811
+ flex-direction: column;
812
+ gap: var(--spacing-xs);
813
+ }
814
+
815
+ .writing-publication {
816
+ font-size: 0.875rem;
817
+ color: var(--text-tertiary);
818
+ }
819
+
820
+ /* Print styles */
821
+ @media print {
822
+ .site-header,
823
+ .theme-toggle {
824
+ display: none !important;
825
+ }
826
+
827
+ .main-content {
828
+ padding-top: 0;
829
+ }
830
+
831
+ body {
832
+ color: black;
833
+ background: white;
834
+ }
835
+ }