pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#24292e;background:#fff}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#d73a49}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#6f42c1}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-variable,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id{color:#005cc5}.hljs-regexp,.hljs-string,.hljs-meta .hljs-string{color:#032f62}.hljs-built_in,.hljs-symbol{color:#e36209}.hljs-comment,.hljs-code,.hljs-formula{color:#6a737d}.hljs-name,.hljs-quote,.hljs-selector-tag,.hljs-selector-pseudo{color:#22863a}.hljs-subst{color:#24292e}.hljs-section{color:#005cc5;font-weight:700}.hljs-bullet{color:#735c0f}.hljs-emphasis{color:#24292e;font-style:italic}.hljs-strong{color:#24292e;font-weight:700}.hljs-addition{color:#22863a;background-color:#f0fff4}.hljs-deletion{color:#b31d28;background-color:#ffeef0}:root{--paper: #fbf8f3;--surface: #ffffff;--surface-2: #f6f2ea;--surface-3: #efe9de;--ink: #2b3346;--ink-soft: #6d7688;--ink-faint: #a3aab8;--line: #e7dfd2;--line-mid: #d8cebd;--line-ink: #2b3346;--sakura: #e2647c;--sakura-deep: #c94e66;--sakura-soft: #fdeef1;--sakura-line: #f3c3cd;--sora: #5789bd;--sora-soft: #eaf1f9;--sora-line: #c2d6ec;--matcha: #5f9268;--matcha-soft: #eaf3ec;--matcha-line: #c2ddc8;--kohaku: #c68430;--kohaku-soft: #faf1e2;--kohaku-line: #e8d3ac;--radius: 14px;--radius-sm: 9px;--shadow: 0 1px 2px rgba(43, 51, 70, .05), 0 3px 10px rgba(43, 51, 70, .045);--shadow-up: 0 4px 18px rgba(43, 51, 70, .1);--font: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", sans-serif;--font-round: "Yuanti SC", "Hiragino Maru Gothic ProN", "Quicksand", var(--font);--mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace}*{box-sizing:border-box}html,body,#root{height:100%}body{margin:0;color:var(--ink);font-family:var(--font);font-size:15px;line-height:1.65;-webkit-font-smoothing:antialiased;background-color:var(--paper);background-image:radial-gradient(circle,rgba(43,51,70,.055) 1px,transparent 1px);background-size:18px 18px}a{color:var(--sora);text-decoration:none}a:hover{color:var(--sakura);text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:2px}.topbar{position:sticky;top:0;z-index:20;background:var(--surface);border-bottom:1px solid var(--line);box-shadow:0 1px #e2647c29,0 2px 12px #2b33460a}.topbar-inner{max-width:1060px;margin:0 auto;padding:0 20px;height:60px;display:flex;align-items:center;gap:8px}.brand{display:flex;white-space:nowrap;align-items:center;gap:10px;font-family:var(--font-round);font-weight:700;font-size:16px;color:var(--ink);letter-spacing:.02em;margin-right:6px}.brand:hover{text-decoration:none;color:var(--ink)}.brand-mark{width:30px;height:30px;border-radius:9px;background:var(--sakura);color:#fff;display:grid;place-items:center;font-family:var(--font-round);font-size:15px;font-weight:700;flex:none;box-shadow:0 2px 0 var(--sakura-deep)}.nav{display:flex;align-items:center;gap:2px;flex:1;min-width:0;overflow-x:auto;scrollbar-width:none}.nav::-webkit-scrollbar{display:none}.nav a{position:relative;padding:6px 12px;border-radius:var(--radius-sm);color:var(--ink-soft);font-size:14px;font-weight:500;white-space:nowrap}.nav a:hover{background:var(--surface-2);color:var(--ink);text-decoration:none}.nav a.active{background:var(--sakura-soft);color:var(--sakura-deep);font-weight:600}.nav a.active:after{content:"";position:absolute;left:50%;bottom:-1px;width:4px;height:4px;margin-left:-2px;border-radius:50%;background:var(--sakura)}.userbox{display:flex;align-items:center;gap:10px;flex:none}.avatar{width:32px;height:32px;border-radius:10px;background:var(--sakura-soft);border:1.5px solid var(--sakura-line);color:var(--sakura-deep);display:grid;place-items:center;font-family:var(--font-round);font-weight:700;font-size:14px;flex:none}a.avatar:hover{text-decoration:none;border-color:var(--sakura)}.userbox-name{font-size:13.5px;line-height:1.3;text-align:right}.userbox-name span{display:block;color:var(--ink-faint);font-size:11.5px}main{flex:1;max-width:1060px;width:100%;margin:0 auto;padding:26px 20px 72px}.app{min-height:100%;display:flex;flex-direction:column}.page-head{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin-bottom:22px;flex-wrap:wrap}h1{position:relative;font-family:var(--font-round);font-size:22px;font-weight:700;margin:0;letter-spacing:.01em;padding-left:15px}h1:before{content:"";position:absolute;left:0;top:.28em;width:5px;height:.92em;border-radius:3px;background:var(--sakura)}h2{font-family:var(--font-round);font-size:16px;font-weight:700;margin:0 0 13px;letter-spacing:.01em;color:var(--ink)}h2.bracket:before{content:"「";color:var(--sakura-line)}h2.bracket:after{content:"」";color:var(--sakura-line)}.subtitle{color:var(--ink-soft);font-size:13px;margin:5px 0 0;padding-left:15px}.jp{display:block;font-size:10.5px;letter-spacing:.22em;color:var(--ink-faint);text-transform:none;margin-top:2px;padding-left:15px;font-weight:400}.card{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow)}.card-pad{padding:19px 21px}.stack{display:flex;flex-direction:column;gap:14px}.row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.spacer{flex:1}.assignment-card{position:relative;display:block;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:17px 19px 17px 22px;box-shadow:var(--shadow);transition:border-color .16s,transform .16s,box-shadow .16s;color:inherit;overflow:hidden}.assignment-card:before{content:"";position:absolute;left:0;top:0;bottom:0;width:4px;background:var(--line-mid);transition:background .16s}.assignment-card:hover{text-decoration:none;border-color:var(--sakura-line);transform:translateY(-2px);box-shadow:var(--shadow-up)}.assignment-card:hover:before{background:var(--sakura)}.assignment-title{font-family:var(--font-round);font-size:16.5px;font-weight:700;letter-spacing:.01em;margin:0 0 9px;color:var(--ink)}.meta{display:flex;align-items:center;gap:6px 13px;flex-wrap:wrap;color:var(--ink-soft);font-size:12.5px}.meta-item{display:inline-flex;align-items:center;gap:5px}.badge{display:inline-flex;align-items:center;gap:4px;padding:1px 10px;border-radius:999px;border:1px solid transparent;font-size:12px;font-weight:600;line-height:1.75;white-space:nowrap}.badge-ok{background:var(--matcha-soft);border-color:var(--matcha-line);color:var(--matcha)}.badge-warn{background:var(--kohaku-soft);border-color:var(--kohaku-line);color:var(--kohaku)}.badge-danger{background:var(--sakura-soft);border-color:var(--sakura-line);color:var(--sakura-deep)}.badge-muted{background:var(--surface-2);border-color:var(--line-mid);color:var(--ink-soft)}.badge-accent{background:var(--sora-soft);border-color:var(--sora-line);color:var(--sora)}.score-stamp{display:inline-flex;flex-direction:column;align-items:center;justify-content:center;min-width:46px;padding:3px 7px;border:1.5px solid var(--sakura);border-radius:7px;color:var(--sakura-deep);background:var(--surface);transform:rotate(-3deg);line-height:1.05}.score-stamp b{font-family:var(--font-round);font-size:17px;font-weight:700}.score-stamp span{font-size:9.5px;letter-spacing:.14em;opacity:.75}.field{display:block;margin-bottom:15px}.field-label{display:block;font-size:12.5px;font-weight:600;color:var(--ink-soft);margin-bottom:6px;letter-spacing:.02em}.field-label:before{content:"❀ ";color:var(--sakura-line);font-size:10px}input[type=text],input[type=email],input[type=password],input[type=number],input[type=datetime-local],textarea,select{width:100%;padding:9px 12px;border:1.5px solid var(--line-mid);border-radius:var(--radius-sm);background:var(--surface);color:var(--ink);font:inherit;font-size:14.5px;transition:border-color .15s,box-shadow .15s}input::placeholder,textarea::placeholder{color:var(--ink-faint)}input:focus,textarea:focus,select:focus{outline:none;border-color:var(--sakura);box-shadow:0 0 0 3px var(--sakura-soft)}textarea{resize:vertical;min-height:92px;line-height:1.7}textarea.mono{font-family:var(--mono);font-size:13.5px}.hint{font-size:12px;color:var(--ink-faint);margin-top:5px}.check{display:inline-flex;align-items:center;gap:8px;font-size:14px;color:var(--ink-soft);cursor:pointer;-webkit-user-select:none;user-select:none}.check input{width:16px;height:16px;accent-color:var(--sakura);margin:0}button,.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:8px 16px;border-radius:var(--radius-sm);border:1.5px solid var(--sakura-deep);background:var(--sakura);color:#fff;font-family:var(--font-round);font-size:14px;font-weight:700;letter-spacing:.02em;cursor:pointer;box-shadow:0 2px 0 var(--sakura-deep);transition:transform .1s,box-shadow .1s,background .15s;white-space:nowrap}button:hover:not(:disabled),.btn:hover{background:var(--sakura-deep);color:#fff;text-decoration:none}button:active:not(:disabled),.btn:active{transform:translateY(2px);box-shadow:0 0 0 var(--sakura-deep)}button:disabled{opacity:.5;cursor:not-allowed;box-shadow:0 2px 0 var(--sakura-deep)}.btn-ghost{background:var(--surface);border-color:var(--line-mid);color:var(--ink);box-shadow:0 2px 0 var(--line-mid)}.btn-ghost:hover:not(:disabled){background:var(--surface-2);border-color:var(--ink-faint);color:var(--ink)}.btn-ghost:active{box-shadow:0 0 0 var(--line-mid)}.btn-quiet{background:transparent;border-color:transparent;color:var(--ink-soft);padding:6px 10px;box-shadow:none;font-weight:600}.btn-quiet:hover:not(:disabled){background:var(--surface-2);color:var(--ink)}.btn-quiet:active{transform:none;box-shadow:none}.btn-danger{background:transparent;border-color:transparent;color:var(--sakura-deep);box-shadow:none;font-weight:600}.btn-danger:hover:not(:disabled){background:var(--sakura-soft);color:var(--sakura-deep)}.btn-danger:active{transform:none;box-shadow:none}.btn-sm{padding:5px 12px;font-size:13px}.alert{padding:10px 14px;border-radius:var(--radius-sm);font-size:13.5px;margin-bottom:14px;border:1px solid transparent;border-left-width:3px}.alert-error{background:var(--sakura-soft);color:var(--sakura-deep);border-color:var(--sakura-line);border-left-color:var(--sakura)}.alert-ok{background:var(--matcha-soft);color:var(--matcha);border-color:var(--matcha-line);border-left-color:var(--matcha)}.alert-info{background:var(--sora-soft);color:var(--sora);border-color:var(--sora-line);border-left-color:var(--sora)}.empty{text-align:center;padding:54px 20px;color:var(--ink-faint)}.empty-face{font-family:var(--mono);font-size:26px;line-height:1.2;color:var(--sakura-line);letter-spacing:.04em;margin-bottom:12px;-webkit-user-select:none;user-select:none}.empty-title{color:var(--ink-soft);font-weight:600;font-family:var(--font-round)}.empty-hint{font-size:13px;margin-top:5px}.loading{text-align:center;padding:62px 20px;color:var(--ink-faint);font-size:14px}.loading-face{font-family:var(--mono);font-size:22px;color:var(--sakura-line);display:block;margin-bottom:8px;animation:sway 1.4s ease-in-out infinite}@keyframes sway{0%,to{transform:translate(-3px)}50%{transform:translate(3px)}}.files{display:flex;flex-direction:column;gap:8px}.file-item{display:flex;align-items:center;gap:11px;padding:8px 12px;border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--surface-2);font-size:13.5px;transition:border-color .15s,background .15s}a.file-item:hover{text-decoration:none;border-color:var(--sakura-line);background:var(--sakura-soft)}.file-tag{flex:none;min-width:34px;padding:1px 5px;border-radius:5px;background:var(--ink);color:#fff;font-family:var(--mono);font-size:9.5px;font-weight:700;letter-spacing:.06em;text-align:center;text-transform:uppercase}.file-tag.is-img{background:var(--sora)}.file-tag.is-doc{background:var(--sakura)}.file-tag.is-zip{background:var(--kohaku)}.file-tag.is-code{background:var(--matcha)}.file-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ink)}.file-size{color:var(--ink-faint);font-size:11.5px;font-family:var(--mono);flex:none}.image-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(118px,1fr));gap:9px}.image-grid img{width:100%;aspect-ratio:1;object-fit:cover;border-radius:var(--radius-sm);border:1.5px solid var(--line);cursor:zoom-in;background:var(--surface-2);display:block;transition:border-color .15s,transform .15s}.image-grid img:hover{border-color:var(--sakura);transform:scale(1.02)}.dropzone{border:2px dashed var(--line-mid);border-radius:var(--radius-sm);padding:20px;text-align:center;color:var(--ink-faint);font-size:13.5px;cursor:pointer;transition:border-color .15s,background .15s,color .15s;background:var(--surface)}.dropzone:hover,.dropzone.over{border-color:var(--sakura);background:var(--sakura-soft);color:var(--sakura-deep)}.md{font-size:14.5px;line-height:1.8;overflow-wrap:anywhere}.md>*:first-child{margin-top:0}.md>*:last-child{margin-bottom:0}.md h1,.md h2,.md h3,.md h4{font-family:var(--font-round);margin:22px 0 10px;font-weight:700;letter-spacing:.01em;line-height:1.45;padding-left:0}.md h1:before,.md h2:before,.md h2:after{content:none}.md h1{font-size:19px}.md h2{font-size:17px;padding-bottom:5px;border-bottom:1px dashed var(--line-mid)}.md h3{font-size:15.5px;color:var(--sakura-deep)}.md p{margin:0 0 12px}.md ul,.md ol{margin:0 0 12px;padding-left:22px}.md li{margin-bottom:5px}.md ul li::marker{color:var(--sakura)}.md ol li::marker{color:var(--sakura);font-weight:700}.md blockquote{margin:0 0 12px;padding:8px 14px;border-left:3px solid var(--sakura-line);background:var(--sakura-soft);border-radius:0 var(--radius-sm) var(--radius-sm) 0;color:var(--ink-soft)}.md blockquote>*:last-child{margin-bottom:0}.md code{font-family:var(--mono);font-size:.87em;background:var(--surface-2);padding:2px 5px;border-radius:5px;border:1px solid var(--line);color:var(--sakura-deep)}.md pre{margin:0 0 14px;padding:14px 16px;background:var(--surface-2);border:1px solid var(--line);border-radius:var(--radius-sm);overflow-x:auto}.md pre code{background:none;border:none;padding:0;font-size:13px;line-height:1.65;color:var(--ink)}.md img{max-width:100%;border-radius:var(--radius-sm);border:1px solid var(--line)}.md table{border-collapse:collapse;width:100%;margin-bottom:14px;font-size:13.5px;display:block;overflow-x:auto}.md th,.md td{border:1px solid var(--line);padding:7px 12px;text-align:left}.md th{background:var(--sakura-soft);color:var(--sakura-deep);font-weight:700}.md hr{border:none;border-top:1px dashed var(--line-mid);margin:20px 0}.table-wrap{overflow-x:auto;border:1px solid var(--line);border-radius:var(--radius);background:var(--surface);box-shadow:var(--shadow)}table.data{width:100%;border-collapse:collapse;font-size:14px}table.data th{text-align:left;padding:10px 15px;background:var(--surface-2);color:var(--ink-soft);font-weight:600;font-size:12px;letter-spacing:.04em;border-bottom:1.5px solid var(--line-mid);white-space:nowrap}table.data td{white-space:nowrap;padding:11px 15px;border-bottom:1px solid var(--line);vertical-align:middle}table.data tr:last-child td{border-bottom:none}table.data tbody tr:hover{background:var(--sakura-soft)}.auth-wrap{position:relative;min-height:100vh;display:grid;place-items:center;padding:26px 20px;overflow:hidden}.auth-card{position:relative;z-index:1;width:100%;max-width:390px}.auth-head{text-align:center;margin-bottom:22px}.auth-head .brand-mark{width:52px;height:52px;border-radius:15px;font-size:24px;margin:0 auto 14px;box-shadow:0 3px 0 var(--sakura-deep)}.auth-head h1{font-size:20px;padding-left:0}.auth-head h1:before{content:none}.auth-head p{color:var(--ink-soft);font-size:13px;margin:6px 0 0;letter-spacing:.1em}.petal{position:absolute;width:15px;height:15px;background:var(--sakura-line);opacity:.5;border-radius:15px 0;pointer-events:none}.auth-tabs{display:flex;gap:4px;background:var(--surface-2);padding:4px;border-radius:var(--radius-sm);margin-bottom:18px;border:1px solid var(--line)}.auth-tabs button{flex:1;background:transparent;border-color:transparent;color:var(--ink-soft);padding:7px;font-size:14px;border-radius:6px;box-shadow:none}.auth-tabs button.active{background:var(--surface);color:var(--sakura-deep);border-color:var(--sakura-line);box-shadow:0 1px 3px #2b334614}.auth-tabs button:hover:not(.active){background:transparent;color:var(--ink)}.auth-tabs button:active{transform:none;box-shadow:none}.lightbox{position:fixed;inset:0;background:#1e1a1ce0;display:grid;place-items:center;z-index:100;padding:26px;cursor:zoom-out}.lightbox img{max-width:100%;max-height:100%;border-radius:var(--radius-sm);border:3px solid #fff}.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(138px,1fr));gap:12px;margin-bottom:20px}.stat{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:14px 16px;box-shadow:var(--shadow)}.stat-value{font-family:var(--font-round);font-size:25px;font-weight:700;letter-spacing:.01em;line-height:1.2;color:var(--ink)}.stat-label{font-size:12px;color:var(--ink-soft);margin-top:3px;letter-spacing:.05em}.progress{height:6px;background:var(--surface-3);border-radius:999px;overflow:hidden;margin-top:9px}.progress>div{height:100%;background:var(--sakura);border-radius:999px;transition:width .35s}details.reveal{border-top:1px dashed var(--line-mid);padding-top:12px;margin-top:12px}details.reveal>summary{cursor:pointer;font-size:13.5px;color:var(--ink-soft);font-weight:600;list-style:none;-webkit-user-select:none;user-select:none}details.reveal>summary::-webkit-details-marker{display:none}details.reveal>summary:before{content:"▸ "}details.reveal[open]>summary:before{content:"▾ "}.link-list{display:flex;flex-direction:column;gap:6px}.link-list a{font-size:13.5px;overflow-wrap:anywhere}.feedback-box{background:var(--sora-soft);border:1px solid var(--sora-line);border-left:3px solid var(--sora);border-radius:0 var(--radius-sm) var(--radius-sm) 0;padding:13px 16px}.grade-box{background:var(--surface-2);border:1px dashed var(--line-mid);border-radius:var(--radius-sm);padding:13px 15px}.grid-2{display:grid;grid-template-columns:1fr 1fr;gap:0 14px}.grid-host{display:grid;grid-template-columns:1fr 120px;gap:0 14px}.input-row{display:flex;gap:8px;align-items:stretch}.input-row input{flex:1;min-width:0}.input-row button{flex:none}.link-btn{background:none;border:none;box-shadow:none;padding:0;color:var(--sora);font-family:var(--font);font-weight:500;font-size:13px}.link-btn:hover:not(:disabled){background:none;color:var(--sakura);text-decoration:underline}.link-btn:active:not(:disabled){transform:none;box-shadow:none}.dialog-backdrop{position:fixed;inset:0;z-index:90;display:grid;place-items:center;padding:20px;background:#2b33466b;animation:dialog-fade .14s ease-out}.dialog{width:100%;max-width:400px;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);box-shadow:0 12px 40px #2b334638;padding:20px 22px 18px;animation:dialog-pop .16s ease-out}h2.dialog-title{position:relative;font-size:16.5px;margin:0 0 8px;padding-left:12px}h2.dialog-title:before{content:"";position:absolute;left:0;top:.3em;width:4px;height:.9em;border-radius:2px;background:var(--sakura)}.dialog-message{color:var(--ink-soft);font-size:14px;line-height:1.7;white-space:pre-line;overflow-wrap:anywhere}.dialog-field{margin:14px 0 0}.dialog-error{color:var(--sakura-deep);font-size:12.5px;margin-top:6px}.dialog-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:20px}button.btn-danger-solid{background:var(--sakura-deep);border-color:#a93f55;box-shadow:0 2px #a93f55}button.btn-danger-solid:hover:not(:disabled){background:#b3445b}button.btn-danger-solid:active:not(:disabled){box-shadow:0 0 #a93f55}@keyframes dialog-fade{0%{opacity:0}to{opacity:1}}@keyframes dialog-pop{0%{opacity:0;transform:translateY(6px) scale(.98)}to{opacity:1;transform:none}}@media(prefers-reduced-motion:reduce){.dialog-backdrop,.dialog{animation:none}}@media(max-width:900px){.userbox-name{display:none}.nav{padding-right:22px;-webkit-mask-image:linear-gradient(to right,#000 82%,transparent);mask-image:linear-gradient(to right,#000 82%,transparent)}.nav a{padding:6px 8px;font-size:13.5px}}@media(max-width:640px){main{padding:18px 14px 60px}.topbar-inner{padding:0 14px;height:56px}.brand span.brand-text,.brand-flower{display:none}h1{font-size:19px}.card-pad{padding:16px}body{background-size:15px 15px}.grid-2,.grid-host{grid-template-columns:1fr}}
