@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
@@ -0,0 +1,177 @@
1
+ import { getGate } from "./registry.mjs";
2
+
3
+ //#region src/logic/edit-ops.ts
4
+ /**
5
+ * Pure, immutable transforms for the LogicEditor — every edit returns a NEW LogicDoc so the
6
+ * editor stays undoable/serializable (mirrors the analog builder's editor-ops). A "node" is an
7
+ * input, a gate, or an output. Wires are implicit: a gate input slot (or an output) simply
8
+ * names the source node that feeds it, so connecting = writing that id and deleting a node =
9
+ * clearing every reference to it.
10
+ */
11
+ const LETTERS = "ABCDEFGHJKLMN";
12
+ function freshId(doc, prefix) {
13
+ const used = new Set([
14
+ ...doc.inputs,
15
+ ...doc.gates,
16
+ ...doc.outputs
17
+ ].map((n) => n.id));
18
+ let k = 1;
19
+ while (used.has(`${prefix}${k}`)) k++;
20
+ return `${prefix}${k}`;
21
+ }
22
+ /** Add an input / output / gate (kind = 'input' | 'output' | a registered gate kind). */
23
+ function addNode(doc, kind, at) {
24
+ if (kind === "input") {
25
+ const id = freshId(doc, "in");
26
+ const label = LETTERS[doc.inputs.length] ?? id;
27
+ return {
28
+ doc: {
29
+ ...doc,
30
+ inputs: [...doc.inputs, {
31
+ id,
32
+ label,
33
+ value: false,
34
+ x: at.x,
35
+ y: at.y
36
+ }]
37
+ },
38
+ id
39
+ };
40
+ }
41
+ if (kind === "output") {
42
+ const id = freshId(doc, "out");
43
+ const label = doc.outputs.length === 0 ? "Y" : `Y${doc.outputs.length}`;
44
+ return {
45
+ doc: {
46
+ ...doc,
47
+ outputs: [...doc.outputs, {
48
+ id,
49
+ in: "",
50
+ label,
51
+ x: at.x,
52
+ y: at.y
53
+ }]
54
+ },
55
+ id
56
+ };
57
+ }
58
+ const arity = getGate(kind)?.arity ?? 2;
59
+ const id = freshId(doc, "g");
60
+ return {
61
+ doc: {
62
+ ...doc,
63
+ gates: [...doc.gates, {
64
+ id,
65
+ kind,
66
+ in: Array(arity).fill(""),
67
+ x: at.x,
68
+ y: at.y
69
+ }]
70
+ },
71
+ id
72
+ };
73
+ }
74
+ /** Move any node to a new position. */
75
+ function moveNode(doc, id, at) {
76
+ const set = (n) => n.id === id ? {
77
+ ...n,
78
+ x: at.x,
79
+ y: at.y
80
+ } : n;
81
+ return {
82
+ ...doc,
83
+ inputs: doc.inputs.map(set),
84
+ gates: doc.gates.map(set),
85
+ outputs: doc.outputs.map(set)
86
+ };
87
+ }
88
+ /** Wire a source node into a sink (a gate input slot, or an output). No-op for invalid pairs. */
89
+ function connect(doc, fromId, sink) {
90
+ if (!fromId || fromId === sink.nodeId) return doc;
91
+ if (!(doc.inputs.some((i) => i.id === fromId) || doc.gates.some((g) => g.id === fromId))) return doc;
92
+ return {
93
+ ...doc,
94
+ gates: doc.gates.map((g) => g.id === sink.nodeId ? {
95
+ ...g,
96
+ in: g.in.map((v, i) => i === (sink.slot ?? 0) ? fromId : v)
97
+ } : g),
98
+ outputs: doc.outputs.map((o) => o.id === sink.nodeId ? {
99
+ ...o,
100
+ in: fromId
101
+ } : o)
102
+ };
103
+ }
104
+ /** Clear the wire feeding a sink slot. */
105
+ function disconnect(doc, sink) {
106
+ return {
107
+ ...doc,
108
+ gates: doc.gates.map((g) => g.id === sink.nodeId ? {
109
+ ...g,
110
+ in: g.in.map((v, i) => i === (sink.slot ?? 0) ? "" : v)
111
+ } : g),
112
+ outputs: doc.outputs.map((o) => o.id === sink.nodeId ? {
113
+ ...o,
114
+ in: ""
115
+ } : o)
116
+ };
117
+ }
118
+ /** Delete a node and clear every reference to it. */
119
+ function deleteNode(doc, id) {
120
+ return {
121
+ ...doc,
122
+ inputs: doc.inputs.filter((i) => i.id !== id),
123
+ gates: doc.gates.filter((g) => g.id !== id).map((g) => ({
124
+ ...g,
125
+ in: g.in.map((v) => v === id ? "" : v)
126
+ })),
127
+ outputs: doc.outputs.filter((o) => o.id !== id).map((o) => o.in === id ? {
128
+ ...o,
129
+ in: ""
130
+ } : o)
131
+ };
132
+ }
133
+ /** Toggle / set a primary input's value. */
134
+ function setInputValue(doc, id, value) {
135
+ return {
136
+ ...doc,
137
+ inputs: doc.inputs.map((i) => i.id === id ? {
138
+ ...i,
139
+ value
140
+ } : i)
141
+ };
142
+ }
143
+ function toggleInput(doc, id) {
144
+ return {
145
+ ...doc,
146
+ inputs: doc.inputs.map((i) => i.id === id ? {
147
+ ...i,
148
+ value: !i.value
149
+ } : i)
150
+ };
151
+ }
152
+ /** Rename a node's label (any node type). */
153
+ function relabel(doc, id, label) {
154
+ const set = (n) => n.id === id ? {
155
+ ...n,
156
+ label
157
+ } : n;
158
+ return {
159
+ ...doc,
160
+ inputs: doc.inputs.map(set),
161
+ gates: doc.gates.map(set),
162
+ outputs: doc.outputs.map(set)
163
+ };
164
+ }
165
+ /** Set / clear an output's goal value (for graded build challenges). */
166
+ function setGoal(doc, outId, goal) {
167
+ return {
168
+ ...doc,
169
+ outputs: doc.outputs.map((o) => o.id === outId ? {
170
+ ...o,
171
+ goal
172
+ } : o)
173
+ };
174
+ }
175
+
176
+ //#endregion
177
+ export { addNode, connect, deleteNode, disconnect, moveNode, relabel, setGoal, setInputValue, toggleInput };
@@ -0,0 +1,11 @@
1
+ import { LogicDoc, LogicSolution } from "./contract.mjs";
2
+
3
+ //#region src/logic/evaluate.d.ts
4
+ declare function evaluate(doc: LogicDoc): LogicSolution;
5
+ /** The full truth table for a doc: every input combination → output values. */
6
+ declare function truthTable(doc: LogicDoc): {
7
+ inputs: boolean[];
8
+ outputs: Record<string, boolean>;
9
+ }[];
10
+ //#endregion
11
+ export { evaluate, truthTable };
@@ -0,0 +1,93 @@
1
+ import { getGate } from "./registry.mjs";
2
+ import { registerBuiltinGates } from "./gates.mjs";
3
+
4
+ //#region src/logic/evaluate.ts
5
+ /**
6
+ * Evaluate a LogicDoc in one pass: resolve every node's boolean value (memoised, with a
7
+ * cycle guard) and compute the propagation LEVELS (inputs at level 0, each gate one level
8
+ * past its deepest input). The levels let a lesson light the signal up step by step, and
9
+ * `high(nodeId)` tells the renderer which wires are carrying a 1.
10
+ */
11
+ registerBuiltinGates();
12
+ function evaluate(doc) {
13
+ const inputVal = new Map(doc.inputs.map((i) => [i.id, !!i.value]));
14
+ const gateById = new Map(doc.gates.map((g) => [g.id, g]));
15
+ const memo = /* @__PURE__ */ new Map();
16
+ const visiting = /* @__PURE__ */ new Set();
17
+ const value = (id) => {
18
+ if (inputVal.has(id)) return inputVal.get(id);
19
+ if (memo.has(id)) return memo.get(id);
20
+ if (visiting.has(id)) return false;
21
+ const g = gateById.get(id);
22
+ if (!g) return false;
23
+ visiting.add(id);
24
+ const def = getGate(g.kind);
25
+ const out = def ? def.eval(g.in.map(value)) : false;
26
+ visiting.delete(id);
27
+ memo.set(id, out);
28
+ return out;
29
+ };
30
+ for (const g of doc.gates) value(g.id);
31
+ const depth = /* @__PURE__ */ new Map();
32
+ for (const i of doc.inputs) depth.set(i.id, 0);
33
+ let changed = true;
34
+ let guard = 0;
35
+ while (changed && guard++ < doc.gates.length + 2) {
36
+ changed = false;
37
+ for (const g of doc.gates) {
38
+ const d = Math.max(0, ...g.in.map((x) => depth.get(x) ?? 0)) + 1;
39
+ if (depth.get(g.id) !== d) {
40
+ depth.set(g.id, d);
41
+ changed = true;
42
+ }
43
+ }
44
+ }
45
+ const maxD = Math.max(0, ...depth.values());
46
+ const levels = Array.from({ length: maxD + 1 }, () => []);
47
+ for (const [id, d] of depth) (levels[d] ??= []).push(id);
48
+ const outputs = {};
49
+ let goalCount = 0;
50
+ let goalsMet = true;
51
+ for (const o of doc.outputs) {
52
+ outputs[o.id] = value(o.in);
53
+ if (o.goal !== void 0) {
54
+ goalCount++;
55
+ if (outputs[o.id] !== o.goal) goalsMet = false;
56
+ }
57
+ }
58
+ return {
59
+ value,
60
+ levels,
61
+ depthOf: (id) => depth.get(id) ?? 0,
62
+ high: value,
63
+ outputs,
64
+ allGoalsMet: goalCount > 0 && goalsMet
65
+ };
66
+ }
67
+ /** A truth table is 2^n rows; past this it is both impractical to show and unsafe
68
+ * for 32-bit bit shifts. Callers should guard before rendering one. */
69
+ const MAX_TRUTH_TABLE_VARS = 12;
70
+ /** The full truth table for a doc: every input combination → output values. */
71
+ function truthTable(doc) {
72
+ const n = doc.inputs.length;
73
+ if (n > 12) throw new RangeError(`truthTable: ${n} inputs exceeds the ${12}-variable limit (${2 ** n} rows).`);
74
+ const rows = [];
75
+ for (let m = 0; m < 2 ** n; m++) {
76
+ const bits = doc.inputs.map((_, k) => Boolean(m >> n - 1 - k & 1));
77
+ const probe = {
78
+ ...doc,
79
+ inputs: doc.inputs.map((inp, k) => ({
80
+ ...inp,
81
+ value: bits[k]
82
+ }))
83
+ };
84
+ rows.push({
85
+ inputs: bits,
86
+ outputs: evaluate(probe).outputs
87
+ });
88
+ }
89
+ return rows;
90
+ }
91
+
92
+ //#endregion
93
+ export { evaluate, truthTable };
@@ -0,0 +1,10 @@
1
+ //#region src/logic/gates.d.ts
2
+ /**
3
+ * The built-in logic gates. Each is ONE GateDef: its boolean function + its glyph.
4
+ * AND/OR are variadic (n inputs); NOT/buffer take one. NAND is the universal gate —
5
+ * every other gate can be built from NANDs (the lessons lean on this).
6
+ */
7
+ /** Register the built-in gates (idempotent). Imported for its side effect. */
8
+ declare function registerBuiltinGates(): void;
9
+ //#endregion
10
+ export { registerBuiltinGates };
@@ -0,0 +1,73 @@
1
+ import { registerGate } from "./registry.mjs";
2
+
3
+ //#region src/logic/gates.ts
4
+ const parity = (i) => i.filter(Boolean).length % 2;
5
+ const GATES = [
6
+ {
7
+ kind: "AND",
8
+ label: "AND",
9
+ glyph: "AND",
10
+ arity: 2,
11
+ eval: (i) => i.length > 0 && i.every(Boolean)
12
+ },
13
+ {
14
+ kind: "OR",
15
+ label: "OR",
16
+ glyph: "OR",
17
+ arity: 2,
18
+ eval: (i) => i.some(Boolean)
19
+ },
20
+ {
21
+ kind: "NOT",
22
+ label: "NOT",
23
+ glyph: "NOT",
24
+ arity: 1,
25
+ eval: (i) => !i[0]
26
+ },
27
+ {
28
+ kind: "NAND",
29
+ label: "NAND",
30
+ glyph: "NAND",
31
+ arity: 2,
32
+ eval: (i) => !(i.length > 0 && i.every(Boolean))
33
+ },
34
+ {
35
+ kind: "NOR",
36
+ label: "NOR",
37
+ glyph: "NOR",
38
+ arity: 2,
39
+ eval: (i) => !i.some(Boolean)
40
+ },
41
+ {
42
+ kind: "XOR",
43
+ label: "XOR",
44
+ glyph: "XOR",
45
+ arity: 2,
46
+ eval: (i) => parity(i) === 1
47
+ },
48
+ {
49
+ kind: "XNOR",
50
+ label: "XNOR",
51
+ glyph: "XNOR",
52
+ arity: 2,
53
+ eval: (i) => parity(i) === 0
54
+ },
55
+ {
56
+ kind: "buffer",
57
+ label: "BUF",
58
+ glyph: "NOT",
59
+ arity: 1,
60
+ eval: (i) => !!i[0]
61
+ }
62
+ ];
63
+ let registered = false;
64
+ /** Register the built-in gates (idempotent). Imported for its side effect. */
65
+ function registerBuiltinGates() {
66
+ if (registered) return;
67
+ registered = true;
68
+ GATES.forEach(registerGate);
69
+ }
70
+ registerBuiltinGates();
71
+
72
+ //#endregion
73
+ export { registerBuiltinGates };
@@ -0,0 +1,14 @@
1
+ import { GateType } from "../kit/logic-gates.mjs";
2
+ import { GateDef, LogicDoc, LogicGate, LogicInput, LogicOutput, LogicSolution } from "./contract.mjs";
3
+ import { getGate, listGates, registerGate } from "./registry.mjs";
4
+ import { registerBuiltinGates } from "./gates.mjs";
5
+ import { evaluate, truthTable } from "./evaluate.mjs";
6
+ import { LogicScene, LogicSceneProps } from "./LogicScene.mjs";
7
+ import { LogicGateLab, LogicGateProps } from "./lab.mjs";
8
+ import { BinaryDisplayLab, BinaryDisplayProps } from "./display.mjs";
9
+ import { LogicEditor, LogicEditorProps } from "./LogicEditor.mjs";
10
+ import { PortRef, addNode, connect, deleteNode, disconnect, moveNode, relabel, setGoal, setInputValue, toggleInput } from "./edit-ops.mjs";
11
+ import { LogicEditScene, LogicEditSceneProps } from "./LogicEditScene.mjs";
12
+ import { LogicBuildLab, LogicBuildProps } from "./LogicBuildLab.mjs";
13
+ import { LOGIC_PRESETS, LogicPresetKey, presetDoc } from "./presets.mjs";
14
+ export { BinaryDisplayLab, type BinaryDisplayProps, type GateDef, type GateType, LOGIC_PRESETS, LogicBuildLab, type LogicBuildProps, type LogicDoc, LogicEditScene, type LogicEditSceneProps, LogicEditor, type LogicEditorProps, type LogicGate, LogicGateLab, type LogicGateProps, type LogicInput, type LogicOutput, type LogicPresetKey, LogicScene, type LogicSceneProps, type LogicSolution, type PortRef, addNode, connect, deleteNode, disconnect, evaluate, getGate, listGates, moveNode, presetDoc, registerBuiltinGates, registerGate, relabel, setGoal, setInputValue, toggleInput, truthTable };
@@ -0,0 +1,13 @@
1
+ import { getGate, listGates, registerGate } from "./registry.mjs";
2
+ import { registerBuiltinGates } from "./gates.mjs";
3
+ import { evaluate, truthTable } from "./evaluate.mjs";
4
+ import { LogicScene } from "./LogicScene.mjs";
5
+ import { LOGIC_PRESETS, presetDoc } from "./presets.mjs";
6
+ import { LogicGateLab } from "./lab.mjs";
7
+ import { BinaryDisplayLab } from "./display.mjs";
8
+ import { LogicEditScene } from "./LogicEditScene.mjs";
9
+ import { addNode, connect, deleteNode, disconnect, moveNode, relabel, setGoal, setInputValue, toggleInput } from "./edit-ops.mjs";
10
+ import { LogicEditor } from "./LogicEditor.mjs";
11
+ import { LogicBuildLab } from "./LogicBuildLab.mjs";
12
+
13
+ export { BinaryDisplayLab, LOGIC_PRESETS, LogicBuildLab, LogicEditScene, LogicEditor, LogicGateLab, LogicScene, addNode, connect, deleteNode, disconnect, evaluate, getGate, listGates, moveNode, presetDoc, registerBuiltinGates, registerGate, relabel, setGoal, setInputValue, toggleInput, truthTable };
@@ -0,0 +1,32 @@
1
+ import { LabAskSpec } from "../kit/ask.mjs";
2
+ import { LogicDoc } from "./contract.mjs";
3
+ import { ReactNode } from "react";
4
+
5
+ //#region src/logic/lab.d.ts
6
+ interface LogicGateProps {
7
+ doc?: LogicDoc;
8
+ /** a named preset (and/or/xor/nand-not/nand-and/nand-or/half-adder/full-adder). */
9
+ preset?: string;
10
+ mode?: 'explore' | 'predict';
11
+ /** show the step control that lights the signal up level by level. */
12
+ steps?: boolean;
13
+ /** show the full truth table alongside. */
14
+ showTable?: boolean;
15
+ title?: string;
16
+ prompt?: string;
17
+ ask?: LabAskSpec;
18
+ activity?: string;
19
+ }
20
+ declare function LogicGateLab({
21
+ doc: doc0,
22
+ preset,
23
+ mode,
24
+ steps,
25
+ showTable,
26
+ title,
27
+ prompt,
28
+ ask,
29
+ activity
30
+ }?: LogicGateProps): ReactNode;
31
+ //#endregion
32
+ export { LogicGateLab, LogicGateProps };
@@ -0,0 +1,160 @@
1
+ 'use client';
2
+
3
+ import { Callout, ControlBar, Field, LabFrame } from "../kit/frame.mjs";
4
+ import { useCheckpoint } from "../kit/pedagogy.mjs";
5
+ import { LabAsk } from "../kit/ask.mjs";
6
+ import { evaluate, truthTable } from "./evaluate.mjs";
7
+ import { LogicScene } from "./LogicScene.mjs";
8
+ import { presetDoc } from "./presets.mjs";
9
+ import { useState } from "react";
10
+ import { jsx, jsxs } from "react/jsx-runtime";
11
+
12
+ //#region src/logic/lab.tsx
13
+ /**
14
+ * LogicGateLab — the authorable digital-logic lesson. It renders a LogicDoc with the engine
15
+ * (live wires show the propagating signal), lets the learner toggle inputs, and runs in two
16
+ * modes: EXPLORE (drive the inputs to meet a goal) or PREDICT (the output is hidden behind a
17
+ * '?', tap to guess 0/1, green ring + checkpoint when right). An optional step control lights
18
+ * the signal up one propagation level at a time. A live truth table sits alongside.
19
+ */
20
+ const cycle = (g) => g === "?" ? "1" : g === "1" ? "0" : "1";
21
+ function LogicGateLab({ doc: doc0, preset = "and", mode = "explore", steps = false, showTable = true, title = "Logic gates: follow the signal", prompt, ask, activity = "logic-gate" } = {}) {
22
+ const [doc, setDoc] = useState(() => doc0 ?? presetDoc(preset));
23
+ const [guess, setGuess] = useState({});
24
+ const [step, setStep] = useState(steps ? 0 : void 0);
25
+ const sol = evaluate(doc);
26
+ const hasGoal = doc.outputs.some((o) => o.goal !== void 0);
27
+ const predicting = mode === "predict";
28
+ const allPredicted = predicting && doc.outputs.every((o) => guess[o.id] && guess[o.id] !== "?" && guess[o.id] === "1" === (sol.outputs[o.id] ?? false));
29
+ const solved = predicting ? allPredicted : hasGoal ? sol.allGoalsMet : false;
30
+ useCheckpoint({
31
+ solved,
32
+ activity
33
+ });
34
+ const toggleInput = (id) => setDoc((d) => ({
35
+ ...d,
36
+ inputs: d.inputs.map((i) => i.id === id ? {
37
+ ...i,
38
+ value: !i.value
39
+ } : i)
40
+ }));
41
+ const figure = /* @__PURE__ */ jsx(LogicScene, {
42
+ doc,
43
+ onToggleInput: predicting ? void 0 : toggleInput,
44
+ onOutputClick: predicting ? (id) => setGuess((g) => ({
45
+ ...g,
46
+ [id]: cycle(g[id] ?? "?")
47
+ })) : void 0,
48
+ outputText: predicting ? (id, actual) => guess[id] && guess[id] !== "?" ? guess[id] : "?" : void 0,
49
+ outputState: predicting ? (id, actual) => {
50
+ const g = guess[id];
51
+ return !g || g === "?" ? void 0 : g === "1" === actual ? "ok" : "no";
52
+ } : void 0,
53
+ reveal: predicting && !solved ? 0 : step,
54
+ showValues: !predicting,
55
+ ariaLabel: `logic circuit, ${predicting ? "predict the output" : "toggle the inputs"}`
56
+ });
57
+ const rows = showTable ? truthTable(doc) : [];
58
+ const curKey = doc.inputs.map((i) => i.value ? 1 : 0).join("");
59
+ const table = showTable ? /* @__PURE__ */ jsx("div", {
60
+ style: { overflowX: "auto" },
61
+ children: /* @__PURE__ */ jsxs("table", {
62
+ style: {
63
+ borderCollapse: "collapse",
64
+ fontSize: 12,
65
+ fontVariantNumeric: "tabular-nums"
66
+ },
67
+ children: [/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [doc.inputs.map((i) => /* @__PURE__ */ jsx("th", {
68
+ style: {
69
+ padding: "3px 7px",
70
+ color: "var(--stage-fg)",
71
+ borderBottom: "1px solid var(--stage-grid)"
72
+ },
73
+ children: i.label ?? i.id
74
+ }, i.id)), doc.outputs.map((o) => /* @__PURE__ */ jsx("th", {
75
+ style: {
76
+ padding: "3px 7px",
77
+ color: "var(--stage-accent)",
78
+ borderBottom: "1px solid var(--stage-grid)"
79
+ },
80
+ children: o.label ?? o.id
81
+ }, o.id))] }) }), /* @__PURE__ */ jsx("tbody", { children: rows.map((r, ri) => {
82
+ return /* @__PURE__ */ jsxs("tr", {
83
+ style: { background: r.inputs.map((b) => b ? 1 : 0).join("") === curKey ? "color-mix(in oklab, var(--stage-accent) 14%, transparent)" : "transparent" },
84
+ children: [r.inputs.map((b, k) => /* @__PURE__ */ jsx("td", {
85
+ style: {
86
+ padding: "3px 7px",
87
+ textAlign: "center",
88
+ color: "var(--stage-muted)"
89
+ },
90
+ children: b ? 1 : 0
91
+ }, k)), doc.outputs.map((o) => /* @__PURE__ */ jsx("td", {
92
+ style: {
93
+ padding: "3px 7px",
94
+ textAlign: "center",
95
+ fontWeight: 700,
96
+ color: r.outputs[o.id] ? "var(--stage-good)" : "var(--stage-fg)"
97
+ },
98
+ children: r.outputs[o.id] ? 1 : 0
99
+ }, o.id))]
100
+ }, ri);
101
+ }) })]
102
+ })
103
+ }) : null;
104
+ const controls = steps && !predicting ? /* @__PURE__ */ jsx(ControlBar, { children: /* @__PURE__ */ jsx(Field, {
105
+ label: "propagation step",
106
+ value: `${step ?? 0} / ${sol.levels.length - 1}`,
107
+ children: /* @__PURE__ */ jsx("input", {
108
+ type: "range",
109
+ min: 0,
110
+ max: sol.levels.length - 1,
111
+ step: 1,
112
+ value: step ?? 0,
113
+ onChange: (e) => setStep(Number(e.target.value)),
114
+ "aria-label": "propagation step"
115
+ })
116
+ }) }) : void 0;
117
+ return /* @__PURE__ */ jsx(LabFrame, {
118
+ title,
119
+ prompt: prompt ?? (predicting ? "Work out the output for these inputs, then tap the LED to check." : "Tap the input switches. A wire glows when it carries a 1, so you can watch the signal flow through the gates."),
120
+ controls,
121
+ aside: /* @__PURE__ */ jsxs("div", {
122
+ style: {
123
+ display: "flex",
124
+ flexDirection: "column",
125
+ gap: 10
126
+ },
127
+ children: [/* @__PURE__ */ jsx("div", {
128
+ className: "lab-pill",
129
+ "data-state": solved ? "ok" : "no",
130
+ role: "status",
131
+ style: { alignSelf: "flex-start" },
132
+ children: predicting ? solved ? "✓ correct — that is the output" : "tap the output LED to predict 0 or 1" : hasGoal ? solved ? "✓ goal met" : "toggle the inputs to reach the goal" : "toggle the inputs and watch the signal"
133
+ }), showTable && /* @__PURE__ */ jsx(Callout, {
134
+ tone: "result",
135
+ children: /* @__PURE__ */ jsxs("div", {
136
+ style: {
137
+ display: "flex",
138
+ flexDirection: "column",
139
+ gap: 6
140
+ },
141
+ children: [/* @__PURE__ */ jsx("span", {
142
+ style: {
143
+ fontSize: 12,
144
+ color: "var(--stage-muted)"
145
+ },
146
+ children: "truth table (current row highlighted)"
147
+ }), table]
148
+ })
149
+ })]
150
+ }),
151
+ footer: ask ? /* @__PURE__ */ jsx(LabAsk, {
152
+ ask,
153
+ activity
154
+ }) : void 0,
155
+ children: figure
156
+ });
157
+ }
158
+
159
+ //#endregion
160
+ export { LogicGateLab };
@@ -0,0 +1,12 @@
1
+ import { LogicDoc } from "./contract.mjs";
2
+
3
+ //#region src/logic/presets.d.ts
4
+ declare const LOGIC_PRESETS: Record<string, {
5
+ title: string;
6
+ doc: LogicDoc;
7
+ }>;
8
+ type LogicPresetKey = keyof typeof LOGIC_PRESETS;
9
+ /** Deep-clone a preset doc so the lab can mutate input values without touching the library. */
10
+ declare function presetDoc(key: string): LogicDoc;
11
+ //#endregion
12
+ export { LOGIC_PRESETS, LogicPresetKey, presetDoc };