heyiam 0.2.29 → 0.3.1

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 (186) hide show
  1. package/README.md +45 -0
  2. package/dist/auth.js +29 -3
  3. package/dist/config.js +10 -1
  4. package/dist/db.js +0 -1
  5. package/dist/export.js +124 -27
  6. package/dist/format-utils.js +5 -0
  7. package/dist/github.js +381 -0
  8. package/dist/index.js +168 -0
  9. package/dist/mount.js +300 -102
  10. package/dist/parsers/claude.js +2 -28
  11. package/dist/parsers/codex.js +2 -26
  12. package/dist/parsers/cursor.js +2 -26
  13. package/dist/parsers/duration.js +35 -0
  14. package/dist/parsers/gemini.js +2 -20
  15. package/dist/parsers/index.js +22 -3
  16. package/dist/parsers/types.js +0 -1
  17. package/dist/public/assets/index-Coilyhtr.css +1 -0
  18. package/dist/public/assets/index-D0noVMFu.js +44 -0
  19. package/dist/public/index.html +2 -2
  20. package/dist/redact.js +4 -104
  21. package/dist/render/build-render-data.js +9 -2
  22. package/dist/render/index.js +32 -5
  23. package/dist/render/liquid.js +147 -7
  24. package/dist/render/mock-data.js +303 -0
  25. package/dist/render/templates/aurora/portfolio.liquid +192 -0
  26. package/dist/render/templates/aurora/project.liquid +260 -0
  27. package/dist/render/templates/aurora/session.liquid +223 -0
  28. package/dist/render/templates/aurora/styles.css +1184 -0
  29. package/dist/render/templates/bauhaus/portfolio.liquid +169 -0
  30. package/dist/render/templates/bauhaus/project.liquid +300 -0
  31. package/dist/render/templates/bauhaus/session.liquid +333 -0
  32. package/dist/render/templates/bauhaus/styles.css +1645 -0
  33. package/dist/render/templates/blueprint/portfolio.liquid +153 -0
  34. package/dist/render/templates/blueprint/project.liquid +286 -0
  35. package/dist/render/templates/blueprint/session.liquid +248 -0
  36. package/dist/render/templates/blueprint/styles.css +1289 -0
  37. package/dist/render/templates/canvas/portfolio.liquid +203 -0
  38. package/dist/render/templates/canvas/project.liquid +235 -0
  39. package/dist/render/templates/canvas/session.liquid +223 -0
  40. package/dist/render/templates/canvas/styles.css +1440 -0
  41. package/dist/render/templates/carbon/portfolio.liquid +160 -0
  42. package/dist/render/templates/carbon/project.liquid +249 -0
  43. package/dist/render/templates/carbon/session.liquid +190 -0
  44. package/dist/render/templates/carbon/styles.css +1097 -0
  45. package/dist/render/templates/chalk/portfolio.liquid +189 -0
  46. package/dist/render/templates/chalk/project.liquid +245 -0
  47. package/dist/render/templates/chalk/session.liquid +215 -0
  48. package/dist/render/templates/chalk/styles.css +1161 -0
  49. package/dist/render/templates/circuit/portfolio.liquid +152 -0
  50. package/dist/render/templates/circuit/project.liquid +247 -0
  51. package/dist/render/templates/circuit/session.liquid +205 -0
  52. package/dist/render/templates/circuit/styles.css +1409 -0
  53. package/dist/render/templates/cosmos/portfolio.liquid +222 -0
  54. package/dist/render/templates/cosmos/project.liquid +327 -0
  55. package/dist/render/templates/cosmos/session.liquid +239 -0
  56. package/dist/render/templates/cosmos/styles.css +1157 -0
  57. package/dist/render/templates/daylight/portfolio.liquid +207 -0
  58. package/dist/render/templates/daylight/project.liquid +229 -0
  59. package/dist/render/templates/daylight/session.liquid +219 -0
  60. package/dist/render/templates/daylight/styles.css +1315 -0
  61. package/dist/render/templates/editorial/portfolio.liquid +110 -0
  62. package/dist/render/templates/editorial/project.liquid +202 -0
  63. package/dist/render/templates/editorial/session.liquid +171 -0
  64. package/dist/render/templates/editorial/styles.css +826 -0
  65. package/dist/render/templates/ember/portfolio.liquid +306 -0
  66. package/dist/render/templates/ember/project.liquid +232 -0
  67. package/dist/render/templates/ember/session.liquid +202 -0
  68. package/dist/render/templates/ember/styles.css +1289 -0
  69. package/dist/render/templates/glacier/portfolio.liquid +261 -0
  70. package/dist/render/templates/glacier/project.liquid +288 -0
  71. package/dist/render/templates/glacier/session.liquid +217 -0
  72. package/dist/render/templates/glacier/styles.css +1204 -0
  73. package/dist/render/templates/grid/portfolio.liquid +255 -0
  74. package/dist/render/templates/grid/project.liquid +306 -0
  75. package/dist/render/templates/grid/session.liquid +260 -0
  76. package/dist/render/templates/grid/styles.css +1445 -0
  77. package/dist/render/templates/kinetic/portfolio.liquid +158 -0
  78. package/dist/render/templates/kinetic/project.liquid +242 -0
  79. package/dist/render/templates/kinetic/session.liquid +228 -0
  80. package/dist/render/templates/kinetic/styles.css +948 -0
  81. package/dist/render/templates/meridian/portfolio.liquid +243 -0
  82. package/dist/render/templates/meridian/project.liquid +376 -0
  83. package/dist/render/templates/meridian/session.liquid +298 -0
  84. package/dist/render/templates/meridian/styles.css +1375 -0
  85. package/dist/render/templates/minimal/portfolio.liquid +71 -0
  86. package/dist/render/templates/minimal/project.liquid +154 -0
  87. package/dist/render/templates/minimal/session.liquid +140 -0
  88. package/dist/render/templates/minimal/styles.css +529 -0
  89. package/dist/render/templates/mono/portfolio.liquid +281 -0
  90. package/dist/render/templates/mono/project.liquid +275 -0
  91. package/dist/render/templates/mono/session.liquid +276 -0
  92. package/dist/render/templates/mono/styles.css +1022 -0
  93. package/dist/render/templates/neon/portfolio.liquid +207 -0
  94. package/dist/render/templates/neon/project.liquid +225 -0
  95. package/dist/render/templates/neon/session.liquid +195 -0
  96. package/dist/render/templates/neon/styles.css +1271 -0
  97. package/dist/render/templates/noir/portfolio.liquid +137 -0
  98. package/dist/render/templates/noir/project.liquid +220 -0
  99. package/dist/render/templates/noir/session.liquid +241 -0
  100. package/dist/render/templates/noir/styles.css +1229 -0
  101. package/dist/render/templates/obsidian/portfolio.liquid +247 -0
  102. package/dist/render/templates/obsidian/project.liquid +280 -0
  103. package/dist/render/templates/obsidian/session.liquid +241 -0
  104. package/dist/render/templates/obsidian/styles.css +1407 -0
  105. package/dist/render/templates/paper/portfolio.liquid +257 -0
  106. package/dist/render/templates/paper/project.liquid +235 -0
  107. package/dist/render/templates/paper/session.liquid +271 -0
  108. package/dist/render/templates/paper/styles.css +1513 -0
  109. package/dist/render/templates/parallax/portfolio.liquid +295 -0
  110. package/dist/render/templates/parallax/project.liquid +275 -0
  111. package/dist/render/templates/parallax/session.liquid +295 -0
  112. package/dist/render/templates/parallax/styles.css +1880 -0
  113. package/dist/render/templates/parchment/portfolio.liquid +280 -0
  114. package/dist/render/templates/parchment/project.liquid +289 -0
  115. package/dist/render/templates/parchment/session.liquid +346 -0
  116. package/dist/render/templates/parchment/styles.css +1401 -0
  117. package/dist/render/templates/partials/_beats.liquid +16 -0
  118. package/dist/render/templates/partials/_breadcrumb.liquid +9 -0
  119. package/dist/render/templates/partials/_footer.liquid +7 -0
  120. package/dist/render/templates/partials/_growth-chart.liquid +7 -0
  121. package/dist/render/templates/partials/_key-decisions.liquid +20 -0
  122. package/dist/render/templates/partials/_links.liquid +16 -0
  123. package/dist/render/templates/partials/_narrative.liquid +8 -0
  124. package/dist/render/templates/partials/_phases.liquid +20 -0
  125. package/dist/render/templates/partials/_portfolio-header.liquid +20 -0
  126. package/dist/render/templates/partials/_portfolio-projects.liquid +16 -0
  127. package/dist/render/templates/partials/_portfolio-stats.liquid +19 -0
  128. package/dist/render/templates/partials/_qa.liquid +13 -0
  129. package/dist/render/templates/partials/_screenshot.liquid +15 -0
  130. package/dist/render/templates/partials/_session-cards.liquid +30 -0
  131. package/dist/render/templates/partials/_session-header.liquid +39 -0
  132. package/dist/render/templates/partials/_session-sidebar.liquid +30 -0
  133. package/dist/render/templates/partials/_skills.liquid +12 -0
  134. package/dist/render/templates/partials/_source-breakdown.liquid +22 -0
  135. package/dist/render/templates/partials/_stats.liquid +38 -0
  136. package/dist/render/templates/partials/_work-timeline.liquid +7 -0
  137. package/dist/render/templates/project.liquid +7 -4
  138. package/dist/render/templates/radar/portfolio.liquid +223 -0
  139. package/dist/render/templates/radar/project.liquid +278 -0
  140. package/dist/render/templates/radar/session.liquid +300 -0
  141. package/dist/render/templates/radar/styles.css +1055 -0
  142. package/dist/render/templates/showcase/portfolio.liquid +221 -0
  143. package/dist/render/templates/showcase/project.liquid +237 -0
  144. package/dist/render/templates/showcase/session.liquid +210 -0
  145. package/dist/render/templates/showcase/styles.css +1284 -0
  146. package/dist/render/templates/signal/portfolio.liquid +217 -0
  147. package/dist/render/templates/signal/project.liquid +278 -0
  148. package/dist/render/templates/signal/session.liquid +282 -0
  149. package/dist/render/templates/signal/styles.css +1401 -0
  150. package/dist/render/templates/strata/portfolio.liquid +180 -0
  151. package/dist/render/templates/strata/project.liquid +282 -0
  152. package/dist/render/templates/strata/session.liquid +261 -0
  153. package/dist/render/templates/strata/styles.css +1354 -0
  154. package/dist/render/templates/styles.css +1190 -0
  155. package/dist/render/templates/terminal/portfolio.liquid +102 -0
  156. package/dist/render/templates/terminal/project.liquid +161 -0
  157. package/dist/render/templates/terminal/session.liquid +145 -0
  158. package/dist/render/templates/terminal/styles.css +497 -0
  159. package/dist/render/templates/verdant/portfolio.liquid +321 -0
  160. package/dist/render/templates/verdant/project.liquid +309 -0
  161. package/dist/render/templates/verdant/session.liquid +237 -0
  162. package/dist/render/templates/verdant/styles.css +1261 -0
  163. package/dist/render/templates/zen/portfolio.liquid +124 -0
  164. package/dist/render/templates/zen/project.liquid +187 -0
  165. package/dist/render/templates/zen/session.liquid +203 -0
  166. package/dist/render/templates/zen/styles.css +1211 -0
  167. package/dist/render/templates.js +90 -0
  168. package/dist/routes/auth.js +7 -3
  169. package/dist/routes/context.js +17 -10
  170. package/dist/routes/delete.js +195 -0
  171. package/dist/routes/enhance.js +57 -40
  172. package/dist/routes/export.js +14 -4
  173. package/dist/routes/github.js +254 -0
  174. package/dist/routes/index.js +2 -0
  175. package/dist/routes/portfolio-render-data.js +160 -0
  176. package/dist/routes/preview.js +555 -108
  177. package/dist/routes/projects.js +61 -24
  178. package/dist/routes/publish.js +320 -31
  179. package/dist/routes/settings.js +194 -1
  180. package/dist/routes/sse.js +9 -0
  181. package/dist/search.js +6 -0
  182. package/dist/server.js +11 -3
  183. package/dist/settings.js +112 -9
  184. package/package.json +3 -4
  185. package/dist/public/assets/index-CC9G8EF1.js +0 -21
  186. package/dist/public/assets/index-Dalqz2mC.css +0 -1
@@ -0,0 +1,1161 @@
1
+ /* ── Chalk Template Styles ── */
2
+
3
+ /* ── Tokens ── */
4
+ :root {
5
+ --bg: #f8fafc;
6
+ --surface: #ffffff;
7
+ --fg: #1e293b;
8
+ --fg-muted: #64748b;
9
+ --accent: #334155;
10
+ --accent-light: #475569;
11
+ --border: #cbd5e1;
12
+ --border-light: #e2e8f0;
13
+ --sketch-color: #94a3b8;
14
+ --radius-sm: 4px;
15
+ --radius: 8px;
16
+ --font-display: 'Caveat', cursive;
17
+ --font-body: 'Inter', sans-serif;
18
+ --font-mono: 'IBM Plex Mono', monospace;
19
+ --agent-frontend: #7c3aed;
20
+ --agent-backend: #0891b2;
21
+ --agent-qa: #059669;
22
+ --agent-security: #475569;
23
+ --agent-reviewer: #e11d48;
24
+ --agent-ux: #d97706;
25
+ }
26
+
27
+ /* ── Visited links ── */
28
+ a:visited { color: inherit; }
29
+
30
+ /* ── SVG filters ── */
31
+ .svg-filters {
32
+ position: absolute;
33
+ width: 0;
34
+ height: 0;
35
+ overflow: hidden;
36
+ }
37
+
38
+ /* ── Layout ── */
39
+ .container {
40
+ max-width: 960px;
41
+ margin-inline: auto;
42
+ padding-inline: 24px;
43
+ }
44
+
45
+ .layout-grid {
46
+ display: grid;
47
+ grid-template-columns: 1fr 280px;
48
+ gap: 32px;
49
+ align-items: start;
50
+ }
51
+
52
+ /* ── Sketch underline ── */
53
+ .sketch-underline {
54
+ position: relative;
55
+ display: inline-block;
56
+ }
57
+ .sketch-underline::after {
58
+ content: '';
59
+ position: absolute;
60
+ inset-inline-start: -4px;
61
+ inset-inline-end: -4px;
62
+ bottom: -2px;
63
+ height: 6px;
64
+ background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='8'%3E%3Cpath d='M0 4 Q 8 1, 16 4 T 32 4 T 48 4 T 64 4 T 80 4 T 96 4 T 112 4 L 120 4' fill='none' stroke='%23334155' stroke-width='2.5' stroke-linecap='round'/%3E%3C/svg%3E") repeat-x;
65
+ background-size: 60px 8px;
66
+ }
67
+
68
+ /* ── Hand-drawn card ── */
69
+ .chalk-card {
70
+ background: var(--surface);
71
+ border: 2px solid var(--border);
72
+ border-radius: var(--radius);
73
+ padding: 28px;
74
+ margin-bottom: 28px;
75
+ position: relative;
76
+ filter: url(#chalk-rough);
77
+ transform: rotate(0deg);
78
+ opacity: 1;
79
+ }
80
+ .chalk-card:nth-child(odd) {
81
+ transform: rotate(-0.3deg);
82
+ }
83
+ .chalk-card:nth-child(even) {
84
+ transform: rotate(0.4deg);
85
+ }
86
+ /* Session/project sidebar cards use tighter spacing */
87
+ .heyiam-session .chalk-card,
88
+ .heyiam-project .chalk-card {
89
+ padding: 20px;
90
+ margin-bottom: 20px;
91
+ }
92
+
93
+ /* ── Pin-to-board animation ── */
94
+ @keyframes pin-in {
95
+ from {
96
+ opacity: 0;
97
+ transform: rotate(-2deg) translateY(20px);
98
+ }
99
+ to {
100
+ opacity: 1;
101
+ transform: rotate(0deg) translateY(0);
102
+ }
103
+ }
104
+ .fade-in {
105
+ animation: pin-in 0.5s ease-out both;
106
+ }
107
+ .fade-in:nth-child(1) { animation-delay: 0s; }
108
+ .fade-in:nth-child(2) { animation-delay: 0.12s; }
109
+ .fade-in:nth-child(3) { animation-delay: 0.24s; }
110
+
111
+ /* ── Annotation arrow ── */
112
+ .annotation {
113
+ position: relative;
114
+ display: inline-flex;
115
+ align-items: center;
116
+ gap: 8px;
117
+ font-family: var(--font-display);
118
+ font-size: 18px;
119
+ color: var(--accent-light);
120
+ margin-top: 16px;
121
+ }
122
+ .annotation-arrow {
123
+ width: 40px;
124
+ height: 24px;
125
+ flex-shrink: 0;
126
+ }
127
+ .annotation-arrow path {
128
+ fill: none;
129
+ stroke: var(--accent-light);
130
+ stroke-width: 2;
131
+ stroke-linecap: round;
132
+ }
133
+
134
+ /* ── Breadcrumb ── */
135
+ .breadcrumb {
136
+ padding: 16px 0 0;
137
+ font-family: var(--font-mono);
138
+ font-size: 13px;
139
+ color: var(--fg-muted);
140
+ }
141
+ .breadcrumb a {
142
+ color: var(--fg-muted);
143
+ text-decoration: none;
144
+ }
145
+ .breadcrumb a:hover {
146
+ color: var(--accent);
147
+ text-decoration: underline;
148
+ text-decoration-style: wavy;
149
+ text-underline-offset: 2px;
150
+ }
151
+ .breadcrumb a:focus-visible {
152
+ outline: 2px solid var(--accent);
153
+ outline-offset: 2px;
154
+ border-radius: var(--radius-sm);
155
+ }
156
+ .breadcrumb-sep {
157
+ margin-inline: 6px;
158
+ color: var(--border);
159
+ }
160
+
161
+ /* ── Hero ── */
162
+ .hero {
163
+ padding: 32px 0 40px;
164
+ }
165
+ .hero h1 {
166
+ font-family: var(--font-display);
167
+ font-size: clamp(32px, 5vw, 48px);
168
+ font-weight: 700;
169
+ line-height: 1.15;
170
+ color: var(--accent);
171
+ margin-bottom: 16px;
172
+ }
173
+ /* Portfolio hero overrides */
174
+ .heyiam-portfolio .hero {
175
+ padding: 56px 0 40px;
176
+ }
177
+ .heyiam-portfolio .hero h1 {
178
+ font-size: clamp(40px, 7vw, 64px);
179
+ line-height: 1.1;
180
+ margin-bottom: 12px;
181
+ }
182
+ /* Project hero overrides */
183
+ .heyiam-project .hero {
184
+ padding: 56px 0 40px;
185
+ }
186
+ .heyiam-project .hero h1 {
187
+ font-size: clamp(36px, 6vw, 56px);
188
+ line-height: 1.1;
189
+ margin-bottom: 8px;
190
+ }
191
+ .hero-bio {
192
+ font-size: 16px;
193
+ color: var(--fg-muted);
194
+ max-width: 560px;
195
+ margin-bottom: 6px;
196
+ }
197
+ .hero-location {
198
+ font-family: var(--font-mono);
199
+ font-size: 13px;
200
+ color: var(--fg-muted);
201
+ display: flex;
202
+ align-items: center;
203
+ gap: 6px;
204
+ }
205
+ .hero-location::before {
206
+ content: '';
207
+ display: inline-block;
208
+ width: 8px;
209
+ height: 8px;
210
+ border-radius: 50%;
211
+ background: var(--accent);
212
+ }
213
+ .hero-photo {
214
+ width: 100px;
215
+ height: 130px;
216
+ border-radius: 6px;
217
+ object-fit: cover;
218
+ object-position: 55% 10%;
219
+ border: 2px solid var(--border);
220
+ filter: url(#chalk-rough) grayscale(0.5) contrast(1.1);
221
+ margin-bottom: 16px;
222
+ }
223
+ .hero-meta {
224
+ display: flex;
225
+ flex-wrap: wrap;
226
+ gap: 16px;
227
+ font-family: var(--font-mono);
228
+ font-size: 12px;
229
+ color: var(--fg-muted);
230
+ margin-bottom: 12px;
231
+ }
232
+ .hero-meta-item {
233
+ display: inline-flex;
234
+ align-items: center;
235
+ gap: 6px;
236
+ }
237
+ .hero-meta-item::before {
238
+ content: '';
239
+ display: inline-block;
240
+ width: 6px;
241
+ height: 6px;
242
+ border-radius: 50%;
243
+ background: var(--accent);
244
+ }
245
+ .hero-links {
246
+ font-family: var(--font-mono);
247
+ font-size: 13px;
248
+ color: var(--fg-muted);
249
+ margin-bottom: 12px;
250
+ }
251
+ .hero-links a {
252
+ color: var(--accent);
253
+ text-decoration: none;
254
+ }
255
+ .hero-links a:hover {
256
+ text-decoration: underline;
257
+ text-decoration-style: wavy;
258
+ text-underline-offset: 3px;
259
+ }
260
+ .hero-links a:focus-visible {
261
+ outline: 2px solid var(--accent);
262
+ outline-offset: 2px;
263
+ border-radius: var(--radius-sm);
264
+ }
265
+
266
+ /* ── Profile links ── */
267
+ .profile-links {
268
+ display: flex;
269
+ flex-wrap: wrap;
270
+ gap: 10px;
271
+ margin-top: 16px;
272
+ align-items: center;
273
+ }
274
+ .profile-links a {
275
+ display: inline-flex;
276
+ align-items: center;
277
+ gap: 6px;
278
+ font-family: var(--font-mono);
279
+ font-size: 12px;
280
+ color: var(--fg-muted);
281
+ text-decoration: none;
282
+ padding: 4px 8px;
283
+ border-radius: var(--radius-sm);
284
+ transition: color 0.15s;
285
+ }
286
+ .profile-links a:hover {
287
+ color: var(--accent);
288
+ text-decoration: underline;
289
+ text-decoration-style: wavy;
290
+ text-decoration-color: var(--sketch-color);
291
+ text-underline-offset: 3px;
292
+ }
293
+ .profile-links a:focus-visible {
294
+ outline: 2px solid var(--accent);
295
+ outline-offset: 4px;
296
+ border-radius: var(--radius-sm);
297
+ }
298
+ .profile-links a svg {
299
+ flex-shrink: 0;
300
+ }
301
+
302
+ /* ── Stats ── */
303
+ .stats-section {
304
+ padding: 32px 0 40px;
305
+ }
306
+ .stats-grid {
307
+ display: grid;
308
+ grid-template-columns: repeat(4, 1fr);
309
+ gap: 16px;
310
+ }
311
+ .stat-card {
312
+ background: var(--surface);
313
+ border: 2px solid var(--border);
314
+ border-radius: var(--radius);
315
+ padding: 20px;
316
+ text-align: center;
317
+ filter: url(#chalk-rough);
318
+ position: relative;
319
+ }
320
+ .stat-value {
321
+ font-family: var(--font-display);
322
+ font-size: clamp(28px, 4vw, 40px);
323
+ font-weight: 700;
324
+ color: var(--accent);
325
+ line-height: 1.1;
326
+ }
327
+ .stat-label {
328
+ font-family: var(--font-mono);
329
+ font-size: 11px;
330
+ text-transform: uppercase;
331
+ letter-spacing: 0.06em;
332
+ color: var(--fg-muted);
333
+ margin-top: 4px;
334
+ }
335
+
336
+ /* ── Leverage annotation ── */
337
+ .leverage-annotation {
338
+ margin: 1.5rem 0;
339
+ text-align: center;
340
+ transform: rotate(-0.5deg);
341
+ }
342
+ .leverage-annotation__numbers {
343
+ display: flex;
344
+ align-items: baseline;
345
+ justify-content: center;
346
+ gap: 0.75rem;
347
+ font-family: 'Caveat', cursive;
348
+ }
349
+ .leverage-annotation__human {
350
+ font-size: 1.25rem;
351
+ color: var(--fg-muted);
352
+ }
353
+ .leverage-annotation__agent {
354
+ font-size: 1.25rem;
355
+ color: var(--accent);
356
+ }
357
+ .leverage-annotation__arrow {
358
+ font-size: 1rem;
359
+ color: var(--fg-muted);
360
+ }
361
+ .leverage-annotation__multiplier {
362
+ font-size: 2rem;
363
+ font-weight: 700;
364
+ color: var(--fg);
365
+ text-decoration: underline wavy var(--accent);
366
+ text-underline-offset: 4px;
367
+ }
368
+
369
+ /* ── Stats row (project page) ── */
370
+ .stats-row {
371
+ display: flex;
372
+ flex-wrap: wrap;
373
+ gap: 20px;
374
+ padding: 24px 0;
375
+ border-top: 2px solid var(--border-light);
376
+ border-bottom: 2px solid var(--border-light);
377
+ margin-bottom: 32px;
378
+ }
379
+ .stat-item {
380
+ text-align: center;
381
+ min-width: 80px;
382
+ }
383
+ .stat-item-value {
384
+ font-family: var(--font-display);
385
+ font-size: 28px;
386
+ font-weight: 700;
387
+ color: var(--accent);
388
+ line-height: 1.1;
389
+ }
390
+ .stat-item-label {
391
+ font-family: var(--font-mono);
392
+ font-size: 11px;
393
+ text-transform: uppercase;
394
+ letter-spacing: 0.06em;
395
+ color: var(--fg-muted);
396
+ margin-top: 2px;
397
+ }
398
+
399
+ /* ── Section heading ── */
400
+ .section-heading {
401
+ font-family: var(--font-display);
402
+ font-size: 32px;
403
+ font-weight: 700;
404
+ color: var(--accent);
405
+ margin-bottom: 24px;
406
+ }
407
+ .heyiam-project .section-heading {
408
+ margin-bottom: 20px;
409
+ }
410
+ .heyiam-session .section-heading {
411
+ font-size: 28px;
412
+ margin-bottom: 16px;
413
+ }
414
+
415
+ /* ── Projects section ── */
416
+ .projects-section {
417
+ padding: 40px 0 48px;
418
+ }
419
+ .project-name {
420
+ font-family: var(--font-display);
421
+ font-size: 26px;
422
+ font-weight: 700;
423
+ color: var(--accent);
424
+ margin-bottom: 4px;
425
+ }
426
+ .project-name a {
427
+ color: inherit;
428
+ text-decoration: none;
429
+ }
430
+ .project-name a:hover {
431
+ text-decoration: underline;
432
+ text-decoration-style: wavy;
433
+ text-decoration-color: var(--accent);
434
+ text-underline-offset: 3px;
435
+ }
436
+ .project-name a:focus-visible {
437
+ outline: 2px solid var(--accent);
438
+ outline-offset: 4px;
439
+ border-radius: var(--radius-sm);
440
+ }
441
+ .project-narrative {
442
+ font-size: 14px;
443
+ color: var(--fg-muted);
444
+ margin-bottom: 16px;
445
+ line-height: 1.65;
446
+ }
447
+ .project-meta {
448
+ display: flex;
449
+ flex-wrap: wrap;
450
+ gap: 16px;
451
+ margin-bottom: 16px;
452
+ font-family: var(--font-mono);
453
+ font-size: 12px;
454
+ color: var(--fg-muted);
455
+ }
456
+ .project-meta span {
457
+ display: inline-flex;
458
+ align-items: center;
459
+ gap: 6px;
460
+ }
461
+ .project-meta span::before {
462
+ content: '';
463
+ display: inline-block;
464
+ width: 6px;
465
+ height: 6px;
466
+ border-radius: 50%;
467
+ background: var(--accent);
468
+ }
469
+
470
+ /* ── Source bar (portfolio project cards) ── */
471
+ .source-bar {
472
+ height: 10px;
473
+ border-radius: 5px;
474
+ background: var(--border-light);
475
+ overflow: hidden;
476
+ margin-bottom: 8px;
477
+ border: 1.5px solid var(--border);
478
+ filter: url(#chalk-rough);
479
+ }
480
+ .source-fill {
481
+ height: 100%;
482
+ background: var(--accent);
483
+ border-radius: 5px;
484
+ }
485
+ .source-legend {
486
+ display: flex;
487
+ gap: 16px;
488
+ font-family: var(--font-mono);
489
+ font-size: 11px;
490
+ color: var(--fg-muted);
491
+ margin-bottom: 16px;
492
+ }
493
+ .source-legend span {
494
+ display: inline-flex;
495
+ align-items: center;
496
+ gap: 4px;
497
+ }
498
+ .source-legend .dot-claude {
499
+ width: 8px;
500
+ height: 8px;
501
+ border-radius: 50%;
502
+ background: var(--accent);
503
+ display: inline-block;
504
+ }
505
+ .source-legend .dot-cursor {
506
+ width: 8px;
507
+ height: 8px;
508
+ border-radius: 50%;
509
+ background: var(--border);
510
+ display: inline-block;
511
+ }
512
+
513
+ /* ── Clickable cards ── */
514
+ a.project-card, a.session-card {
515
+ text-decoration: none;
516
+ color: inherit;
517
+ display: block;
518
+ transition: transform 0.15s ease, box-shadow 0.15s ease;
519
+ }
520
+ a.project-card:hover, a.session-card:hover {
521
+ transform: translateY(-2px);
522
+ }
523
+
524
+ /* ── Narrative ── */
525
+ .narrative-section {
526
+ padding: 32px 0;
527
+ }
528
+ .narrative p {
529
+ font-size: 15px;
530
+ color: var(--fg);
531
+ margin-bottom: 16px;
532
+ line-height: 1.7;
533
+ }
534
+ .narrative p:last-child {
535
+ margin-bottom: 0;
536
+ }
537
+
538
+ /* ── Screenshot ── */
539
+ .screenshot {
540
+ background: linear-gradient(135deg, var(--border-light) 0%, var(--border) 100%);
541
+ border: 2px solid var(--border);
542
+ border-radius: var(--radius);
543
+ height: 280px;
544
+ display: flex;
545
+ align-items: center;
546
+ justify-content: center;
547
+ font-family: var(--font-display);
548
+ font-size: 24px;
549
+ color: var(--fg-muted);
550
+ margin-bottom: 32px;
551
+ filter: url(#chalk-rough);
552
+ position: relative;
553
+ overflow: hidden;
554
+ }
555
+ .screenshot-chrome {
556
+ position: absolute;
557
+ top: 0;
558
+ inset-inline-start: 0;
559
+ inset-inline-end: 0;
560
+ height: 32px;
561
+ background: var(--surface);
562
+ border-bottom: 1px solid var(--border);
563
+ display: flex;
564
+ align-items: center;
565
+ padding-inline-start: 12px;
566
+ gap: 6px;
567
+ }
568
+ .chrome-dot {
569
+ width: 10px;
570
+ height: 10px;
571
+ border-radius: 50%;
572
+ border: 1.5px solid var(--border);
573
+ }
574
+
575
+ /* ── Timeline / chart sections ── */
576
+ .timeline-section {
577
+ padding: 32px 0;
578
+ }
579
+ .timeline-chart {
580
+ width: 100%;
581
+ overflow-x: auto;
582
+ }
583
+ .timeline-chart svg {
584
+ display: block;
585
+ width: 100%;
586
+ height: auto;
587
+ }
588
+
589
+ /* ── Phases ── */
590
+ .phases-section {
591
+ padding: 32px 0;
592
+ }
593
+ .phase-list {
594
+ list-style: none;
595
+ position: relative;
596
+ padding-inline-start: 32px;
597
+ }
598
+ .phase-list::before {
599
+ content: '';
600
+ position: absolute;
601
+ inset-inline-start: 11px;
602
+ top: 8px;
603
+ bottom: 8px;
604
+ width: 2px;
605
+ background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2' height='10'%3E%3Cline x1='1' y1='0' x2='1' y2='6' stroke='%23cbd5e1' stroke-width='2' stroke-dasharray='4 3'/%3E%3C/svg%3E") repeat-y;
606
+ }
607
+ .phase-item {
608
+ position: relative;
609
+ padding-bottom: 28px;
610
+ }
611
+ .phase-item:last-child {
612
+ padding-bottom: 0;
613
+ }
614
+ .phase-circle {
615
+ position: absolute;
616
+ inset-inline-start: -32px;
617
+ top: 2px;
618
+ width: 24px;
619
+ height: 24px;
620
+ }
621
+ .phase-circle circle {
622
+ fill: var(--surface);
623
+ stroke: var(--accent);
624
+ stroke-width: 2;
625
+ }
626
+ .phase-circle text {
627
+ font-family: var(--font-display);
628
+ font-size: 12px;
629
+ fill: var(--accent);
630
+ text-anchor: middle;
631
+ dominant-baseline: central;
632
+ }
633
+ .phase-name {
634
+ font-family: var(--font-display);
635
+ font-size: 22px;
636
+ font-weight: 700;
637
+ color: var(--accent);
638
+ }
639
+ .phase-dates {
640
+ font-family: var(--font-mono);
641
+ font-size: 12px;
642
+ color: var(--fg-muted);
643
+ margin-bottom: 4px;
644
+ }
645
+ .phase-desc {
646
+ font-size: 14px;
647
+ color: var(--fg-muted);
648
+ }
649
+
650
+ /* ── Key decisions ── */
651
+ .decisions-section {
652
+ padding: 32px 0;
653
+ }
654
+ .decision-list {
655
+ list-style: none;
656
+ counter-reset: decisions;
657
+ }
658
+ .decision-item {
659
+ counter-increment: decisions;
660
+ padding: 16px 20px;
661
+ background: var(--surface);
662
+ border: 2px solid var(--border);
663
+ border-radius: var(--radius);
664
+ margin-bottom: 12px;
665
+ font-size: 14px;
666
+ color: var(--fg);
667
+ display: flex;
668
+ align-items: flex-start;
669
+ gap: 12px;
670
+ filter: url(#chalk-rough);
671
+ }
672
+ .decision-item::before {
673
+ counter-increment: decisions;
674
+ content: counter(decisions);
675
+ font-family: var(--font-display);
676
+ font-size: 24px;
677
+ font-weight: 700;
678
+ color: var(--accent);
679
+ flex-shrink: 0;
680
+ line-height: 1;
681
+ min-width: 20px;
682
+ text-align: center;
683
+ }
684
+
685
+ /* ── Source breakdown ── */
686
+ .source-section {
687
+ padding: 32px 0;
688
+ }
689
+ .source-bar-lg {
690
+ height: 16px;
691
+ border-radius: 8px;
692
+ background: var(--border-light);
693
+ overflow: hidden;
694
+ margin-bottom: 12px;
695
+ border: 2px solid var(--border);
696
+ filter: url(#chalk-rough);
697
+ }
698
+ .source-fill-lg {
699
+ height: 100%;
700
+ background: var(--accent);
701
+ border-radius: 8px;
702
+ }
703
+ .source-legend-lg {
704
+ display: flex;
705
+ gap: 24px;
706
+ font-family: var(--font-mono);
707
+ font-size: 13px;
708
+ color: var(--fg-muted);
709
+ }
710
+ .source-legend-lg span {
711
+ display: inline-flex;
712
+ align-items: center;
713
+ gap: 6px;
714
+ }
715
+ .dot-claude-lg {
716
+ width: 10px;
717
+ height: 10px;
718
+ border-radius: 50%;
719
+ background: var(--accent);
720
+ display: inline-block;
721
+ }
722
+ .dot-cursor-lg {
723
+ width: 10px;
724
+ height: 10px;
725
+ border-radius: 50%;
726
+ background: var(--border);
727
+ display: inline-block;
728
+ }
729
+
730
+ /* ── Skills ── */
731
+ .skills-section {
732
+ padding: 32px 0;
733
+ }
734
+ .skills-list {
735
+ display: flex;
736
+ flex-wrap: wrap;
737
+ gap: 8px;
738
+ list-style: none;
739
+ }
740
+ .skill-chip {
741
+ font-family: var(--font-mono);
742
+ font-size: 12px;
743
+ padding: 4px 12px;
744
+ color: var(--accent);
745
+ background: transparent;
746
+ text-decoration: underline;
747
+ text-decoration-style: wavy;
748
+ text-decoration-color: var(--sketch-color);
749
+ text-underline-offset: 3px;
750
+ text-decoration-thickness: 1.5px;
751
+ }
752
+ /* Session sidebar uses smaller skill chips */
753
+ .heyiam-session .sidebar .skill-chip {
754
+ font-size: 11px;
755
+ padding: 3px 10px;
756
+ }
757
+ /* Session sidebar uses smaller gap for skills */
758
+ .heyiam-session .sidebar .skills-list {
759
+ gap: 6px;
760
+ }
761
+
762
+ /* ── Sessions table ── */
763
+ .sessions-section {
764
+ padding: 32px 0;
765
+ }
766
+ .sessions-table {
767
+ width: 100%;
768
+ border-collapse: separate;
769
+ border-spacing: 0;
770
+ font-size: 13px;
771
+ }
772
+ .sessions-table thead th {
773
+ font-family: var(--font-mono);
774
+ font-size: 11px;
775
+ text-transform: uppercase;
776
+ letter-spacing: 0.06em;
777
+ color: var(--fg-muted);
778
+ text-align: start;
779
+ padding: 8px 12px;
780
+ border-bottom: 2px solid var(--border);
781
+ font-weight: 500;
782
+ }
783
+ .sessions-table tbody td {
784
+ padding: 10px 12px;
785
+ border-bottom: 1px solid var(--border-light);
786
+ color: var(--fg);
787
+ vertical-align: top;
788
+ }
789
+ .sessions-table tbody tr:hover {
790
+ background: rgba(51, 65, 85, 0.04);
791
+ }
792
+ .session-title-link {
793
+ color: var(--accent);
794
+ text-decoration: none;
795
+ font-weight: 500;
796
+ }
797
+ .session-title-link:hover {
798
+ text-decoration: underline;
799
+ text-decoration-style: wavy;
800
+ text-underline-offset: 2px;
801
+ }
802
+ .session-title-link:focus-visible {
803
+ outline: 2px solid var(--accent);
804
+ outline-offset: 2px;
805
+ border-radius: var(--radius-sm);
806
+ }
807
+ .session-source {
808
+ font-family: var(--font-mono);
809
+ font-size: 11px;
810
+ }
811
+
812
+ /* ── Dev take ── */
813
+ .dev-take {
814
+ background: var(--surface);
815
+ border: 2px solid var(--border);
816
+ border-radius: var(--radius);
817
+ padding: 20px 24px;
818
+ margin-bottom: 32px;
819
+ font-size: 15px;
820
+ color: var(--fg);
821
+ font-style: italic;
822
+ position: relative;
823
+ filter: url(#chalk-rough);
824
+ }
825
+ .dev-take::before {
826
+ content: '';
827
+ position: absolute;
828
+ top: -12px;
829
+ inset-inline-start: 24px;
830
+ width: 24px;
831
+ height: 24px;
832
+ background: var(--surface);
833
+ border: 2px solid var(--border);
834
+ border-radius: 50%;
835
+ display: flex;
836
+ align-items: center;
837
+ justify-content: center;
838
+ }
839
+ .dev-take-label {
840
+ font-family: var(--font-display);
841
+ font-size: 20px;
842
+ font-weight: 700;
843
+ color: var(--accent);
844
+ font-style: normal;
845
+ margin-bottom: 4px;
846
+ }
847
+
848
+ /* ── Sidebar ── */
849
+ .sidebar {
850
+ position: sticky;
851
+ top: 80px;
852
+ }
853
+ .sidebar-section {
854
+ margin-bottom: 24px;
855
+ }
856
+ .sidebar-heading {
857
+ font-family: var(--font-display);
858
+ font-size: 22px;
859
+ font-weight: 700;
860
+ color: var(--accent);
861
+ margin-bottom: 12px;
862
+ }
863
+
864
+ /* ── Tools used table ── */
865
+ .tools-table {
866
+ width: 100%;
867
+ border-collapse: separate;
868
+ border-spacing: 0;
869
+ font-size: 13px;
870
+ }
871
+ .tools-table th {
872
+ font-family: var(--font-mono);
873
+ font-size: 10px;
874
+ text-transform: uppercase;
875
+ letter-spacing: 0.06em;
876
+ color: var(--fg-muted);
877
+ text-align: start;
878
+ padding: 6px 8px;
879
+ border-bottom: 2px solid var(--border);
880
+ font-weight: 500;
881
+ }
882
+ .tools-table td {
883
+ padding: 6px 8px;
884
+ border-bottom: 1px solid var(--border-light);
885
+ color: var(--fg);
886
+ }
887
+ .tools-table .tool-bar {
888
+ height: 6px;
889
+ border-radius: 3px;
890
+ background: var(--border-light);
891
+ overflow: hidden;
892
+ min-width: 60px;
893
+ }
894
+ .tools-table .tool-bar-fill {
895
+ height: 100%;
896
+ background: var(--accent);
897
+ border-radius: 3px;
898
+ }
899
+
900
+ /* ── Files changed ── */
901
+ .files-list {
902
+ list-style: none;
903
+ }
904
+ .file-item {
905
+ display: flex;
906
+ justify-content: space-between;
907
+ align-items: baseline;
908
+ padding: 6px 0;
909
+ border-bottom: 1px solid var(--border-light);
910
+ font-size: 12px;
911
+ }
912
+ .file-item:last-child {
913
+ border-bottom: none;
914
+ }
915
+ .file-name {
916
+ font-family: var(--font-mono);
917
+ font-size: 11px;
918
+ color: var(--fg);
919
+ word-break: break-all;
920
+ }
921
+ .file-diff {
922
+ font-family: var(--font-mono);
923
+ font-size: 11px;
924
+ color: var(--agent-qa);
925
+ white-space: nowrap;
926
+ margin-inline-start: 8px;
927
+ }
928
+
929
+ /* ── Execution path / Beats ── */
930
+ .beats-section {
931
+ padding: 32px 0;
932
+ }
933
+ .beat-list {
934
+ list-style: none;
935
+ position: relative;
936
+ padding-inline-start: 32px;
937
+ }
938
+ .beat-list::before {
939
+ content: '';
940
+ position: absolute;
941
+ inset-inline-start: 11px;
942
+ top: 8px;
943
+ bottom: 8px;
944
+ width: 2px;
945
+ background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2' height='10'%3E%3Cline x1='1' y1='0' x2='1' y2='6' stroke='%23cbd5e1' stroke-width='2' stroke-dasharray='4 3'/%3E%3C/svg%3E") repeat-y;
946
+ }
947
+ .beat-item {
948
+ position: relative;
949
+ padding-bottom: 24px;
950
+ }
951
+ .beat-item:last-child {
952
+ padding-bottom: 0;
953
+ }
954
+ .beat-circle {
955
+ position: absolute;
956
+ inset-inline-start: -32px;
957
+ top: 2px;
958
+ width: 24px;
959
+ height: 24px;
960
+ }
961
+ .beat-circle circle {
962
+ fill: var(--surface);
963
+ stroke: var(--accent);
964
+ stroke-width: 2;
965
+ }
966
+ .beat-circle text {
967
+ font-family: var(--font-display);
968
+ font-size: 12px;
969
+ fill: var(--accent);
970
+ text-anchor: middle;
971
+ dominant-baseline: central;
972
+ }
973
+ .beat-title {
974
+ font-family: var(--font-display);
975
+ font-size: 22px;
976
+ font-weight: 700;
977
+ color: var(--accent);
978
+ }
979
+ .beat-desc {
980
+ font-size: 14px;
981
+ color: var(--fg-muted);
982
+ margin-top: 4px;
983
+ line-height: 1.6;
984
+ }
985
+
986
+ /* ── Q&A ── */
987
+ .qa-section {
988
+ padding: 32px 0;
989
+ }
990
+ .qa-item {
991
+ margin-bottom: 24px;
992
+ }
993
+ .qa-item:last-child {
994
+ margin-bottom: 0;
995
+ }
996
+ .qa-question {
997
+ font-family: var(--font-display);
998
+ font-size: 20px;
999
+ font-weight: 600;
1000
+ color: var(--accent);
1001
+ margin-bottom: 8px;
1002
+ display: flex;
1003
+ align-items: flex-start;
1004
+ gap: 8px;
1005
+ }
1006
+ .qa-question::before {
1007
+ content: 'Q';
1008
+ font-family: var(--font-display);
1009
+ font-size: 22px;
1010
+ font-weight: 700;
1011
+ color: var(--accent);
1012
+ flex-shrink: 0;
1013
+ width: 24px;
1014
+ height: 24px;
1015
+ border: 2px solid var(--accent);
1016
+ border-radius: 50%;
1017
+ display: inline-flex;
1018
+ align-items: center;
1019
+ justify-content: center;
1020
+ line-height: 1;
1021
+ }
1022
+ .qa-answer {
1023
+ font-size: 14px;
1024
+ color: var(--fg);
1025
+ line-height: 1.7;
1026
+ padding-inline-start: 32px;
1027
+ }
1028
+
1029
+ /* ── Agent summary ── */
1030
+ .agents-section {
1031
+ padding: 32px 0;
1032
+ }
1033
+ .agent-bar-chart {
1034
+ width: 100%;
1035
+ }
1036
+ .agent-row {
1037
+ display: grid;
1038
+ grid-template-columns: 120px 1fr 80px;
1039
+ gap: 12px;
1040
+ align-items: center;
1041
+ padding: 8px 0;
1042
+ border-bottom: 1px solid var(--border-light);
1043
+ }
1044
+ .agent-row:last-child {
1045
+ border-bottom: none;
1046
+ }
1047
+ .agent-name {
1048
+ font-family: var(--font-mono);
1049
+ font-size: 12px;
1050
+ color: var(--fg);
1051
+ }
1052
+ .agent-bar {
1053
+ height: 10px;
1054
+ border-radius: 5px;
1055
+ background: var(--border-light);
1056
+ overflow: hidden;
1057
+ filter: url(#chalk-rough);
1058
+ }
1059
+ .agent-bar-fill {
1060
+ height: 100%;
1061
+ border-radius: 5px;
1062
+ }
1063
+ .agent-stats {
1064
+ font-family: var(--font-mono);
1065
+ font-size: 11px;
1066
+ color: var(--fg-muted);
1067
+ text-align: end;
1068
+ }
1069
+
1070
+ /* ── Highlights ── */
1071
+ .highlights-list {
1072
+ list-style: none;
1073
+ padding: 0;
1074
+ }
1075
+ .highlights-list li {
1076
+ font-size: 14px;
1077
+ color: var(--fg-muted);
1078
+ line-height: 1.7;
1079
+ padding: 6px 0;
1080
+ border-bottom: 1px solid var(--border-light);
1081
+ }
1082
+ .highlights-list li:last-child {
1083
+ border-bottom: none;
1084
+ }
1085
+
1086
+ /* ── Reduced motion ── */
1087
+ @media (prefers-reduced-motion: reduce) {
1088
+ *, *::before, *::after {
1089
+ animation: none !important;
1090
+ transition: none !important;
1091
+ }
1092
+ .chalk-card {
1093
+ opacity: 1;
1094
+ }
1095
+ }
1096
+
1097
+ /* ── Responsive ── */
1098
+ @media (max-width: 768px) {
1099
+ .layout-grid {
1100
+ grid-template-columns: 1fr;
1101
+ }
1102
+ .sidebar {
1103
+ position: static;
1104
+ order: -1;
1105
+ }
1106
+ .hero {
1107
+ padding: 36px 0 28px;
1108
+ }
1109
+ .hero-photo {
1110
+ width: 80px;
1111
+ height: 100px;
1112
+ }
1113
+ .hero h1 {
1114
+ font-size: 2rem;
1115
+ }
1116
+ .stats-grid {
1117
+ grid-template-columns: repeat(2, 1fr);
1118
+ }
1119
+ .stats-row {
1120
+ gap: 12px;
1121
+ }
1122
+ .stat-item {
1123
+ min-width: 70px;
1124
+ }
1125
+ .hero-meta {
1126
+ gap: 8px;
1127
+ }
1128
+ .agent-row {
1129
+ grid-template-columns: 100px 1fr 60px;
1130
+ gap: 8px;
1131
+ }
1132
+ .sessions-table {
1133
+ font-size: 12px;
1134
+ }
1135
+ .sessions-table thead th,
1136
+ .sessions-table tbody td {
1137
+ padding: 8px 6px;
1138
+ }
1139
+ .sessions-table .hide-mobile {
1140
+ display: none;
1141
+ }
1142
+ .profile-links {
1143
+ font-size: 11px;
1144
+ }
1145
+ .chalk-card {
1146
+ transform: none !important;
1147
+ }
1148
+ .footer-inner {
1149
+ flex-direction: column;
1150
+ gap: 8px;
1151
+ text-align: center;
1152
+ }
1153
+ .nav-inner {
1154
+ flex-direction: column;
1155
+ gap: 12px;
1156
+ }
1157
+ }
1158
+
1159
+
1160
+ /* Live-edit empty field hiding */
1161
+ [data-portfolio-empty="true"] { display: none; }