|
113 | 113 | _RESET = """\ |
114 | 114 | *,*::before,*::after{box-sizing:border-box;margin:0;padding:0} |
115 | 115 | html{-webkit-text-size-adjust:100%;text-size-adjust:100%;-webkit-font-smoothing:antialiased; |
116 | | - -moz-osx-font-smoothing:grayscale;scroll-behavior:smooth} |
| 116 | + -moz-osx-font-smoothing:grayscale;scroll-behavior:smooth;scrollbar-gutter:stable} |
117 | 117 | body{font-family:var(--font-sans);font-size:14px;line-height:1.6;color:var(--text-primary); |
118 | 118 | background:var(--bg-body);overflow-x:hidden} |
119 | 119 | code,pre,kbd{font-family:var(--font-mono);font-size:13px} |
|
363 | 363 | /* Group body */ |
364 | 364 | .group-body{border-top:1px solid var(--border);display:none} |
365 | 365 | .group-body.expanded{display:block} |
| 366 | +.group-body.items.expanded{display:grid} |
366 | 367 | .group-compare-note{padding:var(--sp-2) var(--sp-4);font-size:.8rem;color:var(--text-muted); |
367 | 368 | background:var(--bg-raised);border-bottom:1px solid var(--border);font-style:italic} |
368 | 369 |
|
|
382 | 383 | # --------------------------------------------------------------------------- |
383 | 384 |
|
384 | 385 | _ITEMS = """\ |
385 | | -.item{border-bottom:1px solid var(--border);padding:0} |
386 | | -.item:last-child{border-bottom:none} |
| 386 | +.items{grid-template-columns:repeat(2,1fr);gap:0} |
| 387 | +.items .item{border-right:1px solid var(--border);border-bottom:1px solid var(--border)} |
| 388 | +.items .item:nth-child(2n){border-right:none} |
| 389 | +.items .item:nth-last-child(-n+2){border-bottom:none} |
| 390 | +.items .item:last-child{border-bottom:none} |
| 391 | +.item{padding:0;min-width:0;overflow:hidden} |
387 | 392 | .item-header{display:flex;align-items:center;justify-content:space-between; |
388 | | - padding:var(--sp-2) var(--sp-4);background:var(--bg-raised);gap:var(--sp-3)} |
389 | | -.item-title{font-weight:500;font-size:.85rem;color:var(--text-primary);font-family:var(--font-mono); |
| 393 | + padding:var(--sp-2) var(--sp-3);background:var(--bg-raised);gap:var(--sp-2)} |
| 394 | +.item-title{font-weight:500;font-size:.8rem;color:var(--text-primary);font-family:var(--font-mono); |
390 | 395 | white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;flex:1} |
391 | | -.item-loc{font-size:.8rem;color:var(--text-muted);font-family:var(--font-mono);white-space:nowrap;flex-shrink:0} |
392 | | -.item-compare-meta{padding:var(--sp-1) var(--sp-4);font-size:.75rem;color:var(--text-muted); |
| 396 | +.item-loc{font-size:.72rem;color:var(--text-muted);font-family:var(--font-mono);white-space:nowrap;flex-shrink:0} |
| 397 | +.item-compare-meta{padding:var(--sp-1) var(--sp-3);font-size:.72rem;color:var(--text-muted); |
393 | 398 | background:var(--bg-body);border-bottom:1px solid var(--border)} |
394 | 399 | """ |
395 | 400 |
|
|
398 | 403 | # --------------------------------------------------------------------------- |
399 | 404 |
|
400 | 405 | _CODE = """\ |
401 | | -.code-block{overflow-x:auto;font-size:12px;line-height:1.7;background:var(--bg-body); |
402 | | - padding:var(--sp-2) 0;margin:0} |
403 | | -.code-block pre{margin:0;padding:0} |
404 | | -.code-block .linenos{user-select:none;text-align:right;padding-right:var(--sp-3); |
405 | | - color:var(--text-muted);opacity:.5;min-width:3.5em;display:inline-block;font-size:11px} |
406 | | -.code-block .code-line{padding:0 var(--sp-4) 0 var(--sp-2);white-space:pre;display:block} |
407 | | -.code-block .code-line:hover{background:var(--bg-raised)} |
408 | | -.code-block .code-line.hl{background:var(--accent-muted)} |
409 | | -.code-block .code-line.hl:hover{background:color-mix(in oklch,var(--accent-primary) 20%,transparent)} |
410 | 406 | /* _html_snippets renders .codebox>.hitline/.line */ |
411 | 407 | .codebox{overflow-x:auto;font-size:12px;line-height:1.7;background:var(--bg-body);padding:var(--sp-2) 0;margin:0} |
412 | 408 | .codebox pre{margin:0;padding:0} |
|
462 | 458 | .overview-health-card{display:flex;align-items:center;justify-content:center; |
463 | 459 | min-height:0;padding:var(--sp-3) var(--sp-2)} |
464 | 460 | .overview-health-inner{display:flex;align-items:center;justify-content:center;width:100%;height:100%} |
465 | | -.health-ring{position:relative;width:110px;height:110px} |
| 461 | +.health-ring{position:relative;width:130px;height:130px} |
466 | 462 | .health-ring svg{width:100%;height:100%;transform:rotate(-90deg)} |
467 | 463 | .health-ring-bg{fill:none;stroke:var(--border);stroke-width:6} |
468 | 464 | .health-ring-fg{fill:none;stroke-width:6;stroke-linecap:round; |
|
479 | 475 | /* KPI stat card */ |
480 | 476 | .meta-item{padding:var(--sp-3) var(--sp-4);background:var(--bg-surface);border:1px solid var(--border); |
481 | 477 | border-radius:var(--radius-lg);display:flex;flex-direction:column;gap:var(--sp-1); |
482 | | - transition:border-color var(--dur-fast) var(--ease)} |
| 478 | + transition:border-color var(--dur-fast) var(--ease);min-width:0} |
483 | 479 | .meta-item:hover{border-color:var(--border-strong)} |
484 | 480 | .meta-item .meta-label{font-size:.75rem;font-weight:500;color:var(--text-muted); |
485 | 481 | display:flex;align-items:center;gap:var(--sp-1)} |
486 | 482 | .meta-item .meta-value{font-size:1.25rem;font-weight:700;color:var(--text-primary); |
487 | | - font-variant-numeric:tabular-nums} |
488 | | -.kpi-detail{font-size:.75rem;color:var(--text-muted);margin-top:var(--sp-1)} |
489 | | -.kpi-delta{font-size:.72rem;font-weight:600;margin-top:var(--sp-1)} |
| 483 | + font-variant-numeric:tabular-nums;line-height:1.2} |
| 484 | +.meta-item .meta-value--good{color:var(--success)} |
| 485 | +.meta-item .meta-value--bad{color:var(--error)} |
| 486 | +.meta-item .meta-value--warn{color:var(--warning)} |
| 487 | +.kpi-detail{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px} |
| 488 | +.kpi-micro{display:inline-flex;align-items:center;gap:3px;font-size:.65rem; |
| 489 | + padding:1px 6px;border-radius:var(--radius-sm);background:var(--bg-raised); |
| 490 | + white-space:nowrap;line-height:1.4} |
| 491 | +.kpi-micro-val{font-weight:500;font-variant-numeric:tabular-nums;color:var(--text-muted)} |
| 492 | +.kpi-micro-lbl{font-weight:400;color:var(--text-muted);text-transform:lowercase} |
| 493 | +.kpi-delta{font-size:.72rem;font-weight:600;margin-top:2px} |
490 | 494 | .kpi-delta--good{color:var(--success)} |
491 | 495 | .kpi-delta--bad{color:var(--error)} |
492 | 496 | .kpi-delta--neutral{color:var(--text-muted)} |
493 | | -.kpi-help{display:inline-flex;align-items:center;justify-content:center;width:14px;height:14px; |
494 | | - font-size:.65rem;font-weight:700;border-radius:50%;background:var(--bg-overlay); |
495 | | - color:var(--text-muted);cursor:help;position:relative} |
496 | | -.kpi-help:hover::after{content:attr(data-tip);position:absolute;bottom:calc(100% + 6px);left:50%; |
| 497 | +.kpi-help{display:inline-flex;align-items:center;justify-content:center;width:15px;height:15px; |
| 498 | + font-size:.6rem;font-weight:600;border-radius:50%;background:none; |
| 499 | + color:var(--text-muted);cursor:help;position:relative;border:1.5px solid var(--border); |
| 500 | + opacity:.5;transition:opacity var(--dur-fast) var(--ease)} |
| 501 | +.kpi-help:hover{opacity:1} |
| 502 | +.kpi-help:hover::after{content:attr(data-tip);position:absolute;top:calc(100% + 6px);left:50%; |
497 | 503 | transform:translateX(-50%);background:var(--bg-overlay);color:var(--text-primary); |
498 | 504 | padding:var(--sp-2) var(--sp-3);border-radius:var(--radius-md);font-size:.75rem;font-weight:400; |
499 | | - white-space:nowrap;box-shadow:var(--shadow-md);z-index:50;pointer-events:none; |
| 505 | + white-space:normal;width:max-content;max-width:240px;line-height:1.4; |
| 506 | + box-shadow:var(--shadow-md);z-index:100;pointer-events:none; |
500 | 507 | border:1px solid var(--border)} |
501 | 508 |
|
502 | 509 | /* Tone variants */ |
|
511 | 518 | .overview-cluster-empty{display:flex;flex-direction:column;align-items:center;gap:var(--sp-2); |
512 | 519 | padding:var(--sp-5);text-align:center;color:var(--text-muted);font-size:.85rem} |
513 | 520 | .empty-icon{color:var(--success);opacity:.35;width:32px;height:32px;flex-shrink:0} |
514 | | -.overview-list{display:flex;flex-direction:column;gap:var(--sp-2)} |
| 521 | +.overview-list{display:grid;grid-template-columns:repeat(2,1fr);gap:var(--sp-2)} |
515 | 522 |
|
516 | 523 | /* Overview rows */ |
517 | | -.overview-row{display:grid;grid-template-columns:1fr auto;gap:var(--sp-4); |
| 524 | +.overview-row{display:flex;flex-direction:column;gap:var(--sp-1); |
518 | 525 | padding:var(--sp-3) var(--sp-4);background:var(--bg-surface);border:1px solid var(--border); |
519 | 526 | border-radius:var(--radius-lg);transition:border-color var(--dur-fast) var(--ease)} |
520 | 527 | .overview-row:hover{border-color:var(--border-strong)} |
521 | | -.overview-row-main{min-width:0} |
522 | | -.overview-row-title{font-weight:600;font-size:.9rem;color:var(--text-primary);margin-bottom:var(--sp-1)} |
| 528 | +.overview-row[data-severity="critical"]{border-left:3px solid var(--error)} |
| 529 | +.overview-row[data-severity="warning"]{border-left:3px solid var(--warning)} |
| 530 | +.overview-row[data-severity="info"]{border-left:3px solid var(--info)} |
| 531 | +.overview-row-head{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap} |
| 532 | +.overview-row-spread{font-size:.72rem;font-family:var(--font-mono);color:var(--text-muted); |
| 533 | + margin-left:auto;white-space:nowrap} |
| 534 | +.overview-row-title{font-weight:600;font-size:.85rem;color:var(--text-primary)} |
523 | 535 | .overview-row-summary{font-size:.8rem;color:var(--text-secondary);line-height:1.5} |
524 | | -.overview-row-side{text-align:right;display:flex;flex-direction:column;gap:var(--sp-1);flex-shrink:0} |
525 | | -.overview-row-context{font-size:.72rem;color:var(--text-muted)} |
526 | | -.overview-row-meta{font-size:.75rem;color:var(--text-muted);font-family:var(--font-mono)} |
527 | 536 |
|
528 | 537 | /* Summary grid */ |
529 | | -.overview-summary-grid{display:grid;gap:var(--sp-2);margin-bottom:var(--sp-3)} |
| 538 | +.overview-summary-grid{display:grid;gap:var(--sp-3);margin-bottom:var(--sp-3)} |
530 | 539 | .overview-summary-grid--2col{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))} |
531 | 540 | .overview-summary-item{background:var(--bg-surface);border:1px solid var(--border); |
532 | | - border-radius:var(--radius-lg);padding:var(--sp-3) var(--sp-4)} |
533 | | -.overview-summary-label{font-size:.75rem;font-weight:600;text-transform:uppercase; |
534 | | - letter-spacing:.05em;color:var(--text-muted);margin-bottom:var(--sp-2)} |
535 | | -.overview-summary-list{display:flex;flex-direction:column;gap:var(--sp-1)} |
536 | | -.overview-summary-list li{font-size:.85rem;color:var(--text-secondary); |
537 | | - padding-left:var(--sp-3);position:relative} |
| 541 | + border-radius:var(--radius-lg);padding:var(--sp-4)} |
| 542 | +.overview-summary-label{display:flex;align-items:center;gap:var(--sp-2); |
| 543 | + font-size:.72rem;font-weight:700;text-transform:uppercase; |
| 544 | + letter-spacing:.06em;color:var(--text-muted);margin-bottom:var(--sp-3); |
| 545 | + padding-bottom:var(--sp-2);border-bottom:1px solid var(--border)} |
| 546 | +.summary-icon{flex-shrink:0;opacity:.6} |
| 547 | +.summary-icon--risk{color:var(--warning)} |
| 548 | +.summary-icon--info{color:var(--accent-primary)} |
| 549 | +.overview-summary-list{display:flex;flex-direction:column;gap:var(--sp-2)} |
| 550 | +.overview-summary-list li{font-size:.82rem;color:var(--text-secondary); |
| 551 | + padding-left:var(--sp-3);position:relative;line-height:1.5} |
538 | 552 | .overview-summary-list li::before{content:"\\2022";position:absolute;left:0;color:var(--text-muted)} |
539 | 553 | .overview-summary-value{font-size:.85rem;color:var(--text-muted)} |
| 554 | +/* Source breakdown bars */ |
| 555 | +.breakdown-list{display:flex;flex-direction:column;gap:var(--sp-2)} |
| 556 | +.breakdown-row{display:grid;grid-template-columns:6.5rem 2rem 1fr;align-items:center;gap:var(--sp-2)} |
| 557 | +.breakdown-row .source-kind-badge{justify-content:center;min-width:0;width:100%;text-align:center} |
| 558 | +.breakdown-count{font-size:.8rem;font-weight:600;font-variant-numeric:tabular-nums; |
| 559 | + color:var(--text-primary);text-align:right} |
| 560 | +.breakdown-bar-track{height:6px;border-radius:3px;background:var(--bg-raised);overflow:hidden} |
| 561 | +.breakdown-bar-fill{display:block;height:100%;border-radius:3px; |
| 562 | + background:var(--accent-primary);transition:width .6s var(--ease)} |
540 | 563 | """ |
541 | 564 |
|
542 | 565 | # --------------------------------------------------------------------------- |
|
546 | 569 | _DEPENDENCIES = """\ |
547 | 570 | .dep-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr)); |
548 | 571 | gap:var(--sp-3);margin-bottom:var(--sp-4)} |
549 | | -.dep-graph-wrap{overflow-x:auto;margin-bottom:var(--sp-4);border:1px solid var(--border); |
| 572 | +.dep-graph-wrap{overflow:hidden;margin-bottom:var(--sp-4);border:1px solid var(--border); |
550 | 573 | border-radius:var(--radius-lg);background:var(--bg-surface);padding:var(--sp-4)} |
551 | | -.dep-graph-svg{min-width:100%;width:max-content;height:auto;min-height:280px} |
| 574 | +.dep-graph-svg{width:100%;height:auto;max-height:520px} |
552 | 575 | .dep-graph-svg text{fill:var(--text-secondary);font-family:var(--font-mono)} |
553 | 576 | .dep-node{transition:fill-opacity var(--dur-fast) var(--ease)} |
554 | 577 | .dep-edge{transition:stroke-opacity var(--dur-fast) var(--ease)} |
|
591 | 614 | .novelty-tabs{display:flex;gap:var(--sp-2)} |
592 | 615 | .novelty-tab{transition:all var(--dur-fast) var(--ease)} |
593 | 616 | .novelty-tab.active{background:var(--accent-primary);color:white;border-color:var(--accent-primary)} |
594 | | -.novelty-tab[data-novelty-state="good"]{color:var(--success);border-color:var(--success)} |
| 617 | +.novelty-tab[data-novelty-state="good"]{color:var(--success);border-color:var(--success);background:var(--success-muted)} |
595 | 618 | .novelty-tab[data-novelty-state="good"].active{background:var(--success);color:white;border-color:var(--success)} |
596 | | -.novelty-tab[data-novelty-state="bad"]{color:var(--error);border-color:var(--error)} |
| 619 | +.novelty-tab[data-novelty-state="bad"]{color:var(--error);border-color:var(--error);background:var(--error-muted)} |
597 | 620 | .novelty-tab[data-novelty-state="bad"].active{background:var(--error);color:white;border-color:var(--error)} |
598 | 621 | .novelty-count{font-size:.72rem;font-weight:600;background:rgba(255,255,255,.15);padding:0 var(--sp-1); |
599 | 622 | border-radius:var(--radius-sm);margin-left:var(--sp-1)} |
|
912 | 935 | .overview-kpi-grid{grid-template-columns:repeat(2,1fr)} |
913 | 936 | .toolbar{flex-direction:column;align-items:stretch} |
914 | 937 | .toolbar-left,.toolbar-right{justify-content:flex-start} |
915 | | - .overview-row{grid-template-columns:1fr} |
916 | | - .overview-row-side{text-align:left} |
| 938 | + .overview-list{grid-template-columns:1fr} |
| 939 | + .items{grid-template-columns:1fr} |
| 940 | + .items .item{border-right:none} |
| 941 | + .overview-row-head{flex-wrap:wrap} |
| 942 | + .overview-row-spread{margin-left:0;width:100%} |
917 | 943 | .suggestion-head{flex-direction:column;align-items:flex-start} |
918 | 944 | .suggestion-facts{grid-template-columns:1fr} |
919 | 945 | .container{padding:0 var(--sp-3)} |
|
0 commit comments