@clicka1/booking 0.2.5 → 0.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -45,6 +45,7 @@ export function AppShell({ children }: { children: React.ReactNode }) {
45
45
  <BookingProvider
46
46
  salonSlug={process.env.NEXT_PUBLIC_SALON_SLUG}
47
47
  engineUrl={process.env.NEXT_PUBLIC_ENGINE_URL}
48
+ apiKey={process.env.NEXT_PUBLIC_BOOKING_API_KEY}
48
49
  successUrl={`${process.env.NEXT_PUBLIC_SITE_URL}/booking/success`}
49
50
  cancelUrl={`${process.env.NEXT_PUBLIC_SITE_URL}/booking/cancel`}
50
51
  >
@@ -83,7 +84,8 @@ Supported engine env names:
83
84
  Recommended client-site envs:
84
85
 
85
86
  ```bash
86
- NEXT_PUBLIC_ENGINE_URL=https://www.clicka.bg
87
+ NEXT_PUBLIC_ENGINE_URL=https://app.alternine.co
88
+ NEXT_PUBLIC_BOOKING_API_KEY=pk_live_xxxxxxxxxxxxxxxxxxxxx
87
89
  NEXT_PUBLIC_SALON_SLUG=diworks
88
90
  NEXT_PUBLIC_SITE_URL=https://diworks.example
89
91
  ```
@@ -98,7 +100,11 @@ import '@clicka1/booking/styles.css';
98
100
 
99
101
  export function Root({ children }: { children: React.ReactNode }) {
100
102
  return (
101
- <BookingProvider salonSlug="my-salon" engineUrl="https://www.clicka.bg">
103
+ <BookingProvider
104
+ salonSlug="my-salon"
105
+ engineUrl="https://app.alternine.co"
106
+ apiKey={process.env.NEXT_PUBLIC_BOOKING_API_KEY}
107
+ >
102
108
  {children}
103
109
  <BookingButton>Book now</BookingButton>
104
110
  </BookingProvider>
@@ -121,6 +127,7 @@ If you already have your own button markup, keep it and add the attribute:
121
127
  | --- | --- | --- |
122
128
  | `salonSlug?` | `string` | Salon tenant slug. Falls back to env, meta tag, or `window` globals. |
123
129
  | `engineUrl?` | `string` | Clicka engine origin. Falls back to env, meta tag, or `window` globals. |
130
+ | `apiKey?` | `string` | Public API key. Falls back to env, meta tag, or `window` globals. |
124
131
  | `locale?` | `string` | BCP-47 locale. Defaults from `<html lang>`, then browser locale. |
125
132
  | `successUrl?` | `string` | Stripe success redirect on the client-owned site. |
126
133
  | `cancelUrl?` | `string` | Stripe cancel redirect on the client-owned site. |
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- import { useT, serviceMatchesCategory } from './chunk-HA7DFBYI.js';
2
+ import { useT, serviceMatchesCategory } from './chunk-ANW2GBPY.js';
3
3
  import { X, Plus, ChevronDown, Check, User, Loader2 } from 'lucide-react';
4
4
  import { useMemo, useState, useRef, useEffect } from 'react';
5
5
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
@@ -937,5 +937,5 @@ function SalonBookingModal({
937
937
  }
938
938
 
939
939
  export { SalonBookingModal };
940
- //# sourceMappingURL=SalonBookingModal-ZIIKN2O2.js.map
941
- //# sourceMappingURL=SalonBookingModal-ZIIKN2O2.js.map
940
+ //# sourceMappingURL=SalonBookingModal-YL7PUL7J.js.map
941
+ //# sourceMappingURL=SalonBookingModal-YL7PUL7J.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../lib/booking-modal-catalog.ts","../../../lib/cancellation-policy.ts","../../../components/salon/service-category-tabs.tsx","../../../components/salon/BookingSuccessView.tsx","../../../components/salon/SalonBookingModal.tsx"],"names":["idx","window","t","jsx","jsxs","useState","useEffect"],"mappings":"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","file":"SalonBookingModal-ZIIKN2O2.js","sourcesContent":["export type BookingCatalogVariant = {\n label: string;\n price: number;\n duration?: number;\n};\n\nexport type BookingCatalogService = {\n id: string;\n name: string;\n description?: string;\n category?: string;\n price?: number;\n duration: number;\n variants?: BookingCatalogVariant[];\n payment_type?: 'none' | 'deposit' | 'full';\n deposit_amount?: number;\n cancel_policy_hours?: number;\n cancel_policy_action?: 'full_refund' | 'keep_deposit' | 'keep_full';\n};\n\nexport type BookingRow = { id: string };\n\n/** Index in expanded booking rows for a catalog service (+ optional variant). */\nexport function getBookingRowIndex(\n bookingRows: BookingRow[],\n catalogId: string,\n variantLabel?: string | null,\n): number {\n if (variantLabel) {\n return bookingRows.findIndex((row) => row.id === `${catalogId}::${variantLabel}`);\n }\n const exact = bookingRows.findIndex((row) => row.id === catalogId);\n if (exact >= 0) return exact;\n return bookingRows.findIndex((row) => row.id.startsWith(`${catalogId}::`));\n}\n\nexport function isCatalogServiceSelected(\n selectedIdxs: number[],\n bookingRows: BookingRow[],\n catalog: BookingCatalogService,\n variantLabel?: string | null,\n): boolean {\n if (catalog.variants?.length) {\n const label = variantLabel ?? catalog.variants[0]?.label;\n const idx = label ? getBookingRowIndex(bookingRows, catalog.id, label) : -1;\n return idx >= 0 && selectedIdxs.includes(idx);\n }\n const idx = getBookingRowIndex(bookingRows, catalog.id);\n return idx >= 0 && selectedIdxs.includes(idx);\n}\n\nexport function getCatalogDisplayPriceDuration(\n catalog: BookingCatalogService,\n variantLabel?: string | null,\n): { price: number; duration: number } {\n const variants = catalog.variants ?? [];\n if (variants.length > 0) {\n const label = variantLabel ?? variants[0]!.label;\n const variant = variants.find((v) => v.label === label) ?? variants[0]!;\n return {\n price: Number(variant.price ?? catalog.price ?? 0) || 0,\n duration: Math.max(5, Number(variant.duration ?? catalog.duration ?? 30) || 30),\n };\n }\n return {\n price: Number(catalog.price ?? 0) || 0,\n duration: Math.max(5, Number(catalog.duration ?? 30) || 30),\n };\n}\n","export type CancelPolicyAction = 'full_refund' | 'keep_deposit' | 'keep_full';\n\nexport type CancellationPolicyResult = {\n isFreeCancel: boolean;\n refundCents: number;\n keepCents: number;\n policyMessage: string;\n};\n\nexport function evaluateCancellationPolicy(opts: {\n bookingDatetime: Date;\n amountPaidCents: number;\n depositAmountEuros?: number;\n cancelPolicyHours: number;\n cancelPolicyAction: CancelPolicyAction;\n}): CancellationPolicyResult {\n const { bookingDatetime, amountPaidCents, depositAmountEuros, cancelPolicyHours, cancelPolicyAction } = opts;\n\n const hoursUntil = (bookingDatetime.getTime() - Date.now()) / (1000 * 60 * 60);\n const isFreeCancel = hoursUntil >= cancelPolicyHours;\n\n if (isFreeCancel || amountPaidCents === 0 || cancelPolicyAction === 'full_refund') {\n return {\n isFreeCancel,\n refundCents: amountPaidCents,\n keepCents: 0,\n policyMessage:\n amountPaidCents > 0\n ? `Ще получите пълен refund от €${(amountPaidCents / 100).toFixed(2)}.`\n : 'Резервацията ще бъде отказана.',\n };\n }\n\n if (cancelPolicyAction === 'keep_full') {\n return {\n isFreeCancel: false,\n refundCents: 0,\n keepCents: amountPaidCents,\n policyMessage: `Тъй като отказвате по-малко от ${cancelPolicyHours} ч. преди часа, платената сума (€${(amountPaidCents / 100).toFixed(2)}) не се връща.`,\n };\n }\n\n // keep_deposit\n const depositCents = depositAmountEuros ? Math.round(depositAmountEuros * 100) : 0;\n const keepCents = Math.min(depositCents, amountPaidCents);\n const refundCents = Math.max(0, amountPaidCents - keepCents);\n\n return {\n isFreeCancel: false,\n refundCents,\n keepCents,\n policyMessage:\n refundCents > 0\n ? `Депозитът от €${(keepCents / 100).toFixed(2)} се задържа. Ще получите €${(refundCents / 100).toFixed(2)} обратно.`\n : `Депозитът от €${(keepCents / 100).toFixed(2)} се задържа при отказване.`,\n };\n}\n\n/** Human-readable summary shown to client before they cancel. */\nexport function formatPolicySummary(opts: {\n cancelPolicyHours: number;\n cancelPolicyAction: CancelPolicyAction;\n depositAmountEuros?: number;\n}): string {\n const { cancelPolicyHours, cancelPolicyAction, depositAmountEuros } = opts;\n\n const window =\n cancelPolicyHours >= 48\n ? `${Math.round(cancelPolicyHours / 24)} дни`\n : `${cancelPolicyHours} часа`;\n\n if (cancelPolicyAction === 'full_refund') {\n return `Безплатно отказване до ${window} преди часа. След срока — пълен refund.`;\n }\n if (cancelPolicyAction === 'keep_full') {\n return `Безплатно отказване до ${window} преди часа. След срока платената сума не се връща.`;\n }\n const depositStr = depositAmountEuros ? ` (€${depositAmountEuros})` : '';\n return `Безплатно отказване до ${window} преди часа. След срока депозитът${depositStr} се задържа.`;\n}\n","'use client';\n\nimport type { ServiceCategoryTab } from '@/lib/salon-service-categories';\n\ntype SalonServiceCategoryTabsProps = {\n categories: ServiceCategoryTab[];\n selectedId: string | null;\n onSelect: (id: string | null) => void;\n size?: 'sm' | 'md';\n className?: string;\n /** CSS gradient or solid color used for the active-tab underline. */\n accentFill?: string;\n};\n\n/** Text category filter — horizontal scroll, all labels in black. */\nexport function SalonServiceCategoryTabs({\n categories,\n selectedId,\n onSelect,\n size = 'md',\n className = '',\n accentFill = '#111111',\n}: SalonServiceCategoryTabsProps) {\n const named = categories.filter((c) => c.id != null);\n if (named.length === 0) return null;\n\n const textClass = size === 'sm' ? 'text-[12px]' : 'text-sm';\n\n return (\n <div\n className={`flex items-center gap-4 overflow-x-auto pb-0.5 scrollbar-none ${textClass} ${className}`.trim()}\n role=\"tablist\"\n aria-label=\"Категории услуги\"\n >\n {categories.map((cat) => {\n const active = selectedId === cat.id;\n return (\n <span\n key={cat.id ?? 'all'}\n role=\"tab\"\n aria-selected={active}\n tabIndex={0}\n onClick={() => onSelect(cat.id)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onSelect(cat.id);\n }\n }}\n className={`relative inline-block shrink-0 cursor-pointer select-none whitespace-nowrap pb-1.5 font-bold text-black transition ${\n active ? '' : 'hover:opacity-80'\n }`}\n >\n {cat.label}\n <span\n aria-hidden\n className=\"absolute bottom-0 left-0 h-[2px] rounded-full transition-[width,opacity] duration-200\"\n style={{\n width: active ? '100%' : '0%',\n opacity: active ? 1 : 0,\n backgroundImage: accentFill,\n }}\n />\n </span>\n );\n })}\n </div>\n );\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\nimport { useT } from '@/lib/i18n-react';\n\ntype Props = {\n serviceName: string;\n dateLabel: string;\n time: string;\n salonName: string;\n onClose: () => void;\n};\n\nexport function BookingSuccessView({\n serviceName,\n dateLabel,\n time,\n salonName,\n onClose,\n}: Props) {\n const t = useT();\n const [show, setShow] = useState(false);\n\n useEffect(() => {\n const t = setTimeout(() => setShow(true), 50);\n return () => clearTimeout(t);\n }, []);\n\n return (\n <div className=\"flex flex-1 flex-col items-center justify-center px-6 py-10\">\n <div\n className={`flex flex-col items-center transition-all duration-700 ease-out ${\n show ? 'translate-y-0 opacity-100' : 'translate-y-4 opacity-0'\n }`}\n >\n {/* Animated checkmark */}\n <div className=\"relative mb-6\">\n <div\n className={`flex h-20 w-20 items-center justify-center rounded-full transition-all duration-500 ease-out ${\n show ? 'scale-100' : 'scale-50'\n }`}\n style={{ background: 'linear-gradient(135deg, #22c55e 0%, #16a34a 100%)' }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n className=\"h-10 w-10\"\n aria-hidden\n >\n <path\n d=\"M5 13l4 4L19 7\"\n stroke=\"white\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={show ? 'animate-[draw_0.5s_ease-out_0.3s_forwards]' : ''}\n style={{\n strokeDasharray: 24,\n strokeDashoffset: show ? 0 : 24,\n transition: 'stroke-dashoffset 0.5s ease-out 0.3s',\n }}\n />\n </svg>\n </div>\n <div\n className={`absolute inset-0 rounded-full transition-all duration-700 ease-out ${\n show ? 'scale-150 opacity-0' : 'scale-100 opacity-30'\n }`}\n style={{ background: 'linear-gradient(135deg, #22c55e 0%, #16a34a 100%)' }}\n aria-hidden\n />\n </div>\n\n {/* Title */}\n <h3\n className={`text-center text-[22px] font-semibold leading-tight tracking-tight text-[#111] transition-all delay-200 duration-500 ${\n show ? 'translate-y-0 opacity-100' : 'translate-y-3 opacity-0'\n }`}\n >\n {t('booking.success.confirmed')}\n </h3>\n\n {/* Subtitle */}\n <p\n className={`mt-2 text-center text-[15px] leading-relaxed text-black/45 transition-all delay-300 duration-500 ${\n show ? 'translate-y-0 opacity-100' : 'translate-y-3 opacity-0'\n }`}\n >\n {t('booking.success.waitingAt')} <span className=\"font-medium text-black/60\">{salonName}</span>\n </p>\n\n {/* Details card */}\n <div\n className={`mt-6 w-full max-w-[320px] overflow-hidden rounded-2xl border border-black/[0.06] bg-white shadow-[0_2px_12px_rgba(0,0,0,0.08)] transition-all delay-[400ms] duration-500 ${\n show ? 'translate-y-0 opacity-100' : 'translate-y-3 opacity-0'\n }`}\n >\n <div className=\"space-y-3 px-5 py-4\">\n <div className=\"flex items-start gap-3\">\n <div className=\"mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-xl bg-black/[0.04]\">\n <svg viewBox=\"0 0 20 20\" fill=\"currentColor\" className=\"h-4 w-4 text-black/40\" aria-hidden>\n <path fillRule=\"evenodd\" d=\"M6 3.75A2.75 2.75 0 018.75 1h2.5A2.75 2.75 0 0114 3.75v.443c.572.055 1.14.122 1.706.2C17.053 4.582 18 5.75 18 7.07v3.469c0 1.126-.694 2.191-1.83 2.54-1.952.599-4.024.921-6.17.921s-4.219-.322-6.17-.921C2.694 12.73 2 11.665 2 10.539V7.07c0-1.321.947-2.489 2.294-2.676A41.047 41.047 0 016 4.193V3.75zm6.5 0v.325a41.622 41.622 0 00-5 0V3.75c0-.69.56-1.25 1.25-1.25h2.5c.69 0 1.25.56 1.25 1.25zM10 10a1 1 0 00-1 1v.01a1 1 0 001 1h.01a1 1 0 001-1V11a1 1 0 00-1-1H10z\" clipRule=\"evenodd\" />\n <path d=\"M3 15.055v-.684c.126.053.255.1.39.142 2.092.642 4.313.987 6.61.987 2.297 0 4.518-.345 6.61-.987.135-.041.264-.089.39-.142v.684c0 1.347-.985 2.53-2.363 2.686a41.454 41.454 0 01-9.274 0C3.985 17.585 3 16.402 3 15.055z\" />\n </svg>\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-[11px] font-medium uppercase tracking-wide text-black/30\">{t('booking.success.labelService')}</p>\n <p className=\"mt-0.5 text-[14px] font-medium leading-snug text-[#111]\">{serviceName}</p>\n </div>\n </div>\n\n <div className=\"h-px bg-black/[0.05]\" />\n\n <div className=\"flex items-start gap-3\">\n <div className=\"mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-xl bg-black/[0.04]\">\n <svg viewBox=\"0 0 20 20\" fill=\"currentColor\" className=\"h-4 w-4 text-black/40\" aria-hidden>\n <path fillRule=\"evenodd\" d=\"M5.75 2a.75.75 0 01.75.75V4h7V2.75a.75.75 0 011.5 0V4h.25A2.75 2.75 0 0118 6.75v8.5A2.75 2.75 0 0115.25 18H4.75A2.75 2.75 0 012 15.25v-8.5A2.75 2.75 0 014.75 4H5V2.75A.75.75 0 015.75 2zm-1 5.5c-.69 0-1.25.56-1.25 1.25v6.5c0 .69.56 1.25 1.25 1.25h10.5c.69 0 1.25-.56 1.25-1.25v-6.5c0-.69-.56-1.25-1.25-1.25H4.75z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-[11px] font-medium uppercase tracking-wide text-black/30\">{t('booking.success.labelWhen')}</p>\n <p className=\"mt-0.5 text-[14px] font-medium leading-snug text-[#111]\">\n {t('booking.success.timeFormat', { date: dateLabel, time })}\n </p>\n </div>\n </div>\n </div>\n </div>\n\n {/* Close button */}\n <button\n type=\"button\"\n onClick={onClose}\n className={`mt-8 w-full max-w-[320px] rounded-full bg-[#111] py-3.5 text-[15px] font-semibold text-white shadow-[0_4px_14px_rgba(0,0,0,0.15)] transition-all delay-500 duration-500 active:scale-[0.98] ${\n show ? 'translate-y-0 opacity-100' : 'translate-y-3 opacity-0'\n }`}\n >\n {t('booking.success.done')}\n </button>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { Check, ChevronDown, Loader2, Plus, User, X } from 'lucide-react';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { useT } from '@/lib/i18n-react';\nimport {\n getBookingRowIndex,\n getCatalogDisplayPriceDuration,\n isCatalogServiceSelected,\n type BookingCatalogService,\n} from '@/lib/booking-modal-catalog';\nimport { serviceMatchesCategory, type ServiceCategoryTab } from '@/lib/salon-service-categories';\nimport { formatPolicySummary, type CancelPolicyAction } from '@/lib/cancellation-policy';\nimport { SalonServiceCategoryTabs } from '@/components/salon/service-category-tabs';\nimport { BookingSuccessView } from '@/components/salon/BookingSuccessView';\n\nexport type PublicStaffMember = {\n id: string;\n name: string;\n slug: string;\n bio: string | null;\n avatarUrl: string | null;\n serviceIds: string[];\n};\n\nexport type BookingServiceOption = {\n id: string;\n name: string;\n description?: string;\n category?: string;\n price?: number;\n duration: number;\n variants?: { label: string; price: number; duration?: number }[];\n};\n\ntype SalonBookingModalProps = {\n open: boolean;\n primaryColor: string;\n /**\n * Optional CSS gradient string for accent fills (CTAs, step indicators, borders).\n * Defaults to a solid-color gradient derived from `primaryColor`.\n * Example: 'linear-gradient(135deg, #e11d48, #db2777, #a855f7)'\n */\n accentGradient?: string;\n /**\n * BCP-47 locale for date label rendering (e.g. 'bg-BG', 'en-US', 'el-GR').\n * Default: 'bg-BG'.\n */\n locale?: string;\n /**\n * Pluggable price formatter. Receives a number in the salon's currency.\n * Default: `${amount} €` (no BGN/dual-currency).\n */\n formatPrice?: (amount: number) => string;\n /** One row per service (same as public site). */\n serviceCatalog: BookingCatalogService[];\n /** Expanded rows for booking API (includes variant rows). */\n services: BookingServiceOption[];\n categoryTabs: ServiceCategoryTab[];\n selectedServiceIdxs: number[];\n selectedDate: string;\n selectedTime: string;\n totalDuration: number;\n totalPrice: number;\n clientName: string;\n clientPhone: string;\n clientEmail: string;\n notes: string;\n salonName: string;\n termsHref: string;\n privacyHref: string;\n minDate: string;\n maxDate: string;\n timeSlots: string[] | 'closed' | null;\n paymentType?: 'none' | 'deposit' | 'full';\n depositAmount?: number;\n cancelPolicyHours?: number;\n cancelPolicyAction?: CancelPolicyAction;\n isSubmitting: boolean;\n bookingError: string;\n bookingSuccess: string;\n bookingSuccessDetails?: { serviceName: string; dateLabel: string; time: string } | null;\n onClose: () => void;\n onToggleService: (idx: number) => void;\n onDateChange: (date: string) => void;\n onTimeChange: (time: string) => void;\n onClientNameChange: (v: string) => void;\n onClientPhoneChange: (v: string) => void;\n onClientEmailChange: (v: string) => void;\n onNotesChange: (v: string) => void;\n onSubmit: (e: React.FormEvent) => void;\n /** TEAM plan: pass all non-owner staff members. Empty = SOLO flow (no staff step). */\n staffMembers?: PublicStaffMember[];\n selectedStaffMemberId?: string | null;\n onStaffMemberChange?: (id: string) => void;\n /** Direct staff link: pre-filters catalog and skips staff step. */\n directStaffName?: string;\n};\n\nconst cardShadow =\n 'shadow-[0_2px_6px_rgba(0,0,0,0.14),0_10px_32px_rgba(0,0,0,0.18),0_1px_2px_rgba(0,0,0,0.1)]';\nconst backButtonShadow =\n 'shadow-[0_4px_14px_rgba(0,0,0,0.22),0_14px_40px_rgba(0,0,0,0.16),0_1px_0_rgba(0,0,0,0.06)]';\nconst gradientCtaShadow = 'shadow-[0_8px_28px_rgba(0,0,0,0.18)]';\nconst gradientRingShadow = 'shadow-[0_2px_10px_rgba(0,0,0,0.08)]';\nconst blackCtaShadow = 'shadow-[0_4px_14px_rgba(0,0,0,0.15)]';\n\nconst fieldClass =\n `mt-1.5 block w-full min-w-0 max-w-full box-border rounded-2xl border border-black/[0.06] bg-white px-3.5 py-3 text-[16px] leading-tight text-[#111] touch-manipulation ${cardShadow} outline-none transition focus:border-[color:var(--salon-primary)]/40 focus:ring-2 focus:ring-[color:var(--salon-primary)]/12`;\n\nfunction addMinutesToTime(time: string, minutesToAdd: number): string {\n const [h, m] = time.split(':').map(Number);\n if (!Number.isFinite(h) || !Number.isFinite(m)) return time;\n const total = h * 60 + m + minutesToAdd;\n const outH = Math.floor(total / 60) % 24;\n const outM = total % 60;\n return `${String(outH).padStart(2, '0')}:${String(outM).padStart(2, '0')}`;\n}\n\nfunction ServiceDescription({ text }: { text?: string }) {\n const description = text?.trim();\n if (!description) return null;\n return (\n <p className=\"mt-1 line-clamp-3 text-[12px] leading-relaxed text-black/50\">{description}</p>\n );\n}\n\nexport function SalonBookingModal({\n open,\n primaryColor,\n accentGradient,\n locale = 'bg-BG',\n formatPrice,\n serviceCatalog,\n services,\n categoryTabs,\n selectedServiceIdxs,\n selectedDate,\n selectedTime,\n totalDuration,\n totalPrice,\n clientName,\n clientPhone,\n clientEmail,\n notes,\n salonName,\n termsHref,\n privacyHref,\n minDate,\n maxDate,\n timeSlots,\n paymentType = 'none',\n depositAmount,\n cancelPolicyHours,\n cancelPolicyAction,\n isSubmitting,\n bookingError,\n bookingSuccess,\n bookingSuccessDetails,\n onClose,\n onToggleService,\n onDateChange,\n onTimeChange,\n onClientNameChange,\n onClientPhoneChange,\n onClientEmailChange,\n onNotesChange,\n onSubmit,\n staffMembers = [],\n selectedStaffMemberId,\n onStaffMemberChange,\n directStaffName,\n}: SalonBookingModalProps) {\n const t = useT();\n\n // Derive accent fill + gradient-border styles from props. White-label: the\n // consumer controls colors via `primaryColor` (single solid) or\n // `accentGradient` (full CSS gradient string).\n const accentFill = useMemo(\n () => accentGradient ?? `linear-gradient(135deg, ${primaryColor}, ${primaryColor})`,\n [accentGradient, primaryColor],\n );\n const accentFillStyle = useMemo(\n () => ({ backgroundImage: accentFill }),\n [accentFill],\n );\n const accentBorderStyle = useMemo(\n () => ({\n border: '1px solid transparent',\n backgroundImage: `linear-gradient(#ffffff, #ffffff), ${accentFill}`,\n backgroundOrigin: 'border-box' as const,\n backgroundClip: 'padding-box, border-box',\n }),\n [accentFill],\n );\n\n const fmtPrice = useMemo<(n: number) => string>(\n () => formatPrice ?? ((n) => `${Number.isInteger(n) ? n : n.toFixed(2)} €`),\n [formatPrice],\n );\n\n // isTeam = TEAM salon with multiple staff members; direct = pre-selected staff link\n const isTeam = staffMembers.length > 0 && !directStaffName;\n // Steps: 1=service, 2=staff(team only), 3=datetime, 4=contact\n const [step, setStep] = useState<1 | 2 | 3 | 4>(1);\n const [selectedCategory, setSelectedCategory] = useState<string | null>(null);\n const [browseAllServices, setBrowseAllServices] = useState(true);\n const [selectedVariantByServiceId, setSelectedVariantByServiceId] = useState<Record<string, string>>({});\n const [variantDropdownOpenForServiceId, setVariantDropdownOpenForServiceId] = useState<string | null>(null);\n const prevOpenRef = useRef(false);\n\n useEffect(() => {\n if (!open) return;\n setStep(1);\n setSelectedCategory(null);\n setVariantDropdownOpenForServiceId(null);\n const initial: Record<string, string> = {};\n for (const service of serviceCatalog) {\n const variants = service.variants ?? [];\n if (variants.length > 0) initial[service.id] = variants[0]!.label;\n }\n setSelectedVariantByServiceId(initial);\n }, [open, serviceCatalog]);\n\n // Compute which staff members can perform ALL currently selected services.\n const selectedServiceIds = useMemo(() => {\n return selectedServiceIdxs\n .map((idx) => services[idx]?.id)\n .filter((id): id is string => Boolean(id));\n }, [selectedServiceIdxs, services]);\n\n const eligibleStaff = useMemo(() => {\n if (!isTeam) return [];\n if (selectedServiceIds.length === 0) return staffMembers;\n return staffMembers.filter((sm) =>\n selectedServiceIds.every((sid) => sm.serviceIds.includes(sid)),\n );\n }, [isTeam, staffMembers, selectedServiceIds]);\n\n // Auto-select when exactly 1 eligible staff member.\n useEffect(() => {\n if (!isTeam || eligibleStaff.length !== 1) return;\n onStaffMemberChange?.(eligibleStaff[0]!.id);\n }, [isTeam, eligibleStaff, onStaffMemberChange]);\n\n useEffect(() => {\n if (open && !prevOpenRef.current) {\n setBrowseAllServices(selectedServiceIdxs.length === 0);\n }\n prevOpenRef.current = open;\n }, [open, selectedServiceIdxs.length]);\n\n useEffect(() => {\n if (selectedServiceIdxs.length === 0) {\n setBrowseAllServices(true);\n } else {\n setBrowseAllServices(false);\n }\n }, [selectedServiceIdxs.length]);\n\n const hasServices = selectedServiceIdxs.length > 0;\n const endTime = useMemo(\n () => (selectedTime ? addMinutesToTime(selectedTime, Math.max(5, totalDuration || 0)) : ''),\n [selectedTime, totalDuration]\n );\n const selectedServices = useMemo(\n () =>\n selectedServiceIdxs\n .map((idx) => services[idx])\n .filter((svc): svc is BookingServiceOption => Boolean(svc)),\n [selectedServiceIdxs, services]\n );\n const visibleCatalog = useMemo(\n () => serviceCatalog.filter((service) => serviceMatchesCategory(service, selectedCategory)),\n [serviceCatalog, selectedCategory],\n );\n\n useEffect(() => {\n if (!selectedCategory) return;\n const hasCategory = serviceCatalog.some((svc) => serviceMatchesCategory(svc, selectedCategory));\n if (!hasCategory) setSelectedCategory(null);\n }, [serviceCatalog, selectedCategory]);\n\n function toggleCatalogService(service: BookingCatalogService) {\n const variants = service.variants ?? [];\n const variantLabel = variants.length > 0 ? selectedVariantByServiceId[service.id] ?? variants[0]!.label : null;\n const idx = getBookingRowIndex(services, service.id, variantLabel);\n if (idx < 0) return;\n onToggleService(idx);\n }\n\n const dateOptions = useMemo(() => {\n if (!minDate || !maxDate) return [];\n const out: { iso: string; weekday: string; day: string }[] = [];\n const start = new Date(`${minDate}T12:00:00`);\n const end = new Date(`${maxDate}T12:00:00`);\n const cursor = new Date(start);\n while (cursor <= end && out.length < 45) {\n const iso = `${cursor.getFullYear()}-${String(cursor.getMonth() + 1).padStart(2, '0')}-${String(cursor.getDate()).padStart(2, '0')}`;\n out.push({\n iso,\n weekday: cursor.toLocaleDateString(locale, { weekday: 'short' }),\n day: cursor.toLocaleDateString(locale, { day: 'numeric', month: 'short' }),\n });\n cursor.setDate(cursor.getDate() + 1);\n }\n return out;\n }, [minDate, maxDate, locale]);\n\n function goToStep(target: 1 | 2 | 3 | 4) {\n if (isTeam) {\n if (target >= 2 && !hasServices) return;\n if (target >= 3 && !selectedStaffMemberId) return;\n if (target >= 4 && (!hasServices || !selectedTime)) return;\n } else {\n if (target >= 2 && !hasServices) return; // step 2 = datetime for solo\n if (target >= 3 && (!hasServices || !selectedTime)) return;\n }\n setStep(target);\n }\n\n // Step label definitions differ between SOLO and TEAM.\n const stepLabels = isTeam\n ? [\n { n: 1 as const, label: t('booking.modal.stepService') },\n { n: 2 as const, label: t('booking.modal.stepSpecialist') },\n { n: 3 as const, label: t('booking.modal.stepTime') },\n { n: 4 as const, label: t('booking.modal.stepDetails') },\n ]\n : [\n { n: 1 as const, label: t('booking.modal.stepService') },\n { n: 2 as const, label: t('booking.modal.stepTime') },\n { n: 3 as const, label: t('booking.modal.stepDetails') },\n ];\n\n function requestClose() {\n if (typeof window !== 'undefined') {\n const shouldClose = window.confirm(t('booking.modal.confirmClose'));\n if (!shouldClose) return;\n }\n onClose();\n }\n\n useEffect(() => {\n if (!open || typeof document === 'undefined') return;\n document.documentElement.style.setProperty('overflow', 'hidden');\n document.documentElement.style.setProperty('background-color', '#ffffff');\n document.body.style.setProperty('overflow', 'hidden');\n document.body.style.setProperty('position', 'fixed');\n document.body.style.setProperty('inset', '0');\n document.body.style.setProperty('width', '100%');\n document.body.style.setProperty('background-color', '#ffffff');\n const scrollY = window.scrollY;\n document.body.style.setProperty('top', `-${scrollY}px`);\n return () => {\n document.documentElement.style.removeProperty('overflow');\n document.documentElement.style.removeProperty('background-color');\n document.body.style.removeProperty('overflow');\n document.body.style.removeProperty('position');\n document.body.style.removeProperty('inset');\n document.body.style.removeProperty('width');\n document.body.style.removeProperty('background-color');\n document.body.style.removeProperty('top');\n window.scrollTo(0, scrollY);\n };\n }, [open]);\n\n if (!open) return null;\n\n return (\n <div className=\"fixed inset-0 z-[110] overflow-hidden bg-white sm:bg-transparent\" role=\"presentation\">\n <div className=\"absolute inset-0 hidden bg-black/30 backdrop-blur-sm sm:block\" aria-hidden />\n\n <div\n role=\"dialog\"\n aria-modal\n aria-label={t('booking.modal.ariaLabel')}\n className=\"absolute inset-x-0 bottom-0 z-10 mx-auto flex h-[100dvh] w-full max-w-none flex-col overflow-hidden bg-white sm:inset-x-auto sm:bottom-auto sm:left-1/2 sm:top-1/2 sm:h-auto sm:max-h-[88vh] sm:w-full sm:max-w-md sm:-translate-x-1/2 sm:-translate-y-1/2 sm:rounded-[1.6rem] sm:bg-white sm:shadow-[0_25px_60px_rgba(0,0,0,0.12)]\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"mx-auto mt-2 h-1 w-10 shrink-0 rounded-full bg-black/10 sm:hidden\" aria-hidden />\n\n <div className=\"relative z-[1] flex shrink-0 items-center justify-between gap-2 bg-white px-4 pb-3 pt-3.5 sm:px-5\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <h3 className=\"text-[17px] font-semibold tracking-tight text-black\">\n {directStaffName ? t('booking.modal.titleWithStaff', { name: directStaffName }) : t('booking.modal.titleDefault')}\n </h3>\n <div className=\"flex items-center gap-1.5\">\n {stepLabels.map(({ n, label }) => {\n const active = step === n;\n const complete = step > n;\n const disabled = isTeam\n ? (n >= 2 && !hasServices) || (n >= 3 && !selectedStaffMemberId) || (n >= 4 && (!hasServices || !selectedTime))\n : (n >= 2 && !hasServices) || (n >= 3 && (!hasServices || !selectedTime));\n return (\n <button\n key={`header-step-${n}`}\n type=\"button\"\n disabled={disabled}\n onClick={() => goToStep(n)}\n className={`inline-flex h-7 min-w-[1.75rem] items-center justify-center rounded-full px-2.5 text-[11px] font-bold transition disabled:opacity-20 ${\n active || complete\n ? `text-white ${gradientCtaShadow}`\n : `bg-white text-black/50 ${cardShadow}`\n }`}\n style={active || complete ? accentFillStyle : undefined}\n title={label}\n aria-label={t('booking.modal.stepAria', { n, label })}\n >\n {complete && !active ? '✓' : n}\n </button>\n );\n })}\n </div>\n </div>\n <button\n type=\"button\"\n className={`shrink-0 rounded-full bg-white p-2 text-black/40 transition active:bg-black/[0.03] ${cardShadow}`}\n onClick={requestClose}\n aria-label={t('booking.modal.closeAria')}\n >\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n\n <div className=\"relative z-[1] min-h-0 flex-1 overflow-x-hidden overflow-y-auto overscroll-contain bg-white px-4 py-5 sm:px-5\">\n {bookingSuccess ? (\n bookingSuccessDetails ? (\n <BookingSuccessView\n serviceName={bookingSuccessDetails.serviceName}\n dateLabel={bookingSuccessDetails.dateLabel}\n time={bookingSuccessDetails.time}\n salonName={salonName}\n onClose={onClose}\n />\n ) : (\n <p className=\"rounded-2xl bg-emerald-50 px-3.5 py-3 text-sm leading-relaxed text-emerald-700\">\n {bookingSuccess}\n </p>\n )\n ) : (\n <form id=\"salon-booking-form\" onSubmit={onSubmit} className=\"min-w-0 space-y-3.5 bg-white\">\n {step === 1 ? (\n <div className=\"space-y-3\">\n {hasServices && !browseAllServices ? (\n <>\n <div className=\"flex items-baseline justify-between gap-2\">\n <p className=\"text-[13px] font-semibold text-black\">{t('booking.modal.selectedServices')}</p>\n <p className=\"text-[12px] font-medium tabular-nums text-black/40\">\n {t(selectedServices.length === 1 ? 'booking.modal.serviceCountOne' : 'booking.modal.serviceCountMany', { count: selectedServices.length })}\n </p>\n </div>\n {selectedServiceIdxs.map((idx) => {\n const svc = services[idx];\n if (!svc) return null;\n return (\n <div\n key={`selected-${svc.id}-${idx}`}\n className={`rounded-2xl p-px transition ${gradientRingShadow}`}\n style={accentBorderStyle}\n >\n <div className=\"flex items-start justify-between gap-3 rounded-[15px] bg-white px-3.5 py-3.5\">\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-[16px] font-semibold text-black\">{svc.name}</p>\n <ServiceDescription text={svc.description} />\n <p className=\"mt-1 text-[13px] tabular-nums text-black/70\">\n {svc.duration} {t('booking.modal.minSuffix')} · {fmtPrice(Number(svc.price ?? 0))}\n </p>\n </div>\n <button\n type=\"button\"\n onClick={() => onToggleService(idx)}\n className={`mt-0.5 inline-flex shrink-0 items-center gap-1 rounded-full border border-black/10 bg-white px-2.5 py-1.5 text-xs font-semibold text-black/60 transition active:bg-black/[0.04] ${cardShadow}`}\n aria-label={t('booking.modal.removeAria')}\n >\n <X className=\"h-3.5 w-3.5\" aria-hidden />\n {t('booking.modal.remove')}\n </button>\n </div>\n </div>\n );\n })}\n <button\n type=\"button\"\n onClick={() => setBrowseAllServices(true)}\n className={`flex w-full items-center justify-center gap-1.5 rounded-2xl bg-white px-3.5 py-3 text-sm font-semibold text-black ${cardShadow}`}\n >\n <Plus className=\"h-4 w-4\" aria-hidden />\n {t('booking.modal.addMoreServices')}\n </button>\n </>\n ) : (\n <>\n <div className=\"flex items-baseline justify-between gap-2\">\n <p className=\"text-[13px] font-semibold text-black\">{t('booking.modal.services')}</p>\n <p className=\"text-[12px] font-medium tabular-nums text-black/40\">\n {t(visibleCatalog.length === 1 ? 'booking.modal.serviceCountOne' : 'booking.modal.serviceCountMany', { count: visibleCatalog.length })}\n </p>\n </div>\n\n {hasServices ? (\n <button\n type=\"button\"\n onClick={() => setBrowseAllServices(false)}\n className=\"text-[12px] font-semibold text-black underline underline-offset-2\"\n >\n {t('booking.modal.hideList', { count: selectedServices.length })}\n </button>\n ) : null}\n\n <SalonServiceCategoryTabs\n categories={categoryTabs}\n selectedId={selectedCategory}\n onSelect={setSelectedCategory}\n size=\"sm\"\n className=\"-mx-1 px-1\"\n accentFill={accentFill}\n />\n\n {visibleCatalog.map((service) => {\n const variants = service.variants ?? [];\n const variantLabel =\n variants.length > 0\n ? selectedVariantByServiceId[service.id] ?? variants[0]!.label\n : null;\n const active = isCatalogServiceSelected(\n selectedServiceIdxs,\n services,\n service,\n variantLabel,\n );\n const { price, duration } = getCatalogDisplayPriceDuration(service, variantLabel);\n return (\n <div\n key={service.id}\n className={`rounded-2xl transition ${\n active ? `p-px ${gradientRingShadow}` : `bg-white ${cardShadow}`\n }`}\n style={active ? accentBorderStyle : undefined}\n >\n <div\n className={`flex items-start justify-between gap-3 ${\n active ? 'rounded-[15px] bg-white px-3.5 py-3.5' : 'px-3.5 py-3.5'\n }`}\n >\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-[16px] font-semibold text-black\">{service.name}</p>\n <ServiceDescription text={service.description} />\n {variants.length > 0 ? (\n <div className=\"relative mt-1.5 max-w-full\">\n <button\n type=\"button\"\n onClick={() =>\n setVariantDropdownOpenForServiceId((prev) =>\n prev === service.id ? null : service.id,\n )\n }\n className=\"flex w-full items-center justify-between rounded-full border border-black/12 bg-white px-3 py-1.5 text-left text-xs transition hover:border-black/25\"\n >\n <span className=\"truncate\">{variantLabel}</span>\n <ChevronDown className=\"ml-1 h-3.5 w-3.5 shrink-0 text-black/45\" aria-hidden />\n </button>\n {variantDropdownOpenForServiceId === service.id ? (\n <div className=\"absolute left-0 right-0 z-20 mt-1 overflow-hidden rounded-xl border border-black/10 bg-white shadow-[0_8px_24px_rgba(0,0,0,0.12)]\">\n {variants.map((variant) => (\n <button\n key={variant.label}\n type=\"button\"\n onClick={() => {\n setSelectedVariantByServiceId((prev) => ({\n ...prev,\n [service.id]: variant.label,\n }));\n setVariantDropdownOpenForServiceId(null);\n }}\n className={`w-full px-3 py-2 text-left text-xs hover:bg-black/[0.04] ${\n variantLabel === variant.label ? 'font-semibold text-black' : 'text-black/70'\n }`}\n >\n {variant.label} · {fmtPrice(Number(variant.price) || 0)}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n ) : null}\n <p className=\"mt-1.5 text-[13px] tabular-nums text-black/45\">\n {duration} {t('booking.modal.minSuffix')} · {fmtPrice(Number(price) || 0)}\n </p>\n </div>\n {active ? (\n <button\n type=\"button\"\n onClick={() => toggleCatalogService(service)}\n className={`mt-0.5 inline-flex shrink-0 items-center gap-1 rounded-full border border-black/10 bg-white px-2.5 py-1.5 text-xs font-semibold text-black/60 transition active:bg-black/[0.04] ${cardShadow}`}\n aria-label={t('booking.modal.removeAria')}\n >\n <X className=\"h-3.5 w-3.5\" aria-hidden />\n {t('booking.modal.remove')}\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={() => toggleCatalogService(service)}\n className={`mt-0.5 inline-flex shrink-0 items-center gap-1 rounded-full px-2.5 py-1.5 text-xs font-semibold text-white transition ${gradientCtaShadow}`}\n style={accentFillStyle}\n >\n <Plus className=\"h-3.5 w-3.5\" aria-hidden />\n {t('booking.modal.add')}\n </button>\n )}\n </div>\n </div>\n );\n })}\n {visibleCatalog.length === 0 ? (\n <p className={`rounded-2xl bg-white px-3.5 py-3 text-sm text-black/40 ${cardShadow}`}>\n {t('booking.modal.noServicesInCategory')}\n </p>\n ) : null}\n </>\n )}\n </div>\n ) : null}\n\n {/* Staff selection step — TEAM only, step 2 */}\n {step === 2 && isTeam ? (\n <div className=\"space-y-3\">\n <p className=\"text-[13px] font-semibold text-black\">{t('booking.modal.selectSpecialist')}</p>\n {selectedServiceIds.length > 0 && (\n <p className=\"text-[12px] text-black/45\">\n {t('booking.modal.availableFor')}&nbsp;\n <span className=\"font-medium text-black/70\">\n {selectedServiceIds\n .map((sid) => serviceCatalog.find((s) => s.id === sid)?.name ?? sid)\n .join(' + ')}\n </span>\n </p>\n )}\n {eligibleStaff.length === 0 ? (\n <div className={`rounded-2xl bg-white px-4 py-5 text-center ${cardShadow}`}>\n <p className=\"text-[14px] font-medium text-black/50\">\n {t('booking.modal.serviceUnavailable')}\n </p>\n <button\n type=\"button\"\n onClick={() => setStep(1)}\n className=\"mt-3 text-[13px] font-semibold text-[color:var(--salon-primary)] underline underline-offset-2\"\n >\n {t('booking.modal.selectOtherService')}\n </button>\n </div>\n ) : (\n <div className=\"space-y-2.5\">\n {eligibleStaff.map((sm) => {\n const selected = selectedStaffMemberId === sm.id;\n return (\n <button\n key={sm.id}\n type=\"button\"\n onClick={() => onStaffMemberChange?.(sm.id)}\n className={`flex w-full items-center gap-3 rounded-2xl px-4 py-3.5 text-left transition ${\n selected\n ? `p-px ${gradientRingShadow}`\n : `bg-white ${cardShadow}`\n }`}\n style={selected ? accentBorderStyle : undefined}\n >\n {selected ? (\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full text-white\" style={accentFillStyle}>\n <Check className=\"h-4 w-4\" aria-hidden />\n </div>\n ) : (\n <div className={`flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-white text-black/30 ${cardShadow}`}>\n <User className=\"h-4 w-4\" aria-hidden />\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-[15px] font-semibold text-black\">{sm.name}</p>\n {sm.bio && (\n <p className=\"mt-0.5 truncate text-[12px] text-black/45\">{sm.bio}</p>\n )}\n </div>\n </button>\n );\n })}\n </div>\n )}\n </div>\n ) : null}\n\n {/* Date/time step — step 2 for SOLO/direct, step 3 for TEAM */}\n {((isTeam && step === 3) || (!isTeam && step === 2)) ? (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-start justify-between gap-2\">\n <p className=\"text-[13px] font-semibold text-black\">\n {selectedStaffMemberId\n ? t('booking.modal.timeWithStaff', { name: staffMembers.find((s) => s.id === selectedStaffMemberId)?.name ?? '' })\n : t('booking.modal.dateTime')}\n </p>\n <button\n type=\"button\"\n onClick={() => setStep(1)}\n className={`inline-flex items-center gap-1 rounded-full bg-white px-3 py-1.5 text-xs font-semibold text-[color:var(--salon-primary)] ${cardShadow} active:bg-black/[0.03]`}\n >\n <Plus className=\"h-3.5 w-3.5\" />\n {t('booking.modal.addService')}\n </button>\n </div>\n\n {hasServices ? (\n <p className=\"text-[15px] font-semibold text-black\">\n {selectedServices.map((s) => s.name).join(' + ')}\n </p>\n ) : null}\n\n <div className=\"min-w-0\">\n <label className=\"block text-[13px] font-semibold text-black\">\n {t('booking.modal.date')}\n </label>\n <div className=\"-mx-1 mt-2 flex gap-2.5 overflow-x-auto px-1 pb-1.5 scrollbar-none\">\n {dateOptions.map((d) => {\n const active = selectedDate === d.iso;\n return (\n <button\n key={d.iso}\n type=\"button\"\n onClick={() => onDateChange(d.iso)}\n className={`flex h-[4.25rem] w-[4.25rem] shrink-0 flex-col items-center justify-center rounded-2xl text-center transition ${\n active\n ? 'text-white shadow-[0_4px_14px_rgba(0,0,0,0.18)]'\n : 'border border-black/[0.06] bg-white text-black/60 shadow-[0_1px_4px_rgba(0,0,0,0.06),0_4px_12px_rgba(0,0,0,0.04)]'\n }`}\n style={active ? { backgroundColor: '#000' } : undefined}\n >\n <span className=\"text-[10px] font-medium uppercase leading-none tabular-nums opacity-75\">\n {d.weekday}\n </span>\n <span className=\"mt-1 text-[12px] font-bold leading-tight tabular-nums\">{d.day}</span>\n </button>\n );\n })}\n </div>\n </div>\n\n <div className=\"min-w-0\">\n <label className=\"block text-[13px] font-semibold text-black\">\n {t('booking.modal.time')}\n </label>\n {!selectedDate ? (\n <p className=\"mt-1.5 text-sm text-black/35\">{t('booking.modal.selectDateFirst')}</p>\n ) : timeSlots === 'closed' ? (\n <p className=\"mt-1.5 text-sm text-black/35\">{t('booking.modal.dayClosed')}</p>\n ) : Array.isArray(timeSlots) && timeSlots.length === 0 ? (\n <p className=\"mt-1.5 text-sm text-black/35\">{t('booking.modal.noSlots')}</p>\n ) : Array.isArray(timeSlots) ? (\n <div className=\"mt-2 grid w-full max-w-full grid-cols-3 gap-2.5 sm:grid-cols-4\">\n {timeSlots.map((t) => {\n const active = selectedTime === t;\n return (\n <button\n key={t}\n type=\"button\"\n onClick={() => onTimeChange(t)}\n className={`min-w-0 touch-manipulation rounded-2xl px-2 py-3 text-center text-[14px] font-semibold tabular-nums transition ${\n active\n ? 'text-white shadow-[0_4px_14px_rgba(0,0,0,0.22)]'\n : 'border border-black/[0.08] bg-white text-black shadow-[0_2px_8px_rgba(0,0,0,0.12),0_4px_16px_rgba(0,0,0,0.08)] active:bg-black/[0.03] active:shadow-[0_1px_2px_rgba(0,0,0,0.10)]'\n }`}\n style={active ? { backgroundColor: '#000' } : undefined}\n >\n {t}\n </button>\n );\n })}\n </div>\n ) : (\n <p className=\"mt-1.5 text-sm text-black/35\">{t('booking.modal.selectServiceFirst')}</p>\n )}\n </div>\n </div>\n ) : null}\n\n {/* Contact step — step 3 for SOLO/direct, step 4 for TEAM */}\n {((isTeam && step === 4) || (!isTeam && step === 3)) ? (\n <div className=\"space-y-3.5\">\n <p className=\"text-[13px] font-semibold text-black\">\n {t('booking.modal.contactDetails')}\n </p>\n <div className=\"min-w-0\">\n <label className=\"block text-[13px] font-semibold text-black\">\n {t('booking.modal.name')}\n </label>\n <input\n className={fieldClass}\n value={clientName}\n onChange={(e) => onClientNameChange(e.target.value)}\n autoComplete=\"name\"\n required\n />\n </div>\n\n <div className=\"min-w-0\">\n <label className=\"block text-[13px] font-semibold text-black\">\n {t('booking.modal.phone')}\n </label>\n <input\n type=\"tel\"\n className={fieldClass}\n value={clientPhone}\n onChange={(e) => onClientPhoneChange(e.target.value)}\n autoComplete=\"tel\"\n inputMode=\"tel\"\n required\n />\n </div>\n\n <div className=\"min-w-0\">\n <label className=\"block text-[13px] font-semibold text-black\">\n {t('booking.modal.email')}\n </label>\n <input\n type=\"email\"\n inputMode=\"email\"\n autoComplete=\"email\"\n className={fieldClass}\n value={clientEmail}\n onChange={(e) => onClientEmailChange(e.target.value)}\n required\n />\n </div>\n\n <div className=\"min-w-0\">\n <label className=\"block text-[13px] font-semibold text-black\">\n {t('booking.modal.notes')}\n </label>\n <textarea\n className={`${fieldClass} resize-none`}\n rows={2}\n value={notes}\n onChange={(e) => onNotesChange(e.target.value)}\n />\n </div>\n\n </div>\n ) : null}\n\n {bookingError ? (\n <p className=\"rounded-lg bg-red-50 px-3 py-2 text-sm text-red-700\" role=\"alert\">\n {bookingError}\n </p>\n ) : null}\n </form>\n )}\n </div>\n\n {!bookingSuccess && !bookingSuccessDetails ? (\n <div className=\"relative z-[2] shrink-0 border-t border-black/[0.06] bg-white px-4 pb-[max(1rem,env(safe-area-inset-bottom))] pt-3 sm:px-5\">\n {hasServices ? (\n <div className=\"mb-3 px-1\">\n <p className=\"text-[13px] tabular-nums text-black/50\">\n {t('booking.modal.totalDuration', { min: Math.max(0, totalDuration) })}\n </p>\n <p className=\"text-[17px] font-semibold tabular-nums text-black/70 leading-tight\">\n {t('booking.modal.totalPrice', { price: fmtPrice(totalPrice) })}\n </p>\n {selectedTime ? (\n <p className=\"mt-0.5 text-[13px] font-semibold tabular-nums text-black\">\n {t('booking.modal.startTime', { start: selectedTime, end: endTime })}\n </p>\n ) : step > 1 ? (\n <p className=\"mt-0.5 truncate text-[13px] font-semibold text-black\">\n {selectedServices.map((s) => s.name).join(' + ')}\n </p>\n ) : null}\n </div>\n ) : null}\n\n {step === 3 && paymentType !== 'none' && (\n <div className=\"mb-2.5 space-y-1 text-center\">\n <p className=\"flex items-center justify-center gap-1.5 text-[13px] font-semibold text-[#635BFF]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 60 60\" fill=\"none\" aria-hidden>\n <rect width=\"60\" height=\"60\" rx=\"8\" fill=\"#635BFF\"/>\n <path d=\"M27.5 22.5c0-1.7 1.4-2.4 3.6-2.4 3.2 0 7.3 1 10.4 2.7v-9.8c-3.5-1.4-7-2-10.4-2C23.1 11 18 15.2 18 22.9c0 12.1 16.6 10.2 16.6 15.4 0 2-1.7 2.7-4.1 2.7-3.5 0-8-1.5-11.5-3.5v9.9c3.9 1.7 7.9 2.4 11.5 2.4 8.8 0 14.8-4.3 14.8-12.2C45.3 25.4 27.5 27.6 27.5 22.5z\" fill=\"white\"/>\n </svg>\n {paymentType === 'deposit' && depositAmount && depositAmount > 0\n ? <>{t('booking.modal.depositRequired')} <strong className=\"mx-0.5\">{fmtPrice(Number(depositAmount) || 0)}</strong></>\n : <>{t('booking.modal.paymentFrom')} <strong className=\"mx-0.5\">{fmtPrice(totalPrice)}</strong></>\n }\n </p>\n <p className=\"text-[11px] text-black/35\">\n {t('booking.modal.securePayment')} <span className=\"font-bold text-[#635BFF]\">Stripe</span>\n </p>\n {cancelPolicyHours ? (\n <p className=\"mx-auto max-w-[320px] text-[11px] leading-relaxed text-black/45\">\n {formatPolicySummary({\n cancelPolicyHours,\n cancelPolicyAction: cancelPolicyAction ?? 'keep_deposit',\n depositAmountEuros: depositAmount,\n })}\n </p>\n ) : null}\n </div>\n )}\n {(() => {\n const maxStep = isTeam ? 4 : 3;\n const isLastStep = step === maxStep;\n const nextDisabled =\n (step === 1 && !hasServices) ||\n (isTeam && step === 2 && (!selectedStaffMemberId || eligibleStaff.length === 0)) ||\n (isTeam ? step === 3 : step === 2) && (!selectedDate || !selectedTime);\n return (\n <>\n <div className=\"grid grid-cols-2 gap-2.5\">\n <button\n type=\"button\"\n onClick={() => setStep((s) => (s > 1 ? ((s - 1) as 1 | 2 | 3 | 4) : s))}\n disabled={step === 1}\n className=\"rounded-full border border-black/10 bg-white py-2.5 text-[14px] font-medium text-black/60 transition disabled:opacity-25 active:scale-[0.98]\"\n >\n {t('booking.modal.back')}\n </button>\n {!isLastStep ? (\n <button\n type=\"button\"\n onClick={() => {\n if (!nextDisabled) setStep((s) => (s < maxStep ? ((s + 1) as 1 | 2 | 3 | 4) : s));\n }}\n disabled={nextDisabled}\n className={`rounded-full py-3.5 text-[15px] font-semibold text-white transition disabled:opacity-40 ${gradientCtaShadow}`}\n style={accentFillStyle}\n >\n {t('booking.modal.continue')}\n </button>\n ) : (\n <button\n type=\"submit\"\n form=\"salon-booking-form\"\n disabled={isSubmitting || !selectedTime || !hasServices}\n className={`flex items-center justify-center gap-2 rounded-full py-3.5 text-[15px] font-semibold text-white transition disabled:opacity-40 ${gradientCtaShadow}`}\n style={accentFillStyle}\n >\n {isSubmitting ? <Loader2 className=\"h-4 w-4 animate-spin\" aria-hidden /> : null}\n {paymentType !== 'none' ? t('booking.modal.payAndBook') : t('booking.modal.sendRequest')}\n </button>\n )}\n </div>\n {isLastStep ? (\n <p className=\"mt-2.5 text-center text-[10.5px] leading-snug text-black/35\">\n {t('booking.modal.disclaimerPre')}\n {' '}{t('booking.modal.disclaimerAccept')}{' '}\n <a href={termsHref} target=\"_blank\" rel=\"noopener noreferrer\" className=\"underline underline-offset-2\">\n {t('booking.modal.terms')}\n </a>{' '}\n {t('booking.modal.smsConsentAnd')}{' '}\n <a href={privacyHref} target=\"_blank\" rel=\"noopener noreferrer\" className=\"underline underline-offset-2\">\n {t('booking.modal.privacy')}\n </a>\n .\n </p>\n ) : null}\n </>\n );\n })()}\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../../../lib/booking-modal-catalog.ts","../../../lib/cancellation-policy.ts","../../../components/salon/service-category-tabs.tsx","../../../components/salon/BookingSuccessView.tsx","../../../components/salon/SalonBookingModal.tsx"],"names":["idx","window","t","jsx","jsxs","useState","useEffect"],"mappings":"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","file":"SalonBookingModal-YL7PUL7J.js","sourcesContent":["export type BookingCatalogVariant = {\n label: string;\n price: number;\n duration?: number;\n};\n\nexport type BookingCatalogService = {\n id: string;\n name: string;\n description?: string;\n category?: string;\n price?: number;\n duration: number;\n variants?: BookingCatalogVariant[];\n payment_type?: 'none' | 'deposit' | 'full';\n deposit_amount?: number;\n cancel_policy_hours?: number;\n cancel_policy_action?: 'full_refund' | 'keep_deposit' | 'keep_full';\n};\n\nexport type BookingRow = { id: string };\n\n/** Index in expanded booking rows for a catalog service (+ optional variant). */\nexport function getBookingRowIndex(\n bookingRows: BookingRow[],\n catalogId: string,\n variantLabel?: string | null,\n): number {\n if (variantLabel) {\n return bookingRows.findIndex((row) => row.id === `${catalogId}::${variantLabel}`);\n }\n const exact = bookingRows.findIndex((row) => row.id === catalogId);\n if (exact >= 0) return exact;\n return bookingRows.findIndex((row) => row.id.startsWith(`${catalogId}::`));\n}\n\nexport function isCatalogServiceSelected(\n selectedIdxs: number[],\n bookingRows: BookingRow[],\n catalog: BookingCatalogService,\n variantLabel?: string | null,\n): boolean {\n if (catalog.variants?.length) {\n const label = variantLabel ?? catalog.variants[0]?.label;\n const idx = label ? getBookingRowIndex(bookingRows, catalog.id, label) : -1;\n return idx >= 0 && selectedIdxs.includes(idx);\n }\n const idx = getBookingRowIndex(bookingRows, catalog.id);\n return idx >= 0 && selectedIdxs.includes(idx);\n}\n\nexport function getCatalogDisplayPriceDuration(\n catalog: BookingCatalogService,\n variantLabel?: string | null,\n): { price: number; duration: number } {\n const variants = catalog.variants ?? [];\n if (variants.length > 0) {\n const label = variantLabel ?? variants[0]!.label;\n const variant = variants.find((v) => v.label === label) ?? variants[0]!;\n return {\n price: Number(variant.price ?? catalog.price ?? 0) || 0,\n duration: Math.max(5, Number(variant.duration ?? catalog.duration ?? 30) || 30),\n };\n }\n return {\n price: Number(catalog.price ?? 0) || 0,\n duration: Math.max(5, Number(catalog.duration ?? 30) || 30),\n };\n}\n","export type CancelPolicyAction = 'full_refund' | 'keep_deposit' | 'keep_full';\n\nexport type CancellationPolicyResult = {\n isFreeCancel: boolean;\n refundCents: number;\n keepCents: number;\n policyMessage: string;\n};\n\nexport function evaluateCancellationPolicy(opts: {\n bookingDatetime: Date;\n amountPaidCents: number;\n depositAmountEuros?: number;\n cancelPolicyHours: number;\n cancelPolicyAction: CancelPolicyAction;\n}): CancellationPolicyResult {\n const { bookingDatetime, amountPaidCents, depositAmountEuros, cancelPolicyHours, cancelPolicyAction } = opts;\n\n const hoursUntil = (bookingDatetime.getTime() - Date.now()) / (1000 * 60 * 60);\n const isFreeCancel = hoursUntil >= cancelPolicyHours;\n\n if (isFreeCancel || amountPaidCents === 0 || cancelPolicyAction === 'full_refund') {\n return {\n isFreeCancel,\n refundCents: amountPaidCents,\n keepCents: 0,\n policyMessage:\n amountPaidCents > 0\n ? `Ще получите пълен refund от €${(amountPaidCents / 100).toFixed(2)}.`\n : 'Резервацията ще бъде отказана.',\n };\n }\n\n if (cancelPolicyAction === 'keep_full') {\n return {\n isFreeCancel: false,\n refundCents: 0,\n keepCents: amountPaidCents,\n policyMessage: `Тъй като отказвате по-малко от ${cancelPolicyHours} ч. преди часа, платената сума (€${(amountPaidCents / 100).toFixed(2)}) не се връща.`,\n };\n }\n\n // keep_deposit\n const depositCents = depositAmountEuros ? Math.round(depositAmountEuros * 100) : 0;\n const keepCents = Math.min(depositCents, amountPaidCents);\n const refundCents = Math.max(0, amountPaidCents - keepCents);\n\n return {\n isFreeCancel: false,\n refundCents,\n keepCents,\n policyMessage:\n refundCents > 0\n ? `Депозитът от €${(keepCents / 100).toFixed(2)} се задържа. Ще получите €${(refundCents / 100).toFixed(2)} обратно.`\n : `Депозитът от €${(keepCents / 100).toFixed(2)} се задържа при отказване.`,\n };\n}\n\n/** Human-readable summary shown to client before they cancel. */\nexport function formatPolicySummary(opts: {\n cancelPolicyHours: number;\n cancelPolicyAction: CancelPolicyAction;\n depositAmountEuros?: number;\n}): string {\n const { cancelPolicyHours, cancelPolicyAction, depositAmountEuros } = opts;\n\n const window =\n cancelPolicyHours >= 48\n ? `${Math.round(cancelPolicyHours / 24)} дни`\n : `${cancelPolicyHours} часа`;\n\n if (cancelPolicyAction === 'full_refund') {\n return `Безплатно отказване до ${window} преди часа. След срока — пълен refund.`;\n }\n if (cancelPolicyAction === 'keep_full') {\n return `Безплатно отказване до ${window} преди часа. След срока платената сума не се връща.`;\n }\n const depositStr = depositAmountEuros ? ` (€${depositAmountEuros})` : '';\n return `Безплатно отказване до ${window} преди часа. След срока депозитът${depositStr} се задържа.`;\n}\n","'use client';\n\nimport type { ServiceCategoryTab } from '@/lib/salon-service-categories';\n\ntype SalonServiceCategoryTabsProps = {\n categories: ServiceCategoryTab[];\n selectedId: string | null;\n onSelect: (id: string | null) => void;\n size?: 'sm' | 'md';\n className?: string;\n /** CSS gradient or solid color used for the active-tab underline. */\n accentFill?: string;\n};\n\n/** Text category filter — horizontal scroll, all labels in black. */\nexport function SalonServiceCategoryTabs({\n categories,\n selectedId,\n onSelect,\n size = 'md',\n className = '',\n accentFill = '#111111',\n}: SalonServiceCategoryTabsProps) {\n const named = categories.filter((c) => c.id != null);\n if (named.length === 0) return null;\n\n const textClass = size === 'sm' ? 'text-[12px]' : 'text-sm';\n\n return (\n <div\n className={`flex items-center gap-4 overflow-x-auto pb-0.5 scrollbar-none ${textClass} ${className}`.trim()}\n role=\"tablist\"\n aria-label=\"Категории услуги\"\n >\n {categories.map((cat) => {\n const active = selectedId === cat.id;\n return (\n <span\n key={cat.id ?? 'all'}\n role=\"tab\"\n aria-selected={active}\n tabIndex={0}\n onClick={() => onSelect(cat.id)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onSelect(cat.id);\n }\n }}\n className={`relative inline-block shrink-0 cursor-pointer select-none whitespace-nowrap pb-1.5 font-bold text-black transition ${\n active ? '' : 'hover:opacity-80'\n }`}\n >\n {cat.label}\n <span\n aria-hidden\n className=\"absolute bottom-0 left-0 h-[2px] rounded-full transition-[width,opacity] duration-200\"\n style={{\n width: active ? '100%' : '0%',\n opacity: active ? 1 : 0,\n backgroundImage: accentFill,\n }}\n />\n </span>\n );\n })}\n </div>\n );\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\nimport { useT } from '@/lib/i18n-react';\n\ntype Props = {\n serviceName: string;\n dateLabel: string;\n time: string;\n salonName: string;\n onClose: () => void;\n};\n\nexport function BookingSuccessView({\n serviceName,\n dateLabel,\n time,\n salonName,\n onClose,\n}: Props) {\n const t = useT();\n const [show, setShow] = useState(false);\n\n useEffect(() => {\n const t = setTimeout(() => setShow(true), 50);\n return () => clearTimeout(t);\n }, []);\n\n return (\n <div className=\"flex flex-1 flex-col items-center justify-center px-6 py-10\">\n <div\n className={`flex flex-col items-center transition-all duration-700 ease-out ${\n show ? 'translate-y-0 opacity-100' : 'translate-y-4 opacity-0'\n }`}\n >\n {/* Animated checkmark */}\n <div className=\"relative mb-6\">\n <div\n className={`flex h-20 w-20 items-center justify-center rounded-full transition-all duration-500 ease-out ${\n show ? 'scale-100' : 'scale-50'\n }`}\n style={{ background: 'linear-gradient(135deg, #22c55e 0%, #16a34a 100%)' }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n className=\"h-10 w-10\"\n aria-hidden\n >\n <path\n d=\"M5 13l4 4L19 7\"\n stroke=\"white\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={show ? 'animate-[draw_0.5s_ease-out_0.3s_forwards]' : ''}\n style={{\n strokeDasharray: 24,\n strokeDashoffset: show ? 0 : 24,\n transition: 'stroke-dashoffset 0.5s ease-out 0.3s',\n }}\n />\n </svg>\n </div>\n <div\n className={`absolute inset-0 rounded-full transition-all duration-700 ease-out ${\n show ? 'scale-150 opacity-0' : 'scale-100 opacity-30'\n }`}\n style={{ background: 'linear-gradient(135deg, #22c55e 0%, #16a34a 100%)' }}\n aria-hidden\n />\n </div>\n\n {/* Title */}\n <h3\n className={`text-center text-[22px] font-semibold leading-tight tracking-tight text-[#111] transition-all delay-200 duration-500 ${\n show ? 'translate-y-0 opacity-100' : 'translate-y-3 opacity-0'\n }`}\n >\n {t('booking.success.confirmed')}\n </h3>\n\n {/* Subtitle */}\n <p\n className={`mt-2 text-center text-[15px] leading-relaxed text-black/45 transition-all delay-300 duration-500 ${\n show ? 'translate-y-0 opacity-100' : 'translate-y-3 opacity-0'\n }`}\n >\n {t('booking.success.waitingAt')} <span className=\"font-medium text-black/60\">{salonName}</span>\n </p>\n\n {/* Details card */}\n <div\n className={`mt-6 w-full max-w-[320px] overflow-hidden rounded-2xl border border-black/[0.06] bg-white shadow-[0_2px_12px_rgba(0,0,0,0.08)] transition-all delay-[400ms] duration-500 ${\n show ? 'translate-y-0 opacity-100' : 'translate-y-3 opacity-0'\n }`}\n >\n <div className=\"space-y-3 px-5 py-4\">\n <div className=\"flex items-start gap-3\">\n <div className=\"mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-xl bg-black/[0.04]\">\n <svg viewBox=\"0 0 20 20\" fill=\"currentColor\" className=\"h-4 w-4 text-black/40\" aria-hidden>\n <path fillRule=\"evenodd\" d=\"M6 3.75A2.75 2.75 0 018.75 1h2.5A2.75 2.75 0 0114 3.75v.443c.572.055 1.14.122 1.706.2C17.053 4.582 18 5.75 18 7.07v3.469c0 1.126-.694 2.191-1.83 2.54-1.952.599-4.024.921-6.17.921s-4.219-.322-6.17-.921C2.694 12.73 2 11.665 2 10.539V7.07c0-1.321.947-2.489 2.294-2.676A41.047 41.047 0 016 4.193V3.75zm6.5 0v.325a41.622 41.622 0 00-5 0V3.75c0-.69.56-1.25 1.25-1.25h2.5c.69 0 1.25.56 1.25 1.25zM10 10a1 1 0 00-1 1v.01a1 1 0 001 1h.01a1 1 0 001-1V11a1 1 0 00-1-1H10z\" clipRule=\"evenodd\" />\n <path d=\"M3 15.055v-.684c.126.053.255.1.39.142 2.092.642 4.313.987 6.61.987 2.297 0 4.518-.345 6.61-.987.135-.041.264-.089.39-.142v.684c0 1.347-.985 2.53-2.363 2.686a41.454 41.454 0 01-9.274 0C3.985 17.585 3 16.402 3 15.055z\" />\n </svg>\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-[11px] font-medium uppercase tracking-wide text-black/30\">{t('booking.success.labelService')}</p>\n <p className=\"mt-0.5 text-[14px] font-medium leading-snug text-[#111]\">{serviceName}</p>\n </div>\n </div>\n\n <div className=\"h-px bg-black/[0.05]\" />\n\n <div className=\"flex items-start gap-3\">\n <div className=\"mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-xl bg-black/[0.04]\">\n <svg viewBox=\"0 0 20 20\" fill=\"currentColor\" className=\"h-4 w-4 text-black/40\" aria-hidden>\n <path fillRule=\"evenodd\" d=\"M5.75 2a.75.75 0 01.75.75V4h7V2.75a.75.75 0 011.5 0V4h.25A2.75 2.75 0 0118 6.75v8.5A2.75 2.75 0 0115.25 18H4.75A2.75 2.75 0 012 15.25v-8.5A2.75 2.75 0 014.75 4H5V2.75A.75.75 0 015.75 2zm-1 5.5c-.69 0-1.25.56-1.25 1.25v6.5c0 .69.56 1.25 1.25 1.25h10.5c.69 0 1.25-.56 1.25-1.25v-6.5c0-.69-.56-1.25-1.25-1.25H4.75z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-[11px] font-medium uppercase tracking-wide text-black/30\">{t('booking.success.labelWhen')}</p>\n <p className=\"mt-0.5 text-[14px] font-medium leading-snug text-[#111]\">\n {t('booking.success.timeFormat', { date: dateLabel, time })}\n </p>\n </div>\n </div>\n </div>\n </div>\n\n {/* Close button */}\n <button\n type=\"button\"\n onClick={onClose}\n className={`mt-8 w-full max-w-[320px] rounded-full bg-[#111] py-3.5 text-[15px] font-semibold text-white shadow-[0_4px_14px_rgba(0,0,0,0.15)] transition-all delay-500 duration-500 active:scale-[0.98] ${\n show ? 'translate-y-0 opacity-100' : 'translate-y-3 opacity-0'\n }`}\n >\n {t('booking.success.done')}\n </button>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { Check, ChevronDown, Loader2, Plus, User, X } from 'lucide-react';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { useT } from '@/lib/i18n-react';\nimport {\n getBookingRowIndex,\n getCatalogDisplayPriceDuration,\n isCatalogServiceSelected,\n type BookingCatalogService,\n} from '@/lib/booking-modal-catalog';\nimport { serviceMatchesCategory, type ServiceCategoryTab } from '@/lib/salon-service-categories';\nimport { formatPolicySummary, type CancelPolicyAction } from '@/lib/cancellation-policy';\nimport { SalonServiceCategoryTabs } from '@/components/salon/service-category-tabs';\nimport { BookingSuccessView } from '@/components/salon/BookingSuccessView';\n\nexport type PublicStaffMember = {\n id: string;\n name: string;\n slug: string;\n bio: string | null;\n avatarUrl: string | null;\n serviceIds: string[];\n};\n\nexport type BookingServiceOption = {\n id: string;\n name: string;\n description?: string;\n category?: string;\n price?: number;\n duration: number;\n variants?: { label: string; price: number; duration?: number }[];\n};\n\ntype SalonBookingModalProps = {\n open: boolean;\n primaryColor: string;\n /**\n * Optional CSS gradient string for accent fills (CTAs, step indicators, borders).\n * Defaults to a solid-color gradient derived from `primaryColor`.\n * Example: 'linear-gradient(135deg, #e11d48, #db2777, #a855f7)'\n */\n accentGradient?: string;\n /**\n * BCP-47 locale for date label rendering (e.g. 'bg-BG', 'en-US', 'el-GR').\n * Default: 'bg-BG'.\n */\n locale?: string;\n /**\n * Pluggable price formatter. Receives a number in the salon's currency.\n * Default: `${amount} €` (no BGN/dual-currency).\n */\n formatPrice?: (amount: number) => string;\n /** One row per service (same as public site). */\n serviceCatalog: BookingCatalogService[];\n /** Expanded rows for booking API (includes variant rows). */\n services: BookingServiceOption[];\n categoryTabs: ServiceCategoryTab[];\n selectedServiceIdxs: number[];\n selectedDate: string;\n selectedTime: string;\n totalDuration: number;\n totalPrice: number;\n clientName: string;\n clientPhone: string;\n clientEmail: string;\n notes: string;\n salonName: string;\n termsHref: string;\n privacyHref: string;\n minDate: string;\n maxDate: string;\n timeSlots: string[] | 'closed' | null;\n paymentType?: 'none' | 'deposit' | 'full';\n depositAmount?: number;\n cancelPolicyHours?: number;\n cancelPolicyAction?: CancelPolicyAction;\n isSubmitting: boolean;\n bookingError: string;\n bookingSuccess: string;\n bookingSuccessDetails?: { serviceName: string; dateLabel: string; time: string } | null;\n onClose: () => void;\n onToggleService: (idx: number) => void;\n onDateChange: (date: string) => void;\n onTimeChange: (time: string) => void;\n onClientNameChange: (v: string) => void;\n onClientPhoneChange: (v: string) => void;\n onClientEmailChange: (v: string) => void;\n onNotesChange: (v: string) => void;\n onSubmit: (e: React.FormEvent) => void;\n /** TEAM plan: pass all non-owner staff members. Empty = SOLO flow (no staff step). */\n staffMembers?: PublicStaffMember[];\n selectedStaffMemberId?: string | null;\n onStaffMemberChange?: (id: string) => void;\n /** Direct staff link: pre-filters catalog and skips staff step. */\n directStaffName?: string;\n};\n\nconst cardShadow =\n 'shadow-[0_2px_6px_rgba(0,0,0,0.14),0_10px_32px_rgba(0,0,0,0.18),0_1px_2px_rgba(0,0,0,0.1)]';\nconst backButtonShadow =\n 'shadow-[0_4px_14px_rgba(0,0,0,0.22),0_14px_40px_rgba(0,0,0,0.16),0_1px_0_rgba(0,0,0,0.06)]';\nconst gradientCtaShadow = 'shadow-[0_8px_28px_rgba(0,0,0,0.18)]';\nconst gradientRingShadow = 'shadow-[0_2px_10px_rgba(0,0,0,0.08)]';\nconst blackCtaShadow = 'shadow-[0_4px_14px_rgba(0,0,0,0.15)]';\n\nconst fieldClass =\n `mt-1.5 block w-full min-w-0 max-w-full box-border rounded-2xl border border-black/[0.06] bg-white px-3.5 py-3 text-[16px] leading-tight text-[#111] touch-manipulation ${cardShadow} outline-none transition focus:border-[color:var(--salon-primary)]/40 focus:ring-2 focus:ring-[color:var(--salon-primary)]/12`;\n\nfunction addMinutesToTime(time: string, minutesToAdd: number): string {\n const [h, m] = time.split(':').map(Number);\n if (!Number.isFinite(h) || !Number.isFinite(m)) return time;\n const total = h * 60 + m + minutesToAdd;\n const outH = Math.floor(total / 60) % 24;\n const outM = total % 60;\n return `${String(outH).padStart(2, '0')}:${String(outM).padStart(2, '0')}`;\n}\n\nfunction ServiceDescription({ text }: { text?: string }) {\n const description = text?.trim();\n if (!description) return null;\n return (\n <p className=\"mt-1 line-clamp-3 text-[12px] leading-relaxed text-black/50\">{description}</p>\n );\n}\n\nexport function SalonBookingModal({\n open,\n primaryColor,\n accentGradient,\n locale = 'bg-BG',\n formatPrice,\n serviceCatalog,\n services,\n categoryTabs,\n selectedServiceIdxs,\n selectedDate,\n selectedTime,\n totalDuration,\n totalPrice,\n clientName,\n clientPhone,\n clientEmail,\n notes,\n salonName,\n termsHref,\n privacyHref,\n minDate,\n maxDate,\n timeSlots,\n paymentType = 'none',\n depositAmount,\n cancelPolicyHours,\n cancelPolicyAction,\n isSubmitting,\n bookingError,\n bookingSuccess,\n bookingSuccessDetails,\n onClose,\n onToggleService,\n onDateChange,\n onTimeChange,\n onClientNameChange,\n onClientPhoneChange,\n onClientEmailChange,\n onNotesChange,\n onSubmit,\n staffMembers = [],\n selectedStaffMemberId,\n onStaffMemberChange,\n directStaffName,\n}: SalonBookingModalProps) {\n const t = useT();\n\n // Derive accent fill + gradient-border styles from props. White-label: the\n // consumer controls colors via `primaryColor` (single solid) or\n // `accentGradient` (full CSS gradient string).\n const accentFill = useMemo(\n () => accentGradient ?? `linear-gradient(135deg, ${primaryColor}, ${primaryColor})`,\n [accentGradient, primaryColor],\n );\n const accentFillStyle = useMemo(\n () => ({ backgroundImage: accentFill }),\n [accentFill],\n );\n const accentBorderStyle = useMemo(\n () => ({\n border: '1px solid transparent',\n backgroundImage: `linear-gradient(#ffffff, #ffffff), ${accentFill}`,\n backgroundOrigin: 'border-box' as const,\n backgroundClip: 'padding-box, border-box',\n }),\n [accentFill],\n );\n\n const fmtPrice = useMemo<(n: number) => string>(\n () => formatPrice ?? ((n) => `${Number.isInteger(n) ? n : n.toFixed(2)} €`),\n [formatPrice],\n );\n\n // isTeam = TEAM salon with multiple staff members; direct = pre-selected staff link\n const isTeam = staffMembers.length > 0 && !directStaffName;\n // Steps: 1=service, 2=staff(team only), 3=datetime, 4=contact\n const [step, setStep] = useState<1 | 2 | 3 | 4>(1);\n const [selectedCategory, setSelectedCategory] = useState<string | null>(null);\n const [browseAllServices, setBrowseAllServices] = useState(true);\n const [selectedVariantByServiceId, setSelectedVariantByServiceId] = useState<Record<string, string>>({});\n const [variantDropdownOpenForServiceId, setVariantDropdownOpenForServiceId] = useState<string | null>(null);\n const prevOpenRef = useRef(false);\n\n useEffect(() => {\n if (!open) return;\n setStep(1);\n setSelectedCategory(null);\n setVariantDropdownOpenForServiceId(null);\n const initial: Record<string, string> = {};\n for (const service of serviceCatalog) {\n const variants = service.variants ?? [];\n if (variants.length > 0) initial[service.id] = variants[0]!.label;\n }\n setSelectedVariantByServiceId(initial);\n }, [open, serviceCatalog]);\n\n // Compute which staff members can perform ALL currently selected services.\n const selectedServiceIds = useMemo(() => {\n return selectedServiceIdxs\n .map((idx) => services[idx]?.id)\n .filter((id): id is string => Boolean(id));\n }, [selectedServiceIdxs, services]);\n\n const eligibleStaff = useMemo(() => {\n if (!isTeam) return [];\n if (selectedServiceIds.length === 0) return staffMembers;\n return staffMembers.filter((sm) =>\n selectedServiceIds.every((sid) => sm.serviceIds.includes(sid)),\n );\n }, [isTeam, staffMembers, selectedServiceIds]);\n\n // Auto-select when exactly 1 eligible staff member.\n useEffect(() => {\n if (!isTeam || eligibleStaff.length !== 1) return;\n onStaffMemberChange?.(eligibleStaff[0]!.id);\n }, [isTeam, eligibleStaff, onStaffMemberChange]);\n\n useEffect(() => {\n if (open && !prevOpenRef.current) {\n setBrowseAllServices(selectedServiceIdxs.length === 0);\n }\n prevOpenRef.current = open;\n }, [open, selectedServiceIdxs.length]);\n\n useEffect(() => {\n if (selectedServiceIdxs.length === 0) {\n setBrowseAllServices(true);\n } else {\n setBrowseAllServices(false);\n }\n }, [selectedServiceIdxs.length]);\n\n const hasServices = selectedServiceIdxs.length > 0;\n const endTime = useMemo(\n () => (selectedTime ? addMinutesToTime(selectedTime, Math.max(5, totalDuration || 0)) : ''),\n [selectedTime, totalDuration]\n );\n const selectedServices = useMemo(\n () =>\n selectedServiceIdxs\n .map((idx) => services[idx])\n .filter((svc): svc is BookingServiceOption => Boolean(svc)),\n [selectedServiceIdxs, services]\n );\n const visibleCatalog = useMemo(\n () => serviceCatalog.filter((service) => serviceMatchesCategory(service, selectedCategory)),\n [serviceCatalog, selectedCategory],\n );\n\n useEffect(() => {\n if (!selectedCategory) return;\n const hasCategory = serviceCatalog.some((svc) => serviceMatchesCategory(svc, selectedCategory));\n if (!hasCategory) setSelectedCategory(null);\n }, [serviceCatalog, selectedCategory]);\n\n function toggleCatalogService(service: BookingCatalogService) {\n const variants = service.variants ?? [];\n const variantLabel = variants.length > 0 ? selectedVariantByServiceId[service.id] ?? variants[0]!.label : null;\n const idx = getBookingRowIndex(services, service.id, variantLabel);\n if (idx < 0) return;\n onToggleService(idx);\n }\n\n const dateOptions = useMemo(() => {\n if (!minDate || !maxDate) return [];\n const out: { iso: string; weekday: string; day: string }[] = [];\n const start = new Date(`${minDate}T12:00:00`);\n const end = new Date(`${maxDate}T12:00:00`);\n const cursor = new Date(start);\n while (cursor <= end && out.length < 45) {\n const iso = `${cursor.getFullYear()}-${String(cursor.getMonth() + 1).padStart(2, '0')}-${String(cursor.getDate()).padStart(2, '0')}`;\n out.push({\n iso,\n weekday: cursor.toLocaleDateString(locale, { weekday: 'short' }),\n day: cursor.toLocaleDateString(locale, { day: 'numeric', month: 'short' }),\n });\n cursor.setDate(cursor.getDate() + 1);\n }\n return out;\n }, [minDate, maxDate, locale]);\n\n function goToStep(target: 1 | 2 | 3 | 4) {\n if (isTeam) {\n if (target >= 2 && !hasServices) return;\n if (target >= 3 && !selectedStaffMemberId) return;\n if (target >= 4 && (!hasServices || !selectedTime)) return;\n } else {\n if (target >= 2 && !hasServices) return; // step 2 = datetime for solo\n if (target >= 3 && (!hasServices || !selectedTime)) return;\n }\n setStep(target);\n }\n\n // Step label definitions differ between SOLO and TEAM.\n const stepLabels = isTeam\n ? [\n { n: 1 as const, label: t('booking.modal.stepService') },\n { n: 2 as const, label: t('booking.modal.stepSpecialist') },\n { n: 3 as const, label: t('booking.modal.stepTime') },\n { n: 4 as const, label: t('booking.modal.stepDetails') },\n ]\n : [\n { n: 1 as const, label: t('booking.modal.stepService') },\n { n: 2 as const, label: t('booking.modal.stepTime') },\n { n: 3 as const, label: t('booking.modal.stepDetails') },\n ];\n\n function requestClose() {\n if (typeof window !== 'undefined') {\n const shouldClose = window.confirm(t('booking.modal.confirmClose'));\n if (!shouldClose) return;\n }\n onClose();\n }\n\n useEffect(() => {\n if (!open || typeof document === 'undefined') return;\n document.documentElement.style.setProperty('overflow', 'hidden');\n document.documentElement.style.setProperty('background-color', '#ffffff');\n document.body.style.setProperty('overflow', 'hidden');\n document.body.style.setProperty('position', 'fixed');\n document.body.style.setProperty('inset', '0');\n document.body.style.setProperty('width', '100%');\n document.body.style.setProperty('background-color', '#ffffff');\n const scrollY = window.scrollY;\n document.body.style.setProperty('top', `-${scrollY}px`);\n return () => {\n document.documentElement.style.removeProperty('overflow');\n document.documentElement.style.removeProperty('background-color');\n document.body.style.removeProperty('overflow');\n document.body.style.removeProperty('position');\n document.body.style.removeProperty('inset');\n document.body.style.removeProperty('width');\n document.body.style.removeProperty('background-color');\n document.body.style.removeProperty('top');\n window.scrollTo(0, scrollY);\n };\n }, [open]);\n\n if (!open) return null;\n\n return (\n <div className=\"fixed inset-0 z-[110] overflow-hidden bg-white sm:bg-transparent\" role=\"presentation\">\n <div className=\"absolute inset-0 hidden bg-black/30 backdrop-blur-sm sm:block\" aria-hidden />\n\n <div\n role=\"dialog\"\n aria-modal\n aria-label={t('booking.modal.ariaLabel')}\n className=\"absolute inset-x-0 bottom-0 z-10 mx-auto flex h-[100dvh] w-full max-w-none flex-col overflow-hidden bg-white sm:inset-x-auto sm:bottom-auto sm:left-1/2 sm:top-1/2 sm:h-auto sm:max-h-[88vh] sm:w-full sm:max-w-md sm:-translate-x-1/2 sm:-translate-y-1/2 sm:rounded-[1.6rem] sm:bg-white sm:shadow-[0_25px_60px_rgba(0,0,0,0.12)]\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"mx-auto mt-2 h-1 w-10 shrink-0 rounded-full bg-black/10 sm:hidden\" aria-hidden />\n\n <div className=\"relative z-[1] flex shrink-0 items-center justify-between gap-2 bg-white px-4 pb-3 pt-3.5 sm:px-5\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <h3 className=\"text-[17px] font-semibold tracking-tight text-black\">\n {directStaffName ? t('booking.modal.titleWithStaff', { name: directStaffName }) : t('booking.modal.titleDefault')}\n </h3>\n <div className=\"flex items-center gap-1.5\">\n {stepLabels.map(({ n, label }) => {\n const active = step === n;\n const complete = step > n;\n const disabled = isTeam\n ? (n >= 2 && !hasServices) || (n >= 3 && !selectedStaffMemberId) || (n >= 4 && (!hasServices || !selectedTime))\n : (n >= 2 && !hasServices) || (n >= 3 && (!hasServices || !selectedTime));\n return (\n <button\n key={`header-step-${n}`}\n type=\"button\"\n disabled={disabled}\n onClick={() => goToStep(n)}\n className={`inline-flex h-7 min-w-[1.75rem] items-center justify-center rounded-full px-2.5 text-[11px] font-bold transition disabled:opacity-20 ${\n active || complete\n ? `text-white ${gradientCtaShadow}`\n : `bg-white text-black/50 ${cardShadow}`\n }`}\n style={active || complete ? accentFillStyle : undefined}\n title={label}\n aria-label={t('booking.modal.stepAria', { n, label })}\n >\n {complete && !active ? '✓' : n}\n </button>\n );\n })}\n </div>\n </div>\n <button\n type=\"button\"\n className={`shrink-0 rounded-full bg-white p-2 text-black/40 transition active:bg-black/[0.03] ${cardShadow}`}\n onClick={requestClose}\n aria-label={t('booking.modal.closeAria')}\n >\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n\n <div className=\"relative z-[1] min-h-0 flex-1 overflow-x-hidden overflow-y-auto overscroll-contain bg-white px-4 py-5 sm:px-5\">\n {bookingSuccess ? (\n bookingSuccessDetails ? (\n <BookingSuccessView\n serviceName={bookingSuccessDetails.serviceName}\n dateLabel={bookingSuccessDetails.dateLabel}\n time={bookingSuccessDetails.time}\n salonName={salonName}\n onClose={onClose}\n />\n ) : (\n <p className=\"rounded-2xl bg-emerald-50 px-3.5 py-3 text-sm leading-relaxed text-emerald-700\">\n {bookingSuccess}\n </p>\n )\n ) : (\n <form id=\"salon-booking-form\" onSubmit={onSubmit} className=\"min-w-0 space-y-3.5 bg-white\">\n {step === 1 ? (\n <div className=\"space-y-3\">\n {hasServices && !browseAllServices ? (\n <>\n <div className=\"flex items-baseline justify-between gap-2\">\n <p className=\"text-[13px] font-semibold text-black\">{t('booking.modal.selectedServices')}</p>\n <p className=\"text-[12px] font-medium tabular-nums text-black/40\">\n {t(selectedServices.length === 1 ? 'booking.modal.serviceCountOne' : 'booking.modal.serviceCountMany', { count: selectedServices.length })}\n </p>\n </div>\n {selectedServiceIdxs.map((idx) => {\n const svc = services[idx];\n if (!svc) return null;\n return (\n <div\n key={`selected-${svc.id}-${idx}`}\n className={`rounded-2xl p-px transition ${gradientRingShadow}`}\n style={accentBorderStyle}\n >\n <div className=\"flex items-start justify-between gap-3 rounded-[15px] bg-white px-3.5 py-3.5\">\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-[16px] font-semibold text-black\">{svc.name}</p>\n <ServiceDescription text={svc.description} />\n <p className=\"mt-1 text-[13px] tabular-nums text-black/70\">\n {svc.duration} {t('booking.modal.minSuffix')} · {fmtPrice(Number(svc.price ?? 0))}\n </p>\n </div>\n <button\n type=\"button\"\n onClick={() => onToggleService(idx)}\n className={`mt-0.5 inline-flex shrink-0 items-center gap-1 rounded-full border border-black/10 bg-white px-2.5 py-1.5 text-xs font-semibold text-black/60 transition active:bg-black/[0.04] ${cardShadow}`}\n aria-label={t('booking.modal.removeAria')}\n >\n <X className=\"h-3.5 w-3.5\" aria-hidden />\n {t('booking.modal.remove')}\n </button>\n </div>\n </div>\n );\n })}\n <button\n type=\"button\"\n onClick={() => setBrowseAllServices(true)}\n className={`flex w-full items-center justify-center gap-1.5 rounded-2xl bg-white px-3.5 py-3 text-sm font-semibold text-black ${cardShadow}`}\n >\n <Plus className=\"h-4 w-4\" aria-hidden />\n {t('booking.modal.addMoreServices')}\n </button>\n </>\n ) : (\n <>\n <div className=\"flex items-baseline justify-between gap-2\">\n <p className=\"text-[13px] font-semibold text-black\">{t('booking.modal.services')}</p>\n <p className=\"text-[12px] font-medium tabular-nums text-black/40\">\n {t(visibleCatalog.length === 1 ? 'booking.modal.serviceCountOne' : 'booking.modal.serviceCountMany', { count: visibleCatalog.length })}\n </p>\n </div>\n\n {hasServices ? (\n <button\n type=\"button\"\n onClick={() => setBrowseAllServices(false)}\n className=\"text-[12px] font-semibold text-black underline underline-offset-2\"\n >\n {t('booking.modal.hideList', { count: selectedServices.length })}\n </button>\n ) : null}\n\n <SalonServiceCategoryTabs\n categories={categoryTabs}\n selectedId={selectedCategory}\n onSelect={setSelectedCategory}\n size=\"sm\"\n className=\"-mx-1 px-1\"\n accentFill={accentFill}\n />\n\n {visibleCatalog.map((service) => {\n const variants = service.variants ?? [];\n const variantLabel =\n variants.length > 0\n ? selectedVariantByServiceId[service.id] ?? variants[0]!.label\n : null;\n const active = isCatalogServiceSelected(\n selectedServiceIdxs,\n services,\n service,\n variantLabel,\n );\n const { price, duration } = getCatalogDisplayPriceDuration(service, variantLabel);\n return (\n <div\n key={service.id}\n className={`rounded-2xl transition ${\n active ? `p-px ${gradientRingShadow}` : `bg-white ${cardShadow}`\n }`}\n style={active ? accentBorderStyle : undefined}\n >\n <div\n className={`flex items-start justify-between gap-3 ${\n active ? 'rounded-[15px] bg-white px-3.5 py-3.5' : 'px-3.5 py-3.5'\n }`}\n >\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-[16px] font-semibold text-black\">{service.name}</p>\n <ServiceDescription text={service.description} />\n {variants.length > 0 ? (\n <div className=\"relative mt-1.5 max-w-full\">\n <button\n type=\"button\"\n onClick={() =>\n setVariantDropdownOpenForServiceId((prev) =>\n prev === service.id ? null : service.id,\n )\n }\n className=\"flex w-full items-center justify-between rounded-full border border-black/12 bg-white px-3 py-1.5 text-left text-xs transition hover:border-black/25\"\n >\n <span className=\"truncate\">{variantLabel}</span>\n <ChevronDown className=\"ml-1 h-3.5 w-3.5 shrink-0 text-black/45\" aria-hidden />\n </button>\n {variantDropdownOpenForServiceId === service.id ? (\n <div className=\"absolute left-0 right-0 z-20 mt-1 overflow-hidden rounded-xl border border-black/10 bg-white shadow-[0_8px_24px_rgba(0,0,0,0.12)]\">\n {variants.map((variant) => (\n <button\n key={variant.label}\n type=\"button\"\n onClick={() => {\n setSelectedVariantByServiceId((prev) => ({\n ...prev,\n [service.id]: variant.label,\n }));\n setVariantDropdownOpenForServiceId(null);\n }}\n className={`w-full px-3 py-2 text-left text-xs hover:bg-black/[0.04] ${\n variantLabel === variant.label ? 'font-semibold text-black' : 'text-black/70'\n }`}\n >\n {variant.label} · {fmtPrice(Number(variant.price) || 0)}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n ) : null}\n <p className=\"mt-1.5 text-[13px] tabular-nums text-black/45\">\n {duration} {t('booking.modal.minSuffix')} · {fmtPrice(Number(price) || 0)}\n </p>\n </div>\n {active ? (\n <button\n type=\"button\"\n onClick={() => toggleCatalogService(service)}\n className={`mt-0.5 inline-flex shrink-0 items-center gap-1 rounded-full border border-black/10 bg-white px-2.5 py-1.5 text-xs font-semibold text-black/60 transition active:bg-black/[0.04] ${cardShadow}`}\n aria-label={t('booking.modal.removeAria')}\n >\n <X className=\"h-3.5 w-3.5\" aria-hidden />\n {t('booking.modal.remove')}\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={() => toggleCatalogService(service)}\n className={`mt-0.5 inline-flex shrink-0 items-center gap-1 rounded-full px-2.5 py-1.5 text-xs font-semibold text-white transition ${gradientCtaShadow}`}\n style={accentFillStyle}\n >\n <Plus className=\"h-3.5 w-3.5\" aria-hidden />\n {t('booking.modal.add')}\n </button>\n )}\n </div>\n </div>\n );\n })}\n {visibleCatalog.length === 0 ? (\n <p className={`rounded-2xl bg-white px-3.5 py-3 text-sm text-black/40 ${cardShadow}`}>\n {t('booking.modal.noServicesInCategory')}\n </p>\n ) : null}\n </>\n )}\n </div>\n ) : null}\n\n {/* Staff selection step — TEAM only, step 2 */}\n {step === 2 && isTeam ? (\n <div className=\"space-y-3\">\n <p className=\"text-[13px] font-semibold text-black\">{t('booking.modal.selectSpecialist')}</p>\n {selectedServiceIds.length > 0 && (\n <p className=\"text-[12px] text-black/45\">\n {t('booking.modal.availableFor')}&nbsp;\n <span className=\"font-medium text-black/70\">\n {selectedServiceIds\n .map((sid) => serviceCatalog.find((s) => s.id === sid)?.name ?? sid)\n .join(' + ')}\n </span>\n </p>\n )}\n {eligibleStaff.length === 0 ? (\n <div className={`rounded-2xl bg-white px-4 py-5 text-center ${cardShadow}`}>\n <p className=\"text-[14px] font-medium text-black/50\">\n {t('booking.modal.serviceUnavailable')}\n </p>\n <button\n type=\"button\"\n onClick={() => setStep(1)}\n className=\"mt-3 text-[13px] font-semibold text-[color:var(--salon-primary)] underline underline-offset-2\"\n >\n {t('booking.modal.selectOtherService')}\n </button>\n </div>\n ) : (\n <div className=\"space-y-2.5\">\n {eligibleStaff.map((sm) => {\n const selected = selectedStaffMemberId === sm.id;\n return (\n <button\n key={sm.id}\n type=\"button\"\n onClick={() => onStaffMemberChange?.(sm.id)}\n className={`flex w-full items-center gap-3 rounded-2xl px-4 py-3.5 text-left transition ${\n selected\n ? `p-px ${gradientRingShadow}`\n : `bg-white ${cardShadow}`\n }`}\n style={selected ? accentBorderStyle : undefined}\n >\n {selected ? (\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full text-white\" style={accentFillStyle}>\n <Check className=\"h-4 w-4\" aria-hidden />\n </div>\n ) : (\n <div className={`flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-white text-black/30 ${cardShadow}`}>\n <User className=\"h-4 w-4\" aria-hidden />\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-[15px] font-semibold text-black\">{sm.name}</p>\n {sm.bio && (\n <p className=\"mt-0.5 truncate text-[12px] text-black/45\">{sm.bio}</p>\n )}\n </div>\n </button>\n );\n })}\n </div>\n )}\n </div>\n ) : null}\n\n {/* Date/time step — step 2 for SOLO/direct, step 3 for TEAM */}\n {((isTeam && step === 3) || (!isTeam && step === 2)) ? (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-start justify-between gap-2\">\n <p className=\"text-[13px] font-semibold text-black\">\n {selectedStaffMemberId\n ? t('booking.modal.timeWithStaff', { name: staffMembers.find((s) => s.id === selectedStaffMemberId)?.name ?? '' })\n : t('booking.modal.dateTime')}\n </p>\n <button\n type=\"button\"\n onClick={() => setStep(1)}\n className={`inline-flex items-center gap-1 rounded-full bg-white px-3 py-1.5 text-xs font-semibold text-[color:var(--salon-primary)] ${cardShadow} active:bg-black/[0.03]`}\n >\n <Plus className=\"h-3.5 w-3.5\" />\n {t('booking.modal.addService')}\n </button>\n </div>\n\n {hasServices ? (\n <p className=\"text-[15px] font-semibold text-black\">\n {selectedServices.map((s) => s.name).join(' + ')}\n </p>\n ) : null}\n\n <div className=\"min-w-0\">\n <label className=\"block text-[13px] font-semibold text-black\">\n {t('booking.modal.date')}\n </label>\n <div className=\"-mx-1 mt-2 flex gap-2.5 overflow-x-auto px-1 pb-1.5 scrollbar-none\">\n {dateOptions.map((d) => {\n const active = selectedDate === d.iso;\n return (\n <button\n key={d.iso}\n type=\"button\"\n onClick={() => onDateChange(d.iso)}\n className={`flex h-[4.25rem] w-[4.25rem] shrink-0 flex-col items-center justify-center rounded-2xl text-center transition ${\n active\n ? 'text-white shadow-[0_4px_14px_rgba(0,0,0,0.18)]'\n : 'border border-black/[0.06] bg-white text-black/60 shadow-[0_1px_4px_rgba(0,0,0,0.06),0_4px_12px_rgba(0,0,0,0.04)]'\n }`}\n style={active ? { backgroundColor: '#000' } : undefined}\n >\n <span className=\"text-[10px] font-medium uppercase leading-none tabular-nums opacity-75\">\n {d.weekday}\n </span>\n <span className=\"mt-1 text-[12px] font-bold leading-tight tabular-nums\">{d.day}</span>\n </button>\n );\n })}\n </div>\n </div>\n\n <div className=\"min-w-0\">\n <label className=\"block text-[13px] font-semibold text-black\">\n {t('booking.modal.time')}\n </label>\n {!selectedDate ? (\n <p className=\"mt-1.5 text-sm text-black/35\">{t('booking.modal.selectDateFirst')}</p>\n ) : timeSlots === 'closed' ? (\n <p className=\"mt-1.5 text-sm text-black/35\">{t('booking.modal.dayClosed')}</p>\n ) : Array.isArray(timeSlots) && timeSlots.length === 0 ? (\n <p className=\"mt-1.5 text-sm text-black/35\">{t('booking.modal.noSlots')}</p>\n ) : Array.isArray(timeSlots) ? (\n <div className=\"mt-2 grid w-full max-w-full grid-cols-3 gap-2.5 sm:grid-cols-4\">\n {timeSlots.map((t) => {\n const active = selectedTime === t;\n return (\n <button\n key={t}\n type=\"button\"\n onClick={() => onTimeChange(t)}\n className={`min-w-0 touch-manipulation rounded-2xl px-2 py-3 text-center text-[14px] font-semibold tabular-nums transition ${\n active\n ? 'text-white shadow-[0_4px_14px_rgba(0,0,0,0.22)]'\n : 'border border-black/[0.08] bg-white text-black shadow-[0_2px_8px_rgba(0,0,0,0.12),0_4px_16px_rgba(0,0,0,0.08)] active:bg-black/[0.03] active:shadow-[0_1px_2px_rgba(0,0,0,0.10)]'\n }`}\n style={active ? { backgroundColor: '#000' } : undefined}\n >\n {t}\n </button>\n );\n })}\n </div>\n ) : (\n <p className=\"mt-1.5 text-sm text-black/35\">{t('booking.modal.selectServiceFirst')}</p>\n )}\n </div>\n </div>\n ) : null}\n\n {/* Contact step — step 3 for SOLO/direct, step 4 for TEAM */}\n {((isTeam && step === 4) || (!isTeam && step === 3)) ? (\n <div className=\"space-y-3.5\">\n <p className=\"text-[13px] font-semibold text-black\">\n {t('booking.modal.contactDetails')}\n </p>\n <div className=\"min-w-0\">\n <label className=\"block text-[13px] font-semibold text-black\">\n {t('booking.modal.name')}\n </label>\n <input\n className={fieldClass}\n value={clientName}\n onChange={(e) => onClientNameChange(e.target.value)}\n autoComplete=\"name\"\n required\n />\n </div>\n\n <div className=\"min-w-0\">\n <label className=\"block text-[13px] font-semibold text-black\">\n {t('booking.modal.phone')}\n </label>\n <input\n type=\"tel\"\n className={fieldClass}\n value={clientPhone}\n onChange={(e) => onClientPhoneChange(e.target.value)}\n autoComplete=\"tel\"\n inputMode=\"tel\"\n required\n />\n </div>\n\n <div className=\"min-w-0\">\n <label className=\"block text-[13px] font-semibold text-black\">\n {t('booking.modal.email')}\n </label>\n <input\n type=\"email\"\n inputMode=\"email\"\n autoComplete=\"email\"\n className={fieldClass}\n value={clientEmail}\n onChange={(e) => onClientEmailChange(e.target.value)}\n required\n />\n </div>\n\n <div className=\"min-w-0\">\n <label className=\"block text-[13px] font-semibold text-black\">\n {t('booking.modal.notes')}\n </label>\n <textarea\n className={`${fieldClass} resize-none`}\n rows={2}\n value={notes}\n onChange={(e) => onNotesChange(e.target.value)}\n />\n </div>\n\n </div>\n ) : null}\n\n {bookingError ? (\n <p className=\"rounded-lg bg-red-50 px-3 py-2 text-sm text-red-700\" role=\"alert\">\n {bookingError}\n </p>\n ) : null}\n </form>\n )}\n </div>\n\n {!bookingSuccess && !bookingSuccessDetails ? (\n <div className=\"relative z-[2] shrink-0 border-t border-black/[0.06] bg-white px-4 pb-[max(1rem,env(safe-area-inset-bottom))] pt-3 sm:px-5\">\n {hasServices ? (\n <div className=\"mb-3 px-1\">\n <p className=\"text-[13px] tabular-nums text-black/50\">\n {t('booking.modal.totalDuration', { min: Math.max(0, totalDuration) })}\n </p>\n <p className=\"text-[17px] font-semibold tabular-nums text-black/70 leading-tight\">\n {t('booking.modal.totalPrice', { price: fmtPrice(totalPrice) })}\n </p>\n {selectedTime ? (\n <p className=\"mt-0.5 text-[13px] font-semibold tabular-nums text-black\">\n {t('booking.modal.startTime', { start: selectedTime, end: endTime })}\n </p>\n ) : step > 1 ? (\n <p className=\"mt-0.5 truncate text-[13px] font-semibold text-black\">\n {selectedServices.map((s) => s.name).join(' + ')}\n </p>\n ) : null}\n </div>\n ) : null}\n\n {step === 3 && paymentType !== 'none' && (\n <div className=\"mb-2.5 space-y-1 text-center\">\n <p className=\"flex items-center justify-center gap-1.5 text-[13px] font-semibold text-[#635BFF]\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 60 60\" fill=\"none\" aria-hidden>\n <rect width=\"60\" height=\"60\" rx=\"8\" fill=\"#635BFF\"/>\n <path d=\"M27.5 22.5c0-1.7 1.4-2.4 3.6-2.4 3.2 0 7.3 1 10.4 2.7v-9.8c-3.5-1.4-7-2-10.4-2C23.1 11 18 15.2 18 22.9c0 12.1 16.6 10.2 16.6 15.4 0 2-1.7 2.7-4.1 2.7-3.5 0-8-1.5-11.5-3.5v9.9c3.9 1.7 7.9 2.4 11.5 2.4 8.8 0 14.8-4.3 14.8-12.2C45.3 25.4 27.5 27.6 27.5 22.5z\" fill=\"white\"/>\n </svg>\n {paymentType === 'deposit' && depositAmount && depositAmount > 0\n ? <>{t('booking.modal.depositRequired')} <strong className=\"mx-0.5\">{fmtPrice(Number(depositAmount) || 0)}</strong></>\n : <>{t('booking.modal.paymentFrom')} <strong className=\"mx-0.5\">{fmtPrice(totalPrice)}</strong></>\n }\n </p>\n <p className=\"text-[11px] text-black/35\">\n {t('booking.modal.securePayment')} <span className=\"font-bold text-[#635BFF]\">Stripe</span>\n </p>\n {cancelPolicyHours ? (\n <p className=\"mx-auto max-w-[320px] text-[11px] leading-relaxed text-black/45\">\n {formatPolicySummary({\n cancelPolicyHours,\n cancelPolicyAction: cancelPolicyAction ?? 'keep_deposit',\n depositAmountEuros: depositAmount,\n })}\n </p>\n ) : null}\n </div>\n )}\n {(() => {\n const maxStep = isTeam ? 4 : 3;\n const isLastStep = step === maxStep;\n const nextDisabled =\n (step === 1 && !hasServices) ||\n (isTeam && step === 2 && (!selectedStaffMemberId || eligibleStaff.length === 0)) ||\n (isTeam ? step === 3 : step === 2) && (!selectedDate || !selectedTime);\n return (\n <>\n <div className=\"grid grid-cols-2 gap-2.5\">\n <button\n type=\"button\"\n onClick={() => setStep((s) => (s > 1 ? ((s - 1) as 1 | 2 | 3 | 4) : s))}\n disabled={step === 1}\n className=\"rounded-full border border-black/10 bg-white py-2.5 text-[14px] font-medium text-black/60 transition disabled:opacity-25 active:scale-[0.98]\"\n >\n {t('booking.modal.back')}\n </button>\n {!isLastStep ? (\n <button\n type=\"button\"\n onClick={() => {\n if (!nextDisabled) setStep((s) => (s < maxStep ? ((s + 1) as 1 | 2 | 3 | 4) : s));\n }}\n disabled={nextDisabled}\n className={`rounded-full py-3.5 text-[15px] font-semibold text-white transition disabled:opacity-40 ${gradientCtaShadow}`}\n style={accentFillStyle}\n >\n {t('booking.modal.continue')}\n </button>\n ) : (\n <button\n type=\"submit\"\n form=\"salon-booking-form\"\n disabled={isSubmitting || !selectedTime || !hasServices}\n className={`flex items-center justify-center gap-2 rounded-full py-3.5 text-[15px] font-semibold text-white transition disabled:opacity-40 ${gradientCtaShadow}`}\n style={accentFillStyle}\n >\n {isSubmitting ? <Loader2 className=\"h-4 w-4 animate-spin\" aria-hidden /> : null}\n {paymentType !== 'none' ? t('booking.modal.payAndBook') : t('booking.modal.sendRequest')}\n </button>\n )}\n </div>\n {isLastStep ? (\n <p className=\"mt-2.5 text-center text-[10.5px] leading-snug text-black/35\">\n {t('booking.modal.disclaimerPre')}\n {' '}{t('booking.modal.disclaimerAccept')}{' '}\n <a href={termsHref} target=\"_blank\" rel=\"noopener noreferrer\" className=\"underline underline-offset-2\">\n {t('booking.modal.terms')}\n </a>{' '}\n {t('booking.modal.smsConsentAnd')}{' '}\n <a href={privacyHref} target=\"_blank\" rel=\"noopener noreferrer\" className=\"underline underline-offset-2\">\n {t('booking.modal.privacy')}\n </a>\n .\n </p>\n ) : null}\n </>\n );\n })()}\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n"]}
@@ -247,17 +247,20 @@ var bg_default = {
247
247
  addressMobile: "\u0410\u0434\u0440\u0435\u0441 / WWW",
248
248
  about: "\u0417\u0430 \u0441\u0430\u043B\u043E\u043D\u0430",
249
249
  faq: "FAQ",
250
- amenities: "\u0414\u043E\u043F\u044A\u043B\u043D\u0438\u0442\u0435\u043B\u043D\u0430",
251
- amenitiesMobile: "\u0414\u043E\u043F. \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F"
250
+ amenities: "\u0423\u0434\u043E\u0431\u0441\u0442\u0432\u0430",
251
+ amenitiesMobile: "\u0423\u0434\u043E\u0431\u0441\u0442\u0432\u0430"
252
252
  },
253
253
  fields: {
254
254
  salonName: "\u0418\u043C\u0435 \u043D\u0430 \u0441\u0430\u043B\u043E\u043D\u0430",
255
- category: "\u041A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u044F",
256
255
  phone: "\u0422\u0435\u043B\u0435\u0444\u043E\u043D",
257
256
  email: "\u0418\u043C\u0435\u0439\u043B",
258
257
  city: "\u0413\u0440\u0430\u0434",
259
258
  language: "\u0415\u0437\u0438\u043A",
260
- address: "\u0410\u0434\u0440\u0435\u0441"
259
+ address: "\u0410\u0434\u0440\u0435\u0441",
260
+ heroTitle: "\u0417\u0430\u0433\u043B\u0430\u0432\u0438\u0435 \u043D\u0430 \u043D\u0430\u0447\u0430\u043B\u043D\u0430\u0442\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430",
261
+ heroTitleHint: "\u041F\u043E \u0438\u0437\u0431\u043E\u0440. \u0410\u043A\u043E \u043E\u0441\u0442\u0430\u0432\u0438\u0448 \u043F\u0440\u0430\u0437\u043D\u043E, \u0449\u0435 \u0441\u0435 \u043F\u043E\u043A\u0430\u0436\u0435 \u0438\u043C\u0435\u0442\u043E \u043D\u0430 \u0441\u0430\u043B\u043E\u043D\u0430.",
262
+ heroSubtitle: "\u041F\u043E\u0434\u0437\u0430\u0433\u043B\u0430\u0432\u0438\u0435 / tagline",
263
+ heroSubtitleHint: '\u041A\u0440\u0430\u0442\u044A\u043A \u0442\u0435\u043A\u0441\u0442 \u043F\u043E\u0434 \u0437\u0430\u0433\u043B\u0430\u0432\u0438\u0435\u0442\u043E (\u043D\u0430\u043F\u0440. \u201E\u041A\u0440\u0430\u0441\u043E\u0442\u0430, \u043A\u043E\u044F\u0442\u043E \u0442\u0435 \u043A\u0430\u0440\u0430 \u0434\u0430 \u0441\u0435 \u0447\u0443\u0432\u0441\u0442\u0432\u0430\u0448 \u0443 \u0434\u043E\u043C\u0430").'
261
264
  },
262
265
  languageOptions: {
263
266
  bg: "\u0411\u044A\u043B\u0433\u0430\u0440\u0441\u043A\u0438",
@@ -479,17 +482,20 @@ var en_default = {
479
482
  addressMobile: "Address / WWW",
480
483
  about: "About",
481
484
  faq: "FAQ",
482
- amenities: "Additional",
483
- amenitiesMobile: "More info"
485
+ amenities: "Amenities",
486
+ amenitiesMobile: "Amenities"
484
487
  },
485
488
  fields: {
486
489
  salonName: "Salon name",
487
- category: "Category",
488
490
  phone: "Phone",
489
491
  email: "Email",
490
492
  city: "City",
491
493
  language: "Language",
492
- address: "Address"
494
+ address: "Address",
495
+ heroTitle: "Hero title",
496
+ heroTitleHint: "Optional. If left blank, the salon name will be shown.",
497
+ heroSubtitle: "Hero subtitle / tagline",
498
+ heroSubtitleHint: 'A short line under the title (e.g. "Beauty that feels like home").'
493
499
  },
494
500
  languageOptions: {
495
501
  bg: "Bulgarian",
@@ -544,5 +550,5 @@ function useT() {
544
550
  }
545
551
 
546
552
  export { I18nProvider, buildServiceCategoryTabs, enrichServiceCategories, normalizeLocale, serviceMatchesCategory, useT };
547
- //# sourceMappingURL=chunk-HA7DFBYI.js.map
548
- //# sourceMappingURL=chunk-HA7DFBYI.js.map
553
+ //# sourceMappingURL=chunk-ANW2GBPY.js.map
554
+ //# sourceMappingURL=chunk-ANW2GBPY.js.map