@forgebuild/hotal-ui 0.23.204 → 0.24.1

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.
Files changed (45) hide show
  1. package/README.md +18 -1
  2. package/dist/components/ai-chat-widget.js +4 -4
  3. package/dist/components/availability-calendar.js +2 -2
  4. package/dist/components/booking-card.js +2 -2
  5. package/dist/components/booking-checkout.js +2 -2
  6. package/dist/components/booking-confirmed.js +1 -1
  7. package/dist/components/booking-flow.js +2 -2
  8. package/dist/components/booking-progress-bar.js +1 -1
  9. package/dist/components/booking-summary.js +2 -2
  10. package/dist/components/chunks/client-DNa0V682.js +3 -0
  11. package/dist/components/confirmation-card.js +2 -2
  12. package/dist/components/dining-teaser.js +2 -2
  13. package/dist/components/event-contact-form.js +2 -2
  14. package/dist/components/event-inquiries-feed.js +2 -2
  15. package/dist/components/extras-catalogue.js +2 -2
  16. package/dist/components/floor-plan-hero.js +2 -2
  17. package/dist/components/google-reviews.js +2 -2
  18. package/dist/components/instagram-feed.js +2 -2
  19. package/dist/components/island-map.js +1 -1
  20. package/dist/components/live-dining-orders-feed.js +2 -2
  21. package/dist/components/live-golf-bookings-feed.js +2 -2
  22. package/dist/components/live-reservations-feed.js +2 -2
  23. package/dist/components/live-room-bookings-feed.js +2 -2
  24. package/dist/components/live-shop-orders-feed.js +2 -2
  25. package/dist/components/live-spa-bookings-feed.js +2 -2
  26. package/dist/components/menu-section.js +13 -7
  27. package/dist/components/proshop-catalogue.js +2 -2
  28. package/dist/components/reservation-bar.js +2 -2
  29. package/dist/components/reservation-cancel.js +2 -2
  30. package/dist/components/restaurant-order-form.js +2 -2
  31. package/dist/components/room-grid.js +2 -2
  32. package/dist/components/searchable-select.js +2 -2
  33. package/dist/components/service-booking-bar.js +2 -2
  34. package/dist/components/spa-booking-widget.js +207 -207
  35. package/dist/components/stay-search.js +2 -2
  36. package/dist/components/tripadvisor-reviews.js +2 -2
  37. package/dist/components/venue-carousel.js +2 -2
  38. package/dist/hotal-ui.js +7440 -7215
  39. package/dist/index.d.ts +53 -2
  40. package/dist/server/index.d.ts +11 -0
  41. package/dist/server/index.js +34 -0
  42. package/dist/server/menu-section.js +944 -0
  43. package/dist/server/menu-section.meta.js +2 -0
  44. package/package.json +8 -2
  45. package/dist/components/chunks/client-BDk8LqGN.js +0 -3
@@ -1,207 +1,207 @@
1
- import{$ as e,A as t,B as n,D as r,E as i,H as a,I as o,J as s,K as c,L as l,M as u,N as d,P as f,S as p,T as m,U as h,V as g,W as _,X as v,Y as y,Z as b,_ as x,et as S,f as C,h as w,i as T,j as E,n as D,nt as ee,o as te,q as O,r as ne,rt as re,s as k,t as ie,tt as ae,v as oe,w as A,x as se,y as j,z as M}from"./chunks/client-BDk8LqGN.js";import{a as ce,i as le,n as ue,r as de,t as fe}from"./chunks/floating-ui.dom-DY3dGoEq.js";import{i as pe,n as me,o as he,r as ge,s as _e,t as ve}from"./chunks/calendar-B8eNjUm2.js";import{t as ye}from"./chunks/stripe-BjXf5ZQJ.js";import{t as be}from"./chunks/preload-helper-Czpn1I53.js";var xe=e=>e;function Se(e,{delay:t=0,duration:n=400,easing:r=xe}={}){let i=+getComputedStyle(e).opacity;return{delay:t,duration:n,easing:r,css:e=>`opacity: ${e*i}`}}var Ce=r(`<strong class="svelte-1dxdgqu"> </strong>`),we=r(`<span class="svelte-1dxdgqu"> </span>`),Te=r(`<div class="sbw-summary-row sbw-summary-row-sub svelte-1dxdgqu"><span class="svelte-1dxdgqu"> </span> <!></div>`),Ee=r(`<div class="sbw-summary-row sbw-summary-row-sub svelte-1dxdgqu"><span class="svelte-1dxdgqu"> </span> <span class="svelte-1dxdgqu"> </span></div>`),De=r(`<span class="sbw-time-flash svelte-1dxdgqu"> </span>`),Oe=r(`<div class="sbw-summary-row sbw-summary-row-sub sbw-summary-row-datetime svelte-1dxdgqu"><span class="svelte-1dxdgqu"> </span> <!></div>`),ke=r(`<div class="sbw-summary-row sbw-summary-row-sub svelte-1dxdgqu"><span class="svelte-1dxdgqu"> </span> <span class="sbw-summary-row-bookedat-value svelte-1dxdgqu"> </span></div>`),Ae=r(`<div class="sbw-summary-total svelte-1dxdgqu"><span class="svelte-1dxdgqu"> </span> <strong class="svelte-1dxdgqu"> </strong></div>`),je=r(`<span class="sbw-spinner svelte-1dxdgqu"></span>`),Me=r(`<p class="sbw-hint svelte-1dxdgqu"> </p>`),Ne=r(`<p class="sbw-error-text svelte-1dxdgqu"> </p>`),Pe=r(`<button type="button" class="sbw-continue svelte-1dxdgqu"><!> <span class="svelte-1dxdgqu"> </span></button> <!> <!>`,1),Fe=r(`<button type="button" class="sbw-continue svelte-1dxdgqu"> </button> <button type="button" class="sbw-back sbw-back-service svelte-1dxdgqu"> </button>`,1),Ie=r(`<button type="submit" class="sbw-submit svelte-1dxdgqu"><!> <span class="svelte-1dxdgqu"> </span></button> <!> <button type="button" class="sbw-back sbw-back-service svelte-1dxdgqu"> </button>`,1),Le=r(`<aside class="sbw-summary svelte-1dxdgqu"><div class="sbw-summary-row svelte-1dxdgqu"><span class="svelte-1dxdgqu"> </span> <!></div> <!> <!> <!> <!> <!> <!></aside>`),Re=r(`<img class="sbw-logo svelte-1dxdgqu" alt=""/>`),ze=r(`<h2 class="sbw-heading svelte-1dxdgqu"> </h2> <div class="sbw-rule svelte-1dxdgqu"></div>`,1),Be=r(`<p class="sbw-tagline svelte-1dxdgqu"> </p>`),Ve=r(`<p class="sbw-description svelte-1dxdgqu"> </p>`),He=r(`<div class="sbw-intro svelte-1dxdgqu"><!> <!> <!> <!></div>`),Ue=r(`<span class="sbw-service-sub svelte-1dxdgqu"> </span>`),We=r(`<span class="sbw-service-prices svelte-1dxdgqu"><span class="sbw-service-price svelte-1dxdgqu"> </span> <!></span>`),Ge=r(`<li class="svelte-1dxdgqu"><button type="button" class="sbw-service-item svelte-1dxdgqu"><span class="sbw-service-name svelte-1dxdgqu"> <!></span> <!></button></li>`),Ke=r(`<ul class="sbw-service-list svelte-1dxdgqu" role="list"></ul>`),qe=r(`<div class="sbw-body svelte-1dxdgqu"><h3 class="sbw-step-title svelte-1dxdgqu"> </h3> <!></div>`),Je=r(`<li role="presentation" class="svelte-1dxdgqu"><button type="button" role="option" class="svelte-1dxdgqu"> </button></li>`),Ye=r(`<div class="sbw-therapist-filter svelte-1dxdgqu"><span class="sbw-visually-hidden svelte-1dxdgqu" id="sbw-therapist-filter-label"> </span> <button type="button" class="sbw-therapist-filter-trigger svelte-1dxdgqu" aria-haspopup="listbox" aria-labelledby="sbw-therapist-filter-label"><span class="svelte-1dxdgqu"> </span> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M6 9l6 6 6-6" stroke-linecap="round" stroke-linejoin="round" class="svelte-1dxdgqu"></path></svg></button> <ul popover="" role="listbox" class="sbw-therapist-filter-panel svelte-1dxdgqu"><li role="presentation" class="svelte-1dxdgqu"><button type="button" role="option" class="svelte-1dxdgqu"> </button></li> <!></ul></div>`),Xe=r(`<span></span>`),Ze=r(`<button type="button"><span class="svelte-1dxdgqu"> </span> <!></button>`),Qe=r(`<button type="button"> </button>`),$e=r(`<div class="sbw-slot-group svelte-1dxdgqu"><p class="sbw-slot-group-label svelte-1dxdgqu"> </p> <div class="sbw-slot-buttons svelte-1dxdgqu"></div></div>`),et=r(`<div class="sbw-slot-groups svelte-1dxdgqu"></div>`),tt=r(`<div class="sbw-body sbw-datetime svelte-1dxdgqu"><div class="sbw-calendar-col svelte-1dxdgqu"><div class="sbw-cal-body svelte-1dxdgqu"><div class="sbw-cal-header svelte-1dxdgqu"><p class="sbw-cal-month svelte-1dxdgqu"> </p> <!> <div class="sbw-cal-nav svelte-1dxdgqu"><button type="button" class="svelte-1dxdgqu">‹</button> <button type="button" class="svelte-1dxdgqu">›</button></div></div> <div class="sbw-cal-weekdays svelte-1dxdgqu"></div> <div class="sbw-cal-grid svelte-1dxdgqu"></div></div> <div class="sbw-slots svelte-1dxdgqu"><!></div></div> <!></div>`),nt=r(`<span class="sbw-payment-amount svelte-1dxdgqu"> </span>`),rt=r(`<p class="sbw-payment-hint svelte-1dxdgqu"> </p>`),it=r(`<div class="sbw-payment svelte-1dxdgqu"><div class="sbw-payment-header svelte-1dxdgqu"><span class="sbw-label svelte-1dxdgqu"> </span> <!></div> <div class="sbw-payment-slot-anchor svelte-1dxdgqu"></div> <!> <!></div>`),at=r(`<form class="sbw-body sbw-datetime sbw-details svelte-1dxdgqu"><div class="sbw-details-fields svelte-1dxdgqu"><div class="sbw-grid svelte-1dxdgqu"><label class="sbw-field svelte-1dxdgqu"><span class="sbw-label svelte-1dxdgqu"> </span> <input type="text" required="" class="svelte-1dxdgqu"/></label> <label class="sbw-field svelte-1dxdgqu"><span class="sbw-label svelte-1dxdgqu"> </span> <input type="email" pattern="[^\\s@]+@[^\\s@]+\\.[^\\s@]+" class="svelte-1dxdgqu"/></label> <label class="sbw-field svelte-1dxdgqu"><span class="sbw-label svelte-1dxdgqu"> </span> <input type="tel" class="svelte-1dxdgqu"/></label></div> <label class="sbw-field sbw-notes-field svelte-1dxdgqu"><span class="sbw-label svelte-1dxdgqu"> </span> <textarea rows="3" class="svelte-1dxdgqu"></textarea></label> <!></div> <!></form>`),ot=r(`<div class="sbw-success svelte-1dxdgqu"><div class="sbw-success-icon svelte-1dxdgqu"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" class="svelte-1dxdgqu"><path d="M5 13l4 4L19 7" stroke-linecap="round" stroke-linejoin="round" class="svelte-1dxdgqu"></path></svg></div> <p class="svelte-1dxdgqu"> </p> <!></div>`),st=r(`<section class="sbw-root svelte-1dxdgqu"><!> <!></section>`),ct={hash:`svelte-1dxdgqu`,code:`.sbw-root.svelte-1dxdgqu {display:block;
2
- /* Every layout breakpoint below is a container query against this box,
3
- not the viewport. The widget is embedded in host layouts -- a narrow
4
- column beside a summary card, a modal -- where the viewport says
5
- nothing useful about the room it actually has; sized from the
6
- viewport it laid out a wide-screen grid inside a ~700px column and
7
- overflowed. Inline-size containment also stops the widget handing
8
- its contents' min-content width up to the host. */container:sbw / inline-size;font-family:inherit;color:var(--sbw-text-color, #1a1a1a);background:var(--sbw-bg, #faf6ec);padding:var(--sbw-padding, 4rem 1.5rem);}.sbw-intro.svelte-1dxdgqu {max-width:var(--sbw-intro-max-width, 36rem);margin:0 auto;text-align:center;}.sbw-logo.svelte-1dxdgqu {height:var(--sbw-logo-height, 2.5rem);width:auto;margin:0 auto 1.5rem;display:block;}.sbw-heading.svelte-1dxdgqu {margin:0;font-size:2rem;font-family:var(--sbw-heading-font-family, inherit);}
9
- @container sbw (min-width: 640px) {.sbw-heading.svelte-1dxdgqu {font-size:2.5rem;}
10
- }.sbw-rule.svelte-1dxdgqu {width:4rem;height:1px;margin:1rem auto 0;background:var(--sbw-rule-color, rgba(196, 158, 90, 0.5));}.sbw-tagline.svelte-1dxdgqu {margin:1.5rem 0 0;font-style:italic;font-size:1.125rem;}.sbw-description.svelte-1dxdgqu {margin:1rem 0 0;font-size:1rem;line-height:1.6;}
11
- /* Matches .sbw-heading/.sbw-description above so a host that slots its
12
- own heading/description (instead of the heading/description attributes)
13
- gets the same look for free -- targeted by the slot attribute, not a
14
- class, so it works no matter what element or class the host uses. */::slotted([slot='heading']) {margin:0;font-size:2rem;font-family:var(--sbw-heading-font-family, inherit);}
15
- @container sbw (min-width: 640px) {::slotted([slot='heading']) {font-size:2.5rem;}
16
- }::slotted([slot='description']) {margin:1rem 0 0;font-size:1rem;line-height:1.6;}.sbw-body.svelte-1dxdgqu {max-width:var(--sbw-form-max-width, 40rem);margin:var(--sbw-body-margin-top, 3rem) auto 0;}.sbw-step-title.svelte-1dxdgqu {margin:0 0 1.25rem;font-size:0.75rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;opacity:0.6;}.sbw-hint.svelte-1dxdgqu {margin:0;font-size:0.875rem;opacity:0.6;}
17
-
18
- /* --- Service list --- */.sbw-service-list.svelte-1dxdgqu {list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:0.5rem;}.sbw-service-item.svelte-1dxdgqu {width:100%;display:flex;align-items:center;justify-content:space-between;gap:1rem;border-radius:2px;border:1px solid var(--sbw-border-color, rgba(0, 0, 0, 0.15));background:var(--sbw-input-bg, #fff);padding:0.9rem 1.1rem;font:inherit;font-size:0.9375rem;color:inherit;cursor:pointer;text-align:left;transition:border-color 150ms ease, background-color 150ms ease, transform 150ms ease;}.sbw-service-item.svelte-1dxdgqu:hover:not(:disabled) {border-color:color-mix(in oklab, var(--sbw-text-color, #1a1a1a) 40%, transparent);background:var(--sbw-service-hover-bg, rgba(0, 0, 0, 0.03));color:var(--sbw-service-hover-color, inherit);transform:translateX(2px);}.sbw-service-price.svelte-1dxdgqu {font-weight:600;color:var(--sbw-accent-color, #c49e5a);}.sbw-service-item.svelte-1dxdgqu:hover:not(:disabled) .sbw-service-price:where(.svelte-1dxdgqu) {color:var(--sbw-service-hover-price-color, var(--sbw-accent-color, #c49e5a));}
19
- /* A regulars-only service the visitor doesn't qualify for: still listed
20
- (so they know it exists), dimmed like the calendar's unavailable days. */.sbw-service-item.svelte-1dxdgqu:disabled {cursor:default;opacity:0.5;}.sbw-service-name.svelte-1dxdgqu,
21
- .sbw-service-prices.svelte-1dxdgqu {display:flex;flex-direction:column;gap:0.15rem;}.sbw-service-prices.svelte-1dxdgqu {align-items:flex-end;flex-shrink:0;text-align:right;}.sbw-service-sub.svelte-1dxdgqu {font-size:0.8125rem;font-weight:400;opacity:0.7;}
22
-
23
- /* --- Datetime step: two-column layout, single column when narrow --- */.sbw-datetime.svelte-1dxdgqu {display:grid;grid-template-columns:1fr;gap:2rem;max-width:var(--sbw-datetime-max-width, 52rem);
24
- /* A second container, because the calendar/slots split below depends on
25
- what the calendar column gets rather than on the whole widget: this
26
- row is capped by --sbw-datetime-max-width and gives 16rem of itself
27
- to the summary, so the root's width alone cannot answer it. */container:sbw-dt / inline-size;}
28
- /* 38rem is what this actually needs: 20rem of calendar (the same comfortable
29
- minimum the split below uses) + the 16rem summary + the 2rem between them.
30
- No padding term -- an inline-size container is measured on its content
31
- box, so the root's own padding is already out of this number. The old
32
- 800px was a viewport figure and far too conservative once measured
33
- against the widget instead: it stacked the summary under a widget with
34
- room to spare. */
35
- @container sbw (min-width: 38rem) {.sbw-datetime.svelte-1dxdgqu {grid-template-columns:1fr 16rem;align-items:start;}
36
- }
37
- /* Calendar and slots side by side (not stacked) once there's room for
38
- both plus the 16rem summary column -- a plain calendar-then-slots
39
- stack read as a long, sparse list. .sbw-cal-body wraps the weekday
40
- labels + day grid into one grid item (rather than giving them each
41
- their own template row) so its height is independent of how tall
42
- .sbw-slots is -- with each in its own row instead, a long slots
43
- list (a busy day can have 20+ times) inflated the *shared* row
44
- tracks and pushed the day grid visually away from its own weekday
45
- header. Slots gets the flexible remaining column so extra width
46
- goes into more time-chip columns instead of unused space; the
47
- calendar gets a comfortable range (not a single fixed number) so it
48
- can grow a little on very wide hosts instead of looking squashed
49
- next to a much wider slots column, while still stopping well short
50
- of the dead-space-between-date-numbers stretching a bare 1fr gave it. */
51
- /* 54rem is the width this split actually needs, not a round number: the
52
- calendar's own minimum (20rem) plus the slots column's (14rem) plus the
53
- 2rem between them is 36rem, and in two-column mode this row has already
54
- given 16rem + 2rem to the summary. Below it the two stack instead, which
55
- is why the query is on the row rather than on the root -- a wide page
56
- with a narrow widget must still stack. Note the 52rem default cap on
57
- --sbw-datetime-max-width is under this, so a host wanting the calendar
58
- and slots side by side has to raise it. */
59
- @container sbw-dt (min-width: 54rem) {.sbw-calendar-col.svelte-1dxdgqu {display:grid;grid-template-columns:minmax(20rem, 28rem) minmax(14rem, 1fr);grid-template-areas:'body slots';column-gap:2rem;align-items:start;}.sbw-cal-body.svelte-1dxdgqu {grid-area:body;}.sbw-slots.svelte-1dxdgqu {grid-area:slots;}
60
- /* Extra specificity (not just .sbw-slots) so this reliably beats the
61
- unconditional base rule below regardless of source order -- the
62
- top border/margin/padding there exists to separate slots from a
63
- calendar stacked *above* it on narrow/mobile widths; side by side,
64
- it read as a stray line with nothing for it to separate. */.sbw-calendar-col.svelte-1dxdgqu .sbw-slots:where(.svelte-1dxdgqu) {margin-top:0;border-top:none;padding-top:0;}
65
- }.sbw-cal-header.svelte-1dxdgqu {display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:0.5rem;}.sbw-cal-month.svelte-1dxdgqu {margin:0;font-size:1rem;font-weight:600;}.sbw-visually-hidden.svelte-1dxdgqu {position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;}.sbw-therapist-filter.svelte-1dxdgqu {position:relative;}.sbw-therapist-filter-trigger.svelte-1dxdgqu {display:flex;align-items:center;gap:0.5rem;border-radius:9999px;border:2px solid var(--sbw-border-color, rgba(0, 0, 0, 0.15));background:var(--sbw-input-bg, #fff);color:inherit;font:inherit;font-size:0.8125rem;padding:0.4rem 0.85rem;cursor:pointer;transition:border-color 320ms ease-out;}.sbw-therapist-filter-trigger.svelte-1dxdgqu:hover,
66
- .sbw-therapist-filter-trigger.svelte-1dxdgqu:focus-visible {border-color:var(--sbw-accent-color, #c49e5a);outline:none;}.sbw-chevron.svelte-1dxdgqu {width:1rem;height:1rem;flex-shrink:0;opacity:0.6;transition:transform 200ms ease;}.sbw-chevron-open.svelte-1dxdgqu {transform:rotate(180deg);}
67
- /* Native <select> option lists can't be styled -- they render as the
68
- browser's own unthemed popup regardless of any CSS here, which read
69
- as a jarring plain-white box against a themed (esp. dark) host page.
70
- This is a real listbox (button + popover), styled as a proper
71
- floating panel: opaque fill (not the translucent --sbw-input-bg
72
- inputs use, which assumes a solid page behind it -- this overlays
73
- arbitrary content) with an accent-tinted border and glow instead of
74
- a flat neutral edge. The 30%/25% mix amounts aren't picked to taste --
75
- they're the same two fixed proportions this library's other floating
76
- panels use for an accent border + glow (not a third, invented
77
- opacity), so re-skinning --sbw-accent-color still lands on a
78
- consistent-looking panel instead of a one-off tint. */.sbw-therapist-filter-panel.svelte-1dxdgqu {position:fixed;inset:auto;margin:0;min-width:9rem;max-height:15rem;overflow:auto;list-style:none;padding:0.25rem;border-radius:10px;border:1px solid color-mix(in oklab, var(--sbw-accent-color, #c49e5a) 30%, transparent);background:var(--sbw-bg, #faf6ec);box-shadow:0 8px 24px rgba(0, 0, 0, 0.16), 0 0 24px color-mix(in oklab, var(--sbw-accent-color, #c49e5a) 25%, transparent);}.sbw-therapist-filter-panel.svelte-1dxdgqu button:where(.svelte-1dxdgqu) {display:block;width:100%;border:none;border-radius:6px;background:transparent;color:inherit;font:inherit;text-align:left;padding:0.5rem 0.75rem;font-size:0.8125rem;cursor:pointer;}.sbw-therapist-filter-panel.svelte-1dxdgqu button:where(.svelte-1dxdgqu):hover,
79
- .sbw-therapist-filter-panel.svelte-1dxdgqu button[aria-selected='true']:where(.svelte-1dxdgqu) {background:color-mix(in oklab, var(--sbw-accent-color, #c49e5a) 15%, transparent);}.sbw-cal-nav.svelte-1dxdgqu {display:flex;gap:0.25rem;}.sbw-cal-nav.svelte-1dxdgqu button:where(.svelte-1dxdgqu) {position:relative;z-index:0;display:flex;height:2.75rem;width:2.75rem;align-items:center;justify-content:center;border-radius:9999px;border:2px solid var(--sbw-cal-nav-border-color, var(--sbw-border-color, rgba(0, 0, 0, 0.15)));background:none;color:var(--sbw-text-color, #1a1a1a);font-size:1.375rem;cursor:pointer;transition:border-color 320ms ease-out, color 320ms ease-out;}
80
- /* A fill growing from the button's centre (clip-path), not a flat
81
- colour cross-fade -- matches this library's other circular nav
82
- control (VenueCarousel's prev/next). Separate hook from
83
- --sbw-cal-hover-bg (the day-cell hover fill) on purpose: a consumer
84
- whose day-cell text needs that fill to stay same-color-as-background
85
- invisible (see mens-cave-barbers) still wants these nav buttons --
86
- icon glyphs, not text that could vanish -- to invert fully on hover.
87
- Falls back to the day-cell variable, then the original hardcoded
88
- tint, so existing consumers see no change. */.sbw-cal-nav.svelte-1dxdgqu button:where(.svelte-1dxdgqu)::before {content:'';position:absolute;inset:0;z-index:-1;border-radius:inherit;background:var(--sbw-cal-nav-hover-bg, var(--sbw-cal-hover-bg, color-mix(in oklab, var(--sbw-text-color, #1a1a1a) 6%, transparent)));clip-path:circle(0% at 50% 50%);transition:clip-path 800ms cubic-bezier(0.16, 1, 0.3, 1);}.sbw-cal-nav.svelte-1dxdgqu button:where(.svelte-1dxdgqu):hover:not(:disabled) {border-color:var(--sbw-cal-nav-hover-border-color, var(--sbw-accent-color, #c49e5a));color:var(--sbw-cal-nav-hover-color, var(--sbw-text-color, #1a1a1a));}.sbw-cal-nav.svelte-1dxdgqu button:where(.svelte-1dxdgqu):hover:not(:disabled)::before {clip-path:circle(150% at 50% 50%);}
89
- /* The click-pulse (below) is this button's whole click-confirmation --
90
- no separate :active press state, so the two don't stack into a
91
- double-bounce (shrink-on-press, then the pulse's own scale-up).
92
- :global() on the pulse class itself -- it's only ever added via
93
- classList.add() in pulseNavButton above, never as a literal class
94
- in this template, so Svelte's unused-CSS pruning silently deleted
95
- this whole rule (keeping the @keyframes, which isn't pruned the
96
- same way) without :global() marking it as intentionally dynamic. */
97
- @keyframes svelte-1dxdgqu-sbw-cal-nav-pulse {
98
- 0% { transform: scale(1); }
99
- 50% { transform: scale(1.18); }
100
- 100% { transform: scale(1); }
101
- }.sbw-cal-nav.svelte-1dxdgqu button:where(.svelte-1dxdgqu).sbw-cal-nav-pulse {
102
- animation: svelte-1dxdgqu-sbw-cal-nav-pulse 320ms ease-out;}.sbw-cal-nav.svelte-1dxdgqu button:where(.svelte-1dxdgqu):disabled {cursor:default;opacity:0.3;}.sbw-cal-weekdays.svelte-1dxdgqu {display:grid;grid-template-columns:repeat(7, 1fr);margin-top:1rem;text-align:center;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.1em;opacity:0.4;}.sbw-cal-grid.svelte-1dxdgqu {display:grid;grid-template-columns:repeat(7, 1fr);gap:2px;margin-top:0.25rem;}.sbw-cal-cell.svelte-1dxdgqu {height:3rem;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;border:2px solid transparent;border-radius:8px;background:none;font:inherit;font-size:0.875rem;color:inherit;cursor:pointer;transition:border-color 320ms ease-out, background-color 320ms ease-out, color 320ms ease-out;}
103
- /* Excludes .sbw-cal-cell-selected: this selector out-ranks the selected
104
- rule below (two pseudo-classes vs. one plain class), and without the
105
- exclusion hovering the selected day replaced its solid accent fill
106
- with this dimmer tint, reading as deselected while the mouse was over
107
- it. Same fix as AvailabilityCalendar.svelte's .ac-edge exclusion. */.sbw-cal-cell.svelte-1dxdgqu:hover:not(:disabled):not(.sbw-cal-cell-selected) {background:var(--sbw-cal-hover-bg, color-mix(in oklab, var(--sbw-text-color, #1a1a1a) 6%, transparent));color:var(--sbw-cal-hover-color, inherit);border-color:var(--sbw-accent-color, #c49e5a);}.sbw-cal-cell.svelte-1dxdgqu:disabled {cursor:default;}.sbw-cal-cell-off.svelte-1dxdgqu span:where(.svelte-1dxdgqu) {opacity:0.2;}.sbw-cal-cell.svelte-1dxdgqu:disabled:not(.sbw-cal-cell-off) span:where(.svelte-1dxdgqu):first-child {opacity:0.3;}.sbw-cal-cell-selected.svelte-1dxdgqu {background:var(--sbw-accent-color, #c49e5a);}.sbw-cal-cell-selected.svelte-1dxdgqu span:where(.svelte-1dxdgqu) {color:var(--sbw-accent-contrast, #fff);}.sbw-dot.svelte-1dxdgqu {width:4px;height:4px;border-radius:9999px;background:var(--sbw-accent-color, #c49e5a);}.sbw-dot-1.svelte-1dxdgqu {opacity:0.35;}.sbw-dot-2.svelte-1dxdgqu {opacity:0.65;}.sbw-dot-3.svelte-1dxdgqu {opacity:1;width:5px;height:5px;}
108
- /* Keeps the availability dot visible against --sbw-cal-hover-color's own
109
- fill -- without this it stayed --sbw-accent-color, which on a theme
110
- where hover flips to a dark fill with accent-colored TEXT (rather
111
- than the default light tint) would otherwise put an accent dot on an
112
- accent-colored background. */.sbw-cal-cell.svelte-1dxdgqu:hover:not(:disabled):not(.sbw-cal-cell-selected) .sbw-dot:where(.svelte-1dxdgqu) {background:var(--sbw-cal-hover-color, var(--sbw-accent-color, #c49e5a));}.sbw-cal-cell-selected.svelte-1dxdgqu .sbw-dot:where(.svelte-1dxdgqu) {background:var(--sbw-accent-contrast, #fff);opacity:1;}.sbw-slots.svelte-1dxdgqu {margin-top:1.5rem;border-top:1px solid var(--sbw-border-color, rgba(0, 0, 0, 0.15));padding-top:1.25rem;}
113
- /* One column, not auto-fit -- auto-fit let Morning/Afternoon/Evening
114
- sit side-by-side whenever the container was wide (e.g. the
115
- dashboard's full-width reschedule sheet), each cramped into a
116
- narrow track instead of the slot-buttons grid using the full
117
- width. Stacking the groups keeps each one's own 2-column button
118
- grid legible regardless of how wide the widget is rendered. */.sbw-slot-groups.svelte-1dxdgqu {display:grid;grid-template-columns:1fr;gap:1.25rem;}.sbw-slot-group-label.svelte-1dxdgqu {margin:0 0 0.5rem;font-size:0.75rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:var(--sbw-slot-label-color, inherit);opacity:var(--sbw-slot-label-opacity, 0.5);}
119
- /* auto-fit: use as many columns as the (now flexible-width) slots
120
- area actually has room for, instead of a fixed count that either
121
- stretches into giant pills on a wide column or wastes space on a
122
- narrow one. */.sbw-slot-buttons.svelte-1dxdgqu {display:grid;grid-template-columns:repeat(auto-fit, minmax(5.5rem, 1fr));gap:0.4rem;}.sbw-slot-btn.svelte-1dxdgqu {border-radius:9999px;border:2px solid var(--sbw-border-color, rgba(0, 0, 0, 0.35));background:var(--sbw-input-bg, #fff);box-shadow:0 1px 2px rgba(0, 0, 0, 0.06);padding:0.5rem 0.9rem;font:inherit;font-size:0.8125rem;color:inherit;cursor:pointer;transition:border-color 320ms ease-out, background-color 320ms ease-out, color 320ms ease-out;}
123
- /* Excludes .sbw-slot-btn-selected for the same reason as .sbw-cal-cell's
124
- own hover exclusion above: this selector's two classes + :hover
125
- otherwise out-ranks that one plain class and hovering the already-
126
- selected slot would replace its solid accent fill with this one. */.sbw-slot-btn.svelte-1dxdgqu:hover:not(.sbw-slot-btn-selected) {border-color:var(--sbw-accent-color, #c49e5a);background:var(--sbw-slot-hover-bg, var(--sbw-input-bg, #fff));color:var(--sbw-slot-hover-color, inherit);}.sbw-slot-btn-selected.svelte-1dxdgqu {background:var(--sbw-accent-color, #c49e5a);border-color:var(--sbw-accent-color, #c49e5a);color:var(--sbw-accent-contrast, #fff);
127
- /* Replays whenever this class lands on a *different* button (auto-pick
128
- or a manual re-pick), since that's a fresh application of the
129
- animation property -- makes the pick noticeable instead of a silent
130
- state change several buttons over from where the visitor is looking. */
131
- animation: svelte-1dxdgqu-sbw-slot-pop 0.3s ease;}
132
- @keyframes svelte-1dxdgqu-sbw-slot-pop {
133
- 0% { transform: scale(0.92); }
134
- 60% { transform: scale(1.04); }
135
- 100% { transform: scale(1); }
136
- }
137
- /* Flashes gold then settles, so a silently auto-picked time in the summary
138
- panel (easy to miss, off to the side) draws the eye same as the pop
139
- above does for the slot button itself. */.sbw-time-flash.svelte-1dxdgqu {
140
- animation: svelte-1dxdgqu-sbw-time-flash 0.6s ease;}
141
- @keyframes svelte-1dxdgqu-sbw-time-flash {
142
- 0% { color: var(--sbw-accent-color, #c49e5a); }
143
- 100% { color: inherit; }
144
- }
145
-
146
- /* --- Summary panel --- */
147
- /* Sticky, and it carries the primary CTA -- a Floating panel (canon:
148
- accent-tinted border + matching glow, same 30%/25% mix the
149
- therapist-filter panel uses) rather than Card surface's neutral
150
- border, so it reads as raised/active instead of another content
151
- block. Opaque --sbw-bg, not the translucent --sbw-input-bg inputs
152
- use -- that assumes a solid page directly behind it, but this
153
- panel sticks over whatever's scrolled underneath it. */.sbw-summary.svelte-1dxdgqu {border-radius:4px;border:1px solid color-mix(in oklab, var(--sbw-accent-color, #c49e5a) 30%, transparent);background:var(--sbw-bg, #fff);box-shadow:0 8px 24px rgba(0, 0, 0, 0.16), 0 0 24px color-mix(in oklab, var(--sbw-accent-color, #c49e5a) 25%, transparent);padding:1.25rem;}
154
- @container sbw (min-width: 38rem) {.sbw-summary.svelte-1dxdgqu {position:sticky;top:var(--sbw-summary-sticky-top, 1rem);}
155
- }.sbw-summary-row.svelte-1dxdgqu {display:flex;align-items:baseline;justify-content:space-between;gap:0.75rem;font-size:0.9375rem;font-weight:600;}.sbw-summary-row-sub.svelte-1dxdgqu {margin-top:0.5rem;font-size:0.8125rem;font-weight:400;opacity:0.65;}
156
- /* Date and time are one fact, not a label/value pair -- keep them
157
- next to each other instead of the row's default space-between,
158
- which stretched them to opposite edges. Also the one -sub row that's
159
- actually the point of the summary (which slot you're about to book),
160
- so it overrides -sub's dimmed/thin defaults back up to fully legible
161
- instead of reading as fine print like the optional staff row above it. */.sbw-summary-row-datetime.svelte-1dxdgqu {justify-content:flex-start;gap:0.375rem;font-size:var(--sbw-summary-datetime-size, 0.875rem);font-weight:var(--sbw-summary-datetime-weight, 700);color:var(--sbw-summary-datetime-color, inherit);opacity:var(--sbw-summary-datetime-opacity, 1);}
162
- /* The post-booking "Booked" row's own timestamp value -- same
163
- reasoning and same variables as .sbw-summary-row-datetime above (it's
164
- the confirmed date/time, the actual point of this receipt-like row,
165
- not a footnote), just scoped to the value span rather than the whole
166
- row since this row keeps its label/value layout (space-between),
167
- unlike the label-less date+time row above. */.sbw-summary-row-bookedat-value.svelte-1dxdgqu {font-weight:var(--sbw-summary-datetime-weight, 700);color:var(--sbw-summary-datetime-color, inherit);opacity:var(--sbw-summary-datetime-opacity, 1);}.sbw-summary-total.svelte-1dxdgqu {display:flex;align-items:baseline;justify-content:space-between;margin-top:1rem;padding-top:1rem;border-top:1px solid var(--sbw-summary-total-border-color, var(--sbw-border-color, rgba(0, 0, 0, 0.15)));font-size:0.9375rem;}.sbw-summary-total.svelte-1dxdgqu strong:where(.svelte-1dxdgqu) {font-size:1.125rem;color:var(--sbw-accent-color, #c49e5a);}.sbw-continue.svelte-1dxdgqu {display:inline-flex;align-items:center;justify-content:center;gap:0.5rem;width:100%;margin-top:1.25rem;cursor:pointer;border:none;border-radius:2px;background:var(--sbw-accent-bg, #1a1a1a);color:var(--sbw-accent-contrast, #fff);padding:0.8rem;font-size:0.75rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;transition:background-color 150ms ease;}.sbw-continue.svelte-1dxdgqu:hover:not(:disabled) {background:var(--sbw-accent-hover-bg, #333);}.sbw-continue.svelte-1dxdgqu:disabled {cursor:default;opacity:0.4;}
168
-
169
- /* --- Details step --- */.sbw-back.svelte-1dxdgqu {display:inline-block;margin-bottom:1.5rem;border:none;background:none;padding:0;font:inherit;color:inherit;font-size:0.8125rem;opacity:var(--sbw-back-opacity, 0.6);cursor:pointer;}.sbw-back.svelte-1dxdgqu:hover {opacity:var(--sbw-back-hover-opacity, 1);}.sbw-back-service.svelte-1dxdgqu {display:block;width:100%;margin-top:0.75rem;text-align:center;}.sbw-grid.svelte-1dxdgqu {display:grid;gap:1.25rem;}
170
- @container sbw (min-width: 640px) {.sbw-grid.svelte-1dxdgqu {grid-template-columns:1fr 1fr;}
171
- }.sbw-field.svelte-1dxdgqu {display:flex;flex-direction:column;gap:0.5rem;}.sbw-label.svelte-1dxdgqu {font-size:0.75rem;font-weight:300;text-transform:uppercase;letter-spacing:0.05em;}.sbw-field.svelte-1dxdgqu input:where(.svelte-1dxdgqu),
172
- .sbw-field.svelte-1dxdgqu textarea:where(.svelte-1dxdgqu) {border-radius:2px;border:1px solid var(--sbw-border-color, rgba(0, 0, 0, 0.15));background:var(--sbw-input-bg, #fff);padding:0.75rem 1rem;font-size:0.875rem;font-family:inherit;color:inherit;}.sbw-field.svelte-1dxdgqu input:where(.svelte-1dxdgqu):focus,
173
- .sbw-field.svelte-1dxdgqu textarea:where(.svelte-1dxdgqu):focus {outline:none;border-color:color-mix(in oklab, var(--sbw-text-color, #1a1a1a) 40%, transparent);}.sbw-field.svelte-1dxdgqu input:where(.svelte-1dxdgqu)::placeholder,
174
- .sbw-field.svelte-1dxdgqu textarea:where(.svelte-1dxdgqu)::placeholder {color:var(--sbw-placeholder-color, color-mix(in oklab, var(--sbw-text-color, #1a1a1a) 45%, transparent));}
175
- /* Browser autofill (matched saved Name/Email data) paints its own
176
- background on these inputs via a UA style strong enough that plain
177
- \`background\` can't win -- box-shadow can, so this fakes the field's
178
- normal look with an opaque inset fill instead. --sbw-input-autofill-bg
179
- falls back to --sbw-input-bg, which is enough for most themes (an
180
- opaque light input already matches when autofilled); only a theme
181
- whose --sbw-input-bg is itself transparent (mens-cave-barbers: fields
182
- defined by their border, not a fill, over a solid page background)
183
- needs to set this separately to that real opaque colour, or the
184
- browser's own fill shows through unmasked. The absurd transition delay
185
- is the standard defeat for Chrome's own internal autofill-background
186
- transition, which otherwise animates its colour in after this applies. */.sbw-field.svelte-1dxdgqu input:where(.svelte-1dxdgqu):-webkit-autofill,
187
- .sbw-field.svelte-1dxdgqu textarea:where(.svelte-1dxdgqu):-webkit-autofill,
188
- .sbw-field.svelte-1dxdgqu input:where(.svelte-1dxdgqu):-webkit-autofill:hover,
189
- .sbw-field.svelte-1dxdgqu textarea:where(.svelte-1dxdgqu):-webkit-autofill:hover,
190
- .sbw-field.svelte-1dxdgqu input:where(.svelte-1dxdgqu):-webkit-autofill:focus,
191
- .sbw-field.svelte-1dxdgqu textarea:where(.svelte-1dxdgqu):-webkit-autofill:focus {-webkit-text-fill-color:var(--sbw-text-color, #1a1a1a);-webkit-box-shadow:0 0 0 1000px var(--sbw-input-autofill-bg, var(--sbw-input-bg, #fff)) inset;box-shadow:0 0 0 1000px var(--sbw-input-autofill-bg, var(--sbw-input-bg, #fff)) inset;transition:background-color 600000s ease-in-out 0s;}.sbw-notes-field.svelte-1dxdgqu {margin-top:1.25rem;}.sbw-payment.svelte-1dxdgqu {display:flex;flex-direction:column;gap:0.5rem;margin-top:1.25rem;}.sbw-payment-header.svelte-1dxdgqu {display:flex;align-items:baseline;justify-content:space-between;gap:1rem;}.sbw-payment-amount.svelte-1dxdgqu {font-size:0.875rem;font-weight:600;color:var(--sbw-accent-color, #c49e5a);}.sbw-payment-slot-anchor.svelte-1dxdgqu slot[name='payment-mount'] {display:block;}
192
- /* The mount node is a light-DOM child of the host projected in through
193
- that slot (see setupPayment) -- only ::slotted() reaches it. */::slotted(.sbw-payment-element) {display:block;border-radius:2px;border:1px solid var(--sbw-border-color, rgba(0, 0, 0, 0.15));background:var(--sbw-input-bg, #fff);padding:0.9rem;}.sbw-payment-hint.svelte-1dxdgqu {margin:0;font-size:0.75rem;opacity:0.6;}.sbw-submit.svelte-1dxdgqu {display:inline-flex;align-items:center;justify-content:center;gap:0.5rem;width:100%;margin-top:1.25rem;cursor:pointer;border:none;border-radius:2px;background:var(--sbw-accent-bg, #1a1a1a);color:var(--sbw-accent-contrast, #fff);padding:0.8rem;font-size:0.75rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;transition:background-color 150ms ease;}.sbw-submit.svelte-1dxdgqu:hover:not(:disabled) {background:var(--sbw-accent-hover-bg, #333);}.sbw-submit.svelte-1dxdgqu:disabled {cursor:default;opacity:0.6;}.sbw-spinner.svelte-1dxdgqu {height:1rem;width:1rem;border-radius:9999px;border:2px solid color-mix(in oklab, var(--sbw-accent-contrast, #fff) 30%, transparent);border-top-color:var(--sbw-accent-contrast, #fff);
194
- animation: svelte-1dxdgqu-sbw-spin 0.7s linear infinite;}
195
- @keyframes svelte-1dxdgqu-sbw-spin {
196
- to {
197
- transform: rotate(360deg);
198
- }
199
- }
200
- @media (prefers-reduced-motion: reduce) {.sbw-spinner.svelte-1dxdgqu {
201
- animation: none;}.sbw-slot-btn-selected.svelte-1dxdgqu,
202
- .sbw-time-flash.svelte-1dxdgqu {
203
- animation: none;}
204
- }.sbw-error-text.svelte-1dxdgqu {margin:0.75rem 0 0;font-size:0.8125rem;color:var(--sbw-danger-color, #dc2626);}
205
-
206
- /* --- Success --- */.sbw-success.svelte-1dxdgqu {max-width:var(--sbw-form-max-width, 40rem);margin:3rem auto 0;text-align:center;}.sbw-success-icon.svelte-1dxdgqu {display:flex;align-items:center;justify-content:center;width:3rem;height:3rem;margin:0 auto 1rem;border-radius:9999px;background:var(--sbw-success-bg, #c49e5a);color:#fff;}.sbw-success-icon.svelte-1dxdgqu svg:where(.svelte-1dxdgqu) {width:1.5rem;height:1.5rem;}.sbw-success.svelte-1dxdgqu .sbw-summary:where(.svelte-1dxdgqu) {margin-top:2rem;text-align:left;}.sbw-success.svelte-1dxdgqu p:where(.svelte-1dxdgqu) {margin:0;font-size:1.125rem;}`};function lt(t,r){b(r,!0),w(t,ct);let ie=(e,t=ee,r)=>{let a=O(()=>ae(r?.(),!1));var s=i(),c=n(s),l=e=>{var r=Le(),s=M(r),c=M(s),l=M(c,!0);S(c);var u=g(c,2),f=e=>{var t=Ce(),n=M(t);S(t),o(e=>A(n,`£${e??``}`),[()=>d(J).amount.toFixed(2)]),m(e,t)};p(u,e=>{!N()&&d(J)&&e(f)}),S(s);var h=g(s,2),_=e=>{var t=Te(),n=M(t),r=M(n,!0);S(n);var i=g(n,2),a=e=>{var t=we(),n=M(t);S(t),o(e=>A(n,`−£${e??``}`),[()=>(d(z).price-d(J).amount).toFixed(2)]),m(e,t)};p(i,e=>{d(z).price!=null&&d(z).price>d(J).amount&&e(a)}),S(t),o(()=>A(r,d(L).memberRateLabel)),m(e,t)};p(h,e=>{!N()&&d(J)?.member&&e(_)});var v=g(h,2),y=e=>{var t=Ee(),n=M(t),r=M(n,!0);S(n);var i=g(n,2),a=M(i,!0);S(i),S(t),o(()=>{A(r,d(L).staffRowLabel),A(a,pt())}),m(e,t)};p(v,e=>{pt()&&e(y)});var b=g(v,2),C=e=>{var t=Oe(),n=M(t),r=M(n,!0);S(n);var i=g(n,2);se(i,()=>d(K),e=>{var t=De(),n=M(t,!0);S(t),o(()=>A(n,d(K))),x(1,t,()=>Se,()=>({duration:200})),m(e,t)}),S(t),o(e=>A(r,e),[()=>me(d(G),F())]),m(e,t)};p(b,e=>{d(G)&&d(K)&&e(C)});var w=g(b,2),T=e=>{var t=ke(),n=M(t),r=M(n,!0);S(n);var i=g(n,2),a=M(i);S(i),S(t),o((e,t)=>{A(r,d(L).bookedAtLabel),A(a,`${e??``}
207
- ${t??``}`)},[()=>d(qt).toLocaleDateString(F(),{day:`numeric`,month:`short`}),()=>d(qt).toLocaleTimeString(F(),{hour:`2-digit`,minute:`2-digit`})]),m(e,t)};p(w,e=>{d(a)&&d(qt)&&e(T)});var D=g(w,2),ee=e=>{var t=Ae(),n=M(t),r=M(n,!0);S(n);var i=g(n,2),a=M(i);S(i),S(t),o(e=>{A(r,d(L).totalLabel),A(a,`£${e??``}`)},[()=>d(J).amount.toFixed(2)]),m(e,t)};p(D,e=>{!N()&&d(J)&&e(ee)});var te=g(D,2),O=e=>{var r=i(),a=n(r),s=e=>{var t=Pe(),r=n(t),i=M(r),a=e=>{var t=je();m(e,t)};p(i,e=>{d(Z)&&e(a)});var s=g(i,2),c=M(s,!0);S(s),S(r);var l=g(r,2),u=e=>{var t=Me(),n=M(t,!0);S(t),o(()=>A(n,d(L).noChangeHint)),m(e,t)};p(l,e=>{d(an)&&e(u)});var f=g(l,2),h=e=>{var t=Ne(),n=M(t,!0);S(t),o(()=>A(n,d(Q))),m(e,t)};p(f,e=>{d(Q)&&e(h)}),o(()=>{r.disabled=!d(K)||d(Z)||d(an),A(c,d(Z)?d(L).confirmingLabel:d(L).confirmRescheduleLabel)}),E(`click`,r,Gn),m(e,t)},c=e=>{var t=Fe(),r=n(t),i=M(r,!0);S(r);var a=g(r,2),s=M(a);S(a),o(()=>{r.disabled=!d(K),A(i,d(L).continueLabel),A(s,`← ${d(L).changeServiceLabel??``}`)}),E(`click`,r,vn),E(`click`,a,bn),m(e,t)},l=e=>{var t=Ie(),r=n(t),i=M(r),a=e=>{var t=je();m(e,t)};p(i,e=>{d(Z)&&e(a)});var s=g(i,2),c=M(s,!0);S(s),S(r);var l=g(r,2),u=e=>{var t=Ne(),n=M(t,!0);S(t),o(()=>A(n,d(Q))),m(e,t)};p(l,e=>{d(Q)&&e(u)});var f=g(l,2),h=M(f);S(f),o(()=>{r.disabled=d(Z)||d(Fn),A(c,d(Z)?d(L).confirmingLabel:d(En)?d(L).confirmPayLabel:d(L).confirmLabel),A(h,`← ${d(L).backLabel??``}`)}),E(`click`,f,yn),m(e,t)};p(a,e=>{t()&&P()?e(s):t()?e(c,1):e(l,-1)}),m(e,r)};p(te,e=>{d(a)||e(O)}),S(r),o(()=>A(l,d(z).name)),m(e,r)};p(c,e=>{d(z)&&e(l)}),m(e,s)},xe={chooseServiceLabel:`Choose a Service`,loadingServices:`Loading services…`,loadServicesError:`Could not load services. Please try again later.`,previousMonth:`Previous month`,nextMonth:`Next month`,morningLabel:`Morning`,afternoonLabel:`Afternoon`,eveningLabel:`Evening`,pickDayHint:`Pick a day to see times.`,noSlotsForDay:`No times available this day.`,noChangeHint:`Pick a different date or time to continue.`,therapistFilterLabel:`Therapist`,anyTherapistLabel:`Any therapist`,staffRowLabel:`Staff`,bookedAtLabel:`Booked`,totalLabel:`Total`,continueLabel:`Continue`,changeServiceLabel:`Change service`,backLabel:`Back`,nameLabel:`Name`,namePlaceholder:`Jane Smith`,emailLabel:`Email`,emailPlaceholder:`jane@email.com`,emailInvalidTitle:`Enter a valid email address, e.g. jane@email.com`,phoneLabel:`Phone (optional)`,phonePlaceholder:`+1 555 123 4567`,notesLabel:`Notes (optional)`,notesPlaceholder:`Anything we should know?`,confirmingLabel:`Booking…`,confirmLabel:`Confirm Booking`,confirmRescheduleLabel:`Confirm change`,notWiredError:`This widget is not wired up to make bookings yet.`,genericSubmitError:`Something went wrong booking that slot. Please try again.`,successMessage:`Booked! Check your email for confirmation.`,memberRateLabel:`Regulars' rate`,membersOnlyLabel:`Regulars only`,membersOnlyHint:`For clients who've visited in the last 4 weeks.`,paymentLabel:`Payment`,paymentDueLabel:`due now`,paymentHint:``,paymentUnavailable:`Payment form unavailable — refresh to try again.`,paymentNotReady:`Payment form is not ready yet — please wait a moment and try again.`,paymentFailed:`Your payment could not be completed. Please try again.`,confirmPayLabel:`Pay & Confirm`},lt=D(r,`heading`,7,`Book a Service`),ut=D(r,`logoUrl`,7),dt=D(r,`tagline`,7,``),ft=D(r,`description`,7,``),pt=D(r,`staffLabel`,7,``),N=D(r,`hidePrice`,7,!1),P=D(r,`skipDetailsStep`,7,!1),mt=D(r,`emailOptional`,7,!1),ht=D(r,`closedWeekdays`,23,()=>[]),F=D(r,`locale`,7),gt=D(r,`initialTreatmentTitle`,7),I=D(r,`initialDate`,7),_t=D(r,`initialTime`,7),vt=D(r,`initialName`,7),yt=D(r,`initialEmail`,7),bt=D(r,`initialPhone`,7),xt=D(r,`memberUntil`,7),St=D(r,`strings`,7),Ct=D(r,`fetchTreatments`,7),wt=D(r,`fetchTherapists`,7),Tt=D(r,`fetchAvailability`,7),Et=D(r,`submitBooking`,7),Dt=D(r,`createPaymentIntent`,7),Ot=D(r,`stripePublishableKey`,7),kt=D(r,`stripeAppearance`,7),L=s(()=>({...xe,...St()})),At=s(()=>ge(F())),jt=s(()=>pe(F())),R=_(`service`),Mt=_(a([])),Nt=_(!0),Pt=_(!1),z=_(null);l(()=>{let e=Ct();if(!e)return;let t=!1;return h(Nt,!0),h(Pt,!1),e().then(e=>{if(!t){if(!e?.length)throw Error(`empty`);h(Mt,e,!0)}}).catch(()=>{t||h(Pt,!0)}).finally(()=>{t||h(Nt,!1)}),()=>{t=!0}});let Ft=_(a([])),B=_(``),V=_(!1),It=_(void 0),Lt=_(void 0);l(()=>{let e=wt();if(!e)return;let t=!1;return e().then(e=>{t||h(Ft,e??[],!0)}).catch(()=>{t||h(Ft,[],!0)}),()=>{t=!0}});let Rt=s(()=>d(Ft).find(e=>e.id===d(B))?.name);function zt(){h(V,!d(V))}function Bt(e){h(B,e,!0),h(V,!1)}l(()=>{if(!d(V)||!d(It)||!d(Lt))return;let e=d(It),t=d(Lt);t.style.minWidth=`${e.getBoundingClientRect().width}px`,t.showPopover();let n=fe(e,t,async()=>{let{x:n,y:r}=await ue(e,t,{strategy:`fixed`,placement:`bottom-start`,middleware:[le(4),de(),ce({padding:12})]});t.style.left=`${n}px`,t.style.top=`${r}px`});function r(e){e.newState===`closed`&&h(V,!1)}return t.addEventListener(`toggle`,r),()=>{n(),t.removeEventListener(`toggle`,r),t.matches(`:popover-open`)&&t.hidePopover()}});let Vt=e=>e.trim().toLowerCase(),Ht;l(()=>{let e=gt();if(!e||e===Ht||!d(Mt).length)return;let t=d(Mt).find(t=>Vt(t.name)===Vt(e));t&&(Ht=e,Wt(t))});let Ut;l(()=>{if(!I()||!d(z)||I()===Ut)return;Ut=I();let[e,t,n]=I().split(`-`).map(Number);h(U,e,!0),h(W,t-1),h(G,new Date(e,t-1,n),!0),h(K,_t()??null,!0)});function Wt(e){h(z,e,!0),h(G,null),h(K,null),Xt=0,h(R,`datetime`)}let Gt,Kt=!1;l(()=>{let e=Tt();if(!Kt){Kt=!0,Gt=e;return}e===Gt||P()||(Gt=e,d(R)!==`service`&&h(R,`service`),h(z,null),h(G,null),h(K,null),Xt=0)});let H=he(new Date),U=_(a(H.getFullYear())),W=_(a(H.getMonth())),G=_(null),K=_(null),qt=_(null),Jt=_(a(new Map)),Yt=_(!1),Xt=0,Zt=_e(H);function Qt(e,t){return e.memberPrice!=null&&!!xt()&&t<=xt()}function $t(e,t){return Qt(e,t)||e.price==null?{amount:e.memberPrice??0,member:!0}:{amount:e.price,member:!1}}function en(e){return e.price!=null||Qt(e,Zt)}let tn=s(()=>ve(d(U),d(W),H,ht()??[])),nn=s(()=>d(U)!==H.getFullYear()||d(W)!==H.getMonth()),q=s(()=>d(G)?_e(d(G)):null),J=s(()=>d(z)?$t(d(z),d(q)??Zt):null),rn=s(()=>d(q)?d(Jt).get(d(q))??[]:[]),an=s(()=>P()&&!!d(K)&&d(q)===I()&&d(K)===_t()),on=s(()=>{let e={morning:[],afternoon:[],evening:[]};for(let t of d(rn)){let n=parseInt(t.slice(0,2),10);n<12?e.morning.push(t):n<17?e.afternoon.push(t):e.evening.push(t)}return e});function sn(e){return d(Jt).get(e)?.length??0}function cn(e){let t=sn(e);return t===0?0:t<=5?1:t<=10?2:3}function ln(){if(d(G))return;let e=d(tn).find(e=>e.inMonth&&!e.isPast&&cn(e.iso)>0);e?(h(G,e.date,!0),h(K,null)):Xt<3&&(Xt++,hn())}function un(){let e=Tt();if(!e||!d(z))return;let t=_e(new Date(d(U),d(W),1)),n=_e(new Date(d(U),d(W)+1,0)),r=d(z).id,i=d(B)||void 0;h(Yt,!0),e(t,n,r,i).then(e=>{if(d(z)?.id!==r||(d(B)||void 0)!==i)return;let t=new Map;for(let n of e??[])t.set(String(n.date).split(`T`)[0],n.slots.map(e=>e.time));h(Jt,t,!0),ln()}).catch(()=>{h(Jt,new Map,!0)}).finally(()=>{h(Yt,!1)})}l(()=>{d(z),d(B),d(U),d(W),xt(),un()});let dn=``;l(()=>{d(B)!==dn&&(dn=d(B),h(G,null),h(K,null))}),l(()=>{!d(q)||d(K)||d(rn).length>0&&h(K,d(rn)[0],!0)});function fn(){d(G)&&(d(G).getFullYear()!==d(U)||d(G).getMonth()!==d(W))&&(h(G,null),h(K,null))}function pn(e){e.classList.remove(`sbw-cal-nav-pulse`),e.offsetWidth,e.classList.add(`sbw-cal-nav-pulse`),e.addEventListener(`animationend`,()=>e.classList.remove(`sbw-cal-nav-pulse`),{once:!0})}function mn(){d(nn)&&(h(W,d(W)-1),d(W)<0&&(h(W,11),h(U,d(U)-1)),fn())}function hn(){h(W,d(W)+1),d(W)>11&&(h(W,0),h(U,d(U)+1)),fn()}function gn(e){!e.inMonth||e.isPast||cn(e.iso)===0||(h(G,e.date,!0),h(K,null))}function _n(e){h(K,e,!0)}function vn(){d(K)&&(h(R,`details`),Bn())}function yn(){h(R,`datetime`)}function bn(){h(R,`service`)}let Y=_(``),X=_(``),xn=_(``),Sn=_(``),Z=_(!1),Q=_(``),Cn=!1,wn=!1,Tn=!1;l(()=>{vt()&&!Cn&&!d(Y)&&(h(Y,vt(),!0),Cn=!0)}),l(()=>{yt()&&!wn&&!d(X)&&(h(X,yt(),!0),wn=!0)}),l(()=>{bt()&&!Tn&&!d(xn)&&(h(xn,bt(),!0),Tn=!0)});let En=s(()=>!!(Ot()&&Dt())&&!P()),Dn=null,On=null,kn=null,An=null,$=null,jn=null,Mn=``,Nn=0,Pn=!1,Fn=_(!1),In=_(``),Ln=_(``);async function Rn(){return Ot()?(On||=be(async()=>{let{loadStripe:e}=await import(`./chunks/lib-Bd4dedte.js`);return{loadStripe:e}},[]).then(({loadStripe:e})=>e(Ot())),Dn=await On,Dn):null}function zn(){An?.destroy(),$?.remove(),An=null,kn=null,$=null,jn=null,Mn=``,h(Ln,``)}l(()=>zn);async function Bn(){if(!d(En)||!Dt()||!d(z)||!d(q)||!d(K))return;let e={treatmentId:d(z).id,date:d(q),time:d(K),therapistId:d(B)||void 0},t=[e.treatmentId,e.date,e.time,e.therapistId??``].join(`|`);await f();let n=r.$$host,i=n?.shadowRoot?.querySelector(`.sbw-payment-slot-anchor`);if(i&&!i.querySelector(`slot[name="payment-mount"]`)){let e=document.createElement(`slot`);e.setAttribute(`name`,`payment-mount`),i.appendChild(e)}if(Pn||kn&&t===Mn)return;zn(),Mn=t;let a=++Nn;h(Fn,!0),h(In,``);try{let t=await Rn();if(!t)throw Error(`Stripe failed to load`);let r=await Dt()(e);if(a!==Nn)return;if(jn=r.paymentIntentId,r.amount!=null&&r.currency){let e=new Intl.NumberFormat(F(),{style:`currency`,currency:r.currency}).format(ye(r.amount,r.currency));h(Ln,`${e} ${d(L).paymentDueLabel}`)}kn=t.elements({clientSecret:r.clientSecret,appearance:kt()}),An=kn.create(`payment`,{layout:{type:`tabs`,defaultCollapsed:!1}}),An.on(`loaderror`,()=>{a===Nn&&h(In,d(L).paymentUnavailable,!0)}),$=document.createElement(`div`),$.slot=`payment-mount`,$.className=`sbw-payment-element`,n.appendChild($),An.mount($)}catch{if(a!==Nn)return;zn(),h(In,d(L).paymentUnavailable,!0)}finally{a===Nn&&h(Fn,!1)}}async function Vn(){if(!Dn||!kn||!jn)return h(Q,d(L).paymentNotReady,!0),!1;h(Q,``),h(Z,!0);try{let{error:e,paymentIntent:t}=await Dn.confirmPayment({elements:kn,confirmParams:{payment_method_data:{billing_details:{name:d(Y),email:d(X)||void 0,phone:d(xn)||void 0}}},redirect:`if_required`});if(e||![`succeeded`,`requires_capture`,`processing`].includes(t?.status))return h(Q,e?.message??d(L).paymentFailed,!0),!1}catch{return h(Q,d(L).paymentFailed,!0),!1}finally{h(Z,!1)}return Pn=!0,!0}function Hn(e,t){r.$$host?.dispatchEvent(new CustomEvent(e,{detail:t,bubbles:!0,composed:!0}))}async function Un(e){if(!Et()){h(Q,d(L).notWiredError,!0);return}h(Q,``),h(Z,!0);try{let t=await Et()(e);if(!t.ok)throw Error(t.error||`request failed`);h(qt,new Date,!0),h(R,`success`),Hn(`booking-submitted`,e)}catch(e){h(Q,e instanceof Error&&e.message!==`request failed`?e.message:d(L).genericSubmitError,!0),un()}finally{h(Z,!1)}}async function Wn(e){e.preventDefault(),!(!d(z)||!d(q)||!d(K))&&(d(En)&&!Pn&&!await Vn()||await Un({treatmentId:d(z).id,date:d(q),time:d(K),therapistId:d(B)||void 0,name:d(Y),email:d(X),phone:d(xn),notes:d(Sn),stripePaymentIntentId:d(En)?jn??void 0:void 0}))}async function Gn(){!d(z)||!d(q)||!d(K)||await Un({treatmentId:d(z).id,date:d(q),time:d(K),therapistId:d(B)||void 0,name:vt()??``,email:yt()??``,phone:bt()??``,notes:``})}var Kn={get heading(){return lt()},set heading(e=`Book a Service`){lt(e),c()},get logoUrl(){return ut()},set logoUrl(e){ut(e),c()},get tagline(){return dt()},set tagline(e=``){dt(e),c()},get description(){return ft()},set description(e=``){ft(e),c()},get staffLabel(){return pt()},set staffLabel(e=``){pt(e),c()},get hidePrice(){return N()},set hidePrice(e=!1){N(e),c()},get skipDetailsStep(){return P()},set skipDetailsStep(e=!1){P(e),c()},get emailOptional(){return mt()},set emailOptional(e=!1){mt(e),c()},get closedWeekdays(){return ht()},set closedWeekdays(e=[]){ht(e),c()},get locale(){return F()},set locale(e){F(e),c()},get initialTreatmentTitle(){return gt()},set initialTreatmentTitle(e){gt(e),c()},get initialDate(){return I()},set initialDate(e){I(e),c()},get initialTime(){return _t()},set initialTime(e){_t(e),c()},get initialName(){return vt()},set initialName(e){vt(e),c()},get initialEmail(){return yt()},set initialEmail(e){yt(e),c()},get initialPhone(){return bt()},set initialPhone(e){bt(e),c()},get memberUntil(){return xt()},set memberUntil(e){xt(e),c()},get strings(){return St()},set strings(e){St(e),c()},get fetchTreatments(){return Ct()},set fetchTreatments(e){Ct(e),c()},get fetchTherapists(){return wt()},set fetchTherapists(e){wt(e),c()},get fetchAvailability(){return Tt()},set fetchAvailability(e){Tt(e),c()},get submitBooking(){return Et()},set submitBooking(e){Et(e),c()},get createPaymentIntent(){return Dt()},set createPaymentIntent(e){Dt(e),c()},get stripePublishableKey(){return Ot()},set stripePublishableKey(e){Ot(e),c()},get stripeAppearance(){return kt()},set stripeAppearance(e){kt(e),c()}},qn=st(),Jn=M(qn),Yn=t=>{var a=He(),s=M(a),c=e=>{var t=Re();o(()=>k(t,`src`,ut())),m(e,t)};p(s,e=>{ut()&&e(c)});var l=g(s,2);oe(l,r,`heading`,{},t=>{var r=i(),a=n(r),s=t=>{var r=ze(),i=n(r),a=M(i,!0);S(i),e(2),o(()=>A(a,lt())),m(t,r)};p(a,e=>{lt()&&e(s)}),m(t,r)});var u=g(l,2),d=e=>{var t=Be(),n=M(t,!0);S(t),o(()=>A(n,dt())),m(e,t)};p(u,e=>{dt()&&e(d)});var f=g(u,2);oe(f,r,`description`,{},e=>{var t=i(),r=n(t),a=e=>{var t=Ve(),n=M(t,!0);S(t),o(()=>A(n,ft())),m(e,t)};p(r,e=>{ft()&&e(a)}),m(e,t)}),S(a),m(t,a)};p(Jn,e=>{d(R)!==`success`&&e(Yn)});var Xn=g(Jn,2),Zn=e=>{var t=qe(),n=M(t),r=M(n,!0);S(n);var i=g(n,2),a=e=>{var t=Me(),n=M(t,!0);S(t),o(()=>A(n,d(L).loadingServices)),m(e,t)},c=e=>{var t=Ne(),n=M(t,!0);S(t),o(()=>A(n,d(L).loadServicesError)),m(e,t)},l=e=>{var t=Ke();j(t,21,()=>d(Mt),e=>e.id,(e,t)=>{let n=s(()=>en(d(t)));var r=Ge(),i=M(r),a=M(i),c=M(a),l=g(c),u=e=>{var t=Ue(),n=M(t,!0);S(t),o(()=>A(n,d(L).membersOnlyHint)),m(e,t)};p(l,e=>{d(n)||e(u)}),S(a);var f=g(a,2),h=e=>{var n=We(),r=M(n),i=M(r);S(r);var a=g(r,2),s=e=>{var t=Ue(),n=M(t,!0);S(t),o(()=>A(n,d(L).membersOnlyLabel)),m(e,t)},c=e=>{var n=Ue(),r=M(n);S(n),o(e=>A(r,`${d(L).memberRateLabel??``} £${e??``}`),[()=>d(t).memberPrice.toFixed(2)]),m(e,n)};p(a,e=>{d(t).price==null?e(s):d(t).memberPrice!=null&&e(c,1)}),S(n),o(e=>A(i,`£${e??``}`),[()=>(d(t).price??d(t).memberPrice??0).toFixed(2)]),m(e,n)};p(f,e=>{N()||e(h)}),S(i),S(r),o(()=>{i.disabled=!d(n),A(c,`${d(t).name??``} `)}),E(`click`,i,()=>Wt(d(t))),m(e,r)}),S(t),m(e,t)};p(i,e=>{d(Nt)?e(a):d(Pt)?e(c,1):e(l,-1)}),S(t),o(()=>A(r,d(L).chooseServiceLabel)),m(e,t)},Qn=e=>{var t=tt(),r=M(t),a=M(r),c=M(a),l=M(c),u=M(l);S(l);var f=g(l,2),_=e=>{var t=Ye(),n=M(t),r=M(n,!0);S(n);var i=g(n,2),a=M(i),s=M(a,!0);S(a);var c=g(a,2);let l;S(i),ne(i,e=>h(It,e),()=>d(It));var u=g(i,2),f=M(u),p=M(f),_=M(p,!0);S(p),S(f);var v=g(f,2);j(v,17,()=>d(Ft),e=>e.id,(e,t)=>{var n=Je(),r=M(n),i=M(r,!0);S(r),S(n),o(()=>{k(r,`aria-selected`,d(t).id===d(B)),A(i,d(t).name)}),E(`click`,r,()=>Bt(d(t).id)),m(e,n)}),S(u),ne(u,e=>h(Lt,e),()=>d(Lt)),S(t),o(()=>{A(r,d(L).therapistFilterLabel),k(i,`aria-expanded`,d(V)),A(s,d(Rt)??d(L).anyTherapistLabel),l=C(c,0,`sbw-chevron svelte-1dxdgqu`,null,l,{"sbw-chevron-open":d(V)}),k(u,`aria-label`,d(L).therapistFilterLabel),k(p,`aria-selected`,!d(B)),A(_,d(L).anyTherapistLabel)}),E(`click`,i,zt),E(`click`,p,()=>Bt(``)),m(e,t)};p(f,e=>{d(Ft).length&&e(_)});var v=g(f,2),y=M(v),b=g(y,2);S(v),S(c);var x=g(c,2);j(x,20,()=>d(jt),e=>e,(e,t)=>{var n=we(),r=M(n,!0);S(n),o(()=>A(r,t)),m(e,n)}),S(x);var w=g(x,2);j(w,21,()=>d(tn),e=>e.iso,(e,t)=>{let n=s(()=>cn(d(t).iso)),r=s(()=>d(t).inMonth&&!d(t).isPast&&d(n)>0);var i=Ze();let a;var c=M(i),l=M(c,!0);S(c);var u=g(c,2),f=e=>{var t=Xe();o(()=>C(t,1,`sbw-dot sbw-dot-${d(n)??``}`,`svelte-1dxdgqu`)),m(e,t)};p(u,e=>{d(r)&&e(f)}),S(i),o(()=>{a=C(i,1,`sbw-cal-cell svelte-1dxdgqu`,null,a,{"sbw-cal-cell-off":!d(t).inMonth||d(t).isPast,"sbw-cal-cell-selected":d(q)===d(t).iso}),i.disabled=!d(r),A(l,d(t).dayNumber)}),E(`click`,i,()=>gn(d(t))),m(e,i)}),S(w),S(a);var T=g(a,2),D=M(T),ee=e=>{var t=Me(),n=M(t,!0);S(t),o(()=>A(n,d(L).pickDayHint)),m(e,t)},te=e=>{var t=Me(),n=M(t,!0);S(t),o(()=>A(n,d(L).loadingServices)),m(e,t)},O=e=>{var t=Me(),n=M(t,!0);S(t),o(()=>A(n,d(L).noSlotsForDay)),m(e,t)},ae=e=>{var t=et();j(t,21,()=>[[`morning`,d(L).morningLabel],[`afternoon`,d(L).afternoonLabel],[`evening`,d(L).eveningLabel]],([e,t])=>e,(e,t)=>{var r=s(()=>re(d(t),2));let a=()=>d(r)[0],c=()=>d(r)[1],l=s(()=>d(on)[a()]);var u=i(),f=n(u),h=e=>{var t=$e(),n=M(t),r=M(n);S(n);var i=g(n,2);j(i,20,()=>d(l),e=>e,(e,t)=>{var n=Qe();let r;var i=M(n,!0);S(n),o(()=>{r=C(n,1,`sbw-slot-btn svelte-1dxdgqu`,null,r,{"sbw-slot-btn-selected":d(K)===t}),A(i,t)}),E(`click`,n,()=>_n(t)),m(e,n)}),S(i),S(t),o(()=>A(r,`${c()??``} (${d(l).length??``})`)),m(e,t)};p(f,e=>{d(l).length&&e(h)}),m(e,u)}),S(t),m(e,t)};p(D,e=>{d(q)?d(Yt)?e(te,1):d(rn).length?e(ae,-1):e(O,2):e(ee)}),S(T),S(r);var oe=g(r,2);ie(oe,()=>!0),S(t),o(()=>{A(u,`${d(At)[d(W)]??``} ${d(U)??``}`),y.disabled=!d(nn),k(y,`aria-label`,d(L).previousMonth),k(b,`aria-label`,d(L).nextMonth),k(w,`aria-busy`,d(Yt))}),E(`click`,y,e=>{pn(e.currentTarget),mn()}),E(`click`,b,e=>{pn(e.currentTarget),hn()}),m(e,t)},$n=e=>{var t=at(),n=M(t),r=M(n),i=M(r),a=M(i),s=M(a,!0);S(a);var c=g(a,2);te(c),S(i);var l=g(i,2),f=M(l),_=M(f,!0);S(f);var v=g(f,2);te(v),S(l);var b=g(l,2),x=M(b),C=M(x,!0);S(x);var w=g(x,2);te(w),S(b),S(r);var E=g(r,2),D=M(E),ee=M(D,!0);S(D);var O=g(D,2);y(O),S(E);var ne=g(E,2),re=e=>{var t=it(),n=M(t),r=M(n),i=M(r,!0);S(r);var a=g(r,2),s=e=>{var t=nt(),n=M(t,!0);S(t),o(()=>A(n,d(Ln))),m(e,t)};p(a,e=>{d(Ln)&&e(s)}),S(n);var c=g(n,4),l=e=>{var t=Ne(),n=M(t,!0);S(t),o(()=>A(n,d(In))),m(e,t)};p(c,e=>{d(In)&&e(l)});var u=g(c,2),f=e=>{var t=rt(),n=M(t,!0);S(t),o(()=>A(n,d(L).paymentHint)),m(e,t)};p(u,e=>{d(L).paymentHint&&e(f)}),S(t),o(()=>A(i,d(L).paymentLabel)),m(e,t)};p(ne,e=>{d(En)&&e(re)}),S(n);var ae=g(n,2);ie(ae,()=>!1),S(t),o(()=>{A(s,d(L).nameLabel),k(c,`placeholder`,d(L).namePlaceholder),A(_,mt()?`${d(L).emailLabel} (optional)`:d(L).emailLabel),v.required=!mt(),k(v,`title`,d(L).emailInvalidTitle),k(v,`placeholder`,d(L).emailPlaceholder),A(C,d(L).phoneLabel),k(w,`placeholder`,d(L).phonePlaceholder),A(ee,d(L).notesLabel),k(O,`placeholder`,d(L).notesPlaceholder)}),u(`submit`,t,Wn),T(c,()=>d(Y),e=>h(Y,e)),T(v,()=>d(X),e=>h(X,e)),T(w,()=>d(xn),e=>h(xn,e)),T(O,()=>d(Sn),e=>h(Sn,e)),m(e,t)},er=e=>{var t=ot(),n=g(M(t),2),r=M(n,!0);S(n);var i=g(n,2);ie(i,()=>!1,()=>!0),S(t),o(()=>A(r,d(L).successMessage)),m(e,t)};return p(Xn,e=>{d(R)===`service`?e(Zn):d(R)===`datetime`&&d(z)?e(Qn,1):d(R)===`details`&&d(z)?e($n,2):d(R)===`success`&&e(er,3)}),S(qn),m(t,qn),v(Kn)}t([`click`]),customElements.define(`spa-booking-widget`,ie(lt,{heading:{attribute:`heading`,type:`String`},logoUrl:{attribute:`logo-url`,type:`String`},tagline:{attribute:`tagline`,type:`String`},description:{attribute:`description`,type:`String`},staffLabel:{attribute:`staff-label`,type:`String`},hidePrice:{attribute:`hide-price`,type:`Boolean`},skipDetailsStep:{attribute:`skip-details-step`,type:`Boolean`},emailOptional:{attribute:`email-optional`,type:`Boolean`},closedWeekdays:{attribute:`closed-weekdays`,type:`Array`},initialTreatmentTitle:{attribute:`initial-treatment-title`,type:`String`},initialDate:{attribute:`initial-date`,type:`String`},initialTime:{attribute:`initial-time`,type:`String`},initialName:{attribute:`initial-name`,type:`String`},initialEmail:{attribute:`initial-email`,type:`String`},initialPhone:{attribute:`initial-phone`,type:`String`},memberUntil:{attribute:`member-until`,type:`String`},locale:{attribute:`locale`,type:`String`},strings:{type:`Object`},fetchTreatments:{type:`Object`},fetchTherapists:{type:`Object`},fetchAvailability:{type:`Object`},submitBooking:{type:`Object`},createPaymentIntent:{type:`Object`},stripePublishableKey:{attribute:`stripe-publishable-key`,type:`String`},stripeAppearance:{type:`Object`}},[`heading`,`description`],[],{mode:`open`}));
1
+ import{B as e,C as t,D as n,E as r,F as i,G as a,H as o,J as s,L as c,M as l,N as u,O as d,P as f,Q as p,R as m,S as h,T as g,U as _,V as v,W as y,X as ee,Y as b,Z as x,_ as S,b as C,et as w,f as T,h as E,i as D,it as te,j as O,n as k,nt as ne,o as re,q as A,r as ie,rt as ae,s as j,t as oe,tt as M,v as se}from"./chunks/client-DNa0V682.js";import{a as ce,i as le,n as ue,r as de,t as fe}from"./chunks/floating-ui.dom-DY3dGoEq.js";import{i as pe,n as me,o as he,r as ge,s as _e,t as ve}from"./chunks/calendar-B8eNjUm2.js";import{t as ye}from"./chunks/stripe-BjXf5ZQJ.js";import{t as be}from"./chunks/preload-helper-Czpn1I53.js";var xe=e=>e;function Se(e,{delay:t=0,duration:n=400,easing:r=xe}={}){let i=+getComputedStyle(e).opacity;return{delay:t,duration:n,easing:r,css:e=>`opacity: ${e*i}`}}var Ce=d(`<strong class="svelte-1dxdgqu"> </strong>`),we=d(`<span class="svelte-1dxdgqu"> </span>`),Te=d(`<div class="sbw-summary-row sbw-summary-row-sub svelte-1dxdgqu"><span class="svelte-1dxdgqu"> </span> <!></div>`),Ee=d(`<div class="sbw-summary-row sbw-summary-row-sub svelte-1dxdgqu"><span class="svelte-1dxdgqu"> </span> <span class="svelte-1dxdgqu"> </span></div>`),De=d(`<span class="sbw-time-flash svelte-1dxdgqu"> </span>`),Oe=d(`<div class="sbw-summary-row sbw-summary-row-sub sbw-summary-row-datetime svelte-1dxdgqu"><span class="svelte-1dxdgqu"> </span> <!></div>`),ke=d(`<div class="sbw-summary-row sbw-summary-row-sub svelte-1dxdgqu"><span class="svelte-1dxdgqu"> </span> <span class="sbw-summary-row-bookedat-value svelte-1dxdgqu"> </span></div>`),Ae=d(`<div class="sbw-summary-total svelte-1dxdgqu"><span class="svelte-1dxdgqu"> </span> <strong class="svelte-1dxdgqu"> </strong></div>`),je=d(`<span class="sbw-spinner svelte-1dxdgqu"></span>`),Me=d(`<p class="sbw-hint svelte-1dxdgqu"> </p>`),Ne=d(`<p class="sbw-error-text svelte-1dxdgqu"> </p>`),Pe=d(`<button type="button" class="sbw-continue svelte-1dxdgqu"><!> <span class="svelte-1dxdgqu"> </span></button> <!> <!>`,1),Fe=d(`<button type="button" class="sbw-continue svelte-1dxdgqu"> </button> <button type="button" class="sbw-back sbw-back-service svelte-1dxdgqu"> </button>`,1),Ie=d(`<button type="submit" class="sbw-submit svelte-1dxdgqu"><!> <span class="svelte-1dxdgqu"> </span></button> <!> <button type="button" class="sbw-back sbw-back-service svelte-1dxdgqu"> </button>`,1),Le=d(`<aside class="sbw-summary svelte-1dxdgqu"><div class="sbw-summary-row svelte-1dxdgqu"><span class="svelte-1dxdgqu"> </span> <!></div> <!> <!> <!> <!> <!> <!></aside>`),Re=d(`<img class="sbw-logo svelte-1dxdgqu" alt=""/>`),ze=d(`<h2 class="sbw-heading svelte-1dxdgqu"> </h2> <div class="sbw-rule svelte-1dxdgqu"></div>`,1),Be=d(`<p class="sbw-tagline svelte-1dxdgqu"> </p>`),Ve=d(`<p class="sbw-description svelte-1dxdgqu"> </p>`),He=d(`<div class="sbw-intro svelte-1dxdgqu"><!> <!> <!> <!></div>`),Ue=d(`<span class="sbw-service-sub svelte-1dxdgqu"> </span>`),We=d(`<span class="sbw-service-price svelte-1dxdgqu"> </span>`),Ge=d(`<span class="sbw-service-prices svelte-1dxdgqu"><!> <!></span>`),Ke=d(`<li class="svelte-1dxdgqu"><button type="button" class="sbw-service-item svelte-1dxdgqu"><span class="sbw-service-name svelte-1dxdgqu"> <!></span> <!></button></li>`),qe=d(`<ul class="sbw-service-list svelte-1dxdgqu" role="list"></ul>`),Je=d(`<div class="sbw-body svelte-1dxdgqu"><h3 class="sbw-step-title svelte-1dxdgqu"> </h3> <!></div>`),Ye=d(`<li role="presentation" class="svelte-1dxdgqu"><button type="button" role="option" class="svelte-1dxdgqu"> </button></li>`),Xe=d(`<div class="sbw-therapist-filter svelte-1dxdgqu"><span class="sbw-visually-hidden svelte-1dxdgqu" id="sbw-therapist-filter-label"> </span> <button type="button" class="sbw-therapist-filter-trigger svelte-1dxdgqu" aria-haspopup="listbox" aria-labelledby="sbw-therapist-filter-label"><span class="svelte-1dxdgqu"> </span> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M6 9l6 6 6-6" stroke-linecap="round" stroke-linejoin="round" class="svelte-1dxdgqu"></path></svg></button> <ul popover="" role="listbox" class="sbw-therapist-filter-panel svelte-1dxdgqu"><li role="presentation" class="svelte-1dxdgqu"><button type="button" role="option" class="svelte-1dxdgqu"> </button></li> <!></ul></div>`),Ze=d(`<span></span>`),Qe=d(`<button type="button"><span class="svelte-1dxdgqu"> </span> <!></button>`),$e=d(`<button type="button"> </button>`),et=d(`<div class="sbw-slot-group svelte-1dxdgqu"><p class="sbw-slot-group-label svelte-1dxdgqu"> </p> <div class="sbw-slot-buttons svelte-1dxdgqu"></div></div>`),tt=d(`<div class="sbw-slot-groups svelte-1dxdgqu"></div>`),nt=d(`<div class="sbw-body sbw-datetime svelte-1dxdgqu"><div class="sbw-calendar-col svelte-1dxdgqu"><div class="sbw-cal-body svelte-1dxdgqu"><div class="sbw-cal-header svelte-1dxdgqu"><p class="sbw-cal-month svelte-1dxdgqu"> </p> <!> <div class="sbw-cal-nav svelte-1dxdgqu"><button type="button" class="svelte-1dxdgqu">‹</button> <button type="button" class="svelte-1dxdgqu">›</button></div></div> <div class="sbw-cal-weekdays svelte-1dxdgqu"></div> <div class="sbw-cal-grid svelte-1dxdgqu"></div></div> <div class="sbw-slots svelte-1dxdgqu"><!></div></div> <!></div>`),rt=d(`<span class="sbw-payment-amount svelte-1dxdgqu"> </span>`),it=d(`<p class="sbw-payment-hint svelte-1dxdgqu"> </p>`),at=d(`<div class="sbw-payment svelte-1dxdgqu"><div class="sbw-payment-header svelte-1dxdgqu"><span class="sbw-label svelte-1dxdgqu"> </span> <!></div> <div class="sbw-payment-slot-anchor svelte-1dxdgqu"></div> <!> <!></div>`),ot=d(`<form class="sbw-body sbw-datetime sbw-details svelte-1dxdgqu"><div class="sbw-details-fields svelte-1dxdgqu"><div class="sbw-grid svelte-1dxdgqu"><label class="sbw-field svelte-1dxdgqu"><span class="sbw-label svelte-1dxdgqu"> </span> <input type="text" required="" class="svelte-1dxdgqu"/></label> <label class="sbw-field svelte-1dxdgqu"><span class="sbw-label svelte-1dxdgqu"> </span> <input type="email" pattern="[^\\s@]+@[^\\s@]+\\.[^\\s@]+" class="svelte-1dxdgqu"/></label> <label class="sbw-field svelte-1dxdgqu"><span class="sbw-label svelte-1dxdgqu"> </span> <input type="tel" class="svelte-1dxdgqu"/></label></div> <label class="sbw-field sbw-notes-field svelte-1dxdgqu"><span class="sbw-label svelte-1dxdgqu"> </span> <textarea rows="3" class="svelte-1dxdgqu"></textarea></label> <!></div> <!></form>`),st=d(`<div class="sbw-success svelte-1dxdgqu"><div class="sbw-success-icon svelte-1dxdgqu"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" class="svelte-1dxdgqu"><path d="M5 13l4 4L19 7" stroke-linecap="round" stroke-linejoin="round" class="svelte-1dxdgqu"></path></svg></div> <p class="svelte-1dxdgqu"> </p> <!></div>`),ct=d(`<section class="sbw-root svelte-1dxdgqu"><!> <!></section>`),lt={hash:`svelte-1dxdgqu`,code:`.sbw-root.svelte-1dxdgqu {display:block;\r
2
+ /* Every layout breakpoint below is a container query against this box,\r
3
+ not the viewport. The widget is embedded in host layouts -- a narrow\r
4
+ column beside a summary card, a modal -- where the viewport says\r
5
+ nothing useful about the room it actually has; sized from the\r
6
+ viewport it laid out a wide-screen grid inside a ~700px column and\r
7
+ overflowed. Inline-size containment also stops the widget handing\r
8
+ its contents' min-content width up to the host. */container:sbw / inline-size;font-family:inherit;color:var(--sbw-text-color, #1a1a1a);background:var(--sbw-bg, #faf6ec);padding:var(--sbw-padding, 4rem 1.5rem);}.sbw-intro.svelte-1dxdgqu {max-width:var(--sbw-intro-max-width, 36rem);margin:0 auto;text-align:center;}.sbw-logo.svelte-1dxdgqu {height:var(--sbw-logo-height, 2.5rem);width:auto;margin:0 auto 1.5rem;display:block;}.sbw-heading.svelte-1dxdgqu {margin:0;font-size:2rem;font-family:var(--sbw-heading-font-family, inherit);}\r
9
+ @container sbw (min-width: 640px) {.sbw-heading.svelte-1dxdgqu {font-size:2.5rem;}\r
10
+ }.sbw-rule.svelte-1dxdgqu {width:4rem;height:1px;margin:1rem auto 0;background:var(--sbw-rule-color, rgba(196, 158, 90, 0.5));}.sbw-tagline.svelte-1dxdgqu {margin:1.5rem 0 0;font-style:italic;font-size:1.125rem;}.sbw-description.svelte-1dxdgqu {margin:1rem 0 0;font-size:1rem;line-height:1.6;}\r
11
+ /* Matches .sbw-heading/.sbw-description above so a host that slots its\r
12
+ own heading/description (instead of the heading/description attributes)\r
13
+ gets the same look for free -- targeted by the slot attribute, not a\r
14
+ class, so it works no matter what element or class the host uses. */::slotted([slot='heading']) {margin:0;font-size:2rem;font-family:var(--sbw-heading-font-family, inherit);}\r
15
+ @container sbw (min-width: 640px) {::slotted([slot='heading']) {font-size:2.5rem;}\r
16
+ }::slotted([slot='description']) {margin:1rem 0 0;font-size:1rem;line-height:1.6;}.sbw-body.svelte-1dxdgqu {max-width:var(--sbw-form-max-width, 40rem);margin:var(--sbw-body-margin-top, 3rem) auto 0;}.sbw-step-title.svelte-1dxdgqu {margin:0 0 1.25rem;font-size:0.75rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;opacity:0.6;}.sbw-hint.svelte-1dxdgqu {margin:0;font-size:0.875rem;opacity:0.6;}\r
17
+ \r
18
+ /* --- Service list --- */.sbw-service-list.svelte-1dxdgqu {list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:0.5rem;}.sbw-service-item.svelte-1dxdgqu {width:100%;display:flex;align-items:center;justify-content:space-between;gap:1rem;border-radius:2px;border:1px solid var(--sbw-border-color, rgba(0, 0, 0, 0.15));background:var(--sbw-input-bg, #fff);padding:0.9rem 1.1rem;font:inherit;font-size:0.9375rem;color:inherit;cursor:pointer;text-align:left;transition:border-color 150ms ease, background-color 150ms ease, transform 150ms ease;}.sbw-service-item.svelte-1dxdgqu:hover:not(:disabled) {border-color:color-mix(in oklab, var(--sbw-text-color, #1a1a1a) 40%, transparent);background:var(--sbw-service-hover-bg, rgba(0, 0, 0, 0.03));color:var(--sbw-service-hover-color, inherit);transform:translateX(2px);}.sbw-service-price.svelte-1dxdgqu {font-weight:600;color:var(--sbw-accent-color, #c49e5a);}.sbw-service-item.svelte-1dxdgqu:hover:not(:disabled) .sbw-service-price:where(.svelte-1dxdgqu) {color:var(--sbw-service-hover-price-color, var(--sbw-accent-color, #c49e5a));}\r
19
+ /* A regulars-only service the visitor doesn't qualify for: still listed\r
20
+ (so they know it exists), dimmed like the calendar's unavailable days. */.sbw-service-item.svelte-1dxdgqu:disabled {cursor:default;opacity:0.5;}.sbw-service-name.svelte-1dxdgqu,\r
21
+ .sbw-service-prices.svelte-1dxdgqu {display:flex;flex-direction:column;gap:0.15rem;}.sbw-service-prices.svelte-1dxdgqu {align-items:flex-end;flex-shrink:0;text-align:right;}.sbw-service-sub.svelte-1dxdgqu {font-size:0.8125rem;font-weight:400;opacity:0.7;}\r
22
+ \r
23
+ /* --- Datetime step: two-column layout, single column when narrow --- */.sbw-datetime.svelte-1dxdgqu {display:grid;grid-template-columns:1fr;gap:2rem;max-width:var(--sbw-datetime-max-width, 52rem);\r
24
+ /* A second container, because the calendar/slots split below depends on\r
25
+ what the calendar column gets rather than on the whole widget: this\r
26
+ row is capped by --sbw-datetime-max-width and gives 16rem of itself\r
27
+ to the summary, so the root's width alone cannot answer it. */container:sbw-dt / inline-size;}\r
28
+ /* 38rem is what this actually needs: 20rem of calendar (the same comfortable\r
29
+ minimum the split below uses) + the 16rem summary + the 2rem between them.\r
30
+ No padding term -- an inline-size container is measured on its content\r
31
+ box, so the root's own padding is already out of this number. The old\r
32
+ 800px was a viewport figure and far too conservative once measured\r
33
+ against the widget instead: it stacked the summary under a widget with\r
34
+ room to spare. */\r
35
+ @container sbw (min-width: 38rem) {.sbw-datetime.svelte-1dxdgqu {grid-template-columns:1fr 16rem;align-items:start;}\r
36
+ }\r
37
+ /* Calendar and slots side by side (not stacked) once there's room for\r
38
+ both plus the 16rem summary column -- a plain calendar-then-slots\r
39
+ stack read as a long, sparse list. .sbw-cal-body wraps the weekday\r
40
+ labels + day grid into one grid item (rather than giving them each\r
41
+ their own template row) so its height is independent of how tall\r
42
+ .sbw-slots is -- with each in its own row instead, a long slots\r
43
+ list (a busy day can have 20+ times) inflated the *shared* row\r
44
+ tracks and pushed the day grid visually away from its own weekday\r
45
+ header. Slots gets the flexible remaining column so extra width\r
46
+ goes into more time-chip columns instead of unused space; the\r
47
+ calendar gets a comfortable range (not a single fixed number) so it\r
48
+ can grow a little on very wide hosts instead of looking squashed\r
49
+ next to a much wider slots column, while still stopping well short\r
50
+ of the dead-space-between-date-numbers stretching a bare 1fr gave it. */\r
51
+ /* 54rem is the width this split actually needs, not a round number: the\r
52
+ calendar's own minimum (20rem) plus the slots column's (14rem) plus the\r
53
+ 2rem between them is 36rem, and in two-column mode this row has already\r
54
+ given 16rem + 2rem to the summary. Below it the two stack instead, which\r
55
+ is why the query is on the row rather than on the root -- a wide page\r
56
+ with a narrow widget must still stack. Note the 52rem default cap on\r
57
+ --sbw-datetime-max-width is under this, so a host wanting the calendar\r
58
+ and slots side by side has to raise it. */\r
59
+ @container sbw-dt (min-width: 54rem) {.sbw-calendar-col.svelte-1dxdgqu {display:grid;grid-template-columns:minmax(20rem, 28rem) minmax(14rem, 1fr);grid-template-areas:'body slots';column-gap:2rem;align-items:start;}.sbw-cal-body.svelte-1dxdgqu {grid-area:body;}.sbw-slots.svelte-1dxdgqu {grid-area:slots;}\r
60
+ /* Extra specificity (not just .sbw-slots) so this reliably beats the\r
61
+ unconditional base rule below regardless of source order -- the\r
62
+ top border/margin/padding there exists to separate slots from a\r
63
+ calendar stacked *above* it on narrow/mobile widths; side by side,\r
64
+ it read as a stray line with nothing for it to separate. */.sbw-calendar-col.svelte-1dxdgqu .sbw-slots:where(.svelte-1dxdgqu) {margin-top:0;border-top:none;padding-top:0;}\r
65
+ }.sbw-cal-header.svelte-1dxdgqu {display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:0.5rem;}.sbw-cal-month.svelte-1dxdgqu {margin:0;font-size:1rem;font-weight:600;}.sbw-visually-hidden.svelte-1dxdgqu {position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;}.sbw-therapist-filter.svelte-1dxdgqu {position:relative;}.sbw-therapist-filter-trigger.svelte-1dxdgqu {display:flex;align-items:center;gap:0.5rem;border-radius:9999px;border:2px solid var(--sbw-border-color, rgba(0, 0, 0, 0.15));background:var(--sbw-input-bg, #fff);color:inherit;font:inherit;font-size:0.8125rem;padding:0.4rem 0.85rem;cursor:pointer;transition:border-color 320ms ease-out;}.sbw-therapist-filter-trigger.svelte-1dxdgqu:hover,\r
66
+ .sbw-therapist-filter-trigger.svelte-1dxdgqu:focus-visible {border-color:var(--sbw-accent-color, #c49e5a);outline:none;}.sbw-chevron.svelte-1dxdgqu {width:1rem;height:1rem;flex-shrink:0;opacity:0.6;transition:transform 200ms ease;}.sbw-chevron-open.svelte-1dxdgqu {transform:rotate(180deg);}\r
67
+ /* Native <select> option lists can't be styled -- they render as the\r
68
+ browser's own unthemed popup regardless of any CSS here, which read\r
69
+ as a jarring plain-white box against a themed (esp. dark) host page.\r
70
+ This is a real listbox (button + popover), styled as a proper\r
71
+ floating panel: opaque fill (not the translucent --sbw-input-bg\r
72
+ inputs use, which assumes a solid page behind it -- this overlays\r
73
+ arbitrary content) with an accent-tinted border and glow instead of\r
74
+ a flat neutral edge. The 30%/25% mix amounts aren't picked to taste --\r
75
+ they're the same two fixed proportions this library's other floating\r
76
+ panels use for an accent border + glow (not a third, invented\r
77
+ opacity), so re-skinning --sbw-accent-color still lands on a\r
78
+ consistent-looking panel instead of a one-off tint. */.sbw-therapist-filter-panel.svelte-1dxdgqu {position:fixed;inset:auto;margin:0;min-width:9rem;max-height:15rem;overflow:auto;list-style:none;padding:0.25rem;border-radius:10px;border:1px solid color-mix(in oklab, var(--sbw-accent-color, #c49e5a) 30%, transparent);background:var(--sbw-bg, #faf6ec);box-shadow:0 8px 24px rgba(0, 0, 0, 0.16), 0 0 24px color-mix(in oklab, var(--sbw-accent-color, #c49e5a) 25%, transparent);}.sbw-therapist-filter-panel.svelte-1dxdgqu button:where(.svelte-1dxdgqu) {display:block;width:100%;border:none;border-radius:6px;background:transparent;color:inherit;font:inherit;text-align:left;padding:0.5rem 0.75rem;font-size:0.8125rem;cursor:pointer;}.sbw-therapist-filter-panel.svelte-1dxdgqu button:where(.svelte-1dxdgqu):hover,\r
79
+ .sbw-therapist-filter-panel.svelte-1dxdgqu button[aria-selected='true']:where(.svelte-1dxdgqu) {background:color-mix(in oklab, var(--sbw-accent-color, #c49e5a) 15%, transparent);}.sbw-cal-nav.svelte-1dxdgqu {display:flex;gap:0.25rem;}.sbw-cal-nav.svelte-1dxdgqu button:where(.svelte-1dxdgqu) {position:relative;z-index:0;display:flex;height:2.75rem;width:2.75rem;align-items:center;justify-content:center;border-radius:9999px;border:2px solid var(--sbw-cal-nav-border-color, var(--sbw-border-color, rgba(0, 0, 0, 0.15)));background:none;color:var(--sbw-text-color, #1a1a1a);font-size:1.375rem;cursor:pointer;transition:border-color 320ms ease-out, color 320ms ease-out;}\r
80
+ /* A fill growing from the button's centre (clip-path), not a flat\r
81
+ colour cross-fade -- matches this library's other circular nav\r
82
+ control (VenueCarousel's prev/next). Separate hook from\r
83
+ --sbw-cal-hover-bg (the day-cell hover fill) on purpose: a consumer\r
84
+ whose day-cell text needs that fill to stay same-color-as-background\r
85
+ invisible (see mens-cave-barbers) still wants these nav buttons --\r
86
+ icon glyphs, not text that could vanish -- to invert fully on hover.\r
87
+ Falls back to the day-cell variable, then the original hardcoded\r
88
+ tint, so existing consumers see no change. */.sbw-cal-nav.svelte-1dxdgqu button:where(.svelte-1dxdgqu)::before {content:'';position:absolute;inset:0;z-index:-1;border-radius:inherit;background:var(--sbw-cal-nav-hover-bg, var(--sbw-cal-hover-bg, color-mix(in oklab, var(--sbw-text-color, #1a1a1a) 6%, transparent)));clip-path:circle(0% at 50% 50%);transition:clip-path 800ms cubic-bezier(0.16, 1, 0.3, 1);}.sbw-cal-nav.svelte-1dxdgqu button:where(.svelte-1dxdgqu):hover:not(:disabled) {border-color:var(--sbw-cal-nav-hover-border-color, var(--sbw-accent-color, #c49e5a));color:var(--sbw-cal-nav-hover-color, var(--sbw-text-color, #1a1a1a));}.sbw-cal-nav.svelte-1dxdgqu button:where(.svelte-1dxdgqu):hover:not(:disabled)::before {clip-path:circle(150% at 50% 50%);}\r
89
+ /* The click-pulse (below) is this button's whole click-confirmation --\r
90
+ no separate :active press state, so the two don't stack into a\r
91
+ double-bounce (shrink-on-press, then the pulse's own scale-up).\r
92
+ :global() on the pulse class itself -- it's only ever added via\r
93
+ classList.add() in pulseNavButton above, never as a literal class\r
94
+ in this template, so Svelte's unused-CSS pruning silently deleted\r
95
+ this whole rule (keeping the @keyframes, which isn't pruned the\r
96
+ same way) without :global() marking it as intentionally dynamic. */\r
97
+ @keyframes svelte-1dxdgqu-sbw-cal-nav-pulse {\r
98
+ 0% { transform: scale(1); }\r
99
+ 50% { transform: scale(1.18); }\r
100
+ 100% { transform: scale(1); }\r
101
+ }.sbw-cal-nav.svelte-1dxdgqu button:where(.svelte-1dxdgqu).sbw-cal-nav-pulse {\r
102
+ animation: svelte-1dxdgqu-sbw-cal-nav-pulse 320ms ease-out;}.sbw-cal-nav.svelte-1dxdgqu button:where(.svelte-1dxdgqu):disabled {cursor:default;opacity:0.3;}.sbw-cal-weekdays.svelte-1dxdgqu {display:grid;grid-template-columns:repeat(7, 1fr);margin-top:1rem;text-align:center;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.1em;opacity:0.4;}.sbw-cal-grid.svelte-1dxdgqu {display:grid;grid-template-columns:repeat(7, 1fr);gap:2px;margin-top:0.25rem;}.sbw-cal-cell.svelte-1dxdgqu {height:3rem;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;border:2px solid transparent;border-radius:8px;background:none;font:inherit;font-size:0.875rem;color:inherit;cursor:pointer;transition:border-color 320ms ease-out, background-color 320ms ease-out, color 320ms ease-out;}\r
103
+ /* Excludes .sbw-cal-cell-selected: this selector out-ranks the selected\r
104
+ rule below (two pseudo-classes vs. one plain class), and without the\r
105
+ exclusion hovering the selected day replaced its solid accent fill\r
106
+ with this dimmer tint, reading as deselected while the mouse was over\r
107
+ it. Same fix as AvailabilityCalendar.svelte's .ac-edge exclusion. */.sbw-cal-cell.svelte-1dxdgqu:hover:not(:disabled):not(.sbw-cal-cell-selected) {background:var(--sbw-cal-hover-bg, color-mix(in oklab, var(--sbw-text-color, #1a1a1a) 6%, transparent));color:var(--sbw-cal-hover-color, inherit);border-color:var(--sbw-accent-color, #c49e5a);}.sbw-cal-cell.svelte-1dxdgqu:disabled {cursor:default;}.sbw-cal-cell-off.svelte-1dxdgqu span:where(.svelte-1dxdgqu) {opacity:0.2;}.sbw-cal-cell.svelte-1dxdgqu:disabled:not(.sbw-cal-cell-off) span:where(.svelte-1dxdgqu):first-child {opacity:0.3;}.sbw-cal-cell-selected.svelte-1dxdgqu {background:var(--sbw-accent-color, #c49e5a);}.sbw-cal-cell-selected.svelte-1dxdgqu span:where(.svelte-1dxdgqu) {color:var(--sbw-accent-contrast, #fff);}.sbw-dot.svelte-1dxdgqu {width:4px;height:4px;border-radius:9999px;background:var(--sbw-accent-color, #c49e5a);}.sbw-dot-1.svelte-1dxdgqu {opacity:0.35;}.sbw-dot-2.svelte-1dxdgqu {opacity:0.65;}.sbw-dot-3.svelte-1dxdgqu {opacity:1;width:5px;height:5px;}\r
108
+ /* Keeps the availability dot visible against --sbw-cal-hover-color's own\r
109
+ fill -- without this it stayed --sbw-accent-color, which on a theme\r
110
+ where hover flips to a dark fill with accent-colored TEXT (rather\r
111
+ than the default light tint) would otherwise put an accent dot on an\r
112
+ accent-colored background. */.sbw-cal-cell.svelte-1dxdgqu:hover:not(:disabled):not(.sbw-cal-cell-selected) .sbw-dot:where(.svelte-1dxdgqu) {background:var(--sbw-cal-hover-color, var(--sbw-accent-color, #c49e5a));}.sbw-cal-cell-selected.svelte-1dxdgqu .sbw-dot:where(.svelte-1dxdgqu) {background:var(--sbw-accent-contrast, #fff);opacity:1;}.sbw-slots.svelte-1dxdgqu {margin-top:1.5rem;border-top:1px solid var(--sbw-border-color, rgba(0, 0, 0, 0.15));padding-top:1.25rem;}\r
113
+ /* One column, not auto-fit -- auto-fit let Morning/Afternoon/Evening\r
114
+ sit side-by-side whenever the container was wide (e.g. the\r
115
+ dashboard's full-width reschedule sheet), each cramped into a\r
116
+ narrow track instead of the slot-buttons grid using the full\r
117
+ width. Stacking the groups keeps each one's own 2-column button\r
118
+ grid legible regardless of how wide the widget is rendered. */.sbw-slot-groups.svelte-1dxdgqu {display:grid;grid-template-columns:1fr;gap:1.25rem;}.sbw-slot-group-label.svelte-1dxdgqu {margin:0 0 0.5rem;font-size:0.75rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;color:var(--sbw-slot-label-color, inherit);opacity:var(--sbw-slot-label-opacity, 0.5);}\r
119
+ /* auto-fit: use as many columns as the (now flexible-width) slots\r
120
+ area actually has room for, instead of a fixed count that either\r
121
+ stretches into giant pills on a wide column or wastes space on a\r
122
+ narrow one. */.sbw-slot-buttons.svelte-1dxdgqu {display:grid;grid-template-columns:repeat(auto-fit, minmax(5.5rem, 1fr));gap:0.4rem;}.sbw-slot-btn.svelte-1dxdgqu {border-radius:9999px;border:2px solid var(--sbw-border-color, rgba(0, 0, 0, 0.35));background:var(--sbw-input-bg, #fff);box-shadow:0 1px 2px rgba(0, 0, 0, 0.06);padding:0.5rem 0.9rem;font:inherit;font-size:0.8125rem;color:inherit;cursor:pointer;transition:border-color 320ms ease-out, background-color 320ms ease-out, color 320ms ease-out;}\r
123
+ /* Excludes .sbw-slot-btn-selected for the same reason as .sbw-cal-cell's\r
124
+ own hover exclusion above: this selector's two classes + :hover\r
125
+ otherwise out-ranks that one plain class and hovering the already-\r
126
+ selected slot would replace its solid accent fill with this one. */.sbw-slot-btn.svelte-1dxdgqu:hover:not(.sbw-slot-btn-selected) {border-color:var(--sbw-accent-color, #c49e5a);background:var(--sbw-slot-hover-bg, var(--sbw-input-bg, #fff));color:var(--sbw-slot-hover-color, inherit);}.sbw-slot-btn-selected.svelte-1dxdgqu {background:var(--sbw-accent-color, #c49e5a);border-color:var(--sbw-accent-color, #c49e5a);color:var(--sbw-accent-contrast, #fff);\r
127
+ /* Replays whenever this class lands on a *different* button (auto-pick\r
128
+ or a manual re-pick), since that's a fresh application of the\r
129
+ animation property -- makes the pick noticeable instead of a silent\r
130
+ state change several buttons over from where the visitor is looking. */\r
131
+ animation: svelte-1dxdgqu-sbw-slot-pop 0.3s ease;}\r
132
+ @keyframes svelte-1dxdgqu-sbw-slot-pop {\r
133
+ 0% { transform: scale(0.92); }\r
134
+ 60% { transform: scale(1.04); }\r
135
+ 100% { transform: scale(1); }\r
136
+ }\r
137
+ /* Flashes gold then settles, so a silently auto-picked time in the summary\r
138
+ panel (easy to miss, off to the side) draws the eye same as the pop\r
139
+ above does for the slot button itself. */.sbw-time-flash.svelte-1dxdgqu {\r
140
+ animation: svelte-1dxdgqu-sbw-time-flash 0.6s ease;}\r
141
+ @keyframes svelte-1dxdgqu-sbw-time-flash {\r
142
+ 0% { color: var(--sbw-accent-color, #c49e5a); }\r
143
+ 100% { color: inherit; }\r
144
+ }\r
145
+ \r
146
+ /* --- Summary panel --- */\r
147
+ /* Sticky, and it carries the primary CTA -- a Floating panel (canon:\r
148
+ accent-tinted border + matching glow, same 30%/25% mix the\r
149
+ therapist-filter panel uses) rather than Card surface's neutral\r
150
+ border, so it reads as raised/active instead of another content\r
151
+ block. Opaque --sbw-bg, not the translucent --sbw-input-bg inputs\r
152
+ use -- that assumes a solid page directly behind it, but this\r
153
+ panel sticks over whatever's scrolled underneath it. */.sbw-summary.svelte-1dxdgqu {border-radius:4px;border:1px solid color-mix(in oklab, var(--sbw-accent-color, #c49e5a) 30%, transparent);background:var(--sbw-bg, #fff);box-shadow:0 8px 24px rgba(0, 0, 0, 0.16), 0 0 24px color-mix(in oklab, var(--sbw-accent-color, #c49e5a) 25%, transparent);padding:1.25rem;}\r
154
+ @container sbw (min-width: 38rem) {.sbw-summary.svelte-1dxdgqu {position:sticky;top:var(--sbw-summary-sticky-top, 1rem);}\r
155
+ }.sbw-summary-row.svelte-1dxdgqu {display:flex;align-items:baseline;justify-content:space-between;gap:0.75rem;font-size:0.9375rem;font-weight:600;}.sbw-summary-row-sub.svelte-1dxdgqu {margin-top:0.5rem;font-size:0.8125rem;font-weight:400;opacity:0.65;}\r
156
+ /* Date and time are one fact, not a label/value pair -- keep them\r
157
+ next to each other instead of the row's default space-between,\r
158
+ which stretched them to opposite edges. Also the one -sub row that's\r
159
+ actually the point of the summary (which slot you're about to book),\r
160
+ so it overrides -sub's dimmed/thin defaults back up to fully legible\r
161
+ instead of reading as fine print like the optional staff row above it. */.sbw-summary-row-datetime.svelte-1dxdgqu {justify-content:flex-start;gap:0.375rem;font-size:var(--sbw-summary-datetime-size, 0.875rem);font-weight:var(--sbw-summary-datetime-weight, 700);color:var(--sbw-summary-datetime-color, inherit);opacity:var(--sbw-summary-datetime-opacity, 1);}\r
162
+ /* The post-booking "Booked" row's own timestamp value -- same\r
163
+ reasoning and same variables as .sbw-summary-row-datetime above (it's\r
164
+ the confirmed date/time, the actual point of this receipt-like row,\r
165
+ not a footnote), just scoped to the value span rather than the whole\r
166
+ row since this row keeps its label/value layout (space-between),\r
167
+ unlike the label-less date+time row above. */.sbw-summary-row-bookedat-value.svelte-1dxdgqu {font-weight:var(--sbw-summary-datetime-weight, 700);color:var(--sbw-summary-datetime-color, inherit);opacity:var(--sbw-summary-datetime-opacity, 1);}.sbw-summary-total.svelte-1dxdgqu {display:flex;align-items:baseline;justify-content:space-between;margin-top:1rem;padding-top:1rem;border-top:1px solid var(--sbw-summary-total-border-color, var(--sbw-border-color, rgba(0, 0, 0, 0.15)));font-size:0.9375rem;}.sbw-summary-total.svelte-1dxdgqu strong:where(.svelte-1dxdgqu) {font-size:1.125rem;color:var(--sbw-accent-color, #c49e5a);}.sbw-continue.svelte-1dxdgqu {display:inline-flex;align-items:center;justify-content:center;gap:0.5rem;width:100%;margin-top:1.25rem;cursor:pointer;border:none;border-radius:2px;background:var(--sbw-accent-bg, #1a1a1a);color:var(--sbw-accent-contrast, #fff);padding:0.8rem;font-size:0.75rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;transition:background-color 150ms ease;}.sbw-continue.svelte-1dxdgqu:hover:not(:disabled) {background:var(--sbw-accent-hover-bg, #333);}.sbw-continue.svelte-1dxdgqu:disabled {cursor:default;opacity:0.4;}\r
168
+ \r
169
+ /* --- Details step --- */.sbw-back.svelte-1dxdgqu {display:inline-block;margin-bottom:1.5rem;border:none;background:none;padding:0;font:inherit;color:inherit;font-size:0.8125rem;opacity:var(--sbw-back-opacity, 0.6);cursor:pointer;}.sbw-back.svelte-1dxdgqu:hover {opacity:var(--sbw-back-hover-opacity, 1);}.sbw-back-service.svelte-1dxdgqu {display:block;width:100%;margin-top:0.75rem;text-align:center;}.sbw-grid.svelte-1dxdgqu {display:grid;gap:1.25rem;}\r
170
+ @container sbw (min-width: 640px) {.sbw-grid.svelte-1dxdgqu {grid-template-columns:1fr 1fr;}\r
171
+ }.sbw-field.svelte-1dxdgqu {display:flex;flex-direction:column;gap:0.5rem;}.sbw-label.svelte-1dxdgqu {font-size:0.75rem;font-weight:300;text-transform:uppercase;letter-spacing:0.05em;}.sbw-field.svelte-1dxdgqu input:where(.svelte-1dxdgqu),\r
172
+ .sbw-field.svelte-1dxdgqu textarea:where(.svelte-1dxdgqu) {border-radius:2px;border:1px solid var(--sbw-border-color, rgba(0, 0, 0, 0.15));background:var(--sbw-input-bg, #fff);padding:0.75rem 1rem;font-size:0.875rem;font-family:inherit;color:inherit;}.sbw-field.svelte-1dxdgqu input:where(.svelte-1dxdgqu):focus,\r
173
+ .sbw-field.svelte-1dxdgqu textarea:where(.svelte-1dxdgqu):focus {outline:none;border-color:color-mix(in oklab, var(--sbw-text-color, #1a1a1a) 40%, transparent);}.sbw-field.svelte-1dxdgqu input:where(.svelte-1dxdgqu)::placeholder,\r
174
+ .sbw-field.svelte-1dxdgqu textarea:where(.svelte-1dxdgqu)::placeholder {color:var(--sbw-placeholder-color, color-mix(in oklab, var(--sbw-text-color, #1a1a1a) 45%, transparent));}\r
175
+ /* Browser autofill (matched saved Name/Email data) paints its own\r
176
+ background on these inputs via a UA style strong enough that plain\r
177
+ \`background\` can't win -- box-shadow can, so this fakes the field's\r
178
+ normal look with an opaque inset fill instead. --sbw-input-autofill-bg\r
179
+ falls back to --sbw-input-bg, which is enough for most themes (an\r
180
+ opaque light input already matches when autofilled); only a theme\r
181
+ whose --sbw-input-bg is itself transparent (mens-cave-barbers: fields\r
182
+ defined by their border, not a fill, over a solid page background)\r
183
+ needs to set this separately to that real opaque colour, or the\r
184
+ browser's own fill shows through unmasked. The absurd transition delay\r
185
+ is the standard defeat for Chrome's own internal autofill-background\r
186
+ transition, which otherwise animates its colour in after this applies. */.sbw-field.svelte-1dxdgqu input:where(.svelte-1dxdgqu):-webkit-autofill,\r
187
+ .sbw-field.svelte-1dxdgqu textarea:where(.svelte-1dxdgqu):-webkit-autofill,\r
188
+ .sbw-field.svelte-1dxdgqu input:where(.svelte-1dxdgqu):-webkit-autofill:hover,\r
189
+ .sbw-field.svelte-1dxdgqu textarea:where(.svelte-1dxdgqu):-webkit-autofill:hover,\r
190
+ .sbw-field.svelte-1dxdgqu input:where(.svelte-1dxdgqu):-webkit-autofill:focus,\r
191
+ .sbw-field.svelte-1dxdgqu textarea:where(.svelte-1dxdgqu):-webkit-autofill:focus {-webkit-text-fill-color:var(--sbw-text-color, #1a1a1a);-webkit-box-shadow:0 0 0 1000px var(--sbw-input-autofill-bg, var(--sbw-input-bg, #fff)) inset;box-shadow:0 0 0 1000px var(--sbw-input-autofill-bg, var(--sbw-input-bg, #fff)) inset;transition:background-color 600000s ease-in-out 0s;}.sbw-notes-field.svelte-1dxdgqu {margin-top:1.25rem;}.sbw-payment.svelte-1dxdgqu {display:flex;flex-direction:column;gap:0.5rem;margin-top:1.25rem;}.sbw-payment-header.svelte-1dxdgqu {display:flex;align-items:baseline;justify-content:space-between;gap:1rem;}.sbw-payment-amount.svelte-1dxdgqu {font-size:0.875rem;font-weight:600;color:var(--sbw-accent-color, #c49e5a);}.sbw-payment-slot-anchor.svelte-1dxdgqu slot[name='payment-mount'] {display:block;}\r
192
+ /* The mount node is a light-DOM child of the host projected in through\r
193
+ that slot (see setupPayment) -- only ::slotted() reaches it. */::slotted(.sbw-payment-element) {display:block;border-radius:2px;border:1px solid var(--sbw-border-color, rgba(0, 0, 0, 0.15));background:var(--sbw-input-bg, #fff);padding:0.9rem;}.sbw-payment-hint.svelte-1dxdgqu {margin:0;font-size:0.75rem;opacity:0.6;}.sbw-submit.svelte-1dxdgqu {display:inline-flex;align-items:center;justify-content:center;gap:0.5rem;width:100%;margin-top:1.25rem;cursor:pointer;border:none;border-radius:2px;background:var(--sbw-accent-bg, #1a1a1a);color:var(--sbw-accent-contrast, #fff);padding:0.8rem;font-size:0.75rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;transition:background-color 150ms ease;}.sbw-submit.svelte-1dxdgqu:hover:not(:disabled) {background:var(--sbw-accent-hover-bg, #333);}.sbw-submit.svelte-1dxdgqu:disabled {cursor:default;opacity:0.6;}.sbw-spinner.svelte-1dxdgqu {height:1rem;width:1rem;border-radius:9999px;border:2px solid color-mix(in oklab, var(--sbw-accent-contrast, #fff) 30%, transparent);border-top-color:var(--sbw-accent-contrast, #fff);\r
194
+ animation: svelte-1dxdgqu-sbw-spin 0.7s linear infinite;}\r
195
+ @keyframes svelte-1dxdgqu-sbw-spin {\r
196
+ to {\r
197
+ transform: rotate(360deg);\r
198
+ }\r
199
+ }\r
200
+ @media (prefers-reduced-motion: reduce) {.sbw-spinner.svelte-1dxdgqu {\r
201
+ animation: none;}.sbw-slot-btn-selected.svelte-1dxdgqu,\r
202
+ .sbw-time-flash.svelte-1dxdgqu {\r
203
+ animation: none;}\r
204
+ }.sbw-error-text.svelte-1dxdgqu {margin:0.75rem 0 0;font-size:0.8125rem;color:var(--sbw-danger-color, #dc2626);}\r
205
+ \r
206
+ /* --- Success --- */.sbw-success.svelte-1dxdgqu {max-width:var(--sbw-form-max-width, 40rem);margin:3rem auto 0;text-align:center;}.sbw-success-icon.svelte-1dxdgqu {display:flex;align-items:center;justify-content:center;width:3rem;height:3rem;margin:0 auto 1rem;border-radius:9999px;background:var(--sbw-success-bg, #c49e5a);color:#fff;}.sbw-success-icon.svelte-1dxdgqu svg:where(.svelte-1dxdgqu) {width:1.5rem;height:1.5rem;}.sbw-success.svelte-1dxdgqu .sbw-summary:where(.svelte-1dxdgqu) {margin-top:2rem;text-align:left;}.sbw-success.svelte-1dxdgqu p:where(.svelte-1dxdgqu) {margin:0;font-size:1.125rem;}`};function ut(d,O){p(O,!0),E(d,lt);let oe=(i,a=ae,u)=>{let d=s(()=>ne(u?.(),!1));var p=n(),m=v(p),_=i=>{var s=Le(),u=e(s),p=e(u),m=e(p,!0);M(p);var _=o(p,2),y=t=>{var n=Ce(),i=e(n,!0);M(n),c(e=>g(i,e),[()=>Ft(f(q).amount)]),r(t,n)},ee=b(()=>f(q)&&It(f(q).amount));t(_,e=>{f(ee)&&e(y)}),M(u);var x=o(u,2),C=n=>{var i=Te(),a=e(i),s=e(a,!0);M(a);var l=o(a,2),u=t=>{var n=we(),i=e(n);M(n),c(e=>g(i,`−${e??``}`),[()=>Ft(f(R).price-f(q).amount)]),r(t,n)};t(l,e=>{f(R).price!=null&&f(R).price>f(q).amount&&e(u)}),M(i),c(()=>g(s,f(I).memberRateLabel)),r(n,i)};t(x,e=>{!ht()&&f(q)?.member&&e(C)});var w=o(x,2),T=t=>{var n=Ee(),i=e(n),a=e(i,!0);M(i);var s=o(i,2),l=e(s,!0);M(s),M(n),c(()=>{g(a,f(I).staffRowLabel),g(l,mt())}),r(t,n)};t(w,e=>{mt()&&e(T)});var E=o(w,2),D=t=>{var n=Oe(),i=e(n),a=e(i,!0);M(i);var s=o(i,2);h(s,()=>f(G),t=>{var n=De(),i=e(n,!0);M(n),c(()=>g(i,f(G))),S(1,n,()=>Se,()=>({duration:200})),r(t,n)}),M(n),c(e=>g(a,e),[()=>me(f(W),P())]),r(t,n)};t(E,e=>{f(W)&&f(G)&&e(D)});var te=o(E,2),O=t=>{var n=ke(),i=e(n),a=e(i,!0);M(i);var s=o(i,2),l=e(s);M(s),M(n),c((e,t)=>{g(a,f(I).bookedAtLabel),g(l,`${e??``}
207
+ ${t??``}`)},[()=>f(en).toLocaleDateString(P(),{day:`numeric`,month:`short`}),()=>f(en).toLocaleTimeString(P(),{hour:`2-digit`,minute:`2-digit`})]),r(t,n)};t(te,e=>{f(d)&&f(en)&&e(O)});var k=o(te,2),ne=t=>{var n=Ae(),i=e(n),a=e(i,!0);M(i);var s=o(i,2),l=e(s,!0);M(s),M(n),c(e=>{g(a,f(I).totalLabel),g(l,e)},[()=>Ft(f(q).amount)]),r(t,n)},re=b(()=>f(q)&&It(f(q).amount));t(k,e=>{f(re)&&e(ne)});var A=o(k,2),ie=i=>{var s=n(),u=v(s),d=n=>{var i=Pe(),a=v(i),s=e(a),u=e=>{var t=je();r(e,t)};t(s,e=>{f(Z)&&e(u)});var d=o(s,2),p=e(d,!0);M(d),M(a);var m=o(a,2),h=t=>{var n=Me(),i=e(n,!0);M(n),c(()=>g(i,f(I).noChangeHint)),r(t,n)};t(m,e=>{f(fn)&&e(h)});var _=o(m,2),y=t=>{var n=Ne(),i=e(n,!0);M(n),c(()=>g(i,f(Q))),r(t,n)};t(_,e=>{f(Q)&&e(y)}),c(()=>{a.disabled=!f(G)||f(Z)||f(fn),g(p,f(Z)?f(I).confirmingLabel:f(I).confirmRescheduleLabel)}),l(`click`,a,Zn),r(n,i)},p=t=>{var n=Fe(),i=v(n),a=e(i,!0);M(i);var s=o(i,2),u=e(s);M(s),c(()=>{i.disabled=!f(G),g(a,f(I).continueLabel),g(u,`← ${f(I).changeServiceLabel??``}`)}),l(`click`,i,Tn),l(`click`,s,Dn),r(t,n)},m=n=>{var i=Ie(),a=v(i),s=e(a),u=e=>{var t=je();r(e,t)};t(s,e=>{f(Z)&&e(u)});var d=o(s,2),p=e(d,!0);M(d),M(a);var m=o(a,2),h=t=>{var n=Ne(),i=e(n,!0);M(n),c(()=>g(i,f(Q))),r(t,n)};t(m,e=>{f(Q)&&e(h)});var _=o(m,2),y=e(_);M(_),c(()=>{a.disabled=f(Z)||f(Vn),g(p,f(Z)?f(I).confirmingLabel:f(Mn)?f(I).confirmPayLabel:f(I).confirmLabel),g(y,`← ${f(I).backLabel??``}`)}),l(`click`,_,En),r(n,i)};t(u,e=>{a()&&N()?e(d):a()?e(p,1):e(m,-1)}),r(i,s)};t(A,e=>{f(d)||e(ie)}),M(s),c(()=>g(m,f(R).name)),r(i,s)};t(m,e=>{f(R)&&e(_)}),r(i,p)},xe={chooseServiceLabel:`Choose a Service`,loadingServices:`Loading services…`,loadServicesError:`Could not load services. Please try again later.`,previousMonth:`Previous month`,nextMonth:`Next month`,morningLabel:`Morning`,afternoonLabel:`Afternoon`,eveningLabel:`Evening`,pickDayHint:`Pick a day to see times.`,noSlotsForDay:`No times available this day.`,noChangeHint:`Pick a different date or time to continue.`,therapistFilterLabel:`Therapist`,anyTherapistLabel:`Any therapist`,staffRowLabel:`Staff`,bookedAtLabel:`Booked`,totalLabel:`Total`,continueLabel:`Continue`,changeServiceLabel:`Change service`,backLabel:`Back`,nameLabel:`Name`,namePlaceholder:`Jane Smith`,emailLabel:`Email`,emailPlaceholder:`jane@email.com`,emailInvalidTitle:`Enter a valid email address, e.g. jane@email.com`,phoneLabel:`Phone (optional)`,phonePlaceholder:`+1 555 123 4567`,notesLabel:`Notes (optional)`,notesPlaceholder:`Anything we should know?`,confirmingLabel:`Booking…`,confirmLabel:`Confirm Booking`,confirmRescheduleLabel:`Confirm change`,notWiredError:`This widget is not wired up to make bookings yet.`,genericSubmitError:`Something went wrong booking that slot. Please try again.`,successMessage:`Booked! Check your email for confirmation.`,memberRateLabel:`Regulars' rate`,membersOnlyLabel:`Regulars only`,membersOnlyHint:`For clients who've visited in the last 4 weeks.`,paymentLabel:`Payment`,paymentDueLabel:`due now`,paymentHint:``,paymentUnavailable:`Payment form unavailable — refresh to try again.`,paymentNotReady:`Payment form is not ready yet — please wait a moment and try again.`,paymentFailed:`Your payment could not be completed. Please try again.`,confirmPayLabel:`Pay & Confirm`},ut=k(O,`heading`,7,`Book a Service`),dt=k(O,`logoUrl`,7),ft=k(O,`tagline`,7,``),pt=k(O,`description`,7,``),mt=k(O,`staffLabel`,7,``),ht=k(O,`hidePrice`,7,!1),gt=k(O,`hideZeroPrice`,7,!1),N=k(O,`skipDetailsStep`,7,!1),_t=k(O,`emailOptional`,7,!1),vt=k(O,`closedWeekdays`,23,()=>[]),P=k(O,`locale`,7),yt=k(O,`currency`,7,`GBP`),bt=k(O,`initialTreatmentTitle`,7),F=k(O,`initialDate`,7),xt=k(O,`initialTime`,7),St=k(O,`initialName`,7),Ct=k(O,`initialEmail`,7),wt=k(O,`initialPhone`,7),Tt=k(O,`memberUntil`,7),Et=k(O,`strings`,7),Dt=k(O,`fetchTreatments`,7),Ot=k(O,`fetchTherapists`,7),kt=k(O,`fetchAvailability`,7),At=k(O,`submitBooking`,7),jt=k(O,`createPaymentIntent`,7),Mt=k(O,`stripePublishableKey`,7),Nt=k(O,`stripeAppearance`,7),I=b(()=>({...xe,...Et()})),Pt=b(()=>{try{return new Intl.NumberFormat(P(),{style:`currency`,currency:yt()})}catch{return{format:e=>`${yt()}${e.toFixed(2)}`}}}),Ft=e=>f(Pt).format(e),It=e=>!ht()&&!(gt()&&e===0),Lt=b(()=>ge(P())),Rt=b(()=>pe(P())),L=a(`service`),zt=a(_([])),Bt=a(!0),Vt=a(!1),R=a(null);m(()=>{let e=Dt();if(!e)return;let t=!1;return y(Bt,!0),y(Vt,!1),e().then(e=>{if(!t){if(!e?.length)throw Error(`empty`);y(zt,e,!0)}}).catch(()=>{t||y(Vt,!0)}).finally(()=>{t||y(Bt,!1)}),()=>{t=!0}});let Ht=a(_([])),z=a(``),B=a(!1),Ut=a(void 0),Wt=a(void 0);m(()=>{let e=Ot();if(!e)return;let t=!1;return e().then(e=>{t||y(Ht,e??[],!0)}).catch(()=>{t||y(Ht,[],!0)}),()=>{t=!0}});let Gt=b(()=>f(Ht).find(e=>e.id===f(z))?.name);function Kt(){y(B,!f(B))}function qt(e){y(z,e,!0),y(B,!1)}m(()=>{if(!f(B)||!f(Ut)||!f(Wt))return;let e=f(Ut),t=f(Wt);t.style.minWidth=`${e.getBoundingClientRect().width}px`,t.showPopover();let n=fe(e,t,async()=>{let{x:n,y:r}=await ue(e,t,{strategy:`fixed`,placement:`bottom-start`,middleware:[le(4),de(),ce({padding:12})]});t.style.left=`${n}px`,t.style.top=`${r}px`});function r(e){e.newState===`closed`&&y(B,!1)}return t.addEventListener(`toggle`,r),()=>{n(),t.removeEventListener(`toggle`,r),t.matches(`:popover-open`)&&t.hidePopover()}});let Jt=e=>e.trim().toLowerCase(),Yt;m(()=>{let e=bt();if(!e||e===Yt||!f(zt).length)return;let t=f(zt).find(t=>Jt(t.name)===Jt(e));t&&(Yt=e,Zt(t))});let Xt;m(()=>{if(!F()||!f(R)||F()===Xt)return;Xt=F();let[e,t,n]=F().split(`-`).map(Number);y(H,e,!0),y(U,t-1),y(W,new Date(e,t-1,n),!0),y(G,xt()??null,!0)});function Zt(e){y(R,e,!0),y(W,null),y(G,null),rn=0,y(L,`datetime`)}let Qt,$t=!1;m(()=>{let e=kt();if(!$t){$t=!0,Qt=e;return}e===Qt||N()||(Qt=e,f(L)!==`service`&&y(L,`service`),y(R,null),y(W,null),y(G,null),rn=0)});let V=he(new Date),H=a(_(V.getFullYear())),U=a(_(V.getMonth())),W=a(null),G=a(null),en=a(null),tn=a(_(new Map)),nn=a(!1),rn=0,an=_e(V);function on(e,t){return e.memberPrice!=null&&!!Tt()&&t<=Tt()}function sn(e,t){return on(e,t)||e.price==null?{amount:e.memberPrice??0,member:!0}:{amount:e.price,member:!1}}function cn(e){return e.price!=null||on(e,an)}let ln=b(()=>ve(f(H),f(U),V,vt()??[])),un=b(()=>f(H)!==V.getFullYear()||f(U)!==V.getMonth()),K=b(()=>f(W)?_e(f(W)):null),q=b(()=>f(R)?sn(f(R),f(K)??an):null),dn=b(()=>f(K)?f(tn).get(f(K))??[]:[]),fn=b(()=>N()&&!!f(G)&&f(K)===F()&&f(G)===xt()),pn=b(()=>{let e={morning:[],afternoon:[],evening:[]};for(let t of f(dn)){let n=parseInt(t.slice(0,2),10);n<12?e.morning.push(t):n<17?e.afternoon.push(t):e.evening.push(t)}return e});function mn(e){return f(tn).get(e)?.length??0}function hn(e){let t=mn(e);return t===0?0:t<=5?1:t<=10?2:3}function gn(){if(f(W))return;let e=f(ln).find(e=>e.inMonth&&!e.isPast&&hn(e.iso)>0);e?(y(W,e.date,!0),y(G,null)):rn<3&&(rn++,Sn())}function _n(){let e=kt();if(!e||!f(R))return;let t=_e(new Date(f(H),f(U),1)),n=_e(new Date(f(H),f(U)+1,0)),r=f(R).id,i=f(z)||void 0;y(nn,!0),e(t,n,r,i).then(e=>{if(f(R)?.id!==r||(f(z)||void 0)!==i)return;let t=new Map;for(let n of e??[])t.set(String(n.date).split(`T`)[0],n.slots.map(e=>e.time));y(tn,t,!0),gn()}).catch(()=>{y(tn,new Map,!0)}).finally(()=>{y(nn,!1)})}m(()=>{f(R),f(z),f(H),f(U),Tt(),_n()});let vn=``;m(()=>{f(z)!==vn&&(vn=f(z),y(W,null),y(G,null))}),m(()=>{!f(K)||f(G)||f(dn).length>0&&y(G,f(dn)[0],!0)});function yn(){f(W)&&(f(W).getFullYear()!==f(H)||f(W).getMonth()!==f(U))&&(y(W,null),y(G,null))}function bn(e){e.classList.remove(`sbw-cal-nav-pulse`),e.offsetWidth,e.classList.add(`sbw-cal-nav-pulse`),e.addEventListener(`animationend`,()=>e.classList.remove(`sbw-cal-nav-pulse`),{once:!0})}function xn(){f(un)&&(y(U,f(U)-1),f(U)<0&&(y(U,11),y(H,f(H)-1)),yn())}function Sn(){y(U,f(U)+1),f(U)>11&&(y(U,0),y(H,f(H)+1)),yn()}function Cn(e){!e.inMonth||e.isPast||hn(e.iso)===0||(y(W,e.date,!0),y(G,null))}function wn(e){y(G,e,!0)}function Tn(){f(G)&&(y(L,`details`),Kn())}function En(){y(L,`datetime`)}function Dn(){y(L,`service`)}let J=a(``),Y=a(``),X=a(``),On=a(``),Z=a(!1),Q=a(``),kn=!1,An=!1,jn=!1;m(()=>{St()&&!kn&&!f(J)&&(y(J,St(),!0),kn=!0)}),m(()=>{Ct()&&!An&&!f(Y)&&(y(Y,Ct(),!0),An=!0)}),m(()=>{wt()&&!jn&&!f(X)&&(y(X,wt(),!0),jn=!0)});let Mn=b(()=>!!(Mt()&&jt())&&!N()),Nn=null,Pn=null,Fn=null,In=null,$=null,Ln=null,Rn=``,zn=0,Bn=!1,Vn=a(!1),Hn=a(``),Un=a(``);async function Wn(){return Mt()?(Pn||=be(async()=>{let{loadStripe:e}=await import(`./chunks/lib-Bd4dedte.js`);return{loadStripe:e}},[]).then(({loadStripe:e})=>e(Mt())),Nn=await Pn,Nn):null}function Gn(){In?.destroy(),$?.remove(),In=null,Fn=null,$=null,Ln=null,Rn=``,y(Un,``)}m(()=>Gn);async function Kn(){if(!f(Mn)||!jt()||!f(R)||!f(K)||!f(G))return;let e={treatmentId:f(R).id,date:f(K),time:f(G),therapistId:f(z)||void 0},t=[e.treatmentId,e.date,e.time,e.therapistId??``].join(`|`);await i();let n=O.$$host,r=n?.shadowRoot?.querySelector(`.sbw-payment-slot-anchor`);if(r&&!r.querySelector(`slot[name="payment-mount"]`)){let e=document.createElement(`slot`);e.setAttribute(`name`,`payment-mount`),r.appendChild(e)}if(Bn||Fn&&t===Rn)return;Gn(),Rn=t;let a=++zn;y(Vn,!0),y(Hn,``);try{let t=await Wn();if(!t)throw Error(`Stripe failed to load`);let r=await jt()(e);if(a!==zn)return;if(Ln=r.paymentIntentId,r.amount!=null&&r.currency){let e=new Intl.NumberFormat(P(),{style:`currency`,currency:r.currency}).format(ye(r.amount,r.currency));y(Un,`${e} ${f(I).paymentDueLabel}`)}Fn=t.elements({clientSecret:r.clientSecret,appearance:Nt()}),In=Fn.create(`payment`,{layout:{type:`tabs`,defaultCollapsed:!1}}),In.on(`loaderror`,()=>{a===zn&&y(Hn,f(I).paymentUnavailable,!0)}),$=document.createElement(`div`),$.slot=`payment-mount`,$.className=`sbw-payment-element`,n.appendChild($),In.mount($)}catch{if(a!==zn)return;Gn(),y(Hn,f(I).paymentUnavailable,!0)}finally{a===zn&&y(Vn,!1)}}async function qn(){if(!Nn||!Fn||!Ln)return y(Q,f(I).paymentNotReady,!0),!1;y(Q,``),y(Z,!0);try{let{error:e,paymentIntent:t}=await Nn.confirmPayment({elements:Fn,confirmParams:{payment_method_data:{billing_details:{name:f(J),email:f(Y)||void 0,phone:f(X)||void 0}}},redirect:`if_required`});if(e||![`succeeded`,`requires_capture`,`processing`].includes(t?.status))return y(Q,e?.message??f(I).paymentFailed,!0),!1}catch{return y(Q,f(I).paymentFailed,!0),!1}finally{y(Z,!1)}return Bn=!0,!0}function Jn(e,t){O.$$host?.dispatchEvent(new CustomEvent(e,{detail:t,bubbles:!0,composed:!0}))}async function Yn(e){if(!At()){y(Q,f(I).notWiredError,!0);return}y(Q,``),y(Z,!0);try{let t=await At()(e);if(!t.ok)throw Error(t.error||`request failed`);y(en,new Date,!0),y(L,`success`),Jn(`booking-submitted`,e)}catch(e){y(Q,e instanceof Error&&e.message!==`request failed`?e.message:f(I).genericSubmitError,!0),_n()}finally{y(Z,!1)}}async function Xn(e){e.preventDefault(),!(!f(R)||!f(K)||!f(G))&&(f(Mn)&&!Bn&&!await qn()||await Yn({treatmentId:f(R).id,date:f(K),time:f(G),therapistId:f(z)||void 0,name:f(J),email:f(Y),phone:f(X),notes:f(On),stripePaymentIntentId:f(Mn)?Ln??void 0:void 0}))}async function Zn(){!f(R)||!f(K)||!f(G)||await Yn({treatmentId:f(R).id,date:f(K),time:f(G),therapistId:f(z)||void 0,name:St()??``,email:Ct()??``,phone:wt()??``,notes:``})}var Qn={get heading(){return ut()},set heading(e=`Book a Service`){ut(e),A()},get logoUrl(){return dt()},set logoUrl(e){dt(e),A()},get tagline(){return ft()},set tagline(e=``){ft(e),A()},get description(){return pt()},set description(e=``){pt(e),A()},get staffLabel(){return mt()},set staffLabel(e=``){mt(e),A()},get hidePrice(){return ht()},set hidePrice(e=!1){ht(e),A()},get hideZeroPrice(){return gt()},set hideZeroPrice(e=!1){gt(e),A()},get skipDetailsStep(){return N()},set skipDetailsStep(e=!1){N(e),A()},get emailOptional(){return _t()},set emailOptional(e=!1){_t(e),A()},get closedWeekdays(){return vt()},set closedWeekdays(e=[]){vt(e),A()},get locale(){return P()},set locale(e){P(e),A()},get currency(){return yt()},set currency(e=`GBP`){yt(e),A()},get initialTreatmentTitle(){return bt()},set initialTreatmentTitle(e){bt(e),A()},get initialDate(){return F()},set initialDate(e){F(e),A()},get initialTime(){return xt()},set initialTime(e){xt(e),A()},get initialName(){return St()},set initialName(e){St(e),A()},get initialEmail(){return Ct()},set initialEmail(e){Ct(e),A()},get initialPhone(){return wt()},set initialPhone(e){wt(e),A()},get memberUntil(){return Tt()},set memberUntil(e){Tt(e),A()},get strings(){return Et()},set strings(e){Et(e),A()},get fetchTreatments(){return Dt()},set fetchTreatments(e){Dt(e),A()},get fetchTherapists(){return Ot()},set fetchTherapists(e){Ot(e),A()},get fetchAvailability(){return kt()},set fetchAvailability(e){kt(e),A()},get submitBooking(){return At()},set submitBooking(e){At(e),A()},get createPaymentIntent(){return jt()},set createPaymentIntent(e){jt(e),A()},get stripePublishableKey(){return Mt()},set stripePublishableKey(e){Mt(e),A()},get stripeAppearance(){return Nt()},set stripeAppearance(e){Nt(e),A()}},$n=ct(),er=e($n),tr=i=>{var a=He(),s=e(a),l=e=>{var t=Re();c(()=>j(t,`src`,dt())),r(e,t)};t(s,e=>{dt()&&e(l)});var u=o(s,2);se(u,O,`heading`,{},i=>{var a=n(),o=v(a),s=t=>{var n=ze(),i=v(n),a=e(i,!0);M(i),w(2),c(()=>g(a,ut())),r(t,n)};t(o,e=>{ut()&&e(s)}),r(i,a)});var d=o(u,2),f=t=>{var n=Be(),i=e(n,!0);M(n),c(()=>g(i,ft())),r(t,n)};t(d,e=>{ft()&&e(f)});var p=o(d,2);se(p,O,`description`,{},i=>{var a=n(),o=v(a),s=t=>{var n=Ve(),i=e(n,!0);M(n),c(()=>g(i,pt())),r(t,n)};t(o,e=>{pt()&&e(s)}),r(i,a)}),M(a),r(i,a)};t(er,e=>{f(L)!==`success`&&e(tr)});var nr=o(er,2),rr=n=>{var i=Je(),a=e(i),s=e(a,!0);M(a);var u=o(a,2),d=t=>{var n=Me(),i=e(n,!0);M(n),c(()=>g(i,f(I).loadingServices)),r(t,n)},p=t=>{var n=Ne(),i=e(n,!0);M(n),c(()=>g(i,f(I).loadServicesError)),r(t,n)},m=n=>{var i=qe();C(i,21,()=>f(zt),e=>e.id,(n,i)=>{let a=b(()=>cn(f(i)));var s=Ke(),u=e(s),d=e(u),p=e(d),m=o(p),h=t=>{var n=Ue(),i=e(n,!0);M(n),c(()=>g(i,f(I).membersOnlyHint)),r(t,n)};t(m,e=>{f(a)||e(h)}),M(d);var _=o(d,2),v=n=>{var a=Ge(),s=e(a),l=t=>{var n=We(),a=e(n,!0);M(n),c(e=>g(a,e),[()=>Ft(f(i).price??f(i).memberPrice??0)]),r(t,n)},u=b(()=>It(f(i).price??f(i).memberPrice??0));t(s,e=>{f(u)&&e(l)});var d=o(s,2),p=t=>{var n=Ue(),i=e(n,!0);M(n),c(()=>g(i,f(I).membersOnlyLabel)),r(t,n)},m=t=>{var n=Ue(),a=e(n);M(n),c(e=>g(a,`${f(I).memberRateLabel??``} ${e??``}`),[()=>Ft(f(i).memberPrice)]),r(t,n)},h=b(()=>f(i).memberPrice!=null&&It(f(i).memberPrice));t(d,e=>{f(i).price==null?e(p):f(h)&&e(m,1)}),M(a),r(n,a)};t(_,e=>{ht()||e(v)}),M(u),M(s),c(()=>{u.disabled=!f(a),g(p,`${f(i).name??``} `)}),l(`click`,u,()=>Zt(f(i))),r(n,s)}),M(i),r(n,i)};t(u,e=>{f(Bt)?e(d):f(Vt)?e(p,1):e(m,-1)}),M(i),c(()=>g(s,f(I).chooseServiceLabel)),r(n,i)},ir=i=>{var a=nt(),s=e(a),u=e(s),d=e(u),p=e(d),m=e(p);M(p);var h=o(p,2),_=t=>{var n=Xe(),i=e(n),a=e(i,!0);M(i);var s=o(i,2),u=e(s),d=e(u,!0);M(u);var p=o(u,2);let m;M(s),ie(s,e=>y(Ut,e),()=>f(Ut));var h=o(s,2),_=e(h),v=e(_),ee=e(v,!0);M(v),M(_);var b=o(_,2);C(b,17,()=>f(Ht),e=>e.id,(t,n)=>{var i=Ye(),a=e(i),o=e(a,!0);M(a),M(i),c(()=>{j(a,`aria-selected`,f(n).id===f(z)),g(o,f(n).name)}),l(`click`,a,()=>qt(f(n).id)),r(t,i)}),M(h),ie(h,e=>y(Wt,e),()=>f(Wt)),M(n),c(()=>{g(a,f(I).therapistFilterLabel),j(s,`aria-expanded`,f(B)),g(d,f(Gt)??f(I).anyTherapistLabel),m=T(p,0,`sbw-chevron svelte-1dxdgqu`,null,m,{"sbw-chevron-open":f(B)}),j(h,`aria-label`,f(I).therapistFilterLabel),j(v,`aria-selected`,!f(z)),g(ee,f(I).anyTherapistLabel)}),l(`click`,s,Kt),l(`click`,v,()=>qt(``)),r(t,n)};t(h,e=>{f(Ht).length&&e(_)});var ee=o(h,2),x=e(ee),S=o(x,2);M(ee),M(d);var w=o(d,2);C(w,20,()=>f(Rt),e=>e,(t,n)=>{var i=we(),a=e(i,!0);M(i),c(()=>g(a,n)),r(t,i)}),M(w);var E=o(w,2);C(E,21,()=>f(ln),e=>e.iso,(n,i)=>{let a=b(()=>hn(f(i).iso)),s=b(()=>f(i).inMonth&&!f(i).isPast&&f(a)>0);var u=Qe();let d;var p=e(u),m=e(p,!0);M(p);var h=o(p,2),_=e=>{var t=Ze();c(()=>T(t,1,`sbw-dot sbw-dot-${f(a)??``}`,`svelte-1dxdgqu`)),r(e,t)};t(h,e=>{f(s)&&e(_)}),M(u),c(()=>{d=T(u,1,`sbw-cal-cell svelte-1dxdgqu`,null,d,{"sbw-cal-cell-off":!f(i).inMonth||f(i).isPast,"sbw-cal-cell-selected":f(K)===f(i).iso}),u.disabled=!f(s),g(m,f(i).dayNumber)}),l(`click`,u,()=>Cn(f(i))),r(n,u)}),M(E),M(u);var D=o(u,2),O=e(D),k=t=>{var n=Me(),i=e(n,!0);M(n),c(()=>g(i,f(I).pickDayHint)),r(t,n)},ne=t=>{var n=Me(),i=e(n,!0);M(n),c(()=>g(i,f(I).loadingServices)),r(t,n)},re=t=>{var n=Me(),i=e(n,!0);M(n),c(()=>g(i,f(I).noSlotsForDay)),r(t,n)},A=i=>{var a=tt();C(a,21,()=>[[`morning`,f(I).morningLabel],[`afternoon`,f(I).afternoonLabel],[`evening`,f(I).eveningLabel]],([e,t])=>e,(i,a)=>{var s=b(()=>te(f(a),2));let u=()=>f(s)[0],d=()=>f(s)[1],p=b(()=>f(pn)[u()]);var m=n(),h=v(m),_=t=>{var n=et(),i=e(n),a=e(i);M(i);var s=o(i,2);C(s,20,()=>f(p),e=>e,(t,n)=>{var i=$e();let a;var o=e(i,!0);M(i),c(()=>{a=T(i,1,`sbw-slot-btn svelte-1dxdgqu`,null,a,{"sbw-slot-btn-selected":f(G)===n}),g(o,n)}),l(`click`,i,()=>wn(n)),r(t,i)}),M(s),M(n),c(()=>g(a,`${d()??``} (${f(p).length??``})`)),r(t,n)};t(h,e=>{f(p).length&&e(_)}),r(i,m)}),M(a),r(i,a)};t(O,e=>{f(K)?f(nn)?e(ne,1):f(dn).length?e(A,-1):e(re,2):e(k)}),M(D),M(s);var ae=o(s,2);oe(ae,()=>!0),M(a),c(()=>{g(m,`${f(Lt)[f(U)]??``} ${f(H)??``}`),x.disabled=!f(un),j(x,`aria-label`,f(I).previousMonth),j(S,`aria-label`,f(I).nextMonth),j(E,`aria-busy`,f(nn))}),l(`click`,x,e=>{bn(e.currentTarget),xn()}),l(`click`,S,e=>{bn(e.currentTarget),Sn()}),r(i,a)},ar=n=>{var i=ot(),a=e(i),s=e(a),l=e(s),d=e(l),p=e(d,!0);M(d);var m=o(d,2);re(m),M(l);var h=o(l,2),_=e(h),v=e(_,!0);M(_);var b=o(_,2);re(b),M(h);var x=o(h,2),S=e(x),C=e(S,!0);M(S);var w=o(S,2);re(w),M(x),M(s);var T=o(s,2),E=e(T),te=e(E,!0);M(E);var O=o(E,2);ee(O),M(T);var k=o(T,2),ne=n=>{var i=at(),a=e(i),s=e(a),l=e(s,!0);M(s);var u=o(s,2),d=t=>{var n=rt(),i=e(n,!0);M(n),c(()=>g(i,f(Un))),r(t,n)};t(u,e=>{f(Un)&&e(d)}),M(a);var p=o(a,4),m=t=>{var n=Ne(),i=e(n,!0);M(n),c(()=>g(i,f(Hn))),r(t,n)};t(p,e=>{f(Hn)&&e(m)});var h=o(p,2),_=t=>{var n=it(),i=e(n,!0);M(n),c(()=>g(i,f(I).paymentHint)),r(t,n)};t(h,e=>{f(I).paymentHint&&e(_)}),M(i),c(()=>g(l,f(I).paymentLabel)),r(n,i)};t(k,e=>{f(Mn)&&e(ne)}),M(a);var A=o(a,2);oe(A,()=>!1),M(i),c(()=>{g(p,f(I).nameLabel),j(m,`placeholder`,f(I).namePlaceholder),g(v,_t()?`${f(I).emailLabel} (optional)`:f(I).emailLabel),b.required=!_t(),j(b,`title`,f(I).emailInvalidTitle),j(b,`placeholder`,f(I).emailPlaceholder),g(C,f(I).phoneLabel),j(w,`placeholder`,f(I).phonePlaceholder),g(te,f(I).notesLabel),j(O,`placeholder`,f(I).notesPlaceholder)}),u(`submit`,i,Xn),D(m,()=>f(J),e=>y(J,e)),D(b,()=>f(Y),e=>y(Y,e)),D(w,()=>f(X),e=>y(X,e)),D(O,()=>f(On),e=>y(On,e)),r(n,i)},or=t=>{var n=st(),i=o(e(n),2),a=e(i,!0);M(i);var s=o(i,2);oe(s,()=>!1,()=>!0),M(n),c(()=>g(a,f(I).successMessage)),r(t,n)};return t(nr,e=>{f(L)===`service`?e(rr):f(L)===`datetime`&&f(R)?e(ir,1):f(L)===`details`&&f(R)?e(ar,2):f(L)===`success`&&e(or,3)}),M($n),r(d,$n),x(Qn)}O([`click`]),customElements.define(`spa-booking-widget`,oe(ut,{heading:{attribute:`heading`,type:`String`},logoUrl:{attribute:`logo-url`,type:`String`},tagline:{attribute:`tagline`,type:`String`},description:{attribute:`description`,type:`String`},staffLabel:{attribute:`staff-label`,type:`String`},hidePrice:{attribute:`hide-price`,type:`Boolean`},hideZeroPrice:{attribute:`hide-zero-price`,type:`Boolean`},skipDetailsStep:{attribute:`skip-details-step`,type:`Boolean`},emailOptional:{attribute:`email-optional`,type:`Boolean`},closedWeekdays:{attribute:`closed-weekdays`,type:`Array`},initialTreatmentTitle:{attribute:`initial-treatment-title`,type:`String`},initialDate:{attribute:`initial-date`,type:`String`},initialTime:{attribute:`initial-time`,type:`String`},initialName:{attribute:`initial-name`,type:`String`},initialEmail:{attribute:`initial-email`,type:`String`},initialPhone:{attribute:`initial-phone`,type:`String`},memberUntil:{attribute:`member-until`,type:`String`},locale:{attribute:`locale`,type:`String`},currency:{attribute:`currency`,type:`String`},strings:{type:`Object`},fetchTreatments:{type:`Object`},fetchTherapists:{type:`Object`},fetchAvailability:{type:`Object`},submitBooking:{type:`Object`},createPaymentIntent:{type:`Object`},stripePublishableKey:{attribute:`stripe-publishable-key`,type:`String`},stripeAppearance:{type:`Object`}},[`heading`,`description`],[],{mode:`open`}));