gabriel / musehub public
_user-profile.scss
1,166 lines 51.0 KB
Raw
sha256:9590cee1e0ccd6c76528f005b95d634d80f5019f0dcb7c371e149adc31d1fb65 refactor: enforce gRPC framing on all MWP wire traffic Sonnet 4.6 minor ⚠ breaking 156 days ago
1 // _user-profile.scss — User profile page (.prof-*, .collab-*, .rank-* prefixes)
2
3 // ── Phase 1: provenance identity profile ─────────────────────────────────────
4
5 // ── Provenance badge strip ────────────────────────────────────────────────────
6 .prof-badge-strip {
7 display: grid;
8 grid-template-columns: repeat(4, 1fr);
9 gap: var(--space-3);
10 margin-top: var(--space-3);
11 @media (max-width: 1000px) { grid-template-columns: repeat(3, 1fr); }
12 @media (max-width: 640px) { grid-template-columns: repeat(2, 1fr); }
13 }
14
15 // Stats bar (inline row in hero)
16 .prof-stats-bar {
17 display: flex;
18 align-items: center;
19 gap: 6px;
20 flex-wrap: wrap;
21 font-size: 13px;
22 color: var(--text-secondary);
23 margin-top: var(--space-1);
24 }
25 .prof-stat { display: inline-flex; align-items: center; gap: 4px; strong { color: var(--text-primary); font-weight: 600; } }
26 .prof-stat-dot { color: var(--border-default); }
27 .prof-stat--health-good { color: var(--color-success); strong { color: var(--color-success); } }
28 .prof-stat--health-fair { color: var(--color-warning); strong { color: var(--color-warning); } }
29 .prof-stat--health-poor { color: var(--color-danger); strong { color: var(--color-danger); } }
30
31 // Identity type badge + derived note
32 .prof-type-badge {
33 display: inline-flex; align-items: center;
34 font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.06em;
35 padding: 2px 7px; border-radius: 4px; border: 1px solid transparent;
36 &--human { background: rgba(56,189,248,0.12); color: #38bdf8; border-color: rgba(56,189,248,0.25); }
37 &--agent { background: rgba(167,139,250,0.12); color: var(--color-accent); border-color: rgba(167,139,250,0.25); }
38 &--org { background: rgba(251,191,36,0.12); color: #fbbf24; border-color: rgba(251,191,36,0.25); }
39 }
40 .prof-derived-note {
41 font-size: 10px; color: var(--text-muted); padding: 2px 6px;
42 border: 1px dashed var(--border-subtle); border-radius: 4px;
43 }
44
45 // ── Repo card grid ────────────────────────────────────────────────────────────
46 .prof-repo-grid {
47 display: grid; grid-template-columns: repeat(2, 1fr); gap: var(--space-3);
48 @media (max-width: 680px) { grid-template-columns: 1fr; }
49 }
50 .prof-repo-card {
51 display: flex; flex-direction: column; gap: var(--space-2); padding: var(--space-4);
52 background: var(--bg-surface); border: 1px solid var(--border-default);
53 border-radius: var(--radius-md); text-decoration: none; color: inherit;
54 transition: border-color 0.15s, transform 0.15s, box-shadow 0.15s;
55 --card-accent: var(--color-accent);
56 &:hover {
57 border-color: var(--card-accent); transform: translateY(-2px);
58 box-shadow: 0 4px 16px rgba(0,0,0,0.25);
59 }
60 }
61 .prof-repo-card__header {
62 display: flex; align-items: flex-start; justify-content: space-between; gap: 8px;
63 }
64 .prof-repo-card__name {
65 font-size: 13px; font-weight: 700; color: var(--color-accent);
66 word-break: break-all; line-height: 1.3;
67 }
68 .prof-repo-card__badges { display: flex; align-items: center; gap: 6px; flex-shrink: 0; }
69 .prof-repo-card__desc {
70 font-size: 12px; color: var(--text-muted); margin: 0; line-height: 1.4;
71 display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
72 }
73 .prof-repo-card__footer {
74 display: flex; align-items: center; gap: 6px; font-size: 11px; color: var(--text-muted);
75 flex-wrap: wrap; margin-top: auto; padding-top: var(--space-2);
76 border-top: 1px solid var(--border-subtle);
77 }
78 .prof-repo-card__agent-commits { color: var(--color-accent-alt, #a78bfa); font-weight: 600; }
79
80 // ── Agent Fleet strip ─────────────────────────────────────────────────────────
81 .prof-fleet-strip {
82 display: flex; gap: var(--space-3); overflow-x: auto; padding-bottom: var(--space-1);
83 scrollbar-width: thin; scrollbar-color: var(--border-default) transparent;
84 }
85 .prof-fleet-card {
86 flex-shrink: 0; display: flex; align-items: center; gap: var(--space-3);
87 padding: var(--space-3) var(--space-4); min-width: 220px; max-width: 280px;
88 background: var(--bg-surface); border: 1px solid var(--border-default);
89 border-radius: var(--radius-md); text-decoration: none; color: inherit;
90 transition: border-color 0.15s, transform 0.15s, box-shadow 0.15s;
91 &:hover {
92 border-color: var(--border-strong); transform: translateY(-1px);
93 box-shadow: 0 2px 8px rgba(0,0,0,0.2);
94 }
95 }
96 .prof-fleet-card__avatar {
97 width: 36px; height: 36px; flex-shrink: 0; border-radius: 50%;
98 background: color-mix(in srgb, var(--color-accent) 12%, transparent);
99 color: var(--color-accent); display: flex; align-items: center; justify-content: center;
100 }
101 .prof-fleet-card__body { flex: 1; min-width: 0; }
102 .prof-fleet-card__name {
103 font-size: 12px; font-weight: 700; color: var(--text-primary);
104 white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
105 }
106 .prof-fleet-card__model { font-size: 11px; color: var(--color-accent); margin-top: 1px; }
107 .prof-fleet-card__stats {
108 display: flex; flex-direction: column; align-items: flex-end; gap: 3px;
109 font-size: 11px; color: var(--text-muted); flex-shrink: 0;
110 }
111 .prof-fleet-card__stat { display: flex; align-items: center; gap: 3px; }
112
113 // ── Symbol / File Footprint table ─────────────────────────────────────────────
114 .prof-footprint-table {
115 width: 100%; border-collapse: collapse; font-size: 12px;
116 }
117 .prof-footprint-th {
118 text-align: left; font-size: 10px; font-weight: 600; font-family: var(--font-mono);
119 color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.05em;
120 padding: 6px 8px; border-bottom: 1px solid var(--border-default);
121 &--num { text-align: right; }
122 }
123 .prof-footprint-row {
124 border-bottom: 1px solid var(--border-subtle);
125 &:last-child { border-bottom: none; }
126 &:hover { background: var(--bg-overlay); }
127 }
128 .prof-footprint-td {
129 padding: 7px 8px; vertical-align: middle;
130 &--num { text-align: right; }
131 &--date { white-space: nowrap; color: var(--text-muted); font-size: 11px; }
132 }
133 .prof-footprint-name {
134 font-weight: 600; color: var(--color-accent); font-family: var(--font-mono);
135 font-size: 12px; display: block; text-decoration: none;
136 &:hover { text-decoration: underline; }
137 }
138 .prof-footprint-path {
139 font-size: 10px; color: var(--text-muted); font-family: var(--font-mono);
140 display: block; margin-top: 1px;
141 }
142 .prof-footprint-repo {
143 font-size: 11px; color: var(--color-accent); text-decoration: none;
144 font-family: var(--font-mono);
145 &:hover { text-decoration: underline; }
146 }
147 .prof-footprint-count {
148 font-weight: 700; color: var(--text-primary); font-family: var(--font-mono);
149 }
150 .prof-footprint-op {
151 display: inline-block; font-size: 9px; font-weight: 700;
152 font-family: var(--font-mono); text-transform: uppercase; letter-spacing: 0.04em;
153 padding: 1px 5px; border-radius: 3px; margin-right: 5px;
154 &--add { background: color-mix(in srgb, var(--color-success) 15%, transparent); color: var(--color-success); }
155 &--modify { background: color-mix(in srgb, var(--color-accent) 15%, transparent); color: var(--color-accent); }
156 &--patch { background: color-mix(in srgb, var(--color-accent) 15%, transparent); color: var(--color-accent); }
157 &--delete { background: color-mix(in srgb, var(--color-danger) 15%, transparent); color: var(--color-danger); }
158 &--rename { background: color-mix(in srgb, var(--color-warning) 15%, transparent); color: var(--color-warning); }
159 }
160
161 .prof-repo-private {
162 font-size: 10px; padding: 2px 6px; border-radius: 4px;
163 background: var(--bg-overlay); color: var(--text-muted); border: 1px solid var(--border-subtle);
164 }
165 .prof-repo-health {
166 display: inline-flex; align-items: center; gap: 3px;
167 font-size: 11px; font-weight: 600;
168 &--good { color: var(--color-success); }
169 &--fair { color: var(--color-warning); }
170 &--poor { color: var(--color-danger); }
171 }
172 .prof-meta-sep { color: var(--border-default); }
173
174 // Provenance chip on activity rows
175 .prof-prov-chip {
176 display: inline-flex; align-items: center; gap: 3px;
177 font-size: 10px; font-weight: 600; padding: 1px 6px; border-radius: 4px;
178 &--human { background: var(--bg-overlay); color: var(--text-muted); }
179 &--agent { background: rgba(167,139,250,0.12); color: var(--color-accent); }
180 }
181
182 // Activity icon variants
183 .prof-activity-icon {
184 &--commit { color: var(--text-muted); }
185 &--proposal { color: var(--color-success); }
186 &--issue { color: var(--color-warning); }
187 &--tag { color: var(--color-accent); }
188 &--branch { color: var(--text-muted); }
189 &--session { color: #2dd4bf; }
190 }
191
192 // ── Phase 2: heatmap ─────────────────────────────────────────────────────────
193
194 // Color tokens — human uses accent blue-green, agent uses purple
195 :root {
196 --hm-empty: var(--bg-inset);
197 --hm-human-1: color-mix(in srgb, var(--color-accent) 20%, transparent);
198 --hm-human-2: color-mix(in srgb, var(--color-accent) 50%, transparent);
199 --hm-human-3: color-mix(in srgb, var(--color-accent) 85%, transparent);
200 --hm-agent-1: color-mix(in srgb, #a78bfa 20%, transparent);
201 --hm-agent-2: color-mix(in srgb, #a78bfa 50%, transparent);
202 --hm-agent-3: color-mix(in srgb, #a78bfa 85%, transparent);
203 --hm-mixed-1: color-mix(in srgb, #60a5fa 20%, transparent);
204 --hm-mixed-2: color-mix(in srgb, #60a5fa 50%, transparent);
205 --hm-mixed-3: color-mix(in srgb, #60a5fa 85%, transparent);
206 }
207
208 .prof-heatmap-card {
209 background: var(--bg-surface);
210 border: 1px solid var(--border-default);
211 border-radius: var(--radius-md);
212 padding: var(--space-4);
213 }
214 .prof-heatmap-wrap {
215 display: flex;
216 gap: 6px;
217 }
218 .prof-heatmap-days {
219 display: flex;
220 flex-direction: column;
221 gap: 2px;
222 padding-top: 22px; // align with cells (below month label row)
223 flex-shrink: 0;
224 }
225 .prof-heatmap-daylbl {
226 font-size: 9px;
227 color: var(--text-muted);
228 height: 12px;
229 line-height: 12px;
230 width: 22px;
231 text-align: right;
232 white-space: nowrap;
233 }
234 .prof-heatmap-grid-area {
235 display: flex;
236 flex-direction: column;
237 gap: 4px;
238 flex: 1;
239 min-width: 0;
240 }
241 .prof-heatmap-months {
242 position: relative;
243 height: 18px;
244 flex-shrink: 0;
245 }
246 .prof-heatmap-month {
247 position: absolute;
248 font-size: 10px;
249 color: var(--text-muted);
250 white-space: nowrap;
251 top: 0;
252 transform: translateX(-50%);
253 }
254 .prof-heatmap-cols {
255 display: flex;
256 justify-content: space-between;
257 width: 100%;
258 }
259 .prof-heatmap-col {
260 display: flex;
261 flex-direction: column;
262 gap: 2px;
263 }
264
265 // Cell coloring — human (default), agent-only, mixed
266 .prof-heatmap-cell {
267 width: 11px;
268 height: 11px;
269 border-radius: 2px;
270 flex-shrink: 0;
271 cursor: default;
272 transition: opacity 0.1s, transform 0.1s;
273 &:hover { transform: scale(1.4); opacity: 0.9; }
274
275 &[data-intensity="0"] { background: var(--hm-empty); }
276 &[data-intensity="1"] { background: var(--hm-human-1); }
277 &[data-intensity="2"] { background: var(--hm-human-2); }
278 &[data-intensity="3"] { background: var(--hm-human-3); }
279
280 &--agent {
281 &[data-intensity="1"] { background: var(--hm-agent-1); }
282 &[data-intensity="2"] { background: var(--hm-agent-2); }
283 &[data-intensity="3"] { background: var(--hm-agent-3); }
284 }
285 &--mixed {
286 &[data-intensity="1"] { background: var(--hm-mixed-1); }
287 &[data-intensity="2"] { background: var(--hm-mixed-2); }
288 &[data-intensity="3"] { background: var(--hm-mixed-3); }
289 }
290 }
291
292 .prof-heatmap-stats {
293 display: flex;
294 align-items: center;
295 gap: 6px;
296 margin-top: var(--space-3);
297 font-size: 11px;
298 color: var(--text-muted);
299 flex-wrap: wrap;
300 strong { color: var(--text-primary); }
301 }
302 .prof-hm-stat-dot { color: var(--border-default); }
303
304 // Tab nav as links (SSR — no JS tab switching)
305 .prof-tab-btn {
306 display: inline-flex; align-items: center; gap: 6px; padding: 10px 16px;
307 border: none; background: none; cursor: pointer; color: var(--text-muted);
308 border-bottom: 2px solid transparent; font-size: 13px; white-space: nowrap; flex-shrink: 0;
309 text-decoration: none;
310 transition: color var(--transition-fast); &:hover { color: var(--text-primary); }
311 &--active { color: var(--text-primary); border-bottom-color: var(--color-accent); font-weight: 600; }
312 }
313
314 /* =========================================================================
315 Forks page
316 ========================================================================= */
317 #fork-canvas { width: 100%; overflow-x: auto; background: var(--bg-base); border: 1px solid var(--border-default); border-radius: 8px; padding: 16px; min-height: 220px; }
318 .fork-svg { display: block; overflow: visible; }
319 .fork-node-label { font-family: var(--font-mono); font-size: 11px; fill: var(--text-primary); text-anchor: middle; dominant-baseline: middle; pointer-events: none; }
320 .fork-node-sub { font-size: 10px; fill: var(--text-muted); text-anchor: middle; dominant-baseline: middle; pointer-events: none; }
321 .legend-swatch { display: inline-block; width: 28px; height: 4px; border-radius: 2px; vertical-align: middle; margin-right: 4px; }
322 #fork-detail { margin-top: 16px; display: none; }
323 .fork-card { background: var(--bg-overlay); border: 1px solid var(--border-default); border-radius: 8px; padding: 16px 20px; }
324 .fork-card-title { font-size: 15px; font-weight: 600; margin-bottom: 8px; color: var(--text-primary); }
325 .fork-card-meta { font-size: 12px; color: var(--text-muted); margin-bottom: 12px; }
326 .fork-card-actions { display: flex; gap: 8px; flex-wrap: wrap; }
327 .stats-bar { display: flex; gap: 20px; flex-wrap: wrap; margin-bottom: 16px; font-size: 13px; color: var(--text-secondary); }
328 .stat { display: flex; align-items: center; gap: 4px; }
329 .stat-count { font-weight: 600; color: var(--text-primary); }
330 .fork-table { width: 100%; border-collapse: collapse; font-size: 13px; margin-top: 16px; }
331 .fork-table th { text-align: left; padding: 8px 10px; border-bottom: 1px solid var(--border-default); color: var(--text-muted); font-weight: 500; font-size: 12px; }
332 .fork-table td { padding: 10px; border-bottom: 1px solid var(--border-subtle); color: var(--text-secondary); vertical-align: middle; }
333 .fork-table tr:last-child td { border-bottom: none; }
334 .fork-table tr:hover td { background: rgba(255,255,255,0.03); }
335 .avatar-badge { display: inline-flex; width: 24px; height: 24px; border-radius: 50%; background: var(--bg-overlay); border: 1px solid var(--border-default); align-items: center; justify-content: center; font-size: 11px; font-weight: 600; color: var(--text-muted); vertical-align: middle; margin-right: 6px; }
336
337
338 /* =========================================================================
339 User profile page (.prof-* prefix)
340 ========================================================================= */
341
342 // ── Page shell ────────────────────────────────────────────────────────────────
343 .prof-page { min-height: 100vh; }
344 .prof-body {
345 max-width: 1200px; margin: 0 auto;
346 padding: var(--space-5) var(--space-6) var(--space-10);
347 display: flex; flex-direction: column; gap: var(--space-5);
348 }
349 .prof-section { display: flex; flex-direction: column; gap: var(--space-3); }
350 .prof-section-header { display: flex; align-items: center; gap: var(--space-3); justify-content: space-between; }
351 .prof-section-title { font-size: 16px; font-weight: 700; color: var(--text-primary); margin: 0; }
352 .prof-section-meta { font-size: 12px; color: var(--text-muted); }
353 .prof-loading { display: flex; align-items: center; gap: 8px; color: var(--text-muted); font-size: 13px; padding: var(--space-4); }
354 .prof-error { color: var(--color-danger); padding: var(--space-4); font-size: 13px; }
355 .prof-tab-empty { color: var(--text-muted); text-align: center; padding: var(--space-6); font-size: 13px; }
356 .prof-tab-error { color: var(--color-danger); padding: var(--space-4); font-size: 13px; }
357
358 // ── Hero — full-bleed dark gradient, MCP/domains/issue style ──────────────────
359 .prof-hero {
360 position: relative;
361 border-bottom: 1px solid var(--border-default);
362 overflow: hidden;
363 &--human { background: linear-gradient(135deg, #0d1117 0%, #0f1923 55%, #0d1117 100%); }
364 &--agent { background: linear-gradient(135deg, #0d1117 0%, #110f1f 55%, #0d1117 100%); }
365 &--org { background: linear-gradient(135deg, #0d1117 0%, #161205 55%, #0d1117 100%); }
366 }
367
368 .prof-hero-glow {
369 position: absolute; inset: 0; pointer-events: none;
370 &--human {
371 background:
372 radial-gradient(ellipse 60% 80% at 78% 40%, rgba(56,189,248,0.08) 0%, transparent 65%),
373 radial-gradient(ellipse 35% 55% at 8% 75%, rgba(167,139,250,0.05) 0%, transparent 60%);
374 }
375 &--agent {
376 background:
377 radial-gradient(ellipse 60% 80% at 78% 40%, rgba(167,139,250,0.10) 0%, transparent 65%),
378 radial-gradient(ellipse 35% 55% at 8% 75%, rgba(56,189,248,0.05) 0%, transparent 60%);
379 }
380 &--org {
381 background:
382 radial-gradient(ellipse 60% 80% at 78% 40%, rgba(251,191,36,0.09) 0%, transparent 65%),
383 radial-gradient(ellipse 35% 55% at 8% 75%, rgba(52,211,153,0.05) 0%, transparent 60%);
384 }
385 }
386
387 // Inner row: left body + right stat pills
388 .prof-hero-inner {
389 position: relative;
390 display: flex; justify-content: space-between; align-items: flex-start;
391 gap: var(--space-6);
392 padding: var(--space-7) var(--space-6) var(--space-5);
393 max-width: 1200px; margin: 0 auto;
394 @media (max-width: 768px) { flex-direction: column; gap: var(--space-4); padding: var(--space-5) var(--space-4) var(--space-4); }
395 }
396
397 .prof-hero-left { flex: 1; min-width: 0; max-width: 600px; }
398
399 // Eyebrow: type badge · @handle · verified
400 .prof-hero-eyebrow {
401 display: flex; align-items: center; gap: var(--space-2);
402 margin-bottom: var(--space-3); flex-wrap: wrap;
403 }
404 .prof-hero-handle {
405 font-size: 12px; font-family: var(--font-mono); color: var(--text-muted);
406 }
407 .prof-hero-verified {
408 display: inline-flex; align-items: center; gap: 4px;
409 font-size: 11px; font-weight: 600; color: var(--color-success);
410 svg { flex-shrink: 0; }
411 }
412
413 // Large display name
414 .prof-display-name {
415 font-size: clamp(24px, 3.5vw, 36px); font-weight: 800;
416 line-height: 1.15; letter-spacing: -0.02em;
417 margin: 0 0 var(--space-2); color: var(--text-primary);
418 }
419
420 // Bio
421 .prof-bio {
422 font-size: 14px; line-height: 1.6; color: var(--text-secondary); margin: 0 0 var(--space-3);
423 &--muted { color: var(--text-muted); }
424 }
425
426 .prof-link { color: var(--color-accent); text-decoration: none; &:hover { text-decoration: underline; } }
427
428 // Meta items (location / social / website)
429 .prof-meta-row { display: flex; gap: var(--space-3); flex-wrap: wrap; align-items: center; }
430 .prof-meta-item {
431 display: inline-flex; align-items: center; gap: 5px;
432 font-size: 12px; color: var(--text-muted);
433 a { color: var(--text-secondary); text-decoration: none; &:hover { color: var(--text-primary); } }
434 }
435
436 // Right stat pills (stacked column, like dm/mcp)
437 .prof-hero-right {
438 display: flex; flex-direction: column; gap: var(--space-2); flex-shrink: 0;
439 @media (max-width: 768px) { flex-direction: row; flex-wrap: wrap; }
440 }
441 .prof-stat-pill {
442 display: flex; align-items: center; gap: 10px;
443 background: transparent; border: 1px solid var(--border-subtle);
444 border-radius: var(--radius-sm); padding: 9px 14px; min-width: 130px;
445 @media (max-width: 768px) { min-width: 0; }
446 }
447 .prof-stat-pill__num {
448 font-family: var(--font-mono); font-size: 18px; font-weight: 700;
449 color: var(--text-primary); line-height: 1;
450 }
451 .prof-stat-pill__label {
452 font-size: 11px; font-weight: 500; color: var(--text-muted);
453 text-transform: uppercase; letter-spacing: 0.06em;
454 }
455
456 // Bottom strip: AVAX / trust chain / treasury + key metadata
457 .prof-hero-strip {
458 position: relative;
459 display: flex; flex-wrap: wrap; align-items: center;
460 gap: 0 var(--space-3);
461 padding: var(--space-3) var(--space-6);
462 border-top: 1px solid rgba(255,255,255,0.06);
463 max-width: 1200px; margin: 0 auto;
464 font-size: 12px;
465 }
466 .prof-strip-item { display: flex; align-items: center; gap: 6px; }
467 .prof-strip-label {
468 font-size: 10px; font-weight: 600; text-transform: uppercase;
469 letter-spacing: 0.06em; color: var(--text-muted);
470 }
471 .prof-strip-val { font-size: 11px; color: var(--color-accent); font-family: var(--font-mono); }
472 .prof-strip-sep { color: var(--border-default); }
473 .prof-strip-badge {
474 display: inline-flex; align-items: center; gap: 4px;
475 font-size: 10px; font-weight: 600; padding: 1px 7px; border-radius: 4px;
476 background: rgba(255,255,255,0.04); color: var(--text-muted);
477 border: 1px solid rgba(255,255,255,0.08);
478 }
479
480 // Repo chips — inside hero, below strip, dark bg
481 .prof-projects {
482 position: relative;
483 display: flex; gap: 8px; flex-wrap: wrap;
484 padding: var(--space-3) var(--space-6) var(--space-4);
485 border-top: 1px solid rgba(255,255,255,0.04);
486 max-width: 1200px; margin: 0 auto;
487 }
488 .prof-project-chip {
489 display: inline-flex; align-items: center; gap: 5px;
490 font-size: 11px; font-weight: 600; font-family: var(--font-mono);
491 padding: 4px 10px; border-radius: 20px; text-decoration: none;
492 background: rgba(255,255,255,0.04); color: var(--text-muted);
493 border: 1px solid rgba(255,255,255,0.08);
494 transition: border-color 0.15s, color 0.15s, background 0.15s;
495 &:hover { color: var(--text-primary); border-color: rgba(255,255,255,0.18); background: rgba(255,255,255,0.07); }
496 }
497 .prof-project-chip__icon { display: flex; align-items: center; }
498
499
500 // Capabilities
501 .prof-caps-grid { display: flex; flex-wrap: wrap; gap: var(--space-2); }
502 .prof-cap {
503 display: inline-flex; align-items: center; gap: 5px;
504 font-size: 11px; font-family: var(--font-mono); padding: 3px 10px; border-radius: 4px;
505 &--granted { background: rgba(52,211,153,0.12); color: var(--color-success); border: 1px solid rgba(52,211,153,0.2); }
506 }
507 .prof-caps-meta {
508 display: flex; align-items: center; gap: var(--space-2);
509 font-size: 12px; color: var(--text-muted); margin-top: var(--space-2);
510 strong { color: var(--text-primary); }
511 }
512 .prof-caps-meta__sep { color: var(--border-default); }
513
514 // Activity canvas (multi-domain heatmap)
515 .prof-canvas {
516 background: var(--bg-surface); border: 1px solid var(--border-default);
517 border-radius: var(--radius-md); padding: var(--space-4); overflow-x: auto;
518 }
519 .prof-canvas__row {
520 display: flex; align-items: center; gap: var(--space-3); margin-bottom: var(--space-2);
521 &:last-of-type { margin-bottom: 0; }
522 }
523 .prof-canvas__label { display: flex; align-items: center; gap: 8px; min-width: 80px; }
524 .prof-canvas__domain-name {
525 font-size: 10px; font-weight: 700; text-transform: uppercase;
526 letter-spacing: 0.04em; font-family: var(--font-mono);
527 &--code { color: #34d399; }
528 &--midi { color: #a78bfa; }
529 &--audio { color: #fbbf24; }
530 }
531 .prof-canvas__total { font-size: 10px; color: var(--text-muted); font-family: var(--font-mono); }
532 .prof-canvas__grid { display: flex; gap: 2px; }
533 .prof-canvas__col { display: flex; flex-direction: column; gap: 2px; }
534 .prof-canvas__cell {
535 width: 10px; height: 10px; border-radius: 1px; flex-shrink: 0;
536 &[data-intensity="0"] { background: var(--bg-inset); }
537 &--code {
538 &[data-intensity="1"] { background: rgba(52,211,153,0.25); }
539 &[data-intensity="2"] { background: rgba(52,211,153,0.55); }
540 &[data-intensity="3"] { background: rgba(52,211,153,0.85); }
541 &[data-intensity="4"] { background: #34d399; }
542 }
543 &--midi {
544 &[data-intensity="1"] { background: rgba(167,139,250,0.25); }
545 &[data-intensity="2"] { background: rgba(167,139,250,0.55); }
546 &[data-intensity="3"] { background: rgba(167,139,250,0.85); }
547 &[data-intensity="4"] { background: #a78bfa; }
548 }
549 &--audio {
550 &[data-intensity="1"] { background: rgba(251,191,36,0.25); }
551 &[data-intensity="2"] { background: rgba(251,191,36,0.55); }
552 &[data-intensity="3"] { background: rgba(251,191,36,0.85); }
553 &[data-intensity="4"] { background: #fbbf24; }
554 }
555 }
556 .prof-canvas__peak { font-size: 10px; color: var(--text-muted); font-family: var(--font-mono); white-space: nowrap; }
557 .prof-canvas__legend { display: flex; gap: var(--space-3); margin-top: var(--space-2); flex-wrap: wrap; }
558 .prof-canvas__legend-item { font-size: 11px; color: var(--text-muted); font-family: var(--font-mono); }
559
560 // Attestations
561 .prof-attestations {
562 display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-4);
563 @media (max-width: 600px) { grid-template-columns: 1fr; }
564 }
565 .prof-attest-col { display: flex; flex-direction: column; gap: var(--space-1); }
566 .prof-attest-col__header {
567 font-size: 12px; font-weight: 600; color: var(--text-muted);
568 padding-bottom: var(--space-2); border-bottom: 1px solid var(--border-subtle);
569 }
570 .prof-attest-row { display: flex; align-items: center; gap: var(--space-2); font-size: 12px; color: var(--text-secondary); padding: 4px 0; }
571 .prof-attest-claim { color: var(--text-muted); font-style: italic; }
572 .prof-attest-age { font-size: 11px; color: var(--text-muted); margin-left: auto; }
573 .prof-attest-empty { font-size: 12px; color: var(--text-muted); font-style: italic; padding: var(--space-2) 0; }
574
575 // Provenance chain
576 .prof-provenance { display: flex; flex-direction: column; gap: var(--space-1); }
577 .prof-prov-node { display: flex; flex-direction: column; gap: 2px; }
578 .prof-prov-node__indent {
579 display: flex; align-items: center; gap: var(--space-2);
580 padding-left: calc(var(--prof-indent, 0) * 20px);
581 }
582 .prof-prov-connector { color: var(--text-muted); font-family: var(--font-mono); font-size: 12px; }
583 .prof-prov-icon { color: var(--text-muted); display: flex; align-items: center; }
584 .prof-prov-handle { font-weight: 600; color: var(--color-accent); font-size: 13px; text-decoration: none; &:hover { text-decoration: underline; } }
585 .prof-prov-root-label {
586 font-size: 10px; color: var(--text-muted);
587 background: var(--bg-overlay); border: 1px solid var(--border-subtle);
588 padding: 1px 6px; border-radius: 4px;
589 }
590 .prof-prov-annotation { font-size: 11px; color: var(--text-muted); font-style: italic; }
591
592 // Fleet container
593 .prof-fleet { display: flex; gap: var(--space-3); overflow-x: auto; padding-bottom: var(--space-1); }
594 .prof-fleet-card__sep { color: var(--border-default); }
595
596 // Heatmap legend swatches (avoids inline styles)
597 .prof-heatmap-swatch--human { background: var(--hm-human-3); }
598 .prof-heatmap-swatch--agent { background: var(--hm-agent-3); }
599 .prof-hm-stat-sep { color: var(--border-default); }
600
601 // Repo card tags wrapper
602 .prof-repo-tags { display: flex; flex-wrap: wrap; gap: 4px; }
603
604 // Footprint simple list
605 .prof-footprint { display: flex; flex-direction: column; }
606 .prof-footprint__item {
607 display: flex; align-items: center; gap: var(--space-3); padding: 6px 0;
608 border-bottom: 1px solid var(--border-subtle); font-size: 12px;
609 &:last-child { border-bottom: none; }
610 }
611 .prof-footprint__repo { color: var(--color-accent); text-decoration: none; font-family: var(--font-mono); font-size: 11px; &:hover { text-decoration: underline; } }
612 .prof-footprint__sym { flex: 1; font-family: var(--font-mono); color: var(--text-primary); font-size: 11px; }
613 .prof-footprint__changes { color: var(--text-muted); font-size: 11px; white-space: nowrap; }
614
615 // Activity feed
616 .prof-activity { display: flex; flex-direction: column; }
617 .prof-evt {
618 display: flex; align-items: flex-start; gap: var(--space-3);
619 padding: 10px 0; border-bottom: 1px solid var(--border-subtle);
620 &:last-child { border-bottom: none; }
621 &--commit .prof-evt__icon { color: var(--text-muted); }
622 &--proposal .prof-evt__icon { color: var(--color-success); }
623 &--issue .prof-evt__icon { color: var(--color-warning); }
624 &--release .prof-evt__icon { color: var(--color-accent); }
625 }
626 .prof-evt__icon {
627 width: 28px; height: 28px; border-radius: 50%;
628 background: var(--bg-overlay); display: flex; align-items: center;
629 justify-content: center; flex-shrink: 0; color: var(--text-muted);
630 }
631 .prof-evt__body { flex: 1; min-width: 0; }
632 .prof-evt__title {
633 font-size: 13px; color: var(--text-primary); display: block; margin-bottom: 3px;
634 a { color: var(--color-accent); text-decoration: none; &:hover { text-decoration: underline; } }
635 }
636 .prof-evt__meta { font-size: 11px; color: var(--text-muted); display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; }
637 .prof-evt__agent { color: var(--color-accent); }
638
639 // Load more
640 .prof-load-more { display: flex; justify-content: center; padding: var(--space-4) 0; }
641 .prof-load-more__btn {
642 padding: 8px 24px; border-radius: var(--radius-sm);
643 border: 1px solid var(--border-default); background: var(--bg-surface);
644 color: var(--text-secondary); font-size: 13px; text-decoration: none;
645 transition: border-color 0.15s, color 0.15s;
646 &:hover { border-color: var(--border-strong); color: var(--text-primary); }
647 }
648
649 // Org roster
650 .prof-roster { border: 1px solid var(--border-default); border-radius: var(--radius-md); overflow: hidden; }
651 .prof-roster-table {
652 width: 100%; border-collapse: collapse; font-size: 13px;
653 th {
654 text-align: left; padding: 10px 16px; border-bottom: 1px solid var(--border-default);
655 font-size: 11px; font-weight: 600; color: var(--text-muted);
656 text-transform: uppercase; letter-spacing: 0.04em; background: var(--bg-surface);
657 }
658 td { padding: 10px 16px; border-bottom: 1px solid var(--border-subtle); color: var(--text-secondary); vertical-align: middle; }
659 tr:last-child td { border-bottom: none; }
660 tr:hover td { background: var(--bg-overlay); }
661 }
662 .prof-roster-identity { display: flex; align-items: center; gap: var(--space-2); }
663 .prof-roster-role { font-size: 11px; color: var(--text-muted); background: var(--bg-overlay); padding: 2px 8px; border-radius: 10px; }
664 .prof-roster-weight { font-size: 13px; color: var(--text-primary); font-family: var(--font-mono); }
665 .prof-avatar--xs {
666 width: 28px; height: 28px; font-size: 12px; border-radius: 50%;
667 display: flex; align-items: center; justify-content: center;
668 font-weight: 700; color: #fff; flex-shrink: 0; text-transform: uppercase;
669 }
670
671 // Section header shorthand (pid compat)
672 .prof-section-hd { display: flex; align-items: center; gap: var(--space-3); justify-content: space-between; flex-wrap: wrap; }
673
674 // ── Domain stats bar ──────────────────────────────────────────────────────────
675 .prof-domain-bar { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: var(--space-3); }
676 .prof-dstat-card {
677 display: flex; align-items: flex-start; gap: var(--space-3); padding: var(--space-4);
678 background: var(--bg-surface); border: 1px solid var(--border-default);
679 border-radius: var(--radius-md); border-left: 3px solid var(--dstat-color);
680 transition: transform 0.15s; &:hover { transform: translateY(-1px); }
681 }
682 .prof-dstat-icon {
683 font-size: 22px; width: 36px; height: 36px; flex-shrink: 0;
684 display: flex; align-items: center; justify-content: center;
685 background: color-mix(in srgb, var(--dstat-color) 12%, transparent); border-radius: var(--radius-sm);
686 }
687 .prof-dstat-body { flex: 1; min-width: 0; }
688 .prof-dstat-name { display: flex; align-items: center; gap: 6px; margin-bottom: 4px; }
689 .prof-dstat-label { font-size: 14px; font-weight: 600; color: var(--text-primary); }
690 .prof-dstat-scoped { font-size: 10px; font-family: var(--font-mono); color: var(--text-muted); background: var(--bg-overlay); padding: 1px 6px; border-radius: 4px; }
691 .prof-dstat-nums { display: flex; align-items: center; gap: 6px; font-size: 12px; color: var(--text-muted); margin-bottom: 8px; strong { color: var(--text-primary); } }
692 .prof-dstat-dot { color: var(--border-default); }
693 .prof-dstat-pct { color: var(--dstat-color); }
694 .prof-dstat-bar-track { height: 4px; background: var(--border-subtle); border-radius: 2px; overflow: hidden; }
695 .prof-dstat-bar { height: 100%; border-radius: 2px; transition: width 0.7s cubic-bezier(0.25, 0.46, 0.45, 0.94); }
696
697 // ── Multi-domain heatmap ──────────────────────────────────────────────────────
698 .prof-heatmap-card { background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius-md); padding: var(--space-4); }
699 .prof-heatmap-months { position: relative; height: 18px; margin-left: 28px; margin-bottom: 4px; }
700 .prof-heatmap-month { position: absolute; font-size: 10px; color: var(--text-muted); white-space: nowrap; transform: translateX(-50%); }
701 .prof-heatmap-grid { display: flex; gap: 3px; overflow-x: auto; }
702 .prof-heatmap-days { display: flex; flex-direction: column; gap: 2px; margin-right: 4px; flex-shrink: 0; padding-top: 2px; }
703 .prof-heatmap-daylbl { font-size: 9px; color: var(--text-muted); height: 12px; line-height: 12px; width: 22px; text-align: right; }
704 .prof-heatmap-cols { display: flex; gap: 2px; }
705 .prof-heatmap-col { display: flex; flex-direction: column; gap: 2px; }
706 .prof-heatmap-cell {
707 width: 12px; height: 12px; border-radius: 2px; cursor: help; flex-shrink: 0;
708 transition: transform 0.1s, opacity 0.1s; &:hover { transform: scale(1.4); opacity: 0.9; }
709 }
710 .prof-heatmap-stats {
711 display: flex; align-items: center; gap: 8px; margin-top: var(--space-3);
712 font-size: 11px; color: var(--text-muted); flex-wrap: wrap; strong { color: var(--text-primary); }
713 }
714 .prof-hm-stat-dot { color: var(--border-default); }
715 .prof-heatmap-legend { display: flex; gap: 12px; flex-wrap: wrap; }
716 .prof-heatmap-legend-item { display: inline-flex; align-items: center; gap: 5px; font-size: 11px; color: var(--text-muted); }
717 .prof-heatmap-swatch { width: 10px; height: 10px; border-radius: 2px; flex-shrink: 0; }
718
719 // ── Pinned repos ──────────────────────────────────────────────────────────────
720 .prof-pinned-grid {
721 display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--space-3);
722 @media (max-width: 900px) { grid-template-columns: repeat(2, 1fr); }
723 @media (max-width: 600px) { grid-template-columns: 1fr; }
724 }
725 .prof-pinned-card {
726 display: flex; flex-direction: column; gap: var(--space-2); padding: var(--space-4);
727 background: var(--bg-surface); border: 1px solid var(--border-default);
728 border-radius: var(--radius-md); text-decoration: none;
729 transition: border-color 0.15s, transform 0.15s, box-shadow 0.15s;
730 &:hover {
731 border-color: var(--card-accent); transform: translateY(-2px);
732 box-shadow: 0 4px 16px rgba(0,0,0,0.25);
733 .prof-pinned-view-arrow { transform: translateX(3px); opacity: 1; }
734 }
735 }
736 .prof-pinned-card__header { display: flex; align-items: center; justify-content: space-between; }
737 .prof-pinned-domain-badge {
738 display: inline-flex; align-items: center; gap: 4px;
739 font-size: 10px; font-weight: 600; font-family: var(--font-mono);
740 padding: 2px 8px; border-radius: 4px; border: 1px solid transparent;
741 }
742 .prof-pinned-card__body { flex: 1; }
743 .prof-pinned-name { font-size: 14px; font-weight: 700; color: var(--text-primary); margin: 0 0 4px; }
744 .prof-pinned-desc { font-size: 12px; color: var(--text-muted); margin: 0; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
745 .prof-pinned-tags { display: flex; flex-wrap: wrap; gap: 4px; }
746 .prof-repo-tag { font-size: 10px; padding: 2px 7px; border-radius: 10px; background: var(--bg-overlay); color: var(--text-muted); border: 1px solid var(--border-subtle); }
747 .prof-pinned-card__footer { display: flex; align-items: center; gap: var(--space-3); font-size: 11px; color: var(--text-muted); border-top: 1px solid var(--border-subtle); padding-top: var(--space-2); margin-top: auto; }
748 .prof-pinned-stat { display: inline-flex; align-items: center; gap: 3px; }
749 .prof-pinned-view-arrow { margin-left: auto; color: var(--card-accent); font-size: 14px; opacity: 0.4; transition: transform 0.15s, opacity 0.15s; }
750
751 // ── Achievements ──────────────────────────────────────────────────────────────
752 .prof-achievements-row {
753 display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--space-3);
754 @media (max-width: 800px) { grid-template-columns: repeat(2, 1fr); }
755 }
756 .prof-badge {
757 display: flex; align-items: flex-start; gap: var(--space-3); padding: var(--space-4);
758 border-radius: var(--radius-md); border: 1px solid var(--border-default);
759 background: var(--bg-surface); position: relative; transition: border-color 0.15s, transform 0.15s;
760 &--earned { border-color: var(--badge-color); background: color-mix(in srgb, var(--badge-color) 6%, var(--bg-surface)); &:hover { transform: translateY(-1px); } }
761 &--locked { opacity: 0.45; }
762 }
763 .prof-badge__icon {
764 font-size: 22px; width: 44px; height: 44px; flex-shrink: 0;
765 display: flex; align-items: center; justify-content: center;
766 background: color-mix(in srgb, var(--badge-color) 12%, transparent); border-radius: var(--radius-sm);
767 .prof-badge--locked & { filter: grayscale(1); }
768 }
769 .prof-badge__body { flex: 1; min-width: 0; }
770 .prof-badge__name { display: block; font-size: 13px; font-weight: 600; color: var(--text-primary); margin-bottom: 3px; }
771 .prof-badge__desc { font-size: 11px; color: var(--text-muted); line-height: 1.4; }
772 .prof-badge__check { position: absolute; top: 8px; right: 8px; color: var(--badge-color); font-size: 12px; font-weight: 700; }
773 .prof-badge__lock { position: absolute; top: 8px; right: 8px; font-size: 11px; opacity: 0.5; }
774
775 // ── Tabs ──────────────────────────────────────────────────────────────────────
776 .prof-tabs-section { gap: 0; }
777 .prof-tab-nav { display: flex; border-bottom: 1px solid var(--border-default); gap: 0; margin-bottom: var(--space-4); overflow-x: auto; }
778 .prof-tab-btn {
779 display: inline-flex; align-items: center; gap: 6px; padding: 10px 16px;
780 border: none; background: none; cursor: pointer; color: var(--text-muted);
781 border-bottom: 2px solid transparent; font-size: 13px; white-space: nowrap; flex-shrink: 0;
782 transition: color var(--transition-fast); &:hover { color: var(--text-primary); }
783 &--active { color: var(--text-primary); border-bottom-color: var(--color-accent); font-weight: 600; }
784 }
785 .prof-tab-count { font-size: 10px; background: var(--bg-overlay); color: var(--text-muted); border-radius: 10px; padding: 1px 6px; font-family: var(--font-mono); }
786 .prof-tab-content { min-height: 200px; }
787
788
789 // ── Social tabs ───────────────────────────────────────────────────────────────
790 .prof-social-row-item { display: flex; align-items: flex-start; gap: var(--space-3); padding: var(--space-3) 0; border-bottom: 1px solid var(--border-subtle); &:last-child { border-bottom: none; } }
791 .prof-social-avatar { width: 40px; height: 40px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 16px; color: #fff; flex-shrink: 0; text-decoration: none; }
792 .prof-social-info { flex: 1; min-width: 0; }
793 .prof-social-name { font-size: 14px; font-weight: 600; color: var(--text-primary); text-decoration: none; &:hover { color: var(--color-accent); } }
794 .prof-social-handle { font-size: 12px; color: var(--text-muted); margin-left: 6px; }
795 .prof-social-bio { font-size: 12px; color: var(--text-muted); margin: 4px 0 0; }
796
797 // ── Activity tab ──────────────────────────────────────────────────────────────
798 .prof-activity-row { display: flex; align-items: flex-start; gap: var(--space-3); padding: 10px 0; border-bottom: 1px solid var(--border-subtle); &:last-child { border-bottom: none; } }
799 .prof-activity-icon { width: 28px; height: 28px; border-radius: 50%; background: var(--bg-overlay); display: flex; align-items: center; justify-content: center; font-size: 12px; flex-shrink: 0; color: var(--text-muted); }
800 .prof-activity-body { flex: 1; min-width: 0; }
801 .prof-activity-desc { font-size: 13px; color: var(--text-primary); display: block; }
802 .prof-activity-meta { font-size: 11px; color: var(--text-muted); a { color: var(--color-accent); text-decoration: none; &:hover { text-decoration: underline; } } }
803 .prof-pager { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-4) 0; justify-content: center; }
804 .prof-pager-label { font-size: 12px; color: var(--text-muted); }
805
806 /* =========================================================================
807 Commit Graph page (Canvas2D renderer)
808 ========================================================================= */
809 .graph-layout {
810 display: grid;
811 grid-template-columns: 1fr 200px;
812 gap: 0;
813 align-items: start;
814 @media (max-width: 768px) { grid-template-columns: 1fr; }
815 }
816 .graph-main {
817 border-right: 1px solid var(--border-subtle);
818 padding-right: var(--space-4);
819 min-width: 0;
820 }
821 .graph-viewport-card {
822 overflow: hidden;
823 padding: 0;
824 border-radius: var(--radius-base);
825 border: 1px solid var(--border-subtle);
826 background: var(--bg-base);
827 }
828 .graph-legend-bar {
829 display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap;
830 padding: var(--space-2) var(--space-4);
831 border-bottom: 1px solid var(--border-subtle);
832 background: var(--bg-surface);
833 min-height: 38px;
834 &--types {
835 background: rgba(0,0,0,0.12);
836 min-height: 34px;
837 padding: var(--space-1) var(--space-4);
838 }
839 }
840 .graph-legend-label { font-size: 10px; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.07em; flex-shrink: 0; }
841 .graph-legend-items { display: flex; gap: 10px; flex-wrap: wrap; }
842 .graph-legend-branch { display: inline-flex; align-items: center; gap: 5px; font-size: 11px; color: var(--text-secondary); }
843 .graph-legend-type {
844 display: inline-flex; align-items: center; gap: 5px;
845 font-size: 11px; color: var(--text-secondary); font-family: var(--font-mono);
846 }
847 .graph-legend-type-count { color: var(--text-muted); font-size: 10px; }
848 .graph-legend-dot { width: 9px; height: 9px; border-radius: 50%; flex-shrink: 0; }
849 .graph-legend-sep { color: var(--text-muted); margin-left: auto; display: flex; gap: var(--space-4); font-size: 10px; flex-shrink: 0; }
850 .graph-legend-sep span { display: inline-flex; align-items: center; gap: 4px; }
851 .graph-legend-sep--right { margin-left: auto; }
852 .graph-viewport {
853 position: relative;
854 height: calc(100vh - 300px);
855 min-height: 480px;
856 background: var(--bg-base);
857 overflow: hidden;
858 }
859 .graph-canvas {
860 display: block;
861 position: absolute; top: 0; left: 0;
862 cursor: grab;
863 &:active { cursor: grabbing; }
864 }
865 .graph-loading {
866 position: absolute; inset: 0;
867 display: flex; align-items: center; justify-content: center;
868 gap: 10px; color: var(--text-muted); font-size: 14px;
869 }
870 .graph-empty {
871 padding: 60px; text-align: center; color: var(--text-muted); font-size: 14px;
872 }
873 // Minimap
874 .dag-minimap {
875 position: absolute; bottom: 8px; right: 8px;
876 border-radius: 6px;
877 cursor: pointer;
878 opacity: 0.9;
879 transition: opacity 0.2s;
880 &:hover { opacity: 1; }
881 }
882 .graph-controls {
883 display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap;
884 padding: var(--space-2) var(--space-3);
885 border-top: 1px solid var(--border-subtle);
886 background: var(--bg-surface);
887 min-height: 44px;
888 }
889 .graph-ctrl-btn {
890 display: inline-flex; align-items: center; gap: 4px;
891 background: var(--bg-overlay);
892 border: 1px solid var(--border-default);
893 color: var(--text-muted);
894 border-radius: var(--radius-sm);
895 padding: 4px 10px;
896 font-size: 12px; cursor: pointer;
897 transition: color var(--transition-fast), border-color var(--transition-fast), background var(--transition-fast);
898 &:hover { color: var(--text-primary); border-color: var(--border-muted); background: var(--bg-surface); }
899 }
900 .graph-zoom-label {
901 font-size: 11px; font-family: var(--font-mono);
902 color: var(--text-muted); min-width: 36px; text-align: center;
903 }
904 .graph-search-wrap {
905 position: relative; display: flex; align-items: center; margin-left: var(--space-2);
906 }
907 .graph-search-icon {
908 position: absolute; left: 8px; color: var(--text-muted); pointer-events: none;
909 }
910 .graph-search-input {
911 background: var(--bg-overlay); border: 1px solid var(--border-default);
912 border-radius: var(--radius-sm); padding: 4px 8px 4px 28px;
913 font-size: 12px; color: var(--text-primary); width: 200px;
914 transition: border-color var(--transition-fast), width var(--transition-fast);
915 &::placeholder { color: var(--text-muted); }
916 &:focus { outline: none; border-color: var(--color-accent); width: 260px; }
917 }
918 .graph-search-count {
919 position: absolute; right: 6px; font-size: 10px; color: var(--text-muted);
920 pointer-events: none; font-family: var(--font-mono);
921 }
922 .graph-hint { font-size: 10px; color: var(--text-muted); margin-left: auto; }
923 .graph-sidebar {
924 padding-left: var(--space-4);
925 display: flex;
926 flex-direction: column;
927 position: sticky;
928 top: var(--header-height);
929 max-height: calc(100vh - var(--header-height));
930 overflow-y: auto;
931 scrollbar-width: none;
932 &::-webkit-scrollbar { display: none; }
933 }
934 .graph-sidebar-section {
935 padding: var(--space-3) 0;
936 border-bottom: 1px solid var(--border-subtle);
937 &:last-child { border-bottom: none; }
938 }
939
940 /* Commit popover */
941 .dag-popover {
942 display: none;
943 position: fixed;
944 z-index: 500;
945 background: var(--bg-surface);
946 border: 1px solid var(--border-default);
947 border-radius: var(--radius-md);
948 padding: var(--space-3) var(--space-4);
949 min-width: 320px;
950 max-width: 460px;
951 box-shadow: 0 8px 32px rgba(0,0,0,0.4), 0 2px 8px rgba(0,0,0,0.3);
952 box-shadow: var(--shadow-xl);
953 pointer-events: none;
954 }
955 .dag-pop-sha {
956 font-family: var(--font-mono);
957 font-size: 12px;
958 color: var(--color-accent-link);
959 margin-bottom: var(--space-2);
960 display: flex;
961 align-items: center;
962 gap: var(--space-2);
963 }
964 .dag-pop-sha-badge {
965 background: var(--bg-overlay);
966 border: 1px solid var(--border-subtle);
967 border-radius: var(--radius-sm);
968 padding: 1px 6px;
969 }
970 .dag-pop-branch {
971 display: inline-block;
972 padding: 1px 8px;
973 border-radius: var(--radius-full);
974 font-size: 11px;
975 font-weight: var(--font-weight-semibold);
976 margin-left: auto;
977 }
978 .dag-pop-type {
979 display: inline-block;
980 padding: 1px 7px;
981 border-radius: var(--radius-sm);
982 font-size: 11px;
983 font-weight: var(--font-weight-semibold);
984 font-family: var(--font-mono);
985 margin-right: 4px;
986 }
987 .dag-pop-type-feat { background: rgba(63,185,80,0.15); color: var(--dim-rhythmic); }
988 .dag-pop-type-fix { background: rgba(248,81,73,0.15); color: var(--dim-dynamic); }
989 .dag-pop-type-refactor{background: rgba(188,140,255,0.15);color: var(--dim-melodic); }
990 .dag-pop-type-init { background: rgba(56,139,253,0.15); color: var(--dim-harmonic); }
991 .dag-pop-type-chore { background: rgba(139,148,158,0.12);color: var(--text-muted); }
992 .dag-pop-msg {
993 font-size: 14px;
994 color: var(--text-primary);
995 margin-bottom: var(--space-2);
996 word-break: break-word;
997 line-height: 1.5;
998 }
999 .dag-pop-meta {
1000 font-size: 12px;
1001 color: var(--text-muted);
1002 display: flex;
1003 align-items: center;
1004 gap: var(--space-2);
1005 flex-wrap: wrap;
1006 }
1007 .dag-pop-author-chip {
1008 display: inline-flex;
1009 align-items: center;
1010 gap: 5px;
1011 background: var(--bg-overlay);
1012 border-radius: var(--radius-full);
1013 padding: 2px 8px;
1014 font-size: 11px;
1015 font-weight: var(--font-weight-medium);
1016 color: var(--text-secondary);
1017 }
1018 .dag-pop-avatar {
1019 width: 18px;
1020 height: 18px;
1021 border-radius: 50%;
1022 display: inline-flex;
1023 align-items: center;
1024 justify-content: center;
1025 font-size: 10px;
1026 font-weight: var(--font-weight-bold);
1027 color: #fff;
1028 flex-shrink: 0;
1029 text-transform: uppercase;
1030 }
1031 .dag-pop-session { font-size: 11px; color: #2dd4bf; margin-top: var(--space-2); }
1032 .dag-pop-nav { font-size: 11px; color: var(--color-accent); margin-top: var(--space-2); opacity: 0.7; }
1033 .dag-pop-time { font-size: 11px; color: var(--text-muted); font-family: var(--font-mono); }
1034
1035 /* Muse enrichment row inside popover */
1036 .dag-pop-muse {
1037 display: flex; align-items: center; gap: 6px; flex-wrap: wrap;
1038 margin-top: var(--space-2); padding-top: var(--space-2);
1039 border-top: 1px solid var(--border-subtle);
1040 }
1041 .pop-muse-badge {
1042 display: inline-flex; align-items: center;
1043 padding: 2px 8px; border-radius: var(--radius-sm);
1044 font-size: 10px; font-weight: var(--font-weight-semibold);
1045 font-family: var(--font-mono); border: 1px solid transparent;
1046 }
1047 .pop-muse-agent { background: rgba(167,139,250,0.18); color: #a78bfa; border-color: rgba(167,139,250,0.3); }
1048 .pop-muse-breaking{ background: rgba(248,113,113,0.18); color: #f87171; border-color: rgba(248,113,113,0.3); }
1049 .pop-sym-stats { display: inline-flex; align-items: center; gap: 5px; font-size: 11px; font-family: var(--font-mono); }
1050 .pop-sym-add { color: #34d399; }
1051 .pop-sym-del { color: #f87171; }
1052
1053 /* Sidebar panels */
1054 .branch-legend-item {
1055 display: flex; align-items: center; gap: var(--space-2);
1056 padding: 5px 0;
1057 font-size: 12px; color: var(--text-secondary);
1058 border-top: 1px solid var(--border-subtle);
1059 &:first-of-type { border-top: none; }
1060 }
1061 .branch-legend-name { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 12px; color: var(--text-secondary); }
1062 .branch-legend-pill { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; }
1063 .sidebar-branch-list { padding: var(--space-1) 0; }
1064 .sidebar-contributor-list { padding: var(--space-1) 0; }
1065 .branch-legend-count {
1066 margin-left: auto;
1067 font-size: 10px;
1068 color: var(--text-muted);
1069 font-family: var(--font-mono);
1070 }
1071 .contributor-item {
1072 display: flex;
1073 align-items: center;
1074 gap: var(--space-2);
1075 padding: 5px 0;
1076 border-top: 1px solid var(--border-subtle);
1077 &:first-of-type { border-top: none; }
1078 }
1079 .contributor-avatar-sm {
1080 width: 24px;
1081 height: 24px;
1082 border-radius: 50%;
1083 display: flex;
1084 align-items: center;
1085 justify-content: center;
1086 font-size: 10px;
1087 font-weight: var(--font-weight-bold);
1088 color: #fff;
1089 flex-shrink: 0;
1090 text-transform: uppercase;
1091 }
1092 .contributor-name { font-size: 12px; color: var(--text-secondary); flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
1093 .contributor-count { font-size: 11px; color: var(--text-muted); font-family: var(--font-mono); flex-shrink: 0; }
1094 .contributor-bar {
1095 height: 3px;
1096 border-radius: 2px;
1097 background: var(--bg-overlay);
1098 margin: 2px 0 0;
1099 overflow: hidden;
1100 }
1101 .contributor-bar-fill { height: 100%; border-radius: 2px; }
1102
1103
1104
1105 // ── Responsive ────────────────────────────────────────────────────────────────
1106
1107 @media (max-width: 768px) {
1108 .prof-layout {
1109 grid-template-columns: 1fr;
1110 }
1111
1112 .prof-sidebar {
1113 display: none;
1114 }
1115
1116 .prof-hero {
1117 flex-direction: column;
1118 align-items: flex-start;
1119 gap: var(--space-3);
1120 }
1121
1122 .prof-avatar {
1123 width: 56px;
1124 height: 56px;
1125 }
1126
1127 .prof-stats-row {
1128 flex-wrap: wrap;
1129 gap: var(--space-2);
1130 }
1131
1132 .prof-pinned-grid {
1133 grid-template-columns: 1fr;
1134 }
1135
1136 .collab-grid {
1137 grid-template-columns: 1fr;
1138 }
1139
1140 .rank-card {
1141 flex-direction: column;
1142 }
1143 }
1144
1145 @media (max-width: 480px) {
1146 .prof-username {
1147 font-size: 18px;
1148 }
1149
1150 .prof-bio {
1151 font-size: 13px;
1152 }
1153
1154 .prof-stat-value {
1155 font-size: 16px;
1156 }
1157
1158 .rank-badge {
1159 font-size: 11px;
1160 padding: 2px 6px;
1161 }
1162
1163 .prof-repo-card {
1164 padding: var(--space-2);
1165 }
1166 }
File History 1 commit
sha256:9590cee1e0ccd6c76528f005b95d634d80f5019f0dcb7c371e149adc31d1fb65 refactor: enforce gRPC framing on all MWP wire traffic Sonnet 4.6 minor ⚠ 156 days ago