alopecia/css/twin.css

254 lines
17 KiB
CSS

/* =====================================================
twin.css — 단백질 디지털 트윈 추가 스타일 (style.css 보강)
===================================================== */
.ko-title { font-size: .55em; color: var(--text-muted); font-weight: 400; }
.app-footer {
margin: 30px 4px 12px; display: flex; justify-content: space-between;
flex-wrap: wrap; gap: 10px; color: var(--text-muted); font-size: .78rem;
border-top: 1px solid var(--border); padding-top: 16px;
}
.btn-ghost {
background: var(--surface); border: 1px solid var(--border); color: var(--text);
padding: 8px 14px; border-radius: var(--radius-sm); cursor: pointer; font-size: .82rem;
transition: .15s;
}
.btn-ghost:hover { background: var(--surface-hover); border-color: var(--border-bright); }
.mini-chip-list { display: flex; flex-wrap: wrap; gap: 6px; }
/* ---------------- TAB 1: PROTEIN TWIN ---------------- */
.twin-layout {
display: grid; grid-template-columns: 320px 1fr 300px; gap: 18px; align-items: start;
}
@media (max-width: 1200px) { .twin-layout { grid-template-columns: 1fr; } }
.twin-controls h2 { font-size: 1.15rem; }
.seg-control { display: flex; flex-direction: column; gap: 6px; }
.seg-btn {
text-align: left; padding: 10px 12px; border-radius: var(--radius-sm);
border: 1px solid var(--border); background: var(--surface); color: var(--text);
cursor: pointer; font-size: .85rem; transition: .15s;
}
.seg-btn:hover { background: var(--surface-hover); }
.seg-btn.active {
border-color: var(--border-bright); background: rgba(102,153,255,.14);
box-shadow: 0 0 0 1px var(--border-bright) inset;
}
.seg-btn .seg-sub { display: block; font-size: .72rem; color: var(--text-muted); margin-top: 2px; }
.chip-list { display: flex; flex-wrap: wrap; gap: 7px; }
.chip {
padding: 7px 11px; border-radius: 20px; border: 1px solid var(--border);
background: var(--surface); color: var(--text-muted); cursor: pointer;
font-size: .78rem; transition: .15s; user-select: none;
}
.chip:hover { background: var(--surface-hover); color: var(--text); }
.chip.active {
background: linear-gradient(135deg, var(--primary), var(--accent));
color: #fff; border-color: transparent; font-weight: 600;
}
.chip.disabled { opacity: .35; cursor: not-allowed; }
.disease-desc {
margin-top: 12px; padding: 10px 12px; border-radius: var(--radius-sm);
background: rgba(34,211,238,.06); border: 1px solid rgba(34,211,238,.18);
font-size: .8rem; color: var(--text); line-height: 1.5;
}
.metrics-row { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 14px; }
.metric-card {
padding: 12px; border-radius: var(--radius-sm); background: var(--surface);
border: 1px solid var(--border); text-align: center;
}
.metric-card .mv { font-size: 1.5rem; font-weight: 800; font-family: 'Outfit'; }
.metric-card .ml { font-size: .68rem; color: var(--text-muted); margin-top: 2px; }
.metric-card.good .mv { color: var(--success); }
.metric-card.warn .mv { color: var(--warn); }
.metric-card.bad .mv { color: var(--danger); }
.tracked-genes { margin-top: 16px; }
.tracked-genes h4 { font-size: .8rem; color: var(--text-muted); margin-bottom: 8px; }
.gene-pill {
padding: 4px 9px; border-radius: 6px; background: rgba(168,85,247,.14);
border: 1px solid rgba(168,85,247,.3); color: #d8b4fe; font-size: .74rem;
font-family: 'JetBrains Mono', monospace; cursor: pointer;
}
.gene-pill:hover { background: rgba(168,85,247,.26); }
.twin-viz .viz-head, .twin-side .viz-head {
display: flex; justify-content: space-between; align-items: center;
margin: 6px 0 8px;
}
.twin-viz .viz-head h3, .twin-side h3 { font-size: .95rem; }
.chart-box { position: relative; height: 240px; }
.chart-box.small { height: 180px; }
.slider-group { margin: 12px 0; }
.slider-group label {
display: flex; justify-content: space-between; font-size: .78rem;
color: var(--text-muted); margin-bottom: 5px;
}
.slider-group label span { color: var(--accent2); font-family: 'JetBrains Mono'; }
.slider-group input[type=range] { width: 100%; accent-color: var(--primary); }
/* ---------------- TAB 2: PROTEIN ATLAS ---------------- */
.atlas-layout { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; align-items: start; }
@media (max-width: 1000px) { .atlas-layout { grid-template-columns: 1fr; } }
.atlas-controls { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 10px; }
.atlas-controls .search-input { flex: 1 1 180px; }
.atlas-count { font-size: .78rem; color: var(--text-muted); margin-bottom: 10px; }
.atlas-grid {
display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
gap: 10px; max-height: 70vh; overflow-y: auto; padding-right: 4px;
}
.prot-card {
padding: 11px; border-radius: var(--radius-sm); border: 1px solid var(--border);
background: var(--surface); cursor: pointer; transition: .15s; position: relative;
}
.prot-card:hover { background: var(--surface-hover); border-color: var(--border-bright); transform: translateY(-2px); }
.prot-card.selected { border-color: var(--primary); box-shadow: 0 0 0 1px var(--primary) inset; }
.prot-card .pc-gene { font-family: 'JetBrains Mono'; font-weight: 600; font-size: .95rem; }
.prot-card .pc-name { font-size: .68rem; color: var(--text-muted); margin: 3px 0 6px;
display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.prot-card .pc-tags { display: flex; flex-wrap: wrap; gap: 4px; }
.axis-tag {
font-size: .62rem; padding: 2px 6px; border-radius: 5px; font-weight: 600;
}
.role-driver { color: #fca5a5; } .role-protector { color: #86efac; } .role-modulator { color: #93c5fd; }
.pc-ev { position: absolute; top: 8px; right: 9px; font-size: .62rem; color: var(--text-muted); }
.pc-seed { position: absolute; top: 8px; right: 9px; font-size: .6rem; color: var(--accent);}
.atlas-detail-panel { min-height: 500px; }
.detail-head { display: flex; justify-content: space-between; align-items: flex-start; gap: 12px; }
.detail-head h2 { font-family: 'JetBrains Mono'; font-size: 1.6rem; }
.d-name { color: var(--text-muted); font-size: .85rem; margin-top: 2px; }
.detail-badges { display: flex; flex-wrap: wrap; gap: 6px; justify-content: flex-end; }
.dbadge { font-size: .68rem; padding: 3px 9px; border-radius: 6px; border: 1px solid var(--border); background: var(--surface); }
.ngl-viewer {
width: 100%; height: 320px; margin: 14px 0 6px; border-radius: var(--radius-sm);
background: #05070e; border: 1px solid var(--border); position: relative; overflow: hidden;
}
.ngl-viewer .ngl-loading {
position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;
color: var(--text-muted); font-size: .82rem;
}
.plddt-legend { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; font-size: .68rem; color: var(--text-muted); }
.plddt-legend .lg { padding: 2px 7px; border-radius: 4px; color: #06121f; font-weight: 600; }
.lg-vh { background: #0053d6; color: #fff; } .lg-c { background: #65cbf3; } .lg-l { background: #ffdb13; } .lg-vl { background: #ff7d45; }
.plddt-val { margin-left: auto; color: var(--text); font-weight: 600; }
.detail-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin: 14px 0; }
.detail-grid .dg { padding: 9px 11px; border-radius: var(--radius-sm); background: var(--surface); border: 1px solid var(--border); }
.detail-grid .dg .k { font-size: .66rem; color: var(--text-muted); }
.detail-grid .dg .v { font-size: .86rem; font-weight: 600; margin-top: 2px; }
.detail-section { margin: 12px 0; }
.detail-section h4 { font-size: .82rem; color: var(--text-muted); margin-bottom: 6px; }
.detail-section p { font-size: .85rem; line-height: 1.55; }
.evidence-list { display: flex; flex-direction: column; gap: 6px; max-height: 180px; overflow-y: auto; }
.evidence-item { font-size: .76rem; padding: 7px 9px; border-radius: 7px; background: var(--surface); border: 1px solid var(--border); }
.evidence-item .ey { color: var(--accent2); font-family: 'JetBrains Mono'; margin-right: 6px; }
.detail-links { display: flex; gap: 8px; margin-top: 12px; }
.detail-links a {
flex: 1; text-align: center; padding: 9px; border-radius: var(--radius-sm);
border: 1px solid var(--border-bright); background: rgba(102,153,255,.1);
color: var(--primary); text-decoration: none; font-size: .8rem; font-weight: 600;
}
.detail-links a:hover { background: rgba(102,153,255,.2); }
/* ---------------- TAB 3: KNOWLEDGE GRAPH ---------------- */
.graph-controls { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: center; gap: 12px; margin-bottom: 8px; }
.graph-legend, .graph-filters { display: flex; flex-wrap: wrap; gap: 12px; align-items: center; font-size: .76rem; }
.graph-filters label { display: flex; align-items: center; gap: 5px; color: var(--text-muted); }
.gl { display: flex; align-items: center; gap: 5px; color: var(--text-muted); }
.gl::before { content: ''; width: 11px; height: 11px; border-radius: 50%; display: inline-block; }
.gl-protein::before { background: #6699ff; } .gl-pathway::before { background: #a855f7; }
.gl-disease::before { background: #f87171; } .gl-axis::before { background: #22d3ee; }
.gl-drug::before { background: #34d399; }
#graph-canvas { width: 100%; height: 68vh; display: block; border-radius: var(--radius-sm); background: radial-gradient(circle at 50% 40%, #0a1020, #05070e); cursor: grab; }
.graph-tooltip {
position: fixed; pointer-events: none; z-index: 100; padding: 8px 11px;
background: rgba(8,12,22,.95); border: 1px solid var(--border-bright);
border-radius: 8px; font-size: .76rem; max-width: 260px; box-shadow: var(--shadow);
}
.graph-tooltip .tt-title { font-weight: 700; font-family: 'JetBrains Mono'; margin-bottom: 3px; }
.graph-tooltip .tt-sub { color: var(--text-muted); font-size: .7rem; }
/* ---------------- NEW PAPERS ---------------- */
.newpapers-section { margin-top: 22px; }
.newpapers-section h3 { font-size: 1rem; margin-bottom: 10px; }
.newpapers-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 10px; }
.newpaper-card { padding: 11px 13px; border-radius: var(--radius-sm); background: var(--surface); border: 1px solid var(--border); }
.newpaper-card .np-title { font-size: .82rem; font-weight: 600; line-height: 1.4; }
.newpaper-card .np-meta { font-size: .7rem; color: var(--text-muted); margin-top: 5px; }
.newpaper-card .np-target { color: var(--accent2); font-family: 'JetBrains Mono'; }
.targets-cell { display: flex; flex-wrap: wrap; gap: 4px; }
.targets-cell .tg { font-size: .68rem; font-family: 'JetBrains Mono'; padding: 1px 5px; border-radius: 4px; background: rgba(102,153,255,.12); color: #9db8ff; }
/* ---------------- CALIBRATION TAB ---------------- */
.cal-head { display: flex; justify-content: space-between; align-items: flex-start; gap: 16px; flex-wrap: wrap; }
.cal-target-sel { display: flex; flex-direction: column; gap: 5px; min-width: 240px; }
.cal-target-sel label { font-size: .72rem; color: var(--text-muted); }
.cal-summary { display: flex; flex-wrap: wrap; gap: 10px; margin: 16px 0; }
.cal-card { padding: 12px 16px; border-radius: var(--radius-sm); background: var(--surface); border: 1px solid var(--border); min-width: 110px; }
.cal-card.big { background: linear-gradient(135deg, rgba(102,153,255,.16), rgba(168,85,247,.12)); border-color: var(--border-bright); }
.cal-card .mv { font-size: 1.7rem; font-weight: 800; font-family: 'Outfit'; color: var(--accent2); }
.cal-card.big .mv { color: #fff; }
.cal-card .mv-sm { font-size: .72rem; color: var(--text); font-family: 'JetBrains Mono'; }
.cal-card .ml { font-size: .68rem; color: var(--text-muted); margin-top: 3px; }
.cal-card.wide { flex: 1; min-width: 260px; }
.cal-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: 12px; margin: 8px 0 18px; }
.cal-axis-card { padding: 10px; border-radius: var(--radius-sm); background: var(--surface); border: 1px solid var(--border); }
.cal-axis-head { display: flex; justify-content: space-between; align-items: center; font-size: .82rem; margin-bottom: 6px; }
.cal-r2 { font-size: .68rem; padding: 2px 7px; border-radius: 5px; font-family: 'JetBrains Mono'; }
.cal-r2.good { background: rgba(52,211,153,.18); color: #86efac; }
.cal-r2.warn { background: rgba(251,191,36,.18); color: #fcd34d; }
.cal-r2.bad { background: rgba(248,113,113,.18); color: #fca5a5; }
.cal-axis-chart { height: 130px; position: relative; }
.cal-foot { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
@media (max-width: 900px) { .cal-foot { grid-template-columns: 1fr; } }
.cal-foot h4 { font-size: .85rem; color: var(--text-muted); margin-bottom: 8px; }
.cal-param-table { max-height: 280px; overflow-y: auto; font-family: 'JetBrains Mono'; font-size: .72rem; }
.cal-prow { display: grid; grid-template-columns: 1.4fr 1fr 1fr; gap: 6px; padding: 4px 8px; border-bottom: 1px solid var(--border); }
.cal-prow:nth-child(odd) { background: rgba(255,255,255,.02); }
.cal-prow .pk { color: var(--text); } .cal-prow .pi { color: var(--text-muted); } .cal-prow .pa { color: var(--accent2); font-weight: 600; }
.cal-param-table::before { content: '파라미터 / 상대표준오차 / COPASI 추정'; display: block; font-size: .66rem; color: var(--text-muted); padding: 4px 8px; }
.cal-provenance { font-size: .76rem; color: var(--text-muted); line-height: 1.5; max-height: 280px; overflow-y: auto; }
.cal-provenance ul { padding-left: 18px; margin-top: 6px; } .cal-provenance li { margin-bottom: 4px; }
.cal-note { font-style: italic; margin-bottom: 8px; color: var(--text); }
.cal-banner { margin: 6px 0 14px; padding: 11px 14px; border-radius: var(--radius-sm); background: rgba(251,191,36,.08); border: 1px solid rgba(251,191,36,.25); font-size: .78rem; line-height: 1.55; color: var(--text); }
.cal-banner i { color: var(--text-muted); }
.pflag { font-size: .6rem; color: var(--warn); }
/* ---------------- CYCLE-COUPLED (COMBINE) ---------------- */
.cal-coupled-section { margin-top: 22px; border-top: 1px solid var(--border); padding-top: 16px; }
.cal-coupled-section h4 { font-size: .95rem; margin-bottom: 4px; }
.cal-coupled { display: flex; flex-direction: column; gap: 7px; margin-top: 10px; }
.coupled-row { display: grid; grid-template-columns: 220px 1fr 170px; gap: 10px; align-items: center; font-size: .78rem; }
.coupled-lab { color: var(--text); font-family: 'JetBrains Mono'; font-size: .72rem; }
.coupled-bar-wrap { height: 14px; background: var(--surface); border-radius: 7px; overflow: hidden; border: 1px solid var(--border); }
.coupled-bar { display: block; height: 100%; border-radius: 7px; transition: width .4s; }
.coupled-bar.good { background: linear-gradient(90deg, #34d399, #22d3ee); }
.coupled-bar.warn { background: linear-gradient(90deg, #fbbf24, #fb923c); }
.coupled-bar.bad { background: linear-gradient(90deg, #f87171, #ef4444); }
.coupled-val { color: var(--text-muted); font-size: .72rem; text-align: right; }
@media (max-width: 700px) { .coupled-row { grid-template-columns: 1fr; gap: 3px; } }
/* ---------------- FULL-TEXT GROUNDING ---------------- */
.grounding-list { display: flex; flex-direction: column; gap: 7px; max-height: 240px; overflow-y: auto; }
.grounding-item { padding: 8px 10px; border-radius: 8px; background: rgba(52,211,153,.06); border: 1px solid rgba(52,211,153,.2); }
.gr-paper { font-size: .73rem; color: #86efac; font-weight: 600; margin-bottom: 4px; }
.gr-hits { color: var(--text-muted); font-weight: 400; font-size: .66rem; }
.gr-quote { font-size: .73rem; color: var(--text); line-height: 1.45; font-style: italic; opacity: .9; }
/* ---------------- INDEPENDENT VALIDATION ---------------- */
.cal-validation { margin: 6px 0 16px; padding: 14px 16px; border-radius: var(--radius-sm); background: linear-gradient(135deg, rgba(52,211,153,.1), rgba(34,211,238,.06)); border: 1px solid rgba(52,211,153,.3); }
.val-head { font-size: .95rem; font-weight: 700; margin-bottom: 12px; }
.val-cards { display: flex; flex-wrap: wrap; gap: 10px; }
.val-card { padding: 10px 14px; border-radius: var(--radius-sm); background: var(--surface); border: 1px solid var(--border); min-width: 110px; }
.val-card.big { background: rgba(52,211,153,.16); border-color: rgba(52,211,153,.4); }
.val-card .vv { font-size: 1.5rem; font-weight: 800; font-family: 'Outfit'; color: var(--success); }
.val-card .vl { font-size: .66rem; color: var(--text-muted); margin-top: 3px; }
.val-note { font-size: .74rem; color: var(--text); margin-top: 10px; line-height: 1.5; }
.val-note.dim { color: var(--text-muted); font-size: .7rem; }
.val-pm { font-size: .76rem; color: var(--text); margin-top: 9px; padding: 8px 11px; border-radius: 8px; background: rgba(102,153,255,.08); border: 1px solid rgba(102,153,255,.2); line-height: 1.5; }
.val-pm b { color: var(--accent2); }