gabriel / musehub public
_intel.scss
766 lines 17.9 KB
Raw
sha256:9590cee1e0ccd6c76528f005b95d634d80f5019f0dcb7c371e149adc31d1fb65 refactor: enforce gRPC framing on all MWP wire traffic Sonnet 4.6 minor ⚠ breaking 156 days ago
1 // ── Intelligence Hub — SINGULARITY aesthetic ─────────────────────────────────
2 //
3 // Dark surfaces, glowing elements, sharp mono typography.
4 // Used by: intel_dashboard, intel_hotspots, intel_dead, intel_blast_risk.
5
6 // ── Layout ────────────────────────────────────────────────────────────────────
7
8 .intel-wrap {
9 max-width: 960px;
10 margin: 0 auto;
11 padding: 1.5rem 1rem 3rem;
12 font-family: var(--font-mono);
13 }
14
15 // ── Header ────────────────────────────────────────────────────────────────────
16
17 .intel-hd {
18 display: flex;
19 align-items: baseline;
20 gap: 0.75rem;
21 margin-bottom: 1.75rem;
22 border-bottom: 1px solid var(--color-border, #30363d);
23 padding-bottom: 1rem;
24 }
25
26 .intel-hd-title {
27 display: flex;
28 align-items: center;
29 gap: 0.5rem;
30 font-size: 1.1rem;
31 font-weight: 700;
32 color: var(--text-primary);
33 letter-spacing: 0.04em;
34 text-transform: uppercase;
35 }
36
37 .intel-hd-repo {
38 font-size: 0.8rem;
39 color: var(--text-muted);
40 }
41
42 // ── Subpage header ────────────────────────────────────────────────────────────
43
44 .intel-subhd {
45 margin-bottom: 1.75rem;
46 border-bottom: 1px solid var(--color-border, #30363d);
47 padding-bottom: 1rem;
48 }
49
50 .intel-back {
51 display: inline-flex;
52 align-items: center;
53 gap: 0.25rem;
54 font-size: 0.75rem;
55 color: var(--color-accent-link);
56 text-decoration: none;
57 margin-bottom: 0.6rem;
58
59 &:hover { text-decoration: underline; }
60 }
61
62 .intel-subhd-title {
63 display: flex;
64 align-items: center;
65 gap: 0.5rem;
66 font-size: 1rem;
67 font-weight: 700;
68 color: var(--text-primary);
69 letter-spacing: 0.04em;
70 text-transform: uppercase;
71 margin-bottom: 0.35rem;
72 }
73
74 .intel-subhd-desc {
75 font-size: 0.78rem;
76 color: var(--text-muted);
77 font-family: var(--font-mono);
78 }
79
80 // ── No-index state ────────────────────────────────────────────────────────────
81
82 .intel-no-index {
83 display: flex;
84 align-items: flex-start;
85 gap: 1rem;
86 padding: 1.5rem;
87 background: var(--bg-surface);
88 border: 1px solid var(--color-border, #30363d);
89 border-radius: 6px;
90 color: var(--text-muted);
91 font-size: 0.85rem;
92
93 svg { flex-shrink: 0; opacity: 0.5; }
94 }
95
96 .intel-no-index-msg { line-height: 1.6; }
97
98 // ── Top row — health + alerts ─────────────────────────────────────────────────
99
100 .intel-top-row {
101 display: grid;
102 grid-template-columns: 160px 1fr;
103 gap: 1.25rem;
104 margin-bottom: 1.5rem;
105
106 @media (max-width: 540px) {
107 grid-template-columns: 1fr;
108 }
109 }
110
111 // ── Health gauge ──────────────────────────────────────────────────────────────
112
113 .intel-health-card {
114 display: flex;
115 flex-direction: column;
116 align-items: center;
117 gap: 0.5rem;
118 padding: 1.25rem 1rem;
119 background: var(--bg-surface);
120 border: 1px solid var(--color-border, #30363d);
121 border-radius: 8px;
122 }
123
124 .intel-health-gauge {
125 width: 100px;
126 height: 100px;
127 position: relative;
128 }
129
130 .intel-health-svg {
131 width: 100%;
132 height: 100%;
133 }
134
135 .intel-health-track {
136 fill: none;
137 stroke: var(--bg-overlay, #21262d);
138 stroke-width: 8;
139 }
140
141 .intel-health-fill {
142 fill: none;
143 stroke-width: 8;
144 stroke-linecap: round;
145 transition: stroke-dasharray 0.4s ease;
146
147 &--excellent { stroke: var(--color-success); filter: drop-shadow(0 0 6px color-mix(in srgb, var(--color-success) 50%, transparent)); }
148 &--good { stroke: var(--color-success); opacity: 0.75; }
149 &--fair { stroke: var(--color-warning); }
150 &--poor { stroke: var(--color-danger); }
151 &--critical { stroke: #ff2244; filter: drop-shadow(0 0 6px rgba(255,34,68,.5)); }
152 }
153
154 .intel-health-num {
155 font-family: var(--font-mono);
156 font-size: 1.45rem;
157 font-weight: 700;
158 fill: var(--text-primary);
159 }
160
161 .intel-health-sub {
162 font-family: var(--font-mono);
163 font-size: 0.48rem;
164 font-weight: 600;
165 fill: var(--text-muted);
166 letter-spacing: 0.1em;
167 text-transform: uppercase;
168 }
169
170 .intel-health-label {
171 font-size: 0.8rem;
172 font-weight: 700;
173 letter-spacing: 0.06em;
174 text-transform: uppercase;
175
176 &--excellent { color: var(--color-success); }
177 &--good { color: var(--color-success); opacity: 0.75; }
178 &--fair { color: var(--color-warning); }
179 &--poor { color: var(--color-danger); }
180 &--critical { color: #ff2244; }
181 }
182
183 .intel-health-meta {
184 font-size: 0.68rem;
185 color: var(--text-muted);
186 text-align: center;
187 }
188
189 // ── Alert strip ───────────────────────────────────────────────────────────────
190
191 .intel-alerts {
192 padding: 1rem 1.25rem;
193 background: var(--bg-surface);
194 border: 1px solid var(--color-border, #30363d);
195 border-radius: 8px;
196 }
197
198 .intel-alerts-title {
199 font-size: 0.68rem;
200 font-weight: 700;
201 letter-spacing: 0.1em;
202 text-transform: uppercase;
203 color: var(--text-muted);
204 margin-bottom: 0.75rem;
205 }
206
207 .intel-alert-list {
208 list-style: none;
209 margin: 0;
210 padding: 0;
211 display: flex;
212 flex-direction: column;
213 gap: 0.5rem;
214 }
215
216 .intel-alert {
217 display: flex;
218 align-items: center;
219 gap: 0.5rem;
220 font-size: 0.8rem;
221 color: var(--text-secondary);
222
223 &--warn .intel-alert-icon { color: var(--color-warning); }
224 &--crit .intel-alert-icon { color: var(--color-danger); }
225 }
226
227 .intel-alert-icon {
228 font-size: 0.85rem;
229 color: var(--color-success);
230 width: 1em;
231 text-align: center;
232 }
233
234 .intel-alert-link {
235 margin-left: auto;
236 font-size: 0.72rem;
237 color: var(--color-accent-link);
238 text-decoration: none;
239
240 &:hover { text-decoration: underline; }
241 }
242
243 // ── Panel cards ───────────────────────────────────────────────────────────────
244
245 .intel-cards {
246 display: grid;
247 grid-template-columns: repeat(3, 1fr);
248 gap: 1.25rem;
249 margin-bottom: 1.5rem;
250
251 @media (max-width: 720px) {
252 grid-template-columns: 1fr;
253 }
254 }
255
256 .intel-card {
257 padding: 1rem;
258 background: var(--bg-surface);
259 border: 1px solid var(--color-border, #30363d);
260 border-radius: 8px;
261 }
262
263 .intel-card-hd {
264 display: flex;
265 align-items: baseline;
266 justify-content: space-between;
267 margin-bottom: 0.75rem;
268 }
269
270 .intel-card-title {
271 font-size: 0.65rem;
272 font-weight: 700;
273 letter-spacing: 0.1em;
274 text-transform: uppercase;
275 color: var(--text-muted);
276 }
277
278 .intel-card-more {
279 font-size: 0.7rem;
280 color: var(--color-accent-link);
281 text-decoration: none;
282
283 &:hover { text-decoration: underline; }
284 }
285
286 .intel-card-empty {
287 font-size: 0.75rem;
288 color: var(--text-disabled, #484f58);
289 }
290
291 // ── Bar chart rows ────────────────────────────────────────────────────────────
292
293 .intel-bar-list {
294 list-style: none;
295 margin: 0;
296 padding: 0;
297 display: flex;
298 flex-direction: column;
299 gap: 0.5rem;
300 }
301
302 .intel-bar-row {
303 display: grid;
304 grid-template-columns: 1fr auto;
305 grid-template-rows: auto auto;
306 gap: 0.1rem 0.5rem;
307 align-items: center;
308 }
309
310 .intel-bar-label {
311 font-size: 0.72rem;
312 color: var(--color-accent-link);
313 text-decoration: none;
314 white-space: nowrap;
315 overflow: hidden;
316 text-overflow: ellipsis;
317 grid-column: 1;
318 grid-row: 1;
319
320 &:hover { text-decoration: underline; }
321 }
322
323 .intel-bar-track {
324 background: var(--bg-overlay, #21262d);
325 border-radius: 2px;
326 height: 4px;
327 overflow: hidden;
328 grid-column: 1;
329 grid-row: 2;
330
331 &--full {
332 height: 6px;
333 margin-top: 0.3rem;
334 }
335 }
336
337 .intel-bar-fill {
338 height: 100%;
339 border-radius: 2px;
340 transition: width 0.3s ease;
341
342 &--hot { background: color-mix(in srgb, var(--color-warning) 80%, var(--color-danger)); }
343 }
344
345 .intel-bar-val {
346 font-size: 0.68rem;
347 color: var(--text-muted);
348 grid-column: 2;
349 grid-row: 1 / span 2;
350 white-space: nowrap;
351 }
352
353 // ── Dead code card ────────────────────────────────────────────────────────────
354
355 .intel-dead-summary {
356 font-size: 0.75rem;
357 color: var(--text-secondary);
358 margin-bottom: 0.6rem;
359 }
360
361 .intel-dead-count,
362 .intel-dead-oldest {
363 font-weight: 700;
364 color: var(--color-warning);
365 }
366
367 .intel-dead-list {
368 list-style: none;
369 margin: 0;
370 padding: 0;
371 display: flex;
372 flex-direction: column;
373 gap: 0.4rem;
374 }
375
376 .intel-dead-row {
377 display: flex;
378 align-items: baseline;
379 justify-content: space-between;
380 gap: 0.5rem;
381 }
382
383 .intel-dead-addr {
384 font-size: 0.72rem;
385 color: var(--color-accent-link);
386 text-decoration: none;
387 white-space: nowrap;
388 overflow: hidden;
389 text-overflow: ellipsis;
390
391 &:hover { text-decoration: underline; }
392 }
393
394 .intel-dead-age {
395 font-size: 0.68rem;
396 color: var(--text-muted);
397 white-space: nowrap;
398 flex-shrink: 0;
399 }
400
401 // ── Blast risk card ───────────────────────────────────────────────────────────
402
403 .intel-blast-list {
404 list-style: none;
405 margin: 0;
406 padding: 0;
407 display: flex;
408 flex-direction: column;
409 gap: 0.5rem;
410 }
411
412 .intel-blast-row {
413 display: flex;
414 align-items: baseline;
415 gap: 0.5rem;
416 }
417
418 .intel-blast-addr {
419 font-size: 0.72rem;
420 color: var(--color-accent-link);
421 text-decoration: none;
422 flex: 1;
423 white-space: nowrap;
424 overflow: hidden;
425 text-overflow: ellipsis;
426
427 &:hover { text-decoration: underline; }
428 }
429
430 .intel-blast-radius {
431 font-size: 0.68rem;
432 color: var(--color-danger);
433 white-space: nowrap;
434 flex-shrink: 0;
435 }
436
437 // ── Velocity sparkline ────────────────────────────────────────────────────────
438
439 .intel-velocity-wrap {
440 padding: 1rem 1.25rem;
441 background: var(--bg-surface);
442 border: 1px solid var(--color-border, #30363d);
443 border-radius: 8px;
444 }
445
446 .intel-velocity-title {
447 font-size: 0.65rem;
448 font-weight: 700;
449 letter-spacing: 0.1em;
450 text-transform: uppercase;
451 color: var(--text-muted);
452 margin-bottom: 0.5rem;
453 }
454
455 .intel-velocity-sub {
456 font-weight: 400;
457 opacity: 0.6;
458 }
459
460 .intel-velocity-bars {
461 display: flex;
462 align-items: flex-end;
463 gap: 3px;
464 height: 56px;
465 }
466
467 .intel-velocity-bar {
468 flex: 1;
469 background: var(--color-accent-muted, #2a5fd4);
470 border-radius: 2px 2px 0 0;
471 min-height: 2px;
472 transition: background 0.2s;
473
474 &:hover { background: var(--color-accent); }
475 }
476
477 // ── Full-list (subpage) shared ────────────────────────────────────────────────
478
479 .intel-full-list {
480 display: flex;
481 flex-direction: column;
482 gap: 0;
483 border: 1px solid var(--color-border, #30363d);
484 border-radius: 8px;
485 overflow: hidden;
486 background: var(--bg-surface);
487 }
488
489 .intel-empty-state {
490 display: flex;
491 flex-direction: column;
492 align-items: center;
493 gap: 1rem;
494 padding: 3rem 1.5rem;
495 color: var(--text-muted);
496 font-size: 0.85rem;
497 text-align: center;
498
499 svg { opacity: 0.35; }
500 }
501
502 // ── Hotspot full rows ─────────────────────────────────────────────────────────
503
504 .intel-hs-row {
505 padding: 0.75rem 1rem;
506 border-bottom: 1px solid var(--color-border, #30363d);
507
508 &:last-child { border-bottom: none; }
509 }
510
511 .intel-hs-meta {
512 display: flex;
513 align-items: baseline;
514 gap: 0.75rem;
515 margin-bottom: 0.35rem;
516 }
517
518 .intel-hs-addr {
519 font-size: 0.8rem;
520 color: var(--color-accent-link);
521 text-decoration: none;
522 font-family: var(--font-mono);
523
524 &:hover { text-decoration: underline; }
525 }
526
527 .intel-hs-ts {
528 font-size: 0.7rem;
529 color: var(--text-muted);
530 }
531
532 .intel-hs-bar-wrap {
533 display: flex;
534 align-items: center;
535 gap: 0.5rem;
536 }
537
538 // ── Dead full rows ────────────────────────────────────────────────────────────
539
540 .intel-dead-full-row {
541 padding: 0.75rem 1rem;
542 border-bottom: 1px solid var(--color-border, #30363d);
543
544 &:last-child { border-bottom: none; }
545 }
546
547 .intel-dead-full-addr {
548 font-size: 0.8rem;
549 font-family: var(--font-mono);
550 margin-bottom: 0.3rem;
551
552 a {
553 color: var(--color-accent-link);
554 text-decoration: none;
555 &:hover { text-decoration: underline; }
556 }
557 }
558
559 .intel-dead-full-meta {
560 display: flex;
561 align-items: center;
562 gap: 0.75rem;
563 flex-wrap: wrap;
564 font-size: 0.7rem;
565 color: var(--text-muted);
566 }
567
568 .intel-dead-age-badge {
569 background: color-mix(in srgb, var(--color-warning-bg, #9e6a03) 40%, transparent);
570 color: var(--color-warning);
571 border: 1px solid color-mix(in srgb, var(--color-warning) 30%, transparent);
572 border-radius: 4px;
573 padding: 1px 6px;
574 font-size: 0.68rem;
575 font-weight: 600;
576 }
577
578 .intel-dead-blast {
579 strong { color: var(--text-secondary); }
580 }
581
582 .intel-dead-added { color: var(--text-disabled, #484f58); }
583
584 // ── Blast risk full rows ──────────────────────────────────────────────────────
585
586 .intel-blast-full-row {
587 padding: 0.85rem 1rem;
588 border-bottom: 1px solid var(--color-border, #30363d);
589
590 &:last-child { border-bottom: none; }
591 }
592
593 .intel-blast-full-hd {
594 display: flex;
595 align-items: baseline;
596 gap: 0.5rem;
597 margin-bottom: 0.35rem;
598 }
599
600 .intel-blast-icon {
601 color: var(--color-danger);
602 font-size: 0.85rem;
603 flex-shrink: 0;
604 }
605
606 .intel-blast-full-addr {
607 font-size: 0.8rem;
608 color: var(--color-accent-link);
609 text-decoration: none;
610 font-family: var(--font-mono);
611 flex: 1;
612
613 &:hover { text-decoration: underline; }
614 }
615
616 .intel-blast-full-radius {
617 font-size: 0.72rem;
618 color: var(--color-danger);
619 white-space: nowrap;
620 flex-shrink: 0;
621 }
622
623 .intel-blast-co-list {
624 font-size: 0.7rem;
625 color: var(--text-muted);
626 display: flex;
627 flex-wrap: wrap;
628 gap: 0.25rem;
629 align-items: baseline;
630 }
631
632 .intel-blast-co-label {
633 color: var(--text-disabled, #484f58);
634 margin-right: 0.25rem;
635 }
636
637 .intel-blast-co-sym {
638 color: var(--text-muted);
639 text-decoration: none;
640 font-family: var(--font-mono);
641
642 &:hover { color: var(--color-accent-link); text-decoration: underline; }
643 }
644
645 // ── Repo home health progress bar ────────────────────────────────────────────
646 .rh-health-bar-wrap {
647 display: block;
648 text-decoration: none;
649 padding: 10px 0 6px;
650 border-radius: 6px;
651 transition: opacity 0.15s;
652 &:hover { opacity: 0.85; }
653 }
654 .rh-health-bar-hd {
655 display: flex;
656 align-items: baseline;
657 justify-content: space-between;
658 margin-bottom: 6px;
659 }
660 .rh-health-bar-lbl {
661 font-size: 10px;
662 font-weight: 700;
663 letter-spacing: 0.08em;
664 text-transform: uppercase;
665 color: var(--text-muted);
666 }
667 .rh-health-bar-score {
668 font-size: 11px;
669 font-weight: 600;
670 font-family: var(--font-mono);
671 }
672 .rh-health-bar--good .rh-health-bar-score { color: var(--color-success); }
673 .rh-health-bar--fair .rh-health-bar-score { color: var(--color-warning); }
674 .rh-health-bar--poor .rh-health-bar-score { color: var(--color-danger); }
675 .rh-health-bar-track {
676 width: 100%;
677 height: 5px;
678 background: var(--bg-inset);
679 border-radius: 3px;
680 overflow: hidden;
681 }
682 .rh-health-bar-fill {
683 height: 100%;
684 border-radius: 3px;
685 transition: width 0.4s ease;
686 }
687 .rh-health-bar--good .rh-health-bar-fill { background: var(--color-success); }
688 .rh-health-bar--fair .rh-health-bar-fill { background: var(--color-warning); }
689 .rh-health-bar--poor .rh-health-bar-fill { background: var(--color-danger); }
690
691 // ── Repo home health mini-gauge ───────────────────────────────────────────────
692
693 .rh-health-mini {
694 display: flex;
695 align-items: center;
696 gap: 0.6rem;
697 margin-top: 0.75rem;
698 padding: 0.6rem 0.75rem;
699 background: var(--bg-overlay, #21262d);
700 border: 1px solid var(--color-border, #30363d);
701 border-radius: 6px;
702 text-decoration: none;
703 transition: border-color 0.15s, background 0.15s;
704
705 &:hover {
706 border-color: var(--color-accent);
707 background: var(--bg-hover, #30363d);
708 }
709 }
710
711 .rh-health-svg {
712 width: 40px;
713 height: 40px;
714 flex-shrink: 0;
715 }
716
717 .rh-health-track {
718 fill: none;
719 stroke: var(--bg-surface, #161b22);
720 stroke-width: 6;
721 }
722
723 .rh-health-fill {
724 fill: none;
725 stroke-width: 6;
726 stroke-linecap: round;
727
728 &--excellent { stroke: var(--color-success); filter: drop-shadow(0 0 4px color-mix(in srgb, var(--color-success) 50%, transparent)); }
729 &--good { stroke: var(--color-success); opacity: 0.75; }
730 &--fair { stroke: var(--color-warning); }
731 &--poor { stroke: var(--color-danger); }
732 &--critical { stroke: #ff2244; filter: drop-shadow(0 0 4px rgba(255,34,68,.5)); }
733 }
734
735 .rh-health-num {
736 font-family: var(--font-mono);
737 font-size: 0.9rem;
738 font-weight: 700;
739 fill: var(--text-primary);
740 }
741
742 .rh-health-meta {
743 display: flex;
744 flex-direction: column;
745 gap: 1px;
746 }
747
748 .rh-health-score-lbl {
749 font-family: var(--font-mono);
750 font-size: 0.72rem;
751 font-weight: 700;
752 letter-spacing: 0.04em;
753
754 &--excellent { color: var(--color-success); }
755 &--good { color: var(--color-success); opacity: 0.75; }
756 &--fair { color: var(--color-warning); }
757 &--poor { color: var(--color-danger); }
758 &--critical { color: #ff2244; }
759 }
760
761 .rh-health-sub-lbl {
762 font-size: 0.65rem;
763 color: var(--text-muted);
764 text-transform: uppercase;
765 letter-spacing: 0.06em;
766 }
File History 1 commit
sha256:9590cee1e0ccd6c76528f005b95d634d80f5019f0dcb7c371e149adc31d1fb65 refactor: enforce gRPC framing on all MWP wire traffic Sonnet 4.6 minor ⚠ 156 days ago