/* ============================================ Detection Explainability Panel Styles ============================================ */ /* ----- Loading State ----- */ .explainability-loading { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 40px 20px; color: var(--text-muted); } .panel-loading-spinner { width: 32px; height: 32px; border: 3px solid rgba(76, 195, 247, 0.2); border-top-color: var(--blue-10); border-radius: 50%; animation: explainability-spin 1s linear infinite; margin-bottom: 12px; } @keyframes explainability-spin { to { transform: rotate(360deg); } } /* ----- Empty State ----- */ .panel-empty { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 40px 20px; color: var(--text-muted); } .panel-empty-icon { font-size: 48px; margin-bottom: 12px; opacity: 0.5; } .panel-empty-text { font-size: var(--text-sm); } /* ----- Confidence Gauge ----- */ .explainability-confidence { display: flex; flex-direction: column; align-items: center; padding: 24px 0; margin-bottom: 20px; border-bottom: 1px solid var(--bg-hover); } .confidence-gauge { position: relative; width: 100px; height: 100px; margin-bottom: 12px; } .confidence-ring { width: 100%; height: 100%; transform: rotate(-90deg); } .confidence-ring-bg { fill: none; stroke: var(--bg-hover); stroke-width: 6; } .confidence-ring-fill { fill: none; stroke: var(--blue-10); stroke-width: 6; stroke-linecap: round; transform-origin: 50% 50%; transition: stroke-dasharray 0.5s ease; } .confidence-value { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); font-size: 24px; font-weight: 700; color: var(--blue-10); } .confidence-label { font-size: var(--text-sm); color: var(--text-muted); } /* ----- Sections ----- */ .explainability-section { margin-bottom: 20px; } .explainability-section.collapsed { margin-bottom: 8px; } .section-title { font-size: var(--text-sm); font-weight: 600; color: var(--slate-11); margin: 0 0 12px 0; } .section-header { display: flex; align-items: center; justify-content: space-between; padding: 10px 12px; background: var(--border-subtle); border-radius: var(--radius-control); cursor: pointer; user-select: none; transition: background 0.2s; } .section-header:hover { background: var(--border-default); } .toggle-icon { font-size: var(--text-xs); color: var(--text-muted); transition: transform 0.2s; } .section-content { margin-top: 12px; } /* ----- Links Table ----- */ .links-table { width: 100%; border-collapse: collapse; font-size: 13px; } .links-table th, .links-table td { padding: 8px 10px; text-align: left; border-bottom: 1px solid var(--border-subtle); } .links-table th { font-weight: 600; color: var(--text-muted); font-size: 11px; text-transform: uppercase; letter-spacing: 0.5px; } .links-table tr:last-child td { border-bottom: none; } .links-table-detailed { font-size: var(--text-xs); } .links-table-detailed th, .links-table-detailed td { padding: 6px 8px; } /* ----- Table Cells ----- */ .link-cell { font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono', monospace; font-size: 11px; } .link-id { color: var(--blue-10); } .deltarms-cell { font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono', monospace; color: var(--ok); } .zone-cell { text-align: center; } .zone-badge { display: inline-block; min-width: 20px; padding: 2px 6px; border-radius: 4px; font-size: 11px; font-weight: 600; text-align: center; } .weight-cell { font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono', monospace; color: var(--warn); } .contributing-cell { text-align: center; } .contributing-badge { display: inline-block; width: 18px; height: 18px; line-height: 18px; border-radius: 50%; font-size: var(--text-xs); } .contributing-yes .contributing-badge { background: var(--ok); color: white; } .contributing-no .contributing-badge { color: var(--text-muted); } .contribution-cell { font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono', monospace; color: var(--blue-9); font-size: 11px; } /* ----- BLE Match Card ----- */ .ble-match-card { background: var(--border-subtle); border-radius: 8px; padding: 12px; } .ble-match-header { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; } .ble-match-indicator { width: 12px; height: 12px; border-radius: 50%; flex-shrink: 0; } .ble-match-name { font-size: 15px; font-weight: 600; color: var(--slate-12); } .ble-match-confidence { margin-left: auto; font-size: var(--text-xs); color: var(--text-muted); } .ble-match-details { display: flex; flex-direction: column; gap: 6px; } .ble-match-detail { display: flex; font-size: var(--text-xs); } .detail-label { color: var(--text-muted); min-width: 70px; } .detail-value { color: var(--slate-11); font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono', monospace; } /* ----- Footer ----- */ .explainability-footer { padding-top: 16px; margin-top: 20px; border-top: 1px solid var(--bg-hover); display: flex; justify-content: center; } .panel-btn { padding: 10px 20px; border: none; border-radius: var(--radius-control); font-size: var(--text-sm); font-weight: 500; cursor: pointer; transition: background 0.2s, transform 0.1s; } .panel-btn:active { transform: scale(0.98); } .panel-btn-primary { background: var(--blue-10); color: var(--bg-card); } .panel-btn-primary:hover { background: var(--blue-10); } .panel-btn-secondary { background: var(--bg-hover); color: var(--slate-12); } .panel-btn-secondary:hover { background: var(--border-strong); } /* ----- Confidence Color Variants ----- */ .confidence-ring-fill.high { stroke: var(--ok); } .confidence-value.high { color: var(--ok); } .confidence-ring-fill.medium { stroke: var(--warn); } .confidence-value.medium { color: var(--warn); } .confidence-ring-fill.low { stroke: var(--alert); } .confidence-value.low { color: var(--alert); }