@idkwebsites/components 0.1.19 → 0.1.20

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/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"]}
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. @deprecated Use `mobileHeader` instead. */\n navLinks?: { label: string; href: string }[];\n /** Custom icon for the mobile menu open button (default: lucide Menu) @deprecated Use `mobileHeader` instead. */\n menuIcon?: ReactNode;\n /** Custom icon for the mobile menu close button (default: lucide X) @deprecated Use `mobileHeader` instead. */\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 * @deprecated Use `mobileHeader` instead.\n */\n linkComponent?: ComponentType<{ href: string; className?: string; onClick?: () => void; children: ReactNode }>;\n /**\n * Site's mobile header/navbar component. Rendered inside the widget on mobile,\n * replacing the built-in hamburger menu. Pass your SiteHeader component here\n * so the booking widget uses the same navigation design as the rest of the site.\n */\n mobileHeader?: ReactNode;\n}\n\nexport function BookingWidgetPanel({\n navLinks = [],\n menuIcon,\n closeIcon,\n categoryIcons,\n stepTitles,\n linkComponent: LinkComp = DefaultLink,\n mobileHeader,\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 const useLegacyNav = !mobileHeader && navLinks.length > 0;\n\n return (\n <div className=\"bw\" ref={widgetRef}>\n {/* ── Site mobile header (replaces built-in nav) ── */}\n {mobileHeader && (\n <div className=\"bw-mobile-header\">{mobileHeader}</div>\n )}\n\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 {useLegacyNav && (\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 (legacy — replaced by mobileHeader) ── */}\n {useLegacyNav && (\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACMA,IAAAA,gBAAyC;AACzC,yBAMO;;;ACbP,mBAA0C;AAO1C,IAAM,sBAAkB,4BAAqC,IAAI;AAE1D,SAAS,oBAAoC;AAClD,QAAM,cAAU,yBAAW,eAAe;AAC1C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;AACA,SAAO;AACT;;;AD2CQ;AAjCR,IAAM,kBACJ,QAAQ,IAAI,2BACZ,QAAQ,IAAI,gCACZ;AAEK,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AACxB,QAAM,CAAC,MAAM,QAAI;AAAA,IACf,MACE,eACA,IAAI,+BAAY;AAAA,MACd,gBAAgB;AAAA,QACd,SAAS;AAAA,UACP,WAAW;AAAA,UACX,OAAO;AAAA,UACP,GAAG,cAAc;AAAA,QACnB;AAAA,QACA,WAAW;AAAA,UACT,GAAG,cAAc;AAAA,QACnB;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACL;AAEA,SACE,4CAAC,gBAAgB,UAAhB,EAAyB,OAAO,EAAE,QAAQ,OAAO,GAChD,sDAAC,0CAAoB,QACnB,sDAAC,wCAAkB,OAAO,iBAAkB,UAAS,GACvD,GACF;AAEJ;;;AE9DA,IAAAC,sBAAyB;;;ACAlB,IAAM,WAAN,cAAuB,MAAM;AAAA,EAClC;AAAA,EACA;AAAA,EAEA,YAAY,SAAiB,QAAgB,MAAc;AACzD,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,OAAO;AAAA,EACd;AACF;AAOA,SAAS,iBAAiB,QAAwB;AAChD,SAAO,OAAO,QAAQ,QAAQ,EAAE;AAClC;AAEA,eAAsB,WACpB,QACA,MACA,UAAuB,CAAC,GACZ;AACZ,QAAM,MAAM,GAAG,iBAAiB,OAAO,MAAM,CAAC,GAAG,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI,IAAI,EAAE;AAEzF,QAAM,UAAU,IAAI,QAAQ,QAAQ,OAAO;AAC3C,UAAQ,IAAI,aAAa,OAAO,MAAM;AACtC,MAAI,CAAC,QAAQ,IAAI,cAAc,KAAK,QAAQ,MAAM;AAChD,YAAQ,IAAI,gBAAgB,kBAAkB;AAAA,EAChD;AAEA,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAChC,GAAG;AAAA,IACH;AAAA,EACF,CAAC;AAED,QAAM,UAAU,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,IAAI;AAEtD,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,YAAY,SAAS,OAAO,QAAQ;AAC1C,UAAM,eAAe,SAAS,OAAO,WAAW,SAAS;AACzD,UAAM,IAAI,SAAS,cAAc,SAAS,QAAQ,SAAS;AAAA,EAC7D;AAEA,MAAI,SAAS,OAAO;AAClB,UAAM,IAAI,SAAS,QAAQ,MAAM,WAAW,kBAAkB,QAAQ,MAAM,UAAU,KAAK,QAAQ,MAAM,QAAQ,gBAAgB;AAAA,EACnI;AAEA,SAAO,SAAS;AAClB;;;AD/CO,SAAS,YAAY;AAC1B,QAAM,SAAS,kBAAkB;AAEjC,aAAO,8BAAS;AAAA,IACd,UAAU,CAAC,OAAO,QAAQ;AAAA,IAC1B,SAAS,MAAM,WAAuB,QAAQ,SAAS;AAAA,EACzD,CAAC;AACH;;;AEZA,IAAAC,gBAAwB;AACxB,IAAAC,sBAAyB;AAwBzB,SAAS,WAAW,QAAsC;AACxD,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,eAAe,IAAI,gBAAgB;AACzC,QAAM,aAAa,MAAM,QAAQ,OAAO,QAAQ,IAC5C,OAAO,WACP,OAAO,WACL,CAAC,OAAO,QAAQ,IAChB,CAAC;AAEP,MAAI,WAAW,OAAQ,cAAa,IAAI,YAAY,WAAW,KAAK,GAAG,CAAC;AACxE,MAAI,OAAO,QAAS,cAAa,IAAI,WAAW,OAAO,OAAO;AAC9D,MAAI,OAAO,OAAO,aAAa,UAAW,cAAa,IAAI,YAAY,OAAO,OAAO,QAAQ,CAAC;AAC9F,MAAI,OAAO,OAAO,aAAa,SAAU,cAAa,IAAI,YAAY,OAAO,OAAO,QAAQ,CAAC;AAC7F,MAAI,OAAO,OAAO,aAAa,SAAU,cAAa,IAAI,YAAY,OAAO,OAAO,QAAQ,CAAC;AAC7F,MAAI,OAAO,OAAQ,cAAa,IAAI,UAAU,OAAO,MAAM;AAC3D,MAAI,OAAO,KAAK,OAAQ,cAAa,IAAI,OAAO,OAAO,IAAI,KAAK,GAAG,CAAC;AACpE,MAAI,OAAO,OAAO,UAAU,SAAU,cAAa,IAAI,SAAS,OAAO,OAAO,KAAK,CAAC;AACpF,MAAI,OAAO,KAAM,cAAa,IAAI,QAAQ,OAAO,IAAI;AACrD,MAAI,OAAO,MAAO,cAAa,IAAI,SAAS,OAAO,KAAK;AAExD,SAAO,aAAa,SAAS;AAC/B;AAEO,SAAS,YAAY,QAA8B;AACxD,QAAM,SAAS,kBAAkB;AACjC,QAAM,kBAAc,uBAAQ,MAAM,WAAW,MAAM,GAAG;AAAA,IACpD,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV,CAAC;AAED,QAAM,UAAU,QAAQ,WAAW;AAEnC,aAAO,8BAAS;AAAA,IACd,UAAU,CAAC,OAAO,YAAY,WAAW;AAAA,IACzC,SAAS,MACP;AAAA,MACE;AAAA,MACA,cAAc,aAAa,WAAW,KAAK;AAAA,IAC7C;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;AC1EA,IAAAC,gBAAwB;AACxB,IAAAC,sBAAyB;AAuBzB,SAASC,YAAW,QAAkC;AACpD,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,eAAe,IAAI,gBAAgB;AACzC,QAAM,QAAQ,MAAM,QAAQ,OAAO,IAAI,IACnC,OAAO,OACP,OAAO,OACL,CAAC,OAAO,IAAI,IACZ,CAAC;AAEP,MAAI,MAAM,OAAQ,cAAa,IAAI,QAAQ,MAAM,KAAK,GAAG,CAAC;AAC1D,MAAI,OAAO,OAAO,aAAa,UAAW,cAAa,IAAI,YAAY,OAAO,OAAO,QAAQ,CAAC;AAC9F,MAAI,OAAO,OAAO,uBAAuB,WAAW;AAClD,iBAAa,IAAI,sBAAsB,OAAO,OAAO,kBAAkB,CAAC;AAAA,EAC1E;AACA,MAAI,OAAO,OAAQ,cAAa,IAAI,UAAU,OAAO,MAAM;AAC3D,MAAI,OAAO,KAAK,OAAQ,cAAa,IAAI,OAAO,OAAO,IAAI,KAAK,GAAG,CAAC;AACpE,MAAI,OAAO,UAAW,cAAa,IAAI,aAAa,OAAO,SAAS;AACpE,MAAI,OAAO,OAAO,UAAU,SAAU,cAAa,IAAI,SAAS,OAAO,OAAO,KAAK,CAAC;AACpF,MAAI,OAAO,KAAM,cAAa,IAAI,QAAQ,OAAO,IAAI;AACrD,MAAI,OAAO,MAAO,cAAa,IAAI,SAAS,OAAO,KAAK;AAExD,SAAO,aAAa,SAAS;AAC/B;AAEO,SAAS,QAAQ,QAA0B;AAChD,QAAM,SAAS,kBAAkB;AACjC,QAAM,kBAAc,uBAAQ,MAAMA,YAAW,MAAM,GAAG;AAAA,IACpD,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV,CAAC;AAED,QAAM,UAAU,QAAQ,WAAW;AAEnC,aAAO,8BAAS;AAAA,IACd,UAAU,CAAC,OAAO,QAAQ,WAAW;AAAA,IACrC,SAAS,MACP;AAAA,MACE;AAAA,MACA,cAAc,SAAS,WAAW,KAAK;AAAA,IACzC;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;ACzEA,IAAAC,gBAAwB;AACxB,IAAAC,sBAAyB;AAezB,SAASC,YAAW,QAAoC;AACtD,QAAM,eAAe,IAAI,gBAAgB;AACzC,eAAa,IAAI,aAAa,OAAO,SAAS;AAC9C,MAAI,OAAO,QAAS,cAAa,IAAI,WAAW,OAAO,OAAO;AAC9D,MAAI,OAAO,UAAW,cAAa,IAAI,aAAa,OAAO,SAAS;AACpE,MAAI,OAAO,QAAS,cAAa,IAAI,WAAW,OAAO,OAAO;AAC9D,MAAI,OAAO,KAAM,cAAa,IAAI,QAAQ,OAAO,IAAI;AACrD,MAAI,OAAO,KAAM,cAAa,IAAI,QAAQ,OAAO,OAAO,IAAI,CAAC;AAC7D,SAAO,aAAa,SAAS;AAC/B;AAEO,SAAS,gBAAgB,QAA4B;AAC1D,QAAM,SAAS,kBAAkB;AACjC,QAAM,kBAAc;AAAA,IAClB,MAAMA,YAAW,MAAM;AAAA,IACvB,CAAC,OAAO,WAAW,OAAO,SAAS,OAAO,WAAW,OAAO,SAAS,OAAO,MAAM,OAAO,IAAI;AAAA,EAC/F;AACA,QAAM,UAAU,OAAO,WAAW,QAAQ,OAAO,SAAS;AAE1D,aAAO,8BAAS;AAAA,IACd,UAAU,CAAC,OAAO,gBAAgB,WAAW;AAAA,IAC7C,SAAS,MAAM,WAA+B,QAAQ,iBAAiB,WAAW,EAAE;AAAA,IACpF;AAAA,EACF,CAAC;AACH;;;ACxCA,IAAAC,sBAAsC;AAK/B,SAAS,mBAAmB;AACjC,QAAM,SAAS,kBAAkB;AAEjC,aAAO,iCAAY;AAAA,IACjB,YAAY,CAAC,UACX,WAAiC,QAAQ,aAAa;AAAA,MACpD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,KAAK;AAAA,IAC5B,CAAC;AAAA,EACL,CAAC;AACH;AAEO,SAAS,mBAAmB;AACjC,QAAM,SAAS,kBAAkB;AAEjC,aAAO,iCAAY;AAAA,IACjB,YAAY,CAAC,UACX,WAAiC,QAAQ,aAAa,MAAM,GAAG,WAAW;AAAA,MACxE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU;AAAA,QACnB,QAAQ,MAAM;AAAA,QACd,aAAa,MAAM,eAAe;AAAA,MACpC,CAAC;AAAA,IACH,CAAC;AAAA,EACL,CAAC;AACH;AAEO,SAAS,iBAAiB,KAAc,UAAU,MAAM;AAC7D,QAAM,SAAS,kBAAkB;AAEjC,aAAO,8BAAS;AAAA,IACd,UAAU,CAAC,OAAO,WAAW,GAAG;AAAA,IAChC,SAAS,MAAM,WAA0B,QAAQ,aAAa,GAAG,EAAE;AAAA,IACnE,SAAS,QAAQ,GAAG,KAAK;AAAA,EAC3B,CAAC;AACH;;;ACtCA,IAAAC,gBAAkE;AAWlE,IAAM,gBAAgB,CAAC,UAAuC;AAC5D,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,aAAa,MAAM,SAAS,GAAG,IAAI,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI;AAC/D,QAAM,SAAS,oBAAI,KAAK,GAAG,UAAU,WAAW;AAChD,SAAO,OAAO,MAAM,OAAO,QAAQ,CAAC,IAAI,OAAO;AACjD;AAEA,IAAM,UAAU,CAAC,SAAiB,SAAyB;AACzD,QAAM,SAAS,cAAc,OAAO;AACpC,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,QAAQ,OAAO,QAAQ,IAAI,IAAI;AACtC,SAAO,OAAO,YAAY,EAAE,MAAM,GAAG,EAAE;AACzC;AAwJO,SAAS,iBAAiB,UAAmC,CAAC,GAA2B;AAC9F,QAAM;AAAA,IACJ,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,qBAAqB;AAAA,IACrB,sBAAsB;AAAA,IACtB,cAAc,sBAAsB;AAAA,IACpC,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA,kBAAkB,uBAAuB;AAAA,IACzC,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,mBAAmB,CAAC;AAAA,IACpB,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,IACtB,uBAAuB;AAAA,IACvB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,qBAAqB;AAAA,EACvB,IAAI;AAGJ,QAAM,4BAAwB;AAAA,IAC5B,MAAO,eAAe,EAAE,GAAG,eAAe,SAAS,MAAM,IAAI;AAAA,IAC7D,CAAC,cAAc,aAAa;AAAA,EAC9B;AACA,QAAM,EAAE,MAAM,cAAc,WAAW,gBAAgB,IAAI,YAAY,qBAAqB;AAC5F,QAAM,EAAE,MAAM,SAAS,IAAI,QAAQ,SAAS;AAC5C,QAAM,gBAAgB,iBAAiB;AAGvC,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAe,SAAS;AAChD,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,wBAAyB,IAAI;AAC3E,QAAM,CAAC,eAAe,gBAAgB,QAAI,wBAA6B,IAAI;AAC3E,QAAM,CAAC,cAAc,eAAe,QAAI,wBAAwB,IAAI;AACpE,QAAM,CAAC,cAAc,eAAe,QAAI,wBAAwB,IAAI;AACpE,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,wBAAwB,IAAI;AAC1E,QAAM,CAAC,eAAe,gBAAgB,QAAI,wBAAS,EAAE;AACrD,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,wBAAS,KAAK;AAC1D,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAS,CAAC;AAChD,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,CAAC;AAC5C,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,wBAAS,KAAK,IAAI,GAAG,oBAAoB,CAAC;AAC1F,QAAM,CAAC,uBAAuB,wBAAwB,QAAI;AAAA,IAAS,OACjE,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,EACtC;AACA,QAAM,CAAC,eAAe,gBAAgB,QAAI,wBAAS,MAAM;AACvD,UAAM,MAAM,oBAAI,KAAK;AACrB,WAAO,IAAI,KAAK,IAAI,YAAY,GAAG,IAAI,SAAS,GAAG,CAAC;AAAA,EACtD,CAAC;AACD,QAAM,CAAC,cAAc,eAAe,QAAI,wBAAwB,IAAI;AACpE,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,EAAE,MAAM,IAAI,OAAO,IAAI,OAAO,IAAI,OAAO,GAAG,CAAC;AAGpF,QAAM,mBAAe,uBAAQ,MAAM;AACjC,UAAM,OAAO,eAAe,CAAC,GAAG,YAAY,IAAI,cAAc,WAAW,CAAC,GAAG,aAAa,QAAQ,IAAI,CAAC;AACvG,WAAO,gBAAgB,KAAK,OAAO,aAAa,IAAI;AAAA,EACtD,GAAG,CAAC,cAAc,cAAc,aAAa,CAAC;AAE9C,QAAM,iBAAa,uBAAQ,MAAM;AAC/B,UAAM,MAAM,oBAAI,IAAY;AAC5B,iBAAa,QAAQ,CAAC,MAAM;AAAE,UAAI,EAAE,SAAU,KAAI,IAAI,EAAE,QAAQ;AAAA,IAAE,CAAC;AACnE,WAAO,MAAM,KAAK,GAAG,EAAE,KAAK;AAAA,EAC9B,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,uBAAmB,uBAAQ,MAAM;AACrC,UAAM,SAAS,cAAc,KAAK,EAAE,YAAY;AAChD,WAAO,aAAa,OAAO,CAAC,YAAY;AACtC,YAAM,gBACJ,CAAC,UACD,QAAQ,KAAK,YAAY,EAAE,SAAS,MAAM,MACzC,QAAQ,eAAe,IAAI,YAAY,EAAE,SAAS,MAAM,MACxD,QAAQ,YAAY,IAAI,YAAY,EAAE,SAAS,MAAM;AACxD,YAAM,kBAAkB,mBAAmB,QAAQ,OAAO,QAAQ,aAAa;AAC/E,aAAO,iBAAiB;AAAA,IAC1B,CAAC;AAAA,EACH,GAAG,CAAC,cAAc,eAAe,cAAc,CAAC;AAEhD,+BAAU,MAAM;AAAE,mBAAe,CAAC;AAAA,EAAE,GAAG,CAAC,eAAe,cAAc,CAAC;AACtE,+BAAU,MAAM;AAAE,iBAAa,CAAC;AAAA,EAAE,GAAG,CAAC,iBAAiB,IAAI,UAAU,UAAU,CAAC;AAEhF,QAAM,oBAAgB,uBAAQ,MAAM;AAClC,UAAM,WAAW,KAAK,IAAI,GAAG,eAAe;AAC5C,WAAO,iBAAiB,MAAM,GAAG,WAAW,WAAW;AAAA,EACzD,GAAG,CAAC,kBAAkB,aAAa,eAAe,CAAC;AAEnD,QAAM,kBAAkB,iBAAiB,SAAS,cAAc;AAGhE,QAAM,mBAAe,uBAAQ,MAAM;AACjC,QAAI,CAAC,gBAAiB,QAAO,CAAC;AAC9B,QAAI,gBAAgB,iBAAiB,gBAAgB,cAAc,SAAS,GAAG;AAC7E,YAAM,WAAW,gBAAgB;AACjC,aAAO,aAAa,SAAS,OAAO,UAAU,IAAI;AAAA,IACpD;AACA,UAAM,WAAW,UAAU,QAAQ,CAAC;AACpC,WAAO,aAAa,SAAS,OAAO,UAAU,IAAI;AAAA,EACpD,GAAG,CAAC,iBAAiB,UAAU,UAAU,CAAC;AAE1C,QAAM,iBAAa,uBAAQ,MAAM;AAC/B,UAAM,WAAW,KAAK,IAAI,GAAG,aAAa;AAC1C,WAAO,aAAa,MAAM,GAAG,WAAW,SAAS;AAAA,EACnD,GAAG,CAAC,cAAc,WAAW,aAAa,CAAC;AAE3C,QAAM,eAAe,aAAa,SAAS,WAAW;AAGtD,QAAM,gBACJ,sBACA,QAAQ,iBAAiB,sBAAsB,KAC/C,iBAAiB,mBAAmB;AAEtC,QAAM,eAAe,CAAC,iBAAiB;AAEvC,QAAM,aAAa,gBAAgB,IAAI;AACvC,QAAM,cAAc,MAAM;AACxB,QAAI,SAAS,UAAW,QAAO;AAC/B,QAAI,SAAS,QAAS,QAAO;AAC7B,QAAI,SAAS,OAAQ,QAAO,gBAAgB,IAAI;AAChD,QAAI,SAAS,UAAW,QAAO,gBAAgB,IAAI;AACnD,WAAO;AAAA,EACT,GAAG;AAGH,QAAM,0BAAsB;AAAA,IAC1B,MAAM,QAAQ,uBAAuB,KAAK,IAAI,GAAG,gBAAgB,IAAI,CAAC;AAAA,IACtE,CAAC,uBAAuB,gBAAgB;AAAA,EAC1C;AAEA,QAAM,eAAe,gBAAgB;AAAA,IACnC,WAAW,iBAAiB,MAAM;AAAA,IAClC,SAAS,eAAe;AAAA,IACxB,WAAW;AAAA,IACX,SAAS;AAAA,IACT,SAAS,QAAQ,eAAe;AAAA,EAClC,CAAC;AAED,QAAM,WAAW,aAAa,MAAM,YAAY;AAEhD,QAAM,mBAAe,uBAAQ,MAAM;AACjC,QAAI,CAAC,SAAU,QAAO;AACtB,QAAI;AACF,UAAI,KAAK,eAAe,SAAS,EAAE,SAAS,CAAC,EAAE,OAAO,oBAAI,KAAK,CAAC;AAChE,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,oBAAgB,uBAAQ,MAAM;AAClC,QAAI,SAAU,QAAO;AACrB,QAAI;AACF,aAAO,KAAK,eAAe,EAAE,gBAAgB,EAAE;AAAA,IACjD,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,yBAAqB,uBAAQ,MAAM;AACvC,UAAM,MAAM,oBAAI,IAA8B;AAC7C,KAAC,aAAa,MAAM,SAAS,CAAC,GAAG,QAAQ,CAAC,UAAU;AAAE,UAAI,IAAI,MAAM,MAAM,KAAK;AAAA,IAAE,CAAC;AACnF,WAAO;AAAA,EACT,GAAG,CAAC,aAAa,IAAI,CAAC;AAGtB,QAAM,yBAAqB;AAAA,IACzB,MAAM,IAAI,KAAK,eAAe,SAAS,EAAE,SAAS,SAAS,OAAO,SAAS,KAAK,UAAU,CAAC;AAAA,IAC3F,CAAC;AAAA,EACH;AACA,QAAM,2BAAuB;AAAA,IAC3B,MAAM,IAAI,KAAK,eAAe,SAAS,EAAE,SAAS,QAAQ,OAAO,QAAQ,KAAK,UAAU,CAAC;AAAA,IACzF,CAAC;AAAA,EACH;AACA,QAAM,oBAAgB;AAAA,IACpB,MAAM,IAAI,KAAK,eAAe,SAAS,EAAE,UAAU,cAAc,MAAM,WAAW,QAAQ,UAAU,CAAC;AAAA,IACrG,CAAC,YAAY;AAAA,EACf;AAEA,QAAM,oBAAgB;AAAA,IACpB,CAAC,OAAuB,iBAA8C;AACpE,UAAI,CAAC,MAAO,QAAO;AACnB,YAAM,SAAS,IAAI,KAAK,KAAK;AAC7B,UAAI,CAAC,OAAO,MAAM,OAAO,QAAQ,CAAC,EAAG,QAAO;AAC5C,UAAI,cAAc;AAChB,cAAM,aAAa,aAAa,SAAS,GAAG,IAAI,aAAa,MAAM,GAAG,EAAE,CAAC,IAAI;AAC7E,cAAM,WAAW,oBAAI,KAAK,GAAG,UAAU,IAAI,KAAK,EAAE;AAClD,YAAI,CAAC,OAAO,MAAM,SAAS,QAAQ,CAAC,EAAG,QAAO;AAAA,MAChD;AACA,aAAO;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,sBAAkB;AAAA,IACtB,CAAC,SAAyB;AACxB,YAAM,SAAS,cAAc,IAAI;AACjC,UAAI,CAAC,OAAQ,QAAO;AACpB,UAAI;AAAE,eAAO,mBAAmB,OAAO,MAAM;AAAA,MAAE,QAAQ;AAAE,eAAO;AAAA,MAAK;AAAA,IACvE;AAAA,IACA,CAAC,kBAAkB;AAAA,EACrB;AAEA,QAAM,wBAAoB;AAAA,IACxB,CAAC,SAAyB;AACxB,YAAM,SAAS,cAAc,IAAI;AACjC,UAAI,CAAC,OAAQ,QAAO;AACpB,UAAI;AAAE,eAAO,qBAAqB,OAAO,MAAM;AAAA,MAAE,QAAQ;AAAE,eAAO;AAAA,MAAK;AAAA,IACzE;AAAA,IACA,CAAC,oBAAoB;AAAA,EACvB;AAEA,QAAM,sBAAkB;AAAA,IACtB,CAAC,QAAwB;AACvB,YAAM,SAAS,cAAc,KAAK,YAAY;AAC9C,UAAI,CAAC,OAAQ,QAAO;AACpB,UAAI;AAAE,eAAO,cAAc,OAAO,MAAM;AAAA,MAAE,QAAQ;AAChD,eAAO,OAAO,mBAAmB,SAAS,EAAE,MAAM,WAAW,QAAQ,UAAU,CAAC;AAAA,MAClF;AAAA,IACF;AAAA,IACA,CAAC,eAAe,cAAc,aAAa;AAAA,EAC7C;AAEA,QAAM,qBAAiB,2BAAY,CAAC,YAA4B;AAC9D,QAAI,CAAC,OAAO,SAAS,OAAO,EAAG,QAAO;AACtC,QAAI,UAAU,GAAI,QAAO,GAAG,OAAO;AACnC,UAAM,QAAQ,KAAK,MAAM,UAAU,EAAE;AACrC,UAAM,YAAY,UAAU;AAC5B,WAAO,cAAc,IAAI,GAAG,KAAK,MAAM,QAAQ,IAAI,MAAM,EAAE,KAAK,GAAG,KAAK,OAAO,SAAS;AAAA,EAC1F,GAAG,CAAC,CAAC;AAGL,QAAM,kBAAc,uBAAQ,OAAM,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,GAAG,CAAC,CAAC;AAC3E,QAAM,gBAAY,uBAAQ,MAAM;AAAE,UAAM,MAAM,oBAAI,KAAK;AAAG,QAAI,SAAS,GAAG,GAAG,GAAG,CAAC;AAAG,WAAO;AAAA,EAAI,GAAG,CAAC,CAAC;AACpG,QAAM,0BAAsB,uBAAQ,MAAM,IAAI,IAAI,gBAAgB,GAAG,CAAC,gBAAgB,CAAC;AAEvF,QAAM,oBAAgB,2BAAY,CAAC,SAAe,IAAI,KAAK,KAAK,YAAY,GAAG,KAAK,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC;AACtG,QAAM,kBAAc,2BAAY,CAAC,SAAe,IAAI,KAAK,KAAK,YAAY,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;AAExG,QAAM,mBAAe;AAAA,IACnB,CAAC,SAAe;AACd,YAAM,QAAQ,cAAc,IAAI;AAChC,YAAM,MAAM,YAAY,IAAI;AAC5B,YAAM,OAAyD,CAAC;AAChE,YAAM,WAAW,MAAM,OAAO;AAC9B,eAAS,IAAI,UAAU,IAAI,GAAG,KAAK,GAAG;AACpC,cAAM,IAAI,IAAI,KAAK,KAAK;AACxB,UAAE,QAAQ,MAAM,QAAQ,IAAI,CAAC;AAC7B,aAAK,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,GAAG,gBAAgB,MAAM,CAAC;AAAA,MACzE;AACA,eAAS,MAAM,GAAG,OAAO,IAAI,QAAQ,GAAG,OAAO,GAAG;AAChD,cAAM,IAAI,IAAI,KAAK,KAAK,YAAY,GAAG,KAAK,SAAS,GAAG,GAAG;AAC3D,aAAK,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,GAAG,gBAAgB,KAAK,CAAC;AAAA,MACxE;AACA,YAAM,YAAY,KAAK,KAAK,SAAS,KAAK;AAC1C,eAAS,IAAI,GAAG,KAAK,WAAW,KAAK,GAAG;AACtC,cAAM,IAAI,IAAI,KAAK,GAAG;AACtB,UAAE,QAAQ,IAAI,QAAQ,IAAI,CAAC;AAC3B,aAAK,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,GAAG,gBAAgB,MAAM,CAAC;AAAA,MACzE;AACA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,aAAa,aAAa;AAAA,EAC7B;AAEA,QAAM,qBAAiB,uBAAQ,MAAM;AACnC,QAAI,CAAC,oBAAoB,oBAAoB,EAAG,QAAO;AACvD,UAAM,WAAW,IAAI,KAAK,UAAU,YAAY,GAAG,UAAU,SAAS,IAAI,mBAAmB,GAAG,CAAC;AACjG,WAAO,YAAY,QAAQ;AAAA,EAC7B,GAAG,CAAC,aAAa,kBAAkB,SAAS,CAAC;AAE7C,QAAM,2BAAuB,uBAAQ,MAAM;AACzC,QAAI,CAAC,oBAAoB,oBAAoB,EAAG,QAAO;AACvD,WAAO,IAAI,KAAK,UAAU,YAAY,GAAG,UAAU,SAAS,IAAI,mBAAmB,GAAG,CAAC;AAAA,EACzF,GAAG,CAAC,kBAAkB,SAAS,CAAC;AAEhC,QAAM,uBAAmB,uBAAQ,MAAM;AACrC,QAAI,CAAC,oBAAoB,oBAAoB,EAAG,QAAO;AACvD,WAAO;AAAA,EACT,GAAG,CAAC,gBAAgB,CAAC;AAErB,QAAM,mBAAe,uBAAQ,MAAM;AACjC,WAAO,MAAM,KAAK,EAAE,QAAQ,iBAAiB,GAAG,CAAC,GAAG,UAAU;AAC5D,YAAM,OAAO,IAAI,KAAK,UAAU,YAAY,GAAG,UAAU,SAAS,IAAI,OAAO,CAAC;AAC9E,aAAO;AAAA,QACL,OAAO,GAAG,KAAK,YAAY,CAAC,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;AAAA,QAC5E,OAAO,IAAI,KAAK,eAAe,SAAS,EAAE,OAAO,QAAQ,MAAM,UAAU,CAAC,EAAE,OAAO,IAAI;AAAA,QACvF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,kBAAkB,SAAS,CAAC;AAEhC,QAAM,mBAAe,uBAAQ,MAAM,aAAa,aAAa,GAAG,CAAC,cAAc,aAAa,CAAC;AAE7F,QAAM,+BAA2B,uBAAQ,MAAM;AAC7C,WAAO,aAAa,KAAK,CAAC,QAAQ;AAChC,YAAM,QAAQ,mBAAmB,IAAI,IAAI,IAAI;AAC7C,UAAI,CAAC,MAAO,QAAO;AACnB,aAAO,CAAC,MAAM,MAAM,KAAK,CAAC,SAA2B,KAAK,SAAS;AAAA,IACrE,CAAC;AAAA,EACH,GAAG,CAAC,cAAc,kBAAkB,CAAC;AAGrC,QAAM,kBAAc,2BAAY,MAAM;AACpC,QAAI,CAAC,uBAAuB,CAAC,WAAW,QAAS;AACjD,UAAM,MAAM,UAAU,QAAQ,sBAAsB,EAAE,MAAM,OAAO;AACnE,WAAO,SAAS,EAAE,KAAK,KAAK,IAAI,GAAG,MAAM,YAAY,GAAG,UAAU,SAAS,CAAC;AAAA,EAC9E,GAAG,CAAC,qBAAqB,cAAc,SAAS,CAAC;AAGjD,QAAM,sBAAkB,2BAAY,MAAM;AACxC,qBAAiB,IAAI;AACrB,oBAAgB,IAAI;AACpB,oBAAgB,IAAI;AACpB,uBAAmB,IAAI;AACvB,oBAAgB,IAAI;AAAA,EACtB,GAAG,CAAC,CAAC;AAGL,+BAAU,MAAM;AACd,QAAI,SAAS,OAAQ;AACrB,QAAI,CAAC,aAAa,MAAM,OAAO,OAAQ;AACvC,UAAM,UAAU,eACZ,aAAa,KAAK,MAAM,KAAK,CAAC,UAAU,MAAM,SAAS,YAAY,IACnE;AACJ,QAAI,QAAS;AACb,oBAAgB,aAAa,KAAK,MAAM,CAAC,EAAE,IAAI;AAAA,EACjD,GAAG,CAAC,MAAM,aAAa,MAAM,YAAY,CAAC;AAG1C,+BAAU,MAAM;AACd,QAAI,CAAC,gBAAiB;AACtB,QAAI,mBAAmB,YAAY;AACjC,YAAM,MAAM,oBAAI,KAAK;AACrB,uBAAiB,IAAI,KAAK,IAAI,YAAY,GAAG,IAAI,SAAS,GAAG,CAAC,CAAC;AAC/D;AAAA,IACF;AACA,8BAAyB,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAC9D,wBAAoB,KAAK,IAAI,GAAG,oBAAoB,CAAC;AAAA,EACvD,GAAG,CAAC,iBAAiB,IAAI,eAAe,IAAI,sBAAsB,cAAc,CAAC;AAGjF,+BAAU,MAAM;AACd,QAAI,mBAAmB,WAAY;AACnC,UAAM,QAAQ,cAAc,aAAa;AACzC,UAAM,MAAM,YAAY,aAAa;AACrC,6BAAyB,MAAM,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AACzD,wBAAoB,IAAI,QAAQ,CAAC;AAAA,EACnC,GAAG,CAAC,eAAe,gBAAgB,aAAa,aAAa,CAAC;AAG9D,QAAM,oBAAgB;AAAA,IACpB,CAAC,YAAqB;AACpB,yBAAmB,OAAO;AAC1B,sBAAgB;AAChB,UAAI,qBAAqB;AACvB,YAAI,cAAe,SAAQ,OAAO;AAAA,YAC7B,SAAQ,MAAM;AACnB,oBAAY;AAAA,MACd;AAAA,IACF;AAAA,IACA,CAAC,qBAAqB,eAAe,iBAAiB,WAAW;AAAA,EACnE;AAEA,QAAM,kBAAc;AAAA,IAClB,CAAC,UAA8B;AAC7B,uBAAiB,KAAK;AACtB,sBAAgB,IAAI;AACpB,sBAAgB,IAAI;AACpB,yBAAmB,IAAI;AACvB,sBAAgB,IAAI;AACpB,UAAI,qBAAqB;AACvB,gBAAQ,MAAM;AACd,oBAAY;AAAA,MACd;AAAA,IACF;AAAA,IACA,CAAC,qBAAqB,WAAW;AAAA,EACnC;AAEA,QAAM,iBAAa,2BAAY,CAAC,SAAiB;AAC/C,oBAAgB,IAAI;AACpB,oBAAgB,IAAI;AACpB,uBAAmB,IAAI;AACvB,oBAAgB,IAAI;AAAA,EACtB,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAa;AAAA,IACjB,CAAC,MAAc,YAAoB;AACjC,sBAAgB,IAAI;AACpB,yBAAmB,OAAO;AAC1B,sBAAgB,IAAI;AACpB,UAAI,qBAAqB;AACvB,gBAAQ,SAAS;AACjB,oBAAY;AAAA,MACd;AAAA,IACF;AAAA,IACA,CAAC,qBAAqB,WAAW;AAAA,EACnC;AAEA,QAAM,0BAAsB,2BAAY,MAAM;AAC5C,QAAI,CAAC,gBAAiB;AACtB,QAAI,cAAe,SAAQ,OAAO;AAAA,QAC7B,SAAQ,MAAM;AACnB,gBAAY;AAAA,EACd,GAAG,CAAC,iBAAiB,eAAe,WAAW,CAAC;AAEhD,QAAM,wBAAoB,2BAAY,MAAM;AAC1C,QAAI,CAAC,gBAAgB,CAAC,cAAe;AACrC,YAAQ,MAAM;AACd,gBAAY;AAAA,EACd,GAAG,CAAC,cAAc,eAAe,WAAW,CAAC;AAE7C,QAAM,uBAAmB,2BAAY,MAAM;AACzC,QAAI,CAAC,gBAAgB,CAAC,gBAAiB;AACvC,YAAQ,SAAS;AACjB,gBAAY;AAAA,EACd,GAAG,CAAC,cAAc,iBAAiB,WAAW,CAAC;AAE/C,QAAM,aAAS,2BAAY,MAAM;AAC/B,QAAI,SAAS,UAAW;AACxB,QAAI,SAAS,QAAS,SAAQ,SAAS;AAAA,aAC9B,SAAS,OAAQ,SAAQ,gBAAgB,UAAU,SAAS;AAAA,aAC5D,SAAS,UAAW,SAAQ,MAAM;AAAA,aAClC,SAAS,OAAQ,SAAQ,SAAS;AAC3C,oBAAgB,IAAI;AACpB,gBAAY;AAAA,EACd,GAAG,CAAC,MAAM,eAAe,WAAW,CAAC;AAErC,QAAM,sBAAkB,2BAAY,MAAM;AACxC,YAAQ,SAAS;AACjB,gBAAY;AAAA,EACd,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,YAAQ,2BAAY,MAAM;AAC9B,YAAQ,SAAS;AACjB,uBAAmB,IAAI;AACvB,oBAAgB;AAChB,eAAW,EAAE,MAAM,IAAI,OAAO,IAAI,OAAO,IAAI,OAAO,GAAG,CAAC;AACxD,gBAAY;AAAA,EACd,GAAG,CAAC,iBAAiB,WAAW,CAAC;AAEjC,QAAM,oBAAgB;AAAA,IACpB,OAAO,UAA4B;AACjC,aAAO,eAAe;AACtB,UAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,gBAAiB;AAE5E,YAAM,QAAQ,cAAc,cAAc,YAAY;AACtD,YAAM,MAAM,cAAc,iBAAiB,YAAY;AAEvD,UAAI,CAAC,SAAS,CAAC,KAAK;AAClB,wBAAgB,kCAAkC;AAClD;AAAA,MACF;AAEA,UAAI;AACF,wBAAgB,IAAI;AACpB,cAAM,SAAS,MAAM,cAAc,YAAY;AAAA,UAC7C,WAAW,gBAAgB;AAAA,UAC3B,SAAS,eAAe;AAAA,UACxB,WAAW,MAAM,YAAY;AAAA,UAC7B,SAAS,IAAI,YAAY;AAAA,UACzB,cAAc,QAAQ;AAAA,UACtB,eAAe,QAAQ;AAAA,UACvB,eAAe,QAAQ,SAAS;AAAA,UAChC,eAAe,QAAQ,SAAS;AAAA,QAClC,CAAC;AAED,gBAAQ,MAAM;AACd,oBAAY,QAAQ,OAAO;AAC3B,oBAAY;AAAA,MACd,SAAS,OAAO;AACd;AAAA,UACE,iBAAiB,QAAQ,MAAM,UAAU;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,iBAAiB,cAAc,cAAc,iBAAiB,eAAe,SAAS,eAAe,WAAW,aAAa,aAAa;AAAA,EAC7I;AAGA,QAAM,sBAAkB,2BAAY,MAAM;AACxC,QAAI,yBAAyB,YAAa;AAC1C,6BAAyB,CAAC,SAAS,QAAQ,MAAM,CAAC,gBAAgB,CAAC;AACnE,oBAAgB,IAAI;AACpB,oBAAgB,IAAI;AACpB,uBAAmB,IAAI;AACvB,oBAAgB,IAAI;AAAA,EACtB,GAAG,CAAC,uBAAuB,kBAAkB,WAAW,CAAC;AAEzD,QAAM,sBAAkB,2BAAY,MAAM;AACxC,QAAI,gBAAgB;AAClB,YAAM,YAAY,cAAc,QAAQ,uBAAuB,gBAAgB,CAAC;AAChF,UAAI,aAAa,YAAY,eAAgB;AAAA,IAC/C;AACA,6BAAyB,CAAC,SAAS,QAAQ,MAAM,gBAAgB,CAAC;AAClE,oBAAgB,IAAI;AACpB,oBAAgB,IAAI;AACpB,uBAAmB,IAAI;AACvB,oBAAgB,IAAI;AAAA,EACtB,GAAG,CAAC,uBAAuB,kBAAkB,cAAc,CAAC;AAG5D,QAAM,sBAAkB,2BAAY,MAAM;AACxC,qBAAiB,CAAC,SAAS,IAAI,KAAK,KAAK,YAAY,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,CAAC;AAC/E,oBAAgB,IAAI;AACpB,oBAAgB,IAAI;AACpB,uBAAmB,IAAI;AACvB,oBAAgB,IAAI;AAAA,EACtB,GAAG,CAAC,CAAC;AAEL,QAAM,sBAAkB,2BAAY,MAAM;AACxC,QAAI,sBAAsB;AACxB,YAAM,YAAY,IAAI,KAAK,cAAc,YAAY,GAAG,cAAc,SAAS,IAAI,GAAG,CAAC;AACvF,UAAI,YAAY,qBAAsB;AAAA,IACxC;AACA,qBAAiB,CAAC,SAAS,IAAI,KAAK,KAAK,YAAY,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,CAAC;AAC/E,oBAAgB,IAAI;AACpB,oBAAgB,IAAI;AACpB,uBAAmB,IAAI;AACvB,oBAAgB,IAAI;AAAA,EACtB,GAAG,CAAC,eAAe,oBAAoB,CAAC;AAExC,QAAM,wBAAoB,2BAAY,CAAC,UAAkB;AACvD,UAAM,CAAC,MAAM,KAAK,IAAI,MAAM,MAAM,GAAG,EAAE,IAAI,MAAM;AACjD,QAAI,CAAC,QAAQ,CAAC,MAAO;AACrB,qBAAiB,IAAI,KAAK,MAAM,QAAQ,GAAG,CAAC,CAAC;AAC7C,oBAAgB,IAAI;AACpB,oBAAgB,IAAI;AACpB,uBAAmB,IAAI;AACvB,oBAAgB,IAAI;AAAA,EACtB,GAAG,CAAC,CAAC;AAEL,QAAM,uBAAmB,2BAAY,MAAM,eAAe,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3E,QAAM,oBAAgB,2BAAY,MAAM,aAAa,CAAC,MAAO,eAAe,IAAI,IAAI,CAAE,GAAG,CAAC,YAAY,CAAC;AAGvG,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAmB,aAAa,MAAM,SAAS,CAAC;AAAA,IAChD;AAAA,IACA;AAAA,IACA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAEA,mBAAmB,eAAe,QAAQ;AAAA,IAC1C,uBAAuB,aAAa;AAAA,IACpC,cAAc,cAAc;AAAA,IAC5B;AAAA,IAEA;AAAA,IACA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAEA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACrvBU,IAAAC,sBAAA;AAvBH,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ;AACF,GAAqB;AACnB,QAAM,cAAc,MAAM;AACxB,QAAI,SAAU,UAAS,OAAO;AAAA,EAChC;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,CAAC,YAAY,WAAW,wBAAwB,IAAI,SAAS,EACrE,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACX,SAAS,WAAW,cAAc;AAAA,MAClC,MAAM,WAAW,WAAW;AAAA,MAC5B,UAAU,WAAW,IAAI;AAAA,MAExB;AAAA,qBAAa,QAAQ,OAAO,MAC3B,6CAAC,SAAI,WAAU,mBACb,uDAAC,SAAI,KAAK,QAAQ,MAAM,KAAK,KAAK,QAAQ,MAAM,GAClD,IACE;AAAA,QACJ,8CAAC,SAAI,WAAU,oBACb;AAAA,uDAAC,QAAG,WAAU,mBAAmB,kBAAQ,MAAK;AAAA,UAC7C,aAAa,OAAO,QAAQ,UAAU,YAAY,QAAQ,QAAQ,IACjE,8CAAC,UAAK,WAAU,mBAAkB;AAAA;AAAA,aAAG,QAAQ,QAAQ,KAAK,QAAQ,CAAC;AAAA,aAAE,IACnE;AAAA,WACN;AAAA,QACC,mBAAmB,QAAQ,cAC1B,6CAAC,OAAE,WAAU,yBAAyB,kBAAQ,aAAY,IACxD;AAAA,QACJ,8CAAC,SAAI,WAAU,kBACb;AAAA,wDAAC,UAAM;AAAA,oBAAQ;AAAA,YAAS;AAAA,aAAI;AAAA,UAC3B,QAAQ,WAAW,6CAAC,UAAM,kBAAQ,UAAS,IAAU;AAAA,WACxD;AAAA;AAAA;AAAA,EACF;AAEJ;;;ACdW,IAAAC,sBAAA;AAlBJ,SAAS,aAAa;AAAA,EAC3B,SAAS;AAAA,EACT,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB;AACF,GAAsB;AACpB,QAAM,EAAE,MAAM,WAAW,MAAM,IAAI,YAAY,KAAK;AAEpD,MAAI,WAAW;AACb,WAAO,6CAAC,SAAI,WAAU,aAAa,0BAAe;AAAA,EACpD;AAEA,MAAI,WAAW,MAAM,WAAW,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC;AAEtD,MAAI,QAAQ;AACV,eAAW,SAAS,OAAO,MAAM;AAAA,EACnC;AAEA,MAAI,MAAM;AACR,eAAW,SAAS,KAAK,IAAI;AAAA,EAC/B;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,eAAW,SAAS,MAAM,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AAAA,EACjD;AAEA,MAAI,SAAS,SAAS,WAAW,GAAG;AAClC,WAAO,6CAAC,SAAI,WAAU,aAAa,wBAAa;AAAA,EAClD;AAEA,QAAM,YAAY,WAAW,SACzB,EAAE,qBAAqB,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC,oBAAoB,IACzE;AAEJ,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,WAAW,SAAS,uBAAuB;AAAA,QAC3C;AAAA,MACF,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACX,OAAO;AAAA,MAEN,mBAAS,IAAI,CAAC,YACb;AAAA,QAAC;AAAA;AAAA,UAEC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,QALK,QAAQ;AAAA,MAMf,CACD;AAAA;AAAA,EACH;AAEJ;;;ACxCQ,IAAAC,sBAAA;AA9CR,IAAM,aACJ;AAEF,SAAS,UAAU,KAAqB;AACtC,MAAI,IAAI,SAAS,GAAG,KAAK,CAAC,IAAI,WAAW,MAAM,GAAG;AAChD,WAAO,UAAU,GAAG;AAAA,EACtB;AACA,MAAI,IAAI,WAAW,SAAS,KAAK,IAAI,WAAW,UAAU,GAAG;AAC3D,WAAO;AAAA,EACT;AACA,MAAI,IAAI,WAAW,MAAM,GAAG;AAC1B,WAAO,WAAW,GAAG;AAAA,EACvB;AACA,SAAO,WAAW,GAAG;AACvB;AAEA,SAAS,wBAAwB,OAAmD;AAClF,MAAI,OAAO;AACX,MAAI,WAAW;AACf,SAAO,QAAQ,cAAc,KAAK,IAAI,GAAG;AACvC,eAAW,KAAK,MAAM,EAAE,IAAI;AAC5B,WAAO,KAAK,MAAM,GAAG,EAAE;AAAA,EACzB;AACA,SAAO,EAAE,MAAM,SAAS;AAC1B;AAEO,SAAS,iBAAiB,MAAuC;AACtE,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,UAAU,MAAM,KAAK,KAAK,SAAS,UAAU,CAAC;AACpD,MAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,QAAM,QAA2B,CAAC;AAClC,MAAI,YAAY;AAEhB,UAAQ,QAAQ,CAAC,OAAO,UAAU;AAChC,UAAM,YAAY,MAAM,CAAC;AACzB,UAAM,QAAQ,MAAM,SAAS;AAE7B,QAAI,QAAQ,WAAW;AACrB,YAAM,KAAK,KAAK,MAAM,WAAW,KAAK,CAAC;AAAA,IACzC;AAEA,UAAM,EAAE,MAAM,WAAW,SAAS,IAAI,wBAAwB,SAAS;AACvE,QAAI,WAAW;AACb,YAAM,OAAO,UAAU,SAAS;AAChC,YAAM;AAAA,QACJ,6CAAC,OAAiC,MAAY,QAAO,UAAS,KAAI,uBAC/D,uBADK,QAAQ,KAAK,IAAI,KAAK,EAE9B;AAAA,MACF;AAAA,IACF;AAEA,QAAI,UAAU;AACZ,YAAM,KAAK,QAAQ;AAAA,IACrB;AAEA,gBAAY,QAAQ,UAAU;AAAA,EAChC,CAAC;AAED,MAAI,YAAY,KAAK,QAAQ;AAC3B,UAAM,KAAK,KAAK,MAAM,SAAS,CAAC;AAAA,EAClC;AAEA,SAAO;AACT;;;AChCQ,IAAAC,sBAAA;AAnBD,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,SAAS;AAAA,EACT,gBAAgB;AAClB,GAAoB;AAClB,QAAM,WAAW,OAAO,MACpB,MAAM,GAAG,EACV,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC,EACrB,MAAM,GAAG,CAAC,EACV,KAAK,EAAE,EACP,YAAY;AAEf,QAAM,SACJ,6CAAC,SAAI,WAAU,oBACZ,iBAAO,OAAO,MACb,6CAAC,SAAI,KAAK,OAAO,MAAM,KAAK,KAAK,OAAO,MAAM,IAE9C,6CAAC,UAAM,oBAAS,GAEpB;AAGF,MAAI,WAAW,WAAW;AACxB,WACE,8CAAC,SAAI,WAAW,CAAC,qBAAqB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GACtE;AAAA,wBAAkB,SAAS,SAAS;AAAA,MACrC,8CAAC,SAAI,WAAU,kBACb;AAAA,qDAAC,QAAG,WAAU,mBAAmB,iBAAO,MAAK;AAAA,QAC5C,WACC,6CAAC,OAAE,WAAU,yBAAyB,iBAAO,QAAQ,SAAQ,IAC3D;AAAA,QACH,WAAW,OAAO,MACjB,6CAAC,OAAE,WAAU,iBAAiB,2BAAiB,OAAO,GAAG,GAAE,IACzD;AAAA,QACH,YACC,6CAAC,OAAE,WAAU,kBAAkB,iBAAO,OAAM,IAC1C;AAAA,SACN;AAAA,MACC,kBAAkB,UAAU,SAAS;AAAA,OACxC;AAAA,EAEJ;AAEA,SACE,8CAAC,SAAI,WAAW,CAAC,YAAY,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAC9D;AAAA,iDAAC,SAAI,WAAU,oBACZ,iBAAO,OAAO,MACb,6CAAC,SAAI,KAAK,OAAO,MAAM,KAAK,KAAK,OAAO,MAAM,IAE9C,6CAAC,UAAM,oBAAS,GAEpB;AAAA,IACA,8CAAC,SAAI,WAAU,kBACb;AAAA,mDAAC,QAAG,WAAU,mBAAmB,iBAAO,MAAK;AAAA,MAC5C,WACC,6CAAC,OAAE,WAAU,yBAAyB,iBAAO,QAAQ,SAAQ,IAC3D;AAAA,MACH,WAAW,OAAO,MACjB,6CAAC,OAAE,WAAU,iBAAiB,2BAAiB,OAAO,GAAG,GAAE,IACzD;AAAA,MACH,YACC,6CAAC,OAAE,WAAU,kBAAkB,iBAAO,OAAM,IAC1C;AAAA,OACN;AAAA,KACF;AAEJ;;;AC7CW,IAAAC,sBAAA;AAlBJ,SAAS,SAAS;AAAA,EACvB,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,iBAAiB;AACnB,GAAkB;AAChB,QAAM,EAAE,MAAM,WAAW,MAAM,IAAI,QAAQ,KAAK;AAEhD,MAAI,WAAW;AACb,WAAO,6CAAC,SAAI,WAAU,aAAa,0BAAe;AAAA,EACpD;AAEA,MAAI,UAAU,MAAM,OAAO,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC;AAE7C,MAAI,QAAQ;AACV,cAAU,QAAQ,OAAO,MAAM;AAAA,EACjC;AAEA,MAAI,MAAM;AACR,cAAU,QAAQ,KAAK,IAAI;AAAA,EAC7B;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,cAAU,QAAQ,MAAM,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AAAA,EAC/C;AAEA,MAAI,SAAS,QAAQ,WAAW,GAAG;AACjC,WAAO,6CAAC,SAAI,WAAU,aAAa,wBAAa;AAAA,EAClD;AAEA,QAAM,YAAY,EAAE,qBAAqB,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC,oBAAoB;AAE3F,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,CAAC,YAAY,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAC3D,OAAO;AAAA,MAEN,kBAAQ,IAAI,CAAC,WACZ;AAAA,QAAC;AAAA;AAAA,UAEC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,QANK,OAAO;AAAA,MAOd,CACD;AAAA;AAAA,EACH;AAEJ;;;AC/EA,IAAAC,gBAAyB;AACzB,IAAAC,sBAA4B;AAuEpB,IAAAC,sBAAA;AAvDR,IAAM,iBAAiC,CAAC,QAAQ,SAAS,SAAS,SAAS;AAEpE,SAAS,YAAY;AAAA,EAC1B,SAAS;AAAA,EACT,WAAW;AAAA,EACX,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AACF,GAAqB;AACnB,QAAM,SAAS,kBAAkB;AACjC,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAuC;AAAA,IACvE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,QAAM,eAAW,iCAAY;AAAA,IAC3B,YAAY,CAAC,YACX,WAA8C,QAAQ,YAAY;AAAA,MAChE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,OAAO;AAAA,IAC9B,CAAC;AAAA,IACH,WAAW,MAAM;AACf,mBAAa,EAAE,MAAM,IAAI,OAAO,IAAI,OAAO,IAAI,SAAS,IAAI,SAAS,GAAG,CAAC;AACzE,kBAAY;AAAA,IACd;AAAA,IACA,SAAS,CAAC,UAAU;AAClB,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,gBAAU,OAAO;AAAA,IACnB;AAAA,EACF,CAAC;AAED,QAAM,eAAe,CAAC,OAAqB,UAAkB;AAC3D,iBAAa,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,EAAE;AAAA,EACtD;AAEA,QAAM,eAAe,CAAC,UAA4C;AAChE,UAAM,eAAe;AAErB,aAAS,OAAO;AAAA,MACd,MAAM,UAAU;AAAA,MAChB,OAAO,UAAU;AAAA,MACjB,OAAO,UAAU,SAAS;AAAA,MAC1B,SAAS,UAAU,WAAW;AAAA,MAC9B,SAAS,UAAU;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SACE,8CAAC,UAAK,WAAW,CAAC,YAAY,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAG,UAAU,cAC3E;AAAA,WAAO,SAAS,MAAM,KACrB,8CAAC,WAAM,WAAU,mBACf;AAAA,mDAAC,UAAK,kBAAI;AAAA,MACV;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,UAAU;AAAA,UACjB,UAAU,CAAC,UAAU,aAAa,QAAQ,MAAM,OAAO,KAAK;AAAA,UAC5D,UAAQ;AAAA;AAAA,MACV;AAAA,OACF;AAAA,IAED,OAAO,SAAS,OAAO,KACtB,8CAAC,WAAM,WAAU,mBACf;AAAA,mDAAC,UAAK,mBAAK;AAAA,MACX;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,OAAO,UAAU;AAAA,UACjB,UAAU,CAAC,UAAU,aAAa,SAAS,MAAM,OAAO,KAAK;AAAA,UAC7D,UAAQ;AAAA;AAAA,MACV;AAAA,OACF;AAAA,IAED,OAAO,SAAS,OAAO,KACtB,8CAAC,WAAM,WAAU,mBACf;AAAA,mDAAC,UAAK,mBAAK;AAAA,MACX;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,UAAU;AAAA,UACjB,UAAU,CAAC,UAAU,aAAa,SAAS,MAAM,OAAO,KAAK;AAAA;AAAA,MAC/D;AAAA,OACF;AAAA,IAED,OAAO,SAAS,SAAS,KACxB,8CAAC,WAAM,WAAU,mBACf;AAAA,mDAAC,UAAK,qBAAO;AAAA,MACb;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,UAAU;AAAA,UACjB,UAAU,CAAC,UAAU,aAAa,WAAW,MAAM,OAAO,KAAK;AAAA;AAAA,MACjE;AAAA,OACF;AAAA,IAED,OAAO,SAAS,SAAS,KACxB,8CAAC,WAAM,WAAU,mBACf;AAAA,mDAAC,UAAK,qBAAO;AAAA,MACb;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,UAAU;AAAA,UACjB,UAAU,CAAC,UAAU,aAAa,WAAW,MAAM,OAAO,KAAK;AAAA,UAC/D,MAAM;AAAA,UACN,UAAQ;AAAA;AAAA,MACV;AAAA,OACF;AAAA,IAEF,6CAAC,YAAO,MAAK,UAAS,WAAU,cAAa,UAAU,SAAS,WAC7D,mBAAS,YAAY,eAAe,aACvC;AAAA,IACC,SAAS,UACR,6CAAC,OAAE,WAAU,mBAAkB,qDAAuC,IACpE;AAAA,IACH,SAAS,YACR,6CAAC,OAAE,WAAU,qBAAoB,6CAAoC,IACnE;AAAA,KACN;AAEJ;;;ACpIA,IAAAC,gBAA8B;AA6FnB,IAAAC,sBAAA;AAhDX,IAAMC,iBAAgB,CAAC,UAAuC;AAC5D,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,aAAa,MAAM,SAAS,GAAG,IAAI,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI;AAC/D,QAAM,SAAS,oBAAI,KAAK,GAAG,UAAU,WAAW;AAChD,SAAO,OAAO,MAAM,OAAO,QAAQ,CAAC,IAAI,OAAO;AACjD;AAEO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA,2BAA2B;AAAA,EAC3B,gBAAgB;AAAA,EAChB;AAAA,EACA,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB;AAAA,EACA,cAAc;AAAA,EACd,eAAe;AAAA,EACf;AAAA,EACA,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,mBAAmB;AAAA,EACnB,mBAAmB,CAAC;AAAA,EACpB,GAAG;AACL,GAAuB;AACrB,QAAM,gBAAY,sBAA8B,IAAI;AAEpD,QAAM,KAAK,iBAAiB;AAAA,IAC1B,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAmC;AAEnC,QAAM,aAAa,MAAM;AAAE,UAAM,MAAM,oBAAI,KAAK;AAAG,QAAI,SAAS,GAAG,GAAG,GAAG,CAAC;AAAG,WAAO;AAAA,EAAI,GAAG;AAC3F,QAAM,sBAAsB,IAAI,IAAI,gBAAgB;AACpD,QAAM,iBAAiB,yBAAyB,GAAG;AACnD,QAAM,sBAAsB,uBAAuB,GAAG;AAEtD,MAAI,GAAG,mBAAmB;AACxB,WAAO,6CAAC,SAAI,WAAU,aAAY,wCAA0B;AAAA,EAC9D;AAEA,MAAI,CAAC,GAAG,aAAa,QAAQ;AAC3B,WAAO,6CAAC,SAAI,WAAU,aAAY,oCAAsB;AAAA,EAC1D;AAEA,SACE,8CAAC,SAAI,KAAK,WAAW,WAAW,CAAC,eAAe,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GACjF;AAAA,kDAAC,SAAI,WAAU,uBACb;AAAA,oDAAC,SAAI,WAAU,2BACb;AAAA,qDAAC,QAAG,WAAU,sBAAsB,iBAAM;AAAA,QACzC,WAAW,6CAAC,OAAE,WAAU,yBAAyB,oBAAS,IAAO;AAAA,SACpE;AAAA,MACC,GAAG,SAAS,aAAa,GAAG,SAAS,SACpC,6CAAC,YAAO,MAAK,UAAS,WAAU,YAAW,SAAS,GAAG,QAAQ,kBAE/D,IACE;AAAA,OACN;AAAA,IAEC,GAAG,SAAS,SACX,8CAAC,SAAI,WAAU,yBACb;AAAA,oDAAC,UAAK;AAAA;AAAA,QAAM,GAAG;AAAA,QAAW;AAAA,QAAK,GAAG;AAAA,SAAW;AAAA,MAC7C,6CAAC,SAAI,WAAU,oBACb;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,EAAE,OAAO,GAAI,GAAG,aAAa,GAAG,aAAc,GAAG,IAAI;AAAA;AAAA,MAC9D,GACF;AAAA,OACF,IACE;AAAA,IAEH,GAAG,SAAS,aACX,8CAAC,SAAI,WAAU,qBACb;AAAA,mDAAC,QAAG,8BAAgB;AAAA,MAClB,uBAAuB,uBACvB,8CAAC,SAAI,WAAU,wBACZ;AAAA,8BACC;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO,GAAG;AAAA,YACV,UAAU,CAAC,UAAU,GAAG,iBAAiB,MAAM,OAAO,KAAK;AAAA,YAC3D,aAAa;AAAA;AAAA,QACf,IACE;AAAA,QACH,wBAAwB,GAAG,WAAW,SAAS,IAC9C;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,GAAG;AAAA,YACV,UAAU,CAAC,UAAU,GAAG,kBAAkB,MAAM,OAAO,KAAK;AAAA,YAE5D;AAAA,2DAAC,YAAO,OAAM,OAAO,yBAAc;AAAA,cAClC,GAAG,WAAW,IAAI,CAAC,aAClB,6CAAC,YAAsB,OAAO,UAAW,sBAA5B,QAAqC,CACnD;AAAA;AAAA;AAAA,QACH,IACE;AAAA,SACN,IACE;AAAA,MAEH,GAAG,iBAAiB,WAAW,IAC9B,6CAAC,SAAI,WAAU,aAAY,6CAA+B,IAE1D;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA,kBAAkB,SAAS,uBAAuB;AAAA,UACpD,EAAE,KAAK,GAAG;AAAA,UACV,OAAO;AAAA,YACL,GAAI,kBAAkB,SAClB,EAAE,qBAAqB,UAAU,KAAK,IAAI,GAAG,cAAc,CAAC,oBAAoB,IAChF;AAAA,YACJ,GAAI,uBAAuB,EAAE,WAAW,sBAAsB,UAAU,OAAO,IAAI;AAAA,UACrF;AAAA,UAEC,aAAG,cAAc,IAAI,CAAC,YAAY;AACjC,kBAAM,aAAa,GAAG,iBAAiB,OAAO,QAAQ;AACtD,mBACE;AAAA,cAAC;AAAA;AAAA,gBAEC,MAAK;AAAA,gBACL,WAAW,CAAC,YAAY,uBAAuB,aAAa,cAAc,EAAE,EAAE,KAAK,GAAG;AAAA,gBACtF,SAAS,MAAM,GAAG,cAAc,OAAO;AAAA,gBAEvC;AAAA,gEAAC,SAAI,WAAU,oBACb;AAAA,iEAAC,UAAK,WAAU,mBAAmB,kBAAQ,MAAK;AAAA,oBAChD,8CAAC,UAAK,WAAU,mBACb;AAAA,mCAAa,6CAAC,UAAK,WAAU,mBAAkB,oBAAC,IAAU;AAAA,sBAC1D,OAAO,QAAQ,UAAU,YAAY,QAAQ,QAAQ,IACpD,8CAAC,UAAK,WAAU,mBAAkB;AAAA;AAAA,yBAC7B,QAAQ,QAAQ,KAAK,QAAQ,CAAC;AAAA,yBACnC,IACE;AAAA,uBACN;AAAA,qBACF;AAAA,kBACC,QAAQ,cACP,6CAAC,SAAI,WAAU,yBAAyB,kBAAQ,aAAY,IAC1D;AAAA,kBACJ,8CAAC,SAAI,WAAU,kBACb;AAAA,iEAAC,UAAM,aAAG,eAAe,QAAQ,QAAQ,GAAE;AAAA,oBAC1C,QAAQ,WAAW,6CAAC,UAAK,WAAU,YAAY,kBAAQ,UAAS,IAAU;AAAA,qBAC7E;AAAA;AAAA;AAAA,cAtBK,QAAQ;AAAA,YAuBf;AAAA,UAEJ,CAAC;AAAA;AAAA,MACH;AAAA,MAGF,8CAAC,SAAI,WAAU,wBACZ;AAAA,yBACC;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,GAAG;AAAA,YACZ,UAAU,CAAC,GAAG;AAAA,YAEb,aAAG,kBAAkB,uBAAuB;AAAA;AAAA,QAC/C,IACE;AAAA,QACH,GAAG,mBAAmB,CAAC,UAAU,sBAChC,6CAAC,YAAO,MAAK,UAAS,WAAU,cAAa,SAAS,GAAG,qBAAqB,sBAE9E,IACE;AAAA,SACN;AAAA,OACF;AAAA,IAGD,GAAG,SAAS,WACX,8CAAC,SAAI,WAAU,qBACb;AAAA,mDAAC,QAAG,kCAAoB;AAAA,MACvB,GAAG,aAAa,WAAW,IAC1B,6CAAC,SAAI,WAAU,aAAY,wCAA0B,IAErD;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA,gBAAgB,SAAS,mBAAmB;AAAA,UAC9C,EAAE,KAAK,GAAG;AAAA,UACV,OACE,gBAAgB,SACZ,EAAE,qBAAqB,UAAU,KAAK,IAAI,GAAG,YAAY,CAAC,oBAAoB,IAC9E;AAAA,UAGJ;AAAA,uBAAU,sBAAsB,SAAS,GAAG,eAC5C;AAAA,cAAC;AAAA;AAAA,gBAEC,MAAK;AAAA,gBACL,WAAW,CAAC,YAAY,uBAAuB,CAAC,GAAG,gBAAgB,cAAc,EAAE,EAAE,KAAK,GAAG;AAAA,gBAC7F,SAAS,MAAM,GAAG,YAAY,IAAI;AAAA,gBAElC;AAAA,gEAAC,SAAI,WAAU,oBACb;AAAA,iEAAC,UAAK,WAAU,mBAAkB,2BAAa;AAAA,oBAC/C,6CAAC,UAAK,WAAU,mBAAkB,yBAAW;AAAA,qBAC/C;AAAA,kBACA,6CAAC,OAAE,WAAU,yBAAwB,+DAErC;AAAA;AAAA;AAAA,cAXI;AAAA,YAYN,IACE;AAAA,YACH,GAAG,WAAW,IAAI,CAAC,UAClB;AAAA,cAAC;AAAA;AAAA,gBAEC,MAAK;AAAA,gBACL,WAAW,CAAC,YAAY,uBAAuB,GAAG,eAAe,OAAO,MAAM,KAAK,cAAc,EAAE,EAAE,KAAK,GAAG;AAAA,gBAC7G,SAAS,MAAM,GAAG,YAAY,KAAK;AAAA,gBAEnC,wDAAC,SAAI,WAAU,kBACb;AAAA,+DAAC,SAAI,WAAU,oBACZ,gBAAM,OAAO,MACZ,6CAAC,SAAI,KAAK,MAAM,MAAM,KAAK,KAAK,MAAM,MAAM,IAE5C,6CAAC,UAAM,gBAAM,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,GAAE,GAE3F;AAAA,kBACA,8CAAC,SACC;AAAA,iEAAC,UAAK,WAAU,mBAAmB,gBAAM,MAAK;AAAA,oBAC9C,6CAAC,UAAK,WAAU,kBAAkB,gBAAM,QAAQ,SAAQ;AAAA,oBACvD,MAAM,MAAM,6CAAC,OAAE,WAAU,yBAAyB,2BAAiB,MAAM,GAAG,GAAE,IAAO;AAAA,qBACxF;AAAA,mBACF;AAAA;AAAA,cAlBK,MAAM;AAAA,YAmBb,CACD;AAAA;AAAA;AAAA,MACH;AAAA,MAEF,8CAAC,SAAI,WAAU,wBACZ;AAAA,8BACC;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,GAAG;AAAA,YACZ,UAAU,CAAC,GAAG,gBAAgB,GAAG,cAAc;AAAA,YAE9C,aAAG,eAAe,oBAAoB,GAAG,YAAY,IAAI,qBAAqB;AAAA;AAAA,QACjF,IACE;AAAA,QACH,GAAG,eACF;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM;AACb,iBAAG,YAAY,IAAI;AACnB,iBAAG,kBAAkB;AAAA,YACvB;AAAA,YACD;AAAA;AAAA,QAED,IACE;AAAA,QACH,CAAC,UAAU,sBACV;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,GAAG;AAAA,YACZ,UAAU,CAAC,GAAG,gBAAgB,CAAC,GAAG;AAAA,YACnC;AAAA;AAAA,QAED,IACE;AAAA,SACN;AAAA,OACF;AAAA,IAGD,GAAG,SAAS,UACX,8CAAC,SAAI,WAAU,qBACb;AAAA,mDAAC,QAAG,2BAAa;AAAA,MAChB,GAAG,wBACF,6CAAC,SAAI,WAAU,aAAY,qCAAuB,IAChD,GAAG,kBAAkB,SAAS,IAChC,8CAAC,SAAI,WAAW,CAAC,oBAAoB,eAAe,UAAU,4BAA4B,EAAE,EAAE,KAAK,GAAG,GACpG;AAAA,qDAAC,SAAI,WAAU,2BACX,qBAAU,kBAAkB,YAAY,aACxC;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,oBAAoB,YAAY,0BAA0B;AAAA,YAC5D,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,YAE1B;AAAA,2DAAC,SAAI,WAAU,wBACZ,8BAAoB,YACnB,8CAAC,SAAI,WAAU,sDACb;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,WAAU;AAAA,oBACV,SAAS,GAAG;AAAA,oBACZ,UAAU,GAAG,iBAAiB,IAAI,KAAK,UAAU,YAAY,GAAG,UAAU,SAAS,GAAG,CAAC;AAAA,oBACvF,cAAW;AAAA,oBAEV;AAAA;AAAA,gBACH;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,OAAO,GAAG,GAAG,cAAc,YAAY,CAAC,IAAI,OAAO,GAAG,cAAc,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;AAAA,oBACpG,UAAU,CAAC,UAAU,GAAG,kBAAkB,MAAM,OAAO,KAAK;AAAA,oBAE3D,aAAG,aAAa,IAAI,CAAC,WACpB,6CAAC,YAA0B,OAAO,OAAO,OACtC,iBAAO,SADG,OAAO,KAEpB,CACD;AAAA;AAAA,gBACH;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,WAAU;AAAA,oBACV,SAAS,GAAG;AAAA,oBACZ,UAAU,QAAQ,GAAG,wBAAwB,GAAG,iBAAiB,GAAG,oBAAoB;AAAA,oBACxF,cAAW;AAAA,oBAEV;AAAA;AAAA,gBACH;AAAA,iBACF,IAEA,8EACE;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,WAAU;AAAA,oBACV,SAAS,GAAG;AAAA,oBACZ,UAAU,GAAG,iBAAiB,IAAI,KAAK,UAAU,YAAY,GAAG,UAAU,SAAS,GAAG,CAAC;AAAA,oBACxF;AAAA;AAAA,gBAED;AAAA,gBACA,6CAAC,SAAI,WAAU,uBACZ,cAAI,KAAK,eAAe,SAAS,EAAE,OAAO,QAAQ,MAAM,UAAU,CAAC,EAAE,OAAO,GAAG,aAAa,GAC/F;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,WAAU;AAAA,oBACV,SAAS,GAAG;AAAA,oBACZ,UAAU,QAAQ,GAAG,wBAAwB,GAAG,iBAAiB,GAAG,oBAAoB;AAAA,oBACzF;AAAA;AAAA,gBAED;AAAA,iBACF,GAEJ;AAAA,cACA,6CAAC,SAAI,WAAU,0BACZ,WAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK,EAAE,IAAI,CAAC,UACtD,6CAAC,UAAkB,mBAAR,KAAc,CAC1B,GACH;AAAA,cACA,6CAAC,SAAI,WAAU,sBACZ,aAAG,aAAa,IAAI,CAAC,QAAQ;AAC5B,sBAAM,QAAQ,GAAG,mBAAmB,IAAI,IAAI,IAAI;AAChD,sBAAM,eAAe,OAAO,OAAO,KAAK,CAAC,SAA2B,KAAK,SAAS,KAAK;AACvF,sBAAM,YAAYA,eAAc,IAAI,IAAI;AACxC,sBAAM,SAAS,YAAY,YAAY,YAAY;AACnD,sBAAM,cAAc,GAAG,iBAAkB,YAAY,YAAY,GAAG,iBAAiB,QAAS;AAC9F,sBAAM,UAAU,YAAY,UAAU,OAAO,IAAI;AACjD,sBAAM,oBAAoB,YAAY,OAAO,oBAAoB,IAAI,OAAO,IAAI;AAChF,sBAAM,YAAY,QAAQ,KAAK,KAAK,CAAC;AACrC,sBAAM,aAAa,CAAC,SAAS,UAAU,eAAe,aAAa;AACnE,sBAAM,WAAW,GAAG,iBAAiB,IAAI;AACzC,uBACE;AAAA,kBAAC;AAAA;AAAA,oBAEC,MAAK;AAAA,oBACL,WAAW;AAAA,sBACT;AAAA,sBACA,IAAI,iBAAiB,KAAK;AAAA,sBAC1B,eAAe,iBAAiB;AAAA,sBAChC,YAAY,eAAe;AAAA,sBAC3B,oBAAoB,gBAAgB;AAAA,sBACpC,WAAW,cAAc;AAAA,oBAC3B,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,oBAC1B,UAAU;AAAA,oBACV,SAAS,MAAM,GAAG,WAAW,IAAI,IAAI;AAAA,oBAErC;AAAA,mEAAC,UAAM,cAAI,KAAK,MAAM,GAAG,EAAE,CAAC,GAAE;AAAA,sBAC7B,wBAAwB,aAAa,IAAI,iBACxC,6CAAC,UAAK,WAAU,uBACb,8BAAoB,YAAY,WAAM,gBACzC,IACE;AAAA;AAAA;AAAA,kBAlBC,IAAI;AAAA,gBAmBX;AAAA,cAEJ,CAAC,GACH;AAAA,cACC,wBAAwB,oBAAoB,aAAa,GAAG,2BAC3D,8CAAC,SAAI,WAAU,wBACb;AAAA,6DAAC,UAAK,WAAU,4BAA2B,oBAAC;AAAA,gBAAO;AAAA,iBACrD,IACE;AAAA;AAAA;AAAA,QACN,IAEA,8EACG;AAAA,6BACC,8CAAC,SAAI,WAAU,yBACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,SAAS,GAAG;AAAA,gBACZ,UAAU,GAAG,0BAAyB,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,gBAC3E;AAAA;AAAA,YAED;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,SAAS,GAAG;AAAA,gBACb;AAAA;AAAA,YAED;AAAA,aACF,IACE;AAAA,UACH,GAAG,kBAAkB,IAAI,CAAC,UACzB;AAAA,YAAC;AAAA;AAAA,cAEC,MAAK;AAAA,cACL,WAAW,MAAM,SAAS,GAAG,eAAe,cAAc;AAAA,cAC1D,SAAS,MAAM,GAAG,WAAW,MAAM,IAAI;AAAA,cAEvC,uDAAC,UAAK,WAAU,sBAAsB,aAAG,gBAAgB,MAAM,IAAI,GAAE;AAAA;AAAA,YALhE,MAAM;AAAA,UAMb,CACD;AAAA,WACH,GAEJ;AAAA,QACA,8CAAC,SAAI,WAAU,2BACb;AAAA,uDAAC,SAAI,WAAU,kCACb,wDAAC,SACC;AAAA,yDAAC,SAAI,WAAU,iCACZ,aAAG,eACA,GAAG,kBAAkB,GAAG,YAAY,IACpC,GAAG,kBAAkB,CAAC,GAAG,OACvB,GAAG,kBAAkB,GAAG,kBAAkB,CAAC,EAAE,IAAI,IACjD,iBACR;AAAA,YACA,6CAAC,SAAI,WAAU,oCAAoC,aAAG,eAAc;AAAA,aACtE,GACF;AAAA,UACA,6CAAC,SAAI,WAAU,2BACX,iBAAM;AACN,kBAAM,cAAc,GAAG,eACnB,GAAG,kBAAkB,KAAK,CAAC,UAAU,MAAM,SAAS,GAAG,YAAY,IACnE,GAAG,kBAAkB,CAAC;AAC1B,gBAAI,CAAC,YAAa,QAAO,6CAAC,SAAI,WAAU,aAAY,yCAA2B;AAC/E,kBAAM,kBAAkB,YAAY,SAAS,CAAC,GAC3C,OAAO,CAAC,SAA2B,KAAK,SAAS,EACjD,KAAK,CAAC,GAAG,MAAM;AACd,oBAAM,QAAQ,IAAI,KAAK,EAAE,IAAI,EAAE,QAAQ,KAAK,OAAO;AACnD,oBAAM,QAAQ,IAAI,KAAK,EAAE,IAAI,EAAE,QAAQ,KAAK,OAAO;AACnD,kBAAI,UAAU,OAAO;AACnB,sBAAM,OAAO,IAAI,KAAK,EAAE,OAAO,EAAE,QAAQ,KAAK,OAAO;AACrD,sBAAM,OAAO,IAAI,KAAK,EAAE,OAAO,EAAE,QAAQ,KAAK,OAAO;AACrD,uBAAO,OAAO;AAAA,cAChB;AACA,qBAAO,QAAQ;AAAA,YACjB,CAAC;AAEH,kBAAM,QAAQ,eAAe;AAAA,cAC3B,CAAC,MAAM,UACL,UAAU,KACV,KAAK,SAAS,eAAe,QAAQ,CAAC,EAAE,QACxC,KAAK,YAAY,eAAe,QAAQ,CAAC,EAAE;AAAA,YAC/C;AAEA,gBAAI,MAAM,WAAW,GAAG;AACtB,qBAAO,6CAAC,SAAI,WAAU,aAAY,+CAAiC;AAAA,YACrE;AACA,mBAAO,MAAM,IAAI,CAAC,MAAM,UACtB;AAAA,cAAC;AAAA;AAAA,gBAEC,MAAK;AAAA,gBACL,WACE,KAAK,SAAS,GAAG,gBAAgB,KAAK,YAAY,GAAG,kBACjD,cACA;AAAA,gBAEN,SAAS,MAAM;AACb,wBAAM,OAAO,GAAG,gBAAgB,YAAY;AAC5C,sBAAI,CAAC,GAAG,aAAc,IAAG,WAAW,IAAI;AACxC,qBAAG,WAAW,KAAK,MAAM,KAAK,OAAO;AAAA,gBACvC;AAAA,gBAEC,aAAG,gBAAgB,KAAK,IAAI;AAAA;AAAA,cAbxB,GAAG,YAAY,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,OAAO,IAAI,KAAK;AAAA,YAchE,CACD;AAAA,UACH,GAAG,GACL;AAAA,WACF;AAAA,SACF,IAEA,6CAAC,SAAI,WAAU,aAAY,oCAAsB;AAAA,MAElD,CAAC,UAAU,sBACV,6CAAC,SAAI,WAAU,wBACb;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS,GAAG;AAAA,UACZ,UAAU,CAAC,GAAG,gBAAgB,CAAC,GAAG;AAAA,UACnC;AAAA;AAAA,MAED,GACF,IACE;AAAA,OACN;AAAA,IAGD,GAAG,SAAS,aACX,8CAAC,UAAK,WAAU,YAAW,UAAU,GAAG,eACtC;AAAA,mDAAC,QAAG,0BAAY;AAAA,MACf,GAAG,eAAe,6CAAC,SAAI,WAAU,sBAAsB,aAAG,cAAa,IAAS;AAAA,MAChF,GAAG,mBAAmB,GAAG,eACxB,8CAAC,SAAI,WAAU,wBACb;AAAA,sDAAC,SACC;AAAA,uDAAC,UAAK,WAAU,8BAA6B,qBAAO;AAAA,UACpD,6CAAC,OAAG,aAAG,gBAAgB,MAAK;AAAA,WAC9B;AAAA,QACC,GAAG,gBACF,8CAAC,SACC;AAAA,uDAAC,UAAK,WAAU,8BAA6B,mBAAK;AAAA,UAClD,6CAAC,OAAG,aAAG,cAAc,MAAK;AAAA,WAC5B,IACE;AAAA,QACJ,8CAAC,SACC;AAAA,uDAAC,UAAK,WAAU,8BAA6B,kBAAI;AAAA,UACjD,8CAAC,OAAG;AAAA,eAAG,kBAAkB,GAAG,gBAAgB,EAAE;AAAA,YAAE;AAAA,YAAI,GAAG,gBAAgB,GAAG,YAAY;AAAA,aAAE;AAAA,WAC1F;AAAA,QACC,GAAG,gBAAgB,QAClB,8CAAC,SACC;AAAA,uDAAC,UAAK,WAAU,8BAA6B,mBAAK;AAAA,UAClD,8CAAC,OAAE;AAAA;AAAA,aAAG,GAAG,gBAAgB,QAAQ,KAAK,QAAQ,CAAC;AAAA,aAAE;AAAA,WACnD,IACE;AAAA,SACN,IACE;AAAA,MACJ,8CAAC,WAAM,WAAU,mBACf;AAAA,qDAAC,UAAK,kBAAI;AAAA,QACV;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,GAAG,QAAQ;AAAA,YAClB,UAAU,CAAC,UAAU,GAAG,WAAW,CAAC,UAAU,EAAE,GAAG,MAAM,MAAM,MAAM,OAAO,MAAM,EAAE;AAAA,YACpF,UAAQ;AAAA;AAAA,QACV;AAAA,SACF;AAAA,MACA,8CAAC,WAAM,WAAU,mBACf;AAAA,qDAAC,UAAK,mBAAK;AAAA,QACX;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO,GAAG,QAAQ;AAAA,YAClB,UAAU,CAAC,UAAU,GAAG,WAAW,CAAC,UAAU,EAAE,GAAG,MAAM,OAAO,MAAM,OAAO,MAAM,EAAE;AAAA,YACrF,UAAQ;AAAA;AAAA,QACV;AAAA,SACF;AAAA,MACA,8CAAC,WAAM,WAAU,mBACf;AAAA,qDAAC,UAAK,mBAAK;AAAA,QACX;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,GAAG,QAAQ;AAAA,YAClB,UAAU,CAAC,UAAU,GAAG,WAAW,CAAC,UAAU,EAAE,GAAG,MAAM,OAAO,MAAM,OAAO,MAAM,EAAE;AAAA;AAAA,QACvF;AAAA,SACF;AAAA,MACA,8CAAC,WAAM,WAAU,mBACf;AAAA,qDAAC,UAAK,mBAAK;AAAA,QACX;AAAA,UAAC;AAAA;AAAA,YACC,MAAM;AAAA,YACN,OAAO,GAAG,QAAQ;AAAA,YAClB,UAAU,CAAC,UAAU,GAAG,WAAW,CAAC,UAAU,EAAE,GAAG,MAAM,OAAO,MAAM,OAAO,MAAM,EAAE;AAAA;AAAA,QACvF;AAAA,SACF;AAAA,MACA,6CAAC,YAAO,MAAK,UAAS,WAAU,cAAa,UAAU,GAAG,cACvD,aAAG,eAAe,eAAe,mBACpC;AAAA,OACF;AAAA,IAGD,GAAG,SAAS,UACX,8CAAC,SAAI,WAAU,qBACb;AAAA,mDAAC,SAAI,WAAU,2BAA0B,gCAAkB;AAAA,MAC3D,6CAAC,OAAE,WAAU,0BAAyB,oFAEtC;AAAA,MACA,6CAAC,YAAO,MAAK,UAAS,WAAU,YAAW,SAAS,GAAG,OAAO,sCAE9D;AAAA,OACF;AAAA,KAEJ;AAEJ;;;ACvnBA,IAAAC,gBAAgG;AAChG,uBAA6B;AAI7B,0BAIO;AACP,2BAAwC;AACxC,8BAAsB;AACtB,wBAA6B;AAsCO,IAAAC,sBAAA;AApCpC,wBAAAC,QAAU,IAAI,kBAAAC,OAAgB;AAG9B,IAAM,sBAAwD;AAAA,EAC5D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,IAAM,yBAA0D;AAAA,EAC9D,MAAM;AAAA,EAAU,KAAK;AAAA,EAAU,QAAQ;AAAA,EAAU,SAAS;AAAA,EAC1D,MAAM;AAAA,EAAU,QAAQ;AAAA,EAAU,QAAQ;AAAA,EAC1C,SAAS;AAAA,EAAO,UAAU;AAAA,EAAO,KAAK;AAAA,EACtC,MAAM;AAAA,EAAS,OAAO;AAAA,EAAS,UAAU;AAAA,EAAS,UAAU;AAC9D;AAEA,SAAS,gBAAgB,MAAc,WAA6C;AAClF,QAAM,MAAM,EAAE,GAAG,wBAAwB,GAAG,UAAU;AACtD,QAAM,QAAQ,KAAK,YAAY;AAC/B,aAAW,CAAC,IAAI,IAAI,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC5C,QAAI,MAAM,SAAS,EAAE,EAAG,QAAO;AAAA,EACjC;AACA,SAAO;AACT;AAEA,SAAS,YAAY,MAAc;AACjC,SAAO,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,GAAG,CAAC,EAAE,YAAY;AAC3E;AAEA,SAAS,SAAS,KAAa,KAAa;AAC1C,SAAO,IAAI,SAAS,MAAM,IAAI,MAAM,GAAG,GAAG,IAAI,WAAW;AAC3D;AAGA,SAAS,kBAAkB;AAAE,SAAO,6CAAC,4BAAK,MAAM,IAAI;AAAI;AACxD,SAAS,mBAAmB;AAAE,SAAO,6CAAC,yBAAE,MAAM,IAAI;AAAI;AAGtD,SAAS,YAAY,EAAE,MAAM,WAAW,SAAS,SAAS,GAKvD;AACD,SAAO,6CAAC,OAAE,MAAY,WAAsB,SAAmB,UAAS;AAC1E;AA2BO,SAAS,mBAAmB;AAAA,EACjC,WAAW,CAAC;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe,WAAW;AAAA,EAC1B;AACF,IAAwB,CAAC,GAAG;AAC1B,QAAM,gBAAY,sBAAuB,IAAI;AAC7C,QAAM,cAAU,sBAAwB,IAAI;AAC5C,QAAM,mBAAe,sBAAuB,IAAI;AAChD,QAAM,sBAAkB,sBAAiD,IAAI;AAC7E,QAAM,qBAAiB,sBAAuB,IAAI;AAClD,QAAM,sBAAkB,sBAA0B,IAAI;AACtD,QAAM,oBAAgB,sBAAuB,IAAI;AACjD,QAAM,yBAAqB,sBAAiD,IAAI;AAChF,QAAM,gBAAY,sBAAuB,IAAI;AAE7C,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAS,CAAC;AAC9C,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAE5C,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAc,IAAI;AAEtD,QAAM,EAAE,MAAM,WAAW,iBAAiB,OAAO,cAAc,IAAI,YAAY;AAC/E,QAAM,EAAE,MAAM,SAAS,IAAI,QAAQ;AACnC,QAAM,WAAW,UAAU,QAAQ,CAAC;AAEpC,QAAM,KAAK,iBAAiB;AAAA,IAC1B;AAAA,IACA,UAAU,MAAM;AAAA,IAChB,qBAAqB;AAAA,IACrB,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,sBAAsB;AAAA,IACtB,qBAAqB;AAAA,IACrB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,kBAAkB;AAAA,IAClB,iBAAiB;AAAA,EACnB,CAAC;AAGD,QAAM,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AACtD,+BAAU,MAAM;AACd,QAAI,GAAG,yBAAyB,CAAC,GAAG,mBAAmB,CAAC,GAAG,mBAAoB;AAC/E,QAAI,GAAG,aAAc;AACrB,eAAW,OAAO,GAAG,cAAc;AACjC,UAAI,CAAC,IAAI,kBAAkB,IAAI,OAAO,SAAU;AAChD,YAAM,QAAQ,GAAG,mBAAmB,IAAI,IAAI,IAAI;AAChD,UAAI,SAAS,MAAM,OAAO,KAAK,CAAC,MAA8B,EAAE,SAAS,GAAG;AAC1E,WAAG,WAAW,IAAI,IAAI;AACtB;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,GAAG,uBAAuB,GAAG,iBAAiB,IAAI,GAAG,oBAAoB,GAAG,YAAY,CAAC;AAG7F,QAAM,gBAAgB,GAAG,WAAW,UAAU;AAC9C,QAAM,wBAAwB,GAAG,WAAW,SAAS;AACrD,+BAAU,MAAM;AACd,QAAI,iBAAiB,GAAG,mBAAmB,OAAO;AAChD,SAAG,kBAAkB,GAAG,WAAW,CAAC,CAAC;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,GAAG,WAAW,MAAM,CAAC;AAGzB,+BAAU,MAAM;AACd,QAAI,cAAc,CAAC,GAAG,eAAe;AACnC,SAAG,YAAY,UAAU;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,GAAG,eAAe,UAAU,CAAC;AAGjC,QAAM,UACJ,CAAC,mBAAmB,CAAC,GAAG,qBAAqB,CAAC,CAAC,MAAM,UAAU,UAAU,GAAG,SAAS;AAEvF,+BAAU,MAAM;AACd,QAAI,CAAC,QAAS;AACd,UAAM,KAAK,OAAO,WAAW,qBAAqB;AAClD,UAAM,aAAkD,CAAC;AAEzD,UAAM,OAAO;AAAA,MACX,SAAS;AAAA,MACT,qBAAqB;AAAA,MACrB,kBAAkB;AAAA,MAClB,SAAS;AAAA,QACP,YAAY,EAAE,QAAQ,UAAmB,SAAS,MAAM,eAAe,GAAG;AAAA,MAC5E;AAAA,IACF;AAEA,UAAM,OAAO,MAAM;AACjB,iBAAW,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC;AACvC,iBAAW,SAAS;AACpB,UAAI,GAAG,WAAW,aAAa,SAAS;AACtC,mBAAW,KAAK,wBAAAD,QAAU,KAAK,aAAa,SAAS,IAAI,CAAC;AAAA,MAC5D;AACA,UAAI,GAAG,WAAW,eAAe,SAAS;AACxC,mBAAW,KAAK,wBAAAA,QAAU,KAAK,eAAe,SAAS,IAAI,CAAC;AAAA,MAC9D;AAAA,IACF;AAEA,0BAAsB,IAAI;AAC1B,OAAG,iBAAiB,UAAU,IAAI;AAClC,WAAO,MAAM;AACX,SAAG,oBAAoB,UAAU,IAAI;AACrC,iBAAW,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC;AAAA,IACzC;AAAA,EACF,GAAG,CAAC,SAAS,UAAU,CAAC;AAGxB,QAAM,mBAAmB,CAAC,OAA8B;AACtD,QAAI,CAAC,MAAO,OAAO,WAAW,eAAe,OAAO,WAAW,qBAAqB,EAAE,SAAU;AAC9F,UAAI,gBAAgB,SAAS;AAC3B,YAAI;AAAE,0BAAgB,QAAQ,QAAQ;AAAA,QAAG,QAAQ;AAAA,QAAqB;AACtE,wBAAgB,UAAU;AAAA,MAC5B;AACA;AAAA,IACF;AAEA,QAAI,gBAAgB,WAAW,gBAAgB,QAAQ,gBAAgB,IAAI;AACzE,sBAAgB,QAAQ,OAAO;AAC/B;AAAA,IACF;AACA,QAAI,gBAAgB,SAAS;AAC3B,UAAI;AAAE,wBAAgB,QAAQ,QAAQ;AAAA,MAAG,QAAQ;AAAA,MAAqB;AACtE,sBAAgB,UAAU;AAAA,IAC5B;AACA,oBAAgB,UAAU,wBAAAA,QAAU,KAAK,IAAI;AAAA,MAC3C,SAAS;AAAA,MACT,qBAAqB;AAAA,MACrB,kBAAkB;AAAA,MAClB,SAAS;AAAA,QACP,YAAY,EAAE,QAAQ,UAAmB,SAAS,MAAM,eAAe,GAAG;AAAA,MAC5E;AAAA,IACF,CAAC;AAAA,EACH;AAGA,+BAAU,MAAM;AACd,QAAI,CAAC,QAAS;AACd,UAAM,KAAK,OAAO,WAAW,qBAAqB;AAElD,UAAM,OAAO,MAAM;AACjB,UAAI,mBAAmB,SAAS;AAC9B,YAAI;AAAE,6BAAmB,QAAQ,QAAQ;AAAA,QAAG,QAAQ;AAAA,QAAqB;AACzE,2BAAmB,UAAU;AAAA,MAC/B;AACA,UAAI,GAAG,WAAW,cAAc,SAAS;AACvC,2BAAmB,UAAU,wBAAAA,QAAU,KAAK,cAAc,SAAS;AAAA,UACjE,SAAS;AAAA,UACT,qBAAqB;AAAA,UACrB,kBAAkB;AAAA,UAClB,SAAS;AAAA,YACP,YAAY,EAAE,QAAQ,UAAmB,SAAS,MAAM,eAAe,GAAG;AAAA,UAC5E;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,0BAAsB,IAAI;AAC1B,OAAG,iBAAiB,UAAU,IAAI;AAClC,WAAO,MAAM;AACX,SAAG,oBAAoB,UAAU,IAAI;AACrC,UAAI,mBAAmB,SAAS;AAC9B,YAAI;AAAE,6BAAmB,QAAQ,QAAQ;AAAA,QAAG,QAAQ;AAAA,QAAqB;AACzE,2BAAmB,UAAU;AAAA,MAC/B;AAAA,IACF;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AAGZ,+BAAU,MAAM;AACd,QAAI,mBAAmB,SAAS;AAC9B,yBAAmB,QAAQ,SAAS,GAAG,GAAG,CAAC;AAC3C,yBAAmB,QAAQ,OAAO;AAAA,IACpC;AAAA,EACF,GAAG,CAAC,UAAU,CAAC;AAGf,QAAM,cAAc,CAAC,UAAkB;AACrC,UAAM,IAAI,QAAQ;AAClB,WAAO,IAAI,MAAM,IAAI,IAAI,EAAE,QAAQ,CAAC,CAAC,KAAK,IAAI,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC5D;AAEA,QAAM,mBAAmB,CAAC,MAAiB;AACzC,MAAE,eAAe;AACjB,OAAG,cAAc,CAAC;AAAA,EACpB;AAEA,QAAM,kBAAkB,GAAG,mBAAmB;AAC9C,QAAM,kBAAkB,CAAC,CAAC,GAAG;AAC7B,QAAM,kBAAkB,CAAC,CAAC,GAAG;AAC7B,QAAM,YAAY,CAAC,CAAC,GAAG,mBAAmB,CAAC,CAAC,GAAG,gBAAgB,CAAC,GAAG;AAGnE,QAAM,gBAAgB;AACtB,QAAM,oBAAoB,CAAC,QAA8C;AACvE,QAAI,CAAC,cAAe,QAAO;AAC3B,QAAI,CAAC,IAAI,eAAe,OAAQ,QAAO;AACvC,WAAO,IAAI,cAAc,KAAK,CAAC,MAAM,EAAE,OAAO,cAAc,EAAE;AAAA,EAChE;AACA,QAAM,wBAAwB,GAAG,cAAc,OAAO,iBAAiB;AAGvE,MAAI,mBAAmB,GAAG,mBAAmB;AAC3C,WACE,8CAAC,SAAI,WAAU,MAAK,KAAK,WACvB;AAAA,mDAAC,SAAI,WAAU,aACb,uDAAC,SAAI,WAAU,yBAAwB,OAAO,EAAE,OAAO,KAAK,QAAQ,GAAG,GAAG,GAC5E;AAAA,MAEA,8CAAC,SAAI,WAAU,2BACb;AAAA,sDAAC,SAAI,WAAU,uBACb;AAAA,uDAAC,SAAI,WAAU,yBAAwB,OAAO,EAAE,OAAO,KAAK,QAAQ,IAAI,cAAc,GAAG,GAAG;AAAA,UAC5F,6CAAC,SAAI,WAAU,yBAAwB,OAAO,EAAE,QAAQ,GAAG,GAAG;AAAA,UAC9D,6CAAC,SAAI,WAAU,yBAAwB,OAAO,EAAE,OAAO,KAAK,QAAQ,IAAI,WAAW,IAAI,cAAc,GAAG,GAAG;AAAA,UAC3G,6CAAC,SAAI,WAAU,gBACZ,WAAC,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,MACrB,6CAAC,SAAY,WAAU,yBAAwB,OAAO,EAAE,QAAQ,GAAG,KAAzD,CAA4D,CACvE,GACH;AAAA,WACF;AAAA,QACA,6CAAC,SAAI,WAAU,yBACb,uDAAC,SAAI,WAAU,6BAA4B,OAAO,EAAE,QAAQ,OAAO,GAAG,GACxE;AAAA,QACA,6CAAC,SAAI,WAAU,wBACb,wDAAC,SAAI,WAAU,gBACZ;AAAA,WAAC,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,MACrB,6CAAC,SAAY,WAAU,4BAAb,CAAsC,CACjD;AAAA,UACD,6CAAC,SAAI,WAAU,0BAAyB,OAAO,EAAE,QAAQ,GAAG,GAAG;AAAA,UAC/D,6CAAC,SAAI,WAAU,yBAAwB,OAAO,EAAE,QAAQ,IAAI,WAAW,GAAG,GAAG;AAAA,WAC/E,GACF;AAAA,SACF;AAAA,MAEA,8CAAC,SAAI,WAAU,kBACb;AAAA,qDAAC,SAAI,WAAU,yBAAwB,OAAO,EAAE,OAAO,KAAK,QAAQ,IAAI,cAAc,GAAG,GAAG;AAAA,QAC5F,6CAAC,SAAI,WAAU,yBAAwB,OAAO,EAAE,QAAQ,GAAG,GAAG;AAAA,QAC9D,6CAAC,SAAI,WAAU,yBAAwB,OAAO,EAAE,OAAO,KAAK,QAAQ,IAAI,WAAW,IAAI,cAAc,GAAG,GAAG;AAAA,QAC1G,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,MACrB,6CAAC,SAAY,WAAU,yBAAwB,OAAO,EAAE,QAAQ,GAAG,KAAzD,CAA4D,CACvE;AAAA,QACD,6CAAC,SAAI,WAAU,yBAAwB,OAAO,EAAE,QAAQ,IAAI,WAAW,OAAO,GAAG;AAAA,SACnF;AAAA,OACF;AAAA,EAEJ;AAEA,MAAI,eAAe;AACjB,UAAM,UAAU,yBAAyB,QAAQ,cAAc,UAAU;AACzE,WACE,6CAAC,SAAI,WAAU,MAAK,KAAK,WACvB,wDAAC,SAAI,WAAU,YAAW;AAAA;AAAA,MAAmC;AAAA,OAAQ,GACvE;AAAA,EAEJ;AAEA,MAAI,CAAC,MAAM,UAAU,QAAQ;AAC3B,WACE,6CAAC,SAAI,WAAU,MAAK,KAAK,WACvB,uDAAC,SAAI,WAAU,YAAW,6CAA+B,GAC3D;AAAA,EAEJ;AAEA,MAAI,GAAG,SAAS,QAAQ;AACtB,WACE,6CAAC,SAAI,WAAU,MAAK,KAAK,WACvB,wDAAC,SAAI,WAAU,WACb;AAAA,mDAAC,SAAI,WAAU,gBACb,uDAAC,6BAAM,MAAM,IAAI,aAAa,KAAK,GACrC;AAAA,MACA,6CAAC,QAAG,WAAU,iBAAgB,6BAAoB;AAAA,MAClD,6CAAC,OAAE,WAAU,gBAAe,gHAG5B;AAAA,MACA,6CAAC,YAAO,WAAU,kBAAiB,SAAS,GAAG,OAAO,gCAEtD;AAAA,OACF,GACF;AAAA,EAEJ;AAGA,QAAM,mBAAmB,CACvB,KACA,UAA6B,aAC1B;AACH,UAAM,MAAM,GAAG,iBAAiB,OAAO,IAAI;AAC3C,UAAM,SAAU,IAAY,OAAO;AACnC,UAAM,OAAQ,IAAY;AAG1B,QAAI,YAAY,QAAQ;AACtB,YAAM,WAAW,IAAI,YAAY,OAAO,GAAG,eAAe,IAAI,QAAQ,IAAI;AAC1E,YAAM,SAAS,CAAC,CAAC;AACjB,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,WAAW,+BAA+B,SAAS,wBAAwB,EAAE,IAAI,MAAM,cAAc,EAAE;AAAA,UACvG,SAAS,MAAM,GAAG,cAAc,GAAG;AAAA,UAEnC;AAAA,yDAAC,UAAK,WAAW,yBAAyB,MAAM,eAAe,EAAE,IAC9D,iBAAO,6CAAC,6BAAM,MAAM,IAAI,GAC3B;AAAA,YACA,8CAAC,UAAK,WAAU,eACd;AAAA,2DAAC,UAAK,WAAU,eAAe,cAAI,MAAK;AAAA,cACvC,YAAY,6CAAC,UAAK,WAAU,eAAe,oBAAS;AAAA,cACpD,QAAQ,6CAAC,UAAK,WAAU,eAAe,gBAAK;AAAA,eAC/C;AAAA,YACC,SACC,8CAAC,UAAK,WAAU,cACd;AAAA,2DAAC,SAAI,KAAK,QAAQ,KAAK,IAAI,MAAM;AAAA,cAChC,IAAI,SAAS,QACZ,6CAAC,UAAK,WAAU,gBAAgB,sBAAY,OAAO,IAAI,KAAK,CAAC,GAAE;AAAA,eAEnE,IAEA,IAAI,SAAS,QACX,6CAAC,UAAK,WAAU,gBAAgB,sBAAY,OAAO,IAAI,KAAK,CAAC,GAAE;AAAA;AAAA;AAAA,QArB9D,IAAI;AAAA,MAwBX;AAAA,IAEJ;AAGA,UAAM,OAAO;AAAA,MACX,IAAI,YAAY,OAAO,GAAG,eAAe,IAAI,QAAQ,IAAI;AAAA,MACzD,IAAI,SAAS,OAAO,YAAY,OAAO,IAAI,KAAK,CAAC,IAAI;AAAA,IACvD,EAAE,OAAO,OAAO,EAAE,KAAK,QAAU;AACjC,WACE;AAAA,MAAC;AAAA;AAAA,QAEC,WAAW,cAAc,MAAM,cAAc,EAAE;AAAA,QAC/C,SAAS,MAAM,GAAG,cAAc,GAAG;AAAA,QAEnC;AAAA,uDAAC,UAAK,WAAW,YAAY,MAAM,eAAe,EAAE,IACjD,iBAAO,6CAAC,6BAAM,MAAM,IAAI,GAC3B;AAAA,UACA,8CAAC,UAAK,WAAU,eACd;AAAA,yDAAC,UAAK,WAAU,eAAe,cAAI,MAAK;AAAA,YACvC,QAAQ,6CAAC,UAAK,WAAU,eAAe,gBAAK;AAAA,YAC5C,QAAQ,6CAAC,UAAK,WAAU,eAAe,gBAAK;AAAA,aAC/C;AAAA,UACC,UACC,6CAAC,UAAK,WAAU,gBACd,uDAAC,SAAI,KAAK,QAAQ,KAAK,IAAI,MAAM,GACnC;AAAA;AAAA;AAAA,MAfG,IAAI;AAAA,IAiBX;AAAA,EAEJ;AAKA,QAAM,eAAe,CAAC,gBAAgB,SAAS,SAAS;AAExD,SACE,8CAAC,SAAI,WAAU,MAAK,KAAK,WAEtB;AAAA,oBACC,6CAAC,SAAI,WAAU,oBAAoB,wBAAa;AAAA,IAIlD,8CAAC,SAAI,WAAU,aACb;AAAA,mDAAC,SAAI,WAAU,WACZ,gBAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,MAC7B,6CAAC,SAAY,WAAW,UAAU,aAAa,IAAI,cAAc,EAAE,MAAzD,CAA6D,CACxE,GACH;AAAA,MACC,gBACC;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,SAAS,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;AAAA,UACnC,cAAY,UAAU,eAAe;AAAA,UAEpC,oBAAW,aAAa,6CAAC,oBAAiB,IAAO,YAAY,6CAAC,mBAAgB;AAAA;AAAA,MACjF;AAAA,OAEJ;AAAA,IAGC,gBACC,6CAAC,wCACE,qBACC;AAAA,MAAC,4BAAO;AAAA,MAAP;AAAA,QACC,WAAU;AAAA,QACV,SAAS,EAAE,SAAS,EAAE;AAAA,QACtB,SAAS,EAAE,SAAS,EAAE;AAAA,QACtB,MAAM,EAAE,SAAS,EAAE;AAAA,QACnB,YAAY,EAAE,UAAU,IAAI;AAAA,QAE5B,uDAAC,SAAI,WAAU,UACZ,mBAAS,IAAI,CAAC,SACb;AAAA,UAAC;AAAA;AAAA,YAEC,MAAM,KAAK;AAAA,YACX,WAAU;AAAA,YACV,SAAS,MAAM,WAAW,KAAK;AAAA,YAE9B,eAAK;AAAA;AAAA,UALD,KAAK;AAAA,QAMZ,CACD,GACH;AAAA;AAAA,IACF,GAEJ;AAAA,IAIF,8CAAC,SAAI,WAAU,aACb;AAAA,mDAAC,QAAG,WAAU,8BAA6B,iCAAmB;AAAA,MAC9D,6CAAC,QAAG,WAAU,6BAA8B,yBAAc,qBAAqB,aAAa,CAAC,GAAE;AAAA,OACjG;AAAA,IAIA,6CAAC,SAAI,WAAU,WAAU,oBAAkB,YAAY,KAAK,eAC1D,wDAAC,SAAI,WAAU,iBAGf;AAAA,oDAAC,SAAI,WAAU,uBAGb;AAAA,sDAAC,SAAI,WAAU,aAEb;AAAA,uDAAC,WAAM,WAAU,YAAW,+BAAiB;AAAA,UAC7C,8CAAC,SAAI,WAAU,qBACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK;AAAA,gBACL,WAAW,mBAAmB,gBAAgB,eAAe,EAAE;AAAA,gBAC/D,SAAS,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;AAAA,gBAErC;AAAA,+DAAC,wCAAgB,MAAK,QAAO,SAAS,OACpC;AAAA,oBAAC,4BAAO;AAAA,oBAAP;AAAA,sBAEC,WAAU;AAAA,sBACV,SAAS,EAAE,SAAS,EAAE;AAAA,sBACtB,SAAS,EAAE,SAAS,EAAE;AAAA,sBACtB,MAAM,EAAE,SAAS,EAAE;AAAA,sBACnB,YAAY,EAAE,UAAU,KAAK;AAAA,sBAE5B,0BACC,8EACE;AAAA,qEAAC,UAAK,WAAU,mBACb,wBAAc,OAAO,MACpB,6CAAC,SAAI,KAAK,cAAc,MAAM,KAAK,KAAK,cAAc,MAAM,IAE5D,6CAAC,UAAK,WAAU,qBAAqB,sBAAY,cAAc,IAAI,GAAE,GAEzE;AAAA,wBACA,8CAAC,UAAK,WAAU,yBACd;AAAA,uEAAC,UAAK,WAAU,yBAAyB,wBAAc,MAAK;AAAA,0BAC3D,cAAc,OACb,6CAAC,UAAK,WAAU,yBAAyB,mBAAS,cAAc,KAAK,EAAE,GAAE;AAAA,2BAE7E;AAAA,yBACF,IAEA,8EACE;AAAA,qEAAC,UAAK,WAAU,gDACd,uDAAC,4BAAK,MAAM,IAAI,GAClB;AAAA,wBACA,6CAAC,UAAK,WAAU,yBACd,uDAAC,UAAK,WAAU,yBAAwB,sCAAwB,GAClE;AAAA,yBACF;AAAA;AAAA,oBA/BG,eAAe,MAAM;AAAA,kBAiC5B,GACF;AAAA,kBACA,6CAAC,mCAAY,MAAM,IAAI,WAAU,4BAA2B;AAAA;AAAA;AAAA,YAC9D;AAAA,YAEC,UAAU,eAAW;AAAA,cACpB,6CAAC,wCACA,wBAAc,MAAM;AACnB,sBAAM,OAAO,gBAAgB,SAAS,sBAAsB;AAC5D,uBACA,8EACE;AAAA;AAAA,oBAAC,4BAAO;AAAA,oBAAP;AAAA,sBACC,WAAU;AAAA,sBACV,SAAS,MAAM,aAAa,KAAK;AAAA,sBACjC,SAAS,EAAE,SAAS,EAAE;AAAA,sBACtB,SAAS,EAAE,SAAS,EAAE;AAAA,sBACtB,MAAM,EAAE,SAAS,EAAE;AAAA,sBACnB,YAAY,EAAE,UAAU,KAAK;AAAA;AAAA,kBAC/B;AAAA,kBACA;AAAA,oBAAC,4BAAO;AAAA,oBAAP;AAAA,sBACC,WAAU;AAAA,sBACV,SAAS,EAAE,SAAS,GAAG,GAAG,GAAG;AAAA,sBAC7B,SAAS,EAAE,SAAS,GAAG,GAAG,EAAE;AAAA,sBAC5B,MAAM,EAAE,SAAS,GAAG,GAAG,GAAG;AAAA,sBAC1B,YAAY,EAAE,UAAU,KAAK,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,EAAE;AAAA,sBACpD,OAAO,OAAO;AAAA,wBACZ,KAAK,KAAK,SAAS;AAAA,wBACnB,MAAM,KAAK;AAAA,wBACX,OAAO,KAAK;AAAA,sBACd,IAAI;AAAA,sBAGJ;AAAA;AAAA,0BAAC;AAAA;AAAA,4BACC,WAAW,kBAAkB,CAAC,gBAAgB,eAAe,EAAE;AAAA,4BAC/D,SAAS,MAAM;AAAE,4CAAc,IAAI;AAAG,iCAAG,YAAY,IAAI;AAAG,iCAAG,cAAc,IAAW;AAAG,2CAAa,KAAK;AAAA,4BAAG;AAAA,4BAEhH;AAAA,2EAAC,UAAK,WAAU,gDACd,uDAAC,4BAAK,MAAM,IAAI,GAClB;AAAA,8BACA,8CAAC,UAAK,WAAU,wBACd;AAAA,6EAAC,UAAK,WAAU,wBAAuB,2BAAa;AAAA,gCACpD,6CAAC,UAAK,WAAU,wBAAuB,wCAA0B;AAAA,iCACnE;AAAA;AAAA;AAAA,wBACF;AAAA,wBAEC,SAAS,IAAI,CAAC,WAAW;AACxB,gCAAM,SAAS,eAAe,OAAO,OAAO;AAC5C,gCAAM,WAAW,OAAO,OAAO;AAC/B,iCACE;AAAA,4BAAC;AAAA;AAAA,8BAEC,WAAW,kBAAkB,SAAS,eAAe,EAAE;AAAA,8BACvD,SAAS,MAAM;AAAE,8CAAc,MAAM;AAAG,mCAAG,YAAY,MAAM;AAAG,mCAAG,cAAc,IAAW;AAAG,6CAAa,KAAK;AAAA,8BAAG;AAAA,8BAEpH;AAAA,6EAAC,UAAK,WAAU,mBACb,qBACC,6CAAC,SAAI,KAAK,UAAU,KAAK,OAAO,MAAM,IAEtC,6CAAC,UAAK,WAAU,qBAAqB,sBAAY,OAAO,IAAI,GAAE,GAElE;AAAA,gCACA,8CAAC,UAAK,WAAU,wBACd;AAAA,+EAAC,UAAK,WAAU,wBAAwB,iBAAO,MAAK;AAAA,kCACnD,OAAO,OACN,6CAAC,UAAK,WAAU,wBAAwB,mBAAS,OAAO,KAAK,EAAE,GAAE;AAAA,mCAErE;AAAA;AAAA;AAAA,4BAhBK,OAAO;AAAA,0BAiBd;AAAA,wBAEJ,CAAC;AAAA;AAAA;AAAA,kBACH;AAAA,mBACF;AAAA,cAEF,GAAG,GACH;AAAA,cACA,UAAU;AAAA,YACZ;AAAA,aACF;AAAA,UAGC,yBACC,8EACE;AAAA,yDAAC,WAAM,WAAU,YAAW,6BAAe;AAAA,YAC3C,6CAAC,SAAI,WAAU,iBAAgB,KAAK,cACnC,aAAG,WAAW,IAAI,CAAC,KAAK,WAAW;AAClC,oBAAM,SAAS,GAAG,mBAAmB;AACrC,oBAAM,OAAO,gBAAgB,KAAK,aAAa;AAC/C,oBAAM,eAAe,MAAM,YAAY,CAAC,GACrC,OAAO,CAAC,MAAW,EAAE,aAAa,GAAG,EACrC,OAAO,iBAAiB;AAC3B,qBACE,8CAAC,SACC;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAW,cAAc,SAAS,eAAe,EAAE;AAAA,oBACnD,SAAS,MAAM,GAAG,kBAAkB,SAAS,QAAQ,GAAG;AAAA,oBAExD;AAAA,mEAAC,QAAK,MAAM,IAAI,WAAU,eAAc;AAAA,sBACxC,6CAAC,UAAK,WAAU,eAAe,eAAI;AAAA,sBACnC;AAAA,wBAAC,4BAAO;AAAA,wBAAP;AAAA,0BACC,WAAU;AAAA,0BACV,SAAS,EAAE,QAAQ,SAAS,KAAK,EAAE;AAAA,0BACnC,YAAY,EAAE,UAAU,KAAK,MAAM,UAAU;AAAA,0BAE7C,uDAAC,oCAAa,MAAM,IAAI;AAAA;AAAA,sBAC1B;AAAA,sBACC,UACC,6CAAC,UAAK,WAAU,gBACd,uDAAC,6BAAM,MAAM,IAAI,GACnB;AAAA;AAAA;AAAA,gBAEJ;AAAA,gBAGA;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAW,iBAAiB,SAAS,YAAY,EAAE;AAAA,oBACnD,KAAK,CAAC,OAAO;AACX,0BAAI,CAAC,GAAI;AACT,0BAAI,QAAQ;AACV,8BAAM,OAAO,GAAG,cAAc,qBAAqB;AACnD,4BAAI,KAAM,uBAAsB,MAAM,iBAAiB,IAAI,CAAC;AAAA,sBAC9D,OAAO;AACL,4BAAI,gBAAgB,SAAS;AAC3B,0CAAgB,QAAQ,SAAS,GAAG,GAAG,CAAC;AACxC,8BAAI;AAAE,4CAAgB,QAAQ,QAAQ;AAAA,0BAAG,QAAQ;AAAA,0BAAC;AAClD,0CAAgB,UAAU;AAAA,wBAC5B;AAAA,sBACF;AAAA,oBACF;AAAA,oBAEA,uDAAC,SAAI,WAAU,sBACb,uDAAC,SAAI,WAAU,uBACZ,sBAAY,SACX,YAAY,IAAI,CAAC,QAAa,iBAAiB,GAAG,CAAC,IAEnD,6CAAC,OAAE,WAAU,kBAAiB,mCAAqB,GAEvD,GACF;AAAA;AAAA,gBACF;AAAA,mBA/CQ,GAgDV;AAAA,YAEJ,CAAC,GACD;AAAA,aACF;AAAA,UAID,CAAC,yBACA,6CAAC,SAAI,WAAU,yBACb,uDAAC,SAAI,WAAU,sBAAqB,KAAK,CAAC,OAAO;AAAE,gBAAI,GAAI,uBAAsB,MAAM,iBAAiB,EAAE,CAAC;AAAA,UAAG,GAC5G,uDAAC,SAAI,WAAU,uBACZ,gCAAsB,SACrB,8EACG;AAAA,kCAAsB,IAAI,CAAC,QAAQ,iBAAiB,GAAG,CAAC;AAAA,YACxD,GAAG,mBACF,6CAAC,YAAO,WAAU,gBAAe,SAAS,GAAG,kBAAkB,gCAE/D;AAAA,aAEJ,IAEA,6CAAC,OAAE,WAAU,kBAAiB,mCAAqB,GAEvD,GACF,GACF;AAAA,WAEJ;AAAA,QAGA,8CAAC,SAAI,WAAU,aACZ;AAAA,aAAG,mBAAmB,SACrB,6CAAC,OAAE,WAAU,qBAAqB,aAAG,gBAAe;AAAA,UAErD,sBAAsB,SACrB,8EACG;AAAA,kCAAsB,IAAI,CAAC,QAC1B,iBAAiB,KAAK,MAAM,CAC7B;AAAA,YACA,GAAG,mBACF,6CAAC,YAAO,WAAU,gBAAe,SAAS,GAAG,kBAAkB,gCAE/D;AAAA,aAEJ,IAEA,6CAAC,OAAE,WAAU,kBAAiB,mCAAqB;AAAA,WAEvD;AAAA,SACF;AAAA,MAGA,6CAAC,SAAI,WAAU,yBACb,wDAAC,SAAI,WAAU,eACb;AAAA,sDAAC,SAAI,WAAU,iBACb;AAAA,wDAAC,SAAI,WAAU,qBACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,SAAS,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;AAAA,gBAErC;AAAA,+DAAC,UACE,aAAG,aAAa;AAAA,oBACf,CAAC,MACC,EAAE,UACF,GAAG,GAAG,cAAc,YAAY,CAAC,IAAI,OAAO,GAAG,cAAc,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;AAAA,kBACjG,GAAG,SAAS,gBACd;AAAA,kBACA,6CAAC,mCAAY,MAAM,IAAI;AAAA;AAAA;AAAA,YACzB;AAAA,YACA,6CAAC,wCACE,uBACC,8EACE;AAAA;AAAA,gBAAC,4BAAO;AAAA,gBAAP;AAAA,kBACC,WAAU;AAAA,kBACV,SAAS,MAAM,aAAa,KAAK;AAAA,kBACjC,SAAS,EAAE,SAAS,EAAE;AAAA,kBACtB,SAAS,EAAE,SAAS,EAAE;AAAA,kBACtB,MAAM,EAAE,SAAS,EAAE;AAAA,kBACnB,YAAY,EAAE,UAAU,KAAK;AAAA;AAAA,cAC/B;AAAA,cACA;AAAA,gBAAC,4BAAO;AAAA,gBAAP;AAAA,kBACC,WAAU;AAAA,kBACV,SAAS,EAAE,SAAS,GAAG,GAAG,GAAG;AAAA,kBAC7B,SAAS,EAAE,SAAS,GAAG,GAAG,EAAE;AAAA,kBAC5B,MAAM,EAAE,SAAS,GAAG,GAAG,GAAG;AAAA,kBAC1B,YAAY,EAAE,UAAU,KAAK,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,EAAE;AAAA,kBAEnD,aAAG,aAAa,IAAI,CAAC,QAAQ;AAC5B,0BAAM,MAAM,GAAG,GAAG,cAAc,YAAY,CAAC,IAAI,OAAO,GAAG,cAAc,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;AACzG,2BACE;AAAA,sBAAC;AAAA;AAAA,wBAEC,WAAW,kBAAkB,IAAI,UAAU,MAAM,eAAe,EAAE;AAAA,wBAClE,SAAS,MAAM;AACb,6BAAG,kBAAkB,IAAI,KAAK;AAC9B,uCAAa,KAAK;AAAA,wBACpB;AAAA,wBAEC,cAAI;AAAA;AAAA,sBAPA,IAAI;AAAA,oBAQX;AAAA,kBAEJ,CAAC;AAAA;AAAA,cACH;AAAA,eACF,GAEJ;AAAA,aACF;AAAA,UACA,8CAAC,SAAI,WAAU,eACb;AAAA,yDAAC,YAAO,WAAU,cAAa,SAAS,GAAG,iBAAiB,cAAW,kBACrE,uDAAC,mCAAY,MAAM,IAAI,GACzB;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,SAAS,GAAG;AAAA,gBACZ,UAAU,GAAG,uBAAuB,GAAG,iBAAiB,GAAG,uBAAuB;AAAA,gBAClF,cAAW;AAAA,gBAEX,uDAAC,oCAAa,MAAM,IAAI;AAAA;AAAA,YAC1B;AAAA,aACF;AAAA,WACF;AAAA,QAEA,6CAAC,wCAAgB,MAAK,QAAO,SAAS,OACpC;AAAA,UAAC,4BAAO;AAAA,UAAP;AAAA,YAEC,SAAS,EAAE,SAAS,EAAE;AAAA,YACtB,SAAS,EAAE,SAAS,EAAE;AAAA,YACtB,MAAM,EAAE,SAAS,EAAE;AAAA,YACnB,YAAY,EAAE,UAAU,KAAK;AAAA,YAE7B;AAAA,2DAAC,SAAI,WAAU,mBACZ,WAAC,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI,EAAE,IAAI,CAAC,MAC/C,6CAAC,UAAc,eAAJ,CAAM,CAClB,GACH;AAAA,cAEA,6CAAC,SAAI,WAAU,eACZ,aAAG,aAAa,IAAI,CAAC,KAAK,MAAM;AAC/B,sBAAM,UAAU,IAAI;AACpB,sBAAM,UAAU,oBAAI,KAAK,UAAU,WAAW;AAC9C,sBAAM,QAAQ,GAAG,oBAAoB,IAAI,OAAO;AAChD,sBAAM,cAAc,SAAS,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS;AACjE,sBAAM,aAAa,GAAG,iBAAiB;AACvC,sBAAM,UAAU,YAAY;AAC5B,sBAAM,SAAS,UAAU;AACzB,sBAAM,cAAc,GAAG,iBACnB,UAAU,GAAG,eAAe,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,IACtD;AACJ,sBAAM,aAAa,CAAC,IAAI,kBAAkB,UAAU;AAEpD,uBACE;AAAA,kBAAC;AAAA;AAAA,oBAEC,WAAW;AAAA,sBACT;AAAA,sBACA,CAAC,IAAI,kBAAkB;AAAA,sBACvB,cAAc;AAAA,sBACd,eAAe,CAAC,cAAc;AAAA,sBAC9B,WAAW;AAAA,sBACX,cAAc;AAAA,sBACd,CAAC,eAAe,IAAI,kBAAkB,CAAC,UAAU,CAAC,eAAe;AAAA,oBACnE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,oBAC1B,UAAU,cAAc,CAAC,eAAe;AAAA,oBACxC,SAAS,MAAM;AACb,yBAAG,WAAW,OAAO;AACrB,yBAAG,WAAW,IAAI,EAAE;AAAA,oBACtB;AAAA,oBAEC,kBAAQ,QAAQ;AAAA;AAAA,kBAhBZ;AAAA,gBAiBP;AAAA,cAEJ,CAAC,GACH;AAAA;AAAA;AAAA,UAhDK,GAAG,GAAG,cAAc,YAAY,CAAC,IAAI,GAAG,cAAc,SAAS,CAAC;AAAA,QAiDvE,GACF;AAAA,QAEC,CAAC,GAAG,mBACH,6CAAC,OAAE,WAAU,iBAAgB,0DAA4C;AAAA,QAG1E,GAAG,mBAAmB,GAAG,yBACxB,6CAAC,SAAI,WAAU,iBACb,uDAAC,SAAI,WAAU,sBACZ,WAAC,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,MACrB,6CAAC,SAAY,WAAU,2BAAb,CAAqC,CAChD,GACH,GACF;AAAA,QAGD,GAAG,mBAAmB,GAAG,gBAAgB,CAAC,GAAG,0BAA0B,MAAM;AAC5E,gBAAM,YAAY,GAAG,oBAAoB,IAAI,GAAG,YAAY;AAC5D,gBAAM,QAAQ,WAAW,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK,CAAC;AAC/D,cAAI,CAAC,MAAM,QAAQ;AACjB,mBAAO,6CAAC,OAAE,WAAU,eAAc,+CAAiC;AAAA,UACrE;AACA,iBACE,8EACE;AAAA,yDAAC,SAAI,WAAU,mBAAkB;AAAA,YACjC,6CAAC,SAAI,WAAU,iBACZ,gBAAM,IAAI,CAAC,MAAM,QAChB;AAAA,cAAC;AAAA;AAAA,gBAEC,WAAW,WAAW,GAAG,iBAAiB,KAAK,OAAO,cAAc,EAAE;AAAA,gBACtE,SAAS,MAAM,GAAG,WAAW,KAAK,MAAM,KAAK,OAAO;AAAA,gBAEnD,aAAG,gBAAgB,KAAK,IAAI;AAAA;AAAA,cAJxB;AAAA,YAKP,CACD,GACH;AAAA,aACF;AAAA,QAEJ,GAAG;AAAA,QAEF,GAAG,iBACF,8CAAC,SAAI,WAAU,eACb;AAAA,uDAAC,6BAAM,MAAM,IAAI;AAAA,UACjB,6CAAC,UAAM,aAAG,eAAc;AAAA,WAC1B;AAAA,SAEJ,GACF;AAAA,MAGA,6CAAC,SAAI,WAAU,wBACb,uDAAC,SAAI,WAAU,mBAAkB,KAAK,gBACpC,uDAAC,SAAI,WAAU,kBACb,wDAAC,UAAK,WAAU,WAAU,KAAK,SAAS,UAAU,kBAChD;AAAA,sDAAC,SAAI,WAAU,kBACb;AAAA,wDAAC,SAAI,WAAU,YACb;AAAA,0DAAC,WAAM,SAAQ,WAAU;AAAA;AAAA,cAAU,6CAAC,UAAK,WAAU,eAAc,eAAC;AAAA,eAAO;AAAA,YACzE;AAAA,cAAC;AAAA;AAAA,gBACC,IAAG;AAAA,gBACH,MAAK;AAAA,gBACL,UAAQ;AAAA,gBACR,aAAY;AAAA,gBACZ,OAAO,GAAG,QAAQ;AAAA,gBAClB,UAAU,CAAC,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE,GAAG,GAAG,MAAM,EAAE,OAAO,MAAM,EAAE;AAAA;AAAA,YACxE;AAAA,aACF;AAAA,UACA,8CAAC,SAAI,WAAU,YACb;AAAA,0DAAC,WAAM,SAAQ,YAAW;AAAA;AAAA,cAAM,6CAAC,UAAK,WAAU,eAAc,eAAC;AAAA,eAAO;AAAA,YACtE;AAAA,cAAC;AAAA;AAAA,gBACC,IAAG;AAAA,gBACH,MAAK;AAAA,gBACL,UAAQ;AAAA,gBACR,aAAY;AAAA,gBACZ,OAAO,GAAG,QAAQ;AAAA,gBAClB,UAAU,CAAC,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,EAAE,OAAO,MAAM,EAAE;AAAA;AAAA,YACzE;AAAA,aACF;AAAA,UACA,8CAAC,SAAI,WAAU,YACb;AAAA,yDAAC,WAAM,SAAQ,YAAW,mBAAK;AAAA,YAC/B;AAAA,cAAC;AAAA;AAAA,gBACC,IAAG;AAAA,gBACH,MAAK;AAAA,gBACL,aAAY;AAAA,gBACZ,OAAO,GAAG,QAAQ;AAAA,gBAClB,UAAU,CAAC,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,EAAE,OAAO,MAAM,EAAE;AAAA;AAAA,YACzE;AAAA,aACF;AAAA,WACF;AAAA,QAEA,8CAAC,SAAI,WAAU,4BACb;AAAA,uDAAC,WAAM,SAAQ,YAAW,8BAAgB;AAAA,UAC1C;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,aAAY;AAAA,cACZ,MAAM;AAAA,cACN,WAAW;AAAA,cACX,OAAO,EAAE,QAAQ,OAAO;AAAA,cACxB,OAAO,GAAG,QAAQ;AAAA,cAClB,UAAU,CAAC,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,EAAE,OAAO,MAAM,EAAE;AAAA;AAAA,UACzE;AAAA,UACA,8CAAC,UAAK,WAAU,iBAAiB;AAAA,eAAG,QAAQ,OAAO,UAAU;AAAA,YAAE;AAAA,aAAI;AAAA,WACrE;AAAA,QAEC,GAAG,mBACF,8CAAC,SAAI,WAAU,cACb;AAAA,uDAAC,UAAK,WAAU,oBAAmB,6BAAe;AAAA,UAClD,8CAAC,SAAI,WAAU,mBACb;AAAA,0DAAC,SAAI,WAAU,kBACb;AAAA,2DAAC,UAAK,qBAAO;AAAA,cACb,6CAAC,UAAK,WAAU,kBAAkB,aAAG,gBAAgB,MAAK;AAAA,eAC5D;AAAA,YACA,8CAAC,SAAI,WAAU,kBACb;AAAA,2DAAC,UAAK,wBAAU;AAAA,cAChB,6CAAC,UAAK,WAAU,kBAAkB,yBAAe,QAAQ,iBAAgB;AAAA,eAC3E;AAAA,YACC,GAAG,gBACF,8CAAC,SAAI,WAAU,kBACb;AAAA,2DAAC,UAAK,kBAAI;AAAA,cACV,6CAAC,UAAK,WAAU,kBAAkB,aAAG,gBAAgB,GAAG,YAAY,GAAE;AAAA,eACxE;AAAA,YAED,GAAG,gBACF,8CAAC,SAAI,WAAU,kBACb;AAAA,2DAAC,UAAK,kBAAI;AAAA,cACV,6CAAC,UAAK,WAAU,kBAAkB,aAAG,gBAAgB,GAAG,YAAY,GAAE;AAAA,eACxE;AAAA,YAED,GAAG,gBAAgB,YAAY,QAC9B,8CAAC,SAAI,WAAU,kBACb;AAAA,2DAAC,UAAK,sBAAQ;AAAA,cACd,6CAAC,UAAK,WAAU,kBAAkB,aAAG,eAAe,GAAG,gBAAgB,QAAQ,GAAE;AAAA,eACnF;AAAA,YAED,GAAG,gBAAgB,SAAS,QAC3B,8CAAC,SAAI,WAAU,mCACb;AAAA,2DAAC,UAAK,6BAAe;AAAA,cACrB,6CAAC,UAAK,WAAU,kBACb,sBAAY,OAAO,GAAG,gBAAgB,KAAK,CAAC,GAC/C;AAAA,eACF;AAAA,aAEJ;AAAA,WACF;AAAA,QAGD,GAAG,gBAAgB,6CAAC,SAAI,WAAU,YAAY,aAAG,cAAa;AAAA,QAE9D,CAAC,aAAa,CAAC,GAAG,gBACjB,6CAAC,OAAE,WAAU,mBACV,WAAC,GAAG,kBACD,gDACA,CAAC,GAAG,eACF,6CACA,IACR;AAAA,QAGF,8CAAC,YAAO,MAAK,UAAS,WAAU,kBAAiB,UAAU,CAAC,WAC1D;AAAA,uDAAC,UAAM,aAAG,eAAe,eAAe,mBAAkB;AAAA,UACzD,CAAC,GAAG,gBAAgB,6CAAC,kCAAW,MAAM,IAAI;AAAA,WAC7C;AAAA,SACF,GACF,GACF,GACF;AAAA,OACA,GACF;AAAA,IAGA,8CAAC,SAAI,WAAU,aAEZ;AAAA,qBAAe,KAAK,GAAG,mBACtB,8CAAC,SAAI,WAAU,qBACb;AAAA,qDAAC,UAAK,WAAU,oBAAmB,6BAAe;AAAA,QAClD,8CAAC,SAAI,WAAU,mBACb;AAAA,wDAAC,SAAI,WAAU,kBACb;AAAA,yDAAC,UAAK,qBAAO;AAAA,YACb,6CAAC,UAAK,WAAU,kBAAkB,aAAG,gBAAgB,MAAK;AAAA,aAC5D;AAAA,UACA,8CAAC,SAAI,WAAU,kBACb;AAAA,yDAAC,UAAK,wBAAU;AAAA,YAChB,6CAAC,UAAK,WAAU,kBAAkB,yBAAe,QAAQ,iBAAgB;AAAA,aAC3E;AAAA,UACC,GAAG,gBACF,8CAAC,SAAI,WAAU,kBACb;AAAA,yDAAC,UAAK,kBAAI;AAAA,YACV,6CAAC,UAAK,WAAU,kBAAkB,aAAG,gBAAgB,GAAG,YAAY,GAAE;AAAA,aACxE;AAAA,UAED,GAAG,gBACF,8CAAC,SAAI,WAAU,kBACb;AAAA,yDAAC,UAAK,kBAAI;AAAA,YACV,6CAAC,UAAK,WAAU,kBAAkB,aAAG,gBAAgB,GAAG,YAAY,GAAE;AAAA,aACxE;AAAA,UAED,GAAG,gBAAgB,SAAS,QAC3B,8CAAC,SAAI,WAAU,mCACb;AAAA,yDAAC,UAAK,6BAAe;AAAA,YACrB,6CAAC,UAAK,WAAU,kBACb,sBAAY,OAAO,GAAG,gBAAgB,KAAK,CAAC,GAC/C;AAAA,aACF;AAAA,WAEJ;AAAA,SACF;AAAA,MAIF,8CAAC,SAAI,WAAU,kBACZ;AAAA,qBAAa,KACZ;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,SAAS,MAAM,cAAc,CAAC,MAAM,IAAI,CAAC;AAAA,YACzC,cAAW;AAAA,YAEX,uDAAC,iCAAU,MAAM,IAAI;AAAA;AAAA,QACvB;AAAA,QAED,aAAa,IACZ;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,UACG,eAAe,KAAK,CAAC,mBACrB,eAAe,KAAK,CAAC,mBACrB,eAAe,KAAK,CAAC;AAAA,YAExB,SAAS,MAAM,cAAc,CAAC,MAAM,IAAI,CAAC;AAAA,YAEzC;AAAA,2DAAC,UAAK,kBAAI;AAAA,cACV,6CAAC,kCAAW,MAAM,IAAI;AAAA;AAAA;AAAA,QACxB,IAEA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,UAAU,CAAC;AAAA,YACX,SAAS,MAAM,QAAQ,SAAS,cAAc;AAAA,YAE9C;AAAA,2DAAC,UAAM,aAAG,eAAe,eAAe,mBAAkB;AAAA,cACzD,CAAC,GAAG,gBAAgB,6CAAC,kCAAW,MAAM,IAAI;AAAA;AAAA;AAAA,QAC7C;AAAA,SAEJ;AAAA,OACF;AAAA,IACA,6CAAC,SAAI,KAAK,WAAW,WAAU,aAAY;AAAA,KAC7C;AAEJ;;;ACtmCA,IAAAE,iBAAyB;AA+Bd,IAAAC,uBAAA;AAnBJ,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AACF,GAA4B;AAC1B,QAAM,CAAC,cAAc,eAAe,QAAI,yBAAwB,QAAQ,IAAI;AAC5E,QAAM,CAAC,cAAc,eAAe,QAAI,yBAAwB,IAAI;AAEpE,QAAM,EAAE,MAAM,UAAU,IAAI,gBAAgB;AAAA,IAC1C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI,WAAW;AACb,WAAO,8CAAC,SAAI,WAAU,aAAY,qCAAuB;AAAA,EAC3D;AAEA,MAAI,CAAC,MAAM,OAAO,QAAQ;AACxB,WAAO,8CAAC,SAAI,WAAU,aAAY,oCAAsB;AAAA,EAC1D;AAEA,QAAM,aAAa,gBAAgB,KAAK,MAAM,CAAC,GAAG;AAClD,QAAM,cAAc,KAAK,MAAM,KAAK,CAAC,UAAU,MAAM,SAAS,UAAU,GAAG,SAAS,CAAC;AAErF,SACE,+CAAC,SAAI,WAAW,CAAC,oBAAoB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GACtE;AAAA,kDAAC,SAAI,WAAU,2BACZ,eAAK,MAAM,IAAI,CAAC,UACf;AAAA,MAAC;AAAA;AAAA,QAEC,MAAK;AAAA,QACL,WAAW,MAAM,SAAS,aAAa,cAAc;AAAA,QACrD,SAAS,MAAM;AACb,0BAAgB,MAAM,IAAI;AAC1B,0BAAgB,IAAI;AAAA,QACtB;AAAA,QAEC,gBAAM;AAAA;AAAA,MARF,MAAM;AAAA,IASb,CACD,GACH;AAAA,IACA,8CAAC,SAAI,WAAU,2BACZ,sBAAY,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,WAAW,IACvD,8CAAC,SAAI,WAAU,aAAY,iCAAmB,IAE9C,YACG,OAAO,CAAC,SAAS,KAAK,SAAS,EAC/B,IAAI,CAAC,SACJ;AAAA,MAAC;AAAA;AAAA,QAEC,MAAK;AAAA,QACL,WAAW,iBAAiB,KAAK,OAAO,cAAc;AAAA,QACtD,SAAS,MAAM;AACb,0BAAgB,KAAK,IAAI;AACzB,cAAI,YAAY,YAAY;AAC1B,qBAAS;AAAA,cACP,MAAM;AAAA,cACN,MAAM,KAAK;AAAA,cACX,SAAS,KAAK;AAAA,YAChB,CAAC;AAAA,UACH;AAAA,QACF;AAAA,QAEC,eAAK;AAAA;AAAA,MAdD,GAAG,UAAU,IAAI,KAAK,IAAI;AAAA,IAejC,CACD,GAEP;AAAA,KACF;AAEJ;;;AC/DU,IAAAC,uBAAA;AAfH,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuB;AACrB,SACE,8CAAC,SAAI,WAAW,CAAC,cAAc,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAC/D,mBAAS,IAAI,CAAC,YACb;AAAA,IAAC;AAAA;AAAA,MAEC,MAAK;AAAA,MACL,WAAW,eAAe,QAAQ,KAAK,cAAc;AAAA,MACrD,SAAS,MAAM,WAAW,OAAO;AAAA,MAEjC;AAAA,sDAAC,UAAM,kBAAQ,MAAK;AAAA,QACpB,+CAAC,WAAO;AAAA,kBAAQ;AAAA,UAAS;AAAA,WAAI;AAAA;AAAA;AAAA,IANxB,QAAQ;AAAA,EAOf,CACD,GACH;AAEJ;;;ACZQ,IAAAC,uBAAA;AATD,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAqB;AACnB,SACE,8CAAC,SAAI,WAAW,CAAC,cAAc,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAC/D,gBAAM,IAAI,CAAC,WACV;AAAA,IAAC;AAAA;AAAA,MAEC,MAAK;AAAA,MACL,WAAW,eAAe,OAAO,KAAK,cAAc;AAAA,MACpD,SAAS,MAAM,WAAW,MAAM;AAAA,MAEhC;AAAA,sDAAC,UAAM,iBAAO,MAAK;AAAA,QACnB,8CAAC,WAAO,iBAAO,QAAQ,SAAQ;AAAA;AAAA;AAAA,IAN1B,OAAO;AAAA,EAOd,CACD,GACH;AAEJ;;;ACdQ,IAAAC,uBAAA;AATD,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAoB;AAClB,SACE,8CAAC,SAAI,WAAW,CAAC,cAAc,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAC/D,gBAAM,IAAI,CAAC,SACV;AAAA,IAAC;AAAA;AAAA,MAEC,MAAK;AAAA,MACL,WAAW,iBAAiB,OAAO,cAAc;AAAA,MACjD,SAAS,MAAM,WAAW,IAAI;AAAA,MAE7B;AAAA;AAAA,IALI;AAAA,EAMP,CACD,GACH;AAEJ;;;ACTQ,IAAAC,uBAAA;AATD,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAoB;AAClB,SACE,8CAAC,SAAI,WAAW,CAAC,cAAc,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAC/D,gBAAM,IAAI,CAAC,SACV;AAAA,IAAC;AAAA;AAAA,MAEC,MAAK;AAAA,MACL,WAAW,iBAAiB,KAAK,OAAO,cAAc;AAAA,MACtD,UAAU,CAAC,KAAK;AAAA,MAChB,SAAS,MAAM,WAAW,IAAI;AAAA,MAE7B,eAAK;AAAA;AAAA,IAND,GAAG,KAAK,IAAI,IAAI,KAAK,OAAO;AAAA,EAOnC,CACD,GACH;AAEJ;","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"]}