1const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/VirtualChemistryLab-BRMlLSpf.js","assets/index-CvryZg2y.js","assets/index-BkM8tNZ-.css","assets/katex-BvYD9Wje.js","assets/ExperimentQuiz-CkAzPsXE.js","assets/ExperimentQuiz-CO6x0uKw.css","assets/LabNotebook-CjYCu0j2.js","assets/notebook-pen-Ci_xFuN5.js","assets/table-2-DJewBNq6.js","assets/clipboard-check-bpdWY8e3.js","assets/target-DU3srWsL.js","assets/sliders-horizontal-DvQ3pI8h.js","assets/trash-2-pPBTvsdD.js","assets/plus-DEGhW61T.js","assets/chart-line-Cmdgqw4k.js","assets/flask-conical-BxbTZ5Jf.js","assets/file-text-RB9sNmBn.js","assets/LabNotebook-DlI673Yv.css","assets/usePragyaSurface-OvOOpmyT.js","assets/volume-x-Cu2qJ8U3.js","assets/beaker-BFSkcAJR.js","assets/index--t23_w_l.js","assets/proxy-DnHXzI4M.js","assets/index-CXHAiFMv.js","assets/triangle-alert-CDsKQR1n.js","assets/thermometer-CuF4kVxT.js","assets/rotate-ccw-kLCO3NtX.js","assets/flame-BnX2yRQw.js","assets/gauge-CSsn7MxK.js","assets/droplets-CvhPj2Se.js","assets/activity-BOvWq8lV.js","assets/clipboard-list-BjZ490rV.js","assets/funnel-BWxdJ4LP.js","assets/list-checks-CaCyvCSo.js","assets/circle-play-ChrAnhzf.js","assets/wrench-Bkz9S00n.js","assets/book-open-check-CSCa5-52.js","assets/lightbulb-CgqbJc1n.js","assets/calculator-CaTEsGhq.js","assets/graduation-cap-DdDIfC1Y.js","assets/PragyaHub-DTIcaPCN.js","assets/loader-circle--EhcBSnm.js","assets/inbox-D_q7Zvf6.js","assets/zap-Crek0j8J.js","assets/atom-D9ueUzAI.js","assets/microscope-CNreTJUY.js","assets/ruler-BOsxUq92.js","assets/code-xml-vHpRujdS.js","assets/cpu-CnWQ3cf8.js","assets/VirtualChemistryLab-CByscVcr.css","assets/katex-BVwrCjs-.css","assets/AtomicStudio-CLRAl_ID.js","assets/pencil-ruler-I9PY96UH.js","assets/git-compare-arrows-BrJeLTDh.js","assets/AtomicStudio-ndbL3rVz.css","assets/BiologyLab-C0OgkKFh.js","assets/OrbitControls-jDczZLyi.js","assets/extends-CF3RwP-h.js","assets/index-BZ2t2ME_.js","assets/tags-CoYyrz-Z.js","assets/arrow-up-BLLapwLA.js","assets/arrow-right-CFL0g_jY.js","assets/arrow-down-YTuBz5Rc.js","assets/grid-3x3-D-NHnKHo.js","assets/sprout-DOjTx-3E.js","assets/minus-MsnFDokF.js","assets/chart-column-CTH8citA.js","assets/labProgress-CArZTiPa.js","assets/git-branch-C6dX498M.js","assets/SmallScreenNotice-C0kokM2A.js","assets/SmallScreenNotice-DPXS7tMt.css","assets/Html-DbIy2Im2.js","assets/BiologyLab-CeRPQBW_.css","assets/VirtualPhysicsLab-D94Tecx6.js","assets/AIResponseRenderer-DkhlkspC.js","assets/latex-Bfk3Hi5w.js","assets/index-DC-VXHQP.js","assets/index-Do9nf_cO.js","assets/index-oIOyv2x5.js","assets/magnet-DWz-60VQ.js","assets/waves-BNioVWbs.js","assets/clock-CuRAHkr0.js","assets/circle-plus-BI4a6CHh.js","assets/scale-C8R0FHMi.js","assets/play-59NcJjO-.js","assets/square-DmpgiWbf.js","assets/VirtualPhysicsLab-mY4QAPky.css","assets/MathLab-BM-CPqyu.js","assets/MathLab-CBM-qMVV.css","assets/CodingLab-DB9MwVTI.js","assets/OutputConsole-086EhlMa.js","assets/codemirror-BJrS-hsQ.js","assets/chevron-left-Cz3WoJrI.js","assets/chevron-right-D3DXO-Mc.js","assets/core.esm-DUOlxgWz.js","assets/sortable.esm-xozrUdp9.js","assets/grip-vertical-BwjtYKux.js","assets/chevron-down-BiCurtxW.js","assets/trophy-DgYYpqSk.js","assets/route-8rTHp1Eq.js","assets/bug-NTKVRCHi.js","assets/eye-off-Cjsr5UAt.js","assets/keyboard-DwDSR6_t.js","assets/image-BADcgNFi.js","assets/lock-open-BNfzmhGo.js","assets/CodingLab-Bzzcs-pa.css","assets/index-DK-k4PS4.js","assets/circuit-board-BsgGJ_v_.js","assets/undo-2-GnvWxbPU.js","assets/redo-2-Db2Et94C.js","assets/upload-CwGg4gQW.js","assets/radio-Cy0lK1uG.js","assets/mouse-pointer-2-BtNfp4di.js","assets/cable-892EQ6bI.js","assets/zoom-out-C6nnwMpP.js","assets/zoom-in-DDYJhvYE.js","assets/maximize-2-ozKqfu6T.js","assets/move-BHE4ANDj.js","assets/list-COMHQxDQ.js","assets/rotate-cw-CbWye4L5.js","assets/circle-alert-C0UTuZRm.js","assets/index-CqbGKDAY.css"])))=>i.map(i=>d[i]); 2import{g as Ke,r as m,j as t,S as We,C as ve,G as Xe,f as De,x as Ze,X as Je,s as Ye,w as et,e as tt,u as at,a as it,_ as V}from"./index-CvryZg2y.js";import{S as qe}from"./sliders-horizontal-DvQ3pI8h.js";import{G as ze}from"./gauge-CSsn7MxK.js";import{D as rt}from"./droplets-CvhPj2Se.js";import{R as ot}from"./rotate-ccw-kLCO3NtX.js";import{C as de}from"./clipboard-check-bpdWY8e3.js";import{T as ue}from"./target-DU3srWsL.js";import{T as Ge}from"./triangle-alert-CDsKQR1n.js";import{B as He}from"./beaker-BFSkcAJR.js";import{F as J}from"./flask-conical-BxbTZ5Jf.js";import{A as nt}from"./activity-BOvWq8lV.js";import{C as st}from"./chart-line-Cmdgqw4k.js";import{C as re}from"./clipboard-list-BjZ490rV.js";import{F as lt}from"./funnel-BWxdJ4LP.js";import{L as Ve}from"./list-checks-CaCyvCSo.js";import{C as ct}from"./circle-play-ChrAnhzf.js";import{N as dt}from"./notebook-pen-Ci_xFuN5.js";import{W as ke}from"./wrench-Bkz9S00n.js";import{B as ut}from"./book-open-check-CSCa5-52.js";import{L as pt}from"./lightbulb-CgqbJc1n.js";import{T as mt}from"./table-2-DJewBNq6.js";import{C as ht}from"./calculator-CaTEsGhq.js";import{G as bt}from"./graduation-cap-DdDIfC1Y.js";import{F as gt}from"./file-text-RB9sNmBn.js";import{P as vt,a as yt,d as ft,e as xt}from"./PragyaHub-DTIcaPCN.js";import{Z as wt}from"./zap-Crek0j8J.js";import{A as Ct}from"./atom-D9ueUzAI.js";import{M as jt}from"./microscope-CNreTJUY.js";import{R as kt}from"./ruler-BOsxUq92.js";import{C as St}from"./code-xml-vHpRujdS.js";import{C as $t}from"./cpu-CnWQ3cf8.js";/** 3 * @license lucide-react v0.562.0 - ISC 4 * 5 * This source code is licensed under the ISC license. 6 * See the LICENSE file in the root directory of this source tree. 7 */const Nt=[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",ke
7y:"oel41y"}],["path",{d:"M12 8v4",key:"1got3b"}],["path",{d:"M12 16h.01",key:"1drbdi"}]],Rt=Ke("shield-alert",Nt),X={physics:{label:"Physics",tone:"blue"},chemistry:{label:"Chemistry",tone:"amber"},biology:{label:"Biology",tone:"green"},mathematics:{label:"Maths",tone:"indigo"},electronics:{label:"Electronics",tone:"slate"}},Pt=[{id:"all",label:"All boards"},{id:"cbse",label:"CBSE"},{id:"icse",label:"ICSE"},{id:"isc",label:"ISC"}],Tt=[{id:"all",label:"All grades"},{id:"7",label:"7"},{id:"8",label:"8"},{id:"9",label:"9"},{id:"10",label:"10"},{id:"11",label:"11"},{id:"12",label:"12"}],oe={ready:{label:"Ready",detail:"Already has an interactive simulator or workbench."},template:{label:"Template",detail:"Covered as a guided lab, observation, project, or report workflow."},partial:{label:"Partial",detail:"Uses an existing lab but still needs a dedicated engine or deeper data capture."}},R=(e,a)=>{const i=new URLSearchParams({tab:e});return a&&i.set("sub",a),`/labs?${i.toString()}`},At=[{id:"physics-screw-gauge-spherometer-beam-balance",subject:"physics",title:"Precision measurement bench",coverage:"partial",mode:"Instrument station",boards:[{board:"cbse",grades:["11"],course:"Physics"},{board:"icse",grades:["9","10"],course:"Physics"},{board:"isc",grades:["11"],course:"Physics"}],aim:"Record least count, zero correction, readings, uncertainty and final result for screw gauge, spherometer and beam balance practicals.",workflow:["Choose instrument and enter observed scale readings.","Apply zero correction and calculate corrected value.","Complete observation table with units and significant figures."],evidence:["Least count","Observation table","Corrected result","Error estimate"],launchLabel:"Open Physics Lab",launchPath:R("physics")},{id:"physics-activity-motion-thermal-fluid",subject:"physics",title:"Activity set: projectile, wax cooling, bimetal strip and Bernoulli flow",coverage:"template",mode:"Activity template",boards:[{board:"cbse",grades:["11"],course:"Physics activities"}],aim:"Capture the required CBSE activity observations that do not need a full apparatus simulator.",workflow:["Select the activity and enter controlled variables.","Plot or compare the observed trend.","Write the inference against the expected physical principle."],evidence:["Variable table","Trend graph","Inference","Source of error"],launchLabel:"Open Physics Lab",launchPath:R("physics")},{id:"physics-middle-school-activity-bridge",subject:"physics",title:"Class 7-8 measurement, heat, motion and electricity activities",coverage:"template",mode:"Junior activity bank",boards:[{board:"cbse",grades:["7","8"],course:"Science"},{board:"icse",grades:["7","8"],course:"Physics/Science"}],aim:"Give lower-secondary students a record format for measurement, simple machines, heat transfer, motion, magnets and basic electric circuits.",workflow:["Select activity family and fill apparatus or household setup.","Record observation, reading or comparison table.","Write the inference in one principle-linked statement."],evidence:["Setup sketch","Observation table","Inference","Everyday application"],launchLabel:"Open Physics Lab",launchPath:R("physics")},{id:"physics-optics-auxiliary-travelling-microscope",subject:"physics",title:"Advanced optics: auxiliary lens and travelling microscope methods",coverage:"partial",mode:"Optics engine gap",boards:[{board:"cbse",grades:["12"],course:"Physics"},{board:"isc",grades:["12"],course:"Physics"}],aim:"Cover concave lens, convex mirror, glass slab refractive index and liquid refractive index variants that extend beyond the current optics bench.",workflow:["Select method: auxiliary convex lens, travelling microscope, or liquid lens-mirror setup.","Enter u, v, shift or apparent-depth readings.","Generate focal length or refractive-index calculation."],evidence:["Ray diagram","Observation table","Graph or formula result","Precautions"],launchLabel:"Open Physics Lab",launchPath:R("physics")},{id:"physics-galvanometer-potentiometer-ac",subject:"physics",title:"Galvanometer, potentiometer and AC mains practicals",coverage:"partial",mode:"Circuit record workflow",boards:[{board:"cbse",grades:["12"],course:"Physics"},{board:"isc",grades:["12"],course:"Physics"}],aim:"Support half-deflection, conversion to ammeter/voltmeter, potentiometer comparison/internal resistance, and AC frequency by sonometer.",workflow:["Choose the circuit method and record balance or deflection readings.","Calculate resistance, figure of merit, EMF ratio, internal resistance or frequency.","Attach calibrated graph and circuit diagram."],evidence:["Circuit diagram","Balance readings","Calculation sheet","Viva prompts"],launchLabel:"Open Electronics Lab",launchPath:R("electronics","board_bank")},{id:"physics-diffraction-polarization-capacitor",subject:"physics",title:"Diffraction, polarization and capacitor transient activities",coverage:"template",mode:"Graph template",boards:[{board:"cbse",grades:["12"],course:"Physics activities"},{board:"isc",grades:["12"],course:"Physics"}],aim:"Give graph-first coverage for single-slit diffraction, Malus-law style polarization observations and RC charging/discharging.",workflow:["Record intensity or voltage readings at selected positions or times.","Plot the required graph and mark the measured feature.","State the experimental inference and limitation."],evidence:["Reading table","Graph","Inference","Safety note"],launchLabel:"Open Physics Lab",launchPath:R("physics")},{id:"chemistry-formal-salt-analysis",subject:"chemistry",title:"Formal salt analysis: cation and anion branches",coverage:"partial",mode:"Decision-tree engine",boards:[{board:"cbse",grades:["11","12"],course:"Chemistry"},{board:"icse",grades:["9","10"],course:"Chemistry"},{board:"isc",grades:["11","12"],course:"Chemistry"}],aim:"Guide students through preliminary tests, group separation, confirmatory tests and deduction notes.",workflow:["Run dry test, dilute-acid test and wet-test branch.","Record colour, precipitate, gas and solubility observations.","Generate final ion deduction with confirmatory evidence."],evidence:["Test sequence","Observation table","Ion deduction","Confirmatory test"],launchLabel:"Open Chemistry Lab",launchPath:R("chemistry","reactions")},{id:"chemistry-extended-gas-tests",subject:"chemistry",title:"Extended gas identification set",coverage:"partial",mode:"Recognition template",boards:[{board:"icse",grades:["9","10"],course:"Chemistry"},{board:"isc",grades:["11"],course:"Chemistry"}],aim:"Add HCl, H2S, NO2 and water vapour to the current H2, O2, CO2, NH3, Cl2 and SO2 gas-test coverage.",workflow:["Choose gas source and run standard indicator or splint test.","Record smell, colour, litmus result and confirmatory reagent.","Compare against a gas-test key."],evidence:["Gas source","Test result","Confirmatory clue","Deduction"],launchLabel:"Open Chemistry Lab",launchPath:R("chemistry","reactions")},{id:"chemistry-middle-school-activity-bridge",subject:"chemistry",title:"Class 7-8 materials, separation, acids/bases and combustion activities",coverage:"template",mode:"Junior activity bank",boards:[{board:"cbse",grades:["7","8"],course:"Science"},{board:"icse",grades:["7","8"],course:"Chemistry/Science"}],aim:"Cover junior chemistry observations for mixtures, filtration, crystallisation, indicators, neutralisation, metals/non-metals and fuels.",workflow:["Choose concept and list sample, reagent or separation method.","Record visible change, pH/indicator result or separated component.","Compare result with expected property and write conclusion."],evidence:["Materials list","Observed change","Property match","Conclusion"],launchLabel:"Open Chemistry Lab",launchPath:R("chemistry","reactions")},{id:"chemistry-volumetric-calculation-engine",subject:"chemistry",title:"Interactive volumetric analysis bench",coverage:"ready",mode:"Titration simulator",boards:[{board:"cbse",grades:["11","12"],course:"Chemistry"},{board:"isc",grades:["11","12"],course:"Chemistry"}],aim:"Perform acid-base, KMnO4 and iodometric titration workflows with endpoint control, concordant titres and molarity calculations.",workflow:["Run rough and accurate trials by controlling the burette and endpoint.","Reject overshot or non-concordant readings with technique feedback.","Capture concordant titres, reaction ratio, molarity and strength into the record sheet."],evidence:["Burette table","Concordant titre","Balanced ratio","Final concentration"]},{id:"chemistry-chromatography-rf",subject:"chemistry",title:"Chromatography Rf workflow",coverage:"template",mode:"Data table template",boards:[{board:"cbse",grades:["11","12"],course:"Chemistry/Biology"},{board:"isc",grades:["11","12"],course:"Chemistry/Biology"}],aim:"Measure solvent front and spot distances for leaf pigments, flower extracts, inks, ions or amino acids.",workflow:["Mark origin, solvent front and separated spots.","Enter distances and compute Rf values.","Identify components by colour and relative Rf."],evidence:["Chromatogram sketch","Distance table","Rf values","Component inference"],lau
7nchLabel:"Open Chemistry Lab",launchPath:R("chemistry","reactions")},{id:"chemistry-functional-food-preparation",subject:"chemistry",title:"Organic, biomolecule and preparation bench",coverage:"partial",mode:"Guided procedure bank",boards:[{board:"cbse",grades:["12"],course:"Chemistry"},{board:"isc",grades:["12"],course:"Chemistry"}],aim:"Round out functional-group tests, carbohydrate/protein tests and preparation of salts or simple organic compounds.",workflow:["Select test family: alcohol, aldehyde, ketone, acid, amino, carbohydrate, fat or protein.","Record reagent, positive result and expected colour or precipitate.","Attach balanced reaction or qualitative inference."],evidence:["Reagent list","Positive/negative result","Inference","Safety disposal"],launchLabel:"Open Chemistry Lab",launchPath:R("chemistry","reactions")},{id:"chemistry-kinetics-enthalpy-electrochem",subject:"chemistry",title:"Kinetics, enthalpy and electrochemistry data capture",coverage:"partial",mode:"Graph workflow",boards:[{board:"cbse",grades:["12"],course:"Chemistry"},{board:"isc",grades:["12"],course:"Chemistry"}],aim:"Cover thiosulphate rate, enthalpy of dissolution/neutralisation and Zn/Cu cell-potential variation.",workflow:["Record time, temperature or EMF readings under changed conditions.","Plot rate, heat change or EMF against concentration.","State trend, calculation and source of error."],evidence:["Controlled variable","Observation table","Graph","Calculation"],launchLabel:"Open Chemistry Lab",launchPath:R("chemistry","reactions")},{id:"biology-dicot-seed-embryo",subject:"biology",title:"Dicot seed embryo dissection",coverage:"template",mode:"Spotting template",boards:[{board:"cbse",grades:["10"],course:"Science"},{board:"icse",grades:["7"],course:"Biology"}],aim:"Identify testa, cotyledons, plumule and radicle in a soaked gram, pea or bean seed.",workflow:["Open the seed coat and separate cotyledons carefully.","Label embryo parts from the specimen image or classroom sample.","Record one function for each part."],evidence:["Labelled diagram","Part identification","Function notes"],launchLabel:"Open Biology Lab",launchPath:R("biology")},{id:"biology-pollen-dna-meiosis",subject:"biology",title:"Pollen germination, DNA isolation and meiosis spotting",coverage:"template",mode:"Slide and process template",boards:[{board:"cbse",grades:["12"],course:"Biology"},{board:"isc",grades:["12"],course:"Biology"}],aim:"Cover senior secondary reproduction and genetics practicals that are not yet in the microscopy bank.",workflow:["Select slide/process and follow reagent or nutrient-medium sequence.","Record visible structure: pollen tube, DNA fibre or meiotic stage.","Attach drawing and diagnostic features."],evidence:["Slide sketch","Reagent sequence","Diagnostic feature","Inference"],launchLabel:"Open Biology Lab",launchPath:R("biology")},{id:"biology-middle-school-activity-bridge",subject:"biology",title:"Class 7-8 microscopy, nutrition, respiration and ecology activities",coverage:"template",mode:"Junior observation bank",boards:[{board:"cbse",grades:["7","8"],course:"Science"},{board:"icse",grades:["7","8"],course:"Biology/Science"}],aim:"Cover leaf, stomata, cells, digestive model, respiration, microorganisms, crop production and conservation observations.",workflow:["Select specimen, model or local-study prompt.","Record labelled sketch and identifying features.","Connect the observation to the life process or ecosystem role."],evidence:["Labelled sketch","Feature notes","Process link","Local example"],launchLabel:"Open Biology Lab",launchPath:R("biology")},{id:"biology-floral-taxonomy",subject:"biology",title:"Floral dissection and taxonomy families",coverage:"template",mode:"Taxonomy worksheet",boards:[{board:"cbse",grades:["11"],course:"Biology"},{board:"isc",grades:["11","12"],course:"Biology"}],aim:"Build family identification, floral formula and floral diagram records for Solanaceae, Fabaceae, Liliaceae and ISC families.",workflow:["Enter flower family and observed whorl features.","Draw floral diagram and write floral formula.","List identifying characters and economic importance."],evidence:["Dissection notes","Floral diagram","Formula","Family reason"],launchLabel:"Open Biology Lab",launchPath:R("biology")},{id:"biology-food-urine-biochemical-tests",subject:"biology",title:"Food and urine biochemical tests",coverage:"template",mode:"Reagent checklist",boards:[{board:"cbse",grades:["11"],course:"Biology"},{board:"icse",grades:["10"],course:"Biology"},{board:"isc",grades:["11"],course:"Biology"}],aim:"Cover starch, sugar, protein, fat, urea, albumin and bile-salt tests using shared Biology/Chemistry records.",workflow:["Choose sample and reagent test.","Record colour change, precipitate or spot result.","Mark positive or negative inference."],evidence:["Sample type","Reagent","Observed change","Inference"],lau
7nchLabel:"Open Biology Lab",launchPath:R("biology")},{id:"biology-plant-physiology-setups",subject:"biology",title:"Plant physiology setup bank",coverage:"template",mode:"Setup diagram template",boards:[{board:"cbse",grades:["10","11"],course:"Science/Biology"},{board:"icse",grades:["9","10"],course:"Biology"},{board:"isc",grades:["11"],course:"Biology"}],aim:"Cover photosynthesis requirements, Hydrilla oxygen release, transpiration bell jar, cobalt chloride, potometer, osmosis and diffusion.",workflow:["Select experiment and label the apparatus diagram.","Record before/after observation and controlled variable.","Write inference tied to the physiological process."],evidence:["Setup diagram","Observation","Control","Inference"],launchLabel:"Open Biology Lab",launchPath:R("biology")},{id:"biology-spotting-field-study",subject:"biology",title:"Specimen spotting, field study and water sample bank",coverage:"template",mode:"Observation bank",boards:[{board:"icse",grades:["7","10"],course:"Biology"},{board:"isc",grades:["11","12"],course:"Biology"},{board:"cbse",grades:["11","12"],course:"Biology"}],aim:"Add broad model/specimen spotting, water sample microscopy, waste-management visits and ecology project templates.",workflow:["Choose spotting or field-study prompt.","Record identifying characters, labelled sketch and local observation.","Submit conclusion with two improvement or conservation notes."],evidence:["Identification","Labelled sketch","Field notes","Conclusion"],launchLabel:"Open Biology Lab",launchPath:R("biology")},{id:"math-cbse-secondary-lab",subject:"mathematics",title:"CBSE Class X mathematics lab activities",coverage:"template",mode:"Activity bank",boards:[{board:"cbse",grades:["10"],course:"Mathematics"}],aim:"Map prescribed-book lab activities to construction, graphing, trigonometry, statistics and probability work products.",workflow:["Select chapter-linked activity and choose tool: geometry, graphing or data.","Enter construction or dataset.","Record observation, result and conclusion."],evidence:["Construction/graph","Observation","Conclusion","Teacher check"],launchLabel:"Open Math Lab",launchPath:R("math","board-bank")},{id:"math-middle-school-activity-bank",subject:"mathematics",title:"Class 7-8 mathematics activity bank",coverage:"template",mode:"Junior activity file",boards:[{board:"cbse",grades:["7","8"],course:"Mathematics"},{board:"icse",grades:["7","8"],course:"Mathematics"}],aim:"Cover hands-on records for integers, rational numbers, algebraic identities, triangles, mensuration, data handling and probability.",workflow:["Pick activity type: construction, model, graph, data table or pattern proof.","Complete the visual or numeric work product.","Write observation, result and one extension question."],evidence:["Activity record","Diagram/table/model","Result","Reflection"],launchLabel:"Open Math Lab",launchPath:R("math","board-bank")},{id:"math-cbse-xi-xii-activity-file",subject:"mathematics",title:"CBSE XI-XII activity file",coverage:"template",mode:"Activity file",boards:[{board:"cbse",grades:["11","12"],course:"Mathematics"}],aim:"Provide 10-record activity file coverage for sets, functions, trigonometric graphs, conics, statistics, matrices, calculus, vectors, LPP and probability.",workflow:["Pick an NCERT lab-manual activity family.","Generate graph, construction, table or proof record.","Attach conclusion and formative reflection."],evidence:["Activity record","Graph/model/table","Conclusion","Year-end prompt"],launchLabel:"Open Math Lab",launchPath:R("math","board-bank")},{id:"math-icse-assignments",subject:"mathematics",title:"ICSE IX-X internal assignments",coverage:"template",mode:"Assignment builder",boards:[{board:"icse",grades:["9","10"],course:"Mathematics"}],aim:"Create two assignment records with preparation, concepts, computation, presentation and understanding criteria.",workflow:["Choose geometry, mensuration, algebra, coordinate geometry, statistics or trigonometry prompt.","Complete computation and construction sections.","Write conclusion using mathematical notation and units."],evidence:["Problem statement","Working","Diagram/graph","Conclusion"],launchLabel:"Open Math Lab",launchPath:R("math","board-bank")},{id:"math-isc-projects",subject:"mathematics",title:"ISC XI-XII project work",coverage:"template",mode:"Project report",boards:[{board:"isc",grades:["11","12"],course:"Mathematics"}],aim:"Cover ISC project topics including set laws, function graphs, trigonometric transformations, conics, coefficient of variation, calculus, vectors, LPP and areas between curves.",workflow:["Select project topic and fill overall format.","Build graph, model, proof, data analysis or optimisation result.","Add findings and viva prompts."],evidence:["Overall format","Content","Findings","Viva
7notes"],launchLabel:"Open Math Lab",launchPath:R("math","board-bank")},{id:"electronics-measurement-instruments",subject:"electronics",title:"Measurement instruments: ammeter, voltmeter, galvanometer, multimeter",coverage:"partial",mode:"Instrument bench",boards:[{board:"cbse",grades:["11"],course:"Electronics Technology"},{board:"isc",grades:["11","12"],course:"Electricity and Electronics"}],aim:"Cover current, voltage, resistance, continuity and component identification using meter-style observations.",workflow:["Choose instrument and circuit under test.","Record range, polarity, least count and measured value.","Mark component status or corrected connection."],evidence:["Instrument range","Connection diagram","Reading","Deduction"],launchLabel:"Open Electronics Lab",launchPath:R("electronics","board_bank")},{id:"electronics-rectifier-zener-transistor",subject:"electronics",title:"Rectifier, Zener regulator and transistor characteristics",coverage:"partial",mode:"Circuit engine gap",boards:[{board:"cbse",grades:["11"],course:"Electronics Technology"},{board:"isc",grades:["12"],course:"Electricity and Electronics"}],aim:"Extend semiconductor coverage to half/full-wave rectifiers, filters, Zener regulation and CE/CB/CC transistor characteristic curves.",workflow:["Select device circuit and vary input or bias.","Record voltage-current data and waveform or gain.","Plot characteristic curve or ripple comparison."],evidence:["Circuit diagram","Data table","Graph/waveform","Conclusion"],launchLabel:"Open Electronics Lab",launchPath:R("electronics","board_bank")},{id:"electronics-amplifier-signal-cro",subject:"electronics",title:"Amplifier, signal generator and oscilloscope practicals",coverage:"template",mode:"Diagnostic template",boards:[{board:"cbse",grades:["11","12"],course:"Electronics Technology"},{board:"isc",grades:["12"],course:"Electricity and Electronics"}],aim:"Support voltage/power amplifier, audio amplifier, graphic equaliser, signal generator and CRO studies.",workflow:["Select circuit stage and expected signal path.","Enter test-point reading, waveform or gain.","Diagnose normal operation or likely fault."],evidence:["Block diagram","Test points","Waveform/gain","Fault note"],launchLabel:"Open Electronics Lab",launchPath:R("electronics","board_bank")},{id:"electronics-pcb-seven-segment-digital",subject:"electronics",title:"PCB, seven-segment and digital logic project bench",coverage:"template",mode:"Build worksheet",boards:[{board:"cbse",grades:["11"],course:"Electronics Technology"},{board:"isc",grades:["12"],course:"Electricity and Electronics projects"}],aim:"Cover PCB manufacturing steps, seven-segment display, logic-gate models and controller-style board projects.",workflow:["Choose build type and list components.","Draw circuit or truth table.","Record assembly steps, test result and fix notes."],evidence:["Component list","Circuit/truth table","Build steps","Test result"],launchLabel:"Open Electronics Lab",launchPath:R("electronics","board_bank")},{id:"electronics-appliance-fault-finding",subject:"electronics",title:"Appliance and communication fault-finding bank",coverage:"template",mode:"Fault tree",boards:[{board:"cbse",grades:["12"],course:"Electronics Technology"}],aim:"Represent audio, TV, LCD, tape/CD/DVD, printer, scanner, microwave, telephone, fax, UPS and DTH practicals as symptom-to-test diagnostic workflows.",workflow:["Select device and symptom.","Trace stages, controls or supply points.","Choose probable fault and corrective action."],evidence:["Symptom","Stage traced","Test result","Repair action"],launchLabel:"Open Electronics Lab",launchPath:R("electronics","board_bank")},{id:"electronics-household-projects",subject:"electronics",title:"Household wiring and Electricity/Electronics project work",coverage:"template",mode:"Project report",boards:[{board:"icse",grades:["9","10"],course:"Electricity and Electronics"},{board:"isc",grades:["11","12"],course:"Electricity and Electronics"}],aim:"Cover household circuits, accessories, fuses, wiring comparison and working-model project reports.",workflow:["Select assignment or model project.","Add title, component list, circuit diagram and procedure.","Record viva notes and conclusion."],evidence:["Title/introduction","Circuit diagram","Procedure","Viva notes"],launchLabel:"Open Electronics Lab",launchPath:R("electronics","board_bank")}],Se={physics:{concept:"Measure a physical quantity, control variables, plot or calculate the result, and explain the trend using the relevant physics principle.",keyTerms:["Least count","Zero error","Controlled variable","Observation table","Uncertainty"],safety:["Keep electrical sources switched off while changing connections.","Use optical and heated apparatus only under teacher supervision.","Record readings patiently; repeated readings matter more than speed."]},chemistry:{concept:"Use reagent choice, controlled quantity, visible observation and confirmatory evidence to reach a valid chemical inference.",keyTerms:["Reagent","Observation","Confirmatory test","Control","Inference"],safety:["Use small quantities and keep test tubes pointed away while heating.","Wear eye protection when handling acids, bases or unknown samples.","Do not smell chemicals directly; waft only when instructed."]},biology:{concept:"Observe a living system, specimen or slide carefully, identify diagnostic features, and connect structure with function.",keyTerms:["Specimen","Labelled sketch","Diagnostic feature","Control","Inference"],safety:["Handle blades, needles and glass slides carefully.","Use stains and reagents in small quantities.","Wash hands after handling specimens or field samples."]},mathematics:{concept:"Build a mathematical model, construction, graph or dataset, then use it to verify a property or solve a board-style project question.",keyTerms:["Model","Construction","Dataset","Verification","Conclusion"],safety:["Use geometry tools carefully and keep sharp compass points capped.","Check scale, units and labels before recording the final result.","Keep all calculations traceable so the result can be verified."]},electronics:{concept:"Build or inspect a circuit, measure electrical quantities, compare the result with theory, and diagnose faults from evidence.",keyTerms:["Polarity","Range","Ground","Test point","Fault diagnosis"],safety:["Keep power off while wiring or changing components.","Check polarity before connecting batteries, diodes, electrolytic capacitors or ICs.","Use low-voltage supplies for classroom work unless the teacher confirms otherwise."]}},Mt=["Aim and setup are complete.","Observations are specific and include units or diagnostic details.","Inference is directly supported by the evidence.","Precautions and error sources are realistic."],Ot=e=>e.map(a=>
7typeof a=="string"?{step:a,why:"This keeps the practical record traceable."}:a),S=e=>({concept:e.concept,keyTerms:e.keyTerms||[],successCriteria:e.successCriteria||[],materials:e.materials||[],safety:e.safety||[],setup:e.setup||[],prelabQuestions:e.prelabQuestions||["What is the aim of this practical in your own words?","Which observation or calculation will prove the result?","What safety or accuracy check must be done before starting?"],procedure:Ot(e.procedure||[]),observationFields:e.observationFields||[],table:e.table||null,analysisPrompts:e.analysisPrompts||[],expectedOutcome:e.expectedOutcome||"",commonMistakes:e.commonMistakes||[],vivaQuestions:e.vivaQuestions||[],extensions:e.extensions||[],rubric:e.rubric||Mt}),Lt={"physics-screw-gauge-spherometer-beam-balance":S({concept:"Precision instruments improve measurement by using least count, zero correction and repeated readings to reduce random and systematic error.",keyTerms:["Least count","Pitch","Zero correction","Mean reading","Percentage error"],successCriteria:["Least count and zero correction are stated before readings begin.","At least three readings are recorded and averaged.","Final value includes unit and sensible significant figures."],materials:["Screw gauge or spherometer","Object or curved surface","Beam balance and weights when required","Observation sheet"],setup:["Clean the measuring faces and the object.","Find least count from pitch and circular scale divisions.","Check zero error before placing the object."],procedure:[{step:"Record pitch, least count and zero error.",why:"This separates instrument calibration from the actual measurement."},{step:"Place the object gently and take main scale plus circular scale readings.",why:"Both parts are needed for the corrected reading."},{step:"Repeat at different positions or orientations.",why:"Repeated readings reveal variation and reduce accidental error."},{step:"Apply zero correction, find the mean and calculate error estimate.",why:"The corrected mean is the reportable measurement."}],observationFields:["Instrument selected","Least count and zero correction","Reading 1","Reading 2","Reading 3","Corrected mean"],table:{columns:["Trial","Main scale","Circular scale","Observed value","Corrected value"],rows:["1","2","3"]},analysisPrompts:["Corrected reading = observed reading - zero error","Mean = sum of corrected readings / number of readings","Percentage error = least count / measured value x 100"],expectedOutcome:"Students should report a corrected measurement with unit, average value and error estimate.",commonMistakes:["Forgetting zero correction","Mixing mm and cm","Over-tightening the screw gauge","Reporting too many decimal places"],vivaQuestions:["What is least count?","Why do we take repeated readings?","What is the difference between zero error and zero correction?"]}),"physics-activity-motion-thermal-fluid":S({concept:"Motion, heat transfer and fluid-flow activities show how a measurable variable changes when one condition is varied deliberately.",keyTerms:["Independent variable","Dependent variable","Trend","Control","Inference"],successCriteria:["Only one variable is changed at a time.","The trend is shown using a table or graph.","Inference names the physical principle."],materials:["Activity-specific apparatus","Stopwatch or thermometer where needed","Scale or graph sheet","Observation sheet"],setup:["Choose one activity family.","List variables and controls.","Prepare a reading table before starting."],procedure:[{step:"Run a first trial and record the condition and observation.",why:"The first trial sets the baseline."},{step:"Change only the selected variable and repeat the observation.",why:"A fair test needs all other factors controlled."},{step:"Plot the trend or compare readings.",why:"Visual trends are easier to interpret than isolated values."},{step:"Write an inference connected to the principle.",why:"The activity is complete only when observation becomes explanation."}],observationFields:["Activity chosen","Independent variable","Controlled variables","Observation trend","Inference"],table:{columns:["Trial","Changed variable","Observation","Trend note"],rows:["1","2","3"]},analysisPrompts:["Identify the pattern in the readings.","State whether the relationship is direct, inverse, increasing, decreasing or non-linear.","Mention one likely source of error."],expectedOutcome:"A clear trend and a principle-linked conclusion such as cooling rate, projectile range, bimetal bending or pressure-flow relation.",commonMistakes:["Changing two variables at once","Writing theory without observation","Skipping units","Not recording control conditions"],vivaQuestions:["What variable did you control?","How does the graph support your inference?","What would improve the activity?"]}),"physics-middle-school-activity-bridge":S({concept:"Junior physics activities connect everyday objects with measurement, heat, motion, magnetism and simple circuits.",keyTerms:["Observation","Comparison","Simple circuit","Magnetism","Application"],successCriteria:["The setup is sketched or described.","Observation is concrete, not copied from theory.","Inference uses a grade-level principle."],materials:["Classroom activity kit","Battery, bulb, wire and switch when required","Magnet or simple machine model","Notebook"],setup:["Choose the topic.","Collect safe household or classroom materials.","Prepare a two-column observation table."],procedure:["Build or observe the setup exactly as instructed.","Change one condition such as material, distance, surface or connection.","Record what changes and what stays the same.","Write one everyday use of the principle."],observationFields:["Topic and setup","What was changed","What was observed","Everyday application"],table:{columns:["Trial","Condition","Observation","Conclusion"],rows:["A","B","C"]},analysisPrompts:["Compare the observations.","Write the rule in your own words.","Give one real-life example."],expectedOutcome:"A simple, accurate observation record that links classroom activity to daily life.",commonMistakes:["Drawing without labels","Writing a memorised answer instead of observation","Not naming the changed condition"],vivaQuestions:["What did you observe?","Which condition changed?","Where do you see this principle at home?"]}),"physics-optics-auxiliary-travelling-microscope":S({concept:"Optics practicals use object-image positions or apparent-depth shifts to determine focal length or refractive index.",keyTerms:["Object distance","Image distance","Parallax","Apparent depth","Refractive index"],successCriteria:["Ray diagram or setup diagram is labelled.","Readings are recorded with sign convention or depth convention.","Calculation follows the chosen method."],materials:["Optics bench or travelling microscope","Convex lens or auxiliary lens","Glass slab or liquid container","Needles, screen and scale"],setup:["Align the bench or microscope scale.","Remove parallax before taking readings.","Select the correct method for the apparatus."],procedure:[{step:"Set up object, lens or slab and align the optical axis.",why:"Poor alignment causes large optical errors."}
7,{step:"Take position readings after removing parallax.",why:"Parallax-free readings are essential in optics."},{step:"Repeat for multiple distances or depths.",why:"Multiple readings make the result defensible."},{step:"Calculate focal length or refractive index and compare readings.",why:"The calculation confirms whether the setup was consistent."}],observationFields:["Method selected","Setup diagram note","Reading set 1","Reading set 2","Calculated value"],table:{columns:["Trial","Object/depth reading","Image/apparent reading","Difference","Calculated value"],rows:["1","2","3"]},analysisPrompts:["For lens method, use the correct focal length formula.","For slab/liquid method, use refractive index = real depth / apparent depth.","State how parallax was removed."],expectedOutcome:"A focal length or refractive-index value supported by repeated readings.",commonMistakes:["Not removing parallax","Mixing real and apparent depth","Using inconsistent sign convention","Misreading the travelling microscope scale"],vivaQuestions:["What is parallax?","Why is an auxiliary lens used?","Why does apparent depth differ from real depth?"]}),"physics-galvanometer-potentiometer-ac":S({concept:"Electrical measurement practicals convert deflection, balance length or resonance into resistance, EMF, internal resistance or AC frequency.",keyTerms:["Null point","Figure of merit","Half deflection","Balance length","Resonance"],successCriteria:["Circuit diagram matches the method.","Connections are checked before power is applied.","Calculated value is based on the observed balance or deflection."],materials:["Galvanometer or potentiometer setup","Resistance box","Cells and key","Sonometer when doing AC frequency","Connecting wires"],setup:["Draw the circuit before wiring.","Check polarity and range.","Start with protective resistance in series."],procedure:["Wire the circuit with the key open.","Close the key briefly and adjust resistance, balance length or tension.","Record deflection, balance length or resonant length.","Repeat for at least three values and calculate the required quantity."],observationFields:["Circuit method","Protective resistance/range","Reading 1","Reading 2","Reading 3","Calculated result"],table:{columns:["Trial","Control setting","Observed reading","Formula used","Result"],rows:["1","2","3"]},analysisPrompts:["Write the circuit relation before substitution.","Use consistent units.","Mention whether the method is null-deflection or deflection based."],expectedOutcome:"A resistance, EMF ratio, internal resistance, figure of merit or frequency value from the recorded data.",commonMistakes:["Powering the circuit before checking polarity","Not using protective resistance","Confusing deflection and balance methods","Recording only one reading"],vivaQuestions:["Why is a potentiometer a null method?","What is figure of merit?","Why do we use protective resistance?"]}),"physics-diffraction-polarization-capacitor":S({concept:"Wave and transient activities use intensity, angle or voltage-time data to reveal diffraction, polarization or exponential charging behaviour.",keyTerms:["Intensity","Central maximum","Polarizer angle","Time constant","Transient"],successCriteria:["Reading intervals are consistent.","Graph has labelled axes.","The measured feature is marked on the graph."],materials:["Light source and slit/polarizer or RC circuit setup","Screen or sensor","Stopwatch or voltage meter","Graph sheet"],setup:["Darken or stabilize the observation area for optics.","Check capacitor polarity for RC work.","Prepare graph axes before data collection."],procedure:["Set the apparatus and record initial reading.","Vary position, angle or time in equal steps.","Record intensity or voltage carefully.","Plot graph and identify central maximum, polarization trend or time constant."],observationFields:["Activity selected","Independent variable","Reading pattern","Graph feature","Inference"],table:{columns:["Reading no.","Position/angle/time","Intensity/voltage","Graph note"],rows:["1","2","3","4","5"]},analysisPrompts:["Identify the peak, decreasing trend or exponential curve.","Relate the graph shape to the principle.","State one limitation of the setup."],expectedOutcome:"A graph-supported inference for diffraction pattern, polarization intensity or capacitor charging/discharging.",commonMistakes:["Unequal reading intervals","Unlabelled axes","Ignoring ambient light","Reversing c
7apacitor polarity"],vivaQuestions:["What does the central maximum represent?","What is a time constant?","Why does intensity vary with angle?"]}),"chemistry-formal-salt-analysis":S({concept:"Salt analysis identifies cations and anions by combining preliminary clues with confirmatory wet tests.",keyTerms:["Preliminary test","Cation group","Anion radical","Confirmatory test","Inference"],successCriteria:["Every inference is backed by an observation.","Cation and anion branches are recorded separately.","Final salt name is written only after confirmatory evidence."],materials:["Unknown salt sample","Test tubes, droppers and holder","Dilute HCl, NaOH, NH4OH, AgNO3 and BaCl2","Litmus paper and distilled water"],setup:["Label dry sample, solution and control tubes.","Prepare a small aqueous solution.","Keep reagent bottles capped between tests."],procedure:[{step:"Record colour, texture, odour and solubility of the dry salt.",why:"Preliminary observations narrow the possible ions."},{step:"Add dilute acid to a small sample and test any gas evolved.",why:"Acid reaction often identifies carbonate, sulphite, sulphide or nitrite clues."},{step:"Run cation tests with NaOH and NH4OH dropwise and in excess.",why:"Precipitate colour and solubility identify the cation group."},{step:"Run the suitable anion confirmatory test from the acid-test clue.",why:"Anion confirmation prevents guessing from one observation."},{step:"Write the final ion pair and salt only after matching both branches.",why:"A valid salt analysis needs both cation and anion evidence."}],observationFields:["Dry test and solubility","Dilute acid test","NaOH/NH4OH cation branch","Anion confirmatory test","Final salt deduction"],table:{columns:["Test","Reagent/condition","Observation","Inference"],rows:["Dry test","Dilute acid test","Cation test","Anion test","Confirmatory test"]},analysisPrompts:["Separate observation from inference.","Use precipitate colour and solubility evidence.","Write final salt as cation + anion with valency balance."],expectedOutcome:"A defensible cation and anion identification with confirmatory observations.",commonMistakes:["Using too much reagent","Skipping the excess reagent test","Writing final salt from colour only","Mixing cation and anion observations"],vivaQuestions:["Why is NaOH added dropwise and then in excess?","What is a confirmatory test?","Why do we test gases with moist litmus or specific paper?"]}),"chemistry-extended-gas-tests":S({concept:"Gas identification uses colour, smell clue, indicator change and one confirmatory reagent to distinguish gases safely.",keyTerms:["Wafting","Litmus","Confirmatory reagent","Gas evolution","Deduction"],successCriteria:["No gas is smelled directly.","The confirmatory reagent is specific to the suspected gas.","Negative evidence is recorded when it rules out alternatives."],materials:["Teacher-prepared gas source","Moist litmus paper, lime water and cobalt chloride paper","Lead acetate paper, acidified dichromate and AgNO3","Splint and labelled tubes"],setup:["Place indicator papers near the mouth of the tube, not inside liquid.","Keep gas source controlled by teacher instruction.","Prepare a gas-test key before starting."],procedure:["Generate or receive the gas sample under supervision.","Observe colour and use safe wafting only if required.","Apply indicator or splint test first.","Use the confirmatory reagent for the suspected gas.","Record the deduction and the exact clue that supports it."],observationFields:["Gas source and appearance","Litmus or indicator result","Confirmatory reagent result","Gas identified and reason"],table:{columns:["Gas suspected","Indicator test","Confirmatory test","Deduction"],rows:["Gas A","Gas B","Gas C"]},analysisPrompts:["Match the observed change to the gas-test key.","Write why other common gases were ruled out.","State the safety rule followed."],expectedOutcome:"Students identify HCl, H2S, NO2, water vapour or another gas using a specific test.",commonMistakes:["Smelling directly","Using a dry litmus paper when moist paper is needed","Calling every acidic gas HCl","Not recording the confirmatory reagent"],vivaQuestions:["Why should litmus be moist?","How is H2S confirmed?","How do you distinguish water vapour from other colourless gases?"]}),"chemistry-middle-school-activity-bridge":S({concept:"Junior chemistry activities reveal material properties through separation methods, indicator changes, combustion observations and simple reactions.",ke
7yTerms:["Mixture","Filtration","Indicator","Neutralisation","Property"],successCriteria:["Sample and method are named.","Visible change is described clearly.","Conclusion connects to the property being tested."],materials:["Household-safe samples","Filter paper, funnel and beaker","Natural or universal indicator","Teacher-approved acid/base samples"],setup:["Label samples.","Use small quantities.","Prepare before/after observation columns."],procedure:["Select separation, indicator or combustion activity.","Record initial appearance of each sample.","Apply the method or reagent and observe the change.","Compare with expected property and write conclusion."],observationFields:["Sample/material","Method/reagent used","Observed change","Property matched","Conclusion"],table:{columns:["Sample","Method/reagent","Observation","Property shown"],rows:["1","2","3"]},analysisPrompts:["Identify the property tested.","Classify the sample where appropriate.","Give one everyday use of the method."],expectedOutcome:"A safe junior record linking visible changes to material properties.",commonMistakes:["Using excess sample","Writing acid/base without indicator evidence","Not labelling before and after states"],vivaQuestions:["Why is filtration useful?","What does an indicator show?","What evidence shows a chemical change?"]}),"chemistry-volumetric-calculation-engine":S({concept:"Volumetric analysis finds concentration from accurately measured reacting volumes and balanced chemical ratios.",keyTerms:["Burette","Pipette","End point","Concordant titre","Molarity"],successCriteria:["Burette readings are recorded initial and final.","At least two concordant titres are used.","Reaction ratio is written before calculation."],materials:["Burette, pipette and conical flask","Standard solution","Unknown solution","Indicator or self-indicating reagent"],setup:["Rinse burette with solution it will contain.","Remove air bubbles from burette tip.","Place white tile under conical flask for end-point visibility."],procedure:["Fill burette and record initial reading.","Pipette fixed volume into conical flask and add indicator if needed.","Titrate slowly near end point while swirling.","Record final reading and repeat until titres are concordant.","Use balanced equation ratio to calculate concentration or strength."],observationFields:["Solution in burette","Pipetted volume","Indicator/end point","Concordant titre","Final concentration"],table:{columns:["Trial","Initial burette","Final burette","Titre","Accepted?"],rows:["Rough","1","2","3"]},analysisPrompts:["Titre = final reading - initial reading.","Use M1V1/n1 = M2V2/n2 or equivalent stoichiometric relation.","Reject non-concordant readings with a reason."],expectedOutcome:"An unknown concentration, strength, purity or water of crystallisation value from concordant titres.",commonMistakes:["Reading meniscus from above","Ignoring rough titre","Overshooting end point","Using wrong mole ratio"],vivaQuestions:["Why are concordant readings needed?","Why rinse burette with the solution it contains?","What is the role of indicator?"]}),"chemistry-chromatography-rf":S({concept:"Chromatography separates components because they travel different distances between stationary and mobile phases.",keyTerms:["Origin","Solvent front","Stationary phase","Mobile phase","Rf value"],successCriteria:["Origin is above solvent level.","Solvent front is marked immediately.","Rf values use the same units for both distances."],materials:["Chromatography paper","Solvent","Capillary tube or pencil","Sample extract or ink","Ruler"],setup:["Draw pencil origin line.","Spot sample lightly and let it dry.","Keep solvent level below origin."],procedure:["Place spotted paper in the chamber without submerging the spot.","Allow solvent to rise until near the top.","Remove paper and mark solvent front immediately.","Measure distances moved by each spot and solvent front.","Calculate Rf value for each component."],observationFields:["Sample used","Solvent used","Solvent front distance","Spot distances and colours","Rf values"],table:{columns:["Spot","Colour","Distance by spot","Distance by solvent","Rf"],rows:["1","2","3","4"]},analysisPrompts:["Rf = distance moved by component / distance moved by solvent front.","Compare spot colours and Rf values.","Explain separation by different solubility/adsorption."],expectedOutcome:"Separated components with calculated Rf values and component inference.",commonMistakes:["Using ink for origin line","Dipping spot into solvent","Forgetting to mark solvent front","Mixing units in Rf calculation"],vivaQuestions:["Why is pencil used for origin?","Why must solvent level be below the spot?","What does Rf value represent?"]}),"chemistry-functional-food-preparation":S({concept:"Organic and biomolecule tests identify functional groups or food components from characteristic reagent changes.",keyTerms:["Functional group","Positive test","Control","Reagent","Preparation"],successCriteria:["Test family and reagent are named.","Positive and negative controls are recorded when possible.","Inference is not made from a vague colour change."],materials:["Test sample","Functional-group or food-test reagents","Water bath when required","Control sample","Test tubes and droppers"],setup:["Choose one test family.","Prepare clean labelled tubes.","Write expected positive result before adding reagent."],procedure:["Add measured sample quantity to labelled tube.","Add reagent in the order specified for the selected test.","Heat in water bath only if the procedure requires it.","Record colour, precipitate, smell or layer formation.","Compare with control and write inference."],observationFields:["Test family","Reagent sequence","Expected positive result","Actual observation","Inference"],table:{columns:["Sample","Reagent","Observation","Inference"],rows:["Unknown","Positive control","Negative control"]},analysisPrompts:["Name the functional group or biomolecule.","Write the positive-test evidence.","Mention disposal or safety note."],expectedOutcome:"A supported identification of functional group, carbohydrate, protein, fat or prepared compound.",commonMistakes:["Heating directly instead of water bath","Not using controls","Calling any precipitate positive","Missing reagent order"],vivaQuestions:["Why are controls useful?","What is a functional group?","Why do some tests need gentle heating?"]}),"chemistry-kinetics-enthalpy-electrochem":S({concept:"Kinetics, enthalpy and electrochemistry practicals use time, temperature or EMF readings to quantify chemical change.",keyTerms:["Rate","Temperature change","EMF","Controlled variable","Graph"],successCriteria:["Changed variable is stated.","Readings are taken at consistent intervals.","Graph or calculation supports the trend."],materials:["Reaction solutions or electrochemical cell materials","Stopwatch, thermometer or voltmeter","Beakers and measuring cylinders","Graph sheet"],setup:["Choose one investigation type.","Keep concentration, volume or electrode area controlled as required.","Prepare data table before starting."],procedure:["Record initial concentration, temperature or cell condition.","Start reaction or connect cell and begin timing/readings.","Change one variable and repeat readings.","Plot the required graph or calculate heat/EMF trend.","Write the chemical reason for the observed trend."],observationFields:["Investigation type","Controlled variable","Readings","Graph trend","Calculation/result"],table:{columns:["Trial","Changed condition","Time/temp/EMF","Calculated value","Trend"],rows:["1","2","3","4"]},analysisPrompts:["For kinetics, compare rate using 1/time when applicable.","For enthalpy, use heat = mass x specific heat x temperature change.","For EMF, compare voltage with concentration or electrode condition."],expectedOutcome:"A trend or calculated value that explains rate, heat change or cell potential variation.",commonMistakes:["Starting stopwatch late","Not insulating calorimeter","Loose electrode connections","Comparing trials with multiple changes"],vivaQuestions:["Why control volume?","What does EMF measure?","Why does temperature affect reaction rate?"]}),"biology-dicot-seed-embryo":S({concept:"A dicot seed contains two cotyledons and an embryo axis with plumule and radicle that develop into shoot and root.",keyTerms:["Testa","Cotyledon","Plumule","Radicle","Embryo"],successCriteria:["Seed parts are separated without crushing the embryo.","Diagram labels all required parts.","Function of each part is recorded."],materials:["Soaked gram, pea or bean seed","Forceps and dissecting needle","Hand lens","Petri dish"],setup:["Soak seed for sufficient time.","Place on moist dish.","Use hand lens for embryo details."],procedure:["Remove seed coat gently.","Separate cotyledons without tearing the embryo axis.","Locate plumule and radicle.","Draw and label testa, cotyledons, plumule and radicle.","Write one function for each part."],observationFields:["Seed used","External features","Embryo parts identified","Labelled diagram notes","Fu
7nctions"],table:{columns:["Part","Observation","Function"],rows:["Testa","Cotyledon","Plumule","Radicle"]},analysisPrompts:["Explain why it is called dicot.","Connect plumule to shoot and radicle to root.","State food-storage role of cotyledons."],expectedOutcome:"A labelled dicot embryo diagram with correct part functions.",commonMistakes:["Breaking the embryo axis","Labelling cotyledon as seed coat","Missing plumule/radicle direction"],vivaQuestions:["Why is gram a dicot seed?","What does radicle form?","What is the function of cotyledons?"]}),"biology-pollen-dna-meiosis":S({concept:"Reproduction and genetics practicals depend on recognising microscopic structures and linking them to genetic continuity.",keyTerms:["Pollen tube","DNA fibre","Meiosis","Chromosome","Stage identification"],successCriteria:["Procedure or slide source is named.","Diagnostic feature is recorded.","Sketch is labelled and inference is stage/process specific."],materials:["Prepared slide or teacher-approved sample","Microscope","Stain/reagent where required","Slide, coverslip and dropper"],setup:["Select pollen germination, DNA isolation or meiosis spotting.","Prepare or focus the slide carefully.","Keep stain exposure controlled."],procedure:["Prepare or observe the selected sample.","Focus under low power, then high power if required.","Identify diagnostic feature such as pollen tube, DNA fibre or meiotic stage.","Draw labelled sketch and record feature-based inference."],observationFields:["Process selected","Reagent or slide source","Visible structure","Diagnostic feature","Inference"],table:{columns:["Slide/process","Observed feature","Diagnostic clue","Inference"],rows:["1","2","3"]},analysisPrompts:["Link observed structure to reproduction or heredity.","State why the feature confirms the process.","Mention microscope magnification if known."],expectedOutcome:"A labelled microscopic/process record with correct diagnostic features.",commonMistakes:["Drawing a generic cell","Not recording magnification","Confusing mitosis and meiosis stages","Overstaining sample"],vivaQuestions:["What does pollen tube indicate?","Why is DNA isolation possible from cells?","How does meiosis reduce chromosome number?"]}),"biology-middle-school-activity-bridge":S({concept:"Junior biology activities use simple observation to connect cells, nutrition, respiration, microorganisms and ecology with life processes.",keyTerms:["Cell","Tissue","Respiration","Microorganism","Habitat"],successCriteria:["Specimen or model is named.","At least three diagnostic features are recorded.","Observation is linked to a life process."],materials:["Prepared slide or model","Hand lens/microscope when required","Local field sample or image","Notebook"],setup:["Choose slide, model or local-study prompt.","Prepare labelled diagram space.","List what feature you expect to observe."],procedure:["Observe specimen, model or local environment carefully.","Record visible features before writing theory.","Draw labelled sketch or diagram.","Write how the feature helps the organism or process."],observationFields:["Specimen/model","Visible features","Labelled sketch notes","Life process link","Local example"],table:{columns:["Observation","Feature","Function/process","Example"],rows:["1","2","3"]},analysisPrompts:["Connect structure to function.","Identify whether the observation is cell, organism or ecosystem level.","Give a local example."],expectedOutcome:"A clear junior observation record with labelled sketch and process link.",commonMistakes:["Writing textbook definition only","Missing labels","Confusing observation with conclusion"],vivaQuestions:["What did you observe directly?","Which structure shows the function?","How is this useful to the organism?"]}),"biology-floral-taxonomy":S({concept:"Floral dissection identifies plant families from whorl arrangement, floral formula, floral diagram and diagnostic characters.",keyTerms:["Calyx","Corolla","Androecium","Gynoecium","Floral formula"],successCriteria:["Each floral whorl is observed separately.","Floral formula matches the diagram.","Family identification cites diagnostic characters."],materials:["Fresh flower specimen","Forceps and dissecting needle","Hand lens","Dissection tray"],setup:["Select an intact flower.","Observe bract, symmetry and ovary position before dissection.","Separate whorls carefully."],procedure:["Record general characters such as symmetry, sexuality and ovary position.","Dissect calyx, corolla, androecium and gynoecium.","Count and note fusion or adhesion in each whorl.","Draw floral diagram and write floral formula.","Identify family with reasons and economic importance."],observationFields:["Flower selected","General characters","Whorl observations","Floral formula","Family identification"],table:{columns:["Whorl","Number","Fusion/adhesion","Diagnostic note"],rows:["Calyx","Corolla","Androecium","Gynoecium"]},analysisPrompts:["Match floral formula to whorl observations.","Use family diagnostic characters, not flower colour alone.","Add economic importance."],expectedOutcome:"A complete floral formula, diagram and family diagnosis.",commonMistakes:["Tearing reproductive parts","Identifying family from colour","Formula not matching diagram","Ignoring ovary position"],vivaQuestions:["What does floral formula show?","What is placentation?","Which character helped identify the family?"]}),"biology-food-urine-biochemical-tests":S({concept:"Biochemical tests detect specific substances from characteristic reagent changes in food or urine samples.",keyTerms:["Starch","Reducing sugar","Protein","Fat","Positive test"],successCriteria:["Sample and reagent are clearly named.","Colour change or precipitate is described.","Positive/negative inference is supported by control where possible."],materials:["Food or synthetic urine sample","Iodine, Benedict, Biuret and Sudan/ethanol reagents as required","Water bath","Test tubes"],setup:["Label sample and control tubes.","Use measured quantities.","Prepare water bath if heating is needed."],procedure:["Choose the substance to test.","Add the correct reagent to sample and control.","Heat only if required by the test.","Record exact colour change, precipitate or layer formation.","Write positive or negative inference."],observationFields:["Sample type","Test selected","Reagent used","Observed change","Inference"],table:{columns:["Sample","Test/reagent","Observation","Inference"],rows:["Unknown","Positive control","Negative control"]},analysisPrompts:["Match colour change to substance.","Explain why control strengthens the result.","Mention any limitation of qualitative tests."],expectedOutcome:"A supported positive or negative result for starch, sugar, protein, fat or urine component.",commonMistakes:["Heating Biuret test","Using too much reagent","Calling pale colour a strong positive","Not recording control"],vivaQuestions:["What does iodine test detect?","Why is water bath used for Benedict test?","Why are controls important?"]}),"biology-plant-physiology-setups":S({concept:"Plant physiology setups test photosynthesis, transpiration, osmosis and diffusion by comparing controlled before/after observations.",ke
7yTerms:["Control","Photosynthesis","Transpiration","Osmosis","Diffusion"],successCriteria:["Control setup is identified.","Before and after observations are recorded.","Inference names the plant process."],materials:["Plant or leaf sample","Bell jar/potometer/Hydrilla/osmosis setup as selected","Iodine or cobalt chloride paper when required","Light source and timer"],setup:["Select one physiological process.","Prepare control and experimental setup.","Keep timing and environmental conditions consistent."],procedure:["Set up experimental and control arrangement.","Record initial condition.","Allow the process to occur for the required time.","Record final observation.","Compare control and experimental setup to infer the process."],observationFields:["Experiment selected","Control setup","Initial observation","Final observation","Inference"],table:{columns:["Setup","Initial observation","Final observation","Inference"],rows:["Control","Experimental"]},analysisPrompts:["Compare control and experimental results.","Identify the variable responsible.","State why a control is necessary."],expectedOutcome:"A controlled inference for photosynthesis, transpiration, osmosis or diffusion.",commonMistakes:["No control setup","Changing light and water together","Not waiting enough time","Overstating conclusion"],vivaQuestions:["Why is a control needed?","What is transpiration?","How does osmosis differ from diffusion?"]}),"biology-spotting-field-study":S({concept:"Spotting and field studies identify specimens or ecological patterns from diagnostic characters and local evidence.",keyTerms:["Diagnostic character","Adaptation","Habitat","Biodiversity","Conservation"],successCriteria:["Specimen or site is identified.","Diagnostic features are recorded.","Conclusion uses observation and not guesswork."],materials:["Specimen/model/image or field site","Hand lens or camera when allowed","Field notebook","Identification key"],setup:["Choose spotting or field-study prompt.","Prepare feature checklist.","Follow local safety and consent rules during fieldwork."],procedure:["Observe specimen/site without disturbing it.","Record visible diagnostic features.","Sketch, photograph or describe the evidence as allowed.","Use identification key or criteria.","Write conclusion and conservation or improvement note."],observationFields:["Specimen/site","Diagnostic characters","Sketch/photo notes","Identification","Conclusion"],table:{columns:["Observation","Diagnostic feature","Meaning","Conclusion"],rows:["1","2","3"]},analysisPrompts:["Separate direct observation from interpretation.","Mention habitat or ecological role.","Add one conservation action if relevant."],expectedOutcome:"A reliable spotting or field record with labelled features and conclusion.",commonMistakes:["Guessing specimen name","No diagnostic feature","Disturbing field site","Writing vague conclusion"],vivaQuestions:["What feature confirms identification?","What is the organism role in habitat?","Why is field observation useful?"]}),"math-cbse-secondary-lab":S({concept:"Mathematics lab activities verify abstract concepts using constructions, graphs, models, measurements and data.",keyTerms:["Construction","Verification","Model","Scale","Conclusion"],successCriteria:["Activity is linked to a chapter concept.","Diagram or graph is accurate and labelled.","Conclusion states what was verified."],materials:["Geometry box","Graph sheet or digital graphing tool","Paper model or dataset","Calculator"],setup:["Choose chapter and activity.","Write the property to be verified.","Prepare required construction or data table."],procedure:["Construct model, graph or data table accurately.","Measure or compute the required quantities.","Compare values with the expected theorem or result.","Write observation and conclusion."],observationFields:["Chapter concept","Construction/model","Measurements/data","Verification result","Conclusion"],table:{columns:["Step","Measured/computed value","Expected value","Match?"],rows:["1","2","3"]},analysisPrompts:["State the mathematical property.","Show calculation or measurement.","Write whether the activity verifies the property."],expectedOutcome:"A complete mathematics activity record with construction/graph and conclusion.",commonMistakes:["Unlabelled diagram","No scale","Conclusion unrelated to activity","Rounding too early"],vivaQuestions:["What property did you verify?","Why does the model support the result?","What error can affect measurement?"]}),"math-middle-school-activity-bank":S({concept:"Middle-school mathematics activities make number, algebra, geometry, mensuration and data ideas visible through models and patterns.",keyTerms:["Pattern","Model","Data","Angle","Area"],successCriteria:["Activity question is clear.","Model/table/diagram is complete.","Result is explained in words."],materials:["Geometry box","Grid paper","Counters or paper strips","Dataset or dice/coins for probability"],setup:["Select activity family.","Write the question being explored.","Create space for diagram/table and conclusion."],procedure:["Build the model, diagram or table.","Record numbers or measurements.","Look for pattern or relationship.","Write result and one extension question."],observationFields:["Activity type","Model or data made","Pattern observed","Result","Reflection"],table:{columns:["Trial/item","Input/measurement","Output/result","Pattern"],rows:["1","2","3","4"]},analysisPrompts:["Describe the pattern.","Write the rule using numbers or algebra.","Give a related example."],expectedOutcome:"A hands-on activity record that shows a mathematical idea clearly.",commonMistakes:["No written question","Jumping to answer without model","Forgetting units in mensuration","Not explaining pattern"],vivaQuestions:["What did the model show?","Can you state the rule?","What changes if one input changes?"]}),"math-cbse-xi-xii-activity-file":S({concept:"Senior mathematics activity files use graphs, tables, proofs and models to explore functions, matrices, calculus, vectors, probability and optimisation.",keyTerms:["Function","Matrix","Limit","Vector","Optimisation"],successCriteria:["Activity objective is stated.","Mathematical work is accurate.","Conclusion links back to the concept."],materials:["Graphing tool or graph sheet","Geometry/vector materials when needed","Calculator","Activity file format"],setup:["Choose one activity family.","Write prerequisites and formulae.","Prepare graph/table/proof format."],procedure:["Generate graph, table, proof or model.","Record values, transformations or calculations.","Compare result with expected property.","Write conclusion and reflection."],observationFields:["Activity family","Mathematical object","Data/graph/proof notes","Verified property","Conclusion"],table:{columns:["Item","Input","Output/result","Observation"],rows:["1","2","3","4"]},analysisPrompts:["Write the relevant formula or theorem.","Show substitution or proof steps.","State what is verified or optimised."],expectedOutcome:"A board-ready activity record for senior secondary mathematics.",commonMistakes:["Graph without domain/scale","Skipping theorem statement","No reflection","Unclear final conclusion"],vivaQuestions:["Why did you choose this representation?","What property is visible in the graph/table?","How would the result change with another parameter?"]}),"math-icse-assignments":S({concept:"ICSE mathematics assignments assess preparation, concept understanding, computation, presentation and final reasoning.",keyTerms:["Problem statement","Working","Diagram","Units","Conclusion"],successCriteria:["Problem is stated clearly.","Every computation step is visible.","Diagram or graph supports the solution."],materials:["Assignment prompt","Geometry box or graph sheet","Calculator if allowed","Presentation sheet"],setup:["Choose topic and problem type.","List known values and target result.","Prepare diagram or data section."],procedure:["Write problem statement and given data.","Draw required diagram or graph.","Solve step by step with units.","Check answer using estimation or alternate method.","Write conclusion and presentation notes."],observationFields:["Topic selected","Given data","Diagram/graph notes","Working summary","Conclusion"],table:{columns:["Step","Working","Reason/formula","Result"],rows:["1","2","3","4"]},analysisPrompts:["Mention formula used.","Check units.","Explain final result in one sentence."],expectedOutcome:"A complete ICSE-style assignment record ready for internal assessment.",commonMistakes:["No problem statement","Skipping steps","Incorrect units","Untidy diagrams"],vivaQuestions:["Which formula did you use?","Why is the diagram valid?","How did you verify the answer?"]}),"math-isc-projects":S({concept:"ISC mathematics projects apply senior concepts to a structured report with objective, method, analysis, findings and viva readiness.",keyTerms:["Objective","Method","Analysis","Findings","Viva"],successCriteria:["Project objective is narrow enough.","Graphs/calculations supp
7ort findings.","Report has clear conclusion and limitations."],materials:["Project topic","Graphing or spreadsheet tool","Reference data if needed","Report format"],setup:["Choose project topic.","Define question and method.","Prepare data/model/proof structure."],procedure:["Write introduction and objective.","Build graph, proof, model or dataset.","Analyse result using appropriate formulae.","Write findings, limitations and viva notes."],observationFields:["Project title","Objective","Method/model","Analysis/findings","Limitations"],table:{columns:["Section","Content/evidence","Status"],rows:["Introduction","Method","Analysis","Findings","Viva"]},analysisPrompts:["Explain why the chosen method fits the topic.","Show graphs or calculations.","Write findings as precise mathematical statements."],expectedOutcome:"A structured ISC project report with defensible mathematical analysis.",commonMistakes:["Topic too broad","Decorative graph without analysis","No limitation","Weak viva preparation"],vivaQuestions:["Why did you choose this topic?","What is your main mathematical finding?","What assumption limits the project?"]}),"electronics-measurement-instruments":S({concept:"Electrical instruments measure current, voltage, resistance and continuity only when range, polarity and connection type are correct.",keyTerms:["Ammeter","Voltmeter","Multimeter","Range","Continuity"],successCriteria:["Correct instrument mode and range are selected.","Ammeter/voltmeter connection is correct.","Reading has unit and deduction."],materials:["Multimeter or meter simulator","Resistors/components","Low-voltage source","Connecting leads"],setup:["Inspect meter leads.","Select highest safe range first.","Connect power only after checking polarity."],procedure:["Identify quantity to measure.","Choose correct meter mode and range.","Connect meter in series for current or parallel for voltage.","Record reading and unit.","Deduce component status or circuit condition."],observationFields:["Instrument and mode","Range selected","Connection diagram","Reading","Deduction"],table:{columns:["Component/test point","Mode/range","Reading","Inference"],rows:["1","2","3"]},analysisPrompts:["Check whether reading is within range.","Compare measured resistance with colour code where possible.","State whether component is open, short or normal."],expectedOutcome:"A correct instrument reading and practical deduction from it.",commonMistakes:["Measuring current in parallel","Wrong range","Ignoring polarity","Touching probe tips during resistance reading"],vivaQuestions:["Why is ammeter connected in series?","What does continuity beep mean?","Why start with a high range?"]}),"electronics-rectifier-zener-transistor":S({concept:"Semiconductor circuits convert, regulate or amplify signals according to diode, Zener and transistor characteristics.",keyTerms:["Forward bias","Reverse bias","Ripple","Zener voltage","Gain"],successCriteria:["Circuit polarity is correct.","Input and output are measured separately.","Characteristic graph or waveform supports conclusion."],materials:["Diodes/Zener/transistor","Resistors and breadboard","DC/AC low-voltage source","Multimeter or CRO/simulator"],setup:["Identify terminals and polarity.","Use current-limiting resistor.","Prepare graph axes for V-I or transfer readings."],procedure:["Build selected rectifier, regulator or transistor circuit.","Check polarity and current-limiting resistance.","Vary input or bias in steps.","Record output voltage/current or waveform.","Plot characteristic and write conclusion."],observationFields:["Device circuit","Input/bias range","Output readings","Graph/waveform","Conclusion"],table:{columns:["Input/bias","Output voltage","Output current","Waveform/region"],rows:["1","2","3","4","5"]},analysisPrompts:["Identify cut-in, breakdown or active region.","Compare ripple with and without filter.","Calculate gain where applicable."],expectedOutcome:"A device characteristic or waveform-supported explanation of circuit behaviour.",commonMistakes:["No current-limiting resistor","Reversing diode/transistor pins","Recording input but not output","Graph without region labels"],vivaQuestions:["What is Zener breakdown?","Why is a filter capacitor used?","What is transistor gain?"]}),"electronics-amplifier-signal-cro":S({concept:"Amplifier and CRO practicals trace a signal through stages, measuring gain, waveform shape and fault symptoms.",keyTerms:["Gain","Frequency","Amplitude","Waveform","Test point"],successCriteria:["Input signal is defined.","Test points are recorded in order.","Fault diagnosis cites the abnormal reading."],materials:["Amplifier or signal generator setup","CRO/oscilloscope or simulator","Probe leads","Test-point diagram"],setup:["Set a safe input amplitude.","Calibrate CRO time/div and volt/div.","Mark input, output and intermediate test points."],procedure:["Apply known input signal.","Measure input amplitude and frequency.","Measure output or stage test points.","Calculate voltage or power gain.","Diagnose distortion or fault from waveform evidence."],observationFields:["Circuit/stage selected","Input signal","Test point readings","Gain/waveform","Fault diagnosis"],table:{columns:["Test point","Amplitude","Frequency","Waveform shape","Inference"],rows:["Input","Stage 1","Output"]},analysisPrompts:["Gain = output amplitude / input amplitude.","Compare waveform shape at each stage.","Identify clipping, no signal or noise from evidence."],expectedOutcome:"A signal-tracing record with gain or fault diagnosis.",commonMistakes:["No common ground","Wrong CRO scale","Overdriving input","Diagnosing without test-point evidence"],vivaQuestions:["What does gain mean?","Why is common ground important?","How does clipping appear on CRO?"]}),"electronics-pcb-seven-segment-digital":S({concept:"Digital and build projects convert a circuit idea into a working board, truth table, display output or tested prototype.",keyTerms:["Truth table","PCB layout","Continuity","Segment","Prototype"],successCriteria:["Component list and circuit/truth table are complete.","Build sequence is recorded.","Testing proves the output."],materials:["Breadboard or PCB worksheet","Logic ICs/LED/seven-segment display","Resistors and wires","Multimeter"],setup:["Draw circuit or truth table first.","Identify pinouts.","Plan test sequence before wiring."],procedure:["List components and pin connections.","Build or map PCB layout stage by stage.","Test continuity and supply lines.","Apply input combinations or display code.","Record output and fix notes."],observationFields:["Build type","Component list","Circuit/truth table","Test result","Fix notes"],table:{columns:["Input/code","Expected output","Actual output","Status"],rows:["1","2","3","4"]},analysisPrompts:["Compare actual output with truth table.","Identify wiring or component fault if mismatch occurs.","Write final working condition."],expectedOutcome:"A tested digital/build worksheet with evidence of working output.",commonMistakes:["Wrong pinout","No current-limiting resistor for LED segments","Skipping continuity test","Messy component list"],vivaQuestions:["Why use a truth table?","What is continuity testing?","Why do LED segments need resistors?"]}),"electronics-appliance-fault-finding":S({concept:"Fault finding isolates a problem by tracing symptoms through power, input, processing and output stages.",keyTerms:["Symptom","Stage","Test point","Open cir
7cuit","Short circuit"],successCriteria:["Symptom is specific.","Stages are checked in logical order.","Repair action follows test evidence."],materials:["Device block diagram or simulator","Multimeter","Safe low-voltage trainer board","Fault log"],setup:["Record symptom exactly.","Draw block diagram.","Start with power supply stage."],procedure:["Describe symptom and expected normal behaviour.","Trace power supply and input stage first.","Check each stage test point.","Compare reading with expected range.","Choose probable fault and corrective action."],observationFields:["Device and symptom","Stage traced","Test result","Probable fault","Corrective action"],table:{columns:["Stage","Expected","Observed","Fault clue"],rows:["Power","Input","Processing","Output"]},analysisPrompts:["Use stage-by-stage elimination.","Do not replace parts without test evidence.","State whether fault is supply, signal or output related."],expectedOutcome:"A logical diagnostic record from symptom to corrective action.",commonMistakes:["Starting at random component","Ignoring power supply","Replacing without measuring","Unsafe mains handling"],vivaQuestions:["Why check power first?","What is a test point?","How do symptoms guide diagnosis?"]}),"electronics-household-projects":S({concept:"Household wiring and electronics projects focus on safe circuit layout, component purpose, protection and working-model explanation.",keyTerms:["Fuse","Earthing","Switch","Load","Circuit diagram"],successCriteria:["Circuit diagram is labelled.","Safety protection is explained.","Procedure and viva notes are complete."],materials:["Low-voltage model kit or drawing sheet","Switch, fuse model, load and wires","Insulation tape under supervision","Project report format"],setup:["Use only low-voltage classroom models.","Draw circuit before assembly.","Identify protection element and load."],procedure:["Write project title and objective.","Draw labelled household or model circuit.","List components and their function.","Assemble or explain working model safely.","Record test result, precautions and viva notes."],observationFields:["Project title","Component list","Circuit diagram notes","Working/test result","Viva notes"],table:{columns:["Component","Function","Connection/safety note"],rows:["Switch","Fuse/MCB","Load","Earth/protection"]},analysisPrompts:["Explain current path.","State safety role of fuse/earthing.","Compare series and parallel household wiring if relevant."],expectedOutcome:"A safe project report or model explanation with circuit and viva readiness.",commonMistakes:["Using real mains supply","Unlabelled circuit diagram","No protection element","Weak component function explanation"],vivaQuestions:["Why are household loads in parallel?","What is the function of a fuse?","Why is earthing important?"]})},Ft=e=>{var o,n;const a=Se[e.subject]||Se.physics,i=Lt[e.id]||{},r=S({concept:a.concept,keyTerms:a.keyTerms,successCriteria:["Aim is understood before starting.","Procedure is followed in order.","Observation, inference and evidence are complete."],materials:[`${e.mode} setup`,"Notebook or digital record sheet","Board-specific practical prompt","Calculator, graph tool or simulator when required"],safety:a.safety,setup:["Read the aim.","Prepare apparatus or digital workspace.","Create observation table before starting."],procedure:e.workflow,observationFields:e.evidence,table:{columns:["Step","Observation/data","Inference"],rows:e.evidence.slice(0,4)},analysisPrompts:["Use the relevant formula or principle.","Connect observations to inference.","State one limitation or error source."],expectedOutcome:`A completed practical record for ${e.title}.`,commonMistakes:["Skipping observation table","Writing inference without evidence","Missing units or labels"],vivaQuestions:["What was the aim?","Which observation supports your result?","What would you improve next time?"]});return{...r,...i,keyTerms:(o=i.keyTerms)!=null&&o.length?i.keyTerms:r.keyTerms,safety:[...new Set([...i.safety||[],...a.safety])],rubric:(n=i.rubric)!=null&&n.length?i.rubric:r.rubric}},s=(e,a=2)=>Number(e).toFixed(a),G=(e,a)=>e.find(i=>i.value===a)||e[0],E=(e,a,i)=>({points:e,xLabel:a,yLabel:i}),$=({observations:e,tableRows:a,analysis:i,inference:r,precautions:o,evidence:n})=>({observations:e,tableRows:a,analysis:i,inference:r,precautions:o,evidence:n}),N=(e,a)=>({columns:e,rows:a}),$e=[{value:"screw",label:"Screw gauge",lc:.01,unit:"mm",target:"wire diameter"},{value:"spherometer",label:"Spherometer",lc:.001,unit:"cm",target:"surface sagitta"},{value:"balance",label:"Beam balance",lc:.01,unit:"g",target:"sample mass"}],Ne=[{value:"hcl",label:"HCl",colour:"colourless fumes",test:"dense white fumes with NH3",deduction:"Hydrogen chloride gas"},{value:"h2s",label:"H2S",colour:"colourless",test:"lead acetate paper turns black",deduction:"Hydrogen sulphide gas"},{value:"no2",label:"NO2",colour:"brown fumes",test:"turns moist blue litmus red",deduction:"Nitrogen dioxide gas"},{value:"water",label:"Water vapour",colour:"colourless",test:"cobalt chloride paper turns pink",deduction:"Water vapour"},{value:"co2",label:"CO2",colour:"colourless",test:"lime water turns milky",deduction:"Carbon dioxide gas"},{value:"nh3",label:"NH3",colour:"pungent colourless gas",test:"moist red litmus turns blue",deduction:"Ammonia gas"}
7],Re=[{value:"copper-sulphate",label:"Copper sulphate",cation:"Cu2+",anion:"SO4 2-",dry:"blue-green bead",group:"blue precipitate soluble in excess NH4OH",confirm:"white BaSO4 precipitate after acidifying with HCl"},{value:"ammonium-chloride",label:"Ammonium chloride",cation:"NH4+",anion:"Cl-",dry:"ammonia smell on warming with NaOH",group:"no group precipitate; NH3 turns red litmus blue",confirm:"curdy white AgCl soluble in NH4OH"},{value:"ferrous-sulphate",label:"Ferrous sulphate",cation:"Fe2+",anion:"SO4 2-",dry:"green salt, brown residue on heating",group:"dirty green precipitate with NaOH",confirm:"white BaSO4 precipitate after acidifying"},{value:"calcium-carbonate",label:"Calcium carbonate",cation:"Ca2+",anion:"CO3 2-",dry:"brick-red flame, CO2 with dilute acid",group:"white precipitate with ammonium oxalate",confirm:"lime water turns milky with evolved gas"}],Pe=[{value:"gram",label:"Gram seed",feature:"two cotyledons with curved embryo axis",function:"stored food and future shoot-root axis"},{value:"pea",label:"Pea seed",feature:"large cotyledons and visible radicle",function:"nutrient reserve for germination"},{value:"bean",label:"Bean seed",feature:"testa, hilum and embryo between cotyledons",function:"seed protection and early seedling growth"}],Te=[{value:"solanaceae",label:"Solanaceae",formula:"Br, Ebr, K(5), C(5), A5, G(2)",marker:"epipetalous stamens and bicarpellary ovary"},{value:"fabaceae",label:"Fabaceae",formula:"Br, %, K(5), C1+2+(2), A(9)+1, G1",marker:"papilionaceous corolla and legume fruit"},{value:"liliaceae",label:"Liliaceae",formula:"Br, P3+3, A3+3, G(3)",marker:"tepals in two whorls and superior tricarpellary ovary"},{value:"malvaceae",label:"Malvaceae",formula:"Br, K(5), C5, A(infinity), G(5)",marker:"monadelphous stamens and epicalyx"}],It={"physics-screw-gauge-spherometer-beam-balance":{title:"Precision instrument simulator",description:"Change the instrument, reading and zero error, then capture corrected readings with uncertainty.",controls:[{id:"instrument",label:"Instrument",type:"select",default:"screw",options:$e},{id:"mainReading",label:"Main scale reading",type:"range",min:0,max:25,step:.1,default:8.4,unit:"scale units"},{id:"coincidence",label:"Coinciding division",type:"range",min:0,max:50,step:1,default:17,unit:"div"},{id:"zeroError",label:"Zero error",type:"range",min:-.2,max:.2,step:.01,default:.03,unit:"scale units"}],run:e=>{const a=G($e,e.instrument),i=Number(e.mainReading)+Number(e.coincidence)*a.lc,r=i-Number(e.zeroError),o=a.lc*2,n=[0,1,2].map(c=>[`Trial ${c+1}`,`${s(Number(e.mainReading)+c*.1,2)} ${a.unit}`,`${Number(e.coincidence)+c}`,`${s(r+(c-1)*o,3)} ${a.unit}`]);return{visual:{kind:"instrument",title:a.label,primary:`${s(r,3)} ${a.unit}`,secondary:a.target},readouts:[{label:"Least count",value:a.lc,unit:a.unit},{label:"Observed reading",value:s(i,3),unit:a.unit},{label:"Zero correction",value:s(-Number(e.zeroError),3),unit:a.unit},{label:"Corrected mean",value:s(r,3),unit:a.unit}],table:N(["Trial","Main scale","Coincidence","Corrected reading"],n),graph:E(n.map((c,u)=>({x:u+1,y:Number.parseFloat(c[3])})),"Trial",`Reading (${a.unit})`),capture:$({observations:[`${a.label}; least count ${a.lc} ${a.unit}; zero error ${s(Number(e.zeroError),3)} ${a.unit}.`,`Corrected mean reading = ${s(r,3)} ${a.unit}.`,`Repeated readings vary by about ${s(o,3)} ${a.unit}, so the measurement is acceptable.`],tableRows:n,analysis:[`Observed reading = main scale + coinciding division x least count = ${s(i,3)} ${a.unit}.`,`Corrected reading = observed reading - zero error = ${s(r,3)} ${a.unit}.`,`Uncertainty is reported to the least count: +/- ${a.lc} ${a.unit}.`],inference:`The ${a.target} is ${s(r,3)} ${a.unit} after applying zero correction.`,precautions:"Check zero error before measurement, avoid parallax and repeat readings at different positions."})}}},"physics-activity-motion-thermal-fluid":{title:"Motion, heat and fluid activity simulator",description:"Explore the activity trend and record the observation expected in the CBSE activity file.",controls:[{id:"activity",label:"Activity",type:"select",default:"projectile",options:[{value:"projectile",label:"Projectile range"},{value:"cooling",label:"Wax cooling curve"},{value:"bimetal",label:"Bimetal strip bending"},{value:"bernoulli",label:"Bernoulli flow"}]},{id:"driver",label:"Control variable",type:"range",min:10,max:80,step:5,default:40,unit:"%"},{id:"time",label:"Time / run number",type:"range",min:1,max:10,step:1,default:5,unit:"run"}],run:e=>{const a={projectile:"Range",cooling:"Temperature",bimetal:"Deflection",bernoulli:"Pressure drop"},i={projectile:"cm",cooling:"deg C",bimetal:"mm",bernoulli:"Pa"},r=e.activity==="projectile"?.12*Number(e.driver)*(100-Math.abs(Number(e.driver)-45)):e.activity==="cooling"?85-Number(e.time)*4.8-Number(e.driver)*.08:e.activity==="bimetal"?Number(e.driver)*.18+Number(e.time)*.7:Number(e.driver)*4.2+Number(e.time)*9,o=[1,2,3,4].map(n=>
7[String(n),`${Math.max(5,Number(e.driver)+(n-2)*10)}%`,`${s(r*(.75+n*.08),2)} ${i[e.activity]}`,n>2?"trend increasing":"baseline"]);return{visual:{kind:"physics",title:G([{value:e.activity,label:a[e.activity]}],e.activity).label,primary:`${s(r,2)} ${i[e.activity]}`,secondary:"controlled-variable trend"},readouts:[{label:a[e.activity],value:s(r,2),unit:i[e.activity]},{label:"Control setting",value:e.driver,unit:"%"},{label:"Run",value:e.time,unit:""}],table:N(["Run","Control variable","Observation","Trend"],o),graph:E(o.map((n,c)=>({x:c+1,y:Number.parseFloat(n[2])})),"Run",a[e.activity]),capture:$({observations:[`${a[e.activity]} changes to ${s(r,2)} ${i[e.activity]} at the selected control setting.`,"The trend is clearer when only one variable is changed at a time."],tableRows:o,analysis:[`The observed trend is obtained by comparing ${a[e.activity].toLowerCase()} across four controlled runs.`,"A graph of observation versus control variable shows the physical relationship."],inference:`${a[e.activity]} follows the expected trend for the selected activity when the control variable is changed systematically.`,precautions:"Change only one variable at a time and keep the observation position fixed."})}}},"physics-middle-school-activity-bridge":{title:"Class 7-8 physics activity bench",description:"Run junior activities for measurement, heat, motion, magnets, simple machines and circuits.",controls:[{id:"activity",label:"Activity family",type:"select",default:"circuit",options:[{value:"measurement",label:"Measurement"},{value:"heat",label:"Heat transfer"},{value:"motion",label:"Motion graph"},{value:"magnet",label:"Magnet strength"},{value:"circuit",label:"Simple circuit"}]},{id:"input",label:"Input setting",type:"range",min:1,max:10,step:1,default:6,unit:"level"},{id:"load",label:"Load / distance",type:"range",min:1,max:8,step:1,default:4,unit:"unit"}],run:e=>{const a=Number(e.input)*(e.activity==="circuit"?.3:e.activity==="magnet"?4:e.activity==="heat"?6:2)+Number(e.load),i={measurement:"cm",heat:"deg C",motion:"cm/s",magnet:"pins",circuit:"A"},r=[1,2,3].map(o=>[`Trial ${o}`,`${Number(e.input)+o-1}`,`${s(a+o*.5,2)} ${i[e.activity]}`,"observation recorded"]);return{visual:{kind:"physics",title:"Junior activity model",primary:`${s(a,2)} ${i[e.activity]}`,secondary:e.activity},readouts:[{label:"Observation",value:s(a,2),unit:i[e.activity]},{label:"Input level",value:e.input,unit:""},{label:"Load/distance",value:e.load,unit:""}],table:N(["Trial","Input","Measured output","Note"],r),graph:E(r.map((o,n)=>({x:n+1,y:Number.parseFloat(o[2])})),"Trial","Output"),capture:$({observations:[`The ${e.activity} activity gives an output of ${s(a,2)} ${i[e.activity]}.`,"The observation changes when the input setting is changed."],tableRows:r,analysis:["The table compares input level with measured output.","The result supports the selected physics principle."],inference:`The activity demonstrates that the measured ${e.activity} output depends on the chosen input condition.`,precautions:"Use the same measuring position and repeat the observation before writing the conclusion."})}}},"physics-optics-auxiliary-travelling-microscope":{title:"Advanced optics simulator",description:"Model auxiliary lens, convex mirror and travelling microscope readings.",controls:[{id:"method",label:"Method",type:"select",default:"concave-lens",options:[{value:"concave-lens",label:"Concave lens with auxiliary lens"},{value:"convex-mirror",label:"Convex mirror"},{value:"glass-slab",label:"Glass slab refractive index"},{value:"liquid",label:"Liquid refractive index"}]},{id:"u",label:"Object/apparent distance",type:"range",min:5,max:60,step:1,default:25,unit:"cm"},{id:"v",label:"Image/real distance",type:"range",min:5,max:80,step:1,default:45,unit:"cm"},{id:"shift",label:"Shift / thickness",type:"range",min:1,max:12,step:.5,default:4,unit:"cm"}],run:e=>{const a=Number(e.u),i=Number(e.v),r=Number(e.shift),o=e.method.includes("slab")||e.method==="liquid"?a/Math.max(1,a-r):a*i/Math.max(1,a+i),n=e.method.includes("slab")||e.method==="liquid"?"":"cm",c=e.method.includes("slab")||e.method==="liquid"?"Refractive index":"Focal length",u=[["1",`${a} cm`,`${i} cm`,`${r} cm`,`${s(o,3)} ${n}`],["2",`${a+2} cm`,`${i+3} cm`,`${r+.5} cm`,`${s(o*1.02,3)} ${n}`],["3",`${a-2} cm`,`${i-2} cm`,`${Math.max(1,r-.5)} cm`,`${s(o*.98,3)} ${n}`]];return{visual:{kind:"optics",title:c,primary:`${s(o,3)} ${n}`,secondary:e.method},readouts:[{label:c,value:s(o,3),unit:n},{label:"u/apparent depth",value:a,unit:"cm"},{label:"v/real depth",value:i,unit:"cm"},{label:"Shift",value:r,unit:"cm"}],table:N(["Trial","u/depth","v/reading","Shift","Result"],u),graph:E(u.map((p,v)=>({x:v+1,y:Number.parseFloat(p[4])}
7)),"Trial",c),capture:$({observations:[`${c} by ${e.method} method = ${s(o,3)} ${n}.`,"Image position or apparent depth is recorded after removing parallax."],tableRows:u,analysis:[`Computed ${c.toLowerCase()} from the selected optical readings.`,"Mean is taken from repeated readings to reduce random error."],inference:`The ${c.toLowerCase()} obtained from the simulation is ${s(o,3)} ${n}.`,precautions:"Remove parallax, keep the lens/mirror vertical and take readings from the same reference mark."})}}},"physics-galvanometer-potentiometer-ac":{title:"Electrical measurement circuit simulator",description:"Simulate galvanometer conversion, potentiometer readings and AC mains frequency by sonometer.",controls:[{id:"method",label:"Method",type:"select",default:"ammeter",options:[{value:"ammeter",label:"Galvanometer to ammeter"},{value:"voltmeter",label:"Galvanometer to voltmeter"},{value:"potentiometer",label:"Potentiometer EMF comparison"},{value:"sonometer",label:"AC frequency by sonometer"}]},{id:"g",label:"Galvanometer resistance / length",type:"range",min:5,max:200,step:5,default:60,unit:"ohm/cm"},{id:"current",label:"Current / balance setting",type:"range",min:1,max:50,step:1,default:15,unit:"mA"},{id:"ratio",label:"Range / length ratio",type:"range",min:1,max:10,step:.5,default:4,unit:"x"}],run:e=>{const a=Number(e.g),i=Number(e.current),r=Number(e.ratio),o=e.method==="ammeter"?a/Math.max(1,r*100-1):e.method==="voltmeter"?r*100-a:e.method==="potentiometer"?r:50+(i-15)*.2+(a-60)*.01,n={ammeter:"ohm",voltmeter:"ohm",potentiometer:"EMF ratio",sonometer:"Hz"},c=[1,2,3].map(u=>[`Trial ${u}`,`${a+u*5}`,`${i+u}`,`${r+u*.1}`,`${s(o*(1+(u-2)*.01),3)} ${n[e.method]}`]);return{visual:{kind:"circuit",title:"Circuit reading",primary:`${s(o,3)} ${n[e.method]}`,secondary:e.method},readouts:[{label:"Computed result",value:s(o,3),unit:n[e.method]},{label:"Circuit parameter",value:a,unit:""},{label:"Current/balance",value:i,unit:"mA"}],table:N(["Trial","G/length","Current","Ratio","Result"],c),graph:E(c.map((u,p)=>({x:p+1,y:Number.parseFloat(u[4])})),"Trial","Result"),capture:$({observations:[`${G([{value:e.method,label:e.method}],e.method).label} result = ${s(o,3)} ${n[e.method]}.`,"Circuit is balanced/connected before taking the final reading."],tableRows:c,analysis:["Substitute the measured deflection, resistance or balance lengths in the selected formula.",`Computed result = ${s(o,3)} ${n[e.method]}.`],inference:`The selected electrical method gives ${s(o,3)} ${n[e.method]}.`,precautions:"Use low current, avoid loose connections and never change the circuit with supply on."})}}},"physics-diffraction-polarization-capacitor":{title:"Wave optics and RC graph simulator",description:"Generate intensity or voltage readings for diffraction, polarization and capacitor transients.",controls:[{id:"mode",label:"Activity",type:"select",default:"polarization",options:[{value:"diffraction",label:"Single-slit diffraction"},{value:"polarization",label:"Malus law polarization"},{value:"charging",label:"RC charging"},{value:"discharging",label:"RC discharging"}]},{id:"position",label:"Angle / time",type:"range",min:0,max:90,step:5,default:35,unit:"deg/s"},{id:"constant",label:"Slit width / RC constant",type:"range",min:1,max:10,step:.5,default:4,unit:"setting"}],run:e=>{const a=Number(e.position),i=Number(e.constant),r=e.mode==="polarization"?100*Math.cos(a*Math.PI/180)**2:e.mode==="charging"?100*(1-Math.exp(-a/Math.max(1,i*8))):e.mode==="discharging"?100*Math.exp(-a/Math.max(1,i*8)):Math.abs(100*Math.sin(a/i*.28)/Math.max(1,a/20+.5)),o=e.mode.includes("charging")?"Voltage":"Intensity",n=[0,15,30,45,60].map(c=>{const u=e.mode==="polarization"?100*Math.cos(c*Math.PI/180)**2:r*(.7+c/180);return[`${c}`,`${s(u,2)}`,o,e.mode]});return{visual:{kind:"wave",title:o,primary:`${s(r,2)}%`,secondary:e.mode},readouts:[{label:o,value:s(r,2),unit:"%"},{label:"Angle/time",value:a,unit:""},{label:"Constant",value:i,unit:""}],table:N(["Angle/time","Reading","Quantity","Mode"],n),graph:E(n.map(c=>({x:Number(c[0]),y:Number(c[1])})),"Angle/time",o),capture:$({observations:[`${o} reading is ${s(r,2)}% for ${e.mode}.`,"The graph shape identifies the wave or RC relationship."],tableRows:n,analysis:[`Plot ${o.toLowerCase()} against angle/time and identify the trend.`,"The curve is compared with the expected theoretical relation."],inference:`${e.mode} produces the expected ${o.toLowerCase()} variation.`,precautions:"Avoid stray light, use steady supply and record readings only after the circuit or optical system is stable."})}}}
7,"chemistry-formal-salt-analysis":{title:"Salt analysis decision simulator",description:"Choose an unknown salt and follow dry, wet and confirmatory branches.",controls:[{id:"salt",label:"Unknown salt",type:"select",default:"copper-sulphate",options:Re},{id:"sampleMass",label:"Sample used",type:"range",min:1,max:8,step:1,default:3,unit:"spatulas"},{id:"acidDrops",label:"Dilute acid drops",type:"range",min:1,max:10,step:1,default:4,unit:"drops"}],run:e=>{const a=G(Re,e.salt),i=[["Dry test","solid salt",a.dry,"preliminary clue"],["Cation test","NaOH/NH4OH",a.group,a.cation],["Anion test","acidified reagent",a.confirm,a.anion]];return{visual:{kind:"chemistry",title:"Unknown salt branch",primary:`${a.cation} / ${a.anion}`,secondary:a.label},readouts:[{label:"Cation",value:a.cation,unit:""},{label:"Anion",value:a.anion,unit:""},{label:"Sample",value:e.sampleMass,unit:"spatulas"}],table:N(["Test","Reagent","Observation","Deduction"],i),capture:$({observations:[`Dry test: ${a.dry}.`,`Cation branch: ${a.group}.`,`Anion branch: ${a.confirm}.`],tableRows:i,analysis:[`Cation is inferred as ${a.cation} from the wet test.`,`Anion is inferred as ${a.anion} from the confirmatory test.`],inference:`The given salt is consistent with ${a.label}: ${a.cation} and ${a.anion}.`,precautions:"Use small quantities, add acids dropwise and avoid directly smelling gases."})}}},"chemistry-extended-gas-tests":{title:"Gas identification simulator",description:"Run colour, smell, litmus and confirmatory tests for board gases.",controls:[{id:"gas",label:"Gas sample",type:"select",default:"hcl",options:Ne},{id:"moisture",label:"Moisture on test paper",type:"range",min:0,max:10,step:1,default:7,unit:"level"},{id:"flow",label:"Gas flow",type:"range",min:1,max:10,step:1,default:4,unit:"level"}],run:e=>{const a=G(Ne,e.gas),i=Number(e.moisture)>4?"clear positive":"weak result",r=[["Appearance","visual",a.colour,"supporting clue"],["Indicator","moist litmus/paper",`${a.test} (${i})`,a.deduction],["Confirmatory","standard reagent",a.test,a.label]];return{visual:{kind:"gas",title:a.label,primary:a.deduction,secondary:a.colour},readouts:[{label:"Gas",value:a.label,unit:""},{label:"Result quality",value:i,unit:""},{label:"Flow level",value:e.flow,unit:""}],table:N(["Step","Test","Observation","Deduction"],r),capture:$({observations:[`Gas appears as ${a.colour}.`,`Confirmatory test: ${a.test}.`],tableRows:r,analysis:[`The strongest clue is: ${a.test}.`,`Therefore the gas is identified as ${a.deduction}.`],inference:`The evolved gas is ${a.deduction}.`,precautions:"Use wafting only, keep test paper moist and conduct irritating gas tests in a ventilated area."})}}},"chemistry-middle-school-activity-bridge":{title:"Class 7-8 chemistry activity simulator",description:"Model mixtures, separation, indicators, neutralisation, metals and combustion.",controls:[{id:"activity",label:"Activity",type:"select",default:"indicator",options:[{value:"separation",label:"Separation of mixture"},{value:"indicator",label:"Acid-base indicator"},{value:"neutralisation",label:"Neutralisation"},{value:"combustion",label:"Combustion and air"},{value:"metal",label:"Metal/non-metal property"}]},{id:"amount",label:"Sample amount",type:"range",min:1,max:10,step:1,default:5,unit:"level"},{id:"reagent",label:"Reagent / heat",type:"range",min:1,max:10,step:1,default:6,unit:"level"}],run:e=>{const a={separation:"filtrate becomes clear and residue remains on filter paper",indicator:Number(e.reagent)>5?"indicator changes to basic/alkaline colour":"indicator changes to acidic colour",neutralisation:"temperature rises slightly and indicator approaches neutral colour",combustion:"flame is brighter with better air supply",metal:"metal sample conducts and shows characteristic reaction"}[e.activity],i=[["Setup",e.activity,`${e.amount}`,"ready"],["Observation","visible change",a,"recorded"],["Conclusion","property","matches expected property","accepted"]];return{visual:{kind:"chemistry",title:"Junior chemistry setup",primary:a,secondary:e.activity},readouts:[{label:"Activity",value:e.activity,unit:""},{label:"Sample",value:e.amount,unit:"level"},{label:"Reagent/heat",value:e.reagent,unit:"level"}],table:N(["Stage","Item","Observation","Status"],i),capture:$({observations:[a,"The observation is compared with the expected material property."],tableRows:i,analysis:["The visible change identifies the property tested in the activity.","The controlled sample is used for c
7omparison."],inference:`The ${e.activity} activity shows the expected property change.`,precautions:"Use small quantities, wear eye protection and do not taste or smell chemicals directly."})}}},"chemistry-volumetric-calculation-engine":{title:"Volumetric analysis simulator",description:"Generate burette readings, concordant titre and concentration calculation.",controls:[{id:"type",label:"Titration",type:"select",default:"acid-base",options:[{value:"acid-base",label:"Acid-base"},{value:"permanganate",label:"KMnO4 redox"},{value:"iodometry",label:"Iodometric"}]},{id:"initial",label:"Initial burette reading",type:"range",min:0,max:5,step:.1,default:.4,unit:"mL"},{id:"final",label:"Final burette reading",type:"range",min:15,max:35,step:.1,default:24.8,unit:"mL"},{id:"normality",label:"Standard normality",type:"range",min:.02,max:.2,step:.01,default:.1,unit:"N"}],run:e=>{const a=Number(e.final)-Number(e.initial),i=Number(e.normality)*a/25,r=[0,1,2].map(o=>[`${o+1}`,`${s(Number(e.initial)+o*.1,1)}`,`${s(Number(e.final)+o*.05,1)}`,`${s(a+o*.05,2)}`,o===0?"rough":"concordant"]);return{visual:{kind:"titration",title:e.type,primary:`${s(a,2)} mL`,secondary:`M = ${s(i,4)}`},readouts:[{label:"Mean titre",value:s(a,2),unit:"mL"},{label:"Calculated molarity",value:s(i,4),unit:"M"},{label:"Standard",value:e.normality,unit:"N"}],table:N(["Trial","Initial","Final","Titre","Use"],r),graph:E(r.map((o,n)=>({x:n+1,y:Number(o[3])})),"Trial","Titre"),capture:$({observations:[`Concordant titre = ${s(a,2)} mL.`,`Calculated concentration = ${s(i,4)} M.`],tableRows:r,analysis:[`Titre = final - initial = ${s(a,2)} mL.`,`Using N1V1 = N2V2 gives concentration ${s(i,4)} M for a 25 mL aliquot.`],inference:`The unknown solution concentration is ${s(i,4)} M by ${e.type} titration.`,precautions:"Remove air bubbles, read the lower meniscus at eye level and use only concordant readings."})}}},"chemistry-chromatography-rf":{title:"Chromatography Rf simulator",description:"Move solvent and pigment spots to calculate Rf values and identify components.",controls:[{id:"sample",label:"Sample",type:"select",default:"leaf",options:[{value:"leaf",label:"Leaf pigments"},{value:"ink",label:"Ink mixture"},{value:"flower",label:"Flower extract"},{value:"amino",label:"Amino acid mixture"}]},{id:"solvent",label:"Solvent front",type:"range",min:4,max:12,step:.5,default:8,unit:"cm"},{id:"spotA",label:"Spot A distance",type:"range",min:1,max:10,step:.2,default:3.2,unit:"cm"},{id:"spotB",label:"Spot B distance",type:"range",min:1,max:10,step:.2,default:5.7,unit:"cm"}],run:e=>{const a=Number(e.spotA)/Number(e.solvent),i=Number(e.spotB)/Number(e.solvent),r=[["A",`${e.spotA} cm`,`${e.solvent} cm`,s(a,2)],["B",`${e.spotB} cm`,`${e.solvent} cm`,s(i,2)]];return{visual:{kind:"chromatography",title:"Chromatogram",primary:`Rf ${s(a,2)} / ${s(i,2)}`,secondary:e.sample},readouts:[{label:"Rf A",value:s(a,2),unit:""},{label:"Rf B",value:s(i,2),unit:""},{label:"Solvent front",value:e.solvent,unit:"cm"}],table:N(["Spot","Spot distance","Solvent front","Rf"],r),graph:E(r.map((o,n)=>({x:n+1,y:Number(o[3])})),"Spot","Rf"),capture:$({observations:[`Spot A Rf = ${s(a,2)} and spot B Rf = ${s(i,2)}.`,"Separated spots show that the sample contains more than one component."],tableRows:r,analysis:["Rf = distance travelled by solute / distance travelled by solvent front.",`For spot A: ${e.spotA}/${e.solvent} = ${s(a,2)}.`],inference:`The ${e.sample} sample separates into at least two components with different Rf values.`,precautions:"Keep the origin above solvent level and mark the solvent front immediately."})}}},"chemistry-functional-food-preparation":{title:"Functional group and biomolecule test simulator",description:"Run qualitative tests for organic groups, carbohydrates, proteins and preparations.",controls:[{id:"test",label:"Test family",type:"select",default:"protein",options:[{value:"alcohol",label:"Alcohol test"},{value:"aldehyde",label:"Aldehyde test"},{value:"ketone",label:"Ketone test"},{value:"acid",label:"Carboxylic acid test"},{value:"carbohydrate",label:"Carbohydrate test"},{value:"protein",label:"Protein test"},{value:"salt-prep",label:"Salt preparation"}]},{id:"heat",label:"Heating level",type:"range",min:0,max:10,step:1,default:5,unit:"level"},{id:"drops",label:"Reagent drops",type:"range",min:1,max:12,step:1,default:5,unit:"drops"}],run:e=>{const a={alcohol:"fruity ester smell after esterification",aldehyde:"silver mirror or brick-red precipitate",ketone:"yellow iodoform precipitate for methyl ketone",acid:"brisk effervescence with carbonate",carbohydrate:"brick-red precipitate with Benedict reagent",protein:"violet colour in Biuret test","salt-prep":"crystals form after evaporation"}[e.test],i=[["Sample",e.test,`${e.drops} drops`,"prepared"],["Test","reagent added",a,"positive"],["Disposal","teacher tray","waste neutralised","safe"]];return{visual:{kind:"chemistry",title:"Qualitative test",primary:a,secondary:e.test},readouts:[{label:"Positive result",value:a,unit:""},{label:"Heat",value:e.heat,unit:"level"},{label:"Reagent",value:e.drops,unit:"drops"}],table:N(["Step","Material","Observation","Inference"],i),capture:$({observations:[a,`The ${e.test} test gives a positive diagnostic observation.`],tableRows:i,analysis:[`The observed change is matched with the diagnostic result for ${e.test}.`,"A blank/control should not give the same positive result."],inference:`The sample shows the expected positive result for ${e.test}.`,precautions:"Use a water bath where required, avoid excess reagent and dispose organic waste safely."})}}},"chemistry-kinetics-enthalpy-electrochem":{title:"Kinetics, enthalpy and electrochemistry simulator",description:"Generate rate, temperature and EMF readings for senior chemistry graphs.",controls:[{id:"mode",label:"Experiment",type:"select",default:"kinetics",options:[{value:"kinetics",label:"Thiosulphate rate"},{value:"enthalpy",label:"Enthalpy change"},{value:"electrochem",label:"Zn/Cu cell EMF"}]},{id:"concentration",label:"Concentration",type:"range",min:.1,max:1,step:.
705,default:.4,unit:"M"},{id:"temperature",label:"Temperature",type:"range",min:20,max:70,step:1,default:32,unit:"deg C"}],run:e=>{const a=e.mode==="kinetics"?Number(e.concentration)*Number(e.temperature)*.42:e.mode==="enthalpy"?Number(e.concentration)*(Number(e.temperature)-20)*12:1.1+Math.log10(Number(e.concentration)+1)*.08-(Number(e.temperature)-25)*.001,i=e.mode==="kinetics"?"Rate index":e.mode==="enthalpy"?"Heat change":"EMF",r=e.mode==="kinetics"?"1/s":e.mode==="enthalpy"?"J":"V",o=[.2,.4,.6,.8].map(n=>[`${n} M`,`${e.temperature} deg C`,`${s(a*n/Number(e.concentration),3)} ${r}`,i]);return{visual:{kind:"graph",title:i,primary:`${s(a,3)} ${r}`,secondary:e.mode},readouts:[{label:i,value:s(a,3),unit:r},{label:"Concentration",value:e.concentration,unit:"M"},{label:"Temperature",value:e.temperature,unit:"deg C"}],table:N(["Concentration","Temperature","Reading","Quantity"],o),graph:E(o.map((n,c)=>({x:c+1,y:Number.parseFloat(n[2])})),"Concentration set",i),capture:$({observations:[`${i} reading = ${s(a,3)} ${r}.`,"The graph changes predictably with concentration or temperature."],tableRows:o,analysis:[`Plot ${i.toLowerCase()} against concentration or temperature.`,`The selected condition gives ${s(a,3)} ${r}.`],inference:`${e.mode} follows the expected graph trend under controlled conditions.`,precautions:"Start timing immediately, insulate calorimetry setups and use clean salt bridge/electrodes for EMF."})}}},"biology-dicot-seed-embryo":{title:"Dicot seed dissection simulator",description:"Open the seed, identify embryo parts and capture functions.",controls:[{id:"specimen",label:"Specimen",type:"select",default:"gram",options:Pe},{id:"soak",label:"Soaking time",type:"range",min:1,max:12,step:1,default:6,unit:"h"},{id:"opening",label:"Dissection care",type:"range",min:1,max:10,step:1,default:8,unit:"level"}],run:e=>{const a=G(Pe,e.specimen),i=Number(e.soak)>=4&&Number(e.opening)>=6?"clear embryo visible":"embryo partly damaged",r=[["Testa","outer covering","protects seed"],["Cotyledons",a.feature,"food storage"],["Plumule/radicle","embryo axis visible",a.function]];return{visual:{kind:"biology",title:a.label,primary:i,secondary:a.feature},readouts:[{label:"Visibility",value:i,unit:""},{label:"Soaking time",value:e.soak,unit:"h"},{label:"Care level",value:e.opening,unit:""}],table:N(["Part","Observation","Function"],r),capture:$({observations:[`${a.label}: ${a.feature}.`,`Dissection quality: ${i}.`],tableRows:r,analysis:["Cotyledons store food and the embryo axis forms the seedling.","The labelled sketch must show testa, cotyledons, plumule and radicle."],inference:`${a.label} is a dicot seed because it has two cotyledons and a visible embryo axis.`,precautions:"Use soaked seeds, open the seed coat gently and keep the specimen moist."})}}},"biology-pollen-dna-meiosis":{title:"Pollen, DNA and meiosis simulator",description:"Simulate slide/process outcomes for senior biology practicals.",controls:[{id:"process",label:"Process",type:"select",default:"pollen",options:[{value:"pollen",label:"Pollen germination"},{value:"dna",label:"DNA isolation"},{value:"meiosis",label:"Meiosis spotting"}]},{id:"reagent",label:"Reagent strength",type:"range",min:1,max:10,step:1,default:6,unit:"level"},{id:"time",label:"Time",type:"range",min:1,max:30,step:1,default:12,unit:"min"}],run:e=>{const a=e.process==="pollen"?`pollen tube length ${s(Number(e.reagent)*Number(e.time)*.8,1)} units`:e.process==="dna"?`white DNA fibres visible with yield index ${s(Number(e.reagent)*2.5,1)}`:Number(e.time)<10?"prophase I stage visible":Number(e.time)<20?"metaphase/anaphase stages visible":"telophase tetrads visible",i=[["Preparation",e.process,`${e.reagent}`,"ready"],["Observation","microscope/process",a,"diagnostic"],["Inference","feature","matches expected biology process","accepted"]];return{visual:{kind:"microscope",title:e.process,primary:a,secondary:"slide/process outcome"},readouts:[{label:"Diagnostic feature",value:a,unit:""},{label:"Reagent",value:e.reagent,unit:"level"},{label:"Time",value:e.time,unit:"min"}],table:N(["Stage","Item","Observation","Deduction"],i),capture:$({observations:[a,"Diagnostic feature is visible when the preparation is not overheated or overstained."],tableRows:i,analysis:["Identify the process using the visible diagnostic feature.","Record a labelled drawing or process sketch."],inference:`The selected ${e.process} preparation shows the expected diagnostic feature.`,precautions:"Use clean slides, avoid air bubbles and handle stains/reagents carefully."})}}},"biology-middle-school-activity-bridge":{title:"Class 7-8 biology observation simulator",description:"Run microscopy, nutrition, respiration, microorganism and ecology observations.",controls:[{id:"activity",label:"Activity",type:"select",default:"stomata",options:[{value:"stomata",label:"Leaf/stomata"},{value:"cell",label:"Onion/cheek cells"},{value:"respiration",label:"Respiration model"},{value:"microbe",label:"Microorganisms"},{value:"ecology",label:"Local ecology"}]},{id:"magnification",label:"Magnification",type:"range",min:40,max:400,step:40,default:160,unit:"x"},{id:"quality",label:"Sample quality",type:"range",min:1,max:10,step:1,default:7,unit:"level"}],run:e=>{const a={stomata:"guard cells and stomatal pore visible",cell:"cell wall, cytoplasm and nucleus visible",respiration:"lime water turns milky due to carbon dioxide",microbe:"moving microorganisms visible in water sample",ecology:"biotic and abiotic factors listed from local habitat"}[e.activity],i=[["Specimen/model",e.activity,a,"labelled"],["Magnification",`${e.magnification}x`,`quality ${e.quality}/10`,"acceptable"],["Life process","feature link","process explained","complete"]];return{visual:{kind:"biology",title:"Junior biology observation",primary:a,secondary:e.activity},readouts:[{label:"Observation",value:a,unit:""},{label:"Magnification",value:e.magnification,unit:"x"},{label:"Quality",value:e.quality,unit:"/10"}],table:N(["Item","Setting","Observation","Status"],i),capture:$({observations:[a,"The observed feature is linked to the life process or ecosystem role."],tableRows:i,analysis:["The labelled sketch must show the key diagnostic feature.","The conclusion connects structure with function."],inference:`The ${e.activity} activity shows the expected biology feature.`,precautions:"Use clean slides, start with low power and keep living samples moist."})}}},"biology-floral-taxonomy":{title:"Floral dissection taxonomy simulator",description:"Select a family and build whorl, formula and family-character records.",controls:[{id:"family",label:"Family",type:"select",default:"solanaceae",options:Te},{id:"sepals",label:"Sepal count",type:"range",min:3,max:6,step:1,default:5,unit:""},{id:"petals",label:"Petal/tepal count",type:"range",min:3,max:6,step:1,default:5,unit:""}],run:e=>{const a=G(Te,e.family),i=[["Calyx/perianth",`${e.sepals}
7`,"whorl counted"],["Corolla/tepals",`${e.petals}`,a.marker],["Formula",a.formula,"family matched"]];return{visual:{kind:"flower",title:a.label,primary:a.formula,secondary:a.marker},readouts:[{label:"Family",value:a.label,unit:""},{label:"Formula",value:a.formula,unit:""},{label:"Marker",value:a.marker,unit:""}],table:N(["Whorl/item","Observation","Deduction"],i),capture:$({observations:[`Family marker: ${a.marker}.`,`Floral formula: ${a.formula}.`],tableRows:i,analysis:["Compare whorl characters with family keys.",`The observed characters match ${a.label}.`],inference:`The flower belongs to ${a.label} based on ${a.marker}.`,precautions:"Dissect whorls in order and keep removed parts arranged in a labelled sequence."})}}},"biology-food-urine-biochemical-tests":{title:"Biochemical test simulator",description:"Run food and urine reagent tests with colour and precipitate observations.",controls:[{id:"test",label:"Test",type:"select",default:"starch",options:[{value:"starch",label:"Starch iodine test"},{value:"sugar",label:"Reducing sugar Benedict test"},{value:"protein",label:"Protein Biuret test"},{value:"fat",label:"Fat emulsion/spot test"},{value:"urea",label:"Urea test"},{value:"albumin",label:"Albumin heat test"},{value:"bile",label:"Bile salt test"}]},{id:"concentration",label:"Sample concentration",type:"range",min:0,max:10,step:1,default:6,unit:"level"},{id:"heat",label:"Heating level",type:"range",min:0,max:10,step:1,default:4,unit:"level"}],run:e=>{const a=Number(e.concentration)>=4,i={starch:a?"blue-black colour":"brown iodine remains",sugar:a?"green to brick-red precipitate":"blue solution remains",protein:a?"violet colour":"no violet colour",fat:a?"translucent grease spot or milky emulsion":"no permanent spot",urea:a?"ammonia smell with alkaline heating":"weak/no ammonia",albumin:a?"white coagulum on heating":"no coagulum",bile:a?"sulphur yellow ring/emulsion change":"negative ring"}[e.test],r=[["Sample",e.test,`${e.concentration}/10`,"prepared"],["Reagent result","standard reagent",i,a?"positive":"negative"],["Conclusion","biochemical",a?"present":"absent","recorded"]];return{visual:{kind:"chemistry",title:"Biochemical test",primary:i,secondary:a?"positive":"negative"},readouts:[{label:"Observation",value:i,unit:""},{label:"Inference",value:a?"positive":"negative",unit:""},{label:"Concentration",value:e.concentration,unit:"/10"}],table:N(["Step","Test","Observation","Inference"],r),capture:$({observations:[i,`Inference: ${a?"positive":"negative"} for ${e.test}.`],tableRows:r,analysis:[`The diagnostic colour/precipitate is compared with the standard ${e.test} result.`,"A control sample is needed to avoid false positives."],inference:`${e.test} is ${a?"present":"absent"} in the sample.`,precautions:"Use clean droppers, heat gently and treat urine samples as biohazard material."})}}},"biology-plant-physiology-setups":{title:"Plant physiology setup simulator",description:"Model photosynthesis, transpiration, osmosis, diffusion, potometer and Hydrilla setups.",controls:[{id:"setup",label:"Setup",type:"select",default:"photosynthesis",options:[{value:"photosynthesis",label:"Photosynthesis requirement"},{value:"hydrilla",label:"Hydrilla oxygen release"},{value:"transpiration",label:"Transpiration bell jar"},{value:"potometer",label:"Potometer"},{value:"osmosis",label:"Osmosis"},{value:"diffusion",label:"Diffusion"}]},{id:"light",label:"Light / gradient",type:"range",min:0,max:10,step:1,default:7,unit:"level"},{id:"time",label:"Time",type:"range",min:5,max:60,step:5,default:25,unit:"min"}],run:e=>{const a=Number(e.light)*Number(e.time)/10,i=e.setup==="hydrilla"?"bubbles/min":e.setup==="potometer"?"cm movement":e.setup==="osmosis"?"g mass change":"index",r=[1,2,3].map(o=>[`Trial ${o}`,`${e.light}`,`${e.time}`,`${s(a*(.85+o*.08),2)} ${i}`]);return{visual:{kind:"plant",title:e.setup,primary:`${s(a,2)} ${i}`,secondary:"controlled setup"},readouts:[{label:"Output",value:s(a,2),unit:i},{label:"Light/gradient",value:e.light,unit:"level"},{label:"Time",value:e.time,unit:"min"}],table:N(["Trial","Light/gradient","Time","Observation"],r),graph:E(r.map((o,n)=>({x:n+1,y:Number.parseFloat(o[3])}
7)),"Trial","Output"),capture:$({observations:[`${e.setup} output = ${s(a,2)} ${i}.`,"The control setup is used to prove the tested factor."],tableRows:r,analysis:["Compare experimental and control setups before writing the inference.","The measured output increases when the limiting factor is improved."],inference:`${e.setup} shows the expected plant physiology response under the selected conditions.`,precautions:"Keep cut stems under water where required, seal air leaks and use a proper control setup."})}}},"biology-spotting-field-study":{title:"Spotting and field-study simulator",description:"Identify specimens, water samples and local ecology/waste-management observations.",controls:[{id:"prompt",label:"Prompt",type:"select",default:"specimen",options:[{value:"specimen",label:"Specimen spotting"},{value:"water",label:"Water sample microscopy"},{value:"waste",label:"Waste-management visit"},{value:"ecology",label:"Ecology field study"}]},{id:"quality",label:"Sample/visit quality",type:"range",min:1,max:10,step:1,default:7,unit:"level"},{id:"features",label:"Identifying features found",type:"range",min:1,max:8,step:1,default:4,unit:"features"}],run:e=>{const a=Number(e.features)>=4?"identification reliable":"needs more evidence",i=[["Prompt",e.prompt,`${e.features} features`,a],["Field note","local observation",`quality ${e.quality}/10`,"recorded"],["Conclusion","improvement/conservation","two action points added","complete"]];return{visual:{kind:"biology",title:"Observation bank",primary:a,secondary:e.prompt},readouts:[{label:"Deduction",value:a,unit:""},{label:"Features",value:e.features,unit:""},{label:"Quality",value:e.quality,unit:"/10"}],table:N(["Section","Item","Observation","Status"],i),capture:$({observations:[`${e.features} identifying features recorded; ${a}.`,"Field/local note added with conservation or improvement action."],tableRows:i,analysis:["Spotting must combine labelled sketch, diagnostic characters and conclusion.","Field study notes should include evidence and suggested action."],inference:`The ${e.prompt} record is ${a} based on the observed characters.`,precautions:"Do not disturb habitats, handle specimens carefully and label samples immediately."})}}},"math-cbse-secondary-lab":{title:"CBSE Class X maths lab simulator",description:"Generate constructions, graph readings, trigonometry, statistics and probability records.",controls:[{id:"activity",label:"Activity",type:"select",default:"trigonometry",options:[{value:"geometry",label:"Circle/triangle construction"},{value:"graph",label:"Linear/quadratic graph"},{value:"trigonometry",label:"Trigonometry height-distance"},{value:"statistics",label:"Statistics table"},{value:"probability",label:"Probability experiment"}]},{id:"a",label:"Parameter A",type:"range",min:1,max:20,step:1,default:8,unit:""},{id:"b",label:"Parameter B",type:"range",min:1,max:20,step:1,default:12,unit:""}],run:e=>{const a=e.activity==="trigonometry"?Number(e.a)*Math.tan(Number(e.b)*3*Math.PI/180):e.activity==="probability"?Number(e.a)/(Number(e.a)+Number(e.b)):Number(e.a)*Number(e.b),i=[["Given",`${e.a}`,`${e.b}`,"recorded"],["Working",e.activity,`${s(a,3)}`,"computed"],["Conclusion","result",`${s(a,3)}`,"verified"]];return{visual:{kind:"math",title:e.activity,primary:s(a,3),secondary:"construction/graph/table"},readouts:[{label:"Result",value:s(a,3),unit:""},{label:"A",value:e.a,unit:""},{label:"B",value:e.b,unit:""}],table:N(["Step","Value A","Value B","Status"],i),graph:E(i.map((r,o)=>({x:o+1,y:Number.parseFloat(r[2])||o+1})),"Step","Value"),capture:$({observations:[`${e.activity} activity result = ${s(a,3)}.`,"Diagram/graph/table is matched with the calculation."],tableRows:i,analysis:["Show given data, construction/computation and conclusion clearly.",`Computed result = ${s(a,3)}.`],inference:`The ${e.activity} activity verifies the expected mathematical result.`,precautions:"Use scale accurately, label axes/diagrams and write units wherever applicable."})}}},"math-middle-school-activity-bank":{title:"Class 7-8 maths activity simulator",description:"Build integer, rational, algebra, triangle, mensuration, data and probability activities.",controls:[{id:"activity",label:"Activity",type:"select",default:"pattern",options:[{value:"integers",label:"Integer model"},{value:"algebra",label:"Algebra identity tiles"},{value:"triangles",label:"Triangle construction"},{value:"mensuration",label:"Mensuration model"},{value:"data",label:"Data handling"},{value:"pattern",label:"Pattern proof"}]},{id:"n",label:"Number / size",type:"range",min:2,max:20,step:1,default:6,unit:""},{id:"m",label:"Second value",type:"range",min:2,max:20,step:1,default:9,unit:""}],run:e=>
7{const a=e.activity==="algebra"?(Number(e.n)+Number(e.m))**2:e.activity==="mensuration"?2*(Number(e.n)+Number(e.m)):Number(e.n)+Number(e.m),i=[["Model",e.activity,`${e.n}, ${e.m}`],["Observation","pattern/table",`${s(a,2)}`],["Reflection","extension","change one parameter"]];return{visual:{kind:"math",title:"Junior activity model",primary:s(a,2),secondary:e.activity},readouts:[{label:"Output",value:s(a,2),unit:""},{label:"n",value:e.n,unit:""},{label:"m",value:e.m,unit:""}],table:N(["Section","Tool","Observation"],i),capture:$({observations:[`Activity output = ${s(a,2)} for ${e.activity}.`,"The model/table supports the written rule."],tableRows:i,analysis:["Record the visual model and the numerical pattern.","Write one extension by changing a parameter."],inference:`The ${e.activity} activity demonstrates the expected middle-school concept.`,precautions:"Keep the model labelled and check arithmetic before writing the conclusion."})}}},"math-cbse-xi-xii-activity-file":{title:"CBSE XI-XII activity file simulator",description:"Generate records for sets, functions, trigonometric graphs, conics, matrices, calculus, vectors, LPP and probability.",controls:[{id:"activity",label:"Activity",type:"select",default:"calculus",options:[{value:"sets",label:"Set laws"},{value:"functions",label:"Function graph"},{value:"trig",label:"Trigonometric graph"},{value:"conics",label:"Conic section"},{value:"matrix",label:"Matrix operation"},{value:"calculus",label:"Derivative/area"},{value:"vectors",label:"Vector result"},{value:"lpp",label:"Linear programming"},{value:"probability",label:"Probability distribution"}]},{id:"x",label:"x / parameter",type:"range",min:-10,max:10,step:1,default:3,unit:""},{id:"scale",label:"Scale / coefficient",type:"range",min:1,max:10,step:1,default:4,unit:""}],run:e=>{const a=Number(e.x),i=Number(e.scale),r=e.activity==="calculus"?2*i*a:e.activity==="probability"?Math.min(1,Math.abs(a)/(i+10)):e.activity==="lpp"?i*Math.max(0,a)+20:i*a*a,o=[["Input",`${a}`,`${i}`,"defined"],["Computation",e.activity,`${s(r,3)}`,"worked"],["Conclusion","record","graph/table/proof attached","ready"]];return{visual:{kind:"math",title:"Senior activity file",primary:s(r,3),secondary:e.activity},readouts:[{label:"Computed value",value:s(r,3),unit:""},{label:"Parameter",value:a,unit:""},{label:"Scale",value:i,unit:""}],table:N(["Stage","Input","Output","Status"],o),graph:E([-2,-1,0,1,2].map(n=>({x:n,y:i*(n+a/5)**2})),"x","y"),capture:$({observations:[`${e.activity} generated value = ${s(r,3)}.`,"The activity output is supported by a graph/table/proof."],tableRows:o,analysis:["State the concept, show computation and attach visual evidence.",`Final computed value = ${s(r,3)}.`],inference:`The ${e.activity} record is ready for the activity file with verified working.`,precautions:"Use consistent scale, label axes and state assumptions before the conclusion."})}}},"math-icse-assignments":{title:"ICSE assignment builder simulator",description:"Build assignment records for geometry, mensuration, algebra, coordinate geometry, statistics and trigonometry.",controls:[{id:"topic",label:"Topic",type:"select",default:"geometry",options:[{value:"geometry",label:"Geometry"},{value:"mensuration",label:"Mensuration"},{value:"algebra",label:"Algebra"},{value:"coordinate",label:"Coordinate geometry"},{value:"statistics",label:"Statistics"},{value:"trigonometry",label:"Trigonometry"}]},{id:"a",label:"Given value A",type:"range",min:1,max:30,step:1,default:10,unit:""},{id:"b",label:"Given value B",type:"range",min:1,max:30,step:1,default:14,unit:""}],run:e=>{const a=e.topic==="statistics"?(Number(e.a)+Number(e.b))/2:e.topic==="coordinate"?Math.hypot(Number(e.a),Number(e.b)):Number(e.a)*Number(e.b),i=[["Problem statement",e.topic,"given values recorded"],["Working",`${e.a}, ${e.b}`,`${s(a,3)}`],["Presentation","diagram/graph","conclusion added"]];return{visual:{kind:"math",title:"Assignment record",primary:s(a,3),secondary:e.topic},readouts:[{label:"Result",value:s(a,3),unit:""},{label:"A",value:e.a,unit:""},{label:"B",value:e.b,unit:""}],table:N(["Section","Input","Output"],i),capture:$({observations:[`Assignment topic ${e.topic}; computed result ${s(a,3)}.`,"Problem, working, diagram/graph and conclusion are included."],tableRows:i,analysis:["Show formula selection, substitution and final answer.","Presentation should match ICSE internal-assessment criteria."],inference:`The ${e.topic}
7 assignment record is complete with computation and presentation evidence.`,precautions:"Use proper notation, units and labelled diagrams."})}}},"math-isc-projects":{title:"ISC project work simulator",description:"Create project findings for set laws, functions, trigonometry, conics, variation, calculus, vectors, LPP and areas.",controls:[{id:"topic",label:"Project topic",type:"select",default:"lpp",options:[{value:"sets",label:"Set laws"},{value:"functions",label:"Function graphs"},{value:"trig",label:"Trigonometric transformations"},{value:"conics",label:"Conics"},{value:"variation",label:"Coefficient of variation"},{value:"calculus",label:"Calculus/area"},{value:"vectors",label:"Vectors"},{value:"lpp",label:"Linear programming"}]},{id:"data",label:"Dataset / coefficient",type:"range",min:2,max:50,step:1,default:20,unit:""},{id:"constraint",label:"Constraint / bound",type:"range",min:2,max:50,step:1,default:30,unit:""}],run:e=>{const a=e.topic==="variation"?Number(e.data)/Number(e.constraint)*100:e.topic==="lpp"?3*Number(e.data)+2*Number(e.constraint):Number(e.data)*Number(e.constraint)/2,i=[["Topic",e.topic,"format ready"],["Computation/model",`${e.data}, ${e.constraint}`,`${s(a,3)}`],["Findings","interpretation","viva prompts added"]];return{visual:{kind:"math",title:"ISC project model",primary:s(a,3),secondary:e.topic},readouts:[{label:"Finding",value:s(a,3),unit:""},{label:"Dataset",value:e.data,unit:""},{label:"Constraint",value:e.constraint,unit:""}],table:N(["Section","Input","Output"],i),graph:E(i.map((r,o)=>({x:o+1,y:Number.parseFloat(r[2])||o+2})),"Section","Project output"),capture:$({observations:[`ISC project topic ${e.topic}; primary finding ${s(a,3)}.`,"Overall format, content, findings and viva notes are ready."],tableRows:i,analysis:["Explain the mathematical model, computation and interpretation.","Include limitations or assumptions in the findings."],inference:`The ${e.topic} project has a clear mathematical finding of ${s(a,3)}.`,precautions:"Keep sources, scale and assumptions explicit throughout the report."})}}},"electronics-measurement-instruments":{title:"Electronics measurement instrument simulator",description:"Use ammeter, voltmeter, galvanometer and multimeter style readings.",controls:[{id:"instrument",label:"Instrument",type:"select",default:"multimeter",options:[{value:"ammeter",label:"Ammeter"},{value:"voltmeter",label:"Voltmeter"},{value:"galvanometer",label:"Galvanometer"},{value:"multimeter",label:"Multimeter"}]},{id:"supply",label:"Supply / range",type:"range",min:1,max:12,step:.5,default:5,unit:"V"},{id:"resistance",label:"Resistance / load",type:"range",min:10,max:1e3,step:10,default:220,unit:"ohm"}],run:e=>{const a=Number(e.supply)/Number(e.resistance),i=e.instrument==="ammeter"?a*1e3:e.instrument==="voltmeter"?Number(e.supply):e.instrument==="galvanometer"?a*1e5:Number(e.resistance),r=e.instrument==="ammeter"?"mA":e.instrument==="voltmeter"?"V":e.instrument==="galvanometer"?"div":"ohm",o=[["Range",e.instrument,`${e.supply} V`,"selected"],["Reading","meter",`${s(i,2)} ${r}`,"stable"],["Deduction","component",a>0?"continuity/load ok":"open circuit","recorded"]];return{visual:{kind:"electronics",title:"Meter bench",primary:`${s(i,2)} ${r}`,secondary:e.instrument},readouts:[{label:"Reading",value:s(i,2),unit:r},{label:"Supply",value:e.supply,unit:"V"},{label:"Load",value:e.resistance,unit:"ohm"}],table:N(["Step","Instrument","Observation","Status"],o),capture:$({observations:[`${e.instrument} reading = ${s(i,2)} ${r}.`,"Polarity/range is selected before recording the value."],tableRows:o,analysis:[`Using Ohm law, current = ${s(a*1e3,2)} mA.`,"The component/circuit is acceptable if the reading is stable and in range."],inference:`The selected measurement gives ${s(i,2)} ${r}.`,precautions:"Start with the highest range, observe polarity and never connect an ammeter in parallel."})}}},"electronics-rectifier-zener-transistor":{title:"Semiconductor circuit simulator",description:"Simulate rectifiers, filters, Zener regulation and transistor characteristics.",controls:[{id:"circuit",label:"Circuit",type:"select",default:"rectifier",options:[{value:"rectifier",label:"Half/full-wave rectifier"},{value:"filter",label:"Rectifier with filter"},{value:"zener",label:"Zener regulator"},{value:"transistor",label:"Transistor characteristics"}]},{id:"input",label:"Input voltage / bias",type:"range",min:1,max:20,step:.5,default:9,unit:"V"},{id:"load",label:"Load resistance",type:"range",min:100,max:2e3,step:100,default:1e3,unit:"ohm"}],run:e=>{const a=Number(e.input),i=Number(e.load),r=e.circuit==="zener"?Math.min(5.1,a-.7):e.circuit==="transistor"?a*12/(i/1e3):e.circuit==="filter"?a*.88:a*.45,o=e.circuit==="filter"?4:e.circuit==="rectifier"?38:2,n=[["Input",`${a} V`,`${i} ohm`,"applied"],["Output",e.circuit,`${s(r,2)}`,"measured"],["Ripple/gain","scope/graph",`${s(o,1)}%`,"noted"]];return{visual:{kind:"circuit",title:"Semiconductor bench",primary:`${s(r,2)}`,secondary:`${o}% ripple/gain marker`},readouts:[{label:"Output/gain",value:s(r,2),unit:e.circuit==="transistor"?"":"V"},{label:"Ripple marker",value:s(o,1),unit:"%"},{label:"Load",value:i,unit:"ohm"}],table:N(["Stage","Input","Output","Status"],n),graph:E([0,1,2,3,4].map(c=>({x:c,y:r*Math.abs(Math.sin(c+.4))})),"time/bias","output"),capture:$({observations:[`${e.circuit} output = ${s(r,2)} ${e.circuit==="transistor"?"gain units":"V"}.`,`Ripple/gain marker = ${s(o,1)}%.`],tableRows:n,analysis:["Compare input and output waveform/curve for the selected semiconductor circuit.",`Load ${i} ohm gives output ${s(r,2)}.`],inference:`The ${e.circuit} circuit shows the expected semiconductor behaviour.`,precautions:"Check diode/transistor polarity and do not exceed rated voltage/current."})}}},"electronics-amplifier-signal-cro":{title:"Amplifier and CRO diagnostic simulator",description:"Trace signal generator, amplifier stages, gain and waveform on a CRO-like display.",controls:[{id:"stage",label:"Stage",type:"select",default:"voltage-amp",options:[{value:"voltage-amp",label:"Voltage amplifier"},{value:"power-amp",label:"Power amplifier"},{value:"audio",label:"Audio amplifier"},{value:"equaliser",label:"Graphic equaliser"},{value:"cro",label:"CRO study"}]},{id:"frequency",label:"Frequency",type:"range",min:50,max:5e3,step:50,default:1e3,unit:"Hz"},{id:"input",label:"Input amplitude",type:"range",min:.1,max:2,step:.1,default:.5,unit:"V"}],run:e=>{const i={"voltage-amp":20,"power-amp":8,audio:12,equaliser:5,cro:1}[e.stage]||1,r=i*Number(e.input),o=[["Input",`${e.frequency} Hz`,`${e.input} V`,"sine wave"],["Output",e.stage,`${s(r,2)} V`,`gain ${i}`],["Diagnosis","waveform",r>10?"clipping risk":"normal waveform","noted"]];return{visual:{kind:"waveform",title:"CRO waveform",primary:`${s(r,2)} V`,secondary:`${e.frequency} Hz`},readouts:[{label:"Gain",value:i,unit:"x"},{label:"Output",value:s(r,2),unit:"V"},{label:"Frequency",value:e.frequency,unit:"Hz"}],table:N(["Point","Frequency","Amplitude","Status"],o),graph:E([0,1,2,3,4,5].map(n=>({x:n,y:r*Math.sin(n)})),"time","voltage"),capture:$({observations:[`Output amplitude = ${s(r,2)} V at ${e.frequency} Hz.`,`Voltage gain = ${i}x.`],tableRows:o,analysis:[`Gain = Vout/Vin = ${s(r,2)}/${e.input} = ${i}.`,"Waveform distortion is checked on the CRO display."],inference:`The ${e.stage} stage gives a gain of ${i}x under the selected signal condition.`,precautions:"Keep CRO ground common, start at low amplitude and avoid overdriving the amplifier."})}}},"electronics-pcb-seven-segment-digital":{title:"PCB, seven-segment and digital logic simulator",description:"Build truth tables, display segment states and PCB test records.",controls:[{id:"build",label:"Build type",type:"select",default:"seven-seg",options:[{value:"pcb",label:"PCB manufacturing"},{value:"seven-seg",label:"Seven-segment display"},{value:"logic",label:"Logic gate model"},{value:"controller",label:"Controller board project"}]},{id:"inputA",label:"Input A / digit",type:"range",min:0,max:9,step:1,default:5,unit:""},{id:"inputB",label:"Input B",type:"range",min:0,max:1,step:1,default:1,unit:""}],run:e=>{const a=Number(e.inputA)%2&&Number(e.inputB)?1:0,i=[6,2,5,5,4,5,6,3,7,6][Number(e.inputA)]||0,r=e.build==="seven-seg"?`${i} segments on`:e.build==="logic"?`output ${a}`:"continuity passed",o=[["Inputs",`${e.inputA}`,`${e.inputB}`,"set"],["Output",e.build,r,"observed"],["Build check","connections","no short/open marked","passed"]];return{visual:{kind:"digital",title:"Digital project bench",primary:r,secondary:e.build},readouts:[{label:"Output",value:r,unit:""},{label:"Input A",value:e.inputA,unit:""},{label:"Input B",value:e.inputB,unit:""}],table:N(["Stage","Input A","Input B/output","Status"],o),capture:$({observations:[`${e.build} output: ${r}.`,"Truth table/circuit continuity check is complete."],tableRows:o,analysis:["Compare the observed output with the truth table or PCB net list.",`For the selected input, output is ${r}.`],inference:`The ${e.build} build gives the expected output for the selected inputs.`,precautions:"Check continuity before powering, use current limiting and orient IC/display pins correctly."})}}}
7,"electronics-appliance-fault-finding":{title:"Appliance and communication fault-tree simulator",description:"Trace symptoms, stage tests and repair actions for electronics servicing practicals.",controls:[{id:"device",label:"Device",type:"select",default:"ups",options:[{value:"audio",label:"Audio system"},{value:"tv",label:"TV/LCD"},{value:"printer",label:"Printer/scanner"},{value:"microwave",label:"Microwave"},{value:"telephone",label:"Telephone/fax"},{value:"ups",label:"UPS/DTH"}]},{id:"supply",label:"Supply test",type:"range",min:0,max:12,step:.5,default:9,unit:"V"},{id:"signal",label:"Signal/control test",type:"range",min:0,max:10,step:1,default:5,unit:"level"}],run:e=>{const a=Number(e.supply)<5?"power supply fault":Number(e.signal)<4?"signal/control stage fault":"output stage or connector fault",i=[["Symptom",e.device,"not working/abnormal","reported"],["Supply stage",`${e.supply} V`,Number(e.supply)<5?"fail":"pass","tested"],["Signal stage",`${e.signal}/10`,a,"probable fault"]];return{visual:{kind:"electronics",title:"Fault tree",primary:a,secondary:e.device},readouts:[{label:"Probable fault",value:a,unit:""},{label:"Supply",value:e.supply,unit:"V"},{label:"Signal",value:e.signal,unit:"/10"}],table:N(["Stage","Reading","Observation","Action"],i),capture:$({observations:[`Probable fault: ${a}.`,`Supply reading ${e.supply} V; signal/control level ${e.signal}/10.`],tableRows:i,analysis:["Fault tree starts from power supply, then signal path, then output/load.",`The selected readings indicate ${a}.`],inference:`The ${e.device} symptom is most likely due to ${a}.`,precautions:"Disconnect mains before opening equipment and discharge capacitors before testing."})}}},"electronics-household-projects":{title:"Household wiring and project simulator",description:"Size load current, fuse rating and wiring checks for household/project models.",controls:[{id:"project",label:"Project",type:"select",default:"household",options:[{value:"household",label:"Household circuit"},{value:"fuse",label:"Fuse/accessory study"},{value:"wiring",label:"Wiring comparison"},{value:"model",label:"Working model project"}]},{id:"power",label:"Load power",type:"range",min:20,max:2e3,step:20,default:800,unit:"W"},{id:"voltage",label:"Supply voltage",type:"range",min:110,max:240,step:10,default:230,unit:"V"}],run:e=>{const a=Number(e.power)/Number(e.voltage),i=Math.ceil(a*1.25),r=[["Project",e.project,`${e.power} W`,"selected"],["Current",`${e.voltage} V`,`${s(a,2)} A`,"calculated"],["Protection","fuse/MCB",`${i} A`,"recommended"]];return{visual:{kind:"circuit",title:"Household project",primary:`${s(a,2)} A`,secondary:`${i} A fuse`},readouts:[{label:"Load current",value:s(a,2),unit:"A"},{label:"Fuse rating",value:i,unit:"A"},{label:"Voltage",value:e.voltage,unit:"V"}],table:N(["Section","Input","Output","Status"],r),capture:$({observations:[`Load current = ${s(a,2)} A for ${e.power} W at ${e.voltage} V.`,`Recommended fuse/MCB rating = ${i} A.`],tableRows:r,analysis:[`I = P/V = ${e.power}/${e.voltage} = ${s(a,2)} A.`,"Fuse rating is chosen slightly above working current."],inference:`The ${e.project} project needs a safe current rating of about ${s(a,2)} A with ${i} A protection.`,precautions:"Do not work on live mains, use insulation and follow teacher-supervised wiring checks."})}}}},Et={title:"Board practical simulator",description:"Interactive workbench for recording observations, readings and inference.",controls:[{id:"input",label:"Input variable",type:"range",min:1,max:10,step:1,default:5,unit:"level"},{id:"trial",label:"Trial",type:"range",min:1,max:5,step:1,default:2,unit:""}],run:e=>{const a=Number(e.input)*Number(e.trial),i=[["1",`${e.input}`,`${s(a,2)}`,"recorded"]];return{visual:{kind:"generic",title:"Simulation",primary:s(a,2),secondary:"reading"},readouts:[{label:"Reading",value:s(a,2),unit:""}],table:N(["Trial","Input","Reading","Status"],i),capture:$({observations:[`Simulated reading = ${s(a,2)}.`],tableRows:i,analysis:["Record the reading and compare it with the expected trend."],inference:"The simulation gives a usable practical observation.",precautions:"Repeat readings and keep variables controlled."})}}},Bt=e=>
7It[e.id]||Et,z=50,H=.1,te=[{id:"acetic-naoh",family:"Acid-base",title:"CH3COOH unknown vs standard NaOH",board:"CBSE/ISC Class 11-12",analyte:"Ethanoic acid",analyteFormula:"CH3COOH",titrant:"Sodium hydroxide",titrantFormula:"NaOH",titrantM:.1,aliquotMl:25,trueAnalyteM:.0968,analyteCoeff:1,titrantCoeff:1,indicator:"Phenolphthalein",endpoint:"first permanent pale pink for 20-30 seconds",reaction:"CH3COOH + NaOH -> CH3COONa + H2O",molarMass:60.05,initialReading:[.2,.1,0,.15],endpointColors:{before:"rgba(241, 245, 249, 0.62)",near:"rgba(251, 207, 232, 0.62)",sharp:"rgba(244, 114, 182, 0.48)",over:"rgba(219, 39, 119, 0.74)"},signalLabel:"pH / indicator signal"},{id:"permanganate-oxalate",family:"Redox",title:"Oxalate unknown vs KMnO4",board:"CBSE/ISC Class 11-12",analyte:"Oxalate solution",analyteFormula:"C2O4^2-",titrant:"Potassium permanganate",titrantFormula:"KMnO4",titrantM:.02,aliquotMl:20,trueAnalyteM:.0476,analyteCoeff:5,titrantCoeff:2,indicator:"Self-indicator",endpoint:"permanent faint pink because of one excess drop of KMnO4",reaction:"2MnO4- + 5C2O4^2- + 16H+ -> 2Mn2+ + 10CO2 + 8H2O",molarMass:88.02,initialReading:[.3,.15,.05,.25],endpointColors:{before:"rgba(224, 242, 254, 0.44)",near:"rgba(252, 231, 243, 0.52)",sharp:"rgba(249, 168, 212, 0.54)",over:"rgba(126, 34, 206, 0.66)"},signalLabel:"excess KMnO4 signal"},{id:"iodine-thiosulfate",family:"Iodometry",title:"Iodine unknown vs sodium thiosulfate",board:"ISC Class 11-12",analyte:"Iodine solution",analyteFormula:"I2",titrant:"Sodium thiosulfate",titrantFormula:"Na2S2O3",titrantM:.05,aliquotMl:25,trueAnalyteM:.0239,analyteCoeff:1,titrantCoeff:2,indicator:"Starch near endpoint",endpoint:"blue-black starch colour just disappears",reaction:"I2 + 2S2O3^2- -> 2I- + S4O6^2-",molarMass:253.81,initialReading:[.25,.05,.2,.1],endpointColors:{before:"rgba(146, 64, 14, 0.58)",near:"rgba(30, 64, 175, 0.58)",sharp:"rgba(219, 234, 254, 0.58)",over:"rgba(241, 245, 249, 0.64)"},signalLabel:"starch iodine colour"}],Wt=["Rough","1","2","3"],Z=(e,a,i)=>Math.min(i,Math.max(a,e)),T=(e,a=2)=>Number(e||0).toFixed(a),ie=e=>Number(T(e,2)),pe=e=>Wt.map((a,i)=>({label:a,initial:e.initialReading[i]??0,final:null,titre:null,error:null,swirls:0,verdict:i===0?"Rough trial pending":"Not recorded",accepted:!1,rough:i===0,coarseEndpointAdds:0})),Dt=(e,a)=>pe(e)[a],me=e=>e.trueAnalyteM*(e.aliquotMl/1e3)*(e.titrantCoeff/e.analyteCoeff)/e.titrantM*1e3,qt=(e,a)=>a?e.titrantM*(a/1e3)*(e.analyteCoeff/e.titrantCoeff)/(e.aliquotMl/1e3):0,he=(e,a,i)=>{const r=i>0?a/i:0;if(e.id==="acetic-naoh"){const o=3.05+8.95/(1+Math.exp(-(a-i)*2.1));return Z(o/14,0,1)}return e.id==="iodine-thiosulfate"?Z(1-r,0,1):Z((r-.94)/.12,0,1)},zt=(e,a)=>a<.94?e.endpointColors.before:a<.995?e.endpointColors.near:a<=1.012?e.endpointColors.sharp:e.endpointColors.over,Gt=(e,a,i)=>e<.72?"Run the rough trial quickly, then slow down before the predicted endpoint zone.":e<.9?"Start reducing the flow. Swirl after each portion so the colour clears before the next addition.":e<.985?"You are in the endpoint zone. Use 0.10 mL drops or half-drops only.":e<=1.012?i>0?"Endpoint is sharp. Record the final burette reading before the colour deepens.":"Swirl once and confirm the faint colour persists before recording.":a>.1?"Overshot. Treat this as rough data and repeat with dropwise additions near the endpoint.":"The endpoint has been crossed. Repeat the trial and stop at the first persistent colour change.",Ht=({scenario:e,titre:a,target:i,swirls:r,rough:o,lastStep:n=0,coarseEndpointAdds:c=0})=>{const u=ie(a-i),p=Math.abs(u),v=!o&&p<=H&&(n>.1||c>0);return a<i-.18?{error:u,accepted:!1,verdict:"Undershot",feedback:"The endpoint colour has not persisted yet. Continue dropwise while swirling."}:v?{error:u,accepted:!1,verdict:"Too fast near endpoint",feedback:"The final volume is close, but the endpoint was reached with too large a portion. Repeat dropwise for a reliable titre."}:!o&&p<=H&&r<=0?{error:u,accepted:!1,verdict:"Confirm endpoint",feedback:"Swirl before recording so the faint endpoint colour is confirmed as persistent."}:p<=.05&&r>0?{error:u,accepted:!o,verdict:o?"Good rough endpoint":"Sharp endpoint",feedback:`${e.endpoint} reached with excellent control.`}:p<=H?{error:u,accepted:!o,verdict:o?"Useful rough titre":"Concordant",feedback:"Close enough for a board practical; repeat to confirm concordance."}:a>i?{error:u,accepted:!1,verdict:"Overshot",feedback:"Colour is too strong. Reject this trial and repeat more slowly near the endpoint."}:{error:u,accepted:!1,verdict:"Needs repeat",feedback:"Reading is outside the acceptable endpoint band. Repeat with better flow control."}},Vt=e=>{const a=e.filter(r=>!r.rough&&r.accepted&&Number.isFinite(r.titre)).sort((r,o)=>r.titre-o.titre);let i=[];return a.forEach((r,o)=>{const n=a.slice(o).filter(c=>c.titre-r.titre<=H+1e-4);n.length>i.length&&(i=n)}),i.length>=2?i:[]},_t=e=>e.length?e.reduce((a,i)=>a+i.titre,0)/e.length:0,Ut=({scenario:e,trials:a,concordantTrials:i,meanTitre:r,calculatedM:o,strength:n,evidence:c})=>{const u=a.map(y=>[y.label,Number.isFinite(y.initial)?T(y.initial,2):"",Number.isFinite(y.final)?T(y.final,2):"",Number.isFinite(y.titre)?T(y.titre,2):"",y.rough?Number.isFinite(y.titre)?"Rejected: rough trial":"Not recorded":i.some(k=>k.label===y.label)?"Accepted":y.verdict]),p=i.map(y=>`Trial ${y.label}`).join(", "),v=a.filter(y=>!y.rough&&Number.isFinite(y.titre)&&!i.some(k=>k.label===y.label)).map(y=>`Trial ${y.label} (${y.verdict})`),b=`${T(o,4)} M`,h=`${T(n,2)} g L-1`;return{observations:[`${e.titrantFormula} in burette; standard concentration ${T(e.titrantM,3)} M.`,`${T(e.aliquotMl,2)} mL of ${e.analyteFormula} pipetted into the conical flask.`,`${e.indicator}; endpoint observed as ${e.endpoint}.`,`Concordant titre = ${T(r,2)} mL from ${p}.`,`Unknown concentration = ${b}; strength = ${h}.`],tableRows:u,analysis:[`Mean titre = (${i.map(y=>T(y.titre,2)).join(" + ")}) / ${i.length} = ${T(r,2)} mL.`,`${e.reaction}. M_unknown = M_titrant x V_titre x ${e.analyteCoeff}
7 / (V_aliquot x ${e.titrantCoeff}) = ${b}.`,v.length?`Rejected ${v.join("; ")}. Accepted readings are concordant within ${T(H,2)} mL.`:`Accepted readings are concordant within ${T(H,2)} mL.`],inference:`${e.analyte} concentration is ${b} by ${e.family.toLowerCase()} titration; calculated strength is ${h}.`,precautions:"Rinse burette with titrant, remove air bubbles, read the lower meniscus at eye level, add dropwise near the endpoint and use only concordant titres.",evidence:c}};function Qt({scenario:e,active:a,onSelect:i}){return t.jsxs("button",{type:"button",className:`vtip-scenario ${a?"active":""}`,"aria-pressed":a,onClick:()=>i(e.id),children:[t.jsx("span",{children:e.family}),t.jsx("strong",{children:e.title}),t.jsx("small",{children:e.board})]})}function Kt({scenario:e,dispensed:a,currentInitial:i,progress:r}){const o=Z(1-a/z,0,1),n=40,c=250,u=n+c*(1-o),p=zt(e,r),v=Array.from({length:11},(b,h)=>h*5);return t.jsxs("svg",{className:"vtip-apparatus-svg",viewBox:"0 0 310 430",role:"img","aria-label":"Burette, stopcock and conical flask titration apparatus",children:[t.jsxs("defs",{children:[t.jsxs("linearGradient",{id:`vtip-glass-${e.id}`,x1:"0",y1:"0",x2:"1",y2:"0",children:[t.jsx("stop",{offset:"0%",stopColor:"rgba(255,255,255,0.15)"}),t.jsx("stop",{offset:"42%",stopColor:"rgba(255,255,255,0.62)"}),t.jsx("stop",{offset:"100%",stopColor:"rgba(148,163,184,0.18)"})]}),t.jsxs("linearGradient",{id:`vtip-titrant-${e.id}`,x1:"0",y1:"0",x2:"0",y2:"1",children:[t.jsx("stop",{offset:"0%",stopColor:"#bae6fd",stopOpacity:"0.52"}),t.jsx("stop",{offset:"100%",stopColor:"#0ea5e9",stopOpacity:"0.72"})]}),t.jsx("clipPath",{id:`vtip-tube-clip-${e.id}`,children:t.jsx("rect",{x:"137",y:n,width:"28",height:c,rx:"9"})}),t.jsx("clipPath",{id:`vtip-flask-clip-${e.id}`,children:t.jsx("path",{d:"M119 0h42v48l61 139c9 20-5 43-27 43H85c-22 0-36-23-27-43l61-139z"})})]}),t.jsx("rect",{x:"238",y:"26",width:"10",height:"346",rx:"5",className:"vtip-stand"}),t.jsx("rect",{x:"158",y:"108",width:"86",height:"16",rx:"5",className:"vtip-clamp"}),t.jsx("rect",{x:"136",y:n-14,width:"30",height:"15",rx:"6",className:"vtip-burette-cap"}),t.jsx("rect",{x:"137",y:n,width:"28",height:c,rx:"9",fill:`url(#vtip-glass-${e.id})`,className:"vtip-glass-stroke"}),t.jsxs("g",{clipPath:`url(#vtip-tube-clip-${e.id})`,children:[t.jsx("rect",{x:"137",y:u,width:"28",height:n+c-u,fill:`url(#vtip-titrant-${e.id})`}),t.jsx("ellipse",{cx:"151",cy:u,rx:"14",ry:"3",className:"vtip-meniscus"})]}),t.jsx("g",{className:"vtip-graduations",children:v.map(b=>{const h=n+b/z*c;return t.jsxs("g",{children:[t.jsx("line",{x1:"166",y1:h,x2:b%10===0?184:177,y2:h}),b%10===0&&t.jsx("text",{x:"188",y:h+4,children:b})]},b)})}),t.jsx("rect",{x:"142",y:"290",width:"18",height:"12",rx:"3",className:"vtip-stopcock-block"}),t.jsx("circle",{cx:"151",cy:"297",r:"8",className:"vtip-stopcock"}),t.jsx("path",{d:"M146 304h10l-5 34z",className:"vtip-tip"}),t.jsx("path",{className:"vtip-drop-stream",d:"M151 336 C146 354, 158 368, 151 386"}),t.jsxs("g",{transform:"translate(12 186)",children:[t.jsx("path",{d:"M119 0h42v48l61 139c9 20-5 43-27 43H85c-22 0-36-23-27-43l61-139z",fill:`url(#vtip-glass-${e.id})`,className:"vtip-glass-stroke"}),t.jsxs("g",{clipPath:`url(#vtip-flask-clip-${e.id})`,children:[t.jsx("rect",{x:"40",y:"142",width:"200",height:"100",fill:p}),t.jsx("ellipse",{cx:"140",cy:"142",rx:"78",ry:"8",fill:p}),t.jsx("path",{className:"vtip-swirl",d:"M84 171 C116 151, 168 151, 198 172 C164 188, 119 190, 84 171z"})]})]}),t.jsxs("g",{className:"vtip-target-badge",children:[t.jsx("rect",{x:"18",y:"25",width:"112",height:"52",rx:"10"}),t.jsx("text",{x:"31",y:"48",children:"endpoint"}),t.jsx("text",{x:"31",y:"65",children:"watch colour"})]}),t.jsxs("g",{className:"vtip-reading-badge",children:[t.jsx("rect",{x:"188",y:"352",width:"100",height:"50",rx:"10"}),t.jsx("text",{x:"202",y:"374",children:"final reading"}),t.jsxs("text",{x:"202",y:"392",children:[T(i+a,2)," mL"]})]})]})}function Xt({scenario:e,current:a,concordantTrials:i}){const n={left:34,right:14,top:14,bottom:26}
7,c=z,u=360-n.left-n.right,p=176-n.top-n.bottom,v=w=>n.left+w/c*u,b=w=>n.top+(1-w)*p,h=Math.max(.1,a),k=Array.from({length:32},(w,O)=>{const B=O/31*h;return{volume:B,signal:he(e,B,me(e))}}).map((w,O)=>`${O===0?"M":"L"} ${v(w.volume).toFixed(1)} ${b(w.signal).toFixed(1)}`).join(" ");return t.jsxs("div",{className:"vtip-curve","aria-label":`${e.signalLabel} curve`,children:[t.jsxs("div",{className:"vtip-curve-head",children:[t.jsx("span",{children:e.signalLabel}),t.jsxs("strong",{children:[T(a,2)," mL added"]})]}),t.jsxs("svg",{viewBox:"0 0 360 176",role:"img","aria-label":"Live endpoint signal curve with current volume marker",children:[[0,.25,.5,.75,1].map(w=>t.jsx("line",{x1:n.left,x2:360-n.right,y1:b(w),y2:b(w),className:"vtip-curve-grid"},w)),[0,10,20,30,40,50].filter(w=>w<=c).map(w=>t.jsx("text",{x:v(w),y:169,className:"vtip-curve-axis",textAnchor:"middle",children:w},w)),t.jsx("path",{d:k,className:"vtip-curve-path"}),t.jsx("line",{x1:v(a),x2:v(a),y1:n.top,y2:176-n.bottom,className:"vtip-current-line"}),i.map(w=>t.jsx("circle",{cx:v(w.titre),cy:b(he(e,w.titre,me(e))),r:"4",className:"vtip-concordant-dot"},w.label))]})]})}function Zt({trials:e,canCapture:a,captured:i}){var u;const r=Number.isFinite((u=e[0])==null?void 0:u.titre),o=e.filter(p=>!p.rough&&Number.isFinite(p.titre)).length,n=e.filter(p=>!p.rough&&p.accepted).length,c=[{label:"Rough",detail:r?"Rough titre recorded":"Find approximate endpoint",done:r},{label:"Accurate",detail:`${o}/3 accurate trials recorded`,done:o>=2},{label:"Concordant",detail:n>=2?"Two reliable titres found":"Need two controlled titres",done:a},{label:"Record",detail:i?"Sent to practical sheet":"Capture final data",done:i}];return t.jsx("div",{className:"vtip-workflow-rail","aria-label":"Titration progress",children:c.map((p,v)=>t.jsxs("div",{className:p.done?"done":"",children:[t.jsx("span",{children:v+1}),t.jsx("strong",{children:p.label}),t.jsx("small",{children:p.detail})]},p.label))})}function Jt({item:e,onCapture:a}){const[i,r]=m.useState(te[0].id),o=m.useMemo(()=>te.find(C=>C.id===i)||te[0],[i]),n=m.useMemo(()=>me(o),[o]),[c,u]=m.useState(()=>pe(o)),[p,v]=m.useState(0),[b,h]=m.useState(0),[y,k]=m.useState(0),[w,O]=m.useState(0),[B,I]=m.useState(0),[D,j]=m.useState(!1);m.useEffect(()=>{u(pe(o)),v(0),h(0),k(0),O(0),I(0),j(!1)},[o]);const P=c[p],l=(P==null?void 0:P.initial)??0,g=n>0?b/n:0,f=he(o,b,n),d=Gt(g,w,y),x=m.useMemo(()=>Vt(c),[c]),A=m.useMemo(()=>_t(x),[x]),M=m.useMemo(()=>qt(o,A),[o,A]),F=M*o.molarMass,W=x.length>=2,_=m.useCallback(C=>{j(!1),O(C);const L=ie(Z(b+C,0,z-l)),q=n>0&&L/n>=.9;C>.1&&q&&I(fe=>fe+1),h(L)},[l,b,n]),Y=m.useCallback(()=>{j(!1),k(C=>C+1)},[]),ne=m.useCallback(C=>{const L=c[C];v(C),h((L==null?void 0:L.titre)||0),k((L==null?void 0:L.swirls)||0),O(0),I((L==null?void 0:L.coarseEndpointAdds)||0)},[c]),ee=m.useCallback(()=>{var xe,we,Ce;const C=ie(b),L=ie(l+C),q=Ht({scenario:o,titre:C,target:n,swirls:y,rough:P.rough,lastStep:w,coarseEndpointAdds:B});if(j(!1),u(U=>U.map((je,Qe)=>Qe===p?{...je,final:L,titre:C,error:q.error,swirls:y,verdict:q.verdict,accepted:q.accepted,feedback:q.feedback,lastStep:w,coarseEndpointAdds:B}:je)),(P.rough||q.accepted)&&p<c.length-1){const U=p+1;v(U),h(((xe=c[U])==null?void 0:xe.titre)||0),k(((we=c[U])==null?void 0:we.swirls)||0),O(0),I(((Ce=c[U])==null?void 0:Ce.coarseEndpointAdds)||0)}},[p,B,l,P.rough,b,w,o,y,n,c]),se=m.useCallback(()=>{j(!1),u(C=>C.map((L,q)=>q===p?Dt(o,q):L)),h(0),k(0),O(0),I(0)},[p,o]),Ue=m.useCallback(()=>{W&&(a(Ut({scenario:o,trials:c,concordantTrials:x,meanTitre:A,calculatedM:M,strength:F,evidence:e.evidence})),j(!0))},[M,W,x,e.evidence,A,a,o,F,c]);return t.jsxs("section",{className:"coverage-conduct-block vtip-practical",children:[t.jsxs("header",{className:"vtip-header",children:[t.jsxs("div",{children:[t.jsxs("h3",{children:[t.jsx(We,{size:17,"aria-hidden":"true"}),"Interactive Volumetric Analysis"]}),t.jsx("p",{children:"Run rough and concordant trials, control the stopcock, watch the endpoint, then send clean data into the practical record."})]}),t.jsxs("span",{children:[t.jsx(ve,{size:15,"aria-hidden":"true"}),"Dedicated bench"]})]}),t.jsx(Zt,{trials:c,canCapture:W,captured:D}),t.jsxs("div",{className:"vtip-layout",children:[t.jsxs("aside",{className:"vtip-controls","aria-label":"Titration scenario and controls",children:[t.jsxs("div",{className:"vtip-control-group",children:[t.jsxs("p",{children:[t.jsx(qe,{size:15,"aria-hidden":"true"}),"Scenario"]}),t.jsx("div",{className:"vtip-scenario-list",children:te.map(C=>t.jsx(Qt,{scenario:C,active:C.id===o.id,onSelect:r},C.id))})]}),t.jsxs("div",{className:"vtip-control-group",children:[t.jsxs("p",{children:[t.jsx(ze,{size:15,"aria-hidden":"true"}),"Active trial"]}),t.jsx("div",{className:"vtip-trial-selector",role:"group","aria-label":"Select trial",children:c.map((C,L)=>t.jsx("button",{type:"button",className:`${p===L?"active":""} ${C.accepted?"accepted":""}`,"aria-pressed":p===L,onClick:()=>ne(L),children:C.label},C.label))})]}),t.jsxs("div",{className:"vtip-readout-stack",children:[t.jsxs("div",{children:[t.jsx("span",{children:"Burette initial"}),t.jsxs("strong",{children:[T(l,2)," mL"]})]}),t.jsxs("div",{children:[t.jsx("span",{children:"Volume delivered"}),t.jsxs("strong",{children:[T(b,2)," mL"]})]}),t.jsxs("div",{children:[t.jsx("span",{children:"Endpoint signal"}),t.jsxs("strong",{children:[T(f*100,0),"%"]})]}),t.jsxs("div",{children:[t.jsx("span",{children:"Swirls this trial"}),t.jsx("strong",{children:y})]}),t.jsxs("div",{children:[t.jsx("span",{children:"Coarse endpoint pours"}),t.jsx("strong",{children:B})]})]}),t.jsxs("div",{className:"vtip-actions","aria-label":"Titration actions",children:[t.jsxs("button",{type:"button",onClick:()=>_(2),disabled:b>=z-l,children:[t.jsx(rt,{size:15,"aria-hidden":"true"}),"Fast +2.00"]}),t.jsx("button",{type:"button",onClick:()=>_(.5),disabled:b>=z-l,children:"+0.50"}),t.jsx("button",{type:"button",onClick:()=>_(.1),disabled:b>=z-l,children:"+0.10"}),t.jsx("button",{type:"button",onClick:()=>_(.05),disabled:b>=z-l,children:"Half-drop"}),t.jsxs("button",{type:"button",onClick:Y,children:[t.jsx(ot,{size:15,"aria-hidden":"true"}),"Swirl"]}
7),t.jsx("button",{type:"button",onClick:se,children:"Reset trial"})]}),t.jsxs("button",{type:"button",className:"vtip-record-btn",onClick:ee,children:[t.jsx(de,{size:15,"aria-hidden":"true"}),"Record this trial"]})]}),t.jsxs("div",{className:"vtip-stage",children:[t.jsx("div",{className:"vtip-bench",children:t.jsx(Kt,{scenario:o,dispensed:b,currentInitial:l,progress:g})}),t.jsxs("div",{className:"vtip-coach","aria-live":"polite",children:[t.jsxs("div",{children:[t.jsx(ue,{size:16,"aria-hidden":"true"}),t.jsx("span",{children:d})]}),t.jsxs("small",{children:["Endpoint: ",o.endpoint,". Reaction ratio ",o.analyteCoeff,":",o.titrantCoeff,"."]})]})]}),t.jsxs("div",{className:"vtip-evidence",children:[t.jsx(Xt,{scenario:o,current:b,concordantTrials:x}),t.jsxs("div",{className:"vtip-summary",children:[t.jsxs("div",{children:[t.jsx("span",{children:"Concordant set"}),t.jsx("strong",{children:W?x.map(C=>C.label).join(", "):"Need 2 trials"})]}),t.jsxs("div",{children:[t.jsx("span",{children:"Mean titre"}),t.jsx("strong",{children:W?`${T(A,2)} mL`:"-"})]}),t.jsxs("div",{children:[t.jsx("span",{children:"Unknown molarity"}),t.jsx("strong",{children:W?`${T(M,4)} M`:"-"})]}),t.jsxs("div",{children:[t.jsx("span",{children:"Strength"}),t.jsx("strong",{children:W?`${T(F,2)} g L-1`:"-"})]})]}),t.jsx("div",{className:"vtip-table-wrap",children:t.jsxs("table",{className:"vtip-table",children:[t.jsx("thead",{children:t.jsxs("tr",{children:[t.jsx("th",{children:"Trial"}),t.jsx("th",{children:"Initial"}),t.jsx("th",{children:"Final"}),t.jsx("th",{children:"Titre"}),t.jsx("th",{children:"Feedback"})]})}),t.jsx("tbody",{children:c.map((C,L)=>t.jsxs("tr",{className:`${p===L?"active":""} ${C.accepted?"accepted":""}`,children:[t.jsx("th",{children:C.label}),t.jsx("td",{children:T(C.initial,2)}),t.jsx("td",{children:Number.isFinite(C.final)?T(C.final,2):"-"}),t.jsx("td",{children:Number.isFinite(C.titre)?T(C.titre,2):"-"}),t.jsxs("td",{children:[t.jsx("strong",{children:C.verdict}),C.feedback&&t.jsx("span",{children:C.feedback})]})]},C.label))})]})}),!W&&t.jsxs("div",{className:"vtip-warning",children:[t.jsx(Ge,{size:15,"aria-hidden":"true"}),t.jsxs("span",{children:["Record at least two non-rough trials within ",T(H,2)," mL before sending the result to the record sheet."]})]}),t.jsxs("button",{type:"button",className:"vtip-send-btn",onClick:Ue,disabled:!W,children:[t.jsx(de,{size:15,"aria-hidden":"true"}),D?"Sent to record":"Send concordant data to record"]})]})]}),t.jsxs("footer",{className:"vtip-formula",children:[t.jsx(He,{size:15,"aria-hidden":"true"}),t.jsx("span",{children:o.reaction}),t.jsx(J,{size:15,"aria-hidden":"true"}),t.jsx("span",{children:"M_unknown = M_titrant x V_titre x analyte coefficient / (V_aliquot x titrant coefficient)"})]})]})}const Ae=e=>e.reduce((a,i)=>{var r,o;return{...a,[i.id]:i.default??(i.type==="select"?(o=(r=i.options)==null?void 0:r[0])==null?void 0:o.value:i.min??0)}},{}),Yt=e=>`${e.value??""}${e.unit?` ${e.unit}`:""}`;function ea({graph:e}){var b;if(!((b=e==null?void 0:e.points)!=null&&b.length))return null;const a=e.points.map(h=>Number(h.y)).filter(h=>Number.isFinite(h)),i=e.points.map(h=>Number(h.x)).filter(h=>Number.isFinite(h)),r=Math.min(...a,0),o=Math.max(...a,1),n=Math.min(...i,0),c=Math.max(...i,1),u=o-r||1,p=c-n||1,v=e.points.map(h=>{const y=12+(Number(h.x)-n)/p*76,k=84-(Number(h.y)-r)/u*68;return`${y},${k}`}).join(" ");return t.jsxs("div",{className:"coverage-sim-graph","aria-label":`${e.yLabel} versus ${e.xLabel}`,children:[t.jsxs("div",{children:[t.jsx(st,{size:15,"aria-hidden":"true"}),t.jsxs("span",{children:[e.yLabel," vs ",e.xLabel]})]}),t.jsxs("svg",{viewBox:"0 0 100 100",role:"img","aria-label":`${e.yLabel} graph`,children:[t.jsx("line",{x1:"10",y1:"86",x2:"92",y2:"86"}),t.jsx("line",{x1:"10",y1:"12",x2:"10",y2:"86"}),t.jsx("polyline",{points:v}),e.points.map((h,y)=>{const k=12+(Number(h.x)-n)/p*76,w=84-(Number(h.y)-r)/u*68;return t.jsx("circle",{cx:k,cy:w,r:"2.4"},`${h.x}-${h.y}-${y}`)})]})]})}function ta({visual:e}){return t.jsxs("div",{className:`coverage-sim-visual visual-${(e==null?void 0:e.kind)||"generic"}`,children:[t.jsxs("div",{className:"coverage-sim-apparatus","aria-hidden":"true",children:[t.jsx("span",{className:"apparatus-node node-a"}),t.jsx("span",{className:"apparatus-node node-b"}),t.jsx("span",{className:"apparatus-node node-c"}),t.jsx("span",{className:"apparatus-trace trace-a"}),t.jsx("span",{className:"apparatus-trace trace-b"}),t.jsx("span",{className:"apparatus-meter",children:e==null?void 0:e.primary})]}),t.jsxs("div",{children:[t.jsx("p",{children:(e==null?void 0:e.title)||"Simulation"}),t.jsx("strong",{children:e==null?void 0:e.primary}),t.jsx("span",{children:e==null?void 0:e.secondary})]})]})}function aa({control:e,value:a,onChange:i}){return e.type==="select"?t.jsxs("label",{className:"coverage-sim-control",children:[t.jsx("span",{children:e.label}),t.jsx("select",{value:a,onChange:r=>i(e.id,r.target.value),children:e.options.map(r=>
7t.jsx("option",{value:r.value,children:r.label},r.value))})]}):t.jsxs("label",{className:"coverage-sim-control",children:[t.jsxs("span",{children:[e.label,t.jsxs("strong",{children:[a,e.unit?` ${e.unit}`:""]})]}),t.jsx("input",{type:"range",min:e.min,max:e.max,step:e.step,value:a,onChange:r=>i(e.id,Number(r.target.value))})]})}function ia({item:e,onCapture:a}){const i=m.useMemo(()=>Bt(e),[e]),[r,o]=m.useState(()=>Ae(i.controls)),[n,c]=m.useState(!1);m.useEffect(()=>{o(Ae(i.controls)),c(!1)},[i]);const u=m.useMemo(()=>i.run(r),[i,r]),p=(b,h)=>{c(!1),o(y=>({...y,[b]:h}))},v=()=>{var b;a({...u.capture,evidence:((b=u.capture)==null?void 0:b.evidence)||e.evidence}),c(!0)};return t.jsxs("section",{className:"coverage-conduct-block coverage-simulator",children:[t.jsxs("header",{className:"coverage-sim-header",children:[t.jsxs("div",{children:[t.jsxs("h3",{children:[t.jsx(We,{size:17,"aria-hidden":"true"}),"Live Simulation"]}),t.jsx("p",{children:i.description})]}),t.jsxs("span",{children:[t.jsx(ve,{size:15,"aria-hidden":"true"}),"Ready"]})]}),t.jsxs("div",{className:"coverage-sim-layout",children:[t.jsxs("div",{className:"coverage-sim-controls",children:[t.jsxs("p",{children:[t.jsx(qe,{size:15,"aria-hidden":"true"}),"Variables"]}),i.controls.map(b=>t.jsx(aa,{control:b,value:r[b.id],onChange:p},b.id))]}),t.jsxs("div",{className:"coverage-sim-stage",children:[t.jsx(ta,{visual:u.visual}),t.jsx("div",{className:"coverage-sim-readouts",children:u.readouts.map(b=>t.jsxs("div",{children:[t.jsx("span",{children:b.label}),t.jsx("strong",{children:Yt(b)})]},b.label))})]}),t.jsxs("div",{className:"coverage-sim-evidence",children:[t.jsxs("div",{className:"coverage-sim-evidence-head",children:[t.jsxs("p",{children:[t.jsx(nt,{size:15,"aria-hidden":"true"}),"Generated Reading"]}),t.jsxs("button",{type:"button",onClick:v,children:[t.jsx(de,{size:15,"aria-hidden":"true"}),n?"Captured":"Send to record"]})]}),u.table&&t.jsx("div",{className:"coverage-sim-table-wrap",children:t.jsxs("table",{className:"coverage-sim-table",children:[t.jsx("thead",{children:t.jsx("tr",{children:u.table.columns.map(b=>t.jsx("th",{children:b},b))})}),t.jsx("tbody",{children:u.table.rows.map((b,h)=>t.jsx("tr",{children:b.map((y,k)=>t.jsx("td",{children:y},`${y}-${k}`))},`${b[0]}-${h}`))})]})}),t.jsx(ea,{graph:u.graph}),t.jsxs("div",{className:"coverage-sim-note",children:[t.jsx(J,{size:15,"aria-hidden":"true"}),t.jsx("span",{children:"Use this generated reading to fill the observation table, then edit any values to match your classroom apparatus."})]})]})]})]})}function ra({item:e,onCapture:a}){return(e==null?void 0:e.id)==="chemistry-volumetric-calculation-engine"?t.jsx(Jt,{item:e,onCapture:a}):t.jsx(ia,{item:e,onCapture:a})}const K=(...e)=>e.filter(Boolean).join(" ");function oa({icon:e,eyebrow:a,title:i,subtitle:r,status:o,controls:n,actions:c,className:u="",headingAs:p="h2"}){return t.jsxs("header",{className:K("pragya-lab-workspace-bar",u),children:[t.jsxs("div",{className:"pragya-lab-workspace-identity",children:[e?t.jsx("span",{className:"pragya-lab-workspace-icon",children:t.jsx(e,{"aria-hidden":"true"})}):null,t.jsxs("div",{className:"pragya-lab-workspace-copy",children:[a?t.jsx("p",{className:"pragya-lab-workspace-eyebrow",children:a}):null,t.jsxs("div",{className:"pragya-lab-workspace-title-row",children:[t.jsx(p,{className:"pragya-lab-workspace-title",children:i}),o?t.jsx("span",{className:"pragya-lab-workspace-status",children:o}):null]}),r?t.jsx("p",{className:"pragya-lab-workspace-subtitle",children:r}):null]})]}),n?t.jsx("div",{className:"pragya-lab-workspace-controls",children:n}):null,c?t.jsx("div",{className:"pragya-lab-workspace-actions",children:c}):null]})}function na({icon:e,eyebrow:a,title:i,subtitle:r,controls:o,meta:n,actions:c,className:u="",headingAs:p="h2"}){return t.jsxs("header",{className:K("pragya-lab-context-bar",u),children:[t.jsxs("div",{className:"pragya-lab-context-identity",children:[e?t.jsx("span",{className:"pragya-lab-context-icon",children:t.jsx(e,{"aria-hidden":"true"})}):null,t.jsxs("div",{className:"pragya-lab-context-copy",children:[a?t.jsx("p",{className:"pragya-lab-context-eyebrow",children:a}):null,t.jsx(p,{className:"pragya-lab-context-title",children:i}),r?t.jsx("p",{className:"pragya-lab-context-subtitle",children:r}):null]})]}),o||n||c?t.jsxs("div",{className:"pragya-lab-context-tools",children:[o?t.jsx("div",{className:"pragya-lab-context-control
7s",children:o}):null,n?t.jsx("div",{className:"pragya-lab-context-meta",children:n}):null,c?t.jsx("div",{className:"pragya-lab-context-actions",children:c}):null]}):null]})}function ni({children:e,className:a="",as:i="div",ariaLabel:r,...o}){return t.jsx(i,{className:K("pragya-lab-tool-strip",a),"aria-label":r,...o,children:e})}function sa({children:e,ariaLabel:a,className:i="",role:r="group",as:o="div",...n}){return t.jsx(o,{className:K("pragya-lab-modes",i),role:r,"aria-label":a,...n,children:e})}function la({active:e=!1,icon:a,iconClassName:i="",label:r,description:o,children:n,className:c="",...u}){return t.jsxs("button",{type:"button",className:K("pragya-lab-mode",e&&"active is-active",c),...u,children:[a?i?t.jsx("span",{className:i,children:t.jsx(a,{"aria-hidden":"true"})}):t.jsx(a,{"aria-hidden":"true"}):null,t.jsxs("span",{className:"pragya-lab-mode-copy",children:[t.jsx("strong",{children:r||n}),o?t.jsx("small",{children:o}):null]})]})}function ca({children:e,tone:a="neutral",className:i="",...r}){return t.jsx("span",{className:K("pragya-lab-status",`is-${a}`,i),...r,children:e})}const be="all",ge="all",da=[{id:be,label:"All states"},...Object.entries(oe).map(([e,a])=>({id:e,label:a.label}))],Me=e=>e.toLowerCase().trim(),ua=(e,a,i)=>a==="all"&&i==="all"?!0:e.boards.some(r=>{const o=a==="all"||r.board===a,n=i==="all"||r.grades.includes(i);return o&&n}),pa=e=>{const a=e.board.toUpperCase(),i=e.grades.map(r=>`Class ${r}`).join(", ");return`${a} ${i}`},ma=e=>e.length===1?e[0]:ge,Oe=(e,a)=>{var i,r;return{board:((i=e.boards[0])==null?void 0:i.board)||"cbse",grade:((r=e.boards[0])==null?void 0:r.grades[0])||"10",prelabAnswers:a.prelabQuestions.map(o=>({question:o,answer:""})),procedureDone:a.procedure.map(()=>!1),observations:a.observationFields.map(o=>({label:o,value:""})),tableRows:a.table?a.table.rows.map(o=>({row:o,values:a.table.columns.reduce((n,c)=>({...n,[c]:""}),{})})):[],analysisAnswers:a.analysisPrompts.map(o=>({prompt:o,answer:""})),inference:"",precautions:"",vivaNotes:"",evidence:e.evidence.reduce((o,n)=>({...o,[n]:!1}),{})}};function ha({subjects:e=Object.keys(X),title:a="Board Practical Bank",subtitle:i="Syllabus-linked practicals, activities and project workflows"}){const r=m.useMemo(()=>e.filter(j=>X[j]),[e]),[o,n]=m.useState(ma(r)),[c,u]=m.useState("all"),[p,v]=m.useState("all"),[b,h]=m.useState(be),[y,k]=m.useState(""),[w,O]=m.useState(null),B=m.useMemo(()=>r.length<=1?[]:[{id:ge,label:"All subjects"},...r.map(j=>({id:j,label:X[j].label}))],[r]),I=m.useMemo(()=>{const j=Me(y);return At.filter(P=>!r.includes(P.subject)||o!==ge&&P.subject!==o||b!==be&&P.coverage!==b||!ua(P,c,p)?!1:j?Me([P.title,P.aim,P.mode,P.subject,...P.workflow,...P.evidence].join(" ")).includes(j):!0)},[r,c,p,y,b,o]),D=m.useMemo(()=>{const j={total:I.length};return Object.keys(oe).forEach(P=>{j[P]=I.filter(l=>l.coverage===P).length}),j},[I]);return t.jsxs("section",{className:"board-practical-coverage","aria-label":a,children:[t.jsx(na,{className:"coverage-head practical-bank-context-bar",icon:re,eyebrow:"Practical coverage",title:a,subtitle:i,meta:t.jsxs(ca,{className:"coverage-score","aria-label":`${D.total} workflows shown`,children:[t.jsx("strong",{children:D.total}),t.jsx("span",{children:"workflows"})]})}),t.jsxs("div",{className:"coverage-toolbar",children:[B.length>0&&t.jsx(ae,{label:"Subject",options:B,value:o,onChange:n}),t.jsx(ae,{label:"Board",options:Pt,value:c,onChange:u}),t.jsx(ae,{label:"Grade",options:Tt,value:p,onChange:v}),t.jsx(ae,{label:"State",options:da,value:b,onChange:h})]}),t.jsxs("div",{className:"coverage-search-row",children:[t.jsxs("label",{className:"coverage-search",children:[t.jsx(Xe,{size:16,"aria-hidden":"true"}),t.jsx("span",{className:"sr-only",children:"Search practicals"}),t.jsx("input",{value:y,onChange:j=>k(j.target.value),placeholder:"Search practicals, reports, instruments..."})]}),t.jsx("div",{className:"coverage-state-summary",children:Object.entries(oe).map(([j,P])=>t.jsxs("span",{className:`coverage-count coverage-count-${j}`,children:[P.label,": ",D[j]||0]},j))})]}),I.length===0?t.jsxs("div",{className:"coverage-empty",children:[t.jsx(lt,{size:18,"aria-hidden":"true"}),t.jsx("span",{children:"No practical workflows match these filters."})]}):t.jsx("div",{className:"coverage-grid",children:I.map(j=>t.jsx(ba,{item:j,onConduct:()=>O(j)},j.id))}),w&&t.jsx(ya,{item:w,onClose:()=>O(null)})]})}function ae({label:e,options:a,value:i,onChange:r}){return t.jsxs("div",{className:"coverage-chip-group",role:"group","aria-label":e,children:[t.jsx("span",{children:e}),t.jsx("div",{children:a.map(o=>t.jsx("button",{type:"button",className:i===o.id?"active":"",onClick:()=>r(o.id),children:o.label},o.id))})]})}function ba({item:e,onConduct:a}){const i=X[e.subject],r=oe[e.coverage];return t.jsxs("article",{className:`coverage-card tone-${i.tone}`,children:[t.jsxs("div",{className:"coverage-card-top",children:[t.jsx("span",{className:`coverage-state coverage-state-${e.coverage}`,children:r.label}),t.jsxs("span",{className:"coverage-mode",children:[t.jsx(ze,{size:14,"aria-hidden":"true"}),e.mode]})]}),t.jsxs("div",{className:"coverage-card-title",children:[t.jsx(J,{size:18,"aria-hidden":"true"}),t.jsxs("div",{children:[t.jsx("p",{children:i.label}),t.jsx("h3",{children:e.title})]})]}),t.jsx("div",{className:"coverage-board-tags",children:e.boards.map(o=>t.jsx("span",{children:pa(o)},`${e.id}-${o.board}-${o.grades.join("-")}`))}),t.jsx("p",{className:"coverage-aim",children:e.aim}),t.jsxs("div",{className:"coverage-card-section",children:[t.jsxs("h4",{children:[t.jsx(Ve,{size:15,"aria-hidden":"true"}),"Workflow"]}),t.jsx("ol",{children:e.workflow.map(o=>t.jsx("li",{children:o},o))})]}),t.jsx("div",{className:"coverage-evidence",children:e.evidence.map(o=>t.jsx("span",{children:o},o))}),t.jsxs("div",{className:"coverage-card-actions",children:[t.jsxs("button",{type:"button",className:"coverage-conduct-btn",onClick:a,children:[t.jsx(ct,{size:15,"aria-hidden":"true"}),"Conduct Practical"]}),e.launchPath&&t.jsxs("a",{className:"coverage-open-link",href:e.launchPath,children:[e.launchLabel||"Open lab",t.jsx(De,{size:15,"aria-hidden":"true"})]})]})]})}const le=(e,a="value")=>e.filter(i=>{var r;return(r=i[a])==null?void 0:r.trim()}).length,ga=(e,a)=>{const i=[le(e.prelabAnswers,"answer"),e.procedureDone.filter(Boolean).length,le(e.observations),le(e.analysisAnswers,"answer"),e.inference.trim()?1:0,e.precautions.trim()?1:0,Object.values(e.evidence).filter(
7Boolean).length].reduce((o,n)=>o+n,0),r=[a.prelabQuestions.length,a.procedure.length,a.observationFields.length,a.analysisPrompts.length,1,1,Object.keys(e.evidence).length].reduce((o,n)=>o+n,0);return r===0?0:Math.round(i/r*100)},va=(e,a,i,r)=>{const o=r.observations.map(p=>`- ${p.label}: ${p.value||"[not filled]"}`).join(` 8`),n=r.analysisAnswers.map(p=>`- ${p.prompt}: ${p.answer||"[not filled]"}`).join(` 9`),c=Object.entries(r.evidence).map(([p,v])=>`- ${v?"[x]":"[ ]"} ${p}`).join(` 10`),u=r.tableRows.length>0?r.tableRows.map(p=>{var b;const v=(((b=i.table)==null?void 0:b.columns)||[]).map(h=>`${h}: ${p.values[h]||"[not filled]"}`).join("; ");return`- ${p.row}: ${v}`}).join(` 11`):"";return[`${a.label} Practical Record`,`Title: ${e.title}`,`Board/Class: ${r.board.toUpperCase()} Class ${r.grade}`,`Aim: ${e.aim}`,"",`Principle: ${i.concept}`,"","Observations:",o||"- [not filled]",u?` 12Observation table:`:"",u,"","Analysis:",n||"- [not filled]","",`Inference/Result: ${r.inference||"[not filled]"}`,`Precautions/Sources of error: ${r.precautions||"[not filled]"}`,"","Evidence checklist:",c,"",`Viva notes: ${r.vivaNotes||"[not filled]"}`].join(` 13`)};function ya({item:e,onClose:a}){const i=X[e.subject],r=m.useMemo(()=>Ft(e),[e]),[o,n]=m.useState(()=>Oe(e,r)),[c,u]=m.useState(!1);m.useEffect(()=>{n(Oe(e,r))},[r,e]),m.useEffect(()=>{const l=g=>{g.key==="Escape"&&a()};return window.addEventListener("keydown",l),()=>window.removeEventListener("keydown",l)},[a]);const p=e.boards.find(l=>l.board===o.board)||e.boards[0],v=Object.values(o.evidence).filter(Boolean).length,b=e.evidence.length,h=ga(o,r),y=m.useMemo(()=>va(e,i,r,o),[r,e,o,i]),k=(l,g)=>{n(f=>({...f,prelabAnswers:f.prelabAnswers.map((d,x)=>x===l?{...d,answer:g}:d)}))},w=l=>{n(g=>({...g,procedureDone:g.procedureDone.map((f,d)=>d===l?!f:f)}))},O=(l,g)=>{n(f=>({...f,observations:f.observations.map((d,x)=>x===l?{...d,value:g}:d)}))},B=(l,g,f)=>{n(d=>({...d,tableRows:d.tableRows.map((x,A)=>A===l?{...x,values:{...x.values,[g]:f}}:x)}))},I=(l,g)=>{n(f=>({...f,analysisAnswers:f.analysisAnswers.map((d,x)=>x===l?{...d,answer:g}:d)}))},D=(l,g)=>{n(f=>({...f,evidence:{...f.evidence,[l]:g}}))},j=l=>{n(g=>{const f=l.observations||[],d=l.analysis||[],x=l.tableRows||[],A=l.evidence||[];return{...g,observations:g.observations.map((M,F)=>f[F]?{...M,value:f[F]}:M),tableRows:g.tableRows.map((M,F)=>{var Y;const W=x[F];if(!W)return M;const _=(((Y=r.table)==null?void 0:Y.columns)||[]).reduce((ne,ee,se)=>({...ne,[ee]:W[se]??M.values[ee]??""}),{});return{...M,values:_}}),analysisAnswers:g.analysisAnswers.map((M,F)=>d[F]?{...M,answer:d[F]}:M),inference:l.inference||g.inference,precautions:l.precautions||g.precautions,evidence:A.reduce((M,F)=>Object.prototype.hasOwnProperty.call(M,F)?{...M,[F]:!0}:M,g.evidence)}})},P=async()=>{navigator.clipboard&&(await navigator.clipboard.writeText(y),u(!0),window.setTimeout(()=>u(!1),1800))};return t.jsx("div",{className:"coverage-conduct-overlay",role:"presentation",children:t.jsxs("div",{className:"coverage-conduct-panel",role:"dialog","aria-modal":"true","aria-labelledby":"conduct-panel-title",children:[t.jsxs("header",{className:"coverage-conduct-header",children:[t.jsxs("div",{className:"coverage-conduct-title",children:[t.jsxs("p",{className:"coverage-kicker",children:[t.jsx(dt,{size:16,"aria-hidden":"true"}),"Conduct practical"]}),t.jsx("h2",{id:"conduct-panel-title",children:e.title}),t.jsxs("p",{className:"coverage-conduct-subtitle",children:[i.label," practical record for ",o.board.toUpperCase()," Class ",o.grade]})]}),t.jsxs("div",{className:"coverage-conduct-header-actions",children:[t.jsxs("div",{className:"coverage-progress","aria-label":`${h}% practical record complete`,children:[t.jsxs("span",{children:[t.jsxs("strong",{children:[h,"%"]})," complete"]}),t.jsx("div",{children:t.jsx("i",{style:{width:`${h}%`}})})]}),t.jsxs("button",{type:"button",className:"coverage-copy-button",onClick:P,children:[t.jsx(Ze,{size:15,"aria-hidden":"true"}),c?"Copied":"Copy record"]})]}),t.jsx("button",{type:"button",className:"coverage-icon-button",onClick:a,"aria-label":"Close practical record",children:t.jsx(Je,{size:18,"aria-hidden":"true"})})]}),t.jsx("div",{className:"coverage-lab-route","aria-label":"Practical flow",children:["Learn","Set up","Conduct","Record","Analyse","Submit"].map((l,g)=>t.jsx("span",{className:h>=g*18?"active":"",children:l},l))}),t.jsxs("div",{className:"coverage-conduct-body",children:[t.jsxs("aside",{className:"coverage-conduct-side",children:[t.jsxs("section",{children:[t.jsx("h3",{children:"Class Context"}),t.jsxs("label",{children:["Board",t.jsx("select",{value:o.board,onChange:l=>{const g=e.boards.find(f=>f.board===l.target.value);n(f=>({...f,board:l.target.value,grade:(g==null?void 0:g.grades[0])||f.grade}))},children:e.boards.map(l=>t.jsx("option",{value:l.board,children:l.board.toUpperCase()},l.board))})]}),t.jsxs("label",{children:["Class",t.jsx("select",{value:o.grade,onCh
13ange:l=>n(g=>({...g,grade:l.target.value})),children:((p==null?void 0:p.grades)||[]).map(l=>t.jsxs("option",{value:l,children:["Class ",l]},l))})]})]}),t.jsxs("section",{children:[t.jsxs("h3",{children:[t.jsx(Ye,{size:15,"aria-hidden":"true"}),"Understand First"]}),t.jsx("p",{className:"coverage-side-note",children:r.concept}),t.jsx("div",{className:"coverage-mini-tags",children:r.keyTerms.map(l=>t.jsx("span",{children:l},l))})]}),t.jsxs("section",{children:[t.jsxs("h3",{children:[t.jsx(ue,{size:15,"aria-hidden":"true"}),"Success Criteria"]}),t.jsx("ul",{children:r.successCriteria.map(l=>t.jsx("li",{children:l},l))})]}),t.jsxs("section",{children:[t.jsxs("h3",{children:[t.jsx(ke,{size:15,"aria-hidden":"true"}),"Materials"]}),t.jsx("ul",{children:r.materials.map(l=>t.jsx("li",{children:l},l))})]}),t.jsxs("section",{children:[t.jsxs("h3",{children:[t.jsx(Rt,{size:15,"aria-hidden":"true"}),"Safety"]}),t.jsx("ul",{children:r.safety.map(l=>t.jsx("li",{children:l},l))})]}),e.launchPath&&t.jsxs("a",{className:"coverage-open-link",href:e.launchPath,children:["Use simulator/workbench",t.jsx(De,{size:15,"aria-hidden":"true"})]})]}),t.jsxs("main",{className:"coverage-conduct-main",children:[t.jsxs("section",{className:"coverage-conduct-brief","aria-label":"Practical brief",children:[t.jsxs("div",{className:"coverage-brief-primary",children:[t.jsxs("span",{children:[t.jsx(ut,{size:16,"aria-hidden":"true"}),"Aim"]}),t.jsx("p",{children:e.aim})]}),t.jsxs("div",{children:[t.jsx("span",{children:"Record"}),t.jsxs("strong",{children:[o.board.toUpperCase()," Class ",o.grade]}),t.jsx("small",{children:i.label})]}),t.jsxs("div",{children:[t.jsx("span",{children:"Evidence"}),t.jsxs("strong",{children:[v,"/",b]}),t.jsx("small",{children:"items checked"})]})]}),t.jsx(ra,{item:e,onCapture:j}),t.jsxs("section",{className:"coverage-conduct-block coverage-prelab-block",children:[t.jsxs("h3",{children:[t.jsx(pt,{size:17,"aria-hidden":"true"}),"Before You Start"]}),t.jsx("div",{className:"coverage-prelab-grid",children:r.prelabQuestions.map((l,g)=>{var f;return t.jsxs("label",{children:[l,t.jsx("textarea",{value:((f=o.prelabAnswers[g])==null?void 0:f.answer)||"",onChange:d=>k(g,d.target.value),placeholder:"Answer in one or two lines before you begin.",rows:2})]},l)})})]}),t.jsxs("section",{className:"coverage-conduct-block coverage-setup-block",children:[t.jsxs("h3",{children:[t.jsx(ke,{size:17,"aria-hidden":"true"}),"Apparatus Setup"]}),t.jsx("ol",{className:"coverage-setup-list",children:r.setup.map(l=>t.jsx("li",{children:l},l))})]}),t.jsxs("section",{className:"coverage-conduct-block coverage-procedure-block",children:[t.jsxs("h3",{children:[t.jsx(Ve,{size:17,"aria-hidden":"true"}),"Procedure"]}),t.jsx("div",{className:"coverage-procedure-steps",children:r.procedure.map((l,g)=>t.jsxs("label",{className:o.procedureDone[g]?"done":"",children:[t.jsx("input",{type:"checkbox",checked:o.procedureDone[g]||!1,onChange:()=>w(g)}),t.jsxs("span",{children:[t.jsx("strong",{children:l.step}),t.jsx("em",{children:l.why})]})]},`${l.step}-${g}`))})]}),t.jsxs("section",{className:"coverage-conduct-block coverage-observation-block",children:[t.jsxs("h3",{children:[t.jsx(re,{size:17,"aria-hidden":"true"}),"Observation Notes"]}),t.jsx("div",{className:"coverage-observation-list",children:o.observations.map((l,g)=>t.jsxs("label",{children:[l.label,t.jsx("textarea",{value:l.value,onChange:f=>O(g,f.target.value),placeholder:"Write the observed reading, colour change, graph result, diagram note or deduction...",rows:2})]},l.label))})]}),r.table&&o.tableRows.length>0&&t.jsxs("section",{className:"coverage-conduct-block coverage-table-block",children:[t.jsxs("h3",{children:[t.jsx(mt,{size:17,"aria-hidden":"true"}),"Observation Table"]}),t.jsx("div",{className:"coverage-table-wrap",children:t.jsxs("table",{className:"coverage-entry-table",children:[t.jsx("thead",{children:t.jsxs("tr",{children:[t.jsx("th",{children:"Row"}),r.table.columns.map(l=>t.jsx("th",{children:l},l))]})}),t.jsx("tbody",{children:o.tableRows.map((l,g)=>t.jsxs("tr",{children:[t.jsx("th",{children:l.row}),r.table.columns.map(f=>t.jsx("td",{children:t.jsx("input",{value:l.values[f]||"",onChange:d=>B(g,f,d.target.value),"aria-label":`${l.row} ${f}`})},f))]},l.row))})]})})]}),t.jsxs("section",{className:"coverage-conduct-block coverage-analysis-block",children:[t.jsxs("h3",{children:[t.jsx(ht,{size:17,"aria-hidden":"true"}),"Analysis and Calculations"]}),t.jsx("div",{className:"coverage-analysis-list",children:o.analysisAnswers.map((l,g)=>t.jsxs("label",{children:[l.prompt,t.jsx("textarea",{value:l.answer,onChange:f=>I(g,f.target.value),placeholder:"Show formula, substitution, graph interpretation or reasoning.",rows:2})]},l.prompt))})]}),t.jsxs("section",{className:"coverage-conduct-two-col",children:[t.jsxs("label",{children:["Inference / Result",t.jsx("textarea",{value:o.inference,onChange:l=>n(g=>({...g,inference:l.target.value})),placeholder:"State the final inference with the evidence that supports it.",rows:4})]}
13),t.jsxs("label",{children:["Precautions / Sources of Error",t.jsx("textarea",{value:o.precautions,onChange:l=>n(g=>({...g,precautions:l.target.value})),placeholder:"Add safety, accuracy and control-variable notes.",rows:4})]})]}),t.jsxs("section",{className:"coverage-conduct-block coverage-outcome-block",children:[t.jsxs("h3",{children:[t.jsx(ue,{size:17,"aria-hidden":"true"}),"Expected Outcome"]}),t.jsx("p",{children:r.expectedOutcome})]}),t.jsxs("section",{className:"coverage-conduct-block coverage-mistakes-block",children:[t.jsxs("h3",{children:[t.jsx(Ge,{size:17,"aria-hidden":"true"}),"Common Mistakes to Avoid"]}),t.jsx("ul",{className:"coverage-compact-list",children:r.commonMistakes.map(l=>t.jsx("li",{children:l},l))})]}),t.jsxs("section",{className:"coverage-conduct-block coverage-evidence-block",children:[t.jsxs("h3",{children:[t.jsx(ve,{size:17,"aria-hidden":"true"}),"Evidence Checklist",t.jsxs("span",{children:[v,"/",b]})]}),t.jsx("div",{className:"coverage-evidence-checks",children:e.evidence.map(l=>t.jsxs("label",{children:[t.jsx("input",{type:"checkbox",checked:o.evidence[l]||!1,onChange:g=>D(l,g.target.checked)}),l]},l))})]}),t.jsxs("section",{className:"coverage-conduct-block coverage-viva-block",children:[t.jsxs("h3",{children:[t.jsx(bt,{size:17,"aria-hidden":"true"}),"Viva Practice"]}),t.jsx("div",{className:"coverage-viva-grid",children:r.vivaQuestions.map(l=>t.jsx("span",{children:l},l))}),t.jsxs("label",{className:"coverage-notes-field",children:["Viva notes",t.jsx("textarea",{value:o.vivaNotes,onChange:l=>n(g=>({...g,vivaNotes:l.target.value})),placeholder:"Write short answers or teacher feedback here.",rows:3})]})]}),t.jsxs("section",{className:"coverage-conduct-block coverage-rubric-block",children:[t.jsxs("h3",{children:[t.jsx(re,{size:17,"aria-hidden":"true"}),"Assessment Rubric"]}),t.jsx("ul",{className:"coverage-compact-list",children:r.rubric.map(l=>t.jsx("li",{children:l},l))})]}),t.jsxs("section",{className:"coverage-report-preview",children:[t.jsxs("h3",{children:[t.jsx(gt,{size:17,"aria-hidden":"true"}),"Teacher-Ready Record"]}),t.jsxs("p",{children:[t.jsx("strong",{children:"Title:"})," ",e.title]}),t.jsxs("p",{children:[t.jsx("strong",{children:"Aim:"})," ",e.aim]}),t.jsxs("p",{children:[t.jsx("strong",{children:"Inference:"})," ",o.inference||"Complete after observations are recorded."]}),t.jsx("pre",{children:y})]})]})]})]})})}const _e=m.createContext(!0),si=()=>m.useContext(_e),fa=m.lazy(()=>V(()=>import("./VirtualChemistryLab-BRMlLSpf.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50]))),xa=m.lazy(()=>V(()=>import("./AtomicStudio-CLRAl_ID.js"),__vite__mapDeps([51,1,2,52,53,44,11,28,29,26,9,10,24,20,15,30,14,31,32,33,34,7,35,36,37,8,38,39,16,40,41,42,43,45,46,47,48,54]))),wa=m.lazy(()=>V(()=>import("./BiologyLab-C0OgkKFh.js"),__vite__mapDeps([55,1,2,56,57,58,59,60,26,61,62,45,10,11,6,7,8,9,12,13,14,15,16,17,36,30,31,63,38,64,65,66,28,33,67,18,68,69,70,43,71,29,24,20,32,34,35,37,39,40,41,42,44,46,47,48,72]))),Ca=m.lazy(()=>V(()=>import("./VirtualPhysicsLab-D94Tecx6.js"),__vite__mapDeps([73,1,2,18,3,4,5,74,75,76,77,78,50,6,7,8,9,10,11,12,13,14,15,16,17,44,43,79,80,25,81,31,82,83,26,84,85,22,23,39,28,29,24,20,30,32,33,34,35,36,37,38,40,41,42,45,46,47,48,86]))),ja=m.lazy(()=>V(()=>import("./MathLab-BM-CPqyu.js").then(e=>e.M),__vite__mapDeps([87,1,2,31,88]))),ka=m.lazy(()=>V(()=>import("./CodingLab-DB9MwVTI.js"),__vite__mapDeps([89,1,2,90,91,92,93,94,95,61,96,6,7,8,9,10,11,12,13,14,15,16,17,67,18,97,81,98,33,99,30,28,45,100,84,37,101,102,26,103,68,104,85,29,24,20,31,32,34,35,36,38,39,40,41,42,43,44,46,47,48,105]))),Sa=m.lazy(()=>V(()=>import("./index-DK-k4PS4.js"),__vite__mapDeps([106,1,2,18,3,67,69,70,4,5,107,108,109,110,6,7,8,9,10,11,12,13,14,15,16,17,37,43,93,80,111,30,28,39,112,113,114,115,116,117,118,119,35,120,24,31,29,26,20,32,33,34,36,38,40,41,42,44,45,46,47,48,121,50]))),ye=[{id:"physics",label:"Physics",icon:wt,tone:"blue",features:["physics_lab"],description:"Run guided experiments across the core physics topics.",inside:"51 experiments · 6 topics (me
13chanics â thermodynamics)"},{id:"chemistry",label:"Chemistry",icon:J,tone:"amber",features:["chemistry_lab","atomic_studio"],description:"Mix reagents, run practicals and build molecules in 3D.",inside:"47 reactions · practical simulators · 3D molecule builder",subtabs:[{id:"reactions",label:"Reactions Lab",icon:He,feature:"chemistry_lab"},{id:"practicals",label:"Practicals",icon:re,feature:"chemistry_lab"},{id:"molecular",label:"Molecular Lab",icon:Ct,feature:"atomic_studio"}]},{id:"biology",label:"Biology",icon:jt,tone:"green",features:["biology_lab"],description:"Microscopy, life processes, genetics, ecology and anatomy.",inside:"5 labs · microscopy, processes, genetics, ecology, anatomy"},{id:"math",label:"Math",icon:kt,tone:"indigo",features:["math_geometry","math_graphing","math_data"],description:"Geometry constructions, function graphing and data tools.",inside:"Geometry · Functions · Data Lab · Board Bank"},{id:"coding",label:"Coding",icon:St,tone:"slate",features:["coding_lab"],description:"Learn and run Python right in the browser.",inside:"40 exercises · 16 lessons · live Python runtime"},{id:"electronics",label:"Electronics",icon:$t,tone:"slate",features:["electronics_lab"],description:"Build circuits and explore components on a virtual bench.",inside:"18 experiments · DC, Kirchhoff, practical, semiconductor"}],Le=ye.reduce((e,a)=>({...e,[a.id]:a}),{}),$a=ye.map(e=>e.id),Fe={chemistry:"geometry",biology:"life",physics:"brand",math:"number",coding:"dissect",electronics:"calculus"},Ie=(e,a,i)=>{if(!e.length)return null;const r=Math.max(0,e.indexOf(a));switch(i){case"ArrowRight":case"ArrowDown":return e[(r+1)%e.length];case"ArrowLeft":case"ArrowUp":return e[(r-1+e.length)%e.length];case"Home":return e[0];case"End":return e[e.length-1];default:return null}},Ee=e=>{typeof window>"u"||typeof document>"u"||window.requestAnimationFrame(()=>{var a;(a=document.getElementById(e))==null||a.focus()})},Be=["chemistry","biology","physics"],ce=(e,a)=>{let i=e.get("tab");const r=e.get("scienceTab");i==="science"?Be.includes(r)?i=r:e.has("biologyTab")||e.has("bioTab")?i="biology":i="chemistry":Be.includes(r)&&(i=r),$a.includes(i)||(i=null);const o=e.get("sub")||e.get("subtab")||null;return{tab:i&&a.includes(i)?i:a[0]||null,sub:o}};function Na(){const{isDark:e}=et(),{isEnabled:a,isAnyEnabled:i,loading:r}=tt(),[o]=at(),n=it(),c=m.useMemo(()=>ye.filter(d=>i(d.features)),[i]),u=m.useMemo(()=>c.map(d=>d.id),[c]),p=m.useMemo(()=>(Le.chemistry.subtabs||[]).filter(d=>a(d.feature)),[a]),v=m.useMemo(()=>p.map(d=>d.id),[p]),b=m.useMemo(()=>ce(o,u),[]),[h,y]=m.useState(b.tab),[k,w]=m.useState(v.includes(b.sub)?b.sub:v[0]||"reactions"),[O,B]=m.useState(()=>new Set(b.tab?[b.tab]:[])),I=m.useRef(h);I.current=h;const D=m.useRef(o);D.current=o;const j=m.useCallback(d=>{B(x=>x.has(d)?x:new Set([...x,d]))},[]);m.useEffect(()=>{if(!(r||c.length===0)&&!u.includes(h)){const d=u[0];y(d),j(d)}},[h,u,r,c.length,j]),m.useEffect(()=>{r||p.length>0&&!v.includes(k)&&w(p[0].id)},[k,v,p,r]),m.useEffect(()=>{!r&&h&&j(h)},[r]),m.useEffect(()=>{if(r)return;const d=ce(o,u);d.tab&&d.tab!==I.current&&(y(d.tab),j(d.tab)),d.tab==="chemistry"&&d.sub&&v.includes(d.sub)&&w(x=>x===d.sub?x:d.sub)},[o,u,r,v,j]),m.useEffect(()=>{if(r||!h)return;const d=D.current,x=ce(d,u),A=d.get("tab")==="coverage"||d.get("scienceTab")==="coverage",M=h!=="chemistry"||(d.get("sub")||v[0])===k;if(x.tab===h&&M&&!A)return;const F=new URLSearchParams(d);["scienceTab","subtab","biologyTab","bioTab","mathTab","electronicsTab"].forEach(W=>F.delete(W)),F.set("tab",h),h==="chemistry"?F.set("sub",k):F.delete("sub"),n(`/labs?${F.toString()}`,{replace:!0})},[h,k,v,u,r,n]);const P=m.useCallback((d,{sub:x,scroll:A=!1}={})=>{if(u.includes(d)&&(y(d),j(d),d==="chemistry"&&x&&v.includes(x)&&w(x),A&&typeof document<"u")){const M=document.getElementById("labs-hub-panels");M&&M.scrollIntoView({behavior:"smooth",block:"start"})}},[u,v,j]),l=m.useCallback((d,x)=>{const A=Ie(u,x,d.key);A&&(d.preventDefault(),P(A),Ee(`labtab-${A}`))},[u,P]),g=m.useCallback(d=>{v.includes(d)&&w(d)},[v]),f=m.useCallback((d,x)=>{const A=Ie(v,x,d.key);A&&(d.preventDefault(),g(A),Ee(`labsubtab-${A}`))},[v,g]);return t.jsxs(vt,{className:`labs-hub ${e?"dark":""}`,children:[t.jsx(yt,{icon:J,title:"Labs",subtitle:(Le[h]||{}).description||"Interactive experiments and explorations",tone:Fe[h]||"brand",controls:t.jsx(ft,{role:"tablist",ariaLabel:"Labs",children:c.map(d=>{const x=d.icon;return t.jsx(xt,{id:`labtab-${d.id}`,role:"tab",active:h===d.id,tone:Fe[d.id]||"brand",icon:x,"aria-selected":h===d.id,"aria-controls":O.has(d.id)?`labpanel-${d.id}`:void 0,tabIndex:h===d.id?0:-1,onClick:()=>P(d.id),onKeyDown:A=>l(A,d.id),children:d.label},d.id)})})}),t.jsx("div",{className:"labs-hub-content",children:r?t.jsxs("div",{className:"labs-hub-loader",role:"status","aria-live":"polite",children:[t.jsx("div",{className:"loader-spinner"}),t.jsx("p",{children:"Loading labs..."})]}):c.length===0?t.jsx("div",{className:"no-labs-message",children:t.jsx("p",{children:"No labs are currently available."})}):t.jsx(t.Fragment,{children:t.jsx("div",{id:"labs-hub-panels",className:"labs-hub-panels",children:t.jsxs(m.Suspense,{fallback:t.jsx(Ra,{}),children:[O.has("chemistry")&&u.includes("chemistry")&&t.jsx(Q,{id:"chemistry",activeTab:h,children:t.jsxs("div",{className:"labs-chem",children:[p.length>0&&t.jsx(oa,{className:"chemistry-suite-workspace-bar",icon:(p.find(d=>d.id===k)||p[0]).icon,eyebrow:"Chemistry Lab",title:"Chemistry workbench",subtitle:"Cho
13ose a bench, practical workflow or molecular model.",controls:p.length>1?t.jsx(sa,{className:"labs-subtabs",role:"tablist",ariaLabel:"Chemistry labs",children:p.map(d=>t.jsx(la,{id:`labsubtab-${d.id}`,role:"tab",active:k===d.id,icon:d.icon,label:d.label,"aria-selected":k===d.id,"aria-controls":`labsubpanel-${d.id}`,tabIndex:k===d.id?0:-1,className:"labs-subtab",onClick:()=>g(d.id),onKeyDown:x=>f(x,d.id)},d.id))}):null}),v.includes("reactions")&&t.jsx("div",{id:"labsubpanel-reactions",role:"tabpanel","aria-labelledby":"labsubtab-reactions",hidden:k!=="reactions",children:t.jsx(fa,{embedded:!0})}),v.includes("molecular")&&t.jsx("div",{id:"labsubpanel-molecular",role:"tabpanel","aria-labelledby":"labsubtab-molecular",hidden:k!=="molecular",children:k==="molecular"&&t.jsx(xa,{embedded:!0})}),v.includes("practicals")&&t.jsx("div",{id:"labsubpanel-practicals",role:"tabpanel","aria-labelledby":"labsubtab-practicals",hidden:k!=="practicals",children:k==="practicals"&&t.jsx(ha,{subjects:["chemistry"],title:"Chemistry Practical Bank",subtitle:"Syllabus-linked titration, salt analysis, chromatography and qualitative-analysis workflows"})})]})}),O.has("biology")&&u.includes("biology")&&t.jsx(Q,{id:"biology",activeTab:h,children:t.jsx(wa,{embedded:!0})}),O.has("physics")&&u.includes("physics")&&t.jsx(Q,{id:"physics",activeTab:h,children:t.jsx(Ca,{embedded:!0})}),O.has("math")&&u.includes("math")&&t.jsx(Q,{id:"math",activeTab:h,children:t.jsx(ja,{embedded:!0})}),O.has("coding")&&u.includes("coding")&&t.jsx(Q,{id:"coding",activeTab:h,children:t.jsx(ka,{embedded:!0})}),O.has("electronics")&&u.includes("electronics")&&t.jsx(Q,{id:"electronics",activeTab:h,children:t.jsx(Sa,{embedded:!0})})]})})})})]})}function Q({id:e,activeTab:a,children:i}){const r=a===e;return t.jsx("section",{id:`labpanel-${e}`,role:"tabpanel","aria-labelledby":`labtab-${e}`,className:`labs-panel ${r?"active":""}`,hidden:!r,children:t.jsx(_e.Provider,{value:r,children:i})})}function Ra(){return t.jsxs("div",{className:"labs-hub-loader",role:"status","aria-live":"polite",children:[t.jsx("div",{className:"loader-spinner"}),t.jsx("p",{children:"Loading lab environment..."})]})}const li=Object.freeze(Object.defineProperty({__proto__:null,default:Na},Symbol.toStringTag,{value:"Module"}));export{ha as B,_e as L,na as P,sa as a,la as b,oa as c,ca as d,ni as e,li as f,si as u};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.