three-live 1.3.2 → 1.4.0
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/README.md +4 -1
- package/dist/index.d.ts +190 -0
- package/dist/three-author-engine.js +171 -163
- package/dist/three-author.cjs +145 -163
- package/dist/three-author.d.ts +190 -0
- package/dist/three-author.js +145 -163
- package/dist/three-convert.cjs +142 -160
- package/dist/three-convert.d.ts +190 -0
- package/dist/three-convert.js +142 -160
- package/dist/three-live-ai.cjs +41 -0
- package/dist/three-live-ai.d.ts +759 -0
- package/dist/three-live-ai.js +41 -0
- package/dist/three-live-ai.min.js +41 -0
- package/dist/three-live-animation.cjs +6 -6
- package/dist/three-live-animation.d.ts +190 -0
- package/dist/three-live-animation.js +5 -5
- package/dist/three-live-animation.min.js +5 -5
- package/dist/three-live-cad.cjs +2 -2
- package/dist/three-live-cad.d.ts +190 -0
- package/dist/three-live-cad.js +2 -2
- package/dist/three-live-cad.min.js +2 -2
- package/dist/three-live-element.cjs +50 -85
- package/dist/three-live-element.d.ts +190 -0
- package/dist/three-live-element.js +50 -85
- package/dist/three-live-full.cjs +907 -189
- package/dist/three-live-full.js +907 -189
- package/dist/three-live-full.min.js +907 -189
- package/dist/three-live-procedural.cjs +16 -0
- package/dist/three-live-procedural.d.ts +759 -0
- package/dist/three-live-procedural.js +16 -0
- package/dist/three-live-procedural.min.js +16 -0
- package/dist/three-live-sandbox.html +11 -1
- package/dist/three-live-studio.cjs +72 -17
- package/dist/three-live-studio.d.ts +190 -0
- package/dist/three-live-studio.js +72 -17
- package/dist/three-live-studio.min.js +73 -18
- package/dist/three-live-tsl.cjs +103 -0
- package/dist/three-live-tsl.d.ts +759 -0
- package/dist/three-live-tsl.js +103 -0
- package/dist/three-live-tsl.min.js +103 -0
- package/dist/three-live-viewer.cjs +50 -85
- package/dist/three-live-viewer.d.ts +190 -0
- package/dist/three-live-viewer.js +50 -85
- package/dist/three-live-viewer.min.js +50 -85
- package/dist/three-live-webgpu.cjs +585 -0
- package/dist/three-live-webgpu.d.ts +759 -0
- package/dist/three-live-webgpu.js +585 -0
- package/dist/three-live-webgpu.min.js +585 -0
- package/dist/three-live.cjs +147 -165
- package/dist/three-live.js +147 -165
- package/dist/three-live.min.js +147 -165
- package/dist/three-view.cjs +49 -84
- package/dist/three-view.d.ts +190 -0
- package/dist/three-view.js +50 -85
- package/dist/three-xr.cjs +141 -159
- package/dist/three-xr.d.ts +190 -0
- package/dist/three-xr.js +140 -158
- package/package.json +21 -1
|
@@ -0,0 +1,759 @@
|
|
|
1
|
+
// Copyright 2026 Google LLC
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @fileoverview Ambient and module declarations for three-live and xr-live.
|
|
17
|
+
* Enables zero-config, type-safe usage of <three-live> and <xr-live> in React 19,
|
|
18
|
+
* Next.js, Vue, Svelte, and modern TSX/JSX environments.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import type {
|
|
22
|
+
CameraState,
|
|
23
|
+
ShadowMapsMode,
|
|
24
|
+
ThreeLiveElement,
|
|
25
|
+
} from './three-live/src/three-live-element';
|
|
26
|
+
import type {
|
|
27
|
+
CameraDetail,
|
|
28
|
+
GLBData,
|
|
29
|
+
HitDetail,
|
|
30
|
+
ThreeView,
|
|
31
|
+
} from './three-live/src/three-view';
|
|
32
|
+
import type {ARLaunchResult, ARMode} from './three-live/src/three-xr';
|
|
33
|
+
import type {
|
|
34
|
+
Detection3D,
|
|
35
|
+
DimensionUnit,
|
|
36
|
+
ExplodeMode,
|
|
37
|
+
RemotePeerState,
|
|
38
|
+
SnapSurfaceMode,
|
|
39
|
+
TranscriptEvent,
|
|
40
|
+
} from './xr-live/src/plugins/index';
|
|
41
|
+
import type {
|
|
42
|
+
XRAnchorElement,
|
|
43
|
+
XRDepthMode,
|
|
44
|
+
XRHandsMode,
|
|
45
|
+
XRLiveElement,
|
|
46
|
+
XRMode,
|
|
47
|
+
XRProfile,
|
|
48
|
+
XRSimulatorRoom,
|
|
49
|
+
} from './xr-live/src/xr-live-element';
|
|
50
|
+
|
|
51
|
+
export * from './three-live/src/core';
|
|
52
|
+
export {
|
|
53
|
+
cadPlugin,
|
|
54
|
+
installCadExtension,
|
|
55
|
+
MAX_BSP_DEPTH,
|
|
56
|
+
MAX_CSG_TRIANGLES,
|
|
57
|
+
MAX_SHAPE_POINTS,
|
|
58
|
+
MAX_TEXT_GEOMETRY_CHARS,
|
|
59
|
+
type ExtrudeGeometryOptions,
|
|
60
|
+
type TextGeometryOptions,
|
|
61
|
+
} from './three-live/src/plugins/cad';
|
|
62
|
+
export {
|
|
63
|
+
ikPlugin,
|
|
64
|
+
IKSolver,
|
|
65
|
+
quatFromUnitVectors,
|
|
66
|
+
solveFABRIK,
|
|
67
|
+
solveTwoBoneIK,
|
|
68
|
+
type FABRIKSolution,
|
|
69
|
+
type IKQuat,
|
|
70
|
+
type TwoBoneIKSolution,
|
|
71
|
+
} from './three-live/src/plugins/ik';
|
|
72
|
+
export {
|
|
73
|
+
extractNodeInstancing,
|
|
74
|
+
instancingPlugin,
|
|
75
|
+
} from './three-live/src/plugins/instancing';
|
|
76
|
+
export {
|
|
77
|
+
getInteractivityVM,
|
|
78
|
+
interactivityPlugin,
|
|
79
|
+
InteractivityVM,
|
|
80
|
+
parseSafeGltfPointer,
|
|
81
|
+
sendInteractivityEvent,
|
|
82
|
+
type InteractivityDeclaration,
|
|
83
|
+
type InteractivityEventDef,
|
|
84
|
+
type InteractivityFlowTarget,
|
|
85
|
+
type InteractivityGraph,
|
|
86
|
+
type InteractivityNode,
|
|
87
|
+
type InteractivityValue,
|
|
88
|
+
type InteractivityValueSocket,
|
|
89
|
+
type InteractivityVariableDef,
|
|
90
|
+
} from './three-live/src/plugins/interactivity';
|
|
91
|
+
export {
|
|
92
|
+
decimateGeometry,
|
|
93
|
+
getLodController,
|
|
94
|
+
installLodExtension,
|
|
95
|
+
LOD,
|
|
96
|
+
LodController,
|
|
97
|
+
lodPlugin,
|
|
98
|
+
materializeLodGeometry,
|
|
99
|
+
parseLod,
|
|
100
|
+
selectLodLevelIndex,
|
|
101
|
+
type LodGroupState,
|
|
102
|
+
type LodLevel,
|
|
103
|
+
type LodOptions,
|
|
104
|
+
} from './three-live/src/plugins/lod';
|
|
105
|
+
export {
|
|
106
|
+
applyMeshoptFilter,
|
|
107
|
+
decodeMeshoptBuffer,
|
|
108
|
+
decodeMeshoptGLB,
|
|
109
|
+
encodeMeshoptBuffer,
|
|
110
|
+
meshoptDecoder,
|
|
111
|
+
meshoptPlugin,
|
|
112
|
+
type MeshoptFilter,
|
|
113
|
+
type MeshoptMode,
|
|
114
|
+
} from './three-live/src/plugins/meshopt';
|
|
115
|
+
export {
|
|
116
|
+
computeOutlineClipOffset,
|
|
117
|
+
evaluateKawaseBloom,
|
|
118
|
+
parseHexRgb,
|
|
119
|
+
postprocessingPlugin,
|
|
120
|
+
resolveViewerBloom,
|
|
121
|
+
} from './three-live/src/plugins/postprocessing';
|
|
122
|
+
export {
|
|
123
|
+
installProceduralExtension,
|
|
124
|
+
proceduralPlugin,
|
|
125
|
+
} from './three-live/src/plugins/procedural';
|
|
126
|
+
export {
|
|
127
|
+
computeWorldSceneBounds,
|
|
128
|
+
doesMeshCastShadow,
|
|
129
|
+
doesMeshReceiveShadow,
|
|
130
|
+
fitDirectionalShadowMatrix,
|
|
131
|
+
fitSpotShadowMatrix,
|
|
132
|
+
getShadowMapStats,
|
|
133
|
+
MAX_SHADOW_LIGHTS,
|
|
134
|
+
normalizeShadowMapsMode,
|
|
135
|
+
resolveActiveShadowLights,
|
|
136
|
+
SHADOW_MAP_TEXTURE_UNIT,
|
|
137
|
+
shadowMapsPlugin,
|
|
138
|
+
type ResolvedShadowPlan,
|
|
139
|
+
type ResolvedShadowSlice,
|
|
140
|
+
type ShadowMapStats,
|
|
141
|
+
type WorldSceneBounds,
|
|
142
|
+
} from './three-live/src/plugins/shadow-maps';
|
|
143
|
+
export {
|
|
144
|
+
extractMaterialVariants,
|
|
145
|
+
extractPrimitiveVariantMappings,
|
|
146
|
+
selectMaterialVariant,
|
|
147
|
+
variantsPlugin,
|
|
148
|
+
type VariantMapping,
|
|
149
|
+
} from './three-live/src/plugins/variants';
|
|
150
|
+
export {
|
|
151
|
+
defineModelViewer,
|
|
152
|
+
ThreeLiveElement,
|
|
153
|
+
type ARLaunchOptions,
|
|
154
|
+
type ARLaunchResult,
|
|
155
|
+
type ARMode,
|
|
156
|
+
type ARProvider,
|
|
157
|
+
type CameraState,
|
|
158
|
+
} from './three-live/src/three-live-element';
|
|
159
|
+
export {
|
|
160
|
+
XRAnchorElement,
|
|
161
|
+
XRLiveElement,
|
|
162
|
+
type XRDepthMode,
|
|
163
|
+
type XRHandsMode,
|
|
164
|
+
type XRMode,
|
|
165
|
+
type XRProfile,
|
|
166
|
+
type XRSimulatorRoom,
|
|
167
|
+
} from './xr-live/src/xr-live-element';
|
|
168
|
+
/** Opt-in bring-your-own-LLM scene editing (`three-live/ai`, `three-live-ai.min.js`). */
|
|
169
|
+
export {
|
|
170
|
+
aiPlugin,
|
|
171
|
+
createAIChatProvider,
|
|
172
|
+
editScene,
|
|
173
|
+
extractScript,
|
|
174
|
+
undoEdit,
|
|
175
|
+
} from './three-live/src/plugins/ai';
|
|
176
|
+
export type {
|
|
177
|
+
AIChatContentPart,
|
|
178
|
+
AIChatMessage,
|
|
179
|
+
AIChatProviderOptions,
|
|
180
|
+
EditSceneOptions,
|
|
181
|
+
EditSceneResult,
|
|
182
|
+
ThreeLiveAIProvider,
|
|
183
|
+
} from './three-live/src/plugins/ai';
|
|
184
|
+
export {
|
|
185
|
+
buildImageMessages,
|
|
186
|
+
buildImageUserText,
|
|
187
|
+
compileFromImage,
|
|
188
|
+
detectImageMime,
|
|
189
|
+
formatSpatialPriors,
|
|
190
|
+
IMAGE_SYSTEM_PROMPT,
|
|
191
|
+
imageRepairMessage,
|
|
192
|
+
isAllowedImageUrl,
|
|
193
|
+
normalizeImageInput,
|
|
194
|
+
} from './three-live/src/plugins/ai-image';
|
|
195
|
+
export type {
|
|
196
|
+
AIImageInput,
|
|
197
|
+
AISpatialCamera,
|
|
198
|
+
AISpatialObject,
|
|
199
|
+
AISpatialPlane,
|
|
200
|
+
AISpatialPriors,
|
|
201
|
+
CompileFromImageOptions,
|
|
202
|
+
} from './three-live/src/plugins/ai-image';
|
|
203
|
+
/** AI PBR textures: texture packs and image providers (part of `three-live-ai.min.js`). */
|
|
204
|
+
export {
|
|
205
|
+
browserImageCodec,
|
|
206
|
+
createAIImageProvider,
|
|
207
|
+
indexedDbTextureCache,
|
|
208
|
+
parseTexturePack,
|
|
209
|
+
prepareAlbedo,
|
|
210
|
+
serializeTexturePack,
|
|
211
|
+
TEXTURE_PROMPT_SUFFIX,
|
|
212
|
+
textureRequests,
|
|
213
|
+
} from './three-live/src/plugins/ai-texture';
|
|
214
|
+
export type {
|
|
215
|
+
AIImageProviderOptions,
|
|
216
|
+
AITextureSpec,
|
|
217
|
+
GenerateTexturesOptions,
|
|
218
|
+
GenerateTexturesResult,
|
|
219
|
+
TextureCache,
|
|
220
|
+
TextureCacheRecord,
|
|
221
|
+
TextureImageCodec,
|
|
222
|
+
TextureMiss,
|
|
223
|
+
TexturePackEntry,
|
|
224
|
+
TexturePackJSON,
|
|
225
|
+
ThreeLiveImageProvider,
|
|
226
|
+
} from './three-live/src/plugins/ai-texture';
|
|
227
|
+
/** "Tap & Speak" voice editing (part of `three-live-ai.min.js`). */
|
|
228
|
+
export {
|
|
229
|
+
hideSelectionChips,
|
|
230
|
+
showSelectionChips,
|
|
231
|
+
} from './three-live/src/plugins/ai-select-chips';
|
|
232
|
+
export type {AISelectChipsState} from './three-live/src/plugins/ai-select-chips';
|
|
233
|
+
export {
|
|
234
|
+
AIVoiceSession,
|
|
235
|
+
connectVoice,
|
|
236
|
+
createWebSpeechRecognizer,
|
|
237
|
+
describeEditResult,
|
|
238
|
+
describeVoiceSelection,
|
|
239
|
+
geminiLiveAdapter,
|
|
240
|
+
realtimeAdapter,
|
|
241
|
+
selectByVoice,
|
|
242
|
+
selectNamesByVoice,
|
|
243
|
+
setSelectOnTap,
|
|
244
|
+
speakableName,
|
|
245
|
+
startVoiceEdit,
|
|
246
|
+
} from './three-live/src/plugins/ai-voice';
|
|
247
|
+
/** Multi-select for Tap & Speak / Talk-to-Select (part of `three-live-ai.min.js`). */
|
|
248
|
+
export {
|
|
249
|
+
describeSelection,
|
|
250
|
+
getSelection,
|
|
251
|
+
parseSelectReply,
|
|
252
|
+
resolveSelection,
|
|
253
|
+
resolveSelectionWithModel,
|
|
254
|
+
sceneSelectEntries,
|
|
255
|
+
selectCamera,
|
|
256
|
+
selectMessages,
|
|
257
|
+
setSelection,
|
|
258
|
+
} from './three-live/src/plugins/ai-select';
|
|
259
|
+
export type {
|
|
260
|
+
AIModelSelection,
|
|
261
|
+
AISelectProvider,
|
|
262
|
+
} from './three-live/src/plugins/ai-select';
|
|
263
|
+
/** Talk-to-Select tier-1 matcher and push-to-talk grammar (mirrors the Rust core). */
|
|
264
|
+
export type {
|
|
265
|
+
AISelectionEventDetail,
|
|
266
|
+
AISelectionMode,
|
|
267
|
+
AISelectionSource,
|
|
268
|
+
} from './three-live/src/plugins/ai-select';
|
|
269
|
+
export {
|
|
270
|
+
buildSelectIndex,
|
|
271
|
+
matchSelection,
|
|
272
|
+
parseVoiceCommand,
|
|
273
|
+
} from './three-live/src/plugins/ai-select-match';
|
|
274
|
+
export type {
|
|
275
|
+
SelectCamera,
|
|
276
|
+
SelectConfidence,
|
|
277
|
+
SelectIndexEntry,
|
|
278
|
+
SelectMatch,
|
|
279
|
+
SelectRawEntry,
|
|
280
|
+
VoiceCommand,
|
|
281
|
+
} from './three-live/src/plugins/ai-select-match';
|
|
282
|
+
export type {
|
|
283
|
+
AIAudioSink,
|
|
284
|
+
AIMicrophoneSource,
|
|
285
|
+
AISpeechRecognizer,
|
|
286
|
+
AIVoiceAdapter,
|
|
287
|
+
AIVoiceEditOptions,
|
|
288
|
+
AIVoiceEditResult,
|
|
289
|
+
AIVoiceEventDetail,
|
|
290
|
+
AIVoiceProviderName,
|
|
291
|
+
AIVoiceSelection,
|
|
292
|
+
AIVoiceSessionOptions,
|
|
293
|
+
AIVoiceState,
|
|
294
|
+
AIVoiceTransport,
|
|
295
|
+
} from './three-live/src/plugins/ai-voice';
|
|
296
|
+
/** Optional spatial plugins (`xr-live/spatial`, `xr-live-spatial.min.js`). */
|
|
297
|
+
export * from './xr-live/src/plugins/index';
|
|
298
|
+
/** Optional simulation plugins (`xr-live/sim`, `xr-live-sim.min.js`). */
|
|
299
|
+
export * from './xr-live/src/sim/index';
|
|
300
|
+
/** Optional WebGPU Gaussian Splatting compute & render accelerator (`xr-live/webgpu`, `xr-live-webgpu.min.js`). */
|
|
301
|
+
export * from './xr-live/src/webgpu';
|
|
302
|
+
/** Optional WebGPU `GPURenderBundle` scene accelerator (`three-live/webgpu`, `three-live-webgpu.min.js`). */
|
|
303
|
+
export * from './three-live/src/webgpu';
|
|
304
|
+
/** Optional Loop-Free `THREE.TSL` & `MeshStandardNodeMaterial` compiler (`three-live/tsl`, `three-live-tsl.min.js`). */
|
|
305
|
+
export * from './three-live/src/tsl';
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* Declarative JSX / HTML attributes supported by the <three-live> custom element.
|
|
309
|
+
*/
|
|
310
|
+
export interface ThreeLiveAttributes {
|
|
311
|
+
/** URL to glTF 2.0 binary (.glb) model. */
|
|
312
|
+
'src'?: string;
|
|
313
|
+
/** URL to Apple Universal Scene Description (.usdz) model for iOS Quick Look. */
|
|
314
|
+
'ios-src'?: string;
|
|
315
|
+
/** URL or inline script for procedural Three.js scene generation. */
|
|
316
|
+
'script-src'?: string;
|
|
317
|
+
/** Responsive image preview shown before 3D model finishes hydration. */
|
|
318
|
+
'poster'?: string;
|
|
319
|
+
/** Uniform or per-axis scale multiplier ("x y z"). */
|
|
320
|
+
'scale'?: string;
|
|
321
|
+
/** Initial camera orbit angles and distance: "theta phi [radius]" (e.g. "0deg 75deg 3m") or JSON string. */
|
|
322
|
+
'camera-orbit'?: string | CameraState;
|
|
323
|
+
/** Orbit center coordinate "x y z". */
|
|
324
|
+
'camera-target'?: string;
|
|
325
|
+
/** Lower bounds for camera orbit ("theta phi radius"). */
|
|
326
|
+
'min-camera-orbit'?: string;
|
|
327
|
+
/** Upper bounds for camera orbit ("theta phi radius"). */
|
|
328
|
+
'max-camera-orbit'?: string;
|
|
329
|
+
/** Vertical field of view angle (e.g. "45deg"). */
|
|
330
|
+
'field-of-view'?: string;
|
|
331
|
+
/** Sub-mesh name to highlight with interactive selection color. */
|
|
332
|
+
'selected-mesh'?: string;
|
|
333
|
+
/** Exposure / lighting multiplier for studio IBL lighting (default: 1.0). */
|
|
334
|
+
'exposure'?: number | string;
|
|
335
|
+
/** Equirectangular HDR/LDR environment map URL. */
|
|
336
|
+
'environment-image'?: string;
|
|
337
|
+
/** Visible background equirectangular skybox image URL. */
|
|
338
|
+
'skybox-image'?: string;
|
|
339
|
+
/** Ground contact shadow opacity (0.0 to 1.0). */
|
|
340
|
+
'shadow-intensity'?: number | string;
|
|
341
|
+
/** Radial Gaussian blur falloff of contact shadow (0.0 to 1.0). */
|
|
342
|
+
'shadow-softness'?: number | string;
|
|
343
|
+
/** Tone mapping mode ("neutral", "aces", "agx", "reinhard", "none"). */
|
|
344
|
+
'tone-mapping'?: string;
|
|
345
|
+
/** Dual-Kawase bloom intensity (0.0 to 5.0). */
|
|
346
|
+
'bloom'?: number | string;
|
|
347
|
+
/** Luminance threshold for bloom extraction (default: 0.8). */
|
|
348
|
+
'bloom-threshold'?: number | string;
|
|
349
|
+
/** Blur radius multiplier for bloom passes (default: 0.5). */
|
|
350
|
+
'bloom-radius'?: number | string;
|
|
351
|
+
/** Declarative silhouette outline toggle or config. */
|
|
352
|
+
'outline'?: boolean | string;
|
|
353
|
+
/** Highlight the currently `selected-mesh` with a silhouette outline. */
|
|
354
|
+
'outline-selected'?: boolean | string;
|
|
355
|
+
/** Silhouette outline CSS hex color (default: "#38bdf8"). */
|
|
356
|
+
'outline-color'?: string;
|
|
357
|
+
/** Enable or disable interactive camera orbit/pan/zoom controls (default: true). */
|
|
358
|
+
'camera-controls'?: boolean | string;
|
|
359
|
+
/** Automatically start keyframe animation playback. */
|
|
360
|
+
'autoplay'?: boolean | string;
|
|
361
|
+
/** Name of specific glTF animation clip to play. */
|
|
362
|
+
'animation-name'?: string;
|
|
363
|
+
/** Name of the active KHR_materials_variants material variant. */
|
|
364
|
+
'variant-name'?: string;
|
|
365
|
+
/** Automatically rotate scene around the Y-axis when user is idle. */
|
|
366
|
+
'auto-rotate'?: boolean | string;
|
|
367
|
+
/** Delay in milliseconds before auto-rotation resumes after user interaction (default: 3000). */
|
|
368
|
+
'auto-rotate-delay'?: number | string;
|
|
369
|
+
/** Rate of turntable auto-rotation (e.g. "30deg", "0.5rad", "100%", default: "30deg"). */
|
|
370
|
+
'rotation-per-second'?: string;
|
|
371
|
+
/** Enable one-tap Augmented Reality button overlay. */
|
|
372
|
+
'ar'?: boolean | string;
|
|
373
|
+
/** Ordered list of AR launch targets ('webxr', 'quick-look', 'scene-viewer'). */
|
|
374
|
+
'ar-modes'?: string;
|
|
375
|
+
/** Controls whether the model can be scaled in AR ("auto" or "fixed"). */
|
|
376
|
+
'ar-scale'?: 'auto' | 'fixed';
|
|
377
|
+
/** Controls whether the model is placed on horizontal surfaces ("floor") or vertical surfaces ("wall"). */
|
|
378
|
+
'ar-placement'?: 'floor' | 'wall';
|
|
379
|
+
/**
|
|
380
|
+
* Mandatory isolation level for procedural scripts. Defaults to `'worker'`,
|
|
381
|
+
* which runs the script in a dedicated Web Worker with network, storage and
|
|
382
|
+
* thread-spawning capabilities revoked across the prototype chain. `'iframe'`
|
|
383
|
+
* runs the Worker inside an opaque-origin `<iframe sandbox="allow-scripts">`
|
|
384
|
+
* (`three-live-sandbox.html`) with a strict `connect-src 'none'` Content
|
|
385
|
+
* Security Policy.
|
|
386
|
+
*/
|
|
387
|
+
sandbox?: 'worker' | 'iframe';
|
|
388
|
+
/**
|
|
389
|
+
* Opt-in attribute allowing client-modified Three.js script strings
|
|
390
|
+
* (`executeScript(code)` and inline `<script type="text/three-live">`).
|
|
391
|
+
* Server-generated scripts (`script-src`) are enabled by default.
|
|
392
|
+
*/
|
|
393
|
+
'allow-client-scripts'?: boolean | string;
|
|
394
|
+
/** `three-live-ai`: Chat Completions-compatible endpoint (your proxy or a local model) for `editScene()`. */
|
|
395
|
+
'ai-endpoint'?: string;
|
|
396
|
+
/** `three-live-ai`: model name sent to `ai-endpoint`. */
|
|
397
|
+
'ai-model'?: string;
|
|
398
|
+
/** `three-live-ai`: provider protocol for `ai-endpoint` (`'ai-chat'`, the default). */
|
|
399
|
+
'ai-provider'?: 'ai-chat';
|
|
400
|
+
/** `three-live-ai`: OpenAI-compatible Images endpoint (`/v1/images/generations`) for AI textures (`userData.xr.material.prompt`). */
|
|
401
|
+
'ai-image-endpoint'?: string;
|
|
402
|
+
/** `three-live-ai`: model name sent to `ai-image-endpoint`. */
|
|
403
|
+
'ai-image-model'?: string;
|
|
404
|
+
/** `three-live-ai`: `'auto'` (default) generates missing AI textures when an image endpoint is configured; `'manual'` waits for `el.generateTextures()`. */
|
|
405
|
+
'ai-textures'?: 'auto' | 'manual';
|
|
406
|
+
/** `three-live-ai`: URL of a texture pack (`scene.textures.json`) for AI textures. */
|
|
407
|
+
'texture-pack'?: string;
|
|
408
|
+
/** `three-live-webgpu`: scene rendering backend (`'auto'`, `'webgpu'`, or `'webgl2'`). */
|
|
409
|
+
renderer?: 'auto' | 'webgpu' | 'webgl2' | string;
|
|
410
|
+
/** `three-live-studio` / `shadowMapsPlugin`: multi-light depth shadow maps (`'auto'`, `'pcf'`, or `'off'`). */
|
|
411
|
+
'shadow-maps'?: ShadowMapsMode | string;
|
|
412
|
+
/** `xr-live-webgpu`: Gaussian splatting backend (`'auto'`, `'webgpu'`, `'hybrid'`, or `'webgl2'`). */
|
|
413
|
+
'splat-renderer'?: 'auto' | 'webgpu' | 'hybrid' | 'webgl2' | string;
|
|
414
|
+
/** `xr-live-spatial` / `xr-live-webgpu`: Spherical Harmonics view-dependent color quality (`'normal'` or `'high'`). */
|
|
415
|
+
'splat-quality'?: 'normal' | 'high' | string;
|
|
416
|
+
/** Allow cross-origin `.splat` / `.spz` URLs on `userData.xr.splatUrl`. */
|
|
417
|
+
'allow-remote-splats'?: boolean | string;
|
|
418
|
+
/** `three-live-ai`: tapping a mesh selects it (tap again to clear; Shift/Ctrl/Cmd-tap or long-press adds to `el.selectedMeshes`). */
|
|
419
|
+
'ai-select-on-tap'?: boolean | string;
|
|
420
|
+
/** `three-live-ai`: show a mic button (push-to-talk, or a realtime session when `ai-voice-url` is set). */
|
|
421
|
+
'ai-voice-button'?: boolean | string;
|
|
422
|
+
/** `three-live-ai`: `wss://` realtime voice endpoint (your proxy or an ephemeral-token URL) for the mic button. */
|
|
423
|
+
'ai-voice-url'?: string;
|
|
424
|
+
/** `three-live-ai`: realtime voice protocol for `ai-voice-url` (`'ai-realtime'`, the default, or `'gemini-live'`). */
|
|
425
|
+
'ai-voice-provider'?: 'ai-realtime' | 'gemini-live';
|
|
426
|
+
/** `three-live-ai`: model name sent in the realtime session setup. */
|
|
427
|
+
'ai-voice-model'?: string;
|
|
428
|
+
|
|
429
|
+
// React 19 / JSX Event Listeners
|
|
430
|
+
onload?: (e: CustomEvent<{model: GLBData}>) => void;
|
|
431
|
+
onerror?: (e: CustomEvent<{error: any}>) => void;
|
|
432
|
+
'onthree-load'?: (
|
|
433
|
+
e: CustomEvent<{model: GLBData; source?: 'src' | 'model'}>,
|
|
434
|
+
) => void;
|
|
435
|
+
'onthree-error'?: (
|
|
436
|
+
e: CustomEvent<{error: any; message: string; stage: string}>,
|
|
437
|
+
) => void;
|
|
438
|
+
'onthree-context-lost'?: (e: CustomEvent<{originalEvent?: Event}>) => void;
|
|
439
|
+
'onthree-context-restored'?: (
|
|
440
|
+
e: CustomEvent<{originalEvent?: Event}>,
|
|
441
|
+
) => void;
|
|
442
|
+
onmeshclick?: (e: CustomEvent<HitDetail>) => void;
|
|
443
|
+
'oncamera-change'?: (e: CustomEvent<CameraDetail>) => void;
|
|
444
|
+
'onvariant-applied'?: (e: CustomEvent<{variantName: string | null}>) => void;
|
|
445
|
+
'onar-status'?: (
|
|
446
|
+
e: CustomEvent<{
|
|
447
|
+
status: 'session-started' | 'not-presenting' | 'failed';
|
|
448
|
+
error?: any;
|
|
449
|
+
}>,
|
|
450
|
+
) => void;
|
|
451
|
+
|
|
452
|
+
// Standard HTML / JSX attributes
|
|
453
|
+
id?: string;
|
|
454
|
+
className?: string;
|
|
455
|
+
class?: string;
|
|
456
|
+
style?: any;
|
|
457
|
+
ref?: any;
|
|
458
|
+
key?: any;
|
|
459
|
+
slot?: string;
|
|
460
|
+
tabIndex?: number;
|
|
461
|
+
role?: string;
|
|
462
|
+
'aria-label'?: string;
|
|
463
|
+
children?: any;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
/**
|
|
467
|
+
* Declarative JSX / HTML attributes supported by the <xr-live> spatial computing element.
|
|
468
|
+
*/
|
|
469
|
+
export interface XRLiveAttributes extends ThreeLiveAttributes {
|
|
470
|
+
/** WebXR session target mode ("ar", "vr", "inline", or "auto"). */
|
|
471
|
+
'xr-mode'?: XRMode;
|
|
472
|
+
/** Real-world hardware depth occlusion or physics mode ("occlusion", "occlusion-physics", "mesh", "none"). */
|
|
473
|
+
'xr-depth'?: XRDepthMode;
|
|
474
|
+
/** 25-joint hand tracking and gesture recognition mode ("gestures", "joints", "pinch", "none"). */
|
|
475
|
+
'xr-hands'?: XRHandsMode;
|
|
476
|
+
/** Desktop 3D room preview environment, unrelated to `xr-live-sim` ("living-room", "office", "tabletop", "none"). */
|
|
477
|
+
'xr-simulator'?: XRSimulatorRoom;
|
|
478
|
+
/** Spatial UI profile ("quest3", "android-xr", "visionos", "auto"). */
|
|
479
|
+
'xr-profile'?: XRProfile;
|
|
480
|
+
/** Play procedural Web Audio earcons and haptics on spatial interactions. */
|
|
481
|
+
'sound-feedback'?: boolean | string;
|
|
482
|
+
/** Spatial plugin: enables plane/mesh detection; include "reticle" for a gaze reticle. */
|
|
483
|
+
'world-understanding'?: boolean | string;
|
|
484
|
+
/** Spatial plugin: pinch in empty space to paint 3D tubes (optional `#rrggbb` color). */
|
|
485
|
+
'spatial-paint'?: boolean | string;
|
|
486
|
+
/** Spatial plugin: 3D dimension callouts and AR tape measure ("bounds", "tape", "all", "none"). */
|
|
487
|
+
'spatial-measure'?: boolean | 'bounds' | 'tape' | 'all' | 'none' | string;
|
|
488
|
+
/** Default display unit for `spatial-measure` ("auto", "m", "cm", "mm", "in", "ft-in"). */
|
|
489
|
+
'measure-unit'?: DimensionUnit;
|
|
490
|
+
/** Spatial plugin: socket, grid, surface, and angle snapping ("grid", "surface", "sockets", "all", "none"). */
|
|
491
|
+
'magnetic-snap'?:
|
|
492
|
+
| boolean
|
|
493
|
+
| 'grid'
|
|
494
|
+
| 'surface'
|
|
495
|
+
| 'sockets'
|
|
496
|
+
| 'all'
|
|
497
|
+
| 'none'
|
|
498
|
+
| string;
|
|
499
|
+
/** Cartesian snap grid step in meters ("0.05" or "0.05 0.05 0.05"). */
|
|
500
|
+
'snap-grid'?: number | string;
|
|
501
|
+
/** Rotational yaw snap increment in degrees (0 to 180). */
|
|
502
|
+
'snap-angle'?: number | string;
|
|
503
|
+
/** Spatial plugin: hands-free eye/head gaze reticle and dwell selection ("auto", "none", or boolean). */
|
|
504
|
+
'gaze-dwell'?: boolean | 'auto' | 'none' | string;
|
|
505
|
+
/** Default dwell duration in milliseconds for `gaze-dwell` (250 to 10000, default: 1200). */
|
|
506
|
+
'dwell-time'?: number | string;
|
|
507
|
+
/** Spatial plugin: normalized [0..1] multi-part exploded-view factor. */
|
|
508
|
+
'explode'?: number | string;
|
|
509
|
+
/** Multi-part explosion vector strategy ("radial", "axial-x", "axial-y", "axial-z", "hierarchical"). */
|
|
510
|
+
'explode-mode'?: ExplodeMode;
|
|
511
|
+
/** Multiplier applied to per-part explosion distances (default: 1.0). */
|
|
512
|
+
'explode-scale'?: number | string;
|
|
513
|
+
/** Real-time cross-section clipping plane ("none", "x:0", "y:0.2", "-z:0", "interactive"). */
|
|
514
|
+
'section-plane'?: string;
|
|
515
|
+
/** Spatial plugin: persist manipulated anchor transforms under an optional storage namespace. */
|
|
516
|
+
'persistent-anchors'?: boolean | string;
|
|
517
|
+
/** Sync persisted anchor transforms into `#xr-state=<base64url>` for zero-backend link sharing. */
|
|
518
|
+
'persist-url-hash'?: boolean | string;
|
|
519
|
+
/** Spatial plugin: XR locomotion mode ("teleport", "snap-turn", "smooth", "teleport snap-turn", "none"). */
|
|
520
|
+
'locomotion'?: boolean | string;
|
|
521
|
+
/** Thumbstick snap-turn increment in degrees (default: 30). */
|
|
522
|
+
'snap-turn-deg'?: number | string;
|
|
523
|
+
/** Show a 120ms peripheral FOV comfort vignette on teleport/turn (default: true). */
|
|
524
|
+
'comfort-vignette'?: boolean | string;
|
|
525
|
+
/** Spatial plugin: join a multi-user room via BroadcastChannel ID or `wss://` relay URL. */
|
|
526
|
+
'shared-room'?: string;
|
|
527
|
+
/** Local display name broadcast to peers in `shared-room` (max 32 chars). */
|
|
528
|
+
'peer-name'?: string;
|
|
529
|
+
/** Local avatar visor & laser color (`#rrggbb`) in `shared-room`. */
|
|
530
|
+
'peer-color'?: string;
|
|
531
|
+
/** Opt-in WebRTC voice signaling relay (offer/answer/ICE) and `voiceGain` helpers in `shared-room`. Apps own `RTCPeerConnection` and audio. */
|
|
532
|
+
'shared-room-voice'?: boolean | string;
|
|
533
|
+
/** xr-live-sim: character camera mode, or `none` to disable the character. */
|
|
534
|
+
'character-controller'?:
|
|
535
|
+
| 'third-person'
|
|
536
|
+
| 'first-person'
|
|
537
|
+
| 'top-down'
|
|
538
|
+
| 'fixed-camera'
|
|
539
|
+
| 'none';
|
|
540
|
+
/** xr-live-sim: character speed override (m/s). */
|
|
541
|
+
'character-speed'?: number | string;
|
|
542
|
+
/** xr-live-sim: character jump velocity override (m/s). */
|
|
543
|
+
'character-jump'?: number | string;
|
|
544
|
+
/** xr-live-sim: on-screen joystick (`auto` shows it on touch screens). */
|
|
545
|
+
'touch-joystick'?: 'auto' | 'always' | 'none';
|
|
546
|
+
/** xr-live-sim: `false` or `none` pauses steering agents. */
|
|
547
|
+
'steering-agents'?: boolean | string;
|
|
548
|
+
/** xr-live-sim: firing mode (empty means `projectile`). */
|
|
549
|
+
'hit-zones'?: '' | 'projectile' | 'hitscan' | 'contact' | 'off';
|
|
550
|
+
/** xr-live-sim: shots per second (default: 4). */
|
|
551
|
+
'fire-rate'?: number | string;
|
|
552
|
+
/** xr-live-sim: projectile speed in m/s (default: 14). */
|
|
553
|
+
'projectile-speed'?: number | string;
|
|
554
|
+
/** xr-live-sim: projectile gravity in m/s² (default: 0). */
|
|
555
|
+
'projectile-gravity'?: number | string;
|
|
556
|
+
/** xr-live-sim: integrity removed per hit (default: 25). */
|
|
557
|
+
'hit-amount'?: number | string;
|
|
558
|
+
/** xr-live-sim: enables objectives and scoring (`none` disables). */
|
|
559
|
+
'objectives'?: boolean | string;
|
|
560
|
+
/** xr-live-sim: scenario countdown in seconds. */
|
|
561
|
+
'scenario-timer'?: number | string;
|
|
562
|
+
/** xr-live-sim: score that passes the scenario. */
|
|
563
|
+
'target-score'?: number | string;
|
|
564
|
+
/** xr-live-sim: attempts before the scenario fails. */
|
|
565
|
+
'attempts'?: number | string;
|
|
566
|
+
/** xr-live-sim: score HUD style. */
|
|
567
|
+
'sim-hud'?: 'auto' | 'minimal' | 'none';
|
|
568
|
+
/** xr-live-sim: plays procedural audio cues (`muted` disables). */
|
|
569
|
+
'synth-audio'?: boolean | string;
|
|
570
|
+
/** xr-live-sim: cue volume from 0 to 1 (default: 0.7). */
|
|
571
|
+
'synth-volume'?: number | string;
|
|
572
|
+
/** Register WebMCP browser AI tools on `navigator.modelContext`. */
|
|
573
|
+
'webmcp'?: boolean | string;
|
|
574
|
+
/** Opt-in gate allowing WebMCP `capture_xr_view` to include the 8x8 depth grid. */
|
|
575
|
+
'webmcp-allow-depth'?: boolean | string;
|
|
576
|
+
/** Omit `headPosition` from WebMCP `inspect_xr_scene` responses. */
|
|
577
|
+
'webmcp-omit-pose'?: boolean | string;
|
|
578
|
+
|
|
579
|
+
'onxr-object-detected'?: (e: CustomEvent<Detection3D>) => void;
|
|
580
|
+
'onxr-transcription'?: (e: CustomEvent<TranscriptEvent>) => void;
|
|
581
|
+
'onxr-hold-to-ask'?: (
|
|
582
|
+
e: CustomEvent<{mesh: string; transcript: string; prompt: string}>,
|
|
583
|
+
) => void;
|
|
584
|
+
'onxr-handles-change'?: (
|
|
585
|
+
e: CustomEvent<{mesh: any; scale: number; yawDeg: number}>,
|
|
586
|
+
) => void;
|
|
587
|
+
'onxr-paint-stroke'?: (
|
|
588
|
+
e: CustomEvent<{index: number; points: number; lengthMeters: number}>,
|
|
589
|
+
) => void;
|
|
590
|
+
onmeasurecomplete?: (
|
|
591
|
+
e: CustomEvent<{
|
|
592
|
+
start: [number, number, number];
|
|
593
|
+
end: [number, number, number];
|
|
594
|
+
distanceMeters: number;
|
|
595
|
+
formatted: string;
|
|
596
|
+
}>,
|
|
597
|
+
) => void;
|
|
598
|
+
onxrsnap?: (
|
|
599
|
+
e: CustomEvent<{
|
|
600
|
+
node: any;
|
|
601
|
+
socket: any;
|
|
602
|
+
position: [number, number, number];
|
|
603
|
+
quaternion: [number, number, number, number];
|
|
604
|
+
mode: 'socket' | 'grid' | 'surface' | 'angle';
|
|
605
|
+
}>,
|
|
606
|
+
) => void;
|
|
607
|
+
onxrunsnap?: (e: CustomEvent<{node: any; socket: any}>) => void;
|
|
608
|
+
ongazeenter?: (
|
|
609
|
+
e: CustomEvent<{node: any; point: [number, number, number]}>,
|
|
610
|
+
) => void;
|
|
611
|
+
ongazeleave?: (e: CustomEvent<{node: any}>) => void;
|
|
612
|
+
ongazedwell?: (
|
|
613
|
+
e: CustomEvent<{
|
|
614
|
+
node: any;
|
|
615
|
+
point: [number, number, number];
|
|
616
|
+
action: 'select' | 'ask';
|
|
617
|
+
}>,
|
|
618
|
+
) => void;
|
|
619
|
+
onexplodechange?: (
|
|
620
|
+
e: CustomEvent<{
|
|
621
|
+
factor: number;
|
|
622
|
+
source: 'attribute' | 'gesture' | 'api' | 'peer';
|
|
623
|
+
}>,
|
|
624
|
+
) => void;
|
|
625
|
+
onanchorsrestored?: (
|
|
626
|
+
e: CustomEvent<{
|
|
627
|
+
count: number;
|
|
628
|
+
source: 'xr-anchor' | 'storage' | 'url-hash';
|
|
629
|
+
}>,
|
|
630
|
+
) => void;
|
|
631
|
+
onxrteleport?: (
|
|
632
|
+
e: CustomEvent<{
|
|
633
|
+
from: [number, number, number];
|
|
634
|
+
to: [number, number, number];
|
|
635
|
+
yawDeg: number;
|
|
636
|
+
}>,
|
|
637
|
+
) => void;
|
|
638
|
+
onpeerjoin?: (
|
|
639
|
+
e: CustomEvent<Pick<RemotePeerState, 'peerId' | 'name' | 'color'>>,
|
|
640
|
+
) => void;
|
|
641
|
+
onpeerleave?: (
|
|
642
|
+
e: CustomEvent<Pick<RemotePeerState, 'peerId' | 'name' | 'color'>>,
|
|
643
|
+
) => void;
|
|
644
|
+
onpeersync?: (e: CustomEvent<{peerId: string; nodeId: string}>) => void;
|
|
645
|
+
onpeergrabconflict?: (
|
|
646
|
+
e: CustomEvent<{peerId: string; nodeId: string}>,
|
|
647
|
+
) => void;
|
|
648
|
+
onpeerrtcsignal?: (
|
|
649
|
+
e: CustomEvent<{
|
|
650
|
+
peerId: string;
|
|
651
|
+
targetPeerId: string;
|
|
652
|
+
signalType: 'offer' | 'answer' | 'ice';
|
|
653
|
+
sdp: string | null;
|
|
654
|
+
candidate: string | null;
|
|
655
|
+
sdpMid: string | null;
|
|
656
|
+
sdpMLineIndex: number | null;
|
|
657
|
+
}>,
|
|
658
|
+
) => void;
|
|
659
|
+
onxraudioplay?: (
|
|
660
|
+
e: CustomEvent<{
|
|
661
|
+
node: string;
|
|
662
|
+
meshIndex: number;
|
|
663
|
+
preset: string | null;
|
|
664
|
+
src: string | null;
|
|
665
|
+
gain: number;
|
|
666
|
+
pan: number;
|
|
667
|
+
triggerCount: number;
|
|
668
|
+
}>,
|
|
669
|
+
) => void;
|
|
670
|
+
/** xr-live-sim events. */
|
|
671
|
+
onxrcollision?: (
|
|
672
|
+
e: CustomEvent<{
|
|
673
|
+
nodeId: string;
|
|
674
|
+
otherId: string;
|
|
675
|
+
normal: [number, number, number];
|
|
676
|
+
impactSpeed: number;
|
|
677
|
+
}>,
|
|
678
|
+
) => void;
|
|
679
|
+
onxrsleep?: (e: CustomEvent<{nodeId: string}>) => void;
|
|
680
|
+
oncharacterjump?: (
|
|
681
|
+
e: CustomEvent<{nodeId: string; position: [number, number, number]}>,
|
|
682
|
+
) => void;
|
|
683
|
+
oncharacterland?: (
|
|
684
|
+
e: CustomEvent<{nodeId: string; fallSpeed: number}>,
|
|
685
|
+
) => void;
|
|
686
|
+
onagentstatechange?: (
|
|
687
|
+
e: CustomEvent<{nodeId: string; state: string; targetId: string | null}>,
|
|
688
|
+
) => void;
|
|
689
|
+
onagentreach?: (
|
|
690
|
+
e: CustomEvent<{
|
|
691
|
+
agentId: string;
|
|
692
|
+
targetId: string;
|
|
693
|
+
position: [number, number, number];
|
|
694
|
+
}>,
|
|
695
|
+
) => void;
|
|
696
|
+
onxrhit?: (
|
|
697
|
+
e: CustomEvent<{
|
|
698
|
+
targetId: string;
|
|
699
|
+
/** Shooter node name, or `'user'`. */
|
|
700
|
+
sourceId: string;
|
|
701
|
+
amount: number;
|
|
702
|
+
remaining: number;
|
|
703
|
+
point: [number, number, number];
|
|
704
|
+
}>,
|
|
705
|
+
) => void;
|
|
706
|
+
onxrdepleted?: (
|
|
707
|
+
e: CustomEvent<{targetId: string; group: string; scoreValue: number}>,
|
|
708
|
+
) => void;
|
|
709
|
+
onxrzoneenter?: (
|
|
710
|
+
e: CustomEvent<{zoneId: string; nodeId: string; group: string}>,
|
|
711
|
+
) => void;
|
|
712
|
+
onxrzoneexit?: (
|
|
713
|
+
e: CustomEvent<{zoneId: string; nodeId: string; group: string}>,
|
|
714
|
+
) => void;
|
|
715
|
+
onxrspawn?: (
|
|
716
|
+
e: CustomEvent<{spawnerId: string; instanceId: string; index: number}>,
|
|
717
|
+
) => void;
|
|
718
|
+
onxrobjective?: (
|
|
719
|
+
e: CustomEvent<{
|
|
720
|
+
nodeId: string;
|
|
721
|
+
tag: string;
|
|
722
|
+
type: string;
|
|
723
|
+
amount: number;
|
|
724
|
+
totalScore: number;
|
|
725
|
+
remainingRequired: number;
|
|
726
|
+
outOfOrder: boolean;
|
|
727
|
+
}>,
|
|
728
|
+
) => void;
|
|
729
|
+
onxrscorechange?: (
|
|
730
|
+
e: CustomEvent<{
|
|
731
|
+
score: number;
|
|
732
|
+
delta: number;
|
|
733
|
+
attemptsLeft: number | null;
|
|
734
|
+
timeRemaining: number | null;
|
|
735
|
+
}>,
|
|
736
|
+
) => void;
|
|
737
|
+
onxrscenarioend?: (
|
|
738
|
+
e: CustomEvent<{
|
|
739
|
+
outcome: 'pass' | 'fail' | 'timeout';
|
|
740
|
+
finalScore: number;
|
|
741
|
+
elapsedSec: number;
|
|
742
|
+
}>,
|
|
743
|
+
) => void;
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
declare global {
|
|
747
|
+
namespace JSX {
|
|
748
|
+
interface IntrinsicElements {
|
|
749
|
+
'three-live': ThreeLiveAttributes;
|
|
750
|
+
'xr-live': XRLiveAttributes;
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
interface HTMLElementTagNameMap {
|
|
755
|
+
'three-live': ThreeLiveElement;
|
|
756
|
+
'xr-live': XRLiveElement;
|
|
757
|
+
'xr-anchor': XRAnchorElement;
|
|
758
|
+
}
|
|
759
|
+
}
|