:root{--ink:#18231f;--forest:#173d31;--green:#2e6653;--mint:#dce9df;--paper:#f4f1e9;--warm:#e8a961;--line:#cfd4cb;--white:#fff;--danger:#a54034;--shadow:0 16px 45px rgba(19,44,35,.14)}
*{box-sizing:border-box}html,body{height:100%;margin:0;overflow:hidden}body{font-family:"Noto Sans TC","PingFang TC","Microsoft JhengHei",sans-serif;color:var(--ink);background:var(--paper);-webkit-tap-highlight-color:transparent}button,input,textarea{font:inherit}button{cursor:pointer}.hidden{display:none!important}.entry{height:100%;display:grid;place-items:center;padding:24px;background:var(--forest);background-image:linear-gradient(rgba(255,255,255,.035) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.035) 1px,transparent 1px);background-size:36px 36px}.entry-card{width:min(520px,100%);background:var(--paper);padding:clamp(28px,6vw,58px);box-shadow:18px 18px 0 #0e2a21}.eyebrow{text-transform:uppercase;letter-spacing:.18em;font-size:12px;font-weight:800;color:var(--green);margin:0 0 14px}.entry h1{font-size:clamp(38px,7vw,60px);line-height:1.05;letter-spacing:-.045em;margin:0}.entry h1 span{color:var(--green)}.lead{line-height:1.75;color:#48534e;margin:22px 0 26px}.entry label,.teacher-dialog label,.submit-pane label{display:grid;gap:8px;font-weight:700;font-size:14px;margin:14px 0}.entry label em{font-size:11px;font-style:normal;font-weight:400;color:#6d7772}.profile-intro{padding:10px 12px;background:var(--mint);font-weight:800;font-size:13px}.entry input,.entry select,.teacher-dialog input,.submit-pane input,.submit-pane textarea,.teacher-dialog textarea{width:100%;border:1px solid #aeb9b2;background:#fff;padding:13px 14px;border-radius:3px;outline:none}.entry input:focus,textarea:focus,input:focus{border-color:var(--green);box-shadow:0 0 0 3px rgba(46,102,83,.13)}.google-login{display:flex;align-items:center;justify-content:center;gap:12px;background:#fff;border:1px solid #aeb9b2;color:var(--ink);padding:14px;text-decoration:none;font-weight:800}.google-login span{font-family:Arial,sans-serif;color:#4285f4;font-size:20px}.google-login:hover{border-color:var(--green)}.primary{border:0;background:var(--forest);color:white;padding:13px 20px;font-weight:800;border-radius:3px}.primary:hover{background:#245744}.wide{width:100%;display:flex;justify-content:space-between;margin-top:22px}.fine{font-size:12px;color:#707873;text-align:center;margin:16px 0 0}.error{min-height:1em;color:var(--danger);font-size:13px}.app{height:100%;display:grid;grid-template-rows:64px auto 1fr}.topbar{display:flex;align-items:center;justify-content:space-between;padding:0 22px;background:var(--forest);color:white}.brand{display:flex;align-items:center;gap:10px}.brand-mark{width:35px;height:35px;display:grid;place-items:center;border:1px solid #92b2a6;color:#dce9df;font-weight:900}.brand div{display:grid}.brand small{font-size:10px;letter-spacing:.12em;color:#a9c0b7}.top-actions{display:flex;align-items:center;gap:14px}.presence{font-size:13px;color:#bcd7cc}.presence::first-letter{color:#6fe0a5}.ghost,.light{border:1px solid #b8c1bc;background:transparent;padding:9px 13px;border-radius:3px;font-weight:700}.topbar .ghost{color:white;border-color:#557367}.small{font-size:12px;padding:7px 10px}.broadcast{background:var(--warm);padding:10px 22px;display:flex;justify-content:space-between;align-items:center;gap:20px}.broadcast div{display:flex;align-items:center;gap:16px;min-width:0}.broadcast span{font-size:11px;font-weight:900;letter-spacing:.08em;white-space:nowrap}.broadcast p{margin:0;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.light{background:rgba(255,255,255,.65);border:0;white-space:nowrap}.layout{min-height:0;display:grid;grid-template-columns:minmax(500px,1fr) 330px;gap:1px;background:var(--line)}.left-column{min-height:0;display:grid;grid-template-rows:minmax(280px,1.08fr) minmax(260px,.92fr);gap:1px}.map-panel,.work-panel,.roster{background:var(--paper);min-height:0}.map-panel{display:grid;grid-template-rows:42px 1fr}.map-heading,.roster-head{display:flex;align-items:center;justify-content:space-between;padding:0 16px;border-bottom:1px solid var(--line)}.map-heading>div,.roster-head>div{display:flex;align-items:center;gap:10px}.map-heading small,.roster-head small{font-size:11px;color:#68736d}.section-no{font-family:monospace;color:var(--green);font-size:11px}.map-viewport{position:relative;overflow:hidden;touch-action:none;background:#e9eee8}.map-grid{position:absolute;inset:-100%;background-image:linear-gradient(rgba(24,67,52,.09) 1px,transparent 1px),linear-gradient(90deg,rgba(24,67,52,.09) 1px,transparent 1px);background-size:40px 40px}.map-world{position:absolute;left:50%;top:50%;transform-origin:0 0;will-change:transform}.map-card{position:absolute;width:150px;min-height:84px;padding:12px;border:1px solid #aab6af;background:#faf9f4;box-shadow:5px 5px 0 rgba(23,61,49,.11);transform:translate(-50%,-50%);user-select:none;touch-action:none}.map-card.mine{border:2px solid var(--green);background:#fff}.map-card.dragging{box-shadow:8px 9px 0 rgba(23,61,49,.2);cursor:grabbing}.map-card .status-line{display:flex;justify-content:space-between;gap:4px;font-size:9px;color:#66736d}.online-dot{width:7px;height:7px;background:#a0a9a4;border-radius:50%;display:inline-block;margin-right:4px}.online-dot.on{background:#2fb773;box-shadow:0 0 0 3px rgba(47,183,115,.13)}.map-card strong{display:block;font-size:14px;margin:8px 0 2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.map-card p{font-size:10px;margin:0;color:#66736d;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.badge{display:inline-block;margin-top:8px;padding:3px 5px;background:var(--mint);font-size:9px;font-weight:800}.badge.pass{background:#c7e9d6;color:#175a38}.map-controls{position:absolute;right:12px;bottom:12px;display:flex;gap:5px}.map-controls button{height:36px;min-width:36px;border:1px solid #aeb8b2;background:rgba(255,255,255,.94);font-weight:900}.map-controls .home-button{padding:0 11px;font-size:11px}.zoom-label{position:absolute;left:12px;bottom:12px;background:rgba(23,61,49,.82);color:#fff;padding:5px 7px;font:10px monospace}.work-panel{position:relative;display:grid;grid-template-rows:40px 1fr 46px;overflow:hidden}.work-heading{display:flex;align-items:center;gap:10px;padding:0 16px;border-bottom:1px solid var(--line);font-size:13px}.work-heading span{font-size:10px;background:#d2dbd5;padding:3px 5px}.work-heading small{margin-left:auto;color:#6c7771}.submission-dock{z-index:5;background:var(--paper);border-top:1px solid var(--line)}.submission-dock>summary{height:45px;display:flex;align-items:center;justify-content:space-between;padding:0 18px;background:var(--forest);color:#fff;cursor:pointer;list-style:none}.submission-dock>summary::-webkit-details-marker{display:none}.submission-dock>summary span{display:flex;align-items:baseline;gap:12px}.submission-dock>summary small{color:#bfd0c9;font-size:10px}.submission-dock>summary i{font-style:normal;font-size:18px;transition:transform .2s}.submission-dock[open]{position:absolute;inset:auto 0 0;height:min(90%,560px);display:grid;grid-template-rows:46px 1fr;box-shadow:0 -16px 32px rgba(20,45,36,.2)}.submission-dock[open]>summary i{transform:rotate(180deg)}.tabs{display:flex;border-bottom:1px solid var(--line)}.tab{border:0;border-right:1px solid var(--line);background:#e8e9e4;padding:0 18px;font-weight:800;color:#667068}.tab.active{background:var(--paper);color:var(--forest);box-shadow:inset 0 3px var(--green)}.tab span{font-size:10px;margin-left:6px;background:#d2dbd5;padding:3px 5px}.tab .dot{display:inline-block;width:7px;height:7px;padding:0;border-radius:50%;background:var(--warm)}.pane{min-height:0}.chat-pane{display:grid;grid-template-rows:1fr auto auto}.messages{overflow:auto;padding:13px 18px;display:flex;flex-direction:column;gap:9px}.empty-chat{margin:auto;color:#68726d;text-align:center;font-size:13px;line-height:1.8}.message{max-width:78%;padding:9px 12px;font-size:13px;line-height:1.55;white-space:pre-wrap;border-radius:8px}.message.user{align-self:flex-end;background:var(--forest);color:white;border-bottom-right-radius:2px}.message.assistant{align-self:flex-start;background:white;border:1px solid #d4d9d5;border-bottom-left-radius:2px}.message.error-message{border-color:#d6a69e;color:var(--danger)}.composer{display:grid;grid-template-columns:1fr 43px;gap:8px;padding:9px 14px 5px}.composer textarea{resize:none;border:1px solid #aab5ae;border-radius:4px;padding:10px;outline:none}.send{border:0;background:var(--warm);font-size:23px;font-weight:900}.send:disabled,.primary:disabled{opacity:.55;cursor:not-allowed}.notice{height:17px;margin:0 14px 5px;font-size:11px;color:var(--danger)}.submit-pane{overflow:auto;padding:15px 20px}.assignment-intro{display:flex;gap:14px;align-items:baseline}.assignment-intro strong{white-space:nowrap;color:var(--green)}.assignment-intro p{margin:0;font-size:13px}.submit-pane details{border:1px solid var(--line);background:#ecece6;margin:10px 0;padding:9px 11px;font-size:12px}.submit-pane summary{font-weight:800;cursor:pointer}.submit-pane details p{line-height:1.6}.submit-pane form{max-width:760px}.submit-pane label em{font-weight:400;color:#758079;font-style:normal;font-size:11px}.submit-pane textarea{resize:vertical}.template{padding-top:4px}.result{background:#fff;border-left:4px solid var(--green);padding:15px;margin:8px 0}.result h3{margin:0 0 8px}.result pre{white-space:pre-wrap;background:#edf0eb;padding:12px;font-family:inherit;font-size:12px}.result-actions{display:flex;gap:8px}.roster{display:grid;grid-template-rows:42px 1fr;overflow:hidden}.card-list{overflow:auto;padding:12px}.list-card{width:100%;text-align:left;border:1px solid var(--line);background:#faf9f4;padding:13px;margin-bottom:8px}.list-card:hover{border-color:var(--green)}.list-card-top{display:flex;justify-content:space-between;gap:8px}.list-card strong{font-size:14px}.list-card small{color:#758079}.list-card p{font-size:11px;color:#66716b;margin:8px 0 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.drawer-handle{display:none}.card-dialog,.teacher-dialog{border:0;padding:0;box-shadow:var(--shadow);width:min(600px,calc(100% - 28px));max-height:85vh;background:var(--paper)}dialog::backdrop{background:rgba(10,25,20,.58)}.dialog-close{position:absolute;right:12px;top:10px;border:0;background:transparent;font-size:28px}.dialog-body{padding:28px}.dialog-identity h2{margin:4px 0}.dialog-identity p{margin:0;color:#68736d}.dialog-status{display:flex;gap:8px;margin:14px 0}.dialog-status span{font-size:11px;padding:5px 7px;background:#dfe5df}.observed-chat{max-height:310px;overflow:auto;border-block:1px solid var(--line);padding:12px 0;margin:12px 0}.observed-chat .message{margin:7px 0}.prompt-box{background:#e5e8e2;padding:12px;white-space:pre-wrap;font-size:12px;line-height:1.6}.teacher-panel{padding:28px;max-height:85vh;overflow:auto}.teacher-panel>h2{margin-top:0}.teacher-panel form{padding:14px 0}.teacher-panel form+form{border-top:1px solid var(--line)}.teacher-panel h3{margin:0}.llm-status-result{display:none;padding:9px 11px;background:#e4e9e4;font-size:12px;line-height:1.5;white-space:pre-wrap}.llm-status-result.show{display:block}.llm-status-result.fail{background:#f2ded9;color:var(--danger)}.thresholds{display:grid;grid-template-columns:1fr 1fr;gap:12px}.fine.left{text-align:left;margin:4px 0}.dialog-actions{display:flex;justify-content:flex-end;gap:8px}.toast{position:fixed;left:50%;bottom:24px;transform:translate(-50%,20px);background:#102c23;color:#fff;padding:10px 16px;opacity:0;pointer-events:none;transition:.2s;z-index:20;font-size:13px}.toast.show{opacity:1;transform:translate(-50%,0)}
@media(max-width:760px){.app{grid-template-rows:54px auto 1fr}.topbar{padding:0 12px}.brand-mark{width:30px;height:30px}.brand small{display:none}.top-actions{gap:8px}.presence{font-size:11px}.topbar .ghost{font-size:10px;padding:6px}.broadcast{padding:8px 10px}.broadcast div{display:block}.broadcast span{font-size:9px}.broadcast p{font-size:12px}.broadcast .light{font-size:10px;padding:7px}.layout{display:block;position:relative;min-height:0;background:var(--paper)}.left-column{height:100%;display:grid;grid-template-rows:minmax(230px,42%) 1fr}.map-heading{height:37px;padding:0 10px}.map-heading small{display:none}.map-card{width:128px;min-height:74px;padding:9px}.map-controls{bottom:8px;right:8px}.zoom-label{bottom:8px;left:8px}.work-panel{grid-template-rows:36px 1fr 44px}.work-heading{height:36px;padding:0 10px}.work-heading small{display:none}.submission-dock>summary{height:43px;padding:0 12px}.submission-dock>summary span{display:grid;gap:0}.tab{padding:0 12px;font-size:12px}.composer{padding-inline:9px}.messages{padding:9px}.message{max-width:88%}.roster{display:block;position:absolute;z-index:8;left:0;right:0;bottom:0;height:min(62%,430px);background:var(--paper);transform:translateY(calc(100% - 42px));transition:transform .25s ease;box-shadow:0 -12px 30px rgba(20,45,36,.2)}.roster.open{transform:translateY(0)}.drawer-handle{height:42px;width:100%;border:0;border-bottom:1px solid var(--line);background:#fff;display:flex;align-items:center;justify-content:center;gap:12px;position:relative}.drawer-handle span{position:absolute;top:5px;width:34px;height:3px;background:#bdc5c0;border-radius:3px}.drawer-handle small{color:#748079}.roster-head{display:none}.card-list{height:calc(100% - 42px)}.submit-pane{padding:12px}.assignment-intro{display:block}.entry{padding:16px}.entry-card{padding:30px 23px;box-shadow:9px 9px 0 #0e2a21}.entry h1{font-size:40px}}
@media(max-height:620px) and (max-width:760px){.left-column{grid-template-rows:40% 60%}.map-heading{display:none}.map-panel{grid-template-rows:1fr}.topbar{height:48px}.app{grid-template-rows:48px auto 1fr}}
