gabriel / musehub public
_insights.scss
1,818 lines 67.5 KB
Raw
sha256:9590cee1e0ccd6c76528f005b95d634d80f5019f0dcb7c371e149adc31d1fb65 refactor: enforce gRPC framing on all MWP wire traffic Sonnet 4.6 minor ⚠ breaking 156 days ago
1 // _insights.scss — Insights, explore, and analytics pages (.ins-*, .in-*, .rh-*, .an-* prefixes)
2
3 /* =========================================================================
4 Explore page
5 ========================================================================= */
6
7 /* ── Hero ────────────────────────────────────────────────────────────────── */
8 /* ── Explore hero — mirrors MCP hero exactly ──────────────────────────────── */
9 .ex-hero {
10 position: relative;
11 background: linear-gradient(135deg, #0d1117 0%, #0f1923 50%, #0d1117 100%);
12 border-bottom: 1px solid var(--border-default);
13 overflow: hidden;
14 padding: 0 var(--space-4);
15 }
16 .ex-hero-glow {
17 position: absolute; inset: 0;
18 background:
19 radial-gradient(ellipse 60% 80% at 70% 50%, rgba(88,166,255,0.06) 0%, transparent 70%),
20 radial-gradient(ellipse 40% 60% at 10% 80%, rgba(188,140,255,0.05) 0%, transparent 60%);
21 pointer-events: none;
22 }
23 .ex-hero-inner {
24 max-width: 760px;
25 margin: 0 auto;
26 padding: var(--space-8) 0 var(--space-6);
27 text-align: center;
28 }
29 .ex-hero-left { max-width: 640px; margin: 0 auto; }
30 .ex-hero-eyebrow {
31 font-size: 11px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase;
32 color: #58a6ff; margin-bottom: var(--space-3);
33 }
34 .ex-hero-title {
35 font-size: clamp(28px, 4vw, 44px);
36 font-weight: 700; line-height: 1.1;
37 margin: 0 0 var(--space-3);
38 color: var(--text-primary);
39 }
40 .ex-hero-sub {
41 font-size: 14px; line-height: 1.6;
42 color: var(--text-secondary);
43 max-width: 520px; margin: 0 auto var(--space-4);
44 em { font-style: italic; color: #58a6ff; }
45 }
46 .ex-hero-stats {
47 display: flex; flex-direction: column; gap: var(--space-3);
48 flex-shrink: 0;
49 @media (max-width: 768px) { flex-direction: row; flex-wrap: wrap; }
50 }
51 .ex-stat-pill {
52 display: flex; align-items: center; gap: var(--space-3);
53 padding: 10px var(--space-4);
54 background: rgba(255,255,255,0.04);
55 border: 1px solid var(--border-subtle);
56 border-radius: var(--radius-base);
57 min-width: 140px;
58 }
59 .ex-stat-num {
60 font-family: var(--font-mono); font-size: 20px; font-weight: 700;
61 color: #58a6ff; line-height: 1;
62 }
63 .ex-stat-label {
64 font-size: 12px; color: var(--text-muted); text-transform: uppercase;
65 letter-spacing: 0.05em;
66 }
67
68 /* ── Search box ──────────────────────────────────────────────────────────── */
69 .ex-search-box {
70 width: 100%;
71 display: flex; flex-direction: column; gap: var(--space-3);
72 }
73 .ex-search-field {
74 display: flex; align-items: center; gap: 8px;
75 background: transparent;
76 border: 1px solid rgba(255,255,255,0.1);
77 border-radius: 6px;
78 padding: 0 14px;
79 height: 40px;
80 transition: border-color 0.15s;
81 &:focus-within, &.ex-search-field--active {
82 border-color: rgba(88, 166, 255, 0.45);
83 }
84 }
85 .ex-search-icon { color: var(--text-muted); flex-shrink: 0; width: 15px; height: 15px; }
86 .ex-search-field .ex-search-input {
87 flex: 1; background: transparent; border: none; outline: none;
88 box-shadow: none; padding: 0; width: auto;
89 font-size: 15px; color: var(--text-primary); min-width: 0;
90 &::placeholder { color: var(--text-muted); }
91 }
92 .ex-search-clear {
93 display: flex; align-items: center; justify-content: center;
94 background: none; border: none; cursor: pointer;
95 color: var(--text-muted); padding: var(--space-1);
96 border-radius: var(--radius-sm);
97 transition: color 0.12s, background 0.12s;
98 flex-shrink: 0;
99 &:hover { color: var(--text-primary); background: var(--bg-overlay); }
100 }
101 .ex-search-spinner {
102 display: flex; align-items: center; flex-shrink: 0; margin-left: var(--space-2);
103 color: var(--color-accent);
104 .spin-icon { animation: spin 0.8s linear infinite; }
105 }
106
107 /* Example query chips */
108 .ex-examples {
109 display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap;
110 justify-content: center;
111 }
112 .ex-examples-label { font-size: 11px; color: var(--text-muted); flex-shrink: 0; }
113 .ex-example-chip {
114 background: var(--bg-surface); border: 1px solid var(--border-default);
115 border-radius: var(--radius-full); padding: 4px 12px;
116 font-size: 12px; color: var(--text-secondary); cursor: pointer;
117 transition: border-color 0.12s, color 0.12s, background 0.12s;
118 &:hover { border-color: var(--color-accent); color: var(--color-accent); background: rgba(88,166,255,0.06); }
119 }
120
121 /* Search type toggle bar */
122 .ex-type-bar {
123 display: flex; align-items: center; gap: var(--space-2); justify-content: center;
124 }
125 .ex-type-label { font-size: 11px; color: var(--text-muted); }
126 .ex-type-pill {
127 display: inline-flex; align-items: center; gap: 5px;
128 padding: 4px 14px; border-radius: var(--radius-full);
129 border: 1px solid var(--border-default);
130 font-size: 12px; font-weight: 500; color: var(--text-muted);
131 cursor: pointer; background: transparent;
132 transition: all 0.12s;
133 &:hover { border-color: var(--color-accent); color: var(--color-accent); }
134 &.ex-type-pill--active {
135 background: var(--color-accent); border-color: var(--color-accent);
136 color: #0d1117; font-weight: 700;
137 }
138 }
139 .ex-semantic-indicator {
140 display: inline-flex; align-items: center; gap: 6px;
141 font-size: 11px; color: #3fb950; font-family: var(--font-mono);
142 padding: 3px 10px; border-radius: var(--radius-full);
143 background: rgba(63,185,80,0.1); border: 1px solid rgba(63,185,80,0.25);
144 }
145 .ex-semantic-dot {
146 width: 6px; height: 6px; border-radius: 50%; background: #3fb950;
147 animation: pulse-glow 2s ease-in-out infinite;
148 }
149 @keyframes pulse-glow {
150 0%, 100% { box-shadow: 0 0 0 0 rgba(63,185,80,0.5); }
151 50% { box-shadow: 0 0 0 4px rgba(63,185,80,0); }
152 }
153
154 /* ── Semantic results container ─────────────────────────────────────────── */
155 .ex-semantic-results { margin-bottom: var(--space-8); }
156
157 /* Header row */
158 .ex-sr-header {
159 display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap;
160 margin-bottom: var(--space-4); padding-bottom: var(--space-3);
161 border-bottom: 1px solid var(--border-subtle);
162 }
163 .ex-sr-count { font-size: 14px; color: var(--text-secondary); font-weight: 500; }
164 .ex-sr-query { font-size: 13px; color: var(--text-muted); font-style: italic; margin-left: auto; }
165 .ex-sr-method {
166 display: inline-flex; align-items: center; gap: 4px;
167 padding: 2px 10px; border-radius: var(--radius-full);
168 font-size: 11px; font-family: var(--font-mono); font-weight: 600;
169 &--semantic { background: rgba(63,185,80,0.12); color: #3fb950; border: 1px solid rgba(63,185,80,0.25); }
170 &--text { background: rgba(88,166,255,0.12); color: #58a6ff; border: 1px solid rgba(88,166,255,0.25); }
171 }
172
173 /* Repo result list — same responsive grid as the browse page */
174 .ex-sr-list {
175 display: grid;
176 grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
177 gap: var(--space-3);
178 }
179
180 /* Repo result card */
181 .ex-sr-card {
182 display: flex; align-items: stretch;
183 background: var(--bg-surface); border: 1px solid var(--border-default);
184 border-radius: var(--radius-md); text-decoration: none; overflow: hidden;
185 transition: border-color 0.15s, box-shadow 0.15s, transform 0.15s;
186 &:hover {
187 border-color: var(--color-accent);
188 box-shadow: 0 4px 20px rgba(0,0,0,0.3);
189 transform: translateY(-1px);
190 }
191 }
192 /* Rank bar — left edge colored by match strength */
193 .ex-sr-rank-bar {
194 width: 4px; flex-shrink: 0;
195 background: linear-gradient(to bottom, var(--color-accent), rgba(88,166,255,0.2));
196 min-height: 100%;
197 align-self: stretch;
198 }
199 .ex-sr-card-body { flex: 1; padding: var(--space-4) var(--space-5); min-width: 0; }
200 .ex-sr-card-top {
201 display: flex; align-items: center; gap: var(--space-3);
202 margin-bottom: var(--space-2);
203 }
204 .ex-sr-name {
205 font-size: 15px; font-weight: 600; color: var(--text-primary);
206 font-family: var(--font-mono);
207 .repo-card-sep { color: var(--text-muted); margin: 0 1px; }
208 }
209 .ex-sr-score {
210 margin-left: auto; font-size: 11px; font-family: var(--font-mono);
211 color: var(--color-accent); font-weight: 700; flex-shrink: 0;
212 }
213 .ex-sr-desc {
214 font-size: 14px; color: var(--text-secondary); line-height: 1.5;
215 margin-bottom: var(--space-3); margin-top: 0;
216 }
217 .ex-sr-tags { display: flex; gap: var(--space-1); flex-wrap: wrap; margin-bottom: var(--space-2); }
218 .ex-sr-pips { display: flex; gap: var(--space-2); flex-wrap: wrap; margin-bottom: var(--space-2); }
219 .ex-sr-pip {
220 display: inline-flex; align-items: center; gap: 4px;
221 padding: 2px 8px; border-radius: var(--radius-full);
222 font-size: 11px; font-weight: 500;
223 &--key { background: rgba(93,205,255,0.12); color: #5dcdff; border: 1px solid rgba(93,205,255,0.2); }
224 &--tempo { background: rgba(251,191,36,0.12); color: #fbbf24; border: 1px solid rgba(251,191,36,0.2); }
225 }
226 .ex-sr-footer {
227 display: flex; align-items: center; gap: var(--space-4);
228 margin-top: var(--space-2);
229 }
230
231 /* Empty state */
232 .ex-sr-empty {
233 padding: var(--space-12) var(--space-6); text-align: center;
234 }
235 .ex-sr-empty-icon { font-size: 2.5rem; color: var(--text-muted); margin-bottom: var(--space-4); }
236 .ex-sr-empty-title {
237 font-size: 16px; font-weight: 600; color: var(--text-primary);
238 margin-bottom: var(--space-2);
239 em { font-style: italic; }
240 }
241 .ex-sr-empty-sub { font-size: 14px; color: var(--text-muted); a { color: var(--color-accent); } }
242
243 /* Commit search results */
244 .ex-sr-commit-list { display: flex; flex-direction: column; gap: var(--space-3); }
245 .ex-sr-commit-group {
246 background: var(--bg-surface); border: 1px solid var(--border-default);
247 border-radius: var(--radius-md); overflow: hidden;
248 }
249 .ex-sr-commit-group-repo {
250 display: block; padding: var(--space-2) var(--space-4);
251 font-family: var(--font-mono); font-size: 13px; font-weight: 600;
252 color: var(--color-accent); text-decoration: none;
253 border-bottom: 1px solid var(--border-subtle);
254 background: var(--bg-overlay);
255 &:hover { text-decoration: underline; }
256 }
257 .ex-sr-commit-rows { padding: var(--space-2) 0; }
258 .ex-sr-commit {
259 display: grid; grid-template-columns: 84px 1fr auto;
260 align-items: center; gap: var(--space-3);
261 padding: var(--space-2) var(--space-4); text-decoration: none;
262 &:hover { background: var(--bg-overlay); }
263 }
264 .ex-sr-commit-sha {
265 font-family: var(--font-mono); font-size: 12px; color: var(--color-accent-link);
266 }
267 .ex-sr-commit-msg { font-size: 13px; color: var(--text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
268 .ex-sr-commit-author { font-size: 11px; color: var(--text-muted); white-space: nowrap; }
269
270 /* ── Browse layout ──────────────────────────────────────────────────────── */
271 .ex-browse { margin-top: 0; padding-top: var(--space-3); }
272 .ex-sidebar {
273 .ph-sidebar-section {
274 padding: var(--space-3) 0;
275 border-bottom: 1px solid var(--border-subtle);
276 &:last-child { border-bottom: none; }
277 }
278 }
279 .ex-sidebar-hd {
280 display: flex; align-items: center; justify-content: space-between;
281 }
282 .ex-clear-link {
283 font-size: 11px; color: var(--color-accent); text-decoration: none; opacity: 0.8;
284 &:hover { opacity: 1; text-decoration: underline; }
285 }
286 .ex-sort-option {
287 display: flex; align-items: center; gap: 8px;
288 font-size: 12px; color: var(--text-secondary); cursor: pointer; padding: 3px 0;
289 &:hover { color: var(--text-primary); }
290 &:hover .ex-radio-dot { border-color: var(--color-accent); }
291
292 input[type="radio"] {
293 appearance: none;
294 -webkit-appearance: none;
295 width: 14px; height: 14px;
296 border-radius: 50%;
297 border: 1.5px solid var(--border-default);
298 background: transparent;
299 flex-shrink: 0;
300 position: relative;
301 cursor: pointer;
302 transition: border-color 0.15s, background 0.15s;
303 &::after {
304 content: '';
305 position: absolute;
306 inset: 3px;
307 border-radius: 50%;
308 background: transparent;
309 transition: background 0.15s;
310 }
311 &:checked {
312 border-color: var(--color-accent);
313 &::after { background: var(--color-accent); }
314 }
315 &:hover { border-color: var(--color-accent); }
316 }
317 }
318
319 /* Domain quick-links */
320 .ex-domain-links {
321 display: flex; flex-direction: column; gap: 2px; margin-top: var(--space-2);
322 }
323 .ex-domain-link {
324 display: flex; align-items: center; gap: 6px;
325 font-size: 12px; color: var(--text-secondary);
326 text-decoration: none; padding: 3px 0;
327 transition: color var(--transition-fast);
328 svg { opacity: 0.5; flex-shrink: 0; }
329 &:hover { color: var(--color-accent); svg { opacity: 1; } }
330 }
331
332 .ex-chip-group { display: flex; gap: 5px; flex-wrap: wrap; margin-top: var(--space-2); }
333 .ex-empty-filter {
334 font-size: 12px; color: var(--text-muted); margin: var(--space-2) 0 0;
335 font-style: italic;
336 }
337 .ex-grid-header {
338 display: flex; align-items: center; justify-content: space-between;
339 margin-bottom: var(--space-3);
340 padding: var(--space-3) 0 var(--space-2);
341 border-bottom: 1px solid var(--border-subtle);
342 }
343 .ex-grid-title { font-size: 13px; font-weight: 600; color: var(--text-secondary); text-transform: uppercase; letter-spacing: 0.06em; margin: 0; }
344 .ex-grid-count { font-size: 12px; color: var(--text-muted); font-family: var(--font-mono); }
345 .sidebar-select {
346 width: 100%;
347 padding: 6px var(--space-3);
348 border-radius: var(--radius-sm);
349 background: var(--bg-overlay);
350 color: var(--text-secondary);
351 border: 1px solid var(--border-subtle);
352 font-size: 12px;
353 font-family: var(--font-sans);
354 cursor: pointer;
355 margin-top: var(--space-2);
356 appearance: none;
357 -webkit-appearance: none;
358 background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath fill='none' stroke='%236e7681' stroke-width='1.5' stroke-linecap='round' d='M1 1l4 4 4-4'/%3E%3C/svg%3E");
359 background-repeat: no-repeat;
360 background-position: right 10px center;
361 padding-right: 28px;
362 &:focus { outline: none; border-color: var(--color-accent); color: var(--text-primary); }
363 &:hover { border-color: var(--border-default); }
364 }
365 @media (max-width: 768px) {
366 .ex-browse { grid-template-columns: 1fr; }
367 .ex-sidebar { display: none; }
368 .ex-sidebar.open { display: block; }
369 .ex-search-field { height: 40px; }
370 .ex-search-input { font-size: 15px; }
371 }
372
373
374 /* =========================================================================
375 Insights page (.in-* prefix)
376 ========================================================================= */
377
378 /* ── Stats bar ─────────────────────────────────────────────────────────── */
379 .in-stats-bar {
380 display: grid;
381 grid-template-columns: repeat(auto-fill, minmax(130px, 1fr));
382 gap: var(--space-3);
383 margin-bottom: var(--space-5);
384 }
385 .in-stat-card {
386 background: var(--bg-surface);
387 border: 1px solid var(--border-default);
388 border-radius: var(--radius-lg);
389 padding: var(--space-4) var(--space-3);
390 text-align: center;
391 transition: border-color 0.15s, box-shadow 0.15s;
392 &:hover {
393 border-color: var(--color-accent);
394 box-shadow: 0 0 0 1px var(--color-accent);
395 }
396 }
397 .in-stat-icon {
398 font-size: 1.2rem;
399 line-height: 1;
400 margin-bottom: var(--space-1);
401 }
402 .in-stat-value {
403 font-family: var(--font-mono);
404 font-size: var(--font-size-2xl);
405 font-weight: var(--font-weight-bold);
406 color: var(--color-accent);
407 display: block;
408 line-height: 1.15;
409 }
410 .in-stat-label {
411 font-size: var(--font-size-xs);
412 color: var(--text-muted);
413 margin-top: var(--space-1);
414 white-space: nowrap;
415 }
416
417 /* ── Velocity ribbon ───────────────────────────────────────────────────── */
418 .in-velocity-bar {
419 display: flex;
420 gap: var(--space-4);
421 align-items: center;
422 background: var(--bg-surface);
423 border: 1px solid var(--border-default);
424 border-radius: var(--radius-base);
425 padding: var(--space-3) var(--space-4);
426 margin-bottom: var(--space-5);
427 flex-wrap: wrap;
428 }
429 .in-velocity-item {
430 display: flex;
431 align-items: center;
432 gap: var(--space-2);
433 font-size: var(--font-size-sm);
434 color: var(--text-muted);
435 span.in-vnum {
436 font-family: var(--font-mono);
437 font-weight: var(--font-weight-semibold);
438 color: var(--text-primary);
439 }
440 }
441 .in-velocity-sep {
442 width: 1px;
443 height: 16px;
444 background: var(--border-default);
445 }
446
447 /* ── Section panels ────────────────────────────────────────────────────── */
448 .in-section {
449 background: var(--bg-surface);
450 border: 1px solid var(--border-default);
451 border-radius: var(--radius-lg);
452 overflow: hidden;
453 margin-bottom: var(--space-5);
454 }
455 .in-section-header {
456 display: flex;
457 align-items: center;
458 justify-content: space-between;
459 padding: var(--space-4) var(--space-5);
460 border-bottom: 1px solid var(--border-default);
461 background: var(--bg-overlay);
462 }
463 .in-section-title {
464 font-size: var(--font-size-base);
465 font-weight: var(--font-weight-semibold);
466 color: var(--text-primary);
467 display: flex;
468 align-items: center;
469 gap: var(--space-2);
470 }
471 .in-section-meta {
472 font-size: var(--font-size-xs);
473 color: var(--text-muted);
474 font-family: var(--font-mono);
475 }
476 .in-section-body {
477 padding: var(--space-5);
478 }
479
480 /* ── Two-column panel grid ─────────────────────────────────────────────── */
481 .in-panel-row {
482 display: grid;
483 grid-template-columns: 1fr 1fr;
484 gap: var(--space-5);
485 margin-bottom: var(--space-5);
486 @media (max-width: 820px) {
487 grid-template-columns: 1fr;
488 }
489 }
490
491 /* ── Commit heatmap ────────────────────────────────────────────────────── */
492 .in-heatmap-wrap {
493 overflow-x: auto;
494 padding-bottom: var(--space-2);
495 }
496 .in-heatmap-grid {
497 display: flex;
498 gap: 3px;
499 min-width: max-content;
500 }
501 .in-heatmap-week {
502 display: flex;
503 flex-direction: column;
504 gap: 3px;
505 }
506 .in-heatmap-day {
507 width: 11px;
508 height: 11px;
509 border-radius: 2px;
510 cursor: default;
511 transition: transform 0.1s;
512 &:hover { transform: scale(1.3); }
513 &[data-level="-1"] { visibility: hidden; }
514 &[data-level="0"] { background: var(--bg-overlay); }
515 &[data-level="1"] { background: var(--color-accent); opacity: 0.25; }
516 &[data-level="2"] { background: var(--color-accent); opacity: 0.5; }
517 &[data-level="3"] { background: var(--color-accent); opacity: 0.75; }
518 &[data-level="4"] { background: var(--color-accent); opacity: 1; }
519 }
520 .in-heatmap-legend {
521 display: flex;
522 align-items: center;
523 gap: 4px;
524 margin-top: var(--space-3);
525 font-size: var(--font-size-xs);
526 color: var(--text-muted);
527 }
528 .in-heatmap-legend-cell {
529 width: 10px;
530 height: 10px;
531 border-radius: 2px;
532 background: var(--color-accent);
533 }
534
535 /* ── Horizontal bar charts (branch / contributor) ──────────────────────── */
536 .in-bar-list {
537 display: flex;
538 flex-direction: column;
539 gap: var(--space-2);
540 }
541 .in-bar-row {
542 display: grid;
543 grid-template-columns: 140px 1fr 48px;
544 align-items: center;
545 gap: var(--space-3);
546 }
547 .in-bar-label {
548 font-size: var(--font-size-xs);
549 color: var(--text-secondary);
550 overflow: hidden;
551 text-overflow: ellipsis;
552 white-space: nowrap;
553 display: flex;
554 align-items: center;
555 gap: var(--space-2);
556 }
557 .in-bar-avatar {
558 width: 20px;
559 height: 20px;
560 border-radius: 50%;
561 background: var(--color-accent);
562 color: var(--bg-base);
563 font-size: 10px;
564 font-weight: 700;
565 display: flex;
566 align-items: center;
567 justify-content: center;
568 flex-shrink: 0;
569 }
570 .in-bar-track {
571 background: var(--bg-overlay);
572 border-radius: var(--radius-full);
573 height: 8px;
574 overflow: hidden;
575 }
576 .in-bar-fill {
577 height: 100%;
578 border-radius: var(--radius-full);
579 background: var(--color-accent);
580 transform-origin: left;
581 transform: scaleX(0);
582 transition: transform 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94);
583 &.in-bar-fill--branch {
584 background: linear-gradient(90deg, var(--dim-harmonic), var(--color-accent));
585 }
586 &.in-bar-fill--contrib {
587 background: linear-gradient(90deg, var(--dim-melodic), var(--color-accent));
588 }
589 }
590 .in-bar-fill--animate { transform: scaleX(1); }
591 .in-bar-count {
592 font-family: var(--font-mono);
593 font-size: var(--font-size-xs);
594 color: var(--text-muted);
595 text-align: right;
596 }
597
598 /* Branch name color cues */
599 .in-branch-dot {
600 width: 8px;
601 height: 8px;
602 border-radius: 50%;
603 flex-shrink: 0;
604 &[data-branch-type="main"] { background: var(--color-success); }
605 &[data-branch-type="feat"] { background: var(--color-accent); }
606 &[data-branch-type="fix"] { background: var(--color-danger); }
607 &[data-branch-type="exp"] { background: var(--color-warning); }
608 &[data-branch-type="other"] { background: var(--text-muted); }
609 }
610
611 /* ── Health metric cards (issue / proposal) ────────────────────────────── */
612 .in-health-grid {
613 display: grid;
614 grid-template-columns: repeat(3, 1fr);
615 gap: var(--space-3);
616 @media (max-width: 480px) { grid-template-columns: repeat(2, 1fr); }
617 }
618 .in-health-card {
619 background: var(--bg-overlay);
620 border-radius: var(--radius-base);
621 padding: var(--space-3) var(--space-4);
622 text-align: center;
623 }
624 .in-health-value {
625 font-family: var(--font-mono);
626 font-size: 1.6rem;
627 font-weight: var(--font-weight-bold);
628 line-height: 1.2;
629 &.in-green { color: var(--color-success); }
630 &.in-orange { color: var(--color-warning); }
631 &.in-purple { color: var(--dim-harmonic); }
632 &.in-red { color: var(--color-danger); }
633 &.in-blue { color: var(--color-accent); }
634 }
635 .in-health-label {
636 font-size: var(--font-size-xs);
637 color: var(--text-muted);
638 margin-top: 2px;
639 }
640 .in-donut-row {
641 display: flex;
642 align-items: center;
643 gap: var(--space-4);
644 margin-top: var(--space-4);
645 padding-top: var(--space-4);
646 border-top: 1px solid var(--border-default);
647 flex-wrap: wrap;
648 }
649 .in-donut-legend-item {
650 display: flex;
651 align-items: center;
652 gap: var(--space-2);
653 font-size: var(--font-size-xs);
654 color: var(--text-muted);
655 }
656 .in-donut-swatch {
657 width: 10px;
658 height: 10px;
659 border-radius: 2px;
660 }
661
662 /* ── Musical evolution (BPM polyline) ──────────────────────────────────── */
663 .in-bpm-chart {
664 width: 100%;
665 height: 100px;
666 overflow: visible;
667 }
668 .in-bpm-line {
669 fill: none;
670 stroke: var(--color-accent);
671 stroke-width: 2;
672 stroke-linecap: round;
673 stroke-linejoin: round;
674 }
675 .in-bpm-area {
676 fill: var(--color-accent);
677 opacity: 0.08;
678 }
679 .in-bpm-dot {
680 fill: var(--color-accent);
681 r: 3;
682 cursor: pointer;
683 transition: r 0.15s;
684 &:hover { r: 5; }
685 }
686 .in-bpm-axis {
687 stroke: var(--border-default);
688 stroke-width: 1;
689 }
690 .in-bpm-axis-label {
691 fill: var(--text-muted);
692 font-size: 10px;
693 font-family: var(--font-mono);
694 }
695 .in-bpm-empty {
696 display: flex;
697 align-items: center;
698 justify-content: center;
699 gap: var(--space-3);
700 padding: var(--space-5);
701 color: var(--text-muted);
702 font-size: var(--font-size-sm);
703 background: var(--bg-overlay);
704 border-radius: var(--radius-base);
705 }
706
707 /* Key change chips */
708 .in-key-chips {
709 display: flex;
710 flex-wrap: wrap;
711 gap: var(--space-2);
712 margin-top: var(--space-4);
713 }
714 .in-key-chip {
715 display: inline-flex;
716 align-items: center;
717 gap: var(--space-1);
718 padding: 2px 10px;
719 background: var(--bg-overlay);
720 border: 1px solid var(--border-default);
721 border-radius: var(--radius-full);
722 font-size: var(--font-size-xs);
723 color: var(--text-secondary);
724 font-family: var(--font-mono);
725 }
726
727 /* ── Sessions panel ─────────────────────────────────────────────────────── */
728 .in-session-stats {
729 display: grid;
730 grid-template-columns: repeat(3, 1fr);
731 gap: var(--space-3);
732 margin-bottom: var(--space-4);
733 @media (max-width: 480px) { grid-template-columns: repeat(2, 1fr); }
734 }
735 .in-locations-list {
736 display: flex;
737 flex-direction: column;
738 gap: var(--space-2);
739 margin-top: var(--space-3);
740 }
741 .in-location-row {
742 display: grid;
743 grid-template-columns: 1fr auto;
744 align-items: center;
745 font-size: var(--font-size-sm);
746 color: var(--text-secondary);
747 }
748 .in-location-count {
749 font-family: var(--font-mono);
750 font-size: var(--font-size-xs);
751 color: var(--text-muted);
752 }
753
754 /* ── Releases panel ─────────────────────────────────────────────────────── */
755 .in-release-timeline {
756 display: flex;
757 flex-direction: column;
758 gap: 0;
759 }
760 .in-release-row {
761 display: grid;
762 grid-template-columns: auto 1fr auto;
763 align-items: center;
764 gap: var(--space-4);
765 padding: var(--space-3) 0;
766 border-bottom: 1px solid var(--border-default);
767 &:last-child { border-bottom: none; }
768 }
769 .in-release-dot-col {
770 display: flex;
771 flex-direction: column;
772 align-items: center;
773 gap: 0;
774 }
775 .in-release-dot {
776 width: 10px;
777 height: 10px;
778 border-radius: 50%;
779 background: var(--color-accent);
780 &.in-prerelease { background: var(--color-warning); }
781 &.in-draft { background: var(--text-muted); }
782 }
783 .in-release-tag {
784 font-family: var(--font-mono);
785 font-size: var(--font-size-sm);
786 font-weight: var(--font-weight-semibold);
787 color: var(--color-accent);
788 }
789 .in-release-title {
790 font-size: var(--font-size-sm);
791 color: var(--text-muted);
792 overflow: hidden;
793 text-overflow: ellipsis;
794 white-space: nowrap;
795 }
796 .in-release-badge {
797 font-size: 0.68rem;
798 padding: 1px 7px;
799 border-radius: var(--radius-full);
800 font-weight: 600;
801 &.in-badge-stable { background: rgba(var(--color-success-rgb, 35,134,54),0.15); color: var(--color-success); border: 1px solid var(--color-success); }
802 &.in-badge-pre { background: rgba(var(--color-warning-rgb, 210,153,34),0.15); color: var(--color-warning); border: 1px solid var(--color-warning); }
803 &.in-badge-draft { background: var(--bg-overlay); color: var(--text-muted); border: 1px solid var(--border-default); }
804 }
805 .in-release-date {
806 font-family: var(--font-mono);
807 font-size: var(--font-size-xs);
808 color: var(--text-muted);
809 white-space: nowrap;
810 }
811
812 /* ── Empty state ─────────────────────────────────────────────────────────── */
813 .in-empty {
814 text-align: center;
815 padding: var(--space-6);
816 color: var(--text-muted);
817 font-size: var(--font-size-sm);
818 }
819
820 /* ── Tooltip (shown by TS module) ────────────────────────────────────────── */
821 .in-tooltip {
822 position: fixed;
823 background: var(--bg-overlay);
824 border: 1px solid var(--border-default);
825 border-radius: 6px;
826 padding: 4px 10px;
827 font-size: var(--font-size-xs);
828 color: var(--text-primary);
829 pointer-events: none;
830 z-index: 9999;
831 white-space: nowrap;
832 box-shadow: 0 4px 12px rgba(0,0,0,0.3);
833 opacity: 0;
834 transition: opacity 0.12s;
835 &.in-tooltip--visible { opacity: 1; }
836 }
837
838
839 /* =========================================================================
840 Musical Analysis page
841 ========================================================================= */
842
843 /* Stats bar */
844 .an-stats-bar {
845 display: flex; gap: 12px; flex-wrap: wrap; margin-bottom: 20px;
846 }
847 .an-stat-card {
848 display: flex; align-items: center; gap: 12px;
849 background: var(--bg-surface); border: 1px solid var(--border-default);
850 border-radius: 8px; padding: 14px 20px; flex: 1; min-width: 130px;
851 transition: border-color 0.15s;
852 &:hover { border-color: var(--color-accent); }
853 }
854 .an-stat-icon {
855 width: 36px; height: 36px; border-radius: 8px;
856 display: flex; align-items: center; justify-content: center;
857 font-size: 18px; flex-shrink: 0;
858 &-commits { background: rgba(88,166,255,0.12); }
859 &-branches { background: rgba(63,185,80,0.12); }
860 &-sections { background: rgba(163,113,247,0.12); }
861 &-tracks { background: rgba(45,212,191,0.12); }
862 &-dims { background: rgba(227,179,65,0.12); }
863 }
864 .an-stat-body { display: flex; flex-direction: column; }
865 .an-stat-val { font-size: 22px; font-weight: 700; color: var(--text-primary); line-height: 1.1; }
866 .an-stat-lbl { font-size: 11px; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.05em; }
867
868 /* Section headings */
869 .an-section {
870 margin-bottom: 20px;
871 background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: 10px;
872 overflow: hidden;
873 }
874 .an-section-header {
875 display: flex; align-items: center; gap: 10px;
876 padding: 14px 18px; border-bottom: 1px solid var(--border-default);
877 background: var(--bg-overlay);
878 }
879 .an-section-icon { font-size: 18px; }
880 .an-section-title { font-size: 15px; font-weight: 600; color: var(--text-primary); }
881 .an-section-sub { font-size: 12px; color: var(--text-muted); margin-left: auto; }
882 .an-section-body { padding: 18px; }
883
884 /* Musical identity */
885 .an-identity-grid {
886 display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 12px;
887 }
888 .an-identity-item {
889 display: flex; flex-direction: column; gap: 6px;
890 background: var(--bg-base); border: 1px solid var(--border-subtle);
891 border-radius: 8px; padding: 12px 14px;
892 }
893 .an-identity-lbl { font-size: 10px; font-weight: 600; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.06em; }
894 .an-identity-val { font-size: 20px; font-weight: 700; color: var(--text-primary); line-height: 1.2; }
895 .an-identity-sub { font-size: 11px; color: var(--text-muted); }
896
897 /* Emotion bars */
898 .an-emotion-row {
899 display: flex; flex-direction: column; gap: 8px; margin-top: 4px;
900 }
901 .an-emotion-item { display: flex; align-items: center; gap: 10px; }
902 .an-emotion-lbl { font-size: 12px; color: var(--text-muted); width: 58px; flex-shrink: 0; }
903 .an-emotion-track {
904 flex: 1; height: 8px; background: var(--bg-overlay);
905 border-radius: 4px; overflow: hidden; border: 1px solid var(--border-subtle);
906 }
907 .an-emotion-fill { height: 100%; border-radius: 4px; }
908 .an-emotion-pct { font-size: 11px; color: var(--text-muted); width: 32px; text-align: right; flex-shrink: 0; font-family: var(--font-mono); }
909
910 /* Tag chips */
911 .an-tag-chips { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 6px; }
912 .an-tag-chip {
913 font-size: 11px; padding: 2px 8px; border-radius: 10px;
914 background: var(--bg-overlay); border: 1px solid var(--border-default);
915 color: var(--text-secondary);
916 }
917
918 /* Composition profile — two columns */
919 .an-composition-grid {
920 display: grid; grid-template-columns: 1fr 1fr; gap: 20px;
921 @media (max-width: 640px) { grid-template-columns: 1fr; }
922 }
923 .an-comp-col {}
924 .an-comp-title { font-size: 12px; font-weight: 600; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.06em; margin-bottom: 12px; }
925 .an-comp-row {
926 display: flex; align-items: center; gap: 8px; margin-bottom: 8px;
927 }
928 .an-comp-lbl { font-size: 12px; color: var(--text-secondary); width: 72px; flex-shrink: 0; text-transform: capitalize; }
929 .an-comp-track {
930 flex: 1; height: 10px; background: var(--bg-overlay);
931 border-radius: 5px; overflow: hidden;
932 }
933 .an-comp-fill { height: 100%; border-radius: 5px; transition: width 0.3s ease; }
934 .an-comp-count { font-size: 11px; color: var(--text-muted); width: 26px; text-align: right; flex-shrink: 0; font-family: var(--font-mono); }
935
936 /* Dimension activity */
937 .an-dim-activity {
938 display: flex; flex-direction: column; gap: 10px;
939 }
940 .an-dim-act-row { display: flex; align-items: center; gap: 10px; }
941 .an-dim-act-lbl {
942 font-size: 12px; color: var(--text-secondary); width: 80px; flex-shrink: 0;
943 text-transform: capitalize;
944 }
945 .an-dim-act-track {
946 flex: 1; height: 12px; background: var(--bg-overlay);
947 border-radius: 6px; overflow: hidden;
948 }
949 .an-dim-act-fill { height: 100%; border-radius: 6px; transition: width 0.4s ease; }
950 .an-dim-act-count { font-size: 11px; color: var(--text-muted); width: 36px; text-align: right; flex-shrink: 0; }
951 .an-dim-act-badge {
952 font-size: 10px; font-weight: 600; padding: 2px 7px; border-radius: 8px;
953 text-transform: uppercase; letter-spacing: 0.04em; flex-shrink: 0;
954 &-melodic { background: rgba(88,166,255,0.15); color: #58a6ff; }
955 &-harmonic { background: rgba(163,113,247,0.15); color: #a371f7; }
956 &-rhythmic { background: rgba(63,185,80,0.15); color: #3fb950; }
957 &-structural { background: rgba(227,179,65,0.15); color: #e3b341; }
958 &-dynamic { background: rgba(248,81,73,0.15); color: #f85149; }
959 }
960
961 /* Branch divergence — interactive section */
962 .an-branch-selectors {
963 display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 20px;
964 }
965 .an-branch-lbl { font-size: 12px; font-weight: 600; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.05em; }
966 .an-branch-select {
967 background: var(--bg-overlay); color: var(--text-primary);
968 border: 1px solid var(--border-default); border-radius: 6px;
969 padding: 6px 12px; font-size: 13px; cursor: pointer; font-family: var(--font-mono);
970 &:hover { border-color: var(--color-accent); }
971 &:focus { outline: none; border-color: var(--color-accent); box-shadow: 0 0 0 2px rgba(31,111,235,0.25); }
972 }
973 .an-branch-vs { color: var(--text-muted); font-size: 12px; font-weight: 600; }
974 .an-compare-btn {
975 background: var(--color-accent); color: #fff; border: none;
976 border-radius: 6px; padding: 7px 16px; font-size: 13px; font-weight: 600;
977 cursor: pointer; transition: opacity 0.15s;
978 &:hover { opacity: 0.85; }
979 }
980
981 /* Divergence result layout */
982 .an-divergence-result { display: flex; gap: 24px; flex-wrap: wrap; }
983 .an-result-left { flex-shrink: 0; display: flex; flex-direction: column; align-items: center; gap: 12px; }
984 .an-result-right { flex: 1; min-width: 240px; }
985
986 /* Gauge */
987 .an-gauge-circle {
988 width: 130px; height: 130px; border-radius: 50%;
989 display: flex; align-items: center; justify-content: center;
990 box-shadow: 0 0 0 4px var(--bg-overlay);
991 transition: background 0.4s ease;
992 }
993 .an-gauge-inner {
994 width: 96px; height: 96px; border-radius: 50%;
995 background: var(--bg-surface);
996 display: flex; align-items: center; justify-content: center; flex-direction: column;
997 }
998 .an-gauge-pct { font-size: 1.5rem; font-weight: 700; line-height: 1; color: var(--text-primary); }
999 .an-gauge-lbl-sm { font-size: 9px; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.05em; }
1000 .an-gauge-label { font-size: 12px; color: var(--text-muted); text-align: center; max-width: 130px; }
1001 .an-ancestor { font-size: 11px; color: var(--text-muted); font-family: var(--font-mono); }
1002
1003 /* Radar wrap */
1004 .an-radar-wrap { margin-bottom: 8px; }
1005
1006 /* Dimension cards */
1007 .an-dim-cards { display: flex; flex-direction: column; gap: 10px; }
1008 .an-dim-card {
1009 background: var(--bg-base); border: 1px solid var(--border-subtle);
1010 border-radius: 8px; padding: 12px 14px;
1011 transition: border-color 0.15s;
1012 &:hover { border-color: var(--border-default); }
1013 }
1014 .an-dim-header {
1015 display: flex; align-items: center; gap: 8px; margin-bottom: 6px;
1016 }
1017 .an-dim-name { font-size: 13px; font-weight: 600; color: var(--text-primary); text-transform: capitalize; }
1018 .an-dim-pct { font-size: 12px; color: var(--text-muted); font-family: var(--font-mono); margin-left: auto; }
1019 .an-dim-level {
1020 font-size: 10px; font-weight: 700; padding: 2px 6px; border-radius: 4px;
1021 text-transform: uppercase; letter-spacing: 0.04em;
1022 &.an-level-none { background: rgba(110,118,129,0.2); color: #6e7681; }
1023 &.an-level-low { background: rgba(88,166,255,0.15); color: #58a6ff; }
1024 &.an-level-med { background: rgba(227,179,65,0.15); color: #e3b341; }
1025 &.an-level-high { background: rgba(248,81,73,0.15); color: #f85149; }
1026 }
1027 .an-dim-bar-track {
1028 height: 6px; background: var(--bg-overlay); border-radius: 3px;
1029 overflow: hidden; margin-bottom: 6px;
1030 }
1031 .an-dim-bar-fill { height: 100%; border-radius: 3px; transition: width 0.4s ease; }
1032 .an-dim-desc { font-size: 12px; color: var(--text-muted); margin: 0 0 6px; }
1033 .an-dim-commits { display: flex; gap: 8px; flex-wrap: wrap; }
1034 .an-dim-commit-pill {
1035 font-size: 10px; color: var(--text-muted); background: var(--bg-overlay);
1036 border: 1px solid var(--border-subtle); border-radius: 4px; padding: 1px 6px;
1037 font-family: var(--font-mono);
1038 }
1039
1040 /* Loading states */
1041 .an-loading-sm {
1042 padding: 16px; text-align: center; color: var(--text-muted); font-size: 13px;
1043 &.error { color: var(--color-danger, #f85149); }
1044 }
1045
1046
1047
1048 // ── Insights page (.ins-* prefix) ────────────────────────────────────────────
1049
1050 .ins-page {
1051 padding: var(--space-2) 0 var(--space-6);
1052 }
1053
1054 // Muse-exclusive banner
1055 .ins-muse-banner {
1056 display: flex; align-items: center; gap: var(--space-2);
1057 margin-bottom: var(--space-4);
1058 padding: var(--space-2) var(--space-3);
1059 background: color-mix(in srgb, #bc8cff 8%, transparent);
1060 border: 1px solid color-mix(in srgb, #bc8cff 20%, transparent);
1061 border-radius: var(--radius-base);
1062 }
1063 .ins-muse-badge {
1064 display: inline-flex; align-items: center;
1065 font-size: 10px; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase;
1066 background: color-mix(in srgb, #bc8cff 18%, transparent);
1067 color: #bc8cff; border: 1px solid color-mix(in srgb, #bc8cff 30%, transparent);
1068 border-radius: 4px; padding: 2px 7px; white-space: nowrap; flex-shrink: 0;
1069 }
1070 .ins-muse-banner-text { font-size: 12px; color: var(--text-muted); }
1071
1072 // Stat card icon variants
1073 .ins-stat-icon--breaking { color: #f87171; }
1074 .ins-stat-icon--agent { color: #a78bfa; }
1075 .ins-stat-icon--sym-add { color: #34d399; }
1076 .ins-stat-icon--sym-del { color: #f87171; }
1077 .ins-stat-icon--conventional { color: #34d399; }
1078 .ins-stat-card--warning .ins-stat-value { color: #f87171; }
1079 .ins-stat-card--agent .ins-stat-value { color: #bc8cff; }
1080
1081 // Three-column intel row
1082 .ins-intel-row {
1083 display: grid;
1084 grid-template-columns: repeat(3, 1fr);
1085 gap: var(--space-3);
1086 margin-bottom: var(--space-3);
1087 @media (max-width: 820px) { grid-template-columns: 1fr; }
1088 }
1089
1090 // Commit DNA stacked bar
1091 .ins-dna-stack {
1092 display: flex; height: 10px; border-radius: 5px; overflow: hidden;
1093 margin-bottom: var(--space-3); gap: 1px;
1094 }
1095 .ins-dna-seg { transition: opacity 0.15s; &:hover { opacity: 1; } }
1096
1097 // Commit type list
1098 .ins-type-list { display: flex; flex-direction: column; gap: 6px; margin-top: var(--space-2); }
1099 .ins-type-row {
1100 display: grid; grid-template-columns: 10px 60px 1fr 28px 36px;
1101 align-items: center; gap: var(--space-2); font-size: 12px;
1102 }
1103 .ins-type-dot { width: 10px; height: 10px; border-radius: 50%; flex-shrink: 0; }
1104 .ins-type-name { font-family: var(--font-mono); font-size: 11px; color: var(--text-primary); }
1105 .ins-type-count { font-family: var(--font-mono); font-size: 11px; color: var(--text-muted); text-align: right; }
1106 .ins-type-pct { font-size: 11px; color: var(--text-muted); text-align: right; }
1107
1108 // Authorship donut
1109 .ins-authorship {
1110 display: flex; align-items: center; gap: var(--space-4);
1111 padding: var(--space-3) var(--space-4);
1112 }
1113 .ins-authorship-donut { width: 90px; height: 90px; flex-shrink: 0; }
1114 .ins-authorship-legend { display: flex; flex-direction: column; gap: var(--space-2); flex: 1; }
1115 .ins-auth-row {
1116 display: grid; grid-template-columns: 10px 1fr 28px 36px;
1117 align-items: center; gap: var(--space-2); font-size: 12px;
1118 }
1119 .ins-auth-dot { width: 10px; height: 10px; border-radius: 50%; }
1120 .ins-auth-label { color: var(--text-primary); }
1121 .ins-auth-count { font-family: var(--font-mono); font-size: 11px; color: var(--text-muted); text-align: right; }
1122 .ins-auth-pct { font-size: 11px; color: var(--text-muted); text-align: right; }
1123
1124 // Semver bars
1125 .ins-semver-bars { display: flex; flex-direction: column; gap: 8px; padding: var(--space-3) var(--space-4); }
1126 .ins-semver-row {
1127 display: grid; grid-template-columns: 48px 1fr 32px;
1128 align-items: center; gap: var(--space-2);
1129 }
1130 .ins-semver-label { font-family: var(--font-mono); font-size: 11px; font-weight: 600; }
1131 .ins-semver-count { font-family: var(--font-mono); font-size: 11px; color: var(--text-muted); text-align: right; }
1132
1133 // Breaking changes list
1134 .ins-breaking-list {
1135 margin: var(--space-3) var(--space-4) var(--space-3);
1136 border-top: 1px solid var(--border-subtle); padding-top: var(--space-3);
1137 }
1138 .ins-breaking-title {
1139 display: flex; align-items: center; gap: 5px;
1140 font-size: 12px; font-weight: 600; color: #f85149; margin-bottom: var(--space-2);
1141 }
1142 .ins-breaking-row {
1143 display: grid; grid-template-columns: 90px 1fr;
1144 gap: var(--space-2); font-size: 11px; margin-bottom: 4px;
1145 }
1146 .ins-breaking-date { font-family: var(--font-mono); color: var(--text-muted); }
1147 .ins-breaking-msg { color: var(--text-secondary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1148
1149 // Symbol velocity card
1150 .ins-sym-velocity { margin-bottom: var(--space-4); }
1151 .ins-sym-stats {
1152 display: flex; align-items: center; gap: 0;
1153 padding: var(--space-4) var(--space-5);
1154 }
1155 .ins-sym-stat {
1156 flex: 1; text-align: center;
1157 display: flex; flex-direction: column; gap: 4px;
1158 }
1159 .ins-sym-stat-val {
1160 font-family: var(--font-mono); font-size: 28px; font-weight: 700; line-height: 1;
1161 }
1162 .ins-sym-stat-label { font-size: 11px; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.05em; }
1163 .ins-sym-stat--add .ins-sym-stat-val { color: #3fb950; }
1164 .ins-sym-stat--del .ins-sym-stat-val { color: #f85149; }
1165 .ins-sym-stat--net .ins-sym-stat-val { color: var(--text-primary); }
1166 .ins-sym-stat--positive .ins-sym-stat-val { color: #3fb950; }
1167 .ins-sym-stat--negative .ins-sym-stat-val { color: #f85149; }
1168 .ins-sym-divider {
1169 width: 1px; height: 48px; background: var(--border-default); flex-shrink: 0; margin: 0 var(--space-4);
1170 }
1171
1172 // Section divider with label
1173 .ins-section-divider {
1174 display: flex; align-items: center; gap: var(--space-3);
1175 margin: var(--space-5) 0 var(--space-4);
1176 &::before, &::after { content: ''; flex: 1; height: 1px; background: var(--border-subtle); }
1177 span { font-size: 11px; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.08em; white-space: nowrap; }
1178 }
1179
1180 .ins-empty-note {
1181 font-size: 12px; color: var(--text-muted); padding: var(--space-3) var(--space-4);
1182 line-height: 1.5; margin: 0;
1183 }
1184
1185 // Page header
1186 .ins-page-header {
1187 display: flex; align-items: center; justify-content: space-between;
1188 margin-bottom: var(--space-4);
1189 gap: var(--space-2); flex-wrap: wrap;
1190 }
1191 .ins-page-header__left { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; }
1192 .ins-page-header__actions { display: flex; gap: var(--space-2); }
1193 .ins-page-title {
1194 font-size: 20px; font-weight: 700; color: var(--text-primary);
1195 margin: 0; display: flex; align-items: center; gap: 8px;
1196 }
1197 .ins-domain-badge {
1198 display: inline-flex; align-items: center;
1199 font-size: 11px; font-family: var(--font-mono);
1200 background: color-mix(in srgb, var(--color-accent) 12%, transparent);
1201 color: var(--color-accent);
1202 border: 1px solid color-mix(in srgb, var(--color-accent) 25%, transparent);
1203 border-radius: 4px; padding: 2px 8px;
1204 text-decoration: none;
1205 &:hover { background: color-mix(in srgb, var(--color-accent) 20%, transparent); }
1206 }
1207 .ins-ref-pill {
1208 font-family: var(--font-mono); font-size: 11px; color: var(--text-muted);
1209 background: var(--bg-overlay); border-radius: 4px; padding: 2px 6px;
1210 }
1211
1212 // Hero stat cards
1213 .ins-stat-grid {
1214 display: grid;
1215 grid-template-columns: repeat(3, 1fr);
1216 gap: var(--space-2);
1217 margin-bottom: var(--space-3);
1218 @media (max-width: 640px) { grid-template-columns: repeat(2, 1fr); }
1219 }
1220 .ins-stat-card {
1221 background: var(--bg-surface);
1222 border: 1px solid var(--border-default);
1223 border-radius: var(--radius-md);
1224 padding: var(--space-3);
1225 display: flex; align-items: center; gap: var(--space-2);
1226 transition: border-color 0.15s, transform 0.15s;
1227 &:hover { border-color: var(--color-accent); transform: translateY(-1px); }
1228 }
1229 .ins-stat-icon {
1230 width: 40px; height: 40px; border-radius: var(--radius-sm);
1231 display: flex; align-items: center; justify-content: center;
1232 flex-shrink: 0;
1233 background: var(--bg-overlay);
1234 }
1235 .ins-stat-card--commits .ins-stat-icon { background: color-mix(in srgb, var(--color-accent) 12%, transparent); color: var(--color-accent); }
1236 .ins-stat-card--files .ins-stat-icon { background: color-mix(in srgb, var(--color-info) 12%, transparent); color: var(--color-info); }
1237 .ins-stat-card--contributors .ins-stat-icon { background: color-mix(in srgb, var(--color-success) 12%, transparent); color: var(--color-success); }
1238 .ins-stat-card--branches .ins-stat-icon { background: color-mix(in srgb, var(--color-warning) 12%, transparent); color: var(--color-warning); }
1239 .ins-stat-card--size .ins-stat-icon { background: color-mix(in srgb, #a371f7 12%, transparent); color: #a371f7; }
1240 .ins-stat-card--tests .ins-stat-icon { background: color-mix(in srgb, var(--color-success) 12%, transparent); color: var(--color-success); }
1241 .ins-stat-body { display: flex; flex-direction: column; min-width: 0; }
1242 .ins-stat-value { font-size: 20px; font-weight: 700; font-family: var(--font-mono); color: var(--text-primary); line-height: 1; }
1243 .ins-stat-label { font-size: 11px; color: var(--text-muted); margin-top: 3px; }
1244
1245 // Two column layout
1246 .ins-two-col {
1247 display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-3);
1248 margin-bottom: var(--space-3);
1249 @media (max-width: 640px) { grid-template-columns: 1fr; }
1250 }
1251
1252 // Generic card
1253 .ins-card {
1254 background: var(--bg-surface);
1255 border: 1px solid var(--border-default);
1256 border-radius: var(--radius-md);
1257 overflow: hidden;
1258 }
1259 .ins-card-header {
1260 display: flex; align-items: center; justify-content: space-between;
1261 padding: var(--space-2) var(--space-3);
1262 border-bottom: 1px solid var(--border-subtle);
1263 }
1264 .ins-card-title {
1265 font-size: 13px; font-weight: 600; color: var(--text-primary);
1266 margin: 0; display: flex; align-items: center; gap: 6px;
1267 }
1268 .ins-card-meta { font-size: 11px; color: var(--text-muted); }
1269
1270 // Language stacked bar
1271 .ins-lang-stack {
1272 display: flex; height: 8px; overflow: hidden; margin: 0 var(--space-4) var(--space-3);
1273 border-radius: 4px; background: var(--border-subtle);
1274 }
1275 .ins-lang-stack-seg {
1276 height: 100%; min-width: 3px; transition: opacity 0.2s;
1277 &:hover { opacity: 0.7; }
1278 }
1279
1280 // Language list
1281 .ins-lang-list { padding: 0 var(--space-4) var(--space-3); }
1282 .ins-lang-list--detail { padding-bottom: var(--space-4); }
1283 .ins-lang-row {
1284 display: flex; align-items: center; gap: 8px;
1285 padding: 5px 0; border-bottom: 1px solid var(--border-subtle);
1286 font-size: 12px; &:last-child { border-bottom: none; }
1287 }
1288 .ins-lang-dot { width: 10px; height: 10px; border-radius: 50%; flex-shrink: 0; }
1289 .ins-lang-name { width: 100px; min-width: 80px; color: var(--text-secondary); flex-shrink: 0; }
1290 .ins-lang-bar-track {
1291 flex: 1; height: 6px; background: var(--border-subtle); border-radius: 3px; overflow: hidden; min-width: 40px;
1292 }
1293 .ins-lang-bar { height: 100%; border-radius: 3px; transition: width 0.7s cubic-bezier(0.25,0.46,0.45,0.94); }
1294 .ins-lang-count { width: 60px; text-align: right; color: var(--text-muted); font-family: var(--font-mono); font-size: 11px; }
1295 .ins-lang-pct { width: 38px; text-align: right; color: var(--text-muted); font-size: 11px; }
1296 .ins-lang-size { width: 60px; text-align: right; color: var(--text-muted); font-size: 11px; }
1297
1298 // Contributors
1299 .ins-contributor-list { padding: var(--space-2) var(--space-4) var(--space-3); }
1300 .ins-contributor-row {
1301 display: flex; align-items: center; gap: 8px; padding: 5px 0;
1302 border-bottom: 1px solid var(--border-subtle); font-size: 12px; &:last-child { border-bottom: none; }
1303 }
1304 .ins-contributor-avatar {
1305 width: 24px; height: 24px; border-radius: 50%; background: var(--color-accent);
1306 color: var(--bg-base); font-size: 10px; font-weight: 700;
1307 display: flex; align-items: center; justify-content: center; flex-shrink: 0;
1308 }
1309 .ins-contributor-name { min-width: 100px; color: var(--text-secondary); }
1310 .ins-contributor-count { font-family: var(--font-mono); font-size: 11px; color: var(--text-muted); }
1311
1312 // ── Dimension funnel ──────────────────────────────────────────────────────────
1313 .ins-funnel-section { margin-top: var(--space-4); }
1314 .ins-funnel-header { margin-bottom: var(--space-3); }
1315 .ins-funnel-title { font-size: 16px; font-weight: 700; color: var(--text-primary); margin: 0 0 6px; }
1316 .ins-funnel-subtitle { font-size: 13px; color: var(--text-muted); margin: 0; }
1317
1318 .ins-dim-grid {
1319 display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--space-3);
1320 @media (max-width: 700px) { grid-template-columns: repeat(2, 1fr); }
1321 @media (max-width: 480px) { grid-template-columns: 1fr; }
1322 }
1323
1324 .ins-dim-card {
1325 display: flex; align-items: flex-start; gap: var(--space-3);
1326 padding: var(--space-4);
1327 background: var(--bg-surface);
1328 border: 1px solid var(--border-default);
1329 border-radius: var(--radius-md);
1330 text-decoration: none;
1331 transition: border-color 0.15s, transform 0.15s, background 0.15s;
1332 cursor: pointer;
1333 &:hover {
1334 border-color: var(--color-accent);
1335 background: color-mix(in srgb, var(--color-accent) 4%, var(--bg-surface));
1336 transform: translateY(-2px);
1337 .ins-dim-card__arrow { transform: translateX(3px); opacity: 1; }
1338 }
1339 }
1340
1341 // Color variants for dimension cards
1342 @mixin dim-card-color($color) {
1343 .ins-dim-card__icon { background: color-mix(in srgb, #{$color} 12%, transparent); color: #{$color}; }
1344 &:hover { border-color: #{$color}; background: color-mix(in srgb, #{$color} 4%, var(--bg-surface)); }
1345 }
1346 .ins-dim-card--0 { @include dim-card-color(var(--color-accent)); }
1347 .ins-dim-card--1 { @include dim-card-color(var(--color-success)); }
1348 .ins-dim-card--2 { @include dim-card-color(var(--color-warning)); }
1349 .ins-dim-card--3 { @include dim-card-color(#a371f7); }
1350 .ins-dim-card--4 { @include dim-card-color(var(--color-info)); }
1351 .ins-dim-card--5 { @include dim-card-color(#f78166); }
1352
1353 .ins-dim-card__icon {
1354 width: 40px; height: 40px; min-width: 40px; border-radius: var(--radius-sm);
1355 display: flex; align-items: center; justify-content: center;
1356 }
1357 .ins-dim-card__body { flex: 1; min-width: 0; }
1358 .ins-dim-card__name { display: block; font-size: 14px; font-weight: 600; color: var(--text-primary); margin-bottom: 4px; }
1359 .ins-dim-card__desc { font-size: 12px; color: var(--text-muted); margin: 0; line-height: 1.4; }
1360 .ins-dim-card__arrow {
1361 font-size: 16px; color: var(--text-muted); opacity: 0.4; flex-shrink: 0;
1362 transition: transform 0.15s, opacity 0.15s;
1363 }
1364
1365 // ── Dimension detail view ─────────────────────────────────────────────────────
1366 .ins-detail-nav {
1367 display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap;
1368 margin-bottom: var(--space-3);
1369 }
1370 .ins-detail-back {
1371 display: flex; align-items: center; gap: 5px; font-size: 12px;
1372 color: var(--color-accent); text-decoration: none;
1373 &:hover { text-decoration: underline; }
1374 }
1375 .ins-dim-pills { display: flex; gap: 6px; flex-wrap: wrap; }
1376 .ins-dim-pill {
1377 font-size: 11px; padding: 3px 10px; border-radius: 12px; text-decoration: none;
1378 background: var(--bg-overlay); color: var(--text-muted);
1379 border: 1px solid var(--border-subtle);
1380 transition: all 0.1s;
1381 &:hover { background: var(--bg-surface); color: var(--text-primary); }
1382 &--active {
1383 background: color-mix(in srgb, var(--color-accent) 15%, transparent);
1384 color: var(--color-accent);
1385 border-color: color-mix(in srgb, var(--color-accent) 30%, transparent);
1386 }
1387 }
1388 .ins-detail-header {
1389 margin-bottom: var(--space-3);
1390 }
1391 .ins-detail-title { font-size: 18px; font-weight: 700; color: var(--text-primary); margin: 0 0 4px; }
1392 .ins-detail-desc { font-size: 13px; color: var(--text-muted); margin: 0; }
1393 .ins-detail-content {}
1394 .ins-detail-note { font-size: 11px; color: var(--text-muted); padding: var(--space-3) var(--space-4); border-top: 1px solid var(--border-subtle); margin: 0; }
1395
1396 // File list (for complexity)
1397 .ins-file-list { padding: 0 var(--space-4) var(--space-3); }
1398 .ins-file-row {
1399 display: flex; align-items: center; gap: 8px; padding: 5px 0;
1400 border-bottom: 1px solid var(--border-subtle); font-size: 11px; &:last-child { border-bottom: none; }
1401 }
1402 .ins-file-lang-dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; }
1403 .ins-file-path { flex: 1; font-family: var(--font-mono); color: var(--text-secondary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1404 .ins-file-size { width: 60px; text-align: right; color: var(--text-muted); font-family: var(--font-mono); }
1405
1406 // Donut chart
1407 .ins-big-metric {
1408 display: flex; align-items: center; gap: var(--space-6); padding: var(--space-4);
1409 @media (max-width: 480px) { flex-direction: column; }
1410 }
1411 .ins-donut-wrap { width: 120px; flex-shrink: 0; }
1412 .ins-donut { width: 120px; height: 120px; }
1413 .ins-donut-fill { transition: stroke-dasharray 1s cubic-bezier(0.25,0.46,0.45,0.94); }
1414 .ins-big-metric-details { display: flex; flex-direction: column; gap: var(--space-2); }
1415
1416 // Mini stats (inside dimension detail)
1417 .ins-stat-mini-grid {
1418 display: grid; grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); gap: var(--space-3);
1419 padding: var(--space-4);
1420 }
1421 .ins-stat-mini {
1422 display: flex; flex-direction: column; gap: 3px;
1423 }
1424 .ins-stat-mini-val { font-size: 20px; font-weight: 700; font-family: var(--font-mono); color: var(--text-primary); }
1425 .ins-stat-mini-label { font-size: 11px; color: var(--text-muted); }
1426
1427 // Commit list (generic dimension)
1428 .ins-commit-list { padding: 0 var(--space-4) var(--space-3); }
1429 .ins-commit-row {
1430 display: flex; align-items: flex-start; gap: 10px; padding: 8px 0;
1431 border-bottom: 1px solid var(--border-subtle); &:last-child { border-bottom: none; }
1432 }
1433 .ins-commit-avatar {
1434 width: 24px; height: 24px; border-radius: 50%; background: var(--color-accent);
1435 color: var(--bg-base); font-size: 10px; font-weight: 700; flex-shrink: 0;
1436 display: flex; align-items: center; justify-content: center;
1437 }
1438 .ins-commit-body { flex: 1; min-width: 0; }
1439 .ins-commit-msg { display: block; font-size: 12px; color: var(--text-primary); margin-bottom: 2px; }
1440 .ins-commit-meta { font-size: 11px; color: var(--text-muted); font-family: var(--font-mono); }
1441
1442 // Empty states
1443 .ins-empty-domain {
1444 text-align: center; padding: var(--space-8) var(--space-4);
1445 color: var(--text-muted);
1446 }
1447 .ins-empty-icon { font-size: 48px; margin-bottom: var(--space-3); opacity: 0.4; }
1448 .ins-empty-domain h3 { font-size: 18px; color: var(--text-primary); margin: 0 0 8px; }
1449 .ins-empty-domain p { font-size: 14px; max-width: 400px; margin: 0 auto var(--space-4); line-height: 1.6; }
1450
1451
1452 // ============================================================================
1453 // Repo Home — supercharged multi-dimensional layout (rh-* namespace)
1454 // ============================================================================
1455
1456 .rh-layout {
1457 display: grid;
1458 grid-template-columns: 1fr 220px;
1459 gap: 0;
1460 align-items: start;
1461 }
1462
1463 .rh-main {
1464 border-right: 1px solid var(--border-subtle);
1465 padding-right: var(--space-4);
1466 min-width: 0;
1467 }
1468
1469 // ── Hero ─────────────────────────────────────────────────────────────────────
1470 .rh-hero {
1471 background: transparent;
1472 border-bottom: 1px solid var(--border-subtle);
1473 padding: var(--space-4) 0 var(--space-3);
1474 margin-bottom: var(--space-3);
1475 }
1476 .rh-hero-top {
1477 display: flex;
1478 align-items: flex-start;
1479 gap: var(--space-4);
1480 flex-wrap: wrap;
1481 }
1482 .rh-hero-identity { flex: 1; min-width: 0; }
1483 .rh-hero-title {
1484 font-size: 20px;
1485 font-weight: var(--font-weight-semibold);
1486 line-height: 1.25;
1487 margin: 0 0 6px;
1488 display: flex;
1489 align-items: center;
1490 gap: 4px;
1491 flex-wrap: wrap;
1492 }
1493 .rh-hero-owner { font-weight: var(--font-weight-regular); color: var(--text-muted); }
1494 .rh-hero-owner:hover { color: var(--color-accent-link); text-decoration: none; }
1495 .rh-hero-sep { color: var(--text-muted); }
1496 .rh-hero-slug { color: var(--text-primary); font-weight: var(--font-weight-semibold); }
1497 .rh-hero-slug:hover { color: var(--color-accent-link); text-decoration: none; }
1498 .rh-vis-badge { font-size: 10px; vertical-align: middle; margin-left: 4px; }
1499 .rh-hero-desc {
1500 font-size: 14px; color: var(--text-muted); line-height: 1.65;
1501 margin: 0 0 var(--space-3); max-width: 640px;
1502 }
1503 .rh-hero-pills { display: flex; gap: 6px; flex-wrap: wrap; }
1504 .rh-pill {
1505 display: inline-flex; align-items: center; gap: 4px;
1506 font-size: 11px; padding: 2px 8px; border-radius: 999px;
1507 border: 1px solid var(--border-subtle); color: var(--text-muted);
1508 background: var(--bg-sunken); text-decoration: none;
1509 transition: border-color 0.15s, color 0.15s;
1510 &:hover { color: var(--text-primary); border-color: var(--color-accent); }
1511 }
1512 .rh-pill-domain { color: var(--color-accent); border-color: color-mix(in srgb, var(--color-accent) 40%, transparent); }
1513 .rh-pill-license { cursor: default; }
1514 .rh-pill-branch { cursor: default; }
1515 .rh-hero-actions { display: flex; gap: var(--space-2); align-items: center; flex-shrink: 0; }
1516
1517 // Stats strip uses shared .ph-stats-strip / .ph-stat — no rh overrides needed
1518
1519 // ── Activity pulse bar ────────────────────────────────────────────────────────
1520 .rh-pulse-card {
1521 background: transparent;
1522 border-bottom: 1px solid var(--border-subtle);
1523 padding: var(--space-2) 0;
1524 margin-bottom: var(--space-2);
1525 display: flex;
1526 flex-direction: column;
1527 gap: var(--space-2);
1528 }
1529 .rh-pulse-row {
1530 display: flex;
1531 align-items: center;
1532 gap: var(--space-3);
1533 min-height: 28px;
1534 }
1535 .rh-pulse-label {
1536 font-size: 10px;
1537 color: var(--text-muted);
1538 text-transform: uppercase;
1539 letter-spacing: 0.06em;
1540 white-space: nowrap;
1541 width: 88px;
1542 flex-shrink: 0;
1543 }
1544 .rh-pulse-content {
1545 display: flex;
1546 align-items: center;
1547 gap: var(--space-2);
1548 flex: 1;
1549 min-width: 0;
1550 }
1551 .rh-pulse-langs {
1552 flex-direction: column;
1553 align-items: stretch;
1554 gap: 4px;
1555 }
1556 .rh-pulse-sub { font-size: 10px; color: var(--text-muted); white-space: nowrap; }
1557
1558 // Sparkline SVG
1559 .rh-sparkline { display: block; overflow: visible; height: 28px; width: 140px; flex-shrink: 0; }
1560 .rh-spark-bar { fill: color-mix(in srgb, var(--color-accent) 35%, transparent); transition: fill 0.15s; }
1561 .rh-spark-bar:hover, .rh-spark-peak { fill: var(--color-accent); }
1562
1563 // Language breakdown bar
1564 .rh-lang-bar { display: flex; height: 4px; border-radius: 999px; overflow: hidden; width: 100%; background: var(--bg-sunken); }
1565 .rh-lang-seg { height: 100%; transition: width 0.3s; }
1566 .rh-lang-legend { display: flex; gap: 10px; flex-wrap: wrap; margin-top: 5px; }
1567 .rh-lang-item { display: flex; align-items: center; gap: 4px; font-size: 11px; color: var(--text-muted); }
1568 .rh-lang-dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; }
1569 .rh-lang-ext { color: var(--text-secondary); }
1570 .rh-lang-pct { color: var(--text-muted); }
1571
1572 // Language colours — common extensions
1573 $lang-colors: (
1574 'py': #3776ab, 'js': #f7df1e, 'ts': #3178c6, 'tsx': #61dafb, 'jsx': #61dafb,
1575 'go': #00add8, 'rs': #dea584, 'java': #ed8b00, 'rb': #cc342d,
1576 'md': #083fa1, 'toml': #9c4221, 'json': #8bc34a, 'yaml': #cb171e, 'yml': #cb171e,
1577 'html': #e44d26, 'css': #2965f1, 'scss': #cd6799,
1578 'sh': #4eaa25, 'dockerfile': #2496ed, 'sql': #e38c00,
1579 'mid': var(--color-accent), 'midi': var(--color-accent),
1580 'mp3': #1db954, 'wav': #1db954,
1581 );
1582 @each $ext, $color in $lang-colors {
1583 .rh-lang-seg.rh-lang-#{$ext} { background: #{$color}; }
1584 .rh-lang-dot.rh-lang-#{$ext} { background: #{$color}; }
1585 }
1586
1587 // ── Branch bar ───────────────────────────────────────────────────────────────
1588 .rh-branch-bar {
1589 display: flex; align-items: center; gap: var(--space-3);
1590 padding: var(--space-2) 0;
1591 border-bottom: 1px solid var(--border-subtle);
1592 }
1593 .rh-branch-form {
1594 display: inline-flex; align-items: center; gap: 5px;
1595 }
1596 .rh-branch-form-icon { color: var(--color-success); flex-shrink: 0; }
1597 .rh-ref-select { font-size: 12px; padding: 3px 8px; }
1598 .rh-branch-meta { display: flex; gap: var(--space-3); margin-left: auto; }
1599 .rh-branch-stat {
1600 display: inline-flex; align-items: center; gap: 4px;
1601 font-size: 11px; color: var(--text-muted); text-decoration: none;
1602 &:hover { color: var(--text-primary); }
1603 }
1604
1605 // ── File tree ────────────────────────────────────────────────────────────────
1606 .rh-file-tree-card {
1607 margin-bottom: var(--space-3);
1608 border-bottom: 1px solid var(--border-subtle);
1609 }
1610
1611 // ── Commits section — flat, divider-based ─────────────────────────────────────
1612 .rh-commits-section {
1613 margin-bottom: var(--space-3);
1614 }
1615 .rh-commits-header {
1616 display: flex; align-items: center; justify-content: space-between;
1617 padding: var(--space-2) 0;
1618 border-bottom: 1px solid var(--border-subtle);
1619 }
1620 .rh-commits-viewall { font-size: 11px; color: var(--color-accent); text-decoration: none; &:hover { text-decoration: underline; } }
1621
1622 .rh-commit-row {
1623 display: flex; align-items: flex-start; gap: var(--space-3);
1624 padding: var(--space-2) 0;
1625 border-bottom: 1px solid var(--border-subtle);
1626 transition: background 0.1s;
1627 &:last-child { border-bottom: none; }
1628 &.rh-commit-breaking { border-left: 2px solid var(--color-danger); padding-left: var(--space-2); }
1629 }
1630
1631 // Author avatar
1632 .rh-avatar {
1633 width: 26px; height: 26px; border-radius: 50%; flex-shrink: 0;
1634 font-size: 11px; font-weight: 700; display: flex; align-items: center; justify-content: center;
1635 color: var(--bg-base);
1636 }
1637 .rh-avatar-0 { background: #6366f1; }
1638 .rh-avatar-1 { background: #0ea5e9; }
1639 .rh-avatar-2 { background: #10b981; }
1640 .rh-avatar-3 { background: #f59e0b; }
1641 .rh-avatar-4 { background: #ef4444; }
1642 .rh-avatar-5 { background: #a855f7; }
1643 .rh-avatar-bot { background: var(--bg-sunken); color: var(--text-muted); border: 1px solid var(--border-subtle); }
1644
1645 .rh-commit-body { flex: 1; min-width: 0; }
1646 .rh-commit-top { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-bottom: 3px; }
1647 .rh-commit-msg {
1648 font-size: 13px; color: var(--text-primary); text-decoration: none;
1649 white-space: nowrap; overflow: hidden; text-overflow: ellipsis; flex: 1; min-width: 0;
1650 &:hover { color: var(--color-accent-link); }
1651 }
1652 .rh-commit-meta { display: flex; gap: var(--space-2); font-size: 11px; color: var(--text-muted); }
1653 .rh-commit-author { color: var(--text-secondary); }
1654 .rh-commit-sha {
1655 font-family: var(--font-mono); font-size: 11px; color: var(--text-muted);
1656 background: var(--bg-sunken); border: 1px solid var(--border-subtle);
1657 border-radius: var(--radius-sm); padding: 1px 6px; text-decoration: none; flex-shrink: 0; white-space: nowrap;
1658 &:hover { color: var(--color-accent-link); border-color: var(--color-accent); }
1659 }
1660 .rh-commit-badges { display: flex; gap: 4px; flex-shrink: 0; }
1661
1662 // Commit type + semver badges
1663 .rh-commit-type {
1664 display: inline-flex; align-items: center; gap: 3px;
1665 font-size: 10px; font-weight: 600; padding: 1px 6px; border-radius: 4px;
1666 font-family: var(--font-mono); text-transform: lowercase; white-space: nowrap;
1667 letter-spacing: 0.02em;
1668 }
1669 .rh-ct-feat { background: color-mix(in srgb, #22c55e 15%, transparent); color: #22c55e; }
1670 .rh-ct-fix { background: color-mix(in srgb, #ef4444 15%, transparent); color: #ef4444; }
1671 .rh-ct-docs { background: color-mix(in srgb, #60a5fa 15%, transparent); color: #60a5fa; }
1672 .rh-ct-test { background: color-mix(in srgb, #a78bfa 15%, transparent); color: #a78bfa; }
1673 .rh-ct-refactor { background: color-mix(in srgb, #f59e0b 15%, transparent); color: #f59e0b; }
1674 .rh-ct-perf { background: color-mix(in srgb, #06b6d4 15%, transparent); color: #06b6d4; }
1675 .rh-ct-chore { background: color-mix(in srgb, #6b7280 20%, transparent); color: #9ca3af; }
1676 .rh-ct-agent { background: color-mix(in srgb, #818cf8 15%, transparent); color: #818cf8; }
1677
1678 .rh-semver-badge {
1679 display: inline-flex; align-items: center;
1680 font-size: 9px; font-weight: 700; padding: 1px 5px; border-radius: 4px;
1681 text-transform: uppercase; letter-spacing: 0.06em; white-space: nowrap;
1682 }
1683 .rh-sv-patch { background: color-mix(in srgb, #10b981 12%, transparent); color: #10b981; border: 1px solid color-mix(in srgb, #10b981 30%, transparent); }
1684 .rh-sv-minor { background: color-mix(in srgb, #3b82f6 12%, transparent); color: #3b82f6; border: 1px solid color-mix(in srgb, #3b82f6 30%, transparent); }
1685 .rh-sv-major { background: color-mix(in srgb, #f59e0b 12%, transparent); color: #f59e0b; border: 1px solid color-mix(in srgb, #f59e0b 30%, transparent); }
1686 .rh-sv-breaking { background: color-mix(in srgb, #ef4444 15%, transparent); color: #ef4444; border: 1px solid color-mix(in srgb, #ef4444 35%, transparent); }
1687
1688 .rh-empty-commits {
1689 padding: var(--space-8) var(--space-4); text-align: center; color: var(--text-muted);
1690 display: flex; flex-direction: column; align-items: center; gap: var(--space-2);
1691 p { font-size: 13px; margin: 0; }
1692 }
1693
1694 // ── Sidebar — divider-based, no card boxes ────────────────────────────────────
1695 .rh-sidebar {
1696 padding-left: var(--space-4);
1697 display: flex; flex-direction: column;
1698 position: sticky; top: var(--header-height);
1699 max-height: calc(100vh - var(--header-height));
1700 overflow-y: auto; scrollbar-width: none;
1701 &::-webkit-scrollbar { display: none; }
1702 }
1703
1704 .rh-sidebar-section {
1705 padding: var(--space-3) 0;
1706 border-bottom: 1px solid var(--border-subtle);
1707 &:last-child { border-bottom: none; }
1708 }
1709
1710 .rh-sidebar-hd {
1711 display: flex; align-items: center; justify-content: space-between;
1712 margin-bottom: var(--space-2);
1713 }
1714
1715 .rh-domain-badge {
1716 display: inline-flex; align-items: center; gap: 3px;
1717 font-size: 10px; color: var(--color-accent);
1718 background: color-mix(in srgb, var(--color-accent) 10%, transparent);
1719 padding: 1px 6px; border-radius: 999px;
1720 }
1721
1722 .rh-props-empty { font-size: 12px; color: var(--text-muted); margin: var(--space-2) 0 0; }
1723
1724 // Dimension stats row — 4 cells in a horizontal strip
1725 .rh-dim-row {
1726 display: grid; grid-template-columns: repeat(4, 1fr);
1727 border: 1px solid var(--border-subtle);
1728 border-radius: var(--radius-base);
1729 overflow: hidden; margin-bottom: var(--space-2);
1730 }
1731 .rh-dim-item {
1732 padding: 6px 4px;
1733 display: flex; flex-direction: column; align-items: center; text-align: center;
1734 gap: 1px; border-right: 1px solid var(--border-subtle);
1735 &:last-child { border-right: none; }
1736 }
1737 .rh-dim-val { font-size: 13px; font-weight: var(--font-weight-semibold); color: var(--text-primary); line-height: 1.1; font-variant-numeric: tabular-nums; }
1738 .rh-dim-lbl { font-size: 9px; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.04em; }
1739
1740 // Clone widget tabs
1741 .rh-clone-body { padding: 0; }
1742
1743 // Clone widget inherits .clone-* component styles — no overrides needed
1744
1745
1746
1747 // ── Responsive ────────────────────────────────────────────────────────────────
1748
1749 @media (max-width: 768px) {
1750 .ins-page {
1751 padding: var(--space-2) 0 var(--space-4);
1752 }
1753
1754 .ins-stat-grid {
1755 grid-template-columns: repeat(2, 1fr);
1756 }
1757
1758 .ins-intel-row {
1759 flex-direction: column;
1760 gap: var(--space-3);
1761 }
1762
1763 .ins-chart-wrap {
1764 overflow-x: auto;
1765 -webkit-overflow-scrolling: touch;
1766 }
1767
1768 .rh-layout {
1769 grid-template-columns: 1fr;
1770 }
1771
1772 .rh-sidebar {
1773 border-left: none;
1774 border-top: 1px solid var(--border-subtle);
1775 padding: var(--space-3) var(--space-4);
1776 }
1777
1778 .in-stats-bar {
1779 flex-wrap: wrap;
1780 gap: var(--space-2);
1781 }
1782
1783 .in-chart-grid {
1784 grid-template-columns: 1fr;
1785 }
1786
1787 .an-stats-bar {
1788 flex-wrap: wrap;
1789 gap: var(--space-2);
1790 }
1791 }
1792
1793 @media (max-width: 480px) {
1794 .ins-stat-grid {
1795 grid-template-columns: 1fr;
1796 }
1797
1798 .ins-stat-card {
1799 padding: var(--space-2) var(--space-3);
1800 }
1801
1802 .ins-stat-value {
1803 font-size: 20px;
1804 }
1805
1806 .rh-hero {
1807 flex-direction: column;
1808 gap: var(--space-2);
1809 }
1810
1811 .in-stat-card {
1812 padding: 8px 12px;
1813 }
1814
1815 .in-stat-value {
1816 font-size: 18px;
1817 }
1818 }
File History 1 commit
sha256:9590cee1e0ccd6c76528f005b95d634d80f5019f0dcb7c371e149adc31d1fb65 refactor: enforce gRPC framing on all MWP wire traffic Sonnet 4.6 minor ⚠ 156 days ago