@lightningjs/blits 1.30.0 → 1.30.2

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 (149) hide show
  1. package/.editorconfig +7 -7
  2. package/.eslintignore +1 -1
  3. package/.eslintrc.cjs +65 -65
  4. package/.github/workflows/comment-lint-results.yml +124 -124
  5. package/.github/workflows/comment-test-results.yml +108 -108
  6. package/.github/workflows/deploy-docs.yml +27 -27
  7. package/.github/workflows/run-blits-tests.yml +141 -141
  8. package/.github/workflows/run-lint.yml +127 -127
  9. package/.husky/pre-commit +1 -1
  10. package/.vscode/extensions.json +7 -7
  11. package/.vscode/settings.json +9 -9
  12. package/CHANGELOG.md +1019 -1005
  13. package/COPYING +1 -0
  14. package/LICENSE +202 -202
  15. package/NOTICE +12 -12
  16. package/README.md +33 -33
  17. package/bin/index.js +8 -8
  18. package/blits.d.ts +6 -6
  19. package/docs/README.md +19 -19
  20. package/docs/_sidebar.md +37 -37
  21. package/docs/built-in/directives.md +50 -50
  22. package/docs/built-in/for-loop.md +203 -203
  23. package/docs/built-in/layout.md +168 -168
  24. package/docs/components/component_state.md +90 -90
  25. package/docs/components/computed_properties.md +45 -45
  26. package/docs/components/lifecycle_events.md +42 -42
  27. package/docs/components/methods.md +45 -45
  28. package/docs/components/props.md +56 -56
  29. package/docs/components/user_input.md +186 -186
  30. package/docs/components/utility_methods.md +320 -320
  31. package/docs/components/watchers.md +34 -34
  32. package/docs/essentials/application_root.md +19 -19
  33. package/docs/essentials/components.md +68 -68
  34. package/docs/essentials/displaying_images.md +67 -67
  35. package/docs/essentials/displaying_text.md +135 -135
  36. package/docs/essentials/element_attributes.md +195 -195
  37. package/docs/essentials/settings.md +117 -117
  38. package/docs/essentials/template_syntax.md +83 -83
  39. package/docs/getting_started/file_structure.md +58 -58
  40. package/docs/getting_started/getting_started.md +45 -45
  41. package/docs/getting_started/intro.md +20 -20
  42. package/docs/index.html +47 -47
  43. package/docs/performance/lazy-loading.md +161 -161
  44. package/docs/plugins/global_app_state.md +98 -98
  45. package/docs/plugins/language.md +172 -172
  46. package/docs/plugins/text-to-speech-announcer.md +119 -119
  47. package/docs/plugins/theme.md +176 -176
  48. package/docs/router/basics.md +175 -175
  49. package/docs/router/hooks.md +70 -70
  50. package/docs/router/transitions.md +146 -146
  51. package/docs/sidebar.json +171 -171
  52. package/docs/transitions_animations/transitions.md +150 -150
  53. package/index.d.ts +1099 -1099
  54. package/index.js +28 -28
  55. package/jsconfig.json +12 -12
  56. package/package.json +56 -56
  57. package/public/assets/fps_sprite.base64.js +1 -1
  58. package/scripts/postpublish.js +59 -59
  59. package/scripts/prepublishOnly.js +84 -84
  60. package/scripts/prepush.js +78 -78
  61. package/src/announcer/announcer.js +162 -162
  62. package/src/announcer/speechSynthesis.js +107 -107
  63. package/src/application.js +100 -100
  64. package/src/component/base/announcer.js +27 -27
  65. package/src/component/base/events.js +69 -69
  66. package/src/component/base/index.js +33 -33
  67. package/src/component/base/methods.js +244 -244
  68. package/src/component/base/router.js +41 -41
  69. package/src/component/base/timeouts_intervals.js +99 -99
  70. package/src/component/base/utils.js +72 -72
  71. package/src/component/setup/computed.js +48 -48
  72. package/src/component/setup/index.js +62 -62
  73. package/src/component/setup/input.js +30 -30
  74. package/src/component/setup/methods.js +37 -37
  75. package/src/component/setup/props.js +62 -62
  76. package/src/component/setup/props.test.js +238 -238
  77. package/src/component/setup/routes.js +42 -42
  78. package/src/component/setup/state.js +59 -59
  79. package/src/component/setup/watch.js +35 -35
  80. package/src/component.js +437 -437
  81. package/src/component.test.js +388 -388
  82. package/src/components/Circle.js +73 -73
  83. package/src/components/Circle.orig.js +31 -31
  84. package/src/components/FPScounter.js +1510 -1510
  85. package/src/components/FPScounter.orig.js +121 -121
  86. package/src/components/RouterView.js +81 -81
  87. package/src/components/RouterView.orig.js +54 -54
  88. package/src/components/Sprite.js +94 -94
  89. package/src/components/Sprite.orig.js +58 -58
  90. package/src/components/index.js +28 -28
  91. package/src/components/index.orig.js +28 -28
  92. package/src/constants.js +21 -21
  93. package/src/engine.js +1 -1
  94. package/src/engines/L3/element.js +744 -744
  95. package/src/engines/L3/element.test.js +579 -579
  96. package/src/engines/L3/fontLoader.js +38 -38
  97. package/src/engines/L3/index.js +7 -7
  98. package/src/engines/L3/launch.js +123 -123
  99. package/src/engines/L3/shaderLoader.js +12 -12
  100. package/src/engines/index.js +1 -1
  101. package/src/focus.js +90 -90
  102. package/src/helpers/deepEqualArray.js +50 -50
  103. package/src/helpers/deepEqualArray.test.js +127 -127
  104. package/src/helpers/fetchJson.js +34 -34
  105. package/src/helpers/sequence.js +26 -26
  106. package/src/launch.js +123 -123
  107. package/src/lib/blitsfileconverter/blitsfileconverter.js +52 -52
  108. package/src/lib/codegenerator/generator.js +788 -788
  109. package/src/lib/codegenerator/generator.test.js +3801 -3801
  110. package/src/lib/colors/colors.js +92 -92
  111. package/src/lib/colors/colors.test.js +290 -290
  112. package/src/lib/colors/htmlColors.js +168 -168
  113. package/src/lib/componentId.js +49 -49
  114. package/src/lib/componentId.test.js +84 -84
  115. package/src/lib/eventListeners.js +123 -123
  116. package/src/lib/eventListeners.test.js +236 -236
  117. package/src/lib/hooks.js +59 -59
  118. package/src/lib/lifecycle.js +85 -85
  119. package/src/lib/log.js +117 -117
  120. package/src/lib/precompiler/precompiler.js +73 -73
  121. package/src/lib/reactivity/effect.js +93 -93
  122. package/src/lib/reactivity/effect.test.js +35 -35
  123. package/src/lib/reactivity/reactive.js +208 -208
  124. package/src/lib/reactivity/reactive.test.js +27 -27
  125. package/src/lib/reactivityguard/computedprops.js +218 -218
  126. package/src/lib/symbols.js +108 -108
  127. package/src/lib/templateparser/parser.js +386 -386
  128. package/src/lib/templateparser/parser.test.js +1411 -1411
  129. package/src/lib/utils.js +27 -27
  130. package/src/plugin.js +27 -27
  131. package/src/plugins/appstate.js +26 -26
  132. package/src/plugins/index.js +20 -20
  133. package/src/plugins/language.js +152 -152
  134. package/src/plugins/log.js +25 -25
  135. package/src/plugins/theme.js +94 -94
  136. package/src/router/router.js +514 -514
  137. package/src/router/router.test.js +473 -473
  138. package/src/router/transitions/fadeIn.js +27 -27
  139. package/src/router/transitions/fadeInOut.js +33 -33
  140. package/src/router/transitions/index.js +21 -21
  141. package/src/router/transitions/slideIn.js +28 -28
  142. package/src/router/transitions/slideInOut.js +33 -33
  143. package/src/settings.js +40 -40
  144. package/vite/blitsFileConverter.js +67 -67
  145. package/vite/index.js +28 -28
  146. package/vite/msdfGenerator.js +269 -269
  147. package/vite/preCompiler.js +42 -42
  148. package/vite/reactivityGuard.js +45 -45
  149. package/vscode/data/template-attributes.json +589 -589
@@ -1,186 +1,186 @@
1
- # Handling User Input
2
-
3
- In order to allow users to interact with your app, you will want to capture and handle _user input_. If you are developing a TV based app this will often be key input via a remote control.
4
-
5
- Blits offers an intuitive and straightforward interface to handle key input in Components.
6
-
7
- ## Focus
8
-
9
- Before diving into the specifics of key handling, it is important to understand the basic concept of _focus_.
10
-
11
- In a Blits app, there is always _one_ Component that has the focus. By default, this will be the root Application component.
12
-
13
- The component that has focus, is the one that is responsible for handling the user input at that moment.
14
-
15
- For example, when a user clicks the _right_ or _left_ button while a _Poster Component_ has focus, it is that instance of the Poster Component that will _receive_ the first key press event.
16
-
17
- ## Configuring Input Handling
18
-
19
- Within the Component configuration object, the `input` key is used to define how the component should react to specific key presses when it has focus. The `input` key should be an `object literal` of `functions` for each input event that the component wants to handle.
20
-
21
- Each function corresponds to a _key press name_, such as `up`, `down`, `enter`, `space`, `back`, `1`, `2`, `a` etc and each function defined in the `input` object, receives the full `InputEvent` object as its first argument.
22
-
23
- ```js
24
- export default Blits.Component('MyComponent', {
25
- // ...
26
- input: {
27
- up(e) {
28
- // Logic to execute when users press up
29
- },
30
- down(e) {
31
- // Logic to execute when users press down
32
- },
33
- enter(e) {
34
- // Logic to execute when users press enter
35
- },
36
- }
37
- }
38
- ```
39
-
40
- ## Catch-All Handling
41
-
42
- To allow a focused component to respond to any key and act as a _catch-all_, you can add an `any()` function to the input object. As it receives the `InputEvent` object as the first argument, you can abstract the key press in there and handle (or ignore) it as you wish.
43
-
44
- ```javascript
45
- {
46
- input: {
47
- any(e) {
48
- // Logic to execute for any key press
49
- },
50
- }
51
- }
52
- ```
53
-
54
- ## Event Handling Chain
55
-
56
- If the currently focused component does not handle a key press, Blits will traverse up the component hierarchy, checking for any _parent_ component that does have a function defined for that key press in the `input`-key. This input event handling chain continues until it reaches the root Application component.
57
-
58
- When a component handles a key press by having a corresponding function specified, said component receives focus, and the event handling chain stops by default. However, if you want the input event to propagate up the hierarchy further, you can move the focus to the parent element and pass the `InputEvent` object on in that function call.
59
-
60
- ```javascript
61
- {
62
- input: {
63
- enter() {
64
- // Give focus to the parent
65
- this.parent.focus();
66
- },
67
- back(e) {
68
- // Give focus to the parent and let the user input event bubble
69
- this.parent.focus(e);
70
- },
71
- }
72
- }
73
- ```
74
-
75
- ## Intercepting key input
76
-
77
- In addition to the Event handling chain explained above. Blits offers the option to _intercept_ key presses at the root level of the Application, before they reach the currently focused Component. This can be useful in certain situation where you want to globally disable all key presses, or when implementing an override key press handler.
78
-
79
- The `intercept()` input-method can only be implemented in the `Blits.Application`-component. When present, the method acts as a _catch-all_ method, and will be executed for _all_ key presses. It receives the `KeyboardEvent` as its argument, allowing you to execute logic based on the key being pressed.
80
-
81
- Only when the `intercept()` input-method returns the `KeyboardEvent` (possibly modified), the keypress will continue to be handled (by the currently focused Component).
82
-
83
- The `intercept`-method can also be an asynchronous method.
84
-
85
- ## Key-up handling
86
-
87
- The functions specified in the `input` configuration are invoked when a key is _pressed down_ (i.e. the `keydown` event listener). But sometimes you may also want to execute some logic when a key is _released_ (i.e. the `keyup` event listener).
88
-
89
- Instead of introducing a separate key on the Component configuration object for key release callbacks, Blits relies on the concept that a `keyup` event is always preceded by a `keydown` event.
90
-
91
- Following this logic, whenever you return a function in an input (key down) handler, this function will be executed upon release (i.e. the `keyup` event) of that key .
92
-
93
- When an input key is being a hold down, it will execute the key down handler multiple times. Upon key release, only the last returned key up callback function will be executed.
94
-
95
-
96
- ```javascript
97
- Blits.Component('MyComponent', {
98
- //
99
- input: {
100
- enter() {
101
- // execute logic on key down
102
- this.pressedEnter = true
103
- return () => {
104
- // execute logic on key up
105
- this.pressedEnter = false
106
- }
107
- },
108
- space(e) {
109
- // not logic on key down
110
- return () => {
111
- // only execute logic on key up
112
- console.log('Space key released')
113
- }
114
- },
115
- left() {
116
- // some logic on key down here ..
117
- this.leftHold = true
118
- // return a reference to a Component method
119
- // (instead of creating a new function on the fly)
120
- return this.leftKeyUp
121
- }
122
- },
123
- methods: {
124
- leftKeyUp() {
125
- console.log('Left key up')
126
- this.leftHold = false
127
- }
128
- }
129
- }
130
- ```
131
-
132
- ## Custom Keycode mapping
133
-
134
- Blits comes with a default keycode mapping. This mapping is a sensible default that works in your desktop browser and with most RDK based devices.
135
-
136
- But it's possible that the keycodes and mapping of your target device are slightly or even completely different.
137
-
138
- In Blits, you can easily configure the key mapping to match your needs. In the `src/index.js` file where we instantiate the App via the `Blits.Launch` function, we can add an extra key, called `keymap`, to the _settings object_.
139
-
140
- The `keymap` should contain an object literal, where you map a `key` or `keyCode` (from the `KeyboardEvent`) to an event name that you can use in your Components.
141
-
142
- > You can use a site like [keyjs.dev](https://keyjs.dev/) to find the appropriate key and keyCode for your device
143
-
144
- ```js
145
- // src/index.js
146
- Blits.Launch(App, 'app', {
147
- w: 1920,
148
- h: 1080,
149
- //...
150
- keymap: {
151
- // switch left and right using the key
152
- ArrowLeft: 'right',
153
- ArrowRight: 'left',
154
- // switch up and down using the keyCode
155
- 38: 'down',
156
- 40: 'up',
157
- // register new handlers
158
- '.': 'dot', // dot() can now be used in the input object
159
- // key code for letter 's'
160
- 83: 'search' // search() can now be used in the input object
161
- }
162
- })
163
- ```
164
-
165
- The custom keymap object will be merged with the default key mapping, that looks like this:
166
-
167
- ```js
168
- const defaultKeyMap = {
169
- ArrowLeft: 'left',
170
- ArrowRight: 'right',
171
- ArrowUp: 'up',
172
- ArrowDown: 'down',
173
- Enter: 'enter',
174
- ' ': 'space',
175
- Backspace: 'back',
176
- Escape: 'escape',
177
- 37: 'left',
178
- 39: 'right',
179
- 38: 'up',
180
- 40: 'down',
181
- 13: 'enter',
182
- 32: 'space',
183
- 8: 'back',
184
- 27: 'escape',
185
- }
186
- ```
1
+ # Handling User Input
2
+
3
+ In order to allow users to interact with your app, you will want to capture and handle _user input_. If you are developing a TV based app this will often be key input via a remote control.
4
+
5
+ Blits offers an intuitive and straightforward interface to handle key input in Components.
6
+
7
+ ## Focus
8
+
9
+ Before diving into the specifics of key handling, it is important to understand the basic concept of _focus_.
10
+
11
+ In a Blits app, there is always _one_ Component that has the focus. By default, this will be the root Application component.
12
+
13
+ The component that has focus, is the one that is responsible for handling the user input at that moment.
14
+
15
+ For example, when a user clicks the _right_ or _left_ button while a _Poster Component_ has focus, it is that instance of the Poster Component that will _receive_ the first key press event.
16
+
17
+ ## Configuring Input Handling
18
+
19
+ Within the Component configuration object, the `input` key is used to define how the component should react to specific key presses when it has focus. The `input` key should be an `object literal` of `functions` for each input event that the component wants to handle.
20
+
21
+ Each function corresponds to a _key press name_, such as `up`, `down`, `enter`, `space`, `back`, `1`, `2`, `a` etc and each function defined in the `input` object, receives the full `InputEvent` object as its first argument.
22
+
23
+ ```js
24
+ export default Blits.Component('MyComponent', {
25
+ // ...
26
+ input: {
27
+ up(e) {
28
+ // Logic to execute when users press up
29
+ },
30
+ down(e) {
31
+ // Logic to execute when users press down
32
+ },
33
+ enter(e) {
34
+ // Logic to execute when users press enter
35
+ },
36
+ }
37
+ }
38
+ ```
39
+
40
+ ## Catch-All Handling
41
+
42
+ To allow a focused component to respond to any key and act as a _catch-all_, you can add an `any()` function to the input object. As it receives the `InputEvent` object as the first argument, you can abstract the key press in there and handle (or ignore) it as you wish.
43
+
44
+ ```javascript
45
+ {
46
+ input: {
47
+ any(e) {
48
+ // Logic to execute for any key press
49
+ },
50
+ }
51
+ }
52
+ ```
53
+
54
+ ## Event Handling Chain
55
+
56
+ If the currently focused component does not handle a key press, Blits will traverse up the component hierarchy, checking for any _parent_ component that does have a function defined for that key press in the `input`-key. This input event handling chain continues until it reaches the root Application component.
57
+
58
+ When a component handles a key press by having a corresponding function specified, said component receives focus, and the event handling chain stops by default. However, if you want the input event to propagate up the hierarchy further, you can move the focus to the parent element and pass the `InputEvent` object on in that function call.
59
+
60
+ ```javascript
61
+ {
62
+ input: {
63
+ enter() {
64
+ // Give focus to the parent
65
+ this.parent.focus();
66
+ },
67
+ back(e) {
68
+ // Give focus to the parent and let the user input event bubble
69
+ this.parent.focus(e);
70
+ },
71
+ }
72
+ }
73
+ ```
74
+
75
+ ## Intercepting key input
76
+
77
+ In addition to the Event handling chain explained above. Blits offers the option to _intercept_ key presses at the root level of the Application, before they reach the currently focused Component. This can be useful in certain situation where you want to globally disable all key presses, or when implementing an override key press handler.
78
+
79
+ The `intercept()` input-method can only be implemented in the `Blits.Application`-component. When present, the method acts as a _catch-all_ method, and will be executed for _all_ key presses. It receives the `KeyboardEvent` as its argument, allowing you to execute logic based on the key being pressed.
80
+
81
+ Only when the `intercept()` input-method returns the `KeyboardEvent` (possibly modified), the keypress will continue to be handled (by the currently focused Component).
82
+
83
+ The `intercept`-method can also be an asynchronous method.
84
+
85
+ ## Key-up handling
86
+
87
+ The functions specified in the `input` configuration are invoked when a key is _pressed down_ (i.e. the `keydown` event listener). But sometimes you may also want to execute some logic when a key is _released_ (i.e. the `keyup` event listener).
88
+
89
+ Instead of introducing a separate key on the Component configuration object for key release callbacks, Blits relies on the concept that a `keyup` event is always preceded by a `keydown` event.
90
+
91
+ Following this logic, whenever you return a function in an input (key down) handler, this function will be executed upon release (i.e. the `keyup` event) of that key .
92
+
93
+ When an input key is being a hold down, it will execute the key down handler multiple times. Upon key release, only the last returned key up callback function will be executed.
94
+
95
+
96
+ ```javascript
97
+ Blits.Component('MyComponent', {
98
+ //
99
+ input: {
100
+ enter() {
101
+ // execute logic on key down
102
+ this.pressedEnter = true
103
+ return () => {
104
+ // execute logic on key up
105
+ this.pressedEnter = false
106
+ }
107
+ },
108
+ space(e) {
109
+ // not logic on key down
110
+ return () => {
111
+ // only execute logic on key up
112
+ console.log('Space key released')
113
+ }
114
+ },
115
+ left() {
116
+ // some logic on key down here ..
117
+ this.leftHold = true
118
+ // return a reference to a Component method
119
+ // (instead of creating a new function on the fly)
120
+ return this.leftKeyUp
121
+ }
122
+ },
123
+ methods: {
124
+ leftKeyUp() {
125
+ console.log('Left key up')
126
+ this.leftHold = false
127
+ }
128
+ }
129
+ }
130
+ ```
131
+
132
+ ## Custom Keycode mapping
133
+
134
+ Blits comes with a default keycode mapping. This mapping is a sensible default that works in your desktop browser and with most RDK based devices.
135
+
136
+ But it's possible that the keycodes and mapping of your target device are slightly or even completely different.
137
+
138
+ In Blits, you can easily configure the key mapping to match your needs. In the `src/index.js` file where we instantiate the App via the `Blits.Launch` function, we can add an extra key, called `keymap`, to the _settings object_.
139
+
140
+ The `keymap` should contain an object literal, where you map a `key` or `keyCode` (from the `KeyboardEvent`) to an event name that you can use in your Components.
141
+
142
+ > You can use a site like [keyjs.dev](https://keyjs.dev/) to find the appropriate key and keyCode for your device
143
+
144
+ ```js
145
+ // src/index.js
146
+ Blits.Launch(App, 'app', {
147
+ w: 1920,
148
+ h: 1080,
149
+ //...
150
+ keymap: {
151
+ // switch left and right using the key
152
+ ArrowLeft: 'right',
153
+ ArrowRight: 'left',
154
+ // switch up and down using the keyCode
155
+ 38: 'down',
156
+ 40: 'up',
157
+ // register new handlers
158
+ '.': 'dot', // dot() can now be used in the input object
159
+ // key code for letter 's'
160
+ 83: 'search' // search() can now be used in the input object
161
+ }
162
+ })
163
+ ```
164
+
165
+ The custom keymap object will be merged with the default key mapping, that looks like this:
166
+
167
+ ```js
168
+ const defaultKeyMap = {
169
+ ArrowLeft: 'left',
170
+ ArrowRight: 'right',
171
+ ArrowUp: 'up',
172
+ ArrowDown: 'down',
173
+ Enter: 'enter',
174
+ ' ': 'space',
175
+ Backspace: 'back',
176
+ Escape: 'escape',
177
+ 37: 'left',
178
+ 39: 'right',
179
+ 38: 'up',
180
+ 40: 'down',
181
+ 13: 'enter',
182
+ 32: 'space',
183
+ 8: 'back',
184
+ 27: 'escape',
185
+ }
186
+ ```