:root{--navy:#0A2E73;--ink:#0F1B33;--mut:#5B6B85;--bg:#F5F8FD;--card:#fff;--line:#E4EAF5;--tint:#EAF1FD;--blue:#2563EB;--teal:#0D9488;--amber:#F59E0B;--violet:#7C3AED;--rose:#E11D48;--r:14px}
*{box-sizing:border-box}
body{margin:0;background:var(--bg);color:var(--ink);font:14px/1.5 Inter,system-ui,sans-serif}
h1,h2,h3{margin:0;font-weight:700;letter-spacing:-.01em}
button{font-family:inherit}
:focus-visible{outline:2px solid var(--blue);outline-offset:2px}
i[data-ic]{display:inline-flex}
.ic{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;flex:none}
.mut{color:var(--mut);font-size:12.5px}
.logo{display:flex;align-items:center;gap:10px;font-weight:800;font-size:17px;color:var(--navy);padding:0 8px 18px}
.card{background:var(--card);border:1px solid var(--line);border-radius:var(--r);padding:18px;margin-bottom:16px}
.btn{white-space:nowrap;background:var(--navy);color:#fff;border:0;border-radius:9px;padding:9px 16px;font-weight:600;font-size:13px;cursor:pointer}
.btn:hover{background:#0c3a8e}
.btn.ghost{background:#fff;color:var(--ink);border:1px solid var(--line)}
.btn.ghost:hover{background:var(--tint)}
.btn.small{padding:5px 11px;font-size:12px}
input,select,textarea{width:100%;padding:10px 12px;border:1px solid var(--line);border-radius:9px;font:inherit;margin-bottom:8px;background:#fff;color:var(--ink)}
input:focus,select:focus,textarea:focus{outline:2px solid var(--blue);outline-offset:-1px;border-color:var(--blue)}
.inline{display:flex;gap:8px}.inline>*{flex:1}
.f{font-size:12px;font-weight:600;color:var(--mut)}
.err{color:var(--rose);font-size:12.5px;margin:-2px 0 8px}
/* auth */
#authScreen{min-height:100vh;display:grid;grid-template-columns:1.15fr 1fr;align-items:center;gap:48px;max-width:1100px;margin:0 auto;padding:24px}
.hero h2{font-size:clamp(34px,5vw,54px);line-height:1.08;font-weight:800;color:var(--navy);letter-spacing:-.03em}
.hero h2 span{display:block;color:var(--blue)}
.hero>p{color:var(--mut);font-size:16px;max-width:420px;margin:16px 0 0}
.feat{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-top:44px}
.feat div{display:flex;flex-direction:column;gap:2px;font-size:12px;color:var(--mut)}
.feat b{color:var(--ink);font-size:13.5px}
.feat i{width:34px;height:34px;border-radius:9px;background:var(--tint);color:var(--blue);align-items:center;justify-content:center;margin-bottom:8px}
.auth-toggle{display:flex;gap:8px;margin-bottom:14px}
.auth-toggle button{flex:1;padding:9px;border-radius:9px;border:1px solid var(--line);background:#fff;font-weight:600;font-size:13px;cursor:pointer}
.auth-toggle button.on{background:var(--navy);color:#fff;border-color:var(--navy)}
/* shell */
#app{display:none;min-height:100vh}
.side{position:fixed;inset:0 auto 0 0;width:236px;background:#fff;border-right:1px solid var(--line);padding:22px 14px;display:flex;flex-direction:column;gap:6px}
.nav{display:flex;align-items:center;gap:10px;width:100%;padding:10px 12px;border:0;background:none;border-radius:10px;font-weight:600;font-size:13.5px;color:var(--ink);cursor:pointer;text-align:left}
.nav:hover{background:var(--tint)}.nav.active{background:var(--navy);color:#fff}
.pep{margin-top:8px;background:var(--navy);color:#fff;border-radius:12px;padding:14px;font-size:12.5px}
.main{margin-left:236px;padding:26px 30px 48px;max-width:1400px}
.top{display:flex;justify-content:space-between;align-items:center;gap:12px;margin-bottom:22px}
.top h1{font-size:22px}
.av{width:36px;height:36px;border-radius:50%;background:var(--navy);color:#fff;display:grid;place-items:center;font-weight:700}
.tabs{display:none;position:fixed;left:0;right:0;bottom:0;z-index:5;background:#fff;border-top:1px solid var(--line);padding:6px 4px calc(6px + env(safe-area-inset-bottom))}
.tab{flex:1;display:flex;flex-direction:column;align-items:center;gap:2px;border:0;background:none;font-size:11px;font-weight:600;color:var(--mut);padding:6px 0;cursor:pointer}
.tab.active{color:var(--navy)}
.section{display:none}.section.active{display:block}
/* dashboard */
.stats{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-bottom:18px}
.stat{background:#fff;border:1px solid var(--line);border-radius:var(--r);padding:16px;display:flex;flex-direction:column}
.stat i{width:34px;height:34px;border-radius:9px;background:var(--tint);color:var(--blue);align-items:center;justify-content:center;margin-bottom:10px}
.stat b{font-size:22px;line-height:1.2}.stat span{color:var(--mut);font-size:12px}
.dash{display:grid;grid-template-columns:1fr 320px;gap:18px;align-items:stretch}
.dash>div{display:flex;flex-direction:column}
.dash>div>.card:last-child{flex:1;margin-bottom:0;display:flex;flex-direction:column}
.sh{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}
.urow{display:flex;align-items:center;gap:14px;padding:12px 0;border-top:1px solid var(--line)}
.sh+div .urow:first-child{border-top:0}
.uic{width:42px;height:42px;border-radius:11px;display:grid;place-items:center;font-weight:800;font-size:12px;flex:none}
.grow{flex:1;min-width:0}
.bar{height:6px;border-radius:9px;background:var(--line);overflow:hidden;margin-top:8px}
.bar>div{height:100%;border-radius:9px}
#goalList .topic:first-child{border-top:0}
.slot{display:flex;gap:12px;padding:8px 0;border-top:1px solid var(--line);font-size:13px}
.slot:first-child{border-top:0}.slot b{min-width:92px;font-weight:600}
.donut{width:128px;height:128px;border-radius:50%;margin:12px auto 14px;display:grid;place-items:center}
.donut b{width:90px;height:90px;border-radius:50%;background:#fff;display:grid;place-items:center;font-size:22px}
.lg{display:flex;justify-content:space-between;font-size:12.5px;color:var(--mut);padding:2px 0}
.lg i{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:8px}
/* units / timetable */
.grid{column-width:300px;column-gap:16px}
.grid .card{break-inside:avoid;margin:0 0 16px}
.grid>p{margin:0}
.week{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:16px}
.week .card{margin:0}
.split{display:grid;grid-template-columns:1fr 340px;gap:18px;align-items:start}
.split>*{min-width:0}.split .card{margin:0}
.wrapm{flex-wrap:wrap}.wrapm>*{flex:1 1 130px}
.f select,.f input{margin-top:4px}
.chip{font-size:10.5px;font-weight:700;background:var(--tint);color:var(--blue);padding:2px 8px;border-radius:999px;margin-left:6px;vertical-align:middle}
.kv{display:flex;justify-content:space-between;gap:12px;padding:9px 0;border-top:1px solid var(--line);font-size:13px}
.kv:first-of-type{border-top:0}
.unit-head{display:flex;align-items:center;gap:12px;margin-bottom:10px}
.topic{display:flex;align-items:center;gap:10px;padding:8px 0;font-size:13.5px;border-top:1px solid var(--line)}
.topic input{width:18px;height:18px;margin:0;accent-color:var(--navy);flex:none}
.topic.done span{text-decoration:line-through;color:#8A98B0}
.row{display:flex;align-items:center;gap:10px;padding:8px 0;border-top:1px solid var(--line);font-size:13.5px}
.row span:first-child{min-width:96px;font-weight:600}.row span:nth-child(2){flex:1}
/* flashcards / timer */
.flip{background:var(--navy);color:#fff;border-radius:var(--r);padding:44px 24px;text-align:center;font-size:19px;font-weight:600;min-height:220px;display:flex;align-items:center;justify-content:center;cursor:pointer}
.flip.ans{background:var(--blue)}
.fc-controls{display:flex;justify-content:space-between;gap:10px;margin-top:14px}
.timer{padding:32px 24px;display:flex;flex-direction:column;justify-content:center}
#pomodoro .split{align-items:stretch}
#fcViewer{min-height:300px}
#timerDisplay{font-size:min(88px,22vw);font-weight:800;text-align:center;margin:30px 0;letter-spacing:-.03em;color:var(--navy)}
.modewrap,.timer-controls{display:flex;gap:8px;justify-content:center;flex-wrap:wrap}
.modewrap button{padding:7px 13px;border-radius:999px;border:1px solid var(--line);background:#fff;font-size:12.5px;font-weight:600;cursor:pointer}
.modewrap button.on{background:var(--navy);color:#fff;border-color:var(--navy)}
.pills{display:flex;gap:8px;flex-wrap:wrap}
.pills button{padding:6px 13px;border-radius:999px;border:1px solid var(--line);background:#fff;font-size:12.5px;font-weight:600;cursor:pointer}
.pills button.on{background:var(--navy);color:#fff;border-color:var(--navy)}
.td{align-items:flex-start}.td input{margin-top:3px}
.td .meta{display:flex;gap:10px;flex-wrap:wrap;font-size:11.5px;margin-top:2px}
.td .meta b{font-weight:700}.td .meta em{font-style:normal;color:var(--mut)}
.prog{display:flex;align-items:center;gap:32px;margin-top:10px;flex:1}.prog .donut{margin:0;flex:none}.prog>div:last-child{flex:1}
@media(max-width:1000px){.dash,.split{grid-template-columns:1fr}.split>.sf{order:-1}.dash>div{display:contents}.dash .card{margin:0}.dash>div:first-child>.card:last-child{order:5}#pomodoro .split>.sf,#flash .split>.sf{order:0}}
@media(max-width:820px){
  #authScreen{grid-template-columns:1fr;gap:24px;padding:24px 16px}.feat{display:none}
  .side{display:none}.main{margin:0;padding:18px 16px 96px}.tabs{display:flex}
}
@media(max-width:520px){#ttLabel{flex:1 1 100%}#addTT{flex:1 1 100%!important}.prog{flex-direction:column;align-items:stretch}.prog .donut{margin:0 auto}.stats{grid-template-columns:1fr 1fr}.top h1{font-size:19px}}
@media(prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}}
/* sidebar collapse + profile */
.logo .collapse{margin-left:auto;border:0;background:none;color:var(--mut);cursor:pointer;padding:5px;border-radius:8px}
.logo .collapse:hover{background:var(--tint)}
.side{transition:width .2s}.main{transition:margin-left .2s}
body.sc .side{width:72px;padding:22px 10px}
body.sc .main{margin-left:72px}
body.sc .side span,body.sc .pep{display:none}
body.sc .logo{flex-direction:column;gap:10px;padding:0 0 18px}
body.sc .logo .collapse{margin:0}
body.sc .nav{justify-content:center;padding:11px 0}
.av{border:0;cursor:pointer;font:inherit;font-weight:700}
#profile .f{display:block}
@media(max-width:820px){body.sc .main{margin-left:0}}
.logo{white-space:nowrap;font-size:16px;gap:8px}
.side .logo{padding-left:6px;padding-right:2px}

/* phase 2: charts, focus, progress */
.chart{display:flex;align-items:flex-end;gap:10px;height:170px}
.col{flex:1;min-width:0;display:flex;flex-direction:column;justify-content:flex-end;align-items:center;gap:6px;height:100%;font-size:11px;color:var(--mut)}
.col i{display:block;width:100%;max-width:38px;border-radius:8px 8px 4px 4px;background:#8FB0F3}
.col .v{font-size:10.5px;font-weight:600;color:var(--ink);white-space:nowrap}
.rec{display:flex;align-items:center;gap:10px;background:var(--tint);border-radius:12px;padding:10px 12px;margin:8px 0 10px;font-size:13px}
.chip.mute{background:var(--line);color:var(--mut)}
.prog.v{flex-direction:column;align-items:stretch}.prog.v .donut{margin:0 auto}
#pgUnits .urow:first-child{border-top:0}
.tabs{overflow-x:auto}.tab{min-width:50px;padding:6px 2px;font-size:10.5px}

#dashWeek,#pgWeek{display:flex;flex-direction:column;flex:1}
.chart{height:auto;flex:1;min-height:170px}
.col{height:auto}
.bw{flex:1;width:100%;min-height:120px;display:flex;flex-direction:column;align-items:center;gap:4px}
.col i{max-width:38px;min-height:4px;flex-basis:0}
.chart{align-items:stretch}

/* phase 3: flashcard decks + spaced repetition */
.badge-num{background:var(--rose);color:#fff;font-size:10px;font-weight:700;border-radius:999px;padding:1px 6px;margin-left:auto}
.tab .badge-num{margin:0 0 0 4px}
.deckgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:14px}
.deck{background:#fff;border:1px solid var(--line);border-radius:var(--r);padding:16px;cursor:pointer;display:flex;flex-direction:column;gap:8px;text-align:left}
.deck:hover{border-color:var(--blue)}
.deck b{font-size:14px}
.deck .due{font-size:11.5px;font-weight:700;color:var(--blue)}
.deck .due.zero{color:var(--mut);font-weight:600}
.backlink{display:inline-flex;align-items:center;gap:6px;color:var(--mut);font-size:12.5px;font-weight:600;background:none;border:0;cursor:pointer;margin-bottom:14px;padding:0}
.backlink:hover{color:var(--ink)}
.cardrow{display:flex;align-items:center;gap:10px;padding:10px 0;border-top:1px solid var(--line);font-size:13px}
.cardrow:first-child{border-top:0}
.cardrow .q{flex:1;min-width:0}
.due-badge{font-size:10.5px;font-weight:700;padding:2px 8px;border-radius:999px;background:var(--tint);color:var(--blue);white-space:nowrap}
.due-badge.over{background:#FDEBEC;color:var(--rose)}
.grade-row{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin-top:16px}
.grade-row button{padding:11px 0;border-radius:10px;border:0;color:#fff;font-weight:700;font-size:13px;cursor:pointer}
.g-again{background:var(--rose)}.g-hard{background:var(--amber)}.g-good{background:var(--teal)}.g-easy{background:var(--blue)}
@media(max-width:520px){.grade-row{grid-template-columns:repeat(2,1fr)}}

/* phase 4: planner month view + exams */
.mgrid{display:grid;grid-template-columns:repeat(7,1fr);gap:4px}
.mhead{margin-bottom:4px;text-align:center;font-size:11px;font-weight:700;color:var(--mut)}
.mcell{aspect-ratio:1;border:1px solid var(--line);border-radius:8px;padding:5px;cursor:pointer;display:flex;flex-direction:column;gap:3px}
.mcell.off{visibility:hidden}
.mcell:hover{border-color:var(--blue)}
.mcell.today{background:var(--tint);border-color:var(--blue)}
.mcell.sel{border-color:var(--navy);border-width:2px}
.mnum{font-size:12px;font-weight:600}
.mdots{display:flex;gap:3px;flex-wrap:wrap;margin-top:auto}
.dot{width:6px;height:6px;border-radius:50%;display:inline-block}
.dot.blue{background:var(--blue)}.dot.rose{background:var(--rose)}.dot.amber{background:var(--amber)}
@media(max-width:640px){.mnum{font-size:10.5px}.mcell{padding:3px;border-radius:6px}}

.examgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:14px}
.exam{background:#fff;border:1px solid var(--line);border-radius:var(--r);padding:16px}
.exam .countdown{font-size:11.5px;font-weight:700;color:var(--blue);padding:2px 8px;background:var(--tint);border-radius:999px;display:inline-block}
.exam .countdown.soon{color:var(--rose);background:#FDEBEC}
.exam .meta2{color:var(--mut);font-size:12.5px;margin:6px 0 10px}
.exam .topiclist label{display:flex;align-items:center;gap:8px;font-size:12.5px;padding:4px 0}
.exam .topiclist input{width:15px;height:15px}

/* phase 5: notes */
.notewrap{display:flex;flex-direction:column;gap:10px;min-height:400px}
.niconbtn{background:none;border:1px solid var(--line);border-radius:8px;width:30px;height:30px;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;color:var(--mut);font-size:14px}
.niconbtn.on{color:var(--gold, #C08A2E);border-color:var(--gold, #C08A2E)}
.ntitle-input{font-family:inherit;font-size:19px;font-weight:700;border:0;outline:none;width:100%;padding:0;background:none}
.nmeta-row{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
.nmeta-row select{max-width:160px}
.ntoolbar{display:flex;gap:4px;flex-wrap:wrap;padding:6px;background:var(--bg2,#F7F8FA);border:1px solid var(--line);border-radius:10px}
.ntoolbar button{background:none;border:0;border-radius:6px;width:30px;height:30px;font-size:13px;font-weight:700;cursor:pointer;color:var(--ink)}
.ntoolbar button:hover{background:var(--line)}
.ncontent{min-height:320px;border:1px solid var(--line);border-radius:10px;padding:16px;outline:none;font-size:14px;line-height:1.6;flex:1}
.ncontent:focus{border-color:var(--blue)}
.ncontent h2{font-size:19px;margin:10px 0 6px}
.ncontent h3{font-size:16px;margin:8px 0 6px}
.ncontent ul,.ncontent ol{padding-left:22px;margin:6px 0}
.ncontent table{border-collapse:collapse;margin:8px 0}
.ncontent td{border:1px solid var(--line);padding:6px 10px;min-width:60px}
.ncontent .chk{display:flex;gap:8px;align-items:flex-start;margin:3px 0}
.ncontent .chk input{margin-top:3px}
.nsavestate{font-size:11.5px;color:var(--mut)}
.notelist{display:flex;flex-direction:column;gap:6px;max-height:560px;overflow-y:auto}
.noteitem{display:flex;gap:8px;align-items:flex-start;padding:10px;border-radius:10px;cursor:pointer;border:1px solid transparent}
.noteitem:hover{background:var(--bg2,#F7F8FA)}
.noteitem.active{background:var(--tint);border-color:var(--blue)}
.noteitem .nbody{flex:1;min-width:0}
.noteitem .ntitle{font-weight:600;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.noteitem .nsnip{font-size:11.5px;color:var(--mut);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:2px}
.noteitem .ntags{display:flex;gap:4px;margin-top:4px}

/* notes extras: fonts, colours, equations, import */
.c-ink{color:var(--ink)}.c-red{color:#dc2626}.c-orange{color:#c2410c}.c-green{color:#15803d}.c-blue{color:#2563eb}.c-purple{color:#7c3aed}.c-gray{color:#6b7280}
.f-sans{font-family:Inter,system-ui,sans-serif}.f-serif{font-family:Georgia,"Times New Roman",serif}.f-mono{font-family:"Courier New",Consolas,monospace}.f-hand{font-family:"Segoe Print","Bradley Hand","Comic Sans MS",cursive}
.ntoolbar2{align-items:center}.ntoolbar2 .lbl{font-size:11.5px;font-weight:700;color:var(--mut);margin:0 2px 0 6px}.ntoolbar2 .lbl:first-child{margin-left:2px}
.ntoolbar2 .sw{width:24px;height:24px;padding:0;border-radius:50%;border:2px solid #fff;box-shadow:0 0 0 1px var(--line)}
.ntoolbar2 .sw:hover,.ntoolbar2 .sw:focus-visible{box-shadow:0 0 0 2px var(--blue)}
@media(max-width:820px){.ntoolbar2 .sw{width:30px;height:30px}.ntoolbar button{min-width:34px;height:34px}}
.neq{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:8px;border:1px solid var(--line);border-radius:10px;background:var(--bg2,#F7F8FA)}
.neq[hidden]{display:none}.neq input{flex:1;min-width:180px}
.eq{font-family:Cambria,"Cambria Math",Georgia,serif;font-style:italic;background:var(--tint);padding:0 5px;border-radius:5px;white-space:nowrap}
.neq .eq{background:none;font-size:15px;min-width:20px}.ncontent sup,.ncontent sub,.neq sup,.neq sub{font-size:.75em;line-height:0}
.ncontent th{border:1px solid var(--line);padding:6px 10px;background:var(--bg2,#F7F8FA);text-align:left}.ncontent td p,.ncontent th p{margin:0}
.sf.drag{outline:2px dashed var(--blue);outline-offset:-4px;background:var(--tint)}
#nImpMsg{margin:0 2px 8px;overflow-wrap:anywhere;font-size:12.5px}#nImpMsg:empty{display:none}
