1(()=>{const t=window.matchMedia("(prefers-reduced-motion: reduce)");const s=()=>t.matches;const e=window.matchMedia("(hover: hover) and (pointer: fine)");const i=()=>e.matches;const l=t=>t==="touch"||t==="pen";const r=t=>l(t?.pointerType);const o=t=>{if(!t)return false;if(r(t))return false;if(t.pointerType==="mouse")return true;return i()};const n=t=>{try{return!!t?.matches?.(":focus-visible")}catch{return false}};const a=t=>{try{return window.localStorage.getItem(t)}catch{return null}};const h=(t,e)=>{try{window.localStorage.setItem(t,e)}catch{}};const m=(t,e)=>{if(!t||!e)return;if(typeof t.addEventListener==="function"){t.addEventListener("change",e);return}if(typeof t.addListener==="function"){t.addListener(e)}};const c=(t,e)=>{if(!t||!e)return;if(typeof t.removeEventListener==="function"){t.removeEventListener("change",e);return}if(typeof t.removeListener==="function"){t.removeListener(e)}};const u=()=>window.innerWidth>=768;const p=()=>{const t=document.createElement("dialog");return typeof t.showModal==="function"};const d=t=>{const e=[...t];for(let t=e.length-1;t>0;t-=1){const i=Math.floor(Math.random()*(t+1));[e[t],e[i]]=[e[i],e[t]]}return e};const v=e=>new Promise(t=>setTimeout(t,e));function f(n,a="transition",l=2e3){if(!n)return Promise.resolve();return new Promise(t=>{let e=false;const i=a==="transition"?"transitionend":"animationend";const r=()=>{if(e)return;e=true;clearTimeout(s);n.removeEventListener(i,o);t()};const o=t=>{if(t.target===n)r()};const s=setTimeout(r,l);n.addEventListener(i,o)})}const g=(t,e)=>f(t,"transition",e);const I=(t,e)=>f(t,"animation",e);const C=()=>new Promise(t=>{requestAnimationFrame(()=>{requestAnimationFrame(t)})});const b=r=>new Promise((t,e)=>{const i=new Image;i.onload=t;i.onerror=()=>e(new Error(`Failed to load image: ${r}`));i.src=r});const w=t=>(t||"").trim();function S(t=document){if(!t)return null;if(t.matches?.(".bespoke-room__wrapper"))return t;const e=t.closest?.(".bespoke-room__wrapper");if(e)return e;return t.querySelector?.(".bespoke-room__wrapper")??null}const y=t=>{const e=new Set;const i=t.querySelectorAll("[data-preload-src], [data-preload-src-mobile], [data-preload-src-desktop]");const r=u();for(const o of i){const s=w(o.dataset.preloadSrc);if(s)e.add(s);if(r){const n=w(o.dataset.preloadSrcDesktop);if(n)e.add(n)}else{const a=w(o.dataset.preloadSrcMobile);if(a)e.add(a)}}return[...e]};const P=t=>{const e=new Set;const i=t.querySelectorAll("[data-deferred-preload-src]");for(const r of i){const o=w(r.dataset.deferredPreloadSrc);if(o)e.add(o)}return[...e]};const F=t=>{const e=new Set;const i=t.querySelectorAll("[data-preload-src-mobile], [data-preload-src-desktop]");const r=u();for(const o of i){const s=r?w(o.dataset.preloadSrcMobile):w(o.dataset.preloadSrcDesktop);if(s)e.add(s)}return[...e]};const A=t=>{t.preventDefault();t.stopPropagation();t.stopImmediatePropagation()};const _=t=>{if(!t)return null;const e=t.closest(".bespoke-room__wrapper");const i=!e?.classList.contains("bespoke-room__wrapper--no-dialog");if(i){return t.querySelector(".bespoke-room__item-link--quickshop")??t.querySelector(".bespoke-room__item-link:not(.bespoke-room__item-link--fallback)")??t.querySelector(".bespoke-room__item-link--fallback")??null}return t.querySelector(".bespoke-room__item-link--fallback")??t.querySelector(".bespoke-room__item-link:not(.bespoke-room__item-link--quickshop)")??t.querySelector(".bespoke-room__item-link--quickshop")??null};const k=t=>{const e=t?.closest?.(".bespoke-room__item-link");if(!e)return null;const i=e.closest(".bespoke-room__item");if(!i)return e;return e===_(i)?e:null};function T(){const s=[];const t=(t,e,i,r)=>{if(!t||!e||!i)return()=>{};t.addEventListener(e,i,r);const o=()=>{t.removeEventListener(e,i,r)};s.push(o);return o};const e=t=>{if(typeof t==="function"){s.push(t)}};const i=()=>{while(s.length){const t=s.pop();try{t()}catch{}}};return{on:t,addCleanup:e,cleanupAll:i}}class L{static startAnimationLoop(){if(L.animationFrameId)return;const r=t=>{let e=false;for(const i of L.instances){i.updateAnimation(t);if(i.state.isAnimating)e=true}L.animationFrameId=e?requestAnimationFrame(r):null};L.animationFrameId=requestAnimationFrame(r)}static createResizeObserver(){if(L.resizeObserver)return;if(typeof ResizeObserver==="undefined")return;L.resizeObserver=new ResizeObserver(t=>{for(const e of t){e.target._spriteItemAnimator?.resizeCanvas(e.contentRect)}})}constructor(t){this.spriteWrapperElement=t;this.spriteSrc=t.dataset.spriteSrc;this.columns=this.getPositiveInt(t.dataset.spriteColumns);this.rows=this.getPositiveInt(t.dataset.spriteRows);this.totalFrames=this.getPositiveInt(t.dataset.spriteFrames);this.fps=this.getPositiveInt(t.dataset.spriteFps,4);this.hasBounceAnimation=t.dataset.spriteAnimationMode==="bounce";this.bounceEndFrame=this.getClampedFrameIndex(t.dataset.spriteBounceEndFrame,null);this.startFrameBeats=this.getFrameBeatCount(t.dataset.spriteStartFrameBeats);this.endFrameBeats=this.getFrameBeatCount(t.dataset.spriteEndFrameBeats);this.loopRestBeats=this.getFrameBeatCount(t.dataset.spriteLoopRestBeats);this.toggleOpenEndFrame=this.getClampedFrameIndex(t.dataset.spriteToggleOpenEndFrame,null);this.defaultFrameSequence=this.buildDefaultFrameSequence();this.toggleCloseFrameSequence=this.buildToggleCloseFrameSequence();this.state={currentFrame:0,lastFrameTime:0,isLoaded:false,isAnimating:false,frames:null,frameIndex:0,endMode:"reset"};this.canvas=document.createElement("canvas");this.canvas.className="bespoke-room__item-image";this.context=this.canvas.getContext("2d");if(!this.context){throw new Error("Failed to get 2D canvas context")}this.image=new Image;this.frameWidth=0;this.frameHeight=0;this.frameDuration=1e3/this.fps;this.cssWidth=1;this.cssHeight=1;this.canvasDpr=window.devicePixelRatio||1;this.resolveCurrentRun=null;this.isDestroyed=false;
1this.spriteWrapperElement.prepend(this.canvas);this.spriteWrapperElement._spriteItemAnimator=this}getFiniteNumber(t,e=null){if(t===undefined||t===null||t==="")return e;const i=Number(t);return Number.isFinite(i)?i:e}getPositiveInt(t,e=1){const i=this.getFiniteNumber(t,e);return Math.max(1,Math.floor(i))}getClampedFrameIndex(t,e=0){const i=this.getFiniteNumber(t,e);if(i===null)return e;return this.clampFrame(i)}getFrameBeatCount(t){const e=this.getFiniteNumber(t,0);return Math.max(0,Math.floor(e))}getLastFrameIndex(){return Math.max(0,(this.totalFrames||0)-1)}clampFrame(t){return Math.max(0,Math.min(t,this.getLastFrameIndex()))}async loadSprite(){if(!this.spriteSrc)return;if(this.image?.src)return;await new Promise((t,e)=>{this.image.onload=t;this.image.onerror=()=>e(new Error(`Failed to load sprite: ${this.spriteSrc}`));this.image.src=this.spriteSrc});if(this.image.width<=0||this.image.height<=0){throw new Error(`Sprite loaded with invalid dimensions: ${this.spriteSrc}`)}this.frameWidth=this.image.width/this.columns;this.frameHeight=this.image.height/this.rows}buildForwardFrames(t,e,{startFrameBeats:i=0,endFrameBeats:r=0}={}){const o=this.clampFrame(t);const s=Math.max(o,this.clampFrame(e));const n=[o];for(let t=0;t<i;t+=1){n.push(o)}for(let t=o+1;t<=s;t+=1){n.push(t)}for(let t=0;t<r;t+=1){n.push(s)}return n}buildForwardFrameSequence({startFrame:t=0,startFrameBeats:e=this.startFrameBeats}={}){return this.buildForwardFrames(t,this.getLastFrameIndex(),{startFrameBeats:e,endFrameBeats:this.endFrameBeats})}appendLoopRestBeats(t,e=this.loopRestBeats){const i=this.clampFrame(t[0]??0);const r=[...t];for(let t=0;t<e;t+=1){r.push(i)}return r}buildBounceFrameSequence(t=null,{startFrameBeats:e=this.startFrameBeats}={}){const i=this.clampFrame(t??this.getLastFrameIndex());const r=this.buildForwardFrames(0,i,{startFrameBeats:e,endFrameBeats:this.endFrameBeats});for(let t=i-1;t>=0;t-=1){r.push(t)}return r}buildDefaultFrameSequence(){const t=this.hasBounceAnimation?this.buildBounceFrameSequence(this.bounceEndFrame):this.buildForwardFrameSequence();return this.appendLoopRestBeats(t,this.loopRestBeats)}buildToggleCloseFrameSequence(){if(this.toggleOpenEndFrame===null){return null}const t=this.toggleOpenEndFrame+1;return t<=this.getLastFrameIndex()?this.buildForwardFrames(t,this.getLastFrameIndex()):null}completeCurrentRun(){if(this.resolveCurrentRun){this.resolveCurrentRun();this.resolveCurrentRun=null}}finishAnimationThenResetHover(){if(this.state.isAnimating){this.state.endMode="reset";return}this.resetToFirstFrame()}startHover(){if(!this.state.isLoaded){return}if(this.state.isAnimating){this.state.endMode="loop";return}this.startAnimation({frames:this.defaultFrameSequence,endMode:"loop"})}stopHover(){this.finishAnimationThenResetHover()}isRunning(){return!!this.state.isAnimating}isLooping(){return!!(this.state.isAnimating&&this.state.endMode==="loop")}
1async init(){if(this.isDestroyed)return this;L.createResizeObserver();await this.loadSprite();if(this.isDestroyed)return this;this.state.isLoaded=true;if(!this.resizeCanvas()){this.drawFrame(0)}if(L.resizeObserver){L.resizeObserver.observe(this.spriteWrapperElement)}L.instances.add(this);this.spriteWrapperElement.classList.add("bespoke-room__item--sprite-initialized");return this}destroy(){this.isDestroyed=true;this.completeCurrentRun();this.state.isAnimating=false;if(L.resizeObserver){L.resizeObserver.unobserve(this.spriteWrapperElement)}L.instances.delete(this);if(this.spriteWrapperElement?._spriteItemAnimator===this){this.spriteWrapperElement._spriteItemAnimator=null}if(this.canvas?.parentNode===this.spriteWrapperElement){this.spriteWrapperElement.removeChild(this.canvas)}}getCanvasCSSSize(t=this.spriteWrapperElement.getBoundingClientRect()){const e=this.spriteWrapperElement.clientWidth||Math.round(t.width)||0;const i=this.spriteWrapperElement.clientHeight||Math.round(t.height)||0;const r=Math.max(1,e);let o=i;if(o<=1&&this.frameWidth>0&&this.frameHeight>0){o=Math.round(r*(this.frameHeight/this.frameWidth))}o=Math.max(1,o);return{cssWidth:r,cssHeight:o}}resizeCanvas(t=this.spriteWrapperElement.getBoundingClientRect()){const e=window.devicePixelRatio||1;const{cssWidth:i,cssHeight:r}=this.getCanvasCSSSize(t);if(this.cssWidth===i&&this.cssHeight===r&&this.canvasDpr===e){return false}this.cssWidth=i;this.cssHeight=r;this.canvasDpr=e;this.canvas.width=Math.max(1,Math.round(i*e));this.canvas.height=Math.max(1,Math.round(r*e));this.context.setTransform(e,0,0,e,0,0);this.drawFrame(this.state.currentFrame);return true}drawFrame(t){if(!this.state.isLoaded)return;if(!this.image)return;const e=this.clampFrame(t);const i=e%this.columns;const r=Math.floor(e/this.columns);this.context.clearRect(0,0,this.cssWidth,this.cssHeight);this.context.drawImage(this.image,i*this.frameWidth,r*this.frameHeight,this.frameWidth,this.frameHeight,0,0,this.cssWidth,this.cssHeight)}startAnimation({frames:t=[0],endMode:e="reset"}={}){if(!this.state.isLoaded)return Promise.resolve();const i=Array.isArray(t)?t.filter(Number.isFinite):[];if(!i.length)return Promise.resolve();if(s()){if(e==="hold")this.holdFrame(i[i.length-1]);else this.resetToFirstFrame();return Promise.resolve()}if(e!=="loop"&&this.resolveCurrentRun){this.resolveCurrentRun();this.resolveCurrentRun=null}this.state.isAnimating=true;this.state.endMode=e;this.state.frames=i;this.state.frameIndex=0;this.state.currentFrame=i[0];if(!this.resizeCanvas()){this.drawFrame(this.state.currentFrame)}this.state.lastFrameTime=performance.now()-this.frameDuration;L.startAnimationLoop();if(e==="loop")return Promise.resolve();return new Promise(t=>{this.resolveCurrentRun=t})}holdFrame(t=this.state.currentFrame){this.state.isAnimating=false;this.state.frames=null;this.state.frameIndex=0;this.state.endMode="hold";this.state.lastFrameTime=0;this.state.currentFrame=this.clampFrame(t);if(!this.resizeCanvas()){this.drawFrame(this.state.currentFrame)}this.completeCurrentRun()}holdLastFrame(){this.holdFrame(this.getLastFrameIndex())}resetToFirstFrame(){this.state.isAnimating=false;this.state.frames=null;this.state.frameIndex=0;this.state.endMode="reset";this.state.lastFrameTime=0;this.state.currentFrame=0;if(!this.resizeCanvas()){this.drawFrame(0)}this.completeCurrentRun()}clearAnimation(){if(this.state.endMode==="hold")this.holdFrame();else this.resetToFirstFrame()}playOnceAndReset(){return this.startAnimation({frames:this.defaultFrameSequence,endMode:"reset"})}playOnceAndHold(){return this.startAnimation({frames:this.defaultFrameSequence,endMode:"hold"})}playToggleOpenAndHold(){if(this.toggleOpenEndFrame===null)return Promise.resolve();const t=this.clampFrame(this.toggleOpenEndFrame);const e=this.clampFrame(this.state.currentFrame);return this.startAnimation({frames:this.buildForwardFrames(e,t),endMode:"hold"})}async playToggleCloseAndReset(){if(this.toggleOpenEndFrame===null){this.resetToFirstFrame();return}if(this.toggleCloseFrameSequence?.length){await this.startAnimation({frames:this.toggleCloseFrameSequence,endMode:"hold"})}this.resetToFirstFrame()}updateAnimation(t){if(!this.state.isLoaded||!this.state.isAnimating)return;if(!this.image)return;if(!this.state.lastFrameTime)this.state.lastFrameTime=t;const e=t-this.state.lastFrameTime;if(e<this.frameDuration)return;this.state.lastFrameTime=t-e%this.frameDuration;const i=this.state.frames||[this.state.currentFrame];const r=this.state.frameIndex+1;if(r<i.length){this.state.frameIndex=r;this.state.currentFrame=i[r];this.drawFrame(this.state.currentFrame);return}if(this.state.endMode==="loop"){this.state.frameIndex=0;this.state.currentFrame=i[0];this.drawFrame(this.state.currentFrame);return}if(this.state.endMode==="hold"){this.state.isAnimating=false;this.state.lastFrameTime=0;this.completeCurrentRun();return}this.resetToFirstFrame()}}L.instances=new Set;L.resizeObserver=null;L.animationFrameId=null;class H{constructor(t,{isCustomCSSHover:e=false,isItemVisuallyHovered:i}={}){this.item=t;this.image=t?.querySelector(".bespoke-room__item-image")??null;
1this.isCustomCSSHover=e;this.isItemVisuallyHovered=i??(()=>false);this.loopActive=false;this.loopTimeoutId=null;this.animationEndHandler=null;this.isCycleRunning=false;this.isDestroyed=false;this.item._cssItemAnimator=this}getCycleDelay(){return this.isCustomCSSHover?0:1e3}isRunning(){return!!(this.isCycleRunning||this.loopActive||this.item?.classList.contains("bespoke-room__item--animate"))}isLooping(){return!!this.loopActive}clearLoopTimeout(){clearTimeout(this.loopTimeoutId);this.loopTimeoutId=null}clearAnimationEndListener(){if(this.image&&this.animationEndHandler){this.image.removeEventListener("animationend",this.animationEndHandler)}this.animationEndHandler=null}restartCycle(){if(!this.item)return;this.item.classList.remove("bespoke-room__item--animate");void this.item.offsetWidth;this.item.classList.add("bespoke-room__item--animate")}scheduleNextCycle(t){const e=this.getCycleDelay();if(e>0){this.loopTimeoutId=setTimeout(()=>{this.loopTimeoutId=null;t()},e);return}t()}startHover(){if(this.isDestroyed||!this.item||!this.image)return;if(this.isCustomCSSHover&&this.isCycleRunning){this.loopActive=true;return}if(this.loopActive)return;this.loopActive=true;const e=()=>{if(this.isDestroyed||!this.item||!this.loopActive)return;if(!this.isItemVisuallyHovered(this.item)){this.clearAnimation();return}this.clearLoopTimeout();this.clearAnimationEndListener();this.isCycleRunning=true;this.animationEndHandler=t=>{if(t.target!==this.image)return;this.isCycleRunning=false;this.item.classList.remove("bespoke-room__item--animate");this.clearAnimationEndListener();if(this.loopActive&&this.isItemVisuallyHovered(this.item)){this.scheduleNextCycle(e);return}this.clearAnimation()};this.image.addEventListener("animationend",this.animationEndHandler);this.restartCycle()};e()}stopHover(){if(this.isCustomCSSHover){this.loopActive=false;this.clearLoopTimeout();return}this.clearAnimation()}clearAnimation(){this.loopActive=false;this.isCycleRunning=false;this.clearLoopTimeout();this.clearAnimationEndListener();this.item?.classList.remove("bespoke-room__item--animate")}destroy(){if(this.isDestroyed)return;const t=this.item;this.isDestroyed=true;this.clearAnimation();if(t?._cssItemAnimator===this){t._cssItemAnimator=null}this.item=null;this.image=null}async playOnce(){if(this.isDestroyed||!this.item||!this.image)return;this.loopActive=false;this.clearLoopTimeout();this.clearAnimationEndListener();this.isCycleRunning=true;this.restartCycle();await I(this.image);if(this.isDestroyed||!this.item)return;this.isCycleRunning=false;this.item.classList.remove("bespoke-room__item--animate")}}class M{constructor({getItemBehavior:t}={}){this.getItemBehavior=t??(()=>null)}isToggleSprite(t){return!!this.getItemBehavior(t)?.isToggleSprite}isHoverSprite(t){return!!this.getItemBehavior(t)?.isHoverSprite}isItemVisuallyHovered(t){return!!t&&(t.classList.contains("bespoke-room__item--hover")||t.classList.contains("bespoke-room__item--touch-hover"))}isHoverAnimationAvailable(t){return!!this.getItemBehavior(t)?.hasHover}isCustomCSSHover(t){return!!this.getItemBehavior(t)?.isCustomCSSHover}getCSSItemAnimator(t){if(!t)return null;if(t._cssItemAnimator)return t._cssItemAnimator;return new H(t,{isCustomCSSHover:this.isCustomCSSHover(t),isItemVisuallyHovered:t=>this.isItemVisuallyHovered(t)})}isItemAnimationRunning(t){if(!t)return false;if(this.isHoverSprite(t)){return!!t._spriteItemAnimator?.isRunning()}return!!(t._cssItemAnimator?.isRunning()||t.classList.contains("bespoke-room__item--animate"))}containsLoopingAnimation(t=[]){return t.some(t=>{if(!t)return false;if(this.isHoverSprite(t)){return!!t._spriteItemAnimator?.isLooping()}return!!t._cssItemAnimator?.isLooping()})}startHoverAnimation(t){if(!t||!this.isHoverAnimationAvailable(t))return;if(s())return;if(this.isHoverSprite(t)){if(this.isToggleSprite(t))return;t._spriteItemAnimator?.startHover();return}this.getCSSItemAnimator(t)?.startHover()}stopHoverAnimation(t){if(!t||!this.isHoverAnimationAvailable(t))return;if(this.isHoverSprite(t)){if(this.isToggleSprite(t))return;t._spriteItemAnimator?.stopHover();return}this.getCSSItemAnimator(t)?.stopHover()}clearInteractionState(t){if(!t)return;t.classList.remove("bespoke-room__item--hover");t.classList.remove("bespoke-room__item--touch-hover");if(!this.isHoverAnimationAvailable(t))return;if(this.isHoverSprite(t)){t._spriteItemAnimator?.clearAnimation();return}if(t._cssItemAnimator)t._cssItemAnimator.clearAnimation();else t.classList.remove("bespoke-room__item--animate")}async playOnce(t){if(!t||!this.isHoverAnimationAvailable(t))return;if(s()){return}if(this.isHoverSprite(t)){await(t._spriteItemAnimator?.playOnceAndReset()??Promise.resolve());return}await this.getCSSItemAnimator(t)?.playOnce()}activateHover(t){if(!t)return;t.classList.add("bespoke-room__item--hover");this.startHoverAnimation(t)}deactivateHover(t){if(!t)return;t.classList.remove("bespoke-room__item--hover");this.stopHoverAnimation(t)}}class O{constructor({roomWrapper:t,isEnabled:e,getItemBehavior:i}={}){this.roomWrapper=t;this.isEnabled=e??(()=>true);this.getItemBehavior=i??(()=>null);this.tooltipElement=null;this.targetItem=null;this.isVisible=false;this.showTimeoutId=null;this.pendingTargetItem=null;this.pointerX=null;this.pointerY=null;this.pointerType=null;this.positionMode="pointer";this.offset=10;this.delay=150;this.viewportPadding=8}getTooltipText(t){return this.getItemBehavior(t)?.tooltip||""}create(){if(this.tooltipElement)return this.tooltipElement;this.tooltipElement=document.createElement("div");this.tooltipElement.className="bespoke-room__tooltip";this.tooltipElement.setAttribute("aria-hidden","true");this.roomWrapper.appendChild(this.tooltipElement);return this.tooltipElement}setPointer(t,e,i){this.pointerX=t;this.pointerY=e;this.pointerType=i;this.positionMode="pointer";if(this.isVisible)this.position()}clearPointer(){this.pointerX=null;this.pointerY=null;this.pointerType=null}isValidPointerPosition(){return Number.isFinite(this.pointerX)&&Number.isFinite(this.pointerY)}cancelScheduledShow(){clearTimeout(this.showTimeoutId);this.showTimeoutId=null;this.pendingTargetItem=null}scheduleShow(t){if(!this.isEnabled()||!this.getTooltipText(t))return;if(this.showTimeoutId&&this.pendingTargetItem===t)return;this.cancelScheduledShow();this.pendingTargetItem=t;this.showTimeoutId=setTimeout(()=>{this.showTimeoutId=null;this.pendingTargetItem=null;this.show(t)},this.delay)}show(t,e="pointer"){this.create();const i=this.getTooltipText(t);if(!this.isEnabled()||!i)return;this.tooltipElement.textContent=i;this.pendingTargetItem=null;this.targetItem=t;this.positionMode=e;this.isVisible=true;this.tooltipElement.classList.add("bespoke-room__tooltip--visible");this.position()}hide(){this.cancelScheduledShow();this.targetItem=null;this.isVisible=false;this.tooltipElement?.classList.remove("bespoke-room__tooltip--visible")}position(){if(!this.isVisible||!this.tooltipElement)return;const t=this.tooltipElement.getBoundingClientRect();const e=this.roomWrapper.getBoundingClientRect();const i=this.positionMode==="target"||!this.isValidPointerPosition();const r=i?this.targetItem?.getBoundingClientRect():null;let o;let s;
1if(i&&r){o=r.left+r.width/2-t.width/2;s=r.bottom+this.offset+8;if(s+t.height+this.viewportPadding>e.bottom){s=r.top-t.height-this.offset-8}}else{o=this.pointerType==="touch"?this.pointerX-t.width/2:this.pointerX+this.offset;s=this.pointerType==="touch"?this.pointerY+this.offset+10:this.pointerY+this.offset+12;if(s+t.height+this.viewportPadding>e.bottom){s=this.pointerY-t.height-this.offset}}const n=e.left+this.viewportPadding;const a=e.right-t.width-this.viewportPadding;const l=e.top+this.viewportPadding;const h=e.bottom-t.height-this.viewportPadding;o=Math.min(Math.max(o,n),Math.max(n,a));s=Math.min(Math.max(s,l),Math.max(l,h));o-=e.left;s-=e.top;this.tooltipElement.style.left=`${o}px`;this.tooltipElement.style.top=`${s}px`}}class x{constructor({delay:t=6e3,getItems:e,isEnabled:i,isBlocked:r,isItemEligible:o,playAnimation:s}={}){this.delay=t;this.getItems=e??(()=>[]);this.isEnabled=i??(()=>true);this.isBlocked=r??(()=>false);this.isItemEligible=o??(()=>true);this.playAnimation=s??(()=>Promise.resolve());this.timerId=null;this.isActive=false;this.itemPool=[]}clearTimer(){clearTimeout(this.timerId);this.timerId=null}refillItemPool(){this.itemPool=d(this.getItems())}getNextItem(){if(!this.itemPool.length)this.refillItemPool();while(this.itemPool.length){const t=this.itemPool.shift();if(!t)continue;if(!this.isItemEligible(t))continue;return t}return null}async runOnce(){if(document.hidden){this.clearTimer();return}if(!this.isActive||!this.isEnabled()||this.isBlocked()){this.scheduleNextRun();return}try{const t=this.getNextItem();if(t)await this.playAnimation(t)}catch{this.stop();return}this.scheduleNextRun()}scheduleNextRun(){this.clearTimer();if(!this.isActive||!this.isEnabled())return;this.timerId=setTimeout(()=>{void this.runOnce()},this.delay)}delayIdleAnimation(){if(this.isActive)this.scheduleNextRun()}start(){this.isActive=true;this.refillItemPool();this.scheduleNextRun()}stop(){this.isActive=false;this.clearTimer()}}class B{constructor({getTooltipController:t,animationController:e,delayIdleAnimation:i,activateItemLink:r,showTooltip:o}={}){this.getTooltipController=t??(()=>null);this.animationController=e;this.delayIdleAnimation=i??(()=>{});this.activateItemLink=r??(()=>{});this.showTooltip=o??(()=>{});this.activePreviewItem=null}get tooltipController(){return this.getTooltipController()}clearPreview(){if(this.activePreviewItem){this.animationController.stopHoverAnimation(this.activePreviewItem);this.activePreviewItem.classList.remove("bespoke-room__item--touch-hover");if(this.tooltipController.targetItem===this.activePreviewItem){this.tooltipController.hide()}this.activePreviewItem=null}}handOffPreviewToPointer(t){if(this.activePreviewItem!==t)return false;t.classList.remove("bespoke-room__item--touch-hover");this.activePreviewItem=null;return true}activatePreview(t,{clientX:e,clientY:i}={}){const r=this.animationController.isItemAnimationRunning(t);if(this.activePreviewItem!==t){this.clearPreview()}this.delayIdleAnimation();this.activePreviewItem=t;t.classList.add("bespoke-room__item--touch-hover");if(Number.isFinite(e)&&Number.isFinite(i)){this.tooltipController.setPointer(e,i,"touch");this.showTooltip(t,"pointer")}else{this.tooltipController.clearPointer();this.showTooltip(t,"target")}if(!r){void this.animationController.playOnce(t)}}markTogglePreviewActive(t){this.clearPreview();this.delayIdleAnimation();this.activePreviewItem=t;t.classList.add("bespoke-room__item--touch-hover")}activateFromTooltip(t){this.clearPreview();this.activateItemLink(t)}}class q{constructor({roomWrapper:t,getItemLinks:e}={}){this.roomWrapper=t;this.getItemLinks=e??(()=>[]);this.roomItemLinks=[];this.sceneStatusLiveRegion=null}cacheElements(){this.sceneStatusLiveRegion=this.roomWrapper.querySelector(".bespoke-room__scene-status");this.roomItemLinks=[...this.getItemLinks()];for(const t of this.roomItemLinks){if(!t.hasAttribute("data-original-tabindex")&&t.hasAttribute("tabindex")){t.setAttribute("data-original-tabindex",t.getAttribute("tabindex")??"")}}}restoreLinkAccessibility(t){const e=t.getAttribute("data-original-tabindex");if(e===null)t.removeAttribute("tabindex");else if(e==="")t.setAttribute("tabindex","0");else t.setAttribute("tabindex",e);delete t.dataset.bespokeRoomLinkDisabled;t.removeAttribute("aria-hidden")}disableLinkAccessibility(t){if(t.dataset.bespokeRoomLinkDisabled!=="true"&&!t.hasAttribute("data-original-tabindex")&&t.hasAttribute("tabindex")){t.setAttribute("data-original-tabindex",t.getAttribute("tabindex")??"")}t.dataset.bespokeRoomLinkDisabled="true";t.setAttribute("tabindex","-1");t.setAttribute("aria-hidden","true")}updateItemLinkAccessibility(t){for(const e of this.roomItemLinks){if(t){this.restoreLinkAccessibility(e)}else{this.disableLinkAccessibility(e)}}}updateSceneStatusFromData(t){if(!this.sceneStatusLiveRegion)return;const e=this.sceneStatusLiveRegion.dataset[t];if(!e)return;this.sceneStatusLiveRegion.textContent="";requestAnimationFrame(()=>{this.sceneStatusLiveRegion.textContent=e})}}class z{constructor({roomWrapper:t,roomDimmer:e,windowItem:i,updateSceneStatusFromData:r,isInteractive:o,enterInteractiveMode:s}={}){this.roomWrapper=t;this.roomDimmer=e;this.windowItem=i;this.updateSceneStatusFromData=r??(()=>{});this.isInteractive=o??(()=>false);this.enterInteractiveMode=s??(()=>{});this.isIntroRunning=false;this.storageKey="bespokeRoomIntroPlayed"}shouldSkip(){return!!a(this.storageKey)}markPlayed(){h(this.storageKey,"true")}
1applySkippedIntroVisualState(){if(s())return;void(async()=>{await v(300);await this.windowItem?._spriteItemAnimator?.playOnceAndHold()})()}async highlightRoomItems(){this.roomWrapper.classList.remove("bespoke-room__wrapper--pulse");void this.roomWrapper.offsetWidth;this.roomWrapper.classList.add("bespoke-room__wrapper--pulse");await I(this.roomDimmer);this.roomWrapper.classList.remove("bespoke-room__wrapper--pulse")}async runFullIntro(){if(this.isInteractive()||this.isIntroRunning)return;this.isIntroRunning=true;try{this.updateSceneStatusFromData("messageIntroStarted");await v(300);if(!s()){await this.windowItem?._spriteItemAnimator?.playOnceAndHold()}await v(300);await this.highlightRoomItems();this.enterInteractiveMode();this.markPlayed()}finally{this.isIntroRunning=false}}async runMinimalIntro(){if(this.isInteractive()||this.isIntroRunning)return;this.isIntroRunning=true;try{this.updateSceneStatusFromData("messageIntroStarted");this.windowItem?._spriteItemAnimator?.holdLastFrame();await v(1e3);await this.highlightRoomItems();this.enterInteractiveMode();this.markPlayed()}finally{this.isIntroRunning=false}}}class N{constructor({roomWrapper:t,spriteRoomItems:e,loaderElement:i}={}){this.roomWrapper=t;this.spriteRoomItems=e??[];this.loaderElement=i;this.prioritySpriteItems=this.spriteRoomItems.filter(t=>t.hasAttribute("data-preload-src"));this.prioritySpriteItemsSet=new Set(this.prioritySpriteItems);this.prioritySpriteInitializationPromise=null;this.deferredAssetLoadingPromise=null;this.isDestroyed=false}
1async hideLoader(){if(!this.loaderElement)return;const t=this.loaderElement.querySelector(".bespoke-room__loader-text");const e=t?parseFloat(getComputedStyle(t).opacity)>0:false;this.loaderElement.classList.remove("bespoke-room__loader--visible");this.loaderElement.setAttribute("aria-hidden","true");if(e){await g(this.loaderElement,500);await v(300)}}async preloadCriticalImages(){const t=y(this.roomWrapper);await Promise.allSettled(t.map(b))}async preloadDeferredImages(){const t=P(this.roomWrapper);await Promise.allSettled(t.map(b))}async preloadAlternateBreakpointImages(){const t=F(this.roomWrapper);await Promise.allSettled(t.map(b))}initializePrioritySpriteAnimators(){return Promise.allSettled(this.prioritySpriteItems.map(t=>this.initializeSpriteItemAnimator(t)))}startPrioritySpriteInitialization(){if(this.prioritySpriteInitializationPromise)return this.prioritySpriteInitializationPromise;this.prioritySpriteInitializationPromise=this.initializePrioritySpriteAnimators();return this.prioritySpriteInitializationPromise}initializeRemainingSpriteAnimators(){const t=this.spriteRoomItems.filter(t=>!this.prioritySpriteItemsSet.has(t)&&!t._spriteItemAnimator);return Promise.allSettled(t.map(t=>this.initializeSpriteItemAnimator(t)))}async initializeSpriteItemAnimator(t){if(this.isDestroyed)return null;if(t._spriteItemAnimator){return t._spriteItemAnimator}const e=new L(t);try{const i=await e.init();if(this.isDestroyed){i?.destroy?.();return null}return i}catch(t){e.destroy();return null}}startDeferredAssetLoading(){if(this.deferredAssetLoadingPromise)return this.deferredAssetLoadingPromise;this.deferredAssetLoadingPromise=(async()=>{await this.preloadDeferredImages();if(this.isDestroyed)return;await this.initializeRemainingSpriteAnimators();if(this.isDestroyed)return;await this.preloadAlternateBreakpointImages()})();return this.deferredAssetLoadingPromise}destroySpriteAnimators(){this.isDestroyed=true;for(const t of this.spriteRoomItems){t._spriteItemAnimator?.destroy?.();t.classList.remove("bespoke-room__item--sprite-initialized")}}}class K{constructor({events:t,getItems:e,getItemBehavior:i,isEnabled:r,delayIdleAnimation:o,touchPreviewController:s,tooltipController:n,isKeyboardFocusHoverActive:a}={}){this.events=t;this.getItems=e??(()=>[]);this.getItemBehavior=i??(()=>null);this.isEnabled=r??(()=>false);this.delayIdleAnimation=o??(()=>{});this.touchPreviewController=s;this.tooltipController=n;this.isKeyboardFocusHoverActive=a??(()=>false)}isToggleSpriteItem(t){return!!this.getItemBehavior(t)?.isToggleSprite}getToggleState(t){if(!t?._toggleSpriteState){t._toggleSpriteState={isOpen:false,isTransitioning:false,suppressRestoredFocusHover:false}}return t._toggleSpriteState}isOpenOrTransitioning(t){if(!this.isToggleSpriteItem(t))return false;const e=this.getToggleState(t);return e.isOpen||e.isTransitioning}syncToggleControlLabel(t){if(!this.isToggleSpriteItem(t))return;const e=this.getItemBehavior(t)?.itemLink;if(!e)return;const i=this.getToggleState(t);const r=e.dataset.labelClosed||"";const o=e.dataset.labelOpen||r;const s=i.isOpen?o:r;const n=e.querySelector(".sr-only");if(n){n.textContent=s}else if(s){e.setAttribute("aria-label",s)}}async toggleItem(t){if(!this.isToggleSpriteItem(t))return;if(!this.isEnabled())return;const e=this.getToggleState(t);if(e.isTransitioning)return;const i=t._spriteItemAnimator;if(!i){if(this.touchPreviewController?.activePreviewItem===t){this.touchPreviewController.clearPreview()}return}e.isTransitioning=true;this.delayIdleAnimation();const r=this.touchPreviewController?.activePreviewItem===t;const o=r&&s();if(!r){this.touchPreviewController?.clearPreview()}this.tooltipController?.cancelScheduledShow();if(this.tooltipController?.targetItem===t){this.tooltipController.hide()}try{if(e.isOpen){await i.playToggleCloseAndReset();e.isOpen=false;if(!o){t.classList.remove("bespoke-room__item--touch-hover");if(r||!t.matches(":hover")&&!this.isKeyboardFocusHoverActive(t)){t.classList.remove("bespoke-room__item--hover")}}}else{await i.playToggleOpenAndHold();e.isOpen=true}this.syncToggleControlLabel(t)}finally{if(o){await v(300)}e.isTransitioning=false;if(this.touchPreviewController?.activePreviewItem===t){this.touchPreviewController.clearPreview()}if(r&&e.isOpen||o){t.classList.remove("bespoke-room__item--touch-hover","bespoke-room__item--hover")}}}bindEvents(){for(const e of this.getItems()){const t=this.getItemBehavior(e);if(!t?.isToggleSprite)continue;const i=t.itemLink;if(!i)continue;
1this.syncToggleControlLabel(e);this.events.on(i,"click",t=>{A(t);void this.toggleItem(e)})}}}class V{constructor({events:t,getItems:e,getItemBehavior:i,isEnabled:r,delayIdleAnimation:o,tooltipController:s,animationController:n,touchPreviewController:a,toggleSpriteController:l,clearPreviousFocusHover:h}={}){this.events=t;this.getItems=e??(()=>[]);this.getItemBehavior=i??(()=>null);this.isEnabled=r??(()=>false);this.delayIdleAnimation=o??(()=>{});this.tooltipController=s;this.animationController=n;this.touchPreviewController=a;this.toggleSpriteController=l;this.clearPreviousFocusHover=h??(()=>false);this.hasMouseMovedSinceInteractive=false;this.currentPointerHoverItem=null}resetMouseTooltipDelayGate(){this.hasMouseMovedSinceInteractive=false}forHoverCapablePointer(e){return t=>{if(o(t))e(t)}}handOffTouchPreviewToPointer(t,e){const i=this.touchPreviewController.activePreviewItem;if(!i)return;if(i!==t){this.touchPreviewController.clearPreview();return}this.touchPreviewController.handOffPreviewToPointer(t);this.tooltipController.setPointer(e.clientX,e.clientY,"mouse")}preparePointerHover(t,e,i){this.handOffTouchPreviewToPointer(t,e);this.clearPreviousPointerHover(t);const r=i?this.toggleSpriteController.getToggleState(t):null;if(r)r.suppressRestoredFocusHover=false}clearPreviousPointerHover(t){const e=this.currentPointerHoverItem;if(!e||e===t)return;if(this.tooltipController.pendingTargetItem===e){this.tooltipController.cancelScheduledShow()}if(this.tooltipController.targetItem===e){this.tooltipController.hide()}if(this.toggleSpriteController.isOpenOrTransitioning(e)){e.classList.remove("bespoke-room__item--hover")}else{this.animationController.deactivateHover(e)}this.currentPointerHoverItem=null}setPointerHoverItem(t){this.currentPointerHoverItem=t}clearPointerHoverItem(t){if(this.currentPointerHoverItem===t){this.currentPointerHoverItem=null}}handlePointerEnter(t,e,i){this.delayIdleAnimation();if(!this.isEnabled())return;this.preparePointerHover(t,e,i);this.clearPreviousFocusHover(t);if(this.toggleSpriteController.isOpenOrTransitioning(t)){t.classList.add("bespoke-room__item--hover");this.setPointerHoverItem(t);return}this.tooltipController.setPointer(e.clientX,e.clientY,"mouse");this.animationController.activateHover(t);this.setPointerHoverItem(t);if(this.hasMouseMovedSinceInteractive){this.tooltipController.scheduleShow(t)}}handlePointerMove(t,e,i){if(!this.isEnabled())return;this.preparePointerHover(t,e,i);const r=this.clearPreviousFocusHover(t);if(this.toggleSpriteController.isOpenOrTransitioning(t)){t.classList.add("bespoke-room__item--hover");this.setPointerHoverItem(t);return}const o=!this.hasMouseMovedSinceInteractive;this.hasMouseMovedSinceInteractive=true;this.tooltipController.setPointer(e.clientX,e.clientY,"mouse");if(!this.animationController.isItemVisuallyHovered(t)){this.animationController.activateHover(t);this.setPointerHoverItem(t);this.tooltipController.scheduleShow(t);return}if(r){this.animationController.startHoverAnimation(t);this.tooltipController.scheduleShow(t);return}if(!this.animationController.isItemAnimationRunning(t)){this.animationController.startHoverAnimation(t);this.setPointerHoverItem(t);if(this.tooltipController.targetItem!==t||!this.tooltipController.isVisible){this.tooltipController.scheduleShow(t);return}}if(o&&this.tooltipController.targetItem!==t&&!this.tooltipController.isVisible){this.tooltipController.scheduleShow(t)}}handlePointerLeave(t){this.tooltipController.cancelScheduledShow();if(this.tooltipController.targetItem===t){this.tooltipController.hide()}if(this.toggleSpriteController.isOpenOrTransitioning(t)){t.classList.remove("bespoke-room__item--hover");this.clearPointerHoverItem(t);return}this.animationController.deactivateHover(t);this.clearPointerHoverItem(t)}handlePointerCancel(t){this.tooltipController.cancelScheduledShow();if(this.tooltipController.targetItem===t){this.tooltipController.hide()}if(this.touchPreviewController.activePreviewItem===t){this.touchPreviewController.clearPreview()}if(this.toggleSpriteController.isOpenOrTransitioning(t)){t.classList.remove("bespoke-room__item--hover");t.classList.remove("bespoke-room__item--touch-hover");this.clearPointerHoverItem(t);return}this.animationController.deactivateHover(t);this.clearPointerHoverItem(t)}bindItemPointerEvents(e,t){const i=t?.itemLink;if(!i)return;const r=!!t.isToggleSprite;this.events.on(i,"pointerenter",this.forHoverCapablePointer(t=>this.handlePointerEnter(e,t,r)));this.events.on(i,"pointermove",this.forHoverCapablePointer(t=>this.handlePointerMove(e,t,r)));this.events.on(i,"pointerleave",this.forHoverCapablePointer(()=>this.handlePointerLeave(e)));this.events.on(i,"pointercancel",()=>this.handlePointerCancel(e))}bindEvents(){for(const t of this.getItems()){this.bindItemPointerEvents(t,this.getItemBehavior(t))}}}class Y{constructor(t,e){this.roomWrapper=t;this.roomDimmer=e;this.hasDialogSupport=p();this.roomWrapper.classList.toggle("bespoke-room__wrapper--no-dialog",!this.hasDialogSupport);this.roomItems=[...this.roomWrapper.querySelectorAll(".bespoke-room__item")];this.spriteRoomItems=[...this.roomWrapper.querySelectorAll(".bespoke-room__item--sprite")];this.popupDialogs=[...this.roomWrapper.querySelectorAll(".popup-dialog")];this.windowItem=this.roomWrapper.querySelector(".bespoke-room__item--sprite.bespoke-room__item--window");this.loaderElement=this.roomWrapper.querySelector(".bespoke-room__loader");this.itemBehaviors=new Map(this.roomItems.map(t=>[t,this.buildItemBehavior(t)]));this.assetLoader=new N({roomWrapper:this.roomWrapper,spriteRoomItems:this.spriteRoomItems,loaderElement:this.loaderElement});this.interactiveRoomItems=this.roomItems.filter(t=>this.getItemBehavior(t)?.isInteractive);this.phase="loading";this.isPopupOpen=false;this.popupObserver=null;this.isDestroyed=false;this.lastPointerDown=null;this.ignoreNextSyntheticTouchClick=false;this.suppressNextTooltipTouchClick=false;this.lastInteractionWasKeyboard=false;this.wrapperResizeObserver=null;this.currentFocusHoverItem=null;this.events=T();this.animationController=new M({getItemBehavior:t=>this.getItemBehavior(t)});this.tooltipController=new O({roomWrapper:this.roomWrapper,isEnabled:()=>this.isHoverInteractionEnabled(),getItemBehavior:t=>this.getItemBehavior(t)});this.touchPreviewController=new B({getTooltipController:()=>this.tooltipController,animationController:this.animationController,delayIdleAnimation:()=>this.delayIdleAnimation(),activateItemLink:t=>{const e=this.getItemBehavior(t)?.itemLink;if(!e)return;this.ignoreNextSyntheticTouchClick=true;this.clearLastPointerDown();e.click()},showTooltip:(t,e)=>{this.tooltipController.show(t,e)}});this.toggleSpriteController=new K({events:this.events,getItems:()=>this.interactiveRoomItems,getItemBehavior:t=>this.getItemBehavior(t),isEnabled:()=>this.isHoverInteractionEnabled(),delayIdleAnimation:()=>this.delayIdleAnimation(),touchPreviewController:this.touchPreviewController,tooltipController:this.tooltipController,isKeyboardFocusHoverActive:t=>this.isKeyboardFocusHoverActive(t)});this.idleController=new x({delay:6e3,getItems:()=>this.interactiveRoomItems.filter(t=>this.animationController.isHoverAnimationAvailable(t)),isEnabled:()=>this.isHoverInteractionEnabled(),isBlocked:()=>this.animationController.containsLoopingAnimation(this.interactiveRoomItems),isItemEligible:t=>!this.toggleSpriteController.isOpenOrTransitioning(t)&&!this.animationController.isItemVisuallyHovered(t)&&!this.animationController.isItemAnimationRunning(t),playAnimation:t=>this.animationController.playOnce(t)});this.pointerController=new V({events:this.events,getItems:()=>this.interactiveRoomItems,getItemBehavior:t=>this.getItemBehavior(t),isEnabled:()=>this.isHoverInteractionEnabled(),delayIdleAnimation:()=>this.delayIdleAnimation(),tooltipController:this.tooltipController,animationController:this.animationController,touchPreviewController:this.touchPreviewController,toggleSpriteController:this.toggleSpriteController,clearPreviousFocusHover:t=>this.clearPreviousFocusHover(t)});this.accessibilityController=new q({roomWrapper:this.roomWrapper,getItemLinks:()=>this.getInteractiveItemLinks()});this.introController=new z({roomWrapper:this.roomWrapper,roomDimmer:this.roomDimmer,windowItem:this.windowItem,updateSceneStatusFromData:t=>this.accessibilityController.updateSceneStatusFromData(t),isInteractive:()=>this.isHoverInteractionEnabled(),enterInteractiveMode:()=>this.enterInteractiveMode()});this.handleReducedMotionChange=this.handleReducedMotionChange.bind(this);this.handleVisibilityChange=this.handleVisibilityChange.bind(this);this.handleDocumentPointerDown=this.handleDocumentPointerDown.bind(this);this.handleDocumentPointerMove=this.handleDocumentPointerMove.bind(this);this.handleDocumentKeyDown=this.handleDocumentKeyDown.bind(this);this.handleRoomWrapperClick=this.handleRoomWrapperClick.bind(this);this.handleRoomWrapperFocusIn=this.handleRoomWrapperFocusIn.bind(this);this.handleRoomWrapperFocusOut=this.handleRoomWrapperFocusOut.bind(this);this.handleTooltipPointerDown=this.handleTooltipPointerDown.bind(this);this.handleTooltipClick=this.handleTooltipClick.bind(this);this.handleWindowScroll=this.handleWindowScroll.bind(this);this.setScenePhase("loading")}delayIdleAnimation(){this.idleController.delayIdleAnimation()}isHoverInteractionEnabled(){return this.phase==="interactive"&&!this.isPopupOpen}hasKeyboardFocusIntent(t=document.activeElement){return this.lastInteractionWasKeyboard||n(t)}isKeyboardFocusHoverActive(t){return!!t&&this.hasKeyboardFocusIntent(document.activeElement)&&this.currentFocusHoverItem===t&&t.contains(document.activeElement)}activateFocusHover(t,e){this.lastInteractionWasKeyboard=true;this.currentFocusHoverItem=t;if(e?.isToggleSprite){t.classList.add("bespoke-room__item--hover");if(this.toggleSpriteController.isOpenOrTransitioning(t)){return}}this.tooltipController.cancelScheduledShow();this.tooltipController.clearPointer();this.tooltipController.show(t,"target");if(e?.isToggleSprite)return;this.animationController.activateHover(t)}buildItemBehavior(t){if(!t)return null;const e=_(t);const i=t.dataset.hover||"";const r=t.dataset.interaction==="toggle-sprite";const o=t.classList.contains("bespoke-room__item--diary")&&this.roomWrapper.classList.contains("bespoke-room__wrapper--no-dialog");const s=!!e&&!o;return{itemLink:e,hasHover:!!i,hasTooltip:!!t.dataset.tooltip,hoverType:i,isCSSHover:i==="css",isCustomCSSHover:t.dataset.hoverCss==="custom",isDiaryBlocked:o,isInteractive:s&&(!!i||r),isHoverSprite:i==="sprite",isToggleSprite:r,isUsableItemLink:s,tooltip:t.dataset.tooltip||""}}getItemBehavior(t){return this.itemBehaviors?.get(t)??null}saveLastPointerDown(t){this.lastPointerDown={pointerType:t.pointerType||null,clientX:t.clientX,clientY:t.clientY}}clearLastPointerDown(){this.lastPointerDown=null}consumeLastPointerDown(){const t=this.lastPointerDown??{pointerType:null,clientX:null,clientY:null};this.clearLastPointerDown();return t}clearPendingClickState(){this.clearLastPointerDown();this.ignoreNextSyntheticTouchClick=false;this.suppressNextTooltipTouchClick=false}hasOpenPopupDialog(){if(!this.hasDialogSupport)return false;return this.popupDialogs.some(t=>t.hasAttribute("open"))}setScenePhase(t){this.phase=t;const e=t==="interactive";this.roomWrapper.classList.toggle("bespoke-room__wrapper--ready",t!=="loading");this.roomWrapper.classList.toggle("bespoke-room__wrapper--hover-enabled",e);this.accessibilityController.updateItemLinkAccessibility(e)}hideFailedRoom(){try{this.loaderElement?.classList.remove("bespoke-room__loader--visible");this.loaderElement?.setAttribute("aria-hidden","true");this.roomWrapper.classList.remove("bespoke-room__wrapper--ready");this.roomWrapper.classList.remove("bespoke-room__wrapper--hover-enabled");this.accessibilityController.updateItemLinkAccessibility(false)}catch{}}updatePopupInteractionState(t){this.isPopupOpen=t;this.roomWrapper.classList.toggle("bespoke-room__wrapper--popup-open",t);if(t){this.tooltipController.cancelScheduledShow();this.tooltipController.hide();this.touchPreviewController.clearPreview();this.clearPendingClickState();this.currentFocusHoverItem=null;for(const i of this.interactiveRoomItems){this.animationController.deactivateHover(i)}this.idleController.stop();const e=this.popupDialogs.find(t=>t.hasAttribute("open")&&t.dataset.modal?.startsWith("bespoke-room_diary-modal-"));if(e){this.insertDiaryNoteImage(e)}return}if(this.isHoverInteractionEnabled())this.idleController.start()}observePopupDialogs(){if(!this.hasDialogSupport)return;if(!this.popupDialogs.length)return;const i=()=>{this.updatePopupInteractionState(this.hasOpenPopupDialog())};this.popupObserver=new MutationObserver(t=>{for(const e of t){if(e.type==="attributes"&&e.attributeName==="open"){i();break}}});for(const t of this.popupDialogs){this.popupObserver.observe(t,{attributes:true,attributeFilter:["open"]})}i()}insertDiaryNoteImage(t){if(!t)return;const e=t.querySelector(".bespoke-room__diary-note-image-wrapper");if(!e)return;if(e.querySelector(".bespoke-room__diary-note-image"))return;const i=e.dataset.noteSrc;const r=e.dataset.noteAlt||"";if(!i)return;const o=document.createElement("img");o.className="bespoke-room__diary-note-image";o.src=i;o.alt=r;e.appendChild(o)}getInteractiveItemLinkFromTarget(t){const e=k(t);if(!e)return null;const i=e.closest(".bespoke-room__item");const r=this.getItemBehavior(i);return i&&this.interactiveRoomItems.includes(i)&&r?.itemLink===e?{item:i,link:e,behavior:r}:null}getInteractiveItemLinks(){return[...this.roomWrapper.querySelectorAll(".bespoke-room__item-link")].filter(t=>{const e=t.closest(".bespoke-room__item");const i=this.getItemBehavior(e);return e&&i?.isInteractive&&i.itemLink===t})}isEventInsideOpenPopup(t){if(!this.hasDialogSupport)return false;return!!t?.closest?.(".popup-dialog[open]")}handleReducedMotionChange(t){if(!t.matches)return;for(const e of this.interactiveRoomItems){this.animationController.clearInteractionState(e)}this.touchPreviewController.clearPreview();this.currentFocusHoverItem=null}handleVisibilityChange(){if(document.hidden){this.idleController.stop();this.tooltipController.cancelScheduledShow();const t=this.touchPreviewController.activePreviewItem;for(const e of this.interactiveRoomItems){const i=this.isKeyboardFocusHoverActive(e);const r=t===e;if(this.getItemBehavior(e)?.isToggleSprite){const o=this.toggleSpriteController.getToggleState(e);o.suppressRestoredFocusHover=!i}if(r){e.classList.remove("bespoke-room__item--hover");continue}if(i){e.classList.remove("bespoke-room__item--touch-hover");continue}e.classList.remove("bespoke-room__item--hover","bespoke-room__item--touch-hover");this.animationController.stopHoverAnimation(e);if(this.tooltipController.targetItem===e){this.tooltipController.clearPointer();this.tooltipController.hide()}if(this.currentFocusHoverItem===e)this.currentFocusHoverItem=null}return}if(this.isHoverInteractionEnabled()){const s=this.getInteractiveItemLinkFromTarget(document.activeElement);if(s&&this.hasKeyboardFocusIntent(document.activeElement)){this.activateFocusHover(s.item,s.behavior)}this.idleController.start()}}handleRoomWrapperResize(){this.tooltipController.cancelScheduledShow();if(!this.tooltipController.isVisible)return;const t=this.tooltipController.positionMode==="target"&&this.currentFocusHoverItem&&this.currentFocusHoverItem.contains(document.activeElement);if(t){this.tooltipController.position();return}this.tooltipController.clearPointer();if(this.touchPreviewController.activePreviewItem){this.touchPreviewController.clearPreview()}this.tooltipController.hide()}handleWindowScroll(){this.tooltipController.cancelScheduledShow();if(this.touchPreviewController.activePreviewItem){this.touchPreviewController.clearPreview()}for(const t of this.interactiveRoomItems){if(t===this.currentFocusHoverItem)continue;this.animationController.stopHoverAnimation(t)}if(this.tooltipController.isVisible&&this.tooltipController.positionMode==="pointer"){this.tooltipController.clearPointer();this.tooltipController.hide()}}handleDocumentKeyDown(t){if(t.metaKey||t.ctrlKey||t.altKey)return;this.lastInteractionWasKeyboard=true;this.suppressNextTooltipTouchClick=false;this.tooltipController.cancelScheduledShow();this.tooltipController.clearPointer()}handleDocumentPointerDown(t){this.lastInteractionWasKeyboard=false;this.saveLastPointerDown(t);const e=this.tooltipContr
1oller.tooltipElement?.contains(t.target);if(!e){this.suppressNextTooltipTouchClick=false}if(!r(t))return;if(this.isPopupOpen)return;if(this.isEventInsideOpenPopup(t.target))return;if(e){return}const i=k(t.target);if(!i)this.touchPreviewController.clearPreview()}handleDocumentPointerMove(t){const e=this.touchPreviewController.activePreviewItem;if(!e)return;if(!o(t))return;if(e.contains(t.target))return;this.touchPreviewController.clearPreview()}handleRoomWrapperClick(t){if(this.ignoreNextSyntheticTouchClick){this.ignoreNextSyntheticTouchClick=false;return}if(this.suppressNextTooltipTouchClick){if(this.tooltipController.tooltipElement?.contains(t.target))return;this.suppressNextTooltipTouchClick=false;this.clearLastPointerDown();A(t);return}const{pointerType:e,clientX:i,clientY:r}=this.consumeLastPointerDown();if(!l(e))return;if(this.isPopupOpen)return;if(this.isEventInsideOpenPopup(t.target))return;if(this.tooltipController.tooltipElement?.contains(t.target))return;const o=this.getInteractiveItemLinkFromTarget(t.target);if(!o)return;const{item:s,link:n,behavior:a}=o;this.clearPreviousFocusHover(s);if(a?.isToggleSprite){if(!this.isHoverInteractionEnabled()){A(t);this.touchPreviewController.clearPreview();return}this.toggleSpriteController.getToggleState(s).suppressRestoredFocusHover=false;this.touchPreviewController.markTogglePreviewActive(s);return}if(!this.isHoverInteractionEnabled()){A(t);this.touchPreviewController.clearPreview();return}if(this.touchPreviewController.activePreviewItem!==s){A(t);this.touchPreviewController.activatePreview(s,{clientX:i,clientY:r});return}A(t);this.touchPreviewController.clearPreview();this.ignoreNextSyntheticTouchClick=true;n.click()}handleRoomWrapperFocusIn(t){const e=this.getInteractiveItemLinkFromTarget(t.target);if(!e)return;const{item:i,behavior:r}=e;const o=this.hasKeyboardFocusIntent(t.target);this.delayIdleAnimation();if(!this.isHoverInteractionEnabled())return;if(this.touchPreviewController.activePreviewItem&&this.touchPreviewController.activePreviewItem!==i){this.touchPreviewController.clearPreview()}if(r?.isToggleSprite){const s=this.toggleSpriteController.getToggleState(i);if(s.suppressRestoredFocusHover&&!o)return;s.suppressRestoredFocusHover=false}if(!o)return;this.activateFocusHover(i,r)}handleRoomWrapperFocusOut(t){const e=this.getInteractiveItemLinkFromTarget(t.target);if(!e)return;const{item:i,link:r}=e;if(r.contains(t.relatedTarget)||i.contains(t.relatedTarget)){return}if(this.currentFocusHoverItem!==i)return;this.currentFocusHoverItem=null;this.tooltipController.cancelScheduledShow();if(this.tooltipController.targetItem===i){this.tooltipController.hide()}this.animationController.deactivateHover(i)}handleTooltipPointerDown(t){if(!r(t))return;this.suppressNextTooltipTouchClick=true;A(t)}handleTooltipClick(t){A(t);if(this.suppressNextTooltipTouchClick){this.suppressNextTooltipTouchClick=false}if(!this.tooltipController.isVisible||!this.tooltipController.targetItem)return;this.touchPreviewController.activateFromTooltip(this.tooltipController.targetItem)}clearPreviousFocusHover(t){if(!this.currentFocusHoverItem)return false;if(this.currentFocusHoverItem===t)return false;const e=this.currentFocusHoverItem;this.currentFocusHoverItem=null;this.tooltipController.cancelScheduledShow();if(this.tooltipController.targetItem===e){this.tooltipController.hide()}this.animationController.deactivateHover(e);return true}bindTooltipEvents(){const t=this.tooltipController.create();if(!t)return;this.events.on(t,"pointerdown",this.handleTooltipPointerDown);this.events.on(t,"click",this.handleTooltipClick)}bindEvents(){document.addEventListener("pointerdown",this.handleDocumentPointerDown,true);this.events.addCleanup(()=>{document.removeEventListener("pointerdown",this.handleDocumentPointerDown,true)});this.events.on(document,"pointermove",this.handleDocumentPointerMove,{capture:true,passive:true});this.events.on(document,"visibilitychange",this.handleVisibilityChange);this.events.on(window,"scroll",this.handleWindowScroll,{passive:true});if(typeof ResizeObserver!=="undefined"){this.wrapperResizeObserver=new ResizeObserver(()=>{if(this.isDestroyed)return;this.handleRoomWrapperResize()});this.wrapperResizeObserver.observe(this.roomWrapper);this.events.addCleanup(()=>{this.wrapperResizeObserver?.disconnect();this.wrapperResizeObserver=null})}document.addEventListener("keydown",this.handleDocumentKeyDown,true);this.events.addCleanup(()=>{document.removeEventListener("keydown",this.handleDocumentKeyDown,true)});this.roomWrapper.addEventListener("click",this.handleRoomWrapperClick,true);this.events.addCleanup(()=>{this.roomWrapper.removeEventListener("click",this.handleRoomWrapperClick,true)});this.events.on(this.roomWrapper,"focusin",this.handleRoomWrapperFocusIn);this.events.on(this.roomWrapper,"focusout",this.handleRoomWrapperFocusOut);this.pointerController.bindEvents();this.toggleSpriteController.bindEvents();this.bindTooltipEvents();m(t,this.handleReducedMotionChange);this.events.addCleanup(()=>{c(t,this.handleReducedMotionChange)})}enterInteractiveMode(){if(this.phase==="interactive"||this.isDestroyed)return;this.pointerController.resetMouseTooltipDelayGate();this.setScenePhase("interactive");if(!this.isPopupOpen)this.idleController.start();this.accessibilityController.updateSceneStatusFromData("messageReady")}
1async init(){try{this.accessibilityController.cacheElements();this.accessibilityController.updateItemLinkAccessibility(false);this.tooltipController.create();const t=this.introController.shouldSkip();const e=s();try{await this.assetLoader.preloadCriticalImages();if(this.isDestroyed)return;await this.assetLoader.startPrioritySpriteInitialization();if(this.isDestroyed)return;void this.assetLoader.startDeferredAssetLoading();if(t&&e){this.windowItem?._spriteItemAnimator?.holdLastFrame();void this.windowItem?.offsetWidth;await C();if(this.isDestroyed)return}}finally{await this.assetLoader.hideLoader();if(this.isDestroyed)return}if(this.isDestroyed)return;this.setScenePhase("locked");this.bindEvents();this.observePopupDialogs();if(t){this.introController.applySkippedIntroVisualState();this.enterInteractiveMode();return}if(e){void this.introController.runMinimalIntro()}else{void this.introController.runFullIntro()}}catch{if(this.isDestroyed)return;this.hideFailedRoom()}}destroy(){if(this.isDestroyed)return;this.isDestroyed=true;this.idleController.stop();this.tooltipController.cancelScheduledShow();this.tooltipController.hide();this.touchPreviewController.clearPreview();this.currentFocusHoverItem=null;this.events.cleanupAll();if(this.popupObserver){this.popupObserver.disconnect();this.popupObserver=null}if(this.tooltipController.tooltipElement?.parentNode){this.tooltipController.tooltipElement.parentNode.removeChild(this.tooltipController.tooltipElement)}for(const t of this.interactiveRoomItems){this.animationController.clearInteractionState(t);t._cssItemAnimator?.destroy?.();t._toggleSpriteState=null}this.assetLoader.destroySpriteAnimators();if(this.roomWrapper._roomSceneInstance===this){this.roomWrapper._roomSceneInstance=null}}}let E=null;let R=null;let D=0;async function W(t){const e=S(t);const i=e?.querySelector(".bespoke-room__dimmer");if(!e||!i)return;const r=++D;if(e._roomSceneInstance){e._roomSceneInstance.destroy()}else if(E){E.destroy()}const o=new Y(e,i);e._roomSceneInstance=o;E=o;R=e;await o.init();const s=r!==D||e._roomSceneInstance!==o;if(o.isDestroyed||s){o.destroy()}}document.addEventListener("DOMContentLoaded",()=>{void W()});document.addEventListener("shopify:section:load",t=>{void W(t.target)});document.addEventListener("shopify:section:unload",t=>{const e=S(t.target);if(!e)return;e?._roomSceneInstance?.destroy?.();if(R===e){E=null;R=null}})})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.