@fundamental-engine/vanilla 0.6.0 → 0.8.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.
package/README.md CHANGED
@@ -13,7 +13,7 @@ registration, no framework dependency, no import side effects.
13
13
  npm i @fundamental-engine/vanilla
14
14
  ```
15
15
 
16
- The only dependency is the zero-dependency core plus [`@fundamental-engine/platform`](../platform) (which supplies
16
+ The only dependency is the zero-dependency core plus [`@fundamental-engine/dom`](../dom) (which supplies
17
17
  the browser host). Reach for this from plain TypeScript, or any stack where you want to drive the field
18
18
  by hand.
19
19
 
@@ -116,12 +116,12 @@ import { FORCES, FORMATIONS } from '@fundamental-engine/vanilla';
116
116
  ## Recipes & data binding
117
117
 
118
118
  To apply a named recipe over your markup or bind data to the field, use `applyRecipe()` / `bindData()`
119
- from [`@fundamental-engine/platform`](../platform); browse all 64 recipes at
119
+ from [`@fundamental-engine/dom`](../dom); browse all 64 recipes at
120
120
  [`/docs/gallery`](https://fundamental-engine.com/docs/gallery).
121
121
 
122
122
  ## Related
123
123
 
124
- [`@fundamental-engine/core`](../core) · [`@fundamental-engine/platform`](../platform) · [`@fundamental-engine/elements`](../elements)
124
+ [`@fundamental-engine/core`](../core) · [`@fundamental-engine/dom`](../dom) · [`@fundamental-engine/elements`](../elements)
125
125
  · [`@fundamental-engine/react`](../react) · the [documentation map](../../docs/README.md).
126
126
 
127
127
  ## License
@@ -0,0 +1,30 @@
1
+ /**
2
+ * `createField` — the one imperative door to the reciprocal field for plain TypeScript.
3
+ *
4
+ * Core is renderer-agnostic: its `createField` REQUIRES a `host`. This vanilla entry bundles the
5
+ * host so the framework-free path stays a one-liner, while still letting you reach the contained
6
+ * and custom-host modes without knowing the lower-level wiring (`createBrowserField`, `containerHost`).
7
+ *
8
+ * Host resolution, in order:
9
+ * 1. explicit `opts.host` — drive any renderer-agnostic `FieldHost` you supply;
10
+ * 2. `containerHost(opts.bounds)` — a CONTAINED field scoped to that element's local space (#540);
11
+ * 3. `browserHost()` — the default, window-scoped field.
12
+ *
13
+ * The frozen contract holds: `createField(canvas)` with no host still auto-supplies `browserHost()`.
14
+ * `bounds` and `host` are additive options.
15
+ *
16
+ * ```ts
17
+ * createField(canvas); // window-scoped (default)
18
+ * createField(canvas, { bounds: card }); // contained to an element
19
+ * createField(canvas, { host: myHost }); // a custom host (3D, native, headless)
20
+ * ```
21
+ */
22
+ import { type FieldHandle, type FieldOptions } from '@fundamental-engine/core';
23
+ export interface CreateFieldOptions extends FieldOptions {
24
+ /** render a CONTAINED field scoped to this element instead of the window (#540): bodies are scanned
25
+ * within `bounds` and positions live in its local coordinate space. Ignored when `host` is given. */
26
+ bounds?: HTMLElement;
27
+ }
28
+ /** Start the engine on a canvas you own, resolving the host from `opts.host` → `bounds` → browser. */
29
+ export declare function createField(canvas: HTMLCanvasElement, opts?: CreateFieldOptions): FieldHandle;
30
+ //# sourceMappingURL=create-field.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-field.d.ts","sourceRoot":"","sources":["../src/create-field.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAkC,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAG/G,MAAM,WAAW,kBAAmB,SAAQ,YAAY;IACtD;0GACsG;IACtG,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,sGAAsG;AACtG,wBAAgB,WAAW,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,GAAE,kBAAuB,GAAG,WAAW,CAIjG"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * `createField` — the one imperative door to the reciprocal field for plain TypeScript.
3
+ *
4
+ * Core is renderer-agnostic: its `createField` REQUIRES a `host`. This vanilla entry bundles the
5
+ * host so the framework-free path stays a one-liner, while still letting you reach the contained
6
+ * and custom-host modes without knowing the lower-level wiring (`createBrowserField`, `containerHost`).
7
+ *
8
+ * Host resolution, in order:
9
+ * 1. explicit `opts.host` — drive any renderer-agnostic `FieldHost` you supply;
10
+ * 2. `containerHost(opts.bounds)` — a CONTAINED field scoped to that element's local space (#540);
11
+ * 3. `browserHost()` — the default, window-scoped field.
12
+ *
13
+ * The frozen contract holds: `createField(canvas)` with no host still auto-supplies `browserHost()`.
14
+ * `bounds` and `host` are additive options.
15
+ *
16
+ * ```ts
17
+ * createField(canvas); // window-scoped (default)
18
+ * createField(canvas, { bounds: card }); // contained to an element
19
+ * createField(canvas, { host: myHost }); // a custom host (3D, native, headless)
20
+ * ```
21
+ */
22
+ import { createField as coreCreateField } from '@fundamental-engine/core';
23
+ import { browserHost, containerHost } from '@fundamental-engine/dom';
24
+ /** Start the engine on a canvas you own, resolving the host from `opts.host` → `bounds` → browser. */
25
+ export function createField(canvas, opts = {}) {
26
+ const { host, bounds, ...rest } = opts;
27
+ const resolved = host ?? (bounds ? containerHost(bounds) : browserHost());
28
+ return coreCreateField(canvas, { ...rest, host: resolved });
29
+ }
30
+ //# sourceMappingURL=create-field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-field.js","sourceRoot":"","sources":["../src/create-field.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,WAAW,IAAI,eAAe,EAAuC,MAAM,0BAA0B,CAAC;AAC/G,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAQrE,sGAAsG;AACtG,MAAM,UAAU,WAAW,CAAC,MAAyB,EAAE,OAA2B,EAAE;IAClF,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;IACvC,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1E,OAAO,eAAe,CAAC,MAAM,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC9D,CAAC"}
package/dist/field.d.ts CHANGED
@@ -16,13 +16,17 @@
16
16
  * // field.scan(); field.destroy();
17
17
  * ```
18
18
  */
19
- import { type AgentHandle, type AgentSpec, type AtomPayload, type FieldHandle, type FieldOptions, type ThreadLink, type FlowOptions, type ScalarGrid, type FieldEventType, type FieldEventMap, type BodySpec, type BodyHandle, type SurfacePlan } from '@fundamental-engine/core';
19
+ import { type AgentHandle, type AgentSpec, type AtomPayload, type FieldHandle, type FieldOptions, type ThreadLink, type FlowOptions, type ScalarGrid, type FieldEventType, type FieldEventMap, type BodySpec, type BodyHandle, type FieldChannelHandle } from '@fundamental-engine/core';
20
20
  export interface FieldFieldInit extends FieldOptions {
21
21
  /** drive a `<canvas>` you own; when omitted, a managed full-viewport canvas is created
22
22
  * (and removed again by `destroy()`). */
23
23
  canvas?: HTMLCanvasElement;
24
24
  /** where to append the managed canvas; ignored when you pass your own `canvas`. */
25
25
  target?: HTMLElement;
26
+ /** render a CONTAINED field scoped to this element instead of the window (#540): the field, its
27
+ * bodies (scanned within `bounds`), and its canvas all live in the element's local coordinate
28
+ * space. The managed canvas is absolutely positioned inside it. The card-sized / component path. */
29
+ bounds?: HTMLElement;
26
30
  }
27
31
  export declare class FieldField implements FieldHandle {
28
32
  /** the `<canvas>` the field renders to — the one created for you, or the one you passed. */
@@ -49,10 +53,8 @@ export declare class FieldField implements FieldHandle {
49
53
  setHeatmap(on: boolean): void;
50
54
  /** lower/raise the backing-store DPR ceiling at runtime (the dominant fill-rate lever). */
51
55
  setDprCap(cap: number): void;
52
- /** set the whole surface state (underlay/overlay/heatmap) in one declarative call. */
53
- setSurfaces(plan: SurfacePlan): void;
54
- /** the current surface state; the inverse of setSurfaces. */
55
- getSurfaces(): Required<SurfacePlan>;
56
+ /** apply an adaptive quality tier 0–3 (#413) caps DPR, drops the heatmap at 2+; 0 restores. */
57
+ setQualityTier(tier: number): void;
56
58
  /** switch the underlay render mode (§20.6) live. */
57
59
  setRender(mode: Parameters<FieldHandle['setRender']>[0]): void;
58
60
  /** render a field-structure visualization on the overlay surface (in front of content). */
@@ -70,6 +72,10 @@ export declare class FieldField implements FieldHandle {
70
72
  addAgent(spec: AgentSpec): AgentHandle;
71
73
  /** add a programmatic body (no DOM) from a spec — carries data + per-body feedback; survives rescan. */
72
74
  addBody(spec: BodySpec): BodyHandle;
75
+ /** register a named external scalar field channel the engine samples on its read path. */
76
+ addField(name: string, sampler: (x: number, y: number) => number): FieldChannelHandle;
77
+ /** sample a registered field channel at (x, y); 0 for an unknown channel. */
78
+ sampleField(name: string, x: number, y: number): number;
73
79
  atomAt(x: number, y: number): AtomPayload | null;
74
80
  focusAt(x: number, y: number): AtomPayload | null;
75
81
  clearFocus(): void;
@@ -78,8 +84,6 @@ export declare class FieldField implements FieldHandle {
78
84
  readParticles(out: Float32Array): number;
79
85
  /** copy each live particle's stable id into a Uint32Array, parallel to readParticles. */
80
86
  readParticleIds(out: Uint32Array): number;
81
- /** copy each live particle's tint into a Uint8Array as [r,g,b], parallel to readParticles. */
82
- readParticleColors(out: Uint8Array): number;
83
87
  energy(): {
84
88
  kinetic: number;
85
89
  thermal: number;
@@ -102,6 +106,8 @@ export declare class FieldField implements FieldHandle {
102
106
  grid(name: string): ScalarGrid;
103
107
  /** subscribe to a discrete field event (absorb/release/settle); returns an unsubscribe fn. */
104
108
  on<K extends FieldEventType>(type: K, cb: (e: FieldEventMap[K]) => void): () => void;
109
+ /** the running engine version (`FIELD_VERSION`). */
110
+ get version(): string;
105
111
  scrollV(): number;
106
112
  setVisible(on: boolean): void;
107
113
  setBackground(mode: Parameters<FieldHandle['setBackground']>[0]): void;
@@ -1 +1 @@
1
- {"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../src/field.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../src/field.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,KAAK,QAAQ,EAAE,KAAK,UAAU,EAAE,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAIzR,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD;8CAC0C;IAC1C,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,mFAAmF;IACnF,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB;;yGAEqG;IACrG,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,qBAAa,UAAW,YAAW,WAAW;IAC5C,4FAA4F;IAC5F,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,oFAAoF;IACpF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;gBAEtB,IAAI,GAAE,cAAmB;IAUrC,4EAA4E;IAC5E,IAAI,IAAI,IAAI;IAGZ,uBAAuB;IACvB,MAAM,IAAI,IAAI;IAGd,0CAA0C;IAC1C,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAG5B,uFAAuF;IACvF,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,IAAI;IAGrD,wCAAwC;IACxC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAGhC,2EAA2E;IAC3E,YAAY,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI;IAG/B,uFAAuF;IACvF,YAAY,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI;IAG/B,gEAAgE;IAChE,UAAU,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI;IAG7B,2FAA2F;IAC3F,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAG5B,iGAAiG;IACjG,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAGlC,oDAAoD;IACpD,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IAG9D,2FAA2F;IAC3F,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IAGhE,4EAA4E;IAC5E,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,IAAI,GAAG,IAAI;IAGxC,yFAAyF;IACzF,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IAG/C,qGAAqG;IACrG,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,IAAI;IAGtD,6BAA6B;IAC7B,SAAS,IAAI,IAAI;IAGjB,IAAI,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,GAAG,IAAI;IAGzC,mFAAmF;IACnF,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,WAAW;IAGtC,wGAAwG;IACxG,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,UAAU;IAGnC,0FAA0F;IAC1F,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,kBAAkB;IAGrF,6EAA6E;IAC7E,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;IAGvD,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAGhD,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAGjD,UAAU,IAAI,IAAI;IAGlB,aAAa,IAAI,MAAM;IAGvB,sGAAsG;IACtG,aAAa,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM;IAGxC,yFAAyF;IACzF,eAAe,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM;IAGzC,MAAM,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;IAG5E,iGAAiG;IACjG,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE;IAGtD,gGAAgG;IAChG,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;IAG1C,kHAAkH;IAClH,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE;IAG9D,0GAA0G;IAC1G,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU;IAG9B,8FAA8F;IAC9F,EAAE,CAAC,CAAC,SAAS,cAAc,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI;IAGpF,oDAAoD;IACpD,IAAI,OAAO,IAAI,MAAM,CAEpB;IACD,OAAO,IAAI,MAAM;IAGjB,UAAU,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI;IAG7B,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IAGtE,wFAAwF;IACxF,OAAO,IAAI,IAAI;CAIhB"}
package/dist/field.js CHANGED
@@ -17,8 +17,8 @@
17
17
  * ```
18
18
  */
19
19
  import {} from '@fundamental-engine/core';
20
- import { createBrowserField } from '@fundamental-engine/platform';
21
- import { makeFieldCanvas, assertBrowser } from "./mount.js";
20
+ import { createField } from "./create-field.js";
21
+ import { makeFieldCanvas, makeContainedCanvas, assertBrowser } from "./mount.js";
22
22
  export class FieldField {
23
23
  /** the `<canvas>` the field renders to — the one created for you, or the one you passed. */
24
24
  canvas;
@@ -27,10 +27,12 @@ export class FieldField {
27
27
  managed;
28
28
  constructor(init = {}) {
29
29
  assertBrowser(); // browser-only: fail loudly during SSR instead of a cryptic crash
30
- const { canvas, target, ...opts } = init;
30
+ const { canvas, target, bounds, ...opts } = init;
31
31
  this.managed = !canvas;
32
- this.canvas = canvas ?? makeFieldCanvas(target);
33
- this.field = createBrowserField(this.canvas, opts);
32
+ // The managed canvas differs by mode (absolutely-positioned inside `bounds`, else full-viewport);
33
+ // host resolution (container vs browser) is delegated to the one `createField` entry.
34
+ this.canvas = canvas ?? (bounds ? makeContainedCanvas(bounds) : makeFieldCanvas(target));
35
+ this.field = createField(this.canvas, bounds ? { ...opts, bounds } : opts);
34
36
  }
35
37
  /** (re)scan the document for `[data-body]` bodies after a layout change. */
36
38
  scan() {
@@ -68,13 +70,9 @@ export class FieldField {
68
70
  setDprCap(cap) {
69
71
  this.field.setDprCap(cap);
70
72
  }
71
- /** set the whole surface state (underlay/overlay/heatmap) in one declarative call. */
72
- setSurfaces(plan) {
73
- this.field.setSurfaces(plan);
74
- }
75
- /** the current surface state; the inverse of setSurfaces. */
76
- getSurfaces() {
77
- return this.field.getSurfaces();
73
+ /** apply an adaptive quality tier 0–3 (#413) caps DPR, drops the heatmap at 2+; 0 restores. */
74
+ setQualityTier(tier) {
75
+ this.field.setQualityTier(tier);
78
76
  }
79
77
  /** switch the underlay render mode (§20.6) live. */
80
78
  setRender(mode) {
@@ -111,6 +109,14 @@ export class FieldField {
111
109
  addBody(spec) {
112
110
  return this.field.addBody(spec);
113
111
  }
112
+ /** register a named external scalar field channel the engine samples on its read path. */
113
+ addField(name, sampler) {
114
+ return this.field.addField(name, sampler);
115
+ }
116
+ /** sample a registered field channel at (x, y); 0 for an unknown channel. */
117
+ sampleField(name, x, y) {
118
+ return this.field.sampleField(name, x, y);
119
+ }
114
120
  atomAt(x, y) {
115
121
  return this.field.atomAt(x, y);
116
122
  }
@@ -131,10 +137,6 @@ export class FieldField {
131
137
  readParticleIds(out) {
132
138
  return this.field.readParticleIds(out);
133
139
  }
134
- /** copy each live particle's tint into a Uint8Array as [r,g,b], parallel to readParticles. */
135
- readParticleColors(out) {
136
- return this.field.readParticleColors(out);
137
- }
138
140
  energy() {
139
141
  return this.field.energy();
140
142
  }
@@ -158,6 +160,10 @@ export class FieldField {
158
160
  on(type, cb) {
159
161
  return this.field.on(type, cb);
160
162
  }
163
+ /** the running engine version (`FIELD_VERSION`). */
164
+ get version() {
165
+ return this.field.version;
166
+ }
161
167
  scrollV() {
162
168
  return this.field.scrollV();
163
169
  }
package/dist/field.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"field.js","sourceRoot":"","sources":["../src/field.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"field.js","sourceRoot":"","sources":["../src/field.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAiP,MAAM,0BAA0B,CAAC;AACzR,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAcjF,MAAM,OAAO,UAAU;IACrB,4FAA4F;IACnF,MAAM,CAAoB;IAClB,KAAK,CAAc;IACpC,oFAAoF;IACnE,OAAO,CAAU;IAElC,YAAY,OAAuB,EAAE;QACnC,aAAa,EAAE,CAAC,CAAC,kEAAkE;QACnF,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;QACjD,IAAI,CAAC,OAAO,GAAG,CAAC,MAAM,CAAC;QACvB,kGAAkG;QAClG,sFAAsF;QACtF,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;QACzF,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC7E,CAAC;IAED,4EAA4E;IAC5E,IAAI;QACF,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACpB,CAAC;IACD,uBAAuB;IACvB,MAAM;QACJ,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IACtB,CAAC;IACD,0CAA0C;IAC1C,SAAS,CAAC,GAAW;QACnB,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IACD,uFAAuF;IACvF,UAAU,CAAC,OAAmC;QAC5C,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IACD,wCAAwC;IACxC,YAAY,CAAC,IAAY;QACvB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IACD,2EAA2E;IAC3E,YAAY,CAAC,EAAW;QACtB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IACD,uFAAuF;IACvF,YAAY,CAAC,EAAW;QACtB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IACD,gEAAgE;IAChE,UAAU,CAAC,EAAW;QACpB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IACD,2FAA2F;IAC3F,SAAS,CAAC,GAAW;QACnB,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IACD,iGAAiG;IACjG,cAAc,CAAC,IAAY;QACzB,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IACD,oDAAoD;IACpD,SAAS,CAAC,IAA6C;QACrD,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IACD,2FAA2F;IAC3F,UAAU,CAAC,IAA8C;QACvD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IACD,4EAA4E;IAC5E,OAAO,CAAC,IAAyB;QAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IACD,yFAAyF;IACzF,KAAK,CAAC,CAAS,EAAE,CAAS,EAAE,GAAY;QACtC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9B,CAAC;IACD,qGAAqG;IACrG,MAAM,CAAC,CAAS,EAAE,CAAS,EAAE,IAAkB;QAC7C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IACD,6BAA6B;IAC7B,SAAS;QACP,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;IACzB,CAAC;IACD,IAAI,CAAC,KAA6B;QAChC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IACD,mFAAmF;IACnF,QAAQ,CAAC,IAAe;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IACD,wGAAwG;IACxG,OAAO,CAAC,IAAc;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IACD,0FAA0F;IAC1F,QAAQ,CAAC,IAAY,EAAE,OAAyC;QAC9D,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IACD,6EAA6E;IAC7E,WAAW,CAAC,IAAY,EAAE,CAAS,EAAE,CAAS;QAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;IACD,MAAM,CAAC,CAAS,EAAE,CAAS;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,CAAC,CAAS,EAAE,CAAS;QAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,UAAU;QACR,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;IAC1B,CAAC;IACD,aAAa;QACX,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;IACpC,CAAC;IACD,sGAAsG;IACtG,aAAa,CAAC,GAAiB;QAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC;IACD,yFAAyF;IACzF,eAAe,CAAC,GAAgB;QAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IACzC,CAAC;IACD,MAAM;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IAC7B,CAAC;IACD,iGAAiG;IACjG,MAAM,CAAC,CAAS,EAAE,CAAS;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjC,CAAC;IACD,gGAAgG;IAChG,YAAY,CAAC,CAAS,EAAE,CAAS;QAC/B,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,kHAAkH;IAClH,cAAc,CAAC,CAAS,EAAE,CAAS;QACjC,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,0GAA0G;IAC1G,IAAI,CAAC,IAAY;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IACD,8FAA8F;IAC9F,EAAE,CAA2B,IAAO,EAAE,EAAiC;QACrE,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACjC,CAAC;IACD,oDAAoD;IACpD,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;IAC5B,CAAC;IACD,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IAC9B,CAAC;IACD,UAAU,CAAC,EAAW;QACpB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IACD,aAAa,CAAC,IAAiD;QAC7D,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IACD,wFAAwF;IACxF,OAAO;QACL,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACrB,IAAI,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;IACzC,CAAC;CACF"}
package/dist/index.d.ts CHANGED
@@ -13,7 +13,9 @@ export { FieldField } from './field.ts';
13
13
  export type { FieldFieldInit } from './field.ts';
14
14
  export { mountField, makeFieldCanvas } from './mount.ts';
15
15
  export type { MountOptions } from './mount.ts';
16
- export { createBrowserField as createField, browserHost } from '@fundamental-engine/platform';
16
+ export { createField } from './create-field.ts';
17
+ export type { CreateFieldOptions } from './create-field.ts';
18
+ export { browserHost } from '@fundamental-engine/dom';
17
19
  export type { FieldHandle, FieldOptions, ThreadLink, Particle, Body, Force, Formation, Vec2, AgentSpec, AgentHandle, AtomPayload, FeedbackSink, FeedbackChannels, } from '@fundamental-engine/core';
18
20
  export { cssFeedbackSink } from '@fundamental-engine/core';
19
21
  export { FORCES, FORMATIONS, CONDITIONS, PALETTE } from '@fundamental-engine/core';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACzD,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAK/C,OAAO,EAAE,kBAAkB,IAAI,WAAW,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC9F,YAAY,EACV,WAAW,EACX,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,IAAI,EACJ,KAAK,EACL,SAAS,EACT,IAAI,EACJ,SAAS,EACT,WAAW,EACX,WAAW,EACX,YAAY,EACZ,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAI3D,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACzD,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAM/C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,YAAY,EACV,WAAW,EACX,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,IAAI,EACJ,KAAK,EACL,SAAS,EACT,IAAI,EACJ,SAAS,EACT,WAAW,EACX,WAAW,EACX,YAAY,EACZ,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAI3D,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC"}
package/dist/index.js CHANGED
@@ -11,10 +11,12 @@
11
11
  */
12
12
  export { FieldField } from "./field.js";
13
13
  export { mountField, makeFieldCanvas } from "./mount.js";
14
- // The engine entry, wired to the browser host (core is renderer-agnostic and requires a host).
15
- // `createBrowserField` = `createField` + `browserHost()`; re-exported here as `createField` so the
16
- // framework-free door stays a one-liner. `browserHost` is re-exported for custom wiring.
17
- export { createBrowserField as createField, browserHost } from '@fundamental-engine/platform';
14
+ // The one imperative engine entry (core is renderer-agnostic and requires a host). `createField`
15
+ // resolves the host from `opts.host` `bounds` (contained) `browserHost()` (default), so the
16
+ // framework-free door stays a one-liner while reaching the contained/custom-host modes. `browserHost`
17
+ // is re-exported for explicit custom wiring.
18
+ export { createField } from "./create-field.js";
19
+ export { browserHost } from '@fundamental-engine/dom';
18
20
  // the feedback CSS adapter, for a host that wants the default DOM write path explicitly.
19
21
  export { cssFeedbackSink } from '@fundamental-engine/core';
20
22
  // The catalog data a vanilla UI commonly reads — the force list, formations, `data-when`
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGzD,+FAA+F;AAC/F,mGAAmG;AACnG,yFAAyF;AACzF,OAAO,EAAE,kBAAkB,IAAI,WAAW,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAgB9F,yFAAyF;AACzF,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3D,yFAAyF;AACzF,gFAAgF;AAChF,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGzD,iGAAiG;AACjG,gGAAgG;AAChG,sGAAsG;AACtG,6CAA6C;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAgBtD,yFAAyF;AACzF,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3D,yFAAyF;AACzF,gFAAgF;AAChF,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC"}
package/dist/mount.d.ts CHANGED
@@ -25,6 +25,9 @@ export declare function assertBrowser(): void;
25
25
  * shared by `mountField` and the `FieldField` class so the styling lives in one place.
26
26
  */
27
27
  export declare function makeFieldCanvas(target?: HTMLElement): HTMLCanvasElement;
28
+ /** A canvas filling a CONTAINED field's element (#540): absolutely positioned inside `bounds` rather
29
+ * than fixed to the viewport. Establishes a positioning context on `bounds` if it has none. */
30
+ export declare function makeContainedCanvas(bounds: HTMLElement): HTMLCanvasElement;
28
31
  /** Mount and start the field; returns the handle. `destroy()` also removes the canvas. */
29
32
  export declare function mountField(opts?: MountOptions): FieldHandle;
30
33
  //# sourceMappingURL=mount.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../src/mount.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAoB,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGjG,MAAM,WAAW,YAAa,SAAQ,YAAY;IAChD,+DAA+D;IAC/D,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAOpC;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,GAAE,WAA2B,GAAG,iBAAiB,CAMtF;AAED,0FAA0F;AAC1F,wBAAgB,UAAU,CAAC,IAAI,GAAE,YAAiB,GAAG,WAAW,CAY/D"}
1
+ {"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../src/mount.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAoB,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGjG,MAAM,WAAW,YAAa,SAAQ,YAAY;IAChD,+DAA+D;IAC/D,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAOpC;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,GAAE,WAA2B,GAAG,iBAAiB,CAMtF;AAED;gGACgG;AAChG,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,iBAAiB,CAO1E;AAED,0FAA0F;AAC1F,wBAAgB,UAAU,CAAC,IAAI,GAAE,YAAiB,GAAG,WAAW,CAY/D"}
package/dist/mount.js CHANGED
@@ -10,7 +10,7 @@
10
10
  * For object-oriented ergonomics (and driving a canvas you own), see the `FieldField` class.
11
11
  */
12
12
  import { FIELD_CANVAS_CSS } from '@fundamental-engine/core';
13
- import { createBrowserField } from '@fundamental-engine/platform';
13
+ import { createBrowserField } from '@fundamental-engine/dom';
14
14
  /**
15
15
  * Throw a clear error when there is no DOM (server-side render or build step). The field is a
16
16
  * browser-only, client-side effect; construct it on the client (a `useEffect` / `onMount` /
@@ -33,6 +33,17 @@ export function makeFieldCanvas(target = document.body) {
33
33
  target.appendChild(canvas);
34
34
  return canvas;
35
35
  }
36
+ /** A canvas filling a CONTAINED field's element (#540): absolutely positioned inside `bounds` rather
37
+ * than fixed to the viewport. Establishes a positioning context on `bounds` if it has none. */
38
+ export function makeContainedCanvas(bounds) {
39
+ const canvas = document.createElement('canvas');
40
+ canvas.setAttribute('aria-hidden', 'true');
41
+ canvas.style.cssText = 'position:absolute;inset:0;width:100%;height:100%;pointer-events:none;';
42
+ if (getComputedStyle(bounds).position === 'static')
43
+ bounds.style.position = 'relative';
44
+ bounds.appendChild(canvas);
45
+ return canvas;
46
+ }
36
47
  /** Mount and start the field; returns the handle. `destroy()` also removes the canvas. */
37
48
  export function mountField(opts = {}) {
38
49
  assertBrowser();
package/dist/mount.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"mount.js","sourceRoot":"","sources":["../src/mount.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,gBAAgB,EAAuC,MAAM,0BAA0B,CAAC;AACjG,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAOlE;;;;GAIG;AACH,MAAM,UAAU,aAAa;IAC3B,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CACb,mFAAmF;YACjF,oFAAoF,CACvF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,SAAsB,QAAQ,CAAC,IAAI;IACjE,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,8BAA8B;IAC1E,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,gBAAgB,CAAC,CAAC,2CAA2C;IACpF,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,UAAU,CAAC,OAAqB,EAAE;IAChD,aAAa,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,SAAS,EAAE,GAAG,IAAI,CAAC;IACtD,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACpD,OAAO;QACL,GAAG,KAAK;QACR,OAAO,EAAE,GAAG,EAAE;YACZ,KAAK,CAAC,OAAO,EAAE,CAAC;YAChB,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"mount.js","sourceRoot":"","sources":["../src/mount.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,gBAAgB,EAAuC,MAAM,0BAA0B,CAAC;AACjG,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAO7D;;;;GAIG;AACH,MAAM,UAAU,aAAa;IAC3B,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CACb,mFAAmF;YACjF,oFAAoF,CACvF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,SAAsB,QAAQ,CAAC,IAAI;IACjE,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,8BAA8B;IAC1E,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,gBAAgB,CAAC,CAAC,2CAA2C;IACpF,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;gGACgG;AAChG,MAAM,UAAU,mBAAmB,CAAC,MAAmB;IACrD,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAC3C,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,uEAAuE,CAAC;IAC/F,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC,QAAQ,KAAK,QAAQ;QAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;IACvF,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,UAAU,CAAC,OAAqB,EAAE;IAChD,aAAa,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,SAAS,EAAE,GAAG,IAAI,CAAC;IACtD,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACpD,OAAO;QACL,GAAG,KAAK;QACR,OAAO,EAAE,GAAG,EAAE;YACZ,KAAK,CAAC,OAAO,EAAE,CAAC;YAChB,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,CAAC;KACF,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fundamental-engine/vanilla",
3
- "version": "0.6.0",
3
+ "version": "0.8.0",
4
4
  "description": "Framework-free TypeScript wrapper for Fundamental — the reciprocal DOM-physics field as a typed FieldField class + mountField(), with no custom-element registration and no framework dependency.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -47,8 +47,8 @@
47
47
  "access": "public"
48
48
  },
49
49
  "dependencies": {
50
- "@fundamental-engine/platform": "0.6.0",
51
- "@fundamental-engine/core": "0.6.0"
50
+ "@fundamental-engine/dom": "0.8.0",
51
+ "@fundamental-engine/core": "0.8.0"
52
52
  },
53
53
  "devDependencies": {
54
54
  "typescript": "^5.9.3"