StudyPlan / index.html
SolarumAsteridion's picture
Update index.html
f739a7c verified
Raw
History Blame Contribute Delete
43.1 kB
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>NSEP 2026 · Study Plan</title>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,400;0,500;0,600;1,400&family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet" />
<style>
:root{
/* Anthropic dark-mode adaptation */
--canvas: #181715;
--surface: #1f1e1b;
--surface-elevated: #252320;
--surface-soft: #23221e;
--primary: #cc785c;
--primary-active: #a9583e;
--primary-soft: rgba(204,120,92,0.12);
--ink: #faf9f5;
--on-dark: #faf9f5;
--on-dark-soft: #a09d96;
--body: #cfc9bd;
--body-strong: #e8e2d9;
--muted: #8e8b82;
--muted-soft: #6c6a64;
--success: #5db872;
--warning: #e8a55a;
--hairline: rgba(250,249,245,0.10);
--hairline-2: rgba(250,249,245,0.18);
--hairline-soft: rgba(250,249,245,0.06);
--r-xs: 4px;
--r-md: 8px;
--r-lg: 12px;
--r-xl: 16px;
--r-pill: 9999px;
--section: 96px;
--gap-xl: 32px;
--gap-lg: 24px;
--gap-md: 16px;
--font-serif: "Cormorant Garamond", Garamond, "Times New Roman", serif;
--font-sans: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
--font-mono: "JetBrains Mono", ui-monospace, Menlo, monospace;
--transition-fast: 150ms cubic-bezier(0.4,0,0.2,1);
--transition-base: 250ms cubic-bezier(0.4,0,0.2,1);
--transition-slow: 400ms cubic-bezier(0.4,0,0.2,1);
}
*{box-sizing:border-box; margin:0;}
html{scroll-behavior:smooth;}
body{
margin:0;
background:var(--canvas);
color:var(--body);
font-family:var(--font-sans);
font-size:16px;
line-height:1.6;
-webkit-font-smoothing:antialiased;
}
::selection{background:var(--primary); color:#fff;}
.wrap{max-width:1160px; margin:0 auto; padding:0 24px;}
/* Typography */
.eyebrow{
font-family:var(--font-mono);
font-size:11px;
letter-spacing:2.5px;
text-transform:uppercase;
color:var(--primary);
margin:0 0 14px;
}
h1,h2,h3{
font-family:var(--font-serif);
color:var(--ink);
margin:0;
line-height:1.05;
font-weight:400;
letter-spacing:-0.02em;
}
h1{font-size:clamp(44px,7vw,80px); letter-spacing:-1.5px;}
h2{font-size:clamp(28px,4vw,46px); letter-spacing:-0.8px; margin-bottom:10px;}
h3{font-size:clamp(20px,2.5vw,28px); letter-spacing:-0.3px;}
p{margin:0 0 12px;}
/* Hero */
.hero{
padding:var(--section) 0 56px;
background:
radial-gradient(900px 420px at 85% -10%, rgba(204,120,92,0.18), transparent 60%),
linear-gradient(180deg, #1f1e1b, #181715 72%);
border-bottom:1px solid var(--hairline);
position:relative;
text-align:center;
}
.hero h1{font-weight:400; color:var(--ink);}
.hero h1 .stamp{color:var(--primary);}
/* Countdown */
.countdown-row{
display:flex;
gap:18px;
margin-top:28px;
flex-wrap:wrap;
justify-content:center;
}
.countdown-unit{
background:var(--surface);
border:1px solid var(--hairline);
border-radius:var(--r-lg);
padding:18px 22px;
min-width:88px;
text-align:center;
transition:transform var(--transition-base), border-color var(--transition-base);
}
.countdown-unit:hover{transform:translateY(-2px); border-color:var(--hairline-2);}
.countdown-val{
font-family:var(--font-sans);
font-size:clamp(32px,4vw,48px);
color:var(--ink);
line-height:1;
letter-spacing:-1px;
font-weight:600;
}
.countdown-lbl{
font-family:var(--font-mono);
font-size:10px;
letter-spacing:1.5px;
text-transform:uppercase;
color:var(--muted);
margin-top:8px;
}
.countdown-sep{
font-family:var(--font-sans);
font-size:36px;
color:var(--muted-soft);
align-self:center;
line-height:1;
font-weight:300;
}
/* Progress bar */
.progress-wrap{
margin-top:28px;
max-width:640px;
margin-left:auto;
margin-right:auto;
}
.progress-bar-shell{
background:var(--surface);
border:1px solid var(--hairline);
border-radius:var(--r-pill);
height:14px;
overflow:hidden;
position:relative;
}
.progress-bar-fill{
height:100%;
width:0%;
background:linear-gradient(90deg, var(--primary), #e08a6e);
border-radius:var(--r-pill);
transition:width .8s cubic-bezier(0.22,1,0.36,1);
position:relative;
}
.progress-bar-fill::after{
content:"";
position:absolute;
inset:0;
background:linear-gradient(90deg, transparent, rgba(255,255,255,0.22), transparent);
animation:shimmer 3s infinite;
}
@keyframes shimmer{
0%{transform:translateX(-100%);}
100%{transform:translateX(100%);}
}
.progress-pct{
position:absolute;
right:10px;
top:50%;
transform:translateY(-50%);
font-family:var(--font-sans);
font-size:10px;
font-weight:600;
color:#fff;
text-shadow:0 1px 2px rgba(0,0,0,0.4);
opacity:0;
transition:opacity .4s;
pointer-events:none;
}
.progress-bar-shell:hover .progress-pct,
.progress-pct.visible{opacity:1;}
.progress-meta{
display:flex;
justify-content:center;
align-items:center;
flex-wrap:wrap;
gap:12px;
margin-top:12px;
}
.progress-label{
font-family:var(--font-mono);
font-size:12px;
color:var(--muted);
}
.streak-badge{
font-family:var(--font-mono);
font-size:12px;
background:var(--primary-soft);
color:var(--primary);
border:1px solid rgba(204,120,92,0.25);
border-radius:var(--r-pill);
padding:5px 12px;
display:inline-flex;
align-items:center;
gap:6px;
}
.streak-dot{
width:6px; height:6px;
background:var(--primary);
border-radius:50%;
animation:pulse 2s infinite;
}
@keyframes pulse{
0%,100%{opacity:1; transform:scale(1);}
50%{opacity:0.6; transform:scale(0.85);}
}
/* Trimmed note */
.trim{
background:var(--surface-elevated);
border:1px solid var(--hairline);
border-left:3px solid var(--primary);
border-radius:var(--r-md);
padding:18px 22px;
font-size:14px;
color:var(--body);
line-height:1.65;
transition:box-shadow var(--transition-base);
}
.trim:hover{box-shadow:0 1px 3px rgba(20,20,19,0.12);}
.trim .k{
font-family:var(--font-mono);
font-size:10.5px;
letter-spacing:1.5px;
text-transform:uppercase;
color:var(--primary);
display:block;
margin-bottom:10px;
}
.trim ul{
margin:0;
padding-left:18px;
list-style:disc;
}
.trim li{
margin-bottom:6px;
padding-left:4px;
}
.trim li::marker{color:var(--muted-soft);}
/* Sections */
section{padding:var(--section) 0;}
section + section{padding-top:0;}
/* Bar (section header) */
.bar{
display:flex;
align-items:flex-end;
justify-content:space-between;
gap:14px;
flex-wrap:wrap;
margin-bottom:var(--gap-lg);
}
.bar-left{flex:1; min-width:220px;}
/* Buttons */
.btn{
font-family:var(--font-sans);
font-size:14px;
font-weight:500;
line-height:1;
border-radius:var(--r-md);
padding:10px 18px;
height:40px;
cursor:pointer;
display:inline-flex;
align-items:center;
gap:8px;
transition:all var(--transition-fast);
border:1px solid transparent;
background:none;
color:var(--on-dark-soft);
}
.btn:hover{color:var(--body);}
.btn-primary{
background:var(--primary);
color:#fff;
border-color:var(--primary);
}
.btn-primary:hover{background:var(--primary-active); border-color:var(--primary-active);}
.btn-ghost{
background:var(--surface);
border:1px solid var(--hairline);
color:var(--on-dark-soft);
}
.btn-ghost:hover{border-color:var(--primary); color:var(--primary); background:var(--primary-soft);}
/* Mini text */
.mini{
font-family:var(--font-sans);
font-size:14px;
color:var(--muted);
line-height:1.6;
margin-bottom:22px;
}
.mini b{color:var(--body-strong); font-weight:500;}
/* Phase band */
.phase-band{
margin:32px 0 14px;
font-family:var(--font-mono);
font-size:11px;
letter-spacing:2px;
text-transform:uppercase;
color:var(--primary);
opacity:0;
transform:translateY(8px);
animation:fadeUp .6s forwards;
}
/* Week accordion */
.week{
background:var(--surface);
border:1px solid var(--hairline);
border-radius:var(--r-lg);
margin-bottom:12px;
overflow:hidden;
transition:border-color var(--transition-base), box-shadow var(--transition-base);
opacity:0;
transform:translateY(12px);
}
.week.visible{
opacity:1;
transform:translateY(0);
transition:opacity .5s, transform .5s, border-color var(--transition-base), box-shadow var(--transition-base);
}
.week:hover{border-color:var(--hairline-2);}
.week.current-week{
border-color:rgba(204,120,92,0.35);
box-shadow:0 0 0 1px rgba(204,120,92,0.10), 0 4px 20px rgba(0,0,0,0.25);
}
.week-head{
display:flex;
align-items:center;
gap:14px;
padding:18px 22px;
cursor:pointer;
user-select:none;
position:relative;
}
.week-head::before{
content:"";
position:absolute;
left:0; top:0; bottom:0;
width:3px;
background:transparent;
transition:background var(--transition-fast);
}
.week.current-week .week-head::before{background:var(--primary);}
.week-head:hover{background:rgba(250,249,245,0.02);}
.week-num{
font-family:var(--font-sans);
font-size:11px;
color:var(--primary);
border:1px solid rgba(204,120,92,0.3);
border-radius:var(--r-pill);
padding:5px 11px;
white-space:nowrap;
flex-shrink:0;
font-weight:500;
}
.week-title{
font-family:var(--font-sans);
font-size:16px;
font-weight:500;
color:var(--ink);
flex:1;
letter-spacing:0;
line-height:1.35;
}
.week-meta{
font-family:var(--font-mono);
font-size:11px;
color:var(--muted);
white-space:nowrap;
flex-shrink:0;
}
.week-prog-ring{
flex-shrink:0;
width:36px; height:36px;
position:relative;
}
.week-prog-ring svg{transform:rotate(-90deg);}
.week-prog-ring .ring-bg{fill:none; stroke:var(--hairline); stroke-width:3;}
.week-prog-ring .ring-fill{
fill:none; stroke:var(--primary);
stroke-width:3; stroke-linecap:round;
transition:stroke-dashoffset .6s cubic-bezier(0.22,1,0.36,1);
}
.week-prog-ring .ring-center{
position:absolute;
inset:0;
display:flex;
align-items:center;
justify-content:center;
font-family:var(--font-sans);
font-size:9px;
color:var(--muted);
font-weight:500;
}
.week-arrow{
color:var(--muted);
transition:transform var(--transition-base);
font-size:13px;
flex-shrink:0;
width:20px; text-align:center;
}
.week.open .week-arrow{transform:rotate(90deg);}
/* Week body */
.week-body{
max-height:0;
overflow:hidden;
transition:max-height var(--transition-slow), opacity var(--transition-base);
opacity:0;
padding:0 22px;
}
.week.open .week-body{
opacity:1;
padding-bottom:18px;
}
/* Day row */
.day-row{
display:flex;
gap:14px;
padding:12px 0;
border-top:1px solid var(--hairline-soft);
align-items:flex-start;
opacity:0;
transform:translateX(-6px);
transition:opacity .35s, transform .35s;
}
.week.open .day-row.visible{
opacity:1;
transform:translateX(0);
}
.day-row.today-highlight{
background:rgba(204,120,92,0.06);
margin:0 -22px;
padding-left:22px;
padding-right:22px;
border-radius:var(--r-md);
border-top-color:transparent;
}
.day-name{
font-family:var(--font-mono);
font-size:11px;
color:var(--primary);
width:54px;
flex-shrink:0;
padding-top:2px;
}
.task{display:flex; align-items:flex-start; gap:10px; flex:1;}
.task input{
appearance:none; -webkit-appearance:none;
width:18px; height:18px;
margin:2px 0 0;
border:1.6px solid var(--hairline-2);
border-radius:5px;
background:var(--canvas);
cursor:pointer;
flex-shrink:0;
position:relative;
transition:border-color var(--transition-fast), background var(--transition-fast);
}
.task input:hover{border-color:var(--primary);}
.task input:checked{
background:var(--primary);
border-color:var(--primary);
box-shadow:0 0 0 3px rgba(204,120,92,0.12);
}
.task input:checked::after{
content:"✓";
position:absolute; inset:0;
display:flex; align-items:center; justify-content:center;
color:#fff; font-size:11px; font-weight:700;
}
.task label{font-size:14px; color:var(--body); cursor:pointer; line-height:1.55; transition:color var(--transition-fast);}
.task input:checked + label{color:var(--muted-soft); text-decoration:line-through;}
.task label .h{color:var(--body-strong); font-weight:500;}
/* Engine / Cards */
.engine{display:grid; grid-template-columns:1fr 1fr; gap:18px;}
.card{
background:var(--surface);
border:1px solid var(--hairline);
border-radius:var(--r-lg);
padding:var(--gap-xl);
transition:border-color var(--transition-base), transform var(--transition-base);
}
.card:hover{border-color:var(--hairline-2); transform:translateY(-2px);}
.card h3{font-family:var(--font-sans); font-size:18px; font-weight:500; letter-spacing:0; margin-bottom:14px; line-height:1.3;}
.card h3.coral{color:var(--primary);}
.card h3.green{color:var(--success);}
.code-block{
background:var(--canvas);
border:1px solid var(--hairline);
border-radius:var(--r-md);
padding:18px;
font-family:var(--font-mono);
font-size:13px;
color:var(--body);
line-height:1.7;
position:relative;
overflow-x:auto;
}
.code-block .c{color:var(--muted);}
.code-block .o{color:var(--primary);}
.code-block .g{color:var(--success);}
/* Footer */
footer{
border-top:1px solid var(--hairline);
padding:48px 0 56px;
text-align:center;
}
footer p{color:var(--muted); font-size:12px; font-family:var(--font-mono);}
/* Animations */
@keyframes fadeUp{
to{opacity:1; transform:translateY(0);}
}
/* Responsive */
@media(max-width:760px){
:root{--section:64px;}
.engine{grid-template-columns:1fr;}
.countdown-row{gap:10px;}
.countdown-unit{padding:14px 14px; min-width:68px;}
.countdown-sep{display:none;}
.week-head{padding:14px 16px; gap:10px;}
.week-title{font-size:14px;}
.week-meta{display:none;}
.week-body{padding:0 16px;}
.day-row.today-highlight{margin:0 -16px; padding-left:16px; padding-right:16px;}
.progress-meta{flex-direction:column; align-items:center;}
}
</style>
</head>
<body>
<header class="hero">
<div class="wrap">
<h1>Study<span class="stamp">.</span>Plan</h1>
<div class="countdown-row" id="countdownRow">
<div class="countdown-unit"><div class="countdown-val" id="cdDays">--</div><div class="countdown-lbl">days</div></div>
<div class="countdown-sep">·</div>
<div class="countdown-unit"><div class="countdown-val" id="cdHours">--</div><div class="countdown-lbl">hours</div></div>
<div class="countdown-sep">·</div>
<div class="countdown-unit"><div class="countdown-val" id="cdMins">--</div><div class="countdown-lbl">minutes</div></div>
<div class="countdown-sep">·</div>
<div class="countdown-unit"><div class="countdown-val" id="cdSecs">--</div><div class="countdown-lbl">seconds</div></div>
</div>
<div class="progress-wrap">
<div class="progress-bar-shell">
<div class="progress-bar-fill" id="globalBar"></div>
<span class="progress-pct" id="globalPct">0%</span>
</div>
<div class="progress-meta">
<div class="progress-label" id="globalLabel">0% — tick day-tasks; saves on this device.</div>
<div class="streak-badge" id="streakBadge" style="display:none;"><span class="streak-dot"></span><span id="streakText">0-day streak</span></div>
</div>
</div>
</div>
</header>
<!-- TRIMMED NOTE -->
<section style="padding-top:34px;">
<div class="wrap">
<div class="trim">
<span class="k">Skipped (low NSEP yield)</span>
<ul>
<li>Error Analysis (Ch 25)</li>
<li>Magnetism &amp; Matter deep parts (hysteresis / domain theory)</li>
<li>Deep single-slit diffraction &amp; resolving-power derivations</li>
</ul>
</div>
</div>
</section>
<!-- THE PLAN -->
<section id="weeks">
<div class="wrap">
<div class="bar">
<div class="bar-left">
<p class="eyebrow">24-week schedule</p>
<h2>The plan</h2>
</div>
<button class="btn btn-ghost" onclick="resetAll()">↺ Reset</button>
</div>
<p class="mini">Class 11 first (Wk 1–5, in sync with coaching), then Class 12 (Wk 6–16). Every day = <b>theory + questions together</b> — learn a sub-topic, then immediately solve it. The current week is highlighted.</p>
<div id="weekHost"></div>
</div>
</section>
<footer>
<div class="wrap"><p>NSEP 2026 · tick the boxes, trust the loop · weightage from real 2022–25 papers</p></div>
</footer>
<script>
/* ===================== DATA ===================== */
const PHASE={
0:{label:"Phase 0 · Class 11 (in sync with coaching + your modules)", color:"#cc785c"},
1:{label:"Phase 1 · Class 12 (self-study, high-yield first)", color:"#cc785c"},
2:{label:"Phase 2 · Mixed drill + reinforce", color:"#5b8def"},
3:{label:"Phase 3 · Peak · Papers & mocks", color:"#5db872"}
};
const WEEKS=[
{n:1,phase:0,title:"Rigid Body Dynamics + Centre of Mass",meta:"Class 11 · with coaching · very high",days:[
["Mon","<span class='h'>COM</span> — theory: two-particle &amp; rigid-body COM, COM motion → then solve COM problems"],
["Tue","<span class='h'>Torque &amp; angular momentum</span> — concept + conservation → solve problems"],
["Wed","<span class='h'>Moment of inertia</span> — radius of gyration, parallel/perp axes → solve MoI problems"],
["Thu","<span class='h'>Rolling</span> — rolling without slipping, on incline → solve rolling problems"],
["Fri","<span class='h'>Collisions</span> 1D/2D + COM (A2 favourite) — recap + mixed problem set"],
["Sat","Extra DPP: rolling + collisions; revise COM formulas"],
["Sun","<span class='h'>Engine:</span> timed rotation+COM test; formula sheet; error log"]
]},
{n:2,phase:0,title:"Fluids + SHM",meta:"Class 11 · studied · high",days:[
["Mon","<span class='h'>Fluids</span> — Pascal, pressure, buoyancy: quick recap → solve problems"],
["Tue","<span class='h'>Fluids</span> — Bernoulli, viscosity, terminal velocity → solve problems"],
["Wed","<span class='h'>Surface tension</span> — excess pressure, capillary: formula revise → solve problems"],
["Thu","<span class='h'>SHM</span> — equation, energy, spring-mass: recap → solve problems"],
["Fri","<span class='h'>SHM</span> — pendulum, combinations → mixed fluids+SHM set"],
["Sat","Extra DPP: Bernoulli + SHM energy"],
["Sun","<span class='h'>Engine:</span> timed test; formula sheet; error log"]
]},
{n:3,phase:0,title:"Waves",meta:"Class 11 · NEW · high",days:[
["Mon","<span class='h'>Wave basics</span> — transverse/longitudinal, speed, y(x,t): NCERT+module → solve"],
["Tue","<span class='h'>Speed &amp; superposition</span> — string/sound, reflection → solve problems"],
["Wed","<span class='h'>Standing waves</span> — strings, organ pipes, harmonics → solve problems"],
["Thu","<span class='h'>Beats</span> — theory → solve; start Doppler"],
["Fri","<span class='h'>Doppler effect</span> — all cases → full Ch 11 mixed set"],
["Sat","Extra DPP: standing waves, Doppler, beats"],
["Sun","<span class='h'>Engine:</span> Ch 11 self-test, formula sheet, error log"]
]},
{n:4,phase:0,title:"Mechanics drill — Kinematics, NLM, WEP",meta:"Class 11 · studied · medium-high",days:[
["Mon","<span class='h'>Kinematics</span> — quick recap → hardest module problems"],
["Tue","<span class='h'>NLM</span> — friction, circular dynamics → solve problems"],
["Wed","<span class='h'>WEP</span> — work-energy theorem, vertical circle → solve (high yield!)"],
["Thu","<span class='h'>Power &amp; variable force</span> — recap → solve problems"],
["Fri","Mixed Kinematics+NLM+WEP problem set"],
["Sat","Extra DPP: WEP + collisions mixed"],
["Sun","<span class='h'>Engine:</span> timed mechanics test; error log"]
]},
{n:5,phase:0,title:"Thermo + Heat + KTG + Gravitation gap",meta:"Class 11 · studied · medium",days:[
["Mon","<span class='h'>Thermodynamics</span> — 1st law, processes: recap → solve problems"],
["Tue","<span class='h'>Engines, 2nd law</span> + heat transfer (conduction) → solve problems"],
["Wed","<span class='h'>KTG</span> (studied) — rms speed, equipartition: quick → solve problems"],
["Thu","<span class='h'>Gravitation gap</span> — special-body potential/field (sphere, shell, ring, hemisphere) derivations → solve"],
["Fri","Gravitation — binary stars, satellite energy, cavity → mixed thermal+grav set"],
["Sat","Extra DPP: thermodynamics + gravitation"],
["Sun","<span class='h'>Milestone:</span> Class 11 done! Half-length Class-11 self-test; error log"]
]},
{n:6,phase:1,title:"Electrostatic Potential & Capacitance — Part 1",meta:"Class 12 · NEW · very high",days:[
["Mon","<span class='h'>Potential</span> — point charge, dipole, system: NCERT+module → solve"],
["Tue","<span class='h'>Equipotentials &amp; PE</span> — PE of charges, E = −dV/dr → solve problems"],
["Wed","<span class='h'>Dipole in field</span> — PE, conductors/dielectrics → solve problems"],
["Thu","<span class='h'>Capacitance</span> — parallel-plate with/without dielectric → solve"],
["Fri","Potential + capacitance mixed problem set"],
["Sat","Extra DPP: potential & potential-energy problems"],
["Sun","<span class='h'>Engine:</span> self-test, formula sheet, error log"]
]},
{n:7,phase:1,title:"Capacitance Part 2 + Charges & Fields drill",meta:"Class 12 · very high / Ch 12 drill",days:[
["Mon","<span class='h'>Capacitor networks</span> — series/parallel: concept → solve networks"],
["Tue","<span class='h'>Energy stored</span> — tricky network problems → solve"],
["Wed","<span class='h'>Gauss's law (studied)</span> — wire/sheet/shell: recap → solve problems"],
["Thu","Coulomb, field, flux — straight to harder problems"],
["Fri","Electrostatics full mixed set (NSEP #1 chapter)"],
["Sat","Extra DPP: capacitor networks + Gauss"],
["Sun","<span class='h'>Engine:</span> Ch 13+12 self-test, formula sheets, error log"]
]},
{n:8,phase:1,title:"Current Electricity — Part 1",meta:"Class 12 · NEW · high",days:[
["Mon","<span class='h'>Current &amp; Ohm's law</span> — drift velocity, mobility, resistivity → solve"],
["Tue","<span class='h'>V–I, temperature, colour code</span> → solve problems"],
["Wed","<span class='h'>Resistor networks</span> — series/parallel → solve equivalent-R problems"],
["Thu","<span class='h'>EMF &amp; internal resistance</span> — cells combos → solve problems"],
["Fri","Resistance-network mixed problem set"],
["Sat","Extra DPP: Ohm's law + resistivity numericals"],
["Sun","<span class='h'>Engine:</span> finish set, formula sheet, mini-test, error log"]
]},
{n:9,phase:1,title:"Current Electricity — Part 2",meta:"Class 12 · NEW · high",days:[
["Mon","<span class='h'>Kirchhoff's laws</span> — KCL/KVL: concept → worked loops"],
["Tue","<span class='h'>Wheatstone + metre bridge</span> → solve problems"],
["Wed","<span class='h'>Potentiometer</span> — EMF compare, internal R → solve problems"],
["Thu","<span class='h'>Power, energy, heating</span>, instruments → solve problems"],
["Fri","Full Ch 14 mixed set"],
["Sat","Extra DPP: Kirchhoff + Wheatstone/potentiometer"],
["Sun","<span class='h'>Engine:</span> Ch 14 self-test, formula sheet, error log"]
]},
{n:10,phase:1,title:"Moving Charges & Magnetism — Part 1",meta:"Class 12 · NEW · very high",days:[
["Mon","<span class='h'>Lorentz force</span> — motion in B (circular/helical), cyclotron → solve"],
["Tue","<span class='h'>Biot–Savart</span> — field of circular loop → solve problems"],
["Wed","<span class='h'>Ampère's law</span> — wire, solenoid, toroid → solve problems"],
["Thu","<span class='h'>Force on conductor</span> — parallel wires (ampere defn) → solve"],
["Fri","Biot–Savart + Ampère mixed set"],
["Sat","Extra DPP: Biot–Savart + Ampère numericals"],
["Sun","<span class='h'>Engine:</span> finish set, formula sheet, mini-test, error log"]
]},
{n:11,phase:1,title:"Magnetism Part 2 + Magnetism & Matter core",meta:"Class 12 · very high / Ch 16 trimmed",days:[
["Mon","<span class='h'>Torque on loop</span> — magnetic moment → solve problems"],
["Tue","<span class='h'>Galvanometer</span> → ammeter/voltmeter conversion → solve"],
["Wed","Combined E &amp; B problems → solve"],
["Thu","<span class='h'>Ch 16 core</span> — bar magnet as dipole, axis/equator field, earth's magnetism (skip hysteresis/domains) → solve"],
["Fri","Ch 15 + 16 core mixed set"],
["Sat","Extra DPP: torque on loop + galvanometer; revise Ch 16 core"],
["Sun","<span class='h'>Engine:</span> Ch 15+16 self-test, formula sheets, error log"]
]},
{n:12,phase:1,title:"Electromagnetic Induction (FULL — high yield)",meta:"Class 12 · NEW · every year",days:[
["Mon","<span class='h'>Flux &amp; Faraday</span> — Lenz's law, motional EMF → solve problems"],
["Tue","<span class='h'>Self &amp; mutual induction</span> — eddy currents → solve problems"],
["Wed","<span class='h'>LR circuits</span> — energy in inductor, growth/decay → solve"],
["Thu","<span class='h'>Induced E-field</span> — rod/loop/ring problems (NSEP loves these) → solve"],
["Fri","Full Ch 17 mixed set — don't skip"],
["Sat","Extra DPP: EMI — induced EMF, LR circuits, rod/loop"],
["Sun","<span class='h'>Engine:</span> Ch 17 self-test, formula sheet, error log"]
]},
{n:13,phase:1,title:"Ray Optics",meta:"Class 12 · studied · very high",days:[
["Mon","<span class='h'>Mirrors</span> — mirror formula: recap → solve problems"],
["Tue","<span class='h'>Refraction</span> — plane &amp; spherical surfaces, TIR, fibres → solve"],
["Wed","<span class='h'>Lenses</span> — lensmaker, combinations, power → solve problems"],
["Thu","<span class='h'>Prism &amp; instruments</span> — dispersion, microscope/telescope → solve"],
["Fri","Heavy Ray Optics problem set"],
["Sat","Extra DPP: lenses + prism + instruments"],
["Sun","<span class='h'>Engine:</span> timed optics test; error log"]
]},
{n:14,phase:1,title:"Semiconductors + EM Waves",meta:"Class 12 · NEW · Ch 24 / Ch 19 easy",days:[
["Mon","<span class='h'>Energy bands</span> — intrinsic/extrinsic: theory → solve problems"],
["Tue","<span class='h'>p–n junction</span> — bias, I–V, rectifier → solve problems"],
["Wed","<span class='h'>Special diodes</span> — LED, photodiode, solar, Zener → solve"],
["Thu","<span class='h'>EM Waves (Ch 19)</span> — displacement current, spectrum, uses: fast facts → solve"],
["Fri","Ch 24 + 19 mixed set"],
["Sat","Extra DPP: diode/rectifier + EM-spectrum facts"],
["Sun","<span class='h'>Engine:</span> Ch 24+19 self-test, formula sheets, error log"]
]},
{n:15,phase:1,title:"Alternating Current (light) + Wave Optics (core)",meta:"Class 12 · Ch 18 LOW / Ch 21 core",days:[
["Mon","<span class='h'>AC core (low yield)</span> — peak/RMS, reactance, impedance, LCR + resonance → solve"],
["Tue","AC power, power factor; generator &amp; transformer — quick → solve, move on"],
["Wed","<span class='h'>Wave Optics core</span> — Huygens, interference, YDSE + fringe width → solve"],
["Thu","Single-slit basics + polarization (Malus/Brewster). Skip deep diffraction → solve YDSE"],
["Fri","YDSE + AC mixed problem set"],
["Sat","Extra DPP: LCR resonance + YDSE"],
["Sun","<span class='h'>Engine:</span> Ch 18+21 self-test, formula sheets, error log"]
]},
{n:16,phase:1,title:"Modern Physics + Radioactivity",meta:"Class 12 · studied · very high",days:[
["Mon","<span class='h'>Photoelectric effect</span> — Einstein eqn, stopping potential → solve"],
["Tue","<span class='h'>Bohr model</span> — hydrogen-like atoms, spectra → solve problems"],
["Wed","<span class='h'>Matter waves, X-rays</span> — de Broglie → solve problems"],
["Thu","<span class='h'>Radioactivity</span> — decay law, half-life, mass-energy → solve"],
["Fri","Modern physics + nuclear mixed set"],
["Sat","Extra DPP: photoelectric + Bohr + nuclear"],
["Sun","<span class='h'>Milestone:</span> whole syllabus covered! Full half-length mock + error audit"]
]},
{n:17,phase:2,title:"Re-drill — Electrostatics + Current + Magnetism",meta:"reinforce · highest yield",days:[
["Mon","Ch 13 Electrostatics+Capacitance — tough networks (NSEP #1)"],
["Tue","Ch 14 Current Electricity — tough mixed set"],
["Wed","Ch 15 Magnetism — tough mixed set"],
["Thu","Ch 17 EMI — tough set (high yield)"],
["Fri","Full EM-block mixed PYQ"],
["Sat","Extra DPP: electrostatics + EMI tough mix"],
["Sun","<span class='h'>Engine:</span> timed EM test; error log"]
]},
{n:18,phase:2,title:"Re-drill — Mechanics + Rotation + Waves/Optics",meta:"reinforce",days:[
["Mon","Rotation hard set (A2-style) — rolling, angular momentum"],
["Tue","WEP + collisions + fluids tough mix"],
["Wed","Ch 11 Waves — Doppler/organ pipes tough DPP"],
["Thu","Ch 21 Wave Optics + Ch 20 Ray Optics mix"],
["Fri","Mixed Class-11 + optics PYQ"],
["Sat","Extra DPP: waves + wave optics mix"],
["Sun","<span class='h'>Engine:</span> full half-length mock; error log"]
]},
{n:19,phase:3,title:"NSEP Past Papers I",meta:"PEAK · mocks",days:[
["Mon","Full NSEP past paper (untimed, learn the style)"],
["Tue","Deep analysis: every wrong/guessed Q → error log"],
["Wed","Targeted practice on 2 weakest chapters"],
["Thu","NSEP past paper (timed, 2 hrs)"],
["Fri","Analysis + formula-sheet revision"],
["Sat","Extra past-paper section (timed) + analysis"],
["Sun","<span class='h'>Engine:</span> 1 more full paper timed + error-log review"]
]},
{n:20,phase:3,title:"Full Mocks + error repair",meta:"PEAK · mocks",days:[
["Mon","Full-syllabus timed mock"],
["Tue","Analyse; rebuild top-5 error patterns"],
["Wed","Targeted drill on weak topics"],
["Thu","Second timed mock"],
["Fri","Analysis + fast pass of all formula sheets"],
["Sat","Extra full-syllabus section mock + analysis"],
["Sun","<span class='h'>Engine:</span> negative-marking / confidence-calibration drill"]
]},
{n:21,phase:3,title:"Weak-area deep work + Advanced edge",meta:"PEAK · targeted",days:[
["Mon","Deep-dive weakest chapter #1"],
["Tue","Deep-dive weakest chapter #2"],
["Wed","Selected INPhO-flavour problems (Advanced stretch)"],
["Thu","High-yield focus: Electrostatics + Rotation + Optics hard set"],
["Fri","Mini timed test on weak areas"],
["Sat","Extra weak-area problem set"],
["Sun","<span class='h'>Engine:</span> full timed mock + error log"]
]},
{n:22,phase:3,title:"Past Papers II + full revision",meta:"PEAK · polish",days:[
["Mon","NSEP past paper (timed) — track score trend"],
["Tue","Analysis + NCERT 12 fact re-skim (EM waves, semiconductors, magnetism)"],
["Wed","Revise full formula binder — Class 11 half"],
["Thu","Revise full formula binder — Class 12 half"],
["Fri","Final mixed PYQ; error-log cleanup"],
["Sat","Revise formula binder — quick full pass"],
["Sun","<span class='h'>Engine:</span> one full paper at the real exam time slot"]
]},
{n:23,phase:3,title:"Buffer / overflow week",meta:"PEAK · flex",days:[
["Mon","Reserved: any chapter that slipped"],
["Tue","Reserved: extra mock if on track"],
["Wed","Targeted weak-topic repair"],
["Thu","Light past-paper section practice"],
["Fri","Formula sheets + error log"],
["Sat","Extra mock section / weak-topic repair"],
["Sun","<span class='h'>Engine:</span> full mock + analysis"]
]},
{n:24,phase:3,title:"Exam Week — taper & sharpen",meta:"PEAK · D-day",days:[
["Mon","Light: 1 past paper + analysis, no new topics"],
["Tue","Formula sheets + error log only"],
["Wed","Half paper at exam slot; calculator practice"],
["Thu","NCERT highlights skim; organise admit card"],
["Fri","Very light revision; early sleep"],
["Sat","Taper — rest"],
["Sun","<span class='h'>EXAM DAY</span> · two-pass strategy, manage negatives 🎯"]
]}
];
/* ===================== RENDER ===================== */
const host=document.getElementById('weekHost');
let lastPhase=-1;
function buildWeeks(){
const todayName = new Date().toLocaleDateString('en-US',{weekday:'short'});
WEEKS.forEach((w, wi)=>{
if(w.phase!==lastPhase){
lastPhase=w.phase;
const band=document.createElement('div');
band.className='phase-band';
band.style.color=PHASE[w.phase].color;
band.textContent=PHASE[w.phase].label;
host.appendChild(band);
}
const el=document.createElement('div');
el.className='week';
el.dataset.weekIndex = wi;
// Determine if this is the "current" week based on assumed start ~June 8, 2026 (roughly 24 weeks before Nov 23)
// Actually let's compute from exam date backwards, or just assume week 1 starts ~June 8, 2026
const examDate = new Date('2026-11-23');
const msPerWeek = 7*24*60*60*1000;
const startDate = new Date(examDate.getTime() - 24*msPerWeek);
const now = new Date();
const currentWeekIndex = Math.max(0, Math.min(23, Math.floor((now - startDate) / msPerWeek)));
if (wi === currentWeekIndex) {
el.classList.add('current-week');
}
// SVG ring progress
const ringSvg = `
<svg width="36" height="36" viewBox="0 0 36 36">
<circle class="ring-bg" cx="18" cy="18" r="14"></circle>
<circle class="ring-fill" cx="18" cy="18" r="14"
stroke-dasharray="87.96" stroke-dashoffset="87.96" id="ring-${w.n}"></circle>
</svg>
<div class="ring-center" id="ringtxt-${w.n}">0/7</div>
`;
const tasks=w.days.map((d,i)=>{
const id="w"+w.n+"d"+i;
const dayShort = d[0].slice(0,3);
const isToday = dayShort === todayName.slice(0,3);
return `<div class="day-row ${isToday ? 'today-highlight' : ''}">
<div class="day-name">${d[0]}</div>
<div class="task">
<input type="checkbox" id="${id}" data-week="${w.n}">
<label for="${id}">${d[1]}</label>
</div>
</div>`;
}).join('');
el.innerHTML = `
<div class="week-head" onclick="toggleWeek(this)">
<span class="week-num">WK ${w.n}</span>
<span class="week-title">${w.title}</span>
<span class="week-meta">${w.meta}</span>
<div class="week-prog-ring">${ringSvg}</div>
<span class="week-arrow">▶</span>
</div>
<div class="week-body">${tasks}</div>
`;
host.appendChild(el);
// Open current week
if(wi === currentWeekIndex){
setTimeout(()=>{
el.classList.add('open');
el.querySelector('.week-body').style.maxHeight = el.querySelector('.week-body').scrollHeight + 'px';
revealDayRows(el);
}, 300);
}
});
}
function toggleWeek(head){
const week = head.parentElement;
const body = week.querySelector('.week-body');
const isOpen = week.classList.contains('open');
if(isOpen){
body.style.maxHeight = body.scrollHeight + 'px';
requestAnimationFrame(()=>{
week.classList.remove('open');
body.style.maxHeight = '0px';
});
} else {
week.classList.add('open');
body.style.maxHeight = body.scrollHeight + 'px';
setTimeout(()=>{
if(week.classList.contains('open')) body.style.maxHeight = 'none';
}, 400);
revealDayRows(week);
}
}
function revealDayRows(week){
const rows = week.querySelectorAll('.day-row');
rows.forEach((row, i)=>{
setTimeout(()=>row.classList.add('visible'), i*50);
});
}
/* ===================== STATE ===================== */
const KEY="nsep170v4";
function load(){try{return JSON.parse(localStorage.getItem(KEY))||{};}catch(e){return{}}}
function save(s){localStorage.setItem(KEY,JSON.stringify(s));}
let state=load();
function bindChecks(){
document.querySelectorAll('input[type=checkbox]').forEach(cb=>{
if(state[cb.id]) cb.checked=true;
cb.addEventListener('change', ()=>{
state[cb.id]=cb.checked;
save(state);
refresh();
if(cb.checked) celebrateCheck(cb);
});
});
}
function refresh(){
const b=[...document.querySelectorAll('input[data-week]')];
const done=b.filter(x=>x.checked).length;
const pct=Math.round(done/b.length*100);
document.getElementById('globalBar').style.width=pct+"%";
document.getElementById('globalPct').textContent = pct + "%";
if(pct > 0) document.getElementById('globalPct').classList.add('visible');
document.getElementById('globalLabel').textContent=pct+"% complete · "+done+"/"+b.length+" day-tasks · saves on this device.";
// Week rings
WEEKS.forEach(w=>{
const bs=[...document.querySelectorAll('input[data-week="'+w.n+'"]')];
const d=bs.filter(x=>x.checked).length;
const total=bs.length;
const pctWeek=total?d/total:0;
const circ = 2*Math.PI*14; // ~87.96
const offset = circ * (1-pctWeek);
const ring = document.getElementById('ring-'+w.n);
const txt = document.getElementById('ringtxt-'+w.n);
if(ring) ring.style.strokeDashoffset = offset;
if(txt) txt.textContent = d+'/'+total;
if(txt && d===total) txt.style.color = 'var(--success)';
else if(txt) txt.style.color = 'var(--muted)';
});
updateStreak();
}
function updateStreak(){
const today = new Date().toLocaleDateString('en-US',{weekday:'short'});
const todayChecks = [...document.querySelectorAll('input[type=checkbox]')].filter(cb=>{
const label = cb.closest('.day-row')?.querySelector('.day-name')?.textContent;
return cb.checked && label && label.startsWith(today.slice(0,3));
}).length;
const badge = document.getElementById('streakBadge');
const txt = document.getElementById('streakText');
if(todayChecks > 0){
badge.style.display = 'inline-flex';
txt.textContent = todayChecks + ' task' + (todayChecks>1?'s':'') + ' done today';
} else {
badge.style.display = 'none';
}
}
function celebrateCheck(cb){
const week = cb.closest('.week');
const weekChecks = [...week.querySelectorAll('input[type=checkbox]')];
const allDone = weekChecks.every(c=>c.checked);
if(allDone){
week.style.borderColor = 'var(--success)';
setTimeout(()=>{
week.style.borderColor = '';
}, 1200);
}
}
function resetAll(){
if(!confirm("Reset all ticked boxes?")) return;
state={}; save(state);
document.querySelectorAll('input[type=checkbox]').forEach(cb=>cb.checked=false);
refresh();
}
/* ===================== COUNTDOWN ===================== */
function updateCountdown(){
const exam = new Date('2026-11-23T09:00:00'); // assume morning
const now = new Date();
const diff = exam - now;
if(diff <= 0){
document.getElementById('cdDays').textContent = '0';
document.getElementById('cdHours').textContent = '0';
document.getElementById('cdMins').textContent = '0';
document.getElementById('cdSecs').textContent = '0';
return;
}
const d = Math.floor(diff/(1000*60*60*24));
const h = Math.floor((diff/(1000*60*60))%24);
const m = Math.floor((diff/(1000*60))%60);
const s = Math.floor((diff/1000)%60);
document.getElementById('cdDays').textContent = d;
document.getElementById('cdHours').textContent = h;
document.getElementById('cdMins').textContent = m;
document.getElementById('cdSecs').textContent = s;
}
setInterval(updateCountdown, 1000);
updateCountdown();
/* ===================== SCROLL REVEAL ===================== */
function initReveal(){
const obs = new IntersectionObserver((entries)=>{
entries.forEach(entry=>{
if(entry.isIntersecting){
entry.target.classList.add('visible');
obs.unobserve(entry.target);
}
});
}, {threshold:0.08});
document.querySelectorAll('.week').forEach(el=>obs.observe(el));
}
/* ===================== KEYBOARD ===================== */
document.addEventListener('keydown', e=>{
if(e.target.tagName==='INPUT') return;
const open = document.querySelector('.week.open');
const weeks = [...document.querySelectorAll('.week')];
let idx = open ? weeks.indexOf(open) : -1;
if(e.key==='ArrowDown' || e.key==='j'){
e.preventDefault();
if(open) open.querySelector('.week-head').click();
idx = Math.min(idx+1, weeks.length-1);
weeks[idx].querySelector('.week-head').click();
weeks[idx].scrollIntoView({behavior:'smooth', block:'center'});
} else if(e.key==='ArrowUp' || e.key==='k'){
e.preventDefault();
if(open) open.querySelector('.week-head').click();
idx = Math.max(idx-1, 0);
weeks[idx].querySelector('.week-head').click();
weeks[idx].scrollIntoView({behavior:'smooth', block:'center'});
}
});
/* ===================== INIT ===================== */
buildWeeks();
bindChecks();
refresh();
initReveal();
</script>
<script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a038f2028858ffab',t:'MTc4MDA5Mzg0NA=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body>
</html>