@classytic/stage 0.2.0 → 0.4.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 (458) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +5 -1
  3. package/dist/_virtual/_rolldown/runtime.mjs +18 -0
  4. package/dist/assets/index.mjs +0 -1
  5. package/dist/atomic/aufbau.d.mts +144 -0
  6. package/dist/atomic/aufbau.mjs +384 -0
  7. package/dist/atomic/elements.d.mts +67 -0
  8. package/dist/atomic/elements.mjs +785 -0
  9. package/dist/atomic/emission.d.mts +112 -0
  10. package/dist/atomic/emission.mjs +179 -0
  11. package/dist/atomic/index.d.mts +8 -0
  12. package/dist/atomic/index.mjs +9 -0
  13. package/dist/atomic/periodic.d.mts +82 -0
  14. package/dist/atomic/periodic.mjs +231 -0
  15. package/dist/atomic/properties.d.mts +100 -0
  16. package/dist/atomic/properties.mjs +574 -0
  17. package/dist/atomic/shells.d.mts +137 -0
  18. package/dist/atomic/shells.mjs +170 -0
  19. package/dist/atomic/trends.d.mts +148 -0
  20. package/dist/atomic/trends.mjs +225 -0
  21. package/dist/builder/Palette.mjs +50 -89
  22. package/dist/builder/SceneBuilder.mjs +15 -73
  23. package/dist/chem/chromatography.d.mts +66 -0
  24. package/dist/chem/chromatography.mjs +63 -0
  25. package/dist/chem/complex.d.mts +114 -0
  26. package/dist/chem/complex.mjs +234 -0
  27. package/dist/chem/cycle.d.mts +75 -0
  28. package/dist/chem/cycle.mjs +145 -0
  29. package/dist/chem/equation.d.mts +86 -0
  30. package/dist/chem/equation.mjs +168 -0
  31. package/dist/chem/formula.d.mts +90 -0
  32. package/dist/chem/formula.mjs +201 -0
  33. package/dist/chem/functional-groups.d.mts +31 -0
  34. package/dist/chem/functional-groups.mjs +187 -0
  35. package/dist/chem/hazard.d.mts +94 -0
  36. package/dist/chem/hazard.mjs +329 -0
  37. package/dist/chem/index.d.mts +34 -33
  38. package/dist/chem/index.mjs +34 -28
  39. package/dist/chem/ionic.d.mts +98 -0
  40. package/dist/chem/ionic.mjs +156 -0
  41. package/dist/chem/layout.d.mts +46 -0
  42. package/dist/chem/layout.mjs +342 -0
  43. package/dist/chem/lewis.d.mts +79 -0
  44. package/dist/chem/lewis.mjs +163 -0
  45. package/dist/chem/molecular-orbital.d.mts +114 -0
  46. package/dist/chem/molecular-orbital.mjs +201 -0
  47. package/dist/chem/molecule.d.mts +154 -0
  48. package/dist/chem/molecule.mjs +282 -0
  49. package/dist/chem/nmr.d.mts +153 -0
  50. package/dist/chem/nmr.mjs +165 -0
  51. package/dist/chem/polymer.d.mts +65 -0
  52. package/dist/chem/polymer.mjs +179 -0
  53. package/dist/chem/redox.d.mts +138 -0
  54. package/dist/chem/redox.mjs +328 -0
  55. package/dist/chem/relations.d.mts +183 -0
  56. package/dist/chem/relations.mjs +299 -0
  57. package/dist/chem/skeleton.d.mts +51 -0
  58. package/dist/chem/skeleton.mjs +186 -0
  59. package/dist/chem/solution.d.mts +116 -0
  60. package/dist/chem/solution.mjs +186 -0
  61. package/dist/chem/species.d.mts +47 -0
  62. package/dist/chem/species.mjs +128 -0
  63. package/dist/chem/stereo.d.mts +108 -0
  64. package/dist/chem/stereo.mjs +286 -0
  65. package/dist/chem/stoichiometry.d.mts +95 -0
  66. package/dist/chem/stoichiometry.mjs +145 -0
  67. package/dist/chem/synthesis.d.mts +113 -0
  68. package/dist/chem/synthesis.mjs +281 -0
  69. package/dist/chem/vsepr.d.mts +80 -0
  70. package/dist/chem/vsepr.mjs +247 -0
  71. package/dist/circuit/ac.d.mts +163 -0
  72. package/dist/circuit/ac.mjs +452 -0
  73. package/dist/circuit/dc.d.mts +92 -0
  74. package/dist/circuit/dc.mjs +333 -0
  75. package/dist/circuit/index.d.mts +5 -92
  76. package/dist/circuit/index.mjs +5 -332
  77. package/dist/circuit/network.d.mts +99 -0
  78. package/dist/circuit/network.mjs +440 -0
  79. package/dist/circuit/topology.d.mts +102 -0
  80. package/dist/circuit/topology.mjs +143 -0
  81. package/dist/colour/absorption.d.mts +79 -0
  82. package/dist/colour/absorption.mjs +137 -0
  83. package/dist/colour/index.d.mts +6 -0
  84. package/dist/colour/index.mjs +7 -0
  85. package/dist/colour/name.d.mts +14 -0
  86. package/dist/colour/name.mjs +76 -0
  87. package/dist/colour/observer.d.mts +31 -0
  88. package/dist/colour/observer.mjs +46 -0
  89. package/dist/colour/spectrum.d.mts +61 -0
  90. package/dist/colour/spectrum.mjs +108 -0
  91. package/dist/colour/srgb.d.mts +49 -0
  92. package/dist/colour/srgb.mjs +108 -0
  93. package/dist/core/constants.d.mts +138 -0
  94. package/dist/core/constants.mjs +139 -0
  95. package/dist/core/index.d.mts +4 -1
  96. package/dist/core/index.mjs +4 -1
  97. package/dist/core/math.d.mts +26 -0
  98. package/dist/core/math.mjs +37 -0
  99. package/dist/core/vec3.d.mts +94 -0
  100. package/dist/core/vec3.mjs +123 -0
  101. package/dist/core/worked.d.mts +35 -0
  102. package/dist/core/worked.mjs +44 -0
  103. package/dist/electro/cell.d.mts +102 -0
  104. package/dist/electro/cell.mjs +170 -0
  105. package/dist/electro/conductivity.d.mts +157 -0
  106. package/dist/electro/conductivity.mjs +156 -0
  107. package/dist/electro/couples.d.mts +114 -0
  108. package/dist/electro/couples.mjs +334 -0
  109. package/dist/electro/electrolysis.d.mts +96 -0
  110. package/dist/electro/electrolysis.mjs +274 -0
  111. package/dist/electro/faraday.d.mts +150 -0
  112. package/dist/electro/faraday.mjs +118 -0
  113. package/dist/electro/index.d.mts +6 -0
  114. package/dist/electro/index.mjs +7 -0
  115. package/dist/finance/accounting/adjustments.d.mts +17 -0
  116. package/dist/finance/accounting/adjustments.mjs +202 -0
  117. package/dist/finance/accounting/analysis.d.mts +8 -0
  118. package/dist/finance/accounting/analysis.mjs +205 -0
  119. package/dist/finance/accounting/clubs.d.mts +21 -0
  120. package/dist/finance/accounting/clubs.mjs +217 -0
  121. package/dist/finance/accounting/company-statements.d.mts +7 -0
  122. package/dist/finance/accounting/company-statements.mjs +150 -0
  123. package/dist/finance/accounting/harness.d.mts +7 -0
  124. package/dist/finance/accounting/harness.mjs +45 -0
  125. package/dist/finance/accounting/index.d.mts +18 -0
  126. package/dist/finance/accounting/index.mjs +18 -0
  127. package/dist/finance/accounting/journalize.d.mts +16 -0
  128. package/dist/finance/accounting/journalize.mjs +128 -0
  129. package/dist/finance/accounting/manufacturing.d.mts +8 -0
  130. package/dist/finance/accounting/manufacturing.mjs +236 -0
  131. package/dist/finance/accounting/partnership.d.mts +7 -0
  132. package/dist/finance/accounting/partnership.mjs +152 -0
  133. package/dist/finance/accounting/period-case.d.mts +6 -0
  134. package/dist/finance/accounting/period-case.mjs +71 -0
  135. package/dist/finance/accounting/post.d.mts +9 -0
  136. package/dist/finance/accounting/post.mjs +84 -0
  137. package/dist/finance/accounting/precision.d.mts +9 -0
  138. package/dist/finance/accounting/precision.mjs +15 -0
  139. package/dist/finance/accounting/rules.d.mts +21 -0
  140. package/dist/finance/accounting/rules.mjs +37 -0
  141. package/dist/finance/accounting/solve.d.mts +28 -0
  142. package/dist/finance/accounting/solve.mjs +92 -0
  143. package/dist/finance/accounting/statements.d.mts +7 -0
  144. package/dist/finance/accounting/statements.mjs +142 -0
  145. package/dist/finance/accounting/types.d.mts +649 -0
  146. package/dist/finance/accounting/validate.d.mts +7 -0
  147. package/dist/finance/accounting/validate.mjs +67 -0
  148. package/dist/finance/accounting/verification.d.mts +24 -0
  149. package/dist/finance/accounting/verification.mjs +386 -0
  150. package/dist/finance/bizsim.d.mts +75 -0
  151. package/dist/finance/bizsim.mjs +296 -0
  152. package/dist/finance/index.d.mts +95 -0
  153. package/dist/finance/index.mjs +145 -0
  154. package/dist/finance/investment-math.d.mts +7 -0
  155. package/dist/finance/investment-math.mjs +18 -0
  156. package/dist/finance/management-accounting/budgeting.d.mts +7 -0
  157. package/dist/finance/management-accounting/budgeting.mjs +189 -0
  158. package/dist/finance/management-accounting/cash-budget.d.mts +7 -0
  159. package/dist/finance/management-accounting/cash-budget.mjs +154 -0
  160. package/dist/finance/management-accounting/costing.d.mts +8 -0
  161. package/dist/finance/management-accounting/costing.mjs +175 -0
  162. package/dist/finance/management-accounting/decisions.d.mts +8 -0
  163. package/dist/finance/management-accounting/decisions.mjs +164 -0
  164. package/dist/finance/management-accounting/index.d.mts +13 -0
  165. package/dist/finance/management-accounting/index.mjs +13 -0
  166. package/dist/finance/management-accounting/integrated-budget.d.mts +8 -0
  167. package/dist/finance/management-accounting/integrated-budget.mjs +67 -0
  168. package/dist/finance/management-accounting/inventory-costing.d.mts +7 -0
  169. package/dist/finance/management-accounting/inventory-costing.mjs +173 -0
  170. package/dist/finance/management-accounting/investment-appraisal.d.mts +7 -0
  171. package/dist/finance/management-accounting/investment-appraisal.mjs +148 -0
  172. package/dist/finance/management-accounting/management-case.d.mts +8 -0
  173. package/dist/finance/management-accounting/management-case.mjs +91 -0
  174. package/dist/finance/management-accounting/master-budget.d.mts +7 -0
  175. package/dist/finance/management-accounting/master-budget.mjs +137 -0
  176. package/dist/finance/management-accounting/production-costing.d.mts +8 -0
  177. package/dist/finance/management-accounting/production-costing.mjs +214 -0
  178. package/dist/finance/management-accounting/types.d.mts +644 -0
  179. package/dist/finance/management-accounting/variances.d.mts +7 -0
  180. package/dist/finance/management-accounting/variances.mjs +150 -0
  181. package/dist/index.d.mts +9 -8
  182. package/dist/index.mjs +5 -5
  183. package/dist/interaction/MovableDot.mjs +19 -0
  184. package/dist/interaction/useDraggable.mjs +24 -4
  185. package/dist/math/analysis.d.mts +61 -0
  186. package/dist/math/analysis.mjs +187 -0
  187. package/dist/math/answer-check.d.mts +50 -0
  188. package/dist/math/answer-check.mjs +106 -0
  189. package/dist/math/calculus.d.mts +17 -1
  190. package/dist/math/calculus.mjs +365 -2
  191. package/dist/math/complex.d.mts +93 -0
  192. package/dist/math/complex.mjs +239 -0
  193. package/dist/math/expr.d.mts +23 -0
  194. package/dist/math/expr.mjs +36 -0
  195. package/dist/math/index.d.mts +9 -23
  196. package/dist/math/index.mjs +9 -38
  197. package/dist/math/latex.mjs +10 -1
  198. package/dist/math/parse.mjs +1 -1
  199. package/dist/math/poly.d.mts +55 -0
  200. package/dist/math/poly.mjs +273 -0
  201. package/dist/math/rearrange.d.mts +14 -0
  202. package/dist/math/rearrange.mjs +125 -0
  203. package/dist/math/solve.d.mts +21 -0
  204. package/dist/math/solve.mjs +75 -0
  205. package/dist/networking/addressing.d.mts +26 -0
  206. package/dist/networking/addressing.mjs +33 -0
  207. package/dist/networking/cloud/access.d.mts +36 -0
  208. package/dist/networking/cloud/access.mjs +95 -0
  209. package/dist/networking/cloud/containers.d.mts +43 -0
  210. package/dist/networking/cloud/containers.mjs +54 -0
  211. package/dist/networking/cloud/edge.d.mts +17 -0
  212. package/dist/networking/cloud/edge.mjs +31 -0
  213. package/dist/networking/cloud/failure-domains.d.mts +19 -0
  214. package/dist/networking/cloud/failure-domains.mjs +22 -0
  215. package/dist/networking/cloud/geo-routing.d.mts +22 -0
  216. package/dist/networking/cloud/geo-routing.mjs +64 -0
  217. package/dist/networking/cloud/index.d.mts +18 -0
  218. package/dist/networking/cloud/index.mjs +19 -0
  219. package/dist/networking/cloud/inference-reliability.d.mts +30 -0
  220. package/dist/networking/cloud/inference-reliability.mjs +76 -0
  221. package/dist/networking/cloud/inference.d.mts +118 -0
  222. package/dist/networking/cloud/inference.mjs +179 -0
  223. package/dist/networking/cloud/infrastructure.d.mts +45 -0
  224. package/dist/networking/cloud/infrastructure.mjs +96 -0
  225. package/dist/networking/cloud/observability.d.mts +24 -0
  226. package/dist/networking/cloud/observability.mjs +34 -0
  227. package/dist/networking/cloud/orchestration.d.mts +32 -0
  228. package/dist/networking/cloud/orchestration.mjs +38 -0
  229. package/dist/networking/cloud/recovery.d.mts +21 -0
  230. package/dist/networking/cloud/recovery.mjs +27 -0
  231. package/dist/networking/cloud/releases.d.mts +42 -0
  232. package/dist/networking/cloud/releases.mjs +135 -0
  233. package/dist/networking/cloud/scaling.d.mts +25 -0
  234. package/dist/networking/cloud/scaling.mjs +65 -0
  235. package/dist/networking/cloud/secrets.d.mts +39 -0
  236. package/dist/networking/cloud/secrets.mjs +68 -0
  237. package/dist/networking/cloud/server-deployment.d.mts +29 -0
  238. package/dist/networking/cloud/server-deployment.mjs +72 -0
  239. package/dist/networking/cloud/storage.d.mts +16 -0
  240. package/dist/networking/cloud/storage.mjs +58 -0
  241. package/dist/networking/cloud/vpc.d.mts +18 -0
  242. package/dist/networking/cloud/vpc.mjs +100 -0
  243. package/dist/networking/delivery.d.mts +34 -0
  244. package/dist/networking/delivery.mjs +52 -0
  245. package/dist/networking/index.d.mts +47 -0
  246. package/dist/networking/index.mjs +47 -0
  247. package/dist/networking/ipv6.d.mts +28 -0
  248. package/dist/networking/ipv6.mjs +17 -0
  249. package/dist/networking/journeys.d.mts +83 -0
  250. package/dist/networking/journeys.mjs +161 -0
  251. package/dist/networking/models/airtime.d.mts +87 -0
  252. package/dist/networking/models/airtime.mjs +130 -0
  253. package/dist/networking/models/cellular.d.mts +157 -0
  254. package/dist/networking/models/cellular.mjs +252 -0
  255. package/dist/networking/models/encapsulation.d.mts +98 -0
  256. package/dist/networking/models/encapsulation.mjs +132 -0
  257. package/dist/networking/models/handover.d.mts +116 -0
  258. package/dist/networking/models/handover.mjs +209 -0
  259. package/dist/networking/models/handshake.d.mts +90 -0
  260. package/dist/networking/models/handshake.mjs +122 -0
  261. package/dist/networking/models/index.d.mts +14 -0
  262. package/dist/networking/models/index.mjs +15 -0
  263. package/dist/networking/models/media.d.mts +82 -0
  264. package/dist/networking/models/media.mjs +188 -0
  265. package/dist/networking/models/satellite.d.mts +86 -0
  266. package/dist/networking/models/satellite.mjs +121 -0
  267. package/dist/networking/models/spectrum.d.mts +83 -0
  268. package/dist/networking/models/spectrum.mjs +235 -0
  269. package/dist/networking/models/switch.d.mts +80 -0
  270. package/dist/networking/models/switch.mjs +155 -0
  271. package/dist/networking/models/vlan.d.mts +62 -0
  272. package/dist/networking/models/vlan.mjs +100 -0
  273. package/dist/networking/models/vpn.d.mts +66 -0
  274. package/dist/networking/models/vpn.mjs +125 -0
  275. package/dist/networking/models/wifi-privacy.d.mts +82 -0
  276. package/dist/networking/models/wifi-privacy.mjs +130 -0
  277. package/dist/networking/models/wifi.d.mts +240 -0
  278. package/dist/networking/models/wifi.mjs +562 -0
  279. package/dist/networking/nat-traversal.d.mts +24 -0
  280. package/dist/networking/nat-traversal.mjs +38 -0
  281. package/dist/networking/protocols.d.mts +17 -0
  282. package/dist/networking/protocols.mjs +57 -0
  283. package/dist/networking/queue.d.mts +12 -0
  284. package/dist/networking/queue.mjs +18 -0
  285. package/dist/networking/route-learning.d.mts +23 -0
  286. package/dist/networking/route-learning.mjs +43 -0
  287. package/dist/networking/routing.d.mts +11 -0
  288. package/dist/networking/routing.mjs +25 -0
  289. package/dist/networking/signals.d.mts +26 -0
  290. package/dist/networking/signals.mjs +35 -0
  291. package/dist/networking/subnet.d.mts +49 -0
  292. package/dist/networking/subnet.mjs +89 -0
  293. package/dist/networking/tcp-reliability.d.mts +24 -0
  294. package/dist/networking/tcp-reliability.mjs +38 -0
  295. package/dist/networking/topology/contract.d.mts +123 -0
  296. package/dist/networking/topology/index.d.mts +4 -0
  297. package/dist/networking/topology/index.mjs +4 -0
  298. package/dist/networking/topology/presets.d.mts +7 -0
  299. package/dist/networking/topology/presets.mjs +302 -0
  300. package/dist/networking/topology/simulation.d.mts +8 -0
  301. package/dist/networking/topology/simulation.mjs +179 -0
  302. package/dist/networking/wireless.d.mts +11 -0
  303. package/dist/networking/wireless.mjs +17 -0
  304. package/dist/optics/imaging.d.mts +218 -0
  305. package/dist/optics/imaging.mjs +276 -0
  306. package/dist/optics/index.d.mts +7 -0
  307. package/dist/optics/index.mjs +8 -0
  308. package/dist/optics/laws.d.mts +70 -0
  309. package/dist/optics/laws.mjs +195 -0
  310. package/dist/optics/prism.d.mts +148 -0
  311. package/dist/optics/prism.mjs +197 -0
  312. package/dist/optics/refraction.d.mts +201 -0
  313. package/dist/optics/refraction.mjs +270 -0
  314. package/dist/optics/wave-optics.d.mts +171 -0
  315. package/dist/optics/wave-optics.mjs +259 -0
  316. package/dist/physics/ac/index.d.mts +183 -0
  317. package/dist/physics/ac/index.mjs +203 -0
  318. package/dist/physics/dynamics/forces.d.mts +98 -0
  319. package/dist/physics/dynamics/forces.mjs +153 -0
  320. package/dist/physics/dynamics/friction.d.mts +76 -0
  321. package/dist/physics/dynamics/friction.mjs +119 -0
  322. package/dist/physics/dynamics/system.d.mts +68 -0
  323. package/dist/physics/dynamics/system.mjs +125 -0
  324. package/dist/physics/electrostatics/index.d.mts +169 -0
  325. package/dist/physics/electrostatics/index.mjs +249 -0
  326. package/dist/physics/energy/centre-of-mass.d.mts +115 -0
  327. package/dist/physics/energy/centre-of-mass.mjs +180 -0
  328. package/dist/physics/energy/conservation.d.mts +81 -0
  329. package/dist/physics/energy/conservation.mjs +129 -0
  330. package/dist/physics/energy/power.d.mts +90 -0
  331. package/dist/physics/energy/power.mjs +167 -0
  332. package/dist/physics/energy/spring.d.mts +73 -0
  333. package/dist/physics/energy/spring.mjs +129 -0
  334. package/dist/physics/energy/store.d.mts +63 -0
  335. package/dist/physics/energy/store.mjs +108 -0
  336. package/dist/physics/energy/theorem.d.mts +65 -0
  337. package/dist/physics/energy/theorem.mjs +113 -0
  338. package/dist/physics/energy/work.d.mts +114 -0
  339. package/dist/physics/energy/work.mjs +219 -0
  340. package/dist/physics/gravitation/body.d.mts +85 -0
  341. package/dist/physics/gravitation/body.mjs +168 -0
  342. package/dist/physics/gravitation/kepler.d.mts +127 -0
  343. package/dist/physics/gravitation/kepler.mjs +216 -0
  344. package/dist/physics/gravitation/law.d.mts +117 -0
  345. package/dist/physics/gravitation/law.mjs +175 -0
  346. package/dist/physics/gravitation/orbit.d.mts +119 -0
  347. package/dist/physics/gravitation/orbit.mjs +202 -0
  348. package/dist/physics/gravitation/potential.d.mts +114 -0
  349. package/dist/physics/gravitation/potential.mjs +202 -0
  350. package/dist/physics/gravitation/variation.d.mts +97 -0
  351. package/dist/physics/gravitation/variation.mjs +175 -0
  352. package/dist/physics/index.d.mts +35 -0
  353. package/dist/physics/index.mjs +36 -0
  354. package/dist/physics/integral-sweep.d.mts +63 -0
  355. package/dist/physics/integral-sweep.mjs +126 -0
  356. package/dist/physics/kinematics/equations.d.mts +47 -0
  357. package/dist/physics/kinematics/equations.mjs +126 -0
  358. package/dist/physics/kinematics/free-fall.d.mts +53 -0
  359. package/dist/physics/kinematics/free-fall.mjs +71 -0
  360. package/dist/physics/kinematics/given.d.mts +16 -0
  361. package/dist/physics/kinematics/given.mjs +55 -0
  362. package/dist/physics/kinematics/roots.d.mts +41 -0
  363. package/dist/physics/kinematics/roots.mjs +72 -0
  364. package/dist/physics/kinematics/solve.d.mts +52 -0
  365. package/dist/physics/kinematics/solve.mjs +172 -0
  366. package/dist/physics/magnetism/biot-savart.d.mts +161 -0
  367. package/dist/physics/magnetism/biot-savart.mjs +353 -0
  368. package/dist/physics/magnetism/flux.d.mts +94 -0
  369. package/dist/physics/magnetism/flux.mjs +313 -0
  370. package/dist/physics/magnetism/geomagnetism.d.mts +151 -0
  371. package/dist/physics/magnetism/geomagnetism.mjs +184 -0
  372. package/dist/physics/magnetism/index.d.mts +12 -0
  373. package/dist/physics/magnetism/index.mjs +74 -0
  374. package/dist/physics/magnetism/lorentz.d.mts +28 -0
  375. package/dist/physics/magnetism/lorentz.mjs +88 -0
  376. package/dist/physics/magnetism/magnetic-force.d.mts +102 -0
  377. package/dist/physics/magnetism/magnetic-force.mjs +169 -0
  378. package/dist/physics/momentum/collide.d.mts +77 -0
  379. package/dist/physics/momentum/collide.mjs +115 -0
  380. package/dist/physics/momentum/impulse.d.mts +89 -0
  381. package/dist/physics/momentum/impulse.mjs +159 -0
  382. package/dist/physics/momentum/planar.d.mts +60 -0
  383. package/dist/physics/momentum/planar.mjs +110 -0
  384. package/dist/physics/projectile.d.mts +107 -0
  385. package/dist/physics/projectile.mjs +185 -0
  386. package/dist/physics/rotation/angular.d.mts +85 -0
  387. package/dist/physics/rotation/angular.mjs +130 -0
  388. package/dist/physics/rotation/circular.d.mts +79 -0
  389. package/dist/physics/rotation/circular.mjs +131 -0
  390. package/dist/physics/rotation/inertia.d.mts +164 -0
  391. package/dist/physics/rotation/inertia.mjs +332 -0
  392. package/dist/physics/rotation/torque.d.mts +65 -0
  393. package/dist/physics/rotation/torque.mjs +134 -0
  394. package/dist/physics/vectors.d.mts +64 -0
  395. package/dist/physics/vectors.mjs +114 -0
  396. package/dist/primitives/Dot.d.mts +2 -15
  397. package/dist/primitives/Dot.mjs +6 -4
  398. package/dist/primitives/Grid.d.mts +33 -17
  399. package/dist/primitives/Grid.mjs +89 -17
  400. package/dist/primitives/Label.d.mts +1 -14
  401. package/dist/primitives/Label.mjs +3 -2
  402. package/dist/primitives/Lines.d.mts +4 -32
  403. package/dist/primitives/Lines.mjs +10 -8
  404. package/dist/primitives/Shapes.d.mts +5 -43
  405. package/dist/primitives/Shapes.mjs +12 -10
  406. package/dist/primitives/index.d.mts +2 -2
  407. package/dist/primitives/index.mjs +2 -2
  408. package/dist/primitives/props.mjs +31 -0
  409. package/dist/quantity/index.d.mts +119 -0
  410. package/dist/quantity/index.mjs +417 -0
  411. package/dist/relation/derive.d.mts +74 -0
  412. package/dist/relation/derive.mjs +73 -0
  413. package/dist/relation/index.d.mts +56 -0
  414. package/dist/relation/index.mjs +234 -0
  415. package/dist/scene/Scene.d.mts +6 -1
  416. package/dist/scene/Scene.mjs +15 -40
  417. package/dist/scene/evaluators.mjs +1 -1
  418. package/dist/sim/thermal.mjs +45 -20
  419. package/dist/thermo/calorimetry.d.mts +207 -0
  420. package/dist/thermo/calorimetry.mjs +345 -0
  421. package/dist/thermo/cycles.d.mts +142 -0
  422. package/dist/thermo/cycles.mjs +256 -0
  423. package/dist/thermo/entropy.d.mts +87 -0
  424. package/dist/thermo/entropy.mjs +140 -0
  425. package/dist/thermo/expansion.d.mts +130 -0
  426. package/dist/thermo/expansion.mjs +178 -0
  427. package/dist/thermo/gas.d.mts +197 -0
  428. package/dist/thermo/gas.mjs +279 -0
  429. package/dist/thermo/heat-transfer.d.mts +164 -0
  430. package/dist/thermo/heat-transfer.mjs +217 -0
  431. package/dist/thermo/index.d.mts +9 -82
  432. package/dist/thermo/index.mjs +9 -132
  433. package/dist/thermo/processes.d.mts +95 -0
  434. package/dist/thermo/processes.mjs +154 -0
  435. package/dist/thermo/temperature.d.mts +174 -0
  436. package/dist/thermo/temperature.mjs +236 -0
  437. package/dist/view/Stage.mjs +4 -11
  438. package/dist/waves/damping.d.mts +224 -0
  439. package/dist/waves/damping.mjs +317 -0
  440. package/dist/waves/doppler.d.mts +72 -0
  441. package/dist/waves/doppler.mjs +125 -0
  442. package/dist/waves/index.d.mts +10 -0
  443. package/dist/waves/index.mjs +10 -0
  444. package/dist/waves/pendulum.d.mts +130 -0
  445. package/dist/waves/pendulum.mjs +211 -0
  446. package/dist/waves/pitch.d.mts +125 -0
  447. package/dist/waves/pitch.mjs +158 -0
  448. package/dist/waves/shm.d.mts +170 -0
  449. package/dist/waves/shm.mjs +279 -0
  450. package/dist/waves/springs.d.mts +103 -0
  451. package/dist/waves/springs.mjs +176 -0
  452. package/dist/waves/superposition.d.mts +124 -0
  453. package/dist/waves/superposition.mjs +196 -0
  454. package/dist/waves/wave.d.mts +154 -0
  455. package/dist/waves/wave.mjs +178 -0
  456. package/package.json +103 -23
  457. package/styles.css +125 -8
  458. package/dist/assets/kit/index.mjs +0 -4
@@ -0,0 +1,169 @@
1
+ declare namespace coulomb_d_exports {
2
+ export { COULOMB_CONSTANT, Contribution, ELEMENTARY_CHARGE, EPSILON_0, MIN_SEPARATION_M, PointCharge, Resultant, Vec, angleDeg, contributionsAt, coulombForce, fieldAt, forceOn, magnitude, nullPointOnAxis, potentialAt, resolve, resultant, uniformFieldVPerM, validateCharges };
3
+ }
4
+ /**
5
+ * @classytic/stage/field/electrostatics — Coulomb's law with real constants, and superposition done as a VECTOR sum you can show your work
6
+ * for.
7
+ *
8
+ * ── Why this is not `@classytic/stage/field` ────────────────────────────────────────────────────
9
+ * That kernel already superposes point charges, and it is the right thing for what it does: it
10
+ * draws field lines. It works in normalised teaching units (`k = 1`) and adds a softening term to
11
+ * r² so a line traced INTO a charge does not divide by zero and blow the drawing up.
12
+ *
13
+ * Both of those choices are correct for drawing and fatal for answering. A student asked for the
14
+ * field 2 cm from a 5 nC charge needs 1.12 × 10⁵ N C⁻¹, and a kernel with `k = 1` cannot produce a
15
+ * number with units at all. The softening term is worse than useless here: it silently returns a
16
+ * finite, wrong answer at small separations rather than telling anyone the question was malformed.
17
+ *
18
+ * So this file computes and that one draws, and neither should grow the other's job.
19
+ *
20
+ * ── Why it returns contributions, not just a total ──────────────────────────────────────────────
21
+ * The exam skill is not evaluating kq/r². It is the bookkeeping: work out each charge's
22
+ * contribution, resolve each into components, add the components separately, then recombine into a
23
+ * magnitude and a direction. Students lose marks in the middle of that, not at the ends, and a
24
+ * function that returns only the resultant cannot show them where.
25
+ *
26
+ * So `contributionsAt` hands back every intermediate a marker would want to see, and `resultant`
27
+ * does the recombination. The lab draws those; the tests check them.
28
+ *
29
+ * ── The trap this file exists to make visible ───────────────────────────────────────────────────
30
+ * Field and force superpose as VECTORS. Potential superposes as a SCALAR. Two equal and opposite
31
+ * charges viewed from a point equidistant from both give a potential of exactly zero and a field
32
+ * that is emphatically not zero, and every year students report one when asked for the other.
33
+ * `potentialAt` is here specifically so a lesson can put the two side by side.
34
+ */
35
+ interface Vec {
36
+ x: number;
37
+ y: number;
38
+ }
39
+ /** 1/(4πε₀), in N m² C⁻². The 9 × 10⁹ every textbook rounds it to. */
40
+ declare const COULOMB_CONSTANT = 8987551787.368176;
41
+ /** Permittivity of free space, in F m⁻¹. */
42
+ declare const EPSILON_0 = 8.8541878128e-12;
43
+ /** Elementary charge, in coulombs. */
44
+ declare const ELEMENTARY_CHARGE = 1.602176634e-19;
45
+ /**
46
+ * A point charge. Charge in MICROCOULOMBS and position in METRES, because that is how every
47
+ * question is written and converting at the boundary is better than converting in six places.
48
+ */
49
+ interface PointCharge {
50
+ id: string;
51
+ /** Charge in microcoulombs. Signed. */
52
+ microCoulomb: number;
53
+ /** Position in metres. */
54
+ at: Vec;
55
+ label?: string;
56
+ }
57
+ /** One charge's share of the field or force at a point, with everything a marker would check. */
58
+ interface Contribution {
59
+ from: string;
60
+ /** Separation from that charge to the point, in metres. */
61
+ distanceM: number;
62
+ /** Magnitude of this contribution alone. N C⁻¹ for a field, N for a force. */
63
+ magnitude: number;
64
+ /** The same contribution as components. */
65
+ vector: Vec;
66
+ /** Direction in degrees, measured anticlockwise from the +x axis. */
67
+ angleDeg: number;
68
+ /** True when the contribution points AWAY from the source charge, which is what a + charge does. */
69
+ outward: boolean;
70
+ }
71
+ interface Resultant {
72
+ vector: Vec;
73
+ magnitude: number;
74
+ /** Degrees anticlockwise from the +x axis, in (-180, 180]. */
75
+ angleDeg: number;
76
+ }
77
+ /**
78
+ * How close a field point may sit to a charge before the question is judged malformed.
79
+ *
80
+ * A millimetre, which is far below any separation a question uses and far above the rounding of a
81
+ * position typed in centimetres. THROWING here rather than softening is the whole point: at a point
82
+ * charge the field is genuinely undefined, and returning a large finite number would let a lesson
83
+ * ask a question that has no answer and get one anyway.
84
+ */
85
+ declare const MIN_SEPARATION_M = 0.001;
86
+ declare function validateCharges(charges: readonly PointCharge[]): readonly PointCharge[];
87
+ /**
88
+ * Magnitude and direction of a 2D vector.
89
+ *
90
+ * Both delegate to `compose` in `physics/vectors.ts`, which is where this
91
+ * package already resolves and recombines components. Writing the hypot and
92
+ * the atan2 again here would be a third copy of the same two lines, and the
93
+ * degrees convention would then be free to drift between them.
94
+ */
95
+ declare const magnitude: (v: Vec) => number;
96
+ /** Degrees anticlockwise from the +x axis. Returns 0 for a zero vector rather than NaN. */
97
+ declare const angleDeg: (v: Vec) => number;
98
+ /**
99
+ * Resolve a magnitude and direction into components, the step students are
100
+ * asked to show.
101
+ *
102
+ * Delegates to `resolve` in `physics/vectors.ts`, which additionally snaps a
103
+ * component that is zero-but-for-rounding relative to the magnitude. A field at
104
+ * exactly 90 degrees should report an x-component of 0, not 6e-17 times the
105
+ * field strength, and that is a judgement about scale which belongs in one
106
+ * place rather than in every domain that resolves a vector.
107
+ */
108
+ declare const resolve: (mag: number, degrees: number) => Vec;
109
+ /** Add components separately, then recombine. The whole method, in one function. */
110
+ /**
111
+ * Superpose 2D vectors by adding their components.
112
+ *
113
+ * Delegates to `resultant` in `physics/dynamics/forces.ts`. Adding two columns
114
+ * of numbers is not electrostatics, and a field superposition and a force
115
+ * superposition that disagreed about the angle convention would be a genuinely
116
+ * confusing bug to chase. The only thing kept here is the RETURN SHAPE: this
117
+ * layer hands back the vector itself, which a field diagram needs in order to
118
+ * draw the arrow, where a force table only ever wanted the magnitude.
119
+ */
120
+ declare function resultant(vectors: readonly Vec[]): Resultant;
121
+ /**
122
+ * Every charge's separate contribution to the electric field at a point, in N C⁻¹.
123
+ *
124
+ * A positive charge contributes a vector pointing AWAY from itself; a negative one points back
125
+ * toward itself. That sign handling is the single most common slip, so `outward` is reported
126
+ * explicitly rather than left for a reader to infer from the components.
127
+ */
128
+ declare function contributionsAt(charges: readonly PointCharge[], point: Vec): Contribution[];
129
+ /** The resultant electric field at a point, in N C⁻¹. */
130
+ declare function fieldAt(charges: readonly PointCharge[], point: Vec): Resultant;
131
+ /**
132
+ * The force on a test charge placed at a point, in newtons.
133
+ *
134
+ * F = qE, so a negative test charge feels a force ANTIPARALLEL to the field. Worth its own function
135
+ * rather than asking every caller to multiply, because that sign is the second most common slip
136
+ * after the one in `contributionsAt`.
137
+ */
138
+ declare function forceOn(charges: readonly PointCharge[], point: Vec, testMicroCoulomb: number): Resultant;
139
+ /** The force one point charge exerts on another, straight from Coulomb's law. */
140
+ declare function coulombForce(a: PointCharge, b: PointCharge): number;
141
+ /**
142
+ * The electric potential at a point, in volts.
143
+ *
144
+ * Added as a plain SUM of signed terms, with no components and no angles, because potential is a
145
+ * scalar. Putting it beside `fieldAt` in the same file is deliberate: the two differ in exactly the
146
+ * way students get wrong, and a lesson that shows a point where V = 0 while E is large teaches the
147
+ * distinction in one screen.
148
+ */
149
+ declare function potentialAt(charges: readonly PointCharge[], point: Vec): number;
150
+ /**
151
+ * Where on the line joining two charges the resultant field is zero.
152
+ *
153
+ * Returns a distance measured from the FIRST charge, along the line toward the second, in metres.
154
+ * A negative answer means the point lies on the far side of the first charge, which is the correct
155
+ * and frequently surprising result for two unlike charges.
156
+ *
157
+ * |q₁| / x² = |q₂| / (d − x)² so with r = √(|q₂|/|q₁|):
158
+ *
159
+ * like charges the null sits BETWEEN them: x = d / (1 + r)
160
+ * unlike charges it sits OUTSIDE, beyond the smaller magnitude: x = d / (1 − r)
161
+ *
162
+ * Two unlike charges of EQUAL magnitude have no null point anywhere: r = 1 and the second formula
163
+ * divides by zero, which is the algebra telling the truth rather than failing. That returns null.
164
+ */
165
+ declare function nullPointOnAxis(microCoulombA: number, microCoulombB: number, separationM: number): number | null;
166
+ /** The uniform field between parallel plates, in V m⁻¹, which is the same unit as N C⁻¹. */
167
+ declare function uniformFieldVPerM(plateVolts: number, separationM: number): number;
168
+ //#endregion
169
+ export { COULOMB_CONSTANT, Contribution, ELEMENTARY_CHARGE, EPSILON_0, MIN_SEPARATION_M, PointCharge, Resultant, Vec, angleDeg, contributionsAt, coulombForce, coulomb_d_exports, fieldAt, forceOn, magnitude, nullPointOnAxis, potentialAt, resolve, resultant, uniformFieldVPerM, validateCharges };
@@ -0,0 +1,249 @@
1
+ import { __exportAll } from "../../_virtual/_rolldown/runtime.mjs";
2
+ import { compose, resolve as resolve$1 } from "../vectors.mjs";
3
+ import { resultant as resultant$1 } from "../dynamics/forces.mjs";
4
+
5
+ //#region src/physics/electrostatics/coulomb.ts
6
+ /**
7
+ * @classytic/stage/field/electrostatics — Coulomb's law with real constants, and superposition done as a VECTOR sum you can show your work
8
+ * for.
9
+ *
10
+ * ── Why this is not `@classytic/stage/field` ────────────────────────────────────────────────────
11
+ * That kernel already superposes point charges, and it is the right thing for what it does: it
12
+ * draws field lines. It works in normalised teaching units (`k = 1`) and adds a softening term to
13
+ * r² so a line traced INTO a charge does not divide by zero and blow the drawing up.
14
+ *
15
+ * Both of those choices are correct for drawing and fatal for answering. A student asked for the
16
+ * field 2 cm from a 5 nC charge needs 1.12 × 10⁵ N C⁻¹, and a kernel with `k = 1` cannot produce a
17
+ * number with units at all. The softening term is worse than useless here: it silently returns a
18
+ * finite, wrong answer at small separations rather than telling anyone the question was malformed.
19
+ *
20
+ * So this file computes and that one draws, and neither should grow the other's job.
21
+ *
22
+ * ── Why it returns contributions, not just a total ──────────────────────────────────────────────
23
+ * The exam skill is not evaluating kq/r². It is the bookkeeping: work out each charge's
24
+ * contribution, resolve each into components, add the components separately, then recombine into a
25
+ * magnitude and a direction. Students lose marks in the middle of that, not at the ends, and a
26
+ * function that returns only the resultant cannot show them where.
27
+ *
28
+ * So `contributionsAt` hands back every intermediate a marker would want to see, and `resultant`
29
+ * does the recombination. The lab draws those; the tests check them.
30
+ *
31
+ * ── The trap this file exists to make visible ───────────────────────────────────────────────────
32
+ * Field and force superpose as VECTORS. Potential superposes as a SCALAR. Two equal and opposite
33
+ * charges viewed from a point equidistant from both give a potential of exactly zero and a field
34
+ * that is emphatically not zero, and every year students report one when asked for the other.
35
+ * `potentialAt` is here specifically so a lesson can put the two side by side.
36
+ */
37
+ /** A plain 2-D vector. Deliberately local: this file must not depend on any rendering package. */
38
+ var coulomb_exports = /* @__PURE__ */ __exportAll({
39
+ COULOMB_CONSTANT: () => COULOMB_CONSTANT,
40
+ ELEMENTARY_CHARGE: () => ELEMENTARY_CHARGE,
41
+ EPSILON_0: () => EPSILON_0,
42
+ MIN_SEPARATION_M: () => MIN_SEPARATION_M,
43
+ angleDeg: () => angleDeg,
44
+ contributionsAt: () => contributionsAt,
45
+ coulombForce: () => coulombForce,
46
+ fieldAt: () => fieldAt,
47
+ forceOn: () => forceOn,
48
+ magnitude: () => magnitude,
49
+ nullPointOnAxis: () => nullPointOnAxis,
50
+ potentialAt: () => potentialAt,
51
+ resolve: () => resolve,
52
+ resultant: () => resultant,
53
+ uniformFieldVPerM: () => uniformFieldVPerM,
54
+ validateCharges: () => validateCharges
55
+ });
56
+ /** 1/(4πε₀), in N m² C⁻². The 9 × 10⁹ every textbook rounds it to. */
57
+ const COULOMB_CONSTANT = 8987551787.368176;
58
+ /** Permittivity of free space, in F m⁻¹. */
59
+ const EPSILON_0 = 88541878128e-22;
60
+ /** Elementary charge, in coulombs. */
61
+ const ELEMENTARY_CHARGE = 1602176634e-28;
62
+ const finite = (value, what) => {
63
+ if (!Number.isFinite(value)) throw new RangeError(`${what} must be a finite number`);
64
+ return value;
65
+ };
66
+ /**
67
+ * How close a field point may sit to a charge before the question is judged malformed.
68
+ *
69
+ * A millimetre, which is far below any separation a question uses and far above the rounding of a
70
+ * position typed in centimetres. THROWING here rather than softening is the whole point: at a point
71
+ * charge the field is genuinely undefined, and returning a large finite number would let a lesson
72
+ * ask a question that has no answer and get one anyway.
73
+ */
74
+ const MIN_SEPARATION_M = .001;
75
+ function validateCharges(charges) {
76
+ const seen = /* @__PURE__ */ new Set();
77
+ for (const c of charges) {
78
+ if (seen.has(c.id)) throw new RangeError(`duplicate charge id ${c.id}`);
79
+ seen.add(c.id);
80
+ finite(c.microCoulomb, `charge ${c.id}`);
81
+ finite(c.at.x, `charge ${c.id} x`);
82
+ finite(c.at.y, `charge ${c.id} y`);
83
+ }
84
+ return charges;
85
+ }
86
+ /**
87
+ * Magnitude and direction of a 2D vector.
88
+ *
89
+ * Both delegate to `compose` in `physics/vectors.ts`, which is where this
90
+ * package already resolves and recombines components. Writing the hypot and
91
+ * the atan2 again here would be a third copy of the same two lines, and the
92
+ * degrees convention would then be free to drift between them.
93
+ */
94
+ const magnitude = (v) => compose(v.x, v.y).magnitude;
95
+ /** Degrees anticlockwise from the +x axis. Returns 0 for a zero vector rather than NaN. */
96
+ const angleDeg = (v) => v.x === 0 && v.y === 0 ? 0 : compose(v.x, v.y).angleDeg;
97
+ /**
98
+ * Resolve a magnitude and direction into components, the step students are
99
+ * asked to show.
100
+ *
101
+ * Delegates to `resolve` in `physics/vectors.ts`, which additionally snaps a
102
+ * component that is zero-but-for-rounding relative to the magnitude. A field at
103
+ * exactly 90 degrees should report an x-component of 0, not 6e-17 times the
104
+ * field strength, and that is a judgement about scale which belongs in one
105
+ * place rather than in every domain that resolves a vector.
106
+ */
107
+ const resolve = (mag, degrees) => resolve$1(finite(mag, "magnitude"), finite(degrees, "angle"));
108
+ /** Add components separately, then recombine. The whole method, in one function. */
109
+ /**
110
+ * Superpose 2D vectors by adding their components.
111
+ *
112
+ * Delegates to `resultant` in `physics/dynamics/forces.ts`. Adding two columns
113
+ * of numbers is not electrostatics, and a field superposition and a force
114
+ * superposition that disagreed about the angle convention would be a genuinely
115
+ * confusing bug to chase. The only thing kept here is the RETURN SHAPE: this
116
+ * layer hands back the vector itself, which a field diagram needs in order to
117
+ * draw the arrow, where a force table only ever wanted the magnitude.
118
+ */
119
+ function resultant(vectors) {
120
+ const summed = resultant$1(vectors.map((v, i) => ({
121
+ label: `v${i}`,
122
+ x: v.x,
123
+ y: v.y
124
+ })));
125
+ return {
126
+ vector: {
127
+ x: summed.x,
128
+ y: summed.y
129
+ },
130
+ magnitude: summed.magnitude,
131
+ angleDeg: summed.angleDeg
132
+ };
133
+ }
134
+ /**
135
+ * Every charge's separate contribution to the electric field at a point, in N C⁻¹.
136
+ *
137
+ * A positive charge contributes a vector pointing AWAY from itself; a negative one points back
138
+ * toward itself. That sign handling is the single most common slip, so `outward` is reported
139
+ * explicitly rather than left for a reader to infer from the components.
140
+ */
141
+ function contributionsAt(charges, point) {
142
+ validateCharges(charges);
143
+ finite(point.x, "point x");
144
+ finite(point.y, "point y");
145
+ return charges.map((charge) => {
146
+ const dx = point.x - charge.at.x;
147
+ const dy = point.y - charge.at.y;
148
+ const distanceM = Math.hypot(dx, dy);
149
+ if (distanceM < .001) throw new RangeError(`the field point sits on charge ${charge.id}; the field there is undefined, not large`);
150
+ const signed = COULOMB_CONSTANT * (charge.microCoulomb * 1e-6) / (distanceM * distanceM);
151
+ const vector = {
152
+ x: signed * dx / distanceM,
153
+ y: signed * dy / distanceM
154
+ };
155
+ return {
156
+ from: charge.id,
157
+ distanceM,
158
+ magnitude: Math.abs(signed),
159
+ vector,
160
+ angleDeg: angleDeg(vector),
161
+ outward: charge.microCoulomb > 0
162
+ };
163
+ });
164
+ }
165
+ /** The resultant electric field at a point, in N C⁻¹. */
166
+ function fieldAt(charges, point) {
167
+ return resultant(contributionsAt(charges, point).map((c) => c.vector));
168
+ }
169
+ /**
170
+ * The force on a test charge placed at a point, in newtons.
171
+ *
172
+ * F = qE, so a negative test charge feels a force ANTIPARALLEL to the field. Worth its own function
173
+ * rather than asking every caller to multiply, because that sign is the second most common slip
174
+ * after the one in `contributionsAt`.
175
+ */
176
+ function forceOn(charges, point, testMicroCoulomb) {
177
+ const field = fieldAt(charges, point);
178
+ const q = finite(testMicroCoulomb, "test charge") * 1e-6;
179
+ const vector = {
180
+ x: field.vector.x * q,
181
+ y: field.vector.y * q
182
+ };
183
+ return {
184
+ vector,
185
+ magnitude: magnitude(vector),
186
+ angleDeg: angleDeg(vector)
187
+ };
188
+ }
189
+ /** The force one point charge exerts on another, straight from Coulomb's law. */
190
+ function coulombForce(a, b) {
191
+ const dx = b.at.x - a.at.x;
192
+ const dy = b.at.y - a.at.y;
193
+ const r = Math.hypot(dx, dy);
194
+ if (r < .001) throw new RangeError("the two charges are at the same point");
195
+ return COULOMB_CONSTANT * Math.abs(a.microCoulomb * 1e-6) * Math.abs(b.microCoulomb * 1e-6) / (r * r);
196
+ }
197
+ /**
198
+ * The electric potential at a point, in volts.
199
+ *
200
+ * Added as a plain SUM of signed terms, with no components and no angles, because potential is a
201
+ * scalar. Putting it beside `fieldAt` in the same file is deliberate: the two differ in exactly the
202
+ * way students get wrong, and a lesson that shows a point where V = 0 while E is large teaches the
203
+ * distinction in one screen.
204
+ */
205
+ function potentialAt(charges, point) {
206
+ validateCharges(charges);
207
+ let volts = 0;
208
+ for (const charge of charges) {
209
+ const distanceM = Math.hypot(point.x - charge.at.x, point.y - charge.at.y);
210
+ if (distanceM < .001) throw new RangeError(`the point sits on charge ${charge.id}; the potential there is undefined`);
211
+ volts += COULOMB_CONSTANT * charge.microCoulomb * 1e-6 / distanceM;
212
+ }
213
+ return volts;
214
+ }
215
+ /**
216
+ * Where on the line joining two charges the resultant field is zero.
217
+ *
218
+ * Returns a distance measured from the FIRST charge, along the line toward the second, in metres.
219
+ * A negative answer means the point lies on the far side of the first charge, which is the correct
220
+ * and frequently surprising result for two unlike charges.
221
+ *
222
+ * |q₁| / x² = |q₂| / (d − x)² so with r = √(|q₂|/|q₁|):
223
+ *
224
+ * like charges the null sits BETWEEN them: x = d / (1 + r)
225
+ * unlike charges it sits OUTSIDE, beyond the smaller magnitude: x = d / (1 − r)
226
+ *
227
+ * Two unlike charges of EQUAL magnitude have no null point anywhere: r = 1 and the second formula
228
+ * divides by zero, which is the algebra telling the truth rather than failing. That returns null.
229
+ */
230
+ function nullPointOnAxis(microCoulombA, microCoulombB, separationM) {
231
+ const qa = Math.abs(finite(microCoulombA, "first charge"));
232
+ const qb = Math.abs(finite(microCoulombB, "second charge"));
233
+ const d = finite(separationM, "separation");
234
+ if (d <= 0) throw new RangeError("separation must be positive");
235
+ if (qa === 0 || qb === 0) return null;
236
+ const ratio = Math.sqrt(qb / qa);
237
+ if (microCoulombA * microCoulombB > 0) return d / (1 + ratio);
238
+ if (Math.abs(ratio - 1) < 1e-12) return null;
239
+ return d / (1 - ratio);
240
+ }
241
+ /** The uniform field between parallel plates, in V m⁻¹, which is the same unit as N C⁻¹. */
242
+ function uniformFieldVPerM(plateVolts, separationM) {
243
+ const d = finite(separationM, "plate separation");
244
+ if (d <= 0) throw new RangeError("plate separation must be positive");
245
+ return finite(plateVolts, "plate p.d.") / d;
246
+ }
247
+
248
+ //#endregion
249
+ export { COULOMB_CONSTANT, ELEMENTARY_CHARGE, EPSILON_0, MIN_SEPARATION_M, angleDeg, contributionsAt, coulombForce, coulomb_exports, fieldAt, forceOn, magnitude, nullPointOnAxis, potentialAt, resolve, resultant, uniformFieldVPerM, validateCharges };
@@ -0,0 +1,115 @@
1
+ import { Worked } from "../../core/worked.mjs";
2
+ import { Sweep } from "../integral-sweep.mjs";
3
+
4
+ //#region src/physics/energy/centre-of-mass.d.ts
5
+ /**
6
+ * The general statement: work against gravity is `mg` times the rise of the centre of mass.
7
+ *
8
+ * Everything else in this file is this function with the two heights worked out for a particular
9
+ * shape. Having it exist separately is the point, because it is what a learner should reach for when
10
+ * they meet a shape nobody has tabulated.
11
+ */
12
+ declare function centreOfMassLift(mass: number, fromHeight: number, toHeight: number, g?: number, sf?: number): {
13
+ readonly rise: number;
14
+ readonly value: number;
15
+ readonly worked: Worked;
16
+ };
17
+ /**
18
+ * Standing a uniform block on a different face: the brick question.
19
+ *
20
+ * A uniform body's centre of mass sits at the middle, so lying on a face it is half the THICKNESS
21
+ * above the table, and stood on end it is half the LENGTH. The rise is half the difference, and the
22
+ * other two dimensions never enter, which surprises people who were carefully multiplying all three.
23
+ */
24
+ declare function standBlockOnEnd(mass: number, lyingDimension: number, standingDimension: number, g?: number, sf?: number): {
25
+ readonly rise: number;
26
+ readonly value: number;
27
+ readonly worked: Worked;
28
+ };
29
+ /**
30
+ * Tipping a hinged rod (or a hinged plank) through an angle from the vertical.
31
+ *
32
+ * The centre of mass of a uniform rod is at its midpoint, so it traces a circle of radius `l/2`, and
33
+ * the rise is `(l/2)(1 − cos θ)`: the pendulum geometry again, with the length halved because the
34
+ * mass is spread rather than hanging at the end. That reuse is worth naming out loud, because a
35
+ * learner who sees the same `(1 − cos θ)` in a swing and in a toppling rod has genuinely learned the
36
+ * geometry rather than two formulas.
37
+ */
38
+ declare function tiltRod(mass: number, length: number, angleFromVerticalDeg: number, g?: number, sf?: number): {
39
+ readonly rise: number;
40
+ readonly value: number;
41
+ readonly worked: Worked;
42
+ };
43
+ interface StackResult {
44
+ readonly value: number;
45
+ /** How far each brick had to rise, in order. The first is always zero. */
46
+ readonly rises: readonly number[];
47
+ /** `n(n − 1)/2`, which is also the number of PAIRS of bricks. */
48
+ readonly triangleNumber: number;
49
+ readonly worked: Worked;
50
+ }
51
+ /**
52
+ * Building a column out of `count` identical bricks that all start lying on the ground.
53
+ *
54
+ * DERIVED, NOT QUOTED. The textbook prints `W = ⁿC₂ mgh` and a binomial coefficient appearing in a
55
+ * mechanics problem looks like a conjuring trick. It is not: the bottom brick does not move, the
56
+ * next rises `h`, the next `2h`, and adding `0 + 1 + 2 + ... + (n−1)` gives `n(n−1)/2`, which is the
57
+ * triangle number and which happens to equal `ⁿC₂`. The coefficient is a coincidence of arithmetic,
58
+ * not a combinatorial insight, and saying so is more honest than letting it look profound.
59
+ *
60
+ * `height` is the thickness of one brick, which is how far each brick sits above the one below it.
61
+ */
62
+ declare function stackColumn(count: number, massEach: number, height: number, g?: number, sf?: number): StackResult;
63
+ /**
64
+ * Hauling a chain up a well, with a load on the end.
65
+ *
66
+ * Two contributions and they rise by different amounts, which is the entire question. The load on
67
+ * the end travels the full depth. The chain's centre of mass starts halfway down and finishes at the
68
+ * top, so it rises only HALF the depth. Treating the chain as though all of it climbed the full
69
+ * depth doubles its share, and the resulting answer is wrong by an amount that depends on how heavy
70
+ * the chain is relative to the load, which is why it can pass unnoticed.
71
+ */
72
+ declare function chainLift(depth: number, chainMassPerMetre: number, loadMass: number, g?: number, sf?: number): {
73
+ readonly chainWork: number;
74
+ readonly loadWork: number;
75
+ readonly value: number;
76
+ readonly chainMass: number;
77
+ readonly worked: Worked;
78
+ };
79
+ interface DrainResult {
80
+ readonly mass: number;
81
+ /** The distance the centre of mass of the liquid actually rose. */
82
+ readonly meanLift: number;
83
+ readonly value: number;
84
+ /** What you would have got by using the full height for every drop: the classic wrong answer. */
85
+ readonly naiveValue: number;
86
+ /** The integral, layer by layer, ready to animate. */
87
+ readonly sweep: Sweep;
88
+ readonly worked: Worked;
89
+ }
90
+ /**
91
+ * Pumping every drop of liquid out over the rim of an upright container.
92
+ *
93
+ * The layer at height `y` has to rise `(H − y)`, so the work is `∫ ρgA(H − y) dy` over whatever is
94
+ * actually in there. The integral is performed symbolically by the shared integrator, so the sweep
95
+ * this returns can be animated as layers leaving one at a time while the running total fills, and
96
+ * the number on the meter is the real antiderivative rather than a sum of rectangles.
97
+ *
98
+ * `fillFraction` is how full it is, measured from the BOTTOM. The mean lift comes out as
99
+ * `H(1 − f/2)`, which is worth reading twice: a FULL tank has the lowest mean lift of all, `H/2`,
100
+ * because most of its water is near the bottom where there is a lot of water and the top layers cost
101
+ * almost nothing. A quarter-full tank lifts its water `7H/8` on average, because all of it is at the
102
+ * bottom and all of it has nearly the whole height to travel. The emptier the tank, the harder each
103
+ * kilogram is to get out.
104
+ */
105
+ declare function columnDrain(height: number, crossSection: number, fillFraction?: number, density?: number, g?: number, sf?: number): DrainResult;
106
+ /**
107
+ * The mean lift alone, for feeding into {@link pumpPower}.
108
+ *
109
+ * A well being pumped dry is the `fillFraction = 1` case, where the mean lift is half the depth. It
110
+ * is its own named function because that is the number a power question needs and because writing
111
+ * `depth / 2` inline in a pump calculation is how the reasoning gets lost.
112
+ */
113
+ declare const meanLiftToRim: (height: number, fillFraction?: number) => number;
114
+ //#endregion
115
+ export { DrainResult, StackResult, centreOfMassLift, chainLift, columnDrain, meanLiftToRim, stackColumn, standBlockOnEnd, tiltRod };