PageSourceSearch

https://www.downstairscomedy.shop/assets/waterline/seating-plan/po…5d3b835f642ba1f6cfbd189f346da17ca39a08f9.js

js downstairscomedy.shop collected 2026-10-06 14:03:44 UTC 4,967 bytes, 1 lines download raw bytes

1export class PointerCoordinator{constructor({renderer:e,canvasTarget:t,hoverChip:s,popover:r,planStatus:i,catalogStore:o,canvasKeyboard:n,seatToggleFlow:a,sidebarTarget:h,sidebarToggleTarget:l,isHoverDevice:c}){this.renderer=e,this.canvasTarget=t,this.hoverChip=s,this.popover=r,this.planStatus=i,this.catalogStore=o,this.canvasKeyboard=n,this.seatToggleFlow=a,this.sidebarTarget=h,this.sidebarToggleTarget=l,this.isHoverDevice=c,this._hoveredSeat=null,this._overUI=!1,this._lastSelectedVersionId=new Map}wire(e){this.renderer.onPointerMove((e=>this._onPointerMove(e))),this.renderer.onClick((e=>this._onCanvasClick(e))),this.renderer.onPointerLeave((()=>this._clearHover())),this.renderer.onViewportInteraction((()=>this.closePopover())),this._wireUIHoverGuards(e)}activateFromKeyboard(e){const{state:t}=this.planStatus.getSeatState(e.id);if("pending"===t||"blocked"===t)return;const s=this.catalogStore.variantFor(e);if("resale"===t||!s||s.versions.length<=1)return this.closePopover(),void this._toggleSeat(e,null);this.renderer.centerOnSeat(e),this._openPopover(e,t,{returnFocus:this.canvasTarget}),this.popover.focusFirstRow()}closePopover(){this.popover.close()}onPopoverClosed(){this.syncRing(),this.isHoverDevice&&this._hoveredSeat&&this._showChip(this._hoveredSeat,this.planStatus.getSeatState(this._hoveredSeat.id).state)}_onPointerMove(e){if(!this.isHoverDevice)return;if(document.body.classList.contains("modal-open")||this._overUI)return void this._clearHover();const t=this.renderer.worldFromPointer(e);if(!t)return;if(this.renderer.isZoomedOut())return this._clearHover(),void(this.canvasTarget.style.cursor="pointer");const s=this.renderer.seatIndex.findSeatAt(t.x,t.y);if(s===this._hoveredSeat)return;if(this._hoveredSeat=s,!s)return this.canvasTarget.style.cursor="",this.hoverChip.hide(),void this.syncRing();const{state:r}=this.planStatus.getSeatState(s.id);this.canvasTarget.style.cursor="blocked"===r?"not-allowed":"pointer",this.syncRing(),this._showChip(s,r)}_onCanvasClick(e){const t=e.world;if(!t)return;const s=this.renderer.standingBlockAt(t.x,t.y);if(null!=s)return this.closePopover(),void this.renderer.host.dispatchEvent(new CustomEvent("standing-block-clicked",{detail:{blockIdx:s}}));if(this.renderer.isZoomedOut()){this.closePopover(),this.renderer.animateToPoint(t.x,t.y);const e=this.renderer.nearestSeat(t.x,t.y);return void(e&&this.canvasKeyboard?.focusSeat(e,{silent:!0}))}const r=this.renderer.seatIndex.findSeatAt(t.x,t.y);if(this.popover.isOpen()){const e=r&&r.id===this.popover.seat?.id;if(this.closePopover(),e||!r)return}r&&this._handleSeatClick(r)}_handleSeatClick(e){const{state:t}=this.planStatus.getSeatState(e.id);if("pending"===t||"blocked"===t)return;this.canvasKeyboard?.focusSeat(e,{silent:!0});const s=this.catalogStore.variantFor(e);"resale"===t||!s||s.versions.length<=1?this._toggleSeat(e,null):this._openPopover(e,t)}_openPopover(e,t,{returnFocus:s=null}={}){this.hoverChip.hide();const r=this.renderer.seatScreenPosition(e),i="mine"===t?this._activeVersionIdForSeat(e):null;this.popover.open({seat:e,variantData:this.catalogStore.variantFor(e),screenX:r.x,screenY:r.y,activeVersionId:i},{returnFocus:s}),this.syncRing()}_showChip(e,t){if(this.popover.isOpen()||"blocked"===t||"pending"===t)return void this.hoverChip.hide();const s=this.renderer.seatScreenPosition(e);this.hoverChip.show({seat:e,variantData:this.catalogStore.variantFor(e),state:t,screenX:s.x,screenY:s.y,seatRadius:this.renderer.seatScreenRadius(),activeVersionId:"mine"===t?this._activeVersionIdForSeat(e):null})}syncRing(){const e=this.popover.isOpen()?this.popover.seat:this._hoveredSeat,t=e?this.planStatus.getSeatState(e.id).state:null;e&&"blocked"!==t&&"pending"!==t?this.renderer.setHoveredSeat(e):this.renderer.clearHoveredSeat()}_clearHover(){this._hoveredSeat=null,this.canvasTarget.style.cursor="",this.hoverChip.hide(),this.syncRing()}refreshHoverState(e){const t=this.popover.seat;if(t&&(null==e||t.id===e)){const{state:e}=this.planStatus.getSeatState(t.id);"free"!==e&&"mine"!==e&&this.closePopover()}const s=this._hoveredSeat;if(!s||null!=e&&s.id!==e)return;const{state:r}=this.planStatus.getSeatState(s.id);this.canvasTarget.style.cursor="blocked"===r?"not-allowed":"pointer",this.syncRing(),this._showChip(s,r)}notifyVersionSelected(e,t){this._lastSelectedVersionId.set(e,t)}clearTrackVersion(e){this._lastSelectedVersionId.delete(e)}_activeVersionIdForSeat(e){const t=this._lastSelectedVersionId.get(e.id);if(null!=t)return t;const s=this.planStatus.mineMap[String(e.id)];if(s)return s;const r=this.catalogStore.variantFor(e)?.versions;return 1===r?.length?r[0].id:null}_toggleSeat(e,t){return this.seatToggleFlow.toggle(e,t,{dismissTooltip:()=>this.closePopover()})}_wireUIHoverGuards(e){const t=()=>{this._overUI=!0,this._clearHover()},s=()=>{this._overUI=!1};for(const r of[this.sidebarToggleTarget,this.sidebarTarget])r&&(r.addEventListener("mouseenter",t,{signal:e}),r.addEventListener("mouseleave",s,{signal:e}))}}

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.