{
  "version": 3,
  "sources": ["/cdn/shop/t/21/assets/virtual-try-on.js?cb=1787359000"],
  "sourcesContent": ["(() => {\n  if (customElements.get('city-virtual-try-on')) return;\n\n  const FACE_INFERENCE_INTERVAL = 95;\n  const FIT_INFERENCE_INTERVAL = 130;\n  const FIT_TIMEOUT_MS = 22000;\n  const FIT_MANUAL_FALLBACK_MS = 7000;\n  const MAX_PHOTO_BYTES = 15 * 1024 * 1024;\n  const FIT_CANVAS_WIDTH = 320;\n  const FIT_CARD_GUIDE = { left: 0.36125, right: 0.63875, top: 0.14775, bottom: 0.381 };\n  // Match the visible frame to the detected outer face width. Overlay assets use\n  // different amounts of transparent padding, so allow the shared correction to\n  // cover wide shields as well as conventional frames instead of capping early.\n  const AUTO_FRAME_TO_FACE_RATIO = 1.02;\n  const AUTO_FACE_SCALE_BLEND = 1;\n  const AUTO_FACE_SCALE_MIN = 0.62;\n  const AUTO_FACE_SCALE_MAX = 2.4;\n  const clamp = (value, min, max) => Math.min(max, Math.max(min, value));\n  const median = (values) => {\n    const sorted = values.filter(Number.isFinite).sort((a, b) => a - b);\n    if (!sorted.length) return NaN;\n    const middle = Math.floor(sorted.length / 2);\n    return sorted.length % 2 ? sorted[middle] : (sorted[middle - 1] + sorted[middle]) / 2;\n  };\n  const averagePoint = (points) => ({\n    x: points.reduce((sum, point) => sum + point.x, 0) / points.length,\n    y: points.reduce((sum, point) => sum + point.y, 0) / points.length,\n  });\n\n  class CityVirtualTryOn extends HTMLElement {\n    constructor() {\n      super();\n      this.dialog = this.querySelector('[data-vto-dialog]');\n      this.sideDialog = this.querySelector('[data-vto-side-dialog]');\n      this.canvas = this.querySelector('[data-vto-canvas]');\n      this.context = this.canvas?.getContext('2d', { alpha: false });\n      this.preflight = this.querySelector('[data-vto-preflight]');\n      this.controls = this.querySelector('[data-vto-controls]');\n      this.loading = this.querySelector('[data-vto-loading]');\n      this.trackingMessage = this.querySelector('[data-vto-tracking]');\n      this.status = this.querySelector('[data-vto-status]');\n      this.openButton = this.querySelector('[data-vto-open]');\n      this.fileInput = this.querySelector('[data-vto-file]');\n      this.variantSelector = this.querySelector('[data-vto-variants]');\n      this.variantToggle = this.querySelector('[data-vto-variant-toggle]');\n      this.variantColoursExpanded = false;\n      this.fitOverlay = this.querySelector('[data-vto-fit-overlay]');\n      this.fitManualOverlay = this.querySelector('[data-vto-fit-manual-overlay]');\n      this.fitManualMagnifier = this.querySelector('[data-vto-fit-manual-magnifier]');\n      this.fitPanel = this.querySelector('[data-vto-fit-panel]');\n      this.stylePanel = this.querySelector('[data-vto-style-panel]');\n      this.profiles = this.parseJson('[data-vto-profiles]', {});\n      this.copy = this.parseJson('[data-vto-copy]', {});\n      this.fitConfig = this.parseJson('[data-vto-fit-config]', {});\n      this.frameWidthMm = Number(this.dataset.frameWidthMm) || 0;\n      this.frameWidthEstimated = this.dataset.frameWidthEstimated === 'true';\n      this.collectionMode = this.dataset.collectionVto === 'true';\n      this.colourOptionIndex = Number(this.dataset.colourOptionIndex) || 0;\n      this.activeVariantId = String(this.dataset.initialVariantId || '');\n      this.activeProfile = null;\n      this.overlayImage = new Image();\n      this.overlayLoadToken = 0;\n      this.overlayVisibleWidthRatio = 1;\n      this.overlayVisibleWidthRatioCache = new Map();\n      this.video = document.createElement('video');\n      this.video.muted = true;\n      this.video.playsInline = true;\n      this.video.setAttribute('playsinline', '');\n      this.mode = null;\n      this.stream = null;\n      this.photo = null;\n      this.photoLandmarks = null;\n      this.photoUrl = null;\n      this.lastCameraLandmarks = null;\n      this.landmarker = null;\n      this.landmarkerMode = null;\n      this.landmarkerQueue = Promise.resolve();\n      this.running = false;\n      this.animationFrame = 0;\n      this.lastInference = 0;\n      this.lastSeen = 0;\n      this.transform = null;\n      this.manualScale = 1;\n      this.manualOffsetY = 0;\n      this.controlsEnabled = null;\n      this.variantUnsubscriber = null;\n      this.lastFocused = null;\n      this.operationToken = 0;\n      this.externalButtons = [];\n      this.galleryMountTimers = [];\n      this.fitApiPromise = null;\n      this.fitDetectionCanvas = document.createElement('canvas');\n      this.fitDetectionCanvas.width = FIT_CANVAS_WIDTH;\n      this.fitDetectionCanvas.height = 240;\n      this.fitDetectionContext = this.fitDetectionCanvas.getContext('2d', { willReadFrequently: true });\n      this.fitSamples = [];\n      this.fitStableFrames = 0;\n      this.fitLastCorners = null;\n      this.fitStartedAt = 0;\n      this.fitStartPending = false;\n      this.fitFallbackCanvas = document.createElement('canvas');\n      this.fitFallbackCandidate = null;\n      this.fitManualPoints = [];\n      this.fitManualInitialPoints = [];\n      this.fitManualActiveCorner = -1;\n      this.boundFitManualMove = (event) => this.moveFitManualPointer(event);\n      this.boundFitManualEnd = () => this.endFitManualPointer();\n      this.boundExternalOpen = (event) => {\n        const button = event.target.closest?.('[data-vto-external-open]');\n        if (!button || button.dataset.vtoSectionId !== this.dataset.sectionId) return;\n        this.open();\n      };\n      this.boundMountLaunchers = () => this.mountGalleryLaunchers();\n      this.boundVisibility = () => {\n        if (!document.hidden) return;\n        this.cancelPendingOperation();\n        this.stopCamera();\n        if (this.dialog?.open) {\n          if (this.collectionMode) this.dialog.close();\n          else this.resetSession();\n        }\n      };\n      this.boundPageHide = () => {\n        this.collectionMode = false;\n        if (this.dialog?.open) this.dialog.close();\n        else this.resetSession();\n      };\n      this.boundResize = () => {\n        this.mountGalleryLaunchers();\n        if (this.mode === 'photo' && this.photo && this.photoLandmarks) {\n          this.resizeCanvas();\n          this.updateTransform(this.photoLandmarks, false, this.photo.naturalWidth, this.photo.naturalHeight, true);\n        }\n        this.renderStatic();\n      };\n    }\n\n    connectedCallback() {\n      if (!this.dialog || !this.canvas || !this.context) return;\n      this.bindEvents();\n      this.mountGalleryLaunchers();\n      [300, 900, 1800].forEach((delay) => {\n        this.galleryMountTimers.push(window.setTimeout(this.boundMountLaunchers, delay));\n      });\n      document.addEventListener('click', this.boundExternalOpen);\n      if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', this.boundMountLaunchers, { once: true });\n      else requestAnimationFrame(this.boundMountLaunchers);\n      this.updateVariant(this.activeVariantId);\n      this.updateFitAvailability();\n\n      const sizedPicker = document.querySelector(`variant-selects[data-section=\"${CSS.escape(this.dataset.sectionId)}\"][data-city-optical-size-index]`);\n      if (sizedPicker && typeof subscribe === 'function' && typeof PUB_SUB_EVENTS !== 'undefined' && PUB_SUB_EVENTS.variantChange) {\n        this.variantUnsubscriber = subscribe(PUB_SUB_EVENTS.variantChange, (event) => {\n          const eventSectionId = event?.data?.sectionId;\n          if (eventSectionId && eventSectionId !== this.dataset.sectionId) return;\n          requestAnimationFrame(() => this.updateVariant(event?.data?.variant?.id));\n        });\n      }\n\n      document.addEventListener('visibilitychange', this.boundVisibility);\n      window.addEventListener('pagehide', this.boundPageHide);\n      window.addEventListener('resize', this.boundResize, { passive: true });\n      window.addEventListener('pointermove', this.boundFitManualMove, { passive: false });\n      window.addEventListener('pointerup', this.boundFitManualEnd);\n      window.addEventListener('pointercancel', this.boundFitManualEnd);\n    }\n\n    disconnectedCallback() {\n      this.variantUnsubscriber?.();\n      document.removeEventListener('click', this.boundExternalOpen);\n      document.removeEventListener('DOMContentLoaded', this.boundMountLaunchers);\n      document.removeEventListener('visibilitychange', this.boundVisibility);\n      window.removeEventListener('pagehide', this.boundPageHide);\n      window.removeEventListener('resize', this.boundResize);\n      window.removeEventListener('pointermove', this.boundFitManualMove);\n      window.removeEventListener('pointerup', this.boundFitManualEnd);\n      window.removeEventListener('pointercancel', this.boundFitManualEnd);\n      this.galleryMountTimers.forEach((timer) => window.clearTimeout(timer));\n      this.galleryMountTimers = [];\n      this.externalButtons.forEach((button) => button.remove());\n      this.cleanUp();\n    }\n\n    parseJson(selector, fallback) {\n      try {\n        return JSON.parse(this.querySelector(selector)?.textContent || '');\n      } catch (_) {\n        return fallback;\n      }\n    }\n\n    bindEvents() {\n      this.openButton?.addEventListener('click', () => this.open());\n      this.querySelector('[data-vto-close]')?.addEventListener('click', () => this.dialog.close());\n      this.querySelector('[data-vto-done]')?.addEventListener('click', () => this.dialog.close());\n      this.querySelector('[data-vto-camera]')?.addEventListener('click', () => this.startCamera());\n      this.fileInput?.addEventListener('change', (event) => this.loadPhoto(event.target.files?.[0]));\n      this.querySelectorAll('[data-vto-scale]').forEach((button) => {\n        button.addEventListener('click', () => this.adjustScale(Number(button.dataset.vtoScale || 0)));\n      });\n      this.querySelectorAll('[data-vto-position]').forEach((button) => {\n        button.addEventListener('click', () => this.adjustPosition(Number(button.dataset.vtoPosition || 0)));\n      });\n      this.querySelector('[data-vto-reset]')?.addEventListener('click', () => this.resetAdjustments());\n      this.querySelectorAll('[data-vto-variant-id]').forEach((button) => {\n        button.addEventListener('click', () => this.selectPdpVariant(button.dataset.vtoVariantId));\n      });\n      this.variantToggle?.addEventListener('click', () => this.setVariantColoursExpanded(!this.variantColoursExpanded));\n      this.querySelectorAll('[data-vto-tab]').forEach((button) => {\n        button.addEventListener('click', () => this.switchTab(button.dataset.vtoTab));\n        button.addEventListener('keydown', (event) => this.handleTabKeydown(event));\n      });\n      this.querySelector('[data-vto-fit-cta]')?.addEventListener('click', () => this.switchTab('fit'));\n      this.querySelector('[data-vto-fit-start]')?.addEventListener('click', () => this.startFitCheck());\n      this.querySelector('[data-vto-fit-cancel]')?.addEventListener('click', () => this.cancelFitCheck());\n      this.querySelector('[data-vto-fit-manual-confirm]')?.addEventListener('click', () => this.confirmFitManualCorners());\n      this.querySelector('[data-vto-fit-manual-retry]')?.addEventListener('click', () => this.restartFitCheck());\n      this.querySelectorAll('[data-vto-fit-corner]').forEach((handle) => {\n        handle.addEventListener('pointerdown', (event) => this.startFitManualPointer(event));\n        handle.addEventListener('keydown', (event) => this.moveFitManualKeyboard(event));\n      });\n      this.querySelector('[data-vto-fit-retry]')?.addEventListener('click', () => this.resetFitStages());\n      this.querySelector('[data-vto-side-open]')?.addEventListener('click', () => this.openSideView());\n      this.querySelector('[data-vto-side-close]')?.addEventListener('click', () => this.sideDialog?.close());\n      this.sideDialog?.addEventListener('click', (event) => {\n        if (event.target === this.sideDialog) this.sideDialog.close();\n      });\n      this.dialog.addEventListener('close', () => this.close());\n      this.dialog.addEventListener('click', (event) => {\n        if (event.target === this.dialog) this.dialog.close();\n      });\n      document.getElementById(this.dataset.productFormId)?.addEventListener('change', () => {\n        requestAnimationFrame(() => this.updateVariant());\n      });\n    }\n\n    mountGalleryLaunchers() {\n      const hosts = [...document.querySelectorAll(`[data-vto-gallery-launch-host=\"${CSS.escape(this.dataset.sectionId)}\"]`)];\n      if (!hosts.length || !this.openButton) return;\n      hosts.forEach((host) => {\n        this.positionGalleryLauncher(host);\n        if (host.querySelector('[data-vto-external-open]')) return;\n        const button = this.openButton.cloneNode(true);\n        button.removeAttribute('data-vto-open');\n        button.dataset.vtoExternalOpen = '';\n        button.dataset.vtoSectionId = this.dataset.sectionId;\n        host.append(button);\n        this.externalButtons.push(button);\n      });\n      this.classList.add('vto--gallery-mounted');\n    }\n\n    positionGalleryLauncher(host) {\n      const mediaWrapper = host.closest('.product__media-wrapper');\n      if (!mediaWrapper) return;\n\n      let target = mediaWrapper;\n      if (window.matchMedia('(min-width: 750px)').matches) {\n        const magicZoom = mediaWrapper.querySelector('#magic-zoom-plus-block');\n        const nativeGallery = mediaWrapper.querySelector('media-gallery.product__column-sticky');\n        if (magicZoom && window.getComputedStyle(magicZoom).display !== 'none') {\n          target = magicZoom;\n        } else if (nativeGallery && window.getComputedStyle(nativeGallery).display !== 'none') {\n          target = nativeGallery;\n        }\n      }\n\n      if (host.parentElement !== target) target.append(host);\n    }\n\n    readSelectedVariantId() {\n      const form = document.getElementById(this.dataset.productFormId);\n      return String(form?.querySelector('[name=\"id\"]')?.value || this.activeVariantId || '');\n    }\n\n    updateVariant(variantId) {\n      const nextId = String(variantId || this.readSelectedVariantId());\n      const nextProfile = this.customPolarisedSelected() ? null : this.profiles[nextId];\n      this.activeVariantId = nextId;\n      this.activeProfile = nextProfile || null;\n      this.applyVariantFit();\n      this.setLaunchVisibility(Boolean(this.activeProfile));\n      this.updateVariantButtons();\n      this.updateSideView();\n\n      if (!this.activeProfile) {\n        if (this.dialog?.open) this.dialog.close();\n        return;\n      }\n      this.loadOverlay(this.activeProfile.assetUrl);\n      this.track('variant_available');\n    }\n\n    applyVariantFit() {\n      const fit = this.activeProfile?.fit;\n      if (!fit) return;\n      this.frameWidthMm = Number(fit.frameWidthMm) || 0;\n      this.frameWidthEstimated = fit.frameWidthEstimated === true;\n      this.updateCollectionSpecs(fit);\n      const width = this.querySelector('[data-vto-frame-width]');\n      if (width) width.textContent = '\u2014';\n      if (String(this.mode).startsWith('fit-')) {\n        this.cancelPendingOperation();\n        this.stopCamera();\n        this.mode = 'fit-intro';\n        this.resetFitStages();\n      } else this.updateFitAvailability();\n    }\n\n    customPolarisedSelected() {\n      const picker = document.querySelector(`variant-selects[data-section=\"${CSS.escape(this.dataset.sectionId)}\"]`);\n      return Boolean(picker?.querySelector('[data-city-sun-generated-custom-polarised]:checked'));\n    }\n\n    setLaunchVisibility(visible) {\n      [this.openButton, ...this.externalButtons].filter(Boolean).forEach((button) => {\n        button.hidden = !visible;\n      });\n    }\n\n    selectPdpVariant(variantId) {\n      const profile = this.profiles[String(variantId || '')];\n      if (!profile) return;\n      const picker = document.querySelector(`variant-selects[data-section=\"${CSS.escape(this.dataset.sectionId)}\"]`);\n      if (!picker) {\n        this.previewVariant(variantId);\n        return;\n      }\n\n      if (profile.fit && profile.options) {\n        const wrappers = [...picker.querySelectorAll('fieldset[data-optical-option-index], select[data-optical-option-index]')];\n        let target;\n        wrappers.forEach((wrapper) => {\n          const value = profile.options[Number(wrapper.dataset.opticalOptionIndex)];\n          if (value === undefined) return;\n          const label = wrapper.querySelector('[data-selected-swatch-value]');\n          if (label) label.textContent = value;\n          if (wrapper.tagName === 'SELECT') { wrapper.value = value; target = wrapper; }\n          else wrapper.querySelectorAll('input[type=\"radio\"]').forEach((input) => { input.checked = input.value === value; if (input.checked) target = input; });\n        });\n        target?.dispatchEvent(new Event('change', { bubbles: true }));\n        return;\n      }\n      const optionValue = profile.options?.[this.colourOptionIndex] || profile.colour;\n      const wrapper = picker.querySelector(`[data-city-sun-option-index=\"${this.colourOptionIndex}\"]`) || picker.querySelectorAll('.product-form__input')[this.colourOptionIndex];\n      const inputs = wrapper ? [...wrapper.querySelectorAll('input[type=\"radio\"], option')] : [];\n      const matching = inputs.find((input) => input.value === optionValue);\n      if (matching?.tagName === 'OPTION') matching.parentElement.value = optionValue;\n      else if (matching) matching.checked = true;\n      const eventTarget = matching?.tagName === 'OPTION' ? matching.parentElement : matching;\n      if (eventTarget) eventTarget.dispatchEvent(new Event('change', { bubbles: true }));\n      else this.previewVariant(variantId);\n    }\n\n    previewVariant(variantId) {\n      const nextId = String(variantId || '');\n      const nextProfile = this.profiles[nextId];\n      if (!nextProfile) return;\n      this.activeVariantId = nextId;\n      this.activeProfile = nextProfile;\n      this.applyVariantFit();\n      this.updateVariantButtons();\n      this.updateSideView();\n      this.loadOverlay(nextProfile.assetUrl);\n      this.setStatus(this.copy.colourUpdated);\n      this.track('colour_previewed', nextProfile.label);\n    }\n\n    updateVariantButtons() {\n      const buttons = [...this.querySelectorAll('[data-vto-variant-id]')];\n      const availableButtons = buttons.filter((button) => this.profiles[String(button.dataset.vtoVariantId || '')]);\n      if (this.variantSelector) this.variantSelector.hidden = availableButtons.length < 2;\n      if (this.variantSelector) this.variantSelector.dataset.vtoColourCount = String(availableButtons.length);\n      let activeButtonIndex = -1;\n      availableButtons.forEach((button, index) => {\n        const isActive = button.dataset.vtoColour === this.activeProfile?.colour;\n        button.classList.toggle('is-active', isActive);\n        button.setAttribute('aria-pressed', String(isActive));\n        if (isActive) activeButtonIndex = index;\n      });\n      if (availableButtons.length >= 7 && activeButtonIndex >= 6) this.setVariantColoursExpanded(true);\n      else this.updateVariantToggle(availableButtons.length);\n      this.querySelectorAll('[data-vto-colour-name]').forEach((element) => {\n        element.textContent = this.activeProfile?.label || '';\n      });\n      const productThumb = this.querySelector('[data-vto-product-thumb]');\n      if (productThumb) productThumb.src = this.activeProfile?.productImageUrl || this.activeProfile?.assetUrl || '';\n    }\n\n    setVariantColoursExpanded(expanded) {\n      this.variantColoursExpanded = Boolean(expanded);\n      this.variantSelector?.classList.toggle('is-expanded', this.variantColoursExpanded);\n      this.variantSelector?.classList.toggle('is-collapsed', !this.variantColoursExpanded);\n      this.updateVariantToggle(this.querySelectorAll('[data-vto-variant-id]').length);\n    }\n\n    updateVariantToggle(colourCount) {\n      if (!this.variantToggle) return;\n      const canToggle = colourCount >= 7;\n      this.variantToggle.hidden = !canToggle;\n      this.variantToggle.setAttribute('aria-expanded', String(canToggle && this.variantColoursExpanded));\n      const label = this.variantToggle.querySelector('[data-vto-variant-toggle-label]');\n      if (label) label.textContent = this.variantColoursExpanded ? this.copy.showFewerColours : this.copy.showAllColours;\n    }\n\n    updateSideView() {\n      const button = this.querySelector('[data-vto-side-open]');\n      const image = this.querySelector('[data-vto-side-image]');\n      const large = this.querySelector('[data-vto-side-large]');\n      const url = this.activeProfile?.sideImageUrl || '';\n      const fitActive = this.fitPanel && !this.fitPanel.hidden;\n      if (button) button.hidden = !url || fitActive;\n      const sideAlt = url ? String(this.copy.sideViewAlt || '{{ colour }} side view').replace('{{ colour }}', this.activeProfile?.colour || '') : '';\n      if (image) {\n        image.src = url;\n        image.alt = sideAlt;\n        image.style.objectPosition = `${this.activeProfile?.sideImageFocalX || '0%'} 45%`;\n        image.style.transform = `scale(${Number(this.activeProfile?.sideImageScale) || 1.35})`;\n        image.style.transformOrigin = `${this.activeProfile?.sideImageFocalX || '0%'} 45%`;\n      }\n      if (large) {\n        large.src = url;\n        large.alt = sideAlt;\n      }\n    }\n\n    openSideView() {\n      if (!this.activeProfile?.sideImageUrl || !this.sideDialog) return;\n      this.sideDialog.showModal();\n      this.track('side_view_opened');\n    }\n\n    async loadOverlay(url) {\n      if (!url) return;\n      if (this.overlayImage.src === url && this.overlayImage.complete) return;\n      const loadToken = ++this.overlayLoadToken;\n      this.overlayImage = new Image();\n      this.renderStatic();\n      const decodeImage = async (useCors) => {\n        const candidate = new Image();\n        candidate.decoding = 'async';\n        if (useCors) candidate.crossOrigin = 'anonymous';\n        candidate.src = url;\n        await candidate.decode();\n        return candidate;\n      };\n      try {\n        let image;\n        try {\n          // CORS keeps the alpha canvas readable for Shopify CDN and Files URLs.\n          image = await decodeImage(true);\n        } catch (_) {\n          // Preserve display support for any supplier URL that does not allow CORS.\n          image = await decodeImage(false);\n        }\n        if (loadToken !== this.overlayLoadToken || url !== this.activeProfile?.assetUrl) return;\n        const visibleWidthRatio = this.measureVisibleWidthRatio(image, url);\n        if (loadToken !== this.overlayLoadToken || url !== this.activeProfile?.assetUrl) return;\n        this.overlayImage = image;\n        this.overlayVisibleWidthRatio = visibleWidthRatio;\n        this.dataset.vtoOverlayVisibleWidthRatio = visibleWidthRatio.toFixed(4);\n        this.renderStatic();\n      } catch (_) {\n        this.setStatus(this.copy.modelError);\n      }\n    }\n\n    measureVisibleWidthRatio(image, url) {\n      const cached = this.overlayVisibleWidthRatioCache.get(url);\n      if (Number.isFinite(cached)) return cached;\n      const sourceWidth = image.naturalWidth || image.width;\n      const sourceHeight = image.naturalHeight || image.height;\n      if (!sourceWidth || !sourceHeight) return 1;\n      const sampleWidth = Math.min(512, sourceWidth);\n      const sampleHeight = Math.max(1, Math.round(sourceHeight * sampleWidth / sourceWidth));\n      const canvas = document.createElement('canvas');\n      canvas.width = sampleWidth;\n      canvas.height = sampleHeight;\n      const context = canvas.getContext('2d', { willReadFrequently: true });\n      let ratio = 1;\n      try {\n        context.drawImage(image, 0, 0, sampleWidth, sampleHeight);\n        const pixels = context.getImageData(0, 0, sampleWidth, sampleHeight).data;\n        let left = sampleWidth;\n        let right = -1;\n        for (let x = 0; x < sampleWidth; x += 1) {\n          for (let y = 0; y < sampleHeight; y += 1) {\n            if (pixels[(y * sampleWidth + x) * 4 + 3] <= 16) continue;\n            left = Math.min(left, x);\n            right = Math.max(right, x);\n            break;\n          }\n        }\n        if (right >= left) ratio = clamp((right - left + 1) / sampleWidth, 0.5, 1);\n      } catch (_) {}\n      this.overlayVisibleWidthRatioCache.set(url, ratio);\n      return ratio;\n    }\n\n    openCollection(payload, sourceButton, requestedVariantId) {\n      if (!this.collectionMode || !payload?.profiles || !Object.keys(payload.profiles).length) return;\n      this.configureCollectionProduct(payload, requestedVariantId);\n      this.lastFocused = sourceButton;\n      this.open();\n    }\n\n    configureCollectionProduct(payload, requestedVariantId) {\n      this.profiles = payload.profiles || {};\n      this.dataset.productHandle = payload.productHandle || '';\n      this.dataset.productUrl = payload.productUrl || '';\n      this.dataset.productTitle = payload.productTitle || '';\n      this.colourOptionIndex = Number(payload.colourOptionIndex) || 0;\n      this.frameWidthMm = Number(payload.frameWidthMm) || 0;\n      this.frameWidthEstimated = payload.frameWidthEstimated === true;\n      const requestedId = String(requestedVariantId || '');\n      const fallbackId = String(payload.initialVariantId || Object.keys(this.profiles)[0] || '');\n      const nextId = this.profiles[requestedId] ? requestedId : fallbackId;\n\n      const title = this.querySelector('[data-vto-product-title]');\n      if (title) title.textContent = payload.productTitle || '';\n      this.renderCollectionVariantOptions();\n      this.updateCollectionSpecs(payload);\n      this.updateVariant(nextId);\n      this.updateFitAvailability();\n    }\n\n    renderCollectionVariantOptions() {\n      const options = this.querySelector('[data-vto-variant-options]');\n      if (!options) return;\n      options.replaceChildren();\n      const colours = new Set();\n      Object.entries(this.profiles).forEach(([variantId, profile]) => {\n        const colourKey = String(profile.colour || profile.label || '').toLowerCase();\n        if (colours.has(colourKey)) return;\n        colours.add(colourKey);\n        const button = document.createElement('button');\n        button.type = 'button';\n        button.className = 'vto__variant-option';\n        button.dataset.vtoVariantId = variantId;\n        button.dataset.vtoColour = profile.colour || '';\n        button.setAttribute('aria-pressed', 'false');\n        button.setAttribute('aria-label', `Preview ${profile.label || profile.colour || 'frame colour'}`);\n\n        const thumb = document.createElement('span');\n        thumb.className = 'vto__variant-thumb';\n        thumb.setAttribute('aria-hidden', 'true');\n        const image = document.createElement('img');\n        image.src = profile.assetUrl || '';\n        image.alt = '';\n        image.width = 96;\n        image.height = 52;\n        image.loading = 'lazy';\n        thumb.append(image);\n\n        const label = document.createElement('span');\n        label.className = 'vto__variant-label';\n        label.textContent = profile.label || profile.colour || '';\n        button.append(thumb, label);\n        button.addEventListener('click', () => this.previewVariant(variantId));\n        options.append(button);\n      });\n      this.variantColoursExpanded = false;\n      this.variantSelector?.classList.add('is-collapsed');\n      this.variantSelector?.classList.remove('is-expanded');\n    }\n\n    updateCollectionSpecs(payload) {\n      const exactFrameLabel = this.querySelector('[data-vto-frame-width-exact]');\n      const estimatedFrameLabel = this.querySelector('[data-vto-frame-width-estimated]');\n      if (exactFrameLabel) exactFrameLabel.hidden = this.frameWidthEstimated;\n      if (estimatedFrameLabel) estimatedFrameLabel.hidden = !this.frameWidthEstimated;\n      const values = {\n        lens: Number(payload.lensWidthMm) || 0,\n        bridge: Number(payload.bridgeWidthMm) || 0,\n        temple: Number(payload.templeLengthMm) || 0,\n      };\n      Object.entries(values).forEach(([name, value]) => {\n        const row = this.querySelector(`[data-vto-spec=\"${name}\"]`);\n        if (!row) return;\n        row.hidden = value <= 0;\n        const output = row.querySelector('[data-vto-spec-value]');\n        if (output) output.textContent = value > 0 ? `${value} mm` : '';\n      });\n    }\n\n    restoreCollectionSession() {\n      if (this.mode !== 'photo' || !this.photo || !this.photoLandmarks) return false;\n      if (!this.photo.complete || !this.photo.naturalWidth) {\n        this.photo.decode?.().then(() => this.dialog?.open && this.restoreCollectionSession()).catch(() => undefined);\n        return false;\n      }\n      this.setMediaState('active');\n      this.preflight.hidden = true;\n      this.controls.hidden = false;\n      this.resizeCanvas();\n      const tracked = this.updateTransform(this.photoLandmarks, false, this.photo.naturalWidth, this.photo.naturalHeight, true);\n      this.setControlsEnabled(tracked);\n      this.trackingMessage.hidden = tracked;\n      this.setStatus(tracked ? '' : this.copy.faceForward);\n      this.renderStatic();\n      return true;\n    }\n\n    captureCollectionCameraSession() {\n      if (!this.collectionMode || this.mode !== 'camera' || !this.lastCameraLandmarks?.length || this.video.readyState < 2) return false;\n      const width = this.video.videoWidth;\n      const height = this.video.videoHeight;\n      if (!width || !height) return false;\n      const canvas = document.createElement('canvas');\n      canvas.width = width;\n      canvas.height = height;\n      const context = canvas.getContext('2d');\n      context.translate(width, 0);\n      context.scale(-1, 1);\n      context.drawImage(this.video, 0, 0, width, height);\n      this.releasePhoto();\n      this.photo = new Image();\n      this.photo.decoding = 'async';\n      this.photo.src = canvas.toDataURL('image/jpeg', 0.9);\n      this.photoLandmarks = this.lastCameraLandmarks.map((point) => ({ ...point, x: 1 - point.x }));\n      this.mode = 'photo';\n      return true;\n    }\n\n    open() {\n      const selectedVariantId = this.readSelectedVariantId();\n      if (!this.activeProfile || this.activeVariantId !== selectedVariantId) this.updateVariant(selectedVariantId);\n      if (!this.activeProfile || !this.dialog) {\n        this.dataset.vtoOpenState = this.activeProfile ? 'dialog-missing' : 'profile-missing';\n        return;\n      }\n      if (!this.lastFocused) this.lastFocused = document.activeElement;\n      const preservePhoto = this.collectionMode && this.mode === 'photo' && this.photo && this.photoLandmarks;\n      if (!preservePhoto) this.resetSession();\n      try {\n        if (typeof this.dialog.showModal === 'function') this.dialog.showModal();\n        else this.dialog.setAttribute('open', '');\n      } catch (_) {\n        this.dialog.setAttribute('open', '');\n      }\n      this.dataset.vtoOpenState = 'open';\n      if (!preservePhoto) this.setStatus(this.copy.ready);\n      else requestAnimationFrame(() => this.restoreCollectionSession());\n      this.track('opened');\n    }\n\n    close() {\n      this.cancelPendingOperation();\n      this.captureCollectionCameraSession();\n      this.stopCamera();\n      const preservePhoto = this.collectionMode && this.mode === 'photo' && this.photo && this.photoLandmarks;\n      if (!preservePhoto) this.releasePhoto();\n      this.sideDialog?.open && this.sideDialog.close();\n      this.mode = preservePhoto ? 'photo' : null;\n      this.setMediaState('intro');\n      this.resetFitStages();\n      this.preflight.hidden = false;\n      this.controls.hidden = true;\n      this.setControlsEnabled(false);\n      this.loading.hidden = true;\n      this.trackingMessage.hidden = true;\n      const focusTarget = this.lastFocused;\n      requestAnimationFrame(() => focusTarget?.focus?.({ preventScroll: true }));\n      this.lastFocused = null;\n      delete this.dataset.vtoOpenState;\n      this.track('closed');\n    }\n\n    resetSession() {\n      this.cancelPendingOperation();\n      this.stopCamera();\n      this.releasePhoto();\n      this.transform = null;\n      this.manualScale = 1;\n      this.manualOffsetY = 0;\n      this.setMediaState('intro');\n      this.preflight.hidden = false;\n      this.controls.hidden = true;\n      this.setControlsEnabled(false);\n      this.loading.hidden = true;\n      this.trackingMessage.hidden = true;\n      this.setCameraErrorState('');\n      this.switchTab('style', false);\n      this.resetFitStages();\n      this.drawPlaceholder();\n    }\n\n    async startCamera() {\n      if (!this.cameraSupported()) return;\n      this.setCameraErrorState('');\n      const operationToken = ++this.operationToken;\n      this.setLoading(true);\n      try {\n        await this.acquireCamera(operationToken);\n        await this.ensureLandmarker('VIDEO');\n        if (operationToken !== this.operationToken || !this.dialog.open) return this.stopCamera();\n        this.mode = 'camera';\n        this.setMediaState('active');\n        this.preflight.hidden = true;\n        this.controls.hidden = false;\n        this.setControlsEnabled(false);\n        this.setStatus('');\n        this.running = true;\n        this.lastInference = 0;\n        this.lastSeen = 0;\n        this.renderLoop();\n        this.track('camera_started');\n      } catch (error) {\n        if (operationToken !== this.operationToken) return;\n        this.stopCamera();\n        this.reportCameraError(error);\n      } finally {\n        if (operationToken === this.operationToken) this.setLoading(false);\n      }\n    }\n\n    cameraSupported() {\n      if (navigator.mediaDevices?.getUserMedia && window.isSecureContext) return true;\n      this.setCameraErrorState(this.copy.cameraError);\n      this.setStatus('');\n      this.track('error', 'camera_unsupported');\n      return false;\n    }\n\n    async acquireCamera(operationToken) {\n      const constraints = window.CityOpticsPdMeasurement?.frontCameraConstraints?.() || {\n        audio: false,\n        video: { facingMode: { ideal: 'user' }, width: { ideal: 1280 }, height: { ideal: 960 } },\n      };\n      const pendingStream = await navigator.mediaDevices.getUserMedia(constraints);\n      if (operationToken !== this.operationToken || !this.dialog.open) {\n        pendingStream.getTracks().forEach((track) => track.stop());\n        throw new DOMException('Cancelled', 'AbortError');\n      }\n      this.stream = pendingStream;\n      this.video.srcObject = pendingStream;\n      await this.video.play();\n    }\n\n    reportCameraError(error) {\n      if (error?.name === 'AbortError') return;\n      const denied = error?.name === 'NotAllowedError' || error?.name === 'SecurityError';\n      this.setCameraErrorState(denied ? this.copy.permission : this.copy.cameraError);\n      this.setStatus('');\n      this.track('error', denied ? 'permission' : 'camera');\n    }\n\n    async loadPhoto(file) {\n      if (!file) return;\n      if (!file.type?.startsWith('image/') || file.size > MAX_PHOTO_BYTES) {\n        this.setStatus(this.copy.photoError);\n        this.fileInput.value = '';\n        return;\n      }\n      this.stopCamera();\n      this.setCameraErrorState('');\n      const operationToken = ++this.operationToken;\n      this.setLoading(true);\n      try {\n        await this.ensureLandmarker('IMAGE');\n        if (operationToken !== this.operationToken || !this.dialog.open) return;\n        this.releasePhoto();\n        this.photoUrl = URL.createObjectURL(file);\n        this.photo = new Image();\n        this.photo.decoding = 'async';\n        this.photo.src = this.photoUrl;\n        await this.photo.decode();\n        if (operationToken !== this.operationToken || !this.dialog.open) return;\n        const landmarks = this.landmarker.detect(this.photo)?.faceLandmarks?.[0];\n        this.photoLandmarks = landmarks || null;\n        this.mode = 'photo';\n        this.setMediaState('active');\n        this.preflight.hidden = true;\n        this.controls.hidden = false;\n        this.transform = null;\n        this.resizeCanvas();\n        const tracked = this.updateTransform(landmarks, false, this.photo.naturalWidth, this.photo.naturalHeight, true);\n        this.renderStatic();\n        this.setControlsEnabled(tracked);\n        this.setStatus(tracked ? '' : this.copy.faceForward);\n        this.trackingMessage.hidden = tracked;\n        this.track('photo_used');\n      } catch (_) {\n        this.releasePhoto();\n        if (operationToken === this.operationToken) this.setStatus(this.copy.photoError);\n      } finally {\n        this.fileInput.value = '';\n        if (operationToken === this.operationToken) this.setLoading(false);\n      }\n    }\n\n    ensureLandmarker(mode) {\n      const transition = async () => {\n        if (this.landmarker) {\n          if (this.landmarkerMode !== mode) {\n            await this.landmarker.setOptions({ runningMode: mode });\n            this.landmarkerMode = mode;\n          }\n          return this.landmarker;\n        }\n        const vision = await import(this.dataset.runtimeUrl);\n        const fileset = await vision.FilesetResolver.forVisionTasks(this.dataset.wasmUrl);\n        this.landmarker = await vision.FaceLandmarker.createFromOptions(fileset, {\n          baseOptions: { modelAssetPath: this.dataset.modelUrl, delegate: 'CPU' },\n          runningMode: mode,\n          numFaces: 1,\n          minFaceDetectionConfidence: 0.65,\n          minFacePresenceConfidence: 0.65,\n          minTrackingConfidence: 0.65,\n          outputFacialBlendshapes: false,\n          outputFacialTransformationMatrixes: false,\n        });\n        this.landmarkerMode = mode;\n        return this.landmarker;\n      };\n      const queued = this.landmarkerQueue.catch(() => undefined).then(transition);\n      this.landmarkerQueue = queued.catch(() => undefined);\n      return queued;\n    }\n\n    renderLoop() {\n      if (!this.running || this.mode !== 'camera') return;\n      this.resizeCanvas();\n      this.drawSource(this.video, true);\n      const now = performance.now();\n      if (this.video.readyState >= 2 && now - this.lastInference >= FACE_INFERENCE_INTERVAL) {\n        this.lastInference = now;\n        try {\n          const landmarks = this.landmarker.detectForVideo(this.video, now)?.faceLandmarks?.[0];\n          const tracked = this.updateTransform(landmarks, true, this.video.videoWidth, this.video.videoHeight, false);\n          if (landmarks && tracked) {\n            this.lastSeen = now;\n            this.lastCameraLandmarks = landmarks.map((point) => ({ ...point }));\n          }\n          this.trackingMessage.hidden = Boolean(landmarks && tracked);\n          this.setControlsEnabled(Boolean(landmarks && tracked));\n        } catch (_) {\n          this.trackingMessage.hidden = false;\n          this.setControlsEnabled(false);\n        }\n      }\n      const age = now - this.lastSeen;\n      this.drawOverlay(age <= 250 ? 1 : clamp(1 - (age - 250) / 500, 0, 1));\n      this.animationFrame = requestAnimationFrame(() => this.renderLoop());\n    }\n\n    updateTransform(landmarks, mirror, sourceWidth, sourceHeight, immediate) {\n      if (!landmarks?.length || !sourceWidth || !sourceHeight) return false;\n      const leftIris = this.landmarkPoint(landmarks[468], mirror, sourceWidth, sourceHeight);\n      const rightIris = this.landmarkPoint(landmarks[473], mirror, sourceWidth, sourceHeight);\n      const nose = this.landmarkPoint(landmarks[1], mirror, sourceWidth, sourceHeight);\n      if (!leftIris || !rightIris || !nose) return false;\n      const eyes = [leftIris, rightIris].sort((a, b) => a.x - b.x);\n      const eyeMid = averagePoint(eyes);\n      const eyeDistance = Math.hypot(eyes[1].x - eyes[0].x, eyes[1].y - eyes[0].y);\n      if (eyeDistance < this.canvas.width * 0.08 || Math.abs(nose.x - eyeMid.x) / eyeDistance > 0.34) return false;\n      const faceWidth = this.visualFaceWidth(landmarks, mirror, sourceWidth, sourceHeight, eyeDistance);\n      const target = { x: eyeMid.x, y: eyeMid.y, eyeDistance, faceWidth, angle: Math.atan2(eyes[1].y - eyes[0].y, eyes[1].x - eyes[0].x) };\n      if (!this.transform || immediate) this.transform = target;\n      else {\n        this.transform.x += (target.x - this.transform.x) * 0.34;\n        this.transform.y += (target.y - this.transform.y) * 0.34;\n        this.transform.eyeDistance += (target.eyeDistance - this.transform.eyeDistance) * 0.24;\n        if (Number.isFinite(target.faceWidth)) {\n          if (!Number.isFinite(this.transform.faceWidth)) this.transform.faceWidth = target.faceWidth;\n          else this.transform.faceWidth += (target.faceWidth - this.transform.faceWidth) * 0.16;\n        }\n        const angleDelta = Math.atan2(Math.sin(target.angle - this.transform.angle), Math.cos(target.angle - this.transform.angle));\n        this.transform.angle += angleDelta * 0.22;\n      }\n      return true;\n    }\n\n    visualFaceWidth(landmarks, mirror, sourceWidth, sourceHeight, eyeDistance) {\n      const widths = [[127, 356], [234, 454]].map(([leftIndex, rightIndex]) => {\n        const left = this.landmarkPoint(landmarks[leftIndex], mirror, sourceWidth, sourceHeight);\n        const right = this.landmarkPoint(landmarks[rightIndex], mirror, sourceWidth, sourceHeight);\n        return left && right ? Math.hypot(right.x - left.x, right.y - left.y) : NaN;\n      });\n      // The two outline pairs sit at slightly different depths on some faces.\n      // Use the wider valid span so hairline/cheek perspective does not make\n      // shield and oversized frames initialise too narrowly.\n      const faceWidth = Math.max(...widths.filter(Number.isFinite));\n      const ratio = faceWidth / Math.max(eyeDistance, 1);\n      return Number.isFinite(faceWidth) && ratio >= 1.8 && ratio <= 3.4 ? faceWidth : NaN;\n    }\n\n    landmarkPoint(landmark, mirror, sourceWidth, sourceHeight) {\n      if (!landmark) return null;\n      const geometry = this.coverGeometry(sourceWidth, sourceHeight);\n      return {\n        x: geometry.offsetX + (mirror ? 1 - landmark.x : landmark.x) * sourceWidth * geometry.scale,\n        y: geometry.offsetY + landmark.y * sourceHeight * geometry.scale,\n      };\n    }\n\n    drawSource(source, mirror) {\n      const width = source.videoWidth || source.naturalWidth;\n      const height = source.videoHeight || source.naturalHeight;\n      if (!width || !height) return;\n      const geometry = this.coverGeometry(width, height);\n      this.context.save();\n      this.context.fillStyle = '#151719';\n      this.context.fillRect(0, 0, this.canvas.width, this.canvas.height);\n      if (mirror) {\n        this.context.translate(this.canvas.width, 0);\n        this.context.scale(-1, 1);\n        this.context.drawImage(source, this.canvas.width - geometry.offsetX - width * geometry.scale, geometry.offsetY, width * geometry.scale, height * geometry.scale);\n      } else this.context.drawImage(source, geometry.offsetX, geometry.offsetY, width * geometry.scale, height * geometry.scale);\n      this.context.restore();\n    }\n\n    coverGeometry(sourceWidth, sourceHeight) {\n      const scale = Math.max(this.canvas.width / sourceWidth, this.canvas.height / sourceHeight);\n      return { scale, offsetX: (this.canvas.width - sourceWidth * scale) / 2, offsetY: (this.canvas.height - sourceHeight * scale) / 2 };\n    }\n\n    drawOverlay(opacity = 1) {\n      if (!this.transform || !this.activeProfile || !this.overlayImage.complete || opacity <= 0) return;\n      const profile = this.activeProfile;\n      const leftLens = this.normaliseAnchor(profile.leftLens, [0.265, 0.405]);\n      const rightLens = this.normaliseAnchor(profile.rightLens, [0.735, 0.405]);\n      const imageWidth = this.overlayImage.naturalWidth || Number(profile.imageWidth) || 1;\n      const imageHeight = this.overlayImage.naturalHeight || Number(profile.imageHeight) || 1;\n      const anchorDistance = Math.max(0.1, Math.abs(rightLens[0] - leftLens[0]));\n      const calibratedScale = (this.transform.eyeDistance / (anchorDistance * imageWidth)) * Number(profile.scale || 1);\n      const visibleFrameWidth = calibratedScale * imageWidth * this.overlayVisibleWidthRatio;\n      const autoScale = this.adaptiveScaleMultiplier(visibleFrameWidth);\n      const scale = calibratedScale * autoScale * this.manualScale;\n      const anchorX = ((leftLens[0] + rightLens[0]) / 2) * imageWidth;\n      const anchorY = ((leftLens[1] + rightLens[1]) / 2) * imageHeight;\n      const offsetX = Number(profile.offsetX || 0) * this.transform.eyeDistance;\n      const offsetY = Number(profile.offsetY || 0) * this.transform.eyeDistance + this.manualOffsetY * this.pixelRatio();\n      this.context.save();\n      this.context.globalAlpha = opacity;\n      this.context.translate(this.transform.x + offsetX, this.transform.y + offsetY);\n      this.context.rotate(this.transform.angle);\n      if (this.mode === 'camera') this.context.scale(-1, 1);\n      this.context.drawImage(this.overlayImage, -anchorX * scale, -anchorY * scale, imageWidth * scale, imageHeight * scale);\n      this.context.restore();\n    }\n\n    adaptiveScaleMultiplier(calibratedFrameWidth) {\n      if (!Number.isFinite(this.transform?.faceWidth) || !Number.isFinite(calibratedFrameWidth) || calibratedFrameWidth <= 0) return 1;\n      const desiredFrameWidth = this.transform.faceWidth * AUTO_FRAME_TO_FACE_RATIO;\n      const fullCorrection = desiredFrameWidth / calibratedFrameWidth;\n      return clamp(1 + (fullCorrection - 1) * AUTO_FACE_SCALE_BLEND, AUTO_FACE_SCALE_MIN, AUTO_FACE_SCALE_MAX);\n    }\n\n    normaliseAnchor(value, fallback) {\n      if (Array.isArray(value) && value.length >= 2) return value.map(Number);\n      if (typeof value === 'string') {\n        try {\n          const parsed = JSON.parse(value);\n          if (Array.isArray(parsed) && parsed.length >= 2) return parsed.map(Number);\n        } catch (_) {}\n      }\n      return fallback;\n    }\n\n    resizeCanvas() {\n      const rect = this.canvas.getBoundingClientRect();\n      const ratio = this.pixelRatio();\n      const width = Math.max(1, Math.round(rect.width * ratio));\n      const height = Math.max(1, Math.round(rect.height * ratio));\n      if (this.canvas.width !== width || this.canvas.height !== height) {\n        this.canvas.width = width;\n        this.canvas.height = height;\n      }\n    }\n\n    pixelRatio() {\n      return Math.min(window.devicePixelRatio || 1, 2);\n    }\n\n    renderStatic() {\n      if (!this.dialog?.open || this.running) return;\n      this.resizeCanvas();\n      if (this.mode === 'photo' && this.photo) {\n        this.drawSource(this.photo, false);\n        this.drawOverlay(1);\n      } else if (this.mode === 'fit-manual' && this.fitFallbackCanvas.width) this.drawFitFallbackFrame();\n      else this.drawPlaceholder();\n    }\n\n    setMediaState(state) {\n      this.dataset.vtoMediaState = state;\n      const activePrivacy = this.querySelector('[data-vto-active-privacy]');\n      if (activePrivacy) activePrivacy.hidden = state !== 'active';\n    }\n\n    drawPlaceholder() {\n      this.resizeCanvas();\n      const gradient = this.context.createRadialGradient(this.canvas.width / 2, this.canvas.height * 0.35, 0, this.canvas.width / 2, this.canvas.height / 2, this.canvas.width * 0.7);\n      gradient.addColorStop(0, '#39414b');\n      gradient.addColorStop(1, '#17191c');\n      this.context.fillStyle = gradient;\n      this.context.fillRect(0, 0, this.canvas.width, this.canvas.height);\n    }\n\n    adjustScale(delta) {\n      this.manualScale = clamp(this.manualScale + delta, 0.65, 1.75);\n      this.renderStatic();\n      this.track('size_adjusted');\n    }\n\n    adjustPosition(delta) {\n      this.manualOffsetY = clamp(this.manualOffsetY + delta, -30, 30);\n      this.renderStatic();\n      this.track('position_adjusted');\n    }\n\n    resetAdjustments() {\n      this.manualScale = 1;\n      this.manualOffsetY = 0;\n      this.renderStatic();\n      this.track('reset');\n    }\n\n    switchTab(tab, track = true) {\n      this.cancelPendingOperation();\n      const fit = tab === 'fit';\n      this.querySelectorAll('[data-vto-tab]').forEach((button) => {\n        const selected = button.dataset.vtoTab === (fit ? 'fit' : 'style');\n        button.setAttribute('aria-selected', String(selected));\n        button.tabIndex = selected ? 0 : -1;\n      });\n      this.fitPanel.hidden = !fit;\n      this.stylePanel.hidden = fit;\n      if (fit) {\n        this.stopCamera();\n        this.releasePhoto();\n        this.mode = 'fit-intro';\n        this.resetFitStages();\n        this.setMediaState('fit');\n        this.preflight.hidden = true;\n        this.controls.hidden = true;\n        this.trackingMessage.hidden = true;\n        this.fitOverlay.hidden = true;\n        if (this.fitManualOverlay) this.fitManualOverlay.hidden = true;\n        this.updateSideView();\n        this.drawPlaceholder();\n      } else if (this.mode?.startsWith('fit')) {\n        this.stopCamera();\n        this.mode = null;\n        this.setMediaState('intro');\n        this.preflight.hidden = false;\n        this.fitOverlay.hidden = true;\n        if (this.fitManualOverlay) this.fitManualOverlay.hidden = true;\n        this.updateSideView();\n      }\n      if (track) this.track('mode_changed', fit ? 'fit' : 'style');\n    }\n\n    handleTabKeydown(event) {\n      if (!['ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(event.key)) return;\n      const tabs = [...this.querySelectorAll('[data-vto-tab]')];\n      const current = tabs.indexOf(event.currentTarget);\n      if (current < 0) return;\n      event.preventDefault();\n      const next = event.key === 'Home' ? 0 : event.key === 'End' ? tabs.length - 1 : (current + (event.key === 'ArrowRight' ? 1 : -1) + tabs.length) % tabs.length;\n      tabs[next]?.focus();\n      this.switchTab(tabs[next]?.dataset.vtoTab);\n    }\n\n    updateFitAvailability() {\n      const unavailable = this.querySelector('[data-vto-fit-unavailable]');\n      const start = this.querySelector('[data-vto-fit-start]');\n      if (unavailable) unavailable.hidden = this.frameWidthMm > 0;\n      if (start) start.disabled = this.frameWidthMm <= 0 || this.fitStartPending;\n    }\n\n    resetFitStages() {\n      this.fitSamples = [];\n      this.fitStableFrames = 0;\n      this.fitLastCorners = null;\n      this.fitFallbackCandidate = null;\n      this.fitManualPoints = [];\n      this.fitManualInitialPoints = [];\n      this.fitManualActiveCorner = -1;\n      this.querySelectorAll('[data-vto-fit-stage]').forEach((stage) => {\n        stage.hidden = stage.dataset.vtoFitStage !== 'intro';\n      });\n      const meter = this.querySelector('[data-vto-fit-meter]');\n      if (meter) meter.style.width = '0%';\n      this.fitOverlay.hidden = true;\n      if (this.fitManualOverlay) this.fitManualOverlay.hidden = true;\n      if (this.fitManualMagnifier) this.fitManualMagnifier.hidden = true;\n      this.setFitCardGuideStatus('searching');\n      this.setFitManualError('');\n      this.updateFitAvailability();\n    }\n\n    async startFitCheck() {\n      if (this.frameWidthMm <= 0 || this.fitStartPending || !this.cameraSupported()) return;\n      this.fitStartPending = true;\n      this.updateFitAvailability();\n      const operationToken = ++this.operationToken;\n      this.setFitStage('camera');\n      this.fitOverlay.hidden = false;\n      this.setFitCardGuideStatus('searching');\n      this.setFitStatus(this.copy.fitPosition);\n      this.setLoading(true);\n      try {\n        await Promise.all([this.ensureFitApi(), this.ensureLandmarker('VIDEO')]);\n        if (operationToken !== this.operationToken || this.fitPanel?.hidden || !this.dialog.open) return;\n        await this.acquireCamera(operationToken);\n        if (operationToken !== this.operationToken || !this.dialog.open) return this.stopCamera();\n        this.mode = 'fit-camera';\n        this.running = true;\n        this.fitSamples = [];\n        this.fitStableFrames = 0;\n        this.fitLastCorners = null;\n        this.fitFallbackCandidate = null;\n        this.fitStartedAt = performance.now();\n        this.lastInference = 0;\n        this.renderFitLoop();\n        this.track('fit_started');\n      } catch (error) {\n        if (operationToken !== this.operationToken) return;\n        this.stopCamera();\n        this.reportCameraError(error);\n        this.finishFitCheck('unable');\n      } finally {\n        this.fitStartPending = false;\n        this.updateFitAvailability();\n        if (operationToken === this.operationToken) this.setLoading(false);\n      }\n    }\n\n    ensureFitApi() {\n      if (window.CityOpticsPdMeasurement?.detectCardQuadrilateral) return Promise.resolve(window.CityOpticsPdMeasurement);\n      if (this.fitApiPromise) return this.fitApiPromise;\n      this.fitApiPromise = new Promise((resolve, reject) => {\n        const existing = document.querySelector(`script[src=\"${CSS.escape(this.dataset.pdScriptUrl)}\"]`);\n        const script = existing || document.createElement('script');\n        const onLoad = () => window.CityOpticsPdMeasurement ? resolve(window.CityOpticsPdMeasurement) : reject(new Error('fit-api'));\n        const onError = () => reject(new Error('fit-api'));\n        script.addEventListener('load', onLoad, { once: true });\n        script.addEventListener('error', onError, { once: true });\n        if (!existing) {\n          script.src = this.dataset.pdScriptUrl;\n          script.async = true;\n          document.head.append(script);\n        }\n      });\n      return this.fitApiPromise;\n    }\n\n    renderFitLoop() {\n      if (!this.running || this.mode !== 'fit-camera') return;\n      this.resizeCanvas();\n      this.drawSource(this.video, true);\n      const now = performance.now();\n      if (this.video.readyState >= 2 && now - this.lastInference >= FIT_INFERENCE_INTERVAL) {\n        this.lastInference = now;\n        this.processFitFrame(now);\n      }\n      const elapsed = now - this.fitStartedAt;\n      if (elapsed >= FIT_MANUAL_FALLBACK_MS && this.fitFallbackCandidate) return this.startFitManualFallback();\n      if (elapsed > FIT_TIMEOUT_MS) {\n        return this.finishFitCheck('unable');\n      }\n      this.animationFrame = requestAnimationFrame(() => this.renderFitLoop());\n    }\n\n    processFitFrame(now) {\n      try {\n        const api = window.CityOpticsPdMeasurement;\n        const landmarks = this.landmarker.detectForVideo(this.video, now)?.faceLandmarks?.[0];\n        const automaticPoseOkay = this.fitFacePoseOkay(landmarks);\n        if (!this.fitFallbackFacePoseOkay(landmarks)) {\n          this.fitStableFrames = 0;\n          this.fitSamples = [];\n          this.setFitCardGuideStatus('searching');\n          this.setFitStatus(this.copy.fitPosition);\n          return;\n        }\n        const sourceWidth = this.video.videoWidth;\n        const sourceHeight = this.video.videoHeight;\n        const viewer = this.querySelector('[data-vto-viewer]');\n        const viewerRect = viewer?.getBoundingClientRect();\n        const viewerAspect = viewerRect?.width && viewerRect?.height ? viewerRect.width / viewerRect.height : 4 / 3;\n        const detectionWidth = FIT_CANVAS_WIDTH;\n        const detectionHeight = clamp(Math.round(detectionWidth / viewerAspect), 180, 520);\n        if (this.fitDetectionCanvas.height !== detectionHeight) this.fitDetectionCanvas.height = detectionHeight;\n        const crop = api.coverCrop(sourceWidth, sourceHeight, detectionWidth / detectionHeight);\n        this.fitDetectionContext.drawImage(this.video, crop.x, crop.y, crop.width, crop.height, 0, 0, detectionWidth, detectionHeight);\n        const imageData = this.fitDetectionContext.getImageData(0, 0, detectionWidth, detectionHeight);\n        const detection = api.detectCardQuadrilateral(imageData, { guide: this.fitCardGuide(viewerRect) });\n        const geometry = detection?.detected ? api.cardGeometry(detection.corners) : null;\n        this.setFitCardGuideStatus(geometry?.valid ? 'detected' : 'searching');\n        this.captureFitFallback(landmarks, detection?.corners, geometry, crop, sourceWidth, sourceHeight, detectionWidth, detectionHeight, api);\n        if (!automaticPoseOkay) {\n          this.fitStableFrames = 0;\n          this.fitLastCorners = null;\n          this.fitSamples = [];\n          this.setFitStatus(this.copy.fitPosition);\n          return;\n        }\n        if (!geometry?.valid) {\n          this.fitStableFrames = 0;\n          this.fitLastCorners = null;\n          this.fitSamples = [];\n          this.setFitStatus(this.copy.fitCard);\n          return;\n        }\n        const movement = this.fitLastCorners ? api.meanCornerMovement(detection.corners, this.fitLastCorners, detectionWidth, detectionHeight) : Infinity;\n        this.fitLastCorners = detection.corners.map((point) => ({ x: point.x, y: point.y }));\n        this.fitStableFrames = movement <= 0.018 ? this.fitStableFrames + 1 : 0;\n        if (movement > 0.018) this.fitSamples = [];\n        if (this.fitStableFrames < 3) {\n          this.setFitStatus(this.copy.fitHold);\n          return;\n        }\n        const faceWidth = this.measureFaceWidth(landmarks, geometry, crop, sourceWidth, sourceHeight, detectionWidth, detectionHeight, api);\n        const minimum = Number(this.fitConfig.minimumWidthMm) || 105;\n        const maximum = Number(this.fitConfig.maximumWidthMm) || 175;\n        if (!Number.isFinite(faceWidth) || faceWidth < minimum || faceWidth > maximum) {\n          this.fitSamples = [];\n          this.setFitStatus(this.copy.fitPosition);\n          return;\n        }\n        const lastSample = this.fitSamples.at(-1);\n        if (!Number.isFinite(lastSample) || Math.abs(lastSample - faceWidth) <= 5) this.fitSamples.push(faceWidth);\n        else this.fitSamples = [];\n        const minimumSamples = Number(this.fitConfig.minimumSamples) || 8;\n        const progress = clamp(this.fitSamples.length / minimumSamples, 0, 1);\n        const meter = this.querySelector('[data-vto-fit-meter]');\n        if (meter) meter.style.width = `${Math.round(progress * 100)}%`;\n        this.setFitStatus(this.copy.fitHold);\n        if (this.fitSamples.length >= minimumSamples) {\n          const spread = Math.max(...this.fitSamples) - Math.min(...this.fitSamples);\n          if (spread <= (Number(this.fitConfig.maxSpreadMm) || 3)) this.finishFitCheck('measured', median(this.fitSamples));\n          else this.fitSamples = this.fitSamples.slice(-3);\n        }\n      } catch (_) {\n        this.fitSamples = [];\n        this.fitStableFrames = 0;\n        this.fitLastCorners = null;\n        this.setFitCardGuideStatus('searching');\n        this.setFitStatus(this.copy.fitUnable);\n      }\n    }\n\n    fitCardGuide(viewerRect) {\n      const card = this.querySelector('.vto__fit-card-guide');\n      const cardRect = card?.getBoundingClientRect();\n      if (!viewerRect?.width || !viewerRect?.height || !cardRect?.width || !cardRect?.height) return FIT_CARD_GUIDE;\n      return {\n        left: clamp((cardRect.left - viewerRect.left) / viewerRect.width, 0, 1),\n        right: clamp((cardRect.right - viewerRect.left) / viewerRect.width, 0, 1),\n        top: clamp((cardRect.top - viewerRect.top) / viewerRect.height, 0, 1),\n        bottom: clamp((cardRect.bottom - viewerRect.top) / viewerRect.height, 0, 1),\n      };\n    }\n\n    fitFacePoseOkay(landmarks) {\n      if (!landmarks?.length) return false;\n      const left = landmarks[33];\n      const right = landmarks[263];\n      const nose = landmarks[1];\n      if (!left || !right || !nose) return false;\n      const span = Math.hypot(right.x - left.x, right.y - left.y);\n      if (span < 0.12) return false;\n      const midX = (left.x + right.x) / 2;\n      const yaw = Math.abs(nose.x - midX) / span;\n      const roll = Math.abs(Math.atan2(right.y - left.y, right.x - left.x) * 180 / Math.PI);\n      return yaw <= 0.11 && roll <= 6;\n    }\n\n    fitFallbackFacePoseOkay(landmarks) {\n      if (!landmarks?.length) return false;\n      const left = landmarks[33];\n      const right = landmarks[263];\n      const nose = landmarks[1];\n      if (!left || !right || !nose) return false;\n      const span = Math.hypot(right.x - left.x, right.y - left.y);\n      if (span < 0.1) return false;\n      const midX = (left.x + right.x) / 2;\n      const yaw = Math.abs(nose.x - midX) / span;\n      const roll = Math.abs(Math.atan2(right.y - left.y, right.x - left.x) * 180 / Math.PI);\n      return yaw <= 0.18 && roll <= 10;\n    }\n\n    measureFaceWidth(landmarks, geometry, crop, sourceWidth, sourceHeight, detectionWidth, detectionHeight, api, coordinateScale = { x: 1, y: 1 }) {\n      const toDetectionPoint = (landmark) => ({\n        x: ((landmark.x * sourceWidth - crop.x) / crop.width) * detectionWidth * coordinateScale.x,\n        y: ((landmark.y * sourceHeight - crop.y) / crop.height) * detectionHeight * coordinateScale.y,\n      });\n      const pairWidths = [[127, 356], [234, 454]].map(([leftIndex, rightIndex]) => {\n        const left = api.projectPoint(toDetectionPoint(landmarks[leftIndex]), geometry.transform);\n        const right = api.projectPoint(toDetectionPoint(landmarks[rightIndex]), geometry.transform);\n        return left && right ? Math.abs(right.x - left.x) : NaN;\n      });\n      return median(pairWidths);\n    }\n\n    captureFitFallback(landmarks, corners, geometry, crop, sourceWidth, sourceHeight, detectionWidth, detectionHeight, api) {\n      if (!this.fitFallbackFacePoseOkay(landmarks) || !this.canvas.width || !this.canvas.height) return;\n      if (this.fitFallbackCandidate?.cardLocked && !geometry?.valid) return;\n      this.fitFallbackCanvas.width = this.canvas.width;\n      this.fitFallbackCanvas.height = this.canvas.height;\n      this.fitFallbackCanvas.getContext('2d').drawImage(this.canvas, 0, 0);\n      const usableCorners = Array.isArray(corners) && corners.length === 4 && corners.every((point) => Number.isFinite(point?.x) && Number.isFinite(point?.y));\n      this.fitFallbackCandidate = {\n        landmarks: landmarks.map((point) => ({ x: point.x, y: point.y, z: point.z })),\n        corners: usableCorners ? api.orderCorners(corners).map((point) => ({ x: point.x, y: point.y })) : null,\n        cardLocked: Boolean(geometry?.valid),\n        crop: { x: crop.x, y: crop.y, width: crop.width, height: crop.height },\n        sourceWidth,\n        sourceHeight,\n        detectionWidth,\n        detectionHeight,\n      };\n    }\n\n    drawFitFallbackFrame() {\n      if (!this.fitFallbackCanvas.width || !this.fitFallbackCanvas.height) return;\n      this.context.drawImage(this.fitFallbackCanvas, 0, 0, this.canvas.width, this.canvas.height);\n    }\n\n    startFitManualFallback() {\n      const candidate = this.fitFallbackCandidate;\n      const api = window.CityOpticsPdMeasurement;\n      if (!candidate || !api?.cardGeometry) return false;\n      this.running = false;\n      cancelAnimationFrame(this.animationFrame);\n      this.animationFrame = 0;\n      this.stopCamera();\n      this.mode = 'fit-manual';\n      this.fitOverlay.hidden = true;\n      if (this.fitManualOverlay) this.fitManualOverlay.hidden = false;\n      if (this.fitManualMagnifier) this.fitManualMagnifier.hidden = true;\n      const guide = this.fitCardGuide(this.querySelector('[data-vto-viewer]')?.getBoundingClientRect());\n      const seed = candidate.cardLocked && candidate.corners?.length === 4\n        ? candidate.corners.map((point) => ({ x: 1 - point.x / candidate.detectionWidth, y: point.y / candidate.detectionHeight }))\n        : [\n          { x: guide.left, y: guide.top },\n          { x: guide.right, y: guide.top },\n          { x: guide.right, y: guide.bottom },\n          { x: guide.left, y: guide.bottom },\n        ];\n      this.fitManualPoints = api.orderCorners(seed).map((point) => ({ x: clamp(point.x, 0.02, 0.98), y: clamp(point.y, 0.02, 0.98) }));\n      this.fitManualInitialPoints = this.fitManualPoints.map((point) => ({ ...point }));\n      this.resizeCanvas();\n      this.drawFitFallbackFrame();\n      this.updateFitManualOverlay();\n      this.setFitManualError('');\n      this.updateFitManualConfirm();\n      this.setFitStage('manual');\n      this.querySelector('[data-vto-fit-corner=\"0\"]')?.focus({ preventScroll: true });\n      this.track('fit_manual_fallback_automatic');\n      return true;\n    }\n\n    restartFitCheck() {\n      this.cancelPendingOperation();\n      this.stopCamera();\n      this.mode = 'fit-intro';\n      this.resetFitStages();\n      this.startFitCheck();\n    }\n\n    fitManualPointFromEvent(event) {\n      const rect = this.fitManualOverlay?.getBoundingClientRect();\n      if (!rect?.width || !rect?.height) return null;\n      return {\n        x: clamp((event.clientX - rect.left) / rect.width, 0.02, 0.98),\n        y: clamp((event.clientY - rect.top) / rect.height, 0.02, 0.98),\n      };\n    }\n\n    constrainFitManualPoint(index, point) {\n      const margin = 0.02;\n      const [topLeft, topRight, bottomRight, bottomLeft] = this.fitManualPoints;\n      const next = { x: clamp(point.x, margin, 1 - margin), y: clamp(point.y, margin, 1 - margin) };\n      if (index === 0 && topRight && bottomLeft) {\n        next.x = Math.min(next.x, topRight.x - margin);\n        next.y = Math.min(next.y, bottomLeft.y - margin);\n      } else if (index === 1 && topLeft && bottomRight) {\n        next.x = Math.max(next.x, topLeft.x + margin);\n        next.y = Math.min(next.y, bottomRight.y - margin);\n      } else if (index === 2 && topRight && bottomLeft) {\n        next.x = Math.max(next.x, bottomLeft.x + margin);\n        next.y = Math.max(next.y, topRight.y + margin);\n      } else if (index === 3 && topLeft && bottomRight) {\n        next.x = Math.min(next.x, bottomRight.x - margin);\n        next.y = Math.max(next.y, topLeft.y + margin);\n      }\n      return next;\n    }\n\n    startFitManualPointer(event) {\n      if (this.mode !== 'fit-manual') return;\n      this.fitManualActiveCorner = Number(event.currentTarget.dataset.vtoFitCorner);\n      event.currentTarget.setPointerCapture?.(event.pointerId);\n      event.preventDefault();\n      event.stopPropagation();\n      window.getSelection?.()?.removeAllRanges();\n      this.updateFitManualPoint(this.fitManualPointFromEvent(event), true);\n    }\n\n    moveFitManualPointer(event) {\n      if (this.mode !== 'fit-manual' || this.fitManualActiveCorner < 0) return;\n      event.preventDefault();\n      this.updateFitManualPoint(this.fitManualPointFromEvent(event), true);\n    }\n\n    endFitManualPointer() {\n      this.fitManualActiveCorner = -1;\n      if (this.fitManualMagnifier) this.fitManualMagnifier.hidden = true;\n    }\n\n    moveFitManualKeyboard(event) {\n      if (this.mode !== 'fit-manual') return;\n      const movement = event.shiftKey ? 0.02 : 0.006;\n      const directions = { ArrowLeft: [-movement, 0], ArrowRight: [movement, 0], ArrowUp: [0, -movement], ArrowDown: [0, movement] };\n      const direction = directions[event.key];\n      if (!direction) return;\n      event.preventDefault();\n      const index = Number(event.currentTarget.dataset.vtoFitCorner);\n      const point = this.fitManualPoints[index];\n      this.fitManualActiveCorner = index;\n      this.updateFitManualPoint({ x: point.x + direction[0], y: point.y + direction[1] });\n      this.fitManualActiveCorner = -1;\n    }\n\n    updateFitManualPoint(point, magnify = false) {\n      if (!point || this.fitManualActiveCorner < 0) return;\n      this.fitManualPoints[this.fitManualActiveCorner] = this.constrainFitManualPoint(this.fitManualActiveCorner, point);\n      this.setFitManualError('');\n      this.updateFitManualOverlay();\n      if (magnify) this.drawFitManualMagnifier(this.fitManualPoints[this.fitManualActiveCorner]);\n      this.updateFitManualConfirm();\n    }\n\n    updateFitManualOverlay() {\n      const polygon = this.querySelector('[data-vto-fit-manual-polygon]');\n      if (polygon) polygon.setAttribute('points', this.fitManualPoints.map((point) => `${point.x * 100},${point.y * 100}`).join(' '));\n      this.querySelectorAll('[data-vto-fit-corner]').forEach((handle, index) => {\n        const point = this.fitManualPoints[index];\n        handle.hidden = !point;\n        if (!point) return;\n        handle.style.left = `${point.x * 100}%`;\n        handle.style.top = `${point.y * 100}%`;\n      });\n    }\n\n    setFitManualError(message) {\n      const error = this.querySelector('[data-vto-fit-manual-error]');\n      if (!error) return;\n      error.textContent = message || '';\n      error.classList.toggle('is-error', Boolean(message));\n    }\n\n    updateFitManualConfirm() {\n      const confirm = this.querySelector('[data-vto-fit-manual-confirm]');\n      const geometry = this.fitManualGeometry();\n      if (confirm) confirm.disabled = !geometry?.valid;\n      this.setFitManualProgress(geometry?.valid ? this.copy.fitManualReady : this.copy.fitManualProgress);\n    }\n\n    fitManualGeometry() {\n      const api = window.CityOpticsPdMeasurement;\n      const candidate = this.fitFallbackCandidate;\n      if (!api?.cardGeometry || !candidate || this.fitManualPoints.length !== 4) return null;\n      const width = this.fitFallbackCanvas.width || this.canvas.width || candidate.detectionWidth;\n      const height = this.fitFallbackCanvas.height || this.canvas.height || candidate.detectionHeight;\n      const rawCorners = this.fitManualPoints.map((point) => ({ x: (1 - point.x) * width, y: point.y * height }));\n      return api.cardGeometry(rawCorners);\n    }\n\n    drawFitManualMagnifier(point) {\n      if (!this.fitManualMagnifier || !this.fitFallbackCanvas.width || !point) return;\n      const context = this.fitManualMagnifier.getContext('2d');\n      const sourceX = point.x * this.fitFallbackCanvas.width;\n      const sourceY = point.y * this.fitFallbackCanvas.height;\n      const sourceSize = Math.max(36, this.fitFallbackCanvas.width / 19);\n      context.clearRect(0, 0, this.fitManualMagnifier.width, this.fitManualMagnifier.height);\n      context.drawImage(\n        this.fitFallbackCanvas,\n        clamp(sourceX - sourceSize / 2, 0, Math.max(0, this.fitFallbackCanvas.width - sourceSize)),\n        clamp(sourceY - sourceSize / 2, 0, Math.max(0, this.fitFallbackCanvas.height - sourceSize)),\n        sourceSize,\n        sourceSize,\n        0,\n        0,\n        this.fitManualMagnifier.width,\n        this.fitManualMagnifier.height\n      );\n      context.strokeStyle = '#ffffff';\n      context.lineWidth = 2;\n      context.beginPath();\n      context.moveTo(this.fitManualMagnifier.width / 2 - 18, this.fitManualMagnifier.height / 2);\n      context.lineTo(this.fitManualMagnifier.width / 2 + 18, this.fitManualMagnifier.height / 2);\n      context.moveTo(this.fitManualMagnifier.width / 2, this.fitManualMagnifier.height / 2 - 18);\n      context.lineTo(this.fitManualMagnifier.width / 2, this.fitManualMagnifier.height / 2 + 18);\n      context.stroke();\n      const placeLeft = point.x > 0.5;\n      this.fitManualMagnifier.style.left = placeLeft ? '1rem' : 'auto';\n      this.fitManualMagnifier.style.right = placeLeft ? 'auto' : '1rem';\n      this.fitManualMagnifier.hidden = false;\n    }\n\n    setFitManualProgress(message) {\n      const status = this.querySelector('[data-vto-fit-manual-error]');\n      if (!status || status.classList.contains('is-error')) return;\n      status.textContent = message || '';\n    }\n\n    confirmFitManualCorners() {\n      const api = window.CityOpticsPdMeasurement;\n      const candidate = this.fitFallbackCandidate;\n      if (!api?.cardGeometry || !candidate || this.fitManualPoints.length !== 4) return;\n      const geometry = this.fitManualGeometry();\n      if (!geometry?.valid) {\n        this.setFitManualError(this.copy.fitManualError);\n        return;\n      }\n      const coordinateScale = {\n        x: (this.fitFallbackCanvas.width || candidate.detectionWidth) / candidate.detectionWidth,\n        y: (this.fitFallbackCanvas.height || candidate.detectionHeight) / candidate.detectionHeight,\n      };\n      const faceWidth = this.measureFaceWidth(\n        candidate.landmarks,\n        geometry,\n        candidate.crop,\n        candidate.sourceWidth,\n        candidate.sourceHeight,\n        candidate.detectionWidth,\n        candidate.detectionHeight,\n        api,\n        coordinateScale\n      );\n      const minimum = Number(this.fitConfig.minimumWidthMm) || 105;\n      const maximum = Number(this.fitConfig.maximumWidthMm) || 175;\n      if (!Number.isFinite(faceWidth) || faceWidth < minimum || faceWidth > maximum) {\n        this.setFitManualError(this.copy.fitManualFaceError);\n        return;\n      }\n      this.track('fit_manual_completed');\n      this.finishFitCheck('measured', faceWidth);\n    }\n\n    finishFitCheck(outcome, faceWidth) {\n      this.stopCamera();\n      this.mode = 'fit-result';\n      this.fitOverlay.hidden = true;\n      if (this.fitManualOverlay) this.fitManualOverlay.hidden = true;\n      this.setFitStage('result');\n      let result = outcome;\n      if (outcome === 'measured') {\n        const target = Number(this.fitConfig.targetAllowanceMm) || 8;\n        const tolerance = Number(this.fitConfig.goodToleranceMm) || 5;\n        const fitDelta = this.frameWidthMm - faceWidth - target;\n        result = Math.abs(fitDelta) <= tolerance ? 'good' : fitDelta < 0 ? 'narrow' : 'wide';\n      }\n      const titles = { good: this.copy.fitGood, narrow: this.copy.fitNarrow, wide: this.copy.fitWide, unable: this.copy.fitUnable };\n      const title = this.querySelector('[data-vto-fit-result-title]');\n      if (title) title.textContent = titles[result] || this.copy.fitUnable;\n      const face = this.querySelector('[data-vto-face-width]');\n      const frame = this.querySelector('[data-vto-frame-width]');\n      if (face) face.textContent = Number.isFinite(faceWidth) ? `${Math.round(faceWidth)} mm` : '\u2014';\n      if (frame) {\n        const width = Math.round(this.frameWidthMm);\n        frame.textContent = this.frameWidthMm > 0\n          ? this.frameWidthEstimated\n            ? String(this.copy.fitEstimatedValue || 'Approximately {{ width }} mm').replace('{{ width }}', width)\n            : `${width} mm`\n          : '\u2014';\n      }\n      this.track('fit_completed', result);\n    }\n\n    cancelFitCheck() {\n      this.cancelPendingOperation();\n      this.stopCamera();\n      this.mode = 'fit-intro';\n      this.fitOverlay.hidden = true;\n      this.resetFitStages();\n      this.track('fit_cancelled');\n    }\n\n    setFitStage(name) {\n      this.querySelectorAll('[data-vto-fit-stage]').forEach((stage) => {\n        stage.hidden = stage.dataset.vtoFitStage !== name;\n      });\n    }\n\n    setFitStatus(message) {\n      const status = this.querySelector('[data-vto-fit-status]');\n      const cameraStatus = this.querySelector('[data-vto-fit-camera-status]');\n      if (status) status.textContent = message || '';\n      if (cameraStatus) cameraStatus.textContent = message || '';\n    }\n\n    setFitCardGuideStatus(status) {\n      const guide = this.querySelector('.vto__fit-card-guide');\n      const label = this.querySelector('[data-vto-fit-card-guide-label]');\n      const detected = status === 'detected';\n      if (guide) guide.dataset.status = detected ? 'detected' : 'searching';\n      if (label) label.textContent = detected ? this.copy.fitCardDetected : this.copy.fitCardTarget;\n    }\n\n    setCameraErrorState(message) {\n      const error = this.querySelector('[data-vto-preflight-status]');\n      const cameraButton = this.querySelector('[data-vto-camera]');\n      if (error) {\n        error.textContent = message || '';\n        error.hidden = !message;\n      }\n      if (cameraButton) cameraButton.textContent = message ? this.copy.cameraRetry : this.copy.cameraLabel;\n    }\n\n    setLoading(isLoading) {\n      this.loading.hidden = !isLoading;\n      this.toggleAttribute('aria-busy', isLoading);\n    }\n\n    setStatus(message) {\n      if (this.status) this.status.textContent = message || '';\n    }\n\n    setControlsEnabled(enabled) {\n      if (this.controlsEnabled === enabled) return;\n      this.controlsEnabled = enabled;\n      this.controls?.querySelectorAll('button').forEach((button) => { button.disabled = !enabled; });\n    }\n\n    cancelPendingOperation() {\n      this.operationToken += 1;\n    }\n\n    stopCamera() {\n      this.running = false;\n      cancelAnimationFrame(this.animationFrame);\n      this.animationFrame = 0;\n      this.stream?.getTracks().forEach((track) => track.stop());\n      this.stream = null;\n      this.video.pause();\n      this.video.srcObject = null;\n    }\n\n    releasePhoto() {\n      if (this.photoUrl) URL.revokeObjectURL(this.photoUrl);\n      this.photoUrl = null;\n      this.photo = null;\n      this.photoLandmarks = null;\n    }\n\n    cleanUp() {\n      this.cancelPendingOperation();\n      this.stopCamera();\n      this.releasePhoto();\n      this.landmarker?.close?.();\n      this.landmarker = null;\n    }\n\n    track(action, detail) {\n      window.dataLayer?.push({\n        event: 'virtual_try_on',\n        vto_action: action,\n        vto_detail: detail || undefined,\n        product_handle: this.dataset.productHandle,\n        variant_id: this.activeVariantId,\n      });\n    }\n  }\n\n  customElements.define('city-virtual-try-on', CityVirtualTryOn);\n})();\n"],
  "mappings": "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",
  "names": ["wrapper"]
}
