/* Knowledge-graph workbench — professional analysis-tool styling. Light theme is the default; dark values are applied under `.dark` (the app toggles the `dark` class on ). */ .kg-page { --kg-bg: #f4f6fb; --kg-bg-image: radial-gradient(circle at 20% 10%, rgba(2, 132, 199, 0.07), transparent 32%), radial-gradient(circle at 80% 20%, rgba(124, 58, 237, 0.06), transparent 28%); --kg-panel: rgba(255, 255, 255, 0.82); --kg-panel-solid: #ffffff; --kg-header-bg: rgba(255, 255, 255, 0.88); --kg-float-bg: rgba(255, 255, 255, 0.88); --kg-tooltip-bg: rgba(255, 255, 255, 0.97); --kg-tooltip-shadow: 0 18px 40px rgba(15, 23, 42, 0.18); --kg-button-bg: rgba(255, 255, 255, 0.75); --kg-input-bg: rgba(255, 255, 255, 0.9); --kg-card-bg: rgba(248, 250, 252, 0.9); --kg-canvas-bg: rgba(255, 255, 255, 0.55); --kg-canvas-glow: rgba(2, 132, 199, 0.06); --kg-grid-line: rgba(15, 23, 42, 0.05); --kg-border: rgba(15, 23, 42, 0.12); --kg-border-soft: rgba(15, 23, 42, 0.09); --kg-border-faint: rgba(15, 23, 42, 0.07); --kg-divider: rgba(15, 23, 42, 0.06); --kg-input-border: rgba(15, 23, 42, 0.16); --kg-text-strong: #0f172a; --kg-text-main: #1e293b; --kg-text-soft: #334155; --kg-text-secondary: #64748b; --kg-text-muted: #94a3b8; --kg-primary: #0284c7; --kg-primary-text: #0369a1; --kg-primary-accent: #0369a1; --kg-primary-soft: rgba(2, 132, 199, 0.1); --kg-primary-soft-strong: rgba(2, 132, 199, 0.16); --kg-primary-soft-faint: rgba(2, 132, 199, 0.07); --kg-primary-border: rgba(2, 132, 199, 0.3); --kg-primary-border-strong: rgba(2, 132, 199, 0.45); --kg-focus-border: rgba(2, 132, 199, 0.55); --kg-focus-ring: rgba(2, 132, 199, 0.12); --kg-pill-bg: rgba(2, 132, 199, 0.08); --kg-pill-border: rgba(2, 132, 199, 0.24); --kg-violet-bg: rgba(124, 58, 237, 0.08); --kg-violet-border: rgba(124, 58, 237, 0.24); --kg-violet-text: #6d28d9; --kg-hover-bg: rgba(15, 23, 42, 0.07); --kg-hover-bg-faint: rgba(15, 23, 42, 0.045); --kg-warn: #b45309; --kg-success-bg: rgba(5, 150, 105, 0.12); --kg-success-text: #047857; --kg-warn-bg: rgba(217, 119, 6, 0.12); --kg-warn-text: #b45309; height: 100%; min-height: 0; background-color: var(--kg-bg); background-image: var(--kg-bg-image); color: var(--kg-text-main); display: flex; flex-direction: column; overflow: hidden; } .dark .kg-page { --kg-bg: #0b1020; --kg-bg-image: radial-gradient(circle at 20% 10%, rgba(56, 189, 248, 0.1), transparent 32%), radial-gradient(circle at 80% 20%, rgba(167, 139, 250, 0.1), transparent 28%); --kg-panel: rgba(15, 23, 42, 0.78); --kg-panel-solid: #0f172a; --kg-header-bg: rgba(15, 23, 42, 0.86); --kg-float-bg: rgba(15, 23, 42, 0.82); --kg-tooltip-bg: rgba(15, 23, 42, 0.94); --kg-tooltip-shadow: 0 18px 40px rgba(0, 0, 0, 0.35); --kg-button-bg: rgba(15, 23, 42, 0.65); --kg-input-bg: rgba(2, 6, 23, 0.45); --kg-card-bg: rgba(2, 6, 23, 0.35); --kg-canvas-bg: rgba(2, 6, 23, 0.5); --kg-canvas-glow: rgba(56, 189, 248, 0.08); --kg-grid-line: rgba(148, 163, 184, 0.04); --kg-border: rgba(148, 163, 184, 0.18); --kg-border-soft: rgba(148, 163, 184, 0.14); --kg-border-faint: rgba(148, 163, 184, 0.1); --kg-divider: rgba(148, 163, 184, 0.08); --kg-input-border: rgba(148, 163, 184, 0.2); --kg-text-strong: #ffffff; --kg-text-main: #e5e7eb; --kg-text-soft: #cbd5e1; --kg-text-secondary: #94a3b8; --kg-text-muted: #64748b; --kg-primary: #38bdf8; --kg-primary-text: #bae6fd; --kg-primary-accent: #7dd3fc; --kg-primary-soft: rgba(56, 189, 248, 0.14); --kg-primary-soft-strong: rgba(56, 189, 248, 0.18); --kg-primary-soft-faint: rgba(56, 189, 248, 0.08); --kg-primary-border: rgba(56, 189, 248, 0.35); --kg-primary-border-strong: rgba(56, 189, 248, 0.45); --kg-focus-border: rgba(56, 189, 248, 0.55); --kg-focus-ring: rgba(56, 189, 248, 0.1); --kg-pill-bg: rgba(56, 189, 248, 0.12); --kg-pill-border: rgba(56, 189, 248, 0.28); --kg-violet-bg: rgba(167, 139, 250, 0.12); --kg-violet-border: rgba(167, 139, 250, 0.28); --kg-violet-text: #ddd6fe; --kg-hover-bg: rgba(148, 163, 184, 0.12); --kg-hover-bg-faint: rgba(148, 163, 184, 0.08); --kg-warn: #fbbf24; --kg-success-bg: rgba(52, 211, 153, 0.14); --kg-success-text: #6ee7b7; --kg-warn-bg: rgba(251, 191, 36, 0.14); --kg-warn-text: #fcd34d; } /* ------------------------------------------------------------------ header */ .kg-header { height: 56px; border-bottom: 1px solid var(--kg-border); background: var(--kg-header-bg); backdrop-filter: blur(14px); display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 0 18px; flex-shrink: 0; } .kg-header-left { display: flex; align-items: center; gap: 14px; min-width: 0; } .kg-back { height: 32px; padding: 0 10px; border-radius: 8px; border: none; background: transparent; color: var(--kg-text-main); font-size: 13px; display: inline-flex; align-items: center; gap: 6px; cursor: pointer; flex-shrink: 0; } .kg-back:hover { background: var(--kg-hover-bg); } .kg-title-block { display: flex; align-items: baseline; gap: 10px; min-width: 0; } .kg-title { font-size: 18px; font-weight: 800; color: var(--kg-text-strong); white-space: nowrap; } .kg-subtitle { font-size: 12px; color: var(--kg-text-secondary); white-space: nowrap; } .kg-stat-pills { display: flex; align-items: center; gap: 8px; } .kg-stat-pill { height: 28px; padding: 0 10px; border-radius: 999px; background: var(--kg-pill-bg); border: 1px solid var(--kg-pill-border); color: var(--kg-primary-text); font-size: 12px; display: inline-flex; align-items: center; gap: 4px; white-space: nowrap; } .kg-stat-pill.kg-stat-pill-violet { background: var(--kg-violet-bg); border-color: var(--kg-violet-border); color: var(--kg-violet-text); } .kg-header-actions { display: flex; align-items: center; gap: 8px; flex-shrink: 0; } .kg-icon-button { height: 34px; min-width: 34px; padding: 0 8px; border-radius: 9px; border: 1px solid var(--kg-border); background: var(--kg-button-bg); color: var(--kg-text-soft); font-size: 12px; display: inline-flex; align-items: center; justify-content: center; gap: 6px; cursor: pointer; transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease; } .kg-icon-button:hover { color: var(--kg-text-strong); background: var(--kg-primary-soft); border-color: var(--kg-primary-border); } .kg-icon-button:disabled { opacity: 0.5; cursor: default; } .kg-icon-button.kg-icon-button-active { color: var(--kg-text-strong); background: var(--kg-primary-soft-strong); border-color: var(--kg-primary-border-strong); } .kg-header-divider { width: 1px; height: 20px; background: var(--kg-border); margin: 0 2px; } /* -------------------------------------------------------------------- body */ .kg-body { flex: 1; min-height: 0; display: grid; grid-template-columns: 280px minmax(0, 1fr) 320px; gap: 12px; padding: 12px; } .kg-body.kg-hide-left { grid-template-columns: minmax(0, 1fr) 320px; } .kg-body.kg-hide-right { grid-template-columns: 280px minmax(0, 1fr); } .kg-body.kg-hide-left.kg-hide-right { grid-template-columns: minmax(0, 1fr); } .kg-panel { background: var(--kg-panel); border: 1px solid var(--kg-border); border-radius: 16px; backdrop-filter: blur(14px); overflow: hidden; min-height: 0; display: flex; flex-direction: column; } .kg-panel-header { height: 46px; padding: 0 16px; border-bottom: 1px solid var(--kg-border-soft); display: flex; align-items: center; justify-content: space-between; flex-shrink: 0; } .kg-panel-header-actions { display: flex; align-items: center; gap: 8px; min-width: 0; } .kg-panel-title { font-size: 14px; font-weight: 700; color: var(--kg-text-main); } .kg-panel-close-btn { width: 28px; height: 28px; border-radius: 8px; border: 1px solid var(--kg-border); background: var(--kg-button-bg); color: var(--kg-text-secondary); display: inline-flex; align-items: center; justify-content: center; cursor: pointer; flex-shrink: 0; } .kg-panel-close-btn:hover { color: var(--kg-text-strong); background: var(--kg-primary-soft); border-color: var(--kg-primary-border); } .kg-panel-content { padding: 14px; overflow-y: auto; min-height: 0; flex: 1; scrollbar-width: thin; scrollbar-color: rgba(148, 163, 184, 0.3) transparent; } /* ----------------------------------------------------------------- sidebar */ .kg-search-wrap { position: relative; } .kg-search-wrap > svg { position: absolute; left: 11px; top: 50%; transform: translateY(-50%); color: var(--kg-text-muted); pointer-events: none; } .kg-search { height: 36px; width: 100%; border-radius: 10px; border: 1px solid var(--kg-input-border); background: var(--kg-input-bg); color: var(--kg-text-main); padding: 0 12px 0 32px; font-size: 13px; outline: none; } .kg-search::placeholder { color: var(--kg-text-muted); } .kg-search:focus { border-color: var(--kg-focus-border); box-shadow: 0 0 0 3px var(--kg-focus-ring); } .kg-search-hint { margin-top: 6px; font-size: 12px; color: var(--kg-text-muted); } .kg-search-hint.kg-search-hint-warn { color: var(--kg-warn); } .kg-filter-section { border-top: 1px solid var(--kg-border-faint); padding: 10px 0; } .kg-filter-section:first-of-type { margin-top: 12px; } .kg-filter-section-header { width: 100%; height: 34px; border: none; background: transparent; color: var(--kg-text-soft); display: flex; align-items: center; justify-content: space-between; cursor: pointer; padding: 0; font-size: 13px; font-weight: 700; } .kg-filter-section-header:hover { color: var(--kg-text-strong); } .kg-filter-section-extra { color: var(--kg-text-muted); font-size: 12px; font-weight: 400; display: inline-flex; align-items: center; gap: 4px; } .kg-filter-section-body { padding-top: 8px; } .kg-check-row { min-height: 30px; display: flex; align-items: center; justify-content: space-between; gap: 8px; color: var(--kg-text-soft); font-size: 13px; cursor: pointer; border-radius: 8px; padding: 0 6px; user-select: none; } .kg-check-row:hover { background: var(--kg-hover-bg-faint); } .kg-check-row-main { display: flex; align-items: center; gap: 8px; min-width: 0; } .kg-check-row input[type="checkbox"] { accent-color: var(--kg-primary); width: 14px; height: 14px; flex-shrink: 0; } .kg-check-row .kg-legend-dot { flex-shrink: 0; } .kg-check-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .kg-count { color: var(--kg-text-muted); font-size: 12px; flex-shrink: 0; } .kg-stats-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; } .kg-stat-card { border-radius: 10px; border: 1px solid var(--kg-border-faint); background: var(--kg-card-bg); padding: 8px 10px; } .kg-stat-card-value { font-size: 16px; font-weight: 800; color: var(--kg-text-strong); } .kg-stat-card-label { font-size: 11px; color: var(--kg-text-muted); margin-top: 2px; } .kg-rank-item { display: flex; gap: 8px; padding: 8px 6px; border-bottom: 1px solid var(--kg-divider); cursor: pointer; border-radius: 8px; } .kg-rank-item:hover { background: var(--kg-primary-soft-faint); } .kg-rank-index { width: 20px; color: var(--kg-primary); font-weight: 700; font-size: 12px; flex-shrink: 0; } .kg-rank-title { flex: 1; color: var(--kg-text-soft); font-size: 12px; line-height: 1.5; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; } .kg-rank-degree { color: var(--kg-text-muted); font-size: 11px; flex-shrink: 0; } .kg-text-button { border: none; background: transparent; color: var(--kg-primary); font-size: 12px; cursor: pointer; padding: 0; } .kg-text-button:hover { text-decoration: underline; } /* ------------------------------------------------------------------ canvas */ .kg-canvas-wrap { position: relative; background-color: var(--kg-canvas-bg); background-image: linear-gradient(var(--kg-grid-line) 1px, transparent 1px), linear-gradient(90deg, var(--kg-grid-line) 1px, transparent 1px), radial-gradient(circle at 50% 40%, var(--kg-canvas-glow), transparent 42%); background-size: 28px 28px, 28px 28px, auto; border: 1px solid var(--kg-border); border-radius: 18px; overflow: hidden; min-width: 0; min-height: 0; width: 100%; height: 100%; } .kg-canvas-shell { position: relative; min-width: 0; min-height: 0; } .kg-canvas { position: absolute; inset: 0; width: 100%; height: 100%; display: block; touch-action: none; } .kg-canvas-toolbar { position: absolute; top: 14px; left: 14px; z-index: 10; display: flex; align-items: center; flex-wrap: wrap; gap: 8px; } .kg-floating-pill { height: 32px; padding: 0 6px; border-radius: 999px; background: var(--kg-float-bg); border: 1px solid var(--kg-border); color: var(--kg-text-soft); font-size: 12px; display: inline-flex; align-items: center; gap: 2px; backdrop-filter: blur(12px); } .kg-pill-label { padding: 0 6px; color: var(--kg-text-muted); } .kg-pill-button { height: 24px; padding: 0 10px; border-radius: 999px; border: none; background: transparent; color: var(--kg-text-soft); font-size: 12px; cursor: pointer; display: inline-flex; align-items: center; gap: 4px; } .kg-pill-button:hover { color: var(--kg-text-strong); } .kg-pill-button.kg-pill-button-active { background: var(--kg-primary-soft-strong); color: var(--kg-text-strong); } .kg-explore-button { height: 32px; padding: 0 10px; border-radius: 999px; border: 1px solid var(--kg-border); background: var(--kg-float-bg); color: var(--kg-text-soft); font-size: 12px; cursor: pointer; display: inline-flex; align-items: center; gap: 6px; backdrop-filter: blur(12px); } .kg-explore-button:hover { background: var(--kg-primary-soft); color: var(--kg-text-strong); } .kg-explore-button:disabled { opacity: 0.45; cursor: not-allowed; } .kg-canvas-hint { position: absolute; left: 50%; bottom: 22px; z-index: 11; transform: translateX(-50%); max-width: min(560px, calc(100% - 48px)); padding: 8px 14px; border-radius: 999px; border: 1px solid var(--kg-pill-border); background: var(--kg-panel); color: var(--kg-primary-text); font-size: 12px; text-align: center; backdrop-filter: blur(12px); pointer-events: none; } .kg-side-rail-toggle { position: absolute; top: 50%; z-index: 20; width: 32px; min-height: 88px; border-radius: 12px; border: 1px solid var(--kg-pill-border); background: var(--kg-header-bg); color: var(--kg-primary-text); display: flex; align-items: center; justify-content: center; writing-mode: vertical-rl; letter-spacing: 4px; cursor: pointer; backdrop-filter: blur(12px); transform: translateY(-50%); } .kg-side-rail-toggle-left { left: 12px; } .kg-side-rail-toggle-right { right: 12px; } .kg-side-rail-toggle:hover { background: var(--kg-primary-soft-strong); color: var(--kg-text-strong); } .kg-minimap { position: absolute; right: 14px; bottom: 14px; width: 180px; height: 120px; border-radius: 12px; background: var(--kg-panel); border: 1px solid var(--kg-border); overflow: hidden; z-index: 10; pointer-events: none; } .kg-canvas-status { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px; text-align: center; color: var(--kg-text-secondary); padding: 32px; z-index: 5; } .kg-canvas-status-title { font-size: 16px; font-weight: 700; color: var(--kg-text-main); } .kg-canvas-status-desc { font-size: 13px; line-height: 1.8; max-width: 360px; color: var(--kg-text-muted); } /* ----------------------------------------------------------------- tooltip */ .kg-tooltip { position: fixed; z-index: 999; max-width: 320px; padding: 12px; border-radius: 12px; background: var(--kg-tooltip-bg); border: 1px solid var(--kg-pill-border); box-shadow: var(--kg-tooltip-shadow); color: var(--kg-text-main); pointer-events: none; backdrop-filter: blur(14px); } .kg-tooltip-title { font-size: 13px; font-weight: 700; margin-bottom: 6px; line-height: 1.5; } .kg-tooltip-desc { font-size: 12px; color: var(--kg-text-secondary); line-height: 1.6; display: flex; align-items: center; flex-wrap: wrap; gap: 6px; } .kg-tooltip-hint { margin-top: 8px; font-size: 11px; color: var(--kg-text-muted); } /* ------------------------------------------------------------------ detail */ .kg-detail-empty { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; color: var(--kg-text-muted); padding: 32px; gap: 10px; font-size: 13px; line-height: 1.8; } .kg-detail-empty-title { color: var(--kg-text-secondary); font-size: 14px; font-weight: 600; } .kg-detail-title { font-size: 17px; line-height: 1.5; font-weight: 800; color: var(--kg-text-strong); margin-bottom: 10px; word-break: break-word; } .kg-detail-type { display: inline-flex; height: 24px; padding: 0 9px; border-radius: 999px; font-size: 12px; align-items: center; gap: 6px; margin-right: 6px; margin-bottom: 12px; } .kg-detail-type-neutral { background: var(--kg-hover-bg); color: var(--kg-text-soft); } .kg-detail-type-primary { background: var(--kg-primary-soft); color: var(--kg-primary-accent); } .kg-detail-type-success { background: var(--kg-success-bg); color: var(--kg-success-text); } .kg-detail-type-warn { background: var(--kg-warn-bg); color: var(--kg-warn-text); } .kg-detail-summary { color: var(--kg-text-soft); font-size: 13px; line-height: 1.8; margin-bottom: 16px; word-break: break-word; } .kg-detail-meta { display: grid; grid-template-columns: 72px 1fr; row-gap: 8px; column-gap: 8px; font-size: 12px; margin-bottom: 16px; } .kg-detail-meta-label { color: var(--kg-text-muted); } .kg-detail-meta-value { color: var(--kg-text-soft); word-break: break-word; } .kg-tag-list { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 16px; } .kg-tag { height: 24px; padding: 0 8px; border-radius: 999px; background: var(--kg-hover-bg); color: var(--kg-text-soft); font-size: 12px; display: inline-flex; align-items: center; } .kg-detail-actions { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 18px; } .kg-detail-section-title { font-size: 12px; font-weight: 700; color: var(--kg-text-secondary); margin: 0 0 8px; } .kg-neighbor-list { display: flex; flex-direction: column; gap: 8px; } .kg-neighbor-item { padding: 8px 10px; border-radius: 10px; background: var(--kg-card-bg); border: 1px solid var(--kg-border-faint); cursor: pointer; display: flex; align-items: center; gap: 8px; } .kg-neighbor-item:hover { background: var(--kg-primary-soft-faint); border-color: var(--kg-primary-border); } .kg-neighbor-title { flex: 1; min-width: 0; font-size: 12px; color: var(--kg-text-soft); line-height: 1.5; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .kg-neighbor-relation { font-size: 11px; flex-shrink: 0; } /* ------------------------------------------------------------------ footer */ .kg-footer { min-height: 42px; margin: 0 12px 12px; border-radius: 14px; background: var(--kg-panel); border: 1px solid var(--kg-border); display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 4px 14px; color: var(--kg-text-secondary); font-size: 12px; flex-shrink: 0; flex-wrap: wrap; } .kg-legend { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; } .kg-legend-item { display: flex; align-items: center; gap: 6px; white-space: nowrap; } .kg-legend-dot { width: 9px; height: 9px; border-radius: 999px; } .kg-legend-line { width: 20px; height: 0; border-top-width: 2px; border-top-style: solid; border-radius: 999px; } .kg-footer-status { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; white-space: nowrap; } .kg-footer-selected { max-width: 240px; overflow: hidden; text-overflow: ellipsis; color: var(--kg-primary-text); } /* -------------------------------------------------------------- responsive */ @media (max-width: 1100px) { .kg-header .kg-button-text { display: none; } .kg-subtitle { display: none; } }