vignette/apps/web/src/pages/professor.css

1895 lines
40 KiB
CSS

.pf-root{
max-width:1280px;
margin:0 auto;
display:flex;
flex-direction:column;
gap:16px;
}
.pf-root--analysis{
max-width:1440px;
}
.pf-head{
display:flex;
align-items:flex-end;
justify-content:space-between;
gap:var(--sp-4);
flex-wrap:wrap;
}
.pf-head__actions{
display:flex;
align-items:center;
justify-content:flex-end;
gap:8px;
flex-wrap:wrap;
}
.pf-head h1{
margin:6px 0 0;
color:var(--text-strong);
font-size:var(--fs-h2);
line-height:1.28;
letter-spacing:0;
}
.pf-head p{
margin:6px 0 0;
max-width:760px;
color:var(--text-body);
font-size:var(--fs-xs);
line-height:1.55;
}
.pf-signal-strip{
order:1;
display:grid;
grid-template-columns:1fr;
gap:0;
min-width:0;
}
.pf-triage{
display:grid;
grid-template-columns:auto minmax(0,1fr) auto;
align-items:center;
gap:12px;
min-width:0;
padding:14px 16px;
border:1px solid var(--hair);
border-radius:var(--radius);
background:var(--bg-surface);
box-shadow:var(--shadow-sm);
}
.pf-triage.is-active{
background:color-mix(in srgb,var(--accent-tint) 42%,var(--bg-surface));
}
.pf-triage__copy{
min-width:0;
}
.pf-triage__copy .vg-kicker{
margin-bottom:4px;
}
.pf-triage__copy b{
display:block;
color:var(--text-strong);
font-size:var(--fs-body);
line-height:1.35;
}
.pf-triage__copy span,
.pf-triage__meta small{
color:var(--text-muted);
font-size:var(--fs-xs);
}
.pf-triage__meta{
display:grid;
grid-template-columns:repeat(2,minmax(0,1fr));
gap:0;
min-width:180px;
border:1px solid var(--border-subtle);
border-radius:var(--radius);
background:color-mix(in srgb,var(--bg-surface) 86%,transparent);
overflow:hidden;
}
.pf-triage__meta span{
display:grid;
align-content:center;
gap:2px;
padding:9px 12px;
}
.pf-triage__meta span + span{
border-left:1px solid var(--hair);
}
.pf-triage__meta b{
color:var(--text-strong);
font-family:var(--font-num);
font-size:17px;
line-height:1;
}
.pf-error{
display:flex;
align-items:center;
gap:10px;
padding:12px 14px;
border-radius:var(--radius);
background:var(--crit-tint);
color:var(--crit-text);
font-size:var(--fs-sm);
}
.pf-kpis{
display:grid;
grid-template-columns:repeat(6,minmax(0,1fr));
border:1px solid var(--hair);
border-radius:var(--radius);
overflow:hidden;
background:var(--bg-surface);
box-shadow:var(--shadow-sm);
}
.pf-kpi{
position:relative;
min-width:0;
padding:14px 16px;
display:grid;
grid-template-columns:minmax(0,1fr) auto;
gap:4px 10px;
}
.pf-kpi:nth-child(n+2){border-left:1px solid var(--hair);}
.pf-kpi:nth-child(n+4){border-top:0;}
.pf-kpi--primary,
.pf-kpi--warn{
background:color-mix(in srgb,var(--accent-tint) 32%,var(--bg-surface));
}
.pf-kpi--warn{
background:color-mix(in srgb,var(--warn-tint) 36%,var(--bg-surface));
}
.pf-kpi--primary .pf-kpi__ic{
color:var(--text-on-accent);
background:var(--accent);
}
.pf-kpi--warn .pf-kpi__ic{
color:var(--warn-text);
background:var(--warn-tint);
}
.pf-kpi__ic{
grid-column:2;
grid-row:1 / span 3;
width:30px;
height:30px;
display:grid;
place-items:center;
border-radius:var(--radius);
color:var(--accent);
background:var(--accent-tint);
}
.pf-kpi__lab{
display:block;
color:var(--text-muted);
font-size:var(--fs-xs);
font-weight:700;
}
.pf-kpi b{
display:block;
color:var(--text-strong);
font-family:var(--font-num);
font-size:24px;
line-height:1;
}
.pf-kpi small{
color:var(--text-muted);
font-size:12px;
line-height:1.35;
}
.pf-workspace{
order:4;
display:grid;
grid-template-columns:minmax(320px,390px) minmax(0,1fr);
align-items:start;
gap:14px;
min-width:0;
}
.pf-analysis-page{
order:2;
display:flex;
flex-direction:column;
gap:12px;
min-width:0;
}
.pf-analysis-workbench{
min-width:0;
display:flex;
flex-direction:column;
gap:10px;
}
.pf-analysis-detail-head{
display:grid;
grid-template-columns:auto minmax(0,1fr);
gap:10px;
align-items:center;
min-width:0;
}
.pf-depth-strip{
display:grid;
grid-template-columns:repeat(3,minmax(0,1fr));
min-width:0;
border:1px solid var(--hair);
border-radius:var(--radius);
overflow:hidden;
background:var(--bg-surface);
box-shadow:var(--shadow-sm);
}
.pf-depth-strip span{
min-width:0;
display:flex;
align-items:center;
gap:7px;
padding:10px 12px;
color:var(--text-muted);
font-size:var(--fs-xs);
font-weight:760;
white-space:nowrap;
}
.pf-depth-strip span + span{
border-left:1px solid var(--hair);
}
.pf-depth-strip small{
width:22px;
height:22px;
display:grid;
place-items:center;
border-radius:var(--radius-sm);
color:var(--text-muted);
background:var(--bg-surface-2);
font-family:var(--font-num);
line-height:1;
}
.pf-depth-strip .is-current{
color:var(--text-strong);
background:color-mix(in srgb,var(--accent-tint) 36%,var(--bg-surface));
}
.pf-depth-strip .is-current small{
color:var(--text-on-accent);
background:var(--accent);
}
.pf-queue-stack{
display:flex;
flex-direction:column;
gap:14px;
min-width:0;
}
.pf-section{
display:flex;
flex-direction:column;
gap:10px;
min-width:0;
}
.pf-section__head{
display:flex;
align-items:flex-end;
justify-content:space-between;
gap:12px;
}
.pf-section__head h2{
margin:4px 0 0;
color:var(--text-strong);
font-size:var(--fs-body);
font-weight:700;
line-height:1.3;
letter-spacing:0;
}
.pf-panel{
padding:0;
overflow:hidden;
}
.pf-studio-card{
display:grid;
grid-template-columns:minmax(0,1fr) auto;
gap:14px;
align-items:center;
padding:14px;
background:linear-gradient(180deg,var(--bg-surface),color-mix(in srgb,var(--accent-tint) 18%,var(--bg-surface)));
}
.pf-studio-card__copy{
min-width:0;
display:grid;
gap:7px;
}
.pf-studio-card__copy b{
color:var(--text-strong);
font-size:var(--fs-body);
}
.pf-studio-card__copy p{
margin:0;
color:var(--text-muted);
font-size:var(--fs-xs);
line-height:1.55;
}
.pf-studio-card__meta{
display:flex;
flex-wrap:wrap;
gap:6px;
}
.pf-studio-card__meta span{
padding:4px 7px;
border:1px solid var(--hair);
border-radius:var(--radius-sm);
color:var(--text-body);
background:var(--bg-surface-2);
font-size:11px;
line-height:1.2;
}
.pf-studio-card__actions{
display:flex;
justify-content:flex-end;
}
.pf-section--growth{
order:2;
min-width:0;
}
.pf-section--learner-analysis{
order:3;
min-width:0;
}
.pf-growth-panel{
background:linear-gradient(180deg,var(--bg-surface),color-mix(in srgb,var(--accent-tint) 18%,var(--bg-surface)));
}
.pf-learner-overview{
background:linear-gradient(180deg,var(--bg-surface),color-mix(in srgb,var(--bg-surface-2) 72%,var(--bg-surface)));
}
.pf-learner-toolbar{
display:grid;
grid-template-columns:minmax(240px,.72fr) auto;
gap:10px;
align-items:center;
padding:12px;
border-bottom:1px solid var(--hair);
background:color-mix(in srgb,var(--bg-surface) 86%,var(--bg-surface-2));
}
.pf-search-field{
min-width:0;
display:grid;
grid-template-columns:auto minmax(0,1fr);
gap:8px;
align-items:center;
padding:9px 10px;
border:1px solid var(--paper-2);
border-radius:var(--radius);
color:var(--text-muted);
background:var(--bg-surface-2);
}
.pf-search-field input{
min-width:0;
border:0;
outline:0;
color:var(--text-strong);
background:transparent;
font:inherit;
font-size:var(--fs-sm);
}
.pf-search-field input::placeholder{
color:var(--text-muted);
}
.pf-sort-segment{
display:flex;
align-items:center;
justify-content:flex-end;
gap:0;
border:1px solid var(--paper-2);
border-radius:var(--radius);
overflow:hidden;
background:var(--bg-surface-2);
}
.pf-sort-segment button{
min-height:38px;
padding:0 11px;
border:0;
border-left:1px solid var(--hair);
color:var(--text-muted);
background:transparent;
font:inherit;
font-size:var(--fs-xs);
font-weight:760;
cursor:pointer;
white-space:nowrap;
}
.pf-sort-segment button:first-child{
border-left:0;
}
.pf-sort-segment button:hover,
.pf-sort-segment button:focus-visible{
color:var(--text-strong);
background:var(--bg-surface);
}
.pf-sort-segment button:focus-visible{
outline:2px solid var(--accent);
outline-offset:-2px;
}
.pf-sort-segment button.is-active{
color:var(--text-on-accent);
background:var(--accent);
}
.pf-learner-table{
min-width:0;
display:flex;
flex-direction:column;
/* 세로 가상화 스크롤 컨테이너. height:auto + max-height라 행이 적으면
내용 높이만 차지해 데드스페이스가 생기지 않는다. */
max-height:64vh;
overflow-x:auto;
overflow-y:auto;
scrollbar-gutter:stable;
}
/* 가상화 본문 — 전체 목록 높이를 확보하는 relative 캔버스.
column flex 컨테이너가 인라인 height를 축소하지 않도록 flex:none이 필수다. */
.pf-learner-table__body{
position:relative;
flex:none;
min-width:1000px;
}
.pf-learner-table__body .pf-learner-record{
position:absolute;
top:0;
left:0;
width:100%;
}
.pf-learner-table__head,
.pf-learner-row{
display:grid;
grid-template-columns:
minmax(178px,1.3fr)
minmax(86px,.55fr)
minmax(76px,.48fr)
minmax(64px,.42fr)
minmax(76px,.48fr)
minmax(70px,.42fr)
minmax(112px,.72fr)
48px
minmax(104px,.5fr);
gap:9px;
align-items:center;
min-width:1000px;
}
.pf-learner-table__head{
position:sticky;
top:0;
z-index:1;
padding:9px 12px;
border-bottom:1px solid var(--hair);
color:var(--text-muted);
background:var(--bg-surface);
font-size:var(--fs-xs);
font-weight:800;
white-space:nowrap;
}
.pf-learner-record{
min-width:1000px;
border-top:1px solid var(--paper-2);
}
/* 가상화로 첫 행이 헤더의 형제가 아니게 되어 data-index 기준으로 상단 이중선을 막는다. */
.pf-learner-record[data-index="0"]{
border-top:0;
}
.pf-learner-row{
padding:10px 12px;
}
.pf-learner-record:hover .pf-learner-row,
.pf-learner-record.is-expanded .pf-learner-row{
background:color-mix(in srgb,var(--accent-tint) 14%,transparent);
}
.pf-learner-row__id,
.pf-learner-row__metric,
.pf-learner-row__trend,
.pf-learner-row__tag-summary,
.pf-learner-row__tags{
min-width:0;
}
/* 암시적 컬럼(auto = minmax(auto,max-content))은 자식의 width:max-content 요청을
그대로 수용해 셀 폭(261px)을 넘겨 288px까지 늘어났고, 그 결과 max-width:100%가
확장된 트랙 기준으로 풀려 ellipsis가 걸리지 않고 옆 컬럼을 침범했다.
트랙을 minmax(0,1fr)로 고정해야 셀 안에서 잘린다. (2026-07-27 겹침 회귀 수정) */
.pf-learner-row__id,
.pf-learner-row__metric,
.pf-learner-row__tag-summary{
grid-template-columns:minmax(0,1fr);
}
.pf-learner-row__id{
display:grid;
gap:3px;
}
.pf-learner-name-button{
width:max-content;
max-width:100%;
/* 상세 진입의 주 조작이다. 줄높이만큼(19px)이면 WCAG 2.2 SC 2.5.8(24px)에
미달해 세로 여백으로 타깃을 채운다. */
min-height:24px;
padding:3px 0;
border:0;
color:var(--text-strong);
background:transparent;
font:inherit;
font-size:var(--fs-sm);
font-weight:820;
line-height:1.35;
text-align:left;
cursor:pointer;
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
}
.pf-learner-name-button:hover,
.pf-learner-name-button:focus-visible{
color:var(--accent-deep);
text-decoration:underline;
text-underline-offset:3px;
}
.pf-learner-name-button:focus-visible{
outline:2px solid var(--accent);
outline-offset:2px;
}
.pf-learner-row__id span,
.pf-learner-row__metric span,
.pf-learner-row__tag-summary span{
color:var(--text-muted);
font-size:11px;
line-height:1.3;
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
}
.pf-learner-row__metric{
display:grid;
gap:3px;
}
.pf-learner-row__metric::before,
.pf-learner-row__trend::before,
.pf-learner-row__tag-summary::before,
.pf-learner-row__tags::before{
display:none;
content:attr(data-label);
color:var(--text-muted);
font-size:var(--fs-xs);
font-weight:800;
}
.pf-learner-row__metric b{
color:var(--text-strong);
font-family:var(--font-num);
font-size:15px;
line-height:1.15;
white-space:nowrap;
}
.pf-learner-row__trend{
display:flex;
align-items:center;
min-height:30px;
}
.pf-learner-row__tag-summary{
display:grid;
gap:3px;
}
.pf-learner-row__tag-summary b{
min-width:0;
color:var(--text-body);
font-size:var(--fs-xs);
font-weight:760;
line-height:1.25;
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
}
.pf-learner-spark{
min-width:0;
height:46px;
display:flex;
align-items:flex-end;
gap:4px;
padding:6px 6px 4px;
border:1px solid var(--paper-2);
border-radius:var(--radius-sm);
background:var(--bg-surface-2);
}
.pf-learner-spark .pf-growth-bar{
min-width:10px;
}
.pf-learner-spark .pf-growth-bar small{
display:none;
}
.pf-learner-row__tags{
display:flex;
flex-wrap:wrap;
gap:5px;
}
.pf-learner-row__tags span{
max-width:100%;
padding:4px 7px;
border:1px solid var(--paper-2);
border-radius:999px;
color:var(--text-body);
background:var(--bg-surface-2);
font-size:11px;
line-height:1.2;
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
}
.pf-learner-row__expand{
display:flex;
justify-content:center;
}
.pf-icon-action{
width:34px;
height:34px;
display:inline-grid;
place-items:center;
border:1px solid var(--paper-2);
border-radius:var(--radius-sm);
color:var(--text-muted);
background:var(--bg-surface-2);
cursor:pointer;
}
.pf-icon-action:hover,
.pf-icon-action:focus-visible,
.pf-icon-action[aria-expanded="true"]{
color:var(--accent-deep);
border-color:var(--accent);
background:var(--accent-tint);
}
.pf-icon-action:focus-visible{
outline:2px solid var(--accent);
outline-offset:2px;
}
.pf-learner-row__action{
display:flex;
justify-content:flex-end;
}
.pf-learner-row__action .vg-btn{
min-width:96px;
padding-inline:10px;
}
.pf-learner-row-detail{
min-width:1000px;
display:grid;
grid-template-columns:minmax(260px,1.4fr) minmax(140px,.72fr) minmax(170px,.85fr) minmax(190px,1fr);
gap:0;
padding:0 12px 12px;
background:color-mix(in srgb,var(--accent-tint) 12%,transparent);
}
.pf-learner-detail-item{
min-width:0;
display:grid;
align-content:start;
gap:5px;
padding:11px 12px;
border-top:1px solid var(--hair);
border-left:1px solid var(--hair);
background:color-mix(in srgb,var(--bg-surface) 90%,var(--bg-surface-2));
}
.pf-learner-detail-item:first-child{
border-left:0;
}
.pf-learner-detail-item > span{
color:var(--text-muted);
font-size:var(--fs-xs);
font-weight:800;
line-height:1.25;
}
.pf-learner-detail-item > b{
min-width:0;
color:var(--text-strong);
font-family:var(--font-num);
font-size:14px;
line-height:1.2;
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
}
.pf-learner-detail-item > small{
color:var(--text-muted);
font-size:11px;
line-height:1.3;
}
.pf-learner-detail-item--trend{
gap:8px;
}
.pf-learner-detail-item--tags .pf-learner-row__tags{
align-self:center;
}
.pf-recent__review-state{
color:var(--text-muted);
font-size:12px;
line-height:1.4;
}
/* [D3] "기록 대기 · 검토 대기"의 가운뎃점을 없애고 두 상태를 공백 컬럼으로 나란히 둔다. */
.pf-recent__review-state{
display:flex;
flex-wrap:wrap;
gap:0 10px;
margin-top:3px;
line-height:1.2;
}
.pf-growth-bar{
flex:1 1 0;
min-width:14px;
height:100%;
display:grid;
grid-template-rows:minmax(0,1fr) 14px;
gap:4px;
align-items:end;
}
.pf-growth-bar i{
display:block;
width:100%;
min-height:6px;
border-radius:6px 6px 3px 3px;
background:linear-gradient(180deg,var(--accent),var(--accent-deep));
}
.pf-growth-bar.is-empty i{
background:repeating-linear-gradient(135deg,var(--paper-2),var(--paper-2) 3px,var(--hair) 3px,var(--hair) 6px);
}
.pf-growth-bar small{
color:var(--text-muted);
font-family:var(--font-num);
font-size:10px;
text-align:center;
line-height:1;
}
.pf-analysis-panel{
background:linear-gradient(180deg,var(--bg-surface),color-mix(in srgb,var(--bg-surface-2) 72%,var(--bg-surface)));
}
.pf-analysis{
min-width:0;
display:grid;
gap:12px;
padding:12px;
}
.pf-analysis-tabs{
min-width:0;
display:grid;
grid-template-columns:repeat(3,minmax(0,1fr));
border:1px solid var(--paper-2);
border-radius:var(--radius-sm);
overflow:hidden;
background:var(--bg-surface-2);
}
.pf-analysis-tabs button{
min-width:0;
min-height:48px;
display:grid;
gap:3px;
align-content:center;
padding:8px 12px;
border:0;
border-left:1px solid var(--hair);
color:var(--text-muted);
background:transparent;
font:inherit;
text-align:left;
cursor:pointer;
}
.pf-analysis-tabs button:first-child{
border-left:0;
}
.pf-analysis-tabs button:hover,
.pf-analysis-tabs button:focus-visible{
background:var(--bg-surface);
}
.pf-analysis-tabs button:focus-visible{
outline:2px solid var(--accent);
outline-offset:-2px;
}
.pf-analysis-tabs button.is-active{
color:var(--text-strong);
background:color-mix(in srgb,var(--accent-tint) 32%,var(--bg-surface));
}
.pf-analysis-tabs b{
font-size:var(--fs-sm);
line-height:1.2;
}
.pf-analysis-tabs span{
color:var(--text-muted);
font-size:11px;
line-height:1.2;
}
.pf-analysis__top{
min-width:0;
display:grid;
grid-template-columns:minmax(210px,.42fr) minmax(0,1fr);
gap:12px;
align-items:stretch;
}
.pf-analysis__title{
min-width:0;
display:grid;
align-content:center;
gap:5px;
padding:12px;
border:1px solid var(--paper-2);
border-radius:var(--radius-sm);
background:var(--bg-surface-2);
}
.pf-analysis__title b{
color:var(--text-strong);
font-size:var(--fs-body);
line-height:1.35;
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
}
.pf-analysis__title span{
color:var(--text-muted);
font-size:var(--fs-xs);
line-height:1.45;
overflow-wrap:anywhere;
}
.pf-analysis__metrics{
min-width:0;
display:grid;
grid-template-columns:repeat(6,minmax(0,1fr));
border:1px solid var(--paper-2);
border-radius:var(--radius-sm);
background:var(--bg-surface-2);
overflow:hidden;
}
.pf-analysis__metrics span{
min-width:0;
display:grid;
align-content:center;
gap:4px;
padding:10px 11px;
}
.pf-analysis__metrics span + span{
border-left:1px solid var(--hair);
}
.pf-analysis__metrics small,
.pf-stage-item small,
.pf-timeline-row__metrics small{
color:var(--text-muted);
font-size:11px;
line-height:1.2;
}
.pf-analysis__metrics b,
.pf-stage-item b,
.pf-timeline-row__metrics b{
min-width:0;
color:var(--text-strong);
font-family:var(--font-num);
font-size:15px;
line-height:1.15;
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;
}
.pf-analysis__chart,
.pf-analysis__stages,
.pf-analysis__personas,
.pf-analysis__timeline{
min-width:0;
border:1px solid var(--paper-2);
border-radius:var(--radius-sm);
background:color-mix(in srgb,var(--bg-surface) 84%,var(--bg-surface-2));
overflow:hidden;
}
.pf-analysis__subhead{
display:flex;
align-items:center;
justify-content:space-between;
gap:10px;
min-width:0;
padding:10px 12px;
border-bottom:1px solid var(--hair);
}
.pf-analysis__subhead b{
color:var(--text-strong);
font-size:var(--fs-sm);
line-height:1.35;
}
.pf-analysis__subhead span{
color:var(--text-muted);
font-size:var(--fs-xs);
white-space:nowrap;
}
.pf-analysis-bars{
height:118px;
display:flex;
align-items:flex-end;
gap:7px;
padding:12px;
overflow-x:auto;
scrollbar-gutter:stable;
}
.pf-analysis-bars .pf-growth-bar{
flex:0 0 34px;
}
.pf-stage-list{
display:grid;
grid-template-columns:repeat(4,minmax(0,1fr));
}
.pf-stage-item{
min-width:0;
display:grid;
gap:4px;
padding:12px;
border-left:1px solid var(--hair);
}
.pf-stage-item:first-child{
border-left:0;
}
.pf-stage-item span{
color:var(--text-muted);
font-size:var(--fs-xs);
font-weight:700;
}
.pf-persona-drill{
display:flex;
flex-direction:column;
max-height:min(580px,62vh);
overflow:auto;
scrollbar-gutter:stable;
}
.pf-persona-group{
min-width:0;
border-top:1px solid var(--paper-2);
}
.pf-persona-group:first-child{
border-top:0;
}
.pf-persona-group__summary{
width:100%;
min-width:0;
display:grid;
grid-template-columns:44px minmax(160px,1fr) minmax(260px,.92fr) auto;
gap:10px;
align-items:center;
padding:12px;
border:0;
background:transparent;
color:inherit;
font:inherit;
text-align:left;
cursor:pointer;
}
.pf-persona-group__summary:hover,
.pf-persona-group.is-open .pf-persona-group__summary{
background:var(--bg-surface-2);
}
.pf-persona-group__summary:focus-visible{
outline:2px solid var(--accent);
outline-offset:-2px;
}
.pf-persona-group__code{
width:38px;
height:34px;
display:grid;
place-items:center;
border-radius:var(--radius-sm);
color:var(--accent-deep);
background:var(--accent-tint);
font-family:var(--font-num);
font-size:12px;
font-weight:830;
}
.pf-persona-group__main{
min-width:0;
display:grid;
gap:4px;
}
.pf-persona-group__main b{
color:var(--text-strong);
font-size:var(--fs-sm);
line-height:1.35;
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
}
.pf-persona-group__main small{
color:var(--text-muted);
font-size:12px;
line-height:1.35;
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
}
.pf-persona-group__metrics{
min-width:0;
display:grid;
grid-template-columns:repeat(4,minmax(58px,1fr));
gap:7px;
}
.pf-persona-group__metrics span{
min-width:0;
display:grid;
gap:3px;
}
.pf-persona-group__metrics small{
color:var(--text-muted);
font-size:11px;
line-height:1.2;
}
.pf-persona-group__metrics b{
min-width:0;
color:var(--text-strong);
font-family:var(--font-num);
font-size:15px;
line-height:1.15;
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;
}
.pf-persona-group__open{
display:inline-flex;
align-items:center;
justify-content:center;
gap:4px;
min-height:30px;
padding:0 8px;
border:1px solid var(--hair);
border-radius:var(--radius-sm);
color:var(--accent-deep);
background:var(--accent-tint);
font-size:var(--fs-xs);
font-weight:760;
white-space:nowrap;
}
.pf-persona-group__summary:hover .pf-persona-group__open{
border-color:var(--accent);
}
.pf-persona-sessions{
margin:0 12px 12px 56px;
border:1px solid var(--paper-2);
border-radius:var(--radius-sm);
overflow:hidden;
background:var(--bg-surface);
}
.pf-persona-sessions .pf-timeline-row{
grid-template-columns:34px minmax(150px,1fr) minmax(200px,.82fr) minmax(104px,.42fr) auto;
padding:10px;
}
.pf-persona-sessions .pf-timeline-row__step{
width:28px;
height:28px;
}
.pf-timeline{
max-height:min(520px,58vh);
overflow:auto;
scrollbar-gutter:stable;
display:flex;
flex-direction:column;
}
.pf-timeline-row{
width:100%;
font:inherit;
text-align:left;
color:inherit;
background:transparent;
display:grid;
grid-template-columns:38px minmax(170px,1fr) minmax(210px,.82fr) minmax(112px,.42fr) auto;
gap:10px;
align-items:center;
padding:12px;
border:0;
border-top:1px solid var(--paper-2);
cursor:pointer;
}
.pf-timeline-row:first-child{
border-top:0;
}
.pf-timeline-row:hover{
background:var(--bg-surface-2);
}
.pf-timeline-row:focus-visible{
outline:2px solid var(--accent);
outline-offset:-2px;
}
.pf-timeline-row__step{
width:32px;
height:32px;
display:grid;
place-items:center;
border-radius:var(--radius-sm);
color:var(--accent-deep);
background:var(--accent-tint);
font-family:var(--font-num);
font-weight:800;
}
.pf-timeline-row__main{
min-width:0;
display:grid;
gap:3px;
}
.pf-timeline-row__main b{
color:var(--text-strong);
font-size:var(--fs-sm);
line-height:1.35;
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
}
.pf-timeline-row__main span,
.pf-timeline-row__main code,
.pf-timeline-row__dates span{
color:var(--text-muted);
font-size:12px;
line-height:1.35;
}
.pf-timeline-row__main span{
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
}
.pf-timeline-row__main code{
font-family:var(--font-num);
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
}
.pf-timeline-row__metrics{
min-width:0;
display:grid;
grid-template-columns:minmax(58px,.8fr) minmax(58px,.8fr) minmax(86px,1.12fr);
gap:7px;
}
.pf-timeline-row__metrics span{
min-width:0;
display:grid;
gap:3px;
}
.pf-timeline-row__metrics .vg-badge{
justify-self:start;
white-space:nowrap;
}
.pf-timeline-row__dates{
display:grid;
gap:3px;
min-width:0;
font-family:var(--font-num);
}
.pf-timeline-row__open{
display:inline-flex;
align-items:center;
justify-content:center;
gap:4px;
min-height:30px;
padding:0 8px;
border:1px solid var(--hair);
border-radius:var(--radius-sm);
color:var(--accent-deep);
background:var(--accent-tint);
font-size:var(--fs-xs);
font-weight:760;
white-space:nowrap;
}
.pf-timeline-row:hover .pf-timeline-row__open{
border-color:var(--accent);
}
.pf-empty{
min-height:118px;
display:grid;
place-items:center;
gap:6px;
padding:var(--sp-5);
text-align:center;
}
.pf-empty b{
color:var(--text-strong);
font-size:var(--fs-body);
}
.pf-empty span{
color:var(--text-muted);
font-size:var(--fs-xs);
}
.pf-list{
max-height:min(320px,42vh);
overflow:auto;
scrollbar-gutter:stable;
display:flex;
flex-direction:column;
}
.pf-personas{
max-height:min(320px,42vh);
overflow:auto;
scrollbar-gutter:stable;
display:flex;
flex-direction:column;
}
.pf-persona{
display:grid;
grid-template-columns:minmax(0,1fr);
gap:8px;
align-items:start;
padding:12px;
border-top:1px solid var(--paper-2);
}
.pf-persona:first-child{border-top:0;}
.pf-persona__main{
min-width:0;
display:grid;
grid-template-columns:40px minmax(0,1fr);
gap:10px;
align-items:center;
}
.pf-persona__code{
width:40px;
height:32px;
display:grid;
place-items:center;
border-radius:var(--radius);
color:var(--accent-deep);
background:var(--accent-tint);
font-family:var(--font-num);
font-weight:800;
font-size:12px;
}
.pf-persona__main b{
display:block;
color:var(--text-strong);
font-size:var(--fs-sm);
line-height:1.35;
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
}
.pf-persona__main span,
.pf-persona p,
.pf-persona__meta span{
color:var(--text-muted);
font-size:var(--fs-xs);
line-height:1.45;
}
.pf-persona p{
margin:0;
min-width:0;
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
}
.pf-persona__meta{
display:flex;
align-items:center;
gap:10px;
justify-content:space-between;
white-space:nowrap;
}
.pf-persona__actions{
display:flex;
justify-content:flex-end;
gap:8px;
min-width:0;
}
.pf-persona__actions .vg-btn{
min-width:72px;
padding-inline:10px;
}
.pf-alerts{
max-height:min(300px,38vh);
overflow:auto;
scrollbar-gutter:stable;
display:flex;
flex-direction:column;
}
.pf-alert{
display:grid;
grid-template-columns:auto minmax(0,1fr) auto;
gap:10px;
align-items:center;
padding:12px;
border-top:1px solid var(--paper-2);
background:color-mix(in srgb,var(--warn-tint) 34%,transparent);
}
.pf-alert:first-child{border-top:0;}
.pf-alert__ic{
width:30px;
height:30px;
display:grid;
place-items:center;
border-radius:var(--radius);
color:var(--warn-text);
background:var(--warn-tint);
}
.pf-alert__main{
min-width:0;
display:grid;
gap:3px;
}
.pf-alert__main b{
color:var(--text-strong);
font-size:var(--fs-sm);
}
.pf-alert__main span,
.pf-alert__main code,
.pf-alert__resource span{
color:var(--text-muted);
font-size:12px;
}
.pf-alert__main code{
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
}
.pf-alert__resource{
display:grid;
gap:2px;
justify-items:end;
min-width:86px;
}
.pf-alert__resource b{
color:var(--warn-text);
font-family:var(--font-num);
font-size:18px;
}
.pf-session{
width:100%;
font:inherit;
text-align:left;
background:transparent;
color:inherit;
display:grid;
grid-template-columns:8px minmax(0,1fr) auto;
gap:8px 10px;
align-items:start;
padding:12px;
border:0;
border-top:1px solid var(--paper-2);
cursor:default;
}
.pf-session:first-child{border-top:0;}
.pf-session--action{
cursor:pointer;
}
.pf-session--action:hover{
background:var(--bg-surface-2);
}
.pf-session--action:focus-visible{
outline:2px solid var(--accent);
outline-offset:-2px;
}
.pf-session__dot{
width:8px;
height:8px;
border-radius:50%;
background:var(--accent);
}
.pf-session__main{
min-width:0;
display:flex;
flex-direction:column;
gap:3px;
}
.pf-session__main b{
color:var(--text-strong);
font-size:var(--fs-sm);
}
.pf-session__main span,.pf-session__main code{
color:var(--text-muted);
font-size:var(--fs-xs);
overflow-wrap:anywhere;
}
.pf-session__main code,.pf-recent__learner code{
font-family:var(--font-num);
overflow:hidden;
text-overflow:ellipsis;
}
.pf-session__meta{
grid-column:2 / 4;
display:flex;
align-items:center;
justify-content:space-between;
gap:8px;
color:var(--text-muted);
font-family:var(--font-num);
font-size:var(--fs-xs);
white-space:normal;
}
.pf-session__open{
grid-column:3;
grid-row:1;
display:inline-flex;
align-items:center;
gap:5px;
align-self:center;
justify-self:end;
min-height:30px;
padding:0 9px;
border:1px solid var(--hair);
border-radius:var(--radius-sm);
color:var(--accent-deep);
background:var(--accent-tint);
font-size:var(--fs-xs);
font-weight:760;
white-space:nowrap;
}
.pf-session--action:hover .pf-session__open{
border-color:var(--accent);
}
.pf-recent-list{
max-height:min(620px,calc(100vh - 220px));
overflow:auto;
scrollbar-gutter:stable;
min-width:0;
}
.pf-recent-head,
.pf-recent-row{
display:grid;
grid-template-columns:
minmax(128px,1.25fr)
minmax(58px,.55fr)
minmax(66px,.55fr)
minmax(82px,.85fr)
minmax(32px,.35fr)
minmax(70px,.6fr)
minmax(66px,.55fr)
minmax(86px,.65fr);
align-items:center;
gap:8px;
min-width:0;
}
.pf-recent-head{
position:sticky;
top:0;
z-index:1;
color:var(--text-muted);
font-size:var(--fs-xs);
font-weight:700;
padding:9px 12px;
border-bottom:1px solid var(--hair);
background:var(--bg-surface);
white-space:nowrap;
}
.pf-recent-row{
width:100%;
font:inherit;
text-align:left;
color:inherit;
background:transparent;
padding:10px 12px;
border:0;
border-top:1px solid var(--paper-2);
}
.pf-recent-row--action{
cursor:pointer;
}
.pf-recent-row--action:hover{
background:var(--bg-surface-2);
}
.pf-recent-row--action:focus-visible{
outline:2px solid var(--accent);
outline-offset:-2px;
}
.pf-recent-head + .pf-recent-row{
border-top:0;
}
.pf-recent__learner,
.pf-recent__cell{
min-width:0;
color:var(--text-body);
font-size:var(--fs-sm);
overflow-wrap:anywhere;
}
.pf-recent__cell::before{
display:none;
}
.pf-recent__learner{
min-width:0;
display:flex;
flex-direction:column;
gap:3px;
}
.pf-recent__learner b{
color:var(--text-strong);
font-size:var(--fs-sm);
line-height:1.35;
overflow-wrap:anywhere;
}
.pf-recent__learner code{
max-width:100%;
color:var(--text-muted);
font-size:11px;
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;
}
.pf-recent__cell .vg-badge{
justify-self:start;
}
.pf-recent__cell--open{
display:flex;
justify-content:flex-end;
}
.pf-recent__open{
display:inline-flex;
align-items:center;
justify-content:center;
gap:4px;
min-height:30px;
padding:0 7px;
border:1px solid var(--hair);
border-radius:var(--radius-sm);
color:var(--accent-deep);
background:var(--accent-tint);
font-size:var(--fs-xs);
font-weight:760;
white-space:nowrap;
}
.pf-recent-row--action:hover .pf-recent__open{
border-color:var(--accent);
}
/* =====================================================================
2026-07-27 화면 정리 — D1(dot 밀도) / D3(가운뎃점) / D5(빈 상태 중립 기호)
===================================================================== */
/* [D5] 값이 없는 칸은 "평가 부족" 같은 부정어 대신 중립 기호 "-"를 쓰고, muted 로
눌러 값이 실제로 있는 행이 도드라지게 한다. 셀의 <b>/<small>이 text-strong 을
지정하므로 .pf-root 를 앞에 붙여 우선순위를 확보한다. */
.pf-root .pf-empty-mark{
color:var(--text-muted);
font-weight:600;
}
/* [D5] 빈 칸의 뜻을 표 상단에서 한 번만 설명하는 안내 줄. */
.pf-table-note{
margin:0;
padding:8px 12px;
border-bottom:1px solid var(--hair);
color:var(--text-muted);
background:color-mix(in srgb,var(--bg-surface) 86%,var(--bg-surface-2));
font-size:var(--fs-xs);
line-height:1.45;
}
/* [D3] 한 줄에 가운뎃점 1개. 남은 정보는 공백 컬럼으로 분리한다. */
.pf-session__facts,
.pf-persona__facts,
.pf-persona-group__facts,
.pf-timeline-row__facts,
.pf-alert__facts{
min-width:0;
display:flex;
flex-wrap:wrap;
gap:0 12px;
}
/* 분리된 컬럼도 원래대로 셀 안에서 잘리게 유지한다(겹침 회귀 방지). */
.pf-persona-group__facts > span,
.pf-timeline-row__facts > span{
min-width:0;
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
}
@media (max-width:1100px){
.pf-signal-strip,
.pf-workspace{
grid-template-columns:1fr;
}
.pf-triage{
grid-template-columns:auto minmax(0,max-content) auto;
justify-content:start;
}
.pf-kpis{
grid-template-columns:repeat(4,minmax(0,1fr));
}
.pf-kpi:nth-child(n+2){border-left:1px solid var(--hair);}
.pf-kpi:nth-child(n+4){border-top:0;}
.pf-learner-toolbar{
grid-template-columns:1fr;
}
.pf-sort-segment{
justify-content:flex-start;
overflow:auto;
scrollbar-gutter:stable;
}
.pf-learner-table{
background:var(--bg-surface-2);
}
.pf-analysis__top{
grid-template-columns:1fr;
}
.pf-analysis__metrics{
grid-template-columns:repeat(3,minmax(0,1fr));
}
.pf-analysis__metrics span:nth-child(3n+1){
border-left:0;
}
.pf-analysis__metrics span:nth-child(n+4){
border-top:1px solid var(--hair);
}
.pf-persona-group__summary{
grid-template-columns:44px minmax(0,1fr) auto;
}
.pf-persona-group__metrics{
grid-column:2 / 4;
grid-row:2;
}
.pf-persona-sessions .pf-timeline-row{
grid-template-columns:34px minmax(0,1fr) minmax(190px,.85fr) auto;
}
.pf-timeline-row{
grid-template-columns:34px minmax(0,1fr) minmax(190px,.85fr) auto;
}
.pf-timeline-row__dates{
grid-column:2 / 4;
grid-row:2;
grid-template-columns:repeat(2,minmax(0,1fr));
}
.pf-list,
.pf-personas{
max-height:360px;
}
.pf-recent-list{
max-height:460px;
}
}
@media (max-width:860px){
.pf-head__actions{
width:100%;
justify-content:flex-start;
}
.pf-analysis-detail-head{
grid-template-columns:1fr;
}
.pf-depth-strip{
grid-template-columns:repeat(2,minmax(0,1fr));
}
.pf-depth-strip span:nth-child(odd){
border-left:0;
}
.pf-depth-strip span:nth-child(n+3){
border-top:1px solid var(--hair);
}
.pf-triage{
grid-template-columns:auto minmax(0,1fr);
}
.pf-triage__meta{
grid-column:1 / -1;
width:100%;
}
.pf-kpis{grid-template-columns:repeat(2,minmax(0,1fr));}
.pf-kpi:nth-child(n+2){border-left:0;}
.pf-kpi:nth-child(even){border-left:1px solid var(--hair);}
.pf-kpi:nth-child(n+3){border-top:1px solid var(--hair);}
.pf-analysis{
padding:10px;
}
.pf-analysis-tabs{
grid-template-columns:1fr;
}
.pf-analysis-tabs button,
.pf-analysis-tabs button:first-child{
border-left:0;
}
.pf-analysis-tabs button:nth-child(n+2){
border-top:1px solid var(--hair);
}
.pf-analysis__metrics{
grid-template-columns:repeat(2,minmax(0,1fr));
}
.pf-analysis__metrics span,
.pf-analysis__metrics span:nth-child(3n+1){
border-left:0;
}
.pf-analysis__metrics span:nth-child(even){
border-left:1px solid var(--hair);
}
.pf-analysis__metrics span:nth-child(n+3){
border-top:1px solid var(--hair);
}
.pf-stage-list{
grid-template-columns:repeat(2,minmax(0,1fr));
}
.pf-stage-item,
.pf-stage-item:first-child{
border-left:0;
}
.pf-stage-item:nth-child(even){
border-left:1px solid var(--hair);
}
.pf-stage-item:nth-child(n+3){
border-top:1px solid var(--hair);
}
.pf-persona-drill{
max-height:560px;
}
.pf-persona-group__summary{
grid-template-columns:38px minmax(0,1fr);
align-items:start;
}
.pf-persona-group__metrics,
.pf-persona-group__open{
grid-column:2;
}
.pf-persona-group__metrics{
grid-row:auto;
grid-template-columns:repeat(4,minmax(0,1fr));
}
.pf-persona-group__open{
justify-self:start;
}
.pf-persona-sessions{
margin:0 10px 10px 48px;
}
.pf-persona-sessions .pf-timeline-row{
grid-template-columns:34px minmax(0,1fr);
align-items:start;
}
.pf-timeline{
max-height:560px;
}
.pf-timeline-row{
grid-template-columns:34px minmax(0,1fr);
align-items:start;
}
.pf-timeline-row__main{
grid-column:2;
}
.pf-timeline-row__metrics,
.pf-timeline-row__dates,
.pf-timeline-row__open{
grid-column:2;
}
.pf-timeline-row__metrics{
grid-template-columns:repeat(3,minmax(0,1fr));
}
.pf-timeline-row__dates{
grid-row:auto;
}
.pf-timeline-row__open{
justify-self:start;
}
.pf-recent-list{
display:flex;
flex-direction:column;
gap:10px;
padding:10px;
background:var(--bg-surface-2);
overflow-x:hidden;
}
.pf-recent-head{
display:none;
}
.pf-recent-row{
display:grid;
grid-template-columns:repeat(2,minmax(0,1fr));
gap:10px 12px;
padding:12px;
border:1px solid var(--paper-2);
border-radius:var(--radius);
background:var(--bg-surface);
}
.pf-recent__learner{
grid-column:1 / -1;
padding-bottom:10px;
border-bottom:1px solid var(--paper-2);
}
.pf-recent__learner code{
white-space:normal;
overflow-wrap:anywhere;
}
.pf-recent__cell{
display:grid;
grid-template-columns:minmax(74px,.4fr) minmax(0,1fr);
gap:8px;
align-items:center;
}
.pf-recent__cell--open{
justify-content:stretch;
}
.pf-recent__cell::before{
display:block;
content:attr(data-label);
color:var(--text-muted);
font-size:var(--fs-xs);
font-weight:700;
line-height:1.35;
}
.pf-session{
grid-template-columns:8px minmax(0,1fr);
}
.pf-session__meta{
grid-column:2;
justify-content:flex-start;
}
.pf-session__open{
grid-column:2;
grid-row:auto;
justify-self:start;
}
}
@media (max-width:520px){
.pf-kpis{grid-template-columns:repeat(2,minmax(0,1fr));}
.pf-kpi,
.pf-kpi + .pf-kpi{border-left:0;}
.pf-kpi:nth-child(even){border-left:1px solid var(--hair);}
.pf-kpi:nth-child(n+3){border-top:1px solid var(--hair);}
.pf-persona__actions{
display:grid;
grid-template-columns:repeat(2,minmax(0,1fr));
}
.pf-persona__actions .vg-btn{
width:100%;
}
.pf-depth-strip{
grid-template-columns:1fr;
}
.pf-depth-strip span,
.pf-depth-strip span:nth-child(odd){
border-left:0;
}
.pf-depth-strip span:nth-child(n+2){
border-top:1px solid var(--hair);
}
.pf-learner-toolbar{
padding:10px;
}
.pf-sort-segment{
display:grid;
grid-template-columns:repeat(2,minmax(0,1fr));
overflow:hidden;
}
.pf-sort-segment button,
.pf-sort-segment button:first-child{
border-left:0;
}
.pf-sort-segment button:nth-child(even){
border-left:1px solid var(--hair);
}
.pf-sort-segment button:nth-child(n+3){
border-top:1px solid var(--hair);
}
.pf-analysis__metrics{
grid-template-columns:1fr;
}
.pf-analysis__metrics span,
.pf-analysis__metrics span:nth-child(even),
.pf-analysis__metrics span:nth-child(3n+1){
border-left:0;
}
.pf-analysis__metrics span:nth-child(n+2){
border-top:1px solid var(--hair);
}
.pf-stage-list{
grid-template-columns:1fr;
}
.pf-stage-item,
.pf-stage-item:nth-child(even),
.pf-stage-item:first-child{
border-left:0;
}
.pf-stage-item:nth-child(n+2){
border-top:1px solid var(--hair);
}
.pf-persona-group__summary{
grid-template-columns:1fr;
}
.pf-persona-group__code{
width:auto;
min-width:38px;
justify-self:start;
padding:0 10px;
}
.pf-persona-group__metrics,
.pf-persona-group__open{
grid-column:1;
}
.pf-persona-group__metrics{
grid-template-columns:repeat(2,minmax(0,1fr));
}
.pf-persona-sessions{
margin:0 8px 8px;
}
.pf-persona-sessions .pf-timeline-row__metrics{
grid-template-columns:1fr;
}
.pf-timeline-row__metrics{
grid-template-columns:1fr;
}
.pf-timeline-row__dates{
grid-template-columns:1fr;
}
.pf-alert{
grid-template-columns:auto minmax(0,1fr);
}
.pf-alert__resource{
grid-column:2;
justify-items:start;
}
.pf-recent-list{
padding:8px;
}
.pf-recent-row{
grid-template-columns:1fr;
gap:10px;
}
.pf-recent__cell{
grid-template-columns:minmax(64px,.32fr) minmax(0,1fr);
}
.pf-recent__cell--open .pf-recent__open{
justify-self:start;
}
}