@flighthq/displayobject-dom 0.1.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/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 +77 -0
- package/dist/domBitmap.js.map +1 -0
- package/dist/domCSSFilterBinding.d.ts +28 -0
- package/dist/domCSSFilterBinding.d.ts.map +1 -0
- package/dist/domCSSFilterBinding.js +56 -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/domDisplayObject.d.ts +5 -0
- package/dist/domDisplayObject.d.ts.map +1 -0
- package/dist/domDisplayObject.js +60 -0
- package/dist/domDisplayObject.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/domMaterials.d.ts +15 -0
- package/dist/domMaterials.d.ts.map +1 -0
- package/dist/domMaterials.js +62 -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 +65 -0
- package/dist/domNativeText.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 +7 -0
- package/dist/domRichText.d.ts.map +1 -0
- package/dist/domRichText.js +183 -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/domSvgFilter.d.ts +27 -0
- package/dist/domSvgFilter.d.ts.map +1 -0
- package/dist/domSvgFilter.js +88 -0
- package/dist/domSvgFilter.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 +74 -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/htmlView.d.ts +4 -0
- package/dist/htmlView.d.ts.map +1 -0
- package/dist/htmlView.js +28 -0
- package/dist/htmlView.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 +49 -0
- package/src/domBackground.test.ts +35 -0
- package/src/domBitmap.test.ts +117 -0
- package/src/domCSSFilterBinding.test.ts +104 -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/domDisplayObject.test.ts +236 -0
- package/src/domFontSource.test.ts +30 -0
- package/src/domMaterials.test.ts +111 -0
- package/src/domNativeText.test.ts +71 -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 +165 -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/domSvgFilter.test.ts +116 -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
- package/src/htmlView.test.ts +117 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { getDisplayObjectRuntime } from '@flighthq/displayobject';
|
|
2
|
+
import { getRenderProxy2D, isRenderProxyVisible, noopRendererData } from '@flighthq/render';
|
|
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
|
+
// defaultCanvasDisplayObjectRenderer and allows the DOM traversal to correctly process
|
|
8
|
+
// display-object containers when their kind is registered.
|
|
9
|
+
export function drawDomDisplayObject(_state, _renderProxy) {
|
|
10
|
+
// No-op: containers are rendered implicitly by the traversal in renderDomDisplayObject.
|
|
11
|
+
}
|
|
12
|
+
export const defaultDomDisplayObjectRenderer = {
|
|
13
|
+
createData: noopRendererData,
|
|
14
|
+
submit: drawDomDisplayObject,
|
|
15
|
+
};
|
|
16
|
+
export function renderDomDisplayObject(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 = getDisplayObjectRuntime(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=domDisplayObject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domDisplayObject.js","sourceRoot":"","sources":["../src/domDisplayObject.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { FontResource } from '@flighthq/types';
|
|
2
|
+
export declare function getDomFontAscentCached(font: string): number | undefined;
|
|
3
|
+
export declare function invalidateDomFontResource(source: FontResource): void;
|
|
4
|
+
export declare function setDomFontAscentCached(font: string, ascent: number): void;
|
|
5
|
+
//# sourceMappingURL=domFontSource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domFontSource.d.ts","sourceRoot":"","sources":["../src/domFontSource.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAIpD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEvE;AAID,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAOpE;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAEzE"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
const _domFontAscentCache = new Map();
|
|
2
|
+
export function getDomFontAscentCached(font) {
|
|
3
|
+
return _domFontAscentCache.get(font);
|
|
4
|
+
}
|
|
5
|
+
// Clear ascent cache entries for this font family so the next render re-probes
|
|
6
|
+
// with the newly loaded face rather than the fallback that was measured before.
|
|
7
|
+
export function invalidateDomFontResource(source) {
|
|
8
|
+
const family = source.family;
|
|
9
|
+
for (const key of _domFontAscentCache.keys()) {
|
|
10
|
+
if (key.includes(`'${family}'`) || key.includes(`"${family}"`)) {
|
|
11
|
+
_domFontAscentCache.delete(key);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export function setDomFontAscentCached(font, ascent) {
|
|
16
|
+
_domFontAscentCache.set(font, ascent);
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=domFontSource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domFontSource.js","sourceRoot":"","sources":["../src/domFontSource.ts"],"names":[],"mappings":"AAEA,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAkB,CAAC;AAEtD,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,OAAO,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,+EAA+E;AAC/E,gFAAgF;AAChF,MAAM,UAAU,yBAAyB,CAAC,MAAoB;IAC5D,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,KAAK,MAAM,GAAG,IAAI,mBAAmB,CAAC,IAAI,EAAE,EAAE,CAAC;QAC7C,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/D,mBAAmB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAY,EAAE,MAAc;IACjE,mBAAmB,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACxC,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,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AA8C5C,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,62 @@
|
|
|
1
|
+
import { 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).
|
|
5
|
+
const DOM_BLEND_MODE = {
|
|
6
|
+
[BlendMode.Add]: 'screen',
|
|
7
|
+
[BlendMode.Alpha]: null,
|
|
8
|
+
[BlendMode.Darken]: 'darken',
|
|
9
|
+
[BlendMode.Difference]: 'difference',
|
|
10
|
+
[BlendMode.Erase]: null,
|
|
11
|
+
[BlendMode.Hardlight]: 'hard-light',
|
|
12
|
+
[BlendMode.Invert]: null,
|
|
13
|
+
[BlendMode.Layer]: '',
|
|
14
|
+
[BlendMode.Lighten]: 'lighten',
|
|
15
|
+
[BlendMode.Multiply]: 'multiply',
|
|
16
|
+
[BlendMode.Normal]: '',
|
|
17
|
+
[BlendMode.Overlay]: 'overlay',
|
|
18
|
+
[BlendMode.Screen]: 'screen',
|
|
19
|
+
[BlendMode.Shader]: null,
|
|
20
|
+
[BlendMode.Subtract]: null,
|
|
21
|
+
};
|
|
22
|
+
// Fidelity classification for each blend mode in the DOM backend.
|
|
23
|
+
// 'exact' — CSS mix-blend-mode maps faithfully to the OpenFL/Flash mode.
|
|
24
|
+
// 'approximate' — the closest CSS mode is used; results differ in edge cases
|
|
25
|
+
// (e.g. Add → screen: similar luminosity behavior but not additive-clipped-to-1).
|
|
26
|
+
// 'unsupported' — no CSS equivalent; falls back to normal compositing.
|
|
27
|
+
const DOM_BLEND_MODE_FIDELITY = {
|
|
28
|
+
[BlendMode.Add]: 'approximate', // screen ≈ add for moderate values; clamps differently
|
|
29
|
+
[BlendMode.Alpha]: 'unsupported',
|
|
30
|
+
[BlendMode.Darken]: 'exact',
|
|
31
|
+
[BlendMode.Difference]: 'exact',
|
|
32
|
+
[BlendMode.Erase]: 'unsupported',
|
|
33
|
+
[BlendMode.Hardlight]: 'exact',
|
|
34
|
+
[BlendMode.Invert]: 'unsupported',
|
|
35
|
+
[BlendMode.Layer]: 'exact', // normal compositing within a stacking context
|
|
36
|
+
[BlendMode.Lighten]: 'exact',
|
|
37
|
+
[BlendMode.Multiply]: 'exact',
|
|
38
|
+
[BlendMode.Normal]: 'exact',
|
|
39
|
+
[BlendMode.Overlay]: 'exact',
|
|
40
|
+
[BlendMode.Screen]: 'exact',
|
|
41
|
+
[BlendMode.Shader]: 'unsupported',
|
|
42
|
+
[BlendMode.Subtract]: 'unsupported',
|
|
43
|
+
};
|
|
44
|
+
export function applyDomBlendMode(element, value) {
|
|
45
|
+
element.style.mixBlendMode = (value !== null ? DOM_BLEND_MODE[value] : null) ?? '';
|
|
46
|
+
}
|
|
47
|
+
export function enableDomBlendModeSupport(state) {
|
|
48
|
+
state.applyBlendMode = applyDomBlendMode;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Returns the fidelity of the DOM backend's realization of the given blend mode via CSS
|
|
52
|
+
* mix-blend-mode. Use this to detect lossy or unsupported modes before committing to a DOM
|
|
53
|
+
* render path for blend-sensitive content.
|
|
54
|
+
*
|
|
55
|
+
* - 'exact' — CSS result is perceptually identical to the OpenFL/Flash mode.
|
|
56
|
+
* - 'approximate' — closest CSS mode is used; may differ for extreme or mid-range colors.
|
|
57
|
+
* - 'unsupported' — no CSS equivalent; the DOM backend renders as BlendMode.Normal.
|
|
58
|
+
*/
|
|
59
|
+
export function getDomBlendModeFidelity(blendMode) {
|
|
60
|
+
return DOM_BLEND_MODE_FIDELITY[blendMode];
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=domMaterials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domMaterials.js","sourceRoot":"","sources":["../src/domMaterials.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,uFAAuF;AACvF,uFAAuF;AACvF,+DAA+D;AAC/D,MAAM,cAAc,GAAqC;IACvD,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,QAAQ;IACzB,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI;IACvB,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ;IAC5B,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,YAAY;IACpC,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI;IACvB,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,YAAY;IACnC,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI;IACxB,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE;IACrB,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,OAAO,CAAC,EAAE,SAAS;IAC9B,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ;IAC5B,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI;IACxB,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI;CAC3B,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,KAAK,CAAC,EAAE,aAAa;IAChC,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,OAAO;IAC3B,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,OAAO;IAC/B,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,aAAa;IAChC,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,OAAO;IAC9B,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,aAAa;IACjC,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,+CAA+C;IAC3E,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,OAAO,CAAC,EAAE,OAAO;IAC5B,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,OAAO;IAC3B,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,aAAa;IACjC,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,aAAa;CACpC,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 { DisplayObjectRenderer, 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: DisplayObjectRenderer;
|
|
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,qBAAqB,EACrB,cAAc,EAMd,aAAa,EAEd,MAAM,iBAAiB,CAAC;AAczB,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,GAAG,IAAI,CAoCzF;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,GAAG,IAAI,CAE7F;AAED,eAAO,MAAM,4BAA4B,EAAE,qBAG1C,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { computeRgbHexString } from '@flighthq/materials';
|
|
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 displayobject'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
|
+
element.style.whiteSpace = 'normal';
|
|
27
|
+
element.style.width = `${data.width}px`;
|
|
28
|
+
element.style.height = `${data.height}px`;
|
|
29
|
+
element.style.overflow = 'hidden';
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
element.style.whiteSpace = 'nowrap';
|
|
33
|
+
element.style.width = '';
|
|
34
|
+
element.style.height = '';
|
|
35
|
+
element.style.overflow = '';
|
|
36
|
+
}
|
|
37
|
+
element.textContent = data.text;
|
|
38
|
+
// Write the platform measurement back so DOM-free bounds (computeNativeTextLocalBoundsRectangle) can
|
|
39
|
+
// read it without the DOM. Under autoSize the field box tracks the element's measured size.
|
|
40
|
+
const rect = element.getBoundingClientRect();
|
|
41
|
+
runtime.measuredWidth = rect.width;
|
|
42
|
+
runtime.measuredHeight = rect.height;
|
|
43
|
+
applyDomStyle(state, element, renderProxy);
|
|
44
|
+
setDomRendererElement(state, element);
|
|
45
|
+
}
|
|
46
|
+
export function drawDomNativeTextMask(state, renderProxy) {
|
|
47
|
+
drawDomNativeText(state, renderProxy);
|
|
48
|
+
}
|
|
49
|
+
export const defaultDomNativeTextRenderer = {
|
|
50
|
+
createData: createDomNativeTextData,
|
|
51
|
+
submit: drawDomNativeText,
|
|
52
|
+
};
|
|
53
|
+
function applyNativeTextStyle(element, style) {
|
|
54
|
+
const size = style.size ?? 12;
|
|
55
|
+
const family = style.font ?? 'sans-serif';
|
|
56
|
+
const weight = style.bold ? 'bold ' : '';
|
|
57
|
+
const slant = style.italic ? 'italic ' : '';
|
|
58
|
+
element.style.font = `${slant}${weight}${size}px ${family}`;
|
|
59
|
+
element.style.color = computeRgbHexString(style.color ?? 0);
|
|
60
|
+
if (style.align !== undefined)
|
|
61
|
+
element.style.textAlign = style.align;
|
|
62
|
+
if (style.leading !== undefined)
|
|
63
|
+
element.style.lineHeight = `${size + style.leading}px`;
|
|
64
|
+
}
|
|
65
|
+
//# 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,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 { DisplayObjectRenderer, DomRenderState, RenderProxy2D } from '@flighthq/types';
|
|
2
|
+
export declare function drawDomRenderView(state: DomRenderState, renderProxy: RenderProxy2D): void;
|
|
3
|
+
export declare const defaultDomRenderViewRenderer: DisplayObjectRenderer;
|
|
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,qBAAqB,EAAE,cAAc,EAAE,aAAa,EAAc,MAAM,iBAAiB,CAAC;AAIxG,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,GAAG,IAAI,CAkBzF;AAED,eAAO,MAAM,4BAA4B,EAAE,qBAG1C,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,GAA0B;IACjE,UAAU,EAAE,gBAAgB;IAC5B,MAAM,EAAE,iBAAiB;CAC1B,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { DisplayObjectRenderer, DomRenderState, RenderProxy2D } from '@flighthq/types';
|
|
2
|
+
export declare function drawDomRichText(state: DomRenderState, renderProxy: RenderProxy2D): void;
|
|
3
|
+
export type DomTextInputOverlay = (state: DomRenderState, renderProxy: RenderProxy2D) => void;
|
|
4
|
+
export declare function drawDomRichTextMask(state: DomRenderState, renderProxy: RenderProxy2D): void;
|
|
5
|
+
export declare function registerDomTextInputOverlay(overlay: DomTextInputOverlay): void;
|
|
6
|
+
export declare const defaultDomRichTextRenderer: DisplayObjectRenderer;
|
|
7
|
+
//# 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,qBAAqB,EACrB,cAAc,EAGd,aAAa,EAMd,MAAM,iBAAiB,CAAC;AAuBzB,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,GAAG,IAAI,CAQvF;AAED,MAAM,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,KAAK,IAAI,CAAC;AAE9F,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,GAAG,IAAI,CAE3F;AAwKD,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAE9E;AAED,eAAO,MAAM,0BAA0B,EAAE,qBAGxC,CAAC"}
|