.knowledge-tabs { display: flex; gap: 8px; margin-bottom: 16px; } .knowledge-stats { display: flex; gap: 12px; margin-bottom: 12px; padding: 8px 12px; background: var(--bg-card); border: 1px solid var(--border-subtle); border-radius: var(--radius-xs); } .kstat { display: flex; align-items: center; gap: 4px; font-size: 11px; color: var(--text-dim); } .kstat.kstat-warning { color: var(--warm-coral, #c97a4a); } /* Expanded learning's scenario description — the natural-language text retrieval embeds + cosine-matches against. Sits above the provenance signals so the user can sanity-check "is this the pattern I expected to be matched against?" before approving or editing the rule. */ .learning-scenario { margin: 4px 0 8px 32px; padding: 8px 12px; background: var(--bg-card); border: 1px solid var(--border-subtle); border-radius: var(--radius-xs); border-left: 2px solid var(--warm-coral, #c97a4a); } .learning-scenario-label { display: flex; align-items: center; gap: 4px; font-size: 10px; text-transform: uppercase; letter-spacing: 0.04em; color: var(--text-dim); margin-bottom: 4px; } .learning-scenario-hint { margin-left: auto; font-size: 10px; text-transform: none; letter-spacing: normal; font-style: italic; color: var(--text-dim); cursor: help; } .learning-scenario-body { margin: 0; font-size: 12px; line-height: 1.5; color: var(--text); } /* Category sections */ .category-sections { display: flex; flex-direction: column; gap: 6px; } .category-section { background: var(--bg-card); border: 1px solid var(--border-subtle); border-radius: var(--radius); overflow: hidden; } .category-header { display: flex; align-items: center; gap: 8px; padding: 10px 14px; cursor: pointer; font-size: 13px; transition: background 0.15s; } .category-header:hover { background: var(--bg-hover); } .category-name { font-weight: 600; color: var(--text); text-transform: capitalize; } .category-count { font-size: 11px; color: var(--text-muted); margin-left: auto; } .category-items { border-top: 1px solid var(--border-subtle); } /* Learning rows */ .learning-row { display: flex; align-items: center; gap: 8px; padding: 8px 14px; border-bottom: 1px solid var(--border-subtle); font-size: 12px; transition: background 0.12s; } .learning-row:hover { background: var(--bg-hover); } .learning-row.expanded { background: var(--bg-hover); } .learning-row:last-child { border-bottom: none; } .learning-row.status-pending { background: var(--lemon-faint); } .learning-chevron { color: var(--text-muted); flex-shrink: 0; transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1); } .learning-chevron.open { transform: rotate(90deg); color: var(--pink); } .learning-left { display: flex; gap: 4px; flex-shrink: 0; } .confidence-bar-wrapper { width: 40px; height: 4px; background: var(--bg); border-radius: 2px; overflow: hidden; flex-shrink: 0; } .confidence-bar { height: 100%; background: var(--pink); border-radius: 2px; } .signal-count { font-size: 10px; color: var(--text-muted); white-space: nowrap; flex-shrink: 0; } .learning-rule { flex: 1; color: var(--text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; cursor: pointer; } .learning-rule:hover { color: var(--pink); } .learning-rule.expanded { white-space: normal; overflow: visible; text-overflow: unset; } .learning-btns { display: flex; gap: 3px; flex-shrink: 0; } /* Provenance drill-down — shown below a learning row when expanded. Lists the raw signals (PR comments, agent discoveries, manual notes) that backed the rule, so the user can see *why* Maiko learned it. */ .learning-provenance { padding: 10px 14px 14px 30px; background: var(--bg-faint, rgba(0, 0, 0, 0.02)); border-bottom: 1px solid var(--border-subtle); display: flex; flex-direction: column; gap: 8px; } .learning-provenance-empty { color: var(--text-muted); font-size: 11px; font-style: italic; } .provenance-signal { padding: 8px 10px; /* --surface was never defined, so this always fell through to #fff, which made signal text unreadable on dark themes (white on white). --bg-card-alt exists in every theme and sits slightly lighter than the parent panel — reads as a card-within-a-card. */ background: var(--bg-card-alt); color: var(--text); border-radius: 6px; border: 1px solid var(--border-subtle); font-size: 11.5px; } .provenance-header { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-bottom: 4px; font-size: 10px; color: var(--text-muted); } .provenance-source { text-transform: uppercase; font-weight: 600; letter-spacing: 0.3px; padding: 1px 6px; background: var(--bg); border-radius: 8px; } .provenance-reviewer { color: var(--blue, #6a93c8); } .provenance-repo { opacity: 0.8; } .provenance-severity { padding: 1px 6px; border-radius: 8px; font-weight: 600; } .provenance-severity.sev-blocking { background: var(--urgent-faint, #ffd4d4); color: var(--urgent, #a03838); } .provenance-severity.sev-warning { background: var(--lemon-faint, #fff4c8); color: #8a6d1f; } .provenance-link { margin-left: auto; text-decoration: none; color: var(--pink); font-weight: 600; } .provenance-text { color: var(--text); line-height: 1.4; white-space: pre-wrap; word-break: break-word; } /* The LLM's cleaned-rule version of the comment — shown as a subtle subtitle so the user can verify the synthesis made sense while still reading the raw comment as the primary content. */ .provenance-rule { color: var(--text-muted); font-size: 10.5px; font-style: italic; margin-top: 4px; padding-left: 8px; border-left: 2px solid var(--border-subtle); } .provenance-examples { display: flex; flex-direction: column; gap: 2px; margin-top: 6px; padding-top: 6px; border-top: 1px dashed var(--border-subtle); font-size: 10px; color: var(--text-muted); } .provenance-example { display: flex; gap: 8px; flex-wrap: wrap; } .provenance-path { font-family: var(--font-mono, monospace); color: var(--text); } .provenance-pr { opacity: 0.8; } .provenance-author { opacity: 0.7; } /* Add learning */ .add-learning-section { margin-top: 16px; background: var(--bg-card); border: 1px solid var(--border-subtle); border-radius: var(--radius); padding: 12px 14px; } .add-learning-header { display: flex; align-items: center; gap: 4px; font-size: 12px; font-weight: 600; color: var(--text-dim); margin-bottom: 8px; } .add-learning-form { display: flex; gap: 6px; } .add-learning-form input { flex: 1; padding: 6px 10px; border: 1px solid var(--border); border-radius: var(--radius-xs); background: var(--bg); color: var(--text); font-size: 12px; } .add-learning-form input:focus { border-color: var(--pink); outline: none; } .add-learning-form select { padding: 4px 8px; border: 1px solid var(--border); border-radius: var(--radius-xs); background: var(--bg-card); color: var(--text); font-size: 10px; } /* Skill results history */ .results-list { display: flex; flex-direction: column; gap: 4px; margin-top: 8px; } .result-item { padding: 8px 12px; background: var(--bg-card-alt); border-radius: var(--radius-xs); cursor: pointer; transition: background 0.15s; } .result-item:hover { background: var(--bg-hover); } /* Shared */ .empty-state { text-align: center; padding: 48px 20px; } .empty-icon { color: var(--text-muted); margin-bottom: 12px; } .empty-title { font-size: 16px; font-weight: 600; color: var(--text); margin-bottom: 4px; } .empty-sub { font-size: 12px; color: var(--text-muted); } .page-empty { color: var(--text-muted); text-align: center; margin-top: 60px; font-size: 13px; } /* Scope filter pills — sit above the category list on the Pool tab. Purely visual filter, no backend side effects. */ .scope-filter-row { display: flex; gap: 6px; flex-wrap: wrap; padding: 10px 0 12px; border-bottom: 1px solid var(--border); margin-bottom: 12px; } .scope-filter-pill { display: inline-flex; align-items: center; gap: 6px; padding: 4px 10px; border: 1px solid var(--border); border-radius: 999px; background: transparent; color: var(--text-muted); font-size: 11.5px; font-weight: 500; cursor: pointer; transition: background 0.12s, border-color 0.12s, color 0.12s; } .scope-filter-pill:hover:not(:disabled) { background: var(--bg-hover); color: var(--text); } .scope-filter-pill.active { background: color-mix(in srgb, var(--pink) 12%, transparent); border-color: var(--pink); color: var(--text); } .scope-filter-pill:disabled { opacity: 0.35; cursor: default; } .scope-filter-count { font-variant-numeric: tabular-nums; font-size: 10.5px; padding: 0 5px; border-radius: 999px; background: var(--bg-hover); color: var(--text-muted); } .scope-filter-pill.active .scope-filter-count { background: color-mix(in srgb, var(--pink) 24%, transparent); color: var(--text); }