@lightningtv/solid 3.1.6 → 3.1.8
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 +54 -15
- 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 +14 -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/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 +98 -35
- 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 +23 -7
- package/src/primitives/Image.tsx +20 -0
- 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
|
}
|
|
@@ -1306,7 +1349,11 @@ export class ElementNode extends Object {
|
|
|
1306
1349
|
if (Config.fontSettings) {
|
|
1307
1350
|
for (const key in Config.fontSettings) {
|
|
1308
1351
|
if (textProps[key] === undefined) {
|
|
1309
|
-
|
|
1352
|
+
let value = Config.fontSettings[key];
|
|
1353
|
+
if (key === 'fontFamily' && textProps['fontWeight'] === undefined) {
|
|
1354
|
+
value = `${value}${Config.fontSettings.fontWeight || ''}`;
|
|
1355
|
+
}
|
|
1356
|
+
textProps[key] = value;
|
|
1310
1357
|
}
|
|
1311
1358
|
}
|
|
1312
1359
|
}
|
|
@@ -1342,8 +1389,7 @@ export class ElementNode extends Object {
|
|
|
1342
1389
|
textProps.lineHeight ||
|
|
1343
1390
|
textProps.fontSize) as number;
|
|
1344
1391
|
}
|
|
1345
|
-
|
|
1346
|
-
textProps.w = textProps.h = undefined;
|
|
1392
|
+
// textProps.w = textProps.h = 0;
|
|
1347
1393
|
}
|
|
1348
1394
|
|
|
1349
1395
|
// Can you put effects on Text nodes? Need to confirm...
|
|
@@ -1352,9 +1398,11 @@ export class ElementNode extends Object {
|
|
|
1352
1398
|
}
|
|
1353
1399
|
|
|
1354
1400
|
isDev && log('Rendering: ', this, props);
|
|
1401
|
+
|
|
1355
1402
|
node.lng = renderer.createTextNode(
|
|
1356
|
-
props as
|
|
1357
|
-
);
|
|
1403
|
+
props as Partial<ITextNodeProps> & Partial<IRendererTextNodeProps>,
|
|
1404
|
+
) as IRendererTextNode;
|
|
1405
|
+
|
|
1358
1406
|
if (parent.requiresLayout()) {
|
|
1359
1407
|
if (!textProps.maxWidth || !textProps.maxHeight) {
|
|
1360
1408
|
node._layoutOnLoad();
|
|
@@ -1390,7 +1438,10 @@ export class ElementNode extends Object {
|
|
|
1390
1438
|
}
|
|
1391
1439
|
|
|
1392
1440
|
isDev && log('Rendering: ', this, props);
|
|
1393
|
-
|
|
1441
|
+
|
|
1442
|
+
node.lng = renderer.createNode(
|
|
1443
|
+
props as Partial<INodeProps<any>> & Partial<IRendererNodeProps>,
|
|
1444
|
+
);
|
|
1394
1445
|
|
|
1395
1446
|
if (node._hasRenderedChildren) {
|
|
1396
1447
|
node._hasRenderedChildren = false;
|
|
@@ -1418,14 +1469,15 @@ export class ElementNode extends Object {
|
|
|
1418
1469
|
|
|
1419
1470
|
if (node.onEvent) {
|
|
1420
1471
|
for (const [name, handler] of Object.entries(node.onEvent)) {
|
|
1421
|
-
node.lng.on
|
|
1472
|
+
if (typeof node.lng.on === 'function') {
|
|
1473
|
+
node.lng.on(name, (_inode, data) => handler.call(node, node, data));
|
|
1474
|
+
}
|
|
1422
1475
|
}
|
|
1423
1476
|
}
|
|
1424
1477
|
|
|
1425
1478
|
// L3 Inspector adds div to the lng object
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
}
|
|
1479
|
+
const div: HTMLElement | undefined = (node.lng as any)?.div;
|
|
1480
|
+
if (div) div.element = node;
|
|
1429
1481
|
|
|
1430
1482
|
if (node._type === NodeType.Element) {
|
|
1431
1483
|
// only element nodes will have children that need rendering
|
|
@@ -1485,7 +1537,14 @@ export function createRawShaderAccessor<T>(key: keyof StyleEffects) {
|
|
|
1485
1537
|
}
|
|
1486
1538
|
|
|
1487
1539
|
export function shaderAccessor<T extends Record<string, any> | number>(
|
|
1488
|
-
key:
|
|
1540
|
+
key:
|
|
1541
|
+
| 'border'
|
|
1542
|
+
| 'shadow'
|
|
1543
|
+
| 'rounded'
|
|
1544
|
+
| 'borderBottom'
|
|
1545
|
+
| 'borderLeft'
|
|
1546
|
+
| 'borderRight'
|
|
1547
|
+
| 'borderTop',
|
|
1489
1548
|
) {
|
|
1490
1549
|
return {
|
|
1491
1550
|
set(this: ElementNode, value: T) {
|
|
@@ -1494,7 +1553,7 @@ export function shaderAccessor<T extends Record<string, any> | number>(
|
|
|
1494
1553
|
this._effects[key] = value;
|
|
1495
1554
|
|
|
1496
1555
|
let animationSettings: AnimationSettings | undefined;
|
|
1497
|
-
if (this.lng.shader?.
|
|
1556
|
+
if (this.lng.shader?.props) {
|
|
1498
1557
|
target = this.lng.shader.props;
|
|
1499
1558
|
const transitionKey = key === 'rounded' ? 'borderRadius' : key;
|
|
1500
1559
|
if (
|
|
@@ -1543,6 +1602,10 @@ if (isDev) {
|
|
|
1543
1602
|
|
|
1544
1603
|
Object.defineProperties(ElementNode.prototype, {
|
|
1545
1604
|
border: shaderAccessor<BorderStyle>('border'),
|
|
1605
|
+
borderBottom: shaderAccessor<BorderStyle>('borderBottom'),
|
|
1606
|
+
borderTop: shaderAccessor<BorderStyle>('borderTop'),
|
|
1607
|
+
borderLeft: shaderAccessor<BorderStyle>('borderLeft'),
|
|
1608
|
+
borderRight: shaderAccessor<BorderStyle>('borderRight'),
|
|
1546
1609
|
shadow: shaderAccessor<ShadowProps>('shadow'),
|
|
1547
1610
|
rounded: shaderAccessor<BorderRadius>('rounded'),
|
|
1548
1611
|
// 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
|
}
|