@idkwebsites/components 0.1.17 → 0.1.19

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/core/PlatformProvider.tsx","../src/core/context.ts","../src/core/hooks/useTenant.ts","../src/core/api-client.ts","../src/core/hooks/useServices.ts","../src/core/hooks/useTeam.ts","../src/core/hooks/useAvailability.ts","../src/core/hooks/useBooking.ts","../src/core/hooks/useBookingWidget.ts","../src/components/ServiceCard.tsx","../src/components/ServicesList.tsx","../src/lib/linkify.tsx","../src/components/TeamMember.tsx","../src/components/TeamGrid.tsx","../src/components/ContactForm.tsx","../src/components/BookingWidget.tsx","../src/components/AvailabilityPicker.tsx","../src/components/ServicePicker.tsx","../src/components/StaffPicker.tsx","../src/components/DatePicker.tsx","../src/components/TimePicker.tsx"],"sourcesContent":["'use client'\n\n// This package is client-first. Re-exported entrypoints must be marked\n// as client components so Next can import them from app/server files.\n\nexport { PlatformProvider } from './core/PlatformProvider'\nexport { useTenant } from './core/hooks/useTenant'\nexport { useServices } from './core/hooks/useServices'\nexport { useTeam } from './core/hooks/useTeam'\nexport { useAvailability } from './core/hooks/useAvailability'\nexport { useCreateBooking, useCancelBooking, useBookingLookup } from './core/hooks/useBooking'\nexport { useBookingWidget } from './core/hooks/useBookingWidget'\n\nexport { ServicesList } from './components/ServicesList'\nexport { ServiceCard } from './components/ServiceCard'\nexport { TeamGrid } from './components/TeamGrid'\nexport { TeamMember } from './components/TeamMember'\nexport { ContactForm } from './components/ContactForm'\nexport { BookingWidget } from './components/BookingWidget'\nexport { AvailabilityPicker } from './components/AvailabilityPicker'\n\nexport { ServicePicker } from './components/ServicePicker'\nexport { StaffPicker } from './components/StaffPicker'\nexport { DatePicker } from './components/DatePicker'\nexport { TimePicker } from './components/TimePicker'\n\nexport type {\n TenantInfo,\n Service,\n StaffMember,\n AvailabilityResult,\n BookingCreateInput,\n BookingCancelInput,\n BookingLookup,\n ContactSubmissionInput,\n} from './types'\n\nexport type { ServicesQueryParams } from './core/hooks/useServices'\nexport type { TeamQueryParams } from './core/hooks/useTeam'\nexport type { UseBookingWidgetOptions, UseBookingWidgetReturn } from './core/hooks/useBookingWidget'\n","/**\n * PlatformProvider\n * Provides API configuration + React Query client for all components.\n */\n'use client'\n\nimport { useState, type ReactNode } from 'react'\nimport {\n QueryClient,\n QueryClientProvider,\n HydrationBoundary,\n type DehydratedState,\n type DefaultOptions,\n} from '@tanstack/react-query'\nimport { PlatformContext } from './context'\n\ninterface PlatformProviderProps {\n apiKey: string\n apiUrl?: string\n children: ReactNode\n dehydratedState?: DehydratedState\n queryOptions?: DefaultOptions\n queryClient?: QueryClient\n}\n\nconst DEFAULT_API_URL =\n process.env.NEXT_PUBLIC_IDK_API_URL ||\n process.env.NEXT_PUBLIC_PLATFORM_API_URL ||\n 'https://app.idkwebsites.com/api/v1'\n\nexport function PlatformProvider({\n apiKey,\n apiUrl = DEFAULT_API_URL,\n children,\n dehydratedState,\n queryOptions,\n queryClient,\n}: PlatformProviderProps) {\n const [client] = useState(\n () =>\n queryClient ||\n new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 30_000,\n retry: 1,\n ...queryOptions?.queries,\n },\n mutations: {\n ...queryOptions?.mutations,\n },\n },\n })\n )\n\n return (\n <PlatformContext.Provider value={{ apiKey, apiUrl }}>\n <QueryClientProvider client={client}>\n <HydrationBoundary state={dehydratedState}>{children}</HydrationBoundary>\n </QueryClientProvider>\n </PlatformContext.Provider>\n )\n}\n","import { createContext, useContext } from 'react'\n\nexport interface PlatformConfig {\n apiKey: string\n apiUrl: string\n}\n\nconst PlatformContext = createContext<PlatformConfig | null>(null)\n\nexport function usePlatformConfig(): PlatformConfig {\n const context = useContext(PlatformContext)\n if (!context) {\n throw new Error('PlatformProvider is missing in the component tree.')\n }\n return context\n}\n\nexport { PlatformContext }\n","import { useQuery } from '@tanstack/react-query'\nimport { apiRequest } from '../api-client'\nimport { usePlatformConfig } from '../context'\nimport type { TenantInfo } from '../../types'\n\nexport function useTenant() {\n const config = usePlatformConfig()\n\n return useQuery({\n queryKey: ['idk', 'tenant'],\n queryFn: () => apiRequest<TenantInfo>(config, '/tenant'),\n })\n}\n","export class ApiError extends Error {\n status: number\n code: string\n\n constructor(message: string, status: number, code: string) {\n super(message)\n this.name = 'ApiError'\n this.status = status\n this.code = code\n }\n}\n\nexport interface ApiClientConfig {\n apiKey: string\n apiUrl: string\n}\n\nfunction normalizeBaseUrl(apiUrl: string): string {\n return apiUrl.replace(/\\/+$/, '')\n}\n\nexport async function apiRequest<T>(\n config: ApiClientConfig,\n path: string,\n options: RequestInit = {}\n): Promise<T> {\n const url = `${normalizeBaseUrl(config.apiUrl)}${path.startsWith('/') ? path : `/${path}`}`\n\n const headers = new Headers(options.headers)\n headers.set('X-API-Key', config.apiKey)\n if (!headers.has('Content-Type') && options.body) {\n headers.set('Content-Type', 'application/json')\n }\n\n const response = await fetch(url, {\n ...options,\n headers,\n })\n\n const payload = await response.json().catch(() => null)\n\n if (!response.ok) {\n const errorCode = payload?.error?.code || 'REQUEST_FAILED'\n const errorMessage = payload?.error?.message || response.statusText\n throw new ApiError(errorMessage, response.status, errorCode)\n }\n\n if (payload?.error) {\n throw new ApiError(payload.error.message || 'Request failed', payload.error.status || 400, payload.error.code || 'REQUEST_FAILED')\n }\n\n return payload?.data as T\n}\n","import { useMemo } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport { apiRequest } from '../api-client'\nimport { usePlatformConfig } from '../context'\nimport type { Service } from '../../types'\n\ninterface ServicesResponse {\n services: Service[]\n total: number\n}\n\nexport interface ServicesQueryParams {\n category?: string | string[]\n staffId?: string\n isActive?: boolean\n minPrice?: number\n maxPrice?: number\n search?: string\n ids?: string[]\n limit?: number\n sort?: 'name' | 'price' | 'duration' | 'sortOrder'\n order?: 'asc' | 'desc'\n enabled?: boolean\n}\n\nfunction buildQuery(params?: ServicesQueryParams): string {\n if (!params) return ''\n const searchParams = new URLSearchParams()\n const categories = Array.isArray(params.category)\n ? params.category\n : params.category\n ? [params.category]\n : []\n\n if (categories.length) searchParams.set('category', categories.join(','))\n if (params.staffId) searchParams.set('staffId', params.staffId)\n if (typeof params.isActive === 'boolean') searchParams.set('isActive', String(params.isActive))\n if (typeof params.minPrice === 'number') searchParams.set('minPrice', String(params.minPrice))\n if (typeof params.maxPrice === 'number') searchParams.set('maxPrice', String(params.maxPrice))\n if (params.search) searchParams.set('search', params.search)\n if (params.ids?.length) searchParams.set('ids', params.ids.join(','))\n if (typeof params.limit === 'number') searchParams.set('limit', String(params.limit))\n if (params.sort) searchParams.set('sort', params.sort)\n if (params.order) searchParams.set('order', params.order)\n\n return searchParams.toString()\n}\n\nexport function useServices(params?: ServicesQueryParams) {\n const config = usePlatformConfig()\n const queryString = useMemo(() => buildQuery(params), [\n params?.category,\n params?.staffId,\n params?.isActive,\n params?.minPrice,\n params?.maxPrice,\n params?.search,\n params?.ids,\n params?.limit,\n params?.sort,\n params?.order,\n ])\n\n const enabled = params?.enabled ?? true\n\n return useQuery({\n queryKey: ['idk', 'services', queryString],\n queryFn: () =>\n apiRequest<ServicesResponse>(\n config,\n queryString ? `/services?${queryString}` : '/services'\n ),\n enabled,\n })\n}\n","import { useMemo } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport { apiRequest } from '../api-client'\nimport { usePlatformConfig } from '../context'\nimport type { StaffMember } from '../../types'\n\ninterface TeamResponse {\n team: StaffMember[]\n total: number\n}\n\nexport interface TeamQueryParams {\n role?: string | string[]\n isActive?: boolean\n acceptsNewBookings?: boolean\n search?: string\n ids?: string[]\n serviceId?: string\n limit?: number\n sort?: 'name' | 'role' | 'createdAt'\n order?: 'asc' | 'desc'\n enabled?: boolean\n}\n\nfunction buildQuery(params?: TeamQueryParams): string {\n if (!params) return ''\n const searchParams = new URLSearchParams()\n const roles = Array.isArray(params.role)\n ? params.role\n : params.role\n ? [params.role]\n : []\n\n if (roles.length) searchParams.set('role', roles.join(','))\n if (typeof params.isActive === 'boolean') searchParams.set('isActive', String(params.isActive))\n if (typeof params.acceptsNewBookings === 'boolean') {\n searchParams.set('acceptsNewBookings', String(params.acceptsNewBookings))\n }\n if (params.search) searchParams.set('search', params.search)\n if (params.ids?.length) searchParams.set('ids', params.ids.join(','))\n if (params.serviceId) searchParams.set('serviceId', params.serviceId)\n if (typeof params.limit === 'number') searchParams.set('limit', String(params.limit))\n if (params.sort) searchParams.set('sort', params.sort)\n if (params.order) searchParams.set('order', params.order)\n\n return searchParams.toString()\n}\n\nexport function useTeam(params?: TeamQueryParams) {\n const config = usePlatformConfig()\n const queryString = useMemo(() => buildQuery(params), [\n params?.role,\n params?.isActive,\n params?.acceptsNewBookings,\n params?.search,\n params?.ids,\n params?.serviceId,\n params?.limit,\n params?.sort,\n params?.order,\n ])\n\n const enabled = params?.enabled ?? true\n\n return useQuery({\n queryKey: ['idk', 'team', queryString],\n queryFn: () =>\n apiRequest<TeamResponse>(\n config,\n queryString ? `/team?${queryString}` : '/team'\n ),\n enabled,\n })\n}\n","import { useMemo } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport { apiRequest } from '../api-client'\nimport { usePlatformConfig } from '../context'\nimport type { AvailabilityResult } from '../../types'\n\nexport interface AvailabilityParams {\n serviceId: string\n staffId?: string\n date?: string\n days?: number\n startDate?: string\n endDate?: string\n enabled?: boolean\n}\n\nfunction buildQuery(params: AvailabilityParams): string {\n const searchParams = new URLSearchParams()\n searchParams.set('serviceId', params.serviceId)\n if (params.staffId) searchParams.set('staffId', params.staffId)\n if (params.startDate) searchParams.set('startDate', params.startDate)\n if (params.endDate) searchParams.set('endDate', params.endDate)\n if (params.date) searchParams.set('date', params.date)\n if (params.days) searchParams.set('days', String(params.days))\n return searchParams.toString()\n}\n\nexport function useAvailability(params: AvailabilityParams) {\n const config = usePlatformConfig()\n const queryString = useMemo(\n () => buildQuery(params),\n [params.serviceId, params.staffId, params.startDate, params.endDate, params.date, params.days]\n )\n const enabled = params.enabled ?? Boolean(params.serviceId)\n\n return useQuery({\n queryKey: ['idk', 'availability', queryString],\n queryFn: () => apiRequest<AvailabilityResult>(config, `/availability?${queryString}`),\n enabled,\n })\n}\n","import { useMutation, useQuery } from '@tanstack/react-query'\nimport { apiRequest } from '../api-client'\nimport { usePlatformConfig } from '../context'\nimport type { BookingCreateInput, BookingCancelInput, BookingLookup } from '../../types'\n\nexport function useCreateBooking() {\n const config = usePlatformConfig()\n\n return useMutation({\n mutationFn: (input: BookingCreateInput) =>\n apiRequest<{ booking: unknown }>(config, '/bookings', {\n method: 'POST',\n body: JSON.stringify(input),\n }),\n })\n}\n\nexport function useCancelBooking() {\n const config = usePlatformConfig()\n\n return useMutation({\n mutationFn: (input: BookingCancelInput) =>\n apiRequest<{ booking: unknown }>(config, `/bookings/${input.uid}/cancel`, {\n method: 'POST',\n body: JSON.stringify({\n reason: input.reason,\n cancelledBy: input.cancelledBy || 'customer',\n }),\n }),\n })\n}\n\nexport function useBookingLookup(uid?: string, enabled = true) {\n const config = usePlatformConfig()\n\n return useQuery({\n queryKey: ['idk', 'booking', uid],\n queryFn: () => apiRequest<BookingLookup>(config, `/bookings/${uid}`),\n enabled: Boolean(uid) && enabled,\n })\n}\n","\"use client\"\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\"\nimport { useServices, type ServicesQueryParams } from \"./useServices\"\nimport { useTeam, type TeamQueryParams } from \"./useTeam\"\nimport { useAvailability } from \"./useAvailability\"\nimport { useCreateBooking } from \"./useBooking\"\nimport type { Service, StaffMember, AvailabilityDate, AvailabilitySlot } from \"../../types\"\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst parseDateOnly = (value?: string | null): Date | null => {\n if (!value) return null\n const normalized = value.includes(\"T\") ? value.split(\"T\")[0] : value\n const parsed = new Date(`${normalized}T00:00:00`)\n return Number.isNaN(parsed.getTime()) ? null : parsed\n}\n\nconst addDays = (dateStr: string, days: number): string => {\n const parsed = parseDateOnly(dateStr)\n if (!parsed) return dateStr\n parsed.setDate(parsed.getDate() + days)\n return parsed.toISOString().slice(0, 10)\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype Step = \"service\" | \"staff\" | \"time\" | \"details\" | \"done\"\n\nexport interface UseBookingWidgetOptions {\n /** Pre-fetched services — skips the API call when provided. */\n services?: Service[]\n /** Query params forwarded to `useServices` when services are not pre-fetched. */\n servicesQuery?: ServicesQueryParams\n /** Query params forwarded to `useTeam`. */\n teamQuery?: TeamQueryParams\n /** Client-side filter applied to the services list. */\n serviceFilter?: (service: Service) => boolean\n /** Client-side filter applied to the staff list. */\n teamFilter?: (member: StaffMember) => boolean\n /** Enable the staff-selection step. Default `true`. */\n showStaffSelection?: boolean\n /** Automatically advance when user selects a card. Default `false`. */\n autoAdvanceOnSelect?: boolean\n /** Scroll the widget container into view on step change. Default `true`. */\n scrollToStep?: boolean\n /** Pixel offset for scroll-into-view. Default `96`. */\n scrollOffset?: number\n /** Ref to the widget container element. Used for scroll-to-top. */\n widgetRef?: React.RefObject<HTMLElement | null>\n /** Called after a booking is created successfully. */\n onSuccess?: (booking: unknown) => void\n /** Number of days to fetch at a time in list date picker. Default `7`. */\n availabilityDays?: number\n /** Enable prev/next date paging. Default `true`. */\n enableDatePaging?: boolean\n /** Date picker mode: `\"list\"` or `\"calendar\"`. Default `\"list\"`. */\n datePickerMode?: \"list\" | \"calendar\"\n /** Calendar variant. Default `\"default\"`. */\n calendarVariant?: \"default\" | \"compact\"\n /** Max months in advance. Default `3`. */\n maxAdvanceMonths?: number\n /** Weekday numbers (0-6) to disable. Default `[]`. */\n disabledWeekdays?: number[]\n /** Show \"Fully booked\" labels on calendar days. Default `true`. */\n showFullyBookedLabel?: boolean\n /** Enable search input for service filtering. Default `true`. */\n enableServiceSearch?: boolean\n /** Enable category filter dropdown. Default `false`. */\n enableCategoryFilter?: boolean\n /** Max items per page for services before \"show more\". Default `10`. */\n servicePageSize?: number\n /** Max items per page for staff before \"show more\". Default `8`. */\n staffPageSize?: number\n /** Show \"Any Available\" option for staff. Default `true`. */\n showAnyStaffOption?: boolean\n}\n\nexport interface UseBookingWidgetReturn {\n // Current step\n step: Step\n /** 1-based step number for progress display. */\n stepNumber: number\n totalSteps: number\n\n // Selections\n selectedService: Service | null\n selectedStaff: StaffMember | null\n selectedDate: string | null\n selectedTime: string | null\n selectedEndTime: string | null\n details: { name: string; email: string; phone: string; notes: string }\n\n // Data\n servicesList: Service[]\n filteredServices: Service[]\n pagedServices: Service[]\n hasMoreServices: boolean\n categories: string[]\n staffOptions: StaffMember[]\n pagedStaff: StaffMember[]\n hasMoreStaff: boolean\n availabilityDates: AvailabilityDate[]\n availabilityByDate: Map<string, AvailabilityDate>\n timeZone: string\n timeZoneLabel: string\n\n // Calendar state\n calendarMonth: Date\n calendarDays: Array<{ date: string; isCurrentMonth: boolean }>\n hasBlockedInCalendarView: boolean\n maxAdvanceDate: Date | null\n maxAdvanceMonthStart: Date | null\n monthOptions: Array<{ value: string; label: string; date: Date }>\n\n // Loading / error\n isServicesLoading: boolean\n isAvailabilityLoading: boolean\n isSubmitting: boolean\n bookingError: string | null\n\n // Derived flags\n requiresStaff: boolean\n canSkipStaff: boolean\n\n // Search / filter state\n serviceSearch: string\n categoryFilter: string\n servicePage: number\n staffPage: number\n\n // Date paging\n availabilityStartDate: string\n\n // Formatters\n formatDateLabel: (date: string) => string\n formatDateHeading: (date: string) => string\n formatTimeLabel: (iso: string) => string\n formatDuration: (minutes: number) => string\n\n // Actions\n setServiceSearch: (value: string) => void\n setCategoryFilter: (value: string) => void\n loadMoreServices: () => void\n loadMoreStaff: () => void\n selectService: (service: Service) => void\n selectStaff: (staff: StaffMember | null) => void\n selectDate: (date: string) => void\n selectTime: (time: string, endTime: string) => void\n setDetails: React.Dispatch<React.SetStateAction<{ name: string; email: string; phone: string; notes: string }>>\n goToServiceStep: () => void\n continueFromService: () => void\n continueFromStaff: () => void\n continueFromTime: () => void\n submitBooking: (event?: React.FormEvent) => Promise<void>\n goBack: () => void\n reset: () => void\n scrollToTop: () => void\n\n // Date paging\n handlePrevDates: () => void\n handleNextDates: () => void\n\n // Calendar navigation\n handlePrevMonth: () => void\n handleNextMonth: () => void\n handleMonthSelect: (value: string) => void\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useBookingWidget(options: UseBookingWidgetOptions = {}): UseBookingWidgetReturn {\n const {\n services: servicesProp,\n servicesQuery,\n teamQuery,\n serviceFilter,\n teamFilter,\n showStaffSelection = true,\n autoAdvanceOnSelect = false,\n scrollToStep: scrollToStepEnabled = true,\n scrollOffset = 96,\n widgetRef,\n onSuccess,\n availabilityDays: availabilityDaysProp = 7,\n enableDatePaging = true,\n datePickerMode = \"list\",\n calendarVariant = \"default\",\n maxAdvanceMonths = 3,\n disabledWeekdays = [],\n showFullyBookedLabel = true,\n enableServiceSearch = true,\n enableCategoryFilter = false,\n servicePageSize = 10,\n staffPageSize = 8,\n showAnyStaffOption = true,\n } = options\n\n // ---- Data hooks ----\n const resolvedServicesQuery = useMemo(\n () => (servicesProp ? { ...servicesQuery, enabled: false } : servicesQuery),\n [servicesProp, servicesQuery],\n )\n const { data: servicesData, isLoading: servicesLoading } = useServices(resolvedServicesQuery)\n const { data: teamData } = useTeam(teamQuery)\n const createBooking = useCreateBooking()\n\n // ---- Local state ----\n const [step, setStep] = useState<Step>(\"service\")\n const [selectedService, setSelectedService] = useState<Service | null>(null)\n const [selectedStaff, setSelectedStaff] = useState<StaffMember | null>(null)\n const [selectedDate, setSelectedDate] = useState<string | null>(null)\n const [selectedTime, setSelectedTime] = useState<string | null>(null)\n const [selectedEndTime, setSelectedEndTime] = useState<string | null>(null)\n const [serviceSearch, setServiceSearch] = useState(\"\")\n const [categoryFilter, setCategoryFilter] = useState(\"all\")\n const [servicePage, setServicePage] = useState(1)\n const [staffPage, setStaffPage] = useState(1)\n const [availabilityDays, setAvailabilityDays] = useState(Math.max(1, availabilityDaysProp))\n const [availabilityStartDate, setAvailabilityStartDate] = useState(() =>\n new Date().toISOString().slice(0, 10),\n )\n const [calendarMonth, setCalendarMonth] = useState(() => {\n const now = new Date()\n return new Date(now.getFullYear(), now.getMonth(), 1)\n })\n const [bookingError, setBookingError] = useState<string | null>(null)\n const [details, setDetails] = useState({ name: \"\", email: \"\", phone: \"\", notes: \"\" })\n\n // ---- Derived: services ----\n const servicesList = useMemo(() => {\n const list = servicesProp ? [...servicesProp] : servicesData?.services ? [...servicesData.services] : []\n return serviceFilter ? list.filter(serviceFilter) : list\n }, [servicesProp, servicesData, serviceFilter])\n\n const categories = useMemo(() => {\n const set = new Set<string>()\n servicesList.forEach((s) => { if (s.category) set.add(s.category) })\n return Array.from(set).sort()\n }, [servicesList])\n\n const filteredServices = useMemo(() => {\n const search = serviceSearch.trim().toLowerCase()\n return servicesList.filter((service) => {\n const matchesSearch =\n !search ||\n service.name.toLowerCase().includes(search) ||\n (service.description || \"\").toLowerCase().includes(search) ||\n (service.category || \"\").toLowerCase().includes(search)\n const matchesCategory = categoryFilter === \"all\" ? true : service.category === categoryFilter\n return matchesSearch && matchesCategory\n })\n }, [servicesList, serviceSearch, categoryFilter])\n\n useEffect(() => { setServicePage(1) }, [serviceSearch, categoryFilter])\n useEffect(() => { setStaffPage(1) }, [selectedService?.id, teamData, teamFilter])\n\n const pagedServices = useMemo(() => {\n const pageSize = Math.max(1, servicePageSize)\n return filteredServices.slice(0, pageSize * servicePage)\n }, [filteredServices, servicePage, servicePageSize])\n\n const hasMoreServices = filteredServices.length > pagedServices.length\n\n // ---- Derived: staff ----\n const staffOptions = useMemo(() => {\n if (!selectedService) return []\n if (selectedService.assignedStaff && selectedService.assignedStaff.length > 0) {\n const assigned = selectedService.assignedStaff\n return teamFilter ? assigned.filter(teamFilter) : assigned\n }\n const teamList = teamData?.team || []\n return teamFilter ? teamList.filter(teamFilter) : teamList\n }, [selectedService, teamData, teamFilter])\n\n const pagedStaff = useMemo(() => {\n const pageSize = Math.max(1, staffPageSize)\n return staffOptions.slice(0, pageSize * staffPage)\n }, [staffOptions, staffPage, staffPageSize])\n\n const hasMoreStaff = staffOptions.length > pagedStaff.length\n\n // ---- Derived: step flags ----\n const requiresStaff =\n showStaffSelection ||\n Boolean(selectedService?.requiresStaffSelection) ||\n selectedService?.schedulingType === \"customer-choice\"\n\n const canSkipStaff = !selectedService?.requiresStaffSelection\n\n const totalSteps = requiresStaff ? 4 : 3\n const stepNumber = (() => {\n if (step === \"service\") return 1\n if (step === \"staff\") return 2\n if (step === \"time\") return requiresStaff ? 3 : 2\n if (step === \"details\") return requiresStaff ? 4 : 3\n return totalSteps\n })()\n\n // ---- Availability ----\n const availabilityEndDate = useMemo(\n () => addDays(availabilityStartDate, Math.max(1, availabilityDays) - 1),\n [availabilityStartDate, availabilityDays],\n )\n\n const availability = useAvailability({\n serviceId: selectedService?.id || \"\",\n staffId: selectedStaff?.id,\n startDate: availabilityStartDate,\n endDate: availabilityEndDate,\n enabled: Boolean(selectedService),\n })\n\n const timeZone = availability.data?.timeZone || \"America/Chicago\"\n\n const safeTimeZone = useMemo(() => {\n if (!timeZone) return undefined\n try {\n new Intl.DateTimeFormat(\"en-US\", { timeZone }).format(new Date())\n return timeZone\n } catch {\n return undefined\n }\n }, [timeZone])\n\n const timeZoneLabel = useMemo(() => {\n if (timeZone) return timeZone\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone\n } catch {\n return \"Local time\"\n }\n }, [timeZone])\n\n const availabilityByDate = useMemo(() => {\n const map = new Map<string, AvailabilityDate>()\n ;(availability.data?.dates || []).forEach((entry) => { map.set(entry.date, entry) })\n return map\n }, [availability.data])\n\n // ---- Formatters (stable refs via useMemo) ----\n const dateLabelFormatter = useMemo(\n () => new Intl.DateTimeFormat(\"en-US\", { weekday: \"short\", month: \"short\", day: \"numeric\" }),\n [],\n )\n const dateHeadingFormatter = useMemo(\n () => new Intl.DateTimeFormat(\"en-US\", { weekday: \"long\", month: \"long\", day: \"numeric\" }),\n [],\n )\n const timeFormatter = useMemo(\n () => new Intl.DateTimeFormat(\"en-US\", { timeZone: safeTimeZone, hour: \"numeric\", minute: \"2-digit\" }),\n [safeTimeZone],\n )\n\n const parseDateTime = useCallback(\n (value?: string | null, fallbackDate?: string | null): Date | null => {\n if (!value) return null\n const direct = new Date(value)\n if (!Number.isNaN(direct.getTime())) return direct\n if (fallbackDate) {\n const normalized = fallbackDate.includes(\"T\") ? fallbackDate.split(\"T\")[0] : fallbackDate\n const combined = new Date(`${normalized}T${value}`)\n if (!Number.isNaN(combined.getTime())) return combined\n }\n return null\n },\n [],\n )\n\n const formatDateLabel = useCallback(\n (date: string): string => {\n const parsed = parseDateOnly(date)\n if (!parsed) return date\n try { return dateLabelFormatter.format(parsed) } catch { return date }\n },\n [dateLabelFormatter],\n )\n\n const formatDateHeading = useCallback(\n (date: string): string => {\n const parsed = parseDateOnly(date)\n if (!parsed) return date\n try { return dateHeadingFormatter.format(parsed) } catch { return date }\n },\n [dateHeadingFormatter],\n )\n\n const formatTimeLabel = useCallback(\n (iso: string): string => {\n const parsed = parseDateTime(iso, selectedDate)\n if (!parsed) return iso\n try { return timeFormatter.format(parsed) } catch {\n return parsed.toLocaleTimeString(\"en-US\", { hour: \"numeric\", minute: \"2-digit\" })\n }\n },\n [parseDateTime, selectedDate, timeFormatter],\n )\n\n const formatDuration = useCallback((minutes: number): string => {\n if (!Number.isFinite(minutes)) return \"\"\n if (minutes < 60) return `${minutes} min`\n const hours = Math.floor(minutes / 60)\n const remaining = minutes % 60\n return remaining === 0 ? `${hours} hr${hours > 1 ? \"s\" : \"\"}` : `${hours} hr ${remaining} min`\n }, [])\n\n // ---- Calendar ----\n const todayString = useMemo(() => new Date().toISOString().slice(0, 10), [])\n const todayDate = useMemo(() => { const now = new Date(); now.setHours(0, 0, 0, 0); return now }, [])\n const disabledWeekdaysSet = useMemo(() => new Set(disabledWeekdays), [disabledWeekdays])\n\n const getMonthStart = useCallback((date: Date) => new Date(date.getFullYear(), date.getMonth(), 1), [])\n const getMonthEnd = useCallback((date: Date) => new Date(date.getFullYear(), date.getMonth() + 1, 0), [])\n\n const getMonthDays = useCallback(\n (date: Date) => {\n const start = getMonthStart(date)\n const end = getMonthEnd(date)\n const days: Array<{ date: string; isCurrentMonth: boolean }> = []\n const startDay = start.getDay()\n for (let i = startDay; i > 0; i -= 1) {\n const d = new Date(start)\n d.setDate(start.getDate() - i)\n days.push({ date: d.toISOString().slice(0, 10), isCurrentMonth: false })\n }\n for (let day = 1; day <= end.getDate(); day += 1) {\n const d = new Date(date.getFullYear(), date.getMonth(), day)\n days.push({ date: d.toISOString().slice(0, 10), isCurrentMonth: true })\n }\n const remainder = 7 - (days.length % 7 || 7)\n for (let i = 1; i <= remainder; i += 1) {\n const d = new Date(end)\n d.setDate(end.getDate() + i)\n days.push({ date: d.toISOString().slice(0, 10), isCurrentMonth: false })\n }\n return days\n },\n [getMonthEnd, getMonthStart],\n )\n\n const maxAdvanceDate = useMemo(() => {\n if (!maxAdvanceMonths || maxAdvanceMonths <= 0) return null\n const maxMonth = new Date(todayDate.getFullYear(), todayDate.getMonth() + maxAdvanceMonths - 1, 1)\n return getMonthEnd(maxMonth)\n }, [getMonthEnd, maxAdvanceMonths, todayDate])\n\n const maxAdvanceMonthStart = useMemo(() => {\n if (!maxAdvanceMonths || maxAdvanceMonths <= 0) return null\n return new Date(todayDate.getFullYear(), todayDate.getMonth() + maxAdvanceMonths - 1, 1)\n }, [maxAdvanceMonths, todayDate])\n\n const monthOptionCount = useMemo(() => {\n if (!maxAdvanceMonths || maxAdvanceMonths <= 0) return 12\n return maxAdvanceMonths\n }, [maxAdvanceMonths])\n\n const monthOptions = useMemo(() => {\n return Array.from({ length: monthOptionCount }, (_, index) => {\n const date = new Date(todayDate.getFullYear(), todayDate.getMonth() + index, 1)\n return {\n value: `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, \"0\")}`,\n label: new Intl.DateTimeFormat(\"en-US\", { month: \"long\", year: \"numeric\" }).format(date),\n date,\n }\n })\n }, [monthOptionCount, todayDate])\n\n const calendarDays = useMemo(() => getMonthDays(calendarMonth), [getMonthDays, calendarMonth])\n\n const hasBlockedInCalendarView = useMemo(() => {\n return calendarDays.some((day) => {\n const entry = availabilityByDate.get(day.date)\n if (!entry) return false\n return !entry.slots.some((slot: AvailabilitySlot) => slot.available)\n })\n }, [calendarDays, availabilityByDate])\n\n // ---- Scroll ----\n const scrollToTop = useCallback(() => {\n if (!scrollToStepEnabled || !widgetRef?.current) return\n const top = widgetRef.current.getBoundingClientRect().top + window.scrollY\n window.scrollTo({ top: Math.max(0, top - scrollOffset), behavior: \"smooth\" })\n }, [scrollToStepEnabled, scrollOffset, widgetRef])\n\n // ---- Internal helpers ----\n const resetSelections = useCallback(() => {\n setSelectedStaff(null)\n setSelectedDate(null)\n setSelectedTime(null)\n setSelectedEndTime(null)\n setBookingError(null)\n }, [])\n\n // ---- Effects: auto-select first available date ----\n useEffect(() => {\n if (step !== \"time\") return\n if (!availability.data?.dates?.length) return\n const matches = selectedDate\n ? availability.data.dates.some((entry) => entry.date === selectedDate)\n : false\n if (matches) return\n setSelectedDate(availability.data.dates[0].date)\n }, [step, availability.data, selectedDate])\n\n // Reset availability window when service/staff changes\n useEffect(() => {\n if (!selectedService) return\n if (datePickerMode === \"calendar\") {\n const now = new Date()\n setCalendarMonth(new Date(now.getFullYear(), now.getMonth(), 1))\n return\n }\n setAvailabilityStartDate(new Date().toISOString().slice(0, 10))\n setAvailabilityDays(Math.max(1, availabilityDaysProp))\n }, [selectedService?.id, selectedStaff?.id, availabilityDaysProp, datePickerMode])\n\n // Sync availability window to calendar month\n useEffect(() => {\n if (datePickerMode !== \"calendar\") return\n const start = getMonthStart(calendarMonth)\n const end = getMonthEnd(calendarMonth)\n setAvailabilityStartDate(start.toISOString().slice(0, 10))\n setAvailabilityDays(end.getDate())\n }, [calendarMonth, datePickerMode, getMonthEnd, getMonthStart])\n\n // ---- Actions ----\n const selectService = useCallback(\n (service: Service) => {\n setSelectedService(service)\n resetSelections()\n if (autoAdvanceOnSelect) {\n if (requiresStaff) setStep(\"staff\")\n else setStep(\"time\")\n scrollToTop()\n }\n },\n [autoAdvanceOnSelect, requiresStaff, resetSelections, scrollToTop],\n )\n\n const selectStaff = useCallback(\n (staff: StaffMember | null) => {\n setSelectedStaff(staff)\n setSelectedDate(null)\n setSelectedTime(null)\n setSelectedEndTime(null)\n setBookingError(null)\n if (autoAdvanceOnSelect) {\n setStep(\"time\")\n scrollToTop()\n }\n },\n [autoAdvanceOnSelect, scrollToTop],\n )\n\n const selectDate = useCallback((date: string) => {\n setSelectedDate(date)\n setSelectedTime(null)\n setSelectedEndTime(null)\n setBookingError(null)\n }, [])\n\n const selectTime = useCallback(\n (time: string, endTime: string) => {\n setSelectedTime(time)\n setSelectedEndTime(endTime)\n setBookingError(null)\n if (autoAdvanceOnSelect) {\n setStep(\"details\")\n scrollToTop()\n }\n },\n [autoAdvanceOnSelect, scrollToTop],\n )\n\n const continueFromService = useCallback(() => {\n if (!selectedService) return\n if (requiresStaff) setStep(\"staff\")\n else setStep(\"time\")\n scrollToTop()\n }, [selectedService, requiresStaff, scrollToTop])\n\n const continueFromStaff = useCallback(() => {\n if (!canSkipStaff && !selectedStaff) return\n setStep(\"time\")\n scrollToTop()\n }, [canSkipStaff, selectedStaff, scrollToTop])\n\n const continueFromTime = useCallback(() => {\n if (!selectedTime || !selectedEndTime) return\n setStep(\"details\")\n scrollToTop()\n }, [selectedTime, selectedEndTime, scrollToTop])\n\n const goBack = useCallback(() => {\n if (step === \"service\") return\n if (step === \"staff\") setStep(\"service\")\n else if (step === \"time\") setStep(requiresStaff ? \"staff\" : \"service\")\n else if (step === \"details\") setStep(\"time\")\n else if (step === \"done\") setStep(\"details\")\n setBookingError(null)\n scrollToTop()\n }, [step, requiresStaff, scrollToTop])\n\n const goToServiceStep = useCallback(() => {\n setStep(\"service\")\n scrollToTop()\n }, [scrollToTop])\n\n const reset = useCallback(() => {\n setStep(\"service\")\n setSelectedService(null)\n resetSelections()\n setDetails({ name: \"\", email: \"\", phone: \"\", notes: \"\" })\n scrollToTop()\n }, [resetSelections, scrollToTop])\n\n const submitBooking = useCallback(\n async (event?: React.FormEvent) => {\n event?.preventDefault()\n if (!selectedService || !selectedDate || !selectedTime || !selectedEndTime) return\n\n const start = parseDateTime(selectedTime, selectedDate)\n const end = parseDateTime(selectedEndTime, selectedDate)\n\n if (!start || !end) {\n setBookingError(\"Please select a valid time slot.\")\n return\n }\n\n try {\n setBookingError(null)\n const result = await createBooking.mutateAsync({\n serviceId: selectedService.id,\n staffId: selectedStaff?.id,\n startTime: start.toISOString(),\n endTime: end.toISOString(),\n customerName: details.name,\n customerEmail: details.email,\n customerPhone: details.phone || undefined,\n customerNotes: details.notes || undefined,\n })\n\n setStep(\"done\")\n onSuccess?.(result?.booking)\n scrollToTop()\n } catch (error) {\n setBookingError(\n error instanceof Error ? error.message : \"Unable to complete booking. Please try again.\",\n )\n }\n },\n [selectedService, selectedDate, selectedTime, selectedEndTime, selectedStaff, details, createBooking, onSuccess, scrollToTop, parseDateTime],\n )\n\n // ---- Date paging ----\n const handlePrevDates = useCallback(() => {\n if (availabilityStartDate <= todayString) return\n setAvailabilityStartDate((prev) => addDays(prev, -availabilityDays))\n setSelectedDate(null)\n setSelectedTime(null)\n setSelectedEndTime(null)\n setBookingError(null)\n }, [availabilityStartDate, availabilityDays, todayString])\n\n const handleNextDates = useCallback(() => {\n if (maxAdvanceDate) {\n const nextStart = parseDateOnly(addDays(availabilityStartDate, availabilityDays))\n if (nextStart && nextStart > maxAdvanceDate) return\n }\n setAvailabilityStartDate((prev) => addDays(prev, availabilityDays))\n setSelectedDate(null)\n setSelectedTime(null)\n setSelectedEndTime(null)\n setBookingError(null)\n }, [availabilityStartDate, availabilityDays, maxAdvanceDate])\n\n // ---- Calendar navigation ----\n const handlePrevMonth = useCallback(() => {\n setCalendarMonth((prev) => new Date(prev.getFullYear(), prev.getMonth() - 1, 1))\n setSelectedDate(null)\n setSelectedTime(null)\n setSelectedEndTime(null)\n setBookingError(null)\n }, [])\n\n const handleNextMonth = useCallback(() => {\n if (maxAdvanceMonthStart) {\n const nextMonth = new Date(calendarMonth.getFullYear(), calendarMonth.getMonth() + 1, 1)\n if (nextMonth > maxAdvanceMonthStart) return\n }\n setCalendarMonth((prev) => new Date(prev.getFullYear(), prev.getMonth() + 1, 1))\n setSelectedDate(null)\n setSelectedTime(null)\n setSelectedEndTime(null)\n setBookingError(null)\n }, [calendarMonth, maxAdvanceMonthStart])\n\n const handleMonthSelect = useCallback((value: string) => {\n const [year, month] = value.split(\"-\").map(Number)\n if (!year || !month) return\n setCalendarMonth(new Date(year, month - 1, 1))\n setSelectedDate(null)\n setSelectedTime(null)\n setSelectedEndTime(null)\n setBookingError(null)\n }, [])\n\n const loadMoreServices = useCallback(() => setServicePage((p) => p + 1), [])\n const loadMoreStaff = useCallback(() => setStaffPage((p) => (hasMoreStaff ? p + 1 : 1)), [hasMoreStaff])\n\n // ---- Return ----\n return {\n step,\n stepNumber,\n totalSteps,\n\n selectedService,\n selectedStaff,\n selectedDate,\n selectedTime,\n selectedEndTime,\n details,\n\n servicesList,\n filteredServices,\n pagedServices,\n hasMoreServices,\n categories,\n staffOptions,\n pagedStaff,\n hasMoreStaff,\n availabilityDates: availability.data?.dates || [],\n availabilityByDate,\n timeZone,\n timeZoneLabel,\n\n calendarMonth,\n calendarDays,\n hasBlockedInCalendarView,\n maxAdvanceDate,\n maxAdvanceMonthStart,\n monthOptions,\n\n isServicesLoading: servicesProp ? false : servicesLoading,\n isAvailabilityLoading: availability.isLoading,\n isSubmitting: createBooking.isPending,\n bookingError,\n\n requiresStaff,\n canSkipStaff,\n\n serviceSearch,\n categoryFilter,\n servicePage,\n staffPage,\n\n availabilityStartDate,\n\n formatDateLabel,\n formatDateHeading,\n formatTimeLabel,\n formatDuration,\n\n setServiceSearch,\n setCategoryFilter,\n loadMoreServices,\n loadMoreStaff,\n selectService,\n selectStaff,\n selectDate,\n selectTime,\n setDetails,\n goToServiceStep,\n continueFromService,\n continueFromStaff,\n continueFromTime,\n submitBooking,\n goBack,\n reset,\n scrollToTop,\n\n handlePrevDates,\n handleNextDates,\n handlePrevMonth,\n handleNextMonth,\n handleMonthSelect,\n }\n}\n","'use client'\n\nimport type { Service } from '../types'\n\ninterface ServiceCardProps {\n service: Service\n className?: string\n showDescription?: boolean\n showPrice?: boolean\n showImage?: boolean\n onSelect?: (service: Service) => void\n}\n\nexport function ServiceCard({\n service,\n className,\n showDescription = true,\n showPrice = true,\n showImage = false,\n onSelect,\n}: ServiceCardProps) {\n const handleClick = () => {\n if (onSelect) onSelect(service)\n }\n\n return (\n <div\n className={['idk-card', onSelect ? 'idk-card--clickable' : '', className]\n .filter(Boolean)\n .join(' ')}\n onClick={onSelect ? handleClick : undefined}\n role={onSelect ? 'button' : undefined}\n tabIndex={onSelect ? 0 : undefined}\n >\n {showImage && service.image?.url ? (\n <div className=\"idk-card__media\">\n <img src={service.image.url} alt={service.name} />\n </div>\n ) : null}\n <div className=\"idk-card__header\">\n <h3 className=\"idk-card__title\">{service.name}</h3>\n {showPrice && typeof service.price === 'number' && service.price > 0 ? (\n <span className=\"idk-card__price\">${(service.price / 100).toFixed(2)}</span>\n ) : null}\n </div>\n {showDescription && service.description ? (\n <p className=\"idk-card__description\">{service.description}</p>\n ) : null}\n <div className=\"idk-card__meta\">\n <span>{service.duration} min</span>\n {service.category ? <span>{service.category}</span> : null}\n </div>\n </div>\n )\n}\n","'use client'\n\nimport { ServiceCard } from './ServiceCard'\nimport { useServices, type ServicesQueryParams } from '../core/hooks/useServices'\nimport type { Service } from '../types'\n\ninterface ServicesListProps {\n layout?: 'grid' | 'list'\n columns?: number\n className?: string\n showDescription?: boolean\n showPrice?: boolean\n showImage?: boolean\n query?: ServicesQueryParams\n filter?: (service: Service) => boolean\n sort?: (a: Service, b: Service) => number\n limit?: number\n emptyMessage?: string\n loadingMessage?: string\n onSelect?: (service: Service) => void\n}\n\nexport function ServicesList({\n layout = 'grid',\n columns = 3,\n className,\n showDescription,\n showPrice,\n showImage,\n query,\n filter,\n sort,\n limit,\n emptyMessage = 'No services available.',\n loadingMessage = 'Loading services...',\n onSelect,\n}: ServicesListProps) {\n const { data, isLoading, error } = useServices(query)\n\n if (isLoading) {\n return <div className=\"idk-state\">{loadingMessage}</div>\n }\n\n let services = data?.services ? [...data.services] : []\n\n if (filter) {\n services = services.filter(filter)\n }\n\n if (sort) {\n services = services.sort(sort)\n }\n\n if (typeof limit === 'number') {\n services = services.slice(0, Math.max(0, limit))\n }\n\n if (error || services.length === 0) {\n return <div className=\"idk-state\">{emptyMessage}</div>\n }\n\n const gridStyle = layout === 'grid'\n ? { gridTemplateColumns: `repeat(${Math.max(1, columns)}, minmax(0, 1fr))` }\n : undefined\n\n return (\n <div\n className={[\n 'idk-services',\n layout === 'grid' ? 'idk-services--grid' : 'idk-services--list',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={gridStyle}\n >\n {services.map((service) => (\n <ServiceCard\n key={service.id}\n service={service}\n showDescription={showDescription}\n showPrice={showPrice}\n showImage={showImage}\n onSelect={onSelect}\n />\n ))}\n </div>\n )\n}\n","import React from \"react\"\n\nconst LINK_REGEX =\n /((https?:\\/\\/|www\\.)[^\\s]+|[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,}|(?:[a-z0-9-]+\\.)+[a-z]{2,}(?:\\/[^\\s]*)?)/gi\n\nfunction buildHref(raw: string): string {\n if (raw.includes(\"@\") && !raw.startsWith(\"http\")) {\n return `mailto:${raw}`\n }\n if (raw.startsWith(\"http://\") || raw.startsWith(\"https://\")) {\n return raw\n }\n if (raw.startsWith(\"www.\")) {\n return `https://${raw}`\n }\n return `https://${raw}`\n}\n\nfunction trimTrailingPunctuation(value: string): { text: string; trailing: string } {\n let text = value\n let trailing = \"\"\n while (text && /[),.!?:;]+$/.test(text)) {\n trailing = text.slice(-1) + trailing\n text = text.slice(0, -1)\n }\n return { text, trailing }\n}\n\nexport function renderLinkedText(text?: string | null): React.ReactNode {\n if (!text) return null\n const matches = Array.from(text.matchAll(LINK_REGEX))\n if (matches.length === 0) return text\n\n const nodes: React.ReactNode[] = []\n let lastIndex = 0\n\n matches.forEach((match, index) => {\n const matchText = match[0]\n const start = match.index ?? 0\n\n if (start > lastIndex) {\n nodes.push(text.slice(lastIndex, start))\n }\n\n const { text: cleanText, trailing } = trimTrailingPunctuation(matchText)\n if (cleanText) {\n const href = buildHref(cleanText)\n nodes.push(\n <a key={`link-${start}-${index}`} href={href} target=\"_blank\" rel=\"noopener noreferrer\">\n {cleanText}\n </a>\n )\n }\n\n if (trailing) {\n nodes.push(trailing)\n }\n\n lastIndex = start + matchText.length\n })\n\n if (lastIndex < text.length) {\n nodes.push(text.slice(lastIndex))\n }\n\n return nodes\n}\n","'use client'\n\nimport type { StaffMember } from '../types'\nimport { renderLinkedText } from '../lib/linkify'\n\ninterface TeamMemberProps {\n member: StaffMember\n className?: string\n showRole?: boolean\n showEmail?: boolean\n showBio?: boolean\n layout?: \"card\" | \"profile\"\n imagePosition?: \"left\" | \"right\"\n}\n\nexport function TeamMember({\n member,\n className,\n showRole = true,\n showEmail = false,\n showBio = false,\n layout = \"card\",\n imagePosition = \"left\",\n}: TeamMemberProps) {\n const initials = member.name\n ?.split(' ')\n .map((part) => part[0])\n .slice(0, 2)\n .join('')\n .toUpperCase()\n\n const avatar = (\n <div className=\"idk-team__avatar\">\n {member.photo?.url ? (\n <img src={member.photo.url} alt={member.name} />\n ) : (\n <span>{initials}</span>\n )}\n </div>\n )\n\n if (layout === \"profile\") {\n return (\n <div className={[\"idk-team__profile\", className].filter(Boolean).join(\" \")}>\n {imagePosition === \"left\" ? avatar : null}\n <div className=\"idk-team__info\">\n <h3 className=\"idk-card__title\">{member.name}</h3>\n {showRole ? (\n <p className=\"idk-card__description\">{member.role || \"Staff\"}</p>\n ) : null}\n {showBio && member.bio ? (\n <p className=\"idk-team__bio\">{renderLinkedText(member.bio)}</p>\n ) : null}\n {showEmail ? (\n <p className=\"idk-card__meta\">{member.email}</p>\n ) : null}\n </div>\n {imagePosition === \"right\" ? avatar : null}\n </div>\n )\n }\n\n return (\n <div className={[\"idk-card\", className].filter(Boolean).join(\" \")}>\n <div className=\"idk-team__avatar\">\n {member.photo?.url ? (\n <img src={member.photo.url} alt={member.name} />\n ) : (\n <span>{initials}</span>\n )}\n </div>\n <div className=\"idk-team__info\">\n <h3 className=\"idk-card__title\">{member.name}</h3>\n {showRole ? (\n <p className=\"idk-card__description\">{member.role || \"Staff\"}</p>\n ) : null}\n {showBio && member.bio ? (\n <p className=\"idk-team__bio\">{renderLinkedText(member.bio)}</p>\n ) : null}\n {showEmail ? (\n <p className=\"idk-card__meta\">{member.email}</p>\n ) : null}\n </div>\n </div>\n )\n}\n","'use client'\n\nimport { useTeam, type TeamQueryParams } from '../core/hooks/useTeam'\nimport { TeamMember } from './TeamMember'\nimport type { StaffMember } from '../types'\n\ninterface TeamGridProps {\n columns?: number\n className?: string\n showRole?: boolean\n showEmail?: boolean\n showBio?: boolean\n layout?: \"card\" | \"profile\"\n imagePosition?: \"left\" | \"right\"\n query?: TeamQueryParams\n filter?: (member: StaffMember) => boolean\n sort?: (a: StaffMember, b: StaffMember) => number\n limit?: number\n emptyMessage?: string\n loadingMessage?: string\n}\n\nexport function TeamGrid({\n columns = 3,\n className,\n showRole,\n showEmail,\n showBio,\n layout = \"card\",\n imagePosition = \"left\",\n query,\n filter,\n sort,\n limit,\n emptyMessage = 'No team members available.',\n loadingMessage = 'Loading team...',\n}: TeamGridProps) {\n const { data, isLoading, error } = useTeam(query)\n\n if (isLoading) {\n return <div className=\"idk-state\">{loadingMessage}</div>\n }\n\n let members = data?.team ? [...data.team] : []\n\n if (filter) {\n members = members.filter(filter)\n }\n\n if (sort) {\n members = members.sort(sort)\n }\n\n if (typeof limit === 'number') {\n members = members.slice(0, Math.max(0, limit))\n }\n\n if (error || members.length === 0) {\n return <div className=\"idk-state\">{emptyMessage}</div>\n }\n\n const gridStyle = { gridTemplateColumns: `repeat(${Math.max(1, columns)}, minmax(0, 1fr))` }\n\n return (\n <div\n className={['idk-team', className].filter(Boolean).join(' ')}\n style={gridStyle}\n >\n {members.map((member) => (\n <TeamMember\n key={member.id}\n member={member}\n showRole={showRole}\n showEmail={showEmail}\n showBio={showBio}\n layout={layout}\n imagePosition={imagePosition}\n />\n ))}\n </div>\n )\n}\n","'use client'\n\nimport { useState } from 'react'\nimport { useMutation } from '@tanstack/react-query'\nimport { apiRequest } from '../core/api-client'\nimport { usePlatformConfig } from '../core/context'\nimport type { ContactSubmissionInput } from '../types'\n\ntype ContactField = 'name' | 'email' | 'phone' | 'subject' | 'message'\n\ninterface ContactFormProps {\n fields?: ContactField[]\n formType?: ContactSubmissionInput['formType']\n submitLabel?: string\n className?: string\n onSuccess?: () => void\n onError?: (message: string) => void\n}\n\nconst DEFAULT_FIELDS: ContactField[] = ['name', 'email', 'phone', 'message']\n\nexport function ContactForm({\n fields = DEFAULT_FIELDS,\n formType = 'contact',\n submitLabel = 'Send Message',\n className,\n onSuccess,\n onError,\n}: ContactFormProps) {\n const config = usePlatformConfig()\n const [formState, setFormState] = useState<Record<ContactField, string>>({\n name: '',\n email: '',\n phone: '',\n subject: '',\n message: '',\n })\n\n const mutation = useMutation({\n mutationFn: (payload: ContactSubmissionInput) =>\n apiRequest<{ submissionId: string | number }>(config, '/contact', {\n method: 'POST',\n body: JSON.stringify(payload),\n }),\n onSuccess: () => {\n setFormState({ name: '', email: '', phone: '', subject: '', message: '' })\n onSuccess?.()\n },\n onError: (error) => {\n const message = error instanceof Error ? error.message : 'Failed to submit form'\n onError?.(message)\n },\n })\n\n const handleChange = (field: ContactField, value: string) => {\n setFormState((prev) => ({ ...prev, [field]: value }))\n }\n\n const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault()\n\n mutation.mutate({\n name: formState.name,\n email: formState.email,\n phone: formState.phone || undefined,\n subject: formState.subject || undefined,\n message: formState.message,\n formType,\n })\n }\n\n return (\n <form className={['idk-form', className].filter(Boolean).join(' ')} onSubmit={handleSubmit}>\n {fields.includes('name') && (\n <label className=\"idk-form__field\">\n <span>Name</span>\n <input\n value={formState.name}\n onChange={(event) => handleChange('name', event.target.value)}\n required\n />\n </label>\n )}\n {fields.includes('email') && (\n <label className=\"idk-form__field\">\n <span>Email</span>\n <input\n type=\"email\"\n value={formState.email}\n onChange={(event) => handleChange('email', event.target.value)}\n required\n />\n </label>\n )}\n {fields.includes('phone') && (\n <label className=\"idk-form__field\">\n <span>Phone</span>\n <input\n value={formState.phone}\n onChange={(event) => handleChange('phone', event.target.value)}\n />\n </label>\n )}\n {fields.includes('subject') && (\n <label className=\"idk-form__field\">\n <span>Subject</span>\n <input\n value={formState.subject}\n onChange={(event) => handleChange('subject', event.target.value)}\n />\n </label>\n )}\n {fields.includes('message') && (\n <label className=\"idk-form__field\">\n <span>Message</span>\n <textarea\n value={formState.message}\n onChange={(event) => handleChange('message', event.target.value)}\n rows={5}\n required\n />\n </label>\n )}\n <button type=\"submit\" className=\"idk-button\" disabled={mutation.isPending}>\n {mutation.isPending ? 'Sending...' : submitLabel}\n </button>\n {mutation.isError ? (\n <p className=\"idk-form__error\">Something went wrong. Please try again.</p>\n ) : null}\n {mutation.isSuccess ? (\n <p className=\"idk-form__success\">Thanks! We&apos;ll be in touch soon.</p>\n ) : null}\n </form>\n )\n}\n","\"use client\"\n\nimport React, { useRef } from \"react\"\nimport { useBookingWidget, type UseBookingWidgetOptions } from \"../core/hooks/useBookingWidget\"\nimport { renderLinkedText } from \"../lib/linkify\"\nimport type { Service, StaffMember, AvailabilitySlot } from \"../types\"\nimport type { ServicesQueryParams } from \"../core/hooks/useServices\"\nimport type { TeamQueryParams } from \"../core/hooks/useTeam\"\n\ninterface BookingWidgetProps {\n className?: string\n showStaffSelection?: boolean\n onSuccess?: (booking: unknown) => void\n services?: Service[]\n servicesQuery?: ServicesQueryParams\n teamQuery?: TeamQueryParams\n serviceFilter?: (service: Service) => boolean\n teamFilter?: (member: StaffMember) => boolean\n title?: string\n subtitle?: string\n autoAdvanceOnSelect?: boolean\n scrollToStep?: boolean\n scrollOffset?: number\n enableServiceSearch?: boolean\n serviceSearchPlaceholder?: string\n enableCategoryFilter?: boolean\n categoryLabel?: string\n serviceListMaxHeight?: number | string\n serviceLayout?: \"list\" | \"grid\"\n serviceColumns?: number\n servicePageSize?: number\n showServicePagination?: boolean\n staffLayout?: \"list\" | \"grid\"\n staffColumns?: number\n showAnyStaffOption?: boolean\n staffPageSize?: number\n showStaffPagination?: boolean\n timeLayout?: \"stack\" | \"split\"\n availabilityDays?: number\n enableDatePaging?: boolean\n datePickerMode?: \"list\" | \"calendar\"\n calendarVariant?: \"default\" | \"compact\"\n maxAdvanceMonths?: number\n disabledWeekdays?: number[]\n showFullyBookedLabel?: boolean\n}\n\nconst parseDateOnly = (value?: string | null): Date | null => {\n if (!value) return null\n const normalized = value.includes(\"T\") ? value.split(\"T\")[0] : value\n const parsed = new Date(`${normalized}T00:00:00`)\n return Number.isNaN(parsed.getTime()) ? null : parsed\n}\n\nexport function BookingWidget({\n className,\n title = \"Book an Appointment\",\n subtitle,\n serviceSearchPlaceholder = \"Search services\",\n categoryLabel = \"All categories\",\n serviceListMaxHeight,\n serviceLayout = \"list\",\n serviceColumns = 2,\n showServicePagination,\n staffLayout = \"grid\",\n staffColumns = 2,\n showStaffPagination,\n timeLayout = \"split\",\n showFullyBookedLabel = true,\n calendarVariant = \"default\",\n enableServiceSearch = true,\n enableCategoryFilter = false,\n enableDatePaging = true,\n disabledWeekdays = [],\n ...hookProps\n}: BookingWidgetProps) {\n const widgetRef = useRef<HTMLDivElement | null>(null)\n\n const bw = useBookingWidget({\n ...hookProps,\n enableServiceSearch,\n enableCategoryFilter,\n enableDatePaging,\n calendarVariant,\n disabledWeekdays,\n showFullyBookedLabel,\n widgetRef,\n } satisfies UseBookingWidgetOptions)\n\n const todayDate = (() => { const now = new Date(); now.setHours(0, 0, 0, 0); return now })()\n const disabledWeekdaysSet = new Set(disabledWeekdays)\n const shouldPaginate = showServicePagination ?? bw.hasMoreServices\n const shouldPaginateStaff = showStaffPagination ?? bw.hasMoreStaff\n\n if (bw.isServicesLoading) {\n return <div className=\"idk-state\">Loading booking options...</div>\n }\n\n if (!bw.servicesList.length) {\n return <div className=\"idk-state\">No services available.</div>\n }\n\n return (\n <div ref={widgetRef} className={[\"idk-booking\", className].filter(Boolean).join(\" \")}>\n <div className=\"idk-booking__header\">\n <div className=\"idk-booking__title-wrap\">\n <h3 className=\"idk-booking__title\">{title}</h3>\n {subtitle ? <p className=\"idk-booking__subtitle\">{subtitle}</p> : null}\n </div>\n {bw.step !== \"service\" && bw.step !== \"done\" ? (\n <button type=\"button\" className=\"idk-link\" onClick={bw.goBack}>\n Back\n </button>\n ) : null}\n </div>\n\n {bw.step !== \"done\" ? (\n <div className=\"idk-booking__progress\">\n <span>Step {bw.stepNumber} of {bw.totalSteps}</span>\n <div className=\"idk-booking__bar\">\n <div\n className=\"idk-booking__bar-fill\"\n style={{ width: `${(bw.stepNumber / bw.totalSteps) * 100}%` }}\n />\n </div>\n </div>\n ) : null}\n\n {bw.step === \"service\" && (\n <div className=\"idk-booking__step\">\n <h4>Select a service</h4>\n {(enableServiceSearch || enableCategoryFilter) ? (\n <div className=\"idk-booking__filters\">\n {enableServiceSearch ? (\n <input\n type=\"search\"\n value={bw.serviceSearch}\n onChange={(event) => bw.setServiceSearch(event.target.value)}\n placeholder={serviceSearchPlaceholder}\n />\n ) : null}\n {enableCategoryFilter && bw.categories.length > 0 ? (\n <select\n value={bw.categoryFilter}\n onChange={(event) => bw.setCategoryFilter(event.target.value)}\n >\n <option value=\"all\">{categoryLabel}</option>\n {bw.categories.map((category) => (\n <option key={category} value={category}>{category}</option>\n ))}\n </select>\n ) : null}\n </div>\n ) : null}\n\n {bw.filteredServices.length === 0 ? (\n <div className=\"idk-state\">No services match your filters.</div>\n ) : (\n <div\n className={[\n \"idk-services\",\n serviceLayout === \"grid\" ? \"idk-services--grid\" : \"idk-services--list\",\n ].join(\" \")}\n style={{\n ...(serviceLayout === \"grid\"\n ? { gridTemplateColumns: `repeat(${Math.max(1, serviceColumns)}, minmax(0, 1fr))` }\n : undefined),\n ...(serviceListMaxHeight ? { maxHeight: serviceListMaxHeight, overflow: \"auto\" } : undefined),\n }}\n >\n {bw.pagedServices.map((service) => {\n const isSelected = bw.selectedService?.id === service.id\n return (\n <button\n key={service.id}\n type=\"button\"\n className={[\"idk-card\", \"idk-card--clickable\", isSelected ? \"is-active\" : \"\"].join(\" \")}\n onClick={() => bw.selectService(service)}\n >\n <div className=\"idk-card__header\">\n <span className=\"idk-card__title\">{service.name}</span>\n <span className=\"idk-card__aside\">\n {isSelected ? <span className=\"idk-card__check\">✓</span> : null}\n {typeof service.price === \"number\" && service.price > 0 ? (\n <span className=\"idk-card__price\">\n ${(service.price / 100).toFixed(2)}\n </span>\n ) : null}\n </span>\n </div>\n {service.description ? (\n <div className=\"idk-card__description\">{service.description}</div>\n ) : null}\n <div className=\"idk-card__meta\">\n <span>{bw.formatDuration(service.duration)}</span>\n {service.category ? <span className=\"idk-pill\">{service.category}</span> : null}\n </div>\n </button>\n )\n })}\n </div>\n )}\n\n <div className=\"idk-booking__actions\">\n {shouldPaginate ? (\n <button\n type=\"button\"\n className=\"idk-button idk-button--ghost\"\n onClick={bw.loadMoreServices}\n disabled={!bw.hasMoreServices}\n >\n {bw.hasMoreServices ? \"Show more services\" : \"All services shown\"}\n </button>\n ) : null}\n {bw.selectedService && !hookProps.autoAdvanceOnSelect ? (\n <button type=\"button\" className=\"idk-button\" onClick={bw.continueFromService}>\n Continue\n </button>\n ) : null}\n </div>\n </div>\n )}\n\n {bw.step === \"staff\" && (\n <div className=\"idk-booking__step\">\n <h4>Select a team member</h4>\n {bw.staffOptions.length === 0 ? (\n <div className=\"idk-state\">No team members available.</div>\n ) : (\n <div\n className={[\n \"idk-team\",\n staffLayout === \"grid\" ? \"idk-team--grid\" : \"idk-team--list\",\n ].join(\" \")}\n style={\n staffLayout === \"grid\"\n ? { gridTemplateColumns: `repeat(${Math.max(1, staffColumns)}, minmax(0, 1fr))` }\n : undefined\n }\n >\n {(hookProps.showAnyStaffOption ?? true) && bw.canSkipStaff ? (\n <button\n key=\"any-staff\"\n type=\"button\"\n className={[\"idk-card\", \"idk-card--clickable\", !bw.selectedStaff ? \"is-active\" : \"\"].join(\" \")}\n onClick={() => bw.selectStaff(null)}\n >\n <div className=\"idk-card__header\">\n <span className=\"idk-card__title\">Any Available</span>\n <span className=\"idk-card__badge\">Recommended</span>\n </div>\n <p className=\"idk-card__description\">\n We&apos;ll match you with the first available stylist.\n </p>\n </button>\n ) : null}\n {bw.pagedStaff.map((staff) => (\n <button\n key={staff.id}\n type=\"button\"\n className={[\"idk-card\", \"idk-card--clickable\", bw.selectedStaff?.id === staff.id ? \"is-active\" : \"\"].join(\" \")}\n onClick={() => bw.selectStaff(staff)}\n >\n <div className=\"idk-team__card\">\n <div className=\"idk-team__avatar\">\n {staff.photo?.url ? (\n <img src={staff.photo.url} alt={staff.name} />\n ) : (\n <span>{staff.name.split(\" \").map((part) => part[0]).slice(0, 2).join(\"\").toUpperCase()}</span>\n )}\n </div>\n <div>\n <span className=\"idk-card__title\">{staff.name}</span>\n <span className=\"idk-card__meta\">{staff.role || \"Staff\"}</span>\n {staff.bio ? <p className=\"idk-card__description\">{renderLinkedText(staff.bio)}</p> : null}\n </div>\n </div>\n </button>\n ))}\n </div>\n )}\n <div className=\"idk-booking__actions\">\n {shouldPaginateStaff ? (\n <button\n type=\"button\"\n className=\"idk-button idk-button--ghost\"\n onClick={bw.loadMoreStaff}\n disabled={!bw.hasMoreStaff && bw.staffPage === 1}\n >\n {bw.hasMoreStaff ? \"Show more staff\" : bw.staffPage > 1 ? \"Show fewer staff\" : \"All staff shown\"}\n </button>\n ) : null}\n {bw.canSkipStaff ? (\n <button\n type=\"button\"\n className=\"idk-link\"\n onClick={() => {\n bw.selectStaff(null)\n bw.continueFromStaff()\n }}\n >\n Continue without selecting\n </button>\n ) : null}\n {!hookProps.autoAdvanceOnSelect ? (\n <button\n type=\"button\"\n className=\"idk-button\"\n onClick={bw.continueFromStaff}\n disabled={!bw.canSkipStaff && !bw.selectedStaff}\n >\n Continue\n </button>\n ) : null}\n </div>\n </div>\n )}\n\n {bw.step === \"time\" && (\n <div className=\"idk-booking__step\">\n <h4>Select a time</h4>\n {bw.isAvailabilityLoading ? (\n <div className=\"idk-state\">Loading availability...</div>\n ) : bw.availabilityDates.length > 0 ? (\n <div className={[\"idk-availability\", timeLayout === \"split\" ? \"idk-availability--split\" : \"\"].join(\" \")}>\n <div className=\"idk-availability__dates\">\n {(hookProps.datePickerMode ?? \"list\") === \"calendar\" ? (\n <div\n className={[\n \"idk-calendar\",\n calendarVariant === \"compact\" ? \"idk-calendar--compact\" : \"\",\n ].filter(Boolean).join(\" \")}\n >\n <div className=\"idk-calendar__header\">\n {calendarVariant === \"compact\" ? (\n <div className=\"idk-calendar__header idk-calendar__header--compact\">\n <button\n type=\"button\"\n className=\"idk-calendar__nav-btn\"\n onClick={bw.handlePrevMonth}\n disabled={bw.calendarMonth <= new Date(todayDate.getFullYear(), todayDate.getMonth(), 1)}\n aria-label=\"Previous month\"\n >\n {\"<\"}\n </button>\n <select\n className=\"idk-calendar__month-select\"\n value={`${bw.calendarMonth.getFullYear()}-${String(bw.calendarMonth.getMonth() + 1).padStart(2, \"0\")}`}\n onChange={(event) => bw.handleMonthSelect(event.target.value)}\n >\n {bw.monthOptions.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n <button\n type=\"button\"\n className=\"idk-calendar__nav-btn\"\n onClick={bw.handleNextMonth}\n disabled={Boolean(bw.maxAdvanceMonthStart && bw.calendarMonth >= bw.maxAdvanceMonthStart)}\n aria-label=\"Next month\"\n >\n {\">\"}\n </button>\n </div>\n ) : (\n <>\n <button\n type=\"button\"\n className=\"idk-button idk-button--ghost\"\n onClick={bw.handlePrevMonth}\n disabled={bw.calendarMonth <= new Date(todayDate.getFullYear(), todayDate.getMonth(), 1)}\n >\n Prev\n </button>\n <div className=\"idk-calendar__title\">\n {new Intl.DateTimeFormat(\"en-US\", { month: \"long\", year: \"numeric\" }).format(bw.calendarMonth)}\n </div>\n <button\n type=\"button\"\n className=\"idk-button idk-button--ghost\"\n onClick={bw.handleNextMonth}\n disabled={Boolean(bw.maxAdvanceMonthStart && bw.calendarMonth >= bw.maxAdvanceMonthStart)}\n >\n Next\n </button>\n </>\n )}\n </div>\n <div className=\"idk-calendar__weekdays\">\n {[\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"].map((label) => (\n <span key={label}>{label}</span>\n ))}\n </div>\n <div className=\"idk-calendar__grid\">\n {bw.calendarDays.map((day) => {\n const entry = bw.availabilityByDate.get(day.date)\n const hasAvailable = entry?.slots?.some((slot: AvailabilitySlot) => slot.available) ?? false\n const dateValue = parseDateOnly(day.date)\n const isPast = dateValue ? dateValue < todayDate : false\n const isBeyondMax = bw.maxAdvanceDate ? (dateValue ? dateValue > bw.maxAdvanceDate : false) : false\n const weekday = dateValue ? dateValue.getDay() : null\n const isDisabledWeekday = weekday !== null ? disabledWeekdaysSet.has(weekday) : false\n const isBlocked = Boolean(entry) && !hasAvailable\n const isDisabled = !entry || isPast || isBeyondMax || isBlocked || isDisabledWeekday\n const isActive = bw.selectedDate === day.date\n return (\n <button\n key={day.date}\n type=\"button\"\n className={[\n \"idk-calendar__day\",\n day.isCurrentMonth ? \"\" : \"is-muted\",\n hasAvailable ? \"is-available\" : \"\",\n isBlocked ? \"is-blocked\" : \"\",\n isDisabledWeekday ? \"is-disabled\" : \"\",\n isActive ? \"is-active\" : \"\",\n ].filter(Boolean).join(\" \")}\n disabled={isDisabled}\n onClick={() => bw.selectDate(day.date)}\n >\n <span>{day.date.split(\"-\")[2]}</span>\n {showFullyBookedLabel && isBlocked && day.isCurrentMonth ? (\n <span className=\"idk-calendar__label\">\n {calendarVariant === \"compact\" ? \"•\" : \"Fully booked\"}\n </span>\n ) : null}\n </button>\n )\n })}\n </div>\n {showFullyBookedLabel && calendarVariant === \"compact\" && bw.hasBlockedInCalendarView ? (\n <div className=\"idk-calendar__legend\">\n <span className=\"idk-calendar__legend-dot\">•</span> Fully booked\n </div>\n ) : null}\n </div>\n ) : (\n <>\n {enableDatePaging ? (\n <div className=\"idk-availability__nav\">\n <button\n type=\"button\"\n className=\"idk-button idk-button--ghost\"\n onClick={bw.handlePrevDates}\n disabled={bw.availabilityStartDate <= new Date().toISOString().slice(0, 10)}\n >\n Previous\n </button>\n <button\n type=\"button\"\n className=\"idk-button idk-button--ghost\"\n onClick={bw.handleNextDates}\n >\n Next\n </button>\n </div>\n ) : null}\n {bw.availabilityDates.map((entry) => (\n <button\n key={entry.date}\n type=\"button\"\n className={entry.date === bw.selectedDate ? \"is-active\" : undefined}\n onClick={() => bw.selectDate(entry.date)}\n >\n <span className=\"idk-date-chip__day\">{bw.formatDateLabel(entry.date)}</span>\n </button>\n ))}\n </>\n )}\n </div>\n <div className=\"idk-availability__panel\">\n <div className=\"idk-availability__panel-header\">\n <div>\n <div className=\"idk-availability__panel-title\">\n {bw.selectedDate\n ? bw.formatDateHeading(bw.selectedDate)\n : bw.availabilityDates[0]?.date\n ? bw.formatDateHeading(bw.availabilityDates[0].date)\n : \"Select a date\"}\n </div>\n <div className=\"idk-availability__panel-subtitle\">{bw.timeZoneLabel}</div>\n </div>\n </div>\n <div className=\"idk-availability__slots\">\n {(() => {\n const activeEntry = bw.selectedDate\n ? bw.availabilityDates.find((entry) => entry.date === bw.selectedDate)\n : bw.availabilityDates[0]\n if (!activeEntry) return <div className=\"idk-state\">Select a date to see times.</div>\n const availableSlots = (activeEntry.slots || [])\n .filter((slot: AvailabilitySlot) => slot.available)\n .sort((a, b) => {\n const aTime = new Date(a.time).getTime() || Number.POSITIVE_INFINITY\n const bTime = new Date(b.time).getTime() || Number.POSITIVE_INFINITY\n if (aTime === bTime) {\n const aEnd = new Date(a.endTime).getTime() || Number.POSITIVE_INFINITY\n const bEnd = new Date(b.endTime).getTime() || Number.POSITIVE_INFINITY\n return aEnd - bEnd\n }\n return aTime - bTime\n })\n\n const slots = availableSlots.filter(\n (slot, index) =>\n index === 0 ||\n slot.time !== availableSlots[index - 1].time ||\n slot.endTime !== availableSlots[index - 1].endTime,\n )\n\n if (slots.length === 0) {\n return <div className=\"idk-state\">No available times for this date.</div>\n }\n return slots.map((slot, index) => (\n <button\n key={`${activeEntry.date}-${slot.time}-${slot.endTime}-${index}`}\n type=\"button\"\n className={\n slot.time === bw.selectedTime && slot.endTime === bw.selectedEndTime\n ? \"is-active\"\n : undefined\n }\n onClick={() => {\n const date = bw.selectedDate || activeEntry.date\n if (!bw.selectedDate) bw.selectDate(date)\n bw.selectTime(slot.time, slot.endTime)\n }}\n >\n {bw.formatTimeLabel(slot.time)}\n </button>\n ))\n })()}\n </div>\n </div>\n </div>\n ) : (\n <div className=\"idk-state\">No availability found.</div>\n )}\n {!hookProps.autoAdvanceOnSelect ? (\n <div className=\"idk-booking__actions\">\n <button\n type=\"button\"\n className=\"idk-button\"\n onClick={bw.continueFromTime}\n disabled={!bw.selectedTime || !bw.selectedEndTime}\n >\n Continue\n </button>\n </div>\n ) : null}\n </div>\n )}\n\n {bw.step === \"details\" && (\n <form className=\"idk-form\" onSubmit={bw.submitBooking}>\n <h4>Your details</h4>\n {bw.bookingError ? <div className=\"idk-booking__error\">{bw.bookingError}</div> : null}\n {bw.selectedService && bw.selectedTime ? (\n <div className=\"idk-booking__summary\">\n <div>\n <span className=\"idk-booking__summary-label\">Service</span>\n <p>{bw.selectedService.name}</p>\n </div>\n {bw.selectedStaff ? (\n <div>\n <span className=\"idk-booking__summary-label\">Staff</span>\n <p>{bw.selectedStaff.name}</p>\n </div>\n ) : null}\n <div>\n <span className=\"idk-booking__summary-label\">When</span>\n <p>{bw.formatDateHeading(bw.selectedDate || \"\")} · {bw.formatTimeLabel(bw.selectedTime)}</p>\n </div>\n {bw.selectedService.price ? (\n <div>\n <span className=\"idk-booking__summary-label\">Price</span>\n <p>${(bw.selectedService.price / 100).toFixed(2)}</p>\n </div>\n ) : null}\n </div>\n ) : null}\n <label className=\"idk-form__field\">\n <span>Name</span>\n <input\n value={bw.details.name}\n onChange={(event) => bw.setDetails((prev) => ({ ...prev, name: event.target.value }))}\n required\n />\n </label>\n <label className=\"idk-form__field\">\n <span>Email</span>\n <input\n type=\"email\"\n value={bw.details.email}\n onChange={(event) => bw.setDetails((prev) => ({ ...prev, email: event.target.value }))}\n required\n />\n </label>\n <label className=\"idk-form__field\">\n <span>Phone</span>\n <input\n value={bw.details.phone}\n onChange={(event) => bw.setDetails((prev) => ({ ...prev, phone: event.target.value }))}\n />\n </label>\n <label className=\"idk-form__field\">\n <span>Notes</span>\n <textarea\n rows={4}\n value={bw.details.notes}\n onChange={(event) => bw.setDetails((prev) => ({ ...prev, notes: event.target.value }))}\n />\n </label>\n <button type=\"submit\" className=\"idk-button\" disabled={bw.isSubmitting}>\n {bw.isSubmitting ? \"Booking...\" : \"Confirm booking\"}\n </button>\n </form>\n )}\n\n {bw.step === \"done\" && (\n <div className=\"idk-booking__done\">\n <div className=\"idk-booking__done-title\">Booking confirmed!</div>\n <p className=\"idk-booking__done-text\">\n We&apos;ll send a confirmation email shortly with your appointment details.\n </p>\n <button type=\"button\" className=\"idk-link\" onClick={bw.reset}>\n Book another appointment\n </button>\n </div>\n )}\n </div>\n )\n}\n","'use client'\n\nimport { useState } from 'react'\nimport { useAvailability } from '../core/hooks/useAvailability'\n\ninterface AvailabilityPickerProps {\n serviceId: string\n staffId?: string\n date?: string\n days?: number\n className?: string\n onSelect?: (params: { date: string; time: string; endTime: string }) => void\n}\n\nexport function AvailabilityPicker({\n serviceId,\n staffId,\n date,\n days = 7,\n className,\n onSelect,\n}: AvailabilityPickerProps) {\n const [selectedDate, setSelectedDate] = useState<string | null>(date || null)\n const [selectedTime, setSelectedTime] = useState<string | null>(null)\n\n const { data, isLoading } = useAvailability({\n serviceId,\n staffId,\n date,\n days,\n })\n\n if (isLoading) {\n return <div className=\"idk-state\">Loading availability...</div>\n }\n\n if (!data?.dates?.length) {\n return <div className=\"idk-state\">No availability found.</div>\n }\n\n const activeDate = selectedDate || data.dates[0]?.date\n const activeSlots = data.dates.find((entry) => entry.date === activeDate)?.slots || []\n\n return (\n <div className={['idk-availability', className].filter(Boolean).join(' ')}>\n <div className=\"idk-availability__dates\">\n {data.dates.map((entry) => (\n <button\n key={entry.date}\n type=\"button\"\n className={entry.date === activeDate ? 'is-active' : undefined}\n onClick={() => {\n setSelectedDate(entry.date)\n setSelectedTime(null)\n }}\n >\n {entry.date}\n </button>\n ))}\n </div>\n <div className=\"idk-availability__slots\">\n {activeSlots.filter((slot) => slot.available).length === 0 ? (\n <div className=\"idk-state\">No slots available.</div>\n ) : (\n activeSlots\n .filter((slot) => slot.available)\n .map((slot) => (\n <button\n key={`${activeDate}-${slot.time}`}\n type=\"button\"\n className={selectedTime === slot.time ? 'is-active' : undefined}\n onClick={() => {\n setSelectedTime(slot.time)\n if (onSelect && activeDate) {\n onSelect({\n date: activeDate,\n time: slot.time,\n endTime: slot.endTime,\n })\n }\n }}\n >\n {slot.time}\n </button>\n ))\n )}\n </div>\n </div>\n )\n}\n","\"use client\"\n\nimport type { Service } from \"../types\"\n\ninterface ServicePickerProps {\n services: Service[]\n selectedId?: string | null\n onSelect?: (service: Service) => void\n className?: string\n}\n\nexport function ServicePicker({\n services,\n selectedId,\n onSelect,\n className,\n}: ServicePickerProps) {\n return (\n <div className={[\"idk-picker\", className].filter(Boolean).join(\" \")}>\n {services.map((service) => (\n <button\n key={service.id}\n type=\"button\"\n className={selectedId === service.id ? \"is-active\" : undefined}\n onClick={() => onSelect?.(service)}\n >\n <span>{service.name}</span>\n <small>{service.duration} min</small>\n </button>\n ))}\n </div>\n )\n}\n","\"use client\"\n\nimport type { StaffMember } from \"../types\"\n\ninterface StaffPickerProps {\n staff: StaffMember[]\n selectedId?: string | null\n onSelect?: (member: StaffMember) => void\n className?: string\n}\n\nexport function StaffPicker({\n staff,\n selectedId,\n onSelect,\n className,\n}: StaffPickerProps) {\n return (\n <div className={[\"idk-picker\", className].filter(Boolean).join(\" \")}>\n {staff.map((member) => (\n <button\n key={member.id}\n type=\"button\"\n className={selectedId === member.id ? \"is-active\" : undefined}\n onClick={() => onSelect?.(member)}\n >\n <span>{member.name}</span>\n <small>{member.role || \"Staff\"}</small>\n </button>\n ))}\n </div>\n )\n}\n","\"use client\"\n\ninterface DatePickerProps {\n dates: string[]\n selectedDate?: string | null\n onSelect?: (date: string) => void\n className?: string\n}\n\nexport function DatePicker({\n dates,\n selectedDate,\n onSelect,\n className,\n}: DatePickerProps) {\n return (\n <div className={[\"idk-picker\", className].filter(Boolean).join(\" \")}>\n {dates.map((date) => (\n <button\n key={date}\n type=\"button\"\n className={selectedDate === date ? \"is-active\" : undefined}\n onClick={() => onSelect?.(date)}\n >\n {date}\n </button>\n ))}\n </div>\n )\n}\n","\"use client\"\n\nimport type { AvailabilitySlot } from \"../types\"\n\ninterface TimePickerProps {\n slots: AvailabilitySlot[]\n selectedTime?: string | null\n onSelect?: (slot: AvailabilitySlot) => void\n className?: string\n}\n\nexport function TimePicker({\n slots,\n selectedTime,\n onSelect,\n className,\n}: TimePickerProps) {\n return (\n <div className={[\"idk-picker\", className].filter(Boolean).join(\" \")}>\n {slots.map((slot) => (\n <button\n key={`${slot.time}-${slot.endTime}`}\n type=\"button\"\n className={selectedTime === slot.time ? \"is-active\" : undefined}\n disabled={!slot.available}\n onClick={() => onSelect?.(slot)}\n >\n {slot.time}\n </button>\n ))}\n </div>\n )\n}\n"],"mappings":"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","names":["import_react","import_react_query","import_react","import_react_query","import_react","import_react_query","buildQuery","import_react","import_react_query","buildQuery","import_react_query","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_react_query","import_jsx_runtime","import_react","import_jsx_runtime","parseDateOnly","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/core/PlatformProvider.tsx","../src/core/context.ts","../src/core/hooks/useTenant.ts","../src/core/api-client.ts","../src/core/hooks/useServices.ts","../src/core/hooks/useTeam.ts","../src/core/hooks/useAvailability.ts","../src/core/hooks/useBooking.ts","../src/core/hooks/useBookingWidget.ts","../src/components/ServiceCard.tsx","../src/components/ServicesList.tsx","../src/lib/linkify.tsx","../src/components/TeamMember.tsx","../src/components/TeamGrid.tsx","../src/components/ContactForm.tsx","../src/components/BookingWidget.tsx","../src/components/BookingWidgetPanel.tsx","../src/components/AvailabilityPicker.tsx","../src/components/ServicePicker.tsx","../src/components/StaffPicker.tsx","../src/components/DatePicker.tsx","../src/components/TimePicker.tsx"],"sourcesContent":["'use client'\n\n// This package is client-first. Re-exported entrypoints must be marked\n// as client components so Next can import them from app/server files.\n\nexport { PlatformProvider } from './core/PlatformProvider'\nexport { useTenant } from './core/hooks/useTenant'\nexport { useServices } from './core/hooks/useServices'\nexport { useTeam } from './core/hooks/useTeam'\nexport { useAvailability } from './core/hooks/useAvailability'\nexport { useCreateBooking, useCancelBooking, useBookingLookup } from './core/hooks/useBooking'\nexport { useBookingWidget } from './core/hooks/useBookingWidget'\n\nexport { ServicesList } from './components/ServicesList'\nexport { ServiceCard } from './components/ServiceCard'\nexport { TeamGrid } from './components/TeamGrid'\nexport { TeamMember } from './components/TeamMember'\nexport { ContactForm } from './components/ContactForm'\nexport { BookingWidget } from './components/BookingWidget'\nexport { BookingWidgetPanel } from './components/BookingWidgetPanel'\nexport type { BookingWidgetProps } from './components/BookingWidgetPanel'\nexport { AvailabilityPicker } from './components/AvailabilityPicker'\n\nexport { ServicePicker } from './components/ServicePicker'\nexport { StaffPicker } from './components/StaffPicker'\nexport { DatePicker } from './components/DatePicker'\nexport { TimePicker } from './components/TimePicker'\n\nexport type {\n TenantInfo,\n Service,\n StaffMember,\n AvailabilityResult,\n BookingCreateInput,\n BookingCancelInput,\n BookingLookup,\n ContactSubmissionInput,\n} from './types'\n\nexport type { ServicesQueryParams } from './core/hooks/useServices'\nexport type { TeamQueryParams } from './core/hooks/useTeam'\nexport type { UseBookingWidgetOptions, UseBookingWidgetReturn } from './core/hooks/useBookingWidget'\n","/**\n * PlatformProvider\n * Provides API configuration + React Query client for all components.\n */\n'use client'\n\nimport { useState, type ReactNode } from 'react'\nimport {\n QueryClient,\n QueryClientProvider,\n HydrationBoundary,\n type DehydratedState,\n type DefaultOptions,\n} from '@tanstack/react-query'\nimport { PlatformContext } from './context'\n\ninterface PlatformProviderProps {\n apiKey: string\n apiUrl?: string\n children: ReactNode\n dehydratedState?: DehydratedState\n queryOptions?: DefaultOptions\n queryClient?: QueryClient\n}\n\nconst DEFAULT_API_URL =\n process.env.NEXT_PUBLIC_IDK_API_URL ||\n process.env.NEXT_PUBLIC_PLATFORM_API_URL ||\n 'https://app.idkwebsites.com/api/v1'\n\nexport function PlatformProvider({\n apiKey,\n apiUrl = DEFAULT_API_URL,\n children,\n dehydratedState,\n queryOptions,\n queryClient,\n}: PlatformProviderProps) {\n const [client] = useState(\n () =>\n queryClient ||\n new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 30_000,\n retry: 1,\n ...queryOptions?.queries,\n },\n mutations: {\n ...queryOptions?.mutations,\n },\n },\n })\n )\n\n return (\n <PlatformContext.Provider value={{ apiKey, apiUrl }}>\n <QueryClientProvider client={client}>\n <HydrationBoundary state={dehydratedState}>{children}</HydrationBoundary>\n </QueryClientProvider>\n </PlatformContext.Provider>\n )\n}\n","import { createContext, useContext } from 'react'\n\nexport interface PlatformConfig {\n apiKey: string\n apiUrl: string\n}\n\nconst PlatformContext = createContext<PlatformConfig | null>(null)\n\nexport function usePlatformConfig(): PlatformConfig {\n const context = useContext(PlatformContext)\n if (!context) {\n throw new Error('PlatformProvider is missing in the component tree.')\n }\n return context\n}\n\nexport { PlatformContext }\n","import { useQuery } from '@tanstack/react-query'\nimport { apiRequest } from '../api-client'\nimport { usePlatformConfig } from '../context'\nimport type { TenantInfo } from '../../types'\n\nexport function useTenant() {\n const config = usePlatformConfig()\n\n return useQuery({\n queryKey: ['idk', 'tenant'],\n queryFn: () => apiRequest<TenantInfo>(config, '/tenant'),\n })\n}\n","export class ApiError extends Error {\n status: number\n code: string\n\n constructor(message: string, status: number, code: string) {\n super(message)\n this.name = 'ApiError'\n this.status = status\n this.code = code\n }\n}\n\nexport interface ApiClientConfig {\n apiKey: string\n apiUrl: string\n}\n\nfunction normalizeBaseUrl(apiUrl: string): string {\n return apiUrl.replace(/\\/+$/, '')\n}\n\nexport async function apiRequest<T>(\n config: ApiClientConfig,\n path: string,\n options: RequestInit = {}\n): Promise<T> {\n const url = `${normalizeBaseUrl(config.apiUrl)}${path.startsWith('/') ? path : `/${path}`}`\n\n const headers = new Headers(options.headers)\n headers.set('X-API-Key', config.apiKey)\n if (!headers.has('Content-Type') && options.body) {\n headers.set('Content-Type', 'application/json')\n }\n\n const response = await fetch(url, {\n ...options,\n headers,\n })\n\n const payload = await response.json().catch(() => null)\n\n if (!response.ok) {\n const errorCode = payload?.error?.code || 'REQUEST_FAILED'\n const errorMessage = payload?.error?.message || response.statusText\n throw new ApiError(errorMessage, response.status, errorCode)\n }\n\n if (payload?.error) {\n throw new ApiError(payload.error.message || 'Request failed', payload.error.status || 400, payload.error.code || 'REQUEST_FAILED')\n }\n\n return payload?.data as T\n}\n","import { useMemo } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport { apiRequest } from '../api-client'\nimport { usePlatformConfig } from '../context'\nimport type { Service } from '../../types'\n\ninterface ServicesResponse {\n services: Service[]\n total: number\n}\n\nexport interface ServicesQueryParams {\n category?: string | string[]\n staffId?: string\n isActive?: boolean\n minPrice?: number\n maxPrice?: number\n search?: string\n ids?: string[]\n limit?: number\n sort?: 'name' | 'price' | 'duration' | 'sortOrder'\n order?: 'asc' | 'desc'\n enabled?: boolean\n}\n\nfunction buildQuery(params?: ServicesQueryParams): string {\n if (!params) return ''\n const searchParams = new URLSearchParams()\n const categories = Array.isArray(params.category)\n ? params.category\n : params.category\n ? [params.category]\n : []\n\n if (categories.length) searchParams.set('category', categories.join(','))\n if (params.staffId) searchParams.set('staffId', params.staffId)\n if (typeof params.isActive === 'boolean') searchParams.set('isActive', String(params.isActive))\n if (typeof params.minPrice === 'number') searchParams.set('minPrice', String(params.minPrice))\n if (typeof params.maxPrice === 'number') searchParams.set('maxPrice', String(params.maxPrice))\n if (params.search) searchParams.set('search', params.search)\n if (params.ids?.length) searchParams.set('ids', params.ids.join(','))\n if (typeof params.limit === 'number') searchParams.set('limit', String(params.limit))\n if (params.sort) searchParams.set('sort', params.sort)\n if (params.order) searchParams.set('order', params.order)\n\n return searchParams.toString()\n}\n\nexport function useServices(params?: ServicesQueryParams) {\n const config = usePlatformConfig()\n const queryString = useMemo(() => buildQuery(params), [\n params?.category,\n params?.staffId,\n params?.isActive,\n params?.minPrice,\n params?.maxPrice,\n params?.search,\n params?.ids,\n params?.limit,\n params?.sort,\n params?.order,\n ])\n\n const enabled = params?.enabled ?? true\n\n return useQuery({\n queryKey: ['idk', 'services', queryString],\n queryFn: () =>\n apiRequest<ServicesResponse>(\n config,\n queryString ? `/services?${queryString}` : '/services'\n ),\n enabled,\n })\n}\n","import { useMemo } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport { apiRequest } from '../api-client'\nimport { usePlatformConfig } from '../context'\nimport type { StaffMember } from '../../types'\n\ninterface TeamResponse {\n team: StaffMember[]\n total: number\n}\n\nexport interface TeamQueryParams {\n role?: string | string[]\n isActive?: boolean\n acceptsNewBookings?: boolean\n search?: string\n ids?: string[]\n serviceId?: string\n limit?: number\n sort?: 'name' | 'role' | 'createdAt'\n order?: 'asc' | 'desc'\n enabled?: boolean\n}\n\nfunction buildQuery(params?: TeamQueryParams): string {\n if (!params) return ''\n const searchParams = new URLSearchParams()\n const roles = Array.isArray(params.role)\n ? params.role\n : params.role\n ? [params.role]\n : []\n\n if (roles.length) searchParams.set('role', roles.join(','))\n if (typeof params.isActive === 'boolean') searchParams.set('isActive', String(params.isActive))\n if (typeof params.acceptsNewBookings === 'boolean') {\n searchParams.set('acceptsNewBookings', String(params.acceptsNewBookings))\n }\n if (params.search) searchParams.set('search', params.search)\n if (params.ids?.length) searchParams.set('ids', params.ids.join(','))\n if (params.serviceId) searchParams.set('serviceId', params.serviceId)\n if (typeof params.limit === 'number') searchParams.set('limit', String(params.limit))\n if (params.sort) searchParams.set('sort', params.sort)\n if (params.order) searchParams.set('order', params.order)\n\n return searchParams.toString()\n}\n\nexport function useTeam(params?: TeamQueryParams) {\n const config = usePlatformConfig()\n const queryString = useMemo(() => buildQuery(params), [\n params?.role,\n params?.isActive,\n params?.acceptsNewBookings,\n params?.search,\n params?.ids,\n params?.serviceId,\n params?.limit,\n params?.sort,\n params?.order,\n ])\n\n const enabled = params?.enabled ?? true\n\n return useQuery({\n queryKey: ['idk', 'team', queryString],\n queryFn: () =>\n apiRequest<TeamResponse>(\n config,\n queryString ? `/team?${queryString}` : '/team'\n ),\n enabled,\n })\n}\n","import { useMemo } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport { apiRequest } from '../api-client'\nimport { usePlatformConfig } from '../context'\nimport type { AvailabilityResult } from '../../types'\n\nexport interface AvailabilityParams {\n serviceId: string\n staffId?: string\n date?: string\n days?: number\n startDate?: string\n endDate?: string\n enabled?: boolean\n}\n\nfunction buildQuery(params: AvailabilityParams): string {\n const searchParams = new URLSearchParams()\n searchParams.set('serviceId', params.serviceId)\n if (params.staffId) searchParams.set('staffId', params.staffId)\n if (params.startDate) searchParams.set('startDate', params.startDate)\n if (params.endDate) searchParams.set('endDate', params.endDate)\n if (params.date) searchParams.set('date', params.date)\n if (params.days) searchParams.set('days', String(params.days))\n return searchParams.toString()\n}\n\nexport function useAvailability(params: AvailabilityParams) {\n const config = usePlatformConfig()\n const queryString = useMemo(\n () => buildQuery(params),\n [params.serviceId, params.staffId, params.startDate, params.endDate, params.date, params.days]\n )\n const enabled = params.enabled ?? Boolean(params.serviceId)\n\n return useQuery({\n queryKey: ['idk', 'availability', queryString],\n queryFn: () => apiRequest<AvailabilityResult>(config, `/availability?${queryString}`),\n enabled,\n })\n}\n","import { useMutation, useQuery } from '@tanstack/react-query'\nimport { apiRequest } from '../api-client'\nimport { usePlatformConfig } from '../context'\nimport type { BookingCreateInput, BookingCancelInput, BookingLookup } from '../../types'\n\nexport function useCreateBooking() {\n const config = usePlatformConfig()\n\n return useMutation({\n mutationFn: (input: BookingCreateInput) =>\n apiRequest<{ booking: unknown }>(config, '/bookings', {\n method: 'POST',\n body: JSON.stringify(input),\n }),\n })\n}\n\nexport function useCancelBooking() {\n const config = usePlatformConfig()\n\n return useMutation({\n mutationFn: (input: BookingCancelInput) =>\n apiRequest<{ booking: unknown }>(config, `/bookings/${input.uid}/cancel`, {\n method: 'POST',\n body: JSON.stringify({\n reason: input.reason,\n cancelledBy: input.cancelledBy || 'customer',\n }),\n }),\n })\n}\n\nexport function useBookingLookup(uid?: string, enabled = true) {\n const config = usePlatformConfig()\n\n return useQuery({\n queryKey: ['idk', 'booking', uid],\n queryFn: () => apiRequest<BookingLookup>(config, `/bookings/${uid}`),\n enabled: Boolean(uid) && enabled,\n })\n}\n","\"use client\"\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\"\nimport { useServices, type ServicesQueryParams } from \"./useServices\"\nimport { useTeam, type TeamQueryParams } from \"./useTeam\"\nimport { useAvailability } from \"./useAvailability\"\nimport { useCreateBooking } from \"./useBooking\"\nimport type { Service, StaffMember, AvailabilityDate, AvailabilitySlot } from \"../../types\"\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst parseDateOnly = (value?: string | null): Date | null => {\n if (!value) return null\n const normalized = value.includes(\"T\") ? value.split(\"T\")[0] : value\n const parsed = new Date(`${normalized}T00:00:00`)\n return Number.isNaN(parsed.getTime()) ? null : parsed\n}\n\nconst addDays = (dateStr: string, days: number): string => {\n const parsed = parseDateOnly(dateStr)\n if (!parsed) return dateStr\n parsed.setDate(parsed.getDate() + days)\n return parsed.toISOString().slice(0, 10)\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype Step = \"service\" | \"staff\" | \"time\" | \"details\" | \"done\"\n\nexport interface UseBookingWidgetOptions {\n /** Pre-fetched services — skips the API call when provided. */\n services?: Service[]\n /** Query params forwarded to `useServices` when services are not pre-fetched. */\n servicesQuery?: ServicesQueryParams\n /** Query params forwarded to `useTeam`. */\n teamQuery?: TeamQueryParams\n /** Client-side filter applied to the services list. */\n serviceFilter?: (service: Service) => boolean\n /** Client-side filter applied to the staff list. */\n teamFilter?: (member: StaffMember) => boolean\n /** Enable the staff-selection step. Default `true`. */\n showStaffSelection?: boolean\n /** Automatically advance when user selects a card. Default `false`. */\n autoAdvanceOnSelect?: boolean\n /** Scroll the widget container into view on step change. Default `true`. */\n scrollToStep?: boolean\n /** Pixel offset for scroll-into-view. Default `96`. */\n scrollOffset?: number\n /** Ref to the widget container element. Used for scroll-to-top. */\n widgetRef?: React.RefObject<HTMLElement | null>\n /** Called after a booking is created successfully. */\n onSuccess?: (booking: unknown) => void\n /** Number of days to fetch at a time in list date picker. Default `7`. */\n availabilityDays?: number\n /** Enable prev/next date paging. Default `true`. */\n enableDatePaging?: boolean\n /** Date picker mode: `\"list\"` or `\"calendar\"`. Default `\"list\"`. */\n datePickerMode?: \"list\" | \"calendar\"\n /** Calendar variant. Default `\"default\"`. */\n calendarVariant?: \"default\" | \"compact\"\n /** Max months in advance. Default `3`. */\n maxAdvanceMonths?: number\n /** Weekday numbers (0-6) to disable. Default `[]`. */\n disabledWeekdays?: number[]\n /** Show \"Fully booked\" labels on calendar days. Default `true`. */\n showFullyBookedLabel?: boolean\n /** Enable search input for service filtering. Default `true`. */\n enableServiceSearch?: boolean\n /** Enable category filter dropdown. Default `false`. */\n enableCategoryFilter?: boolean\n /** Max items per page for services before \"show more\". Default `10`. */\n servicePageSize?: number\n /** Max items per page for staff before \"show more\". Default `8`. */\n staffPageSize?: number\n /** Show \"Any Available\" option for staff. Default `true`. */\n showAnyStaffOption?: boolean\n}\n\nexport interface UseBookingWidgetReturn {\n // Current step\n step: Step\n /** 1-based step number for progress display. */\n stepNumber: number\n totalSteps: number\n\n // Selections\n selectedService: Service | null\n selectedStaff: StaffMember | null\n selectedDate: string | null\n selectedTime: string | null\n selectedEndTime: string | null\n details: { name: string; email: string; phone: string; notes: string }\n\n // Data\n servicesList: Service[]\n filteredServices: Service[]\n pagedServices: Service[]\n hasMoreServices: boolean\n categories: string[]\n staffOptions: StaffMember[]\n pagedStaff: StaffMember[]\n hasMoreStaff: boolean\n availabilityDates: AvailabilityDate[]\n availabilityByDate: Map<string, AvailabilityDate>\n timeZone: string\n timeZoneLabel: string\n\n // Calendar state\n calendarMonth: Date\n calendarDays: Array<{ date: string; isCurrentMonth: boolean }>\n hasBlockedInCalendarView: boolean\n maxAdvanceDate: Date | null\n maxAdvanceMonthStart: Date | null\n monthOptions: Array<{ value: string; label: string; date: Date }>\n\n // Loading / error\n isServicesLoading: boolean\n isAvailabilityLoading: boolean\n isSubmitting: boolean\n bookingError: string | null\n\n // Derived flags\n requiresStaff: boolean\n canSkipStaff: boolean\n\n // Search / filter state\n serviceSearch: string\n categoryFilter: string\n servicePage: number\n staffPage: number\n\n // Date paging\n availabilityStartDate: string\n\n // Formatters\n formatDateLabel: (date: string) => string\n formatDateHeading: (date: string) => string\n formatTimeLabel: (iso: string) => string\n formatDuration: (minutes: number) => string\n\n // Actions\n setServiceSearch: (value: string) => void\n setCategoryFilter: (value: string) => void\n loadMoreServices: () => void\n loadMoreStaff: () => void\n selectService: (service: Service) => void\n selectStaff: (staff: StaffMember | null) => void\n selectDate: (date: string) => void\n selectTime: (time: string, endTime: string) => void\n setDetails: React.Dispatch<React.SetStateAction<{ name: string; email: string; phone: string; notes: string }>>\n goToServiceStep: () => void\n continueFromService: () => void\n continueFromStaff: () => void\n continueFromTime: () => void\n submitBooking: (event?: React.FormEvent) => Promise<void>\n goBack: () => void\n reset: () => void\n scrollToTop: () => void\n\n // Date paging\n handlePrevDates: () => void\n handleNextDates: () => void\n\n // Calendar navigation\n handlePrevMonth: () => void\n handleNextMonth: () => void\n handleMonthSelect: (value: string) => void\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useBookingWidget(options: UseBookingWidgetOptions = {}): UseBookingWidgetReturn {\n const {\n services: servicesProp,\n servicesQuery,\n teamQuery,\n serviceFilter,\n teamFilter,\n showStaffSelection = true,\n autoAdvanceOnSelect = false,\n scrollToStep: scrollToStepEnabled = true,\n scrollOffset = 96,\n widgetRef,\n onSuccess,\n availabilityDays: availabilityDaysProp = 7,\n enableDatePaging = true,\n datePickerMode = \"list\",\n calendarVariant = \"default\",\n maxAdvanceMonths = 3,\n disabledWeekdays = [],\n showFullyBookedLabel = true,\n enableServiceSearch = true,\n enableCategoryFilter = false,\n servicePageSize = 10,\n staffPageSize = 8,\n showAnyStaffOption = true,\n } = options\n\n // ---- Data hooks ----\n const resolvedServicesQuery = useMemo(\n () => (servicesProp ? { ...servicesQuery, enabled: false } : servicesQuery),\n [servicesProp, servicesQuery],\n )\n const { data: servicesData, isLoading: servicesLoading } = useServices(resolvedServicesQuery)\n const { data: teamData } = useTeam(teamQuery)\n const createBooking = useCreateBooking()\n\n // ---- Local state ----\n const [step, setStep] = useState<Step>(\"service\")\n const [selectedService, setSelectedService] = useState<Service | null>(null)\n const [selectedStaff, setSelectedStaff] = useState<StaffMember | null>(null)\n const [selectedDate, setSelectedDate] = useState<string | null>(null)\n const [selectedTime, setSelectedTime] = useState<string | null>(null)\n const [selectedEndTime, setSelectedEndTime] = useState<string | null>(null)\n const [serviceSearch, setServiceSearch] = useState(\"\")\n const [categoryFilter, setCategoryFilter] = useState(\"all\")\n const [servicePage, setServicePage] = useState(1)\n const [staffPage, setStaffPage] = useState(1)\n const [availabilityDays, setAvailabilityDays] = useState(Math.max(1, availabilityDaysProp))\n const [availabilityStartDate, setAvailabilityStartDate] = useState(() =>\n new Date().toISOString().slice(0, 10),\n )\n const [calendarMonth, setCalendarMonth] = useState(() => {\n const now = new Date()\n return new Date(now.getFullYear(), now.getMonth(), 1)\n })\n const [bookingError, setBookingError] = useState<string | null>(null)\n const [details, setDetails] = useState({ name: \"\", email: \"\", phone: \"\", notes: \"\" })\n\n // ---- Derived: services ----\n const servicesList = useMemo(() => {\n const list = servicesProp ? [...servicesProp] : servicesData?.services ? [...servicesData.services] : []\n return serviceFilter ? list.filter(serviceFilter) : list\n }, [servicesProp, servicesData, serviceFilter])\n\n const categories = useMemo(() => {\n const set = new Set<string>()\n servicesList.forEach((s) => { if (s.category) set.add(s.category) })\n return Array.from(set).sort()\n }, [servicesList])\n\n const filteredServices = useMemo(() => {\n const search = serviceSearch.trim().toLowerCase()\n return servicesList.filter((service) => {\n const matchesSearch =\n !search ||\n service.name.toLowerCase().includes(search) ||\n (service.description || \"\").toLowerCase().includes(search) ||\n (service.category || \"\").toLowerCase().includes(search)\n const matchesCategory = categoryFilter === \"all\" ? true : service.category === categoryFilter\n return matchesSearch && matchesCategory\n })\n }, [servicesList, serviceSearch, categoryFilter])\n\n useEffect(() => { setServicePage(1) }, [serviceSearch, categoryFilter])\n useEffect(() => { setStaffPage(1) }, [selectedService?.id, teamData, teamFilter])\n\n const pagedServices = useMemo(() => {\n const pageSize = Math.max(1, servicePageSize)\n return filteredServices.slice(0, pageSize * servicePage)\n }, [filteredServices, servicePage, servicePageSize])\n\n const hasMoreServices = filteredServices.length > pagedServices.length\n\n // ---- Derived: staff ----\n const staffOptions = useMemo(() => {\n if (!selectedService) return []\n if (selectedService.assignedStaff && selectedService.assignedStaff.length > 0) {\n const assigned = selectedService.assignedStaff\n return teamFilter ? assigned.filter(teamFilter) : assigned\n }\n const teamList = teamData?.team || []\n return teamFilter ? teamList.filter(teamFilter) : teamList\n }, [selectedService, teamData, teamFilter])\n\n const pagedStaff = useMemo(() => {\n const pageSize = Math.max(1, staffPageSize)\n return staffOptions.slice(0, pageSize * staffPage)\n }, [staffOptions, staffPage, staffPageSize])\n\n const hasMoreStaff = staffOptions.length > pagedStaff.length\n\n // ---- Derived: step flags ----\n const requiresStaff =\n showStaffSelection ||\n Boolean(selectedService?.requiresStaffSelection) ||\n selectedService?.schedulingType === \"customer-choice\"\n\n const canSkipStaff = !selectedService?.requiresStaffSelection\n\n const totalSteps = requiresStaff ? 4 : 3\n const stepNumber = (() => {\n if (step === \"service\") return 1\n if (step === \"staff\") return 2\n if (step === \"time\") return requiresStaff ? 3 : 2\n if (step === \"details\") return requiresStaff ? 4 : 3\n return totalSteps\n })()\n\n // ---- Availability ----\n const availabilityEndDate = useMemo(\n () => addDays(availabilityStartDate, Math.max(1, availabilityDays) - 1),\n [availabilityStartDate, availabilityDays],\n )\n\n const availability = useAvailability({\n serviceId: selectedService?.id || \"\",\n staffId: selectedStaff?.id,\n startDate: availabilityStartDate,\n endDate: availabilityEndDate,\n enabled: Boolean(selectedService),\n })\n\n const timeZone = availability.data?.timeZone || \"America/Chicago\"\n\n const safeTimeZone = useMemo(() => {\n if (!timeZone) return undefined\n try {\n new Intl.DateTimeFormat(\"en-US\", { timeZone }).format(new Date())\n return timeZone\n } catch {\n return undefined\n }\n }, [timeZone])\n\n const timeZoneLabel = useMemo(() => {\n if (timeZone) return timeZone\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone\n } catch {\n return \"Local time\"\n }\n }, [timeZone])\n\n const availabilityByDate = useMemo(() => {\n const map = new Map<string, AvailabilityDate>()\n ;(availability.data?.dates || []).forEach((entry) => { map.set(entry.date, entry) })\n return map\n }, [availability.data])\n\n // ---- Formatters (stable refs via useMemo) ----\n const dateLabelFormatter = useMemo(\n () => new Intl.DateTimeFormat(\"en-US\", { weekday: \"short\", month: \"short\", day: \"numeric\" }),\n [],\n )\n const dateHeadingFormatter = useMemo(\n () => new Intl.DateTimeFormat(\"en-US\", { weekday: \"long\", month: \"long\", day: \"numeric\" }),\n [],\n )\n const timeFormatter = useMemo(\n () => new Intl.DateTimeFormat(\"en-US\", { timeZone: safeTimeZone, hour: \"numeric\", minute: \"2-digit\" }),\n [safeTimeZone],\n )\n\n const parseDateTime = useCallback(\n (value?: string | null, fallbackDate?: string | null): Date | null => {\n if (!value) return null\n const direct = new Date(value)\n if (!Number.isNaN(direct.getTime())) return direct\n if (fallbackDate) {\n const normalized = fallbackDate.includes(\"T\") ? fallbackDate.split(\"T\")[0] : fallbackDate\n const combined = new Date(`${normalized}T${value}`)\n if (!Number.isNaN(combined.getTime())) return combined\n }\n return null\n },\n [],\n )\n\n const formatDateLabel = useCallback(\n (date: string): string => {\n const parsed = parseDateOnly(date)\n if (!parsed) return date\n try { return dateLabelFormatter.format(parsed) } catch { return date }\n },\n [dateLabelFormatter],\n )\n\n const formatDateHeading = useCallback(\n (date: string): string => {\n const parsed = parseDateOnly(date)\n if (!parsed) return date\n try { return dateHeadingFormatter.format(parsed) } catch { return date }\n },\n [dateHeadingFormatter],\n )\n\n const formatTimeLabel = useCallback(\n (iso: string): string => {\n const parsed = parseDateTime(iso, selectedDate)\n if (!parsed) return iso\n try { return timeFormatter.format(parsed) } catch {\n return parsed.toLocaleTimeString(\"en-US\", { hour: \"numeric\", minute: \"2-digit\" })\n }\n },\n [parseDateTime, selectedDate, timeFormatter],\n )\n\n const formatDuration = useCallback((minutes: number): string => {\n if (!Number.isFinite(minutes)) return \"\"\n if (minutes < 60) return `${minutes} min`\n const hours = Math.floor(minutes / 60)\n const remaining = minutes % 60\n return remaining === 0 ? `${hours} hr${hours > 1 ? \"s\" : \"\"}` : `${hours} hr ${remaining} min`\n }, [])\n\n // ---- Calendar ----\n const todayString = useMemo(() => new Date().toISOString().slice(0, 10), [])\n const todayDate = useMemo(() => { const now = new Date(); now.setHours(0, 0, 0, 0); return now }, [])\n const disabledWeekdaysSet = useMemo(() => new Set(disabledWeekdays), [disabledWeekdays])\n\n const getMonthStart = useCallback((date: Date) => new Date(date.getFullYear(), date.getMonth(), 1), [])\n const getMonthEnd = useCallback((date: Date) => new Date(date.getFullYear(), date.getMonth() + 1, 0), [])\n\n const getMonthDays = useCallback(\n (date: Date) => {\n const start = getMonthStart(date)\n const end = getMonthEnd(date)\n const days: Array<{ date: string; isCurrentMonth: boolean }> = []\n const startDay = start.getDay()\n for (let i = startDay; i > 0; i -= 1) {\n const d = new Date(start)\n d.setDate(start.getDate() - i)\n days.push({ date: d.toISOString().slice(0, 10), isCurrentMonth: false })\n }\n for (let day = 1; day <= end.getDate(); day += 1) {\n const d = new Date(date.getFullYear(), date.getMonth(), day)\n days.push({ date: d.toISOString().slice(0, 10), isCurrentMonth: true })\n }\n const remainder = 7 - (days.length % 7 || 7)\n for (let i = 1; i <= remainder; i += 1) {\n const d = new Date(end)\n d.setDate(end.getDate() + i)\n days.push({ date: d.toISOString().slice(0, 10), isCurrentMonth: false })\n }\n return days\n },\n [getMonthEnd, getMonthStart],\n )\n\n const maxAdvanceDate = useMemo(() => {\n if (!maxAdvanceMonths || maxAdvanceMonths <= 0) return null\n const maxMonth = new Date(todayDate.getFullYear(), todayDate.getMonth() + maxAdvanceMonths - 1, 1)\n return getMonthEnd(maxMonth)\n }, [getMonthEnd, maxAdvanceMonths, todayDate])\n\n const maxAdvanceMonthStart = useMemo(() => {\n if (!maxAdvanceMonths || maxAdvanceMonths <= 0) return null\n return new Date(todayDate.getFullYear(), todayDate.getMonth() + maxAdvanceMonths - 1, 1)\n }, [maxAdvanceMonths, todayDate])\n\n const monthOptionCount = useMemo(() => {\n if (!maxAdvanceMonths || maxAdvanceMonths <= 0) return 12\n return maxAdvanceMonths\n }, [maxAdvanceMonths])\n\n const monthOptions = useMemo(() => {\n return Array.from({ length: monthOptionCount }, (_, index) => {\n const date = new Date(todayDate.getFullYear(), todayDate.getMonth() + index, 1)\n return {\n value: `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, \"0\")}`,\n label: new Intl.DateTimeFormat(\"en-US\", { month: \"long\", year: \"numeric\" }).format(date),\n date,\n }\n })\n }, [monthOptionCount, todayDate])\n\n const calendarDays = useMemo(() => getMonthDays(calendarMonth), [getMonthDays, calendarMonth])\n\n const hasBlockedInCalendarView = useMemo(() => {\n return calendarDays.some((day) => {\n const entry = availabilityByDate.get(day.date)\n if (!entry) return false\n return !entry.slots.some((slot: AvailabilitySlot) => slot.available)\n })\n }, [calendarDays, availabilityByDate])\n\n // ---- Scroll ----\n const scrollToTop = useCallback(() => {\n if (!scrollToStepEnabled || !widgetRef?.current) return\n const top = widgetRef.current.getBoundingClientRect().top + window.scrollY\n window.scrollTo({ top: Math.max(0, top - scrollOffset), behavior: \"smooth\" })\n }, [scrollToStepEnabled, scrollOffset, widgetRef])\n\n // ---- Internal helpers ----\n const resetSelections = useCallback(() => {\n setSelectedStaff(null)\n setSelectedDate(null)\n setSelectedTime(null)\n setSelectedEndTime(null)\n setBookingError(null)\n }, [])\n\n // ---- Effects: auto-select first available date ----\n useEffect(() => {\n if (step !== \"time\") return\n if (!availability.data?.dates?.length) return\n const matches = selectedDate\n ? availability.data.dates.some((entry) => entry.date === selectedDate)\n : false\n if (matches) return\n setSelectedDate(availability.data.dates[0].date)\n }, [step, availability.data, selectedDate])\n\n // Reset availability window when service/staff changes\n useEffect(() => {\n if (!selectedService) return\n if (datePickerMode === \"calendar\") {\n const now = new Date()\n setCalendarMonth(new Date(now.getFullYear(), now.getMonth(), 1))\n return\n }\n setAvailabilityStartDate(new Date().toISOString().slice(0, 10))\n setAvailabilityDays(Math.max(1, availabilityDaysProp))\n }, [selectedService?.id, selectedStaff?.id, availabilityDaysProp, datePickerMode])\n\n // Sync availability window to calendar month\n useEffect(() => {\n if (datePickerMode !== \"calendar\") return\n const start = getMonthStart(calendarMonth)\n const end = getMonthEnd(calendarMonth)\n setAvailabilityStartDate(start.toISOString().slice(0, 10))\n setAvailabilityDays(end.getDate())\n }, [calendarMonth, datePickerMode, getMonthEnd, getMonthStart])\n\n // ---- Actions ----\n const selectService = useCallback(\n (service: Service) => {\n setSelectedService(service)\n resetSelections()\n if (autoAdvanceOnSelect) {\n if (requiresStaff) setStep(\"staff\")\n else setStep(\"time\")\n scrollToTop()\n }\n },\n [autoAdvanceOnSelect, requiresStaff, resetSelections, scrollToTop],\n )\n\n const selectStaff = useCallback(\n (staff: StaffMember | null) => {\n setSelectedStaff(staff)\n setSelectedDate(null)\n setSelectedTime(null)\n setSelectedEndTime(null)\n setBookingError(null)\n if (autoAdvanceOnSelect) {\n setStep(\"time\")\n scrollToTop()\n }\n },\n [autoAdvanceOnSelect, scrollToTop],\n )\n\n const selectDate = useCallback((date: string) => {\n setSelectedDate(date)\n setSelectedTime(null)\n setSelectedEndTime(null)\n setBookingError(null)\n }, [])\n\n const selectTime = useCallback(\n (time: string, endTime: string) => {\n setSelectedTime(time)\n setSelectedEndTime(endTime)\n setBookingError(null)\n if (autoAdvanceOnSelect) {\n setStep(\"details\")\n scrollToTop()\n }\n },\n [autoAdvanceOnSelect, scrollToTop],\n )\n\n const continueFromService = useCallback(() => {\n if (!selectedService) return\n if (requiresStaff) setStep(\"staff\")\n else setStep(\"time\")\n scrollToTop()\n }, [selectedService, requiresStaff, scrollToTop])\n\n const continueFromStaff = useCallback(() => {\n if (!canSkipStaff && !selectedStaff) return\n setStep(\"time\")\n scrollToTop()\n }, [canSkipStaff, selectedStaff, scrollToTop])\n\n const continueFromTime = useCallback(() => {\n if (!selectedTime || !selectedEndTime) return\n setStep(\"details\")\n scrollToTop()\n }, [selectedTime, selectedEndTime, scrollToTop])\n\n const goBack = useCallback(() => {\n if (step === \"service\") return\n if (step === \"staff\") setStep(\"service\")\n else if (step === \"time\") setStep(requiresStaff ? \"staff\" : \"service\")\n else if (step === \"details\") setStep(\"time\")\n else if (step === \"done\") setStep(\"details\")\n setBookingError(null)\n scrollToTop()\n }, [step, requiresStaff, scrollToTop])\n\n const goToServiceStep = useCallback(() => {\n setStep(\"service\")\n scrollToTop()\n }, [scrollToTop])\n\n const reset = useCallback(() => {\n setStep(\"service\")\n setSelectedService(null)\n resetSelections()\n setDetails({ name: \"\", email: \"\", phone: \"\", notes: \"\" })\n scrollToTop()\n }, [resetSelections, scrollToTop])\n\n const submitBooking = useCallback(\n async (event?: React.FormEvent) => {\n event?.preventDefault()\n if (!selectedService || !selectedDate || !selectedTime || !selectedEndTime) return\n\n const start = parseDateTime(selectedTime, selectedDate)\n const end = parseDateTime(selectedEndTime, selectedDate)\n\n if (!start || !end) {\n setBookingError(\"Please select a valid time slot.\")\n return\n }\n\n try {\n setBookingError(null)\n const result = await createBooking.mutateAsync({\n serviceId: selectedService.id,\n staffId: selectedStaff?.id,\n startTime: start.toISOString(),\n endTime: end.toISOString(),\n customerName: details.name,\n customerEmail: details.email,\n customerPhone: details.phone || undefined,\n customerNotes: details.notes || undefined,\n })\n\n setStep(\"done\")\n onSuccess?.(result?.booking)\n scrollToTop()\n } catch (error) {\n setBookingError(\n error instanceof Error ? error.message : \"Unable to complete booking. Please try again.\",\n )\n }\n },\n [selectedService, selectedDate, selectedTime, selectedEndTime, selectedStaff, details, createBooking, onSuccess, scrollToTop, parseDateTime],\n )\n\n // ---- Date paging ----\n const handlePrevDates = useCallback(() => {\n if (availabilityStartDate <= todayString) return\n setAvailabilityStartDate((prev) => addDays(prev, -availabilityDays))\n setSelectedDate(null)\n setSelectedTime(null)\n setSelectedEndTime(null)\n setBookingError(null)\n }, [availabilityStartDate, availabilityDays, todayString])\n\n const handleNextDates = useCallback(() => {\n if (maxAdvanceDate) {\n const nextStart = parseDateOnly(addDays(availabilityStartDate, availabilityDays))\n if (nextStart && nextStart > maxAdvanceDate) return\n }\n setAvailabilityStartDate((prev) => addDays(prev, availabilityDays))\n setSelectedDate(null)\n setSelectedTime(null)\n setSelectedEndTime(null)\n setBookingError(null)\n }, [availabilityStartDate, availabilityDays, maxAdvanceDate])\n\n // ---- Calendar navigation ----\n const handlePrevMonth = useCallback(() => {\n setCalendarMonth((prev) => new Date(prev.getFullYear(), prev.getMonth() - 1, 1))\n setSelectedDate(null)\n setSelectedTime(null)\n setSelectedEndTime(null)\n setBookingError(null)\n }, [])\n\n const handleNextMonth = useCallback(() => {\n if (maxAdvanceMonthStart) {\n const nextMonth = new Date(calendarMonth.getFullYear(), calendarMonth.getMonth() + 1, 1)\n if (nextMonth > maxAdvanceMonthStart) return\n }\n setCalendarMonth((prev) => new Date(prev.getFullYear(), prev.getMonth() + 1, 1))\n setSelectedDate(null)\n setSelectedTime(null)\n setSelectedEndTime(null)\n setBookingError(null)\n }, [calendarMonth, maxAdvanceMonthStart])\n\n const handleMonthSelect = useCallback((value: string) => {\n const [year, month] = value.split(\"-\").map(Number)\n if (!year || !month) return\n setCalendarMonth(new Date(year, month - 1, 1))\n setSelectedDate(null)\n setSelectedTime(null)\n setSelectedEndTime(null)\n setBookingError(null)\n }, [])\n\n const loadMoreServices = useCallback(() => setServicePage((p) => p + 1), [])\n const loadMoreStaff = useCallback(() => setStaffPage((p) => (hasMoreStaff ? p + 1 : 1)), [hasMoreStaff])\n\n // ---- Return ----\n return {\n step,\n stepNumber,\n totalSteps,\n\n selectedService,\n selectedStaff,\n selectedDate,\n selectedTime,\n selectedEndTime,\n details,\n\n servicesList,\n filteredServices,\n pagedServices,\n hasMoreServices,\n categories,\n staffOptions,\n pagedStaff,\n hasMoreStaff,\n availabilityDates: availability.data?.dates || [],\n availabilityByDate,\n timeZone,\n timeZoneLabel,\n\n calendarMonth,\n calendarDays,\n hasBlockedInCalendarView,\n maxAdvanceDate,\n maxAdvanceMonthStart,\n monthOptions,\n\n isServicesLoading: servicesProp ? false : servicesLoading,\n isAvailabilityLoading: availability.isLoading,\n isSubmitting: createBooking.isPending,\n bookingError,\n\n requiresStaff,\n canSkipStaff,\n\n serviceSearch,\n categoryFilter,\n servicePage,\n staffPage,\n\n availabilityStartDate,\n\n formatDateLabel,\n formatDateHeading,\n formatTimeLabel,\n formatDuration,\n\n setServiceSearch,\n setCategoryFilter,\n loadMoreServices,\n loadMoreStaff,\n selectService,\n selectStaff,\n selectDate,\n selectTime,\n setDetails,\n goToServiceStep,\n continueFromService,\n continueFromStaff,\n continueFromTime,\n submitBooking,\n goBack,\n reset,\n scrollToTop,\n\n handlePrevDates,\n handleNextDates,\n handlePrevMonth,\n handleNextMonth,\n handleMonthSelect,\n }\n}\n","'use client'\n\nimport type { Service } from '../types'\n\ninterface ServiceCardProps {\n service: Service\n className?: string\n showDescription?: boolean\n showPrice?: boolean\n showImage?: boolean\n onSelect?: (service: Service) => void\n}\n\nexport function ServiceCard({\n service,\n className,\n showDescription = true,\n showPrice = true,\n showImage = false,\n onSelect,\n}: ServiceCardProps) {\n const handleClick = () => {\n if (onSelect) onSelect(service)\n }\n\n return (\n <div\n className={['idk-card', onSelect ? 'idk-card--clickable' : '', className]\n .filter(Boolean)\n .join(' ')}\n onClick={onSelect ? handleClick : undefined}\n role={onSelect ? 'button' : undefined}\n tabIndex={onSelect ? 0 : undefined}\n >\n {showImage && service.image?.url ? (\n <div className=\"idk-card__media\">\n <img src={service.image.url} alt={service.name} />\n </div>\n ) : null}\n <div className=\"idk-card__header\">\n <h3 className=\"idk-card__title\">{service.name}</h3>\n {showPrice && typeof service.price === 'number' && service.price > 0 ? (\n <span className=\"idk-card__price\">${(service.price / 100).toFixed(2)}</span>\n ) : null}\n </div>\n {showDescription && service.description ? (\n <p className=\"idk-card__description\">{service.description}</p>\n ) : null}\n <div className=\"idk-card__meta\">\n <span>{service.duration} min</span>\n {service.category ? <span>{service.category}</span> : null}\n </div>\n </div>\n )\n}\n","'use client'\n\nimport { ServiceCard } from './ServiceCard'\nimport { useServices, type ServicesQueryParams } from '../core/hooks/useServices'\nimport type { Service } from '../types'\n\ninterface ServicesListProps {\n layout?: 'grid' | 'list'\n columns?: number\n className?: string\n showDescription?: boolean\n showPrice?: boolean\n showImage?: boolean\n query?: ServicesQueryParams\n filter?: (service: Service) => boolean\n sort?: (a: Service, b: Service) => number\n limit?: number\n emptyMessage?: string\n loadingMessage?: string\n onSelect?: (service: Service) => void\n}\n\nexport function ServicesList({\n layout = 'grid',\n columns = 3,\n className,\n showDescription,\n showPrice,\n showImage,\n query,\n filter,\n sort,\n limit,\n emptyMessage = 'No services available.',\n loadingMessage = 'Loading services...',\n onSelect,\n}: ServicesListProps) {\n const { data, isLoading, error } = useServices(query)\n\n if (isLoading) {\n return <div className=\"idk-state\">{loadingMessage}</div>\n }\n\n let services = data?.services ? [...data.services] : []\n\n if (filter) {\n services = services.filter(filter)\n }\n\n if (sort) {\n services = services.sort(sort)\n }\n\n if (typeof limit === 'number') {\n services = services.slice(0, Math.max(0, limit))\n }\n\n if (error || services.length === 0) {\n return <div className=\"idk-state\">{emptyMessage}</div>\n }\n\n const gridStyle = layout === 'grid'\n ? { gridTemplateColumns: `repeat(${Math.max(1, columns)}, minmax(0, 1fr))` }\n : undefined\n\n return (\n <div\n className={[\n 'idk-services',\n layout === 'grid' ? 'idk-services--grid' : 'idk-services--list',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={gridStyle}\n >\n {services.map((service) => (\n <ServiceCard\n key={service.id}\n service={service}\n showDescription={showDescription}\n showPrice={showPrice}\n showImage={showImage}\n onSelect={onSelect}\n />\n ))}\n </div>\n )\n}\n","import React from \"react\"\n\nconst LINK_REGEX =\n /((https?:\\/\\/|www\\.)[^\\s]+|[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,}|(?:[a-z0-9-]+\\.)+[a-z]{2,}(?:\\/[^\\s]*)?)/gi\n\nfunction buildHref(raw: string): string {\n if (raw.includes(\"@\") && !raw.startsWith(\"http\")) {\n return `mailto:${raw}`\n }\n if (raw.startsWith(\"http://\") || raw.startsWith(\"https://\")) {\n return raw\n }\n if (raw.startsWith(\"www.\")) {\n return `https://${raw}`\n }\n return `https://${raw}`\n}\n\nfunction trimTrailingPunctuation(value: string): { text: string; trailing: string } {\n let text = value\n let trailing = \"\"\n while (text && /[),.!?:;]+$/.test(text)) {\n trailing = text.slice(-1) + trailing\n text = text.slice(0, -1)\n }\n return { text, trailing }\n}\n\nexport function renderLinkedText(text?: string | null): React.ReactNode {\n if (!text) return null\n const matches = Array.from(text.matchAll(LINK_REGEX))\n if (matches.length === 0) return text\n\n const nodes: React.ReactNode[] = []\n let lastIndex = 0\n\n matches.forEach((match, index) => {\n const matchText = match[0]\n const start = match.index ?? 0\n\n if (start > lastIndex) {\n nodes.push(text.slice(lastIndex, start))\n }\n\n const { text: cleanText, trailing } = trimTrailingPunctuation(matchText)\n if (cleanText) {\n const href = buildHref(cleanText)\n nodes.push(\n <a key={`link-${start}-${index}`} href={href} target=\"_blank\" rel=\"noopener noreferrer\">\n {cleanText}\n </a>\n )\n }\n\n if (trailing) {\n nodes.push(trailing)\n }\n\n lastIndex = start + matchText.length\n })\n\n if (lastIndex < text.length) {\n nodes.push(text.slice(lastIndex))\n }\n\n return nodes\n}\n","'use client'\n\nimport type { StaffMember } from '../types'\nimport { renderLinkedText } from '../lib/linkify'\n\ninterface TeamMemberProps {\n member: StaffMember\n className?: string\n showRole?: boolean\n showEmail?: boolean\n showBio?: boolean\n layout?: \"card\" | \"profile\"\n imagePosition?: \"left\" | \"right\"\n}\n\nexport function TeamMember({\n member,\n className,\n showRole = true,\n showEmail = false,\n showBio = false,\n layout = \"card\",\n imagePosition = \"left\",\n}: TeamMemberProps) {\n const initials = member.name\n ?.split(' ')\n .map((part) => part[0])\n .slice(0, 2)\n .join('')\n .toUpperCase()\n\n const avatar = (\n <div className=\"idk-team__avatar\">\n {member.photo?.url ? (\n <img src={member.photo.url} alt={member.name} />\n ) : (\n <span>{initials}</span>\n )}\n </div>\n )\n\n if (layout === \"profile\") {\n return (\n <div className={[\"idk-team__profile\", className].filter(Boolean).join(\" \")}>\n {imagePosition === \"left\" ? avatar : null}\n <div className=\"idk-team__info\">\n <h3 className=\"idk-card__title\">{member.name}</h3>\n {showRole ? (\n <p className=\"idk-card__description\">{member.role || \"Staff\"}</p>\n ) : null}\n {showBio && member.bio ? (\n <p className=\"idk-team__bio\">{renderLinkedText(member.bio)}</p>\n ) : null}\n {showEmail ? (\n <p className=\"idk-card__meta\">{member.email}</p>\n ) : null}\n </div>\n {imagePosition === \"right\" ? avatar : null}\n </div>\n )\n }\n\n return (\n <div className={[\"idk-card\", className].filter(Boolean).join(\" \")}>\n <div className=\"idk-team__avatar\">\n {member.photo?.url ? (\n <img src={member.photo.url} alt={member.name} />\n ) : (\n <span>{initials}</span>\n )}\n </div>\n <div className=\"idk-team__info\">\n <h3 className=\"idk-card__title\">{member.name}</h3>\n {showRole ? (\n <p className=\"idk-card__description\">{member.role || \"Staff\"}</p>\n ) : null}\n {showBio && member.bio ? (\n <p className=\"idk-team__bio\">{renderLinkedText(member.bio)}</p>\n ) : null}\n {showEmail ? (\n <p className=\"idk-card__meta\">{member.email}</p>\n ) : null}\n </div>\n </div>\n )\n}\n","'use client'\n\nimport { useTeam, type TeamQueryParams } from '../core/hooks/useTeam'\nimport { TeamMember } from './TeamMember'\nimport type { StaffMember } from '../types'\n\ninterface TeamGridProps {\n columns?: number\n className?: string\n showRole?: boolean\n showEmail?: boolean\n showBio?: boolean\n layout?: \"card\" | \"profile\"\n imagePosition?: \"left\" | \"right\"\n query?: TeamQueryParams\n filter?: (member: StaffMember) => boolean\n sort?: (a: StaffMember, b: StaffMember) => number\n limit?: number\n emptyMessage?: string\n loadingMessage?: string\n}\n\nexport function TeamGrid({\n columns = 3,\n className,\n showRole,\n showEmail,\n showBio,\n layout = \"card\",\n imagePosition = \"left\",\n query,\n filter,\n sort,\n limit,\n emptyMessage = 'No team members available.',\n loadingMessage = 'Loading team...',\n}: TeamGridProps) {\n const { data, isLoading, error } = useTeam(query)\n\n if (isLoading) {\n return <div className=\"idk-state\">{loadingMessage}</div>\n }\n\n let members = data?.team ? [...data.team] : []\n\n if (filter) {\n members = members.filter(filter)\n }\n\n if (sort) {\n members = members.sort(sort)\n }\n\n if (typeof limit === 'number') {\n members = members.slice(0, Math.max(0, limit))\n }\n\n if (error || members.length === 0) {\n return <div className=\"idk-state\">{emptyMessage}</div>\n }\n\n const gridStyle = { gridTemplateColumns: `repeat(${Math.max(1, columns)}, minmax(0, 1fr))` }\n\n return (\n <div\n className={['idk-team', className].filter(Boolean).join(' ')}\n style={gridStyle}\n >\n {members.map((member) => (\n <TeamMember\n key={member.id}\n member={member}\n showRole={showRole}\n showEmail={showEmail}\n showBio={showBio}\n layout={layout}\n imagePosition={imagePosition}\n />\n ))}\n </div>\n )\n}\n","'use client'\n\nimport { useState } from 'react'\nimport { useMutation } from '@tanstack/react-query'\nimport { apiRequest } from '../core/api-client'\nimport { usePlatformConfig } from '../core/context'\nimport type { ContactSubmissionInput } from '../types'\n\ntype ContactField = 'name' | 'email' | 'phone' | 'subject' | 'message'\n\ninterface ContactFormProps {\n fields?: ContactField[]\n formType?: ContactSubmissionInput['formType']\n submitLabel?: string\n className?: string\n onSuccess?: () => void\n onError?: (message: string) => void\n}\n\nconst DEFAULT_FIELDS: ContactField[] = ['name', 'email', 'phone', 'message']\n\nexport function ContactForm({\n fields = DEFAULT_FIELDS,\n formType = 'contact',\n submitLabel = 'Send Message',\n className,\n onSuccess,\n onError,\n}: ContactFormProps) {\n const config = usePlatformConfig()\n const [formState, setFormState] = useState<Record<ContactField, string>>({\n name: '',\n email: '',\n phone: '',\n subject: '',\n message: '',\n })\n\n const mutation = useMutation({\n mutationFn: (payload: ContactSubmissionInput) =>\n apiRequest<{ submissionId: string | number }>(config, '/contact', {\n method: 'POST',\n body: JSON.stringify(payload),\n }),\n onSuccess: () => {\n setFormState({ name: '', email: '', phone: '', subject: '', message: '' })\n onSuccess?.()\n },\n onError: (error) => {\n const message = error instanceof Error ? error.message : 'Failed to submit form'\n onError?.(message)\n },\n })\n\n const handleChange = (field: ContactField, value: string) => {\n setFormState((prev) => ({ ...prev, [field]: value }))\n }\n\n const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault()\n\n mutation.mutate({\n name: formState.name,\n email: formState.email,\n phone: formState.phone || undefined,\n subject: formState.subject || undefined,\n message: formState.message,\n formType,\n })\n }\n\n return (\n <form className={['idk-form', className].filter(Boolean).join(' ')} onSubmit={handleSubmit}>\n {fields.includes('name') && (\n <label className=\"idk-form__field\">\n <span>Name</span>\n <input\n value={formState.name}\n onChange={(event) => handleChange('name', event.target.value)}\n required\n />\n </label>\n )}\n {fields.includes('email') && (\n <label className=\"idk-form__field\">\n <span>Email</span>\n <input\n type=\"email\"\n value={formState.email}\n onChange={(event) => handleChange('email', event.target.value)}\n required\n />\n </label>\n )}\n {fields.includes('phone') && (\n <label className=\"idk-form__field\">\n <span>Phone</span>\n <input\n value={formState.phone}\n onChange={(event) => handleChange('phone', event.target.value)}\n />\n </label>\n )}\n {fields.includes('subject') && (\n <label className=\"idk-form__field\">\n <span>Subject</span>\n <input\n value={formState.subject}\n onChange={(event) => handleChange('subject', event.target.value)}\n />\n </label>\n )}\n {fields.includes('message') && (\n <label className=\"idk-form__field\">\n <span>Message</span>\n <textarea\n value={formState.message}\n onChange={(event) => handleChange('message', event.target.value)}\n rows={5}\n required\n />\n </label>\n )}\n <button type=\"submit\" className=\"idk-button\" disabled={mutation.isPending}>\n {mutation.isPending ? 'Sending...' : submitLabel}\n </button>\n {mutation.isError ? (\n <p className=\"idk-form__error\">Something went wrong. Please try again.</p>\n ) : null}\n {mutation.isSuccess ? (\n <p className=\"idk-form__success\">Thanks! We&apos;ll be in touch soon.</p>\n ) : null}\n </form>\n )\n}\n","\"use client\"\n\nimport React, { useRef } from \"react\"\nimport { useBookingWidget, type UseBookingWidgetOptions } from \"../core/hooks/useBookingWidget\"\nimport { renderLinkedText } from \"../lib/linkify\"\nimport type { Service, StaffMember, AvailabilitySlot } from \"../types\"\nimport type { ServicesQueryParams } from \"../core/hooks/useServices\"\nimport type { TeamQueryParams } from \"../core/hooks/useTeam\"\n\ninterface BookingWidgetProps {\n className?: string\n showStaffSelection?: boolean\n onSuccess?: (booking: unknown) => void\n services?: Service[]\n servicesQuery?: ServicesQueryParams\n teamQuery?: TeamQueryParams\n serviceFilter?: (service: Service) => boolean\n teamFilter?: (member: StaffMember) => boolean\n title?: string\n subtitle?: string\n autoAdvanceOnSelect?: boolean\n scrollToStep?: boolean\n scrollOffset?: number\n enableServiceSearch?: boolean\n serviceSearchPlaceholder?: string\n enableCategoryFilter?: boolean\n categoryLabel?: string\n serviceListMaxHeight?: number | string\n serviceLayout?: \"list\" | \"grid\"\n serviceColumns?: number\n servicePageSize?: number\n showServicePagination?: boolean\n staffLayout?: \"list\" | \"grid\"\n staffColumns?: number\n showAnyStaffOption?: boolean\n staffPageSize?: number\n showStaffPagination?: boolean\n timeLayout?: \"stack\" | \"split\"\n availabilityDays?: number\n enableDatePaging?: boolean\n datePickerMode?: \"list\" | \"calendar\"\n calendarVariant?: \"default\" | \"compact\"\n maxAdvanceMonths?: number\n disabledWeekdays?: number[]\n showFullyBookedLabel?: boolean\n}\n\nconst parseDateOnly = (value?: string | null): Date | null => {\n if (!value) return null\n const normalized = value.includes(\"T\") ? value.split(\"T\")[0] : value\n const parsed = new Date(`${normalized}T00:00:00`)\n return Number.isNaN(parsed.getTime()) ? null : parsed\n}\n\nexport function BookingWidget({\n className,\n title = \"Book an Appointment\",\n subtitle,\n serviceSearchPlaceholder = \"Search services\",\n categoryLabel = \"All categories\",\n serviceListMaxHeight,\n serviceLayout = \"list\",\n serviceColumns = 2,\n showServicePagination,\n staffLayout = \"grid\",\n staffColumns = 2,\n showStaffPagination,\n timeLayout = \"split\",\n showFullyBookedLabel = true,\n calendarVariant = \"default\",\n enableServiceSearch = true,\n enableCategoryFilter = false,\n enableDatePaging = true,\n disabledWeekdays = [],\n ...hookProps\n}: BookingWidgetProps) {\n const widgetRef = useRef<HTMLDivElement | null>(null)\n\n const bw = useBookingWidget({\n ...hookProps,\n enableServiceSearch,\n enableCategoryFilter,\n enableDatePaging,\n calendarVariant,\n disabledWeekdays,\n showFullyBookedLabel,\n widgetRef,\n } satisfies UseBookingWidgetOptions)\n\n const todayDate = (() => { const now = new Date(); now.setHours(0, 0, 0, 0); return now })()\n const disabledWeekdaysSet = new Set(disabledWeekdays)\n const shouldPaginate = showServicePagination ?? bw.hasMoreServices\n const shouldPaginateStaff = showStaffPagination ?? bw.hasMoreStaff\n\n if (bw.isServicesLoading) {\n return <div className=\"idk-state\">Loading booking options...</div>\n }\n\n if (!bw.servicesList.length) {\n return <div className=\"idk-state\">No services available.</div>\n }\n\n return (\n <div ref={widgetRef} className={[\"idk-booking\", className].filter(Boolean).join(\" \")}>\n <div className=\"idk-booking__header\">\n <div className=\"idk-booking__title-wrap\">\n <h3 className=\"idk-booking__title\">{title}</h3>\n {subtitle ? <p className=\"idk-booking__subtitle\">{subtitle}</p> : null}\n </div>\n {bw.step !== \"service\" && bw.step !== \"done\" ? (\n <button type=\"button\" className=\"idk-link\" onClick={bw.goBack}>\n Back\n </button>\n ) : null}\n </div>\n\n {bw.step !== \"done\" ? (\n <div className=\"idk-booking__progress\">\n <span>Step {bw.stepNumber} of {bw.totalSteps}</span>\n <div className=\"idk-booking__bar\">\n <div\n className=\"idk-booking__bar-fill\"\n style={{ width: `${(bw.stepNumber / bw.totalSteps) * 100}%` }}\n />\n </div>\n </div>\n ) : null}\n\n {bw.step === \"service\" && (\n <div className=\"idk-booking__step\">\n <h4>Select a service</h4>\n {(enableServiceSearch || enableCategoryFilter) ? (\n <div className=\"idk-booking__filters\">\n {enableServiceSearch ? (\n <input\n type=\"search\"\n value={bw.serviceSearch}\n onChange={(event) => bw.setServiceSearch(event.target.value)}\n placeholder={serviceSearchPlaceholder}\n />\n ) : null}\n {enableCategoryFilter && bw.categories.length > 0 ? (\n <select\n value={bw.categoryFilter}\n onChange={(event) => bw.setCategoryFilter(event.target.value)}\n >\n <option value=\"all\">{categoryLabel}</option>\n {bw.categories.map((category) => (\n <option key={category} value={category}>{category}</option>\n ))}\n </select>\n ) : null}\n </div>\n ) : null}\n\n {bw.filteredServices.length === 0 ? (\n <div className=\"idk-state\">No services match your filters.</div>\n ) : (\n <div\n className={[\n \"idk-services\",\n serviceLayout === \"grid\" ? \"idk-services--grid\" : \"idk-services--list\",\n ].join(\" \")}\n style={{\n ...(serviceLayout === \"grid\"\n ? { gridTemplateColumns: `repeat(${Math.max(1, serviceColumns)}, minmax(0, 1fr))` }\n : undefined),\n ...(serviceListMaxHeight ? { maxHeight: serviceListMaxHeight, overflow: \"auto\" } : undefined),\n }}\n >\n {bw.pagedServices.map((service) => {\n const isSelected = bw.selectedService?.id === service.id\n return (\n <button\n key={service.id}\n type=\"button\"\n className={[\"idk-card\", \"idk-card--clickable\", isSelected ? \"is-active\" : \"\"].join(\" \")}\n onClick={() => bw.selectService(service)}\n >\n <div className=\"idk-card__header\">\n <span className=\"idk-card__title\">{service.name}</span>\n <span className=\"idk-card__aside\">\n {isSelected ? <span className=\"idk-card__check\">✓</span> : null}\n {typeof service.price === \"number\" && service.price > 0 ? (\n <span className=\"idk-card__price\">\n ${(service.price / 100).toFixed(2)}\n </span>\n ) : null}\n </span>\n </div>\n {service.description ? (\n <div className=\"idk-card__description\">{service.description}</div>\n ) : null}\n <div className=\"idk-card__meta\">\n <span>{bw.formatDuration(service.duration)}</span>\n {service.category ? <span className=\"idk-pill\">{service.category}</span> : null}\n </div>\n </button>\n )\n })}\n </div>\n )}\n\n <div className=\"idk-booking__actions\">\n {shouldPaginate ? (\n <button\n type=\"button\"\n className=\"idk-button idk-button--ghost\"\n onClick={bw.loadMoreServices}\n disabled={!bw.hasMoreServices}\n >\n {bw.hasMoreServices ? \"Show more services\" : \"All services shown\"}\n </button>\n ) : null}\n {bw.selectedService && !hookProps.autoAdvanceOnSelect ? (\n <button type=\"button\" className=\"idk-button\" onClick={bw.continueFromService}>\n Continue\n </button>\n ) : null}\n </div>\n </div>\n )}\n\n {bw.step === \"staff\" && (\n <div className=\"idk-booking__step\">\n <h4>Select a team member</h4>\n {bw.staffOptions.length === 0 ? (\n <div className=\"idk-state\">No team members available.</div>\n ) : (\n <div\n className={[\n \"idk-team\",\n staffLayout === \"grid\" ? \"idk-team--grid\" : \"idk-team--list\",\n ].join(\" \")}\n style={\n staffLayout === \"grid\"\n ? { gridTemplateColumns: `repeat(${Math.max(1, staffColumns)}, minmax(0, 1fr))` }\n : undefined\n }\n >\n {(hookProps.showAnyStaffOption ?? true) && bw.canSkipStaff ? (\n <button\n key=\"any-staff\"\n type=\"button\"\n className={[\"idk-card\", \"idk-card--clickable\", !bw.selectedStaff ? \"is-active\" : \"\"].join(\" \")}\n onClick={() => bw.selectStaff(null)}\n >\n <div className=\"idk-card__header\">\n <span className=\"idk-card__title\">Any Available</span>\n <span className=\"idk-card__badge\">Recommended</span>\n </div>\n <p className=\"idk-card__description\">\n We&apos;ll match you with the first available stylist.\n </p>\n </button>\n ) : null}\n {bw.pagedStaff.map((staff) => (\n <button\n key={staff.id}\n type=\"button\"\n className={[\"idk-card\", \"idk-card--clickable\", bw.selectedStaff?.id === staff.id ? \"is-active\" : \"\"].join(\" \")}\n onClick={() => bw.selectStaff(staff)}\n >\n <div className=\"idk-team__card\">\n <div className=\"idk-team__avatar\">\n {staff.photo?.url ? (\n <img src={staff.photo.url} alt={staff.name} />\n ) : (\n <span>{staff.name.split(\" \").map((part) => part[0]).slice(0, 2).join(\"\").toUpperCase()}</span>\n )}\n </div>\n <div>\n <span className=\"idk-card__title\">{staff.name}</span>\n <span className=\"idk-card__meta\">{staff.role || \"Staff\"}</span>\n {staff.bio ? <p className=\"idk-card__description\">{renderLinkedText(staff.bio)}</p> : null}\n </div>\n </div>\n </button>\n ))}\n </div>\n )}\n <div className=\"idk-booking__actions\">\n {shouldPaginateStaff ? (\n <button\n type=\"button\"\n className=\"idk-button idk-button--ghost\"\n onClick={bw.loadMoreStaff}\n disabled={!bw.hasMoreStaff && bw.staffPage === 1}\n >\n {bw.hasMoreStaff ? \"Show more staff\" : bw.staffPage > 1 ? \"Show fewer staff\" : \"All staff shown\"}\n </button>\n ) : null}\n {bw.canSkipStaff ? (\n <button\n type=\"button\"\n className=\"idk-link\"\n onClick={() => {\n bw.selectStaff(null)\n bw.continueFromStaff()\n }}\n >\n Continue without selecting\n </button>\n ) : null}\n {!hookProps.autoAdvanceOnSelect ? (\n <button\n type=\"button\"\n className=\"idk-button\"\n onClick={bw.continueFromStaff}\n disabled={!bw.canSkipStaff && !bw.selectedStaff}\n >\n Continue\n </button>\n ) : null}\n </div>\n </div>\n )}\n\n {bw.step === \"time\" && (\n <div className=\"idk-booking__step\">\n <h4>Select a time</h4>\n {bw.isAvailabilityLoading ? (\n <div className=\"idk-state\">Loading availability...</div>\n ) : bw.availabilityDates.length > 0 ? (\n <div className={[\"idk-availability\", timeLayout === \"split\" ? \"idk-availability--split\" : \"\"].join(\" \")}>\n <div className=\"idk-availability__dates\">\n {(hookProps.datePickerMode ?? \"list\") === \"calendar\" ? (\n <div\n className={[\n \"idk-calendar\",\n calendarVariant === \"compact\" ? \"idk-calendar--compact\" : \"\",\n ].filter(Boolean).join(\" \")}\n >\n <div className=\"idk-calendar__header\">\n {calendarVariant === \"compact\" ? (\n <div className=\"idk-calendar__header idk-calendar__header--compact\">\n <button\n type=\"button\"\n className=\"idk-calendar__nav-btn\"\n onClick={bw.handlePrevMonth}\n disabled={bw.calendarMonth <= new Date(todayDate.getFullYear(), todayDate.getMonth(), 1)}\n aria-label=\"Previous month\"\n >\n {\"<\"}\n </button>\n <select\n className=\"idk-calendar__month-select\"\n value={`${bw.calendarMonth.getFullYear()}-${String(bw.calendarMonth.getMonth() + 1).padStart(2, \"0\")}`}\n onChange={(event) => bw.handleMonthSelect(event.target.value)}\n >\n {bw.monthOptions.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n <button\n type=\"button\"\n className=\"idk-calendar__nav-btn\"\n onClick={bw.handleNextMonth}\n disabled={Boolean(bw.maxAdvanceMonthStart && bw.calendarMonth >= bw.maxAdvanceMonthStart)}\n aria-label=\"Next month\"\n >\n {\">\"}\n </button>\n </div>\n ) : (\n <>\n <button\n type=\"button\"\n className=\"idk-button idk-button--ghost\"\n onClick={bw.handlePrevMonth}\n disabled={bw.calendarMonth <= new Date(todayDate.getFullYear(), todayDate.getMonth(), 1)}\n >\n Prev\n </button>\n <div className=\"idk-calendar__title\">\n {new Intl.DateTimeFormat(\"en-US\", { month: \"long\", year: \"numeric\" }).format(bw.calendarMonth)}\n </div>\n <button\n type=\"button\"\n className=\"idk-button idk-button--ghost\"\n onClick={bw.handleNextMonth}\n disabled={Boolean(bw.maxAdvanceMonthStart && bw.calendarMonth >= bw.maxAdvanceMonthStart)}\n >\n Next\n </button>\n </>\n )}\n </div>\n <div className=\"idk-calendar__weekdays\">\n {[\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"].map((label) => (\n <span key={label}>{label}</span>\n ))}\n </div>\n <div className=\"idk-calendar__grid\">\n {bw.calendarDays.map((day) => {\n const entry = bw.availabilityByDate.get(day.date)\n const hasAvailable = entry?.slots?.some((slot: AvailabilitySlot) => slot.available) ?? false\n const dateValue = parseDateOnly(day.date)\n const isPast = dateValue ? dateValue < todayDate : false\n const isBeyondMax = bw.maxAdvanceDate ? (dateValue ? dateValue > bw.maxAdvanceDate : false) : false\n const weekday = dateValue ? dateValue.getDay() : null\n const isDisabledWeekday = weekday !== null ? disabledWeekdaysSet.has(weekday) : false\n const isBlocked = Boolean(entry) && !hasAvailable\n const isDisabled = !entry || isPast || isBeyondMax || isBlocked || isDisabledWeekday\n const isActive = bw.selectedDate === day.date\n return (\n <button\n key={day.date}\n type=\"button\"\n className={[\n \"idk-calendar__day\",\n day.isCurrentMonth ? \"\" : \"is-muted\",\n hasAvailable ? \"is-available\" : \"\",\n isBlocked ? \"is-blocked\" : \"\",\n isDisabledWeekday ? \"is-disabled\" : \"\",\n isActive ? \"is-active\" : \"\",\n ].filter(Boolean).join(\" \")}\n disabled={isDisabled}\n onClick={() => bw.selectDate(day.date)}\n >\n <span>{day.date.split(\"-\")[2]}</span>\n {showFullyBookedLabel && isBlocked && day.isCurrentMonth ? (\n <span className=\"idk-calendar__label\">\n {calendarVariant === \"compact\" ? \"•\" : \"Fully booked\"}\n </span>\n ) : null}\n </button>\n )\n })}\n </div>\n {showFullyBookedLabel && calendarVariant === \"compact\" && bw.hasBlockedInCalendarView ? (\n <div className=\"idk-calendar__legend\">\n <span className=\"idk-calendar__legend-dot\">•</span> Fully booked\n </div>\n ) : null}\n </div>\n ) : (\n <>\n {enableDatePaging ? (\n <div className=\"idk-availability__nav\">\n <button\n type=\"button\"\n className=\"idk-button idk-button--ghost\"\n onClick={bw.handlePrevDates}\n disabled={bw.availabilityStartDate <= new Date().toISOString().slice(0, 10)}\n >\n Previous\n </button>\n <button\n type=\"button\"\n className=\"idk-button idk-button--ghost\"\n onClick={bw.handleNextDates}\n >\n Next\n </button>\n </div>\n ) : null}\n {bw.availabilityDates.map((entry) => (\n <button\n key={entry.date}\n type=\"button\"\n className={entry.date === bw.selectedDate ? \"is-active\" : undefined}\n onClick={() => bw.selectDate(entry.date)}\n >\n <span className=\"idk-date-chip__day\">{bw.formatDateLabel(entry.date)}</span>\n </button>\n ))}\n </>\n )}\n </div>\n <div className=\"idk-availability__panel\">\n <div className=\"idk-availability__panel-header\">\n <div>\n <div className=\"idk-availability__panel-title\">\n {bw.selectedDate\n ? bw.formatDateHeading(bw.selectedDate)\n : bw.availabilityDates[0]?.date\n ? bw.formatDateHeading(bw.availabilityDates[0].date)\n : \"Select a date\"}\n </div>\n <div className=\"idk-availability__panel-subtitle\">{bw.timeZoneLabel}</div>\n </div>\n </div>\n <div className=\"idk-availability__slots\">\n {(() => {\n const activeEntry = bw.selectedDate\n ? bw.availabilityDates.find((entry) => entry.date === bw.selectedDate)\n : bw.availabilityDates[0]\n if (!activeEntry) return <div className=\"idk-state\">Select a date to see times.</div>\n const availableSlots = (activeEntry.slots || [])\n .filter((slot: AvailabilitySlot) => slot.available)\n .sort((a, b) => {\n const aTime = new Date(a.time).getTime() || Number.POSITIVE_INFINITY\n const bTime = new Date(b.time).getTime() || Number.POSITIVE_INFINITY\n if (aTime === bTime) {\n const aEnd = new Date(a.endTime).getTime() || Number.POSITIVE_INFINITY\n const bEnd = new Date(b.endTime).getTime() || Number.POSITIVE_INFINITY\n return aEnd - bEnd\n }\n return aTime - bTime\n })\n\n const slots = availableSlots.filter(\n (slot, index) =>\n index === 0 ||\n slot.time !== availableSlots[index - 1].time ||\n slot.endTime !== availableSlots[index - 1].endTime,\n )\n\n if (slots.length === 0) {\n return <div className=\"idk-state\">No available times for this date.</div>\n }\n return slots.map((slot, index) => (\n <button\n key={`${activeEntry.date}-${slot.time}-${slot.endTime}-${index}`}\n type=\"button\"\n className={\n slot.time === bw.selectedTime && slot.endTime === bw.selectedEndTime\n ? \"is-active\"\n : undefined\n }\n onClick={() => {\n const date = bw.selectedDate || activeEntry.date\n if (!bw.selectedDate) bw.selectDate(date)\n bw.selectTime(slot.time, slot.endTime)\n }}\n >\n {bw.formatTimeLabel(slot.time)}\n </button>\n ))\n })()}\n </div>\n </div>\n </div>\n ) : (\n <div className=\"idk-state\">No availability found.</div>\n )}\n {!hookProps.autoAdvanceOnSelect ? (\n <div className=\"idk-booking__actions\">\n <button\n type=\"button\"\n className=\"idk-button\"\n onClick={bw.continueFromTime}\n disabled={!bw.selectedTime || !bw.selectedEndTime}\n >\n Continue\n </button>\n </div>\n ) : null}\n </div>\n )}\n\n {bw.step === \"details\" && (\n <form className=\"idk-form\" onSubmit={bw.submitBooking}>\n <h4>Your details</h4>\n {bw.bookingError ? <div className=\"idk-booking__error\">{bw.bookingError}</div> : null}\n {bw.selectedService && bw.selectedTime ? (\n <div className=\"idk-booking__summary\">\n <div>\n <span className=\"idk-booking__summary-label\">Service</span>\n <p>{bw.selectedService.name}</p>\n </div>\n {bw.selectedStaff ? (\n <div>\n <span className=\"idk-booking__summary-label\">Staff</span>\n <p>{bw.selectedStaff.name}</p>\n </div>\n ) : null}\n <div>\n <span className=\"idk-booking__summary-label\">When</span>\n <p>{bw.formatDateHeading(bw.selectedDate || \"\")} · {bw.formatTimeLabel(bw.selectedTime)}</p>\n </div>\n {bw.selectedService.price ? (\n <div>\n <span className=\"idk-booking__summary-label\">Price</span>\n <p>${(bw.selectedService.price / 100).toFixed(2)}</p>\n </div>\n ) : null}\n </div>\n ) : null}\n <label className=\"idk-form__field\">\n <span>Name</span>\n <input\n value={bw.details.name}\n onChange={(event) => bw.setDetails((prev) => ({ ...prev, name: event.target.value }))}\n required\n />\n </label>\n <label className=\"idk-form__field\">\n <span>Email</span>\n <input\n type=\"email\"\n value={bw.details.email}\n onChange={(event) => bw.setDetails((prev) => ({ ...prev, email: event.target.value }))}\n required\n />\n </label>\n <label className=\"idk-form__field\">\n <span>Phone</span>\n <input\n value={bw.details.phone}\n onChange={(event) => bw.setDetails((prev) => ({ ...prev, phone: event.target.value }))}\n />\n </label>\n <label className=\"idk-form__field\">\n <span>Notes</span>\n <textarea\n rows={4}\n value={bw.details.notes}\n onChange={(event) => bw.setDetails((prev) => ({ ...prev, notes: event.target.value }))}\n />\n </label>\n <button type=\"submit\" className=\"idk-button\" disabled={bw.isSubmitting}>\n {bw.isSubmitting ? \"Booking...\" : \"Confirm booking\"}\n </button>\n </form>\n )}\n\n {bw.step === \"done\" && (\n <div className=\"idk-booking__done\">\n <div className=\"idk-booking__done-title\">Booking confirmed!</div>\n <p className=\"idk-booking__done-text\">\n We&apos;ll send a confirmation email shortly with your appointment details.\n </p>\n <button type=\"button\" className=\"idk-link\" onClick={bw.reset}>\n Book another appointment\n </button>\n </div>\n )}\n </div>\n )\n}\n","\"use client\";\n\nimport { useRef, useEffect, useState, type FormEvent, type ComponentType, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useBookingWidget } from \"../core/hooks/useBookingWidget\";\nimport { useServices } from \"../core/hooks/useServices\";\nimport { useTeam } from \"../core/hooks/useTeam\";\nimport {\n Scissors, Sparkles, Heart, Palette, CircleDot, User,\n ChevronLeft, ChevronRight, ChevronDown,\n Check, ArrowRight, ArrowLeft, Globe, Menu, X,\n} from \"lucide-react\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport Scrollbar from \"smooth-scrollbar\";\nimport OverscrollPlugin from \"smooth-scrollbar/plugins/overscroll\";\n\nScrollbar.use(OverscrollPlugin);\n\n/* ── Default step titles ── */\nconst DEFAULT_STEP_TITLES: [string, string, string, string] = [\n \"Schedule your visit\",\n \"Select your service\",\n \"Pick a date & time\",\n \"Your details\",\n];\n\n/* ── Category icon mapping ── */\nconst DEFAULT_CATEGORY_ICONS: Record<string, typeof Scissors> = {\n hair: Scissors, cut: Scissors, barber: Scissors, styling: Scissors,\n skin: Sparkles, facial: Sparkles, beauty: Sparkles,\n massage: Heart, wellness: Heart, spa: Heart,\n nail: Palette, color: Palette, manicure: Palette, pedicure: Palette,\n};\n\nfunction getCategoryIcon(name: string, overrides?: Record<string, typeof Scissors>) {\n const map = { ...DEFAULT_CATEGORY_ICONS, ...overrides };\n const lower = name.toLowerCase();\n for (const [kw, Icon] of Object.entries(map)) {\n if (lower.includes(kw)) return Icon;\n }\n return CircleDot;\n}\n\nfunction getInitials(name: string) {\n return name.split(\" \").map((w) => w[0]).join(\"\").slice(0, 2).toUpperCase();\n}\n\nfunction truncate(str: string, max: number) {\n return str.length > max ? str.slice(0, max) + \"\\u2026\" : str;\n}\n\n/* ── Default mobile nav icon ── */\nfunction DefaultMenuIcon() { return <Menu size={20} />; }\nfunction DefaultCloseIcon() { return <X size={20} />; }\n\n/* ── Default link component (plain anchor) ── */\nfunction DefaultLink({ href, className, onClick, children }: {\n href: string;\n className?: string;\n onClick?: () => void;\n children: ReactNode;\n}) {\n return <a href={href} className={className} onClick={onClick}>{children}</a>;\n}\n\nexport interface BookingWidgetProps {\n /** Navigation links shown in the mobile menu overlay. Omit to hide hamburger. */\n navLinks?: { label: string; href: string }[];\n /** Custom icon for the mobile menu open button (default: lucide Menu) */\n menuIcon?: ReactNode;\n /** Custom icon for the mobile menu close button (default: lucide X) */\n closeIcon?: ReactNode;\n /** Override the category → icon mapping (keyword → React component) */\n categoryIcons?: Record<string, typeof Scissors>;\n /** Override step titles for mobile flow */\n stepTitles?: [string, string, string, string];\n /**\n * Link component for mobile nav. Defaults to a plain `<a>` tag.\n * Next.js sites should pass `Link` from `next/link` for client-side navigation.\n */\n linkComponent?: ComponentType<{ href: string; className?: string; onClick?: () => void; children: ReactNode }>;\n}\n\nexport function BookingWidgetPanel({\n navLinks = [],\n menuIcon,\n closeIcon,\n categoryIcons,\n stepTitles,\n linkComponent: LinkComp = DefaultLink,\n}: BookingWidgetProps = {}) {\n const widgetRef = useRef<HTMLDivElement>(null);\n const formRef = useRef<HTMLFormElement>(null);\n const catScrollRef = useRef<HTMLDivElement>(null);\n const svcScrollbarRef = useRef<ReturnType<typeof Scrollbar.init> | null>(null);\n const rightScrollRef = useRef<HTMLDivElement>(null);\n const staffTriggerRef = useRef<HTMLButtonElement>(null);\n const mobileBodyRef = useRef<HTMLDivElement>(null);\n const mobileScrollbarRef = useRef<ReturnType<typeof Scrollbar.init> | null>(null);\n const portalRef = useRef<HTMLDivElement>(null);\n\n const [mobileStep, setMobileStep] = useState(1);\n const [monthOpen, setMonthOpen] = useState(false);\n const [staffOpen, setStaffOpen] = useState(false);\n const [navOpen, setNavOpen] = useState(false);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const [localStaff, setLocalStaff] = useState<any>(null);\n\n const { data, isLoading: servicesLoading, error: servicesError } = useServices();\n const { data: teamData } = useTeam();\n const allStaff = teamData?.team || [];\n\n const bw = useBookingWidget({\n widgetRef,\n services: data?.services,\n autoAdvanceOnSelect: false,\n scrollToStep: false,\n datePickerMode: \"calendar\",\n calendarVariant: \"default\",\n enableCategoryFilter: true,\n enableServiceSearch: false,\n showStaffSelection: true,\n showAnyStaffOption: true,\n maxAdvanceMonths: 3,\n servicePageSize: 50,\n });\n\n /* ── Auto-select first available date ── */\n const todayStr = new Date().toISOString().split(\"T\")[0];\n useEffect(() => {\n if (bw.isAvailabilityLoading || !bw.selectedService || !bw.availabilityByDate) return;\n if (bw.selectedDate) return;\n for (const day of bw.calendarDays) {\n if (!day.isCurrentMonth || day.date < todayStr) continue;\n const entry = bw.availabilityByDate.get(day.date);\n if (entry && entry.slots?.some((s: { available: boolean }) => s.available)) {\n bw.selectDate(day.date);\n break;\n }\n }\n }, [bw.isAvailabilityLoading, bw.selectedService?.id, bw.availabilityByDate, bw.selectedDate]);\n\n /* ── Auto-select first category ── */\n const hasCategories = bw.categories.length >= 1;\n const hasMultipleCategories = bw.categories.length > 1;\n useEffect(() => {\n if (hasCategories && bw.categoryFilter === \"all\") {\n bw.setCategoryFilter(bw.categories[0]);\n }\n }, [bw.categories.length]);\n\n /* ── Keep staff selection in sync (hook resets it on service select) ── */\n useEffect(() => {\n if (localStaff && !bw.selectedStaff) {\n bw.selectStaff(localStaff);\n }\n }, [bw.selectedStaff, localStaff]);\n\n /* ── Smooth-scrollbar (services list + right column, desktop) ── */\n const isReady =\n !servicesLoading && !bw.isServicesLoading && !!data?.services?.length && bw.step !== \"done\";\n\n useEffect(() => {\n if (!isReady) return;\n const mq = window.matchMedia(\"(min-width: 1025px)\");\n const scrollbars: ReturnType<typeof Scrollbar.init>[] = [];\n\n const opts = {\n damping: 0.08,\n continuousScrolling: true,\n alwaysShowTracks: false,\n plugins: {\n overscroll: { effect: \"bounce\" as const, damping: 0.15, maxOverscroll: 80 },\n },\n };\n\n const init = () => {\n scrollbars.forEach((sb) => sb.destroy());\n scrollbars.length = 0;\n if (mq.matches && catScrollRef.current) {\n scrollbars.push(Scrollbar.init(catScrollRef.current, opts));\n }\n if (mq.matches && rightScrollRef.current) {\n scrollbars.push(Scrollbar.init(rightScrollRef.current, opts));\n }\n };\n\n requestAnimationFrame(init);\n mq.addEventListener(\"change\", init);\n return () => {\n mq.removeEventListener(\"change\", init);\n scrollbars.forEach((sb) => sb.destroy());\n };\n }, [isReady, mobileStep]);\n\n /* ── Services scrollbar (on wrapper ABOVE React content so reconciliation is safe) ── */\n const initSvcScrollbar = (el: HTMLDivElement | null) => {\n if (!el || (typeof window !== \"undefined\" && window.matchMedia(\"(max-width: 1024px)\").matches)) {\n if (svcScrollbarRef.current) {\n try { svcScrollbarRef.current.destroy(); } catch { /* already gone */ }\n svcScrollbarRef.current = null;\n }\n return;\n }\n // If already initialized on this element, just recalculate sizes\n if (svcScrollbarRef.current && svcScrollbarRef.current.containerEl === el) {\n svcScrollbarRef.current.update();\n return;\n }\n if (svcScrollbarRef.current) {\n try { svcScrollbarRef.current.destroy(); } catch { /* already gone */ }\n svcScrollbarRef.current = null;\n }\n svcScrollbarRef.current = Scrollbar.init(el, {\n damping: 0.08,\n continuousScrolling: true,\n alwaysShowTracks: false,\n plugins: {\n overscroll: { effect: \"bounce\" as const, damping: 0.15, maxOverscroll: 80 },\n },\n });\n };\n\n /* ── Mobile body scroll (bounce overscroll via smooth-scrollbar) ── */\n useEffect(() => {\n if (!isReady) return;\n const mq = window.matchMedia(\"(max-width: 1024px)\");\n\n const init = () => {\n if (mobileScrollbarRef.current) {\n try { mobileScrollbarRef.current.destroy(); } catch { /* already gone */ }\n mobileScrollbarRef.current = null;\n }\n if (mq.matches && mobileBodyRef.current) {\n mobileScrollbarRef.current = Scrollbar.init(mobileBodyRef.current, {\n damping: 0.08,\n continuousScrolling: false,\n alwaysShowTracks: false,\n plugins: {\n overscroll: { effect: \"bounce\" as const, damping: 0.15, maxOverscroll: 80 },\n },\n });\n }\n };\n\n requestAnimationFrame(init);\n mq.addEventListener(\"change\", init);\n return () => {\n mq.removeEventListener(\"change\", init);\n if (mobileScrollbarRef.current) {\n try { mobileScrollbarRef.current.destroy(); } catch { /* already gone */ }\n mobileScrollbarRef.current = null;\n }\n };\n }, [isReady]);\n\n /* ── Scroll to top on mobile step change ── */\n useEffect(() => {\n if (mobileScrollbarRef.current) {\n mobileScrollbarRef.current.scrollTo(0, 0, 0);\n mobileScrollbarRef.current.update();\n }\n }, [mobileStep]);\n\n /* ── Helpers ── */\n const formatPrice = (cents: number) => {\n const d = cents / 100;\n return d % 1 === 0 ? `$${d.toFixed(0)}` : `$${d.toFixed(2)}`;\n };\n\n const handleFormSubmit = (e: FormEvent) => {\n e.preventDefault();\n bw.submitBooking(e);\n };\n\n const canAdvanceStep1 = bw.categoryFilter !== \"all\";\n const canAdvanceStep2 = !!bw.selectedService;\n const canAdvanceStep3 = !!bw.selectedTime;\n const canSubmit = !!bw.selectedService && !!bw.selectedTime && !bw.isSubmitting;\n\n /* ── Filter services by selected staff ── */\n const selectedStaff = localStaff as { id: string; name: string; bio?: string; photo?: { url?: string } } | null;\n const isServiceForStaff = (svc: { assignedStaff?: { id: string }[] }) => {\n if (!selectedStaff) return true;\n if (!svc.assignedStaff?.length) return true;\n return svc.assignedStaff.some((s) => s.id === selectedStaff.id);\n };\n const staffFilteredServices = bw.pagedServices.filter(isServiceForStaff);\n\n /* ── Loading skeleton ── */\n if (servicesLoading || bw.isServicesLoading) {\n return (\n <div className=\"bw\" ref={widgetRef}>\n <div className=\"bw-header\">\n <div className=\"bw-skel bw-skel--text\" style={{ width: 220, height: 28 }} />\n </div>\n {/* Desktop skeleton */}\n <div className=\"bw-body bw-skel-desktop\">\n <div className=\"bw-col bw-col--left\">\n <div className=\"bw-skel bw-skel--text\" style={{ width: 100, height: 12, marginBottom: 10 }} />\n <div className=\"bw-skel bw-skel--card\" style={{ height: 52 }} />\n <div className=\"bw-skel bw-skel--text\" style={{ width: 100, height: 12, marginTop: 20, marginBottom: 10 }} />\n <div className=\"bw-skel-list\">\n {[...Array(3)].map((_, i) => (\n <div key={i} className=\"bw-skel bw-skel--card\" style={{ height: 56 }} />\n ))}\n </div>\n </div>\n <div className=\"bw-col bw-col--center\">\n <div className=\"bw-skel bw-skel--calendar\" style={{ height: \"100%\" }} />\n </div>\n <div className=\"bw-col bw-col--right\">\n <div className=\"bw-skel-list\">\n {[...Array(3)].map((_, i) => (\n <div key={i} className=\"bw-skel bw-skel--input\" />\n ))}\n <div className=\"bw-skel bw-skel--input\" style={{ height: 80 }} />\n <div className=\"bw-skel bw-skel--card\" style={{ height: 48, marginTop: 16 }} />\n </div>\n </div>\n </div>\n {/* Mobile skeleton */}\n <div className=\"bw-skel-mobile\">\n <div className=\"bw-skel bw-skel--text\" style={{ width: 100, height: 12, marginBottom: 10 }} />\n <div className=\"bw-skel bw-skel--card\" style={{ height: 52 }} />\n <div className=\"bw-skel bw-skel--text\" style={{ width: 100, height: 12, marginTop: 24, marginBottom: 10 }} />\n {[...Array(4)].map((_, i) => (\n <div key={i} className=\"bw-skel bw-skel--card\" style={{ height: 52 }} />\n ))}\n <div className=\"bw-skel bw-skel--card\" style={{ height: 48, marginTop: \"auto\" }} />\n </div>\n </div>\n );\n }\n\n if (servicesError) {\n const message = servicesError instanceof Error ? servicesError.message : \"Unable to load services.\";\n return (\n <div className=\"bw\" ref={widgetRef}>\n <div className=\"bw-empty\">Booking is unavailable right now. {message}</div>\n </div>\n );\n }\n\n if (!data?.services?.length) {\n return (\n <div className=\"bw\" ref={widgetRef}>\n <div className=\"bw-empty\">No services are configured yet.</div>\n </div>\n );\n }\n\n if (bw.step === \"done\") {\n return (\n <div className=\"bw\" ref={widgetRef}>\n <div className=\"bw-done\">\n <div className=\"bw-done-icon\">\n <Check size={28} strokeWidth={2.5} />\n </div>\n <h3 className=\"bw-done-title\">You&apos;re All Set!</h3>\n <p className=\"bw-done-text\">\n We&apos;ve received your booking request. You&apos;ll get a confirmation\n email shortly with all the details.\n </p>\n <button className=\"bw-btn-primary\" onClick={bw.reset}>\n Book Another Visit\n </button>\n </div>\n </div>\n );\n }\n\n /* ── Render a single service row (reused in desktop inline + mobile step 2) ── */\n const renderServiceRow = (\n svc: (typeof bw.pagedServices)[number],\n variant: \"inline\" | \"full\" = \"inline\",\n ) => {\n const sel = bw.selectedService?.id === svc.id;\n const imgUrl = (svc as any).image?.url as string | undefined;\n const desc = (svc as any).description as string | undefined;\n\n /* ── Mobile step 2: full variant ── */\n if (variant === \"full\") {\n const duration = svc.duration != null ? bw.formatDuration(svc.duration) : null;\n const hasImg = !!imgUrl;\n return (\n <button\n key={svc.id}\n className={`bw-svc-row bw-svc-row--full ${hasImg ? \"bw-svc-row--has-img\" : \"\"} ${sel ? \"is-active\" : \"\"}`}\n onClick={() => bw.selectService(svc)}\n >\n <span className={`bw-check bw-check--lg ${sel ? \"is-checked\" : \"\"}`}>\n {sel && <Check size={12} />}\n </span>\n <span className=\"bw-svc-info\">\n <span className=\"bw-svc-name\">{svc.name}</span>\n {duration && <span className=\"bw-svc-meta\">{duration}</span>}\n {desc && <span className=\"bw-svc-desc\">{desc}</span>}\n </span>\n {hasImg ? (\n <span className=\"bw-svc-img\">\n <img src={imgUrl} alt={svc.name} />\n {svc.price != null && (\n <span className=\"bw-svc-badge\">{formatPrice(Number(svc.price))}</span>\n )}\n </span>\n ) : (\n svc.price != null && (\n <span className=\"bw-svc-price\">{formatPrice(Number(svc.price))}</span>\n )\n )}\n </button>\n );\n }\n\n /* ── Desktop: inline variant (inside accordion) ── */\n const meta = [\n svc.duration != null ? bw.formatDuration(svc.duration) : null,\n svc.price != null ? formatPrice(Number(svc.price)) : null,\n ].filter(Boolean).join(\" \\u00b7 \");\n return (\n <button\n key={svc.id}\n className={`bw-svc-row ${sel ? \"is-active\" : \"\"}`}\n onClick={() => bw.selectService(svc)}\n >\n <span className={`bw-check ${sel ? \"is-checked\" : \"\"}`}>\n {sel && <Check size={11} />}\n </span>\n <span className=\"bw-svc-info\">\n <span className=\"bw-svc-name\">{svc.name}</span>\n {meta && <span className=\"bw-svc-meta\">{meta}</span>}\n {desc && <span className=\"bw-svc-desc\">{desc}</span>}\n </span>\n {imgUrl && (\n <span className=\"bw-svc-thumb\">\n <img src={imgUrl} alt={svc.name} />\n </span>\n )}\n </button>\n );\n };\n\n /* ══════════════════════════════════════════════════\n MAIN RENDER\n ══════════════════════════════════════════════════ */\n return (\n <div className=\"bw\" ref={widgetRef}>\n {/* ── Mobile top bar ── */}\n <div className=\"bw-topbar\">\n <div className=\"bw-dots\">\n {Array.from({ length: 4 }, (_, i) => (\n <div key={i} className={`bw-dot ${mobileStep > i ? \"is-filled\" : \"\"}`} />\n ))}\n </div>\n {navLinks.length > 0 && (\n <button\n className=\"bw-topbar-menu\"\n onClick={() => setNavOpen((o) => !o)}\n aria-label={navOpen ? \"Close menu\" : \"Open menu\"}\n >\n {navOpen ? (closeIcon || <DefaultCloseIcon />) : (menuIcon || <DefaultMenuIcon />)}\n </button>\n )}\n </div>\n\n {/* ── Mobile nav overlay ── */}\n {navLinks.length > 0 && (\n <AnimatePresence>\n {navOpen && (\n <motion.div\n className=\"bw-nav-overlay\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.2 }}\n >\n <nav className=\"bw-nav\">\n {navLinks.map((link) => (\n <LinkComp\n key={link.href}\n href={link.href}\n className=\"bw-nav-link\"\n onClick={() => setNavOpen(false)}\n >\n {link.label}\n </LinkComp>\n ))}\n </nav>\n </motion.div>\n )}\n </AnimatePresence>\n )}\n\n {/* ── Header ── */}\n <div className=\"bw-header\">\n <h2 className=\"bw-title bw-title--desktop\">Schedule your visit</h2>\n <h2 className=\"bw-title bw-title--mobile\">{(stepTitles || DEFAULT_STEP_TITLES)[mobileStep - 1]}</h2>\n </div>\n\n\n {/* ── Body ── */}\n <div className=\"bw-body\" data-mobile-step={mobileStep} ref={mobileBodyRef}>\n <div className=\"bw-body-inner\">\n\n {/* === LEFT COLUMN === */}\n <div className=\"bw-col bw-col--left\">\n\n {/* ── STEP 1: Specialist dropdown + Category accordion ── */}\n <div className=\"bw-step-1\">\n {/* Staff custom dropdown */}\n <label className=\"bw-label\">Select Specialist</label>\n <div className=\"bw-staff-dropdown\">\n <button\n ref={staffTriggerRef}\n className={`bw-staff-trigger${selectedStaff ? \" has-value\" : \"\"}`}\n onClick={() => setStaffOpen((o) => !o)}\n >\n <AnimatePresence mode=\"wait\" initial={false}>\n <motion.span\n key={selectedStaff?.id ?? \"any\"}\n className=\"bw-staff-trigger-content\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n >\n {selectedStaff ? (\n <>\n <span className=\"bw-staff-avatar\">\n {selectedStaff.photo?.url ? (\n <img src={selectedStaff.photo.url} alt={selectedStaff.name} />\n ) : (\n <span className=\"bw-staff-initials\">{getInitials(selectedStaff.name)}</span>\n )}\n </span>\n <span className=\"bw-staff-trigger-info\">\n <span className=\"bw-staff-trigger-name\">{selectedStaff.name}</span>\n {selectedStaff.bio && (\n <span className=\"bw-staff-trigger-desc\">{truncate(selectedStaff.bio, 40)}</span>\n )}\n </span>\n </>\n ) : (\n <>\n <span className=\"bw-staff-avatar bw-staff-avatar--placeholder\">\n <User size={14} />\n </span>\n <span className=\"bw-staff-trigger-info\">\n <span className=\"bw-staff-trigger-name\">Any available specialist</span>\n </span>\n </>\n )}\n </motion.span>\n </AnimatePresence>\n <ChevronDown size={16} className=\"bw-staff-trigger-chevron\" />\n </button>\n\n {portalRef.current && createPortal(\n <AnimatePresence>\n {staffOpen && (() => {\n const rect = staffTriggerRef.current?.getBoundingClientRect();\n return (\n <>\n <motion.div\n className=\"bw-staff-overlay\"\n onClick={() => setStaffOpen(false)}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n />\n <motion.div\n className=\"bw-staff-list\"\n initial={{ opacity: 0, y: -8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -8 }}\n transition={{ duration: 0.2, ease: [0.4, 0, 0.2, 1] }}\n style={rect ? {\n top: rect.bottom + 4,\n left: rect.left,\n width: rect.width,\n } : undefined}\n >\n {/* Any Available option */}\n <button\n className={`bw-staff-option${!selectedStaff ? \" is-active\" : \"\"}`}\n onClick={() => { setLocalStaff(null); bw.selectStaff(null); bw.selectService(null as any); setStaffOpen(false); }}\n >\n <span className=\"bw-staff-avatar bw-staff-avatar--placeholder\">\n <User size={14} />\n </span>\n <span className=\"bw-staff-option-info\">\n <span className=\"bw-staff-option-name\">Any Available</span>\n <span className=\"bw-staff-option-desc\">First available specialist</span>\n </span>\n </button>\n\n {allStaff.map((member) => {\n const active = selectedStaff?.id === member.id;\n const photoUrl = member.photo?.url;\n return (\n <button\n key={member.id}\n className={`bw-staff-option${active ? \" is-active\" : \"\"}`}\n onClick={() => { setLocalStaff(member); bw.selectStaff(member); bw.selectService(null as any); setStaffOpen(false); }}\n >\n <span className=\"bw-staff-avatar\">\n {photoUrl ? (\n <img src={photoUrl} alt={member.name} />\n ) : (\n <span className=\"bw-staff-initials\">{getInitials(member.name)}</span>\n )}\n </span>\n <span className=\"bw-staff-option-info\">\n <span className=\"bw-staff-option-name\">{member.name}</span>\n {member.bio && (\n <span className=\"bw-staff-option-desc\">{truncate(member.bio, 60)}</span>\n )}\n </span>\n </button>\n );\n })}\n </motion.div>\n </>\n );\n })()}\n </AnimatePresence>,\n portalRef.current\n )}\n </div>\n\n {/* Category accordion cards */}\n {hasMultipleCategories && (\n <>\n <label className=\"bw-label\">Select Category</label>\n <div className=\"bw-cat-scroll\" ref={catScrollRef}>\n {bw.categories.map((cat, catIdx) => {\n const active = bw.categoryFilter === cat;\n const Icon = getCategoryIcon(cat, categoryIcons);\n const catServices = (data?.services || [])\n .filter((s: any) => s.category === cat)\n .filter(isServiceForStaff);\n return (\n <div key={cat}>\n <button\n className={`bw-cat-card${active ? \" is-active\" : \"\"}`}\n onClick={() => bw.setCategoryFilter(active ? \"all\" : cat)}\n >\n <Icon size={20} className=\"bw-cat-icon\" />\n <span className=\"bw-cat-name\">{cat}</span>\n <motion.span\n className=\"bw-cat-chevron\"\n animate={{ rotate: active ? 90 : 0 }}\n transition={{ duration: 0.2, ease: \"easeOut\" }}\n >\n <ChevronRight size={16} />\n </motion.span>\n {active && (\n <span className=\"bw-cat-check\">\n <Check size={12} />\n </span>\n )}\n </button>\n\n {/* Expanded: scrollable services under active category */}\n <div\n className={`bw-svc-scroll ${active ? \"is-open\" : \"\"}`}\n ref={(el) => {\n if (!el) return;\n if (active) {\n const wrap = el.querySelector(\".bw-svc-scroll-wrap\") as HTMLDivElement | null;\n if (wrap) requestAnimationFrame(() => initSvcScrollbar(wrap));\n } else {\n if (svcScrollbarRef.current) {\n svcScrollbarRef.current.scrollTo(0, 0, 0);\n try { svcScrollbarRef.current.destroy(); } catch {}\n svcScrollbarRef.current = null;\n }\n }\n }}\n >\n <div className=\"bw-svc-scroll-wrap\">\n <div className=\"bw-svc-scroll-inner\">\n {catServices.length ? (\n catServices.map((svc: any) => renderServiceRow(svc))\n ) : (\n <p className=\"bw-no-services\">No services available</p>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </>\n )}\n\n {/* No categories: services directly */}\n {!hasMultipleCategories && (\n <div className=\"bw-svc-scroll is-open\">\n <div className=\"bw-svc-scroll-wrap\" ref={(el) => { if (el) requestAnimationFrame(() => initSvcScrollbar(el)); }}>\n <div className=\"bw-svc-scroll-inner\">\n {staffFilteredServices.length ? (\n <>\n {staffFilteredServices.map((svc) => renderServiceRow(svc))}\n {bw.hasMoreServices && (\n <button className=\"bw-load-more\" onClick={bw.loadMoreServices}>\n Show more services\n </button>\n )}\n </>\n ) : (\n <p className=\"bw-no-services\">No services available</p>\n )}\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* ── STEP 2: Services list (mobile view) ── */}\n <div className=\"bw-step-2\">\n {bw.categoryFilter !== \"all\" && (\n <p className=\"bw-step-2-heading\">{bw.categoryFilter}</p>\n )}\n {staffFilteredServices.length ? (\n <>\n {staffFilteredServices.map((svc) => (\n renderServiceRow(svc, \"full\")\n ))}\n {bw.hasMoreServices && (\n <button className=\"bw-load-more\" onClick={bw.loadMoreServices}>\n Show more services\n </button>\n )}\n </>\n ) : (\n <p className=\"bw-no-services\">No services available</p>\n )}\n </div>\n </div>\n\n {/* === CENTER COLUMN: Calendar + Time === */}\n <div className=\"bw-col bw-col--center\">\n <div className=\"bw-cal-card\">\n <div className=\"bw-cal-header\">\n <div className=\"bw-month-dropdown\">\n <button\n className=\"bw-month-btn\"\n onClick={() => setMonthOpen((o) => !o)}\n >\n <span>\n {bw.monthOptions.find(\n (o) =>\n o.value ===\n `${bw.calendarMonth.getFullYear()}-${String(bw.calendarMonth.getMonth() + 1).padStart(2, \"0\")}`,\n )?.label ?? \"Select month\"}\n </span>\n <ChevronDown size={14} />\n </button>\n <AnimatePresence>\n {monthOpen && (\n <>\n <motion.div\n className=\"bw-month-overlay\"\n onClick={() => setMonthOpen(false)}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n />\n <motion.div\n className=\"bw-month-list\"\n initial={{ opacity: 0, y: -8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -8 }}\n transition={{ duration: 0.2, ease: [0.4, 0, 0.2, 1] }}\n >\n {bw.monthOptions.map((opt) => {\n const cur = `${bw.calendarMonth.getFullYear()}-${String(bw.calendarMonth.getMonth() + 1).padStart(2, \"0\")}`;\n return (\n <button\n key={opt.value}\n className={`bw-month-option${opt.value === cur ? \" is-active\" : \"\"}`}\n onClick={() => {\n bw.handleMonthSelect(opt.value);\n setMonthOpen(false);\n }}\n >\n {opt.label}\n </button>\n );\n })}\n </motion.div>\n </>\n )}\n </AnimatePresence>\n </div>\n <div className=\"bw-cal-navs\">\n <button className=\"bw-cal-nav\" onClick={bw.handlePrevMonth} aria-label=\"Previous month\">\n <ChevronLeft size={18} />\n </button>\n <button\n className=\"bw-cal-nav\"\n onClick={bw.handleNextMonth}\n disabled={bw.maxAdvanceMonthStart ? bw.calendarMonth >= bw.maxAdvanceMonthStart : false}\n aria-label=\"Next month\"\n >\n <ChevronRight size={18} />\n </button>\n </div>\n </div>\n\n <AnimatePresence mode=\"wait\" initial={false}>\n <motion.div\n key={`${bw.calendarMonth.getFullYear()}-${bw.calendarMonth.getMonth()}`}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n >\n <div className=\"bw-cal-weekdays\">\n {[\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"].map((d) => (\n <span key={d}>{d}</span>\n ))}\n </div>\n\n <div className=\"bw-cal-grid\">\n {bw.calendarDays.map((day, i) => {\n const dateStr = day.date;\n const dateObj = new Date(dateStr + \"T00:00:00\");\n const avail = bw.availabilityByDate?.get(dateStr);\n const isAvailable = avail && avail.slots?.some((s) => s.available);\n const isSelected = bw.selectedDate === dateStr;\n const isToday = dateStr === todayStr;\n const isPast = dateStr < todayStr;\n const isBeyondMax = bw.maxAdvanceDate\n ? dateStr > bw.maxAdvanceDate.toISOString().split(\"T\")[0]\n : false;\n const isDisabled = !day.isCurrentMonth || isPast || isBeyondMax;\n\n return (\n <button\n key={i}\n className={[\n \"bw-cal-day\",\n !day.isCurrentMonth && \"is-outside\",\n isSelected && \"is-selected\",\n isAvailable && !isDisabled && \"is-available\",\n isToday && \"is-today\",\n isDisabled && \"is-disabled\",\n !isAvailable && day.isCurrentMonth && !isPast && !isBeyondMax && \"is-blocked\",\n ].filter(Boolean).join(\" \")}\n disabled={isDisabled || !isAvailable || isSelected}\n onClick={() => {\n bw.selectDate(dateStr);\n bw.selectTime(\"\", \"\");\n }}\n >\n {dateObj.getDate()}\n </button>\n );\n })}\n </div>\n </motion.div>\n </AnimatePresence>\n\n {!bw.selectedService && (\n <p className=\"bw-cal-prompt\">Please select a service to see availability.</p>\n )}\n\n {bw.selectedService && bw.isAvailabilityLoading && (\n <div className=\"bw-skel-slots\">\n <div className=\"bw-skel-slots-grid\">\n {[...Array(8)].map((_, i) => (\n <div key={i} className=\"bw-skel bw-skel--slot\" />\n ))}\n </div>\n </div>\n )}\n\n {bw.selectedService && bw.selectedDate && !bw.isAvailabilityLoading && (() => {\n const dateAvail = bw.availabilityByDate?.get(bw.selectedDate);\n const slots = dateAvail?.slots?.filter((s) => s.available) || [];\n if (!slots.length) {\n return <p className=\"bw-no-slots\">No available times for this date.</p>;\n }\n return (\n <>\n <div className=\"bw-time-divider\" />\n <div className=\"bw-time-slots\">\n {slots.map((slot, idx) => (\n <button\n key={idx}\n className={`bw-slot ${bw.selectedTime === slot.time ? \"is-active\" : \"\"}`}\n onClick={() => bw.selectTime(slot.time, slot.endTime)}\n >\n {bw.formatTimeLabel(slot.time)}\n </button>\n ))}\n </div>\n </>\n );\n })()}\n\n {bw.timeZoneLabel && (\n <div className=\"bw-timezone\">\n <Globe size={14} />\n <span>{bw.timeZoneLabel}</span>\n </div>\n )}\n </div>\n </div>\n\n {/* === RIGHT COLUMN: Details + Summary + Confirm === */}\n <div className=\"bw-col bw-col--right\">\n <div className=\"bw-right-scroll\" ref={rightScrollRef}>\n <div className=\"bw-right-inner\">\n <form className=\"bw-form\" ref={formRef} onSubmit={handleFormSubmit}>\n <div className=\"bw-form-fields\">\n <div className=\"bw-field\">\n <label htmlFor=\"bw-name\">Full name <span className=\"bw-required\">*</span></label>\n <input\n id=\"bw-name\"\n type=\"text\"\n required\n placeholder=\"John\"\n value={bw.details.name}\n onChange={(e) => bw.setDetails((p) => ({ ...p, name: e.target.value }))}\n />\n </div>\n <div className=\"bw-field\">\n <label htmlFor=\"bw-email\">Email <span className=\"bw-required\">*</span></label>\n <input\n id=\"bw-email\"\n type=\"email\"\n required\n placeholder=\"jane@example.com\"\n value={bw.details.email}\n onChange={(e) => bw.setDetails((p) => ({ ...p, email: e.target.value }))}\n />\n </div>\n <div className=\"bw-field\">\n <label htmlFor=\"bw-phone\">Phone</label>\n <input\n id=\"bw-phone\"\n type=\"tel\"\n placeholder=\"+1 (555) 000-0000\"\n value={bw.details.phone}\n onChange={(e) => bw.setDetails((p) => ({ ...p, phone: e.target.value }))}\n />\n </div>\n </div>\n\n <div className=\"bw-field bw-field--notes\">\n <label htmlFor=\"bw-notes\">Additional notes</label>\n <textarea\n id=\"bw-notes\"\n placeholder=\"Any preferences or special requests...\"\n rows={3}\n maxLength={500}\n style={{ resize: \"none\" }}\n value={bw.details.notes}\n onChange={(e) => bw.setDetails((p) => ({ ...p, notes: e.target.value }))}\n />\n <span className=\"bw-char-count\">{bw.details.notes?.length || 0}/500</span>\n </div>\n\n {bw.selectedService && (\n <div className=\"bw-summary\">\n <span className=\"bw-summary-title\">Booking Summary</span>\n <div className=\"bw-summary-rows\">\n <div className=\"bw-summary-row\">\n <span>Service</span>\n <span className=\"bw-summary-val\">{bw.selectedService.name}</span>\n </div>\n <div className=\"bw-summary-row\">\n <span>Specialist</span>\n <span className=\"bw-summary-val\">{selectedStaff?.name || \"Any Available\"}</span>\n </div>\n {bw.selectedDate && (\n <div className=\"bw-summary-row\">\n <span>Date</span>\n <span className=\"bw-summary-val\">{bw.formatDateLabel(bw.selectedDate)}</span>\n </div>\n )}\n {bw.selectedTime && (\n <div className=\"bw-summary-row\">\n <span>Time</span>\n <span className=\"bw-summary-val\">{bw.formatTimeLabel(bw.selectedTime)}</span>\n </div>\n )}\n {bw.selectedService.duration != null && (\n <div className=\"bw-summary-row\">\n <span>Duration</span>\n <span className=\"bw-summary-val\">{bw.formatDuration(bw.selectedService.duration)}</span>\n </div>\n )}\n {bw.selectedService.price != null && (\n <div className=\"bw-summary-row bw-summary-total\">\n <span>Estimated total</span>\n <span className=\"bw-summary-val\">\n {formatPrice(Number(bw.selectedService.price))}\n </span>\n </div>\n )}\n </div>\n </div>\n )}\n\n {bw.bookingError && <div className=\"bw-error\">{bw.bookingError}</div>}\n\n {!canSubmit && !bw.isSubmitting && (\n <p className=\"bw-confirm-hint\">\n {!bw.selectedService\n ? \"Please select a service to confirm booking.\"\n : !bw.selectedTime\n ? \"Please select a time to confirm booking.\"\n : \"\"}\n </p>\n )}\n\n <button type=\"submit\" className=\"bw-confirm-btn\" disabled={!canSubmit}>\n <span>{bw.isSubmitting ? \"Booking...\" : \"Confirm Booking\"}</span>\n {!bw.isSubmitting && <ArrowRight size={16} />}\n </button>\n </form>\n </div>\n </div>\n </div>\n </div>{/* /bw-body-inner */}\n </div>\n\n {/* ── Mobile footer ── */}\n <div className=\"bw-footer\">\n {/* Summary card (step 4 only) */}\n {mobileStep === 4 && bw.selectedService && (\n <div className=\"bw-footer-summary\">\n <span className=\"bw-summary-title\">Booking Summary</span>\n <div className=\"bw-summary-rows\">\n <div className=\"bw-summary-row\">\n <span>Service</span>\n <span className=\"bw-summary-val\">{bw.selectedService.name}</span>\n </div>\n <div className=\"bw-summary-row\">\n <span>Specialist</span>\n <span className=\"bw-summary-val\">{selectedStaff?.name || \"Any Available\"}</span>\n </div>\n {bw.selectedDate && (\n <div className=\"bw-summary-row\">\n <span>Date</span>\n <span className=\"bw-summary-val\">{bw.formatDateLabel(bw.selectedDate)}</span>\n </div>\n )}\n {bw.selectedTime && (\n <div className=\"bw-summary-row\">\n <span>Time</span>\n <span className=\"bw-summary-val\">{bw.formatTimeLabel(bw.selectedTime)}</span>\n </div>\n )}\n {bw.selectedService.price != null && (\n <div className=\"bw-summary-row bw-summary-total\">\n <span>Estimated total</span>\n <span className=\"bw-summary-val\">\n {formatPrice(Number(bw.selectedService.price))}\n </span>\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Button row */}\n <div className=\"bw-footer-btns\">\n {mobileStep > 1 && (\n <button\n className=\"bw-footer-back\"\n onClick={() => setMobileStep((s) => s - 1)}\n aria-label=\"Go back\"\n >\n <ArrowLeft size={20} />\n </button>\n )}\n {mobileStep < 4 ? (\n <button\n className=\"bw-footer-next\"\n disabled={\n (mobileStep === 1 && !canAdvanceStep1) ||\n (mobileStep === 2 && !canAdvanceStep2) ||\n (mobileStep === 3 && !canAdvanceStep3)\n }\n onClick={() => setMobileStep((s) => s + 1)}\n >\n <span>Next</span>\n <ArrowRight size={16} />\n </button>\n ) : (\n <button\n className=\"bw-footer-next\"\n disabled={!canSubmit}\n onClick={() => formRef.current?.requestSubmit()}\n >\n <span>{bw.isSubmitting ? \"Booking...\" : \"Confirm Booking\"}</span>\n {!bw.isSubmitting && <ArrowRight size={16} />}\n </button>\n )}\n </div>\n </div>\n <div ref={portalRef} className=\"bw-portal\" />\n </div>\n );\n}\n","'use client'\n\nimport { useState } from 'react'\nimport { useAvailability } from '../core/hooks/useAvailability'\n\ninterface AvailabilityPickerProps {\n serviceId: string\n staffId?: string\n date?: string\n days?: number\n className?: string\n onSelect?: (params: { date: string; time: string; endTime: string }) => void\n}\n\nexport function AvailabilityPicker({\n serviceId,\n staffId,\n date,\n days = 7,\n className,\n onSelect,\n}: AvailabilityPickerProps) {\n const [selectedDate, setSelectedDate] = useState<string | null>(date || null)\n const [selectedTime, setSelectedTime] = useState<string | null>(null)\n\n const { data, isLoading } = useAvailability({\n serviceId,\n staffId,\n date,\n days,\n })\n\n if (isLoading) {\n return <div className=\"idk-state\">Loading availability...</div>\n }\n\n if (!data?.dates?.length) {\n return <div className=\"idk-state\">No availability found.</div>\n }\n\n const activeDate = selectedDate || data.dates[0]?.date\n const activeSlots = data.dates.find((entry) => entry.date === activeDate)?.slots || []\n\n return (\n <div className={['idk-availability', className].filter(Boolean).join(' ')}>\n <div className=\"idk-availability__dates\">\n {data.dates.map((entry) => (\n <button\n key={entry.date}\n type=\"button\"\n className={entry.date === activeDate ? 'is-active' : undefined}\n onClick={() => {\n setSelectedDate(entry.date)\n setSelectedTime(null)\n }}\n >\n {entry.date}\n </button>\n ))}\n </div>\n <div className=\"idk-availability__slots\">\n {activeSlots.filter((slot) => slot.available).length === 0 ? (\n <div className=\"idk-state\">No slots available.</div>\n ) : (\n activeSlots\n .filter((slot) => slot.available)\n .map((slot) => (\n <button\n key={`${activeDate}-${slot.time}`}\n type=\"button\"\n className={selectedTime === slot.time ? 'is-active' : undefined}\n onClick={() => {\n setSelectedTime(slot.time)\n if (onSelect && activeDate) {\n onSelect({\n date: activeDate,\n time: slot.time,\n endTime: slot.endTime,\n })\n }\n }}\n >\n {slot.time}\n </button>\n ))\n )}\n </div>\n </div>\n )\n}\n","\"use client\"\n\nimport type { Service } from \"../types\"\n\ninterface ServicePickerProps {\n services: Service[]\n selectedId?: string | null\n onSelect?: (service: Service) => void\n className?: string\n}\n\nexport function ServicePicker({\n services,\n selectedId,\n onSelect,\n className,\n}: ServicePickerProps) {\n return (\n <div className={[\"idk-picker\", className].filter(Boolean).join(\" \")}>\n {services.map((service) => (\n <button\n key={service.id}\n type=\"button\"\n className={selectedId === service.id ? \"is-active\" : undefined}\n onClick={() => onSelect?.(service)}\n >\n <span>{service.name}</span>\n <small>{service.duration} min</small>\n </button>\n ))}\n </div>\n )\n}\n","\"use client\"\n\nimport type { StaffMember } from \"../types\"\n\ninterface StaffPickerProps {\n staff: StaffMember[]\n selectedId?: string | null\n onSelect?: (member: StaffMember) => void\n className?: string\n}\n\nexport function StaffPicker({\n staff,\n selectedId,\n onSelect,\n className,\n}: StaffPickerProps) {\n return (\n <div className={[\"idk-picker\", className].filter(Boolean).join(\" \")}>\n {staff.map((member) => (\n <button\n key={member.id}\n type=\"button\"\n className={selectedId === member.id ? \"is-active\" : undefined}\n onClick={() => onSelect?.(member)}\n >\n <span>{member.name}</span>\n <small>{member.role || \"Staff\"}</small>\n </button>\n ))}\n </div>\n )\n}\n","\"use client\"\n\ninterface DatePickerProps {\n dates: string[]\n selectedDate?: string | null\n onSelect?: (date: string) => void\n className?: string\n}\n\nexport function DatePicker({\n dates,\n selectedDate,\n onSelect,\n className,\n}: DatePickerProps) {\n return (\n <div className={[\"idk-picker\", className].filter(Boolean).join(\" \")}>\n {dates.map((date) => (\n <button\n key={date}\n type=\"button\"\n className={selectedDate === date ? \"is-active\" : undefined}\n onClick={() => onSelect?.(date)}\n >\n {date}\n </button>\n ))}\n </div>\n )\n}\n","\"use client\"\n\nimport type { AvailabilitySlot } from \"../types\"\n\ninterface TimePickerProps {\n slots: AvailabilitySlot[]\n selectedTime?: string | null\n onSelect?: (slot: AvailabilitySlot) => void\n className?: string\n}\n\nexport function TimePicker({\n slots,\n selectedTime,\n onSelect,\n className,\n}: TimePickerProps) {\n return (\n <div className={[\"idk-picker\", className].filter(Boolean).join(\" \")}>\n {slots.map((slot) => (\n <button\n key={`${slot.time}-${slot.endTime}`}\n type=\"button\"\n className={selectedTime === slot.time ? \"is-active\" : undefined}\n disabled={!slot.available}\n onClick={() => onSelect?.(slot)}\n >\n {slot.time}\n </button>\n ))}\n </div>\n )\n}\n"],"mappings":"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","names":["import_react","import_react_query","import_react","import_react_query","import_react","import_react_query","buildQuery","import_react","import_react_query","buildQuery","import_react_query","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_react_query","import_jsx_runtime","import_react","import_jsx_runtime","parseDateOnly","import_react","import_jsx_runtime","Scrollbar","OverscrollPlugin","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime"]}