Notion like platform for KUHS
https://re-wise-psi.vercel.app System like this for KUHS
https://re-wise-psi.vercel.app
First year
mkdir -p /home/daytona/workspace/kuhs-wise && ls /home/daytona/workspace/kuhs-wi…
~/kuhs-wise/data/questions.js
// KUHS First Year MBBS - Previous Year Questions
// Format: { q: "Question text", a: "Answer / Key Points", year: "YYYY", marks: N }
// Add your questions here!
const QUESTIONS = {
anatomy: {
title: "Anatomy",
color: "#e74c3c",
icon: "🦴",
chapters: [
{
name: "Upper Limb",
questions: [
{ q: "Describe the brachial plexus. Add a note on its clinical importance.", a: "Roots C5-T1. Trunks: Upper (C5,C6), Middle (C7), Lower (C8,T1). Divisions, Cords, Branches. Clinical: Erb's palsy (upper trunk injury), Klumpke's palsy (lower trunk injury).", year: "2019", marks: 10 },
{ q: "Describe the axilla — its boundaries and contents.", a: "Apex: cervicoaxillary canal. Base: skin. Anterior wall: pectoralis major & minor. Posterior: subscapularis, teres major, latissimus dorsi. Medial: serratus anterior. Lateral: intertubercular groove. Contents: axillary vessels, brachial plexus, lymph nodes, fat.", year: "2020", marks: 10 },
{ q: "Write a note on the carpal tunnel — contents and syndrome.", a: "Bounded by flexor retinaculum and carpal bones. Contents: 4 FDS, 4 FDP, FPL tendons + median nerve. CTS: compression of median nerve causing pain, tingling in lateral 3½ fingers, thenar wasting.", year: "2021", marks: 5 },
{ q: "Describe the cubital fossa — its boundaries and contents.", a: "Lateral: brachioradialis. Medial: pronator teres. Base (superior): line joining epicondyles. Floor: brachialis + supinator. Roof: deep fascia + bicipital aponeurosis. Contents (lat→med): radial nerve, biceps tendon, brachial artery, median nerve.", year: "2022", marks: 5 },
{ q: "Add a note on Erb's palsy.", a: "C5, C6 injury (upper trunk of brachial plexus). Cause: shoulder dystocia, traction. Deformity: 'waiter's tip' — arm medially rotated, extended, forearm pronated. Muscles affected: deltoid, supraspinatus, biceps, brachialis, supinator.", year: "2018", marks: 5 }
]
},
{
name: "Lower Limb",
questions: [
{ q: "Describe the femoral triangle — its boundaries and contents.", a: "Base: inguinal ligament. Lateral: sartorius. Medial: adductor longus. Floor: iliopsoas, pectineus, adductor longus. Roof: fascia lata. Contents (lat→med): femoral nerve, artery, vein, lymphatics (NAVY).", year: "2019", marks: 10 },
{ q: "Write a note on the popliteal fossa.", a: "Boundaries: Superolateral — biceps femoris. Superomedial — semitendinosus, semimembranosus. Inferolateral — lateral head of gastrocnemius. Inferomedial — medial head of gastrocnemius. Contents: popliteal artery & vein, tibial nerve, common peroneal nerve, fat, lymph nodes.", year: "2020", marks: 5 },
{ q: "Describe the hip joint — its type, ligaments and blood supply.", a: "Ball and socket synovial joint. Acetabulum (deepened by labrum) + femoral head. Ligaments: iliofemoral (strongest), pubofemoral, ischiofemoral, ligament of head (carries obturator artery). Blood supply: medial & lateral circumflex femoral arteries.", year: "2021", marks: 10 },
{ q: "Describe the arches of the foot and their clinical significance.", a: "Medial longitudinal (calcaneus → 1st metatarsal, keystone = navicular). Lateral longitudinal (calcaneus → 5th metatarsal). Transverse arch. Maintained by: bones, ligaments (spring ligament), muscles (tibialis posterior). Flat foot: fallen medial arch.", year: "2022", marks: 5 }
]
},
{
name: "Thorax",
questions: [
{ q: "Describe the mediastinum — its divisions and important contents.", a: "Superior: above sternal angle. Inferior: anterior (thymus), middle (heart, pericardium), posterior (esophagus, descending aorta, thoracic duct, azygos vein, sympathetic chain).", year: "2019", marks: 10 },
{ q: "Write a note on the pericardium.", a: "Fibrous outer layer + serous inner (parietal & visceral). Pericardial cavity: 50 ml fluid. Sinuses: transverse (separates arterial from venous) and oblique (posterior). Nerve supply: phrenic nerve. Clinical: cardiac tamponade.", year: "2020", marks: 5 },
{ q: "Describe the conducting system of the heart.", a: "SA node (right atrium, pacemaker, 60-100 bpm) → AV node (lower interatrial septum, 40-60 bpm) → Bundle of His → left & right bundle branches → Purkinje fibers. Blood supply: SA node — RCA (60%), AV node — RCA (90%).", year: "2021", marks: 5 }
]
},
{
name: "Abdomen & Pelvis",
questions: [
{ q: "Describe the inguinal canal — its walls and contents.", a: "Length: 4 cm above medial ½ of inguinal ligament. Anterior wall: external oblique aponeurosis (+ internal oblique laterally). Posterior wall: transversalis fascia (+ conjoint tendon medially). Roof: arching fibers of internal oblique & transversus. Floor: inguinal ligament. Contents: spermatic cord (♂) / round ligament (♀) + ilioinguinal nerve.", year: "2020", marks: 10 },
{ q: "Describe the portal vein — its formation, tributaries and portosystemic anastomoses.", a: "Formed by: splenic vein + superior mesenteric vein behind neck of pancreas. Tributaries: inferior mesenteric, left gastric, cystic. Porto-systemic anastomoses: lower esophagus, umbilicus (caput medusae), rectum (hemorrhoids), retroperitoneum.", year: "2021", marks: 10 },
{ q: "Write a note on the kidney — its relations and blood supply.", a: "Right kidney: lower than left (liver). Relations: superiorly — suprarenal gland; anteriorly — right lobe of liver, descending duodenum, right colic flexure. Blood supply: renal artery from aorta at L1. 5 segmental arteries (end arteries).", year: "2022", marks: 5 }
]
},
{
name: "Head & Neck",
questions: [
{ q: "Describe the cavernous sinus — its relations, contents and thrombosis.", a: "Location: beside body of sphenoid. Relations: pituitary above, sphenoid air sinus medially. Contents (lateral wall, superior to inferior): oculomotor, trochlear, ophthalmic, maxillary, abducens nerve (within sinus). Thrombosis: dangerous area of face → spread via facial & ophthalmic veins.", year: "2019", marks: 10 },
{ q: "Write a note on the thyroid gland — its blood supply and surgical importance.", a: "Blood supply: superior thyroid artery (external carotid) & inferior thyroid artery (thyrocervical trunk). Veins: superior & middle → IJV; inferior → brachiocephalic. Surgical danger: external laryngeal nerve (superior thyroid ligation) and recurrent laryngeal nerve (inferior thyroid ligation).", year: "2020", marks: 5 }
]
},
{
name: "Neuroanatomy",
questions: [
{ q: "Describe the cerebral cortex — its functional areas.", a: "Primary motor cortex: precentral gyrus (area 4). Primary sensory: postcentral gyrus (areas 3,1,2). Visual: calcarine sulcus (area 17). Auditory: Heschl's gyrus (area 41,42). Broca's (44,45): motor speech. Wernicke's (22): sensory speech.", year: "2021", marks: 10 },
{ q: "Describe the blood-brain barrier — its structure and clinical significance.", a: "Components: tight junctions of endothelium, basement membrane, astrocyte foot processes. Permeable to: O2, CO2, glucose, lipid-soluble drugs. Impermeable to: proteins, most antibiotics. Clinical: meningitis, brain tumors, drug delivery challenge. Absent at: area postrema, posterior pituitary.", year: "2022", marks: 5 }
]
}
]
},
physiology: {
title: "Physiology",
color: "#2ecc71",
icon: "⚡",
chapters: [
{
name: "Blood",
questions: [
{ q: "Describe the coagulation cascade. Add a note on anticoagulants.", a: "Extrinsic (TF + VII) → X. Intrinsic (XII→XI→IX + VIII) → X. Common: Xa + Va → prothrombin → thrombin → fibrinogen → fibrin. Anticoagulants: heparin (activates antithrombin III), warfarin (inhibits Vit K-dependent factors II, VII, IX, X).", year: "2019", marks: 10 },
{ q: "Describe erythropoiesis — stages and regulation.", a: "Sites: fetal — yolk sac → liver/spleen → bone marrow; adult — red bone marrow. Stages: proerythroblast → basophilic → polychromatic → orthochromatic → reticulocyte → RBC. Regulation: erythropoietin (kidney). Requires: iron, B12, folate, intrinsic factor.", year: "2020", marks: 10 },
{ q: "Write a note on ABO blood group system.", a: "A: antigen A, anti-B antibody. B: antigen B, anti-A antibody. AB: both antigens, no antibodies (universal recipient). O: no antigens, anti-A & anti-B (universal donor). Landsteiner's law: naturally occurring antibodies to absent antigens.", year: "2021", marks: 5 },
{ q: "Describe haemoglobin — its structure and types.", a: "Tetramer: 4 globin chains + 4 heme groups (Fe²⁺ + protoporphyrin). HbA (adult): α2β2 — 97%. HbA2: α2δ2 — 2.5%. HbF (fetal): α2γ2 — higher O2 affinity (leftward shift). HbS: sickle cell (β6 Glu→Val).", year: "2022", marks: 5 }
]
},
{
name: "Cardiovascular System",
questions: [
{ q: "Describe the cardiac cycle. Define cardiac output and its regulation.", a: "Systole (0.3s): isovolumetric contraction → rapid ejection → reduced ejection. Diastole (0.5s): isovolumetric relaxation → rapid filling → slow filling (diastasis). CO = HR × SV (normal 5L/min). Regulated by: preload (Frank-Starling), afterload, contractility, heart rate.", year: "2019", marks: 10 },
{ q: "Describe the ECG — its waves and their significance.", a: "P wave: atrial depolarization. PR interval: 0.12-0.20s (AV conduction). QRS: 0.06-0.10s, ventricular depolarization. ST segment: plateau phase. T wave: ventricular repolarization. QT interval: ventricular systole. Clinical: prolonged PR = 1° AV block, wide QRS = bundle branch block.", year: "2020", marks: 10 },
{ q: "Write a note on baroreceptor reflex.", a: "Location: carotid sinus (CN IX) and aortic arch (CN X). Activated by: rise in BP → stretch → afferent impulses → NTS in medulla → ↓ sympathetic + ↑ parasympathetic → ↓ HR, ↓ vasomotor tone → ↓ BP. Buffer reflex — short-term BP control.", year: "2021", marks: 5 }
]
},
{
name: "Respiratory System",
questions: [
{ q: "Describe the oxygen-haemoglobin dissociation curve. What causes shifts?", a: "Sigmoid curve. P50 = 26 mmHg. Right shift (↓ affinity): ↑ PCO2, ↑ H⁺, ↑ temperature, ↑ 2,3-DPG, HbS. Left shift (↑ affinity): ↓ PCO2, ↓ H⁺, ↓ temp, ↓ 2,3-DPG, HbF, CO poisoning.", year: "2019", marks: 10 },
{ q: "Describe the mechanics of respiration. Define lung compliance.", a: "Inspiration: diaphragm contracts → ↑ thoracic volume → ↓ intrapleural pressure → ↓ alveolar pressure → air flows in. Expiration: passive (quiet). Compliance = ΔV/ΔP (normal 200 mL/cmH2O). ↓ compliance: fibrosis, pulmonary edema. ↑ compliance: emphysema.", year: "2020", marks: 10 },
{ q: "Write a note on transport of CO2 in blood.", a: "Dissolved: 7%. Carbaminohaemoglobin (HbCO2): 23%. Bicarbonate (HCO3⁻): 70% — CO2 + H2O → H2CO3 → H⁺ + HCO3⁻ (carbonic anhydrase). Chloride shift (Hamburger phenomenon): HCO3⁻ exits RBC, Cl⁻ enters. Haldane effect: deoxygenated Hb carries more CO2.", year: "2021", marks: 5 }
]
},
{
name: "Renal Physiology",
questions: [
{ q: "Describe the process of urine formation — filtration, reabsorption and secretion.", a: "GFR: 125 mL/min (Starling forces across glomerulus). Proximal tubule: 65% Na+, all glucose, amino acids, HCO3-, water. Loop of Henle: countercurrent multiplier. Distal tubule & CD: aldosterone (Na+), ADH (water). Secretion: H+, K+, organic acids.", year: "2020", marks: 10 },
{ q: "Write a note on juxtaglomerular apparatus and renin-angiotensin-aldosterone system.", a: "JGA: macula densa (DCT) + JG cells (afferent arteriole). Low BP/Na+ → renin → angiotensinogen → Ang I → ACE (lung) → Ang II → aldosterone (adrenal cortex) → Na+ retention → ↑ BP. Also: Ang II → vasoconstriction, ADH release.", year: "2021", marks: 10 }
]
},
{
name: "Nerve & Muscle",
questions: [
{ q: "Describe the resting membrane potential and action potential.", a: "RMP: -70 mV (neurons), -90 mV (muscle). Due to K+ equilibrium + Na/K ATPase. AP: threshold → rapid depolarization (Na+ influx, voltage-gated) → overshoot (+30 mV) → repolarization (K+ efflux) → hyperpolarization (after-potential). All-or-none law.", year: "2019", marks: 10 },
{ q: "Describe neuromuscular junction and its pharmacology.", a: "Motor end plate: ACh synthesized from acetyl-CoA + choline (choline acetyltransferase). Released by Ca²⁺-mediated exocytosis → nicotinic receptors → EPP → muscle AP. ACh degraded by AChE. Drugs: neostigmine (AChE inhibitor), succinylcholine (depolarizing blocker), curare (non-depolarizing blocker). Myasthenia gravis: anti-nAChR antibodies.", year: "2020", marks: 10 },
{ q: "Write a note on sliding filament theory of muscle contraction.", a: "Thin filaments (actin + troponin + tropomyosin) slide over thick (myosin). Ca²⁺ released from SR → binds troponin C → tropomyosin shifts → active sites exposed → myosin heads bind → power stroke (ATP hydrolysis) → cross-bridge cycling. No change in length of filaments, only sarcomere shortens.", year: "2021", marks: 5 }
]
},
{
name: "Endocrinology",
questions: [
{ q: "Describe the hormones of the anterior pituitary and their regulation.", a: "GH (somatotrophs), TSH, ACTH, FSH, LH (gonadotrophs), Prolactin. Regulated by hypothalamic releasing/inhibiting hormones (portal blood). Feedback: long loop (target organ hormones), short loop (ant. pituitary → hypothalamus). GH: pulsatile, peak during sleep.", year: "2022", marks: 10 },
{ q: "Write a note on insulin — secretion, actions and diabetes mellitus.", a: "Source: β cells of islets of Langerhans. Stimulus: ↑ blood glucose (KATP channel closure → depolarization → Ca²⁺ → exocytosis). Actions: ↑ glucose uptake (GLUT4), glycogenesis, lipogenesis, protein synthesis; ↓ gluconeogenesis. DM Type 1: insulin deficiency. Type 2: insulin resistance.", year: "2021", marks: 10 }
]
}
]
},
biochemistry: {
title: "Biochemistry",
color: "#9b59b6",
icon: "🧬",
chapters: [
{
name: "Carbohydrate Metabolism",
questions: [
{ q: "Describe glycolysis — the steps, enzymes and energy yield.", a: "10 steps. Investment phase: 2 ATP used (hexokinase, PFK-1 — rate limiting). Pay-off phase: 4 ATP + 2 NADH produced. Net: 2 ATP + 2 NADH + 2 pyruvate. Key enzymes: hexokinase, PFK-1 (inhibited by ATP, citrate; activated by AMP, fructose-2,6-BP), pyruvate kinase. Substrate-level phosphorylation.", year: "2019", marks: 10 },
{ q: "Describe the TCA cycle — steps, significance and regulation.", a: "Acetyl-CoA (2C) + oxaloacetate (4C) → citrate (6C). 8 steps. Per turn: 3 NADH, 1 FADH2, 1 GTP. Total from 1 glucose: 10 NADH, 2 FADH2, 2 GTP. Rate-limiting: isocitrate dehydrogenase (activated by ADP, Ca²⁺). Functions as amphibolic pathway.", year: "2020", marks: 10 },
{ q: "Write a note on the pentose phosphate pathway.", a: "Oxidative phase: glucose-6-P → ribulose-5-P + 2 NADPH + CO2 (G6PD). Non-oxidative phase: interconversion of sugars. Significance: NADPH (fatty acid synthesis, GSH reduction), ribose-5-P (nucleotide synthesis). G6PD deficiency: hemolytic anemia with oxidant stress.", year: "2021", marks: 5 },
{ q: "Describe gluconeogenesis — substrates, key enzymes and regulation.", a: "Substrates: lactate, amino acids (alanine — glucose-alanine cycle), glycerol, propionate. Bypasses: pyruvate → OAA (pyruvate carboxylase, biotin), OAA → PEP (PEPCK), fructose-1,6-BP → F-6-P (FBPase-1), G-6-P → glucose (G6Pase — only in liver/kidney). Stimulated by glucagon, cortisol.", year: "2022", marks: 10 }
]
},
{
name: "Lipid Metabolism",
questions: [
{ q: "Describe beta-oxidation of fatty acids. Calculate ATP from palmitic acid.", a: "Activation: acyl-CoA synthetase (uses 2 ATP equivalents). Transport: carnitine shuttle (inhibited by malonyl-CoA). Per cycle: 1 FADH2 (1.5 ATP) + 1 NADH (2.5 ATP) + 1 acetyl-CoA (10 ATP). Palmitate (16C): 7 cycles + 8 acetyl-CoA = 7×4 + 8×10 - 2 = 106 ATP.", year: "2019", marks: 10 },
{ q: "Describe ketone body synthesis, utilization and ketoacidosis.", a: "Synthesis (liver): HMG-CoA pathway. Acetoacetate, β-hydroxybutyrate, acetone. Utilization: extrahepatic tissues (brain in starvation). Ketoacidosis: DM type 1, starvation — ↑ free FA → ↑ acetyl-CoA → ketones exceed buffering capacity → acidosis (pH <7.35), fruity breath.", year: "2020", marks: 10 },
{ q: "Write a note on lipoproteins — their types and functions.", a: "Chylomicrons (diet fat) → IDL → LDL (↑ cholesterol to tissues, atherogenic). VLDL (liver TG) → IDL → LDL. HDL: reverse cholesterol transport (protective). Apo B-100: LDL receptor ligand. Apo E: IDL/chylomicron remnant clearance. Familial hypercholesterolemia: LDL receptor defect.", year: "2021", marks: 5 }
]
},
{
name: "Protein & Amino Acid Metabolism",
questions: [
{ q: "Describe the urea cycle — steps, enzymes, regulation and disorders.", a: "Site: liver (mitochondria + cytoplasm). Steps: carbamoyl phosphate → citrulline → argininosuccinate → arginine → urea + ornithine. Rate-limiting: CPS-1 (activated by N-acetylglutamate). Disorders: CPS-1 deficiency, OTC deficiency (X-linked) — hyperammonemia. Treatment: low protein, arginine, sodium benzoate.", year: "2019", marks: 10 },
{ q: "Write a note on phenylketonuria.", a: "Deficiency: phenylalanine hydroxylase (PAH). Accumulation: phenylalanine → phenylpyruvate, phenylacetate, phenyllactate (musty odor). Features: intellectual disability, fair skin (↓ melanin — tyrosine depleted), seizures, eczema. Screening: Guthrie test (PKU screen at birth). Treatment: phenylalanine-restricted diet + tyrosine supplementation.", year: "2020", marks: 5 },
{ q: "Describe transamination and oxidative deamination.", a: "Transamination: amino group transfer between amino acid and α-keto acid. PLP (Vit B6) cofactor. ALT: Ala + α-KG ↔ Pyruvate + Glu. AST: Asp + α-KG ↔ OAA + Glu. Oxidative deamination: GDH (liver): Glu + NAD⁺ → α-KG + NH4⁺ + NADH. Links protein metabolism to TCA.", year: "2021", marks: 5 }
]
},
{
name: "Molecular Biology",
questions: [
{ q: "Describe DNA replication — the enzymes involved and its significance.", a: "Semiconservative (Meselson-Stahl). Helicase: unwinds. SSBPs: stabilize. Primase: RNA primer. DNA pol III (prokaryote) / pol δ, ε (eukaryote): 5'→3' synthesis. Pol I: removes primer. Ligase: joins Okazaki fragments. Leading strand: continuous. Lagging: discontinuous. Telomerase: maintains chromosome ends.", year: "2019", marks: 10 },
{ q: "Describe transcription and translation — the central dogma.", a: "Transcription: DNA → mRNA (RNA pol, promoter, template strand, 5'→3'). Processing (eukaryote): 5' cap, poly-A tail, splicing. Translation: mRNA → protein. Ribosomes (A, P, E sites). tRNA anticodon, aminoacyl-tRNA synthetase. Initiation (AUG, Met), elongation (peptide bond — transpeptidation), termination (UAA, UAG, UGA).", year: "2020", marks: 10 },
{ q: "Write a note on PCR — principle and applications.", a: "Polymerase Chain Reaction: exponential amplification. Steps: 94°C denaturation → 50-65°C annealing (primers) → 72°C extension (Taq polymerase). 2ⁿ copies after n cycles. Applications: pathogen detection, genetic diagnosis, forensics, sequencing, COVID-19 testing.", year: "2021", marks: 5 }
]
},
{
name: "Vitamins & Minerals",
questions: [
{ q: "Classify vitamins. Describe deficiency of Vitamin B12.", a: "Fat-soluble: A, D, E, K. Water-soluble: B complex + C. B12 (cobalamin): requires intrinsic factor (gastric parietal cells). Deficiency causes: megaloblastic anemia (↓ DNA synthesis), subacute combined degeneration of spinal cord (posterior + lateral columns), glossitis. Cause: pernicious anemia, veganism.", year: "2019", marks: 10 },
{ q: "Describe Vitamin D metabolism and its role in calcium homeostasis.", a: "UV → skin → cholecalciferol → liver (25-hydroxylase) → 25-OH D3 → kidney (1α-hydroxylase, stimulated by PTH) → 1,25-(OH)₂D3 (calcitriol, active). Actions: ↑ intestinal Ca²⁺ absorption, ↑ renal Ca²⁺ reabsorption, ↑ bone resorption. Deficiency: rickets (children), osteomalacia (adults).", year: "2020", marks: 5 },
{ q: "Write a note on iron metabolism and iron deficiency anemia.", a: "Absorption: ferrous (Fe²⁺) in duodenum (DMT1), converted by ferrireductase. Transport: transferrin (Fe³⁺). Storage: ferritin (liver, spleen, bone marrow), hemosiderin. Regulation: hepcidin (↑ ferritin, ↓ absorption). IDA: microcytic hypochromic anemia, koilonychia, atrophic glossitis, pica.", year: "2021", marks: 5 }
]
},
{
name: "Enzymes",
questions: [
{ q: "Describe enzyme kinetics — Michaelis-Menten equation and its significance.", a: "v = Vmax[S] / (Km + [S]). Km = substrate conc at ½Vmax — measure of affinity (low Km = high affinity). Vmax = maximum velocity. Competitive inhibition: ↑ apparent Km, Vmax unchanged. Non-competitive: Km unchanged, ↓ Vmax. Lineweaver-Burk plot (double reciprocal) used to determine constants.", year: "2020", marks: 10 },
{ q: "Write a note on isoenzymes with clinical examples.", a: "Isoenzymes: multiple molecular forms of same enzyme, same reaction, different structure/charge. LDH: LDH1 (heart — ↑ in MI), LDH5 (liver — ↑ in hepatitis). CK: CK-MB (↑ in MI), CK-MM (muscle), CK-BB (brain). Alkaline phosphatase: bone (ALP1), liver (ALP2). Used as cardiac and liver biomarkers.", year: "2021", marks: 5 }
]
}
]
}
};
~/kuhs-wise/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>KUHS-Wise | First Year MBBS Question Bank</title>
<link rel="stylesheet" href="assets/style.css" />
<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=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet" />
</head>
<body>
<header class="site-header">
<div class="header-inner">
<div class="brand">
<span class="brand-icon">🏥</span>
<span class="brand-name">KUHS<span class="brand-accent">-Wise</span></span>
</div>
<nav class="header-nav">
<a href="index.html" class="nav-link active">Home</a>
<a href="subject.html?s=anatomy" class="nav-link">Anatomy</a>
<a href="subject.html?s=physiology" class="nav-link">Physiology</a>
<a href="subject.html?s=biochemistry" class="nav-link">Biochemistry</a>
</nav>
</div>
</header>
<main>
<section class="hero">
<div class="hero-inner">
<div class="hero-badge">KUHS · First Year MBBS · Previous Year Questions</div>
<h1 class="hero-title">Your Smart<br /><span class="accent">Revision Partner</span></h1>
<p class="hero-sub">Curated PYQs for Kerala University of Health Sciences — First MBBS. Study in display mode or test yourself with randomized flashcards.</p>
<div class="hero-cta">
<a href="subject.html?s=anatomy" class="btn btn-primary">Start Studying →</a>
<a href="flashcard.html" class="btn btn-secondary">🃏 Flashcard Mode</a>
</div>
<div class="hero-stats">
<div class="stat"><span class="stat-n" id="stat-total-q">—</span><span class="stat-label">Questions</span></div>
<div class="stat"><span class="stat-n">3</span><span class="stat-label">Subjects</span></div>
<div class="stat"><span class="stat-n" id="stat-years">—</span><span class="stat-label">Years Covered</span></div>
</div>
</div>
<div class="hero-visual">
<div class="card-float card-1">🦴 Anatomy</div>
<div class="card-float card-2">⚡ Physiology</div>
<div class="card-float card-3">🧬 Biochemistry</div>
</div>
</section>
<section class="subjects-section">
<div class="section-inner">
<h2 class="section-title">Choose Your Subject</h2>
<div class="subjects-grid">
<a href="subject.html?s=anatomy" class="subject-card" data-color="#e74c3c">
<div class="subject-icon">🦴</div>
<div class="subject-name">Anatomy</div>
<div class="subject-desc">Upper/Lower limb, Thorax, Abdomen, Head & Neck, Neuroanatomy</div>
<div class="subject-meta" id="meta-anatomy">— questions</div>
<span class="subject-arrow">→</span>
</a>
<a href="subject.html?s=physiology" class="subject-card" data-color="#2ecc71">
<div class="subject-icon">⚡</div>
<div class="subject-name">Physiology</div>
<div class="subject-desc">Blood, CVS, Respiratory, Renal, Nerve & Muscle, Endocrinology</div>
<div class="subject-meta" id="meta-physiology">— questions</div>
<span class="subject-arrow">→</span>
</a>
<a href="subject.html?s=biochemistry" class="subject-card" data-color="#9b59b6">
<div class="subject-icon">🧬</div>
<div class="subject-name">Biochemistry</div>
<div class="subject-desc">Carbohydrate, Lipid, Protein metabolism, Molecular Biology, Vitamins</div>
<div class="subject-meta" id="meta-biochemistry">— questions</div>
<span class="subject-arrow">→</span>
</a>
</div>
</div>
</section>
<section class="modes-section">
<div class="section-inner">
<h2 class="section-title">Two Ways to Revise</h2>
<div class="modes-grid">
<div class="mode-card">
<div class="mode-icon">📖</div>
<h3>Display Mode</h3>
<p>Browse all questions and answers chapter by chapter. Great for first-pass reading and reference.</p>
</div>
<div class="mode-card">
<div class="mode-icon">🃏</div>
<h3>Flashcard Mode</h3>
<p>Questions shuffle randomly every session. Tap to reveal the answer. Perfect for active recall practice.</p>
</div>
</div>
</div>
</section>
</main>
<footer class="site-footer">
<p>KUHS-Wise · First Year MBBS · Kerala University of Health Sciences</p>
<p class="footer-note">Questions are for educational purposes. Verify with official KUHS resources.</p>
</footer>
<script src="data/questions.js"></script>
<script>
// Compute stats
let totalQ = 0;
const years = new Set();
for (const [key, subj] of Object.entries(QUESTIONS)) {
let subjQ = 0;
for (const ch of subj.chapters) {
subjQ += ch.questions.length;
totalQ += ch.questions.length;
for (const q of ch.questions) years.add(q.year);
}
const el = document.getElementById('meta-' + key);
if (el) el.textContent = subjQ + ' questions';
}
document.getElementById('stat-total-q').textContent = totalQ;
const yrs = [...years].sort();
document.getElementById('stat-years').textContent = yrs[0] + '–' + yrs[yrs.length-1];
// Color subject cards
document.querySelectorAll('.subject-card').forEach(card => {
const color = card.dataset.color;
card.style.setProperty('--card-color', color);
});
</script>
</body>
</html>
~/kuhs-wise/subject.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>KUHS-Wise | Subject View</title>
<link rel="stylesheet" href="assets/style.css" />
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet" />
</head>
<body>
<header class="site-header">
<div class="header-inner">
<div class="brand">
<a href="index.html" style="text-decoration:none;color:inherit;display:flex;align-items:center;gap:8px">
<span class="brand-icon">🏥</span>
<span class="brand-name">KUHS<span class="brand-accent">-Wise</span></span>
</a>
</div>
<nav class="header-nav">
<a href="index.html" class="nav-link">Home</a>
<a href="subject.html?s=anatomy" class="nav-link" data-subj="anatomy">Anatomy</a>
<a href="subject.html?s=physiology" class="nav-link" data-subj="physiology">Physiology</a>
<a href="subject.html?s=biochemistry" class="nav-link" data-subj="biochemistry">Biochemistry</a>
</nav>
</div>
</header>
<div class="subj-hero" id="subj-hero">
<div class="subj-hero-inner">
<div class="subj-icon" id="subj-icon"></div>
<div>
<div class="subj-badge" id="subj-badge">KUHS · First Year MBBS</div>
<h1 class="subj-title" id="subj-title">Subject</h1>
<p class="subj-sub" id="subj-sub">Previous year questions</p>
</div>
</div>
<div class="subj-actions">
<button class="btn btn-white" onclick="toggleAll(true)">Expand All</button>
<button class="btn btn-white" onclick="toggleAll(false)">Collapse All</button>
<a id="flashcard-link" href="#" class="btn btn-accent">🃏 Flashcard Mode</a>
</div>
</div>
<div class="subj-layout">
<aside class="toc-panel" id="toc-panel">
<div class="toc-title">Chapters</div>
<ul class="toc-list" id="toc-list"></ul>
</aside>
<main class="content-panel" id="content-panel">
<div class="mode-toggle">
<span class="mode-label">Mode:</span>
<button class="mode-btn active" id="btn-display" onclick="setMode('display')">📖 Display</button>
<button class="mode-btn" id="btn-flashcard" onclick="setMode('flashcard')">🃏 Flashcard</button>
</div>
<!-- Display mode content -->
<div id="display-content"></div>
<!-- Flashcard mode content -->
<div id="flashcard-content" style="display:none">
<div class="fc-header">
<div class="fc-progress-wrap">
<span id="fc-counter">1 / 1</span>
<div class="fc-progress-bar"><div class="fc-progress-fill" id="fc-fill"></div></div>
</div>
<div class="fc-controls">
<button class="fc-btn" onclick="prevCard()">← Prev</button>
<button class="fc-btn" onclick="nextCard()">Next →</button>
<button class="fc-btn fc-btn-shuffle" onclick="shuffleCards()">🔀 Shuffle</button>
</div>
</div>
<div class="fc-card" id="fc-card" onclick="flipCard()">
<div class="fc-inner" id="fc-inner">
<div class="fc-front">
<div class="fc-tag" id="fc-tag"></div>
<div class="fc-question" id="fc-question"></div>
<div class="fc-hint">Tap to reveal answer</div>
</div>
<div class="fc-back">
<div class="fc-answer-label">Answer</div>
<div class="fc-answer" id="fc-answer"></div>
</div>
</div>
</div>
<div class="fc-meta">
<span id="fc-year"></span>
<span id="fc-marks"></span>
<span id="fc-chapter"></span>
</div>
</div>
</main>
</div>
<footer class="site-footer">
<p>KUHS-Wise · First Year MBBS · Kerala University of Health Sciences</p>
</footer>
<script src="data/questions.js"></script>
<script>
const params = new URLSearchParams(window.location.search);
const subjectKey = params.get('s') || 'anatomy';
const subject = QUESTIONS[subjectKey];
if (!subject) {
document.body.innerHTML = '<div style="padding:60px;text-align:center;font-family:Inter,sans-serif"><h2>Subject not found.</h2><a href="index.html">Go back</a></div>';
}
// Mark active nav
document.querySelectorAll('[data-subj]').forEach(a => {
if (a.dataset.subj === subjectKey) a.classList.add('active');
});
// Set hero
document.getElementById('subj-icon').textContent = subject.icon;
document.getElementById('subj-title').textContent = subject.title;
document.getElementById('subj-sub').textContent = subject.chapters.reduce((acc, ch) => acc + ch.questions.length, 0) + ' Previous Year Questions';
document.getElementById('flashcard-link').href = 'flashcard.html?s=' + subjectKey;
document.getElementById('subj-hero').style.setProperty('--hero-color', subject.color);
// Build display content
const displayDiv = document.getElementById('display-content');
const tocList = document.getElementById('toc-list');
subject.chapters.forEach((chapter, ci) => {
// ToC
const li = document.createElement('li');
li.innerHTML = `<a href="#ch-${ci}" class="toc-link">${chapter.name} <span class="toc-count">${chapter.questions.length}</span></a>`;
tocList.appendChild(li);
// Chapter block
const chDiv = document.createElement('div');
chDiv.className = 'chapter-block';
chDiv.id = `ch-${ci}`;
chDiv.innerHTML = `<div class="chapter-header" onclick="toggleChapter(this)">
<div class="chapter-title"><span class="ch-num">${ci+1}</span>${chapter.name}</div>
<span class="ch-toggle">▼</span>
</div>
<div class="chapter-body">`;
chapter.questions.forEach((q, qi) => {
chDiv.querySelector('.chapter-body').innerHTML += `
<div class="q-item" id="q-${ci}-${qi}">
<div class="q-header" onclick="toggleQ(this)">
<div class="q-text"><span class="q-num">Q${qi+1}</span>${q.q}</div>
<div class="q-meta-row">
${q.year ? `<span class="q-year">${q.year}</span>` : ''}
${q.marks ? `<span class="q-marks">${q.marks} marks</span>` : ''}
<span class="q-toggle-icon">+</span>
</div>
</div>
<div class="q-answer" style="display:none">
<div class="answer-label">Answer</div>
<div class="answer-text">${q.a}</div>
</div>
</div>`;
});
chDiv.querySelector('.chapter-body').innerHTML += '</div>';
displayDiv.appendChild(chDiv);
});
// Toggle question
function toggleQ(header) {
const answer = header.nextElementSibling;
const icon = header.querySelector('.q-toggle-icon');
if (answer.style.display === 'none') {
answer.style.display = 'block';
icon.textContent = '−';
header.classList.add('open');
} else {
answer.style.display = 'none';
icon.textContent = '+';
header.classList.remove('open');
}
}
function toggleChapter(header) {
const body = header.nextElementSibling;
const icon = header.querySelector('.ch-toggle');
if (body.style.display === 'none') {
body.style.display = 'block';
icon.textContent = '▼';
} else {
body.style.display = 'none';
icon.textContent = '▶';
}
}
function toggleAll(open) {
document.querySelectorAll('.chapter-body').forEach(b => {
b.style.display = open ? 'block' : 'none';
});
document.querySelectorAll('.ch-toggle').forEach(i => {
i.textContent = open ? '▼' : '▶';
});
}
// Flashcard mode
let allCards = [];
let currentIdx = 0;
let flipped = false;
function buildAllCards() {
allCards = [];
subject.chapters.forEach(ch => {
ch.questions.forEach(q => {
allCards.push({ ...q, chapter: ch.name });
});
});
}
function shuffleCards() {
for (let i = allCards.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[allCards[i], allCards[j]] = [allCards[j], allCards[i]];
}
currentIdx = 0;
showCard();
}
function showCard() {
if (!allCards.length) return;
const card = allCards[currentIdx];
flipped = false;
document.getElementById('fc-inner').classList.remove('flipped');
document.getElementById('fc-question').textContent = card.q;
document.getElementById('fc-answer').textContent = card.a;
document.getElementById('fc-tag').textContent = card.chapter;
document.getElementById('fc-year').textContent = card.year ? '📅 ' + card.year : '';
document.getElementById('fc-marks').textContent = card.marks ? '⭐ ' + card.marks + ' marks' : '';
document.getElementById('fc-chapter').textContent = '📂 ' + card.chapter;
document.getElementById('fc-counter').textContent = (currentIdx + 1) + ' / ' + allCards.length;
const pct = ((currentIdx + 1) / allCards.length * 100).toFixed(1);
document.getElementById('fc-fill').style.width = pct + '%';
}
function flipCard() {
flipped = !flipped;
document.getElementById('fc-inner').classList.toggle('flipped', flipped);
}
function nextCard() {
if (currentIdx < allCards.length - 1) { currentIdx++; showCard(); }
}
function prevCard() {
if (currentIdx > 0) { currentIdx--; showCard(); }
}
function setMode(mode) {
if (mode === 'display') {
document.getElementById('display-content').style.display = 'block';
document.getElementById('flashcard-content').style.display = 'none';
document.getElementById('btn-display').classList.add('active');
document.getElementById('btn-flashcard').classList.remove('active');
} else {
document.getElementById('display-content').style.display = 'none';
document.getElementById('flashcard-content').style.display = 'block';
document.getElementById('btn-display').classList.remove('active');
document.getElementById('btn-flashcard').classList.add('active');
if (!allCards.length) { buildAllCards(); shuffleCards(); }
else showCard();
}
}
// Keyboard navigation
document.addEventListener('keydown', e => {
if (document.getElementById('flashcard-content').style.display !== 'none') {
if (e.key === 'ArrowRight') nextCard();
if (e.key === 'ArrowLeft') prevCard();
if (e.key === ' ') { e.preventDefault(); flipCard(); }
}
});
</script>
</body>
</html>
~/kuhs-wise/flashcard.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>KUHS-Wise | Flashcard Mode</title>
<link rel="stylesheet" href="assets/style.css" />
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet" />
</head>
<body class="fc-fullpage">
<header class="site-header">
<div class="header-inner">
<div class="brand">
<a href="index.html" style="text-decoration:none;color:inherit;display:flex;align-items:center;gap:8px">
<span class="brand-icon">🏥</span>
<span class="brand-name">KUHS<span class="brand-accent">-Wise</span></span>
</a>
</div>
<nav class="header-nav">
<a href="index.html" class="nav-link">Home</a>
<a href="subject.html?s=anatomy" class="nav-link">Anatomy</a>
<a href="subject.html?s=physiology" class="nav-link">Physiology</a>
<a href="subject.html?s=biochemistry" class="nav-link">Biochemistry</a>
</nav>
</div>
</header>
<div class="fc-full-wrap">
<div class="fc-top-bar">
<div class="fc-subject-tabs" id="fc-subject-tabs">
<button class="fc-tab active" data-s="all" onclick="setSubject('all')">All Subjects</button>
<button class="fc-tab" data-s="anatomy" onclick="setSubject('anatomy')">🦴 Anatomy</button>
<button class="fc-tab" data-s="physiology" onclick="setSubject('physiology')">⚡ Physiology</button>
<button class="fc-tab" data-s="biochemistry" onclick="setSubject('biochemistry')">🧬 Biochemistry</button>
</div>
<div class="fc-top-actions">
<button class="fc-btn fc-btn-shuffle" onclick="shuffleCards()">🔀 Shuffle</button>
<button class="fc-btn" onclick="resetCards()">↺ Reset</button>
</div>
</div>
<div class="fc-progress-wrap fc-full-progress">
<div class="fc-progress-bar">
<div class="fc-progress-fill" id="fc-fill"></div>
</div>
<span id="fc-counter" class="fc-counter-badge">1 / 1</span>
</div>
<div class="fc-big-card" id="fc-card" onclick="flipCard()">
<div class="fc-inner" id="fc-inner">
<div class="fc-front">
<div class="fc-card-top">
<span class="fc-chapter-tag" id="fc-tag"></span>
<span class="fc-subj-tag" id="fc-subj-badge"></span>
</div>
<div class="fc-big-question" id="fc-question">Loading...</div>
<div class="fc-hint-text">
<span class="hint-icon">👆</span> Tap to reveal · Space bar · Arrow keys to navigate
</div>
</div>
<div class="fc-back">
<div class="fc-answer-label">✅ Answer</div>
<div class="fc-big-answer" id="fc-answer"></div>
<div class="fc-card-bottom">
<span id="fc-year"></span>
<span id="fc-marks"></span>
</div>
</div>
</div>
</div>
<div class="fc-nav-bar">
<button class="fc-nav-btn" onclick="prevCard()">← Previous</button>
<div class="fc-rating">
<span class="rating-label">Mark as:</span>
<button class="rate-btn rate-hard" onclick="rateCard('hard')">😰 Hard</button>
<button class="rate-btn rate-ok" onclick="rateCard('ok')">😐 OK</button>
<button class="rate-btn rate-easy" onclick="rateCard('easy')">😊 Easy</button>
</div>
<button class="fc-nav-btn" onclick="nextCard()">Next →</button>
</div>
<div class="fc-score-bar">
<span class="score-item score-hard">😰 Hard: <strong id="cnt-hard">0</strong></span>
<span class="score-item score-ok">😐 OK: <strong id="cnt-ok">0</strong></span>
<span class="score-item score-easy">😊 Easy: <strong id="cnt-easy">0</strong></span>
</div>
</div>
<script src="data/questions.js"></script>
<script>
const urlParams = new URLSearchParams(window.location.search);
const initSubj = urlParams.get('s') || 'all';
let allCards = [];
let currentIdx = 0;
let flipped = false;
let ratings = { hard: 0, ok: 0, easy: 0 };
function buildCards(subjKey) {
allCards = [];
const subjects = subjKey === 'all' ? Object.entries(QUESTIONS) : [[subjKey, QUESTIONS[subjKey]]];
for (const [key, subj] of subjects) {
subj.chapters.forEach(ch => {
ch.questions.forEach(q => {
allCards.push({ ...q, chapter: ch.name, subject: subj.title, subjectKey: key, color: subj.color, icon: subj.icon });
});
});
}
}
function setSubject(key) {
document.querySelectorAll('.fc-tab').forEach(t => t.classList.toggle('active', t.dataset.s === key));
buildCards(key);
shuffleCards();
}
function shuffleCards() {
for (let i = allCards.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[allCards[i], allCards[j]] = [allCards[j], allCards[i]];
}
currentIdx = 0;
ratings = { hard: 0, ok: 0, easy: 0 };
updateScore();
showCard();
}
function resetCards() {
currentIdx = 0;
ratings = { hard: 0, ok: 0, easy: 0 };
updateScore();
showCard();
}
function showCard() {
if (!allCards.length) return;
const card = allCards[currentIdx];
flipped = false;
document.getElementById('fc-inner').classList.remove('flipped');
document.getElementById('fc-question').textContent = card.q;
document.getElementById('fc-answer').textContent = card.a;
document.getElementById('fc-tag').textContent = card.chapter;
document.getElementById('fc-subj-badge').textContent = card.icon + ' ' + card.subject;
document.getElementById('fc-subj-badge').style.background = card.color + '22';
document.getElementById('fc-subj-badge').style.color = card.color;
document.getElementById('fc-year').textContent = card.year ? '📅 ' + card.year : '';
document.getElementById('fc-marks').textContent = card.marks ? '⭐ ' + card.marks + ' marks' : '';
document.getElementById('fc-counter').textContent = (currentIdx + 1) + ' / ' + allCards.length;
const pct = ((currentIdx + 1) / allCards.length * 100);
document.getElementById('fc-fill').style.width = pct + '%';
document.getElementById('fc-card').style.setProperty('--card-accent', card.color);
}
function flipCard() {
flipped = !flipped;
document.getElementById('fc-inner').classList.toggle('flipped', flipped);
}
function nextCard() {
if (currentIdx < allCards.length - 1) { currentIdx++; showCard(); }
}
function prevCard() {
if (currentIdx > 0) { currentIdx--; showCard(); }
}
function rateCard(rating) {
ratings[rating]++;
updateScore();
nextCard();
}
function updateScore() {
document.getElementById('cnt-hard').textContent = ratings.hard;
document.getElementById('cnt-ok').textContent = ratings.ok;
document.getElementById('cnt-easy').textContent = ratings.easy;
}
// Keyboard
document.addEventListener('keydown', e => {
if (e.key === 'ArrowRight') nextCard();
else if (e.key === 'ArrowLeft') prevCard();
else if (e.key === ' ') { e.preventDefault(); flipCard(); }
else if (e.key === '1') rateCard('hard');
else if (e.key === '2') rateCard('ok');
else if (e.key === '3') rateCard('easy');
});
// Init
setSubject(initSubj);
document.querySelectorAll('.fc-tab').forEach(t => t.classList.toggle('active', t.dataset.s === initSubj));
</script>
</body>
</html>
mkdir -p /home/daytona/workspace/kuhs-wise/assets
~/kuhs-wise/assets/style.css
/* ============================================
KUHS-Wise — Global Styles
============================================ */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--bg: #0f1117;
--bg2: #161b27;
--bg3: #1e2538;
--surface: #1e2538;
--surface2: #252d42;
--border: #2e3854;
--text: #e8eaf6;
--text2: #8892a4;
--accent: #6c63ff;
--accent2: #8b83ff;
--radius: 12px;
--radius-lg: 20px;
--shadow: 0 4px 24px rgba(0,0,0,0.4);
--font: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
}
html { scroll-behavior: smooth; }
body {
background: var(--bg);
color: var(--text);
font-family: var(--font);
font-size: 16px;
line-height: 1.6;
min-height: 100vh;
}
/* ============================================
HEADER
============================================ */
.site-header {
position: sticky;
top: 0;
z-index: 100;
background: rgba(15, 17, 23, 0.92);
backdrop-filter: blur(12px);
border-bottom: 1px solid var(--border);
}
.header-inner {
max-width: 1200px;
margin: 0 auto;
padding: 0 24px;
height: 60px;
display: flex;
align-items: center;
justify-content: space-between;
}
.brand {
display: flex;
align-items: center;
gap: 8px;
font-weight: 800;
font-size: 1.2rem;
}
.brand-icon { font-size: 1.4rem; }
.brand-accent { color: var(--accent); }
.header-nav { display: flex; gap: 4px; }
.nav-link {
padding: 6px 14px;
border-radius: 8px;
text-decoration: none;
color: var(--text2);
font-size: 0.9rem;
font-weight: 500;
transition: all 0.2s;
}
.nav-link:hover, .nav-link.active {
color: var(--text);
background: var(--surface);
}
/* ============================================
BUTTONS
============================================ */
.btn {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 10px 22px;
border-radius: 10px;
font-size: 0.9rem;
font-weight: 600;
text-decoration: none;
cursor: pointer;
border: none;
transition: all 0.2s;
font-family: var(--font);
}
.btn-primary {
background: var(--accent);
color: #fff;
}
.btn-primary:hover { background: var(--accent2); transform: translateY(-1px); }
.btn-secondary {
background: var(--surface);
color: var(--text);
border: 1px solid var(--border);
}
.btn-secondary:hover { background: var(--surface2); }
.btn-white {
background: rgba(255,255,255,0.1);
color: #fff;
border: 1px solid rgba(255,255,255,0.2);
}
.btn-white:hover { background: rgba(255,255,255,0.18); }
.btn-accent {
background: var(--accent);
color: #fff;
}
.btn-accent:hover { background: var(--accent2); }
/* ============================================
HERO
============================================ */
.hero {
max-width: 1200px;
margin: 0 auto;
padding: 80px 24px 60px;
display: grid;
grid-template-columns: 1fr auto;
gap: 60px;
align-items: center;
}
.hero-badge {
display: inline-block;
padding: 5px 14px;
background: rgba(108, 99, 255, 0.15);
border: 1px solid rgba(108, 99, 255, 0.3);
border-radius: 20px;
font-size: 0.8rem;
color: var(--accent2);
font-weight: 600;
letter-spacing: 0.05em;
text-transform: uppercase;
margin-bottom: 20px;
}
.hero-title {
font-size: clamp(2rem, 5vw, 3.2rem);
font-weight: 800;
line-height: 1.15;
margin-bottom: 18px;
}
.accent { color: var(--accent); }
.hero-sub {
color: var(--text2);
font-size: 1.05rem;
max-width: 480px;
margin-bottom: 30px;
}
.hero-cta { display: flex; gap: 12px; flex-wrap: wrap; margin-bottom: 40px; }
.hero-stats {
display: flex;
gap: 36px;
}
.stat { display: flex; flex-direction: column; gap: 2px; }
.stat-n { font-size: 1.8rem; font-weight: 800; color: var(--text); }
.stat-label { font-size: 0.78rem; color: var(--text2); text-transform: uppercase; letter-spacing: 0.05em; }
.hero-visual {
display: flex;
flex-direction: column;
gap: 12px;
flex-shrink: 0;
}
.card-float {
padding: 14px 22px;
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius);
font-size: 0.9rem;
font-weight: 600;
color: var(--text);
white-space: nowrap;
animation: floatAnim 3s ease-in-out infinite;
}
.card-1 { animation-delay: 0s; }
.card-2 { animation-delay: 0.7s; }
.card-3 { animation-delay: 1.4s; }
@keyframes floatAnim {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-6px); }
}
/* ============================================
SUBJECTS SECTION
============================================ */
.subjects-section, .modes-section {
padding: 60px 24px;
}
.section-inner { max-width: 1200px; margin: 0 auto; }
.section-title {
font-size: 1.6rem;
font-weight: 700;
margin-bottom: 32px;
}
.subjects-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 20px;
}
.subject-card {
--card-color: #6c63ff;
display: flex;
flex-direction: column;
gap: 10px;
padding: 28px;
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
text-decoration: none;
color: var(--text);
position: relative;
overflow: hidden;
transition: all 0.25s;
}
.subject-card::before {
content: '';
position: absolute;
top: 0; left: 0; right: 0;
height: 3px;
background: var(--card-color);
border-radius: var(--radius-lg) var(--radius-lg) 0 0;
}
.subject-card:hover {
border-color: var(--card-color);
transform: translateY(-4px);
box-shadow: 0 12px 40px rgba(0,0,0,0.4);
}
.subject-icon { font-size: 2.4rem; }
.subject-name { font-size: 1.2rem; font-weight: 700; }
.subject-desc { font-size: 0.85rem; color: var(--text2); flex: 1; }
.subject-meta { font-size: 0.8rem; color: var(--accent2); font-weight: 600; }
.subject-arrow {
position: absolute;
right: 24px;
bottom: 24px;
font-size: 1.1rem;
color: var(--text2);
transition: transform 0.2s;
}
.subject-card:hover .subject-arrow { transform: translateX(4px); }
.modes-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
}
.mode-card {
padding: 32px;
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
}
.mode-icon { font-size: 2rem; margin-bottom: 12px; }
.mode-card h3 { font-size: 1.1rem; font-weight: 700; margin-bottom: 8px; }
.mode-card p { color: var(--text2); font-size: 0.9rem; }
/* ============================================
FOOTER
============================================ */
.site-footer {
border-top: 1px solid var(--border);
padding: 28px 24px;
text-align: center;
color: var(--text2);
font-size: 0.85rem;
}
.footer-note { margin-top: 6px; font-size: 0.78rem; opacity: 0.6; }
/* ============================================
SUBJECT PAGE
============================================ */
.subj-hero {
--hero-color: #6c63ff;
background: linear-gradient(135deg, var(--bg2) 0%, var(--bg3) 100%);
border-bottom: 1px solid var(--border);
padding: 36px 24px 28px;
}
.subj-hero-inner {
max-width: 1200px;
margin: 0 auto;
display: flex;
align-items: center;
gap: 20px;
margin-bottom: 20px;
}
.subj-icon { font-size: 3rem; }
.subj-badge {
font-size: 0.78rem;
color: var(--text2);
text-transform: uppercase;
letter-spacing: 0.07em;
margin-bottom: 6px;
}
.subj-title { font-size: 2rem; font-weight: 800; color: var(--hero-color, var(--accent)); }
.subj-sub { color: var(--text2); font-size: 0.9rem; margin-top: 4px; }
.subj-actions {
max-width: 1200px;
margin: 0 auto;
display: flex;
gap: 10px;
flex-wrap: wrap;
}
.subj-layout {
max-width: 1200px;
margin: 0 auto;
padding: 24px;
display: grid;
grid-template-columns: 240px 1fr;
gap: 24px;
align-items: start;
}
/* TOC */
.toc-panel {
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius);
padding: 18px;
position: sticky;
top: 76px;
}
.toc-title {
font-size: 0.75rem;
font-weight: 700;
color: var(--text2);
text-transform: uppercase;
letter-spacing: 0.08em;
margin-bottom: 12px;
}
.toc-list { list-style: none; }
.toc-link {
display: flex;
justify-content: space-between;
align-items: center;
padding: 7px 10px;
border-radius: 8px;
text-decoration: none;
color: var(--text2);
font-size: 0.85rem;
transition: all 0.15s;
}
.toc-link:hover { background: var(--bg3); color: var(--text); }
.toc-count {
background: var(--bg3);
color: var(--text2);
font-size: 0.72rem;
padding: 2px 7px;
border-radius: 10px;
}
/* Mode Toggle */
.mode-toggle {
display: flex;
align-items: center;
gap: 8px;
margin-bottom: 20px;
}
.mode-label { font-size: 0.85rem; color: var(--text2); }
.mode-btn {
padding: 7px 16px;
border-radius: 8px;
border: 1px solid var(--border);
background: var(--surface);
color: var(--text2);
font-size: 0.85rem;
font-weight: 500;
cursor: pointer;
font-family: var(--font);
transition: all 0.15s;
}
.mode-btn.active, .mode-btn:hover {
background: var(--accent);
color: #fff;
border-color: var(--accent);
}
/* Chapter blocks */
.chapter-block {
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
margin-bottom: 16px;
overflow: hidden;
}
.chapter-header {
padding: 18px 22px;
display: flex;
justify-content: space-between;
align-items: center;
cursor: pointer;
user-select: none;
transition: background 0.15s;
}
.chapter-header:hover { background: var(--surface2); }
.chapter-title {
font-size: 1rem;
font-weight: 700;
display: flex;
align-items: center;
gap: 12px;
}
.ch-num {
width: 28px; height: 28px;
background: var(--accent);
color: #fff;
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
font-size: 0.8rem;
font-weight: 700;
flex-shrink: 0;
}
.ch-toggle { color: var(--text2); font-size: 0.85rem; transition: transform 0.2s; }
/* Q items */
.q-item {
border-top: 1px solid var(--border);
}
.q-header {
padding: 16px 22px;
cursor: pointer;
display: flex;
flex-direction: column;
gap: 8px;
transition: background 0.15s;
}
.q-header:hover { background: var(--bg2); }
.q-header.open { background: rgba(108, 99, 255, 0.04); }
.q-text {
font-size: 0.95rem;
color: var(--text);
line-height: 1.55;
display: flex;
gap: 10px;
}
.q-num {
font-size: 0.72rem;
font-weight: 700;
color: var(--accent2);
background: rgba(108, 99, 255, 0.12);
padding: 2px 8px;
border-radius: 6px;
flex-shrink: 0;
height: fit-content;
margin-top: 2px;
}
.q-meta-row {
display: flex;
align-items: center;
gap: 8px;
}
.q-year {
font-size: 0.75rem;
color: var(--text2);
background: var(--bg3);
padding: 2px 8px;
border-radius: 6px;
}
.q-marks {
font-size: 0.75rem;
color: #f1c40f;
background: rgba(241, 196, 15, 0.1);
padding: 2px 8px;
border-radius: 6px;
}
.q-toggle-icon {
margin-left: auto;
color: var(--text2);
font-size: 1.1rem;
font-weight: 300;
}
.q-answer {
padding: 18px 22px 22px;
background: var(--bg2);
border-top: 1px solid var(--border);
}
.answer-label {
font-size: 0.72rem;
font-weight: 700;
color: #2ecc71;
text-transform: uppercase;
letter-spacing: 0.08em;
margin-bottom: 8px;
}
.answer-text {
font-size: 0.92rem;
color: var(--text);
line-height: 1.65;
}
/* ============================================
INLINE FLASHCARD (subject page)
============================================ */
.fc-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
flex-wrap: wrap;
gap: 12px;
}
.fc-progress-wrap {
display: flex;
align-items: center;
gap: 12px;
}
.fc-progress-bar {
width: 200px;
height: 6px;
background: var(--border);
border-radius: 3px;
overflow: hidden;
}
.fc-progress-fill {
height: 100%;
background: var(--accent);
border-radius: 3px;
transition: width 0.3s ease;
}
.fc-controls { display: flex; gap: 8px; }
.fc-btn {
padding: 7px 14px;
border-radius: 8px;
border: 1px solid var(--border);
background: var(--surface);
color: var(--text);
font-size: 0.82rem;
font-weight: 500;
cursor: pointer;
font-family: var(--font);
transition: all 0.15s;
}
.fc-btn:hover { background: var(--surface2); }
.fc-btn-shuffle { color: var(--accent); border-color: var(--accent); }
.fc-btn-shuffle:hover { background: rgba(108, 99, 255, 0.12); }
/* Flip card */
.fc-card, .fc-big-card {
cursor: pointer;
perspective: 1000px;
height: 260px;
margin-bottom: 16px;
}
.fc-inner {
position: relative;
width: 100%;
height: 100%;
transform-style: preserve-3d;
transition: transform 0.55s cubic-bezier(0.4, 0, 0.2, 1);
}
.fc-inner.flipped { transform: rotateY(180deg); }
.fc-front, .fc-back {
position: absolute;
width: 100%;
height: 100%;
backface-visibility: hidden;
border-radius: var(--radius-lg);
padding: 28px;
display: flex;
flex-direction: column;
justify-content: center;
border: 1px solid var(--border);
}
.fc-front {
background: var(--surface);
border-top: 3px solid var(--accent);
}
.fc-back {
background: var(--bg2);
border-top: 3px solid #2ecc71;
transform: rotateY(180deg);
}
.fc-question, .fc-big-question {
font-size: 1.05rem;
font-weight: 600;
line-height: 1.55;
color: var(--text);
margin-bottom: 16px;
}
.fc-hint {
font-size: 0.8rem;
color: var(--text2);
text-align: center;
}
.fc-answer-label {
font-size: 0.75rem;
font-weight: 700;
color: #2ecc71;
text-transform: uppercase;
letter-spacing: 0.08em;
margin-bottom: 10px;
}
.fc-answer, .fc-big-answer {
font-size: 0.92rem;
line-height: 1.65;
color: var(--text);
}
.fc-meta {
display: flex;
gap: 14px;
font-size: 0.8rem;
color: var(--text2);
}
/* ============================================
FULL FLASHCARD PAGE
============================================ */
.fc-fullpage { background: var(--bg); }
.fc-full-wrap {
max-width: 800px;
margin: 0 auto;
padding: 28px 20px 60px;
}
.fc-top-bar {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
flex-wrap: wrap;
gap: 12px;
}
.fc-subject-tabs {
display: flex;
gap: 8px;
flex-wrap: wrap;
}
.fc-tab {
padding: 7px 16px;
border-radius: 20px;
border: 1px solid var(--border);
background: var(--surface);
color: var(--text2);
font-size: 0.83rem;
font-weight: 500;
cursor: pointer;
font-family: var(--font);
transition: all 0.15s;
}
.fc-tab.active {
background: var(--accent);
color: #fff;
border-color: var(--accent);
}
.fc-top-actions { display: flex; gap: 8px; }
.fc-full-progress {
margin-bottom: 20px;
display: flex;
align-items: center;
gap: 14px;
}
.fc-full-progress .fc-progress-bar { flex: 1; height: 8px; }
.fc-counter-badge {
font-size: 0.82rem;
color: var(--text2);
white-space: nowrap;
font-weight: 600;
}
/* Big card */
.fc-big-card {
height: 360px;
margin-bottom: 0;
}
.fc-big-card .fc-front {
border-top: 4px solid var(--card-accent, var(--accent));
justify-content: space-between;
}
.fc-big-card .fc-back {
border-top: 4px solid #2ecc71;
justify-content: space-between;
overflow-y: auto;
}
.fc-card-top {
display: flex;
gap: 8px;
flex-wrap: wrap;
margin-bottom: 12px;
}
.fc-chapter-tag {
font-size: 0.75rem;
font-weight: 600;
background: var(--bg3);
color: var(--text2);
padding: 3px 10px;
border-radius: 8px;
}
.fc-subj-tag {
font-size: 0.75rem;
font-weight: 600;
padding: 3px 10px;
border-radius: 8px;
}
.fc-big-question { font-size: 1.15rem; flex: 1; }
.fc-hint-text {
font-size: 0.82rem;
color: var(--text2);
text-align: center;
padding: 12px 0 0;
border-top: 1px solid var(--border);
}
.hint-icon { margin-right: 4px; }
.fc-big-answer { flex: 1; font-size: 0.95rem; overflow-y: auto; }
.fc-card-bottom {
display: flex;
gap: 14px;
font-size: 0.8rem;
color: var(--text2);
padding-top: 12px;
border-top: 1px solid var(--border);
margin-top: 12px;
}
/* Nav bar */
.fc-nav-bar {
display: flex;
align-items: center;
justify-content: space-between;
padding: 16px 0;
flex-wrap: wrap;
gap: 12px;
}
.fc-nav-btn {
padding: 10px 24px;
border-radius: 10px;
border: 1px solid var(--border);
background: var(--surface);
color: var(--text);
font-size: 0.9rem;
font-weight: 600;
cursor: pointer;
font-family: var(--font);
transition: all 0.15s;
}
.fc-nav-btn:hover { background: var(--surface2); border-color: var(--accent); color: var(--accent); }
.fc-rating {
display: flex;
align-items: center;
gap: 8px;
flex-wrap: wrap;
}
.rating-label { font-size: 0.8rem; color: var(--text2); }
.rate-btn {
padding: 7px 14px;
border-radius: 8px;
border: none;
font-size: 0.82rem;
font-weight: 600;
cursor: pointer;
font-family: var(--font);
transition: all 0.15s;
}
.rate-hard { background: rgba(231, 76, 60, 0.15); color: #e74c3c; }
.rate-hard:hover { background: rgba(231, 76, 60, 0.28); }
.rate-ok { background: rgba(243, 156, 18, 0.15); color: #f39c12; }
.rate-ok:hover { background: rgba(243, 156, 18, 0.28); }
.rate-easy { background: rgba(46, 204, 113, 0.15); color: #2ecc71; }
.rate-easy:hover { background: rgba(46, 204, 113, 0.28); }
.fc-score-bar {
display: flex;
gap: 16px;
justify-content: center;
padding: 14px;
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius);
flex-wrap: wrap;
}
.score-item { font-size: 0.85rem; color: var(--text2); }
.score-hard strong { color: #e74c3c; }
.score-ok strong { color: #f39c12; }
.score-easy strong { color: #2ecc71; }
/* ============================================
RESPONSIVE
============================================ */
@media (max-width: 900px) {
.hero { grid-template-columns: 1fr; }
.hero-visual { display: none; }
.subjects-grid { grid-template-columns: 1fr; }
.modes-grid { grid-template-columns: 1fr; }
.subj-layout { grid-template-columns: 1fr; }
.toc-panel { position: static; }
}
@media (max-width: 600px) {
.header-nav { display: none; }
.hero { padding: 40px 16px 40px; }
.fc-rating { display: none; }
}
cd /home/daytona/workspace/kuhs-wise && find . -type f | sort && echo "---" && l…
cd /home/daytona/workspace && zip -r kuhs-wise.zip kuhs-wise/ && ls -lh kuhs-wis…
cd /home/daytona/workspace && cp kuhs-wise/assets/style.css /tmp/style.css && cp…
ls -lh /home/daytona/workspace/kuhs-wise/assets/style.css /home/daytona/workspac…
kuhs-wise/
├── index.html
├── subject.html
├── flashcard.html
├── assets/
│ └── style.css
└── data/
└── questions.js ← Add your PYQs here
index
HTML File · HTML
subject
HTML File · HTML
flashcard
HTML File · HTML
style
CSS File · CSS
questions
JavaScript File · JS
Space to flip, ← → to navigate, 1/2/3 to ratedata/questions.js and add entries in this format:{ q: "Your question here", a: "Answer / key points", year: "2023", marks: 10 }
How to enter data here and how can I use
data/questions.jsquestions array:{
name: "Upper Limb",
questions: [
// existing questions...
// ADD YOUR NEW QUESTION HERE:
{ q: "Write a note on the rotator cuff muscles.", a: "SITS — Supraspinatus, Infraspinatus, Teres minor, Subscapularis. All attach to greater/lesser tubercle of humerus. Supraspinatus: initiates abduction (first 15°). Most commonly torn tendon: supraspinatus.", year: "2023", marks: 5 }
]
}
| Field | What it is | Required? |
|---|---|---|
q | The question text | Yes |
a | Answer / key points | Yes |
year | Year it appeared (e.g. "2023") | Optional |
marks | Marks allotted (e.g. 5 or 10) | Optional |
chapters array:{
name: "Histology", // ← your new chapter name
questions: [
{ q: "Describe the histology of the liver.", a: "Hepatocytes arranged in cords...", year: "2023", marks: 10 },
{ q: "Describe stratified squamous epithelium.", a: "Multiple layers, basal layer...", year: "2022", marks: 5 }
]
}
questions.js, add a new entry:, // ← comma after previous subject
secondyear_anatomy: {
title: "Anatomy (2nd Year)",
color: "#e67e22",
icon: "🫀",
chapters: [
{
name: "Chapter Name",
questions: [
{ q: "Question", a: "Answer", year: "2023", marks: 10 }
]
}
]
}
index.html - it opens in your browserkuhs-wise folderkuhs-wise.vercel.app — share with friendskuhs-wise folder onto the page| What you want | How |
|---|---|
| Browse questions | Click a subject → read chapter by chapter |
| Reveal an answer | Click the question row |
| Flashcard practice | Click "Flashcard Mode" button |
| Shuffle cards | Click 🔀 Shuffle |
| Rate difficulty | Press 😰 Hard / 😐 OK / 😊 Easy (or keys 1 2 3) |
| Next/Prev card | Arrow keys ← → or buttons |
| Flip card | Press Space or tap the card |
| Study one subject | Go to that subject page → switch to Flashcard tab |
| Study all subjects | Go to flashcard.html directly → select "All Subjects" |
questions.js, paste in the question + your notes as the answerquestions.js, just save and refresh the browser - no build step neededDeploy this site to Vercel for you (live link)
kuhs-wise folder onto the pagerandom-name-123.netlify.appkuhs-wise.netlify.appvercel.app link)npm install -g vercel
cd path/to/kuhs-wise
vercel
yourusername.github.io/kuhs-wiseGive example for excel Sheet
~/kuhs-wise/build_excel.py
import openpyxl
from openpyxl.styles import (
Font, PatternFill, Alignment, Border, Side, GradientFill
)
from openpyxl.utils import get_column_letter
from openpyxl.worksheet.datavalidation import DataValidation
wb = openpyxl.Workbook()
# ─────────────────────────────────────────────
# COLOUR PALETTE
# ─────────────────────────────────────────────
DARK_BG = "0F1117"
ACCENT = "6C63FF"
ACCENT_LIGHT = "EAE8FF"
GREEN = "2ECC71"
GREEN_LIGHT= "D5F5E3"
RED_LIGHT = "FADBD8"
YELLOW_LIGHT="FEF9E7"
PURPLE_LIGHT="F5EEF8"
GREY_BG = "F2F3F4"
BORDER_CLR = "D5D8DC"
WHITE = "FFFFFF"
BLACK = "000000"
SUBJ_COLORS = {
"Anatomy": ("E74C3C", "FDEDEC"),
"Physiology": ("2ECC71", "EAFAF1"),
"Biochemistry": ("9B59B6", "F5EEF8"),
}
def side(style="thin", color=BORDER_CLR):
return Side(style=style, color=color)
def thin_border():
s = side()
return Border(left=s, right=s, top=s, bottom=s)
def header_font(size=11, bold=True, color=WHITE):
return Font(name="Arial", size=size, bold=bold, color=color)
def body_font(size=10, bold=False, color=BLACK):
return Font(name="Arial", size=size, bold=bold, color=color)
def fill(hex_color):
return PatternFill("solid", fgColor=hex_color)
def wrap_center(horizontal="center", vertical="center", wrap=True):
return Alignment(horizontal=horizontal, vertical=vertical, wrap_text=wrap)
def wrap_left():
return Alignment(horizontal="left", vertical="top", wrap_text=True)
# ─────────────────────────────────────────────
# SHEET 1: INSTRUCTIONS
# ─────────────────────────────────────────────
ws_inst = wb.active
ws_inst.title = "📋 Instructions"
ws_inst.sheet_view.showGridLines = False
ws_inst.column_dimensions["A"].width = 3
ws_inst.column_dimensions["B"].width = 28
ws_inst.column_dimensions["C"].width = 70
ws_inst.row_dimensions[1].height = 10
# Title block
ws_inst.merge_cells("B2:C2")
ws_inst["B2"] = "🏥 KUHS-Wise — Question Bank Template"
ws_inst["B2"].font = Font(name="Arial", size=16, bold=True, color=ACCENT)
ws_inst["B2"].fill = fill("F8F7FF")
ws_inst["B2"].alignment = Alignment(horizontal="left", vertical="center")
ws_inst.row_dimensions[2].height = 36
ws_inst.merge_cells("B3:C3")
ws_inst["B3"] = "First Year MBBS · Kerala University of Health Sciences"
ws_inst["B3"].font = Font(name="Arial", size=10, color="7F8C8D")
ws_inst["B3"].fill = fill("F8F7FF")
ws_inst["B3"].alignment = Alignment(horizontal="left", vertical="center")
ws_inst.row_dimensions[3].height = 22
ws_inst.row_dimensions[4].height = 12
# Section header helper
def section_head(ws, row, text):
ws.merge_cells(f"B{row}:C{row}")
ws[f"B{row}"] = text
ws[f"B{row}"].font = Font(name="Arial", size=11, bold=True, color=WHITE)
ws[f"B{row}"].fill = fill(ACCENT)
ws[f"B{row}"].alignment = Alignment(horizontal="left", vertical="center", indent=1)
ws.row_dimensions[row].height = 24
def info_row(ws, row, label, value, label_color="5D6D7E", val_bold=False):
ws[f"B{row}"] = label
ws[f"B{row}"].font = Font(name="Arial", size=10, bold=True, color=label_color)
ws[f"B{row}"].fill = fill(GREY_BG)
ws[f"B{row}"].alignment = Alignment(horizontal="left", vertical="top", wrap_text=True, indent=1)
ws[f"B{row}"].border = thin_border()
ws[f"C{row}"] = value
ws[f"C{row}"].font = Font(name="Arial", size=10, bold=val_bold, color=BLACK)
ws[f"C{row}"].fill = fill(WHITE)
ws[f"C{row}"].alignment = Alignment(horizontal="left", vertical="top", wrap_text=True, indent=1)
ws[f"C{row}"].border = thin_border()
ws.row_dimensions[row].height = 36
section_head(ws_inst, 5, "📌 COLUMN GUIDE — what each column means")
cols_info = [
("Subject", "Anatomy, Physiology, or Biochemistry — select from dropdown"),
("Chapter", "Chapter name within the subject (e.g. Upper Limb, Blood, TCA Cycle)"),
("Question", "The full question text exactly as it appeared in the exam"),
("Answer", "Your answer / key points / mnemonics — can be as long as you like"),
("Year", "Year the question appeared (e.g. 2023). Leave blank if unknown."),
("Marks", "Marks allotted: 2, 5, or 10. Leave blank if unknown."),
("Importance", "High / Medium / Low — your personal priority tag"),
("Notes", "Any personal notes, mnemonics, or cross-references"),
]
for i, (col, desc) in enumerate(cols_info, start=6):
info_row(ws_inst, i, col, desc)
ws_inst.row_dimensions[14].height = 10
section_head(ws_inst, 15, "✅ HOW TO USE")
steps = [
("Step 1", "Go to the 'Questions' sheet (tab at the bottom)."),
("Step 2", "Click on the Subject cell → a dropdown appears → pick Anatomy / Physiology / Biochemistry."),
("Step 3", "Fill in Chapter, Question, Answer, Year, Marks."),
("Step 4", "Importance column has a dropdown: High / Medium / Low."),
("Step 5", "The Summary sheet auto-counts your questions per subject."),
("Step 6", "Use Ctrl+F to search for any keyword across the sheet."),
("Step 7", "To filter by subject or chapter: Data → Filter → pick values."),
]
for i, (step, desc) in enumerate(steps, start=16):
info_row(ws_inst, i, step, desc)
ws_inst.row_dimensions[23].height = 10
section_head(ws_inst, 24, "💡 TIPS")
tips = [
("Tip 1", "Keep answers concise with bullet points — easier to flip through."),
("Tip 2", "Use the Importance = High filter before exams to focus on key questions."),
("Tip 3", "The 'Notes' column is great for mnemonics (e.g. NAVY for cubital fossa contents)."),
("Tip 4", "Sort by Year (Data → Sort) to see which questions are most recent."),
("Tip 5", "You can add more subjects by editing the dropdown source in the 'Lists' sheet."),
]
for i, (tip, desc) in enumerate(tips, start=25):
info_row(ws_inst, i, tip, desc)
# ─────────────────────────────────────────────
# SHEET 2: QUESTIONS (main data entry)
# ─────────────────────────────────────────────
ws_q = wb.create_sheet("📝 Questions")
ws_q.sheet_view.showGridLines = False
ws_q.freeze_panes = "A3"
col_widths = [4, 16, 22, 52, 52, 8, 8, 14, 38]
col_keys = ["", "Subject", "Chapter", "Question", "Answer", "Year", "Marks", "Importance", "Notes"]
for i, w in enumerate(col_widths, start=1):
ws_q.column_dimensions[get_column_letter(i)].width = w
# Title row
ws_q.row_dimensions[1].height = 36
ws_q.merge_cells("A1:I1")
ws_q["A1"] = "🏥 KUHS-Wise · First Year MBBS · Question Bank"
ws_q["A1"].font = Font(name="Arial", size=14, bold=True, color=WHITE)
ws_q["A1"].fill = fill(DARK_BG)
ws_q["A1"].alignment = Alignment(horizontal="center", vertical="center")
# Header row
ws_q.row_dimensions[2].height = 30
for col_idx, col_name in enumerate(col_keys, start=1):
cell = ws_q.cell(row=2, column=col_idx, value=col_name if col_name else "")
cell.font = header_font(size=10)
cell.fill = fill(ACCENT)
cell.alignment = wrap_center()
cell.border = thin_border()
# ── Sample data ──────────────────────────────
sample_data = [
# Subject, Chapter, Question, Answer, Year, Marks, Importance, Notes
("Anatomy", "Upper Limb",
"Describe the brachial plexus. Add a note on its clinical importance.",
"Roots C5-T1.\nTrunks: Upper (C5,C6), Middle (C7), Lower (C8,T1).\nDivisions → Cords → Branches.\nClinical: Erb's palsy — upper trunk (waiter's tip). Klumpke's palsy — lower trunk (claw hand).",
2019, 10, "High", "Mnemonic for branches: My Aunty Regrets Rejecting Men (Musculocutaneous, Axillary, Radial, Ulnar, Median)"),
("Anatomy", "Upper Limb",
"Write a note on carpal tunnel — contents and syndrome.",
"Flexor retinaculum + carpal bones form tunnel.\nContents: FDS (4), FDP (4), FPL tendons + median nerve.\nCTS: compression → pain/tingling lateral 3½ fingers, thenar wasting.\nTest: Tinel's, Phalen's.",
2021, 5, "High", "CTS commonest nerve compression syndrome"),
("Anatomy", "Lower Limb",
"Describe the femoral triangle — boundaries and contents.",
"Base: inguinal ligament.\nLateral: sartorius. Medial: adductor longus.\nFloor: iliopsoas + pectineus.\nContents (lat→med): femoral Nerve, Artery, Vein, Y-fronts (lymphatics).\nMnemonic: NAVY",
2019, 10, "High", "NAVY = N(erve) A(rtery) V(ein) Y(lymphatics)"),
("Anatomy", "Thorax",
"Describe the conducting system of the heart.",
"SA node (RA, 60-100 bpm, pacemaker) → AV node (40-60 bpm) → Bundle of His → L + R bundle branches → Purkinje fibres.\nBlood supply: SA node — RCA 60%; AV node — RCA 90%.",
2021, 5, "Medium", "SA node in sulcus terminalis near SVC opening"),
("Anatomy", "Head & Neck",
"Describe the cavernous sinus — contents and thrombosis.",
"Location: beside body of sphenoid.\nContents in lateral wall (top→bottom): CN III, IV, V1, V2.\nWithin sinus: CN VI, ICA.\nThrombosis: spreads from danger area of face via angular + ophthalmic veins.\nFeatures: proptosis, chemosis, ophthalmoplegia.",
2019, 10, "High", "Mnemonic: O-T-O-M-A (III, IV, V1, V2, VI from top)"),
("Physiology", "Blood",
"Describe the coagulation cascade. Add a note on anticoagulants.",
"Extrinsic: TF + VII → X.\nIntrinsic: XII→XI→IX + VIII → X.\nCommon: Xa + Va → prothrombin → thrombin → fibrin.\nAnticoagulants: Heparin (activates AT-III), Warfarin (blocks Vit K factors II,VII,IX,X).",
2019, 10, "High", "Remember: Warfarin = 1972 (factors I,VII,IX,X → just 7,9,10,2)"),
("Physiology", "Blood",
"Write a note on ABO blood group system.",
"A: Ag-A + anti-B. B: Ag-B + anti-A.\nAB: both Ag, no Ab (universal recipient).\nO: no Ag, anti-A + anti-B (universal donor).\nLandsteiner's law: naturally occurring antibodies to absent antigens.",
2021, 5, "Medium", "Universal donor = O-negative (no ABO + no Rh antigens)"),
("Physiology", "Cardiovascular",
"Describe the cardiac cycle. Define cardiac output.",
"Systole (0.3s): isovolumetric contraction → rapid ejection → reduced ejection.\nDiastole (0.5s): isovolumetric relaxation → rapid filling → diastasis.\nCO = HR × SV = 70 × 70 = ~5 L/min.\nRegulated by: preload (Frank-Starling), afterload, contractility, HR.",
2019, 10, "High", "Normal SV = 70 mL; EF = SV/EDV = 70/120 ≈ 58%"),
("Physiology", "Respiratory",
"Describe the O2-Hb dissociation curve. What causes shifts?",
"Sigmoid curve. P50 = 26 mmHg.\nRight shift (↓ affinity): ↑ PCO2, ↑ H+, ↑ temp, ↑ 2,3-DPG, HbS.\nLeft shift (↑ affinity): ↓ PCO2, ↓ H+, ↓ temp, HbF, CO poisoning.",
2019, 10, "High", "CADET — CO2, Acid, DPG, Exercise, Temp → Right shift"),
("Physiology", "Nerve & Muscle",
"Describe the resting membrane potential and action potential.",
"RMP: -70 mV (neuron), -90 mV (muscle). Mainly K+ equilibrium + Na/K ATPase.\nAP: Threshold → Na+ influx (depolarisation, +30 mV) → K+ efflux (repolarisation) → hyperpolarisation.\nAll-or-none law. Refractory periods: absolute (Na channels inactivated), relative.",
2019, 10, "High", "Na/K ATPase: 3 Na out, 2 K in per cycle"),
("Biochemistry", "Carbohydrate Metabolism",
"Describe glycolysis — steps, enzymes and energy yield.",
"10 steps. Investment: 2 ATP used (hexokinase, PFK-1).\nPayoff: 4 ATP + 2 NADH produced.\nNet: 2 ATP + 2 NADH + 2 pyruvate.\nRate-limiting enzyme: PFK-1 (inhibited by ATP/citrate; activated by AMP/F-2,6-BP).",
2019, 10, "High", "PFK-1 = most important regulatory step of glycolysis"),
("Biochemistry", "Carbohydrate Metabolism",
"Describe the TCA cycle — steps, significance and regulation.",
"Acetyl-CoA (2C) + OAA (4C) → citrate (6C). 8 steps.\nPer turn: 3 NADH, 1 FADH2, 1 GTP, 2 CO2.\nTotal/glucose: 10 NADH, 2 FADH2, 2 GTP.\nRate-limiting: isocitrate dehydrogenase (+ by ADP, Ca2+; - by ATP, NADH).\nAmphibolic pathway.",
2020, 10, "High", "Krebs cycle feeds OXPHOS — 1 NADH = 2.5 ATP, 1 FADH2 = 1.5 ATP"),
("Biochemistry", "Lipid Metabolism",
"Calculate ATP yield from complete oxidation of palmitic acid.",
"Palmitate = 16C. Activation costs 2 ATP equivalents.\n7 cycles of beta-oxidation: each gives 1 FADH2 + 1 NADH + 1 Acetyl-CoA.\n8 Acetyl-CoA × 10 ATP = 80. 7 FADH2 × 1.5 = 10.5. 7 NADH × 2.5 = 17.5.\nTotal = 80 + 10.5 + 17.5 - 2 = 106 ATP.",
2019, 10, "High", "Net ATP from palmitate = 106"),
("Biochemistry", "Molecular Biology",
"Describe DNA replication — enzymes involved.",
"Semiconservative (Meselson-Stahl).\nHelicase: unwinds. SSBPs: stabilise. Primase: RNA primer.\nDNA pol III (prokaryote) / pol delta, epsilon (eukaryote): 5'→3' synthesis.\nPol I: removes primer, fills gap. Ligase: joins Okazaki fragments.\nLeading strand: continuous. Lagging: discontinuous.",
2019, 10, "High", "Okazaki fragments on lagging strand — joined by DNA ligase"),
("Biochemistry", "Vitamins & Minerals",
"Describe Vitamin B12 deficiency.",
"Requires intrinsic factor (parietal cells) for absorption in terminal ileum.\nDeficiency: megaloblastic anaemia (↓ DNA synthesis in RBCs), subacute combined degeneration of spinal cord (post + lat columns), glossitis, peripheral neuropathy.\nCauses: pernicious anaemia, veganism, gastrectomy.",
2019, 10, "High", "B12 deficiency → SACD — only B12 causes neurological signs (not folate)"),
]
subj_fill_map = {
"Anatomy": fill("FDEDEC"),
"Physiology": fill("EAFAF1"),
"Biochemistry": fill("F5EEF8"),
}
importance_fill = {
"High": fill("FADBD8"),
"Medium": fill("FEF9E7"),
"Low": fill("EBF5FB"),
}
for r_idx, row in enumerate(sample_data, start=3):
subj, chap, question, answer, year, marks, importance, notes = row
ws_q.row_dimensions[r_idx].height = 72
row_fill = subj_fill_map.get(subj, fill(WHITE))
values = ["", subj, chap, question, answer, year, marks, importance, notes]
for c_idx, val in enumerate(values, start=1):
cell = ws_q.cell(row=r_idx, column=c_idx, value=val)
cell.font = body_font()
cell.fill = row_fill
cell.border = thin_border()
if c_idx in (4, 5, 9): # Question, Answer, Notes — left/top wrap
cell.alignment = wrap_left()
elif c_idx == 8: # Importance
cell.alignment = wrap_center()
if importance in importance_fill:
cell.fill = importance_fill[importance]
cell.font = body_font(bold=True)
else:
cell.alignment = wrap_center()
# ── Data Validation dropdowns ─────────────────
# Subject dropdown (col B = col 2)
dv_subj = DataValidation(
type="list",
formula1='"Anatomy,Physiology,Biochemistry"',
allow_blank=True,
showDropDown=False,
showErrorMessage=True,
errorTitle="Invalid Subject",
error="Choose: Anatomy, Physiology, or Biochemistry"
)
ws_q.add_data_validation(dv_subj)
dv_subj.sqref = "B3:B500"
# Importance dropdown (col H = col 8)
dv_imp = DataValidation(
type="list",
formula1='"High,Medium,Low"',
allow_blank=True,
showDropDown=False,
showErrorMessage=True,
errorTitle="Invalid value",
error="Choose: High, Medium, or Low"
)
ws_q.add_data_validation(dv_imp)
dv_imp.sqref = "H3:H500"
# Marks dropdown (col G = col 7)
dv_marks = DataValidation(
type="list",
formula1='"2,5,10"',
allow_blank=True,
showDropDown=False
)
ws_q.add_data_validation(dv_marks)
dv_marks.sqref = "G3:G500"
# Turn on AutoFilter
ws_q.auto_filter.ref = "B2:I2"
# ─────────────────────────────────────────────
# SHEET 3: SUMMARY
# ─────────────────────────────────────────────
ws_sum = wb.create_sheet("📊 Summary")
ws_sum.sheet_view.showGridLines = False
ws_sum.column_dimensions["A"].width = 3
ws_sum.column_dimensions["B"].width = 22
ws_sum.column_dimensions["C"].width = 18
ws_sum.column_dimensions["D"].width = 18
ws_sum.column_dimensions["E"].width = 18
ws_sum.column_dimensions["F"].width = 18
ws_sum.row_dimensions[1].height = 36
ws_sum.merge_cells("B1:F1")
ws_sum["B1"] = "📊 KUHS-Wise · Question Bank Summary"
ws_sum["B1"].font = Font(name="Arial", size=14, bold=True, color=WHITE)
ws_sum["B1"].fill = fill(DARK_BG)
ws_sum["B1"].alignment = Alignment(horizontal="center", vertical="center")
# Header
headers = ["Subject", "Total Qs", "High Priority", "Medium Priority", "Low Priority"]
ws_sum.row_dimensions[2].height = 28
for c, h in enumerate(headers, start=2):
cell = ws_sum.cell(row=2, column=c, value=h)
cell.font = header_font(size=10)
cell.fill = fill(ACCENT)
cell.alignment = wrap_center()
cell.border = thin_border()
# Subject rows with COUNTIFS formulas
subjects = [
("Anatomy", "FDEDEC", "E74C3C"),
("Physiology", "EAFAF1", "2ECC71"),
("Biochemistry", "F5EEF8", "9B59B6"),
]
for r, (subj, bg, fg) in enumerate(subjects, start=3):
ws_sum.row_dimensions[r].height = 30
ws_sum.cell(row=r, column=2, value=subj).font = Font(name="Arial", size=10, bold=True, color=fg)
ws_sum.cell(row=r, column=2).fill = fill(bg)
ws_sum.cell(row=r, column=2).alignment = wrap_center()
ws_sum.cell(row=r, column=2).border = thin_border()
# Total
total_cell = ws_sum.cell(row=r, column=3,
value=f'=COUNTIF(\'📝 Questions\'!B:B,B{r})')
total_cell.font = Font(name="Arial", size=11, bold=True, color=BLACK)
total_cell.fill = fill(WHITE)
total_cell.alignment = wrap_center()
total_cell.border = thin_border()
# High
high_cell = ws_sum.cell(row=r, column=4,
value=f'=COUNTIFS(\'📝 Questions\'!B:B,B{r},\'📝 Questions\'!H:H,"High")')
high_cell.font = Font(name="Arial", size=10, color="E74C3C")
high_cell.fill = fill("FDEDEC")
high_cell.alignment = wrap_center()
high_cell.border = thin_border()
# Medium
med_cell = ws_sum.cell(row=r, column=5,
value=f'=COUNTIFS(\'📝 Questions\'!B:B,B{r},\'📝 Questions\'!H:H,"Medium")')
med_cell.font = Font(name="Arial", size=10, color="E67E22")
med_cell.fill = fill("FEF9E7")
med_cell.alignment = wrap_center()
med_cell.border = thin_border()
# Low
low_cell = ws_sum.cell(row=r, column=6,
value=f'=COUNTIFS(\'📝 Questions\'!B:B,B{r},\'📝 Questions\'!H:H,"Low")')
low_cell.font = Font(name="Arial", size=10, color="2980B9")
low_cell.fill = fill("EBF5FB")
low_cell.alignment = wrap_center()
low_cell.border = thin_border()
# Total row
ws_sum.row_dimensions[6].height = 30
ws_sum.cell(row=6, column=2, value="TOTAL").font = Font(name="Arial", size=10, bold=True, color=WHITE)
ws_sum.cell(row=6, column=2).fill = fill(ACCENT)
ws_sum.cell(row=6, column=2).alignment = wrap_center()
ws_sum.cell(row=6, column=2).border = thin_border()
for c in range(3, 7):
col_letter = get_column_letter(c)
cell = ws_sum.cell(row=6, column=c, value=f'=SUM({col_letter}3:{col_letter}5)')
cell.font = Font(name="Arial", size=11, bold=True, color=WHITE)
cell.fill = fill(ACCENT)
cell.alignment = wrap_center()
cell.border = thin_border()
# Usage note
ws_sum.row_dimensions[8].height = 20
ws_sum.merge_cells("B8:F8")
ws_sum["B8"] = "ℹ️ This sheet auto-updates as you add questions in the '📝 Questions' tab."
ws_sum["B8"].font = Font(name="Arial", size=9, italic=True, color="7F8C8D")
ws_sum["B8"].alignment = Alignment(horizontal="left", vertical="center", indent=1)
# ─────────────────────────────────────────────
# SAVE
# ─────────────────────────────────────────────
out_path = "/home/daytona/workspace/kuhs-wise/KUHS_Wise_QuestionBank.xlsx"
wb.save(out_path)
print(f"Saved: {out_path}")
cd /home/daytona/workspace/kuhs-wise && python3 build_excel.py
python3 -c " import openpyxl, shutil wb = openpyxl.Workbook() ws = wb.active ws.…
# Try writing directly via Python open() to workspace python3 -c " import openpy…
~/kuhs-wise/build_excel.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/kuhs-wise/build_excel.py'
cd /home/daytona/workspace/kuhs-wise && python3 build_excel.py
ls /home/daytona/skills/xlsx/scripts/
python3 /home/daytona/skills/xlsx/scripts/recalc.py /home/daytona/workspace/kuhs…
KUHS Wise QuestionBank
Spreadsheet · XLSX
| Column | What to enter |
|---|---|
| Subject | Dropdown: Anatomy / Physiology / Biochemistry |
| Chapter | e.g. Upper Limb, Blood, TCA Cycle |
| Question | Full question text |
| Answer | Key points / answer notes |
| Year | e.g. 2023 |
| Marks | Dropdown: 2 / 5 / 10 |
| Importance | Dropdown: High / Medium / Low |
| Notes | Mnemonics, cross-references |