PageSourceSearch

https://leelaecospa.ca/_next/static/chunks/2446-1b18b2872cd707f9.js?dpl=dpl_8UNd9M5xPEcLZk8f5aocQuBpNLXL

js leelaecospa.ca collected 2026-10-09 18:32:05 UTC 18,458 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2446],{579:(a,e,l)=>{l.d(e,{M$:()=>t,pd:()=>o,xV:()=>s});let t={lotus:"ph:flower-lotus",diamond:"ph:diamond",pin:"ph:map-pin",leaf:"ph:leaf",close:"ph:x",hand:"ph:hand-heart",users:"ph:users-three",book:"ph:book-open-text",crown:"ph:crown-simple",gift:"ph:gift",mail:"ph:envelope-simple",briefcase:"ph:briefcase",sparkle:"ph:sparkle",drop:"ph:drop",buildings:"ph:buildings",tree:"ph:tree",snow:"ph:snowflake"};function o(a){let e=a.toLowerCase();return e.includes("calgary")?t.buildings:e.includes("oakville")?t.tree:e.includes("winnipeg")?t.snow:t.pin}function s(a){let e=a.toLowerCase();return/about/.test(e)?t.lotus:/treatment/.test(e)?t.hand:/location/.test(e)?t.pin:/team/.test(e)?t.users:/journal|wellness/.test(e)?t.book:/membership/.test(e)?t.crown:/gift/.test(e)?t.gift:/contact/.test(e)?t.mail:/career/.test(e)?t.briefcase:/press|media/.test(e)?t.sparkle:/gallery/.test(e)?t.diamond:/salt|amenit/.test(e)?t.drop:/faq|etiquette/.test(e)?t.book:t.lotus}},1441:a=>{a.exports=JSON.parse('[{"detailSlug":"bankers-hall","publicSlug":"bankers-hall-calgary-massage","hasGallery":false},{"detailSlug":"beltline","publicSlug":"beltline-calgary-massage","hasGallery":true},{"detailSlug":"boutique-bridgeland","publicSlug":"boutique-bridgeland-calgary-massage","hasGallery":false},{"detailSlug":"bridgeland","publicSlug":"bridgeland-calgary-massage","hasGallery":true},{"detailSlug":"calgary-place","publicSlug":"calgary-place-calgary-massage","hasGallery":true},{"detailSlug":"carrington","publicSlug":"carrington-calgary-massage","hasGallery":true},{"detailSlug":"greenwich","publicSlug":"greenwich-calgary-massage","hasGallery":false},{"detailSlug":"legacy-township","publicSlug":"legacy-township-calgary-massage","hasGallery":true},{"detailSlug":"marda-loop","publicSlug":"marda-loop-calgary-massage","hasGallery":true},{"detailSlug":"town-square-oakville-ontario","publicSlug":"town-square-oakville-spa","hasGallery":true},{"detailSlug":"winnipeg","publicSlug":"winnipeg-spa","hasGallery":true}]')},1686:(a,e,l)=>{l.d(e,{ge:()=>s,oY:()=>i,ah:()=>n});let t=JSON.parse('{"/our-teams/:slug":"/our-team/:slug","/boutique-bridgeland-calgary-spa":"/locations/boutique-bridgeland-calgary-massage","/greenwich-calgary-spa":"/locations/greenwich-calgary-massage","/book-a-massage-in-winnipeg":"/book-your-appointment-winnipeg","/gift-card":"/gift-cards","/treatments/chiropractic":"/treatments","/category/:slug":"/our-wellness-journal","/team-category/:slug":"/our-team","/about-us/careers":"/careers","/about-us/gallery":"/gallery","/about-us/press-media":"/press-media","/couples-massage-calgary":"/treatments/massage/couples","/hot-stone-massage":"/treatments/massage/hot-stone","/hot-cold-jade-stone-massage":"/treatments/massage/hot-cold-jade-stone","/pre-post-natal-massage":"/treatments/massage/prenatal","/cupping-massage-calgary":"/treatments/massage/cupping","/reflexology":"/treatments/massage/reflexology","/location-pricing":"/locations","/date-night":"/treatments/massage/couples","/about-leela-eco-spa-calgary":"/about-us","/contact":"/contact-us","/our-treatments/natural-medicine-acupuncture":"/treatments/natural-medicine-acupuncture","/massage":"/treatments/massage","/esthetics":"/treatments/esthetics","/manicure-pedicure":"/treatments/esthetics","/calgary-massages-spa":"/treatments/massage","/locations/bankers-hall-calgary-spa":"/locations/bankers-hall-calgary-massage","/locations/beltline-calgary-spa":"/locations/beltline-calgary-massage","/locations/beltline-calgary-spa/gallery":"/locations/beltline-calgary-massage/gallery","/beltline-calgary-spa":"/locations/beltline-calgary-massage/gallery","/locations/boutique-bridgeland-calgary-spa":"/locations/boutique-bridgeland-calgary-massage","/locations/bridgeland-calgary-spa":"/locations/bridgeland-calgary-massage","/locations/bridgeland-calgary-spa/gallery":"/locations/bridgeland-calgary-massage/gallery","/bridgeland-calgary-spa":"/locations/bridgeland-calgary-massage/gallery","/locations/calgary-place-calgary-spa":"/locations/calgary-place-calgary-massage","/locations/calgary-place-calgary-spa/gallery":"/locations/calgary-place-calgary-massage/gallery","/calgary-place-calgary-spa":"/locations/calgary-place-calgary-massage/gallery","/locations/carrington-calgary-spa":"/locations/carrington-calgary-massage","/locations/carrington-calgary-spa/gallery":"/locations/carrington-calgary-massage/gallery","/carrington-calgary-spa":"/locations/carrington-calgary-massage/gallery","/locations/greenwich-calgary-spa":"/locations/greenwich-calgary-massage","/locations/legacy-township-calgary-spa":"/locations/legacy-township-calgary-massage","/locations/legacy-township-calgary-spa/gallery":"/locations/legacy-township-calgary-massage/gallery","/legacy-township-calgary-spa":"/locations/legacy-township-calgary-massage/gallery","/locations/marda-loop-calgary-spa":"/locations/marda-loop-calgary-massage","/locations/marda-loop-calgary-spa/gallery":"/locations/marda-loop-calgary-massage/gallery","/marda-loop-calgary-spa":"/locations/marda-loop-calgary-massage/gallery","/oakville-ontario":"/locations/town-square-oakville-spa"}');var o=l(1441);function s(a){if(!a||!/^(https?:)?\/\//i.test(a))return!1;let e=new URL(a,"https://leelaecospa.ca").hostname;return"leelaecospa.ca"!==e&&"www.leelaecospa.ca"!==e}function n(a){return a&&"#"!==a?s(a)?a:/^(?:mailto:|tel:|#)/i.test(a)||!["leelaecospa.ca","www.leelaecospa.ca"].includes(new URL(a,"https://leelaecospa.ca").hostname)?a:function(a){var e;let l=new URL(a,"https://leelaecospa.ca"),s=l.pathname.replace(/\/+$/,"")||"/";s=s.replace(/\/our-teams(?=\/|$)/g,"/our-team").replace(/(?:\/our-team){2,}/g,"/our-team");let n=o.find(a=>s==="/location-pricing/".concat(a.detailSlug));n&&(s="/locations/".concat(n.publicSlug));let i=o.find(a=>a.hasGallery&&s==="/".concat(a.publicSlug));return i&&(s="/locations/".concat(i.publicSlug,"/gallery")),s=null!=(e=t[s])?e:s,"".concat(s).concat(l.search).concat(l.hash)}(a):null}function i(a){var e;return null==a.href&&/popup|mindbody|book/i.test(null!=(e=a.behaviour)?e:"")}},2446:(a,e,l)=>{l.d(e,{BookingProvider:()=>w,B:()=>x});var t=l(5155),o=l(2115),s=l(63);let n=(a,e)=>"https://clients.mindbodyonline.com/classic/ws?studioid=".concat(a,"&stype=").concat(e),i=[{id:"calgary",name:"Calgary",blurb
1:"Nine locations across the city",locations:[{slug:"bankers-hall",name:"Bankers Hall",address:"201-315 8 Ave SW",href:n("8778","-117")},{slug:"beltline",name:"Beltline",address:"720 11 Ave SW",href:n("8778","-105")},{slug:"bridgeland",name:"Bridgeland",address:"849 1st Ave NE",href:n("8778","-108")},{slug:"calgary-place",name:"Calgary Place",address:"Unit 256, 414 3rd Street SW",href:n("8778","-104")},{slug:"carrington",name:"Carrington",address:"Unit 130, 159 Carrington Plaza NW",href:n("8778","-111")},{slug:"greenwich",name:"Greenwich",address:"Unit 120, 50 Greenbriar Dr NW",href:n("8778","-113")},{slug:"boutique-bridgeland",name:"Longevity — Bridgeland",address:"1028 Mcdougall Road NE",href:n("5753310","-103")},{slug:"legacy-township",name:"Legacy",address:"Unit 330, 80 Longview Common SE",href:n("8778","-109")},{slug:"marda-loop",name:"Marda Loop",address:"Unit 260, 2240 33 Ave SW",href:n("8778","-102")}]},{id:"oakville",name:"Oakville",blurb:"Towne Square retreat",locations:[{slug:"town-square-oakville-ontario",name:"Town Square",address:"Unit 1, 210 Lakeshore Rd E",href:"/book-your-appointment-oakville/"}]},{id:"winnipeg",name:"Winnipeg",blurb:"Seasons at Sterling Lyon",locations:[{slug:"winnipeg",name:"Seasons",address:"Unit 102, 645 Sterling Lyon Parkway",href:"/book-your-appointment-winnipeg/"}]}];n("5753310","-9"),n("5753310","-9"),n("5734873","-9"),n("8778","-9"),n("5721312","-9");let r=[{id:"calgary",name:"Calgary",blurb:"Valid at all Calgary locations",href:n("8778","42")},{id:"oakville",name:"Oakville",blurb:"Town Square",href:n("5721312","42")},{id:"winnipeg",name:"Winnipeg",blurb:"Seasons",href:n("5734873","42")}];r[0].href;let c=new Map(i.flatMap(a=>a.locations.map(a=>[a.slug,a])));var d=l(7650),u=l(1407),g=l(6497),p=l(7492),m=l(2262),h=l(5330),y=l(3998);function b(a){let{open:e,onClose:l,initialCityId:s=null}=a,n=(0,o.useId)(),r=(0,o.useRef)(null),c=(0,u.I)(),[b,f]=(0,o.useState)(!1),[k,w]=(0,o.useState)(null);if((0,y.u)(e,r),(0,o.useEffect)(()=>f(!0),[]),(0,o.useEffect)(()=>{if(e)if(s){var a;w(null!=(a=i.find(a=>a.id===s))?a:null)}else w(null)},[e,s]),(0,o.useEffect)(()=>{if(!e)return;let a=a=>{"Escape"===a.key&&l()};return window.addEventListener("keydown",a),()=>window.removeEventListener("keydown",a)},[e,l]),(0,o.useEffect)(()=>{if(!e||!r.current)return;let a=r.current.querySelector('button, [href], [tabindex]:not([tabindex="-1"])');null==a||a.focus()},[e,k]),!b)return null;let x=k?"locations":"cities";return(0,d.createPortal)((0,t.jsx)(g.N,{children:e?(0,t.jsxs)(p.P.div,{className:"book-modal",initial:{opacity:0}
1,animate:{opacity:1},exit:{opacity:0},transition:{duration:c?.01:.28,ease:h.jQ},children:[(0,t.jsx)("button",{type:"button",className:"book-modal__backdrop","aria-label":"Close booking",onClick:l}),(0,t.jsxs)(p.P.div,{ref:r,className:"book-modal__panel",role:"dialog","aria-modal":"true","aria-labelledby":n,initial:!c&&{opacity:0,y:28},animate:{opacity:1,y:0},exit:c?void 0:{opacity:0,y:16},transition:{duration:.38,ease:h.jQ},children:[(0,t.jsxs)("header",{className:"book-modal__head",children:[(0,t.jsxs)("div",{className:"book-modal__head-main",children:[k?(0,t.jsxs)("button",{type:"button",className:"book-modal__back",onClick:()=>w(null),children:[(0,t.jsx)(m.Icon,{icon:"ph:arrow-left",width:"1.1em",height:"1.1em","aria-hidden":!0}),"Cities"]}):(0,t.jsx)("p",{className:"book-modal__eyebrow",children:"Book a visit"}),(0,t.jsx)("h2",{id:n,className:"book-modal__title",children:k?k.name:"Where would you like to book?"}),(0,t.jsx)("p",{className:"book-modal__support",children:k?"oakville"===k.id?"Choose Town Square to open the Oakville booking page.":"winnipeg"===k.id?"Choose Seasons to open the Winnipeg booking page.":"Choose a location — scheduling opens in a new tab.":"Select a city, then your preferred Leela location."})]}),(0,t.jsx)("button",{type:"button",className:"book-modal__close","aria-label":"Close",onClick:l,children:(0,t.jsx)(m.Icon,{icon:"ph:x",width:"1.35em",height:"1.35em","aria-hidden":!0})})]}),(0,t.jsx)("div",{className:"book-modal__body","data-step":x,children:(0,t.jsx)(g.N,{mode:"wait",initial:!1,children:k?(0,t.jsx)(p.P.ol,{className:"book-modal__locs",initial:!c&&{opacity:0,x:16},animate:{opacity:1,x:0},exit:c?void 0:{opacity:0,x:16},transition:{duration:.28,ease:h.jQ},children:k.locations.map(a=>{let e=/^https?:/i.test(a.href);return(0,t.jsx)("li",{children:(0,t.jsxs)("a",{href:a.href,...e?{target:"_blank",rel:"noopener noreferrer"}:{},className:"book-modal__loc",onClick:l,children:[(0,t.jsxs)("span",{className:"book-modal__loc-copy",children:[(0,t.jsxs)("span",{className:"book-modal__loc-row",children:[(0,t.jsx)("span",{className:"book-modal__loc-name",children:a.name}),a.status?(0,t.jsx)("span",{className:"book-modal__loc-tag",children:a.status}):null]}),(0,t.jsx)("span",{className:"book-modal__loc-addr",children:a.address})]}),(0,t.jsx)("span",{className:"book-modal__loc-go","aria-hidden":!0,children:(0,t.jsx)(m.Icon,{icon:e?"ph:arrow-up-right":"ph:arrow-right",width:"1.2em",height:"1.2em"})})]})},a.slug)})},k.id):(0,t.jsx)(p.P.ul,{className:"book-modal__cities",role:"list",initial:!c&&{opacity:0,x:-12},animate:{opacity:1,x:0},exit:c?void 0:{opacity:0,x:-12},transition:{duration:.28,ease:h.jQ},children:i.map(a=>(0,t.jsx)("li",{children:(0,t.jsxs)("button",{type:"button",className:"book-modal__city",onClick:()=>w(a),children:[(0,t.jsxs)("span",{className:"book-modal__city-copy",children:[(0,t.jsx)("span",{className:"book-modal__city-name",children:a.name}),(0,t.jsxs)("span",{className:"book-modal__city-meta",children:[a.blurb,(0,t.jsxs)("span",{className:"book-modal__city-count","aria-hidden":!0,children:[a.locations.length," ",1===a.locations.length?"location":"locations"]})]})]}),(0,t.jsx)(m.Icon,{icon:"ph:arrow-right",className:"book-modal__city-arrow",width:"1.35em",height:"1.35em","aria-hidden":!0})]})},a.id))},"cities")})})]})]}):null}),document.body)}function f(a){let{open:e,onClose:l}=a,s=(0,o.useId)(),n=(0,o.useRef)(null),i=(0,u.I)(),[c,b]=(0,o.useState)(!1);return((0,y.u)(e,n),(0,o.useEffect)(()=>b(!0),[]),(0,o.useEffect)(()=>{if(!e)return;let a=a=>{"Escape"===a.key&&l()};return window.addEventListener("keydown",a),()=>window.removeEventListener("keydown",a)},[e,l]),(0,o.useEffect)(()=>{if(!e||!n.current)return;let a=n.current.querySelector('button, [href], [tabindex]:not([tabindex="-1"])');null==a||a.focus()},[e]),c)?(0,d.createPortal)((0,t.jsx)(g.N,{children:e?(0,t.jsxs)(p.P.div,{className:"book-modal",initial:{opacity:0}
1,animate:{opacity:1},exit:{opacity:0},transition:{duration:i?.01:.28,ease:h.jQ},children:[(0,t.jsx)("button",{type:"button",className:"book-modal__backdrop","aria-label":"Close gift cards",onClick:l}),(0,t.jsxs)(p.P.div,{ref:n,className:"book-modal__panel",role:"dialog","aria-modal":"true","aria-labelledby":s,initial:!i&&{opacity:0,y:28},animate:{opacity:1,y:0},exit:i?void 0:{opacity:0,y:16},transition:{duration:.38,ease:h.jQ},children:[(0,t.jsxs)("header",{className:"book-modal__head",children:[(0,t.jsxs)("div",{className:"book-modal__head-main",children:[(0,t.jsx)("p",{className:"book-modal__eyebrow",children:"Gift cards"}),(0,t.jsx)("h2",{id:s,className:"book-modal__title",children:"Where will they redeem it?"}),(0,t.jsx)("p",{className:"book-modal__support",children:"Choose a city — purchasing opens in a new tab. Cards are valid across Leela locations and never expire."})]}),(0,t.jsx)("button",{type:"button",className:"book-modal__close","aria-label":"Close",onClick:l,children:(0,t.jsx)(m.Icon,{icon:"ph:x",width:"1.35em",height:"1.35em","aria-hidden":!0})})]}),(0,t.jsx)("div",{className:"book-modal__body",children:(0,t.jsx)("ul",{className:"book-modal__cities",role:"list",children:r.map(a=>(0,t.jsx)("li",{children:(0,t.jsxs)("a",{href:a.href,target:"_blank",rel:"noopener noreferrer",className:"book-modal__city",onClick:l,children:[(0,t.jsxs)("span",{className:"book-modal__city-copy",children:[(0,t.jsx)("span",{className:"book-modal__city-name",children:a.name}),(0,t.jsx)("span",{className:"book-modal__city-meta",children:a.blurb})]}),(0,t.jsx)("span",{className:"book-modal__loc-go","aria-hidden":!0,children:(0,t.jsx)(m.Icon,{icon:"ph:arrow-up-right",width:"1.2em",height:"1.2em"})})]})},a.id))})})]})]}):null}),document.body):null}let k=(0,o.createContext)(null);function w(a){let{children:e}=a,l=(0,s.useRouter)(),[n,i]=(0,o.useState)(!1),[r,d]=(0,o.useState)(!1),[u,g]=(0,o.useState)(null),p=(0,o.useCallback)(a=>{var e,t;if(null==a?void 0:a.locationSlug){let e=(t=a.locationSlug,c.get(t));if(e){d(!1),i(!1),function(a,e){if(/^https?:/i.test(a))return window.open(a,"_blank","noopener,noreferrer");e.push(a)}(e.href,l);return}}d(!1),g(null!=(e=null==a?void 0:a.cityId)?e:null),i(!0)},[l]),m=(0,o.useCallback)(()=>{i(!1)},[]),h=(0,o.useCallback)(()=>{i(!1),d(!0)},[]),y=(0,o.useCallback)(()=>{d(!1)},[]),w=n||r;(0,o.useEffect)(()=>{if(!w)return;let a=document.body.style.overflow;return document.body.style.overflow="hidden",()=>{document.body.style.overflow=a}},[w]);let x=(0,o.useMemo)(()=>({openBooking:p,closeBooking:m,openGiftCards:h,closeGiftCards:y,isOpen:n,isGiftOpen:r}),[p,m,h,y,n,r]);return(0,t.jsxs)(k.Provider,{value:x,children:[e,(0,t.jsx)(b,{open:n,initialCityId:u,onClose:m}),(0,t.jsx)(f,{open:r,onClose:y})]})}function x(){let a=(0,o.useContext)(k);if(!a)throw Error("useBooking must be used within BookingProvider");return a}},3998:(a,e,l)=>{l.d(e,{u:()=>o});var t=l(2115);function o(a,e){(0,t.useEffect)(()=>{if(!a)return;let l=document.activeElement instanceof HTMLElement?document.activeElement:null,t=a=>{if("Tab"!==a.key)return;let l=e.current;if(!l)return;let t=[...l.querySelectorAll('a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])')].filter(a=>a.tabIndex>=0&&a.getClientRects().length>0),o=t[0],s=t.at(-1);if(!o||!s)return void a.preventDefault();let n=document.activeElement;l.contains(n)&&(a.shiftKey?n!==o:n!==s)||(a.preventDefault(),(a.shiftKey?s:o).focus())};return document.addEventListener("keydown",t),()=>{document.removeEventListener("keydown",t),(null==l?void 0:l.isConnected)&&l.focus({preventScroll:!0})}},[a,e])}},5142:(a,e,l)=>{l.d(e,{i:()=>r});var t=l(5155),o=l(2619),s=l.n(o),n=l(1686);let i={plain:"",underline:"link",muted:"link link--muted",clay:"link link--clay",arrow:"link-arrow"};function r(a){var e;let{href:l,variant:o="plain",className:r="",children:c,...d}=a,u=[i[o],r].filter(Boolean).join(" ");if((0,n.ge)(l)||/^(mailto:|tel:)/i.test(l)){let a=/^(mailto:|tel:)/i.test(l);return(0,t.jsxs)("a",{href:l,className:u,...a?{}:{target:"_blank",rel:"noopener noreferrer"},...d,children:[c,"arrow"===o&&(0,t.jsx)("span",{"aria-hidden":"true",className:"link-arrow__glyph",children:"↗"})]})}let g=null!=(e=(0,n.ah)(l))?e:"/";return(0,t.jsxs)(s(),{href:g,className:u,...d,children:[c,"arrow"===o&&(0,t.jsx)("span",{"aria-hidden":"true",className:"link-arrow__glyph",children:"→"})]})}},5330:(a,e,l)=>{l.d(e,{jQ:()=>t.REVEAL_EASE,gN:()=>t.Reveal}),l(5155),l(2262),l(579);var t=l(8020);l(2619),l(1686),l(5142)},8020:(a,e,l)=>{l.r(e),l.d(e,{REVEAL_DURATION:()=>i,REVEAL_EASE:()=>n,Reveal:()=>c});var t=l(5155),o=l(2115),s=l(7492);let n=[.16,1,.3,1],i=1,r={div:s.P.div,section:s.P.section,span:s.P.span,ul:s.P.ul,li:s.P.li};function c(a){var e;let{children:l,delay:c=0,as:d="div",className:u,once:g=!0}=a,p=!!u&&u.split(/\s+/).includes("reveal-bare"),m=(0,o.useRef)(null),[h,y]=(0,o.useState)(!0);if((0,o.useEffect)(()=>
1{if(!p)return;let a=m.current;if(!a)return;if("undefined"==typeof IntersectionObserver)return void y(!0);let e=new IntersectionObserver(a=>{for(let l of a)l.isIntersecting?(y(!0),g&&e.disconnect()):g||y(!1)},{rootMargin:"0px 0px -12% 0px",threshold:.08});return e.observe(a),()=>e.disconnect()},[p,g]),p)return(0,t.jsx)(d,{ref:m,"data-reveal":h?"in":"out",className:u,children:l});let b=null!=(e=r[d])?e:s.P.div;return(0,t.jsx)(b,{className:u,initial:!1,whileInView:{opacity:1,y:0},viewport:{once:g,amount:.18,margin:"0px 0px -8% 0px"},transition:{duration:i,ease:n,delay:c/1e3,opacity:{duration:.85*i}},children:l})}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.