@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.
Files changed (51) hide show
  1. package/dist/src/core/animation.d.ts +1 -1
  2. package/dist/src/core/animation.js.map +1 -1
  3. package/dist/src/core/config.d.ts +2 -2
  4. package/dist/src/core/config.js.map +1 -1
  5. package/dist/src/core/{domRenderer.d.ts → dom-renderer/domRenderer.d.ts} +30 -7
  6. package/dist/src/core/{domRenderer.js → dom-renderer/domRenderer.js} +633 -122
  7. package/dist/src/core/dom-renderer/domRenderer.js.map +1 -0
  8. package/dist/src/core/dom-renderer/domRendererTypes.d.ts +111 -0
  9. package/dist/src/core/dom-renderer/domRendererTypes.js +2 -0
  10. package/dist/src/core/dom-renderer/domRendererTypes.js.map +1 -0
  11. package/dist/src/core/dom-renderer/domRendererUtils.d.ts +23 -0
  12. package/dist/src/core/dom-renderer/domRendererUtils.js +231 -0
  13. package/dist/src/core/dom-renderer/domRendererUtils.js.map +1 -0
  14. package/dist/src/core/elementNode.d.ts +8 -8
  15. package/dist/src/core/elementNode.js +56 -16
  16. package/dist/src/core/elementNode.js.map +1 -1
  17. package/dist/src/core/index.d.ts +4 -2
  18. package/dist/src/core/index.js +1 -2
  19. package/dist/src/core/index.js.map +1 -1
  20. package/dist/src/core/intrinsicTypes.d.ts +16 -6
  21. package/dist/src/core/lightningInit.d.ts +7 -89
  22. package/dist/src/core/lightningInit.js +13 -5
  23. package/dist/src/core/lightningInit.js.map +1 -1
  24. package/dist/src/core/shaders.d.ts +12 -11
  25. package/dist/src/core/shaders.js +0 -90
  26. package/dist/src/core/shaders.js.map +1 -1
  27. package/dist/src/primitives/Grid.jsx +2 -2
  28. package/dist/src/primitives/Grid.jsx.map +1 -1
  29. package/dist/src/primitives/Image.jsx +18 -0
  30. package/dist/src/primitives/Image.jsx.map +1 -1
  31. package/dist/src/primitives/Virtual.jsx +31 -7
  32. package/dist/src/primitives/Virtual.jsx.map +1 -1
  33. package/dist/src/render.d.ts +3 -3
  34. package/dist/src/render.js.map +1 -1
  35. package/dist/tsconfig.tsbuildinfo +1 -1
  36. package/package.json +2 -2
  37. package/src/core/animation.ts +6 -3
  38. package/src/core/config.ts +5 -2
  39. package/src/core/{domRenderer.ts → dom-renderer/domRenderer.ts} +738 -164
  40. package/src/core/dom-renderer/domRendererTypes.ts +150 -0
  41. package/src/core/dom-renderer/domRendererUtils.ts +291 -0
  42. package/src/core/elementNode.ts +102 -36
  43. package/src/core/index.ts +4 -2
  44. package/src/core/intrinsicTypes.ts +22 -6
  45. package/src/core/lightningInit.ts +20 -124
  46. package/src/core/shaders.ts +17 -110
  47. package/src/primitives/Grid.tsx +8 -7
  48. package/src/primitives/Image.tsx +20 -0
  49. package/src/primitives/Virtual.tsx +32 -7
  50. package/src/render.ts +2 -1
  51. package/dist/src/core/domRenderer.js.map +0 -1
@@ -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 (renderer.stage.reprocessUpdates) {
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
- props[prefix] = obj;
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
- props[`${prefix}-${transformedKey}`] = value;
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
- | Partial<ElementNode>
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?: BorderStyle;
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?: BorderStyle;
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?: BorderStyle;
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?: BorderStyle;
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?.program) {
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 (Config.rendererOptions?.inspector) {
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) = value;
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
- renderer.stage.reprocessUpdates?.();
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 (this[key as keyof Styles] === undefined) {
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
- textProps[key] = Config.fontSettings[key];
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 unknown as IRendererTextNodeProps,
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
- node.lng = renderer.createNode(props as IRendererNodeProps);
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(name, (_inode, data) => handler.call(node, node, data));
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
- if (node.lng?.div) {
1427
- node.lng.div.element = node;
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: 'border' | 'shadow' | 'rounded',
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?.program) {
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 './intrinsicTypes.js';
6
- export * from './focusKeyTypes.js';
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: number;
28
- color: number | string;
29
- gap?: number;
30
- fill?: number | string;
31
- align?: number | 'inside' | 'center' | 'outside';
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
- ShaderBorderPrefixedProps,
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
- /** Based on {@link lng.CoreRenderer} */
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
- renderer = DOM_RENDERING
17
+ const enableDomRenderer = DOM_RENDERING && Config.domRendererEnabled;
18
+
19
+ renderer = enableDomRenderer
130
20
  ? new DOMRendererMain(options, rootId)
131
- : (new lng.RendererMain(options, rootId) as any as IRendererMain);
21
+ : new lng.RendererMain(options, rootId);
132
22
  return renderer;
133
23
  }
134
- export function loadFonts(fonts: any[]) {
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 && renderer.stage.renderer.mode !== 'webgl') {
146
- renderer.stage.loadFont('canvas', font);
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
  }