@realitycollective/iwsdk-uiextensions 0.1.0-preview.0 → 0.1.0-preview.1
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.
Potentially problematic release.
This version of @realitycollective/iwsdk-uiextensions might be problematic. Click here for more details.
- package/CHANGELOG.md +12 -0
- package/Examples/basic-window/main.ts +3 -2
- package/Examples/basic-window/window.uikitml +1 -2
- package/Examples/controls/controls.uikitml +1 -2
- package/Examples/controls/main.ts +6 -2
- package/Examples/dock-regions/main.ts +2 -2
- package/README.md +2 -2
- package/dist/component-set.d.ts +28 -0
- package/dist/component-set.js +108 -0
- package/dist/component-set.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/systems/window-system.d.ts +0 -16
- package/package.json +7 -5
package/CHANGELOG.md
CHANGED
|
@@ -13,5 +13,17 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and
|
|
|
13
13
|
- `@realitycollective/xrblocks-uiextensions` - EXPERIMENTAL Google XR Blocks / plain three.js adapter: panel document, window host, follow and scale maths, desktop controls and locomotion, pointer forwarding.
|
|
14
14
|
- `@realitycollective/uix-devtools` - dev-only tooling: edit-session launch gate, runtime UIKitML compilation, and the `uix-dev` CLI (Cloudflare quick tunnel, QR onboarding, environment doctor).
|
|
15
15
|
- Demo clients: the IWSDK showcase, the devtools playground, and the multiplatform lab that picks its pipeline from the hardware.
|
|
16
|
+
- `uixComponentSet`, exported from `@realitycollective/iwsdk-uiextensions`. Pass it to `spatialUI.componentSets` so the IWSDK 0.5 parser accepts the `<uix-*>` control elements. Without it a panel using any control fails to parse and never attaches. No equivalent is needed on the three.js or XR Blocks adapters.
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
|
|
20
|
+
- **Controls are declared as custom elements rather than attributes.** `<uix-stepper>` replaces `<div data-uix="stepper">`, and each part is its own element: `<uix-value>`, `<uix-line>`, `<uix-label>` and so on, replacing `data-uix-role`. Parameters are unchanged and stay `data-uix-*`. This is what makes one markup file portable: IWSDK 0.5 parses with `@drawcall/uikitml`, which rejects every `data-*` attribute on a built-in tag but accepts custom tags declared in a component set, while the three.js and XR Blocks parser accepts custom tags with no registration at all. Both expose the declared tag on `userData.customElement.componentName`, so the engine-free upgraders read one contract on every adapter.
|
|
21
|
+
- The expandable label's `toggle` part is now `<uix-more>`. As an element the old name would have collided with the `<uix-toggle>` control.
|
|
22
|
+
- `@realitycollective/iwsdk-uiextensions` targets **IWSDK 0.5.x**: peer range `>=0.5.0 <0.6.0`, developed against `@iwsdk/core` 0.5.3. `PanelUI` in 0.5 declares a single field, `config`, holding the URL of the UIKitML **source**; the compiled JSON it took on 0.4.x, and the `@iwsdk/vite-plugin-uikitml` step that produced it, are both gone. `maxWidth` and `maxHeight` were removed from the component schema, and ECS ignores unknown fields silently, so a panel that still writes them is mis-sized with no error. Size through `createUIWindow`, which routes to `UIWindow.targetWidth/Height`.
|
|
23
|
+
- `UixWindowHost` resolves a window's `config` by fetching the `.uikitml` source and parsing it, where it previously fetched compiled JSON. Supplying `loadConfig` is no longer necessary for an ordinary panel; override it only for an unusual transport.
|
|
24
|
+
- `compilePanelSource` in `@realitycollective/uix-devtools` serves the **source** on its `blob:` URL rather than compiled JSON, matching what 0.5 fetches. `CompiledPanel.json` is now `CompiledPanel.source`, and the `resolveFile` option is gone because the 0.5 parser has no `<link ref>` stylesheet resolution; put shared rules in a `<style>` block, of which several are allowed and merge. Validation now runs on `@drawcall/uikitml`, pinned to the version `@iwsdk/core` depends on, so a source that passes here is one `PanelUISystem` will accept and no second parser enters the tree.
|
|
25
|
+
- Example and demo markup uses `rgba()` or eight-digit hex rather than `background-opacity`, which the 0.5 parser removed. Both parsers accept the replacement, so one stylesheet serves every adapter.
|
|
26
|
+
- The IWSDK component kit is selected by name, `spatialUI: { kit: 'horizon' }`, rather than by passing an imported kit module. The kits now live inside the parser.
|
|
27
|
+
- `@types/three` is pinned to `0.184.0` across the workspace. IWSDK 0.5.3 and xrblocks resolved different copies, and two copies of the three typings make structurally identical `Object3D` types mutually unassignable, which surfaces as spurious errors far from their cause.
|
|
16
28
|
|
|
17
29
|
[0.1.0]: https://github.com/realitycollective/WebXR-UIExtensions/commits/main
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Basic window - chrome, focus, docking and drag with one call.
|
|
3
|
-
* Put window.uikitml in your app's ui/ folder
|
|
3
|
+
* Put window.uikitml in your app's public/ui/ folder - IWSDK 0.5 fetches and
|
|
4
|
+
* parses the source at runtime, so there is no compile step.
|
|
4
5
|
*/
|
|
5
6
|
import { World } from '@iwsdk/core';
|
|
6
7
|
import {
|
|
@@ -19,7 +20,7 @@ export async function start(container: HTMLDivElement) {
|
|
|
19
20
|
createUIWindow(world, {
|
|
20
21
|
id: 'hello',
|
|
21
22
|
title: 'Hello Window',
|
|
22
|
-
config: './ui/window.
|
|
23
|
+
config: './ui/window.uikitml',
|
|
23
24
|
dockMode: DockMode.BodyFollow, // follows until pinned or dragged
|
|
24
25
|
followOffset: [0, -0.15, -1.2],
|
|
25
26
|
});
|
|
@@ -4,8 +4,7 @@
|
|
|
4
4
|
flex-direction: column;
|
|
5
5
|
width: 300;
|
|
6
6
|
padding: 10;
|
|
7
|
-
background-color:
|
|
8
|
-
background-opacity: 0.92;
|
|
7
|
+
background-color: rgba(16, 26, 38, 0.92);
|
|
9
8
|
border-radius: 12.5;
|
|
10
9
|
}
|
|
11
10
|
.row { display: flex; flex-direction: row; align-items: center; justify-content: space-between; width: 100%; margin-top: 7; }
|
|
@@ -17,16 +17,20 @@ export async function start(container: HTMLDivElement) {
|
|
|
17
17
|
});
|
|
18
18
|
registerUIExtensions(world);
|
|
19
19
|
|
|
20
|
+
// `config` is the only field PanelUI carries in IWSDK 0.5. maxWidth/maxHeight
|
|
21
|
+
// were removed from the schema; ECS ignores unknown fields silently, so
|
|
22
|
+
// writing them here would mis-size the panel with no error. Size a panel
|
|
23
|
+
// through createUIWindow instead, which routes to UIWindow.targetWidth/Height.
|
|
20
24
|
const panel = world
|
|
21
25
|
.createTransformEntity()
|
|
22
|
-
.addComponent(PanelUI, { config: './ui/controls.
|
|
26
|
+
.addComponent(PanelUI, { config: './ui/controls.uikitml' });
|
|
23
27
|
panel.object3D!.position.set(0, 1.5, -1.2);
|
|
24
28
|
|
|
25
29
|
// Wire the handles once the panel loads.
|
|
26
30
|
class WireSystem extends createSystem({
|
|
27
31
|
panel: {
|
|
28
32
|
required: [PanelUI, PanelDocument],
|
|
29
|
-
where: [eq(PanelUI, 'config', './ui/controls.
|
|
33
|
+
where: [eq(PanelUI, 'config', './ui/controls.uikitml')],
|
|
30
34
|
},
|
|
31
35
|
}) {
|
|
32
36
|
override init(): void {
|
|
@@ -41,7 +41,7 @@ export async function start(container: HTMLDivElement) {
|
|
|
41
41
|
createUIWindow(world, {
|
|
42
42
|
id: 'docked',
|
|
43
43
|
title: 'Docked Window',
|
|
44
|
-
config: './ui/window.
|
|
44
|
+
config: './ui/window.uikitml',
|
|
45
45
|
region: 'wall',
|
|
46
46
|
});
|
|
47
47
|
|
|
@@ -49,7 +49,7 @@ export async function start(container: HTMLDivElement) {
|
|
|
49
49
|
createUIWindow(world, {
|
|
50
50
|
id: 'floating',
|
|
51
51
|
title: 'Drag Me Into A Region',
|
|
52
|
-
config: './ui/window.
|
|
52
|
+
config: './ui/window.uikitml',
|
|
53
53
|
position: [0, 1.5, -1.4],
|
|
54
54
|
});
|
|
55
55
|
}
|
package/README.md
CHANGED
|
@@ -20,7 +20,7 @@ Everything is authored in plain UIKitML (HTML/CSS-like) - no new markup language
|
|
|
20
20
|
|
|
21
21
|
```bash
|
|
22
22
|
npm install @realitycollective/iwsdk-uiextensions
|
|
23
|
-
# peer: @iwsdk/core >= 0.
|
|
23
|
+
# peer: @iwsdk/core >=0.5.0 <0.6.0
|
|
24
24
|
```
|
|
25
25
|
|
|
26
26
|
## Quick start
|
|
@@ -45,7 +45,7 @@ createDockRegion(world, { id: 'wall', flow: 'column', position: [1.5, 1.8, -1.5]
|
|
|
45
45
|
createUIWindow(world, {
|
|
46
46
|
id: 'status',
|
|
47
47
|
title: 'Player Status',
|
|
48
|
-
config: './ui/status.
|
|
48
|
+
config: './ui/status.uikitml', // UIKitML source; IWSDK 0.5 parses it at runtime
|
|
49
49
|
dockMode: DockMode.BodyFollow, // follows until the user pins it
|
|
50
50
|
});
|
|
51
51
|
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The UIKitML component set for `<uix-*>` control elements.
|
|
3
|
+
*
|
|
4
|
+
* IWSDK 0.5 parses panels with `@drawcall/uikitml`, which validates every tag
|
|
5
|
+
* against a component schema and rejects anything it does not know - including
|
|
6
|
+
* every `data-*` attribute on a built-in tag. Declaring the control elements
|
|
7
|
+
* here is the supported way to extend that vocabulary.
|
|
8
|
+
*
|
|
9
|
+
* The three.js and XR Blocks adapters need no equivalent: their parser accepts
|
|
10
|
+
* custom tags unregistered, exposing the tag on
|
|
11
|
+
* `userData.customElement.componentName`. This set reproduces that convention
|
|
12
|
+
* on the IWSDK side - the constructor below stamps the same key and lifts
|
|
13
|
+
* `data-uix-*` attributes into `userData` - so ONE markup file drives every
|
|
14
|
+
* adapter and the engine-free upgraders read it identically everywhere.
|
|
15
|
+
*
|
|
16
|
+
* Register it when creating the world:
|
|
17
|
+
* ```ts
|
|
18
|
+
* const world = await World.create(container, {
|
|
19
|
+
* features: { spatialUI: { kit: 'horizon', componentSets: [uixComponentSet] } },
|
|
20
|
+
* });
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
import { type ComponentSet } from '@drawcall/uikitml';
|
|
24
|
+
/**
|
|
25
|
+
* Pass to `spatialUI.componentSets` so `<uix-*>` elements parse on IWSDK 0.5.
|
|
26
|
+
* Without it, a panel using any control fails to parse and never attaches.
|
|
27
|
+
*/
|
|
28
|
+
export declare const uixComponentSet: ComponentSet;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The UIKitML component set for `<uix-*>` control elements.
|
|
3
|
+
*
|
|
4
|
+
* IWSDK 0.5 parses panels with `@drawcall/uikitml`, which validates every tag
|
|
5
|
+
* against a component schema and rejects anything it does not know - including
|
|
6
|
+
* every `data-*` attribute on a built-in tag. Declaring the control elements
|
|
7
|
+
* here is the supported way to extend that vocabulary.
|
|
8
|
+
*
|
|
9
|
+
* The three.js and XR Blocks adapters need no equivalent: their parser accepts
|
|
10
|
+
* custom tags unregistered, exposing the tag on
|
|
11
|
+
* `userData.customElement.componentName`. This set reproduces that convention
|
|
12
|
+
* on the IWSDK side - the constructor below stamps the same key and lifts
|
|
13
|
+
* `data-uix-*` attributes into `userData` - so ONE markup file drives every
|
|
14
|
+
* adapter and the engine-free upgraders read it identically everywhere.
|
|
15
|
+
*
|
|
16
|
+
* Register it when creating the world:
|
|
17
|
+
* ```ts
|
|
18
|
+
* const world = await World.create(container, {
|
|
19
|
+
* features: { spatialUI: { kit: 'horizon', componentSets: [uixComponentSet] } },
|
|
20
|
+
* });
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
import { htmlComponentSet } from '@drawcall/uikitml';
|
|
24
|
+
import { z } from 'zod';
|
|
25
|
+
/**
|
|
26
|
+
* Base container, taken from the parser's own `<div>` definition rather than
|
|
27
|
+
* imported from `@pmndrs/uikit` directly - that keeps a single copy of uikit
|
|
28
|
+
* in the tree, whichever version `@iwsdk/core` resolves.
|
|
29
|
+
*/
|
|
30
|
+
const BaseContainer = htmlComponentSet['div']
|
|
31
|
+
?.component;
|
|
32
|
+
/** Control elements an author writes, and the parts that live inside them. */
|
|
33
|
+
const CONTROL_TAGS = [
|
|
34
|
+
'uix-stepper',
|
|
35
|
+
'uix-toggle',
|
|
36
|
+
'uix-expandable-label',
|
|
37
|
+
'uix-log-view',
|
|
38
|
+
];
|
|
39
|
+
const ROLE_TAGS = [
|
|
40
|
+
'uix-decrement',
|
|
41
|
+
'uix-value',
|
|
42
|
+
'uix-increment',
|
|
43
|
+
'uix-label',
|
|
44
|
+
'uix-line',
|
|
45
|
+
'uix-up',
|
|
46
|
+
'uix-down',
|
|
47
|
+
'uix-clear',
|
|
48
|
+
'uix-status',
|
|
49
|
+
'uix-text',
|
|
50
|
+
'uix-more',
|
|
51
|
+
];
|
|
52
|
+
/**
|
|
53
|
+
* `data-uix-min` → `uixMin`, matching how the other parser fills userData.
|
|
54
|
+
*
|
|
55
|
+
* The parser hands properties over already camelCased, so `data-uix-min`
|
|
56
|
+
* arrives as `dataUixMin`; both spellings are normalised here.
|
|
57
|
+
*/
|
|
58
|
+
function toUserDataKey(attribute) {
|
|
59
|
+
if (/^data[A-Z]/.test(attribute)) {
|
|
60
|
+
const rest = attribute.slice(4);
|
|
61
|
+
return rest.charAt(0).toLowerCase() + rest.slice(1);
|
|
62
|
+
}
|
|
63
|
+
return attribute
|
|
64
|
+
.replace(/^data-/, '')
|
|
65
|
+
.replace(/-([a-z0-9])/g, (_, c) => c.toUpperCase());
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* A plain uikit Container that records what it was declared as.
|
|
69
|
+
*
|
|
70
|
+
* Anything the schema let through that is not a uikit property - the
|
|
71
|
+
* `data-uix-*` parameters - is moved into `userData` rather than handed to
|
|
72
|
+
* uikit, which would warn about properties it does not recognise.
|
|
73
|
+
*/
|
|
74
|
+
function controlComponent(tag) {
|
|
75
|
+
return class UixControlContainer extends BaseContainer {
|
|
76
|
+
constructor(properties = {}) {
|
|
77
|
+
const uikitProps = {};
|
|
78
|
+
const userData = {};
|
|
79
|
+
for (const [key, value] of Object.entries(properties)) {
|
|
80
|
+
if (key.startsWith('data-') || /^data[A-Z]/.test(key)) {
|
|
81
|
+
userData[toUserDataKey(key)] = value;
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
uikitProps[key] = value;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
super(uikitProps);
|
|
88
|
+
Object.assign(this.userData, userData, {
|
|
89
|
+
customElement: { componentName: tag, sourceTag: tag },
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/** Permissive: the parameters are ours, and the upgraders validate them. */
|
|
95
|
+
const schema = z.object({}).passthrough();
|
|
96
|
+
function define(tag) {
|
|
97
|
+
return {
|
|
98
|
+
component: controlComponent(tag),
|
|
99
|
+
schema,
|
|
100
|
+
canHaveChildren: true,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Pass to `spatialUI.componentSets` so `<uix-*>` elements parse on IWSDK 0.5.
|
|
105
|
+
* Without it, a panel using any control fails to parse and never attaches.
|
|
106
|
+
*/
|
|
107
|
+
export const uixComponentSet = Object.fromEntries([...CONTROL_TAGS, ...ROLE_TAGS].map((tag) => [tag, define(tag)]));
|
|
108
|
+
//# sourceMappingURL=component-set.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component-set.js","sourceRoot":"","sources":["../src/component-set.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAAE,gBAAgB,EAA+C,MAAM,mBAAmB,CAAC;AAClG,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;GAIG;AACH,MAAM,aAAa,GAAG,gBAAgB,CAAC,KAAK,CAAC;IAC3C,EAAE,SAEH,CAAC;AAEF,8EAA8E;AAC9E,MAAM,YAAY,GAAG;IACnB,aAAa;IACb,YAAY;IACZ,sBAAsB;IACtB,cAAc;CACN,CAAC;AAEX,MAAM,SAAS,GAAG;IAChB,eAAe;IACf,WAAW;IACX,eAAe;IACf,WAAW;IACX,UAAU;IACV,QAAQ;IACR,UAAU;IACV,WAAW;IACX,YAAY;IACZ,UAAU;IACV,UAAU;CACF,CAAC;AAEX;;;;;GAKG;AACH,SAAS,aAAa,CAAC,SAAiB;IACtC,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,SAAS;SACb,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AAChE,CAAC;AAED;;;;;;GAMG;AACH,SAAS,gBAAgB,CAAC,GAAW;IACnC,OAAO,MAAM,mBAAoB,SAAQ,aAAa;QACpD,YAAY,aAAsC,EAAE;YAClD,MAAM,UAAU,GAA4B,EAAE,CAAC;YAC/C,MAAM,QAAQ,GAA4B,EAAE,CAAC;YAC7C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;gBACtD,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBACtD,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;gBACvC,CAAC;qBAAM,CAAC;oBACN,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBAC1B,CAAC;YACH,CAAC;YACD,KAAK,CAAC,UAAU,CAAC,CAAC;YAClB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE;gBACrC,aAAa,EAAE,EAAE,aAAa,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE;aACtD,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED,4EAA4E;AAC5E,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AAE1C,SAAS,MAAM,CAAC,GAAW;IACzB,OAAO;QACL,SAAS,EAAE,gBAAgB,CAAC,GAAG,CAAgD;QAC/E,MAAM;QACN,eAAe,EAAE,IAAI;KACtB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAiB,MAAM,CAAC,WAAW,CAC7D,CAAC,GAAG,YAAY,EAAE,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CACjE,CAAC","sourcesContent":["/**\n * The UIKitML component set for `<uix-*>` control elements.\n *\n * IWSDK 0.5 parses panels with `@drawcall/uikitml`, which validates every tag\n * against a component schema and rejects anything it does not know - including\n * every `data-*` attribute on a built-in tag. Declaring the control elements\n * here is the supported way to extend that vocabulary.\n *\n * The three.js and XR Blocks adapters need no equivalent: their parser accepts\n * custom tags unregistered, exposing the tag on\n * `userData.customElement.componentName`. This set reproduces that convention\n * on the IWSDK side - the constructor below stamps the same key and lifts\n * `data-uix-*` attributes into `userData` - so ONE markup file drives every\n * adapter and the engine-free upgraders read it identically everywhere.\n *\n * Register it when creating the world:\n * ```ts\n * const world = await World.create(container, {\n * features: { spatialUI: { kit: 'horizon', componentSets: [uixComponentSet] } },\n * });\n * ```\n */\nimport { htmlComponentSet, type ComponentSet, type ComponentDefinition } from '@drawcall/uikitml';\nimport { z } from 'zod';\n\n/**\n * Base container, taken from the parser's own `<div>` definition rather than\n * imported from `@pmndrs/uikit` directly - that keeps a single copy of uikit\n * in the tree, whichever version `@iwsdk/core` resolves.\n */\nconst BaseContainer = htmlComponentSet['div']\n ?.component as unknown as new (properties?: Record<string, unknown>) => {\n userData: Record<string, unknown>;\n};\n\n/** Control elements an author writes, and the parts that live inside them. */\nconst CONTROL_TAGS = [\n 'uix-stepper',\n 'uix-toggle',\n 'uix-expandable-label',\n 'uix-log-view',\n] as const;\n\nconst ROLE_TAGS = [\n 'uix-decrement',\n 'uix-value',\n 'uix-increment',\n 'uix-label',\n 'uix-line',\n 'uix-up',\n 'uix-down',\n 'uix-clear',\n 'uix-status',\n 'uix-text',\n 'uix-more',\n] as const;\n\n/**\n * `data-uix-min` → `uixMin`, matching how the other parser fills userData.\n *\n * The parser hands properties over already camelCased, so `data-uix-min`\n * arrives as `dataUixMin`; both spellings are normalised here.\n */\nfunction toUserDataKey(attribute: string): string {\n if (/^data[A-Z]/.test(attribute)) {\n const rest = attribute.slice(4);\n return rest.charAt(0).toLowerCase() + rest.slice(1);\n }\n return attribute\n .replace(/^data-/, '')\n .replace(/-([a-z0-9])/g, (_, c: string) => c.toUpperCase());\n}\n\n/**\n * A plain uikit Container that records what it was declared as.\n *\n * Anything the schema let through that is not a uikit property - the\n * `data-uix-*` parameters - is moved into `userData` rather than handed to\n * uikit, which would warn about properties it does not recognise.\n */\nfunction controlComponent(tag: string): typeof BaseContainer {\n return class UixControlContainer extends BaseContainer {\n constructor(properties: Record<string, unknown> = {}) {\n const uikitProps: Record<string, unknown> = {};\n const userData: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(properties)) {\n if (key.startsWith('data-') || /^data[A-Z]/.test(key)) {\n userData[toUserDataKey(key)] = value;\n } else {\n uikitProps[key] = value;\n }\n }\n super(uikitProps);\n Object.assign(this.userData, userData, {\n customElement: { componentName: tag, sourceTag: tag },\n });\n }\n };\n}\n\n/** Permissive: the parameters are ours, and the upgraders validate them. */\nconst schema = z.object({}).passthrough();\n\nfunction define(tag: string): ComponentDefinition {\n return {\n component: controlComponent(tag) as unknown as ComponentDefinition['component'],\n schema,\n canHaveChildren: true,\n };\n}\n\n/**\n * Pass to `spatialUI.componentSets` so `<uix-*>` elements parse on IWSDK 0.5.\n * Without it, a panel using any control fails to parse and never attaches.\n */\nexport const uixComponentSet: ComponentSet = Object.fromEntries(\n [...CONTROL_TAGS, ...ROLE_TAGS].map((tag) => [tag, define(tag)]),\n);\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -14,6 +14,7 @@ export * from '@realitycollective/webxr-uiextensions';
|
|
|
14
14
|
export * from './components.js';
|
|
15
15
|
export * from './manager-registry.js';
|
|
16
16
|
export * from './region-registry-store.js';
|
|
17
|
+
export * from './component-set.js';
|
|
17
18
|
export * from './factory.js';
|
|
18
19
|
export * from './scene-host.js';
|
|
19
20
|
export * from './register.js';
|
package/dist/index.js
CHANGED
|
@@ -16,6 +16,7 @@ export * from '@realitycollective/webxr-uiextensions';
|
|
|
16
16
|
export * from './components.js';
|
|
17
17
|
export * from './manager-registry.js';
|
|
18
18
|
export * from './region-registry-store.js';
|
|
19
|
+
export * from './component-set.js';
|
|
19
20
|
export * from './factory.js';
|
|
20
21
|
export * from './scene-host.js';
|
|
21
22
|
export * from './register.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,sEAAsE;AACtE,cAAc,uCAAuC,CAAC;AAEtD,oBAAoB;AACpB,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC","sourcesContent":["/**\n * @realitycollective/iwsdk-uiextensions - the Meta IWSDK adapter.\n *\n * The engine-free UX core (window manager, dock state, region math, drag\n * math, control models, markup upgraders, adapter interfaces) lives in\n * `@realitycollective/webxr-uiextensions` and is re-exported here in full,\n * so this package remains a drop-in single dependency for IWSDK apps.\n *\n * What this package adds is the IWSDK binding: ECS components + systems\n * that apply the core onto `@iwsdk/core` entities, plus the one-call\n * factories and `registerUIExtensions`.\n */\n// The portable core - re-exported for a single-dependency experience.\nexport * from '@realitycollective/webxr-uiextensions';\n\n// IWSDK ECS binding\nexport * from './components.js';\nexport * from './manager-registry.js';\nexport * from './region-registry-store.js';\nexport * from './factory.js';\nexport * from './scene-host.js';\nexport * from './register.js';\nexport * from './systems/window-system.js';\nexport * from './systems/dock-system.js';\nexport * from './systems/drag-system.js';\nexport * from './systems/dock-region-system.js';\nexport * from './systems/controls-system.js';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,sEAAsE;AACtE,cAAc,uCAAuC,CAAC;AAEtD,oBAAoB;AACpB,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC","sourcesContent":["/**\n * @realitycollective/iwsdk-uiextensions - the Meta IWSDK adapter.\n *\n * The engine-free UX core (window manager, dock state, region math, drag\n * math, control models, markup upgraders, adapter interfaces) lives in\n * `@realitycollective/webxr-uiextensions` and is re-exported here in full,\n * so this package remains a drop-in single dependency for IWSDK apps.\n *\n * What this package adds is the IWSDK binding: ECS components + systems\n * that apply the core onto `@iwsdk/core` entities, plus the one-call\n * factories and `registerUIExtensions`.\n */\n// The portable core - re-exported for a single-dependency experience.\nexport * from '@realitycollective/webxr-uiextensions';\n\n// IWSDK ECS binding\nexport * from './components.js';\nexport * from './manager-registry.js';\nexport * from './region-registry-store.js';\nexport * from './component-set.js';\nexport * from './factory.js';\nexport * from './scene-host.js';\nexport * from './register.js';\nexport * from './systems/window-system.js';\nexport * from './systems/dock-system.js';\nexport * from './systems/drag-system.js';\nexport * from './systems/dock-region-system.js';\nexport * from './systems/controls-system.js';\n"]}
|
|
@@ -80,14 +80,6 @@ declare const UIWindowSystem_base: import("elics").SystemConstructor<import("eli
|
|
|
80
80
|
type: import("@iwsdk/core").Types.String;
|
|
81
81
|
default: string;
|
|
82
82
|
};
|
|
83
|
-
maxWidth: {
|
|
84
|
-
type: import("@iwsdk/core").Types.Float32;
|
|
85
|
-
default: number;
|
|
86
|
-
};
|
|
87
|
-
maxHeight: {
|
|
88
|
-
type: import("@iwsdk/core").Types.Float32;
|
|
89
|
-
default: number;
|
|
90
|
-
};
|
|
91
83
|
}> | import("elics").Component<{
|
|
92
84
|
document: {
|
|
93
85
|
type: import("@iwsdk/core").Types.Object;
|
|
@@ -293,14 +285,6 @@ declare const UIWindowSystem_base: import("elics").SystemConstructor<import("eli
|
|
|
293
285
|
type: import("@iwsdk/core").Types.String;
|
|
294
286
|
default: string;
|
|
295
287
|
};
|
|
296
|
-
maxWidth: {
|
|
297
|
-
type: import("@iwsdk/core").Types.Float32;
|
|
298
|
-
default: number;
|
|
299
|
-
};
|
|
300
|
-
maxHeight: {
|
|
301
|
-
type: import("@iwsdk/core").Types.Float32;
|
|
302
|
-
default: number;
|
|
303
|
-
};
|
|
304
288
|
}> | import("elics").Component<{
|
|
305
289
|
document: {
|
|
306
290
|
type: import("@iwsdk/core").Types.Object;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@realitycollective/iwsdk-uiextensions",
|
|
3
|
-
"version": "0.1.0-preview.
|
|
3
|
+
"version": "0.1.0-preview.1",
|
|
4
4
|
"description": "Meta IWSDK adapter for the Reality Collective UI Extensions - windowing, docking, layout regions and extra controls, binding the engine-free @realitycollective/webxr-uiextensions core onto IWSDK's ECS, UIKitML and interaction systems.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"realitycollective",
|
|
@@ -36,16 +36,18 @@
|
|
|
36
36
|
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
+
"@drawcall/uikitml": "0.1.8",
|
|
40
|
+
"zod": "^4.4.3",
|
|
39
41
|
"@pmndrs/handle": "^6.6.16",
|
|
40
|
-
"@realitycollective/webxr-uiextensions": "^0.1.0-preview.
|
|
42
|
+
"@realitycollective/webxr-uiextensions": "^0.1.0-preview.1"
|
|
41
43
|
},
|
|
42
44
|
"peerDependencies": {
|
|
43
|
-
"@iwsdk/core": ">=0.
|
|
45
|
+
"@iwsdk/core": ">=0.5.0 <0.6.0"
|
|
44
46
|
},
|
|
45
47
|
"devDependencies": {
|
|
46
|
-
"@iwsdk/core": "0.
|
|
48
|
+
"@iwsdk/core": "0.5.3",
|
|
47
49
|
"three": "npm:super-three@0.181.0",
|
|
48
|
-
"@types/three": "
|
|
50
|
+
"@types/three": "0.184.0"
|
|
49
51
|
},
|
|
50
52
|
"repository": {
|
|
51
53
|
"type": "git",
|