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,1229 @@
1
+ /* ══════════════════════════════════════════════════════════════
2
+ Noir Template — Pure monochrome, bold typography, film drama
3
+ ══════════════════════════════════════════════════════════════ */
4
+
5
+ /* ── Design Tokens ── */
6
+ :root {
7
+ --noir-bg: #000000;
8
+ --noir-surface: #0a0a0a;
9
+ --noir-card: #141414;
10
+ --noir-border: #2a2a2a;
11
+ --noir-border-strong: #404040;
12
+ --noir-text: #e5e5e5;
13
+ --noir-text-secondary: #a3a3a3;
14
+ --noir-text-muted: #737373;
15
+ --noir-white: #ffffff;
16
+ --noir-highlight: #e5e5e5;
17
+ --noir-rule: #333333;
18
+
19
+ --font-display: 'Space Grotesk', sans-serif;
20
+ --font-body: 'Inter', sans-serif;
21
+ --font-mono: 'IBM Plex Mono', monospace;
22
+
23
+ --radius: 0px;
24
+ }
25
+ body { background: var(--noir-bg); color: var(--noir-text); }
26
+
27
+
28
+ /* ── Page Shell ── */
29
+ .noir-page {
30
+ max-width: 900px;
31
+ margin: 0 auto;
32
+ padding: 2rem 1.5rem;
33
+ font-family: var(--font-body);
34
+ color: var(--noir-text);
35
+ background-color: var(--noir-bg);
36
+ line-height: 1.6;
37
+ -webkit-font-smoothing: antialiased;
38
+ -moz-osx-font-smoothing: grayscale;
39
+ }
40
+
41
+ .noir-page a { color: var(--noir-text); text-decoration: none; }
42
+ .noir-page a:visited { color: var(--noir-text); }
43
+ .noir-page a:hover { text-decoration: underline; }
44
+
45
+ /* ── Section Fade-in ── */
46
+ .noir-section {
47
+ opacity: 1;
48
+ transform: translateY(0);
49
+ margin-block-end: 3rem;
50
+ }
51
+
52
+ /* ── Horizontal Rule Divider ── */
53
+ .noir-rule {
54
+ border: none;
55
+ height: 1px;
56
+ background: var(--noir-rule);
57
+ margin-block: 3rem;
58
+ }
59
+
60
+ /* ── Section Headers ── */
61
+ .noir-heading {
62
+ font-family: var(--font-display);
63
+ font-weight: 700;
64
+ font-size: 1.5rem;
65
+ color: var(--noir-white);
66
+ letter-spacing: -0.02em;
67
+ margin-block-end: 1.5rem;
68
+ }
69
+
70
+ /* ── Breadcrumb ── */
71
+ .noir-breadcrumb {
72
+ font-family: var(--font-mono);
73
+ font-size: 0.8125rem;
74
+ color: var(--noir-text-muted);
75
+ margin-block-end: 2rem;
76
+ display: flex;
77
+ align-items: center;
78
+ gap: 0.5rem;
79
+ flex-wrap: wrap;
80
+ }
81
+ .noir-breadcrumb a { color: var(--noir-text-secondary); }
82
+ .noir-breadcrumb a:hover { color: var(--noir-white); }
83
+ .noir-breadcrumb__sep { color: var(--noir-border-strong); }
84
+
85
+ /* ══════════════════════════════════════════════════════════════
86
+ PORTFOLIO
87
+ ══════════════════════════════════════════════════════════════ */
88
+
89
+ /* ── Hero Profile ── */
90
+ .noir-hero {
91
+ display: grid;
92
+ grid-template-columns: 380px 1fr;
93
+ gap: 3rem;
94
+ align-items: start;
95
+ padding-block-end: 2rem;
96
+ }
97
+
98
+ .noir-hero__photo {
99
+ width: 100%;
100
+ height: auto;
101
+ display: block;
102
+ filter: grayscale(1) contrast(1.2);
103
+ border-radius: 0px;
104
+ }
105
+
106
+ .noir-hero__content {
107
+ padding-block-start: 0.5rem;
108
+ }
109
+
110
+ .noir-hero__name {
111
+ font-family: var(--font-display);
112
+ font-weight: 700;
113
+ font-size: clamp(3rem, 7vw, 5rem);
114
+ color: var(--noir-white);
115
+ letter-spacing: -0.04em;
116
+ line-height: 0.95;
117
+ text-transform: uppercase;
118
+ margin-block-end: 1.5rem;
119
+ }
120
+
121
+ .noir-hero__bio {
122
+ font-size: 1.0625rem;
123
+ color: var(--noir-text-secondary);
124
+ max-width: 420px;
125
+ line-height: 1.7;
126
+ margin-block-end: 1.5rem;
127
+ }
128
+
129
+ .noir-hero__location {
130
+ font-family: var(--font-mono);
131
+ font-size: 0.8125rem;
132
+ color: var(--noir-text-muted);
133
+ margin-block-end: 0.75rem;
134
+ }
135
+
136
+ .noir-hero__contact {
137
+ font-family: var(--font-mono);
138
+ font-size: 0.8125rem;
139
+ color: var(--noir-text-secondary);
140
+ line-height: 1.8;
141
+ }
142
+ .noir-hero__contact a {
143
+ color: var(--noir-text-secondary);
144
+ transition: color 0.2s;
145
+ }
146
+ .noir-hero__contact a:hover {
147
+ color: var(--noir-white);
148
+ text-decoration: none;
149
+ }
150
+ .noir-hero__contact .noir-middot {
151
+ color: var(--noir-text-muted);
152
+ margin-inline: 0.5rem;
153
+ }
154
+
155
+ .noir-hero__resume {
156
+ display: inline-flex;
157
+ align-items: center;
158
+ gap: 0.375rem;
159
+ font-family: var(--font-mono);
160
+ font-size: 0.8125rem;
161
+ color: var(--noir-text-secondary);
162
+ margin-block-start: 0.5rem;
163
+ transition: color 0.2s;
164
+ }
165
+ .noir-hero__resume:hover {
166
+ color: var(--noir-white);
167
+ text-decoration: none;
168
+ }
169
+
170
+ /* ── Portfolio Stats Row ── */
171
+ .noir-stats-row {
172
+ display: flex;
173
+ align-items: baseline;
174
+ gap: 0;
175
+ }
176
+
177
+ .noir-stats-row__item {
178
+ flex: 1;
179
+ text-align: center;
180
+ padding-block: 1rem;
181
+ }
182
+ .noir-stats-row__item + .noir-stats-row__item {
183
+ border-inline-start: 1px solid var(--noir-rule);
184
+ }
185
+
186
+ .noir-stats-row__value {
187
+ font-family: var(--font-display);
188
+ font-weight: 700;
189
+ font-size: clamp(1.75rem, 4vw, 2.5rem);
190
+ color: var(--noir-white);
191
+ line-height: 1.1;
192
+ display: block;
193
+ }
194
+
195
+ .noir-stats-row__label {
196
+ font-family: var(--font-mono);
197
+ font-size: 0.6875rem;
198
+ color: var(--noir-text-muted);
199
+ text-transform: uppercase;
200
+ letter-spacing: 0.1em;
201
+ margin-block-start: 0.375rem;
202
+ display: block;
203
+ }
204
+
205
+ /* ── Leverage ── */
206
+ .noir-leverage {
207
+ display: flex;
208
+ align-items: baseline;
209
+ justify-content: center;
210
+ gap: 0.75rem;
211
+ padding-block: 1rem;
212
+ text-align: center;
213
+ }
214
+ .noir-leverage__multi {
215
+ font-family: var(--font-display);
216
+ font-weight: 700;
217
+ font-size: 2rem;
218
+ color: var(--noir-white);
219
+ line-height: 1;
220
+ }
221
+ .noir-leverage__sep {
222
+ color: rgba(255,255,255,0.15);
223
+ font-size: 1.25rem;
224
+ }
225
+ .noir-leverage__detail {
226
+ font-family: var(--font-mono);
227
+ font-size: 0.875rem;
228
+ color: var(--noir-text-muted);
229
+ letter-spacing: 0.02em;
230
+ }
231
+
232
+ /* ── Work Timeline (portfolio) ── */
233
+ .noir-timeline {
234
+ display: flex;
235
+ flex-direction: column;
236
+ gap: 0.5rem;
237
+ }
238
+
239
+ .noir-timeline__row {
240
+ display: grid;
241
+ grid-template-columns: 120px 1fr 60px;
242
+ align-items: center;
243
+ gap: 1rem;
244
+ }
245
+
246
+ .noir-timeline__label {
247
+ font-family: var(--font-mono);
248
+ font-size: 0.75rem;
249
+ color: var(--noir-text-muted);
250
+ text-align: right;
251
+ overflow: hidden;
252
+ text-overflow: ellipsis;
253
+ white-space: nowrap;
254
+ }
255
+
256
+ .noir-timeline__bar-track {
257
+ height: 20px;
258
+ background: var(--noir-surface);
259
+ position: relative;
260
+ }
261
+
262
+ .noir-timeline__bar {
263
+ height: 100%;
264
+ background: var(--noir-white);
265
+ position: absolute;
266
+ left: 0;
267
+ top: 0;
268
+ transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1);
269
+ }
270
+
271
+ .noir-timeline__value {
272
+ font-family: var(--font-mono);
273
+ font-size: 0.75rem;
274
+ color: var(--noir-text-secondary);
275
+ text-align: right;
276
+ }
277
+
278
+ /* ── Project Cards ── */
279
+ .noir-projects {
280
+ display: flex;
281
+ flex-direction: column;
282
+ gap: 1px;
283
+ background: var(--noir-border);
284
+ border: 1px solid var(--noir-border);
285
+ }
286
+
287
+ .noir-project {
288
+ background: var(--noir-card);
289
+ padding: 2rem;
290
+ display: grid;
291
+ grid-template-columns: 1fr auto;
292
+ gap: 1.5rem;
293
+ transition: background 0.2s;
294
+ text-decoration: none;
295
+ color: inherit;
296
+ }
297
+ .noir-project:hover {
298
+ background: #1a1a1a;
299
+ text-decoration: none;
300
+ }
301
+
302
+ .noir-project__title {
303
+ font-family: var(--font-display);
304
+ font-weight: 700;
305
+ font-size: 1.25rem;
306
+ color: var(--noir-white);
307
+ margin-block-end: 0.5rem;
308
+ }
309
+
310
+ .noir-project__narrative {
311
+ font-size: 0.9375rem;
312
+ color: var(--noir-text-secondary);
313
+ line-height: 1.7;
314
+ margin-block-end: 1rem;
315
+ }
316
+
317
+ .noir-project__skills {
318
+ display: flex;
319
+ flex-wrap: wrap;
320
+ gap: 0.5rem;
321
+ margin-block-end: 1rem;
322
+ }
323
+
324
+ .noir-project__meta {
325
+ font-family: var(--font-mono);
326
+ font-size: 0.8125rem;
327
+ color: var(--noir-text-muted);
328
+ }
329
+
330
+ .noir-project__sidebar {
331
+ display: flex;
332
+ flex-direction: column;
333
+ align-items: flex-end;
334
+ gap: 1rem;
335
+ min-width: 140px;
336
+ }
337
+
338
+ .noir-project__stat-num {
339
+ font-family: var(--font-display);
340
+ font-weight: 700;
341
+ font-size: 1.75rem;
342
+ color: var(--noir-white);
343
+ line-height: 1;
344
+ }
345
+
346
+ .noir-project__stat-label {
347
+ font-family: var(--font-mono);
348
+ font-size: 0.6875rem;
349
+ color: var(--noir-text-muted);
350
+ text-transform: uppercase;
351
+ letter-spacing: 0.08em;
352
+ }
353
+
354
+ /* ── Source Breakdown (portfolio) ── */
355
+ .noir-source-breakdown {
356
+ display: flex;
357
+ flex-direction: column;
358
+ gap: 1rem;
359
+ }
360
+
361
+ .noir-source-bar-overall__track {
362
+ display: flex;
363
+ height: 8px;
364
+ background: var(--noir-surface);
365
+ border: 1px solid var(--noir-border);
366
+ overflow: hidden;
367
+ }
368
+ .noir-source-bar-overall__fill { height: 100%; background: var(--noir-white); }
369
+ .noir-source-bar-overall__fill--secondary { height: 100%; background: var(--noir-text-muted); }
370
+
371
+ .noir-source-legend {
372
+ display: flex;
373
+ gap: 2rem;
374
+ font-family: var(--font-mono);
375
+ font-size: 0.8125rem;
376
+ }
377
+
378
+ .noir-source-legend__item {
379
+ display: flex;
380
+ align-items: center;
381
+ gap: 0.5rem;
382
+ color: var(--noir-text-secondary);
383
+ }
384
+
385
+ .noir-source-legend__swatch {
386
+ width: 12px;
387
+ height: 12px;
388
+ display: inline-block;
389
+ }
390
+ .noir-source-legend__swatch--primary { background: var(--noir-white); }
391
+ .noir-source-legend__swatch--secondary { background: var(--noir-text-muted); }
392
+
393
+ /* ══════════════════════════════════════════════════════════════
394
+ PROJECT
395
+ ══════════════════════════════════════════════════════════════ */
396
+
397
+ /* ── Project Header ── */
398
+ .noir-project-header {
399
+ margin-block-end: 2rem;
400
+ }
401
+
402
+ .noir-project-header__title {
403
+ font-family: var(--font-display);
404
+ font-weight: 700;
405
+ font-size: clamp(2rem, 5vw, 3.5rem);
406
+ color: var(--noir-white);
407
+ letter-spacing: -0.03em;
408
+ line-height: 1.1;
409
+ margin-block-end: 1rem;
410
+ }
411
+
412
+ .noir-project-header__links {
413
+ font-family: var(--font-mono);
414
+ font-size: 0.8125rem;
415
+ color: var(--noir-text-muted);
416
+ display: flex;
417
+ gap: 1.5rem;
418
+ flex-wrap: wrap;
419
+ }
420
+ .noir-project-header__links a {
421
+ color: var(--noir-text-secondary);
422
+ border-bottom: 1px solid var(--noir-border-strong);
423
+ padding-block-end: 2px;
424
+ }
425
+ .noir-project-header__links a:hover {
426
+ color: var(--noir-white);
427
+ text-decoration: none;
428
+ border-color: var(--noir-white);
429
+ }
430
+
431
+ /* ── Screenshot ── */
432
+ .noir-screenshot {
433
+ background: var(--noir-surface);
434
+ border: 1px solid var(--noir-border);
435
+ aspect-ratio: 16 / 9;
436
+ display: flex;
437
+ align-items: center;
438
+ justify-content: center;
439
+ position: relative;
440
+ overflow: hidden;
441
+ }
442
+
443
+ .noir-screenshot__chrome {
444
+ position: absolute;
445
+ top: 0;
446
+ left: 0;
447
+ right: 0;
448
+ height: 32px;
449
+ background: var(--noir-card);
450
+ border-bottom: 1px solid var(--noir-border);
451
+ display: flex;
452
+ align-items: center;
453
+ padding-inline-start: 12px;
454
+ gap: 6px;
455
+ z-index: 1;
456
+ }
457
+
458
+ .noir-screenshot__dot {
459
+ width: 8px;
460
+ height: 8px;
461
+ border-radius: 50%;
462
+ background: var(--noir-border-strong);
463
+ }
464
+
465
+ .noir-screenshot__img {
466
+ width: 100%;
467
+ height: 100%;
468
+ object-fit: cover;
469
+ }
470
+
471
+ .noir-screenshot__gradient {
472
+ width: 100%;
473
+ height: 100%;
474
+ background: linear-gradient(135deg, #1a1a1a 0%, #0a0a0a 50%, #1a1a1a 100%);
475
+ }
476
+
477
+ .noir-screenshot__label {
478
+ position: absolute;
479
+ font-family: var(--font-mono);
480
+ font-size: 0.75rem;
481
+ color: var(--noir-text-muted);
482
+ }
483
+
484
+ /* ── Stats Grid (project) ── */
485
+ .noir-stats-grid {
486
+ display: grid;
487
+ grid-template-columns: repeat(4, 1fr);
488
+ gap: 1px;
489
+ background: var(--noir-border);
490
+ border: 1px solid var(--noir-border);
491
+ }
492
+
493
+ .noir-stat-cell {
494
+ background: var(--noir-surface);
495
+ padding: 1.25rem 1rem;
496
+ text-align: center;
497
+ }
498
+
499
+ .noir-stat-cell__value {
500
+ font-family: var(--font-display);
501
+ font-weight: 700;
502
+ font-size: 1.5rem;
503
+ color: var(--noir-white);
504
+ line-height: 1.1;
505
+ display: block;
506
+ }
507
+
508
+ .noir-stat-cell__label {
509
+ font-family: var(--font-mono);
510
+ font-size: 0.625rem;
511
+ color: var(--noir-text-muted);
512
+ text-transform: uppercase;
513
+ letter-spacing: 0.1em;
514
+ margin-block-start: 0.375rem;
515
+ display: block;
516
+ }
517
+
518
+ /* ── Narrative ── */
519
+ .noir-narrative p {
520
+ font-size: 1rem;
521
+ color: var(--noir-text-secondary);
522
+ line-height: 1.8;
523
+ margin-block-end: 1.25rem;
524
+ }
525
+ .noir-narrative p:last-child { margin-block-end: 0; }
526
+
527
+ /* ── Session Timeline (project) ── */
528
+ .noir-session-timeline {
529
+ display: flex;
530
+ flex-direction: column;
531
+ gap: 0;
532
+ }
533
+
534
+ .noir-session-row {
535
+ display: grid;
536
+ grid-template-columns: 40px 1fr 220px 80px;
537
+ align-items: center;
538
+ gap: 1rem;
539
+ padding: 0.875rem 1rem;
540
+ border-bottom: 1px solid var(--noir-border);
541
+ transition: background 0.15s;
542
+ }
543
+ .noir-session-row:first-child { border-top: 1px solid var(--noir-border); }
544
+ .noir-session-row:hover { background: var(--noir-card); }
545
+
546
+ .noir-session-row__num {
547
+ font-family: var(--font-mono);
548
+ font-size: 0.75rem;
549
+ color: var(--noir-text-muted);
550
+ text-align: center;
551
+ }
552
+
553
+ .noir-session-row__title {
554
+ font-size: 0.9375rem;
555
+ color: var(--noir-text);
556
+ font-weight: 500;
557
+ }
558
+
559
+ .noir-session-row__bar-wrap {
560
+ display: flex;
561
+ align-items: center;
562
+ gap: 0.75rem;
563
+ }
564
+
565
+ .noir-session-row__bar-track {
566
+ flex: 1;
567
+ height: 12px;
568
+ background: var(--noir-surface);
569
+ position: relative;
570
+ }
571
+
572
+ .noir-session-row__bar {
573
+ height: 100%;
574
+ background: var(--noir-white);
575
+ position: absolute;
576
+ left: 0;
577
+ top: 0;
578
+ width: var(--bar-width, 0%);
579
+ transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1);
580
+ }
581
+
582
+ .noir-session-row__loc {
583
+ font-family: var(--font-mono);
584
+ font-size: 0.75rem;
585
+ color: var(--noir-text-muted);
586
+ white-space: nowrap;
587
+ }
588
+
589
+ .noir-session-row__date {
590
+ font-family: var(--font-mono);
591
+ font-size: 0.75rem;
592
+ color: var(--noir-text-muted);
593
+ text-align: right;
594
+ }
595
+
596
+ /* ── Phases (Arc) ── */
597
+ .noir-phases {
598
+ display: flex;
599
+ flex-direction: column;
600
+ gap: 0;
601
+ counter-reset: phase;
602
+ }
603
+
604
+ .noir-phase {
605
+ display: grid;
606
+ grid-template-columns: 60px 1fr;
607
+ gap: 1.5rem;
608
+ padding: 1.5rem 0;
609
+ border-bottom: 1px solid var(--noir-border);
610
+ counter-increment: phase;
611
+ }
612
+ .noir-phase:first-child { border-top: 1px solid var(--noir-border); }
613
+
614
+ .noir-phase__number {
615
+ font-family: var(--font-display);
616
+ font-weight: 700;
617
+ font-size: 2rem;
618
+ color: var(--noir-white);
619
+ line-height: 1;
620
+ text-align: center;
621
+ }
622
+
623
+ .noir-phase__name {
624
+ font-family: var(--font-display);
625
+ font-weight: 600;
626
+ font-size: 1.125rem;
627
+ color: var(--noir-white);
628
+ margin-block-end: 0.375rem;
629
+ }
630
+
631
+ .noir-phase__dates {
632
+ font-family: var(--font-mono);
633
+ font-size: 0.75rem;
634
+ color: var(--noir-text-muted);
635
+ margin-block-end: 0.375rem;
636
+ }
637
+
638
+ .noir-phase__desc {
639
+ font-size: 0.9375rem;
640
+ color: var(--noir-text-secondary);
641
+ }
642
+
643
+ /* ── Key Decisions ── */
644
+ .noir-decisions {
645
+ list-style: none;
646
+ counter-reset: decision;
647
+ }
648
+
649
+ .noir-decision {
650
+ counter-increment: decision;
651
+ padding: 1.25rem 0;
652
+ border-bottom: 1px solid var(--noir-border);
653
+ display: grid;
654
+ grid-template-columns: 40px 1fr;
655
+ gap: 1rem;
656
+ }
657
+ .noir-decision:first-child { border-top: 1px solid var(--noir-border); }
658
+
659
+ .noir-decision__num {
660
+ font-family: var(--font-display);
661
+ font-weight: 700;
662
+ font-size: 1.25rem;
663
+ color: var(--noir-white);
664
+ text-align: center;
665
+ }
666
+
667
+ .noir-decision__text {
668
+ font-size: 0.9375rem;
669
+ color: var(--noir-text-secondary);
670
+ line-height: 1.7;
671
+ }
672
+
673
+ /* ── Source Breakdown (project) ── */
674
+ .noir-source-bar-large {
675
+ display: flex;
676
+ height: 8px;
677
+ background: var(--noir-surface);
678
+ border: 1px solid var(--noir-border);
679
+ overflow: hidden;
680
+ }
681
+ .noir-source-bar-large__fill { height: 100%; background: var(--noir-white); }
682
+ .noir-source-bar-large__fill--secondary { height: 100%; background: var(--noir-text-muted); }
683
+
684
+ /* ── Featured Sessions ── */
685
+ .noir-featured-sessions {
686
+ display: grid;
687
+ grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
688
+ gap: 1px;
689
+ background: var(--noir-border);
690
+ border: 1px solid var(--noir-border);
691
+ }
692
+
693
+ .noir-featured-card {
694
+ background: var(--noir-card);
695
+ padding: 1.5rem;
696
+ display: flex;
697
+ flex-direction: column;
698
+ gap: 0.5rem;
699
+ transition: background 0.15s;
700
+ text-decoration: none;
701
+ color: inherit;
702
+ }
703
+ .noir-featured-card:hover {
704
+ background: #1a1a1a;
705
+ text-decoration: none;
706
+ }
707
+
708
+ .noir-featured-card__tag {
709
+ font-family: var(--font-mono);
710
+ font-size: 0.6875rem;
711
+ color: var(--noir-text-muted);
712
+ text-transform: uppercase;
713
+ letter-spacing: 0.1em;
714
+ }
715
+
716
+ .noir-featured-card__title {
717
+ font-family: var(--font-display);
718
+ font-weight: 600;
719
+ font-size: 1rem;
720
+ color: var(--noir-white);
721
+ }
722
+
723
+ .noir-featured-card__meta {
724
+ font-family: var(--font-mono);
725
+ font-size: 0.75rem;
726
+ color: var(--noir-text-muted);
727
+ }
728
+
729
+ .noir-featured-card__agents {
730
+ font-family: var(--font-mono);
731
+ font-size: 0.6875rem;
732
+ color: var(--noir-text-muted);
733
+ }
734
+
735
+ /* ══════════════════════════════════════════════════════════════
736
+ SESSION
737
+ ══════════════════════════════════════════════════════════════ */
738
+
739
+ /* ── Session Header ── */
740
+ .noir-session-header {
741
+ margin-block-end: 2rem;
742
+ }
743
+
744
+ .noir-session-header__title {
745
+ font-family: var(--font-display);
746
+ font-weight: 700;
747
+ font-size: clamp(1.75rem, 4.5vw, 2.75rem);
748
+ color: var(--noir-white);
749
+ letter-spacing: -0.03em;
750
+ line-height: 1.15;
751
+ margin-block-end: 1.25rem;
752
+ }
753
+
754
+ .noir-session-header__meta {
755
+ display: flex;
756
+ flex-wrap: wrap;
757
+ gap: 1.5rem;
758
+ font-family: var(--font-mono);
759
+ font-size: 0.8125rem;
760
+ color: var(--noir-text-muted);
761
+ }
762
+
763
+ .noir-session-header__meta-item {
764
+ display: flex;
765
+ align-items: center;
766
+ gap: 0.375rem;
767
+ }
768
+
769
+ .noir-session-header__meta-value {
770
+ color: var(--noir-text);
771
+ }
772
+
773
+ /* ── Dev Take ── */
774
+ .noir-dev-take {
775
+ background: var(--noir-surface);
776
+ border-left: 3px solid var(--noir-white);
777
+ padding: 1.25rem 1.5rem;
778
+ margin-block-end: 0;
779
+ }
780
+
781
+ .noir-dev-take__label {
782
+ font-family: var(--font-mono);
783
+ font-size: 0.6875rem;
784
+ color: var(--noir-text-muted);
785
+ text-transform: uppercase;
786
+ letter-spacing: 0.1em;
787
+ margin-block-end: 0.5rem;
788
+ }
789
+
790
+ .noir-dev-take__text {
791
+ font-size: 1rem;
792
+ color: var(--noir-text-secondary);
793
+ line-height: 1.7;
794
+ font-style: italic;
795
+ }
796
+
797
+ /* ── Session Stats Row ── */
798
+ .noir-stats-row-session {
799
+ display: grid;
800
+ grid-template-columns: repeat(4, 1fr);
801
+ gap: 1px;
802
+ background: var(--noir-border);
803
+ border: 1px solid var(--noir-border);
804
+ }
805
+
806
+ /* ── Main Content + Sidebar Layout ── */
807
+ .noir-layout {
808
+ display: grid;
809
+ grid-template-columns: 1fr 280px;
810
+ gap: 3rem;
811
+ align-items: start;
812
+ }
813
+
814
+ /* ── Highlights ── */
815
+ .noir-highlights {
816
+ list-style: none;
817
+ display: flex;
818
+ flex-direction: column;
819
+ gap: 0.75rem;
820
+ }
821
+ .noir-highlights li {
822
+ font-size: 0.9375rem;
823
+ color: var(--noir-text-secondary);
824
+ line-height: 1.7;
825
+ padding-inline-start: 1.25rem;
826
+ position: relative;
827
+ }
828
+ .noir-highlights li::before {
829
+ content: '';
830
+ position: absolute;
831
+ left: 0;
832
+ top: 0.625rem;
833
+ width: 6px;
834
+ height: 6px;
835
+ background: var(--noir-white);
836
+ }
837
+
838
+ /* ── Execution Path (Beats) ── */
839
+ .noir-beats {
840
+ list-style: none;
841
+ counter-reset: beat;
842
+ }
843
+
844
+ .noir-beat {
845
+ counter-increment: beat;
846
+ padding: 1.5rem 0;
847
+ border-bottom: 1px solid var(--noir-border);
848
+ display: grid;
849
+ grid-template-columns: 48px 1fr;
850
+ gap: 1rem;
851
+ }
852
+ .noir-beat:first-child { border-top: 1px solid var(--noir-border); }
853
+
854
+ .noir-beat__number {
855
+ font-family: var(--font-display);
856
+ font-weight: 700;
857
+ font-size: 1.75rem;
858
+ color: var(--noir-white);
859
+ line-height: 1;
860
+ text-align: center;
861
+ }
862
+
863
+ .noir-beat__title {
864
+ font-family: var(--font-display);
865
+ font-weight: 600;
866
+ font-size: 1.0625rem;
867
+ color: var(--noir-white);
868
+ margin-block-end: 0.375rem;
869
+ }
870
+
871
+ .noir-beat__desc {
872
+ font-size: 0.9375rem;
873
+ color: var(--noir-text-secondary);
874
+ line-height: 1.7;
875
+ }
876
+
877
+ /* ── Q&A ── */
878
+ .noir-qa-list {
879
+ display: flex;
880
+ flex-direction: column;
881
+ gap: 0;
882
+ }
883
+
884
+ .noir-qa {
885
+ padding: 1.5rem 0;
886
+ border-bottom: 1px solid var(--noir-border);
887
+ }
888
+ .noir-qa:first-child { border-top: 1px solid var(--noir-border); }
889
+
890
+ .noir-qa__question {
891
+ font-family: var(--font-display);
892
+ font-weight: 600;
893
+ font-size: 1rem;
894
+ color: var(--noir-white);
895
+ margin-block-end: 0.75rem;
896
+ line-height: 1.5;
897
+ }
898
+
899
+ .noir-qa__answer {
900
+ font-size: 0.9375rem;
901
+ color: var(--noir-text-secondary);
902
+ line-height: 1.7;
903
+ }
904
+
905
+ /* ── Agent Summary ── */
906
+ .noir-agent-count {
907
+ font-family: var(--font-mono);
908
+ font-size: 0.8125rem;
909
+ color: var(--noir-text-muted);
910
+ margin-block-end: 1.25rem;
911
+ }
912
+
913
+ .noir-agents {
914
+ display: flex;
915
+ flex-direction: column;
916
+ gap: 0;
917
+ }
918
+
919
+ .noir-agent-row {
920
+ display: grid;
921
+ grid-template-columns: 1fr 80px 60px;
922
+ align-items: center;
923
+ padding: 0.75rem 0;
924
+ border-bottom: 1px solid var(--noir-border);
925
+ }
926
+ .noir-agent-row:first-child { border-top: 1px solid var(--noir-border); }
927
+
928
+ .noir-agent-row__role {
929
+ font-size: 0.9375rem;
930
+ color: var(--noir-text);
931
+ font-weight: 500;
932
+ }
933
+
934
+ .noir-agent-row__duration {
935
+ font-family: var(--font-mono);
936
+ font-size: 0.8125rem;
937
+ color: var(--noir-text-muted);
938
+ text-align: right;
939
+ }
940
+
941
+ .noir-agent-row__loc {
942
+ font-family: var(--font-mono);
943
+ font-size: 0.8125rem;
944
+ color: var(--noir-text-muted);
945
+ text-align: right;
946
+ }
947
+
948
+ /* ── Agent Bar Chart ── */
949
+ .noir-agent-bars {
950
+ display: flex;
951
+ flex-direction: column;
952
+ gap: 0.625rem;
953
+ margin-block-start: 1rem;
954
+ }
955
+
956
+ .noir-agent-bar-row {
957
+ display: grid;
958
+ grid-template-columns: 100px 1fr 40px;
959
+ align-items: center;
960
+ gap: 0.75rem;
961
+ }
962
+
963
+ .noir-agent-bar-row__label {
964
+ font-family: var(--font-mono);
965
+ font-size: 0.6875rem;
966
+ color: var(--noir-text-muted);
967
+ text-align: right;
968
+ overflow: hidden;
969
+ text-overflow: ellipsis;
970
+ white-space: nowrap;
971
+ }
972
+
973
+ .noir-agent-bar-row__track {
974
+ height: 16px;
975
+ background: var(--noir-surface);
976
+ position: relative;
977
+ }
978
+
979
+ .noir-agent-bar-row__fill {
980
+ height: 100%;
981
+ background: var(--noir-white);
982
+ position: absolute;
983
+ left: 0;
984
+ top: 0;
985
+ transition: width 0.5s cubic-bezier(0.4, 0, 0.2, 1);
986
+ }
987
+
988
+ .noir-agent-bar-row__value {
989
+ font-family: var(--font-mono);
990
+ font-size: 0.6875rem;
991
+ color: var(--noir-text-muted);
992
+ text-align: right;
993
+ }
994
+
995
+ /* ── Sidebar ── */
996
+ .noir-sidebar {
997
+ display: flex;
998
+ flex-direction: column;
999
+ gap: 2rem;
1000
+ }
1001
+
1002
+ .noir-sidebar-section {
1003
+ background: var(--noir-surface);
1004
+ border: 1px solid var(--noir-border);
1005
+ padding: 1.25rem;
1006
+ }
1007
+
1008
+ .noir-sidebar-section__title {
1009
+ font-family: var(--font-mono);
1010
+ font-size: 0.6875rem;
1011
+ color: var(--noir-text-muted);
1012
+ text-transform: uppercase;
1013
+ letter-spacing: 0.1em;
1014
+ margin-block-end: 1rem;
1015
+ padding-block-end: 0.75rem;
1016
+ border-bottom: 1px solid var(--noir-border);
1017
+ }
1018
+
1019
+ /* ── Tool Usage Table ── */
1020
+ .noir-tool-table {
1021
+ width: 100%;
1022
+ border-collapse: collapse;
1023
+ }
1024
+ .noir-tool-table tr {
1025
+ border-bottom: 1px solid var(--noir-border);
1026
+ }
1027
+ .noir-tool-table tr:last-child { border-bottom: none; }
1028
+ .noir-tool-table td {
1029
+ padding: 0.5rem 0;
1030
+ font-size: 0.875rem;
1031
+ }
1032
+ .noir-tool-table td:first-child {
1033
+ font-family: var(--font-mono);
1034
+ font-size: 0.8125rem;
1035
+ color: var(--noir-text);
1036
+ }
1037
+ .noir-tool-table td:last-child {
1038
+ font-family: var(--font-mono);
1039
+ font-size: 0.8125rem;
1040
+ color: var(--noir-text-muted);
1041
+ text-align: right;
1042
+ }
1043
+
1044
+ /* ── File Changes ── */
1045
+ .noir-file-list {
1046
+ list-style: none;
1047
+ display: flex;
1048
+ flex-direction: column;
1049
+ gap: 0;
1050
+ }
1051
+
1052
+ .noir-file-item {
1053
+ padding: 0.5rem 0;
1054
+ border-bottom: 1px solid var(--noir-border);
1055
+ display: flex;
1056
+ justify-content: space-between;
1057
+ align-items: baseline;
1058
+ gap: 0.5rem;
1059
+ }
1060
+ .noir-file-item:last-child { border-bottom: none; }
1061
+
1062
+ .noir-file-item__name {
1063
+ font-family: var(--font-mono);
1064
+ font-size: 0.75rem;
1065
+ color: var(--noir-text);
1066
+ overflow: hidden;
1067
+ text-overflow: ellipsis;
1068
+ white-space: nowrap;
1069
+ flex: 1;
1070
+ min-width: 0;
1071
+ }
1072
+
1073
+ .noir-file-item__diff {
1074
+ font-family: var(--font-mono);
1075
+ font-size: 0.75rem;
1076
+ color: var(--noir-text-secondary);
1077
+ white-space: nowrap;
1078
+ flex-shrink: 0;
1079
+ }
1080
+
1081
+ /* ── Skills Chips (shared) ── */
1082
+ .noir-chips {
1083
+ display: flex;
1084
+ flex-wrap: wrap;
1085
+ gap: 0.5rem;
1086
+ }
1087
+
1088
+ .noir-chip {
1089
+ font-family: var(--font-mono);
1090
+ font-size: 0.75rem;
1091
+ color: var(--noir-text);
1092
+ border: 1px solid var(--noir-border-strong);
1093
+ padding: 0.25rem 0.625rem;
1094
+ border-radius: var(--radius);
1095
+ white-space: nowrap;
1096
+ }
1097
+
1098
+ /* ── Footer ── */
1099
+ .noir-footer {
1100
+ border-top: 1px solid var(--noir-rule);
1101
+ padding-block-start: 2rem;
1102
+ margin-block-start: 3rem;
1103
+ text-align: center;
1104
+ }
1105
+
1106
+ .noir-footer__text {
1107
+ font-family: var(--font-mono);
1108
+ font-size: 0.75rem;
1109
+ color: var(--noir-text-muted);
1110
+ }
1111
+
1112
+ /* ══════════════════════════════════════════════════════════════
1113
+ RESPONSIVE
1114
+ ══════════════════════════════════════════════════════════════ */
1115
+
1116
+ @media (max-width: 768px) {
1117
+ .noir-page { padding: 1.25rem 1rem; }
1118
+
1119
+ .noir-hero {
1120
+ grid-template-columns: 1fr;
1121
+ gap: 2rem;
1122
+ }
1123
+ .noir-hero__photo {
1124
+ width: 100%;
1125
+ max-width: 100%;
1126
+ max-height: 300px;
1127
+ object-fit: cover;
1128
+ }
1129
+ .noir-hero__name {
1130
+ font-size: clamp(2.5rem, 10vw, 4rem);
1131
+ }
1132
+ .noir-hero__bio {
1133
+ max-width: none;
1134
+ }
1135
+
1136
+ .noir-stats-row {
1137
+ flex-wrap: wrap;
1138
+ }
1139
+ .noir-stats-row__item {
1140
+ flex: 1 1 45%;
1141
+ min-width: 0;
1142
+ }
1143
+ .noir-stats-row__item:nth-child(n+3) {
1144
+ border-block-start: 1px solid var(--noir-rule);
1145
+ }
1146
+ .noir-stats-row__item:nth-child(odd) {
1147
+ border-inline-start: none;
1148
+ }
1149
+
1150
+ .noir-project {
1151
+ grid-template-columns: 1fr;
1152
+ }
1153
+ .noir-project__sidebar {
1154
+ flex-direction: row;
1155
+ align-items: center;
1156
+ min-width: auto;
1157
+ }
1158
+
1159
+ .noir-timeline__row {
1160
+ grid-template-columns: 80px 1fr 50px;
1161
+ }
1162
+
1163
+ .noir-stats-grid { grid-template-columns: repeat(3, 1fr); }
1164
+
1165
+ .noir-session-row {
1166
+ grid-template-columns: 30px 1fr 60px;
1167
+ }
1168
+ .noir-session-row__bar-wrap { display: none; }
1169
+
1170
+ .noir-phase { grid-template-columns: 40px 1fr; }
1171
+
1172
+ .noir-featured-sessions { grid-template-columns: 1fr; }
1173
+
1174
+ .noir-layout {
1175
+ grid-template-columns: 1fr;
1176
+ gap: 2rem;
1177
+ }
1178
+ .noir-sidebar { order: -1; }
1179
+
1180
+ .noir-stats-row-session { grid-template-columns: repeat(2, 1fr); }
1181
+
1182
+ .noir-beat { grid-template-columns: 36px 1fr; }
1183
+
1184
+ .noir-session-header__meta { gap: 1rem; }
1185
+ .noir-agent-bar-row { grid-template-columns: 80px 1fr 36px; }
1186
+
1187
+ .noir-hero__contact {
1188
+ font-size: 0.75rem;
1189
+ line-height: 2;
1190
+ }
1191
+ .noir-hero__contact .noir-middot {
1192
+ display: none;
1193
+ }
1194
+ .noir-hero__contact a {
1195
+ display: block;
1196
+ }
1197
+ }
1198
+
1199
+ @media (max-width: 480px) {
1200
+ .noir-leverage {
1201
+ flex-direction: column;
1202
+ gap: 0.25rem;
1203
+ }
1204
+ .noir-leverage__sep { display: none; }
1205
+ .noir-stats-grid { grid-template-columns: repeat(2, 1fr); }
1206
+ .noir-project-header__title { font-size: 1.375rem; }
1207
+ }
1208
+
1209
+ /* ── Reduced Motion ── */
1210
+ @media (prefers-reduced-motion: reduce) {
1211
+ .noir-section {
1212
+ opacity: 1;
1213
+ transform: none;
1214
+ transition: none;
1215
+ }
1216
+ .noir-timeline__bar { transition: none; }
1217
+ .noir-session-row__bar { transition: none; }
1218
+ .noir-agent-bar-row__fill { transition: none; }
1219
+ }
1220
+
1221
+ /* ── Focus Styles ── */
1222
+ .noir-page :focus-visible {
1223
+ outline: 2px solid var(--noir-white);
1224
+ outline-offset: 2px;
1225
+ }
1226
+
1227
+
1228
+ /* Live-edit empty field hiding */
1229
+ [data-portfolio-empty="true"] { display: none; }