@classytic/labs 0.6.0 → 0.7.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 (1867) hide show
  1. package/README.md +37 -21
  2. package/dist/algorithms/index.d.mts +1 -3
  3. package/dist/algorithms/index.mjs +1 -3
  4. package/dist/algorithms/react/index.d.mts +1 -2
  5. package/dist/algorithms/react/index.mjs +1 -2
  6. package/dist/algorithms/sorting.mjs +1 -1
  7. package/dist/authoring/evidence.d.mts +29 -0
  8. package/dist/authoring/index.d.mts +2 -1
  9. package/dist/authoring/index.mjs +2 -1
  10. package/dist/blocks/authoring.d.mts +27 -13
  11. package/dist/blocks/authoring.mjs +72 -19
  12. package/dist/blocks/lab-config.d.mts +3 -1
  13. package/dist/blocks/lab-config.mjs +109 -66
  14. package/dist/build/CircuitScene.mjs +53 -9
  15. package/dist/build/contract.d.mts +1 -1
  16. package/dist/build/editor-ui.mjs +6 -5
  17. package/dist/build/parts/bench.mjs +2 -2
  18. package/dist/build/viewport.mjs +28 -17
  19. package/dist/chem/evidence-scenes.mjs +5 -3
  20. package/dist/chem/solution/field.mjs +27 -33
  21. package/dist/chem/stereochemistry/preset.mjs +1 -1
  22. package/dist/circuits/circuit/preset.mjs +3 -3
  23. package/dist/circuits/op-amp-feedback/preset.mjs +2 -2
  24. package/dist/circuits/semiconductor/shared.mjs +17 -98
  25. package/dist/commerce/accounting/books/entry.d.mts +2 -1
  26. package/dist/commerce/accounting/books/entry.mjs +4 -2
  27. package/dist/commerce/accounting/books/world.d.mts +61 -0
  28. package/dist/commerce/accounting/books/world.mjs +54 -3
  29. package/dist/commerce/accounting/books/worlds/kalam.mjs +2 -3
  30. package/dist/core/index.d.mts +2 -5
  31. package/dist/core/index.mjs +2 -5
  32. package/dist/deep-learning/foundation/parameter-dial.mjs +14 -16
  33. package/dist/diagrams/fraction/FractionDiagram.mjs +1 -1
  34. package/dist/diagrams/geometry/GeometryDiagram.mjs +208 -0
  35. package/dist/diagrams/geometry/core.mjs +112 -0
  36. package/dist/diagrams/geometry/schema.mjs +135 -0
  37. package/dist/diagrams/geometry/spec.d.mts +90 -0
  38. package/dist/diagrams/graph/GraphDiagram.mjs +58 -24
  39. package/dist/diagrams/index.d.mts +2 -1
  40. package/dist/diagrams/index.mjs +2 -0
  41. package/dist/diagrams/magnetism/core.mjs +4 -3
  42. package/dist/diagrams/schema.mjs +3 -1
  43. package/dist/diagrams/spatial/SpatialDiagram.mjs +1 -1
  44. package/dist/discrete/core/index.d.mts +2 -7
  45. package/dist/discrete/core/index.mjs +2 -7
  46. package/dist/discrete/index.d.mts +4 -8
  47. package/dist/discrete/index.mjs +4 -8
  48. package/dist/domains/accounting/accounting-scenes.mjs +0 -2
  49. package/dist/domains/accounting/apportion/model.mjs +7 -3
  50. package/dist/domains/accounting/apportion/runtime.mjs +7 -3
  51. package/dist/domains/accounting/apportion/scene.mjs +2 -1
  52. package/dist/domains/accounting/balance-off/balance-figure.mjs +14 -11
  53. package/dist/domains/accounting/balance-off/model.mjs +14 -17
  54. package/dist/domains/accounting/balance-off/scene.mjs +21 -18
  55. package/dist/domains/accounting/bank-reconciliation/model.mjs +1 -0
  56. package/dist/domains/accounting/bank-reconciliation/runtime.mjs +6 -6
  57. package/dist/domains/accounting/bank-reconciliation/scene.mjs +13 -10
  58. package/dist/domains/accounting/break-even/model.mjs +12 -2
  59. package/dist/domains/accounting/break-even/runtime.mjs +16 -5
  60. package/dist/domains/accounting/break-even/scene.mjs +13 -7
  61. package/dist/domains/accounting/business-day-mission/model.mjs +2 -1
  62. package/dist/domains/accounting/business-day-mission/runtime.mjs +5 -4
  63. package/dist/domains/accounting/business-day-mission/scene.mjs +8 -8
  64. package/dist/domains/accounting/business-lesson/model.mjs +11 -1
  65. package/dist/domains/accounting/business-lesson/runtime.mjs +52 -12
  66. package/dist/domains/accounting/business-lesson/scene.mjs +0 -2
  67. package/dist/domains/accounting/cash-book/activity.mjs +49 -0
  68. package/dist/domains/accounting/cash-book/manifest.mjs +114 -0
  69. package/dist/domains/accounting/cash-book/model.mjs +829 -0
  70. package/dist/domains/accounting/cash-book/runtime.mjs +24 -0
  71. package/dist/domains/accounting/cash-book/scene.mjs +388 -0
  72. package/dist/domains/accounting/cash-budget-runway/model.mjs +2 -1
  73. package/dist/domains/accounting/cash-budget-runway/runtime.mjs +6 -5
  74. package/dist/domains/accounting/cash-budget-runway/scene.mjs +4 -5
  75. package/dist/domains/accounting/claim-split/activity.mjs +3 -2
  76. package/dist/domains/accounting/claim-split/manifest.mjs +3 -2
  77. package/dist/domains/accounting/claim-split/model.mjs +6 -7
  78. package/dist/domains/accounting/claim-split/runtime.mjs +3 -2
  79. package/dist/domains/accounting/claim-split/scene.mjs +3 -2
  80. package/dist/domains/accounting/club-subscriptions/activity.mjs +4 -3
  81. package/dist/domains/accounting/club-subscriptions/model.mjs +2 -1
  82. package/dist/domains/accounting/club-subscriptions/runtime.mjs +9 -21
  83. package/dist/domains/accounting/club-subscriptions/scene.mjs +6 -7
  84. package/dist/domains/accounting/company-statement-builder/activity.mjs +2 -2
  85. package/dist/domains/accounting/company-statement-builder/model.mjs +2 -1
  86. package/dist/domains/accounting/company-statement-builder/runtime.mjs +5 -4
  87. package/dist/domains/accounting/company-statement-builder/scene.mjs +5 -5
  88. package/dist/domains/accounting/compound-interest/model.d.mts +6 -6
  89. package/dist/domains/accounting/compound-interest/model.mjs +11 -1
  90. package/dist/domains/accounting/compound-interest/runtime.mjs +20 -6
  91. package/dist/domains/accounting/compound-interest/scene.mjs +27 -12
  92. package/dist/domains/accounting/control-account-builder/activity.mjs +8 -8
  93. package/dist/domains/accounting/control-account-builder/model.mjs +3 -1
  94. package/dist/domains/accounting/control-account-builder/runtime.mjs +11 -11
  95. package/dist/domains/accounting/control-account-builder/scene.mjs +14 -12
  96. package/dist/domains/accounting/cost-ladder/activity.mjs +74 -0
  97. package/dist/domains/accounting/cost-ladder/manifest.mjs +258 -0
  98. package/dist/domains/accounting/cost-ladder/model.mjs +636 -0
  99. package/dist/domains/accounting/cost-ladder/runtime.mjs +24 -0
  100. package/dist/domains/accounting/cost-ladder/scene.mjs +319 -0
  101. package/dist/domains/accounting/costing-profit-bridge/model.mjs +2 -1
  102. package/dist/domains/accounting/costing-profit-bridge/runtime.mjs +4 -3
  103. package/dist/domains/accounting/costing-profit-bridge/scene.mjs +2 -2
  104. package/dist/domains/accounting/credit-promise-bridge/scene.mjs +21 -7
  105. package/dist/domains/accounting/debit-credit-sprint/core.mjs +4 -4
  106. package/dist/domains/accounting/debit-credit-sprint/model.d.mts +2 -0
  107. package/dist/domains/accounting/debit-credit-sprint/model.mjs +8 -1
  108. package/dist/domains/accounting/debit-credit-sprint/scene.mjs +2 -2
  109. package/dist/domains/accounting/depreciation/model.mjs +8 -1
  110. package/dist/domains/accounting/depreciation/runtime.mjs +40 -16
  111. package/dist/domains/accounting/depreciation/scene.mjs +21 -9
  112. package/dist/domains/accounting/document-desk/activity.mjs +67 -0
  113. package/dist/domains/accounting/document-desk/manifest.mjs +109 -0
  114. package/dist/domains/accounting/document-desk/model.mjs +1448 -0
  115. package/dist/domains/accounting/document-desk/runtime.mjs +24 -0
  116. package/dist/domains/accounting/document-desk/scene.mjs +691 -0
  117. package/dist/domains/accounting/dual-aspect-transfer/scene.mjs +42 -10
  118. package/dist/domains/accounting/entity-spotlight/model.mjs +29 -8
  119. package/dist/domains/accounting/entity-spotlight/scene.mjs +5 -3
  120. package/dist/domains/accounting/entry-desk/core.mjs +3 -5
  121. package/dist/domains/accounting/entry-desk/model.mjs +18 -5
  122. package/dist/domains/accounting/entry-desk/runtime.mjs +2 -2
  123. package/dist/domains/accounting/entry-desk/scene.mjs +4 -4
  124. package/dist/domains/accounting/eoq/model.mjs +11 -1
  125. package/dist/domains/accounting/eoq/runtime.mjs +32 -13
  126. package/dist/domains/accounting/eoq/scene.mjs +9 -6
  127. package/dist/domains/accounting/equation-balance/model.d.mts +6 -2
  128. package/dist/domains/accounting/equation-balance/model.mjs +19 -5
  129. package/dist/domains/accounting/equation-balance/runtime.mjs +42 -10
  130. package/dist/domains/accounting/equation-balance/scene.mjs +34 -7
  131. package/dist/domains/accounting/equation-map/activity.mjs +36 -0
  132. package/dist/domains/accounting/equation-map/manifest.mjs +89 -0
  133. package/dist/domains/accounting/equation-map/model.mjs +260 -0
  134. package/dist/domains/accounting/equation-map/runtime.mjs +23 -0
  135. package/dist/domains/accounting/equation-map/scene.mjs +146 -0
  136. package/dist/domains/accounting/factory-expansion-case/model.mjs +5 -1
  137. package/dist/domains/accounting/factory-expansion-case/scene.mjs +7 -8
  138. package/dist/domains/accounting/household-accounts/activity.mjs +86 -0
  139. package/dist/domains/accounting/household-accounts/manifest.mjs +305 -0
  140. package/dist/domains/accounting/household-accounts/model.mjs +1133 -0
  141. package/dist/domains/accounting/household-accounts/runtime.mjs +24 -0
  142. package/dist/domains/accounting/household-accounts/scene.mjs +659 -0
  143. package/dist/domains/accounting/incomplete-records/model.mjs +13 -3
  144. package/dist/domains/accounting/incomplete-records/runtime.mjs +5 -1
  145. package/dist/domains/accounting/incomplete-records/scene.mjs +10 -6
  146. package/dist/domains/accounting/integrated-budget-mission/runtime.mjs +18 -18
  147. package/dist/domains/accounting/integrated-budget-mission/scene.mjs +8 -9
  148. package/dist/domains/accounting/inventory-costing/model.mjs +5 -1
  149. package/dist/domains/accounting/inventory-costing/runtime.mjs +5 -1
  150. package/dist/domains/accounting/inventory-costing/scene.mjs +44 -15
  151. package/dist/domains/accounting/investment-appraisal/model.mjs +5 -1
  152. package/dist/domains/accounting/investment-appraisal/runtime.mjs +6 -6
  153. package/dist/domains/accounting/investment-appraisal/scene.mjs +2 -2
  154. package/dist/domains/accounting/journal-poster/model.d.mts +0 -1
  155. package/dist/domains/accounting/journal-poster/model.mjs +4 -6
  156. package/dist/domains/accounting/journal-poster/runtime.mjs +3 -2
  157. package/dist/domains/accounting/journal-poster/scene.mjs +6 -7
  158. package/dist/domains/accounting/ledger-detective/ledger-detective/core.mjs +2 -3
  159. package/dist/domains/accounting/ledger-detective/model.mjs +23 -11
  160. package/dist/domains/accounting/limited-company/model.mjs +2 -1
  161. package/dist/domains/accounting/limited-company/runtime.mjs +41 -10
  162. package/dist/domains/accounting/limited-company/scene.mjs +26 -8
  163. package/dist/domains/accounting/limiting-factor-mix/model.mjs +4 -4
  164. package/dist/domains/accounting/limiting-factor-mix/runtime.mjs +11 -11
  165. package/dist/domains/accounting/limiting-factor-mix/scene.mjs +2 -2
  166. package/dist/domains/accounting/loan-claim/activity.mjs +21 -5
  167. package/dist/domains/accounting/loan-claim/model.mjs +16 -5
  168. package/dist/domains/accounting/loan-claim/runtime.mjs +12 -4
  169. package/dist/domains/accounting/loan-claim/scene.mjs +28 -10
  170. package/dist/domains/accounting/management-scenes.mjs +12 -14
  171. package/dist/domains/accounting/manufacturing-flow/model.mjs +27 -2
  172. package/dist/domains/accounting/manufacturing-flow/runtime.mjs +21 -5
  173. package/dist/domains/accounting/manufacturing-flow/scene.mjs +48 -11
  174. package/dist/domains/accounting/operating-budget-chain/runtime.mjs +7 -6
  175. package/dist/domains/accounting/operating-budget-chain/scene.mjs +11 -11
  176. package/dist/domains/accounting/partnership-split/model.mjs +18 -6
  177. package/dist/domains/accounting/partnership-split/runtime.mjs +10 -3
  178. package/dist/domains/accounting/partnership-split/scene.mjs +28 -8
  179. package/dist/domains/accounting/period-adjustment-workbench/runtime.mjs +2 -1
  180. package/dist/domains/accounting/period-adjustment-workbench/scene.mjs +7 -8
  181. package/dist/domains/accounting/period-close-mission/activity.mjs +8 -8
  182. package/dist/domains/accounting/period-close-mission/model.mjs +7 -11
  183. package/dist/domains/accounting/period-close-mission/runtime.mjs +14 -14
  184. package/dist/domains/accounting/period-close-mission/scene.mjs +9 -10
  185. package/dist/domains/accounting/posting-path/model.mjs +5 -2
  186. package/dist/domains/accounting/posting-path/runtime.mjs +5 -1
  187. package/dist/domains/accounting/process-loss/model.mjs +10 -4
  188. package/dist/domains/accounting/process-loss/runtime.mjs +8 -4
  189. package/dist/domains/accounting/process-loss/scene.mjs +18 -11
  190. package/dist/domains/accounting/purpose-timeline/model.mjs +9 -3
  191. package/dist/domains/accounting/purpose-timeline/scene.mjs +5 -5
  192. package/dist/domains/accounting/ratio-lab/core.d.mts +0 -1
  193. package/dist/domains/accounting/ratio-lab/core.mjs +1 -2
  194. package/dist/domains/accounting/ratio-lab/model.d.mts +2 -2
  195. package/dist/domains/accounting/ratio-lab/model.mjs +6 -2
  196. package/dist/domains/accounting/ratio-lab/runtime.mjs +12 -3
  197. package/dist/domains/accounting/ratio-lab/scene.mjs +37 -8
  198. package/dist/domains/accounting/reorder-point/model.d.mts +2 -2
  199. package/dist/domains/accounting/settlement-trail/model.mjs +25 -4
  200. package/dist/domains/accounting/settlement-trail/scene.mjs +46 -13
  201. package/dist/domains/accounting/statement-builder/core.mjs +1 -2
  202. package/dist/domains/accounting/statement-builder/model.mjs +20 -2
  203. package/dist/domains/accounting/statement-builder/runtime.mjs +34 -7
  204. package/dist/domains/accounting/statement-builder/scene.mjs +10 -3
  205. package/dist/domains/accounting/statement-sorter/model.d.mts +3 -1
  206. package/dist/domains/accounting/statement-sorter/model.mjs +23 -6
  207. package/dist/domains/accounting/statement-sorter/runtime.mjs +15 -2
  208. package/dist/domains/accounting/statement-sorter/scene.mjs +43 -12
  209. package/dist/domains/accounting/statement-workshop/activity.mjs +36 -0
  210. package/dist/domains/accounting/statement-workshop/manifest.mjs +330 -0
  211. package/dist/domains/accounting/statement-workshop/model.mjs +824 -0
  212. package/dist/domains/accounting/statement-workshop/runtime.mjs +24 -0
  213. package/dist/domains/accounting/statement-workshop/scene.mjs +249 -0
  214. package/dist/domains/accounting/suspense-reconstruction/model.mjs +9 -3
  215. package/dist/domains/accounting/suspense-reconstruction/runtime.mjs +9 -3
  216. package/dist/domains/accounting/suspense-reconstruction/scene.mjs +44 -12
  217. package/dist/domains/accounting/trial-balance/activity.mjs +26 -0
  218. package/dist/domains/accounting/trial-balance/manifest.mjs +206 -0
  219. package/dist/domains/accounting/trial-balance/model.mjs +569 -0
  220. package/dist/domains/accounting/trial-balance/runtime.mjs +24 -0
  221. package/dist/domains/accounting/trial-balance/scene.mjs +293 -0
  222. package/dist/domains/accounting/value-crossing/model.mjs +20 -8
  223. package/dist/domains/accounting/value-crossing/scene.mjs +25 -10
  224. package/dist/domains/accounting/variance-detective/model.mjs +3 -2
  225. package/dist/domains/accounting/variance-detective/runtime.mjs +4 -3
  226. package/dist/domains/accounting/variance-detective/scene.mjs +6 -6
  227. package/dist/domains/biology/cell-energy/scene.mjs +7 -8
  228. package/dist/domains/biology/cell-system/scene.mjs +5 -14
  229. package/dist/domains/biology/central-dogma/scene.mjs +0 -1
  230. package/dist/domains/biology/enzyme-rate/scene.mjs +1 -2
  231. package/dist/domains/biology/genetic-cross/scene.mjs +0 -1
  232. package/dist/domains/biology/meiosis-explorer/scene.mjs +2 -4
  233. package/dist/domains/biology/membrane-transport/scene.d.mts +0 -1
  234. package/dist/domains/biology/membrane-transport/scene.mjs +1 -2
  235. package/dist/domains/biology/mitosis-explorer/scene.d.mts +0 -1
  236. package/dist/domains/biology/mitosis-explorer/scene.mjs +3 -5
  237. package/dist/domains/biology/photosynthesis-factors/scene.mjs +1 -2
  238. package/dist/domains/biology/sequence/scene.mjs +1 -2
  239. package/dist/domains/biology/sex-linked-cross/scene.mjs +0 -1
  240. package/dist/domains/block-sets/accounting.mjs +56 -42
  241. package/dist/domains/block-sets/chem.mjs +77 -67
  242. package/dist/domains/block-sets/circuits.mjs +7 -5
  243. package/dist/domains/block-sets/geometry.mjs +5 -3
  244. package/dist/domains/block-sets/ict.mjs +28 -22
  245. package/dist/domains/block-sets/math.mjs +91 -87
  246. package/dist/domains/catalog-map.mjs +630 -25
  247. package/dist/domains/chem/acid-base/indicator-bench/scene.mjs +3 -5
  248. package/dist/domains/chem/acid-base/ph-scale/activity.mjs +221 -0
  249. package/dist/domains/chem/acid-base/ph-scale/manifest.mjs +99 -0
  250. package/dist/domains/chem/acid-base/ph-scale/model.mjs +280 -0
  251. package/dist/domains/chem/acid-base/ph-scale/reference.mjs +117 -0
  252. package/dist/domains/chem/acid-base/ph-scale/runtime.mjs +68 -0
  253. package/dist/domains/chem/acid-base/ph-scale/scene.mjs +412 -0
  254. package/dist/domains/chem/acid-base/proton-transfer/scene.mjs +0 -1
  255. package/dist/domains/chem/acid-base/titration/scene.mjs +5 -6
  256. package/dist/domains/chem/acid-base/titration-run/live-scene.mjs +3 -5
  257. package/dist/domains/chem/acid-base/titration-run/scene.mjs +5 -7
  258. package/dist/domains/chem/analysis/apparatus-builder/scene.mjs +16 -17
  259. package/dist/domains/chem/analysis/apparatus-choice/scene.mjs +4 -6
  260. package/dist/domains/chem/analysis/change-detective/scene.mjs +2 -3
  261. package/dist/domains/chem/analysis/chem-qualitative-analysis/scene.mjs +6 -8
  262. package/dist/domains/chem/analysis/chromatography-plate/scene.mjs +1 -2
  263. package/dist/domains/chem/analysis/complex-colour/scene.mjs +4 -3
  264. package/dist/domains/chem/analysis/composition-evidence/scene.mjs +3 -2
  265. package/dist/domains/chem/analysis/conductivity-bench/dropper-bottle.mjs +3 -5
  266. package/dist/domains/chem/analysis/conductivity-bench/material-scene.mjs +26 -54
  267. package/dist/domains/chem/analysis/conductivity-bench/runtime.mjs +2 -2
  268. package/dist/domains/chem/analysis/conductivity-bench/scene.mjs +13 -13
  269. package/dist/domains/chem/analysis/flame-test/scene.mjs +4 -6
  270. package/dist/domains/chem/analysis/paper-chromatogram/scene.mjs +4 -5
  271. package/dist/domains/chem/analysis/practical-observation/scene.mjs +6 -8
  272. package/dist/domains/chem/analysis/precipitation-bench/activity.mjs +1 -1
  273. package/dist/domains/chem/analysis/precipitation-bench/runtime.mjs +2 -2
  274. package/dist/domains/chem/analysis/precipitation-bench/scene.mjs +6 -7
  275. package/dist/domains/chem/analysis/reaction-evidence/scene.mjs +1 -2
  276. package/dist/domains/chem/analysis/species-workshop/scene.mjs +1 -2
  277. package/dist/domains/chem/analysis/specimen-row/scene.mjs +4 -3
  278. package/dist/domains/chem/analysis/structure-detective/scene.mjs +2 -3
  279. package/dist/domains/chem/electrochemistry/battery/scene.mjs +9 -12
  280. package/dist/domains/chem/electrochemistry/corrosion-cell/scene.mjs +4 -7
  281. package/dist/domains/chem/electrochemistry/electrochem/scene.mjs +7 -7
  282. package/dist/domains/chem/electrochemistry/electrolysis-bench/scene.mjs +17 -18
  283. package/dist/domains/chem/electrochemistry/faraday-bench/runtime.mjs +1 -1
  284. package/dist/domains/chem/electrochemistry/faraday-bench/scene.mjs +18 -5
  285. package/dist/domains/chem/electrochemistry/fuel-cell-flow/scene.mjs +12 -11
  286. package/dist/domains/chem/electrochemistry/redox-balancer/scene.mjs +9 -7
  287. package/dist/domains/chem/electrochemistry/redox-transfer/activity.mjs +160 -0
  288. package/dist/domains/chem/electrochemistry/redox-transfer/cases.mjs +172 -0
  289. package/dist/domains/chem/electrochemistry/redox-transfer/manifest.mjs +98 -0
  290. package/dist/domains/chem/electrochemistry/redox-transfer/model.mjs +807 -0
  291. package/dist/domains/chem/electrochemistry/redox-transfer/number-scene.mjs +150 -0
  292. package/dist/domains/chem/electrochemistry/redox-transfer/runtime.mjs +56 -0
  293. package/dist/domains/chem/electrochemistry/redox-transfer/scene.mjs +17 -0
  294. package/dist/domains/chem/electrochemistry/redox-transfer/sort-scene.mjs +214 -0
  295. package/dist/domains/chem/electrochemistry/redox-transfer/transfer-scene.mjs +396 -0
  296. package/dist/domains/chem/energetics/bond-energy-ledger/scene.mjs +8 -6
  297. package/dist/domains/chem/energetics/energy-cycle/hess-scene.mjs +3 -2
  298. package/dist/domains/chem/energetics/energy-cycle/scene.mjs +5 -5
  299. package/dist/domains/chem/energetics/hydrate-cycle/scene.mjs +3 -2
  300. package/dist/domains/chem/energetics/reaction-calorimeter/scene.mjs +3 -5
  301. package/dist/domains/chem/gases-and-states/air-composition/scene.mjs +6 -8
  302. package/dist/domains/chem/gases-and-states/diffusion/model.mjs +12 -10
  303. package/dist/domains/chem/gases-and-states/diffusion/scene.mjs +21 -10
  304. package/dist/domains/chem/gases-and-states/effusion/activity.mjs +66 -0
  305. package/dist/domains/chem/gases-and-states/effusion/manifest.mjs +76 -0
  306. package/dist/domains/chem/gases-and-states/effusion/model.mjs +281 -0
  307. package/dist/domains/chem/gases-and-states/effusion/runtime.mjs +44 -0
  308. package/dist/domains/chem/gases-and-states/effusion/scene.mjs +303 -0
  309. package/dist/domains/chem/gases-and-states/gas-box/scene.mjs +4 -6
  310. package/dist/domains/chem/gases-and-states/gas-diffusion/activity.mjs +86 -0
  311. package/dist/domains/chem/gases-and-states/gas-diffusion/manifest.mjs +91 -0
  312. package/dist/domains/chem/gases-and-states/gas-diffusion/model.mjs +433 -0
  313. package/dist/domains/chem/gases-and-states/gas-diffusion/runtime.mjs +39 -0
  314. package/dist/domains/chem/gases-and-states/gas-diffusion/scene.mjs +454 -0
  315. package/dist/domains/chem/gases-and-states/particle-theatre/scene.mjs +2 -4
  316. package/dist/domains/chem/gases-and-states/particle-theatre/world.mjs +111 -103
  317. package/dist/domains/chem/glide.mjs +5 -4
  318. package/dist/domains/chem/industrial/applied-chemistry/parts.mjs +2 -4
  319. package/dist/domains/chem/industrial/applied-chemistry/scene.mjs +8 -9
  320. package/dist/domains/chem/industrial/contact-process-control/scene.mjs +3 -3
  321. package/dist/domains/chem/industrial/industrial-process/equipment.mjs +1 -3
  322. package/dist/domains/chem/industrial/industrial-process/scene.mjs +7 -8
  323. package/dist/domains/chem/kinetics-equilibrium/catalytic-cycle/scene.mjs +1 -2
  324. package/dist/domains/chem/kinetics-equilibrium/kinetics/scene.mjs +3 -5
  325. package/dist/domains/chem/kinetics-equilibrium/kinetics/world.mjs +181 -167
  326. package/dist/domains/chem/kinetics-equilibrium/le-chatelier/model.mjs +5 -3
  327. package/dist/domains/chem/kinetics-equilibrium/le-chatelier/scene.mjs +9 -14
  328. package/dist/domains/chem/kinetics-equilibrium/le-chatelier/world.mjs +79 -128
  329. package/dist/domains/chem/kinetics-equilibrium/mechanism-walk/scene.mjs +0 -1
  330. package/dist/domains/chem/kinetics-equilibrium/reaction-lab/scene.mjs +4 -6
  331. package/dist/domains/chem/kinetics-equilibrium/reaction-lab/world.mjs +60 -50
  332. package/dist/domains/chem/kinetics-equilibrium/reaction-profile/scene.mjs +2 -3
  333. package/dist/domains/chem/metals/metal-reactivity-bench/scene.mjs +19 -24
  334. package/dist/domains/chem/organic/alkene-geometry/scene.mjs +11 -7
  335. package/dist/domains/chem/organic/arene-evidence/scene.mjs +29 -24
  336. package/dist/domains/chem/organic/ball-stick.mjs +1 -2
  337. package/dist/domains/chem/organic/functional-group-lens/scene.mjs +4 -3
  338. package/dist/domains/chem/organic/isomer-builder/scene.mjs +0 -1
  339. package/dist/domains/chem/organic/organic-formula-studio/pattern-scene.mjs +0 -1
  340. package/dist/domains/chem/organic/organic-formula-studio/scene.mjs +1 -2
  341. package/dist/domains/chem/organic/organic-reaction-map/reaction-bench.mjs +0 -1
  342. package/dist/domains/chem/organic/organic-reaction-map/scene.mjs +1 -2
  343. package/dist/domains/chem/organic/polymer-builder/scene.mjs +8 -7
  344. package/dist/domains/chem/organic/spectrum-reader/scene.mjs +2 -0
  345. package/dist/domains/chem/organic/stereochemistry/scene.mjs +4 -5
  346. package/dist/domains/chem/organic/synthesis-route/scene.mjs +26 -37
  347. package/dist/domains/chem/quantitative/constant-mass/scene.mjs +4 -6
  348. package/dist/domains/chem/quantitative/dilution/scene.mjs +3 -5
  349. package/dist/domains/chem/quantitative/equation-conservation-desk/scene.mjs +0 -1
  350. package/dist/domains/chem/quantitative/formula-forge/scene.mjs +0 -1
  351. package/dist/domains/chem/quantitative/formula-workbench/scene.mjs +0 -1
  352. package/dist/domains/chem/quantitative/gas-collection/scene.mjs +2 -4
  353. package/dist/domains/chem/quantitative/mole-factory/scene.mjs +2 -3
  354. package/dist/domains/chem/quantitative/percent-lens/scene.mjs +4 -3
  355. package/dist/domains/chem/quantitative/percentage-purity-lab/scene.mjs +2 -3
  356. package/dist/domains/chem/quantitative/percentage-yield-lab/scene.mjs +1 -2
  357. package/dist/domains/chem/quantitative/ratio-normalizer/preset.mjs +11 -11
  358. package/dist/domains/chem/quantitative/redox-titration/scene.mjs +3 -5
  359. package/dist/domains/chem/quantitative/relation-origin/scene.mjs +0 -1
  360. package/dist/domains/chem/quantitative/solution-box/scene.mjs +3 -5
  361. package/dist/domains/chem/quantitative/solution-mixer/scene.mjs +2 -4
  362. package/dist/domains/chem/quantitative/standard-solution/scene.mjs +4 -6
  363. package/dist/domains/chem/quantitative/stoichiometry/scene.mjs +4 -4
  364. package/dist/domains/chem/salts-and-solubility/reagent-ladder/scene.mjs +4 -3
  365. package/dist/domains/chem/salts-and-solubility/selective-solvent-bench/scene.mjs +4 -7
  366. package/dist/domains/chem/salts-and-solubility/soap-hard-water/activity.mjs +234 -0
  367. package/dist/domains/chem/salts-and-solubility/soap-hard-water/manifest.mjs +86 -0
  368. package/dist/domains/chem/salts-and-solubility/soap-hard-water/model.mjs +462 -0
  369. package/dist/domains/chem/salts-and-solubility/soap-hard-water/parts.mjs +199 -0
  370. package/dist/domains/chem/salts-and-solubility/soap-hard-water/runtime.mjs +87 -0
  371. package/dist/domains/chem/salts-and-solubility/soap-hard-water/samples.mjs +88 -0
  372. package/dist/domains/chem/salts-and-solubility/soap-hard-water/scene.mjs +1177 -0
  373. package/dist/domains/chem/salts-and-solubility/solubility-kitchen/scene.mjs +3 -5
  374. package/dist/domains/chem/salts-and-solubility/solubility-rules/scene.mjs +0 -1
  375. package/dist/domains/chem/salts-and-solubility/soluble-salt-workshop/scene.mjs +6 -6
  376. package/dist/domains/chem/structure/atomic-orbital/runtime.d.mts +8 -0
  377. package/dist/domains/chem/structure/atomic-orbital/runtime.mjs +2 -2
  378. package/dist/domains/chem/structure/atomic-orbital/scene.d.mts +4 -2
  379. package/dist/domains/chem/structure/atomic-orbital/scene.mjs +7 -22
  380. package/dist/domains/chem/structure/atomic-orbital/world.d.mts +5 -0
  381. package/dist/domains/chem/structure/atomic-orbital/world.mjs +50 -42
  382. package/dist/domains/chem/structure/bohr-atom/activity.mjs +232 -27
  383. package/dist/domains/chem/structure/bohr-atom/ladder.mjs +85 -0
  384. package/dist/domains/chem/structure/bohr-atom/landing.mjs +44 -0
  385. package/dist/domains/chem/structure/bohr-atom/layout.mjs +111 -0
  386. package/dist/domains/chem/structure/bohr-atom/manifest.mjs +51 -2
  387. package/dist/domains/chem/structure/bohr-atom/model.d.mts +182 -8
  388. package/dist/domains/chem/structure/bohr-atom/model.mjs +422 -58
  389. package/dist/domains/chem/structure/bohr-atom/runtime.d.mts +7 -1
  390. package/dist/domains/chem/structure/bohr-atom/runtime.mjs +8 -3
  391. package/dist/domains/chem/structure/bohr-atom/scene.mjs +118 -55
  392. package/dist/domains/chem/structure/bohr-atom/shell-view.mjs +109 -0
  393. package/dist/domains/chem/structure/bohr-atom/subshell-view.mjs +128 -0
  394. package/dist/domains/chem/structure/complex-shape/scene.mjs +3 -2
  395. package/dist/domains/chem/structure/covalent-bond-builder/activity.mjs +74 -28
  396. package/dist/domains/chem/structure/covalent-bond-builder/manifest.mjs +28 -2
  397. package/dist/domains/chem/structure/covalent-bond-builder/model.d.mts +39 -12
  398. package/dist/domains/chem/structure/covalent-bond-builder/model.mjs +188 -98
  399. package/dist/domains/chem/structure/covalent-bond-builder/scene.mjs +181 -37
  400. package/dist/domains/chem/structure/crystal-lattice/runtime.d.mts +8 -0
  401. package/dist/domains/chem/structure/crystal-lattice/runtime.mjs +2 -2
  402. package/dist/domains/chem/structure/crystal-lattice/scene.d.mts +4 -2
  403. package/dist/domains/chem/structure/crystal-lattice/scene.mjs +11 -27
  404. package/dist/domains/chem/structure/crystal-lattice/world.d.mts +5 -0
  405. package/dist/domains/chem/structure/crystal-lattice/world.mjs +86 -78
  406. package/dist/domains/chem/structure/electron-configuration/scene.mjs +3 -6
  407. package/dist/domains/chem/structure/ionic-bond-builder/scene.mjs +2 -5
  408. package/dist/domains/chem/structure/molecular-geometry/runtime.d.mts +8 -0
  409. package/dist/domains/chem/structure/molecular-geometry/runtime.mjs +2 -2
  410. package/dist/domains/chem/structure/molecular-geometry/scene.d.mts +4 -2
  411. package/dist/domains/chem/structure/molecular-geometry/scene.mjs +9 -32
  412. package/dist/domains/chem/structure/molecular-geometry/world.d.mts +5 -0
  413. package/dist/domains/chem/structure/molecular-geometry/world.mjs +55 -47
  414. package/dist/domains/chem/structure/orbital-diagram/runtime.mjs +1 -1
  415. package/dist/domains/chem/structure/orbital-diagram/scene.mjs +3 -6
  416. package/dist/domains/chem/structure/orbital-overlap/runtime.d.mts +8 -0
  417. package/dist/domains/chem/structure/orbital-overlap/runtime.mjs +2 -2
  418. package/dist/domains/chem/structure/orbital-overlap/scene.d.mts +4 -2
  419. package/dist/domains/chem/structure/orbital-overlap/scene.mjs +7 -23
  420. package/dist/domains/chem/structure/orbital-overlap/world.d.mts +5 -0
  421. package/dist/domains/chem/structure/orbital-overlap/world.mjs +58 -50
  422. package/dist/domains/chem/structure/periodic-trends/scene.mjs +2 -3
  423. package/dist/domains/chem/structure/trend-axis/scene.mjs +13 -14
  424. package/dist/domains/circuits/ac-dc/scene.mjs +4 -7
  425. package/dist/domains/circuits/ac-response/scene.mjs +86 -49
  426. package/dist/domains/circuits/bjt-amplifier/scene.mjs +3 -6
  427. package/dist/domains/circuits/bjt-inside/scene.mjs +32 -24
  428. package/dist/domains/circuits/brownout/scene.mjs +9 -11
  429. package/dist/domains/circuits/capacitor-leak/scene.mjs +17 -19
  430. package/dist/domains/circuits/cell-combination/scene.mjs +1 -2
  431. package/dist/domains/circuits/circuit/scene.mjs +1 -2
  432. package/dist/domains/circuits/circuit-builder/scene.mjs +2 -3
  433. package/dist/domains/circuits/circuit-lab/scene.mjs +1 -2
  434. package/dist/domains/circuits/circuit-sandbox/runtime.mjs +13 -5
  435. package/dist/domains/circuits/circuit-scene/scene.mjs +1 -2
  436. package/dist/domains/circuits/cmos-inverter/scene.mjs +14 -14
  437. package/dist/domains/circuits/cmos-nand/scene.mjs +9 -10
  438. package/dist/domains/circuits/cmos-nor/scene.mjs +9 -10
  439. package/dist/domains/circuits/conduction/apparatus.mjs +45 -59
  440. package/dist/domains/circuits/conduction/runtime.mjs +0 -1
  441. package/dist/domains/circuits/diode/scene.mjs +3 -6
  442. package/dist/domains/circuits/energy-cost/scene.mjs +1 -2
  443. package/dist/domains/circuits/hall-effect/runtime.mjs +0 -1
  444. package/dist/domains/circuits/hall-effect/scene.mjs +18 -17
  445. package/dist/domains/circuits/kirchhoff-laws/scene.mjs +1 -2
  446. package/dist/domains/circuits/meter-conversion/scene.mjs +1 -3
  447. package/dist/domains/circuits/mosfet-inside/model.d.mts +1 -1
  448. package/dist/domains/circuits/mosfet-inside/scene.mjs +22 -20
  449. package/dist/domains/circuits/network-reduction/scene.mjs +8 -7
  450. package/dist/domains/circuits/null-balance/scene.mjs +1 -2
  451. package/dist/domains/circuits/op-amp-comparator/scene.mjs +14 -16
  452. package/dist/domains/circuits/pn-junction/scene.mjs +34 -27
  453. package/dist/domains/circuits/potential-divider/scene.mjs +7 -10
  454. package/dist/domains/circuits/potential-hill/activity.mjs +132 -0
  455. package/dist/domains/circuits/potential-hill/manifest.mjs +107 -0
  456. package/dist/domains/circuits/potential-hill/model.mjs +207 -0
  457. package/dist/domains/circuits/potential-hill/runtime.mjs +24 -0
  458. package/dist/domains/circuits/potential-hill/scene.mjs +267 -0
  459. package/dist/domains/circuits/rc-charging/activity.mjs +5 -5
  460. package/dist/domains/circuits/rc-charging/manifest.mjs +5 -10
  461. package/dist/domains/circuits/rc-charging/model.mjs +31 -10
  462. package/dist/domains/circuits/rc-charging/runtime.mjs +4 -7
  463. package/dist/domains/circuits/rc-charging/scene.mjs +273 -210
  464. package/dist/domains/circuits/rnmos-not/scene.mjs +14 -14
  465. package/dist/domains/circuits/silicon-lattice/runtime.mjs +0 -1
  466. package/dist/domains/circuits/silicon-lattice/scene.mjs +0 -1
  467. package/dist/domains/circuits/transistor/scene.mjs +3 -6
  468. package/dist/domains/data/design-records/scene.mjs +1 -2
  469. package/dist/domains/data/dirty-data/scene.mjs +1 -2
  470. package/dist/domains/databases/b-plus-range/model.mjs +1 -1
  471. package/dist/domains/databases/b-plus-range/scene.mjs +2 -3
  472. package/dist/domains/databases/index-detective/model.mjs +1 -1
  473. package/dist/domains/databases/index-detective/scene.mjs +2 -3
  474. package/dist/domains/databases/query-plan/model.mjs +1 -1
  475. package/dist/domains/databases/query-plan/scene.mjs +2 -3
  476. package/dist/domains/databases/range-query/model.mjs +1 -1
  477. package/dist/domains/databases/range-query/scene.mjs +2 -3
  478. package/dist/domains/discrete/arrangements/scene.mjs +3 -6
  479. package/dist/domains/discrete/bayes/scene.mjs +6 -8
  480. package/dist/domains/discrete/binomial/runtime.mjs +2 -1
  481. package/dist/domains/discrete/binomial/scene.mjs +155 -148
  482. package/dist/domains/discrete/combination-studio/scene.mjs +2 -4
  483. package/dist/domains/discrete/counting-slots/scene.mjs +3 -6
  484. package/dist/domains/discrete/counting-tree/scene.mjs +6 -8
  485. package/dist/domains/discrete/expected-value/activity.mjs +2 -1
  486. package/dist/domains/discrete/expected-value/model.mjs +1 -1
  487. package/dist/domains/discrete/expected-value/scene.mjs +8 -9
  488. package/dist/domains/discrete/hypergeometric/activity.mjs +3 -2
  489. package/dist/domains/discrete/hypergeometric/runtime.mjs +4 -3
  490. package/dist/domains/discrete/hypergeometric/scene.mjs +3 -6
  491. package/dist/domains/discrete/induction-ladder/scene.mjs +2 -5
  492. package/dist/domains/discrete/invariant-detective/scene.mjs +3 -5
  493. package/dist/domains/discrete/karnaugh/activity.mjs +4 -4
  494. package/dist/domains/discrete/karnaugh/kmap.mjs +1 -1
  495. package/dist/domains/discrete/karnaugh/manifest.mjs +40 -19
  496. package/dist/domains/discrete/karnaugh/model.mjs +45 -12
  497. package/dist/domains/discrete/karnaugh/runtime.mjs +1 -0
  498. package/dist/domains/discrete/karnaugh/scene.mjs +19 -10
  499. package/dist/domains/discrete/lln/model.mjs +1 -1
  500. package/dist/domains/discrete/lln/scene.mjs +2 -5
  501. package/dist/domains/discrete/modular-clock/scene.mjs +3 -5
  502. package/dist/domains/discrete/monte-carlo/model.mjs +18 -13
  503. package/dist/domains/discrete/monte-carlo/scene.mjs +5 -5
  504. package/dist/domains/discrete/monty-hall/activity.mjs +24 -18
  505. package/dist/domains/discrete/monty-hall/manifest.mjs +2 -1
  506. package/dist/domains/discrete/monty-hall/model.mjs +92 -80
  507. package/dist/domains/discrete/monty-hall/runtime.mjs +1 -1
  508. package/dist/domains/discrete/monty-hall/scene.mjs +80 -66
  509. package/dist/domains/discrete/outcome-builder/activity.mjs +25 -0
  510. package/dist/domains/discrete/outcome-builder/manifest.mjs +15 -2
  511. package/dist/domains/discrete/outcome-builder/model.mjs +57 -20
  512. package/dist/domains/discrete/outcome-builder/runtime.mjs +19 -3
  513. package/dist/domains/discrete/outcome-builder/scene.mjs +1 -2
  514. package/dist/domains/discrete/pascal/scene.mjs +2 -4
  515. package/dist/domains/discrete/pigeonhole-adversary/scene.mjs +3 -6
  516. package/dist/domains/discrete/proof-builder/diagram.mjs +2 -1
  517. package/dist/domains/discrete/proof-builder/scene.mjs +1 -3
  518. package/dist/domains/discrete/recurrence-builder/scene.mjs +6 -8
  519. package/dist/domains/discrete/rule-card/complex-rules.mjs +4 -3
  520. package/dist/domains/discrete/rule-card/diagrams.mjs +2 -1
  521. package/dist/domains/discrete/rule-card/manifest.mjs +1 -2
  522. package/dist/domains/discrete/rule-card/rule-figures.mjs +5 -5
  523. package/dist/domains/discrete/rule-card/rules.d.mts +7 -6
  524. package/dist/domains/discrete/rule-card/rules.mjs +30 -18
  525. package/dist/domains/discrete/rule-card/trig-rules.mjs +6 -5
  526. package/dist/domains/discrete/sample-space/scene.mjs +0 -1
  527. package/dist/domains/discrete/selection/scene.mjs +9 -9
  528. package/dist/domains/discrete/statement-logic/scene.mjs +1 -5
  529. package/dist/domains/discrete/truth-table/activity.mjs +28 -4
  530. package/dist/domains/discrete/truth-table/manifest.mjs +11 -1
  531. package/dist/domains/discrete/truth-table/model.mjs +29 -18
  532. package/dist/domains/discrete/truth-table/scene.mjs +4 -15
  533. package/dist/domains/discrete/venn/model.mjs +10 -5
  534. package/dist/domains/discrete/venn/runtime.mjs +66 -62
  535. package/dist/domains/discrete/venn/scene.mjs +20 -16
  536. package/dist/domains/discrete/venn/sets.d.mts +0 -1
  537. package/dist/domains/discrete/venn/sets.mjs +1 -6
  538. package/dist/domains/distributed-systems/shard-key/shard-key-board.mjs +0 -1
  539. package/dist/domains/domain-map.mjs +38 -0
  540. package/dist/domains/economics/demand-shift-vs-move/scene.mjs +2 -3
  541. package/dist/domains/economics/elasticity-revenue/scene.mjs +2 -3
  542. package/dist/domains/economics/market-equilibrium/scene.mjs +2 -3
  543. package/dist/domains/exam/command-lens/manifest.mjs +4 -3
  544. package/dist/domains/exam/command-lens/scene.mjs +1 -2
  545. package/dist/domains/exam/exam-question/scene.mjs +6 -1
  546. package/dist/domains/exam/practice-set/model.mjs +7 -1
  547. package/dist/domains/exam/practice-set/runtime.mjs +1 -1
  548. package/dist/domains/geography/cycle/scene.mjs +5 -2
  549. package/dist/domains/geometry/geometry-board/builder.mjs +4 -1
  550. package/dist/domains/geometry/geometry-board/manifest.mjs +1 -69
  551. package/dist/domains/geometry/geometry-board/runtime.mjs +2 -2
  552. package/dist/domains/geometry/geometry-figure/manifest.mjs +114 -0
  553. package/dist/domains/geometry/geometry-figure/runtime.mjs +19 -0
  554. package/dist/domains/geometry/intersecting-circles/scene.mjs +1 -2
  555. package/dist/domains/ict/array-vs-list/scene.mjs +1 -1
  556. package/dist/domains/ict/binary-counter/scene.mjs +1 -2
  557. package/dist/domains/ict/binary-display/scene.mjs +0 -2
  558. package/dist/domains/ict/binary-search/scene.mjs +1 -1
  559. package/dist/domains/ict/bound-prover/scene.mjs +4 -4
  560. package/dist/domains/ict/code-trace/activity.mjs +23 -0
  561. package/dist/domains/ict/code-trace/manifest.mjs +81 -0
  562. package/dist/domains/ict/code-trace/model.mjs +199 -0
  563. package/dist/domains/ict/code-trace/runtime.mjs +30 -0
  564. package/dist/domains/ict/code-trace/scene.mjs +321 -0
  565. package/dist/domains/ict/coin-change/scene.mjs +1 -1
  566. package/dist/domains/ict/complexity-growth/scene.mjs +1 -1
  567. package/dist/domains/ict/cost-derivation/scene.mjs +2 -3
  568. package/dist/domains/ict/graph-algorithm/scene.mjs +1 -1
  569. package/dist/domains/ict/grid-path-dp/scene.mjs +1 -1
  570. package/dist/domains/ict/hash-table/scene.mjs +1 -1
  571. package/dist/domains/ict/heap-quest/HeapDualView.mjs +2 -0
  572. package/dist/domains/ict/jk-flip-flop/activity.mjs +1 -1
  573. package/dist/domains/ict/jk-flip-flop/model.mjs +1 -1
  574. package/dist/domains/ict/jk-flip-flop/runtime.mjs +14 -7
  575. package/dist/domains/ict/jk-flip-flop/scene.mjs +3 -10
  576. package/dist/domains/ict/jk-flip-flop/task-view.mjs +58 -0
  577. package/dist/domains/ict/latch-vs-flip-flop/TimingScene.d.mts +0 -1
  578. package/dist/domains/ict/latch-vs-flip-flop/scene.mjs +1 -2
  579. package/dist/domains/ict/logic-builder/LogicEditScene.mjs +0 -5
  580. package/dist/domains/ict/logic-builder/activity.mjs +2 -2
  581. package/dist/domains/ict/logic-builder/manifest.mjs +46 -1
  582. package/dist/domains/ict/logic-builder/model.mjs +126 -36
  583. package/dist/domains/ict/logic-builder/runtime.mjs +1 -1
  584. package/dist/domains/ict/logic-builder/scene.mjs +87 -43
  585. package/dist/domains/ict/logic-gate/scene.mjs +0 -1
  586. package/dist/domains/ict/mini-sheet/activity.mjs +23 -0
  587. package/dist/domains/ict/mini-sheet/manifest.mjs +93 -0
  588. package/dist/domains/ict/mini-sheet/model.mjs +175 -0
  589. package/dist/domains/ict/mini-sheet/runtime.mjs +25 -0
  590. package/dist/domains/ict/mini-sheet/scene.mjs +216 -0
  591. package/dist/domains/ict/recursion-tree/scene.mjs +2 -7
  592. package/dist/domains/ict/sequence-detector/activity.mjs +6 -6
  593. package/dist/domains/ict/sequence-detector/manifest.mjs +11 -3
  594. package/dist/domains/ict/sequence-detector/model.mjs +3 -2
  595. package/dist/domains/ict/sequence-detector/scene.mjs +2 -3
  596. package/dist/domains/ict/shift-register/ShiftScene.mjs +0 -1
  597. package/dist/domains/ict/sorting-quest/Bars.mjs +11 -7
  598. package/dist/domains/ict/sorting-quest/scene.mjs +1 -1
  599. package/dist/domains/ict/sr-latch/scene.mjs +4 -6
  600. package/dist/domains/ict/state-machine-builder/activity.mjs +46 -0
  601. package/dist/domains/ict/state-machine-builder/manifest.mjs +56 -0
  602. package/dist/domains/ict/state-machine-builder/model.mjs +422 -0
  603. package/dist/domains/ict/state-machine-builder/runtime.mjs +24 -0
  604. package/dist/domains/ict/state-machine-builder/scene.mjs +211 -0
  605. package/dist/domains/ict/tree-quest/scene.mjs +1 -1
  606. package/dist/domains/ict/twos-complement/scene.mjs +2 -3
  607. package/dist/domains/ict/wire-a-chip/ChipScene.d.mts +0 -1
  608. package/dist/domains/ict/wire-a-chip/ChipScene.mjs +426 -314
  609. package/dist/domains/language/_shared/construction.mjs +1 -1
  610. package/dist/domains/language/article-lens/model.d.mts +5 -5
  611. package/dist/domains/language/preposition/model.d.mts +5 -5
  612. package/dist/domains/manifests.mjs +730 -692
  613. package/dist/domains/math/_shared/parameter-name.mjs +24 -0
  614. package/dist/domains/math/algebra/area-model/activity.mjs +43 -4
  615. package/dist/domains/math/algebra/area-model/manifest.mjs +26 -2
  616. package/dist/domains/math/algebra/area-model/model.mjs +117 -54
  617. package/dist/domains/math/algebra/area-model/runtime.mjs +3 -3
  618. package/dist/domains/math/algebra/area-model/scene.mjs +28 -1
  619. package/dist/domains/math/algebra/balance-algebra/scene.mjs +0 -1
  620. package/dist/domains/math/algebra/discriminant-radar/manifest.mjs +12 -0
  621. package/dist/domains/math/algebra/discriminant-radar/scene.mjs +5 -6
  622. package/dist/domains/math/algebra/distribute-strip/scene.mjs +0 -1
  623. package/dist/domains/math/algebra/fraction-cancellation/scene.mjs +3 -5
  624. package/dist/domains/math/algebra/inequality-line/scene.mjs +5 -4
  625. package/dist/domains/math/algebra/inequality-solver/scene.mjs +2 -1
  626. package/dist/domains/math/algebra/linear-system/scene.mjs +4 -3
  627. package/dist/domains/math/algebra/log-law-workbench/activity.mjs +185 -188
  628. package/dist/domains/math/algebra/log-law-workbench/manifest.mjs +31 -9
  629. package/dist/domains/math/algebra/log-law-workbench/model.mjs +234 -37
  630. package/dist/domains/math/algebra/log-law-workbench/runtime.mjs +2 -10
  631. package/dist/domains/math/algebra/log-law-workbench/scene.mjs +338 -21
  632. package/dist/domains/math/algebra/mystery-bucket/scene.mjs +101 -28
  633. package/dist/domains/math/algebra/partial-fractions/scene.mjs +1 -2
  634. package/dist/domains/math/algebra/polynomial-solver/activity.mjs +6 -2
  635. package/dist/domains/math/algebra/polynomial-solver/cases-division.mjs +47 -1
  636. package/dist/domains/math/algebra/polynomial-solver/cases-factor.mjs +2 -0
  637. package/dist/domains/math/algebra/polynomial-solver/cases-two-letter.mjs +129 -0
  638. package/dist/domains/math/algebra/polynomial-solver/engine.mjs +1 -0
  639. package/dist/domains/math/algebra/polynomial-solver/games.mjs +6 -5
  640. package/dist/domains/math/algebra/polynomial-solver/manifest.mjs +33 -1
  641. package/dist/domains/math/algebra/polynomial-solver/model.mjs +20 -11
  642. package/dist/domains/math/algebra/polynomial-solver/moves.mjs +1 -1
  643. package/dist/domains/math/algebra/polynomial-solver/plots.mjs +2 -2
  644. package/dist/domains/math/algebra/polynomial-solver/runtime.mjs +1 -1
  645. package/dist/domains/math/algebra/polynomial-solver/scene-calculator.mjs +2 -1
  646. package/dist/domains/math/algebra/polynomial-solver/scene-long-division.mjs +121 -0
  647. package/dist/domains/math/algebra/polynomial-solver/scene-parts.mjs +3 -3
  648. package/dist/domains/math/algebra/polynomial-solver/scene-split.mjs +49 -3
  649. package/dist/domains/math/algebra/polynomial-solver/scene-tableau.mjs +17 -3
  650. package/dist/domains/math/algebra/polynomial-solver/trace-renderers.mjs +7 -2
  651. package/dist/domains/math/algebra/root-fingerprint/scene.mjs +3 -4
  652. package/dist/domains/math/algebra/root-mover/scene.mjs +3 -3
  653. package/dist/domains/math/algebra/slide-rule/scene.mjs +0 -1
  654. package/dist/domains/math/algebra/substitute-value/scene.mjs +2 -1
  655. package/dist/domains/math/algebra/system-solve/scene.mjs +0 -1
  656. package/dist/domains/math/calculus/derivative-explorer/scene.mjs +4 -3
  657. package/dist/domains/math/calculus/differential-equation/runtime.mjs +2 -2
  658. package/dist/domains/math/calculus/differential-equation/scene.mjs +5 -4
  659. package/dist/domains/math/calculus/fundamental-theorem/scene.mjs +5 -4
  660. package/dist/domains/math/calculus/gradient-descent/runtime.mjs +22 -17
  661. package/dist/domains/math/calculus/implicit-parametric-derivative/activity.mjs +9 -4
  662. package/dist/domains/math/calculus/implicit-parametric-derivative/model.mjs +8 -4
  663. package/dist/domains/math/calculus/implicit-parametric-derivative/runtime.mjs +7 -7
  664. package/dist/domains/math/calculus/implicit-parametric-derivative/scene.mjs +8 -7
  665. package/dist/domains/math/calculus/integral-explorer/scene.mjs +3 -4
  666. package/dist/domains/math/calculus/integration-workbench/activity.mjs +12 -11
  667. package/dist/domains/math/calculus/integration-workbench/manifest.mjs +15 -0
  668. package/dist/domains/math/calculus/integration-workbench/model.mjs +49 -14
  669. package/dist/domains/math/calculus/integration-workbench/runtime.mjs +3 -3
  670. package/dist/domains/math/calculus/integration-workbench/scene.mjs +20 -18
  671. package/dist/domains/math/calculus/limit-explorer/scene.mjs +5 -4
  672. package/dist/domains/math/calculus/newton-method/scene.mjs +4 -4
  673. package/dist/domains/math/calculus/phase-portrait/scene.mjs +5 -5
  674. package/dist/domains/math/calculus/solids-of-revolution/flat-scene.mjs +7 -7
  675. package/dist/domains/math/calculus/solids-of-revolution/runtime.d.mts +8 -0
  676. package/dist/domains/math/calculus/solids-of-revolution/runtime.mjs +2 -2
  677. package/dist/domains/math/calculus/solids-of-revolution/scene.d.mts +5 -8
  678. package/dist/domains/math/calculus/solids-of-revolution/scene.mjs +15 -30
  679. package/dist/domains/math/calculus/stationary-point-classifier/activity.mjs +2 -2
  680. package/dist/domains/math/calculus/stationary-point-classifier/runtime.mjs +2 -2
  681. package/dist/domains/math/calculus/stationary-point-classifier/scene.mjs +4 -3
  682. package/dist/domains/math/calculus/tangent-normal/scene.mjs +2 -4
  683. package/dist/domains/math/calculus/taylor-series/runtime.mjs +2 -2
  684. package/dist/domains/math/calculus/taylor-series/scene.mjs +2 -4
  685. package/dist/domains/math/coordinate-geometry/angle-between-lines/scene.mjs +0 -1
  686. package/dist/domains/math/coordinate-geometry/chord-bisection/scene.mjs +1 -1
  687. package/dist/domains/math/coordinate-geometry/chord-given-midpoint/scene.mjs +1 -1
  688. package/dist/domains/math/coordinate-geometry/chord-of-contact/scene.mjs +1 -1
  689. package/dist/domains/math/coordinate-geometry/circle-diameter-endpoints/activity.mjs +3 -4
  690. package/dist/domains/math/coordinate-geometry/circle-diameter-endpoints/manifest.mjs +2 -2
  691. package/dist/domains/math/coordinate-geometry/circle-diameter-endpoints/runtime.mjs +10 -17
  692. package/dist/domains/math/coordinate-geometry/circle-diameter-endpoints/scene.mjs +1 -1
  693. package/dist/domains/math/coordinate-geometry/circle-geometry/scene.mjs +3 -2
  694. package/dist/domains/math/coordinate-geometry/circle-intersection-angle/scene.mjs +1 -1
  695. package/dist/domains/math/coordinate-geometry/circle-line-tangency/scene.mjs +1 -1
  696. package/dist/domains/math/coordinate-geometry/circle-through-points/scene.mjs +1 -1
  697. package/dist/domains/math/coordinate-geometry/common-tangents-count/scene.mjs +1 -1
  698. package/dist/domains/math/coordinate-geometry/conic/scene.mjs +0 -1
  699. package/dist/domains/math/coordinate-geometry/coord-point/scene.mjs +5 -4
  700. package/dist/domains/math/coordinate-geometry/line-concurrency/scene.mjs +1 -1
  701. package/dist/domains/math/coordinate-geometry/line-family/scene.mjs +1 -1
  702. package/dist/domains/math/coordinate-geometry/point-line-distance/scene.mjs +83 -33
  703. package/dist/domains/math/coordinate-geometry/point-reflection/activity.mjs +3 -3
  704. package/dist/domains/math/coordinate-geometry/point-reflection/runtime.mjs +1 -1
  705. package/dist/domains/math/coordinate-geometry/point-reflection/scene.mjs +160 -46
  706. package/dist/domains/math/coordinate-geometry/polar-cartesian/model.mjs +12 -8
  707. package/dist/domains/math/coordinate-geometry/polar-cartesian/runtime.mjs +3 -3
  708. package/dist/domains/math/coordinate-geometry/polar-cartesian/scene.mjs +12 -12
  709. package/dist/domains/math/coordinate-geometry/radical-axis/scene.mjs +1 -1
  710. package/dist/domains/math/coordinate-geometry/section-formula/scene.mjs +1 -1
  711. package/dist/domains/math/coordinate-geometry/straight-line/scene.mjs +10 -7
  712. package/dist/domains/math/coordinate-geometry/tangent-length-power-of-point/scene.mjs +1 -1
  713. package/dist/domains/math/coordinate-geometry/triangle-area/scene.mjs +21 -7
  714. package/dist/domains/math/functions/composite-functions/composite/scenes.mjs +2 -2
  715. package/dist/domains/math/functions/composite-functions/scene.mjs +5 -4
  716. package/dist/domains/math/functions/domain-range/authoring.mjs +66 -9
  717. package/dist/domains/math/functions/domain-range/manifest.mjs +25 -0
  718. package/dist/domains/math/functions/domain-range/model.mjs +49 -12
  719. package/dist/domains/math/functions/domain-range/runtime.mjs +2 -2
  720. package/dist/domains/math/functions/domain-range/scene.mjs +50 -4
  721. package/dist/domains/math/functions/family-tree/scenes.mjs +4 -4
  722. package/dist/domains/math/functions/function-machine/conveyor-figure.mjs +13 -5
  723. package/dist/domains/math/functions/graph/authoring.mjs +16 -0
  724. package/dist/domains/math/functions/graph/manifest.mjs +32 -0
  725. package/dist/domains/math/functions/graph/model.mjs +98 -12
  726. package/dist/domains/math/functions/graph/runtime.mjs +1 -1
  727. package/dist/domains/math/functions/graph/scene.mjs +104 -35
  728. package/dist/domains/math/functions/graph-transform/scene.mjs +4 -4
  729. package/dist/domains/math/functions/injective-classifier/scene.mjs +1 -1
  730. package/dist/domains/math/functions/inverse-functions/scene.mjs +1 -1
  731. package/dist/domains/math/functions/linearisation/scene.mjs +1 -1
  732. package/dist/domains/math/functions/modulus-function/scene.mjs +1 -1
  733. package/dist/domains/math/functions/modulus-inequality/activity.mjs +33 -16
  734. package/dist/domains/math/functions/modulus-inequality/endpoint-label-layout.mjs +38 -0
  735. package/dist/domains/math/functions/modulus-inequality/manifest.mjs +45 -1
  736. package/dist/domains/math/functions/modulus-inequality/model.mjs +24 -18
  737. package/dist/domains/math/functions/modulus-inequality/runtime.mjs +3 -2
  738. package/dist/domains/math/functions/modulus-inequality/scene.mjs +194 -139
  739. package/dist/domains/math/functions/vertex-parabola/scene.mjs +1 -1
  740. package/dist/domains/math/geometry/angle-chase/model.mjs +1 -1
  741. package/dist/domains/math/geometry/angle-chase/runtime.mjs +2 -3
  742. package/dist/domains/math/geometry/angle-chase/scene.mjs +0 -1
  743. package/dist/domains/math/geometry/area-rearrange/activity.mjs +2 -2
  744. package/dist/domains/math/geometry/area-rearrange/runtime.mjs +1 -1
  745. package/dist/domains/math/geometry/area-rearrange/scene.mjs +2 -2
  746. package/dist/domains/math/geometry/broken-tree/activity.mjs +2 -2
  747. package/dist/domains/math/geometry/broken-tree/model.mjs +1 -1
  748. package/dist/domains/math/geometry/broken-tree/scene.mjs +14 -12
  749. package/dist/domains/math/geometry/clock-hand-angle/scene.mjs +0 -1
  750. package/dist/domains/math/geometry/cone-frustum/scene.mjs +22 -10
  751. package/dist/domains/math/geometry/geometry-foundations/scene.mjs +44 -16
  752. package/dist/domains/math/geometry/geometry-transform/scene.mjs +1 -1
  753. package/dist/domains/math/geometry/measurement/activity.mjs +22 -1
  754. package/dist/domains/math/geometry/measurement/circle-grid-scene.mjs +145 -0
  755. package/dist/domains/math/geometry/measurement/manifest.mjs +9 -1
  756. package/dist/domains/math/geometry/measurement/model.mjs +135 -8
  757. package/dist/domains/math/geometry/measurement/runtime.mjs +19 -8
  758. package/dist/domains/math/geometry/measurement/scene.mjs +258 -228
  759. package/dist/domains/math/geometry/pythagoras-dissection/runtime.mjs +10 -7
  760. package/dist/domains/math/geometry/pythagoras-dissection/scene.mjs +237 -213
  761. package/dist/domains/math/geometry/solid-net/model.mjs +1 -1
  762. package/dist/domains/math/geometry/solid-net/runtime.mjs +2 -2
  763. package/dist/domains/math/geometry/solid-net/scene.mjs +18 -14
  764. package/dist/domains/math/geometry/solid-slice/scene.mjs +76 -34
  765. package/dist/domains/math/geometry/tank-design/activity.mjs +0 -1
  766. package/dist/domains/math/geometry/tank-design/scene.mjs +5 -6
  767. package/dist/domains/math/number/alligation-mix/scene.mjs +0 -1
  768. package/dist/domains/math/number/bounds-window/activity.mjs +2 -2
  769. package/dist/domains/math/number/bounds-window/manifest.mjs +2 -2
  770. package/dist/domains/math/number/bounds-window/runtime.mjs +1 -1
  771. package/dist/domains/math/number/bounds-window/scene.mjs +53 -44
  772. package/dist/domains/math/number/division-workbench/model.mjs +1 -1
  773. package/dist/domains/math/number/division-workbench/runtime.mjs +6 -1
  774. package/dist/domains/math/number/division-workbench/visuals.mjs +209 -195
  775. package/dist/domains/math/number/fraction-bar/activity.mjs +8 -2
  776. package/dist/domains/math/number/fraction-bar/manifest.mjs +29 -2
  777. package/dist/domains/math/number/fraction-bar/model.mjs +147 -26
  778. package/dist/domains/math/number/fraction-bar/runtime.mjs +5 -3
  779. package/dist/domains/math/number/fraction-bar/scene.mjs +167 -4
  780. package/dist/domains/math/number/fraction-division/activity.mjs +15 -0
  781. package/dist/domains/math/number/fraction-division/manifest.mjs +73 -0
  782. package/dist/domains/math/number/fraction-division/model.mjs +86 -0
  783. package/dist/domains/math/number/fraction-division/runtime.mjs +24 -0
  784. package/dist/domains/math/number/fraction-division/scene.mjs +162 -0
  785. package/dist/domains/math/number/fraction-product/activity.mjs +15 -0
  786. package/dist/domains/math/number/fraction-product/manifest.mjs +79 -0
  787. package/dist/domains/math/number/fraction-product/model.mjs +85 -0
  788. package/dist/domains/math/number/fraction-product/runtime.mjs +23 -0
  789. package/dist/domains/math/number/fraction-product/scene.mjs +99 -0
  790. package/dist/domains/math/number/number-line/scene.mjs +4 -3
  791. package/dist/domains/math/number/number-structure/scene.mjs +282 -172
  792. package/dist/domains/math/number/percent-bar/scene.mjs +59 -44
  793. package/dist/domains/math/number/price-chain/scene.mjs +4 -3
  794. package/dist/domains/math/number/rate-machine/runtime.mjs +1 -1
  795. package/dist/domains/math/number/rate-machine/scene.mjs +10 -11
  796. package/dist/domains/math/number/ratio-share/scene.mjs +4 -3
  797. package/dist/domains/math/number/relative-speed-track/scene.mjs +2 -1
  798. package/dist/domains/math/number/square-builder/scene.mjs +2 -4
  799. package/dist/domains/math/reasoning/derivation/authoring.mjs +198 -35
  800. package/dist/domains/math/reasoning/derivation/derivation.d.mts +13 -11
  801. package/dist/domains/math/reasoning/derivation/derivation.mjs +382 -81
  802. package/dist/domains/math/reasoning/derivation/manifest.mjs +22 -10
  803. package/dist/domains/math/reasoning/derivation/runtime.mjs +2 -2
  804. package/dist/domains/math/reasoning/derivation/step-tex.mjs +78 -0
  805. package/dist/domains/math/reasoning/derivation/steps.d.mts +88 -0
  806. package/dist/domains/math/reasoning/derivation/steps.mjs +162 -0
  807. package/dist/domains/math/reasoning/interactive-problem/runtime.mjs +12 -1
  808. package/dist/domains/math/reasoning/story-scene/preload.mjs +18 -0
  809. package/dist/domains/math/schemas.mjs +29 -12
  810. package/dist/domains/math/sequences/growing-pattern/scene.mjs +24 -19
  811. package/dist/domains/math/sequences/iteration/model.mjs +5 -4
  812. package/dist/domains/math/sequences/iteration/scene.mjs +4 -3
  813. package/dist/domains/math/shared.mjs +1 -7
  814. package/dist/domains/math/trigonometry/_shared/cut-scene.mjs +1 -1
  815. package/dist/domains/math/trigonometry/_shared/wheel-scene.mjs +60 -22
  816. package/dist/domains/math/trigonometry/associated-angle-wheel/scene.mjs +1 -1
  817. package/dist/domains/math/trigonometry/bearings/bearings-scene.mjs +198 -13
  818. package/dist/domains/math/trigonometry/bearings/scene.mjs +3 -2
  819. package/dist/domains/math/trigonometry/circular-measure/scene.mjs +7 -12
  820. package/dist/domains/math/trigonometry/compound-angle-proof/scene.mjs +9 -8
  821. package/dist/domains/math/trigonometry/harmonic-form/scene.mjs +2 -3
  822. package/dist/domains/math/trigonometry/multiple-angle-wheel/scene.mjs +1 -1
  823. package/dist/domains/math/trigonometry/oblique-triangle/oblique-scene.mjs +70 -89
  824. package/dist/domains/math/trigonometry/oblique-triangle/scene.mjs +1 -2
  825. package/dist/domains/math/trigonometry/radian-wrap/runtime.mjs +1 -1
  826. package/dist/domains/math/trigonometry/radian-wrap/scene.mjs +8 -12
  827. package/dist/domains/math/trigonometry/sum-to-product-waves/scene.mjs +2 -3
  828. package/dist/domains/math/trigonometry/tangent-rule-triangle/scene.mjs +2 -3
  829. package/dist/domains/math/trigonometry/triangle-trig/runtime.mjs +1 -20
  830. package/dist/domains/math/trigonometry/triangle-trig/scene.mjs +170 -13
  831. package/dist/domains/math/trigonometry/trig-equation-solver/equation-scene.mjs +0 -1
  832. package/dist/domains/math/trigonometry/trig-equation-solver/scene.mjs +1 -2
  833. package/dist/domains/math/trigonometry/trig-explorer/model.mjs +1 -1
  834. package/dist/domains/math/trigonometry/trig-explorer/scene.mjs +7 -13
  835. package/dist/domains/math/trigonometry/trig-general-solution/scene.mjs +3 -3
  836. package/dist/domains/math/trigonometry/trig-signs/scene.mjs +7 -4
  837. package/dist/domains/math/vectors-matrices/complex-plane/runtime.mjs +2 -2
  838. package/dist/domains/math/vectors-matrices/complex-plane/scene.mjs +17 -13
  839. package/dist/domains/math/vectors-matrices/linear-map/runtime.mjs +1 -1
  840. package/dist/domains/math/vectors-matrices/linear-map/scene.mjs +3 -3
  841. package/dist/domains/math/vectors-matrices/lines-in-space/model.d.mts +1 -1
  842. package/dist/domains/math/vectors-matrices/lines-in-space/model.mjs +1 -1
  843. package/dist/domains/math/vectors-matrices/lines-in-space/runtime.mjs +7 -4
  844. package/dist/domains/math/vectors-matrices/lines-in-space/scene.mjs +21 -25
  845. package/dist/domains/math/vectors-matrices/vector-geometry-two-d/model.mjs +4 -4
  846. package/dist/domains/math/vectors-matrices/vector-geometry-two-d/runtime.mjs +2 -2
  847. package/dist/domains/math/vectors-matrices/vector-geometry-two-d/scene.mjs +124 -79
  848. package/dist/domains/ml/activation-gates/manifest.mjs +2 -2
  849. package/dist/domains/ml/activation-gates/model.d.mts +2 -1
  850. package/dist/domains/ml/activation-gates/model.mjs +15 -6
  851. package/dist/domains/ml/activation-gates/runtime.mjs +4 -4
  852. package/dist/domains/ml/activation-gates/scene.d.mts +18 -0
  853. package/dist/domains/ml/activation-gates/scene.mjs +159 -17
  854. package/dist/domains/ml/affine-neuron/scene.d.mts +1 -1
  855. package/dist/domains/ml/affine-neuron/scene.mjs +2 -3
  856. package/dist/domains/ml/anomaly-detector/model.d.mts +4 -4
  857. package/dist/domains/ml/anomaly-detector/scene.mjs +1 -2
  858. package/dist/domains/ml/attention-routing/scene.mjs +1 -2
  859. package/dist/domains/ml/autoencoder/scene.mjs +0 -1
  860. package/dist/domains/ml/backprop-tracer/backprop-graph-diagram.mjs +0 -1
  861. package/dist/domains/ml/causal-mask/scene.mjs +1 -2
  862. package/dist/domains/ml/char-model/scene.mjs +4 -6
  863. package/dist/domains/ml/classifier-threshold/model.d.mts +4 -4
  864. package/dist/domains/ml/classifier-threshold/scene.mjs +6 -5
  865. package/dist/domains/ml/context-window/context-window-diagram.mjs +0 -1
  866. package/dist/domains/ml/decision-boundary/scene.mjs +2 -2
  867. package/dist/domains/ml/denoising/denoising-diagram.mjs +0 -1
  868. package/dist/domains/ml/denoising/runtime.mjs +2 -2
  869. package/dist/domains/ml/embedding-neighborhood/scene.mjs +1 -2
  870. package/dist/domains/ml/embedding-space/scene.mjs +4 -4
  871. package/dist/domains/ml/encoder-decoder/encoder-decoder-diagram.mjs +4 -7
  872. package/dist/domains/ml/feature-map/feature-map-diagram.mjs +0 -1
  873. package/dist/domains/ml/feature-map/feature-map.mjs +2 -2
  874. package/dist/domains/ml/feature-map/scene.mjs +2 -3
  875. package/dist/domains/ml/feed-forward-network/feed-forward-workshop-diagram.mjs +0 -1
  876. package/dist/domains/ml/feed-forward-network/model.d.mts +6 -6
  877. package/dist/domains/ml/feed-forward-network/scene.mjs +2 -2
  878. package/dist/domains/ml/fit-evidence/linear-fit-diagram.mjs +0 -1
  879. package/dist/domains/ml/fit-evidence/scene.mjs +3 -4
  880. package/dist/domains/ml/gradient-step/gradient-step-diagram.mjs +0 -1
  881. package/dist/domains/ml/gradient-step/scene.mjs +2 -2
  882. package/dist/domains/ml/kmeans/scene.mjs +11 -3
  883. package/dist/domains/ml/knn/scene.mjs +2 -2
  884. package/dist/domains/ml/latent-space/latent-space-diagram.mjs +0 -1
  885. package/dist/domains/ml/latent-space/scene.mjs +2 -2
  886. package/dist/domains/ml/layer-normalization/layer-normalization-diagram.mjs +0 -1
  887. package/dist/domains/ml/layer-normalization/model.d.mts +4 -4
  888. package/dist/domains/ml/layer-normalization/scene.mjs +2 -2
  889. package/dist/domains/ml/learning-loop/learning-loop-diagram.mjs +0 -1
  890. package/dist/domains/ml/learning-loop/scene.mjs +2 -2
  891. package/dist/domains/ml/logistic-fit/scene.mjs +6 -5
  892. package/dist/domains/ml/loss-error/loss-diagram.mjs +3 -3
  893. package/dist/domains/ml/loss-error/scene.mjs +2 -2
  894. package/dist/domains/ml/matrix-vector/matrix-vector-diagram.mjs +0 -1
  895. package/dist/domains/ml/matrix-vector/scene.mjs +2 -2
  896. package/dist/domains/ml/memory-relay/model.d.mts +4 -4
  897. package/dist/domains/ml/memory-relay/scene.mjs +5 -4
  898. package/dist/domains/ml/model-complexity/scene.mjs +12 -4
  899. package/dist/domains/ml/multi-head-attention/multi-head-attention-diagram.mjs +0 -1
  900. package/dist/domains/ml/multi-head-attention/scene.mjs +4 -4
  901. package/dist/domains/ml/multimodal-alignment/scene.mjs +4 -4
  902. package/dist/domains/ml/next-token/scene.mjs +4 -5
  903. package/dist/domains/ml/overfit-gap/overfit-gap-diagram.mjs +2 -2
  904. package/dist/domains/ml/overfit-gap/scene.mjs +3 -4
  905. package/dist/domains/ml/pixel-filter/convolution-diagram.mjs +0 -1
  906. package/dist/domains/ml/pixel-filter/pixel-window-diagram.mjs +0 -1
  907. package/dist/domains/ml/pixel-filter/scene.mjs +2 -2
  908. package/dist/domains/ml/position-signals/scene.mjs +1 -2
  909. package/dist/domains/ml/query-key-value/model.d.mts +2 -2
  910. package/dist/domains/ml/query-key-value/query-key-value-diagram.mjs +0 -1
  911. package/dist/domains/ml/query-key-value/scene.mjs +3 -4
  912. package/dist/domains/ml/regression/activity.mjs +12 -8
  913. package/dist/domains/ml/regression/manifest.mjs +34 -1
  914. package/dist/domains/ml/regression/model.d.mts +8 -0
  915. package/dist/domains/ml/regression/model.mjs +12 -10
  916. package/dist/domains/ml/regression/runtime.mjs +12 -9
  917. package/dist/domains/ml/regression/scene.mjs +74 -17
  918. package/dist/domains/ml/residual-stream/residual-stream-diagram.d.mts +0 -1
  919. package/dist/domains/ml/residual-stream/residual-stream-diagram.mjs +0 -1
  920. package/dist/domains/ml/residual-stream/scene.mjs +4 -4
  921. package/dist/domains/ml/reward-groups/model.mjs +1 -1
  922. package/dist/domains/ml/reward-groups/scene.mjs +3 -4
  923. package/dist/domains/ml/scaled-dot-product-attention/scene.mjs +1 -2
  924. package/dist/domains/ml/tiny-network/model.mjs +1 -1
  925. package/dist/domains/ml/tiny-network/scene.mjs +5 -6
  926. package/dist/domains/ml/token-generation/model.mjs +1 -1
  927. package/dist/domains/ml/token-generation/scene.mjs +1 -2
  928. package/dist/domains/ml/tokenizer-bpe/model.mjs +1 -1
  929. package/dist/domains/ml/training-loop/scene.mjs +2 -4
  930. package/dist/domains/ml/transformer-block/scene.mjs +2 -3
  931. package/dist/domains/ml/unembedding/scene.mjs +2 -3
  932. package/dist/domains/networking/adaptive-video-call/scene.mjs +2 -5
  933. package/dist/domains/networking/bottleneck-queue/scene.mjs +82 -19
  934. package/dist/domains/networking/broadcast-delivery/scene.mjs +1 -3
  935. package/dist/domains/networking/cafe-privacy/runtime.mjs +6 -1
  936. package/dist/domains/networking/cafe-privacy/scene.mjs +296 -180
  937. package/dist/domains/networking/cell-size/CellSizeScene.mjs +1 -3
  938. package/dist/domains/networking/cloud-storage-design/manifest.mjs +2 -3
  939. package/dist/domains/networking/cloud-storage-design/scene.mjs +4 -7
  940. package/dist/domains/networking/container-deployment/scene.mjs +5 -8
  941. package/dist/domains/networking/data-recovery-planner/scene.mjs +4 -7
  942. package/dist/domains/networking/dhcp-lease/scene.mjs +0 -2
  943. package/dist/domains/networking/distributed-inference-topology/scene.mjs +3 -5
  944. package/dist/domains/networking/dns-resolution/scene.mjs +1 -4
  945. package/dist/domains/networking/edge-cache-delivery/scene.mjs +4 -7
  946. package/dist/domains/networking/ethernet-pinout/PlugScene.mjs +1 -3
  947. package/dist/domains/networking/failure-domain-planner/scene.mjs +4 -7
  948. package/dist/domains/networking/generation-capability/CapabilityTesterScene.mjs +0 -1
  949. package/dist/domains/networking/geo-market-routing/scene.mjs +3 -6
  950. package/dist/domains/networking/group-message-sync/scene.mjs +1 -3
  951. package/dist/domains/networking/handover-margin/scene.mjs +2 -4
  952. package/dist/domains/networking/home-broadband-journey/scene.mjs +1 -3
  953. package/dist/domains/networking/inference-capacity-planner/scene.mjs +3 -5
  954. package/dist/domains/networking/inference-degradation-planner/scene.mjs +3 -5
  955. package/dist/domains/networking/inference-request-pipeline/scene.mjs +0 -1
  956. package/dist/domains/networking/infrastructure-drift-planner/scene.mjs +3 -5
  957. package/dist/domains/networking/ipv6-neighbor/scene.mjs +0 -2
  958. package/dist/domains/networking/layer-encapsulation/scene.mjs +5 -9
  959. package/dist/domains/networking/live-stream-pipeline/scene.mjs +1 -3
  960. package/dist/domains/networking/media-encoding/scene.mjs +1 -3
  961. package/dist/domains/networking/message-journey/scene.mjs +1 -3
  962. package/dist/domains/networking/mobile-call-journey/scene.mjs +1 -3
  963. package/dist/domains/networking/model-routing-economics/scene.mjs +3 -5
  964. package/dist/domains/networking/modem-modulation/scene.mjs +2 -4
  965. package/dist/domains/networking/nat-traversal/scene.mjs +0 -2
  966. package/dist/domains/networking/network-media/scene.mjs +0 -2
  967. package/dist/domains/networking/orbit-latency/SatelliteScene.mjs +1 -3
  968. package/dist/domains/networking/orchestration-reconciler/scene.mjs +5 -8
  969. package/dist/domains/networking/packet-journey/NetworkScene.d.mts +0 -1
  970. package/dist/domains/networking/packet-journey/NetworkScene.mjs +0 -2
  971. package/dist/domains/networking/prefix-cache-planner/scene.mjs +4 -6
  972. package/dist/domains/networking/release-strategy-planner/scene.mjs +2 -4
  973. package/dist/domains/networking/route-learning/scene.mjs +2 -4
  974. package/dist/domains/networking/secret-rotation-planner/scene.mjs +2 -4
  975. package/dist/domains/networking/server-deployment/scene.mjs +0 -2
  976. package/dist/domains/networking/service-scaling/scene.mjs +2 -5
  977. package/dist/domains/networking/shared-airtime/scene.mjs +2 -4
  978. package/dist/domains/networking/signal-through-walls/SignalThroughWallsScene.mjs +2 -5
  979. package/dist/domains/networking/slo-incident-console/scene.mjs +3 -6
  980. package/dist/domains/networking/spectrum-map/SpectrumMapScene.mjs +0 -1
  981. package/dist/domains/networking/subnet-builder/SubnetScene.mjs +0 -2
  982. package/dist/domains/networking/switch-learning/SwitchScene.mjs +0 -3
  983. package/dist/domains/networking/tcp-handshake/scene.mjs +6 -7
  984. package/dist/domains/networking/tcp-sender/scene.mjs +0 -2
  985. package/dist/domains/networking/tls-connection/scene.mjs +0 -2
  986. package/dist/domains/networking/vlan-designer/VlanScene.mjs +8 -10
  987. package/dist/domains/networking/vpc-route-planner/scene.mjs +4 -7
  988. package/dist/domains/networking/vpn-tunnel/VpnScene.mjs +3 -6
  989. package/dist/domains/networking/wave-size/WaveSizeScene.mjs +10 -10
  990. package/dist/domains/networking/wifi-contention/scene.mjs +0 -2
  991. package/dist/domains/networking/wifi-coverage/scene.mjs +4 -5
  992. package/dist/domains/networking/workload-identity-planner/scene.mjs +2 -4
  993. package/dist/domains/physics/electricity/capacitor-energy/activity.mjs +1 -1
  994. package/dist/domains/physics/electricity/capacitor-energy/layout.mjs +107 -0
  995. package/dist/domains/physics/electricity/capacitor-energy/manifest.mjs +1 -1
  996. package/dist/domains/physics/electricity/capacitor-energy/scene.mjs +286 -323
  997. package/dist/domains/physics/electricity/circuit-energy-flow/scene.mjs +1 -3
  998. package/dist/domains/physics/electricity/circuit-fault-detective/scene.mjs +3 -3
  999. package/dist/domains/physics/electricity/circuit-iv-investigation/scene.mjs +4 -5
  1000. package/dist/domains/physics/electricity/coulomb-superposition/manifest.mjs +1 -1
  1001. package/dist/domains/physics/electricity/coulomb-superposition/model.mjs +2 -2
  1002. package/dist/domains/physics/electricity/coulomb-superposition/scene.mjs +2 -3
  1003. package/dist/domains/physics/electricity/electric-field/scene.mjs +7 -11
  1004. package/dist/domains/physics/electricity/electric-flux/preset.mjs +1 -1
  1005. package/dist/domains/physics/electricity/electric-flux/scene.mjs +7 -4
  1006. package/dist/domains/physics/electricity/friction-charging/scene.mjs +4 -6
  1007. package/dist/domains/physics/electricity/gauss-law/runtime.mjs +0 -1
  1008. package/dist/domains/physics/electricity/gauss-law/scene.mjs +4 -5
  1009. package/dist/domains/physics/electricity/plug-safety-inspector/scene.mjs +6 -8
  1010. package/dist/domains/physics/electricity/rectifier-bench/scene.mjs +290 -281
  1011. package/dist/domains/physics/electricity/regulated-supply/scene.mjs +1 -3
  1012. package/dist/domains/physics/electricity/work-potential/labels.mjs +85 -0
  1013. package/dist/domains/physics/electricity/work-potential/scene.mjs +37 -41
  1014. package/dist/domains/physics/energy/bullet-walls/scene.mjs +6 -5
  1015. package/dist/domains/physics/energy/efficiency/device-art.mjs +7 -9
  1016. package/dist/domains/physics/energy/efficiency/scene.mjs +0 -1
  1017. package/dist/domains/physics/energy/energy-resource-grid/scene.mjs +10 -11
  1018. package/dist/domains/physics/energy/energy-skate/scene.mjs +2 -4
  1019. package/dist/domains/physics/energy/lifting-work/scene.mjs +1 -3
  1020. package/dist/domains/physics/energy/power/activity.mjs +1 -1
  1021. package/dist/domains/physics/energy/power/manifest.mjs +2 -1
  1022. package/dist/domains/physics/energy/power/model.mjs +2 -2
  1023. package/dist/domains/physics/energy/power/scene.mjs +28 -22
  1024. package/dist/domains/physics/energy/work-energy/scene.mjs +11 -13
  1025. package/dist/domains/physics/fields/field-geometry/scene.mjs +2 -4
  1026. package/dist/domains/physics/fields/gravitation/scene.mjs +2 -4
  1027. package/dist/domains/physics/fields/gravity-profile/runtime.mjs +0 -1
  1028. package/dist/domains/physics/fields/gravity-profile/scene.mjs +1 -5
  1029. package/dist/domains/physics/fields/kepler/scene.mjs +2 -4
  1030. package/dist/domains/physics/fields/orbit-lab/model.mjs +46 -28
  1031. package/dist/domains/physics/fields/orbit-lab/scene.mjs +3 -6
  1032. package/dist/domains/physics/forces/atwood/scene.mjs +13 -18
  1033. package/dist/domains/physics/forces/beam-reactions/scene.mjs +13 -14
  1034. package/dist/domains/physics/forces/circular-motion/scene.mjs +7 -8
  1035. package/dist/domains/physics/forces/collision-track/activity.mjs +8 -1
  1036. package/dist/domains/physics/forces/collision-track/manifest.mjs +6 -2
  1037. package/dist/domains/physics/forces/collision-track/model.mjs +1 -8
  1038. package/dist/domains/physics/forces/collision-track/runtime.mjs +1 -1
  1039. package/dist/domains/physics/forces/collision-track/scene.mjs +13 -10
  1040. package/dist/domains/physics/forces/contact-pressure/footprint-scene.mjs +12 -10
  1041. package/dist/domains/physics/forces/couple-torque/scene.mjs +10 -10
  1042. package/dist/domains/physics/forces/force-pairs/scene.mjs +8 -11
  1043. package/dist/domains/physics/forces/impulse/activity.mjs +3 -3
  1044. package/dist/domains/physics/forces/impulse/manifest.mjs +1 -1
  1045. package/dist/domains/physics/forces/impulse/model.mjs +2 -2
  1046. package/dist/domains/physics/forces/impulse/runtime.mjs +3 -3
  1047. package/dist/domains/physics/forces/impulse/scene.mjs +16 -20
  1048. package/dist/domains/physics/forces/lever/runtime.mjs +0 -1
  1049. package/dist/domains/physics/forces/lever/scene.mjs +6 -9
  1050. package/dist/domains/physics/forces/lift-weight/scene.mjs +9 -8
  1051. package/dist/domains/physics/forces/newton-first-law/model.mjs +1 -0
  1052. package/dist/domains/physics/forces/newton-first-law/scene.mjs +15 -13
  1053. package/dist/domains/physics/forces/ramp-forces/evidence.mjs +1 -3
  1054. package/dist/domains/physics/forces/ramp-forces/scene.mjs +35 -26
  1055. package/dist/domains/physics/forces/rocket-flight/scene.mjs +3 -5
  1056. package/dist/domains/physics/forces/spin-studio/activity.mjs +2 -34
  1057. package/dist/domains/physics/forces/spin-studio/manifest.mjs +3 -3
  1058. package/dist/domains/physics/forces/spin-studio/model.mjs +0 -1
  1059. package/dist/domains/physics/forces/spin-studio/scene.mjs +112 -82
  1060. package/dist/domains/physics/forces/spring-combinations/scene.mjs +7 -11
  1061. package/dist/domains/physics/forces/stability/scene.mjs +10 -16
  1062. package/dist/domains/physics/forces/terminal-velocity/scene.mjs +3 -5
  1063. package/dist/domains/physics/magnetism/ac-generator/model.mjs +2 -3
  1064. package/dist/domains/physics/magnetism/ac-generator/scene.mjs +167 -58
  1065. package/dist/domains/physics/magnetism/alternating-current/scene.mjs +290 -360
  1066. package/dist/domains/physics/magnetism/coil-torque/scene.mjs +7 -5
  1067. package/dist/domains/physics/magnetism/dc-motor/manifest.mjs +1 -1
  1068. package/dist/domains/physics/magnetism/dc-motor/runtime.mjs +2 -2
  1069. package/dist/domains/physics/magnetism/dc-motor/scene.mjs +362 -262
  1070. package/dist/domains/physics/magnetism/earth-field/scene.mjs +216 -177
  1071. package/dist/domains/physics/magnetism/generator-grid-mission/scene.mjs +18 -21
  1072. package/dist/domains/physics/magnetism/induction-bench/scene.mjs +8 -13
  1073. package/dist/domains/physics/magnetism/inductor-energy/scene.mjs +9 -11
  1074. package/dist/domains/physics/magnetism/lorentz/scene.mjs +2 -4
  1075. package/dist/domains/physics/magnetism/magnet-pair/lesson-examples.mjs +4 -4
  1076. package/dist/domains/physics/magnetism/magnet-pair/manifest.mjs +1 -1
  1077. package/dist/domains/physics/magnetism/magnet-pair/model.mjs +3 -3
  1078. package/dist/domains/physics/magnetism/magnet-pair/runtime.mjs +5 -5
  1079. package/dist/domains/physics/magnetism/magnet-pair/scene.mjs +103 -313
  1080. package/dist/domains/physics/magnetism/magnetic-field/activity.mjs +44 -36
  1081. package/dist/domains/physics/magnetism/magnetic-field/manifest.mjs +1 -1
  1082. package/dist/domains/physics/magnetism/magnetic-field/model.mjs +6 -6
  1083. package/dist/domains/physics/magnetism/magnetic-field/runtime.mjs +2 -1
  1084. package/dist/domains/physics/magnetism/magnetic-field/scene.mjs +33 -39
  1085. package/dist/domains/physics/magnetism/magnetism/model.mjs +15 -8
  1086. package/dist/domains/physics/magnetism/magnetism/runtime.mjs +0 -1
  1087. package/dist/domains/physics/magnetism/magnetism/scene.mjs +3 -5
  1088. package/dist/domains/physics/magnetism/magnetism-diagram/schema.mjs +1 -2
  1089. package/dist/domains/physics/magnetism/mutual-induction/scene.mjs +7 -9
  1090. package/dist/domains/physics/magnetism/relay-bench/scene.mjs +11 -16
  1091. package/dist/domains/physics/magnetism/rl-step-response/model.mjs +3 -2
  1092. package/dist/domains/physics/magnetism/rl-step-response/scene.mjs +1 -3
  1093. package/dist/domains/physics/magnetism/soft-iron-steel/scene.mjs +74 -124
  1094. package/dist/domains/physics/magnetism/solenoid-bench/activity.mjs +1 -1
  1095. package/dist/domains/physics/magnetism/solenoid-bench/manifest.mjs +3 -8
  1096. package/dist/domains/physics/magnetism/solenoid-bench/model.mjs +3 -3
  1097. package/dist/domains/physics/magnetism/solenoid-bench/runtime.mjs +2 -1
  1098. package/dist/domains/physics/magnetism/solenoid-bench/scene.mjs +239 -162
  1099. package/dist/domains/physics/magnetism/spatial-lorentz/scene.mjs +3 -4
  1100. package/dist/domains/physics/magnetism/transformer-bench/scene.mjs +171 -62
  1101. package/dist/domains/physics/magnetism/wire-force-angle/scene.mjs +2 -3
  1102. package/dist/domains/physics/matter/buoyancy/scene.mjs +2 -3
  1103. package/dist/domains/physics/matter/carnot/cycle-scene.mjs +272 -218
  1104. package/dist/domains/physics/matter/cooling-insulation-investigation/scene.mjs +13 -15
  1105. package/dist/domains/physics/matter/density-displacement/scene.mjs +10 -10
  1106. package/dist/domains/physics/matter/entropy/entropy-scene.mjs +277 -231
  1107. package/dist/domains/physics/matter/evaporation/activity.mjs +12 -5
  1108. package/dist/domains/physics/matter/evaporation/dish-scene.mjs +189 -162
  1109. package/dist/domains/physics/matter/evaporation/manifest.mjs +4 -2
  1110. package/dist/domains/physics/matter/evaporation/model.mjs +23 -38
  1111. package/dist/domains/physics/matter/evaporation/runtime.mjs +1 -0
  1112. package/dist/domains/physics/matter/fluid-pressure/scene.mjs +1 -2
  1113. package/dist/domains/physics/matter/gas-process/manifest.mjs +3 -2
  1114. package/dist/domains/physics/matter/gas-process/model.mjs +9 -4
  1115. package/dist/domains/physics/matter/gas-process/scene.mjs +201 -153
  1116. package/dist/domains/physics/matter/gas-theory/theory-scenes.mjs +11 -14
  1117. package/dist/domains/physics/matter/heat-transfer/conduction-scene.mjs +19 -15
  1118. package/dist/domains/physics/matter/heat-transfer/convection-scene.mjs +9 -10
  1119. package/dist/domains/physics/matter/heat-transfer/radiation-scene.mjs +54 -66
  1120. package/dist/domains/physics/matter/heat-transfer/scene.mjs +1 -2
  1121. package/dist/domains/physics/matter/heat-transfer-cases/scene.mjs +24 -26
  1122. package/dist/domains/physics/matter/heating-curve/heating-scene.mjs +9 -11
  1123. package/dist/domains/physics/matter/heating-curve/model.mjs +5 -13
  1124. package/dist/domains/physics/matter/specific-heat/scene.mjs +11 -11
  1125. package/dist/domains/physics/matter/stress-strain/wire-scene.mjs +13 -13
  1126. package/dist/domains/physics/matter/temperature-scales/scene.mjs +6 -8
  1127. package/dist/domains/physics/matter/thermal-equilibrium/scene.mjs +13 -14
  1128. package/dist/domains/physics/matter/thermal-expansion/expansion-scenes.mjs +24 -26
  1129. package/dist/domains/physics/matter/thermal-expansion/scene.mjs +1 -2
  1130. package/dist/domains/physics/matter/venturi/activity.mjs +1 -1
  1131. package/dist/domains/physics/matter/venturi/manifest.mjs +8 -7
  1132. package/dist/domains/physics/matter/venturi/model.mjs +1 -1
  1133. package/dist/domains/physics/matter/venturi/runtime.mjs +1 -0
  1134. package/dist/domains/physics/matter/venturi/scene.mjs +2 -3
  1135. package/dist/domains/physics/matter/water-density/scene.mjs +2 -4
  1136. package/dist/domains/physics/measurement/data-table-clinic/scene.mjs +0 -1
  1137. package/dist/domains/physics/measurement/evaluation-clinic/scene.mjs +5 -8
  1138. package/dist/domains/physics/measurement/graph-craft/scene.mjs +2 -4
  1139. package/dist/domains/physics/measurement/homogeneity-check/scene.mjs +1 -2
  1140. package/dist/domains/physics/measurement/paper5-analysis-lab/scene.mjs +4 -6
  1141. package/dist/domains/physics/measurement/physics-practical-studio/scene.mjs +10 -10
  1142. package/dist/domains/physics/measurement/precision-measurement-lab/scene.mjs +7 -5
  1143. package/dist/domains/physics/measurement/prefix-ladder/scene.mjs +0 -1
  1144. package/dist/domains/physics/measurement/reading-spread/scene.mjs +20 -7
  1145. package/dist/domains/physics/measurement/scale-reading/scene.mjs +11 -13
  1146. package/dist/domains/physics/measurement/uncertainty-budget/scene.mjs +0 -1
  1147. package/dist/domains/physics/measurement/unit-machine/scene.mjs +1 -2
  1148. package/dist/domains/physics/modern/acoustic-boundary/acoustic-boundary.mjs +2 -3
  1149. package/dist/domains/physics/modern/bloch-sphere/runtime.mjs +1 -2
  1150. package/dist/domains/physics/modern/double-slit/double-slit-scene.mjs +1 -3
  1151. package/dist/domains/physics/modern/fission-chain/fission-scene.mjs +1 -3
  1152. package/dist/domains/physics/modern/hydrogen-spectrum/scene.mjs +2 -4
  1153. package/dist/domains/physics/modern/length-contraction/scene.mjs +3 -6
  1154. package/dist/domains/physics/modern/lorentz-transformation/scene.mjs +7 -6
  1155. package/dist/domains/physics/modern/muon-survival/scene.mjs +23 -15
  1156. package/dist/domains/physics/modern/nuclear-binding-energy/scene.mjs +8 -10
  1157. package/dist/domains/physics/modern/pet-scan/pet-scene.mjs +5 -8
  1158. package/dist/domains/physics/modern/photoelectric-effect/scene.mjs +16 -18
  1159. package/dist/domains/physics/modern/quantum-gates/scene.mjs +1 -2
  1160. package/dist/domains/physics/modern/radiation-half-life-investigation/runtime.mjs +7 -18
  1161. package/dist/domains/physics/modern/radiation-half-life-investigation/scene.mjs +67 -57
  1162. package/dist/domains/physics/modern/radioactive-decay/scene.mjs +3 -5
  1163. package/dist/domains/physics/modern/relativity-light-clock/light-clock.mjs +3 -5
  1164. package/dist/domains/physics/modern/relativity-light-clock/spacetime.mjs +0 -1
  1165. package/dist/domains/physics/modern/relativity-simultaneity/simultaneity-scene.mjs +3 -5
  1166. package/dist/domains/physics/modern/tomography/scene.mjs +0 -1
  1167. package/dist/domains/physics/modern/ultrasound-frequency/scene.mjs +1 -3
  1168. package/dist/domains/physics/modern/uncertainty-wave-packet/scene.mjs +2 -3
  1169. package/dist/domains/physics/modern/xray-attenuation/xray-scene.mjs +8 -6
  1170. package/dist/domains/physics/modern/xray-tube-spectrum/spectrum-scene.mjs +17 -9
  1171. package/dist/domains/physics/motion/falling-target/target-scene.mjs +8 -6
  1172. package/dist/domains/physics/motion/gravity-drop/scene.mjs +4 -6
  1173. package/dist/domains/physics/motion/intercept/animals.mjs +0 -1
  1174. package/dist/domains/physics/motion/intercept/scene.mjs +9 -9
  1175. package/dist/domains/physics/motion/linear-pursuit/pursuit-scene.mjs +4 -6
  1176. package/dist/domains/physics/motion/moving-launcher/runtime.mjs +0 -1
  1177. package/dist/domains/physics/motion/moving-launcher/scene.mjs +4 -10
  1178. package/dist/domains/physics/motion/projectile-lab/model.mjs +4 -4
  1179. package/dist/domains/physics/motion/projectile-lab/scene.mjs +14 -18
  1180. package/dist/domains/physics/motion/rain-relative/model.mjs +5 -11
  1181. package/dist/domains/physics/motion/rain-relative/scene.mjs +9 -8
  1182. package/dist/domains/physics/motion/river-boat/model.mjs +6 -12
  1183. package/dist/domains/physics/motion/river-boat/scene.mjs +9 -10
  1184. package/dist/domains/physics/motion/stopping-distance/stopping-scene.mjs +5 -7
  1185. package/dist/domains/physics/motion/trolley-acceleration-investigation/scene.mjs +14 -13
  1186. package/dist/domains/physics/motion/trolley-acceleration-investigation/trolley.d.mts +0 -1
  1187. package/dist/domains/physics/motion/trolley-acceleration-investigation/trolley.mjs +26 -17
  1188. package/dist/domains/physics/motion/vector-board/model.mjs +14 -14
  1189. package/dist/domains/physics/motion/vector-board/preset.d.mts +1 -1
  1190. package/dist/domains/physics/motion/vector-board/preset.mjs +8 -5
  1191. package/dist/domains/physics/motion/vector-board/scene.mjs +157 -27
  1192. package/dist/domains/physics/motion/vector-types/scene.mjs +2 -3
  1193. package/dist/domains/physics/motion/vector-types/trip-scene.mjs +2 -4
  1194. package/dist/domains/physics/motion/velocity-gradient/scene.mjs +1 -2
  1195. package/dist/domains/physics/space/cosmic-expansion/scene.mjs +2 -3
  1196. package/dist/domains/physics/space/stellar-distance/scene.mjs +2 -4
  1197. package/dist/domains/physics/space/stellar-evolution/scene.mjs +2 -4
  1198. package/dist/domains/physics/space/stellar-radiation/scene.mjs +2 -3
  1199. package/dist/domains/physics/waves/bench/bench-scene.mjs +35 -13
  1200. package/dist/domains/physics/waves/bench/wave-experience-scene.mjs +4 -6
  1201. package/dist/domains/physics/waves/car-suspension/scene.mjs +3 -5
  1202. package/dist/domains/physics/waves/diffraction-grating/scene.mjs +8 -7
  1203. package/dist/domains/physics/waves/doppler/doppler-scene.mjs +3 -5
  1204. package/dist/domains/physics/waves/echo-ranging/scene.mjs +5 -6
  1205. package/dist/domains/physics/waves/fibre-pulse/scene.mjs +1 -1
  1206. package/dist/domains/physics/waves/gap-diffraction/gap-scene.mjs +20 -13
  1207. package/dist/domains/physics/waves/glass-block-refraction/scene.mjs +3 -3
  1208. package/dist/domains/physics/waves/guitar-string/scene.mjs +1 -2
  1209. package/dist/domains/physics/waves/harmonic-modes/scene.mjs +3 -5
  1210. package/dist/domains/physics/waves/lens-focal-investigation/activity.mjs +127 -118
  1211. package/dist/domains/physics/waves/lens-focal-investigation/manifest.mjs +9 -2
  1212. package/dist/domains/physics/waves/lens-focal-investigation/model.mjs +4 -1
  1213. package/dist/domains/physics/waves/lens-focal-investigation/runtime.mjs +1 -0
  1214. package/dist/domains/physics/waves/lens-focal-investigation/scene.mjs +25 -47
  1215. package/dist/domains/physics/waves/lens-geometry/scene.mjs +31 -33
  1216. package/dist/domains/physics/waves/lens-imaging/runtime.mjs +0 -1
  1217. package/dist/domains/physics/waves/lens-imaging/scene.mjs +0 -1
  1218. package/dist/domains/physics/waves/lens-mission/scene.mjs +3 -5
  1219. package/dist/domains/physics/waves/mirror-imaging/runtime.mjs +0 -1
  1220. package/dist/domains/physics/waves/mirror-imaging/scene.mjs +0 -1
  1221. package/dist/domains/physics/waves/optics/apparatus.mjs +8 -4
  1222. package/dist/domains/physics/waves/optics/runtime.mjs +0 -1
  1223. package/dist/domains/physics/waves/optics/scene.mjs +3 -4
  1224. package/dist/domains/physics/waves/optics-mission/scene.mjs +2 -4
  1225. package/dist/domains/physics/waves/pendulum-worlds/scene.mjs +118 -72
  1226. package/dist/domains/physics/waves/plane-mirror/scene.mjs +1 -2
  1227. package/dist/domains/physics/waves/polarisation/polariser-scene.mjs +20 -14
  1228. package/dist/domains/physics/waves/prism-dispersion/scene.mjs +0 -1
  1229. package/dist/domains/physics/waves/progressive-stationary/scene.mjs +2 -4
  1230. package/dist/domains/physics/waves/pulse-echo/scene.mjs +1 -2
  1231. package/dist/domains/physics/waves/refraction/scene.mjs +15 -12
  1232. package/dist/domains/physics/waves/ripple-tank/scene.mjs +1 -2
  1233. package/dist/domains/physics/waves/shm/model.mjs +43 -8
  1234. package/dist/domains/physics/waves/shm/scene.mjs +3 -5
  1235. package/dist/domains/physics/waves/shm-energy/scene.mjs +1 -2
  1236. package/dist/domains/physics/waves/shm-graphs/scene.mjs +1 -2
  1237. package/dist/domains/physics/waves/sound-air/scene.mjs +2 -3
  1238. package/dist/domains/physics/waves/sound-medium/scene.mjs +1 -2
  1239. package/dist/domains/physics/waves/sound-mission/scene.mjs +1 -2
  1240. package/dist/domains/physics/waves/spectral-resolver/scene.mjs +0 -1
  1241. package/dist/domains/physics/waves/spectrum-mission/scene.mjs +0 -1
  1242. package/dist/domains/physics/waves/string-reflection/scene.mjs +2 -4
  1243. package/dist/domains/physics/waves/timbre/scene.mjs +0 -1
  1244. package/dist/domains/physics/waves/two-source/two-source-scene.mjs +3 -5
  1245. package/dist/domains/physics/waves/water-wave-refraction/scene.mjs +2 -3
  1246. package/dist/domains/physics/waves/young-double-slit/model.mjs +4 -1
  1247. package/dist/domains/physics/waves/young-double-slit/young-scene.mjs +8 -9
  1248. package/dist/domains/render-map.mjs +39 -1
  1249. package/dist/domains/render.d.mts +1 -9
  1250. package/dist/domains/render.mjs +11 -15
  1251. package/dist/domains/revision/chapter-summary/manifest.mjs +1 -2
  1252. package/dist/domains/revision/concept-sprint/model.mjs +2 -2
  1253. package/dist/domains/revision/step-order-puzzle/model.mjs +1 -1
  1254. package/dist/domains/statistics/bar-chart-builder/model.mjs +1 -1
  1255. package/dist/domains/statistics/bar-chart-builder/scene.mjs +0 -1
  1256. package/dist/domains/statistics/center-spread/activity.mjs +5 -3
  1257. package/dist/domains/statistics/center-spread/balance-scene.mjs +75 -23
  1258. package/dist/domains/statistics/center-spread/model.mjs +2 -1
  1259. package/dist/domains/statistics/center-spread/scene.mjs +8 -7
  1260. package/dist/domains/statistics/cumulative-frequency-builder/scene.mjs +0 -1
  1261. package/dist/domains/statistics/frequency-density/activity.mjs +1 -1
  1262. package/dist/domains/statistics/frequency-density/density-scene.mjs +127 -122
  1263. package/dist/domains/statistics/frequency-density/manifest.mjs +2 -2
  1264. package/dist/domains/statistics/frequency-density/runtime.mjs +5 -4
  1265. package/dist/domains/statistics/galton/model.mjs +137 -108
  1266. package/dist/domains/statistics/galton/runtime.mjs +14 -35
  1267. package/dist/domains/statistics/galton/scene.mjs +85 -153
  1268. package/dist/domains/statistics/histogram/manifest.mjs +19 -0
  1269. package/dist/domains/statistics/histogram/model.mjs +9 -3
  1270. package/dist/domains/statistics/histogram/runtime.mjs +1 -1
  1271. package/dist/domains/statistics/histogram/scene.mjs +21 -11
  1272. package/dist/domains/statistics/histogram-builder/scene.mjs +0 -1
  1273. package/dist/domains/statistics/histogram-interval/scene.mjs +0 -1
  1274. package/dist/domains/statistics/normal/normal-scene.mjs +0 -1
  1275. package/dist/domains/statistics/normal/runtime.mjs +1 -1
  1276. package/dist/domains/statistics/normal/scene.mjs +1 -2
  1277. package/dist/domains/statistics/ogive/ogive-scene.mjs +63 -36
  1278. package/dist/domains/statistics/ogive/scene.mjs +1 -2
  1279. package/dist/domains/statistics/pictogram-builder/model.mjs +5 -4
  1280. package/dist/domains/statistics/pictogram-builder/scene.mjs +0 -1
  1281. package/dist/domains/statistics/pie-chart-builder/model.mjs +5 -4
  1282. package/dist/domains/statistics/pie-chart-builder/scene.mjs +0 -1
  1283. package/dist/domains/statistics/sampling/model.mjs +2 -2
  1284. package/dist/domains/statistics/sampling/runtime.mjs +4 -4
  1285. package/dist/domains/statistics/sampling/sampling-scene.mjs +0 -1
  1286. package/dist/domains/statistics/sampling/scene.mjs +1 -2
  1287. package/dist/domains/statistics/scatter-builder/scene.mjs +0 -1
  1288. package/dist/domains/statistics/series/model.mjs +6 -4
  1289. package/dist/domains/statistics/series/runtime.mjs +4 -4
  1290. package/dist/domains/statistics/series/series-scene.mjs +50 -17
  1291. package/dist/domains/statistics/series-chart-builder/model.mjs +5 -4
  1292. package/dist/domains/statistics/series-chart-builder/scene.mjs +0 -1
  1293. package/dist/domains/statistics/two-way-table-builder/model.mjs +4 -3
  1294. package/dist/domains/statistics/two-way-table-builder/scene.mjs +0 -1
  1295. package/dist/domains/statistics/z-table/scene.mjs +0 -1
  1296. package/dist/exam/answer-spec.mjs +15 -2
  1297. package/dist/exam/exam-question/core.d.mts +1 -1
  1298. package/dist/exam/exam-question/core.mjs +9 -2
  1299. package/dist/geometry/board/construction.d.mts +11 -3
  1300. package/dist/geometry/board/construction.mjs +13 -0
  1301. package/dist/geometry/board/index.d.mts +1 -1
  1302. package/dist/geometry/board/schema.mjs +106 -0
  1303. package/dist/geometry/index.d.mts +1 -1
  1304. package/dist/ict/number-systems/wheel.mjs +2 -2
  1305. package/dist/illustrations/story-scene/accounting/cash-credit-flow.mjs +1 -1
  1306. package/dist/illustrations/story-scene/accounting/delivery-van.mjs +1 -1
  1307. package/dist/illustrations/story-scene/accounting/shop-counter-till.mjs +1 -1
  1308. package/dist/illustrations/story-scene/accounting/stocktake-shelves.mjs +4 -3
  1309. package/dist/illustrations/story-scene/accounting/supplier-delivery.mjs +1 -1
  1310. package/dist/illustrations/story-scene/accounting/tea-stall.mjs +1 -1
  1311. package/dist/illustrations/story-scene/accounting/van.mjs +3 -3
  1312. package/dist/illustrations/story-scene/accounting/workshop-machine.mjs +4 -3
  1313. package/dist/illustrations/story-scene/chemistry/acid-rain.mjs +6 -5
  1314. package/dist/illustrations/story-scene/chemistry/balls-in-box.mjs +1 -1
  1315. package/dist/illustrations/story-scene/chemistry/blast-furnace.mjs +4 -3
  1316. package/dist/illustrations/story-scene/chemistry/bread-dough.mjs +4 -3
  1317. package/dist/illustrations/story-scene/chemistry/brick-rebuild.mjs +6 -5
  1318. package/dist/illustrations/story-scene/chemistry/bromine-water-test.mjs +4 -3
  1319. package/dist/illustrations/story-scene/chemistry/charge-see-saw.mjs +4 -3
  1320. package/dist/illustrations/story-scene/chemistry/cold-pack.mjs +4 -3
  1321. package/dist/illustrations/story-scene/chemistry/corridor-pace.mjs +1 -1
  1322. package/dist/illustrations/story-scene/chemistry/crowd-states.mjs +1 -1
  1323. package/dist/illustrations/story-scene/chemistry/distillation-rig.mjs +1 -1
  1324. package/dist/illustrations/story-scene/chemistry/dozen-weigh.mjs +4 -3
  1325. package/dist/illustrations/story-scene/chemistry/ethene-bag.mjs +4 -3
  1326. package/dist/illustrations/story-scene/chemistry/fertiliser-field.mjs +4 -4
  1327. package/dist/illustrations/story-scene/chemistry/fractionating-tower.mjs +4 -3
  1328. package/dist/illustrations/story-scene/chemistry/fruity-ester.mjs +8 -7
  1329. package/dist/illustrations/story-scene/chemistry/hand-sanitiser.mjs +6 -5
  1330. package/dist/illustrations/story-scene/chemistry/hand-warmer.mjs +4 -3
  1331. package/dist/illustrations/story-scene/chemistry/ionic-tug-of-war.mjs +6 -5
  1332. package/dist/illustrations/story-scene/chemistry/lime-kiln.mjs +1 -1
  1333. package/dist/illustrations/story-scene/chemistry/lunch-box.mjs +4 -3
  1334. package/dist/illustrations/story-scene/chemistry/magnesium-ribbon.mjs +4 -3
  1335. package/dist/illustrations/story-scene/chemistry/nylon-rope.mjs +8 -7
  1336. package/dist/illustrations/story-scene/chemistry/pancake-stack.mjs +4 -3
  1337. package/dist/illustrations/story-scene/chemistry/petrol-station.mjs +6 -5
  1338. package/dist/illustrations/story-scene/chemistry/photosynthesis-leaf.mjs +1 -1
  1339. package/dist/illustrations/story-scene/chemistry/plastic-recycling.mjs +4 -3
  1340. package/dist/illustrations/story-scene/chemistry/recipe-card.mjs +4 -3
  1341. package/dist/illustrations/story-scene/chemistry/rusty-bike.mjs +4 -3
  1342. package/dist/illustrations/story-scene/chemistry/sandwich-stall.mjs +4 -3
  1343. package/dist/illustrations/story-scene/chemistry/scrap-box.mjs +4 -3
  1344. package/dist/illustrations/story-scene/chemistry/squash-jug.mjs +6 -5
  1345. package/dist/illustrations/story-scene/chemistry/sugar-cube.mjs +4 -3
  1346. package/dist/illustrations/story-scene/chemistry/vinegar-kitchen.mjs +6 -5
  1347. package/dist/illustrations/story-scene/chemistry/water-treatment.mjs +10 -9
  1348. package/dist/illustrations/story-scene/everyday/bicycle-wheel.mjs +4 -3
  1349. package/dist/illustrations/story-scene/everyday/cake-slices.mjs +3 -3
  1350. package/dist/illustrations/story-scene/everyday/car-road.mjs +3 -3
  1351. package/dist/illustrations/story-scene/everyday/phone-battery.mjs +3 -3
  1352. package/dist/illustrations/story-scene/everyday/train-speedometer.mjs +1 -1
  1353. package/dist/illustrations/story-scene/math/bag-of-counters.mjs +3 -3
  1354. package/dist/illustrations/story-scene/math/bank-savings.mjs +3 -3
  1355. package/dist/illustrations/story-scene/math/building-shadow.mjs +1 -1
  1356. package/dist/illustrations/story-scene/math/bus-timetable.mjs +4 -3
  1357. package/dist/illustrations/story-scene/math/cylinder-tank.mjs +4 -3
  1358. package/dist/illustrations/story-scene/math/elevation.mjs +1 -1
  1359. package/dist/illustrations/story-scene/math/flag-pole.mjs +1 -1
  1360. package/dist/illustrations/story-scene/math/football-goal.mjs +1 -1
  1361. package/dist/illustrations/story-scene/math/kite-string.mjs +1 -1
  1362. package/dist/illustrations/story-scene/math/ladder-wall.mjs +1 -1
  1363. package/dist/illustrations/story-scene/math/map-scale.mjs +3 -3
  1364. package/dist/illustrations/story-scene/math/phone-tower.mjs +1 -1
  1365. package/dist/illustrations/story-scene/math/photo-line-up.mjs +1 -1
  1366. package/dist/illustrations/story-scene/math/population-town.mjs +1 -1
  1367. package/dist/illustrations/story-scene/math/pyramid-tent.mjs +4 -3
  1368. package/dist/illustrations/story-scene/math/ramp.mjs +4 -3
  1369. package/dist/illustrations/story-scene/math/shop-price-tag.mjs +3 -3
  1370. package/dist/illustrations/story-scene/math/tank-tap.mjs +4 -3
  1371. package/dist/illustrations/story-scene/math/team-pick.mjs +1 -1
  1372. package/dist/illustrations/story-scene/parts.mjs +9 -8
  1373. package/dist/illustrations/story-scene/physics/cliff-throw.mjs +1 -1
  1374. package/dist/illustrations/story-scene/physics/curved-slide.mjs +4 -3
  1375. package/dist/illustrations/story-scene/physics/electric-kettle.mjs +3 -3
  1376. package/dist/illustrations/story-scene/physics/hot-drink.mjs +3 -3
  1377. package/dist/illustrations/story-scene/physics/lift-shaft.mjs +1 -1
  1378. package/dist/illustrations/story-scene/physics/sealed-syringe.mjs +3 -3
  1379. package/dist/illustrations/story-scene/physics/see-saw.mjs +4 -3
  1380. package/dist/illustrations/story-scene/physics/trolley-pull.mjs +4 -3
  1381. package/dist/illustrations/story-scene/story-scene.mjs +33 -19
  1382. package/dist/index.d.mts +2 -5
  1383. package/dist/index.mjs +1 -4
  1384. package/dist/kit/active-recall.mjs +1 -1
  1385. package/dist/kit/activity-authoring.d.mts +27 -1
  1386. package/dist/kit/activity.mjs +1 -1
  1387. package/dist/kit/algorithms/graph.d.mts +10 -3
  1388. package/dist/kit/algorithms/graph.mjs +14 -14
  1389. package/dist/kit/algorithms/index.mjs +3 -3
  1390. package/dist/kit/anim.d.mts +82 -28
  1391. package/dist/kit/anim.mjs +378 -63
  1392. package/dist/kit/annotate.mjs +22 -9
  1393. package/dist/kit/assets.mjs +1 -1
  1394. package/dist/kit/authored-activity-runtime.d.mts +9 -0
  1395. package/dist/kit/authored-activity-runtime.mjs +4 -4
  1396. package/dist/kit/authored-response.mjs +5 -1
  1397. package/dist/kit/bar-strip.mjs +8 -8
  1398. package/dist/kit/biology/cell/membrane.mjs +3 -17
  1399. package/dist/kit/biology/genetics/chromosome-diagram.mjs +0 -1
  1400. package/dist/kit/biology/index.d.mts +1 -1
  1401. package/dist/kit/biology/index.mjs +1 -1
  1402. package/dist/kit/canvas-layer.d.mts +2 -1
  1403. package/dist/kit/canvas-layer.mjs +3 -1
  1404. package/dist/kit/checkpoint.mjs +1 -1
  1405. package/dist/kit/chemistry/bench.d.mts +6 -2
  1406. package/dist/kit/chemistry/bench.mjs +63 -65
  1407. package/dist/kit/chemistry/calorimeter.d.mts +0 -1
  1408. package/dist/kit/chemistry/calorimeter.mjs +4 -4
  1409. package/dist/kit/chemistry/carbon-sphere.mjs +0 -1
  1410. package/dist/kit/chemistry/electrode.mjs +0 -1
  1411. package/dist/kit/chemistry/equation-ledger.mjs +1 -2
  1412. package/dist/kit/chemistry/flame.mjs +0 -1
  1413. package/dist/kit/chemistry/formula.mjs +0 -1
  1414. package/dist/kit/chemistry/gas-collection.mjs +2 -3
  1415. package/dist/kit/chemistry/glass-label.d.mts +17 -0
  1416. package/dist/kit/chemistry/glass-label.mjs +47 -0
  1417. package/dist/kit/chemistry/glassware.mjs +35 -33
  1418. package/dist/kit/chemistry/index.d.mts +2 -1
  1419. package/dist/kit/chemistry/index.mjs +2 -1
  1420. package/dist/kit/chemistry/ion-assembly.mjs +1 -2
  1421. package/dist/kit/chemistry/mechanism.mjs +7 -7
  1422. package/dist/kit/chemistry/molecule.mjs +2 -1
  1423. package/dist/kit/chemistry/nmr-figure.mjs +0 -1
  1424. package/dist/kit/chemistry/observation.d.mts +9 -15
  1425. package/dist/kit/chemistry/observation.mjs +12 -16
  1426. package/dist/kit/chemistry/particles.d.mts +8 -3
  1427. package/dist/kit/chemistry/particles.mjs +11 -12
  1428. package/dist/kit/chemistry/process.mjs +11 -18
  1429. package/dist/kit/chemistry/quantity-route-figure.mjs +29 -39
  1430. package/dist/kit/chemistry/quantity-route-objects.mjs +7 -8
  1431. package/dist/kit/chemistry/reaction.mjs +0 -1
  1432. package/dist/kit/chemistry/spectrum.mjs +0 -1
  1433. package/dist/kit/chemistry/structure-figure.mjs +2 -1
  1434. package/dist/kit/chemistry/volumetric-flask.mjs +6 -5
  1435. package/dist/kit/clue-scene.d.mts +5 -0
  1436. package/dist/kit/clue-scene.mjs +63 -31
  1437. package/dist/kit/cluster.mjs +0 -1
  1438. package/dist/kit/commerce/books.d.mts +3 -1
  1439. package/dist/kit/commerce/books.mjs +4 -4
  1440. package/dist/kit/commerce/buildings.mjs +4 -10
  1441. package/dist/kit/commerce/glyphs.mjs +4 -5
  1442. package/dist/kit/commerce/ledger.mjs +12 -21
  1443. package/dist/kit/controls.d.mts +28 -5
  1444. package/dist/kit/controls.mjs +104 -26
  1445. package/dist/kit/coords.d.mts +27 -1
  1446. package/dist/kit/coords.mjs +76 -27
  1447. package/dist/kit/counting/cards.mjs +1 -3
  1448. package/dist/kit/counting/counter.mjs +8 -8
  1449. package/dist/kit/counting/running-chart.mjs +0 -2
  1450. package/dist/kit/counting/tiles.mjs +1 -3
  1451. package/dist/kit/cycle.mjs +34 -14
  1452. package/dist/kit/data/categorical-bar-board.d.mts +0 -1
  1453. package/dist/kit/data/categorical-bar-core.mjs +25 -12
  1454. package/dist/kit/data/histogram-construction-board.d.mts +0 -1
  1455. package/dist/kit/data/histogram-construction-board.mjs +8 -3
  1456. package/dist/kit/data/histogram-interval-board.d.mts +0 -1
  1457. package/dist/kit/data/histogram-interval-board.mjs +8 -3
  1458. package/dist/kit/data/histogram-plot.mjs +8 -3
  1459. package/dist/kit/data/index.mjs +1 -1
  1460. package/dist/kit/data/pictogram-board.d.mts +0 -1
  1461. package/dist/kit/data/pictogram-board.mjs +23 -6
  1462. package/dist/kit/data/pie-chart-board.d.mts +2 -6
  1463. package/dist/kit/data/pie-chart-board.mjs +7 -30
  1464. package/dist/kit/data/scatter-point-board.d.mts +0 -1
  1465. package/dist/kit/data/scatter-point-board.mjs +8 -3
  1466. package/dist/kit/data/series-chart-board.d.mts +0 -1
  1467. package/dist/kit/data/two-way-table-board.d.mts +0 -1
  1468. package/dist/kit/data/two-way-table-board.mjs +21 -5
  1469. package/dist/kit/data-scene.mjs +0 -1
  1470. package/dist/kit/diagram/annotations.mjs +50 -3
  1471. package/dist/kit/diagram/label-placement.mjs +47 -2
  1472. package/dist/kit/discrete/tile.mjs +1 -3
  1473. package/dist/{domains/economics/_shared → kit/economics}/market-plot.mjs +18 -14
  1474. package/dist/kit/electronics/_shared.mjs +8 -29
  1475. package/dist/kit/electronics/bench-instruments.mjs +32 -16
  1476. package/dist/kit/electronics/bench-set.mjs +115 -167
  1477. package/dist/kit/electronics/bench.mjs +12 -10
  1478. package/dist/kit/electronics/carriers.mjs +88 -0
  1479. package/dist/kit/electronics/components.mjs +2 -4
  1480. package/dist/kit/electronics/icons.mjs +3 -2
  1481. package/dist/kit/electronics/index.mjs +5 -4
  1482. package/dist/kit/electronics/logic-bench.mjs +8 -7
  1483. package/dist/kit/electronics/rectifier.mjs +34 -25
  1484. package/dist/kit/electronics/signals.mjs +38 -31
  1485. package/dist/kit/embed.mjs +1 -1
  1486. package/dist/kit/ensure-asset.mjs +9 -10
  1487. package/dist/kit/figure/action.mjs +5 -1
  1488. package/dist/kit/figure/container.d.mts +2 -1
  1489. package/dist/kit/figure/container.mjs +72 -36
  1490. package/dist/kit/figure/database.mjs +2 -3
  1491. package/dist/kit/figure/detent-path-grip.d.mts +6 -2
  1492. package/dist/kit/figure/detent-path-grip.mjs +150 -49
  1493. package/dist/kit/figure/figure.d.mts +22 -18
  1494. package/dist/kit/figure/figure.mjs +13 -10
  1495. package/dist/kit/figure/format.d.mts +2 -30
  1496. package/dist/kit/figure/format.mjs +2 -62
  1497. package/dist/kit/figure/grip-motion.d.mts +103 -0
  1498. package/dist/kit/figure/grip-motion.mjs +283 -0
  1499. package/dist/kit/figure/grip-pointer.d.mts +54 -0
  1500. package/dist/kit/figure/grip-pointer.mjs +108 -0
  1501. package/dist/kit/figure/grip.d.mts +35 -6
  1502. package/dist/kit/figure/grip.mjs +347 -131
  1503. package/dist/kit/figure/index.d.mts +10 -4
  1504. package/dist/kit/figure/index.mjs +9 -3
  1505. package/dist/kit/figure/key-scale.mjs +73 -17
  1506. package/dist/kit/figure/legend.mjs +12 -5
  1507. package/dist/kit/figure/lines.d.mts +24 -0
  1508. package/dist/kit/figure/lines.mjs +16 -0
  1509. package/dist/kit/figure/math-text.mjs +1 -1
  1510. package/dist/kit/figure/plot.d.mts +5 -1
  1511. package/dist/kit/figure/plot.mjs +6 -5
  1512. package/dist/kit/figure/reading.d.mts +120 -0
  1513. package/dist/kit/figure/reading.mjs +437 -0
  1514. package/dist/kit/figure/run-key.mjs +2 -4
  1515. package/dist/kit/figure/text-metrics.d.mts +92 -0
  1516. package/dist/kit/figure/text-metrics.data.mjs +654 -0
  1517. package/dist/kit/figure/text-metrics.mjs +125 -0
  1518. package/dist/kit/figure/text.d.mts +0 -13
  1519. package/dist/kit/figure/text.mjs +19 -36
  1520. package/dist/kit/figure/value-control.d.mts +0 -1
  1521. package/dist/kit/figure/value-control.mjs +30 -26
  1522. package/dist/kit/figure-drag.mjs +53 -40
  1523. package/dist/kit/finance-viz/index.mjs +1 -1
  1524. package/dist/kit/finance-viz/plot-chart.mjs +13 -7
  1525. package/dist/kit/finance-viz/tradeoff-curve.mjs +10 -7
  1526. package/dist/kit/frame.mjs +1 -1
  1527. package/dist/kit/freq-tree.mjs +0 -1
  1528. package/dist/kit/gameshow.mjs +17 -6
  1529. package/dist/kit/geometry/bound-figure.mjs +7 -6
  1530. package/dist/kit/geometry/compass-construction-figure.d.mts +0 -1
  1531. package/dist/kit/geometry/compass-construction-figure.mjs +4 -4
  1532. package/dist/kit/geometry/cuboid-body.mjs +1 -1
  1533. package/dist/kit/geometry/cuboid-mirror-figure.d.mts +0 -1
  1534. package/dist/kit/geometry/cuboid-mirror-figure.mjs +2 -2
  1535. package/dist/kit/geometry/cuboid-planes-figure.d.mts +0 -1
  1536. package/dist/kit/geometry/cuboid-planes-figure.mjs +19 -6
  1537. package/dist/kit/geometry/folding-net-figure.d.mts +0 -1
  1538. package/dist/kit/geometry/folding-net-figure.mjs +3 -3
  1539. package/dist/kit/geometry/instrument-figure.d.mts +0 -1
  1540. package/dist/kit/geometry/instrument-figure.mjs +21 -5
  1541. package/dist/kit/geometry/projected-solid-body.mjs +2 -2
  1542. package/dist/kit/geometry/pyramid-mirror-figure.d.mts +0 -1
  1543. package/dist/kit/geometry/pyramid-mirror-figure.mjs +3 -3
  1544. package/dist/kit/geometry/solid-rotation-figure.d.mts +0 -1
  1545. package/dist/kit/geometry/solid-rotation-figure.mjs +3 -3
  1546. package/dist/kit/gravitation/section.mjs +2 -2
  1547. package/dist/kit/index.d.mts +45 -36
  1548. package/dist/kit/index.mjs +47 -38
  1549. package/dist/kit/instruments.mjs +185 -143
  1550. package/dist/kit/language/speaker-glyph.mjs +0 -1
  1551. package/dist/kit/lesson-questions.mjs +24 -3
  1552. package/dist/kit/logic-gates/display.mjs +0 -1
  1553. package/dist/kit/logic-gates/gate.mjs +7 -4
  1554. package/dist/kit/logic-gates/register.mjs +1 -3
  1555. package/dist/kit/magnetism/bench.mjs +1 -7
  1556. package/dist/kit/magnetism/fleming-hand.mjs +374 -0
  1557. package/dist/kit/magnetism/glyphs.d.mts +2 -7
  1558. package/dist/kit/magnetism/glyphs.mjs +82 -68
  1559. package/dist/kit/magnetism/index.d.mts +2 -2
  1560. package/dist/kit/magnetism/index.mjs +1 -1
  1561. package/dist/kit/magnetism/machine.d.mts +17 -5
  1562. package/dist/kit/magnetism/machine.mjs +123 -57
  1563. package/dist/kit/math/algebra-area-tiles.d.mts +7 -1
  1564. package/dist/kit/math/algebra-area-tiles.mjs +113 -16
  1565. package/dist/kit/math/algebra-balance.d.mts +0 -1
  1566. package/dist/kit/math/algebra-balance.mjs +165 -152
  1567. package/dist/kit/math/algebra-elimination-board.d.mts +0 -1
  1568. package/dist/kit/math/algebra-elimination-board.mjs +0 -1
  1569. package/dist/kit/math/index.d.mts +2 -1
  1570. package/dist/kit/math/index.mjs +2 -1
  1571. package/dist/kit/math/math-rail.mjs +2 -1
  1572. package/dist/kit/math/square-of-sum-grid.d.mts +26 -0
  1573. package/dist/kit/math/square-of-sum-grid.mjs +167 -0
  1574. package/dist/kit/molecules.mjs +0 -1
  1575. package/dist/kit/movable-dot.d.mts +2 -2
  1576. package/dist/kit/movable-dot.mjs +2 -2
  1577. package/dist/kit/networking/accelerator-card.mjs +1 -3
  1578. package/dist/kit/networking/access-glyphs.mjs +0 -2
  1579. package/dist/{domains/networking/_shared → kit/networking}/decision-scene.d.mts +1 -1
  1580. package/dist/{domains/networking/_shared → kit/networking}/decision-scene.mjs +10 -8
  1581. package/dist/kit/networking/failure-domain-map.mjs +0 -2
  1582. package/dist/kit/networking/index.mjs +2 -2
  1583. package/dist/kit/networking/infrastructure-glyphs.mjs +0 -2
  1584. package/dist/kit/networking/memory-budget-strip.mjs +1 -3
  1585. package/dist/kit/networking/primitives.d.mts +1 -2
  1586. package/dist/kit/networking/primitives.mjs +3 -4
  1587. package/dist/kit/networking/prompt-token-strip.mjs +1 -5
  1588. package/dist/kit/networking/release-glyphs.mjs +0 -1
  1589. package/dist/kit/networking/replica-fleet.d.mts +0 -1
  1590. package/dist/kit/networking/replica-fleet.mjs +0 -1
  1591. package/dist/kit/networking/request-outcome-strip.mjs +0 -1
  1592. package/dist/kit/networking/scene/buffer.mjs +2 -6
  1593. package/dist/kit/networking/scene/channel.d.mts +0 -1
  1594. package/dist/kit/networking/scene/channel.mjs +2 -4
  1595. package/dist/kit/networking/scene/control.d.mts +0 -1
  1596. package/dist/kit/networking/scene/control.mjs +8 -8
  1597. package/dist/kit/networking/scene/index.mjs +2 -2
  1598. package/dist/kit/networking/scene/media.mjs +1 -3
  1599. package/dist/kit/networking/scene/objects.mjs +16 -19
  1600. package/dist/kit/networking/scene/observability.mjs +0 -1
  1601. package/dist/kit/networking/scene/route.mjs +1 -3
  1602. package/dist/kit/networking/scene/switch.mjs +3 -3
  1603. package/dist/kit/networking/secret-glyphs.mjs +0 -1
  1604. package/dist/kit/networking/signal-glyphs.mjs +1 -3
  1605. package/dist/kit/networking/vpc-route-glyph.mjs +0 -2
  1606. package/dist/kit/number-response.mjs +1 -1
  1607. package/dist/kit/plane-grip.d.mts +1 -1
  1608. package/dist/kit/plane-grip.mjs +2 -1
  1609. package/dist/kit/play.mjs +1 -1
  1610. package/dist/kit/point-binding.d.mts +1 -1
  1611. package/dist/kit/predict.d.mts +1 -1
  1612. package/dist/kit/predict.mjs +2 -1
  1613. package/dist/kit/probability.mjs +0 -1
  1614. package/dist/kit/quantum/bloch-sphere.mjs +0 -1
  1615. package/dist/kit/reaction.mjs +0 -1
  1616. package/dist/kit/reasoning/claim-card.mjs +1 -3
  1617. package/dist/kit/receipt.mjs +2 -2
  1618. package/dist/kit/rich.mjs +1 -1
  1619. package/dist/kit/rule.d.mts +2 -1
  1620. package/dist/kit/rule.mjs +22 -13
  1621. package/dist/kit/scale.mjs +17 -16
  1622. package/dist/kit/scene/compare.mjs +210 -0
  1623. package/dist/kit/scene/context.d.mts +1 -1
  1624. package/dist/kit/scene/cutaway.mjs +202 -0
  1625. package/dist/kit/scene/explode.mjs +235 -0
  1626. package/dist/kit/scene/graph.d.mts +14 -2
  1627. package/dist/kit/scene/graph.mjs +100 -11
  1628. package/dist/kit/scene/index.mjs +16 -10
  1629. package/dist/kit/scene/loupe.mjs +252 -0
  1630. package/dist/kit/scene/materials.d.mts +132 -0
  1631. package/dist/kit/scene/materials.mjs +247 -0
  1632. package/dist/kit/scene/objects/balance.mjs +3 -4
  1633. package/dist/kit/scene/objects/bench.mjs +11 -13
  1634. package/dist/kit/scene/objects/block.d.mts +22 -36
  1635. package/dist/kit/scene/objects/block.mjs +394 -118
  1636. package/dist/kit/scene/objects/car.mjs +4 -4
  1637. package/dist/kit/scene/objects/charges.mjs +1 -2
  1638. package/dist/kit/scene/objects/clock.mjs +2 -3
  1639. package/dist/kit/scene/objects/dial.mjs +22 -29
  1640. package/dist/kit/scene/objects/energy.mjs +4 -5
  1641. package/dist/kit/scene/objects/fan.mjs +1 -2
  1642. package/dist/kit/scene/objects/forces.d.mts +5 -2
  1643. package/dist/kit/scene/objects/forces.mjs +4 -4
  1644. package/dist/kit/scene/objects/gauges.mjs +2 -15
  1645. package/dist/kit/scene/objects/instruments.mjs +10 -9
  1646. package/dist/kit/scene/objects/knob.mjs +146 -0
  1647. package/dist/kit/scene/objects/lift.mjs +0 -2
  1648. package/dist/kit/scene/objects/light-clock.mjs +4 -6
  1649. package/dist/kit/scene/objects/mechanics.mjs +21 -30
  1650. package/dist/kit/scene/objects/mechanisms.mjs +9 -9
  1651. package/dist/kit/scene/objects/observer.mjs +1 -2
  1652. package/dist/kit/scene/objects/optical-bench.mjs +8 -5
  1653. package/dist/kit/scene/objects/optical-signal.mjs +0 -1
  1654. package/dist/kit/scene/objects/parachute.mjs +1 -2
  1655. package/dist/kit/scene/objects/pendulum.mjs +6 -5
  1656. package/dist/kit/scene/objects/person.mjs +1 -2
  1657. package/dist/kit/scene/objects/piston.mjs +3 -4
  1658. package/dist/kit/scene/objects/projectiles.mjs +4 -5
  1659. package/dist/kit/scene/objects/replay.mjs +0 -1
  1660. package/dist/kit/scene/objects/rocket.mjs +1 -2
  1661. package/dist/kit/scene/objects/roller.mjs +1 -2
  1662. package/dist/kit/scene/objects/signed-bars.mjs +0 -1
  1663. package/dist/kit/scene/objects/spacecraft.mjs +0 -1
  1664. package/dist/kit/scene/objects/spectrum.mjs +0 -1
  1665. package/dist/kit/scene/objects/stand.mjs +4 -4
  1666. package/dist/kit/scene/objects/strike.mjs +1 -2
  1667. package/dist/kit/scene/objects/suspension.mjs +4 -5
  1668. package/dist/kit/scene/objects/tank.mjs +0 -1
  1669. package/dist/kit/scene/objects/thermometer.mjs +1 -2
  1670. package/dist/kit/scene/objects/top-vehicle.mjs +1 -2
  1671. package/dist/kit/scene/objects/train.mjs +3 -4
  1672. package/dist/kit/scene/objects/waves.mjs +73 -18
  1673. package/dist/kit/scene/river.mjs +102 -93
  1674. package/dist/kit/scene/scene.d.mts +0 -1
  1675. package/dist/kit/scene/scene.mjs +25 -29
  1676. package/dist/kit/scene/scenery.d.mts +0 -7
  1677. package/dist/kit/scene/scenery.mjs +12 -17
  1678. package/dist/kit/scene/tokens.d.mts +66 -8
  1679. package/dist/kit/scene/tokens.mjs +84 -33
  1680. package/dist/kit/scene/vectors.mjs +0 -1
  1681. package/dist/kit/scene/workbench.d.mts +2 -2
  1682. package/dist/kit/scene/workbench.mjs +5 -5
  1683. package/dist/kit/scene-settings.d.mts +3 -1
  1684. package/dist/kit/scene-settings.mjs +24 -16
  1685. package/dist/kit/scenes.d.mts +7 -1
  1686. package/dist/kit/scenes.mjs +53 -26
  1687. package/dist/kit/shell/context.d.mts +15 -1
  1688. package/dist/kit/shell/context.mjs +40 -8
  1689. package/dist/kit/shell/earned.mjs +13 -11
  1690. package/dist/kit/shell/index.d.mts +3 -3
  1691. package/dist/kit/shell/index.mjs +4 -4
  1692. package/dist/kit/shell/model-entry.mjs +38 -20
  1693. package/dist/kit/shell/model-note.mjs +52 -0
  1694. package/dist/kit/shell/note.mjs +3 -1
  1695. package/dist/kit/shell/parts.d.mts +3 -2
  1696. package/dist/kit/shell/parts.mjs +50 -31
  1697. package/dist/kit/shell/provider.d.mts +10 -1
  1698. package/dist/kit/shell/provider.mjs +52 -22
  1699. package/dist/kit/shell/question-evidence.mjs +6 -5
  1700. package/dist/kit/shell/scene-control.mjs +3 -3
  1701. package/dist/kit/shell/select-choices.mjs +7 -5
  1702. package/dist/kit/simulation/clock.mjs +3 -3
  1703. package/dist/kit/simulation/use-simulation.mjs +3 -3
  1704. package/dist/kit/space/bodies.mjs +2 -2
  1705. package/dist/kit/ticks.mjs +13 -4
  1706. package/dist/kit/transport.d.mts +10 -1
  1707. package/dist/kit/transport.mjs +21 -7
  1708. package/dist/kit/turn-surface.mjs +31 -24
  1709. package/dist/kit/vessel.mjs +0 -1
  1710. package/dist/kit/world/runtime.mjs +3 -3
  1711. package/dist/kit/world/world-scene.mjs +2 -2
  1712. package/dist/lab-def/define-lab.d.mts +6 -3
  1713. package/dist/lab-def/lab-props.mjs +2 -1
  1714. package/dist/lab-def/lab-runtime.d.mts +3 -1
  1715. package/dist/lab-def/lab-runtime.mjs +158 -67
  1716. package/dist/lab-def/runtime-load.mjs +35 -0
  1717. package/dist/lab-def/to-block.mjs +6 -1
  1718. package/dist/logic/LogicScene.mjs +16 -5
  1719. package/dist/logic/index.d.mts +1 -2
  1720. package/dist/logic/index.mjs +1 -2
  1721. package/dist/logic/registry.d.mts +5 -0
  1722. package/dist/logic/registry.mjs +33 -2
  1723. package/dist/logic/runtime/index.d.mts +1 -2
  1724. package/dist/logic/runtime/index.mjs +1 -2
  1725. package/dist/math/answer-accuracy/core.mjs +1 -1
  1726. package/dist/math/index.d.mts +2 -1
  1727. package/dist/math/interactive/preset.d.mts +1 -1
  1728. package/dist/math/interactive/preset.mjs +46 -24
  1729. package/dist/math/lines-in-space/index.mjs +1 -1
  1730. package/dist/math/mystery-bucket/asset.d.mts +3 -1
  1731. package/dist/math/mystery-bucket/asset.mjs +37 -12
  1732. package/dist/math/mystery-bucket/preset.d.mts +4 -4
  1733. package/dist/math/mystery-bucket/preset.mjs +4 -5
  1734. package/dist/ml/worlds/synthetic.mjs +1 -1
  1735. package/dist/model/controls.d.mts +4 -0
  1736. package/dist/model/define.d.mts +14 -0
  1737. package/dist/model/define.mjs +20 -1
  1738. package/dist/model/format.d.mts +33 -0
  1739. package/dist/model/format.mjs +76 -0
  1740. package/dist/model/index.d.mts +4 -2
  1741. package/dist/model/index.mjs +3 -1
  1742. package/dist/model/model-note.d.mts +16 -0
  1743. package/dist/model/model-note.mjs +34 -0
  1744. package/dist/model/money.d.mts +36 -0
  1745. package/dist/model/money.mjs +45 -0
  1746. package/dist/model/resolved-value.mjs +16 -0
  1747. package/dist/model/session.d.mts +3 -0
  1748. package/dist/model/session.mjs +7 -1
  1749. package/dist/networking/CellularScene.mjs +4 -3
  1750. package/dist/physics/constants.d.mts +12 -11
  1751. package/dist/physics/constants.mjs +27 -26
  1752. package/dist/physics/exponential/asset.mjs +7 -2
  1753. package/dist/physics/exponential/preset.mjs +60 -58
  1754. package/dist/physics/mechanics/presentation.mjs +8 -9
  1755. package/dist/physics/modern/shared/experiment-transport.mjs +3 -3
  1756. package/dist/physics/optics/eye-correction.mjs +2 -2
  1757. package/dist/physics/optics/imaging-world-scene.mjs +18 -14
  1758. package/dist/physics/optics/light-path-world-scene.mjs +4 -4
  1759. package/dist/physics/waves/wave-bench-scene.mjs +2 -2
  1760. package/dist/physics/waves/wave-bench-skins.mjs +11 -13
  1761. package/dist/registry/generated/packs/accounting.mjs +56 -0
  1762. package/dist/registry/generated/packs/chem.mjs +40 -0
  1763. package/dist/registry/generated/packs/circuits.mjs +8 -0
  1764. package/dist/registry/generated/packs/geometry.mjs +9 -0
  1765. package/dist/registry/generated/packs/ict.mjs +24 -0
  1766. package/dist/registry/generated/packs/math.mjs +20 -1
  1767. package/dist/registry/pack.d.mts +8 -0
  1768. package/dist/registry/registry.d.mts +25 -1
  1769. package/dist/registry/registry.mjs +22 -1
  1770. package/dist/runtime/index.d.mts +2 -2
  1771. package/dist/runtime/index.mjs +2 -2
  1772. package/dist/runtime/lab-goals.mjs +8 -3
  1773. package/dist/runtime/lab-keys.mjs +13 -15
  1774. package/dist/runtime/lab-viewport.mjs +29 -0
  1775. package/dist/runtime/use-control.d.mts +2 -2
  1776. package/dist/runtime/use-control.mjs +7 -5
  1777. package/dist/runtime/use-lab-view.d.mts +2 -0
  1778. package/dist/runtime/use-lab-view.mjs +1 -0
  1779. package/dist/runtime/use-lab.d.mts +6 -0
  1780. package/dist/runtime/use-lab.mjs +12 -6
  1781. package/dist/runtime/use-reveal.mjs +2 -2
  1782. package/dist/runtime/visibility.d.mts +32 -0
  1783. package/dist/runtime/visibility.mjs +80 -0
  1784. package/dist/schemas/activity-authoring.d.mts +78 -4
  1785. package/dist/schemas/activity-authoring.mjs +26 -0
  1786. package/dist/schemas/index.d.mts +4 -4
  1787. package/dist/schemas/lesson-questions.d.mts +22 -0
  1788. package/dist/schemas/lesson-questions.mjs +28 -10
  1789. package/dist/shared/fields.mjs +21 -1
  1790. package/dist/styles/manifest.mjs +714 -695
  1791. package/dist/testing/conformance.d.mts +8 -2
  1792. package/dist/testing/conformance.mjs +12 -4
  1793. package/dist/three/chemistry/atomic-orbital.d.mts +3 -6
  1794. package/dist/three/chemistry/atomic-orbital.mjs +5 -6
  1795. package/dist/three/chemistry/crystal-lattice.d.mts +2 -1
  1796. package/dist/three/chemistry/crystal-lattice.mjs +4 -1
  1797. package/dist/three/chemistry/molecular-geometry.d.mts +2 -1
  1798. package/dist/three/chemistry/molecular-geometry.mjs +4 -1
  1799. package/dist/three/chemistry/orbital-overlap.d.mts +2 -1
  1800. package/dist/three/chemistry/orbital-overlap.mjs +4 -1
  1801. package/dist/three/index.d.mts +2 -1
  1802. package/dist/three/index.mjs +2 -1
  1803. package/dist/three/math/solids-of-revolution.d.mts +3 -7
  1804. package/dist/three/math/solids-of-revolution.mjs +5 -7
  1805. package/dist/three/primitives.d.mts +11 -6
  1806. package/dist/three/primitives.mjs +21 -24
  1807. package/dist/three/studio.d.mts +102 -0
  1808. package/dist/three/studio.mjs +263 -0
  1809. package/dist/three/surface.mjs +14 -4
  1810. package/package.json +105 -29
  1811. package/styles/core/components.css +3 -7
  1812. package/styles/core/figure-interaction.css +10 -24
  1813. package/styles/core/interaction-scenes.css +10 -1
  1814. package/styles/core/primitives.css +1 -1
  1815. package/styles/core/runtime.css +8 -8
  1816. package/styles/core/shared.css +7 -10
  1817. package/styles/core/workbenches.css +11 -6
  1818. package/styles/domains/commerce.css +3 -0
  1819. package/styles/domains/parts/commerce-books.css +443 -0
  1820. package/styles/domains/parts/commerce-costing.css +341 -0
  1821. package/styles/domains/parts/commerce-foundation.css +517 -21
  1822. package/styles/domains/parts/commerce-household.css +379 -0
  1823. package/styles/domains/parts/commerce-statements.css +293 -0
  1824. package/styles/domains/parts/discrete-6.css +7 -0
  1825. package/styles/domains/parts/exam-practice.css +2 -1
  1826. package/styles/domains/parts/ict.css +235 -0
  1827. package/styles/domains/parts/math-1.css +139 -10
  1828. package/styles/domains/parts/math-7.css +35 -0
  1829. package/styles/domains.css +3 -0
  1830. package/styles/figure.css +64 -48
  1831. package/styles/runtime.css +5 -3
  1832. package/styles/scene.css +324 -100
  1833. package/styles/shell.css +61 -0
  1834. package/styles.css +3 -3
  1835. package/tailwind.css +12 -6
  1836. package/dist/algorithms/ListLab.d.mts +0 -54
  1837. package/dist/algorithms/ListLab.mjs +0 -692
  1838. package/dist/algorithms/TraceTransport.d.mts +0 -11
  1839. package/dist/algorithms/TraceTransport.mjs +0 -165
  1840. package/dist/blocks/lab-block.mjs +0 -87
  1841. package/dist/commerce/accounting/books/index.mjs +0 -8
  1842. package/dist/core/numeric.d.mts +0 -19
  1843. package/dist/core/numeric.mjs +0 -36
  1844. package/dist/core/rng.d.mts +0 -2
  1845. package/dist/core/rng.mjs +0 -3
  1846. package/dist/core/timeline.d.mts +0 -32
  1847. package/dist/core/timeline.mjs +0 -80
  1848. package/dist/discrete/core/combinatorics.d.mts +0 -45
  1849. package/dist/discrete/core/combinatorics.mjs +0 -100
  1850. package/dist/discrete/core/probability.d.mts +0 -28
  1851. package/dist/discrete/core/probability.mjs +0 -43
  1852. package/dist/discrete/core/rng.d.mts +0 -2
  1853. package/dist/discrete/core/rng.mjs +0 -3
  1854. package/dist/domains/discrete/venn/inclusionExclusion.d.mts +0 -17
  1855. package/dist/domains/discrete/venn/inclusionExclusion.mjs +0 -30
  1856. package/dist/kit/counting/index.mjs +0 -6
  1857. package/dist/kit/reasoning/index.mjs +0 -3
  1858. package/dist/logic/gates.d.mts +0 -4
  1859. package/dist/logic/gates.mjs +0 -32
  1860. package/dist/statistics/core/descriptive.d.mts +0 -34
  1861. package/dist/statistics/core/descriptive.mjs +0 -65
  1862. package/dist/statistics/core/index.d.mts +0 -3
  1863. package/dist/statistics/core/index.mjs +0 -4
  1864. package/dist/statistics/core/normal.d.mts +0 -20
  1865. package/dist/statistics/core/normal.mjs +0 -37
  1866. package/dist/statistics/index.d.mts +0 -4
  1867. package/dist/statistics/index.mjs +0 -5
@@ -0,0 +1,807 @@
1
+ import { defineLabModel } from "../../../../model/define.mjs";
2
+ import { isRefusal, refuse } from "../../../../model/index.mjs";
3
+ import { BAYS, DEFAULT_CARDS, DEFAULT_DRILL, DEFAULT_TRANSFER, DRILL_ITEMS, SORT_CARDS, TRANSFER_CASES } from "./cases.mjs";
4
+ import { z } from "zod";
5
+ import { classifyRedox, formulaDisplayText, oxidationNumberOf, parseSpecies } from "@classytic/stage/chem";
6
+ import { elementBySymbol, ionConfigurationOf } from "@classytic/stage/atomic";
7
+
8
+ //#region src/domains/chem/electrochemistry/redox-transfer/model.ts
9
+ /**
10
+ * Redox transfer (Class 9): electrons move from one atom to another, oxidation numbers say where,
11
+ * and the reaction goes into one of five bays.
12
+ *
13
+ * Three modes, chosen by the lesson (`mode`):
14
+ * demo an electron is carried from the donor atom to the acceptor atom, then each species is named
15
+ * reductant or oxidant. The first case is the worked example, later cases are changed cases.
16
+ * drill the oxidation number of one element is found by turning a dial until the sum of all the
17
+ * numbers on the balance equals the charge of the species (book p149-150).
18
+ * sort a reaction card, with its oxidation-number strip, goes into addition, decomposition,
19
+ * displacement, combustion or non-redox.
20
+ *
21
+ * Every chemical fact is read from stage's `redox-class` kernel: `classifyRedox` for what changes, who
22
+ * gives and who takes, which types fit and how many electrons move; `oxidationNumberOf` for every
23
+ * number the drill shows. Shell counts for the drawn atoms come from stage's `ionConfigurationOf`. This
24
+ * file selects, groups and words those results. It owns no chemical rule.
25
+ *
26
+ * Oxidation numbers are whole numbers only (the kernel refuses fractions). The sort accepts every
27
+ * type that fits a card (C + O2 is both addition and combustion), so a card can have two right bays.
28
+ *
29
+ * `goals` that do not belong to the lesson's mode are true, so one witness can satisfy them all; an
30
+ * activity names only the goals of its own mode.
31
+ */
32
+ /** The dial's range (book p150 drill answers run from -4 to +8). */
33
+ const GUESS_RANGE = [-4, 8];
34
+ /** The bead counts as dropped on the acceptor from this far along its path. */
35
+ const DROP_AT = .65;
36
+ /** A signed whole number as chemists write it: +6, 0, and a true minus sign for -2. */
37
+ const signed = (n) => n > 0 ? `+${n}` : n < 0 ? `−${-n}` : "0";
38
+ const unique = (list) => [...new Set(list)];
39
+ const gcd = (a, b) => b === 0 ? a : gcd(b, a % b);
40
+ /** `2Na + Cl2 -> 2NaCl` with subscripts and an arrow. Display only. */
41
+ function displayEquation(equation) {
42
+ const side = (text) => text.split(/\s+\+\s+/).map((term) => {
43
+ const m = /^(\d+)?\s*(.+)$/.exec(term.trim());
44
+ return `${m[1] ?? ""}${formulaDisplayText(m[2])}`;
45
+ }).join(" + ");
46
+ const [left = "", right = ""] = equation.split("->");
47
+ return `${side(left)} → ${side(right)}`;
48
+ }
49
+ const electronsText = (n) => `${n === 1 ? "" : n}e⁻`;
50
+ const ionText = (symbol, charge) => formulaDisplayText(`${symbol}^${Math.abs(charge) === 1 ? "" : Math.abs(charge)}${charge > 0 ? "+" : "-"}`);
51
+ /** The shell counts of an atom or ion, innermost first: Na is 2,8,1 and Na+ is 2,8. From stage. */
52
+ function shellCounts(Z, charge) {
53
+ const byShell = new Map();
54
+ for (const o of ionConfigurationOf(Z, charge)) byShell.set(o.n, (byShell.get(o.n) ?? 0) + o.electrons);
55
+ return [...byShell.entries()].sort(([a], [b]) => a - b).map(([, n]) => n);
56
+ }
57
+ /** Each element of an equation with its oxidation numbers before and after, from the kernel's reading. */
58
+ function stripOf(reading) {
59
+ const elements = unique(reading.species.flatMap((sp) => Object.keys(sp.oxidationNumbers)));
60
+ const numbers = (element, side) => unique(reading.species.filter((sp) => sp.side === side && element in sp.oxidationNumbers).map((sp) => sp.oxidationNumbers[element])).sort((a, b) => a - b);
61
+ return elements.map((element) => {
62
+ const before = numbers(element, "reactant");
63
+ const after = numbers(element, "product");
64
+ return {
65
+ element,
66
+ before: before.map(signed).join(", "),
67
+ after: after.map(signed).join(", "),
68
+ changed: before.join() !== after.join()
69
+ };
70
+ });
71
+ }
72
+ function atomCount(reading, formula, element) {
73
+ const sp = reading.species.find((x) => x.side === "reactant" && x.formula === formula);
74
+ return sp.coefficient * (parseSpecies(formula).elements[element] ?? 0);
75
+ }
76
+ function transferCase(spec) {
77
+ const reading = classifyRedox(spec.equation);
78
+ if (isRefusal(reading)) return reading;
79
+ const display = displayEquation(spec.equation);
80
+ const base = {
81
+ id: spec.id,
82
+ name: spec.name,
83
+ equation: spec.equation,
84
+ display,
85
+ drawn: display,
86
+ unitNote: "",
87
+ strip: stripOf(reading),
88
+ ...spec.bookNote ? { bookNote: spec.bookNote } : {}
89
+ };
90
+ if (!reading.redox) return {
91
+ ...base,
92
+ redox: false,
93
+ donor: null,
94
+ acceptor: null,
95
+ electrons: 0,
96
+ truth: {},
97
+ halves: null
98
+ };
99
+ const gives = reading.changes.filter((c) => c.to > c.from);
100
+ const takes = reading.changes.filter((c) => c.to < c.from);
101
+ const [up, down] = [gives[0], takes[0]];
102
+ if (reading.changes.length !== 2 || !up || !down || up.from !== 0 || down.from !== 0) return refuse("transfer-needs-atoms", `${spec.equation}: the transfer picture needs one free element that gives and one that takes.`, { id: spec.id });
103
+ const each = {
104
+ donor: up.to - up.from,
105
+ acceptor: down.from - down.to
106
+ };
107
+ const whole = {
108
+ donor: atomCount(reading, up.species, up.element),
109
+ acceptor: atomCount(reading, down.species, down.element)
110
+ };
111
+ if (whole.donor * each.donor !== reading.electronsPerFormula || whole.acceptor * each.acceptor !== reading.electronsPerFormula) return refuse("transfer-count-mismatch", `${spec.equation}: the atoms drawn would move ${whole.donor * each.donor} electrons but stage counts ${reading.electronsPerFormula}.`, { id: spec.id });
112
+ const fits = (donors, acceptors) => donors <= 3 && acceptors <= 3 && donors * each.donor <= 6;
113
+ const k = fits(whole.donor, whole.acceptor) ? 1 : gcd(whole.donor, whole.acceptor);
114
+ const count = {
115
+ donor: whole.donor / k,
116
+ acceptor: whole.acceptor / k
117
+ };
118
+ const products = reading.species.filter((sp) => sp.side === "product");
119
+ if (!fits(count.donor, count.acceptor) || products.some((sp) => sp.coefficient % k !== 0)) return refuse("transfer-too-large", `${spec.equation}: even one formula unit needs ${count.donor} giving atoms and ${count.acceptor} taking atoms (at most 3 of each).`, { id: spec.id });
120
+ const electrons = count.donor * each.donor;
121
+ const n = (c) => c === 1 ? "" : String(c);
122
+ const unit = k > 1;
123
+ const drawn = unit ? `${n(count.donor)}${up.element} + ${n(count.acceptor)}${down.element} → ${products.map((sp) => `${n(sp.coefficient / k)}${formulaDisplayText(sp.formula)}`).join(" + ")}` : display;
124
+ const plan = (c, atoms, per) => {
125
+ const Z = elementBySymbol(c.element).Z;
126
+ return {
127
+ symbol: c.element,
128
+ Z,
129
+ species: c.species,
130
+ count: atoms,
131
+ each: per,
132
+ outer: shellCounts(Z, 0).at(-1),
133
+ from: c.from,
134
+ to: c.to
135
+ };
136
+ };
137
+ const donor = plan(up, count.donor, each.donor);
138
+ const acceptor = plan(down, count.acceptor, each.acceptor);
139
+ return {
140
+ ...base,
141
+ drawn,
142
+ unitNote: unit ? `One formula unit: the picture moves ${electrons} electrons; the whole equation moves ${reading.electronsPerFormula}.` : "",
143
+ redox: true,
144
+ donor,
145
+ acceptor,
146
+ electrons,
147
+ truth: {
148
+ [donor.species]: "reductant",
149
+ [acceptor.species]: "oxidant"
150
+ },
151
+ halves: {
152
+ oxidation: `${donor.symbol} → ${ionText(donor.symbol, donor.each)} + ${electronsText(donor.each)}`,
153
+ reduction: `${acceptor.symbol} + ${electronsText(acceptor.each)} → ${ionText(acceptor.symbol, -acceptor.each)}`
154
+ }
155
+ };
156
+ }
157
+ function drillItem(spec) {
158
+ let elements;
159
+ let charge;
160
+ try {
161
+ const species = parseSpecies(spec.species);
162
+ elements = species.elements;
163
+ charge = species.charge;
164
+ } catch (error) {
165
+ return refuse("bad-species", `"${spec.species}" is not a species: ${error.message}`, { id: spec.id });
166
+ }
167
+ const given = spec.given ?? {};
168
+ const answer = oxidationNumberOf(spec.species, spec.element, given);
169
+ if (isRefusal(answer)) return answer;
170
+ if (answer < GUESS_RANGE[0] || answer > GUESS_RANGE[1]) return refuse("answer-out-of-range", `${spec.element} in ${spec.species} is ${signed(answer)}, outside the dial's ${signed(GUESS_RANGE[0])} to ${signed(GUESS_RANGE[1])}.`, { id: spec.id });
171
+ const atoms = [];
172
+ for (const [symbol, count] of Object.entries(elements)) {
173
+ if (symbol === spec.element) {
174
+ atoms.push({
175
+ symbol,
176
+ count,
177
+ on: null,
178
+ given: false
179
+ });
180
+ continue;
181
+ }
182
+ const on = oxidationNumberOf(spec.species, symbol, given);
183
+ if (isRefusal(on)) return on;
184
+ atoms.push({
185
+ symbol,
186
+ count,
187
+ on,
188
+ given: symbol in given
189
+ });
190
+ }
191
+ const known = atoms.filter((a) => a.on !== null);
192
+ const knownSum = known.reduce((sum, a) => sum + a.on * a.count, 0);
193
+ const unknownCount = elements[spec.element];
194
+ const terms = atoms.map((a) => a.on === null ? `x×${a.count}` : `(${signed(a.on)})×${a.count}`);
195
+ return {
196
+ id: spec.id,
197
+ species: spec.species,
198
+ display: formulaDisplayText(spec.species),
199
+ element: spec.element,
200
+ given,
201
+ answer,
202
+ charge,
203
+ atoms,
204
+ knownSum,
205
+ unknownCount,
206
+ working: `${terms.join(" + ")} = ${charge === 0 ? "0" : signed(charge)}`,
207
+ source: spec.source
208
+ };
209
+ }
210
+ function sortCard(spec) {
211
+ const reading = classifyRedox(spec.equation);
212
+ if (isRefusal(reading)) return reading;
213
+ if (reading.redox && reading.types.length === 0) return refuse("card-has-no-type", `${spec.equation} is redox but fits none of the four types.`, { id: spec.id });
214
+ if (!reading.redox && !spec.kind) return refuse("card-needs-kind", `${spec.equation} is not redox: name its kind (neutralisation or precipitation).`, { id: spec.id });
215
+ if (reading.redox && spec.kind) return refuse("card-kind-is-redox", `${spec.equation} is redox, so it cannot be a ${spec.kind}.`, { id: spec.id });
216
+ return {
217
+ id: spec.id,
218
+ equation: spec.equation,
219
+ display: displayEquation(spec.equation),
220
+ redox: reading.redox,
221
+ accepted: reading.redox ? reading.types : ["non-redox"],
222
+ strip: stripOf(reading),
223
+ reactants: reading.species.filter((sp) => sp.side === "reactant").length,
224
+ products: reading.species.filter((sp) => sp.side === "product").length,
225
+ electrons: reading.electronsPerFormula,
226
+ ...spec.kind ? { kind: spec.kind } : {},
227
+ ...spec.bookNote ? { bookNote: spec.bookNote } : {},
228
+ ...reading.reductant ? { reductant: reading.reductant } : {},
229
+ ...reading.oxidant ? { oxidant: reading.oxidant } : {}
230
+ };
231
+ }
232
+ const BAY_NAME = {
233
+ addition: "addition",
234
+ decomposition: "decomposition",
235
+ displacement: "displacement",
236
+ combustion: "combustion",
237
+ "non-redox": "non-redox"
238
+ };
239
+ const bayName = (bay) => BAY_NAME[bay];
240
+ const BAY_RULE = {
241
+ addition: "Addition: two or more substances join into one product.",
242
+ decomposition: "Decomposition: one substance breaks into two or more.",
243
+ displacement: "Displacement: a free element pushes another element out of a compound.",
244
+ combustion: "Combustion: oxygen reacts and its oxidation number falls from 0 to -2.",
245
+ "non-redox": "Non-redox: no atom changes its oxidation number, so no electron moves."
246
+ };
247
+ const bayRule = (bay) => BAY_RULE[bay];
248
+ /** Why a bay is wrong for a card, from the strip and the species counts. Never just "wrong". */
249
+ function explainBay(card, bay) {
250
+ const changed = card.strip.filter((r) => r.changed);
251
+ const example = changed[0] ? `${changed[0].element} goes ${changed[0].before} → ${changed[0].after}` : "";
252
+ if (bay === "non-redox") return `The strip is not flat: ${example}. An atom whose number changes has gained or lost electrons, so this is redox.`;
253
+ if (!card.redox) return `Every number on the strip stays the same, so no electron moves. A reaction with a flat strip is non-redox (here a ${card.kind}), not ${bayName(bay)}.`;
254
+ const sizes = `${card.reactants} reactant${card.reactants === 1 ? "" : "s"} and ${card.products} product${card.products === 1 ? "" : "s"}`;
255
+ switch (bay) {
256
+ case "addition": return `This card has ${sizes}; addition ends with one product. ${bayRule(card.accepted[0])}`;
257
+ case "decomposition": return `This card has ${sizes}; decomposition starts from one substance. ${bayRule(card.accepted[0])}`;
258
+ case "displacement": return `Displacement needs a free element on each side with a compound beside it. ${bayRule(card.accepted[0])}`;
259
+ case "combustion": return `Oxygen does not go from 0 to -2 here, so it is not combustion. ${bayRule(card.accepted[0])}`;
260
+ }
261
+ }
262
+ /** Why a bay is right: the rule plus the evidence on the strip. */
263
+ function whyBay(card, bay) {
264
+ if (bay === "non-redox") return `The strip is flat: no number changes, so no electron moves. This is a ${card.kind}. ${bayRule("non-redox")}`;
265
+ const changed = card.strip.filter((r) => r.changed);
266
+ const moves = changed.map((r) => `${r.element} ${r.before} → ${r.after}`).join(", ");
267
+ return `${moves}: ${card.electrons} electron${card.electrons === 1 ? "" : "s"} move. ${bayRule(bay)}`;
268
+ }
269
+ const BAY_IDS = BAYS;
270
+ const caseOf = (s, id) => s.transfers.find((c) => c.id === id);
271
+ const toggle = (list, id, on) => on ? list.includes(id) ? list : [...list, id] : list.filter((x) => x !== id);
272
+ const rolesRight = (c, roles) => Object.entries(c.truth).every(([species, role]) => roles[species] === role);
273
+ /** Keep the lists of finished cases in step with the current case after any change. */
274
+ function sync(s, st) {
275
+ const c = caseOf(s, st.caseId);
276
+ const moved = c.redox ? st.moved === c.electrons : st.refusals > 0;
277
+ const named = !c.redox || !s.showRoles || moved && rolesRight(c, st.roles);
278
+ return {
279
+ ...st,
280
+ movedCases: toggle(st.movedCases, c.id, moved),
281
+ roleCases: toggle(st.roleCases, c.id, moved && named)
282
+ };
283
+ }
284
+ const freshCase = (st, caseId) => ({
285
+ ...st,
286
+ caseId,
287
+ moved: 0,
288
+ progress: 0,
289
+ dragged: false,
290
+ refusals: 0,
291
+ roles: {},
292
+ lastRole: ""
293
+ });
294
+ function commitMove(s, st) {
295
+ const c = caseOf(s, st.caseId);
296
+ if (!c.redox) return sync(s, {
297
+ ...st,
298
+ progress: 0,
299
+ dragged: false,
300
+ refusals: st.refusals + 1
301
+ });
302
+ if (st.moved >= c.electrons) return {
303
+ ...st,
304
+ progress: 0,
305
+ dragged: false
306
+ };
307
+ return sync(s, {
308
+ ...st,
309
+ progress: 0,
310
+ dragged: false,
311
+ moved: st.moved + 1
312
+ });
313
+ }
314
+ const itemOf = (s, st) => s.drill[st.itemIndex];
315
+ const cardOf = (s, st) => s.cards[st.cardIndex];
316
+ /** The sum of every atom's oxidation number with the dial's value in for the unknown one. */
317
+ const sumAt = (item, guess) => item.knownSum + item.unknownCount * guess;
318
+ const isRight = (card, bay) => card.accepted.includes(bay);
319
+ const drillEntry = z.union([z.string().describe("the id of a built-in item, such as \"cuso4-s\""), z.object({
320
+ species: z.string().min(1).describe("the species, such as \"CuSO4\" or \"MnO4-\""),
321
+ element: z.string().min(1).describe("the element whose number is asked"),
322
+ given: z.record(z.string(), z.number().int()).optional().describe("numbers the question states")
323
+ })]);
324
+ const redoxTransferModel = defineLabModel({
325
+ id: "redox-transfer",
326
+ params: z.object({
327
+ mode: z.enum([
328
+ "demo",
329
+ "drill",
330
+ "sort"
331
+ ]).default("demo").describe("demo: carry electrons; drill: find oxidation numbers; sort: place reactions in bays"),
332
+ cases: z.array(z.string()).min(1).max(4).default([...DEFAULT_TRANSFER]).describe("demo: case ids in order. The first is the worked example, the rest are changed cases"),
333
+ drill: z.array(drillEntry).min(1).max(10).default([...DEFAULT_DRILL]).describe("drill: item ids, or { species, element, given } for an item of your own"),
334
+ cards: z.array(z.string()).min(2).max(12).default([...DEFAULT_CARDS]).describe("sort: reaction card ids in order. The last card is the unseen one"),
335
+ bays: z.array(z.enum(BAY_IDS)).min(2).max(5).default([...BAYS]).describe("sort: which bays are on the tray"),
336
+ showRoles: z.boolean().default(true).describe("demo: ask which species is the reductant and which the oxidant"),
337
+ showHalfEquations: z.boolean().default(true).describe("demo: show the two half-equations once the electrons have moved")
338
+ }),
339
+ resolve(p) {
340
+ const base = {
341
+ mode: p.mode,
342
+ bays: unique(p.bays),
343
+ showRoles: p.showRoles,
344
+ showHalfEquations: p.showHalfEquations
345
+ };
346
+ if (p.mode === "demo") {
347
+ if (unique(p.cases).length !== p.cases.length) return refuse("duplicate-case", "Each case may appear once.");
348
+ const transfers = [];
349
+ for (const id of p.cases) {
350
+ const spec = TRANSFER_CASES.find((c) => c.id === id);
351
+ if (!spec) return refuse("unknown-case", `No case "${id}". Known: ${TRANSFER_CASES.map((c) => c.id).join(", ")}.`);
352
+ const made = transferCase(spec);
353
+ if (isRefusal(made)) return made;
354
+ transfers.push(made);
355
+ }
356
+ return {
357
+ ...base,
358
+ transfers,
359
+ drill: [],
360
+ cards: []
361
+ };
362
+ }
363
+ if (p.mode === "drill") {
364
+ const drill = [];
365
+ for (const [i, entry] of p.drill.entries()) {
366
+ const spec = typeof entry === "string" ? DRILL_ITEMS.find((d) => d.id === entry) : {
367
+ id: `custom-${i + 1}`,
368
+ species: entry.species,
369
+ element: entry.element,
370
+ ...entry.given ? { given: entry.given } : {},
371
+ source: "your item"
372
+ };
373
+ if (!spec) return refuse("unknown-item", `No drill item "${String(entry)}". Known: ${DRILL_ITEMS.map((d) => d.id).join(", ")}.`);
374
+ const made = drillItem(spec);
375
+ if (isRefusal(made)) return made;
376
+ drill.push(made);
377
+ }
378
+ if (unique(drill.map((d) => d.id)).length !== drill.length) return refuse("duplicate-item", "Each drill item may appear once.");
379
+ return {
380
+ ...base,
381
+ transfers: [],
382
+ drill,
383
+ cards: []
384
+ };
385
+ }
386
+ if (unique(p.cards).length !== p.cards.length) return refuse("duplicate-card", "Each card may appear once.");
387
+ const cards = [];
388
+ for (const id of p.cards) {
389
+ const spec = SORT_CARDS.find((c) => c.id === id);
390
+ if (!spec) return refuse("unknown-card", `No card "${id}". Known: ${SORT_CARDS.map((c) => c.id).join(", ")}.`);
391
+ const made = sortCard(spec);
392
+ if (isRefusal(made)) return made;
393
+ if (!made.accepted.some((bay) => base.bays.includes(bay))) return refuse("bay-missing", `Card "${id}" belongs in ${made.accepted.join(" or ")}, which is not on the tray.`);
394
+ cards.push(made);
395
+ }
396
+ return {
397
+ ...base,
398
+ transfers: [],
399
+ drill: [],
400
+ cards
401
+ };
402
+ },
403
+ initial: (s) => ({
404
+ caseId: s.transfers[0]?.id ?? "",
405
+ moved: 0,
406
+ progress: 0,
407
+ dragged: false,
408
+ refusals: 0,
409
+ roles: {},
410
+ lastRole: "",
411
+ movedCases: [],
412
+ roleCases: [],
413
+ itemIndex: 0,
414
+ guesses: {},
415
+ solved: [],
416
+ cardIndex: 0,
417
+ placed: {},
418
+ wrong: {},
419
+ lastBay: ""
420
+ }),
421
+ controls: (c) => ({
422
+ case: c.choice({
423
+ label: "Case",
424
+ unset: true,
425
+ when: (s) => s.mode === "demo" && s.transfers.length > 1,
426
+ options: (s) => s.transfers.map((t) => ({
427
+ value: t.id,
428
+ label: t.name
429
+ })),
430
+ get: (st) => st.caseId,
431
+ set: (st, id, s) => sync(s, freshCase(st, id))
432
+ }),
433
+ electron: c.number({
434
+ label: "Electron",
435
+ when: (s, st) => {
436
+ if (s.mode !== "demo") return false;
437
+ const t = s.transfers.find((c) => c.id === st.caseId);
438
+ return !t ? false : t.redox ? st.moved < t.electrons : st.refusals === 0;
439
+ },
440
+ step: .25,
441
+ range: () => [0, 1],
442
+ get: (st) => st.progress,
443
+ set: (st, v) => ({
444
+ ...st,
445
+ progress: v,
446
+ dragged: st.dragged || v > 0
447
+ }),
448
+ format: (v) => v >= .65 ? "over the acceptor" : v > 0 ? "on its way" : "on the donor"
449
+ }),
450
+ move: c.action({
451
+ label: "Move the electron",
452
+ when: (s, st) => {
453
+ if (s.mode !== "demo") return false;
454
+ const t = s.transfers.find((c) => c.id === st.caseId);
455
+ return !t ? false : t.redox ? st.moved < t.electrons : st.refusals === 0;
456
+ },
457
+ run: (s, st) => commitMove(s, st)
458
+ }),
459
+ undo: c.action({
460
+ label: "Undo",
461
+ when: (s, st) => s.mode === "demo" && Boolean(s.transfers.find((c) => c.id === st.caseId)?.redox),
462
+ enabled: (_s, st) => st.moved > 0,
463
+ run: (s, st) => {
464
+ const roles = {};
465
+ return sync(s, {
466
+ ...st,
467
+ moved: st.moved - 1,
468
+ progress: 0,
469
+ dragged: false,
470
+ roles,
471
+ lastRole: ""
472
+ });
473
+ }
474
+ }),
475
+ role: c.choice({
476
+ label: "Role",
477
+ unset: true,
478
+ when: (s, st) => {
479
+ if (s.mode !== "demo" || !s.showRoles) return false;
480
+ const t = s.transfers.find((c) => c.id === st.caseId);
481
+ return Boolean(t?.redox) && st.moved === t.electrons;
482
+ },
483
+ options: (s, st) => {
484
+ const t = s.transfers.find((c) => c.id === st.caseId);
485
+ return Object.keys(t?.truth ?? {}).flatMap((species) => ["reductant", "oxidant"].map((role) => ({
486
+ value: `${species}:${role}`,
487
+ label: `${formulaDisplayText(species)} is the ${role}`
488
+ })));
489
+ },
490
+ get: (st) => st.lastRole,
491
+ set: (st, value, s) => {
492
+ const [species = "", role = ""] = value.split(":");
493
+ if (role !== "reductant" && role !== "oxidant") return st;
494
+ return sync(s, {
495
+ ...st,
496
+ roles: {
497
+ ...st.roles,
498
+ [species]: role
499
+ },
500
+ lastRole: value
501
+ });
502
+ }
503
+ }),
504
+ guess: c.number({
505
+ label: "Oxidation number x",
506
+ symbol: "x",
507
+ when: (s) => s.mode === "drill",
508
+ step: 1,
509
+ bigStep: 4,
510
+ range: () => GUESS_RANGE,
511
+ get: (st, s) => s.drill[st.itemIndex] ? st.guesses[itemOf(s, st).id] ?? 0 : 0,
512
+ set: (st, v, s) => {
513
+ const item = itemOf(s, st);
514
+ if (st.solved.includes(item.id)) return st;
515
+ return {
516
+ ...st,
517
+ guesses: {
518
+ ...st.guesses,
519
+ [item.id]: v
520
+ },
521
+ solved: toggle(st.solved, item.id, v === item.answer)
522
+ };
523
+ },
524
+ format: (v) => signed(v)
525
+ }),
526
+ bay: c.choice({
527
+ label: "Bay",
528
+ unset: true,
529
+ when: (s) => s.mode === "sort",
530
+ options: (s) => s.bays.map((b) => ({
531
+ value: b,
532
+ label: bayName(b)
533
+ })),
534
+ get: (st, s) => s.cards[st.cardIndex] ? st.placed[cardOf(s, st).id] ?? st.lastBay : "",
535
+ set: (st, bay, s) => {
536
+ const card = cardOf(s, st);
537
+ if (st.placed[card.id]) return st;
538
+ const chosen = bay;
539
+ if (isRight(card, chosen)) return {
540
+ ...st,
541
+ placed: {
542
+ ...st.placed,
543
+ [card.id]: chosen
544
+ },
545
+ lastBay: chosen
546
+ };
547
+ return {
548
+ ...st,
549
+ wrong: {
550
+ ...st.wrong,
551
+ [card.id]: [...st.wrong[card.id] ?? [], chosen]
552
+ },
553
+ lastBay: chosen
554
+ };
555
+ }
556
+ }),
557
+ next: c.action({
558
+ label: (s) => s.mode === "drill" ? "Next atom" : "Next card",
559
+ when: (s) => s.mode !== "demo",
560
+ enabled: (s, st) => s.mode === "drill" ? s.drill.length > 0 && st.solved.includes(itemOf(s, st).id) && st.itemIndex < s.drill.length - 1 : s.cards.length > 0 && Boolean(st.placed[cardOf(s, st).id]) && st.cardIndex < s.cards.length - 1,
561
+ run: (s, st) => s.mode === "drill" ? {
562
+ ...st,
563
+ itemIndex: st.itemIndex + 1
564
+ } : {
565
+ ...st,
566
+ cardIndex: st.cardIndex + 1,
567
+ lastBay: ""
568
+ }
569
+ })
570
+ }),
571
+ actions: {
572
+ /**
573
+ * Let go of the bead. A tap (the bead never left its place) or a drop past `DROP_AT` moves the
574
+ * electron; a drag let go short of the other atom springs back.
575
+ */
576
+ release: (s, st) => !st.dragged || st.progress >= .65 ? commitMove(s, st) : {
577
+ ...st,
578
+ progress: 0,
579
+ dragged: false
580
+ },
581
+ "show-case": (s, st, id) => typeof id === "string" && s.transfers.some((t) => t.id === id) ? sync(s, freshCase(st, id)) : st,
582
+ "show-card": (s, st, id) => {
583
+ const index = s.cards.findIndex((c) => c.id === id);
584
+ return index < 0 ? st : {
585
+ ...st,
586
+ cardIndex: index,
587
+ lastBay: ""
588
+ };
589
+ }
590
+ },
591
+ read(s, st) {
592
+ const first = s.transfers[0]?.id;
593
+ const lastCard = s.cards.length - 1;
594
+ const demo = (() => {
595
+ if (s.mode !== "demo") return null;
596
+ const c = caseOf(s, st.caseId);
597
+ const m = c.redox ? st.moved : 0;
598
+ const atoms = (plan, side) => plan ? Array.from({ length: plan.count }, (_, i) => {
599
+ const done = Math.min(plan.each, Math.max(0, m - i * plan.each));
600
+ const charge = side === "donor" ? done : -done;
601
+ return {
602
+ key: `${side}-${i}`,
603
+ symbol: plan.symbol,
604
+ charge,
605
+ onFrom: plan.from,
606
+ onNow: charge,
607
+ onTo: plan.to,
608
+ shells: shellCounts(plan.Z, charge).join(","),
609
+ outer: plan.outer,
610
+ moved: done,
611
+ each: plan.each
612
+ };
613
+ }) : [];
614
+ const donors = atoms(c.donor, "donor");
615
+ const acceptors = atoms(c.acceptor, "acceptor");
616
+ const complete = c.redox ? st.moved === c.electrons : st.refusals > 0;
617
+ const next = c.redox && c.donor && c.acceptor && st.moved < c.electrons ? {
618
+ donor: Math.floor(st.moved / c.donor.each),
619
+ acceptor: Math.floor(st.moved / c.acceptor.each)
620
+ } : null;
621
+ const roles = Object.entries(c.truth).map(([species, truth]) => {
622
+ const assigned = st.roles[species] ?? null;
623
+ return {
624
+ species,
625
+ label: formulaDisplayText(species),
626
+ truth,
627
+ assigned,
628
+ ok: assigned === truth
629
+ };
630
+ });
631
+ const rolesDone = !c.redox || !s.showRoles ? complete : complete && roles.every((r) => r.ok);
632
+ const wrongRoles = roles.filter((r) => r.assigned && !r.ok);
633
+ const donorName = c.donor ? formulaDisplayText(c.donor.species) : "";
634
+ const acceptorName = c.acceptor ? formulaDisplayText(c.acceptor.species) : "";
635
+ const roleFeedback = wrongRoles.length ? `${wrongRoles.map((r) => `${r.label} ${r.truth === "reductant" ? "gave" : "took"} electrons`).join(" and ")}, so ${wrongRoles.length === 1 ? "it is" : "they are"} the ${wrongRoles[0].truth}. The reductant gives electrons and is oxidised; the oxidant takes them and is reduced.` : "";
636
+ const gap = c.redox && !complete ? st.moved === 0 ? `No electron has moved yet. ${c.donor.count * c.donor.each} must pass from ${c.donor.symbol} to ${c.acceptor.symbol}.` : `${st.moved} of ${c.electrons} electrons have moved, so ${c.donor.symbol} is not yet fully ${ionText(c.donor.symbol, c.donor.each)} and ${c.acceptor.symbol} is not yet ${ionText(c.acceptor.symbol, -c.acceptor.each)}. ${c.electrons - st.moved} more must move.` : "";
637
+ const refusalWhy = !c.redox && st.refusals > 0 ? `No electron can move: ${c.strip.map((r) => `${r.element} stays ${r.before}`).join(", ")}. With no number changing there is nothing to give and nothing to take. ${c.id === "neutralisation" ? "This is a neutralisation: H⁺ + OH⁻ → H₂O." : ""}`.trim() : "";
638
+ const insight = c.redox ? `Electrons lost = electrons gained = ${c.electrons}. ${donorName} is oxidised (number up, ${signed(c.donor.from)} → ${signed(c.donor.to)}); ${acceptorName} is reduced (number down, ${signed(c.acceptor.from)} → ${signed(c.acceptor.to)}). Neither half can happen alone.` : "";
639
+ return {
640
+ case: c,
641
+ complete,
642
+ electrons: c.electrons,
643
+ moved: st.moved,
644
+ progress: st.progress,
645
+ donors,
646
+ acceptors,
647
+ next,
648
+ roles,
649
+ rolesDone,
650
+ roleFeedback,
651
+ gap,
652
+ refusalWhy,
653
+ insight,
654
+ halves: c.halves && s.showHalfEquations && complete ? c.halves : null,
655
+ /** The worked example gets a dashed place for the electron; changed cases do not. */
656
+ guided: st.caseId === first,
657
+ refusals: st.refusals,
658
+ simultaneous: c.redox && complete
659
+ };
660
+ })();
661
+ const drill = (() => {
662
+ if (s.mode !== "drill") return null;
663
+ const item = itemOf(s, st);
664
+ const touched = item.id in st.guesses;
665
+ const guess = st.guesses[item.id] ?? 0;
666
+ const sum = sumAt(item, guess);
667
+ const off = sum - item.charge;
668
+ const solved = st.solved.includes(item.id);
669
+ const off0 = off === 0;
670
+ return {
671
+ item,
672
+ index: st.itemIndex,
673
+ total: s.drill.length,
674
+ guess,
675
+ touched,
676
+ sum,
677
+ target: item.charge,
678
+ off,
679
+ balanced: off0,
680
+ solved,
681
+ solvedCount: st.solved.length,
682
+ allSolved: s.drill.every((d) => st.solved.includes(d.id)),
683
+ /** Degrees, positive = right pan down. The sum is on the left pan, the charge on the right. */
684
+ tilt: Math.max(-16, Math.min(16, (item.charge - sum) * 4)),
685
+ hint: touched && !solved ? off > 0 ? `The sum reads ${signed(off)} too high: turn x down by ${Math.ceil(off / item.unknownCount)}.` : `The sum reads ${signed(off)} too low: turn x up by ${Math.ceil(-off / item.unknownCount)}.` : "",
686
+ valencyNote: "Oxidation number is not valency: it carries a sign, can be zero, and changes with the compound (book p150)."
687
+ };
688
+ })();
689
+ const sort = (() => {
690
+ if (s.mode !== "sort") return null;
691
+ const card = cardOf(s, st);
692
+ const placedBay = st.placed[card.id] ?? null;
693
+ const wrong = st.wrong[card.id] ?? [];
694
+ const wrongNow = !placedBay && st.lastBay ? st.lastBay : null;
695
+ const placedCount = s.cards.filter((c) => st.placed[c.id]).length;
696
+ const lastWrong = wrongNow ? explainBay(card, wrongNow) : "";
697
+ return {
698
+ card,
699
+ index: st.cardIndex,
700
+ total: s.cards.length,
701
+ placedBay,
702
+ wrong,
703
+ wrongNow,
704
+ explanation: wrongNow ? lastWrong : placedBay ? whyBay(card, placedBay) : "",
705
+ placedCount,
706
+ isUnseen: st.cardIndex === lastCard,
707
+ done: s.cards.every((c) => st.placed[c.id]),
708
+ bookNote: placedBay ? card.bookNote ?? "" : "",
709
+ /** Cards already in a bay, by bay, for the stacks on the tray. */
710
+ stacks: s.bays.map((bay) => ({
711
+ bay,
712
+ cards: s.cards.filter((c) => st.placed[c.id] === bay).map((c) => c.id)
713
+ }))
714
+ };
715
+ })();
716
+ const rest = s.transfers.slice(1);
717
+ const everyCaseDone = (ids) => ids.every((id) => st.movedCases.includes(id) && st.roleCases.includes(id));
718
+ const goalFlags = {
719
+ transfer: s.mode !== "demo" || first !== undefined && st.movedCases.includes(first),
720
+ roles: s.mode !== "demo" || first !== undefined && st.roleCases.includes(first),
721
+ changed: s.mode === "demo" ? everyCaseDone(rest.map((c) => c.id)) : s.mode === "sort" ? Boolean(st.placed[s.cards[lastCard].id]) : true,
722
+ number: s.mode !== "drill" || s.drill.every((d) => st.solved.includes(d.id)),
723
+ sort: s.mode !== "sort" || s.cards.slice(0, lastCard).every((c) => st.placed[c.id])
724
+ };
725
+ return {
726
+ mode: s.mode,
727
+ demo,
728
+ drill,
729
+ sort,
730
+ goalFlags
731
+ };
732
+ },
733
+ goals: {
734
+ transfer: (r) => r.goalFlags.transfer,
735
+ roles: (r) => r.goalFlags.roles,
736
+ changed: (r) => r.goalFlags.changed,
737
+ number: (r) => r.goalFlags.number,
738
+ sort: (r) => r.goalFlags.sort,
739
+ /** One case finished (moved and named), or every case when no `case` argument is given. */
740
+ caseDone: (r, st, s, args) => {
741
+ if (s.mode !== "demo") return true;
742
+ const ids = args?.case !== undefined ? [String(args.case)] : s.transfers.map((c) => c.id);
743
+ return ids.every((id) => st.movedCases.includes(id) && st.roleCases.includes(id));
744
+ }
745
+ },
746
+ witness: (s) => {
747
+ const start = {
748
+ caseId: s.transfers[0]?.id ?? "",
749
+ moved: 0,
750
+ progress: 0,
751
+ dragged: false,
752
+ refusals: 0,
753
+ roles: {},
754
+ lastRole: "",
755
+ movedCases: [],
756
+ roleCases: [],
757
+ itemIndex: 0,
758
+ guesses: {},
759
+ solved: [],
760
+ cardIndex: 0,
761
+ placed: {},
762
+ wrong: {},
763
+ lastBay: ""
764
+ };
765
+ if (s.mode === "drill") return {
766
+ ...start,
767
+ itemIndex: s.drill.length - 1,
768
+ guesses: Object.fromEntries(s.drill.map((d) => [d.id, d.answer])),
769
+ solved: s.drill.map((d) => d.id)
770
+ };
771
+ if (s.mode === "sort") return {
772
+ ...start,
773
+ cardIndex: s.cards.length - 1,
774
+ placed: Object.fromEntries(s.cards.map((c) => [c.id, c.accepted.find((b) => s.bays.includes(b))]))
775
+ };
776
+ const last = s.transfers.at(-1);
777
+ return {
778
+ ...start,
779
+ caseId: last.id,
780
+ moved: last.electrons,
781
+ refusals: last.redox ? 0 : 1,
782
+ roles: { ...last.truth },
783
+ movedCases: s.transfers.map((t) => t.id),
784
+ roleCases: s.transfers.map((t) => t.id)
785
+ };
786
+ },
787
+ describe(s, _st, r) {
788
+ if (r.demo) {
789
+ const d = r.demo;
790
+ const c = d.case;
791
+ if (!c.redox) return `${c.display}. ${d.refusals > 0 ? d.refusalWhy : "No oxidation number changes. Try to move an electron."}`;
792
+ if (!d.complete) return `${c.display}. ${d.moved} of ${d.electrons} electrons moved. ${d.gap}`;
793
+ const roleLine = d.rolesDone ? d.insight : s.showRoles ? "Name the reductant and the oxidant." : "";
794
+ return `${c.display}. All ${d.electrons} electrons moved. ${roleLine} ${d.halves ? `${d.halves.oxidation}; ${d.halves.reduction}.` : ""}`.trim();
795
+ }
796
+ if (r.drill) {
797
+ const d = r.drill;
798
+ const it = d.item;
799
+ return `Item ${d.index + 1} of ${d.total}: the oxidation number of ${it.element} in ${it.display}${Object.keys(it.given).length ? `, given ${Object.entries(it.given).map(([e, n]) => `${e} ${signed(n)}`).join(", ")}` : ""}. x is ${signed(d.guess)}; the numbers add to ${signed(d.sum)} and the charge is ${signed(d.target)}. ${d.solved ? `Balanced: ${it.working}.` : d.hint}`.trim();
800
+ }
801
+ const sr = r.sort;
802
+ return `Card ${sr.index + 1} of ${sr.total}: ${sr.card.display}. ${sr.placedBay ? `In ${bayName(sr.placedBay)}. ${sr.explanation}` : sr.wrongNow ? `Not ${bayName(sr.wrongNow)}. ${sr.explanation}` : "Read the strip, then choose a bay."}`;
803
+ }
804
+ });
805
+
806
+ //#endregion
807
+ export { DROP_AT, GUESS_RANGE, bayName, bayRule, displayEquation, explainBay, redoxTransferModel, signed, sumAt, whyBay };