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,913 @@
1
+ /* ============================================
2
+ Dark Academia Theme for dev.page
3
+ Scholarly, vintage, warm aesthetic
4
+ ============================================ */
5
+
6
+ /* --------------------------------------------
7
+ Fonts
8
+ -------------------------------------------- */
9
+ @import url('https://fonts.googleapis.com/css2?family=Libre+Baskerville:ital,wght@0,400;0,700;1,400&family=Source+Sans+3:wght@400;600&display=swap');
10
+
11
+ /* --------------------------------------------
12
+ CSS Custom Properties
13
+ -------------------------------------------- */
14
+ :root {
15
+ /* Typography */
16
+ --font-serif: 'Libre Baskerville', Georgia, 'Times New Roman', serif;
17
+ --font-sans: 'Source Sans 3', -apple-system, BlinkMacSystemFont, sans-serif;
18
+
19
+ /* Spacing */
20
+ --spacing-xs: 0.25rem;
21
+ --spacing-sm: 0.5rem;
22
+ --spacing-md: 1rem;
23
+ --spacing-lg: 1.5rem;
24
+ --spacing-xl: 2rem;
25
+ --spacing-2xl: 3rem;
26
+ --spacing-3xl: 4rem;
27
+
28
+ /* Layout */
29
+ --content-width: 720px;
30
+ }
31
+
32
+ /* Dark theme (default) */
33
+ [data-theme="dark"] {
34
+ --bg-primary: #1a1814;
35
+ --bg-secondary: #221f1a;
36
+ --bg-tertiary: #2a2520;
37
+ --bg-accent: #352f28;
38
+ --text-primary: #e8e4dc;
39
+ --text-secondary: #c4bba8;
40
+ --text-tertiary: #8a8070;
41
+ --accent-color: #c9a962;
42
+ --accent-muted: #a08848;
43
+ --border-color: #3d3628;
44
+ --border-light: #4a4238;
45
+ }
46
+
47
+ /* Light theme */
48
+ [data-theme="light"] {
49
+ --bg-primary: #f8f5f0;
50
+ --bg-secondary: #f0ebe2;
51
+ --bg-tertiary: #e8e2d6;
52
+ --bg-accent: #ddd5c6;
53
+ --text-primary: #2c2418;
54
+ --text-secondary: #4a3f30;
55
+ --text-tertiary: #7a6a54;
56
+ --accent-color: #8b6914;
57
+ --accent-muted: #6a5010;
58
+ --border-color: #d4cab8;
59
+ --border-light: #c8bca8;
60
+ }
61
+
62
+ /* --------------------------------------------
63
+ Reset & Base
64
+ -------------------------------------------- */
65
+ *, *::before, *::after {
66
+ box-sizing: border-box;
67
+ margin: 0;
68
+ padding: 0;
69
+ }
70
+
71
+ html {
72
+ font-size: 17px;
73
+ scroll-behavior: smooth;
74
+ }
75
+
76
+ body {
77
+ font-family: var(--font-serif);
78
+ font-size: 1rem;
79
+ line-height: 1.75;
80
+ color: var(--text-primary);
81
+ background: var(--bg-primary);
82
+ -webkit-font-smoothing: antialiased;
83
+ }
84
+
85
+ /* --------------------------------------------
86
+ Typography
87
+ -------------------------------------------- */
88
+ h1, h2, h3 {
89
+ font-family: var(--font-serif);
90
+ font-weight: 400;
91
+ line-height: 1.3;
92
+ }
93
+
94
+ h1 { font-size: 2.25rem; }
95
+ h2 { font-size: 1.1rem; font-weight: 700; }
96
+ h3 { font-size: 1rem; }
97
+
98
+ p {
99
+ margin-bottom: var(--spacing-md);
100
+ }
101
+
102
+ a {
103
+ color: var(--accent-color);
104
+ text-decoration: none;
105
+ transition: color 0.2s ease;
106
+ }
107
+
108
+ a:hover {
109
+ color: var(--text-primary);
110
+ }
111
+
112
+ /* --------------------------------------------
113
+ Navigation
114
+ -------------------------------------------- */
115
+ .site-nav {
116
+ position: fixed;
117
+ top: 0;
118
+ left: 0;
119
+ right: 0;
120
+ background: var(--bg-primary);
121
+ border-bottom: 1px solid var(--border-color);
122
+ z-index: 100;
123
+ }
124
+
125
+ .nav-content {
126
+ width: 100%;
127
+ padding: var(--spacing-sm) var(--spacing-xl);
128
+ display: flex;
129
+ align-items: center;
130
+ justify-content: space-between;
131
+ position: relative;
132
+ }
133
+
134
+ .nav-links {
135
+ position: absolute;
136
+ left: 50%;
137
+ transform: translateX(-50%);
138
+ display: flex;
139
+ gap: var(--spacing-xl);
140
+ }
141
+
142
+ .nav-links a {
143
+ font-family: var(--font-sans);
144
+ font-size: 0.75rem;
145
+ font-weight: 600;
146
+ text-transform: uppercase;
147
+ letter-spacing: 0.12em;
148
+ color: var(--text-tertiary);
149
+ }
150
+
151
+ .nav-links a:hover {
152
+ color: var(--accent-color);
153
+ }
154
+
155
+ .nav-links a.active {
156
+ color: var(--accent-color);
157
+ border-bottom: 1px solid var(--accent-color);
158
+ padding-bottom: 2px;
159
+ }
160
+
161
+ /* --------------------------------------------
162
+ Page Content
163
+ -------------------------------------------- */
164
+ .page-content {
165
+ max-width: var(--content-width);
166
+ margin: 0 auto;
167
+ padding: calc(60px + var(--spacing-3xl)) var(--spacing-lg) var(--spacing-3xl);
168
+ }
169
+
170
+ /* --------------------------------------------
171
+ Hero Section
172
+ -------------------------------------------- */
173
+ .hero {
174
+ margin-bottom: var(--spacing-3xl);
175
+ padding-bottom: var(--spacing-2xl);
176
+ border-bottom: 1px solid var(--border-color);
177
+ }
178
+
179
+ .hero-name {
180
+ font-size: 2.5rem;
181
+ font-weight: 400;
182
+ font-style: italic;
183
+ margin-bottom: var(--spacing-xs);
184
+ color: var(--text-primary);
185
+ letter-spacing: -0.01em;
186
+ }
187
+
188
+ .hero-title {
189
+ font-family: var(--font-sans);
190
+ font-size: 0.85rem;
191
+ font-weight: 600;
192
+ text-transform: uppercase;
193
+ letter-spacing: 0.15em;
194
+ color: var(--text-tertiary);
195
+ margin-bottom: var(--spacing-sm);
196
+ }
197
+
198
+ .hero-location {
199
+ font-size: 0.95rem;
200
+ color: var(--text-tertiary);
201
+ margin-bottom: var(--spacing-lg);
202
+ }
203
+
204
+ .hero-links {
205
+ display: flex;
206
+ flex-wrap: wrap;
207
+ gap: var(--spacing-sm) var(--spacing-lg);
208
+ margin-bottom: var(--spacing-xl);
209
+ }
210
+
211
+ .hero-link {
212
+ font-family: var(--font-sans);
213
+ font-size: 0.8rem;
214
+ font-weight: 600;
215
+ color: var(--text-secondary);
216
+ text-decoration: underline;
217
+ text-underline-offset: 3px;
218
+ }
219
+
220
+ .hero-link:hover {
221
+ color: var(--accent-color);
222
+ }
223
+
224
+ .hero-bio {
225
+ font-size: 1.05rem;
226
+ line-height: 1.8;
227
+ color: var(--text-secondary);
228
+ white-space: pre-wrap;
229
+ max-width: 580px;
230
+ }
231
+
232
+ /* --------------------------------------------
233
+ Section Styles
234
+ -------------------------------------------- */
235
+ .section {
236
+ margin-bottom: var(--spacing-3xl);
237
+ }
238
+
239
+ .section-title {
240
+ font-family: var(--font-sans);
241
+ font-size: 0.7rem;
242
+ font-weight: 600;
243
+ text-transform: uppercase;
244
+ letter-spacing: 0.2em;
245
+ color: var(--text-tertiary);
246
+ margin-bottom: var(--spacing-lg);
247
+ padding-bottom: var(--spacing-sm);
248
+ border-bottom: 2px solid var(--border-color);
249
+ }
250
+
251
+ /* --------------------------------------------
252
+ Experience
253
+ -------------------------------------------- */
254
+ .experience-list {
255
+ display: flex;
256
+ flex-direction: column;
257
+ gap: var(--spacing-xl);
258
+ }
259
+
260
+ .experience-item {
261
+ display: grid;
262
+ grid-template-columns: 140px 1fr;
263
+ gap: var(--spacing-lg);
264
+ }
265
+
266
+ .experience-date {
267
+ font-family: var(--font-sans);
268
+ font-size: 0.8rem;
269
+ color: var(--text-tertiary);
270
+ padding-top: 4px;
271
+ }
272
+
273
+ .experience-details {
274
+ flex: 1;
275
+ }
276
+
277
+ .experience-header {
278
+ margin-bottom: var(--spacing-sm);
279
+ }
280
+
281
+ .experience-company {
282
+ font-weight: 700;
283
+ color: var(--text-primary);
284
+ }
285
+
286
+ .experience-role {
287
+ font-style: italic;
288
+ color: var(--text-secondary);
289
+ }
290
+
291
+ .experience-highlights {
292
+ list-style: none;
293
+ padding: 0;
294
+ }
295
+
296
+ .experience-highlights li {
297
+ position: relative;
298
+ padding-left: var(--spacing-md);
299
+ margin-bottom: var(--spacing-xs);
300
+ color: var(--text-secondary);
301
+ font-size: 0.95rem;
302
+ }
303
+
304
+ .experience-highlights li::before {
305
+ content: '·';
306
+ position: absolute;
307
+ left: 0;
308
+ color: var(--accent-color);
309
+ font-weight: bold;
310
+ }
311
+
312
+ /* --------------------------------------------
313
+ Projects
314
+ -------------------------------------------- */
315
+ .projects-list {
316
+ display: flex;
317
+ flex-direction: column;
318
+ gap: var(--spacing-lg);
319
+ }
320
+
321
+ .project-item {
322
+ padding: var(--spacing-lg);
323
+ background: var(--bg-secondary);
324
+ border: 1px solid var(--border-color);
325
+ }
326
+
327
+ .project-item.featured {
328
+ background: var(--bg-tertiary);
329
+ border-color: var(--accent-muted);
330
+ }
331
+
332
+ .project-header {
333
+ display: flex;
334
+ justify-content: space-between;
335
+ align-items: baseline;
336
+ margin-bottom: var(--spacing-sm);
337
+ }
338
+
339
+ .project-name {
340
+ font-size: 1rem;
341
+ font-weight: 700;
342
+ font-style: italic;
343
+ }
344
+
345
+ .project-link {
346
+ font-family: var(--font-sans);
347
+ font-size: 0.7rem;
348
+ text-transform: uppercase;
349
+ letter-spacing: 0.1em;
350
+ color: var(--accent-color);
351
+ }
352
+
353
+ .project-description {
354
+ color: var(--text-secondary);
355
+ margin-bottom: var(--spacing-md);
356
+ font-size: 0.9rem;
357
+ }
358
+
359
+ .project-tags {
360
+ display: flex;
361
+ flex-wrap: wrap;
362
+ gap: var(--spacing-xs);
363
+ }
364
+
365
+ .project-tag,
366
+ .tag {
367
+ font-family: var(--font-sans);
368
+ font-size: 0.65rem;
369
+ text-transform: uppercase;
370
+ letter-spacing: 0.05em;
371
+ padding: 4px var(--spacing-sm);
372
+ background: var(--bg-accent);
373
+ color: var(--text-tertiary);
374
+ border: 1px solid var(--border-color);
375
+ }
376
+
377
+ /* --------------------------------------------
378
+ Skills
379
+ -------------------------------------------- */
380
+ .skills-table {
381
+ width: 100%;
382
+ border-collapse: collapse;
383
+ }
384
+
385
+ .skills-table tr {
386
+ border-bottom: 1px solid var(--border-color);
387
+ }
388
+
389
+ .skills-table tr:last-child {
390
+ border-bottom: none;
391
+ }
392
+
393
+ .skills-table td {
394
+ padding: var(--spacing-sm) 0;
395
+ vertical-align: baseline;
396
+ }
397
+
398
+ .skills-table td:first-child {
399
+ font-family: var(--font-sans);
400
+ font-size: 0.75rem;
401
+ font-weight: 600;
402
+ text-transform: uppercase;
403
+ letter-spacing: 0.1em;
404
+ color: var(--text-tertiary);
405
+ width: 140px;
406
+ padding-right: var(--spacing-md);
407
+ }
408
+
409
+ .skills-table td:last-child {
410
+ color: var(--text-secondary);
411
+ font-size: 0.95rem;
412
+ }
413
+
414
+ /* --------------------------------------------
415
+ Writing / Publications
416
+ -------------------------------------------- */
417
+ .writing-list {
418
+ display: flex;
419
+ flex-direction: column;
420
+ gap: var(--spacing-md);
421
+ }
422
+
423
+ .writing-item {
424
+ display: grid;
425
+ grid-template-columns: 100px 1fr;
426
+ gap: var(--spacing-md);
427
+ padding-bottom: var(--spacing-md);
428
+ border-bottom: 1px solid var(--border-color);
429
+ }
430
+
431
+ .writing-item:last-child {
432
+ border-bottom: none;
433
+ padding-bottom: 0;
434
+ }
435
+
436
+ .writing-date {
437
+ font-family: var(--font-sans);
438
+ font-size: 0.8rem;
439
+ color: var(--text-tertiary);
440
+ }
441
+
442
+ .writing-content {
443
+ flex: 1;
444
+ }
445
+
446
+ .writing-title {
447
+ font-weight: 400;
448
+ font-style: italic;
449
+ font-size: 1rem;
450
+ color: var(--text-primary);
451
+ display: block;
452
+ margin-bottom: var(--spacing-xs);
453
+ }
454
+
455
+ .writing-title:hover {
456
+ color: var(--accent-color);
457
+ }
458
+
459
+ .writing-publication {
460
+ font-family: var(--font-sans);
461
+ font-size: 0.8rem;
462
+ color: var(--text-tertiary);
463
+ }
464
+
465
+ .writing-description {
466
+ font-size: 0.9rem;
467
+ color: var(--text-secondary);
468
+ margin-top: var(--spacing-xs);
469
+ }
470
+
471
+ /* --------------------------------------------
472
+ Education
473
+ -------------------------------------------- */
474
+ .education-list {
475
+ display: flex;
476
+ flex-direction: column;
477
+ gap: var(--spacing-lg);
478
+ }
479
+
480
+ .education-item {
481
+ display: grid;
482
+ grid-template-columns: 140px 1fr;
483
+ gap: var(--spacing-lg);
484
+ }
485
+
486
+ .education-date {
487
+ font-family: var(--font-sans);
488
+ font-size: 0.8rem;
489
+ color: var(--text-tertiary);
490
+ padding-top: 4px;
491
+ }
492
+
493
+ .education-details {
494
+ flex: 1;
495
+ }
496
+
497
+ .education-institution {
498
+ font-weight: 700;
499
+ color: var(--text-primary);
500
+ margin-bottom: var(--spacing-xs);
501
+ }
502
+
503
+ .education-degree {
504
+ font-style: italic;
505
+ color: var(--text-secondary);
506
+ }
507
+
508
+ .education-description {
509
+ font-size: 0.9rem;
510
+ color: var(--text-tertiary);
511
+ margin-top: var(--spacing-xs);
512
+ }
513
+
514
+ /* --------------------------------------------
515
+ Footer
516
+ -------------------------------------------- */
517
+ .site-footer {
518
+ max-width: var(--content-width);
519
+ margin: 0 auto;
520
+ padding: var(--spacing-2xl) var(--spacing-lg);
521
+ border-top: 1px solid var(--border-color);
522
+ }
523
+
524
+ .site-footer p {
525
+ font-family: var(--font-sans);
526
+ font-size: 0.8rem;
527
+ color: var(--text-tertiary);
528
+ }
529
+
530
+ /* --------------------------------------------
531
+ Responsive
532
+ -------------------------------------------- */
533
+ @media (max-width: 640px) {
534
+ html {
535
+ font-size: 16px;
536
+ }
537
+
538
+ .nav-links {
539
+ gap: var(--spacing-md);
540
+ }
541
+
542
+ .nav-links a {
543
+ font-size: 0.65rem;
544
+ }
545
+
546
+ .page-content {
547
+ padding-left: var(--spacing-md);
548
+ padding-right: var(--spacing-md);
549
+ }
550
+
551
+ .hero-name {
552
+ font-size: 2rem;
553
+ }
554
+
555
+ .experience-item,
556
+ .education-item,
557
+ .writing-item {
558
+ grid-template-columns: 1fr;
559
+ gap: var(--spacing-xs);
560
+ }
561
+
562
+ .experience-date,
563
+ .education-date,
564
+ .writing-date {
565
+ margin-bottom: var(--spacing-xs);
566
+ }
567
+
568
+ .skills-table td:first-child {
569
+ width: 100px;
570
+ }
571
+ }
572
+
573
+ /* --------------------------------------------
574
+ Multi-Page Styles
575
+ -------------------------------------------- */
576
+
577
+ /* Navigation Logo */
578
+ .nav-logo {
579
+ font-family: var(--font-serif);
580
+ font-size: 1rem;
581
+ color: var(--text-primary);
582
+ text-decoration: none;
583
+ }
584
+
585
+ .nav-logo:hover {
586
+ color: var(--accent-color);
587
+ }
588
+
589
+ /* Theme Toggle Button */
590
+ .theme-btn {
591
+ display: flex;
592
+ align-items: center;
593
+ justify-content: center;
594
+ width: 36px;
595
+ height: 36px;
596
+ border: 1px solid var(--border-color);
597
+ background: transparent;
598
+ color: var(--text-secondary);
599
+ cursor: pointer;
600
+ border-radius: 4px;
601
+ transition: all 0.2s ease;
602
+ }
603
+
604
+ .theme-btn:hover {
605
+ background: var(--bg-accent);
606
+ color: var(--accent-color);
607
+ border-color: var(--accent-muted);
608
+ }
609
+
610
+ /* Show sun icon in dark mode (to switch to light) */
611
+ [data-theme="dark"] .icon-moon { display: none; }
612
+ [data-theme="dark"] .icon-sun { display: block; }
613
+
614
+ /* Show moon icon in light mode (to switch to dark) */
615
+ [data-theme="light"] .icon-sun { display: none; }
616
+ [data-theme="light"] .icon-moon { display: block; }
617
+
618
+ /* Page Header */
619
+ .page-header {
620
+ text-align: center;
621
+ margin-bottom: var(--spacing-3xl);
622
+ }
623
+
624
+ .page-header h1 {
625
+ font-size: 2rem;
626
+ margin-bottom: var(--spacing-sm);
627
+ }
628
+
629
+ .page-header p {
630
+ font-style: italic;
631
+ color: var(--text-secondary);
632
+ }
633
+
634
+ .header-ornament {
635
+ width: 60px;
636
+ height: 2px;
637
+ background: var(--accent-color);
638
+ margin: var(--spacing-lg) auto;
639
+ }
640
+
641
+ /* View All Link */
642
+ .view-all {
643
+ display: inline-block;
644
+ margin-top: var(--spacing-xl);
645
+ font-family: var(--font-sans);
646
+ font-size: 0.8rem;
647
+ text-transform: uppercase;
648
+ letter-spacing: 0.1em;
649
+ color: var(--accent-color);
650
+ }
651
+
652
+ .view-all:hover {
653
+ color: var(--text-primary);
654
+ }
655
+
656
+ /* Projects List (Multi-page) */
657
+ .projects-list {
658
+ display: flex;
659
+ flex-direction: column;
660
+ gap: var(--spacing-lg);
661
+ }
662
+
663
+ .project-item {
664
+ display: block;
665
+ padding: var(--spacing-lg);
666
+ border: 1px solid var(--border-color);
667
+ background: var(--bg-secondary);
668
+ transition: border-color 0.2s ease, background 0.2s ease;
669
+ }
670
+
671
+ .project-item:hover {
672
+ border-color: var(--accent-color);
673
+ background: var(--bg-tertiary);
674
+ }
675
+
676
+ .project-item.featured {
677
+ border-color: var(--accent-color);
678
+ }
679
+
680
+ .project-item .project-name {
681
+ font-size: 1.1rem;
682
+ font-weight: 400;
683
+ margin-bottom: var(--spacing-xs);
684
+ }
685
+
686
+ .project-item .project-description {
687
+ font-size: 0.9rem;
688
+ font-style: italic;
689
+ color: var(--text-secondary);
690
+ margin-bottom: var(--spacing-sm);
691
+ }
692
+
693
+ .project-meta-inline {
694
+ font-family: var(--font-sans);
695
+ font-size: 0.75rem;
696
+ color: var(--text-tertiary);
697
+ margin-bottom: var(--spacing-sm);
698
+ }
699
+
700
+ /* Experiments List */
701
+ .experiments-list {
702
+ display: flex;
703
+ flex-direction: column;
704
+ gap: var(--spacing-lg);
705
+ }
706
+
707
+ .experiment-item {
708
+ padding: var(--spacing-lg);
709
+ border: 1px solid var(--border-color);
710
+ background: var(--bg-secondary);
711
+ }
712
+
713
+ .experiment-item h3 {
714
+ font-size: 1rem;
715
+ margin-bottom: var(--spacing-xs);
716
+ }
717
+
718
+ .experiment-item p {
719
+ font-size: 0.9rem;
720
+ font-style: italic;
721
+ color: var(--text-secondary);
722
+ margin-bottom: var(--spacing-sm);
723
+ }
724
+
725
+ .experiment-links {
726
+ font-family: var(--font-sans);
727
+ font-size: 0.75rem;
728
+ text-transform: uppercase;
729
+ letter-spacing: 0.1em;
730
+ display: flex;
731
+ gap: var(--spacing-md);
732
+ }
733
+
734
+ /* Project Page */
735
+ .project-page .project-header {
736
+ display: block;
737
+ text-align: center;
738
+ margin-bottom: var(--spacing-3xl);
739
+ }
740
+
741
+ .project-page .project-header h1 {
742
+ font-size: 2rem;
743
+ margin-bottom: var(--spacing-sm);
744
+ }
745
+
746
+ .project-page .project-header .subtitle {
747
+ font-style: italic;
748
+ color: var(--text-secondary);
749
+ margin-bottom: var(--spacing-xl);
750
+ }
751
+
752
+ .project-page .project-meta {
753
+ display: flex;
754
+ justify-content: center;
755
+ flex-wrap: wrap;
756
+ gap: var(--spacing-xl);
757
+ margin-bottom: var(--spacing-lg);
758
+ padding: var(--spacing-lg) 0;
759
+ border-top: 1px solid var(--border-color);
760
+ border-bottom: 1px solid var(--border-color);
761
+ }
762
+
763
+ .project-page .meta-item {
764
+ text-align: center;
765
+ }
766
+
767
+ .project-page .meta-label {
768
+ display: block;
769
+ font-family: var(--font-sans);
770
+ font-size: 0.7rem;
771
+ text-transform: uppercase;
772
+ letter-spacing: 0.1em;
773
+ color: var(--text-tertiary);
774
+ margin-bottom: var(--spacing-xs);
775
+ }
776
+
777
+ .project-page .meta-value {
778
+ font-size: 0.9rem;
779
+ }
780
+
781
+ .project-page .project-tags {
782
+ display: flex;
783
+ justify-content: center;
784
+ flex-wrap: wrap;
785
+ gap: var(--spacing-sm);
786
+ margin-top: var(--spacing-lg);
787
+ }
788
+
789
+ .project-page .project-links {
790
+ display: flex;
791
+ justify-content: center;
792
+ flex-wrap: wrap;
793
+ gap: var(--spacing-md);
794
+ margin-top: var(--spacing-lg);
795
+ }
796
+
797
+ .project-page .project-link {
798
+ font-family: var(--font-sans);
799
+ font-size: 0.75rem;
800
+ text-transform: uppercase;
801
+ letter-spacing: 0.1em;
802
+ padding: var(--spacing-sm) var(--spacing-md);
803
+ border: 1px solid var(--border-color);
804
+ color: var(--text-secondary);
805
+ transition: border-color 0.2s ease, color 0.2s ease;
806
+ }
807
+
808
+ .project-page .project-link:hover {
809
+ border-color: var(--accent-color);
810
+ color: var(--accent-color);
811
+ }
812
+
813
+ /* Prose Content */
814
+ .prose {
815
+ line-height: 1.8;
816
+ }
817
+
818
+ .prose h2 {
819
+ font-size: 1.25rem;
820
+ margin-top: var(--spacing-2xl);
821
+ margin-bottom: var(--spacing-md);
822
+ }
823
+
824
+ .prose h3 {
825
+ font-size: 1rem;
826
+ margin-top: var(--spacing-xl);
827
+ margin-bottom: var(--spacing-sm);
828
+ }
829
+
830
+ .prose p {
831
+ margin-bottom: var(--spacing-md);
832
+ }
833
+
834
+ .prose ul, .prose ol {
835
+ margin-bottom: var(--spacing-md);
836
+ padding-left: var(--spacing-lg);
837
+ }
838
+
839
+ .prose li {
840
+ margin-bottom: var(--spacing-sm);
841
+ }
842
+
843
+ .prose code {
844
+ font-family: var(--font-sans);
845
+ background: var(--bg-tertiary);
846
+ padding: 0.125rem 0.375rem;
847
+ font-size: 0.875em;
848
+ }
849
+
850
+ /* Project Navigation */
851
+ .project-nav {
852
+ text-align: center;
853
+ padding-top: var(--spacing-xl);
854
+ margin-top: var(--spacing-3xl);
855
+ }
856
+
857
+ .nav-ornament {
858
+ width: 40px;
859
+ height: 1px;
860
+ background: var(--border-color);
861
+ margin: 0 auto var(--spacing-lg);
862
+ }
863
+
864
+ .back-link {
865
+ font-family: var(--font-sans);
866
+ font-size: 0.8rem;
867
+ text-transform: uppercase;
868
+ letter-spacing: 0.1em;
869
+ color: var(--text-tertiary);
870
+ }
871
+
872
+ .back-link:hover {
873
+ color: var(--accent-color);
874
+ }
875
+
876
+ /* Writing List Full */
877
+ .writing-list a.writing-item {
878
+ display: flex;
879
+ justify-content: space-between;
880
+ align-items: center;
881
+ padding: var(--spacing-md) 0;
882
+ border-bottom: 1px solid var(--border-color);
883
+ }
884
+
885
+ .writing-list a.writing-item:hover {
886
+ color: var(--accent-color);
887
+ }
888
+
889
+ .writing-list a.writing-item:last-child {
890
+ border-bottom: none;
891
+ }
892
+
893
+ .writing-info {
894
+ display: flex;
895
+ flex-direction: column;
896
+ gap: var(--spacing-xs);
897
+ }
898
+
899
+ /* Print styles */
900
+ @media print {
901
+ .site-nav {
902
+ display: none !important;
903
+ }
904
+
905
+ .page-content {
906
+ padding-top: 0;
907
+ }
908
+
909
+ body {
910
+ color: black;
911
+ background: white;
912
+ }
913
+ }