@classytic/labs 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +105 -0
- package/dist/biology/enzyme-rate/index.d.mts +1 -0
- package/dist/biology/enzyme-rate/preset.d.mts +25 -0
- package/dist/biology/enzyme-rate/preset.mjs +256 -0
- package/dist/biology/genetic-cross/core.d.mts +64 -0
- package/dist/biology/genetic-cross/core.mjs +147 -0
- package/dist/biology/genetic-cross/grid.mjs +239 -0
- package/dist/biology/genetic-cross/index.d.mts +3 -0
- package/dist/biology/genetic-cross/preset.d.mts +26 -0
- package/dist/biology/genetic-cross/preset.mjs +184 -0
- package/dist/biology/genetic-cross/sex-linked.d.mts +27 -0
- package/dist/biology/genetic-cross/sex-linked.mjs +226 -0
- package/dist/biology/index.d.mts +11 -0
- package/dist/biology/index.mjs +12 -0
- package/dist/biology/photosynthesis-factors/index.d.mts +1 -0
- package/dist/biology/photosynthesis-factors/preset.d.mts +25 -0
- package/dist/biology/photosynthesis-factors/preset.mjs +270 -0
- package/dist/biology/punnett-cross/index.d.mts +1 -0
- package/dist/biology/punnett-cross/preset.d.mts +27 -0
- package/dist/biology/punnett-cross/preset.mjs +21 -0
- package/dist/biology/respiration/index.d.mts +1 -0
- package/dist/biology/respiration/preset.d.mts +17 -0
- package/dist/biology/respiration/preset.mjs +179 -0
- package/dist/biology/sequence/central-dogma.d.mts +17 -0
- package/dist/biology/sequence/central-dogma.mjs +339 -0
- package/dist/biology/sequence/core.d.mts +38 -0
- package/dist/biology/sequence/core.mjs +178 -0
- package/dist/biology/sequence/index.d.mts +3 -0
- package/dist/biology/sequence/preset.d.mts +20 -0
- package/dist/biology/sequence/preset.mjs +235 -0
- package/dist/blocks/accounting.d.mts +142 -0
- package/dist/blocks/accounting.mjs +446 -0
- package/dist/blocks/authoring.d.mts +12 -0
- package/dist/blocks/authoring.mjs +705 -0
- package/dist/blocks/biology.d.mts +197 -0
- package/dist/blocks/biology.mjs +513 -0
- package/dist/blocks/chem.d.mts +128 -0
- package/dist/blocks/chem.mjs +486 -0
- package/dist/blocks/circuits.d.mts +86 -0
- package/dist/blocks/circuits.mjs +348 -0
- package/dist/blocks/discrete.d.mts +62 -0
- package/dist/blocks/discrete.mjs +314 -0
- package/dist/blocks/economics.d.mts +56 -0
- package/dist/blocks/economics.mjs +203 -0
- package/dist/blocks/geography.d.mts +58 -0
- package/dist/blocks/geography.mjs +115 -0
- package/dist/blocks/geometry.d.mts +28 -0
- package/dist/blocks/geometry.mjs +160 -0
- package/dist/blocks/ict.d.mts +65 -0
- package/dist/blocks/ict.mjs +197 -0
- package/dist/blocks/index.d.mts +4555 -0
- package/dist/blocks/index.mjs +120 -0
- package/dist/blocks/lab-block.d.mts +16 -0
- package/dist/blocks/lab-block.mjs +74 -0
- package/dist/blocks/lab-config.d.mts +23 -0
- package/dist/blocks/lab-config.mjs +200 -0
- package/dist/blocks/lab-gallery.d.mts +30 -0
- package/dist/blocks/lab-gallery.mjs +208 -0
- package/dist/blocks/language.d.mts +349 -0
- package/dist/blocks/language.mjs +750 -0
- package/dist/blocks/lesson.d.mts +43 -0
- package/dist/blocks/lesson.mjs +140 -0
- package/dist/blocks/math.d.mts +411 -0
- package/dist/blocks/math.mjs +1536 -0
- package/dist/blocks/ml.d.mts +84 -0
- package/dist/blocks/ml.mjs +146 -0
- package/dist/blocks/physics.d.mts +259 -0
- package/dist/blocks/physics.mjs +868 -0
- package/dist/blocks/statistics.d.mts +29 -0
- package/dist/blocks/statistics.mjs +123 -0
- package/dist/catalog/index.d.mts +3 -0
- package/dist/catalog/index.mjs +8 -0
- package/dist/catalog/registry.d.mts +46 -0
- package/dist/catalog/registry.mjs +56 -0
- package/dist/catalog/templates.d.mts +11 -0
- package/dist/catalog/templates.mjs +141 -0
- package/dist/chem/battery.d.mts +16 -0
- package/dist/chem/battery.mjs +311 -0
- package/dist/chem/bohr-atom.d.mts +16 -0
- package/dist/chem/bohr-atom.mjs +212 -0
- package/dist/chem/diffusion/asset.mjs +76 -0
- package/dist/chem/diffusion/index.d.mts +1 -0
- package/dist/chem/diffusion/preset.d.mts +15 -0
- package/dist/chem/diffusion/preset.mjs +188 -0
- package/dist/chem/electrochem/index.d.mts +1 -0
- package/dist/chem/electrochem/preset.d.mts +23 -0
- package/dist/chem/electrochem/preset.mjs +402 -0
- package/dist/chem/equilibrium/index.d.mts +1 -0
- package/dist/chem/equilibrium/preset.d.mts +36 -0
- package/dist/chem/equilibrium/preset.mjs +416 -0
- package/dist/chem/gas-box/index.d.mts +1 -0
- package/dist/chem/gas-box/preset.d.mts +27 -0
- package/dist/chem/gas-box/preset.mjs +395 -0
- package/dist/chem/index.d.mts +16 -0
- package/dist/chem/index.mjs +17 -0
- package/dist/chem/kinetics/index.d.mts +1 -0
- package/dist/chem/kinetics/preset.d.mts +31 -0
- package/dist/chem/kinetics/preset.mjs +478 -0
- package/dist/chem/periodic-trends/index.d.mts +1 -0
- package/dist/chem/periodic-trends/preset.d.mts +21 -0
- package/dist/chem/periodic-trends/preset.mjs +831 -0
- package/dist/chem/reaction-lab.d.mts +18 -0
- package/dist/chem/reaction-lab.mjs +165 -0
- package/dist/chem/reaction-profile.d.mts +21 -0
- package/dist/chem/reaction-profile.mjs +287 -0
- package/dist/chem/solution/dilution.d.mts +27 -0
- package/dist/chem/solution/dilution.mjs +199 -0
- package/dist/chem/solution/field.d.mts +30 -0
- package/dist/chem/solution/field.mjs +145 -0
- package/dist/chem/solution/index.d.mts +3 -0
- package/dist/chem/solution/solution-box.d.mts +28 -0
- package/dist/chem/solution/solution-box.mjs +140 -0
- package/dist/chem/stoichiometry/index.d.mts +1 -0
- package/dist/chem/stoichiometry/preset.d.mts +29 -0
- package/dist/chem/stoichiometry/preset.mjs +392 -0
- package/dist/chem/titration/index.d.mts +1 -0
- package/dist/chem/titration/preset.d.mts +29 -0
- package/dist/chem/titration/preset.mjs +436 -0
- package/dist/circuits/ac-dc/asset.mjs +295 -0
- package/dist/circuits/ac-dc/index.d.mts +1 -0
- package/dist/circuits/ac-dc/preset.d.mts +16 -0
- package/dist/circuits/ac-dc/preset.mjs +134 -0
- package/dist/circuits/capacitor-leak/index.d.mts +1 -0
- package/dist/circuits/capacitor-leak/preset.d.mts +32 -0
- package/dist/circuits/capacitor-leak/preset.mjs +271 -0
- package/dist/circuits/circuit/asset.d.mts +6 -0
- package/dist/circuits/circuit/asset.mjs +367 -0
- package/dist/circuits/circuit/index.d.mts +2 -0
- package/dist/circuits/circuit/preset.d.mts +46 -0
- package/dist/circuits/circuit/preset.mjs +235 -0
- package/dist/circuits/circuit-builder.d.mts +30 -0
- package/dist/circuits/circuit-builder.mjs +412 -0
- package/dist/circuits/circuit-lab.d.mts +20 -0
- package/dist/circuits/circuit-lab.mjs +400 -0
- package/dist/circuits/index.d.mts +7 -0
- package/dist/circuits/index.mjs +8 -0
- package/dist/commerce/accounting/core.d.mts +48 -0
- package/dist/commerce/accounting/core.mjs +57 -0
- package/dist/commerce/accounting/equation-balance.d.mts +35 -0
- package/dist/commerce/accounting/equation-balance.mjs +292 -0
- package/dist/commerce/accounting/index.d.mts +4 -0
- package/dist/commerce/accounting/journal-poster.d.mts +29 -0
- package/dist/commerce/accounting/journal-poster.mjs +472 -0
- package/dist/commerce/accounting/statement-sorter.d.mts +25 -0
- package/dist/commerce/accounting/statement-sorter.mjs +304 -0
- package/dist/commerce/economics/core.d.mts +33 -0
- package/dist/commerce/economics/core.mjs +26 -0
- package/dist/commerce/economics/demand-shift-vs-move.d.mts +35 -0
- package/dist/commerce/economics/demand-shift-vs-move.mjs +324 -0
- package/dist/commerce/economics/elasticity-revenue.d.mts +31 -0
- package/dist/commerce/economics/elasticity-revenue.mjs +253 -0
- package/dist/commerce/economics/index.d.mts +4 -0
- package/dist/commerce/economics/market-equilibrium.d.mts +33 -0
- package/dist/commerce/economics/market-equilibrium.mjs +340 -0
- package/dist/commerce/index.d.mts +9 -0
- package/dist/commerce/index.mjs +10 -0
- package/dist/core/easing.d.mts +28 -0
- package/dist/core/easing.mjs +66 -0
- package/dist/core/index.d.mts +10 -0
- package/dist/core/index.mjs +11 -0
- package/dist/core/numeric.d.mts +37 -0
- package/dist/core/numeric.mjs +75 -0
- package/dist/core/reactive.d.mts +24 -0
- package/dist/core/reactive.mjs +51 -0
- package/dist/core/rng.d.mts +21 -0
- package/dist/core/rng.mjs +39 -0
- package/dist/core/tex.d.mts +14 -0
- package/dist/core/tex.mjs +44 -0
- package/dist/core/timeline.d.mts +34 -0
- package/dist/core/timeline.mjs +77 -0
- package/dist/core/util.d.mts +19 -0
- package/dist/core/util.mjs +31 -0
- package/dist/discrete/arrangements/preset.d.mts +28 -0
- package/dist/discrete/arrangements/preset.mjs +304 -0
- package/dist/discrete/bayes/preset.d.mts +33 -0
- package/dist/discrete/bayes/preset.mjs +476 -0
- package/dist/discrete/binomial/preset.d.mts +25 -0
- package/dist/discrete/binomial/preset.mjs +333 -0
- package/dist/discrete/core/combinatorics.d.mts +23 -0
- package/dist/discrete/core/combinatorics.mjs +57 -0
- package/dist/discrete/core/inclusionExclusion.d.mts +19 -0
- package/dist/discrete/core/inclusionExclusion.mjs +30 -0
- package/dist/discrete/core/pigeonhole.d.mts +15 -0
- package/dist/discrete/core/pigeonhole.mjs +24 -0
- package/dist/discrete/core/probability.d.mts +29 -0
- package/dist/discrete/core/probability.mjs +43 -0
- package/dist/discrete/core/sets.d.mts +21 -0
- package/dist/discrete/core/sets.mjs +45 -0
- package/dist/discrete/counting-slots/preset.d.mts +30 -0
- package/dist/discrete/counting-slots/preset.mjs +553 -0
- package/dist/discrete/counting-tree/index.d.mts +1 -0
- package/dist/discrete/counting-tree/preset.d.mts +44 -0
- package/dist/discrete/counting-tree/preset.mjs +364 -0
- package/dist/discrete/expected-value/preset.d.mts +28 -0
- package/dist/discrete/expected-value/preset.mjs +352 -0
- package/dist/discrete/hypergeometric/preset.d.mts +25 -0
- package/dist/discrete/hypergeometric/preset.mjs +330 -0
- package/dist/discrete/index.d.mts +26 -0
- package/dist/discrete/index.mjs +27 -0
- package/dist/discrete/karnaugh/index.d.mts +1 -0
- package/dist/discrete/karnaugh/preset.d.mts +30 -0
- package/dist/discrete/karnaugh/preset.mjs +452 -0
- package/dist/discrete/lln/asset.mjs +206 -0
- package/dist/discrete/lln/index.d.mts +1 -0
- package/dist/discrete/lln/preset.d.mts +17 -0
- package/dist/discrete/lln/preset.mjs +152 -0
- package/dist/discrete/logic-circuit/index.d.mts +1 -0
- package/dist/discrete/logic-circuit/preset.d.mts +47 -0
- package/dist/discrete/logic-circuit/preset.mjs +307 -0
- package/dist/discrete/monte-carlo/index.d.mts +1 -0
- package/dist/discrete/monte-carlo/preset.d.mts +64 -0
- package/dist/discrete/monte-carlo/preset.mjs +446 -0
- package/dist/discrete/monty-hall/index.d.mts +1 -0
- package/dist/discrete/monty-hall/preset.d.mts +23 -0
- package/dist/discrete/monty-hall/preset.mjs +491 -0
- package/dist/discrete/outcome-builder/preset.d.mts +24 -0
- package/dist/discrete/outcome-builder/preset.mjs +283 -0
- package/dist/discrete/pascal/preset.d.mts +24 -0
- package/dist/discrete/pascal/preset.mjs +372 -0
- package/dist/discrete/sample-space/index.d.mts +1 -0
- package/dist/discrete/sample-space/preset.d.mts +42 -0
- package/dist/discrete/sample-space/preset.mjs +395 -0
- package/dist/discrete/selection/preset.d.mts +33 -0
- package/dist/discrete/selection/preset.mjs +406 -0
- package/dist/discrete/truth-table/index.d.mts +1 -0
- package/dist/discrete/truth-table/preset.d.mts +30 -0
- package/dist/discrete/truth-table/preset.mjs +456 -0
- package/dist/discrete/venn/index.d.mts +1 -0
- package/dist/discrete/venn/preset.d.mts +32 -0
- package/dist/discrete/venn/preset.mjs +461 -0
- package/dist/geography/cycle-lab/index.d.mts +1 -0
- package/dist/geography/cycle-lab/preset.d.mts +25 -0
- package/dist/geography/cycle-lab/preset.mjs +254 -0
- package/dist/geography/cycles.d.mts +21 -0
- package/dist/geography/cycles.mjs +205 -0
- package/dist/geography/index.d.mts +4 -0
- package/dist/geography/index.mjs +5 -0
- package/dist/geometry/board/index.d.mts +1 -0
- package/dist/geometry/board/preset.d.mts +71 -0
- package/dist/geometry/board/preset.mjs +148 -0
- package/dist/geometry/builder.d.mts +18 -0
- package/dist/geometry/builder.mjs +332 -0
- package/dist/geometry/index.d.mts +4 -0
- package/dist/geometry/index.mjs +5 -0
- package/dist/geometry/intersecting-circles.d.mts +17 -0
- package/dist/geometry/intersecting-circles.mjs +104 -0
- package/dist/ict/index.d.mts +5 -0
- package/dist/ict/index.mjs +6 -0
- package/dist/ict/number-systems/base-odometer.d.mts +34 -0
- package/dist/ict/number-systems/base-odometer.mjs +160 -0
- package/dist/ict/number-systems/bit-grouper.d.mts +32 -0
- package/dist/ict/number-systems/bit-grouper.mjs +190 -0
- package/dist/ict/number-systems/index.d.mts +4 -0
- package/dist/ict/number-systems/place-value-dial.d.mts +29 -0
- package/dist/ict/number-systems/place-value-dial.mjs +153 -0
- package/dist/ict/number-systems/wheel.d.mts +73 -0
- package/dist/ict/number-systems/wheel.mjs +279 -0
- package/dist/index.d.mts +10 -0
- package/dist/index.mjs +11 -0
- package/dist/kit/anim.mjs +52 -0
- package/dist/kit/annotate.mjs +116 -0
- package/dist/kit/answer-check.d.mts +38 -0
- package/dist/kit/answer-check.mjs +65 -0
- package/dist/kit/asset-util.mjs +15 -0
- package/dist/kit/controls.mjs +77 -0
- package/dist/kit/cycle.d.mts +44 -0
- package/dist/kit/cycle.mjs +188 -0
- package/dist/kit/diagram.mjs +176 -0
- package/dist/kit/electronics.mjs +357 -0
- package/dist/kit/expr-analysis.d.mts +37 -0
- package/dist/kit/expr-analysis.mjs +111 -0
- package/dist/kit/frame.d.mts +70 -0
- package/dist/kit/frame.mjs +205 -0
- package/dist/kit/freq-tree.mjs +99 -0
- package/dist/kit/gameshow.mjs +315 -0
- package/dist/kit/index.d.mts +5 -0
- package/dist/kit/index.mjs +6 -0
- package/dist/kit/logic-gates.d.mts +6 -0
- package/dist/kit/logic-gates.mjs +210 -0
- package/dist/kit/molecules.mjs +178 -0
- package/dist/kit/pedagogy.d.mts +126 -0
- package/dist/kit/pedagogy.mjs +331 -0
- package/dist/kit/play.d.mts +21 -0
- package/dist/kit/play.mjs +52 -0
- package/dist/kit/probability.mjs +141 -0
- package/dist/kit/proportion.mjs +112 -0
- package/dist/kit/reaction.mjs +102 -0
- package/dist/kit/rich.d.mts +10 -0
- package/dist/kit/rich.mjs +21 -0
- package/dist/kit/scale.mjs +230 -0
- package/dist/kit/space.mjs +326 -0
- package/dist/kit/steps.d.mts +24 -0
- package/dist/kit/steps.mjs +57 -0
- package/dist/kit/thermal.mjs +289 -0
- package/dist/language/agreement/index.d.mts +1 -0
- package/dist/language/agreement/preset.d.mts +27 -0
- package/dist/language/agreement/preset.mjs +113 -0
- package/dist/language/article-lens/index.d.mts +1 -0
- package/dist/language/article-lens/preset.d.mts +31 -0
- package/dist/language/article-lens/preset.mjs +125 -0
- package/dist/language/deck.d.mts +45 -0
- package/dist/language/deck.mjs +61 -0
- package/dist/language/icon.d.mts +40 -0
- package/dist/language/icon.mjs +73 -0
- package/dist/language/index.d.mts +10 -0
- package/dist/language/index.mjs +11 -0
- package/dist/language/preposition-scene/index.d.mts +1 -0
- package/dist/language/preposition-scene/preset.d.mts +34 -0
- package/dist/language/preposition-scene/preset.mjs +234 -0
- package/dist/language/sentence-builder/index.d.mts +1 -0
- package/dist/language/sentence-builder/preset.d.mts +32 -0
- package/dist/language/sentence-builder/preset.mjs +122 -0
- package/dist/language/transform/index.d.mts +1 -0
- package/dist/language/transform/preset.d.mts +31 -0
- package/dist/language/transform/preset.mjs +137 -0
- package/dist/language/ui.d.mts +53 -0
- package/dist/language/ui.mjs +88 -0
- package/dist/language/word-match/index.d.mts +1 -0
- package/dist/language/word-match/preset.d.mts +22 -0
- package/dist/language/word-match/preset.mjs +148 -0
- package/dist/math/area-model/asset.d.mts +6 -0
- package/dist/math/area-model/asset.mjs +270 -0
- package/dist/math/area-model/index.d.mts +2 -0
- package/dist/math/area-model/preset.d.mts +29 -0
- package/dist/math/area-model/preset.mjs +243 -0
- package/dist/math/balance-algebra/asset.d.mts +6 -0
- package/dist/math/balance-algebra/asset.mjs +150 -0
- package/dist/math/balance-algebra/index.d.mts +2 -0
- package/dist/math/balance-algebra/preset.d.mts +30 -0
- package/dist/math/balance-algebra/preset.mjs +228 -0
- package/dist/math/derivation.d.mts +22 -0
- package/dist/math/derivation.mjs +113 -0
- package/dist/math/derivative-explorer/index.d.mts +1 -0
- package/dist/math/derivative-explorer/preset.d.mts +19 -0
- package/dist/math/derivative-explorer/preset.mjs +227 -0
- package/dist/math/function-machine/index.d.mts +1 -0
- package/dist/math/function-machine/preset.d.mts +21 -0
- package/dist/math/function-machine/preset.mjs +177 -0
- package/dist/math/gradient-descent.d.mts +23 -0
- package/dist/math/gradient-descent.mjs +473 -0
- package/dist/math/grapher/index.d.mts +1 -0
- package/dist/math/grapher/preset.d.mts +40 -0
- package/dist/math/grapher/preset.mjs +313 -0
- package/dist/math/harmonic-form/index.d.mts +1 -0
- package/dist/math/harmonic-form/preset.d.mts +21 -0
- package/dist/math/harmonic-form/preset.mjs +387 -0
- package/dist/math/index.d.mts +25 -0
- package/dist/math/index.mjs +26 -0
- package/dist/math/integral-explorer/index.d.mts +1 -0
- package/dist/math/integral-explorer/preset.d.mts +23 -0
- package/dist/math/integral-explorer/preset.mjs +217 -0
- package/dist/math/interactive/index.d.mts +1 -0
- package/dist/math/interactive/preset.d.mts +72 -0
- package/dist/math/interactive/preset.mjs +202 -0
- package/dist/math/limit-explorer/index.d.mts +1 -0
- package/dist/math/limit-explorer/preset.d.mts +19 -0
- package/dist/math/limit-explorer/preset.mjs +216 -0
- package/dist/math/linear-system/index.d.mts +1 -0
- package/dist/math/linear-system/preset.d.mts +28 -0
- package/dist/math/linear-system/preset.mjs +164 -0
- package/dist/math/mystery-bucket/asset.d.mts +6 -0
- package/dist/math/mystery-bucket/asset.mjs +145 -0
- package/dist/math/mystery-bucket/index.d.mts +2 -0
- package/dist/math/mystery-bucket/preset.d.mts +36 -0
- package/dist/math/mystery-bucket/preset.mjs +116 -0
- package/dist/math/number-line/index.d.mts +1 -0
- package/dist/math/number-line/preset.d.mts +24 -0
- package/dist/math/number-line/preset.mjs +142 -0
- package/dist/math/parabola/index.d.mts +1 -0
- package/dist/math/parabola/preset.d.mts +13 -0
- package/dist/math/parabola/preset.mjs +79 -0
- package/dist/math/pattern/asset.d.mts +6 -0
- package/dist/math/pattern/asset.mjs +102 -0
- package/dist/math/pattern/index.d.mts +2 -0
- package/dist/math/pattern/preset.d.mts +32 -0
- package/dist/math/pattern/preset.mjs +294 -0
- package/dist/math/triangle-trig/index.d.mts +1 -0
- package/dist/math/triangle-trig/preset.d.mts +47 -0
- package/dist/math/triangle-trig/preset.mjs +245 -0
- package/dist/math/trig-explorer.d.mts +18 -0
- package/dist/math/trig-explorer.mjs +209 -0
- package/dist/ml/boundary/index.d.mts +1 -0
- package/dist/ml/boundary/preset.d.mts +24 -0
- package/dist/ml/boundary/preset.mjs +385 -0
- package/dist/ml/classifier/index.d.mts +1 -0
- package/dist/ml/classifier/preset.d.mts +25 -0
- package/dist/ml/classifier/preset.mjs +315 -0
- package/dist/ml/index.d.mts +6 -0
- package/dist/ml/index.mjs +7 -0
- package/dist/ml/kmeans/index.d.mts +1 -0
- package/dist/ml/kmeans/preset.d.mts +33 -0
- package/dist/ml/kmeans/preset.mjs +236 -0
- package/dist/ml/knn/index.d.mts +1 -0
- package/dist/ml/knn/preset.d.mts +28 -0
- package/dist/ml/knn/preset.mjs +279 -0
- package/dist/ml/regression/index.d.mts +1 -0
- package/dist/ml/regression/preset.d.mts +32 -0
- package/dist/ml/regression/preset.mjs +394 -0
- package/dist/physics/atwood/index.d.mts +1 -0
- package/dist/physics/atwood/preset.d.mts +23 -0
- package/dist/physics/atwood/preset.mjs +312 -0
- package/dist/physics/bullet-walls/index.d.mts +1 -0
- package/dist/physics/bullet-walls/preset.d.mts +28 -0
- package/dist/physics/bullet-walls/preset.mjs +373 -0
- package/dist/physics/carnot/index.d.mts +1 -0
- package/dist/physics/carnot/preset.d.mts +27 -0
- package/dist/physics/carnot/preset.mjs +427 -0
- package/dist/physics/circular-motion/index.d.mts +1 -0
- package/dist/physics/circular-motion/preset.d.mts +25 -0
- package/dist/physics/circular-motion/preset.mjs +293 -0
- package/dist/physics/collision-track/index.d.mts +1 -0
- package/dist/physics/collision-track/preset.d.mts +27 -0
- package/dist/physics/collision-track/preset.mjs +352 -0
- package/dist/physics/efficiency/index.d.mts +1 -0
- package/dist/physics/efficiency/preset.d.mts +33 -0
- package/dist/physics/efficiency/preset.mjs +343 -0
- package/dist/physics/electric-field/index.d.mts +1 -0
- package/dist/physics/electric-field/preset.d.mts +15 -0
- package/dist/physics/electric-field/preset.mjs +306 -0
- package/dist/physics/energy-skate/index.d.mts +1 -0
- package/dist/physics/energy-skate/preset.d.mts +25 -0
- package/dist/physics/energy-skate/preset.mjs +254 -0
- package/dist/physics/entropy/index.d.mts +1 -0
- package/dist/physics/entropy/preset.d.mts +18 -0
- package/dist/physics/entropy/preset.mjs +416 -0
- package/dist/physics/expansion/index.d.mts +1 -0
- package/dist/physics/expansion/preset.d.mts +26 -0
- package/dist/physics/expansion/preset.mjs +609 -0
- package/dist/physics/exponential/asset.mjs +221 -0
- package/dist/physics/exponential/index.d.mts +1 -0
- package/dist/physics/exponential/preset.d.mts +17 -0
- package/dist/physics/exponential/preset.mjs +182 -0
- package/dist/physics/gas-process/index.d.mts +1 -0
- package/dist/physics/gas-process/preset.d.mts +30 -0
- package/dist/physics/gas-process/preset.mjs +384 -0
- package/dist/physics/gravitation/index.d.mts +1 -0
- package/dist/physics/gravitation/preset.d.mts +24 -0
- package/dist/physics/gravitation/preset.mjs +345 -0
- package/dist/physics/gravity-drop.d.mts +9 -0
- package/dist/physics/gravity-drop.mjs +187 -0
- package/dist/physics/heat-transfer/index.d.mts +1 -0
- package/dist/physics/heat-transfer/preset.d.mts +27 -0
- package/dist/physics/heat-transfer/preset.mjs +626 -0
- package/dist/physics/impulse/index.d.mts +1 -0
- package/dist/physics/impulse/preset.d.mts +29 -0
- package/dist/physics/impulse/preset.mjs +453 -0
- package/dist/physics/index.d.mts +43 -0
- package/dist/physics/index.mjs +44 -0
- package/dist/physics/kepler/index.d.mts +1 -0
- package/dist/physics/kepler/preset.d.mts +27 -0
- package/dist/physics/kepler/preset.mjs +257 -0
- package/dist/physics/lever/asset.d.mts +6 -0
- package/dist/physics/lever/asset.mjs +220 -0
- package/dist/physics/lever/index.d.mts +2 -0
- package/dist/physics/lever/preset.d.mts +31 -0
- package/dist/physics/lever/preset.mjs +261 -0
- package/dist/physics/lorentz/index.d.mts +1 -0
- package/dist/physics/lorentz/preset.d.mts +29 -0
- package/dist/physics/lorentz/preset.mjs +367 -0
- package/dist/physics/magnetism/index.d.mts +1 -0
- package/dist/physics/magnetism/preset.d.mts +15 -0
- package/dist/physics/magnetism/preset.mjs +334 -0
- package/dist/physics/optics/asset.d.mts +6 -0
- package/dist/physics/optics/asset.mjs +234 -0
- package/dist/physics/optics/index.d.mts +2 -0
- package/dist/physics/optics/preset.d.mts +14 -0
- package/dist/physics/optics/preset.mjs +202 -0
- package/dist/physics/orbit-lab.d.mts +6 -0
- package/dist/physics/orbit-lab.mjs +222 -0
- package/dist/physics/projectile-lab.d.mts +10 -0
- package/dist/physics/projectile-lab.mjs +354 -0
- package/dist/physics/rain-relative/index.d.mts +1 -0
- package/dist/physics/rain-relative/preset.d.mts +19 -0
- package/dist/physics/rain-relative/preset.mjs +358 -0
- package/dist/physics/ramp-forces/index.d.mts +1 -0
- package/dist/physics/ramp-forces/preset.d.mts +36 -0
- package/dist/physics/ramp-forces/preset.mjs +550 -0
- package/dist/physics/river-boat.d.mts +22 -0
- package/dist/physics/river-boat.mjs +498 -0
- package/dist/physics/shm/index.d.mts +1 -0
- package/dist/physics/shm/preset.d.mts +33 -0
- package/dist/physics/shm/preset.mjs +554 -0
- package/dist/physics/stopping-distance/index.d.mts +1 -0
- package/dist/physics/stopping-distance/preset.d.mts +29 -0
- package/dist/physics/stopping-distance/preset.mjs +662 -0
- package/dist/physics/temperature-scales/index.d.mts +1 -0
- package/dist/physics/temperature-scales/preset.d.mts +15 -0
- package/dist/physics/temperature-scales/preset.mjs +353 -0
- package/dist/physics/terminal-velocity/index.d.mts +1 -0
- package/dist/physics/terminal-velocity/preset.d.mts +26 -0
- package/dist/physics/terminal-velocity/preset.mjs +404 -0
- package/dist/physics/thermal/index.d.mts +1 -0
- package/dist/physics/thermal/preset.d.mts +44 -0
- package/dist/physics/thermal/preset.mjs +373 -0
- package/dist/physics/vector-board/index.d.mts +1 -0
- package/dist/physics/vector-board/preset.d.mts +65 -0
- package/dist/physics/vector-board/preset.mjs +273 -0
- package/dist/physics/vector-board/view.d.mts +49 -0
- package/dist/physics/vector-board/view.mjs +58 -0
- package/dist/physics/vector-scene.d.mts +41 -0
- package/dist/physics/vector-scene.mjs +211 -0
- package/dist/physics/vector-types/index.d.mts +1 -0
- package/dist/physics/vector-types/preset.d.mts +27 -0
- package/dist/physics/vector-types/preset.mjs +192 -0
- package/dist/physics/water-density/index.d.mts +1 -0
- package/dist/physics/water-density/preset.d.mts +18 -0
- package/dist/physics/water-density/preset.mjs +439 -0
- package/dist/physics/waves/core.mjs +33 -0
- package/dist/physics/waves/doppler.d.mts +23 -0
- package/dist/physics/waves/doppler.mjs +260 -0
- package/dist/physics/waves/index.d.mts +4 -0
- package/dist/physics/waves/preset.d.mts +30 -0
- package/dist/physics/waves/preset.mjs +488 -0
- package/dist/physics/waves/ripple.d.mts +26 -0
- package/dist/physics/waves/ripple.mjs +234 -0
- package/dist/physics/waves/string.d.mts +29 -0
- package/dist/physics/waves/string.mjs +289 -0
- package/dist/physics/work-energy/index.d.mts +1 -0
- package/dist/physics/work-energy/preset.d.mts +17 -0
- package/dist/physics/work-energy/preset.mjs +341 -0
- package/dist/schemas/index.d.mts +235 -0
- package/dist/schemas/index.mjs +145 -0
- package/dist/statistics/center-spread/preset.d.mts +34 -0
- package/dist/statistics/center-spread/preset.mjs +323 -0
- package/dist/statistics/core/descriptive.d.mts +35 -0
- package/dist/statistics/core/descriptive.mjs +64 -0
- package/dist/statistics/core/normal.d.mts +21 -0
- package/dist/statistics/core/normal.mjs +37 -0
- package/dist/statistics/core/sequences.d.mts +27 -0
- package/dist/statistics/core/sequences.mjs +35 -0
- package/dist/statistics/galton/preset.d.mts +27 -0
- package/dist/statistics/galton/preset.mjs +331 -0
- package/dist/statistics/histogram/preset.d.mts +27 -0
- package/dist/statistics/histogram/preset.mjs +385 -0
- package/dist/statistics/index.d.mts +11 -0
- package/dist/statistics/index.mjs +12 -0
- package/dist/statistics/normal/preset.d.mts +30 -0
- package/dist/statistics/normal/preset.mjs +400 -0
- package/dist/statistics/sampling/preset.d.mts +32 -0
- package/dist/statistics/sampling/preset.mjs +406 -0
- package/dist/statistics/sequence/preset.d.mts +28 -0
- package/dist/statistics/sequence/preset.mjs +302 -0
- package/dist/statistics/z-table/preset.d.mts +28 -0
- package/dist/statistics/z-table/preset.mjs +348 -0
- package/package.json +266 -0
- package/styles.css +267 -0
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { Tex as Tex$1 } from "../../core/tex.mjs";
|
|
4
|
+
import { CheckButton, Chip, Slider, StatusPill, Stepper } from "../../kit/controls.mjs";
|
|
5
|
+
import { Callout, ControlBar, Field, LabFrame } from "../../kit/frame.mjs";
|
|
6
|
+
import { HintLadder, useCheckpoint, useHints } from "../../kit/pedagogy.mjs";
|
|
7
|
+
import { nCr } from "../core/combinatorics.mjs";
|
|
8
|
+
import { useMemo, useState } from "react";
|
|
9
|
+
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
10
|
+
import { useControlSurface } from "@classytic/stage";
|
|
11
|
+
|
|
12
|
+
//#region src/discrete/binomial/preset.tsx
|
|
13
|
+
/**
|
|
14
|
+
* BinomialDistributionLab — the bridge from counting to the bell. P(X=k successes
|
|
15
|
+
* in n trials) = C(n,k)·pᵏ·(1−p)ⁿ⁻ᵏ, drawn as bars you can interrogate: click a bar
|
|
16
|
+
* and the formula DERIVES itself — k successes happen C(n,k) ways (the Pascal /
|
|
17
|
+
* counting number), each way has probability pᵏ for the successes times (1−p)ⁿ⁻ᵏ for
|
|
18
|
+
* the failures. Slide p to watch it skew and (at ½) turn symmetric; slide n and flip
|
|
19
|
+
* on the normal overlay to watch the binomial become the Galton-board bell. Mean np
|
|
20
|
+
* and σ = √(np(1−p)) are marked.
|
|
21
|
+
*
|
|
22
|
+
* One lab ties together Pascal (the coefficients), the counting labs (the C(n,k)),
|
|
23
|
+
* and the normal distribution (the limit). Values from the nCr kernel.
|
|
24
|
+
*/
|
|
25
|
+
const W = 540, H = 300, ML = 30, MR = 14, MT = 16, MB = 34;
|
|
26
|
+
const PW = W - ML - MR, PH = H - MT - MB;
|
|
27
|
+
const ACC = "var(--stage-accent)", GOOD = "var(--stage-good)";
|
|
28
|
+
const f3 = (x) => x < 5e-4 ? x.toExponential(1) : x.toFixed(3);
|
|
29
|
+
function BinomialDistributionLab({ n: n0 = 10, p: p0 = .5, showNormal: sn0 = false, title = "Binomial distribution", prompt, objectives, hints: hintList, controlId }) {
|
|
30
|
+
const [n, setN] = useState(n0);
|
|
31
|
+
const [p, setP] = useState(p0);
|
|
32
|
+
const [normal, setNormal] = useState(sn0);
|
|
33
|
+
const [sel, setSel] = useState(null);
|
|
34
|
+
const [guess, setGuess] = useState(0);
|
|
35
|
+
const [checked, setChecked] = useState(false);
|
|
36
|
+
const hints = useHints(hintList);
|
|
37
|
+
const probs = useMemo(() => Array.from({ length: n + 1 }, (_, k) => nCr(n, k) * p ** k * (1 - p) ** (n - k)), [n, p]);
|
|
38
|
+
const mean = n * p, variance = n * p * (1 - p), sd = Math.sqrt(variance);
|
|
39
|
+
const mode = probs.indexOf(Math.max(...probs));
|
|
40
|
+
const npdf = (x) => variance > 0 ? Math.exp(-((x - mean) ** 2) / (2 * variance)) / Math.sqrt(2 * Math.PI * variance) : 0;
|
|
41
|
+
const yMax = Math.max(...probs, normal ? npdf(mean) : 0) * 1.1 || 1;
|
|
42
|
+
const colW = PW / (n + 1);
|
|
43
|
+
const xOf = (k) => ML + (k + .5) * colW;
|
|
44
|
+
const yOf = (v) => 266 - v / yMax * PH;
|
|
45
|
+
const barW = Math.min(40, colW * .74);
|
|
46
|
+
useCheckpoint({
|
|
47
|
+
solved: checked && guess === mode,
|
|
48
|
+
activity: `binomial:${title}`,
|
|
49
|
+
hintsUsed: hints.count
|
|
50
|
+
});
|
|
51
|
+
useControlSurface(controlId, {
|
|
52
|
+
n: {
|
|
53
|
+
type: "number",
|
|
54
|
+
label: "trials n",
|
|
55
|
+
min: 1,
|
|
56
|
+
max: 24,
|
|
57
|
+
step: 1,
|
|
58
|
+
get: () => n,
|
|
59
|
+
set: (v) => {
|
|
60
|
+
setN(Math.round(v));
|
|
61
|
+
setChecked(false);
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
p: {
|
|
65
|
+
type: "number",
|
|
66
|
+
label: "success prob p",
|
|
67
|
+
min: 0,
|
|
68
|
+
max: 1,
|
|
69
|
+
step: .01,
|
|
70
|
+
get: () => p,
|
|
71
|
+
set: setP
|
|
72
|
+
},
|
|
73
|
+
normal: {
|
|
74
|
+
type: "boolean",
|
|
75
|
+
label: "normal overlay",
|
|
76
|
+
get: () => normal,
|
|
77
|
+
set: setNormal
|
|
78
|
+
},
|
|
79
|
+
inspect: {
|
|
80
|
+
type: "number",
|
|
81
|
+
label: "inspect k (−1 clears)",
|
|
82
|
+
min: -1,
|
|
83
|
+
max: n,
|
|
84
|
+
step: 1,
|
|
85
|
+
get: () => sel ?? -1,
|
|
86
|
+
set: (v) => setSel(v < 0 ? null : Math.round(v))
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
const ticks = n <= 16 ? Array.from({ length: n + 1 }, (_, k) => k) : Array.from({ length: n + 1 }, (_, k) => k).filter((k) => k % 2 === 0);
|
|
90
|
+
const figure = /* @__PURE__ */ jsx("div", {
|
|
91
|
+
style: {
|
|
92
|
+
borderRadius: 14,
|
|
93
|
+
background: "var(--stage-bg)",
|
|
94
|
+
border: "1px solid var(--stage-grid)",
|
|
95
|
+
padding: 8
|
|
96
|
+
},
|
|
97
|
+
children: /* @__PURE__ */ jsxs("svg", {
|
|
98
|
+
viewBox: `0 0 ${W} ${H}`,
|
|
99
|
+
style: {
|
|
100
|
+
width: "100%",
|
|
101
|
+
maxWidth: W,
|
|
102
|
+
height: "auto",
|
|
103
|
+
display: "block"
|
|
104
|
+
},
|
|
105
|
+
role: "img",
|
|
106
|
+
"aria-label": `binomial n ${n} p ${p}, most likely ${mode}`,
|
|
107
|
+
children: [
|
|
108
|
+
probs.map((pr, k) => {
|
|
109
|
+
const on = sel === k;
|
|
110
|
+
return /* @__PURE__ */ jsxs("g", {
|
|
111
|
+
onClick: () => setSel(on ? null : k),
|
|
112
|
+
style: { cursor: "pointer" },
|
|
113
|
+
children: [
|
|
114
|
+
/* @__PURE__ */ jsx("rect", {
|
|
115
|
+
x: xOf(k) - colW / 2,
|
|
116
|
+
y: MT,
|
|
117
|
+
width: colW,
|
|
118
|
+
height: PH,
|
|
119
|
+
fill: "transparent"
|
|
120
|
+
}),
|
|
121
|
+
/* @__PURE__ */ jsx("rect", {
|
|
122
|
+
x: xOf(k) - barW / 2,
|
|
123
|
+
y: yOf(pr),
|
|
124
|
+
width: barW,
|
|
125
|
+
height: Math.max(0, 266 - yOf(pr)),
|
|
126
|
+
rx: 3,
|
|
127
|
+
fill: on ? GOOD : `color-mix(in oklab, ${ACC} 78%, transparent)`
|
|
128
|
+
}),
|
|
129
|
+
(n <= 16 || on) && /* @__PURE__ */ jsx("text", {
|
|
130
|
+
x: xOf(k),
|
|
131
|
+
y: yOf(pr) - 3,
|
|
132
|
+
textAnchor: "middle",
|
|
133
|
+
fontSize: 9,
|
|
134
|
+
fill: "var(--stage-muted)",
|
|
135
|
+
children: (pr * 100).toFixed(pr < .1 ? 1 : 0)
|
|
136
|
+
})
|
|
137
|
+
]
|
|
138
|
+
}, k);
|
|
139
|
+
}),
|
|
140
|
+
/* @__PURE__ */ jsx("line", {
|
|
141
|
+
x1: ML,
|
|
142
|
+
y1: 266,
|
|
143
|
+
x2: W - MR,
|
|
144
|
+
y2: 266,
|
|
145
|
+
stroke: "var(--stage-fg)",
|
|
146
|
+
strokeWidth: 1.5
|
|
147
|
+
}),
|
|
148
|
+
ticks.map((k) => /* @__PURE__ */ jsx("text", {
|
|
149
|
+
x: xOf(k),
|
|
150
|
+
y: 280,
|
|
151
|
+
textAnchor: "middle",
|
|
152
|
+
fontSize: 10,
|
|
153
|
+
fill: "var(--stage-muted)",
|
|
154
|
+
children: k
|
|
155
|
+
}, k)),
|
|
156
|
+
/* @__PURE__ */ jsx("line", {
|
|
157
|
+
x1: xOf(mean),
|
|
158
|
+
y1: MT,
|
|
159
|
+
x2: xOf(mean),
|
|
160
|
+
y2: 266,
|
|
161
|
+
stroke: GOOD,
|
|
162
|
+
strokeWidth: 1.5,
|
|
163
|
+
strokeDasharray: "4 3"
|
|
164
|
+
}),
|
|
165
|
+
/* @__PURE__ */ jsxs("text", {
|
|
166
|
+
x: xOf(mean),
|
|
167
|
+
y: 25,
|
|
168
|
+
textAnchor: "middle",
|
|
169
|
+
fontSize: 10,
|
|
170
|
+
fontWeight: 700,
|
|
171
|
+
fill: GOOD,
|
|
172
|
+
children: ["μ=", mean.toFixed(1)]
|
|
173
|
+
}),
|
|
174
|
+
normal && variance > 0 && /* @__PURE__ */ jsx("polyline", {
|
|
175
|
+
points: Array.from({ length: 121 }, (_, i) => {
|
|
176
|
+
const x = -.5 + i / 120 * (n + 1);
|
|
177
|
+
return `${(ML + (x + .5) * colW).toFixed(1)},${yOf(npdf(x)).toFixed(1)}`;
|
|
178
|
+
}).join(" "),
|
|
179
|
+
fill: "none",
|
|
180
|
+
stroke: "var(--stage-warn)",
|
|
181
|
+
strokeWidth: 2.5,
|
|
182
|
+
strokeDasharray: "6 4"
|
|
183
|
+
})
|
|
184
|
+
]
|
|
185
|
+
})
|
|
186
|
+
});
|
|
187
|
+
return /* @__PURE__ */ jsx(LabFrame, {
|
|
188
|
+
title,
|
|
189
|
+
prompt,
|
|
190
|
+
objectives,
|
|
191
|
+
aside: /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
192
|
+
/* @__PURE__ */ jsxs(Callout, {
|
|
193
|
+
tone: "result",
|
|
194
|
+
children: [
|
|
195
|
+
/* @__PURE__ */ jsx("span", {
|
|
196
|
+
style: {
|
|
197
|
+
fontSize: 12,
|
|
198
|
+
color: "var(--stage-muted)",
|
|
199
|
+
fontWeight: 600
|
|
200
|
+
},
|
|
201
|
+
children: "most likely"
|
|
202
|
+
}),
|
|
203
|
+
/* @__PURE__ */ jsx("span", {
|
|
204
|
+
className: "lab-callout-big",
|
|
205
|
+
children: mode
|
|
206
|
+
}),
|
|
207
|
+
/* @__PURE__ */ jsxs("span", {
|
|
208
|
+
style: {
|
|
209
|
+
fontSize: 12,
|
|
210
|
+
color: "var(--stage-muted)"
|
|
211
|
+
},
|
|
212
|
+
children: [
|
|
213
|
+
/* @__PURE__ */ jsx(Tex$1, { tex: `\\mu = np = ${mean.toFixed(2)}` }),
|
|
214
|
+
" · ",
|
|
215
|
+
/* @__PURE__ */ jsx(Tex$1, { tex: `\\sigma = ${sd.toFixed(2)}` })
|
|
216
|
+
]
|
|
217
|
+
})
|
|
218
|
+
]
|
|
219
|
+
}),
|
|
220
|
+
/* @__PURE__ */ jsx("div", {
|
|
221
|
+
style: { fontSize: 13.5 },
|
|
222
|
+
children: /* @__PURE__ */ jsx(Tex$1, { tex: "P(X=k)=\\binom{n}{k}p^{k}(1-p)^{n-k}" })
|
|
223
|
+
}),
|
|
224
|
+
sel != null ? /* @__PURE__ */ jsxs("div", {
|
|
225
|
+
style: {
|
|
226
|
+
fontSize: 13.5,
|
|
227
|
+
padding: "8px 10px",
|
|
228
|
+
borderRadius: 9,
|
|
229
|
+
background: "color-mix(in oklab, var(--stage-good) 10%, transparent)",
|
|
230
|
+
display: "grid",
|
|
231
|
+
gap: 3
|
|
232
|
+
},
|
|
233
|
+
children: [
|
|
234
|
+
/* @__PURE__ */ jsxs("b", { children: [
|
|
235
|
+
"P(X=",
|
|
236
|
+
sel,
|
|
237
|
+
") = ",
|
|
238
|
+
f3(probs[sel])
|
|
239
|
+
] }),
|
|
240
|
+
/* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsx(Tex$1, { tex: `= \\binom{${n}}{${sel}} \\cdot ${p}^{${sel}} \\cdot ${(1 - p).toFixed(2)}^{${n - sel}}` }) }),
|
|
241
|
+
/* @__PURE__ */ jsxs("span", {
|
|
242
|
+
style: { color: "var(--stage-muted)" },
|
|
243
|
+
children: [
|
|
244
|
+
"= ",
|
|
245
|
+
nCr(n, sel),
|
|
246
|
+
" ways × (each ",
|
|
247
|
+
f3(p ** sel * (1 - p) ** (n - sel)),
|
|
248
|
+
")"
|
|
249
|
+
]
|
|
250
|
+
})
|
|
251
|
+
]
|
|
252
|
+
}) : /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", {
|
|
253
|
+
className: "lab-prompt",
|
|
254
|
+
children: "🎯 Which number of successes is most likely? Guess, then check."
|
|
255
|
+
}), /* @__PURE__ */ jsxs(ControlBar, { children: [
|
|
256
|
+
/* @__PURE__ */ jsx(Field, {
|
|
257
|
+
label: "most likely k",
|
|
258
|
+
children: /* @__PURE__ */ jsx(Stepper, {
|
|
259
|
+
value: guess,
|
|
260
|
+
onChange: (v) => {
|
|
261
|
+
setGuess(v);
|
|
262
|
+
setChecked(false);
|
|
263
|
+
},
|
|
264
|
+
min: 0,
|
|
265
|
+
max: n
|
|
266
|
+
})
|
|
267
|
+
}),
|
|
268
|
+
/* @__PURE__ */ jsx(CheckButton, {
|
|
269
|
+
onClick: () => setChecked(true),
|
|
270
|
+
children: "Check"
|
|
271
|
+
}),
|
|
272
|
+
checked && /* @__PURE__ */ jsx(StatusPill, {
|
|
273
|
+
ok: guess === mode,
|
|
274
|
+
children: guess === mode ? `✓ ${mode}` : `it's ${mode}`
|
|
275
|
+
})
|
|
276
|
+
] })] })
|
|
277
|
+
] }),
|
|
278
|
+
controls: /* @__PURE__ */ jsxs(ControlBar, { children: [
|
|
279
|
+
/* @__PURE__ */ jsx(Field, {
|
|
280
|
+
label: "trials n",
|
|
281
|
+
value: n,
|
|
282
|
+
children: /* @__PURE__ */ jsx(Slider, {
|
|
283
|
+
value: n,
|
|
284
|
+
min: 1,
|
|
285
|
+
max: 24,
|
|
286
|
+
step: 1,
|
|
287
|
+
onChange: (v) => {
|
|
288
|
+
setN(v);
|
|
289
|
+
setChecked(false);
|
|
290
|
+
},
|
|
291
|
+
ariaLabel: "trials"
|
|
292
|
+
})
|
|
293
|
+
}),
|
|
294
|
+
/* @__PURE__ */ jsx(Field, {
|
|
295
|
+
label: "success p",
|
|
296
|
+
value: p.toFixed(2),
|
|
297
|
+
children: /* @__PURE__ */ jsx(Slider, {
|
|
298
|
+
value: p,
|
|
299
|
+
min: 0,
|
|
300
|
+
max: 1,
|
|
301
|
+
step: .01,
|
|
302
|
+
onChange: setP,
|
|
303
|
+
ariaLabel: "success probability"
|
|
304
|
+
})
|
|
305
|
+
}),
|
|
306
|
+
/* @__PURE__ */ jsx(Field, {
|
|
307
|
+
label: "normal",
|
|
308
|
+
children: /* @__PURE__ */ jsx(Chip, {
|
|
309
|
+
selected: normal,
|
|
310
|
+
onClick: () => setNormal((v) => !v),
|
|
311
|
+
children: "bell overlay"
|
|
312
|
+
})
|
|
313
|
+
}),
|
|
314
|
+
sel != null && /* @__PURE__ */ jsx(Chip, {
|
|
315
|
+
selected: false,
|
|
316
|
+
onClick: () => setSel(null),
|
|
317
|
+
children: "clear inspect"
|
|
318
|
+
})
|
|
319
|
+
] }),
|
|
320
|
+
footer: /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("p", {
|
|
321
|
+
className: "lab-prompt",
|
|
322
|
+
style: {
|
|
323
|
+
fontSize: 12.5,
|
|
324
|
+
color: "var(--stage-muted)"
|
|
325
|
+
},
|
|
326
|
+
children: "Coefficients are Pascal's row n; at p = ½ it's that row ÷ 2ⁿ. Crank n with the bell overlay → the binomial becomes the normal (the Galton board)."
|
|
327
|
+
}), /* @__PURE__ */ jsx(HintLadder, { hints })] }),
|
|
328
|
+
children: figure
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
//#endregion
|
|
333
|
+
export { BinomialDistributionLab };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
//#region src/discrete/core/combinatorics.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Combinatorics kernel — the counting source-of-truth every discrete-math lab
|
|
4
|
+
* trusts (so an agent narrates these, never computes its own). Pure, integer,
|
|
5
|
+
* dependency-free. The headline identity the Counting lab is built on:
|
|
6
|
+
* nCr(n,k) = nPr(n,k) / k! ("overcount by order, then divide it out").
|
|
7
|
+
*/
|
|
8
|
+
declare function factorial(n: number): number;
|
|
9
|
+
/** Ordered selections: n·(n−1)···(n−r+1). */
|
|
10
|
+
declare function nPr(n: number, r: number): number;
|
|
11
|
+
/** Unordered selections: nPr/k!, via the exact step-wise multiplicative form. */
|
|
12
|
+
declare function nCr(n: number, r: number): number;
|
|
13
|
+
/** Binomial coefficient — alias of nCr (the "n choose k"). */
|
|
14
|
+
declare const binomial: typeof nCr;
|
|
15
|
+
/** Arrangements of a multiset: n! / (k1! k2! …), where Σki = n. */
|
|
16
|
+
declare function multinomial(...counts: number[]): number;
|
|
17
|
+
/** Stars and bars: ways to place n identical items into k distinct bins =
|
|
18
|
+
* C(n+k−1, k−1). */
|
|
19
|
+
declare function starsAndBars(n: number, k: number): number;
|
|
20
|
+
declare function gcd(a: number, b: number): number;
|
|
21
|
+
declare function lcm(a: number, b: number): number;
|
|
22
|
+
//#endregion
|
|
23
|
+
export { binomial, factorial, gcd, lcm, multinomial, nCr, nPr, starsAndBars };
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
//#region src/discrete/core/combinatorics.ts
|
|
2
|
+
/**
|
|
3
|
+
* Combinatorics kernel — the counting source-of-truth every discrete-math lab
|
|
4
|
+
* trusts (so an agent narrates these, never computes its own). Pure, integer,
|
|
5
|
+
* dependency-free. The headline identity the Counting lab is built on:
|
|
6
|
+
* nCr(n,k) = nPr(n,k) / k! ("overcount by order, then divide it out").
|
|
7
|
+
*/
|
|
8
|
+
const isCount = (n) => Number.isInteger(n) && n >= 0;
|
|
9
|
+
function factorial(n) {
|
|
10
|
+
if (!isCount(n)) return NaN;
|
|
11
|
+
let r = 1;
|
|
12
|
+
for (let i = 2; i <= n; i++) r *= i;
|
|
13
|
+
return r;
|
|
14
|
+
}
|
|
15
|
+
/** Ordered selections: n·(n−1)···(n−r+1). */
|
|
16
|
+
function nPr(n, r) {
|
|
17
|
+
if (!isCount(n) || !isCount(r) || r > n) return r > n ? 0 : NaN;
|
|
18
|
+
let r0 = 1;
|
|
19
|
+
for (let i = 0; i < r; i++) r0 *= n - i;
|
|
20
|
+
return r0;
|
|
21
|
+
}
|
|
22
|
+
/** Unordered selections: nPr/k!, via the exact step-wise multiplicative form. */
|
|
23
|
+
function nCr(n, r) {
|
|
24
|
+
if (!isCount(n) || !isCount(r)) return NaN;
|
|
25
|
+
if (r > n) return 0;
|
|
26
|
+
const k = Math.min(r, n - r);
|
|
27
|
+
let res = 1;
|
|
28
|
+
for (let i = 1; i <= k; i++) res = res * (n - k + i) / i;
|
|
29
|
+
return Math.round(res);
|
|
30
|
+
}
|
|
31
|
+
/** Binomial coefficient — alias of nCr (the "n choose k"). */
|
|
32
|
+
const binomial = nCr;
|
|
33
|
+
/** Arrangements of a multiset: n! / (k1! k2! …), where Σki = n. */
|
|
34
|
+
function multinomial(...counts) {
|
|
35
|
+
let res = factorial(counts.reduce((s, c) => s + c, 0));
|
|
36
|
+
for (const c of counts) res /= factorial(c);
|
|
37
|
+
return Math.round(res);
|
|
38
|
+
}
|
|
39
|
+
/** Stars and bars: ways to place n identical items into k distinct bins =
|
|
40
|
+
* C(n+k−1, k−1). */
|
|
41
|
+
function starsAndBars(n, k) {
|
|
42
|
+
if (!isCount(n) || !isCount(k) || k < 1) return NaN;
|
|
43
|
+
return nCr(n + k - 1, k - 1);
|
|
44
|
+
}
|
|
45
|
+
function gcd(a, b) {
|
|
46
|
+
a = Math.abs(a);
|
|
47
|
+
b = Math.abs(b);
|
|
48
|
+
while (b) [a, b] = [b, a % b];
|
|
49
|
+
return a;
|
|
50
|
+
}
|
|
51
|
+
function lcm(a, b) {
|
|
52
|
+
if (a === 0 || b === 0) return 0;
|
|
53
|
+
return Math.abs(a / gcd(a, b) * b);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
//#endregion
|
|
57
|
+
export { binomial, factorial, gcd, lcm, multinomial, nCr, nPr, starsAndBars };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Elem } from "./sets.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/discrete/core/inclusionExclusion.d.ts
|
|
4
|
+
interface IETerm {
|
|
5
|
+
/** Which input sets this term intersects (indices into `sets`). */
|
|
6
|
+
indices: number[];
|
|
7
|
+
size: number;
|
|
8
|
+
/** +1 for odd-sized subsets, −1 for even (the alternating sign). */
|
|
9
|
+
sign: 1 | -1;
|
|
10
|
+
}
|
|
11
|
+
interface IEResult {
|
|
12
|
+
/** |A ∪ B ∪ …| via inclusion–exclusion. */
|
|
13
|
+
unionSize: number;
|
|
14
|
+
/** The signed terms, in increasing subset size. */
|
|
15
|
+
terms: IETerm[];
|
|
16
|
+
}
|
|
17
|
+
declare function inclusionExclusion<T extends Elem>(sets: readonly (readonly T[])[]): IEResult;
|
|
18
|
+
//#endregion
|
|
19
|
+
export { IEResult, IETerm, inclusionExclusion };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { intersection } from "./sets.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/discrete/core/inclusionExclusion.ts
|
|
4
|
+
function inclusionExclusion(sets) {
|
|
5
|
+
const n = sets.length;
|
|
6
|
+
if (n > 16) throw new Error("inclusionExclusion: too many sets (max 16)");
|
|
7
|
+
const terms = [];
|
|
8
|
+
let unionSize = 0;
|
|
9
|
+
for (let mask = 1; mask < 1 << n; mask++) {
|
|
10
|
+
const indices = [];
|
|
11
|
+
for (let i = 0; i < n; i++) if (mask & 1 << i) indices.push(i);
|
|
12
|
+
let acc = sets[indices[0]];
|
|
13
|
+
for (let j = 1; j < indices.length; j++) acc = intersection(acc, sets[indices[j]]);
|
|
14
|
+
const sign = indices.length % 2 === 1 ? 1 : -1;
|
|
15
|
+
terms.push({
|
|
16
|
+
indices,
|
|
17
|
+
size: acc.length,
|
|
18
|
+
sign
|
|
19
|
+
});
|
|
20
|
+
unionSize += sign * acc.length;
|
|
21
|
+
}
|
|
22
|
+
terms.sort((a, b) => a.indices.length - b.indices.length);
|
|
23
|
+
return {
|
|
24
|
+
unionSize,
|
|
25
|
+
terms
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
//#endregion
|
|
30
|
+
export { inclusionExclusion };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
//#region src/discrete/core/pigeonhole.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Pigeonhole kernel — the certainty math behind "guarantee ≠ likely". With more
|
|
4
|
+
* pigeons than holes some hole holds ≥ ⌈n/k⌉. The lab's adversary deals the
|
|
5
|
+
* worst case; these functions say exactly when a collision is FORCED.
|
|
6
|
+
*/
|
|
7
|
+
/** The guaranteed max occupancy: ⌈pigeons / holes⌉. */
|
|
8
|
+
declare function guaranteedOccupancy(pigeons: number, holes: number): number;
|
|
9
|
+
/** Fewest draws that FORCE a repeat across `holes` categories (k+1). */
|
|
10
|
+
declare function minToGuaranteePair(holes: number): number;
|
|
11
|
+
/** Fewest pigeons that force some hole to reach `occupancy`:
|
|
12
|
+
* holes·(occupancy−1) + 1 (the adversary fills every hole to occupancy−1 first). */
|
|
13
|
+
declare function minForOccupancy(holes: number, occupancy: number): number;
|
|
14
|
+
//#endregion
|
|
15
|
+
export { guaranteedOccupancy, minForOccupancy, minToGuaranteePair };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
//#region src/discrete/core/pigeonhole.ts
|
|
2
|
+
/**
|
|
3
|
+
* Pigeonhole kernel — the certainty math behind "guarantee ≠ likely". With more
|
|
4
|
+
* pigeons than holes some hole holds ≥ ⌈n/k⌉. The lab's adversary deals the
|
|
5
|
+
* worst case; these functions say exactly when a collision is FORCED.
|
|
6
|
+
*/
|
|
7
|
+
/** The guaranteed max occupancy: ⌈pigeons / holes⌉. */
|
|
8
|
+
function guaranteedOccupancy(pigeons, holes) {
|
|
9
|
+
if (holes <= 0) return Infinity;
|
|
10
|
+
return Math.ceil(pigeons / holes);
|
|
11
|
+
}
|
|
12
|
+
/** Fewest draws that FORCE a repeat across `holes` categories (k+1). */
|
|
13
|
+
function minToGuaranteePair(holes) {
|
|
14
|
+
return holes + 1;
|
|
15
|
+
}
|
|
16
|
+
/** Fewest pigeons that force some hole to reach `occupancy`:
|
|
17
|
+
* holes·(occupancy−1) + 1 (the adversary fills every hole to occupancy−1 first). */
|
|
18
|
+
function minForOccupancy(holes, occupancy) {
|
|
19
|
+
if (holes <= 0 || occupancy <= 0) return NaN;
|
|
20
|
+
return holes * (occupancy - 1) + 1;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
//#endregion
|
|
24
|
+
export { guaranteedOccupancy, minForOccupancy, minToGuaranteePair };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
//#region src/discrete/core/probability.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Probability kernel — equally-likely sample spaces, conditioning, Bayes,
|
|
4
|
+
* independence, expectation. This is the "truth" the base-rate / Monty labs read
|
|
5
|
+
* (the agent narrates these numbers; it never invents them). Conditioning =
|
|
6
|
+
* shrink the sample space: P(A|B) = |A∩B| / |B|.
|
|
7
|
+
*/
|
|
8
|
+
/** Favourable / total over an equally-likely space. */
|
|
9
|
+
declare function probability(favorable: number, total: number): number;
|
|
10
|
+
declare function complement(p: number): number;
|
|
11
|
+
/** P(A|B) = P(A∩B) / P(B) — restrict the world to B, then re-count. */
|
|
12
|
+
declare function conditional(pAandB: number, pB: number): number;
|
|
13
|
+
/**
|
|
14
|
+
* P(A|B) from the natural inputs: the true-positive rate P(B|A), the prior P(A),
|
|
15
|
+
* and the false-positive rate P(B|¬A). The base-rate-neglect engine.
|
|
16
|
+
*/
|
|
17
|
+
declare function bayes(pBgivenA: number, pA: number, pBgivenNotA: number): number;
|
|
18
|
+
/** A and B are independent iff P(A∩B) = P(A)·P(B) (within eps). NOT the same as
|
|
19
|
+
* disjoint — disjoint events are maximally DEPENDENT. */
|
|
20
|
+
declare function independent(pA: number, pB: number, pAandB: number, eps?: number): boolean;
|
|
21
|
+
/** Expected value Σ p·value (probabilities should sum to 1). */
|
|
22
|
+
declare function expectedValue(outcomes: ReadonlyArray<{
|
|
23
|
+
p: number;
|
|
24
|
+
value: number;
|
|
25
|
+
}>): number;
|
|
26
|
+
/** "At least one" via the complement: 1 − (1−p)^n. */
|
|
27
|
+
declare function atLeastOne(pEach: number, n: number): number;
|
|
28
|
+
//#endregion
|
|
29
|
+
export { atLeastOne, bayes, complement, conditional, expectedValue, independent, probability };
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
//#region src/discrete/core/probability.ts
|
|
2
|
+
/**
|
|
3
|
+
* Probability kernel — equally-likely sample spaces, conditioning, Bayes,
|
|
4
|
+
* independence, expectation. This is the "truth" the base-rate / Monty labs read
|
|
5
|
+
* (the agent narrates these numbers; it never invents them). Conditioning =
|
|
6
|
+
* shrink the sample space: P(A|B) = |A∩B| / |B|.
|
|
7
|
+
*/
|
|
8
|
+
/** Favourable / total over an equally-likely space. */
|
|
9
|
+
function probability(favorable, total) {
|
|
10
|
+
return total > 0 ? favorable / total : NaN;
|
|
11
|
+
}
|
|
12
|
+
function complement(p) {
|
|
13
|
+
return 1 - p;
|
|
14
|
+
}
|
|
15
|
+
/** P(A|B) = P(A∩B) / P(B) — restrict the world to B, then re-count. */
|
|
16
|
+
function conditional(pAandB, pB) {
|
|
17
|
+
return pB > 0 ? pAandB / pB : NaN;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* P(A|B) from the natural inputs: the true-positive rate P(B|A), the prior P(A),
|
|
21
|
+
* and the false-positive rate P(B|¬A). The base-rate-neglect engine.
|
|
22
|
+
*/
|
|
23
|
+
function bayes(pBgivenA, pA, pBgivenNotA) {
|
|
24
|
+
const num = pBgivenA * pA;
|
|
25
|
+
const den = num + pBgivenNotA * (1 - pA);
|
|
26
|
+
return den > 0 ? num / den : NaN;
|
|
27
|
+
}
|
|
28
|
+
/** A and B are independent iff P(A∩B) = P(A)·P(B) (within eps). NOT the same as
|
|
29
|
+
* disjoint — disjoint events are maximally DEPENDENT. */
|
|
30
|
+
function independent(pA, pB, pAandB, eps = 1e-9) {
|
|
31
|
+
return Math.abs(pAandB - pA * pB) <= eps;
|
|
32
|
+
}
|
|
33
|
+
/** Expected value Σ p·value (probabilities should sum to 1). */
|
|
34
|
+
function expectedValue(outcomes) {
|
|
35
|
+
return outcomes.reduce((s, o) => s + o.p * o.value, 0);
|
|
36
|
+
}
|
|
37
|
+
/** "At least one" via the complement: 1 − (1−p)^n. */
|
|
38
|
+
function atLeastOne(pEach, n) {
|
|
39
|
+
return 1 - Math.pow(1 - pEach, n);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
//#endregion
|
|
43
|
+
export { atLeastOne, bayes, complement, conditional, expectedValue, independent, probability };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
//#region src/discrete/core/sets.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Finite-set kernel — set algebra over arrays of primitives (the Venn /
|
|
4
|
+
* inclusion–exclusion labs run on these). De Morgan here mirrors the logic
|
|
5
|
+
* kernel's De Morgan: ∩↔∧, ∪↔∨, complement↔¬ (the "trinity" spine). Order is
|
|
6
|
+
* first-seen (insertion) and duplicates are collapsed, so results are clean sets.
|
|
7
|
+
*/
|
|
8
|
+
type Elem = string | number;
|
|
9
|
+
declare function union<T extends Elem>(a: readonly T[], b: readonly T[]): T[];
|
|
10
|
+
declare function intersection<T extends Elem>(a: readonly T[], b: readonly T[]): T[];
|
|
11
|
+
declare function difference<T extends Elem>(a: readonly T[], b: readonly T[]): T[];
|
|
12
|
+
declare function symmetricDifference<T extends Elem>(a: readonly T[], b: readonly T[]): T[];
|
|
13
|
+
/** Aᶜ within a universe. */
|
|
14
|
+
declare function complement<T extends Elem>(a: readonly T[], universe: readonly T[]): T[];
|
|
15
|
+
declare function isSubset<T extends Elem>(a: readonly T[], b: readonly T[]): boolean;
|
|
16
|
+
declare function setEqual<T extends Elem>(a: readonly T[], b: readonly T[]): boolean;
|
|
17
|
+
/** All 2^|a| subsets. */
|
|
18
|
+
declare function powerset<T extends Elem>(a: readonly T[]): T[][];
|
|
19
|
+
declare function cartesian<A extends Elem, B extends Elem>(a: readonly A[], b: readonly B[]): [A, B][];
|
|
20
|
+
//#endregion
|
|
21
|
+
export { Elem, cartesian, complement, difference, intersection, isSubset, powerset, setEqual, symmetricDifference, union };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
//#region src/discrete/core/sets.ts
|
|
2
|
+
const dedupe = (xs) => [...new Set(xs)];
|
|
3
|
+
function union(a, b) {
|
|
4
|
+
return dedupe([...a, ...b]);
|
|
5
|
+
}
|
|
6
|
+
function intersection(a, b) {
|
|
7
|
+
const bs = new Set(b);
|
|
8
|
+
return dedupe(a.filter((x) => bs.has(x)));
|
|
9
|
+
}
|
|
10
|
+
function difference(a, b) {
|
|
11
|
+
const bs = new Set(b);
|
|
12
|
+
return dedupe(a.filter((x) => !bs.has(x)));
|
|
13
|
+
}
|
|
14
|
+
function symmetricDifference(a, b) {
|
|
15
|
+
return union(difference(a, b), difference(b, a));
|
|
16
|
+
}
|
|
17
|
+
/** Aᶜ within a universe. */
|
|
18
|
+
function complement(a, universe) {
|
|
19
|
+
return difference(universe, a);
|
|
20
|
+
}
|
|
21
|
+
function isSubset(a, b) {
|
|
22
|
+
const bs = new Set(b);
|
|
23
|
+
return dedupe(a).every((x) => bs.has(x));
|
|
24
|
+
}
|
|
25
|
+
function setEqual(a, b) {
|
|
26
|
+
return isSubset(a, b) && isSubset(b, a);
|
|
27
|
+
}
|
|
28
|
+
/** All 2^|a| subsets. */
|
|
29
|
+
function powerset(a) {
|
|
30
|
+
const s = dedupe(a);
|
|
31
|
+
const out = [[]];
|
|
32
|
+
for (const x of s) {
|
|
33
|
+
const len = out.length;
|
|
34
|
+
for (let i = 0; i < len; i++) out.push([...out[i], x]);
|
|
35
|
+
}
|
|
36
|
+
return out;
|
|
37
|
+
}
|
|
38
|
+
function cartesian(a, b) {
|
|
39
|
+
const out = [];
|
|
40
|
+
for (const x of a) for (const y of b) out.push([x, y]);
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
//#endregion
|
|
45
|
+
export { cartesian, complement, difference, intersection, isSubset, powerset, setEqual, symmetricDifference, union };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
|
|
3
|
+
//#region src/discrete/counting-slots/preset.d.ts
|
|
4
|
+
type SlotMode = 'arrange' | 'choose';
|
|
5
|
+
interface CountingSlotsProps {
|
|
6
|
+
items?: string[];
|
|
7
|
+
slots?: number;
|
|
8
|
+
positions?: string[];
|
|
9
|
+
mode?: SlotMode;
|
|
10
|
+
replacement?: boolean;
|
|
11
|
+
title?: string;
|
|
12
|
+
prompt?: string;
|
|
13
|
+
objectives?: string[];
|
|
14
|
+
hints?: string[];
|
|
15
|
+
controlId?: string;
|
|
16
|
+
}
|
|
17
|
+
declare function CountingSlotsLab({
|
|
18
|
+
items,
|
|
19
|
+
slots,
|
|
20
|
+
positions,
|
|
21
|
+
mode: mode0,
|
|
22
|
+
replacement: repl0,
|
|
23
|
+
title,
|
|
24
|
+
prompt,
|
|
25
|
+
objectives,
|
|
26
|
+
hints: hintList,
|
|
27
|
+
controlId
|
|
28
|
+
}: CountingSlotsProps): ReactNode;
|
|
29
|
+
//#endregion
|
|
30
|
+
export { CountingSlotsLab, CountingSlotsProps, SlotMode };
|