@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.
Files changed (547) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +105 -0
  3. package/dist/biology/enzyme-rate/index.d.mts +1 -0
  4. package/dist/biology/enzyme-rate/preset.d.mts +25 -0
  5. package/dist/biology/enzyme-rate/preset.mjs +256 -0
  6. package/dist/biology/genetic-cross/core.d.mts +64 -0
  7. package/dist/biology/genetic-cross/core.mjs +147 -0
  8. package/dist/biology/genetic-cross/grid.mjs +239 -0
  9. package/dist/biology/genetic-cross/index.d.mts +3 -0
  10. package/dist/biology/genetic-cross/preset.d.mts +26 -0
  11. package/dist/biology/genetic-cross/preset.mjs +184 -0
  12. package/dist/biology/genetic-cross/sex-linked.d.mts +27 -0
  13. package/dist/biology/genetic-cross/sex-linked.mjs +226 -0
  14. package/dist/biology/index.d.mts +11 -0
  15. package/dist/biology/index.mjs +12 -0
  16. package/dist/biology/photosynthesis-factors/index.d.mts +1 -0
  17. package/dist/biology/photosynthesis-factors/preset.d.mts +25 -0
  18. package/dist/biology/photosynthesis-factors/preset.mjs +270 -0
  19. package/dist/biology/punnett-cross/index.d.mts +1 -0
  20. package/dist/biology/punnett-cross/preset.d.mts +27 -0
  21. package/dist/biology/punnett-cross/preset.mjs +21 -0
  22. package/dist/biology/respiration/index.d.mts +1 -0
  23. package/dist/biology/respiration/preset.d.mts +17 -0
  24. package/dist/biology/respiration/preset.mjs +179 -0
  25. package/dist/biology/sequence/central-dogma.d.mts +17 -0
  26. package/dist/biology/sequence/central-dogma.mjs +339 -0
  27. package/dist/biology/sequence/core.d.mts +38 -0
  28. package/dist/biology/sequence/core.mjs +178 -0
  29. package/dist/biology/sequence/index.d.mts +3 -0
  30. package/dist/biology/sequence/preset.d.mts +20 -0
  31. package/dist/biology/sequence/preset.mjs +235 -0
  32. package/dist/blocks/accounting.d.mts +142 -0
  33. package/dist/blocks/accounting.mjs +446 -0
  34. package/dist/blocks/authoring.d.mts +12 -0
  35. package/dist/blocks/authoring.mjs +705 -0
  36. package/dist/blocks/biology.d.mts +197 -0
  37. package/dist/blocks/biology.mjs +513 -0
  38. package/dist/blocks/chem.d.mts +128 -0
  39. package/dist/blocks/chem.mjs +486 -0
  40. package/dist/blocks/circuits.d.mts +86 -0
  41. package/dist/blocks/circuits.mjs +348 -0
  42. package/dist/blocks/discrete.d.mts +62 -0
  43. package/dist/blocks/discrete.mjs +314 -0
  44. package/dist/blocks/economics.d.mts +56 -0
  45. package/dist/blocks/economics.mjs +203 -0
  46. package/dist/blocks/geography.d.mts +58 -0
  47. package/dist/blocks/geography.mjs +115 -0
  48. package/dist/blocks/geometry.d.mts +28 -0
  49. package/dist/blocks/geometry.mjs +160 -0
  50. package/dist/blocks/ict.d.mts +65 -0
  51. package/dist/blocks/ict.mjs +197 -0
  52. package/dist/blocks/index.d.mts +4555 -0
  53. package/dist/blocks/index.mjs +120 -0
  54. package/dist/blocks/lab-block.d.mts +16 -0
  55. package/dist/blocks/lab-block.mjs +74 -0
  56. package/dist/blocks/lab-config.d.mts +23 -0
  57. package/dist/blocks/lab-config.mjs +200 -0
  58. package/dist/blocks/lab-gallery.d.mts +30 -0
  59. package/dist/blocks/lab-gallery.mjs +208 -0
  60. package/dist/blocks/language.d.mts +349 -0
  61. package/dist/blocks/language.mjs +750 -0
  62. package/dist/blocks/lesson.d.mts +43 -0
  63. package/dist/blocks/lesson.mjs +140 -0
  64. package/dist/blocks/math.d.mts +411 -0
  65. package/dist/blocks/math.mjs +1536 -0
  66. package/dist/blocks/ml.d.mts +84 -0
  67. package/dist/blocks/ml.mjs +146 -0
  68. package/dist/blocks/physics.d.mts +259 -0
  69. package/dist/blocks/physics.mjs +868 -0
  70. package/dist/blocks/statistics.d.mts +29 -0
  71. package/dist/blocks/statistics.mjs +123 -0
  72. package/dist/catalog/index.d.mts +3 -0
  73. package/dist/catalog/index.mjs +8 -0
  74. package/dist/catalog/registry.d.mts +46 -0
  75. package/dist/catalog/registry.mjs +56 -0
  76. package/dist/catalog/templates.d.mts +11 -0
  77. package/dist/catalog/templates.mjs +141 -0
  78. package/dist/chem/battery.d.mts +16 -0
  79. package/dist/chem/battery.mjs +311 -0
  80. package/dist/chem/bohr-atom.d.mts +16 -0
  81. package/dist/chem/bohr-atom.mjs +212 -0
  82. package/dist/chem/diffusion/asset.mjs +76 -0
  83. package/dist/chem/diffusion/index.d.mts +1 -0
  84. package/dist/chem/diffusion/preset.d.mts +15 -0
  85. package/dist/chem/diffusion/preset.mjs +188 -0
  86. package/dist/chem/electrochem/index.d.mts +1 -0
  87. package/dist/chem/electrochem/preset.d.mts +23 -0
  88. package/dist/chem/electrochem/preset.mjs +402 -0
  89. package/dist/chem/equilibrium/index.d.mts +1 -0
  90. package/dist/chem/equilibrium/preset.d.mts +36 -0
  91. package/dist/chem/equilibrium/preset.mjs +416 -0
  92. package/dist/chem/gas-box/index.d.mts +1 -0
  93. package/dist/chem/gas-box/preset.d.mts +27 -0
  94. package/dist/chem/gas-box/preset.mjs +395 -0
  95. package/dist/chem/index.d.mts +16 -0
  96. package/dist/chem/index.mjs +17 -0
  97. package/dist/chem/kinetics/index.d.mts +1 -0
  98. package/dist/chem/kinetics/preset.d.mts +31 -0
  99. package/dist/chem/kinetics/preset.mjs +478 -0
  100. package/dist/chem/periodic-trends/index.d.mts +1 -0
  101. package/dist/chem/periodic-trends/preset.d.mts +21 -0
  102. package/dist/chem/periodic-trends/preset.mjs +831 -0
  103. package/dist/chem/reaction-lab.d.mts +18 -0
  104. package/dist/chem/reaction-lab.mjs +165 -0
  105. package/dist/chem/reaction-profile.d.mts +21 -0
  106. package/dist/chem/reaction-profile.mjs +287 -0
  107. package/dist/chem/solution/dilution.d.mts +27 -0
  108. package/dist/chem/solution/dilution.mjs +199 -0
  109. package/dist/chem/solution/field.d.mts +30 -0
  110. package/dist/chem/solution/field.mjs +145 -0
  111. package/dist/chem/solution/index.d.mts +3 -0
  112. package/dist/chem/solution/solution-box.d.mts +28 -0
  113. package/dist/chem/solution/solution-box.mjs +140 -0
  114. package/dist/chem/stoichiometry/index.d.mts +1 -0
  115. package/dist/chem/stoichiometry/preset.d.mts +29 -0
  116. package/dist/chem/stoichiometry/preset.mjs +392 -0
  117. package/dist/chem/titration/index.d.mts +1 -0
  118. package/dist/chem/titration/preset.d.mts +29 -0
  119. package/dist/chem/titration/preset.mjs +436 -0
  120. package/dist/circuits/ac-dc/asset.mjs +295 -0
  121. package/dist/circuits/ac-dc/index.d.mts +1 -0
  122. package/dist/circuits/ac-dc/preset.d.mts +16 -0
  123. package/dist/circuits/ac-dc/preset.mjs +134 -0
  124. package/dist/circuits/capacitor-leak/index.d.mts +1 -0
  125. package/dist/circuits/capacitor-leak/preset.d.mts +32 -0
  126. package/dist/circuits/capacitor-leak/preset.mjs +271 -0
  127. package/dist/circuits/circuit/asset.d.mts +6 -0
  128. package/dist/circuits/circuit/asset.mjs +367 -0
  129. package/dist/circuits/circuit/index.d.mts +2 -0
  130. package/dist/circuits/circuit/preset.d.mts +46 -0
  131. package/dist/circuits/circuit/preset.mjs +235 -0
  132. package/dist/circuits/circuit-builder.d.mts +30 -0
  133. package/dist/circuits/circuit-builder.mjs +412 -0
  134. package/dist/circuits/circuit-lab.d.mts +20 -0
  135. package/dist/circuits/circuit-lab.mjs +400 -0
  136. package/dist/circuits/index.d.mts +7 -0
  137. package/dist/circuits/index.mjs +8 -0
  138. package/dist/commerce/accounting/core.d.mts +48 -0
  139. package/dist/commerce/accounting/core.mjs +57 -0
  140. package/dist/commerce/accounting/equation-balance.d.mts +35 -0
  141. package/dist/commerce/accounting/equation-balance.mjs +292 -0
  142. package/dist/commerce/accounting/index.d.mts +4 -0
  143. package/dist/commerce/accounting/journal-poster.d.mts +29 -0
  144. package/dist/commerce/accounting/journal-poster.mjs +472 -0
  145. package/dist/commerce/accounting/statement-sorter.d.mts +25 -0
  146. package/dist/commerce/accounting/statement-sorter.mjs +304 -0
  147. package/dist/commerce/economics/core.d.mts +33 -0
  148. package/dist/commerce/economics/core.mjs +26 -0
  149. package/dist/commerce/economics/demand-shift-vs-move.d.mts +35 -0
  150. package/dist/commerce/economics/demand-shift-vs-move.mjs +324 -0
  151. package/dist/commerce/economics/elasticity-revenue.d.mts +31 -0
  152. package/dist/commerce/economics/elasticity-revenue.mjs +253 -0
  153. package/dist/commerce/economics/index.d.mts +4 -0
  154. package/dist/commerce/economics/market-equilibrium.d.mts +33 -0
  155. package/dist/commerce/economics/market-equilibrium.mjs +340 -0
  156. package/dist/commerce/index.d.mts +9 -0
  157. package/dist/commerce/index.mjs +10 -0
  158. package/dist/core/easing.d.mts +28 -0
  159. package/dist/core/easing.mjs +66 -0
  160. package/dist/core/index.d.mts +10 -0
  161. package/dist/core/index.mjs +11 -0
  162. package/dist/core/numeric.d.mts +37 -0
  163. package/dist/core/numeric.mjs +75 -0
  164. package/dist/core/reactive.d.mts +24 -0
  165. package/dist/core/reactive.mjs +51 -0
  166. package/dist/core/rng.d.mts +21 -0
  167. package/dist/core/rng.mjs +39 -0
  168. package/dist/core/tex.d.mts +14 -0
  169. package/dist/core/tex.mjs +44 -0
  170. package/dist/core/timeline.d.mts +34 -0
  171. package/dist/core/timeline.mjs +77 -0
  172. package/dist/core/util.d.mts +19 -0
  173. package/dist/core/util.mjs +31 -0
  174. package/dist/discrete/arrangements/preset.d.mts +28 -0
  175. package/dist/discrete/arrangements/preset.mjs +304 -0
  176. package/dist/discrete/bayes/preset.d.mts +33 -0
  177. package/dist/discrete/bayes/preset.mjs +476 -0
  178. package/dist/discrete/binomial/preset.d.mts +25 -0
  179. package/dist/discrete/binomial/preset.mjs +333 -0
  180. package/dist/discrete/core/combinatorics.d.mts +23 -0
  181. package/dist/discrete/core/combinatorics.mjs +57 -0
  182. package/dist/discrete/core/inclusionExclusion.d.mts +19 -0
  183. package/dist/discrete/core/inclusionExclusion.mjs +30 -0
  184. package/dist/discrete/core/pigeonhole.d.mts +15 -0
  185. package/dist/discrete/core/pigeonhole.mjs +24 -0
  186. package/dist/discrete/core/probability.d.mts +29 -0
  187. package/dist/discrete/core/probability.mjs +43 -0
  188. package/dist/discrete/core/sets.d.mts +21 -0
  189. package/dist/discrete/core/sets.mjs +45 -0
  190. package/dist/discrete/counting-slots/preset.d.mts +30 -0
  191. package/dist/discrete/counting-slots/preset.mjs +553 -0
  192. package/dist/discrete/counting-tree/index.d.mts +1 -0
  193. package/dist/discrete/counting-tree/preset.d.mts +44 -0
  194. package/dist/discrete/counting-tree/preset.mjs +364 -0
  195. package/dist/discrete/expected-value/preset.d.mts +28 -0
  196. package/dist/discrete/expected-value/preset.mjs +352 -0
  197. package/dist/discrete/hypergeometric/preset.d.mts +25 -0
  198. package/dist/discrete/hypergeometric/preset.mjs +330 -0
  199. package/dist/discrete/index.d.mts +26 -0
  200. package/dist/discrete/index.mjs +27 -0
  201. package/dist/discrete/karnaugh/index.d.mts +1 -0
  202. package/dist/discrete/karnaugh/preset.d.mts +30 -0
  203. package/dist/discrete/karnaugh/preset.mjs +452 -0
  204. package/dist/discrete/lln/asset.mjs +206 -0
  205. package/dist/discrete/lln/index.d.mts +1 -0
  206. package/dist/discrete/lln/preset.d.mts +17 -0
  207. package/dist/discrete/lln/preset.mjs +152 -0
  208. package/dist/discrete/logic-circuit/index.d.mts +1 -0
  209. package/dist/discrete/logic-circuit/preset.d.mts +47 -0
  210. package/dist/discrete/logic-circuit/preset.mjs +307 -0
  211. package/dist/discrete/monte-carlo/index.d.mts +1 -0
  212. package/dist/discrete/monte-carlo/preset.d.mts +64 -0
  213. package/dist/discrete/monte-carlo/preset.mjs +446 -0
  214. package/dist/discrete/monty-hall/index.d.mts +1 -0
  215. package/dist/discrete/monty-hall/preset.d.mts +23 -0
  216. package/dist/discrete/monty-hall/preset.mjs +491 -0
  217. package/dist/discrete/outcome-builder/preset.d.mts +24 -0
  218. package/dist/discrete/outcome-builder/preset.mjs +283 -0
  219. package/dist/discrete/pascal/preset.d.mts +24 -0
  220. package/dist/discrete/pascal/preset.mjs +372 -0
  221. package/dist/discrete/sample-space/index.d.mts +1 -0
  222. package/dist/discrete/sample-space/preset.d.mts +42 -0
  223. package/dist/discrete/sample-space/preset.mjs +395 -0
  224. package/dist/discrete/selection/preset.d.mts +33 -0
  225. package/dist/discrete/selection/preset.mjs +406 -0
  226. package/dist/discrete/truth-table/index.d.mts +1 -0
  227. package/dist/discrete/truth-table/preset.d.mts +30 -0
  228. package/dist/discrete/truth-table/preset.mjs +456 -0
  229. package/dist/discrete/venn/index.d.mts +1 -0
  230. package/dist/discrete/venn/preset.d.mts +32 -0
  231. package/dist/discrete/venn/preset.mjs +461 -0
  232. package/dist/geography/cycle-lab/index.d.mts +1 -0
  233. package/dist/geography/cycle-lab/preset.d.mts +25 -0
  234. package/dist/geography/cycle-lab/preset.mjs +254 -0
  235. package/dist/geography/cycles.d.mts +21 -0
  236. package/dist/geography/cycles.mjs +205 -0
  237. package/dist/geography/index.d.mts +4 -0
  238. package/dist/geography/index.mjs +5 -0
  239. package/dist/geometry/board/index.d.mts +1 -0
  240. package/dist/geometry/board/preset.d.mts +71 -0
  241. package/dist/geometry/board/preset.mjs +148 -0
  242. package/dist/geometry/builder.d.mts +18 -0
  243. package/dist/geometry/builder.mjs +332 -0
  244. package/dist/geometry/index.d.mts +4 -0
  245. package/dist/geometry/index.mjs +5 -0
  246. package/dist/geometry/intersecting-circles.d.mts +17 -0
  247. package/dist/geometry/intersecting-circles.mjs +104 -0
  248. package/dist/ict/index.d.mts +5 -0
  249. package/dist/ict/index.mjs +6 -0
  250. package/dist/ict/number-systems/base-odometer.d.mts +34 -0
  251. package/dist/ict/number-systems/base-odometer.mjs +160 -0
  252. package/dist/ict/number-systems/bit-grouper.d.mts +32 -0
  253. package/dist/ict/number-systems/bit-grouper.mjs +190 -0
  254. package/dist/ict/number-systems/index.d.mts +4 -0
  255. package/dist/ict/number-systems/place-value-dial.d.mts +29 -0
  256. package/dist/ict/number-systems/place-value-dial.mjs +153 -0
  257. package/dist/ict/number-systems/wheel.d.mts +73 -0
  258. package/dist/ict/number-systems/wheel.mjs +279 -0
  259. package/dist/index.d.mts +10 -0
  260. package/dist/index.mjs +11 -0
  261. package/dist/kit/anim.mjs +52 -0
  262. package/dist/kit/annotate.mjs +116 -0
  263. package/dist/kit/answer-check.d.mts +38 -0
  264. package/dist/kit/answer-check.mjs +65 -0
  265. package/dist/kit/asset-util.mjs +15 -0
  266. package/dist/kit/controls.mjs +77 -0
  267. package/dist/kit/cycle.d.mts +44 -0
  268. package/dist/kit/cycle.mjs +188 -0
  269. package/dist/kit/diagram.mjs +176 -0
  270. package/dist/kit/electronics.mjs +357 -0
  271. package/dist/kit/expr-analysis.d.mts +37 -0
  272. package/dist/kit/expr-analysis.mjs +111 -0
  273. package/dist/kit/frame.d.mts +70 -0
  274. package/dist/kit/frame.mjs +205 -0
  275. package/dist/kit/freq-tree.mjs +99 -0
  276. package/dist/kit/gameshow.mjs +315 -0
  277. package/dist/kit/index.d.mts +5 -0
  278. package/dist/kit/index.mjs +6 -0
  279. package/dist/kit/logic-gates.d.mts +6 -0
  280. package/dist/kit/logic-gates.mjs +210 -0
  281. package/dist/kit/molecules.mjs +178 -0
  282. package/dist/kit/pedagogy.d.mts +126 -0
  283. package/dist/kit/pedagogy.mjs +331 -0
  284. package/dist/kit/play.d.mts +21 -0
  285. package/dist/kit/play.mjs +52 -0
  286. package/dist/kit/probability.mjs +141 -0
  287. package/dist/kit/proportion.mjs +112 -0
  288. package/dist/kit/reaction.mjs +102 -0
  289. package/dist/kit/rich.d.mts +10 -0
  290. package/dist/kit/rich.mjs +21 -0
  291. package/dist/kit/scale.mjs +230 -0
  292. package/dist/kit/space.mjs +326 -0
  293. package/dist/kit/steps.d.mts +24 -0
  294. package/dist/kit/steps.mjs +57 -0
  295. package/dist/kit/thermal.mjs +289 -0
  296. package/dist/language/agreement/index.d.mts +1 -0
  297. package/dist/language/agreement/preset.d.mts +27 -0
  298. package/dist/language/agreement/preset.mjs +113 -0
  299. package/dist/language/article-lens/index.d.mts +1 -0
  300. package/dist/language/article-lens/preset.d.mts +31 -0
  301. package/dist/language/article-lens/preset.mjs +125 -0
  302. package/dist/language/deck.d.mts +45 -0
  303. package/dist/language/deck.mjs +61 -0
  304. package/dist/language/icon.d.mts +40 -0
  305. package/dist/language/icon.mjs +73 -0
  306. package/dist/language/index.d.mts +10 -0
  307. package/dist/language/index.mjs +11 -0
  308. package/dist/language/preposition-scene/index.d.mts +1 -0
  309. package/dist/language/preposition-scene/preset.d.mts +34 -0
  310. package/dist/language/preposition-scene/preset.mjs +234 -0
  311. package/dist/language/sentence-builder/index.d.mts +1 -0
  312. package/dist/language/sentence-builder/preset.d.mts +32 -0
  313. package/dist/language/sentence-builder/preset.mjs +122 -0
  314. package/dist/language/transform/index.d.mts +1 -0
  315. package/dist/language/transform/preset.d.mts +31 -0
  316. package/dist/language/transform/preset.mjs +137 -0
  317. package/dist/language/ui.d.mts +53 -0
  318. package/dist/language/ui.mjs +88 -0
  319. package/dist/language/word-match/index.d.mts +1 -0
  320. package/dist/language/word-match/preset.d.mts +22 -0
  321. package/dist/language/word-match/preset.mjs +148 -0
  322. package/dist/math/area-model/asset.d.mts +6 -0
  323. package/dist/math/area-model/asset.mjs +270 -0
  324. package/dist/math/area-model/index.d.mts +2 -0
  325. package/dist/math/area-model/preset.d.mts +29 -0
  326. package/dist/math/area-model/preset.mjs +243 -0
  327. package/dist/math/balance-algebra/asset.d.mts +6 -0
  328. package/dist/math/balance-algebra/asset.mjs +150 -0
  329. package/dist/math/balance-algebra/index.d.mts +2 -0
  330. package/dist/math/balance-algebra/preset.d.mts +30 -0
  331. package/dist/math/balance-algebra/preset.mjs +228 -0
  332. package/dist/math/derivation.d.mts +22 -0
  333. package/dist/math/derivation.mjs +113 -0
  334. package/dist/math/derivative-explorer/index.d.mts +1 -0
  335. package/dist/math/derivative-explorer/preset.d.mts +19 -0
  336. package/dist/math/derivative-explorer/preset.mjs +227 -0
  337. package/dist/math/function-machine/index.d.mts +1 -0
  338. package/dist/math/function-machine/preset.d.mts +21 -0
  339. package/dist/math/function-machine/preset.mjs +177 -0
  340. package/dist/math/gradient-descent.d.mts +23 -0
  341. package/dist/math/gradient-descent.mjs +473 -0
  342. package/dist/math/grapher/index.d.mts +1 -0
  343. package/dist/math/grapher/preset.d.mts +40 -0
  344. package/dist/math/grapher/preset.mjs +313 -0
  345. package/dist/math/harmonic-form/index.d.mts +1 -0
  346. package/dist/math/harmonic-form/preset.d.mts +21 -0
  347. package/dist/math/harmonic-form/preset.mjs +387 -0
  348. package/dist/math/index.d.mts +25 -0
  349. package/dist/math/index.mjs +26 -0
  350. package/dist/math/integral-explorer/index.d.mts +1 -0
  351. package/dist/math/integral-explorer/preset.d.mts +23 -0
  352. package/dist/math/integral-explorer/preset.mjs +217 -0
  353. package/dist/math/interactive/index.d.mts +1 -0
  354. package/dist/math/interactive/preset.d.mts +72 -0
  355. package/dist/math/interactive/preset.mjs +202 -0
  356. package/dist/math/limit-explorer/index.d.mts +1 -0
  357. package/dist/math/limit-explorer/preset.d.mts +19 -0
  358. package/dist/math/limit-explorer/preset.mjs +216 -0
  359. package/dist/math/linear-system/index.d.mts +1 -0
  360. package/dist/math/linear-system/preset.d.mts +28 -0
  361. package/dist/math/linear-system/preset.mjs +164 -0
  362. package/dist/math/mystery-bucket/asset.d.mts +6 -0
  363. package/dist/math/mystery-bucket/asset.mjs +145 -0
  364. package/dist/math/mystery-bucket/index.d.mts +2 -0
  365. package/dist/math/mystery-bucket/preset.d.mts +36 -0
  366. package/dist/math/mystery-bucket/preset.mjs +116 -0
  367. package/dist/math/number-line/index.d.mts +1 -0
  368. package/dist/math/number-line/preset.d.mts +24 -0
  369. package/dist/math/number-line/preset.mjs +142 -0
  370. package/dist/math/parabola/index.d.mts +1 -0
  371. package/dist/math/parabola/preset.d.mts +13 -0
  372. package/dist/math/parabola/preset.mjs +79 -0
  373. package/dist/math/pattern/asset.d.mts +6 -0
  374. package/dist/math/pattern/asset.mjs +102 -0
  375. package/dist/math/pattern/index.d.mts +2 -0
  376. package/dist/math/pattern/preset.d.mts +32 -0
  377. package/dist/math/pattern/preset.mjs +294 -0
  378. package/dist/math/triangle-trig/index.d.mts +1 -0
  379. package/dist/math/triangle-trig/preset.d.mts +47 -0
  380. package/dist/math/triangle-trig/preset.mjs +245 -0
  381. package/dist/math/trig-explorer.d.mts +18 -0
  382. package/dist/math/trig-explorer.mjs +209 -0
  383. package/dist/ml/boundary/index.d.mts +1 -0
  384. package/dist/ml/boundary/preset.d.mts +24 -0
  385. package/dist/ml/boundary/preset.mjs +385 -0
  386. package/dist/ml/classifier/index.d.mts +1 -0
  387. package/dist/ml/classifier/preset.d.mts +25 -0
  388. package/dist/ml/classifier/preset.mjs +315 -0
  389. package/dist/ml/index.d.mts +6 -0
  390. package/dist/ml/index.mjs +7 -0
  391. package/dist/ml/kmeans/index.d.mts +1 -0
  392. package/dist/ml/kmeans/preset.d.mts +33 -0
  393. package/dist/ml/kmeans/preset.mjs +236 -0
  394. package/dist/ml/knn/index.d.mts +1 -0
  395. package/dist/ml/knn/preset.d.mts +28 -0
  396. package/dist/ml/knn/preset.mjs +279 -0
  397. package/dist/ml/regression/index.d.mts +1 -0
  398. package/dist/ml/regression/preset.d.mts +32 -0
  399. package/dist/ml/regression/preset.mjs +394 -0
  400. package/dist/physics/atwood/index.d.mts +1 -0
  401. package/dist/physics/atwood/preset.d.mts +23 -0
  402. package/dist/physics/atwood/preset.mjs +312 -0
  403. package/dist/physics/bullet-walls/index.d.mts +1 -0
  404. package/dist/physics/bullet-walls/preset.d.mts +28 -0
  405. package/dist/physics/bullet-walls/preset.mjs +373 -0
  406. package/dist/physics/carnot/index.d.mts +1 -0
  407. package/dist/physics/carnot/preset.d.mts +27 -0
  408. package/dist/physics/carnot/preset.mjs +427 -0
  409. package/dist/physics/circular-motion/index.d.mts +1 -0
  410. package/dist/physics/circular-motion/preset.d.mts +25 -0
  411. package/dist/physics/circular-motion/preset.mjs +293 -0
  412. package/dist/physics/collision-track/index.d.mts +1 -0
  413. package/dist/physics/collision-track/preset.d.mts +27 -0
  414. package/dist/physics/collision-track/preset.mjs +352 -0
  415. package/dist/physics/efficiency/index.d.mts +1 -0
  416. package/dist/physics/efficiency/preset.d.mts +33 -0
  417. package/dist/physics/efficiency/preset.mjs +343 -0
  418. package/dist/physics/electric-field/index.d.mts +1 -0
  419. package/dist/physics/electric-field/preset.d.mts +15 -0
  420. package/dist/physics/electric-field/preset.mjs +306 -0
  421. package/dist/physics/energy-skate/index.d.mts +1 -0
  422. package/dist/physics/energy-skate/preset.d.mts +25 -0
  423. package/dist/physics/energy-skate/preset.mjs +254 -0
  424. package/dist/physics/entropy/index.d.mts +1 -0
  425. package/dist/physics/entropy/preset.d.mts +18 -0
  426. package/dist/physics/entropy/preset.mjs +416 -0
  427. package/dist/physics/expansion/index.d.mts +1 -0
  428. package/dist/physics/expansion/preset.d.mts +26 -0
  429. package/dist/physics/expansion/preset.mjs +609 -0
  430. package/dist/physics/exponential/asset.mjs +221 -0
  431. package/dist/physics/exponential/index.d.mts +1 -0
  432. package/dist/physics/exponential/preset.d.mts +17 -0
  433. package/dist/physics/exponential/preset.mjs +182 -0
  434. package/dist/physics/gas-process/index.d.mts +1 -0
  435. package/dist/physics/gas-process/preset.d.mts +30 -0
  436. package/dist/physics/gas-process/preset.mjs +384 -0
  437. package/dist/physics/gravitation/index.d.mts +1 -0
  438. package/dist/physics/gravitation/preset.d.mts +24 -0
  439. package/dist/physics/gravitation/preset.mjs +345 -0
  440. package/dist/physics/gravity-drop.d.mts +9 -0
  441. package/dist/physics/gravity-drop.mjs +187 -0
  442. package/dist/physics/heat-transfer/index.d.mts +1 -0
  443. package/dist/physics/heat-transfer/preset.d.mts +27 -0
  444. package/dist/physics/heat-transfer/preset.mjs +626 -0
  445. package/dist/physics/impulse/index.d.mts +1 -0
  446. package/dist/physics/impulse/preset.d.mts +29 -0
  447. package/dist/physics/impulse/preset.mjs +453 -0
  448. package/dist/physics/index.d.mts +43 -0
  449. package/dist/physics/index.mjs +44 -0
  450. package/dist/physics/kepler/index.d.mts +1 -0
  451. package/dist/physics/kepler/preset.d.mts +27 -0
  452. package/dist/physics/kepler/preset.mjs +257 -0
  453. package/dist/physics/lever/asset.d.mts +6 -0
  454. package/dist/physics/lever/asset.mjs +220 -0
  455. package/dist/physics/lever/index.d.mts +2 -0
  456. package/dist/physics/lever/preset.d.mts +31 -0
  457. package/dist/physics/lever/preset.mjs +261 -0
  458. package/dist/physics/lorentz/index.d.mts +1 -0
  459. package/dist/physics/lorentz/preset.d.mts +29 -0
  460. package/dist/physics/lorentz/preset.mjs +367 -0
  461. package/dist/physics/magnetism/index.d.mts +1 -0
  462. package/dist/physics/magnetism/preset.d.mts +15 -0
  463. package/dist/physics/magnetism/preset.mjs +334 -0
  464. package/dist/physics/optics/asset.d.mts +6 -0
  465. package/dist/physics/optics/asset.mjs +234 -0
  466. package/dist/physics/optics/index.d.mts +2 -0
  467. package/dist/physics/optics/preset.d.mts +14 -0
  468. package/dist/physics/optics/preset.mjs +202 -0
  469. package/dist/physics/orbit-lab.d.mts +6 -0
  470. package/dist/physics/orbit-lab.mjs +222 -0
  471. package/dist/physics/projectile-lab.d.mts +10 -0
  472. package/dist/physics/projectile-lab.mjs +354 -0
  473. package/dist/physics/rain-relative/index.d.mts +1 -0
  474. package/dist/physics/rain-relative/preset.d.mts +19 -0
  475. package/dist/physics/rain-relative/preset.mjs +358 -0
  476. package/dist/physics/ramp-forces/index.d.mts +1 -0
  477. package/dist/physics/ramp-forces/preset.d.mts +36 -0
  478. package/dist/physics/ramp-forces/preset.mjs +550 -0
  479. package/dist/physics/river-boat.d.mts +22 -0
  480. package/dist/physics/river-boat.mjs +498 -0
  481. package/dist/physics/shm/index.d.mts +1 -0
  482. package/dist/physics/shm/preset.d.mts +33 -0
  483. package/dist/physics/shm/preset.mjs +554 -0
  484. package/dist/physics/stopping-distance/index.d.mts +1 -0
  485. package/dist/physics/stopping-distance/preset.d.mts +29 -0
  486. package/dist/physics/stopping-distance/preset.mjs +662 -0
  487. package/dist/physics/temperature-scales/index.d.mts +1 -0
  488. package/dist/physics/temperature-scales/preset.d.mts +15 -0
  489. package/dist/physics/temperature-scales/preset.mjs +353 -0
  490. package/dist/physics/terminal-velocity/index.d.mts +1 -0
  491. package/dist/physics/terminal-velocity/preset.d.mts +26 -0
  492. package/dist/physics/terminal-velocity/preset.mjs +404 -0
  493. package/dist/physics/thermal/index.d.mts +1 -0
  494. package/dist/physics/thermal/preset.d.mts +44 -0
  495. package/dist/physics/thermal/preset.mjs +373 -0
  496. package/dist/physics/vector-board/index.d.mts +1 -0
  497. package/dist/physics/vector-board/preset.d.mts +65 -0
  498. package/dist/physics/vector-board/preset.mjs +273 -0
  499. package/dist/physics/vector-board/view.d.mts +49 -0
  500. package/dist/physics/vector-board/view.mjs +58 -0
  501. package/dist/physics/vector-scene.d.mts +41 -0
  502. package/dist/physics/vector-scene.mjs +211 -0
  503. package/dist/physics/vector-types/index.d.mts +1 -0
  504. package/dist/physics/vector-types/preset.d.mts +27 -0
  505. package/dist/physics/vector-types/preset.mjs +192 -0
  506. package/dist/physics/water-density/index.d.mts +1 -0
  507. package/dist/physics/water-density/preset.d.mts +18 -0
  508. package/dist/physics/water-density/preset.mjs +439 -0
  509. package/dist/physics/waves/core.mjs +33 -0
  510. package/dist/physics/waves/doppler.d.mts +23 -0
  511. package/dist/physics/waves/doppler.mjs +260 -0
  512. package/dist/physics/waves/index.d.mts +4 -0
  513. package/dist/physics/waves/preset.d.mts +30 -0
  514. package/dist/physics/waves/preset.mjs +488 -0
  515. package/dist/physics/waves/ripple.d.mts +26 -0
  516. package/dist/physics/waves/ripple.mjs +234 -0
  517. package/dist/physics/waves/string.d.mts +29 -0
  518. package/dist/physics/waves/string.mjs +289 -0
  519. package/dist/physics/work-energy/index.d.mts +1 -0
  520. package/dist/physics/work-energy/preset.d.mts +17 -0
  521. package/dist/physics/work-energy/preset.mjs +341 -0
  522. package/dist/schemas/index.d.mts +235 -0
  523. package/dist/schemas/index.mjs +145 -0
  524. package/dist/statistics/center-spread/preset.d.mts +34 -0
  525. package/dist/statistics/center-spread/preset.mjs +323 -0
  526. package/dist/statistics/core/descriptive.d.mts +35 -0
  527. package/dist/statistics/core/descriptive.mjs +64 -0
  528. package/dist/statistics/core/normal.d.mts +21 -0
  529. package/dist/statistics/core/normal.mjs +37 -0
  530. package/dist/statistics/core/sequences.d.mts +27 -0
  531. package/dist/statistics/core/sequences.mjs +35 -0
  532. package/dist/statistics/galton/preset.d.mts +27 -0
  533. package/dist/statistics/galton/preset.mjs +331 -0
  534. package/dist/statistics/histogram/preset.d.mts +27 -0
  535. package/dist/statistics/histogram/preset.mjs +385 -0
  536. package/dist/statistics/index.d.mts +11 -0
  537. package/dist/statistics/index.mjs +12 -0
  538. package/dist/statistics/normal/preset.d.mts +30 -0
  539. package/dist/statistics/normal/preset.mjs +400 -0
  540. package/dist/statistics/sampling/preset.d.mts +32 -0
  541. package/dist/statistics/sampling/preset.mjs +406 -0
  542. package/dist/statistics/sequence/preset.d.mts +28 -0
  543. package/dist/statistics/sequence/preset.mjs +302 -0
  544. package/dist/statistics/z-table/preset.d.mts +28 -0
  545. package/dist/statistics/z-table/preset.mjs +348 -0
  546. package/package.json +266 -0
  547. 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 };