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,1874 @@
1
+ /* ══════════════════════════════════════════════════════
2
+ PARALLAX TEMPLATE — Design Tokens & Shared Styles
3
+ ══════════════════════════════════════════════════════ */
4
+
5
+ /* ── Design Tokens ── */
6
+ :root {
7
+ --px-bg: #0a0a0f;
8
+ --px-surface: rgba(255, 255, 255, 0.04);
9
+ --px-surface-hover: rgba(255, 255, 255, 0.08);
10
+ --px-surface-solid: #12121a;
11
+ --px-accent: #ffffff;
12
+ --px-accent-blue: #60a5fa;
13
+ --px-accent-dim: rgba(96, 165, 250, 0.15);
14
+ --px-text: #f1f5f9;
15
+ --px-text-secondary: rgba(255, 255, 255, 0.5);
16
+ --px-text-tertiary: rgba(255, 255, 255, 0.3);
17
+ --px-border: rgba(255, 255, 255, 0.08);
18
+
19
+ --font-display: 'Space Grotesk', system-ui, sans-serif;
20
+ --font-body: 'Inter', system-ui, sans-serif;
21
+ --font-mono: 'JetBrains Mono', monospace;
22
+
23
+ --radius: 8px;
24
+ --radius-lg: 12px;
25
+
26
+ /* Agent role colors */
27
+ --clr-frontend: #7c3aed;
28
+ --clr-backend: #0891b2;
29
+ --clr-qa: #059669;
30
+ --clr-security: #475569;
31
+ --clr-reviewer: #e11d48;
32
+ --clr-ux: #d97706;
33
+ }
34
+
35
+ /* ── Skip Link ── */
36
+ .skip-link {
37
+ position: absolute;
38
+ top: -100%;
39
+ left: 1rem;
40
+ background: var(--px-accent);
41
+ color: var(--px-bg);
42
+ padding: 0.5rem 1rem;
43
+ border-radius: var(--radius);
44
+ font-family: var(--font-body);
45
+ font-size: 0.875rem;
46
+ font-weight: 600;
47
+ z-index: 1000;
48
+ text-decoration: none;
49
+ }
50
+ .skip-link:focus {
51
+ top: 1rem;
52
+ outline: 2px solid var(--px-accent-blue);
53
+ outline-offset: 2px;
54
+ }
55
+
56
+ /* ── Dark Template Wrapper ── */
57
+ .parallax {
58
+ background: var(--px-bg);
59
+ color: var(--px-text);
60
+ font-family: var(--font-body);
61
+ line-height: 1.6;
62
+ overflow-x: hidden;
63
+ min-height: 100vh;
64
+ -webkit-font-smoothing: antialiased;
65
+ }
66
+ .parallax a {
67
+ color: inherit;
68
+ text-decoration: none;
69
+ }
70
+ .parallax a:visited {
71
+ color: inherit;
72
+ }
73
+
74
+ /* ── Focus Visible ── */
75
+ :focus-visible {
76
+ outline: 2px solid var(--px-accent-blue);
77
+ outline-offset: 2px;
78
+ }
79
+
80
+ /* ── SR Only ── */
81
+ .sr-only {
82
+ position: absolute;
83
+ width: 1px;
84
+ height: 1px;
85
+ padding: 0;
86
+ margin: -1px;
87
+ overflow: hidden;
88
+ clip: rect(0, 0, 0, 0);
89
+ white-space: nowrap;
90
+ border: 0;
91
+ }
92
+
93
+ /* ══════════════════════════════════════════════════════
94
+ BACKGROUND SHAPES — decorative, fixed, subtle drift
95
+ ══════════════════════════════════════════════════════ */
96
+ .bg-shapes {
97
+ position: fixed;
98
+ inset: 0;
99
+ pointer-events: none;
100
+ z-index: 0;
101
+ overflow: hidden;
102
+ }
103
+ .bg-shape {
104
+ position: absolute;
105
+ opacity: 0.03;
106
+ border: 1px solid rgba(255, 255, 255, 0.5);
107
+ border-radius: 50%;
108
+ will-change: transform;
109
+ animation: shapeDrift 20s ease-in-out infinite alternate;
110
+ }
111
+ .bg-shape--1 { width: 400px; height: 400px; top: 10%; left: -5%; animation-duration: 25s; }
112
+ .bg-shape--2 { width: 200px; height: 200px; top: 30%; right: 10%; animation-duration: 18s; animation-delay: -3s; }
113
+ .bg-shape--3 { width: 600px; height: 600px; top: 60%; left: 50%; transform: translateX(-50%); animation-duration: 30s; animation-delay: -7s; }
114
+ .bg-shape--4 { width: 150px; height: 150px; top: 15%; right: 30%; border-radius: 0; animation-duration: 22s; animation-delay: -5s; animation-name: shapeDriftRotate; }
115
+ .bg-shape--5 { width: 80px; height: 80px; top: 75%; left: 15%; animation-duration: 16s; animation-delay: -2s; }
116
+ .bg-shape--6 { width: 300px; height: 300px; top: 85%; right: -5%; animation-duration: 28s; animation-delay: -10s; }
117
+ .bg-shape--7 { width: 1px; height: 200px; top: 40%; left: 25%; border-radius: 0; opacity: 0.05; animation-duration: 20s; animation-delay: -4s; }
118
+ .bg-shape--8 { width: 1px; height: 300px; top: 20%; right: 20%; border-radius: 0; opacity: 0.04; animation-duration: 24s; animation-delay: -8s; }
119
+
120
+ @keyframes shapeDrift {
121
+ 0% { transform: translate(0, 0); }
122
+ 100% { transform: translate(20px, -15px); }
123
+ }
124
+ @keyframes shapeDriftRotate {
125
+ 0% { transform: translate(0, 0) rotate(45deg); }
126
+ 100% { transform: translate(15px, -20px) rotate(75deg); }
127
+ }
128
+
129
+ /* ══════════════════════════════════════════════════════
130
+ FIXED PHOTO LAYER (portfolio)
131
+ ══════════════════════════════════════════════════════ */
132
+ .photo-layer {
133
+ position: fixed;
134
+ inset: 0;
135
+ display: flex;
136
+ align-items: center;
137
+ justify-content: center;
138
+ z-index: 1;
139
+ pointer-events: none;
140
+ }
141
+ .photo-fixed {
142
+ width: 500px;
143
+ height: auto;
144
+ object-fit: cover;
145
+ object-position: 55% 0%;
146
+ filter: contrast(1.08) brightness(1.08);
147
+ mask-image: radial-gradient(ellipse 75% 85% at 50% 30%, black 40%, transparent 85%);
148
+ -webkit-mask-image: radial-gradient(ellipse 75% 85% at 50% 30%, black 40%, transparent 85%);
149
+ will-change: transform, opacity;
150
+ animation: photoEntrance 1.2s cubic-bezier(0.16, 1, 0.3, 1) forwards,
151
+ photoFloat 6s ease-in-out 1.5s infinite;
152
+ }
153
+ @keyframes photoEntrance {
154
+ 0% { opacity: 0; transform: scale(1.15) translateY(40px); filter: contrast(1.08) brightness(0.6) blur(8px); }
155
+ 100% { opacity: 1; transform: scale(1) translateY(0); filter: contrast(1.08) brightness(1.08) blur(0); }
156
+ }
157
+ @keyframes photoFloat {
158
+ 0%, 100% { transform: scale(1) translateY(0); }
159
+ 50% { transform: scale(1) translateY(-8px); }
160
+ }
161
+
162
+ /* ── Content Layer ── */
163
+ .content-layer {
164
+ position: relative;
165
+ z-index: 2;
166
+ }
167
+
168
+ /* ══════════════════════════════════════════════════════
169
+ HERO — Portfolio
170
+ ══════════════════════════════════════════════════════ */
171
+ .hero {
172
+ position: relative;
173
+ min-height: 100vh;
174
+ display: flex;
175
+ flex-direction: column;
176
+ align-items: center;
177
+ justify-content: center;
178
+ padding: 6rem 2rem 4rem;
179
+ text-align: center;
180
+ }
181
+ .hero::before {
182
+ content: '';
183
+ position: absolute;
184
+ inset: 0;
185
+ background: linear-gradient(to bottom, transparent 10%, rgba(10, 10, 15, 0.6) 40%, rgba(10, 10, 15, 0.92) 65%, var(--px-bg) 90%);
186
+ z-index: 0;
187
+ pointer-events: none;
188
+ }
189
+ .hero > * {
190
+ position: relative;
191
+ z-index: 1;
192
+ }
193
+ .hero__name {
194
+ font-family: var(--font-display);
195
+ font-size: clamp(3rem, 7vw, 5rem);
196
+ font-weight: 700;
197
+ letter-spacing: -0.04em;
198
+ line-height: 1.05;
199
+ color: var(--px-accent);
200
+ text-shadow: 0 2px 40px rgba(0, 0, 0, 0.8), 0 0 80px rgba(10, 10, 15, 0.6);
201
+ margin-block-start: 8rem;
202
+ opacity: 0;
203
+ transform: translateX(-100px);
204
+ animation: flyInLeft 0.8s cubic-bezier(0.16, 1, 0.3, 1) 0.4s forwards;
205
+ }
206
+ .hero__location {
207
+ font-family: var(--font-body);
208
+ font-size: 1rem;
209
+ color: var(--px-text-secondary);
210
+ margin-block-start: 0.75rem;
211
+ text-shadow: 0 1px 20px rgba(0, 0, 0, 0.8);
212
+ opacity: 0;
213
+ animation: fadeIn 0.8s cubic-bezier(0.16, 1, 0.3, 1) 0.6s forwards;
214
+ }
215
+ .hero__bio {
216
+ max-width: 560px;
217
+ font-size: 1.0625rem;
218
+ color: var(--px-text-secondary);
219
+ line-height: 1.7;
220
+ margin-block-start: 2rem;
221
+ text-shadow: 0 1px 20px rgba(0, 0, 0, 0.8);
222
+ opacity: 0;
223
+ transform: translateX(100px);
224
+ animation: flyInRight 0.8s cubic-bezier(0.16, 1, 0.3, 1) 0.8s forwards;
225
+ }
226
+ .hero__contact {
227
+ display: flex;
228
+ flex-wrap: wrap;
229
+ gap: 1rem;
230
+ justify-content: center;
231
+ margin-block-start: 2rem;
232
+ opacity: 0;
233
+ transform: translateY(30px);
234
+ animation: fadeUp 0.8s cubic-bezier(0.16, 1, 0.3, 1) 1.0s forwards;
235
+ }
236
+ .hero__contact-link {
237
+ font-family: var(--font-mono);
238
+ font-size: 0.8125rem;
239
+ color: var(--px-accent-blue);
240
+ text-decoration: none;
241
+ transition: color 0.2s;
242
+ text-shadow: 0 1px 10px rgba(0, 0, 0, 0.6);
243
+ }
244
+ .hero__contact-link:hover {
245
+ color: var(--px-accent);
246
+ }
247
+ .hero__contact-sep {
248
+ color: var(--px-text-tertiary);
249
+ }
250
+
251
+ /* ── Hero entrance keyframes ── */
252
+ @keyframes flyInLeft {
253
+ 0% { opacity: 0; transform: translateX(-100px); }
254
+ 100% { opacity: 1; transform: translateX(0); }
255
+ }
256
+ @keyframes flyInRight {
257
+ 0% { opacity: 0; transform: translateX(100px); }
258
+ 100% { opacity: 1; transform: translateX(0); }
259
+ }
260
+ @keyframes fadeIn {
261
+ 0% { opacity: 0; }
262
+ 100% { opacity: 1; }
263
+ }
264
+ @keyframes fadeUp {
265
+ 0% { opacity: 0; transform: translateY(30px); }
266
+ 100% { opacity: 1; transform: translateY(0); }
267
+ }
268
+ @keyframes scaleUp {
269
+ 0% { opacity: 0; transform: scale(0.8); }
270
+ 100% { opacity: 1; transform: scale(1); }
271
+ }
272
+
273
+ /* ── Stats Row (portfolio hero) ── */
274
+ .stats-row {
275
+ display: flex;
276
+ gap: 1.5rem;
277
+ justify-content: center;
278
+ margin-block-start: 3rem;
279
+ }
280
+ .stat-card {
281
+ background: rgba(10, 10, 15, 0.7);
282
+ backdrop-filter: blur(8px);
283
+ -webkit-backdrop-filter: blur(8px);
284
+ border: 1px solid var(--px-border);
285
+ border-radius: var(--radius-lg);
286
+ padding: 1.25rem 1.75rem;
287
+ text-align: center;
288
+ min-width: 100px;
289
+ transition: border-color 0.3s, background 0.3s;
290
+ opacity: 0;
291
+ transform: scale(0.8);
292
+ animation: scaleUp 0.6s cubic-bezier(0.16, 1, 0.3, 1) forwards;
293
+ }
294
+ .stat-card:nth-child(1) { animation-delay: 1.2s; }
295
+ .stat-card:nth-child(2) { animation-delay: 1.3s; }
296
+ .stat-card:nth-child(3) { animation-delay: 1.4s; }
297
+ .stat-card:nth-child(4) { animation-delay: 1.5s; }
298
+ .stat-card:hover {
299
+ background: rgba(10, 10, 15, 0.85);
300
+ border-color: rgba(96, 165, 250, 0.2);
301
+ }
302
+ .stat-card__value {
303
+ font-family: var(--font-display);
304
+ font-size: 1.75rem;
305
+ font-weight: 700;
306
+ color: var(--px-accent);
307
+ line-height: 1.2;
308
+ }
309
+ .stat-card__label {
310
+ font-size: 0.75rem;
311
+ color: var(--px-text-secondary);
312
+ margin-block-start: 0.25rem;
313
+ text-transform: uppercase;
314
+ letter-spacing: 0.08em;
315
+ }
316
+
317
+ /* ── Leverage (shared) ── */
318
+ .px-leverage {
319
+ display: flex;
320
+ align-items: center;
321
+ gap: 1rem;
322
+ width: 100%;
323
+ background: var(--px-surface, rgba(255,255,255,0.04));
324
+ border-top: 1px solid var(--px-border);
325
+ border-bottom: 1px solid var(--px-border);
326
+ padding: 1.25rem 1.5rem;
327
+ margin-block: 1.5rem;
328
+ }
329
+ .px-leverage__multi {
330
+ font-family: var(--font-display);
331
+ font-size: 2.5rem;
332
+ font-weight: 700;
333
+ color: var(--px-accent-blue);
334
+ line-height: 1;
335
+ white-space: nowrap;
336
+ }
337
+ .px-leverage__line {
338
+ flex: 1;
339
+ height: 2px;
340
+ background: linear-gradient(90deg, rgba(255,255,255,0.15), var(--px-accent-blue));
341
+ }
342
+ .px-leverage__values {
343
+ display: flex;
344
+ gap: 1rem;
345
+ font-family: var(--font-mono);
346
+ font-size: 0.75rem;
347
+ color: var(--px-text-secondary);
348
+ }
349
+ .px-leverage__values small {
350
+ text-transform: uppercase;
351
+ letter-spacing: 0.06em;
352
+ font-size: 0.625rem;
353
+ color: var(--px-text-tertiary);
354
+ }
355
+ @media (max-width: 480px) {
356
+ .px-leverage {
357
+ flex-direction: column;
358
+ align-items: flex-start;
359
+ gap: 0.5rem;
360
+ }
361
+ .px-leverage__line { display: none; }
362
+ }
363
+
364
+ /* ── Transition Spacer (portfolio) ── */
365
+ .transition-spacer {
366
+ position: relative;
367
+ height: 60vh;
368
+ }
369
+
370
+ /* ── Section Shared ── */
371
+ .section {
372
+ position: relative;
373
+ z-index: 1;
374
+ max-width: 1000px;
375
+ margin-inline: auto;
376
+ padding: 4rem 2rem;
377
+ }
378
+ .section__title,
379
+ .section__label {
380
+ font-family: var(--font-display);
381
+ font-size: 0.8125rem;
382
+ font-weight: 600;
383
+ color: var(--px-text-secondary);
384
+ text-transform: uppercase;
385
+ letter-spacing: 0.1em;
386
+ margin-block-end: 1.5rem;
387
+ }
388
+ .section--opaque {
389
+ background: var(--px-bg);
390
+ }
391
+ .about-section--opaque {
392
+ background: var(--px-bg);
393
+ }
394
+ .footer--opaque {
395
+ background: var(--px-bg);
396
+ }
397
+
398
+ /* ── Skills Overview / Cloud (portfolio) ── */
399
+ .skills-overview {
400
+ max-width: 1000px;
401
+ margin-inline: auto;
402
+ padding: 3rem 2rem 1rem;
403
+ background: var(--px-bg);
404
+ }
405
+ .skills-overview__title {
406
+ font-family: var(--font-display);
407
+ font-size: 0.8125rem;
408
+ font-weight: 600;
409
+ color: var(--px-text-secondary);
410
+ text-transform: uppercase;
411
+ letter-spacing: 0.1em;
412
+ margin-block-end: 1.5rem;
413
+ }
414
+ .skills-cloud {
415
+ display: flex;
416
+ flex-wrap: wrap;
417
+ gap: 0.625rem;
418
+ }
419
+ .skills-cloud__chip {
420
+ font-family: var(--font-mono);
421
+ font-size: 0.75rem;
422
+ color: var(--px-accent-blue);
423
+ background: var(--px-accent-dim);
424
+ padding: 0.375rem 0.875rem;
425
+ border-radius: 9999px;
426
+ letter-spacing: 0.02em;
427
+ transition: background 0.2s, color 0.2s;
428
+ }
429
+ .skills-cloud__chip:hover {
430
+ background: rgba(96, 165, 250, 0.25);
431
+ color: var(--px-accent);
432
+ }
433
+
434
+ /* ══════════════════════════════════════════════════════
435
+ PROJECT CARDS (portfolio)
436
+ ══════════════════════════════════════════════════════ */
437
+ .project-grid {
438
+ display: grid;
439
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
440
+ gap: 1.5rem;
441
+ }
442
+ .project-card {
443
+ background: var(--px-surface);
444
+ border: 1px solid var(--px-border);
445
+ border-radius: var(--radius-lg);
446
+ padding: 2rem;
447
+ text-decoration: none;
448
+ color: inherit;
449
+ display: block;
450
+ transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1),
451
+ border-color 0.3s,
452
+ background 0.3s;
453
+ }
454
+ .project-card:hover {
455
+ transform: translateY(-4px);
456
+ border-color: rgba(96, 165, 250, 0.3);
457
+ background: var(--px-surface-hover);
458
+ }
459
+ .project-card__name {
460
+ font-family: var(--font-display);
461
+ font-size: 1.375rem;
462
+ font-weight: 600;
463
+ color: var(--px-accent);
464
+ margin-block-end: 0.75rem;
465
+ letter-spacing: -0.02em;
466
+ }
467
+ .project-card__narrative {
468
+ font-size: 0.9375rem;
469
+ color: var(--px-text-secondary);
470
+ line-height: 1.6;
471
+ margin-block-end: 1.25rem;
472
+ }
473
+ .project-card__skills {
474
+ display: flex;
475
+ flex-wrap: wrap;
476
+ gap: 0.5rem;
477
+ margin-block-end: 1.25rem;
478
+ }
479
+ .skill-chip {
480
+ font-family: var(--font-mono);
481
+ font-size: 0.6875rem;
482
+ color: var(--px-accent-blue);
483
+ background: var(--px-accent-dim);
484
+ padding: 0.25rem 0.625rem;
485
+ border-radius: 9999px;
486
+ letter-spacing: 0.02em;
487
+ }
488
+ .project-card__stats {
489
+ font-family: var(--font-mono);
490
+ font-size: 0.75rem;
491
+ color: var(--px-text-tertiary);
492
+ display: flex;
493
+ gap: 1rem;
494
+ flex-wrap: wrap;
495
+ }
496
+
497
+ /* ── Timeline (portfolio) ── */
498
+ .timeline {
499
+ position: relative;
500
+ padding-inline-start: 2rem;
501
+ margin-block-start: 2rem;
502
+ }
503
+ .timeline::before {
504
+ content: '';
505
+ position: absolute;
506
+ top: 0;
507
+ bottom: 0;
508
+ left: 0.5rem;
509
+ width: 1px;
510
+ background: var(--px-border);
511
+ }
512
+ .timeline__item {
513
+ position: relative;
514
+ padding-block-end: 2rem;
515
+ }
516
+ .timeline__item:last-child {
517
+ padding-block-end: 0;
518
+ }
519
+ .timeline__dot {
520
+ position: absolute;
521
+ left: -1.625rem;
522
+ top: 0.35rem;
523
+ width: 8px;
524
+ height: 8px;
525
+ border-radius: 50%;
526
+ background: var(--px-accent-blue);
527
+ box-shadow: 0 0 0 3px var(--px-bg), 0 0 0 4px var(--px-border);
528
+ }
529
+ .timeline__date {
530
+ font-family: var(--font-mono);
531
+ font-size: 0.6875rem;
532
+ color: var(--px-text-tertiary);
533
+ text-transform: uppercase;
534
+ letter-spacing: 0.06em;
535
+ margin-block-end: 0.25rem;
536
+ }
537
+ .timeline__title {
538
+ font-family: var(--font-display);
539
+ font-size: 1rem;
540
+ font-weight: 600;
541
+ color: var(--px-text);
542
+ margin-block-end: 0.25rem;
543
+ }
544
+ .timeline__desc {
545
+ font-size: 0.875rem;
546
+ color: var(--px-text-secondary);
547
+ line-height: 1.5;
548
+ }
549
+ .timeline__meta {
550
+ font-family: var(--font-mono);
551
+ font-size: 0.6875rem;
552
+ color: var(--px-text-tertiary);
553
+ margin-block-start: 0.375rem;
554
+ }
555
+
556
+ /* ── About / Connect (portfolio) ── */
557
+ .about-section {
558
+ position: relative;
559
+ max-width: 1000px;
560
+ margin-inline: auto;
561
+ padding: 3rem 2rem 5rem;
562
+ }
563
+ .about-grid {
564
+ display: grid;
565
+ grid-template-columns: 1fr 1fr;
566
+ gap: 2rem;
567
+ }
568
+ .about-card {
569
+ background: var(--px-surface);
570
+ border: 1px solid var(--px-border);
571
+ border-radius: var(--radius-lg);
572
+ padding: 1.5rem;
573
+ }
574
+ .about-card__title {
575
+ font-family: var(--font-display);
576
+ font-size: 0.8125rem;
577
+ font-weight: 600;
578
+ color: var(--px-text-secondary);
579
+ text-transform: uppercase;
580
+ letter-spacing: 0.08em;
581
+ margin-block-end: 1rem;
582
+ }
583
+ .about-card__link {
584
+ display: block;
585
+ font-size: 0.875rem;
586
+ color: var(--px-accent-blue);
587
+ text-decoration: none;
588
+ padding: 0.375rem 0;
589
+ transition: color 0.2s;
590
+ }
591
+ .about-card__link:hover {
592
+ color: var(--px-accent);
593
+ }
594
+ .about-card__link + .about-card__link {
595
+ border-top: 1px solid var(--px-border);
596
+ }
597
+ .resume-btn {
598
+ display: inline-flex;
599
+ align-items: center;
600
+ gap: 0.5rem;
601
+ font-family: var(--font-body);
602
+ font-size: 0.875rem;
603
+ font-weight: 500;
604
+ color: var(--px-bg);
605
+ background: var(--px-accent);
606
+ padding: 0.625rem 1.25rem;
607
+ border-radius: var(--radius);
608
+ text-decoration: none;
609
+ margin-block-start: 1rem;
610
+ transition: opacity 0.2s;
611
+ }
612
+ .resume-btn:hover {
613
+ opacity: 0.85;
614
+ }
615
+
616
+ /* ══════════════════════════════════════════════════════
617
+ PROJECT HERO
618
+ ══════════════════════════════════════════════════════ */
619
+ .project-hero {
620
+ position: relative;
621
+ z-index: 1;
622
+ min-height: 80vh;
623
+ display: flex;
624
+ flex-direction: column;
625
+ align-items: center;
626
+ justify-content: center;
627
+ padding: 8rem 2rem 4rem;
628
+ text-align: center;
629
+ }
630
+ .project-hero__screenshot {
631
+ width: 100%;
632
+ max-width: 700px;
633
+ aspect-ratio: 16 / 10;
634
+ background: linear-gradient(135deg, rgba(96, 165, 250, 0.15), rgba(96, 165, 250, 0.05));
635
+ border: 1px solid var(--px-border);
636
+ border-radius: var(--radius-lg);
637
+ position: relative;
638
+ overflow: hidden;
639
+ will-change: transform;
640
+ margin-block-end: 3rem;
641
+ opacity: 0;
642
+ transform: scale(0.9) rotate(-1deg);
643
+ animation: screenshotEntrance 1s cubic-bezier(0.16, 1, 0.3, 1) 0.2s forwards;
644
+ }
645
+ .project-hero__screenshot img {
646
+ width: 100%;
647
+ height: 100%;
648
+ object-fit: cover;
649
+ }
650
+ @keyframes screenshotEntrance {
651
+ 0% { opacity: 0; transform: scale(0.9) rotate(-1deg); }
652
+ 100% { opacity: 1; transform: scale(1) rotate(0deg); }
653
+ }
654
+ .project-hero__screenshot::before {
655
+ content: '';
656
+ position: absolute;
657
+ top: 0;
658
+ left: 0;
659
+ right: 0;
660
+ height: 32px;
661
+ background: rgba(255, 255, 255, 0.04);
662
+ border-bottom: 1px solid var(--px-border);
663
+ }
664
+ .project-hero__screenshot::after {
665
+ content: '';
666
+ position: absolute;
667
+ top: 10px;
668
+ left: 12px;
669
+ width: 12px;
670
+ height: 12px;
671
+ border-radius: 50%;
672
+ background: rgba(255, 255, 255, 0.1);
673
+ box-shadow: 18px 0 0 rgba(255, 255, 255, 0.1), 36px 0 0 rgba(255, 255, 255, 0.1);
674
+ }
675
+ .project-hero__title {
676
+ font-family: var(--font-display);
677
+ font-size: clamp(2rem, 5vw, 3.5rem);
678
+ font-weight: 700;
679
+ color: var(--px-accent);
680
+ letter-spacing: -0.03em;
681
+ line-height: 1.1;
682
+ opacity: 0;
683
+ transform: translateY(40px);
684
+ animation: flyUp 0.8s cubic-bezier(0.16, 1, 0.3, 1) 0.6s forwards;
685
+ }
686
+ .project-hero__links {
687
+ display: flex;
688
+ gap: 1rem;
689
+ margin-block-start: 1rem;
690
+ opacity: 0;
691
+ transform: translateY(30px);
692
+ animation: flyUp 0.8s cubic-bezier(0.16, 1, 0.3, 1) 0.8s forwards;
693
+ }
694
+ .project-hero__link {
695
+ font-family: var(--font-mono);
696
+ font-size: 0.8125rem;
697
+ color: var(--px-accent-blue);
698
+ text-decoration: none;
699
+ transition: color 0.2s;
700
+ }
701
+ .project-hero__link:hover { color: var(--px-accent); }
702
+ .project-hero__link:visited { color: var(--px-accent-blue); }
703
+
704
+ @keyframes flyUp {
705
+ 0% { opacity: 0; transform: translateY(40px); }
706
+ 100% { opacity: 1; transform: translateY(0); }
707
+ }
708
+
709
+ /* ── Narrative (project) ── */
710
+ .narrative p {
711
+ font-size: 1.0625rem;
712
+ color: var(--px-text-secondary);
713
+ line-height: 1.8;
714
+ margin-block-end: 1.5rem;
715
+ }
716
+ .narrative p:last-child {
717
+ margin-block-end: 0;
718
+ }
719
+
720
+ /* ── Stats Bar (project) ── */
721
+ .stats-bar {
722
+ display: flex;
723
+ flex-wrap: wrap;
724
+ gap: 1.5rem;
725
+ justify-content: center;
726
+ padding: 2rem;
727
+ background: var(--px-surface);
728
+ border: 1px solid var(--px-border);
729
+ border-radius: var(--radius-lg);
730
+ }
731
+ .stats-bar__item {
732
+ text-align: center;
733
+ min-width: 80px;
734
+ opacity: 0;
735
+ }
736
+ .stats-bar__item.fly-left {
737
+ transform: translateX(-60px);
738
+ }
739
+ .stats-bar__item.fly-right {
740
+ transform: translateX(60px);
741
+ }
742
+ .stats-bar__item.fly-visible,
743
+ .stats-bar__item.visible {
744
+ opacity: 1;
745
+ transform: translateX(0);
746
+ transition: opacity 0.7s cubic-bezier(0.16, 1, 0.3, 1),
747
+ transform 0.7s cubic-bezier(0.16, 1, 0.3, 1);
748
+ }
749
+ .stats-bar__value {
750
+ font-family: var(--font-display);
751
+ font-size: 1.5rem;
752
+ font-weight: 700;
753
+ color: var(--px-accent);
754
+ }
755
+ .stats-bar__label {
756
+ font-size: 0.6875rem;
757
+ color: var(--px-text-tertiary);
758
+ text-transform: uppercase;
759
+ letter-spacing: 0.08em;
760
+ margin-block-start: 0.125rem;
761
+ }
762
+
763
+ /* ── Work Timeline Chart (project) ── */
764
+ .timeline-chart__row {
765
+ display: grid;
766
+ grid-template-columns: 2.5rem 1fr 5rem;
767
+ gap: 0.75rem;
768
+ align-items: center;
769
+ padding: 0.75rem 0;
770
+ border-bottom: 1px solid var(--px-border);
771
+ }
772
+ .timeline-chart__row:last-child {
773
+ border-bottom: none;
774
+ }
775
+ .timeline-chart__num {
776
+ font-family: var(--font-mono);
777
+ font-size: 0.75rem;
778
+ color: var(--px-text-tertiary);
779
+ text-align: center;
780
+ }
781
+ .timeline-chart__bar-wrap {
782
+ position: relative;
783
+ height: 28px;
784
+ background: rgba(255, 255, 255, 0.02);
785
+ border-radius: 4px;
786
+ overflow: hidden;
787
+ }
788
+ .timeline-chart__bar {
789
+ height: 100%;
790
+ border-radius: 4px;
791
+ display: flex;
792
+ align-items: center;
793
+ padding-inline-start: 0.75rem;
794
+ transition: width 1.2s cubic-bezier(0.16, 1, 0.3, 1);
795
+ position: relative;
796
+ }
797
+ .timeline-chart__bar-label {
798
+ font-family: var(--font-body);
799
+ font-size: 0.75rem;
800
+ color: var(--px-text);
801
+ white-space: nowrap;
802
+ position: relative;
803
+ z-index: 1;
804
+ }
805
+ .timeline-chart__loc {
806
+ font-family: var(--font-mono);
807
+ font-size: 0.6875rem;
808
+ color: var(--px-text-tertiary);
809
+ text-align: right;
810
+ }
811
+ .bar--claude { background: rgba(96, 165, 250, 0.3); }
812
+ .bar--cursor { background: rgba(168, 85, 247, 0.3); }
813
+
814
+ /* ── Growth Chart (project) ── */
815
+ .growth-chart {
816
+ background: var(--px-surface);
817
+ border: 1px solid var(--px-border);
818
+ border-radius: var(--radius-lg);
819
+ padding: 1.5rem;
820
+ }
821
+ .growth-chart svg {
822
+ display: block;
823
+ height: auto;
824
+ }
825
+ .growth-line {
826
+ fill: none;
827
+ stroke: var(--px-accent-blue);
828
+ stroke-width: 2;
829
+ stroke-linecap: round;
830
+ stroke-linejoin: round;
831
+ stroke-dasharray: 1000;
832
+ stroke-dashoffset: 1000;
833
+ transition: stroke-dashoffset 2s cubic-bezier(0.16, 1, 0.3, 1);
834
+ }
835
+ .growth-line--visible,
836
+ .growth-line.visible {
837
+ stroke-dashoffset: 0;
838
+ }
839
+ .growth-area {
840
+ fill: url(#blueGradient);
841
+ opacity: 0;
842
+ transition: opacity 1.5s ease 0.5s;
843
+ }
844
+ .growth-area--visible,
845
+ .growth-area.visible {
846
+ opacity: 1;
847
+ }
848
+ .growth-dot {
849
+ fill: var(--px-accent-blue);
850
+ r: 3;
851
+ opacity: 0;
852
+ transition: opacity 0.3s;
853
+ }
854
+ .growth-dot--visible,
855
+ .growth-dot.visible {
856
+ opacity: 1;
857
+ }
858
+ .growth-chart__labels {
859
+ display: flex;
860
+ justify-content: space-between;
861
+ margin-block-start: 0.75rem;
862
+ font-family: var(--font-mono);
863
+ font-size: 0.625rem;
864
+ color: var(--px-text-tertiary);
865
+ }
866
+
867
+ /* ── Phase Timeline (project) ── */
868
+ .phase-timeline {
869
+ position: relative;
870
+ padding-inline-start: 2rem;
871
+ }
872
+ .phase-timeline::before {
873
+ content: '';
874
+ position: absolute;
875
+ top: 0;
876
+ bottom: 0;
877
+ left: 7px;
878
+ width: 1px;
879
+ background: var(--px-border);
880
+ }
881
+ .phase-item {
882
+ position: relative;
883
+ padding-block-end: 2.5rem;
884
+ opacity: 0;
885
+ transform: translateX(-50px);
886
+ transition: opacity 0.7s cubic-bezier(0.16, 1, 0.3, 1),
887
+ transform 0.7s cubic-bezier(0.16, 1, 0.3, 1);
888
+ }
889
+ .phase-item:last-child {
890
+ padding-block-end: 0;
891
+ }
892
+ .phase-item.phase-visible,
893
+ .phase-item.visible {
894
+ opacity: 1;
895
+ transform: translateX(0);
896
+ }
897
+ .phase-item__dot {
898
+ position: absolute;
899
+ left: -2rem;
900
+ top: 0.25rem;
901
+ width: 15px;
902
+ height: 15px;
903
+ border-radius: 50%;
904
+ border: 2px solid var(--px-accent-blue);
905
+ background: var(--px-bg);
906
+ }
907
+ .phase-item__num {
908
+ font-family: var(--font-mono);
909
+ font-size: 0.6875rem;
910
+ color: var(--px-accent-blue);
911
+ margin-block-end: 0.25rem;
912
+ }
913
+ .phase-item__title {
914
+ font-family: var(--font-display);
915
+ font-size: 1.125rem;
916
+ font-weight: 600;
917
+ color: var(--px-accent);
918
+ margin-block-end: 0.25rem;
919
+ }
920
+ .phase-item__desc {
921
+ font-size: 0.9375rem;
922
+ color: var(--px-text-secondary);
923
+ line-height: 1.6;
924
+ }
925
+
926
+ /* ── Skills Tags (project) ── */
927
+ .skills-wrap {
928
+ display: flex;
929
+ flex-wrap: wrap;
930
+ gap: 0.625rem;
931
+ }
932
+ .skill-tag {
933
+ font-family: var(--font-mono);
934
+ font-size: 0.75rem;
935
+ color: var(--px-accent-blue);
936
+ background: var(--px-accent-dim);
937
+ padding: 0.375rem 0.875rem;
938
+ border-radius: 9999px;
939
+ }
940
+
941
+ /* ── Key Decisions (project) ── */
942
+ .decisions-list {
943
+ list-style: none;
944
+ counter-reset: decisions;
945
+ }
946
+ .decisions-list li {
947
+ counter-increment: decisions;
948
+ position: relative;
949
+ padding-inline-start: 2.5rem;
950
+ padding-block-end: 1.25rem;
951
+ font-size: 0.9375rem;
952
+ color: var(--px-text-secondary);
953
+ line-height: 1.6;
954
+ }
955
+ .decisions-list li::before {
956
+ content: counter(decisions);
957
+ position: absolute;
958
+ left: 0;
959
+ top: 0;
960
+ font-family: var(--font-display);
961
+ font-size: 0.875rem;
962
+ font-weight: 700;
963
+ color: var(--px-accent-blue);
964
+ width: 1.75rem;
965
+ height: 1.75rem;
966
+ display: flex;
967
+ align-items: center;
968
+ justify-content: center;
969
+ border-radius: 50%;
970
+ background: var(--px-accent-dim);
971
+ }
972
+
973
+ /* ── Source Breakdown (project) ── */
974
+ .source-breakdown {
975
+ display: flex;
976
+ gap: 2rem;
977
+ align-items: center;
978
+ }
979
+ .source-ring {
980
+ width: 120px;
981
+ height: 120px;
982
+ flex-shrink: 0;
983
+ }
984
+ .source-ring circle {
985
+ fill: none;
986
+ stroke-width: 10;
987
+ stroke-linecap: round;
988
+ }
989
+ .source-ring__bg {
990
+ stroke: rgba(255, 255, 255, 0.06);
991
+ }
992
+ .source-ring__claude {
993
+ stroke: var(--px-accent-blue);
994
+ stroke-dasharray: 197;
995
+ stroke-dashoffset: 197;
996
+ transition: stroke-dashoffset 1.5s cubic-bezier(0.16, 1, 0.3, 1);
997
+ transform: rotate(-90deg);
998
+ transform-origin: center;
999
+ }
1000
+ .source-ring__claude--visible {
1001
+ stroke-dashoffset: 74;
1002
+ }
1003
+ .source-ring__cursor {
1004
+ stroke: #a855f7;
1005
+ stroke-dasharray: 197;
1006
+ stroke-dashoffset: 197;
1007
+ transition: stroke-dashoffset 1.5s cubic-bezier(0.16, 1, 0.3, 1) 0.3s;
1008
+ transform: rotate(135deg);
1009
+ transform-origin: center;
1010
+ }
1011
+ .source-ring__cursor--visible {
1012
+ stroke-dashoffset: 123;
1013
+ }
1014
+ .source-legend {
1015
+ display: flex;
1016
+ flex-direction: column;
1017
+ gap: 0.75rem;
1018
+ }
1019
+ .source-legend__item {
1020
+ display: flex;
1021
+ align-items: center;
1022
+ gap: 0.625rem;
1023
+ font-size: 0.875rem;
1024
+ color: var(--px-text-secondary);
1025
+ }
1026
+ .source-legend__dot {
1027
+ width: 10px;
1028
+ height: 10px;
1029
+ border-radius: 50%;
1030
+ flex-shrink: 0;
1031
+ }
1032
+ .source-legend__dot--claude { background: var(--px-accent-blue); }
1033
+ .source-legend__dot--cursor { background: #a855f7; }
1034
+
1035
+ /* ── Session Cards (project) ── */
1036
+ .session-grid {
1037
+ display: grid;
1038
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
1039
+ gap: 1rem;
1040
+ }
1041
+ .session-card {
1042
+ background: var(--px-surface);
1043
+ border: 1px solid var(--px-border);
1044
+ border-radius: var(--radius-lg);
1045
+ padding: 1.5rem;
1046
+ text-decoration: none;
1047
+ color: inherit;
1048
+ display: block;
1049
+ transition: transform 0.3s, border-color 0.3s, background 0.3s;
1050
+ opacity: 0;
1051
+ transform: scale(0.85) translateY(20px);
1052
+ }
1053
+ .session-card.card-visible {
1054
+ opacity: 1;
1055
+ transform: scale(1) translateY(0);
1056
+ transition: opacity 0.6s cubic-bezier(0.16, 1, 0.3, 1),
1057
+ transform 0.6s cubic-bezier(0.16, 1, 0.3, 1),
1058
+ border-color 0.3s, background 0.3s;
1059
+ }
1060
+ .session-card:hover {
1061
+ transform: translateY(-3px);
1062
+ border-color: rgba(96, 165, 250, 0.25);
1063
+ background: var(--px-surface-hover);
1064
+ }
1065
+ .session-card__num {
1066
+ font-family: var(--font-mono);
1067
+ font-size: 0.6875rem;
1068
+ color: var(--px-accent-blue);
1069
+ margin-block-end: 0.5rem;
1070
+ }
1071
+ .session-card__title {
1072
+ font-family: var(--font-display);
1073
+ font-size: 1rem;
1074
+ font-weight: 600;
1075
+ color: var(--px-accent);
1076
+ margin-block-end: 0.5rem;
1077
+ line-height: 1.3;
1078
+ }
1079
+ .session-card__take {
1080
+ font-size: 0.8125rem;
1081
+ color: var(--px-text-secondary);
1082
+ line-height: 1.5;
1083
+ margin-block-end: 0.75rem;
1084
+ font-style: italic;
1085
+ }
1086
+ .session-card__meta {
1087
+ font-family: var(--font-mono);
1088
+ font-size: 0.6875rem;
1089
+ color: var(--px-text-tertiary);
1090
+ display: flex;
1091
+ flex-wrap: wrap;
1092
+ gap: 0.75rem;
1093
+ }
1094
+ .session-card__tag {
1095
+ font-family: var(--font-mono);
1096
+ font-size: 0.625rem;
1097
+ color: var(--px-accent-blue);
1098
+ background: var(--px-accent-dim);
1099
+ padding: 0.125rem 0.5rem;
1100
+ border-radius: 9999px;
1101
+ margin-block-start: 0.75rem;
1102
+ display: inline-block;
1103
+ }
1104
+
1105
+ /* ══════════════════════════════════════════════════════
1106
+ SESSION PAGE
1107
+ ══════════════════════════════════════════════════════ */
1108
+
1109
+ /* ── Session Header ── */
1110
+ .session-header {
1111
+ position: relative;
1112
+ z-index: 1;
1113
+ max-width: 1100px;
1114
+ margin-inline: auto;
1115
+ padding: 8rem 2rem 3rem;
1116
+ }
1117
+ .session-header__breadcrumb {
1118
+ font-family: var(--font-mono);
1119
+ font-size: 0.75rem;
1120
+ color: var(--px-text-tertiary);
1121
+ margin-block-end: 1.5rem;
1122
+ opacity: 0;
1123
+ transform: translateY(20px);
1124
+ animation: headerFadeUp 0.7s cubic-bezier(0.16, 1, 0.3, 1) 0.1s forwards;
1125
+ }
1126
+ .session-header__breadcrumb a {
1127
+ color: var(--px-accent-blue);
1128
+ text-decoration: none;
1129
+ transition: color 0.2s;
1130
+ }
1131
+ .session-header__breadcrumb a:hover {
1132
+ color: var(--px-accent);
1133
+ }
1134
+ .session-header__breadcrumb a:visited {
1135
+ color: var(--px-accent-blue);
1136
+ }
1137
+ .session-header__breadcrumb-sep {
1138
+ margin-inline: 0.375rem;
1139
+ color: var(--px-text-tertiary);
1140
+ }
1141
+ .session-header__title {
1142
+ font-family: var(--font-display);
1143
+ font-size: clamp(1.75rem, 4vw, 2.5rem);
1144
+ font-weight: 700;
1145
+ color: var(--px-accent);
1146
+ letter-spacing: -0.03em;
1147
+ line-height: 1.2;
1148
+ max-width: 700px;
1149
+ opacity: 0;
1150
+ transform: translateY(30px);
1151
+ animation: headerFadeUp 0.8s cubic-bezier(0.16, 1, 0.3, 1) 0.25s forwards;
1152
+ }
1153
+ .session-header__meta {
1154
+ display: flex;
1155
+ flex-wrap: wrap;
1156
+ gap: 1.25rem;
1157
+ margin-block-start: 1.25rem;
1158
+ opacity: 0;
1159
+ transform: translateY(20px);
1160
+ animation: headerFadeUp 0.7s cubic-bezier(0.16, 1, 0.3, 1) 0.4s forwards;
1161
+ }
1162
+ @keyframes headerFadeUp {
1163
+ 0% { opacity: 0; transform: translateY(var(--header-offset, 20px)); }
1164
+ 100% { opacity: 1; transform: translateY(0); }
1165
+ }
1166
+ .session-header__meta-item {
1167
+ display: flex;
1168
+ flex-direction: column;
1169
+ gap: 0.125rem;
1170
+ }
1171
+ .session-header__meta-label {
1172
+ font-size: 0.625rem;
1173
+ color: var(--px-text-tertiary);
1174
+ text-transform: uppercase;
1175
+ letter-spacing: 0.08em;
1176
+ }
1177
+ .session-header__meta-value {
1178
+ font-family: var(--font-mono);
1179
+ font-size: 0.8125rem;
1180
+ color: var(--px-text);
1181
+ }
1182
+
1183
+ /* ── Page Layout (session) ── */
1184
+ .page-layout {
1185
+ position: relative;
1186
+ z-index: 1;
1187
+ display: grid;
1188
+ grid-template-columns: 1fr 280px;
1189
+ gap: 3rem;
1190
+ max-width: 1100px;
1191
+ margin-inline: auto;
1192
+ padding: 0 2rem;
1193
+ }
1194
+
1195
+ /* ── Dev Take ── */
1196
+ .dev-take {
1197
+ background: var(--px-surface);
1198
+ border: 1px solid var(--px-border);
1199
+ border-inline-start: 3px solid var(--px-accent-blue);
1200
+ border-radius: var(--radius-lg);
1201
+ padding: 1.5rem 1.75rem;
1202
+ margin-block-end: 3rem;
1203
+ }
1204
+ .dev-take__label {
1205
+ font-family: var(--font-display);
1206
+ font-size: 0.6875rem;
1207
+ font-weight: 600;
1208
+ color: var(--px-accent-blue);
1209
+ text-transform: uppercase;
1210
+ letter-spacing: 0.1em;
1211
+ margin-block-end: 0.5rem;
1212
+ }
1213
+ .dev-take__text {
1214
+ font-size: 1rem;
1215
+ color: var(--px-text-secondary);
1216
+ line-height: 1.7;
1217
+ font-style: italic;
1218
+ }
1219
+
1220
+ /* ── Section Labels (session) ── */
1221
+ .section-label {
1222
+ font-family: var(--font-display);
1223
+ font-size: 0.8125rem;
1224
+ font-weight: 600;
1225
+ color: var(--px-text-secondary);
1226
+ text-transform: uppercase;
1227
+ letter-spacing: 0.1em;
1228
+ margin-block-end: 1.5rem;
1229
+ }
1230
+
1231
+ /* ── Beats / Execution Path ── */
1232
+ .beats-list {
1233
+ list-style: none;
1234
+ position: relative;
1235
+ padding-inline-start: 2.5rem;
1236
+ margin-block-end: 4rem;
1237
+ }
1238
+ .beats-list::before {
1239
+ content: '';
1240
+ position: absolute;
1241
+ top: 0;
1242
+ bottom: 0;
1243
+ left: 9px;
1244
+ width: 1px;
1245
+ background: var(--px-border);
1246
+ }
1247
+ .beat-item {
1248
+ position: relative;
1249
+ padding-block-end: 2rem;
1250
+ opacity: 0;
1251
+ transform: translateX(-40px);
1252
+ transition: opacity 0.7s cubic-bezier(0.16, 1, 0.3, 1),
1253
+ transform 0.7s cubic-bezier(0.16, 1, 0.3, 1);
1254
+ }
1255
+ .beat-item:last-child {
1256
+ padding-block-end: 0;
1257
+ }
1258
+ .beat-item.beat-visible {
1259
+ opacity: 1;
1260
+ transform: translateX(0);
1261
+ }
1262
+ .beat-item__dot {
1263
+ position: absolute;
1264
+ left: -2.5rem;
1265
+ top: 0.2rem;
1266
+ width: 19px;
1267
+ height: 19px;
1268
+ border-radius: 50%;
1269
+ background: var(--px-bg);
1270
+ border: 2px solid var(--px-accent-blue);
1271
+ display: flex;
1272
+ align-items: center;
1273
+ justify-content: center;
1274
+ }
1275
+ .beat-item__dot::after {
1276
+ content: '';
1277
+ width: 7px;
1278
+ height: 7px;
1279
+ border-radius: 50%;
1280
+ background: var(--px-accent-blue);
1281
+ }
1282
+ .beat-item__num {
1283
+ font-family: var(--font-mono);
1284
+ font-size: 0.625rem;
1285
+ color: var(--px-accent-blue);
1286
+ margin-block-end: 0.25rem;
1287
+ }
1288
+ .beat-item__title {
1289
+ font-family: var(--font-display);
1290
+ font-size: 1.0625rem;
1291
+ font-weight: 600;
1292
+ color: var(--px-accent);
1293
+ margin-block-end: 0.375rem;
1294
+ }
1295
+ .beat-item__desc {
1296
+ font-size: 0.9375rem;
1297
+ color: var(--px-text-secondary);
1298
+ line-height: 1.6;
1299
+ }
1300
+
1301
+ /* ── Q&A Cards ── */
1302
+ .qa-list {
1303
+ margin-block-end: 4rem;
1304
+ }
1305
+ .qa-card {
1306
+ background: var(--px-surface);
1307
+ border: 1px solid var(--px-border);
1308
+ border-radius: var(--radius-lg);
1309
+ padding: 1.5rem;
1310
+ margin-block-end: 1rem;
1311
+ opacity: 0;
1312
+ transform: translateY(30px) scale(0.95);
1313
+ transition: opacity 0.7s cubic-bezier(0.16, 1, 0.3, 1),
1314
+ transform 0.7s cubic-bezier(0.16, 1, 0.3, 1);
1315
+ }
1316
+ .qa-card:last-child {
1317
+ margin-block-end: 0;
1318
+ }
1319
+ .qa-card.qa-visible {
1320
+ opacity: 1;
1321
+ transform: translateY(0) scale(1);
1322
+ }
1323
+ .qa-card__q {
1324
+ font-family: var(--font-display);
1325
+ font-size: 0.9375rem;
1326
+ font-weight: 600;
1327
+ color: var(--px-accent);
1328
+ margin-block-end: 0.75rem;
1329
+ line-height: 1.4;
1330
+ }
1331
+ .qa-card__q::before {
1332
+ content: 'Q';
1333
+ display: inline-flex;
1334
+ align-items: center;
1335
+ justify-content: center;
1336
+ width: 1.375rem;
1337
+ height: 1.375rem;
1338
+ border-radius: 4px;
1339
+ background: var(--px-accent-dim);
1340
+ color: var(--px-accent-blue);
1341
+ font-family: var(--font-mono);
1342
+ font-size: 0.6875rem;
1343
+ font-weight: 700;
1344
+ margin-inline-end: 0.625rem;
1345
+ vertical-align: middle;
1346
+ }
1347
+ .qa-card__a {
1348
+ font-size: 0.9375rem;
1349
+ color: var(--px-text-secondary);
1350
+ line-height: 1.7;
1351
+ padding-inline-start: 2rem;
1352
+ }
1353
+
1354
+ /* ── Agent Summary ── */
1355
+ .agent-section {
1356
+ margin-block-end: 4rem;
1357
+ }
1358
+ .agent-bars {
1359
+ display: flex;
1360
+ flex-direction: column;
1361
+ gap: 0.75rem;
1362
+ }
1363
+ .agent-bar {
1364
+ display: grid;
1365
+ grid-template-columns: 120px 1fr 60px 50px;
1366
+ gap: 0.75rem;
1367
+ align-items: center;
1368
+ }
1369
+ .agent-bar__role {
1370
+ font-family: var(--font-mono);
1371
+ font-size: 0.75rem;
1372
+ color: var(--px-text-secondary);
1373
+ text-align: right;
1374
+ }
1375
+ .agent-bar__track {
1376
+ height: 24px;
1377
+ background: rgba(255, 255, 255, 0.02);
1378
+ border-radius: 4px;
1379
+ overflow: hidden;
1380
+ position: relative;
1381
+ }
1382
+ .agent-bar__fill {
1383
+ height: 100%;
1384
+ border-radius: 4px;
1385
+ transition: width 1.2s cubic-bezier(0.16, 1, 0.3, 1);
1386
+ }
1387
+ .agent-bar__duration {
1388
+ font-family: var(--font-mono);
1389
+ font-size: 0.6875rem;
1390
+ color: var(--px-text-tertiary);
1391
+ text-align: right;
1392
+ }
1393
+ .agent-bar__loc {
1394
+ font-family: var(--font-mono);
1395
+ font-size: 0.6875rem;
1396
+ color: var(--px-text-tertiary);
1397
+ text-align: right;
1398
+ }
1399
+
1400
+ /* ── Sidebar ── */
1401
+ .sidebar {
1402
+ display: flex;
1403
+ flex-direction: column;
1404
+ gap: 1.5rem;
1405
+ padding-block-start: 1rem;
1406
+ }
1407
+ .sidebar-card {
1408
+ background: var(--px-surface);
1409
+ border: 1px solid var(--px-border);
1410
+ border-radius: var(--radius-lg);
1411
+ padding: 1.25rem;
1412
+ }
1413
+ .sidebar-card__title {
1414
+ font-family: var(--font-display);
1415
+ font-size: 0.6875rem;
1416
+ font-weight: 600;
1417
+ color: var(--px-text-secondary);
1418
+ text-transform: uppercase;
1419
+ letter-spacing: 0.08em;
1420
+ margin-block-end: 1rem;
1421
+ }
1422
+
1423
+ /* ── Sidebar: Tools Used ── */
1424
+ .tool-list {
1425
+ list-style: none;
1426
+ }
1427
+ .tool-item {
1428
+ display: flex;
1429
+ justify-content: space-between;
1430
+ align-items: center;
1431
+ padding: 0.5rem 0;
1432
+ border-bottom: 1px solid var(--px-border);
1433
+ }
1434
+ .tool-item:last-child {
1435
+ border-bottom: none;
1436
+ }
1437
+ .tool-item__name {
1438
+ font-family: var(--font-mono);
1439
+ font-size: 0.8125rem;
1440
+ color: var(--px-text);
1441
+ }
1442
+ .tool-item__count {
1443
+ font-family: var(--font-mono);
1444
+ font-size: 0.75rem;
1445
+ color: var(--px-text-tertiary);
1446
+ background: rgba(255, 255, 255, 0.04);
1447
+ padding: 0.125rem 0.5rem;
1448
+ border-radius: 9999px;
1449
+ }
1450
+
1451
+ /* ── Sidebar: Files Changed ── */
1452
+ .file-list {
1453
+ list-style: none;
1454
+ }
1455
+ .file-item {
1456
+ display: flex;
1457
+ justify-content: space-between;
1458
+ align-items: baseline;
1459
+ padding: 0.5rem 0;
1460
+ border-bottom: 1px solid var(--px-border);
1461
+ gap: 0.75rem;
1462
+ }
1463
+ .file-item:last-child {
1464
+ border-bottom: none;
1465
+ }
1466
+ .file-item__path {
1467
+ font-family: var(--font-mono);
1468
+ font-size: 0.6875rem;
1469
+ color: var(--px-text-secondary);
1470
+ word-break: break-all;
1471
+ min-width: 0;
1472
+ }
1473
+ .file-item__diff {
1474
+ font-family: var(--font-mono);
1475
+ font-size: 0.6875rem;
1476
+ color: #34d399;
1477
+ white-space: nowrap;
1478
+ flex-shrink: 0;
1479
+ }
1480
+
1481
+ /* ── Sidebar: Skills ── */
1482
+ .sidebar-skills {
1483
+ display: flex;
1484
+ flex-wrap: wrap;
1485
+ gap: 0.375rem;
1486
+ }
1487
+ .sidebar-skill {
1488
+ font-family: var(--font-mono);
1489
+ font-size: 0.6875rem;
1490
+ color: var(--px-accent-blue);
1491
+ background: var(--px-accent-dim);
1492
+ padding: 0.1875rem 0.625rem;
1493
+ border-radius: 9999px;
1494
+ }
1495
+
1496
+ /* ── Session Info DL ── */
1497
+ .session-info-list {
1498
+ display: flex;
1499
+ flex-direction: column;
1500
+ gap: 0;
1501
+ }
1502
+ .session-info-row {
1503
+ display: flex;
1504
+ justify-content: space-between;
1505
+ align-items: center;
1506
+ padding: 0.5rem 0;
1507
+ border-bottom: 1px solid var(--px-border);
1508
+ }
1509
+ .session-info-row:last-child {
1510
+ border-bottom: none;
1511
+ }
1512
+ .session-info-label {
1513
+ font-size: 0.75rem;
1514
+ color: var(--px-text-secondary);
1515
+ }
1516
+ .session-info-value {
1517
+ font-family: var(--font-mono);
1518
+ font-size: 0.8125rem;
1519
+ color: var(--px-text);
1520
+ }
1521
+
1522
+ /* ══════════════════════════════════════════════════════
1523
+ SCROLL REVEAL (all pages)
1524
+ ══════════════════════════════════════════════════════ */
1525
+ .reveal {
1526
+ opacity: 0;
1527
+ transform: translateY(30px);
1528
+ transition: opacity 0.8s cubic-bezier(0.16, 1, 0.3, 1),
1529
+ transform 0.8s cubic-bezier(0.16, 1, 0.3, 1);
1530
+ }
1531
+ .reveal--visible,
1532
+ .reveal.visible {
1533
+ opacity: 1;
1534
+ transform: translateY(0);
1535
+ }
1536
+ .reveal-stagger > .reveal:nth-child(1) { transition-delay: 0ms; }
1537
+ .reveal-stagger > .reveal:nth-child(2) { transition-delay: 80ms; }
1538
+ .reveal-stagger > .reveal:nth-child(3) { transition-delay: 160ms; }
1539
+ .reveal-stagger > .reveal:nth-child(4) { transition-delay: 240ms; }
1540
+ .reveal-stagger > .reveal:nth-child(5) { transition-delay: 320ms; }
1541
+ .reveal-stagger > .reveal:nth-child(6) { transition-delay: 400ms; }
1542
+
1543
+ /* ══════════════════════════════════════════════════════
1544
+ FOOTER (all pages)
1545
+ ══════════════════════════════════════════════════════ */
1546
+ .site-footer {
1547
+ position: relative;
1548
+ z-index: 1;
1549
+ text-align: center;
1550
+ padding: 3rem 2rem;
1551
+ font-size: 0.75rem;
1552
+ color: var(--px-text-tertiary);
1553
+ border-top: 1px solid var(--px-border);
1554
+ max-width: 1000px;
1555
+ margin-inline: auto;
1556
+ }
1557
+ .site-footer a {
1558
+ color: var(--px-accent-blue);
1559
+ text-decoration: none;
1560
+ }
1561
+ .site-footer a:visited {
1562
+ color: var(--px-accent-blue);
1563
+ }
1564
+
1565
+ /* ══════════════════════════════════════════════════════
1566
+ REDUCED MOTION
1567
+ ══════════════════════════════════════════════════════ */
1568
+ @media (prefers-reduced-motion: reduce) {
1569
+ *, *::before, *::after {
1570
+ transition-duration: 0.01ms !important;
1571
+ animation-duration: 0.01ms !important;
1572
+ animation-delay: 0ms !important;
1573
+ animation-fill-mode: forwards !important;
1574
+ }
1575
+ .photo-layer {
1576
+ position: relative !important;
1577
+ height: auto;
1578
+ padding: 6rem 2rem 2rem;
1579
+ }
1580
+ .photo-fixed {
1581
+ position: static !important;
1582
+ transform: none !important;
1583
+ opacity: 1 !important;
1584
+ width: 280px;
1585
+ mask-image: radial-gradient(ellipse 60% 70% at 55% 35%, black 30%, transparent 75%);
1586
+ -webkit-mask-image: radial-gradient(ellipse 60% 70% at 55% 35%, black 30%, transparent 75%);
1587
+ animation: none !important;
1588
+ }
1589
+ .hero__name,
1590
+ .hero__location,
1591
+ .hero__bio,
1592
+ .hero__contact {
1593
+ opacity: 1 !important;
1594
+ transform: none !important;
1595
+ animation: none !important;
1596
+ }
1597
+ .stat-card {
1598
+ opacity: 1 !important;
1599
+ transform: none !important;
1600
+ animation: none !important;
1601
+ }
1602
+ .project-hero__screenshot,
1603
+ .project-hero__title,
1604
+ .project-hero__links {
1605
+ opacity: 1 !important;
1606
+ transform: none !important;
1607
+ animation: none !important;
1608
+ }
1609
+ .stats-bar__item {
1610
+ opacity: 1 !important;
1611
+ transform: none !important;
1612
+ }
1613
+ .phase-item {
1614
+ opacity: 1 !important;
1615
+ transform: none !important;
1616
+ }
1617
+ .session-card {
1618
+ opacity: 1 !important;
1619
+ transform: none !important;
1620
+ }
1621
+ .session-header__breadcrumb,
1622
+ .session-header__title,
1623
+ .session-header__meta {
1624
+ opacity: 1 !important;
1625
+ transform: none !important;
1626
+ animation: none !important;
1627
+ }
1628
+ .beat-item {
1629
+ opacity: 1 !important;
1630
+ transform: none !important;
1631
+ }
1632
+ .qa-card {
1633
+ opacity: 1 !important;
1634
+ transform: none !important;
1635
+ }
1636
+ [data-float] {
1637
+ transform: none !important;
1638
+ }
1639
+ [data-parallax] { transform: none !important; }
1640
+ .reveal { opacity: 1; transform: none; }
1641
+ .bg-shapes { display: none; }
1642
+ .bg-shape { animation: none !important; }
1643
+ .transition-spacer { height: 2rem; }
1644
+ html { scroll-behavior: auto; }
1645
+ .growth-line { stroke-dashoffset: 0 !important; }
1646
+ .growth-area { opacity: 1 !important; }
1647
+ .growth-dot { opacity: 1 !important; }
1648
+ .source-ring__claude { stroke-dashoffset: 74 !important; }
1649
+ .source-ring__cursor { stroke-dashoffset: 123 !important; }
1650
+ }
1651
+
1652
+ /* ══════════════════════════════════════════════════════
1653
+ MOUNTED STATE — when injected into React via innerHTML,
1654
+ CSS animations don't replay. Force all elements visible.
1655
+ Mirrors the prefers-reduced-motion block but preserves
1656
+ parallax/float transforms and bg-shape decorative opacity.
1657
+ ══════════════════════════════════════════════════════ */
1658
+ .parallax--mounted *:not(.bg-shape):not([data-parallax]):not([data-float]):not([data-bg-drift]) {
1659
+ transition-duration: 0.01ms !important;
1660
+ animation-duration: 0.01ms !important;
1661
+ animation-delay: 0ms !important;
1662
+ animation-fill-mode: forwards !important;
1663
+ }
1664
+ .parallax--mounted .photo-fixed {
1665
+ position: static !important;
1666
+ transform: none !important;
1667
+ opacity: 1 !important;
1668
+ width: 280px;
1669
+ mask-image: radial-gradient(ellipse 60% 70% at 55% 35%, black 30%, transparent 75%);
1670
+ -webkit-mask-image: radial-gradient(ellipse 60% 70% at 55% 35%, black 30%, transparent 75%);
1671
+ animation: none !important;
1672
+ }
1673
+ .parallax--mounted .hero__name,
1674
+ .parallax--mounted .hero__location,
1675
+ .parallax--mounted .hero__bio,
1676
+ .parallax--mounted .hero__contact {
1677
+ opacity: 1 !important;
1678
+ transform: none !important;
1679
+ animation: none !important;
1680
+ }
1681
+ .parallax--mounted .stat-card {
1682
+ opacity: 1 !important;
1683
+ transform: none !important;
1684
+ animation: none !important;
1685
+ }
1686
+ .parallax--mounted .project-hero__screenshot,
1687
+ .parallax--mounted .project-hero__title,
1688
+ .parallax--mounted .project-hero__links {
1689
+ opacity: 1 !important;
1690
+ transform: none !important;
1691
+ animation: none !important;
1692
+ }
1693
+ .parallax--mounted .stats-bar__item {
1694
+ opacity: 1 !important;
1695
+ transform: none !important;
1696
+ }
1697
+ .parallax--mounted .phase-item {
1698
+ opacity: 1 !important;
1699
+ transform: none !important;
1700
+ }
1701
+ .parallax--mounted .session-card {
1702
+ opacity: 1 !important;
1703
+ transform: none !important;
1704
+ }
1705
+ .parallax--mounted .session-header__breadcrumb,
1706
+ .parallax--mounted .session-header__title,
1707
+ .parallax--mounted .session-header__meta {
1708
+ opacity: 1 !important;
1709
+ transform: none !important;
1710
+ animation: none !important;
1711
+ }
1712
+ .parallax--mounted .beat-item {
1713
+ opacity: 1 !important;
1714
+ transform: none !important;
1715
+ }
1716
+ .parallax--mounted .qa-card {
1717
+ opacity: 1 !important;
1718
+ transform: none !important;
1719
+ }
1720
+ .parallax--mounted .reveal {
1721
+ opacity: 1 !important;
1722
+ transform: none !important;
1723
+ }
1724
+ .parallax--mounted .growth-line {
1725
+ stroke-dashoffset: 0 !important;
1726
+ }
1727
+ .parallax--mounted .growth-area {
1728
+ opacity: 1 !important;
1729
+ }
1730
+ .parallax--mounted .growth-dot {
1731
+ opacity: 1 !important;
1732
+ }
1733
+ .parallax--mounted .source-ring__claude {
1734
+ stroke-dashoffset: 74 !important;
1735
+ }
1736
+ .parallax--mounted .source-ring__cursor {
1737
+ stroke-dashoffset: 123 !important;
1738
+ }
1739
+ /* Preserve parallax scroll transforms and bg-shape decorative animations */
1740
+ .parallax--mounted [data-parallax],
1741
+ .parallax--mounted [data-float],
1742
+ .parallax--mounted [data-bg-drift],
1743
+ .parallax--mounted .bg-shape {
1744
+ animation-duration: inherit !important;
1745
+ animation-delay: inherit !important;
1746
+ transition-duration: inherit !important;
1747
+ }
1748
+
1749
+ /* ══════════════════════════════════════════════════════
1750
+ MOBILE (<768px)
1751
+ ══════════════════════════════════════════════════════ */
1752
+ @media (max-width: 768px) {
1753
+ /* Portfolio mobile */
1754
+ .photo-layer {
1755
+ position: relative;
1756
+ height: auto;
1757
+ padding: 5rem 2rem 1rem;
1758
+ }
1759
+ .photo-fixed {
1760
+ width: 240px;
1761
+ position: static;
1762
+ transform: none !important;
1763
+ opacity: 1 !important;
1764
+ animation: photoEntrance 1.2s cubic-bezier(0.16, 1, 0.3, 1) forwards;
1765
+ }
1766
+ .transition-spacer {
1767
+ height: 0;
1768
+ }
1769
+ .hero {
1770
+ min-height: auto;
1771
+ padding: 2rem 1.5rem 3rem;
1772
+ }
1773
+ .hero__name {
1774
+ font-size: 2.25rem;
1775
+ margin-block-start: 0;
1776
+ }
1777
+ .stats-row {
1778
+ flex-wrap: wrap;
1779
+ gap: 0.75rem;
1780
+ }
1781
+ .stat-card {
1782
+ min-width: 80px;
1783
+ padding: 1rem 1.25rem;
1784
+ }
1785
+ .stat-card__value {
1786
+ font-size: 1.375rem;
1787
+ }
1788
+ .project-grid {
1789
+ grid-template-columns: 1fr;
1790
+ }
1791
+ .about-grid {
1792
+ grid-template-columns: 1fr;
1793
+ }
1794
+ .section--opaque,
1795
+ .about-section--opaque,
1796
+ .footer--opaque,
1797
+ .skills-overview {
1798
+ background: transparent;
1799
+ }
1800
+ [data-float] {
1801
+ transform: none !important;
1802
+ }
1803
+ .bg-shapes { display: none; }
1804
+
1805
+ /* Project mobile */
1806
+ .project-hero {
1807
+ min-height: auto;
1808
+ padding: 6rem 1.5rem 3rem;
1809
+ }
1810
+ .project-hero__title { font-size: 1.75rem; }
1811
+ .stats-bar { gap: 1rem; padding: 1.25rem; }
1812
+ .stats-bar__value { font-size: 1.125rem; }
1813
+ .timeline-chart__row { grid-template-columns: 1.5rem 1fr 3.5rem; gap: 0.5rem; }
1814
+ .session-grid { grid-template-columns: 1fr; }
1815
+ .source-breakdown { flex-direction: column; align-items: flex-start; }
1816
+ .stats-bar__item,
1817
+ .phase-item,
1818
+ .session-card {
1819
+ opacity: 1 !important;
1820
+ transform: none !important;
1821
+ }
1822
+
1823
+ /* Session mobile */
1824
+ .session-header {
1825
+ padding: 6rem 1.5rem 2rem;
1826
+ }
1827
+ .session-header__title { font-size: 1.5rem; }
1828
+ .session-header__meta { gap: 0.75rem; }
1829
+ .page-layout {
1830
+ grid-template-columns: 1fr;
1831
+ padding: 0 1.5rem;
1832
+ }
1833
+ .sidebar {
1834
+ order: -1;
1835
+ padding-block-start: 0;
1836
+ }
1837
+ .agent-bar {
1838
+ grid-template-columns: 80px 1fr 45px 40px;
1839
+ gap: 0.5rem;
1840
+ }
1841
+ .agent-bar__role { font-size: 0.625rem; }
1842
+ .beat-item,
1843
+ .qa-card {
1844
+ opacity: 1 !important;
1845
+ transform: none !important;
1846
+ }
1847
+
1848
+ /* Shared mobile */
1849
+ [data-parallax] { transform: none !important; }
1850
+ }
1851
+
1852
+ /* ── Tablet (769-1024) ── */
1853
+ @media (min-width: 769px) and (max-width: 1024px) {
1854
+ .photo-fixed {
1855
+ width: 320px;
1856
+ }
1857
+ }
1858
+
1859
+ /* ── Clickable cards ── */
1860
+ a.project-card,
1861
+ a.session-card {
1862
+ text-decoration: none;
1863
+ color: inherit;
1864
+ display: block;
1865
+ transition: transform 0.15s ease, box-shadow 0.15s ease;
1866
+ }
1867
+ a.project-card:hover,
1868
+ a.session-card:hover {
1869
+ transform: translateY(-2px);
1870
+ }
1871
+ a.project-card:visited,
1872
+ a.session-card:visited {
1873
+ color: inherit;
1874
+ }