@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 +9 -2
- package/dist/{SalonBookingModal-ZIIKN2O2.js → SalonBookingModal-YL7PUL7J.js} +3 -3
- package/dist/{SalonBookingModal-ZIIKN2O2.js.map → SalonBookingModal-YL7PUL7J.js.map} +1 -1
- package/dist/{chunk-HA7DFBYI.js → chunk-ANW2GBPY.js} +16 -10
- package/dist/chunk-ANW2GBPY.js.map +1 -0
- package/dist/index.d.ts +10 -3
- package/dist/index.js +54 -27
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-HA7DFBYI.js.map +0 -1
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://
|
|
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
|
|
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-
|
|
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-
|
|
941
|
-
//# sourceMappingURL=SalonBookingModal-
|
|
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')} \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')} \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: "\
|
|
251
|
-
amenitiesMobile: "\
|
|
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: "
|
|
483
|
-
amenitiesMobile: "
|
|
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-
|
|
548
|
-
//# sourceMappingURL=chunk-
|
|
553
|
+
//# sourceMappingURL=chunk-ANW2GBPY.js.map
|
|
554
|
+
//# sourceMappingURL=chunk-ANW2GBPY.js.map
|