heyiam 0.2.29 → 0.3.1

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