@realitycollective/uix-devtools 0.1.0-preview.0 → 0.1.0-preview.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/CHANGELOG.md +21 -0
- package/README.md +9 -5
- package/dist/runtime-compile.d.ts +36 -10
- package/dist/runtime-compile.js +30 -23
- package/dist/runtime-compile.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -13,5 +13,26 @@ 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
|
+
- `WindowHandle` and `WindowOptionsBase` in `@realitycollective/webxr-uiextensions`. `WindowHandle` is what every adapter's `createWindow` hands back: an `id`, a `panel` that is `undefined` until the adapter has attached the document, and `onReady(listener)`, which runs once and fires immediately if the panel is already there. `WindowOptionsBase` holds the options every adapter understands, and both adapters' option types now extend it, so an option name means the same thing on each. `createWindow` itself stays adapter-specific, because the `config` payload differs per engine.
|
|
18
|
+
- `WindowHost.supportsStandalonePanels`. It says whether `createPanel` works on a host, rather than leaving callers to find out by catching. `false` on the IWSDK host, where the ECS owns panel lifecycles and `createPanel` throws; `true` on the three.js / XR Blocks host.
|
|
19
|
+
- `PanelReadyEvent.kind`, either `window` or `panel`. `window` means the panel came from the adapter's window factory and is managed by the window manager. `panel` means a bare panel the adapter noticed, whose `id` is then the adapter's best stable identifier for it - the config path on IWSDK. The field is optional, so existing listeners keep compiling.
|
|
20
|
+
- `createWindow` on the IWSDK scene host, returning an `IwsdkWindowHandle`: a `WindowHandle` plus the ECS `entity`. It spawns through `createUIWindow`, names the window `uix-window-<n>` when no id is given, and resolves `panel` and `onReady` once the document attaches, so wiring one window needs neither an ECS query nor a filtered `onPanelReady`. `createUIWindow` is unchanged and still returns the entity.
|
|
21
|
+
- `getPanelHandle(entity)` in `@realitycollective/iwsdk-uiextensions`: the panel handle for an entity you already hold, or `undefined` while IWSDK is still loading its document.
|
|
22
|
+
|
|
23
|
+
### Changed
|
|
24
|
+
|
|
25
|
+
- **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.
|
|
26
|
+
- The expandable label's `toggle` part is now `<uix-more>`. As an element the old name would have collided with the `<uix-toggle>` control.
|
|
27
|
+
- `@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`.
|
|
28
|
+
- `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.
|
|
29
|
+
- `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.
|
|
30
|
+
- 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.
|
|
31
|
+
- 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.
|
|
32
|
+
- `@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.
|
|
33
|
+
- `onPanelReady` on the IWSDK host announces bare panels as well as managed windows. A `PanelUI` entity with no `UIWindow`, or with an empty `windowId`, used to be dropped silently; it is now announced with `kind: 'panel'` and its config path as the id. Listeners that only want managed windows should check `kind`.
|
|
34
|
+
- `id` is optional in the XR Blocks host's `CreateWindowOptions`; a window created without one is named `uix-window-<n>`, as on IWSDK. The options also accept `movable` for parity, but this host has no title-bar drag of its own yet, so the flag is recorded and not acted on.
|
|
35
|
+
- The XR Blocks window handle gains `panel` - the document, which already implements `PanelHandle` - and `onReady`, which fires synchronously because uikitml interprets the markup during `createWindow`. The interface is now named `XrBlocksWindowHandle`, with `WindowHandle` kept as an alias, because the core exports a `WindowHandle` of its own.
|
|
36
|
+
- Coverage gates `packages/iwsdk-uiextensions/src/factory.ts` and `src/scene-host.ts` at the same 100% as the core. `new World()` from `@iwsdk/core` constructs headlessly - no renderer, no WebGL, no XR session - so the factories, the scene host and its ECS query all run for real in a node test. The per-frame ECS systems still need a live world and stay outside the gate.
|
|
16
37
|
|
|
17
38
|
[0.1.0]: https://github.com/realitycollective/WebXR-UIExtensions/commits/main
|
package/README.md
CHANGED
|
@@ -32,19 +32,23 @@ if (import.meta.env.DEV || import.meta.env.VITE_UIX_EDIT) {
|
|
|
32
32
|
|
|
33
33
|
All parts are individually exported (`readEditToken`, `isTokenAccepted`, `resolveEditSession`) and unit-tested - see `test/gate.test.ts`.
|
|
34
34
|
|
|
35
|
-
## Runtime
|
|
35
|
+
## Runtime panel sources
|
|
36
36
|
|
|
37
37
|
```ts
|
|
38
38
|
import { compilePanelSource } from '@realitycollective/uix-devtools';
|
|
39
39
|
import { createUIWindow } from '@realitycollective/iwsdk-uiextensions';
|
|
40
40
|
|
|
41
|
-
const
|
|
42
|
-
if (
|
|
43
|
-
createUIWindow(world, { id: 'live', title: 'Live', config:
|
|
41
|
+
const panel = compilePanelSource(source); // validates, then wraps in a blob: URL
|
|
42
|
+
if (panel.errors.length === 0) {
|
|
43
|
+
createUIWindow(world, { id: 'live', title: 'Live', config: panel.configUrl });
|
|
44
44
|
}
|
|
45
45
|
```
|
|
46
46
|
|
|
47
|
-
`compilePanelSource`
|
|
47
|
+
`compilePanelSource` validates UIKitML with the same parser IWSDK loads (`@drawcall/uikitml`, pinned to the version `@iwsdk/core` depends on) and serves the **source** through a `blob:` URL, which `PanelUI` fetches like any file - so panels can be authored, edited and respawned entirely at runtime. Diagnostics land in `errors` instead of throwing, and a source with errors still gets a `configUrl` so the failure is visible in-world rather than silent.
|
|
48
|
+
|
|
49
|
+
Pass `componentSets` to validate against the same application-defined components the world was created with; otherwise markup using them reports unknown-component diagnostics here even though it loads correctly at runtime.
|
|
50
|
+
|
|
51
|
+
> **Changed in IWSDK 0.5.** On 0.4.x `PanelUI.config` pointed at JSON emitted by `@iwsdk/vite-plugin-uikitml`; that plugin was discontinued at 0.4.2. On 0.5.x `PanelUISystem` fetches `config` as text and parses the UIKitML itself, so there is no compile step left. `CompiledPanel.json` is now `CompiledPanel.source`, and the `resolveFile` option is gone - the 0.5 parser has no `<link ref>` stylesheet resolution. Put shared rules in a `<style>` block; multiple `<style>` elements are allowed and merge.
|
|
48
52
|
|
|
49
53
|
## The `uix-dev` CLI
|
|
50
54
|
|
|
@@ -1,10 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime UIKitML panel sources.
|
|
3
|
+
*
|
|
4
|
+
* IWSDK 0.5 changed what `PanelUI.config` points at. On 0.4.x it was a URL to
|
|
5
|
+
* the JSON the `@iwsdk/vite-plugin-uikitml` build step emitted; that plugin was
|
|
6
|
+
* discontinued at 0.4.2. On 0.5.x `PanelUISystem` fetches `config` as TEXT and
|
|
7
|
+
* parses the UIKitML source itself, so there is no compile step left to run.
|
|
8
|
+
*
|
|
9
|
+
* What remains useful at runtime is the pairing of a validated source with a
|
|
10
|
+
* `blob:` URL that `PanelUI` can load like any file:
|
|
11
|
+
*
|
|
12
|
+
* const panel = compilePanelSource(source);
|
|
13
|
+
* createUIWindow(world, { config: panel.configUrl, ... });
|
|
14
|
+
*
|
|
15
|
+
* This is the mechanism behind live UX editing (desktop workbench and
|
|
16
|
+
* in-headset editor alike): edit markup → revalidate → respawn the window.
|
|
17
|
+
*
|
|
18
|
+
* Validation uses the same parser IWSDK itself loads (`@drawcall/uikitml`,
|
|
19
|
+
* pinned to the version `@iwsdk/core` depends on), so a source that passes here
|
|
20
|
+
* is a source `PanelUISystem` will accept. Nothing is parsed twice at load time:
|
|
21
|
+
* the parse below exists only to produce diagnostics the editor can show.
|
|
22
|
+
*/
|
|
23
|
+
import { type ComponentSet } from '@drawcall/uikitml';
|
|
1
24
|
export interface CompiledPanel {
|
|
2
|
-
/**
|
|
3
|
-
|
|
4
|
-
/**
|
|
25
|
+
/** The UIKitML source, exactly as `PanelUI.config` will fetch it. */
|
|
26
|
+
source: string;
|
|
27
|
+
/** Validation diagnostics. Empty when the source parses cleanly. */
|
|
5
28
|
errors: string[];
|
|
6
29
|
/**
|
|
7
|
-
* `blob:` URL serving {@link
|
|
30
|
+
* `blob:` URL serving {@link source}; hand this to `PanelUI.config`.
|
|
8
31
|
* Empty string in non-browser environments (node tests).
|
|
9
32
|
*/
|
|
10
33
|
configUrl: string;
|
|
@@ -13,12 +36,15 @@ export interface CompiledPanel {
|
|
|
13
36
|
}
|
|
14
37
|
export interface CompileOptions {
|
|
15
38
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
39
|
+
* Component sets to validate against, matching whatever the world was
|
|
40
|
+
* configured with. Omit to validate against the built-in set only - markup
|
|
41
|
+
* using kit components would then report unknown-component diagnostics here
|
|
42
|
+
* even though it loads correctly at runtime.
|
|
20
43
|
*/
|
|
21
|
-
|
|
44
|
+
componentSets?: ComponentSet[];
|
|
22
45
|
}
|
|
23
|
-
/**
|
|
46
|
+
/**
|
|
47
|
+
* Validate UIKitML source and wrap it in a `blob:` URL for `PanelUI.config`.
|
|
48
|
+
* Collects diagnostics instead of throwing.
|
|
49
|
+
*/
|
|
24
50
|
export declare function compilePanelSource(source: string, options?: CompileOptions): CompiledPanel;
|
package/dist/runtime-compile.js
CHANGED
|
@@ -1,42 +1,49 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Runtime UIKitML
|
|
2
|
+
* Runtime UIKitML panel sources.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* URLs, so a runtime-compiled panel is:
|
|
4
|
+
* IWSDK 0.5 changed what `PanelUI.config` points at. On 0.4.x it was a URL to
|
|
5
|
+
* the JSON the `@iwsdk/vite-plugin-uikitml` build step emitted; that plugin was
|
|
6
|
+
* discontinued at 0.4.2. On 0.5.x `PanelUISystem` fetches `config` as TEXT and
|
|
7
|
+
* parses the UIKitML source itself, so there is no compile step left to run.
|
|
9
8
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* What remains useful at runtime is the pairing of a validated source with a
|
|
10
|
+
* `blob:` URL that `PanelUI` can load like any file:
|
|
11
|
+
*
|
|
12
|
+
* const panel = compilePanelSource(source);
|
|
13
|
+
* createUIWindow(world, { config: panel.configUrl, ... });
|
|
12
14
|
*
|
|
13
15
|
* This is the mechanism behind live UX editing (desktop workbench and
|
|
14
|
-
* in-headset editor alike): edit markup →
|
|
16
|
+
* in-headset editor alike): edit markup → revalidate → respawn the window.
|
|
17
|
+
*
|
|
18
|
+
* Validation uses the same parser IWSDK itself loads (`@drawcall/uikitml`,
|
|
19
|
+
* pinned to the version `@iwsdk/core` depends on), so a source that passes here
|
|
20
|
+
* is a source `PanelUISystem` will accept. Nothing is parsed twice at load time:
|
|
21
|
+
* the parse below exists only to produce diagnostics the editor can show.
|
|
22
|
+
*/
|
|
23
|
+
import { parse } from '@drawcall/uikitml';
|
|
24
|
+
/**
|
|
25
|
+
* Validate UIKitML source and wrap it in a `blob:` URL for `PanelUI.config`.
|
|
26
|
+
* Collects diagnostics instead of throwing.
|
|
15
27
|
*/
|
|
16
|
-
import { parse } from '@pmndrs/uikitml';
|
|
17
|
-
/** Compile UIKitML source text. Collects errors instead of throwing. */
|
|
18
28
|
export function compilePanelSource(source, options = {}) {
|
|
19
29
|
const errors = [];
|
|
20
|
-
const result = parse(source, {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
});
|
|
26
|
-
if (result.element === undefined) {
|
|
27
|
-
errors.push('UIKitML source produced no root element.');
|
|
30
|
+
const result = parse(source, options.componentSets ? { componentSets: options.componentSets } : {});
|
|
31
|
+
if (!result.success) {
|
|
32
|
+
for (const error of result.errors) {
|
|
33
|
+
errors.push(error.message);
|
|
34
|
+
}
|
|
28
35
|
}
|
|
29
|
-
const json = JSON.stringify(result, null, 2);
|
|
30
36
|
const blobSupported = typeof URL !== 'undefined' &&
|
|
31
37
|
typeof URL.createObjectURL === 'function' &&
|
|
32
38
|
typeof Blob !== 'undefined';
|
|
33
39
|
/* v8 ignore start -- only reachable in environments without Blob support */
|
|
34
40
|
if (!blobSupported) {
|
|
35
|
-
return {
|
|
41
|
+
return { source, errors, configUrl: '', revoke: () => { } };
|
|
36
42
|
}
|
|
37
43
|
/* v8 ignore stop */
|
|
38
|
-
|
|
44
|
+
// text/html rather than application/json: 0.5 reads this as UIKitML source.
|
|
45
|
+
const blob = new Blob([source], { type: 'text/html' });
|
|
39
46
|
const url = URL.createObjectURL(blob);
|
|
40
|
-
return {
|
|
47
|
+
return { source, errors, configUrl: url, revoke: () => URL.revokeObjectURL(url) };
|
|
41
48
|
}
|
|
42
49
|
//# sourceMappingURL=runtime-compile.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-compile.js","sourceRoot":"","sources":["../src/runtime-compile.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"runtime-compile.js","sourceRoot":"","sources":["../src/runtime-compile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAAE,KAAK,EAAqB,MAAM,mBAAmB,CAAC;AA0B7D;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAc,EACd,UAA0B,EAAE;IAE5B,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,MAAM,MAAM,GAAG,KAAK,CAClB,MAAM,EACN,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CACtE,CAAC;IACF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GACjB,OAAO,GAAG,KAAK,WAAW;QAC1B,OAAO,GAAG,CAAC,eAAe,KAAK,UAAU;QACzC,OAAO,IAAI,KAAK,WAAW,CAAC;IAC9B,4EAA4E;IAC5E,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC;IAC7D,CAAC;IACD,oBAAoB;IAEpB,4EAA4E;IAC5E,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IACvD,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;AACpF,CAAC","sourcesContent":["/**\n * Runtime UIKitML panel sources.\n *\n * IWSDK 0.5 changed what `PanelUI.config` points at. On 0.4.x it was a URL to\n * the JSON the `@iwsdk/vite-plugin-uikitml` build step emitted; that plugin was\n * discontinued at 0.4.2. On 0.5.x `PanelUISystem` fetches `config` as TEXT and\n * parses the UIKitML source itself, so there is no compile step left to run.\n *\n * What remains useful at runtime is the pairing of a validated source with a\n * `blob:` URL that `PanelUI` can load like any file:\n *\n * const panel = compilePanelSource(source);\n * createUIWindow(world, { config: panel.configUrl, ... });\n *\n * This is the mechanism behind live UX editing (desktop workbench and\n * in-headset editor alike): edit markup → revalidate → respawn the window.\n *\n * Validation uses the same parser IWSDK itself loads (`@drawcall/uikitml`,\n * pinned to the version `@iwsdk/core` depends on), so a source that passes here\n * is a source `PanelUISystem` will accept. Nothing is parsed twice at load time:\n * the parse below exists only to produce diagnostics the editor can show.\n */\nimport { parse, type ComponentSet } from '@drawcall/uikitml';\n\nexport interface CompiledPanel {\n /** The UIKitML source, exactly as `PanelUI.config` will fetch it. */\n source: string;\n /** Validation diagnostics. Empty when the source parses cleanly. */\n errors: string[];\n /**\n * `blob:` URL serving {@link source}; hand this to `PanelUI.config`.\n * Empty string in non-browser environments (node tests).\n */\n configUrl: string;\n /** Release the blob URL once the panel has loaded (or on discard). */\n revoke(): void;\n}\n\nexport interface CompileOptions {\n /**\n * Component sets to validate against, matching whatever the world was\n * configured with. Omit to validate against the built-in set only - markup\n * using kit components would then report unknown-component diagnostics here\n * even though it loads correctly at runtime.\n */\n componentSets?: ComponentSet[];\n}\n\n/**\n * Validate UIKitML source and wrap it in a `blob:` URL for `PanelUI.config`.\n * Collects diagnostics instead of throwing.\n */\nexport function compilePanelSource(\n source: string,\n options: CompileOptions = {},\n): CompiledPanel {\n const errors: string[] = [];\n\n const result = parse(\n source,\n options.componentSets ? { componentSets: options.componentSets } : {},\n );\n if (!result.success) {\n for (const error of result.errors) {\n errors.push(error.message);\n }\n }\n\n const blobSupported =\n typeof URL !== 'undefined' &&\n typeof URL.createObjectURL === 'function' &&\n typeof Blob !== 'undefined';\n /* v8 ignore start -- only reachable in environments without Blob support */\n if (!blobSupported) {\n return { source, errors, configUrl: '', revoke: () => {} };\n }\n /* v8 ignore stop */\n\n // text/html rather than application/json: 0.5 reads this as UIKitML source.\n const blob = new Blob([source], { type: 'text/html' });\n const url = URL.createObjectURL(blob);\n return { source, errors, configUrl: url, revoke: () => URL.revokeObjectURL(url) };\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@realitycollective/uix-devtools",
|
|
3
|
-
"version": "0.1.0-preview.
|
|
3
|
+
"version": "0.1.0-preview.2",
|
|
4
4
|
"description": "Developer tooling for @realitycollective/iwsdk-uiextensions - edit-session launch gate, runtime UIKitML compilation, and the uix-dev CLI (Cloudflare quick tunnel + QR onboarding for headset testing). Never ship this in a player-facing bundle.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"realitycollective",
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@
|
|
44
|
+
"@drawcall/uikitml": "0.1.8",
|
|
45
45
|
"qrcode-terminal": "^0.12.0"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|