@fundamental-engine/dom 0.9.2 → 0.9.4

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 (51) hide show
  1. package/dist/apply-recipe.d.ts +14 -6
  2. package/dist/apply-recipe.d.ts.map +1 -1
  3. package/dist/apply-recipe.js +3 -1
  4. package/dist/apply-recipe.js.map +1 -1
  5. package/dist/browser-host.js.map +1 -1
  6. package/dist/container-host.d.ts +1 -1
  7. package/dist/container-host.d.ts.map +1 -1
  8. package/dist/container-host.js +16 -0
  9. package/dist/container-host.js.map +1 -1
  10. package/dist/dev-warn.d.ts +16 -0
  11. package/dist/dev-warn.d.ts.map +1 -0
  12. package/dist/dev-warn.js +53 -0
  13. package/dist/dev-warn.js.map +1 -0
  14. package/dist/feedback.d.ts +5 -0
  15. package/dist/feedback.d.ts.map +1 -1
  16. package/dist/feedback.js +22 -0
  17. package/dist/feedback.js.map +1 -1
  18. package/dist/governor.d.ts +6 -2
  19. package/dist/governor.d.ts.map +1 -1
  20. package/dist/governor.js +6 -2
  21. package/dist/governor.js.map +1 -1
  22. package/dist/lint.d.ts +30 -1
  23. package/dist/lint.d.ts.map +1 -1
  24. package/dist/lint.js +147 -0
  25. package/dist/lint.js.map +1 -1
  26. package/dist/measurement.d.ts +8 -1
  27. package/dist/measurement.d.ts.map +1 -1
  28. package/dist/measurement.js +15 -4
  29. package/dist/measurement.js.map +1 -1
  30. package/dist/relationships.d.ts.map +1 -1
  31. package/dist/relationships.js +5 -0
  32. package/dist/relationships.js.map +1 -1
  33. package/dist/state.d.ts +3 -0
  34. package/dist/state.d.ts.map +1 -1
  35. package/dist/state.js +6 -0
  36. package/dist/state.js.map +1 -1
  37. package/dist/visual-bindings.d.ts +0 -24
  38. package/dist/visual-bindings.d.ts.map +1 -1
  39. package/dist/visual-bindings.js +7 -2
  40. package/dist/visual-bindings.js.map +1 -1
  41. package/dist/worker/offthread-bridge.d.ts.map +1 -1
  42. package/dist/worker/offthread-bridge.js +31 -8
  43. package/dist/worker/offthread-bridge.js.map +1 -1
  44. package/dist/worker/render-worker.d.ts +3 -2
  45. package/dist/worker/render-worker.d.ts.map +1 -1
  46. package/dist/worker/render-worker.js +9 -3
  47. package/dist/worker/render-worker.js.map +1 -1
  48. package/dist/x-ray.d.ts.map +1 -1
  49. package/dist/x-ray.js +73 -13
  50. package/dist/x-ray.js.map +1 -1
  51. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"offthread-bridge.js","sourceRoot":"","sources":["../../src/worker/offthread-bridge.ts"],"names":[],"mappings":"AAUA,kEAAkE;AAClE,MAAM,eAAe,GAAG,CAAC,CAAC;AAO1B,MAAM,UAAU,qBAAqB,CACnC,KAAkB,EAClB,MAAyB,EACzB,OAAyB,EAAE;IAE3B,iCAAiC;IACjC,IAAI,OAAO,eAAe,KAAK,WAAW,IAAI,CAAC,MAAM,CAAC,0BAA0B,EAAE,CAAC;QACjF,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAClD,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,gBAAgB,IAAI,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,MAAM,CAAC,0BAA0B,EAAE,CAAC;IAEtD,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAC9C,EAAE,IAAI,EAAE,QAAQ,EAAE,CACnB,CAAC;IAEF,MAAM,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,SAAoC,CAAC,CAAC,CAAC;IAEhG,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,GAAG,GAAkB,IAAI,CAAC;IAE9B,2DAA2D;IAC3D,IAAI,GAAG,GAAG,IAAI,YAAY,CAAC,IAAI,GAAG,eAAe,CAAC,CAAC;IAEnD,SAAS,IAAI;QACX,GAAG,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,OAAO;YAAE,OAAO,CAAC,wCAAwC;QAE7D,MAAM,CAAC,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC;QAChC,IAAI,CAAC,GAAG,eAAe,GAAG,GAAG,CAAC,MAAM;YAAE,GAAG,GAAG,IAAI,YAAY,CAAC,CAAC,GAAG,eAAe,GAAG,CAAC,CAAC,CAAC;QACtF,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QAEzB,OAAO,GAAG,IAAI,CAAC;QACf,MAAM,CAAC,WAAW,CAAC;YACjB,IAAI,EAAE,OAAO;YACb,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC;YAC5C,KAAK,EAAE,CAAC;YACR,CAAC,EAAE,MAAM,CAAC,KAAK,GAAG,GAAG;YACrB,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,GAAG;YACtB,GAAG;YACH,MAAM,EAAE,MAAM,EAAE;SACjB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,IAAI,EAAE,CAAC;IAEP,OAAO;QACL,SAAS,EAAE,IAAI;QACf,QAAQ,EAAE,GAAG,EAAE;YACb,IAAI,GAAG,IAAI,IAAI;gBAAE,oBAAoB,CAAC,GAAG,CAAC,CAAC;YAC3C,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"offthread-bridge.js","sourceRoot":"","sources":["../../src/worker/offthread-bridge.ts"],"names":[],"mappings":"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"}
@@ -2,8 +2,9 @@
2
2
  * Off-main-thread render worker. Receives particle data each frame via postMessage,
3
3
  * draws to an OffscreenCanvas using the canvas2d API.
4
4
  * Protocol: main → worker: { type:'frame', particles: Float32Array, count: number,
5
- * W: number, H: number, dpr: number, frameN: number }
6
- * worker → main: { type:'done', frameN: number }
5
+ * W: number, H: number, dpr: number, frameN: number } — `particles.buffer` is transferred.
6
+ * worker → main: { type:'done', frameN: number, particles: Float32Array } — the particle buffer is
7
+ * transferred BACK so the main thread can recycle it (see offthread-bridge pool, #991).
7
8
  */
8
9
  export {};
9
10
  //# sourceMappingURL=render-worker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"render-worker.d.ts","sourceRoot":"","sources":["../../src/worker/render-worker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
1
+ {"version":3,"file":"render-worker.d.ts","sourceRoot":"","sources":["../../src/worker/render-worker.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -2,10 +2,15 @@
2
2
  * Off-main-thread render worker. Receives particle data each frame via postMessage,
3
3
  * draws to an OffscreenCanvas using the canvas2d API.
4
4
  * Protocol: main → worker: { type:'frame', particles: Float32Array, count: number,
5
- * W: number, H: number, dpr: number, frameN: number }
6
- * worker → main: { type:'done', frameN: number }
5
+ * W: number, H: number, dpr: number, frameN: number } — `particles.buffer` is transferred.
6
+ * worker → main: { type:'done', frameN: number, particles: Float32Array } — the particle buffer is
7
+ * transferred BACK so the main thread can recycle it (see offthread-bridge pool, #991).
7
8
  */
8
9
  let ctx = null;
10
+ // This module runs in a DedicatedWorkerGlobalScope, but the package tsconfig uses the DOM lib (not
11
+ // WebWorker), so `self` types as Window — whose postMessage overloads differ (targetOrigin first).
12
+ // Narrow to the worker shape for the transfer-list call below.
13
+ const workerScope = self;
9
14
  self.addEventListener('message', (e) => {
10
15
  const msg = e.data;
11
16
  if (msg.type === 'init') {
@@ -36,7 +41,8 @@ self.addEventListener('message', (e) => {
36
41
  ctx.fill();
37
42
  }
38
43
  ctx.restore();
39
- self.postMessage({ type: 'done', frameN });
44
+ // Transfer the particle buffer back to the main thread so it can be recycled (zero-copy pool).
45
+ workerScope.postMessage({ type: 'done', frameN, particles }, particles?.buffer ? [particles.buffer] : []);
40
46
  }
41
47
  });
42
48
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"render-worker.js","sourceRoot":"","sources":["../../src/worker/render-worker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,IAAI,GAAG,GAA6C,IAAI,CAAC;AAEzD,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAe,EAAE,EAAE;IACnD,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC;IACnB,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACxB,GAAG,GAAI,GAAG,CAAC,MAA0B,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACvD,OAAO;IACT,CAAC;IACD,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,GAAG,EAAE,CAAC;QAChC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;QAC5D,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;QACtC,GAAG,CAAC,IAAI,EAAE,CAAC;QACX,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACpB,iDAAiD;QACjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YACnB,MAAM,CAAC,GAAG,SAAS,CAAC,IAAI,CAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,SAAS,CAAC,IAAI,GAAG,CAAC,CAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,GAAG,CAAC,CAAE,CAAC;YAClC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,GAAG,CAAC,CAAE,CAAC;YAClC,MAAM,KAAK,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;YAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YACjC,GAAG,CAAC,SAAS,EAAE,CAAC;YAChB,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACtC,iDAAiD;YACjD,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC;YACtC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC;YACvC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC;YACtC,GAAG,CAAC,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;YAC3D,GAAG,CAAC,IAAI,EAAE,CAAC;QACb,CAAC;QACD,GAAG,CAAC,OAAO,EAAE,CAAC;QACd,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"render-worker.js","sourceRoot":"","sources":["../../src/worker/render-worker.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,IAAI,GAAG,GAA6C,IAAI,CAAC;AAEzD,mGAAmG;AACnG,mGAAmG;AACnG,+DAA+D;AAC/D,MAAM,WAAW,GAAG,IAEnB,CAAC;AAEF,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAe,EAAE,EAAE;IACnD,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC;IACnB,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACxB,GAAG,GAAI,GAAG,CAAC,MAA0B,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACvD,OAAO;IACT,CAAC;IACD,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,GAAG,EAAE,CAAC;QAChC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;QAC5D,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;QACtC,GAAG,CAAC,IAAI,EAAE,CAAC;QACX,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACpB,iDAAiD;QACjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YACnB,MAAM,CAAC,GAAG,SAAS,CAAC,IAAI,CAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,SAAS,CAAC,IAAI,GAAG,CAAC,CAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,GAAG,CAAC,CAAE,CAAC;YAClC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,GAAG,CAAC,CAAE,CAAC;YAClC,MAAM,KAAK,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;YAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YACjC,GAAG,CAAC,SAAS,EAAE,CAAC;YAChB,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACtC,iDAAiD;YACjD,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC;YACtC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC;YACvC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC;YACtC,GAAG,CAAC,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;YAC3D,GAAG,CAAC,IAAI,EAAE,CAAC;QACb,CAAC;QACD,GAAG,CAAC,OAAO,EAAE,CAAC;QACd,+FAA+F;QAC/F,WAAW,CAAC,WAAW,CACrB,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,EACnC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAC5C,CAAC;IACJ,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"x-ray.d.ts","sourceRoot":"","sources":["../src/x-ray.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D,MAAM,WAAW,WAAW;IAC1B,gDAAgD;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,QAAQ,CAAC,EAAE,UAAU,GAAG,WAAW,GAAG,aAAa,GAAG,cAAc,CAAC;CACtE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,GAAG,WAAW,EAAE,IAAI,GAAE,WAAgB,GAAG,MAAM,IAAI,CAiErH"}
1
+ {"version":3,"file":"x-ray.d.ts","sourceRoot":"","sources":["../src/x-ray.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D,MAAM,WAAW,WAAW;IAC1B,gDAAgD;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,QAAQ,CAAC,EAAE,UAAU,GAAG,WAAW,GAAG,aAAa,GAAG,cAAc,CAAC;CACtE;AAiBD,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,GAAG,WAAW,EAAE,IAAI,GAAE,WAAgB,GAAG,MAAM,IAAI,CAqHrH"}
package/dist/x-ray.js CHANGED
@@ -1,6 +1,21 @@
1
+ function forceProbe(field) {
2
+ const fn = field.sample;
3
+ return typeof fn === 'function' ? (x, y) => fn.call(field, x, y) : null;
4
+ }
5
+ function energyProbe(field) {
6
+ const fn = field.energy;
7
+ return typeof fn === 'function' ? () => fn.call(field) : null;
8
+ }
1
9
  export function mountXRay(field, container, opts = {}) {
2
10
  const hotkey = opts.hotkey ?? '?';
3
11
  const pos = opts.position ?? 'bottom-right';
12
+ // Mount against the container's OWN document, not the global `document` — the field may live in
13
+ // an iframe, a popup window, or a test DOM. `ownerDocument` is null only for a Document node itself,
14
+ // in which case the container IS the document.
15
+ const doc = container.ownerDocument ?? container;
16
+ const mountParent = doc.body ?? doc.documentElement;
17
+ const sample = forceProbe(field);
18
+ const energy = energyProbe(field);
4
19
  let panel = null;
5
20
  let rafId = null;
6
21
  let cursorX = 0;
@@ -9,30 +24,75 @@ export function mountXRay(field, container, opts = {}) {
9
24
  const [v, h] = pos.split('-');
10
25
  return `position:fixed;${v}:16px;${h}:16px;z-index:99999;`;
11
26
  }
27
+ /** A styled key/value line. Values are set via textContent, never innerHTML — a hotkey (or any
28
+ * numeric readout) can never be interpreted as markup. */
29
+ function row(label, value, valueColor) {
30
+ const div = doc.createElement('div');
31
+ div.append(doc.createTextNode(label));
32
+ if (value !== undefined) {
33
+ const b = doc.createElement('b');
34
+ if (valueColor)
35
+ b.style.color = valueColor;
36
+ b.textContent = value;
37
+ div.append(doc.createTextNode(' '), b);
38
+ }
39
+ return div;
40
+ }
12
41
  function tick() {
13
42
  if (!panel)
14
43
  return;
15
44
  const n = field.particleCount();
16
- const sample = field.sample?.(cursorX, cursorY);
17
- const energy = field.energy?.();
18
- panel.innerHTML = `
19
- <div style="font:11px/1.4 monospace;color:#e2e8f0;padding:12px 14px;min-width:220px">
20
- <div style="color:#a0c4ff;font-weight:700;margin-bottom:8px;letter-spacing:.04em">⊕ FIELD X-RAY</div>
21
- <div>particles <b style="color:#ffd166">${n}</b></div>
22
- ${energy ? `<div>kinetic <b style="color:#ffd166">${energy.kinetic.toFixed(3)}</b> thermal <b style="color:#ffd166">${energy.thermal.toFixed(3)}</b></div>` : ''}
23
- ${sample ? `<div>force @ cursor fx <b style="color:#06d6a0">${sample.x.toFixed(3)}</b> fy <b style="color:#06d6a0">${sample.y.toFixed(3)}</b></div>` : ''}
24
- <div style="margin-top:6px;color:#718096;font-size:10px">press ${hotkey} to close · move cursor for force probe</div>
25
- </div>
26
- `;
45
+ const e = energy?.();
46
+ const f = sample?.(cursorX, cursorY);
47
+ // Rebuild the body from scratch each frame via typed nodes — no innerHTML anywhere.
48
+ const inner = doc.createElement('div');
49
+ inner.style.cssText = 'font:11px/1.4 monospace;color:#e2e8f0;padding:12px 14px;min-width:220px';
50
+ const title = doc.createElement('div');
51
+ title.style.cssText = 'color:#a0c4ff;font-weight:700;margin-bottom:8px;letter-spacing:.04em';
52
+ title.textContent = '⊕ FIELD X-RAY';
53
+ inner.append(title);
54
+ inner.append(row('particles', String(n), '#ffd166'));
55
+ if (e) {
56
+ const line = doc.createElement('div');
57
+ line.append(doc.createTextNode('kinetic '));
58
+ const k = doc.createElement('b');
59
+ k.style.color = '#ffd166';
60
+ k.textContent = e.kinetic.toFixed(3);
61
+ line.append(k, doc.createTextNode(' thermal '));
62
+ const t = doc.createElement('b');
63
+ t.style.color = '#ffd166';
64
+ t.textContent = e.thermal.toFixed(3);
65
+ line.append(t);
66
+ inner.append(line);
67
+ }
68
+ if (f) {
69
+ const line = doc.createElement('div');
70
+ line.append(doc.createTextNode('force @ cursor fx '));
71
+ const fx = doc.createElement('b');
72
+ fx.style.color = '#06d6a0';
73
+ fx.textContent = f.x.toFixed(3);
74
+ line.append(fx, doc.createTextNode(' fy '));
75
+ const fy = doc.createElement('b');
76
+ fy.style.color = '#06d6a0';
77
+ fy.textContent = f.y.toFixed(3);
78
+ line.append(fy);
79
+ inner.append(line);
80
+ }
81
+ const hint = doc.createElement('div');
82
+ hint.style.cssText = 'margin-top:6px;color:#718096;font-size:10px';
83
+ // hotkey is interpolated as TEXT — an `<img onerror=…>` hotkey renders as literal characters.
84
+ hint.textContent = `press ${hotkey} to close · move cursor for force probe`;
85
+ inner.append(hint);
86
+ panel.replaceChildren(inner);
27
87
  rafId = requestAnimationFrame(tick);
28
88
  }
29
89
  function open() {
30
90
  if (panel)
31
91
  return;
32
- panel = document.createElement('div');
92
+ panel = doc.createElement('div');
33
93
  panel.setAttribute('data-field-xray', '');
34
94
  panel.style.cssText = positionStyle() + 'background:rgba(10,15,28,.88);border:1px solid rgba(160,196,255,.18);border-radius:10px;backdrop-filter:blur(12px);box-shadow:0 8px 32px rgba(0,0,0,.5);';
35
- document.body.appendChild(panel);
95
+ mountParent.appendChild(panel);
36
96
  tick();
37
97
  }
38
98
  function close() {
package/dist/x-ray.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"x-ray.js","sourceRoot":"","sources":["../src/x-ray.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"x-ray.js","sourceRoot":"","sources":["../src/x-ray.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fundamental-engine/dom",
3
- "version": "0.9.2",
3
+ "version": "0.9.4",
4
4
  "description": "The platform-adjacent layer for Fundamental — native-first registries for measurement, semantic state, feedback, relationships, visual-semantic bindings, and overlays. The browser primitives Fundamental wishes existed, built on the ones it has.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -46,7 +46,7 @@
46
46
  "access": "public"
47
47
  },
48
48
  "dependencies": {
49
- "@fundamental-engine/core": "0.9.2"
49
+ "@fundamental-engine/core": "0.9.4"
50
50
  },
51
51
  "devDependencies": {
52
52
  "typescript": "^5.9.3"