vignette/docs/mockups/settings.html
Yun Chan d5b86c5f89 feat(docs): 전체 페이지 레이아웃 시안 추가
- login/learner-home/session-review/professor/admin/settings
- session-v2(밝은 에디토리얼 톤으로 재제작, 기존 어두운 stage 대체)
- 전부 동일 디자인 토큰(세이지틸+테라코타), 윤찬 철칙 준수
2026-06-25 21:27:24 +09:00

706 lines
38 KiB
HTML
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.

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vignette — 설정 시안</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/variable/pretendardvariable.min.css">
<style>
/* =====================================================================
Vignette — 설정(Settings) 화면 시안 (단일 파일, 인라인 CSS)
토큰: DESIGN_CONCEPT.md §3 그대로 적용. 외부 의존 = Pretendard CDN 1개.
철칙: border-left 0 · 이모지 0(아이콘 inline SVG) · 카드덤프 0 ·
에디토리얼 미니멀 · 순흑/순백 금지 · 강조는 weight/tint/kicker/dot ·
한 화면 한 그룹 · 넉넉한 여백.
===================================================================== */
:root{
/* 중성 베이스 */
--paper:#FBFAF8; --paper-2:#F4F2EE; --surface:#FFFFFF;
--neutral-100:#ECEFF1; --neutral-150:#E5E1DA; --neutral-200:#D5DBDE; --neutral-400:#98A4A9;
--ink:#1C2A2A; --ink-2:#5A6663; --ink-3:#93A09C; --hair:#E5E1DA;
/* 악센트 */
--accent:#3E7A6E; --accent-deep:#316257; --accent-tint:#EEF4F2; --accent-bright:#5F968B;
--clay:#B0735C; --clay-deep:#94604C; --clay-tint:#F6F0EC;
/* 의미색 */
--pos-text:#2C6E49; --pos-solid:#3B8C5E; --pos-tint:#E8F3EC;
--warn-text:#8A5A00; --warn-solid:#C28A2C; --warn-tint:#FAF1E0;
--crit-text:#A8352C; --crit-solid:#C4453A; --crit-tint:#FAEAE8;
--info-text:#2E5A7A; --info-solid:#3C7299; --info-tint:#EAF1F6;
--bg-stage:#1E2724;
/* 별칭 */
--text-on-accent:#FBFAF8;
--focus-ring:rgba(62,122,110,.45);
/* 폰트 */
--font-sans:"Pretendard Variable",Pretendard,-apple-system,"Apple SD Gothic Neo","Noto Sans KR",system-ui,sans-serif;
--font-num:"Pretendard Variable","JetBrains Mono",ui-monospace,monospace;
/* spacing */
--sp-1:4px; --sp-2:8px; --sp-3:12px; --sp-4:16px; --sp-5:24px; --sp-6:32px; --sp-7:48px; --sp-8:64px;
--radius:8px; --radius-sm:6px; --radius-lg:12px;
--shadow-sm:0 1px 2px rgba(28,42,42,.05);
--shadow-md:0 4px 14px rgba(28,42,42,.07);
--ease-out:cubic-bezier(.22,.61,.36,1);
--maxw:1080px;
}
/* 교수자 역할 accent 오버라이드 (인디고-블루: 감독) */
body[data-role="instructor"]{ --accent:#3A5BA0; --accent-deep:#2F4A86; --accent-bright:#5478C4; --accent-tint:#EAEFF7; --focus-ring:rgba(58,91,160,.40);}
*{margin:0;padding:0;box-sizing:border-box;}
html,body{height:100%;}
body{
font-family:var(--font-sans); background:var(--paper); color:var(--ink);
-webkit-font-smoothing:antialiased; text-rendering:optimizeLegibility;
letter-spacing:-0.01em; line-height:1.6;
}
.tab-num{font-variant-numeric:tabular-nums;}
/* ============ 공통 헤더 (톱바) ============ */
.topbar{
height:56px; background:var(--surface); border-bottom:1px solid var(--hair);
display:flex; align-items:center; gap:var(--sp-6);
padding:0 var(--sp-7); position:sticky; top:0; z-index:10;
}
.wordmark{display:flex; align-items:center; gap:10px; flex:none;}
.wordmark .gl{width:24px; height:24px; flex:none;}
.wordmark .nm{font-size:18px; font-weight:700; letter-spacing:-0.02em; color:var(--ink);}
.wordmark .nm .dot{color:var(--accent);}
.topnav{display:flex; align-items:center; gap:var(--sp-2); margin-left:var(--sp-5);}
.topnav a{
font-size:14px; font-weight:500; color:var(--ink-3); text-decoration:none;
padding:7px 12px; border-radius:var(--radius-sm);
}
.topnav a:hover{color:var(--ink-2); background:var(--paper-2);}
.topnav a.on{color:var(--ink); font-weight:600;}
.topbar .spacer{flex:1;}
.role{
display:flex; align-items:center; gap:8px; font-size:13px; color:var(--ink-2);
padding:6px 12px; border-radius:999px; background:var(--accent-tint); font-weight:500;
}
.role .d{width:6px; height:6px; border-radius:50%; background:var(--accent);}
.who{display:flex; align-items:center; gap:10px;}
.who .av{
width:32px; height:32px; border-radius:50%; background:var(--accent);
display:flex; align-items:center; justify-content:center;
color:var(--text-on-accent); font-size:13px; font-weight:600;
}
.who .nm{font-size:14px; font-weight:600; color:var(--ink);}
/* ============ 페이지 헤더 ============ */
.pagehead{max-width:var(--maxw); margin:0 auto; padding:var(--sp-7) var(--sp-7) 0;}
.pagehead .kicker{
font-family:var(--font-num); font-size:12px; font-weight:600;
letter-spacing:0.08em; color:var(--accent);
display:flex; align-items:center; gap:8px; margin-bottom:10px;
}
.pagehead .kicker .dot{width:6px; height:6px; border-radius:50%; background:var(--accent-bright);}
.pagehead h1{font-size:30px; font-weight:700; letter-spacing:-0.02em; color:var(--ink); line-height:1.3;}
.pagehead p{font-size:16px; color:var(--ink-2); margin-top:8px; max-width:560px;}
/* ============ 레이아웃: 좌측 섹션 내비 + 우측 폼 ============ */
.shell{max-width:var(--maxw); margin:0 auto; padding:var(--sp-6) var(--sp-7) var(--sp-8);
display:grid; grid-template-columns:228px 1fr; gap:var(--sp-7); align-items:start;}
/* 좌측 섹션 내비 (sticky) */
.sectnav{position:sticky; top:88px; display:flex; flex-direction:column; gap:2px;}
.sectnav .gk{
font-family:var(--font-num); font-size:11px; font-weight:600; letter-spacing:0.08em;
color:var(--ink-3); padding:0 12px var(--sp-3); text-transform:uppercase;
}
.sectnav a{
display:flex; align-items:center; gap:11px; text-decoration:none;
font-size:14.5px; font-weight:500; color:var(--ink-2);
padding:10px 12px; border-radius:var(--radius); transition:background .14s var(--ease-out);
}
.sectnav a:hover{background:var(--paper-2);}
.sectnav a.on{background:var(--accent-tint); color:var(--accent-deep); font-weight:600;}
.sectnav a svg{width:18px; height:18px; flex:none; stroke:currentColor; opacity:.85;}
/* 우측 폼 컬럼 */
.forms{display:flex; flex-direction:column; gap:var(--sp-7); min-width:0;}
/* 폼 그룹 (카드 = 톤차로만 분리, border 헤어라인만) */
.group{
background:var(--surface); border:1px solid var(--hair); border-radius:var(--radius-lg);
padding:var(--sp-6); box-shadow:var(--shadow-sm);
}
.group > .gh{margin-bottom:var(--sp-5);}
.group .gh .gt{font-size:20px; font-weight:600; letter-spacing:-0.01em; color:var(--ink);}
.group .gh .gd{font-size:14px; color:var(--ink-2); margin-top:5px;}
/* 폼 필드 한 줄 (라벨 좌 / 입력 우, 넉넉한 행간) */
.field{
display:grid; grid-template-columns:200px 1fr; gap:var(--sp-5);
padding:var(--sp-5) 0; border-top:1px solid var(--paper-2);
}
.field:first-of-type{border-top:none; padding-top:var(--sp-2);}
.field .flab{display:flex; flex-direction:column; gap:4px;}
.field .flab .l{font-size:14.5px; font-weight:600; color:var(--ink);}
.field .flab .h{font-size:13px; color:var(--ink-3); line-height:1.5;}
.field .fin{display:flex; flex-direction:column; gap:8px; min-width:0;}
input[type=text], input[type=email], select, textarea{
width:100%; font-family:var(--font-sans); font-size:14.5px; color:var(--ink);
background:var(--paper-2); border:1px solid var(--hair); border-radius:var(--radius-sm);
padding:11px 13px; line-height:1.5;
}
textarea{resize:vertical; min-height:84px;}
input:focus, select:focus, textarea:focus{
outline:none; border-color:var(--accent); background:var(--surface);
box-shadow:0 0 0 3px var(--focus-ring);
}
input::placeholder, textarea::placeholder{color:var(--ink-3);}
select{appearance:none; -webkit-appearance:none; cursor:pointer;
background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2393A09C' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
background-repeat:no-repeat; background-position:right 12px center; background-size:16px; padding-right:38px;}
/* 프로필 헤더 (아바타 + 이름 + 역할 배지) */
.profile{display:flex; align-items:center; gap:var(--sp-5);}
.profile .big{
width:64px; height:64px; border-radius:50%; flex:none;
background:var(--accent); display:flex; align-items:center; justify-content:center;
color:var(--text-on-accent); font-size:24px; font-weight:600;
}
.profile .meta{display:flex; flex-direction:column; gap:4px;}
.profile .meta .n{font-size:18px; font-weight:600; color:var(--ink);}
.profile .meta .e{font-size:14px; color:var(--ink-2);}
.profile .meta .badges{display:flex; gap:8px; margin-top:5px;}
.tag{
display:inline-flex; align-items:center; gap:6px;
font-size:12px; font-weight:600; letter-spacing:0.02em;
padding:4px 10px; border-radius:999px; background:var(--accent-tint); color:var(--accent-deep);
}
.tag .d{width:5px; height:5px; border-radius:50%; background:var(--accent);}
.tag.muted{background:var(--paper-2); color:var(--ink-2);}
.tag.muted .d{background:var(--ink-3);}
/* 버튼 */
.btn{
font-family:var(--font-sans); font-size:14px; font-weight:600; cursor:pointer;
border-radius:var(--radius); padding:10px 18px; border:1px solid transparent;
display:inline-flex; align-items:center; gap:8px; transition:all .14s var(--ease-out);
}
.btn svg{width:16px; height:16px; stroke:currentColor;}
.btn.primary{background:var(--accent); color:var(--text-on-accent);}
.btn.primary:hover{background:var(--accent-deep);}
.btn.ghost{background:var(--surface); color:var(--ink-2); border-color:var(--hair);}
.btn.ghost:hover{background:var(--paper-2); color:var(--ink);}
.btn.danger{background:var(--surface); color:var(--crit-text); border-color:var(--crit-tint);}
.btn.danger:hover{background:var(--crit-tint);}
.btn.sm{padding:8px 14px; font-size:13px;}
/* 라디오/세그먼트형 역할 표시 (읽기전용 스타일) */
.rolepick{display:flex; gap:10px; flex-wrap:wrap;}
.rolepick .opt{
flex:1; min-width:130px; border:1px solid var(--hair); border-radius:var(--radius);
padding:13px 15px; cursor:pointer; background:var(--surface);
}
.rolepick .opt.on{border-color:var(--accent); background:var(--accent-tint);}
.rolepick .opt .t{font-size:14px; font-weight:600; color:var(--ink); display:flex; align-items:center; gap:8px;}
.rolepick .opt .t .d{width:7px; height:7px; border-radius:50%; background:var(--neutral-200);}
.rolepick .opt.on .t .d{background:var(--accent);}
.rolepick .opt .h{font-size:12px; color:var(--ink-3); margin-top:4px;}
/* 토글 스위치 */
.toggle{position:relative; width:42px; height:24px; flex:none; cursor:pointer;}
.toggle input{position:absolute; opacity:0; width:100%; height:100%; margin:0; cursor:pointer;}
.toggle .tr{position:absolute; inset:0; background:var(--neutral-200); border-radius:999px; transition:background .16s var(--ease-out);}
.toggle .kn{position:absolute; top:3px; left:3px; width:18px; height:18px; border-radius:50%; background:#fff; box-shadow:var(--shadow-sm); transition:transform .16s var(--ease-out);}
.toggle input:checked + .tr{background:var(--accent);}
.toggle input:checked + .tr + .kn{transform:translateX(18px);}
.toggle input:focus-visible + .tr{box-shadow:0 0 0 3px var(--focus-ring);}
/* 알림 행 (라벨 + 설명 + 토글) */
.optrow{display:flex; align-items:center; gap:var(--sp-4); padding:var(--sp-4) 0; border-top:1px solid var(--paper-2);}
.optrow:first-of-type{border-top:none;}
.optrow .ot{flex:1;}
.optrow .ot .l{font-size:14.5px; font-weight:600; color:var(--ink);}
.optrow .ot .h{font-size:13px; color:var(--ink-3); margin-top:3px; line-height:1.5;}
/* 페르소나 진입 — 리스트 (격자 아님, 세로 행) */
.personalist{display:flex; flex-direction:column; gap:10px;}
.pcard{
display:flex; align-items:center; gap:var(--sp-4);
padding:var(--sp-4); border:1px solid var(--hair); border-radius:var(--radius);
background:var(--surface);
}
.pcard:hover{border-color:var(--neutral-200);}
.pcard .face{
width:48px; height:48px; border-radius:50%; flex:none; overflow:hidden; background:var(--bg-stage);
}
.pcard .pinfo{flex:1; min-width:0;}
.pcard .pinfo .pn{font-size:15px; font-weight:600; color:var(--ink);}
.pcard .pinfo .pm{font-size:13px; color:var(--ink-2); margin-top:2px;}
.pcard .pinfo .ptags{display:flex; gap:7px; margin-top:7px; flex-wrap:wrap;}
.pchip{font-size:11.5px; font-weight:500; color:var(--ink-2); background:var(--paper-2); padding:3px 9px; border-radius:999px;}
.pchip.clay{background:var(--clay-tint); color:var(--clay-deep);}
.pcard .pact{display:flex; gap:8px; flex:none;}
.iconbtn{
width:34px; height:34px; border-radius:var(--radius-sm); border:1px solid var(--hair);
background:var(--surface); cursor:pointer; display:flex; align-items:center; justify-content:center;
}
.iconbtn svg{width:16px; height:16px; stroke:var(--ink-2);}
.iconbtn:hover{background:var(--paper-2);}
/* 새 페르소나 만들기 진입 행 */
.addrow{
display:flex; align-items:center; gap:var(--sp-4); margin-top:14px;
padding:var(--sp-4); border:1px dashed var(--neutral-200); border-radius:var(--radius);
background:var(--paper-2); cursor:pointer; text-decoration:none;
}
.addrow:hover{border-color:var(--accent); background:var(--accent-tint);}
.addrow .pl{
width:36px; height:36px; border-radius:50%; flex:none; background:var(--accent);
display:flex; align-items:center; justify-content:center;
}
.addrow .pl svg{width:18px; height:18px; stroke:var(--text-on-accent);}
.addrow .at{font-size:14.5px; font-weight:600; color:var(--ink);}
.addrow .ah{font-size:13px; color:var(--ink-3); margin-top:2px;}
/* 페르소나 파라미터 슬라이더 (난이도) */
.slider{display:flex; flex-direction:column; gap:8px;}
.slider .track{height:5px; border-radius:3px; background:var(--paper-2); position:relative;}
.slider .track .fill{position:absolute; left:0; top:0; height:100%; border-radius:3px; background:var(--accent-bright);}
.slider .track .knob{position:absolute; top:50%; transform:translate(-50%,-50%); width:16px; height:16px; border-radius:50%; background:var(--surface); border:2px solid var(--accent); box-shadow:var(--shadow-sm);}
.slider .scale{display:flex; justify-content:space-between; font-size:12px; color:var(--ink-3);}
.slider .scale .on{color:var(--accent-deep); font-weight:600;}
/* 음성 선택 (라디오 행) */
.voicelist{display:flex; flex-direction:column; gap:8px;}
.voice{
display:flex; align-items:center; gap:var(--sp-4);
padding:13px var(--sp-4); border:1px solid var(--hair); border-radius:var(--radius);
cursor:pointer; background:var(--surface);
}
.voice.on{border-color:var(--accent); background:var(--accent-tint);}
.voice .rad{width:18px; height:18px; border-radius:50%; border:2px solid var(--neutral-200); flex:none; position:relative;}
.voice.on .rad{border-color:var(--accent);}
.voice.on .rad::after{content:""; position:absolute; inset:3px; border-radius:50%; background:var(--accent);}
.voice .vinfo{flex:1;}
.voice .vinfo .vn{font-size:14.5px; font-weight:600; color:var(--ink);}
.voice .vinfo .vd{font-size:12.5px; color:var(--ink-3); margin-top:2px;}
.voice .play{
width:34px; height:34px; border-radius:50%; flex:none; border:1px solid var(--hair); background:var(--surface);
display:flex; align-items:center; justify-content:center; cursor:pointer;
}
.voice .play svg{width:15px; height:15px; stroke:var(--accent); fill:var(--accent);}
.voice .play:hover{background:var(--accent-tint);}
/* 동의/개인정보 행 (상태 텍스트 + 동작) */
.consent{display:flex; align-items:flex-start; gap:var(--sp-4); padding:var(--sp-5) 0; border-top:1px solid var(--paper-2);}
.consent:first-of-type{border-top:none; padding-top:var(--sp-2);}
.consent .ci{flex:1;}
.consent .ci .ct{font-size:14.5px; font-weight:600; color:var(--ink); display:flex; align-items:center; gap:9px;}
.consent .ci .ct .st{font-size:11.5px; font-weight:600; padding:3px 9px; border-radius:999px;}
.consent .ci .ct .st.ok{background:var(--pos-tint); color:var(--pos-text);}
.consent .ci .ct .st.pending{background:var(--warn-tint); color:var(--warn-text);}
.consent .ci .ch{font-size:13px; color:var(--ink-2); margin-top:6px; line-height:1.55; max-width:480px;}
/* 콜아웃 (정보/주의, 좌측바 없음) */
.callout{border-radius:var(--radius); padding:var(--sp-4) var(--sp-5); display:flex; gap:12px;}
.callout.info{background:var(--info-tint);}
.callout .ico{flex:none; width:18px; height:18px; margin-top:1px;}
.callout .ico svg{width:18px; height:18px;}
.callout.info .ico svg{stroke:var(--info-solid);}
.callout .ct{font-size:13.5px; line-height:1.6;}
.callout.info .ct{color:var(--info-text);}
.callout .ct strong{font-weight:600;}
/* 그룹 푸터 (저장) */
.gfoot{display:flex; justify-content:flex-end; gap:10px; margin-top:var(--sp-6); padding-top:var(--sp-5); border-top:1px solid var(--paper-2);}
/* 위험 구역 (로그아웃/탈퇴) */
.group.peril{border-color:var(--crit-tint);}
@media (max-width:880px){
.shell{grid-template-columns:1fr;}
.sectnav{position:static; flex-direction:row; flex-wrap:wrap; gap:6px;}
.sectnav .gk{display:none;}
.field{grid-template-columns:1fr; gap:10px;}
.topnav{display:none;}
}
@media (prefers-reduced-motion: reduce){
*,*::before,*::after{animation-duration:.01ms!important; transition-duration:.01ms!important;}
}
</style>
</head>
<body data-role="instructor">
<!-- ============ 공통 헤더 ============ -->
<header class="topbar">
<div class="wordmark">
<svg class="gl" viewBox="0 0 24 24" fill="none">
<circle cx="12" cy="12" r="10" stroke="#3A5BA0" stroke-width="2"/>
<circle cx="12" cy="12" r="4" fill="#3A5BA0"/>
</svg>
<span class="nm">Vignette<span class="dot">.</span></span>
</div>
<nav class="topnav">
<a href="#">세션</a>
<a href="#">내담자</a>
<a href="#">리뷰</a>
<a href="#" class="on">설정</a>
</nav>
<div class="spacer"></div>
<span class="role"><span class="d"></span>교수자</span>
<div class="who">
<span class="av"></span>
<span class="nm">정민서</span>
</div>
</header>
<!-- ============ 페이지 헤더 ============ -->
<div class="pagehead">
<div class="kicker"><span class="dot"></span>설정</div>
<h1>계정과 시뮬레이션 환경을 관리합니다</h1>
<p>프로필, 알림, 가상 내담자 페르소나, 음성, 개인정보 동의를 한곳에서 조정하세요.</p>
</div>
<!-- ============ 레이아웃 ============ -->
<div class="shell">
<!-- 좌측 섹션 내비 -->
<nav class="sectnav" aria-label="설정 섹션">
<div class="gk">설정</div>
<a href="#account" class="on">
<svg viewBox="0 0 24 24" fill="none" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="8" r="4"/><path d="M4 21c0-4 4-6 8-6s8 2 8 6"/></svg>
계정
</a>
<a href="#notify">
<svg viewBox="0 0 24 24" fill="none" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M18 8a6 6 0 1 0-12 0c0 7-3 9-3 9h18s-3-2-3-9"/><path d="M10.3 21a2 2 0 0 0 3.4 0"/></svg>
알림
</a>
<a href="#persona">
<svg viewBox="0 0 24 24" fill="none" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><circle cx="9" cy="8" r="3.2"/><path d="M3.5 20c0-3 2.5-5 5.5-5s5.5 2 5.5 5"/><path d="M17 9h4M19 7v4"/></svg>
페르소나
</a>
<a href="#voice">
<svg viewBox="0 0 24 24" fill="none" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="3" width="6" height="11" rx="3"/><path d="M5 11a7 7 0 0 0 14 0"/><line x1="12" y1="18" x2="12" y2="21"/></svg>
음성
</a>
<a href="#privacy">
<svg viewBox="0 0 24 24" fill="none" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3l7 3v5c0 5-3 8-7 10-4-2-7-5-7-10V6z"/><path d="M9 12l2 2 4-4"/></svg>
개인정보
</a>
</nav>
<!-- 우측 폼 -->
<div class="forms">
<!-- (1) 계정 -->
<section class="group" id="account">
<div class="gh">
<div class="gt">계정</div>
<div class="gd">프로필과 역할, 로그인 정보를 관리합니다.</div>
</div>
<div class="profile" style="margin-bottom:var(--sp-5);">
<div class="big"></div>
<div class="meta">
<div class="n">정민서</div>
<div class="e">minseo.jung@hanshin.ac.kr</div>
<div class="badges">
<span class="tag"><span class="d"></span>교수자</span>
<span class="tag muted"><span class="d"></span>심리상담학과</span>
</div>
</div>
</div>
<div class="field">
<div class="flab"><span class="l">표시 이름</span><span class="h">학습자·동료에게 보이는 이름입니다.</span></div>
<div class="fin"><input type="text" value="정민서"></div>
</div>
<div class="field">
<div class="flab"><span class="l">이메일</span><span class="h">로그인 및 알림 수신 주소.</span></div>
<div class="fin"><input type="email" value="minseo.jung@hanshin.ac.kr"></div>
</div>
<div class="field">
<div class="flab"><span class="l">소속</span><span class="h">학과·기관 표기.</span></div>
<div class="fin"><input type="text" value="한신대학교 심리상담학과"></div>
</div>
<div class="field">
<div class="flab"><span class="l">역할</span><span class="h">권한 범위가 달라집니다. 변경은 관리자 승인이 필요합니다.</span></div>
<div class="fin">
<div class="rolepick">
<div class="opt"><div class="t"><span class="d"></span>학습자</div><div class="h">상담 연습·내 리뷰</div></div>
<div class="opt on"><div class="t"><span class="d"></span>교수자</div><div class="h">페르소나 제작·학습자 감독</div></div>
<div class="opt"><div class="t"><span class="d"></span>관리자</div><div class="h">기관 운영·계정 관리</div></div>
</div>
</div>
</div>
<div class="gfoot">
<button class="btn ghost">변경 취소</button>
<button class="btn primary">저장</button>
</div>
</section>
<!-- 로그인 / 위험 구역 -->
<section class="group peril">
<div class="gh">
<div class="gt">로그인 및 세션</div>
<div class="gd">현재 기기와 보안을 관리합니다.</div>
</div>
<div class="optrow">
<div class="ot"><div class="l">비밀번호 변경</div><div class="h">마지막 변경: 2026년 3월 12일</div></div>
<button class="btn ghost sm">변경</button>
</div>
<div class="optrow">
<div class="ot"><div class="l">다른 기기에서 로그아웃</div><div class="h">현재 3개 기기에서 로그인 중입니다.</div></div>
<button class="btn ghost sm">전체 로그아웃</button>
</div>
<div class="optrow">
<div class="ot"><div class="l">로그아웃</div><div class="h">이 기기에서 Vignette를 종료합니다.</div></div>
<button class="btn danger sm">
<svg viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"/><polyline points="16 17 21 12 16 7"/><line x1="21" y1="12" x2="9" y2="12"/></svg>
로그아웃
</button>
</div>
</section>
<!-- (2) 알림 -->
<section class="group" id="notify">
<div class="gh">
<div class="gt">알림</div>
<div class="gd">언제, 무엇을 받을지 정합니다. 과한 알림은 끄는 편을 권합니다.</div>
</div>
<div class="optrow">
<div class="ot"><div class="l">학습자 세션 완료</div><div class="h">담당 학습자가 회기를 마치면 알립니다.</div></div>
<label class="toggle"><input type="checkbox" checked><span class="tr"></span><span class="kn"></span></label>
</div>
<div class="optrow">
<div class="ot"><div class="l">안전 신호 감지</div><div class="h">세션 중 위기 신호가 포착되면 즉시 알립니다.</div></div>
<label class="toggle"><input type="checkbox" checked><span class="tr"></span><span class="kn"></span></label>
</div>
<div class="optrow">
<div class="ot"><div class="l">주간 리뷰 요약</div><div class="h">매주 월요일, 담당 학습자 진척 요약을 메일로 보냅니다.</div></div>
<label class="toggle"><input type="checkbox"><span class="tr"></span><span class="kn"></span></label>
</div>
<div class="optrow">
<div class="ot"><div class="l">제품 소식</div><div class="h">기능 업데이트·연구 노트.</div></div>
<label class="toggle"><input type="checkbox"><span class="tr"></span><span class="kn"></span></label>
</div>
</section>
<!-- (3) 페르소나 설정 진입 (교수자) -->
<section class="group" id="persona">
<div class="gh">
<div class="gt">가상 내담자 페르소나</div>
<div class="gd">학습자가 상담 연습할 가상 내담자를 만들고 편집합니다. 외형·음성·성격·난이도를 조정해 시나리오를 설계하세요.</div>
</div>
<div class="personalist">
<div class="pcard">
<div class="face">
<svg viewBox="0 0 48 48" width="48" height="48" aria-hidden="true">
<rect width="48" height="48" fill="#2E3A36"/>
<path d="M10 48 C10 39 16 34 24 34 C32 34 38 39 38 48 Z" fill="#3C4A45"/>
<path d="M15 22 C15 14 19 11 24 11 C29 11 33 14 33 22 L33 30 C33 38 29 41 24 41 C19 41 15 38 15 30 Z" fill="#E8C9A8"/>
<path d="M14 23 C14 14 18 10 24 10 C30 10 34 14 34 23 C31 18 27 17 24 17 C21 17 17 18 14 23 Z" fill="#2B2723"/>
<circle cx="20.5" cy="24" r="1.5" fill="#3A2E26"/><circle cx="27.5" cy="24" r="1.5" fill="#3A2E26"/>
</svg>
</div>
<div class="pinfo">
<div class="pn">서연</div>
<div class="pm">17세 · 고2 · 우울 호소 청소년</div>
<div class="ptags"><span class="pchip">teen</span><span class="pchip clay">방어적</span><span class="pchip">난이도 중상</span></div>
</div>
<div class="pact">
<button class="iconbtn" aria-label="편집">
<svg viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 20h9"/><path d="M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4z"/></svg>
</button>
<button class="iconbtn" aria-label="복제">
<svg viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="11" height="11" rx="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg>
</button>
</div>
</div>
<div class="pcard">
<div class="face">
<svg viewBox="0 0 48 48" width="48" height="48" aria-hidden="true">
<rect width="48" height="48" fill="#2E3A36"/>
<path d="M10 48 C10 39 16 34 24 34 C32 34 38 39 38 48 Z" fill="#46504C"/>
<path d="M16 22 C16 15 19 12 24 12 C29 12 32 15 32 22 L32 29 C32 36 29 39 24 39 C19 39 16 36 16 29 Z" fill="#D8B594"/>
<path d="M16 19 C16 13 19 11 24 11 C29 11 32 13 32 19 C29 16 27 16 24 16 C21 16 19 16 16 19 Z" fill="#3A332C"/>
<circle cx="20.5" cy="24" r="1.5" fill="#3A2E26"/><circle cx="27.5" cy="24" r="1.5" fill="#3A2E26"/>
</svg>
</div>
<div class="pinfo">
<div class="pn">강현우</div>
<div class="pm">34세 · 직장인 · 번아웃·불안</div>
<div class="ptags"><span class="pchip">adult</span><span class="pchip">회피적</span><span class="pchip">난이도 상</span></div>
</div>
<div class="pact">
<button class="iconbtn" aria-label="편집">
<svg viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 20h9"/><path d="M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4z"/></svg>
</button>
<button class="iconbtn" aria-label="복제">
<svg viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="11" height="11" rx="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg>
</button>
</div>
</div>
</div>
<a href="#" class="addrow">
<span class="pl"><svg viewBox="0 0 24 24" fill="none" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg></span>
<div>
<div class="at">새 가상 내담자 만들기</div>
<div class="ah">외형·음성·성격·난이도를 설계해 시나리오를 추가합니다.</div>
</div>
</a>
<!-- 편집 진입 시 보이는 파라미터 미리보기 (서연 편집 펼침 예시) -->
<div style="margin-top:var(--sp-6); padding-top:var(--sp-5); border-top:1px solid var(--paper-2);">
<div class="kicker" style="font-family:var(--font-num); font-size:11px; font-weight:600; letter-spacing:0.08em; color:var(--accent); display:flex; align-items:center; gap:8px; margin-bottom:var(--sp-5);">
<span style="width:6px;height:6px;border-radius:50%;background:var(--accent-bright);"></span>편집 중 · 서연
</div>
<div class="field">
<div class="flab"><span class="l">연령대 외형</span><span class="h">눈 크기·턱선·실루엣이 연령대에 맞춰 조정됩니다.</span></div>
<div class="fin">
<select>
<option>청소년 (teen)</option>
<option>청년 (young adult)</option>
<option>성인 (adult)</option>
<option>노년 (senior)</option>
</select>
</div>
</div>
<div class="field">
<div class="flab"><span class="l">시작 정서</span><span class="h">세션 초반의 기본 정서 상태.</span></div>
<div class="fin">
<select>
<option>불안 (고각성·부정)</option>
<option>우울 (저각성·부정)</option>
<option>중립·라포</option>
<option>저항·방어</option>
</select>
</div>
</div>
<div class="field">
<div class="flab"><span class="l">호소 문제</span><span class="h">학습자에게 제시될 배경 시나리오.</span></div>
<div class="fin"><textarea>2주째 지속되는 무기력과 등교 거부. 최근 성적 하락과 또래 관계 위축을 경험. 자기개방에 소극적이며 방어적.</textarea></div>
</div>
<div class="field">
<div class="flab"><span class="l">저항 강도</span><span class="h">높을수록 라포 형성이 어렵습니다. 라포가 쌓이면 세션 중 점차 완화됩니다.</span></div>
<div class="fin">
<div class="slider">
<div class="track"><div class="fill" style="width:60%"></div><div class="knob" style="left:60%"></div></div>
<div class="scale"><span>낮음</span><span class="on">중상</span><span>높음</span></div>
</div>
</div>
</div>
<div class="field">
<div class="flab"><span class="l">음성 (voice_id)</span><span class="h">내담자 발화에 사용할 목소리.</span></div>
<div class="fin">
<select>
<option>soft-young-fem · 부드럽고 높은 톤</option>
<option>calm-adult-fem · 차분한 여성</option>
<option>steady-adult-male · 안정적 남성</option>
<option>warm-senior · 느리고 따뜻한</option>
</select>
</div>
</div>
<div class="gfoot">
<button class="btn ghost">미리듣기</button>
<button class="btn primary">페르소나 저장</button>
</div>
</div>
</section>
<!-- (4) 음성 -->
<section class="group" id="voice">
<div class="gh">
<div class="gt">음성</div>
<div class="gd">시연·미리듣기에 쓰이는 기본 목소리를 고릅니다. 페르소나별 음성은 위에서 따로 지정합니다.</div>
</div>
<div class="voicelist">
<label class="voice on">
<span class="rad"></span>
<div class="vinfo"><div class="vn">서린 · soft-young-fem</div><div class="vd">부드럽고 높은 톤 · 청소년 내담자에 적합</div></div>
<span class="play" aria-label="미리듣기"><svg viewBox="0 0 24 24" stroke-width="0"><polygon points="6 4 20 12 6 20"/></svg></span>
</label>
<label class="voice">
<span class="rad"></span>
<div class="vinfo"><div class="vn">하경 · calm-adult-fem</div><div class="vd">차분한 여성 · 표준 성인 톤</div></div>
<span class="play" aria-label="미리듣기"><svg viewBox="0 0 24 24" stroke-width="0"><polygon points="6 4 20 12 6 20"/></svg></span>
</label>
<label class="voice">
<span class="rad"></span>
<div class="vinfo"><div class="vn">도현 · steady-adult-male</div><div class="vd">낮고 안정적 · 남성 내담자</div></div>
<span class="play" aria-label="미리듣기"><svg viewBox="0 0 24 24" stroke-width="0"><polygon points="6 4 20 12 6 20"/></svg></span>
</label>
<label class="voice">
<span class="rad"></span>
<div class="vinfo"><div class="vn">정인 · warm-senior</div><div class="vd">느리고 따뜻한 · 노년 내담자</div></div>
<span class="play" aria-label="미리듣기"><svg viewBox="0 0 24 24" stroke-width="0"><polygon points="6 4 20 12 6 20"/></svg></span>
</label>
</div>
<div class="field" style="margin-top:var(--sp-5); border-top:1px solid var(--paper-2);">
<div class="flab"><span class="l">말하기 속도</span><span class="h">기본 발화 속도(rate). 1.0이 표준입니다.</span></div>
<div class="fin">
<div class="slider">
<div class="track"><div class="fill" style="width:46%"></div><div class="knob" style="left:46%"></div></div>
<div class="scale"><span>0.8×</span><span class="on">0.96×</span><span>1.2×</span></div>
</div>
</div>
</div>
</section>
<!-- (5) 개인정보 / 동의 관리 -->
<section class="group" id="privacy">
<div class="gh">
<div class="gt">개인정보 및 동의</div>
<div class="gd">상담 연습 기록의 보관과 활용 범위를 직접 관리합니다.</div>
</div>
<div class="callout info" style="margin-bottom:var(--sp-5);">
<span class="ico"><svg viewBox="0 0 24 24" fill="none" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"/><line x1="12" y1="11" x2="12" y2="16"/><circle cx="12" cy="8" r="0.6" fill="currentColor"/></svg></span>
<span class="ct">세션 음성·자막은 <strong>학습 목적 슈퍼비전</strong>에만 쓰이며, 가상 내담자와의 대화이므로 실제 내담자 개인정보는 포함되지 않습니다. 보관 기간이 지나면 자동 삭제됩니다.</span>
</div>
<div class="consent">
<div class="ci">
<div class="ct">슈퍼비전용 녹음 보관 <span class="st ok">동의함</span></div>
<div class="ch">담당 교수자가 회기말 리뷰에서 음성을 다시 들을 수 있도록 회기 녹음을 보관합니다.</div>
</div>
<label class="toggle"><input type="checkbox" checked><span class="tr"></span><span class="kn"></span></label>
</div>
<div class="consent">
<div class="ci">
<div class="ct">연구·모델 개선 활용 <span class="st pending">검토 필요</span></div>
<div class="ch">비식별화된 대화 데이터를 평가 AI 개선 연구에 활용합니다. 동의는 선택이며 언제든 철회할 수 있습니다.</div>
</div>
<label class="toggle"><input type="checkbox"><span class="tr"></span><span class="kn"></span></label>
</div>
<div class="field" style="border-top:1px solid var(--paper-2);">
<div class="flab"><span class="l">기록 보관 기간</span><span class="h">기간이 지난 회기 기록은 자동 삭제됩니다.</span></div>
<div class="fin">
<select>
<option>90일 (권장)</option>
<option>30일</option>
<option>180일</option>
<option>학기 종료 시</option>
</select>
</div>
</div>
<div class="optrow">
<div class="ot"><div class="l">내 데이터 내보내기</div><div class="h">내 모든 세션·리뷰 기록을 PDF·JSON으로 받습니다.</div></div>
<button class="btn ghost sm">
<svg viewBox="0 0 24 24" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg>
내보내기
</button>
</div>
<div class="optrow">
<div class="ot"><div class="l">모든 기록 삭제</div><div class="h">복구할 수 없습니다. 진행 전 한 번 더 확인합니다.</div></div>
<button class="btn danger sm">기록 삭제</button>
</div>
</section>
</div>
</div>
</body>
</html>