kyle's fork
pull requests have long gone ignored at the base repo, so I'm keeping this as my own up-to-date branch. Feel free to use this as a more up-to-date version of the keyboard component. Tested with A-Frame 1.3.0! Needs some further upkeep, but open to pull requests.
aframe-super-keyboard
Lightweight, functional, and fully customizable keyboard for VR
For A-Frame v0.8.2+.
API
Property | Description | Default Value |
---|---|---|
align | Input box text alignment (left, center, right) | 'left' |
blinkingSpeed | Speed of the cursor. Duration in ms (less is faster) | 400 |
filters | Text filters to apply (see next section) | [none] |
font | Input box font | 'aileronsemibold' |
hand | Selector of cursor entity (e.g., '#rightHand'). | [cursor], [vive-controls], [tracked-controls], [oculus-touch-controls], [windows-motion-controls], [hand-controls], [daydream-controls] [cursor] > [raycaster]. You will need to apply the cursor component to this entity for now. If this entity does not have a raycaster, one will be automatically set for you with the correct raycaster.objects property respective for the keyboard. This entity needs a cursor component. laser-controls can handle for you, if you are specifying your own cursor for a VR controller, make sure to specify cursor.upEvents and cursor.downEvents . |
imagePath | Keyboard image folder path | '.' (current directory) |
inputColor | Input box font color | #6699ff |
interval | Throttling speed for calculating key hover changes (ms) | 50 |
keyBgColor | Key background color (they are composited in additive mode, so #000 is invisible) | #000 |
keyColor | The keyboard image is multiplied by this color | #6699ff |
keyHoverColor | Key background hover color | #1A407F |
keyPressColor | Key background pressed color | #5290F6 |
label | Label text, shown on top of keyboard | [empty string] |
labelColor | Label font color | #aaa |
maxLength | Maximum number of characters allowed (after filtering) | 0 (unlimited) |
model | Keyboard type (basic, numpad) | 'basic' |
multipleInputs | Allows to enter multiple values (keyboard stays open and clears value after entry) | false |
show | Visible or not (mainly for defining initial state) | true |
value | Input box value (before filtering) | [empty string] |
width | Keyboard width (in meters) | 0.8 |
Events
Name | Description |
---|---|
superkeyboardchange | Value changed. |
superkeyboarddismiss | Keyboard closed. |
superkeyboardinput | Return key hit. |
Filters
You can choose as many filters as you want. For example: <a-entity super-keyboard="filters: title, numbers, trim"></a-entity>
.
Current filters are:
Name | Description | Example output with input "hello dear WORLD, 123! " |
---|---|---|
alllower | All chars lowercase | "hello dear world, 123! " |
allupper | All chars uppercase | "HELLO DEAR WORLD, 123! " |
custom | apply custom filter defined by user (see below) | |
first | Uppercase only first letter in text | "Hello dear WORLD, 123! " |
numbers | Accept only numbers or dot in text | "123" |
title | Uppercase first letter of words | "Hello Dear WORLD, 123! " |
trim | Remove trailing spaces | "hello dear WORLD, 123!" |
Custom filter can be set using the method setCustomFilter(func)
of the component. The func parameter is a function that receives a string and must return the filtered string.
It can be defined from a custom component, for example this could be a password **** filter:
<script>
AFRAME.registerComponent('password-filter', {
init: function () {
this.el.components['super-keyboard'].setCustomFilter(function(str){
return '*'.repeat(str.length);
});
}
});
</script>
<a-entity super-keyboard="filters: custom" password-filter></a-entity>
Defining Custom Keyboards and Layouts
super-keyboard
is based on a single image for the whole keyboard and its
input box. By customizing this image and some variables, you can create any
keyboard you like, with any texture, layout and appearance.
Note: As of version 1.0, the image is expected to has double width than height (for example, 2048 x 1028). This limitation should be removed in next versions.
First, you create the image of the keyboard, with the characters and control
keys such as Enter, Dismiss, Backspace, Shift and Space
.
Then you have to tell super-keyboard
where the keys are, what is their size,
and what character (or command) they produce. For doing this you can use this
editor providing an image of the keyboard but with flat colored
rectangles where the keys are supposed to be (they must not overlap). Then,
just by clicking and pressing the corresponding key, you will get the code
necessary for defining the layout of the keyboard.
Finally, you call the component method addCustomModel(name, layout_definition)
and set the model
property to your keyboard's name.
layout_definition
is an object with the following properties:
Name | Description | Example value |
---|---|---|
img | Keyboard image path | "my-keyboard.png" |
inputOffsetX | x distance increment of the input box text, to fine tune | 0.01 |
inputOffsetY | Same as previous, but y increment | 0.01 |
layout | Array with key slices data (the code generated in the editor) | |
wrapCount | WrapCount value of the input box text. It sets the size of its font. | 20 |
See an example code of a custom keyboard (play example) (note: needs update, pull request welcome)
Installation
Browser
Install and use by directly including the browser files.
Also grab the keyboard assets (e.g., in the dist/
) and drop into your
project, specifying the imagePath
(note: do not include the filename in the path, will look for file matching name of image seen in dist.)
<head>
<script src="https://cdn.statically.io/gh/kylebakerio/aframe-super-keyboard/master/dist/aframe-super-keyboard.min.js"></script>
<!-- if you want to use the latest official build, use this... you'll be missing hte fixes in this fork, but at least won't be missing their latest fixes missing in the 1.0.0 version they list in the readme of their repo: -->
<!-- <script src="https://unpkg.com/aframe-super-keyboard@2.1.0/dist/aframe-super-keyboard.min.js"></script></head> -->
<body>
<a-scene>
<a-entity id="mouseCursor" cursor="rayOrigin: mouse"></a-entity>
<a-entity id="hand" laser-controls="hand: right"></a-entity>
<!-- Change hand to `hand` for VR. -->
<a-entity id="keyboard" super-keyboard="hand: #mouseCursor; imagePath:../../dist/" position="0 1.076 -0.5" rotation="-30 0 0"></a-entity>
</a-scene>
</body>
npm
(using npm install will get unmaintained version)
Install via npm:
npm install aframe-super-keyboard
Then require and use.
require('aframe');
require('aframe-super-keyboard');