Go to file
Leon van Kammen 46a61279db scale both [non]XR icons 2025-03-24 18:05:25 +01:00
.forgejo/workflows mirror to c-frame 2025-01-16 12:07:19 +01:00
.github/workflows 1st commit 2023-11-01 12:53:18 +01:00
com scale both [non]XR icons 2025-03-24 18:05:25 +01:00
.env added more documentation 2025-01-16 15:34:38 +01:00
.gitignore javascript bridge fixes 2024-09-02 13:05:47 +00:00
.gitmodules main: work in progress [might break] 2024-07-23 13:21:48 +00:00
LICENSE 1st commit 2023-11-01 12:53:18 +01:00
README.awk launcher/handmenu demo 2025-03-14 14:49:04 +01:00
README.md launcher/handmenu demo 2025-03-14 14:49:04 +01:00

README.md

XRshell apps & components

This is a library of useful AFRAME components used in XRSH [or in any AFRAME app].
Characteristics:

Usage

<script src="https://codeberg.org/xrsh/xrsh-com/com/require.js"/>
<script src="https://codeberg.org/xrsh/xrsh-com/com/example/helloworld.js"/>

<a-entity helloworld="foo:1" class="cubes" name="box">  

See component list below

this README.md is generated by running echo "$(./README.awk com/*.js)" > README.md

Credits

This project is partially funded through NGI0 Entrust, a fund established by NLnet with financial support from the European Commission's Next Generation Internet program. Learn more at the NLnet project page.

NLnet foundation logo NGI Zero Logo

Component List

data_events

allows components to react to data changes

 <script>
   AFRAME.registerComponent('mycom',{
     init: function(){ this.data.foo = 1 }, 
     event: {
       foo:   (e) => alert("I was updated!")
     }
   })
 </script>

 <a-entity mycom data_events/>

html-as-texture-in-xr

shows domid only in immersive mode (wrapper around aframe-htmlmesh

It also sets class 'XR' to the (HTML) body-element in immersive mode. This allows CSS (in dom component) to visually update accordingly.

depends on AFRAME.utils.require

 <style type="text/css">
   .XR #foo { color:red; }
 </style>

 <a-entity html-as-texture-in-xr="domid: #foo">
   <b id="foo">hello</b>
 </a-entitiy>
property type
domid string
event target info
3D a-scene fired when going into immersive mode
2D a-scene fired when leaving immersive mode

isoterminal

Renders a windowed terminal in both (non)immersive mode. It displays an interactive javascript console or boots into a Linux ISO image (via WASM).

  <a-entity isoterminal="iso: xrsh.iso" position="0 1.6 -0.3"></a-entity>

depends on AFRAME.utils.require

property type default info
iso string https`//forgejo.isvery.ninja/assets/xrsh-buildroot/main/xrsh.iso"
overlayfs string WORK-IN-PROGRESS
width number 800
height number 600
depth number 0.03
lineHeight number 18
bootmenu boolean true give user choice [or boot straight into ISO ]
padding `number`` 18
maximized boolean false
minimized boolean false
muteUntilPrompt boolean true mute stdout until a prompt is detected in ISO
HUD boolean false link to camera movement
transparent boolean false heavy, needs good gpu
memory number 60 VM memory (in MB) [NOTE` quest or smartphone webworker might crash > 40mb ]
bufferLatency number 1 in ms` bufferlatency from webworker to term (batch-update every char to texture)
debug boolean false
emulator string fbterm terminal emulator

for more info see xrsh.isvery.ninja

Component design:

                  css/html template                                                                                
                                                                                                                    
                    ┌─────────┐   ┌────────────┐                  exit-AR                                
           ┌───────►│ com/dom ┼──►│ com/window ├───────────────── exit-VR  ◄─┐                           
           │        └─────────┘   └───────────┬┘                             │                           
           │                                  │                              │                           
┌──────────┴────────┐                         │   ┌───────────┐    ┌─────────────────────────────┐
│  com/isoterminal  ├────────────────────────────►│com/term.js│    │com/html-as-texture-in-XR.js │
└────────┬─┬────────┘                         │   └──┬─────┬▲─┘    └─────────────────────────────┘
         │ │        ┌────────┐             ┌──▼──────▼──────┐                     ││        │                       
         │ └───────►│ plane  ├─────►text───┼►div#isoterminal│◄────────────────── enter-VR   │                       
         │          └────────┘             └────────────────┘                    enter-AR ◄─┘                       
         │                                   │                                                     
         │                                   │                                                                   
         │                             ISOTerminal.js                                                                   
         │                ┌───────────────────────────┐           
         │                │ com/isoterminal/worker.js ├            
         │                └──────────────┌────────────┤            
         │                     │         │ v86.js     │            
         │                     │         │ feat/*.js  │            
         │                     │         │ libv86.js  │            
         │                     │         └────────────┘            
         │                     │         
         └─────────────────────┘    
                                                                                                                    
NOTE: For convenience reasons, events are forwarded between com/isoterminal.js, worker.js and ISOTerminal
      Instead of a melting pot of different functionnames, events are flowing through everything (ISOTerminal.emit())

launcher

displays app (icons) for enduser to launch

 <a-scene launcher/>
property type example
registries array of strings <a-entity launcher="registers: https://foo.com/index.json, ./index.json"/>

| event | target | info | |--------------|-------------------------------------------------------------------------------------------------------------| | launcher | an app | when pressing an app icon, launcher event will be send to the respective app |

There a multiple ways of letting the launcher know that an app can be launched:

  1. any AFRAME component with an launcher-event + manifest is automatically added:
AFRAME.registerComponent('foo',{
  events:{
    launcher: function(){ ...launch something... }
  },
  manifest:{ // HTML5 manifesto JSON object
    // https://www.w3.org/TR/appmanifest/ 
  }
}
  1. dynamically in javascript
window.launcher.register({
  name:"foo",
  icon: "https://.../optional_icon.png" 
  description: "lorem ipsum",
  cb: () => alert("foo")
})
//window.launcher.unregister('foo')

Restore the pose.

pastedrop

detects user copy/paste and file dragdrop action and clipboard functions

  <a-entity pastedrop/>
event target info
pasteFile self always translates input to a File object

Restore the pose.

require

automatically requires dependencies or missing components

await AFRAME.utils.require( this.dependencies )               (*) autoload missing components
await AFRAME.utils.require( this.el.getAttributeNames() )     (*) autoload missing components
await AFRAME.utils.require({foo: "https://foo.com/aframe/components/foo.js"},this)
await AFRAME.utils.require(["./app/foo.js","foo.css"],this)

(*) = prefixes baseURL AFRAME.utils.require.baseURL ('./com/' e.g.)

window

wraps a draggable window around a dom id or dom component.

  <a-entity window="dom: #mydiv"/>

depends on AFRAME.utils.require

property type default info
title string ""
width string
height string 260px
uid string
attach selector
dom selector
max boolean false
min boolean false
x string "center"
y string "center"
class array []