vignette/apps/web/src/pages/session/session.css
Yun Chan f0c2240ffa 회기 전 자기점검 게이트 화면 재설계와 시간 만료 상태 대비·오버레이 수정
pre 게이트 카드가 행 높이만큼 늘어나면서 base flex의 align-items:center가
살아남아 3축 블록이 1fr 행 한가운데 떠 있었다. 1920x1080에서 카드의 66.5%가
빈 공간이고 축 위아래로 각 277px의 죽은 여백이 생겼다. 척도 라벨은 0.54rem에
nowrap+ellipsis라 901~1279px에서 최대 12개가 잘렸고, 620px 이하에서는 15개
전부 display:none으로 사라져 숫자만 남았다. 320x568에서는 접힌 mid 전용 40px
고정 행이 게이트에도 걸려 카드가 눌리고 헤더와 축이 겹쳤다.

- 게이트 카드는 align-self:center + max-height:100% + 내부 스크롤로 중앙에 서고
  높이는 내용이 정한다
- 3열 격자를 축별 세로 스택(질문 한 줄 + 전폭 5칸 척도)으로 바꿔 어느 폭에서도
  라벨을 자르거나 숨기지 않는다. word-break:keep-all + overflow-wrap:normal로
  어절 경계에서만 줄바꿈한다
- 정보가 없던 3 AXES 배지를 제출 버튼이 왜 잠겨 있는지 답하는 0/3 진행 표시로
  교체한다
- 40px 고정 행 규칙을 :not(.sx-alliance-gated)로 접힌 mid 전용으로 되돌린다
- 선택 상태 글자색을 반투명 --surface에서 --text-on-accent로 고친다

시간 만료 상태에서 드러난 네 결함도 함께 닫는다. sx-timebar와 종료 모달 패널은
다크 stage 팔레트 시절 잔재로, 정의된 적 없는 --bg-panel의 하드코딩 다크 폴백
위에 테마 토큰 글자를 얹어 라이트에서 대비가 1.13:1까지 떨어졌다. 의미색 토큰과
불투명 표면으로 되돌렸다. sx-page--active > * 의 position:relative가 같은
특이도로 뒤에 있어 종료 모달의 fixed를 덮어써 오버레이가 1532x32px 띠로 눌렸고,
게이트 행 정의는 :has() 두 개짜리 규칙보다 특이도가 낮아 시간 만료 바가 뜨면
밀려나 빈 트랙이 남았다. 둘 다 선택자를 맞춰 정정했다.

계측: 빈 공간 0.665→0.127, 라벨 잘림 12→0, 숨김 15→0, 최소 탭 46x60,
가로 오버플로 0. 배너 대비 1.13→13.88, 모달 제목 2.68→15.79(다크 13.86/15.18).
검증: typecheck, session-layout+alliance-pulse+layout-visual-gate 31/31,
시간만료 종료 다이얼로그 2/2, pre/mid 잠금 2/2, full-sweep+self-directed 30 pass.
남은 음성 4건은 baseline에서도 동일 실패하는 기존 회귀다.
2026-08-08 11:20:01 +09:00

5843 lines
148 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* =====================================================================
Session 페이지 전용 스타일 (이 페이지에서만 사용. 공통 ui.css 와 분리)
토큰: 공통 의미는 tokens.css, 몰입형 dark stage와 아트 합성 색은 이 파일의
.sx-page--active 국소 팔레트가 소유한다. raw color는 디자인 SSOT 게이트의
고정 예산을 넘길 수 없다. DESIGN_CONCEPT §0.3, §5 3-column 골격.
철칙: border-left 0 · 이모지 0(아이콘 inline SVG) · 카드격자 덤프 0 ·
순흑/순백 금지 · 둥근모서리 과다 금지 · 강조는 weight/tint/kicker/dot ·
한 화면 한 목적(= 가상 내담자와 듣고 말하기). 빨강은 종료에만.
===================================================================== */
.sx-page {
width: 100%;
max-width: none;
margin: 0 auto;
height: calc(100vh - var(--topbar-h));
height: calc(100dvh - var(--topbar-h));
min-height: 0;
padding: var(--sp-5) var(--sp-5) var(--sp-4);
overflow: hidden;
display: grid;
grid-template-rows: auto minmax(0, 1fr) auto;
gap: var(--sp-4);
position: relative;
isolation: isolate;
word-break: keep-all;
overflow-wrap: break-word;
background:
linear-gradient(135deg, rgba(251, 250, 248, 0.94), rgba(244, 242, 238, 0.9)),
var(--asset-warm-elements) center / cover no-repeat;
}
.sx-page,
.sx-page * {
box-sizing: border-box;
}
.sx-page--prestart {
height: auto;
min-height: 0;
grid-template-rows: auto auto;
overflow: visible;
color: var(--text-strong);
background: transparent;
padding: 0;
}
/* 프리플라이트(목표 선택 포함)는 데스크톱에서 문서 스크롤 없이 한 화면에 들어가야 한다.
셸 기본 패딩(48/64)이 과해 세로가 수 px 넘치던 회귀 수정 (2026-07-15). */
.vg-main:has(.sx-page--prestart) {
padding-top: var(--sp-5);
padding-bottom: var(--sp-5);
}
.sx-page--active {
height: 100vh;
height: 100dvh;
grid-template-rows: min-content minmax(0, 1fr) min-content;
padding: 10px 14px 14px;
gap: 10px;
background:
radial-gradient(circle at 18% 8%, color-mix(in srgb, var(--accent) 11%, transparent), transparent 28%),
radial-gradient(circle at 86% 12%, color-mix(in srgb, var(--clay) 8%, transparent), transparent 24%),
var(--glass-canvas);
color: var(--text-strong);
}
.sx-page--active:has(.sx-timebar) {
grid-template-rows: min-content min-content min-content minmax(0, 1fr) min-content;
}
/* 게이트 상태의 행 정의는 아래 :has() 두 개짜리 규칙(0,3,0)보다 특이도가 낮아
시간 만료 바가 뜨는 순간 밀려났다. 그러면 숨긴 축어록·컨트롤바의 빈 트랙이
그대로 남아 화면 절반이 비어 보인다. 같은 :has()를 붙여 항상 이기게 한다. */
.sx-page--active.sx-alliance-gated,
.sx-page--active.sx-alliance-gated:has(> .sx-alliance-checkpoint-slot) {
grid-template-rows: min-content minmax(0, 1fr);
}
.sx-page--active.sx-alliance-gated:has(> .sx-timebar):has(> .sx-alliance-checkpoint-slot) {
grid-template-rows: min-content min-content minmax(0, 1fr);
}
.sx-page--active.sx-alliance-gated .sx-grid {
display: none;
}
.sx-page--active.sx-alliance-gated .sx-controlbar {
display: none;
}
/* 게이트 카드는 행 높이만큼 늘리지 않는다. 예전에는 stretch + 1fr 축 행이라
1920×1080에서 카드의 66%가 빈 공간이었고 축 블록이 허공에 떠 보였다.
이제 카드는 내용 높이로 화면 중앙에 서고, 넘칠 때만 카드 안에서 스크롤한다. */
.sx-page--active.sx-alliance-gated .sx-alliance-checkpoint {
min-height: 0;
max-height: 100%;
margin: 0 auto;
overflow-y: auto;
overscroll-behavior: contain;
align-self: center;
}
.sx-page--active.sx-alliance-gated .sx-alliance-checkpoint.is-expanded {
display: block;
}
[data-theme="light"] .sx-page--active {
color-scheme: light;
}
[data-theme="dark"] .sx-page--active {
color-scheme: dark;
}
.sx-page--active .sx-grid {
height: auto;
width: min(100%, 1460px);
margin: 0 auto;
}
.sx-page--active .sx-head {
display: none;
}
.sx-sessionbar {
width: min(100%, 1460px);
min-height: 44px;
margin: 0 auto;
padding: 6px 8px;
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
border: 1px solid var(--glass-border);
border-radius: var(--radius);
background: var(--glass-specular), var(--glass-surface-strong);
color: var(--text-body);
box-shadow: var(--glass-edge-shadow), var(--glass-shadow);
backdrop-filter: blur(12px);
min-width: 0;
}
.sx-sessionbar button {
min-height: 32px;
padding: 7px 10px;
border: 1px solid var(--glass-inset-border);
border-radius: var(--radius-sm);
background: var(--glass-specular-inset), var(--glass-surface-inset);
color: var(--text-strong);
display: inline-flex;
align-items: center;
justify-content: center;
gap: 6px;
font: 700 12.5px/1 var(--font-sans);
white-space: nowrap;
cursor: pointer;
}
.sx-sessionbar button:hover {
background: var(--accent-tint);
}
.sx-sessionbar__back {
flex: none;
}
.sx-sessionbar__meta {
flex: 1 1 auto;
min-width: 0;
display: flex;
align-items: center;
justify-content: center;
gap: 9px;
text-align: left;
}
.sx-sessionbar__meta span:last-child {
min-width: 0;
display: flex;
flex-direction: column;
gap: 2px;
}
.sx-sessionbar__meta b {
color: var(--text-strong);
font-size: 13px;
line-height: 1.15;
}
/* D3 — "이름 · 단계 · 경과" 한 줄(· 2개)을 "이름 · 단계" + "경과" 두 칸으로 분리했다.
두 칸을 gap 으로 띄워 가운뎃점 없이도 구분되게 한다. */
.sx-sessionbar__meta small {
color: var(--text-muted);
font: 600 11px/1.2 var(--font-sans);
display: flex;
align-items: baseline;
gap: 10px;
min-width: 0;
overflow: hidden;
}
.sx-sessionbar__meta small span {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* 바깥 .sx-sessionbar__meta span:last-child(세로 스택) 규칙이 안쪽 span 까지 잡지
않도록 여기서 다시 눌러 준다. */
.sx-sessionbar__meta small span:last-child {
display: block;
flex: none;
font-variant-numeric: tabular-nums;
}
.sx-sessionbar__dot {
width: 8px;
height: 8px;
border-radius: 50%;
flex: none;
background: var(--pos-solid);
box-shadow: 0 0 0 4px rgba(69, 165, 127, 0.14);
}
.sx-sessionbar__dot.is-ended {
background: var(--warn-solid);
box-shadow: 0 0 0 4px rgba(181, 123, 45, 0.16);
}
.sx-sessionbar__actions {
flex: none;
display: flex;
align-items: center;
gap: 7px;
}
.sx-sessionbar .sx-sessionbar__review {
border-color: color-mix(in srgb, var(--accent) 36%, var(--glass-inset-border));
background: var(--accent-tint);
color: var(--accent-deep);
}
/* ── 페이지 헤드라인 + 가로 회기 단계 미니 트랙 ── */
.sx-head {
display: flex;
align-items: flex-end;
justify-content: space-between;
gap: var(--sp-5);
flex-wrap: wrap;
}
.sx-head__lt .sx-head__kicker {
margin-bottom: var(--sp-2);
}
.sx-head__title {
font-size: 28px;
font-weight: 700;
letter-spacing: 0;
color: var(--text-strong);
line-height: 1.3;
}
.sx-head__title em {
font-style: normal;
color: var(--accent-deep);
}
.sx-head__sub {
font-size: var(--fs-sm);
color: var(--text-muted);
margin-top: 5px;
max-width: 540px;
}
/* 가로 단계 미니 (헤드 우측) — 현재만 또렷 */
.sx-phases {
display: flex;
align-items: center;
flex: none;
}
.sx-ph {
display: flex;
align-items: center;
gap: 9px;
padding: 0 2px;
}
.sx-ph__dot {
width: 11px;
height: 11px;
border-radius: 50%;
flex: none;
position: relative;
background: var(--bg-surface);
border: 2px solid var(--neutral-200);
}
.sx-ph.is-done .sx-ph__dot {
background: var(--accent-bright);
border-color: var(--accent-bright);
}
.sx-ph.is-cur .sx-ph__dot {
border-color: var(--accent);
}
.sx-ph.is-cur .sx-ph__dot::after {
content: "";
position: absolute;
inset: 2px;
border-radius: 50%;
background: var(--accent);
}
.sx-ph__meta {
display: flex;
flex-direction: column;
line-height: 1.2;
}
.sx-ph__name {
font-size: 13px;
font-weight: 500;
color: var(--text-muted);
}
.sx-ph.is-done .sx-ph__name {
color: var(--text-body);
}
.sx-ph.is-cur .sx-ph__name {
color: var(--text-strong);
font-weight: 700;
}
.sx-ph__t {
font-size: 10.5px;
color: var(--text-muted);
font-family: var(--font-num);
font-variant-numeric: tabular-nums;
margin-top: 1px;
}
.sx-ph.is-cur .sx-ph__t {
color: var(--accent);
}
.sx-ph__link {
width: 28px;
height: 1px;
background: var(--hair);
margin: 0 4px;
align-self: center;
margin-top: -12px;
}
.sx-ph__link.is-fill {
background: var(--accent-bright);
}
/* ── 3-region 그리드 ── */
.sx-grid {
display: grid;
grid-template-columns: minmax(248px, 0.76fr) minmax(500px, 2.12fr) minmax(248px, 0.72fr);
gap: 12px;
align-items: stretch;
width: 100%;
min-width: 0;
height: 100%;
min-height: 0;
overflow: hidden;
}
.sx-mobile-context {
display: none;
position: relative;
}
.sx-mobile-context__brief {
display: none;
}
.sx-mobile-context__dot {
width: 8px;
height: 8px;
border-radius: 50%;
display: inline-block;
margin-right: 6px;
background: var(--neutral-sig);
vertical-align: middle;
}
.sx-mobile-context__dot.is-pos {
background: var(--pos-solid);
}
.sx-mobile-context__dot.is-warn {
background: var(--warn-solid);
}
.sx-mobile-context__resume {
display: none;
min-width: 0;
padding: 7px 8px;
border-radius: var(--radius-sm);
background: var(--accent-tint);
color: var(--accent-deep);
font-size: 11.5px;
font-weight: 650;
line-height: 1.25;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* 패널 (공통 .vg-panel 과 별개로 세션 패널은 padding 을 영역별 제어) */
.sx-panel {
background: var(--bg-surface);
border: 1px solid var(--border-subtle);
border-radius: var(--radius-lg);
box-shadow: var(--shadow-sm);
}
.sx-page--active .sx-panel,
.sx-page--active .sx-mobile-context {
background: var(--glass-specular), var(--glass-surface);
border-color: var(--glass-border);
box-shadow: var(--glass-edge-shadow), var(--glass-shadow);
color: var(--text-body);
}
/* 컬럼 공통 */
.sx-col {
display: flex;
flex-direction: column;
gap: 12px;
min-width: 0;
min-height: 0;
overflow: hidden;
}
.sx-col-center {
display: grid;
grid-template-rows: minmax(164px, 0.34fr) minmax(0, 1fr);
gap: 12px;
min-height: 0;
}
.sx-page--active .sx-col-center {
grid-template-rows: minmax(250px, 0.44fr) minmax(0, 1fr);
}
/* ── LEFT: 세로 단계 트랙 ── */
.sx-track {
order: 2;
flex: 0 0 auto;
padding: 14px;
overflow: hidden;
}
.sx-track__head {
margin-bottom: 10px;
}
.sx-vstep {
display: grid;
grid-template-columns: 14px 1fr;
column-gap: 13px;
}
.sx-vstep__rail {
display: flex;
flex-direction: column;
align-items: center;
}
.sx-vstep__node {
width: 13px;
height: 13px;
border-radius: 50%;
flex: none;
position: relative;
z-index: 1;
background: var(--bg-surface);
border: 2px solid var(--neutral-200);
}
.sx-vstep__line {
width: 2px;
flex: 1;
min-height: 22px;
background: var(--hair);
}
.sx-vstep.is-done .sx-vstep__node {
background: var(--accent-bright);
border-color: var(--accent-bright);
}
.sx-vstep.is-done .sx-vstep__line {
background: var(--accent-bright);
}
.sx-vstep.is-cur .sx-vstep__node {
border-color: var(--accent);
}
.sx-vstep.is-cur .sx-vstep__node::after {
content: "";
position: absolute;
inset: 2px;
border-radius: 50%;
background: var(--accent);
}
.sx-vstep__body {
padding-bottom: 11px;
}
.sx-vstep:last-child .sx-vstep__body {
padding-bottom: 0;
}
.sx-vstep__label {
font-size: 13px;
font-weight: 500;
color: var(--text-muted);
display: flex;
align-items: baseline;
justify-content: space-between;
gap: 8px;
}
.sx-vstep.is-done .sx-vstep__label {
color: var(--text-body);
}
.sx-vstep.is-cur .sx-vstep__label {
color: var(--text-strong);
font-weight: 700;
}
.sx-vstep__t {
font-size: 10.5px;
font-family: var(--font-num);
font-variant-numeric: tabular-nums;
color: var(--text-muted);
font-weight: 400;
flex: none;
}
.sx-vstep.is-cur .sx-vstep__t {
color: var(--accent);
font-weight: 600;
}
.sx-vstep__desc {
font-size: 11.5px;
color: var(--text-muted);
margin-top: 2px;
line-height: 1.42;
}
/* ── LEFT: 내담자 컨텍스트 카드 ── */
.sx-ctx {
order: 1;
/* 콘텐츠 높이로 hug — 빈 카드가 칩 아래로 늘어나 비어 보이지 않게.
남는 세로 여백은 컬럼 하단으로 모여 우측 컬럼과 같은 호흡을 유지. */
flex: 0 1 auto;
min-height: 0;
padding: 14px;
overflow: auto;
}
.sx-ctx__head {
margin-bottom: 12px;
}
.sx-ctx__who {
display: flex;
align-items: center;
gap: 10px;
}
.sx-ctx__pf {
width: 36px;
height: 36px;
border-radius: 50%;
flex: none;
display: flex;
align-items: center;
justify-content: center;
font-size: 15px;
font-weight: 700;
background: var(--clay-tint);
color: var(--clay-deep);
}
.sx-ctx__nm {
font-size: 15px;
font-weight: 700;
color: var(--text-strong);
}
.sx-ctx__mt {
font-size: 12px;
color: var(--text-muted);
margin-top: 1px;
line-height: 1.35;
}
/* D3 — 한 줄에 · 가 몰리지 않도록 소개를 여러 줄로 흘린다 */
.sx-ctx__mt span {
display: block;
}
.sx-ctx__meta {
margin-top: 12px;
}
.sx-ctx__row {
display: flex;
align-items: flex-start;
gap: 9px;
padding: 8px 0;
border-top: 1px solid var(--paper-2);
font-size: 13px;
}
.sx-ctx__row:first-child {
border-top: none;
}
.sx-ctx__rl {
font-size: 11.5px;
font-weight: 600;
color: var(--text-muted);
width: 38px;
flex: none;
padding-top: 1px;
}
.sx-ctx__rv {
color: var(--text-body);
line-height: 1.48;
min-width: 0;
}
.sx-ctx__chips {
display: flex;
flex-wrap: wrap;
gap: 6px;
margin-top: var(--sp-4);
}
.sx-page--active .sx-ctx__chips {
margin-top: 10px;
}
.sx-chip {
font-size: 11.5px;
font-weight: 500;
color: var(--text-body);
background: var(--paper-2);
padding: 4px 10px;
border-radius: 100px;
}
.sx-chip.is-clay {
background: var(--clay-tint);
color: var(--clay-deep);
}
.sx-session-progress {
order: 3;
padding: 14px;
overflow: hidden;
}
.sx-session-progress__head {
margin-bottom: 12px;
}
.sx-session-progress__grid {
display: grid;
gap: 8px;
}
.sx-session-progress__grid span {
min-width: 0;
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
align-items: baseline;
gap: 10px;
padding: 8px 0;
border-top: 1px solid var(--paper-2);
}
.sx-session-progress__grid span:first-child {
border-top: none;
}
.sx-session-progress__grid b {
color: var(--text-strong);
font: 800 14px/1.2 var(--font-num);
font-variant-numeric: tabular-nums;
}
.sx-session-progress__grid small {
color: var(--text-muted);
font: 600 11.5px/1.2 var(--font-sans);
text-align: right;
}
/* ── CENTER: 어두운 STAGE ── */
.sx-stage {
position: relative;
overflow: hidden;
background: var(--bg-stage);
border: 1px solid var(--border-subtle);
border-radius: var(--radius-lg);
box-shadow: var(--shadow-sm);
min-height: 0;
padding: 14px 16px;
display: grid;
grid-template-columns: minmax(136px, 184px) minmax(0, 1fr);
grid-template-rows: auto minmax(0, 1fr) auto;
align-items: center;
column-gap: 18px;
row-gap: 8px;
}
.sx-page--active .sx-stage {
background:
radial-gradient(circle at 50% 47%, color-mix(in srgb, var(--accent) 20%, transparent), transparent 36%),
radial-gradient(circle at 50% 82%, color-mix(in srgb, var(--clay) 12%, transparent), transparent 24%),
linear-gradient(145deg, color-mix(in srgb, var(--bg-stage) 92%, var(--bg-surface)), var(--bg-stage));
border-color: var(--glass-border);
box-shadow: var(--glass-edge-shadow), var(--glass-shadow);
grid-template-columns: minmax(184px, 256px) minmax(0, 1fr);
padding: 20px 24px;
}
[data-theme="light"] .sx-page--active .sx-stage {
background:
radial-gradient(circle at 50% 47%, color-mix(in srgb, var(--accent) 16%, transparent), transparent 36%),
radial-gradient(circle at 50% 82%, color-mix(in srgb, var(--clay) 10%, transparent), transparent 24%),
linear-gradient(145deg, var(--paper), var(--paper-2));
}
.sx-page--active .sx-stage::before {
content: "";
position: absolute;
inset: 12px;
border: 1px solid var(--glass-inset-border);
border-radius: calc(var(--radius-lg) - 2px);
pointer-events: none;
}
/* stage 상단 좌측 상태 라벨 (어두운 배경 위 옅은 텍스트) */
.sx-stage__top {
width: 100%;
grid-column: 2;
grid-row: 1;
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
font-size: 12px;
font-weight: 600;
color: var(--text-muted);
opacity: 1;
}
.sx-stage__status {
min-width: 0;
display: inline-flex;
align-items: center;
gap: 8px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.sx-stage__timer {
flex: none;
font-family: var(--font-num);
font-variant-numeric: tabular-nums;
}
.sx-stage__state-dot {
width: 7px;
height: 7px;
border-radius: 50%;
flex: none;
background: var(--clay);
box-shadow: 0 0 0 4px rgba(208, 139, 112, 0.12);
}
.sx-stage__state-dot.is-learner {
background: var(--accent-bright);
box-shadow: 0 0 0 4px rgba(121, 200, 183, 0.12);
}
.sx-stage__state-dot.is-think {
background: var(--neutral-sig);
box-shadow: none;
}
/* 음성 오브 + 아바타 (오브는 아바타 둘레 링) */
.sx-orb-wrap {
position: relative;
grid-column: 1;
grid-row: 1 / span 3;
margin: 0;
display: flex;
align-items: center;
justify-content: center;
}
/* 오브 링 — 상태별 색/모션. box-shadow 로 glow(절제). */
.sx-orb {
position: absolute;
inset: -10px;
border-radius: 50%;
pointer-events: none;
--ring: var(--accent-bright);
box-shadow:
0 0 0 1px color-mix(in srgb, var(--ring) 58%, transparent),
0 0 30px 2px color-mix(in srgb, var(--ring) 22%, transparent);
transition: box-shadow var(--dur-slow) var(--ease-out);
}
.sx-orb[data-orb="learner"] {
--ring: var(--accent-bright);
animation: sxBreathe 1500ms var(--ease-in-out) infinite;
}
.sx-orb[data-orb="client"] {
--ring: var(--clay);
/* 음량(--amp)을 JS 가 주입 → blur 미세 모듈레이션 */
box-shadow:
0 0 0 1px color-mix(in srgb, var(--ring) 62%, transparent),
0 0 calc(24px + var(--amp, 0) * 18px) 2px
color-mix(in srgb, var(--ring) 28%, transparent);
}
.sx-orb[data-orb="thinking"] {
--ring: var(--neutral-sig);
box-shadow:
0 0 0 1px color-mix(in srgb, var(--ring) 40%, transparent),
0 0 16px 1px color-mix(in srgb, var(--ring) 14%, transparent);
}
.sx-orb[data-orb="idle"] {
--ring: var(--accent-bright);
animation: sxBreathe 3500ms var(--ease-in-out) infinite;
box-shadow:
0 0 0 1px color-mix(in srgb, var(--ring) 35%, transparent),
0 0 18px 1px color-mix(in srgb, var(--ring) 14%, transparent);
}
@keyframes sxBreathe {
0%, 100% { transform: scale(1); }
50% { transform: scale(1.035); }
}
.sx-stage__now {
grid-column: 2;
grid-row: 3;
font-size: 15px;
font-weight: 650;
color: var(--text-strong);
opacity: 0.9;
margin-top: 0;
text-align: left;
line-height: 1.45;
min-width: 0;
}
.sx-stage__now small {
color: var(--text-muted);
font: 650 12px/1.2 var(--font-sans);
}
.sx-stage__client {
grid-column: 2;
grid-row: 2;
align-self: center;
min-width: 0;
display: grid;
gap: 8px;
position: relative;
z-index: 2;
}
.sx-stage__client-kicker {
width: fit-content;
max-width: 100%;
color: var(--clay-deep);
font-size: 15px;
font-weight: 850;
line-height: 1.1;
}
.sx-stage__client p {
max-width: 42ch;
margin: 0;
color: var(--text-strong);
font-size: 16px;
font-weight: 650;
line-height: 1.58;
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 4;
-webkit-box-orient: vertical;
}
.sx-page--active .sx-stage .vg-avatar {
width: clamp(176px, 15vw, 238px) !important;
}
.sx-page--active .sx-stage .vg-avatar__label {
display: none;
}
.sx-page--active .sx-stage .vg-avatar__stage {
height: clamp(176px, 15vw, 238px) !important;
}
.sx-page--active .sx-stage .vg-avatar__svg {
width: clamp(176px, 15vw, 238px) !important;
height: clamp(176px, 15vw, 238px) !important;
}
.sx-page--active .sx-stage .vg-avatar__meta {
display: none;
}
.sx-page--active .sx-stage .vg-raster[data-raster-art-set="seoyeon-live2d-psd-v2"] {
--vg-raster-top: -8%;
--vg-raster-h: 122%;
}
@media (min-width: 1181px) {
.sx-page--active .sx-col-center {
grid-template-rows: minmax(320px, 0.5fr) minmax(0, 1fr);
}
.sx-page--active .sx-stage {
grid-template-columns: minmax(220px, 0.9fr) minmax(260px, 1fr);
grid-template-rows: auto minmax(0, 1fr) auto;
justify-items: stretch;
align-items: center;
padding: 20px 28px 18px;
column-gap: clamp(20px, 3vw, 46px);
}
.sx-page--active .sx-stage__top {
grid-column: 1 / -1;
grid-row: 1;
position: relative;
z-index: 2;
}
.sx-page--active .sx-orb-wrap {
grid-column: 1;
grid-row: 2;
place-self: center;
margin: 0;
}
.sx-page--active .sx-stage__client {
grid-column: 2;
grid-row: 2;
justify-self: start;
}
.sx-page--active .sx-stage__now {
grid-column: 1 / -1;
grid-row: 3;
position: relative;
right: auto;
bottom: auto;
place-self: center;
width: min(100%, 600px);
max-width: calc(100% - 48px);
padding: 7px 10px;
border: 1px solid var(--glass-inset-border);
border-radius: var(--radius-sm);
background: var(--glass-specular-inset), var(--glass-surface-inset);
color: var(--text-strong);
text-align: center;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
z-index: 2;
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
}
.sx-page--active .sx-stage .vg-avatar {
width: clamp(184px, 14vw, 204px) !important;
}
.sx-page--active .sx-stage .vg-avatar__stage {
height: clamp(184px, 14vw, 204px) !important;
}
.sx-page--active .sx-stage .vg-avatar__svg {
width: clamp(184px, 14vw, 204px) !important;
height: clamp(184px, 14vw, 204px) !important;
}
}
/* ── CENTER: 실시간 자막 (대본 스타일, 버블 금지) ── */
.sx-transcript {
background: var(--bg-surface);
border: 1px solid var(--border-subtle);
border-radius: var(--radius-lg);
box-shadow: var(--shadow-sm);
padding: 14px;
display: flex;
flex-direction: column;
min-height: 0;
overflow: hidden;
}
.sx-page--active .sx-transcript {
background: var(--glass-specular), var(--glass-surface);
border-color: var(--glass-border);
box-shadow: var(--glass-edge-shadow), var(--glass-shadow);
color: var(--text-body);
}
.sx-transcript__head {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 10px;
}
.sx-transcript__live {
font-size: 11.5px;
color: var(--text-muted);
display: inline-flex;
align-items: center;
gap: 6px;
font-family: var(--font-num);
font-variant-numeric: tabular-nums;
}
.sx-transcript__live-dot {
width: 6px;
height: 6px;
border-radius: 50%;
background: var(--neutral-sig);
}
.sx-transcript__live-dot.is-live {
background: var(--pos-solid);
animation: sxLivePulse 1400ms var(--ease-in-out) infinite;
}
@keyframes sxLivePulse {
0%, 100% { transform: scale(1); opacity: 0.9; }
50% { transform: scale(1.35); opacity: 0.5; }
}
.sx-transcript__scroll {
overflow-y: auto;
overflow-x: hidden;
scrollbar-width: none;
max-height: none;
flex: 1;
min-height: 160px;
padding-right: 4px;
display: flex;
flex-direction: column;
}
.sx-transcript__scroll::-webkit-scrollbar {
width: 0;
height: 0;
}
.sx-transcript__empty {
min-height: 100%;
display: grid;
grid-template-columns: auto minmax(0, 1fr);
align-content: start;
align-items: center;
gap: var(--sp-3);
padding: 12px 8px;
color: var(--text-body);
}
.sx-transcript__empty-dot {
width: 10px;
height: 10px;
border-radius: 50%;
background: var(--accent-bright);
}
.sx-transcript__empty b,
.sx-transcript__empty span {
display: block;
min-width: 0;
}
.sx-transcript__empty b {
color: var(--text-strong);
font-size: var(--fs-sm);
line-height: 1.45;
}
.sx-transcript__empty span {
margin-top: 3px;
color: var(--text-muted);
font-size: var(--fs-xs);
line-height: 1.45;
}
.sx-utt {
display: flex;
flex-direction: column;
gap: 4px;
padding: 9px 0;
}
.sx-utt__head {
display: flex;
align-items: baseline;
gap: 8px;
}
.sx-utt__spk {
font-size: 12px;
font-weight: 600;
}
.sx-utt__tc {
font-size: 11px;
color: var(--text-muted);
font-family: var(--font-num);
font-variant-numeric: tabular-nums;
}
.sx-utt__body {
display: flex;
align-items: flex-end;
gap: 7px;
max-width: 100%;
}
.sx-utt__line {
font-size: 14.5px;
line-height: 1.58;
padding: 9px 13px;
border-radius: var(--radius);
max-width: min(88%, 68ch);
overflow-wrap: anywhere;
}
/* 내담자 = clay-tint 틴트 블록 (외곽선·꼬리·border-left 없음) */
.sx-utt.is-client .sx-utt__spk {
color: var(--clay-deep);
}
.sx-utt.is-client .sx-utt__line {
background: var(--clay-tint);
color: var(--text-strong);
}
/* 학습자 = accent-tint, 우측 정렬 */
.sx-utt.is-learner {
align-items: flex-end;
}
.sx-utt.is-learner .sx-utt__head {
flex-direction: row-reverse;
}
.sx-utt.is-learner .sx-utt__body {
flex-direction: row-reverse;
}
.sx-utt.is-learner .sx-utt__spk {
color: var(--accent-deep);
}
.sx-utt.is-learner .sx-utt__line {
background: var(--accent-tint);
color: var(--text-strong);
}
.sx-utt__coach-mark {
position: relative;
flex: 0 0 auto;
width: 28px;
height: 28px;
border-radius: 50%;
border: 1px solid color-mix(in srgb, var(--accent-deep) 36%, transparent);
background: var(--paper);
color: var(--accent-deep);
font-size: 11px;
font-weight: 800;
line-height: 1;
display: inline-grid;
place-items: center;
cursor: pointer;
box-shadow: 0 5px 14px rgba(35, 42, 48, 0.1);
}
.sx-utt__coach-mark.is-pos {
border-color: color-mix(in srgb, var(--pos-solid) 42%, transparent);
color: var(--pos-text);
}
.sx-utt__coach-mark.is-warn {
border-color: color-mix(in srgb, var(--warn-solid) 48%, transparent);
color: var(--warn-text);
}
.sx-utt__coach-mark.is-degraded {
border-color: color-mix(in srgb, var(--clay-deep) 55%, transparent);
background: color-mix(in srgb, var(--clay-tint) 68%, var(--paper));
color: var(--clay-deep);
}
.sx-utt__coach-mark:hover {
transform: translateY(-1px);
box-shadow: 0 8px 18px rgba(35, 42, 48, 0.16);
}
.sx-utt__coach-mark span {
position: absolute;
right: -4px;
top: -5px;
min-width: 14px;
height: 14px;
padding: 0 3px;
border-radius: 999px;
background: var(--accent-deep);
color: var(--text-on-accent);
font-size: 9px;
line-height: 14px;
font-weight: 800;
}
/* partial(진행 중 발화) = ink-3 흐릿 + 캐럿 */
.sx-utt.is-partial .sx-utt__line {
color: var(--text-muted);
}
.sx-utt.is-failed .sx-utt__line {
background: color-mix(in srgb, var(--warn-tint) 74%, var(--paper));
border: 1px dashed color-mix(in srgb, var(--warn-solid) 46%, transparent);
color: var(--text-strong);
}
.sx-utt__status {
align-self: center;
display: inline-flex;
flex: 0 0 auto;
white-space: nowrap;
border-radius: 999px;
border: 1px solid color-mix(in srgb, var(--warn-solid) 34%, transparent);
background: color-mix(in srgb, var(--warn-tint) 72%, var(--paper));
color: var(--warn-text);
font-size: 11px;
font-weight: 700;
line-height: 1;
padding: 4px 7px;
}
.sx-utt.is-thinking .sx-utt__line {
display: inline-flex;
align-items: center;
gap: 8px;
color: var(--text-muted);
border: 1px dashed color-mix(in srgb, var(--clay-deep) 24%, transparent);
}
.sx-utt__dots {
display: inline-flex;
align-items: center;
gap: 3px;
flex: none;
}
.sx-utt__dots i {
width: 4px;
height: 4px;
border-radius: 50%;
background: currentColor;
opacity: 0.35;
animation: sxThinkingDot 900ms var(--ease-in-out) infinite;
}
.sx-utt__dots i:nth-child(2) {
animation-delay: 120ms;
}
.sx-utt__dots i:nth-child(3) {
animation-delay: 240ms;
}
.sx-utt__caret {
display: inline-block;
width: 2px;
height: 1em;
background: var(--ink-3);
margin-left: 2px;
vertical-align: -2px;
animation: sxCaret 1s steps(1) infinite;
}
@keyframes sxCaret {
50% { opacity: 0; }
}
@keyframes sxThinkingDot {
0%, 100% { opacity: 0.25; transform: translateY(0); }
50% { opacity: 0.9; transform: translateY(-2px); }
}
/* "최신으로" 칩 (위로 스크롤 시) */
.sx-transcript__jump {
align-self: center;
margin-top: var(--sp-2);
font-family: var(--font-sans);
font-size: 12px;
font-weight: 600;
color: var(--accent-deep);
background: var(--accent-tint);
border: none;
padding: 5px 12px;
border-radius: 100px;
cursor: pointer;
display: inline-flex;
align-items: center;
gap: 6px;
}
/* 텍스트 입력 폴백 (음성 트랙 소관이라 여기선 폴백) */
.sx-compose {
display: flex;
align-items: flex-end;
gap: 10px;
margin-top: 12px;
padding-top: 12px;
border-top: 1px solid var(--paper-2);
}
.sx-compose__field {
flex: 1;
min-width: 0;
}
.sx-compose textarea {
width: 100%;
resize: none;
background: var(--bg-surface-2);
color: var(--text-strong);
border: 1px solid var(--border-strong);
border-radius: var(--radius-sm);
min-height: 44px;
max-height: 96px;
padding: 10px 12px;
font: var(--fs-body) / 1.5 var(--font-sans);
transition:
border-color var(--dur-fast) var(--ease-out),
box-shadow var(--dur-fast) var(--ease-out);
}
.sx-compose textarea::placeholder {
color: var(--neutral-400);
}
.sx-compose textarea:focus {
border-color: var(--border-focus);
outline: none;
box-shadow: 0 0 0 3px var(--focus-ring);
}
.sx-page--active button:focus-visible,
.sx-page--active textarea:focus-visible {
outline: 2px solid rgba(131, 168, 155, 0.88);
outline-offset: 2px;
}
.sx-turn-error {
margin-top: 10px;
display: flex;
}
/* 보내기 = 1차 액션. 입력창(틴트) 대비 또렷한 진한 accent + 미세 elevation.
비활성(입력 없음)은 표면 톤으로 낮춰 활성 상태와 위계를 분명히. */
.sx-compose .vg-btn--primary {
background: var(--accent-deep);
color: var(--text-on-accent);
box-shadow: 0 1px 3px color-mix(in srgb, var(--accent-deep) 42%, transparent);
}
.sx-compose .vg-btn--primary:hover:not(:disabled) {
background: var(--accent);
}
/* 비활성(입력 없음): 채움 없는 평면 회색 + 윤곽선으로 명시적 낮은 대비.
활성(진한 accent 채움)과 색·채움 위계를 분명히 갈라 눌러도 되는지 한눈에. */
.sx-compose .vg-btn--primary:disabled {
background: var(--neutral-100);
color: var(--neutral-400);
border-color: var(--border-strong);
box-shadow: none;
opacity: 1;
}
/* ── RIGHT: 라이브 신호 ── */
.sx-signal {
min-height: 0;
padding: 12px;
overflow-x: hidden;
overflow-y: auto;
scrollbar-width: thin;
display: flex;
flex-direction: column;
}
.sx-utt__status.is-live {
border-color: color-mix(in srgb, var(--accent-deep) 28%, transparent);
background: color-mix(in srgb, var(--accent-tint) 76%, var(--paper));
color: var(--accent-deep);
}
.sx-signal__head {
order: 0;
margin-bottom: 9px;
}
/* 앰비언트 도트 1개 + 한 단어 (6초 페이드) */
.sx-signal__one {
order: 2;
display: flex;
align-items: center;
gap: 10px;
padding: 10px 12px;
background: var(--paper-2);
border: 1px solid transparent;
border-radius: var(--radius);
transition: opacity var(--dur-slow) var(--ease-out);
}
.sx-signal__one.is-faded {
opacity: 0.42;
}
/* 신호가 아직 없을 때 — 빈 패널 대신 의도된 안내(가짜 데이터 아님) */
.sx-signal__rest {
order: 2;
margin: 0;
padding: 12px;
border-radius: var(--radius);
background: var(--paper-2);
border: 1px solid transparent;
color: var(--text-muted);
font-size: 12.5px;
line-height: 1.5;
}
.sx-feedback-ambient .sx-signal__one {
justify-content: space-between;
min-height: 42px;
}
.sx-signal__one-dot {
width: 10px;
height: 10px;
border-radius: 50%;
flex: none;
background: var(--neutral-sig);
}
.sx-signal__one-dot.is-pos {
background: var(--pos-solid);
}
.sx-signal__one-dot.is-warn {
background: var(--warn-solid);
}
.sx-signal__one-text {
font-size: 14px;
font-weight: 600;
color: var(--text-strong);
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.sx-signal__one-when {
font-size: 11.5px;
color: var(--text-muted);
margin-left: auto;
font-family: var(--font-num);
font-variant-numeric: tabular-nums;
}
.sx-feedback-ambient .sx-signal__one-when {
margin-left: 0;
}
.sx-signal__status {
order: 3;
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 7px;
margin-top: 8px;
}
.sx-signal__status span {
min-width: 0;
display: grid;
gap: 2px;
padding: 7px 8px;
border: 1px solid var(--glass-inset-border);
border-radius: var(--radius-sm);
background: var(--glass-specular-inset), var(--glass-surface-inset);
}
.sx-signal__status b {
color: var(--text-body);
font-size: 10.5px;
font-weight: 650;
}
.sx-signal__status small {
min-width: 0;
color: var(--accent-deep);
font-size: 11.5px;
font-weight: 750;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* 최근 흐름 시퀀스 (클릭 가능) */
.sx-signal__seq {
order: 4;
display: flex;
align-items: center;
gap: 7px;
margin-top: 12px;
}
.sx-signal__seq-label {
font-size: 11px;
color: var(--text-muted);
font-family: var(--font-num);
letter-spacing: 0.04em;
}
.sx-signal__seq-dots {
display: flex;
align-items: center;
gap: 6px;
}
.sx-signal__seq-dots i {
width: 7px;
height: 7px;
border-radius: 50%;
background: var(--neutral-sig);
}
.sx-signal__seq-dots i.is-pos {
background: var(--pos-solid);
}
.sx-signal__seq-dots i.is-warn {
background: var(--warn-solid);
}
.sx-signal__seq-dots i.is-now {
box-shadow: 0 0 0 3px var(--accent-tint);
}
.sx-signal__defer {
order: 5;
font-size: 12px;
color: var(--text-muted);
line-height: 1.55;
margin-top: 12px;
padding-top: 12px;
border-top: 1px solid var(--paper-2);
}
.sx-signal__defer b {
font-weight: 600;
color: var(--text-body);
}
/* ambient(상태 신호) 모드에서도 본문 안내를 남겨 패널이 비어 보이지 않게 한다.
minimal 톤 유지를 위해 여백만 살짝 좁힌다. */
.sx-feedback-ambient .sx-signal__defer {
display: none;
}
.sx-coach-card {
order: 1;
display: grid;
grid-template-columns: 42px minmax(0, 1fr);
gap: 10px;
margin: 0 0 9px;
align-items: start;
}
.sx-coach-avatar {
position: relative;
width: 42px;
height: 42px;
border-radius: 50%;
background: var(--bg-surface-2);
border: 1px solid color-mix(in srgb, var(--text-muted) 24%, transparent);
box-shadow: var(--shadow-md);
}
.sx-coach-card.is-pos .sx-coach-avatar {
background: color-mix(in srgb, var(--pos-tint) 82%, var(--bg-surface-2));
border-color: color-mix(in srgb, var(--pos-solid) 38%, transparent);
}
.sx-coach-card.is-warn .sx-coach-avatar {
background: color-mix(in srgb, var(--warn-tint) 82%, var(--bg-surface-2));
border-color: color-mix(in srgb, var(--warn-solid) 45%, transparent);
}
.sx-coach-avatar__lens {
position: absolute;
inset: 6px;
border-radius: 50%;
border: 1px solid var(--glass-inset-border);
background: var(--glass-specular-inset), var(--glass-surface-inset);
}
.sx-coach-avatar__face {
position: absolute;
left: 11px;
right: 11px;
top: 15px;
display: flex;
justify-content: space-between;
}
.sx-coach-avatar__face i {
width: 5px;
height: 5px;
border-radius: 50%;
background: var(--text-strong);
}
.sx-coach-bubble {
position: relative;
display: grid;
gap: 7px;
padding: 11px 12px;
border-radius: var(--radius);
background: var(--paper-2);
border: 1px solid color-mix(in srgb, var(--text-muted) 16%, transparent);
color: var(--text-body);
min-width: 0;
}
.sx-coach-bubble::before {
content: "";
position: absolute;
left: -6px;
top: 15px;
width: 10px;
height: 10px;
transform: rotate(45deg);
background: var(--paper-2);
border-left: 1px solid color-mix(in srgb, var(--text-muted) 16%, transparent);
border-bottom: 1px solid color-mix(in srgb, var(--text-muted) 16%, transparent);
}
.sx-coach-card.is-pos .sx-coach-bubble {
border-color: color-mix(in srgb, var(--pos-solid) 32%, transparent);
}
.sx-coach-card.is-warn .sx-coach-bubble {
border-color: color-mix(in srgb, var(--warn-solid) 42%, transparent);
}
.sx-coach-card.is-degraded .sx-coach-avatar {
background: color-mix(in srgb, var(--clay-tint) 76%, var(--paper-2));
border-color: color-mix(in srgb, var(--clay-deep) 40%, transparent);
}
.sx-coach-card.is-degraded .sx-coach-bubble {
border-color: color-mix(in srgb, var(--clay-deep) 42%, transparent);
background: color-mix(in srgb, var(--clay-tint) 22%, var(--paper-2));
}
.sx-coach-card.is-degraded .sx-coach-bubble::before {
background: color-mix(in srgb, var(--clay-tint) 22%, var(--paper-2));
border-left-color: color-mix(in srgb, var(--clay-deep) 42%, transparent);
border-bottom-color: color-mix(in srgb, var(--clay-deep) 42%, transparent);
}
.sx-coach-bubble__meta {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
font-size: 11px;
color: var(--text-muted);
}
.sx-coach-bubble__meta b {
color: var(--text-strong);
font-size: 12px;
}
.sx-coach-degraded-note {
padding: 8px 9px;
border-radius: 7px;
border: 1px solid color-mix(in srgb, var(--clay-deep) 30%, transparent);
background: color-mix(in srgb, var(--clay-tint) 38%, transparent);
color: var(--clay-deep) !important;
font-size: 11.5px !important;
line-height: 1.45 !important;
}
.sx-coach-persistence-note {
padding: 8px 9px;
border-radius: 7px;
border: 1px solid color-mix(in srgb, var(--warn-solid) 30%, transparent);
background: color-mix(in srgb, var(--warn-tint) 58%, transparent);
color: var(--warn-text) !important;
font-size: 11.5px !important;
font-weight: 700;
line-height: 1.45 !important;
}
.sx-coach-quota {
min-height: 26px;
display: grid;
grid-template-columns: minmax(0, 1fr) auto auto;
align-items: center;
gap: 8px;
padding: 6px 8px;
border-radius: 7px;
background: color-mix(in srgb, var(--paper) 72%, var(--accent-tint));
color: var(--text-muted);
font-size: 11px;
}
.sx-coach-quota b {
color: var(--accent-deep);
font-family: var(--font-num);
font-size: 11.5px;
font-weight: 800;
font-variant-numeric: tabular-nums;
}
.sx-coach-quota__dots {
display: inline-flex;
align-items: center;
gap: 4px;
}
.sx-coach-quota__dots i {
width: 8px;
height: 8px;
border-radius: 50%;
background: color-mix(in srgb, var(--text-muted) 24%, transparent);
box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--text-muted) 18%, transparent);
}
.sx-coach-quota__dots i.is-filled {
background: var(--accent-deep);
box-shadow: 0 0 0 3px var(--accent-tint);
}
.sx-coach-credit-pulse {
justify-self: start;
min-height: 24px;
display: inline-flex;
align-items: center;
padding: 5px 8px;
border-radius: 999px;
background: var(--paper);
color: var(--text-body);
border: 1px solid color-mix(in srgb, var(--text-muted) 22%, transparent);
font: 760 11px/1 var(--font-num);
animation: sxCoachCreditPulse 900ms var(--ease-out) both;
}
.sx-coach-credit-pulse.is-recharge {
color: var(--pos-solid);
border-color: color-mix(in srgb, var(--pos-solid) 34%, transparent);
background: color-mix(in srgb, var(--pos-solid) 11%, var(--paper));
}
.sx-coach-bubble strong {
display: block;
color: var(--text-strong);
font-size: 14px;
line-height: 1.28;
}
.sx-coach-bubble p {
margin: 0;
color: var(--text-body);
font-size: 12.5px;
line-height: 1.5;
overflow-wrap: anywhere;
}
.sx-coach-bubble blockquote {
margin: 0;
padding: 8px 10px;
border-radius: 6px;
background: color-mix(in srgb, var(--paper) 78%, var(--info-tint));
color: var(--text-strong);
font-size: 12.5px;
line-height: 1.45;
overflow-wrap: anywhere;
}
.sx-coach-bubble__actions {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 7px;
}
.sx-coach-bubble button {
justify-self: start;
border: 1px solid color-mix(in srgb, var(--text-muted) 24%, transparent);
background: var(--paper);
color: var(--text-strong);
border-radius: 6px;
padding: 6px 9px;
font-size: 12px;
font-weight: 650;
cursor: pointer;
}
.sx-coach-bubble button:hover {
border-color: color-mix(in srgb, var(--accent-deep) 42%, transparent);
}
/* 낮은 데스크톱에서도 코치의 판단과 행동 버튼을 먼저 보존한다. 발화 예시와
보조 흐름 설명은 세로 여유가 생길 때만 노출한다. */
@media (min-width: 881px) and (max-height: 700px) {
.sx-feedback-coached .sx-coach-card {
gap: 8px;
margin-bottom: 6px;
}
.sx-feedback-coached .sx-coach-avatar {
width: 36px;
height: 36px;
}
.sx-feedback-coached .sx-coach-avatar__face {
left: 9px;
right: 9px;
top: 13px;
}
.sx-feedback-coached .sx-coach-bubble {
gap: 5px;
padding: 8px 10px;
}
.sx-feedback-coached .sx-coach-quota {
min-height: 22px;
padding: 4px 6px;
}
.sx-coach-bubble blockquote,
.sx-feedback-coached .sx-signal__seq,
.sx-feedback-coached .sx-signal__defer {
display: none;
}
.sx-feedback-coached .sx-signal__one,
.sx-feedback-coached .sx-signal__rest {
padding-block: 8px;
}
}
.sx-coach-card.is-loading .sx-coach-avatar__lens {
animation: sxCoachThinking 1100ms var(--ease-in-out) infinite;
}
@keyframes sxCoachThinking {
0%,
100% {
opacity: 0.45;
}
50% {
opacity: 0.9;
}
}
@keyframes sxCoachCreditPulse {
0% {
opacity: 0;
transform: translateY(4px) scale(0.96);
}
35% {
opacity: 1;
transform: translateY(0) scale(1.03);
}
100% {
opacity: 1;
transform: translateY(0) scale(1);
}
}
.sx-coach-history {
position: fixed;
inset: 0;
z-index: 84;
display: grid;
place-items: center;
padding: 20px;
background: rgba(25, 31, 37, 0.42);
backdrop-filter: blur(8px);
}
.sx-coach-history__panel {
width: min(760px, calc(100vw - 32px));
max-height: min(78vh, 720px);
display: grid;
grid-template-rows: auto minmax(0, 1fr);
border-radius: 12px;
border: 1px solid color-mix(in srgb, var(--accent-deep) 18%, var(--border));
background: var(--paper);
box-shadow: 0 24px 70px rgba(22, 28, 34, 0.28);
overflow: hidden;
}
.sx-coach-history__head {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 14px;
padding: 18px 20px 14px;
border-bottom: 1px solid var(--paper-2);
}
.sx-coach-history__head h2 {
margin: 0;
color: var(--text-strong);
font-size: 18px;
line-height: 1.3;
}
.sx-coach-history__head p {
margin: 4px 0 0;
color: var(--text-muted);
font-size: 12.5px;
line-height: 1.45;
}
.sx-coach-credit-log {
display: flex;
flex-wrap: wrap;
gap: 6px;
margin-top: 9px;
}
.sx-coach-credit-log span {
display: inline-flex;
align-items: center;
min-height: 24px;
padding: 4px 8px;
border-radius: 999px;
background: var(--paper-2);
color: var(--text-muted);
font: 720 11px/1 var(--font-num);
}
.sx-coach-credit-log span.is-recharge {
background: color-mix(in srgb, var(--pos-solid) 12%, var(--paper));
color: var(--pos-solid);
}
.sx-coach-history__head button {
width: 34px;
height: 34px;
flex: 0 0 auto;
border: 1px solid var(--border);
border-radius: 8px;
background: var(--paper-2);
color: var(--text-strong);
display: inline-grid;
place-items: center;
cursor: pointer;
}
.sx-coach-history__body {
min-height: 0;
overflow-y: auto;
padding: 14px 16px 18px;
display: grid;
gap: 11px;
}
.sx-coach-history__item {
display: grid;
gap: 9px;
padding: 13px 14px;
border-radius: 8px;
border: 1px solid color-mix(in srgb, var(--text-muted) 16%, transparent);
background: color-mix(in srgb, var(--paper) 86%, var(--paper-2));
}
.sx-coach-history__item.is-pos {
border-color: color-mix(in srgb, var(--pos-solid) 30%, transparent);
}
.sx-coach-history__item.is-warn {
border-color: color-mix(in srgb, var(--warn-solid) 40%, transparent);
}
.sx-coach-history__item.is-degraded {
border-color: color-mix(in srgb, var(--clay-deep) 42%, transparent);
background: color-mix(in srgb, var(--clay-tint) 18%, var(--paper));
}
.sx-coach-history__item-top {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: 10px;
color: var(--text-muted);
font-size: 11.5px;
}
.sx-coach-degraded-badge {
display: inline-flex;
align-items: center;
min-height: 22px;
padding: 4px 7px;
border-radius: 999px;
background: color-mix(in srgb, var(--clay-tint) 70%, transparent);
color: var(--clay-deep);
font-size: 11px;
line-height: 1;
white-space: nowrap;
}
.sx-coach-history__item-top time {
font-family: var(--font-num);
font-variant-numeric: tabular-nums;
white-space: nowrap;
}
.sx-coach-history__item h3 {
margin: 0;
color: var(--text-strong);
font-size: 15px;
line-height: 1.3;
}
.sx-coach-history__item p {
margin: 0;
color: var(--text-body);
font-size: 13px;
line-height: 1.55;
}
.sx-coach-history__trigger,
.sx-coach-history__next blockquote {
margin: 0;
padding: 9px 10px;
border-radius: 7px;
background: var(--paper-2);
color: var(--text-strong);
font-size: 12.5px;
line-height: 1.5;
overflow-wrap: anywhere;
}
.sx-coach-history__next {
display: grid;
gap: 5px;
}
.sx-coach-history__next b {
color: var(--text-strong);
font-size: 12px;
}
.sx-coach-history__why {
color: var(--text-muted) !important;
}
.sx-coach-history__empty {
padding: 24px 14px;
border-radius: 8px;
background: var(--paper-2);
color: var(--text-muted);
font-size: 13px;
text-align: center;
}
.sx-coach-history__empty.is-error {
border: 1px solid color-mix(in srgb, var(--warn-solid) 34%, transparent);
background: color-mix(in srgb, var(--warn-tint) 68%, var(--paper));
color: var(--warn-text);
font-weight: 700;
}
.sx-coach-history__source-alert {
margin-top: 8px;
display: inline-flex;
padding: 6px 8px;
border-radius: 7px;
border: 1px solid color-mix(in srgb, var(--warn-solid) 28%, transparent);
background: color-mix(in srgb, var(--warn-tint) 54%, var(--paper));
color: var(--warn-text);
font-size: 12px;
font-weight: 700;
}
.sx-coach-source-list--compact {
margin-top: 0 !important;
}
.sx-feedback-immersive .sx-col-right .sx-meters,
.sx-feedback-immersive .sx-col-right .sx-safety {
display: none;
}
/* ── RIGHT: 내담자 상태 미터 ── */
.sx-meters {
padding: 14px;
overflow: hidden;
}
.sx-meters__head {
margin-bottom: 12px;
}
.sx-meter {
margin-top: 12px;
}
.sx-meter:first-of-type {
margin-top: 0;
}
.sx-meter__top {
display: flex;
align-items: baseline;
justify-content: space-between;
margin-bottom: 7px;
}
.sx-meter__label {
font-size: 13.5px;
color: var(--text-strong);
font-weight: 500;
}
.sx-meter__val {
font-size: 12px;
font-weight: 600;
font-family: var(--font-num);
}
.sx-meter__val.is-clay {
color: var(--clay-deep);
}
.sx-meter__val.is-accent {
color: var(--accent-deep);
}
.sx-meters__note {
font-size: 11.5px;
color: var(--text-muted);
line-height: 1.55;
margin-top: 12px;
padding-top: 12px;
border-top: 1px solid var(--paper-2);
}
/* ── RIGHT: 안전 점검 콜아웃 (warn, 빨강 아님) ── */
.sx-safety {
display: grid;
gap: 10px;
padding: 14px;
background: var(--warn-tint);
border: 1px solid color-mix(in srgb, var(--warn-solid) 24%, transparent);
border-radius: var(--radius);
}
.sx-safety + .sx-safety {
margin-top: var(--sp-3);
}
.sx-safety--engine {
background: var(--info-tint);
}
.sx-safety--engine .sx-safety__ico,
.sx-safety--engine .sx-safety__text {
color: var(--info-text);
}
.sx-safety--ok {
background: var(--accent-tint);
border-color: rgba(121, 200, 183, 0.2);
}
.sx-safety--ok .sx-safety__ico,
.sx-safety--ok .sx-safety__text {
color: #a6bcb4;
}
.sx-safety__head {
display: flex;
align-items: center;
gap: 8px;
min-width: 0;
}
.sx-safety__head .vg-kicker {
flex: 1;
min-width: 0;
}
.sx-safety__badge {
flex: none;
padding: 3px 8px;
border-radius: 999px;
background: rgba(237, 247, 244, 0.08);
color: currentColor;
font-size: 11px;
font-weight: 750;
}
.sx-safety__rows {
display: grid;
gap: 0;
}
.sx-safety__rows span {
min-width: 0;
display: grid;
grid-template-columns: minmax(0, 0.75fr) minmax(0, 1.25fr);
gap: 8px;
padding: 7px 0;
border-top: 1px solid color-mix(in srgb, currentColor 14%, transparent);
}
.sx-safety__rows b {
color: currentColor;
font-size: 12px;
font-weight: 700;
}
.sx-safety__rows small {
min-width: 0;
color: var(--text-body);
font-size: 12px;
font-weight: 650;
text-align: right;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.sx-safety__ico {
flex: none;
width: 17px;
height: 17px;
margin-top: 1px;
color: var(--warn-solid);
}
.sx-safety__text {
font-size: 12.5px;
line-height: 1.55;
color: var(--warn-text);
}
.sx-safety__text b {
font-weight: 600;
}
.sx-crisis-resource {
display: grid;
gap: 4px;
margin-top: 8px;
padding-top: 8px;
border-top: 1px solid color-mix(in srgb, var(--warn-text) 18%, transparent);
}
.sx-crisis-resource strong {
font-size: 12px;
color: var(--warn-text);
}
.sx-crisis-resource a {
width: fit-content;
color: var(--warn-text);
font-family: var(--font-num);
font-size: 18px;
font-weight: 800;
text-decoration: none;
}
/* ── 하단 컨트롤 바 (80px) ── */
.sx-controlbar {
position: static;
z-index: 20;
margin-top: 0;
background: var(--bg-surface);
border: 1px solid var(--border-subtle);
border-radius: var(--radius);
box-shadow: var(--shadow-sm);
padding: 10px 12px;
display: flex;
align-items: center;
gap: 14px;
min-width: 0;
}
.sx-page--active .sx-controlbar {
width: min(100%, 1460px);
margin: 0 auto;
background: var(--glass-specular), var(--glass-surface-strong);
border-color: var(--glass-border);
box-shadow: var(--glass-edge-shadow), var(--glass-shadow);
color: var(--text-body);
}
.sx-page--active .sx-ctx__row,
.sx-page--active .sx-compose,
.sx-page--active .sx-meter + .sx-meter,
.sx-page--active .sx-safety {
border-color: var(--glass-inset-border);
}
.sx-page--active .sx-chip,
.sx-page--active .sx-signal__one,
.sx-page--active .sx-signal__rest,
.sx-page--active .sx-mobile-context__row span,
.sx-page--active .sx-mobile-context__brief span {
background: var(--glass-specular-inset), var(--glass-surface-inset);
border-color: var(--glass-inset-border);
color: var(--text-body);
}
.sx-page--active .sx-chip.is-clay,
.sx-page--active .sx-ctx__pf {
background: var(--clay-tint);
color: var(--clay-deep);
}
.sx-page--active .sx-ctx__nm,
.sx-page--active .sx-vstep.is-cur .sx-vstep__label,
.sx-page--active .sx-mobile-context__row b,
.sx-page--active .sx-mobile-context__brief b {
color: var(--text-strong);
}
.sx-page--active .sx-ctx__rv,
.sx-page--active .sx-vstep.is-done .sx-vstep__label,
.sx-page--active .sx-meter__label,
.sx-page--active .sx-signal__txt {
color: var(--text-body);
}
.sx-page--active .sx-ctx__mt,
.sx-page--active .sx-ctx__rl,
.sx-page--active .sx-vstep__desc,
.sx-page--active .sx-vstep__t,
.sx-page--active .sx-mobile-context__row small,
.sx-page--active .sx-mobile-context__brief small,
.sx-page--active .sx-safety__desc {
color: var(--text-muted);
}
/* 마이크 (주 컨트롤, 음성 호흡 펄스) — 원형 예외 허용 */
.sx-mic-block {
display: flex;
align-items: center;
gap: 10px;
flex: 1 1 260px;
min-width: 0;
}
.sx-mic {
width: 46px;
height: 46px;
border-radius: 50%;
flex: none;
border: none;
cursor: pointer;
position: relative;
background: var(--accent);
display: flex;
align-items: center;
justify-content: center;
color: var(--text-on-accent);
transition: background var(--dur-base) var(--ease-out);
}
.sx-mic:hover {
background: var(--accent-deep);
}
.sx-mic.is-on::after {
content: "";
position: absolute;
inset: 0;
border-radius: 50%;
border: 2px solid var(--accent);
opacity: 0.35;
animation: sxMicBreathe 1600ms var(--ease-out) infinite;
}
@keyframes sxMicBreathe {
0%, 100% { transform: scale(1); opacity: 0.35; }
50% { transform: scale(1.22); opacity: 0; }
}
/* 음소거 = 아웃라인 */
.sx-mic.is-off {
background: var(--bg-surface);
border: 1px solid var(--border-strong);
color: var(--text-body);
}
.sx-mic.is-off:hover {
background: var(--bg-surface-2);
}
.sx-mic-block__ms {
display: flex;
flex-direction: column;
line-height: 1.25;
min-width: 0;
}
.sx-mic-block__l {
font-size: 13.5px;
font-weight: 600;
color: var(--text-strong);
}
.sx-mic-block__h {
font-size: 11.5px;
color: var(--text-muted);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.sx-mic-block__shortcut {
display: inline-flex;
align-items: center;
gap: 3px;
margin-top: 3px;
color: var(--text-muted);
font-size: 10.5px;
line-height: 1.3;
}
.sx-mic-block__shortcut kbd {
min-width: 19px;
padding: 1px 4px;
border: 1px solid var(--border-strong);
border-radius: 4px;
background: var(--bg-surface-2);
color: var(--text-body);
font-family: var(--font-mono);
font-size: 9.5px;
font-weight: 700;
text-align: center;
box-shadow: inset 0 -1px 0 color-mix(in srgb, var(--text-muted) 18%, transparent);
}
.sx-mic-block__disclosure,
.sx-controlbar__voice-disclosure,
.sx-prestart__voice-disclosure {
color: var(--text-muted);
font-size: 10.5px;
line-height: 1.4;
}
.sx-mic-block__disclosure,
.sx-controlbar__voice-disclosure {
align-items: flex-start;
gap: 5px;
}
.sx-mic-block__disclosure {
display: flex;
margin-top: 3px;
white-space: normal;
text-wrap: pretty;
}
.sx-mic-block__disclosure svg,
.sx-controlbar__voice-disclosure svg,
.sx-prestart__voice-disclosure svg {
flex: 0 0 auto;
margin-top: 1px;
color: var(--accent-deep);
}
.sx-controlbar__voice-disclosure {
display: none;
margin: 0;
}
.sx-voice-skip {
flex: none;
height: 34px;
padding: 0 11px;
border-radius: 999px;
border: 1px solid var(--border-strong);
background: var(--bg-surface-2);
color: var(--text-body);
display: inline-flex;
align-items: center;
gap: 5px;
font-family: var(--font-sans);
font-size: 12px;
font-weight: 700;
cursor: pointer;
white-space: nowrap;
}
.sx-voice-skip:hover {
border-color: var(--border-focus);
color: var(--text-strong);
}
.sx-cb-sep {
width: 1px;
height: 34px;
background: var(--hair);
flex: none;
}
/* 일시정지 (ghost) */
.sx-pause {
font-family: var(--font-sans);
font-size: 14px;
font-weight: 600;
color: var(--text-body);
background: var(--bg-surface);
border: 1px solid var(--border-subtle);
border-radius: var(--radius);
min-height: 40px;
padding: 9px 13px;
cursor: pointer;
display: inline-flex;
align-items: center;
gap: 8px;
transition:
background var(--dur-fast) var(--ease-out),
border-color var(--dur-fast) var(--ease-out),
color var(--dur-fast) var(--ease-out);
}
.sx-pause:hover {
background: var(--bg-surface-2);
color: var(--text-strong);
}
.sx-pause.is-paused {
background: var(--accent-tint);
color: var(--accent-deep);
border-color: transparent;
}
.sx-review-button {
font-family: var(--font-sans);
font-size: 14px;
font-weight: 700;
color: var(--accent-deep);
background: var(--accent-tint);
border: 1px solid color-mix(in srgb, var(--accent) 28%, var(--border-subtle));
border-radius: var(--radius);
min-height: 40px;
padding: 9px 13px;
cursor: pointer;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 8px;
white-space: nowrap;
transition:
background var(--dur-fast) var(--ease-out),
border-color var(--dur-fast) var(--ease-out),
color var(--dur-fast) var(--ease-out);
}
.sx-review-button:hover {
background: color-mix(in srgb, var(--accent-tint) 80%, var(--bg-surface));
color: var(--accent-deep);
}
/* 피드백 모드 segmented */
.sx-seg-block {
display: flex;
flex-direction: column;
gap: 5px;
flex: 0 1 auto;
min-width: 0;
}
.sx-seg-block__label {
font-size: 10.5px;
font-weight: 600;
letter-spacing: 0.06em;
color: var(--text-muted);
font-family: var(--font-num);
}
.sx-segmented {
display: inline-flex;
background: var(--paper-2);
border-radius: var(--radius);
padding: 3px;
gap: 2px;
min-width: 0;
}
.sx-segmented button {
font-family: var(--font-sans);
font-size: 13px;
font-weight: 500;
color: var(--text-body);
background: transparent;
border: none;
padding: 7px 12px;
border-radius: 6px;
cursor: pointer;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 6px;
transition:
background var(--dur-fast) var(--ease-out),
color var(--dur-fast) var(--ease-out);
white-space: nowrap;
}
.sx-segmented button:hover {
color: var(--text-strong);
}
.sx-segmented button.is-on {
background: var(--bg-surface);
color: var(--accent-deep);
font-weight: 600;
box-shadow: var(--shadow-sm);
}
.sx-segmented__badge {
min-width: 18px;
height: 18px;
display: inline-grid;
place-items: center;
border-radius: 999px;
background: var(--accent-deep);
color: #fff;
font: 800 10.5px/1 var(--font-num);
font-variant-numeric: tabular-nums;
box-shadow: 0 0 0 2px var(--accent-tint);
}
.sx-segmented button:not(.is-on) .sx-segmented__badge {
background: color-mix(in srgb, var(--accent-deep) 72%, var(--text-muted));
box-shadow: none;
}
.sx-segmented__badge.is-empty,
.sx-segmented button:not(.is-on) .sx-segmented__badge.is-empty {
background: color-mix(in srgb, var(--text-muted) 38%, transparent);
color: var(--text-muted);
box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--text-muted) 25%, transparent);
}
.sx-cb-spacer {
flex: 1;
}
.sx-cb-actions {
display: flex;
align-items: center;
gap: 8px;
flex: none;
}
.sx-end-button {
min-height: 40px;
padding: 9px 13px;
border: 1px solid color-mix(in srgb, var(--crit-solid) 34%, var(--border-subtle));
border-radius: var(--radius);
background: color-mix(in srgb, var(--crit-tint) 72%, var(--bg-surface));
color: var(--crit-text);
display: inline-flex;
align-items: center;
justify-content: center;
gap: 8px;
font-size: 14px;
font-weight: 700;
line-height: 1;
white-space: nowrap;
cursor: pointer;
transition:
background var(--dur-base) var(--ease-out),
border-color var(--dur-base) var(--ease-out),
color var(--dur-base) var(--ease-out);
}
.sx-end-button:hover:not(:disabled) {
background: color-mix(in srgb, var(--crit-tint) 86%, var(--bg-surface));
border-color: var(--crit-solid);
}
.sx-end-button:disabled {
cursor: not-allowed;
opacity: 0.6;
}
.sx-coach-modal {
position: fixed;
inset: 0;
z-index: 78;
display: grid;
place-items: center;
padding: var(--sp-4);
background: rgba(3, 9, 8, 0.58);
backdrop-filter: blur(8px);
}
.sx-coach-modal__panel {
width: min(100%, 560px);
max-height: min(720px, calc(100vh - 32px));
display: grid;
grid-template-rows: auto minmax(0, 1fr) auto;
border: 1px solid rgba(203, 227, 220, 0.16);
border-radius: var(--radius-lg);
background: color-mix(in srgb, var(--bg-surface) 94%, #17201d);
color: var(--text-body);
box-shadow: 0 26px 70px rgba(0, 0, 0, 0.42);
overflow: hidden;
}
.sx-coach-modal__head {
display: grid;
grid-template-columns: auto minmax(0, 1fr);
gap: var(--sp-3);
align-items: start;
padding: var(--sp-5) var(--sp-5) var(--sp-3);
border-bottom: 1px solid rgba(203, 227, 220, 0.12);
}
.sx-coach-modal__avatar {
width: 38px;
height: 38px;
border-radius: 50%;
display: inline-grid;
place-items: center;
background: #e8edf0;
color: var(--text-strong);
}
.sx-coach-modal__avatar span {
width: 17px;
height: 9px;
border-radius: 999px;
border: 2px solid currentColor;
border-top-color: transparent;
}
.sx-coach-modal h2 {
margin: 0;
color: var(--text-strong);
font-size: 19px;
font-weight: 760;
line-height: 1.35;
}
.sx-coach-modal p {
margin: 5px 0 0;
color: var(--text-muted);
font-size: var(--fs-sm);
line-height: 1.55;
}
.sx-coach-modal__body {
overflow: auto;
padding: var(--sp-4) var(--sp-5);
display: grid;
gap: var(--sp-3);
}
.sx-coach-evidence-block {
display: grid;
gap: 8px;
}
.sx-coach-evidence-block b {
color: var(--text-strong);
font-size: 13px;
}
.sx-coach-evidence-block p {
margin: 0;
color: var(--text-body);
overflow-wrap: anywhere;
}
.sx-coach-evidence-block p.is-warn {
color: var(--warn-text);
}
.sx-coach-evidence-block blockquote {
margin: 0;
padding: 10px 12px;
border-radius: var(--radius);
background: rgba(255, 255, 255, 0.06);
color: var(--text-strong);
font-size: var(--fs-sm);
line-height: 1.55;
overflow-wrap: anywhere;
}
.sx-coach-source-list {
list-style: none;
display: grid;
gap: 8px;
margin: 0;
padding: 0;
}
.sx-coach-source-list li {
display: grid;
gap: 3px;
padding: 9px 10px;
border-radius: var(--radius);
background: rgba(255, 255, 255, 0.05);
}
.sx-coach-source-list span {
color: var(--text-strong);
font-size: var(--fs-sm);
font-weight: 650;
}
.sx-coach-source-list small {
color: var(--text-muted);
font-size: 12px;
overflow-wrap: anywhere;
}
.sx-coach-modal__actions {
display: flex;
justify-content: flex-end;
padding: var(--sp-3) var(--sp-5) var(--sp-5);
border-top: 1px solid rgba(203, 227, 220, 0.12);
}
.sx-coach-modal__actions button {
min-height: 40px;
padding: 9px 13px;
border-radius: var(--radius);
border: 1px solid rgba(203, 227, 220, 0.16);
background: rgba(255, 255, 255, 0.07);
color: var(--text-body);
font-family: var(--font-sans);
font-size: var(--fs-sm);
font-weight: 700;
cursor: pointer;
}
.sx-coach-modal__actions button:hover {
background: rgba(255, 255, 255, 0.11);
color: var(--text-strong);
}
.sx-end-dialog {
position: fixed;
inset: 0;
z-index: 80;
display: grid;
place-items: center;
padding: var(--sp-4);
background: rgba(3, 9, 8, 0.62);
backdrop-filter: blur(8px);
}
/* 패널도 다크 stage 잔재였다. 배경만 하드코딩 다크였고 글자는 테마 토큰이라
라이트에서 제목 2.68:1 · 본문 1.14:1로 사실상 보이지 않았다. 불투명 토큰
표면으로 되돌린다(스크림 위라 유리 표면 대신 불투명 --bg-app 사용). */
.sx-end-dialog__panel {
width: min(100%, 420px);
padding: var(--sp-5);
border: 1px solid var(--glass-border);
border-radius: var(--radius-lg);
background: var(--glass-specular), var(--bg-app);
box-shadow: 0 26px 70px rgba(0, 0, 0, 0.34);
color: var(--text-body);
}
.sx-end-dialog__head {
display: grid;
grid-template-columns: auto minmax(0, 1fr);
gap: var(--sp-3);
align-items: start;
}
.sx-end-dialog__icon {
width: 36px;
height: 36px;
border-radius: var(--radius);
display: inline-flex;
align-items: center;
justify-content: center;
background: var(--crit-tint);
color: var(--crit-text);
}
.sx-end-dialog h2 {
margin: 0;
color: var(--text-strong);
font-size: 19px;
font-weight: 760;
line-height: 1.35;
}
.sx-end-dialog p {
margin: 6px 0 0;
color: var(--text-muted);
font-size: var(--fs-sm);
line-height: 1.55;
}
.sx-end-dialog__actions {
display: flex;
justify-content: flex-end;
gap: var(--sp-2);
margin-top: var(--sp-5);
flex-wrap: wrap;
}
.sx-end-dialog__secondary,
.sx-end-dialog__danger {
min-height: 40px;
padding: 9px 13px;
border-radius: var(--radius);
font-family: var(--font-sans);
font-size: var(--fs-sm);
font-weight: 700;
}
.sx-end-dialog__secondary {
border: 1px solid var(--border-subtle, var(--hair));
background: var(--bg-surface-2);
color: var(--text-body);
}
.sx-end-dialog__danger {
border: 1px solid transparent;
background: var(--crit-solid);
color: var(--text-on-accent);
}
.sx-end-dialog__secondary:hover:not(:disabled) {
background: var(--bg-tint);
color: var(--text-strong);
}
.sx-end-dialog__danger:hover:not(:disabled) {
background: var(--crit-text);
}
.sx-end-dialog__secondary:disabled,
.sx-end-dialog__danger:disabled {
cursor: not-allowed;
opacity: 0.62;
}
/* ── 시작 전 오버레이 (세션 시작) ── */
.sx-prestart {
width: 100%;
display: grid;
/* 트랙 최소치를 0으로 둬 컨테이너가 좁아져도 트랙이 끝까지 축소되게 한다(구조적 넘침 불가).
이전 minmax(220px,…) minmax(360px,…) minmax(260px,…) 는 최소 합 840px+gap 48px=888px 를
요구했는데, 뷰포트 1041~1240px 구간은 셸 사이드바를 뺀 실제 컨테이너가 735~886px 뿐이라
3열이 축소되지 못하고 우측 "진행 초점" 패널이 최대 195px 잘려 안 보였다.
overflow-x:hidden 이라 스크롤도 안 되고 문서 오버플로도 0 이라 기존 게이트가 못 잡았다.
아래 2열 전환(≤1260px)과 이 최소치 0 이 이중 안전망이다. (2026-07-27) */
grid-template-columns: minmax(0, 0.82fr) minmax(0, 1.72fr) minmax(0, 0.98fr);
align-items: center;
gap: var(--sp-5);
max-width: none;
margin: 0;
padding: clamp(16px, 2vw, 24px);
align-self: start;
justify-self: center;
text-align: left;
position: relative;
border-radius: var(--radius-lg);
color: var(--text-strong);
overflow: hidden;
}
.sx-page--prestart .sx-head {
width: 100%;
margin: 0;
}
.sx-page--prestart .sx-head__title,
.sx-page--prestart .sx-ph.is-cur .sx-ph__name {
color: var(--text-strong);
}
.sx-page--prestart .sx-head__title em {
color: var(--accent-deep);
}
.sx-page--prestart .sx-head__sub,
.sx-page--prestart .sx-ph__name,
.sx-page--prestart .sx-ph__t {
color: var(--text-muted);
}
.sx-page--prestart .sx-ph__dot {
background: var(--bg-surface-2);
border-color: var(--border-strong);
}
.sx-page--prestart .sx-ph__link {
background: var(--border-subtle);
}
.sx-page--prestart .sx-ph__link.is-fill {
background: var(--accent-bright);
}
.sx-page--prestart .sx-prestart::before {
content: "";
position: absolute;
inset: 0;
background:
linear-gradient(90deg, color-mix(in srgb, var(--text-strong) 6%, transparent), transparent 38%),
radial-gradient(circle at 20% 22%, color-mix(in srgb, var(--accent) 18%, transparent), transparent 32%);
pointer-events: none;
}
/* 중복 목록을 걷어내 카드 내용이 초상+이름+한 줄 소개로 줄었다. 예전처럼 열 전체 높이로
늘리면(align-self:stretch) 위아래가 크게 비어 허전해 보여서, 내용 높이만큼만 차지하고
부모 그리드의 align-items:center 로 세로 가운데에 놓이게 바꿨다. */
.sx-prestart__visual {
min-width: 0;
display: grid;
justify-items: center;
gap: var(--sp-3);
position: relative;
z-index: 1;
align-self: center;
align-content: center;
padding: var(--sp-4) var(--sp-3) var(--sp-5);
border-radius: var(--radius);
}
/* 아바타 카드는 이름 + 한 줄 소개만 남긴다. 호소·대상·난도 목록(ul)과 이니셜 원은
본문 사실 목록/초상과 중복이라 제거했다(관련 규칙도 함께 삭제).
내용이 줄어든 만큼 초상 바로 아래 가운데 정렬로 붙여 허전해 보이지 않게 한다. */
.sx-prestart__case {
width: 100%;
min-width: 0;
display: grid;
gap: 4px;
justify-items: center;
text-align: center;
}
.sx-prestart__case b {
display: block;
color: var(--text-strong);
font-size: 18px;
line-height: 1.35;
}
.sx-prestart__case p {
margin: 0;
color: var(--text-body);
font-size: 13px;
line-height: 1.5;
max-width: 24ch;
}
/* D3 — 줄당 가운뎃점 1개가 되도록 나눠 흘린 소개 줄 */
.sx-prestart__case p span {
display: block;
}
.sx-prestart__main {
min-width: 0;
position: relative;
z-index: 1;
}
/* D4 — .sx-prestart__eyebrow("○○ 단계 준비") 는 페이지 제목과 같은 말이라 마크업과
함께 제거했다. 이제 제목이 본문 첫 요소라 위 여백을 지운다. */
.sx-prestart__title {
margin-top: 0;
font-size: var(--fs-h2);
font-weight: 700;
letter-spacing: 0;
color: var(--text-strong);
line-height: 1.3;
}
.sx-prestart__desc {
margin-top: var(--sp-3);
font-size: var(--fs-sm);
color: var(--text-body);
line-height: 1.6;
max-width: 58ch;
}
.sx-voice-consent {
position: fixed;
inset: 0;
z-index: 82;
display: grid;
place-items: center;
padding: var(--sp-4);
background: rgba(5, 12, 10, 0.58);
backdrop-filter: blur(9px);
}
.sx-voice-consent__panel {
box-sizing: border-box;
width: min(100%, 560px);
max-height: min(760px, calc(100% - 32px));
overflow: hidden;
display: grid;
grid-template-rows: auto minmax(0, 1fr) auto;
padding: clamp(20px, 4vw, 28px);
border: 1px solid var(--border-strong);
border-radius: var(--radius-lg);
background: var(--bg-surface);
box-shadow: 0 28px 78px color-mix(in srgb, var(--bg-canvas) 58%, transparent);
color: var(--text-body);
}
.sx-voice-consent__body {
min-height: 0;
overflow-y: auto;
padding-right: 3px;
scrollbar-gutter: stable;
}
.sx-voice-consent__head {
display: grid;
grid-template-columns: auto minmax(0, 1fr);
gap: var(--sp-3);
align-items: start;
}
.sx-voice-consent__icon {
width: 40px;
height: 40px;
border-radius: var(--radius);
display: inline-flex;
align-items: center;
justify-content: center;
background: var(--accent-tint);
color: var(--accent-deep);
}
.sx-voice-consent h2 {
margin: 0;
color: var(--text-strong);
font-size: 20px;
font-weight: 760;
line-height: 1.35;
}
.sx-voice-consent p {
margin: 6px 0 0;
color: var(--text-muted);
font-size: var(--fs-sm);
line-height: 1.6;
}
.sx-voice-consent__facts {
margin: var(--sp-5) 0 0;
}
.sx-voice-consent__facts > div {
display: grid;
grid-template-columns: 92px minmax(0, 1fr);
gap: var(--sp-3);
padding: 11px 0;
border-bottom: 1px solid var(--border-subtle);
}
.sx-voice-consent__facts > div:first-child {
border-top: 1px solid var(--border-subtle);
}
.sx-voice-consent__facts dt,
.sx-voice-consent__facts dd {
margin: 0;
font-size: 12.5px;
line-height: 1.55;
}
.sx-voice-consent__facts dt {
color: var(--text-strong);
font-weight: 740;
}
.sx-voice-consent__facts dd {
color: var(--text-body);
}
.sx-voice-consent .sx-voice-consent__boundary {
margin-top: var(--sp-4);
padding: 11px 12px;
border-radius: var(--radius);
background: color-mix(in srgb, var(--accent-tint) 54%, var(--bg-surface-2));
color: var(--text-body);
font-size: 11.5px;
}
.sx-voice-consent .sx-voice-consent__error {
margin-top: var(--sp-3);
padding: 10px 12px;
border: 1px solid color-mix(in srgb, var(--danger) 42%, var(--border-subtle));
border-radius: var(--radius);
background: color-mix(in srgb, var(--danger) 10%, var(--bg-surface));
color: var(--danger);
font-size: 12px;
font-weight: 680;
}
.sx-voice-consent__actions {
display: flex;
justify-content: flex-end;
gap: var(--sp-2);
margin-top: var(--sp-5);
padding-top: var(--sp-3);
border-top: 1px solid var(--border-subtle);
flex-wrap: wrap;
}
.sx-voice-consent__secondary,
.sx-voice-consent__primary {
min-height: 42px;
padding: 10px 15px;
border-radius: var(--radius);
font-family: var(--font-sans);
font-size: var(--fs-sm);
font-weight: 720;
cursor: pointer;
transition:
transform var(--dur-fast) var(--ease-out),
background var(--dur-base) var(--ease-out),
border-color var(--dur-base) var(--ease-out);
}
.sx-voice-consent__secondary {
border: 1px solid var(--border-strong);
background: var(--bg-surface-2);
color: var(--text-body);
}
.sx-voice-consent__primary {
border: 1px solid var(--accent-deep);
background: var(--accent-deep);
color: var(--text-on-accent);
}
.sx-voice-consent__secondary:hover {
border-color: var(--border-focus);
color: var(--text-strong);
}
.sx-voice-consent__primary:hover {
background: var(--accent);
}
.sx-voice-consent__secondary:active,
.sx-voice-consent__primary:active {
transform: scale(0.98);
}
.sx-voice-consent__secondary:disabled,
.sx-voice-consent__primary:disabled {
cursor: wait;
opacity: 0.68;
transform: none;
}
@media (max-width: 560px) {
.sx-voice-consent {
place-items: end center;
padding: 10px;
}
.sx-voice-consent__panel {
max-height: calc(100% - 20px);
border-radius: 16px;
padding-bottom: max(16px, env(safe-area-inset-bottom));
}
.sx-voice-consent__facts > div {
grid-template-columns: 1fr;
gap: 3px;
}
.sx-voice-consent__actions {
display: grid;
grid-template-columns: minmax(0, 0.86fr) minmax(0, 1.14fr);
}
.sx-voice-consent__actions button {
width: 100%;
}
}
.sx-voice-retry {
flex: none;
min-height: 38px;
padding: 0 12px;
border: 1px solid color-mix(in srgb, var(--accent-deep) 44%, var(--border-strong));
border-radius: var(--radius-sm);
background: color-mix(in srgb, var(--accent-tint) 74%, var(--bg-surface));
color: var(--accent-deep);
display: inline-flex;
align-items: center;
justify-content: center;
gap: 6px;
font-family: var(--font-sans);
font-size: 12px;
font-weight: 800;
cursor: pointer;
white-space: nowrap;
}
.sx-voice-retry:hover {
border-color: var(--border-focus);
background: var(--accent-tint);
}
.sx-sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
.sx-voice-practice-context {
display: flex;
align-items: flex-start;
gap: var(--sp-3);
margin-top: var(--sp-4);
padding: var(--sp-3);
border: 1px solid var(--border-strong);
border-radius: var(--radius-sm);
color: var(--text-body);
background: var(--accent-tint);
}
.sx-voice-practice-context > svg {
flex: none;
color: var(--text-accent);
}
.sx-voice-practice-context h3,
.sx-voice-practice-context p,
.sx-voice-practice-context small {
display: block;
}
.sx-voice-practice-context h3 {
margin: 0;
color: var(--text-strong);
font-size: var(--fs-sm);
}
.sx-voice-practice-context p {
margin: 4px 0 0;
color: var(--text-body);
font-size: var(--fs-sm);
}
.sx-voice-practice-context small {
margin-top: 3px;
color: var(--text-muted);
font-size: var(--fs-xs);
line-height: 1.5;
}
.sx-practice-launch-context {
border-color: color-mix(in srgb, var(--accent) 45%, var(--border-subtle));
background: color-mix(in srgb, var(--accent-tint) 86%, var(--bg-surface));
}
.sx-prestart__settings {
min-width: 0;
margin-top: var(--sp-3);
}
.sx-prestart__settings:not(.is-prescribed) > summary {
display: none;
}
.sx-prestart__settings > summary {
min-width: 0;
min-height: 44px;
display: grid;
grid-template-columns: auto minmax(0, 1fr) auto;
align-items: center;
gap: 10px;
padding: 10px 12px;
border: 1px solid var(--glass-inset-border);
border-radius: var(--radius-sm);
background: var(--glass-surface-inset);
color: var(--text-body);
cursor: pointer;
list-style: none;
}
.sx-prestart__settings > summary::-webkit-details-marker {
display: none;
}
.sx-prestart__settings > summary span {
color: var(--accent-deep);
font-size: 11.5px;
font-weight: 760;
}
.sx-prestart__settings > summary b {
min-width: 0;
overflow: hidden;
color: var(--text-strong);
font-size: 12.5px;
font-weight: 720;
text-overflow: ellipsis;
white-space: nowrap;
}
.sx-prestart__settings > summary svg {
transition: transform var(--dur-base) var(--ease-out);
}
.sx-prestart__settings[open] > summary svg {
transform: rotate(90deg);
}
.sx-prestart__settings > summary:focus-visible {
outline: 2px solid var(--focus-ring);
outline-offset: 2px;
}
.sx-prestart__settings-body {
min-width: 0;
}
.sx-prestart__settings.is-prescribed[open] .sx-prestart__settings-body {
padding-top: var(--sp-2);
}
/* 사실 목록. repeat(3, 1fr) 고정이면 항목이 1개뿐인 상태(페르소나 로딩/폴백)에서도
칸이 1/3 로 쪼개져 값이 세로로 길게 잘렸다(결함 #2). auto-fit 으로 바꿔 남는 트랙을
접고, 항목 수·폭에 따라 1~3열로 스스로 접히게 한다. */
.sx-prestart__facts {
margin: var(--sp-4) 0 0;
padding: var(--sp-3) 0;
border-top: 1px solid var(--hair);
border-bottom: 1px solid var(--hair);
display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(100%, 96px), 1fr));
gap: var(--sp-4);
}
.sx-page--prestart .sx-prestart__facts {
border-color: var(--glass-inset-border);
}
.sx-prestart__facts div {
min-width: 0;
}
.sx-prestart__facts dt {
color: var(--text-muted);
font-size: 11.5px;
font-weight: 700;
}
/* 값은 2줄 클램프로 잘라 쓰던 자리다. 폴백 문구("실제 연습 대상 정보를 확인하고
있습니다.")가 320~421 등에서 113px 잘려 나가 클램프를 걷고 전문을 흘린다.
대신 데스크톱 한 화면 제약은 아래 min-width:1181px 블록에서 사실 블록 자체의
최대 높이 + 내부 스크롤로 지킨다. */
.sx-prestart__facts dd {
margin: 6px 0 0;
color: var(--text-strong);
font-size: 13.5px;
font-weight: 650;
line-height: 1.4;
display: block;
overflow: visible;
overflow-wrap: anywhere;
}
/* 데스크톱은 문서 스크롤 없이 한 화면에 들어가야 하므로, 페르소나 요약이 아주 길 때만
사실 블록 안에서 스크롤되게 상한을 둔다(잘라내지 않는다). */
@media (min-width: 1181px) {
.sx-prestart__facts {
max-height: 152px;
overflow-y: auto;
}
}
.sx-prestart__chips {
display: flex;
flex-wrap: wrap;
gap: 7px;
margin-top: var(--sp-4);
}
.sx-prestart__chips span {
display: inline-flex;
align-items: center;
min-height: 26px;
padding: 0 10px;
border-radius: var(--radius-sm);
background: var(--accent-tint);
color: var(--accent-deep);
font-family: var(--font-num);
font-size: 11.5px;
font-weight: 700;
}
.sx-prestart__chips span.is-clay {
background: var(--clay-tint);
color: var(--clay-deep);
}
/* 아래 두 여백(이론모드 위 / 시작 버튼 위)은 dd 클램프를 걷어내면서 늘어난 세로
12px 을 되돌려 받는 자리다. 프리스타트는 1280x900 에서 문서 스크롤 없이 들어가야
한다(이 파일 상단 .vg-main:has(.sx-prestart--...) 규칙과 같은 제약). */
.sx-theory {
width: min(100%, 520px);
margin: var(--sp-3) 0 0;
padding: 0;
border: 0;
display: grid;
gap: 8px;
}
.sx-theory legend {
padding: 0;
color: var(--text-muted);
font-size: 11.5px;
font-weight: 760;
}
.sx-theory__seg {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 6px;
padding: 4px;
border-radius: var(--radius-sm);
background: var(--glass-surface-inset);
border: 1px solid var(--glass-inset-border);
}
.sx-theory__seg button {
min-width: 0;
min-height: 56px;
display: grid;
align-content: center;
gap: 3px;
padding: 8px 7px;
border: 1px solid transparent;
border-radius: calc(var(--radius-sm) - 2px);
background: transparent;
color: var(--text-body);
text-align: center;
cursor: pointer;
}
.sx-theory__seg button:hover {
border-color: color-mix(in srgb, var(--accent) 40%, var(--glass-inset-border));
color: var(--text-strong);
}
.sx-theory__seg button:focus-visible {
outline: 2px solid var(--border-focus);
outline-offset: 2px;
}
.sx-theory__seg button.is-selected {
background: var(--accent-tint);
border-color: color-mix(in srgb, var(--accent) 58%, var(--glass-inset-border));
color: var(--text-strong);
box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--text-strong) 5%, transparent);
}
.sx-theory__seg span,
.sx-theory__seg small {
min-width: 0;
overflow-wrap: anywhere;
line-height: 1.2;
}
.sx-theory__seg span {
font-size: 13px;
font-weight: 760;
}
.sx-theory__seg small {
color: var(--text-muted);
font-size: 11px;
font-weight: 650;
}
/* 상태 안내문. 예전에는 목표 fieldset 과의 간격을 줄이려고 margin-top 을 -12px 로
당겨 썼는데, .sx-goals 는 마진이 0 으로 끝나는 블록이라 그 -12px 이 그대로
fieldset 마지막 줄(목표 힌트) 위로 파고들었다. 320~1536 전 폭에서 88x12 겹침이
재현돼(프리스타트 결함 #1) 음수 마진을 걷어내고 양수 간격으로 되돌린다. */
.sx-prestart__note {
max-width: 460px;
font-size: 12.5px;
color: var(--text-muted);
line-height: 1.55;
margin-top: var(--sp-2);
}
.sx-prestart__err {
font-size: var(--fs-sm);
color: var(--crit-text);
}
.sx-consent {
width: min(100%, 520px);
display: grid;
gap: var(--sp-3);
padding: var(--sp-4);
border: 1px solid color-mix(in srgb, var(--accent) 32%, var(--glass-inset-border));
border-radius: var(--radius-sm);
background: color-mix(in srgb, var(--accent-tint) 72%, transparent);
}
.sx-consent label {
display: flex;
align-items: flex-start;
gap: var(--sp-3);
color: var(--text-body);
font-size: var(--fs-sm);
line-height: 1.5;
}
.sx-consent input {
width: 17px;
height: 17px;
margin-top: 2px;
accent-color: var(--accent);
flex: 0 0 auto;
}
.sx-consent .vg-btn {
justify-self: start;
}
.sx-prestart__voice-disclosure {
width: min(100%, 520px);
display: flex;
align-items: flex-start;
gap: 7px;
margin: var(--sp-3) 0 0;
font-size: 11.5px;
text-wrap: pretty;
}
.sx-prestart__actions {
display: flex;
align-items: center;
gap: var(--sp-4);
flex-wrap: wrap;
margin-top: var(--sp-4);
}
.sx-prestart__actions span {
color: var(--text-muted);
font-size: var(--fs-xs);
line-height: 1.45;
}
.sx-prestart__plan {
min-width: 0;
align-self: stretch;
display: grid;
align-content: start;
gap: var(--sp-3);
position: relative;
z-index: 1;
padding: clamp(18px, 1.7vw, 24px);
border-radius: var(--radius);
}
.sx-prestart__plan-summary {
margin: 0;
color: var(--text-muted);
font-size: 11.5px;
line-height: 1.55;
text-wrap: pretty;
}
.sx-prestart__plan-list {
margin: 0;
display: grid;
gap: 0;
}
.sx-prestart__plan-list div {
min-width: 0;
display: grid;
gap: 5px;
padding: 12px 0;
border-top: 1px solid var(--glass-inset-border);
}
.sx-prestart__plan-list dt {
color: var(--accent-deep);
font-size: 10.5px;
font-weight: 760;
letter-spacing: 0.04em;
}
.sx-prestart__plan-list dd {
margin: 0;
color: var(--text-body);
font-size: 11.5px;
line-height: 1.55;
text-wrap: pretty;
}
.sx-prestart__plan-list dd b {
display: block;
margin-bottom: 2px;
color: var(--text-strong);
font-size: 12.5px;
font-weight: 720;
}
/* 일시정지 stage 오버레이 (차분) */
.sx-stage.is-paused::after {
content: "일시정지";
position: absolute;
inset: 12px;
display: flex;
align-items: flex-start;
justify-content: flex-end;
padding: 12px;
font-size: 13px;
font-weight: 600;
letter-spacing: 0.04em;
color: #f4faf7;
border: 1px solid rgba(203, 227, 220, 0.14);
border-radius: calc(var(--radius-lg) - 2px);
background:
linear-gradient(135deg, rgba(238, 244, 242, 0.08), rgba(151, 175, 166, 0.06));
backdrop-filter: blur(0.5px);
text-shadow: 0 1px 2px rgba(7, 16, 14, 0.5);
}
/* ── 반응형 ── */
/* 3열이 실제로 들어가는 최소 컨테이너는 888px 이고, 그 폭은 뷰포트 1241px 부터 확보된다.
기존 전환점 1040px 은 200px 짜리 사각지대(1041~1240)를 남겨 우측 패널이 잘렸다.
안전 마진을 두고 1260px 까지 2열(사이드 패널은 하단 전체 폭)로 내린다. (2026-07-27) */
@media (max-width: 1260px) {
.sx-prestart {
grid-template-columns: minmax(180px, 230px) minmax(0, 1fr);
}
/* 2열 구간은 본문 열이 훨씬 길어서 초상 카드를 세로 가운데에 두면 혼자 아래로 처진다.
제목과 같은 높이에서 시작하도록 위쪽에 붙인다. */
.sx-prestart__visual {
align-self: start;
}
.sx-prestart__plan {
grid-column: 1 / -1;
padding-top: var(--sp-4);
border-top: 1px solid var(--hair);
}
.sx-prestart__plan-list {
grid-template-columns: repeat(2, minmax(0, 1fr));
column-gap: var(--sp-5);
}
}
@media (max-width: 1180px) {
.sx-page--active {
grid-template-rows: min-content minmax(0, 1fr) min-content;
padding: 10px;
gap: 10px;
}
.sx-page--active .sx-head {
display: none;
}
.sx-page--active .sx-grid {
grid-template-columns: minmax(216px, 254px) minmax(0, 1fr);
grid-template-rows: auto minmax(0, 1fr);
gap: 10px;
height: auto;
min-width: 0;
min-height: 0;
}
.sx-page--active .sx-mobile-context {
display: grid;
grid-column: 1 / -1;
grid-template-columns: minmax(0, 0.84fr) minmax(260px, 1.16fr);
gap: 8px;
padding: 9px;
border: 1px solid var(--border-subtle);
border-radius: var(--radius);
background: var(--bg-surface);
box-shadow: var(--shadow-sm);
}
.sx-page--active .sx-col-left {
grid-column: 1;
grid-row: 2;
}
.sx-page--active .sx-col-center {
grid-column: 2;
grid-row: 2;
grid-template-rows: minmax(154px, 0.28fr) minmax(0, 1fr);
gap: 10px;
}
.sx-page--active .sx-col-right {
display: none;
}
/* 코칭 모드는 우측 전체 진단 레일을 숨기더라도 코치 카드 자체는 보존한다.
881~1180px 구간에서 코칭 탭을 눌러도 아무것도 나타나지 않던 사각지대를 닫는다. */
.sx-page--active.sx-feedback-coached .sx-grid {
grid-template-rows: auto minmax(0, 1fr) auto;
}
.sx-page--active.sx-feedback-coached .sx-col-right {
display: flex;
grid-column: 1 / -1;
grid-row: 3;
min-height: 0;
overflow: visible;
}
.sx-page--active.sx-feedback-coached .sx-col-right .sx-meters,
.sx-page--active.sx-feedback-coached .sx-col-right .sx-safety--ok,
.sx-page--active.sx-feedback-coached .sx-signal__head,
.sx-page--active.sx-feedback-coached .sx-signal__one,
.sx-page--active.sx-feedback-coached .sx-signal__rest,
.sx-page--active.sx-feedback-coached .sx-signal__status,
.sx-page--active.sx-feedback-coached .sx-signal__seq,
.sx-page--active.sx-feedback-coached .sx-signal__defer {
display: none;
}
.sx-page--active.sx-feedback-coached .sx-col-right .sx-signal {
padding: 8px;
overflow: visible;
}
.sx-page--active.sx-feedback-coached .sx-coach-card {
grid-template-columns: 34px minmax(0, 1fr);
gap: 8px;
margin: 0;
}
.sx-page--active.sx-feedback-coached .sx-coach-avatar {
width: 34px;
height: 34px;
}
.sx-page--active.sx-feedback-coached .sx-coach-avatar__face {
left: 9px;
right: 9px;
top: 12px;
}
.sx-page--active.sx-feedback-coached .sx-coach-bubble {
padding: 8px 10px;
gap: 5px;
}
.sx-page--active.sx-feedback-coached .sx-coach-bubble blockquote {
display: none;
}
/* 위기 신호가 감지되면 어떤 화면 모드에서도 안전 패널(109 리소스 포함)을 노출한다.
압축 레이아웃이 안전 안내를 가리던 결함 수정 (2026-07-15). */
.sx-page--active.sx-has-safety .sx-col-right {
display: flex;
grid-column: 1 / -1;
grid-row: 3;
min-height: 0;
overflow: visible;
}
.sx-page--active.sx-has-safety:not(.sx-feedback-coached) .sx-col-right .sx-signal {
display: none;
}
.sx-page--active.sx-has-safety .sx-col-right .sx-meters {
display: none;
}
.sx-mobile-context__row {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 7px;
}
.sx-mobile-context__row:first-child {
grid-column: 1;
}
.sx-mobile-context__row span {
min-width: 0;
display: grid;
gap: 2px;
padding: 7px 8px;
border-radius: var(--radius-sm);
background: var(--bg-surface-2);
}
.sx-mobile-context__row b {
min-width: 0;
color: var(--text-strong);
font-size: 12.5px;
line-height: 1.25;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.sx-mobile-context__row small {
min-width: 0;
color: var(--text-muted);
font-size: 10.5px;
line-height: 1.2;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.sx-mobile-context__brief {
display: grid;
grid-column: 2;
grid-template-columns: minmax(0, 0.7fr) minmax(0, 1.3fr);
gap: 7px;
}
.sx-mobile-context__brief span {
min-width: 0;
display: grid;
gap: 2px;
padding: 7px 8px;
border-radius: var(--radius-sm);
background: var(--bg-surface-2);
}
.sx-mobile-context__brief b,
.sx-mobile-context__brief small {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
}
.sx-mobile-context__brief b {
color: var(--text-strong);
font-size: 12.5px;
line-height: 1.25;
white-space: nowrap;
}
.sx-mobile-context__brief small {
color: var(--text-muted);
font-size: 10.5px;
line-height: 1.2;
white-space: nowrap;
}
.sx-page--active .sx-stage {
grid-template-columns: minmax(110px, 132px) minmax(0, 1fr);
padding: 12px 14px;
column-gap: 12px;
}
.sx-page--active .sx-stage .vg-avatar {
width: 126px !important;
}
.sx-page--active .sx-stage .vg-avatar__stage {
height: 126px !important;
}
.sx-page--active .sx-stage .vg-avatar__svg {
width: 126px !important;
height: 126px !important;
}
.sx-page--active .sx-stage__now {
display: block;
font-size: 13px;
line-height: 1.35;
}
.sx-page--active .sx-stage__client {
gap: 5px;
}
.sx-page--active .sx-stage__client-kicker {
font-size: 13px;
}
.sx-page--active .sx-stage__client p {
font-size: 13px;
line-height: 1.45;
-webkit-line-clamp: 3;
}
.sx-page--active .sx-transcript__head {
margin-bottom: 8px;
}
.sx-page--active .sx-compose {
margin-top: 10px;
padding-top: 10px;
}
.sx-mobile-context__row--live {
grid-column: 1 / -1;
grid-template-columns: minmax(0, 1fr);
}
/* 전폭 신호 행: 라벨(좌)과 상태(우)를 양끝으로 펼쳐 빈 우측을 없앤다. */
.sx-mobile-context__row--live span {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
}
.sx-mobile-context__signal b {
min-width: 0;
display: inline-flex;
align-items: center;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.sx-mobile-context__signal small {
flex: none;
}
.sx-page--active .sx-mobile-context__row--meters {
display: none;
}
.sx-mobile-context__resume {
display: block;
}
/* 1180↓ 활성 화면: 일시정지는 아이콘만(44px 정사각). 같은 행의 마이크/세그먼트/
종료와 좁게 맞물리는 1024 부근에서 '|| + 일시정지' 라벨이 끼어 답답해지지 않게.
라벨만 숨기고 터치/클릭 타깃(44px)은 유지한다. */
.sx-page--active .sx-pause {
width: 44px;
height: 44px;
padding: 0;
justify-content: center;
font-size: 0;
}
}
@media (max-width: 880px) {
.sx-page {
padding: 9px;
gap: 9px;
}
.sx-page--active {
padding: 8px 9px 9px;
gap: 8px;
}
.sx-sessionbar {
min-height: 40px;
padding: 5px 6px;
gap: 7px;
}
.sx-sessionbar button {
min-height: 30px;
padding: 6px 8px;
font-size: 12px;
}
.sx-sessionbar__meta {
justify-content: flex-start;
}
.sx-sessionbar__actions {
gap: 6px;
}
.sx-page--active .sx-grid,
.sx-grid {
grid-template-columns: minmax(0, 1fr);
grid-template-rows: auto minmax(0, 1fr);
gap: 9px;
width: auto;
max-width: 100%;
min-height: 0;
}
.sx-page--active .sx-mobile-context {
grid-template-columns: minmax(0, 1fr);
gap: 7px;
padding: 8px;
}
.sx-mobile-context__row:first-child,
.sx-mobile-context__brief,
.sx-mobile-context__row--live {
grid-column: 1;
}
.sx-mobile-context__brief {
grid-template-columns: minmax(0, 1fr);
}
.sx-page--active .sx-col-left,
.sx-page--active .sx-col-left {
display: none;
}
.sx-page--active .sx-col-center {
grid-column: 1;
grid-row: 2;
grid-template-rows: minmax(132px, 0.24fr) minmax(0, 1fr);
gap: 9px;
width: 100%;
min-width: 0;
}
.sx-page--active .sx-stage,
.sx-page--active .sx-transcript,
.sx-page--active .sx-compose,
.sx-page--active .sx-controlbar {
min-width: 0;
max-width: 100%;
}
.sx-page--active .sx-stage {
padding: 8px 10px;
grid-template-columns: minmax(88px, 104px) minmax(0, 1fr);
column-gap: 10px;
}
.sx-page--active .sx-stage__client p {
font-size: 12.5px;
line-height: 1.4;
-webkit-line-clamp: 2;
}
.sx-page--active .sx-orb {
inset: -5px;
}
.sx-page--active .sx-stage .vg-avatar,
.sx-page--active .sx-stage .vg-avatar__svg {
width: 92px !important;
height: 92px !important;
}
.sx-page--active .sx-stage .vg-avatar__stage {
height: 92px !important;
}
.sx-col-right {
flex-direction: column;
}
.sx-page--active .sx-col-right {
display: none;
}
/* 위기 감지 시 안전 패널 노출 — ≤1180 규칙과 동일한 원칙 (2026-07-15). */
.sx-page--active.sx-has-safety .sx-col-right {
display: flex;
grid-column: 1;
grid-row: 3;
min-height: 0;
overflow: visible;
}
.sx-page--active.sx-has-safety:not(.sx-feedback-coached) .sx-col-right .sx-signal {
display: none;
}
.sx-page--active.sx-has-safety .sx-col-right .sx-meters {
display: none;
}
.sx-page--active.sx-feedback-coached .sx-grid {
grid-template-rows: max-content minmax(360px, max-content) max-content;
align-content: start;
overflow-y: auto;
overscroll-behavior: contain;
}
.sx-page--active.sx-feedback-coached .sx-col-center {
min-height: 360px;
}
.sx-page--active.sx-feedback-coached .sx-col-right {
display: flex;
grid-column: 1;
grid-row: 3;
min-height: 0;
overflow: visible;
}
.sx-page--active.sx-feedback-coached .sx-col-right .sx-meters,
.sx-page--active.sx-feedback-coached .sx-col-right .sx-safety--ok,
.sx-page--active.sx-feedback-coached .sx-signal__head,
.sx-page--active.sx-feedback-coached .sx-signal__one,
.sx-page--active.sx-feedback-coached .sx-signal__rest,
.sx-page--active.sx-feedback-coached .sx-signal__status,
.sx-page--active.sx-feedback-coached .sx-signal__seq,
.sx-page--active.sx-feedback-coached .sx-signal__defer {
display: none;
}
.sx-page--active.sx-feedback-coached .sx-col-right .sx-signal {
padding: 8px;
overflow: visible;
}
.sx-page--active.sx-feedback-coached .sx-coach-card {
grid-template-columns: 34px minmax(0, 1fr);
gap: 8px;
margin-top: 0;
}
.sx-page--active.sx-feedback-coached .sx-coach-avatar {
width: 34px;
height: 34px;
}
.sx-page--active.sx-feedback-coached .sx-coach-avatar__face {
left: 9px;
right: 9px;
top: 12px;
}
.sx-page--active.sx-feedback-coached .sx-coach-bubble {
padding: 8px 10px;
gap: 5px;
}
.sx-page--active.sx-feedback-coached .sx-coach-bubble blockquote {
display: none;
}
/* 근거·이력 접근은 코칭 신뢰성의 핵심 — 모바일에서도 유지한다 (2026-07-15).
공간 절약은 blockquote(발화 예시) 숨김까지만. */
.sx-head {
flex-direction: column;
align-items: flex-start;
}
.sx-phases {
flex-wrap: wrap;
}
.sx-controlbar {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
grid-template-areas:
"voice-disclosure voice-disclosure"
"mic actions"
"mode mode";
gap: 8px;
padding: 8px;
}
.sx-page--active .sx-controlbar {
min-height: 0;
}
.sx-page--active .sx-cb-sep {
display: none;
}
.sx-page--active .sx-mic-block {
grid-area: mic;
min-width: 0;
flex: 1 1 auto;
}
.sx-page--active .sx-mic-block__ms {
min-width: 0;
max-width: 112px;
display: flex;
}
.sx-page--active .sx-mic-block__h {
display: none;
}
.sx-page--active .sx-mic-block__disclosure {
display: none;
}
.sx-page--active .sx-controlbar__voice-disclosure {
grid-area: voice-disclosure;
display: flex;
max-width: 100%;
padding-inline: 2px;
}
.sx-page--active .sx-seg-block {
grid-area: mode;
gap: 3px;
width: 100%;
}
.sx-page--active .sx-seg-block__label {
display: none;
}
/* 절대배치 넛지가 좁은 폭에서 음성 건너뛰기 등 위쪽 컨트롤을 덮어 클릭을
가로채던 문제(결함 로그 #18) — 모바일에서는 플로우 배치로 전환한다. */
.sx-page--active .sx-coach-nudge {
position: static;
transform: none;
align-self: center;
margin: 0 auto 4px;
}
.sx-page--active .sx-segmented button {
font-size: 12px;
flex: 1 1 0;
padding: 7px 8px;
}
.sx-page--active .sx-mic {
width: 44px;
height: 44px;
}
.sx-page--active .sx-voice-retry {
min-height: 44px;
}
.sx-page--active .sx-mic-block.is-recovery .sx-mic-block__ms {
display: none;
}
.sx-page--active .sx-cb-actions {
grid-area: actions;
margin-left: 0;
gap: 10px;
}
/* 일시정지 = 일반 액션. 44px 정사각 터치 타깃(아이콘만). */
.sx-page--active .sx-pause {
width: 44px;
height: 44px;
padding: 0;
justify-content: center;
font-size: 0;
}
.sx-page--active .sx-end-button {
height: 44px;
padding: 0 12px;
font-size: 12px;
}
.sx-cb-spacer {
display: none;
}
}
@media (min-width: 1181px) and (max-height: 820px) {
.sx-page--active {
padding: 10px;
gap: 10px;
}
.sx-page--active .sx-grid {
gap: 10px;
}
.sx-page--active .sx-mobile-context {
padding: 8px;
gap: 6px;
}
.sx-mobile-context__row span {
padding: 6px 7px;
}
.sx-page--active .sx-col-center {
grid-template-rows: minmax(150px, 0.28fr) minmax(0, 1fr);
gap: 10px;
}
.sx-page--active .sx-stage {
padding: 10px 12px;
grid-template-columns: minmax(100px, 122px) minmax(0, 1fr);
column-gap: 12px;
}
.sx-page--active .sx-orb-wrap {
margin: 5px 0 2px;
}
.sx-page--active .sx-stage .vg-avatar {
width: 116px !important;
}
.sx-page--active .sx-stage .vg-avatar__stage {
height: 116px !important;
}
.sx-page--active .sx-stage .vg-avatar__svg {
width: 116px !important;
height: 116px !important;
}
.sx-page--active .sx-stage__now {
margin-top: 0;
font-size: 12px;
}
.sx-page--active .sx-transcript {
padding: 10px 12px;
}
.sx-page--active .sx-transcript__head {
margin-bottom: 6px;
}
.sx-page--active .sx-transcript__scroll {
min-height: 120px;
}
.sx-page--active .sx-compose {
gap: 8px;
margin-top: 8px;
padding-top: 8px;
}
.sx-page--active .sx-compose textarea {
min-height: 44px;
padding: 8px 10px;
}
}
@media (max-width: 720px) {
.sx-sessionbar__meta small {
display: none;
}
.sx-sessionbar__actions button:not(.sx-sessionbar__review) {
width: 32px;
padding: 0;
font-size: 0;
}
.sx-sessionbar .sx-sessionbar__back {
width: 34px;
min-width: 34px;
padding: 0;
overflow: hidden;
font-size: 0;
}
.sx-page--prestart .sx-head {
gap: var(--sp-3);
}
.sx-page--prestart .sx-head__sub,
.sx-page--prestart .sx-phases {
display: none;
}
.sx-page--prestart .sx-head__title {
font-size: 22px;
}
.sx-page--prestart .sx-prestart {
grid-template-columns: 140px minmax(0, 1fr);
gap: 10px;
max-width: none;
margin: 0 auto;
padding: 10px;
text-align: left;
}
.sx-page--prestart .sx-prestart__visual {
gap: 0;
padding: 8px;
align-self: start;
}
.sx-page--prestart .sx-prestart__visual .vg-avatar {
justify-self: center;
}
.sx-page--prestart .sx-prestart__case {
display: none;
}
.sx-page--prestart .sx-prestart__title {
margin-top: 6px;
font-size: 18px;
}
/* 2줄 클램프를 쓰던 자리. 본문 열이 좁아지는 320~421 에서 이 문장이 73px 잘려
나갔다(결함 #3). 1180 이하는 어차피 세로 스크롤이 있는 구간이라 전문을 흘린다. */
.sx-page--prestart .sx-prestart__desc {
font-size: 12.5px;
line-height: 1.45;
display: block;
overflow: visible;
}
.sx-page--prestart .sx-prestart__facts {
grid-template-columns: repeat(auto-fit, minmax(min(100%, 132px), 1fr));
gap: 6px;
margin-top: 8px;
padding: 8px 0;
}
.sx-page--prestart .sx-prestart__facts dd {
font-size: 11.5px;
}
.sx-page--prestart .sx-prestart__chips {
display: none;
}
.sx-page--prestart .sx-theory {
margin-top: 8px;
}
.sx-page--prestart .sx-theory__seg {
gap: 4px;
padding: 3px;
}
.sx-page--prestart .sx-theory__seg button {
min-height: 50px;
padding: 6px 4px;
}
.sx-page--prestart .sx-theory__seg span {
font-size: 12px;
}
.sx-page--prestart .sx-theory__seg small {
font-size: 10.5px;
}
.sx-page--prestart .sx-prestart__plan {
display: none;
}
.sx-page--prestart .sx-prestart__actions {
gap: var(--sp-2);
margin-top: 8px;
}
.sx-page--prestart .sx-prestart__actions .vg-btn {
width: 100%;
}
.sx-page--prestart .sx-prestart__actions span {
display: none;
}
.sx-page--prestart .vg-avatar {
width: 128px !important;
}
.sx-page--prestart .vg-avatar__stage {
height: 128px !important;
}
.sx-page--prestart .vg-avatar__svg {
width: 128px !important;
height: 128px !important;
}
.sx-page--active .sx-stage .vg-avatar,
.sx-page--active .sx-stage .vg-avatar__svg {
width: 84px !important;
height: 84px !important;
}
.sx-page--active .sx-stage .vg-avatar__stage {
height: 84px !important;
}
.sx-page--active .sx-stage {
grid-template-columns: minmax(78px, 98px) minmax(0, 1fr);
padding: 8px 10px;
column-gap: 10px;
}
.sx-page--active .sx-stage__now {
font-size: 12px;
margin-top: 0;
}
.sx-page--active .sx-transcript {
padding: 10px;
}
.sx-page--active .sx-compose {
gap: var(--sp-2);
margin-top: 9px;
padding-top: 9px;
}
.sx-page--active .sx-compose textarea {
min-height: 44px;
font-size: 13px;
line-height: 1.4;
}
.sx-voice-skip span {
display: none;
}
.sx-voice-skip {
width: 34px;
padding: 0;
justify-content: center;
}
}
@media (max-width: 420px) {
.sx-sessionbar {
grid-template-columns: auto minmax(0, 1fr) auto;
}
.sx-sessionbar .sx-sessionbar__back {
width: 34px;
min-width: 34px;
padding: 0;
overflow: hidden;
font-size: 0;
}
.sx-sessionbar__meta b {
max-width: 118px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.sx-page--active .sx-stage {
padding: 6px 8px;
}
.sx-page--active .sx-col-center {
grid-template-rows: minmax(104px, auto) minmax(0, 1fr);
}
.sx-page--active .sx-mobile-context {
gap: 6px;
padding: 7px;
}
.sx-page--active .sx-mobile-context__brief {
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 6px;
}
.sx-page--active .sx-mobile-context__brief span {
padding: 6px 7px;
}
/* 현재 상태와 감정은 모바일 요약·아바타 자체가 이미 전달한다. 좁은 stage의
세 번째 행을 중복 문구로 채우면 아바타와 겹치므로 420px 이하에서는 제거한다. */
.sx-page--active .sx-stage__now {
display: none;
}
.sx-page--active .sx-stage__client {
align-self: center;
gap: 4px;
}
.sx-page--active .sx-stage__client p {
-webkit-line-clamp: 2;
}
.sx-page--active .sx-orb {
inset: -5px;
}
.sx-page--active .sx-stage .vg-avatar,
.sx-page--active .sx-stage .vg-avatar__svg {
width: 88px !important;
height: 88px !important;
}
.sx-page--active .sx-stage .vg-avatar__stage {
height: 88px !important;
}
.sx-mobile-context__row {
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 6px;
}
.sx-mobile-context__row span {
padding: 7px 6px;
}
.sx-page--active .sx-transcript__scroll {
/* 축어록은 남은 높이를 쓰는 flex 자식이다. 고정 최소 높이를 두면 390px 폭에서도
텍스트 입력 폴백이 카드 아래로 잘리므로, 카드 안에서 유연하게 스크롤시킨다. */
min-height: 0;
}
.sx-page--active .sx-controlbar {
padding: 8px;
gap: 8px;
}
.sx-page--active .sx-mic-block {
gap: 9px;
}
.sx-page--active .sx-mic-block__ms {
display: none;
}
.sx-page--active .sx-segmented button {
font-size: 11px;
padding: 7px 6px;
}
.sx-page--active .sx-seg-block {
min-width: 0;
flex: 0 1 auto;
}
.sx-page--active .sx-cb-actions {
min-width: 0;
flex: 0 1 auto;
gap: 10px;
}
.sx-page--active .sx-pause {
width: 44px;
}
.sx-page--active .sx-end-button {
min-width: 116px;
}
.sx-page--active .sx-review-button {
min-width: 116px;
}
}
/* 프리스타트 아주 좁은 폭: 1180 이하 규칙이 아바타 열을 140px 로 고정해 두는데,
460px 아래에서는 본문 열에 128px 밖에 남지 않아 설명문·목표 버튼·사실값이 전부
짜부러졌다(결함 #2·#3 의 실제 원인). 이 구간만 세로 1열로 쌓는다. */
@media (max-width: 460px) {
.sx-page--prestart .sx-prestart {
grid-template-columns: minmax(0, 1fr);
gap: 8px;
}
.sx-page--prestart .sx-prestart__visual {
padding: 6px 8px;
}
.sx-page--prestart .sx-prestart--prescribed .sx-prestart__visual {
display: none;
}
.sx-page--prestart .sx-prestart--prescribed .sx-prestart__actions {
position: sticky;
z-index: 2;
bottom: max(8px, env(safe-area-inset-bottom));
padding: 6px;
border: 1px solid var(--glass-inset-border);
border-radius: var(--radius);
background: var(--glass-surface);
box-shadow: var(--glass-shadow);
}
}
@media (max-width: 1180px) and (max-height: 820px) {
.sx-sessionbar {
min-height: 38px;
padding: 4px 6px;
}
.sx-sessionbar button {
min-height: 28px;
padding: 5px 8px;
}
.sx-page--active .sx-mobile-context__row--meters {
display: none;
}
.sx-page--active .sx-mobile-context__row--live {
display: none;
}
.sx-page--active .sx-mobile-context__resume {
position: absolute;
right: 6px;
bottom: 6px;
z-index: 2;
display: block;
max-width: min(220px, calc(100% - 12px));
padding: 3px 6px;
border: 1px solid rgba(151, 175, 166, 0.26);
border-radius: 999px;
background: rgba(11, 24, 21, 0.9);
color: rgba(228, 250, 244, 0.9);
font-size: 10px;
line-height: 1.15;
pointer-events: none;
}
.sx-page--active .sx-col-center {
grid-template-rows: minmax(132px, 0.25fr) minmax(0, 1fr);
}
.sx-page--active .sx-stage {
padding: 8px 10px;
grid-template-columns: minmax(92px, 118px) minmax(0, 1fr);
}
.sx-page--active .sx-stage .vg-avatar,
.sx-page--active .sx-stage .vg-avatar__svg {
width: 112px !important;
height: 112px !important;
}
.sx-page--active .sx-stage .vg-avatar__stage {
height: 112px !important;
}
.sx-page--active .sx-orb-wrap {
margin: 4px 0 0;
}
.sx-page--active .sx-orb {
inset: -6px;
}
.sx-page--active .sx-transcript__scroll {
min-height: 110px;
}
.sx-page--active .sx-transcript {
padding: 8px 10px;
}
.sx-page--active .sx-transcript__head {
margin-bottom: 6px;
}
.sx-page--active .sx-compose {
margin-top: 7px;
padding-top: 7px;
}
.sx-page--active .sx-compose textarea {
min-height: 38px;
padding: 7px 10px;
}
.sx-page--active .sx-compose .vg-btn {
min-height: 38px;
}
}
@media (max-width: 380px), (max-height: 620px) {
.sx-sessionbar {
min-height: 36px;
}
.sx-sessionbar__meta small,
.sx-sessionbar__dot {
display: none;
}
.sx-page--active .sx-mobile-context__row--meters {
display: none;
}
.sx-page--active .sx-mobile-context__row {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
.sx-page--active .sx-mobile-context__row--live {
display: none;
}
.sx-page--active .sx-col-center {
grid-template-rows: minmax(82px, auto) minmax(0, 1fr);
}
.sx-page--active .sx-stage {
grid-template-columns: minmax(60px, 70px) minmax(0, 1fr);
padding: 5px 7px;
column-gap: 8px;
}
.sx-page--active .sx-orb {
inset: -3px;
}
.sx-page--active .sx-stage .vg-avatar,
.sx-page--active .sx-stage .vg-avatar__svg {
width: 62px !important;
height: 62px !important;
}
.sx-page--active .sx-stage .vg-avatar__stage {
height: 62px !important;
}
.sx-page--active .sx-stage__now {
display: none;
}
.sx-page--active .sx-transcript__scroll {
min-height: 110px;
}
.sx-page--active .sx-transcript {
padding: 5px 8px;
}
.sx-page--active .sx-transcript__head {
margin-bottom: 0;
}
.sx-page--active .sx-compose {
margin-top: 1px;
padding-top: 1px;
}
.sx-page--active .sx-transcript__empty {
grid-template-columns: minmax(0, 1fr);
gap: 2px;
padding: 2px 0;
}
.sx-page--active .sx-transcript__empty-dot {
display: none;
}
.sx-page--active .sx-transcript__empty b {
font-size: 12px;
line-height: 1.25;
}
.sx-page--active .sx-transcript__empty span {
font-size: 11px;
line-height: 1.25;
}
.sx-page--active .sx-mic-block__ms {
display: none;
}
/* 아주 좁거나 낮은 뷰포트: 세로 공간 확보를 위해 40px 로 낮춘다
(390x720 등 여유 있는 폭에서는 44px 유지). 가로 터치 폭은 유지. */
.sx-page--active .sx-mic {
width: 40px;
height: 40px;
}
.sx-page--active .sx-pause {
width: 44px;
height: 40px;
}
.sx-page--active .sx-end-button {
min-width: 104px;
height: 40px;
padding: 0 10px;
}
}
@media (max-width: 340px), (max-height: 620px) {
.sx-page--active .sx-mobile-context {
padding: 6px;
gap: 4px;
}
.sx-page--active .sx-mobile-context__row span {
padding: 5px 6px;
}
.sx-page--active .sx-mobile-context__brief {
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 4px;
}
.sx-page--active .sx-mobile-context__brief span {
padding: 5px 6px;
}
.sx-page--active .sx-mobile-context__row--live {
display: none;
}
.sx-page--active .sx-controlbar {
gap: 4px;
padding: 6px;
}
.sx-page--active .sx-controlbar__voice-disclosure {
overflow: hidden;
font-size: 9.5px;
line-height: 1.2;
text-overflow: ellipsis;
white-space: nowrap;
}
.sx-page--active .sx-col-center {
grid-template-rows: minmax(78px, auto) minmax(0, 1fr);
gap: 8px;
}
.sx-page--active .sx-stage {
justify-content: center;
grid-template-columns: minmax(58px, 66px) minmax(0, 1fr);
padding: 5px 7px;
column-gap: 8px;
}
.sx-page--active .sx-stage__top {
font-size: 11px;
}
.sx-page--active .sx-orb-wrap {
display: flex;
margin: 2px 0 0;
}
.sx-page--active .sx-orb {
inset: -3px;
}
.sx-page--active .sx-stage .vg-avatar,
.sx-page--active .sx-stage .vg-avatar__svg {
width: 58px !important;
height: 58px !important;
}
.sx-page--active .sx-stage .vg-avatar__stage {
height: 58px !important;
}
.sx-page--active .sx-transcript {
padding: 3px 6px;
}
.sx-page--active .sx-transcript__head {
margin-bottom: 0;
}
.sx-page--active .sx-transcript__empty {
gap: 8px;
padding: 8px 6px;
}
.sx-page--active .sx-compose {
margin-top: 1px;
padding-top: 1px;
}
.sx-page--active .sx-compose textarea {
min-height: 36px;
padding: 7px 9px;
}
.sx-page--active .sx-compose .vg-btn {
min-height: 36px;
padding: 7px 10px;
}
}
@media (prefers-reduced-motion: reduce) {
.sx-orb,
.sx-mic.is-on::after,
.sx-utt__caret,
.sx-utt__dots i,
.sx-coach-credit-pulse,
.sx-coach-card.is-loading .sx-coach-avatar__lens,
.sx-transcript__live-dot.is-live {
animation: none !important;
}
}
/* ═══════════════════════════════════════════════════════════════════
시간 기반 회기(2026-07-13 회의 P1): 목표 선택 · 시간 알람 · 목표 배지
═══════════════════════════════════════════════════════════════════ */
/* ── 시작 전: 이번 회기 목표 선택 ── */
.sx-goals {
width: min(100%, 520px);
margin: var(--sp-3) 0 0;
padding: 0;
border: 0;
display: grid;
gap: 8px;
}
.sx-goals legend {
padding: 0;
color: var(--text-muted);
font-size: 11.5px;
font-weight: 760;
}
.sx-goals legend small {
margin-left: 6px;
font-size: 11px;
font-weight: 650;
color: var(--text-muted);
}
.sx-goals__grid {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 6px;
padding: 4px;
border-radius: var(--radius-sm);
background: var(--glass-surface-inset);
border: 1px solid var(--glass-inset-border);
}
.sx-goals__grid button {
min-width: 0;
min-height: 62px;
display: grid;
align-content: center;
gap: 3px;
padding: 8px 7px;
border: 1px solid transparent;
border-radius: calc(var(--radius-sm) - 2px);
background: transparent;
color: var(--text-body);
text-align: center;
cursor: pointer;
}
.sx-goals__grid button:hover {
border-color: color-mix(in srgb, var(--accent) 40%, var(--glass-inset-border));
color: var(--text-strong);
}
.sx-goals__grid button:focus-visible {
outline: 2px solid var(--border-focus);
outline-offset: 2px;
}
.sx-goals__grid button.is-selected {
background: var(--accent-tint);
border-color: color-mix(in srgb, var(--accent) 58%, var(--glass-inset-border));
color: var(--text-strong);
box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--text-strong) 5%, transparent);
}
.sx-goals__grid span {
font-size: 13px;
font-weight: 760;
min-width: 0;
overflow-wrap: anywhere;
line-height: 1.2;
}
.sx-goals__grid small {
color: var(--text-muted);
font-size: 10.5px;
font-weight: 650;
min-width: 0;
overflow-wrap: anywhere;
line-height: 1.25;
}
.sx-goals__hint {
margin: 0;
font-size: 12px;
line-height: 1.55;
color: var(--text-muted);
}
@media (max-width: 720px) {
.sx-goals__grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
/* ── 시간 알람 바(10분 전 경고 · 시간 만료) — 강제 노출 배너 ── */
/* 시간 알람 바가 있으면 페이지 그리드가 4자식이 된다. 3행 템플릿 그대로면
타임바가 1fr 행을 차지하고 본 그리드가 min-content로 밀려 모바일에서
컨텍스트 패널이 타임바를 덮는 겹침이 생긴다(결함 로그 #18). */
.sx-page--active:has(> .sx-timebar) {
grid-template-rows: min-content min-content minmax(0, 1fr) min-content;
}
/* 이 바는 세션이 다크 stage 팔레트를 강제하던 시절의 잔재였다. --bg-panel은
어디에도 정의된 적이 없어 항상 하드코딩 다크 폴백으로 칠해졌고, 글자만
테마 토큰을 따라가 라이트에서 제목 1.13:1 · 설명 1.76:1까지 떨어졌다.
두 값 모두 의미색 토큰으로 되돌려 두 테마에서 같은 위계를 갖게 한다. */
.sx-timebar {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 8px 10px;
margin: 0 0 10px;
padding: 9px 14px;
border-radius: var(--radius);
border: 1px solid color-mix(in srgb, var(--warn-solid) 46%, transparent);
background: var(--warn-tint);
color: var(--text-strong);
font-size: 13px;
}
.sx-timebar b {
font-weight: 780;
letter-spacing: -0.01em;
}
.sx-timebar__desc {
color: var(--text-body);
font-weight: 560;
min-width: 0;
overflow-wrap: anywhere;
}
.sx-timebar__dot {
width: 8px;
height: 8px;
border-radius: 50%;
background: var(--warn-solid);
box-shadow: 0 0 0 0 color-mix(in srgb, var(--warn-solid) 50%, transparent);
animation: sx-timebar-pulse 1.8s ease-out infinite;
}
.sx-timebar.is-over {
border-color: color-mix(in srgb, var(--crit-solid) 48%, transparent);
background: var(--crit-tint);
}
.sx-timebar.is-over .sx-timebar__dot {
background: var(--crit-solid);
box-shadow: 0 0 0 0 color-mix(in srgb, var(--crit-solid) 50%, transparent);
}
.sx-timebar__end {
margin-left: auto;
padding: 6px 12px;
border-radius: calc(var(--radius-sm) - 1px);
border: 1px solid color-mix(in srgb, var(--crit-solid) 58%, transparent);
background: color-mix(in srgb, var(--crit-solid) 12%, transparent);
color: var(--crit-text);
font-size: 12.5px;
font-weight: 740;
cursor: pointer;
}
.sx-timebar__end:hover {
background: color-mix(in srgb, var(--crit-solid) 22%, transparent);
}
@keyframes sx-timebar-pulse {
0% { box-shadow: 0 0 0 0 rgba(228, 179, 99, 0.45); }
70% { box-shadow: 0 0 0 7px rgba(228, 179, 99, 0); }
100% { box-shadow: 0 0 0 0 rgba(228, 179, 99, 0); }
}
/* ── 스테이지 타이머 경고 상태 ── */
.sx-page--active .sx-stage__timer.is-warning {
color: #e8bd7a;
font-weight: 780;
}
/* ── 세션 진행 패널: 남은 시간 경고 + 목표 도달 노트 ── */
.sx-session-progress__grid span.is-warning b {
color: #e8bd7a;
}
.sx-session-progress__goalnote {
margin: 8px 0 0;
padding: 8px 10px;
border-radius: var(--radius-sm);
border: 1px solid rgba(151, 175, 166, 0.32);
background: rgba(151, 175, 166, 0.1);
color: var(--text-body, rgba(238, 244, 242, 0.78));
font-size: 12px;
line-height: 1.5;
}
/* ── 이번 회기 목표 배지(세로 트랙 + 헤더 미니) ── */
.sx-vstep__goal {
margin-left: 6px;
padding: 1.5px 6px;
border-radius: 999px;
border: 1px solid rgba(151, 175, 166, 0.4);
background: rgba(151, 175, 166, 0.12);
color: var(--accent-bright, #8fc0b4);
font-size: 10px;
font-weight: 740;
letter-spacing: 0.02em;
vertical-align: 1px;
}
.sx-vstep__goal.is-reached {
border-color: rgba(151, 175, 166, 0.62);
background: rgba(151, 175, 166, 0.24);
}
.sx-ph__goal {
margin-left: 4px;
padding: 0.5px 5px;
border-radius: 999px;
border: 1px solid rgba(151, 175, 166, 0.42);
background: rgba(151, 175, 166, 0.12);
color: var(--accent-bright, #8fc0b4);
font-size: 9.5px;
font-style: normal;
font-weight: 740;
}
@media (prefers-reduced-motion: reduce) {
.sx-timebar__dot {
animation: none !important;
}
}
/* ── 코칭 넛지 칩(코칭 탭이 닫혀 있을 때 도착한 코치 제안 안내) ── */
.sx-seg-block {
position: relative;
}
.sx-coach-nudge {
position: absolute;
bottom: calc(100% + 10px);
left: 50%;
transform: translateX(-50%);
display: inline-flex;
align-items: center;
gap: 7px;
white-space: nowrap;
padding: 7px 12px;
border-radius: 999px;
border: 1px solid color-mix(in srgb, var(--text-on-accent) 42%, transparent);
background: var(--accent-deep);
color: var(--text-on-accent);
font-size: 12px;
font-weight: 640;
cursor: pointer;
box-shadow: 0 8px 22px rgba(0, 0, 0, 0.35);
z-index: 30;
}
.sx-coach-nudge::after {
content: "";
position: absolute;
top: 100%;
left: 50%;
transform: translateX(-50%);
border: 5px solid transparent;
border-top-color: color-mix(in srgb, var(--text-on-accent) 42%, transparent);
}
.sx-coach-nudge:hover {
border-color: color-mix(in srgb, var(--text-on-accent) 72%, transparent);
}
.sx-coach-nudge em {
font-style: normal;
font-weight: 780;
color: currentColor;
}
.sx-coach-nudge__dot {
width: 7px;
height: 7px;
border-radius: 50%;
background: currentColor;
animation: sx-timebar-pulse 1.8s ease-out infinite;
}
.sx-segmented__badge.is-pulsing {
animation: sx-coach-badge-pulse 1.6s ease-in-out infinite;
}
@keyframes sx-coach-badge-pulse {
0%, 100% { transform: scale(1); }
50% { transform: scale(1.18); }
}
@media (prefers-reduced-motion: reduce) {
.sx-coach-nudge__dot,
.sx-segmented__badge.is-pulsing {
animation: none !important;
}
}
/* ── P2 단계 누적 게이지(세로 트랙) ── */
.sx-vstep__gauge {
display: flex;
align-items: center;
gap: 8px;
margin-top: 6px;
}
.sx-vstep__gauge .sx-gauge {
flex: 1 1 auto;
min-width: 0;
}
.sx-vstep__gauge em {
flex: 0 0 auto;
font-style: normal;
font-size: 10.5px;
font-weight: 740;
font-variant-numeric: tabular-nums;
color: var(--text-dim, rgba(238, 244, 242, 0.55));
min-width: 20px;
text-align: right;
}
.sx-track__note {
margin-top: 10px;
padding-top: 8px;
border-top: 1px dashed rgba(255, 255, 255, 0.08);
font-size: 11px;
line-height: 1.5;
color: var(--text-dim, rgba(238, 244, 242, 0.5));
}
/* ── 패널 컬랩싱 토글(과밀 완화, 2026-07-14) ── */
.sx-panel-toggle {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
width: 100%;
padding: 0;
border: 0;
background: transparent;
color: inherit;
cursor: pointer;
text-align: left;
}
.sx-panel-toggle:focus-visible {
outline: 2px solid var(--focus-ring);
outline-offset: 2px;
border-radius: 4px;
}
.sx-panel-toggle__hint {
flex: 0 0 auto;
font-size: 10.5px;
font-weight: 680;
color: var(--text-muted, rgba(238, 244, 242, 0.5));
white-space: nowrap;
}
.sx-panel-toggle:hover .sx-panel-toggle__hint {
color: var(--accent-bright);
}
.sx-panel.is-collapsed {
padding-bottom: 10px;
}
.sx-safety .sx-panel-toggle {
justify-content: flex-start;
}
.sx-safety .sx-panel-toggle .sx-safety__badge {
margin-left: auto;
}
/* Alliance checkpoint가 세션바와 본 그리드 사이에 들어오면 명시적으로 한 행을 소유한다.
하단의 대형 화면 재설계 규칙보다 구체적인 selector로 implicit-grid 겹침을 막는다. */
.sx-page--active:has(> .sx-alliance-checkpoint-slot) {
grid-template-rows: min-content min-content minmax(0, 1fr) min-content;
}
.sx-page--active:has(> .sx-timebar):has(> .sx-alliance-checkpoint-slot) {
grid-template-rows: min-content min-content min-content minmax(0, 1fr) min-content;
}
.sx-page--active.sx-alliance-gated,
.sx-page--active.sx-alliance-gated:has(> .sx-alliance-checkpoint-slot) {
grid-template-rows: min-content minmax(0, 1fr);
}
.sx-page--active.sx-alliance-gated:has(> .sx-timebar):has(> .sx-alliance-checkpoint-slot) {
grid-template-rows: min-content min-content minmax(0, 1fr);
}
@media (min-width: 1280px) {
.sx-page--active:has(> .sx-alliance-checkpoint-slot) {
grid-template-rows: 80px min-content minmax(0, 1fr) 116px;
}
.sx-page--active:has(> .sx-timebar):has(> .sx-alliance-checkpoint-slot) {
grid-template-rows: 80px min-content min-content minmax(0, 1fr) 116px;
}
.sx-page--active.sx-alliance-gated,
.sx-page--active.sx-alliance-gated:has(> .sx-alliance-checkpoint-slot) {
grid-template-rows: 80px minmax(0, 1fr);
}
.sx-page--active.sx-alliance-gated:has(> .sx-timebar):has(> .sx-alliance-checkpoint-slot) {
grid-template-rows: 80px min-content minmax(0, 1fr);
}
}
@media (min-width: 1280px) and (max-height: 820px) {
.sx-page--active:has(> .sx-alliance-checkpoint-slot) {
grid-template-rows: 52px min-content minmax(0, 1fr) 82px;
}
.sx-page--active:has(> .sx-timebar):has(> .sx-alliance-checkpoint-slot) {
grid-template-rows: 52px min-content min-content minmax(0, 1fr) 82px;
}
.sx-page--active.sx-alliance-gated,
.sx-page--active.sx-alliance-gated:has(> .sx-alliance-checkpoint-slot) {
grid-template-rows: 52px minmax(0, 1fr);
}
.sx-page--active.sx-alliance-gated:has(> .sx-timebar):has(> .sx-alliance-checkpoint-slot) {
grid-template-rows: 52px min-content minmax(0, 1fr);
}
}
/* 320×568 같은 저높이 폰에서는 mid 자기점검의 설명/버튼 줄바꿈만으로
축어록 행이 사라진다. G1 상태는 그대로 두고 collapsed 표현만 한 줄로 압축한다. */
@media (max-width: 420px) and (max-height: 620px) {
/* 40px 고정 행은 접힌 mid 스트립 전용이다. pre 게이트에서는 이 카드가
화면의 전부라, 같은 규칙이 걸리면 카드가 40px로 눌려 헤더와 축이 겹쳤다. */
.sx-page--active:not(.sx-alliance-gated):has(> .sx-alliance-checkpoint-slot) {
grid-template-rows: min-content 40px minmax(0, 1fr) min-content;
}
.sx-page--active > .sx-alliance-checkpoint.is-collapsed {
display: grid;
grid-template-columns: auto minmax(0, 1fr) auto;
align-items: center;
gap: 7px;
width: 100%;
min-height: 40px;
margin: 0;
padding: 5px 7px;
flex-wrap: nowrap;
}
.sx-page--active > .sx-alliance-checkpoint.is-collapsed > div > span {
display: none;
}
.sx-page--active > .sx-alliance-checkpoint.is-collapsed > div > b {
overflow: hidden;
font-size: 11px;
text-overflow: ellipsis;
white-space: nowrap;
}
.sx-page--active > .sx-alliance-checkpoint.is-collapsed .vg-btn {
width: auto;
min-height: 30px;
padding: 6px 8px;
font-size: 11px;
}
.sx-page--active .sx-coach-nudge {
gap: 5px;
margin-bottom: 1px;
padding: 5px 9px;
font-size: 0;
}
.sx-page--active .sx-coach-nudge em {
font-size: 11px;
}
/* 낮은 화면에서는 현재 내담자/마이크/진행 상태만 남기고, 이미 시작 전에
확인한 호소·이론 요약은 접는다. 확보한 높이는 축어록과 텍스트 폴백에 준다. */
.sx-page--active .sx-mobile-context__brief {
display: none;
}
/* 110px 고정 최소 높이는 입력창을 카드 바깥으로 밀어냈다. 중앙 그리드가
남은 높이를 배분하게 하되, 스크롤과 입력창 모두 transcript 안에 둔다. */
.sx-page--active .sx-transcript__scroll {
min-height: 0;
}
}
.vg-main:has(.sx-page--active) {
overflow: hidden;
scrollbar-gutter: auto;
}
/* ── 2026-07-31 botanical session workspace ──────────────────────────
사용자 제공 1536×1024 시안의 정보 위계를 데스크톱 세션에 고정한다.
기능 DOM은 유지하고 좌·우 레일을 각각 하나의 연속 표면으로 보이게 합친다. */
.sx-coach-summary {
min-width: 0;
display: grid;
gap: 8px;
align-self: center;
}
.sx-coach-card > .sx-coach-bubble {
grid-column: 1 / -1;
}
.sx-page--active {
position: relative;
isolation: isolate;
}
.sx-page--active::before,
.sx-page--active::after {
content: "";
position: absolute;
z-index: 0;
top: 0;
bottom: 0;
width: clamp(150px, 13vw, 220px);
pointer-events: none;
opacity: 0.48;
background-repeat: no-repeat;
filter: saturate(0.72);
}
.sx-page--active::before {
left: 0;
background-image:
url("/session-botanical/leaf-5.webp"),
url("/session-botanical/leaf-2.webp"),
url("/session-botanical/leaf-3.webp");
background-size: 330px auto, 245px auto, 260px auto;
background-position: -142px 5px, -128px 48%, -132px 94%;
}
.sx-page--active::after {
right: 0;
background-image:
url("/session-botanical/leaf-1.webp"),
url("/session-botanical/leaf-4.webp");
background-size: 330px auto, 350px auto;
background-position: -132px 33%, -148px 88%;
transform: scaleX(-1);
}
/* 보태니컬 ::before/::after 위로 본문을 올리는 규칙이다. 다만 종료 모달은
같은 직계 자식이라 이 규칙이 position:fixed를 relative로 덮어썼고, 오버레이가
화면을 덮는 대신 그리드 한 칸(1532×32px)으로 눌려 들어갔다. 오버레이는 제외한다. */
.sx-page--active > *:not(.sx-end-dialog) {
position: relative;
z-index: 1;
}
[data-theme="dark"] .sx-page--active::before,
[data-theme="dark"] .sx-page--active::after {
opacity: 0.19;
filter: saturate(0.5) brightness(0.85);
}
@media (min-width: 1280px) {
.sx-page--active {
grid-template-rows: 80px minmax(0, 1fr) 116px;
gap: 12px;
padding: 14px 34px 30px;
background:
radial-gradient(circle at 51% 14%, rgba(255, 255, 255, 0.82), transparent 31%),
radial-gradient(circle at 8% 94%, color-mix(in srgb, var(--accent) 8%, transparent), transparent 25%),
#f8f7f3;
overflow: hidden;
}
[data-theme="dark"] .sx-page--active {
background:
radial-gradient(circle at 51% 14%, rgba(255, 255, 255, 0.035), transparent 31%),
radial-gradient(circle at 8% 94%, color-mix(in srgb, var(--accent) 9%, transparent), transparent 25%),
var(--glass-canvas);
}
.sx-page--active .sx-sessionbar {
width: min(100%, 1408px);
height: 80px;
margin: 0 auto;
padding: 0 25px;
border-color: rgba(159, 142, 111, 0.2);
border-radius: 12px;
background: rgba(255, 255, 255, 0.62);
box-shadow: 0 12px 34px rgba(72, 62, 44, 0.055);
backdrop-filter: blur(18px);
}
[data-theme="dark"] .sx-page--active .sx-sessionbar {
border-color: var(--glass-border);
background: var(--glass-specular), var(--glass-surface-strong);
box-shadow: var(--glass-edge-shadow), var(--glass-shadow);
}
.sx-page--active .sx-sessionbar button {
min-height: 42px;
padding: 0 16px;
border-color: rgba(159, 142, 111, 0.23);
border-radius: 14px;
background: rgba(255, 255, 255, 0.42);
color: #202521;
font-size: 15px;
}
[data-theme="dark"] .sx-page--active .sx-sessionbar button {
border-color: var(--glass-inset-border);
background: var(--glass-specular-inset), var(--glass-surface-inset);
color: var(--text-strong);
}
.sx-page--active .sx-sessionbar__meta {
gap: 3px;
}
.sx-page--active .sx-sessionbar__meta b {
color: #161b18;
font-size: 20px;
letter-spacing: -0.035em;
}
.sx-page--active .sx-sessionbar__meta small {
justify-content: center;
color: #6b706b;
font-size: 14px;
}
[data-theme="dark"] .sx-page--active .sx-sessionbar__meta b {
color: var(--text-strong);
}
[data-theme="dark"] .sx-page--active .sx-sessionbar__meta small {
color: var(--text-muted);
}
.sx-page--active .sx-sessionbar__dot {
width: 11px;
height: 11px;
box-shadow: 0 0 0 4px rgba(48, 148, 93, 0.13);
}
.sx-page--active .sx-grid {
width: min(100%, 1408px);
margin: 0 auto;
grid-template-columns: 326px minmax(500px, 1fr) 357px;
gap: 12px;
}
.sx-page--active .sx-col {
gap: 12px;
}
.sx-page--active .sx-col-left,
.sx-page--active .sx-col-right {
gap: 0;
padding: 20px 22px;
border: 1px solid rgba(159, 142, 111, 0.2);
border-radius: 12px;
background: rgba(255, 255, 255, 0.58);
box-shadow: 0 12px 32px rgba(72, 62, 44, 0.045);
backdrop-filter: blur(16px);
overflow: auto;
scrollbar-width: thin;
}
[data-theme="dark"] .sx-page--active .sx-col-left,
[data-theme="dark"] .sx-page--active .sx-col-right {
border-color: var(--glass-border);
background: var(--glass-specular), var(--glass-surface);
box-shadow: var(--glass-edge-shadow), var(--glass-shadow);
}
.sx-page--active .sx-col-left > .sx-panel,
.sx-page--active .sx-col-right > .sx-panel {
width: 100%;
border: 0;
border-radius: 0;
background: transparent;
box-shadow: none;
backdrop-filter: none;
}
.sx-page--active .sx-ctx {
order: 1;
flex: 0 0 auto;
padding: 0 0 18px;
overflow: visible;
border-bottom: 1px solid rgba(159, 142, 111, 0.2);
}
.sx-page--active .sx-ctx__head {
min-height: 24px;
margin: 0;
}
.sx-page--active .sx-ctx .sx-panel-toggle__hint {
display: none;
}
.sx-page--active .sx-track {
order: 2;
flex: 1 0 auto;
display: flex;
flex-direction: column;
padding: 18px 0 20px;
overflow: visible;
border-bottom: 1px solid rgba(159, 142, 111, 0.2);
}
.sx-page--active .sx-track > .sx-vstep {
flex: 1 1 0;
min-height: 62px;
}
.sx-page--active .sx-track__head {
margin-bottom: 16px;
}
.sx-page--active .sx-vstep {
grid-template-columns: 18px minmax(0, 1fr);
column-gap: 12px;
}
.sx-page--active .sx-vstep__node {
width: 17px;
height: 17px;
background: #fbfaf7;
border-color: #d9d2c4;
}
.sx-page--active .sx-vstep.is-cur .sx-vstep__node {
border-color: #2f806b;
box-shadow: 0 0 0 4px rgba(47, 128, 107, 0.12);
}
.sx-page--active .sx-vstep.is-cur .sx-vstep__node::after {
inset: 3px;
background: #2f806b;
}
.sx-page--active .sx-vstep__line {
width: 1px;
min-height: 31px;
background: #d8d0c2;
}
.sx-page--active .sx-vstep__body {
padding-bottom: 18px;
}
.sx-page--active .sx-vstep__label {
color: #1e2420;
font-size: 15px;
font-weight: 720;
}
.sx-page--active .sx-vstep__t {
color: #737871;
font-size: 12px;
}
.sx-page--active .sx-vstep.is-cur .sx-vstep__t {
color: #2b8069;
}
.sx-page--active .sx-vstep__desc {
margin-top: 5px;
color: #676b66;
font-size: 13px;
line-height: 1.45;
}
.sx-page--active .sx-vstep__goal {
margin-right: auto;
margin-left: 8px;
border: 0;
background: #e7f0e9;
color: #2a7563;
font-size: 11px;
}
[data-theme="dark"] .sx-page--active .sx-vstep__node {
background: var(--bg-surface);
border-color: var(--border-strong);
}
[data-theme="dark"] .sx-page--active .sx-vstep__label,
[data-theme="dark"] .sx-page--active .sx-vstep.is-cur .sx-vstep__label {
color: var(--text-strong);
}
[data-theme="dark"] .sx-page--active .sx-vstep__desc,
[data-theme="dark"] .sx-page--active .sx-vstep__t {
color: var(--text-muted);
}
.sx-page--active .sx-session-progress {
order: 3;
flex: 0 0 270px;
padding: 17px 0 0;
overflow: visible;
}
.sx-page--active .sx-session-progress__head {
margin-bottom: 10px;
}
.sx-page--active .sx-session-progress__grid {
gap: 0;
}
.sx-page--active .sx-session-progress__grid span {
grid-template-columns: minmax(0, 1fr) auto;
padding: 11px 0;
border-color: rgba(159, 142, 111, 0.16);
}
.sx-page--active .sx-session-progress__grid small {
grid-column: 1;
grid-row: 1;
display: inline-flex;
align-items: center;
gap: 12px;
color: #686d68;
font-size: 13px;
text-align: left;
}
.sx-page--active .sx-session-progress__grid small svg {
color: #287967;
}
.sx-page--active .sx-session-progress__grid b {
grid-column: 2;
grid-row: 1;
color: #161b18;
font-size: 15px;
}
[data-theme="dark"] .sx-page--active .sx-session-progress__grid small {
color: var(--text-muted);
}
[data-theme="dark"] .sx-page--active .sx-session-progress__grid b {
color: var(--text-strong);
}
.sx-page--active .sx-col-center {
grid-template-rows: 360px minmax(0, 1fr);
gap: 12px;
}
.sx-page--active .sx-stage,
.sx-page--active .sx-transcript {
border-color: rgba(159, 142, 111, 0.2);
border-radius: 12px;
background: rgba(255, 255, 255, 0.6);
box-shadow: 0 12px 32px rgba(72, 62, 44, 0.045);
backdrop-filter: blur(16px);
}
[data-theme="dark"] .sx-page--active .sx-stage,
[data-theme="dark"] .sx-page--active .sx-transcript {
border-color: var(--glass-border);
background: var(--glass-specular), var(--glass-surface);
box-shadow: var(--glass-edge-shadow), var(--glass-shadow);
}
.sx-page--active .sx-stage {
grid-template-columns: minmax(245px, 0.92fr) minmax(280px, 1.08fr);
grid-template-rows: minmax(0, 1fr) 62px;
column-gap: 28px;
padding: 20px 28px 14px;
}
.sx-page--active .sx-stage::before {
inset: 12px;
border-color: rgba(159, 142, 111, 0.13);
border-radius: 10px;
}
.sx-page--active .sx-stage__top {
display: none;
}
.sx-page--active .sx-orb-wrap {
grid-column: 1;
grid-row: 1;
place-self: end center;
width: 238px;
height: 238px;
z-index: 1;
}
.sx-page--active .sx-orb-wrap::before {
content: "";
position: absolute;
z-index: -1;
left: -86px;
bottom: -20px;
width: 190px;
height: 248px;
background: url("/session-botanical/leaf-1.webp") center / contain no-repeat;
opacity: 0.72;
transform: rotate(-11deg);
pointer-events: none;
}
.sx-page--active .sx-orb {
inset: -3px;
border-radius: 50% 50% 46% 54% / 46% 48% 52% 54%;
background: radial-gradient(circle at 50% 42%, #f4f6ee 0%, #e6ede2 68%, #dce6db 100%);
box-shadow: inset 0 0 36px rgba(97, 122, 99, 0.08);
}
[data-theme="dark"] .sx-page--active .sx-orb {
background: radial-gradient(circle at 50% 42%, rgba(139, 166, 150, 0.24), rgba(34, 50, 44, 0.54));
}
.sx-page--active .sx-stage .vg-avatar,
.sx-page--active .sx-stage .vg-avatar__svg {
width: 232px !important;
height: 232px !important;
}
.sx-page--active .sx-stage .vg-avatar__stage {
height: 232px !important;
}
.sx-page--active .sx-stage__client {
grid-column: 2;
grid-row: 1;
align-self: center;
gap: 13px;
}
.sx-page--active .sx-stage__client-kicker {
color: #131915;
font-size: 34px;
font-weight: 820;
letter-spacing: -0.055em;
}
.sx-page--active .sx-stage__client p {
max-width: 33ch;
color: #262b27;
font-size: 16px;
font-weight: 560;
line-height: 1.55;
}
[data-theme="dark"] .sx-page--active .sx-stage__client-kicker,
[data-theme="dark"] .sx-page--active .sx-stage__client p {
color: var(--text-strong);
}
.sx-page--active .sx-stage__now {
grid-column: 1 / -1;
grid-row: 2;
place-self: stretch;
width: auto;
max-width: none;
min-height: 50px;
padding: 0 18px;
border-color: rgba(159, 142, 111, 0.18);
border-radius: 11px;
background: rgba(255, 255, 255, 0.45);
color: #222824;
font-size: 15px;
}
.sx-page--active .sx-stage__now > svg {
flex: none;
color: #987b4c;
}
.sx-page--active .sx-stage__now small {
padding: 4px 10px;
border-radius: 999px;
background: #e5efe7;
color: #29705f;
}
[data-theme="dark"] .sx-page--active .sx-stage__now {
border-color: var(--glass-inset-border);
background: var(--glass-specular-inset), var(--glass-surface-inset);
color: var(--text-strong);
}
.sx-page--active .sx-transcript {
padding: 19px 18px 13px;
}
.sx-page--active .sx-transcript__head {
margin-bottom: 12px;
}
.sx-page--active .sx-transcript__scroll {
padding: 0;
}
.sx-page--active .sx-transcript__empty {
padding: 13px 2px;
}
.sx-page--active .sx-transcript__empty b {
color: #202622;
font-size: 16px;
}
.sx-page--active .sx-transcript__empty span {
margin-top: 8px;
color: #7a7d79;
font-size: 13px;
}
[data-theme="dark"] .sx-page--active .sx-transcript__empty b {
color: var(--text-strong);
}
[data-theme="dark"] .sx-page--active .sx-transcript__empty span {
color: var(--text-muted);
}
.sx-page--active .sx-compose {
gap: 14px;
margin-top: 12px;
padding-top: 12px;
border-color: rgba(159, 142, 111, 0.16);
}
.sx-page--active .sx-compose textarea {
min-height: 56px;
padding: 16px 18px;
border-color: rgba(159, 142, 111, 0.24);
border-radius: 12px;
background: rgba(255, 255, 255, 0.54);
color: #262b27;
font-size: 14px;
}
.sx-page--active .sx-compose .vg-btn {
min-width: 134px;
min-height: 56px;
border-radius: 12px;
background: linear-gradient(145deg, #3d947d, #267762);
box-shadow: 0 8px 18px rgba(43, 119, 97, 0.2);
font-size: 15px;
}
.sx-page--active .sx-compose .vg-btn:disabled {
background: linear-gradient(145deg, #4b9d88, #2d806a);
color: #fff;
opacity: 0.82;
}
.sx-page--active .sx-col-right {
padding-inline: 20px;
}
.sx-page--active .sx-signal {
order: 1;
flex: 0 0 auto;
padding: 0 0 18px;
overflow: visible;
border-bottom: 1px solid rgba(159, 142, 111, 0.2);
}
.sx-page--active .sx-signal__head {
margin-bottom: 16px;
}
.sx-page--active .sx-coach-card {
grid-template-columns: 58px minmax(0, 1fr);
gap: 11px 13px;
margin: 0;
}
.sx-page--active .sx-coach-avatar {
width: 58px;
height: 58px;
background: #f6f5ef;
border-color: #d7dfd5;
box-shadow: none;
}
.sx-page--active .sx-coach-avatar__lens {
inset: 8px;
background: rgba(255, 255, 255, 0.64);
}
.sx-page--active .sx-coach-avatar__face {
left: 15px;
right: 15px;
top: 21px;
}
.sx-page--active .sx-coach-summary {
gap: 10px;
}
.sx-page--active .sx-coach-bubble__meta {
padding-bottom: 8px;
border-bottom: 1px solid rgba(159, 142, 111, 0.16);
}
.sx-page--active .sx-coach-bubble__meta b {
color: #171d19;
font-size: 17px;
}
.sx-page--active .sx-coach-bubble__meta span {
color: #666b66;
font-size: 12px;
}
.sx-page--active .sx-coach-quota {
min-height: 25px;
padding: 0;
border: 0;
background: transparent;
}
.sx-page--active .sx-coach-quota > span:first-child {
color: #666b66;
font-size: 12px;
}
.sx-page--active .sx-coach-quota b {
color: #1d6f5d;
font-size: 14px;
}
.sx-page--active .sx-coach-quota__dots i {
width: 10px;
height: 10px;
}
.sx-page--active .sx-coach-bubble {
gap: 7px;
padding: 13px 14px;
border: 1px solid #d8e1d9;
border-radius: 9px;
background: rgba(239, 245, 239, 0.72);
color: #2a302b;
box-shadow: none;
}
.sx-page--active .sx-coach-bubble::after {
content: "코칭 포인트";
order: -1;
color: #296f5e;
font-size: 12px;
font-weight: 760;
}
.sx-page--active .sx-coach-bubble::before {
display: none;
}
.sx-page--active .sx-coach-bubble p {
color: #444a45;
font-size: 13px;
line-height: 1.65;
}
[data-theme="dark"] .sx-page--active .sx-coach-bubble__meta b,
[data-theme="dark"] .sx-page--active .sx-coach-bubble p {
color: var(--text-strong);
}
[data-theme="dark"] .sx-page--active .sx-coach-bubble {
border-color: var(--glass-inset-border);
background: var(--glass-specular-inset), var(--glass-surface-inset);
}
.sx-page--active .sx-signal__status {
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 12px;
margin-top: 16px;
}
.sx-page--active .sx-signal__status span {
min-height: 61px;
grid-template-columns: auto minmax(0, 1fr);
grid-template-rows: auto auto;
place-content: center;
column-gap: 9px;
row-gap: 2px;
padding: 10px 12px;
border-color: rgba(159, 142, 111, 0.22);
border-radius: 11px;
background: rgba(255, 255, 255, 0.42);
text-align: left;
}
.sx-page--active .sx-signal__status span > svg {
grid-column: 1;
grid-row: 1 / span 2;
align-self: center;
color: #1f7c65;
}
.sx-page--active .sx-signal__status b {
grid-column: 2;
grid-row: 1;
color: #565b56;
font-size: 13px;
}
.sx-page--active .sx-signal__status small {
grid-column: 2;
grid-row: 2;
color: #1f7c65;
font-size: 13px;
}
.sx-page--active .sx-signal__one,
.sx-page--active .sx-signal__seq {
margin-top: 11px;
}
.sx-page--active.sx-feedback-ambient .sx-signal__defer,
.sx-page--active.sx-feedback-coached .sx-signal__defer {
display: none;
}
.sx-page--active .sx-meters {
order: 2;
flex: 1 0 auto;
padding: 17px 0 14px;
overflow: visible;
border-bottom: 1px solid rgba(159, 142, 111, 0.2);
}
.sx-page--active .sx-meter {
padding: 10px 0;
}
.sx-page--active .sx-meter__label {
color: #595e59;
font-size: 13px;
}
.sx-page--active .sx-meter__val {
font-size: 13px;
}
.sx-page--active .sx-meters__note {
color: #828681;
font-size: 10.5px;
line-height: 1.55;
}
.sx-page--active .sx-safety {
order: 3;
flex: 0 0 auto;
padding: 14px 0 0;
}
.sx-page--active .sx-safety__head {
min-height: 28px;
}
.sx-page--active .sx-safety__badge {
color: #4c524d;
}
[data-theme="dark"] .sx-page--active .sx-meter__label,
[data-theme="dark"] .sx-page--active .sx-safety__badge {
color: var(--text-body);
}
.sx-page--active .sx-controlbar {
width: min(100%, 1468px);
height: 116px;
margin: 0 auto;
padding: 18px 26px;
border-color: rgba(159, 142, 111, 0.2);
border-radius: 12px;
background: rgba(255, 255, 255, 0.64);
box-shadow: 0 12px 34px rgba(72, 62, 44, 0.055);
backdrop-filter: blur(18px);
}
[data-theme="dark"] .sx-page--active .sx-controlbar {
border-color: var(--glass-border);
background: var(--glass-specular), var(--glass-surface-strong);
box-shadow: var(--glass-edge-shadow), var(--glass-shadow);
}
.sx-page--active .sx-mic {
width: 70px;
height: 70px;
border-color: rgba(159, 142, 111, 0.24);
background: rgba(255, 255, 255, 0.5);
}
[data-theme="light"] .sx-page--active .sx-mic.is-off {
border-color: #7a857c;
background: #eef1ed;
color: #245f50;
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.92),
0 5px 15px rgba(45, 67, 57, 0.1);
}
[data-theme="light"] .sx-page--active .sx-mic.is-off:hover {
border-color: #557064;
background: #e3e9e4;
color: #164f42;
}
[data-theme="light"] .sx-page--active .sx-mic.is-on {
border-color: #176b56;
background: #176b56;
color: #f5fff9;
box-shadow: 0 7px 20px rgba(23, 107, 86, 0.24);
}
.sx-page--active .sx-mic-block__l {
color: #181e1a;
font-size: 16px;
}
.sx-page--active .sx-mic-block__h {
color: #767a76;
font-size: 12px;
}
.sx-page--active .sx-cb-sep {
height: 72px;
background: rgba(159, 142, 111, 0.2);
}
.sx-page--active .sx-segmented {
padding: 4px;
border-color: rgba(159, 142, 111, 0.18);
border-radius: 11px;
background: rgba(245, 244, 239, 0.9);
}
.sx-page--active .sx-segmented button {
min-height: 42px;
padding-inline: 16px;
color: #5f645f;
font-size: 13px;
}
.sx-page--active .sx-segmented button.is-on {
border-radius: 8px;
background: rgba(255, 255, 255, 0.96);
color: #237460;
box-shadow: 0 3px 11px rgba(72, 62, 44, 0.1);
}
.sx-page--active .sx-pause,
.sx-page--active .sx-end-button {
min-height: 60px;
border-radius: 12px;
font-size: 14px;
}
.sx-page--active .sx-pause {
min-width: 138px;
border-color: rgba(159, 142, 111, 0.22);
background: rgba(255, 255, 255, 0.48);
color: #232824;
}
.sx-page--active .sx-end-button {
min-width: 150px;
border-color: #eb8c84;
background: rgba(255, 255, 255, 0.42);
color: #d8342b;
}
[data-theme="dark"] .sx-page--active .sx-mic-block__l,
[data-theme="dark"] .sx-page--active .sx-pause {
color: var(--text-strong);
}
}
/* 1366×640/768 검증 lane: 같은 위계를 유지하되 높이만 광학적으로 압축한다. */
@media (min-width: 1280px) and (max-height: 820px) {
.sx-page--active {
grid-template-rows: 52px minmax(0, 1fr) 82px;
gap: 8px;
padding: 8px 18px 10px;
}
.sx-page--active .sx-sessionbar {
width: min(100%, 1320px);
height: 52px;
padding-inline: 14px;
}
.sx-page--active .sx-sessionbar button {
min-height: 36px;
padding-inline: 12px;
}
.sx-page--active .sx-sessionbar__meta b {
font-size: 16px;
}
.sx-page--active .sx-grid {
width: min(100%, 1320px);
grid-template-columns: 276px minmax(470px, 1fr) 310px;
gap: 8px;
}
.sx-page--active .sx-col-left,
.sx-page--active .sx-col-right {
padding: 11px 14px;
}
.sx-page--active .sx-ctx {
padding-bottom: 9px;
}
.sx-page--active .sx-track {
padding: 9px 0;
}
.sx-page--active .sx-track__head,
.sx-page--active .sx-session-progress__head,
.sx-page--active .sx-signal__head {
margin-bottom: 7px;
}
.sx-page--active .sx-vstep__body {
padding-bottom: 7px;
}
.sx-page--active .sx-track > .sx-vstep {
min-height: 34px;
}
.sx-page--active .sx-vstep__desc,
.sx-page--active .sx-track__note {
display: none;
}
.sx-page--active .sx-session-progress {
flex-basis: 142px;
padding-top: 8px;
}
.sx-page--active .sx-session-progress__grid span {
padding: 6px 0;
}
.sx-page--active .sx-col-center {
grid-template-rows: minmax(182px, 0.46fr) minmax(0, 1fr);
gap: 8px;
}
.sx-page--active .sx-stage {
grid-template-columns: minmax(176px, 0.8fr) minmax(250px, 1.2fr);
grid-template-rows: minmax(0, 1fr) 43px;
padding: 10px 18px 8px;
}
.sx-page--active .sx-orb-wrap {
width: 158px;
height: 158px;
}
.sx-page--active .sx-orb-wrap::before {
left: -56px;
bottom: -15px;
width: 122px;
height: 165px;
}
.sx-page--active .sx-stage .vg-avatar,
.sx-page--active .sx-stage .vg-avatar__svg {
width: 154px !important;
height: 154px !important;
}
.sx-page--active .sx-stage .vg-avatar__stage {
height: 154px !important;
}
.sx-page--active .sx-stage__client-kicker {
font-size: 25px;
}
.sx-page--active .sx-stage__client p {
font-size: 13px;
}
.sx-page--active .sx-stage__now {
min-height: 38px;
padding-inline: 10px;
font-size: 12px;
}
.sx-page--active .sx-transcript {
padding: 10px 12px 8px;
}
.sx-page--active .sx-compose {
gap: 8px;
margin-top: 7px;
padding-top: 7px;
}
.sx-page--active .sx-compose textarea,
.sx-page--active .sx-compose .vg-btn {
min-height: 40px;
}
.sx-page--active .sx-signal {
padding-bottom: 8px;
}
.sx-page--active .sx-coach-card {
grid-template-columns: 42px minmax(0, 1fr);
gap: 6px 9px;
}
.sx-page--active .sx-coach-avatar {
width: 42px;
height: 42px;
}
.sx-page--active .sx-coach-bubble {
padding: 8px 9px;
}
.sx-page--active .sx-coach-bubble blockquote,
.sx-page--active .sx-signal__seq,
.sx-page--active .sx-meters__note {
display: none;
}
.sx-page--active .sx-signal__status {
gap: 7px;
margin-top: 7px;
}
.sx-page--active .sx-signal__status span {
min-height: 42px;
padding: 5px 7px;
}
.sx-page--active .sx-meters {
padding: 8px 0 6px;
}
.sx-page--active .sx-meter {
padding: 5px 0;
}
.sx-page--active .sx-safety {
padding-top: 7px;
}
.sx-page--active .sx-controlbar {
width: min(100%, 1330px);
height: 82px;
padding: 10px 16px;
}
.sx-page--active .sx-mic {
width: 52px;
height: 52px;
}
.sx-page--active .sx-cb-sep {
height: 52px;
}
.sx-page--active .sx-pause,
.sx-page--active .sx-end-button {
min-height: 48px;
}
}