/* ============================================================================= components-tier2.css — Tier 2 components (Phase 2) 7. Decision-tree (AI Act 4-step) 8. Traffic-lights 9. Diff-review 10. Treemap (config-audit token hotspots) 11. Distribution / range-viz (P10/P50/P90) 12. Command-pipeline output 13. Pyramide (AI Act 4-tier) 14. Pipeline-cockpit 15. Verdict-pill with risk-meter 16. Codepoint-reveal (security Unicode steg) 17. Inherent + residual pair (already partially in Tier 1, formalize) 18. Small-multiples grid ============================================================================= */ /* DECISION-TREE — vertical flowchart with 4 colored terminals */ .decision-tree { display: flex; flex-direction: column; align-items: center; gap: 0; } .dt-node { padding: 12px 18px; background: var(--color-surface); border: 1px solid var(--color-border-moderate); border-radius: var(--radius-md); font-size: var(--font-size-sm); font-weight: var(--font-weight-medium); text-align: center; min-width: 240px; max-width: 340px; } .dt-edge { width: 1px; height: 28px; background: var(--color-border-moderate); position: relative; } .dt-edge__label { position: absolute; left: 8px; top: 50%; transform: translateY(-50%); font-size: 11px; color: var(--color-text-tertiary); white-space: nowrap; font-family: var(--font-family-mono); } .dt-node--terminal { color: #fff; border: none; padding: 14px 20px; font-weight: var(--font-weight-semibold); } .dt-node--forbidden { background: var(--color-severity-extreme); } .dt-node--high { background: var(--color-severity-critical); } .dt-node--limited { background: var(--color-severity-medium); color: var(--color-severity-medium-on); } .dt-node--minimal { background: var(--color-severity-low); } .dt-row { display: flex; gap: var(--space-3); } /* TRAFFIC-LIGHTS */ .traffic-light { display: inline-flex; align-items: center; gap: 8px; padding: 6px 12px; border-radius: var(--radius-md); background: var(--color-bg-soft); border: 1px solid var(--color-border-subtle); font-size: var(--font-size-sm); } .traffic-light__dot { width: 10px; height: 10px; border-radius: 50%; flex-shrink: 0; } .traffic-light[data-status="green"] .traffic-light__dot { background: var(--color-state-success); } .traffic-light[data-status="yellow"] .traffic-light__dot { background: var(--color-severity-medium); } .traffic-light[data-status="red"] .traffic-light__dot { background: var(--color-severity-critical); } .traffic-light[data-status="gray"] .traffic-light__dot { background: var(--color-text-tertiary); } .traffic-light__label { font-weight: var(--font-weight-medium); } .traffic-light__why { color: var(--color-text-tertiary); font-size: var(--font-size-xs); } /* DIFF-REVIEW */ .diff { border: 1px solid var(--color-border-subtle); border-radius: var(--radius-md); overflow: hidden; } .diff__row { display: grid; grid-template-columns: 1fr 1fr; border-top: 1px solid var(--color-border-subtle); } .diff__row:first-child { border-top: none; } .diff__cell { padding: 10px 14px; font-size: var(--font-size-sm); font-family: var(--font-family-mono); } .diff__cell--removed { background: var(--color-severity-critical-soft); color: var(--color-severity-critical-on); border-right: 1px solid var(--color-border-subtle); } .diff__cell--added { background: var(--color-severity-low-soft); color: var(--color-severity-low-on); } .diff__cell--unchanged { color: var(--color-text-secondary); border-right: 1px solid var(--color-border-subtle); } .diff__summary { display: flex; gap: var(--space-4); padding: 12px 16px; background: var(--color-bg-soft); border-bottom: 1px solid var(--color-border-subtle); font-size: var(--font-size-sm); } .diff__summary-item { display: flex; gap: 6px; align-items: baseline; } .diff__summary-count { font-weight: var(--font-weight-semibold); font-variant-numeric: tabular-nums; } /* TREEMAP — pure CSS treemap with grid */ .treemap { display: grid; grid-template-columns: repeat(12, 1fr); grid-auto-rows: 36px; gap: 2px; background: var(--color-border-subtle); border-radius: var(--radius-md); overflow: hidden; padding: 2px; } .treemap__tile { padding: 8px 10px; font-size: var(--font-size-xs); display: flex; flex-direction: column; justify-content: space-between; color: #fff; overflow: hidden; cursor: pointer; position: relative; } .treemap__tile-label { font-weight: var(--font-weight-semibold); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .treemap__tile-tokens { font-family: var(--font-family-mono); font-size: 11px; opacity: 0.85; } .treemap__tile[data-kind="claudemd"] { background: #4338CA; } .treemap__tile[data-kind="plugin"] { background: #0F6E76; } .treemap__tile[data-kind="skill"] { background: #9A6700; } .treemap__tile[data-kind="mcp"] { background: #3F5963; } .treemap__tile[data-kind="hook"] { background: #A40E26; } /* DISTRIBUTION / range-viz */ .distribution { display: flex; flex-direction: column; gap: var(--space-3); } .distribution__row { display: grid; grid-template-columns: 140px 1fr; gap: var(--space-3); align-items: center; font-size: var(--font-size-sm); } .distribution__label { color: var(--color-text-secondary); } .distribution__track { position: relative; height: 28px; background: var(--color-surface-sunken); border-radius: var(--radius-sm); overflow: visible; } .distribution__band { position: absolute; top: 6px; bottom: 6px; background: var(--color-primary-300); border-radius: var(--radius-pill); opacity: 0.4; } .distribution__median { position: absolute; top: 0; bottom: 0; width: 2px; background: var(--color-primary-700); } .distribution__median-label { position: absolute; top: -18px; left: 50%; transform: translateX(-50%); font-size: 11px; font-family: var(--font-family-mono); white-space: nowrap; color: var(--color-text-primary); font-weight: var(--font-weight-semibold); } .distribution__axis { display: grid; grid-template-columns: 140px 1fr; gap: var(--space-3); font-size: 11px; color: var(--color-text-tertiary); font-family: var(--font-family-mono); margin-top: 4px; } .distribution__axis-ticks { display: flex; justify-content: space-between; } /* COMMAND-PIPELINE OUTPUT */ .cmd-pipeline { display: flex; flex-direction: column; gap: var(--space-2); } .cmd-step { display: grid; grid-template-columns: 32px 1fr auto; gap: var(--space-3); padding: 12px 14px; background: var(--color-surface-sunken); border: 1px solid var(--color-border-subtle); border-radius: var(--radius-md); align-items: center; } .cmd-step__num { width: 24px; height: 24px; border-radius: 50%; background: var(--color-text-primary); color: var(--color-bg); display: flex; align-items: center; justify-content: center; font-family: var(--font-family-mono); font-size: 11px; font-weight: var(--font-weight-bold); } .cmd-step__cmd { font-family: var(--font-family-mono); font-size: var(--font-size-sm); color: var(--color-text-primary); word-break: break-all; } .cmd-step__cmd .cmd-flag { color: var(--color-state-info); } .cmd-step__cmd .cmd-arg { color: var(--color-severity-medium-on); } /* PYRAMIDE — AI Act 4-tier */ .pyramide { display: flex; flex-direction: column; align-items: center; gap: 4px; } .pyramide__tier { display: flex; align-items: center; justify-content: space-between; padding: 10px 18px; color: #fff; font-weight: var(--font-weight-semibold); font-size: var(--font-size-sm); border-radius: var(--radius-sm); width: 100%; } .pyramide__tier--forbidden { background: var(--color-severity-extreme); max-width: 30%; } .pyramide__tier--high { background: var(--color-severity-critical); max-width: 50%; } .pyramide__tier--limited { background: var(--color-severity-medium); color: var(--color-severity-medium-on); max-width: 75%; } .pyramide__tier--minimal { background: var(--color-severity-low); max-width: 100%; } .pyramide__tier-label { display: flex; gap: var(--space-2); align-items: center; } .pyramide__tier-share { font-family: var(--font-family-mono); font-size: 11px; opacity: 0.85; } /* PIPELINE-COCKPIT */ .pipeline-cockpit { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 0; align-items: stretch; border: 1px solid var(--color-border-subtle); border-radius: var(--radius-md); overflow: hidden; background: var(--color-surface); } .pc-stage { padding: var(--space-3) var(--space-4); border-right: 1px solid var(--color-border-subtle); display: flex; flex-direction: column; gap: 4px; position: relative; } .pc-stage:last-child { border-right: none; } .pc-stage__num { font-family: var(--font-family-mono); font-size: 11px; color: var(--color-text-tertiary); } .pc-stage__name { font-weight: var(--font-weight-semibold); font-size: var(--font-size-sm); } .pc-stage__state { font-size: 11px; padding: 2px 8px; border-radius: var(--radius-pill); align-self: flex-start; margin-top: 4px; font-weight: var(--font-weight-medium); } .pc-stage__state[data-state="done"] { background: var(--color-severity-low-soft); color: var(--color-severity-low-on); } .pc-stage__state[data-state="running"] { background: var(--color-severity-medium-soft); color: var(--color-severity-medium-on); } .pc-stage__state[data-state="empty"] { background: var(--color-bg-soft); color: var(--color-text-tertiary); } .pc-stage__state[data-state="failed"] { background: var(--color-severity-critical); color: #fff; } .pc-stage[data-current="true"] { background: var(--color-primary-50); } [data-theme="dark"] .pc-stage[data-current="true"] { background: var(--color-primary-900); } /* VERDICT-PILL with risk-meter */ .verdict-block { display: grid; grid-template-columns: auto 1fr; gap: var(--space-6); align-items: center; padding: var(--space-5) var(--space-6); background: var(--color-surface); border: 1px solid var(--color-border-subtle); border-radius: var(--radius-lg); } .verdict-pill-lg { display: flex; flex-direction: column; align-items: center; gap: 2px; padding: var(--space-4) var(--space-5); border-radius: var(--radius-md); font-weight: var(--font-weight-bold); letter-spacing: 0.04em; } .verdict-pill-lg__verdict { font-size: var(--font-size-xl); } .verdict-pill-lg__sub { font-size: 11px; font-weight: var(--font-weight-medium); opacity: 0.8; text-transform: uppercase; letter-spacing: 0.1em; } .verdict-pill-lg[data-verdict="block"] { background: var(--color-severity-critical); color: #fff; } .verdict-pill-lg[data-verdict="warning"] { background: var(--color-severity-medium); color: var(--color-severity-medium-on); } .verdict-pill-lg[data-verdict="allow"] { background: var(--color-severity-low); color: #fff; } .risk-meter { display: flex; flex-direction: column; gap: 6px; } .risk-meter__track { position: relative; height: 12px; background: linear-gradient(to right, var(--color-severity-low) 0%, var(--color-severity-low) 14%, var(--color-severity-medium) 14%, var(--color-severity-medium) 39%, var(--color-severity-high) 39%, var(--color-severity-high) 64%, var(--color-severity-critical) 64%, var(--color-severity-critical) 84%, var(--color-severity-extreme) 84%, var(--color-severity-extreme) 100%); border-radius: var(--radius-pill); } .risk-meter__pointer { position: absolute; top: -4px; bottom: -4px; width: 4px; background: var(--color-text-primary); border-radius: 2px; box-shadow: 0 0 0 2px var(--color-bg); } .risk-meter__scale { display: flex; justify-content: space-between; font-size: 11px; color: var(--color-text-tertiary); font-family: var(--font-family-mono); } .risk-meter__bands { display: flex; justify-content: space-between; font-size: 11px; color: var(--color-text-secondary); } .risk-meter__readout { display: flex; align-items: baseline; gap: 8px; } .risk-meter__score { font-size: var(--font-size-3xl); font-weight: var(--font-weight-bold); font-variant-numeric: tabular-nums; letter-spacing: -0.02em; } .risk-meter__band-label { font-size: var(--font-size-sm); color: var(--color-text-secondary); } /* CODEPOINT-REVEAL */ .codepoint-reveal { background: var(--color-surface-sunken); border: 1px solid var(--color-border-subtle); border-radius: var(--radius-md); overflow: hidden; } .codepoint-reveal__head { padding: 10px 14px; background: var(--color-bg-soft); border-bottom: 1px solid var(--color-border-subtle); display: flex; justify-content: space-between; align-items: center; } .codepoint-reveal__body { padding: var(--space-4); display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-4); } .codepoint-reveal__col { display: flex; flex-direction: column; gap: 8px; } .codepoint-reveal__col-label { font-size: 11px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--color-text-tertiary); font-weight: var(--font-weight-semibold); } .codepoint-reveal__source { font-family: var(--font-family-mono); font-size: var(--font-size-sm); padding: 12px; background: var(--color-surface); border: 1px solid var(--color-border-subtle); border-radius: var(--radius-sm); min-height: 64px; word-break: break-all; white-space: pre-wrap; } .cp-tag { background: var(--color-severity-critical); color: #fff; padding: 1px 4px; border-radius: 2px; font-size: 11px; } .cp-zw { background: var(--color-severity-medium); color: var(--color-severity-medium-on); padding: 1px 4px; border-radius: 2px; font-size: 11px; } .cp-bidi { background: var(--color-severity-high); color: #fff; padding: 1px 4px; border-radius: 2px; font-size: 11px; } .codepoint-reveal__decoded { font-family: var(--font-family-mono); font-size: var(--font-size-sm); padding: 12px; background: var(--color-text-primary); color: var(--color-bg); border-radius: var(--radius-sm); word-break: break-all; } /* SMALL-MULTIPLES GRID (16-category posture) */ .small-multiples { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--space-3); } .sm-card { padding: var(--space-3); background: var(--color-surface); border: 1px solid var(--color-border-subtle); border-radius: var(--radius-md); display: flex; flex-direction: column; gap: 6px; } .sm-card__header { display: flex; justify-content: space-between; align-items: baseline; } .sm-card__name { font-size: var(--font-size-xs); font-weight: var(--font-weight-semibold); color: var(--color-text-secondary); text-transform: uppercase; letter-spacing: 0.04em; } .sm-card__grade { font-family: var(--font-family-mono); font-size: var(--font-size-lg); font-weight: var(--font-weight-bold); width: 28px; height: 28px; display: flex; align-items: center; justify-content: center; border-radius: var(--radius-sm); } .sm-card__grade[data-grade="A"] { background: var(--color-severity-low); color: #fff; } .sm-card__grade[data-grade="B"] { background: var(--color-severity-low-soft); color: var(--color-severity-low-on); } .sm-card__grade[data-grade="C"] { background: var(--color-severity-medium-soft); color: var(--color-severity-medium-on); } .sm-card__grade[data-grade="D"] { background: var(--color-severity-high-soft); color: var(--color-severity-high-on); } .sm-card__grade[data-grade="F"] { background: var(--color-severity-critical); color: #fff; } .sm-card__bar { height: 4px; background: var(--color-surface-sunken); border-radius: var(--radius-pill); overflow: hidden; } .sm-card__bar-fill { height: 100%; background: var(--color-primary-500); } .sm-card__status { font-size: 11px; color: var(--color-text-tertiary); } @media (max-width: 880px) { .small-multiples { grid-template-columns: repeat(2, 1fr); } } /* OWASP badges (specific colors) */ .badge--owasp-llm { background: #1F2328; color: #fff; } .badge--owasp-asi { background: #4338CA; color: #fff; } .badge--owasp-ast { background: #9A6700; color: #fff; } .badge--owasp-mcp { background: #0F6E76; color: #fff; }