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