{
  "version": 3,
  "sources": ["/cdn/shop/t/73/assets/urban-booking-sheet.js?urban_booking=20260715z24b"],
  "sourcesContent": ["import { DialogCloseEvent, DialogComponent, DialogOpenEvent } from '@theme/dialog';\n\nconst BOOKING_HASHES = new Set([\n  '#UrbanBookingSheet',\n  '#UrbanMobileBookingPage',\n  '#UrbanBook',\n  '#custom-tattoo-consultation',\n]);\nconst EDITABLE_SELECTOR = 'input, textarea, select, [contenteditable=\"true\"], [role=\"textbox\"]';\nconst MIRRORABLE_SELECTOR =\n  'input:not([type=\"hidden\"]):not([type=\"file\"]):not([type=\"submit\"]):not([type=\"button\"]):not([type=\"checkbox\"]):not([type=\"radio\"]), textarea';\nconst FORM_ID_FROM_ACTION = /\\/api\\/front\\/form\\/(\\d+)\\/send(?:[?#]|$)/;\nconst RESERVED_INTAKE_FORM_ID = '153381';\nconst PIERCING_FORM_ID = '158593';\nconst BOOKING_BUILD = 'z24f';\nconst PIERCING_APPOINTMENT_COPY = 'Piercing appointments with Michael are now available.';\nconst PIERCING_STALE_AVAILABILITY_COPY = [\n  'Piercing booking is temporarily unavailable.',\n  'Appointments temporarily paused',\n  'Walk-ins welcome \u2014 call or message to confirm today.',\n];\n\nfunction refreshPiercingAppointmentCopy() {\n  if (window.location.pathname !== '/pages/piercing' || !document.body) return;\n  const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT);\n  const nodes = [];\n  let node = walker.nextNode();\n  while (node) {\n    const parent = node.parentElement;\n    if (parent && !parent.closest('script, style, template')) nodes.push(node);\n    node = walker.nextNode();\n  }\n  nodes.forEach((textNode) => {\n    let value = textNode.nodeValue || '';\n    PIERCING_STALE_AVAILABILITY_COPY.forEach((staleCopy) => {\n      value = value.replaceAll(staleCopy, PIERCING_APPOINTMENT_COPY);\n    });\n    if (value !== textNode.nodeValue) textNode.nodeValue = value;\n  });\n}\n\nconst FIELD_TAP_SLOP = 8;\nconst FIELD_TAP_MAX_DURATION = 500;\nconst FIELD_GHOST_CLICK_WINDOW = 800;\nconst PHONE_CHROME_SELECTOR = [\n  '.iti__flag-container',\n  '.iti__country-container',\n  '.iti__selected-flag',\n  '.iti__selected-country',\n  '.iti__dropdown-content',\n  '.iti__country-list',\n  '.iti--container',\n].join(',');\nconst STEP_LABELS = ['Service', 'Artist', 'Project', 'Contact'];\nconst NATIVE_SUBMIT_SELECTOR = [\n  'button.wizard__submit',\n  'button.globo-submit',\n  'button.submit',\n  'button[type=\"submit\"]',\n].join(',');\n\nfunction normalizeService(value) {\n  const normalized = String(value || '').trim().toLowerCase();\n  if (normalized.includes('pierc') || normalized.includes('tooth')) return 'Piercing';\n  return 'Tattoo';\n}\n\nfunction isPiercingService(value) {\n  return /pierc|tooth/i.test(String(value || ''));\n}\n\nfunction isTattooService(value) {\n  return /\\btattoo\\b|\\bflash\\b/i.test(String(value || ''));\n}\n\nfunction isTemporarilyUnavailableBookingService(value) {\n  return /pierc|tooth|\\bjewel(?:ry)?\\b/i.test(String(value || ''));\n}\n\nfunction normalizeValue(value) {\n  return String(value || '')\n    .replace(/\\+/g, ' ')\n    .trim()\n    .toLowerCase();\n}\n\nfunction cleanFlashValue(value) {\n  return String(value || '').replace(/\\s+/g, ' ').trim();\n}\n\nfunction normalizeFlashContext(source = {}) {\n  const handle = cleanFlashValue(source.handle);\n  if (!handle) return null;\n  return {\n    handle,\n    title: cleanFlashValue(source.title),\n    artist: cleanFlashValue(source.artist),\n    image: cleanFlashValue(source.image),\n    url: cleanFlashValue(source.url),\n    size: cleanFlashValue(source.size),\n    price: cleanFlashValue(source.price),\n  };\n}\n\nfunction flashContextFrom(trigger, url) {\n  const dataset = trigger instanceof HTMLElement ? trigger.dataset : {};\n  return normalizeFlashContext({\n    handle: dataset.urbanBookingFlashHandle || url.searchParams.get('flash'),\n    title: dataset.urbanBookingFlashTitle,\n    artist: dataset.urbanBookingFlashArtist || dataset.urbanBookingArtist,\n    image: dataset.urbanBookingFlashImage,\n    url: dataset.urbanBookingFlashUrl,\n    size: dataset.urbanBookingFlashSize,\n    price: dataset.urbanBookingFlashPrice,\n  });\n}\n\nfunction normalizeFormId(value) {\n  const raw = String(value || '').trim();\n  if (/^\\d+$/.test(raw)) return raw;\n  try {\n    const decoded = window.atob(raw).trim();\n    return /^\\d+$/.test(decoded) ? decoded : '';\n  } catch (_error) {\n    return '';\n  }\n}\n\nfunction preserveLandingAttribution(url) {\n  const helper = window.UrbanInkAttribution?.appendToUrl;\n  if (typeof helper === 'function') {\n    try {\n      const preserved = helper(url);\n      if (preserved instanceof URL) return preserved;\n      if (typeof preserved === 'string') return new URL(preserved, window.location.href);\n    } catch (_error) {\n    }\n  }\n\n  try {\n    const current = new URL(window.location.href);\n    ['gclid', 'gbraid', 'wbraid', 'utm_source', 'utm_medium', 'utm_campaign', 'utm_content', 'utm_term'].forEach((key) => {\n      if (!url.searchParams.has(key) && current.searchParams.has(key)) {\n        url.searchParams.set(key, current.searchParams.get(key));\n      }\n    });\n  } catch (_error) {\n  }\n  return url;\n}\n\nfunction isVisible(element) {\n  if (!(element instanceof HTMLElement) || !element.isConnected || element.hidden) return false;\n  if (element.closest('[hidden], [aria-hidden=\"true\"]')) return false;\n  const styles = window.getComputedStyle(element);\n  return styles.display !== 'none' && styles.visibility !== 'hidden' && element.getClientRects().length > 0;\n}\n\nfunction shouldUseMobileBookingPage() {\n  return true;\n}\n\nfunction shouldUseMobileFieldEditor() {\n  return false;\n}\n\nfunction tattooInlineUrl(service, artist = '') {\n  const url = preserveLandingAttribution(new URL('/pages/tattoo', window.location.origin));\n  url.searchParams.set('service', normalizeService(service || 'Tattoo'));\n  const cleanArtist = String(artist || '').replace(/\\+/g, ' ').trim();\n  if (cleanArtist) url.searchParams.set('artist_name', cleanArtist);\n  url.hash = 'custom-tattoo-consultation';\n  return url;\n}\n\nfunction redirectLegacyTattooBookingHash() {\n  let url;\n  try {\n    url = new URL(window.location.href);\n  } catch (_error) {\n    return false;\n  }\n  if (!BOOKING_HASHES.has(url.hash)) return false;\n  const requestedService = normalizeService(url.searchParams.get('service') || 'Tattoo');\n  if (requestedService !== 'Tattoo') return false;\n  const artist =\n    url.searchParams.get('artist_name') ||\n    url.searchParams.get('preferred_artist') ||\n    url.searchParams.get('artist') ||\n    '';\n  window.location.replace(tattooInlineUrl(requestedService, artist).toString());\n  return true;\n}\n\nfunction closestFormField(element) {\n  if (!element || element.nodeType !== 1 || typeof element.closest !== 'function') return null;\n  return (\n    element.closest('.globo-form-control') ||\n    element.closest('.form-group') ||\n    element.closest('.globo-form-input') ||\n    element\n  );\n}\n\nclass UrbanBookingComponent extends DialogComponent {\n  #service = 'Tattoo';\n  #artist = '';\n  #flash = null;\n  #flashHydrationToken = 0;\n  #flashPrefillApplied = false;\n  #step = 1;\n  #form = null;\n  #formMount = null;\n  #lastTrigger = null;\n  #formObserver = null;\n  #bodyObserver = null;\n  #submissionObserver = null;\n  #previewResizeObserver = null;\n  #observedPreviewBar = null;\n  #activeField = null;\n  #configureFrame = 0;\n  #stepScrollFrame = 0;\n  #globalFrame = 0;\n  #activeFieldAdjustFrame = 0;\n  #openTimer = 0;\n  #focusScrollTimer = 0;\n  #focusExitTimer = 0;\n  #globalTimerShort = 0;\n  #globalTimerLong = 0;\n  #opening = false;\n  #nativeSubmitting = false;\n  #keyboardFocusActive = false;\n  #mobileOpen = false;\n  #backPointerHandled = false;\n  #backPointerTimer = 0;\n  #movedFormMount = null;\n  #movedFormParent = null;\n  #movedFormNextSibling = null;\n  #fieldEditor = null;\n  #fieldEditorLabel = null;\n  #fieldEditorInput = null;\n  #fieldEditorTextarea = null;\n  #fieldEditorDone = null;\n  #mirroredControl = null;\n  #fieldEditorOpening = false;\n  #fieldGesture = null;\n  #fieldGestureSuppressUntil = 0;\n  #viewport = window.visualViewport;\n  #baselineHeight = window.visualViewport?.height || window.innerHeight;\n  #baselineWidth = window.visualViewport?.width || window.innerWidth;\n  #frozenScrollY = 0;\n  #bodyFreezeSnapshot = null;\n\n  #hasExpectedPiercingForm() {\n    return (\n      this.dataset.urbanBookingPiercingEnabled === 'true' &&\n      normalizeFormId(this.dataset.urbanBookingPiercingForm) === PIERCING_FORM_ID\n    );\n  }\n\n  connectedCallback() {\n    super.connectedCallback();\n    if (this.dataset.urbanBookingReady === 'true') return;\n    this.dataset.urbanBookingReady = 'true';\n    this.dataset.urbanBookingEnhanced = 'true';\n    this.dataset.urbanBookingBuild = BOOKING_BUILD;\n    refreshPiercingAppointmentCopy();\n    window.requestAnimationFrame(refreshPiercingAppointmentCopy);\n    window.setTimeout(refreshPiercingAppointmentCopy, 300);\n\n    this.addEventListener('click', this.#handleComponentClick);\n    this.addEventListener('pointerdown', this.#handleBackPointerDown);\n    this.addEventListener('pointerdown', this.#handleFieldGestureStart, true);\n    this.addEventListener('pointermove', this.#handleFieldGestureMove, true);\n    this.addEventListener('pointerup', this.#handleFieldGestureEnd, true);\n    this.addEventListener('pointercancel', this.#handleFieldGestureCancel, true);\n    this.addEventListener('mousedown', this.#handleFieldGestureMouseDown, true);\n    this.addEventListener('click', this.#handleFieldGestureClick, true);\n    this.addEventListener(DialogOpenEvent.eventName, this.#handleDialogOpen);\n    this.addEventListener(DialogCloseEvent.eventName, this.#handleDialogClose);\n    this.refs.dialog.addEventListener('cancel', this.#handleCancel);\n    this.querySelector('[data-urban-booking-mobile-page]')?.addEventListener('cancel', this.#handleMobileCancel);\n    this.querySelector('[data-urban-booking-mobile-page]')?.addEventListener('click', this.#handleMobilePageClick, true);\n    document.addEventListener('click', this.#handleDocumentClick, true);\n    document.addEventListener('focusin', this.#handleFocusIn, true);\n    document.addEventListener('focusout', this.#handleFocusOut, true);\n    document.addEventListener('toggle', this.#queueGlobalUpdate, true);\n    document.addEventListener('globo.formbuilder.form.loaded', this.#handleFormLoaded);\n    document.addEventListener('globo.formbuilder.form.submitting', this.#handleFormSubmitting);\n    document.addEventListener('globo.formbuilder.form.submitted', this.#handleFormSubmitted);\n    document.addEventListener('globo.formbuilder.form.reset', this.#handleFormReset);\n    this.addEventListener('open:countrydropdown', this.#handlePhoneDropdownState);\n    this.addEventListener('close:countrydropdown', this.#handlePhoneDropdownState);\n    window.addEventListener('resize', this.#handleResize, { passive: true });\n\n    this.#formObserver = new MutationObserver(this.#handleFormMutations);\n    this.#formObserver.observe(this, {\n      attributes: true,\n      attributeFilter: [\n        'action',\n        'class',\n        'style',\n        'type',\n        'hidden',\n        'aria-hidden',\n        'aria-expanded',\n        'data-intl-tel-input-id',\n        'inputmode',\n        'autocomplete',\n        'disabled',\n        'readonly',\n        'aria-readonly',\n      ],\n      childList: true,\n      subtree: true,\n    });\n\n    this.#bodyObserver = new MutationObserver(this.#queueGlobalUpdate);\n    this.#bodyObserver.observe(document.body, {\n      attributes: true,\n      attributeFilter: ['open', 'aria-hidden', 'aria-modal', 'data-open', 'data-stuck'],\n      subtree: true,\n    });\n\n    this.#setStep(this.#flowFirstStep());\n    this.#setService('Tattoo');\n    this.#configureForm();\n    this.#syncViewport();\n    this.#syncDebugState();\n    this.#updateGlobalState();\n    this.#globalTimerShort = window.setTimeout(this.#queueGlobalUpdate, 500);\n    this.#globalTimerLong = window.setTimeout(this.#queueGlobalUpdate, 1500);\n    this.#openFromCurrentUrl();\n  }\n\n  disconnectedCallback() {\n    this.removeEventListener('click', this.#handleComponentClick);\n    this.removeEventListener('pointerdown', this.#handleBackPointerDown);\n    this.removeEventListener('pointerdown', this.#handleFieldGestureStart, true);\n    this.removeEventListener('pointermove', this.#handleFieldGestureMove, true);\n    this.removeEventListener('pointerup', this.#handleFieldGestureEnd, true);\n    this.removeEventListener('pointercancel', this.#handleFieldGestureCancel, true);\n    this.removeEventListener('mousedown', this.#handleFieldGestureMouseDown, true);\n    this.removeEventListener('click', this.#handleFieldGestureClick, true);\n    this.removeEventListener(DialogOpenEvent.eventName, this.#handleDialogOpen);\n    this.removeEventListener(DialogCloseEvent.eventName, this.#handleDialogClose);\n    this.refs.dialog.removeEventListener('cancel', this.#handleCancel);\n    this.querySelector('[data-urban-booking-mobile-page]')?.removeEventListener('cancel', this.#handleMobileCancel);\n    this.querySelector('[data-urban-booking-mobile-page]')?.removeEventListener('click', this.#handleMobilePageClick, true);\n    document.removeEventListener('click', this.#handleDocumentClick, true);\n    document.removeEventListener('focusin', this.#handleFocusIn, true);\n    document.removeEventListener('focusout', this.#handleFocusOut, true);\n    document.removeEventListener('toggle', this.#queueGlobalUpdate, true);\n    document.removeEventListener('globo.formbuilder.form.loaded', this.#handleFormLoaded);\n    document.removeEventListener('globo.formbuilder.form.submitting', this.#handleFormSubmitting);\n    document.removeEventListener('globo.formbuilder.form.submitted', this.#handleFormSubmitted);\n    document.removeEventListener('globo.formbuilder.form.reset', this.#handleFormReset);\n    this.removeEventListener('open:countrydropdown', this.#handlePhoneDropdownState);\n    this.removeEventListener('close:countrydropdown', this.#handlePhoneDropdownState);\n    window.removeEventListener('resize', this.#handleResize);\n    this.#formObserver?.disconnect();\n    this.#bodyObserver?.disconnect();\n    this.#submissionObserver?.disconnect();\n    this.#previewResizeObserver?.disconnect();\n    window.cancelAnimationFrame(this.#configureFrame);\n    window.cancelAnimationFrame(this.#stepScrollFrame);\n    window.cancelAnimationFrame(this.#globalFrame);\n    window.clearTimeout(this.#openTimer);\n    window.clearTimeout(this.#focusScrollTimer);\n    window.clearTimeout(this.#focusExitTimer);\n    window.clearTimeout(this.#backPointerTimer);\n    window.cancelAnimationFrame(this.#activeFieldAdjustFrame);\n    window.clearTimeout(this.#globalTimerShort);\n    window.clearTimeout(this.#globalTimerLong);\n    this.#clearActiveField();\n    this.#fieldGesture = null;\n    this.#fieldGestureSuppressUntil = 0;\n    this.#closeFieldEditor(false);\n    this.#fieldEditor?.remove();\n    this.#closeMobilePage(false);\n    this.#restoreMovedMount();\n    if (this.refs.dialog.open) {\n      this.refs.dialog.close();\n      document.body.style.width = '';\n      document.body.style.position = '';\n      document.body.style.top = '';\n    }\n    this.#releaseGlobalState();\n    delete this.dataset.urbanBookingReady;\n    delete this.dataset.urbanBookingEnhanced;\n    super.disconnectedCallback();\n  }\n\n  showForService(service, artist = '', trigger = null, flash = null) {\n    const requestedService = normalizeService(service);\n    const requestedArtist = String(artist || '').replace(/\\+/g, ' ').trim();\n    if (requestedService === 'Piercing' && !this.#hasExpectedPiercingForm()) {\n      return false;\n    }\n    this.#service = requestedService;\n    this.#artist = requestedArtist;\n    this.#flash = normalizeFlashContext(flash || {});\n    this.#flashPrefillApplied = false;\n    if (!this.#artist && this.#flash?.artist) this.#artist = this.#flash.artist;\n    this.#lastTrigger = trigger instanceof HTMLElement ? trigger : null;\n    this.#setService(this.#service);\n    const opensPiercingIntake = this.#service === 'Piercing' && !this.#flash;\n    this.#setService(this.#service);\n    this.#setStep(this.#flash ? 3 : this.#flowFirstStep());\n    this.#configureForm();\n    this.#syncFlashSelection();\n    this.#hydrateFlash();\n    this.#syncFormContext();\n    if (shouldUseMobileBookingPage()) {\n      return this.#openMobilePage();\n    }\n    if (!this.refs.dialog.open && !this.#opening) {\n      this.#opening = true;\n      this.showDialog();\n    }\n    return true;\n  }\n\n  #handleDocumentClick = (event) => {\n    if (!(event.target instanceof Element) || event.defaultPrevented || event.button !== 0) return;\n    if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;\n\n    const trigger = event.target.closest(\n      '[data-urban-booking-open], a[href*=\"#UrbanBookingSheet\"], a[href*=\"#UrbanBook\"], a[href*=\"#custom-tattoo-consultation\"]'\n    );\n    if (!(trigger instanceof HTMLAnchorElement)) return;\n    if (trigger.hasAttribute('download') || trigger.target === '_blank') return;\n\n    let targetUrl;\n    try {\n      targetUrl = new URL(trigger.href, window.location.href);\n    } catch (_error) {\n      return;\n    }\n    if (targetUrl.origin !== window.location.origin) return;\n\n    const explicitService = trigger.dataset.urbanBookingService || targetUrl.searchParams.get('service');\n    const artist =\n      trigger.dataset.urbanBookingArtist ||\n      targetUrl.searchParams.get('artist_name') ||\n      targetUrl.searchParams.get('preferred_artist') ||\n      targetUrl.searchParams.get('artist') ||\n      '';\n    const requestedService = normalizeService(explicitService || 'Tattoo');\n    const flash = flashContextFrom(trigger, targetUrl);\n\n    if (\n      requestedService === 'Piercing' &&\n      !this.#hasExpectedPiercingForm()\n    ) {\n      event.preventDefault();\n      this.dataset.urbanBookingPiercingBlocked = 'true';\n      return;\n    }\n\n    event.preventDefault();\n    this.showForService(explicitService || 'Tattoo', artist, trigger, flash);\n  };\n\n  #handleComponentClick = (event) => {\n    if (!(event.target instanceof Element)) return;\n\n    const close = event.target.closest('[data-urban-booking-close]');\n    if (close) {\n      event.preventDefault();\n      this.#closeFieldEditor(true);\n      if (this.#mobileOpen) this.#closeMobilePage();\n      else this.closeDialog();\n      return;\n    }\n\n    const service = event.target.closest('[data-urban-booking-service-option]');\n    if (service instanceof HTMLButtonElement) {\n      this.#setService(service.dataset.urbanBookingServiceOption || 'Tattoo');\n      this.#setStep(this.#flowFirstStep());\n      return;\n    }\n\n    const artist = event.target.closest('[data-urban-booking-artist-option]');\n    if (artist instanceof HTMLButtonElement) {\n      this.#selectArtist(artist.dataset.urbanBookingArtistOption || '');\n      return;\n    }\n\n    if (event.target.closest('[data-urban-booking-back]')) {\n      event.preventDefault();\n      if (this.#backPointerHandled) {\n        this.#backPointerHandled = false;\n        window.clearTimeout(this.#backPointerTimer);\n        return;\n      }\n      this.#setStep(Math.max(this.#flowFirstStep(), this.#step - 1));\n      return;\n    }\n\n    if (event.target.closest('[data-urban-booking-next]')) {\n      const active = document.activeElement;\n      if (this.#mirroredControl) this.#closeFieldEditor(true);\n      if (this.#isEditable(active)) {\n        active.blur();\n        this.#keyboardFocusActive = false;\n        this.#clearActiveField();\n        this.#syncViewport();\n      }\n      if (this.#step < 4) {\n        if (this.#validateStep(this.#step)) this.#setStep(this.#step + 1);\n      } else {\n        this.#submitNativeForm();\n      }\n    }\n  };\n\n  #handleBackPointerDown = (event) => {\n    if (!(event.target instanceof Element) || event.button !== 0) return;\n    const back = event.target.closest('[data-urban-booking-back]');\n    if (!(back instanceof HTMLButtonElement) || !this.#mobileOpen || !this.#isEditable(document.activeElement)) return;\n    event.preventDefault();\n    this.#backPointerHandled = true;\n    window.clearTimeout(this.#backPointerTimer);\n    this.#backPointerTimer = window.setTimeout(() => {\n      this.#backPointerHandled = false;\n      this.#backPointerTimer = 0;\n    }, 800);\n    this.#setStep(Math.max(this.#flowFirstStep(), this.#step - 1));\n  };\n\n  #handleCancel = (event) => {\n    event.preventDefault();\n    this.#closeFieldEditor(true);\n    this.closeDialog();\n  };\n\n  #handleMobileCancel = (event) => {\n    event.preventDefault();\n    this.#closeFieldEditor(true);\n    this.#closeMobilePage();\n  };\n\n  #handleMobilePageClick = (event) => {\n    if (!(event.target instanceof Element) || !event.target.closest('[data-urban-booking-close]')) return;\n    event.preventDefault();\n    event.stopPropagation();\n    this.#closeFieldEditor(true);\n    this.#closeMobilePage();\n  };\n\n  #handleDialogOpen = () => {\n    if (this.#mobileOpen) {\n      this.refs.dialog.close();\n      return;\n    }\n    this.#opening = false;\n    document.documentElement.classList.add('urban-booking-sheet-open');\n    this.#syncViewport();\n    this.#queueGlobalUpdate();\n    window.requestAnimationFrame(() => {\n      const title = this.querySelector('#UrbanBookingSheetTitle');\n      if (title instanceof HTMLElement) title.focus({ preventScroll: true });\n    });\n  };\n\n  #handleDialogClose = () => {\n    this.#opening = false;\n    this.#closeFieldEditor(true);\n    this.#keyboardFocusActive = false;\n    this.#clearActiveField();\n    window.clearTimeout(this.#focusExitTimer);\n    this.dataset.urbanBookingKeyboard = 'false';\n    document.documentElement.classList.remove('urban-booking-sheet-open');\n    document.documentElement.classList.remove('urban-booking-keyboard-active');\n    this.#setStep(this.#flowFirstStep());\n    this.#updateGlobalState();\n    if (this.#lastTrigger?.isConnected) {\n      window.requestAnimationFrame(() => this.#lastTrigger?.focus({ preventScroll: true }));\n    }\n  };\n\n  #openMobilePage() {\n    const page = this.querySelector('[data-urban-booking-mobile-page]');\n    if (!(page instanceof HTMLElement)) return false;\n    if (this.refs.dialog.open) this.refs.dialog.close();\n    this.#mobileOpen = true;\n    this.#freezeDocumentScroll();\n    page.hidden = false;\n    if (page instanceof HTMLDialogElement && page.open && !page.matches(':modal')) page.close();\n    if (page instanceof HTMLDialogElement && !page.open) {\n      try {\n        page.showModal();\n      } catch (_error) {\n        page.setAttribute('open', '');\n      }\n    }\n    const isTopLayer = page instanceof HTMLDialogElement && page.open && page.matches(':modal');\n    this.dataset.urbanBookingModalMode = isTopLayer ? 'top-layer' : 'fallback';\n    this.dataset.urbanBookingMobileOpen = 'true';\n    document.documentElement.classList.add('urban-booking-mobile-page-open');\n    document.documentElement.classList.add('urban-booking-bar-suppressed');\n    this.#moveActiveMountToMobile();\n    this.#configureForm();\n    this.#syncFormContext();\n    this.#syncViewport();\n    this.#updateGlobalState();\n    try {\n      const url = new URL(window.location.href);\n      url.searchParams.set('service', this.#service);\n      if (this.#artist) url.searchParams.set('artist_name', this.#artist);\n      if (this.#flash?.handle) url.searchParams.set('flash', this.#flash.handle);\n      url.hash = 'UrbanMobileBookingPage';\n      window.history.replaceState(window.history.state, '', url.toString());\n    } catch (_error) {\n    }\n    window.requestAnimationFrame(() => {\n      const scroller = page.querySelector('.urban-booking-mobile-page__body');\n      if (scroller instanceof HTMLElement) scroller.scrollTop = 0;\n      const title = this.querySelector('#UrbanMobileBookingTitle');\n      if (title instanceof HTMLElement) title.focus({ preventScroll: true });\n    });\n    return true;\n  }\n\n  #closeMobilePage(restoreFocus = true) {\n    const page = this.querySelector('[data-urban-booking-mobile-page]');\n    if (page instanceof HTMLDialogElement && page.open) page.close();\n    if (page instanceof HTMLElement) page.hidden = true;\n    this.#closeFieldEditor(true);\n    this.#mobileOpen = false;\n    this.#keyboardFocusActive = false;\n    this.#clearActiveField();\n    window.clearTimeout(this.#focusExitTimer);\n    this.dataset.urbanBookingMobileOpen = 'false';\n    delete this.dataset.urbanBookingModalMode;\n    this.dataset.urbanBookingKeyboard = 'false';\n    document.documentElement.classList.remove('urban-booking-mobile-page-open');\n    document.documentElement.classList.remove('urban-booking-keyboard-active');\n    this.#restoreMovedMount();\n    this.#restoreDocumentScroll();\n    this.#setStep(this.#flowFirstStep());\n    try {\n      const url = new URL(window.location.href);\n      if (url.hash === '#UrbanMobileBookingPage') {\n        url.hash = '';\n        window.history.replaceState(window.history.state, '', url.toString());\n      }\n    } catch (_error) {\n    }\n    this.#updateGlobalState();\n    if (restoreFocus && this.#lastTrigger?.isConnected) {\n      window.requestAnimationFrame(() => this.#lastTrigger?.focus({ preventScroll: false }));\n    }\n  }\n\n  #moveActiveMountToMobile() {\n    const host = this.querySelector('[data-urban-booking-mobile-form-host]');\n    const activeMount = this.#activateFormMount();\n    if (!(host instanceof HTMLElement) || !(activeMount instanceof HTMLElement)) return;\n    if (this.#movedFormMount instanceof HTMLElement && this.#movedFormMount !== activeMount) {\n      this.#restoreMovedMount();\n    }\n    if (activeMount.parentElement === host) return;\n    this.#movedFormMount = activeMount;\n    this.#movedFormParent = activeMount.parentNode;\n    this.#movedFormNextSibling = activeMount.nextSibling;\n    host.append(activeMount);\n  }\n\n  #restoreMovedMount() {\n    if (this.#movedFormMount instanceof HTMLElement && this.#movedFormParent instanceof Node) {\n      this.#movedFormParent.insertBefore(this.#movedFormMount, this.#movedFormNextSibling);\n    }\n    this.#movedFormMount = null;\n    this.#movedFormParent = null;\n    this.#movedFormNextSibling = null;\n  }\n\n  #handleFormLoaded = (event) => {\n    const form = event.detail?.form;\n    if (form instanceof HTMLFormElement && this.contains(form)) this.#configureForm(form);\n  };\n\n  #handleFormSubmitting = (event) => {\n    const form = event.detail?.form;\n    if (!(form instanceof HTMLFormElement) || form !== this.#form) return;\n    this.#nativeSubmitting = true;\n    this.#setSubmitBusy(true);\n    this.#observeSubmissionState();\n  };\n\n  #handleFormSubmitted = (event) => {\n    const form = event.detail?.form;\n    if (!(form instanceof HTMLFormElement) || form !== this.#form) return;\n    this.#submissionObserver?.disconnect();\n    this.#nativeSubmitting = false;\n    this.dataset.urbanBookingSubmitted = 'true';\n    this.#setSubmitBusy(false);\n    this.querySelectorAll('[data-urban-booking-success]').forEach((success) => {\n      if (success instanceof HTMLElement) success.hidden = false;\n    });\n    const success = this.#mobileOpen\n      ? this.querySelector('[data-urban-booking-mobile-page] [data-urban-booking-success]')\n      : this.querySelector('[data-urban-booking-success]');\n    if (success instanceof HTMLElement) {\n      window.requestAnimationFrame(() => success.focus({ preventScroll: true }));\n    }\n  };\n\n  #handleFormReset = (event) => {\n    const form = event.detail?.form;\n    if (!(form instanceof HTMLFormElement) || form !== this.#form) return;\n    this.#submissionObserver?.disconnect();\n    this.#nativeSubmitting = false;\n    this.dataset.urbanBookingSubmitted = 'false';\n    this.querySelectorAll('[data-urban-booking-success]').forEach((success) => {\n      if (success instanceof HTMLElement) success.hidden = true;\n    });\n    this.#setSubmitBusy(false);\n    this.#setStep(this.#flash ? 3 : this.#firstBookingStep());\n    this.#syncFormContext();\n  };\n\n  #handleResize = () => {\n    const height = this.#viewport?.height || window.innerHeight;\n    const width = this.#viewport?.width || window.innerWidth;\n    if (Math.abs(width - this.#baselineWidth) >= 48) {\n      this.#baselineWidth = width;\n      this.#baselineHeight = height;\n    } else if (!this.#isEditable(document.activeElement) && height > this.#baselineHeight - 80) {\n      this.#baselineHeight = Math.max(this.#baselineHeight, height);\n    }\n    this.#syncViewport();\n    if (\n      !this.#mirroredControl &&\n      (this.refs.dialog.open || this.#mobileOpen) &&\n      this.#isEditable(document.activeElement)\n    ) {\n      this.#queueFocusedControlIntoView(document.activeElement);\n    }\n    this.#queueGlobalUpdate();\n  };\n\n  #syncViewport() {\n    const viewportHeight = this.#viewport?.height || window.innerHeight;\n    const viewportOffset = this.#viewport?.offsetTop || 0;\n    const activeEditable = this.#isEditable(document.activeElement) && this.contains(document.activeElement);\n    const fieldEditorActive = this.#mirroredControl instanceof HTMLElement;\n    const viewportKeyboardOpen = this.#baselineHeight - viewportHeight > 80;\n    const keyboardMode =\n      (this.refs.dialog.open || this.#mobileOpen) &&\n      !fieldEditorActive &&\n      (activeEditable || this.#keyboardFocusActive) &&\n      (viewportKeyboardOpen || !this.#viewport);\n    const keyboardOffset = keyboardMode && viewportKeyboardOpen\n      ? Math.max(0, Math.round(window.innerHeight - viewportHeight - viewportOffset))\n      : 0;\n    const viewportLoss = Math.max(0, Math.round(this.#baselineHeight - viewportHeight));\n    const layoutLoss = Math.max(0, Math.round(window.innerHeight - viewportHeight - viewportOffset));\n    const measuredKeyboardHeight = Math.max(viewportLoss, layoutLoss, keyboardOffset);\n    const keyboardReserve = keyboardMode\n      ? Math.max(96, Math.min(180, Math.round((measuredKeyboardHeight || 0) * 0.16) + 84))\n      : 96;\n    const fallbackKeyboardHeight = Math.max(520, Math.min(760, Math.round(this.#baselineHeight * 0.92)));\n    const keyboardSheetHeight = viewportKeyboardOpen\n      ? Math.round(viewportHeight - 6)\n      : fallbackKeyboardHeight;\n    const sheetHeight = keyboardMode\n      ? Math.min(Math.max(320, keyboardSheetHeight), Math.max(300, Math.round(viewportHeight - 6)))\n      : Math.max(320, Math.min(724, Math.round(viewportHeight * 0.86)));\n    this.style.setProperty('--urban-booking-visual-height', `${Math.max(1, Math.round(viewportHeight))}px`);\n    this.style.setProperty('--urban-booking-visual-top', '0px');\n    this.style.setProperty('--urban-booking-sheet-height', `${sheetHeight}px`);\n    this.style.setProperty('--urban-booking-keyboard-offset', `${keyboardOffset}px`);\n    this.style.setProperty('--urban-booking-keyboard-reserve', `${keyboardReserve}px`);\n    this.dataset.urbanBookingKeyboard = keyboardMode ? 'true' : 'false';\n    document.documentElement.classList.toggle('urban-booking-keyboard-active', keyboardMode);\n    this.#syncDebugState();\n    if (keyboardMode) this.#queueFocusedControlIntoView(document.activeElement);\n  }\n\n  #syncDebugState() {\n    let diagnosticsEnabled = false;\n    let visibleUiEnabled = false;\n    try {\n      const params = new URL(window.location.href).searchParams;\n      diagnosticsEnabled = params.get('urban_booking_debug') === '1' || params.get('urban_booking_debug_ui') === '1';\n      visibleUiEnabled = params.get('urban_booking_debug_ui') === '1';\n    } catch (_error) {\n    }\n    document.documentElement.classList.toggle('urban-booking-debug', visibleUiEnabled);\n    if (!diagnosticsEnabled) return;\n    const width = Math.max(1, Math.round(this.#viewport?.width || window.innerWidth));\n    const height = Math.max(1, Math.round(this.#viewport?.height || window.innerHeight));\n    const viewportLeft = Math.round(this.#viewport?.offsetLeft || 0);\n    const viewportTop = Math.round(this.#viewport?.offsetTop || 0);\n    const page = this.querySelector('[data-urban-booking-mobile-page]');\n    const pageRect = page instanceof HTMLElement ? page.getBoundingClientRect() : null;\n    const pagePass = Boolean(\n      pageRect &&\n      pageRect.left <= viewportLeft + 1 &&\n      pageRect.top <= viewportTop + 1 &&\n      pageRect.right >= viewportLeft + width - 1 &&\n      pageRect.bottom >= viewportTop + height - 1\n    );\n    const phone = this.querySelector('.urban-booking-mobile-page__form-stage [data-urban-booking-phone-root]');\n    const country = phone?.querySelector('[data-urban-booking-phone-country]');\n    const phoneInput = phone?.querySelector('input[data-urban-booking-phone-input]');\n    const countryRect = country instanceof HTMLElement ? country.getBoundingClientRect() : null;\n    const inputRect = phoneInput instanceof HTMLElement ? phoneInput.getBoundingClientRect() : null;\n    const countryWidth = countryRect ? Math.round(countryRect.width) : 0;\n    const inputWidth = inputRect ? Math.round(inputRect.width) : 0;\n    const inputPadding = phoneInput instanceof HTMLElement\n      ? Math.round(parseFloat(window.getComputedStyle(phoneInput).paddingInlineStart) || 0)\n      : 0;\n    const phoneVisible = Boolean(phoneInput instanceof HTMLElement && phoneInput.getClientRects().length);\n    const phonePass = !phoneVisible || Boolean(\n      inputRect &&\n      inputWidth >= 150 &&\n      (!countryRect || inputRect.left + inputPadding >= countryRect.right + 4)\n    );\n    const pageGeometry = pageRect\n      ? `${Math.round(pageRect.top)}/${Math.round(pageRect.left)} ${Math.round(pageRect.width)}x${Math.round(pageRect.height)}`\n      : 'closed';\n    const formId = this.dataset.urbanBookingActualForm || this.dataset.urbanBookingExpectedForm || 'loading';\n    const modalMode = this.dataset.urbanBookingModalMode || 'closed';\n    const status = pagePass && phonePass ? 'PASS' : 'CHECK';\n    this.querySelectorAll('[data-urban-booking-debug-label]').forEach((label) => {\n      label.dataset.urbanBookingDebugState = status.toLowerCase();\n      label.textContent = `QA ${status} | Theme 187304444193 | ${BOOKING_BUILD} | ${modalMode} | vv ${width}x${height}@${viewportTop} | page ${pageGeometry} | form ${formId} | phone ${countryWidth}/${inputWidth} p${inputPadding}`;\n    });\n  }\n\n  #queueConfigureForm = () => {\n    if (this.#configureFrame) return;\n    this.#configureFrame = window.requestAnimationFrame(() => {\n      this.#configureFrame = 0;\n      this.#configureForm();\n    });\n  };\n\n  #handleFormMutations = (records) => {\n    const phoneFields = new Set();\n    const phoneStateRecord = (record) => {\n      if (record.type !== 'attributes' || !(record.target instanceof Element)) return false;\n      const target = record.target;\n      const isCountryListState =\n        target.matches('.iti__country-list') &&\n        ['class', 'style', 'hidden', 'aria-hidden'].includes(record.attributeName);\n      const isCountryToggleState =\n        target.matches('.iti__selected-country, .iti__selected-flag, [role=\"combobox\"]') &&\n        record.attributeName === 'aria-expanded';\n      if (!isCountryListState && !isCountryToggleState) return false;\n      const field = target.closest('[data-urban-booking-phone-field]');\n      if (!(field instanceof HTMLElement)) return false;\n      phoneFields.add(field);\n      return true;\n    };\n\n    records.forEach(phoneStateRecord);\n    if (phoneFields.size) {\n      phoneFields.forEach((field) => this.#syncPhoneDropdownState(field));\n      const anyPhoneDropdownOpen = Boolean(\n        this.querySelector('[data-urban-booking-phone-field][data-urban-booking-phone-dropdown-open=\"true\"]')\n      );\n      this.dataset.urbanBookingPhoneDropdownOpen = anyPhoneDropdownOpen ? 'true' : 'false';\n    }\n\n    const shouldReconfigure = records.some((record) => {\n      if (phoneStateRecord(record)) return false;\n      if (record.type === 'childList') {\n        const changedNodes = [...record.addedNodes, ...record.removedNodes];\n        if (changedNodes.length && changedNodes.every((node) => this.#isFieldEditorElement(node))) return false;\n        return true;\n      }\n      const target = record.target;\n      if (!(target instanceof Element)) return true;\n      if (target === this && (record.attributeName === 'class' || record.attributeName === 'style')) return false;\n      if (this.#isFieldEditorElement(target)) return false;\n      if (\n        record.attributeName === 'class' &&\n        target.matches('label, label *, .gfb__label, .gfb__label *, .label-content')\n      ) {\n        return false;\n      }\n      return true;\n    });\n    if (shouldReconfigure) this.#queueConfigureForm();\n  };\n\n  #syncPhoneDropdownState(field, phoneCandidate = null, layoutRootCandidate = null) {\n    if (!(field instanceof HTMLElement)) return false;\n    const phone = phoneCandidate instanceof HTMLElement\n      ? phoneCandidate\n      : field.querySelector('[data-urban-booking-phone-wrapper], .iti');\n    if (!(phone instanceof HTMLElement)) return false;\n    const layoutRoot = layoutRootCandidate instanceof HTMLElement\n      ? layoutRootCandidate\n      : phone.matches('[data-urban-booking-phone-root]')\n        ? phone\n        : phone.querySelector('[data-urban-booking-phone-root]') || phone;\n    const countryList = phone.querySelector('.iti__country-list');\n    const countryDropdown = countryList?.closest('.iti__dropdown-content') || countryList;\n    const countryToggle = phone.querySelector(\n      '.iti__selected-country[aria-expanded], .iti__selected-flag[aria-expanded], [role=\"combobox\"][aria-expanded], button[aria-expanded][aria-controls*=\"country\" i]'\n    );\n    const expandedState = countryToggle?.getAttribute('aria-expanded');\n    const visibleListFallback = Boolean(\n      countryList instanceof HTMLElement &&\n      !countryList.classList.contains('iti__hide') &&\n      countryList.getAttribute('aria-hidden') !== 'true' &&\n      window.getComputedStyle(countryList).display !== 'none'\n    );\n    const dropdownOpen = expandedState === 'true' || (expandedState == null && visibleListFallback);\n    const layoutWidth = Math.round(\n      layoutRoot.getBoundingClientRect().width || phone.getBoundingClientRect().width || 0\n    );\n    const measuredDropdownHeight = countryList instanceof HTMLElement\n      ? Math.round(countryList.getBoundingClientRect().height || 0)\n      : 0;\n    const dropdownHeight = Math.max(160, Math.min(240, measuredDropdownHeight || 200));\n    const dropdownHeightValue = `${dropdownHeight}px`;\n    const dropdownWidthValue = `${layoutWidth}px`;\n\n    field.dataset.urbanBookingPhoneDropdownOpen = dropdownOpen ? 'true' : 'false';\n    if (field.style.getPropertyValue('--urban-booking-phone-dropdown-height') !== dropdownHeightValue) {\n      field.style.setProperty('--urban-booking-phone-dropdown-height', dropdownHeightValue);\n    }\n    if (layoutWidth > 0 && field.style.getPropertyValue('--urban-booking-phone-dropdown-width') !== dropdownWidthValue) {\n      field.style.setProperty('--urban-booking-phone-dropdown-width', dropdownWidthValue);\n    }\n    if (countryDropdown instanceof HTMLElement) countryDropdown.dataset.urbanBookingPhoneDropdown = 'true';\n    if (countryList instanceof HTMLElement) countryList.dataset.urbanBookingPhoneCountryList = 'true';\n    return dropdownOpen;\n  }\n\n  #handlePhoneDropdownState = (event) => {\n    const target = event.target;\n    if (!(target instanceof Element)) return;\n    const field = target.closest('[data-urban-booking-phone-field]');\n    if (!(field instanceof HTMLElement) || !this.#form?.contains(target)) return;\n    this.#syncPhoneDropdownState(field);\n    const anyPhoneDropdownOpen = Boolean(\n      this.querySelector('[data-urban-booking-phone-field][data-urban-booking-phone-dropdown-open=\"true\"]')\n    );\n    this.dataset.urbanBookingPhoneDropdownOpen = anyPhoneDropdownOpen ? 'true' : 'false';\n  };\n\n  #activateFormMount() {\n    const mounts = Array.from(this.querySelectorAll('[data-urban-booking-form-mount]'));\n    const requestedService = this.#service;\n    let activeMount = mounts.find(\n      (mount) => mount.getAttribute('data-urban-booking-form-service') === requestedService\n    );\n    if (!(activeMount instanceof HTMLElement)) {\n      activeMount = mounts.find(\n        (mount) => mount.getAttribute('data-urban-booking-form-service') === 'Tattoo'\n      );\n    }\n\n    mounts.forEach((mount) => {\n      if (!(mount instanceof HTMLElement)) return;\n      const shouldHide = mount !== activeMount;\n      if (mount.hidden !== shouldHide) mount.hidden = shouldHide;\n    });\n\n    if (this.#formMount !== activeMount) {\n      this.#form?.removeEventListener('input', this.#handleFormInput);\n      this.#form?.removeEventListener('change', this.#handleFormInput);\n      this.#submissionObserver?.disconnect();\n      this.#form = null;\n      this.#formMount = activeMount instanceof HTMLElement ? activeMount : null;\n      this.#nativeSubmitting = false;\n      this.dataset.urbanBookingSubmitted = 'false';\n      this.querySelectorAll('[data-urban-booking-success]').forEach((success) => {\n        if (success instanceof HTMLElement) success.hidden = true;\n      });\n      this.#setSubmitBusy(false);\n    }\n\n    const expectedFormId = normalizeFormId(activeMount?.dataset.urbanBookingFormId);\n    this.dataset.urbanBookingExpectedForm = expectedFormId || 'missing';\n    return activeMount instanceof HTMLElement ? activeMount : null;\n  }\n\n  #configureForm(candidate = null) {\n    const activeMount = this.#activateFormMount();\n    const expectedFormId = this.dataset.urbanBookingExpectedForm || '';\n    if (!(activeMount instanceof HTMLElement) || !expectedFormId || expectedFormId === 'missing') {\n      this.dataset.urbanBookingFormState = 'invalid';\n      return;\n    }\n    if (\n      expectedFormId === RESERVED_INTAKE_FORM_ID ||\n      (this.#service === 'Piercing' && expectedFormId !== PIERCING_FORM_ID)\n    ) {\n      this.dataset.urbanBookingActualForm = expectedFormId || 'invalid';\n      this.dataset.urbanBookingFormState = 'invalid';\n      return;\n    }\n\n    const candidateMount = candidate?.closest('[data-urban-booking-form-mount]');\n    const form =\n      candidate instanceof HTMLFormElement && candidateMount === activeMount\n        ? candidate\n        : activeMount.querySelector('.globo-formbuilder form, .globo-form-app form');\n    if (!(form instanceof HTMLFormElement)) {\n      if (this.#form && !this.#form.isConnected) {\n        this.#form.removeEventListener('input', this.#handleFormInput);\n        this.#form.removeEventListener('change', this.#handleFormInput);\n        this.#form = null;\n      }\n      this.dataset.urbanBookingFormState = 'loading';\n      return;\n    }\n\n    const actionFormId = form.action.match(FORM_ID_FROM_ACTION)?.[1] || '';\n    const hostFormIdRaw =\n      form.closest('.globo-formbuilder')?.getAttribute('data-id') ||\n      form.closest('[id^=\"globo-formbuilder-\"]')?.id.replace('globo-formbuilder-', '') ||\n      '';\n    const actualFormId = actionFormId || normalizeFormId(hostFormIdRaw);\n    this.dataset.urbanBookingActualForm = actualFormId || 'unknown';\n    if (actualFormId !== expectedFormId) {\n      this.#form?.removeEventListener('input', this.#handleFormInput);\n      this.#form?.removeEventListener('change', this.#handleFormInput);\n      this.#form = null;\n      this.dataset.urbanBookingFormState = 'invalid';\n      return;\n    }\n\n    if (this.#form !== form) {\n      this.#form?.removeEventListener('input', this.#handleFormInput);\n      this.#form?.removeEventListener('change', this.#handleFormInput);\n      this.#form = form;\n      this.#form.addEventListener('input', this.#handleFormInput);\n      this.#form.addEventListener('change', this.#handleFormInput);\n    }\n\n    this.dataset.urbanBookingFormState = 'ready';\n    form.dataset.urbanBookingManaged = 'true';\n    this.#assignFieldSteps(form);\n    this.#removeUnavailablePiercingOptions(form);\n    this.#preparePhoneLayout(form);\n    this.#preparePiercingSchedule(form);\n    this.#preparePiercingRequestFields(form);\n    this.#removeJewelryBookingChoices(form);\n    this.#prepareArtistControl(form);\n    this.#syncFormContext();\n  }\n\n\n  #preparePiercingSchedule(form) {\n    if (this.#service !== 'Piercing' || !(form instanceof HTMLFormElement)) return;\n\n    // Urban Ink Piercing unified appointment schedule 2026-08-12\n    // Keep Globo's actual date/time inputs, but group their original row-items so\n    // the editor-actions node can never become an accidental CSS grid cell.\n    const scheduleFields = Array.from(form.querySelectorAll('.globo-form-control')).filter((field) =>\n      field instanceof HTMLElement && field.querySelector('input[name^=\"datetime\"]') instanceof HTMLInputElement\n    ).slice(0, 2);\n    const scheduleItems = scheduleFields.map((field) => field.closest('.globo-form-row-item') || field);\n    const scheduleHost = scheduleItems[0]?.closest('.globo-form-row');\n    let scheduleGroup = null;\n\n    if (scheduleHost instanceof HTMLElement && scheduleItems.length === 2) {\n      scheduleHost.removeAttribute('data-urban-piercing-schedule-row');\n      scheduleHost.dataset.urbanPiercingScheduleHost = 'true';\n      scheduleGroup = scheduleHost.querySelector(':scope > [data-urban-piercing-schedule-group=\"true\"]');\n\n      if (!(scheduleGroup instanceof HTMLElement)) {\n        scheduleGroup = document.createElement('div');\n        scheduleGroup.dataset.urbanPiercingScheduleGroup = 'true';\n        scheduleGroup.setAttribute('role', 'group');\n        scheduleGroup.setAttribute('aria-label', 'Preferred appointment');\n        scheduleHost.insertBefore(scheduleGroup, scheduleItems[0]);\n      }\n\n      let scheduleHeading = scheduleGroup.querySelector(':scope > [data-urban-piercing-schedule-heading]');\n      if (!(scheduleHeading instanceof HTMLElement)) {\n        scheduleHeading = document.createElement('p');\n        scheduleHeading.dataset.urbanPiercingScheduleHeading = 'true';\n        scheduleHeading.textContent = 'Preferred appointment';\n        scheduleGroup.prepend(scheduleHeading);\n      }\n\n      scheduleItems.forEach((item, index) => {\n        if (!(item instanceof HTMLElement)) return;\n        item.dataset.urbanPiercingScheduleItem = index === 0 ? 'date' : 'time';\n        if (item.parentElement !== scheduleGroup) scheduleGroup.append(item);\n      });\n\n      let scheduleNote = scheduleGroup.querySelector(':scope > [data-urban-piercing-schedule-note]');\n      if (!(scheduleNote instanceof HTMLElement)) {\n        scheduleNote = document.createElement('p');\n        scheduleNote.dataset.urbanPiercingScheduleNote = 'true';\n        scheduleGroup.append(scheduleNote);\n      }\n      scheduleNote.textContent = 'Choose a date and time that works for you. We will confirm availability with you.';\n    }\n\n    const labels = ['Preferred appointment date *', 'Preferred time window *'];\n    // Urban Ink Globo-owned schedule handoff 2026-08-16\n    // The real Globo fields are configured with a 12-hour time format. Keep its\n    // Flatpickr instances and validation contract intact; this layer only makes\n    // the existing controls reliably reachable from the custom booking surface.\n    const preserveGloboScheduleInput = (field) => {\n      const input = field.querySelector('input[name^=\"datetime\"]');\n      if (!(input instanceof HTMLInputElement)) return;\n\n      input.disabled = false;\n      input.removeAttribute('disabled');\n      input.removeAttribute('aria-disabled');\n      input.style.setProperty('pointer-events', 'auto', 'important');\n      input.style.setProperty('position', 'relative');\n      input.style.setProperty('z-index', '2');\n      input.style.setProperty('cursor', 'pointer');\n\n      if (input.dataset.urbanPiercingGloboPicker !== 'true') {\n        input.dataset.urbanPiercingGloboPicker = 'true';\n        const openGloboPicker = () => {\n          const picker = input._flatpickr;\n          if (picker && typeof picker.open === 'function' && !picker.isOpen) picker.open();\n        };\n        input.addEventListener('click', openGloboPicker);\n        input.addEventListener('keydown', (event) => {\n          if (event.key === 'Enter' || event.key === ' ') openGloboPicker();\n        });\n      }\n    };\n\n    scheduleFields.forEach((field, index) => {\n      field.hidden = false;\n      field.removeAttribute('aria-hidden');\n      field.dataset.urbanPiercingSchedule = index === 0 ? 'date' : 'time';\n      field.querySelectorAll('input, select, textarea, button').forEach((control) => {\n        control.disabled = false;\n        control.removeAttribute('aria-hidden');\n        control.tabIndex = 0;\n      });\n      const label = field.querySelector('label, .label-content');\n      if (label) label.textContent = labels[index] || 'Preferred appointment window';\n      Array.from(field.querySelectorAll('small, .globo-form-description, .globo-form-control-description, .help-block, .form-text')).forEach((helper) => {\n        const copy = helper.textContent?.trim().toLowerCase() || '';\n        if (copy.includes('choose a preferred') || copy.includes('choose a time')) helper.hidden = true;\n      });\n      preserveGloboScheduleInput(field, index);\n      const input = field.querySelector('input[name^=\"datetime\"]');\n      if (label instanceof HTMLLabelElement && input instanceof HTMLInputElement && input.id) {\n        label.htmlFor = input.id;\n      }\n    });\n\n    // Globo may finish its own input enhancement after the first form mount.\n    // Re-assert the native appointment controls once without touching a focused value.\n    const reinforceNativeControls = () => {\n      if (!form.isConnected || this.#service !== 'Piercing') return;\n      scheduleFields.forEach((field, index) => preserveGloboScheduleInput(field, index));\n    };\n    window.requestAnimationFrame(reinforceNativeControls);\n    window.setTimeout(reinforceNativeControls, 240);\n    window.setTimeout(reinforceNativeControls, 760);\n\n    const notes = Array.from(form.querySelectorAll('.globo-form-control')).find((field) => field.querySelector('textarea'));\n    if (notes instanceof HTMLElement) {\n      const label = notes.querySelector('label, .label-content');\n      if (label) label.textContent = 'Placement & notes *';\n      const textarea = notes.querySelector('textarea');\n      if (textarea instanceof HTMLTextAreaElement) {\n        textarea.disabled = false;\n        textarea.readOnly = false;\n        textarea.removeAttribute('disabled');\n        textarea.removeAttribute('readonly');\n        textarea.placeholder = 'Placement, new or existing piercing, or anything else Michael should know.';\n      }\n    }\n  }\n\n  #preparePiercingRequestFields(form) {\n    // Urban Ink isolates Piercing intake from Globo validation 2026-08-18\n    const existing = form.querySelector('[data-urban-piercing-request-fields]');\n    if (this.#service !== 'Piercing') {\n      existing?.remove();\n      return;\n    }\n\n    const notesField = Array.from(form.querySelectorAll('.globo-form-control')).find((field) => field.querySelector('textarea'));\n    const notes = notesField?.querySelector('textarea');\n    if (!(notesField instanceof HTMLElement) || !(notes instanceof HTMLTextAreaElement)) return;\n\n    // Globo validates every form control inside its active .block-container and\n    // assumes each one has a .globo-form-control wrapper. Our custom intake does\n    // not (by design), so keep it in the real form for FormData/file transfer but\n    // place it immediately after Globo's validation block.\n    const validationBlock = notesField.closest('.block-container');\n    if (!(validationBlock instanceof HTMLElement)) return;\n    // Urban Ink Piercing intake panel rhythm 2026-08-18\n    // Globo's .panels container is a no-wrap flex row by default. Once the\n    // intake becomes its own sibling, establish a contained, centered column\n    // so the real schedule and Piercing details remain in reading order.\n    const panels = validationBlock.parentElement;\n    const placeIntake = (intake) => {\n      if (!(intake instanceof HTMLElement)) return;\n      if (panels instanceof HTMLElement) {\n        panels.dataset.urbanPiercingIntakePanels = 'true';\n        panels.style.setProperty('display', 'block', 'important');\n        panels.style.setProperty('width', 'min(100%, 920px)', 'important');\n        panels.style.setProperty('max-width', '920px', 'important');\n        panels.style.setProperty('margin-inline', 'auto', 'important');\n      }\n      if (validationBlock.nextElementSibling !== intake) validationBlock.after(intake);\n      intake.style.setProperty('width', '100%', 'important');\n      intake.style.setProperty('box-sizing', 'border-box');\n      intake.style.setProperty('margin-top', 'clamp(32px, 4vw, 56px)');\n      intake.hidden = this.#step !== 3;\n    };\n\n    const syncDetails = (intake, notify = false) => {\n      const value = (name) => intake.querySelector('[name=\"' + name + '\"]')?.value?.trim() || '';\n      const age = intake.querySelector('[name=\"piercing_age_confirmation\"]:checked')?.value || '';\n      const reference = intake.querySelector('[name=\"piercing_reference_image\"]');\n      const fileName = reference instanceof HTMLInputElement && reference.files?.[0] ? reference.files[0].name : '';\n      const start = '[Piercing appointment details]';\n      const end = '[/Piercing appointment details]';\n      const markerPattern = /\\[Piercing appointment details\\][\\s\\S]*?\\[\\/Piercing appointment details\\]\\s*/g;\n      const rawNotes = notes.value.replace(markerPattern, '').trim();\n      // Remove only the exact machine-generated tail created by the legacy\n      // unescaped marker regex. Any normal staff/client note is retained.\n      const currentNotes = rawNotes.startsWith('[NNN/vN:fNvN:') ? '' : rawNotes;\n      const details = [\n        start,\n        'Appointment type: ' + (value('piercing_appointment_type') || 'Not provided'),\n        'Target placement: ' + (value('piercing_target_placement') || 'Not provided'),\n        'Age confirmation: ' + (age || 'Not provided'),\n        'Material allergies / sensitivities: ' + (value('piercing_allergies') || 'None noted'),\n        'Healing considerations: ' + (value('piercing_healing_notes') || 'None noted'),\n        'Reference image: ' + (fileName || 'None attached'),\n        end,\n      ].join('\\n');\n      const nextValue = currentNotes ? details + '\\n\\n' + currentNotes : details;\n      if (notes.value === nextValue) return false;\n      notes.value = nextValue;\n      if (notify) {\n        notes.dispatchEvent(new Event('input', { bubbles: true }));\n        notes.dispatchEvent(new Event('change', { bubbles: true }));\n      }\n      return true;\n    };\n\n    if (existing instanceof HTMLElement) {\n      placeIntake(existing);\n      existing.querySelectorAll('option').forEach((option) => {\n        if (/jewel(?:ry)?/i.test(String(option.value || '') + ' ' + String(option.text || ''))) option.remove();\n      });\n      syncDetails(existing, false);\n      return;\n    }\n\n    const intake = document.createElement('fieldset');\n    intake.className = 'urban-booking-piercing-intake';\n    intake.dataset.urbanPiercingRequestFields = 'true';\n    intake.dataset.urbanBookingStep = '3';\n    intake.innerHTML =\n      '<legend>Piercing details</legend>' +\n      '<p class=\"urban-booking-piercing-intake__intro\">Tell Michael what you are planning so the studio can prepare the right appointment.</p>' +\n      '<div class=\"urban-booking-piercing-intake__grid\">' +\n        '<label><span>Appointment type <b aria-hidden=\"true\">*</b></span><select name=\"piercing_appointment_type\" presence required><option value=\"\" selected disabled>Select one</option><option>New piercing</option><option>Check-up</option><option>Consultation</option></select></label>' +\n        '<label><span>Target placement <b aria-hidden=\"true\">*</b></span><input name=\"piercing_target_placement\" type=\"text\" presence required autocomplete=\"off\" placeholder=\"e.g. left helix, nostril, lobe\"></label>' +\n      '</div>' +\n      '<fieldset class=\"urban-booking-piercing-intake__age\"><legend>Are you 18 or older? <b aria-hidden=\"true\">*</b></legend><label><input type=\"radio\" name=\"piercing_age_confirmation\" value=\"Yes, 18 or older\" presence required> Yes, I am 18 or older</label><label><input type=\"radio\" name=\"piercing_age_confirmation\" value=\"Under 18\"> No, I am under 18</label><p data-urban-piercing-guardian hidden>Clients under 18 must attend with a parent or legal guardian carrying valid photo ID and proof of guardianship. The studio will confirm the required consent steps before booking.</p></fieldset>' +\n      '<div class=\"urban-booking-piercing-intake__grid\">' +\n        '<label><span>Material allergies or sensitivities <em>Optional</em></span><input name=\"piercing_allergies\" type=\"text\" autocomplete=\"off\" placeholder=\"e.g. nickel sensitivity\"></label>' +\n        '<label><span>Healing considerations <em>Optional</em></span><input name=\"piercing_healing_notes\" type=\"text\" autocomplete=\"off\" placeholder=\"Anything the studio should know\"></label>' +\n      '</div>' +\n      '<label class=\"urban-booking-piercing-intake__file\"><span>Reference image <em>Optional</em></span><input name=\"piercing_reference_image\" type=\"file\" accept=\"image/*\"><small>A photo of the placement or inspiration helps Michael prepare.</small></label>';\n\n    placeIntake(intake);\n    const guardian = intake.querySelector('[data-urban-piercing-guardian]');\n    const ageInputs = intake.querySelectorAll('[name=\"piercing_age_confirmation\"]');\n    const syncGuardian = () => {\n      const selected = intake.querySelector('[name=\"piercing_age_confirmation\"]:checked')?.value;\n      if (guardian instanceof HTMLElement) guardian.hidden = selected !== 'Under 18';\n    };\n    intake.addEventListener('input', () => { syncGuardian(); syncDetails(intake, true); });\n    intake.addEventListener('change', () => { syncGuardian(); syncDetails(intake, true); });\n    ageInputs.forEach((input) => input.addEventListener('change', syncGuardian));\n    form.addEventListener('submit', () => syncDetails(intake, false), true);\n\n    const label = notesField.querySelector('label, .label-content');\n    if (label) label.textContent = 'Additional notes';\n    notes.placeholder = 'Anything else you would like Michael to know.';\n    syncDetails(intake, false);\n  }\n\n  #removeJewelryBookingChoices(form) {\n    if (!(form instanceof HTMLFormElement)) return;\n\n    // Urban Ink is accepting Tattoo and Piercing bookings only. Product shopping remains\n    // available separately; this only removes Jewelry as a bookable appointment path.\n    form.querySelectorAll('[data-urban-piercing-request-fields] option').forEach((option) => {\n      if (/jewel(?:ry)?/i.test(String(option.value || '') + ' ' + String(option.text || ''))) option.remove();\n    });\n\n    const serviceField = form.querySelector('[data-urban-booking-native-service]');\n    if (!(serviceField instanceof HTMLElement)) return;\n    serviceField.querySelectorAll('option').forEach((option) => {\n      if (!/jewel(?:ry)?/i.test(String(option.value || '') + ' ' + String(option.text || ''))) return;\n      if (option.selected) {\n        const fallback = Array.from(option.parentElement?.querySelectorAll('option') || []).find((candidate) =>\n          /tattoo|pierc/i.test(String(candidate.value || '') + ' ' + String(candidate.text || '')) && !candidate.disabled\n        );\n        if (fallback) fallback.selected = true;\n      }\n      option.disabled = true;\n      option.hidden = true;\n    });\n    serviceField.querySelectorAll('input[type=\"radio\"], input[type=\"checkbox\"]').forEach((control) => {\n      const label = control.closest('label') || (control.id ? form.querySelector('label[for=\"' + CSS.escape(control.id) + '\"]') : null);\n      if (!/jewel(?:ry)?/i.test(String(control.value || '') + ' ' + String(label?.textContent || ''))) return;\n      control.checked = false;\n      control.disabled = true;\n      const wrapper = label?.closest('li, .globo-list-control, .globo-radio, .globo-checkbox') || label || control;\n      if (wrapper instanceof HTMLElement) wrapper.hidden = true;\n    });\n  }\n\n  #preparePhoneLayout(form) {\n    const isUsablePhoneInput = (input) => {\n      if (!(input instanceof HTMLInputElement)) return false;\n      const type = String(input.getAttribute('type') || 'text').toLowerCase();\n      if (['hidden', 'file', 'button', 'submit', 'checkbox', 'radio'].includes(type)) return false;\n      if (input.hidden || input.getAttribute('aria-hidden') === 'true' || input.closest('[hidden], [inert]')) return false;\n      if (input.matches('.iti__search-input, [role=\"searchbox\"]') || input.closest(PHONE_CHROME_SELECTOR)) return false;\n      return true;\n    };\n    const findPhoneInput = (field) => {\n      const labelText = field.querySelector('label, .label-content')?.textContent || '';\n      const descriptor = `${field.dataset.type || ''} ${field.dataset.elementId || ''} ${labelText}`.toLowerCase();\n      const label = field.querySelector('label[for]');\n      const labelledInput = label?.htmlFor ? document.getElementById(label.htmlFor) : null;\n      if (/phone|telephone|\\btel\\b/.test(descriptor) && isUsablePhoneInput(labelledInput) && field.contains(labelledInput)) {\n        return labelledInput;\n      }\n      const selectors = [\n        'input[data-intl-tel-input-id]',\n        'input[data-type=\"phone\"]',\n        'input[type=\"tel\"]',\n        'input[inputmode=\"tel\"]',\n        'input[autocomplete=\"tel\"]',\n        'input[autocomplete^=\"tel-\"]',\n        'input[name*=\"phone\" i]',\n        'input[id*=\"phone\" i]',\n        'input[name*=\"tel\" i]',\n        'input[id*=\"tel\" i]',\n      ];\n      for (const selector of selectors) {\n        const candidate = Array.from(field.querySelectorAll(selector)).find(isUsablePhoneInput);\n        if (candidate instanceof HTMLInputElement) return candidate;\n      }\n      if (!/phone|telephone|\\btel\\b/.test(descriptor)) return null;\n      return Array.from(field.querySelectorAll('input')).find(isUsablePhoneInput) || null;\n    };\n    const directBranch = (root, node) => {\n      if (!(root instanceof HTMLElement) || !(node instanceof HTMLElement) || !root.contains(node) || root === node) return null;\n      let branch = node;\n      while (branch.parentElement && branch.parentElement !== root) branch = branch.parentElement;\n      return branch.parentElement === root ? branch : null;\n    };\n    const setImportantStyles = (element, styles) => {\n      if (!(element instanceof HTMLElement)) return;\n      Object.entries(styles).forEach(([property, value]) => {\n        if (element.style.getPropertyValue(property) === value && element.style.getPropertyPriority(property) === 'important') return;\n        element.style.setProperty(property, value, 'important');\n      });\n    };\n\n    let phoneDropdownOpen = false;\n    form.querySelectorAll('.globo-form-control').forEach((field) => {\n      if (!(field instanceof HTMLElement)) return;\n      const input = findPhoneInput(field);\n      if (!(input instanceof HTMLInputElement)) return;\n      const phone = input.closest('.iti') || field.querySelector('.iti');\n      if (!(phone instanceof HTMLElement) || !phone.contains(input)) return;\n      const countryControl =\n        phone.querySelector(':scope > .iti__flag-container, :scope > .iti__country-container') ||\n        phone.querySelector('.iti__selected-country, .iti__selected-flag, button[aria-controls*=\"country\" i], [role=\"combobox\"][aria-controls*=\"country\" i]');\n      const inputAncestors = [];\n      let ancestor = input.parentElement;\n      while (ancestor instanceof HTMLElement && phone.contains(ancestor)) {\n        inputAncestors.push(ancestor);\n        if (ancestor === phone) break;\n        ancestor = ancestor.parentElement;\n      }\n      const layoutRoot = countryControl instanceof HTMLElement\n        ? inputAncestors.find((candidate) => candidate.contains(countryControl)) || phone\n        : phone;\n      const countryBranch = countryControl instanceof HTMLElement ? directBranch(layoutRoot, countryControl) : null;\n      const numberBranch = directBranch(layoutRoot, input);\n      const splitLayout = Boolean(countryBranch && numberBranch && countryBranch !== numberBranch);\n\n      field.dataset.urbanBookingPhoneField = 'true';\n      phone.dataset.urbanBookingPhoneWrapper = 'true';\n      layoutRoot.dataset.urbanBookingPhoneRoot = splitLayout ? 'split' : countryControl ? 'overlay' : 'single';\n      if (countryBranch instanceof HTMLElement) countryBranch.dataset.urbanBookingPhoneCountry = 'true';\n      if (numberBranch instanceof HTMLElement) numberBranch.dataset.urbanBookingPhoneNumber = 'true';\n      input.dataset.urbanBookingPhoneInput = 'true';\n      if (input.getAttribute('inputmode') !== 'tel') input.setAttribute('inputmode', 'tel');\n      if (input.getAttribute('autocomplete') !== 'tel') input.setAttribute('autocomplete', 'tel');\n\n      phoneDropdownOpen ||= this.#syncPhoneDropdownState(field, phone, layoutRoot);\n\n      setImportantStyles(phone, {\n        position: 'relative',\n        width: '100%',\n        'min-width': '0px',\n        'max-width': '100%',\n        overflow: 'visible',\n      });\n      setImportantStyles(layoutRoot, {\n        position: 'relative',\n        display: splitLayout ? 'grid' : 'block',\n        width: '100%',\n        'min-width': '0px',\n        'max-width': '100%',\n        'min-height': '48px',\n        'grid-template-columns': splitLayout ? '88px minmax(0px, 1fr)' : 'minmax(0px, 1fr)',\n        'grid-template-rows': splitLayout ? 'minmax(48px, auto)' : 'none',\n        'align-items': 'stretch',\n        overflow: 'visible',\n      });\n\n      if (splitLayout) {\n        setImportantStyles(countryBranch, {\n          position: 'relative',\n          inset: 'auto',\n          'grid-column': '1',\n          'grid-row': '1',\n          width: '88px',\n          'min-width': '88px',\n          'max-width': '88px',\n          height: '48px',\n          'box-sizing': 'border-box',\n        });\n        setImportantStyles(numberBranch, {\n          position: 'relative',\n          'grid-column': '2',\n          'grid-row': '1',\n          width: '100%',\n          'min-width': '0px',\n          'max-width': '100%',\n          'box-sizing': 'border-box',\n        });\n      } else if (countryControl instanceof HTMLElement) {\n        const overlayCountry = countryBranch || countryControl;\n        overlayCountry.dataset.urbanBookingPhoneCountry = 'true';\n        setImportantStyles(overlayCountry, {\n          position: 'absolute',\n          top: '0px',\n          right: 'auto',\n          bottom: '0px',\n          left: '0px',\n          width: '88px',\n          'min-width': '88px',\n          'max-width': '88px',\n          height: '48px',\n          'box-sizing': 'border-box',\n          'z-index': '3',\n        });\n      }\n\n      setImportantStyles(input, {\n        position: 'relative',\n        display: 'block',\n        width: '100%',\n        'min-width': '0px',\n        'max-width': '100%',\n        'min-height': '48px',\n        'box-sizing': 'border-box',\n        margin: '0px',\n        'padding-top': '12px',\n        'padding-right': '12px',\n        'padding-bottom': '12px',\n        'padding-left': splitLayout || !(countryControl instanceof HTMLElement) ? '12px' : '104px',\n        direction: 'ltr',\n        'font-size': '16px',\n        'line-height': '1.4',\n        'text-align': 'left',\n        'text-indent': '0px',\n      });\n    });\n    this.dataset.urbanBookingPhoneDropdownOpen = phoneDropdownOpen ? 'true' : 'false';\n  }\n\n  #assignFieldSteps(form) {\n    const fields = form.querySelectorAll('.globo-form-control');\n    fields.forEach((field) => {\n      if (!(field instanceof HTMLElement)) return;\n      const controls = Array.from(field.querySelectorAll('input, select, textarea'));\n      const names = controls.map((control) => `${control.name} ${control.id}`).join(' ');\n      const label = field.querySelector('label, .label-content')?.textContent || '';\n      const type = field.dataset.type || '';\n      const choiceText = Array.from(\n        field.querySelectorAll('option, input[type=\"radio\"], input[type=\"checkbox\"]')\n      )\n        .map((choice) => {\n          const wrappedLabel = choice.closest('label');\n          const linkedLabel = choice.id ? field.querySelector(`label[for=\"${CSS.escape(choice.id)}\"]`) : null;\n          return `${choice.value || ''} ${choice.textContent || ''} ${wrappedLabel?.textContent || ''} ${linkedLabel?.textContent || ''}`;\n        })\n        .join(' ');\n      const text = `${type} ${names} ${label} ${choiceText}`.replace(/\\s+/g, ' ').trim().toLowerCase();\n      const hasServiceChoices = Boolean(\n        choiceText && (isTemporarilyUnavailableBookingService(choiceText) || isTattooService(choiceText))\n      );\n\n      delete field.dataset.urbanBookingNativeService;\n      delete field.dataset.urbanBookingNativeArtist;\n\n      if (type === 'hidden' || (controls.length && controls.every((control) => control.type === 'hidden'))) {\n        field.dataset.urbanBookingStep = 'hidden';\n        return;\n      }\n\n      if ((/\\bservice\\b/.test(text) || hasServiceChoices) && !/other services/.test(text)) {\n        field.dataset.urbanBookingStep = '1';\n        field.dataset.urbanBookingNativeService = 'true';\n      } else if (/artist|piercer|preference|prefer artist/.test(text)) {\n        field.dataset.urbanBookingStep = '2';\n        field.dataset.urbanBookingNativeArtist = 'true';\n      } else if (/email|phone|18\\+|years old|consent|where you located|city|contact|first name|last name/.test(text) || /^name\\b/.test(text)) {\n        field.dataset.urbanBookingStep = '4';\n      } else {\n        field.dataset.urbanBookingStep = '3';\n      }\n    });\n\n    const serviceControl = form.querySelector('[data-urban-booking-native-service] input, [data-urban-booking-native-service] select');\n    this.dataset.urbanBookingServiceField = serviceControl ? 'ready' : 'missing';\n  }\n\n  #removeUnavailablePiercingOptions(form) {\n    if (!(form instanceof HTMLFormElement) || this.dataset.urbanBookingPiercingEnabled === 'true') {\n      return;\n    }\n\n    const serviceField = form.querySelector('[data-urban-booking-native-service]');\n    let hiddenOptions = 0;\n    let tattooServiceLocked = false;\n    const optionLabel = (control) => {\n      if (!(control instanceof HTMLElement)) return null;\n      if (control.closest('label') instanceof HTMLLabelElement) return control.closest('label');\n      if (!control.id) return null;\n      return form.querySelector(`label[for=\"${CSS.escape(control.id)}\"]`);\n    };\n    const optionRoot = (control) => {\n      if (!(control instanceof HTMLElement)) return null;\n      const label = control instanceof HTMLOptionElement ? null : optionLabel(control);\n      const fromLabel = label?.closest(\n        'li, .globo-list-control, .globo-radio, .globo-checkbox, .globo-form-control-option, [role=\"radio\"], [role=\"option\"], [data-option]'\n      );\n      if (fromLabel instanceof HTMLElement) return fromLabel;\n      if (label instanceof HTMLElement) return label;\n      return control.closest(\n        'li, .globo-list-control, .globo-radio, .globo-checkbox, .globo-form-control-option, [role=\"radio\"], [role=\"option\"], [data-option], button, a'\n      ) || control;\n    };\n    const controlDescription = (control) => {\n      const label = optionLabel(control);\n      const optionText = control instanceof HTMLOptionElement ? control.text : control.textContent;\n      return `${control.value || ''} ${optionText || ''} ${label?.textContent || ''}`;\n    };\n\n    const candidateFields = Array.from(form.querySelectorAll('.globo-form-control')).filter((field) => {\n      if (!(field instanceof HTMLElement)) return false;\n      if (field === serviceField) return true;\n      return Array.from(field.querySelectorAll('option, input[type=\"radio\"], input[type=\"checkbox\"]')).some((choice) =>\n        isTemporarilyUnavailableBookingService(controlDescription(choice))\n      );\n    });\n    const controlRoots = candidateFields.length ? candidateFields : [form];\n    const hideChoice = (choice) => {\n      if (!(choice instanceof HTMLElement)) return;\n      choice.hidden = true;\n      choice.setAttribute('inert', '');\n      choice.setAttribute('aria-hidden', 'true');\n      choice.style.setProperty('display', 'none', 'important');\n    };\n    const markServiceContext = (control) => {\n      control.dataset.urbanBookingAutofill = 'service';\n    };\n    const lockNativeServiceToTattoo = (field) => {\n      if (!(field instanceof HTMLElement)) return false;\n      let locked = false;\n      field.querySelectorAll('select, input').forEach((control) => {\n        if (control instanceof HTMLSelectElement) {\n          const tattooOption = Array.from(control.options).find((option) =>\n            isTattooService(`${option.value} ${option.text}`)\n          );\n          if (!tattooOption) return;\n          const changed = control.value !== tattooOption.value;\n          control.value = tattooOption.value;\n          if (changed) markServiceContext(control);\n          locked = true;\n          return;\n        }\n        if (!(control instanceof HTMLInputElement)) return;\n        if (/radio|checkbox/.test(control.type)) {\n          if (!isTattooService(controlDescription(control))) return;\n          const changed = !control.checked;\n          control.checked = true;\n          if (changed) markServiceContext(control);\n          locked = true;\n          return;\n        }\n        if (/hidden|submit|button|file/.test(control.type)) return;\n        const changed = control.value !== 'Tattoo';\n        control.value = 'Tattoo';\n        if (changed) markServiceContext(control);\n        locked = true;\n      });\n      return locked;\n    };\n\n    tattooServiceLocked = lockNativeServiceToTattoo(serviceField);\n\n    controlRoots.forEach((controlRoot) => {\n      controlRoot.querySelectorAll('select').forEach((select) => {\n        const unavailableOptions = Array.from(select.options).filter((option) => {\n          const description = `${option.value} ${option.text}`;\n          return controlRoot === serviceField\n            ? !isTattooService(description)\n            : isTemporarilyUnavailableBookingService(description);\n        });\n        unavailableOptions.forEach((option) => {\n          option.disabled = true;\n          option.hidden = true;\n          hiddenOptions += 1;\n        });\n\n        if (controlRoot === serviceField || isTemporarilyUnavailableBookingService(select.value)) {\n          const tattooOption = Array.from(select.options).find(\n            (option) => !option.disabled && isTattooService(`${option.value} ${option.text}`)\n          );\n          if (tattooOption) select.value = tattooOption.value;\n        }\n      });\n\n      const choiceControls = Array.from(controlRoot.querySelectorAll('input[type=\"radio\"], input[type=\"checkbox\"]'));\n      choiceControls.forEach((control) => {\n        const description = controlDescription(control);\n        const unavailable = controlRoot === serviceField\n          ? !isTattooService(description)\n          : isTemporarilyUnavailableBookingService(description);\n        if (!unavailable) return;\n        control.checked = false;\n        control.disabled = true;\n        control.hidden = true;\n        const label = optionLabel(control);\n        hideChoice(optionRoot(control));\n        hiddenOptions += 1;\n      });\n\n      if (\n        controlRoot instanceof HTMLElement &&\n        choiceControls.length > 0 &&\n        choiceControls.every((control) => {\n          const description = controlDescription(control);\n          return controlRoot === serviceField\n            ? !isTattooService(description)\n            : isTemporarilyUnavailableBookingService(description);\n        })\n      ) {\n        hideChoice(controlRoot);\n      }\n    });\n\n    if (serviceField instanceof HTMLElement && tattooServiceLocked) {\n      serviceField.dataset.urbanBookingTattooLocked = 'true';\n      hideChoice(serviceField);\n    }\n\n    form\n      .querySelectorAll(\n        'label, button, a, li, [role=\"radio\"], [role=\"option\"], [role=\"button\"], .globo-list-control, .globo-radio, .globo-checkbox, .globo-form-control-option, [data-option]'\n      )\n      .forEach((choice) => {\n        if (!(choice instanceof HTMLElement) || choice.closest('[data-urban-booking-native-service]')) return;\n        const choiceText = `${choice.textContent || ''} ${choice.getAttribute('aria-label') || ''}`;\n        if (!isTemporarilyUnavailableBookingService(choiceText) || isTattooService(choiceText)) return;\n        hideChoice(optionRoot(choice));\n        hiddenOptions += 1;\n      });\n\n    this.dataset.urbanBookingPiercingNativeOptions = hiddenOptions\n      ? candidateFields.length\n        ? 'hidden'\n        : 'hidden-fallback'\n      : candidateFields.length\n        ? 'none'\n        : 'not-applicable';\n  }\n\n  #ensureTattooArtistOptions(select) {\n    if (!(select instanceof HTMLSelectElement) || this.#service !== 'Tattoo') return;\n    ['Yi', 'Eric'].forEach((artist) => {\n      const exists = Array.from(select.options).some((option) =>\n        normalizeValue(option.value || option.text) === normalizeValue(artist)\n      );\n      if (exists) return;\n      const option = document.createElement('option');\n      option.value = artist;\n      option.text = artist;\n      select.append(option);\n    });\n  }\n\n  #prepareArtistControl(form) {\n    if (!(form instanceof HTMLFormElement)) {\n      this.dataset.urbanBookingArtistField = 'loading';\n      this.#buildArtistChoices(null);\n      return;\n    }\n    const fixedArtist = cleanFlashValue(\n      this.#service === 'Piercing' ? this.#formMount?.dataset.urbanBookingFixedArtist : ''\n    );\n    if (fixedArtist) {\n      this.#artist = fixedArtist;\n      this.dataset.urbanBookingArtistField = 'fixed';\n      this.#buildArtistChoices(null, fixedArtist);\n      this.#syncSummary();\n      return;\n    }\n    const artistField = form.querySelector('[data-urban-booking-native-artist]');\n    const select = artistField?.querySelector('select');\n    this.#ensureTattooArtistOptions(select);\n    if (!(select instanceof HTMLSelectElement)) {\n      const fixedArtist = normalizeValue(\n        this.#service === 'Piercing' ? this.#formMount?.dataset.urbanBookingFixedArtist : ''\n      );\n      if (fixedArtist) {\n        this.#artist = fixedArtist;\n        this.dataset.urbanBookingArtistField = 'fixed';\n        this.#buildArtistChoices(null, fixedArtist);\n        this.#syncSummary();\n        return;\n      }\n      this.dataset.urbanBookingArtistField = 'missing';\n      this.#buildArtistChoices(null);\n      return;\n    }\n\n    this.dataset.urbanBookingArtistField = 'ready';\n    const requestedArtist = normalizeValue(this.#artist);\n    const match = Array.from(select.options).find(\n      (option) => option.value && normalizeValue(option.value || option.text) === requestedArtist\n    );\n    const previousValue = select.value;\n    select.value = match ? match.value : '';\n    this.#artist = select.value;\n    if (select.value !== previousValue) {\n      select.dataset.urbanBookingAutofill = 'artist';\n    }\n    this.#buildArtistChoices(select);\n  }\n\n  #buildArtistChoices(select, fixedArtist = '') {\n    const holders = Array.from(this.querySelectorAll('[data-urban-booking-artist-choices]')).filter(\n      (holder) => holder instanceof HTMLElement\n    );\n    if (!holders.length) return;\n    const options = select instanceof HTMLSelectElement\n      ? Array.from(select.options).filter((option) => option.value && !option.disabled)\n      : [];\n    const signature = JSON.stringify({\n      state: fixedArtist ? 'fixed' : select instanceof HTMLSelectElement ? (options.length ? 'ready' : 'empty') : 'missing',\n      fixedArtist,\n      selected: select instanceof HTMLSelectElement ? select.value : '',\n      options: options.map((option) => [option.value, option.text]),\n    });\n\n    holders.forEach((holder) => {\n      if (holder.dataset.urbanBookingArtistSignature === signature) return;\n      holder.dataset.urbanBookingArtistSignature = signature;\n      holder.replaceChildren();\n\n    if (!(select instanceof HTMLSelectElement)) {\n      if (fixedArtist) {\n        const choice = document.createElement('div');\n        choice.className = 'urban-booking-sheet__choice urban-booking-sheet__choice--fixed-artist';\n        const copy = document.createElement('span');\n        copy.className = 'urban-booking-sheet__choice-copy';\n        const title = document.createElement('span');\n        title.className = 'urban-booking-sheet__choice-title';\n        title.textContent = fixedArtist;\n        const detail = document.createElement('span');\n        detail.className = 'urban-booking-sheet__choice-detail';\n        detail.textContent = 'Your piercing request will be reviewed with Michael';\n        copy.append(title, detail);\n        choice.append(copy);\n        holder.append(choice);\n        return;\n      }\n      const note = document.createElement('p');\n      note.className = 'urban-booking-sheet__empty-note';\n      note.textContent = 'No preference \u2014 we will make a personal match.';\n      holder.append(note);\n      return;\n    }\n\n    if (!options.length) {\n      const note = document.createElement('p');\n      note.className = 'urban-booking-sheet__empty-note';\n      note.textContent = 'Artist choices are still loading.';\n      holder.append(note);\n      return;\n    }\n\n    options.forEach((option) => {\n      const button = document.createElement('button');\n      button.type = 'button';\n      button.className = 'urban-booking-sheet__choice';\n      button.dataset.urbanBookingArtistOption = option.value;\n      button.setAttribute('aria-pressed', String(select.value === option.value));\n\n      const copy = document.createElement('span');\n      copy.className = 'urban-booking-sheet__choice-copy';\n      const title = document.createElement('span');\n      title.className = 'urban-booking-sheet__choice-title';\n      title.textContent = option.text;\n      const detail = document.createElement('span');\n      detail.className = 'urban-booking-sheet__choice-detail';\n      detail.textContent = /no preference/i.test(option.value || option.text)\n        ? 'Let us make a personal match'\n        : 'Preferred artist';\n      copy.append(title, detail);\n\n      const check = document.createElement('img');\n      check.className = 'urban-booking-sheet__choice-check';\n      check.src = this.dataset.urbanBookingCheckIcon || '';\n      check.alt = '';\n      check.width = 18;\n      check.height = 18;\n      button.append(copy, check);\n      holder.append(button);\n    });\n    });\n  }\n\n  #selectArtist(value) {\n    const select = this.#form?.querySelector('[data-urban-booking-native-artist] select');\n    if (!(select instanceof HTMLSelectElement)) return;\n    select.value = value;\n    select.dispatchEvent(new Event('input', { bubbles: true }));\n    select.dispatchEvent(new Event('change', { bubbles: true }));\n    this.#artist = select.value;\n    this.#syncArtistChoices(select);\n    this.#syncSummary();\n  }\n\n  #syncArtistChoices(select) {\n    if (!(select instanceof HTMLSelectElement)) return;\n    this.querySelectorAll('[data-urban-booking-artist-option]').forEach((button) => {\n      button.setAttribute(\n        'aria-pressed',\n        String(button.getAttribute('data-urban-booking-artist-option') === select.value)\n      );\n    });\n  }\n\n  #setService(value) {\n    const requestedService = normalizeService(value);\n    this.#service =\n      requestedService === 'Piercing' && !this.#hasExpectedPiercingForm()\n        ? 'Tattoo'\n        : requestedService;\n    this.dataset.activeService = this.#service.toLowerCase();\n    this.#syncPiercingAppointmentPresentation();\n    this.querySelectorAll('[data-urban-booking-service-option]').forEach((button) => {\n      button.setAttribute(\n        'aria-pressed',\n        String(button.getAttribute('data-urban-booking-service-option') === this.#service)\n      );\n    });\n    this.#activateFormMount();\n    if (this.#mobileOpen) this.#moveActiveMountToMobile();\n    this.#configureForm();\n    this.#syncSummary();\n  }\n\n\n  #syncPiercingAppointmentPresentation() {\n    const isPiercing = this.#service === 'Piercing' && !this.#flash;\n    this.toggleAttribute('data-urban-booking-piercing-flow', isPiercing);\n    const setCopy = (selector, piercingText) => {\n      this.querySelectorAll(selector).forEach((element) => {\n        if (!(element instanceof HTMLElement)) return;\n        if (!element.dataset.urbanBookingDefaultText) {\n          element.dataset.urbanBookingDefaultText = element.textContent || '';\n        }\n        element.textContent = isPiercing ? piercingText : element.dataset.urbanBookingDefaultText;\n      });\n    };\n    setCopy('.urban-booking-sheet__eyebrow', 'Piercing appointment \u00B7 Michael');\n    setCopy('.urban-booking-sheet__title', 'Plan your piercing');\n    setCopy('[data-urban-booking-step-copy=\"3\"] h3', 'A little context goes a long way.');\n    setCopy('[data-urban-booking-step-copy=\"4\"] h3', 'How should Michael reach you?');\n    this.querySelectorAll('[data-urban-booking-progress-step=\"3\"] > span:last-child').forEach((label) => {\n      if (label instanceof HTMLElement) label.textContent = isPiercing ? 'Details' : 'Project';\n    });\n    this.querySelectorAll('[data-urban-booking-progress-step=\"4\"] > span:last-child').forEach((label) => {\n      if (label instanceof HTMLElement) label.textContent = 'Contact';\n    });\n  }\n\n  #syncFormContext() {\n    if (!(this.#form instanceof HTMLFormElement)) return;\n    const pageHref = this.#form.querySelector('input[name=\"page[href]\"]');\n    if (pageHref instanceof HTMLInputElement) {\n      const value = new URL(window.location.href);\n      value.searchParams.set('service', this.#service);\n      if (this.#artist) value.searchParams.set('artist_name', this.#artist);\n      if (this.#flash?.handle) value.searchParams.set('flash', this.#flash.handle);\n      value.hash = this.#mobileOpen ? 'UrbanMobileBookingPage' : 'UrbanBookingSheet';\n      pageHref.value = value.toString();\n    }\n\n    const serviceField = this.#form.querySelector('[data-urban-booking-native-service]');\n    const controls = serviceField?.querySelectorAll('input, select') || [];\n    let serviceMatched = false;\n    controls.forEach((control) => {\n      const previousValue = control.value;\n      const previousChecked = control instanceof HTMLInputElement ? control.checked : false;\n      if (control instanceof HTMLSelectElement) {\n        const match = Array.from(control.options).find(\n          (option) => normalizeValue(option.value || option.text) === normalizeValue(this.#service)\n        );\n        if (match) {\n          control.value = match.value;\n          serviceMatched = true;\n        }\n      } else if (control instanceof HTMLInputElement && /radio|checkbox/.test(control.type)) {\n        control.checked = normalizeValue(control.value) === normalizeValue(this.#service);\n        if (control.checked) serviceMatched = true;\n      } else if (control instanceof HTMLInputElement) {\n        control.value = this.#service;\n        serviceMatched = true;\n      }\n      const changed =\n        control.value !== previousValue ||\n        (control instanceof HTMLInputElement && control.checked !== previousChecked);\n      if (changed) control.dataset.urbanBookingAutofill = 'service';\n    });\n    this.dataset.urbanBookingServiceSync = serviceField\n      ? serviceMatched\n        ? 'ready'\n        : 'unmatched'\n      : 'metadata-only';\n    this.#syncFlashFormContext();\n  }\n\n  #syncFlashSelection() {\n    const flash = this.#flash;\n    this.toggleAttribute('data-urban-booking-flash', Boolean(flash));\n    this.querySelectorAll('[data-urban-booking-flash-selection]').forEach((selection) => {\n      if (!(selection instanceof HTMLElement)) return;\n      selection.hidden = !flash;\n      if (!flash) return;\n      const setText = (selector, value) => {\n        const node = selection.querySelector(selector);\n        if (node) node.textContent = value || '\u2014';\n      };\n      setText('[data-urban-booking-flash-title]', flash.title || flash.handle.replace(/-/g, ' '));\n      setText('[data-urban-booking-flash-artist]', flash.artist ? `By ${flash.artist}` : 'Artist confirmed after review');\n      setText('[data-urban-booking-flash-price]', flash.price || 'Confirmed during consultation');\n      setText('[data-urban-booking-flash-size]', flash.size || 'Confirmed with your artist');\n      const image = selection.querySelector('[data-urban-booking-flash-image]');\n      if (image instanceof HTMLImageElement) {\n        image.hidden = !flash.image;\n        if (flash.image) {\n          image.src = flash.image;\n          image.alt = flash.title ? `${flash.title} Flash Tattoo` : 'Selected Flash Tattoo';\n        } else {\n          image.removeAttribute('src');\n          image.alt = '';\n        }\n      }\n    });\n  }\n\n  async #hydrateFlash() {\n    const flash = this.#flash;\n    if (!flash?.handle || (flash.title && flash.image)) return;\n    const token = ++this.#flashHydrationToken;\n    try {\n      const response = await fetch(`/products/${encodeURIComponent(flash.handle)}.js`, {\n        headers: { Accept: 'application/json' },\n      });\n      if (!response.ok) return;\n      const product = await response.json();\n      if (token !== this.#flashHydrationToken || this.#flash?.handle !== flash.handle) return;\n      this.#flash = normalizeFlashContext({\n        ...flash,\n        title: flash.title || product.title,\n        image: flash.image || product.featured_image,\n        url: flash.url || product.url || `/products/${flash.handle}`,\n        price: flash.price || (Number(product.price) > 0 ? new Intl.NumberFormat(document.documentElement.lang || 'en-US', { style: 'currency', currency: window.Shopify?.currency?.active || 'USD' }).format(product.price / 100) : ''),\n      });\n      this.#syncFlashSelection();\n      this.#syncFormContext();\n    } catch (_error) {\n    }\n  }\n\n  #syncFlashFormContext() {\n    if (!(this.#form instanceof HTMLFormElement) || !this.#flash) return;\n    const flash = this.#flash;\n    const flashUrl = new URL(flash.url || `/products/${flash.handle}`, window.location.origin).toString();\n    const lines = [\n      `Flash request: ${flash.title || flash.handle}`,\n      flash.artist ? `Artist: ${flash.artist}` : '',\n      `Flash page: ${flashUrl}`,\n    ].filter(Boolean);\n    const summary = lines.join('\\n');\n    const fields = Array.from(this.#form.querySelectorAll('.globo-form-control')).filter((field) => field instanceof HTMLElement);\n    const descriptor = (field) => `${field.dataset.type || ''} ${field.textContent || ''} ${Array.from(field.querySelectorAll('input, textarea')).map((control) => `${control.name} ${control.id}`).join(' ')}`.toLowerCase();\n    const dedicated = fields.find((field) => /selected flash|flash tattoo|flash design/.test(descriptor(field)) && !/upload|file/.test(descriptor(field)));\n    const designIdea = fields.find((field) => /design idea|design concept|project description/.test(descriptor(field)));\n    const targetField = dedicated || designIdea;\n    const control = targetField?.querySelector('textarea, input:not([type=\"hidden\"]):not([type=\"file\"])');\n    if (!(control instanceof HTMLInputElement || control instanceof HTMLTextAreaElement)) return;\n    const priorAutoValue = control.dataset.urbanFlashPrefillValue || '';\n    if (this.#flashPrefillApplied && control.value.trim() && control.value !== priorAutoValue) return;\n    if (control.value === summary) {\n      this.#flashPrefillApplied = true;\n      return;\n    }\n    control.value = summary;\n    control.dataset.urbanFlashPrefillValue = summary;\n    this.#flashPrefillApplied = true;\n    control.dataset.urbanBookingAutofill = 'flash';\n    // This is booking context, not visitor input. Keep it out of form_start listeners.\n  }\n\n  #firstBookingStep() {\n    return Number(this.dataset.urbanBookingFirstStep) === 2 ? 2 : 1;\n  }\n\n  #flowFirstStep() {\n    if (this.#service === 'Piercing' && !this.#flash) return 3;\n    if (this.#service === 'Tattoo' && !this.#flash) return 2;\n    return this.#firstBookingStep();\n  }\n\n  #stepStatus(step) {\n    if (this.#service === 'Piercing' && !this.#flash) {\n      return 'Step ' + Math.max(1, step - 2) + ' of 2: ' + (step === 3 ? 'Details' : 'Contact');\n    }\n    const firstStep = this.#flowFirstStep();\n    const current = Math.max(1, step - firstStep + 1);\n    const total = 5 - firstStep;\n    const prefix = firstStep === 2 ? 'Tattoo confirmed. ' : '';\n    return prefix + 'Step ' + current + ' of ' + total + ': ' + STEP_LABELS[step - 1];\n  }\n\n  #setStep(step) {\n    const previousStep = this.#step;\n    const firstStep = this.#flowFirstStep();\n    this.#clearActiveField();\n    this.#step = Math.min(4, Math.max(firstStep, Number(step) || firstStep));\n    this.dataset.urbanBookingStep = String(this.#step);\n    this.querySelectorAll('[data-urban-piercing-request-fields]').forEach((intake) => {\n      if (intake instanceof HTMLElement) intake.hidden = this.#service !== 'Piercing' || this.#step !== 3;\n    });\n    this.querySelectorAll('[data-urban-booking-step-copy]').forEach((copy) => {\n      copy.hidden = copy.getAttribute('data-urban-booking-step-copy') !== String(this.#step);\n    });\n    this.querySelectorAll('[data-urban-booking-progress-step]').forEach((item) => {\n      const itemStep = Number(item.getAttribute('data-urban-booking-progress-step'));\n      item.toggleAttribute('data-complete', itemStep < this.#step);\n      if (itemStep === this.#step) item.setAttribute('aria-current', 'step');\n      else item.removeAttribute('aria-current');\n    });\n\n    this.querySelectorAll('[data-urban-booking-back]').forEach((back) => {\n      if (back instanceof HTMLButtonElement) back.hidden = this.#step === firstStep;\n    });\n    this.querySelectorAll('[data-urban-booking-next]').forEach((next) => {\n      if (!(next instanceof HTMLButtonElement)) return;\n      next.disabled = this.#nativeSubmitting;\n      next.toggleAttribute('aria-busy', this.#nativeSubmitting);\n      const label = next.querySelector('[data-urban-booking-next-label]');\n      if (label) label.textContent = this.#step === 4 ? next.dataset.submitLabel || 'Send request' : next.dataset.nextLabel || 'Continue';\n    });\n    this.querySelectorAll('[data-urban-booking-step-error]').forEach((error) => {\n      if (!(error instanceof HTMLElement)) return;\n      error.hidden = true;\n      error.textContent = '';\n    });\n    this.querySelectorAll('[data-urban-booking-step-status]').forEach((status) => {\n      if (!(status instanceof HTMLElement)) return;\n      status.textContent = this.#stepStatus(this.#step);\n    });\n    this.#syncSummary();\n    this.#syncDebugState();\n\n    const scroller = this.#mobileOpen\n      ? this.querySelector('[data-urban-booking-mobile-page] .urban-booking-mobile-page__body')\n      : this.querySelector('[data-urban-booking-scroll]');\n    window.cancelAnimationFrame(this.#stepScrollFrame);\n    if ((this.refs.dialog.open || this.#mobileOpen) && previousStep !== this.#step) {\n      const scope = this.#mobileOpen ? this.querySelector('[data-urban-booking-mobile-page]') : this.refs.dialog;\n      const heading = scope?.querySelector(\n        `[data-urban-booking-step-copy=\"${this.#step}\"] h3`\n      );\n      if (heading instanceof HTMLElement) {\n        heading.focus({ preventScroll: true });\n      }\n      this.#stepScrollFrame = window.requestAnimationFrame(() => {\n        this.#stepScrollFrame = 0;\n        if (scroller instanceof HTMLElement) scroller.scrollTop = 0;\n      });\n    }\n  }\n\n  #syncSummary() {\n    const select = this.#form?.querySelector('[data-urban-booking-native-artist] select');\n    this.querySelectorAll('[data-urban-booking-summary-service]').forEach((service) => {\n      service.textContent = this.#service;\n    });\n    this.querySelectorAll('[data-urban-booking-summary-artist]').forEach((artist) => {\n      artist.textContent = select instanceof HTMLSelectElement && select.value\n        ? select.value\n        : this.#artist || 'No preference';\n    });\n  }\n\n  #handleFormInput = (event) => {\n    const control = event.target;\n    if (!(control instanceof HTMLElement)) return;\n    control.removeAttribute('aria-invalid');\n    control.closest('.globo-form-control')?.classList.remove('urban-booking-field--invalid');\n    if (control.closest('[data-urban-booking-native-artist]')) {\n      const select = control instanceof HTMLSelectElement ? control : null;\n      if (select) {\n        this.#artist = select.value;\n        this.#syncArtistChoices(select);\n        this.#syncSummary();\n      }\n    }\n  };\n\n  #validateStep(step) {\n    if (step === 1) {\n      if (this.dataset.urbanBookingFormState === 'invalid') {\n        this.#showStepError('The booking form is not configured for this request. Please contact the studio.');\n        return false;\n      }\n      if (this.dataset.urbanBookingFormState !== 'ready') {\n        this.#showStepError('The secure form is still loading. Please try again in a moment.');\n        return false;\n      }\n      if (this.dataset.urbanBookingServiceSync === 'unmatched') {\n        this.#showStepError('This service is not available in the booking form yet. Please contact the studio.');\n        return false;\n      }\n      return Boolean(this.#service);\n    }\n    if (!(this.#form instanceof HTMLFormElement)) {\n      this.#showStepError('The secure form is still loading. Please try again in a moment.');\n      return false;\n    }\n\n    if (step === 2) {\n      const artistField = this.#form.querySelector('[data-urban-booking-native-artist]');\n      const artistSelect = artistField?.querySelector('select');\n      const artistRequired =\n        artistSelect instanceof HTMLSelectElement &&\n        (artistSelect.hasAttribute('presence') || artistSelect.required);\n      if (artistRequired && !artistSelect.value) {\n        artistSelect.setAttribute('aria-invalid', 'true');\n        artistField.classList.add('urban-booking-field--invalid');\n        this.#showStepError('Choose an available artist before continuing.');\n        window.requestAnimationFrame(() => {\n          window.requestAnimationFrame(() => {\n            const scope = this.#mobileOpen ? this.querySelector('[data-urban-booking-mobile-page]') : this;\n            const firstChoice = scope?.querySelector('[data-urban-booking-artist-option]');\n            if (firstChoice instanceof HTMLElement) firstChoice.focus({ preventScroll: false });\n          });\n        });\n        return false;\n      }\n    }\n\n    const fields = Array.from(\n      this.#form.querySelectorAll(\n        `.globo-form-control[data-urban-booking-step=\"${step}\"], [data-urban-piercing-request-fields][data-urban-booking-step=\"${step}\"]`\n      )\n    ).filter((field) => field instanceof HTMLElement && isVisible(field));\n    let firstInvalid = null;\n\n    fields.forEach((field) => {\n      const required = Array.from(field.querySelectorAll('[presence]')).filter(\n        (control) => !control.disabled && control.type !== 'hidden'\n      );\n      if (!required.length) return;\n\n      const groups = new Map();\n      required.forEach((control) => {\n        const key = /checkbox|radio/.test(control.type) ? control.name : `${control.name}-${control.id}`;\n        if (!groups.has(key)) groups.set(key, []);\n        groups.get(key).push(control);\n      });\n\n      let fieldInvalid = false;\n      groups.forEach((controls) => {\n        const invalid = controls[0].type === 'checkbox' || controls[0].type === 'radio'\n          ? !controls.some((control) => control.checked)\n          : controls.every((control) => !String(control.value || '').trim());\n        if (!invalid) return;\n        fieldInvalid = true;\n        controls.forEach((control) => control.setAttribute('aria-invalid', 'true'));\n        if (!firstInvalid) firstInvalid = controls.find((control) => isVisible(control)) || controls[0];\n      });\n      field.classList.toggle('urban-booking-field--invalid', fieldInvalid);\n    });\n\n    if (!firstInvalid) return true;\n    this.#showStepError('Complete the required fields before continuing.');\n    if (shouldUseMobileFieldEditor() && this.#canMirrorControl(firstInvalid)) {\n      this.#openFieldEditor(firstInvalid, true);\n    } else {\n      firstInvalid.focus({ preventScroll: false });\n    }\n    return false;\n  }\n\n  #showStepError(message) {\n    this.querySelectorAll('[data-urban-booking-step-error]').forEach((error) => {\n      if (!(error instanceof HTMLElement)) return;\n      error.textContent = message;\n      error.hidden = false;\n    });\n  }\n\n  #submitNativeForm() {\n    if (!this.#validateStep(4) || !(this.#form instanceof HTMLFormElement)) return;\n    const submit = this.#form.querySelector(NATIVE_SUBMIT_SELECTOR);\n    if (!(submit instanceof HTMLButtonElement)) {\n      this.#showStepError('The secure submit control is still loading. Please try again.');\n      return;\n    }\n    if (submit.disabled) {\n      this.#showStepError('The secure form is still processing. Please wait or reload the page before trying again.');\n      return;\n    }\n    this.#nativeSubmitting = false;\n    this.#setSubmitBusy(true);\n    // Submit through the real HTML form lifecycle. This reaches Globo's own\n    // submit listener even though its visual wizard button is hidden by our UI.\n    try {\n      if (typeof this.#form.requestSubmit === 'function') this.#form.requestSubmit(submit);\n      else submit.click();\n    } catch (_error) {\n      submit.click();\n    }\n    if (!this.#nativeSubmitting) {\n      window.setTimeout(() => {\n        if (this.#nativeSubmitting) return;\n        if (!this.#routeToFirstAppError()) {\n          this.#showStepError('We could not submit your request yet. Please try again in a moment.');\n        }\n        this.#setSubmitBusy(false);\n      }, 1100);\n    }\n  }\n\n  #setSubmitBusy(busy) {\n    this.querySelectorAll('[data-urban-booking-next]').forEach((next) => {\n      if (!(next instanceof HTMLButtonElement)) return;\n      next.disabled = busy;\n      next.toggleAttribute('aria-busy', busy);\n    });\n  }\n\n  #observeSubmissionState() {\n    if (!(this.#form instanceof HTMLFormElement)) return;\n    this.#submissionObserver?.disconnect();\n    this.#submissionObserver = new MutationObserver(this.#inspectSubmissionState);\n    this.#submissionObserver.observe(this.#form, {\n      attributes: true,\n      attributeFilter: ['class', 'disabled', 'hidden', 'style'],\n      childList: true,\n      characterData: true,\n      subtree: true,\n    });\n    window.requestAnimationFrame(this.#inspectSubmissionState);\n  }\n\n  #inspectSubmissionState = () => {\n    if (!this.#nativeSubmitting || !(this.#form instanceof HTMLFormElement)) return;\n    if (this.dataset.urbanBookingSubmitted === 'true') return;\n    const submit = this.#form.querySelector(NATIVE_SUBMIT_SELECTOR);\n    const error = Array.from(\n      this.#form.querySelectorAll('.message.error, .text-danger, .errors-list, [role=\"alert\"]')\n    ).find((element) => element instanceof HTMLElement && isVisible(element) && element.textContent.trim());\n    const loading = submit instanceof HTMLButtonElement && submit.classList.contains('loading');\n    if (!error && loading) return;\n\n    this.#submissionObserver?.disconnect();\n    this.#nativeSubmitting = false;\n    this.#setSubmitBusy(false);\n    if (this.#routeToFirstAppError()) return;\n    const message = error?.textContent?.replace(/\\s+/g, ' ').trim();\n    this.#showStepError(\n      message || 'We could not confirm the request. Review the form message before trying again.'\n    );\n  }\n\n  #routeToFirstAppError() {\n    if (!(this.#form instanceof HTMLFormElement)) return;\n    const invalid = Array.from(\n      this.#form.querySelectorAll('.globo-form-control.errors, .globo-form-control:has([aria-invalid=\"true\"]), .block-container.errors .globo-form-control, .block-container.errors [name]')\n    ).find((field) => field instanceof HTMLElement);\n    if (!(invalid instanceof HTMLElement)) return false;\n    const step = Number(invalid.getAttribute('data-urban-booking-step'));\n    if (step >= 2 && step <= 4 && step !== this.#step) this.#setStep(step);\n    if (step === 2) {\n      window.requestAnimationFrame(() => {\n        window.requestAnimationFrame(() => {\n          const scope = this.#mobileOpen ? this.querySelector('[data-urban-booking-mobile-page]') : this;\n          const firstChoice = scope?.querySelector('[data-urban-booking-artist-option]');\n          if (firstChoice instanceof HTMLElement) firstChoice.focus({ preventScroll: false });\n        });\n      });\n      this.#showStepError('Choose an available artist before continuing.');\n      return true;\n    }\n    const control = invalid.querySelector('input:not([type=\"hidden\"]), select, textarea, button');\n    if (control instanceof HTMLElement && isVisible(control)) {\n      window.requestAnimationFrame(() => {\n        if (shouldUseMobileFieldEditor() && this.#canMirrorControl(control)) {\n          this.#openFieldEditor(control, true);\n        } else {\n          control.focus({ preventScroll: false });\n        }\n      });\n    }\n    this.#showStepError('Review the highlighted field before continuing.');\n    return true;\n  }\n\n  #openFromCurrentUrl() {\n    let url;\n    try {\n      url = new URL(window.location.href);\n    } catch (_error) {\n      return;\n    }\n    if (!BOOKING_HASHES.has(url.hash)) return;\n    const requestedService = normalizeService(url.searchParams.get('service') || 'Tattoo');\n    const artist =\n      url.searchParams.get('artist_name') ||\n      url.searchParams.get('preferred_artist') ||\n      url.searchParams.get('artist') ||\n      '';\n    const flashHandle = url.searchParams.get('flash');\n    const localFlashTrigger = flashHandle\n      ? this.querySelector(`[data-urban-booking-flash-handle=\"${CSS.escape(flashHandle)}\"]`)\n      : null;\n    const flash = localFlashTrigger instanceof HTMLElement\n      ? flashContextFrom(localFlashTrigger, url)\n      : normalizeFlashContext({ handle: flashHandle, artist });\n    if (requestedService === 'Piercing' && !this.#hasExpectedPiercingForm()) {\n      url.searchParams.delete('service');\n      url.hash = '';\n      window.history.replaceState(window.history.state, '', url.toString());\n      this.dataset.urbanBookingPiercingBlocked = 'true';\n      return;\n    }\n    const targetHash = shouldUseMobileBookingPage() ? '#UrbanMobileBookingPage' : '#UrbanBookingSheet';\n    if (url.hash !== targetHash) {\n      url.hash = targetHash.replace('#', '');\n      window.history.replaceState(window.history.state, '', url.toString());\n    }\n    this.#openTimer = window.setTimeout(\n      () => this.showForService(requestedService, artist, null, flash),\n      120\n    );\n  }\n\n  #isEditable(element) {\n    return Boolean(element && element.nodeType === 1 && typeof element.closest === 'function' && element.closest(EDITABLE_SELECTOR));\n  }\n\n  #ensureFieldEditor() {\n    if (this.#fieldEditor instanceof HTMLElement) return this.#fieldEditor;\n    const editor = document.createElement('div');\n    editor.className = 'urban-booking-field-editor';\n    editor.hidden = true;\n    editor.setAttribute('aria-hidden', 'true');\n    editor.setAttribute('data-urban-booking-field-editor', '');\n\n    const panel = document.createElement('div');\n    panel.className = 'urban-booking-field-editor__panel';\n    panel.setAttribute('role', 'dialog');\n    panel.setAttribute('aria-modal', 'false');\n    panel.setAttribute('aria-label', 'Edit booking field');\n\n    const copy = document.createElement('div');\n    copy.className = 'urban-booking-field-editor__copy';\n\n    const kicker = document.createElement('p');\n    kicker.className = 'urban-booking-field-editor__kicker';\n    kicker.textContent = 'Personal consultation';\n\n    const label = document.createElement('label');\n    label.className = 'urban-booking-field-editor__label';\n    label.id = 'UrbanBookingFieldEditorLabel';\n    label.setAttribute('for', 'UrbanBookingFieldEditorInput');\n    label.textContent = 'Booking detail';\n\n    const hint = document.createElement('p');\n    hint.className = 'urban-booking-field-editor__hint';\n    hint.textContent = 'Type here. Your answer is saved back into the request form.';\n\n    copy.append(kicker, label, hint);\n\n    const input = document.createElement('input');\n    input.id = 'UrbanBookingFieldEditorInput';\n    input.className = 'urban-booking-field-editor__input';\n    input.type = 'text';\n    input.inputMode = 'text';\n    input.autocomplete = 'off';\n    input.setAttribute('aria-labelledby', 'UrbanBookingFieldEditorLabel');\n\n    const textarea = document.createElement('textarea');\n    textarea.id = 'UrbanBookingFieldEditorTextarea';\n    textarea.className = 'urban-booking-field-editor__input urban-booking-field-editor__textarea';\n    textarea.rows = 4;\n    textarea.hidden = true;\n    textarea.setAttribute('aria-labelledby', 'UrbanBookingFieldEditorLabel');\n\n    const done = document.createElement('button');\n    done.className = 'urban-booking-field-editor__done';\n    done.type = 'button';\n    done.textContent = 'Done';\n    done.setAttribute('data-urban-booking-field-done', '');\n\n    panel.append(copy, input, textarea, done);\n    editor.append(panel);\n    const editorHost = this.querySelector('[data-urban-booking-mobile-page]');\n    (editorHost instanceof HTMLElement ? editorHost : this).append(editor);\n\n    this.#fieldEditor = editor;\n    this.#fieldEditorLabel = label;\n    this.#fieldEditorInput = input;\n    this.#fieldEditorTextarea = textarea;\n    this.#fieldEditorDone = done;\n\n    input.addEventListener('input', this.#syncFieldEditorToControl);\n    input.addEventListener('change', this.#syncFieldEditorToControl);\n    input.addEventListener('keydown', this.#handleFieldEditorKeydown);\n    input.addEventListener('blur', this.#handleFieldEditorBlur);\n    textarea.addEventListener('input', this.#syncFieldEditorToControl);\n    textarea.addEventListener('change', this.#syncFieldEditorToControl);\n    textarea.addEventListener('blur', this.#handleFieldEditorBlur);\n    done.addEventListener('click', () => this.#closeFieldEditor(true));\n    return editor;\n  }\n\n  #isFieldEditorElement(element) {\n    return Boolean(this.#fieldEditor instanceof HTMLElement && element instanceof Node && this.#fieldEditor.contains(element));\n  }\n\n  #canMirrorControl(control) {\n    if (!shouldUseMobileFieldEditor()) return false;\n    if (!(control instanceof HTMLInputElement || control instanceof HTMLTextAreaElement)) return false;\n    if (this.#isFieldEditorElement(control)) return false;\n    if (!isVisible(control) || control.disabled || control.readOnly || control.getAttribute('aria-hidden') === 'true') return false;\n    if (!(this.refs.dialog.open || this.#mobileOpen)) return false;\n    if (!this.contains(control)) return false;\n    if (control instanceof HTMLTextAreaElement) return true;\n    const type = String(control.getAttribute('type') || 'text').toLowerCase();\n    return ['text', 'tel', 'email', 'search', 'url', 'number', 'password'].includes(type);\n  }\n\n  #findMirrorControl(target) {\n    if (!(target instanceof Element)) return null;\n    if (target.closest(PHONE_CHROME_SELECTOR)) return null;\n    const phoneRoot = target.closest('[data-urban-booking-phone-wrapper], .iti');\n    if (phoneRoot && !target.closest('input[data-urban-booking-phone-input]')) return null;\n    const direct = target.closest(MIRRORABLE_SELECTOR);\n    if (direct instanceof HTMLInputElement || direct instanceof HTMLTextAreaElement) {\n      return this.#canMirrorControl(direct) ? direct : null;\n    }\n    const label = target.closest('label[for]');\n    if (label instanceof HTMLLabelElement && label.htmlFor) {\n      const associatedControl = document.getElementById(label.htmlFor);\n      if (\n        (associatedControl instanceof HTMLInputElement || associatedControl instanceof HTMLTextAreaElement) &&\n        this.contains(associatedControl) &&\n        this.#canMirrorControl(associatedControl)\n      ) {\n        return associatedControl;\n      }\n    }\n    return null;\n  }\n\n  #fieldLabelForControl(control) {\n    const field = closestFormField(control);\n    let label = field instanceof HTMLElement\n      ? field.querySelector('label .label-content, label, .globo-label, .label-content')\n      : null;\n    if (!label && control.id) {\n      try {\n        label = this.querySelector(`label[for=\"${CSS.escape(control.id)}\"]`);\n      } catch (_error) {\n        label = null;\n      }\n    }\n    const text =\n      label?.textContent ||\n      control.getAttribute('aria-label') ||\n      control.getAttribute('placeholder') ||\n      control.name ||\n      'Booking detail';\n    return String(text).replace(/\\s+/g, ' ').replace(/\\s*\\*+\\s*$/g, ' *').trim();\n  }\n\n  #descriptorForControl(control) {\n    return [\n      control.name,\n      control.id,\n      control.getAttribute('aria-label'),\n      control.getAttribute('placeholder'),\n      control.getAttribute('autocomplete'),\n      this.#fieldLabelForControl(control),\n    ].join(' ');\n  }\n\n  #editorControlFor(control) {\n    return control instanceof HTMLTextAreaElement ? this.#fieldEditorTextarea : this.#fieldEditorInput;\n  }\n\n  #configureFieldEditorControl(control, editorControl) {\n    if (!(editorControl instanceof HTMLInputElement || editorControl instanceof HTMLTextAreaElement)) return;\n    const label = this.#fieldLabelForControl(control);\n    if (this.#fieldEditorLabel instanceof HTMLLabelElement) {\n      this.#fieldEditorLabel.textContent = label;\n      this.#fieldEditorLabel.setAttribute('for', editorControl.id);\n    }\n    const descriptor = this.#descriptorForControl(control);\n    let sourceType = control instanceof HTMLInputElement ? String(control.getAttribute('type') || 'text').toLowerCase() : 'text';\n    if (/phone|telephone|\\btel\\b/i.test(descriptor)) {\n      sourceType = 'tel';\n    } else if (/email/i.test(descriptor)) {\n      sourceType = 'email';\n    }\n    if (editorControl instanceof HTMLInputElement) {\n      const mirrorType = ['email', 'tel', 'url', 'password'].includes(sourceType) ? sourceType : 'text';\n      editorControl.type = mirrorType;\n      editorControl.inputMode =\n        control.getAttribute('inputmode') ||\n        (sourceType === 'tel' ? 'tel' : sourceType === 'email' ? 'email' : sourceType === 'number' ? 'decimal' : 'text');\n      editorControl.autocomplete =\n        control.getAttribute('autocomplete') ||\n        (sourceType === 'tel' ? 'tel' : sourceType === 'email' ? 'email' : 'off');\n    }\n    editorControl.placeholder = control.getAttribute('placeholder') || '';\n    editorControl.value = control.value || '';\n  }\n\n  #syncFieldEditorToControl = () => {\n    if (!(this.#mirroredControl instanceof HTMLInputElement || this.#mirroredControl instanceof HTMLTextAreaElement)) return;\n    const editorControl = this.#editorControlFor(this.#mirroredControl);\n    if (!(editorControl instanceof HTMLInputElement || editorControl instanceof HTMLTextAreaElement)) return;\n    if (this.#mirroredControl.value !== editorControl.value) {\n      this.#mirroredControl.value = editorControl.value;\n      this.#mirroredControl.dispatchEvent(new Event('input', { bubbles: true }));\n      this.#mirroredControl.dispatchEvent(new Event('change', { bubbles: true }));\n    }\n  };\n\n  #focusFieldEditorControl(editorControl) {\n    if (!(editorControl instanceof HTMLInputElement || editorControl instanceof HTMLTextAreaElement)) return;\n    try {\n      editorControl.focus({ preventScroll: true });\n    } catch (_error) {\n      editorControl.focus();\n    }\n    try {\n      const end = editorControl.value.length;\n      editorControl.setSelectionRange(end, end);\n    } catch (_error) {\n    }\n  }\n\n  #openFieldEditor(control, immediate = false) {\n    if (!this.#canMirrorControl(control)) return false;\n    const editor = this.#ensureFieldEditor();\n    const editorControl = this.#editorControlFor(control);\n    if (!(editorControl instanceof HTMLInputElement || editorControl instanceof HTMLTextAreaElement)) return false;\n    if (\n      this.#mirroredControl === control &&\n      editor.hidden === false &&\n      this.dataset.urbanBookingFieldEditor === 'true'\n    ) {\n      if (immediate && document.activeElement !== editorControl) this.#focusFieldEditorControl(editorControl);\n      return true;\n    }\n    this.#syncFieldEditorToControl();\n    this.#mirroredControl = control;\n    this.#fieldEditorOpening = true;\n    this.#keyboardFocusActive = true;\n    if (this.#fieldEditorInput instanceof HTMLInputElement) this.#fieldEditorInput.hidden = control instanceof HTMLTextAreaElement;\n    if (this.#fieldEditorTextarea instanceof HTMLTextAreaElement) this.#fieldEditorTextarea.hidden = !(control instanceof HTMLTextAreaElement);\n    this.#configureFieldEditorControl(control, editorControl);\n    editor.hidden = false;\n    editor.setAttribute('aria-hidden', 'false');\n    this.dataset.urbanBookingFieldEditor = 'true';\n    document.documentElement.classList.add('urban-booking-field-editor-active');\n    this.#syncViewport();\n    if (immediate || document.activeElement !== editorControl) this.#focusFieldEditorControl(editorControl);\n    window.requestAnimationFrame(() => {\n      this.#fieldEditorOpening = false;\n    });\n    return true;\n  }\n\n  #closeFieldEditor(sync = true) {\n    if (sync) this.#syncFieldEditorToControl();\n    const editorControl = this.#editorControlFor(this.#mirroredControl);\n    if (editorControl instanceof HTMLElement) editorControl.blur();\n    if (this.#mirroredControl instanceof HTMLElement) this.#mirroredControl.blur();\n    this.#mirroredControl = null;\n    this.#fieldEditorOpening = false;\n    if (this.#fieldEditor instanceof HTMLElement) {\n      this.#fieldEditor.hidden = true;\n      this.#fieldEditor.setAttribute('aria-hidden', 'true');\n    }\n    this.dataset.urbanBookingFieldEditor = 'false';\n    document.documentElement.classList.remove('urban-booking-field-editor-active');\n    if (!(this.refs.dialog.open || this.#mobileOpen)) {\n      document.documentElement.classList.remove('urban-booking-keyboard-active');\n      this.dataset.urbanBookingKeyboard = 'false';\n    }\n    this.#keyboardFocusActive = false;\n    this.#clearActiveField();\n    this.#syncViewport();\n    this.#queueGlobalUpdate();\n  }\n\n  #handleFieldEditorKeydown = (event) => {\n    if (event.key === 'Enter' && event.target instanceof HTMLInputElement) {\n      event.preventDefault();\n      this.#closeFieldEditor(true);\n    }\n    if (event.key === 'Escape') {\n      event.preventDefault();\n      this.#closeFieldEditor(true);\n    }\n  };\n\n  #handleFieldEditorBlur = () => {\n    if (this.#mirroredControl) this.#syncFieldEditorToControl();\n  };\n\n  #handleFieldGestureStart = (event) => {\n    if (this.#isFieldEditorElement(event.target) || !shouldUseMobileFieldEditor()) return;\n    if (!(this.refs.dialog.open || this.#mobileOpen) || event.isPrimary === false || event.button !== 0) return;\n    if (!(event.target instanceof Element) || event.pointerType === 'mouse') {\n      this.#fieldGesture = null;\n      return;\n    }\n    const control = this.#findMirrorControl(event.target);\n    if (!this.#canMirrorControl(control)) {\n      this.#fieldGesture = null;\n      return;\n    }\n    const scroller = this.querySelector('.urban-booking-mobile-page__body');\n    this.#fieldGestureSuppressUntil = 0;\n    this.#fieldGesture = {\n      pointerId: event.pointerId,\n      control,\n      startX: event.clientX,\n      startY: event.clientY,\n      startTime: performance.now(),\n      startScrollTop: scroller instanceof HTMLElement ? scroller.scrollTop : 0,\n      moved: false,\n      ended: false,\n      endTime: 0,\n    };\n  };\n\n  #handleFieldGestureMove = (event) => {\n    const gesture = this.#fieldGesture;\n    if (!gesture || gesture.pointerId !== event.pointerId || gesture.moved) return;\n    const scroller = this.querySelector('.urban-booking-mobile-page__body');\n    const scrolled = scroller instanceof HTMLElement && Math.abs(scroller.scrollTop - gesture.startScrollTop) > 2;\n    const distance = Math.hypot(event.clientX - gesture.startX, event.clientY - gesture.startY);\n    if (distance > FIELD_TAP_SLOP || scrolled) {\n      gesture.moved = true;\n      this.#fieldGestureSuppressUntil = performance.now() + FIELD_GHOST_CLICK_WINDOW;\n    }\n  };\n\n  #handleFieldGestureEnd = (event) => {\n    const gesture = this.#fieldGesture;\n    if (!gesture || gesture.pointerId !== event.pointerId) return;\n    const scroller = this.querySelector('.urban-booking-mobile-page__body');\n    const scrolled = scroller instanceof HTMLElement && Math.abs(scroller.scrollTop - gesture.startScrollTop) > 2;\n    const distance = Math.hypot(event.clientX - gesture.startX, event.clientY - gesture.startY);\n    const endingControl = event.target instanceof Element ? this.#findMirrorControl(event.target) : null;\n    const now = performance.now();\n    gesture.moved = gesture.moved || distance > FIELD_TAP_SLOP || scrolled || endingControl !== gesture.control;\n    gesture.ended = true;\n    gesture.endTime = now;\n    if (gesture.moved || now - gesture.startTime > FIELD_TAP_MAX_DURATION) {\n      gesture.moved = true;\n      this.#fieldGestureSuppressUntil = now + FIELD_GHOST_CLICK_WINDOW;\n    }\n  };\n\n  #handleFieldGestureCancel = (event) => {\n    const gesture = this.#fieldGesture;\n    if (!gesture || gesture.pointerId !== event.pointerId) return;\n    this.#fieldGesture = null;\n    this.#fieldGestureSuppressUntil = performance.now() + FIELD_GHOST_CLICK_WINDOW;\n  };\n\n  #handleFieldGestureMouseDown = (event) => {\n    if (!shouldUseMobileFieldEditor() || !(event.target instanceof Element)) return;\n    const control = this.#findMirrorControl(event.target);\n    if (!this.#canMirrorControl(control)) return;\n    const gesture = this.#fieldGesture;\n    const now = performance.now();\n    const recentGesture = Boolean(\n      gesture && gesture.control === control && now - (gesture.endTime || gesture.startTime) <= FIELD_GHOST_CLICK_WINDOW\n    );\n    if (!recentGesture && now >= this.#fieldGestureSuppressUntil) return;\n    event.preventDefault();\n    event.stopPropagation();\n  };\n\n  #handleFieldGestureClick = (event) => {\n    if (this.#isFieldEditorElement(event.target) || !shouldUseMobileFieldEditor()) return;\n    if (!(this.refs.dialog.open || this.#mobileOpen) || !(event.target instanceof Element)) return;\n    const control = this.#findMirrorControl(event.target);\n    if (!this.#canMirrorControl(control)) return;\n    const gesture = this.#fieldGesture;\n    const now = performance.now();\n    const sameControl = Boolean(gesture && gesture.control === control);\n    const qualifiedTap = Boolean(\n      sameControl &&\n      gesture.ended &&\n      !gesture.moved &&\n      now - gesture.startTime <= FIELD_TAP_MAX_DURATION + FIELD_GHOST_CLICK_WINDOW\n    );\n    const blocked = now < this.#fieldGestureSuppressUntil || Boolean(gesture && !qualifiedTap);\n    if (!gesture && !blocked) return;\n    event.preventDefault();\n    event.stopImmediatePropagation();\n    if (blocked) {\n      if (document.activeElement === control) control.blur();\n      this.#fieldGesture = null;\n      return;\n    }\n    this.#fieldGesture = null;\n    this.#fieldGestureSuppressUntil = now + FIELD_GHOST_CLICK_WINDOW;\n    this.#openFieldEditor(control, true);\n  };\n\n  #handleFocusIn = (event) => {\n    window.clearTimeout(this.#focusExitTimer);\n    if (!event.target || event.target.nodeType !== 1) return;\n    if (this.#isFieldEditorElement(event.target)) {\n      this.#keyboardFocusActive = true;\n      this.#syncViewport();\n      this.#queueGlobalUpdate();\n      return;\n    }\n    if (!(this.refs.dialog.open || this.#mobileOpen) || !this.contains(event.target) || !this.#isEditable(event.target)) return;\n    const programmaticControl = this.#findMirrorControl(event.target);\n    const gesture = this.#fieldGesture;\n    const now = performance.now();\n    const guardedPointerFocus = Boolean(\n      programmaticControl &&\n      ((gesture && gesture.control === programmaticControl && now - gesture.startTime <= FIELD_TAP_MAX_DURATION + FIELD_GHOST_CLICK_WINDOW) ||\n        now < this.#fieldGestureSuppressUntil)\n    );\n    if (guardedPointerFocus) {\n      const focusedControl = event.target;\n      if (!this.#mirroredControl && document.activeElement === focusedControl && focusedControl instanceof HTMLElement) {\n        focusedControl.blur();\n      }\n      return;\n    }\n    this.#keyboardFocusActive = false;\n    this.#clearActiveField();\n    this.#queueGlobalUpdate();\n  };\n\n  #handleFocusOut = () => {\n    window.clearTimeout(this.#focusExitTimer);\n    this.#focusExitTimer = window.setTimeout(() => {\n      this.#focusExitTimer = 0;\n      const activeEditable = this.#isFieldEditorElement(document.activeElement) ||\n        (this.#isEditable(document.activeElement) && this.contains(document.activeElement));\n      this.#keyboardFocusActive = activeEditable;\n      if (this.#isFieldEditorElement(document.activeElement)) {\n        this.#syncViewport();\n        this.#queueGlobalUpdate();\n        return;\n      }\n      if (activeEditable) this.#setActiveField(document.activeElement);\n      else this.#clearActiveField();\n      this.#syncViewport();\n      this.#queueGlobalUpdate();\n    }, 220);\n  };\n\n  #setActiveField(control) {\n    if (!control || control.nodeType !== 1) return;\n    const field = closestFormField(control);\n    if (!(field instanceof HTMLElement)) return;\n    if (this.#activeField instanceof HTMLElement && this.#activeField !== field) {\n      this.#activeField.removeAttribute('data-urban-booking-active-field');\n    }\n    this.#activeField = field;\n    field.setAttribute('data-urban-booking-active-field', 'true');\n  }\n\n  #clearActiveField() {\n    if (this.#activeField instanceof HTMLElement) {\n      this.#activeField.removeAttribute('data-urban-booking-active-field');\n      this.#activeField.style.removeProperty('--urban-booking-focus-shift');\n      this.#activeField.style.removeProperty('--urban-booking-focus-max-height');\n    }\n    this.#activeField = null;\n    window.cancelAnimationFrame(this.#activeFieldAdjustFrame);\n    this.#activeFieldAdjustFrame = 0;\n    this.querySelectorAll('[data-urban-booking-active-field]').forEach((field) => {\n      field.removeAttribute('data-urban-booking-active-field');\n      if (field instanceof HTMLElement) {\n        field.style.removeProperty('--urban-booking-focus-shift');\n        field.style.removeProperty('--urban-booking-focus-max-height');\n      }\n    });\n  }\n\n  #queueActiveFieldVisualCorrection(control = document.activeElement) {\n    if (!this.#mobileOpen || !control || control.nodeType !== 1 || !this.#isEditable(control)) return;\n    const target = closestFormField(control);\n    if (!(target instanceof HTMLElement)) return;\n    window.cancelAnimationFrame(this.#activeFieldAdjustFrame);\n    this.#activeFieldAdjustFrame = window.requestAnimationFrame(() => {\n      this.#activeFieldAdjustFrame = 0;\n      this.#correctActiveFieldVisualPosition(target);\n    });\n  }\n\n  #correctActiveFieldVisualPosition(target) {\n    if (!(target instanceof HTMLElement) || !target.isConnected || target.getAttribute('data-urban-booking-active-field') !== 'true') return;\n    if (this.dataset.urbanBookingKeyboard !== 'true' && !this.#keyboardFocusActive) return;\n    const viewportTop = this.#viewport?.offsetTop || 0;\n    const viewportHeight = this.#viewport?.height || window.innerHeight;\n    const desiredTop = Math.max(144, Math.round(viewportTop + 144));\n    const desiredBottom = Math.max(desiredTop + 92, Math.round(viewportTop + viewportHeight * 0.43));\n    const maxHeight = Math.max(92, Math.min(190, desiredBottom - desiredTop));\n    target.style.setProperty('--urban-booking-focus-max-height', `${maxHeight}px`);\n    target.style.setProperty('--urban-booking-focus-shift', '0px');\n    const rect = target.getBoundingClientRect();\n    const shift = Math.round(desiredTop - rect.top);\n    target.style.setProperty('--urban-booking-focus-shift', `${shift}px`);\n  }\n\n  #queueFocusedControlIntoView(control = document.activeElement) {\n    if (!control || control.nodeType !== 1) return;\n    if (!(this.refs.dialog.open || this.#mobileOpen) || !this.contains(control) || !this.#isEditable(control)) return;\n    const needsMobileCorrection =\n      shouldUseMobileFieldEditor() || this.dataset.urbanBookingKeyboard === 'true';\n    window.clearTimeout(this.#focusScrollTimer);\n    this.#focusScrollTimer = 0;\n    if (!needsMobileCorrection) return;\n    this.#focusScrollTimer = window.setTimeout(() => {\n      this.#focusScrollTimer = 0;\n      const active = document.activeElement;\n      if (active !== control && !(control instanceof HTMLElement && control.contains(active))) return;\n      this.#scrollControlIntoSafeView(control);\n    }, 140);\n  }\n\n  #scrollControlIntoSafeView(control) {\n    if (this.#mobileOpen) {\n      this.#scrollMobileControlIntoSafeView(control);\n      return;\n    }\n    const scroller = this.querySelector('[data-urban-booking-scroll]');\n    if (!(scroller instanceof HTMLElement) || !control || control.nodeType !== 1 || !control.isConnected) return;\n    const target = closestFormField(control);\n    if (!target || target.nodeType !== 1) return;\n\n    const targetRect = target.getBoundingClientRect();\n    const controlRect = control.getBoundingClientRect();\n    const focusRect = controlRect.width || controlRect.height ? controlRect : targetRect;\n    const scrollerRect = scroller.getBoundingClientRect();\n    const visualTop = this.#viewport?.offsetTop || 0;\n    const viewportHeight = this.#viewport?.height || window.innerHeight;\n    const visualBottom = visualTop + viewportHeight;\n    const keyboardOpen = this.dataset.urbanBookingKeyboard === 'true';\n    const keyboardSafeGap = Math.max(390, Math.round(viewportHeight * 0.62));\n    const lowerGap = keyboardOpen || this.#keyboardFocusActive ? keyboardSafeGap : 44;\n    const topGap = keyboardOpen || this.#keyboardFocusActive ? 128 : 12;\n    const safeTop = Math.max(scrollerRect.top, visualTop) + topGap;\n    const safeBottom = Math.max(safeTop + 96, Math.min(scrollerRect.bottom, visualBottom) - lowerGap);\n    const preferredTop = safeTop + (keyboardOpen || this.#keyboardFocusActive ? 6 : 8);\n    const measuredTop = Math.min(targetRect.top, focusRect.top);\n    const measuredBottom = Math.max(targetRect.bottom, focusRect.bottom);\n    const maxScrollTop = Math.max(0, scroller.scrollHeight - scroller.clientHeight);\n    let nextScrollTop = scroller.scrollTop;\n\n    if (measuredBottom > safeBottom) {\n      nextScrollTop += Math.ceil(measuredBottom - safeBottom);\n    }\n    if (measuredTop < safeTop) {\n      nextScrollTop -= Math.ceil(safeTop - measuredTop);\n    }\n    if ((keyboardOpen || this.#keyboardFocusActive) && focusRect.top > preferredTop + 12) {\n      nextScrollTop += Math.ceil(focusRect.top - preferredTop);\n    }\n\n    scroller.scrollTop = Math.max(0, Math.min(maxScrollTop, nextScrollTop));\n  }\n\n  #scrollMobileControlIntoSafeView(control) {\n    if (!control || control.nodeType !== 1 || !control.isConnected) return;\n    const target = closestFormField(control);\n    if (!target || target.nodeType !== 1) return;\n    const scroller = this.querySelector('.urban-booking-mobile-page__body');\n    if (!(scroller instanceof HTMLElement)) return;\n    const targetRect = target.getBoundingClientRect();\n    const controlRect = control.getBoundingClientRect();\n    const focusRect = controlRect.width || controlRect.height ? controlRect : targetRect;\n    const scrollerRect = scroller.getBoundingClientRect();\n    const safeTop = scrollerRect.top + 16;\n    const safeBottom = Math.max(safeTop + 88, scrollerRect.bottom - 18);\n    const maxScrollTop = Math.max(0, scroller.scrollHeight - scroller.clientHeight);\n    let nextScrollTop = scroller.scrollTop;\n\n    if (focusRect.bottom > safeBottom) {\n      nextScrollTop += Math.ceil(focusRect.bottom - safeBottom + 8);\n    }\n    if (focusRect.top < safeTop) {\n      nextScrollTop -= Math.ceil(safeTop - focusRect.top + 8);\n    }\n\n    scroller.scrollTop = Math.max(0, Math.min(maxScrollTop, nextScrollTop));\n  }\n\n  #queueGlobalUpdate = () => {\n    if (this.#globalFrame) return;\n    this.#globalFrame = window.requestAnimationFrame(() => {\n      this.#globalFrame = 0;\n      this.#updateGlobalState();\n    });\n  };\n\n  #updateGlobalState() {\n    this.#syncPreviewBarOffset();\n    const viewportHeight = this.#viewport?.height || window.innerHeight;\n    const viewportWidth = this.#viewport?.width || window.innerWidth;\n    const stableWidth = Math.abs(this.#baselineWidth - viewportWidth) < 48;\n    const keyboardOpen = stableWidth && this.#baselineHeight - viewportHeight > 140;\n    const activeField = this.#isEditable(document.activeElement);\n    const commerceActionActive = this.#hasActiveCommerceAction();\n    document.documentElement.classList.toggle('urban-booking-bar-commerce-action-active', commerceActionActive);\n    document.documentElement.classList.toggle(\n      'urban-booking-bar-suppressed',\n      this.#mobileOpen || activeField || keyboardOpen || commerceActionActive || this.#hasOpenOverlay()\n    );\n  }\n\n  #syncPreviewBarOffset() {\n    const preview = document.querySelector('#PBarNextFrameWrapper');\n    const previewElement = preview instanceof HTMLElement ? preview : null;\n    if (previewElement !== this.#observedPreviewBar) {\n      this.#previewResizeObserver?.disconnect();\n      this.#observedPreviewBar = previewElement;\n      this.#previewResizeObserver =\n        previewElement && typeof ResizeObserver !== 'undefined'\n          ? new ResizeObserver(this.#queueGlobalUpdate)\n          : null;\n      this.#previewResizeObserver?.observe(previewElement);\n    }\n    const height = previewElement && isVisible(previewElement)\n      ? Math.max(0, Math.round(previewElement.getBoundingClientRect().height))\n      : 0;\n    document.documentElement.style.setProperty('--urban-preview-bar-offset', `${height}px`);\n    document.documentElement.classList.toggle('urban-preview-bar-present', height > 0);\n  }\n\n  #hasOpenOverlay() {\n    return Array.from(\n      document.querySelectorAll(\n        'dialog[open], [aria-modal=\"true\"]:not([hidden]), .menu-drawer-container[open], .menu-drawer-container.menu-open, .menu-drawer[open], details[open] > .menu-drawer, cart-drawer-component dialog[open], .drawer[data-open=\"true\"]'\n      )\n    ).some((element) => isVisible(element));\n  }\n\n  #hasActiveCommerceAction() {\n    const action = document.querySelector('sticky-add-to-cart .sticky-add-to-cart__bar[data-stuck=\"true\"]');\n    return action instanceof HTMLElement && isVisible(action) && window.getComputedStyle(action).opacity !== '0';\n  }\n\n  #freezeDocumentScroll() {\n    if (this.#bodyFreezeSnapshot || !(document.body instanceof HTMLElement)) return;\n    const body = document.body;\n    const properties = ['position', 'top', 'right', 'left', 'width', 'overflow', 'padding-right'];\n    this.#bodyFreezeSnapshot = Object.fromEntries(\n      properties.map((property) => [\n        property,\n        {\n          value: body.style.getPropertyValue(property),\n          priority: body.style.getPropertyPriority(property),\n        },\n      ])\n    );\n    this.#frozenScrollY = Math.max(0, Math.round(window.scrollY));\n    const scrollbarWidth = Math.max(0, window.innerWidth - document.documentElement.clientWidth);\n    body.style.setProperty('position', 'fixed');\n    body.style.setProperty('top', `-${this.#frozenScrollY}px`);\n    body.style.setProperty('right', '0');\n    body.style.setProperty('left', '0');\n    body.style.setProperty('width', '100%');\n    body.style.setProperty('overflow', 'hidden');\n    if (scrollbarWidth > 0) body.style.setProperty('padding-right', `${scrollbarWidth}px`);\n  }\n\n  #restoreDocumentScroll() {\n    if (!this.#bodyFreezeSnapshot || !(document.body instanceof HTMLElement)) return;\n    const body = document.body;\n    Object.entries(this.#bodyFreezeSnapshot).forEach(([property, snapshot]) => {\n      if (snapshot.value) body.style.setProperty(property, snapshot.value, snapshot.priority);\n      else body.style.removeProperty(property);\n    });\n    const scrollY = this.#frozenScrollY;\n    this.#bodyFreezeSnapshot = null;\n    this.#frozenScrollY = 0;\n    window.scrollTo({ top: scrollY, left: window.scrollX, behavior: 'auto' });\n  }\n\n  #releaseGlobalState() {\n    document.documentElement.classList.remove(\n      'urban-booking-sheet-open',\n      'urban-booking-mobile-page-open',\n      'urban-booking-keyboard-active',\n      'urban-booking-bar-suppressed',\n      'urban-booking-bar-commerce-action-active',\n      'urban-preview-bar-present',\n      'urban-booking-debug'\n    );\n    document.documentElement.style.removeProperty('--urban-preview-bar-offset');\n  }\n}\n\nif (!customElements.get('urban-booking-component-z23')) {\n  customElements.define('urban-booking-component-z23', UrbanBookingComponent);\n}\n\n/* Urban booking service scope: tattoo and piercing only. */\n\n/* Urban booking tattoo entry: Artist-first with Yi and Eric. */\n"],
  "mappings": "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",
  "names": ["success", "intake", "changed", "option", "fixedArtist", "control"]
}
