heyiam 0.2.28 → 0.3.0

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