@code-collective/booking-widget 1.0.16 → 1.0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +86 -75
- package/README.md +508 -506
- package/dist/booking-widget.js +153 -136
- package/dist/booking-widget.min.js +5 -5
- package/dist/booking-widget.umd.cjs +1 -1
- package/package.json +1 -1
- package/src/lib/CheckoutModal.svelte +4 -1
- package/src/lib/CheckoutPanel.svelte +22 -1
- package/src/lib/PaymentPage.svelte +13 -3
- package/src/lib/checkout-payment-flow.svelte.ts +51 -11
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
\r\f\xA0\v`];function Kr(e,t,n){var r=e==null?``:``+e;if(t&&(r=r?r+` `+t:t),n){for(var i of Object.keys(n))if(n[i])r=r?r+` `+i:i;else if(r.length)for(var a=i.length,o=0;(o=r.indexOf(i,o))>=0;){var s=o+a;(o===0||Gr.includes(r[o-1]))&&(s===r.length||Gr.includes(r[s]))?r=(o===0?``:r.substring(0,o))+r.substring(s+1):o=s}}return r===``?null:r}function qr(e,t,n,r,i,a){var o=e[O];if(A||o!==n||o===void 0){var s=Kr(n,r,a);(!A||s!==e.getAttribute(`class`))&&(s==null?e.removeAttribute(`class`):t?e.className=s:e.setAttribute(`class`,s)),e[O]=n}else if(a&&i!==a)for(var c in a){var l=!!a[c];(i==null||l!==!!i[c])&&e.classList.toggle(c,l)}return a}var Jr=Symbol(`is custom element`),Yr=Symbol(`is html`),Xr=ue?`link`:`LINK`;function Zr(e){if(A){var t=!1,n=()=>{if(!t){if(t=!0,e.hasAttribute(`value`)){var n=e.value;$r(e,`value`,null),e.value=n}if(e.hasAttribute(`checked`)){var r=e.checked;$r(e,`checked`,null),e.checked=r}}};e[ce]=n,Ke(n),rt()}}function Qr(e,t){var n=ei(e);n.checked!==(n.checked=t??void 0)&&(e.checked=t)}function $r(e,t,n,r){var i=ei(e);A&&(i[t]=e.getAttribute(t),t===`src`||t===`srcset`||t===`href`&&e.nodeName===Xr)||i[t]!==(i[t]=n)&&(t===`loading`&&(e[ie]=n),n==null?e.removeAttribute(t):typeof n!=`string`&&ni(e).includes(t)?e[t]=n:e.setAttribute(t,n))}function ei(e){return e[ae]??={[Jr]:e.nodeName.includes(`-`),[Yr]:e.namespaceURI===we}}var ti=new Map;function ni(e){var t=e.getAttribute(`is`)||e.nodeName,n=ti.get(t);if(n)return n;ti.set(t,n=[]);for(var r,i=e,a=Element.prototype;a!==i;){for(var o in r=s(i),r)r[o].set&&o!==`innerHTML`&&o!==`textContent`&&o!==`innerText`&&n.push(o);i=u(i)}return n}function ri(e,t,n=t){var r=new WeakSet;at(e,`input`,async i=>{var a=i?e.defaultValue:e.value;if(a=ii(e)?ai(a):a,n(a),L!==null&&r.add(L),await ar(),a!==(a=t())){var o=e.selectionStart,s=e.selectionEnd,c=e.value.length;if(e.value=a??``,s!==null){var l=e.value.length;o===s&&s===c&&l>c?(e.selectionStart=l,e.selectionEnd=l):(e.selectionStart=o,e.selectionEnd=Math.min(s,l))}}}),(A&&e.defaultValue!==e.value||cr(t)==null&&e.value)&&(n(ii(e)?ai(e.value):e.value),L!==null&&r.add(L)),xn(()=>{var n=t();if(e===document.activeElement){var i=L;if(r.has(i))return}ii(e)&&n===ai(e.value)||e.type===`date`&&!n&&!e.value||n!==e.value&&(e.value=n??``)})}function ii(e){var t=e.type;return t===`number`||t===`range`}function ai(e){return e===``?null:+e}function oi(e,t){return e===t||e?.[ne]===t}function si(e={},t,n,r){var i=ze.r,a=G;return yn(()=>{var o,s;return xn(()=>{o=s,s=r?.()||[],cr(()=>{oi(n(...s),e)||(t(e,...s),o&&oi(n(...o),e)&&t(null,...o))})}),()=>{let r=a;for(;r!==i&&r.parent!==null&&r.parent.f&33554432;)r=r.parent;let o=()=>{s&&oi(n(...s),e)&&t(null,...s)},c=r.teardown;r.teardown=()=>{o(),c?.()}}}),e}function Q(e,t,n,r){var i=!0,a=!!(n&8),s=!!(n&16),c=r,l=!0,u=void 0,d=()=>s&&i?(u??=mt(r),K(u)):(l&&(l=!1,c=s?cr(r):r),c);let f;if(a){var p=ne in e||re in e;f=o(e,t)?.set??(p&&t in e?n=>e[t]=n:void 0)}var m,h=!1;a?[m,h]=tt(()=>e[t]):m=e[t],m===void 0&&r!==void 0&&(m=d(),f&&(i&&ve(t),f(m)));var g=i?()=>{var n=e[t];return n===void 0?d():(l=!0,n)}:()=>{var n=e[t];return n!==void 0&&(c=void 0),n===void 0?c:n};if(i&&!(n&4))return g;if(f){var _=e.$$legacy;return(function(e,t){return arguments.length>0?((!i||!t||_||h)&&f(t?g():e),e):g()})}var v=!1,y=(n&1?mt:_t)(()=>(v=!1,g()));a&&K(y);var b=G;return(function(e,t){if(arguments.length>0){let n=t?K(y):i&&a?Zt(e):e;return z(y,n),v=!0,c!==void 0&&(c=n),e}return Ln&&v||b.f&16384?y.v:K(y)})}function ci(e){ze===null&&de(`onMount`),gn(()=>{let t=cr(e);if(typeof t==`function`)return t})}function li(e){ze===null&&de(`onDestroy`),ci(()=>()=>cr(e))}var ui=/\{[^{}]+\}/g,di=()=>typeof process==`object`&&Number.parseInt(process?.versions?.node?.substring(0,2))>=18&&process.versions.undici;function fi(){return Math.random().toString(36).slice(2,11)}function pi(e){let{baseUrl:t=``,Request:n=globalThis.Request,fetch:r=globalThis.fetch,querySerializer:i,bodySerializer:a,pathSerializer:o,headers:s,requestInitExt:c=void 0,...l}={...e};c=di()?c:void 0,t=Si(t);let u=[];async function d(e,d){let{baseUrl:f,fetch:p=r,Request:m=n,headers:h,params:g={},parseAs:_=`json`,querySerializer:v,bodySerializer:y=a??yi,pathSerializer:b,body:x,middleware:S=[],...C}=d||{},w=t;f&&(w=Si(f)??t);let T=typeof i==`function`?i:_i(i);v&&(T=typeof v==`function`?v:_i({...typeof i==`object`?i:{},...v}));let ee=b||o||vi,E=x===void 0?void 0:y(x,xi(s,h,g.header)),te=xi(E===void 0||E instanceof FormData?{}:{"Content-Type":`application/json`},s,h,g.header),D=[...u,...S],ne={redirect:`follow`,...l,...C,body:E,headers:te},re,ie,ae=new m(bi(e,{baseUrl:w,params:g,querySerializer:T,pathSerializer:ee}),ne),O;for(let e in C)e in ae||(ae[e]=C[e]);if(D.length){re=fi(),ie=Object.freeze({baseUrl:w,fetch:p,parseAs:_,querySerializer:T,bodySerializer:y,pathSerializer:ee});for(let t of D)if(t&&typeof t==`object`&&typeof t.onRequest==`function`){let n=await t.onRequest({request:ae,schemaPath:e,params:g,options:ie,id:re});if(n){if(n instanceof m)ae=n;else if(n instanceof Response){O=n;break}else throw Error(`onRequest: must return new Request() or Response() when modifying the request`)}}}if(!O){try{O=await p(ae,c)}catch(t){let n=t;if(D.length)for(let t=D.length-1;t>=0;t--){let r=D[t];if(r&&typeof r==`object`&&typeof r.onError==`function`){let t=await r.onError({request:ae,error:n,schemaPath:e,params:g,options:ie,id:re});if(t){if(t instanceof Response){n=void 0,O=t;break}if(t instanceof Error){n=t;continue}throw Error(`onError: must return new Response() or instance of Error`)}}}if(n)throw n}if(D.length)for(let t=D.length-1;t>=0;t--){let n=D[t];if(n&&typeof n==`object`&&typeof n.onResponse==`function`){let t=await n.onResponse({request:ae,response:O,schemaPath:e,params:g,options:ie,id:re});if(t){if(!(t instanceof Response))throw Error(`onResponse: must return new Response() when modifying the response`);O=t}}}}let oe=O.headers.get(`Content-Length`);if(O.status===204||ae.method===`HEAD`||oe===`0`&&!O.headers.get(`Transfer-Encoding`)?.includes(`chunked`))return O.ok?{data:void 0,response:O}:{error:void 0,response:O};if(O.ok)return{data:await(async()=>{if(_===`stream`)return O.body;if(_===`json`&&!oe){let e=await O.text();return e?JSON.parse(e):void 0}return await O[_]()})(),response:O};let se=await O.text();try{se=JSON.parse(se)}catch{}return{error:se,response:O}}return{request(e,t,n){return d(t,{...n,method:e.toUpperCase()})},GET(e,t){return d(e,{...t,method:`GET`})},PUT(e,t){return d(e,{...t,method:`PUT`})},POST(e,t){return d(e,{...t,method:`POST`})},DELETE(e,t){return d(e,{...t,method:`DELETE`})},OPTIONS(e,t){return d(e,{...t,method:`OPTIONS`})},HEAD(e,t){return d(e,{...t,method:`HEAD`})},PATCH(e,t){return d(e,{...t,method:`PATCH`})},TRACE(e,t){return d(e,{...t,method:`TRACE`})},use(...e){for(let t of e)if(t){if(typeof t!=`object`||!(`onRequest`in t||`onResponse`in t||`onError`in t))throw Error("Middleware must be an object with one of `onRequest()`, `onResponse() or `onError()`");u.push(t)}},eject(...e){for(let t of e){let e=u.indexOf(t);e!==-1&&u.splice(e,1)}}}}function mi(e,t,n){if(t==null)return``;if(typeof t==`object`)throw Error("Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.");return`${e}=${n?.allowReserved===!0?t:encodeURIComponent(t)}`}function hi(e,t,n){if(!t||typeof t!=`object`)return``;let r=[],i={simple:`,`,label:`.`,matrix:`;`}[n.style]||`&`;if(n.style!==`deepObject`&&n.explode===!1){for(let e in t)r.push(e,n.allowReserved===!0?t[e]:encodeURIComponent(t[e]));let i=r.join(`,`);switch(n.style){case`form`:return`${e}=${i}`;case`label`:return`.${i}`;case`matrix`:return`;${e}=${i}`;default:return i}}for(let i in t){let a=n.style===`deepObject`?`${e}[${i}]`:i;r.push(mi(a,t[i],n))}let a=r.join(i);return n.style===`label`||n.style===`matrix`?`${i}${a}`:a}function gi(e,t,n){if(!Array.isArray(t))return``;if(n.explode===!1){let r={form:`,`,spaceDelimited:`%20`,pipeDelimited:`|`}[n.style]||`,`,i=(n.allowReserved===!0?t:t.map(e=>encodeURIComponent(e))).join(r);switch(n.style){case`simple`:return i;case`label`:return`.${i}`;case`matrix`:return`;${e}=${i}`;default:return`${e}=${i}`}}let r={simple:`,`,label:`.`,matrix:`;`}[n.style]||`&`,i=[];for(let r of t)n.style===`simple`||n.style===`label`?i.push(n.allowReserved===!0?r:encodeURIComponent(r)):i.push(mi(e,r,n));return n.style===`label`||n.style===`matrix`?`${r}${i.join(r)}`:i.join(r)}function _i(e){return function(t){let n=[];if(t&&typeof t==`object`)for(let r in t){let i=t[r];if(i!=null){if(Array.isArray(i)){if(i.length===0)continue;n.push(gi(r,i,{style:`form`,explode:!0,...e?.array,allowReserved:e?.allowReserved||!1}));continue}if(typeof i==`object`){n.push(hi(r,i,{style:`deepObject`,explode:!0,...e?.object,allowReserved:e?.allowReserved||!1}));continue}n.push(mi(r,i,e))}}return n.join(`&`)}}function vi(e,t){let n=e;for(let r of e.match(ui)??[]){let e=r.substring(1,r.length-1),i=!1,a=`simple`;if(e.endsWith(`*`)&&(i=!0,e=e.substring(0,e.length-1)),e.startsWith(`.`)?(a=`label`,e=e.substring(1)):e.startsWith(`;`)&&(a=`matrix`,e=e.substring(1)),!t||t[e]===void 0||t[e]===null)continue;let o=t[e];if(Array.isArray(o)){n=n.replace(r,gi(e,o,{style:a,explode:i}));continue}if(typeof o==`object`){n=n.replace(r,hi(e,o,{style:a,explode:i}));continue}if(a===`matrix`){n=n.replace(r,`;${mi(e,o)}`);continue}n=n.replace(r,a===`label`?`.${encodeURIComponent(o)}`:encodeURIComponent(o))}return n}function yi(e,t){return e instanceof FormData?e:t&&(t.get instanceof Function?t.get(`Content-Type`)??t.get(`content-type`):t[`Content-Type`]??t[`content-type`])===`application/x-www-form-urlencoded`?new URLSearchParams(e).toString():JSON.stringify(e)}function bi(e,t){let n=`${t.baseUrl}${e}`;t.params?.path&&(n=t.pathSerializer(n,t.params.path));let r=t.querySerializer(t.params.query??{});return r.startsWith(`?`)&&(r=r.substring(1)),r&&(n+=`?${r}`),n}function xi(...e){let t=new Headers;for(let n of e){if(!n||typeof n!=`object`)continue;let e=n instanceof Headers?n.entries():Object.entries(n);for(let[n,r]of e)if(r===null)t.delete(n);else if(Array.isArray(r))for(let e of r)t.append(n,e);else r!==void 0&&t.set(n,r)}return t}function Si(e){return e.endsWith(`/`)?e.substring(0,e.length-1):e}function Ci(e){return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)}`}function wi(e){let t=new Date(e);return`${String(t.getHours()).padStart(2,`0`)}:${String(t.getMinutes()).padStart(2,`0`)}`}function Ti(e){let t=e.match(/\d{4}-\d{2}-\d{2}/);return t?t[0]:null}function Ei(e){let t=[];for(let n of e)for(let e=0;e<n.quantity;e++)t.push({unitId:n.unitId});return t}var Di=class extends Error{status;body;constructor(e,t){super(`API error ${e}`),this.status=e,this.body=t}get code(){return typeof this.body==`object`&&this.body!==null&&`error`in this.body?String(this.body.error):void 0}};function Oi(e){return e instanceof Di&&e.status===400&&e.code===`PRICE_MISMATCH`}function ki(e){return e instanceof Di&&e.status===401}function Ai(e){return e instanceof Di&&e.status===409&&e.code===void 0}function ji(e){return e instanceof Di&&e.status===409&&e.code===`CART_EXPIRED`}function Mi(e){return e instanceof Di&&e.status===409&&e.code===`PAYMENT_SETTLED`}function Ni(e){return e instanceof Di&&e.status===409&&e.code===`PAYMENT_PENDING`}var Pi=class{sessionToken=``;cartToken=``;client;constructor(e){this.client=pi({baseUrl:e}),this.client.use({onRequest:({request:e})=>(e.headers.set(`Origin`,window.location.origin),this.sessionToken&&e.headers.set(`Morii-Checkout-Session`,this.sessionToken),this.cartToken&&e.headers.set(`Morii-Checkout-Cart`,this.cartToken),e)})}unwrap(e){if(e.data===void 0)throw new Di(e.response.status,e.error);return e.data}async startSession(e){let t=this.unwrap(await this.client.POST(`/v1/checkout/session`,{body:{checkoutKey:e}}));return this.sessionToken=t.sessionToken??``,t}async refreshSession(){let e=this.unwrap(await this.client.POST(`/v1/checkout/session/refresh`));return this.sessionToken=e.sessionToken??``,e}async getProduct(e){return this.unwrap(await this.client.GET(`/v1/checkout/products/{productId}`,{params:{path:{productId:e}}}))}async getAvailabilityCalendar(e,t){let n=new Date,r=new Date(n);r.setDate(r.getDate()+90);let i=this.unwrap(await this.client.POST(`/v1/checkout/availability/calendar`,{body:{productId:e,optionId:t,localDateStart:Ci(n),localDateEnd:Ci(r)}})),a={};for(let e of i)a[e.localDate]=e;return a}async getAvailability(e,t,n){return this.unwrap(await this.client.POST(`/v1/checkout/availability`,{body:{productId:e,optionId:t,localDate:n}}))}async createCart(){let e=this.unwrap(await this.client.POST(`/v1/checkout/cart`));return this.cartToken=e.cartToken??``,e}async getCart(){return this.unwrap(await this.client.GET(`/v1/checkout/cart`))}async addCartItem(e){return this.unwrap(await this.client.POST(`/v1/checkout/cart/items`,{body:e}))}async updateCartItem(e,t){return this.unwrap(await this.client.PATCH(`/v1/checkout/cart/items/{itemId}`,{params:{path:{itemId:e}},body:t}))}async removeCartItem(e){let t=await this.client.DELETE(`/v1/checkout/cart/items/{itemId}`,{params:{path:{itemId:e}}});if(t.response.status>=400)throw new Di(t.response.status)}async payCart(e){return this.unwrap(await this.client.POST(`/v1/checkout/cart/pay`,{body:{contact:e}}))}async getCartStatus(){return this.unwrap(await this.client.GET(`/v1/checkout/cart/status`))}async extendCart(){return this.unwrap(await this.client.POST(`/v1/checkout/cart/extend`))}async abandonPayment(e){let t=await this.client.POST(`/v1/checkout/cart/abandon-payment`,{body:{checkoutId:e}});if(t.response.status>=400)throw new Di(t.response.status,t.error)}},Fi=3e5,Ii=12e4,Li=class{api;sessions=new Map;intervalId=null;activeCheckoutKey=``;constructor(e){this.api=e}async ensureSession(e){let t=this.sessions.get(e);if(t&&!this.isExpired(t))return this.activateSession(e,t),t;let n=await this.api.startSession(e);return this.sessions.set(e,n),this.activeCheckoutKey=e,n}startBackgroundRefresh(){this.intervalId||=setInterval(()=>this.refreshExpiringSessions(),Fi)}stop(){this.intervalId&&=(clearInterval(this.intervalId),null)}activateSession(e,t){this.activeCheckoutKey=e,this.api.sessionToken=t.sessionToken??``}isExpired(e){return new Date(e.expiresAt??0).getTime()<=Date.now()}isExpiringSoon(e){return new Date(e.refreshAfter??0).getTime()<=Date.now()+Ii}async refreshExpiringSessions(){for(let[e,t]of this.sessions){if(this.isExpired(t)){this.sessions.delete(e);continue}if(this.isExpiringSoon(t))try{this.api.sessionToken=t.sessionToken??``;let n=await this.api.refreshSession();this.sessions.set(e,n),e===this.activeCheckoutKey&&(this.api.sessionToken=n.sessionToken??``)}catch{this.sessions.delete(e)}}}},Ri=`morii-checkout-payment`,zi=typeof sessionStorage<`u`?sessionStorage:null;function Bi(e,t){let n={cartToken:e,...t};try{zi?.setItem(Ri,JSON.stringify(n))}catch{}}function Vi(e){try{let t=zi?.getItem(Ri);if(!t)return null;let n=JSON.parse(t);return!e||n.cartToken!==e||!n.checkoutId||!n.entityId?(Hi(),null):{checkoutId:n.checkoutId,entityId:n.entityId}}catch{return null}}function Hi(){try{zi?.removeItem(Ri)}catch{}}var Ui=`morii-checkout-cart`,Wi=typeof sessionStorage<`u`?sessionStorage:null,Gi=class{api;cart=null;constructor(e){this.api=e,this.loadFromStorage()}get cartToken(){return this.cart?.cartToken??``}get hasCart(){return this.cart!==null&&!this.isExpired()}async ensureCart(){if(this.cart&&!this.isExpired())return this.cart;let e=await this.api.createCart();return this.cart=e,this.saveToStorage(),e}reset(){this.cart=null,this.api.cartToken=``;try{Wi?.removeItem(Ui)}catch{}Hi()}isExpired(){return!this.cart||new Date(this.cart.absoluteExpiresAt??0).getTime()<=Date.now()}saveToStorage(){if(!this.cart)return;let e={cartToken:this.cart.cartToken??``,absoluteExpiresAt:this.cart.absoluteExpiresAt??``};try{Wi?.setItem(Ui,JSON.stringify(e))}catch{}}loadFromStorage(){try{let e=Wi?.getItem(Ui);if(!e)return;let t=JSON.parse(e);if(new Date(t.absoluteExpiresAt).getTime()<=Date.now()){Wi?.removeItem(Ui),Hi();return}this.cart={cartToken:t.cartToken,issuedAt:``,idleExpiresAt:``,absoluteExpiresAt:t.absoluteExpiresAt},this.api.cartToken=t.cartToken}catch{}}},Ki=new Set([`cart:change`,`cart:updated`,`cart:expired`,`modal:open`,`modal:close`,`order:complete`,`payment:started`,`payment:ended`,`payment:timed-out`]);function $(e){typeof window>`u`||window.parent?.postMessage(JSON.stringify(e),window.location.origin)}function qi(e){if(typeof window>`u`)return()=>{};function t(t){if(t.source!==window||t.origin!==window.location.origin)return;let n;try{n=typeof t.data==`string`?JSON.parse(t.data):t.data}catch{return}typeof n?.type!=`string`||!Ki.has(n.type)||e(n)}return window.addEventListener(`message`,t),()=>window.removeEventListener(`message`,t)}typeof window<`u`&&((window.__svelte??={}).v??=new Set).add(`5`);function Ji(e){let t=Math.max(0,e),n=Math.floor(t/6e4),r=Math.floor(t%6e4/1e3);return`${String(n).padStart(2,`0`)}:${String(r).padStart(2,`0`)}`}function Yi(e){return new Date(Qi(e.idleExpiresAt))}function Xi(e){return Qi(e.idleExpiresAt)>=Qi(e.absoluteExpiresAt)}var Zi=864e13;function Qi(e){return e?new Date(e).getTime():Zi}function $i(e,t){N(t,!0);let n=Q(t,`remaining`,15,``),r=Q(t,`warning`,15,!1),i=null;gn(()=>{let e=t.expiresAt.getTime();function a(){let a=e-Date.now();n(Ji(a)),r(a>0&&a<=18e4),a<=0&&i!==e&&(i=e,cr(()=>t.onExpired)())}a();let o=setInterval(a,1e3);return()=>clearInterval(o)}),P()}var ea=J(`<p class="svelte-udumw1">Your cart will expire in <strong class="remaining svelte-udumw1"> </strong>. Let us know you're still here
|
|
3
3
|
and we'll hold your tickets a little longer.</p> <button class="btn btn-primary svelte-udumw1"> </button>`,1),ta=J(`<p class="svelte-udumw1">Your cart will expire in <strong class="remaining svelte-udumw1"> </strong> and can't be held any longer.
|
|
4
4
|
Please complete your booking before then.</p> <button class="btn btn-primary svelte-udumw1">OK</button>`,1),na=J(`<div class="prompt-card svelte-udumw1" role="dialog" aria-modal="true" aria-labelledby="bw-still-there-title"><h3 id="bw-still-there-title" class="svelte-udumw1">Are you still there?</h3> <!></div>`);function ra(e,t){N(t,!0);let n=R(null);gn(()=>{K(n)?.focus()});var r=na(),i=H(B(r),2),a=e=>{var r=ea(),i=V(r),a=H(B(i)),o=B(a,!0);M(a),je(),M(i);var s=H(i,2),c=B(s,!0);M(s),si(s,e=>z(n,e),()=>K(n)),U(()=>{X(o,t.remaining),s.disabled=t.extending,X(c,t.extending?`One moment...`:`Yes, I'm still here`)}),q(`click`,s,function(...e){t.onExtend?.apply(this,e)}),Y(e,r)},o=e=>{var r=ta(),i=V(r),a=H(B(i)),o=B(a,!0);M(a),je(),M(i);var s=H(i,2);si(s,e=>z(n,e),()=>K(n)),U(()=>X(o,t.remaining)),q(`click`,s,function(...e){t.onDismiss?.apply(this,e)}),Y(e,r)};Z(i,e=>{t.canExtend?e(a):e(o,-1)}),M(r),Y(e,r),P()}vr([`click`]);var ia=J(`<div class="expired svelte-bznxud"><div class="icon svelte-bznxud">!</div> <h2 class="svelte-bznxud">Your cart has expired</h2> <p class="desc svelte-bznxud">The tickets in your cart were held for a limited time and have now been released. Nothing has been
|
|
5
|
-
charged. Start again to choose your tickets.</p> <button class="btn btn-primary">Start again</button></div>`);function aa(e,t){N(t,!0);let n=R(null);gn(()=>{K(n)?.focus()});var r=ia(),i=H(B(r),6);si(i,e=>z(n,e),()=>K(n)),M(r),q(`click`,i,function(...e){t.onStartAgain?.apply(this,e)}),Y(e,r),P()}vr([`click`]);var oa=Symbol(`booking-host`);function sa(e){He(oa,e)}function ca(){return Ve(oa)}function la(e,t,n){if(e==null)throw Error(`<${t}> has no ${n}. Pass ${n}={...}, or wrap it in <BookingProvider host={createBookingHost(...)}>.`);return e}var ua=J(`<div class="guard-overlay bw-widget svelte-x4iaex"><!></div>`),da=J(`<div class="guard-overlay bw-widget svelte-x4iaex"><div class="guard-card svelte-x4iaex"><!></div></div>`),fa=J(`<!> <!>`,1);function pa(e,t){N(t,!0);let n=Q(t,`extensionEnabled`,3,!1),r=ca(),i=I(()=>la(t.api??r?.api,`CartExpiryGuard`,`api`)),a=I(()=>la(t.cartManager??r?.cartManager,`CartExpiryGuard`,`cartManager`)),o=R(null),s=R(``),c=R(!1),l=R(!1),u=R(!1),d=R(!1),f=R(null);async function p(){if(K(a).hasCart)try{z(o,await K(i).getCart(),!0)}catch(e){ki(e)&&K(a).reset()}}p(),gn(()=>qi(e=>{e.type===`cart:updated`&&z(o,`cart`in e?e.cart:null,!0),e.type===`order:complete`&&(z(o,null),z(d,!1)),e.type===`payment:started`&&z(d,!0),e.type===`payment:ended`&&(z(d,!1),w(),K(o)&&K(h)&&K(h).getTime()<=Date.now()&&re())}));let m=R(``);gn(()=>{let e=K(o)?.cartToken??``;e!==K(m)&&(z(m,e,!0),z(f,null),T(),z(d,Vi(e)!==null),e&&z(u,!1))});let h=I(()=>K(o)?Yi(K(o)):null),g=I(()=>n()&&!!K(o)&&!K(u)&&K(c)&&K(f)!==K(h)?.getTime()),_=I(()=>!!K(o)&&!Xi(K(o)));async function v(){z(l,!0);let e=K(h)?.getTime()??null;try{z(o,await K(i).extendCart(),!0),Yi(K(o)).getTime()===e&&z(f,e,!0),$({type:`cart:updated`,cart:K(o)})}catch(t){ki(t)?ae():ji(t)?te():Ai(t)&&z(f,e,!0)}finally{z(l,!1)}}function y(){K(h)&&z(f,K(h).getTime(),!0)}let b=null,x=null,S=!1;function C(){b!==null&&(clearTimeout(b),b=null)}function w(){x!==null&&(clearTimeout(x),x=null)}function T(){C(),w()}li(T);function ee(){if(!K(u)){if(K(d)){E();return}re()}}async function E(){if(!K(o)||K(u)||!K(d)||S||x!==null)return;S=!0,C();let e;try{z(o,await K(i).getCart(),!0),$({type:`cart:updated`,cart:K(o)}),e=Yi(K(o)).getTime()<=Date.now()?`past`:`live`}catch(t){e=ki(t)?`gone`:`unknown`}finally{S=!1}if(!K(u)){if(e===`gone`){Hi(),z(d,!1),ae();return}if(e!==`live`){if(!K(d)){re();return}e===`past`?te():ie()}}}function te(){$({type:`payment:timed-out`}),D()}function D(){w(),x=setTimeout(()=>{x=null,ne()},5e3)}async function ne(){if(!K(o)||K(u)||!K(d))return;let e=Vi(K(o).cartToken??``);if(e){try{await K(i).abandonPayment(e.checkoutId)}catch(e){if(Mi(e)||Ni(e)){$({type:`modal:open`});return}return}Hi(),z(d,!1),re()}}async function re(){if(!(!K(o)||K(u)||K(d)||S)){S=!0,C();try{z(o,await K(i).getCart(),!0),$({type:`cart:updated`,cart:K(o)}),Yi(K(o)).getTime()<=Date.now()&&ie()}catch(e){ki(e)?ae():ie()}finally{S=!1}}}function ie(){b=setTimeout(()=>{b=null,K(d)?E():re()},3e4)}function ae(){T(),z(u,!0),K(a).reset(),$({type:`cart:updated`,cart:null}),$({type:`cart:expired`})}function O(){z(u,!1),z(o,null),$({type:`modal:close`})}function oe(e){if(e.key===`Escape`&&K(g)){e.preventDefault(),y();return}if(e.key!==`Tab`)return;let t=K(se)?.querySelectorAll(`button:not([disabled]), [href], [tabindex]:not([tabindex="-1"])`);if(!t?.length)return;let n=t[0],r=t[t.length-1],i=e.shiftKey&&document.activeElement===n,a=!e.shiftKey&&document.activeElement===r;(i||a)&&(e.preventDefault(),(e.shiftKey?r:n).focus())}let se=R(null);var ce=fa();_r(`keydown`,Qt,function(...e){(K(g)||K(u)?oe:void 0)?.apply(this,e)});var le=V(ce),ue=e=>{$i(e,{get expiresAt(){return K(h)},onExpired:ee,get remaining(){return K(s)},set remaining(e){z(s,e,!0)},get warning(){return K(c)},set warning(e){z(c,e,!0)}})};Z(le,e=>{K(o)&&K(h)&&e(ue)});var de=H(le,2),fe=e=>{var t=ua();ra(B(t),{get remaining(){return K(s)},get canExtend(){return K(_)},get extending(){return K(l)},onExtend:v,onDismiss:y}),M(t),si(t,e=>z(se,e),()=>K(se)),Y(e,t)},pe=e=>{var t=da(),n=B(t);aa(B(n),{onStartAgain:O}),M(n),M(t),si(t,e=>z(se,e),()=>K(se)),Y(e,t)};Z(de,e=>{K(g)?e(fe):K(u)&&e(pe,1)}),Y(e,ce),P()}var ma={prod:`https://checkout.peachpayments.com/js/checkout.js`,qa:`https://sandbox-checkout.peachpayments.com/js/checkout.js`},ha=null,ga=null,_a=null;function va(){return _a}function ya(e){let t=e.url??(e.env?ma[e.env]:void 0);!t||t===ga||(ga=t,ha=null)}function ba(){let e=window,t=e.BW_CHECKOUT_ENV??`prod`,n=e.BW_CHECKOUT_PEACH_SDK_URL??ga??ma[t]??ma.prod;return e.Checkout?(_a!==null&&_a!==n?console.warn(`[booking-widget] Peach SDK already loaded from ${_a}, so ${n} was not used. Configure peachEnv before the first payment, or set window.BW_CHECKOUT_PEACH_SDK_URL.`):_a===null&&console.warn(`[booking-widget] Peach SDK was already on the page when the widget first needed it, so ${n} was not used. If its environment does not match the checkout API, the card form will not render.`),Promise.resolve()):ha||(_a=n,ha=new Promise((e,t)=>{let r=document.querySelector(`script[src="${n}"]`);if(r){r.addEventListener(`load`,()=>e()),r.addEventListener(`error`,()=>t(Error(`Failed to load the Peach Payments SDK script`)));return}let i=document.createElement(`script`);i.src=n,i.onload=()=>e(),i.onerror=()=>t(Error(`Failed to load the Peach Payments SDK script`)),document.head.appendChild(i)}),ha)}var xa={};function Sa(e){xa={...xa,...e}}function Ca(){return{...xa}}function wa(e={}){let t={...xa,...e};(t.peachEnv||t.peachSdkUrl)&&ya({env:t.peachEnv,url:t.peachSdkUrl});let n=t.api??new Pi(t.apiBaseUrl??``),r=new Li(n),i=new Gi(n),a=typeof window<`u`,o;a?(r.startBackgroundRefresh(),o=r.ensureSession(t.checkoutKey??``).then(()=>{}),o.catch(()=>{})):o=Promise.resolve();let s={autoSelectSingleTimeSlot:t.autoSelectSingleTimeSlot??!1,wizardPages:t.wizardPages,editPages:t.editPages,shouldBottomCloseOnModal:t.shouldBottomCloseOnModal??!0},c=R(!1),l=!1;function u(e){K(c)!==e&&(z(c,e,!0),t.onCheckoutOpenChange?.(e))}function d(){u(!0)}function f(){u(!1)}function p(){let e=t.autoOpenCheckout??!0;return typeof e==`function`?e():e}let m=qi(e=>{switch(e.type){case`cart:change`:e.openCheckout&&p()&&d(),t.onCartChange?.({itemCount:e.itemCount,cartItemId:e.cartItemId,totalFormatted:e.totalFormatted});break;case`modal:open`:d();break;case`modal:close`:f();break;case`cart:updated`:t.onCartUpdated?.(e.cart);break;case`cart:expired`:t.onCartExpired?.();break;case`order:complete`:t.onOrderConfirmed?.({cartToken:e.cartToken,value:e.value,currency:e.currency})}}),h=t.mountExpiryGuard??!0?Da(n,i,t.extensionEnabled):null;return{api:n,sessionManager:r,cartManager:i,ready:o,get isCheckoutOpen(){return K(c)},options:s,openCheckout:d,closeCheckout:f,destroy(){l||(l=!0,f(),m(),h?.(),r.stop())}}}var Ta=[],Ea=null;function Da(e,t,n){let r={api:e,cartManager:t,extensionEnabled:n};Ta.push(r),Ta.length===1&&Oa(r);let i=!1;return()=>{if(i)return;i=!0;let e=Ta[0]===r;if(Ta=Ta.filter(e=>e!==r),Ta.length===0){Ea?.(),Ea=null;return}e&&(Ea?.(),Oa(Ta[0]))}}function Oa(e){Ea=ka(e.api,e.cartManager,e.extensionEnabled)}function ka(e,t,n){if(typeof document>`u`)return null;let r=document.createElement(`div`);r.dataset.bwExpiryGuard=``;let i=null,a=!1;function o(){a||(document.body.appendChild(r),i=Dr(pa,{target:r,props:n===void 0?{api:e,cartManager:t}:{api:e,cartManager:t,extensionEnabled:n}}))}return document.readyState===`loading`?document.addEventListener(`DOMContentLoaded`,o,{once:!0}):o(),()=>{a=!0,document.removeEventListener(`DOMContentLoaded`,o),i&&jr(i),r.remove()}}function Aa(){$({type:`modal:close`})}function ja(){$({type:`modal:open`})}var Ma=[{title:`Option`,widgets:[`option`,`age-category`]},{title:`Schedule`,widgets:[`date`,`time`]},{title:`Pickup`,widgets:[`pickup`]}],Na={"option-first":Ma,"date-first":[{title:`Age & capacity`,widgets:[`age-category`]},{title:`Schedule`,widgets:[`date`,`time`]},{title:`Option`,widgets:[`option`]},{title:`Pickup`,widgets:[`pickup`]}]};function Pa(e){if(!e)return Ma;if(e in Na)return Na[e];try{let t=JSON.parse(e);if(Array.isArray(t)&&t.length>0&&t[0].widgets)return t}catch{}return Ma}var Fa={"option-first":[{title:`Option`,widgets:[`option`]},{title:`Age, Date & Time`,widgets:[`age-category`,`date`,`time`]},{title:`Pickup`,widgets:[`pickup`]}],"date-first":[{title:`Age, Date & Time`,widgets:[`age-category`,`date`,`time`]},{title:`Option`,widgets:[`option`]},{title:`Pickup`,widgets:[`pickup`]}]};function Ia(e,t){if(t){if(t in Fa)return Fa[t];try{let e=JSON.parse(t);if(Array.isArray(e)&&e.length>0&&e[0].widgets)return e}catch{}}let n=e?e in Na?e:null:`option-first`;return n?Fa[n]:Pa(e)}var La={ZAR:`R`,USD:`$`,EUR:`€`,GBP:`£`};function Ra(e,t,n,r=0){let i=e/10**n;return`${La[t]??t}\u00A0${i.toFixed(r)}`}var za=J(`<div class="leading"><!></div>`),Ba=J(`<div class="heading svelte-idp8p9"> </div>`),Va=J(`<div class="body svelte-idp8p9"> </div>`),Ha=J(`<button><div class="layout svelte-idp8p9"><!> <div class="text svelte-idp8p9"><!> <!> <!></div> <span></span></div></button>`);function Ua(e,t){var n=Ha();let r;var i=B(n),a=B(i),o=e=>{var n=za();Ur(B(n),()=>t.leading),M(n),Y(e,n)};Z(a,e=>{t.leading&&e(o)});var s=H(a,2),c=B(s),l=e=>{var n=Ba(),r=B(n,!0);M(n),U(()=>X(r,t.heading)),Y(e,n)};Z(c,e=>{t.heading&&e(l)});var u=H(c,2),d=e=>{var n=Va(),r=B(n,!0);M(n),U(()=>X(r,t.body)),Y(e,n)};Z(u,e=>{t.body&&e(d)});var f=H(u,2),p=e=>{var n=Er();Ur(V(n),()=>t.children),Y(e,n)};Z(f,e=>{t.children&&e(p)}),M(s);var m=H(s,2);let h;M(i),M(n),U(()=>{r=qr(n,1,`card card-selectable`,null,r,{"card-selected":t.selected}),h=qr(m,1,`radio svelte-idp8p9`,null,h,{"radio-selected":t.selected})}),q(`click`,n,function(...e){t.onSelect?.apply(this,e)}),Y(e,n)}vr([`click`]);var Wa=J(`<p class="pricing svelte-19wqhng"> </p>`);function Ga(e,t){N(t,!0);let n=I(()=>()=>{let e=[];for(let n of t.option.units){if(!n.pricing||n.pricing.length===0)continue;let t=n.pricing[0];e.push(`${n.title??n.id} from ${Ra(t.retail,t.currency,t.currencyPrecision)}`)}return e.join(`, `)});Ua(e,{get selected(){return t.selected},get onSelect(){return t.onSelect},get heading(){return t.option.title},get body(){return t.option.description},children:(e,t)=>{var r=Er(),i=V(r),a=e=>{var t=Wa(),r=B(t,!0);M(t),U(e=>X(r,e),[()=>K(n)()]),Y(e,t)},o=I(()=>K(n)());Z(i,e=>{K(o)&&e(a)}),Y(e,r)},$$slots:{default:!0}}),P()}var Ka=J(`<span class="price svelte-bzhcxd"> </span>`),qa=J(`<p class="limit-message svelte-bzhcxd"> </p>`),Ja=J(`<div><div class="info svelte-bzhcxd"><span class="name svelte-bzhcxd"> </span> <!></div> <div class="stepper svelte-bzhcxd"><button class="step-btn svelte-bzhcxd" aria-label="Decrease">−</button> <input class="qty svelte-bzhcxd" type="text" inputmode="numeric" pattern="[0-9]*"/> <button class="step-btn svelte-bzhcxd" aria-label="Increase">+</button></div></div> <!>`,1);function Ya(e,t){N(t,!0);let n=Q(t,`boxed`,3,!0),r=Q(t,`divided`,3,!1),i=I(()=>()=>{if(!t.unit.pricing||t.unit.pricing.length===0)return``;let e=t.unit.pricing[0];return`from ${Ra(e.retail,e.currency,e.currencyPrecision)}`}),a=R(Zt(String(t.quantity))),o=R(``);gn(()=>{z(a,String(t.quantity),!0)});function s(){t.quantity>0&&t.onChange(t.quantity-1)}function c(){if(t.max!=null&&t.quantity>=t.max){l();return}z(o,``),t.onChange(t.quantity+1)}function l(){let e=t.unit.title??t.unit.id;z(o,t.max===0?`No ${e} tickets left for this time slot.`:`Only ${t.max} ${e} ticket${t.max===1?``:`s`} left for this time slot.`,!0)}function u(){let e=K(a).replace(/[^0-9]/g,``);e!==K(a)&&z(a,e,!0),z(o,``)}function d(){let e=K(a)===``?0:parseInt(K(a),10);Number.isNaN(e)&&(e=0),t.max!=null&&e>t.max&&(e=t.max,l()),z(a,String(e),!0),e!==t.quantity&&t.onChange(e)}function f(e){e.currentTarget.select()}var p=Ja(),m=V(p);let h;var g=B(m),_=B(g),v=B(_,!0);M(_);var y=H(_,2),b=e=>{var t=Ka(),n=B(t,!0);M(t),U(e=>X(n,e),[()=>K(i)()]),Y(e,t)},x=I(()=>K(i)());Z(y,e=>{K(x)&&e(b)}),M(g);var S=H(g,2),C=B(S),w=H(C,2);Zr(w);var T=H(w,2);M(S),M(m);var ee=H(m,2),E=e=>{var t=qa(),n=B(t,!0);M(t),U(()=>X(n,K(o))),Y(e,t)};Z(ee,e=>{K(o)&&e(E)}),U(()=>{h=qr(m,1,`row svelte-bzhcxd`,null,h,{card:n(),plain:!n(),divided:r()}),X(v,t.unit.title??t.unit.id),C.disabled=t.quantity===0,$r(w,`aria-label`,`${t.unit.title??t.unit.id??``} quantity`),T.disabled=t.max!=null&&t.quantity>=t.max}),q(`click`,C,s),q(`input`,w,u),_r(`blur`,w,d),_r(`focus`,w,f),ri(w,()=>K(a),e=>z(a,e)),q(`click`,T,c),Y(e,p),P()}vr([`click`,`input`]);var Xa=J(`<div class="loading-center"><div class="spinner"></div></div>`),Za=J(`<span class="svelte-10gu2tq"> </span>`),Qa=J(`<span class="cell empty svelte-10gu2tq"></span>`),$a=J(`<span class="day-price svelte-10gu2tq"> </span>`),eo=J(`<button><span class="day-num svelte-10gu2tq"> </span> <!></button>`),to=J(`<div class="header svelte-10gu2tq"><button class="nav-btn svelte-10gu2tq" aria-label="Previous month">‹</button> <span class="month svelte-10gu2tq"> </span> <button class="nav-btn svelte-10gu2tq" aria-label="Next month">›</button></div> <div class="day-names svelte-10gu2tq"></div> <div class="grid svelte-10gu2tq"></div>`,1),no=J(`<div class="calendar svelte-10gu2tq"><!></div>`);function ro(e,t){N(t,!0);let n=[`SU`,`MO`,`TU`,`WE`,`TH`,`FR`,`SA`],r=R(Zt(new Date)),i=I(()=>()=>{let e=K(r).getFullYear(),t=K(r).getMonth(),n=new Date(e,t,1).getDay(),i=new Date(e,t+1,0).getDate(),a=[];for(let e=0;e<n;e++)a.push(null);for(let n=1;n<=i;n++)a.push(new Date(e,t,n));return a}),a=I(()=>K(r).toLocaleDateString(`en`,{month:`long`}));function o(){let e=new Date(K(r));e.setMonth(e.getMonth()-1),z(r,e,!0)}function s(){let e=new Date(K(r));e.setMonth(e.getMonth()+1),z(r,e,!0)}function c(e){let n=t.availabilityByDate[Ci(e)];return n?n.available?`available`:n.status===`SOLD_OUT`?`sold-out`:`unavailable`:`unavailable`}function l(e){let n=t.availabilityByDate[Ci(e)];if(!n||!n.available)return``;if(n.unitPricing&&n.unitPricing.length>0){let e=n.unitPricing[0];return Ra(e.retail,e.currency,e.currencyPrecision)}return``}function u(e){return t.selectedDate?Ci(e)===Ci(t.selectedDate):!1}function d(e){let t=new Date;return t.setHours(0,0,0,0),e<t}function f(e){c(e)!==`available`||d(e)||t.onDateSelected(e)}var p=no(),m=B(p),h=e=>{Y(e,Xa())},g=e=>{var t=to(),r=V(t),p=B(r),m=H(p,2),h=B(m,!0);M(m);var g=H(m,2);M(r);var _=H(r,2);Lr(_,21,()=>n,Nr,(e,t)=>{var n=Za(),r=B(n,!0);M(n),U(()=>X(r,K(t))),Y(e,n)}),M(_);var v=H(_,2);Lr(v,21,()=>K(i)(),Nr,(e,t)=>{var n=Er(),r=V(n),i=e=>{Y(e,Qa())},a=e=>{let n=I(()=>c(K(t))),r=I(()=>d(K(t))),i=I(()=>l(K(t)));var a=eo();let o;var s=B(a),p=B(s,!0);M(s);var m=H(s,2),h=e=>{var t=$a(),n=B(t,!0);M(t),U(()=>X(n,K(i))),Y(e,t)};Z(m,e=>{K(i)&&!K(r)&&e(h)}),M(a),U((e,t)=>{o=qr(a,1,`cell svelte-10gu2tq`,null,o,e),a.disabled=K(n)!==`available`||K(r),X(p,t)},[()=>({available:K(n)===`available`&&!K(r),"sold-out":K(n)===`sold-out`,unavailable:K(n)===`unavailable`||K(r),selected:u(K(t))}),()=>K(t).getDate()]),q(`click`,a,()=>f(K(t))),Y(e,a)};Z(r,e=>{K(t)===null?e(i):e(a,-1)}),Y(e,n)}),M(v),U(()=>X(h,K(a))),q(`click`,p,o),q(`click`,g,s),Y(e,t)};Z(m,e=>{t.loading?e(h):e(g,-1)}),M(p),Y(e,p),P()}vr([`click`]);var io=J(`<div class="loading-center"><div class="spinner"></div></div>`),ao=J(`<p class="hint svelte-1hu99a4">All-day availability</p>`),oo=J(`<div class="slots svelte-1hu99a4"></div>`);function so(e,t){N(t,!0);var n=Er(),r=V(n),i=e=>{Y(e,io())},a=e=>{Y(e,ao())},o=e=>{var n=oo();Lr(n,21,()=>t.timeSlots,Nr,(e,n)=>{let r=I(()=>wi(K(n).localDateTimeStart));{let i=I(()=>t.selectedTime===K(r)),a=I(()=>K(n).vacancies==null?void 0:`${K(n).vacancies} left`);Ua(e,{get selected(){return K(i)},onSelect:()=>t.onTimeSelected(K(r)),get heading(){return K(r)},get body(){return K(a)}})}}),M(n),Y(e,n)};Z(r,e=>{t.loading?e(i):t.timeSlots.length===1&&t.timeSlots[0].allDay?e(a,1):t.timeSlots.length>0&&e(o,2)}),Y(e,n),P()}var co=`(min-width: 1024px)`;function lo(){return typeof window>`u`||!window.matchMedia?null:window.matchMedia(co)}function uo(){return lo()?.matches??!0}function fo(){let e=R(Zt(uo()));return gn(()=>{let t=lo();if(!t)return;z(e,t.matches,!0);let n=t=>{z(e,t.matches,!0)};return t.addEventListener(`change`,n),()=>t.removeEventListener(`change`,n)}),{get isInline(){return K(e)}}}var po={option:`Which option would you like?`,"age-category":`How many tickets would you like?`,date:`When would you like to go?`,time:`What time works for you?`,pickup:`Where would you like to be picked up?`,addon:``},mo=J(`<div class="wizard-header svelte-9w5z1v"><h2 class="svelte-9w5z1v">Buy Tickets</h2></div>`),ho=J(`<span> </span>`),go=J(`<div class="section svelte-9w5z1v"><div class="option-list svelte-9w5z1v"></div></div>`),_o=J(`<div class="section svelte-9w5z1v"><div class="unit-list svelte-9w5z1v"></div></div>`),vo=J(`<div class="section svelte-9w5z1v"><!></div>`),yo=J(`<div class="section svelte-9w5z1v"><div class="pickup-list svelte-9w5z1v"></div></div>`),bo=J(`<!> <!> <!> <!> <!>`,1),xo=J(`<div class="accordion-body svelte-9w5z1v"></div>`),So=J(`<div><button class="accordion-header svelte-9w5z1v"><div class="accordion-header-text svelte-9w5z1v"><span class="accordion-title svelte-9w5z1v"> </span> <!></div> <span></span></button> <!></div>`),Co=J(`<div class="wizard-body svelte-9w5z1v"></div> <div class="action-bar"><button class="btn btn-secondary">Return to Cart</button> <button class="btn btn-primary">Save & Update</button></div>`,1),wo=J(`<h2 class="body-title svelte-9w5z1v">Buy Tickets</h2>`),To=J(`<div class="section svelte-9w5z1v"><h4 class="section-title"> </h4> <div class="option-list svelte-9w5z1v"></div></div>`),Eo=J(`<div class="section svelte-9w5z1v"><h4 class="section-title"> </h4> <div></div></div>`),Do=J(`<div class="section svelte-9w5z1v"><h4 class="section-title"> </h4> <!></div>`),Oo=J(`<div class="section svelte-9w5z1v"><h4 class="section-title"> </h4> <div class="pickup-list svelte-9w5z1v"></div></div>`),ko=J(`<span></span>`),Ao=J(`<div class="page-dots svelte-9w5z1v"></div>`),jo=J(`<button class="btn btn-secondary"> </button>`),Mo=J(`<div class="wizard-body svelte-9w5z1v"><!> <h3 class="page-title svelte-9w5z1v"> </h3> <!></div> <div class="wizard-footer svelte-9w5z1v"><!> <div class="action-bar svelte-9w5z1v"><!> <button class="btn btn-primary"> </button></div></div>`,1),No=J(`<div class="dialog-backdrop svelte-9w5z1v"><div class="dialog svelte-9w5z1v"><h3 class="dialog-title svelte-9w5z1v">You have unsaved changes</h3> <p class="dialog-body svelte-9w5z1v">Would you like to proceed?</p> <div class="dialog-actions svelte-9w5z1v"><button class="dialog-btn-text svelte-9w5z1v">Discard changes</button> <button class="dialog-btn-fill svelte-9w5z1v">Return to editing</button></div></div></div>`),Po=J(`<div><!> <!></div> <!>`,1);function Fo(e,t){N(t,!0);let n=Q(t,`editPages`,19,()=>t.wizardPages),r=Q(t,`autoSelectSingleTimeSlot`,3,!1),i=fo(),a=I(()=>t.editItem!=null),o=I(()=>t.editItem&&!K(D)()?t.editItem.optionId:void 0),s=R(0),c=R(null),l=R(Zt({})),u=R(null),d=R(null),f=R(null),p=R(null),m=R(Zt({})),h=R(Zt([])),g=R(!1),_=R(!1),v=R(!1),y=R(!1),b=R(0),x=R(Zt(new Set));function S(...e){z(x,new Set([...K(x),...e]),!0)}function C(...e){e.every(e=>!K(x).has(e))||z(x,new Set([...K(x)].filter(t=>!e.includes(t))),!0)}let w=I(()=>Object.values(K(l)).some(e=>e>0)),T=I(()=>K(h).length===1&&K(h)[0].allDay),ee=I(()=>K(h).length===1),E=I(()=>!K(_)&&K(h).length===0),te=I(()=>K(T)||r()&&K(ee)),D=I(()=>()=>{let e=t.wizardPages.findIndex(e=>e.widgets.includes(`age-category`)),n=t.wizardPages.findIndex(e=>e.widgets.includes(`option`));return e>=0&&(n<0||e<n)}),ne=I(()=>()=>K(c)?K(c).units:K(D)()?t.product.options[0]?.units??[]:[]),re=I(()=>()=>K(c)?K(c).id:K(D)()?t.product.options[0]?.id??null:null);ci(()=>{t.editItem&&ie(t.editItem)});function ie(e){let n=t.product.options.find(t=>t.id===e.optionId);n&&z(c,n,!0);let r={};for(let t of e.unitItems)r[t.unitId]=(r[t.unitId]??0)+1;z(l,r,!0),K(w)&&ae(e.availabilityId,e.pickupPointId)}async function ae(e,n){if(await xe(),!e)return;let r=Ti(e);if(!r)return;let i=K(re)();if(!i)return;let a=r.split(`-`).map(Number);z(u,new Date(a[0],a[1]-1,a[2]),!0),z(_,!0);let o=await t.api.getAvailability(t.product.id,i,r);z(h,o,!0),z(_,!1);let s=o.find(t=>t.id===e);s&&(z(f,s,!0),s.allDay||z(d,wi(s.localDateTimeStart),!0),n&&K(c)?.pickupAvailable&&z(p,K(c).pickupLocations?.find(e=>e.id===n)??null,!0))}function O(e){return K(D)()?se(e):oe(e)}function oe(e){switch(e){case`option`:return!K(o);case`age-category`:return K(c)!=null;case`date`:return K(w);case`time`:return K(u)!=null&&!K(te)&&!K(E);case`pickup`:return K(f)!=null&&K(c)?.pickupAvailable===!0;case`addon`:return!1}}function se(e){switch(e){case`age-category`:return K(ne)().length>0;case`date`:return K(w);case`time`:return K(u)!=null&&!K(te)&&!K(E);case`option`:return!K(o)&&(K(f)!=null||K(u)!=null&&K(te));case`pickup`:return K(c)!=null&&K(c).pickupAvailable===!0&&K(f)!=null;case`addon`:return!1}}let ce=I(()=>()=>{let e=[];for(let n=0;n<t.wizardPages.length;n++){let r=t.wizardPages[n].widgets.filter(O);r.length>0&&e.push({index:n,title:t.wizardPages[n].title,widgets:r})}return e}),le=I(()=>()=>{let e=[];for(let t of n())for(let n of t.widgets)O(n)&&!e.includes(n)&&e.push(n);return e}),ue=I(()=>()=>{let e=K(ce)();return K(s)>=e.length?e[e.length-1]??null:e[K(s)]??null}),de=I(()=>()=>K(s)>=K(ce)().length-1),fe=I(()=>()=>K(ue)()?.title??``);function pe(e){switch(e){case`option`:return K(c)?.title??`Not selected`;case`age-category`:{let e=[];for(let t of K(ne)()){let n=K(l)[t.id]??0;n>0&&e.push(`${n} ${t.title}`)}return e.length>0?e.join(`, `):`Not selected`}case`date`:return K(u)?K(u).toLocaleDateString(`en-GB`,{day:`numeric`,month:`short`,year:`numeric`}):`Not selected`;case`time`:return K(d)??(K(te)?`All day`:`Not selected`);case`pickup`:return K(p)?.title??K(p)?.id??`Not selected`;default:return``}}function me(e){return e.map(pe).filter(e=>e&&e!==`Not selected`).join(` · `)||`Not selected`}let he=I(()=>()=>{let e=[];for(let t of n()){let n=t.widgets.filter(O);n.length>0&&e.push({title:t.title,widgets:n})}return e}),ge=I(()=>()=>{if(K(u)!=null&&K(E))return!1;let e=K(a)?K(le)():K(ue)()?.widgets??[];if(e.length===0)return!1;for(let t of e)switch(t){case`option`:if(!K(c))return!1;break;case`age-category`:if(!K(w))return!1;break;case`date`:if(!K(u))return!1;break;case`time`:if(!K(d)&&!K(te))return!1;break;case`pickup`:if(K(c)?.pickupRequired&&!K(p))return!1}return!0});function _e(e){if(K(D)()){z(c,e,!0),K(p)&&!e.pickupLocations?.some(e=>e.id===K(p).id)&&(z(p,null),S(`pickup`)),z(v,!0);return}z(c,e,!0),z(l,Object.fromEntries(e.units.map(e=>[e.id,0])),!0),z(u,null),z(d,null),z(f,null),z(p,null),z(m,{},!0),z(h,[],!0),z(v,!0)}function ve(e,t){z(l,{...K(l),[e]:t},!0),z(v,!0),K(w)&&Object.keys(K(m)).length===0&&xe(),ye()}function ye(){!K(f)||K(f).vacancies==null||Object.values(K(l)).reduce((e,t)=>e+t,0)<=K(f).vacancies||(z(u,null),z(d,null),z(f,null),z(h,[],!0),S(`date`,`time`))}function be(e){if(!K(f)||K(f).vacancies==null)return;let t=Object.values(K(l)).reduce((e,t)=>e+t,0),n=K(l)[e]??0;return K(f).vacancies-t+n}async function xe(){let e=K(re)();e&&(z(g,!0),z(m,await t.api.getAvailabilityCalendar(t.product.id,e),!0),z(g,!1))}async function Se(e){let n=K(re)();if(!n)return;z(u,e,!0),z(d,null),z(f,null),z(h,[],!0),z(v,!0),z(_,!0),C(`date`,`time`);let i=await t.api.getAvailability(t.product.id,n,Ci(e));z(h,i,!0),z(_,!1),i.length===1&&(i[0].allDay||r())&&(z(f,i[0],!0),i[0].allDay||z(d,wi(i[0].localDateTimeStart),!0))}function Ce(e){let t=K(h).find(t=>wi(t.localDateTimeStart)===e&&t.available);t&&(z(d,e,!0),z(f,t,!0),z(v,!0),C(`time`))}function k(e){z(p,e,!0),z(v,!0),C(`pickup`)}function we(){K(de)()?A():Jt(s)}function Te(){K(s)>0?Jt(s,-1):t.onCancel?Ee():!K(o)&&K(c)&&(z(c,null),z(l,{},!0),z(u,null),z(d,null),z(f,null),z(p,null),z(m,{},!0),z(h,[],!0))}function Ee(){if(K(v)){z(y,!0);return}t.onCancel?.()}function De(){z(y,!1),t.onCancel?.()}function A(){if(!K(f)||!K(c))return;let e=[];for(let t of K(f).unitPricing??[]){let n=K(l)[t.unitId]??0;if(n<=0)continue;let r=K(ne)().find(e=>e.id===t.unitId);e.push({unitId:t.unitId,quantity:n,title:r?.title??t.unitId,pricePerUnit:t.retail})}let n=0;for(let t of e)n+=t.pricePerUnit*t.quantity;let r=K(f).unitPricing?.[0],i=r?.currency??t.product.defaultCurrency??`ZAR`,a=r?.currencyPrecision??2;t.onComplete({productId:t.product.id,optionId:K(c).id,optionTitle:K(c).title,availabilityId:K(f).id,localDate:K(u)?Ci(K(u)):void 0,pickupPointId:K(p)?.id,units:e,totalPrice:n,currency:i,currencyPrecision:a})}var Oe=Po(),j=V(Oe);let ke;var Ae=B(j),je=e=>{Y(e,mo())};Z(Ae,e=>{!K(a)&&i.isInline&&e(je)});var Me=H(Ae,2),Ne=e=>{var n=Co(),r=V(n);Lr(r,21,()=>K(he)(),Nr,(e,n,r)=>{let i=I(()=>K(n).widgets.some(e=>K(x).has(e)));var a=So();let s;var f=B(a),v=B(f),y=B(v),S=B(y,!0);M(y);var C=H(y,2),T=e=>{var t=ho();let r;var a=B(t,!0);M(t),U(e=>{r=qr(t,1,`accordion-summary svelte-9w5z1v`,null,r,{invalidated:K(i)}),X(a,e)},[()=>K(i)?`Changes made require new configuration`:me(K(n).widgets)]),Y(e,t)};Z(C,e=>{K(b)!==r&&e(T)}),M(v);var ee=H(v,2);let E;M(f);var D=H(f,2),re=e=>{var r=xo();Lr(r,21,()=>K(n).widgets,Nr,(e,n)=>{var r=bo(),i=V(r),a=e=>{var n=go(),r=B(n);Lr(r,21,()=>t.product.options,Nr,(e,t)=>{{let n=I(()=>K(c)?.id===K(t).id);Ga(e,{get option(){return K(t)},get selected(){return K(n)},onSelect:()=>_e(K(t))})}}),M(r),M(n),Y(e,n)};Z(i,e=>{K(n)===`option`&&!K(o)&&e(a)});var s=H(i,2),f=e=>{var t=_o(),n=B(t);Lr(n,21,()=>K(ne)(),Nr,(e,t)=>{{let n=I(()=>K(l)[K(t).id]??0),r=I(()=>be(K(t).id));Ya(e,{get unit(){return K(t)},get quantity(){return K(n)},get max(){return K(r)},onChange:e=>ve(K(t).id,e)})}}),M(n),M(t),Y(e,t)},v=I(()=>K(n)===`age-category`&&K(ne)().length>0);Z(s,e=>{K(v)&&e(f)});var y=H(s,2),b=e=>{var t=vo();ro(B(t),{get availabilityByDate(){return K(m)},get selectedDate(){return K(u)},onDateSelected:Se,get loading(){return K(g)}}),M(t),Y(e,t)};Z(y,e=>{K(n)===`date`&&K(w)&&e(b)});var x=H(y,2),S=e=>{var t=vo();so(B(t),{get timeSlots(){return K(h)},get selectedTime(){return K(d)},get loading(){return K(_)},onTimeSelected:Ce}),M(t),Y(e,t)};Z(x,e=>{K(n)===`time`&&K(u)&&!K(te)&&e(S)});var C=H(x,2),T=e=>{var t=yo(),n=B(t);Lr(n,21,()=>K(c).pickupLocations,Nr,(e,t)=>{{let n=I(()=>K(p)?.id===K(t).id),r=I(()=>K(t).title??K(t).id);Ua(e,{get selected(){return K(n)},onSelect:()=>k(K(t)),get heading(){return K(r)},get body(){return K(t).address}})}}),M(n),M(t),Y(e,t)};Z(C,e=>{K(n)===`pickup`&&K(c)?.pickupAvailable&&K(c).pickupLocations&&e(T)}),Y(e,r)}),M(r),Y(e,r)};Z(D,e=>{K(b)===r&&e(re)}),M(a),U(e=>{s=qr(a,1,`accordion-section svelte-9w5z1v`,null,s,{expanded:K(b)===r,invalidated:K(i)}),X(S,e),E=qr(ee,1,`accordion-chevron svelte-9w5z1v`,null,E,{open:K(b)===r})},[()=>K(n).title.toUpperCase()]),q(`click`,f,()=>{z(b,K(b)===r?-1:r,!0)}),Y(e,a)}),M(r);var i=H(r,2),a=B(i),s=H(a,2);M(i),U(e=>s.disabled=e,[()=>!K(ge)()]),q(`click`,a,Ee),q(`click`,s,A),Y(e,n)},Pe=e=>{var n=Mo(),r=V(n),a=B(r),f=e=>{Y(e,wo())};Z(a,e=>{i.isInline||e(f)});var v=H(a,2),y=B(v,!0);M(v),Lr(H(v,2),17,()=>K(ue)()?.widgets??[],Nr,(e,n)=>{var r=bo(),a=V(r),s=e=>{var r=To(),i=B(r),a=B(i,!0);M(i);var o=H(i,2);Lr(o,21,()=>t.product.options,Nr,(e,t)=>{{let n=I(()=>K(c)?.id===K(t).id);Ga(e,{get option(){return K(t)},get selected(){return K(n)},onSelect:()=>_e(K(t))})}}),M(o),M(r),U(()=>X(a,po[K(n)])),Y(e,r)};Z(a,e=>{K(n)===`option`&&!K(o)&&e(s)});var f=H(a,2),v=e=>{var t=Eo(),r=B(t),a=B(r,!0);M(r);var o=H(r,2);let s;Lr(o,21,()=>K(ne)(),Nr,(e,t)=>{{let n=I(()=>K(l)[K(t).id]??0),r=I(()=>be(K(t).id));Ya(e,{get unit(){return K(t)},boxed:!1,get divided(){return i.isInline},get quantity(){return K(n)},get max(){return K(r)},onChange:e=>ve(K(t).id,e)})}}),M(o),M(t),U(()=>{X(a,po[K(n)]),s=qr(o,1,`unit-list svelte-9w5z1v`,null,s,{divided:i.isInline})}),Y(e,t)},y=I(()=>K(n)===`age-category`&&K(ne)().length>0);Z(f,e=>{K(y)&&e(v)});var b=H(f,2),x=e=>{var t=Do(),r=B(t),i=B(r,!0);M(r),ro(H(r,2),{get availabilityByDate(){return K(m)},get selectedDate(){return K(u)},onDateSelected:Se,get loading(){return K(g)}}),M(t),U(()=>X(i,po[K(n)])),Y(e,t)};Z(b,e=>{K(n)===`date`&&K(w)&&e(x)});var S=H(b,2),C=e=>{var t=Do(),r=B(t),i=B(r,!0);M(r),so(H(r,2),{get timeSlots(){return K(h)},get selectedTime(){return K(d)},get loading(){return K(_)},onTimeSelected:Ce}),M(t),U(()=>X(i,po[K(n)])),Y(e,t)};Z(S,e=>{K(n)===`time`&&K(u)&&!K(te)&&e(C)});var T=H(S,2),ee=e=>{var t=Oo(),r=B(t),i=B(r,!0);M(r);var a=H(r,2);Lr(a,21,()=>K(c).pickupLocations,Nr,(e,t)=>{{let n=I(()=>K(p)?.id===K(t).id),r=I(()=>K(t).title??K(t).id);Ua(e,{get selected(){return K(n)},onSelect:()=>k(K(t)),get heading(){return K(r)},get body(){return K(t).address}})}}),M(a),M(t),U(()=>X(i,po[K(n)])),Y(e,t)};Z(T,e=>{K(n)===`pickup`&&K(c)?.pickupAvailable&&K(c).pickupLocations&&e(ee)}),Y(e,r)}),M(r);var b=H(r,2),x=B(b),S=e=>{var t=Ao();Lr(t,21,()=>K(ce)(),Nr,(e,t,n)=>{var r=ko();let i;U(()=>i=qr(r,1,`dot svelte-9w5z1v`,null,i,{active:n===K(s)})),Y(e,r)}),M(t),Y(e,t)},C=I(()=>K(ce)().length>1);Z(x,e=>{K(C)&&e(S)});var T=H(x,2),ee=B(T),E=e=>{var t=jo(),n=B(t,!0);M(t),U(()=>X(n,K(s)>0?`Back`:`Cancel`)),q(`click`,t,Te),Y(e,t)};Z(ee,e=>{(K(s)>0||t.onCancel&&!i.isInline)&&e(E)});var D=H(ee,2),re=B(D,!0);M(D),M(T),M(b),U((e,t,n)=>{X(y,e),D.disabled=t,X(re,n)},[()=>K(fe)(),()=>!K(ge)(),()=>K(de)()?`Add to Cart`:`Next`]),q(`click`,D,we),Y(e,n)};Z(Me,e=>{K(a)?e(Ne):e(Pe,-1)}),M(j);var Fe=H(j,2),Ie=e=>{var t=No(),n=B(t),r=H(B(n),4),i=B(r),a=H(i,2);M(r),M(n),M(t),q(`click`,t,()=>{z(y,!1)}),q(`click`,n,e=>e.stopPropagation()),q(`click`,i,De),q(`click`,a,()=>{z(y,!1)}),Y(e,t)};Z(Fe,e=>{K(y)&&e(Ie)}),U(()=>ke=qr(j,1,`wizard svelte-9w5z1v`,null,ke,{inline:!K(a)&&i.isInline})),Y(e,Oe),P()}vr([`click`]);var Io=J(`<div class="loading-center" style="height:100vh"><div class="spinner"></div></div>`),Lo=J(`<p class="add-to-cart-error svelte-19qd5my"> </p>`),Ro=J(`<!> <!>`,1),zo=J(`<div class="bw-widget svelte-19qd5my"><!></div>`);function Bo(e,t){N(t,!0);let n=Q(t,`wizardPages`,3,Ma),r=Q(t,`autoSelectSingleTimeSlot`,3,!1),i=Q(t,`autoOpenCheckout`,3,!0),a=ca(),o=I(()=>la(t.api??a?.api,`TicketConfigurator`,`api`)),s=I(()=>la(t.cartManager??a?.cartManager,`TicketConfigurator`,`cartManager`)),c=R(null),l=R(!0),u=R(!1),d=R(null);async function f(){z(c,await K(o).getProduct(t.productId),!0),z(l,!1)}f();async function p(e){await K(s).ensureCart();let t=Ei(e.units),n=await K(o).addCartItem({productId:e.productId,optionId:e.optionId,unitItems:t,availabilityId:e.availabilityId,localDate:e.localDate,pickupPointId:e.pickupPointId,amount:e.totalPrice}),r=Ra(e.totalPrice,e.currency,e.currencyPrecision,2);$({type:`cart:change`,itemCount:t.length,cartItemId:n.id??``,totalFormatted:r,openCheckout:i()}),$({type:`cart:updated`,cart:await K(o).getCart().catch(()=>null)})}async function m(e){z(u,!0),z(d,null);try{await p(e)}catch(t){if(Oi(t)){await h();return}if(t instanceof Di&&(t.status===401||t.status===404)){K(s).reset();try{await p(e)}catch{z(d,`Something went wrong adding this to your cart. Please try again.`)}}else z(d,`Something went wrong adding this to your cart. Please try again.`)}finally{z(u,!1)}}async function h(){z(d,`This ticket's price has changed since you started. Please check the updated price and try again.`);try{await f()}catch{z(d,`This ticket's price has changed and we could not load the new one. Please reload the page.`)}}var g=zo(),_=B(g),v=e=>{Y(e,Io())},y=e=>{var i=Ro(),a=V(i),s=e=>{var t=Lo(),n=B(t,!0);M(t),U(()=>X(n,K(d))),Y(e,t)};Z(a,e=>{K(d)&&e(s)}),Fo(H(a,2),{get product(){return K(c)},get api(){return K(o)},get wizardPages(){return n()},get autoSelectSingleTimeSlot(){return r()},get onCancel(){return t.onCancel},onComplete:m}),Y(e,i)};Z(_,e=>{K(l)||K(u)?e(v):K(c)&&e(y,1)}),M(g),Y(e,g),P()}function Vo(e,t){return(t??(typeof document>`u`?null:document.body))?.appendChild(e),{destroy(){e.remove()}}}var Ho=1500,Uo=9e4;function Wo(e){let t=R(null),n=R(null),r=null,i=R(!1),a=R(!1),o=R(null);async function s(){K(t)&&await p()}async function c(){let n=Vi(e.getApi().cartToken);n&&(z(t,n,!0),$({type:`payment:started`}),!await l()&&(e.setView(`payment`),Yi(e.getCart()).getTime()<=Date.now()&&s()))}async function l(){z(i,!0),e.setView(`result`);let r;try{r=await e.getApi().getCartStatus()}catch(t){return z(i,!1),ki(t)?(e.close(),!0):!1}return r.cartStatus===`confirmed`?(g(r.confirmResult??{items:[]}),z(i,!1),!0):r.cartStatus===`expired`?(z(n,`notCharged`),Hi(),z(t,null),$({type:`payment:ended`}),z(i,!1),!0):r.cartStatus===`paid`||r.cartStatus===`confirming`?(await _(),!0):(z(i,!1),!1)}async function u(t){try{return await e.getApi().abandonPayment(t),`abandoned`}catch(e){return Mi(e)||Ni(e)?`settled`:`failed`}}async function d(n){if(K(t)){z(a,!0);try{if(!await p())return}catch{}finally{z(a,!1)}if(K(t)){e.setView(`payment`);return}}z(a,!0),z(o,null);try{z(t,await e.getApi().payCart(n),!0),Bi(e.getApi().cartToken,{checkoutId:K(t).checkoutId??``,entityId:K(t).entityId??``}),e.setView(`payment`),$({type:`payment:started`}),e.refreshDeadlineAfterPay()}catch(t){if(ki(t)){e.close();return}let n=t instanceof Di?t.status:null;z(o,n===502?`Unable to start payment right now. Please try again.`:`Something went wrong starting your payment. Please try again.`,!0)}finally{z(a,!1)}}async function f(t){if(!((t.status===`cancelled`||t.status===`expired`||t.status===`error`)&&!await p())){if(t.status===`cancelled`){e.setView(`contact`);return}if(t.status===`expired`||t.status===`error`){z(n,`notCharged`),z(i,!1),e.setView(`result`);return}e.setView(`result`),await _()}}async function p(){if(!K(t))return await e.reloadCart();let n=await u(K(t).checkoutId);if(n===`settled`)return e.setView(`result`),await _(),!1;n===`abandoned`&&(z(t,null),Hi());let r=await e.reloadCart();return r&&e.notifyCartUpdated(e.getCart()),(n===`abandoned`||!r)&&$({type:`payment:ended`}),r}function m(){e.setView(`contact`)}async function h(r){let i;try{i=await e.getApi().getCartStatus()}catch(e){return r?.aborted?`settled`:ki(e)?(z(n,`pending`),`settled`):`waiting`}return r?.aborted?`settled`:i.cartStatus===`confirmed`?(g(i.confirmResult??{items:[]}),`settled`):i.cartStatus===`expired`?(z(n,`notCharged`),Hi(),z(t,null),`settled`):`waiting`}function g(t){let r=t.items.length>0&&t.items.every(e=>e.statusCode>=200&&e.statusCode<300);z(n,r?`success`:`partial`,!0),r&&e.onOrderConfirmed()}async function _(){z(i,!0),z(n,null);let e=Date.now()+Uo,t=new AbortController;for(r?.abort(),r=t;!t.signal.aborted&&await h(t.signal)!==`settled`;){if(Date.now()+Ho>e){z(n,`pending`);break}await v(Ho,t.signal)}t.signal.aborted||(z(i,!1),r=null)}function v(e,t){return new Promise(n=>{let r=setTimeout(n,e);t.addEventListener(`abort`,()=>{clearTimeout(r),n()},{once:!0})})}async function y(){z(i,!0),await h()===`waiting`&&z(n,`pending`),z(i,!1)}let b=I(()=>K(i)?null:K(n)===`success`?{outcome:`successful`}:K(n)===`pending`?{outcome:`pending`}:K(n)===`partial`?{outcome:`partial`}:K(n)===`notCharged`?{outcome:`failed`,resultDescription:`Your payment could not be completed. Please try again.`,retryPayment:!0}:null);return{get paymentResult(){return K(t)},get isPaying(){return K(a)},get payError(){return K(o)},get isConfirming(){return K(i)},get resultStatus(){return K(b)},payNow:d,onPaymentComplete:f,onPaymentTimedOut:s,resumeInterruptedPayment:c,retry:m,checkStatusAgain:y,dispose:()=>r?.abort()}}function Go(e){return e.items.reduce((e,t)=>e+t.amount,0)}function Ko(e){return e.items[0]?.currencyCode??`ZAR`}function qo(e,t){return t.get(e.productId)?.title??e.productId}function Jo(e,t){return t.get(e.productId)?.options.find(t=>t.id===e.optionId)?.title??e.optionId}function Yo(e,t){let n=t.get(e.productId)?.options.find(t=>t.id===e.optionId),r=new Map;for(let t of e.unitItems)r.set(t.unitId,(r.get(t.unitId)??0)+1);return[...r.entries()].map(([e,t])=>{let r=n?.units.find(t=>t.id===e),i=r?.pricing?.[0]?.retail??0;return{unitId:e,title:r?.title??e,quantity:t,linePrice:i*t}})}function Xo(e){if(!e.availabilityId)return null;let t=e.availabilityId.match(/(\d{4})-(\d{2})-(\d{2})/);if(!t)return null;let n=new Date(+t[1],t[2]-1,+t[3]);return`${n.getDate()} ${[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`][n.getMonth()]} ${n.getFullYear()}`}var Zo=J(`<div class="form svelte-12xyhj1"><div class="field svelte-12xyhj1"><label for="firstName" class="svelte-12xyhj1">First name *</label> <input id="firstName"/></div> <div class="field svelte-12xyhj1"><label for="lastName" class="svelte-12xyhj1">Last name</label> <input id="lastName" class="input"/></div> <div class="field svelte-12xyhj1"><label for="email" class="svelte-12xyhj1">Email address *</label> <input id="email" type="email"/></div> <div class="field svelte-12xyhj1"><label for="phone" class="svelte-12xyhj1">Phone number *</label> <input id="phone" type="tel"/></div></div>`);function Qo(e,t){N(t,!0);let n=Q(t,`firstName`,15,``),r=Q(t,`lastName`,15,``),i=Q(t,`emailAddress`,15,``),a=Q(t,`phoneNumber`,15,``);function o(){return n().trim()!==``&&i().trim()!==``&&a().trim()!==``}function s(){return{firstName:n().trim(),lastName:r().trim(),emailAddress:i().trim(),phoneNumber:a().trim()}}function c(e){return t.hasAttemptedSubmit&&e.trim()===``}var l={isValid:o,getContact:s},u=Zo(),d=B(u),f=H(B(d),2);Zr(f);let p;M(d);var m=H(d,2),h=H(B(m),2);Zr(h),M(m);var g=H(m,2),_=H(B(g),2);Zr(_);let v;M(g);var y=H(g,2),b=H(B(y),2);Zr(b);let x;return M(y),M(u),U((e,t,n)=>{p=qr(f,1,`input`,null,p,e),v=qr(_,1,`input`,null,v,t),x=qr(b,1,`input`,null,x,n)},[()=>({"input-error":c(n())}),()=>({"input-error":c(i())}),()=>({"input-error":c(a())})]),ri(f,n),ri(h,r),ri(_,i),ri(b,a),Y(e,u),P(l)}var $o=J(`<div class="consent svelte-19pmjwi"><label><input type="checkbox" class="svelte-19pmjwi"/> <span class="svelte-19pmjwi">I accept the privacy policy *</span></label> <label class="check svelte-19pmjwi"><input type="checkbox" class="svelte-19pmjwi"/> <span>I would like to receive marketing communications</span></label></div>`);function es(e,t){N(t,!0);var n=$o(),r=B(n);let i;var a=B(r);Zr(a),je(2),M(r);var o=H(r,2),s=B(o);Zr(s),je(2),M(o),M(n),U(()=>{i=qr(r,1,`check svelte-19pmjwi`,null,i,{error:t.hasAttemptedSubmit&&!t.privacyAccepted}),Qr(a,t.privacyAccepted),Qr(s,t.marketingOptIn)}),q(`change`,a,e=>t.onPrivacyChanged(e.target.checked)),q(`change`,s,e=>t.onMarketingChanged(e.target.checked)),Y(e,n),P()}vr([`change`]);var ts=J(`<span class="timer svelte-1u82ue3"> </span>`);function ns(e,t){N(t,!0);let n=R(``);function r(){z(n,Ji(t.expiresAt.getTime()-Date.now()),!0)}r();let i=setInterval(r,1e3);li(()=>clearInterval(i));var a=ts(),o=B(a,!0);M(a),U(()=>X(o,K(n))),Y(e,a),P()}var rs=J(`<span class="spacer"></span> <!>`,1),is=J(`<div class="error-state svelte-1ubcp68"><div class="error-icon svelte-1ubcp68">!</div> <p class="error-title svelte-1ubcp68">Unable to load payment form</p> <p class="error-msg svelte-1ubcp68"> </p> <button class="btn btn-primary svelte-1ubcp68">Start over</button></div>`),as=J(`<div id="peach-container" class="svelte-1ubcp68"></div>`),os=J(`<div class="payment-overlay svelte-1ubcp68"><div class="payment-dialog svelte-1ubcp68"><div class="page-header"><h2>Payment</h2> <!></div> <div class="body svelte-1ubcp68"><!></div></div></div>`);function ss(e,t){N(t,!0);function n(e,t){let n=t?.result??t;return{status:e,resultCode:n?.code??n?.resultCode??t?.errorCode??void 0,description:n?.description??t?.message??void 0}}let r=R(!1),i=R(``),a=null;ci(()=>{(async()=>{try{await ba();let e=window.Checkout;if(!e){z(r,!0),z(i,`Payment SDK not loaded`);return}a=e.initiate({checkoutId:t.checkoutId,key:t.entityId,customisations:{card:{submitButtonText:`Pay Now`},theme:{brand:{primary:`#E30613`}}},eventHandlers:{onCompleted:e=>{s(),t.onPaymentComplete(n(`completed`,e))},onCancelled:e=>{s(),t.onPaymentComplete(n(`cancelled`,e))},onExpired:e=>{s(),t.onPaymentComplete(n(`expired`,e))},onError:e=>{o(`Peach reported an error rendering the card form`),s(),t.onPaymentComplete(n(`error`,e))}}}),a.render(`#peach-container`)}catch(e){o(String(e)),z(r,!0),z(i,String(e),!0)}})()});function o(e){console.error(`[booking-widget] Peach checkout did not render: ${e}. SDK loaded from ${va()??`an already-present window.Checkout`} for checkoutId ${t.checkoutId}. If that environment does not match the checkout API this cart came from, set peachEnv on createBookingHost (or window.BW_CHECKOUT_PEACH_SDK_URL).`)}function s(){a&&=(a.unmount(),null)}li(s);var c=os(),l=B(c),u=B(l),d=H(B(u),2),f=e=>{var n=rs();ns(H(V(n),2),{get expiresAt(){return t.expiresAt}}),Y(e,n)};Z(d,e=>{t.expiresAt&&e(f)}),M(u);var p=H(u,2),m=B(p),h=e=>{var n=is(),r=H(B(n),4),a=B(r,!0);M(r);var o=H(r,2);M(n),U(()=>X(a,K(i)||`The checkout session may have expired.`)),q(`click`,o,()=>t.onPaymentComplete({status:`error`})),Y(e,n)},g=e=>{Y(e,as())};Z(m,e=>{K(r)?e(h):e(g,-1)}),M(p),M(l),M(c),q(`click`,l,e=>e.stopPropagation()),Y(e,c),P()}vr([`click`]);var cs=J(`<div class="spinner"></div> <p class="hint svelte-16gfovn">Verifying payment...</p>`,1),ls=J(`<button class="btn btn-primary">Check Again</button>`),us=J(`<div class="icon pending svelte-16gfovn">…</div> <h2 class="svelte-16gfovn">Still Checking Your Payment</h2> <p class="desc svelte-16gfovn"> </p> <div class="actions svelte-16gfovn"><!> <button class="btn btn-outline">Close</button></div>`,1),ds=J(`<div class="icon partial svelte-16gfovn">!</div> <h2 class="svelte-16gfovn">Booking Incomplete</h2> <p class="desc svelte-16gfovn"> </p> <button class="btn btn-outline">Close</button>`,1),fs=J(`<button class="btn btn-primary">Done</button>`),ps=J(`<button class="btn btn-outline">Try Again</button>`),ms=J(`<button class="btn btn-outline">Close</button>`),hs=J(`<div> </div> <h2 class="svelte-16gfovn"> </h2> <p class="desc svelte-16gfovn"> </p> <!>`,1),gs=J(`<div class="result svelte-16gfovn"><!></div>`);function _s(e,t){N(t,!0);let n=I(()=>t.status?.outcome===`successful`),r=I(()=>t.status?.outcome===`pending`),i=I(()=>t.status?.outcome===`partial`),a=I(()=>t.status?.outcome===`failed`&&t.status.retryPayment!==!1);var o=gs(),s=B(o),c=e=>{var t=cs();je(2),Y(e,t)},l=e=>{var n=us(),r=H(V(n),4),i=B(r,!0);M(r);var a=H(r,2),o=B(a),s=e=>{var n=ls();q(`click`,n,function(...e){t.onCheckAgain?.apply(this,e)}),Y(e,n)};Z(o,e=>{t.onCheckAgain&&e(s)});var c=H(o,2);M(a),U(()=>X(i,t.status?.resultDescription??`We couldn't confirm this payment yet. Please don't try to pay again for now - we'll email you as soon as we know where it stands.`)),q(`click`,c,function(...e){t.onDone?.apply(this,e)}),Y(e,n)},u=e=>{var n=ds(),r=H(V(n),4),i=B(r,!0);M(r);var a=H(r,2);U(()=>X(i,t.status?.resultDescription??`Your payment succeeded, but we couldn't confirm every item in your booking. Please contact us with your order details.`)),q(`click`,a,function(...e){t.onDone?.apply(this,e)}),Y(e,n)},d=e=>{var r=hs(),i=V(r);let o;var s=B(i,!0);M(i);var c=H(i,2),l=B(c,!0);M(c);var u=H(c,2),d=B(u,!0);M(u);var f=H(u,2),p=e=>{var n=fs();q(`click`,n,function(...e){t.onDone?.apply(this,e)}),Y(e,n)},m=e=>{var n=ps();q(`click`,n,function(...e){t.onRetry?.apply(this,e)}),Y(e,n)},h=e=>{var n=ms();q(`click`,n,function(...e){t.onDone?.apply(this,e)}),Y(e,n)};Z(f,e=>{K(n)?e(p):K(a)?e(m,1):e(h,-1)}),U(()=>{o=qr(i,1,`icon svelte-16gfovn`,null,o,{success:K(n),failure:!K(n)}),X(s,K(n)?`✓`:`!`),X(l,K(n)?`Payment Successful`:`Payment Failed`),X(d,K(n)?`Your booking has been confirmed.`:t.status?.resultDescription??`Something went wrong. Please try again.`)}),Y(e,r)};Z(s,e=>{t.verifying?e(c):K(r)?e(l,1):K(i)?e(u,2):e(d,-1)}),M(o),Y(e,o),P()}vr([`click`]);var vs=J(`<p class="edit-error svelte-15l4305"> </p>`),ys=J(`<div class="saving-overlay svelte-15l4305"><div class="spinner"></div></div>`),bs=J(`<div class="edit-view svelte-15l4305"><div class="page-header"><button class="icon-btn" aria-label="Back">←</button> <h2>Edit Item</h2> <span class="spacer"></span> <button class="icon-btn" aria-label="Close">×</button></div> <!> <div><!> <!></div></div>`);function xs(e,t){N(t,!0);let n=Q(t,`autoSelectSingleTimeSlot`,3,!1),r=R(!1),i=R(null);async function a(e){z(r,!0),z(i,null);try{await t.api.updateCartItem(t.cartItem.id,{productId:e.productId,optionId:e.optionId,unitItems:Ei(e.units),availabilityId:e.availabilityId,localDate:e.localDate,pickupPointId:e.pickupPointId,amount:e.totalPrice}),t.onUpdated()}catch(e){if(Oi(e)){z(i,`This item's price has changed. Please check the updated price and save again.`),await t.onPriceChanged?.();return}z(i,e instanceof Di&&e.status===424?`This change could not be saved - the supplier rejected it. Please try different options.`:`Something went wrong saving your changes. Please try again.`,!0)}finally{z(r,!1)}}var o=bs(),s=B(o),c=B(s),l=H(c,6);M(s);var u=H(s,2),d=e=>{var t=vs(),n=B(t,!0);M(t),U(()=>X(n,K(i))),Y(e,t)};Z(u,e=>{K(i)&&e(d)});var f=H(u,2);let p;var m=B(f);{let e=I(()=>t.wizardPages??Ma),r=I(()=>t.editPages??t.wizardPages??Ma);Fo(m,{get product(){return t.product},get api(){return t.api},get wizardPages(){return K(e)},get editPages(){return K(r)},get editItem(){return t.cartItem},get autoSelectSingleTimeSlot(){return n()},onComplete:a,get onCancel(){return t.onBack}})}var h=H(m,2),g=e=>{Y(e,ys())};Z(h,e=>{K(r)&&e(g)}),M(f),M(o),U(()=>p=qr(f,1,`edit-body svelte-15l4305`,null,p,{saving:K(r)})),q(`click`,c,function(...e){t.onBack?.apply(this,e)}),q(`click`,l,function(...e){t.onClose?.apply(this,e)}),Y(e,o),P()}vr([`click`]);var Ss=J(`<div class="loading-center" style="height:100%"><div class="spinner"></div></div>`),Cs=J(`<p class="pay-error svelte-i0rtg0"> </p>`),ws=J(`<div class="page-header"><button class="icon-btn" aria-label="Back">←</button> <h2>Checkout</h2> <span class="spacer"></span> <!> <button class="icon-btn" aria-label="Close">×</button></div> <div class="body svelte-i0rtg0"><!> <div class="contact-header svelte-i0rtg0"><span class="contact-title svelte-i0rtg0">Contact Details</span> <span class="required-hint svelte-i0rtg0">* Required Fields</span></div> <!> <div style="margin-top:24px"><!></div></div> <div class="pay-bar svelte-i0rtg0"><span class="pay-bar-total svelte-i0rtg0"> </span> <button class="pay-bar-btn svelte-i0rtg0"> </button></div>`,1),Ts=J(`<p class="cart-detail svelte-i0rtg0"> </p>`),Es=J(`<div class="cart-unit-line svelte-i0rtg0"><span class="cart-unit-label svelte-i0rtg0"> </span> <span class="cart-unit-price svelte-i0rtg0"> </span></div>`),Ds=J(`<div class="cart-card svelte-i0rtg0"><div class="cart-card-top svelte-i0rtg0"><h3 class="cart-product svelte-i0rtg0"> </h3> <span class="cart-item-total svelte-i0rtg0"> </span></div> <div class="cart-detail-lines svelte-i0rtg0"><!> <p class="cart-detail svelte-i0rtg0"> </p></div> <div class="cart-divider svelte-i0rtg0"></div> <div class="cart-units svelte-i0rtg0"></div> <div class="cart-actions svelte-i0rtg0"><button class="action-edit svelte-i0rtg0">Edit</button> <button class="action-remove svelte-i0rtg0">Remove</button></div></div>`),Os=J(`<div class="page-header"><h2>Your cart</h2> <span class="spacer"></span> <!> <button class="keep-shopping-btn svelte-i0rtg0">+ Keep shopping</button></div> <div class="body svelte-i0rtg0"><!> <div class="cart-total-divider svelte-i0rtg0"></div> <div class="cart-total-row svelte-i0rtg0"><span>Total payable today</span> <span class="cart-total-amount svelte-i0rtg0"> </span></div></div> <div class="action-bar"><button class="btn btn-primary">Checkout</button></div>`,1),ks=J(`<div class="modal svelte-i0rtg0"><!></div>`);function As(e,t){N(t,!0);let n=Q(t,`cart`,7),r=Q(t,`autoSelectSingleTimeSlot`,3,!1);gn(()=>qi(e=>{e.type===`cart:updated`&&`cart`in e&&e.cart===null&&b(),e.type===`payment:timed-out`&&h.onPaymentTimedOut()}));let i=R(`cart`),a=R(null),o=R(!0),s=R(!1),c=R(!1),l=R(!1),u=R(``),d=R(``),f=R(``),p=R(``),m=R(null),h=Wo({getApi:()=>t.api,getCart:()=>n(),reloadCart:T,notifyCartUpdated:E,refreshDeadlineAfterPay:()=>void ee(),setView:e=>{z(i,e,!0)},close:b,onOrderConfirmed:()=>t.onOrderConfirmed()}),g=R(Zt(new Map));async function _(){try{let e=[...new Set(n().items.map(e=>e.productId))],r=await Promise.all(e.map(e=>t.api.getProduct(e))),i=new Map;for(let e of r)i.set(e.id,e);z(g,i,!0)}catch{}finally{z(o,!1)}}_(),h.resumeInterruptedPayment();let v=I(()=>()=>Ra(Go(n()),Ko(n()),2,2)),y=I(()=>Yi(n()));li(()=>{h.dispose(),$({type:`modal:close`})});function b(){$({type:`modal:close`}),t.onClose()}function x(){b()}function S(e){z(a,e,!0),z(i,`edit`)}async function C(){await T()&&(z(i,`cart`),E(n()))}async function w(e){try{await t.api.removeCartItem(e.id)}catch(e){if(!ki(e))throw e;b();return}await T()&&(E(n()),n().items.length===0&&b())}async function T(){try{return n(await t.api.getCart()),!0}catch(e){if(!ki(e))throw e;return b(),!1}}async function ee(){try{n(await t.api.getCart()),E(n())}catch{}}function E(e){$({type:`cart:updated`,cart:e})}async function te(){z(l,!0),!(!K(m)?.isValid()||!K(s))&&await h.payNow(K(m).getContact())}var D=ks(),ne=B(D),re=e=>{Y(e,Ss())},ie=e=>{var t=Er(),n=V(t),r=e=>{ss(e,{get checkoutId(){return h.paymentResult.checkoutId},get entityId(){return h.paymentResult.entityId},get expiresAt(){return K(y)},get onPaymentComplete(){return h.onPaymentComplete}})},i=e=>{Y(e,Ss())};Z(n,e=>{h.paymentResult?e(r):e(i,-1)}),Y(e,t)},ae=e=>{{let t=I(()=>h.resultStatus?.outcome===`pending`?h.checkStatusAgain:void 0);_s(e,{get status(){return h.resultStatus},get verifying(){return h.isConfirming},onDone:()=>{$({type:`modal:close`})},get onRetry(){return h.retry},get onCheckAgain(){return K(t)}})}},O=e=>{{let n=I(()=>K(g).get(K(a).productId));xs(e,{get cartItem(){return K(a)},get product(){return K(n)},get api(){return t.api},get wizardPages(){return t.wizardPages},get editPages(){return t.editPages},get autoSelectSingleTimeSlot(){return r()},onBack:()=>{z(i,`cart`)},onClose:b,onUpdated:C,onPriceChanged:_})}},oe=I(()=>K(i)===`edit`&&K(a)&&K(g).get(K(a).productId)),se=e=>{var t=ws(),n=V(t),r=B(n),a=H(r,6);ns(a,{get expiresAt(){return K(y)}});var o=H(a,2);M(n);var g=H(n,2),_=B(g),x=e=>{var t=Cs(),n=B(t,!0);M(t),U(()=>X(n,h.payError)),Y(e,t)};Z(_,e=>{h.payError&&e(x)});var S=H(_,4);si(Qo(S,{get hasAttemptedSubmit(){return K(l)},get firstName(){return K(u)},set firstName(e){z(u,e,!0)},get lastName(){return K(d)},set lastName(e){z(d,e,!0)},get emailAddress(){return K(f)},set emailAddress(e){z(f,e,!0)},get phoneNumber(){return K(p)},set phoneNumber(e){z(p,e,!0)}}),e=>z(m,e,!0),()=>K(m));var C=H(S,2);es(B(C),{get privacyAccepted(){return K(s)},get marketingOptIn(){return K(c)},get hasAttemptedSubmit(){return K(l)},onPrivacyChanged:e=>{z(s,e,!0)},onMarketingChanged:e=>{z(c,e,!0)}}),M(C),M(g);var w=H(g,2),T=B(w),ee=B(T,!0);M(T);var E=H(T,2),D=B(E,!0);M(E),M(w),U(e=>{X(ee,e),E.disabled=h.isPaying,X(D,h.isPaying?`Paying…`:`Pay Now`)},[()=>K(v)()]),q(`click`,r,()=>{z(i,`cart`)}),q(`click`,o,b),q(`click`,E,te),Y(e,t)},ce=e=>{var t=Os(),r=V(t),a=H(B(r),4);ns(a,{get expiresAt(){return K(y)}});var o=H(a,2);M(r);var s=H(r,2),c=B(s);Lr(c,17,()=>n().items,Nr,(e,t)=>{var n=Ds(),r=B(n),i=B(r),a=B(i,!0);M(i);var o=H(i,2),s=B(o,!0);M(o),M(r);var c=H(r,2),l=B(c),u=e=>{var n=Ts(),r=B(n,!0);M(n),U(e=>X(r,e),[()=>Xo(K(t))]),Y(e,n)},d=I(()=>Xo(K(t)));Z(l,e=>{K(d)&&e(u)});var f=H(l,2),p=B(f,!0);M(f),M(c);var m=H(c,4);Lr(m,21,()=>Yo(K(t),K(g)),Nr,(e,n)=>{var r=Es(),i=B(r),a=B(i);M(i);var o=H(i,2),s=B(o,!0);M(o),M(r),U(e=>{X(a,`${K(n).title??``} × ${K(n).quantity??``}`),X(s,e)},[()=>Ra(K(n).linePrice,K(t).currencyCode,2,0)]),Y(e,r)}),M(m);var h=H(m,2),_=B(h),v=H(_,2);M(h),M(n),U((e,t,n)=>{X(a,e),X(s,t),X(p,n)},[()=>qo(K(t),K(g)),()=>Ra(K(t).amount,K(t).currencyCode,2,0),()=>Jo(K(t),K(g))]),q(`click`,_,()=>S(K(t))),q(`click`,v,()=>w(K(t))),Y(e,n)});var l=H(c,4),u=H(B(l),2),d=B(u,!0);M(u),M(l),M(s);var f=H(s,2),p=B(f);M(f),U(e=>X(d,e),[()=>K(v)()]),q(`click`,o,x),q(`click`,p,()=>{z(i,`contact`)}),Y(e,t)};Z(ne,e=>{K(o)?e(re):K(i)===`payment`?e(ie,1):K(i)===`result`?e(ae,2):K(oe)?e(O,3):K(i)===`contact`?e(se,4):e(ce,-1)}),M(D),Y(e,D),P()}vr([`click`]);var js=J(`<div class="loading-center" style="height:100vh"><div class="spinner"></div></div>`),Ms=J(`<div style="height:100vh"><!></div>`),Ns=J(`<div class="loading-center" style="height:100vh;color:var(--bw-color-text-secondary)">No items in cart.</div>`),Ps=J(`<div class="bw-widget svelte-16hmqxh"><!></div>`);function Fs(e,t){N(t,!0);let n=Q(t,`wizardPages`,3,Ma),r=Q(t,`autoSelectSingleTimeSlot`,3,!1),i=I(()=>t.editPages??n()),a=R(null),o=R(!0),s=R(!1);async function c(){let e=t.api.cartToken!==``;try{z(a,await t.api.getCart(),!0)}catch(t){z(a,null),e&&ki(t)&&(l(),z(s,!0))}z(o,!1)}c();function l(){t.cartManager?.reset(),$({type:`cart:updated`,cart:null}),$({type:`cart:expired`})}function u(){z(s,!1),$({type:`modal:close`}),c()}gn(()=>qi(e=>{e.type===`cart:updated`&&`cart`in e&&z(a,e.cart,!0)}));var d=Ps(),f=B(d),p=e=>{Y(e,js())},m=e=>{As(e,{get cart(){return K(a)},get api(){return t.api},get wizardPages(){return n()},get editPages(){return K(i)},get autoSelectSingleTimeSlot(){return r()},onClose:()=>$({type:`modal:close`}),onOrderConfirmed:()=>{let e=K(a).items.reduce((e,t)=>e+t.amount,0),n=K(a).items[0]?.currencyCode??`ZAR`;$({type:`order:complete`,cartToken:K(a).cartToken??``,value:e,currency:n}),t.cartManager?.reset()}})},h=e=>{var t=Ms();aa(B(t),{onStartAgain:u}),M(t),Y(e,t)},g=e=>{Y(e,Ns())};Z(f,e=>{K(o)?e(p):K(a)&&K(a).items.length>0?e(m,1):K(s)?e(h,2):e(g,-1)}),M(d),Y(e,d),P()}var Is=J(`<div class="bw-modal-overlay svelte-5e515v"><div class="bw-modal-inner svelte-5e515v"><!></div></div>`);function Ls(e,t){N(t,!0);let n=Q(t,`wizardPages`,3,Ma),r=Q(t,`autoSelectSingleTimeSlot`,3,!1),i=Q(t,`mode`,3,`inline`),a=ca(),o=I(()=>la(t.api??a?.api,`Checkout`,`api`)),s=I(()=>t.cartManager??a?.cartManager),c=I(()=>t.open??a?.isCheckoutOpen??!0),l=I(()=>t.onClose??(a?()=>a.closeCheckout():void 0)),u=I(()=>i()===`modal`),d=R(!1),f=I(()=>!K(u)||K(c)&&!K(d)),p=!1,m=!1;gn(()=>{let e=K(c);e&&!m&&(z(d,!1),p=!1),m=e});function h(){$({type:`modal:close`})}gn(()=>qi(e=>{e.type!==`modal:close`||!K(u)||p||K(f)&&(p=!0,z(d,!0),K(l)?.())}));function g(e){K(f)&&K(u)&&e.key===`Escape`&&h()}var _=Er();_r(`keydown`,Qt,g);var v=V(_),y=e=>{var i=Er(),a=V(i),c=e=>{var i=Is(),a=B(i);Fs(B(a),{get api(){return K(o)},get cartManager(){return K(s)},get wizardPages(){return n()},get editPages(){return t.editPages},get autoSelectSingleTimeSlot(){return r()}}),M(a),M(i),Wr(i,e=>Vo?.(e)),q(`click`,i,h),q(`click`,a,e=>e.stopPropagation()),Y(e,i)};Z(a,e=>{K(f)&&e(c)}),Y(e,i)},b=e=>{Fs(e,{get api(){return K(o)},get cartManager(){return K(s)},get wizardPages(){return n()},get editPages(){return t.editPages},get autoSelectSingleTimeSlot(){return r()}})};Z(v,e=>{K(u)?e(y):e(b,-1)}),Y(e,_),P()}vr([`click`]);function Rs(e,t,n){let r=R(null),i=R(!1),a=R(!0),o=0;async function s(){let n=++o;if(z(a,!0),z(i,!1),!t().hasCart){z(r,null),z(a,!1);return}try{let t=await e().getCart();if(n!==o)return;z(r,t,!0)}catch{if(n!==o)return;z(r,null),z(i,!0)}z(a,!1)}s(),gn(()=>qi(e=>{e.type===`cart:updated`&&(o+=1,z(r,e.cart,!0),z(i,!1),z(a,!1))}));let c=I(()=>K(a)?`loading`:K(i)?`error`:(K(r)?.items?.length??0)>0?`ready`:`empty`);return gn(()=>{n?.(K(c))}),{get cart(){return K(r)},get state(){return K(c)},reload:()=>void s()}}var zs=J(`<div class="cart-bar bw-widget svelte-1xt0fxx" role="alert"><div class="cart-info svelte-1xt0fxx"><span class="item-count svelte-1xt0fxx">Cart unavailable</span> <span class="error-detail svelte-1xt0fxx">We could not load your cart just now.</span></div> <button class="btn btn-primary">Retry</button></div>`),Bs=J(`<div class="cart-bar bw-widget svelte-1xt0fxx"><div class="cart-info svelte-1xt0fxx"><span class="item-count svelte-1xt0fxx"> <!></span> <span class="total svelte-1xt0fxx"> </span></div> <button class="btn btn-primary">Checkout</button></div>`);function Vs(e,t){N(t,!0);let n=Q(t,`state`,3,`ready`),r=I(()=>t.cart?.items.length??0),i=I(()=>()=>{if(!t.cart||t.cart.items.length===0)return``;let e=t.cart.items[0].currencyCode;return Ra(t.cart.items.reduce((e,t)=>e+t.amount,0),e,2,2)}),a=I(()=>()=>t.cart?Yi(t.cart):new Date);var o=Er(),s=V(o),c=e=>{var n=zs(),r=H(B(n),2);M(n),q(`click`,r,()=>t.onRetry?.()),Y(e,n)},l=e=>{var t=Bs(),n=B(t),o=B(n),s=B(o),c=H(s);{let e=I(()=>K(a)());ns(c,{get expiresAt(){return K(e)}})}M(o);var l=H(o,2),u=B(l,!0);M(l),M(n);var d=H(n,2);M(t),U(e=>{X(s,`${K(r)===1?`1 item`:`${K(r)} items`} `),X(u,e)},[()=>K(i)()]),q(`click`,d,()=>$({type:`modal:open`})),Y(e,t)};Z(s,e=>{n()===`error`?e(c):t.cart&&t.cart.items.length>0&&e(l,1)}),Y(e,o),P()}vr([`click`]);function Hs(e,t){N(t,!0);let n=ca(),r=Rs(()=>la(t.api??n?.api,`CartBar`,`api`),()=>la(t.cartManager??n?.cartManager,`CartBar`,`cartManager`),e=>t.onStateChange?.(e));Vs(e,{get cart(){return r.cart},get state(){return r.state},get onRetry(){return r.reload}}),P()}var Us=J(`<button class="cart-overview-btn is-error bw-widget svelte-16bjfem"><span class="cart-error-label svelte-16bjfem">Cart unavailable - retry</span></button>`),Ws=J(`<button class="cart-overview-btn bw-widget svelte-16bjfem"><svg class="cart-icon svelte-16bjfem" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="9" cy="21" r="1"></circle><circle cx="20" cy="21" r="1"></circle><path d="M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6"></path></svg> <span class="cart-badge svelte-16bjfem"> </span> <span class="cart-timer svelte-16bjfem"> </span></button>`);function Gs(e,t){N(t,!0);let n=ca(),r=Rs(()=>la(t.api??n?.api,`CartOverviewButton`,`api`),()=>la(t.cartManager??n?.cartManager,`CartOverviewButton`,`cartManager`),e=>t.onStateChange?.(e)),i=I(()=>r.cart),a=R(``);function o(){z(a,K(i)?Ji(Yi(K(i)).getTime()-Date.now()):Ji(0),!0)}o();let s=setInterval(o,1e3);li(()=>clearInterval(s));let c=I(()=>K(i)?.items.length??0);var l=Er(),u=V(l),d=e=>{var t=Us();q(`click`,t,()=>r.reload()),Y(e,t)},f=e=>{var t=Ws(),n=H(B(t),2),r=B(n,!0);M(n);var i=H(n,2),o=B(i,!0);M(i),M(t),U(()=>{X(r,K(c)),X(o,K(a))}),q(`click`,t,()=>$({type:`modal:open`})),Y(e,t)};Z(u,e=>{r.state===`error`?e(d):K(i)&&K(i).items.length>0&&e(f,1)}),Y(e,l),P()}vr([`click`]);function Ks(e,t){N(t,!0);let n=ca(),r=I(()=>la(t.api??n?.api,`CartOverview`,`api`)),i=I(()=>la(t.cartManager??n?.cartManager,`CartOverview`,`cartManager`));var a=Er(),o=V(a),s=e=>{Gs(e,{get api(){return K(r)},get cartManager(){return K(i)},get onStateChange(){return t.onStateChange}})},c=e=>{Hs(e,{get api(){return K(r)},get cartManager(){return K(i)},get onStateChange(){return t.onStateChange}})};Z(o,e=>{t.display===`button`?e(s):e(c,-1)}),Y(e,a),P()}function qs(e,t){N(t,!0),sa(t.host);var n=Er();Ur(V(n),()=>t.children),Y(e,n),P()}async function Js(e){try{await e.host.ready}catch(t){throw e.release(),t}}function Ys(e){if(!e.host){let t=wa(e);return{host:t,release:()=>t.destroy()}}return{host:e.host,release:Xs(e)}}function Xs(e){let{onCartChange:t,onCartUpdated:n,onCartExpired:r,onOrderConfirmed:i}=e;return!t&&!n&&!r&&!i?()=>{}:qi(e=>{e.type===`cart:change`&&t?.({itemCount:e.itemCount,cartItemId:e.cartItemId,totalFormatted:e.totalFormatted}),e.type===`cart:updated`&&n?.(e.cart),e.type===`cart:expired`&&r?.(),e.type===`order:complete`&&i?.({cartToken:e.cartToken,value:e.value,currency:e.currency})})}async function Zs(e,t){let n=Ys(t),{host:r,release:i}=n;await Js(n);let a=Dr(Bo,{target:e,props:{api:r.api,cartManager:r.cartManager,productId:t.productId,wizardPages:t.wizardPages??r.options.wizardPages,autoSelectSingleTimeSlot:t.autoSelectSingleTimeSlot??r.options.autoSelectSingleTimeSlot,autoOpenCheckout:t.autoOpenCheckout!==!1,onCancel:t.onCancel}});return{destroy(){jr(a),i()}}}async function Qs(e,t){let n=Ys(t),{host:r,release:i}=n;await Js(n);let a=Dr(Ls,{target:e,props:{api:r.api,cartManager:r.cartManager,wizardPages:t.wizardPages??r.options.wizardPages,editPages:t.editPages??r.options.editPages,autoSelectSingleTimeSlot:t.autoSelectSingleTimeSlot??r.options.autoSelectSingleTimeSlot,mode:t.mode??`inline`,get open(){return r.isCheckoutOpen},onClose:t.onClose}});return{destroy(){jr(a),i()}}}async function $s(e,t){let n=Ys(t),{host:r,release:i}=n;await Js(n);let a=Dr(Ks,{target:e,props:{api:r.api,cartManager:r.cartManager,display:t.display??`bar`,onStateChange:t.onStateChange}}),o=t.onCheckout?ec(t.onCheckout):()=>{};return{destroy(){o(),jr(a),i()}}}function ec(e){return qi(t=>{t.type===`modal:open`&&e()})}e.ApiClient=Pi,e.ApiError=Di,e.BookingProvider=qs,e.CartBar=Hs,e.CartExpiryGuard=pa,e.CartManager=Gi,e.CartOverview=Ks,e.CartOverviewButton=Gs,e.Checkout=Ls,e.DEFAULT_WIZARD_PAGES=Ma,e.SessionManager=Li,e.TicketConfigurator=Bo,e.createBookingHost=wa,e.getBookingDefaults=Ca,e.getBookingHostContext=ca,e.mountCartOverview=$s,e.mountCheckout=Qs,e.mountConfigurator=Zs,e.onWidgetMessage=qi,e.portal=Vo,e.postMessage=$,e.requestCheckoutClose=Aa,e.requestCheckoutOpen=ja,e.resolveEditPages=Ia,e.resolveWizardPages=Pa,e.setBookingDefaults=Sa,e.setPeachSdk=ya});
|
|
5
|
+
charged. Start again to choose your tickets.</p> <button class="btn btn-primary">Start again</button></div>`);function aa(e,t){N(t,!0);let n=R(null);gn(()=>{K(n)?.focus()});var r=ia(),i=H(B(r),6);si(i,e=>z(n,e),()=>K(n)),M(r),q(`click`,i,function(...e){t.onStartAgain?.apply(this,e)}),Y(e,r),P()}vr([`click`]);var oa=Symbol(`booking-host`);function sa(e){He(oa,e)}function ca(){return Ve(oa)}function la(e,t,n){if(e==null)throw Error(`<${t}> has no ${n}. Pass ${n}={...}, or wrap it in <BookingProvider host={createBookingHost(...)}>.`);return e}var ua=J(`<div class="guard-overlay bw-widget svelte-x4iaex"><!></div>`),da=J(`<div class="guard-overlay bw-widget svelte-x4iaex"><div class="guard-card svelte-x4iaex"><!></div></div>`),fa=J(`<!> <!>`,1);function pa(e,t){N(t,!0);let n=Q(t,`extensionEnabled`,3,!1),r=ca(),i=I(()=>la(t.api??r?.api,`CartExpiryGuard`,`api`)),a=I(()=>la(t.cartManager??r?.cartManager,`CartExpiryGuard`,`cartManager`)),o=R(null),s=R(``),c=R(!1),l=R(!1),u=R(!1),d=R(!1),f=R(null);async function p(){if(K(a).hasCart)try{z(o,await K(i).getCart(),!0)}catch(e){ki(e)&&K(a).reset()}}p(),gn(()=>qi(e=>{e.type===`cart:updated`&&z(o,`cart`in e?e.cart:null,!0),e.type===`order:complete`&&(z(o,null),z(d,!1)),e.type===`payment:started`&&z(d,!0),e.type===`payment:ended`&&(z(d,!1),w(),K(o)&&K(h)&&K(h).getTime()<=Date.now()&&re())}));let m=R(``);gn(()=>{let e=K(o)?.cartToken??``;e!==K(m)&&(z(m,e,!0),z(f,null),T(),z(d,Vi(e)!==null),e&&z(u,!1))});let h=I(()=>K(o)?Yi(K(o)):null),g=I(()=>n()&&!!K(o)&&!K(u)&&K(c)&&K(f)!==K(h)?.getTime()),_=I(()=>!!K(o)&&!Xi(K(o)));async function v(){z(l,!0);let e=K(h)?.getTime()??null;try{z(o,await K(i).extendCart(),!0),Yi(K(o)).getTime()===e&&z(f,e,!0),$({type:`cart:updated`,cart:K(o)})}catch(t){ki(t)?ae():ji(t)?te():Ai(t)&&z(f,e,!0)}finally{z(l,!1)}}function y(){K(h)&&z(f,K(h).getTime(),!0)}let b=null,x=null,S=!1;function C(){b!==null&&(clearTimeout(b),b=null)}function w(){x!==null&&(clearTimeout(x),x=null)}function T(){C(),w()}li(T);function ee(){if(!K(u)){if(K(d)){E();return}re()}}async function E(){if(!K(o)||K(u)||!K(d)||S||x!==null)return;S=!0,C();let e;try{z(o,await K(i).getCart(),!0),$({type:`cart:updated`,cart:K(o)}),e=Yi(K(o)).getTime()<=Date.now()?`past`:`live`}catch(t){e=ki(t)?`gone`:`unknown`}finally{S=!1}if(!K(u)){if(e===`gone`){Hi(),z(d,!1),ae();return}if(e!==`live`){if(!K(d)){re();return}e===`past`?te():ie()}}}function te(){$({type:`payment:timed-out`}),D()}function D(){w(),x=setTimeout(()=>{x=null,ne()},5e3)}async function ne(){if(!K(o)||K(u)||!K(d))return;let e=Vi(K(o).cartToken??``);if(e){try{await K(i).abandonPayment(e.checkoutId)}catch(e){if(Mi(e)||Ni(e)){$({type:`modal:open`});return}return}Hi(),z(d,!1),re()}}async function re(){if(!(!K(o)||K(u)||K(d)||S)){S=!0,C();try{z(o,await K(i).getCart(),!0),$({type:`cart:updated`,cart:K(o)}),Yi(K(o)).getTime()<=Date.now()&&ie()}catch(e){ki(e)?ae():ie()}finally{S=!1}}}function ie(){b=setTimeout(()=>{b=null,K(d)?E():re()},3e4)}function ae(){T(),z(u,!0),K(a).reset(),$({type:`cart:updated`,cart:null}),$({type:`cart:expired`})}function O(){z(u,!1),z(o,null),$({type:`modal:close`})}function oe(e){if(e.key===`Escape`&&K(g)){e.preventDefault(),y();return}if(e.key!==`Tab`)return;let t=K(se)?.querySelectorAll(`button:not([disabled]), [href], [tabindex]:not([tabindex="-1"])`);if(!t?.length)return;let n=t[0],r=t[t.length-1],i=e.shiftKey&&document.activeElement===n,a=!e.shiftKey&&document.activeElement===r;(i||a)&&(e.preventDefault(),(e.shiftKey?r:n).focus())}let se=R(null);var ce=fa();_r(`keydown`,Qt,function(...e){(K(g)||K(u)?oe:void 0)?.apply(this,e)});var le=V(ce),ue=e=>{$i(e,{get expiresAt(){return K(h)},onExpired:ee,get remaining(){return K(s)},set remaining(e){z(s,e,!0)},get warning(){return K(c)},set warning(e){z(c,e,!0)}})};Z(le,e=>{K(o)&&K(h)&&e(ue)});var de=H(le,2),fe=e=>{var t=ua();ra(B(t),{get remaining(){return K(s)},get canExtend(){return K(_)},get extending(){return K(l)},onExtend:v,onDismiss:y}),M(t),si(t,e=>z(se,e),()=>K(se)),Y(e,t)},pe=e=>{var t=da(),n=B(t);aa(B(n),{onStartAgain:O}),M(n),M(t),si(t,e=>z(se,e),()=>K(se)),Y(e,t)};Z(de,e=>{K(g)?e(fe):K(u)&&e(pe,1)}),Y(e,ce),P()}var ma={prod:`https://checkout.peachpayments.com/js/checkout.js`,qa:`https://sandbox-checkout.peachpayments.com/js/checkout.js`},ha=null,ga=null,_a=null;function va(){return _a}function ya(e){let t=e.url??(e.env?ma[e.env]:void 0);!t||t===ga||(ga=t,ha=null)}function ba(){let e=window,t=e.BW_CHECKOUT_ENV??`prod`,n=e.BW_CHECKOUT_PEACH_SDK_URL??ga??ma[t]??ma.prod;return e.Checkout?(_a!==null&&_a!==n?console.warn(`[booking-widget] Peach SDK already loaded from ${_a}, so ${n} was not used. Configure peachEnv before the first payment, or set window.BW_CHECKOUT_PEACH_SDK_URL.`):_a===null&&console.warn(`[booking-widget] Peach SDK was already on the page when the widget first needed it, so ${n} was not used. If its environment does not match the checkout API, the card form will not render.`),Promise.resolve()):ha||(_a=n,ha=new Promise((e,t)=>{let r=document.querySelector(`script[src="${n}"]`);if(r){r.addEventListener(`load`,()=>e()),r.addEventListener(`error`,()=>t(Error(`Failed to load the Peach Payments SDK script`)));return}let i=document.createElement(`script`);i.src=n,i.onload=()=>e(),i.onerror=()=>t(Error(`Failed to load the Peach Payments SDK script`)),document.head.appendChild(i)}),ha)}var xa={};function Sa(e){xa={...xa,...e}}function Ca(){return{...xa}}function wa(e={}){let t={...xa,...e};(t.peachEnv||t.peachSdkUrl)&&ya({env:t.peachEnv,url:t.peachSdkUrl});let n=t.api??new Pi(t.apiBaseUrl??``),r=new Li(n),i=new Gi(n),a=typeof window<`u`,o;a?(r.startBackgroundRefresh(),o=r.ensureSession(t.checkoutKey??``).then(()=>{}),o.catch(()=>{})):o=Promise.resolve();let s={autoSelectSingleTimeSlot:t.autoSelectSingleTimeSlot??!1,wizardPages:t.wizardPages,editPages:t.editPages,shouldBottomCloseOnModal:t.shouldBottomCloseOnModal??!0},c=R(!1),l=!1;function u(e){K(c)!==e&&(z(c,e,!0),t.onCheckoutOpenChange?.(e))}function d(){u(!0)}function f(){u(!1)}function p(){let e=t.autoOpenCheckout??!0;return typeof e==`function`?e():e}let m=qi(e=>{switch(e.type){case`cart:change`:e.openCheckout&&p()&&d(),t.onCartChange?.({itemCount:e.itemCount,cartItemId:e.cartItemId,totalFormatted:e.totalFormatted});break;case`modal:open`:d();break;case`modal:close`:f();break;case`cart:updated`:t.onCartUpdated?.(e.cart);break;case`cart:expired`:t.onCartExpired?.();break;case`order:complete`:t.onOrderConfirmed?.({cartToken:e.cartToken,value:e.value,currency:e.currency})}}),h=t.mountExpiryGuard??!0?Da(n,i,t.extensionEnabled):null;return{api:n,sessionManager:r,cartManager:i,ready:o,get isCheckoutOpen(){return K(c)},options:s,openCheckout:d,closeCheckout:f,destroy(){l||(l=!0,f(),m(),h?.(),r.stop())}}}var Ta=[],Ea=null;function Da(e,t,n){let r={api:e,cartManager:t,extensionEnabled:n};Ta.push(r),Ta.length===1&&Oa(r);let i=!1;return()=>{if(i)return;i=!0;let e=Ta[0]===r;if(Ta=Ta.filter(e=>e!==r),Ta.length===0){Ea?.(),Ea=null;return}e&&(Ea?.(),Oa(Ta[0]))}}function Oa(e){Ea=ka(e.api,e.cartManager,e.extensionEnabled)}function ka(e,t,n){if(typeof document>`u`)return null;let r=document.createElement(`div`);r.dataset.bwExpiryGuard=``;let i=null,a=!1;function o(){a||(document.body.appendChild(r),i=Dr(pa,{target:r,props:n===void 0?{api:e,cartManager:t}:{api:e,cartManager:t,extensionEnabled:n}}))}return document.readyState===`loading`?document.addEventListener(`DOMContentLoaded`,o,{once:!0}):o(),()=>{a=!0,document.removeEventListener(`DOMContentLoaded`,o),i&&jr(i),r.remove()}}function Aa(){$({type:`modal:close`})}function ja(){$({type:`modal:open`})}var Ma=[{title:`Option`,widgets:[`option`,`age-category`]},{title:`Schedule`,widgets:[`date`,`time`]},{title:`Pickup`,widgets:[`pickup`]}],Na={"option-first":Ma,"date-first":[{title:`Age & capacity`,widgets:[`age-category`]},{title:`Schedule`,widgets:[`date`,`time`]},{title:`Option`,widgets:[`option`]},{title:`Pickup`,widgets:[`pickup`]}]};function Pa(e){if(!e)return Ma;if(e in Na)return Na[e];try{let t=JSON.parse(e);if(Array.isArray(t)&&t.length>0&&t[0].widgets)return t}catch{}return Ma}var Fa={"option-first":[{title:`Option`,widgets:[`option`]},{title:`Age, Date & Time`,widgets:[`age-category`,`date`,`time`]},{title:`Pickup`,widgets:[`pickup`]}],"date-first":[{title:`Age, Date & Time`,widgets:[`age-category`,`date`,`time`]},{title:`Option`,widgets:[`option`]},{title:`Pickup`,widgets:[`pickup`]}]};function Ia(e,t){if(t){if(t in Fa)return Fa[t];try{let e=JSON.parse(t);if(Array.isArray(e)&&e.length>0&&e[0].widgets)return e}catch{}}let n=e?e in Na?e:null:`option-first`;return n?Fa[n]:Pa(e)}var La={ZAR:`R`,USD:`$`,EUR:`€`,GBP:`£`};function Ra(e,t,n,r=0){let i=e/10**n;return`${La[t]??t}\u00A0${i.toFixed(r)}`}var za=J(`<div class="leading"><!></div>`),Ba=J(`<div class="heading svelte-idp8p9"> </div>`),Va=J(`<div class="body svelte-idp8p9"> </div>`),Ha=J(`<button><div class="layout svelte-idp8p9"><!> <div class="text svelte-idp8p9"><!> <!> <!></div> <span></span></div></button>`);function Ua(e,t){var n=Ha();let r;var i=B(n),a=B(i),o=e=>{var n=za();Ur(B(n),()=>t.leading),M(n),Y(e,n)};Z(a,e=>{t.leading&&e(o)});var s=H(a,2),c=B(s),l=e=>{var n=Ba(),r=B(n,!0);M(n),U(()=>X(r,t.heading)),Y(e,n)};Z(c,e=>{t.heading&&e(l)});var u=H(c,2),d=e=>{var n=Va(),r=B(n,!0);M(n),U(()=>X(r,t.body)),Y(e,n)};Z(u,e=>{t.body&&e(d)});var f=H(u,2),p=e=>{var n=Er();Ur(V(n),()=>t.children),Y(e,n)};Z(f,e=>{t.children&&e(p)}),M(s);var m=H(s,2);let h;M(i),M(n),U(()=>{r=qr(n,1,`card card-selectable`,null,r,{"card-selected":t.selected}),h=qr(m,1,`radio svelte-idp8p9`,null,h,{"radio-selected":t.selected})}),q(`click`,n,function(...e){t.onSelect?.apply(this,e)}),Y(e,n)}vr([`click`]);var Wa=J(`<p class="pricing svelte-19wqhng"> </p>`);function Ga(e,t){N(t,!0);let n=I(()=>()=>{let e=[];for(let n of t.option.units){if(!n.pricing||n.pricing.length===0)continue;let t=n.pricing[0];e.push(`${n.title??n.id} from ${Ra(t.retail,t.currency,t.currencyPrecision)}`)}return e.join(`, `)});Ua(e,{get selected(){return t.selected},get onSelect(){return t.onSelect},get heading(){return t.option.title},get body(){return t.option.description},children:(e,t)=>{var r=Er(),i=V(r),a=e=>{var t=Wa(),r=B(t,!0);M(t),U(e=>X(r,e),[()=>K(n)()]),Y(e,t)},o=I(()=>K(n)());Z(i,e=>{K(o)&&e(a)}),Y(e,r)},$$slots:{default:!0}}),P()}var Ka=J(`<span class="price svelte-bzhcxd"> </span>`),qa=J(`<p class="limit-message svelte-bzhcxd"> </p>`),Ja=J(`<div><div class="info svelte-bzhcxd"><span class="name svelte-bzhcxd"> </span> <!></div> <div class="stepper svelte-bzhcxd"><button class="step-btn svelte-bzhcxd" aria-label="Decrease">−</button> <input class="qty svelte-bzhcxd" type="text" inputmode="numeric" pattern="[0-9]*"/> <button class="step-btn svelte-bzhcxd" aria-label="Increase">+</button></div></div> <!>`,1);function Ya(e,t){N(t,!0);let n=Q(t,`boxed`,3,!0),r=Q(t,`divided`,3,!1),i=I(()=>()=>{if(!t.unit.pricing||t.unit.pricing.length===0)return``;let e=t.unit.pricing[0];return`from ${Ra(e.retail,e.currency,e.currencyPrecision)}`}),a=R(Zt(String(t.quantity))),o=R(``);gn(()=>{z(a,String(t.quantity),!0)});function s(){t.quantity>0&&t.onChange(t.quantity-1)}function c(){if(t.max!=null&&t.quantity>=t.max){l();return}z(o,``),t.onChange(t.quantity+1)}function l(){let e=t.unit.title??t.unit.id;z(o,t.max===0?`No ${e} tickets left for this time slot.`:`Only ${t.max} ${e} ticket${t.max===1?``:`s`} left for this time slot.`,!0)}function u(){let e=K(a).replace(/[^0-9]/g,``);e!==K(a)&&z(a,e,!0),z(o,``)}function d(){let e=K(a)===``?0:parseInt(K(a),10);Number.isNaN(e)&&(e=0),t.max!=null&&e>t.max&&(e=t.max,l()),z(a,String(e),!0),e!==t.quantity&&t.onChange(e)}function f(e){e.currentTarget.select()}var p=Ja(),m=V(p);let h;var g=B(m),_=B(g),v=B(_,!0);M(_);var y=H(_,2),b=e=>{var t=Ka(),n=B(t,!0);M(t),U(e=>X(n,e),[()=>K(i)()]),Y(e,t)},x=I(()=>K(i)());Z(y,e=>{K(x)&&e(b)}),M(g);var S=H(g,2),C=B(S),w=H(C,2);Zr(w);var T=H(w,2);M(S),M(m);var ee=H(m,2),E=e=>{var t=qa(),n=B(t,!0);M(t),U(()=>X(n,K(o))),Y(e,t)};Z(ee,e=>{K(o)&&e(E)}),U(()=>{h=qr(m,1,`row svelte-bzhcxd`,null,h,{card:n(),plain:!n(),divided:r()}),X(v,t.unit.title??t.unit.id),C.disabled=t.quantity===0,$r(w,`aria-label`,`${t.unit.title??t.unit.id??``} quantity`),T.disabled=t.max!=null&&t.quantity>=t.max}),q(`click`,C,s),q(`input`,w,u),_r(`blur`,w,d),_r(`focus`,w,f),ri(w,()=>K(a),e=>z(a,e)),q(`click`,T,c),Y(e,p),P()}vr([`click`,`input`]);var Xa=J(`<div class="loading-center"><div class="spinner"></div></div>`),Za=J(`<span class="svelte-10gu2tq"> </span>`),Qa=J(`<span class="cell empty svelte-10gu2tq"></span>`),$a=J(`<span class="day-price svelte-10gu2tq"> </span>`),eo=J(`<button><span class="day-num svelte-10gu2tq"> </span> <!></button>`),to=J(`<div class="header svelte-10gu2tq"><button class="nav-btn svelte-10gu2tq" aria-label="Previous month">‹</button> <span class="month svelte-10gu2tq"> </span> <button class="nav-btn svelte-10gu2tq" aria-label="Next month">›</button></div> <div class="day-names svelte-10gu2tq"></div> <div class="grid svelte-10gu2tq"></div>`,1),no=J(`<div class="calendar svelte-10gu2tq"><!></div>`);function ro(e,t){N(t,!0);let n=[`SU`,`MO`,`TU`,`WE`,`TH`,`FR`,`SA`],r=R(Zt(new Date)),i=I(()=>()=>{let e=K(r).getFullYear(),t=K(r).getMonth(),n=new Date(e,t,1).getDay(),i=new Date(e,t+1,0).getDate(),a=[];for(let e=0;e<n;e++)a.push(null);for(let n=1;n<=i;n++)a.push(new Date(e,t,n));return a}),a=I(()=>K(r).toLocaleDateString(`en`,{month:`long`}));function o(){let e=new Date(K(r));e.setMonth(e.getMonth()-1),z(r,e,!0)}function s(){let e=new Date(K(r));e.setMonth(e.getMonth()+1),z(r,e,!0)}function c(e){let n=t.availabilityByDate[Ci(e)];return n?n.available?`available`:n.status===`SOLD_OUT`?`sold-out`:`unavailable`:`unavailable`}function l(e){let n=t.availabilityByDate[Ci(e)];if(!n||!n.available)return``;if(n.unitPricing&&n.unitPricing.length>0){let e=n.unitPricing[0];return Ra(e.retail,e.currency,e.currencyPrecision)}return``}function u(e){return t.selectedDate?Ci(e)===Ci(t.selectedDate):!1}function d(e){let t=new Date;return t.setHours(0,0,0,0),e<t}function f(e){c(e)!==`available`||d(e)||t.onDateSelected(e)}var p=no(),m=B(p),h=e=>{Y(e,Xa())},g=e=>{var t=to(),r=V(t),p=B(r),m=H(p,2),h=B(m,!0);M(m);var g=H(m,2);M(r);var _=H(r,2);Lr(_,21,()=>n,Nr,(e,t)=>{var n=Za(),r=B(n,!0);M(n),U(()=>X(r,K(t))),Y(e,n)}),M(_);var v=H(_,2);Lr(v,21,()=>K(i)(),Nr,(e,t)=>{var n=Er(),r=V(n),i=e=>{Y(e,Qa())},a=e=>{let n=I(()=>c(K(t))),r=I(()=>d(K(t))),i=I(()=>l(K(t)));var a=eo();let o;var s=B(a),p=B(s,!0);M(s);var m=H(s,2),h=e=>{var t=$a(),n=B(t,!0);M(t),U(()=>X(n,K(i))),Y(e,t)};Z(m,e=>{K(i)&&!K(r)&&e(h)}),M(a),U((e,t)=>{o=qr(a,1,`cell svelte-10gu2tq`,null,o,e),a.disabled=K(n)!==`available`||K(r),X(p,t)},[()=>({available:K(n)===`available`&&!K(r),"sold-out":K(n)===`sold-out`,unavailable:K(n)===`unavailable`||K(r),selected:u(K(t))}),()=>K(t).getDate()]),q(`click`,a,()=>f(K(t))),Y(e,a)};Z(r,e=>{K(t)===null?e(i):e(a,-1)}),Y(e,n)}),M(v),U(()=>X(h,K(a))),q(`click`,p,o),q(`click`,g,s),Y(e,t)};Z(m,e=>{t.loading?e(h):e(g,-1)}),M(p),Y(e,p),P()}vr([`click`]);var io=J(`<div class="loading-center"><div class="spinner"></div></div>`),ao=J(`<p class="hint svelte-1hu99a4">All-day availability</p>`),oo=J(`<div class="slots svelte-1hu99a4"></div>`);function so(e,t){N(t,!0);var n=Er(),r=V(n),i=e=>{Y(e,io())},a=e=>{Y(e,ao())},o=e=>{var n=oo();Lr(n,21,()=>t.timeSlots,Nr,(e,n)=>{let r=I(()=>wi(K(n).localDateTimeStart));{let i=I(()=>t.selectedTime===K(r)),a=I(()=>K(n).vacancies==null?void 0:`${K(n).vacancies} left`);Ua(e,{get selected(){return K(i)},onSelect:()=>t.onTimeSelected(K(r)),get heading(){return K(r)},get body(){return K(a)}})}}),M(n),Y(e,n)};Z(r,e=>{t.loading?e(i):t.timeSlots.length===1&&t.timeSlots[0].allDay?e(a,1):t.timeSlots.length>0&&e(o,2)}),Y(e,n),P()}var co=`(min-width: 1024px)`;function lo(){return typeof window>`u`||!window.matchMedia?null:window.matchMedia(co)}function uo(){return lo()?.matches??!0}function fo(){let e=R(Zt(uo()));return gn(()=>{let t=lo();if(!t)return;z(e,t.matches,!0);let n=t=>{z(e,t.matches,!0)};return t.addEventListener(`change`,n),()=>t.removeEventListener(`change`,n)}),{get isInline(){return K(e)}}}var po={option:`Which option would you like?`,"age-category":`How many tickets would you like?`,date:`When would you like to go?`,time:`What time works for you?`,pickup:`Where would you like to be picked up?`,addon:``},mo=J(`<div class="wizard-header svelte-9w5z1v"><h2 class="svelte-9w5z1v">Buy Tickets</h2></div>`),ho=J(`<span> </span>`),go=J(`<div class="section svelte-9w5z1v"><div class="option-list svelte-9w5z1v"></div></div>`),_o=J(`<div class="section svelte-9w5z1v"><div class="unit-list svelte-9w5z1v"></div></div>`),vo=J(`<div class="section svelte-9w5z1v"><!></div>`),yo=J(`<div class="section svelte-9w5z1v"><div class="pickup-list svelte-9w5z1v"></div></div>`),bo=J(`<!> <!> <!> <!> <!>`,1),xo=J(`<div class="accordion-body svelte-9w5z1v"></div>`),So=J(`<div><button class="accordion-header svelte-9w5z1v"><div class="accordion-header-text svelte-9w5z1v"><span class="accordion-title svelte-9w5z1v"> </span> <!></div> <span></span></button> <!></div>`),Co=J(`<div class="wizard-body svelte-9w5z1v"></div> <div class="action-bar"><button class="btn btn-secondary">Return to Cart</button> <button class="btn btn-primary">Save & Update</button></div>`,1),wo=J(`<h2 class="body-title svelte-9w5z1v">Buy Tickets</h2>`),To=J(`<div class="section svelte-9w5z1v"><h4 class="section-title"> </h4> <div class="option-list svelte-9w5z1v"></div></div>`),Eo=J(`<div class="section svelte-9w5z1v"><h4 class="section-title"> </h4> <div></div></div>`),Do=J(`<div class="section svelte-9w5z1v"><h4 class="section-title"> </h4> <!></div>`),Oo=J(`<div class="section svelte-9w5z1v"><h4 class="section-title"> </h4> <div class="pickup-list svelte-9w5z1v"></div></div>`),ko=J(`<span></span>`),Ao=J(`<div class="page-dots svelte-9w5z1v"></div>`),jo=J(`<button class="btn btn-secondary"> </button>`),Mo=J(`<div class="wizard-body svelte-9w5z1v"><!> <h3 class="page-title svelte-9w5z1v"> </h3> <!></div> <div class="wizard-footer svelte-9w5z1v"><!> <div class="action-bar svelte-9w5z1v"><!> <button class="btn btn-primary"> </button></div></div>`,1),No=J(`<div class="dialog-backdrop svelte-9w5z1v"><div class="dialog svelte-9w5z1v"><h3 class="dialog-title svelte-9w5z1v">You have unsaved changes</h3> <p class="dialog-body svelte-9w5z1v">Would you like to proceed?</p> <div class="dialog-actions svelte-9w5z1v"><button class="dialog-btn-text svelte-9w5z1v">Discard changes</button> <button class="dialog-btn-fill svelte-9w5z1v">Return to editing</button></div></div></div>`),Po=J(`<div><!> <!></div> <!>`,1);function Fo(e,t){N(t,!0);let n=Q(t,`editPages`,19,()=>t.wizardPages),r=Q(t,`autoSelectSingleTimeSlot`,3,!1),i=fo(),a=I(()=>t.editItem!=null),o=I(()=>t.editItem&&!K(D)()?t.editItem.optionId:void 0),s=R(0),c=R(null),l=R(Zt({})),u=R(null),d=R(null),f=R(null),p=R(null),m=R(Zt({})),h=R(Zt([])),g=R(!1),_=R(!1),v=R(!1),y=R(!1),b=R(0),x=R(Zt(new Set));function S(...e){z(x,new Set([...K(x),...e]),!0)}function C(...e){e.every(e=>!K(x).has(e))||z(x,new Set([...K(x)].filter(t=>!e.includes(t))),!0)}let w=I(()=>Object.values(K(l)).some(e=>e>0)),T=I(()=>K(h).length===1&&K(h)[0].allDay),ee=I(()=>K(h).length===1),E=I(()=>!K(_)&&K(h).length===0),te=I(()=>K(T)||r()&&K(ee)),D=I(()=>()=>{let e=t.wizardPages.findIndex(e=>e.widgets.includes(`age-category`)),n=t.wizardPages.findIndex(e=>e.widgets.includes(`option`));return e>=0&&(n<0||e<n)}),ne=I(()=>()=>K(c)?K(c).units:K(D)()?t.product.options[0]?.units??[]:[]),re=I(()=>()=>K(c)?K(c).id:K(D)()?t.product.options[0]?.id??null:null);ci(()=>{t.editItem&&ie(t.editItem)});function ie(e){let n=t.product.options.find(t=>t.id===e.optionId);n&&z(c,n,!0);let r={};for(let t of e.unitItems)r[t.unitId]=(r[t.unitId]??0)+1;z(l,r,!0),K(w)&&ae(e.availabilityId,e.pickupPointId)}async function ae(e,n){if(await xe(),!e)return;let r=Ti(e);if(!r)return;let i=K(re)();if(!i)return;let a=r.split(`-`).map(Number);z(u,new Date(a[0],a[1]-1,a[2]),!0),z(_,!0);let o=await t.api.getAvailability(t.product.id,i,r);z(h,o,!0),z(_,!1);let s=o.find(t=>t.id===e);s&&(z(f,s,!0),s.allDay||z(d,wi(s.localDateTimeStart),!0),n&&K(c)?.pickupAvailable&&z(p,K(c).pickupLocations?.find(e=>e.id===n)??null,!0))}function O(e){return K(D)()?se(e):oe(e)}function oe(e){switch(e){case`option`:return!K(o);case`age-category`:return K(c)!=null;case`date`:return K(w);case`time`:return K(u)!=null&&!K(te)&&!K(E);case`pickup`:return K(f)!=null&&K(c)?.pickupAvailable===!0;case`addon`:return!1}}function se(e){switch(e){case`age-category`:return K(ne)().length>0;case`date`:return K(w);case`time`:return K(u)!=null&&!K(te)&&!K(E);case`option`:return!K(o)&&(K(f)!=null||K(u)!=null&&K(te));case`pickup`:return K(c)!=null&&K(c).pickupAvailable===!0&&K(f)!=null;case`addon`:return!1}}let ce=I(()=>()=>{let e=[];for(let n=0;n<t.wizardPages.length;n++){let r=t.wizardPages[n].widgets.filter(O);r.length>0&&e.push({index:n,title:t.wizardPages[n].title,widgets:r})}return e}),le=I(()=>()=>{let e=[];for(let t of n())for(let n of t.widgets)O(n)&&!e.includes(n)&&e.push(n);return e}),ue=I(()=>()=>{let e=K(ce)();return K(s)>=e.length?e[e.length-1]??null:e[K(s)]??null}),de=I(()=>()=>K(s)>=K(ce)().length-1),fe=I(()=>()=>K(ue)()?.title??``);function pe(e){switch(e){case`option`:return K(c)?.title??`Not selected`;case`age-category`:{let e=[];for(let t of K(ne)()){let n=K(l)[t.id]??0;n>0&&e.push(`${n} ${t.title}`)}return e.length>0?e.join(`, `):`Not selected`}case`date`:return K(u)?K(u).toLocaleDateString(`en-GB`,{day:`numeric`,month:`short`,year:`numeric`}):`Not selected`;case`time`:return K(d)??(K(te)?`All day`:`Not selected`);case`pickup`:return K(p)?.title??K(p)?.id??`Not selected`;default:return``}}function me(e){return e.map(pe).filter(e=>e&&e!==`Not selected`).join(` · `)||`Not selected`}let he=I(()=>()=>{let e=[];for(let t of n()){let n=t.widgets.filter(O);n.length>0&&e.push({title:t.title,widgets:n})}return e}),ge=I(()=>()=>{if(K(u)!=null&&K(E))return!1;let e=K(a)?K(le)():K(ue)()?.widgets??[];if(e.length===0)return!1;for(let t of e)switch(t){case`option`:if(!K(c))return!1;break;case`age-category`:if(!K(w))return!1;break;case`date`:if(!K(u))return!1;break;case`time`:if(!K(d)&&!K(te))return!1;break;case`pickup`:if(K(c)?.pickupRequired&&!K(p))return!1}return!0});function _e(e){if(K(D)()){z(c,e,!0),K(p)&&!e.pickupLocations?.some(e=>e.id===K(p).id)&&(z(p,null),S(`pickup`)),z(v,!0);return}z(c,e,!0),z(l,Object.fromEntries(e.units.map(e=>[e.id,0])),!0),z(u,null),z(d,null),z(f,null),z(p,null),z(m,{},!0),z(h,[],!0),z(v,!0)}function ve(e,t){z(l,{...K(l),[e]:t},!0),z(v,!0),K(w)&&Object.keys(K(m)).length===0&&xe(),ye()}function ye(){!K(f)||K(f).vacancies==null||Object.values(K(l)).reduce((e,t)=>e+t,0)<=K(f).vacancies||(z(u,null),z(d,null),z(f,null),z(h,[],!0),S(`date`,`time`))}function be(e){if(!K(f)||K(f).vacancies==null)return;let t=Object.values(K(l)).reduce((e,t)=>e+t,0),n=K(l)[e]??0;return K(f).vacancies-t+n}async function xe(){let e=K(re)();e&&(z(g,!0),z(m,await t.api.getAvailabilityCalendar(t.product.id,e),!0),z(g,!1))}async function Se(e){let n=K(re)();if(!n)return;z(u,e,!0),z(d,null),z(f,null),z(h,[],!0),z(v,!0),z(_,!0),C(`date`,`time`);let i=await t.api.getAvailability(t.product.id,n,Ci(e));z(h,i,!0),z(_,!1),i.length===1&&(i[0].allDay||r())&&(z(f,i[0],!0),i[0].allDay||z(d,wi(i[0].localDateTimeStart),!0))}function Ce(e){let t=K(h).find(t=>wi(t.localDateTimeStart)===e&&t.available);t&&(z(d,e,!0),z(f,t,!0),z(v,!0),C(`time`))}function k(e){z(p,e,!0),z(v,!0),C(`pickup`)}function we(){K(de)()?A():Jt(s)}function Te(){K(s)>0?Jt(s,-1):t.onCancel?Ee():!K(o)&&K(c)&&(z(c,null),z(l,{},!0),z(u,null),z(d,null),z(f,null),z(p,null),z(m,{},!0),z(h,[],!0))}function Ee(){if(K(v)){z(y,!0);return}t.onCancel?.()}function De(){z(y,!1),t.onCancel?.()}function A(){if(!K(f)||!K(c))return;let e=[];for(let t of K(f).unitPricing??[]){let n=K(l)[t.unitId]??0;if(n<=0)continue;let r=K(ne)().find(e=>e.id===t.unitId);e.push({unitId:t.unitId,quantity:n,title:r?.title??t.unitId,pricePerUnit:t.retail})}let n=0;for(let t of e)n+=t.pricePerUnit*t.quantity;let r=K(f).unitPricing?.[0],i=r?.currency??t.product.defaultCurrency??`ZAR`,a=r?.currencyPrecision??2;t.onComplete({productId:t.product.id,optionId:K(c).id,optionTitle:K(c).title,availabilityId:K(f).id,localDate:K(u)?Ci(K(u)):void 0,pickupPointId:K(p)?.id,units:e,totalPrice:n,currency:i,currencyPrecision:a})}var Oe=Po(),j=V(Oe);let ke;var Ae=B(j),je=e=>{Y(e,mo())};Z(Ae,e=>{!K(a)&&i.isInline&&e(je)});var Me=H(Ae,2),Ne=e=>{var n=Co(),r=V(n);Lr(r,21,()=>K(he)(),Nr,(e,n,r)=>{let i=I(()=>K(n).widgets.some(e=>K(x).has(e)));var a=So();let s;var f=B(a),v=B(f),y=B(v),S=B(y,!0);M(y);var C=H(y,2),T=e=>{var t=ho();let r;var a=B(t,!0);M(t),U(e=>{r=qr(t,1,`accordion-summary svelte-9w5z1v`,null,r,{invalidated:K(i)}),X(a,e)},[()=>K(i)?`Changes made require new configuration`:me(K(n).widgets)]),Y(e,t)};Z(C,e=>{K(b)!==r&&e(T)}),M(v);var ee=H(v,2);let E;M(f);var D=H(f,2),re=e=>{var r=xo();Lr(r,21,()=>K(n).widgets,Nr,(e,n)=>{var r=bo(),i=V(r),a=e=>{var n=go(),r=B(n);Lr(r,21,()=>t.product.options,Nr,(e,t)=>{{let n=I(()=>K(c)?.id===K(t).id);Ga(e,{get option(){return K(t)},get selected(){return K(n)},onSelect:()=>_e(K(t))})}}),M(r),M(n),Y(e,n)};Z(i,e=>{K(n)===`option`&&!K(o)&&e(a)});var s=H(i,2),f=e=>{var t=_o(),n=B(t);Lr(n,21,()=>K(ne)(),Nr,(e,t)=>{{let n=I(()=>K(l)[K(t).id]??0),r=I(()=>be(K(t).id));Ya(e,{get unit(){return K(t)},get quantity(){return K(n)},get max(){return K(r)},onChange:e=>ve(K(t).id,e)})}}),M(n),M(t),Y(e,t)},v=I(()=>K(n)===`age-category`&&K(ne)().length>0);Z(s,e=>{K(v)&&e(f)});var y=H(s,2),b=e=>{var t=vo();ro(B(t),{get availabilityByDate(){return K(m)},get selectedDate(){return K(u)},onDateSelected:Se,get loading(){return K(g)}}),M(t),Y(e,t)};Z(y,e=>{K(n)===`date`&&K(w)&&e(b)});var x=H(y,2),S=e=>{var t=vo();so(B(t),{get timeSlots(){return K(h)},get selectedTime(){return K(d)},get loading(){return K(_)},onTimeSelected:Ce}),M(t),Y(e,t)};Z(x,e=>{K(n)===`time`&&K(u)&&!K(te)&&e(S)});var C=H(x,2),T=e=>{var t=yo(),n=B(t);Lr(n,21,()=>K(c).pickupLocations,Nr,(e,t)=>{{let n=I(()=>K(p)?.id===K(t).id),r=I(()=>K(t).title??K(t).id);Ua(e,{get selected(){return K(n)},onSelect:()=>k(K(t)),get heading(){return K(r)},get body(){return K(t).address}})}}),M(n),M(t),Y(e,t)};Z(C,e=>{K(n)===`pickup`&&K(c)?.pickupAvailable&&K(c).pickupLocations&&e(T)}),Y(e,r)}),M(r),Y(e,r)};Z(D,e=>{K(b)===r&&e(re)}),M(a),U(e=>{s=qr(a,1,`accordion-section svelte-9w5z1v`,null,s,{expanded:K(b)===r,invalidated:K(i)}),X(S,e),E=qr(ee,1,`accordion-chevron svelte-9w5z1v`,null,E,{open:K(b)===r})},[()=>K(n).title.toUpperCase()]),q(`click`,f,()=>{z(b,K(b)===r?-1:r,!0)}),Y(e,a)}),M(r);var i=H(r,2),a=B(i),s=H(a,2);M(i),U(e=>s.disabled=e,[()=>!K(ge)()]),q(`click`,a,Ee),q(`click`,s,A),Y(e,n)},Pe=e=>{var n=Mo(),r=V(n),a=B(r),f=e=>{Y(e,wo())};Z(a,e=>{i.isInline||e(f)});var v=H(a,2),y=B(v,!0);M(v),Lr(H(v,2),17,()=>K(ue)()?.widgets??[],Nr,(e,n)=>{var r=bo(),a=V(r),s=e=>{var r=To(),i=B(r),a=B(i,!0);M(i);var o=H(i,2);Lr(o,21,()=>t.product.options,Nr,(e,t)=>{{let n=I(()=>K(c)?.id===K(t).id);Ga(e,{get option(){return K(t)},get selected(){return K(n)},onSelect:()=>_e(K(t))})}}),M(o),M(r),U(()=>X(a,po[K(n)])),Y(e,r)};Z(a,e=>{K(n)===`option`&&!K(o)&&e(s)});var f=H(a,2),v=e=>{var t=Eo(),r=B(t),a=B(r,!0);M(r);var o=H(r,2);let s;Lr(o,21,()=>K(ne)(),Nr,(e,t)=>{{let n=I(()=>K(l)[K(t).id]??0),r=I(()=>be(K(t).id));Ya(e,{get unit(){return K(t)},boxed:!1,get divided(){return i.isInline},get quantity(){return K(n)},get max(){return K(r)},onChange:e=>ve(K(t).id,e)})}}),M(o),M(t),U(()=>{X(a,po[K(n)]),s=qr(o,1,`unit-list svelte-9w5z1v`,null,s,{divided:i.isInline})}),Y(e,t)},y=I(()=>K(n)===`age-category`&&K(ne)().length>0);Z(f,e=>{K(y)&&e(v)});var b=H(f,2),x=e=>{var t=Do(),r=B(t),i=B(r,!0);M(r),ro(H(r,2),{get availabilityByDate(){return K(m)},get selectedDate(){return K(u)},onDateSelected:Se,get loading(){return K(g)}}),M(t),U(()=>X(i,po[K(n)])),Y(e,t)};Z(b,e=>{K(n)===`date`&&K(w)&&e(x)});var S=H(b,2),C=e=>{var t=Do(),r=B(t),i=B(r,!0);M(r),so(H(r,2),{get timeSlots(){return K(h)},get selectedTime(){return K(d)},get loading(){return K(_)},onTimeSelected:Ce}),M(t),U(()=>X(i,po[K(n)])),Y(e,t)};Z(S,e=>{K(n)===`time`&&K(u)&&!K(te)&&e(C)});var T=H(S,2),ee=e=>{var t=Oo(),r=B(t),i=B(r,!0);M(r);var a=H(r,2);Lr(a,21,()=>K(c).pickupLocations,Nr,(e,t)=>{{let n=I(()=>K(p)?.id===K(t).id),r=I(()=>K(t).title??K(t).id);Ua(e,{get selected(){return K(n)},onSelect:()=>k(K(t)),get heading(){return K(r)},get body(){return K(t).address}})}}),M(a),M(t),U(()=>X(i,po[K(n)])),Y(e,t)};Z(T,e=>{K(n)===`pickup`&&K(c)?.pickupAvailable&&K(c).pickupLocations&&e(ee)}),Y(e,r)}),M(r);var b=H(r,2),x=B(b),S=e=>{var t=Ao();Lr(t,21,()=>K(ce)(),Nr,(e,t,n)=>{var r=ko();let i;U(()=>i=qr(r,1,`dot svelte-9w5z1v`,null,i,{active:n===K(s)})),Y(e,r)}),M(t),Y(e,t)},C=I(()=>K(ce)().length>1);Z(x,e=>{K(C)&&e(S)});var T=H(x,2),ee=B(T),E=e=>{var t=jo(),n=B(t,!0);M(t),U(()=>X(n,K(s)>0?`Back`:`Cancel`)),q(`click`,t,Te),Y(e,t)};Z(ee,e=>{(K(s)>0||t.onCancel&&!i.isInline)&&e(E)});var D=H(ee,2),re=B(D,!0);M(D),M(T),M(b),U((e,t,n)=>{X(y,e),D.disabled=t,X(re,n)},[()=>K(fe)(),()=>!K(ge)(),()=>K(de)()?`Add to Cart`:`Next`]),q(`click`,D,we),Y(e,n)};Z(Me,e=>{K(a)?e(Ne):e(Pe,-1)}),M(j);var Fe=H(j,2),Ie=e=>{var t=No(),n=B(t),r=H(B(n),4),i=B(r),a=H(i,2);M(r),M(n),M(t),q(`click`,t,()=>{z(y,!1)}),q(`click`,n,e=>e.stopPropagation()),q(`click`,i,De),q(`click`,a,()=>{z(y,!1)}),Y(e,t)};Z(Fe,e=>{K(y)&&e(Ie)}),U(()=>ke=qr(j,1,`wizard svelte-9w5z1v`,null,ke,{inline:!K(a)&&i.isInline})),Y(e,Oe),P()}vr([`click`]);var Io=J(`<div class="loading-center" style="height:100vh"><div class="spinner"></div></div>`),Lo=J(`<p class="add-to-cart-error svelte-19qd5my"> </p>`),Ro=J(`<!> <!>`,1),zo=J(`<div class="bw-widget svelte-19qd5my"><!></div>`);function Bo(e,t){N(t,!0);let n=Q(t,`wizardPages`,3,Ma),r=Q(t,`autoSelectSingleTimeSlot`,3,!1),i=Q(t,`autoOpenCheckout`,3,!0),a=ca(),o=I(()=>la(t.api??a?.api,`TicketConfigurator`,`api`)),s=I(()=>la(t.cartManager??a?.cartManager,`TicketConfigurator`,`cartManager`)),c=R(null),l=R(!0),u=R(!1),d=R(null);async function f(){z(c,await K(o).getProduct(t.productId),!0),z(l,!1)}f();async function p(e){await K(s).ensureCart();let t=Ei(e.units),n=await K(o).addCartItem({productId:e.productId,optionId:e.optionId,unitItems:t,availabilityId:e.availabilityId,localDate:e.localDate,pickupPointId:e.pickupPointId,amount:e.totalPrice}),r=Ra(e.totalPrice,e.currency,e.currencyPrecision,2);$({type:`cart:change`,itemCount:t.length,cartItemId:n.id??``,totalFormatted:r,openCheckout:i()}),$({type:`cart:updated`,cart:await K(o).getCart().catch(()=>null)})}async function m(e){z(u,!0),z(d,null);try{await p(e)}catch(t){if(Oi(t)){await h();return}if(t instanceof Di&&(t.status===401||t.status===404)){K(s).reset();try{await p(e)}catch{z(d,`Something went wrong adding this to your cart. Please try again.`)}}else z(d,`Something went wrong adding this to your cart. Please try again.`)}finally{z(u,!1)}}async function h(){z(d,`This ticket's price has changed since you started. Please check the updated price and try again.`);try{await f()}catch{z(d,`This ticket's price has changed and we could not load the new one. Please reload the page.`)}}var g=zo(),_=B(g),v=e=>{Y(e,Io())},y=e=>{var i=Ro(),a=V(i),s=e=>{var t=Lo(),n=B(t,!0);M(t),U(()=>X(n,K(d))),Y(e,t)};Z(a,e=>{K(d)&&e(s)}),Fo(H(a,2),{get product(){return K(c)},get api(){return K(o)},get wizardPages(){return n()},get autoSelectSingleTimeSlot(){return r()},get onCancel(){return t.onCancel},onComplete:m}),Y(e,i)};Z(_,e=>{K(l)||K(u)?e(v):K(c)&&e(y,1)}),M(g),Y(e,g),P()}function Vo(e,t){return(t??(typeof document>`u`?null:document.body))?.appendChild(e),{destroy(){e.remove()}}}var Ho=/^(000\.000\.|000\.100\.1|000\.[36]|000\.400\.1[12]0|000\.400\.0[^3]|000\.400\.100)/,Uo=/^(000\.200|800\.400\.5|100\.400\.500)/;function Wo(e){return e?!Ho.test(e)&&!Uo.test(e):!1}var Go=1500,Ko=9e4;function qo(e){let t=R(null),n=R(null),r=null,i=R(!1),a=R(!1),o=R(null);async function s(){K(t)&&await p()}async function c(){let n=Vi(e.getApi().cartToken);n&&(z(t,n,!0),$({type:`payment:started`}),!await l()&&(e.setView(`payment`),Yi(e.getCart()).getTime()<=Date.now()&&s()))}async function l(){z(i,!0),e.setView(`result`);let r;try{r=await e.getApi().getCartStatus()}catch(t){return z(i,!1),ki(t)?(e.close(),!0):!1}return r.cartStatus===`confirmed`?(g(r.confirmResult??{items:[]}),z(i,!1),!0):r.cartStatus===`expired`?(z(n,`notCharged`),Hi(),z(t,null),$({type:`payment:ended`}),z(i,!1),!0):r.cartStatus===`paid`||r.cartStatus===`confirming`?(await _(),!0):(z(i,!1),!1)}async function u(t){try{return await e.getApi().abandonPayment(t),`abandoned`}catch(e){return Mi(e)||Ni(e)?`settled`:`failed`}}async function d(n){if(K(t)){z(a,!0);try{if(!await p())return}catch{}finally{z(a,!1)}if(K(t)){e.setView(`payment`);return}}z(a,!0),z(o,null);try{z(t,await e.getApi().payCart(n),!0),Bi(e.getApi().cartToken,{checkoutId:K(t).checkoutId??``,entityId:K(t).entityId??``}),e.setView(`payment`),$({type:`payment:started`}),e.refreshDeadlineAfterPay()}catch(t){if(ki(t)){e.close();return}let n=t instanceof Di?t.status:null;z(o,n===502?`Unable to start payment right now. Please try again.`:`Something went wrong starting your payment. Please try again.`,!0)}finally{z(a,!1)}}async function f(r){if(!((r.status===`cancelled`||r.status===`expired`)&&!await p())){if(r.status===`cancelled`){e.setView(`contact`);return}if(r.status===`expired`){z(n,`notCharged`),z(i,!1),e.setView(`result`);return}if(r.status===`error`||Wo(r.resultCode)){z(t,null),Hi(),z(n,`notCharged`),z(i,!1),e.setView(`result`),$({type:`payment:ended`});return}e.setView(`result`),await _()}}async function p(){if(!K(t))return await e.reloadCart();let n=await u(K(t).checkoutId);if(n===`settled`)return e.setView(`result`),await _(),!1;n===`abandoned`&&(z(t,null),Hi());let r=await e.reloadCart();return r&&e.notifyCartUpdated(e.getCart()),(n===`abandoned`||!r)&&$({type:`payment:ended`}),r}function m(){e.setView(`contact`)}async function h(r){let i;try{i=await e.getApi().getCartStatus()}catch(e){return r?.aborted?`settled`:ki(e)?(z(n,`pending`),`settled`):`waiting`}return r?.aborted?`settled`:i.cartStatus===`confirmed`?(g(i.confirmResult??{items:[]}),`settled`):i.cartStatus===`expired`?(z(n,`notCharged`),Hi(),z(t,null),`settled`):`waiting`}function g(t){let r=t.items.length>0&&t.items.every(e=>e.statusCode>=200&&e.statusCode<300);z(n,r?`success`:`partial`,!0),r&&e.onOrderConfirmed()}async function _(){z(i,!0),z(n,null);let e=Date.now()+Ko,t=new AbortController;for(r?.abort(),r=t;!t.signal.aborted&&await h(t.signal)!==`settled`;){if(Date.now()+Go>e){z(n,`pending`);break}await v(Go,t.signal)}t.signal.aborted||(z(i,!1),r=null)}function v(e,t){return new Promise(n=>{let r=setTimeout(n,e);t.addEventListener(`abort`,()=>{clearTimeout(r),n()},{once:!0})})}async function y(){z(i,!0),await h()===`waiting`&&z(n,`pending`),z(i,!1)}let b=I(()=>K(i)?null:K(n)===`success`?{outcome:`successful`}:K(n)===`pending`?{outcome:`pending`}:K(n)===`partial`?{outcome:`partial`}:K(n)===`notCharged`?{outcome:`failed`,resultDescription:`Your payment could not be completed. Please try again.`,retryPayment:!0}:null);return{get paymentResult(){return K(t)},get isPaying(){return K(a)},get payError(){return K(o)},get isConfirming(){return K(i)},get resultStatus(){return K(b)},payNow:d,onPaymentComplete:f,onPaymentTimedOut:s,resumeInterruptedPayment:c,retry:m,checkStatusAgain:y,dispose:()=>r?.abort()}}function Jo(e){return e.items.reduce((e,t)=>e+t.amount,0)}function Yo(e){return e.items[0]?.currencyCode??`ZAR`}function Xo(e,t){return t.get(e.productId)?.title??e.productId}function Zo(e,t){return t.get(e.productId)?.options.find(t=>t.id===e.optionId)?.title??e.optionId}function Qo(e,t){let n=t.get(e.productId)?.options.find(t=>t.id===e.optionId),r=new Map;for(let t of e.unitItems)r.set(t.unitId,(r.get(t.unitId)??0)+1);return[...r.entries()].map(([e,t])=>{let r=n?.units.find(t=>t.id===e),i=r?.pricing?.[0]?.retail??0;return{unitId:e,title:r?.title??e,quantity:t,linePrice:i*t}})}function $o(e){if(!e.availabilityId)return null;let t=e.availabilityId.match(/(\d{4})-(\d{2})-(\d{2})/);if(!t)return null;let n=new Date(+t[1],t[2]-1,+t[3]);return`${n.getDate()} ${[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`][n.getMonth()]} ${n.getFullYear()}`}var es=J(`<div class="form svelte-12xyhj1"><div class="field svelte-12xyhj1"><label for="firstName" class="svelte-12xyhj1">First name *</label> <input id="firstName"/></div> <div class="field svelte-12xyhj1"><label for="lastName" class="svelte-12xyhj1">Last name</label> <input id="lastName" class="input"/></div> <div class="field svelte-12xyhj1"><label for="email" class="svelte-12xyhj1">Email address *</label> <input id="email" type="email"/></div> <div class="field svelte-12xyhj1"><label for="phone" class="svelte-12xyhj1">Phone number *</label> <input id="phone" type="tel"/></div></div>`);function ts(e,t){N(t,!0);let n=Q(t,`firstName`,15,``),r=Q(t,`lastName`,15,``),i=Q(t,`emailAddress`,15,``),a=Q(t,`phoneNumber`,15,``);function o(){return n().trim()!==``&&i().trim()!==``&&a().trim()!==``}function s(){return{firstName:n().trim(),lastName:r().trim(),emailAddress:i().trim(),phoneNumber:a().trim()}}function c(e){return t.hasAttemptedSubmit&&e.trim()===``}var l={isValid:o,getContact:s},u=es(),d=B(u),f=H(B(d),2);Zr(f);let p;M(d);var m=H(d,2),h=H(B(m),2);Zr(h),M(m);var g=H(m,2),_=H(B(g),2);Zr(_);let v;M(g);var y=H(g,2),b=H(B(y),2);Zr(b);let x;return M(y),M(u),U((e,t,n)=>{p=qr(f,1,`input`,null,p,e),v=qr(_,1,`input`,null,v,t),x=qr(b,1,`input`,null,x,n)},[()=>({"input-error":c(n())}),()=>({"input-error":c(i())}),()=>({"input-error":c(a())})]),ri(f,n),ri(h,r),ri(_,i),ri(b,a),Y(e,u),P(l)}var ns=J(`<div class="consent svelte-19pmjwi"><label><input type="checkbox" class="svelte-19pmjwi"/> <span class="svelte-19pmjwi">I accept the privacy policy *</span></label> <label class="check svelte-19pmjwi"><input type="checkbox" class="svelte-19pmjwi"/> <span>I would like to receive marketing communications</span></label></div>`);function rs(e,t){N(t,!0);var n=ns(),r=B(n);let i;var a=B(r);Zr(a),je(2),M(r);var o=H(r,2),s=B(o);Zr(s),je(2),M(o),M(n),U(()=>{i=qr(r,1,`check svelte-19pmjwi`,null,i,{error:t.hasAttemptedSubmit&&!t.privacyAccepted}),Qr(a,t.privacyAccepted),Qr(s,t.marketingOptIn)}),q(`change`,a,e=>t.onPrivacyChanged(e.target.checked)),q(`change`,s,e=>t.onMarketingChanged(e.target.checked)),Y(e,n),P()}vr([`change`]);var is=J(`<span class="timer svelte-1u82ue3"> </span>`);function as(e,t){N(t,!0);let n=R(``);function r(){z(n,Ji(t.expiresAt.getTime()-Date.now()),!0)}r();let i=setInterval(r,1e3);li(()=>clearInterval(i));var a=is(),o=B(a,!0);M(a),U(()=>X(o,K(n))),Y(e,a),P()}var os=J(`<span class="spacer"></span> <!>`,1),ss=J(`<div class="error-state svelte-1ubcp68"><div class="error-icon svelte-1ubcp68">!</div> <p class="error-title svelte-1ubcp68">Unable to load payment form</p> <p class="error-msg svelte-1ubcp68"> </p> <button class="btn btn-primary svelte-1ubcp68">Start over</button></div>`),cs=J(`<div id="peach-container" class="svelte-1ubcp68"></div>`),ls=J(`<div class="payment-overlay svelte-1ubcp68"><div class="payment-dialog svelte-1ubcp68"><div class="page-header"><h2>Payment</h2> <!></div> <div class="body svelte-1ubcp68"><!></div></div></div>`);function us(e,t){N(t,!0);function n(e,t){let n=t?.result??t;return{status:e,resultCode:n?.code??n?.resultCode??t?.errorCode??void 0,description:n?.description??t?.message??void 0}}let r=R(!1),i=R(``),a=null;ci(()=>{(async()=>{try{await ba();let e=window.Checkout;if(!e){z(r,!0),z(i,`Payment SDK not loaded`);return}a=e.initiate({checkoutId:t.checkoutId,key:t.entityId,customisations:{card:{submitButtonText:`Pay Now`},theme:{brand:{primary:`#E30613`}}},eventHandlers:{onCompleted:e=>{s(),t.onPaymentComplete(n(`completed`,e))},onCancelled:e=>{s(),t.onPaymentComplete(n(`cancelled`,e))},onExpired:e=>{s(),t.onPaymentComplete(n(`expired`,e))},onError:e=>{console.error(`[booking-widget] Peach reported onError for checkoutId ${t.checkoutId} - left untouched, Peach owns retries. Payload:`,e)}}}),a.render(`#peach-container`)}catch(e){o(String(e)),z(r,!0),z(i,String(e),!0)}})()});function o(e){console.error(`[booking-widget] Peach checkout did not render: ${e}. SDK loaded from ${va()??`an already-present window.Checkout`} for checkoutId ${t.checkoutId}. If that environment does not match the checkout API this cart came from, set peachEnv on createBookingHost (or window.BW_CHECKOUT_PEACH_SDK_URL).`)}function s(){a&&=(a.unmount(),null)}li(s);var c=ls(),l=B(c),u=B(l),d=H(B(u),2),f=e=>{var n=os();as(H(V(n),2),{get expiresAt(){return t.expiresAt}}),Y(e,n)};Z(d,e=>{t.expiresAt&&e(f)}),M(u);var p=H(u,2),m=B(p),h=e=>{var n=ss(),r=H(B(n),4),a=B(r,!0);M(r);var o=H(r,2);M(n),U(()=>X(a,K(i)||`The checkout session may have expired.`)),q(`click`,o,()=>t.onPaymentComplete({status:`error`})),Y(e,n)},g=e=>{Y(e,cs())};Z(m,e=>{K(r)?e(h):e(g,-1)}),M(p),M(l),M(c),q(`click`,l,e=>e.stopPropagation()),Y(e,c),P()}vr([`click`]);var ds=J(`<div class="spinner"></div> <p class="hint svelte-16gfovn">Verifying payment...</p>`,1),fs=J(`<button class="btn btn-primary">Check Again</button>`),ps=J(`<div class="icon pending svelte-16gfovn">…</div> <h2 class="svelte-16gfovn">Still Checking Your Payment</h2> <p class="desc svelte-16gfovn"> </p> <div class="actions svelte-16gfovn"><!> <button class="btn btn-outline">Close</button></div>`,1),ms=J(`<div class="icon partial svelte-16gfovn">!</div> <h2 class="svelte-16gfovn">Booking Incomplete</h2> <p class="desc svelte-16gfovn"> </p> <button class="btn btn-outline">Close</button>`,1),hs=J(`<button class="btn btn-primary">Done</button>`),gs=J(`<button class="btn btn-outline">Try Again</button>`),_s=J(`<button class="btn btn-outline">Close</button>`),vs=J(`<div> </div> <h2 class="svelte-16gfovn"> </h2> <p class="desc svelte-16gfovn"> </p> <!>`,1),ys=J(`<div class="result svelte-16gfovn"><!></div>`);function bs(e,t){N(t,!0);let n=I(()=>t.status?.outcome===`successful`),r=I(()=>t.status?.outcome===`pending`),i=I(()=>t.status?.outcome===`partial`),a=I(()=>t.status?.outcome===`failed`&&t.status.retryPayment!==!1);var o=ys(),s=B(o),c=e=>{var t=ds();je(2),Y(e,t)},l=e=>{var n=ps(),r=H(V(n),4),i=B(r,!0);M(r);var a=H(r,2),o=B(a),s=e=>{var n=fs();q(`click`,n,function(...e){t.onCheckAgain?.apply(this,e)}),Y(e,n)};Z(o,e=>{t.onCheckAgain&&e(s)});var c=H(o,2);M(a),U(()=>X(i,t.status?.resultDescription??`We couldn't confirm this payment yet. Please don't try to pay again for now - we'll email you as soon as we know where it stands.`)),q(`click`,c,function(...e){t.onDone?.apply(this,e)}),Y(e,n)},u=e=>{var n=ms(),r=H(V(n),4),i=B(r,!0);M(r);var a=H(r,2);U(()=>X(i,t.status?.resultDescription??`Your payment succeeded, but we couldn't confirm every item in your booking. Please contact us with your order details.`)),q(`click`,a,function(...e){t.onDone?.apply(this,e)}),Y(e,n)},d=e=>{var r=vs(),i=V(r);let o;var s=B(i,!0);M(i);var c=H(i,2),l=B(c,!0);M(c);var u=H(c,2),d=B(u,!0);M(u);var f=H(u,2),p=e=>{var n=hs();q(`click`,n,function(...e){t.onDone?.apply(this,e)}),Y(e,n)},m=e=>{var n=gs();q(`click`,n,function(...e){t.onRetry?.apply(this,e)}),Y(e,n)},h=e=>{var n=_s();q(`click`,n,function(...e){t.onDone?.apply(this,e)}),Y(e,n)};Z(f,e=>{K(n)?e(p):K(a)?e(m,1):e(h,-1)}),U(()=>{o=qr(i,1,`icon svelte-16gfovn`,null,o,{success:K(n),failure:!K(n)}),X(s,K(n)?`✓`:`!`),X(l,K(n)?`Payment Successful`:`Payment Failed`),X(d,K(n)?`Your booking has been confirmed.`:t.status?.resultDescription??`Something went wrong. Please try again.`)}),Y(e,r)};Z(s,e=>{t.verifying?e(c):K(r)?e(l,1):K(i)?e(u,2):e(d,-1)}),M(o),Y(e,o),P()}vr([`click`]);var xs=J(`<p class="edit-error svelte-15l4305"> </p>`),Ss=J(`<div class="saving-overlay svelte-15l4305"><div class="spinner"></div></div>`),Cs=J(`<div class="edit-view svelte-15l4305"><div class="page-header"><button class="icon-btn" aria-label="Back">←</button> <h2>Edit Item</h2> <span class="spacer"></span> <button class="icon-btn" aria-label="Close">×</button></div> <!> <div><!> <!></div></div>`);function ws(e,t){N(t,!0);let n=Q(t,`autoSelectSingleTimeSlot`,3,!1),r=R(!1),i=R(null);async function a(e){z(r,!0),z(i,null);try{await t.api.updateCartItem(t.cartItem.id,{productId:e.productId,optionId:e.optionId,unitItems:Ei(e.units),availabilityId:e.availabilityId,localDate:e.localDate,pickupPointId:e.pickupPointId,amount:e.totalPrice}),t.onUpdated()}catch(e){if(Oi(e)){z(i,`This item's price has changed. Please check the updated price and save again.`),await t.onPriceChanged?.();return}z(i,e instanceof Di&&e.status===424?`This change could not be saved - the supplier rejected it. Please try different options.`:`Something went wrong saving your changes. Please try again.`,!0)}finally{z(r,!1)}}var o=Cs(),s=B(o),c=B(s),l=H(c,6);M(s);var u=H(s,2),d=e=>{var t=xs(),n=B(t,!0);M(t),U(()=>X(n,K(i))),Y(e,t)};Z(u,e=>{K(i)&&e(d)});var f=H(u,2);let p;var m=B(f);{let e=I(()=>t.wizardPages??Ma),r=I(()=>t.editPages??t.wizardPages??Ma);Fo(m,{get product(){return t.product},get api(){return t.api},get wizardPages(){return K(e)},get editPages(){return K(r)},get editItem(){return t.cartItem},get autoSelectSingleTimeSlot(){return n()},onComplete:a,get onCancel(){return t.onBack}})}var h=H(m,2),g=e=>{Y(e,Ss())};Z(h,e=>{K(r)&&e(g)}),M(f),M(o),U(()=>p=qr(f,1,`edit-body svelte-15l4305`,null,p,{saving:K(r)})),q(`click`,c,function(...e){t.onBack?.apply(this,e)}),q(`click`,l,function(...e){t.onClose?.apply(this,e)}),Y(e,o),P()}vr([`click`]);var Ts=J(`<div class="loading-center" style="height:100%"><div class="spinner"></div></div>`),Es=J(`<p class="pay-error svelte-i0rtg0"> </p>`),Ds=J(`<div class="page-header"><button class="icon-btn" aria-label="Back">←</button> <h2>Checkout</h2> <span class="spacer"></span> <!> <button class="icon-btn" aria-label="Close">×</button></div> <div class="body svelte-i0rtg0"><!> <div class="contact-header svelte-i0rtg0"><span class="contact-title svelte-i0rtg0">Contact Details</span> <span class="required-hint svelte-i0rtg0">* Required Fields</span></div> <!> <div style="margin-top:24px"><!></div></div> <div class="pay-bar svelte-i0rtg0"><span class="pay-bar-total svelte-i0rtg0"> </span> <button class="pay-bar-btn svelte-i0rtg0"> </button></div>`,1),Os=J(`<p class="cart-detail svelte-i0rtg0"> </p>`),ks=J(`<div class="cart-unit-line svelte-i0rtg0"><span class="cart-unit-label svelte-i0rtg0"> </span> <span class="cart-unit-price svelte-i0rtg0"> </span></div>`),As=J(`<div class="cart-card svelte-i0rtg0"><div class="cart-card-top svelte-i0rtg0"><h3 class="cart-product svelte-i0rtg0"> </h3> <span class="cart-item-total svelte-i0rtg0"> </span></div> <div class="cart-detail-lines svelte-i0rtg0"><!> <p class="cart-detail svelte-i0rtg0"> </p></div> <div class="cart-divider svelte-i0rtg0"></div> <div class="cart-units svelte-i0rtg0"></div> <div class="cart-actions svelte-i0rtg0"><button class="action-edit svelte-i0rtg0">Edit</button> <button class="action-remove svelte-i0rtg0">Remove</button></div></div>`),js=J(`<div class="page-header"><h2>Your cart</h2> <span class="spacer"></span> <!> <button class="keep-shopping-btn svelte-i0rtg0">+ Keep shopping</button></div> <div class="body svelte-i0rtg0"><!> <div class="cart-total-divider svelte-i0rtg0"></div> <div class="cart-total-row svelte-i0rtg0"><span>Total payable today</span> <span class="cart-total-amount svelte-i0rtg0"> </span></div></div> <div class="action-bar"><button class="btn btn-primary">Checkout</button></div>`,1),Ms=J(`<div class="modal svelte-i0rtg0"><!></div>`);function Ns(e,t){N(t,!0);let n=Q(t,`cart`,7),r=Q(t,`autoSelectSingleTimeSlot`,3,!1);gn(()=>qi(e=>{e.type===`cart:updated`&&`cart`in e&&e.cart===null&&K(i)!==`result`&&b(),e.type===`payment:timed-out`&&h.onPaymentTimedOut()}));let i=R(`cart`),a=R(null),o=R(!0),s=R(!1),c=R(!1),l=R(!1),u=R(``),d=R(``),f=R(``),p=R(``),m=R(null),h=qo({getApi:()=>t.api,getCart:()=>n(),reloadCart:T,notifyCartUpdated:E,refreshDeadlineAfterPay:()=>void ee(),setView:e=>{z(i,e,!0)},close:b,onOrderConfirmed:()=>t.onOrderConfirmed()}),g=R(Zt(new Map));async function _(){try{let e=[...new Set(n().items.map(e=>e.productId))],r=await Promise.all(e.map(e=>t.api.getProduct(e))),i=new Map;for(let e of r)i.set(e.id,e);z(g,i,!0)}catch{}finally{z(o,!1)}}_(),h.resumeInterruptedPayment();let v=I(()=>()=>Ra(Jo(n()),Yo(n()),2,2)),y=I(()=>Yi(n()));li(()=>{h.dispose(),$({type:`modal:close`})});function b(){$({type:`modal:close`}),t.onClose()}function x(){b()}function S(e){z(a,e,!0),z(i,`edit`)}async function C(){await T()&&(z(i,`cart`),E(n()))}async function w(e){try{await t.api.removeCartItem(e.id)}catch(e){if(!ki(e))throw e;b();return}await T()&&(E(n()),n().items.length===0&&b())}async function T(){try{return n(await t.api.getCart()),!0}catch(e){if(!ki(e))throw e;return b(),!1}}async function ee(){try{n(await t.api.getCart()),E(n())}catch{}}function E(e){$({type:`cart:updated`,cart:e})}async function te(){z(l,!0),!(!K(m)?.isValid()||!K(s))&&await h.payNow(K(m).getContact())}var D=Ms(),ne=B(D),re=e=>{Y(e,Ts())},ie=e=>{var t=Er(),n=V(t),r=e=>{us(e,{get checkoutId(){return h.paymentResult.checkoutId},get entityId(){return h.paymentResult.entityId},get expiresAt(){return K(y)},get onPaymentComplete(){return h.onPaymentComplete}})},i=e=>{Y(e,Ts())};Z(n,e=>{h.paymentResult?e(r):e(i,-1)}),Y(e,t)},ae=e=>{{let t=I(()=>h.resultStatus?.outcome===`pending`?h.checkStatusAgain:void 0);bs(e,{get status(){return h.resultStatus},get verifying(){return h.isConfirming},onDone:()=>{$({type:`modal:close`})},get onRetry(){return h.retry},get onCheckAgain(){return K(t)}})}},O=e=>{{let n=I(()=>K(g).get(K(a).productId));ws(e,{get cartItem(){return K(a)},get product(){return K(n)},get api(){return t.api},get wizardPages(){return t.wizardPages},get editPages(){return t.editPages},get autoSelectSingleTimeSlot(){return r()},onBack:()=>{z(i,`cart`)},onClose:b,onUpdated:C,onPriceChanged:_})}},oe=I(()=>K(i)===`edit`&&K(a)&&K(g).get(K(a).productId)),se=e=>{var t=Ds(),n=V(t),r=B(n),a=H(r,6);as(a,{get expiresAt(){return K(y)}});var o=H(a,2);M(n);var g=H(n,2),_=B(g),x=e=>{var t=Es(),n=B(t,!0);M(t),U(()=>X(n,h.payError)),Y(e,t)};Z(_,e=>{h.payError&&e(x)});var S=H(_,4);si(ts(S,{get hasAttemptedSubmit(){return K(l)},get firstName(){return K(u)},set firstName(e){z(u,e,!0)},get lastName(){return K(d)},set lastName(e){z(d,e,!0)},get emailAddress(){return K(f)},set emailAddress(e){z(f,e,!0)},get phoneNumber(){return K(p)},set phoneNumber(e){z(p,e,!0)}}),e=>z(m,e,!0),()=>K(m));var C=H(S,2);rs(B(C),{get privacyAccepted(){return K(s)},get marketingOptIn(){return K(c)},get hasAttemptedSubmit(){return K(l)},onPrivacyChanged:e=>{z(s,e,!0)},onMarketingChanged:e=>{z(c,e,!0)}}),M(C),M(g);var w=H(g,2),T=B(w),ee=B(T,!0);M(T);var E=H(T,2),D=B(E,!0);M(E),M(w),U(e=>{X(ee,e),E.disabled=h.isPaying,X(D,h.isPaying?`Paying…`:`Pay Now`)},[()=>K(v)()]),q(`click`,r,()=>{z(i,`cart`)}),q(`click`,o,b),q(`click`,E,te),Y(e,t)},ce=e=>{var t=js(),r=V(t),a=H(B(r),4);as(a,{get expiresAt(){return K(y)}});var o=H(a,2);M(r);var s=H(r,2),c=B(s);Lr(c,17,()=>n().items,Nr,(e,t)=>{var n=As(),r=B(n),i=B(r),a=B(i,!0);M(i);var o=H(i,2),s=B(o,!0);M(o),M(r);var c=H(r,2),l=B(c),u=e=>{var n=Os(),r=B(n,!0);M(n),U(e=>X(r,e),[()=>$o(K(t))]),Y(e,n)},d=I(()=>$o(K(t)));Z(l,e=>{K(d)&&e(u)});var f=H(l,2),p=B(f,!0);M(f),M(c);var m=H(c,4);Lr(m,21,()=>Qo(K(t),K(g)),Nr,(e,n)=>{var r=ks(),i=B(r),a=B(i);M(i);var o=H(i,2),s=B(o,!0);M(o),M(r),U(e=>{X(a,`${K(n).title??``} × ${K(n).quantity??``}`),X(s,e)},[()=>Ra(K(n).linePrice,K(t).currencyCode,2,0)]),Y(e,r)}),M(m);var h=H(m,2),_=B(h),v=H(_,2);M(h),M(n),U((e,t,n)=>{X(a,e),X(s,t),X(p,n)},[()=>Xo(K(t),K(g)),()=>Ra(K(t).amount,K(t).currencyCode,2,0),()=>Zo(K(t),K(g))]),q(`click`,_,()=>S(K(t))),q(`click`,v,()=>w(K(t))),Y(e,n)});var l=H(c,4),u=H(B(l),2),d=B(u,!0);M(u),M(l),M(s);var f=H(s,2),p=B(f);M(f),U(e=>X(d,e),[()=>K(v)()]),q(`click`,o,x),q(`click`,p,()=>{z(i,`contact`)}),Y(e,t)};Z(ne,e=>{K(o)?e(re):K(i)===`payment`?e(ie,1):K(i)===`result`?e(ae,2):K(oe)?e(O,3):K(i)===`contact`?e(se,4):e(ce,-1)}),M(D),Y(e,D),P()}vr([`click`]);var Ps=J(`<div class="loading-center" style="height:100vh"><div class="spinner"></div></div>`),Fs=J(`<div style="height:100vh"><!></div>`),Is=J(`<div class="loading-center" style="height:100vh;color:var(--bw-color-text-secondary)">No items in cart.</div>`),Ls=J(`<div class="bw-widget svelte-16hmqxh"><!></div>`);function Rs(e,t){N(t,!0);let n=Q(t,`wizardPages`,3,Ma),r=Q(t,`autoSelectSingleTimeSlot`,3,!1),i=I(()=>t.editPages??n()),a=R(null),o=R(!0),s=R(!1),c=!1;async function l(){let e=t.api.cartToken!==``;try{z(a,await t.api.getCart(),!0)}catch(t){z(a,null),e&&ki(t)&&(u(),z(s,!0))}z(o,!1)}l();function u(){t.cartManager?.reset(),$({type:`cart:updated`,cart:null}),$({type:`cart:expired`})}function d(){z(s,!1),$({type:`modal:close`}),l()}gn(()=>qi(e=>{if(e.type===`cart:updated`&&`cart`in e){if(c&&e.cart===null){c=!1;return}z(a,e.cart,!0)}}));var f=Ls(),p=B(f),m=e=>{Y(e,Ps())},h=e=>{Ns(e,{get cart(){return K(a)},get api(){return t.api},get wizardPages(){return n()},get editPages(){return K(i)},get autoSelectSingleTimeSlot(){return r()},onClose:()=>$({type:`modal:close`}),onOrderConfirmed:()=>{let e=K(a).items.reduce((e,t)=>e+t.amount,0),n=K(a).items[0]?.currencyCode??`ZAR`;$({type:`order:complete`,cartToken:K(a).cartToken??``,value:e,currency:n}),t.cartManager?.reset(),c=!0,$({type:`cart:updated`,cart:null})}})},g=e=>{var t=Fs();aa(B(t),{onStartAgain:d}),M(t),Y(e,t)},_=e=>{Y(e,Is())};Z(p,e=>{K(o)?e(m):K(a)&&K(a).items.length>0?e(h,1):K(s)?e(g,2):e(_,-1)}),M(f),Y(e,f),P()}var zs=J(`<div class="bw-modal-overlay svelte-5e515v"><div class="bw-modal-inner svelte-5e515v"><!></div></div>`);function Bs(e,t){N(t,!0);let n=Q(t,`wizardPages`,3,Ma),r=Q(t,`autoSelectSingleTimeSlot`,3,!1),i=Q(t,`mode`,3,`inline`),a=ca(),o=I(()=>la(t.api??a?.api,`Checkout`,`api`)),s=I(()=>t.cartManager??a?.cartManager),c=I(()=>t.open??a?.isCheckoutOpen??!0),l=I(()=>t.onClose??(a?()=>a.closeCheckout():void 0)),u=I(()=>i()===`modal`),d=R(!1),f=I(()=>!K(u)||K(c)&&!K(d)),p=!1,m=!1;gn(()=>{let e=K(c);e&&!m&&(z(d,!1),p=!1),m=e});function h(){$({type:`modal:close`})}gn(()=>qi(e=>{e.type!==`modal:close`||!K(u)||p||K(f)&&(p=!0,z(d,!0),K(l)?.())}));function g(e){K(f)&&K(u)&&e.key===`Escape`&&h()}var _=Er();_r(`keydown`,Qt,g);var v=V(_),y=e=>{var i=Er(),a=V(i),c=e=>{var i=zs(),a=B(i);Rs(B(a),{get api(){return K(o)},get cartManager(){return K(s)},get wizardPages(){return n()},get editPages(){return t.editPages},get autoSelectSingleTimeSlot(){return r()}}),M(a),M(i),Wr(i,e=>Vo?.(e)),q(`click`,i,h),q(`click`,a,e=>e.stopPropagation()),Y(e,i)};Z(a,e=>{K(f)&&e(c)}),Y(e,i)},b=e=>{Rs(e,{get api(){return K(o)},get cartManager(){return K(s)},get wizardPages(){return n()},get editPages(){return t.editPages},get autoSelectSingleTimeSlot(){return r()}})};Z(v,e=>{K(u)?e(y):e(b,-1)}),Y(e,_),P()}vr([`click`]);function Vs(e,t,n){let r=R(null),i=R(!1),a=R(!0),o=0;async function s(){let n=++o;if(z(a,!0),z(i,!1),!t().hasCart){z(r,null),z(a,!1);return}try{let t=await e().getCart();if(n!==o)return;z(r,t,!0)}catch{if(n!==o)return;z(r,null),z(i,!0)}z(a,!1)}s(),gn(()=>qi(e=>{e.type===`cart:updated`&&(o+=1,z(r,e.cart,!0),z(i,!1),z(a,!1))}));let c=I(()=>K(a)?`loading`:K(i)?`error`:(K(r)?.items?.length??0)>0?`ready`:`empty`);return gn(()=>{n?.(K(c))}),{get cart(){return K(r)},get state(){return K(c)},reload:()=>void s()}}var Hs=J(`<div class="cart-bar bw-widget svelte-1xt0fxx" role="alert"><div class="cart-info svelte-1xt0fxx"><span class="item-count svelte-1xt0fxx">Cart unavailable</span> <span class="error-detail svelte-1xt0fxx">We could not load your cart just now.</span></div> <button class="btn btn-primary">Retry</button></div>`),Us=J(`<div class="cart-bar bw-widget svelte-1xt0fxx"><div class="cart-info svelte-1xt0fxx"><span class="item-count svelte-1xt0fxx"> <!></span> <span class="total svelte-1xt0fxx"> </span></div> <button class="btn btn-primary">Checkout</button></div>`);function Ws(e,t){N(t,!0);let n=Q(t,`state`,3,`ready`),r=I(()=>t.cart?.items.length??0),i=I(()=>()=>{if(!t.cart||t.cart.items.length===0)return``;let e=t.cart.items[0].currencyCode;return Ra(t.cart.items.reduce((e,t)=>e+t.amount,0),e,2,2)}),a=I(()=>()=>t.cart?Yi(t.cart):new Date);var o=Er(),s=V(o),c=e=>{var n=Hs(),r=H(B(n),2);M(n),q(`click`,r,()=>t.onRetry?.()),Y(e,n)},l=e=>{var t=Us(),n=B(t),o=B(n),s=B(o),c=H(s);{let e=I(()=>K(a)());as(c,{get expiresAt(){return K(e)}})}M(o);var l=H(o,2),u=B(l,!0);M(l),M(n);var d=H(n,2);M(t),U(e=>{X(s,`${K(r)===1?`1 item`:`${K(r)} items`} `),X(u,e)},[()=>K(i)()]),q(`click`,d,()=>$({type:`modal:open`})),Y(e,t)};Z(s,e=>{n()===`error`?e(c):t.cart&&t.cart.items.length>0&&e(l,1)}),Y(e,o),P()}vr([`click`]);function Gs(e,t){N(t,!0);let n=ca(),r=Vs(()=>la(t.api??n?.api,`CartBar`,`api`),()=>la(t.cartManager??n?.cartManager,`CartBar`,`cartManager`),e=>t.onStateChange?.(e));Ws(e,{get cart(){return r.cart},get state(){return r.state},get onRetry(){return r.reload}}),P()}var Ks=J(`<button class="cart-overview-btn is-error bw-widget svelte-16bjfem"><span class="cart-error-label svelte-16bjfem">Cart unavailable - retry</span></button>`),qs=J(`<button class="cart-overview-btn bw-widget svelte-16bjfem"><svg class="cart-icon svelte-16bjfem" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="9" cy="21" r="1"></circle><circle cx="20" cy="21" r="1"></circle><path d="M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6"></path></svg> <span class="cart-badge svelte-16bjfem"> </span> <span class="cart-timer svelte-16bjfem"> </span></button>`);function Js(e,t){N(t,!0);let n=ca(),r=Vs(()=>la(t.api??n?.api,`CartOverviewButton`,`api`),()=>la(t.cartManager??n?.cartManager,`CartOverviewButton`,`cartManager`),e=>t.onStateChange?.(e)),i=I(()=>r.cart),a=R(``);function o(){z(a,K(i)?Ji(Yi(K(i)).getTime()-Date.now()):Ji(0),!0)}o();let s=setInterval(o,1e3);li(()=>clearInterval(s));let c=I(()=>K(i)?.items.length??0);var l=Er(),u=V(l),d=e=>{var t=Ks();q(`click`,t,()=>r.reload()),Y(e,t)},f=e=>{var t=qs(),n=H(B(t),2),r=B(n,!0);M(n);var i=H(n,2),o=B(i,!0);M(i),M(t),U(()=>{X(r,K(c)),X(o,K(a))}),q(`click`,t,()=>$({type:`modal:open`})),Y(e,t)};Z(u,e=>{r.state===`error`?e(d):K(i)&&K(i).items.length>0&&e(f,1)}),Y(e,l),P()}vr([`click`]);function Ys(e,t){N(t,!0);let n=ca(),r=I(()=>la(t.api??n?.api,`CartOverview`,`api`)),i=I(()=>la(t.cartManager??n?.cartManager,`CartOverview`,`cartManager`));var a=Er(),o=V(a),s=e=>{Js(e,{get api(){return K(r)},get cartManager(){return K(i)},get onStateChange(){return t.onStateChange}})},c=e=>{Gs(e,{get api(){return K(r)},get cartManager(){return K(i)},get onStateChange(){return t.onStateChange}})};Z(o,e=>{t.display===`button`?e(s):e(c,-1)}),Y(e,a),P()}function Xs(e,t){N(t,!0),sa(t.host);var n=Er();Ur(V(n),()=>t.children),Y(e,n),P()}async function Zs(e){try{await e.host.ready}catch(t){throw e.release(),t}}function Qs(e){if(!e.host){let t=wa(e);return{host:t,release:()=>t.destroy()}}return{host:e.host,release:$s(e)}}function $s(e){let{onCartChange:t,onCartUpdated:n,onCartExpired:r,onOrderConfirmed:i}=e;return!t&&!n&&!r&&!i?()=>{}:qi(e=>{e.type===`cart:change`&&t?.({itemCount:e.itemCount,cartItemId:e.cartItemId,totalFormatted:e.totalFormatted}),e.type===`cart:updated`&&n?.(e.cart),e.type===`cart:expired`&&r?.(),e.type===`order:complete`&&i?.({cartToken:e.cartToken,value:e.value,currency:e.currency})})}async function ec(e,t){let n=Qs(t),{host:r,release:i}=n;await Zs(n);let a=Dr(Bo,{target:e,props:{api:r.api,cartManager:r.cartManager,productId:t.productId,wizardPages:t.wizardPages??r.options.wizardPages,autoSelectSingleTimeSlot:t.autoSelectSingleTimeSlot??r.options.autoSelectSingleTimeSlot,autoOpenCheckout:t.autoOpenCheckout!==!1,onCancel:t.onCancel}});return{destroy(){jr(a),i()}}}async function tc(e,t){let n=Qs(t),{host:r,release:i}=n;await Zs(n);let a=Dr(Bs,{target:e,props:{api:r.api,cartManager:r.cartManager,wizardPages:t.wizardPages??r.options.wizardPages,editPages:t.editPages??r.options.editPages,autoSelectSingleTimeSlot:t.autoSelectSingleTimeSlot??r.options.autoSelectSingleTimeSlot,mode:t.mode??`inline`,get open(){return r.isCheckoutOpen},onClose:t.onClose}});return{destroy(){jr(a),i()}}}async function nc(e,t){let n=Qs(t),{host:r,release:i}=n;await Zs(n);let a=Dr(Ys,{target:e,props:{api:r.api,cartManager:r.cartManager,display:t.display??`bar`,onStateChange:t.onStateChange}}),o=t.onCheckout?rc(t.onCheckout):()=>{};return{destroy(){o(),jr(a),i()}}}function rc(e){return qi(t=>{t.type===`modal:open`&&e()})}e.ApiClient=Pi,e.ApiError=Di,e.BookingProvider=Xs,e.CartBar=Gs,e.CartExpiryGuard=pa,e.CartManager=Gi,e.CartOverview=Ys,e.CartOverviewButton=Js,e.Checkout=Bs,e.DEFAULT_WIZARD_PAGES=Ma,e.SessionManager=Li,e.TicketConfigurator=Bo,e.createBookingHost=wa,e.getBookingDefaults=Ca,e.getBookingHostContext=ca,e.mountCartOverview=nc,e.mountCheckout=tc,e.mountConfigurator=ec,e.onWidgetMessage=qi,e.portal=Vo,e.postMessage=$,e.requestCheckoutClose=Aa,e.requestCheckoutOpen=ja,e.resolveEditPages=Ia,e.resolveWizardPages=Pa,e.setBookingDefaults=Sa,e.setPeachSdk=ya});
|
package/package.json
CHANGED
|
@@ -33,7 +33,10 @@
|
|
|
33
33
|
// this same message and feeds the fresh cart straight back down as the `cart` prop, so the header countdown
|
|
34
34
|
// re-derives from it. Assigning to `cart` here instead would write to a prop this component does not own.
|
|
35
35
|
$effect(() => onWidgetMessage((d) => {
|
|
36
|
-
|
|
36
|
+
// Excludes the result view: onOrderConfirmed below posts this same null-cart update once the order is
|
|
37
|
+
// confirmed (so bw-cart's bar/button clears), and by then this modal is already showing its own success
|
|
38
|
+
// screen for that cart - closing out from under it would skip the Done button entirely.
|
|
39
|
+
if (d.type === 'cart:updated' && 'cart' in d && d.cart === null && currentView !== 'result') close();
|
|
37
40
|
if (d.type === 'payment:timed-out') void flow.onPaymentTimedOut();
|
|
38
41
|
}));
|
|
39
42
|
|
|
@@ -23,6 +23,12 @@
|
|
|
23
23
|
let cart = $state<CheckoutCartDetailDto | null>(null);
|
|
24
24
|
let isLoading = $state(true);
|
|
25
25
|
let expired = $state(false);
|
|
26
|
+
// Set just before onOrderConfirmed posts its own cart:updated below, so the effect a few lines down knows
|
|
27
|
+
// that particular null-cart message is this component clearing bw-cart's bar/button, not news that the
|
|
28
|
+
// cart is gone. Without this, applying it to `cart` here too flips the template's own condition and
|
|
29
|
+
// unmounts CheckoutModal outright - taking its still-open success screen down with it, before the shopper
|
|
30
|
+
// ever sees Done.
|
|
31
|
+
let orderJustConfirmed = false;
|
|
26
32
|
|
|
27
33
|
async function load() {
|
|
28
34
|
// A token this widget still holds for a cart the server has already let go (its window ran out while the
|
|
@@ -69,7 +75,17 @@
|
|
|
69
75
|
// cart (see TicketConfigurator/CheckoutModal's own posting sites), so this applies it directly rather than
|
|
70
76
|
// triggering a second, redundant getCart() call or flashing the spinner over an already-visible cart.
|
|
71
77
|
$effect(() => onWidgetMessage((d) => {
|
|
72
|
-
if (d.type === 'cart:updated' && 'cart' in d)
|
|
78
|
+
if (d.type === 'cart:updated' && 'cart' in d) {
|
|
79
|
+
// One-shot: only the message this component itself just posted is swallowed. Without resetting the
|
|
80
|
+
// flag straight after, a later genuine cart-gone event (e.g. a fresh cart expiring while rendered
|
|
81
|
+
// in-page rather than as a modal, where this component stays mounted after checkout) would be
|
|
82
|
+
// silently ignored too.
|
|
83
|
+
if (orderJustConfirmed && d.cart === null) {
|
|
84
|
+
orderJustConfirmed = false;
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
cart = d.cart as CheckoutCartDetailDto | null;
|
|
88
|
+
}
|
|
73
89
|
}));
|
|
74
90
|
</script>
|
|
75
91
|
|
|
@@ -99,6 +115,11 @@
|
|
|
99
115
|
// in localStorage on the merchant's origin until absoluteExpiresAt - readable by every third-party
|
|
100
116
|
// script they load, and picked up by the next person to use a shared or kiosk browser.
|
|
101
117
|
cartManager?.reset();
|
|
118
|
+
// Mirrors onCartExpired above: without this, bw-cart's bar/button (and any host-side summary built
|
|
119
|
+
// from bw:cart-updated) keeps showing the just-paid cart until something else happens to trigger a
|
|
120
|
+
// reload, since dropping the token alone never reaches CartOverview's cart:updated listener.
|
|
121
|
+
orderJustConfirmed = true;
|
|
122
|
+
postMessage({ type: 'cart:updated', cart: null });
|
|
102
123
|
}}
|
|
103
124
|
/>
|
|
104
125
|
{:else if expired}
|
|
@@ -62,10 +62,20 @@
|
|
|
62
62
|
onCompleted: (e: any) => { cleanup(); onPaymentComplete(resultOf('completed', e)); },
|
|
63
63
|
onCancelled: (e: any) => { cleanup(); onPaymentComplete(resultOf('cancelled', e)); },
|
|
64
64
|
onExpired: (e: any) => { cleanup(); onPaymentComplete(resultOf('expired', e)); },
|
|
65
|
+
// Deliberately left alone: WIDGET-ARCHITECTURE.md documents that while Peach still has attempts
|
|
66
|
+
// left, it re-prompts inside this same iframe and shows its own decline UI ("4 of 5 card attempts
|
|
67
|
+
// remaining") without ending the checkout - and observed behaviour is that Peach fires onError for
|
|
68
|
+
// that case too, not only for a genuinely broken render. Unmounting and handing off to our own
|
|
69
|
+
// "Payment Failed" screen here would tear that UI down mid-retry, for a checkout Peach has not
|
|
70
|
+
// actually given up on - so this does not cleanup() or call onPaymentComplete at all. Peach's own
|
|
71
|
+
// iframe is left to do whatever it was going to do next; the only way out of a truly dead render is
|
|
72
|
+
// still the `failed` state above (SDK never loaded) and its own Start Over button.
|
|
65
73
|
onError: (e: any) => {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
74
|
+
console.error(
|
|
75
|
+
`[booking-widget] Peach reported onError for checkoutId ${checkoutId} - left untouched, ` +
|
|
76
|
+
'Peach owns retries. Payload:',
|
|
77
|
+
e,
|
|
78
|
+
);
|
|
69
79
|
},
|
|
70
80
|
},
|
|
71
81
|
});
|
|
@@ -18,6 +18,22 @@ import { cartDeadline } from './cart-expiry';
|
|
|
18
18
|
import { postMessage } from './messages';
|
|
19
19
|
import { forgetPaymentAttempt, recallPaymentAttempt, rememberPaymentAttempt } from './payment-attempt';
|
|
20
20
|
|
|
21
|
+
// Peach reports a finished checkout through onCompleted whether the transaction was charged or rejected, and
|
|
22
|
+
// the only place that distinction exists client-side is the result code in its payload. Mirrors the server's
|
|
23
|
+
// own PeachPaymentOutcome.Classify (Connect.Logic/Checkout/Payments) - the two must agree, so if Peach ever
|
|
24
|
+
// publishes a code family that one treats differently, change both.
|
|
25
|
+
//
|
|
26
|
+
// Deliberately conservative: a completed result whose code is missing or unrecognised is treated as a possible
|
|
27
|
+
// charge and goes to the poll, because showing "Payment Failed" over a card that was actually charged is the
|
|
28
|
+
// one outcome worth avoiding entirely. Only a code this recognises as a genuine failure takes the fail path.
|
|
29
|
+
const PeachSuccessCode = /^(000\.000\.|000\.100\.1|000\.[36]|000\.400\.1[12]0|000\.400\.0[^3]|000\.400\.100)/;
|
|
30
|
+
const PeachPendingCode = /^(000\.200|800\.400\.5|100\.400\.500)/;
|
|
31
|
+
|
|
32
|
+
function isFailureCode(resultCode: string | undefined): boolean {
|
|
33
|
+
if (!resultCode) return false;
|
|
34
|
+
return !PeachSuccessCode.test(resultCode) && !PeachPendingCode.test(resultCode);
|
|
35
|
+
}
|
|
36
|
+
|
|
21
37
|
// Peach's webhook is typically near-instant, but is a genuinely separate async delivery from the card charge
|
|
22
38
|
// itself, and confirming the bookings behind it means a call per item to a supplier. 90s at 1.5s intervals
|
|
23
39
|
// covers both without making a shopper whose payment already succeeded wait an unreasonable time to see it.
|
|
@@ -248,13 +264,12 @@ export function createCheckoutPaymentFlow(deps: CheckoutPaymentFlowDeps): Checko
|
|
|
248
264
|
}
|
|
249
265
|
|
|
250
266
|
async function onPaymentComplete(result: PaymentSdkResult): Promise<void> {
|
|
251
|
-
//
|
|
252
|
-
//
|
|
253
|
-
//
|
|
254
|
-
// the
|
|
255
|
-
//
|
|
256
|
-
|
|
257
|
-
if (result.status === 'cancelled' || result.status === 'expired' || result.status === 'error') {
|
|
267
|
+
// Cancelled and expired are genuinely terminal on Peach's side: the shopper backed out, or the session
|
|
268
|
+
// timed out. error never reaches here from Peach's own iframe any more (PaymentPage's onError is left
|
|
269
|
+
// untouched - Peach owns retries and shows its own "4 of 5 attempts remaining" UI without ending the
|
|
270
|
+
// checkout) - the only source left is the `failed` state's Start Over button, for a checkout that never
|
|
271
|
+
// even rendered. That is handled below, mirrored on the isFailureCode branch, rather than released here.
|
|
272
|
+
if (result.status === 'cancelled' || result.status === 'expired') {
|
|
258
273
|
if (!(await releaseAbandonedAttempt())) return;
|
|
259
274
|
}
|
|
260
275
|
|
|
@@ -263,16 +278,41 @@ export function createCheckoutPaymentFlow(deps: CheckoutPaymentFlowDeps): Checko
|
|
|
263
278
|
return;
|
|
264
279
|
}
|
|
265
280
|
|
|
266
|
-
if (result.status === 'expired'
|
|
281
|
+
if (result.status === 'expired') {
|
|
282
|
+
confirmOutcome = 'notCharged';
|
|
283
|
+
isConfirming = false;
|
|
284
|
+
deps.setView('result');
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
// A completed checkout is not the same as a charged one. Peach fires onCompleted for a transaction it
|
|
289
|
+
// rejected as well as one it charged, and by the time it does so its own form has already offered the
|
|
290
|
+
// shopper every retry it was going to - so this is the end of the road, not a state to wait on. The
|
|
291
|
+
// Start-Over error case is folded in here rather than treated as its own terminal branch above: a
|
|
292
|
+
// checkout that never rendered gets the same answer as one Peach rejected - nothing was charged, and the
|
|
293
|
+
// cart is left exactly as it is either way.
|
|
294
|
+
//
|
|
295
|
+
// Nothing is asked of the server here, deliberately. Peach's checkout-level status endpoint answers
|
|
296
|
+
// "transaction pending" for a checkout whose transaction was rejected, so consulting it would turn a known
|
|
297
|
+
// failure back into a guess; it is only good for confirming a success. The cart is left exactly as it is -
|
|
298
|
+
// the next Pay Now mints a new checkout over this one (CheckoutCartService.CanInitiatePayment: a cart in
|
|
299
|
+
// AwaitingPaymentConfirmation stays payable specifically because "a decline is Peach's business"). Calling
|
|
300
|
+
// abandon-payment here instead - as this used to - only ever pre-empted that: it would either abort an
|
|
301
|
+
// attempt Peach had not actually given up on, or be flatly refused with a 409 because Peach's own status
|
|
302
|
+
// already disagreed, sending this down the exact same path anyway.
|
|
303
|
+
if (result.status === 'error' || isFailureCode(result.resultCode)) {
|
|
304
|
+
paymentResult = null;
|
|
305
|
+
forgetPaymentAttempt();
|
|
267
306
|
confirmOutcome = 'notCharged';
|
|
268
307
|
isConfirming = false;
|
|
269
308
|
deps.setView('result');
|
|
309
|
+
// CartExpiryGuard has to stop treating a payment as in flight, or it never prompts or expires again.
|
|
310
|
+
postMessage({ type: 'payment:ended' });
|
|
270
311
|
return;
|
|
271
312
|
}
|
|
272
313
|
|
|
273
|
-
//
|
|
274
|
-
//
|
|
275
|
-
// reads the cart until it says so.
|
|
314
|
+
// A charge, or a code this cannot read. The webhook is what moves the cart to Paid; this poll only reads
|
|
315
|
+
// the cart until it says so.
|
|
276
316
|
deps.setView('result');
|
|
277
317
|
await runStatusPoll();
|
|
278
318
|
}
|