@fundamental-engine/core 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 (371) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +128 -0
  3. package/dist/agents/element-agent.d.ts +38 -0
  4. package/dist/agents/element-agent.d.ts.map +1 -0
  5. package/dist/agents/element-agent.js +70 -0
  6. package/dist/agents/element-agent.js.map +1 -0
  7. package/dist/agents/event-agent.d.ts +47 -0
  8. package/dist/agents/event-agent.d.ts.map +1 -0
  9. package/dist/agents/event-agent.js +82 -0
  10. package/dist/agents/event-agent.js.map +1 -0
  11. package/dist/agents/index.d.ts +17 -0
  12. package/dist/agents/index.d.ts.map +1 -0
  13. package/dist/agents/index.js +57 -0
  14. package/dist/agents/index.js.map +1 -0
  15. package/dist/agents/region-agents.d.ts +40 -0
  16. package/dist/agents/region-agents.d.ts.map +1 -0
  17. package/dist/agents/region-agents.js +22 -0
  18. package/dist/agents/region-agents.js.map +1 -0
  19. package/dist/agents/relationship.d.ts +55 -0
  20. package/dist/agents/relationship.d.ts.map +1 -0
  21. package/dist/agents/relationship.js +40 -0
  22. package/dist/agents/relationship.js.map +1 -0
  23. package/dist/agents/user-agent.d.ts +57 -0
  24. package/dist/agents/user-agent.d.ts.map +1 -0
  25. package/dist/agents/user-agent.js +45 -0
  26. package/dist/agents/user-agent.js.map +1 -0
  27. package/dist/config/forces.config.d.ts +101 -0
  28. package/dist/config/forces.config.d.ts.map +1 -0
  29. package/dist/config/forces.config.js +239 -0
  30. package/dist/config/forces.config.js.map +1 -0
  31. package/dist/config/manual.d.ts +134 -0
  32. package/dist/config/manual.d.ts.map +1 -0
  33. package/dist/config/manual.js +604 -0
  34. package/dist/config/manual.js.map +1 -0
  35. package/dist/config/palettes.d.ts +18 -0
  36. package/dist/config/palettes.d.ts.map +1 -0
  37. package/dist/config/palettes.js +34 -0
  38. package/dist/config/palettes.js.map +1 -0
  39. package/dist/config/presets.d.ts +48 -0
  40. package/dist/config/presets.d.ts.map +1 -0
  41. package/dist/config/presets.js +87 -0
  42. package/dist/config/presets.js.map +1 -0
  43. package/dist/config/tokens.d.ts +3 -0
  44. package/dist/config/tokens.d.ts.map +1 -0
  45. package/dist/config/tokens.js +16 -0
  46. package/dist/config/tokens.js.map +1 -0
  47. package/dist/conformance/expectations.d.ts +40 -0
  48. package/dist/conformance/expectations.d.ts.map +1 -0
  49. package/dist/conformance/expectations.js +347 -0
  50. package/dist/conformance/expectations.js.map +1 -0
  51. package/dist/conformance/experiments.d.ts +17 -0
  52. package/dist/conformance/experiments.d.ts.map +1 -0
  53. package/dist/conformance/experiments.js +875 -0
  54. package/dist/conformance/experiments.js.map +1 -0
  55. package/dist/conformance/run.d.ts +18 -0
  56. package/dist/conformance/run.d.ts.map +1 -0
  57. package/dist/conformance/run.js +240 -0
  58. package/dist/conformance/run.js.map +1 -0
  59. package/dist/conformance/types.d.ts +100 -0
  60. package/dist/conformance/types.d.ts.map +1 -0
  61. package/dist/conformance/types.js +2 -0
  62. package/dist/conformance/types.js.map +1 -0
  63. package/dist/contracts/guards.d.ts +51 -0
  64. package/dist/contracts/guards.d.ts.map +1 -0
  65. package/dist/contracts/guards.js +100 -0
  66. package/dist/contracts/guards.js.map +1 -0
  67. package/dist/contracts/index.d.ts +18 -0
  68. package/dist/contracts/index.d.ts.map +1 -0
  69. package/dist/contracts/index.js +107 -0
  70. package/dist/contracts/index.js.map +1 -0
  71. package/dist/contracts/passport.d.ts +88 -0
  72. package/dist/contracts/passport.d.ts.map +1 -0
  73. package/dist/contracts/passport.js +135 -0
  74. package/dist/contracts/passport.js.map +1 -0
  75. package/dist/contracts/types.d.ts +120 -0
  76. package/dist/contracts/types.d.ts.map +1 -0
  77. package/dist/contracts/types.js +24 -0
  78. package/dist/contracts/types.js.map +1 -0
  79. package/dist/core/accretion.d.ts +50 -0
  80. package/dist/core/accretion.d.ts.map +1 -0
  81. package/dist/core/accretion.js +98 -0
  82. package/dist/core/accretion.js.map +1 -0
  83. package/dist/core/agents.d.ts +31 -0
  84. package/dist/core/agents.d.ts.map +1 -0
  85. package/dist/core/agents.js +51 -0
  86. package/dist/core/agents.js.map +1 -0
  87. package/dist/core/attention.d.ts +72 -0
  88. package/dist/core/attention.d.ts.map +1 -0
  89. package/dist/core/attention.js +122 -0
  90. package/dist/core/attention.js.map +1 -0
  91. package/dist/core/causality.d.ts +38 -0
  92. package/dist/core/causality.d.ts.map +1 -0
  93. package/dist/core/causality.js +64 -0
  94. package/dist/core/causality.js.map +1 -0
  95. package/dist/core/conditions.d.ts +10 -0
  96. package/dist/core/conditions.d.ts.map +1 -0
  97. package/dist/core/conditions.js +22 -0
  98. package/dist/core/conditions.js.map +1 -0
  99. package/dist/core/currents.d.ts +53 -0
  100. package/dist/core/currents.d.ts.map +1 -0
  101. package/dist/core/currents.js +65 -0
  102. package/dist/core/currents.js.map +1 -0
  103. package/dist/core/dock.d.ts +35 -0
  104. package/dist/core/dock.d.ts.map +1 -0
  105. package/dist/core/dock.js +39 -0
  106. package/dist/core/dock.js.map +1 -0
  107. package/dist/core/events.d.ts +23 -0
  108. package/dist/core/events.d.ts.map +1 -0
  109. package/dist/core/events.js +34 -0
  110. package/dist/core/events.js.map +1 -0
  111. package/dist/core/feedback-sink.d.ts +32 -0
  112. package/dist/core/feedback-sink.d.ts.map +1 -0
  113. package/dist/core/feedback-sink.js +53 -0
  114. package/dist/core/feedback-sink.js.map +1 -0
  115. package/dist/core/feedback.d.ts +11 -0
  116. package/dist/core/feedback.d.ts.map +1 -0
  117. package/dist/core/feedback.js +16 -0
  118. package/dist/core/feedback.js.map +1 -0
  119. package/dist/core/field-store.d.ts +26 -0
  120. package/dist/core/field-store.d.ts.map +1 -0
  121. package/dist/core/field-store.js +54 -0
  122. package/dist/core/field-store.js.map +1 -0
  123. package/dist/core/field.d.ts +18 -0
  124. package/dist/core/field.d.ts.map +1 -0
  125. package/dist/core/field.js +1943 -0
  126. package/dist/core/field.js.map +1 -0
  127. package/dist/core/fieldline-seeds.d.ts +25 -0
  128. package/dist/core/fieldline-seeds.d.ts.map +1 -0
  129. package/dist/core/fieldline-seeds.js +32 -0
  130. package/dist/core/fieldline-seeds.js.map +1 -0
  131. package/dist/core/fieldlines.d.ts +75 -0
  132. package/dist/core/fieldlines.d.ts.map +1 -0
  133. package/dist/core/fieldlines.js +111 -0
  134. package/dist/core/fieldlines.js.map +1 -0
  135. package/dist/core/flow.d.ts +38 -0
  136. package/dist/core/flow.d.ts.map +1 -0
  137. package/dist/core/flow.js +27 -0
  138. package/dist/core/flow.js.map +1 -0
  139. package/dist/core/formations.d.ts +11 -0
  140. package/dist/core/formations.d.ts.map +1 -0
  141. package/dist/core/formations.js +22 -0
  142. package/dist/core/formations.js.map +1 -0
  143. package/dist/core/geometry.d.ts +67 -0
  144. package/dist/core/geometry.d.ts.map +1 -0
  145. package/dist/core/geometry.js +68 -0
  146. package/dist/core/geometry.js.map +1 -0
  147. package/dist/core/heatmap.d.ts +22 -0
  148. package/dist/core/heatmap.d.ts.map +1 -0
  149. package/dist/core/heatmap.js +55 -0
  150. package/dist/core/heatmap.js.map +1 -0
  151. package/dist/core/host.d.ts +46 -0
  152. package/dist/core/host.d.ts.map +1 -0
  153. package/dist/core/host.js +11 -0
  154. package/dist/core/host.js.map +1 -0
  155. package/dist/core/integrator.d.ts +24 -0
  156. package/dist/core/integrator.d.ts.map +1 -0
  157. package/dist/core/integrator.js +375 -0
  158. package/dist/core/integrator.js.map +1 -0
  159. package/dist/core/math.d.ts +37 -0
  160. package/dist/core/math.d.ts.map +1 -0
  161. package/dist/core/math.js +77 -0
  162. package/dist/core/math.js.map +1 -0
  163. package/dist/core/reactions.d.ts +32 -0
  164. package/dist/core/reactions.d.ts.map +1 -0
  165. package/dist/core/reactions.js +45 -0
  166. package/dist/core/reactions.js.map +1 -0
  167. package/dist/core/registry.d.ts +13 -0
  168. package/dist/core/registry.d.ts.map +1 -0
  169. package/dist/core/registry.js +20 -0
  170. package/dist/core/registry.js.map +1 -0
  171. package/dist/core/render-backend.d.ts +46 -0
  172. package/dist/core/render-backend.d.ts.map +1 -0
  173. package/dist/core/render-backend.js +75 -0
  174. package/dist/core/render-backend.js.map +1 -0
  175. package/dist/core/render-modes.d.ts +42 -0
  176. package/dist/core/render-modes.d.ts.map +1 -0
  177. package/dist/core/render-modes.js +141 -0
  178. package/dist/core/render-modes.js.map +1 -0
  179. package/dist/core/reservoir.d.ts +43 -0
  180. package/dist/core/reservoir.d.ts.map +1 -0
  181. package/dist/core/reservoir.js +207 -0
  182. package/dist/core/reservoir.js.map +1 -0
  183. package/dist/core/scalar-grid.d.ts +51 -0
  184. package/dist/core/scalar-grid.d.ts.map +1 -0
  185. package/dist/core/scalar-grid.js +146 -0
  186. package/dist/core/scalar-grid.js.map +1 -0
  187. package/dist/core/scanner.d.ts +59 -0
  188. package/dist/core/scanner.d.ts.map +1 -0
  189. package/dist/core/scanner.js +260 -0
  190. package/dist/core/scanner.js.map +1 -0
  191. package/dist/core/shadow.d.ts +69 -0
  192. package/dist/core/shadow.d.ts.map +1 -0
  193. package/dist/core/shadow.js +84 -0
  194. package/dist/core/shadow.js.map +1 -0
  195. package/dist/core/spatial-hash.d.ts +30 -0
  196. package/dist/core/spatial-hash.d.ts.map +1 -0
  197. package/dist/core/spatial-hash.js +64 -0
  198. package/dist/core/spatial-hash.js.map +1 -0
  199. package/dist/core/streamlines.d.ts +29 -0
  200. package/dist/core/streamlines.d.ts.map +1 -0
  201. package/dist/core/streamlines.js +70 -0
  202. package/dist/core/streamlines.js.map +1 -0
  203. package/dist/core/surface.d.ts +19 -0
  204. package/dist/core/surface.d.ts.map +1 -0
  205. package/dist/core/surface.js +21 -0
  206. package/dist/core/surface.js.map +1 -0
  207. package/dist/core/temporal.d.ts +110 -0
  208. package/dist/core/temporal.d.ts.map +1 -0
  209. package/dist/core/temporal.js +139 -0
  210. package/dist/core/temporal.js.map +1 -0
  211. package/dist/core/thermo.d.ts +48 -0
  212. package/dist/core/thermo.d.ts.map +1 -0
  213. package/dist/core/thermo.js +48 -0
  214. package/dist/core/thermo.js.map +1 -0
  215. package/dist/core/types.d.ts +610 -0
  216. package/dist/core/types.d.ts.map +1 -0
  217. package/dist/core/types.js +2 -0
  218. package/dist/core/types.js.map +1 -0
  219. package/dist/core/weights.d.ts +111 -0
  220. package/dist/core/weights.d.ts.map +1 -0
  221. package/dist/core/weights.js +128 -0
  222. package/dist/core/weights.js.map +1 -0
  223. package/dist/diagnostics/energy.d.ts +21 -0
  224. package/dist/diagnostics/energy.d.ts.map +1 -0
  225. package/dist/diagnostics/energy.js +27 -0
  226. package/dist/diagnostics/energy.js.map +1 -0
  227. package/dist/diagnostics/fields.d.ts +23 -0
  228. package/dist/diagnostics/fields.d.ts.map +1 -0
  229. package/dist/diagnostics/fields.js +30 -0
  230. package/dist/diagnostics/fields.js.map +1 -0
  231. package/dist/diagnostics/index.d.ts +46 -0
  232. package/dist/diagnostics/index.d.ts.map +1 -0
  233. package/dist/diagnostics/index.js +23 -0
  234. package/dist/diagnostics/index.js.map +1 -0
  235. package/dist/diagnostics/modes.d.ts +108 -0
  236. package/dist/diagnostics/modes.d.ts.map +1 -0
  237. package/dist/diagnostics/modes.js +181 -0
  238. package/dist/diagnostics/modes.js.map +1 -0
  239. package/dist/diagnostics/potential.d.ts +30 -0
  240. package/dist/diagnostics/potential.d.ts.map +1 -0
  241. package/dist/diagnostics/potential.js +43 -0
  242. package/dist/diagnostics/potential.js.map +1 -0
  243. package/dist/diagnostics/probes.d.ts +31 -0
  244. package/dist/diagnostics/probes.d.ts.map +1 -0
  245. package/dist/diagnostics/probes.js +61 -0
  246. package/dist/diagnostics/probes.js.map +1 -0
  247. package/dist/diagnostics/render.d.ts +49 -0
  248. package/dist/diagnostics/render.d.ts.map +1 -0
  249. package/dist/diagnostics/render.js +132 -0
  250. package/dist/diagnostics/render.js.map +1 -0
  251. package/dist/export.d.ts +18 -0
  252. package/dist/export.d.ts.map +1 -0
  253. package/dist/export.js +17 -0
  254. package/dist/export.js.map +1 -0
  255. package/dist/forces/extended.d.ts +121 -0
  256. package/dist/forces/extended.d.ts.map +1 -0
  257. package/dist/forces/extended.js +674 -0
  258. package/dist/forces/extended.js.map +1 -0
  259. package/dist/forces/index.d.ts +33 -0
  260. package/dist/forces/index.d.ts.map +1 -0
  261. package/dist/forces/index.js +237 -0
  262. package/dist/forces/index.js.map +1 -0
  263. package/dist/forces/natural.d.ts +106 -0
  264. package/dist/forces/natural.d.ts.map +1 -0
  265. package/dist/forces/natural.js +385 -0
  266. package/dist/forces/natural.js.map +1 -0
  267. package/dist/index.d.ts +59 -0
  268. package/dist/index.d.ts.map +1 -0
  269. package/dist/index.js +71 -0
  270. package/dist/index.js.map +1 -0
  271. package/dist/inspect/budget.d.ts +17 -0
  272. package/dist/inspect/budget.d.ts.map +1 -0
  273. package/dist/inspect/budget.js +19 -0
  274. package/dist/inspect/budget.js.map +1 -0
  275. package/dist/inspect/index.d.ts +10 -0
  276. package/dist/inspect/index.d.ts.map +1 -0
  277. package/dist/inspect/index.js +10 -0
  278. package/dist/inspect/index.js.map +1 -0
  279. package/dist/inspect/report.d.ts +17 -0
  280. package/dist/inspect/report.d.ts.map +1 -0
  281. package/dist/inspect/report.js +44 -0
  282. package/dist/inspect/report.js.map +1 -0
  283. package/dist/inspect/snapshot.d.ts +21 -0
  284. package/dist/inspect/snapshot.d.ts.map +1 -0
  285. package/dist/inspect/snapshot.js +30 -0
  286. package/dist/inspect/snapshot.js.map +1 -0
  287. package/dist/recipes/catalog.d.ts +51 -0
  288. package/dist/recipes/catalog.d.ts.map +1 -0
  289. package/dist/recipes/catalog.js +1496 -0
  290. package/dist/recipes/catalog.js.map +1 -0
  291. package/dist/recipes/charge.d.ts +18 -0
  292. package/dist/recipes/charge.d.ts.map +1 -0
  293. package/dist/recipes/charge.js +27 -0
  294. package/dist/recipes/charge.js.map +1 -0
  295. package/dist/recipes/compile.d.ts +93 -0
  296. package/dist/recipes/compile.d.ts.map +1 -0
  297. package/dist/recipes/compile.js +113 -0
  298. package/dist/recipes/compile.js.map +1 -0
  299. package/dist/recipes/explain.d.ts +8 -0
  300. package/dist/recipes/explain.d.ts.map +1 -0
  301. package/dist/recipes/explain.js +46 -0
  302. package/dist/recipes/explain.js.map +1 -0
  303. package/dist/recipes/gallery.d.ts +6 -0
  304. package/dist/recipes/gallery.d.ts.map +1 -0
  305. package/dist/recipes/gallery.js +6 -0
  306. package/dist/recipes/gallery.js.map +1 -0
  307. package/dist/recipes/gravity.d.ts +16 -0
  308. package/dist/recipes/gravity.d.ts.map +1 -0
  309. package/dist/recipes/gravity.js +27 -0
  310. package/dist/recipes/gravity.js.map +1 -0
  311. package/dist/recipes/index.d.ts +18 -0
  312. package/dist/recipes/index.d.ts.map +1 -0
  313. package/dist/recipes/index.js +36 -0
  314. package/dist/recipes/index.js.map +1 -0
  315. package/dist/recipes/intent.d.ts +44 -0
  316. package/dist/recipes/intent.d.ts.map +1 -0
  317. package/dist/recipes/intent.js +46 -0
  318. package/dist/recipes/intent.js.map +1 -0
  319. package/dist/recipes/schema.d.ts +103 -0
  320. package/dist/recipes/schema.d.ts.map +1 -0
  321. package/dist/recipes/schema.js +123 -0
  322. package/dist/recipes/schema.js.map +1 -0
  323. package/dist/recipes/wayfinding.d.ts +39 -0
  324. package/dist/recipes/wayfinding.d.ts.map +1 -0
  325. package/dist/recipes/wayfinding.js +77 -0
  326. package/dist/recipes/wayfinding.js.map +1 -0
  327. package/dist/semantic/index.d.ts +13 -0
  328. package/dist/semantic/index.d.ts.map +1 -0
  329. package/dist/semantic/index.js +31 -0
  330. package/dist/semantic/index.js.map +1 -0
  331. package/dist/semantic/layers.d.ts +24 -0
  332. package/dist/semantic/layers.d.ts.map +1 -0
  333. package/dist/semantic/layers.js +27 -0
  334. package/dist/semantic/layers.js.map +1 -0
  335. package/dist/semantic/materials.d.ts +20 -0
  336. package/dist/semantic/materials.d.ts.map +1 -0
  337. package/dist/semantic/materials.js +17 -0
  338. package/dist/semantic/materials.js.map +1 -0
  339. package/dist/semantic/states.d.ts +11 -0
  340. package/dist/semantic/states.d.ts.map +1 -0
  341. package/dist/semantic/states.js +26 -0
  342. package/dist/semantic/states.js.map +1 -0
  343. package/dist/visual/channels.d.ts +71 -0
  344. package/dist/visual/channels.d.ts.map +1 -0
  345. package/dist/visual/channels.js +70 -0
  346. package/dist/visual/channels.js.map +1 -0
  347. package/dist/visual/index.d.ts +39 -0
  348. package/dist/visual/index.d.ts.map +1 -0
  349. package/dist/visual/index.js +30 -0
  350. package/dist/visual/index.js.map +1 -0
  351. package/dist/visual/lint.d.ts +41 -0
  352. package/dist/visual/lint.d.ts.map +1 -0
  353. package/dist/visual/lint.js +58 -0
  354. package/dist/visual/lint.js.map +1 -0
  355. package/dist/visual/mapping.d.ts +13 -0
  356. package/dist/visual/mapping.d.ts.map +1 -0
  357. package/dist/visual/mapping.js +43 -0
  358. package/dist/visual/mapping.js.map +1 -0
  359. package/dist/visual/semantic-text.d.ts +28 -0
  360. package/dist/visual/semantic-text.d.ts.map +1 -0
  361. package/dist/visual/semantic-text.js +36 -0
  362. package/dist/visual/semantic-text.js.map +1 -0
  363. package/dist/visual/tokens.d.ts +23 -0
  364. package/dist/visual/tokens.d.ts.map +1 -0
  365. package/dist/visual/tokens.js +54 -0
  366. package/dist/visual/tokens.js.map +1 -0
  367. package/dist/visual/visualization.d.ts +31 -0
  368. package/dist/visual/visualization.d.ts.map +1 -0
  369. package/dist/visual/visualization.js +47 -0
  370. package/dist/visual/visualization.js.map +1 -0
  371. package/package.json +60 -0
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Currents — the carrier waves (§24, §2.3).
3
+ *
4
+ * Five layered standing waveforms that form the resting structure of the field:
5
+ * they carry **bound** particles (shimmer) and impart a flow on the **free**
6
+ * ones. Pure data + math here; rendering and the bound/free reservoir live in
7
+ * the field loop.
8
+ */
9
+ import type { RGB } from './math.ts';
10
+ export interface Wave {
11
+ /** vertical anchor as a fraction of viewport height. */
12
+ baseFrac: number;
13
+ amp: number;
14
+ freq: number;
15
+ phase: number;
16
+ speed: number;
17
+ color: RGB;
18
+ /** 0 (back) … 1 (front) — drives opacity and parallax. */
19
+ depth: number;
20
+ /** travel direction (±1). */
21
+ dir: number;
22
+ /** scroll-parallax offset, eased. */
23
+ offsetY: number;
24
+ }
25
+ /** A particle riding a wave line (the shimmer). */
26
+ export interface BoundParticle {
27
+ /** index into the wave array. */
28
+ wi: number;
29
+ /** position along the wave, 0…1. */
30
+ progress: number;
31
+ /** vertical jitter offset. */
32
+ phase: number;
33
+ size: number;
34
+ glow: boolean;
35
+ /** drift speed along the wave (±). */
36
+ speed: number;
37
+ }
38
+ /** Build the five wave layers, coloring them from the palette (§24.4). */
39
+ export declare function buildWaves(palette: readonly RGB[]): Wave[];
40
+ /** Build the bound shimmer pool: `round(16·density)` riders per wave (§2.5). */
41
+ export declare function buildBound(waveCount: number, density: number, rand: () => number): BoundParticle[];
42
+ /** An engaged element the lines bend toward — the "spine" (§24). */
43
+ export interface WavePull {
44
+ x: number;
45
+ y: number;
46
+ /** strength 0…1 (eased as the element engages/releases). */
47
+ k: number;
48
+ }
49
+ /** The wave's y at horizontal position `x` and `time` seconds (§2.3). */
50
+ export declare function waveYat(w: Wave, x: number, time: number, H: number, waveSpeed?: number, amplitude?: number, pull?: WavePull): number;
51
+ /** The wave's slope at `x` — the derivative the free particles drift along. */
52
+ export declare function waveSlope(w: Wave, x: number, time: number, waveSpeed?: number, amplitude?: number): number;
53
+ //# sourceMappingURL=currents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"currents.d.ts","sourceRoot":"","sources":["../../src/core/currents.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAErC,MAAM,WAAW,IAAI;IACnB,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,GAAG,CAAC;IACX,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,mDAAmD;AACnD,MAAM,WAAW,aAAa;IAC5B,iCAAiC;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;CACf;AAKD,0EAA0E;AAC1E,wBAAgB,UAAU,CAAC,OAAO,EAAE,SAAS,GAAG,EAAE,GAAG,IAAI,EAAE,CAgB1D;AAED,gFAAgF;AAChF,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,MAAM,GAAG,aAAa,EAAE,CAgBlG;AAED,oEAAoE;AACpE,MAAM,WAAW,QAAQ;IACvB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,4DAA4D;IAC5D,CAAC,EAAE,MAAM,CAAC;CACX;AAED,yEAAyE;AACzE,wBAAgB,OAAO,CACrB,CAAC,EAAE,IAAI,EACP,CAAC,EAAE,MAAM,EACT,IAAI,EAAE,MAAM,EACZ,CAAC,EAAE,MAAM,EACT,SAAS,SAAI,EACb,SAAS,SAAI,EACb,IAAI,CAAC,EAAE,QAAQ,GACd,MAAM,CAaR;AAED,+EAA+E;AAC/E,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,SAAI,EAAE,SAAS,SAAI,GAAG,MAAM,CAIhG"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Currents — the carrier waves (§24, §2.3).
3
+ *
4
+ * Five layered standing waveforms that form the resting structure of the field:
5
+ * they carry **bound** particles (shimmer) and impart a flow on the **free**
6
+ * ones. Pure data + math here; rendering and the bound/free reservoir live in
7
+ * the field loop.
8
+ */
9
+ const LAYERS = 5;
10
+ const BASE = [0.24, 0.4, 0.55, 0.7, 0.85];
11
+ /** Build the five wave layers, coloring them from the palette (§24.4). */
12
+ export function buildWaves(palette) {
13
+ const waves = [];
14
+ for (let i = 0; i < LAYERS; i++) {
15
+ waves.push({
16
+ baseFrac: BASE[i] ?? 0.5,
17
+ amp: 22 + i * 15,
18
+ freq: 0.0012 + i * 0.0008,
19
+ phase: (i * 1.7) % 6.28, // deterministic spread (no Math.random at module build)
20
+ speed: 0.00013 + i * 0.00009,
21
+ color: palette[i % palette.length] ?? [77, 163, 255],
22
+ depth: i / (LAYERS - 1),
23
+ dir: i % 2 ? -1 : 1,
24
+ offsetY: 0,
25
+ });
26
+ }
27
+ return waves;
28
+ }
29
+ /** Build the bound shimmer pool: `round(16·density)` riders per wave (§2.5). */
30
+ export function buildBound(waveCount, density, rand) {
31
+ const per = Math.round(16 * density);
32
+ const bound = [];
33
+ for (let wi = 0; wi < waveCount; wi++) {
34
+ for (let k = 0; k < per; k++) {
35
+ bound.push({
36
+ wi,
37
+ progress: rand(),
38
+ phase: (rand() - 0.5) * 0.22 * Math.PI,
39
+ size: 0.7 + rand() * 1.5,
40
+ glow: rand() < 0.3,
41
+ speed: (0.00035 + rand() * 0.0009) * (rand() < 0.5 ? 1 : -1),
42
+ });
43
+ }
44
+ }
45
+ return bound;
46
+ }
47
+ /** The wave's y at horizontal position `x` and `time` seconds (§2.3). */
48
+ export function waveYat(w, x, time, H, waveSpeed = 1, amplitude = 1, pull) {
49
+ let y = w.baseFrac * H +
50
+ w.offsetY +
51
+ Math.sin(x * w.freq + w.phase + time * w.speed * 1000 * waveSpeed) * w.amp * amplitude;
52
+ // the engaged element bends the lines locally toward it (Gaussian falloff).
53
+ if (pull && pull.k > 0.001) {
54
+ const dx = x - pull.x;
55
+ const s = 260;
56
+ const fall = Math.exp(-(dx * dx) / (2 * s * s));
57
+ y += (pull.y - y) * 0.42 * fall * pull.k * (0.45 + w.depth * 0.55);
58
+ }
59
+ return y;
60
+ }
61
+ /** The wave's slope at `x` — the derivative the free particles drift along. */
62
+ export function waveSlope(w, x, time, waveSpeed = 1, amplitude = 1) {
63
+ return (Math.cos(x * w.freq + w.phase + time * w.speed * 1000 * waveSpeed) * w.amp * w.freq * amplitude);
64
+ }
65
+ //# sourceMappingURL=currents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"currents.js","sourceRoot":"","sources":["../../src/core/currents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Dock — the pure, DOM-free decision core for element capture (§22.3, agent-consumption-model).
3
+ *
4
+ * The element-level analogue of particle capture: a `[data-move][data-dock]` element drifting under
5
+ * the field, when it falls inside a `sink` body's capture radius, **docks** — it collapses toward the
6
+ * sink core (translate + scale → 0) and is held until the sink releases (supernova), which restores
7
+ * it. This module computes the trigger, the eased collapse progress, and the transform; `field.ts`
8
+ * performs the DOM writes, the a11y toggle, and the `field:captured`/`field:released` dispatch.
9
+ */
10
+ import type { Vec2 } from './types.ts';
11
+ /** Per-element collapse state: progress 0 (free) → 1 (fully docked at the sink). */
12
+ export interface DockState {
13
+ dock: number;
14
+ }
15
+ /** Whether a screen point lies inside a sink's capture radius (the dock trigger). */
16
+ export declare function withinCapture(center: Vec2, sink: {
17
+ cx: number;
18
+ cy: number;
19
+ absorbR: number;
20
+ }): boolean;
21
+ /** Ease a dock progress toward `target` (1 docking, 0 releasing), snapping at the ends. */
22
+ export declare function stepDock(progress: number, target: 0 | 1, rate?: number): number;
23
+ /**
24
+ * The collapse transform for a docking element: translate from its current field offset toward the
25
+ * sink centre and scale 1 → 0 as it docks. `home` is the element's layout-slot centre (its screen
26
+ * centre at offset 0), `offset` its current field offset, `sink` the core centre. At progress 1 the
27
+ * element sits at the sink centre, scaled to nothing.
28
+ */
29
+ export declare function dockTransform(home: Vec2, offset: Vec2, sink: Vec2, progress: number): {
30
+ tx: number;
31
+ ty: number;
32
+ scale: number;
33
+ opacity: number;
34
+ };
35
+ //# sourceMappingURL=dock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dock.d.ts","sourceRoot":"","sources":["../../src/core/dock.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,oFAAoF;AACpF,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qFAAqF;AACrF,wBAAgB,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAItG;AAED,2FAA2F;AAC3F,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,SAAO,GAAG,MAAM,CAK7E;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,IAAI,EACZ,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,GACf;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAO5D"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Dock — the pure, DOM-free decision core for element capture (§22.3, agent-consumption-model).
3
+ *
4
+ * The element-level analogue of particle capture: a `[data-move][data-dock]` element drifting under
5
+ * the field, when it falls inside a `sink` body's capture radius, **docks** — it collapses toward the
6
+ * sink core (translate + scale → 0) and is held until the sink releases (supernova), which restores
7
+ * it. This module computes the trigger, the eased collapse progress, and the transform; `field.ts`
8
+ * performs the DOM writes, the a11y toggle, and the `field:captured`/`field:released` dispatch.
9
+ */
10
+ /** Whether a screen point lies inside a sink's capture radius (the dock trigger). */
11
+ export function withinCapture(center, sink) {
12
+ const dx = sink.cx - center.x;
13
+ const dy = sink.cy - center.y;
14
+ return dx * dx + dy * dy < sink.absorbR * sink.absorbR;
15
+ }
16
+ /** Ease a dock progress toward `target` (1 docking, 0 releasing), snapping at the ends. */
17
+ export function stepDock(progress, target, rate = 0.14) {
18
+ const next = progress + (target - progress) * rate;
19
+ if (next < 0.001)
20
+ return 0;
21
+ if (next > 0.999)
22
+ return 1;
23
+ return next;
24
+ }
25
+ /**
26
+ * The collapse transform for a docking element: translate from its current field offset toward the
27
+ * sink centre and scale 1 → 0 as it docks. `home` is the element's layout-slot centre (its screen
28
+ * centre at offset 0), `offset` its current field offset, `sink` the core centre. At progress 1 the
29
+ * element sits at the sink centre, scaled to nothing.
30
+ */
31
+ export function dockTransform(home, offset, sink, progress) {
32
+ const curX = home.x + offset.x;
33
+ const curY = home.y + offset.y;
34
+ const tx = offset.x + (sink.x - curX) * progress;
35
+ const ty = offset.y + (sink.y - curY) * progress;
36
+ const scale = 1 - progress;
37
+ return { tx, ty, scale, opacity: scale };
38
+ }
39
+ //# sourceMappingURL=dock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dock.js","sourceRoot":"","sources":["../../src/core/dock.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,qFAAqF;AACrF,MAAM,UAAU,aAAa,CAAC,MAAY,EAAE,IAAiD;IAC3F,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;IAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;IAC9B,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;AACzD,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,QAAQ,CAAC,QAAgB,EAAE,MAAa,EAAE,IAAI,GAAG,IAAI;IACnE,MAAM,IAAI,GAAG,QAAQ,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC;IACnD,IAAI,IAAI,GAAG,KAAK;QAAE,OAAO,CAAC,CAAC;IAC3B,IAAI,IAAI,GAAG,KAAK;QAAE,OAAO,CAAC,CAAC;IAC3B,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAU,EACV,MAAY,EACZ,IAAU,EACV,QAAgB;IAEhB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IAC/B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAC;IACjD,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAC;IACjD,MAAM,KAAK,GAAG,CAAC,GAAG,QAAQ,CAAC;IAC3B,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Event agents (§22.5) — a force/condition firing on a body dispatches a
3
+ * debounced CustomEvent, so the field can drive app behaviour, not just pixels.
4
+ * Declared with `data-on="dense:field:lit, captured:field:dock"` (trigger:event,
5
+ * comma-separated). Rising-edge debounced: fires once on cross, re-arms on reset.
6
+ */
7
+ export interface EventBinding {
8
+ trigger: string;
9
+ event: string;
10
+ /** true while the trigger is held (so we fire only on the rising edge). */
11
+ armed: boolean;
12
+ }
13
+ /** Parse a `data-on` string into trigger→event bindings (event names may contain ':'). */
14
+ export declare function parseEventBindings(spec: string): EventBinding[];
15
+ /** Body state a trigger reads. */
16
+ export interface TriggerState {
17
+ d: number;
18
+ on: boolean;
19
+ accreted: number;
20
+ }
21
+ /** Whether a trigger currently holds (rising-edge debounce handled by the caller). */
22
+ export declare function triggerActive(trigger: string, s: TriggerState): boolean;
23
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/core/events.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,0FAA0F;AAC1F,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE,CAU/D;AAED,kCAAkC;AAClC,MAAM,WAAW,YAAY;IAC3B,CAAC,EAAE,MAAM,CAAC;IACV,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,sFAAsF;AACtF,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,GAAG,OAAO,CAavE"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Event agents (§22.5) — a force/condition firing on a body dispatches a
3
+ * debounced CustomEvent, so the field can drive app behaviour, not just pixels.
4
+ * Declared with `data-on="dense:field:lit, captured:field:dock"` (trigger:event,
5
+ * comma-separated). Rising-edge debounced: fires once on cross, re-arms on reset.
6
+ */
7
+ /** Parse a `data-on` string into trigger→event bindings (event names may contain ':'). */
8
+ export function parseEventBindings(spec) {
9
+ return spec
10
+ .split(',')
11
+ .map((s) => s.trim())
12
+ .filter(Boolean)
13
+ .map((pair) => {
14
+ const i = pair.indexOf(':');
15
+ return { trigger: pair.slice(0, i).trim(), event: pair.slice(i + 1).trim(), armed: false };
16
+ })
17
+ .filter((b) => b.trigger && b.event);
18
+ }
19
+ /** Whether a trigger currently holds (rising-edge debounce handled by the caller). */
20
+ export function triggerActive(trigger, s) {
21
+ switch (trigger) {
22
+ case 'dense':
23
+ return s.d > 0.6;
24
+ case 'sparse':
25
+ return s.d < 0.2;
26
+ case 'engaged':
27
+ return s.on;
28
+ case 'captured':
29
+ return s.accreted > 0;
30
+ default:
31
+ return false;
32
+ }
33
+ }
34
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/core/events.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,0FAA0F;AAC1F,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,IAAI;SACR,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC7F,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC;AASD,sFAAsF;AACtF,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,CAAe;IAC5D,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,OAAO;YACV,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QACnB,KAAK,QAAQ;YACX,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QACnB,KAAK,SAAS;YACZ,OAAO,CAAC,CAAC,EAAE,CAAC;QACd,KAAK,UAAU;YACb,OAAO,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC;QACxB;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * The engine's INTERNAL default feedback sink (#228, Phase 5) — the fallback write path when no
3
+ * platform `feedbackSink` is configured (raw `createField`, @fundamental-engine/vanilla, applyRecipe-scoped
4
+ * engines). Its output is byte-identical to the direct `style.setProperty` writes the engine
5
+ * performed historically: same variable names, same `.toFixed(3)` formatting, same write order,
6
+ * same `field:lit`/`field:dim` hysteresis on `data-fx-lit`. Only the shape moved — every feedback
7
+ * write now flows through the ONE sink contract, so instrumentation, lint, and future throttling
8
+ * see every write regardless of which sink is installed.
9
+ *
10
+ * Engine-internal plumbing: not exported from the package index, not public API. The platform
11
+ * route (`makeFeedbackSink` in @fundamental-engine/elements) replaces this sink when the platform runtime
12
+ * is on; both honor the same {@link FeedbackChannels} contract.
13
+ *
14
+ * DOM boundary note: this writes via the same `el.style` / `dispatchEvent` element members the
15
+ * engine has always used on injected nodes — it touches no DOM *globals*, so the empty-allowlist
16
+ * guard (`dom-boundary.test.ts`) holds.
17
+ */
18
+ import type { FeedbackSink } from './types.ts';
19
+ /**
20
+ * Write a body's feedback channels straight onto the element — the legacy direct-write behavior,
21
+ * preserved exactly:
22
+ *
23
+ * - density → `--d` (the established var) + `--field-density` — same value, three decimals.
24
+ * - heatmapDensity → `--field-heatmap-density`.
25
+ * - load → `--load` (the canonical author-facing var) + `--mass` (back-compat alias, §21.2).
26
+ * - lit → `--lit`, plus the thresholded `field:lit` (rising past 0.5) / `field:dim` (falling past
27
+ * 0.4) events, armed via `data-fx-lit` for hysteresis.
28
+ *
29
+ * Stateless: the lit hysteresis lives on the element (`dataset.fxLit`), exactly as before.
30
+ */
31
+ export declare const defaultFeedbackSink: FeedbackSink;
32
+ //# sourceMappingURL=feedback-sink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback-sink.d.ts","sourceRoot":"","sources":["../../src/core/feedback-sink.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB,EAAE,YAmCjC,CAAC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Write a body's feedback channels straight onto the element — the legacy direct-write behavior,
3
+ * preserved exactly:
4
+ *
5
+ * - density → `--d` (the established var) + `--field-density` — same value, three decimals.
6
+ * - heatmapDensity → `--field-heatmap-density`.
7
+ * - load → `--load` (the canonical author-facing var) + `--mass` (back-compat alias, §21.2).
8
+ * - lit → `--lit`, plus the thresholded `field:lit` (rising past 0.5) / `field:dim` (falling past
9
+ * 0.4) events, armed via `data-fx-lit` for hysteresis.
10
+ *
11
+ * Stateless: the lit hysteresis lives on the element (`dataset.fxLit`), exactly as before.
12
+ */
13
+ export const defaultFeedbackSink = (el, ch) => {
14
+ if (ch.density !== undefined) {
15
+ const dStr = ch.density.toFixed(3);
16
+ el.style.setProperty('--d', dStr);
17
+ el.style.setProperty('--field-density', dStr);
18
+ }
19
+ if (ch.heatmapDensity !== undefined) {
20
+ const hStr = ch.heatmapDensity.toFixed(3);
21
+ el.style.setProperty('--field-heatmap-density', hStr);
22
+ }
23
+ if (ch.load !== undefined) {
24
+ const loadStr = ch.load.toFixed(3);
25
+ el.style.setProperty('--load', loadStr);
26
+ el.style.setProperty('--mass', loadStr);
27
+ }
28
+ // measured thermodynamics (workover v0.3): the bare names per the workover/BACKLOG contract.
29
+ // Engine-MEASURED local thermodynamics — distinct from the platform's INFERRED interaction
30
+ // lanes (`--field-entropy` / `--field-coherence`, system-contracts §6), and numeric where the
31
+ // `--coherence` on `:root` from cssTokens() is a palette *color* (element-scoped, so this
32
+ // shadows that color only on data-feedback subtrees that read it — none in the tree today).
33
+ if (ch.entropy !== undefined)
34
+ el.style.setProperty('--entropy', ch.entropy.toFixed(3));
35
+ if (ch.coherence !== undefined)
36
+ el.style.setProperty('--coherence', ch.coherence.toFixed(3));
37
+ if (ch.temperature !== undefined)
38
+ el.style.setProperty('--temperature', ch.temperature.toFixed(3));
39
+ if (ch.lit !== undefined) {
40
+ const lit = ch.lit;
41
+ el.style.setProperty('--lit', lit.toFixed(3));
42
+ const armed = el.dataset.fxLit === '1';
43
+ if (lit > 0.5 && !armed) {
44
+ el.dataset.fxLit = '1';
45
+ el.dispatchEvent(new CustomEvent('field:lit', { detail: { value: lit } }));
46
+ }
47
+ else if (lit < 0.4 && armed) {
48
+ el.dataset.fxLit = '0';
49
+ el.dispatchEvent(new CustomEvent('field:dim', { detail: { value: lit } }));
50
+ }
51
+ }
52
+ };
53
+ //# sourceMappingURL=feedback-sink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback-sink.js","sourceRoot":"","sources":["../../src/core/feedback-sink.ts"],"names":[],"mappings":"AAmBA;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAiB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;IAC1D,IAAI,EAAE,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACnC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAClC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,EAAE,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1C,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,yBAAyB,EAAE,IAAI,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,EAAE,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACnC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACxC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IACD,6FAA6F;IAC7F,2FAA2F;IAC3F,8FAA8F;IAC9F,0FAA0F;IAC1F,4FAA4F;IAC5F,IAAI,EAAE,CAAC,OAAO,KAAK,SAAS;QAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACvF,IAAI,EAAE,CAAC,SAAS,KAAK,SAAS;QAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7F,IAAI,EAAE,CAAC,WAAW,KAAK,SAAS;QAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,eAAe,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACnG,IAAI,EAAE,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC;QACnB,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,KAAK,GAAG,CAAC;QACvC,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YACxB,EAAE,CAAC,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC;YACvB,EAAE,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7E,CAAC;aAAM,IAAI,GAAG,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;YAC9B,EAAE,CAAC,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC;YACvB,EAAE,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Two-way density feedback (§8) — the field writes the density gathered on a body
3
+ * back into its element as `--d`, so type can glow, grow, and gain weight where
4
+ * matter collects (the sanctioned word treatment, §11 note). Pure math here; the
5
+ * DOM writes live in the field loop.
6
+ */
7
+ /** Eased target density for a body from its per-frame `count` (§8). */
8
+ export declare function feedbackTarget(count: number, on: boolean): number;
9
+ /** Variable-font weight from density `d` ∈ [0,1] (§8). */
10
+ export declare function feedbackWeight(fmin: number, fmax: number, d: number): number;
11
+ //# sourceMappingURL=feedback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../src/core/feedback.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,uEAAuE;AACvE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,GAAG,MAAM,CAGjE;AAED,0DAA0D;AAC1D,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5E"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Two-way density feedback (§8) — the field writes the density gathered on a body
3
+ * back into its element as `--d`, so type can glow, grow, and gain weight where
4
+ * matter collects (the sanctioned word treatment, §11 note). Pure math here; the
5
+ * DOM writes live in the field loop.
6
+ */
7
+ /** Eased target density for a body from its per-frame `count` (§8). */
8
+ export function feedbackTarget(count, on) {
9
+ const t = count / 20 + (on ? 0.45 : 0);
10
+ return t < 0 ? 0 : t > 1 ? 1 : t;
11
+ }
12
+ /** Variable-font weight from density `d` ∈ [0,1] (§8). */
13
+ export function feedbackWeight(fmin, fmax, d) {
14
+ return Math.round(fmin + (fmax - fmin) * d);
15
+ }
16
+ //# sourceMappingURL=feedback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../src/core/feedback.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,uEAAuE;AACvE,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,EAAW;IACvD,MAAM,CAAC,GAAG,KAAK,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,IAAY,EAAE,CAAS;IAClE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * FieldStore — owns the particle pool and the spatial index (§20.1 foundation).
3
+ *
4
+ * The single home for "all the matter": add/remove particles, rebuild the
5
+ * neighbour index once per frame, and answer `neighbors(p, r)`. Count is the
6
+ * conserved quantity (§2.4) — `size` is the live total.
7
+ */
8
+ import type { Particle } from './types.ts';
9
+ export declare class FieldStore {
10
+ readonly particles: Particle[];
11
+ private readonly hash;
12
+ constructor(cellSize?: number);
13
+ get size(): number;
14
+ add(p: Particle): Particle;
15
+ /** swap-remove a particle (O(1), order not preserved). */
16
+ remove(p: Particle): void;
17
+ clear(): void;
18
+ /** rebuild the neighbour index from the current pool (once per frame). */
19
+ reindex(): void;
20
+ /** neighbours within `r` of `p` (true 3D distance), excluding `p` itself. */
21
+ neighbors(p: Particle, r: number): Particle[];
22
+ /** particles within `r` of an arbitrary point (x, y) — for grid sampling (e.g. the
23
+ * voronoi render mode), where the query origin is not itself a particle. */
24
+ near(x: number, y: number, r: number): Particle[];
25
+ }
26
+ //# sourceMappingURL=field-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-store.d.ts","sourceRoot":"","sources":["../../src/core/field-store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG3C,qBAAa,UAAU;IACrB,QAAQ,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAM;IACpC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAwB;gBAEjC,QAAQ,SAAK;IAIzB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,QAAQ;IAK1B,0DAA0D;IAC1D,MAAM,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI;IAOzB,KAAK,IAAI,IAAI;IAKb,0EAA0E;IAC1E,OAAO,IAAI,IAAI;IAIf,6EAA6E;IAC7E,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE;IAO7C;iFAC6E;IAC7E,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE;CAGlD"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * FieldStore — owns the particle pool and the spatial index (§20.1 foundation).
3
+ *
4
+ * The single home for "all the matter": add/remove particles, rebuild the
5
+ * neighbour index once per frame, and answer `neighbors(p, r)`. Count is the
6
+ * conserved quantity (§2.4) — `size` is the live total.
7
+ */
8
+ import { SpatialHash } from "./spatial-hash.js";
9
+ export class FieldStore {
10
+ particles = [];
11
+ hash;
12
+ constructor(cellSize = 64) {
13
+ this.hash = new SpatialHash(cellSize);
14
+ }
15
+ get size() {
16
+ return this.particles.length;
17
+ }
18
+ add(p) {
19
+ this.particles.push(p);
20
+ return p;
21
+ }
22
+ /** swap-remove a particle (O(1), order not preserved). */
23
+ remove(p) {
24
+ const i = this.particles.indexOf(p);
25
+ if (i < 0)
26
+ return;
27
+ const last = this.particles.pop();
28
+ if (last && i < this.particles.length)
29
+ this.particles[i] = last;
30
+ }
31
+ clear() {
32
+ this.particles.length = 0;
33
+ this.hash.clear();
34
+ }
35
+ /** rebuild the neighbour index from the current pool (once per frame). */
36
+ reindex() {
37
+ this.hash.rebuild(this.particles);
38
+ }
39
+ /** neighbours within `r` of `p` (true 3D distance), excluding `p` itself. */
40
+ neighbors(p, r) {
41
+ const found = this.hash.near(p.x, p.y, r, p.z ?? 0);
42
+ const out = [];
43
+ for (const n of found)
44
+ if (n !== p)
45
+ out.push(n);
46
+ return out;
47
+ }
48
+ /** particles within `r` of an arbitrary point (x, y) — for grid sampling (e.g. the
49
+ * voronoi render mode), where the query origin is not itself a particle. */
50
+ near(x, y, r) {
51
+ return this.hash.near(x, y, r);
52
+ }
53
+ }
54
+ //# sourceMappingURL=field-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-store.js","sourceRoot":"","sources":["../../src/core/field-store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,OAAO,UAAU;IACZ,SAAS,GAAe,EAAE,CAAC;IACnB,IAAI,CAAwB;IAE7C,YAAY,QAAQ,GAAG,EAAE;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,WAAW,CAAW,QAAQ,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;IAC/B,CAAC;IAED,GAAG,CAAC,CAAW;QACb,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,0DAA0D;IAC1D,MAAM,CAAC,CAAW;QAChB,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;QAClC,IAAI,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM;YAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAClE,CAAC;IAED,KAAK;QACH,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;IAED,0EAA0E;IAC1E,OAAO;QACL,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IAED,6EAA6E;IAC7E,SAAS,CAAC,CAAW,EAAE,CAAS;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACpD,MAAM,GAAG,GAAe,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,KAAK;YAAE,IAAI,CAAC,KAAK,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChD,OAAO,GAAG,CAAC;IACb,CAAC;IAED;iFAC6E;IAC7E,IAAI,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS;QAClC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACjC,CAAC;CACF"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * createField — the browser entry point (§13).
3
+ *
4
+ * Mounts the simulation against a `<canvas>`: builds the particle pool, scans
5
+ * the document for `[data-body]` bodies, runs the rAF loop (measure → reindex →
6
+ * step → render), and exposes the public `FieldHandle`. Pure glue — the testable
7
+ * physics lives in field-store / integrator / scanner.
8
+ *
9
+ * ── Renderer-agnostic (frontier) ──────────────────────────────────────────────────────
10
+ * This engine touches NO DOM globals. Every environment touchpoint — viewport size, scroll, rAF,
11
+ * reduced-motion, visibility, the scan root, and event wiring — goes through an injected
12
+ * {@link FieldHost} (default `browserHost()`). The browser's `window`/`document` surface is isolated
13
+ * in `browser-host.ts` (the one allowlisted DOM module, with `export.ts`). Pass `opts.host` to drive
14
+ * the same engine from a different renderer/environment. Enforced by `dom-boundary.test.ts`.
15
+ */
16
+ import type { FieldHandle, FieldOptions } from './types.ts';
17
+ export declare function createField(canvas: HTMLCanvasElement, opts?: FieldOptions): FieldHandle;
18
+ //# sourceMappingURL=field.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../../src/core/field.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAA0B,WAAW,EAAE,YAAY,EAAkD,MAAM,YAAY,CAAC;AAoDpI,wBAAgB,WAAW,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,GAAE,YAAiB,GAAG,WAAW,CA4yD3F"}