/* ============================================
   DWS Scheduler — Studio Editorial (Light)
   ============================================ */

@keyframes fadeIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
@keyframes slideIn{from{opacity:0;transform:translateX(-12px)}to{opacity:1;transform:none}}
@keyframes pulseDot{0%,100%{box-shadow:0 0 0 0 var(--teal-glow),0 0 12px var(--teal-glow);}50%{box-shadow:0 0 0 8px transparent,0 0 12px var(--teal-glow);}}
@keyframes breathe{0%,100%{opacity:1;}50%{opacity:0.5;}}
@keyframes statusPulse{0%,100%{opacity:1;}50%{opacity:0.45;}}
@keyframes toastIn{from{opacity:0;transform:translateX(20px);}to{opacity:1;transform:none;}}
@keyframes toastOut{to{opacity:0;transform:translateX(20px);}}
@keyframes shimmer{0%{background-position:-1000px 0;}100%{background-position:1000px 0;}}
@keyframes phEyebrowIn{from{opacity:0;transform:translateY(8px);}to{opacity:1;transform:none;}}
@keyframes phLetterIn{from{opacity:0;transform:translateY(28px) rotateX(-40deg);}to{opacity:1;transform:none;}}
@keyframes phDisplayIn{from{opacity:0;transform:translateY(12px);letter-spacing:6px;}to{opacity:1;transform:none;letter-spacing:1px;}}
@keyframes phMetaIn{from{opacity:0;transform:translateY(6px);}to{opacity:1;transform:none;}}
@keyframes drawLine{from{transform:scaleX(0);}to{transform:scaleX(1);}}
@keyframes panelEnter{from{opacity:0;transform:translateY(16px);}to{opacity:1;transform:none;}}
@keyframes cellWave{from{opacity:0;transform:translateY(4px);}to{opacity:1;transform:none;}}
@keyframes rotateSlow{from{transform:rotate(0deg);}to{transform:rotate(360deg);}}
@keyframes dayCharDrop{0%{transform:translateY(-28px) scale(0.65) rotateX(55deg);opacity:0;}60%{transform:translateY(3px) scale(1.06) rotateX(0);opacity:1;}80%{transform:translateY(-1px) scale(1.01);}100%{transform:translateY(0) scale(1);opacity:1;}}
@keyframes dayDateAppear{from{transform:translateY(-6px);opacity:0;}to{transform:translateY(0);opacity:1;}}
@keyframes periodLabelFade{from{opacity:0;letter-spacing:14px;}to{opacity:1;letter-spacing:5px;}}
@keyframes ruleDrawCenter{from{transform:scaleX(0);}to{transform:scaleX(1);}}

:root{
  /* surfaces */
  --bg:#f6f6f3;
  --surface:#ffffff;
  --surface2:#f0efe9;
  --surface3:#e8e5dd;

  /* hairline borders */
  --border:#e0ddd5;
  --border-light:#ecebe5;
  --border-strong:#c8c4ba;

  /* text */
  --text:#14110f;
  --text2:#6b6660;
  --text3:#a39d94;
  --text4:#c8c2b9;
  --ink:#14110f;

  /* accents */
  --teal:#4a8a8a;
  --teal-bright:#5ba8a8;
  --teal-glow:rgba(74,138,138,0.2);
  --teal-soft:rgba(74,138,138,0.06);
  --indigo:#5a7d99;
  --indigo-soft:rgba(90,125,153,0.08);
  --vermillion:#c47967;
  --vermillion-soft:rgba(196,121,103,0.08);
  --sage:#7a8e6e;
  --sage-soft:rgba(122,142,110,0.08);

  --blocked:#f3ebe8;
  --grid-empty:#ffffff;
  --period-band:rgba(20,17,15,0.022);
  --period-band-deep:rgba(20,17,15,0.04);

  --radius:4px;
  --radius-lg:6px;

  --shadow-sm:0 1px 2px rgba(20,17,15,0.04);
  --shadow-md:0 12px 40px rgba(20,17,15,0.1);

  --font-display:'Noto Serif SC',serif;
  --font-body:'Noto Sans SC',sans-serif;
  --font-mono:'JetBrains Mono',monospace;

  --ease:cubic-bezier(0.4,0,0.2,1);
  --t-fast:160ms;
  --t-med:280ms;
}
*{margin:0;padding:0;box-sizing:border-box;}
body{font-family:var(--font-body);background:var(--bg);color:var(--text);min-height:100vh;-webkit-font-smoothing:antialiased;font-weight:400;letter-spacing:0.015em;line-height:1.6;padding-left:48px;}

/* ===== Vertical rail — left structural element ===== */
.rail{position:fixed;top:0;left:0;width:48px;height:100vh;background:var(--bg);border-right:1px solid var(--border);display:flex;flex-direction:column;align-items:center;justify-content:space-between;padding:24px 0;z-index:40;font-family:var(--font-mono);}
.rail-top,.rail-bot{flex:0 0 auto;display:flex;align-items:center;justify-content:center;}
.rail-mid{flex:1;display:flex;align-items:center;justify-content:center;min-height:0;}
.rail-dot{width:8px;height:8px;background:var(--teal);border-radius:50%;box-shadow:0 0 0 0 var(--teal-glow),0 0 12px var(--teal-glow);animation:pulseDot 2.4s ease-in-out infinite;}
.rail-text{writing-mode:vertical-rl;transform:rotate(180deg);font-size:10px;letter-spacing:6px;color:var(--text2);text-transform:uppercase;font-weight:500;white-space:nowrap;transition:opacity 0.4s var(--ease);}
.rail-foot{font-size:8px;letter-spacing:2px;color:var(--text4);text-transform:uppercase;writing-mode:vertical-rl;transform:rotate(180deg);white-space:nowrap;}

/* Architectural grid backdrop — fine 80px gridlines, very subtle */
body::before{content:'';position:fixed;inset:0;pointer-events:none;z-index:-1;opacity:0.5;background-image:linear-gradient(to right,rgba(20,17,15,0.022) 1px,transparent 1px),linear-gradient(to bottom,rgba(20,17,15,0.022) 1px,transparent 1px);background-size:80px 80px;}

.app{padding:0 32px 100px;}
/* All content aligns to the same 1440 frame — single composition, no rogue bleed */
.topbar{max-width:1440px;margin-left:auto;margin-right:auto;}
.panel>*{max-width:1440px;margin-left:auto;margin-right:auto;}
.footer-actions{max-width:1440px;margin-left:auto;margin-right:auto;}

/* ===== Topbar — minimal hairline ===== */
.topbar{display:flex;align-items:center;justify-content:space-between;padding:18px 0;border-bottom:1px solid var(--border);margin-bottom:0;background:transparent;}
.topbar-left{display:flex;align-items:center;gap:0;}
.topbar-logo-icon{height:28px;width:auto;margin-right:14px;display:block;}
.topbar-logo{font-family:var(--font-display);font-size:13px;font-weight:500;letter-spacing:8px;color:var(--text);padding-right:24px;text-transform:uppercase;}
.topbar-divider{width:1px;height:18px;background:var(--border);margin-right:8px;}
.topbar-nav{display:flex;gap:0;}
.topbar-right{display:flex;align-items:center;gap:16px;}

/* ===== Tabs ===== */
.topbar-nav{counter-reset:tabnum;}
.tab{position:relative;counter-increment:tabnum;padding:10px 16px;border:none;background:none;cursor:pointer;font-family:var(--font-body);font-size:11px;font-weight:500;color:var(--text3);letter-spacing:1.5px;white-space:nowrap;text-transform:uppercase;transition:color var(--t-fast) var(--ease);}
.tab::before{content:counter(tabnum,decimal-leading-zero);font-family:var(--font-mono);font-size:9px;color:var(--text4);margin-right:8px;letter-spacing:0;font-weight:400;transition:color var(--t-fast) var(--ease);}
.tab:hover{color:var(--text2);}
.tab:hover::before{color:var(--text3);}
.tab.active{color:var(--text);font-weight:600;}
.tab.active::before{color:var(--teal);}
.tab::after{content:'';position:absolute;left:50%;bottom:-1px;width:0;height:1px;background:var(--teal);transform:translateX(-50%);transition:width var(--t-med) var(--ease);}
.tab.active::after{width:60%;}

/* ===== Page header — 12-col asymmetric editorial grid ===== */
.page-header{padding:36px 0 22px;margin-bottom:20px;display:grid;grid-template-columns:repeat(12,1fr);gap:0 16px;position:relative;overflow:hidden;}
.page-header::before{content:attr(data-num);position:absolute;top:-32px;right:-12px;font-family:var(--font-display);font-size:clamp(180px,22vw,360px);font-weight:600;color:var(--text);opacity:0.025;pointer-events:none;z-index:0;letter-spacing:-12px;line-height:1;font-feature-settings:"tnum";}
.page-header>*{position:relative;z-index:1;}
.page-header::after{content:'';position:absolute;left:0;right:0;bottom:-1px;height:1px;background:var(--border);transform-origin:left;animation:drawLine 0.8s var(--ease) backwards;animation-delay:0.45s;}
.ph-eyebrow{grid-column:1/5;grid-row:1;font-family:var(--font-mono);font-size:10px;letter-spacing:3px;color:var(--text3);text-transform:uppercase;display:flex;align-items:center;gap:10px;animation:phEyebrowIn 0.5s var(--ease) backwards;animation-delay:0.05s;}
.ph-eyebrow::before{content:'◇';color:var(--teal);font-size:11px;display:inline-block;animation:rotateSlow 14s linear infinite;}
.ph-title{grid-column:1/8;grid-row:2;font-family:var(--font-display);font-size:clamp(36px,4vw,64px);font-weight:600;letter-spacing:clamp(4px,0.5vw,8px);color:var(--text);line-height:1;margin:18px 0 0;perspective:600px;}
.ph-title-letter{display:inline-block;animation:phLetterIn 0.6s var(--ease) backwards;}
.ph-display{grid-column:8/13;grid-row:1/3;display:flex;flex-direction:column;align-items:flex-end;justify-content:flex-end;gap:6px;font-family:var(--font-mono);align-self:end;justify-self:end;text-align:right;line-height:1;animation:phDisplayIn 0.7s var(--ease) backwards;animation-delay:0.3s;}
.ph-d-month{font-size:clamp(10px,0.85vw,13px);letter-spacing:6px;color:var(--text3);text-transform:uppercase;font-weight:500;}
.ph-d-range{font-size:clamp(56px,8vw,128px);font-weight:500;line-height:0.85;letter-spacing:-2px;color:var(--text);font-feature-settings:"tnum";white-space:nowrap;}
.page-header.no-display .ph-display{display:none;}
.page-header.no-display .ph-title{grid-column:1/13;}
.ph-meta{grid-column:1/13;grid-row:3;font-family:var(--font-mono);font-size:11px;color:var(--text3);letter-spacing:2px;text-transform:uppercase;margin-top:18px;animation:phMetaIn 0.5s var(--ease) backwards;animation-delay:0.4s;}
.ph-meta b{font-weight:600;color:var(--text2);}

/* ===== Panels ===== */
.panel{display:none;}
.panel.active{display:block;animation:panelEnter 0.5s var(--ease);}

/* ===== Schedule layout — wider than page-header for editorial offset ===== */
.sched-layout{display:grid;grid-template-columns:1fr 260px;gap:40px;align-items:start;}
.sched-main{min-width:0;}
.sched-side{display:flex;flex-direction:column;gap:32px;position:sticky;top:24px;}
.side-card{background:transparent;border:none;padding:0;border-top:1px solid var(--border);padding-top:18px;}
.side-card:first-child{border-top:none;padding-top:0;}
.side-card-title{font-family:var(--font-mono);font-size:10px;font-weight:500;color:var(--text3);letter-spacing:3px;text-transform:uppercase;margin-bottom:14px;display:flex;align-items:center;gap:10px;}
.side-card-title::after{content:'';flex:1;height:1px;background:var(--border-light);}

/* ===== Login (gallery hero) ===== */
.login-container{max-width:440px;margin:120px auto 60px;padding:0 24px;animation:fadeIn 0.6s var(--ease);}
.login-card{position:relative;background:transparent;border:none;padding:0;text-align:center;}
.login-card::before{content:'';position:absolute;left:50%;top:0;width:380px;height:380px;transform:translate(-50%,-30%);background:radial-gradient(circle,var(--teal-glow) 0%,transparent 65%);pointer-events:none;z-index:0;filter:blur(40px);opacity:0.6;}
.login-logo{display:block;width:300px;max-width:80%;height:auto;margin:0 auto 48px;position:relative;z-index:1;transition:transform 0.7s var(--ease);}
.login-card:hover .login-logo{transform:translateY(-3px);}
.login-canvas{display:block;width:240px;height:240px;margin:0 auto 14px;cursor:grab;position:relative;z-index:1;}
.login-canvas:active{cursor:grabbing;}
.login-brand{position:relative;z-index:1;margin-bottom:48px;animation:fadeIn 0.6s var(--ease) backwards;animation-delay:0.3s;}
.login-zh{font-family:var(--font-display);font-size:18px;font-weight:600;letter-spacing:8px;color:var(--text);margin-bottom:6px;}
.login-en{font-family:var(--font-mono);font-size:10px;letter-spacing:4px;color:var(--text3);text-transform:uppercase;}
.login-sub{position:relative;z-index:1;font-family:var(--font-mono);font-size:10px;color:var(--text3);letter-spacing:6px;margin-bottom:40px;text-transform:uppercase;}
.login-card .login-err{position:relative;z-index:1;color:var(--vermillion);font-size:12px;margin-bottom:14px;min-height:18px;}
.login-card input{display:block;width:100%;padding:14px 18px;border:1px solid var(--border);background:var(--surface);font-family:var(--font-mono);font-size:13px;margin-bottom:14px;text-align:center;letter-spacing:2px;color:var(--text);transition:border-color var(--t-med) var(--ease),box-shadow var(--t-med) var(--ease);border-radius:var(--radius);position:relative;z-index:1;}
.login-card input::placeholder{color:var(--text4);letter-spacing:1px;}
.login-card input:focus{border-color:var(--teal);outline:none;box-shadow:0 0 0 4px var(--teal-soft);}

.role-tag{display:inline-block;padding:1px 8px;font-size:9px;font-weight:600;letter-spacing:2px;margin-left:8px;border:1px solid;border-radius:2px;text-transform:uppercase;font-family:var(--font-mono);}
.role-admin{color:var(--vermillion);border-color:var(--vermillion);}
.role-student{color:var(--teal);border-color:var(--teal);}

/* ===== Buttons ===== */
.btn{padding:10px 22px;border:1px solid var(--border);background:var(--surface);cursor:pointer;font-family:var(--font-body);font-size:11px;font-weight:500;color:var(--text2);letter-spacing:1.2px;border-radius:var(--radius);text-transform:uppercase;transition:all var(--t-fast) var(--ease),transform 0.25s var(--ease);}
.btn:hover{background:var(--surface2);color:var(--text);border-color:var(--border-strong);}
.btn-primary,.btn-accent{transform:translate(var(--mx,0px),var(--my,0px));}
.btn-primary:active,.btn-accent:active{transform:translate(var(--mx,0px),var(--my,0px)) scale(0.97);}
.btn:not(.btn-primary):not(.btn-accent):active{transform:scale(0.97);}
.btn-primary{background:var(--ink);color:var(--bg);border-color:var(--ink);font-weight:600;letter-spacing:2px;}
.btn-primary:hover{background:#000;color:var(--bg);border-color:#000;}
.btn-accent{background:var(--teal);color:#fff;border-color:var(--teal);font-weight:600;}
.btn-accent:hover{background:var(--teal-bright);border-color:var(--teal-bright);box-shadow:0 0 24px var(--teal-glow);}
.btn-danger{color:var(--vermillion);border-color:var(--vermillion);background:transparent;}
.btn-danger:hover{background:var(--vermillion-soft);}
.btn-ghost{border-color:transparent;color:var(--text3);background:transparent;}
.btn-ghost:hover{background:var(--surface2);color:var(--text);border-color:transparent;}

/* ===== Week bar ===== */
.week-bar{display:flex;align-items:center;justify-content:flex-start;gap:10px;margin-bottom:14px;flex-wrap:wrap;padding-bottom:10px;}
.week-bar label{font-family:var(--font-mono);font-size:9px;color:var(--text3);font-weight:500;letter-spacing:2px;text-transform:uppercase;}
.week-bar select,.week-bar input{padding:8px 12px;border:1px solid var(--border);font-family:var(--font-body);font-size:12px;background:var(--surface);color:var(--text);border-radius:var(--radius);}
.week-bar input:focus,.week-bar select:focus{border-color:var(--teal);outline:none;box-shadow:0 0 0 3px var(--teal-soft);}
.week-bar input[type="number"]{width:74px;text-align:center;font-family:var(--font-mono);}
.week-bar input[type="date"]{width:148px;font-family:var(--font-mono);letter-spacing:0;color:var(--text);}
.week-bar .week-title{margin:0 auto;font-size:12px;color:var(--text3);letter-spacing:2px;}
.week-title{display:none;}

/* ===== Schedule grid — with period rail on left ===== */
.sched-grid{display:grid;gap:0;font-size:11px;grid-template-columns:36px 64px repeat(7,1fr);grid-template-rows:auto;grid-auto-rows:24px;background:var(--surface);border:1px solid var(--border);overflow:hidden;border-radius:var(--radius);position:relative;}
.period-label{grid-column:1;display:flex;align-items:center;justify-content:center;writing-mode:vertical-rl;font-family:var(--font-mono);font-size:9px;letter-spacing:3px;line-height:1;color:var(--text3);text-transform:uppercase;border-right:1px solid var(--border);background:var(--surface);font-weight:500;padding:6px 0;overflow:hidden;min-height:0;}
.period-corner{grid-column:1;border-right:1px solid var(--border);background:var(--surface2);border-bottom:1px solid var(--border);}
.sched-header{text-align:center;padding:22px 2px 16px;font-weight:500;font-size:10px;background:var(--surface);border-bottom:1px solid var(--border);position:relative;}
.sched-header .day-name{font-family:var(--font-display);font-size:32px;color:var(--text);letter-spacing:0;font-weight:600;line-height:1;}
.sched-header .day-date{font-size:10px;color:var(--text3);font-family:var(--font-mono);margin-top:12px;letter-spacing:1.5px;}
.sched-header.today{background:var(--surface);box-shadow:inset 1px 0 0 rgba(196,121,103,0.4),inset -1px 0 0 rgba(196,121,103,0.4);}
.sched-header.today::before{content:'';position:absolute;top:0;left:0;right:0;height:2px;background:var(--vermillion);}
.sched-header.today .day-name{color:var(--vermillion);}
.sched-header.today .day-date{color:var(--vermillion);font-weight:700;}
.sched-time{font-size:8px;color:var(--text3);text-align:center;line-height:24px;font-family:var(--font-mono);background:var(--surface);border-right:1px solid var(--border);border-bottom:1px solid var(--border-light);letter-spacing:0.5px;font-weight:400;}
.sched-time.hour-mark{color:var(--text);font-weight:600;font-size:11px;border-top:1px solid var(--border);}
.sched-cell{height:24px;background:var(--surface);border-bottom:1px solid var(--border-light);border-right:1px solid var(--border-light);transition:background var(--t-fast) var(--ease);}
.sched-grid.is-revealing .sched-cell{animation:cellWave 0.45s var(--ease) backwards;animation-delay:var(--wave-delay,0ms);}
.sched-grid.is-revealing .period-label{animation:periodLabelFade 0.55s var(--ease) backwards;animation-delay:calc(var(--period-i,0) * 80ms + 120ms);}
.cp-rule{transform-origin:center;animation:ruleDrawCenter 0.7s var(--ease);}
.sched-cell.hour-top{border-top:1px solid var(--border-light);}
.sched-cell.blocked{background:repeating-linear-gradient(135deg,rgba(196,121,103,0.18) 0,rgba(196,121,103,0.18) 1px,transparent 1px,transparent 6px),var(--blocked);}
.sched-cell.today-col{background:rgba(196,121,103,0.04)!important;box-shadow:inset 1px 0 0 rgba(196,121,103,0.35),inset -1px 0 0 rgba(196,121,103,0.35);position:relative;z-index:1;}
/* Today + blocked: show BOTH the today tint AND the blocked diagonal stripes */
.sched-cell.today-col.blocked{background:repeating-linear-gradient(135deg,rgba(196,121,103,0.38) 0,rgba(196,121,103,0.38) 1.5px,transparent 1.5px,transparent 6px),rgba(196,121,103,0.1)!important;}
.sched-cell:not(.assigned):not(.blocked){cursor:pointer;}
.sched-cell:not(.assigned):not(.blocked):hover{background:var(--surface2)!important;}
/* Row + column subtle highlight on hover — spreadsheet UX */
.sched-cell.row-hover:not(.assigned):not(.blocked):not(:hover){background-color:rgba(20,17,15,0.018);}
.sched-cell.col-hover:not(.assigned):not(.blocked):not(:hover){background-color:rgba(20,17,15,0.018);}
.sched-cell.row-hover.col-hover:not(.assigned):not(.blocked):not(:hover){background-color:rgba(20,17,15,0.032);}
.sched-time.time-hover{color:var(--text)!important;}

/* Period bands — horizontal rhythm */
.sched-time.period-ea,.sched-cell:not(.blocked):not(.today-col).period-ea{background-color:var(--period-band);}
.sched-time.period-ee,.sched-cell:not(.blocked):not(.today-col).period-ee{background-color:var(--period-band);}
.sched-time.period-le,.sched-cell:not(.blocked):not(.today-col).period-le{background-color:var(--period-band-deep);}

/* Assigned blocks */
.sched-cell.assigned{display:flex;align-items:center;justify-content:center;font-weight:500;font-size:10px;color:#fff;border:none;letter-spacing:0.5px;cursor:grab;transition:filter var(--t-fast) var(--ease),box-shadow var(--t-fast) var(--ease);position:relative;font-family:var(--font-body);}
.sched-cell.assigned:active{cursor:grabbing;}
.sched-cell.assigned.start{border-radius:3px 3px 0 0;box-shadow:inset 0 1px 0 rgba(255,255,255,0.18),inset 0 0 0 1px rgba(0,0,0,0.06);}
.sched-cell.assigned.end{border-radius:0 0 3px 3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.12),inset 0 0 0 1px rgba(0,0,0,0.06);}
.sched-cell.assigned.single{border-radius:3px;box-shadow:inset 0 1px 0 rgba(255,255,255,0.18),inset 0 -1px 0 rgba(0,0,0,0.12),inset 0 0 0 1px rgba(0,0,0,0.06);}
.sched-cell.assigned.mid{border-top:1px solid rgba(255,255,255,0.22);box-shadow:inset 0 0 0 1px rgba(0,0,0,0.06);}
.sched-cell.assigned{transition:filter var(--t-fast) var(--ease),box-shadow var(--t-fast) var(--ease),opacity 0.28s var(--ease),transform 0.28s var(--ease);}
.sched-cell.assigned.block-hover{filter:brightness(1.08)!important;box-shadow:inset 0 0 0 1px rgba(255,255,255,0.3),0 8px 24px rgba(20,17,15,0.22),0 0 0 1px var(--teal-glow);z-index:5;opacity:1!important;}
/* Spotlight: dim non-hovered blocks when any is being hovered */
.sched-grid.has-hover .sched-cell.assigned:not(.block-hover){opacity:0.3!important;filter:saturate(0.55)!important;}
.sched-cell.drag-over{outline:2px solid var(--teal);outline-offset:-2px;background:var(--teal-soft)!important;position:relative;z-index:3;}
.sched-cell.drag-over-warn{outline:2px dashed var(--vermillion);outline-offset:-2px;background:var(--vermillion-soft)!important;position:relative;z-index:3;}
.sched-cell.drag-ghost{opacity:0.25;}
/* In availability — strong sage hint with inner border */
.sched-cell.drag-valid{background:rgba(122,142,110,0.18)!important;box-shadow:inset 0 0 0 1px rgba(122,142,110,0.35);}
/* Outside availability — vermillion diagonal-stripe warning */
.sched-cell.drag-warn{background:repeating-linear-gradient(135deg,rgba(196,121,103,0.1) 0,rgba(196,121,103,0.1) 1px,transparent 1px,transparent 5px)!important;}

/* Now indicator */
.now-indicator{position:absolute;pointer-events:none;z-index:3;height:1px;background:linear-gradient(90deg,transparent 0%,var(--teal-soft) 8%,var(--teal) 50%,var(--teal-soft) 92%,transparent 100%);left:100px;width:calc(100% - 100px);}
.now-indicator::before{content:'';position:absolute;left:calc((var(--now-day,0) + 0.5) * 100% / 7);top:50%;transform:translate(-50%,-50%);width:10px;height:10px;border-radius:50%;background:var(--teal);box-shadow:0 0 0 0 var(--teal-glow),0 0 12px var(--teal-glow);animation:pulseDot 2.4s ease-in-out infinite;}
.now-indicator::after{content:attr(data-time);position:absolute;left:calc((var(--now-day,0) + 0.5) * 100% / 7);top:-22px;transform:translateX(-50%);font-family:var(--font-mono);font-size:9px;color:var(--teal);letter-spacing:1px;background:var(--surface);padding:2px 6px;border:1px solid var(--teal-soft);border-radius:2px;white-space:nowrap;font-weight:600;}

/* ===== Catalog plate — full gallery label below grid ===== */
.catalog-plate{margin:32px auto 0;text-align:center;max-width:920px;padding:0;}
.cp-rule{width:32px;height:1px;background:var(--text3);margin:0 auto 22px;}
.cp-title{font-family:var(--font-display);font-size:14px;font-weight:500;letter-spacing:8px;color:var(--text2);margin-bottom:24px;text-transform:uppercase;font-feature-settings:"tnum";}
.cp-issuance{font-family:var(--font-mono);font-size:9px;color:var(--text4);letter-spacing:4px;margin-top:24px;text-transform:uppercase;}
.catalog-plate .stats-bar{display:flex;gap:0;justify-content:center;margin:0;padding:0;background:transparent;border:none;position:static;max-width:none;}
.catalog-plate .stats-bar::before{display:none;}
.stat-item{text-align:center;padding:0 28px;position:relative;}
.stat-item+.stat-item::before{content:'';position:absolute;left:0;top:50%;transform:translateY(-50%);width:1px;height:24px;background:var(--border);}
.stat-num{font-family:var(--font-mono);font-size:24px;font-weight:500;color:var(--text);letter-spacing:0;font-feature-settings:"tnum";line-height:1;}
.stat-label{font-family:var(--font-mono);font-size:9px;color:var(--text3);letter-spacing:3px;margin-top:10px;text-transform:uppercase;}

/* ===== Warnings ===== */
.warn-box{margin-top:18px;padding:14px 18px;background:var(--vermillion-soft);font-size:13px;color:var(--vermillion);border-left:2px solid var(--vermillion);border-radius:0 var(--radius) var(--radius) 0;}

/* ===== Mode options ===== */
.mode-options{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:8px;}
.mode-opt{display:flex;align-items:center;justify-content:center;padding:8px 10px;border:1px solid var(--border);cursor:pointer;font-size:11px;font-weight:500;color:var(--text2);transition:all var(--t-fast) var(--ease);background:var(--surface);border-radius:var(--radius);flex:1;min-width:0;text-align:center;text-transform:uppercase;letter-spacing:1px;}
.mode-opt:hover{border-color:var(--text3);color:var(--text);}
.mode-opt:has(input:checked){border-color:var(--teal);background:var(--teal-soft);color:var(--teal);}
.mode-opt input{display:none;}
.mode-desc{display:none;}

/* ===== Tables ===== */
.name-table{width:100%;border-collapse:collapse;margin-bottom:24px;font-size:13px;}
.name-table th{text-align:left;padding:14px 12px;font-weight:500;font-family:var(--font-mono);font-size:10px;color:var(--text3);border-bottom:1px solid var(--border);letter-spacing:2px;user-select:none;text-transform:uppercase;}
.name-table th[onclick]{cursor:pointer;transition:color var(--t-fast);}
.name-table th[onclick]:hover{color:var(--teal);}
.name-table td{padding:11px 12px;border-bottom:1px solid var(--border-light);color:var(--text);}
.name-table tr:hover td{background:var(--surface2);}
.name-table td input{border:none;background:transparent;font-family:var(--font-body);font-size:13px;color:var(--text);width:100%;padding:2px 0;outline:none;}
.name-table td input:focus{border-bottom:1px solid var(--teal);}
.name-table td select{background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:2px;}
.name-table .color-dot{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:6px;}
.name-table .del-btn{cursor:pointer;color:var(--text3);font-size:11px;transition:color var(--t-fast);}
.name-table .del-btn:hover{color:var(--vermillion);}
.name-table .edit-btn{cursor:pointer;color:var(--teal);font-size:11px;font-weight:500;}
.code-badge{font-family:var(--font-mono);font-size:11px;background:var(--surface2);padding:3px 8px;color:var(--text2);border:1px solid var(--border);letter-spacing:1px;border-radius:2px;}
.code-input{font-family:var(--font-mono)!important;font-size:11px!important;letter-spacing:1px;width:100px!important;color:var(--text)!important;}

/* ===== Student chips ===== */
.student-list{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:24px;}
.student-chip{padding:6px 14px;cursor:pointer;font-size:12px;font-weight:500;border:1px solid var(--border);background:var(--surface);color:var(--text2);transition:all var(--t-fast) var(--ease);user-select:none;border-radius:20px;}
.student-chip:hover{border-color:var(--text3);color:var(--text);}
.student-chip.active{color:#fff;}
.student-chip .check{font-size:9px;margin-left:4px;opacity:0.7;}

/* ===== Edit panel ===== */
.edit-panel{border:1px solid var(--border);padding:24px;background:var(--surface);margin-bottom:20px;animation:fadeIn 0.3s var(--ease);border-radius:var(--radius);}
.edit-panel-header{display:flex;gap:10px;align-items:center;margin-bottom:18px;flex-wrap:wrap;}
.edit-label{font-family:var(--font-mono);font-size:10px;color:var(--text3);margin-bottom:14px;letter-spacing:2px;text-transform:uppercase;}

/* ===== Period grid ===== */
.period-grid{display:grid;grid-template-columns:74px repeat(7,1fr);gap:4px;margin-top:12px;}
.period-grid .pg-header{text-align:center;font-family:var(--font-mono);font-size:10px;font-weight:500;color:var(--text2);padding:4px 0;letter-spacing:1.5px;text-transform:uppercase;}
.period-grid .pg-label{font-size:11px;font-weight:400;color:var(--text2);display:flex;flex-direction:column;align-items:flex-end;justify-content:center;padding-right:8px;line-height:1.3;}
.period-grid .pg-cell{height:34px;cursor:pointer;border:1px solid var(--border);background:var(--surface);display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:500;color:var(--text3);transition:all var(--t-fast) var(--ease);user-select:none;border-radius:3px;}
.period-grid .pg-cell:hover{border-color:var(--text3);background:var(--surface2);color:var(--text2);}
.period-grid .pg-cell.on{color:#fff;border-color:transparent;}
.period-grid .pg-sub{font-size:9px;color:var(--text4);}

/* ===== Add row ===== */
.add-row{display:flex;gap:8px;margin-bottom:24px;flex-wrap:wrap;align-items:center;}
.add-row input,.add-row select{padding:9px 14px;border:1px solid var(--border);font-family:var(--font-body);font-size:13px;background:var(--surface);color:var(--text);border-radius:var(--radius);}
.add-row input:focus,.add-row select:focus{border-color:var(--teal);outline:none;box-shadow:0 0 0 3px var(--teal-soft);}

/* ===== Custom events ===== */
.custom-events-section{margin-top:20px;padding:0;background:transparent;border:none;}
.ce-list{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:10px;}
.ce-chip{display:inline-flex;align-items:center;gap:8px;padding:5px 14px;font-size:11px;font-weight:500;color:#fff;border-radius:20px;}
.ce-chip .ce-del{cursor:pointer;opacity:0.6;font-size:14px;}
.ce-chip .ce-del:hover{opacity:1;}

/* ===== Booking ===== */
.booking-section{margin-top:20px;padding:0;background:transparent;border:none;}
.booking-filter{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:18px;}
.booking-item{display:flex;align-items:center;gap:14px;padding:14px 0;border-bottom:1px solid var(--border-light);animation:slideIn 0.4s var(--ease);flex-wrap:wrap;}
.booking-item:last-child{border-bottom:none;}
.booking-name{font-weight:500;min-width:80px;color:var(--text);}
.booking-time{font-family:var(--font-mono);font-size:12px;color:var(--text2);}
.booking-note{font-size:12px;color:var(--text3);font-style:italic;flex:1;}
.booking-actions{display:flex;gap:6px;}
.booking-status{font-size:9px;font-weight:600;padding:3px 10px;letter-spacing:1.5px;border-radius:20px;text-transform:uppercase;font-family:var(--font-mono);}
.booking-status.pending{color:var(--teal);border:1px solid var(--teal);animation:statusPulse 2.4s ease-in-out infinite;}
.booking-status.approved{color:var(--sage);border:1px solid var(--sage);}
.booking-status.denied{color:var(--vermillion);border:1px solid var(--vermillion);}
.booking-inline-error{flex-basis:100%;padding:10px 12px;background:var(--vermillion-soft);border:1px solid rgba(196,121,103,0.25);color:var(--vermillion);font-size:12px;border-radius:var(--radius);}

/* ===== Student booking ===== */
.student-day-switch{display:none;}
.booking-day-grid{display:none;}
.recommended-slots{margin:0 0 16px;padding:18px;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);}
.recommended-slots .mode-label{font-family:var(--font-mono);font-size:10px;font-weight:500;color:var(--text3);letter-spacing:2px;text-transform:uppercase;}
.recommended-slots.empty{font-size:12px;color:var(--text3);text-align:center;background:var(--surface);}
.recommended-list{display:flex;gap:6px;flex-wrap:wrap;margin-top:10px;}
.slot-suggestion{border:1px solid var(--border);background:var(--surface);padding:7px 12px;border-radius:20px;font-family:var(--font-mono);font-size:11px;color:var(--text2);cursor:pointer;transition:all var(--t-fast) var(--ease);}
.slot-suggestion span{font-family:var(--font-body);font-weight:600;color:var(--teal);margin-right:4px;}
.slot-suggestion:hover{border-color:var(--teal);background:var(--teal-soft);color:var(--text);}
.booking-grid .sched-cell:not(.assigned):not(.blocked):hover{background:var(--teal-soft)!important;cursor:pointer;}
.booking-grid .sched-cell.selected{background:var(--teal)!important;border-radius:3px;}

/* ===== Groups ===== */
.group-card{background:var(--surface);border:1px solid var(--border);padding:24px;margin-bottom:14px;animation:fadeIn 0.3s var(--ease);border-radius:var(--radius);transition:transform var(--t-med) var(--ease),border-color var(--t-med) var(--ease),box-shadow var(--t-med) var(--ease);}
.group-card:hover{transform:translateY(-2px);border-color:var(--border-strong);box-shadow:var(--shadow-md);}
.group-header{display:flex;align-items:center;gap:12px;margin-bottom:14px;}
.group-header input[type="text"],.group-header input:not([type]){border-bottom:1px dashed var(--border)!important;color:var(--text)!important;background:transparent!important;}
.group-header input[type="text"]:focus,.group-header input:not([type]):focus{border-bottom:1px solid var(--teal)!important;}
.group-header select{background:var(--surface);color:var(--text);border:1px solid var(--border);}
.group-name{font-family:var(--font-display);font-size:15px;font-weight:600;letter-spacing:2px;color:var(--text);}
.group-members{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:14px;}
.group-member{padding:5px 12px;font-size:12px;border:1px solid var(--border);background:var(--surface);color:var(--text2);cursor:pointer;transition:all var(--t-fast) var(--ease);border-radius:20px;}
.group-member.in{color:#fff;border-color:transparent;}
.group-member:hover{border-color:var(--text3);color:var(--text);}
.group-actions{display:flex;gap:8px;align-items:center;padding-top:14px;border-top:1px solid var(--border-light);}

/* ===== Student welcome (editorial) ===== */
.student-welcome{background:var(--surface);border:1px solid var(--border);padding:36px;margin:0 auto 32px;animation:fadeIn 0.4s var(--ease);border-radius:var(--radius);max-width:1440px;}
.student-welcome h3{font-family:var(--font-display);font-size:28px;font-weight:600;margin-bottom:14px;letter-spacing:6px;color:var(--text);}
.student-welcome p{font-size:13px;color:var(--text2);}
.student-week-list{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:8px;margin-top:20px;}
.student-week-list.empty{display:block;padding:14px 16px;background:var(--surface2);border:1px solid var(--border-light);font-size:12px;color:var(--text3);border-radius:var(--radius);}
.student-week-item{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:13px 16px;background:var(--surface);border:1px solid var(--border);font-size:12px;border-radius:var(--radius);transition:transform var(--t-fast) var(--ease),border-color var(--t-fast) var(--ease);}
.student-week-item:hover{transform:translateX(2px);border-color:var(--teal-soft);}
.student-week-item span{color:var(--text2);}
.student-week-item strong{font-family:var(--font-mono);font-size:11px;color:var(--text);font-weight:600;text-align:right;}
.student-request-alert{margin-top:16px;padding:12px 14px;border-radius:var(--radius);border:1px solid var(--border-light);font-size:12px;display:flex;flex-wrap:wrap;gap:6px 10px;align-items:center;background:var(--surface2);}
.student-request-alert strong{font-size:12px;color:var(--text);}
.student-request-alert span{font-family:var(--font-mono);color:var(--text2);}
.student-request-alert em{width:100%;font-style:normal;color:var(--text3);}
.student-request-alert.pending{background:var(--teal-soft);border-color:rgba(74,138,138,0.2);}
.student-request-alert.approved{background:var(--sage-soft);border-color:rgba(122,142,110,0.2);}
.student-request-alert.denied{background:var(--vermillion-soft);border-color:rgba(196,121,103,0.2);}
.student-month-stats{display:grid;grid-template-columns:repeat(3,1fr);gap:0;margin-top:18px;border-top:1px solid var(--border);padding-top:18px;}
.student-month-stats div{padding:8px 16px;border-right:1px solid var(--border-light);}
.student-month-stats div:last-child{border-right:none;}
.student-month-stats strong{display:block;font-family:var(--font-mono);font-size:24px;color:var(--text);font-weight:500;letter-spacing:-0.5px;}
.student-month-stats span{display:block;margin-top:6px;font-family:var(--font-mono);font-size:9px;color:var(--text3);letter-spacing:2px;text-transform:uppercase;}

/* ===== Grid selector ===== */
.grid-sel{display:grid;gap:1px;font-size:11px;user-select:none;grid-template-columns:58px repeat(7,1fr);}
.grid-sel .gh{text-align:center;font-family:var(--font-mono);font-weight:500;padding:5px 0;font-size:10px;color:var(--text2);letter-spacing:1px;text-transform:uppercase;}
.grid-sel .gt{font-size:9px;color:var(--text3);text-align:right;padding-right:4px;line-height:18px;font-family:var(--font-mono);}
.grid-sel .gc{height:18px;background:var(--surface);cursor:pointer;border:1px solid var(--border-light);transition:background var(--t-fast);}
.grid-sel .gc.on{border-color:transparent;}

/* ===== Dashboard — month nav + hero stats + trend ===== */
.dash-monthnav{display:flex;align-items:center;gap:14px;margin-bottom:32px;padding-bottom:18px;border-bottom:1px solid var(--border-light);}
.dash-monthtitle{font-family:var(--font-display);font-size:18px;font-weight:600;letter-spacing:4px;color:var(--text);min-width:160px;text-align:center;font-feature-settings:"tnum";}
.dash-nav-btn{padding:6px 14px;font-size:14px;letter-spacing:0;}
.dash-today-btn{font-size:10px;padding:6px 14px;}
.dash-pending{font-family:var(--font-mono);font-size:10px;letter-spacing:2px;text-transform:uppercase;color:var(--vermillion);padding:5px 12px;border:1px solid var(--vermillion);border-radius:20px;}

.dash-hero{display:grid;grid-template-columns:repeat(3,1fr);gap:0;border:1px solid var(--border);background:var(--surface);margin-bottom:24px;border-radius:var(--radius);overflow:hidden;}
.dash-hero-cell{padding:30px 28px 26px;border-right:1px solid var(--border);transition:background var(--t-med);}
.dash-hero-cell:last-child{border-right:none;}
.dash-hero-cell:hover{background:var(--surface2);}
.dash-hero-num{font-family:var(--font-mono);font-size:48px;font-weight:500;letter-spacing:-1.5px;line-height:1;color:var(--text);font-feature-settings:"tnum";}
.dash-hero-unit{font-size:18px;color:var(--text3);margin-left:4px;letter-spacing:2px;font-weight:400;}
.dash-hero-label{font-family:var(--font-mono);font-size:10px;letter-spacing:2.5px;text-transform:uppercase;color:var(--text3);margin-top:14px;}
.dash-hero-sub{font-family:var(--font-mono);font-size:10px;color:var(--text3);margin-top:8px;letter-spacing:0.5px;}
.dash-change{font-family:var(--font-mono);font-size:10px;letter-spacing:1.5px;color:var(--text3);margin-top:8px;display:inline-block;}
.dash-change.up{color:var(--sage);}
.dash-change.down{color:var(--vermillion);}

.dash-trend-row{cursor:pointer;transition:opacity var(--t-fast);padding:7px 0;border-bottom:1px solid var(--border-light);}
.dash-trend-row:last-child{border-bottom:none;}
.dash-trend-row:hover{opacity:0.75;}
.dash-trend-row.current .dash-bar-label{color:var(--teal)!important;font-weight:600;}
.dash-trend-row.current .dash-bar-val{color:var(--text);font-weight:600;}
.dash-trend-row.current .dash-bar-fill{background:linear-gradient(90deg,var(--teal-bright),var(--teal))!important;box-shadow:0 0 12px var(--teal-glow);}

.dash-section-title .dash-count{font-family:var(--font-mono);font-size:11px;color:var(--text3);letter-spacing:2px;font-weight:400;margin-left:8px;}

.dash-students-list{display:flex;flex-direction:column;gap:0;}
.dash-student-row{display:grid;grid-template-columns:32px 12px 1fr 1fr 56px 70px;align-items:center;gap:12px;padding:10px 0;border-bottom:1px solid var(--border-light);font-size:12px;}
.dash-student-row:last-child{border-bottom:none;}
.dash-student-rank{font-family:var(--font-mono);font-size:10px;color:var(--text3);letter-spacing:1px;}
.dash-student-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0;}
.dash-student-name{color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.dash-student-abbr{font-family:var(--font-mono);font-size:10px;color:var(--text3);letter-spacing:1.5px;margin-left:8px;text-transform:uppercase;}
.dash-student-bar{height:4px;background:var(--surface2);border-radius:2px;overflow:hidden;}
.dash-student-fill{height:100%;border-radius:2px;transition:width 0.6s var(--ease);}
.dash-student-h{font-family:var(--font-mono);font-size:11px;color:var(--text);text-align:right;font-feature-settings:"tnum";font-weight:500;}
.dash-student-diff{font-family:var(--font-mono);font-size:10px;text-align:right;letter-spacing:0.5px;color:var(--text3);}
.dash-student-diff.up{color:var(--sage);}
.dash-student-diff.down{color:var(--vermillion);}

.dash-empty{text-align:center;padding:32px;color:var(--text3);font-size:12px;letter-spacing:1px;font-family:var(--font-mono);text-transform:uppercase;}

@media(max-width:768px){
  .dash-monthnav{flex-wrap:wrap;gap:8px;margin-bottom:20px;padding-bottom:14px;}
  .dash-monthtitle{font-size:14px;letter-spacing:2px;min-width:120px;}
  .dash-pending{order:99;width:100%;text-align:center;}
  .dash-hero{grid-template-columns:1fr;}
  .dash-hero-cell{border-right:none;border-bottom:1px solid var(--border);padding:22px 20px;}
  .dash-hero-cell:last-child{border-bottom:none;}
  .dash-hero-num{font-size:32px;}
  .dash-student-row{grid-template-columns:24px 8px 1fr 60px 70px;gap:8px;}
  .dash-student-bar{display:none;}
  .dash-student-name{font-size:11px;}
}

/* Existing dash-grid retained for legacy uses */
.dash-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:0;margin-bottom:32px;border:1px solid var(--border);border-radius:var(--radius);background:var(--surface);}
.dash-card{padding:32px 28px;text-align:center;border-right:1px solid var(--border);transition:background var(--t-med) var(--ease);}
.dash-card:last-child{border-right:none;}
.dash-card:hover{background:var(--surface2);}
.dash-card .dash-num{font-family:var(--font-mono);font-size:48px;font-weight:500;color:var(--text);line-height:1;letter-spacing:-1.5px;font-feature-settings:"tnum";}
.dash-card .dash-num::after{content:'';display:block;width:32px;height:1px;margin:16px auto 0;background:var(--text3);}
.dash-card:nth-child(1) .dash-num::after{background:var(--teal);}
.dash-card:nth-child(2) .dash-num::after{background:var(--sage);}
.dash-card:nth-child(3) .dash-num::after{background:var(--vermillion);}
.dash-card .dash-label{font-family:var(--font-mono);font-size:10px;color:var(--text3);margin-top:12px;letter-spacing:2.5px;text-transform:uppercase;}
.dash-card .dash-sub{font-family:var(--font-mono);font-size:11px;color:var(--text2);margin-top:6px;letter-spacing:0.5px;}
.dash-section{background:var(--surface);border:1px solid var(--border);padding:32px;margin-bottom:18px;border-radius:var(--radius);}
.dash-section-title{font-family:var(--font-display);font-size:20px;font-weight:600;margin-bottom:24px;letter-spacing:4px;color:var(--text);}
.dash-bar-row{display:flex;align-items:center;gap:14px;margin-bottom:10px;font-size:12px;}
.dash-bar-label{width:50px;text-align:right;color:var(--text3);font-size:10px;font-family:var(--font-mono);letter-spacing:1px;}
.dash-bar{flex:1;height:18px;background:var(--surface2);border:1px solid var(--border-light);position:relative;overflow:hidden;border-radius:2px;}
.dash-bar-fill{height:100%;background:linear-gradient(90deg,var(--teal) 0%,var(--teal-soft) 100%);transition:width 0.6s var(--ease);border-radius:2px;}
.dash-bar-val{width:42px;font-family:var(--font-mono);font-size:11px;color:var(--text2);}

/* ===== Footer ===== */
.footer-actions{margin-top:80px;padding-top:24px;border-top:1px solid var(--border);display:flex;justify-content:center;gap:10px;flex-wrap:wrap;}

/* ===== Modal ===== */
.modal-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(20,17,15,0.4);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);z-index:1000;display:flex;align-items:center;justify-content:center;animation:fadeIn 0.3s var(--ease);}
.modal{background:var(--surface);border:1px solid var(--border-strong);padding:36px;max-width:440px;width:90%;animation:fadeIn 0.4s var(--ease);border-radius:var(--radius-lg);box-shadow:var(--shadow-md);}
.modal h3{font-family:var(--font-display);font-size:20px;font-weight:600;margin-bottom:18px;letter-spacing:3px;color:var(--text);}
.modal label{color:var(--text2);}
.modal textarea{width:100%;padding:12px;border:1px solid var(--border);background:var(--surface);color:var(--text);font-family:var(--font-body);font-size:13px;resize:vertical;min-height:60px;margin-bottom:14px;border-radius:var(--radius);}
.modal textarea:focus{border-color:var(--teal);outline:none;box-shadow:0 0 0 3px var(--teal-soft);}
.modal input,.modal select{background:var(--surface)!important;color:var(--text)!important;border-color:var(--border)!important;}
.modal-actions{display:flex;gap:10px;justify-content:flex-end;}

/* ===== Schedule tooltip — catalog wall-text card ===== */
.sched-tip{position:fixed;z-index:999;pointer-events:none;background:var(--surface);border:1px solid var(--border-strong);padding:18px 22px;min-width:240px;max-width:320px;font-family:var(--font-mono);box-shadow:0 16px 48px rgba(20,17,15,0.12);border-radius:var(--radius);opacity:0;transform:translateY(8px);transition:opacity 0.2s var(--ease),transform 0.28s var(--ease);}
.sched-tip.visible{opacity:1;transform:translateY(0);}
.sched-tip .tt-row{display:flex;align-items:center;gap:10px;font-size:10px;color:var(--text3);letter-spacing:2px;text-transform:uppercase;line-height:1.5;padding:3px 0;}
.sched-tip .tt-line{flex-shrink:0;width:14px;height:1px;background:var(--text3);}
.sched-tip .tt-label{flex:1;}
.sched-tip .tt-row.tt-name{font-family:var(--font-display);font-size:18px;letter-spacing:3px;color:var(--text);text-transform:none;font-weight:600;padding:6px 0 8px;border-bottom:1px solid var(--border-light);margin-bottom:6px;}
.sched-tip .tt-abbr{font-family:var(--font-mono);font-size:11px;color:var(--text3);font-weight:400;letter-spacing:2px;margin-left:6px;}

/* ===== Toast ===== */
.toast-stack{position:fixed;top:24px;right:24px;display:flex;flex-direction:column;gap:10px;z-index:9999;pointer-events:none;}
.toast{background:var(--surface);border:1px solid var(--border-strong);padding:12px 18px 12px 16px;font-size:12px;color:var(--text);border-radius:var(--radius);min-width:240px;display:flex;align-items:center;gap:12px;animation:toastIn 0.42s var(--ease) forwards;box-shadow:var(--shadow-md);pointer-events:auto;letter-spacing:0.3px;}
.toast.toast-out{animation:toastOut 0.3s var(--ease) forwards;}
.toast::before{content:'';width:3px;height:20px;background:var(--teal);border-radius:2px;flex-shrink:0;}
.toast.error::before{background:var(--vermillion);}
.toast.success::before{background:var(--sage);}

/* ===== Export PNG mode — clean static snapshot ===== */
.exporting,.exporting *{transition:none!important;animation:none!important;}
/* Layout: white background + padding so grid breathes inside the captured area */
.exporting{padding:24px 28px 32px!important;background:#fff!important;display:block!important;}
/* Title at top — editorial centered */
.exporting .week-title{display:block!important;text-align:center;font-family:var(--font-display);font-size:22px;font-weight:600;letter-spacing:6px;color:var(--text);padding:8px 0 28px!important;margin:0!important;line-height:1;}
/* Schedule grid frame visible + clipped corners */
.exporting .sched-grid{border:1px solid var(--border)!important;border-radius:4px!important;overflow:hidden!important;}
/* Flatten assigned blocks — no 3D shadows, force full opacity */
.exporting .sched-cell.assigned{box-shadow:none!important;opacity:1!important;filter:none!important;}
.exporting .sched-cell.assigned.mid{border-top-color:transparent!important;}
/* Strip today highlight — today looks same as other days in export */
.exporting .sched-header.today::before{display:none!important;}
.exporting .sched-header.today{box-shadow:none!important;background:var(--surface)!important;}
.exporting .sched-header.today .day-name{color:var(--text)!important;}
.exporting .sched-header.today .day-date{color:var(--text3)!important;font-weight:400!important;}
.exporting .sched-cell.today-col{background:var(--surface)!important;box-shadow:none!important;}
/* Blocked cells: thicker stripes — html2canvas renders 1px stripes as washed gray */
.exporting .sched-cell.blocked,.exporting .sched-cell.today-col.blocked{background:repeating-linear-gradient(135deg,rgba(196,121,103,0.32) 0,rgba(196,121,103,0.32) 2.5px,transparent 2.5px,transparent 9px),rgba(196,121,103,0.05)!important;}

/* Loading shimmer */
.is-loading{position:relative;overflow:hidden;pointer-events:none;}
.is-loading::after{content:'';position:absolute;inset:0;background:linear-gradient(90deg,transparent 0%,rgba(20,17,15,0.04) 50%,transparent 100%);background-size:1000px 100%;animation:shimmer 1.6s linear infinite;z-index:1;}

#exportArea{position:relative;background:transparent!important;border:none!important;padding:0!important;border-radius:0!important;}
/* Crop marks at corners of the schedule grid — print/architectural feel */
.sched-grid::after{
  content:'';position:absolute;inset:-9px;pointer-events:none;z-index:5;
  background:
    linear-gradient(var(--text3),var(--text3)) top left/14px 1px no-repeat,
    linear-gradient(var(--text3),var(--text3)) top left/1px 14px no-repeat,
    linear-gradient(var(--text3),var(--text3)) top right/14px 1px no-repeat,
    linear-gradient(var(--text3),var(--text3)) top right/1px 14px no-repeat,
    linear-gradient(var(--text3),var(--text3)) bottom left/14px 1px no-repeat,
    linear-gradient(var(--text3),var(--text3)) bottom left/1px 14px no-repeat,
    linear-gradient(var(--text3),var(--text3)) bottom right/14px 1px no-repeat,
    linear-gradient(var(--text3),var(--text3)) bottom right/1px 14px no-repeat;
  opacity:0.55;
}


.stat-num,.dash-num,.student-month-stats strong{font-variant-numeric:tabular-nums;}

/* Print */
@media print{body{background:#fff;color:#000;}.tab,.schedule-controls,.custom-events-section,.footer-actions,.stats-bar,.booking-section,.page-header,.sched-side{display:none!important;}.app{padding:0;max-width:100%;}.sched-grid{border:1px solid #ccc;}}

/* ===== Mobile cards ===== */
.student-card{display:none;}

/* ===== Mobile ===== */
@media(max-width:1100px){
  .sched-layout{grid-template-columns:1fr;gap:18px;}
  .sched-side{position:static;}
}
@media(max-width:768px){
  body{padding-left:0;}
  .rail{display:none;}
  .sched-layout{margin-left:0;margin-right:0;padding-left:0;padding-right:0;}
  .page-header{grid-template-columns:1fr;gap:6px;padding:28px 0 20px;margin-bottom:24px;}
  .ph-eyebrow,.ph-title,.ph-display,.ph-meta{grid-column:1/2;grid-row:auto;}
  .ph-title{font-size:28px;letter-spacing:4px;margin-top:8px;}
  .ph-display{font-size:20px;text-align:left;justify-self:start;align-self:auto;margin-top:10px;}
  .ph-meta{margin-top:14px;}
  .app{padding:0 16px 60px;}
  .topbar{flex-direction:column;gap:10px;padding:12px 0;}
  .topbar-left{flex-wrap:wrap;width:100%;}
  .topbar-logo{font-size:12px;letter-spacing:5px;padding-right:10px;}
  .topbar-logo-icon{height:22px;}
  .topbar-divider{display:none;}
  .topbar-nav{overflow-x:auto;-webkit-overflow-scrolling:touch;flex:1;scrollbar-width:none;-ms-overflow-style:none;scroll-snap-type:x proximity;position:relative;padding-right:32px;}
  .topbar-nav::-webkit-scrollbar{display:none;}
  .tab{padding:6px 10px;font-size:10px;letter-spacing:1px;scroll-snap-align:start;flex-shrink:0;}
  .tab::before{display:none;}
  .tab::after{bottom:0;}
  .topbar-left{position:relative;}
  .topbar-left::after{content:'';position:absolute;right:0;top:50%;transform:translateY(-50%);width:24px;height:32px;background:linear-gradient(to right,transparent,var(--bg));pointer-events:none;z-index:2;}
  .topbar-right{width:100%;justify-content:flex-end;}

  .page-header{padding:28px 0 20px;margin-bottom:24px;grid-template-columns:1fr;}
  .ph-title{font-size:24px;letter-spacing:4px;margin:8px 0 4px;}
  .ph-display{font-size:18px;text-align:left;margin-top:8px;}

  .sched-layout{grid-template-columns:1fr;gap:18px;}
  .sched-side{position:static;gap:18px;}

  .week-bar{flex-wrap:wrap;gap:6px;margin-bottom:14px;padding-bottom:12px;}
  .week-bar label{font-size:9px;}
  .week-bar select,.week-bar input{padding:7px 10px;font-size:12px;}

  .sched-grid{grid-template-columns:42px repeat(7,1fr);font-size:9px;}
  .period-label,.period-corner{display:none;}
  .sched-header{padding:10px 1px 8px;}
  .sched-header .day-name{font-size:9px;letter-spacing:1px;}
  .sched-header .day-date{font-size:11px;}
  .sched-time{font-size:7px;padding:0;line-height:20px;}
  .sched-time.hour-mark{font-size:9px;}
  .sched-cell{height:20px;}
  .sched-cell.assigned{font-size:7px;letter-spacing:0;}
  .now-indicator{left:42px;width:calc(100% - 42px);}
  .now-indicator::before{left:calc((var(--now-day,0) + 0.5) * 100% / 7);}
  .now-indicator::after{left:calc((var(--now-day,0) + 0.5) * 100% / 7);}

  .stats-bar{gap:0;padding:12px 0;}
  .stat-item{padding:0 8px;}
  .stat-num{font-size:18px;}
  .stat-label{font-size:8px;}

  .add-row{gap:5px;flex-wrap:wrap;}
  .add-row input,.add-row select{padding:7px 10px;font-size:12px;min-width:0;}

  .name-table{display:none!important;}
  .student-card{display:block!important;}
  .s-card{background:var(--surface);border:1px solid var(--border);padding:14px;margin-bottom:8px;display:flex;flex-wrap:wrap;gap:8px;align-items:center;border-radius:var(--radius);}
  .s-card-color{width:10px;height:10px;border-radius:50%;flex-shrink:0;}
  .s-card-main{flex:1;min-width:120px;color:var(--text);}
  .s-card-name{font-weight:500;font-size:14px;}
  .s-card-sub{font-size:11px;color:var(--text3);margin-top:2px;}
  .s-card-actions{display:flex;gap:6px;}
  .s-card-periods{font-size:11px;color:var(--teal);width:100%;margin-top:4px;padding-top:8px;border-top:1px solid var(--border-light);}

  .student-list{gap:4px;}
  .student-chip{padding:4px 10px;font-size:11px;}

  .edit-panel{padding:14px;}
  .period-grid{grid-template-columns:50px repeat(7,1fr);gap:2px;}
  .period-grid .pg-cell{height:30px;font-size:8px;}
  .period-grid .pg-header{font-size:8px;}
  .period-grid .pg-label{font-size:9px;padding-right:3px;}
  .period-grid .pg-sub{font-size:7px;}

  .grid-sel{grid-template-columns:42px repeat(7,1fr);}
  .grid-sel .gt{font-size:7px;padding-right:2px;}
  .grid-sel .gc{height:16px;}
  .grid-sel .gh{font-size:8px;}

  .booking-item{flex-wrap:wrap;gap:6px;padding:12px 0;}
  .booking-name{min-width:60px;font-size:13px;}
  .booking-time{font-size:11px;}
  .booking-note{font-size:11px;width:100%;}
  #panel-s-booking .student-day-switch{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;margin:4px 0 12px;}
  .day-switch-btn{border:1px solid var(--border);background:var(--surface);padding:8px 2px;border-radius:var(--radius);font-family:var(--font-body);color:var(--text2);cursor:pointer;}
  .day-switch-btn span{display:block;font-size:11px;font-weight:600;line-height:1;}
  .day-switch-btn strong{display:block;margin-top:3px;font-family:var(--font-mono);font-size:8px;font-weight:500;color:var(--text3);line-height:1;}
  .day-switch-btn.active{border-color:var(--teal);background:var(--teal-soft);color:var(--teal);}
  .day-switch-btn.active strong{color:var(--teal);}
  #panel-s-booking .booking-week-grid{display:none;}
  #panel-s-booking .booking-day-grid{display:grid;grid-template-columns:54px minmax(0,1fr);}
  #panel-s-booking .booking-day-grid .sched-header{font-size:11px;}
  #panel-s-booking .booking-day-grid .sched-cell{height:28px;font-size:11px;}
  #panel-s-booking .booking-day-grid .sched-time{line-height:28px;font-size:9px;}

  .btn{padding:8px 14px;font-size:10px;}
  .login-container{margin:50px auto;padding:0 18px;}
  .login-logo{width:240px;}
  .footer-actions{gap:6px;margin-top:40px;}
  .modal{padding:24px;max-width:94%;}
  .dash-grid{grid-template-columns:1fr;}
  .dash-card{border-right:none;border-bottom:1px solid var(--border);padding:22px;}
  .dash-card:last-child{border-bottom:none;}
  .dash-card .dash-num{font-size:32px;}
  .dash-card .dash-label{font-size:9px;}
  .dash-section{padding:20px;}
  .dash-section-title{font-size:16px;}
  .student-welcome{padding:24px;}
  .student-welcome h3{font-size:20px;}
  .student-month-stats{grid-template-columns:repeat(3,1fr);}
  .student-month-stats strong{font-size:18px;}
  .group-card{padding:14px;}
  .group-header{flex-wrap:wrap;gap:6px;}
  .group-header input[type="text"]{font-size:13px!important;width:100px!important;}
  .group-members{gap:4px;}
  .group-member{padding:4px 9px;font-size:11px;}
  .group-actions{flex-wrap:wrap;gap:4px;}
  .stats-bar{gap:0;padding:12px 0;flex-wrap:wrap;}
  .stat-item{min-width:50px;}
}
@media(max-width:380px){
  .ph-title{font-size:20px;letter-spacing:3px;}
  .ph-display{font-size:14px;}
  .sched-grid{grid-template-columns:32px repeat(7,1fr);}
  #panel-s-booking .booking-day-grid{grid-template-columns:48px minmax(0,1fr);}
  .sched-header .day-date{font-size:9px;}
  .sched-time{font-size:6px;padding:0;}
  .sched-time.hour-mark{font-size:8px;}
  .sched-cell{height:18px;}
  .sched-cell.assigned{font-size:6px;}
  .period-grid{grid-template-columns:42px repeat(7,1fr);gap:2px;}
  .period-grid .pg-cell{height:26px;font-size:7px;}
  .dash-grid{grid-template-columns:1fr;}
  .tab{padding:7px 10px;font-size:10px;}
  .group-card{padding:10px;}
  .group-member{padding:3px 7px;font-size:10px;}
  .stat-num{font-size:14px;}
}
