@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 @@
1
+ import { DiodeLab, DiodeProps } from "./preset.mjs";
@@ -0,0 +1,25 @@
1
+ import { LabAskSpec } from "../../kit/ask.mjs";
2
+ import { ReactNode } from "react";
3
+
4
+ //#region src/circuits/diode/preset.d.ts
5
+ interface DiodeProps {
6
+ volts?: number;
7
+ resistanceK?: number;
8
+ /** which panels to show: the schematic, the I-V graph, or both (default). */
9
+ show?: 'both' | 'circuit' | 'graph';
10
+ title?: string;
11
+ prompt?: string;
12
+ ask?: LabAskSpec;
13
+ activity?: string;
14
+ }
15
+ declare function DiodeLab({
16
+ volts,
17
+ resistanceK,
18
+ show,
19
+ title,
20
+ prompt,
21
+ ask,
22
+ activity
23
+ }?: DiodeProps): ReactNode;
24
+ //#endregion
25
+ export { DiodeLab, DiodeProps };
@@ -0,0 +1,266 @@
1
+ 'use client';
2
+
3
+ import { Chip, Slider } from "../../kit/controls.mjs";
4
+ import { Callout, ControlBar, Field, LabFrame } from "../../kit/frame.mjs";
5
+ import { BulbGlyph, CellGlyph, DiodeGlyph, FlowDots, Wire } from "../../kit/electronics.mjs";
6
+ import { useReducedMotion } from "../../kit/anim.mjs";
7
+ import { LabAsk } from "../../kit/ask.mjs";
8
+ import { CoordPlane } from "../../kit/coords.mjs";
9
+ import { useState } from "react";
10
+ import { jsx, jsxs } from "react/jsx-runtime";
11
+ import { Dot, Label, Plot, Segment, useFrameLoop } from "@classytic/stage";
12
+ import { solveDC } from "@classytic/stage/circuit";
13
+
14
+ //#region src/circuits/diode/preset.tsx
15
+ /**
16
+ * DiodeLab — a diode as a ONE-WAY VALVE you can watch, drawn with the SHARED
17
+ * electronics glyph library (CellGlyph / DiodeGlyph / BulbGlyph) on a real
18
+ * schematic, not hand-rolled shapes. A battery pushes current around the loop
19
+ * through the diode to a lamp: forward, the valve opens, current flows and the
20
+ * lamp glows; reverse, the symbol flips, the flow stops, the lamp goes dark. The
21
+ * small I-V curve below is the same story as a graph, with the live operating
22
+ * point from the engine's nonlinear (Shockley) solver.
23
+ */
24
+ const VT = .025852, IS = 1e-12;
25
+ const C_OK = "var(--stage-good)";
26
+ const C_BAD = "var(--stage-danger, #e03131)";
27
+ const W = 520, H = 188, xL = 45, xR = 475, yT = 56, yB = 150, HALF = 28;
28
+ const CELL_X = 110, DIODE_X = 250, BULB_X = 400;
29
+ const LOOP = [
30
+ [xL, yT],
31
+ [xR, yT],
32
+ [xR, yB],
33
+ [xL, yB],
34
+ [xL, yT]
35
+ ];
36
+ function DiodeLab({ volts = 2, resistanceK = 1, show = "both", title = "The diode: a one-way valve", prompt = "The battery pushes current around the loop. Forward, the valve opens and the lamp lights; reverse it and the flow is blocked.", ask, activity = "diode" } = {}) {
37
+ const [Vs, setVs] = useState(volts);
38
+ const [Rk, setRk] = useState(resistanceK);
39
+ const [reversed, setReversed] = useState(false);
40
+ const [phase, setPhase] = useState(0);
41
+ const reduce = useReducedMotion();
42
+ const R = Rk * 1e3;
43
+ const sol = solveDC([
44
+ {
45
+ kind: "V",
46
+ n1: 1,
47
+ n2: 0,
48
+ value: Vs
49
+ },
50
+ {
51
+ kind: "R",
52
+ n1: 1,
53
+ n2: 2,
54
+ value: R
55
+ },
56
+ reversed ? {
57
+ kind: "D",
58
+ n1: 0,
59
+ n2: 2,
60
+ value: 0,
61
+ id: "d"
62
+ } : {
63
+ kind: "D",
64
+ n1: 2,
65
+ n2: 0,
66
+ value: 0,
67
+ id: "d"
68
+ }
69
+ ]);
70
+ const V2 = sol.nodeV[2] ?? 0;
71
+ const Vd = reversed ? -V2 : V2;
72
+ const Ima = (sol.current["d"] ?? 0) * 1e3;
73
+ const conducting = Ima > .05;
74
+ const brightness = Math.max(0, Math.min(1, Ima / (Vs / R * 1e3 || 1)));
75
+ useFrameLoop((f) => setPhase((p) => (p + f.dtMs / 1e3 * (.1 + .4 * brightness)) % 1), { running: conducting && !reduce });
76
+ const scene = /* @__PURE__ */ jsx("div", {
77
+ style: {
78
+ borderRadius: 14,
79
+ overflow: "hidden",
80
+ background: "var(--stage-bg)",
81
+ border: "1px solid var(--stage-grid)"
82
+ },
83
+ children: /* @__PURE__ */ jsxs("svg", {
84
+ viewBox: `0 0 ${W} ${H}`,
85
+ width: "100%",
86
+ role: "img",
87
+ "aria-label": `Diode circuit, ${conducting ? "conducting, lamp lit" : "blocked, lamp dark"}`,
88
+ children: [
89
+ /* @__PURE__ */ jsx(Wire, {
90
+ points: LOOP,
91
+ live: conducting
92
+ }),
93
+ conducting && /* @__PURE__ */ jsx(FlowDots, {
94
+ points: LOOP,
95
+ phase
96
+ }),
97
+ /* @__PURE__ */ jsx(CellGlyph, {
98
+ cx: CELL_X,
99
+ cy: yT,
100
+ half: HALF,
101
+ live: conducting,
102
+ label: `${Vs} V`
103
+ }),
104
+ /* @__PURE__ */ jsx("g", {
105
+ transform: reversed ? `translate(${2 * DIODE_X} 0) scale(-1 1)` : void 0,
106
+ children: /* @__PURE__ */ jsx(DiodeGlyph, {
107
+ cx: DIODE_X,
108
+ cy: yT,
109
+ half: HALF,
110
+ live: conducting,
111
+ conducting,
112
+ label: reversed ? "reverse" : "forward"
113
+ })
114
+ }),
115
+ /* @__PURE__ */ jsx(BulbGlyph, {
116
+ cx: BULB_X,
117
+ cy: yT,
118
+ half: HALF,
119
+ live: conducting,
120
+ brightness,
121
+ label: "lamp"
122
+ })
123
+ ]
124
+ })
125
+ });
126
+ const ivCurve = (vd) => IS * (Math.exp(Math.min(vd / VT, 80)) - 1) * 1e3;
127
+ const graph = /* @__PURE__ */ jsxs(CoordPlane, {
128
+ view: {
129
+ xMin: -.7,
130
+ xMax: .75,
131
+ yMin: -1.5,
132
+ yMax: 10
133
+ },
134
+ height: 160,
135
+ preserveAspect: false,
136
+ ariaLabel: "Diode I-V curve",
137
+ children: [
138
+ /* @__PURE__ */ jsx(Plot.OfX, {
139
+ y: ivCurve,
140
+ domain: [-.7, .72],
141
+ color: "var(--stage-accent)",
142
+ weight: 2.5
143
+ }),
144
+ /* @__PURE__ */ jsx(Dot, {
145
+ x: Math.max(-.7, Math.min(.72, Vd)),
146
+ y: Math.max(-1.5, Math.min(10, ivCurve(Vd))),
147
+ r: 5,
148
+ color: conducting ? C_OK : C_BAD
149
+ }),
150
+ /* @__PURE__ */ jsx(Segment, {
151
+ from: {
152
+ x: .6,
153
+ y: 0
154
+ },
155
+ to: {
156
+ x: .6,
157
+ y: 10
158
+ },
159
+ color: "var(--stage-muted)",
160
+ weight: 1,
161
+ dashed: true
162
+ }),
163
+ /* @__PURE__ */ jsx(Label, {
164
+ x: .72,
165
+ y: 9.3,
166
+ text: "I (mA) vs V across the diode",
167
+ color: "var(--stage-muted)",
168
+ size: 10,
169
+ anchor: "end"
170
+ })
171
+ ]
172
+ });
173
+ const figure = show === "circuit" ? scene : show === "graph" ? graph : /* @__PURE__ */ jsxs("div", {
174
+ style: {
175
+ display: "flex",
176
+ flexDirection: "column",
177
+ gap: 10
178
+ },
179
+ children: [scene, graph]
180
+ });
181
+ return /* @__PURE__ */ jsx(LabFrame, {
182
+ title,
183
+ prompt,
184
+ controls: /* @__PURE__ */ jsxs(ControlBar, { children: [
185
+ /* @__PURE__ */ jsx(Field, {
186
+ label: "orientation",
187
+ children: /* @__PURE__ */ jsxs("span", {
188
+ className: "lab-field-row",
189
+ children: [/* @__PURE__ */ jsx(Chip, {
190
+ selected: !reversed,
191
+ onClick: () => setReversed(false),
192
+ children: "forward ▶|"
193
+ }), /* @__PURE__ */ jsx(Chip, {
194
+ selected: reversed,
195
+ onClick: () => setReversed(true),
196
+ children: "reverse |◀"
197
+ })]
198
+ })
199
+ }),
200
+ /* @__PURE__ */ jsx(Field, {
201
+ label: "battery",
202
+ value: `${Vs} V`,
203
+ children: /* @__PURE__ */ jsx(Slider, {
204
+ value: Vs,
205
+ min: 0,
206
+ max: 5,
207
+ step: .1,
208
+ onChange: setVs,
209
+ ariaLabel: "battery voltage"
210
+ })
211
+ }),
212
+ /* @__PURE__ */ jsx(Field, {
213
+ label: "R",
214
+ value: `${Rk} kΩ`,
215
+ children: /* @__PURE__ */ jsx(Slider, {
216
+ value: Rk,
217
+ min: .2,
218
+ max: 10,
219
+ step: .1,
220
+ onChange: setRk,
221
+ ariaLabel: "series resistance"
222
+ })
223
+ })
224
+ ] }),
225
+ aside: /* @__PURE__ */ jsxs("div", {
226
+ style: {
227
+ display: "flex",
228
+ flexDirection: "column",
229
+ gap: 10
230
+ },
231
+ children: [/* @__PURE__ */ jsx("div", {
232
+ className: "lab-pill",
233
+ "data-state": conducting ? "ok" : "no",
234
+ role: "status",
235
+ style: { alignSelf: "flex-start" },
236
+ children: conducting ? "✓ valve OPEN, current flows, lamp lit" : "✗ valve SHUT, blocked, lamp dark"
237
+ }), /* @__PURE__ */ jsx(Callout, {
238
+ tone: "result",
239
+ children: /* @__PURE__ */ jsxs("div", {
240
+ style: {
241
+ display: "grid",
242
+ gap: 6,
243
+ fontVariantNumeric: "tabular-nums",
244
+ fontSize: 13
245
+ },
246
+ children: [
247
+ /* @__PURE__ */ jsxs("span", { children: ["V across diode = ", /* @__PURE__ */ jsxs("strong", { children: [Vd.toFixed(2), " V"] })] }),
248
+ /* @__PURE__ */ jsxs("span", { children: ["current = ", /* @__PURE__ */ jsx("strong", { children: Math.abs(Ima) < .001 ? "≈ 0" : Ima.toFixed(2) + " mA" })] }),
249
+ /* @__PURE__ */ jsx("span", {
250
+ style: { color: "var(--stage-muted)" },
251
+ children: "forward drop sits near the 0.6 to 0.7 V knee no matter the current"
252
+ })
253
+ ]
254
+ })
255
+ })]
256
+ }),
257
+ footer: ask ? /* @__PURE__ */ jsx(LabAsk, {
258
+ ask,
259
+ activity
260
+ }) : void 0,
261
+ children: figure
262
+ });
263
+ }
264
+
265
+ //#endregion
266
+ export { DiodeLab };
@@ -4,4 +4,10 @@ import { CircuitLab, CircuitLabProps } from "./circuit-lab.mjs";
4
4
  import { CircuitBuilder, CircuitBuilderProps, CircuitComponent } from "./circuit-builder.mjs";
5
5
  import { CapacitorLeakLab, CapacitorLeakProps } from "./capacitor-leak/preset.mjs";
6
6
  import { AcDcLab, AcDcProps } from "./ac-dc/preset.mjs";
7
- export { AcDcLab, type AcDcProps, CIRCUIT_NETWORK_ASSET, CapacitorLeakLab, type CapacitorLeakProps, CircuitBuilder, type CircuitBuilderProps, type CircuitComponent, type CircuitComponentSpec, type CircuitGoal, CircuitLab, type CircuitLabProps, CircuitNetworkLab, type CircuitNetworkProps, circuitDoc };
7
+ import { RCChargingLab, RCChargingProps } from "./rc-charging/preset.mjs";
8
+ import { DiodeLab, DiodeProps } from "./diode/preset.mjs";
9
+ import { TransistorLab, TransistorProps } from "./transistor/preset.mjs";
10
+ import { CmosInverterLab, CmosInverterProps, CmosNandLab, CmosNandProps, CmosNorLab, CmosNorProps, RNmosNotLab, RNmosNotProps } from "./cmos-gate/preset.mjs";
11
+ import { BrownoutLab, BrownoutProps } from "./brownout/preset.mjs";
12
+ import { BjtInsideLab, BjtInsideProps, ConductionLab, ConductionProps, HallEffectLab, HallProps, MosfetInsideLab, MosfetInsideProps, PnJunctionLab, PnJunctionProps, SiliconLatticeLab, SiliconLatticeProps } from "./semiconductor/preset.mjs";
13
+ export { AcDcLab, type AcDcProps, BjtInsideLab, type BjtInsideProps, BrownoutLab, type BrownoutProps, CIRCUIT_NETWORK_ASSET, CapacitorLeakLab, type CapacitorLeakProps, CircuitBuilder, type CircuitBuilderProps, type CircuitComponent, type CircuitComponentSpec, type CircuitGoal, CircuitLab, type CircuitLabProps, CircuitNetworkLab, type CircuitNetworkProps, CmosInverterLab, type CmosInverterProps, CmosNandLab, type CmosNandProps, CmosNorLab, type CmosNorProps, ConductionLab, type ConductionProps, DiodeLab, type DiodeProps, HallEffectLab, type HallProps, MosfetInsideLab, type MosfetInsideProps, PnJunctionLab, type PnJunctionProps, RCChargingLab, type RCChargingProps, RNmosNotLab, type RNmosNotProps, SiliconLatticeLab, type SiliconLatticeProps, TransistorLab, type TransistorProps, circuitDoc };
@@ -4,5 +4,11 @@ import { CircuitLab } from "./circuit-lab.mjs";
4
4
  import { CircuitBuilder } from "./circuit-builder.mjs";
5
5
  import { CapacitorLeakLab } from "./capacitor-leak/preset.mjs";
6
6
  import { AcDcLab } from "./ac-dc/preset.mjs";
7
+ import { RCChargingLab } from "./rc-charging/preset.mjs";
8
+ import { DiodeLab } from "./diode/preset.mjs";
9
+ import { TransistorLab } from "./transistor/preset.mjs";
10
+ import { CmosInverterLab, CmosNandLab, CmosNorLab, RNmosNotLab } from "./cmos-gate/preset.mjs";
11
+ import { BrownoutLab } from "./brownout/preset.mjs";
12
+ import { BjtInsideLab, ConductionLab, HallEffectLab, MosfetInsideLab, PnJunctionLab, SiliconLatticeLab } from "./semiconductor/preset.mjs";
7
13
 
8
- export { AcDcLab, CIRCUIT_NETWORK_ASSET, CapacitorLeakLab, CircuitBuilder, CircuitLab, CircuitNetworkLab, circuitDoc };
14
+ export { AcDcLab, BjtInsideLab, BrownoutLab, CIRCUIT_NETWORK_ASSET, CapacitorLeakLab, CircuitBuilder, CircuitLab, CircuitNetworkLab, CmosInverterLab, CmosNandLab, CmosNorLab, ConductionLab, DiodeLab, HallEffectLab, MosfetInsideLab, PnJunctionLab, RCChargingLab, RNmosNotLab, SiliconLatticeLab, TransistorLab, circuitDoc };
@@ -0,0 +1 @@
1
+ import { RCChargingLab, RCChargingProps } from "./preset.mjs";
@@ -0,0 +1,27 @@
1
+ import { LabAskSpec } from "../../kit/ask.mjs";
2
+ import { ReactNode } from "react";
3
+
4
+ //#region src/circuits/rc-charging/preset.d.ts
5
+ interface RCChargingProps {
6
+ volts?: number;
7
+ resistanceK?: number;
8
+ capacitanceU?: number;
9
+ /** which panels to show: the schematic, the V(t) graph, or both (default). */
10
+ show?: 'both' | 'circuit' | 'graph';
11
+ title?: string;
12
+ prompt?: string;
13
+ ask?: LabAskSpec;
14
+ activity?: string;
15
+ }
16
+ declare function RCChargingLab({
17
+ volts,
18
+ resistanceK,
19
+ capacitanceU,
20
+ show,
21
+ title,
22
+ prompt,
23
+ ask,
24
+ activity
25
+ }?: RCChargingProps): ReactNode;
26
+ //#endregion
27
+ export { RCChargingLab, RCChargingProps };
@@ -0,0 +1,329 @@
1
+ 'use client';
2
+
3
+ import { Chip, Slider } from "../../kit/controls.mjs";
4
+ import { Callout, ControlBar, Field, LabFrame } from "../../kit/frame.mjs";
5
+ import { useCheckpoint } from "../../kit/pedagogy.mjs";
6
+ import { CapacitorGlyph, CellGlyph, FlowDots, ResistorGlyph, Wire } from "../../kit/electronics.mjs";
7
+ import { useReducedMotion } from "../../kit/anim.mjs";
8
+ import { LabAsk } from "../../kit/ask.mjs";
9
+ import { CoordPlane } from "../../kit/coords.mjs";
10
+ import { useState } from "react";
11
+ import { jsx, jsxs } from "react/jsx-runtime";
12
+ import { Dot, Label, Polyline, Segment, useFrameLoop } from "@classytic/stage";
13
+ import { solveTransient } from "@classytic/stage/circuit";
14
+
15
+ //#region src/circuits/rc-charging/preset.tsx
16
+ /**
17
+ * RCChargingLab — a capacitor filling like a bucket, drawn with the SHARED
18
+ * electronics glyphs (CellGlyph / ResistorGlyph / CapacitorGlyph) and computed by
19
+ * the REAL circuit engine (solveTransient, Backward-Euler), not a faked exponential.
20
+ * The CapacitorGlyph fills to the live charge; current flows around the loop while
21
+ * it fills and stops once full. The V(t) curve below is the actual transient
22
+ * solution, with the time constant τ = R·C and the 63%-at-one-τ mark.
23
+ */
24
+ const C_CURVE = "var(--stage-accent)";
25
+ const W = 520, H = 168, xL = 50, xR = 470, yT = 52, yB = 138, HALF = 28;
26
+ const CELL_X = 120, R_X = 255, CAP_X = 390;
27
+ const LOOP = [
28
+ [xL, yT],
29
+ [xR, yT],
30
+ [xR, yB],
31
+ [xL, yB],
32
+ [xL, yT]
33
+ ];
34
+ function RCChargingLab({ volts = 5, resistanceK = 10, capacitanceU = 10, show = "both", title = "RC charging: filling the capacitor", prompt = "The resistor is a narrow pipe, the capacitor a bucket. Bigger C or bigger R means slower filling. That product is the time constant τ = R·C.", ask, activity = "rc-charging" } = {}) {
35
+ const [Vs, setVs] = useState(volts);
36
+ const [Rk, setRk] = useState(resistanceK);
37
+ const [Cu, setCu] = useState(capacitanceU);
38
+ const [mode, setMode] = useState("charge");
39
+ const [tFrac, setTFrac] = useState(1);
40
+ const [phase, setPhase] = useState(0);
41
+ const reduce = useReducedMotion();
42
+ const R = Rk * 1e3, C = Cu * 1e-6;
43
+ const tau = R * C;
44
+ const dt = tau / 120, steps = 600;
45
+ const charging = mode === "charge";
46
+ const elems = charging ? [
47
+ {
48
+ kind: "V",
49
+ n1: 1,
50
+ n2: 0,
51
+ value: Vs
52
+ },
53
+ {
54
+ kind: "R",
55
+ n1: 1,
56
+ n2: 2,
57
+ value: R
58
+ },
59
+ {
60
+ kind: "C",
61
+ n1: 2,
62
+ n2: 0,
63
+ value: C
64
+ }
65
+ ] : [{
66
+ kind: "R",
67
+ n1: 1,
68
+ n2: 0,
69
+ value: R
70
+ }, {
71
+ kind: "C",
72
+ n1: 1,
73
+ n2: 0,
74
+ value: C
75
+ }];
76
+ const capNode = charging ? 2 : 1;
77
+ const trace = solveTransient(elems, {
78
+ dt,
79
+ steps,
80
+ initialV: charging ? void 0 : new Map([[1, Vs]])
81
+ });
82
+ const pts = trace.map((s) => ({
83
+ x: s.t / tau,
84
+ y: (s.nodeV[capNode] ?? 0) / Vs
85
+ }));
86
+ const view = {
87
+ xMin: 0,
88
+ xMax: 5,
89
+ yMin: 0,
90
+ yMax: 1.12
91
+ };
92
+ const Vnow = (() => {
93
+ const target = tFrac * tau;
94
+ return trace.reduce((b, s) => Math.abs(s.t - target) < Math.abs(b.t - target) ? s : b).nodeV[capNode] ?? 0;
95
+ })();
96
+ const frac = Math.max(0, Math.min(1, Vnow / Vs));
97
+ const iMag = charging ? 1 - frac : frac;
98
+ const flowing = iMag > .03;
99
+ useFrameLoop((f) => setPhase((p) => (p + f.dtMs / 1e3 * (.1 + .4 * iMag)) % 1), { running: flowing && !reduce });
100
+ useCheckpoint({
101
+ solved: charging ? frac >= .99 : frac <= .01,
102
+ activity: `rc-charging:${mode}`
103
+ });
104
+ const scene = /* @__PURE__ */ jsx("div", {
105
+ style: {
106
+ borderRadius: 14,
107
+ overflow: "hidden",
108
+ background: "var(--stage-bg)",
109
+ border: "1px solid var(--stage-grid)"
110
+ },
111
+ children: /* @__PURE__ */ jsxs("svg", {
112
+ viewBox: `0 0 ${W} ${H}`,
113
+ width: "100%",
114
+ role: "img",
115
+ "aria-label": `RC ${mode}, capacitor at ${Math.round(frac * 100)} percent`,
116
+ children: [
117
+ /* @__PURE__ */ jsx(Wire, {
118
+ points: LOOP,
119
+ live: flowing
120
+ }),
121
+ flowing && /* @__PURE__ */ jsx(FlowDots, {
122
+ points: LOOP,
123
+ phase: charging ? phase : -phase
124
+ }),
125
+ /* @__PURE__ */ jsx(CellGlyph, {
126
+ cx: CELL_X,
127
+ cy: yT,
128
+ half: HALF,
129
+ live: flowing && charging,
130
+ label: `${Vs} V`
131
+ }),
132
+ /* @__PURE__ */ jsx(ResistorGlyph, {
133
+ cx: R_X,
134
+ cy: yT,
135
+ half: HALF,
136
+ live: flowing,
137
+ label: `${Rk} kΩ`
138
+ }),
139
+ /* @__PURE__ */ jsx(CapacitorGlyph, {
140
+ cx: CAP_X,
141
+ cy: yT,
142
+ half: HALF,
143
+ charge: frac,
144
+ live: flowing,
145
+ label: `${Cu} µF`
146
+ })
147
+ ]
148
+ })
149
+ });
150
+ const graph = /* @__PURE__ */ jsxs(CoordPlane, {
151
+ view,
152
+ height: 168,
153
+ preserveAspect: false,
154
+ stepX: 1,
155
+ stepY: .25,
156
+ ariaLabel: `RC ${mode} curve, V over Vs versus t over tau`,
157
+ children: [
158
+ /* @__PURE__ */ jsx(Segment, {
159
+ from: {
160
+ x: 0,
161
+ y: charging ? .632 : .368
162
+ },
163
+ to: {
164
+ x: 5,
165
+ y: charging ? .632 : .368
166
+ },
167
+ color: "var(--stage-muted)",
168
+ weight: 1,
169
+ dashed: true
170
+ }),
171
+ /* @__PURE__ */ jsx(Segment, {
172
+ from: {
173
+ x: 1,
174
+ y: 0
175
+ },
176
+ to: {
177
+ x: 1,
178
+ y: 1
179
+ },
180
+ color: "var(--stage-muted)",
181
+ weight: 1,
182
+ dashed: true
183
+ }),
184
+ /* @__PURE__ */ jsx(Label, {
185
+ x: 1,
186
+ y: charging ? .632 : .368,
187
+ text: charging ? "63% at t=τ" : "37% at t=τ",
188
+ color: "var(--stage-muted)",
189
+ size: 10,
190
+ dx: 6,
191
+ dy: -4,
192
+ anchor: "start"
193
+ }),
194
+ /* @__PURE__ */ jsx(Polyline, {
195
+ points: pts,
196
+ color: C_CURVE,
197
+ weight: 3
198
+ }),
199
+ /* @__PURE__ */ jsx(Dot, {
200
+ x: tFrac,
201
+ y: frac,
202
+ r: 6,
203
+ color: C_CURVE
204
+ }),
205
+ /* @__PURE__ */ jsx(Label, {
206
+ x: 4.9,
207
+ y: .18,
208
+ text: "V / Vs vs t / τ",
209
+ color: "var(--stage-muted)",
210
+ size: 10,
211
+ anchor: "end"
212
+ })
213
+ ]
214
+ });
215
+ const figure = show === "circuit" ? scene : show === "graph" ? graph : /* @__PURE__ */ jsxs("div", {
216
+ style: {
217
+ display: "flex",
218
+ flexDirection: "column",
219
+ gap: 10
220
+ },
221
+ children: [scene, graph]
222
+ });
223
+ return /* @__PURE__ */ jsx(LabFrame, {
224
+ title,
225
+ prompt,
226
+ controls: /* @__PURE__ */ jsxs(ControlBar, { children: [
227
+ /* @__PURE__ */ jsx(Field, {
228
+ label: "mode",
229
+ children: /* @__PURE__ */ jsxs("span", {
230
+ className: "lab-field-row",
231
+ children: [/* @__PURE__ */ jsx(Chip, {
232
+ selected: charging,
233
+ onClick: () => setMode("charge"),
234
+ children: "charge"
235
+ }), /* @__PURE__ */ jsx(Chip, {
236
+ selected: !charging,
237
+ onClick: () => setMode("discharge"),
238
+ children: "discharge"
239
+ })]
240
+ })
241
+ }),
242
+ /* @__PURE__ */ jsx(Field, {
243
+ label: "battery",
244
+ value: `${Vs} V`,
245
+ children: /* @__PURE__ */ jsx(Slider, {
246
+ value: Vs,
247
+ min: 1,
248
+ max: 12,
249
+ step: 1,
250
+ onChange: setVs,
251
+ ariaLabel: "battery voltage"
252
+ })
253
+ }),
254
+ /* @__PURE__ */ jsx(Field, {
255
+ label: "R",
256
+ value: `${Rk} kΩ`,
257
+ children: /* @__PURE__ */ jsx(Slider, {
258
+ value: Rk,
259
+ min: 1,
260
+ max: 100,
261
+ step: 1,
262
+ onChange: setRk,
263
+ ariaLabel: "resistance"
264
+ })
265
+ }),
266
+ /* @__PURE__ */ jsx(Field, {
267
+ label: "C",
268
+ value: `${Cu} µF`,
269
+ children: /* @__PURE__ */ jsx(Slider, {
270
+ value: Cu,
271
+ min: 1,
272
+ max: 100,
273
+ step: 1,
274
+ onChange: setCu,
275
+ ariaLabel: "capacitance"
276
+ })
277
+ }),
278
+ /* @__PURE__ */ jsx(Field, {
279
+ label: "time",
280
+ value: `${tFrac.toFixed(1)} τ`,
281
+ children: /* @__PURE__ */ jsx(Slider, {
282
+ value: tFrac,
283
+ min: 0,
284
+ max: 5,
285
+ step: .1,
286
+ onChange: setTFrac,
287
+ ariaLabel: "time in units of tau"
288
+ })
289
+ })
290
+ ] }),
291
+ aside: /* @__PURE__ */ jsx(Callout, {
292
+ tone: "result",
293
+ children: /* @__PURE__ */ jsxs("div", {
294
+ style: {
295
+ display: "grid",
296
+ gap: 6,
297
+ fontVariantNumeric: "tabular-nums",
298
+ fontSize: 13
299
+ },
300
+ children: [
301
+ /* @__PURE__ */ jsxs("span", { children: ["τ = R·C = ", /* @__PURE__ */ jsxs("strong", { children: [(tau * 1e3).toFixed(1), " ms"] })] }),
302
+ /* @__PURE__ */ jsxs("span", { children: [
303
+ "at t = ",
304
+ tFrac.toFixed(1),
305
+ "τ: V",
306
+ /* @__PURE__ */ jsx("sub", { children: "C" }),
307
+ " = ",
308
+ /* @__PURE__ */ jsxs("strong", { children: [Vnow.toFixed(2), " V"] }),
309
+ " (",
310
+ Math.round(frac * 100),
311
+ "%)"
312
+ ] }),
313
+ /* @__PURE__ */ jsx("span", {
314
+ style: { color: "var(--stage-muted)" },
315
+ children: charging ? "one τ reaches 63%, five τ is essentially full" : "one τ drops to 37%, five τ is essentially empty"
316
+ })
317
+ ]
318
+ })
319
+ }),
320
+ footer: ask ? /* @__PURE__ */ jsx(LabAsk, {
321
+ ask,
322
+ activity
323
+ }) : void 0,
324
+ children: figure
325
+ });
326
+ }
327
+
328
+ //#endregion
329
+ export { RCChargingLab };
@@ -0,0 +1 @@
1
+ import { BjtInsideLab, BjtInsideProps, ConductionLab, ConductionProps, HallEffectLab, HallProps, MosfetInsideLab, MosfetInsideProps, PnJunctionLab, PnJunctionProps, SiliconLatticeLab, SiliconLatticeProps } from "./preset.mjs";