1try{!function(){var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},t=(new e.Error).stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]="1dc46bb0-cf00-4eaf-ab7c-37541db95911",e._sentryDebugIdIdentifier="sentry-dbid-1dc46bb0-cf00-4eaf-ab7c-37541db95911")}()}catch(e){}"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1141],{34837:(e,t,a)=>{a.d(t,{cn:()=>i,sU:()=>s,xc:()=>l});var n=a(68485);let r={primary:"bg-gradient-to-r from-pastel-pink via-pastel-purple to-pastel-blue",hover:"hover:from-pastel-red hover:via-pastel-yellow hover:to-pastel-green",focus:"focus:from-pastel-red focus:via-pastel-yellow focus:to-pastel-green"};"\n group relative px-8 py-4 text-lg font-bold text-white font-bebas tracking-wide\n ".concat(r.primary," ").concat(r.hover," ").concat(r.focus,"\n transition-all duration-300 ease-in-out\n transform hover:scale-105 focus:scale-105\n rounded-full shadow-lg hover:shadow-xl hover:shadow-purple-500/25\n focus:outline-none focus:ring-4 focus:ring-purple-300/50\n disabled:opacity-50 disabled:cursor-not-allowed disabled:transform-none\n animate-gradient min-h-[50px]\n ");let i=function(){for(var e=arguments.length,t=Array(e),a=0;a<e;a++)t[a]=arguments[a];return t.filter(Boolean).join(" ")},o={isNotPastDate:e=>{let t=new Date;t.setHours(0,0,0,0);let a=new Date(e);return a.setHours(0,0,0,0),a>=t},isWithinMonths:(e,t)=>{let a=new Date,n=new Date;return n.setMonth(a.getMonth()+t),e<=n}},s={_settingsCache:null,_settingsExpiry:0,fetchSettings:async()=>{let e=Date.now();if(!(e<s._settingsExpiry)||!s._settingsCache)try{let t=await fetch("/api/settings/public");if(t.ok){let a=await t.json();a.success&&(s._settingsCache=a.data,s._settingsExpiry=e+3e5)}}catch(e){}},formatDisplayDate:e=>e.toLocaleDateString("en-US",{weekday:"long",year:"numeric",month:"long",day:"numeric"}),formatShortDate:e=>e.toLocaleDateString("en-US",{month:"2-digit",day:"2-digit",year:"numeric"}),getNextFriday:()=>{let e=new Date,t=new Date(e),a=(5-e.getDay()+7)%7;return t.setDate(e.getDate()+(a||7)),t},isBookableDate:e=>{let t=s._settingsCache||{openWeekdays:[5,6],horizonMonths:6,sameDayCutoffHour:23,timezone:"Europe/London"},a=e.getDay();return t.openWeekdays.includes(a)&&o.isNotPastDate(e)&&o.isWithinMonths(e,t.horizonMonths)},_blockedDatesCache:new Set,_cacheExpiry:0,fetchBlockedDates:async()=>{let e=Date.now();if(!(e<s._cacheExpiry))try{let t=await fetch("/api/blocked-dates");if(t.ok){let a=await t.json();a.success&&(s._blockedDatesCache.clear(),a.data.forEach(e=>{let t=(0,n.D8)(e.date);s._blockedDatesCache.add(t)}),s._cacheExpiry=e+3e5)}}catch(e){console.warn("Failed to fetch blocked dates:",e)}},isBookableDateWithBlocked:async e=>{await s.fetchSettings();let t=s._settingsCache;if(!o.isNotPastDate(e)||!o.isWithinMonths(e,t.horizonMonths))return!1;try{var a,n;let t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate())).toISOString(),r="/api/availability?startDate=".concat(encodeURIComponent(t),"&endDate=").concat(encodeURIComponent(t)),i=await fetch(r,{cache:"no-store"});if(!i.ok)return!1;let o=await i.json();if(!o.success)return!1;let s=null==(n=o.days)||null==(a=n[0])?void 0:a.status;return"open"===s||"extra"===s}catch(e){return!1}}},l={required:{name:"Name is required",email:"Email is required",phone:"Phone number is required",date:"Please select a date",quantity:"Quantity is required"},invalid:{email:"Please enter a valid email address",phone:"Please enter a valid phone number",date:"Please select a valid date",dateWeekend:"Bookings are only available on open days",datePast:"Cannot book for past dates",dateRange:"Date must be within the next 3 months"},limits:{nameMin:"Name must be at least 2 characters",nameMax:"Name must be less than 50 characters",phoneMin:"Phone number must be at least 10 digits",phoneMax:"Phone number too long",quantityMin:"Quantity must be at least 1",quantityMax:"Quantity too large"},server:{network:"Network error occurred. Please try again.",generic:"Something went wrong. Please try again.",validation:"Please check your information and try again.",booking:"Unable to process booking. Please try again."}}},68485:(e,t,a)=>{a.d(t,{D8:()=>d,En:()=>l,HH:()=>s,Q4:()=>o,p_:()=>i,xp:()=>c});let n=/^\d{4}-\d{2}-\d{2}$/,r=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(?::\d{2}(?:\.\d{1,3})?)?(?:Z|[+-]\d{2}:\d{2})$/,i="Europe/London";function o(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:i,a="string"==typeof e?new Date(e):e;if(Number.isNaN(a.getTime()))throw Error("Invalid booking date");let n=function(e){var t,a,n;let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:i,o=new Intl.DateTimeFormat("en-GB",{timeZone:r,year:"numeric",month:"2-digit",day:"2-digit"}).formatToParts(e),s=Number((null==(t=o.find(e=>"year"===e.type))?void 0:t.value)||"0"),l=Number((null==(a=o.find(e=>"month"===e.type))?void 0:a.value)||"0"),c=Number((null==(n=o.find(e=>"day"===e.type))?void 0:n.value)||"0");if(!s||!l||!c)throw Error("Failed to derive booking date in the configured timezone");return{year:s,month:l,day:c}}(a,t);return"".concat(n.year,"-").concat(String(n.month).padStart(2,"0"),"-").concat(String(n.day).padStart(2,"0"))}function s(e,t){let a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"en-GB",n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:i,r="string"==typeof e?new Date(e):e;if(Number.isNaN(r.getTime()))throw Error("Invalid booking date");return new Intl.DateTimeFormat(a,{...t,timeZone:n}).format(r)}function l(e){if("string"!=typeof e)return!1;let t=e.trim();return!!t&&(n.test(t)?null!==function(e){if(!n.test(e))return null;let[t,a,r]=e.split("-").map(e=>Number(e)),i=new Date(Date.UTC(t,a-1,r));return Number.isNaN(i.getTime())||i.getUTCFullYear()!==t||i.getUTCMonth()+1!==a||i.getUTCDate()!==r?null:{year:t,month:a,day:r}}(t):!!r.test(t)&&!Number.isNaN(new Date(t).getTime()))}function c(e){let t=e.getFullYear(),a=String(e.getMonth()+1).padStart(2,"0"),n=String(e.getDate()).padStart(2,"0");return"".concat(t,"-").concat(a,"-").concat(n)}function d(e){let t="string"==typeof e?new Date(e):e;return"".concat(t.getUTCFullYear(),"-").concat(String(t.getUTCMonth()+1).padStart(2,"0"),"-").concat(String(t.getUTCDate()).padStart(2,"0"))}},91141:(e,t,a)=>{a.d(t,{AV:()=>l,kt:()=>s});var n=a(95155);a(12115);var r=a(34837);let i={small:"h-4 w-4",medium:"h-8 w-8",large:"h-12 w-12"},o={small:"text-xs mt-2",medium:"text-sm mt-3",large:"text-base mt-4 font-medium"},s=e=>{let{size:t="medium",variant:a="rainbow",label:s,className:l,centered:c=!0}=e,d=(0,r.cn)(c&&"flex flex-col items-center justify-center",!c&&"inline-flex flex-col items-center",l);return(0,n.jsxs)("div",{className:d,role:"status","aria-live":"polite","aria-busy":"true","data-sentry-component":"LoadingSpinner","data-sentry-source-file":"LoadingSpinner.tsx",children:[(0,n.jsxs)("svg",{className:(0,r.cn)("animate-spin",i[t],"rainbow"!==a?(()=>{switch(a){case"white":return"text-white";case"purple":default:return"text-fuchsia-600";case"slate":return"text-slate-600"}})():""),xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","data-sentry-element":"svg","data-sentry-source-file":"LoadingSpinner.tsx",children:["rainbow"===a&&(0,n.jsx)("defs",{children:(0,n.jsxs)("linearGradient",{id:"spinner-gradient",x1:"0%",y1:"0%",x2:"100%",y2:"0%",children:[(0,n.jsx)("stop",{offset:"0%",stopColor:"#36f7ff"}
1),(0,n.jsx)("stop",{offset:"100%",stopColor:"#a855f7"})]})}),(0,n.jsx)("circle",{className:(0,r.cn)("opacity-75",{white:"text-white/25",purple:"text-fuchsia-100",slate:"text-slate-200",rainbow:"text-slate-100"}[a]||"text-slate-200"),cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"3","data-sentry-element":"circle","data-sentry-source-file":"LoadingSpinner.tsx"}),(0,n.jsx)("path",{className:"opacity-100",fill:"rainbow"===a?"url(#spinner-gradient)":"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z","data-sentry-element":"path","data-sentry-source-file":"LoadingSpinner.tsx"})]}),s&&(0,n.jsx)("span",{className:(0,r.cn)("text-slate-500 animate-pulse",o[t]),children:s}),(0,n.jsx)("span",{className:"sr-only",children:"Loading..."})]})},l=e=>{let{label:t="Loading..."}=e;return(0,n.jsx)("div",{className:"flex flex-col items-center justify-center min-h-[50vh] w-full py-12","data-sentry-component":"LoadingPage","data-sentry-source-file":"LoadingSpinner.tsx",children:(0,n.jsx)(s,{size:"large",variant:"purple",label:t,"data-sentry-element":"LoadingSpinner","data-sentry-source-file":"LoadingSpinner.tsx"})})}}}]);
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.