@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.
- package/.editorconfig +7 -7
- package/.eslintignore +1 -1
- package/.eslintrc.cjs +65 -65
- package/.github/workflows/comment-lint-results.yml +124 -124
- package/.github/workflows/comment-test-results.yml +108 -108
- package/.github/workflows/deploy-docs.yml +27 -27
- package/.github/workflows/run-blits-tests.yml +141 -141
- package/.github/workflows/run-lint.yml +127 -127
- package/.husky/pre-commit +1 -1
- package/.vscode/extensions.json +7 -7
- package/.vscode/settings.json +9 -9
- package/CHANGELOG.md +1019 -1005
- package/COPYING +1 -0
- package/LICENSE +202 -202
- package/NOTICE +12 -12
- package/README.md +33 -33
- package/bin/index.js +8 -8
- package/blits.d.ts +6 -6
- package/docs/README.md +19 -19
- package/docs/_sidebar.md +37 -37
- package/docs/built-in/directives.md +50 -50
- package/docs/built-in/for-loop.md +203 -203
- package/docs/built-in/layout.md +168 -168
- package/docs/components/component_state.md +90 -90
- package/docs/components/computed_properties.md +45 -45
- package/docs/components/lifecycle_events.md +42 -42
- package/docs/components/methods.md +45 -45
- package/docs/components/props.md +56 -56
- package/docs/components/user_input.md +186 -186
- package/docs/components/utility_methods.md +320 -320
- package/docs/components/watchers.md +34 -34
- package/docs/essentials/application_root.md +19 -19
- package/docs/essentials/components.md +68 -68
- package/docs/essentials/displaying_images.md +67 -67
- package/docs/essentials/displaying_text.md +135 -135
- package/docs/essentials/element_attributes.md +195 -195
- package/docs/essentials/settings.md +117 -117
- package/docs/essentials/template_syntax.md +83 -83
- package/docs/getting_started/file_structure.md +58 -58
- package/docs/getting_started/getting_started.md +45 -45
- package/docs/getting_started/intro.md +20 -20
- package/docs/index.html +47 -47
- package/docs/performance/lazy-loading.md +161 -161
- package/docs/plugins/global_app_state.md +98 -98
- package/docs/plugins/language.md +172 -172
- package/docs/plugins/text-to-speech-announcer.md +119 -119
- package/docs/plugins/theme.md +176 -176
- package/docs/router/basics.md +175 -175
- package/docs/router/hooks.md +70 -70
- package/docs/router/transitions.md +146 -146
- package/docs/sidebar.json +171 -171
- package/docs/transitions_animations/transitions.md +150 -150
- package/index.d.ts +1099 -1099
- package/index.js +28 -28
- package/jsconfig.json +12 -12
- package/package.json +56 -56
- package/public/assets/fps_sprite.base64.js +1 -1
- package/scripts/postpublish.js +59 -59
- package/scripts/prepublishOnly.js +84 -84
- package/scripts/prepush.js +78 -78
- package/src/announcer/announcer.js +162 -162
- package/src/announcer/speechSynthesis.js +107 -107
- package/src/application.js +100 -100
- package/src/component/base/announcer.js +27 -27
- package/src/component/base/events.js +69 -69
- package/src/component/base/index.js +33 -33
- package/src/component/base/methods.js +244 -244
- package/src/component/base/router.js +41 -41
- package/src/component/base/timeouts_intervals.js +99 -99
- package/src/component/base/utils.js +72 -72
- package/src/component/setup/computed.js +48 -48
- package/src/component/setup/index.js +62 -62
- package/src/component/setup/input.js +30 -30
- package/src/component/setup/methods.js +37 -37
- package/src/component/setup/props.js +62 -62
- package/src/component/setup/props.test.js +238 -238
- package/src/component/setup/routes.js +42 -42
- package/src/component/setup/state.js +59 -59
- package/src/component/setup/watch.js +35 -35
- package/src/component.js +437 -437
- package/src/component.test.js +388 -388
- package/src/components/Circle.js +73 -73
- package/src/components/Circle.orig.js +31 -31
- package/src/components/FPScounter.js +1510 -1510
- package/src/components/FPScounter.orig.js +121 -121
- package/src/components/RouterView.js +81 -81
- package/src/components/RouterView.orig.js +54 -54
- package/src/components/Sprite.js +94 -94
- package/src/components/Sprite.orig.js +58 -58
- package/src/components/index.js +28 -28
- package/src/components/index.orig.js +28 -28
- package/src/constants.js +21 -21
- package/src/engine.js +1 -1
- package/src/engines/L3/element.js +744 -744
- package/src/engines/L3/element.test.js +579 -579
- package/src/engines/L3/fontLoader.js +38 -38
- package/src/engines/L3/index.js +7 -7
- package/src/engines/L3/launch.js +123 -123
- package/src/engines/L3/shaderLoader.js +12 -12
- package/src/engines/index.js +1 -1
- package/src/focus.js +90 -90
- package/src/helpers/deepEqualArray.js +50 -50
- package/src/helpers/deepEqualArray.test.js +127 -127
- package/src/helpers/fetchJson.js +34 -34
- package/src/helpers/sequence.js +26 -26
- package/src/launch.js +123 -123
- package/src/lib/blitsfileconverter/blitsfileconverter.js +52 -52
- package/src/lib/codegenerator/generator.js +788 -788
- package/src/lib/codegenerator/generator.test.js +3801 -3801
- package/src/lib/colors/colors.js +92 -92
- package/src/lib/colors/colors.test.js +290 -290
- package/src/lib/colors/htmlColors.js +168 -168
- package/src/lib/componentId.js +49 -49
- package/src/lib/componentId.test.js +84 -84
- package/src/lib/eventListeners.js +123 -123
- package/src/lib/eventListeners.test.js +236 -236
- package/src/lib/hooks.js +59 -59
- package/src/lib/lifecycle.js +85 -85
- package/src/lib/log.js +117 -117
- package/src/lib/precompiler/precompiler.js +73 -73
- package/src/lib/reactivity/effect.js +93 -93
- package/src/lib/reactivity/effect.test.js +35 -35
- package/src/lib/reactivity/reactive.js +208 -208
- package/src/lib/reactivity/reactive.test.js +27 -27
- package/src/lib/reactivityguard/computedprops.js +218 -218
- package/src/lib/symbols.js +108 -108
- package/src/lib/templateparser/parser.js +386 -386
- package/src/lib/templateparser/parser.test.js +1411 -1411
- package/src/lib/utils.js +27 -27
- package/src/plugin.js +27 -27
- package/src/plugins/appstate.js +26 -26
- package/src/plugins/index.js +20 -20
- package/src/plugins/language.js +152 -152
- package/src/plugins/log.js +25 -25
- package/src/plugins/theme.js +94 -94
- package/src/router/router.js +514 -514
- package/src/router/router.test.js +473 -473
- package/src/router/transitions/fadeIn.js +27 -27
- package/src/router/transitions/fadeInOut.js +33 -33
- package/src/router/transitions/index.js +21 -21
- package/src/router/transitions/slideIn.js +28 -28
- package/src/router/transitions/slideInOut.js +33 -33
- package/src/settings.js +40 -40
- package/vite/blitsFileConverter.js +67 -67
- package/vite/index.js +28 -28
- package/vite/msdfGenerator.js +269 -269
- package/vite/preCompiler.js +42 -42
- package/vite/reactivityGuard.js +45 -45
- 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
|
+
```
|