:root{--paper:#f6f3ec;--paper-2:#faf8f2;--paper-raised:#fff;--ink:#17202e;--ink-soft:#47536a;--ink-faint:#8992a3;--rule:#e6e0d3;--rule-soft:#efeae0;--accent:#0d8175;--accent-deep:#0a655c;--accent-soft:#d9ece9;--accent-glow:rgba(13,129,117,.14);--amber:#bd7f18;--amber-soft:#f5e8ca;--shadow-sm:0 1px 2px rgba(23,32,46,.05);--shadow:0 1px 3px rgba(23,32,46,.06),0 10px 30px rgba(23,32,46,.06);--shadow-lg:0 2px 6px rgba(23,32,46,.08),0 20px 48px rgba(23,32,46,.1);--serif:"Iowan Old Style","Palatino Linotype",Palatino,Georgia,serif;--sans:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;--radius:12px;--radius-sm:9px}*{box-sizing:border-box;margin:0;padding:0}html{-webkit-text-size-adjust:100%}body{background:radial-gradient(1200px 600px at 80% -10%,var(--paper-2),transparent),var(--paper);background-attachment:fixed;color:var(--ink);font-family:var(--sans);font-size:15px;line-height:1.55;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}a{color:var(--accent);text-decoration:none}a:hover{color:var(--accent-deep);text-decoration:underline}::selection{background:var(--accent-soft)}.shell{min-height:100vh;max-width:900px;margin:0 auto;padding:0 22px calc(90px + env(safe-area-inset-bottom));position:relative}.shell:before{content:"";position:fixed;top:0;bottom:0;left:max(22px,calc(50vw - 450px + 22px));width:2px;background:linear-gradient(180deg,transparent,var(--accent) 12%,var(--accent) 88%,transparent);opacity:.16}header.masthead{padding:38px 0 24px 26px;border-bottom:1px solid var(--rule);margin-bottom:30px;display:flex;align-items:flex-end;justify-content:space-between;gap:16px}.masthead h1{font-family:var(--serif);font-weight:600;font-size:31px;letter-spacing:-.015em;line-height:1.05;color:var(--ink)}.masthead .sub{color:var(--ink-faint);font-size:12px;margin-top:5px;letter-spacing:.09em;text-transform:uppercase;font-weight:600}.masthead .who{text-align:right;font-size:13px;color:var(--ink-soft);line-height:1.7}.content{padding-left:26px}.card{background:var(--paper-raised);border:1px solid var(--rule);border-radius:var(--radius);padding:22px 24px;box-shadow:var(--shadow);margin-bottom:16px}.issue-row{display:block;cursor:pointer;transition:border-color .16s ease,transform .16s ease,box-shadow .16s ease;position:relative;overflow:hidden}.issue-row:after{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--accent);opacity:0;transition:opacity .16s ease}.issue-row:hover{border-color:var(--accent-soft);transform:translateY(-2px);box-shadow:var(--shadow-lg);text-decoration:none}.issue-row:hover:after{opacity:.8}.issue-row:active{transform:translateY(0)}.issue-row .title{font-family:var(--serif);font-size:18.5px;color:var(--ink);font-weight:600;letter-spacing:-.01em}.issue-meta{display:flex;gap:9px;margin-top:9px;font-size:12.5px;color:var(--ink-faint);flex-wrap:wrap}.issue-meta,.tag{align-items:center}.tag{display:inline-flex;gap:5px;padding:3px 10px;border-radius:20px;font-size:11px;font-weight:700;letter-spacing:.03em;text-transform:uppercase}.tag.batch{background:var(--accent-soft);color:var(--accent-deep)}.tag.open{background:var(--amber-soft);color:#86560c}.tag.open:before{content:"●";font-size:7px}.tag.resolved{background:#e6ebe8;color:#46574f}.tag.resolved:before{content:"✓";font-size:9px}label{display:block;font-size:12.5px;color:var(--ink-soft);margin-bottom:7px;font-weight:600;letter-spacing:.01em}input[type=email],input[type=password],input[type=text],select,textarea{width:100%;padding:12px 14px;font:inherit;font-size:15px;color:var(--ink);background:var(--paper-2);border:1px solid var(--rule);border-radius:var(--radius-sm);outline:none;transition:border-color .14s ease,box-shadow .14s ease,background .14s ease}input::placeholder,textarea::placeholder{color:var(--ink-faint)}input:focus,select:focus,textarea:focus{border-color:var(--accent);background:var(--paper-raised);box-shadow:0 0 0 4px var(--accent-glow)}textarea{resize:vertical;min-height:96px;line-height:1.5}.field{margin-bottom:17px}.btn,button{font:inherit;font-weight:600;font-size:15px;padding:12px 22px;border-radius:var(--radius-sm);border:1px solid var(--accent);background:linear-gradient(180deg,var(--accent),var(--accent-deep));color:#fff;cursor:pointer;transition:transform .12s ease,box-shadow .12s ease,filter .12s ease;box-shadow:var(--shadow-sm);-webkit-tap-highlight-color:transparent}.btn:hover,button:hover{transform:translateY(-1px);box-shadow:var(--shadow);text-decoration:none}.btn:active,button:active{transform:translateY(0)}button:disabled{opacity:.45;cursor:default;transform:none;box-shadow:none}.btn-quiet{background:var(--paper-raised);border-color:var(--rule);color:var(--ink-soft)}.btn-quiet:hover{border-color:var(--ink-faint)}.btn-small{padding:8px 14px;font-size:13px}.thread{margin:4px 0 8px}.bubble{padding:13px 16px;border-radius:14px;margin-bottom:13px;max-width:80%;box-shadow:var(--shadow-sm);animation:rise .28s cubic-bezier(.2,.7,.3,1) both}@keyframes rise{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}.bubble .meta{font-size:11px;color:var(--ink-faint);margin-bottom:5px;font-weight:600;letter-spacing:.02em}.bubble.from-student{background:var(--paper-raised);border:1px solid var(--rule);border-bottom-left-radius:5px;margin-right:auto}.bubble.from-teacher{background:linear-gradient(180deg,var(--accent),var(--accent-deep));color:#fff;border-bottom-right-radius:5px;margin-left:auto}.bubble.from-teacher .meta{color:hsla(0,0%,100%,.8)}.bubble p{white-space:pre-wrap;word-break:break-word}.toolbar{display:flex;gap:10px;align-items:flex-end;margin-bottom:22px;flex-wrap:wrap}.toolbar select{width:auto;min-width:140px}.empty{text-align:center;padding:60px 20px;color:var(--ink-faint)}.empty .big{font-family:var(--serif);font-size:21px;color:var(--ink-soft);margin-bottom:8px}.notice{padding:13px 16px;border-radius:var(--radius-sm);font-size:13.5px;margin-bottom:16px;line-height:1.5}.notice.err{background:#fbe9e6;color:#a03528;border:1px solid #f2cec8}.notice.ok{background:var(--accent-soft);color:var(--accent-deep);border:1px solid #c3e0db}.notice.info{background:#eef3fb;color:#35507e;border:1px solid #d3e0f2}.backlink{font-size:13px;color:var(--ink-soft);margin-bottom:20px;display:inline-flex;align-items:center;gap:5px;cursor:pointer}.backlink:hover{color:var(--accent);text-decoration:none}.badge-count{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;background:var(--accent);color:#fff;border-radius:12px;font-size:11px;font-weight:700;margin-left:6px}.push-banner{display:flex;align-items:center;gap:12px;justify-content:space-between;background:var(--paper-raised);border:1px solid var(--rule);border-radius:var(--radius-sm);padding:12px 16px;margin-bottom:18px;box-shadow:var(--shadow-sm);flex-wrap:wrap}.push-banner .txt{font-size:13px;color:var(--ink-soft);flex:1 1;min-width:160px}@media (max-width:560px){body{font-size:15px}.shell:before{display:none}.content,header.masthead{padding-left:0}header.masthead{flex-direction:column;align-items:flex-start;padding-top:30px;gap:10px}.masthead .who{text-align:left}.masthead h1{font-size:27px}.bubble{max-width:90%}.card{padding:18px}.toolbar{gap:8px}.toolbar>div{flex:1 1;min-width:0}.toolbar select{width:100%;min-width:0}.btn,button{width:100%}.btn-row button{width:auto}}@media (prefers-reduced-motion:reduce){*,:after,:before{animation:none!important;transition:none!important}}.app{min-height:100vh;min-height:100dvh}.sidebar{position:fixed;top:0;left:0;bottom:0;width:250px;background:var(--paper-raised);border-right:1px solid var(--rule);display:flex;flex-direction:column;padding:24px 16px;z-index:20}.brand{display:flex;align-items:center;gap:12px;padding:4px 8px 22px}.brand-mark{width:34px;height:34px;border-radius:9px;flex-shrink:0;background:linear-gradient(150deg,var(--accent),var(--accent-deep));position:relative}.brand-mark:after{content:"";position:absolute;inset:0;background:radial-gradient(circle at 32% 34%,#fff 0 3px,transparent 3.5px),radial-gradient(circle at 68% 66%,hsla(0,0%,100%,.85) 0 3px,transparent 3.5px)}.brand-name{font-family:var(--serif);font-size:18px;font-weight:600;color:var(--ink);line-height:1.1}.brand-sub{font-size:11px;color:var(--ink-faint);letter-spacing:.04em;margin-top:2px}.nav{display:flex;flex-direction:column;gap:3px;flex:1 1}.nav-item{display:flex;align-items:center;gap:11px;width:100%;text-align:left;padding:11px 13px;border-radius:9px;background:transparent;border:1px solid transparent;color:var(--ink-soft);font-size:14.5px;font-weight:600;cursor:pointer;transition:background .12s ease,color .12s ease;box-shadow:none}.nav-item:hover{background:var(--paper-2);color:var(--ink);transform:none;box-shadow:none}.nav-item.is-active{background:var(--accent-soft);color:var(--accent-deep)}.nav-icon{font-size:17px;width:20px;text-align:center}.sidebar-foot{border-top:1px solid var(--rule);padding-top:14px;margin-top:8px}.who-name{padding:0 8px 8px}.signout,.who-name{font-size:13px;color:var(--ink-soft);font-weight:600}.signout{width:100%;text-align:left;padding:9px 12px;background:transparent;border:1px solid var(--rule);border-radius:8px;cursor:pointer;box-shadow:none}.signout:hover{border-color:var(--ink-faint);color:var(--ink);transform:none;box-shadow:none}.main{margin-left:250px;min-height:100vh}.main-inner{max-width:780px;margin:0 auto;padding:40px 40px 80px}.tabbar{display:none}@media (max-width:820px){.sidebar{display:none}.main{margin-left:0}.main-inner{padding:26px 18px calc(78px + env(safe-area-inset-bottom));max-width:640px}.tabbar{position:fixed;left:0;right:0;bottom:0;display:flex;justify-content:space-around;background:var(--paper-raised);border-top:1px solid var(--rule);padding:8px 6px calc(8px + env(safe-area-inset-bottom));z-index:30}.tabbar-item{display:flex;flex-direction:column;align-items:center;gap:3px;flex:1 1;background:transparent;border:none;box-shadow:none;color:var(--ink-faint);font-size:10.5px;font-weight:600;cursor:pointer;padding:4px;border-radius:8px}.tabbar-item:hover{transform:none;box-shadow:none}.tabbar-item.is-active{color:var(--accent-deep)}.tabbar-icon{font-size:20px}.tabbar-label{letter-spacing:.01em}}.page{min-height:100vh;min-height:100dvh;display:flex;flex-direction:column;align-items:center;padding:0 20px calc(60px + env(safe-area-inset-bottom))}.page-head{width:100%;max-width:560px;padding:44px 0 22px;margin-bottom:26px;border-bottom:1px solid var(--rule);text-align:center}.page-head h1{font-family:var(--serif);font-weight:600;font-size:30px;letter-spacing:-.015em;color:var(--ink)}.page-head .sub{color:var(--ink-faint);font-size:12px;margin-top:6px;letter-spacing:.08em;text-transform:uppercase;font-weight:600}.page-body{width:100%;max-width:560px}@media (max-width:560px){.page-head{padding-top:32px}.page-head h1{font-size:25px}}