{
  "version": 3,
  "sources": ["/cdn/shop/t/35/assets/lux-about-page-v2.js?lux_v=20260729_v2_0_0"],
  "sourcesContent": ["/**\r\n * LUXWORLD About Page V2\r\n * Asset: lux-about-page-v2.js\r\n * Version: 2.0.0\r\n *\r\n * Responsibilities:\r\n * - CTA and Design Studio analytics events\r\n * - Accessible announcement messages\r\n * - Smooth in-page navigation\r\n * - External-link safety\r\n * - Shopify Theme Editor reinitialisation\r\n */\r\n\r\n(() => {\r\n  \"use strict\";\r\n\r\n  const ROOT_SELECTOR = \"[data-lux-about-page-v2]\";\r\n  const READY_ATTRIBUTE = \"data-lux-about-ready\";\r\n\r\n  /**\r\n   * Push a platform-neutral analytics event.\r\n   * @param {HTMLElement} root\r\n   * @param {string} eventName\r\n   * @param {Record<string, unknown>} details\r\n   */\r\n  function trackEvent(root, eventName, details = {}) {\r\n    if (!eventName) return;\r\n\r\n    const payload = {\r\n      event: eventName,\r\n      page_type: \"about-page-v2\",\r\n      page_path: window.location.pathname,\r\n      ...details\r\n    };\r\n\r\n    window.dataLayer = window.dataLayer || [];\r\n    window.dataLayer.push(payload);\r\n\r\n    try {\r\n      root.dispatchEvent(\r\n        new CustomEvent(\"luxworld:about-page-event\", {\r\n          bubbles: true,\r\n          detail: payload\r\n        })\r\n      );\r\n    } catch (error) {\r\n      console.warn(\"[LUXWORLD About V2] Event dispatch failed.\", error);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Display a short accessible status message.\r\n   * @param {HTMLElement} root\r\n   * @param {string} message\r\n   */\r\n  function announce(root, message) {\r\n    if (!message) return;\r\n\r\n    const region = root.querySelector(\"[data-lux-about-announcement]\");\r\n    if (!(region instanceof HTMLElement)) return;\r\n\r\n    region.textContent = \"\";\r\n\r\n    window.setTimeout(() => {\r\n      region.textContent = message;\r\n    }, 40);\r\n\r\n    window.setTimeout(() => {\r\n      if (region.textContent === message) {\r\n        region.textContent = \"\";\r\n      }\r\n    }, 3500);\r\n  }\r\n\r\n  /**\r\n   * Track all important CTA clicks.\r\n   * @param {HTMLElement} root\r\n   */\r\n  function initialiseCtaTracking(root) {\r\n    const elements = root.querySelectorAll(\r\n      \"[data-lux-about-event], [data-lux-about-studio-link]\"\r\n    );\r\n\r\n    elements.forEach((element) => {\r\n      if (\r\n        !(element instanceof HTMLElement) ||\r\n        element.dataset.luxAboutTrackingReady === \"true\"\r\n      ) {\r\n        return;\r\n      }\r\n\r\n      element.addEventListener(\"click\", () => {\r\n        const eventName =\r\n          element.dataset.luxAboutEvent ||\r\n          (element.hasAttribute(\"data-lux-about-studio-link\")\r\n            ? \"about_design_studio_enter\"\r\n            : \"about_cta_click\");\r\n\r\n        trackEvent(root, eventName, {\r\n          label: (element.textContent || \"\").trim(),\r\n          destination:\r\n            element instanceof HTMLAnchorElement ? element.href : \"\"\r\n        });\r\n      });\r\n\r\n      element.dataset.luxAboutTrackingReady = \"true\";\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Apply safe behaviour to external links.\r\n   * @param {HTMLElement} root\r\n   */\r\n  function initialiseExternalLinks(root) {\r\n    root.querySelectorAll(\"a[href]\").forEach((link) => {\r\n      if (!(link instanceof HTMLAnchorElement)) return;\r\n      if (link.dataset.luxAboutExternalReady === \"true\") return;\r\n\r\n      try {\r\n        const destination = new URL(link.href, window.location.href);\r\n        const external = destination.origin !== window.location.origin;\r\n\r\n        if (external) {\r\n          link.target = \"_blank\";\r\n          link.rel = \"noopener noreferrer\";\r\n        }\r\n      } catch (error) {\r\n        console.warn(\"[LUXWORLD About V2] Invalid link URL.\", error);\r\n      }\r\n\r\n      link.dataset.luxAboutExternalReady = \"true\";\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Improve in-page anchor navigation.\r\n   * @param {HTMLElement} root\r\n   */\r\n  function initialiseAnchorLinks(root) {\r\n    root.querySelectorAll('a[href^=\"#\"]').forEach((link) => {\r\n      if (!(link instanceof HTMLAnchorElement)) return;\r\n      if (link.dataset.luxAboutAnchorReady === \"true\") return;\r\n\r\n      link.addEventListener(\"click\", (event) => {\r\n        const targetId = link.getAttribute(\"href\");\r\n        if (!targetId || targetId === \"#\") return;\r\n\r\n        const target = document.querySelector(targetId);\r\n        if (!(target instanceof HTMLElement)) return;\r\n\r\n        event.preventDefault();\r\n\r\n        const reducedMotion = window.matchMedia(\r\n          \"(prefers-reduced-motion: reduce)\"\r\n        ).matches;\r\n\r\n        target.scrollIntoView({\r\n          behavior: reducedMotion ? \"auto\" : \"smooth\",\r\n          block: \"start\"\r\n        });\r\n\r\n        if (!target.hasAttribute(\"tabindex\")) {\r\n          target.setAttribute(\"tabindex\", \"-1\");\r\n        }\r\n\r\n        target.focus({ preventScroll: true });\r\n\r\n        history.replaceState({}, \"\", targetId);\r\n      });\r\n\r\n      link.dataset.luxAboutAnchorReady = \"true\";\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Track project and client-card interaction without making cards\r\n   * artificially clickable.\r\n   * @param {HTMLElement} root\r\n   */\r\n  function initialiseCardTracking(root) {\r\n    root\r\n      .querySelectorAll(\r\n        \".lux-about-v2__client-card, .lux-about-v2__project-card, .lux-about-v2__location-card\"\r\n      )\r\n      .forEach((card) => {\r\n        if (!(card instanceof HTMLElement)) return;\r\n        if (card.dataset.luxAboutCardReady === \"true\") return;\r\n\r\n        const link = card.querySelector(\"a[href]\");\r\n        if (!(link instanceof HTMLAnchorElement)) {\r\n          card.dataset.luxAboutCardReady = \"true\";\r\n          return;\r\n        }\r\n\r\n        link.addEventListener(\"click\", () => {\r\n          const heading = card.querySelector(\"h3\");\r\n          const cardType = card.classList.contains(\"lux-about-v2__client-card\")\r\n            ? \"client\"\r\n            : card.classList.contains(\"lux-about-v2__project-card\")\r\n              ? \"project\"\r\n              : \"location\";\r\n\r\n          trackEvent(root, \"about_card_clicked\", {\r\n            card_type: cardType,\r\n            card_title: (heading?.textContent || \"\").trim(),\r\n            destination: link.href\r\n          });\r\n        });\r\n\r\n        card.dataset.luxAboutCardReady = \"true\";\r\n      });\r\n  }\r\n\r\n  /**\r\n   * Initialise one About page instance.\r\n   * @param {HTMLElement} root\r\n   */\r\n  function initialiseRoot(root) {\r\n    if (!(root instanceof HTMLElement)) return;\r\n    if (root.getAttribute(READY_ATTRIBUTE) === \"true\") return;\r\n\r\n    initialiseCtaTracking(root);\r\n    initialiseExternalLinks(root);\r\n    initialiseAnchorLinks(root);\r\n    initialiseCardTracking(root);\r\n\r\n    root.addEventListener(\"luxworld:about-page-announce\", (event) => {\r\n      const customEvent = /** @type {CustomEvent} */ (event);\r\n      announce(root, String(customEvent.detail?.message || \"\"));\r\n    });\r\n\r\n    root.setAttribute(READY_ATTRIBUTE, \"true\");\r\n\r\n    trackEvent(root, \"about_page_loaded\", {\r\n      version: root.dataset.version || \"2.0.0\",\r\n      client_cards: root.querySelectorAll(\".lux-about-v2__client-card\").length,\r\n      project_cards: root.querySelectorAll(\".lux-about-v2__project-card\").length\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Initialise all matching sections in a context.\r\n   * @param {ParentNode} context\r\n   */\r\n  function initialiseAll(context = document) {\r\n    const roots = [];\r\n\r\n    if (context instanceof HTMLElement && context.matches(ROOT_SELECTOR)) {\r\n      roots.push(context);\r\n    }\r\n\r\n    context.querySelectorAll?.(ROOT_SELECTOR).forEach((root) => {\r\n      if (root instanceof HTMLElement) {\r\n        roots.push(root);\r\n      }\r\n    });\r\n\r\n    roots.forEach(initialiseRoot);\r\n  }\r\n\r\n  if (document.readyState === \"loading\") {\r\n    document.addEventListener(\r\n      \"DOMContentLoaded\",\r\n      () => initialiseAll(document),\r\n      { once: true }\r\n    );\r\n  } else {\r\n    initialiseAll(document);\r\n  }\r\n\r\n  /* Shopify Theme Editor support */\r\n  document.addEventListener(\"shopify:section:load\", (event) => {\r\n    const target = event.target;\r\n    if (target instanceof HTMLElement) {\r\n      initialiseAll(target);\r\n    }\r\n  });\r\n\r\n  document.addEventListener(\"shopify:block:select\", (event) => {\r\n    const block = event.target;\r\n    if (!(block instanceof HTMLElement)) return;\r\n\r\n    const root = block.closest(ROOT_SELECTOR);\r\n    if (!(root instanceof HTMLElement)) return;\r\n\r\n    const reducedMotion = window.matchMedia(\r\n      \"(prefers-reduced-motion: reduce)\"\r\n    ).matches;\r\n\r\n    block.scrollIntoView({\r\n      behavior: reducedMotion ? \"auto\" : \"smooth\",\r\n      block: \"center\"\r\n    });\r\n\r\n    const heading = block.querySelector(\"h3\");\r\n    announce(\r\n      root,\r\n      heading?.textContent\r\n        ? `${heading.textContent.trim()} selected in the Theme Editor.`\r\n        : \"Section block selected in the Theme Editor.\"\r\n    );\r\n  });\r\n})();\r\n"],
  "mappings": "CAaC,IAAM,CACL,aAEA,MAAM,cAAgB,2BAChB,gBAAkB,uBAQxB,SAAS,WAAW,KAAM,UAAW,QAAU,CAAC,EAAG,CACjD,GAAI,CAAC,UAAW,OAEhB,MAAM,QAAU,CACd,MAAO,UACP,UAAW,gBACX,UAAW,OAAO,SAAS,SAC3B,GAAG,OACL,EAEA,OAAO,UAAY,OAAO,WAAa,CAAC,EACxC,OAAO,UAAU,KAAK,OAAO,EAE7B,GAAI,CACF,KAAK,cACH,IAAI,YAAY,4BAA6B,CAC3C,QAAS,GACT,OAAQ,OACV,CAAC,CACH,CACF,OAAS,MAAO,CACd,QAAQ,KAAK,6CAA8C,KAAK,CAClE,CACF,CAOA,SAAS,SAAS,KAAM,QAAS,CAC/B,GAAI,CAAC,QAAS,OAEd,MAAM,OAAS,KAAK,cAAc,+BAA+B,EAC3D,kBAAkB,cAExB,OAAO,YAAc,GAErB,OAAO,WAAW,IAAM,CACtB,OAAO,YAAc,OACvB,EAAG,EAAE,EAEL,OAAO,WAAW,IAAM,CAClB,OAAO,cAAgB,UACzB,OAAO,YAAc,GAEzB,EAAG,IAAI,EACT,CAMA,SAAS,sBAAsB,KAAM,CAClB,KAAK,iBACpB,sDACF,EAES,QAAS,SAAY,CAE1B,EAAE,mBAAmB,cACrB,QAAQ,QAAQ,wBAA0B,SAK5C,QAAQ,iBAAiB,QAAS,IAAM,CACtC,MAAM,UACJ,QAAQ,QAAQ,gBACf,QAAQ,aAAa,4BAA4B,EAC9C,4BACA,mBAEN,WAAW,KAAM,UAAW,CAC1B,OAAQ,QAAQ,aAAe,IAAI,KAAK,EACxC,YACE,mBAAmB,kBAAoB,QAAQ,KAAO,EAC1D,CAAC,CACH,CAAC,EAED,QAAQ,QAAQ,sBAAwB,OAC1C,CAAC,CACH,CAMA,SAAS,wBAAwB,KAAM,CACrC,KAAK,iBAAiB,SAAS,EAAE,QAAS,MAAS,CACjD,GAAM,gBAAgB,mBAClB,KAAK,QAAQ,wBAA0B,OAE3C,IAAI,CACkB,IAAI,IAAI,KAAK,KAAM,OAAO,SAAS,IAAI,EAC9B,SAAW,OAAO,SAAS,SAGtD,KAAK,OAAS,SACd,KAAK,IAAM,sBAEf,OAAS,MAAO,CACd,QAAQ,KAAK,wCAAyC,KAAK,CAC7D,CAEA,KAAK,QAAQ,sBAAwB,OACvC,CAAC,CACH,CAMA,SAAS,sBAAsB,KAAM,CACnC,KAAK,iBAAiB,cAAc,EAAE,QAAS,MAAS,CAChD,gBAAgB,mBAClB,KAAK,QAAQ,sBAAwB,SAEzC,KAAK,iBAAiB,QAAU,OAAU,CACxC,MAAM,SAAW,KAAK,aAAa,MAAM,EACzC,GAAI,CAAC,UAAY,WAAa,IAAK,OAEnC,MAAM,OAAS,SAAS,cAAc,QAAQ,EAC9C,GAAI,EAAE,kBAAkB,aAAc,OAEtC,MAAM,eAAe,EAErB,MAAM,cAAgB,OAAO,WAC3B,kCACF,EAAE,QAEF,OAAO,eAAe,CACpB,SAAU,cAAgB,OAAS,SACnC,MAAO,OACT,CAAC,EAEI,OAAO,aAAa,UAAU,GACjC,OAAO,aAAa,WAAY,IAAI,EAGtC,OAAO,MAAM,CAAE,cAAe,EAAK,CAAC,EAEpC,QAAQ,aAAa,CAAC,EAAG,GAAI,QAAQ,CACvC,CAAC,EAED,KAAK,QAAQ,oBAAsB,OACrC,CAAC,CACH,CAOA,SAAS,uBAAuB,KAAM,CACpC,KACG,iBACC,uFACF,EACC,QAAS,MAAS,CAEjB,GADI,EAAE,gBAAgB,cAClB,KAAK,QAAQ,oBAAsB,OAAQ,OAE/C,MAAM,KAAO,KAAK,cAAc,SAAS,EACzC,GAAI,EAAE,gBAAgB,mBAAoB,CACxC,KAAK,QAAQ,kBAAoB,OACjC,MACF,CAEA,KAAK,iBAAiB,QAAS,IAAM,CACnC,MAAM,QAAU,KAAK,cAAc,IAAI,EACjC,SAAW,KAAK,UAAU,SAAS,2BAA2B,EAChE,SACA,KAAK,UAAU,SAAS,4BAA4B,EAClD,UACA,WAEN,WAAW,KAAM,qBAAsB,CACrC,UAAW,SACX,YAAa,SAAS,aAAe,IAAI,KAAK,EAC9C,YAAa,KAAK,IACpB,CAAC,CACH,CAAC,EAED,KAAK,QAAQ,kBAAoB,MACnC,CAAC,CACL,CAMA,SAAS,eAAe,KAAM,CACtB,gBAAgB,aAClB,KAAK,aAAa,eAAe,IAAM,SAE3C,sBAAsB,IAAI,EAC1B,wBAAwB,IAAI,EAC5B,sBAAsB,IAAI,EAC1B,uBAAuB,IAAI,EAE3B,KAAK,iBAAiB,+BAAiC,OAAU,CAE/D,SAAS,KAAM,OADiC,MACd,QAAQ,SAAW,EAAE,CAAC,CAC1D,CAAC,EAED,KAAK,aAAa,gBAAiB,MAAM,EAEzC,WAAW,KAAM,oBAAqB,CACpC,QAAS,KAAK,QAAQ,SAAW,QACjC,aAAc,KAAK,iBAAiB,4BAA4B,EAAE,OAClE,cAAe,KAAK,iBAAiB,6BAA6B,EAAE,MACtE,CAAC,EACH,CAMA,SAAS,cAAc,QAAU,SAAU,CACzC,MAAM,MAAQ,CAAC,EAEX,mBAAmB,aAAe,QAAQ,QAAQ,aAAa,GACjE,MAAM,KAAK,OAAO,EAGpB,QAAQ,mBAAmB,aAAa,EAAE,QAAS,MAAS,CACtD,gBAAgB,aAClB,MAAM,KAAK,IAAI,CAEnB,CAAC,EAED,MAAM,QAAQ,cAAc,CAC9B,CAEI,SAAS,aAAe,UAC1B,SAAS,iBACP,mBACA,IAAM,cAAc,QAAQ,EAC5B,CAAE,KAAM,EAAK,CACf,EAEA,cAAc,QAAQ,EAIxB,SAAS,iBAAiB,uBAAyB,OAAU,CAC3D,MAAM,OAAS,MAAM,OACjB,kBAAkB,aACpB,cAAc,MAAM,CAExB,CAAC,EAED,SAAS,iBAAiB,uBAAyB,OAAU,CAC3D,MAAM,MAAQ,MAAM,OACpB,GAAI,EAAE,iBAAiB,aAAc,OAErC,MAAM,KAAO,MAAM,QAAQ,aAAa,EACxC,GAAI,EAAE,gBAAgB,aAAc,OAEpC,MAAM,cAAgB,OAAO,WAC3B,kCACF,EAAE,QAEF,MAAM,eAAe,CACnB,SAAU,cAAgB,OAAS,SACnC,MAAO,QACT,CAAC,EAED,MAAM,QAAU,MAAM,cAAc,IAAI,EACxC,SACE,KACA,SAAS,YACL,GAAG,QAAQ,YAAY,KAAK,CAAC,iCAC7B,6CACN,CACF,CAAC,CACH,GAAG",
  "names": []
}
