@liveroom-tech/react-immersive 6.0.1 → 6.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 (67) hide show
  1. package/README.md +26 -2
  2. package/dist/AnimationsTab-NUJTEMZ5.mjs +1 -0
  3. package/dist/AnnotationsTab-OHRVWRKI.mjs +1 -0
  4. package/dist/CinematicTab-IJAY2BS6.mjs +1 -0
  5. package/dist/ConfigureTab-UQRRATCY.mjs +6 -0
  6. package/dist/RulesTab-YVBZGJZX.mjs +1 -0
  7. package/dist/SequencesTab-IC5LWQ6N.css +1 -0
  8. package/dist/SequencesTab-RPJAG26Z.mjs +1 -0
  9. package/dist/binding-builder.css +1 -1
  10. package/dist/binding-builder.d.mts +3 -3
  11. package/dist/binding-builder.d.ts +3 -3
  12. package/dist/binding-builder.js +76 -23
  13. package/dist/binding-builder.mjs +1 -1
  14. package/dist/chunk-2DV2UCQH.mjs +1 -0
  15. package/dist/chunk-37YITTIK.mjs +1 -0
  16. package/dist/chunk-5FLX45O5.mjs +2 -0
  17. package/dist/chunk-6CTCV2Q5.mjs +1 -0
  18. package/dist/chunk-7JCFNZJM.mjs +1 -0
  19. package/dist/chunk-7OWHW66D.mjs +1 -0
  20. package/dist/chunk-AL6UIGWP.mjs +1 -0
  21. package/dist/chunk-BNKTI3CY.mjs +1 -0
  22. package/dist/chunk-CCBFMNAU.mjs +1 -0
  23. package/dist/chunk-E24EFHB5.mjs +1 -0
  24. package/dist/chunk-EV6THDXD.mjs +1 -0
  25. package/dist/chunk-F5QSXMME.mjs +1 -0
  26. package/dist/chunk-FGAJ2UT7.mjs +1 -0
  27. package/dist/chunk-FXV4CLAK.mjs +1 -0
  28. package/dist/chunk-GV4ZRXL6.mjs +1 -0
  29. package/dist/chunk-KHN55ZM7.mjs +3 -0
  30. package/dist/chunk-LX3GXQNU.mjs +1 -0
  31. package/dist/chunk-OPZJDP7T.mjs +1 -0
  32. package/dist/chunk-OREKYGO3.mjs +83 -0
  33. package/dist/chunk-PBVBZYOG.mjs +47 -0
  34. package/dist/chunk-T6AYLPCC.mjs +1 -0
  35. package/dist/hosted.css +1 -1
  36. package/dist/hosted.d.mts +22 -6
  37. package/dist/hosted.d.ts +22 -6
  38. package/dist/hosted.js +75 -22
  39. package/dist/hosted.mjs +1 -1
  40. package/dist/index.css +1 -1
  41. package/dist/index.d.mts +66 -6
  42. package/dist/index.d.ts +66 -6
  43. package/dist/index.js +69 -21
  44. package/dist/index.mjs +1 -1
  45. package/dist/{modelFileResolver-Co7j1tdQ.d.mts → modelFileResolver-BEW_95id.d.mts} +52 -7
  46. package/dist/{modelFileResolver-Co7j1tdQ.d.ts → modelFileResolver-BEW_95id.d.ts} +52 -7
  47. package/dist/{modelViewerProps-BibuMND7.d.ts → modelViewerProps-C7saa0i2.d.mts} +173 -3
  48. package/dist/{modelViewerProps-Ce4-wb57.d.mts → modelViewerProps-CbK_4uZj.d.ts} +173 -3
  49. package/dist/{publicProps-BaJHCDa_.d.mts → publicProps-NKTiohZO.d.mts} +1 -1
  50. package/dist/{publicProps-CP18d_mt.d.ts → publicProps-z7cJhUH8.d.ts} +1 -1
  51. package/dist/simple-model-viewer.css +1 -1
  52. package/dist/simple-model-viewer.d.mts +25 -3
  53. package/dist/simple-model-viewer.d.ts +25 -3
  54. package/dist/simple-model-viewer.js +49 -3
  55. package/dist/simple-model-viewer.mjs +1 -1
  56. package/dist/utils.d.mts +47 -4
  57. package/dist/utils.d.ts +47 -4
  58. package/dist/utils.js +2 -2
  59. package/dist/utils.mjs +1 -1
  60. package/package.json +5 -1
  61. package/dist/chunk-2JFUMJUP.mjs +0 -1
  62. package/dist/chunk-4JMJALRO.mjs +0 -2
  63. package/dist/chunk-OTSCPJWF.mjs +0 -1
  64. package/dist/chunk-P2JZ5Z7I.mjs +0 -1
  65. package/dist/chunk-UGPR4EPP.mjs +0 -81
  66. package/dist/chunk-V7WZUWJ5.mjs +0 -1
  67. package/dist/chunk-VQGYZOMX.mjs +0 -3
@@ -1,5 +1,5 @@
1
1
  import { Object3D, Material } from 'three';
2
- import { e as ViewerModelBounds, R as ReducedMotionSetting, d as ModelViewerLabels, V as ViewerLoading, g as ViewerReveal, b as ModelFormat, f as ViewerModelInfo } from './modelFileResolver-Co7j1tdQ.mjs';
2
+ import { e as ViewerModelBounds, R as ReducedMotionSetting, d as ModelViewerLabels, V as ViewerLoading, g as ViewerReveal, b as ModelFormat, f as ViewerModelInfo } from './modelFileResolver-BEW_95id.js';
3
3
  import { ReactNode } from 'react';
4
4
  import { CameraControls } from '@react-three/drei';
5
5
 
@@ -199,6 +199,155 @@ type SceneSelectionSet = {
199
199
  /** Validate saved selections from scene JSON, shared state, or browser storage. */
200
200
  declare function parseSelectionSets(input: unknown): SceneSelectionSet[];
201
201
 
202
+ type ProductSelections = Record<string, string | null>;
203
+ type ProductOptionRef = {
204
+ groupId: string;
205
+ optionId: string;
206
+ };
207
+ type ProductAppearance = {
208
+ target: ObjectBindingTarget;
209
+ material?: ObjectBindingMaterial;
210
+ visible?: boolean;
211
+ };
212
+ type ProductOption = {
213
+ id: string;
214
+ label: string;
215
+ sku?: string;
216
+ /** Shown under the label. */
217
+ description?: string;
218
+ /** A hex color, shown as this option's swatch. */
219
+ swatch?: string;
220
+ /** Added to the price, in the currency's smallest unit. Can be negative. */
221
+ priceDeltaMinor?: number;
222
+ appearance?: ProductAppearance[];
223
+ variants?: string[];
224
+ };
225
+ /** Single-choice group. Optional groups may have no selected option. */
226
+ type ProductOptionGroup = {
227
+ id: string;
228
+ label: string;
229
+ required?: boolean;
230
+ defaultOptionId?: string;
231
+ display?: ProductGroupDisplay;
232
+ options: ProductOption[];
233
+ };
234
+ type ProductGroupDisplay = "list" | "chips" | "swatches";
235
+ /** A price worked out from the definition, for products without a pricing service. */
236
+ type ProductPricing = {
237
+ currency: string;
238
+ basePriceMinor: number;
239
+ };
240
+ /**
241
+ * A link to buy this configuration, with no code. The URL can use {sku},
242
+ * {quantity}, {productId}, {revision} and {selections}.
243
+ */
244
+ type ProductCheckoutLink = {
245
+ urlTemplate: string;
246
+ label?: string;
247
+ };
248
+ type ProductOptionRule = {
249
+ id: string;
250
+ when: ProductOptionRef;
251
+ requires?: ProductOptionRef[];
252
+ excludes?: ProductOptionRef[];
253
+ message?: string;
254
+ };
255
+ /** Exact combination-to-SKU mapping, including null for unselected optional groups. */
256
+ type ProductSku = {
257
+ sku: string;
258
+ selections: ProductSelections;
259
+ };
260
+ type ProductDefinition = {
261
+ id: string;
262
+ label: string;
263
+ revision: string;
264
+ groups: ProductOptionGroup[];
265
+ pricing?: ProductPricing;
266
+ checkout?: ProductCheckoutLink;
267
+ rules?: ProductOptionRule[];
268
+ skus?: ProductSku[];
269
+ };
270
+ type SceneProductConfig = {
271
+ definition: ProductDefinition;
272
+ selections: ProductSelections;
273
+ };
274
+ type ProductConfigurationIssue = {
275
+ code: "required" | "unknown-group" | "unknown-option" | "requires" | "excludes" | "sku";
276
+ message: string;
277
+ groupIds: string[];
278
+ ruleId?: string;
279
+ };
280
+ type ProductConfiguration = {
281
+ version: 1;
282
+ productId: string;
283
+ revision: string;
284
+ /** Canonical JSON identity of product, revision, quantity, and sorted selections. */
285
+ key: string;
286
+ quantity: number;
287
+ selections: ProductSelections;
288
+ sku: string | null;
289
+ items: Array<{
290
+ groupId: string;
291
+ optionId: string;
292
+ label: string;
293
+ sku?: string;
294
+ }>;
295
+ valid: boolean;
296
+ issues: ProductConfigurationIssue[];
297
+ };
298
+ type ProductOptionState = {
299
+ groupId: string;
300
+ optionId: string;
301
+ selected: boolean;
302
+ available: boolean;
303
+ reasons: string[];
304
+ /** For a choice blocked by a rule: the other choices that would have to change to allow it. */
305
+ fix?: ProductOptionRef[];
306
+ };
307
+ /** Something in a definition that won't work as its author expects. */
308
+ type ProductDefinitionWarning = {
309
+ code: "missing-sku" | "no-objects" | "missing-variant" | "invalid-default" | "unreachable" | "nothing-changes";
310
+ message: string;
311
+ groupId?: string;
312
+ optionId?: string;
313
+ };
314
+ type ProductAvailability = {
315
+ available: boolean;
316
+ message?: string;
317
+ options?: Array<ProductOptionRef & {
318
+ available: boolean;
319
+ reason?: string;
320
+ }>;
321
+ };
322
+ /** Display-only price supplied by the host's pricing service. */
323
+ type ProductPrice = {
324
+ amountMinor: number;
325
+ currency: string;
326
+ expiresAt?: string;
327
+ label?: string;
328
+ };
329
+ type ProductCommerceResult = {
330
+ id?: string;
331
+ message?: string;
332
+ };
333
+ type ProductCommerceContext = {
334
+ signal: AbortSignal;
335
+ };
336
+ type ProductCheckoutContext = ProductCommerceContext & {
337
+ idempotencyKey: string;
338
+ price: ProductPrice | null;
339
+ };
340
+ /** Implement these methods in your application; validate/reprice again on your server. */
341
+ type ProductCommerceAdapter = {
342
+ /** Stable backend/pricing-context identity; change when provider, currency, or customer context changes. */
343
+ key: string;
344
+ resolveSku?: (configuration: ProductConfiguration, context: ProductCommerceContext) => string | null | Promise<string | null>;
345
+ getAvailability?: (configuration: ProductConfiguration, context: ProductCommerceContext) => ProductAvailability | Promise<ProductAvailability>;
346
+ getPrice?: (configuration: ProductConfiguration, context: ProductCommerceContext) => ProductPrice | Promise<ProductPrice>;
347
+ addToCart?: (configuration: ProductConfiguration, context: ProductCheckoutContext) => ProductCommerceResult | Promise<ProductCommerceResult>;
348
+ requestQuote?: (configuration: ProductConfiguration, context: ProductCheckoutContext) => ProductCommerceResult | Promise<ProductCommerceResult>;
349
+ };
350
+
202
351
  declare const LIGHT_TYPES: readonly ["none", "directional", "point", "spot", "hemisphere"];
203
352
  type SceneLightType = (typeof LIGHT_TYPES)[number];
204
353
  type SceneLightAttachment = {
@@ -676,6 +825,8 @@ type SceneConfig = {
676
825
  measurements?: MeasurementCollection;
677
826
  /** Named object selections scoped to this model's stable object ids. */
678
827
  selectionSets?: SceneSelectionSet[];
828
+ /** Product choices, constraints, appearance overrides, and selected options for this model. */
829
+ product?: SceneProductConfig;
679
830
  /** Authored timed camera, object, appearance and clip tracks. Model-local IDs. */
680
831
  sequences?: SceneSequence[];
681
832
  };
@@ -892,7 +1043,7 @@ type IsolationActionEffect = {
892
1043
  type ObjectActionEffect = IsolationActionEffect | ObjectBindingsActionEffect | SceneConfigActionEffect | VisibilityActionEffect | CameraActionEffect | AnimationActionEffect;
893
1044
 
894
1045
  type ObjectBindingAction = {
895
- id: "change-color" | "apply-texture" | "toggle-visibility" | string;
1046
+ id: "change-color" | "change-material" | "toggle-visibility" | string;
896
1047
  label: string;
897
1048
  type: "command";
898
1049
  effects?: ObjectActionEffect[];
@@ -1075,6 +1226,16 @@ type ObjectPointerEvent = {
1075
1226
  surface?: ObjectSurfacePoint;
1076
1227
  };
1077
1228
 
1229
+ type ViewerProductOptions = {
1230
+ /** Connects your own pricing, stock, cart and quote services. */
1231
+ adapter?: ProductCommerceAdapter;
1232
+ /** Keep the choices in this URL parameter, so a link reopens the same configuration. */
1233
+ urlParam?: string;
1234
+ /** Start with the panel closed. On small screens it always starts closed. */
1235
+ defaultClosed?: boolean;
1236
+ onConfigurationChange?: (configuration: ProductConfiguration, checkoutUrl: string | null) => void;
1237
+ };
1238
+
1078
1239
  type ComparisonCategory = "identity" | "appearance" | "transform" | "visibility" | "data" | "behavior" | "scene";
1079
1240
  type ComparisonStatus = "added" | "removed" | "modified" | "unchanged" | "ambiguous";
1080
1241
  type ConfigurationComparisonInput = {
@@ -1610,6 +1771,8 @@ type CaptureImageOptions = {
1610
1771
  width?: number;
1611
1772
  height?: number;
1612
1773
  transparent?: boolean;
1774
+ type?: "image/png" | "image/jpeg";
1775
+ quality?: number;
1613
1776
  };
1614
1777
 
1615
1778
  type CaptureVideoOptions = {
@@ -1664,6 +1827,8 @@ type ViewerReadyState = {
1664
1827
  objectBindings: Record<string, ObjectBinding>;
1665
1828
  homeCameraState: HomeCameraState | null;
1666
1829
  captureImage: (options?: CaptureImageOptions) => Promise<string>;
1830
+ /** Whether a streamed model is still fetching tiles for the current view. */
1831
+ isLoadingTiles: () => boolean;
1667
1832
  /** Records one cinematic pass or turntable revolution as a video Blob. */
1668
1833
  captureVideo: (options?: CaptureVideoOptions) => Promise<Blob>;
1669
1834
  invalidate: () => void;
@@ -1888,6 +2053,11 @@ type ModelViewerProps = GroupedModelViewerProps & {
1888
2053
  onIsolationChange?: (isolation: ViewerIsolation | null) => void;
1889
2054
  showIsolateControls?: boolean;
1890
2055
  showSectionTools?: boolean;
2056
+ /**
2057
+ * Lets visitors choose from `sceneConfig.product`, in a panel over the model.
2058
+ * `true` uses the defaults; an object connects services, links and callbacks.
2059
+ */
2060
+ productOptions?: boolean | ViewerProductOptions;
1891
2061
  showMaterialVariants?: boolean;
1892
2062
  showObjectNavigator?: boolean;
1893
2063
  cinematic?: boolean | CinematicConfig;
@@ -1985,4 +2155,4 @@ type ModelViewerModelEntry = {
1985
2155
  sceneConfig?: SceneConfig;
1986
2156
  };
1987
2157
 
1988
- export { MAX_VIEWER_STATE_BYTES as $, type ARExportOptions as A, type BindingEdit as B, type CameraAction as C, type CinematicWaypoint as D, type ComparisonCategory as E, type ComparisonChange as F, type ComparisonHighlight as G, type ComparisonObject as H, type ComparisonStatus as I, type ConfigurationComparisonInput as J, type ConfigurationComparisonReport as K, type CustomObjectBindingDataPanelProps as L, type CustomSceneObjectsPanelProps as M, DEFAULT_SCENE_CONFIG as N, DEFAULT_SECTION_CONFIG as O, type DecalMoveTarget as P, type DeepPartial as Q, type EnvironmentPreset as R, type GlitchModeName as S, type GroupedModelViewerProps as T, type HomeCameraState as U, type InspectAssetOptions as V, type IsolatedObjectBindings as W, type IsolationActionEffect as X, type KernelSizeName as Y, MATERIAL_BLENDING_MODES as Z, MATERIAL_SIDES as _, type ARHandoffOptions as a, type SceneGroundShadowConfig as a$, MODEL_VIEWER_PRESETS as a0, type MeasurementAnchor as a1, type MeasurementCollection as a2, type MeasurementPoint as a3, type MeasurementPosition as a4, type MeasurementResult as a5, type MeasurementSettings as a6, type MeasurementStatus as a7, type MeasurementTool as a8, type MeasurementUnit as a9, type ObjectBindingTextureChannel as aA, type ObjectBindingTextureSlot as aB, type ObjectBindingTransform as aC, type ObjectBindingType as aD, type ObjectBindingsActionEffect as aE, type ObjectPointerEvent as aF, type ObjectSurfacePoint as aG, type ObjectTransformSpace as aH, type PerformanceProfile as aI, type RampTypeName as aJ, type RendererBackend as aK, type SavedMeasurement as aL, type SceneAnimationClipConfig as aM, type SceneAnimationConfig as aN, type SceneAnnotationCameraView as aO, type SceneAnnotationImage as aP, type SceneAnnotationLink as aQ, type SceneAnnotationMarker as aR, type SceneBackgroundConfig as aS, type SceneCameraConfig as aT, type SceneCinematicConfig as aU, type SceneCinematicWaypoint as aV, type SceneComposition as aW, type SceneConfig as aX, type SceneConfigActionEffect as aY, type SceneConfigPatch as aZ, type SceneEnvironmentConfig as a_, type ModelMergeSource as aa, type ModelViewerControlsOptions as ab, type ModelViewerDecoderOptions as ac, type ModelViewerModelEntry as ad, type ModelViewerPerfOptions as ae, type ModelViewerPreset as af, type ModelViewerProps as ag, type ModelViewerTilesOptions as ah, type ModelViewerToolsOptions as ai, type ModelViewerUiOptions as aj, type ModelViewerXrOptions as ak, type MouseControllerPosition as al, type ObjectActionEffect as am, type ObjectActionEvent as an, type ObjectBinding as ao, type ObjectBindingAction as ap, type ObjectBindingCameraState as aq, type ObjectBindingDecal as ar, type ObjectBindingMaterial as as, type ObjectBindingMaterialBlendingMode as at, type ObjectBindingMaterialSide as au, type ObjectBindingPatch as av, type ObjectBindingSelector as aw, type ObjectBindingStatus as ax, type ObjectBindingStyle as ay, type ObjectBindingTarget as az, type ARHandoffRequest as b, prepareViewerState as b$, type SceneLight as b0, type SceneLightAttachment as b1, type SceneLightType as b2, type SceneLightingConfig as b3, type SceneModelConfig as b4, type SceneModelRenderer as b5, type ScenePostProcessingConfig as b6, type SceneSectionAxis as b7, type SceneSectionConfig as b8, type SceneSectionPlane as b9, type UseViewerCameraOptions as bA, type ViewerAnimationsProps as bB, type ViewerCameraConfig as bC, type ViewerCameraPreset as bD, type ViewerCameraProps as bE, type ViewerCameraState as bF, type ViewerConfiguration as bG, type ViewerEngagementEvent as bH, type ViewerIsolation as bI, type ViewerObjectInfo as bJ, type ViewerReadyState as bK, type ViewerRuntimeStats as bL, type ViewerStateStorage as bM, type VisibilityActionEffect as bN, type XRScaleMode as bO, applyIsolation as bP, applyStyleRules as bQ, colorScaleValue as bR, compareViewerConfigurations as bS, groundAsset as bT, isolatedBindingKeys as bU, material as bV, parseAssetTransform as bW, parseSelectionSets as bX, parseViewerState as bY, patchBindings as bZ, patchSceneConfig as b_, type SceneSectionPreset as ba, type SceneSectionSettings as bb, type SceneSelectionSet as bc, type SceneSequence as bd, type SceneShadowConfig as be, type SceneStyleColorScale as bf, type SceneStyleCondition as bg, type SceneStylePulse as bh, type SceneStyleRule as bi, type SceneWireframeConfig as bj, type SemanticComparisonOptions as bk, type SequenceCameraView as bl, type SequenceControls as bm, type SequenceEasing as bn, type SequenceKeyframe as bo, type SequenceObjectProperty as bp, type SequencePlaybackState as bq, type SequenceTarget as br, type SequenceTrack as bs, type SequenceValue as bt, type SequenceVector3 as bu, type ShareableViewerState as bv, type StreamingDiagnostics as bw, type StyledObjectBindings as bx, type StyledObjectPulse as by, type TexturePositioningControls as bz, type ARHandoffStatus as c, selectBindingKeys as c0, selectBindings as c1, serializeViewerState as c2, snapAssetToGrid as c3, useViewerAnimations as c4, useViewerCamera as c5, type ARSnapshot as d, type ARSnapshotSource as e, type AnimationAction as f, type AnimationActionEffect as g, type AnimationClipInfo as h, type AnimationClipState as i, type AnimationClipStatus as j, type AnimationControls as k, type AnimationLoopMode as l, type AnimationPlayOptions as m, type AnimationPlaybackState as n, type AnnotationMarker as o, type AssetDiagnosticIssue as p, type AssetDiagnosticsReport as q, type AssetDiagnosticsSource as r, type AssetTextureDiagnostic as s, type AssetTransform as t, type CameraActionEffect as u, type CameraControllerType as v, type CameraLimits as w, type CaptureImageOptions as x, type CaptureVideoOptions as y, type CinematicConfig as z };
2158
+ export { MAX_VIEWER_STATE_BYTES as $, type ARExportOptions as A, type BindingEdit as B, type CameraAction as C, type CinematicWaypoint as D, type ComparisonCategory as E, type ComparisonChange as F, type ComparisonHighlight as G, type ComparisonObject as H, type ComparisonStatus as I, type ConfigurationComparisonInput as J, type ConfigurationComparisonReport as K, type CustomObjectBindingDataPanelProps as L, type CustomSceneObjectsPanelProps as M, DEFAULT_SCENE_CONFIG as N, DEFAULT_SECTION_CONFIG as O, type DecalMoveTarget as P, type DeepPartial as Q, type EnvironmentPreset as R, type GlitchModeName as S, type GroupedModelViewerProps as T, type HomeCameraState as U, type InspectAssetOptions as V, type IsolatedObjectBindings as W, type IsolationActionEffect as X, type KernelSizeName as Y, MATERIAL_BLENDING_MODES as Z, MATERIAL_SIDES as _, type ARHandoffOptions as a, type ProductPricing as a$, MODEL_VIEWER_PRESETS as a0, type MeasurementAnchor as a1, type MeasurementCollection as a2, type MeasurementPoint as a3, type MeasurementPosition as a4, type MeasurementResult as a5, type MeasurementSettings as a6, type MeasurementStatus as a7, type MeasurementTool as a8, type MeasurementUnit as a9, type ObjectBindingTextureChannel as aA, type ObjectBindingTextureSlot as aB, type ObjectBindingTransform as aC, type ObjectBindingType as aD, type ObjectBindingsActionEffect as aE, type ObjectPointerEvent as aF, type ObjectSurfacePoint as aG, type ObjectTransformSpace as aH, type PerformanceProfile as aI, type ProductAppearance as aJ, type ProductAvailability as aK, type ProductCheckoutContext as aL, type ProductCheckoutLink as aM, type ProductCommerceAdapter as aN, type ProductCommerceContext as aO, type ProductCommerceResult as aP, type ProductConfiguration as aQ, type ProductConfigurationIssue as aR, type ProductDefinition as aS, type ProductDefinitionWarning as aT, type ProductGroupDisplay as aU, type ProductOption as aV, type ProductOptionGroup as aW, type ProductOptionRef as aX, type ProductOptionRule as aY, type ProductOptionState as aZ, type ProductPrice as a_, type ModelMergeSource as aa, type ModelViewerControlsOptions as ab, type ModelViewerDecoderOptions as ac, type ModelViewerModelEntry as ad, type ModelViewerPerfOptions as ae, type ModelViewerPreset as af, type ModelViewerProps as ag, type ModelViewerTilesOptions as ah, type ModelViewerToolsOptions as ai, type ModelViewerUiOptions as aj, type ModelViewerXrOptions as ak, type MouseControllerPosition as al, type ObjectActionEffect as am, type ObjectActionEvent as an, type ObjectBinding as ao, type ObjectBindingAction as ap, type ObjectBindingCameraState as aq, type ObjectBindingDecal as ar, type ObjectBindingMaterial as as, type ObjectBindingMaterialBlendingMode as at, type ObjectBindingMaterialSide as au, type ObjectBindingPatch as av, type ObjectBindingSelector as aw, type ObjectBindingStatus as ax, type ObjectBindingStyle as ay, type ObjectBindingTarget as az, type ARHandoffRequest as b, type ViewerCameraState as b$, type ProductSelections as b0, type ProductSku as b1, type RampTypeName as b2, type RendererBackend as b3, type SavedMeasurement as b4, type SceneAnimationClipConfig as b5, type SceneAnimationConfig as b6, type SceneAnnotationCameraView as b7, type SceneAnnotationImage as b8, type SceneAnnotationLink as b9, type SceneShadowConfig as bA, type SceneStyleColorScale as bB, type SceneStyleCondition as bC, type SceneStylePulse as bD, type SceneStyleRule as bE, type SceneWireframeConfig as bF, type SemanticComparisonOptions as bG, type SequenceCameraView as bH, type SequenceControls as bI, type SequenceEasing as bJ, type SequenceKeyframe as bK, type SequenceObjectProperty as bL, type SequencePlaybackState as bM, type SequenceTarget as bN, type SequenceTrack as bO, type SequenceValue as bP, type SequenceVector3 as bQ, type ShareableViewerState as bR, type StreamingDiagnostics as bS, type StyledObjectBindings as bT, type StyledObjectPulse as bU, type TexturePositioningControls as bV, type UseViewerCameraOptions as bW, type ViewerAnimationsProps as bX, type ViewerCameraConfig as bY, type ViewerCameraPreset as bZ, type ViewerCameraProps as b_, type SceneAnnotationMarker as ba, type SceneBackgroundConfig as bb, type SceneCameraConfig as bc, type SceneCinematicConfig as bd, type SceneCinematicWaypoint as be, type SceneComposition as bf, type SceneConfig as bg, type SceneConfigActionEffect as bh, type SceneConfigPatch as bi, type SceneEnvironmentConfig as bj, type SceneGroundShadowConfig as bk, type SceneLight as bl, type SceneLightAttachment as bm, type SceneLightType as bn, type SceneLightingConfig as bo, type SceneModelConfig as bp, type SceneModelRenderer as bq, type ScenePostProcessingConfig as br, type SceneProductConfig as bs, type SceneSectionAxis as bt, type SceneSectionConfig as bu, type SceneSectionPlane as bv, type SceneSectionPreset as bw, type SceneSectionSettings as bx, type SceneSelectionSet as by, type SceneSequence as bz, type ARHandoffStatus as c, type ViewerConfiguration as c0, type ViewerEngagementEvent as c1, type ViewerIsolation as c2, type ViewerObjectInfo as c3, type ViewerProductOptions as c4, type ViewerReadyState as c5, type ViewerRuntimeStats as c6, type ViewerStateStorage as c7, type VisibilityActionEffect as c8, type XRScaleMode as c9, applyIsolation as ca, applyStyleRules as cb, colorScaleValue as cc, compareViewerConfigurations as cd, groundAsset as ce, isolatedBindingKeys as cf, material as cg, parseAssetTransform as ch, parseSelectionSets as ci, parseViewerState as cj, patchBindings as ck, patchSceneConfig as cl, prepareViewerState as cm, selectBindingKeys as cn, selectBindings as co, serializeViewerState as cp, snapAssetToGrid as cq, useViewerAnimations as cr, useViewerCamera as cs, type ARSnapshot as d, type ARSnapshotSource as e, type AnimationAction as f, type AnimationActionEffect as g, type AnimationClipInfo as h, type AnimationClipState as i, type AnimationClipStatus as j, type AnimationControls as k, type AnimationLoopMode as l, type AnimationPlayOptions as m, type AnimationPlaybackState as n, type AnnotationMarker as o, type AssetDiagnosticIssue as p, type AssetDiagnosticsReport as q, type AssetDiagnosticsSource as r, type AssetTextureDiagnostic as s, type AssetTransform as t, type CameraActionEffect as u, type CameraControllerType as v, type CameraLimits as w, type CaptureImageOptions as x, type CaptureVideoOptions as y, type CinematicConfig as z };
@@ -1,4 +1,4 @@
1
- import { a as ARHandoffOptions } from './modelViewerProps-Ce4-wb57.mjs';
1
+ import { a as ARHandoffOptions } from './modelViewerProps-C7saa0i2.mjs';
2
2
 
3
3
  /** Props of `BindingBuilder`. */
4
4
  type BindingBuilderProps = {
@@ -1,4 +1,4 @@
1
- import { a as ARHandoffOptions } from './modelViewerProps-BibuMND7.js';
1
+ import { a as ARHandoffOptions } from './modelViewerProps-CbK_4uZj.js';
2
2
 
3
3
  /** Props of `BindingBuilder`. */
4
4
  type BindingBuilderProps = {
@@ -1 +1 @@
1
- .bb-loadingOverlay{position:absolute;inset:0;z-index:5;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;padding:24px;text-align:center;border-radius:14px;background:#f8fafcd1;backdrop-filter:blur(2px)}.bb-loadingSpinner{width:40px;height:40px;border-radius:999px;border:3px solid rgba(148,163,184,.3);border-top-color:#2563eb;animation:bb-spin .8s linear infinite}.bb-loadingProgressRow{display:flex;align-items:center;gap:8px;width:100%;max-width:240px}.bb-loadingProgress{flex:1;height:6px;border-radius:999px;background:#94a3b84d;overflow:hidden}.bb-loadingProgress__bar{height:100%;border-radius:inherit;background:#2563eb;transition:width .15s ease-out}.bb-loadingProgress__label{flex-shrink:0;min-width:34px;text-align:right;color:#475569;font-size:12px;font-weight:600;font-variant-numeric:tabular-nums}.bb-loadingMessage{max-width:320px;color:#475569;font-size:13px;font-weight:600;line-height:1.5}.ri-viewerSlot{position:relative;width:100%;height:100%;min-width:0;min-height:0}.ri-viewerPlaceholder{position:relative;overflow:hidden}.ri-viewerPlaceholder--inset{position:absolute;inset:0}.ri-poster{position:absolute;inset:0;z-index:0;width:100%;height:100%;object-fit:var(--ri-poster-fit, contain);pointer-events:none;user-select:none;transition:opacity .3s ease}.ri-poster--hidden{opacity:0}[data-reduced-motion] .ri-poster{transition:none}@media(prefers-reduced-motion:reduce){.ri-poster{transition:none}}.ri-revealButton{position:absolute;top:50%;left:50%;z-index:2;display:inline-flex;align-items:center;gap:8px;padding:10px 18px;border:0;border-radius:999px;background:#111827d1;color:#f9fafb;font:600 14px/1.2 Inter,Segoe UI,Helvetica,Arial,sans-serif;white-space:nowrap;cursor:pointer;transform:translate(-50%,-50%);box-shadow:0 6px 20px #00000040}.ri-revealButton:hover{background:#111827f0}.ri-revealButton:focus-visible{outline:2px solid #93c5fd;outline-offset:3px}:root{--ri-styles-simple-model-viewer: 1}.smv-root{--smv-panel-font-family: Inter, "Segoe UI", Helvetica, Arial, sans-serif;--smv-panel-bg: #141824;--smv-panel-bg-strong: #1a1f2e;--smv-panel-bg-strong-hover: #252b3b;--smv-panel-border: rgba(255, 255, 255, .06);--smv-panel-border-strong: rgba(255, 255, 255, .08);--smv-panel-border-active: rgba(255, 255, 255, .18);--smv-panel-shadow-left: 4px 0 24px rgba(0, 0, 0, .35);--smv-panel-shadow-right: -4px 0 24px rgba(0, 0, 0, .35);--smv-panel-text: #f1f5f9;--smv-panel-text-emphasis: #ffffff;--smv-panel-text-muted: #94a3b8;--smv-panel-text-subtle: #64748b;--smv-panel-surface: rgba(255, 255, 255, .05);--smv-panel-surface-hover: rgba(255, 255, 255, .1);--smv-panel-surface-soft: rgba(255, 255, 255, .04);--smv-panel-accent: #3b82f6;--smv-panel-accent-contrast: #ffffff;position:relative;width:100%;height:100%;min-height:0;overflow:hidden;display:flex;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility;font-synthesis:none}.smv-canvasArea{flex:1;position:relative;min-width:0}.smv-upload-input{display:none}.smv-upload-toolbar{position:absolute;top:12px;left:50%;z-index:120;display:flex;align-items:center;gap:10px;max-width:calc(100% - 32px);padding:5px 6px;border:1px solid var(--smv-panel-border-strong);border-radius:10px;background:#141824e0;color:var(--smv-panel-text);box-shadow:0 16px 30px #00000047;backdrop-filter:blur(14px);transform:translate(-50%)}.smv-upload-toolbar__name{max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--smv-panel-text-muted);font-size:12px;font-weight:500}.smv-upload-toolbar__button{display:inline-flex;align-items:center;gap:7px;min-height:34px;padding:0 14px;border:1px solid rgba(255,255,255,.08);border-radius:10px;background:#3b82f62e;color:var(--smv-panel-text-emphasis);font-size:12px;font-weight:600;cursor:pointer}.smv-upload-toolbar__button--ghost{background:var(--smv-panel-surface);color:var(--smv-panel-text-muted)}.smv-upload-empty-state{display:flex;align-items:center;justify-content:center;width:100%;height:100%;padding:24px}.smv-upload-empty-state__card{width:min(440px,100%);padding:28px;border:1px dashed rgba(255,255,255,.2);border-radius:8px;color:var(--smv-panel-text);text-align:center;box-shadow:0 24px 40px #00000047;backdrop-filter:blur(14px)}.smv-upload-empty-state__icon{display:inline-flex;align-items:center;justify-content:center;width:56px;height:56px;margin-bottom:18px;border-radius:10px;background:#3b82f62e;color:#bfdbfe}.smv-upload-empty-state__title{margin:0 0 10px;color:var(--smv-panel-text-emphasis);font-size:24px;line-height:1.15}.smv-upload-empty-state__body{margin:0 0 18px;color:var(--smv-panel-text-muted);font-size:14px;font-weight:700;line-height:1.6}.smv-upload-empty-state__body code{color:var(--smv-panel-text-emphasis);font-family:var(--smv-panel-font-family)}.smv-upload-empty-state__button{display:inline-flex;align-items:center;gap:8px;min-height:40px;padding:0 18px;border:none;border-radius:8px;background:#3b82f6;color:#eff6ff;font-size:13px;font-weight:700;cursor:pointer}.smv-upload-drop-overlay{position:absolute;inset:0;z-index:130;display:flex;align-items:center;justify-content:center;padding:24px;background:#080c147a;backdrop-filter:blur(4px)}.smv-upload-drop-overlay__card{display:inline-flex;align-items:center;gap:10px;padding:16px 20px;border:1px dashed rgba(191,219,254,.75);border-radius:10px;background:#1e293beb;color:#dbeafe;font-size:14px;font-weight:700;box-shadow:0 18px 36px #00000047}.smv-canvasArea .bb-loadingOverlay{position:absolute;inset:0;z-index:110;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;padding:24px;text-align:center;border-radius:14px;background:#0f172a75;backdrop-filter:blur(1px)}.smv-canvasArea .bb-loadingSpinner{width:40px;height:40px;border-radius:999px;border:3px solid rgba(226,232,240,.24);border-top-color:#93c5fd;animation:bb-spin .8s linear infinite}.smv-canvasArea .bb-loadingProgressRow{display:flex;align-items:center;gap:8px;width:100%;max-width:240px}.smv-canvasArea .bb-loadingProgress{flex:1;height:6px;border-radius:999px;background:#e2e8f03d;overflow:hidden}.smv-canvasArea .bb-loadingProgress__bar{height:100%;border-radius:inherit;background:#93c5fd;transition:width .15s ease-out}.smv-canvasArea .bb-loadingProgress__label{flex-shrink:0;min-width:34px;text-align:right;color:#f7f8fa;font-size:12px;font-weight:600;font-variant-numeric:tabular-nums}.smv-canvasArea .bb-loadingMessage{max-width:320px;color:#f7f8fa;font-size:13px;font-weight:600;line-height:1.5}@keyframes bb-spin{to{transform:rotate(360deg)}}.right-panel-wrapper{height:100%;transition:width .45s cubic-bezier(.4,0,.2,1);overflow:visible}.right-panel-wrapper--open{width:300px;flex-shrink:0}.right-panel-wrapper--closed{width:0;flex-shrink:0}.left-panel-wrapper{height:100%;transition:width .45s cubic-bezier(.4,0,.2,1);overflow:visible;order:-1}.left-panel-wrapper--open{width:280px;flex-shrink:0}.left-panel-wrapper--closed{width:0;flex-shrink:0}.side-panel__open-btn.side-panel__open-btn--left{left:12px;right:auto}.side-panel.side-panel--left{left:0;right:auto;width:280px;transform:translate(-100%);border-left:none;border-right:1px solid var(--smv-panel-border);box-shadow:var(--smv-panel-shadow-left)}.side-panel.side-panel--open-left{transform:translate(0)}.side-panel.side-panel--closed-left{transform:translate(-100%)}.env-controls{display:flex;flex-direction:column;overflow-y:auto;flex:1}.env-section{border-bottom:1px solid var(--smv-panel-border-strong)}.env-section__header{display:flex;align-items:center;gap:6px;width:100%;padding:9px 14px;border:none;background:var(--smv-panel-surface-soft);color:var(--smv-panel-text-muted);font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;cursor:pointer}.env-section__chevron{transition:transform .15s}.env-section__chevron--collapsed{transform:rotate(-90deg)}.env-section__body{display:flex;flex-direction:column}.env-row{display:flex;gap:6px;align-items:center;min-height:32px;border-bottom:1px solid var(--smv-panel-surface)}.env-row__label{flex:0 0 42%;padding:0 0 0 14px;font-size:11.5px;font-weight:500;color:var(--smv-panel-text-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.env-row__value{flex:1;display:flex;align-items:center;padding:5px 10px 5px 8px;min-width:0}.env-row__value--slider{gap:6px}.env-checkbox-btn{display:flex;align-items:center;cursor:pointer;background:none;border:none;padding:0}.env-checkbox{width:15px;height:15px;border-radius:3px;border:1.5px solid var(--smv-panel-border-active);background:var(--smv-panel-surface-soft);display:flex;align-items:center;justify-content:center;transition:background .15s,border-color .15s}.env-checkbox--checked{background:var(--smv-panel-accent);border-color:var(--smv-panel-accent)}.env-select{width:100%;padding:5px 8px;border-radius:4px;border:none;background:var(--smv-panel-surface-hover);color:var(--smv-panel-text);font-size:11.5px;outline:none;box-sizing:border-box;text-transform:capitalize}.env-color-swatch{position:relative;width:100%;height:22px;border-radius:4px;border:1px solid rgba(255,255,255,.15);display:flex;align-items:center;justify-content:center;overflow:hidden;cursor:pointer}.env-color-swatch__hex{font-size:10.5px;font-weight:700;color:#0f172a;text-shadow:0 1px 1px rgba(255,255,255,.35);pointer-events:none;text-transform:uppercase}.env-color-swatch__input{position:absolute;inset:0;width:100%;height:100%;border:none;padding:0;opacity:0;cursor:pointer}.env-slider{flex:1;accent-color:var(--smv-panel-accent);cursor:pointer;min-width:0}.env-slider__value{flex-shrink:0;min-width:32px;padding:2px 5px;border-radius:4px;background:var(--smv-panel-surface-hover);color:var(--smv-panel-accent);font-size:10.5px;font-weight:600;text-align:center}.side-panel__open-btn{position:absolute;top:12px;right:12px;display:flex;align-items:center;gap:7px;padding:7px 13px;border-radius:7px;border:1px solid var(--smv-panel-border-strong);background:var(--smv-panel-bg-strong);cursor:pointer;font-size:13px;font-weight:500;color:var(--smv-panel-text);z-index:190;transition:background .15s}.side-panel__open-btn:hover{background:var(--smv-panel-bg-strong-hover)}.side-panel{position:absolute;top:0;right:0;width:300px;height:100%;background:var(--smv-panel-bg);display:flex;flex-direction:column;font-family:var(--smv-panel-font-family);transform:translate(100%);transition:transform .45s cubic-bezier(.4,0,.2,1);z-index:200;border-left:1px solid var(--smv-panel-border);box-shadow:var(--smv-panel-shadow-right)}.side-panel--open{transform:translate(0)}.side-panel--closed{transform:translate(100%)}.side-panel__header{padding:24px 20px 16px;border-bottom:1px solid var(--smv-panel-border-strong)}.side-panel__header-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:4px}.side-panel__eyebrow{font-size:15px;font-weight:700;letter-spacing:.12em;color:var(--smv-panel-text-subtle);text-transform:uppercase}.side-panel__title{font-size:22px;font-weight:700;color:var(--smv-panel-text);margin:0;line-height:1.2}.side-panel__close-btn{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:8px;border:1px solid var(--smv-panel-border-strong);background:var(--smv-panel-surface);cursor:pointer;color:var(--smv-panel-text-muted);transition:background .15s,color .15s;flex-shrink:0}.side-panel__close-btn:hover{background:var(--smv-panel-surface-hover);color:var(--smv-panel-text)}.side-panel__search-wrap{padding:14px 16px;border-bottom:1px solid var(--smv-panel-border-strong)}.side-panel__search{width:100%;padding:10px 14px;border-radius:10px;border:1px solid var(--smv-panel-border-strong);background:var(--smv-panel-surface);color:var(--smv-panel-text);font-size:13px;outline:none;box-sizing:border-box;transition:border-color .15s,background .15s}.side-panel__search::placeholder{color:var(--smv-panel-text-subtle)}.side-panel__search:focus{border-color:var(--smv-panel-border-active);background:var(--smv-panel-surface-hover)}.side-panel__list{display:flex;flex-direction:column;padding:10px 0;overflow-y:auto;flex:1}.side-panel__list::-webkit-scrollbar{width:4px}.side-panel__list::-webkit-scrollbar-track{background:transparent}.side-panel__list::-webkit-scrollbar-thumb{background:var(--smv-panel-surface-hover);border-radius:4px}.side-panel__row{display:flex;align-items:center;justify-content:space-between;padding:12px 20px;cursor:pointer;transition:background .12s;border-bottom:1px solid var(--smv-panel-surface-soft)}.side-panel__row:hover,.side-panel__row--hovered{background:var(--smv-panel-surface)}.side-panel__label{font-size:14px;font-weight:600;color:var(--smv-panel-text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1}.side-panel__labelButton{min-width:0;padding:0;background:none;border:none;font-family:inherit;text-align:left;cursor:pointer}.side-panel__labelButton:focus-visible{outline:2px solid var(--smv-panel-text);outline-offset:2px;border-radius:4px}.side-panel__label--hovered{color:var(--smv-panel-text-emphasis)}.side-panel__vis-btn{display:flex;align-items:center;flex-shrink:0;cursor:pointer;background:none;border:none;padding:0;margin-left:10px}.side-panel__checkbox{width:16px;height:16px;border-radius:4px;border:1.5px solid var(--smv-panel-border-active);background:transparent;display:flex;align-items:center;justify-content:center;transition:background .15s,border-color .15s}.side-panel__checkbox--checked{background:var(--smv-panel-accent);border-color:var(--smv-panel-accent)}@media(max-width:900px){.smv-upload-toolbar{top:56px;gap:8px;max-width:calc(100% - 24px);padding:8px 10px}.smv-upload-toolbar__name{max-width:140px}.right-panel-wrapper--open,.left-panel-wrapper--open{width:0}.side-panel,.side-panel.side-panel--left{width:min(300px,85vw)}}.smv-largeModelBanner{position:absolute;bottom:12px;left:50%;transform:translate(-50%);z-index:20;display:flex;align-items:center;gap:8px;padding:7px 12px 7px 10px;border-radius:8px;background:#1e1400e0;border:1px solid rgba(251,191,36,.35);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);color:#fbbf24;font-size:12px;font-weight:500;line-height:1.4;pointer-events:auto;max-width:calc(100% - 32px);text-align:center}.smv-largeModelBanner__icon{flex-shrink:0}.smv-largeModelBanner__dismiss{flex-shrink:0;display:flex;align-items:center;justify-content:center;margin-left:4px;padding:2px;background:none;border:none;border-radius:4px;color:#fbbf24b3;cursor:pointer;transition:color .15s ease,background .15s ease}.smv-largeModelBanner__dismiss:hover{color:#fbbf24;background:#fbbf241f}.smv-root[data-reduced-motion] *,.smv-root[data-reduced-motion] *:before,.smv-root[data-reduced-motion] *:after{transition-duration:0s!important;transition-delay:0s!important}
1
+ .bb-loadingOverlay{position:absolute;inset:0;z-index:var(--ri-ui-z-overlay);display:flex;align-items:center;justify-content:center;padding:16px;background:var(--ri-ui-panel)}.bb-root .bb-loadingOverlay{background:var(--ri-ui-scrim)}.ri-canvasArea .bb-loadingOverlay{z-index:12}.smv-canvasArea .bb-loadingOverlay{z-index:110}.bb-loadingCard{display:grid;gap:8px;box-sizing:border-box;width:min(100%,280px);padding:12px 14px;border:1px solid var(--ri-ui-line);border-radius:var(--ri-ui-radius-m);background:var(--ri-ui-raised);box-shadow:var(--ri-ui-shadow-menu);font-size:12px;line-height:16px;text-align:left}.bb-loadingHeader{display:flex;align-items:baseline;justify-content:space-between;gap:12px}.bb-loadingTitle{min-width:0;overflow:hidden;color:var(--ri-ui-text);font-weight:500;text-overflow:ellipsis;white-space:nowrap}.bb-loadingPercent{flex-shrink:0;color:var(--ri-ui-text-2);font-variant-numeric:tabular-nums}.bb-loadingProgress{height:3px;overflow:hidden;border-radius:2px;background:var(--ri-ui-line-strong)}.bb-loadingProgress__bar{height:100%;border-radius:inherit;background:var(--ri-ui-accent)}.bb-loadingProgress--unknown .bb-loadingProgress__bar{width:35%;animation:bb-loadingSlide 1.2s ease-in-out infinite}@keyframes bb-loadingSlide{0%{transform:translate(-100%)}to{transform:translate(290%)}}@media(prefers-reduced-motion:reduce){.bb-loadingProgress--unknown .bb-loadingProgress__bar{width:100%;opacity:.4;animation:none}}.bb-loadingMessage{color:var(--ri-ui-text-3);font-size:11px;line-height:14px}.ri-viewerSlot{position:relative;width:100%;height:100%;min-width:0;min-height:0}.ri-viewerPlaceholder{position:relative;overflow:hidden}.ri-viewerPlaceholder--inset{position:absolute;inset:0}.ri-poster{position:absolute;inset:0;z-index:0;width:100%;height:100%;object-fit:var(--ri-poster-fit, contain);pointer-events:none;user-select:none;transition:opacity .3s ease}.ri-poster--hidden{opacity:0}[data-reduced-motion] .ri-poster{transition:none}@media(prefers-reduced-motion:reduce){.ri-poster{transition:none}}.ri-revealButton{position:absolute;top:50%;left:50%;z-index:2;display:inline-flex;align-items:center;gap:8px;padding:10px 18px;border:0;border-radius:var(--ri-ui-radius-m);background:var(--ri-ui-accent);color:var(--ri-ui-on-accent);font:600 14px/1.2 Inter,Segoe UI,Helvetica,Arial,sans-serif;white-space:nowrap;cursor:pointer;transform:translate(-50%,-50%);box-shadow:none}.ri-revealButton:hover{background:var(--ri-ui-accent-hover)}.ri-revealButton:focus-visible{outline:2px solid var(--ri-ui-accent);outline-offset:3px}:where(:root){--ri-ui-gap: #0e0f11;--ri-ui-panel: #17181b;--ri-ui-canvas: #1c1c1e;--ri-ui-raised: #1f2024;--ri-ui-field: #212226;--ri-ui-field-hover: #2a2c31;--ri-ui-hover: rgba(255, 255, 255, .05);--ri-ui-selected: rgba(255, 255, 255, .1);--ri-ui-fill: #3a3c42;--ri-ui-line: #26282d;--ri-ui-line-strong: #34363c;--ri-ui-scrim: rgba(8, 9, 11, .6);--ri-ui-text: #e8e9eb;--ri-ui-text-2: #a3a6ad;--ri-ui-text-3: #7b7e86;--ri-ui-accent: #35c0dc;--ri-ui-accent-hover: #4dcce5;--ri-ui-on-accent: #04222a;--ri-ui-accent-dim: rgba(53, 192, 220, .14);--ri-ui-danger: #f0696d;--ri-ui-danger-dim: rgba(240, 105, 109, .14);--ri-ui-warning: #e8b34b;--ri-ui-warning-dim: rgba(232, 179, 75, .14);--ri-ui-success: #4cc38a;--ri-ui-success-dim: rgba(76, 195, 138, .14);--ri-ui-x: #e5484d;--ri-ui-y: #46a758;--ri-ui-z: #3e8bff;--ri-ui-font: "Inter var", Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;--ri-ui-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;--ri-ui-radius-s: 4px;--ri-ui-radius-m: 6px;--ri-ui-shadow-menu: 0 12px 32px rgba(0, 0, 0, .5);--ri-ui-h-control: 24px;--ri-ui-h-row: 28px;--ri-ui-z-overlay: 10;--ri-ui-z-chrome: 20;--ri-ui-z-menu: 40;--ri-ui-z-dialog: 60;--ri-ui-z-toast: 80}:root{--ri-styles-simple-model-viewer: 1}.smv-root{--smv-panel-font-family: var(--ri-ui-font);--smv-panel-bg: var(--ri-ui-panel);--smv-panel-bg-strong: var(--ri-ui-field);--smv-panel-bg-strong-hover: var(--ri-ui-field-hover);--smv-panel-border: var(--ri-ui-line);--smv-panel-border-strong: var(--ri-ui-line-strong);--smv-panel-border-active: var(--ri-ui-accent);--smv-panel-shadow-left: none;--smv-panel-shadow-right: none;--smv-panel-text: var(--ri-ui-text);--smv-panel-text-emphasis: var(--ri-ui-text);--smv-panel-text-muted: var(--ri-ui-text-2);--smv-panel-text-subtle: var(--ri-ui-text-3);--smv-panel-surface: var(--ri-ui-field);--smv-panel-surface-hover: var(--ri-ui-field-hover);--smv-panel-surface-soft: var(--ri-ui-hover);--smv-panel-accent: var(--ri-ui-accent);--smv-panel-accent-contrast: var(--ri-ui-on-accent);position:relative;width:100%;height:100%;min-height:0;overflow:hidden;display:flex;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility;font-synthesis:none}.smv-canvasArea{flex:1;position:relative;min-width:0}.smv-upload-input{display:none}.smv-upload-toolbar{position:absolute;top:12px;left:50%;z-index:120;display:flex;align-items:center;gap:10px;max-width:calc(100% - 32px);padding:5px 6px;border:1px solid var(--smv-panel-border-strong);border-radius:var(--ri-ui-radius-m);background:var(--ri-ui-scrim);color:var(--smv-panel-text);box-shadow:none;transform:translate(-50%)}.smv-upload-toolbar__name{max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--smv-panel-text-muted);font-size:12px;font-weight:500}.smv-upload-toolbar__button{display:inline-flex;align-items:center;gap:7px;min-height:34px;padding:0 14px;border:1px solid var(--ri-ui-line);border-radius:var(--ri-ui-radius-m);background:var(--ri-ui-field);color:var(--smv-panel-text-emphasis);font-size:12px;font-weight:600;cursor:pointer}.smv-upload-toolbar__button--ghost{background:var(--smv-panel-surface);color:var(--smv-panel-text-muted)}.smv-upload-empty-state{display:flex;align-items:center;justify-content:center;width:100%;height:100%;padding:24px}.smv-upload-empty-state__card{width:min(440px,100%);padding:28px;border:1px dashed var(--ri-ui-line);border-radius:var(--ri-ui-radius-m);color:var(--smv-panel-text);text-align:center;box-shadow:none}.smv-upload-empty-state__icon{display:inline-flex;align-items:center;justify-content:center;width:56px;height:56px;margin-bottom:18px;border-radius:var(--ri-ui-radius-m);background:var(--ri-ui-field);color:var(--ri-ui-text-2)}.smv-upload-empty-state__body{margin:0 0 18px;color:var(--smv-panel-text-muted);font-size:12px;font-weight:600;line-height:1.6}.smv-upload-empty-state__body code{color:var(--smv-panel-text-emphasis);font-family:var(--smv-panel-font-family)}.smv-upload-empty-state__button{display:inline-flex;align-items:center;gap:8px;min-height:40px;padding:0 18px;border:none;border-radius:var(--ri-ui-radius-m);background:var(--ri-ui-accent);color:var(--ri-ui-on-accent);font-size:12px;font-weight:600;cursor:pointer}.smv-upload-drop-overlay{position:absolute;inset:0;z-index:130;display:flex;align-items:center;justify-content:center;padding:24px;background:var(--ri-ui-scrim)}.smv-upload-drop-overlay__card{display:inline-flex;align-items:center;gap:10px;padding:16px 20px;border:1px dashed var(--ri-ui-accent);border-radius:var(--ri-ui-radius-m);background:var(--ri-ui-raised);color:var(--ri-ui-text-2);font-size:12px;font-weight:600;box-shadow:none}.ri-right-panel-wrapper{height:100%;transition:width .45s cubic-bezier(.4,0,.2,1);overflow:visible}.ri-right-panel-wrapper--open{width:300px;flex-shrink:0}.ri-right-panel-wrapper--closed{width:0;flex-shrink:0}.ri-left-panel-wrapper{height:100%;transition:width .45s cubic-bezier(.4,0,.2,1);overflow:visible;order:-1}.ri-left-panel-wrapper--open{width:280px;flex-shrink:0}.ri-left-panel-wrapper--closed{width:0;flex-shrink:0}.ri-side-panel__open-btn.ri-side-panel__open-btn--left{left:12px;right:auto}.ri-side-panel.ri-side-panel--left{left:0;right:auto;width:280px;transform:translate(-100%);border-left:none;border-right:1px solid var(--smv-panel-border);box-shadow:none}.ri-side-panel.ri-side-panel--open-left{transform:translate(0)}.ri-side-panel.ri-side-panel--closed-left{transform:translate(-100%)}.ri-env-controls{display:flex;flex-direction:column;flex:1;overflow-y:auto;font-size:12px;line-height:16px}.ri-env-section{padding-bottom:6px;border-bottom:1px solid var(--smv-panel-border)}.ri-env-section__header{display:flex;align-items:center;gap:6px;width:100%;height:32px;padding:0 12px;border:none;background:transparent;color:var(--smv-panel-text-emphasis);font:inherit;font-weight:600;cursor:pointer}.ri-env-section__header:hover{background:var(--smv-panel-surface-soft)}.ri-env-section__chevron{flex-shrink:0;color:var(--smv-panel-text-subtle);transition:transform .15s}.ri-env-section__chevron--collapsed{transform:rotate(-90deg)}.ri-env-section__body{display:flex;flex-direction:column}.ri-env-row{display:flex;align-items:center;gap:8px;min-height:28px;padding:0 12px}.ri-env-row__label{flex:0 0 52%;overflow:hidden;color:var(--smv-panel-text-muted);text-overflow:ellipsis;white-space:nowrap}.ri-env-row__value{display:flex;flex:1;align-items:center;min-width:0}.ri-env-row__value--slider{gap:8px}.ri-env-checkbox-btn{display:flex;align-items:center;padding:0;border:none;background:none;cursor:pointer}.ri-env-checkbox{display:flex;align-items:center;justify-content:center;width:14px;height:14px;border:1px solid var(--smv-panel-border-strong);border-radius:3px;background:var(--smv-panel-surface);color:var(--smv-panel-accent-contrast);transition:background .15s,border-color .15s}.ri-env-checkbox--checked{border-color:var(--smv-panel-accent);background:var(--smv-panel-accent)}.ri-env-select{box-sizing:border-box;width:100%;height:24px;padding:0 6px;border:none;border-radius:var(--ri-ui-radius-s);background:var(--smv-panel-surface);color:var(--smv-panel-text);font:inherit;text-transform:capitalize}.ri-env-select:hover{background:var(--smv-panel-surface-hover)}.ri-env-color-swatch{position:relative;display:flex;align-items:center;gap:6px;box-sizing:border-box;width:100%;height:24px;padding:0 6px;border-radius:var(--ri-ui-radius-s);background:var(--smv-panel-surface);cursor:pointer}.ri-env-color-swatch:hover{background:var(--smv-panel-surface-hover)}.ri-env-color-swatch__chip{flex-shrink:0;width:14px;height:14px;border:1px solid var(--smv-panel-border-strong);border-radius:3px}.ri-env-color-swatch__hex{color:var(--smv-panel-text);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;pointer-events:none}.ri-env-color-swatch__input{position:absolute;inset:0;width:100%;height:100%;padding:0;border:none;opacity:0;cursor:pointer}.ri-env-slider{flex:1;min-width:0;margin:0;accent-color:var(--smv-panel-accent);cursor:pointer}.ri-env-slider__value{flex-shrink:0;min-width:28px;color:var(--smv-panel-text-muted);font-size:11px;font-variant-numeric:tabular-nums;text-align:right}.ri-env-row__info{flex:1;min-width:0;overflow:hidden;color:var(--smv-panel-text);font-variant-numeric:tabular-nums;text-overflow:ellipsis;white-space:nowrap}.ri-env-footer{padding:10px 12px 12px}.ri-env-reset{display:flex;align-items:center;justify-content:center;gap:6px;width:100%;height:26px;border:1px solid var(--smv-panel-border-strong);border-radius:var(--ri-ui-radius-s);background:transparent;color:var(--smv-panel-text-muted);font:inherit;cursor:pointer}.ri-env-reset:hover{background:var(--smv-panel-surface-soft);color:var(--smv-panel-text)}.ri-env-reset:focus-visible,.ri-env-section__header:focus-visible,.ri-env-checkbox-btn:focus-visible,.ri-env-select:focus-visible,.ri-env-slider:focus-visible,.ri-env-color-swatch:focus-within{outline:2px solid var(--smv-panel-accent);outline-offset:1px}.ri-side-panel__open-btn{position:absolute;top:12px;right:12px;display:flex;align-items:center;gap:7px;padding:7px 13px;border-radius:var(--ri-ui-radius-m);border:1px solid var(--smv-panel-border-strong);background:var(--smv-panel-bg-strong);cursor:pointer;font-size:12px;font-weight:500;color:var(--smv-panel-text);z-index:190;transition:background .15s}.ri-side-panel__open-btn:hover{background:var(--smv-panel-bg-strong-hover)}.ri-side-panel{position:absolute;top:0;right:0;width:300px;height:100%;background:var(--smv-panel-bg);display:flex;flex-direction:column;font-family:var(--smv-panel-font-family);transform:translate(100%);transition:transform .45s cubic-bezier(.4,0,.2,1);z-index:200;border-left:1px solid var(--smv-panel-border);box-shadow:none}.ri-side-panel--open{transform:translate(0)}.ri-side-panel--closed{transform:translate(100%)}.ri-side-panel__header{flex-shrink:0;border-bottom:1px solid var(--smv-panel-border)}.ri-side-panel__header-top{display:flex;align-items:center;gap:8px;height:40px;padding:0 8px 0 12px}.ri-side-panel__eyebrow{overflow:hidden;color:var(--smv-panel-text-emphasis);font-size:12px;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.ri-side-panel__title{flex-shrink:0;color:var(--smv-panel-text-subtle);font-size:11px;font-variant-numeric:tabular-nums}.ri-side-panel__close-btn{display:flex;flex-shrink:0;align-items:center;justify-content:center;width:24px;height:24px;margin-left:auto;border:none;border-radius:var(--ri-ui-radius-s);background:transparent;color:var(--smv-panel-text-muted);cursor:pointer;transition:background .15s,color .15s}.ri-side-panel__close-btn:hover{background:var(--smv-panel-surface-hover);color:var(--smv-panel-text)}.ri-side-panel__search-wrap{flex-shrink:0;padding:8px 12px;border-bottom:1px solid var(--smv-panel-border)}.ri-side-panel__search{box-sizing:border-box;width:100%;height:26px;padding:0 8px;border:1px solid transparent;border-radius:var(--ri-ui-radius-s);background:var(--smv-panel-surface);color:var(--smv-panel-text);font-size:12px;outline:none;transition:border-color .15s,background .15s}.ri-side-panel__search::placeholder{color:var(--smv-panel-text-subtle)}.ri-side-panel__search:focus{border-color:var(--smv-panel-border-active);background:var(--smv-panel-surface-hover)}.ri-side-panel__list{display:flex;flex-direction:column;overflow-y:auto;flex:1}.ri-side-panel__list::-webkit-scrollbar{width:4px}.ri-side-panel__list::-webkit-scrollbar-track{background:transparent}.ri-side-panel__list::-webkit-scrollbar-thumb{background:var(--smv-panel-surface-hover);border-radius:var(--ri-ui-radius-s)}.ri-side-panel__row{display:flex;align-items:center;justify-content:space-between;min-height:30px;padding:0 12px;cursor:pointer;transition:background .12s;border-bottom:1px solid var(--smv-panel-surface-soft)}.ri-side-panel__row:hover,.ri-side-panel__row--hovered{background:var(--smv-panel-surface)}.ri-side-panel__row.ri-side-panel__row--selected{background:var(--ri-ui-accent-dim);color:var(--smv-panel-text-emphasis)}.ri-side-panel__label{font-size:12px;color:var(--smv-panel-text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1}.ri-side-panel__labelButton{min-width:0;padding:0;background:none;border:none;font-family:var(--ri-ui-font);text-align:left;cursor:pointer}.ri-side-panel__labelButton:focus-visible{outline:2px solid var(--smv-panel-text);outline-offset:2px;border-radius:var(--ri-ui-radius-s)}.ri-side-panel__label--hovered{color:var(--smv-panel-text-emphasis)}.ri-side-panel__vis-btn{display:flex;align-items:center;flex-shrink:0;cursor:pointer;background:none;border:none;padding:0;margin-left:10px}.ri-side-panel__checkbox{width:16px;height:16px;border-radius:var(--ri-ui-radius-s);border:1.5px solid var(--smv-panel-border-active);background:transparent;display:flex;align-items:center;justify-content:center;transition:background .15s,border-color .15s}.ri-side-panel__checkbox--checked{background:var(--smv-panel-accent);border-color:var(--smv-panel-accent)}@media(max-width:900px){.smv-upload-toolbar{top:56px;gap:8px;max-width:calc(100% - 24px);padding:8px 10px}.smv-upload-toolbar__name{max-width:140px}.ri-right-panel-wrapper--open,.ri-left-panel-wrapper--open{width:0}.ri-side-panel,.ri-side-panel.ri-side-panel--left{width:min(300px,85vw)}}.smv-largeModelBanner{position:absolute;bottom:12px;left:50%;transform:translate(-50%);z-index:20;display:flex;align-items:center;gap:8px;padding:7px 12px 7px 10px;border-radius:var(--ri-ui-radius-m);background:var(--ri-ui-scrim);border:1px solid var(--ri-ui-warning);color:var(--ri-ui-warning);font-size:12px;font-weight:500;line-height:1.4;pointer-events:auto;max-width:calc(100% - 32px);text-align:center}.smv-largeModelBanner__icon{flex-shrink:0}.smv-largeModelBanner__dismiss{flex-shrink:0;display:flex;align-items:center;justify-content:center;margin-left:4px;padding:2px;background:none;border:none;border-radius:var(--ri-ui-radius-s);color:var(--ri-ui-warning);cursor:pointer;transition:color .15s ease,background .15s ease}.smv-largeModelBanner__dismiss:hover{color:var(--ri-ui-warning);background:var(--ri-ui-warning-dim)}.smv-root[data-reduced-motion] *,.smv-root[data-reduced-motion] *:before,.smv-root[data-reduced-motion] *:after{transition-duration:0s;transition-delay:0s}
@@ -1,8 +1,10 @@
1
1
  import * as react from 'react';
2
- import { d as ModelViewerLabels, V as ViewerLoading, g as ViewerReveal, b as ModelFormat, R as ReducedMotionSetting, f as ViewerModelInfo } from './modelFileResolver-Co7j1tdQ.mjs';
3
- export { D as DEFAULT_MODEL_VIEWER_LABELS, M as MaterialVariantGroup, a as MaterialVariantOption, c as ModelViewerLabelKey, e as ViewerModelBounds } from './modelFileResolver-Co7j1tdQ.mjs';
2
+ import { d as ModelViewerLabels, V as ViewerLoading, g as ViewerReveal, b as ModelFormat, R as ReducedMotionSetting, f as ViewerModelInfo } from './modelFileResolver-BEW_95id.mjs';
3
+ export { D as DEFAULT_MODEL_VIEWER_LABELS, M as MaterialVariantGroup, a as MaterialVariantOption, c as ModelViewerLabelKey, e as ViewerModelBounds } from './modelFileResolver-BEW_95id.mjs';
4
4
  import { PresetsType } from '@react-three/drei/helpers/environment-assets';
5
5
 
6
+ /** How the render's colors are mapped to the screen. */
7
+ type ViewerToneMapping = "aces" | "agx" | "neutral" | "none";
6
8
  type SimpleModelViewerProps = {
7
9
  /** Plain-text overrides for built-in viewer text. */
8
10
  labels?: ModelViewerLabels;
@@ -55,10 +57,30 @@ type SimpleModelViewerProps = {
55
57
  ambientColor?: string;
56
58
  directionalIntensity?: number;
57
59
  directionalColor?: string;
60
+ /** How strongly the environment lights the model. Defaults to 1. */
61
+ envIntensity?: number;
62
+ /** The environment's rotation around the vertical axis, in degrees. */
63
+ envRotation?: number;
64
+ /** Blurs the environment when it's shown as the background, from 0 to 1. */
65
+ backgroundBlur?: number;
66
+ /** Defaults to `"aces"`. */
67
+ toneMapping?: ViewerToneMapping;
68
+ /** A soft contact shadow under the model. */
69
+ groundShadow?: boolean;
70
+ /** From 0 to 1. Defaults to 0.5. */
71
+ groundShadowOpacity?: number;
72
+ /** A reference grid under the model. Left out of captures. */
73
+ showFloorGrid?: boolean;
74
+ /** Draws every material as wireframe. */
75
+ wireframe?: boolean;
76
+ /** Multiplies the auto-rotate speed. Defaults to 1. */
77
+ autoRotateSpeed?: number;
78
+ /** The camera's vertical field of view, in degrees. Defaults to 45. */
79
+ fov?: number;
58
80
  /** The model finished loading: its bounds and mesh count. */
59
81
  onModelLoaded?: (model: ViewerModelInfo) => void;
60
82
  onLoadError?: (error: unknown) => void;
61
83
  };
62
84
  declare function SimpleModelViewer(props: SimpleModelViewerProps): react.JSX.Element;
63
85
 
64
- export { ModelFormat, ModelViewerLabels, ReducedMotionSetting, SimpleModelViewer, type SimpleModelViewerProps, ViewerLoading, ViewerModelInfo, ViewerReveal };
86
+ export { ModelFormat, ModelViewerLabels, ReducedMotionSetting, SimpleModelViewer, type SimpleModelViewerProps, ViewerLoading, ViewerModelInfo, ViewerReveal, type ViewerToneMapping };
@@ -1,8 +1,10 @@
1
1
  import * as react from 'react';
2
- import { d as ModelViewerLabels, V as ViewerLoading, g as ViewerReveal, b as ModelFormat, R as ReducedMotionSetting, f as ViewerModelInfo } from './modelFileResolver-Co7j1tdQ.js';
3
- export { D as DEFAULT_MODEL_VIEWER_LABELS, M as MaterialVariantGroup, a as MaterialVariantOption, c as ModelViewerLabelKey, e as ViewerModelBounds } from './modelFileResolver-Co7j1tdQ.js';
2
+ import { d as ModelViewerLabels, V as ViewerLoading, g as ViewerReveal, b as ModelFormat, R as ReducedMotionSetting, f as ViewerModelInfo } from './modelFileResolver-BEW_95id.js';
3
+ export { D as DEFAULT_MODEL_VIEWER_LABELS, M as MaterialVariantGroup, a as MaterialVariantOption, c as ModelViewerLabelKey, e as ViewerModelBounds } from './modelFileResolver-BEW_95id.js';
4
4
  import { PresetsType } from '@react-three/drei/helpers/environment-assets';
5
5
 
6
+ /** How the render's colors are mapped to the screen. */
7
+ type ViewerToneMapping = "aces" | "agx" | "neutral" | "none";
6
8
  type SimpleModelViewerProps = {
7
9
  /** Plain-text overrides for built-in viewer text. */
8
10
  labels?: ModelViewerLabels;
@@ -55,10 +57,30 @@ type SimpleModelViewerProps = {
55
57
  ambientColor?: string;
56
58
  directionalIntensity?: number;
57
59
  directionalColor?: string;
60
+ /** How strongly the environment lights the model. Defaults to 1. */
61
+ envIntensity?: number;
62
+ /** The environment's rotation around the vertical axis, in degrees. */
63
+ envRotation?: number;
64
+ /** Blurs the environment when it's shown as the background, from 0 to 1. */
65
+ backgroundBlur?: number;
66
+ /** Defaults to `"aces"`. */
67
+ toneMapping?: ViewerToneMapping;
68
+ /** A soft contact shadow under the model. */
69
+ groundShadow?: boolean;
70
+ /** From 0 to 1. Defaults to 0.5. */
71
+ groundShadowOpacity?: number;
72
+ /** A reference grid under the model. Left out of captures. */
73
+ showFloorGrid?: boolean;
74
+ /** Draws every material as wireframe. */
75
+ wireframe?: boolean;
76
+ /** Multiplies the auto-rotate speed. Defaults to 1. */
77
+ autoRotateSpeed?: number;
78
+ /** The camera's vertical field of view, in degrees. Defaults to 45. */
79
+ fov?: number;
58
80
  /** The model finished loading: its bounds and mesh count. */
59
81
  onModelLoaded?: (model: ViewerModelInfo) => void;
60
82
  onLoadError?: (error: unknown) => void;
61
83
  };
62
84
  declare function SimpleModelViewer(props: SimpleModelViewerProps): react.JSX.Element;
63
85
 
64
- export { ModelFormat, ModelViewerLabels, ReducedMotionSetting, SimpleModelViewer, type SimpleModelViewerProps, ViewerLoading, ViewerModelInfo, ViewerReveal };
86
+ export { ModelFormat, ModelViewerLabels, ReducedMotionSetting, SimpleModelViewer, type SimpleModelViewerProps, ViewerLoading, ViewerModelInfo, ViewerReveal, type ViewerToneMapping };