@flighthq/scene2d-dom 0.2.1-next.840.857425c
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/dist/domBackground.d.ts +3 -0
- package/dist/domBackground.d.ts.map +1 -0
- package/dist/domBackground.js +9 -0
- package/dist/domBackground.js.map +1 -0
- package/dist/domBitmap.d.ts +4 -0
- package/dist/domBitmap.d.ts.map +1 -0
- package/dist/domBitmap.js +81 -0
- package/dist/domBitmap.js.map +1 -0
- package/dist/domCSSFilterBinding.d.ts +19 -0
- package/dist/domCSSFilterBinding.d.ts.map +1 -0
- package/dist/domCSSFilterBinding.js +36 -0
- package/dist/domCSSFilterBinding.js.map +1 -0
- package/dist/domCache.d.ts +14 -0
- package/dist/domCache.d.ts.map +1 -0
- package/dist/domCache.js +64 -0
- package/dist/domCache.js.map +1 -0
- package/dist/domClip.d.ts +3 -0
- package/dist/domClip.d.ts.map +1 -0
- package/dist/domClip.js +38 -0
- package/dist/domClip.js.map +1 -0
- package/dist/domClipContours.d.ts +6 -0
- package/dist/domClipContours.d.ts.map +1 -0
- package/dist/domClipContours.js +48 -0
- package/dist/domClipContours.js.map +1 -0
- package/dist/domClipRectangle.d.ts +6 -0
- package/dist/domClipRectangle.d.ts.map +1 -0
- package/dist/domClipRectangle.js +148 -0
- package/dist/domClipRectangle.js.map +1 -0
- package/dist/domFontSource.d.ts +5 -0
- package/dist/domFontSource.d.ts.map +1 -0
- package/dist/domFontSource.js +18 -0
- package/dist/domFontSource.js.map +1 -0
- package/dist/domHtmlView.d.ts +4 -0
- package/dist/domHtmlView.d.ts.map +1 -0
- package/dist/domHtmlView.js +28 -0
- package/dist/domHtmlView.js.map +1 -0
- package/dist/domImageSource.d.ts +4 -0
- package/dist/domImageSource.d.ts.map +1 -0
- package/dist/domImageSource.js +36 -0
- package/dist/domImageSource.js.map +1 -0
- package/dist/domMaterials.d.ts +15 -0
- package/dist/domMaterials.d.ts.map +1 -0
- package/dist/domMaterials.js +68 -0
- package/dist/domMaterials.js.map +1 -0
- package/dist/domNativeText.d.ts +5 -0
- package/dist/domNativeText.d.ts.map +1 -0
- package/dist/domNativeText.js +88 -0
- package/dist/domNativeText.js.map +1 -0
- package/dist/domNode2D.d.ts +5 -0
- package/dist/domNode2D.d.ts.map +1 -0
- package/dist/domNode2D.js +60 -0
- package/dist/domNode2D.js.map +1 -0
- package/dist/domReconcile.d.ts +9 -0
- package/dist/domReconcile.d.ts.map +1 -0
- package/dist/domReconcile.js +69 -0
- package/dist/domReconcile.js.map +1 -0
- package/dist/domRenderState.d.ts +5 -0
- package/dist/domRenderState.d.ts.map +1 -0
- package/dist/domRenderState.js +43 -0
- package/dist/domRenderState.js.map +1 -0
- package/dist/domRenderView.d.ts +4 -0
- package/dist/domRenderView.d.ts.map +1 -0
- package/dist/domRenderView.js +24 -0
- package/dist/domRenderView.js.map +1 -0
- package/dist/domRichText.d.ts +6 -0
- package/dist/domRichText.d.ts.map +1 -0
- package/dist/domRichText.js +184 -0
- package/dist/domRichText.js.map +1 -0
- package/dist/domScale9Mapper.d.ts +3 -0
- package/dist/domScale9Mapper.d.ts.map +1 -0
- package/dist/domScale9Mapper.js +37 -0
- package/dist/domScale9Mapper.js.map +1 -0
- package/dist/domScale9Shape.d.ts +10 -0
- package/dist/domScale9Shape.d.ts.map +1 -0
- package/dist/domScale9Shape.js +59 -0
- package/dist/domScale9Shape.js.map +1 -0
- package/dist/domShape.d.ts +4 -0
- package/dist/domShape.d.ts.map +1 -0
- package/dist/domShape.js +45 -0
- package/dist/domShape.js.map +1 -0
- package/dist/domStyle.d.ts +9 -0
- package/dist/domStyle.d.ts.map +1 -0
- package/dist/domStyle.js +25 -0
- package/dist/domStyle.js.map +1 -0
- package/dist/domTextHelpers.d.ts +6 -0
- package/dist/domTextHelpers.d.ts.map +1 -0
- package/dist/domTextHelpers.js +8 -0
- package/dist/domTextHelpers.js.map +1 -0
- package/dist/domTextInput.d.ts +4 -0
- package/dist/domTextInput.d.ts.map +1 -0
- package/dist/domTextInput.js +60 -0
- package/dist/domTextInput.js.map +1 -0
- package/dist/domTextLabel.d.ts +4 -0
- package/dist/domTextLabel.d.ts.map +1 -0
- package/dist/domTextLabel.js +75 -0
- package/dist/domTextLabel.js.map +1 -0
- package/dist/domTransform.d.ts +4 -0
- package/dist/domTransform.d.ts.map +1 -0
- package/dist/domTransform.js +16 -0
- package/dist/domTransform.js.map +1 -0
- package/dist/domVideo.d.ts +4 -0
- package/dist/domVideo.d.ts.map +1 -0
- package/dist/domVideo.js +27 -0
- package/dist/domVideo.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/package.json +55 -0
- package/src/domBackground.test.ts +35 -0
- package/src/domBitmap.test.ts +117 -0
- package/src/domCSSFilterBinding.test.ts +62 -0
- package/src/domCache.test.ts +93 -0
- package/src/domClip.test.ts +12 -0
- package/src/domClipContours.test.ts +62 -0
- package/src/domClipRectangle.test.ts +81 -0
- package/src/domFontSource.test.ts +30 -0
- package/src/domHtmlView.test.ts +117 -0
- package/src/domImageSource.test.ts +47 -0
- package/src/domMaterials.test.ts +100 -0
- package/src/domNativeText.test.ts +102 -0
- package/src/domNode2D.test.ts +236 -0
- package/src/domReconcile.test.ts +158 -0
- package/src/domRenderState.test.ts +87 -0
- package/src/domRenderView.test.ts +69 -0
- package/src/domRichText.test.ts +169 -0
- package/src/domScale9Mapper.test.ts +20 -0
- package/src/domScale9Shape.test.ts +76 -0
- package/src/domShape.test.ts +85 -0
- package/src/domStyle.test.ts +130 -0
- package/src/domTextHelpers.test.ts +27 -0
- package/src/domTextInput.test.ts +61 -0
- package/src/domTextLabel.test.ts +92 -0
- package/src/domTransform.test.ts +68 -0
- package/src/domVideo.test.ts +30 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { noopRendererData } from '@flighthq/render';
|
|
2
|
+
import { setDomRendererElement } from './domStyle';
|
|
3
|
+
import { setDomTransform } from './domTransform';
|
|
4
|
+
export function drawDomHtmlView(state, renderProxy) {
|
|
5
|
+
const source = renderProxy.source;
|
|
6
|
+
const data = source.data;
|
|
7
|
+
const element = data.element;
|
|
8
|
+
if (element === null)
|
|
9
|
+
return;
|
|
10
|
+
if (element.style.position !== 'absolute') {
|
|
11
|
+
element.style.left = '0';
|
|
12
|
+
element.style.overflow = 'hidden';
|
|
13
|
+
element.style.position = 'absolute';
|
|
14
|
+
element.style.top = '0';
|
|
15
|
+
element.style.transformOrigin = '0 0';
|
|
16
|
+
}
|
|
17
|
+
element.style.width = `${data.width}px`;
|
|
18
|
+
element.style.height = `${data.height}px`;
|
|
19
|
+
setDomTransform(element, renderProxy.transform2D, state.roundPixels);
|
|
20
|
+
element.style.opacity = renderProxy.alpha < 1 ? String(renderProxy.alpha) : '';
|
|
21
|
+
state.applyBlendMode?.(element, renderProxy.blendMode);
|
|
22
|
+
setDomRendererElement(state, element);
|
|
23
|
+
}
|
|
24
|
+
export const defaultHtmlViewRenderer = {
|
|
25
|
+
createData: noopRendererData,
|
|
26
|
+
submit: drawDomHtmlView,
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=domHtmlView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domHtmlView.js","sourceRoot":"","sources":["../src/domHtmlView.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,UAAU,eAAe,CAAC,KAAqB,EAAE,WAA0B;IAC/E,MAAM,MAAM,GAAG,WAAW,CAAC,MAAkB,CAAC;IAC9C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAC7B,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO;IAE7B,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC1C,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;QACpC,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC;IACxC,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC;IACxC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC;IAC1C,eAAe,CAAC,OAAO,EAAE,WAAW,CAAC,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;IACrE,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/E,KAAK,CAAC,cAAc,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IAEvD,qBAAqB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAoB;IACtD,UAAU,EAAE,gBAAgB;IAC5B,MAAM,EAAE,eAAe;CACxB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { DomImageSourceKind, DomRenderState, ImageResource } from '@flighthq/types';
|
|
2
|
+
export declare function explainDomImageSource(image: Readonly<ImageResource>): DomImageSourceKind;
|
|
3
|
+
export declare function resolveDomImageSource(state: DomRenderState, image: Readonly<ImageResource>): CanvasImageSource | null;
|
|
4
|
+
//# sourceMappingURL=domImageSource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domImageSource.d.ts","sourceRoot":"","sources":["../src/domImageSource.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAKzF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,kBAAkB,CAIxF;AAQD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,iBAAiB,GAAG,IAAI,CAkBrH"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { createCanvasFromImageResource } from '@flighthq/image';
|
|
2
|
+
import { getDomRenderStateRuntime } from './domRenderState';
|
|
3
|
+
// Reports how a resource resolves on the DOM backend without materializing anything.
|
|
4
|
+
export function explainDomImageSource(image) {
|
|
5
|
+
if (image.source !== null)
|
|
6
|
+
return 'element';
|
|
7
|
+
if (image.data !== null)
|
|
8
|
+
return 'data';
|
|
9
|
+
return 'none';
|
|
10
|
+
}
|
|
11
|
+
// Resolves a (possibly data-only) ImageResource to a CanvasImageSource the DOM bitmap path can draw
|
|
12
|
+
// into its per-node canvas. An element-backed resource returns its host `source` directly; a data-only
|
|
13
|
+
// Surface materializes an HTMLCanvasElement from its pixels and caches it per render state, rebuilding
|
|
14
|
+
// only on a `version` bump. The DOM twin of resolveCanvasImageSource — same renderer-owned,
|
|
15
|
+
// version-keyed derived cache, never written back onto the shared resource. Returns null when the
|
|
16
|
+
// resource has neither pixel form.
|
|
17
|
+
export function resolveDomImageSource(state, image) {
|
|
18
|
+
if (image.source !== null)
|
|
19
|
+
return image.source;
|
|
20
|
+
if (image.data === null)
|
|
21
|
+
return null;
|
|
22
|
+
const runtime = getDomRenderStateRuntime(state);
|
|
23
|
+
let cache = runtime.imageResourceElementCache;
|
|
24
|
+
if (cache === undefined) {
|
|
25
|
+
cache = new WeakMap();
|
|
26
|
+
runtime.imageResourceElementCache = cache;
|
|
27
|
+
}
|
|
28
|
+
let entry = cache.get(image);
|
|
29
|
+
if (entry === undefined || entry.version !== image.version) {
|
|
30
|
+
// data is non-null here, so the transcode never returns null.
|
|
31
|
+
entry = { element: createCanvasFromImageResource(image), version: image.version };
|
|
32
|
+
cache.set(image, entry);
|
|
33
|
+
}
|
|
34
|
+
return entry.element;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=domImageSource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domImageSource.js","sourceRoot":"","sources":["../src/domImageSource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,iBAAiB,CAAC;AAGhE,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,qFAAqF;AACrF,MAAM,UAAU,qBAAqB,CAAC,KAA8B;IAClE,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5C,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IACvC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,oGAAoG;AACpG,uGAAuG;AACvG,uGAAuG;AACvG,4FAA4F;AAC5F,kGAAkG;AAClG,mCAAmC;AACnC,MAAM,UAAU,qBAAqB,CAAC,KAAqB,EAAE,KAA8B;IACzF,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC;IAC/C,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAErC,MAAM,OAAO,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAChD,IAAI,KAAK,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAC9C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,KAAK,GAAG,IAAI,OAAO,EAAE,CAAC;QACtB,OAAO,CAAC,yBAAyB,GAAG,KAAK,CAAC;IAC5C,CAAC;IAED,IAAI,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;QAC3D,8DAA8D;QAC9D,KAAK,GAAG,EAAE,OAAO,EAAE,6BAA6B,CAAC,KAAK,CAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QACnF,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { DomBlendModeFidelity, DomRenderState } from '@flighthq/types';
|
|
2
|
+
import { BlendMode } from '@flighthq/types';
|
|
3
|
+
export declare function applyDomBlendMode(element: HTMLElement, value: BlendMode | null): void;
|
|
4
|
+
export declare function enableDomBlendModeSupport(state: DomRenderState): void;
|
|
5
|
+
/**
|
|
6
|
+
* Returns the fidelity of the DOM backend's realization of the given blend mode via CSS
|
|
7
|
+
* mix-blend-mode. Use this to detect lossy or unsupported modes before committing to a DOM
|
|
8
|
+
* render path for blend-sensitive content.
|
|
9
|
+
*
|
|
10
|
+
* - 'exact' — CSS result is perceptually identical to the OpenFL/Flash mode.
|
|
11
|
+
* - 'approximate' — closest CSS mode is used; may differ for extreme or mid-range colors.
|
|
12
|
+
* - 'unsupported' — no CSS equivalent; the DOM backend renders as BlendMode.Normal.
|
|
13
|
+
*/
|
|
14
|
+
export declare function getDomBlendModeFidelity(blendMode: BlendMode): DomBlendModeFidelity;
|
|
15
|
+
//# sourceMappingURL=domMaterials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domMaterials.d.ts","sourceRoot":"","sources":["../src/domMaterials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAAqB,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAoD/D,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI,CAErF;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAErE;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,SAAS,GAAG,oBAAoB,CAElF"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { AdvancedBlendMode, BlendMode } from '@flighthq/types';
|
|
2
|
+
// Auditable map from a blend-mode intent to the CSS mix-blend-mode value that realizes
|
|
3
|
+
// it. `null` means there is no faithful CSS equivalent, so the mode degrades to normal
|
|
4
|
+
// compositing (the empty string, i.e. mix-blend-mode: normal). Like Canvas2D, DOM natively realizes the
|
|
5
|
+
// AdvancedBlendMode set (CSS mix-blend-mode covers the full W3C set), so those keys are carried here too;
|
|
6
|
+
// only the fixed-function BlendMode set is exposed as a node property.
|
|
7
|
+
const DOM_BLEND_MODE = {
|
|
8
|
+
[BlendMode.Add]: 'screen',
|
|
9
|
+
[BlendMode.Darken]: 'darken',
|
|
10
|
+
[BlendMode.Lighten]: 'lighten',
|
|
11
|
+
[BlendMode.Multiply]: 'multiply',
|
|
12
|
+
[BlendMode.Normal]: '',
|
|
13
|
+
[BlendMode.Screen]: 'screen',
|
|
14
|
+
[AdvancedBlendMode.Color]: 'color',
|
|
15
|
+
[AdvancedBlendMode.ColorBurn]: 'color-burn',
|
|
16
|
+
[AdvancedBlendMode.ColorDodge]: 'color-dodge',
|
|
17
|
+
[AdvancedBlendMode.Difference]: 'difference',
|
|
18
|
+
[AdvancedBlendMode.Exclusion]: 'exclusion',
|
|
19
|
+
[AdvancedBlendMode.HardLight]: 'hard-light',
|
|
20
|
+
[AdvancedBlendMode.Hue]: 'hue',
|
|
21
|
+
[AdvancedBlendMode.Luminosity]: 'luminosity',
|
|
22
|
+
[AdvancedBlendMode.Overlay]: 'overlay',
|
|
23
|
+
[AdvancedBlendMode.Saturation]: 'saturation',
|
|
24
|
+
[AdvancedBlendMode.SoftLight]: 'soft-light',
|
|
25
|
+
};
|
|
26
|
+
// Fidelity classification for each blend mode in the DOM backend.
|
|
27
|
+
// 'exact' — CSS mix-blend-mode maps faithfully to the OpenFL/Flash mode.
|
|
28
|
+
// 'approximate' — the closest CSS mode is used; results differ in edge cases
|
|
29
|
+
// (e.g. Add → screen: similar luminosity behavior but not additive-clipped-to-1).
|
|
30
|
+
// 'unsupported' — no CSS equivalent; falls back to normal compositing.
|
|
31
|
+
const DOM_BLEND_MODE_FIDELITY = {
|
|
32
|
+
[BlendMode.Add]: 'approximate', // screen ≈ add for moderate values; clamps differently
|
|
33
|
+
[BlendMode.Darken]: 'exact',
|
|
34
|
+
[BlendMode.Lighten]: 'exact',
|
|
35
|
+
[BlendMode.Multiply]: 'exact',
|
|
36
|
+
[BlendMode.Normal]: 'exact',
|
|
37
|
+
[BlendMode.Screen]: 'exact',
|
|
38
|
+
[AdvancedBlendMode.Color]: 'exact',
|
|
39
|
+
[AdvancedBlendMode.ColorBurn]: 'exact',
|
|
40
|
+
[AdvancedBlendMode.ColorDodge]: 'exact',
|
|
41
|
+
[AdvancedBlendMode.Difference]: 'exact',
|
|
42
|
+
[AdvancedBlendMode.Exclusion]: 'exact',
|
|
43
|
+
[AdvancedBlendMode.HardLight]: 'exact',
|
|
44
|
+
[AdvancedBlendMode.Hue]: 'exact',
|
|
45
|
+
[AdvancedBlendMode.Luminosity]: 'exact',
|
|
46
|
+
[AdvancedBlendMode.Overlay]: 'exact',
|
|
47
|
+
[AdvancedBlendMode.Saturation]: 'exact',
|
|
48
|
+
[AdvancedBlendMode.SoftLight]: 'exact',
|
|
49
|
+
};
|
|
50
|
+
export function applyDomBlendMode(element, value) {
|
|
51
|
+
element.style.mixBlendMode = (value !== null ? DOM_BLEND_MODE[value] : null) ?? '';
|
|
52
|
+
}
|
|
53
|
+
export function enableDomBlendModeSupport(state) {
|
|
54
|
+
state.applyBlendMode = applyDomBlendMode;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Returns the fidelity of the DOM backend's realization of the given blend mode via CSS
|
|
58
|
+
* mix-blend-mode. Use this to detect lossy or unsupported modes before committing to a DOM
|
|
59
|
+
* render path for blend-sensitive content.
|
|
60
|
+
*
|
|
61
|
+
* - 'exact' — CSS result is perceptually identical to the OpenFL/Flash mode.
|
|
62
|
+
* - 'approximate' — closest CSS mode is used; may differ for extreme or mid-range colors.
|
|
63
|
+
* - 'unsupported' — no CSS equivalent; the DOM backend renders as BlendMode.Normal.
|
|
64
|
+
*/
|
|
65
|
+
export function getDomBlendModeFidelity(blendMode) {
|
|
66
|
+
return DOM_BLEND_MODE_FIDELITY[blendMode];
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=domMaterials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domMaterials.js","sourceRoot":"","sources":["../src/domMaterials.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE/D,uFAAuF;AACvF,uFAAuF;AACvF,wGAAwG;AACxG,0GAA0G;AAC1G,uEAAuE;AACvE,MAAM,cAAc,GAAqC;IACvD,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,QAAQ;IACzB,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ;IAC5B,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,SAAS;IAC9B,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,UAAU;IAChC,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE;IACtB,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ;IAC5B,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,OAAO;IAClC,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,YAAY;IAC3C,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,aAAa;IAC7C,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,YAAY;IAC5C,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,WAAW;IAC1C,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,YAAY;IAC3C,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,KAAK;IAC9B,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,YAAY;IAC5C,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,SAAS;IACtC,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,YAAY;IAC5C,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,YAAY;CAC5C,CAAC;AAEF,kEAAkE;AAClE,+EAA+E;AAC/E,6EAA6E;AAC7E,kGAAkG;AAClG,uEAAuE;AACvE,MAAM,uBAAuB,GAA4C;IACvE,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,aAAa,EAAE,uDAAuD;IACvF,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,OAAO;IAC3B,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,OAAO;IAC5B,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,OAAO;IAC7B,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,OAAO;IAC3B,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,OAAO;IAC3B,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,OAAO;IAClC,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,OAAO;IACtC,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,OAAO;IACvC,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,OAAO;IACvC,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,OAAO;IACtC,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,OAAO;IACtC,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,OAAO;IAChC,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,OAAO;IACvC,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,OAAO;IACpC,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,OAAO;IACvC,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,OAAO;CACvC,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,OAAoB,EAAE,KAAuB;IAC7E,OAAO,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAAqB;IAC7D,KAAK,CAAC,cAAc,GAAG,iBAAiB,CAAC;AAC3C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,uBAAuB,CAAC,SAAoB;IAC1D,OAAO,uBAAuB,CAAC,SAAS,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Scene2DRenderer, DomRenderState, RenderProxy2D } from '@flighthq/types';
|
|
2
|
+
export declare function drawDomNativeText(state: DomRenderState, renderProxy: RenderProxy2D): void;
|
|
3
|
+
export declare function drawDomNativeTextMask(state: DomRenderState, renderProxy: RenderProxy2D): void;
|
|
4
|
+
export declare const defaultDomNativeTextRenderer: Scene2DRenderer;
|
|
5
|
+
//# sourceMappingURL=domNativeText.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domNativeText.d.ts","sourceRoot":"","sources":["../src/domNativeText.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EAMd,aAAa,EAGd,MAAM,iBAAiB,CAAC;AAczB,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,GAAG,IAAI,CA8CzF;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,GAAG,IAAI,CAE7F;AAED,eAAO,MAAM,4BAA4B,EAAE,eAG1C,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { computeRgbHexString } from '@flighthq/color';
|
|
2
|
+
import { getNativeTextRuntime } from '@flighthq/text';
|
|
3
|
+
import { applyDomStyle, prepareDomElement, setDomRendererElement } from './domStyle';
|
|
4
|
+
// DOM is the backend for which a native text element makes sense; other backends either no-op or
|
|
5
|
+
// composite this element over their canvas (decide later). Register app-side with
|
|
6
|
+
// registerRenderer(state, NativeTextKind, defaultDomNativeTextRenderer).
|
|
7
|
+
// createData returns null: the backing element is held on the runtime (a renderer-owned slot), not on
|
|
8
|
+
// per-node RendererData, because the measured size must be visible to scene2d's DOM-free bounds.
|
|
9
|
+
function createDomNativeTextData(_state, _source) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
export function drawDomNativeText(state, renderProxy) {
|
|
13
|
+
const source = renderProxy.source;
|
|
14
|
+
// Cast away the read-only view to write the renderer-owned slots (element + measured size), the same
|
|
15
|
+
// mutable-runtime cast domTextLabel uses for its layout cache.
|
|
16
|
+
const runtime = getNativeTextRuntime(source);
|
|
17
|
+
const data = source.data;
|
|
18
|
+
let element = runtime.element;
|
|
19
|
+
if (element === null) {
|
|
20
|
+
element = document.createElement('div');
|
|
21
|
+
prepareDomElement(element);
|
|
22
|
+
runtime.element = element;
|
|
23
|
+
}
|
|
24
|
+
applyNativeTextStyle(element, data.style);
|
|
25
|
+
if (data.autoSize === 'none') {
|
|
26
|
+
// A fixed-height box frames the text; a column flexbox positions the block vertically within the
|
|
27
|
+
// leftover height (justify-content), leaving textAlign to handle the horizontal axis. Cross-axis
|
|
28
|
+
// stretch is the flexbox default, so the text item keeps the full width and textAlign still applies.
|
|
29
|
+
element.style.whiteSpace = 'normal';
|
|
30
|
+
element.style.width = `${data.width}px`;
|
|
31
|
+
element.style.height = `${data.height}px`;
|
|
32
|
+
element.style.overflow = 'hidden';
|
|
33
|
+
element.style.display = 'flex';
|
|
34
|
+
element.style.flexDirection = 'column';
|
|
35
|
+
element.style.justifyContent = _verticalAlignToJustifyContent(data.verticalAlign);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
// The box hugs the content, so there is no slack to align within — drop the flexbox framing.
|
|
39
|
+
element.style.whiteSpace = 'nowrap';
|
|
40
|
+
element.style.width = '';
|
|
41
|
+
element.style.height = '';
|
|
42
|
+
element.style.overflow = '';
|
|
43
|
+
element.style.display = '';
|
|
44
|
+
element.style.flexDirection = '';
|
|
45
|
+
element.style.justifyContent = '';
|
|
46
|
+
}
|
|
47
|
+
element.textContent = data.text;
|
|
48
|
+
// Write the platform measurement back so DOM-free bounds (computeNativeTextLocalBoundsRectangle) can
|
|
49
|
+
// read it without the DOM. Under autoSize the field box tracks the element's measured size.
|
|
50
|
+
const rect = element.getBoundingClientRect();
|
|
51
|
+
runtime.measuredWidth = rect.width;
|
|
52
|
+
runtime.measuredHeight = rect.height;
|
|
53
|
+
applyDomStyle(state, element, renderProxy);
|
|
54
|
+
setDomRendererElement(state, element);
|
|
55
|
+
}
|
|
56
|
+
export function drawDomNativeTextMask(state, renderProxy) {
|
|
57
|
+
drawDomNativeText(state, renderProxy);
|
|
58
|
+
}
|
|
59
|
+
export const defaultDomNativeTextRenderer = {
|
|
60
|
+
createData: createDomNativeTextData,
|
|
61
|
+
submit: drawDomNativeText,
|
|
62
|
+
};
|
|
63
|
+
// Maps the field's vertical alignment onto the column flexbox's main-axis distribution. 'top' is the
|
|
64
|
+
// CSS default (flex-start); 'baseline'/'justify' are reserved TextVerticalAlign values with no faithful
|
|
65
|
+
// CSS block-frame mapping yet, so they fall back to the top of the box.
|
|
66
|
+
function _verticalAlignToJustifyContent(verticalAlign) {
|
|
67
|
+
switch (verticalAlign) {
|
|
68
|
+
case 'bottom':
|
|
69
|
+
return 'flex-end';
|
|
70
|
+
case 'middle':
|
|
71
|
+
return 'center';
|
|
72
|
+
default:
|
|
73
|
+
return 'flex-start';
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function applyNativeTextStyle(element, style) {
|
|
77
|
+
const size = style.size ?? 12;
|
|
78
|
+
const family = style.font ?? 'sans-serif';
|
|
79
|
+
const weight = style.bold ? 'bold ' : '';
|
|
80
|
+
const slant = style.italic ? 'italic ' : '';
|
|
81
|
+
element.style.font = `${slant}${weight}${size}px ${family}`;
|
|
82
|
+
element.style.color = computeRgbHexString(style.color ?? 0);
|
|
83
|
+
if (style.align !== undefined)
|
|
84
|
+
element.style.textAlign = style.align;
|
|
85
|
+
if (style.leading !== undefined)
|
|
86
|
+
element.style.lineHeight = `${size + style.leading}px`;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=domNativeText.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domNativeText.js","sourceRoot":"","sources":["../src/domNativeText.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Node2D, Scene2DRenderer, DomRenderState, RenderProxy2D } from '@flighthq/types';
|
|
2
|
+
export declare function drawDomScene2D(_state: DomRenderState, _renderProxy: RenderProxy2D): void;
|
|
3
|
+
export declare const defaultDomScene2DRenderer: Scene2DRenderer;
|
|
4
|
+
export declare function renderDomScene2D(state: DomRenderState, source: Node2D): void;
|
|
5
|
+
//# sourceMappingURL=domNode2D.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domNode2D.d.ts","sourceRoot":"","sources":["../src/domNode2D.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAS9F,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,GAAG,IAAI,CAExF;AAED,eAAO,MAAM,yBAAyB,EAAE,eAGvC,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAiD5E"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { getRenderProxy2D, isRenderProxyVisible, noopRendererData } from '@flighthq/render';
|
|
2
|
+
import { getNode2DRuntime } from '@flighthq/scene2d';
|
|
3
|
+
import { hasDomStructureChanged, processDomNode, reconcileDomContainer, swapDomOrderLists } from './domReconcile';
|
|
4
|
+
import { getDomRenderStateRuntime } from './domRenderState';
|
|
5
|
+
// Plain display objects (containers, stages) have no visual geometry of their own.
|
|
6
|
+
// Registering this renderer for DisplayObjectKind ensures cross-backend symmetry with
|
|
7
|
+
// defaultCanvasScene2DRenderer and allows the DOM traversal to correctly process
|
|
8
|
+
// display-object containers when their kind is registered.
|
|
9
|
+
export function drawDomScene2D(_state, _renderProxy) {
|
|
10
|
+
// No-op: containers are rendered implicitly by the traversal in renderDomScene2D.
|
|
11
|
+
}
|
|
12
|
+
export const defaultDomScene2DRenderer = {
|
|
13
|
+
createData: noopRendererData,
|
|
14
|
+
submit: drawDomScene2D,
|
|
15
|
+
};
|
|
16
|
+
export function renderDomScene2D(state, source) {
|
|
17
|
+
const runtime = getDomRenderStateRuntime(state);
|
|
18
|
+
const container = state.element;
|
|
19
|
+
const clipHooks = state.displayObjectClipHooks;
|
|
20
|
+
const applyClip = runtime.domClipHooks;
|
|
21
|
+
const frameId = runtime.currentFrameId;
|
|
22
|
+
const tempStack = runtime.tempStack;
|
|
23
|
+
let stackLength = 1;
|
|
24
|
+
tempStack[0] = source;
|
|
25
|
+
let newLength = 0;
|
|
26
|
+
let needsReconcile = false;
|
|
27
|
+
while (stackLength > 0) {
|
|
28
|
+
const current = tempStack[--stackLength];
|
|
29
|
+
if (!current.enabled)
|
|
30
|
+
continue;
|
|
31
|
+
const data = getRenderProxy2D(state, current);
|
|
32
|
+
if (data === undefined)
|
|
33
|
+
continue;
|
|
34
|
+
clipHooks?.popClip(state, data, current);
|
|
35
|
+
if (!isRenderProxyVisible(data))
|
|
36
|
+
continue;
|
|
37
|
+
clipHooks?.pushClip(state, data, current);
|
|
38
|
+
if (data.renderer !== null) {
|
|
39
|
+
const result = processDomNode(runtime, data, frameId, () => data.renderer.submit(state, data), newLength);
|
|
40
|
+
newLength = result.newLength;
|
|
41
|
+
if (result.needsReconcile)
|
|
42
|
+
needsReconcile = true;
|
|
43
|
+
applyClip?.apply(state, data);
|
|
44
|
+
}
|
|
45
|
+
if (data.traverseChildren) {
|
|
46
|
+
const children = getNode2DRuntime(current).children;
|
|
47
|
+
if (children !== null) {
|
|
48
|
+
for (let i = children.length - 1; i >= 0; i--) {
|
|
49
|
+
tempStack[stackLength++] = children[i];
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
clipHooks?.finalize(state);
|
|
55
|
+
if (hasDomStructureChanged(runtime, newLength, needsReconcile)) {
|
|
56
|
+
reconcileDomContainer(container, runtime, newLength);
|
|
57
|
+
}
|
|
58
|
+
swapDomOrderLists(runtime, newLength);
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=domNode2D.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domNode2D.js","sourceRoot":"","sources":["../src/domNode2D.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { DomRenderStateRuntime, RenderProxy2D } from '@flighthq/types';
|
|
2
|
+
export declare function hasDomStructureChanged(runtime: DomRenderStateRuntime, newLength: number, needsReconcile: boolean): boolean;
|
|
3
|
+
export declare function processDomNode(runtime: DomRenderStateRuntime, data: RenderProxy2D, currentFrameId: number, drawFn: () => void, newLength: number, forceDraw?: boolean): {
|
|
4
|
+
newLength: number;
|
|
5
|
+
needsReconcile: boolean;
|
|
6
|
+
};
|
|
7
|
+
export declare function reconcileDomContainer(container: HTMLElement, runtime: DomRenderStateRuntime, newLength: number): void;
|
|
8
|
+
export declare function swapDomOrderLists(runtime: DomRenderStateRuntime, newLength: number): void;
|
|
9
|
+
//# sourceMappingURL=domReconcile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domReconcile.d.ts","sourceRoot":"","sources":["../src/domReconcile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAE5E,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,qBAAqB,EAC9B,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,OAAO,GACtB,OAAO,CAOT;AAED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,qBAAqB,EAC9B,IAAI,EAAE,aAAa,EACnB,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,MAAM,IAAI,EAClB,SAAS,EAAE,MAAM,EACjB,SAAS,UAAQ,GAChB;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,OAAO,CAAA;CAAE,CA0BhD;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAuBrH;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAKzF"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
export function hasDomStructureChanged(runtime, newLength, needsReconcile) {
|
|
2
|
+
if (needsReconcile)
|
|
3
|
+
return true;
|
|
4
|
+
if (newLength !== runtime.domOrderLength)
|
|
5
|
+
return true;
|
|
6
|
+
for (let i = 0; i < newLength; i++) {
|
|
7
|
+
if (runtime.domNextOrderList[i] !== runtime.domOrderList[i])
|
|
8
|
+
return true;
|
|
9
|
+
}
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
export function processDomNode(runtime, data, currentFrameId, drawFn, newLength, forceDraw = false) {
|
|
13
|
+
const isNew = !runtime.domElementMap.has(data);
|
|
14
|
+
const appearanceDirty = data.appearanceFrameId === currentFrameId;
|
|
15
|
+
const transformDirty = data.transformFrameId === currentFrameId;
|
|
16
|
+
let needsReconcile = false;
|
|
17
|
+
if (isNew || appearanceDirty || transformDirty || forceDraw) {
|
|
18
|
+
const prevElement = isNew ? undefined : runtime.domElementMap.get(data);
|
|
19
|
+
runtime.domCurrentElement = null;
|
|
20
|
+
drawFn();
|
|
21
|
+
const newElement = runtime.domCurrentElement;
|
|
22
|
+
if (newElement !== null) {
|
|
23
|
+
runtime.domElementMap.set(data, newElement);
|
|
24
|
+
if (newElement !== prevElement)
|
|
25
|
+
needsReconcile = true;
|
|
26
|
+
}
|
|
27
|
+
else if (prevElement !== undefined) {
|
|
28
|
+
runtime.domElementMap.delete(data);
|
|
29
|
+
needsReconcile = true;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (newLength >= runtime.domNextOrderList.length) {
|
|
33
|
+
runtime.domNextOrderList.length = newLength + 16;
|
|
34
|
+
}
|
|
35
|
+
runtime.domNextOrderList[newLength] = data;
|
|
36
|
+
return { newLength: newLength + 1, needsReconcile };
|
|
37
|
+
}
|
|
38
|
+
export function reconcileDomContainer(container, runtime, newLength) {
|
|
39
|
+
const keepSet = new Set();
|
|
40
|
+
for (let i = 0; i < newLength; i++) {
|
|
41
|
+
const el = runtime.domElementMap.get(runtime.domNextOrderList[i]);
|
|
42
|
+
if (el !== undefined)
|
|
43
|
+
keepSet.add(el);
|
|
44
|
+
}
|
|
45
|
+
let child = container.firstChild;
|
|
46
|
+
while (child !== null) {
|
|
47
|
+
const next = child.nextSibling;
|
|
48
|
+
if (!keepSet.has(child))
|
|
49
|
+
container.removeChild(child);
|
|
50
|
+
child = next;
|
|
51
|
+
}
|
|
52
|
+
let nextSibling = null;
|
|
53
|
+
for (let i = newLength - 1; i >= 0; i--) {
|
|
54
|
+
const el = runtime.domElementMap.get(runtime.domNextOrderList[i]);
|
|
55
|
+
if (el === undefined)
|
|
56
|
+
continue;
|
|
57
|
+
if (el.nextSibling !== nextSibling || el.parentNode !== container) {
|
|
58
|
+
container.insertBefore(el, nextSibling);
|
|
59
|
+
}
|
|
60
|
+
nextSibling = el;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export function swapDomOrderLists(runtime, newLength) {
|
|
64
|
+
const prevList = runtime.domOrderList;
|
|
65
|
+
runtime.domOrderList = runtime.domNextOrderList;
|
|
66
|
+
runtime.domOrderLength = newLength;
|
|
67
|
+
runtime.domNextOrderList = prevList;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=domReconcile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domReconcile.js","sourceRoot":"","sources":["../src/domReconcile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { DomRenderOptions, DomRenderState, DomRenderStateRuntime } from '@flighthq/types';
|
|
2
|
+
export declare function createDomRenderState(element: HTMLElement, options?: Partial<DomRenderOptions>): DomRenderState;
|
|
3
|
+
export declare function createDomRenderStateRuntime(): DomRenderStateRuntime;
|
|
4
|
+
export declare function getDomRenderStateRuntime(state: DomRenderState): DomRenderStateRuntime;
|
|
5
|
+
//# sourceMappingURL=domRenderState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domRenderState.d.ts","sourceRoot":"","sources":["../src/domRenderState.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAG/F,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,GAAE,OAAO,CAAC,gBAAgB,CAAM,GAAG,cAAc,CA8BlH;AAMD,wBAAgB,2BAA2B,IAAI,qBAAqB,CAEnE;AAID,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,cAAc,GAAG,qBAAqB,CAErF"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { createMatrix } from '@flighthq/geometry';
|
|
2
|
+
import { createRenderState as _createRenderState, createRenderStateRuntime, setRenderStateBackgroundColor, } from '@flighthq/render';
|
|
3
|
+
import { EntityRuntimeKey } from '@flighthq/types';
|
|
4
|
+
export function createDomRenderState(element, options = {}) {
|
|
5
|
+
const state = _createRenderState({
|
|
6
|
+
pixelRatio: options.pixelRatio ?? 1,
|
|
7
|
+
renderTransform2D: createMatrix(),
|
|
8
|
+
roundPixels: options.roundPixels ?? false,
|
|
9
|
+
sceneGraphSyncPolicy: options.sceneGraphSyncPolicy,
|
|
10
|
+
});
|
|
11
|
+
if (options.backgroundColor != null)
|
|
12
|
+
setRenderStateBackgroundColor(state, options.backgroundColor);
|
|
13
|
+
state.applyBlendMode = null;
|
|
14
|
+
state.domCssFilterResolver = null;
|
|
15
|
+
state.element = element;
|
|
16
|
+
state.allowSmoothing = options.imageSmoothingEnabled ?? true;
|
|
17
|
+
const runtime = createDomRenderStateRuntime();
|
|
18
|
+
state[EntityRuntimeKey] = runtime;
|
|
19
|
+
runtime.currentBlendMode = null;
|
|
20
|
+
runtime.domClipHooks = null;
|
|
21
|
+
runtime.domClipStack = [];
|
|
22
|
+
runtime.domCurrentElement = null;
|
|
23
|
+
runtime.domElementMap = new WeakMap();
|
|
24
|
+
runtime.domNextOrderList = [];
|
|
25
|
+
runtime.domOrderLength = -1; // -1 = never rendered; forces first-call reconciliation
|
|
26
|
+
runtime.domOrderList = [];
|
|
27
|
+
element.style.position = 'relative';
|
|
28
|
+
element.style.overflow = 'hidden';
|
|
29
|
+
return state;
|
|
30
|
+
}
|
|
31
|
+
// Allocates the package-private DOM runtime for a DomRenderState. createDomRenderState attaches one to
|
|
32
|
+
// each state under EntityRuntimeKey and populates its fields; getDomRenderStateRuntime reads it back.
|
|
33
|
+
// The render path writes the returned object every frame, so the return is intentionally mutable (not
|
|
34
|
+
// Readonly).
|
|
35
|
+
export function createDomRenderStateRuntime() {
|
|
36
|
+
return createRenderStateRuntime();
|
|
37
|
+
}
|
|
38
|
+
// Resolves the package-private DOM runtime attached to a DomRenderState. Mutable by design: the render
|
|
39
|
+
// path writes its fields every frame.
|
|
40
|
+
export function getDomRenderStateRuntime(state) {
|
|
41
|
+
return state[EntityRuntimeKey];
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=domRenderState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domRenderState.js","sourceRoot":"","sources":["../src/domRenderState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACL,iBAAiB,IAAI,kBAAkB,EACvC,wBAAwB,EACxB,6BAA6B,GAC9B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,UAAU,oBAAoB,CAAC,OAAoB,EAAE,UAAqC,EAAE;IAChG,MAAM,KAAK,GAAG,kBAAkB,CAAC;QAC/B,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,CAAC;QACnC,iBAAiB,EAAE,YAAY,EAAE;QACjC,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,KAAK;QACzC,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;KACnD,CAAmB,CAAC;IAErB,IAAI,OAAO,CAAC,eAAe,IAAI,IAAI;QAAE,6BAA6B,CAAC,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IAEnG,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,oBAAoB,GAAG,IAAI,CAAC;IACjC,KAAkC,CAAC,OAAO,GAAG,OAAO,CAAC;IACtD,KAAK,CAAC,cAAc,GAAG,OAAO,CAAC,qBAAqB,IAAI,IAAI,CAAC;IAE7D,MAAM,OAAO,GAAG,2BAA2B,EAAE,CAAC;IAC9C,KAAK,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC;IAClC,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAChC,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAC5B,OAAO,CAAC,YAAY,GAAG,EAAE,CAAC;IAC1B,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IACjC,OAAO,CAAC,aAAa,GAAG,IAAI,OAAO,EAAE,CAAC;IACtC,OAAO,CAAC,gBAAgB,GAAG,EAAE,CAAC;IAC9B,OAAO,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,wDAAwD;IACrF,OAAO,CAAC,YAAY,GAAG,EAAE,CAAC;IAE1B,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;IACpC,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAElC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,uGAAuG;AACvG,sGAAsG;AACtG,sGAAsG;AACtG,aAAa;AACb,MAAM,UAAU,2BAA2B;IACzC,OAAO,wBAAwB,EAA2B,CAAC;AAC7D,CAAC;AAED,uGAAuG;AACvG,sCAAsC;AACtC,MAAM,UAAU,wBAAwB,CAAC,KAAqB;IAC5D,OAAO,KAAK,CAAC,gBAAgB,CAA0B,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Scene2DRenderer, DomRenderState, RenderProxy2D } from '@flighthq/types';
|
|
2
|
+
export declare function drawDomRenderView(state: DomRenderState, renderProxy: RenderProxy2D): void;
|
|
3
|
+
export declare const defaultDomRenderViewRenderer: Scene2DRenderer;
|
|
4
|
+
//# sourceMappingURL=domRenderView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domRenderView.d.ts","sourceRoot":"","sources":["../src/domRenderView.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAc,MAAM,iBAAiB,CAAC;AAIlG,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,GAAG,IAAI,CAkBzF;AAED,eAAO,MAAM,4BAA4B,EAAE,eAG1C,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { noopRendererData } from '@flighthq/render';
|
|
2
|
+
import { applyDomStyle, setDomRendererElement } from './domStyle';
|
|
3
|
+
export function drawDomRenderView(state, renderProxy) {
|
|
4
|
+
const source = renderProxy.source;
|
|
5
|
+
const { renderer } = source.data;
|
|
6
|
+
if (renderer === null)
|
|
7
|
+
return;
|
|
8
|
+
renderer.render();
|
|
9
|
+
const canvas = renderer.canvas;
|
|
10
|
+
if (canvas.style.position !== 'absolute') {
|
|
11
|
+
canvas.style.left = '0';
|
|
12
|
+
canvas.style.position = 'absolute';
|
|
13
|
+
canvas.style.top = '0';
|
|
14
|
+
canvas.style.transformOrigin = '0 0';
|
|
15
|
+
canvas.style.pointerEvents = 'none';
|
|
16
|
+
}
|
|
17
|
+
applyDomStyle(state, canvas, renderProxy);
|
|
18
|
+
setDomRendererElement(state, canvas);
|
|
19
|
+
}
|
|
20
|
+
export const defaultDomRenderViewRenderer = {
|
|
21
|
+
createData: noopRendererData,
|
|
22
|
+
submit: drawDomRenderView,
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=domRenderView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domRenderView.js","sourceRoot":"","sources":["../src/domRenderView.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGpD,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAElE,MAAM,UAAU,iBAAiB,CAAC,KAAqB,EAAE,WAA0B;IACjF,MAAM,MAAM,GAAG,WAAW,CAAC,MAAoB,CAAC;IAChD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IACjC,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO;IAE9B,QAAQ,CAAC,MAAM,EAAE,CAAC;IAElB,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC/B,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC;QACxB,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC;QACvB,MAAM,CAAC,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC;IACtC,CAAC;IAED,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAC1C,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,MAAM,4BAA4B,GAAoB;IAC3D,UAAU,EAAE,gBAAgB;IAC5B,MAAM,EAAE,iBAAiB;CAC1B,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Scene2DRenderer, DomRenderState, DomTextInputOverlay, RenderProxy2D } from '@flighthq/types';
|
|
2
|
+
export declare function drawDomRichText(state: DomRenderState, renderProxy: RenderProxy2D): void;
|
|
3
|
+
export declare function drawDomRichTextMask(state: DomRenderState, renderProxy: RenderProxy2D): void;
|
|
4
|
+
export declare function registerDomTextInputOverlay(overlay: DomTextInputOverlay): void;
|
|
5
|
+
export declare const defaultDomRichTextRenderer: Scene2DRenderer;
|
|
6
|
+
//# sourceMappingURL=domRichText.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domRichText.d.ts","sourceRoot":"","sources":["../src/domRichText.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,mBAAmB,EAGnB,aAAa,EAMd,MAAM,iBAAiB,CAAC;AAuBzB,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,GAAG,IAAI,CAQvF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,GAAG,IAAI,CAE3F;AAyKD,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAE9E;AAED,eAAO,MAAM,0BAA0B,EAAE,eAGxC,CAAC"}
|