heyiam 0.2.29 → 0.3.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 (177) hide show
  1. package/README.md +45 -0
  2. package/dist/config.js +10 -1
  3. package/dist/db.js +1 -2
  4. package/dist/export.js +40 -25
  5. package/dist/format-utils.js +5 -0
  6. package/dist/index.js +168 -0
  7. package/dist/mount.js +300 -102
  8. package/dist/parsers/claude.js +2 -28
  9. package/dist/parsers/codex.js +2 -26
  10. package/dist/parsers/cursor.js +2 -26
  11. package/dist/parsers/duration.js +35 -0
  12. package/dist/parsers/gemini.js +2 -20
  13. package/dist/parsers/types.js +0 -1
  14. package/dist/public/assets/index-BZ65TU_Y.js +40 -0
  15. package/dist/public/assets/index-CqCaW2cb.css +1 -0
  16. package/dist/public/index.html +2 -2
  17. package/dist/redact.js +4 -104
  18. package/dist/render/build-render-data.js +9 -2
  19. package/dist/render/index.js +32 -5
  20. package/dist/render/liquid.js +147 -7
  21. package/dist/render/mock-data.js +303 -0
  22. package/dist/render/templates/aurora/portfolio.liquid +204 -0
  23. package/dist/render/templates/aurora/project.liquid +260 -0
  24. package/dist/render/templates/aurora/session.liquid +223 -0
  25. package/dist/render/templates/aurora/styles.css +1178 -0
  26. package/dist/render/templates/bauhaus/portfolio.liquid +179 -0
  27. package/dist/render/templates/bauhaus/project.liquid +300 -0
  28. package/dist/render/templates/bauhaus/session.liquid +333 -0
  29. package/dist/render/templates/bauhaus/styles.css +1641 -0
  30. package/dist/render/templates/blueprint/portfolio.liquid +167 -0
  31. package/dist/render/templates/blueprint/project.liquid +286 -0
  32. package/dist/render/templates/blueprint/session.liquid +248 -0
  33. package/dist/render/templates/blueprint/styles.css +1285 -0
  34. package/dist/render/templates/canvas/portfolio.liquid +215 -0
  35. package/dist/render/templates/canvas/project.liquid +235 -0
  36. package/dist/render/templates/canvas/session.liquid +223 -0
  37. package/dist/render/templates/canvas/styles.css +1436 -0
  38. package/dist/render/templates/carbon/portfolio.liquid +170 -0
  39. package/dist/render/templates/carbon/project.liquid +249 -0
  40. package/dist/render/templates/carbon/session.liquid +190 -0
  41. package/dist/render/templates/carbon/styles.css +1091 -0
  42. package/dist/render/templates/chalk/portfolio.liquid +199 -0
  43. package/dist/render/templates/chalk/project.liquid +245 -0
  44. package/dist/render/templates/chalk/session.liquid +215 -0
  45. package/dist/render/templates/chalk/styles.css +1157 -0
  46. package/dist/render/templates/circuit/portfolio.liquid +162 -0
  47. package/dist/render/templates/circuit/project.liquid +247 -0
  48. package/dist/render/templates/circuit/session.liquid +205 -0
  49. package/dist/render/templates/circuit/styles.css +1403 -0
  50. package/dist/render/templates/cosmos/portfolio.liquid +232 -0
  51. package/dist/render/templates/cosmos/project.liquid +327 -0
  52. package/dist/render/templates/cosmos/session.liquid +239 -0
  53. package/dist/render/templates/cosmos/styles.css +1151 -0
  54. package/dist/render/templates/daylight/portfolio.liquid +217 -0
  55. package/dist/render/templates/daylight/project.liquid +229 -0
  56. package/dist/render/templates/daylight/session.liquid +219 -0
  57. package/dist/render/templates/daylight/styles.css +1311 -0
  58. package/dist/render/templates/editorial/portfolio.liquid +126 -0
  59. package/dist/render/templates/editorial/project.liquid +202 -0
  60. package/dist/render/templates/editorial/session.liquid +171 -0
  61. package/dist/render/templates/editorial/styles.css +822 -0
  62. package/dist/render/templates/ember/portfolio.liquid +318 -0
  63. package/dist/render/templates/ember/project.liquid +232 -0
  64. package/dist/render/templates/ember/session.liquid +202 -0
  65. package/dist/render/templates/ember/styles.css +1283 -0
  66. package/dist/render/templates/glacier/portfolio.liquid +271 -0
  67. package/dist/render/templates/glacier/project.liquid +288 -0
  68. package/dist/render/templates/glacier/session.liquid +217 -0
  69. package/dist/render/templates/glacier/styles.css +1200 -0
  70. package/dist/render/templates/grid/portfolio.liquid +265 -0
  71. package/dist/render/templates/grid/project.liquid +306 -0
  72. package/dist/render/templates/grid/session.liquid +260 -0
  73. package/dist/render/templates/grid/styles.css +1441 -0
  74. package/dist/render/templates/kinetic/portfolio.liquid +170 -0
  75. package/dist/render/templates/kinetic/project.liquid +242 -0
  76. package/dist/render/templates/kinetic/session.liquid +228 -0
  77. package/dist/render/templates/kinetic/styles.css +944 -0
  78. package/dist/render/templates/meridian/portfolio.liquid +255 -0
  79. package/dist/render/templates/meridian/project.liquid +376 -0
  80. package/dist/render/templates/meridian/session.liquid +298 -0
  81. package/dist/render/templates/meridian/styles.css +1369 -0
  82. package/dist/render/templates/minimal/portfolio.liquid +71 -0
  83. package/dist/render/templates/minimal/project.liquid +154 -0
  84. package/dist/render/templates/minimal/session.liquid +140 -0
  85. package/dist/render/templates/minimal/styles.css +525 -0
  86. package/dist/render/templates/mono/portfolio.liquid +291 -0
  87. package/dist/render/templates/mono/project.liquid +275 -0
  88. package/dist/render/templates/mono/session.liquid +276 -0
  89. package/dist/render/templates/mono/styles.css +1016 -0
  90. package/dist/render/templates/neon/portfolio.liquid +217 -0
  91. package/dist/render/templates/neon/project.liquid +225 -0
  92. package/dist/render/templates/neon/session.liquid +195 -0
  93. package/dist/render/templates/neon/styles.css +1265 -0
  94. package/dist/render/templates/noir/portfolio.liquid +137 -0
  95. package/dist/render/templates/noir/project.liquid +220 -0
  96. package/dist/render/templates/noir/session.liquid +241 -0
  97. package/dist/render/templates/noir/styles.css +1223 -0
  98. package/dist/render/templates/obsidian/portfolio.liquid +257 -0
  99. package/dist/render/templates/obsidian/project.liquid +280 -0
  100. package/dist/render/templates/obsidian/session.liquid +241 -0
  101. package/dist/render/templates/obsidian/styles.css +1401 -0
  102. package/dist/render/templates/paper/portfolio.liquid +267 -0
  103. package/dist/render/templates/paper/project.liquid +235 -0
  104. package/dist/render/templates/paper/session.liquid +271 -0
  105. package/dist/render/templates/paper/styles.css +1509 -0
  106. package/dist/render/templates/parallax/portfolio.liquid +305 -0
  107. package/dist/render/templates/parallax/project.liquid +275 -0
  108. package/dist/render/templates/parallax/session.liquid +295 -0
  109. package/dist/render/templates/parallax/styles.css +1874 -0
  110. package/dist/render/templates/parchment/portfolio.liquid +290 -0
  111. package/dist/render/templates/parchment/project.liquid +289 -0
  112. package/dist/render/templates/parchment/session.liquid +346 -0
  113. package/dist/render/templates/parchment/styles.css +1397 -0
  114. package/dist/render/templates/partials/_beats.liquid +16 -0
  115. package/dist/render/templates/partials/_breadcrumb.liquid +9 -0
  116. package/dist/render/templates/partials/_footer.liquid +7 -0
  117. package/dist/render/templates/partials/_growth-chart.liquid +7 -0
  118. package/dist/render/templates/partials/_key-decisions.liquid +20 -0
  119. package/dist/render/templates/partials/_links.liquid +16 -0
  120. package/dist/render/templates/partials/_narrative.liquid +8 -0
  121. package/dist/render/templates/partials/_phases.liquid +20 -0
  122. package/dist/render/templates/partials/_portfolio-header.liquid +20 -0
  123. package/dist/render/templates/partials/_portfolio-projects.liquid +16 -0
  124. package/dist/render/templates/partials/_portfolio-stats.liquid +19 -0
  125. package/dist/render/templates/partials/_qa.liquid +13 -0
  126. package/dist/render/templates/partials/_screenshot.liquid +15 -0
  127. package/dist/render/templates/partials/_session-cards.liquid +30 -0
  128. package/dist/render/templates/partials/_session-header.liquid +39 -0
  129. package/dist/render/templates/partials/_session-sidebar.liquid +30 -0
  130. package/dist/render/templates/partials/_skills.liquid +12 -0
  131. package/dist/render/templates/partials/_source-breakdown.liquid +22 -0
  132. package/dist/render/templates/partials/_stats.liquid +38 -0
  133. package/dist/render/templates/partials/_work-timeline.liquid +7 -0
  134. package/dist/render/templates/project.liquid +7 -4
  135. package/dist/render/templates/radar/portfolio.liquid +233 -0
  136. package/dist/render/templates/radar/project.liquid +278 -0
  137. package/dist/render/templates/radar/session.liquid +300 -0
  138. package/dist/render/templates/radar/styles.css +1049 -0
  139. package/dist/render/templates/showcase/portfolio.liquid +231 -0
  140. package/dist/render/templates/showcase/project.liquid +237 -0
  141. package/dist/render/templates/showcase/session.liquid +210 -0
  142. package/dist/render/templates/showcase/styles.css +1279 -0
  143. package/dist/render/templates/signal/portfolio.liquid +227 -0
  144. package/dist/render/templates/signal/project.liquid +278 -0
  145. package/dist/render/templates/signal/session.liquid +282 -0
  146. package/dist/render/templates/signal/styles.css +1395 -0
  147. package/dist/render/templates/strata/portfolio.liquid +192 -0
  148. package/dist/render/templates/strata/project.liquid +282 -0
  149. package/dist/render/templates/strata/session.liquid +261 -0
  150. package/dist/render/templates/strata/styles.css +1350 -0
  151. package/dist/render/templates/styles.css +1190 -0
  152. package/dist/render/templates/terminal/portfolio.liquid +118 -0
  153. package/dist/render/templates/terminal/project.liquid +161 -0
  154. package/dist/render/templates/terminal/session.liquid +145 -0
  155. package/dist/render/templates/terminal/styles.css +492 -0
  156. package/dist/render/templates/verdant/portfolio.liquid +333 -0
  157. package/dist/render/templates/verdant/project.liquid +309 -0
  158. package/dist/render/templates/verdant/session.liquid +237 -0
  159. package/dist/render/templates/verdant/styles.css +1257 -0
  160. package/dist/render/templates/zen/portfolio.liquid +136 -0
  161. package/dist/render/templates/zen/project.liquid +187 -0
  162. package/dist/render/templates/zen/session.liquid +203 -0
  163. package/dist/render/templates/zen/styles.css +1207 -0
  164. package/dist/render/templates.js +90 -0
  165. package/dist/routes/context.js +15 -10
  166. package/dist/routes/enhance.js +17 -40
  167. package/dist/routes/export.js +14 -4
  168. package/dist/routes/preview.js +480 -108
  169. package/dist/routes/projects.js +11 -19
  170. package/dist/routes/publish.js +15 -17
  171. package/dist/routes/settings.js +94 -1
  172. package/dist/routes/sse.js +9 -0
  173. package/dist/server.js +8 -2
  174. package/dist/settings.js +17 -9
  175. package/package.json +2 -4
  176. package/dist/public/assets/index-CC9G8EF1.js +0 -21
  177. package/dist/public/assets/index-Dalqz2mC.css +0 -1
@@ -0,0 +1,1207 @@
1
+ /* ────────────────────────────────────────────────
2
+ ZEN TEMPLATE
3
+ Japanese minimalism. Maximum whitespace.
4
+ The absence of decoration IS the design.
5
+ Just typography and horizontal rules.
6
+ ──────────────────────────────────────────────── */
7
+
8
+ /* ── Zen Design Tokens ── */
9
+ :root {
10
+ /* Palette — stone family, intentionally muted */
11
+ --zen-bg: #fafaf9;
12
+ --zen-text: #1c1917;
13
+ --zen-text-secondary: #78716c;
14
+ --zen-text-tertiary: #a8a29e;
15
+ --zen-accent: #78716c;
16
+ --zen-accent-hover: #57534e;
17
+ --zen-rule: #d6d3d1;
18
+ --zen-selection-bg: #d6d3d1;
19
+ --zen-selection-text: #1c1917;
20
+
21
+ /* Typography — elegant serif, clean sans, honest mono */
22
+ --zen-font-display: 'Cormorant Garamond', 'Noto Serif JP', Georgia, serif;
23
+ --zen-font-body: 'Inter', system-ui, sans-serif;
24
+ --zen-font-mono: 'IBM Plex Mono', monospace;
25
+
26
+ /* Spacing */
27
+ --zen-radius: 2px;
28
+ --zen-max-width: 640px;
29
+ --zen-section-gap: 6rem;
30
+ --zen-section-gap-sm: 4rem;
31
+
32
+ /* Motion — very slow, meditative */
33
+ --zen-fade-duration: 1000ms;
34
+ --zen-fade-ease: cubic-bezier(0.25, 0.1, 0.25, 1);
35
+ --zen-stagger: 150ms;
36
+ }
37
+
38
+ /* ── Reduced Motion ── */
39
+ @media (prefers-reduced-motion: reduce) {
40
+ :root {
41
+ --zen-fade-duration: 0ms;
42
+ --zen-stagger: 0ms;
43
+ }
44
+ .zen-fade {
45
+ opacity: 1 !important;
46
+ transform: none !important;
47
+ }
48
+ }
49
+
50
+ /* ── Selection ── */
51
+ ::selection {
52
+ background: var(--zen-selection-bg);
53
+ color: var(--zen-selection-text);
54
+ }
55
+ ::-moz-selection {
56
+ background: var(--zen-selection-bg);
57
+ color: var(--zen-selection-text);
58
+ }
59
+
60
+ /* ── Base ── */
61
+ html {
62
+ scroll-behavior: smooth;
63
+ }
64
+ @media (prefers-reduced-motion: reduce) {
65
+ html {
66
+ scroll-behavior: auto;
67
+ }
68
+ }
69
+
70
+ body {
71
+ font-family: var(--zen-font-body);
72
+ color: var(--zen-text);
73
+ background: var(--zen-bg);
74
+ line-height: 1.7;
75
+ -webkit-font-smoothing: antialiased;
76
+ -moz-osx-font-smoothing: grayscale;
77
+ min-height: 100vh;
78
+ }
79
+
80
+ /* ── Links ── */
81
+ a {
82
+ color: var(--zen-text);
83
+ text-decoration: underline;
84
+ text-decoration-color: var(--zen-rule);
85
+ text-underline-offset: 3px;
86
+ text-decoration-thickness: 1px;
87
+ transition: text-decoration-color 300ms ease;
88
+ }
89
+ a:hover {
90
+ text-decoration-color: var(--zen-text);
91
+ }
92
+ a:focus-visible {
93
+ outline: 2px solid var(--zen-accent);
94
+ outline-offset: 3px;
95
+ border-radius: var(--zen-radius);
96
+ }
97
+ a:visited {
98
+ color: var(--zen-text);
99
+ }
100
+ a:active {
101
+ color: var(--zen-accent-hover);
102
+ }
103
+
104
+ /* ── Layout ── */
105
+ .zen-container {
106
+ max-width: var(--zen-max-width);
107
+ margin: 0 auto;
108
+ padding: 3rem 1.25rem 5rem;
109
+ }
110
+
111
+ @media (min-width: 480px) {
112
+ .zen-container {
113
+ padding: 4rem 1.5rem 6rem;
114
+ }
115
+ }
116
+
117
+ @media (min-width: 768px) {
118
+ .zen-container {
119
+ padding: 6rem 2rem 8rem;
120
+ }
121
+ }
122
+
123
+ /* ── Navigation ── */
124
+ .zen-nav {
125
+ padding: 1.25rem;
126
+ max-width: var(--zen-max-width);
127
+ margin: 0 auto;
128
+ }
129
+
130
+ @media (min-width: 768px) {
131
+ .zen-nav {
132
+ padding: 1.5rem 2rem;
133
+ }
134
+ }
135
+
136
+ .zen-nav-inner {
137
+ display: flex;
138
+ align-items: center;
139
+ flex-wrap: wrap;
140
+ gap: 0.75rem 1.25rem;
141
+ font-family: var(--zen-font-mono);
142
+ font-size: 0.8125rem;
143
+ color: var(--zen-text-secondary);
144
+ letter-spacing: 0.01em;
145
+ }
146
+
147
+ .zen-nav a {
148
+ color: var(--zen-text-secondary);
149
+ text-decoration: none;
150
+ padding: 0.125rem 0;
151
+ transition: color 300ms ease;
152
+ }
153
+ .zen-nav a:hover {
154
+ color: var(--zen-text);
155
+ }
156
+ .zen-nav a[aria-current="page"] {
157
+ color: var(--zen-text);
158
+ }
159
+
160
+ .zen-nav-sep {
161
+ color: var(--zen-rule);
162
+ user-select: none;
163
+ }
164
+
165
+ /* ── Sections ── */
166
+ .zen-section {
167
+ margin-block-end: var(--zen-section-gap);
168
+ }
169
+
170
+ @media (max-width: 479px) {
171
+ .zen-section {
172
+ margin-block-end: var(--zen-section-gap-sm);
173
+ }
174
+ }
175
+
176
+ /* ── Horizontal Rule ── */
177
+ .zen-rule {
178
+ border: none;
179
+ border-block-start: 1px solid var(--zen-rule);
180
+ margin-block-end: var(--zen-section-gap);
181
+ }
182
+
183
+ @media (max-width: 479px) {
184
+ .zen-rule {
185
+ margin-block-end: var(--zen-section-gap-sm);
186
+ }
187
+ }
188
+
189
+ /* ── Fade Animation ── */
190
+ .zen-fade {
191
+ opacity: 0;
192
+ transform: translateY(8px);
193
+ }
194
+
195
+ .zen-fade.zen-visible {
196
+ opacity: 1;
197
+ transform: translateY(0);
198
+ transition:
199
+ opacity var(--zen-fade-duration) var(--zen-fade-ease),
200
+ transform var(--zen-fade-duration) var(--zen-fade-ease);
201
+ }
202
+
203
+ /* ── Typography ── */
204
+ .zen-display {
205
+ font-family: var(--zen-font-display);
206
+ font-weight: 400;
207
+ font-size: 1.875rem;
208
+ line-height: 1.25;
209
+ letter-spacing: -0.01em;
210
+ color: var(--zen-text);
211
+ word-break: break-word;
212
+ }
213
+
214
+ @media (min-width: 480px) {
215
+ .zen-display {
216
+ font-size: 2rem;
217
+ }
218
+ }
219
+
220
+ @media (min-width: 768px) {
221
+ .zen-display {
222
+ font-size: 2.5rem;
223
+ line-height: 1.2;
224
+ }
225
+ }
226
+
227
+ /* Portfolio uses larger display size */
228
+ .zen-portfolio .zen-display {
229
+ font-size: 2.25rem;
230
+ line-height: 1.15;
231
+ }
232
+
233
+ @media (min-width: 480px) {
234
+ .zen-portfolio .zen-display {
235
+ font-size: 2.5rem;
236
+ }
237
+ }
238
+
239
+ @media (min-width: 768px) {
240
+ .zen-portfolio .zen-display,
241
+ .zen-project-page .zen-display {
242
+ font-size: 3rem;
243
+ line-height: 1.1;
244
+ }
245
+ }
246
+
247
+ .zen-heading {
248
+ font-family: var(--zen-font-display);
249
+ font-weight: 400;
250
+ font-size: 1.375rem;
251
+ line-height: 1.3;
252
+ color: var(--zen-text);
253
+ margin-block-end: 1.5rem;
254
+ }
255
+
256
+ @media (min-width: 768px) {
257
+ .zen-heading {
258
+ font-size: 1.5rem;
259
+ }
260
+ }
261
+
262
+ .zen-subheading {
263
+ font-family: var(--zen-font-display);
264
+ font-weight: 400;
265
+ font-size: 1.125rem;
266
+ line-height: 1.4;
267
+ color: var(--zen-text);
268
+ margin-block-end: 1rem;
269
+ }
270
+
271
+ @media (min-width: 768px) {
272
+ .zen-subheading {
273
+ font-size: 1.1875rem;
274
+ }
275
+ }
276
+
277
+ .zen-body {
278
+ font-family: var(--zen-font-body);
279
+ font-size: 0.9375rem;
280
+ line-height: 1.8;
281
+ color: var(--zen-text-secondary);
282
+ }
283
+
284
+ .zen-mono {
285
+ font-family: var(--zen-font-mono);
286
+ font-size: 0.8125rem;
287
+ color: var(--zen-text-tertiary);
288
+ letter-spacing: 0.01em;
289
+ }
290
+
291
+ /* ── Breadcrumb ── */
292
+ .zen-breadcrumb {
293
+ font-family: var(--zen-font-mono);
294
+ font-size: 0.8125rem;
295
+ color: var(--zen-text-tertiary);
296
+ margin-block-end: 2rem;
297
+ letter-spacing: 0.01em;
298
+ line-height: 1.6;
299
+ }
300
+
301
+ .zen-breadcrumb a {
302
+ color: var(--zen-text-tertiary);
303
+ transition: color 300ms ease;
304
+ }
305
+ .zen-breadcrumb a:hover {
306
+ color: var(--zen-text);
307
+ }
308
+
309
+ .zen-breadcrumb-sep {
310
+ margin-inline: 0.25rem;
311
+ user-select: none;
312
+ }
313
+
314
+ /* ════════════════════════════════════════════════
315
+ PORTFOLIO — Header Section
316
+ ════════════════════════════════════════════════ */
317
+
318
+ .zen-header-profile {
319
+ display: flex;
320
+ gap: 2rem;
321
+ align-items: flex-start;
322
+ }
323
+
324
+ .zen-header-photo {
325
+ width: 280px;
326
+ height: auto;
327
+ border-radius: var(--zen-radius);
328
+ object-fit: contain;
329
+ flex-shrink: 0;
330
+ border: none;
331
+ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08);
332
+ }
333
+
334
+ .zen-header-info {
335
+ flex: 1;
336
+ min-width: 0;
337
+ }
338
+
339
+ .zen-header-name {
340
+ margin-block-end: 1.5rem;
341
+ }
342
+
343
+ .zen-header-bio {
344
+ font-family: var(--zen-font-body);
345
+ font-size: 0.9375rem;
346
+ line-height: 1.8;
347
+ color: var(--zen-text-secondary);
348
+ margin-block-end: 1rem;
349
+ max-width: 540px;
350
+ }
351
+
352
+ @media (min-width: 768px) {
353
+ .zen-header-bio {
354
+ font-size: 1rem;
355
+ line-height: 1.85;
356
+ }
357
+ }
358
+
359
+ .zen-header-location {
360
+ font-family: var(--zen-font-mono);
361
+ font-size: 0.8125rem;
362
+ color: var(--zen-text-tertiary);
363
+ letter-spacing: 0.01em;
364
+ }
365
+
366
+ .zen-header-contact {
367
+ display: flex;
368
+ flex-wrap: wrap;
369
+ gap: 0.75rem 1.25rem;
370
+ margin-block-start: 1.25rem;
371
+ list-style: none;
372
+ }
373
+
374
+ .zen-header-contact a {
375
+ display: inline-flex;
376
+ align-items: center;
377
+ gap: 0.375rem;
378
+ font-family: var(--zen-font-mono);
379
+ font-size: 0.8125rem;
380
+ color: var(--zen-text-tertiary);
381
+ text-decoration: none;
382
+ transition: color 300ms ease;
383
+ }
384
+
385
+ .zen-header-contact a:hover {
386
+ color: var(--zen-text);
387
+ }
388
+
389
+ .zen-header-contact svg {
390
+ flex-shrink: 0;
391
+ }
392
+
393
+ .zen-header-resume {
394
+ display: inline-flex;
395
+ align-items: center;
396
+ gap: 0.375rem;
397
+ margin-block-start: 1.25rem;
398
+ padding: 0.375rem 0.875rem;
399
+ font-family: var(--zen-font-mono);
400
+ font-size: 0.8125rem;
401
+ color: var(--zen-bg);
402
+ background: var(--zen-text);
403
+ border: none;
404
+ border-radius: var(--zen-radius);
405
+ cursor: pointer;
406
+ text-decoration: none;
407
+ transition: opacity 300ms ease;
408
+ }
409
+
410
+ .zen-header-resume:hover {
411
+ opacity: 0.8;
412
+ text-decoration: none;
413
+ color: var(--zen-bg);
414
+ }
415
+
416
+ @media (max-width: 479px) {
417
+ .zen-header-profile {
418
+ flex-direction: column;
419
+ align-items: center;
420
+ text-align: center;
421
+ }
422
+ .zen-header-photo {
423
+ width: 160px;
424
+ height: 120px;
425
+ }
426
+ .zen-header-contact {
427
+ justify-content: center;
428
+ }
429
+ }
430
+
431
+ /* ── Stats — simple inline text ── */
432
+ .zen-stats {
433
+ font-family: var(--zen-font-body);
434
+ font-size: 0.9375rem;
435
+ color: var(--zen-text-secondary);
436
+ line-height: 2.2;
437
+ }
438
+
439
+ .zen-stat-value {
440
+ font-family: var(--zen-font-display);
441
+ font-size: 1.125rem;
442
+ font-weight: 500;
443
+ color: var(--zen-text);
444
+ }
445
+
446
+ @media (min-width: 768px) {
447
+ .zen-stat-value {
448
+ font-size: 1.25rem;
449
+ }
450
+ }
451
+
452
+ /* ════════════════════════════════════════════════
453
+ PORTFOLIO — Project List
454
+ ════════════════════════════════════════════════ */
455
+
456
+ .zen-project {
457
+ margin-block-end: 4rem;
458
+ }
459
+
460
+ @media (max-width: 479px) {
461
+ .zen-project {
462
+ margin-block-end: 3rem;
463
+ }
464
+ }
465
+
466
+ .zen-project:last-child {
467
+ margin-block-end: 0;
468
+ }
469
+
470
+ .zen-project-title {
471
+ font-family: var(--zen-font-display);
472
+ font-weight: 500;
473
+ font-size: 1.25rem;
474
+ line-height: 1.3;
475
+ color: var(--zen-text);
476
+ margin-block-end: 0.875rem;
477
+ }
478
+
479
+ @media (min-width: 768px) {
480
+ .zen-project-title {
481
+ font-size: 1.375rem;
482
+ }
483
+ }
484
+
485
+ .zen-project-title a {
486
+ text-decoration: none;
487
+ transition: color 300ms ease;
488
+ }
489
+ .zen-project-title a:hover {
490
+ text-decoration: underline;
491
+ text-decoration-color: var(--zen-rule);
492
+ text-underline-offset: 3px;
493
+ text-decoration-thickness: 1px;
494
+ }
495
+ .zen-project-title a:focus-visible {
496
+ outline: 2px solid var(--zen-accent);
497
+ outline-offset: 3px;
498
+ border-radius: var(--zen-radius);
499
+ }
500
+
501
+ .zen-project-narrative {
502
+ font-family: var(--zen-font-body);
503
+ font-size: 0.9375rem;
504
+ line-height: 1.8;
505
+ color: var(--zen-text-secondary);
506
+ margin-block-end: 1.25rem;
507
+ }
508
+
509
+ .zen-project-meta {
510
+ font-family: var(--zen-font-mono);
511
+ font-size: 0.75rem;
512
+ color: var(--zen-text-tertiary);
513
+ line-height: 1.8;
514
+ letter-spacing: 0.01em;
515
+ }
516
+
517
+ .zen-project-skills {
518
+ font-family: var(--zen-font-body);
519
+ font-size: 0.8125rem;
520
+ color: var(--zen-text-tertiary);
521
+ line-height: 1.7;
522
+ margin-block-start: 0.75rem;
523
+ }
524
+
525
+ .zen-project-divider {
526
+ border: none;
527
+ border-block-start: 1px solid var(--zen-rule);
528
+ margin-block-start: 4rem;
529
+ margin-block-end: 4rem;
530
+ opacity: 0.5;
531
+ }
532
+
533
+ @media (max-width: 479px) {
534
+ .zen-project-divider {
535
+ margin-block-start: 3rem;
536
+ margin-block-end: 3rem;
537
+ }
538
+ }
539
+
540
+ /* ════════════════════════════════════════════════
541
+ PROJECT — Links & Screenshot
542
+ ════════════════════════════════════════════════ */
543
+
544
+ .zen-project-links {
545
+ font-family: var(--zen-font-mono);
546
+ font-size: 0.8125rem;
547
+ color: var(--zen-text-tertiary);
548
+ margin-block-start: 1.25rem;
549
+ display: flex;
550
+ flex-wrap: wrap;
551
+ gap: 0.375rem 1.25rem;
552
+ letter-spacing: 0.01em;
553
+ }
554
+
555
+ .zen-project-links a {
556
+ color: var(--zen-text-tertiary);
557
+ transition: color 300ms ease;
558
+ }
559
+ .zen-project-links a:hover {
560
+ color: var(--zen-text);
561
+ }
562
+
563
+ .zen-screenshot {
564
+ margin-block-start: 2.5rem;
565
+ border-radius: var(--zen-radius);
566
+ overflow: hidden;
567
+ }
568
+
569
+ .zen-screenshot-chrome {
570
+ background: #e7e5e4;
571
+ padding: 0.625rem 0.875rem;
572
+ display: flex;
573
+ align-items: center;
574
+ gap: 0.375rem;
575
+ }
576
+
577
+ .zen-screenshot-dot {
578
+ width: 7px;
579
+ height: 7px;
580
+ border-radius: 50%;
581
+ background: var(--zen-rule);
582
+ }
583
+
584
+ .zen-screenshot-url {
585
+ font-family: var(--zen-font-mono);
586
+ font-size: 0.6875rem;
587
+ color: var(--zen-text-tertiary);
588
+ margin-inline-start: 0.75rem;
589
+ }
590
+
591
+ /* ── Narrative ── */
592
+ .zen-narrative p {
593
+ font-family: var(--zen-font-body);
594
+ font-size: 0.9375rem;
595
+ line-height: 1.9;
596
+ color: var(--zen-text-secondary);
597
+ margin-block-end: 1.5rem;
598
+ }
599
+
600
+ .zen-narrative p:last-child {
601
+ margin-block-end: 0;
602
+ }
603
+
604
+ @media (min-width: 768px) {
605
+ .zen-narrative p {
606
+ line-height: 2;
607
+ }
608
+ }
609
+
610
+ /* ── Phase Timeline — minimal vertical line ── */
611
+ .zen-timeline {
612
+ position: relative;
613
+ padding-inline-start: 1.75rem;
614
+ }
615
+
616
+ .zen-timeline::before {
617
+ content: '';
618
+ position: absolute;
619
+ inset-inline-start: 0;
620
+ top: 0.5rem;
621
+ bottom: 0.5rem;
622
+ width: 1px;
623
+ background: var(--zen-rule);
624
+ }
625
+
626
+ .zen-timeline-item {
627
+ margin-block-end: 2.25rem;
628
+ position: relative;
629
+ }
630
+
631
+ .zen-timeline-item:last-child {
632
+ margin-block-end: 0;
633
+ }
634
+
635
+ .zen-timeline-item::before {
636
+ content: '';
637
+ position: absolute;
638
+ inset-inline-start: -1.75rem;
639
+ top: 0.5rem;
640
+ width: 5px;
641
+ height: 5px;
642
+ border-radius: 50%;
643
+ background: var(--zen-accent);
644
+ transform: translateX(-2px);
645
+ }
646
+
647
+ .zen-timeline-date {
648
+ font-family: var(--zen-font-mono);
649
+ font-size: 0.75rem;
650
+ color: var(--zen-text-tertiary);
651
+ margin-block-end: 0.25rem;
652
+ letter-spacing: 0.01em;
653
+ }
654
+
655
+ .zen-timeline-title {
656
+ font-family: var(--zen-font-display);
657
+ font-size: 1.0625rem;
658
+ font-weight: 500;
659
+ color: var(--zen-text);
660
+ margin-block-end: 0.375rem;
661
+ }
662
+
663
+ .zen-timeline-desc {
664
+ font-family: var(--zen-font-body);
665
+ font-size: 0.875rem;
666
+ line-height: 1.7;
667
+ color: var(--zen-text-secondary);
668
+ }
669
+
670
+ /* ── Skills — plain comma-separated text ── */
671
+ .zen-skills-text {
672
+ font-family: var(--zen-font-body);
673
+ font-size: 0.9375rem;
674
+ line-height: 1.9;
675
+ color: var(--zen-text-secondary);
676
+ }
677
+
678
+ /* ── Key Decisions ── */
679
+ .zen-decisions {
680
+ list-style: none;
681
+ }
682
+
683
+ .zen-decision-item {
684
+ margin-block-end: 1.25rem;
685
+ padding-inline-start: 1.25rem;
686
+ position: relative;
687
+ }
688
+
689
+ .zen-decision-item::before {
690
+ content: '';
691
+ position: absolute;
692
+ inset-inline-start: 0;
693
+ top: 0.625rem;
694
+ width: 4px;
695
+ height: 4px;
696
+ border-radius: 50%;
697
+ background: var(--zen-text-tertiary);
698
+ }
699
+
700
+ .zen-decision-item:last-child {
701
+ margin-block-end: 0;
702
+ }
703
+
704
+ .zen-decision-text {
705
+ font-family: var(--zen-font-body);
706
+ font-size: 0.9375rem;
707
+ line-height: 1.7;
708
+ color: var(--zen-text-secondary);
709
+ }
710
+
711
+ /* ── Source Breakdown ── */
712
+ .zen-source {
713
+ font-family: var(--zen-font-mono);
714
+ font-size: 0.8125rem;
715
+ color: var(--zen-text-tertiary);
716
+ line-height: 2;
717
+ letter-spacing: 0.01em;
718
+ }
719
+
720
+ /* ── Session List (project page) ── */
721
+ .zen-session-item {
722
+ margin-block-end: 1.75rem;
723
+ }
724
+
725
+ .zen-session-item:last-child {
726
+ margin-block-end: 0;
727
+ }
728
+
729
+ .zen-session-title {
730
+ font-family: var(--zen-font-display);
731
+ font-size: 1.0625rem;
732
+ font-weight: 500;
733
+ color: var(--zen-text);
734
+ margin-block-end: 0.25rem;
735
+ }
736
+
737
+ .zen-session-title a {
738
+ text-decoration: none;
739
+ transition: color 300ms ease;
740
+ }
741
+ .zen-session-title a:hover {
742
+ text-decoration: underline;
743
+ text-decoration-color: var(--zen-rule);
744
+ text-underline-offset: 3px;
745
+ text-decoration-thickness: 1px;
746
+ }
747
+ .zen-session-title a:focus-visible {
748
+ outline: 2px solid var(--zen-accent);
749
+ outline-offset: 3px;
750
+ border-radius: var(--zen-radius);
751
+ }
752
+
753
+ .zen-session-meta {
754
+ font-family: var(--zen-font-mono);
755
+ font-size: 0.75rem;
756
+ color: var(--zen-text-tertiary);
757
+ letter-spacing: 0.01em;
758
+ }
759
+
760
+ .zen-session-divider {
761
+ border: none;
762
+ border-block-start: 1px solid var(--zen-rule);
763
+ margin-block-start: 1.75rem;
764
+ margin-block-end: 1.75rem;
765
+ opacity: 0.4;
766
+ }
767
+
768
+ /* ════════════════════════════════════════════════
769
+ SESSION — Header Meta
770
+ ════════════════════════════════════════════════ */
771
+
772
+ .zen-session-header-meta {
773
+ font-family: var(--zen-font-mono);
774
+ font-size: 0.8125rem;
775
+ color: var(--zen-text-tertiary);
776
+ line-height: 2.2;
777
+ margin-block-start: 1.5rem;
778
+ letter-spacing: 0.01em;
779
+ }
780
+
781
+ .zen-session-meta-row {
782
+ display: block;
783
+ }
784
+
785
+ @media (min-width: 480px) {
786
+ .zen-session-meta-row {
787
+ display: inline;
788
+ }
789
+ }
790
+
791
+ /* ── Dev Take — italic quote ── */
792
+ .zen-dev-take {
793
+ font-family: var(--zen-font-display);
794
+ font-style: italic;
795
+ font-size: 1.125rem;
796
+ line-height: 1.75;
797
+ color: var(--zen-text-secondary);
798
+ }
799
+
800
+ @media (min-width: 768px) {
801
+ .zen-dev-take {
802
+ font-size: 1.1875rem;
803
+ line-height: 1.8;
804
+ }
805
+ }
806
+
807
+ /* ── Execution Path / Beats ── */
808
+ .zen-beat {
809
+ margin-block-end: 3rem;
810
+ }
811
+
812
+ .zen-beat:last-child {
813
+ margin-block-end: 0;
814
+ }
815
+
816
+ .zen-beat-number {
817
+ font-family: var(--zen-font-mono);
818
+ font-size: 0.6875rem;
819
+ color: var(--zen-text-tertiary);
820
+ margin-block-end: 0.5rem;
821
+ letter-spacing: 0.05em;
822
+ }
823
+
824
+ .zen-beat-title {
825
+ font-family: var(--zen-font-display);
826
+ font-weight: 500;
827
+ font-size: 1.0625rem;
828
+ color: var(--zen-text);
829
+ margin-block-end: 0.625rem;
830
+ }
831
+
832
+ @media (min-width: 768px) {
833
+ .zen-beat-title {
834
+ font-size: 1.125rem;
835
+ }
836
+ }
837
+
838
+ .zen-beat-desc {
839
+ font-family: var(--zen-font-body);
840
+ font-size: 0.9375rem;
841
+ line-height: 1.85;
842
+ color: var(--zen-text-secondary);
843
+ }
844
+
845
+ .zen-beat-divider {
846
+ border: none;
847
+ border-block-start: 1px solid var(--zen-rule);
848
+ margin-block-start: 3rem;
849
+ margin-block-end: 3rem;
850
+ opacity: 0.35;
851
+ }
852
+
853
+ /* ── Q&A ── */
854
+ .zen-qa-item {
855
+ margin-block-end: 3rem;
856
+ }
857
+
858
+ .zen-qa-item:last-child {
859
+ margin-block-end: 0;
860
+ }
861
+
862
+ .zen-question {
863
+ font-family: var(--zen-font-body);
864
+ font-size: 0.9375rem;
865
+ font-weight: 500;
866
+ line-height: 1.7;
867
+ color: var(--zen-text);
868
+ margin-block-end: 0.875rem;
869
+ }
870
+
871
+ .zen-answer {
872
+ font-family: var(--zen-font-body);
873
+ font-size: 0.9375rem;
874
+ line-height: 1.85;
875
+ color: var(--zen-text-secondary);
876
+ }
877
+
878
+ .zen-qa-divider {
879
+ border: none;
880
+ border-block-start: 1px solid var(--zen-rule);
881
+ margin-block-start: 3rem;
882
+ margin-block-end: 3rem;
883
+ opacity: 0.35;
884
+ }
885
+
886
+ /* ── Details Section ── */
887
+ .zen-details-group {
888
+ margin-block-end: 3rem;
889
+ }
890
+
891
+ .zen-details-group:last-child {
892
+ margin-block-end: 0;
893
+ }
894
+
895
+ .zen-details-label {
896
+ font-family: var(--zen-font-mono);
897
+ font-size: 0.6875rem;
898
+ font-weight: 500;
899
+ text-transform: uppercase;
900
+ letter-spacing: 0.1em;
901
+ color: var(--zen-text-tertiary);
902
+ margin-block-end: 1rem;
903
+ }
904
+
905
+ /* ── Tools Used ── */
906
+ .zen-tools {
907
+ font-family: var(--zen-font-mono);
908
+ font-size: 0.8125rem;
909
+ color: var(--zen-text-secondary);
910
+ line-height: 2.2;
911
+ letter-spacing: 0.01em;
912
+ }
913
+
914
+ .zen-tool-row {
915
+ display: flex;
916
+ justify-content: space-between;
917
+ align-items: baseline;
918
+ max-width: 200px;
919
+ }
920
+
921
+ .zen-tool-name {
922
+ color: var(--zen-text-secondary);
923
+ }
924
+
925
+ .zen-tool-count {
926
+ color: var(--zen-text-tertiary);
927
+ font-variant-numeric: tabular-nums;
928
+ }
929
+
930
+ /* ── Files Changed ── */
931
+ .zen-files {
932
+ list-style: none;
933
+ }
934
+
935
+ .zen-file-item {
936
+ font-family: var(--zen-font-mono);
937
+ font-size: 0.75rem;
938
+ color: var(--zen-text-secondary);
939
+ line-height: 2.2;
940
+ display: flex;
941
+ justify-content: space-between;
942
+ gap: 1rem;
943
+ letter-spacing: 0.01em;
944
+ }
945
+
946
+ .zen-file-path {
947
+ overflow: hidden;
948
+ text-overflow: ellipsis;
949
+ white-space: nowrap;
950
+ min-width: 0;
951
+ }
952
+
953
+ .zen-file-diff {
954
+ color: var(--zen-text-tertiary);
955
+ flex-shrink: 0;
956
+ font-variant-numeric: tabular-nums;
957
+ }
958
+
959
+ /* ── Agent Summary ── */
960
+ .zen-agents-count {
961
+ font-family: var(--zen-font-mono);
962
+ font-size: 0.8125rem;
963
+ color: var(--zen-text-tertiary);
964
+ margin-block-end: 1rem;
965
+ letter-spacing: 0.01em;
966
+ }
967
+
968
+ .zen-agent-row {
969
+ display: flex;
970
+ justify-content: space-between;
971
+ align-items: baseline;
972
+ font-family: var(--zen-font-mono);
973
+ font-size: 0.8125rem;
974
+ line-height: 2.2;
975
+ letter-spacing: 0.01em;
976
+ max-width: 320px;
977
+ }
978
+
979
+ .zen-agent-role {
980
+ color: var(--zen-text);
981
+ }
982
+
983
+ .zen-agent-meta {
984
+ color: var(--zen-text-tertiary);
985
+ font-variant-numeric: tabular-nums;
986
+ }
987
+
988
+ /* ── Skip Link ── */
989
+ .zen-skip-link {
990
+ position: absolute;
991
+ top: -100%;
992
+ left: 1rem;
993
+ background: var(--zen-text);
994
+ color: var(--zen-bg);
995
+ padding: 0.5rem 1rem;
996
+ font-family: var(--zen-font-body);
997
+ font-size: 0.875rem;
998
+ font-weight: 500;
999
+ border-radius: var(--zen-radius);
1000
+ z-index: 100;
1001
+ text-decoration: none;
1002
+ white-space: nowrap;
1003
+ }
1004
+ .zen-skip-link:focus {
1005
+ top: 1rem;
1006
+ outline: 2px solid var(--zen-accent);
1007
+ outline-offset: 2px;
1008
+ }
1009
+
1010
+ /* ── Work Timeline Chart — minimal bars ── */
1011
+ .zen-chart {
1012
+ margin-block-start: 0.5rem;
1013
+ }
1014
+
1015
+ .zen-chart-row {
1016
+ display: flex;
1017
+ align-items: center;
1018
+ gap: 0.75rem;
1019
+ margin-block-end: 0.625rem;
1020
+ font-family: var(--zen-font-mono);
1021
+ font-size: 0.75rem;
1022
+ color: var(--zen-text-tertiary);
1023
+ letter-spacing: 0.01em;
1024
+ }
1025
+
1026
+ .zen-chart-row:last-child {
1027
+ margin-block-end: 0;
1028
+ }
1029
+
1030
+ .zen-chart-label {
1031
+ min-width: 4.5rem;
1032
+ text-align: end;
1033
+ flex-shrink: 0;
1034
+ }
1035
+
1036
+ @media (min-width: 480px) {
1037
+ .zen-chart-label {
1038
+ min-width: 5rem;
1039
+ }
1040
+ }
1041
+
1042
+ .zen-chart-bar-track {
1043
+ flex: 1;
1044
+ min-width: 0;
1045
+ height: 3px;
1046
+ background: transparent;
1047
+ position: relative;
1048
+ }
1049
+
1050
+ .zen-chart-bar {
1051
+ height: 3px;
1052
+ background: var(--zen-rule);
1053
+ border-radius: 1px;
1054
+ position: absolute;
1055
+ inset-block-start: 0;
1056
+ inset-inline-start: 0;
1057
+ }
1058
+
1059
+ .zen-chart-value {
1060
+ min-width: 2.25rem;
1061
+ flex-shrink: 0;
1062
+ }
1063
+
1064
+ /* ── Screenshot Body Placeholder ── */
1065
+ .zen-screenshot-body {
1066
+ background: linear-gradient(
1067
+ 160deg,
1068
+ #e7e5e4 0%,
1069
+ #d6d3d1 40%,
1070
+ #e7e5e4 100%
1071
+ );
1072
+ height: 180px;
1073
+ }
1074
+
1075
+ @media (min-width: 480px) {
1076
+ .zen-screenshot-body {
1077
+ height: 220px;
1078
+ }
1079
+ }
1080
+
1081
+ @media (min-width: 768px) {
1082
+ .zen-screenshot-body {
1083
+ height: 280px;
1084
+ }
1085
+ }
1086
+
1087
+ /* ════════════════════════════════════════════════
1088
+ FOOTER
1089
+ ════════════════════════════════════════════════ */
1090
+
1091
+ .zen-footer {
1092
+ margin-block-start: var(--zen-section-gap);
1093
+ padding-block-start: 2rem;
1094
+ border-block-start: 1px solid var(--zen-rule);
1095
+ }
1096
+
1097
+ .zen-footer-inner {
1098
+ display: flex;
1099
+ flex-direction: column;
1100
+ gap: 0.5rem;
1101
+ }
1102
+
1103
+ @media (min-width: 768px) {
1104
+ .zen-footer-inner {
1105
+ flex-direction: row;
1106
+ justify-content: space-between;
1107
+ align-items: center;
1108
+ }
1109
+ }
1110
+
1111
+ .zen-footer-text {
1112
+ font-family: var(--zen-font-mono);
1113
+ font-size: 0.75rem;
1114
+ color: var(--zen-text-tertiary);
1115
+ letter-spacing: 0.01em;
1116
+ }
1117
+
1118
+ .zen-footer-nav {
1119
+ display: flex;
1120
+ gap: 1.5rem;
1121
+ font-family: var(--zen-font-mono);
1122
+ font-size: 0.75rem;
1123
+ }
1124
+
1125
+ .zen-footer-nav a {
1126
+ color: var(--zen-text-tertiary);
1127
+ text-decoration: none;
1128
+ transition: color 300ms ease;
1129
+ }
1130
+ .zen-footer-nav a:hover {
1131
+ color: var(--zen-text);
1132
+ }
1133
+
1134
+ /* ════════════════════════════════════════════════
1135
+ PRINT STYLES
1136
+ ════════════════════════════════════════════════ */
1137
+
1138
+ @media print {
1139
+ body {
1140
+ background: white;
1141
+ color: black;
1142
+ font-size: 11pt;
1143
+ }
1144
+
1145
+ .zen-nav,
1146
+ .zen-skip-link,
1147
+ .zen-footer-nav {
1148
+ display: none;
1149
+ }
1150
+
1151
+ .zen-container {
1152
+ max-width: 100%;
1153
+ padding: 0;
1154
+ }
1155
+
1156
+ .zen-fade {
1157
+ opacity: 1 !important;
1158
+ transform: none !important;
1159
+ }
1160
+
1161
+ .zen-section {
1162
+ margin-block-end: 2rem;
1163
+ break-inside: avoid;
1164
+ }
1165
+
1166
+ .zen-rule {
1167
+ margin-block-end: 2rem;
1168
+ }
1169
+
1170
+ .zen-display {
1171
+ font-size: 20pt;
1172
+ }
1173
+
1174
+ .zen-heading {
1175
+ font-size: 14pt;
1176
+ }
1177
+
1178
+ a {
1179
+ text-decoration: none;
1180
+ color: black;
1181
+ }
1182
+
1183
+ a[href^="http"]::after {
1184
+ content: " (" attr(href) ")";
1185
+ font-size: 0.75em;
1186
+ color: #666;
1187
+ }
1188
+
1189
+ .zen-project-page .zen-display {
1190
+ font-size: 24pt;
1191
+ }
1192
+
1193
+ .zen-beat,
1194
+ .zen-qa-item,
1195
+ .zen-project,
1196
+ .zen-timeline-item {
1197
+ break-inside: avoid;
1198
+ }
1199
+
1200
+ .zen-screenshot {
1201
+ display: none;
1202
+ }
1203
+
1204
+ .zen-footer {
1205
+ border-block-start-color: #ccc;
1206
+ }
1207
+ }