{
  "version": 3,
  "sources": ["/cdn/shop/t/62/assets/model-lab.js?drag-fix=178695"],
  "sourcesContent": ["(() => {\n  if (customElements.get('model-lab')) return;\n\n  const GLB_MAGIC = 0x46546c67;\n  const GLB_JSON_CHUNK = 0x4e4f534a;\n  const LARGE_FILE_WARNING_BYTES = 100 * 1024 * 1024;\n  let shopifyViewerFeaturePromise;\n\n  const formatNumber = new Intl.NumberFormat('en-US');\n\n  function normalizeUrl(value) {\n    return new URL(value, window.location.href).href;\n  }\n\n  function formatBytes(bytes) {\n    if (!Number.isFinite(bytes) || bytes < 0) return '\u2014';\n    if (bytes < 1024) return `${bytes} B`;\n    const units = ['KB', 'MB', 'GB'];\n    let size = bytes / 1024;\n    let unit = units[0];\n    for (let index = 1; index < units.length && size >= 1024; index += 1) {\n      size /= 1024;\n      unit = units[index];\n    }\n    return `${size >= 100 ? size.toFixed(0) : size.toFixed(1)} ${unit}`;\n  }\n\n  function safeFileName(value) {\n    return String(value || 'model')\n      .replace(/\\.glb(?:\\?.*)?$/i, '')\n      .replace(/[^a-z0-9_-]+/gi, '-')\n      .replace(/^-+|-+$/g, '')\n      .slice(0, 80) || 'model';\n  }\n\n  function getErrorMessage(error) {\n    if (error instanceof Error) return error.message;\n    if (typeof error === 'string') return error;\n    try {\n      return JSON.stringify(error);\n    } catch (_error) {\n      return '\u672A\u77E5\u9519\u8BEF';\n    }\n  }\n\n  function parseGlbJson(arrayBuffer) {\n    if (!(arrayBuffer instanceof ArrayBuffer) || arrayBuffer.byteLength < 20) {\n      throw new Error('\u6587\u4EF6\u592A\u5C0F\uFF0C\u65E0\u6CD5\u6784\u6210\u6709\u6548\u7684 GLB\u3002');\n    }\n\n    const view = new DataView(arrayBuffer);\n    if (view.getUint32(0, true) !== GLB_MAGIC) {\n      throw new Error('\u6587\u4EF6\u5934\u4E0D\u662F\u6709\u6548\u7684 GLB\u3002\u8BF7\u786E\u8BA4\u6587\u4EF6\u4E3A\u4E8C\u8FDB\u5236 glTF 2.0\u3002');\n    }\n\n    const version = view.getUint32(4, true);\n    if (version !== 2) {\n      throw new Error(`\u4EC5\u652F\u6301 glTF 2.0 GLB\uFF0C\u5F53\u524D\u6587\u4EF6\u7248\u672C\u4E3A ${version}\u3002`);\n    }\n\n    const declaredLength = view.getUint32(8, true);\n    if (declaredLength > arrayBuffer.byteLength) {\n      throw new Error('GLB \u58F0\u660E\u957F\u5EA6\u5927\u4E8E\u5B9E\u9645\u6587\u4EF6\u957F\u5EA6\uFF0C\u6587\u4EF6\u53EF\u80FD\u4E0D\u5B8C\u6574\u3002');\n    }\n\n    let offset = 12;\n    while (offset + 8 <= declaredLength) {\n      const chunkLength = view.getUint32(offset, true);\n      const chunkType = view.getUint32(offset + 4, true);\n      const chunkStart = offset + 8;\n      const chunkEnd = chunkStart + chunkLength;\n\n      if (chunkEnd > arrayBuffer.byteLength) {\n        throw new Error('GLB \u6570\u636E\u5757\u957F\u5EA6\u65E0\u6548\uFF0C\u6587\u4EF6\u53EF\u80FD\u5DF2\u635F\u574F\u3002');\n      }\n\n      if (chunkType === GLB_JSON_CHUNK) {\n        const bytes = new Uint8Array(arrayBuffer, chunkStart, chunkLength);\n        const jsonText = new TextDecoder()\n          .decode(bytes)\n          .replace(/\\u0000+$/g, '')\n          .trim();\n        return JSON.parse(jsonText);\n      }\n\n      offset = chunkEnd;\n    }\n\n    throw new Error('GLB \u4E2D\u672A\u627E\u5230 JSON \u6570\u636E\u5757\u3002');\n  }\n\n  function countPrimitiveTriangles(primitive, accessors) {\n    const accessorIndex = primitive.indices ?? primitive.attributes?.POSITION;\n    const count = accessors?.[accessorIndex]?.count || 0;\n    const mode = primitive.mode ?? 4;\n\n    if (mode === 4) return Math.floor(count / 3);\n    if (mode === 5 || mode === 6) return Math.max(0, count - 2);\n    return 0;\n  }\n\n  function inspectGltfJson(json) {\n    const accessors = json.accessors || [];\n    let vertices = 0;\n    let triangles = 0;\n    let primitives = 0;\n\n    for (const mesh of json.meshes || []) {\n      for (const primitive of mesh.primitives || []) {\n        primitives += 1;\n        const positionAccessor = accessors[primitive.attributes?.POSITION];\n        vertices += positionAccessor?.count || 0;\n        triangles += countPrimitiveTriangles(primitive, accessors);\n      }\n    }\n\n    return {\n      nodes: json.nodes?.length || 0,\n      meshes: json.meshes?.length || 0,\n      primitives,\n      materials: json.materials?.length || 0,\n      textures: json.textures?.length || 0,\n      vertices,\n      triangles,\n      animations: json.animations?.length || 0,\n      animationNames: (json.animations || []).map((animation, index) => animation.name || `Animation ${index + 1}`),\n      extensions: json.extensionsUsed?.length ? json.extensionsUsed.join(', ') : 'None',\n      generator: json.asset?.generator || '\u2014',\n    };\n  }\n\n  function loadShopifyViewerFeature() {\n    if (shopifyViewerFeaturePromise) return shopifyViewerFeaturePromise;\n\n    shopifyViewerFeaturePromise = new Promise((resolve, reject) => {\n      if (!window.Shopify?.loadFeatures) {\n        reject(new Error('Shopify.loadFeatures \u4E0D\u53EF\u7528\uFF0C\u65E0\u6CD5\u8F7D\u5165\u539F\u751F\u6A21\u578B\u67E5\u770B\u5668\u3002'));\n        return;\n      }\n\n      window.Shopify.loadFeatures([\n        {\n          name: 'model-viewer-ui',\n          version: '1.0',\n          onLoad: (errors) => {\n            if (errors) {\n              reject(new Error('Shopify model-viewer-ui \u8F7D\u5165\u5931\u8D25\u3002'));\n              return;\n            }\n            resolve();\n          },\n        },\n      ]);\n    }).catch((error) => {\n      shopifyViewerFeaturePromise = undefined;\n      throw error;\n    });\n\n    return shopifyViewerFeaturePromise;\n  }\n\n  class ModelSession {\n    constructor({ type, name, file = null, url = '', poster = '' }) {\n      this.id = `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n      this.type = type;\n      this.name = name || 'model.glb';\n      this.file = file;\n      this.remoteUrl = url ? normalizeUrl(url) : '';\n      this.poster = poster ? normalizeUrl(poster) : '';\n      this.size = file?.size ?? null;\n      this.objectUrl = '';\n      this.arrayBuffer = null;\n      this.fetchPromise = null;\n    }\n\n    get displayUrl() {\n      if (this.file) {\n        if (!this.objectUrl) this.objectUrl = URL.createObjectURL(this.file);\n        return this.objectUrl;\n      }\n      return this.remoteUrl;\n    }\n\n    get basePath() {\n      if (!this.remoteUrl) return window.location.href;\n      return new URL('.', this.remoteUrl).href;\n    }\n\n    async getArrayBuffer() {\n      if (this.arrayBuffer) return this.arrayBuffer;\n\n      if (this.file) {\n        this.arrayBuffer = await this.file.arrayBuffer();\n        return this.arrayBuffer;\n      }\n\n      if (!this.fetchPromise) {\n        this.fetchPromise = fetch(this.remoteUrl, { mode: 'cors', credentials: 'omit' })\n          .then((response) => {\n            if (!response.ok) {\n              throw new Error(`\u6A21\u578B\u8BF7\u6C42\u5931\u8D25\uFF1AHTTP ${response.status}`);\n            }\n            const contentLength = Number(response.headers.get('content-length'));\n            if (Number.isFinite(contentLength) && contentLength > 0) this.size = contentLength;\n            return response.arrayBuffer();\n          })\n          .then((buffer) => {\n            this.size = this.size || buffer.byteLength;\n            this.arrayBuffer = buffer;\n            return buffer;\n          });\n      }\n\n      return this.fetchPromise;\n    }\n\n    dispose() {\n      if (this.objectUrl) URL.revokeObjectURL(this.objectUrl);\n      this.objectUrl = '';\n      this.arrayBuffer = null;\n      this.fetchPromise = null;\n    }\n  }\n\n  class ShopifyViewerAdapter {\n    constructor(container, callbacks) {\n      this.container = container;\n      this.callbacks = callbacks;\n      this.element = null;\n      this.viewerUi = null;\n      this.sessionId = '';\n      this.loadSequence = 0;\n      this.animations = [];\n      this.interactionAbortController = null;\n      this.interactionSurface = null;\n      this.activePointers = new Map();\n    }\n\n    async load(session, settings) {\n      this.disposeModel();\n      const sequence = ++this.loadSequence;\n      this.sessionId = session.id;\n\n      const viewer = document.createElement('model-viewer');\n      viewer.setAttribute('camera-controls', '');\n      viewer.setAttribute('touch-action', 'pan-y');\n      viewer.setAttribute('interaction-prompt', 'none');\n      viewer.setAttribute('loading', 'eager');\n      viewer.setAttribute('reveal', 'auto');\n      viewer.setAttribute('data-shopify-feature', '1.12');\n      viewer.setAttribute('alt', session.name || '3D model preview');\n      if (session.poster) viewer.setAttribute('poster', session.poster);\n      this.container.replaceChildren(viewer);\n      this.element = viewer;\n\n      await loadShopifyViewerFeature();\n      if (sequence !== this.loadSequence) return;\n\n      if (window.Shopify?.ModelViewerUI) {\n        try {\n          this.viewerUi = new window.Shopify.ModelViewerUI(viewer);\n          this.viewerUi.play?.();\n        } catch (error) {\n          console.warn('[Model Lab] Shopify ModelViewerUI setup failed.', error);\n        }\n      }\n\n      await this.bindInteractionRecovery(viewer);\n      if (sequence !== this.loadSequence) return;\n\n      this.applySettings(settings);\n\n      await new Promise((resolve, reject) => {\n        const onLoad = () => {\n          cleanup();\n          if (sequence !== this.loadSequence) return resolve();\n          this.animations = Array.from(viewer.availableAnimations || []);\n          this.callbacks.onAnimations(this.animations);\n          this.callbacks.onEngineStats({\n            renderer: 'Shopify ModelViewerUI / <model-viewer>',\n            drawCalls: 'N/A',\n          });\n          this.viewerUi?.play?.();\n          this.applySettings(settings);\n          resolve();\n        };\n        const onError = (event) => {\n          cleanup();\n          const detail = event?.detail?.message || event?.detail?.type || '\u65E0\u6CD5\u89E3\u6790\u6216\u6E32\u67D3\u8BE5 GLB\u3002';\n          reject(new Error(`Shopify \u67E5\u770B\u5668\uFF1A${detail}`));\n        };\n        const onProgress = (event) => {\n          this.callbacks.onProgress(event?.detail?.totalProgress ?? null);\n        };\n        const cleanup = () => {\n          viewer.removeEventListener('load', onLoad);\n          viewer.removeEventListener('error', onError);\n          viewer.removeEventListener('progress', onProgress);\n        };\n\n        viewer.addEventListener('load', onLoad, { once: true });\n        viewer.addEventListener('error', onError, { once: true });\n        viewer.addEventListener('progress', onProgress);\n        viewer.src = session.displayUrl;\n      });\n    }\n\n    async bindInteractionRecovery(viewer) {\n      this.clearInteractionRecovery();\n\n      try {\n        await viewer.updateComplete;\n      } catch (_error) {\n        // Older model-viewer builds may not expose a Lit update promise.\n      }\n\n      if (this.element !== viewer) return;\n\n      const controller = new AbortController();\n      const { signal } = controller;\n      const interactionSurface = viewer.shadowRoot?.querySelector('.userInput');\n      const uiContainer = this.viewerUi?.container || viewer.parentElement;\n\n      this.interactionAbortController = controller;\n      this.interactionSurface = interactionSurface;\n\n      const rememberPointer = (event) => {\n        this.activePointers.set(event.pointerId, {\n          pointerType: event.pointerType || 'mouse',\n          isPrimary: event.isPrimary,\n          clientX: event.clientX,\n          clientY: event.clientY,\n        });\n\n        if (event.pointerType === 'mouse' && this.interactionSurface?.setPointerCapture) {\n          try {\n            this.interactionSurface.setPointerCapture(event.pointerId);\n          } catch (_error) {\n            // The global recovery listeners remain as a fallback when capture is unavailable.\n          }\n        }\n      };\n\n      const forgetPointer = (event) => {\n        this.activePointers.delete(event.pointerId);\n      };\n\n      const recoverPointer = (pointerId, event = null) => {\n        const pointer = this.activePointers.get(pointerId);\n        if (!pointer || !this.interactionSurface) return;\n\n        this.activePointers.delete(pointerId);\n        this.interactionSurface.dispatchEvent(new PointerEvent('pointercancel', {\n          bubbles: true,\n          composed: true,\n          pointerId,\n          pointerType: event?.pointerType || pointer.pointerType,\n          isPrimary: event?.isPrimary ?? pointer.isPrimary,\n          clientX: event?.clientX ?? pointer.clientX,\n          clientY: event?.clientY ?? pointer.clientY,\n          button: -1,\n          buttons: 0,\n        }));\n      };\n\n      const recoverAllPointers = (event = null) => {\n        Array.from(this.activePointers.keys()).forEach((pointerId) => recoverPointer(pointerId, event));\n      };\n\n      const resetShopifyDrag = () => {\n        const mouseListeners = this.viewerUi?.state?.listeners?.mouseListeners;\n        const mouseState = mouseListeners?.state;\n        if (!mouseState?.isDragging && !mouseState?.cursorStartPosition) return;\n        mouseListeners.resetState?.();\n      };\n\n      interactionSurface?.addEventListener('pointerdown', rememberPointer, { capture: true, signal });\n      interactionSurface?.addEventListener('pointerup', forgetPointer, { capture: true, signal });\n      interactionSurface?.addEventListener('pointercancel', forgetPointer, { capture: true, signal });\n      interactionSurface?.addEventListener('lostpointercapture', (event) => {\n        recoverPointer(event.pointerId, event);\n      }, { capture: true, signal });\n      interactionSurface?.addEventListener('pointerleave', (event) => {\n        if (event.buttons === 0) {\n          recoverPointer(event.pointerId, event);\n          resetShopifyDrag();\n        }\n      }, { capture: true, signal });\n\n      window.addEventListener('pointermove', (event) => {\n        if (event.pointerType !== 'mouse' || event.buttons !== 0) return;\n        recoverPointer(event.pointerId, event);\n      }, { capture: true, signal });\n\n      window.addEventListener('pointerup', (event) => {\n        queueMicrotask(() => recoverPointer(event.pointerId, event));\n      }, { capture: true, signal });\n\n      window.addEventListener('pointercancel', (event) => {\n        queueMicrotask(() => recoverPointer(event.pointerId, event));\n      }, { capture: true, signal });\n\n      window.addEventListener('mousemove', (event) => {\n        if (event.buttons === 0) resetShopifyDrag();\n      }, { capture: true, signal });\n\n      window.addEventListener('mouseup', () => {\n        queueMicrotask(resetShopifyDrag);\n      }, { capture: true, signal });\n\n      uiContainer?.addEventListener('mouseleave', (event) => {\n        if (event.buttons === 0) resetShopifyDrag();\n      }, { signal });\n\n      window.addEventListener('blur', () => {\n        recoverAllPointers();\n        resetShopifyDrag();\n      }, { signal });\n\n      document.addEventListener('visibilitychange', () => {\n        if (document.hidden) {\n          recoverAllPointers();\n          resetShopifyDrag();\n        }\n      }, { signal });\n\n      viewer.addEventListener('model-visibility', () => {\n        if (viewer.modelIsVisible) this.viewerUi?.play?.();\n      }, { signal });\n    }\n\n    clearInteractionRecovery() {\n      this.interactionAbortController?.abort();\n      this.interactionAbortController = null;\n      this.interactionSurface = null;\n      this.activePointers.clear();\n    }\n\n    applySettings(settings) {\n      const viewer = this.element;\n      if (!viewer) return;\n\n      viewer.style.backgroundColor = settings.background;\n      viewer.setAttribute('exposure', String(settings.exposure));\n      viewer.setAttribute('tone-mapping', settings.toneMapping);\n      viewer.setAttribute('shadow-intensity', String(settings.shadowIntensity));\n      viewer.setAttribute('shadow-softness', String(settings.shadowSoftness));\n      viewer.setAttribute('rotation-per-second', `${30 * settings.rotateSpeed}deg`);\n      viewer.timeScale = settings.playbackSpeed;\n\n      if (settings.autoRotate) viewer.setAttribute('auto-rotate', '');\n      else viewer.removeAttribute('auto-rotate');\n\n      if (settings.animationName) viewer.setAttribute('animation-name', settings.animationName);\n      else viewer.removeAttribute('animation-name');\n\n      if (settings.animationPlaying && this.animations.length) {\n        const playResult = viewer.play?.();\n        if (playResult?.catch) playResult.catch(() => {});\n      } else {\n        viewer.pause?.();\n      }\n    }\n\n    setActive(active, settings) {\n      if (!this.element) return;\n      if (active) {\n        this.applySettings(settings);\n        this.viewerUi?.play?.();\n      }\n      else this.element.pause?.();\n    }\n\n    getAnimations() {\n      return this.animations;\n    }\n\n    restartAnimation(settings) {\n      if (!this.element || !this.animations.length) return;\n      this.element.currentTime = 0;\n      this.element.timeScale = settings.playbackSpeed;\n      const playResult = this.element.play?.();\n      if (playResult?.catch) playResult.catch(() => {});\n    }\n\n    captureCamera() {\n      if (!this.element?.getCameraOrbit || !this.element?.getCameraTarget) return null;\n      const orbit = this.element.getCameraOrbit();\n      const target = this.element.getCameraTarget();\n      return {\n        theta: orbit.theta,\n        phi: orbit.phi,\n        radius: orbit.radius,\n        target: { x: target.x, y: target.y, z: target.z },\n        fov: this.element.getFieldOfView?.() || 45,\n      };\n    }\n\n    setCamera(cameraState) {\n      if (!this.element || !cameraState) return;\n      const { theta, phi, radius, target, fov } = cameraState;\n      if ([theta, phi, radius].every(Number.isFinite)) {\n        this.element.setAttribute('camera-orbit', `${theta}rad ${phi}rad ${radius}m`);\n      }\n      if (target && [target.x, target.y, target.z].every(Number.isFinite)) {\n        this.element.setAttribute('camera-target', `${target.x}m ${target.y}m ${target.z}m`);\n      }\n      if (Number.isFinite(fov)) this.element.setAttribute('field-of-view', `${fov}deg`);\n      this.element.jumpCameraToGoal?.();\n    }\n\n    resetCamera() {\n      if (!this.element) return;\n      this.element.setAttribute('camera-orbit', 'auto auto auto');\n      this.element.setAttribute('camera-target', 'auto auto auto');\n      this.element.setAttribute('field-of-view', 'auto');\n      this.element.jumpCameraToGoal?.();\n    }\n\n    async capture() {\n      if (!this.element?.toBlob) throw new Error('\u5F53\u524D Shopify \u67E5\u770B\u5668\u4E0D\u652F\u6301\u622A\u56FE\u3002');\n      return this.element.toBlob({ mimeType: 'image/png', idealAspect: true });\n    }\n\n    disposeModel() {\n      this.loadSequence += 1;\n      this.clearInteractionRecovery();\n      this.viewerUi?.destroy?.();\n      if (this.element) {\n        this.element.pause?.();\n        this.element.removeAttribute('src');\n      }\n      this.container.replaceChildren();\n      this.element = null;\n      this.viewerUi = null;\n      this.sessionId = '';\n      this.animations = [];\n    }\n\n    dispose() {\n      this.disposeModel();\n    }\n  }\n\n  class ModelLabElement extends HTMLElement {\n    connectedCallback() {\n      if (this.initialized) return;\n      this.initialized = true;\n      this.abortController = new AbortController();\n      this.loadToken = 0;\n      this.sessionToken = 0;\n      this.session = null;\n      this.adapters = {};\n      this.loadedSessionByEngine = { shopify: '', three: '' };\n      this.sharedStats = {};\n      this.engineStats = { shopify: {}, three: {} };\n      this.dragDepth = 0;\n      this.cameraState = null;\n      this.state = {\n        engine: this.dataset.defaultEngine === 'three' ? 'three' : 'shopify',\n        background: this.dataset.initialBackground || '#e9ecef',\n        toneMapping: 'neutral',\n        exposure: 1,\n        autoRotate: false,\n        rotateSpeed: 1,\n        playbackSpeed: 1,\n        animationName: '',\n        animationPlaying: false,\n        shadowIntensity: 1,\n        shadowSoftness: 1,\n        showGrid: true,\n        showAxes: false,\n        wireframe: false,\n        showBounds: false,\n      };\n\n      this.cacheElements();\n      this.bindEvents();\n      this.setEngineUi(this.state.engine);\n      this.applyStageBackground();\n      this.renderStats();\n\n      if (this.dataset.autoLoadProduct === 'true' && this.dataset.productUrl) {\n        queueMicrotask(() => this.loadProductModel());\n      }\n    }\n\n    disconnectedCallback() {\n      queueMicrotask(() => {\n        if (this.isConnected) return;\n        this.dispose();\n      });\n    }\n\n    cacheElements() {\n      this.fileInput = this.querySelector('[data-file-input]');\n      this.urlForm = this.querySelector('[data-url-form]');\n      this.urlInput = this.querySelector('[data-url-input]');\n      this.productButton = this.querySelector('[data-load-product]');\n      this.stage = this.querySelector('[data-stage]');\n      this.emptyState = this.querySelector('[data-empty-state]');\n      this.progress = this.querySelector('[data-progress]');\n      this.statusText = this.querySelector('[data-status]');\n      this.currentSource = this.querySelector('[data-current-source]');\n      this.engineVersion = this.querySelector('[data-engine-version]');\n      this.resetButton = this.querySelector('[data-reset-camera]');\n      this.screenshotButton = this.querySelector('[data-screenshot]');\n      this.fullscreenButton = this.querySelector('[data-fullscreen]');\n      this.animationSelect = this.querySelector('[data-animation-select]');\n      this.animationToggle = this.querySelector('[data-animation-toggle]');\n      this.animationRestart = this.querySelector('[data-animation-restart]');\n      this.errorPanel = this.querySelector('[data-error-panel]');\n      this.errorDetails = this.querySelector('[data-error-details]');\n      this.viewerContainers = {\n        shopify: this.querySelector('[data-viewer-container=\"shopify\"]'),\n        three: this.querySelector('[data-viewer-container=\"three\"]'),\n      };\n      this.statElements = Object.fromEntries(\n        Array.from(this.querySelectorAll('[data-stat]')).map((element) => [element.dataset.stat, element]),\n      );\n    }\n\n    bindEvents() {\n      const { signal } = this.abortController;\n\n      this.fileInput?.addEventListener('change', (event) => {\n        const [file] = event.target.files || [];\n        if (file) this.loadLocalFile(file);\n        event.target.value = '';\n      }, { signal });\n\n      this.productButton?.addEventListener('click', () => this.loadProductModel(), { signal });\n\n      this.urlForm?.addEventListener('submit', (event) => {\n        event.preventDefault();\n        const value = this.urlInput?.value.trim();\n        if (value) this.loadUrl(value);\n      }, { signal });\n\n      this.querySelectorAll('[data-engine-tab]').forEach((tab) => {\n        tab.addEventListener('click', () => this.switchEngine(tab.dataset.engineTab), { signal });\n        tab.addEventListener('keydown', (event) => this.handleTabKeydown(event), { signal });\n      });\n\n      this.querySelectorAll('[data-setting]').forEach((input) => {\n        const eventName = input.type === 'range' || input.type === 'color' ? 'input' : 'change';\n        input.addEventListener(eventName, () => this.handleSettingInput(input), { signal });\n      });\n\n      this.animationSelect?.addEventListener('change', () => {\n        this.state.animationName = this.animationSelect.value;\n        this.applySettingsToAdapters();\n      }, { signal });\n\n      this.animationToggle?.addEventListener('click', () => {\n        this.state.animationPlaying = !this.state.animationPlaying;\n        this.updateAnimationButtons();\n        this.applySettingsToAdapters();\n      }, { signal });\n\n      this.animationRestart?.addEventListener('click', () => {\n        this.state.animationPlaying = true;\n        this.updateAnimationButtons();\n        this.activeAdapter?.restartAnimation?.(this.state);\n      }, { signal });\n\n      this.resetButton?.addEventListener('click', () => this.activeAdapter?.resetCamera?.(), { signal });\n      this.screenshotButton?.addEventListener('click', () => this.downloadScreenshot(), { signal });\n      this.fullscreenButton?.addEventListener('click', () => this.toggleFullscreen(), { signal });\n\n      ['dragenter', 'dragover'].forEach((eventName) => {\n        this.stage?.addEventListener(eventName, (event) => {\n          event.preventDefault();\n          if (eventName === 'dragenter') this.dragDepth += 1;\n          if (event.dataTransfer) event.dataTransfer.dropEffect = 'copy';\n          this.classList.add('is-dragging');\n        }, { signal });\n      });\n\n      this.stage?.addEventListener('dragleave', (event) => {\n        event.preventDefault();\n        this.dragDepth = Math.max(0, this.dragDepth - 1);\n        if (this.dragDepth === 0) this.classList.remove('is-dragging');\n      }, { signal });\n\n      this.stage?.addEventListener('drop', (event) => {\n        event.preventDefault();\n        this.dragDepth = 0;\n        this.classList.remove('is-dragging');\n        const [file] = event.dataTransfer?.files || [];\n        if (file) this.loadLocalFile(file);\n      }, { signal });\n    }\n\n    handleTabKeydown(event) {\n      if (!['ArrowLeft', 'ArrowRight'].includes(event.key)) return;\n      event.preventDefault();\n      const tabs = Array.from(this.querySelectorAll('[data-engine-tab]'));\n      const currentIndex = tabs.indexOf(event.currentTarget);\n      const direction = event.key === 'ArrowRight' ? 1 : -1;\n      const nextTab = tabs[(currentIndex + direction + tabs.length) % tabs.length];\n      nextTab.focus();\n      this.switchEngine(nextTab.dataset.engineTab);\n    }\n\n    handleSettingInput(input) {\n      const key = input.dataset.setting;\n      let value = input.value;\n      if (input.type === 'checkbox') value = input.checked;\n      if (input.type === 'range') value = Number(input.value);\n      this.state[key] = value;\n\n      const output = this.querySelector(`[data-output=\"${key}\"]`);\n      if (output) {\n        const suffix = ['rotateSpeed', 'playbackSpeed'].includes(key) ? '\u00D7' : '';\n        const decimals = ['rotateSpeed', 'playbackSpeed'].includes(key) ? 1 : 2;\n        output.textContent = `${Number(value).toFixed(decimals)}${suffix}`;\n      }\n\n      if (key === 'background') this.applyStageBackground();\n      this.applySettingsToAdapters();\n    }\n\n    applyStageBackground() {\n      this.style.setProperty('--model-lab-initial-background', this.state.background);\n      if (this.stage) this.stage.style.backgroundColor = this.state.background;\n    }\n\n    validateLocalFile(file) {\n      const isGlb = file.name.toLowerCase().endsWith('.glb') || file.type === 'model/gltf-binary';\n      if (!isGlb) throw new Error('\u8BF7\u9009\u62E9\u6269\u5C55\u540D\u4E3A .glb \u7684\u6A21\u578B\u6587\u4EF6\u3002');\n      if (!file.size) throw new Error('\u6240\u9009\u6587\u4EF6\u4E3A\u7A7A\u3002');\n    }\n\n    async loadLocalFile(file) {\n      try {\n        this.validateLocalFile(file);\n        const session = new ModelSession({ type: 'local', name: file.name, file });\n        await this.loadSession(session);\n        if (file.size > LARGE_FILE_WARNING_BYTES) {\n          this.setStatus(`\u6A21\u578B\u5DF2\u8F7D\u5165\uFF1B\u6587\u4EF6\u8D85\u8FC7 100 MB\uFF0C\u53CC\u5F15\u64CE\u540C\u65F6\u9A7B\u7559\u53EF\u80FD\u5360\u7528\u8F83\u591A\u5185\u5B58\u3002`, 'success');\n        }\n      } catch (error) {\n        this.showError(error, '\u672C\u5730 GLB \u8F7D\u5165\u5931\u8D25');\n      }\n    }\n\n    async loadProductModel() {\n      if (!this.dataset.productUrl) {\n        this.showError(new Error('Section \u5C1A\u672A\u9009\u62E9\u5E26\u6709 3D \u5A92\u4F53\u7684 Shopify \u5546\u54C1\u3002'), '\u5546\u54C1\u6A21\u578B\u4E0D\u53EF\u7528');\n        return;\n      }\n      const session = new ModelSession({\n        type: 'shopify',\n        name: this.dataset.productName || 'Shopify product model.glb',\n        url: this.dataset.productUrl,\n        poster: this.dataset.productPoster,\n      });\n      await this.loadSession(session);\n    }\n\n    async loadUrl(value) {\n      try {\n        const url = normalizeUrl(value);\n        const parsed = new URL(url);\n        if (!['http:', 'https:'].includes(parsed.protocol)) {\n          throw new Error('\u53EA\u652F\u6301 HTTP \u6216 HTTPS GLB URL\u3002');\n        }\n        if (!parsed.pathname.toLowerCase().endsWith('.glb')) {\n          throw new Error('URL \u8DEF\u5F84\u5FC5\u987B\u6307\u5411 .glb \u6587\u4EF6\u3002');\n        }\n        const fileName = decodeURIComponent(parsed.pathname.split('/').pop() || 'remote-model.glb');\n        await this.loadSession(new ModelSession({ type: 'url', name: fileName, url }));\n      } catch (error) {\n        this.showError(error, 'GLB URL \u65E0\u6548');\n      }\n    }\n\n    async loadSession(session) {\n      const token = ++this.loadToken;\n      const sessionToken = ++this.sessionToken;\n      this.clearError();\n      this.setLoading(true);\n      this.setStatus(`\u6B63\u5728\u8F7D\u5165 ${session.name}\u2026`, 'loading');\n\n      this.adapters.shopify?.disposeModel();\n      this.adapters.three?.disposeModel();\n      this.loadedSessionByEngine = { shopify: '', three: '' };\n      this.session?.dispose();\n      this.session = session;\n      this.sharedStats = {\n        fileName: session.name,\n        fileSize: session.size == null ? '\u8BFB\u53D6\u4E2D\u2026' : formatBytes(session.size),\n        source: session.type === 'local' ? 'Local file' : session.type === 'shopify' ? 'Shopify CDN' : 'Remote URL',\n      };\n      this.engineStats = { shopify: {}, three: {} };\n      this.currentSource.textContent = `${this.sharedStats.source} \u00B7 ${session.name}`;\n      this.emptyState.hidden = true;\n      this.resetButton.disabled = true;\n      this.screenshotButton.disabled = true;\n      this.updateAnimationOptions([]);\n      this.renderStats();\n\n      const inspectionPromise = this.inspectSession(session, sessionToken);\n\n      try {\n        await this.loadEngine(this.state.engine, session, token);\n        if (token !== this.loadToken) return;\n        await inspectionPromise;\n        if (token !== this.loadToken) return;\n        this.setStatus(`${session.name} \u5DF2\u5728 ${this.engineLabel(this.state.engine)} \u4E2D\u8F7D\u5165`, 'success');\n        this.resetButton.disabled = false;\n        this.screenshotButton.disabled = false;\n      } catch (error) {\n        if (token !== this.loadToken) return;\n        this.showError(error, `${this.engineLabel(this.state.engine)} \u8F7D\u5165\u5931\u8D25`);\n      } finally {\n        if (token === this.loadToken) this.setLoading(false);\n      }\n    }\n\n    async inspectSession(session, sessionToken) {\n      try {\n        const buffer = await session.getArrayBuffer();\n        if (sessionToken !== this.sessionToken) return;\n        const json = parseGlbJson(buffer);\n        const stats = inspectGltfJson(json);\n        this.sharedStats = {\n          ...this.sharedStats,\n          fileSize: formatBytes(session.size || buffer.byteLength),\n          nodes: formatNumber.format(stats.nodes),\n          meshes: formatNumber.format(stats.meshes),\n          materials: formatNumber.format(stats.materials),\n          textures: formatNumber.format(stats.textures),\n          vertices: formatNumber.format(stats.vertices),\n          triangles: formatNumber.format(stats.triangles),\n          animations: formatNumber.format(stats.animations),\n          extensions: stats.extensions,\n        };\n        this.renderStats();\n        if (!this.activeAdapter?.getAnimations?.().length && stats.animationNames.length) {\n          this.updateAnimationOptions(stats.animationNames);\n        }\n      } catch (error) {\n        if (sessionToken !== this.sessionToken) return;\n        this.setNonFatalError(error, '\u6A21\u578B\u4FE1\u606F\u89E3\u6790\u53D7\u9650');\n      }\n    }\n\n    async switchEngine(engine) {\n      if (!['shopify', 'three'].includes(engine) || engine === this.state.engine) return;\n\n      const previousEngine = this.state.engine;\n      const previousAdapter = this.adapters[previousEngine];\n      this.cameraState = previousAdapter?.captureCamera?.() || this.cameraState;\n      previousAdapter?.setActive?.(false, this.state);\n      this.state.engine = engine;\n      this.setEngineUi(engine);\n      this.renderStats();\n\n      if (!this.session) {\n        this.setStatus(`\u5DF2\u5207\u6362\u5230 ${this.engineLabel(engine)}`, 'idle');\n        return;\n      }\n\n      const token = ++this.loadToken;\n      this.setLoading(true);\n      this.setStatus(`\u6B63\u5728\u5207\u6362\u5230 ${this.engineLabel(engine)}\u2026`, 'loading');\n      this.clearError();\n\n      try {\n        await this.loadEngine(engine, this.session, token);\n        if (token !== this.loadToken) return;\n        this.activeAdapter?.setActive?.(true, this.state);\n        if (this.cameraState) this.activeAdapter?.setCamera?.(this.cameraState);\n        this.updateAnimationOptions(this.activeAdapter?.getAnimations?.() || []);\n        this.resetButton.disabled = false;\n        this.screenshotButton.disabled = false;\n        this.setStatus(`${this.session.name} \u00B7 ${this.engineLabel(engine)}`, 'success');\n      } catch (error) {\n        if (token !== this.loadToken) return;\n        this.showError(error, `${this.engineLabel(engine)} \u8F7D\u5165\u5931\u8D25`);\n      } finally {\n        if (token === this.loadToken) this.setLoading(false);\n      }\n    }\n\n    async loadEngine(engine, session, token) {\n      const adapter = this.ensureAdapter(engine);\n      if (this.loadedSessionByEngine[engine] === session.id) {\n        adapter.setActive?.(true, this.state);\n        return;\n      }\n\n      await adapter.load(session, this.state);\n      if (token !== this.loadToken) return;\n      this.loadedSessionByEngine[engine] = session.id;\n      adapter.setActive?.(true, this.state);\n      this.updateAnimationOptions(adapter.getAnimations?.() || []);\n    }\n\n    ensureAdapter(engine) {\n      if (this.adapters[engine]) return this.adapters[engine];\n\n      const callbacks = {\n        onProgress: () => {},\n        onAnimations: (animations) => {\n          if (engine === this.state.engine) this.updateAnimationOptions(animations);\n        },\n        onEngineStats: (stats) => {\n          this.engineStats[engine] = { ...this.engineStats[engine], ...stats };\n          if (engine === this.state.engine) this.renderStats();\n        },\n      };\n\n      if (engine === 'shopify') {\n        this.adapters.shopify = new ShopifyViewerAdapter(this.viewerContainers.shopify, callbacks);\n        return this.adapters.shopify;\n      }\n\n      if (!window.ModelLabThreeViewer) {\n        throw new Error('Three.js bundle \u672A\u80FD\u8F7D\u5165\uFF0C\u8BF7\u5237\u65B0\u9875\u9762\u540E\u91CD\u8BD5\u3002');\n      }\n\n      this.adapters.three = new window.ModelLabThreeViewer(this.viewerContainers.three, {\n        ...callbacks,\n        version: this.dataset.threeVersion,\n        dracoDecoderPath: this.dataset.dracoDecoderPath,\n        ktx2TranscoderPath: this.dataset.ktx2TranscoderPath,\n      });\n      return this.adapters.three;\n    }\n\n    setEngineUi(engine) {\n      this.dataset.engineActive = engine;\n      this.querySelectorAll('[data-engine-tab]').forEach((tab) => {\n        const selected = tab.dataset.engineTab === engine;\n        tab.setAttribute('aria-selected', String(selected));\n        tab.tabIndex = selected ? 0 : -1;\n      });\n      Object.entries(this.viewerContainers).forEach(([name, container]) => {\n        container.hidden = name !== engine;\n      });\n      this.engineVersion.textContent = engine === 'three'\n        ? this.dataset.threeVersion\n        : 'Shopify ModelViewerUI 1.0';\n    }\n\n    engineLabel(engine) {\n      return engine === 'three' ? 'Three.js' : 'Shopify / model-viewer';\n    }\n\n    get activeAdapter() {\n      return this.adapters[this.state.engine];\n    }\n\n    applySettingsToAdapters() {\n      Object.values(this.adapters).forEach((adapter) => adapter.applySettings?.(this.state));\n    }\n\n    updateAnimationOptions(animations) {\n      const uniqueAnimations = Array.from(new Set(animations.filter(Boolean)));\n      this.animationSelect.replaceChildren();\n\n      if (!uniqueAnimations.length) {\n        const option = new Option('\u65E0\u52A8\u753B', '');\n        this.animationSelect.add(option);\n        this.animationSelect.disabled = true;\n        this.animationToggle.disabled = true;\n        this.animationRestart.disabled = true;\n        this.state.animationName = '';\n        this.state.animationPlaying = false;\n        this.updateAnimationButtons();\n        return;\n      }\n\n      uniqueAnimations.forEach((name) => this.animationSelect.add(new Option(name, name)));\n      if (!uniqueAnimations.includes(this.state.animationName)) {\n        this.state.animationName = uniqueAnimations[0];\n      }\n      this.animationSelect.value = this.state.animationName;\n      this.animationSelect.disabled = false;\n      this.animationToggle.disabled = false;\n      this.animationRestart.disabled = false;\n      this.updateAnimationButtons();\n      this.applySettingsToAdapters();\n    }\n\n    updateAnimationButtons() {\n      this.animationToggle.textContent = this.state.animationPlaying ? '\u6682\u505C' : '\u64AD\u653E';\n    }\n\n    updateSharedStats(stats) {\n      this.sharedStats = { ...this.sharedStats, ...stats };\n      this.renderStats();\n    }\n\n    renderStats() {\n      const values = {\n        fileName: '\u2014',\n        fileSize: '\u2014',\n        source: '\u2014',\n        dimensions: '\u2014',\n        nodes: '\u2014',\n        meshes: '\u2014',\n        materials: '\u2014',\n        textures: '\u2014',\n        vertices: '\u2014',\n        triangles: '\u2014',\n        drawCalls: '\u2014',\n        animations: '\u2014',\n        extensions: '\u2014',\n        renderer: '\u2014',\n        ...this.sharedStats,\n        ...this.engineStats[this.state.engine],\n      };\n\n      Object.entries(this.statElements).forEach(([key, element]) => {\n        element.textContent = values[key] ?? '\u2014';\n        element.title = String(values[key] ?? '\u2014');\n      });\n    }\n\n    setLoading(loading) {\n      this.classList.toggle('is-loading', loading);\n      this.progress.hidden = !loading;\n    }\n\n    setStatus(message, type = 'idle') {\n      this.statusText.textContent = message;\n      this.dataset.statusType = type;\n    }\n\n    clearError() {\n      this.errorPanel.hidden = true;\n      this.errorPanel.open = false;\n      this.errorDetails.textContent = '';\n    }\n\n    setNonFatalError(error, context) {\n      this.errorPanel.hidden = false;\n      this.errorDetails.textContent = `${context}\\n${getErrorMessage(error)}\\n\\n\u8FDC\u7A0B URL \u82E5\u672A\u5F00\u653E CORS\uFF0CShopify \u67E5\u770B\u5668\u4ECD\u53EF\u80FD\u663E\u793A\uFF0C\u4F46 Three.js \u548C\u8BCA\u65AD\u4FE1\u606F\u65E0\u6CD5\u8BFB\u53D6\u3002`;\n    }\n\n    showError(error, context) {\n      console.error(`[Model Lab] ${context}`, error);\n      this.setLoading(false);\n      this.setStatus(`${context}\uFF1A${getErrorMessage(error)}`, 'error');\n      this.errorPanel.hidden = false;\n      this.errorPanel.open = true;\n      this.errorDetails.textContent = `${context}\\n${getErrorMessage(error)}${error?.stack ? `\\n\\n${error.stack}` : ''}`;\n    }\n\n    async downloadScreenshot() {\n      if (!this.session || !this.activeAdapter) return;\n      try {\n        this.setStatus('\u6B63\u5728\u751F\u6210\u622A\u56FE\u2026', 'loading');\n        const blob = await this.activeAdapter.capture();\n        if (!(blob instanceof Blob)) throw new Error('\u67E5\u770B\u5668\u672A\u8FD4\u56DE\u6709\u6548\u622A\u56FE\u3002');\n        const url = URL.createObjectURL(blob);\n        const anchor = document.createElement('a');\n        anchor.href = url;\n        anchor.download = `${safeFileName(this.session.name)}-${this.state.engine}.png`;\n        document.body.appendChild(anchor);\n        anchor.click();\n        anchor.remove();\n        setTimeout(() => URL.revokeObjectURL(url), 1000);\n        this.setStatus('\u622A\u56FE\u5DF2\u4E0B\u8F7D', 'success');\n      } catch (error) {\n        this.showError(error, '\u622A\u56FE\u5931\u8D25');\n      }\n    }\n\n    async toggleFullscreen() {\n      try {\n        if (document.fullscreenElement === this.stage) await document.exitFullscreen();\n        else await this.stage.requestFullscreen();\n      } catch (error) {\n        this.showError(error, '\u65E0\u6CD5\u8FDB\u5165\u5168\u5C4F');\n      }\n    }\n\n    dispose() {\n      this.loadToken += 1;\n      this.sessionToken += 1;\n      this.abortController?.abort();\n      Object.values(this.adapters || {}).forEach((adapter) => adapter.dispose?.());\n      this.adapters = {};\n      this.session?.dispose();\n      this.session = null;\n      this.initialized = false;\n    }\n  }\n\n  customElements.define('model-lab', ModelLabElement);\n})();\n"],
  "mappings": "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",
  "names": []
}
