@lightningtv/solid 3.1.7 → 3.1.9
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/src/core/animation.d.ts +1 -1
- package/dist/src/core/animation.js.map +1 -1
- package/dist/src/core/config.d.ts +2 -2
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/{domRenderer.d.ts → dom-renderer/domRenderer.d.ts} +30 -7
- package/dist/src/core/{domRenderer.js → dom-renderer/domRenderer.js} +633 -122
- package/dist/src/core/dom-renderer/domRenderer.js.map +1 -0
- package/dist/src/core/dom-renderer/domRendererTypes.d.ts +111 -0
- package/dist/src/core/dom-renderer/domRendererTypes.js +2 -0
- package/dist/src/core/dom-renderer/domRendererTypes.js.map +1 -0
- package/dist/src/core/dom-renderer/domRendererUtils.d.ts +23 -0
- package/dist/src/core/dom-renderer/domRendererUtils.js +231 -0
- package/dist/src/core/dom-renderer/domRendererUtils.js.map +1 -0
- package/dist/src/core/elementNode.d.ts +8 -8
- package/dist/src/core/elementNode.js +56 -16
- package/dist/src/core/elementNode.js.map +1 -1
- package/dist/src/core/index.d.ts +4 -2
- package/dist/src/core/index.js +1 -2
- package/dist/src/core/index.js.map +1 -1
- package/dist/src/core/intrinsicTypes.d.ts +16 -6
- package/dist/src/core/lightningInit.d.ts +7 -89
- package/dist/src/core/lightningInit.js +13 -5
- package/dist/src/core/lightningInit.js.map +1 -1
- package/dist/src/core/shaders.d.ts +12 -11
- package/dist/src/core/shaders.js +0 -90
- package/dist/src/core/shaders.js.map +1 -1
- package/dist/src/primitives/Grid.jsx +2 -2
- package/dist/src/primitives/Grid.jsx.map +1 -1
- package/dist/src/primitives/Image.jsx +18 -0
- package/dist/src/primitives/Image.jsx.map +1 -1
- package/dist/src/primitives/Virtual.jsx +31 -7
- package/dist/src/primitives/Virtual.jsx.map +1 -1
- package/dist/src/render.d.ts +3 -3
- package/dist/src/render.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/core/animation.ts +6 -3
- package/src/core/config.ts +5 -2
- package/src/core/{domRenderer.ts → dom-renderer/domRenderer.ts} +738 -164
- package/src/core/dom-renderer/domRendererTypes.ts +150 -0
- package/src/core/dom-renderer/domRendererUtils.ts +291 -0
- package/src/core/elementNode.ts +102 -36
- package/src/core/index.ts +4 -2
- package/src/core/intrinsicTypes.ts +22 -6
- package/src/core/lightningInit.ts +20 -124
- package/src/core/shaders.ts +17 -110
- package/src/primitives/Grid.tsx +8 -7
- package/src/primitives/Image.tsx +20 -0
- package/src/primitives/Virtual.tsx +32 -7
- package/src/render.ts +2 -1
- package/dist/src/core/domRenderer.js.map +0 -1
package/src/core/elementNode.ts
CHANGED
|
@@ -1,12 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
IRendererNode,
|
|
3
|
-
IRendererNodeProps,
|
|
4
|
-
IRendererShader,
|
|
5
|
-
IRendererShaderProps,
|
|
6
|
-
IRendererTextNode,
|
|
7
|
-
IRendererTextNodeProps,
|
|
8
|
-
renderer,
|
|
9
|
-
} from './lightningInit.js';
|
|
1
|
+
import { renderer } from './lightningInit.js';
|
|
10
2
|
import {
|
|
11
3
|
type BorderRadius,
|
|
12
4
|
type BorderStyle,
|
|
@@ -21,6 +13,7 @@ import {
|
|
|
21
13
|
TextNode,
|
|
22
14
|
type OnEvent,
|
|
23
15
|
NewOmit,
|
|
16
|
+
SingleBorderStyle,
|
|
24
17
|
} from './intrinsicTypes.js';
|
|
25
18
|
import States, { type NodeStates } from './states.js';
|
|
26
19
|
import calculateFlexOld from './flex.js';
|
|
@@ -51,6 +44,8 @@ import type {
|
|
|
51
44
|
RadialGradientProps,
|
|
52
45
|
ShadowProps,
|
|
53
46
|
CoreShaderNode,
|
|
47
|
+
ITextNodeProps,
|
|
48
|
+
INodeProps,
|
|
54
49
|
} from '@lightningjs/renderer';
|
|
55
50
|
import { assertTruthy } from '@lightningjs/renderer/utils';
|
|
56
51
|
import { NodeType } from './nodeTypes.js';
|
|
@@ -60,6 +55,14 @@ import {
|
|
|
60
55
|
FocusNode,
|
|
61
56
|
} from './focusManager.js';
|
|
62
57
|
import simpleAnimation, { SimpleAnimationSettings } from './animation.js';
|
|
58
|
+
import {
|
|
59
|
+
IRendererNode,
|
|
60
|
+
IRendererNodeProps,
|
|
61
|
+
IRendererShader,
|
|
62
|
+
IRendererShaderProps,
|
|
63
|
+
IRendererTextNode,
|
|
64
|
+
IRendererTextNodeProps,
|
|
65
|
+
} from './dom-renderer/domRendererTypes.js';
|
|
63
66
|
|
|
64
67
|
let nextActiveElement: ElementNode | null = null;
|
|
65
68
|
let focusQueued: boolean = false;
|
|
@@ -70,7 +73,10 @@ function addToLayoutQueue(node: ElementNode) {
|
|
|
70
73
|
layoutQueue.add(node);
|
|
71
74
|
if (!layoutRunQueued) {
|
|
72
75
|
layoutRunQueued = true;
|
|
73
|
-
if (
|
|
76
|
+
if (
|
|
77
|
+
'reprocessUpdates' in renderer.stage &&
|
|
78
|
+
renderer.stage.reprocessUpdates
|
|
79
|
+
) {
|
|
74
80
|
renderer.stage.reprocessUpdates(runLayout);
|
|
75
81
|
} else {
|
|
76
82
|
queueMicrotask(runLayout);
|
|
@@ -96,10 +102,28 @@ const parseAndAssignShaderProps = (
|
|
|
96
102
|
props: Record<string, any> = {},
|
|
97
103
|
) => {
|
|
98
104
|
if (!obj) return;
|
|
99
|
-
|
|
105
|
+
|
|
106
|
+
// Handle individual border sides: transform width/w to bottom/left/right/top
|
|
107
|
+
const borderSideMap: Record<string, string> = {
|
|
108
|
+
borderBottom: 'bottom',
|
|
109
|
+
borderLeft: 'left',
|
|
110
|
+
borderRight: 'right',
|
|
111
|
+
borderTop: 'top',
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
const side = borderSideMap[prefix];
|
|
115
|
+
const actualPrefix = side ? 'border' : prefix;
|
|
116
|
+
|
|
117
|
+
props[actualPrefix] = obj;
|
|
100
118
|
Object.entries(obj).forEach(([key, value]) => {
|
|
101
119
|
let transformedKey = key === 'width' ? 'w' : key;
|
|
102
|
-
|
|
120
|
+
|
|
121
|
+
// If border side and key is width/w, transform to side (bottom/left/right/top)
|
|
122
|
+
if (side && transformedKey === 'w') {
|
|
123
|
+
transformedKey = side;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
props[`${actualPrefix}-${transformedKey}`] = value;
|
|
103
127
|
});
|
|
104
128
|
};
|
|
105
129
|
|
|
@@ -110,8 +134,7 @@ export function convertToShader(
|
|
|
110
134
|
let type = 'rounded';
|
|
111
135
|
if (v.border) type += 'WithBorder';
|
|
112
136
|
if (v.shadow) type += 'WithShadow';
|
|
113
|
-
|
|
114
|
-
return renderer.createShader(type, v as IRendererShaderProps);
|
|
137
|
+
return renderer.createShader(type, v);
|
|
115
138
|
}
|
|
116
139
|
|
|
117
140
|
function getPropertyAlias(name: string) {
|
|
@@ -186,6 +209,7 @@ const LightningRendererNonAnimatingProps = [
|
|
|
186
209
|
'texture',
|
|
187
210
|
'textureOptions',
|
|
188
211
|
'verticalAlign',
|
|
212
|
+
'wordBreak',
|
|
189
213
|
'wordWrap',
|
|
190
214
|
];
|
|
191
215
|
|
|
@@ -299,8 +323,9 @@ export interface ElementNode extends RendererNode, FocusNode {
|
|
|
299
323
|
* The underlying Lightning Renderer node object. This is where the properties are ultimately set for rendering.
|
|
300
324
|
*/
|
|
301
325
|
lng:
|
|
302
|
-
|
|
|
326
|
+
| INode
|
|
303
327
|
| IRendererNode
|
|
328
|
+
| Partial<ElementNode>
|
|
304
329
|
| (IRendererTextNode & { shader?: any });
|
|
305
330
|
/**
|
|
306
331
|
* A reference to the `ElementNode` instance. Can be an object or a callback function.
|
|
@@ -360,13 +385,13 @@ export interface ElementNode extends RendererNode, FocusNode {
|
|
|
360
385
|
*
|
|
361
386
|
* @see https://lightning-tv.github.io/solid/#/essentials/effects?id=border-and-borderradius
|
|
362
387
|
*/
|
|
363
|
-
borderBottom?:
|
|
388
|
+
borderBottom?: SingleBorderStyle;
|
|
364
389
|
/**
|
|
365
390
|
* The border style for the left side of the element.
|
|
366
391
|
*
|
|
367
392
|
* @see https://lightning-tv.github.io/solid/#/essentials/effects?id=border-and-borderradius
|
|
368
393
|
*/
|
|
369
|
-
borderLeft?:
|
|
394
|
+
borderLeft?: SingleBorderStyle;
|
|
370
395
|
/**
|
|
371
396
|
* The radius of the element's corners.
|
|
372
397
|
*
|
|
@@ -378,13 +403,13 @@ export interface ElementNode extends RendererNode, FocusNode {
|
|
|
378
403
|
*
|
|
379
404
|
* @see https://lightning-tv.github.io/solid/#/essentials/effects?id=border-and-borderradius
|
|
380
405
|
*/
|
|
381
|
-
borderRight?:
|
|
406
|
+
borderRight?: SingleBorderStyle;
|
|
382
407
|
/**
|
|
383
408
|
* The border style for the top side of the element.
|
|
384
409
|
*
|
|
385
410
|
* @see https://lightning-tv.github.io/solid/#/essentials/effects?id=border-and-borderradius
|
|
386
411
|
*/
|
|
387
|
-
borderTop?:
|
|
412
|
+
borderTop?: SingleBorderStyle;
|
|
388
413
|
/**
|
|
389
414
|
* A shorthand to set both `centerX` and `centerY` to true.
|
|
390
415
|
*
|
|
@@ -682,12 +707,20 @@ export class ElementNode extends Object {
|
|
|
682
707
|
set effects(v: StyleEffects) {
|
|
683
708
|
if (!SHADERS_ENABLED) return;
|
|
684
709
|
let target = this.lng.shader || {};
|
|
685
|
-
if (this.lng.shader?.
|
|
710
|
+
if (this.lng.shader?.props) {
|
|
686
711
|
target = this.lng.shader.props;
|
|
687
712
|
}
|
|
688
713
|
if (v.rounded) target.radius = v.rounded.radius;
|
|
689
714
|
if (v.borderRadius) target.radius = v.borderRadius;
|
|
690
715
|
if (v.border) parseAndAssignShaderProps('border', v.border, target);
|
|
716
|
+
if (v.borderTop)
|
|
717
|
+
parseAndAssignShaderProps('borderTop', v.borderTop, target);
|
|
718
|
+
if (v.borderRight)
|
|
719
|
+
parseAndAssignShaderProps('borderRight', v.borderRight, target);
|
|
720
|
+
if (v.borderBottom)
|
|
721
|
+
parseAndAssignShaderProps('borderBottom', v.borderBottom, target);
|
|
722
|
+
if (v.borderLeft)
|
|
723
|
+
parseAndAssignShaderProps('borderLeft', v.borderLeft, target);
|
|
691
724
|
if (v.shadow) parseAndAssignShaderProps('shadow', v.shadow, target);
|
|
692
725
|
|
|
693
726
|
if (this.rendered) {
|
|
@@ -703,7 +736,11 @@ export class ElementNode extends Object {
|
|
|
703
736
|
|
|
704
737
|
set id(id: string) {
|
|
705
738
|
this._id = id;
|
|
706
|
-
if (
|
|
739
|
+
if (
|
|
740
|
+
Config.rendererOptions &&
|
|
741
|
+
'inspector' in Config.rendererOptions &&
|
|
742
|
+
Config.rendererOptions.inspector
|
|
743
|
+
) {
|
|
707
744
|
this.data = { ...this.data, testId: id };
|
|
708
745
|
}
|
|
709
746
|
}
|
|
@@ -877,7 +914,8 @@ export class ElementNode extends Object {
|
|
|
877
914
|
}
|
|
878
915
|
}
|
|
879
916
|
|
|
880
|
-
(this.lng[name as keyof IRendererNode] as number | string) =
|
|
917
|
+
(this.lng[name as keyof (IRendererNode | INode)] as number | string) =
|
|
918
|
+
value;
|
|
881
919
|
}
|
|
882
920
|
|
|
883
921
|
animate(
|
|
@@ -978,7 +1016,12 @@ export class ElementNode extends Object {
|
|
|
978
1016
|
|
|
979
1017
|
_layoutOnLoad() {
|
|
980
1018
|
(this.lng as IRendererNode).on('loaded', () => {
|
|
981
|
-
|
|
1019
|
+
if (
|
|
1020
|
+
'reprocessUpdates' in renderer.stage &&
|
|
1021
|
+
renderer.stage.reprocessUpdates
|
|
1022
|
+
) {
|
|
1023
|
+
renderer.stage.reprocessUpdates();
|
|
1024
|
+
}
|
|
982
1025
|
this.parent!.updateLayout();
|
|
983
1026
|
});
|
|
984
1027
|
}
|
|
@@ -1034,7 +1077,10 @@ export class ElementNode extends Object {
|
|
|
1034
1077
|
// Keys set in JSX are more important
|
|
1035
1078
|
for (const key in this._style) {
|
|
1036
1079
|
// be careful of 0 values
|
|
1037
|
-
if (
|
|
1080
|
+
if (
|
|
1081
|
+
this[key as keyof Styles] === undefined ||
|
|
1082
|
+
(key === 'fontFamily' && this._fontFamily === undefined)
|
|
1083
|
+
) {
|
|
1038
1084
|
this[key as keyof Styles] = this._style[key as keyof Styles];
|
|
1039
1085
|
}
|
|
1040
1086
|
}
|
|
@@ -1306,7 +1352,11 @@ export class ElementNode extends Object {
|
|
|
1306
1352
|
if (Config.fontSettings) {
|
|
1307
1353
|
for (const key in Config.fontSettings) {
|
|
1308
1354
|
if (textProps[key] === undefined) {
|
|
1309
|
-
|
|
1355
|
+
let value = Config.fontSettings[key];
|
|
1356
|
+
if (key === 'fontFamily' && textProps['fontWeight'] === undefined) {
|
|
1357
|
+
value = `${value}${Config.fontSettings.fontWeight || ''}`;
|
|
1358
|
+
}
|
|
1359
|
+
textProps[key] = value;
|
|
1310
1360
|
}
|
|
1311
1361
|
}
|
|
1312
1362
|
}
|
|
@@ -1342,8 +1392,7 @@ export class ElementNode extends Object {
|
|
|
1342
1392
|
textProps.lineHeight ||
|
|
1343
1393
|
textProps.fontSize) as number;
|
|
1344
1394
|
}
|
|
1345
|
-
|
|
1346
|
-
textProps.w = textProps.h = undefined;
|
|
1395
|
+
// textProps.w = textProps.h = 0;
|
|
1347
1396
|
}
|
|
1348
1397
|
|
|
1349
1398
|
// Can you put effects on Text nodes? Need to confirm...
|
|
@@ -1352,9 +1401,11 @@ export class ElementNode extends Object {
|
|
|
1352
1401
|
}
|
|
1353
1402
|
|
|
1354
1403
|
isDev && log('Rendering: ', this, props);
|
|
1404
|
+
|
|
1355
1405
|
node.lng = renderer.createTextNode(
|
|
1356
|
-
props as
|
|
1357
|
-
);
|
|
1406
|
+
props as Partial<ITextNodeProps> & Partial<IRendererTextNodeProps>,
|
|
1407
|
+
) as IRendererTextNode;
|
|
1408
|
+
|
|
1358
1409
|
if (parent.requiresLayout()) {
|
|
1359
1410
|
if (!textProps.maxWidth || !textProps.maxHeight) {
|
|
1360
1411
|
node._layoutOnLoad();
|
|
@@ -1390,7 +1441,10 @@ export class ElementNode extends Object {
|
|
|
1390
1441
|
}
|
|
1391
1442
|
|
|
1392
1443
|
isDev && log('Rendering: ', this, props);
|
|
1393
|
-
|
|
1444
|
+
|
|
1445
|
+
node.lng = renderer.createNode(
|
|
1446
|
+
props as Partial<INodeProps<any>> & Partial<IRendererNodeProps>,
|
|
1447
|
+
);
|
|
1394
1448
|
|
|
1395
1449
|
if (node._hasRenderedChildren) {
|
|
1396
1450
|
node._hasRenderedChildren = false;
|
|
@@ -1418,14 +1472,15 @@ export class ElementNode extends Object {
|
|
|
1418
1472
|
|
|
1419
1473
|
if (node.onEvent) {
|
|
1420
1474
|
for (const [name, handler] of Object.entries(node.onEvent)) {
|
|
1421
|
-
node.lng.on
|
|
1475
|
+
if (typeof node.lng.on === 'function') {
|
|
1476
|
+
node.lng.on(name, (_inode, data) => handler.call(node, node, data));
|
|
1477
|
+
}
|
|
1422
1478
|
}
|
|
1423
1479
|
}
|
|
1424
1480
|
|
|
1425
1481
|
// L3 Inspector adds div to the lng object
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
}
|
|
1482
|
+
const div: HTMLElement | undefined = (node.lng as any)?.div;
|
|
1483
|
+
if (div) div.element = node;
|
|
1429
1484
|
|
|
1430
1485
|
if (node._type === NodeType.Element) {
|
|
1431
1486
|
// only element nodes will have children that need rendering
|
|
@@ -1485,7 +1540,14 @@ export function createRawShaderAccessor<T>(key: keyof StyleEffects) {
|
|
|
1485
1540
|
}
|
|
1486
1541
|
|
|
1487
1542
|
export function shaderAccessor<T extends Record<string, any> | number>(
|
|
1488
|
-
key:
|
|
1543
|
+
key:
|
|
1544
|
+
| 'border'
|
|
1545
|
+
| 'shadow'
|
|
1546
|
+
| 'rounded'
|
|
1547
|
+
| 'borderBottom'
|
|
1548
|
+
| 'borderLeft'
|
|
1549
|
+
| 'borderRight'
|
|
1550
|
+
| 'borderTop',
|
|
1489
1551
|
) {
|
|
1490
1552
|
return {
|
|
1491
1553
|
set(this: ElementNode, value: T) {
|
|
@@ -1494,7 +1556,7 @@ export function shaderAccessor<T extends Record<string, any> | number>(
|
|
|
1494
1556
|
this._effects[key] = value;
|
|
1495
1557
|
|
|
1496
1558
|
let animationSettings: AnimationSettings | undefined;
|
|
1497
|
-
if (this.lng.shader?.
|
|
1559
|
+
if (this.lng.shader?.props) {
|
|
1498
1560
|
target = this.lng.shader.props;
|
|
1499
1561
|
const transitionKey = key === 'rounded' ? 'borderRadius' : key;
|
|
1500
1562
|
if (
|
|
@@ -1543,6 +1605,10 @@ if (isDev) {
|
|
|
1543
1605
|
|
|
1544
1606
|
Object.defineProperties(ElementNode.prototype, {
|
|
1545
1607
|
border: shaderAccessor<BorderStyle>('border'),
|
|
1608
|
+
borderBottom: shaderAccessor<BorderStyle>('borderBottom'),
|
|
1609
|
+
borderTop: shaderAccessor<BorderStyle>('borderTop'),
|
|
1610
|
+
borderLeft: shaderAccessor<BorderStyle>('borderLeft'),
|
|
1611
|
+
borderRight: shaderAccessor<BorderStyle>('borderRight'),
|
|
1546
1612
|
shadow: shaderAccessor<ShadowProps>('shadow'),
|
|
1547
1613
|
rounded: shaderAccessor<BorderRadius>('rounded'),
|
|
1548
1614
|
// Alias for rounded
|
package/src/core/index.ts
CHANGED
|
@@ -2,8 +2,10 @@ export * from './elementNode.js';
|
|
|
2
2
|
export * from './lightningInit.js';
|
|
3
3
|
export * from './nodeTypes.js';
|
|
4
4
|
export * from './utils.js';
|
|
5
|
-
export * from './
|
|
6
|
-
export * from './
|
|
5
|
+
export * from './dom-renderer/domRenderer.js';
|
|
6
|
+
export type * from './dom-renderer/domRendererTypes.js';
|
|
7
|
+
export type * from './intrinsicTypes.js';
|
|
8
|
+
export type * from './focusKeyTypes.js';
|
|
7
9
|
export * from './config.js';
|
|
8
10
|
export * from './shaders.js';
|
|
9
11
|
export type * from '@lightningjs/renderer';
|
|
@@ -23,16 +23,18 @@ export type AddColorString<T> = {
|
|
|
23
23
|
[K in keyof T]: K extends `color${string}` ? string | number : T[K];
|
|
24
24
|
};
|
|
25
25
|
|
|
26
|
-
export interface BorderStyleObject {
|
|
27
|
-
width
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
26
|
+
export interface BorderStyleObject extends Partial<lngr.BorderProps> {
|
|
27
|
+
width?: number | [number, number, number, number];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface SingleBorderStyleObject extends Partial<lngr.BorderProps> {
|
|
31
|
+
width?: number;
|
|
32
|
+
w?: number;
|
|
32
33
|
}
|
|
33
34
|
|
|
34
35
|
export type DollarString = `$${string}`;
|
|
35
36
|
export type BorderStyle = BorderStyleObject;
|
|
37
|
+
export type SingleBorderStyle = SingleBorderStyleObject;
|
|
36
38
|
export type BorderRadius = number | number[];
|
|
37
39
|
|
|
38
40
|
export interface Effects {
|
|
@@ -43,10 +45,24 @@ export interface Effects {
|
|
|
43
45
|
rounded?: Partial<ShaderRoundedProps>;
|
|
44
46
|
borderRadius?: Partial<BorderRadius>;
|
|
45
47
|
border?: Partial<ShaderBorderProps>;
|
|
48
|
+
borderTop?: Partial<ShaderBorderProps>;
|
|
49
|
+
borderBottom?: Partial<ShaderBorderProps>;
|
|
50
|
+
borderLeft?: Partial<ShaderBorderProps>;
|
|
51
|
+
borderRight?: Partial<ShaderBorderProps>;
|
|
46
52
|
}
|
|
47
53
|
|
|
48
54
|
export type StyleEffects = Effects;
|
|
49
55
|
|
|
56
|
+
export type CoreAnimation = Parameters<
|
|
57
|
+
lngr.Stage['animationManager']['registerAnimation']
|
|
58
|
+
>[0];
|
|
59
|
+
|
|
60
|
+
export type FontLoadOptions = Parameters<lngr.Stage['loadFont']>[1] & {
|
|
61
|
+
type?: 'ssdf' | 'msdf';
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
export type CoreShaderManager = lngr.Stage['shManager'];
|
|
65
|
+
|
|
50
66
|
export type NewOmit<T, K extends PropertyKey> = {
|
|
51
67
|
[P in keyof T as Exclude<P, K>]: T[P];
|
|
52
68
|
};
|
|
@@ -1,137 +1,29 @@
|
|
|
1
1
|
import * as lng from '@lightningjs/renderer';
|
|
2
|
-
import { DOMRendererMain } from './domRenderer.js';
|
|
3
|
-
import { DOM_RENDERING } from './config.js';
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
ShaderHolePunchProps,
|
|
7
|
-
ShaderLinearGradientProps,
|
|
8
|
-
ShaderRadialGradientProps,
|
|
9
|
-
ShaderRoundedProps,
|
|
10
|
-
ShaderShadowPrefixedProps,
|
|
11
|
-
} from './shaders.js';
|
|
2
|
+
import { DOMRendererMain, loadFontToDom } from './dom-renderer/domRenderer.js';
|
|
3
|
+
import { Config, DOM_RENDERING } from './config.js';
|
|
4
|
+
import { FontLoadOptions } from './intrinsicTypes.js';
|
|
5
|
+
import { DomRendererMainSettings } from './dom-renderer/domRendererTypes.js';
|
|
12
6
|
|
|
13
7
|
export type SdfFontType = 'ssdf' | 'msdf';
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
export interface IRendererCoreRenderer {
|
|
17
|
-
mode: 'canvas' | 'webgl' | undefined;
|
|
18
|
-
}
|
|
19
|
-
/** Based on {@link lng.TrFontManager} */
|
|
20
|
-
export interface IRendererFontManager {
|
|
21
|
-
addFontFace: (...a: any[]) => void;
|
|
22
|
-
}
|
|
23
|
-
/** Based on {@link lng.Stage} */
|
|
24
|
-
export interface IRendererStage {
|
|
25
|
-
root: IRendererNode;
|
|
26
|
-
renderer: IRendererCoreRenderer;
|
|
27
|
-
shManager: IRendererShaderManager;
|
|
28
|
-
reprocessUpdates?: (callback?: () => void) => void;
|
|
29
|
-
animationManager: {
|
|
30
|
-
registerAnimation: (anim: any) => void;
|
|
31
|
-
unregisterAnimation: (anim: any) => void;
|
|
32
|
-
};
|
|
33
|
-
loadFont(kind: string, props: any): Promise<void>;
|
|
34
|
-
cleanup(full: boolean): void;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/** Based on {@link lng.CoreShaderManager} */
|
|
38
|
-
export interface IRendererShaderManager {
|
|
39
|
-
registerShaderType: (name: string, shader: any) => void;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/** Based on {@link lng.CoreShaderNode} */
|
|
43
|
-
export interface IRendererShader {
|
|
44
|
-
shaderType: IRendererShaderType;
|
|
45
|
-
props?: IRendererShaderProps;
|
|
46
|
-
program?: {};
|
|
47
|
-
}
|
|
48
|
-
/** Based on {@link lng.CoreShaderType} */
|
|
49
|
-
export interface IRendererShaderType {}
|
|
50
|
-
export type IRendererShaderProps = Partial<ShaderBorderPrefixedProps> &
|
|
51
|
-
Partial<ShaderShadowPrefixedProps> &
|
|
52
|
-
Partial<ShaderRoundedProps> &
|
|
53
|
-
Partial<ShaderHolePunchProps> &
|
|
54
|
-
Partial<ShaderRadialGradientProps> &
|
|
55
|
-
Partial<ShaderLinearGradientProps>;
|
|
56
|
-
|
|
57
|
-
/** Based on {@link lng.Texture} */
|
|
58
|
-
export interface IRendererTexture {
|
|
59
|
-
props: IRendererTextureProps;
|
|
60
|
-
type: lng.TextureType;
|
|
61
|
-
}
|
|
62
|
-
export interface IRendererTextureProps {}
|
|
63
|
-
|
|
64
|
-
export interface IEventEmitter {
|
|
65
|
-
on: (e: string, cb: (...a: any[]) => void) => void;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
export interface IRendererNodeShaded extends IEventEmitter {
|
|
69
|
-
stage: IRendererStage;
|
|
70
|
-
id: number;
|
|
71
|
-
animate: (
|
|
72
|
-
props: Partial<lng.INodeAnimateProps<any>>,
|
|
73
|
-
settings: Partial<lng.AnimationSettings>,
|
|
74
|
-
) => lng.IAnimationController;
|
|
75
|
-
get absX(): number;
|
|
76
|
-
get absY(): number;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/** Based on {@link lng.INodeProps} */
|
|
80
|
-
export interface IRendererNodeProps
|
|
81
|
-
extends Omit<lng.INodeProps<lng.CoreShaderNode>, 'shader' | 'parent'> {
|
|
82
|
-
shader: IRendererShader | null;
|
|
83
|
-
parent: IRendererNode | null;
|
|
84
|
-
}
|
|
85
|
-
/** Based on {@link lng.INode} */
|
|
86
|
-
export interface IRendererNode extends IRendererNodeShaded, IRendererNodeProps {
|
|
87
|
-
div?: HTMLElement;
|
|
88
|
-
props: IRendererNodeProps;
|
|
89
|
-
renderState: lng.CoreNodeRenderState;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/** Based on {@link lng.ITextNodeProps} */
|
|
93
|
-
export interface IRendererTextNodeProps
|
|
94
|
-
extends Omit<lng.ITextNodeProps, 'shader' | 'parent'> {
|
|
95
|
-
shader: IRendererShader | null;
|
|
96
|
-
parent: IRendererNode | null;
|
|
97
|
-
fontWeight?: string;
|
|
98
|
-
}
|
|
99
|
-
/** Based on {@link lng.ITextNode} */
|
|
100
|
-
export interface IRendererTextNode
|
|
101
|
-
extends IRendererNodeShaded,
|
|
102
|
-
IRendererTextNodeProps {
|
|
103
|
-
div?: HTMLElement;
|
|
104
|
-
props: IRendererTextNodeProps;
|
|
105
|
-
renderState: lng.CoreNodeRenderState;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/** Based on {@link lng.RendererMain} */
|
|
109
|
-
export interface IRendererMain extends IEventEmitter {
|
|
110
|
-
stage: IRendererStage;
|
|
111
|
-
root: IRendererNode;
|
|
112
|
-
createTextNode(props: Partial<IRendererTextNodeProps>): IRendererTextNode;
|
|
113
|
-
createNode(props: Partial<IRendererNodeProps>): IRendererNode;
|
|
114
|
-
createShader(kind: string, props: IRendererShaderProps): IRendererShader;
|
|
115
|
-
createTexture(
|
|
116
|
-
kind: keyof lng.TextureMap,
|
|
117
|
-
props: IRendererTextureProps,
|
|
118
|
-
): IRendererTexture;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
export let renderer: IRendererMain;
|
|
8
|
+
// Global renderer instance: can be either the Lightning or DOM implementation
|
|
9
|
+
export let renderer: lng.RendererMain | DOMRendererMain;
|
|
122
10
|
|
|
123
11
|
export const getRenderer = () => renderer;
|
|
124
12
|
|
|
125
13
|
export function startLightningRenderer(
|
|
126
|
-
options: lng.RendererMainSettings,
|
|
14
|
+
options: lng.RendererMainSettings | DomRendererMainSettings,
|
|
127
15
|
rootId: string | HTMLElement = 'app',
|
|
128
16
|
) {
|
|
129
|
-
|
|
17
|
+
const enableDomRenderer = DOM_RENDERING && Config.domRendererEnabled;
|
|
18
|
+
|
|
19
|
+
renderer = enableDomRenderer
|
|
130
20
|
? new DOMRendererMain(options, rootId)
|
|
131
|
-
:
|
|
21
|
+
: new lng.RendererMain(options, rootId);
|
|
132
22
|
return renderer;
|
|
133
23
|
}
|
|
134
|
-
|
|
24
|
+
|
|
25
|
+
export function loadFonts(fonts: FontLoadOptions[]) {
|
|
26
|
+
const enableDomRenderer = DOM_RENDERING && Config.domRendererEnabled;
|
|
135
27
|
for (const font of fonts) {
|
|
136
28
|
// WebGL — SDF
|
|
137
29
|
if (
|
|
@@ -142,8 +34,12 @@ export function loadFonts(fonts: any[]) {
|
|
|
142
34
|
renderer.stage.loadFont('sdf', font);
|
|
143
35
|
}
|
|
144
36
|
// Canvas — Web
|
|
145
|
-
else if ('fontUrl' in font
|
|
146
|
-
|
|
37
|
+
else if ('fontUrl' in font) {
|
|
38
|
+
if (enableDomRenderer) {
|
|
39
|
+
loadFontToDom(font);
|
|
40
|
+
} else if (renderer.stage.renderer.mode !== 'webgl') {
|
|
41
|
+
renderer.stage.loadFont('canvas', font);
|
|
42
|
+
}
|
|
147
43
|
}
|
|
148
44
|
}
|
|
149
45
|
}
|