@classytic/labs 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (455) hide show
  1. package/dist/_virtual/_rolldown/runtime.mjs +18 -0
  2. package/dist/biology/enzyme-rate/preset.mjs +5 -5
  3. package/dist/biology/genetic-cross/core.d.mts +7 -7
  4. package/dist/biology/genetic-cross/core.mjs +4 -4
  5. package/dist/biology/genetic-cross/grid.mjs +132 -123
  6. package/dist/biology/genetic-cross/preset.mjs +4 -4
  7. package/dist/biology/genetic-cross/sex-linked.mjs +7 -7
  8. package/dist/biology/photosynthesis-factors/preset.mjs +8 -8
  9. package/dist/biology/respiration/preset.mjs +4 -4
  10. package/dist/biology/sequence/central-dogma.mjs +5 -5
  11. package/dist/biology/sequence/core.d.mts +6 -6
  12. package/dist/biology/sequence/core.mjs +1 -1
  13. package/dist/biology/sequence/preset.mjs +6 -6
  14. package/dist/blocks/authoring.mjs +5 -5
  15. package/dist/blocks/biology.d.mts +2 -2
  16. package/dist/blocks/biology.mjs +5 -5
  17. package/dist/blocks/chem.d.mts +2 -2
  18. package/dist/blocks/chem.mjs +13 -13
  19. package/dist/blocks/circuits.d.mts +293 -4
  20. package/dist/blocks/circuits.mjs +874 -9
  21. package/dist/blocks/discrete.d.mts +30 -2
  22. package/dist/blocks/discrete.mjs +74 -4
  23. package/dist/blocks/economics.mjs +1 -1
  24. package/dist/blocks/geography.mjs +1 -1
  25. package/dist/blocks/geometry.mjs +3 -3
  26. package/dist/blocks/ict.d.mts +90 -1
  27. package/dist/blocks/ict.mjs +217 -7
  28. package/dist/blocks/index.d.mts +3064 -657
  29. package/dist/blocks/index.mjs +9 -9
  30. package/dist/blocks/lab-block.mjs +5 -5
  31. package/dist/blocks/lab-config.d.mts +1 -1
  32. package/dist/blocks/lab-config.mjs +4 -4
  33. package/dist/blocks/lab-gallery.d.mts +1 -1
  34. package/dist/blocks/lab-gallery.mjs +2 -2
  35. package/dist/blocks/language.d.mts +6 -6
  36. package/dist/blocks/language.mjs +12 -12
  37. package/dist/blocks/lesson.mjs +4 -4
  38. package/dist/blocks/math.d.mts +577 -11
  39. package/dist/blocks/math.mjs +1648 -14
  40. package/dist/blocks/ml.d.mts +45 -1
  41. package/dist/blocks/ml.mjs +80 -6
  42. package/dist/blocks/physics.d.mts +9 -4
  43. package/dist/blocks/physics.mjs +75 -28
  44. package/dist/blocks/statistics.mjs +1 -1
  45. package/dist/build/CircuitEditor.d.mts +14 -0
  46. package/dist/build/CircuitEditor.mjs +787 -0
  47. package/dist/build/CircuitPlayer.d.mts +19 -0
  48. package/dist/build/CircuitPlayer.mjs +53 -0
  49. package/dist/build/CircuitScene.d.mts +61 -0
  50. package/dist/build/CircuitScene.mjs +383 -0
  51. package/dist/build/contract.d.mts +116 -0
  52. package/dist/build/editor-ops.d.mts +65 -0
  53. package/dist/build/editor-ops.mjs +306 -0
  54. package/dist/build/editor-ui.mjs +121 -0
  55. package/dist/build/flow.d.mts +14 -0
  56. package/dist/build/flow.mjs +119 -0
  57. package/dist/build/index.d.mts +10 -0
  58. package/dist/build/index.mjs +10 -0
  59. package/dist/build/parts/ammeter.d.mts +1 -0
  60. package/dist/build/parts/ammeter.mjs +32 -0
  61. package/dist/build/parts/bulb.d.mts +1 -0
  62. package/dist/build/parts/bulb.mjs +50 -0
  63. package/dist/build/parts/capacitor.d.mts +1 -0
  64. package/dist/build/parts/capacitor.mjs +26 -0
  65. package/dist/build/parts/cell.d.mts +1 -0
  66. package/dist/build/parts/cell.mjs +40 -0
  67. package/dist/build/parts/diode.d.mts +1 -0
  68. package/dist/build/parts/diode.mjs +33 -0
  69. package/dist/build/parts/index.d.mts +5 -0
  70. package/dist/build/parts/index.mjs +43 -0
  71. package/dist/build/parts/mosfet.d.mts +1 -0
  72. package/dist/build/parts/mosfet.mjs +95 -0
  73. package/dist/build/parts/node.d.mts +1 -0
  74. package/dist/build/parts/node.mjs +32 -0
  75. package/dist/build/parts/resistor.d.mts +1 -0
  76. package/dist/build/parts/resistor.mjs +49 -0
  77. package/dist/build/parts/shared.mjs +42 -0
  78. package/dist/build/parts/switch.d.mts +1 -0
  79. package/dist/build/parts/switch.mjs +34 -0
  80. package/dist/build/parts.d.mts +1 -0
  81. package/dist/build/registry.d.mts +9 -0
  82. package/dist/build/registry.mjs +15 -0
  83. package/dist/build/solve.d.mts +8 -0
  84. package/dist/build/solve.mjs +0 -0
  85. package/dist/catalog/registry.d.mts +2 -2
  86. package/dist/catalog/templates.d.mts +1 -1
  87. package/dist/catalog/templates.mjs +6 -6
  88. package/dist/chem/battery.mjs +1 -1
  89. package/dist/chem/bohr-atom.mjs +4 -4
  90. package/dist/chem/diffusion/preset.mjs +4 -4
  91. package/dist/chem/electrochem/preset.mjs +5 -5
  92. package/dist/chem/equilibrium/preset.d.mts +1 -1
  93. package/dist/chem/equilibrium/preset.mjs +6 -6
  94. package/dist/chem/gas-box/preset.mjs +6 -6
  95. package/dist/chem/kinetics/preset.mjs +6 -6
  96. package/dist/chem/periodic-trends/preset.mjs +7 -7
  97. package/dist/chem/reaction-lab.mjs +3 -3
  98. package/dist/chem/reaction-profile.mjs +4 -4
  99. package/dist/chem/solution/dilution.mjs +6 -6
  100. package/dist/chem/solution/field.d.mts +2 -2
  101. package/dist/chem/solution/field.mjs +2 -2
  102. package/dist/chem/solution/solution-box.mjs +7 -7
  103. package/dist/chem/stoichiometry/preset.mjs +5 -5
  104. package/dist/chem/titration/preset.mjs +5 -5
  105. package/dist/circuits/ac-dc/asset.mjs +1 -1
  106. package/dist/circuits/ac-dc/preset.mjs +2 -2
  107. package/dist/circuits/brownout/index.d.mts +1 -0
  108. package/dist/circuits/brownout/preset.d.mts +22 -0
  109. package/dist/circuits/brownout/preset.mjs +399 -0
  110. package/dist/circuits/capacitor-leak/preset.mjs +13 -8
  111. package/dist/circuits/circuit/asset.mjs +71 -14
  112. package/dist/circuits/circuit/preset.mjs +23 -5
  113. package/dist/circuits/circuit-builder.mjs +60 -132
  114. package/dist/circuits/circuit-lab.mjs +60 -40
  115. package/dist/circuits/cmos-gate/index.d.mts +1 -0
  116. package/dist/circuits/cmos-gate/preset.d.mts +75 -0
  117. package/dist/circuits/cmos-gate/preset.mjs +1491 -0
  118. package/dist/circuits/diode/index.d.mts +1 -0
  119. package/dist/circuits/diode/preset.d.mts +25 -0
  120. package/dist/circuits/diode/preset.mjs +266 -0
  121. package/dist/circuits/index.d.mts +7 -1
  122. package/dist/circuits/index.mjs +7 -1
  123. package/dist/circuits/rc-charging/index.d.mts +1 -0
  124. package/dist/circuits/rc-charging/preset.d.mts +27 -0
  125. package/dist/circuits/rc-charging/preset.mjs +329 -0
  126. package/dist/circuits/semiconductor/index.d.mts +1 -0
  127. package/dist/circuits/semiconductor/preset.d.mts +102 -0
  128. package/dist/circuits/semiconductor/preset.mjs +1855 -0
  129. package/dist/circuits/transistor/index.d.mts +1 -0
  130. package/dist/circuits/transistor/preset.d.mts +27 -0
  131. package/dist/circuits/transistor/preset.mjs +329 -0
  132. package/dist/commerce/accounting/core.d.mts +1 -1
  133. package/dist/commerce/accounting/equation-balance.mjs +5 -5
  134. package/dist/commerce/accounting/journal-poster.mjs +8 -8
  135. package/dist/commerce/accounting/statement-sorter.mjs +4 -4
  136. package/dist/commerce/economics/core.d.mts +2 -2
  137. package/dist/commerce/economics/core.mjs +1 -1
  138. package/dist/commerce/economics/demand-shift-vs-move.mjs +6 -6
  139. package/dist/commerce/economics/elasticity-revenue.mjs +6 -6
  140. package/dist/commerce/economics/market-equilibrium.mjs +5 -5
  141. package/dist/core/easing.d.mts +3 -3
  142. package/dist/core/easing.mjs +2 -2
  143. package/dist/core/numeric.d.mts +3 -3
  144. package/dist/core/numeric.mjs +2 -2
  145. package/dist/core/reactive.d.mts +1 -1
  146. package/dist/core/reactive.mjs +1 -1
  147. package/dist/core/rng.d.mts +2 -2
  148. package/dist/core/rng.mjs +1 -1
  149. package/dist/core/tex.mjs +2 -2
  150. package/dist/core/timeline.d.mts +1 -1
  151. package/dist/core/timeline.mjs +1 -1
  152. package/dist/core/util.mjs +11 -1
  153. package/dist/discrete/arrangements/preset.mjs +6 -14
  154. package/dist/discrete/bayes/preset.mjs +43 -35
  155. package/dist/discrete/binomial/preset.mjs +2 -2
  156. package/dist/discrete/combination-studio/figure.d.mts +6 -0
  157. package/dist/discrete/combination-studio/figure.mjs +159 -0
  158. package/dist/discrete/combination-studio/index.d.mts +2 -0
  159. package/dist/discrete/combination-studio/preset.d.mts +44 -0
  160. package/dist/discrete/combination-studio/preset.mjs +440 -0
  161. package/dist/discrete/core/combinatorics.d.mts +23 -3
  162. package/dist/discrete/core/combinatorics.mjs +38 -3
  163. package/dist/discrete/core/pigeonhole.d.mts +1 -1
  164. package/dist/discrete/core/pigeonhole.mjs +1 -1
  165. package/dist/discrete/core/probability.d.mts +3 -3
  166. package/dist/discrete/core/probability.mjs +3 -3
  167. package/dist/discrete/core/sets.d.mts +1 -1
  168. package/dist/discrete/counting-slots/preset.mjs +8 -8
  169. package/dist/discrete/counting-tree/preset.mjs +65 -8
  170. package/dist/discrete/expected-value/preset.mjs +13 -13
  171. package/dist/discrete/hypergeometric/preset.mjs +48 -15
  172. package/dist/discrete/index.d.mts +4 -2
  173. package/dist/discrete/index.mjs +4 -2
  174. package/dist/discrete/karnaugh/preset.mjs +26 -20
  175. package/dist/discrete/lln/preset.mjs +44 -3
  176. package/dist/discrete/logic-circuit/preset.mjs +2 -2
  177. package/dist/discrete/monte-carlo/preset.d.mts +1 -1
  178. package/dist/discrete/monte-carlo/preset.mjs +14 -14
  179. package/dist/discrete/monty-hall/preset.mjs +6 -6
  180. package/dist/discrete/outcome-builder/preset.mjs +3 -3
  181. package/dist/discrete/pascal/preset.mjs +37 -7
  182. package/dist/discrete/rules.d.mts +20 -0
  183. package/dist/discrete/rules.mjs +264 -0
  184. package/dist/discrete/sample-space/preset.mjs +4 -4
  185. package/dist/discrete/selection/preset.mjs +7 -13
  186. package/dist/discrete/truth-table/preset.mjs +32 -9
  187. package/dist/discrete/venn/preset.mjs +71 -48
  188. package/dist/geography/cycle-lab/preset.mjs +17 -10
  189. package/dist/geography/cycles.d.mts +3 -3
  190. package/dist/geography/cycles.mjs +3 -3
  191. package/dist/geometry/board/preset.d.mts +2 -0
  192. package/dist/geometry/board/preset.mjs +11 -15
  193. package/dist/geometry/builder.mjs +3 -3
  194. package/dist/ict/number-systems/base-odometer.mjs +4 -4
  195. package/dist/ict/number-systems/bit-grouper.d.mts +1 -1
  196. package/dist/ict/number-systems/bit-grouper.mjs +4 -4
  197. package/dist/ict/number-systems/place-value-dial.d.mts +1 -1
  198. package/dist/ict/number-systems/place-value-dial.mjs +3 -3
  199. package/dist/ict/number-systems/wheel.d.mts +3 -3
  200. package/dist/ict/number-systems/wheel.mjs +4 -4
  201. package/dist/kit/annotate.mjs +3 -3
  202. package/dist/kit/answer-check.d.mts +2 -2
  203. package/dist/kit/answer-check.mjs +34 -6
  204. package/dist/kit/ask.d.mts +19 -0
  205. package/dist/kit/ask.mjs +46 -0
  206. package/dist/kit/bar-strip.mjs +53 -0
  207. package/dist/kit/calc.d.mts +33 -0
  208. package/dist/kit/calc.mjs +27 -0
  209. package/dist/kit/carrier-engine.mjs +147 -0
  210. package/dist/kit/clue-scene.d.mts +86 -0
  211. package/dist/kit/clue-scene.mjs +424 -0
  212. package/dist/kit/cluster.d.mts +30 -0
  213. package/dist/kit/cluster.mjs +81 -0
  214. package/dist/kit/controls.mjs +11 -5
  215. package/dist/kit/coords.d.mts +88 -0
  216. package/dist/kit/coords.mjs +192 -0
  217. package/dist/kit/data-scene.d.mts +27 -0
  218. package/dist/kit/data-scene.mjs +199 -0
  219. package/dist/kit/diagram.mjs +111 -50
  220. package/dist/kit/electronics.mjs +552 -60
  221. package/dist/kit/expr-analysis.d.mts +18 -6
  222. package/dist/kit/expr-analysis.mjs +82 -28
  223. package/dist/kit/frame.d.mts +3 -3
  224. package/dist/kit/frame.mjs +25 -6
  225. package/dist/kit/gameshow.mjs +2 -2
  226. package/dist/kit/index.d.mts +14 -2
  227. package/dist/kit/index.mjs +13 -1
  228. package/dist/kit/logic-gates.mjs +246 -47
  229. package/dist/kit/palette.mjs +26 -0
  230. package/dist/kit/pedagogy.d.mts +4 -4
  231. package/dist/kit/pedagogy.mjs +21 -17
  232. package/dist/kit/play.d.mts +1 -1
  233. package/dist/kit/play.mjs +3 -3
  234. package/dist/kit/predict.d.mts +55 -0
  235. package/dist/kit/predict.mjs +146 -0
  236. package/dist/kit/receipt.d.mts +29 -0
  237. package/dist/kit/receipt.mjs +94 -0
  238. package/dist/kit/rich.mjs +2 -2
  239. package/dist/kit/rule.d.mts +59 -0
  240. package/dist/kit/rule.mjs +215 -0
  241. package/dist/kit/scale.mjs +1 -1
  242. package/dist/kit/scene-library.d.mts +22 -0
  243. package/dist/kit/scene-library.mjs +311 -0
  244. package/dist/kit/scene-studio.d.mts +14 -0
  245. package/dist/kit/scene-studio.mjs +338 -0
  246. package/dist/kit/scenes.d.mts +31 -0
  247. package/dist/kit/scenes.mjs +569 -0
  248. package/dist/kit/slot-fill.d.mts +61 -0
  249. package/dist/kit/slot-fill.mjs +207 -0
  250. package/dist/kit/solve.d.mts +21 -0
  251. package/dist/kit/solve.mjs +75 -0
  252. package/dist/kit/space.mjs +5 -5
  253. package/dist/kit/steps.mjs +2 -2
  254. package/dist/kit/vessel.d.mts +69 -0
  255. package/dist/kit/vessel.mjs +191 -0
  256. package/dist/language/agreement/preset.mjs +2 -2
  257. package/dist/language/article-lens/preset.d.mts +1 -1
  258. package/dist/language/article-lens/preset.mjs +8 -8
  259. package/dist/language/deck.d.mts +3 -3
  260. package/dist/language/deck.mjs +1 -1
  261. package/dist/language/preposition-scene/preset.d.mts +2 -2
  262. package/dist/language/preposition-scene/preset.mjs +5 -5
  263. package/dist/language/sentence-builder/preset.mjs +5 -5
  264. package/dist/language/transform/preset.d.mts +2 -2
  265. package/dist/language/transform/preset.mjs +5 -5
  266. package/dist/language/ui.d.mts +3 -3
  267. package/dist/language/ui.mjs +4 -4
  268. package/dist/language/word-match/preset.mjs +3 -3
  269. package/dist/logic/LogicBuildLab.d.mts +22 -0
  270. package/dist/logic/LogicBuildLab.mjs +170 -0
  271. package/dist/logic/LogicEditScene.d.mts +31 -0
  272. package/dist/logic/LogicEditScene.mjs +276 -0
  273. package/dist/logic/LogicEditor.d.mts +14 -0
  274. package/dist/logic/LogicEditor.mjs +413 -0
  275. package/dist/logic/LogicScene.d.mts +32 -0
  276. package/dist/logic/LogicScene.mjs +277 -0
  277. package/dist/logic/contract.d.mts +72 -0
  278. package/dist/logic/display.d.mts +24 -0
  279. package/dist/logic/display.mjs +127 -0
  280. package/dist/logic/edit-ops.d.mts +44 -0
  281. package/dist/logic/edit-ops.mjs +177 -0
  282. package/dist/logic/evaluate.d.mts +11 -0
  283. package/dist/logic/evaluate.mjs +93 -0
  284. package/dist/logic/gates.d.mts +10 -0
  285. package/dist/logic/gates.mjs +73 -0
  286. package/dist/logic/index.d.mts +14 -0
  287. package/dist/logic/index.mjs +13 -0
  288. package/dist/logic/lab.d.mts +32 -0
  289. package/dist/logic/lab.mjs +160 -0
  290. package/dist/logic/presets.d.mts +12 -0
  291. package/dist/logic/presets.mjs +241 -0
  292. package/dist/logic/registry.d.mts +9 -0
  293. package/dist/logic/registry.mjs +15 -0
  294. package/dist/math/area-model/preset.mjs +70 -44
  295. package/dist/math/balance-algebra/preset.mjs +14 -5
  296. package/dist/math/broken-tree/index.d.mts +1 -0
  297. package/dist/math/broken-tree/preset.d.mts +26 -0
  298. package/dist/math/broken-tree/preset.mjs +435 -0
  299. package/dist/math/circle/index.d.mts +1 -0
  300. package/dist/math/circle/preset.d.mts +44 -0
  301. package/dist/math/circle/preset.mjs +198 -0
  302. package/dist/math/complex/core.d.mts +93 -0
  303. package/dist/math/complex/core.mjs +239 -0
  304. package/dist/math/complex/index.d.mts +3 -0
  305. package/dist/math/complex/preset.d.mts +31 -0
  306. package/dist/math/complex/preset.mjs +377 -0
  307. package/dist/math/complex/rules.d.mts +6 -0
  308. package/dist/math/complex/rules.mjs +121 -0
  309. package/dist/math/conic/index.d.mts +1 -0
  310. package/dist/math/conic/preset.d.mts +30 -0
  311. package/dist/math/conic/preset.mjs +334 -0
  312. package/dist/math/derivation.mjs +5 -5
  313. package/dist/math/derivative-explorer/preset.mjs +5 -5
  314. package/dist/math/domain-range/index.d.mts +1 -0
  315. package/dist/math/domain-range/preset.d.mts +33 -0
  316. package/dist/math/domain-range/preset.mjs +313 -0
  317. package/dist/math/fraction-bar/index.d.mts +1 -0
  318. package/dist/math/fraction-bar/preset.d.mts +27 -0
  319. package/dist/math/fraction-bar/preset.mjs +197 -0
  320. package/dist/math/function-machine/preset.mjs +2 -2
  321. package/dist/math/gradient-descent.mjs +6 -6
  322. package/dist/math/grapher/preset.d.mts +1 -1
  323. package/dist/math/grapher/preset.mjs +4 -4
  324. package/dist/math/harmonic-form/preset.mjs +6 -6
  325. package/dist/math/index.d.mts +27 -2
  326. package/dist/math/index.mjs +27 -2
  327. package/dist/math/integral-explorer/preset.mjs +2 -2
  328. package/dist/math/interactive/preset.mjs +3 -3
  329. package/dist/math/limit-explorer/preset.mjs +4 -4
  330. package/dist/math/linear-model/index.d.mts +1 -0
  331. package/dist/math/linear-model/preset.d.mts +53 -0
  332. package/dist/math/linear-model/preset.mjs +164 -0
  333. package/dist/math/linear-system/preset.mjs +4 -4
  334. package/dist/math/mystery-bucket/preset.mjs +6 -6
  335. package/dist/math/number-line/preset.mjs +3 -2
  336. package/dist/math/parabola/preset.mjs +4 -3
  337. package/dist/math/pattern/preset.mjs +7 -13
  338. package/dist/math/percent-bar/index.d.mts +1 -0
  339. package/dist/math/percent-bar/preset.d.mts +37 -0
  340. package/dist/math/percent-bar/preset.mjs +275 -0
  341. package/dist/math/poly/core.d.mts +50 -0
  342. package/dist/math/poly/core.mjs +268 -0
  343. package/dist/math/poly/index.d.mts +3 -0
  344. package/dist/math/poly/preset.d.mts +23 -0
  345. package/dist/math/poly/preset.mjs +141 -0
  346. package/dist/math/poly/steps.d.mts +10 -0
  347. package/dist/math/poly/steps.mjs +99 -0
  348. package/dist/math/rate-machine/index.d.mts +1 -0
  349. package/dist/math/rate-machine/preset.d.mts +35 -0
  350. package/dist/math/rate-machine/preset.mjs +281 -0
  351. package/dist/math/ratio-share/index.d.mts +1 -0
  352. package/dist/math/ratio-share/preset.d.mts +24 -0
  353. package/dist/math/ratio-share/preset.mjs +204 -0
  354. package/dist/math/receipt/index.d.mts +1 -0
  355. package/dist/math/receipt/preset.d.mts +22 -0
  356. package/dist/math/receipt/preset.mjs +137 -0
  357. package/dist/math/sequence-predict/index.d.mts +1 -0
  358. package/dist/math/sequence-predict/preset.d.mts +34 -0
  359. package/dist/math/sequence-predict/preset.mjs +130 -0
  360. package/dist/math/straight-line/index.d.mts +1 -0
  361. package/dist/math/straight-line/preset.d.mts +37 -0
  362. package/dist/math/straight-line/preset.mjs +374 -0
  363. package/dist/math/system-solve/index.d.mts +1 -0
  364. package/dist/math/system-solve/preset.d.mts +21 -0
  365. package/dist/math/system-solve/preset.mjs +227 -0
  366. package/dist/math/transform/index.d.mts +1 -0
  367. package/dist/math/transform/preset.d.mts +41 -0
  368. package/dist/math/transform/preset.mjs +343 -0
  369. package/dist/math/triangle-trig/preset.mjs +12 -9
  370. package/dist/math/trig/core.d.mts +37 -0
  371. package/dist/math/trig/core.mjs +150 -0
  372. package/dist/math/trig/diagrams.d.mts +1 -0
  373. package/dist/math/trig/diagrams.mjs +321 -0
  374. package/dist/math/trig/index.d.mts +3 -0
  375. package/dist/math/trig/preset.d.mts +25 -0
  376. package/dist/math/trig/preset.mjs +260 -0
  377. package/dist/math/trig/rules.d.mts +6 -0
  378. package/dist/math/trig/rules.mjs +159 -0
  379. package/dist/math/trig-explorer.mjs +4 -4
  380. package/dist/ml/boundary/preset.mjs +8 -3
  381. package/dist/ml/classifier/preset.mjs +31 -6
  382. package/dist/ml/kmeans/preset.mjs +4 -4
  383. package/dist/ml/knn/preset.mjs +47 -12
  384. package/dist/ml/regression/preset.mjs +36 -7
  385. package/dist/physics/atwood/preset.mjs +4 -4
  386. package/dist/physics/bullet-walls/preset.d.mts +1 -1
  387. package/dist/physics/bullet-walls/preset.mjs +7 -7
  388. package/dist/physics/carnot/preset.mjs +6 -6
  389. package/dist/physics/circular-motion/preset.mjs +36 -5
  390. package/dist/physics/collision-track/preset.mjs +35 -5
  391. package/dist/physics/efficiency/preset.d.mts +2 -2
  392. package/dist/physics/efficiency/preset.mjs +5 -5
  393. package/dist/physics/electric-field/preset.mjs +32 -23
  394. package/dist/physics/electric-flux/index.d.mts +1 -0
  395. package/dist/physics/electric-flux/preset.d.mts +29 -0
  396. package/dist/physics/electric-flux/preset.mjs +264 -0
  397. package/dist/physics/energy-skate/preset.mjs +5 -5
  398. package/dist/physics/entropy/preset.mjs +7 -7
  399. package/dist/physics/expansion/preset.mjs +13 -13
  400. package/dist/physics/exponential/asset.mjs +1 -1
  401. package/dist/physics/exponential/preset.mjs +4 -4
  402. package/dist/physics/gas-process/preset.mjs +3 -3
  403. package/dist/physics/gauss-law/index.d.mts +1 -0
  404. package/dist/physics/gauss-law/preset.d.mts +20 -0
  405. package/dist/physics/gauss-law/preset.mjs +286 -0
  406. package/dist/physics/gravitation/preset.mjs +7 -7
  407. package/dist/physics/gravity-drop.mjs +4 -4
  408. package/dist/physics/heat-transfer/preset.d.mts +1 -1
  409. package/dist/physics/heat-transfer/preset.mjs +10 -10
  410. package/dist/physics/impulse/preset.mjs +5 -5
  411. package/dist/physics/index.d.mts +4 -1
  412. package/dist/physics/index.mjs +4 -1
  413. package/dist/physics/kepler/preset.mjs +4 -4
  414. package/dist/physics/lever/preset.mjs +3 -3
  415. package/dist/physics/lorentz/preset.mjs +11 -11
  416. package/dist/physics/magnetism/preset.mjs +3 -3
  417. package/dist/physics/optics/preset.mjs +2 -2
  418. package/dist/physics/orbit-lab.mjs +5 -5
  419. package/dist/physics/projectile-lab.mjs +4 -4
  420. package/dist/physics/rain-relative/preset.mjs +5 -5
  421. package/dist/physics/ramp-forces/preset.mjs +5 -5
  422. package/dist/physics/river-boat.mjs +6 -6
  423. package/dist/physics/shm/preset.mjs +9 -9
  424. package/dist/physics/stopping-distance/preset.mjs +3 -3
  425. package/dist/physics/temperature-scales/preset.mjs +105 -116
  426. package/dist/physics/terminal-velocity/preset.mjs +5 -5
  427. package/dist/physics/thermal/preset.mjs +5 -5
  428. package/dist/physics/vector-board/preset.mjs +7 -6
  429. package/dist/physics/vector-scene.mjs +2 -2
  430. package/dist/physics/vector-types/preset.mjs +37 -3
  431. package/dist/physics/water-density/preset.mjs +12 -12
  432. package/dist/physics/waves/doppler.mjs +2 -2
  433. package/dist/physics/waves/preset.mjs +4 -4
  434. package/dist/physics/waves/ripple.mjs +6 -6
  435. package/dist/physics/waves/string.mjs +5 -5
  436. package/dist/physics/work-energy/preset.mjs +4 -4
  437. package/dist/physics/work-potential/index.d.mts +1 -0
  438. package/dist/physics/work-potential/preset.d.mts +20 -0
  439. package/dist/physics/work-potential/preset.mjs +276 -0
  440. package/dist/schemas/index.d.mts +6 -6
  441. package/dist/schemas/index.mjs +3 -3
  442. package/dist/statistics/center-spread/preset.mjs +3 -3
  443. package/dist/statistics/core/descriptive.d.mts +2 -2
  444. package/dist/statistics/core/descriptive.mjs +2 -2
  445. package/dist/statistics/core/normal.d.mts +3 -3
  446. package/dist/statistics/core/normal.mjs +3 -3
  447. package/dist/statistics/core/sequences.d.mts +1 -1
  448. package/dist/statistics/galton/preset.mjs +2 -2
  449. package/dist/statistics/histogram/preset.mjs +6 -6
  450. package/dist/statistics/normal/preset.mjs +2 -2
  451. package/dist/statistics/sampling/preset.mjs +4 -4
  452. package/dist/statistics/sequence/preset.mjs +58 -15
  453. package/dist/statistics/z-table/preset.mjs +17 -4
  454. package/package.json +11 -3
  455. package/styles.css +4 -1
@@ -0,0 +1,311 @@
1
+ 'use client';
2
+
3
+ import { dataScene, registerDataScene } from "./data-scene.mjs";
4
+ import { SceneStudio } from "./scene-studio.mjs";
5
+ import { useEffect, useRef, useState } from "react";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+
8
+ //#region src/kit/scene-library.tsx
9
+ /**
10
+ * The project Scene Library, persistence + a polished manager for the no-code skins a
11
+ * project keeps. Specs live as data; `registerScenes(loadSceneLibrary())` at app boot makes
12
+ * every saved skin available in every lab and picker. `SceneLibraryManager` is the in-product
13
+ * surface: a tidy card grid with a light-dismiss dialog (SceneStudio inside) for add/edit and
14
+ * an inline confirm for delete. Native <dialog closedby="any">, @starting-style entry/exit,
15
+ * reduced-motion aware, stage-token themed, one component, no new deps.
16
+ */
17
+ const KEY = "classytic.sceneLibrary";
18
+ function loadSceneLibrary() {
19
+ if (typeof window === "undefined") return [];
20
+ try {
21
+ const raw = window.localStorage.getItem(KEY);
22
+ return raw ? JSON.parse(raw) : [];
23
+ } catch {
24
+ return [];
25
+ }
26
+ }
27
+ function saveSceneLibrary(specs) {
28
+ if (typeof window === "undefined") return;
29
+ try {
30
+ window.localStorage.setItem(KEY, JSON.stringify(specs));
31
+ } catch {}
32
+ }
33
+ /** Bulk-register saved skins. Call once at app boot: registerScenes(loadSceneLibrary()). */
34
+ function registerScenes(specs) {
35
+ specs.forEach(registerDataScene);
36
+ }
37
+ /** Load + register saved skins on mount; mutations persist and re-register. */
38
+ function useSceneLibrary() {
39
+ const [specs, setSpecs] = useState([]);
40
+ useEffect(() => {
41
+ const loaded = loadSceneLibrary();
42
+ registerScenes(loaded);
43
+ setSpecs(loaded);
44
+ }, []);
45
+ const persist = (next) => {
46
+ setSpecs(next);
47
+ saveSceneLibrary(next);
48
+ registerScenes(next);
49
+ };
50
+ return {
51
+ specs,
52
+ upsert: (spec, prevName) => persist([...specs.filter((s) => s.name !== spec.name && s.name !== prevName), spec]),
53
+ remove: (name) => persist(specs.filter((s) => s.name !== name))
54
+ };
55
+ }
56
+ const previewOf = (spec) => spec.kind === "count" ? dataScene(spec).render({
57
+ count: 6,
58
+ highlight: 2,
59
+ width: 130,
60
+ height: 116
61
+ }) : dataScene(spec).render({
62
+ frac: .6,
63
+ width: 130,
64
+ height: 116
65
+ });
66
+ const STYLE = `
67
+ .scl{ --scl-line: color-mix(in oklab, var(--stage-fg) 14%, transparent); }
68
+ .scl-head{ display:flex; align-items:center; gap:12px; margin-bottom:14px; }
69
+ .scl-h{ font-weight:800; font-size:16px; margin:0; }
70
+ .scl-count{ font-size:12px; font-weight:700; color:var(--stage-muted); }
71
+ .scl-spacer{ flex:1; }
72
+ .scl-btn{ font-weight:700; font-size:13px; border-radius:9px; padding:8px 14px; cursor:pointer; border:1.5px solid var(--scl-line); background:transparent; color:var(--stage-fg); }
73
+ .scl-btn--primary{ border-color:var(--stage-accent); background:var(--stage-accent); color:#fff; }
74
+ .scl-btn--ghost{ border-color:transparent; }
75
+ .scl-btn:disabled{ opacity:.45; cursor:not-allowed; }
76
+ .scl-grid{ display:grid; grid-template-columns:repeat(auto-fill, minmax(168px,1fr)); gap:14px; }
77
+ .scl-card{ position:relative; display:grid; justify-items:center; gap:6px; padding:14px 12px 12px; border:1px solid var(--scl-line); border-radius:14px; background:var(--stage-bg);
78
+ opacity:1; transition: opacity .25s ease, translate .25s ease, box-shadow .15s ease; }
79
+ .scl-card:hover{ box-shadow:0 6px 18px rgba(0,0,0,.08); }
80
+ @starting-style{ .scl-card{ opacity:0; translate:0 8px; } }
81
+ .scl-fig{ min-height:120px; display:grid; place-items:center; }
82
+ .scl-name{ font-weight:800; font-size:14px; }
83
+ .scl-sub{ font-size:11px; color:var(--stage-muted); }
84
+ .scl-actions{ position:absolute; top:8px; right:8px; display:flex; gap:4px; opacity:0; transition:opacity .15s ease; }
85
+ .scl-card:hover .scl-actions, .scl-card:focus-within .scl-actions{ opacity:1; }
86
+ .scl-icon{ width:28px; height:28px; border-radius:8px; display:grid; place-items:center; cursor:pointer; border:1px solid var(--scl-line); background:var(--stage-bg); color:var(--stage-fg); font-size:13px; }
87
+ .scl-icon:hover{ background:color-mix(in oklab, var(--stage-fg) 8%, transparent); }
88
+ .scl-confirm{ position:absolute; inset:0; display:grid; place-items:center; gap:8px; background:color-mix(in oklab, var(--stage-bg) 88%, transparent); border-radius:14px; }
89
+ .scl-empty{ display:grid; justify-items:center; gap:8px; padding:34px; border:1.5px dashed var(--scl-line); border-radius:14px; color:var(--stage-muted); text-align:center; }
90
+ .scl-dialog{ border:none; border-radius:16px; padding:0; width:min(620px, 94vw); background:var(--stage-bg); color:var(--stage-fg); box-shadow:0 24px 70px rgba(0,0,0,.28);
91
+ opacity:0; translate:0 14px; transition: opacity .22s ease, translate .22s ease, overlay .22s allow-discrete, display .22s allow-discrete; }
92
+ .scl-dialog[open]{ opacity:1; translate:0 0; }
93
+ @starting-style{ .scl-dialog[open]{ opacity:0; translate:0 14px; } }
94
+ .scl-dialog::backdrop{ background:rgba(0,0,0,.45); backdrop-filter:blur(2px); }
95
+ .scl-dlg-body{ padding:20px; display:grid; gap:16px; }
96
+ .scl-dlg-h{ font-weight:800; font-size:17px; margin:0; }
97
+ .scl-foot{ display:flex; justify-content:flex-end; gap:10px; }
98
+ .scl-err{ font-size:12px; font-weight:600; color:var(--stage-warn); }
99
+ @media (prefers-reduced-motion: reduce){
100
+ .scl-card, .scl-dialog{ translate:none; transition-duration:.05s; }
101
+ @starting-style{ .scl-card, .scl-dialog[open]{ translate:none; } }
102
+ }`;
103
+ const BLANK = {
104
+ name: "",
105
+ kind: "count",
106
+ icon: "🍩",
107
+ label: ""
108
+ };
109
+ function SceneLibraryManager({ onUse }) {
110
+ const lib = useSceneLibrary();
111
+ const dlg = useRef(null);
112
+ const [draft, setDraft] = useState(BLANK);
113
+ const [editing, setEditing] = useState(void 0);
114
+ const [confirm, setConfirm] = useState(null);
115
+ const open = (spec) => {
116
+ setDraft(spec ?? BLANK);
117
+ setEditing(spec?.name);
118
+ dlg.current?.showModal();
119
+ };
120
+ useEffect(() => {
121
+ const d = dlg.current;
122
+ if (!d) return;
123
+ d.setAttribute("closedby", "any");
124
+ if ("closedBy" in HTMLDialogElement.prototype) return;
125
+ const onClick = (e) => {
126
+ if (e.target !== d) return;
127
+ const r = d.getBoundingClientRect();
128
+ if (!(r.top <= e.clientY && e.clientY <= r.top + r.height && r.left <= e.clientX && e.clientX <= r.left + r.width)) d.close();
129
+ };
130
+ d.addEventListener("click", onClick);
131
+ return () => d.removeEventListener("click", onClick);
132
+ }, []);
133
+ const nameTrim = draft.name.trim();
134
+ const dup = lib.specs.some((s) => s.name === nameTrim && s.name !== editing);
135
+ const valid = nameTrim.length > 0 && !dup;
136
+ const save = () => {
137
+ if (!valid) return;
138
+ lib.upsert(draft, editing);
139
+ dlg.current?.close();
140
+ };
141
+ return /* @__PURE__ */ jsxs("div", {
142
+ className: "scl",
143
+ children: [
144
+ /* @__PURE__ */ jsx("style", { children: STYLE }),
145
+ /* @__PURE__ */ jsxs("div", {
146
+ className: "scl-head",
147
+ children: [
148
+ /* @__PURE__ */ jsx("h3", {
149
+ className: "scl-h",
150
+ children: "Custom scenes"
151
+ }),
152
+ /* @__PURE__ */ jsxs("span", {
153
+ className: "scl-count",
154
+ children: [lib.specs.length, " saved · used across every lesson"]
155
+ }),
156
+ /* @__PURE__ */ jsx("span", { className: "scl-spacer" }),
157
+ /* @__PURE__ */ jsx("button", {
158
+ type: "button",
159
+ className: "scl-btn scl-btn--primary",
160
+ onClick: () => open(),
161
+ children: "+ New scene"
162
+ })
163
+ ]
164
+ }),
165
+ lib.specs.length === 0 ? /* @__PURE__ */ jsxs("div", {
166
+ className: "scl-empty",
167
+ children: [
168
+ /* @__PURE__ */ jsx("strong", { children: "No custom scenes yet" }),
169
+ /* @__PURE__ */ jsx("span", { children: "Create a skin from an emoji or a shape, no code. It saves to this project and works in every lab." }),
170
+ /* @__PURE__ */ jsx("button", {
171
+ type: "button",
172
+ className: "scl-btn scl-btn--primary",
173
+ onClick: () => open(),
174
+ style: { marginTop: 4 },
175
+ children: "+ New scene"
176
+ })
177
+ ]
178
+ }) : /* @__PURE__ */ jsx("div", {
179
+ className: "scl-grid",
180
+ children: lib.specs.map((spec) => /* @__PURE__ */ jsxs("div", {
181
+ className: "scl-card",
182
+ children: [
183
+ /* @__PURE__ */ jsx("div", {
184
+ className: "scl-fig",
185
+ children: previewOf(spec)
186
+ }),
187
+ /* @__PURE__ */ jsx("span", {
188
+ className: "scl-name",
189
+ children: spec.label || spec.name
190
+ }),
191
+ /* @__PURE__ */ jsxs("span", {
192
+ className: "scl-sub",
193
+ children: [
194
+ /* @__PURE__ */ jsx("code", { children: spec.name }),
195
+ " · ",
196
+ spec.kind === "count" ? "count" : "level"
197
+ ]
198
+ }),
199
+ /* @__PURE__ */ jsxs("div", {
200
+ className: "scl-actions",
201
+ children: [
202
+ onUse && /* @__PURE__ */ jsx("button", {
203
+ type: "button",
204
+ className: "scl-icon",
205
+ title: "Use in the lab",
206
+ "aria-label": `use ${spec.name}`,
207
+ onClick: () => onUse(spec),
208
+ children: "▸"
209
+ }),
210
+ /* @__PURE__ */ jsx("button", {
211
+ type: "button",
212
+ className: "scl-icon",
213
+ title: "Edit",
214
+ "aria-label": `edit ${spec.name}`,
215
+ onClick: () => open(spec),
216
+ children: "✎"
217
+ }),
218
+ /* @__PURE__ */ jsx("button", {
219
+ type: "button",
220
+ className: "scl-icon",
221
+ title: "Delete",
222
+ "aria-label": `delete ${spec.name}`,
223
+ onClick: () => setConfirm(spec.name),
224
+ children: "🗑"
225
+ })
226
+ ]
227
+ }),
228
+ confirm === spec.name && /* @__PURE__ */ jsxs("div", {
229
+ className: "scl-confirm",
230
+ children: [/* @__PURE__ */ jsxs("strong", {
231
+ style: { fontSize: 13 },
232
+ children: [
233
+ "Delete “",
234
+ spec.label || spec.name,
235
+ "”?"
236
+ ]
237
+ }), /* @__PURE__ */ jsxs("div", {
238
+ style: {
239
+ display: "flex",
240
+ gap: 8
241
+ },
242
+ children: [/* @__PURE__ */ jsx("button", {
243
+ type: "button",
244
+ className: "scl-btn scl-btn--ghost",
245
+ onClick: () => setConfirm(null),
246
+ children: "Cancel"
247
+ }), /* @__PURE__ */ jsx("button", {
248
+ type: "button",
249
+ className: "scl-btn",
250
+ style: {
251
+ borderColor: "var(--stage-warn)",
252
+ color: "var(--stage-warn)"
253
+ },
254
+ onClick: () => {
255
+ lib.remove(spec.name);
256
+ setConfirm(null);
257
+ },
258
+ children: "Delete"
259
+ })]
260
+ })]
261
+ })
262
+ ]
263
+ }, spec.name))
264
+ }),
265
+ /* @__PURE__ */ jsx("dialog", {
266
+ ref: dlg,
267
+ className: "scl-dialog",
268
+ "aria-label": "Edit custom scene",
269
+ children: /* @__PURE__ */ jsxs("div", {
270
+ className: "scl-dlg-body",
271
+ children: [
272
+ /* @__PURE__ */ jsx("h4", {
273
+ className: "scl-dlg-h",
274
+ children: editing ? "Edit scene" : "New scene"
275
+ }),
276
+ /* @__PURE__ */ jsx(SceneStudio, {
277
+ spec: draft,
278
+ onChange: setDraft
279
+ }),
280
+ dup && /* @__PURE__ */ jsxs("span", {
281
+ className: "scl-err",
282
+ children: [
283
+ "A scene named “",
284
+ nameTrim,
285
+ "” already exists, pick another name."
286
+ ]
287
+ }),
288
+ /* @__PURE__ */ jsxs("div", {
289
+ className: "scl-foot",
290
+ children: [/* @__PURE__ */ jsx("button", {
291
+ type: "button",
292
+ className: "scl-btn scl-btn--ghost",
293
+ onClick: () => dlg.current?.close(),
294
+ children: "Cancel"
295
+ }), /* @__PURE__ */ jsx("button", {
296
+ type: "button",
297
+ className: "scl-btn scl-btn--primary",
298
+ disabled: !valid,
299
+ onClick: save,
300
+ children: editing ? "Save changes" : "Add to library"
301
+ })]
302
+ })
303
+ ]
304
+ })
305
+ })
306
+ ]
307
+ });
308
+ }
309
+
310
+ //#endregion
311
+ export { SceneLibraryManager, loadSceneLibrary, registerScenes, saveSceneLibrary, useSceneLibrary };
@@ -0,0 +1,14 @@
1
+ import { DataSceneSpec } from "./data-scene.mjs";
2
+ import { ReactNode } from "react";
3
+
4
+ //#region src/kit/scene-studio.d.ts
5
+ interface SceneStudioProps {
6
+ spec: DataSceneSpec;
7
+ onChange: (spec: DataSceneSpec) => void;
8
+ }
9
+ declare function SceneStudio({
10
+ spec,
11
+ onChange
12
+ }: SceneStudioProps): ReactNode;
13
+ //#endregion
14
+ export { SceneStudio, SceneStudioProps };
@@ -0,0 +1,338 @@
1
+ 'use client';
2
+
3
+ import { dataScene } from "./data-scene.mjs";
4
+ import { useId } from "react";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+
7
+ //#region src/kit/scene-studio.tsx
8
+ /**
9
+ * SceneStudio, the no-code form that authors a {@link DataSceneSpec}: a creator picks an
10
+ * emoji or a shape + colour and gets a live preview, no render function, no JSON. It is the
11
+ * UI front of `registerDataScene`, so a skin invented entirely in-product becomes a real
12
+ * registry scene usable in any lab and listed in every picker.
13
+ *
14
+ * Controlled + self-contained (plain inputs, --stage-* tokens) so it drops into a CMS block
15
+ * OR a standalone tool. It does NOT register anything itself, the host decides when to
16
+ * `registerDataScene(spec)`; the preview is rendered straight from `dataScene(spec)`.
17
+ */
18
+ function toFlat(s) {
19
+ const base = {
20
+ name: s.name,
21
+ label: s.label ?? "",
22
+ icon: "⭐",
23
+ slots: 5,
24
+ shape: "box",
25
+ color: "#7c83ff"
26
+ };
27
+ if (s.kind === "count") return {
28
+ ...base,
29
+ variant: "count",
30
+ icon: s.icon
31
+ };
32
+ if ("icon" in s) return {
33
+ ...base,
34
+ variant: "icons",
35
+ icon: s.icon,
36
+ slots: s.slots ?? 5
37
+ };
38
+ return {
39
+ ...base,
40
+ variant: "shape",
41
+ shape: s.shape,
42
+ color: s.color ?? "#7c83ff"
43
+ };
44
+ }
45
+ function toSpec(f) {
46
+ const name = f.name.trim() || "custom";
47
+ const label = f.label.trim() || void 0;
48
+ if (f.variant === "count") return {
49
+ name,
50
+ label,
51
+ kind: "count",
52
+ icon: f.icon || "🔵"
53
+ };
54
+ if (f.variant === "icons") return {
55
+ name,
56
+ label,
57
+ kind: "level",
58
+ icon: f.icon || "⭐",
59
+ slots: Math.max(1, Math.min(12, Math.round(f.slots)))
60
+ };
61
+ return {
62
+ name,
63
+ label,
64
+ kind: "level",
65
+ shape: f.shape,
66
+ color: f.color
67
+ };
68
+ }
69
+ const inputStyle = {
70
+ padding: "6px 9px",
71
+ borderRadius: 8,
72
+ border: "1.5px solid color-mix(in oklab, var(--stage-fg) 24%, transparent)",
73
+ background: "var(--stage-bg)",
74
+ color: "var(--stage-fg)",
75
+ fontSize: 14,
76
+ width: "100%"
77
+ };
78
+ const labelStyle = {
79
+ fontSize: 11,
80
+ fontWeight: 700,
81
+ color: "var(--stage-muted)",
82
+ textTransform: "uppercase",
83
+ letterSpacing: .4
84
+ };
85
+ function Chip({ active, onClick, children }) {
86
+ return /* @__PURE__ */ jsx("button", {
87
+ type: "button",
88
+ onClick,
89
+ style: {
90
+ padding: "5px 11px",
91
+ borderRadius: 999,
92
+ fontWeight: 700,
93
+ fontSize: 13,
94
+ cursor: "pointer",
95
+ border: `2px solid ${active ? "var(--stage-accent)" : "color-mix(in oklab, var(--stage-fg) 22%, transparent)"}`,
96
+ background: active ? "color-mix(in oklab, var(--stage-accent) 16%, transparent)" : "transparent",
97
+ color: "var(--stage-fg)"
98
+ },
99
+ children
100
+ });
101
+ }
102
+ function SceneStudio({ spec, onChange }) {
103
+ const f = toFlat(spec);
104
+ const uid = useId();
105
+ const set = (patch) => onChange(toSpec({
106
+ ...f,
107
+ ...patch
108
+ }));
109
+ const meta = dataScene(spec);
110
+ const preview = f.variant === "count" ? meta.render({
111
+ count: 6,
112
+ highlight: 2,
113
+ width: 150,
114
+ height: 150
115
+ }) : meta.render({
116
+ frac: .6,
117
+ width: 150,
118
+ height: 150
119
+ });
120
+ return /* @__PURE__ */ jsxs("div", {
121
+ className: "not-prose",
122
+ style: {
123
+ display: "grid",
124
+ gridTemplateColumns: "minmax(0,1fr) 170px",
125
+ gap: 18,
126
+ alignItems: "start",
127
+ padding: 14,
128
+ borderRadius: 12,
129
+ border: "1px solid color-mix(in oklab, var(--stage-fg) 14%, transparent)"
130
+ },
131
+ children: [/* @__PURE__ */ jsxs("div", {
132
+ style: {
133
+ display: "grid",
134
+ gap: 12
135
+ },
136
+ children: [
137
+ /* @__PURE__ */ jsxs("div", {
138
+ style: {
139
+ display: "grid",
140
+ gridTemplateColumns: "1fr 1fr",
141
+ gap: 10
142
+ },
143
+ children: [/* @__PURE__ */ jsxs("label", {
144
+ style: {
145
+ display: "grid",
146
+ gap: 4
147
+ },
148
+ children: [/* @__PURE__ */ jsx("span", {
149
+ style: labelStyle,
150
+ children: "name (id)"
151
+ }), /* @__PURE__ */ jsx("input", {
152
+ style: inputStyle,
153
+ value: f.name,
154
+ onChange: (e) => set({ name: e.currentTarget.value }),
155
+ placeholder: "pizza"
156
+ })]
157
+ }), /* @__PURE__ */ jsxs("label", {
158
+ style: {
159
+ display: "grid",
160
+ gap: 4
161
+ },
162
+ children: [/* @__PURE__ */ jsx("span", {
163
+ style: labelStyle,
164
+ children: "label"
165
+ }), /* @__PURE__ */ jsx("input", {
166
+ style: inputStyle,
167
+ value: f.label,
168
+ onChange: (e) => set({ label: e.currentTarget.value }),
169
+ placeholder: "Pizza"
170
+ })]
171
+ })]
172
+ }),
173
+ /* @__PURE__ */ jsxs("div", {
174
+ style: {
175
+ display: "grid",
176
+ gap: 4
177
+ },
178
+ children: [/* @__PURE__ */ jsx("span", {
179
+ style: labelStyle,
180
+ children: "type"
181
+ }), /* @__PURE__ */ jsxs("div", {
182
+ style: {
183
+ display: "flex",
184
+ gap: 8,
185
+ flexWrap: "wrap"
186
+ },
187
+ children: [
188
+ /* @__PURE__ */ jsx(Chip, {
189
+ active: f.variant === "count",
190
+ onClick: () => set({ variant: "count" }),
191
+ children: "count of icons"
192
+ }),
193
+ /* @__PURE__ */ jsx(Chip, {
194
+ active: f.variant === "icons",
195
+ onClick: () => set({ variant: "icons" }),
196
+ children: "icon rating"
197
+ }),
198
+ /* @__PURE__ */ jsx(Chip, {
199
+ active: f.variant === "shape",
200
+ onClick: () => set({ variant: "shape" }),
201
+ children: "filling shape"
202
+ })
203
+ ]
204
+ })]
205
+ }),
206
+ (f.variant === "count" || f.variant === "icons") && /* @__PURE__ */ jsxs("div", {
207
+ style: {
208
+ display: "grid",
209
+ gridTemplateColumns: f.variant === "icons" ? "1fr 1fr" : "1fr",
210
+ gap: 10
211
+ },
212
+ children: [/* @__PURE__ */ jsxs("label", {
213
+ style: {
214
+ display: "grid",
215
+ gap: 4
216
+ },
217
+ children: [/* @__PURE__ */ jsx("span", {
218
+ style: labelStyle,
219
+ children: "icon (emoji)"
220
+ }), /* @__PURE__ */ jsx("input", {
221
+ style: {
222
+ ...inputStyle,
223
+ fontSize: 20
224
+ },
225
+ value: f.icon,
226
+ onChange: (e) => set({ icon: [...e.currentTarget.value][0] ?? "" }),
227
+ placeholder: "🍕"
228
+ })]
229
+ }), f.variant === "icons" && /* @__PURE__ */ jsxs("label", {
230
+ style: {
231
+ display: "grid",
232
+ gap: 4
233
+ },
234
+ children: [/* @__PURE__ */ jsx("span", {
235
+ style: labelStyle,
236
+ children: "how many"
237
+ }), /* @__PURE__ */ jsx("input", {
238
+ style: inputStyle,
239
+ type: "number",
240
+ min: 1,
241
+ max: 12,
242
+ value: f.slots,
243
+ onChange: (e) => set({ slots: Number(e.currentTarget.value) })
244
+ })]
245
+ })]
246
+ }),
247
+ f.variant === "shape" && /* @__PURE__ */ jsxs("div", {
248
+ style: {
249
+ display: "grid",
250
+ gridTemplateColumns: "1fr 1fr",
251
+ gap: 10
252
+ },
253
+ children: [/* @__PURE__ */ jsxs("label", {
254
+ style: {
255
+ display: "grid",
256
+ gap: 4
257
+ },
258
+ children: [/* @__PURE__ */ jsx("span", {
259
+ style: labelStyle,
260
+ children: "shape"
261
+ }), /* @__PURE__ */ jsxs("select", {
262
+ style: inputStyle,
263
+ value: f.shape,
264
+ onChange: (e) => set({ shape: e.currentTarget.value }),
265
+ children: [
266
+ /* @__PURE__ */ jsx("option", {
267
+ value: "box",
268
+ children: "box"
269
+ }),
270
+ /* @__PURE__ */ jsx("option", {
271
+ value: "cup",
272
+ children: "cup"
273
+ }),
274
+ /* @__PURE__ */ jsx("option", {
275
+ value: "circle",
276
+ children: "circle (pie)"
277
+ })
278
+ ]
279
+ })]
280
+ }), /* @__PURE__ */ jsxs("label", {
281
+ style: {
282
+ display: "grid",
283
+ gap: 4
284
+ },
285
+ children: [/* @__PURE__ */ jsx("span", {
286
+ style: labelStyle,
287
+ children: "colour"
288
+ }), /* @__PURE__ */ jsxs("span", {
289
+ style: {
290
+ display: "flex",
291
+ gap: 6,
292
+ alignItems: "center"
293
+ },
294
+ children: [/* @__PURE__ */ jsx("input", {
295
+ id: uid,
296
+ type: "color",
297
+ value: /^#/.test(f.color) ? f.color : "#7c83ff",
298
+ onChange: (e) => set({ color: e.currentTarget.value }),
299
+ style: {
300
+ width: 34,
301
+ height: 34,
302
+ padding: 0,
303
+ border: "none",
304
+ background: "none"
305
+ }
306
+ }), /* @__PURE__ */ jsx("input", {
307
+ style: inputStyle,
308
+ value: f.color,
309
+ onChange: (e) => set({ color: e.currentTarget.value }),
310
+ placeholder: "#7c83ff"
311
+ })]
312
+ })]
313
+ })]
314
+ })
315
+ ]
316
+ }), /* @__PURE__ */ jsxs("div", {
317
+ style: {
318
+ display: "grid",
319
+ justifyItems: "center",
320
+ gap: 6
321
+ },
322
+ children: [/* @__PURE__ */ jsx("span", {
323
+ style: labelStyle,
324
+ children: "preview"
325
+ }), /* @__PURE__ */ jsx("div", {
326
+ style: {
327
+ minHeight: 150,
328
+ display: "grid",
329
+ placeItems: "center"
330
+ },
331
+ children: preview
332
+ })]
333
+ })]
334
+ });
335
+ }
336
+
337
+ //#endregion
338
+ export { SceneStudio };
@@ -0,0 +1,31 @@
1
+ import { GuessTone } from "./vessel.mjs";
2
+ import { ReactNode } from "react";
3
+
4
+ //#region src/kit/scenes.d.ts
5
+ interface QuantityInput {
6
+ /** 0..1 fill level (level scenes). */
7
+ frac?: number;
8
+ /** discrete count (count scenes). */
9
+ count?: number;
10
+ /** newly-added items to light up (count scenes). */
11
+ highlight?: number;
12
+ /** optional learner reading line, 0..1 (level scenes). */
13
+ guessFrac?: number;
14
+ guessTone?: GuessTone;
15
+ color?: string;
16
+ label?: string;
17
+ width?: number;
18
+ height?: number;
19
+ }
20
+ type QuantityScene = (q: QuantityInput) => ReactNode;
21
+ interface SceneMeta {
22
+ name: string;
23
+ kind: 'level' | 'count';
24
+ label: string;
25
+ render: QuantityScene;
26
+ }
27
+ declare function registerScene(meta: SceneMeta): void;
28
+ declare function getScene(name: string): SceneMeta | undefined;
29
+ declare function listScenes(kind?: 'level' | 'count'): SceneMeta[];
30
+ //#endregion
31
+ export { QuantityInput, QuantityScene, SceneMeta, getScene, listScenes, registerScene };