Getting started
This page installs one adapter and gets a single window on screen, using the reference Meta IWSDK adapter first.
Install
npm install @realitycollective/iwsdk-uiextensions
Peer dependencies, the packages your app installs alongside the adapter: @iwsdk/core >=0.5.0 <0.6.0 and three >=0.170.0, which every IWSDK app already has.
Describe a window
A window is described by options that extend WindowOptionsBase: a title, a dock mode, a position, and which title-bar buttons are enabled. Every title-bar button, pin, dock, minimise and close, is off unless the window asks for it.
import { World } from '@iwsdk/core';
import { registerUIExtensions, createSceneHost, DockMode } from '@realitycollective/iwsdk-uiextensions';
const world = await World.create(container, { features: { spatialUI: true } });
const windows = registerUIExtensions(world);
const host = createSceneHost(world);
const status = host.createWindow({
id: 'status',
title: 'Player Status',
config: './ui/status.uikitml',
dockMode: DockMode.BodyFollow,
pinnable: true,
});
World is IWSDK's entity component system container, the object every IWSDK app already creates; the adapter registers its systems into it.
Register the adapter
registerUIExtensions(world) registers every system the adapter needs, window, dock, drag, regions, controls and the touch guard, and returns the WindowManager, the one API app code uses to change a window afterwards.
Wire onPanelReady
Panels load asynchronously on every adapter, so never assume a panel exists immediately after creating its window. onReady on the handle, or onPanelReady on the host, fires once the panel is wireable, and replays for a panel that was already live when you subscribed.
status.onReady((panel) => {
panel.getElementById('uix-title');
});
Drive the window from code
windows.hide('status');
windows.togglePin('status');
windows.setChrome('status', { close: true });
windows.close('status');
What changes on the XR Blocks and three.js adapter
The same options and the same WindowManager calls work on @realitycollective/xrblocks-uiextensions, the experimental Google XR Blocks and plain three.js adapter. Two differences: createWindow there returns a handle whose panel is ready immediately, because uikitml interprets the markup synchronously, and the host reports supportsStandalonePanels: true, so createPanel also works for an unmanaged panel with no window chrome. See the XR Blocks and three.js adapter for the full feature matrix against IWSDK.