*{box-sizing:border-box}:root{--border: #e3e6ec;--muted: #6b7280;--bg: #f4f6fb;--card: #ffffff;--primary: #4f7cff}html,body,#root{height:100%;margin:0}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Microsoft YaHei,Roboto,Helvetica,Arial,sans-serif;background:var(--bg);color:#1f2430}.app{min-height:100%;display:flex;flex-direction:column}.app-header{display:flex;align-items:center;justify-content:space-between;padding:12px 20px;background:var(--card);border-bottom:1px solid var(--border);position:sticky;top:0;z-index:10}.brand{font-weight:700;font-size:18px}.app-header nav a{margin-left:16px;text-decoration:none;color:var(--muted);font-weight:600;padding:6px 10px;border-radius:8px}.app-header nav a.active{color:var(--primary);background:#eef3ff}.app-main{flex:1;padding:20px}.page{max-width:1100px;margin:0 auto}.notice,.gate{max-width:520px;margin:60px auto;background:var(--card);border:1px solid var(--border);border-radius:12px;padding:28px;text-align:center;color:var(--muted);line-height:1.7}.notice code{background:#f0f2f7;padding:1px 6px;border-radius:5px}.page-toolbar{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:12px;margin-bottom:12px}.page-toolbar.admin{flex-direction:column;align-items:stretch}.week-nav{display:flex;align-items:center;gap:12px}.week-label{font-weight:700;font-size:16px}.toolbar-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.hint{color:var(--muted);font-size:13px;margin:0 0 12px}.save-indicator{font-size:13px;color:var(--muted);min-width:66px}.save-indicator.saved{color:#2f9e44}.save-indicator.error{color:#e03131}.btn{border:1px solid var(--border);background:var(--card);color:#1f2430;padding:8px 14px;border-radius:9px;font-size:14px;font-weight:600;cursor:pointer;transition:background .15s,border-color .15s}.btn:hover{background:#f7f9fd}.btn:disabled{opacity:.6;cursor:default}.btn.primary{background:var(--primary);border-color:var(--primary);color:#fff}.btn.primary:hover{background:#3f6bef}.btn.publish{background:#2f9e44;border-color:#2f9e44;color:#fff}.btn.publish:hover{background:#2b8f3d}.btn.danger{background:#fff0f0;border-color:#ffc9c9;color:#e03131}.grid-wrap{background:var(--card);border:1px solid var(--border);border-radius:12px;overflow:hidden}.grid{display:grid;grid-template-columns:56px repeat(7,1fr);grid-auto-rows:min-content}.grid-corner{height:var(--header-h);border-bottom:1px solid var(--border);border-right:1px solid var(--border)}.grid-dayhead{height:var(--header-h);line-height:var(--header-h);text-align:center;white-space:nowrap;border-bottom:1px solid var(--border);border-right:1px solid var(--border);background:#fafbfe}.grid-dayhead:last-child{border-right:none}.dayhead-name{font-weight:700;font-size:14px}.dayhead-date{font-size:12px;color:var(--muted);margin-left:6px}.grid-timeaxis{position:relative;border-right:1px solid var(--border)}.tick{position:absolute;right:6px;transform:translateY(-50%);font-size:11px;color:var(--muted)}.grid-daycol{position:relative;border-right:1px solid var(--border)}.grid-daycol:last-child{border-right:none}.hline{position:absolute;left:0;right:0;border-top:1px solid #f0f2f7}.course{position:absolute;border-radius:7px;padding:4px 6px;color:#fff;overflow:hidden;box-shadow:0 1px 3px #00000026;font-size:12px;line-height:1.25}.course.editable{cursor:pointer}.course.editable:hover{filter:brightness(1.06);box-shadow:0 2px 8px #00000040}.course-title{font-weight:700;line-height:1.2;white-space:normal;overflow-wrap:break-word;word-break:break-word}.course-time{opacity:.9;font-size:11px}.course-meta{opacity:.9;font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.grid-empty{text-align:center;color:var(--muted);padding:24px}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:#14182273;display:flex;align-items:center;justify-content:center;z-index:50;padding:16px}.modal{background:var(--card);border-radius:14px;padding:22px;width:100%;max-width:420px;display:flex;flex-direction:column;gap:12px;box-shadow:0 12px 40px #00000040}.modal h3{margin:0 0 4px}.modal label{display:flex;flex-direction:column;gap:5px;font-size:13px;font-weight:600;color:#374151}.modal input,.modal select{padding:8px 10px;border:1px solid var(--border);border-radius:8px;font-size:14px;font-weight:400}.modal .row{display:flex;gap:12px}.modal .row label{flex:1}.color-picker{display:flex;gap:8px;flex-wrap:wrap}.swatch{width:26px;height:26px;border-radius:50%;border:2px solid transparent;cursor:pointer}.swatch.active{border-color:#1f2430;transform:scale(1.12)}.form-error{color:#e03131;font-size:13px}.modal-actions{display:flex;align-items:center;gap:8px;margin-top:6px}.modal-actions .spacer{flex:1}.gate{display:flex;flex-direction:column;gap:14px;align-items:stretch}.gate h2{margin:0;text-align:center}.gate input{padding:10px 12px;border:1px solid var(--border);border-radius:9px;font-size:15px}@media(max-width:640px){.grid-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch}.grid{min-width:640px;grid-template-columns:46px repeat(7,minmax(82px,1fr))}.course{font-size:11px;padding:3px 4px}.toolbar-actions{justify-content:flex-start}.page-toolbar .week-label{font-size:15px}}.agenda{display:flex;flex-direction:column;gap:14px}.agenda-day{background:var(--card);border:1px solid var(--border);border-radius:12px;overflow:hidden}.agenda-dayhead{display:flex;align-items:baseline;gap:10px;padding:10px 14px;background:#fafbfe;border-bottom:1px solid var(--border)}.agenda-dayname{font-weight:700;font-size:15px}.agenda-daydate{font-size:13px;color:var(--muted)}.agenda-empty{padding:12px 14px;color:var(--muted);font-size:13px}.agenda-list{list-style:none;margin:0;padding:8px;display:flex;flex-direction:column;gap:8px}.agenda-item{display:flex;gap:12px;align-items:stretch;padding:10px 12px;border-radius:9px;background:#f7f9fd;border-left:5px solid #4f7cff}.agenda-time{flex-shrink:0;width:46px;font-size:13px;font-weight:700;color:#374151;line-height:1.3;font-variant-numeric:tabular-nums}.agenda-body{min-width:0}.agenda-title{font-weight:700;font-size:15px}.agenda-meta{display:flex;flex-wrap:wrap;gap:10px;margin-top:3px;font-size:12px;color:var(--muted)}.agenda-none{text-align:center;color:var(--muted);padding:30px}.view-toggle{flex-shrink:0}.course-lock{position:absolute;top:3px;right:4px;font-size:11px;opacity:.95}.viewer-badge{font-size:13px;font-weight:600;color:#374151;background:#eef3ff;padding:6px 10px;border-radius:8px}.visibility{font-weight:400;display:flex;flex-direction:column;gap:8px}.vis-opt{display:flex;align-items:center;gap:8px;font-weight:400;cursor:pointer}.vis-opt input{width:auto}.vis-groups{display:flex;flex-direction:column;gap:6px;padding-left:2px}.vis-groups-label,.vis-hint{font-size:12px;color:var(--muted)}.modal.small{max-width:360px}.modal.wide{max-width:560px;max-height:86vh;overflow-y:auto}.am-section{border-top:1px solid var(--border);padding-top:12px}.am-section h4{margin:0 0 8px}.am-add{display:flex;gap:8px}.am-add input{flex:1;padding:8px 10px;border:1px solid var(--border);border-radius:8px}.am-grouplist{display:flex;flex-direction:column;gap:6px;margin-top:8px}.am-grouprow{display:flex;gap:8px;align-items:center}.am-grouprow input{flex:1;padding:7px 10px;border:1px solid var(--border);border-radius:8px}.am-userlist{display:flex;flex-direction:column;gap:10px;margin-bottom:10px}.am-userrow{border:1px solid var(--border);border-radius:10px;padding:10px;display:flex;flex-direction:column;gap:8px;background:#fafbfe}.am-userfields{display:flex;gap:8px}.am-userfields input{flex:1;padding:7px 10px;border:1px solid var(--border);border-radius:8px}.am-usergroups{display:flex;flex-wrap:wrap;gap:8px}.chip{display:inline-flex;align-items:center;gap:5px;font-size:13px;background:#fff;border:1px solid var(--border);padding:4px 9px;border-radius:999px;cursor:pointer}.chip input{width:auto}.btn.sm{padding:5px 10px;font-size:13px}.tpl-picker{display:flex;flex-direction:column;gap:6px}.tpl-picker-label{font-size:12px;color:var(--muted)}.tpl-chips{display:flex;flex-wrap:wrap;gap:8px}.tpl-chip{display:inline-flex;align-items:center;gap:6px;background:#fff;border:1.5px solid var(--border);border-radius:999px;padding:5px 12px;font-size:13px;font-weight:600;cursor:pointer}.tpl-chip:hover{background:#f7f9fd}.tpl-dot{width:10px;height:10px;border-radius:50%;display:inline-block}.tm-list{display:flex;flex-direction:column;gap:10px;margin-bottom:10px}.tm-row{border:1px solid var(--border);border-radius:10px;padding:10px;background:#fafbfe;display:flex;flex-direction:column;gap:8px}.tm-fields{display:flex;gap:8px;flex-wrap:wrap}.tm-fields input{flex:1;min-width:120px;padding:7px 10px;border:1px solid var(--border);border-radius:8px}.tm-meta{display:flex;flex-wrap:wrap;align-items:center;gap:12px}.tm-vis{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.modal.export{max-width:540px}.exp-controls{display:flex;flex-wrap:wrap;gap:18px;align-items:center}.exp-field{display:flex;align-items:center;gap:8px}.exp-label{font-size:13px;font-weight:600;color:#374151}.exp-field select{padding:7px 10px;border:1px solid var(--border);border-radius:8px;font-size:14px}.seg{display:inline-flex;border:1px solid var(--border);border-radius:9px;overflow:hidden}.seg-btn{border:none;background:#fff;padding:7px 14px;font-size:13px;font-weight:600;cursor:pointer;color:#374151}.seg-btn.active{background:var(--primary);color:#fff}.exp-preview{margin:4px auto 0;overflow:hidden;border-radius:10px;border:1px solid var(--border);background:#0b0b0d}.exp-scaler{transform-origin:top left}.cap-plain{background:#fff;padding:16px}.cap-note{background:#fff8e6;border:1px solid #ffe08a;color:#6b4e00;border-radius:10px;padding:12px 16px;margin-bottom:14px;font-size:15px;line-height:1.55;white-space:pre-wrap}.poster{background:#0b0b0d}.poster-frame{background:radial-gradient(120% 80% at 50% -10%,rgba(212,175,55,.18),transparent 60%),linear-gradient(160deg,#16140d,#0b0b0d 55%,#0e0d0b);border:2px solid #d4af37;border-radius:16px;padding:34px 34px 30px;color:#f6efd8;font-family:Georgia,Times New Roman,Songti SC,SimSun,serif;box-shadow:inset 0 0 60px #d4af370f}.poster-head{text-align:center}.poster-brand{font-size:46px;font-weight:700;letter-spacing:2px;color:#ecd98f;line-height:1.1;margin-bottom:10px;text-shadow:0 1px 0 rgba(0,0,0,.5),0 0 20px rgba(212,175,55,.28)}.poster-title{font-size:30px;font-weight:700;letter-spacing:3px;color:#cdb96e}.poster-range{margin-top:6px;font-size:17px;color:#cdb96e;letter-spacing:1px}.poster-overview{margin-top:4px;font-size:15px;color:#9a8f6b}.poster-audience{display:block;box-sizing:border-box;width:auto;max-width:600px;margin:12px auto 0;padding:8px 22px;text-align:center;font-size:14px;color:#0b0b0d;font-weight:700;line-height:1.4;background:linear-gradient(180deg,#f2dd94,#d4af37);border-radius:9px;white-space:normal;overflow-wrap:break-word;word-break:break-word}.poster-rule{height:1px;margin:16px 0;background:linear-gradient(90deg,transparent,rgba(212,175,55,.7),transparent)}.poster-grid{display:grid}.pg-corner{border-bottom:1px solid rgba(212,175,55,.35);border-right:1px solid rgba(212,175,55,.18)}.pg-dayhead{text-align:center;white-space:nowrap;border-bottom:1px solid rgba(212,175,55,.35);border-right:1px solid rgba(212,175,55,.12)}.pg-dayhead:last-child{border-right:none}.pg-dayname{font-size:15px;font-weight:700;color:#e9d79a;letter-spacing:1px}.pg-daydate{font-size:12px;color:#a99a63;margin-left:7px}.pg-axis{position:relative;border-right:1px solid rgba(212,175,55,.18)}.pg-tick{position:absolute;right:8px;transform:translateY(-50%);font-size:11px;color:#8f8256}.pg-daycol{position:relative;border-right:1px solid rgba(212,175,55,.1)}.pg-daycol:last-child{border-right:none}.pg-hline{position:absolute;left:0;right:0;border-top:1px solid rgba(212,175,55,.08)}.pg-course{position:absolute;border-radius:8px;padding:6px 9px;overflow:visible;background:linear-gradient(160deg,#262216f5,#181610f5);border:1px solid rgba(212,175,55,.3);border-left:4px solid #d4af37;box-shadow:0 2px 10px #0006;color:#f6efd8}.pg-course-title{font-weight:700;font-size:13px;color:#f7e8b0;line-height:1.2;white-space:normal;overflow-wrap:break-word;word-break:break-word;padding-right:12px}.pg-course-lock{position:absolute;top:3px;right:4px;font-size:11px;line-height:1}.pg-course-time{font-size:11px;color:#c9b978;margin-top:1px}.pg-course-meta{font-size:11px;color:#9a8f6b;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.poster-summary{margin-top:4px}.poster-summary-title{text-align:center;font-size:14px;letter-spacing:3px;color:#cdb96e;margin-bottom:12px}.poster-chips{display:flex;flex-wrap:wrap;justify-content:center;gap:12px}.poster-chip{display:inline-flex;align-items:center;gap:9px;border:1px solid rgba(212,175,55,.4);border-radius:999px;padding:8px 16px;background:#d4af370d;white-space:nowrap;max-width:100%}.poster-chip-dot{flex-shrink:0;width:11px;height:11px;border-radius:50%;box-shadow:0 0 6px #00000080}.poster-chip-name{font-weight:700;color:#f7e8b0;font-size:14px;white-space:nowrap}.poster-chip-stat{color:#b7a86e;font-size:13px;white-space:nowrap}.poster-empty{text-align:center;color:#8f8256;padding:30px;font-size:15px}.note-edit{display:flex;flex-direction:column;gap:6px;margin:0 0 14px}.note-edit label{font-size:13px;font-weight:700;color:#374151}.note-edit textarea{width:100%;resize:vertical;padding:10px 12px;font-size:14px;line-height:1.5;border:1px solid var(--border);border-radius:10px;font-family:inherit}.note-banner{background:#fff8e6;border:1px solid #ffe08a;color:#6b4e00;border-radius:10px;padding:10px 14px;margin:0 0 12px;font-size:14px;line-height:1.55;white-space:pre-wrap}.poster-note{display:flex;align-items:flex-start;gap:10px;justify-content:center;margin:14px auto 0;max-width:760px;text-align:left}.poster-note-tag{flex-shrink:0;font-size:12px;letter-spacing:2px;color:#0b0b0d;background:linear-gradient(180deg,#f2dd94,#d4af37);border-radius:5px;padding:3px 9px;font-weight:700;margin-top:2px}.poster-note-text{color:#e7dcb4;font-size:15px;line-height:1.6;font-style:italic;white-space:pre-wrap}
