@classytic/labs 0.1.0 → 0.2.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 (455) hide show
  1. package/dist/_virtual/_rolldown/runtime.mjs +18 -0
  2. package/dist/biology/enzyme-rate/preset.mjs +5 -5
  3. package/dist/biology/genetic-cross/core.d.mts +7 -7
  4. package/dist/biology/genetic-cross/core.mjs +4 -4
  5. package/dist/biology/genetic-cross/grid.mjs +132 -123
  6. package/dist/biology/genetic-cross/preset.mjs +4 -4
  7. package/dist/biology/genetic-cross/sex-linked.mjs +7 -7
  8. package/dist/biology/photosynthesis-factors/preset.mjs +8 -8
  9. package/dist/biology/respiration/preset.mjs +4 -4
  10. package/dist/biology/sequence/central-dogma.mjs +5 -5
  11. package/dist/biology/sequence/core.d.mts +6 -6
  12. package/dist/biology/sequence/core.mjs +1 -1
  13. package/dist/biology/sequence/preset.mjs +6 -6
  14. package/dist/blocks/authoring.mjs +5 -5
  15. package/dist/blocks/biology.d.mts +2 -2
  16. package/dist/blocks/biology.mjs +5 -5
  17. package/dist/blocks/chem.d.mts +2 -2
  18. package/dist/blocks/chem.mjs +13 -13
  19. package/dist/blocks/circuits.d.mts +293 -4
  20. package/dist/blocks/circuits.mjs +874 -9
  21. package/dist/blocks/discrete.d.mts +30 -2
  22. package/dist/blocks/discrete.mjs +74 -4
  23. package/dist/blocks/economics.mjs +1 -1
  24. package/dist/blocks/geography.mjs +1 -1
  25. package/dist/blocks/geometry.mjs +3 -3
  26. package/dist/blocks/ict.d.mts +90 -1
  27. package/dist/blocks/ict.mjs +217 -7
  28. package/dist/blocks/index.d.mts +3064 -657
  29. package/dist/blocks/index.mjs +9 -9
  30. package/dist/blocks/lab-block.mjs +5 -5
  31. package/dist/blocks/lab-config.d.mts +1 -1
  32. package/dist/blocks/lab-config.mjs +4 -4
  33. package/dist/blocks/lab-gallery.d.mts +1 -1
  34. package/dist/blocks/lab-gallery.mjs +2 -2
  35. package/dist/blocks/language.d.mts +6 -6
  36. package/dist/blocks/language.mjs +12 -12
  37. package/dist/blocks/lesson.mjs +4 -4
  38. package/dist/blocks/math.d.mts +577 -11
  39. package/dist/blocks/math.mjs +1648 -14
  40. package/dist/blocks/ml.d.mts +45 -1
  41. package/dist/blocks/ml.mjs +80 -6
  42. package/dist/blocks/physics.d.mts +9 -4
  43. package/dist/blocks/physics.mjs +75 -28
  44. package/dist/blocks/statistics.mjs +1 -1
  45. package/dist/build/CircuitEditor.d.mts +14 -0
  46. package/dist/build/CircuitEditor.mjs +787 -0
  47. package/dist/build/CircuitPlayer.d.mts +19 -0
  48. package/dist/build/CircuitPlayer.mjs +53 -0
  49. package/dist/build/CircuitScene.d.mts +61 -0
  50. package/dist/build/CircuitScene.mjs +383 -0
  51. package/dist/build/contract.d.mts +116 -0
  52. package/dist/build/editor-ops.d.mts +65 -0
  53. package/dist/build/editor-ops.mjs +306 -0
  54. package/dist/build/editor-ui.mjs +121 -0
  55. package/dist/build/flow.d.mts +14 -0
  56. package/dist/build/flow.mjs +119 -0
  57. package/dist/build/index.d.mts +10 -0
  58. package/dist/build/index.mjs +10 -0
  59. package/dist/build/parts/ammeter.d.mts +1 -0
  60. package/dist/build/parts/ammeter.mjs +32 -0
  61. package/dist/build/parts/bulb.d.mts +1 -0
  62. package/dist/build/parts/bulb.mjs +50 -0
  63. package/dist/build/parts/capacitor.d.mts +1 -0
  64. package/dist/build/parts/capacitor.mjs +26 -0
  65. package/dist/build/parts/cell.d.mts +1 -0
  66. package/dist/build/parts/cell.mjs +40 -0
  67. package/dist/build/parts/diode.d.mts +1 -0
  68. package/dist/build/parts/diode.mjs +33 -0
  69. package/dist/build/parts/index.d.mts +5 -0
  70. package/dist/build/parts/index.mjs +43 -0
  71. package/dist/build/parts/mosfet.d.mts +1 -0
  72. package/dist/build/parts/mosfet.mjs +95 -0
  73. package/dist/build/parts/node.d.mts +1 -0
  74. package/dist/build/parts/node.mjs +32 -0
  75. package/dist/build/parts/resistor.d.mts +1 -0
  76. package/dist/build/parts/resistor.mjs +49 -0
  77. package/dist/build/parts/shared.mjs +42 -0
  78. package/dist/build/parts/switch.d.mts +1 -0
  79. package/dist/build/parts/switch.mjs +34 -0
  80. package/dist/build/parts.d.mts +1 -0
  81. package/dist/build/registry.d.mts +9 -0
  82. package/dist/build/registry.mjs +15 -0
  83. package/dist/build/solve.d.mts +8 -0
  84. package/dist/build/solve.mjs +0 -0
  85. package/dist/catalog/registry.d.mts +2 -2
  86. package/dist/catalog/templates.d.mts +1 -1
  87. package/dist/catalog/templates.mjs +6 -6
  88. package/dist/chem/battery.mjs +1 -1
  89. package/dist/chem/bohr-atom.mjs +4 -4
  90. package/dist/chem/diffusion/preset.mjs +4 -4
  91. package/dist/chem/electrochem/preset.mjs +5 -5
  92. package/dist/chem/equilibrium/preset.d.mts +1 -1
  93. package/dist/chem/equilibrium/preset.mjs +6 -6
  94. package/dist/chem/gas-box/preset.mjs +6 -6
  95. package/dist/chem/kinetics/preset.mjs +6 -6
  96. package/dist/chem/periodic-trends/preset.mjs +7 -7
  97. package/dist/chem/reaction-lab.mjs +3 -3
  98. package/dist/chem/reaction-profile.mjs +4 -4
  99. package/dist/chem/solution/dilution.mjs +6 -6
  100. package/dist/chem/solution/field.d.mts +2 -2
  101. package/dist/chem/solution/field.mjs +2 -2
  102. package/dist/chem/solution/solution-box.mjs +7 -7
  103. package/dist/chem/stoichiometry/preset.mjs +5 -5
  104. package/dist/chem/titration/preset.mjs +5 -5
  105. package/dist/circuits/ac-dc/asset.mjs +1 -1
  106. package/dist/circuits/ac-dc/preset.mjs +2 -2
  107. package/dist/circuits/brownout/index.d.mts +1 -0
  108. package/dist/circuits/brownout/preset.d.mts +22 -0
  109. package/dist/circuits/brownout/preset.mjs +399 -0
  110. package/dist/circuits/capacitor-leak/preset.mjs +13 -8
  111. package/dist/circuits/circuit/asset.mjs +71 -14
  112. package/dist/circuits/circuit/preset.mjs +23 -5
  113. package/dist/circuits/circuit-builder.mjs +60 -132
  114. package/dist/circuits/circuit-lab.mjs +60 -40
  115. package/dist/circuits/cmos-gate/index.d.mts +1 -0
  116. package/dist/circuits/cmos-gate/preset.d.mts +75 -0
  117. package/dist/circuits/cmos-gate/preset.mjs +1491 -0
  118. package/dist/circuits/diode/index.d.mts +1 -0
  119. package/dist/circuits/diode/preset.d.mts +25 -0
  120. package/dist/circuits/diode/preset.mjs +266 -0
  121. package/dist/circuits/index.d.mts +7 -1
  122. package/dist/circuits/index.mjs +7 -1
  123. package/dist/circuits/rc-charging/index.d.mts +1 -0
  124. package/dist/circuits/rc-charging/preset.d.mts +27 -0
  125. package/dist/circuits/rc-charging/preset.mjs +329 -0
  126. package/dist/circuits/semiconductor/index.d.mts +1 -0
  127. package/dist/circuits/semiconductor/preset.d.mts +102 -0
  128. package/dist/circuits/semiconductor/preset.mjs +1855 -0
  129. package/dist/circuits/transistor/index.d.mts +1 -0
  130. package/dist/circuits/transistor/preset.d.mts +27 -0
  131. package/dist/circuits/transistor/preset.mjs +329 -0
  132. package/dist/commerce/accounting/core.d.mts +1 -1
  133. package/dist/commerce/accounting/equation-balance.mjs +5 -5
  134. package/dist/commerce/accounting/journal-poster.mjs +8 -8
  135. package/dist/commerce/accounting/statement-sorter.mjs +4 -4
  136. package/dist/commerce/economics/core.d.mts +2 -2
  137. package/dist/commerce/economics/core.mjs +1 -1
  138. package/dist/commerce/economics/demand-shift-vs-move.mjs +6 -6
  139. package/dist/commerce/economics/elasticity-revenue.mjs +6 -6
  140. package/dist/commerce/economics/market-equilibrium.mjs +5 -5
  141. package/dist/core/easing.d.mts +3 -3
  142. package/dist/core/easing.mjs +2 -2
  143. package/dist/core/numeric.d.mts +3 -3
  144. package/dist/core/numeric.mjs +2 -2
  145. package/dist/core/reactive.d.mts +1 -1
  146. package/dist/core/reactive.mjs +1 -1
  147. package/dist/core/rng.d.mts +2 -2
  148. package/dist/core/rng.mjs +1 -1
  149. package/dist/core/tex.mjs +2 -2
  150. package/dist/core/timeline.d.mts +1 -1
  151. package/dist/core/timeline.mjs +1 -1
  152. package/dist/core/util.mjs +11 -1
  153. package/dist/discrete/arrangements/preset.mjs +6 -14
  154. package/dist/discrete/bayes/preset.mjs +43 -35
  155. package/dist/discrete/binomial/preset.mjs +2 -2
  156. package/dist/discrete/combination-studio/figure.d.mts +6 -0
  157. package/dist/discrete/combination-studio/figure.mjs +159 -0
  158. package/dist/discrete/combination-studio/index.d.mts +2 -0
  159. package/dist/discrete/combination-studio/preset.d.mts +44 -0
  160. package/dist/discrete/combination-studio/preset.mjs +440 -0
  161. package/dist/discrete/core/combinatorics.d.mts +23 -3
  162. package/dist/discrete/core/combinatorics.mjs +38 -3
  163. package/dist/discrete/core/pigeonhole.d.mts +1 -1
  164. package/dist/discrete/core/pigeonhole.mjs +1 -1
  165. package/dist/discrete/core/probability.d.mts +3 -3
  166. package/dist/discrete/core/probability.mjs +3 -3
  167. package/dist/discrete/core/sets.d.mts +1 -1
  168. package/dist/discrete/counting-slots/preset.mjs +8 -8
  169. package/dist/discrete/counting-tree/preset.mjs +65 -8
  170. package/dist/discrete/expected-value/preset.mjs +13 -13
  171. package/dist/discrete/hypergeometric/preset.mjs +48 -15
  172. package/dist/discrete/index.d.mts +4 -2
  173. package/dist/discrete/index.mjs +4 -2
  174. package/dist/discrete/karnaugh/preset.mjs +26 -20
  175. package/dist/discrete/lln/preset.mjs +44 -3
  176. package/dist/discrete/logic-circuit/preset.mjs +2 -2
  177. package/dist/discrete/monte-carlo/preset.d.mts +1 -1
  178. package/dist/discrete/monte-carlo/preset.mjs +14 -14
  179. package/dist/discrete/monty-hall/preset.mjs +6 -6
  180. package/dist/discrete/outcome-builder/preset.mjs +3 -3
  181. package/dist/discrete/pascal/preset.mjs +37 -7
  182. package/dist/discrete/rules.d.mts +20 -0
  183. package/dist/discrete/rules.mjs +264 -0
  184. package/dist/discrete/sample-space/preset.mjs +4 -4
  185. package/dist/discrete/selection/preset.mjs +7 -13
  186. package/dist/discrete/truth-table/preset.mjs +32 -9
  187. package/dist/discrete/venn/preset.mjs +71 -48
  188. package/dist/geography/cycle-lab/preset.mjs +17 -10
  189. package/dist/geography/cycles.d.mts +3 -3
  190. package/dist/geography/cycles.mjs +3 -3
  191. package/dist/geometry/board/preset.d.mts +2 -0
  192. package/dist/geometry/board/preset.mjs +11 -15
  193. package/dist/geometry/builder.mjs +3 -3
  194. package/dist/ict/number-systems/base-odometer.mjs +4 -4
  195. package/dist/ict/number-systems/bit-grouper.d.mts +1 -1
  196. package/dist/ict/number-systems/bit-grouper.mjs +4 -4
  197. package/dist/ict/number-systems/place-value-dial.d.mts +1 -1
  198. package/dist/ict/number-systems/place-value-dial.mjs +3 -3
  199. package/dist/ict/number-systems/wheel.d.mts +3 -3
  200. package/dist/ict/number-systems/wheel.mjs +4 -4
  201. package/dist/kit/annotate.mjs +3 -3
  202. package/dist/kit/answer-check.d.mts +2 -2
  203. package/dist/kit/answer-check.mjs +34 -6
  204. package/dist/kit/ask.d.mts +19 -0
  205. package/dist/kit/ask.mjs +46 -0
  206. package/dist/kit/bar-strip.mjs +53 -0
  207. package/dist/kit/calc.d.mts +33 -0
  208. package/dist/kit/calc.mjs +27 -0
  209. package/dist/kit/carrier-engine.mjs +147 -0
  210. package/dist/kit/clue-scene.d.mts +86 -0
  211. package/dist/kit/clue-scene.mjs +424 -0
  212. package/dist/kit/cluster.d.mts +30 -0
  213. package/dist/kit/cluster.mjs +81 -0
  214. package/dist/kit/controls.mjs +11 -5
  215. package/dist/kit/coords.d.mts +88 -0
  216. package/dist/kit/coords.mjs +192 -0
  217. package/dist/kit/data-scene.d.mts +27 -0
  218. package/dist/kit/data-scene.mjs +199 -0
  219. package/dist/kit/diagram.mjs +111 -50
  220. package/dist/kit/electronics.mjs +552 -60
  221. package/dist/kit/expr-analysis.d.mts +18 -6
  222. package/dist/kit/expr-analysis.mjs +82 -28
  223. package/dist/kit/frame.d.mts +3 -3
  224. package/dist/kit/frame.mjs +25 -6
  225. package/dist/kit/gameshow.mjs +2 -2
  226. package/dist/kit/index.d.mts +14 -2
  227. package/dist/kit/index.mjs +13 -1
  228. package/dist/kit/logic-gates.mjs +246 -47
  229. package/dist/kit/palette.mjs +26 -0
  230. package/dist/kit/pedagogy.d.mts +4 -4
  231. package/dist/kit/pedagogy.mjs +21 -17
  232. package/dist/kit/play.d.mts +1 -1
  233. package/dist/kit/play.mjs +3 -3
  234. package/dist/kit/predict.d.mts +55 -0
  235. package/dist/kit/predict.mjs +146 -0
  236. package/dist/kit/receipt.d.mts +29 -0
  237. package/dist/kit/receipt.mjs +94 -0
  238. package/dist/kit/rich.mjs +2 -2
  239. package/dist/kit/rule.d.mts +59 -0
  240. package/dist/kit/rule.mjs +215 -0
  241. package/dist/kit/scale.mjs +1 -1
  242. package/dist/kit/scene-library.d.mts +22 -0
  243. package/dist/kit/scene-library.mjs +311 -0
  244. package/dist/kit/scene-studio.d.mts +14 -0
  245. package/dist/kit/scene-studio.mjs +338 -0
  246. package/dist/kit/scenes.d.mts +31 -0
  247. package/dist/kit/scenes.mjs +569 -0
  248. package/dist/kit/slot-fill.d.mts +61 -0
  249. package/dist/kit/slot-fill.mjs +207 -0
  250. package/dist/kit/solve.d.mts +21 -0
  251. package/dist/kit/solve.mjs +75 -0
  252. package/dist/kit/space.mjs +5 -5
  253. package/dist/kit/steps.mjs +2 -2
  254. package/dist/kit/vessel.d.mts +69 -0
  255. package/dist/kit/vessel.mjs +191 -0
  256. package/dist/language/agreement/preset.mjs +2 -2
  257. package/dist/language/article-lens/preset.d.mts +1 -1
  258. package/dist/language/article-lens/preset.mjs +8 -8
  259. package/dist/language/deck.d.mts +3 -3
  260. package/dist/language/deck.mjs +1 -1
  261. package/dist/language/preposition-scene/preset.d.mts +2 -2
  262. package/dist/language/preposition-scene/preset.mjs +5 -5
  263. package/dist/language/sentence-builder/preset.mjs +5 -5
  264. package/dist/language/transform/preset.d.mts +2 -2
  265. package/dist/language/transform/preset.mjs +5 -5
  266. package/dist/language/ui.d.mts +3 -3
  267. package/dist/language/ui.mjs +4 -4
  268. package/dist/language/word-match/preset.mjs +3 -3
  269. package/dist/logic/LogicBuildLab.d.mts +22 -0
  270. package/dist/logic/LogicBuildLab.mjs +170 -0
  271. package/dist/logic/LogicEditScene.d.mts +31 -0
  272. package/dist/logic/LogicEditScene.mjs +276 -0
  273. package/dist/logic/LogicEditor.d.mts +14 -0
  274. package/dist/logic/LogicEditor.mjs +413 -0
  275. package/dist/logic/LogicScene.d.mts +32 -0
  276. package/dist/logic/LogicScene.mjs +277 -0
  277. package/dist/logic/contract.d.mts +72 -0
  278. package/dist/logic/display.d.mts +24 -0
  279. package/dist/logic/display.mjs +127 -0
  280. package/dist/logic/edit-ops.d.mts +44 -0
  281. package/dist/logic/edit-ops.mjs +177 -0
  282. package/dist/logic/evaluate.d.mts +11 -0
  283. package/dist/logic/evaluate.mjs +93 -0
  284. package/dist/logic/gates.d.mts +10 -0
  285. package/dist/logic/gates.mjs +73 -0
  286. package/dist/logic/index.d.mts +14 -0
  287. package/dist/logic/index.mjs +13 -0
  288. package/dist/logic/lab.d.mts +32 -0
  289. package/dist/logic/lab.mjs +160 -0
  290. package/dist/logic/presets.d.mts +12 -0
  291. package/dist/logic/presets.mjs +241 -0
  292. package/dist/logic/registry.d.mts +9 -0
  293. package/dist/logic/registry.mjs +15 -0
  294. package/dist/math/area-model/preset.mjs +70 -44
  295. package/dist/math/balance-algebra/preset.mjs +14 -5
  296. package/dist/math/broken-tree/index.d.mts +1 -0
  297. package/dist/math/broken-tree/preset.d.mts +26 -0
  298. package/dist/math/broken-tree/preset.mjs +435 -0
  299. package/dist/math/circle/index.d.mts +1 -0
  300. package/dist/math/circle/preset.d.mts +44 -0
  301. package/dist/math/circle/preset.mjs +198 -0
  302. package/dist/math/complex/core.d.mts +93 -0
  303. package/dist/math/complex/core.mjs +239 -0
  304. package/dist/math/complex/index.d.mts +3 -0
  305. package/dist/math/complex/preset.d.mts +31 -0
  306. package/dist/math/complex/preset.mjs +377 -0
  307. package/dist/math/complex/rules.d.mts +6 -0
  308. package/dist/math/complex/rules.mjs +121 -0
  309. package/dist/math/conic/index.d.mts +1 -0
  310. package/dist/math/conic/preset.d.mts +30 -0
  311. package/dist/math/conic/preset.mjs +334 -0
  312. package/dist/math/derivation.mjs +5 -5
  313. package/dist/math/derivative-explorer/preset.mjs +5 -5
  314. package/dist/math/domain-range/index.d.mts +1 -0
  315. package/dist/math/domain-range/preset.d.mts +33 -0
  316. package/dist/math/domain-range/preset.mjs +313 -0
  317. package/dist/math/fraction-bar/index.d.mts +1 -0
  318. package/dist/math/fraction-bar/preset.d.mts +27 -0
  319. package/dist/math/fraction-bar/preset.mjs +197 -0
  320. package/dist/math/function-machine/preset.mjs +2 -2
  321. package/dist/math/gradient-descent.mjs +6 -6
  322. package/dist/math/grapher/preset.d.mts +1 -1
  323. package/dist/math/grapher/preset.mjs +4 -4
  324. package/dist/math/harmonic-form/preset.mjs +6 -6
  325. package/dist/math/index.d.mts +27 -2
  326. package/dist/math/index.mjs +27 -2
  327. package/dist/math/integral-explorer/preset.mjs +2 -2
  328. package/dist/math/interactive/preset.mjs +3 -3
  329. package/dist/math/limit-explorer/preset.mjs +4 -4
  330. package/dist/math/linear-model/index.d.mts +1 -0
  331. package/dist/math/linear-model/preset.d.mts +53 -0
  332. package/dist/math/linear-model/preset.mjs +164 -0
  333. package/dist/math/linear-system/preset.mjs +4 -4
  334. package/dist/math/mystery-bucket/preset.mjs +6 -6
  335. package/dist/math/number-line/preset.mjs +3 -2
  336. package/dist/math/parabola/preset.mjs +4 -3
  337. package/dist/math/pattern/preset.mjs +7 -13
  338. package/dist/math/percent-bar/index.d.mts +1 -0
  339. package/dist/math/percent-bar/preset.d.mts +37 -0
  340. package/dist/math/percent-bar/preset.mjs +275 -0
  341. package/dist/math/poly/core.d.mts +50 -0
  342. package/dist/math/poly/core.mjs +268 -0
  343. package/dist/math/poly/index.d.mts +3 -0
  344. package/dist/math/poly/preset.d.mts +23 -0
  345. package/dist/math/poly/preset.mjs +141 -0
  346. package/dist/math/poly/steps.d.mts +10 -0
  347. package/dist/math/poly/steps.mjs +99 -0
  348. package/dist/math/rate-machine/index.d.mts +1 -0
  349. package/dist/math/rate-machine/preset.d.mts +35 -0
  350. package/dist/math/rate-machine/preset.mjs +281 -0
  351. package/dist/math/ratio-share/index.d.mts +1 -0
  352. package/dist/math/ratio-share/preset.d.mts +24 -0
  353. package/dist/math/ratio-share/preset.mjs +204 -0
  354. package/dist/math/receipt/index.d.mts +1 -0
  355. package/dist/math/receipt/preset.d.mts +22 -0
  356. package/dist/math/receipt/preset.mjs +137 -0
  357. package/dist/math/sequence-predict/index.d.mts +1 -0
  358. package/dist/math/sequence-predict/preset.d.mts +34 -0
  359. package/dist/math/sequence-predict/preset.mjs +130 -0
  360. package/dist/math/straight-line/index.d.mts +1 -0
  361. package/dist/math/straight-line/preset.d.mts +37 -0
  362. package/dist/math/straight-line/preset.mjs +374 -0
  363. package/dist/math/system-solve/index.d.mts +1 -0
  364. package/dist/math/system-solve/preset.d.mts +21 -0
  365. package/dist/math/system-solve/preset.mjs +227 -0
  366. package/dist/math/transform/index.d.mts +1 -0
  367. package/dist/math/transform/preset.d.mts +41 -0
  368. package/dist/math/transform/preset.mjs +343 -0
  369. package/dist/math/triangle-trig/preset.mjs +12 -9
  370. package/dist/math/trig/core.d.mts +37 -0
  371. package/dist/math/trig/core.mjs +150 -0
  372. package/dist/math/trig/diagrams.d.mts +1 -0
  373. package/dist/math/trig/diagrams.mjs +321 -0
  374. package/dist/math/trig/index.d.mts +3 -0
  375. package/dist/math/trig/preset.d.mts +25 -0
  376. package/dist/math/trig/preset.mjs +260 -0
  377. package/dist/math/trig/rules.d.mts +6 -0
  378. package/dist/math/trig/rules.mjs +159 -0
  379. package/dist/math/trig-explorer.mjs +4 -4
  380. package/dist/ml/boundary/preset.mjs +8 -3
  381. package/dist/ml/classifier/preset.mjs +31 -6
  382. package/dist/ml/kmeans/preset.mjs +4 -4
  383. package/dist/ml/knn/preset.mjs +47 -12
  384. package/dist/ml/regression/preset.mjs +36 -7
  385. package/dist/physics/atwood/preset.mjs +4 -4
  386. package/dist/physics/bullet-walls/preset.d.mts +1 -1
  387. package/dist/physics/bullet-walls/preset.mjs +7 -7
  388. package/dist/physics/carnot/preset.mjs +6 -6
  389. package/dist/physics/circular-motion/preset.mjs +36 -5
  390. package/dist/physics/collision-track/preset.mjs +35 -5
  391. package/dist/physics/efficiency/preset.d.mts +2 -2
  392. package/dist/physics/efficiency/preset.mjs +5 -5
  393. package/dist/physics/electric-field/preset.mjs +32 -23
  394. package/dist/physics/electric-flux/index.d.mts +1 -0
  395. package/dist/physics/electric-flux/preset.d.mts +29 -0
  396. package/dist/physics/electric-flux/preset.mjs +264 -0
  397. package/dist/physics/energy-skate/preset.mjs +5 -5
  398. package/dist/physics/entropy/preset.mjs +7 -7
  399. package/dist/physics/expansion/preset.mjs +13 -13
  400. package/dist/physics/exponential/asset.mjs +1 -1
  401. package/dist/physics/exponential/preset.mjs +4 -4
  402. package/dist/physics/gas-process/preset.mjs +3 -3
  403. package/dist/physics/gauss-law/index.d.mts +1 -0
  404. package/dist/physics/gauss-law/preset.d.mts +20 -0
  405. package/dist/physics/gauss-law/preset.mjs +286 -0
  406. package/dist/physics/gravitation/preset.mjs +7 -7
  407. package/dist/physics/gravity-drop.mjs +4 -4
  408. package/dist/physics/heat-transfer/preset.d.mts +1 -1
  409. package/dist/physics/heat-transfer/preset.mjs +10 -10
  410. package/dist/physics/impulse/preset.mjs +5 -5
  411. package/dist/physics/index.d.mts +4 -1
  412. package/dist/physics/index.mjs +4 -1
  413. package/dist/physics/kepler/preset.mjs +4 -4
  414. package/dist/physics/lever/preset.mjs +3 -3
  415. package/dist/physics/lorentz/preset.mjs +11 -11
  416. package/dist/physics/magnetism/preset.mjs +3 -3
  417. package/dist/physics/optics/preset.mjs +2 -2
  418. package/dist/physics/orbit-lab.mjs +5 -5
  419. package/dist/physics/projectile-lab.mjs +4 -4
  420. package/dist/physics/rain-relative/preset.mjs +5 -5
  421. package/dist/physics/ramp-forces/preset.mjs +5 -5
  422. package/dist/physics/river-boat.mjs +6 -6
  423. package/dist/physics/shm/preset.mjs +9 -9
  424. package/dist/physics/stopping-distance/preset.mjs +3 -3
  425. package/dist/physics/temperature-scales/preset.mjs +105 -116
  426. package/dist/physics/terminal-velocity/preset.mjs +5 -5
  427. package/dist/physics/thermal/preset.mjs +5 -5
  428. package/dist/physics/vector-board/preset.mjs +7 -6
  429. package/dist/physics/vector-scene.mjs +2 -2
  430. package/dist/physics/vector-types/preset.mjs +37 -3
  431. package/dist/physics/water-density/preset.mjs +12 -12
  432. package/dist/physics/waves/doppler.mjs +2 -2
  433. package/dist/physics/waves/preset.mjs +4 -4
  434. package/dist/physics/waves/ripple.mjs +6 -6
  435. package/dist/physics/waves/string.mjs +5 -5
  436. package/dist/physics/work-energy/preset.mjs +4 -4
  437. package/dist/physics/work-potential/index.d.mts +1 -0
  438. package/dist/physics/work-potential/preset.d.mts +20 -0
  439. package/dist/physics/work-potential/preset.mjs +276 -0
  440. package/dist/schemas/index.d.mts +6 -6
  441. package/dist/schemas/index.mjs +3 -3
  442. package/dist/statistics/center-spread/preset.mjs +3 -3
  443. package/dist/statistics/core/descriptive.d.mts +2 -2
  444. package/dist/statistics/core/descriptive.mjs +2 -2
  445. package/dist/statistics/core/normal.d.mts +3 -3
  446. package/dist/statistics/core/normal.mjs +3 -3
  447. package/dist/statistics/core/sequences.d.mts +1 -1
  448. package/dist/statistics/galton/preset.mjs +2 -2
  449. package/dist/statistics/histogram/preset.mjs +6 -6
  450. package/dist/statistics/normal/preset.mjs +2 -2
  451. package/dist/statistics/sampling/preset.mjs +4 -4
  452. package/dist/statistics/sequence/preset.mjs +58 -15
  453. package/dist/statistics/z-table/preset.mjs +17 -4
  454. package/package.json +11 -3
  455. package/styles.css +4 -1
@@ -1,10 +1,10 @@
1
1
  //#region src/biology/sequence/core.d.ts
2
2
  /**
3
- * Molecular-sequence core — the base-pairing rules that drive SequenceLab. One
3
+ * Molecular-sequence core, the base-pairing rules that drive SequenceLab. One
4
4
  * tool covers three topics by swapping the rule:
5
- * • replication — DNA template → new DNA strand (A–T, G–C)
6
- * • transcription — DNA template → mRNA (A–U, T–A, G–C, C–G)
7
- * • translation — mRNA codons → amino acids (the genetic code)
5
+ * • replication , DNA template → new DNA strand (A–T, G–C)
6
+ * • transcription, DNA template → mRNA (A–U, T–A, G–C, C–G)
7
+ * • translation , mRNA codons → amino acids (the genetic code)
8
8
  *
9
9
  * Pure data + a builder; the UI lives in the preset. The "unit" is a base for
10
10
  * replication/transcription and a 3-letter codon for translation, so the same
@@ -19,7 +19,7 @@ declare const DNA_COMPLEMENT: Record<string, string>;
19
19
  declare const TRANSCRIBE: Record<string, string>;
20
20
  /** classic CPK-ish base colours, tokenized. */
21
21
  declare const BASE_COLOR: Record<string, string>;
22
- /** standard genetic code — mRNA codon → amino acid (3-letter), Stop for terminators. */
22
+ /** standard genetic code, mRNA codon → amino acid (3-letter), Stop for terminators. */
23
23
  declare const CODON_TABLE: Record<string, string>;
24
24
  interface SequenceModel {
25
25
  kind: SequenceKind;
@@ -28,7 +28,7 @@ interface SequenceModel {
28
28
  options: string[];
29
29
  topLabel: string;
30
30
  bottomLabel: string;
31
- /** true when the partner is itself a base (replication/transcription) — colour it. */
31
+ /** true when the partner is itself a base (replication/transcription), colour it. */
32
32
  partnerIsBase: boolean;
33
33
  }
34
34
  declare function buildSequenceModel(kind: SequenceKind, template: string[]): SequenceModel;
@@ -33,7 +33,7 @@ const BASE_COLOR = {
33
33
  G: "var(--stage-accent-2)",
34
34
  C: "var(--stage-accent)"
35
35
  };
36
- /** standard genetic code — mRNA codon → amino acid (3-letter), Stop for terminators. */
36
+ /** standard genetic code, mRNA codon → amino acid (3-letter), Stop for terminators. */
37
37
  const CODON_TABLE = {
38
38
  UUU: "Phe",
39
39
  UUC: "Phe",
@@ -9,9 +9,9 @@ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
9
9
 
10
10
  //#region src/biology/sequence/preset.tsx
11
11
  /**
12
- * SequenceLab — ONE base-pairing tool for DNA replication, transcription and
12
+ * SequenceLab, ONE base-pairing tool for DNA replication, transcription and
13
13
  * translation. The template strand is given; the learner BUILDS the partner strand
14
- * by pairing each unit (base or codon) — that manipulation is the whole point, so
14
+ * by pairing each unit (base or codon), that manipulation is the whole point, so
15
15
  * it clears the "interactive only when it teaches" bar. Pick a base/amino acid from
16
16
  * the palette, tap the slot under its template unit; correct locks green, wrong
17
17
  * flags red. Replication shows the semiconservative idea: the old strand stays, you
@@ -25,9 +25,9 @@ const hash = (s) => {
25
25
  return h >>> 0;
26
26
  };
27
27
  const DEFAULT_TITLE = {
28
- replication: "DNA replication — build the new strand",
29
- transcription: "Transcription — read DNA into mRNA",
30
- translation: "Translation — read codons into protein"
28
+ replication: "DNA replication, build the new strand",
29
+ transcription: "Transcription, read DNA into mRNA",
30
+ translation: "Translation, read codons into protein"
31
31
  };
32
32
  const DEFAULT_PROMPT = {
33
33
  replication: "Each base pairs A–T and G–C. The old strand stays; you build its complement.",
@@ -205,7 +205,7 @@ function SequenceLab({ kind = "replication", template, title, prompt, objectives
205
205
  /* @__PURE__ */ jsx("b", { children: "old" }),
206
206
  " strand + one ",
207
207
  /* @__PURE__ */ jsx("b", { children: "new" }),
208
- " strand — that’s ",
208
+ " strand, that’s ",
209
209
  /* @__PURE__ */ jsx("b", { children: "semiconservative" }),
210
210
  " replication."
211
211
  ]
@@ -5,7 +5,7 @@ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
5
5
 
6
6
  //#region src/blocks/authoring.tsx
7
7
  /**
8
- * @classytic/labs/blocks — editor UI kit.
8
+ * @classytic/labs/blocks, editor UI kit.
9
9
  *
10
10
  * The creator-facing authoring controls shared by every block's editing panel:
11
11
  * a settings panel, caret-stable text/number inputs, chips, a comma↔array tags
@@ -191,7 +191,7 @@ function JsonArea({ value, onChange, rows = 6 }) {
191
191
  className: "w-full rounded border border-border bg-background px-2 py-1 font-mono text-[11px] leading-snug"
192
192
  }), bad ? /* @__PURE__ */ jsx("span", {
193
193
  className: "text-[11px] text-destructive",
194
- children: "invalid JSON — last valid kept"
194
+ children: "invalid JSON, last valid kept"
195
195
  }) : null]
196
196
  });
197
197
  }
@@ -492,7 +492,7 @@ function IconSwatch({ v, label }) {
492
492
  children: v
493
493
  });
494
494
  }
495
- /** A searchable, categorised icon picker — teachers click an icon (or a scene
495
+ /** A searchable, categorised icon picker, teachers click an icon (or a scene
496
496
  * backdrop), never type emoji. Falls back to a paste-any-emoji field. */
497
497
  function IconPicker({ value, onChange, placeholder = "pick" }) {
498
498
  const [open, setOpen] = useState(false);
@@ -582,7 +582,7 @@ function IconPicker({ value, onChange, placeholder = "pick" }) {
582
582
  }, it.v)), shown.length === 0 && /* @__PURE__ */ jsx("span", {
583
583
  className: "text-[11px] text-muted-foreground",
584
584
  style: { gridColumn: "1 / -1" },
585
- children: "no match — paste any emoji below"
585
+ children: "no match, paste any emoji below"
586
586
  })]
587
587
  }),
588
588
  /* @__PURE__ */ jsx("input", {
@@ -595,7 +595,7 @@ function IconPicker({ value, onChange, placeholder = "pick" }) {
595
595
  })] })]
596
596
  });
597
597
  }
598
- /** Edit an array of records as add/remove/reorder rows of typed fields — the
598
+ /** Edit an array of records as add/remove/reorder rows of typed fields, the
599
599
  * creator-facing alternative to hand-writing JSON. */
600
600
  function RowsEditor({ rows, onChange, columns, newRow, addLabel = "row" }) {
601
601
  const list = Array.isArray(rows) ? rows : [];
@@ -76,9 +76,9 @@ declare const GeneticCrossBlock: import("@classytic/cms-ui/contract").CmsBlock<z
76
76
  }, z.core.$strip>>;
77
77
  declare const SequenceBlock: import("@classytic/cms-ui/contract").CmsBlock<z.ZodObject<{
78
78
  kind: z.ZodDefault<z.ZodEnum<{
79
+ translation: "translation";
79
80
  replication: "replication";
80
81
  transcription: "transcription";
81
- translation: "translation";
82
82
  }>>;
83
83
  template: z.ZodOptional<z.ZodArray<z.ZodString>>;
84
84
  title: z.ZodOptional<z.ZodString>;
@@ -162,9 +162,9 @@ declare const biologyBlocks: readonly [import("@classytic/cms-ui/contract").CmsB
162
162
  prompt: z.ZodOptional<z.ZodString>;
163
163
  }, z.core.$strip>>, import("@classytic/cms-ui/contract").CmsBlock<z.ZodObject<{
164
164
  kind: z.ZodDefault<z.ZodEnum<{
165
+ translation: "translation";
165
166
  replication: "replication";
166
167
  transcription: "transcription";
167
- translation: "translation";
168
168
  }>>;
169
169
  template: z.ZodOptional<z.ZodArray<z.ZodString>>;
170
170
  title: z.ZodOptional<z.ZodString>;
@@ -15,7 +15,7 @@ import { defineBlock } from "@classytic/cms-ui/contract";
15
15
 
16
16
  //#region src/blocks/biology.tsx
17
17
  /**
18
- * @classytic/labs/blocks — biology lab block specs.
18
+ * @classytic/labs/blocks, biology lab block specs.
19
19
  *
20
20
  * `defineBlock` editor adapters for the biology labs. One domain per file;
21
21
  * assembled in `./index.ts` and exported at `@classytic/labs/blocks/biology`.
@@ -25,7 +25,7 @@ const EnzymeRateBlock = defineBlock({
25
25
  tag: "EnzymeRate",
26
26
  void: true,
27
27
  label: "Enzyme rate (optimum & denaturation)",
28
- description: "Drag temperature (or pH); the rate climbs to an optimum then crashes as the lock-and-key active site is mangled — irreversibly for temperature (cooling won’t fix it), reversibly for pH. The bell is built from plotted points.",
28
+ description: "Drag temperature (or pH); the rate climbs to an optimum then crashes as the lock-and-key active site is mangled, irreversibly for temperature (cooling won’t fix it), reversibly for pH. The bell is built from plotted points.",
29
29
  category: "interactive",
30
30
  schema: z.object({
31
31
  factor: z.enum(["temperature", "pH"]).default("temperature"),
@@ -87,7 +87,7 @@ const PhotosynthesisFactorsBlock = defineBlock({
87
87
  key: "photosynthesis-factors",
88
88
  tag: "PhotosynthesisFactors",
89
89
  void: true,
90
- label: "Photosynthesis — limiting factors",
90
+ label: "Photosynthesis: limiting factors",
91
91
  description: "Sliders for light, CO₂ and temperature; the rate climbs then plateaus at the factor in shortest supply (raise it → higher plateau), while temperature gives a peak (denaturation). Freeze curves to compare.",
92
92
  category: "interactive",
93
93
  schema: z.object({
@@ -227,7 +227,7 @@ const GeneticCrossBlock = defineBlock({
227
227
  tag: "GeneticCross",
228
228
  void: true,
229
229
  label: "Genetic cross (dominance / codominance / blood groups)",
230
- description: "The general cross tool: pick a pattern — simple dominance, ABO blood groups (multiple alleles + codominance → AB), or incomplete dominance (red × white → pink) — or author your own allele model. Gametes drop onto the 2×2 grid; genotype + phenotype ratios read off as tally bars. Predict-before-reveal.",
230
+ description: "The general cross tool: pick a pattern, simple dominance, ABO blood groups (multiple alleles + codominance → AB), or incomplete dominance (red × white → pink), or author your own allele model. Gametes drop onto the 2×2 grid; genotype + phenotype ratios read off as tally bars. Predict-before-reveal.",
231
231
  category: "interactive",
232
232
  schema: z.object({
233
233
  preset: z.enum([
@@ -324,7 +324,7 @@ const SequenceBlock = defineBlock({
324
324
  tag: "Sequence",
325
325
  void: true,
326
326
  label: "DNA/RNA sequence (replication / transcription / translation)",
327
- description: "A base-pairing builder: the template strand is given and the learner builds the partner by pairing each unit. Pick the process — replication (A–T, G–C, semiconservative), transcription (T→U into mRNA), or translation (codons → amino acids via the genetic code) — and the template.",
327
+ description: "A base-pairing builder: the template strand is given and the learner builds the partner by pairing each unit. Pick the process, replication (A–T, G–C, semiconservative), transcription (T→U into mRNA), or translation (codons → amino acids via the genetic code), and the template.",
328
328
  category: "interactive",
329
329
  schema: z.object({
330
330
  kind: z.enum([
@@ -23,9 +23,9 @@ declare const KineticsBlock: LabBlock;
23
23
  declare const TitrationBlock: LabBlock;
24
24
  declare const GasBoxBlock: import("@classytic/cms-ui/contract").CmsBlock<z.ZodObject<{
25
25
  holdConstant: z.ZodDefault<z.ZodEnum<{
26
- temperature: "temperature";
27
26
  none: "none";
28
27
  volume: "volume";
28
+ temperature: "temperature";
29
29
  pressure: "pressure";
30
30
  }>>;
31
31
  particleCount: z.ZodDefault<z.ZodNumber>;
@@ -70,9 +70,9 @@ declare const BatteryBlock: import("@classytic/cms-ui/contract").CmsBlock<z.ZodO
70
70
  }, z.core.$strip>>;
71
71
  declare const chemBlocks: readonly [import("@classytic/cms-ui/contract").CmsBlock<z.ZodObject<{
72
72
  holdConstant: z.ZodDefault<z.ZodEnum<{
73
- temperature: "temperature";
74
73
  none: "none";
75
74
  volume: "volume";
75
+ temperature: "temperature";
76
76
  pressure: "pressure";
77
77
  }>>;
78
78
  particleCount: z.ZodDefault<z.ZodNumber>;
@@ -19,7 +19,7 @@ import { defineBlock } from "@classytic/cms-ui/contract";
19
19
 
20
20
  //#region src/blocks/chem.tsx
21
21
  /**
22
- * @classytic/labs/blocks — chemistry lab block specs.
22
+ * @classytic/labs/blocks, chemistry lab block specs.
23
23
  *
24
24
  * `defineBlock` editor adapters for the chemistry labs (one domain per file; the
25
25
  * registry is assembled in `./index.ts`). Each spec pairs a real zod schema with
@@ -29,8 +29,8 @@ import { defineBlock } from "@classytic/cms-ui/contract";
29
29
  */
30
30
  const LeChatelierBlock = labBlock({
31
31
  key: "le-chatelier",
32
- label: "Le Chatelier — equilibrium shifts",
33
- description: "A reversible reaction A ⇌ νB at equilibrium (Q = K). Stress it — add a species, compress, heat — and it shifts to oppose the change (shift direction emerges from the core, never hardcoded). AUTHOR YOUR OWN reaction: set the species names, product coefficient, colours, K, and whether the forward reaction is endothermic. Defaults to N₂O₄ ⇌ 2 NO₂ (colourless ⇌ brown).",
32
+ label: "Le Chatelier: equilibrium shifts",
33
+ description: "A reversible reaction A ⇌ νB at equilibrium (Q = K). Stress it, add a species, compress, heat, and it shifts to oppose the change (shift direction emerges from the core, never hardcoded). AUTHOR YOUR OWN reaction: set the species names, product coefficient, colours, K, and whether the forward reaction is endothermic. Defaults to N₂O₄ ⇌ 2 NO₂ (colourless ⇌ brown).",
34
34
  schema: z.object({
35
35
  reactantName: z.string().optional().describe("left species, e.g. N₂O₄"),
36
36
  productName: z.string().optional().describe("right species, e.g. NO₂"),
@@ -46,7 +46,7 @@ const LeChatelierBlock = labBlock({
46
46
  const ElectrochemBlock = labBlock({
47
47
  key: "electrochem",
48
48
  label: "Galvanic cell (Nernst EMF)",
49
- description: "A voltaic cell with two metal half-cells, a salt bridge, and a live voltmeter. The lower-E° metal is the anode (−); electrons flow to the cathode (+). The meter reads the Nernst EMF E = E°cell − (RT/nF)·ln Q, so changing an ion concentration moves the voltage — or pick the same metal both sides for a concentration cell. Author the two electrodes + concentrations.",
49
+ description: "A voltaic cell with two metal half-cells, a salt bridge, and a live voltmeter. The lower-E° metal is the anode (−); electrons flow to the cathode (+). The meter reads the Nernst EMF E = E°cell − (RT/nF)·ln Q, so changing an ion concentration moves the voltage, or pick the same metal both sides for a concentration cell. Author the two electrodes + concentrations.",
50
50
  schema: z.object({
51
51
  metalA: z.enum([
52
52
  "Mg",
@@ -77,7 +77,7 @@ const ElectrochemBlock = labBlock({
77
77
  const PeriodicTrendsBlock = labBlock({
78
78
  key: "periodic-trends",
79
79
  label: "Periodic trends (heatmap)",
80
- description: "The periodic table (H–Xe) coloured by a property — atomic radius, ionisation energy or electronegativity — so the trend reads as a gradient: radius grows down/left, ionisation energy & electronegativity grow up/right. Hover an element for its value. Pick the default property and a highlighted element; ships a predict-first question.",
80
+ description: "The periodic table (H–Xe) coloured by a property, atomic radius, ionisation energy or electronegativity, so the trend reads as a gradient: radius grows down/left, ionisation energy & electronegativity grow up/right. Hover an element for its value. Pick the default property and a highlighted element; ships a predict-first question.",
81
81
  schema: z.object({
82
82
  property: z.enum([
83
83
  "radius",
@@ -108,7 +108,7 @@ const StoichiometryBlock = labBlock({
108
108
  const KineticsBlock = labBlock({
109
109
  key: "kinetics",
110
110
  label: "Reaction kinetics (collisions + Arrhenius)",
111
- description: "A vessel of molecules where only high-energy collisions (≥ Eₐ) succeed and convert A→B, beside the Maxwell–Boltzmann energy spread (shaded reactive tail) and a live A/B bar. Heat it or add a catalyst (lowers Eₐ) and watch the rate jump — backed by k = A·e^(−Eₐ/RT). Author the activation energy, rate, order, molecule count and temperature; ships a predict-first question.",
111
+ description: "A vessel of molecules where only high-energy collisions (≥ Eₐ) succeed and convert A→B, beside the Maxwell–Boltzmann energy spread (shaded reactive tail) and a live A/B bar. Heat it or add a catalyst (lowers Eₐ) and watch the rate jump, backed by k = A·e^(−Eₐ/RT). Author the activation energy, rate, order, molecule count and temperature; ships a predict-first question.",
112
112
  schema: z.object({
113
113
  EaKJ: z.number().optional().describe("activation energy, kJ/mol"),
114
114
  kRef: z.number().optional().describe("rate constant at 300 K (sets the pace)"),
@@ -142,7 +142,7 @@ const GasBoxBlock = defineBlock({
142
142
  tag: "GasBox",
143
143
  void: true,
144
144
  label: "Gas box (PV = nRT, kinetic theory)",
145
- description: "Hundreds of molecules bounce in a box; drag the piston (V), heat it (T), add molecules (n) — pressure is MEASURED from wall collisions, so PV=nRT emerges. Lock T/V/P for Boyle/Gay-Lussac/Charles.",
145
+ description: "Hundreds of molecules bounce in a box; drag the piston (V), heat it (T), add molecules (n), pressure is MEASURED from wall collisions, so PV=nRT emerges. Lock T/V/P for Boyle/Gay-Lussac/Charles.",
146
146
  category: "interactive",
147
147
  schema: z.object({
148
148
  holdConstant: z.enum([
@@ -200,7 +200,7 @@ const SolutionBoxBlock = defineBlock({
200
200
  tag: "SolutionBox",
201
201
  void: true,
202
202
  label: "Solution box (molarity = n/V)",
203
- description: "Solute as dots in a box: add solute (more dots) or water (same dots, bigger box) — M=n/V shows as a number AND colour intensity. Draggable probe proves molarity is a local density.",
203
+ description: "Solute as dots in a box: add solute (more dots) or water (same dots, bigger box), M=n/V shows as a number AND colour intensity. Draggable probe proves molarity is a local density.",
204
204
  category: "interactive",
205
205
  schema: z.object({
206
206
  moles: z.number().default(.5),
@@ -249,7 +249,7 @@ const DilutionBlock = defineBlock({
249
249
  tag: "Dilution",
250
250
  void: true,
251
251
  label: "Dilution (C₁V₁ = C₂V₂)",
252
- description: "Two beakers show the SAME solute dots — concentrated in the aliquot, spread in the final volume — so C₁V₁=C₂V₂ is seen as conservation of moles: same dots, bigger box, lower concentration.",
252
+ description: "Two beakers show the SAME solute dots, concentrated in the aliquot, spread in the final volume, so C₁V₁=C₂V₂ is seen as conservation of moles: same dots, bigger box, lower concentration.",
253
253
  category: "interactive",
254
254
  schema: z.object({
255
255
  stockConcentration: z.number().default(2),
@@ -297,7 +297,7 @@ const BohrAtomBlock = defineBlock({
297
297
  key: "bohr-atom",
298
298
  void: true,
299
299
  label: "Bohr atom",
300
- description: "Animated shell model — drag Z to walk the first 20 elements; shells fill 2, 8, 8.",
300
+ description: "Animated shell model, drag Z to walk the first 20 elements; shells fill 2, 8, 8.",
301
301
  category: "interactive",
302
302
  schema: z.object({
303
303
  protons: z.number().optional(),
@@ -331,7 +331,7 @@ const ReactionProfileBlock = defineBlock({
331
331
  key: "reaction-profile",
332
332
  void: true,
333
333
  label: "Reaction profile",
334
- description: "Energy diagram — activation energy, ΔH (exo/endothermic), catalyst toggle.",
334
+ description: "Energy diagram, activation energy, ΔH (exo/endothermic), catalyst toggle.",
335
335
  category: "interactive",
336
336
  schema: z.object({
337
337
  deltaH: z.number().optional(),
@@ -381,7 +381,7 @@ const ReactionLabBlock = defineBlock({
381
381
  key: "reaction-lab",
382
382
  void: true,
383
383
  label: "Reaction lab",
384
- description: "Atoms collide and bond — A + B → A–B, with a temperature/kinetics knob.",
384
+ description: "Atoms collide and bond, A + B → A–B, with a temperature/kinetics knob.",
385
385
  category: "interactive",
386
386
  schema: z.object({
387
387
  a: z.string().optional(),
@@ -422,7 +422,7 @@ const BatteryBlock = defineBlock({
422
422
  key: "battery",
423
423
  void: true,
424
424
  label: "Battery (galvanic cell)",
425
- description: "Electrons flow from anode to cathode — half-reactions + EMF.",
425
+ description: "Electrons flow from anode to cathode, half-reactions + EMF.",
426
426
  category: "interactive",
427
427
  schema: z.object({
428
428
  emf: z.number().optional(),