:root{--ink: #1a2e28;--ink-secondary: #3d5a50;--ink-muted: #5e7d70;--surface: #faf7f2;--surface-raised: #fffdf8;--surface-sunken: #f0ebe2;--surface-accent: #1B4332;--border: #d8d0c4;--border-light: #e8e2d8;--primary: #1B4332;--primary-hover: #15352a;--primary-fg: #faf7f2;--primary-wash: rgba(27, 67, 50, .06);--gold: #b8953e;--gold-hover: #a3832f;--gold-wash: rgba(184, 149, 62, .1);--gold-fg: #1a2e28;--success: #2d6a4f;--success-wash: rgba(45, 106, 79, .08);--error: #9b2c2c;--error-wash: rgba(155, 44, 44, .06);--warning: #8a6914;--warning-wash: rgba(138, 105, 20, .08);--font-display: "Cormorant Garamond", "Georgia", "Times New Roman", serif;--font-body: "Plus Jakarta Sans", "Pretendard Variable", -apple-system, BlinkMacSystemFont, system-ui, sans-serif;--font-mono: "JetBrains Mono", "SF Mono", "Fira Code", monospace;--text-xs: clamp(.6875rem, .65rem + .1vw, .75rem);--text-sm: clamp(.8125rem, .78rem + .1vw, .875rem);--text-base: clamp(.9375rem, .9rem + .12vw, 1rem);--text-md: clamp(1.0625rem, 1rem + .2vw, 1.125rem);--text-lg: clamp(1.25rem, 1.1rem + .5vw, 1.5rem);--text-xl: clamp(1.75rem, 1.5rem + .8vw, 2.25rem);--text-2xl: clamp(2.25rem, 1.8rem + 1.5vw, 3.25rem);--leading-tight: 1.2;--leading-snug: 1.35;--leading-normal: 1.65;--weight-normal: 400;--weight-medium: 500;--weight-semibold: 600;--weight-bold: 700;--sp-1: 4px;--sp-2: 8px;--sp-3: 12px;--sp-4: 16px;--sp-5: 20px;--sp-6: 24px;--sp-8: 32px;--sp-10: 40px;--sp-12: 48px;--sp-16: 64px;--sp-20: 80px;--r-sm: 3px;--r-md: 6px;--r-lg: 10px;--r-full: 9999px;--shadow-xs: 0 1px 2px rgba(26, 46, 40, .04);--shadow-sm: 0 1px 4px rgba(26, 46, 40, .05), 0 1px 2px rgba(26, 46, 40, .03);--shadow-md: 0 4px 16px rgba(26, 46, 40, .06), 0 1px 4px rgba(26, 46, 40, .03);--shadow-lg: 0 12px 40px rgba(26, 46, 40, .08), 0 2px 8px rgba(26, 46, 40, .04);--ease-out: cubic-bezier(.16, 1, .3, 1);--ease-expo: cubic-bezier(.19, 1, .22, 1);--dur-fast: .15s;--dur-norm: .25s;--dur-slow: .5s}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility}body{font-family:var(--font-body);font-size:var(--text-base);line-height:var(--leading-normal);color:var(--ink);background:var(--surface);min-height:100vh}img,svg{display:block;max-width:100%}a{color:var(--primary);text-decoration:none;font-weight:var(--weight-medium);transition:color var(--dur-fast) var(--ease-out)}a:hover{color:var(--gold)}:focus-visible{outline:2px solid var(--gold);outline-offset:3px}:focus:not(:focus-visible){outline:none}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}button{font-family:inherit;cursor:pointer;border:none;background:none}input,select,textarea{font-family:inherit;font-size:inherit}h1,h2,h3{font-family:var(--font-display);line-height:var(--leading-tight);color:var(--ink)}h1{font-size:var(--text-xl);font-weight:var(--weight-bold);letter-spacing:-.015em}h2{font-size:var(--text-lg);font-weight:var(--weight-semibold);letter-spacing:-.01em}h3{font-size:var(--text-md);font-weight:var(--weight-semibold)}code{font-family:var(--font-mono);font-size:.85em;background:var(--surface-sunken);padding:2px 6px;border-radius:var(--r-sm);color:var(--primary)}.page{max-width:920px;margin:0 auto;padding:var(--sp-12) var(--sp-8)}.page-narrow{max-width:620px;margin:0 auto;padding:var(--sp-12) var(--sp-8)}.page-center{min-height:100vh;display:grid;place-items:center;padding:var(--sp-6);background:linear-gradient(135deg,var(--surface) 0%,var(--surface-sunken) 100%)}.header{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:var(--sp-12)}.header h1{font-size:var(--text-2xl)}.header h1 .badge{display:inline-block;font-family:var(--font-body);font-size:var(--text-xs);font-weight:var(--weight-semibold);text-transform:uppercase;letter-spacing:.1em;color:var(--gold);background:var(--gold-wash);padding:3px 10px;border-radius:var(--r-full);vertical-align:middle;margin-left:var(--sp-3);position:relative;top:-2px}.rule{border:none;height:1px;background:var(--border);margin:var(--sp-8) 0}.rule-gold{height:2px;background:linear-gradient(90deg,var(--gold),transparent 60%);margin:var(--sp-6) 0 var(--sp-10)}.nav{display:flex;gap:var(--sp-8);margin-bottom:var(--sp-10);padding-bottom:var(--sp-4);border-bottom:1px solid var(--border-light)}.nav a{position:relative;padding:var(--sp-2) 0;min-height:44px;display:inline-flex;align-items:center;font-size:var(--text-sm);font-weight:var(--weight-semibold);letter-spacing:.04em;text-transform:uppercase;color:var(--ink-muted);transition:color var(--dur-fast) var(--ease-out)}.nav a:after{content:"";position:absolute;bottom:-1px;left:0;width:0;height:2px;background:var(--gold);transition:width var(--dur-norm) var(--ease-expo)}.nav a:hover{text-decoration:none}.back-link{display:inline-flex;align-items:center;gap:var(--sp-2);min-height:44px;font-size:var(--text-xs);font-weight:var(--weight-semibold);letter-spacing:.06em;text-transform:uppercase;color:var(--ink-muted);margin-bottom:var(--sp-6);transition:color var(--dur-fast) var(--ease-out)}.back-link:before{content:"←";font-size:1.2em;transition:transform var(--dur-fast) var(--ease-out)}.back-link:hover{color:var(--gold);text-decoration:none}.back-link:hover:before{transform:translate(-3px)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--sp-2);padding:var(--sp-3) var(--sp-6);min-height:44px;font-size:var(--text-sm);font-weight:var(--weight-semibold);letter-spacing:.02em;border-radius:var(--r-sm);transition:background var(--dur-fast) var(--ease-out),color var(--dur-fast) var(--ease-out),transform var(--dur-fast) var(--ease-out),box-shadow var(--dur-fast) var(--ease-out);white-space:nowrap}.btn-primary{background:var(--primary);color:var(--primary-fg)}.btn-primary:hover:not(:disabled){background:var(--primary-hover)}.btn-gold{background:var(--gold);color:var(--surface-raised);font-weight:var(--weight-bold)}.btn-gold:hover:not(:disabled){background:var(--gold-hover)}.btn-danger{background:transparent;color:var(--error);border:1px solid var(--error)}.btn-danger:hover:not(:disabled){background:var(--error);color:var(--surface-raised)}.btn-ghost{color:var(--ink-muted);background:transparent;letter-spacing:.04em;text-transform:uppercase;font-size:var(--text-xs)}.btn-ghost:hover{color:var(--ink)}.btn-lg{padding:var(--sp-4) var(--sp-8);font-size:var(--text-base);border-radius:var(--r-md)}.btn:disabled{opacity:.4;cursor:not-allowed;transform:none}.input{padding:var(--sp-3) var(--sp-4);border:1px solid var(--border);border-radius:var(--r-sm);font-size:var(--text-base);color:var(--ink);background:var(--surface-raised);transition:border-color var(--dur-fast) var(--ease-out),box-shadow var(--dur-fast) var(--ease-out);width:100%}.input:focus{outline:none;border-color:var(--gold);box-shadow:0 0 0 3px var(--gold-wash)}.input::placeholder{color:var(--ink-muted);font-style:italic}textarea.input{resize:vertical;min-height:88px}.label{display:flex;flex-direction:column;gap:6px;font-size:var(--text-xs);font-weight:var(--weight-semibold);letter-spacing:.06em;text-transform:uppercase;color:var(--ink-muted)}.form-row{display:flex;gap:var(--sp-3);align-items:flex-end}.form-stack{display:flex;flex-direction:column;gap:var(--sp-5)}.form-section{background:var(--surface-raised);border:1px solid var(--border-light);border-radius:var(--r-md);padding:var(--sp-6);margin-bottom:var(--sp-8)}.error-text{color:var(--error);font-size:var(--text-sm);font-weight:var(--weight-medium)}.stat-row{display:flex;gap:var(--sp-16);margin-bottom:var(--sp-12);padding:var(--sp-8) 0;border-top:2px solid var(--ink);border-bottom:1px solid var(--border)}.stat-card{flex:1}.stat-label{font-size:var(--text-xs);font-weight:var(--weight-semibold);text-transform:uppercase;letter-spacing:.08em;color:var(--ink-muted);margin-bottom:var(--sp-2)}.stat-value{font-family:var(--font-display);font-size:var(--text-2xl);font-weight:var(--weight-bold);color:var(--ink);line-height:1}table{width:100%;border-collapse:collapse}.table-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch}.table-wrap th{font-family:var(--font-body);font-size:var(--text-xs);font-weight:var(--weight-semibold);text-transform:uppercase;letter-spacing:.06em;color:var(--ink-muted);text-align:left;padding:var(--sp-3) 0;border-bottom:2px solid var(--ink)}.table-wrap td{padding:var(--sp-4) 0;border-bottom:1px solid var(--border-light);font-size:var(--text-sm);color:var(--ink-secondary)}.table-wrap td:not(:first-child),.table-wrap th:not(:first-child){padding-left:var(--sp-6)}.table-wrap tbody tr:last-child td{border-bottom:none}.table-wrap tbody tr{transition:background var(--dur-fast) var(--ease-out)}.list-stack{list-style:none;display:flex;flex-direction:column;gap:0}.list-item{padding:var(--sp-5) 0;border-bottom:1px solid var(--border-light);transition:background var(--dur-norm) var(--ease-out)}.list-item:first-child{border-top:1px solid var(--border-light)}@media (hover: hover){.list-item:hover{background:var(--primary-wash);border-radius:var(--r-sm)}}.list-item-header{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-4)}.list-item-header strong{font-family:var(--font-display);font-size:var(--text-md);font-weight:var(--weight-semibold)}.list-item-meta{font-size:var(--text-sm);color:var(--ink-muted)}.list-item-body{font-size:var(--text-sm);color:var(--ink-secondary);margin-top:var(--sp-1);line-height:var(--leading-snug)}.list-item-actions{margin-top:var(--sp-3)}.result-card{padding:var(--sp-5) var(--sp-6);border-bottom:1px solid var(--border-light);position:relative}.result-card:before{content:"";position:absolute;left:0;top:var(--sp-5);bottom:var(--sp-5);width:3px;border-radius:var(--r-full);background:var(--border)}.result-card.correct:before{background:var(--success)}.result-card.incorrect:before{background:var(--error)}.result-badge{font-family:var(--font-display);font-size:var(--text-md);font-weight:var(--weight-semibold)}.result-badge.correct{color:var(--success)}.result-badge.incorrect{color:var(--error)}.tag{display:inline-block;font-size:var(--text-xs);font-weight:var(--weight-semibold);letter-spacing:.03em;padding:2px 10px;border-radius:var(--r-full);background:var(--primary-wash);color:var(--primary);border:1px solid var(--tag-border, rgba(27, 67, 50, .15))}.tag-row{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin-top:var(--sp-3)}.score{display:inline-flex;align-items:baseline;gap:var(--sp-1)}.score-number{font-family:var(--font-display);font-size:var(--text-xl);font-weight:var(--weight-bold);color:var(--primary)}.table-wrap .score-number{font-size:var(--text-lg)}.score-unit{font-size:var(--text-sm);color:var(--ink-muted);font-weight:var(--weight-medium)}.upload-zone{border:1px dashed var(--border);border-radius:var(--r-md);padding:var(--sp-16) var(--sp-8);text-align:center;cursor:pointer;position:relative;overflow:hidden;transition:border-color var(--dur-norm) var(--ease-out),background var(--dur-norm) var(--ease-out)}.upload-zone:before{content:"";position:absolute;inset:0;background:var(--gold-wash);opacity:0;transition:opacity var(--dur-norm) var(--ease-out)}.upload-zone:hover:before,.upload-zone:focus-visible:before,.upload-zone.has-files:before{opacity:1}.upload-zone:hover,.upload-zone:focus-visible,.upload-zone.has-files{border-color:var(--gold);border-style:solid}.upload-zone input[type=file]{position:absolute;width:1px;height:1px;opacity:0}.upload-icon{font-size:2rem;margin-bottom:var(--sp-3);opacity:.4;position:relative}.upload-label{font-size:var(--text-sm);color:var(--ink-muted);position:relative}.upload-label strong{color:var(--gold);font-weight:var(--weight-semibold)}.upload-count{margin-top:var(--sp-3);font-size:var(--text-sm);font-weight:var(--weight-bold);color:var(--gold);position:relative}.login-card{width:100%;max-width:400px;background:var(--surface-raised);border-radius:var(--r-lg);padding:var(--sp-12) var(--sp-10);box-shadow:var(--shadow-lg);position:relative}.login-card:before{content:"";position:absolute;top:0;left:var(--sp-10);right:var(--sp-10);height:3px;background:linear-gradient(90deg,var(--primary),var(--gold));border-radius:0 0 var(--r-sm) var(--r-sm)}.login-brand{display:block;font-family:var(--font-display);font-size:var(--text-2xl);font-weight:var(--weight-bold);color:var(--primary);text-align:center;letter-spacing:-.02em;margin-bottom:var(--sp-2)}.login-subtitle{text-align:center;font-size:var(--text-sm);color:var(--ink-muted);margin-bottom:var(--sp-10)}.status{display:inline-flex;align-items:center;gap:var(--sp-2);font-size:var(--text-xs);font-weight:var(--weight-semibold);letter-spacing:.04em;text-transform:uppercase;padding:4px 12px;border-radius:var(--r-full)}.status-done{background:var(--success-wash);color:var(--success)}.status-pending{background:var(--surface-sunken);color:var(--ink-muted)}.status-grading{background:var(--warning-wash);color:var(--warning)}.empty-state{text-align:center;padding:var(--sp-16) var(--sp-8);color:var(--ink-muted)}.empty-state p:first-child{font-family:var(--font-display);font-size:var(--text-lg);font-style:italic;color:var(--ink-secondary)}.section-title{font-family:var(--font-body);font-size:var(--text-xs);font-weight:var(--weight-semibold);text-transform:uppercase;letter-spacing:.08em;color:var(--ink-muted);margin-bottom:var(--sp-5)}.due-date{font-size:var(--text-xs);color:var(--ink-muted);font-weight:var(--weight-medium);letter-spacing:.02em}.loading{display:flex;align-items:center;justify-content:center;padding:var(--sp-16);color:var(--ink-muted);font-size:var(--text-sm);font-style:italic}@keyframes breathe{0%,to{opacity:1}50%{opacity:.3}}.loading:before{content:"";width:6px;height:6px;border-radius:50%;background:var(--gold);margin-right:var(--sp-3);animation:breathe 2s var(--ease-out) infinite}.w-full{width:100%}.shrink-0{flex-shrink:0}.self-start{align-self:flex-start}.flex-1{flex:1}.font-medium{font-weight:var(--weight-medium)}.mt-1{margin-top:var(--sp-1)}.mt-2{margin-top:var(--sp-2)}.mt-3{margin-top:var(--sp-3)}.mt-5{margin-top:var(--sp-5)}.mb-4{margin-bottom:var(--sp-4)}.mb-6{margin-bottom:var(--sp-6)}.mb-8{margin-bottom:var(--sp-8)}.ml-3{margin-left:var(--sp-3)}.max-w-filter{max-width:280px}.col-action{width:80px}.no-border-bottom{border-bottom:none}@keyframes fadeUp{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.page,.page-narrow,.login-card{animation:fadeUp var(--dur-slow) var(--ease-expo) both}.stat-row>*{animation:fadeUp var(--dur-slow) var(--ease-expo) both}.stat-row>:nth-child(1){animation-delay:80ms}.stat-row>:nth-child(2){animation-delay:.16s}.stat-row>:nth-child(3){animation-delay:.24s}@media (hover: hover){.nav a:hover{color:var(--ink)}.nav a:hover:after{width:100%}.btn-primary:hover:not(:disabled){box-shadow:var(--shadow-md);transform:translateY(-1px)}.btn-gold:hover:not(:disabled){box-shadow:var(--shadow-md);transform:translateY(-1px)}.table-wrap tbody tr:hover{background:var(--primary-wash)}}@media (hover: none){.nav a:after{display:none}.btn-primary:hover:not(:disabled),.btn-gold:hover:not(:disabled){transform:none;box-shadow:none}.table-wrap tbody tr:hover{background:transparent}}.mobile-nav{display:none}@media (max-width: 640px){.mobile-nav{display:flex;position:fixed;bottom:0;left:0;right:0;z-index:100;background:var(--surface-raised);border-top:1px solid var(--border-light);padding:var(--sp-2) 0;padding-bottom:max(var(--sp-2),env(safe-area-inset-bottom));justify-content:space-around;box-shadow:0 -2px 12px #1a2e280f}.mobile-nav a,.mobile-nav button{display:flex;flex-direction:column;align-items:center;gap:2px;padding:var(--sp-2) var(--sp-3);min-width:64px;min-height:48px;font-size:10px;font-weight:var(--weight-semibold);letter-spacing:.03em;color:var(--ink-muted);text-decoration:none;background:none;border:none;cursor:pointer;transition:color var(--dur-fast) var(--ease-out)}.mobile-nav a:hover,.mobile-nav button:hover{color:var(--ink);text-decoration:none}.mobile-nav .nav-icon{font-size:20px;line-height:1}.mobile-nav .active{color:var(--gold)}.page,.page-narrow{padding-bottom:calc(var(--sp-16) + env(safe-area-inset-bottom,0px))}}@media (max-width: 640px){.page,.page-narrow{padding-top:var(--sp-6);padding-left:var(--sp-4);padding-right:var(--sp-4)}.stat-row{flex-direction:column;gap:var(--sp-5);padding:var(--sp-6) 0}.stat-row>*{display:flex;align-items:baseline;gap:var(--sp-3)}.stat-value{font-size:var(--text-xl)}.header{flex-direction:column;gap:var(--sp-2);margin-bottom:var(--sp-8)}.header h1{font-size:var(--text-xl)}.header h1 .badge{font-size:9px;padding:2px 8px}.nav{gap:var(--sp-5);margin-bottom:var(--sp-6)}.form-row{flex-direction:column}.form-section{padding:var(--sp-4);margin-bottom:var(--sp-6)}.login-card{padding:var(--sp-8) var(--sp-6);border-radius:var(--r-md);max-width:none;margin:0 var(--sp-4)}.upload-zone{padding:var(--sp-12) var(--sp-5)}.table-wrap table{font-size:var(--text-sm)}.table-wrap th,.table-wrap td{padding:var(--sp-3) var(--sp-2)}.table-wrap td:not(:first-child),.table-wrap th:not(:first-child){padding-left:var(--sp-3)}.result-card{padding:var(--sp-4) var(--sp-5)}.empty-state{padding:var(--sp-10) var(--sp-4)}.list-item{padding:var(--sp-4) 0}.list-item-header{flex-direction:column;align-items:flex-start;gap:var(--sp-2)}.list-item-actions,.list-item-actions .btn{width:100%}}@media (min-width: 641px) and (max-width: 1024px){.page,.page-narrow{padding:var(--sp-10) var(--sp-6)}.stat-row{gap:var(--sp-8)}.login-card{padding:var(--sp-10) var(--sp-8)}}@media (prefers-color-scheme: dark){:root{--ink: #e8e4dc;--ink-secondary: #b8b0a0;--ink-muted: #8a8070;--surface: #141210;--surface-raised: #1c1a16;--surface-sunken: #0e0d0b;--border: #2e2a24;--border-light: #252220;--primary: #6bb89a;--primary-hover: #85cdb2;--primary-fg: #141210;--primary-wash: rgba(107, 184, 154, .08);--gold: #d4aa4f;--gold-hover: #e0bb6a;--gold-wash: rgba(212, 170, 79, .1);--success: #6bb89a;--success-wash: rgba(107, 184, 154, .1);--error: #e06b5e;--error-wash: rgba(224, 107, 94, .08);--warning: #d4aa4f;--warning-wash: rgba(212, 170, 79, .1);--tag-border: rgba(107, 184, 154, .2);--shadow-xs: 0 1px 2px rgba(0,0,0, .2);--shadow-sm: 0 1px 4px rgba(0,0,0, .25);--shadow-md: 0 4px 16px rgba(0,0,0, .3);--shadow-lg: 0 12px 40px rgba(0,0,0, .4)}code{background:var(--surface-sunken);color:var(--gold)}}@media (prefers-reduced-motion: reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}
