@liveroom-tech/react-immersive 5.0.2 → 5.1.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.
Files changed (39) hide show
  1. package/README.md +580 -38
  2. package/dist/{ModelViewer-DOexHkJC.d.ts → ModelViewer-Bj-KjiDL.d.mts} +91 -42
  3. package/dist/{ModelViewer-CbbJT85n.d.mts → ModelViewer-BkQ73y6N.d.ts} +91 -42
  4. package/dist/binding-builder.css +1 -1
  5. package/dist/binding-builder.js +13 -12
  6. package/dist/binding-builder.mjs +1 -1
  7. package/dist/chunk-32WCLPTZ.mjs +1 -0
  8. package/dist/chunk-CSGNL4XU.mjs +3 -0
  9. package/dist/chunk-F2ILTIPG.mjs +28 -0
  10. package/dist/chunk-V6GALFL5.mjs +1 -0
  11. package/dist/chunk-WN6GMMHF.mjs +1 -0
  12. package/dist/hosted.css +1 -1
  13. package/dist/hosted.d.mts +3 -3
  14. package/dist/hosted.d.ts +3 -3
  15. package/dist/hosted.js +12 -11
  16. package/dist/hosted.mjs +1 -1
  17. package/dist/index.css +1 -1
  18. package/dist/index.d.mts +54 -10
  19. package/dist/index.d.ts +54 -10
  20. package/dist/index.js +11 -10
  21. package/dist/index.mjs +1 -1
  22. package/dist/{modelInfo-CEmmvVCH.d.mts → modelInfo-DnkmTGMd.d.mts} +6 -0
  23. package/dist/{modelInfo-CEmmvVCH.d.ts → modelInfo-DnkmTGMd.d.ts} +6 -0
  24. package/dist/{objectCatalog-5W8n5xNQ.d.ts → objectCatalog-BIeXURoq.d.mts} +276 -5
  25. package/dist/{objectCatalog-5W8n5xNQ.d.mts → objectCatalog-BIeXURoq.d.ts} +276 -5
  26. package/dist/simple-model-viewer.d.mts +2 -2
  27. package/dist/simple-model-viewer.d.ts +2 -2
  28. package/dist/simple-model-viewer.js +3 -3
  29. package/dist/simple-model-viewer.mjs +1 -1
  30. package/dist/utils.d.mts +2 -2
  31. package/dist/utils.d.ts +2 -2
  32. package/dist/utils.js +1 -1
  33. package/dist/utils.mjs +1 -1
  34. package/package.json +1 -1
  35. package/dist/chunk-3GX7DOGS.mjs +0 -3
  36. package/dist/chunk-AH5NAZWX.mjs +0 -27
  37. package/dist/chunk-BGYK4Y2Y.mjs +0 -1
  38. package/dist/chunk-WFEYRUZC.mjs +0 -1
  39. package/dist/chunk-XTLSAYAQ.mjs +0 -1
@@ -104,6 +104,11 @@ type SceneModelConfig = {
104
104
  shading: "lit" | "unlit" | "normals";
105
105
  autoRotate?: boolean;
106
106
  autoRotateSpeed?: number;
107
+ /**
108
+ * The glTF material variant (KHR_materials_variants) to show, by name, or
109
+ * null for the model's default materials.
110
+ */
111
+ materialVariant?: string | null;
107
112
  };
108
113
  type SceneCameraConfig = {
109
114
  fieldOfView: number;
@@ -149,7 +154,7 @@ type SceneGroundShadowConfig = {
149
154
  height: number;
150
155
  size: number;
151
156
  };
152
- declare const ANIMATION_LOOP_MODES: readonly ["repeat", "once"];
157
+ declare const ANIMATION_LOOP_MODES: readonly ["repeat", "once", "ping-pong"];
153
158
  type AnimationLoopMode = (typeof ANIMATION_LOOP_MODES)[number];
154
159
  type SceneAnimationClipConfig = {
155
160
  sourceName: string;
@@ -384,6 +389,73 @@ type SceneCinematicConfig = {
384
389
  loop: boolean;
385
390
  autoPlay: boolean;
386
391
  };
392
+ declare const SECTION_AXES: readonly ["x", "y", "z"];
393
+ type SceneSectionAxis = (typeof SECTION_AXES)[number];
394
+ type SceneSectionConfig = {
395
+ enabled: boolean;
396
+ /** The world axis the cut runs across; `"y"` gives a floor-plan cut. */
397
+ axis: SceneSectionAxis;
398
+ /**
399
+ * Where the cut is along the axis, as a share of the model's size: 0 at
400
+ * its minimum, 1 at its maximum.
401
+ */
402
+ position: number;
403
+ /**
404
+ * Keep the part above the cut (the higher side along the axis) instead of
405
+ * the part below it.
406
+ */
407
+ flip: boolean;
408
+ };
409
+ declare const DEFAULT_SECTION_CONFIG: SceneSectionConfig;
410
+ /**
411
+ * What an object's data must look like for a rule to apply to it. A list
412
+ * applies when every condition in it matches.
413
+ */
414
+ type SceneStyleCondition = {
415
+ /** A key of `binding.metrics`. */
416
+ metric: string;
417
+ /** Applies when the value is greater than this. */
418
+ above?: number;
419
+ /** Applies when the value is less than this. */
420
+ below?: number;
421
+ } | {
422
+ status: ObjectBindingStatus | ObjectBindingStatus[];
423
+ } | {
424
+ /** A key of `binding.metadata`; dots reach into nested objects. */
425
+ metadata: string;
426
+ equals: string | number | boolean | null;
427
+ };
428
+ type SceneStyleColorScale = {
429
+ /** A key of `binding.metrics`. */
430
+ metric: string;
431
+ /**
432
+ * `[value, "#rrggbb"]` pairs. Values between two stops blend their colours;
433
+ * values outside the stops take the nearest one.
434
+ */
435
+ stops: [number, string][];
436
+ /** The material colour it sets. Default `"baseColor"`. */
437
+ channel?: "baseColor" | "emissive";
438
+ };
439
+ type SceneStylePulse = {
440
+ /** The glow colour at the pulse's peak. Default `"#ff3b30"`. */
441
+ color?: string;
442
+ /** Pulses per second. Default `1`. */
443
+ speed?: number;
444
+ };
445
+ type SceneStyleRule = {
446
+ id: string;
447
+ label?: string;
448
+ /** The objects the rule considers; every bound object when left out. */
449
+ target?: ObjectBindingTarget;
450
+ /** When the rule applies; always, when left out. */
451
+ when?: SceneStyleCondition | SceneStyleCondition[];
452
+ /** Material overrides, over the object's own `style.material`. */
453
+ material?: ObjectBindingMaterial;
454
+ /** A colour taken from a metric's value. */
455
+ colorScale?: SceneStyleColorScale;
456
+ /** A glow that fades in and out, to draw attention. */
457
+ pulse?: boolean | SceneStylePulse;
458
+ };
387
459
  type SceneConfig = {
388
460
  model: SceneModelConfig;
389
461
  camera: SceneCameraConfig;
@@ -397,6 +469,13 @@ type SceneConfig = {
397
469
  animations: SceneAnimationConfig;
398
470
  annotations: SceneAnnotationMarker[];
399
471
  cinematic?: SceneCinematicConfig;
472
+ /**
473
+ * Data-driven looks for bound objects, applied in order, so a later rule
474
+ * wins over an earlier one where both set something.
475
+ */
476
+ styleRules?: SceneStyleRule[];
477
+ /** A cut-away view across the model. Off when left out. */
478
+ section?: SceneSectionConfig;
400
479
  };
401
480
  declare const DEFAULT_SCENE_CONFIG: SceneConfig;
402
481
 
@@ -407,6 +486,146 @@ type SceneConfigPatch = DeepPartial<SceneConfig>;
407
486
  */
408
487
  declare function patchSceneConfig(sceneConfig: SceneConfig, patch: SceneConfigPatch): SceneConfig;
409
488
 
489
+ type AnimationClipInfo = {
490
+ sourceName: string;
491
+ duration: number;
492
+ };
493
+ /** How `play` starts a clip. */
494
+ type AnimationPlayOptions = {
495
+ /**
496
+ * Keep the clips already playing, instead of stopping them, so several
497
+ * clips run at once (a left and a right door, say). Default `false`.
498
+ */
499
+ alongside?: boolean;
500
+ /**
501
+ * Seconds to fade the clip in, and to fade out the clips it replaces, for a
502
+ * smooth blend between them. Default `0`.
503
+ */
504
+ fade?: number;
505
+ /**
506
+ * Play backwards, from wherever the clip is, or from its end. Plays a
507
+ * "door opens" clip as the door closing. Default `false`.
508
+ */
509
+ reverse?: boolean;
510
+ };
511
+ /**
512
+ * `"finished"`: a play-once clip that reached its end and holds its last pose
513
+ * until it's stopped or played again.
514
+ */
515
+ type AnimationClipStatus = "playing" | "paused" | "finished";
516
+ /** One clip that is playing, paused, or holding its finished pose. */
517
+ type AnimationClipState = {
518
+ clip: string;
519
+ status: AnimationClipStatus;
520
+ /** Position in the clip, in seconds. */
521
+ time: number;
522
+ /** Length of the clip, in seconds. */
523
+ duration: number;
524
+ speed: number;
525
+ reverse: boolean;
526
+ };
527
+ type AnimationPlaybackState = {
528
+ /** The clip played most recently, while it's active. */
529
+ currentClip: string | null;
530
+ /** Whether any clip is playing. */
531
+ isPlaying: boolean;
532
+ speed: number;
533
+ time: number;
534
+ duration: number;
535
+ /** Every active clip, most recently played last. */
536
+ active: AnimationClipState[];
537
+ };
538
+ /**
539
+ * Leave out `clip` to act on every active clip; pass one to act on that clip
540
+ * alone.
541
+ */
542
+ type AnimationControls = {
543
+ clips: string[];
544
+ clipDetails?: AnimationClipInfo[];
545
+ play: (clipName: string, options?: AnimationPlayOptions) => void;
546
+ pause: (clipName?: string) => void;
547
+ /** Stops and resets the pose. */
548
+ stop: (clipName?: string) => void;
549
+ /** Without a clip, also the speed of clips played later without their own. */
550
+ setSpeed: (speed: number, clipName?: string) => void;
551
+ seek?: (time: number, clipName?: string) => void;
552
+ getState?: () => AnimationPlaybackState;
553
+ subscribe?: (listener: (state: AnimationPlaybackState) => void) => () => void;
554
+ };
555
+ type ViewerAnimationsProps = {
556
+ clips: string[];
557
+ clipDetails: AnimationClipInfo[];
558
+ currentClip: string | null;
559
+ isPlaying: boolean;
560
+ speed: number;
561
+ time: number;
562
+ duration: number;
563
+ /** Every active clip, most recently played last. */
564
+ active: AnimationClipState[];
565
+ play: (clipName: string, options?: AnimationPlayOptions) => void;
566
+ pause: (clipName?: string) => void;
567
+ stop: (clipName?: string) => void;
568
+ setSpeed: (speed: number, clipName?: string) => void;
569
+ seek: (time: number, clipName?: string) => void;
570
+ handleAnimationsReady: (controls: AnimationControls) => void;
571
+ };
572
+ declare function useViewerAnimations(): ViewerAnimationsProps;
573
+
574
+ /** A glow cycling on one object, from its style rules. */
575
+ type StyledObjectPulse = {
576
+ color: string;
577
+ /** Pulses per second. */
578
+ speed: number;
579
+ };
580
+ type StyledObjectBindings = {
581
+ /**
582
+ * The bindings as the rules style them. A binding no rule changed is the
583
+ * same object as the one passed in.
584
+ */
585
+ bindings: Record<string, ObjectBinding>;
586
+ /** Pulsing objects, by binding key. */
587
+ pulses: Record<string, StyledObjectPulse>;
588
+ /** The binding a styled one came from (itself when no rule changed it). */
589
+ sourceOf: (binding: ObjectBinding) => ObjectBinding;
590
+ };
591
+ /**
592
+ * The colour a colour scale gives a value: a blend of the two stops around it,
593
+ * or the nearest stop outside them. Null when there's no usable stop.
594
+ */
595
+ declare function colorScaleValue(stops: SceneStyleColorScale["stops"], value: number): string | null;
596
+ /**
597
+ * Styles bindings with scene style rules, for rendering. Rules apply in order
598
+ * over each object's own `style.material`, so a later rule wins where two set
599
+ * the same thing. The bindings passed in are never changed.
600
+ */
601
+ declare function applyStyleRules(bindings: Record<string, ObjectBinding>, rules: readonly SceneStyleRule[] | undefined): StyledObjectBindings;
602
+
603
+ /**
604
+ * Objects to focus on. Everything else is ghosted (drawn faintly) or hidden
605
+ * until the isolation is cleared, without changing any binding.
606
+ */
607
+ type ViewerIsolation = {
608
+ /** The objects that stay: an id, a list of ids, `{ group }`, `{ tag }`, or `{ type }`. */
609
+ target: ObjectBindingTarget;
610
+ /** What happens to everything else. Default `"ghost"`. */
611
+ mode?: "ghost" | "hide";
612
+ /** How visible ghosted objects are, 0–1. Default `0.12`. */
613
+ ghostOpacity?: number;
614
+ };
615
+ type IsolatedObjectBindings = StyledObjectBindings & {
616
+ /** Binding keys that are ghosted or hidden. Pointer picking ignores them. */
617
+ setAside: Set<string>;
618
+ };
619
+ /** The binding keys an isolation keeps; empty when it keeps nothing. */
620
+ declare function isolatedBindingKeys(bindings: Record<string, ObjectBinding>, isolation: ViewerIsolation | null | undefined): Set<string>;
621
+ /**
622
+ * Ghosts or hides every object an isolation doesn't keep, for rendering. The
623
+ * bindings passed in are never changed. An isolation that keeps nothing (a
624
+ * target matching no object) changes nothing either, rather than fading out
625
+ * the whole model.
626
+ */
627
+ declare function applyIsolation(styled: StyledObjectBindings, isolation: ViewerIsolation | null | undefined): IsolatedObjectBindings;
628
+
410
629
  type ObjectBindingsActionEffect = {
411
630
  target: ObjectBindingTarget;
412
631
  objectBindings: ObjectBindingPatch;
@@ -437,24 +656,36 @@ type CameraAction = {
437
656
  type CameraActionEffect = {
438
657
  camera: CameraAction;
439
658
  };
440
- type AnimationAction = {
659
+ /**
660
+ * `play` replaces the clips already playing unless `alongside` is set. The
661
+ * others act on `clip`, or on every active clip when it's left out.
662
+ */
663
+ type AnimationAction = ({
441
664
  type: "play";
442
665
  clip: string;
443
- } | {
666
+ } & AnimationPlayOptions) | {
444
667
  type: "pause";
668
+ clip?: string;
445
669
  } | {
446
670
  type: "stop";
671
+ clip?: string;
447
672
  } | {
448
673
  type: "set-speed";
449
674
  speed: number;
675
+ clip?: string;
450
676
  } | {
451
677
  type: "seek";
452
678
  time: number;
679
+ clip?: string;
453
680
  };
454
681
  type AnimationActionEffect = {
455
682
  animation: AnimationAction;
456
683
  };
457
- type ObjectActionEffect = ObjectBindingsActionEffect | SceneConfigActionEffect | VisibilityActionEffect | CameraActionEffect | AnimationActionEffect;
684
+ /** Isolates objects, or with `null` shows everything again. */
685
+ type IsolationActionEffect = {
686
+ isolation: ViewerIsolation | null;
687
+ };
688
+ type ObjectActionEffect = IsolationActionEffect | ObjectBindingsActionEffect | SceneConfigActionEffect | VisibilityActionEffect | CameraActionEffect | AnimationActionEffect;
458
689
 
459
690
  type ObjectBindingAction = {
460
691
  id: "change-color" | "apply-texture" | "toggle-visibility" | string;
@@ -549,6 +780,33 @@ type ObjectBindingCameraState = {
549
780
  fov?: number;
550
781
  zoom?: number;
551
782
  };
783
+ /**
784
+ * An image or a line of text printed onto the object's surface: a logo, a
785
+ * label, a personalisation.
786
+ */
787
+ type ObjectBindingDecal = {
788
+ id: string;
789
+ /** The image to show: a URL or public path. */
790
+ image?: string;
791
+ /** Text to show, when there's no image. */
792
+ text?: string;
793
+ /** Text colour. Default `"#ffffff"`. */
794
+ color?: string;
795
+ /** CSS font family for the text. Default `"sans-serif"`. */
796
+ fontFamily?: string;
797
+ /** Default `"bold"`. */
798
+ fontWeight?: "normal" | "bold";
799
+ /** Where it sits on the object, in the object's own (local) space. */
800
+ position: [number, number, number];
801
+ /** The way the surface faces there, in the object's own space. */
802
+ normal: [number, number, number];
803
+ /** Width, in model units; the height follows the image or text's shape. */
804
+ size: number;
805
+ /** A turn around the surface normal, in radians. Default `0`. */
806
+ rotation?: number;
807
+ /** 0–1. Default `1`. */
808
+ opacity?: number;
809
+ };
552
810
  type ObjectBindingStyle = {
553
811
  material?: ObjectBindingMaterial;
554
812
  };
@@ -566,6 +824,8 @@ type ObjectBinding = {
566
824
  hoverable?: boolean;
567
825
  transform?: ObjectBindingTransform;
568
826
  style?: ObjectBindingStyle;
827
+ /** Images and text printed on the object's surface. */
828
+ decals?: ObjectBindingDecal[];
569
829
  actions?: ObjectBindingAction[];
570
830
  metrics?: Record<string, number>;
571
831
  metadata?: Record<string, unknown>;
@@ -578,6 +838,12 @@ type ObjectActionEvent = {
578
838
  screenX?: number;
579
839
  screenY?: number;
580
840
  };
841
+ /** A point on an object's surface, in the object's own (local) space. */
842
+ type ObjectSurfacePoint = {
843
+ position: [number, number, number];
844
+ /** The way the surface faces at that point. */
845
+ normal: [number, number, number];
846
+ };
581
847
  /** A double-click, right-click, or long-press on a model object. */
582
848
  type ObjectPointerEvent = {
583
849
  binding: ObjectBinding;
@@ -586,6 +852,11 @@ type ObjectPointerEvent = {
586
852
  clientY: number;
587
853
  /** `"mouse"`, `"pen"`, or `"touch"`. */
588
854
  pointerType: string;
855
+ /**
856
+ * Where on the object the pointer was, e.g. to place a decal there. Not
857
+ * reported for streamed (3D Tiles) models.
858
+ */
859
+ surface?: ObjectSurfacePoint;
589
860
  };
590
861
 
591
862
  /** One bindable object in a model, as reported by `onObjectCatalog`. */
@@ -601,4 +872,4 @@ type ViewerObjectInfo = {
601
872
  maximum: [number, number, number];
602
873
  };
603
874
 
604
- export { type SceneWireframeConfig as $, type AnimationAction as A, type BindingEdit as B, type CameraAction as C, DEFAULT_SCENE_CONFIG as D, type EnvironmentPreset as E, type SceneCameraConfig as F, type GlitchModeName as G, type SceneCinematicConfig as H, type SceneCinematicWaypoint as I, type SceneConfig as J, type KernelSizeName as K, type SceneConfigActionEffect as L, MATERIAL_BLENDING_MODES as M, type SceneConfigPatch as N, type ObjectActionEffect as O, type SceneEnvironmentConfig as P, type SceneGroundShadowConfig as Q, type RampTypeName as R, type SceneAnimationClipConfig as S, type SceneLight as T, type SceneLightAttachment as U, type SceneLightType as V, type SceneLightingConfig as W, type SceneModelConfig as X, type SceneModelRenderer as Y, type ScenePostProcessingConfig as Z, type SceneShadowConfig as _, type AnimationActionEffect as a, type ViewerCameraConfig as a0, type ViewerCameraState as a1, type ViewerObjectInfo as a2, type VisibilityActionEffect as a3, material as a4, patchBindings as a5, patchSceneConfig as a6, selectBindingKeys as a7, selectBindings as a8, type AnimationLoopMode as b, type CameraActionEffect as c, type DeepPartial as d, MATERIAL_SIDES as e, type ObjectActionEvent as f, type ObjectBinding as g, type ObjectBindingAction as h, type ObjectBindingCameraState as i, type ObjectBindingMaterial as j, type ObjectBindingMaterialBlendingMode as k, type ObjectBindingMaterialSide as l, type ObjectBindingPatch as m, type ObjectBindingSelector as n, type ObjectBindingStatus as o, type ObjectBindingStyle as p, type ObjectBindingTarget as q, type ObjectBindingTextureChannel as r, type ObjectBindingTextureSlot as s, type ObjectBindingTransform as t, type ObjectBindingType as u, type ObjectBindingsActionEffect as v, type ObjectPointerEvent as w, type SceneAnimationConfig as x, type SceneAnnotationMarker as y, type SceneBackgroundConfig as z };
875
+ export { type SceneConfigPatch as $, type AnimationAction as A, type BindingEdit as B, type CameraAction as C, DEFAULT_SCENE_CONFIG as D, type EnvironmentPreset as E, type ObjectBindingTextureChannel as F, type GlitchModeName as G, type ObjectBindingTextureSlot as H, type IsolatedObjectBindings as I, type ObjectBindingTransform as J, type KernelSizeName as K, type ObjectBindingType as L, MATERIAL_BLENDING_MODES as M, type ObjectBindingsActionEffect as N, type ObjectActionEffect as O, type ObjectPointerEvent as P, type ObjectSurfacePoint as Q, type RampTypeName as R, type SceneAnimationClipConfig as S, type SceneAnimationConfig as T, type SceneAnnotationMarker as U, type SceneBackgroundConfig as V, type SceneCameraConfig as W, type SceneCinematicConfig as X, type SceneCinematicWaypoint as Y, type SceneConfig as Z, type SceneConfigActionEffect as _, type AnimationActionEffect as a, type SceneEnvironmentConfig as a0, type SceneGroundShadowConfig as a1, type SceneLight as a2, type SceneLightAttachment as a3, type SceneLightType as a4, type SceneLightingConfig as a5, type SceneModelConfig as a6, type SceneModelRenderer as a7, type ScenePostProcessingConfig as a8, type SceneSectionAxis as a9, type SceneSectionConfig as aa, type SceneShadowConfig as ab, type SceneStyleColorScale as ac, type SceneStyleCondition as ad, type SceneStylePulse as ae, type SceneStyleRule as af, type SceneWireframeConfig as ag, type StyledObjectBindings as ah, type StyledObjectPulse as ai, type ViewerAnimationsProps as aj, type ViewerCameraConfig as ak, type ViewerCameraState as al, type ViewerIsolation as am, type ViewerObjectInfo as an, type VisibilityActionEffect as ao, applyIsolation as ap, applyStyleRules as aq, colorScaleValue as ar, isolatedBindingKeys as as, material as at, patchBindings as au, patchSceneConfig as av, selectBindingKeys as aw, selectBindings as ax, useViewerAnimations as ay, type AnimationClipInfo as b, type AnimationClipState as c, type AnimationClipStatus as d, type AnimationControls as e, type AnimationLoopMode as f, type AnimationPlayOptions as g, type AnimationPlaybackState as h, type CameraActionEffect as i, DEFAULT_SECTION_CONFIG as j, type DeepPartial as k, type IsolationActionEffect as l, MATERIAL_SIDES as m, type ObjectActionEvent as n, type ObjectBinding as o, type ObjectBindingAction as p, type ObjectBindingCameraState as q, type ObjectBindingDecal as r, type ObjectBindingMaterial as s, type ObjectBindingMaterialBlendingMode as t, type ObjectBindingMaterialSide as u, type ObjectBindingPatch as v, type ObjectBindingSelector as w, type ObjectBindingStatus as x, type ObjectBindingStyle as y, type ObjectBindingTarget as z };
@@ -1,6 +1,6 @@
1
1
  import * as react from 'react';
2
- import { M as ModelFormat, a as ViewerModelInfo } from './modelInfo-CEmmvVCH.mjs';
3
- export { V as ViewerModelBounds } from './modelInfo-CEmmvVCH.mjs';
2
+ import { M as ModelFormat, a as ViewerModelInfo } from './modelInfo-DnkmTGMd.mjs';
3
+ export { V as ViewerModelBounds } from './modelInfo-DnkmTGMd.mjs';
4
4
  import { PresetsType } from '@react-three/drei/helpers/environment-assets';
5
5
 
6
6
  type SimpleModelViewerProps = {
@@ -1,6 +1,6 @@
1
1
  import * as react from 'react';
2
- import { M as ModelFormat, a as ViewerModelInfo } from './modelInfo-CEmmvVCH.js';
3
- export { V as ViewerModelBounds } from './modelInfo-CEmmvVCH.js';
2
+ import { M as ModelFormat, a as ViewerModelInfo } from './modelInfo-DnkmTGMd.js';
3
+ export { V as ViewerModelBounds } from './modelInfo-DnkmTGMd.js';
4
4
  import { PresetsType } from '@react-three/drei/helpers/environment-assets';
5
5
 
6
6
  type SimpleModelViewerProps = {