@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
@@ -4,96 +4,57 @@ import { ToolIcon } from "./icons.mjs";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
 
6
6
  //#region src/builder/Palette.tsx
7
- const btn = (active) => ({
8
- display: "inline-flex",
9
- alignItems: "center",
10
- gap: 6,
11
- padding: "6px 10px",
12
- borderRadius: 8,
13
- fontSize: 13,
14
- fontWeight: 600,
15
- cursor: "pointer",
16
- color: active ? "var(--stage-bg)" : "var(--stage-fg)",
17
- background: active ? "var(--stage-accent)" : "transparent",
18
- border: `1px solid ${active ? "var(--stage-accent)" : "var(--stage-muted)"}`
19
- });
20
- const iconBtn = (disabled) => ({
21
- display: "inline-flex",
22
- alignItems: "center",
23
- gap: 6,
24
- padding: "6px 10px",
25
- borderRadius: 8,
26
- fontSize: 13,
27
- fontWeight: 600,
28
- cursor: disabled ? "not-allowed" : "pointer",
29
- opacity: disabled ? .4 : 1,
30
- color: "var(--stage-fg)",
31
- background: "transparent",
32
- border: "1px solid var(--stage-muted)"
33
- });
34
7
  function Palette({ tools, activeTool, onSelect, onUndo, onRedo, canUndo, canRedo, onClear, onSave, hint }) {
35
- return /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsxs("div", {
36
- role: "toolbar",
37
- "aria-label": "construction tools",
38
- style: {
39
- display: "flex",
40
- flexWrap: "wrap",
41
- gap: 6,
42
- alignItems: "center"
43
- },
44
- children: [
45
- tools.map((t) => /* @__PURE__ */ jsxs("button", {
46
- type: "button",
47
- "aria-pressed": activeTool === t.id,
48
- onClick: () => onSelect(t.id),
49
- style: btn(activeTool === t.id),
50
- children: [/* @__PURE__ */ jsx(ToolIcon, { name: t.icon }), t.label]
51
- }, t.id)),
52
- /* @__PURE__ */ jsx("span", { style: {
53
- width: 1,
54
- alignSelf: "stretch",
55
- background: "var(--stage-muted)",
56
- margin: "0 4px"
57
- } }),
58
- /* @__PURE__ */ jsxs("button", {
59
- type: "button",
60
- onClick: onUndo,
61
- disabled: !canUndo,
62
- style: iconBtn(!canUndo),
63
- children: [/* @__PURE__ */ jsx(ToolIcon, { name: "undo" }), "Undo"]
64
- }),
65
- /* @__PURE__ */ jsxs("button", {
66
- type: "button",
67
- onClick: onRedo,
68
- disabled: !canRedo,
69
- style: iconBtn(!canRedo),
70
- children: [/* @__PURE__ */ jsx(ToolIcon, { name: "redo" }), "Redo"]
71
- }),
72
- /* @__PURE__ */ jsx("button", {
73
- type: "button",
74
- onClick: onClear,
75
- style: iconBtn(false),
76
- children: "Clear"
77
- }),
78
- onSave && /* @__PURE__ */ jsx("button", {
79
- type: "button",
80
- onClick: onSave,
81
- style: {
82
- ...iconBtn(false),
83
- color: "var(--stage-good)",
84
- borderColor: "var(--stage-good)"
85
- },
86
- children: "Save"
87
- })
88
- ]
89
- }), /* @__PURE__ */ jsx("p", {
90
- style: {
91
- fontSize: 12,
92
- opacity: .7,
93
- margin: "6px 2px 0"
94
- },
95
- children: hint
96
- })] });
8
+ return /* @__PURE__ */ jsxs("div", {
9
+ className: "stage-palette",
10
+ children: [/* @__PURE__ */ jsxs("div", {
11
+ role: "toolbar",
12
+ "aria-label": "construction tools",
13
+ className: "stage-palette__toolbar",
14
+ children: [
15
+ tools.map((t) => /* @__PURE__ */ jsxs("button", {
16
+ type: "button",
17
+ "aria-pressed": activeTool === t.id,
18
+ onClick: () => onSelect(t.id),
19
+ className: "stage-tool-button",
20
+ children: [/* @__PURE__ */ jsx(ToolIcon, { name: t.icon }), t.label]
21
+ }, t.id)),
22
+ /* @__PURE__ */ jsx("span", {
23
+ className: "stage-palette__divider",
24
+ "aria-hidden": "true"
25
+ }),
26
+ /* @__PURE__ */ jsxs("button", {
27
+ type: "button",
28
+ onClick: onUndo,
29
+ disabled: !canUndo,
30
+ className: "stage-tool-button",
31
+ children: [/* @__PURE__ */ jsx(ToolIcon, { name: "undo" }), "Undo"]
32
+ }),
33
+ /* @__PURE__ */ jsxs("button", {
34
+ type: "button",
35
+ onClick: onRedo,
36
+ disabled: !canRedo,
37
+ className: "stage-tool-button",
38
+ children: [/* @__PURE__ */ jsx(ToolIcon, { name: "redo" }), "Redo"]
39
+ }),
40
+ /* @__PURE__ */ jsx("button", {
41
+ type: "button",
42
+ onClick: onClear,
43
+ className: "stage-tool-button",
44
+ children: "Clear"
45
+ }),
46
+ onSave && /* @__PURE__ */ jsx("button", {
47
+ type: "button",
48
+ onClick: onSave,
49
+ className: "stage-tool-button stage-tool-button--save",
50
+ children: "Save"
51
+ })
52
+ ]
53
+ }), /* @__PURE__ */ jsx("p", {
54
+ className: "stage-palette__hint",
55
+ children: hint
56
+ })]
57
+ });
97
58
  }
98
59
 
99
60
  //#endregion
@@ -149,12 +149,7 @@ function SceneBuilder({ initial, onSave, view, height = 440, tools, authoring =
149
149
  }, `pend-${id}`) : null;
150
150
  }), [pending, resolved]);
151
151
  return /* @__PURE__ */ jsxs("div", {
152
- className: "not-prose",
153
- style: {
154
- display: "flex",
155
- flexDirection: "column",
156
- gap: 10
157
- },
152
+ className: "not-prose stage-builder",
158
153
  children: [
159
154
  /* @__PURE__ */ jsx(Palette, {
160
155
  tools: toolSet,
@@ -184,21 +179,11 @@ function SceneBuilder({ initial, onSave, view, height = 440, tools, authoring =
184
179
  ]
185
180
  }),
186
181
  authoring && scalars.length > 0 && /* @__PURE__ */ jsx("div", {
187
- style: {
188
- display: "flex",
189
- flexWrap: "wrap",
190
- gap: 14,
191
- padding: "2px",
192
- fontSize: 13
193
- },
182
+ className: "stage-builder__scalars",
194
183
  children: scalars.map((el) => {
195
184
  const f = el.free;
196
185
  return /* @__PURE__ */ jsxs("label", {
197
- style: {
198
- display: "inline-flex",
199
- alignItems: "center",
200
- gap: 6
201
- },
186
+ className: "stage-builder__scalar",
202
187
  children: [
203
188
  /* @__PURE__ */ jsx("strong", { children: el.label ?? el.id }),
204
189
  /* @__PURE__ */ jsx("input", {
@@ -214,10 +199,7 @@ function SceneBuilder({ initial, onSave, view, height = 440, tools, authoring =
214
199
  })
215
200
  }),
216
201
  /* @__PURE__ */ jsx("span", {
217
- style: {
218
- fontVariantNumeric: "tabular-nums",
219
- minWidth: 24
220
- },
202
+ className: "stage-builder__scalar-value",
221
203
  children: f.value
222
204
  })
223
205
  ]
@@ -225,30 +207,12 @@ function SceneBuilder({ initial, onSave, view, height = 440, tools, authoring =
225
207
  })
226
208
  }),
227
209
  authoring && /* @__PURE__ */ jsxs("details", {
228
- style: {
229
- fontSize: 13,
230
- border: "1px solid var(--stage-muted)",
231
- borderRadius: 8,
232
- padding: "6px 10px"
233
- },
234
- children: [/* @__PURE__ */ jsx("summary", {
235
- style: {
236
- cursor: "pointer",
237
- fontWeight: 600
238
- },
239
- children: "Pedagogy, objectives · hints · difficulty"
240
- }), /* @__PURE__ */ jsxs("div", {
241
- style: {
242
- display: "grid",
243
- gap: 8,
244
- marginTop: 8
245
- },
210
+ className: "stage-builder__pedagogy",
211
+ children: [/* @__PURE__ */ jsx("summary", { children: "Pedagogy, objectives · hints · difficulty" }), /* @__PURE__ */ jsxs("div", {
212
+ className: "stage-builder__pedagogy-fields",
246
213
  children: [
247
214
  /* @__PURE__ */ jsxs("label", {
248
- style: {
249
- display: "grid",
250
- gap: 3
251
- },
215
+ className: "stage-builder__field-label",
252
216
  children: ["Objectives (one per line)", /* @__PURE__ */ jsx("textarea", {
253
217
  rows: 2,
254
218
  value: (pedagogy.objectives ?? []).join("\n"),
@@ -256,14 +220,11 @@ function SceneBuilder({ initial, onSave, view, height = 440, tools, authoring =
256
220
  ...p,
257
221
  objectives: splitLines(e.currentTarget.value)
258
222
  })),
259
- style: FIELD
223
+ className: "stage-builder__field"
260
224
  })]
261
225
  }),
262
226
  /* @__PURE__ */ jsxs("label", {
263
- style: {
264
- display: "grid",
265
- gap: 3
266
- },
227
+ className: "stage-builder__field-label",
267
228
  children: ["Hints (one per line)", /* @__PURE__ */ jsx("textarea", {
268
229
  rows: 2,
269
230
  value: (pedagogy.hints ?? []).join("\n"),
@@ -271,39 +232,29 @@ function SceneBuilder({ initial, onSave, view, height = 440, tools, authoring =
271
232
  ...p,
272
233
  hints: splitLines(e.currentTarget.value)
273
234
  })),
274
- style: FIELD
235
+ className: "stage-builder__field"
275
236
  })]
276
237
  }),
277
238
  /* @__PURE__ */ jsxs("label", {
278
- style: {
279
- display: "grid",
280
- gap: 3
281
- },
239
+ className: "stage-builder__field-label",
282
240
  children: ["Success criteria", /* @__PURE__ */ jsx("input", {
283
241
  value: pedagogy.successCriteria ?? "",
284
242
  onChange: (e) => setPedagogy((p) => ({
285
243
  ...p,
286
244
  successCriteria: e.currentTarget.value || void 0
287
245
  })),
288
- style: FIELD
246
+ className: "stage-builder__field"
289
247
  })]
290
248
  }),
291
249
  /* @__PURE__ */ jsxs("label", {
292
- style: {
293
- display: "inline-flex",
294
- alignItems: "center",
295
- gap: 8
296
- },
250
+ className: "stage-builder__difficulty",
297
251
  children: ["Difficulty", /* @__PURE__ */ jsxs("select", {
298
252
  value: pedagogy.difficulty ?? "",
299
253
  onChange: (e) => setPedagogy((p) => ({
300
254
  ...p,
301
255
  difficulty: e.currentTarget.value ? Number(e.currentTarget.value) : void 0
302
256
  })),
303
- style: {
304
- ...FIELD,
305
- width: "auto"
306
- },
257
+ className: "stage-builder__field stage-builder__field--select",
307
258
  children: [/* @__PURE__ */ jsx("option", {
308
259
  value: "",
309
260
  children: ", "
@@ -325,15 +276,6 @@ function SceneBuilder({ initial, onSave, view, height = 440, tools, authoring =
325
276
  ]
326
277
  });
327
278
  }
328
- const FIELD = {
329
- width: "100%",
330
- border: "1px solid var(--stage-muted)",
331
- borderRadius: 6,
332
- padding: "4px 8px",
333
- background: "transparent",
334
- color: "inherit",
335
- font: "inherit"
336
- };
337
279
  const splitLines = (s) => s.split("\n").map((x) => x.trim()).filter(Boolean);
338
280
 
339
281
  //#endregion
@@ -0,0 +1,66 @@
1
+ //#region src/chem/chromatography.d.ts
2
+ /**
3
+ * chromatography, identifying a component by where it stops.
4
+ *
5
+ * WHAT THIS IS FOR. The arithmetic of a retention factor is one division, and one division is not an
6
+ * engine. What is worth computing is the IDENTIFICATION: given a set of reference values and a spot,
7
+ * which references does it match, and is that match unique?
8
+ *
9
+ * The answer is often "not unique", and that is the whole reason a second solvent exists. A learner
10
+ * told to run two solvents without being shown a case where one fails has been given a ritual. So
11
+ * {@link identify} reports ambiguity as a result rather than hiding it, and {@link resolvedBy} finds
12
+ * the solvent that breaks a tie.
13
+ *
14
+ * ## Why a tolerance, and why it is not optional
15
+ *
16
+ * An Rf is reproducible to about ±0.02 in practice, and less than that if the tank was not saturated
17
+ * or the temperature drifted. Matching on exact equality would make every real measurement fail and
18
+ * would teach that chromatography is more precise than it is. The tolerance is a parameter because
19
+ * it is a property of the experiment, not of the chemistry.
20
+ *
21
+ * Pure: no React, no pixels.
22
+ */
23
+ /** A substance and where it stops in each solvent the lab offers. */
24
+ interface Component {
25
+ readonly id: string;
26
+ readonly name: string;
27
+ /** Retention factor in each solvent, keyed by solvent id. Always between 0 and 1. */
28
+ readonly rf: Readonly<Record<string, number>>;
29
+ }
30
+ /**
31
+ * The retention factor: how far the spot went as a fraction of how far the solvent went.
32
+ *
33
+ * Both distances are measured from the pencil baseline. Refuses a spot that has overtaken the
34
+ * solvent front, which is not a measurement error to round away: it means the distances were
35
+ * measured from different places, usually the bottom of the plate rather than the baseline.
36
+ */
37
+ declare function retentionFactor(spotCm: number, frontCm: number): number;
38
+ /** Where a component's spot sits, given how far the solvent has run. */
39
+ declare const spotDistance: (component: Component, solvent: string, frontCm: number) => number;
40
+ /** What an identification attempt produced. */
41
+ interface Identification {
42
+ /** Every reference within tolerance, best match first. */
43
+ readonly matches: readonly Component[];
44
+ /** True when exactly one reference matches, so the spot is named. */
45
+ readonly unique: boolean;
46
+ }
47
+ /**
48
+ * Which references a measured Rf could be.
49
+ *
50
+ * Returns every candidate rather than the closest one. A spot that sits between two references has
51
+ * not identified anything, and reporting the nearest would turn a failed experiment into a confident
52
+ * wrong answer.
53
+ */
54
+ declare function identify(rf: number, references: readonly Component[], solvent: string, tolerance?: number): Identification;
55
+ /**
56
+ * A solvent in which two components can be told apart, or `undefined` if none can.
57
+ *
58
+ * This is the argument for running a second solvent, made as a computation. Two components that sit
59
+ * on top of each other in one solvent will usually separate in another, because the competition
60
+ * between the phases depends on the solvent as much as on the substance.
61
+ */
62
+ declare function resolvedBy(a: Component, b: Component, solvents: readonly string[], tolerance?: number): string | undefined;
63
+ /** Pairs that cannot be told apart in a given solvent, which is what makes a mixture ambiguous. */
64
+ declare function unresolvedPairs(components: readonly Component[], solvent: string, tolerance?: number): [Component, Component][];
65
+ //#endregion
66
+ export { Component, Identification, identify, resolvedBy, retentionFactor, spotDistance, unresolvedPairs };
@@ -0,0 +1,63 @@
1
+ //#region src/chem/chromatography.ts
2
+ /**
3
+ * The retention factor: how far the spot went as a fraction of how far the solvent went.
4
+ *
5
+ * Both distances are measured from the pencil baseline. Refuses a spot that has overtaken the
6
+ * solvent front, which is not a measurement error to round away: it means the distances were
7
+ * measured from different places, usually the bottom of the plate rather than the baseline.
8
+ */
9
+ function retentionFactor(spotCm, frontCm) {
10
+ if (frontCm <= 0) throw new Error("The solvent front has not moved, so there is no Rf to report.");
11
+ if (spotCm < 0) throw new Error("A spot cannot move backwards from the baseline.");
12
+ if (spotCm > frontCm) throw new Error(`A spot at ${spotCm} cm cannot be past a front at ${frontCm} cm: the solvent carries it, so Rf is at most 1. Measure both from the pencil baseline.`);
13
+ return spotCm / frontCm;
14
+ }
15
+ /** Where a component's spot sits, given how far the solvent has run. */
16
+ const spotDistance = (component, solvent, frontCm) => {
17
+ const rf = component.rf[solvent];
18
+ if (rf === void 0) throw new Error(`${component.name} has no measured Rf in ${solvent}.`);
19
+ return rf * frontCm;
20
+ };
21
+ /**
22
+ * Which references a measured Rf could be.
23
+ *
24
+ * Returns every candidate rather than the closest one. A spot that sits between two references has
25
+ * not identified anything, and reporting the nearest would turn a failed experiment into a confident
26
+ * wrong answer.
27
+ */
28
+ function identify(rf, references, solvent, tolerance = .03) {
29
+ const matches = references.filter((c) => c.rf[solvent] !== void 0 && Math.abs(c.rf[solvent] - rf) <= tolerance).sort((a, b) => Math.abs(a.rf[solvent] - rf) - Math.abs(b.rf[solvent] - rf));
30
+ return {
31
+ matches,
32
+ unique: matches.length === 1
33
+ };
34
+ }
35
+ /**
36
+ * A solvent in which two components can be told apart, or `undefined` if none can.
37
+ *
38
+ * This is the argument for running a second solvent, made as a computation. Two components that sit
39
+ * on top of each other in one solvent will usually separate in another, because the competition
40
+ * between the phases depends on the solvent as much as on the substance.
41
+ */
42
+ function resolvedBy(a, b, solvents, tolerance = .03) {
43
+ return solvents.find((s) => {
44
+ const ra = a.rf[s];
45
+ const rb = b.rf[s];
46
+ return ra !== void 0 && rb !== void 0 && Math.abs(ra - rb) > tolerance;
47
+ });
48
+ }
49
+ /** Pairs that cannot be told apart in a given solvent, which is what makes a mixture ambiguous. */
50
+ function unresolvedPairs(components, solvent, tolerance = .03) {
51
+ const out = [];
52
+ for (let i = 0; i < components.length; i += 1) for (let j = i + 1; j < components.length; j += 1) {
53
+ const a = components[i];
54
+ const b = components[j];
55
+ const ra = a.rf[solvent];
56
+ const rb = b.rf[solvent];
57
+ if (ra !== void 0 && rb !== void 0 && Math.abs(ra - rb) <= tolerance) out.push([a, b]);
58
+ }
59
+ return out;
60
+ }
61
+
62
+ //#endregion
63
+ export { identify, resolvedBy, retentionFactor, spotDistance, unresolvedPairs };
@@ -0,0 +1,114 @@
1
+ //#region src/chem/complex.d.ts
2
+ /**
3
+ * complex, the geometry and colour of a transition-metal complex ion.
4
+ *
5
+ * Three questions the syllabus asks about every complex, and they are all answered from the same
6
+ * declaration: what shape is it, how many isomers has it, and why is it that colour.
7
+ *
8
+ * ## Coordination number is not the number of ligands
9
+ *
10
+ * It is the number of COORDINATE BONDS, so a bidentate ligand counts twice. That single sentence
11
+ * settles a question learners routinely get wrong: [Cu(en)₂]²⁺ has two ligands and a coordination
12
+ * number of four, and [Cr(C₂O₄)₃]³⁻ has three ligands and a coordination number of six.
13
+ *
14
+ * ## Why shape follows from the number and not from the metal, except when it does not
15
+ *
16
+ * Six is octahedral and two is linear, with no exceptions worth teaching. Four is the interesting
17
+ * one: usually tetrahedral, but square planar for platinum and palladium. That is not a detail. A
18
+ * square-planar complex shows cis-trans isomerism and a tetrahedral one CANNOT, because in a
19
+ * tetrahedron every position is adjacent to every other, so there is no "opposite" to be trans to.
20
+ *
21
+ * Cisplatin is the case that matters: it is the cis isomer of a square-planar platinum complex and
22
+ * it is a cancer drug, while the trans isomer is not. Had the geometry been tetrahedral there would
23
+ * have been no two isomers to tell apart.
24
+ *
25
+ * ## Colour is what is NOT absorbed
26
+ *
27
+ * A d-block ion's d orbitals split, and the gap ΔE corresponds to a wavelength in the visible
28
+ * range. The ion absorbs that wavelength and what reaches the eye is the rest, which is why copper
29
+ * sulfate is blue BECAUSE it absorbs orange. Stating it the other way round, that it is blue
30
+ * because it absorbs blue, is the commonest sentence in a wrong answer.
31
+ *
32
+ * Pure: no React, no pixels.
33
+ */
34
+ /** Planck constant, J s. */
35
+ declare const PLANCK = 6.626e-34;
36
+ /** Speed of light, m/s. */
37
+ declare const LIGHT_SPEED = 299800000;
38
+ /** Avogadro constant, per mole. */
39
+ declare const AVOGADRO = 6.022e+23;
40
+ type Geometry = 'linear' | 'tetrahedral' | 'square-planar' | 'octahedral';
41
+ interface Ligand {
42
+ readonly name: string;
43
+ /** As it appears inside the square brackets. */
44
+ readonly formula: string;
45
+ /** Charge on the ligand itself. 0 for a neutral one. */
46
+ readonly charge: number;
47
+ /** Coordinate bonds it forms. 2 for a bidentate ligand. */
48
+ readonly denticity: number;
49
+ }
50
+ /** The ligands the syllabus actually uses. */
51
+ declare const LIGANDS: Readonly<Record<string, Ligand>>;
52
+ interface ComplexSpec {
53
+ /** Symbol of the central metal, e.g. 'Cu'. */
54
+ readonly metal: string;
55
+ /** Its oxidation number. */
56
+ readonly oxidation: number;
57
+ readonly ligands: readonly {
58
+ readonly ligand: Ligand;
59
+ readonly count: number;
60
+ }[];
61
+ /**
62
+ * Force a geometry the coordination number would not give.
63
+ *
64
+ * Only ever needed at four, where platinum and palladium are square planar and everything else is
65
+ * tetrahedral. Provided as an override rather than a longer metal table, because the exceptions
66
+ * are a syllabus fact rather than a rule anyone can derive.
67
+ */
68
+ readonly geometry?: Geometry;
69
+ }
70
+ /** Coordinate bonds, NOT the number of ligands. A bidentate ligand counts twice. */
71
+ declare const coordinationNumber: (spec: ComplexSpec) => number;
72
+ /** Overall charge: the metal's oxidation number plus every ligand's own charge. */
73
+ declare const complexCharge: (spec: ComplexSpec) => number;
74
+ declare function geometryOf(spec: ComplexSpec): Geometry;
75
+ /** The bond angle a shape gives, in degrees. */
76
+ declare function bondAngle(geometry: Geometry): number;
77
+ /** `[Cu(H2O)6]2+`, with the charge written the way a data book writes it. */
78
+ declare function complexFormula(spec: ComplexSpec): string;
79
+ interface StereoResult {
80
+ readonly count: number;
81
+ /** 'cis', 'trans', 'fac', 'mer', 'optical pair'. */
82
+ readonly kinds: readonly string[];
83
+ /** Why there are that many, in a sentence a mark scheme would accept. */
84
+ readonly reason: string;
85
+ }
86
+ /**
87
+ * How many stereoisomers a complex has, and what kind.
88
+ *
89
+ * Covers the shapes the syllabus sets and refuses to guess beyond them. The important NEGATIVE
90
+ * result is the tetrahedral one: no cis-trans isomerism at any composition, because a tetrahedron
91
+ * has no two positions opposite each other.
92
+ */
93
+ declare function stereoisomers(spec: ComplexSpec): StereoResult;
94
+ /** The splitting energy ΔE for light of this wavelength, in joules per photon. */
95
+ declare const splittingEnergy: (wavelengthNm: number) => number;
96
+ /** The same energy per mole, in kJ/mol, which is the form a question asks for. */
97
+ declare const splittingEnergyPerMole: (wavelengthNm: number) => number;
98
+ /** The wavelength whose photon energy is ΔE joules. */
99
+ declare const wavelengthFor: (joules: number) => number;
100
+ interface ColourResult {
101
+ readonly absorbed: string;
102
+ readonly seen: string;
103
+ readonly wavelengthNm: number;
104
+ }
105
+ /**
106
+ * What colour a solution looks, given the wavelength it absorbs.
107
+ *
108
+ * The answer is the COMPLEMENTARY colour, never the absorbed one. Copper sulfate absorbs orange
109
+ * light at about 600 nm and therefore looks blue, and a learner who says it looks blue because it
110
+ * absorbs blue has the physics exactly backwards.
111
+ */
112
+ declare function observedColour(wavelengthNm: number): ColourResult;
113
+ //#endregion
114
+ export { AVOGADRO, ColourResult, ComplexSpec, Geometry, LIGANDS, LIGHT_SPEED, Ligand, PLANCK, StereoResult, bondAngle, complexCharge, complexFormula, coordinationNumber, geometryOf, observedColour, splittingEnergy, splittingEnergyPerMole, stereoisomers, wavelengthFor };