@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 +3 -3
- package/dist/create-field.d.ts +30 -0
- package/dist/create-field.d.ts.map +1 -0
- package/dist/create-field.js +30 -0
- package/dist/create-field.js.map +1 -0
- package/dist/field.d.ts +13 -7
- package/dist/field.d.ts.map +1 -1
- package/dist/field.js +22 -16
- package/dist/field.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -4
- package/dist/index.js.map +1 -1
- package/dist/mount.d.ts +3 -0
- package/dist/mount.d.ts.map +1 -1
- package/dist/mount.js +12 -1
- package/dist/mount.js.map +1 -1
- package/package.json +3 -3
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/
|
|
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/
|
|
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/
|
|
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
|
|
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
|
-
/**
|
|
53
|
-
|
|
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;
|
package/dist/field.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,
|
|
1
|
+
{"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../src/field.ts"],"names":[],"mappings":"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"}
|
package/dist/field.js
CHANGED
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
* ```
|
|
18
18
|
*/
|
|
19
19
|
import {} from '@fundamental-engine/core';
|
|
20
|
-
import {
|
|
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
|
-
|
|
33
|
-
|
|
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
|
-
/**
|
|
72
|
-
|
|
73
|
-
this.field.
|
|
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":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"field.js","sourceRoot":"","sources":["../src/field.ts"],"names":[],"mappings":"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"}
|
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 {
|
|
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';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
|
15
|
-
// `
|
|
16
|
-
// framework-free door stays a one-liner
|
|
17
|
-
|
|
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
|
|
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
|
package/dist/mount.d.ts.map
CHANGED
|
@@ -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/
|
|
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,
|
|
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.
|
|
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/
|
|
51
|
-
"@fundamental-engine/core": "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"
|