Spaces:
Running
Running
| <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 & Matter deep parts (hysteresis / domain theory)</li> | |
| <li>Deep single-slit diffraction & 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 & rigid-body COM, COM motion → then solve COM problems"], | |
| ["Tue","<span class='h'>Torque & 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 & 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 & 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 & 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 & 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 & 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 & 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 & Faraday</span> — Lenz's law, motional EMF → solve problems"], | |
| ["Tue","<span class='h'>Self & 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 & spherical surfaces, TIR, fibres → solve"], | |
| ["Wed","<span class='h'>Lenses</span> — lensmaker, combinations, power → solve problems"], | |
| ["Thu","<span class='h'>Prism & 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 & 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> | |