heyiam 0.2.28 → 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-B_d6DlEI.js +0 -21
  177. package/dist/public/assets/index-Dalqz2mC.css +0 -1
@@ -0,0 +1,1436 @@
1
+ /* ── Canvas Template Styles ── */
2
+
3
+ /* ── Design Tokens ── */
4
+ .canvas {
5
+ --canvas-bg: #ffffff;
6
+ --canvas-surface: #fafafa;
7
+ --canvas-accent: #fb7185;
8
+ --canvas-accent-light: #fecdd3;
9
+ --canvas-accent-dark: #e11d48;
10
+ --canvas-text: #18181b;
11
+ --canvas-text-secondary: #71717a;
12
+ --canvas-text-tertiary: #a1a1aa;
13
+ --canvas-border: #e4e4e7;
14
+ --canvas-border-light: #f4f4f5;
15
+ --canvas-gray: #d4d4d8;
16
+ --canvas-font-display: 'DM Sans', system-ui, sans-serif;
17
+ --canvas-font-body: 'Inter', system-ui, sans-serif;
18
+ --canvas-font-mono: 'IBM Plex Mono', monospace;
19
+ --canvas-radius: 20px;
20
+ --canvas-radius-lg: 24px;
21
+ --canvas-radius-sm: 12px;
22
+ --canvas-radius-pill: 9999px;
23
+ --canvas-duration: 800ms;
24
+ --canvas-ease: cubic-bezier(0.25, 0.46, 0.45, 0.94);
25
+
26
+ /* Agent role colors */
27
+ --agent-frontend: #7c3aed;
28
+ --agent-backend: #0891b2;
29
+ --agent-qa: #059669;
30
+ --agent-security: #475569;
31
+ --agent-reviewer: #e11d48;
32
+ --agent-ux: #d97706;
33
+
34
+ font-family: var(--canvas-font-body);
35
+ color: var(--canvas-text);
36
+ line-height: 1.6;
37
+ -webkit-font-smoothing: antialiased;
38
+ -moz-osx-font-smoothing: grayscale;
39
+ font-size: 16px;
40
+ }
41
+
42
+ /* ── Animations ── */
43
+ @keyframes fadeIn {
44
+ from { opacity: 0; transform: translateY(12px); }
45
+ to { opacity: 1; transform: translateY(0); }
46
+ }
47
+
48
+ .canvas .fade-in {
49
+ opacity: 0;
50
+ animation: fadeIn var(--canvas-duration) var(--canvas-ease) forwards;
51
+ }
52
+ .canvas .fade-in-d1 { animation-delay: 100ms; }
53
+ .canvas .fade-in-d2 { animation-delay: 200ms; }
54
+ .canvas .fade-in-d3 { animation-delay: 300ms; }
55
+ .canvas .fade-in-d4 { animation-delay: 400ms; }
56
+ .canvas .fade-in-d5 { animation-delay: 500ms; }
57
+ .canvas .fade-in-d6 { animation-delay: 600ms; }
58
+ .canvas .fade-in-d7 { animation-delay: 700ms; }
59
+ .canvas .fade-in-d8 { animation-delay: 800ms; }
60
+
61
+ @media (prefers-reduced-motion: reduce) {
62
+ .canvas .fade-in {
63
+ animation: none;
64
+ opacity: 1;
65
+ transform: none;
66
+ }
67
+ .canvas .agent-bar-fill {
68
+ transition: none;
69
+ }
70
+ }
71
+
72
+ /* ── Links ── */
73
+ .canvas a {
74
+ color: var(--canvas-accent-dark);
75
+ text-decoration: none;
76
+ transition: color 200ms ease;
77
+ }
78
+ .canvas a:hover {
79
+ color: var(--canvas-accent);
80
+ }
81
+ .canvas a:visited {
82
+ color: var(--canvas-accent-dark);
83
+ }
84
+ .canvas a:focus-visible {
85
+ outline: 2px solid var(--canvas-accent);
86
+ outline-offset: 3px;
87
+ border-radius: 4px;
88
+ }
89
+
90
+ /* ── Skip Link ── */
91
+ .canvas .skip-link {
92
+ position: absolute;
93
+ top: -100%;
94
+ left: 1rem;
95
+ background: var(--canvas-accent);
96
+ color: #fff;
97
+ padding: 0.5rem 1rem;
98
+ border-radius: var(--canvas-radius-sm);
99
+ z-index: 1000;
100
+ font-family: var(--canvas-font-mono);
101
+ font-size: 0.8125rem;
102
+ text-decoration: none;
103
+ }
104
+ .canvas .skip-link:focus {
105
+ top: 0.5rem;
106
+ color: #fff;
107
+ }
108
+
109
+ /* ── Navigation ── */
110
+ .canvas .nav {
111
+ display: flex;
112
+ align-items: center;
113
+ justify-content: space-between;
114
+ padding: 1.5rem 0;
115
+ margin-block-end: 40px;
116
+ }
117
+ .canvas .nav__logo {
118
+ font-family: var(--canvas-font-display);
119
+ font-size: 1.25rem;
120
+ font-weight: 700;
121
+ color: var(--canvas-text);
122
+ text-decoration: none;
123
+ }
124
+ .canvas .nav__links {
125
+ display: flex;
126
+ gap: 2rem;
127
+ list-style: none;
128
+ }
129
+ .canvas .nav__links a {
130
+ font-family: var(--canvas-font-body);
131
+ font-size: 0.9375rem;
132
+ font-weight: 500;
133
+ color: var(--canvas-text-secondary);
134
+ text-decoration: none;
135
+ transition: color 200ms ease;
136
+ }
137
+ .canvas .nav__links a:hover,
138
+ .canvas .nav__links a[aria-current="page"] {
139
+ color: var(--canvas-text);
140
+ }
141
+
142
+ /* ── Layout ── */
143
+ .canvas .page-wrapper {
144
+ max-width: 1200px;
145
+ margin: 0 auto;
146
+ padding: 0 1.5rem;
147
+ }
148
+ .canvas .page-content {
149
+ max-width: 1200px;
150
+ margin: 0 auto;
151
+ padding: 0 1.5rem;
152
+ }
153
+ .canvas .content-layout {
154
+ display: grid;
155
+ grid-template-columns: 1fr 300px;
156
+ gap: 4rem;
157
+ align-items: start;
158
+ }
159
+
160
+ /* ── Breadcrumb ── */
161
+ .canvas .breadcrumb {
162
+ font-family: var(--canvas-font-mono);
163
+ font-size: 0.8125rem;
164
+ color: var(--canvas-text-tertiary);
165
+ margin-block-end: 2rem;
166
+ }
167
+ .canvas .breadcrumb a {
168
+ color: var(--canvas-text-tertiary);
169
+ text-decoration: none;
170
+ }
171
+ .canvas .breadcrumb a:hover {
172
+ color: var(--canvas-accent);
173
+ }
174
+ .canvas .breadcrumb__sep {
175
+ margin-inline: 0.375rem;
176
+ color: var(--canvas-border);
177
+ }
178
+
179
+ /* ── Section Title ── */
180
+ .canvas .section-title {
181
+ font-family: var(--canvas-font-display);
182
+ font-size: 1.5rem;
183
+ font-weight: 600;
184
+ letter-spacing: -0.02em;
185
+ margin-block-end: 2.5rem;
186
+ }
187
+ .canvas.heyiam-session .section-title {
188
+ margin-block-end: 2rem;
189
+ }
190
+
191
+ /* ── Stat ── */
192
+ .canvas .stat {
193
+ text-align: center;
194
+ }
195
+ .canvas .stat__number {
196
+ font-family: var(--canvas-font-display);
197
+ font-size: clamp(1.5rem, 3vw, 2.25rem);
198
+ font-weight: 700;
199
+ line-height: 1;
200
+ color: var(--canvas-text);
201
+ letter-spacing: -0.03em;
202
+ }
203
+ .canvas.heyiam-project .stat__number {
204
+ font-size: clamp(1.75rem, 4vw, 2.75rem);
205
+ }
206
+ .canvas .stat__label {
207
+ font-family: var(--canvas-font-mono);
208
+ font-size: 0.6875rem;
209
+ color: var(--canvas-text-tertiary);
210
+ text-transform: uppercase;
211
+ letter-spacing: 0.1em;
212
+ margin-block-start: 0.5rem;
213
+ }
214
+
215
+ /* ── Skill Pill ── */
216
+ .canvas .skill-pill {
217
+ display: inline-block;
218
+ background: var(--canvas-accent);
219
+ color: #fff;
220
+ font-family: var(--canvas-font-mono);
221
+ font-size: 0.6875rem;
222
+ font-weight: 500;
223
+ padding: 0.375rem 0.875rem;
224
+ border-radius: var(--canvas-radius-pill);
225
+ letter-spacing: 0.02em;
226
+ }
227
+ .canvas .skill-pill--lg {
228
+ font-size: 0.8125rem;
229
+ padding: 0.5rem 1.25rem;
230
+ }
231
+ .canvas .skill-pill--secondary {
232
+ background: var(--canvas-accent-light);
233
+ color: var(--canvas-accent-dark);
234
+ }
235
+
236
+ /* ══════════════════════════════════════════════════
237
+ PORTFOLIO
238
+ ══════════════════════════════════════════════════ */
239
+
240
+ /* ── Hero Split (Magazine Spread) ── */
241
+ .canvas .hero-split {
242
+ display: grid;
243
+ grid-template-columns: 1fr 1fr;
244
+ min-height: 100vh;
245
+ position: relative;
246
+ }
247
+ .canvas .hero-photo-container {
248
+ position: relative;
249
+ overflow: hidden;
250
+ }
251
+ .canvas .hero-photo {
252
+ width: 100%;
253
+ height: 100%;
254
+ object-fit: cover;
255
+ object-position: center 10%;
256
+ display: block;
257
+ }
258
+ .canvas .hero-content {
259
+ display: flex;
260
+ flex-direction: column;
261
+ justify-content: center;
262
+ padding: 6rem 3.5rem 4rem;
263
+ }
264
+ .canvas .hero__name {
265
+ font-family: var(--canvas-font-display);
266
+ font-size: clamp(2.5rem, 4vw, 3.5rem);
267
+ font-weight: 700;
268
+ letter-spacing: -0.03em;
269
+ line-height: 1.05;
270
+ margin-block-end: 0.5rem;
271
+ }
272
+ .canvas .hero__location {
273
+ font-family: var(--canvas-font-mono);
274
+ font-size: 0.8125rem;
275
+ color: var(--canvas-text-tertiary);
276
+ letter-spacing: 0.02em;
277
+ margin-block-end: 2rem;
278
+ }
279
+ .canvas .hero__bio {
280
+ font-size: 1.125rem;
281
+ color: var(--canvas-text-secondary);
282
+ line-height: 1.7;
283
+ max-width: 480px;
284
+ margin-block-end: 2.5rem;
285
+ }
286
+
287
+ /* ── Contact Links ── */
288
+ .canvas .hero__links {
289
+ display: flex;
290
+ flex-direction: column;
291
+ gap: 0.875rem;
292
+ list-style: none;
293
+ margin-block-end: 3rem;
294
+ }
295
+ .canvas .hero__links a {
296
+ display: inline-flex;
297
+ align-items: center;
298
+ gap: 0.625rem;
299
+ font-family: var(--canvas-font-mono);
300
+ font-size: 0.8125rem;
301
+ color: var(--canvas-text-secondary);
302
+ transition: color 200ms ease;
303
+ }
304
+ .canvas .hero__links a:hover {
305
+ color: var(--canvas-accent-dark);
306
+ }
307
+ .canvas .hero__links svg {
308
+ flex-shrink: 0;
309
+ color: var(--canvas-text-tertiary);
310
+ }
311
+ .canvas .hero__links a:hover svg {
312
+ color: var(--canvas-accent);
313
+ }
314
+
315
+ /* ── Hero Stats ── */
316
+ .canvas .hero-divider {
317
+ width: 40px;
318
+ height: 2px;
319
+ background: var(--canvas-accent);
320
+ border: none;
321
+ margin-block-end: 1.5rem;
322
+ }
323
+ .canvas .hero-stats {
324
+ display: grid;
325
+ grid-template-columns: repeat(2, 1fr);
326
+ gap: 1.5rem 2.5rem;
327
+ max-width: 360px;
328
+ }
329
+ .canvas .hero-stat {
330
+ display: flex;
331
+ flex-direction: column;
332
+ }
333
+ .canvas .hero-stat__number {
334
+ font-family: var(--canvas-font-display);
335
+ font-size: clamp(1.75rem, 3vw, 2.5rem);
336
+ font-weight: 700;
337
+ line-height: 1;
338
+ color: var(--canvas-text);
339
+ letter-spacing: -0.03em;
340
+ }
341
+ .canvas .hero-stat__label {
342
+ font-family: var(--canvas-font-mono);
343
+ font-size: 0.6875rem;
344
+ color: var(--canvas-text-tertiary);
345
+ text-transform: uppercase;
346
+ letter-spacing: 0.1em;
347
+ margin-block-start: 0.375rem;
348
+ }
349
+
350
+ /* ── Leverage ── */
351
+ .canvas .canvas-leverage {
352
+ text-align: center;
353
+ padding: 2.5rem 1rem;
354
+ }
355
+ .canvas .canvas-leverage__multi {
356
+ font-family: var(--canvas-font-display);
357
+ font-size: 1.75rem;
358
+ font-weight: 700;
359
+ color: var(--canvas-accent);
360
+ line-height: 1;
361
+ }
362
+ .canvas .canvas-leverage__context {
363
+ font-family: var(--canvas-font-mono);
364
+ font-size: 0.75rem;
365
+ color: var(--canvas-text-secondary);
366
+ margin-block-start: 0.375rem;
367
+ letter-spacing: 0.02em;
368
+ }
369
+ .canvas .canvas-leverage__underline {
370
+ width: 60px;
371
+ height: 2px;
372
+ background: var(--canvas-accent-light);
373
+ margin: 0.75rem auto 0;
374
+ border-radius: 1px;
375
+ }
376
+
377
+ /* ── Project Cards ── */
378
+ .canvas .projects-section {
379
+ padding: 100px 0;
380
+ }
381
+ .canvas .projects-grid {
382
+ display: grid;
383
+ grid-template-columns: repeat(auto-fill, minmax(min(100%, 340px), 1fr));
384
+ gap: 2rem;
385
+ }
386
+ .canvas .project-card {
387
+ background: var(--canvas-surface);
388
+ border-radius: var(--canvas-radius-lg);
389
+ padding: 2.5rem;
390
+ transition: transform 300ms var(--canvas-ease), box-shadow 300ms var(--canvas-ease);
391
+ text-decoration: none;
392
+ color: inherit;
393
+ display: block;
394
+ }
395
+ .canvas .project-card:hover {
396
+ transform: translateY(-4px);
397
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.06);
398
+ color: inherit;
399
+ }
400
+ .canvas .project-card:focus-visible {
401
+ outline: 2px solid var(--canvas-accent);
402
+ outline-offset: 3px;
403
+ }
404
+ .canvas .project-card__header {
405
+ display: flex;
406
+ align-items: flex-start;
407
+ justify-content: space-between;
408
+ margin-block-end: 1rem;
409
+ gap: 1rem;
410
+ }
411
+ .canvas .project-card__title {
412
+ font-family: var(--canvas-font-display);
413
+ font-size: 1.5rem;
414
+ font-weight: 700;
415
+ letter-spacing: -0.02em;
416
+ }
417
+ .canvas .project-card__stats {
418
+ font-family: var(--canvas-font-mono);
419
+ font-size: 0.75rem;
420
+ color: var(--canvas-text-tertiary);
421
+ white-space: nowrap;
422
+ flex-shrink: 0;
423
+ margin-block-start: 0.25rem;
424
+ }
425
+ .canvas .project-card__narrative {
426
+ font-size: 1rem;
427
+ color: var(--canvas-text-secondary);
428
+ line-height: 1.7;
429
+ margin-block-end: 1.5rem;
430
+ max-width: 640px;
431
+ }
432
+ .canvas .project-card__footer {
433
+ display: flex;
434
+ align-items: center;
435
+ justify-content: space-between;
436
+ flex-wrap: wrap;
437
+ gap: 1rem;
438
+ }
439
+ .canvas .project-card__skills {
440
+ display: flex;
441
+ flex-wrap: wrap;
442
+ gap: 0.5rem;
443
+ }
444
+
445
+ /* ══════════════════════════════════════════════════
446
+ PROJECT
447
+ ══════════════════════════════════════════════════ */
448
+
449
+ /* ── Project Hero ── */
450
+ .canvas .project-hero {
451
+ padding-block-end: 80px;
452
+ }
453
+ .canvas .project-hero__title {
454
+ font-family: var(--canvas-font-display);
455
+ font-size: clamp(2.25rem, 5vw, 3.5rem);
456
+ font-weight: 700;
457
+ letter-spacing: -0.03em;
458
+ line-height: 1.1;
459
+ margin-block-end: 1rem;
460
+ }
461
+ .canvas .project-hero__links {
462
+ font-family: var(--canvas-font-mono);
463
+ font-size: 0.8125rem;
464
+ display: flex;
465
+ gap: 1.5rem;
466
+ }
467
+ .canvas .project-hero__links a {
468
+ color: var(--canvas-text-secondary);
469
+ text-decoration: underline;
470
+ text-decoration-color: var(--canvas-border);
471
+ text-underline-offset: 3px;
472
+ }
473
+ .canvas .project-hero__links a:hover {
474
+ color: var(--canvas-accent);
475
+ text-decoration-color: var(--canvas-accent);
476
+ }
477
+
478
+ /* ── Screenshot ── */
479
+ .canvas .screenshot {
480
+ margin-block-end: 100px;
481
+ border: 1px solid #e4e4e7;
482
+ border-radius: var(--canvas-radius-lg);
483
+ overflow: hidden;
484
+ background: #fafafa;
485
+ }
486
+ .canvas .screenshot__bar {
487
+ display: flex;
488
+ align-items: center;
489
+ gap: 6px;
490
+ padding: 0.625rem 1rem;
491
+ background: #fafafa;
492
+ border-block-end: 1px solid #e4e4e7;
493
+ }
494
+ .canvas .screenshot__dot {
495
+ width: 10px;
496
+ height: 10px;
497
+ border-radius: 50%;
498
+ background: #d4d4d8;
499
+ }
500
+ .canvas .screenshot__url {
501
+ margin-inline-start: auto;
502
+ font-family: var(--font-mono, 'IBM Plex Mono', monospace);
503
+ font-size: 0.75rem;
504
+ color: #a1a1aa;
505
+ }
506
+ .canvas .screenshot__viewport {
507
+ overflow-y: auto;
508
+ }
509
+ .canvas .screenshot__image {
510
+ width: 100%;
511
+ display: block;
512
+ }
513
+
514
+ /* ── Narrative ── */
515
+ .canvas .narrative {
516
+ padding-block-end: 100px;
517
+ }
518
+ .canvas .narrative p {
519
+ font-size: 1.125rem;
520
+ line-height: 1.8;
521
+ color: var(--canvas-text-secondary);
522
+ margin-block-end: 1.75rem;
523
+ }
524
+ .canvas .narrative p:last-child {
525
+ margin-block-end: 0;
526
+ }
527
+
528
+ /* ── Project Stats ── */
529
+ .canvas .project-stats {
530
+ display: flex;
531
+ justify-content: center;
532
+ gap: clamp(2rem, 5vw, 4rem);
533
+ padding-block-end: 100px;
534
+ flex-wrap: wrap;
535
+ }
536
+
537
+ /* ── Phase Timeline ── */
538
+ .canvas .phases-section {
539
+ padding-block-end: 100px;
540
+ }
541
+ .canvas .phases-scroll {
542
+ display: flex;
543
+ gap: 1.5rem;
544
+ overflow-x: auto;
545
+ padding-block-end: 1rem;
546
+ scroll-snap-type: x mandatory;
547
+ -webkit-overflow-scrolling: touch;
548
+ }
549
+ .canvas .phases-scroll::-webkit-scrollbar {
550
+ height: 4px;
551
+ }
552
+ .canvas .phases-scroll::-webkit-scrollbar-track {
553
+ background: var(--canvas-border-light);
554
+ border-radius: 2px;
555
+ }
556
+ .canvas .phases-scroll::-webkit-scrollbar-thumb {
557
+ background: var(--canvas-border);
558
+ border-radius: 2px;
559
+ }
560
+ .canvas .phase-card {
561
+ flex: 0 0 280px;
562
+ background: var(--canvas-surface);
563
+ border-radius: var(--canvas-radius);
564
+ padding: 2rem;
565
+ scroll-snap-align: start;
566
+ }
567
+ .canvas .phase-card__number {
568
+ font-family: var(--canvas-font-display);
569
+ font-size: 2.5rem;
570
+ font-weight: 700;
571
+ color: var(--canvas-accent);
572
+ line-height: 1;
573
+ margin-block-end: 0.75rem;
574
+ }
575
+ .canvas .phase-card__name {
576
+ font-family: var(--canvas-font-display);
577
+ font-size: 1.125rem;
578
+ font-weight: 600;
579
+ margin-block-end: 0.375rem;
580
+ }
581
+ .canvas .phase-card__dates {
582
+ font-family: var(--canvas-font-mono);
583
+ font-size: 0.6875rem;
584
+ color: var(--canvas-text-tertiary);
585
+ margin-block-end: 0.75rem;
586
+ letter-spacing: 0.02em;
587
+ }
588
+ .canvas .phase-card__desc {
589
+ font-size: 0.9375rem;
590
+ color: var(--canvas-text-secondary);
591
+ line-height: 1.6;
592
+ }
593
+
594
+ /* ── Work Timeline / Growth Chart ── */
595
+ .canvas .timeline-section {
596
+ padding-block-end: 100px;
597
+ }
598
+ .canvas .chart-container {
599
+ background: var(--canvas-surface);
600
+ border-radius: var(--canvas-radius-lg);
601
+ padding: 2rem;
602
+ overflow-x: auto;
603
+ }
604
+ .canvas .chart-container svg {
605
+ display: block;
606
+ width: 100%;
607
+ min-width: 600px;
608
+ }
609
+
610
+ /* ── Skills ── */
611
+ .canvas .skills-section {
612
+ padding-block-end: 100px;
613
+ }
614
+ .canvas .skills-list {
615
+ display: flex;
616
+ flex-wrap: wrap;
617
+ gap: 0.75rem;
618
+ }
619
+
620
+ /* ── Key Decisions ── */
621
+ .canvas .decisions-section {
622
+ padding-block-end: 100px;
623
+ }
624
+ .canvas .decisions-list {
625
+ list-style: none;
626
+ max-width: 720px;
627
+ }
628
+ .canvas .decisions-list li {
629
+ padding: 1.25rem 0;
630
+ border-bottom: 1px solid var(--canvas-border-light);
631
+ display: flex;
632
+ gap: 1rem;
633
+ align-items: flex-start;
634
+ }
635
+ .canvas .decisions-list li:last-child {
636
+ border-bottom: none;
637
+ }
638
+ .canvas .decision-num {
639
+ font-family: var(--canvas-font-display);
640
+ font-size: 1.5rem;
641
+ font-weight: 700;
642
+ color: var(--canvas-accent);
643
+ flex-shrink: 0;
644
+ width: 2rem;
645
+ line-height: 1.4;
646
+ }
647
+ .canvas .decision-text {
648
+ font-size: 1rem;
649
+ color: var(--canvas-text-secondary);
650
+ line-height: 1.6;
651
+ }
652
+
653
+ /* ── Source Breakdown ── */
654
+ .canvas .source-section {
655
+ padding-block-end: 100px;
656
+ }
657
+ .canvas .source-visual {
658
+ display: flex;
659
+ align-items: center;
660
+ gap: 2rem;
661
+ flex-wrap: wrap;
662
+ }
663
+ .canvas .source-legend {
664
+ display: flex;
665
+ gap: 1.5rem;
666
+ font-family: var(--canvas-font-mono);
667
+ font-size: 0.8125rem;
668
+ color: var(--canvas-text-secondary);
669
+ }
670
+ .canvas .source-legend__item {
671
+ display: flex;
672
+ align-items: center;
673
+ gap: 0.5rem;
674
+ }
675
+ .canvas .source-legend__dot {
676
+ width: 10px;
677
+ height: 10px;
678
+ border-radius: 50%;
679
+ flex-shrink: 0;
680
+ }
681
+ .canvas .source-bar-large {
682
+ flex: 1;
683
+ min-width: 200px;
684
+ height: 12px;
685
+ background: var(--canvas-gray);
686
+ border-radius: 6px;
687
+ overflow: hidden;
688
+ }
689
+ .canvas .source-bar-large__fill {
690
+ height: 100%;
691
+ background: var(--canvas-accent);
692
+ border-radius: 6px;
693
+ }
694
+
695
+ /* ── Session Cards (Project) ── */
696
+ .canvas .sessions-section {
697
+ padding-block-end: 100px;
698
+ }
699
+ .canvas .sessions-grid {
700
+ display: grid;
701
+ grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
702
+ gap: 1.5rem;
703
+ }
704
+ .canvas .session-card {
705
+ background: var(--canvas-surface);
706
+ border-radius: var(--canvas-radius);
707
+ padding: 1.75rem;
708
+ text-decoration: none;
709
+ color: inherit;
710
+ display: block;
711
+ transition: transform 300ms var(--canvas-ease), box-shadow 300ms var(--canvas-ease);
712
+ }
713
+ .canvas .session-card:hover {
714
+ transform: translateY(-3px);
715
+ box-shadow: 0 16px 48px rgba(0, 0, 0, 0.06);
716
+ color: inherit;
717
+ }
718
+ .canvas .session-card:focus-visible {
719
+ outline: 2px solid var(--canvas-accent);
720
+ outline-offset: 3px;
721
+ }
722
+ .canvas .session-card__tag {
723
+ display: inline-block;
724
+ font-family: var(--canvas-font-mono);
725
+ font-size: 0.6875rem;
726
+ font-weight: 500;
727
+ color: var(--canvas-accent);
728
+ text-transform: uppercase;
729
+ letter-spacing: 0.08em;
730
+ margin-block-end: 0.75rem;
731
+ }
732
+ .canvas .session-card__title {
733
+ font-family: var(--canvas-font-display);
734
+ font-size: 1.125rem;
735
+ font-weight: 600;
736
+ margin-block-end: 0.75rem;
737
+ line-height: 1.3;
738
+ }
739
+ .canvas .session-card__meta {
740
+ font-family: var(--canvas-font-mono);
741
+ font-size: 0.75rem;
742
+ color: var(--canvas-text-tertiary);
743
+ display: flex;
744
+ flex-wrap: wrap;
745
+ gap: 0.75rem;
746
+ }
747
+ .canvas .session-card__preview {
748
+ width: 100%;
749
+ height: 6px;
750
+ background: var(--canvas-border-light);
751
+ border-radius: 3px;
752
+ margin-block-start: 1rem;
753
+ overflow: hidden;
754
+ }
755
+ .canvas .session-card__preview-fill {
756
+ height: 100%;
757
+ border-radius: 3px;
758
+ }
759
+
760
+ /* ══════════════════════════════════════════════════
761
+ SESSION
762
+ ══════════════════════════════════════════════════ */
763
+
764
+ /* ── Session Header ── */
765
+ .canvas .session-header {
766
+ padding-block-end: 80px;
767
+ }
768
+ .canvas .session-header__title {
769
+ font-family: var(--canvas-font-display);
770
+ font-size: clamp(1.75rem, 4vw, 2.5rem);
771
+ font-weight: 700;
772
+ letter-spacing: -0.03em;
773
+ line-height: 1.2;
774
+ margin-block-end: 1.25rem;
775
+ max-width: 640px;
776
+ }
777
+ .canvas .session-header__meta {
778
+ display: flex;
779
+ flex-wrap: wrap;
780
+ gap: 1.5rem;
781
+ font-family: var(--canvas-font-mono);
782
+ font-size: 0.8125rem;
783
+ color: var(--canvas-text-tertiary);
784
+ }
785
+ .canvas .session-header__meta-item {
786
+ display: flex;
787
+ align-items: center;
788
+ gap: 0.375rem;
789
+ }
790
+ .canvas .session-header__meta-dot {
791
+ width: 6px;
792
+ height: 6px;
793
+ border-radius: 50%;
794
+ background: var(--canvas-accent);
795
+ flex-shrink: 0;
796
+ }
797
+
798
+ /* ── Dev Take ── */
799
+ .canvas .dev-take {
800
+ background: var(--canvas-surface);
801
+ border-radius: var(--canvas-radius-lg);
802
+ padding: 2.5rem;
803
+ margin-block-end: 80px;
804
+ }
805
+ .canvas .dev-take__label {
806
+ font-family: var(--canvas-font-mono);
807
+ font-size: 0.6875rem;
808
+ font-weight: 500;
809
+ text-transform: uppercase;
810
+ letter-spacing: 0.1em;
811
+ color: var(--canvas-accent);
812
+ margin-block-end: 0.75rem;
813
+ }
814
+ .canvas .dev-take__text {
815
+ font-size: 1.125rem;
816
+ line-height: 1.7;
817
+ color: var(--canvas-text-secondary);
818
+ font-style: italic;
819
+ }
820
+
821
+ /* ── Session Stats Row ── */
822
+ .canvas .session-stats {
823
+ display: flex;
824
+ justify-content: flex-start;
825
+ gap: clamp(2rem, 5vw, 4rem);
826
+ padding-block-end: 80px;
827
+ flex-wrap: wrap;
828
+ }
829
+
830
+ /* ── Narrative (Session) ── */
831
+ .canvas .narrative-section {
832
+ padding-block-end: 80px;
833
+ }
834
+ .canvas .narrative-text {
835
+ font-size: 1.125rem;
836
+ line-height: 1.8;
837
+ color: var(--canvas-text-secondary);
838
+ }
839
+
840
+ /* ── Highlights ── */
841
+ .canvas .highlights-section {
842
+ padding-block-end: 80px;
843
+ }
844
+ .canvas .highlights-list {
845
+ list-style: none;
846
+ padding: 0;
847
+ }
848
+ .canvas .highlights-list li {
849
+ font-size: 0.9375rem;
850
+ color: var(--canvas-text-secondary);
851
+ line-height: 1.7;
852
+ padding: 0.5rem 0;
853
+ border-bottom: 1px solid var(--canvas-border-light);
854
+ }
855
+ .canvas .highlights-list li:last-child {
856
+ border-bottom: none;
857
+ }
858
+
859
+ /* ── Execution Path (Beats) ── */
860
+ .canvas .beats-section {
861
+ padding-block-end: 80px;
862
+ }
863
+ .canvas .beats-list {
864
+ list-style: none;
865
+ position: relative;
866
+ padding: 0;
867
+ }
868
+ .canvas .beats-list::before {
869
+ content: '';
870
+ position: absolute;
871
+ left: 15px;
872
+ top: 8px;
873
+ bottom: 8px;
874
+ width: 2px;
875
+ background: var(--canvas-border-light);
876
+ border-radius: 1px;
877
+ }
878
+ .canvas .beat-item {
879
+ display: flex;
880
+ gap: 1.5rem;
881
+ padding-block-end: 2rem;
882
+ position: relative;
883
+ }
884
+ .canvas .beat-item:last-child {
885
+ padding-block-end: 0;
886
+ }
887
+ .canvas .beat-dot {
888
+ width: 32px;
889
+ height: 32px;
890
+ background: var(--canvas-accent);
891
+ border-radius: 50%;
892
+ flex-shrink: 0;
893
+ display: flex;
894
+ align-items: center;
895
+ justify-content: center;
896
+ font-family: var(--canvas-font-display);
897
+ font-size: 0.75rem;
898
+ font-weight: 700;
899
+ color: #fff;
900
+ z-index: 1;
901
+ }
902
+ .canvas .beat-content {
903
+ padding-block-start: 0.25rem;
904
+ }
905
+ .canvas .beat-content__title {
906
+ font-family: var(--canvas-font-display);
907
+ font-size: 1.0625rem;
908
+ font-weight: 600;
909
+ margin-block-end: 0.375rem;
910
+ }
911
+ .canvas .beat-content__desc {
912
+ font-size: 0.9375rem;
913
+ color: var(--canvas-text-secondary);
914
+ line-height: 1.6;
915
+ }
916
+
917
+ /* ── Q&A ── */
918
+ .canvas .qa-section {
919
+ padding-block-end: 80px;
920
+ }
921
+ .canvas .qa-list {
922
+ display: flex;
923
+ flex-direction: column;
924
+ gap: 2rem;
925
+ }
926
+ .canvas .qa-item {
927
+ background: var(--canvas-surface);
928
+ border-radius: var(--canvas-radius);
929
+ padding: 2rem;
930
+ }
931
+ .canvas .qa-question {
932
+ font-family: var(--canvas-font-display);
933
+ font-size: 1rem;
934
+ font-weight: 600;
935
+ margin-block-end: 0.75rem;
936
+ line-height: 1.4;
937
+ }
938
+ .canvas .qa-answer {
939
+ font-size: 0.9375rem;
940
+ color: var(--canvas-text-secondary);
941
+ line-height: 1.7;
942
+ }
943
+
944
+ /* ── Agent Summary ── */
945
+ .canvas .agents-section {
946
+ padding-block-end: 80px;
947
+ }
948
+ .canvas .agents-chart {
949
+ background: var(--canvas-surface);
950
+ border-radius: var(--canvas-radius-lg);
951
+ padding: 2rem;
952
+ }
953
+ .canvas .agent-bar-row {
954
+ display: flex;
955
+ align-items: center;
956
+ gap: 1rem;
957
+ margin-block-end: 0.75rem;
958
+ }
959
+ .canvas .agent-bar-label {
960
+ font-family: var(--canvas-font-display);
961
+ font-size: 0.8125rem;
962
+ font-weight: 600;
963
+ color: var(--canvas-text);
964
+ min-width: 120px;
965
+ text-align: right;
966
+ }
967
+ .canvas .agent-bar-track {
968
+ flex: 1;
969
+ height: 18px;
970
+ background: var(--canvas-border-light);
971
+ border-radius: 9px;
972
+ overflow: hidden;
973
+ }
974
+ .canvas .agent-bar-fill {
975
+ height: 100%;
976
+ border-radius: 9px;
977
+ transition: width 800ms var(--canvas-ease);
978
+ }
979
+ .canvas .agent-bar-meta {
980
+ font-family: var(--canvas-font-mono);
981
+ font-size: 0.6875rem;
982
+ color: var(--canvas-text-tertiary);
983
+ min-width: 100px;
984
+ }
985
+ .canvas .agents-legend {
986
+ display: flex;
987
+ flex-wrap: wrap;
988
+ gap: 1rem;
989
+ margin-block-start: 1.5rem;
990
+ }
991
+ .canvas .agent-legend-item {
992
+ display: flex;
993
+ align-items: center;
994
+ gap: 0.5rem;
995
+ font-family: var(--canvas-font-mono);
996
+ font-size: 0.75rem;
997
+ color: var(--canvas-text-secondary);
998
+ }
999
+ .canvas .agent-legend-dot {
1000
+ width: 10px;
1001
+ height: 10px;
1002
+ border-radius: 50%;
1003
+ flex-shrink: 0;
1004
+ }
1005
+
1006
+ /* ── Sidebar ── */
1007
+ .canvas .sidebar {
1008
+ position: sticky;
1009
+ top: 2rem;
1010
+ }
1011
+ .canvas .sidebar-section {
1012
+ margin-block-end: 2.5rem;
1013
+ }
1014
+ .canvas .sidebar-title {
1015
+ font-family: var(--canvas-font-mono);
1016
+ font-size: 0.6875rem;
1017
+ font-weight: 500;
1018
+ text-transform: uppercase;
1019
+ letter-spacing: 0.1em;
1020
+ color: var(--canvas-text-tertiary);
1021
+ margin-block-end: 1rem;
1022
+ }
1023
+
1024
+ /* ── Tools Used ── */
1025
+ .canvas .tools-list {
1026
+ list-style: none;
1027
+ padding: 0;
1028
+ }
1029
+ .canvas .tools-list li {
1030
+ display: flex;
1031
+ justify-content: space-between;
1032
+ align-items: center;
1033
+ padding: 0.5rem 0;
1034
+ border-bottom: 1px solid var(--canvas-border-light);
1035
+ font-size: 0.875rem;
1036
+ }
1037
+ .canvas .tools-list li:last-child {
1038
+ border-bottom: none;
1039
+ }
1040
+ .canvas .tool-name {
1041
+ font-family: var(--canvas-font-mono);
1042
+ font-size: 0.8125rem;
1043
+ color: var(--canvas-text);
1044
+ }
1045
+ .canvas .tool-count {
1046
+ font-family: var(--canvas-font-mono);
1047
+ font-size: 0.75rem;
1048
+ color: var(--canvas-text-tertiary);
1049
+ background: var(--canvas-surface);
1050
+ padding: 0.125rem 0.5rem;
1051
+ border-radius: var(--canvas-radius-pill);
1052
+ }
1053
+
1054
+ /* ── Files Changed ── */
1055
+ .canvas .files-list {
1056
+ list-style: none;
1057
+ padding: 0;
1058
+ }
1059
+ .canvas .files-list li {
1060
+ padding: 0.5rem 0;
1061
+ border-bottom: 1px solid var(--canvas-border-light);
1062
+ }
1063
+ .canvas .files-list li:last-child {
1064
+ border-bottom: none;
1065
+ }
1066
+ .canvas .file-path {
1067
+ font-family: var(--canvas-font-mono);
1068
+ font-size: 0.75rem;
1069
+ color: var(--canvas-text);
1070
+ word-break: break-all;
1071
+ display: block;
1072
+ line-height: 1.4;
1073
+ }
1074
+ .canvas .file-diff {
1075
+ font-family: var(--canvas-font-mono);
1076
+ font-size: 0.6875rem;
1077
+ color: var(--canvas-accent);
1078
+ margin-block-start: 0.125rem;
1079
+ }
1080
+
1081
+ /* ── Sidebar Skills ── */
1082
+ .canvas .sidebar-skills {
1083
+ display: flex;
1084
+ flex-wrap: wrap;
1085
+ gap: 0.375rem;
1086
+ }
1087
+ .canvas .sidebar-skill {
1088
+ display: inline-block;
1089
+ background: var(--canvas-accent);
1090
+ color: #fff;
1091
+ font-family: var(--canvas-font-mono);
1092
+ font-size: 0.6875rem;
1093
+ font-weight: 500;
1094
+ padding: 0.25rem 0.625rem;
1095
+ border-radius: var(--canvas-radius-pill);
1096
+ }
1097
+
1098
+ /* ── Page Footer ── */
1099
+ .canvas .page-footer {
1100
+ padding: 3rem 0;
1101
+ text-align: center;
1102
+ font-family: var(--canvas-font-mono);
1103
+ font-size: 0.75rem;
1104
+ color: var(--canvas-text-tertiary);
1105
+ }
1106
+ .canvas .page-footer a {
1107
+ color: var(--canvas-text-tertiary);
1108
+ text-decoration: underline;
1109
+ text-underline-offset: 2px;
1110
+ }
1111
+ .canvas .page-footer a:hover {
1112
+ color: var(--canvas-accent);
1113
+ }
1114
+ .canvas .page-footer a:visited {
1115
+ color: var(--canvas-text-tertiary);
1116
+ }
1117
+
1118
+ /* ── Source Bar (Portfolio project cards) ── */
1119
+ .canvas .source-bar {
1120
+ display: flex;
1121
+ align-items: center;
1122
+ gap: 0.75rem;
1123
+ font-family: var(--canvas-font-mono);
1124
+ font-size: 0.6875rem;
1125
+ color: var(--canvas-text-tertiary);
1126
+ }
1127
+ .canvas .source-bar__track {
1128
+ width: 80px;
1129
+ height: 4px;
1130
+ background: var(--canvas-border);
1131
+ border-radius: 2px;
1132
+ overflow: hidden;
1133
+ }
1134
+ .canvas .source-bar__fill {
1135
+ height: 100%;
1136
+ background: var(--canvas-accent);
1137
+ border-radius: 2px;
1138
+ }
1139
+
1140
+ /* ── Skills Overview (Portfolio) ── */
1141
+ .canvas .skills-overview {
1142
+ padding-block-end: 100px;
1143
+ }
1144
+ .canvas .skills-cloud {
1145
+ display: flex;
1146
+ flex-wrap: wrap;
1147
+ gap: 0.75rem;
1148
+ justify-content: center;
1149
+ max-width: 800px;
1150
+ margin: 0 auto;
1151
+ }
1152
+
1153
+ /* ── Source Overview (Portfolio) ── */
1154
+ .canvas .source-overview {
1155
+ padding-block-end: 100px;
1156
+ }
1157
+ .canvas .source-overview__visual {
1158
+ display: flex;
1159
+ align-items: center;
1160
+ justify-content: center;
1161
+ gap: 3rem;
1162
+ flex-wrap: wrap;
1163
+ }
1164
+ .canvas .source-donut {
1165
+ width: 180px;
1166
+ height: 180px;
1167
+ flex-shrink: 0;
1168
+ }
1169
+ .canvas .source-overview .source-legend {
1170
+ flex-direction: column;
1171
+ gap: 1rem;
1172
+ }
1173
+ .canvas .source-overview .source-legend__item {
1174
+ gap: 0.75rem;
1175
+ }
1176
+ .canvas .source-legend__dot--lg {
1177
+ width: 14px;
1178
+ height: 14px;
1179
+ }
1180
+ .canvas .source-legend__label {
1181
+ font-family: var(--canvas-font-body);
1182
+ font-size: 0.9375rem;
1183
+ color: var(--canvas-text-secondary);
1184
+ }
1185
+ .canvas .source-legend__value {
1186
+ font-family: var(--canvas-font-display);
1187
+ font-size: 1.5rem;
1188
+ font-weight: 700;
1189
+ color: var(--canvas-text);
1190
+ letter-spacing: -0.02em;
1191
+ }
1192
+
1193
+ /* ── Activity Chart (Portfolio) ── */
1194
+ .canvas .activity-section {
1195
+ padding-block-end: 100px;
1196
+ }
1197
+ .canvas .activity-chart {
1198
+ background: var(--canvas-surface);
1199
+ border-radius: var(--canvas-radius-lg);
1200
+ padding: 2.5rem;
1201
+ overflow-x: auto;
1202
+ }
1203
+ .canvas .activity-chart svg {
1204
+ display: block;
1205
+ width: 100%;
1206
+ min-width: 500px;
1207
+ }
1208
+
1209
+ /* ── Recent Sessions (Portfolio) ── */
1210
+ .canvas .recent-sessions {
1211
+ padding-block-end: 100px;
1212
+ }
1213
+ .canvas .sessions-list {
1214
+ display: flex;
1215
+ flex-direction: column;
1216
+ gap: 1px;
1217
+ background: var(--canvas-border-light);
1218
+ border-radius: var(--canvas-radius);
1219
+ overflow: hidden;
1220
+ }
1221
+ .canvas .session-row {
1222
+ display: grid;
1223
+ grid-template-columns: 1fr auto auto auto;
1224
+ gap: 1.5rem;
1225
+ align-items: center;
1226
+ padding: 1.25rem 1.75rem;
1227
+ background: var(--canvas-surface);
1228
+ text-decoration: none;
1229
+ color: inherit;
1230
+ transition: background 200ms ease;
1231
+ }
1232
+ .canvas .session-row:hover {
1233
+ background: #f5f5f5;
1234
+ color: inherit;
1235
+ }
1236
+ .canvas .session-row:focus-visible {
1237
+ outline: 2px solid var(--canvas-accent);
1238
+ outline-offset: -2px;
1239
+ }
1240
+ .canvas .session-row__title {
1241
+ font-family: var(--canvas-font-display);
1242
+ font-size: 0.9375rem;
1243
+ font-weight: 600;
1244
+ }
1245
+ .canvas .session-row__project {
1246
+ font-family: var(--canvas-font-mono);
1247
+ font-size: 0.6875rem;
1248
+ color: var(--canvas-text-tertiary);
1249
+ margin-block-start: 0.125rem;
1250
+ }
1251
+ .canvas .session-row__date {
1252
+ font-family: var(--canvas-font-mono);
1253
+ font-size: 0.75rem;
1254
+ color: var(--canvas-text-tertiary);
1255
+ white-space: nowrap;
1256
+ }
1257
+ .canvas .session-row__duration {
1258
+ font-family: var(--canvas-font-mono);
1259
+ font-size: 0.75rem;
1260
+ color: var(--canvas-text-secondary);
1261
+ white-space: nowrap;
1262
+ }
1263
+ .canvas .session-row__loc {
1264
+ font-family: var(--canvas-font-mono);
1265
+ font-size: 0.75rem;
1266
+ color: var(--canvas-text-tertiary);
1267
+ white-space: nowrap;
1268
+ }
1269
+
1270
+ /* ══════════════════════════════════════════════════
1271
+ RESPONSIVE
1272
+ ══════════════════════════════════════════════════ */
1273
+
1274
+ @media (max-width: 767px) {
1275
+ /* Navigation */
1276
+ .canvas .nav {
1277
+ flex-direction: column;
1278
+ gap: 1rem;
1279
+ margin-block-end: 20px;
1280
+ }
1281
+
1282
+ /* Portfolio */
1283
+ .canvas .hero-split {
1284
+ grid-template-columns: 1fr;
1285
+ min-height: auto;
1286
+ }
1287
+ .canvas .hero-photo-container {
1288
+ height: 50vh;
1289
+ min-height: 320px;
1290
+ }
1291
+ .canvas .hero-content {
1292
+ padding: 2.5rem 1.5rem 3rem;
1293
+ }
1294
+ .canvas .hero__name {
1295
+ font-size: 2.25rem;
1296
+ }
1297
+ .canvas .hero-stats {
1298
+ gap: 1.25rem 2rem;
1299
+ }
1300
+ .canvas .projects-section {
1301
+ padding: 60px 0;
1302
+ }
1303
+ .canvas .project-card {
1304
+ padding: 1.5rem;
1305
+ }
1306
+ .canvas .project-card__header {
1307
+ flex-direction: column;
1308
+ }
1309
+ .canvas .project-card__footer {
1310
+ flex-direction: column;
1311
+ align-items: flex-start;
1312
+ }
1313
+ .canvas .source-bar {
1314
+ margin-block-start: 0.25rem;
1315
+ }
1316
+ .canvas .skills-overview,
1317
+ .canvas .source-overview,
1318
+ .canvas .activity-section,
1319
+ .canvas .recent-sessions {
1320
+ padding-block-end: 60px;
1321
+ }
1322
+ .canvas .activity-chart {
1323
+ padding: 1.25rem;
1324
+ }
1325
+ .canvas .session-row {
1326
+ grid-template-columns: 1fr auto;
1327
+ gap: 0.75rem;
1328
+ padding: 1rem 1.25rem;
1329
+ }
1330
+ .canvas .session-row__date,
1331
+ .canvas .session-row__loc {
1332
+ display: none;
1333
+ }
1334
+ .canvas .source-donut {
1335
+ width: 140px;
1336
+ height: 140px;
1337
+ }
1338
+
1339
+ /* Project */
1340
+ .canvas .project-hero {
1341
+ padding-block-end: 40px;
1342
+ }
1343
+ .canvas .screenshot {
1344
+ margin-inline: -1.5rem;
1345
+ margin-block-end: 60px;
1346
+ border-radius: 0;
1347
+ border-inline: none;
1348
+ }
1349
+ .canvas .narrative {
1350
+ padding-block-end: 60px;
1351
+ }
1352
+ .canvas .project-stats {
1353
+ gap: 1.25rem;
1354
+ padding-block-end: 60px;
1355
+ }
1356
+ .canvas .phases-section,
1357
+ .canvas .timeline-section,
1358
+ .canvas .skills-section,
1359
+ .canvas .decisions-section,
1360
+ .canvas .source-section,
1361
+ .canvas .sessions-section {
1362
+ padding-block-end: 60px;
1363
+ }
1364
+ .canvas .phase-card {
1365
+ flex: 0 0 240px;
1366
+ padding: 1.5rem;
1367
+ }
1368
+ .canvas .sessions-grid {
1369
+ grid-template-columns: 1fr;
1370
+ }
1371
+ .canvas .chart-container {
1372
+ padding: 1.25rem;
1373
+ }
1374
+
1375
+ /* Session */
1376
+ .canvas .content-layout {
1377
+ grid-template-columns: 1fr;
1378
+ gap: 0;
1379
+ }
1380
+ .canvas .sidebar {
1381
+ position: static;
1382
+ order: -1;
1383
+ display: grid;
1384
+ grid-template-columns: 1fr 1fr;
1385
+ gap: 1.5rem;
1386
+ padding-block-end: 60px;
1387
+ }
1388
+ .canvas .sidebar-section:last-child {
1389
+ grid-column: 1 / -1;
1390
+ }
1391
+ .canvas .session-header {
1392
+ padding-block-end: 40px;
1393
+ }
1394
+ .canvas .dev-take {
1395
+ padding: 1.5rem;
1396
+ margin-block-end: 40px;
1397
+ }
1398
+ .canvas .session-stats {
1399
+ padding-block-end: 40px;
1400
+ gap: 1.25rem;
1401
+ }
1402
+ .canvas .beats-section,
1403
+ .canvas .qa-section,
1404
+ .canvas .agents-section,
1405
+ .canvas .narrative-section,
1406
+ .canvas .highlights-section {
1407
+ padding-block-end: 40px;
1408
+ }
1409
+ .canvas .qa-item {
1410
+ padding: 1.25rem;
1411
+ }
1412
+ .canvas .agents-chart {
1413
+ padding: 1.25rem;
1414
+ }
1415
+ .canvas .agent-bar-label {
1416
+ min-width: 80px;
1417
+ font-size: 0.75rem;
1418
+ }
1419
+ .canvas .agent-bar-meta {
1420
+ min-width: 70px;
1421
+ font-size: 0.625rem;
1422
+ }
1423
+ }
1424
+
1425
+ @media (min-width: 768px) {
1426
+ .canvas .project-card {
1427
+ padding: 3rem;
1428
+ }
1429
+ }
1430
+
1431
+ @media (min-width: 768px) and (max-width: 1023px) {
1432
+ .canvas .content-layout {
1433
+ grid-template-columns: 1fr 240px;
1434
+ gap: 2.5rem;
1435
+ }
1436
+ }