@resira/ui 0.4.9 → 0.4.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts","../src/theme.ts","../src/ResiraProvider.tsx","../src/hooks.ts","../src/icons.tsx","../src/components/BookingCalendar.tsx","../src/components/TimeSlotPicker.tsx","../src/components/ResourcePicker.tsx","../src/components/ProductSelector.tsx","../src/components/GuestForm.tsx","../src/components/WaiverConsent.tsx","../src/components/PaymentForm.tsx","../src/components/ReservationSummary.tsx","../src/ResiraBookingWidget.tsx","../src/components/BookingModal.tsx","../src/components/DishShowcase.tsx"],"names":["useState","useCallback","useEffect","Resira","jsx","useMemo","jsxs","toDateStr","getDaysInMonth","getFirstDayOffset","ChevronLeftIcon","ChevronRightIcon","Fragment","formatPrice","formatDuration","PLACEHOLDER_IMG","useRef","nightsBetween"],"mappings":"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","file":"index.js","sourcesContent":["import type React from \"react\";\r\nimport type { Resira, Availability, Reservation, CreateReservationRequest, Product, PricingModel, PaymentIntentResponse, RefundRule } from \"@resira/sdk\";\r\n\r\n/** Supported booking domain types. */\r\nimport type { WeightedBaseUrl } from \"@resira/sdk\";\r\n\r\nexport type ResiraDomain = \"rental\" | \"restaurant\" | \"watersport\" | \"service\";\r\n\r\n/** Layout direction for the product/service selector. */\r\nexport type ServiceLayout = \"vertical\" | \"horizontal\";\r\n\r\n/** Domain-specific configuration. */\r\nexport interface DomainConfig {\r\n /** Label for the domain (e.g. \"Vacation Rental\", \"Restaurant\"). */\r\n label?: string;\r\n /** Default party size. */\r\n defaultPartySize?: number;\r\n /** Minimum party size. */\r\n minPartySize?: number;\r\n /** Maximum party size. */\r\n maxPartySize?: number;\r\n /** Minimum stay in nights (rental only). */\r\n minStay?: number;\r\n /** Default duration in minutes (service/watersport). */\r\n defaultDuration?: number;\r\n /** Available durations in minutes (service/watersport). */\r\n availableDurations?: number[];\r\n /** Allow selecting multiple resources in one booking. */\r\n allowMultiSelect?: boolean;\r\n}\r\n\r\n/** Theme color palette — maps to CSS custom properties. */\r\nexport interface ResiraTheme {\r\n /** Primary brand color. @default \"#2563eb\" */\r\n primaryColor?: string;\r\n /** Primary color on hover. @default \"#1d4ed8\" */\r\n primaryHover?: string;\r\n /** Text on primary background. @default \"#ffffff\" */\r\n primaryForeground?: string;\r\n /** Accent/secondary color. @default \"#f0f4ff\" */\r\n accentColor?: string;\r\n /** Accent foreground. @default \"#1e40af\" */\r\n accentForeground?: string;\r\n /** Error color. @default \"#dc2626\" */\r\n errorColor?: string;\r\n /** Success color. @default \"#16a34a\" */\r\n successColor?: string;\r\n /** Warning color. @default \"#d97706\" */\r\n warningColor?: string;\r\n /** Default text color. @default \"#0f172a\" */\r\n textColor?: string;\r\n /** Muted/secondary text. @default \"#64748b\" */\r\n mutedColor?: string;\r\n /** Surface / card background. @default \"#ffffff\" */\r\n surfaceColor?: string;\r\n /** Subtle background (e.g. form inputs). @default \"#f8fafc\" */\r\n backgroundSubtle?: string;\r\n /** Border color. @default \"#e2e8f0\" */\r\n borderColor?: string;\r\n /** Card border radius. @default \"12px\" */\r\n borderRadius?: string;\r\n /** Font family. @default \"system-ui, -apple-system, sans-serif\" */\r\n fontFamily?: string;\r\n /** Card component radius. @default \"14px\" */\r\n cardRadius?: string;\r\n /** Button radius. @default \"10px\" */\r\n buttonRadius?: string;\r\n /** Input radius. @default \"10px\" */\r\n inputRadius?: string;\r\n /** Chip/pill radius. @default \"20px\" */\r\n chipRadius?: string;\r\n /** Base spacing unit. @default \"16px\" */\r\n spacing?: string;\r\n /** Small shadow. */\r\n shadowSm?: string;\r\n /** Medium shadow. */\r\n shadowMd?: string;\r\n /** Large shadow. */\r\n shadowLg?: string;\r\n /** Calendar day cell size. @default \"36px\" */\r\n calendarDaySize?: string;\r\n /** Minimum width for time slot cells. @default \"80px\" */\r\n slotMinWidth?: string;\r\n}\r\n\r\n/** Internationalization strings. Override any label. */\r\nexport interface ResiraLocale {\r\n /** @default \"Select dates\" */\r\n selectDates?: string;\r\n /** @default \"Select a time\" */\r\n selectTime?: string;\r\n /** @default \"Guest details\" */\r\n guestDetails?: string;\r\n /** @default \"Confirm booking\" */\r\n confirmBooking?: string;\r\n /** @default \"Booking confirmed\" */\r\n bookingConfirmed?: string;\r\n /** @default \"Full name\" */\r\n fullName?: string;\r\n /** @default \"Email\" */\r\n email?: string;\r\n /** @default \"Phone\" */\r\n phone?: string;\r\n /** @default \"Party size\" */\r\n partySize?: string;\r\n /** @default \"Notes\" */\r\n notes?: string;\r\n /** @default \"Check-in\" */\r\n checkIn?: string;\r\n /** @default \"Check-out\" */\r\n checkOut?: string;\r\n /** @default \"Guests\" */\r\n guests?: string;\r\n /** @default \"per night\" */\r\n perNight?: string;\r\n /** @default \"total\" */\r\n total?: string;\r\n /** @default \"Available\" */\r\n available?: string;\r\n /** @default \"Unavailable\" */\r\n unavailable?: string;\r\n /** @default \"Loading…\" */\r\n loading?: string;\r\n /** @default \"Something went wrong\" */\r\n errorGeneric?: string;\r\n /** @default \"Continue\" */\r\n continue?: string;\r\n /** @default \"Back\" */\r\n back?: string;\r\n /** @default \"Book now\" */\r\n bookNow?: string;\r\n /** @default \"nights\" */\r\n nights?: string;\r\n /** @default \"Duration\" */\r\n duration?: string;\r\n /** @default \"minutes\" */\r\n minutes?: string;\r\n /** @default \"No availability\" */\r\n noAvailability?: string;\r\n /** @default \"Required\" */\r\n required?: string;\r\n /** @default \"Invalid email\" */\r\n invalidEmail?: string;\r\n /** @default \"Choose a service\" */\r\n chooseService?: string;\r\n /** @default \"per session\" */\r\n perSession?: string;\r\n /** @default \"per person\" */\r\n perPerson?: string;\r\n /** @default \"Payment\" */\r\n payment?: string;\r\n /** @default \"Pay now\" */\r\n payNow?: string;\r\n /** @default \"Pay at venue\" */\r\n payAtVenue?: string;\r\n /** @default \"Processing payment…\" */\r\n processingPayment?: string;\r\n /** @default \"Payment failed\" */\r\n paymentFailed?: string;\r\n /** @default \"Terms & conditions\" */\r\n termsTitle?: string;\r\n /** @default \"I accept the terms and conditions\" */\r\n termsAccept?: string;\r\n /** @default \"I accept the waiver and release of liability\" */\r\n waiverAccept?: string;\r\n /** @default \"You must accept the terms to continue\" */\r\n termsRequired?: string;\r\n /** @default \"Discount code\" */\r\n discountCode?: string;\r\n /** @default \"Enter code\" */\r\n discountPlaceholder?: string;\r\n /** @default \"Apply\" */\r\n discountApply?: string;\r\n /** @default \"Code applied!\" */\r\n discountApplied?: string;\r\n /** @default \"Invalid code\" */\r\n discountInvalid?: string;\r\n /** @default \"Discount\" */\r\n discountLabel?: string;\r\n /** @default \"Original\" */\r\n originalPrice?: string;\r\n /** @default \"Cancellation policy\" */\r\n refundPolicyTitle?: string;\r\n /** @default \"Close\" */\r\n close?: string;\r\n /** @default \"Done\" */\r\n done?: string;\r\n /** @default \"Phone or email required\" */\r\n contactRequired?: string;\r\n /** @default \"Please provide at least a phone number or email\" */\r\n contactHint?: string;\r\n /** @default \"Allergies, special requests...\" */\r\n restaurantNotesPlaceholder?: string;\r\n /** @default \"Reserve a table\" */\r\n reserveTable?: string;\r\n /** @default \"Reservation for\" */\r\n reservationFor?: string;\r\n}\r\n\r\n/** Default English locale. */\r\nexport const DEFAULT_LOCALE: Required<ResiraLocale> = {\r\n selectDates: \"Select dates\",\r\n selectTime: \"Select a time\",\r\n guestDetails: \"Guest details\",\r\n confirmBooking: \"Confirm booking\",\r\n bookingConfirmed: \"Booking confirmed\",\r\n fullName: \"Full name\",\r\n email: \"Email\",\r\n phone: \"Phone\",\r\n partySize: \"Party size\",\r\n notes: \"Notes\",\r\n checkIn: \"Check-in\",\r\n checkOut: \"Check-out\",\r\n guests: \"Guests\",\r\n perNight: \"per night\",\r\n total: \"total\",\r\n available: \"Available\",\r\n unavailable: \"Unavailable\",\r\n loading: \"Loading…\",\r\n errorGeneric: \"Something went wrong\",\r\n continue: \"Continue\",\r\n back: \"Back\",\r\n bookNow: \"Book now\",\r\n nights: \"nights\",\r\n duration: \"Duration\",\r\n minutes: \"minutes\",\r\n noAvailability: \"No availability\",\r\n required: \"Required\",\r\n invalidEmail: \"Invalid email\",\r\n chooseService: \"Choose a service\",\r\n perSession: \"per session\",\r\n perPerson: \"per person\",\r\n payment: \"Payment\",\r\n payNow: \"Pay now\",\r\n payAtVenue: \"Pay at venue\",\r\n processingPayment: \"Processing payment…\",\r\n paymentFailed: \"Payment failed\",\r\n termsTitle: \"Terms & conditions\",\r\n termsAccept: \"I accept the terms and conditions\",\r\n waiverAccept: \"I accept the waiver and release of liability\",\r\n termsRequired: \"You must accept the terms to continue\",\r\n discountCode: \"Discount code\",\r\n discountPlaceholder: \"Enter code\",\r\n discountApply: \"Apply\",\r\n discountApplied: \"Code applied!\",\r\n discountInvalid: \"Invalid code\",\r\n discountLabel: \"Discount\",\r\n originalPrice: \"Original\",\r\n refundPolicyTitle: \"Cancellation policy\",\r\n close: \"Close\",\r\n done: \"Done\",\r\n contactRequired: \"Phone or email required\",\r\n contactHint: \"Please provide at least a phone number or email\",\r\n restaurantNotesPlaceholder: \"Allergies, special requests...\",\r\n reserveTable: \"Reserve a table\",\r\n reservationFor: \"Reservation for\",\r\n};\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Provider config\r\n// ─────────────────────────────────────────────────────────────\r\n\r\n/** CSS class name overrides for deep styling customization. */\r\nexport interface ResiraClassNames {\r\n /** Root widget wrapper. */\r\n root?: string;\r\n /** Step indicator bar. */\r\n steps?: string;\r\n /** Widget header area. */\r\n header?: string;\r\n /** Widget body area. */\r\n body?: string;\r\n /** Widget footer area. */\r\n footer?: string;\r\n /** Service/product card. */\r\n serviceCard?: string;\r\n /** Service/product card when selected. */\r\n serviceCardSelected?: string;\r\n /** Service list container. */\r\n serviceList?: string;\r\n /** Calendar container. */\r\n calendar?: string;\r\n /** Calendar day cell. */\r\n calendarDay?: string;\r\n /** Time slot button. */\r\n timeSlot?: string;\r\n /** Time slot button when selected. */\r\n timeSlotSelected?: string;\r\n /** Duration option button. */\r\n durationOption?: string;\r\n /** Party size control. */\r\n partySize?: string;\r\n /** Primary action button. */\r\n primaryButton?: string;\r\n /** Secondary action button. */\r\n secondaryButton?: string;\r\n /** Form field wrapper. */\r\n field?: string;\r\n /** Form input. */\r\n fieldInput?: string;\r\n /** Price preview panel. */\r\n pricePreview?: string;\r\n}\r\n\r\n/** Pre-filled selection data for deeplink integration. */\r\nexport interface DeeplinkSelection {\r\n /** Pre-selected product/service ID. */\r\n productId?: string;\r\n /** Pre-selected date (YYYY-MM-DD). */\r\n date?: string;\r\n /** Pre-selected party size. */\r\n partySize?: number;\r\n /** Pre-selected duration in minutes. */\r\n duration?: number;\r\n}\r\n\r\n/** Pre-filled guest data for deeplink integration. */\r\nexport interface DeeplinkGuest {\r\n /** Guest name. */\r\n name?: string;\r\n /** Guest email. */\r\n email?: string;\r\n /** Guest phone. */\r\n phone?: string;\r\n /** Notes. */\r\n notes?: string;\r\n}\r\n\r\n/** Configuration passed to ResiraProvider. */\r\nexport interface ResiraProviderConfig {\r\n /** Theme overrides. */\r\n theme?: ResiraTheme;\r\n /** Locale / label overrides. */\r\n locale?: ResiraLocale;\r\n /** Domain-specific configuration overrides. */\r\n domainConfig?: DomainConfig;\r\n /** CSS class name overrides for full styling control. */\r\n classNames?: ResiraClassNames;\r\n /** Layout direction for services. @default \"vertical\" */\r\n serviceLayout?: ServiceLayout;\r\n /** Number of services visible before scrolling. @default 4 */\r\n visibleServiceCount?: number;\r\n /** Group services by linked equipment category. @default true */\r\n groupServicesByCategory?: boolean;\r\n /** Custom render function for service cards. Receives product and selected state. */\r\n renderServiceCard?: (product: Product, selected: boolean) => React.ReactNode;\r\n /** API base URL override (defaults to SDK default). */\r\n baseUrl?: string;\r\n /** Weighted API origins for client-side traffic splitting. */\r\n baseUrls?: Array<string | WeightedBaseUrl>;\r\n /** Stripe publishable key for payment processing. */\r\n stripePublishableKey?: string;\r\n /** Custom terms & conditions text or URL. */\r\n termsText?: string;\r\n /** Custom waiver text. */\r\n waiverText?: string;\r\n /** Whether to show the waiver checkbox. */\r\n showWaiver?: boolean;\r\n /** Whether to show the terms checkbox. */\r\n showTerms?: boolean;\r\n /** Whether to show remaining capacity labels in time slots. @default false */\r\n showRemainingSpots?: boolean;\r\n /** Percentage of total to charge upfront (0-100). Default 100. */\r\n depositPercent?: number;\r\n /** Whether to show the step indicator bar. @default true */\r\n showStepIndicator?: boolean;\r\n /** Pre-fill booking data for deeplink integration. */\r\n deeplink?: DeeplinkSelection;\r\n /** Pre-fill guest information. */\r\n deeplinkGuest?: DeeplinkGuest;\r\n /** Called when the booking step changes. */\r\n onStepChange?: (step: BookingStep) => void;\r\n /** Called when a booking is successfully completed. */\r\n onBookingComplete?: (data: { reservationId?: string; product?: Product; selection: BookingSelection; guest: GuestFormValues }) => void;\r\n /** Called when an error occurs during the booking flow. */\r\n onError?: (code: string, message: string) => void;\r\n}\r\n\r\n/** Props for the ResiraProvider component. */\r\nexport interface ResiraProviderProps {\r\n /** API key for authentication. */\r\n apiKey: string;\r\n /** Resource ID to book. Optional — omit to enable catalog mode (multi-resource picker). */\r\n resourceId?: string;\r\n /** Booking domain type. */\r\n domain: ResiraDomain;\r\n /** Configuration overrides. */\r\n config?: ResiraProviderConfig;\r\n /** Checkout session token. When provided, skips service selection and opens directly into checkout. */\r\n checkoutSessionToken?: string;\r\n /** Callback when the modal/widget should close. */\r\n onClose?: () => void;\r\n /** Child components. */\r\n children: React.ReactNode;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Internal context value\r\n// ─────────────────────────────────────────────────────────────\r\n\r\n/** Shape of the Resira context available to all child components. */\r\nexport interface ResiraContextValue {\r\n /** Instantiated SDK client. */\r\n client: Resira;\r\n /** Initial resource ID (may be undefined in catalog mode). */\r\n resourceId?: string;\r\n /** Currently active resource ID (set after user picks from catalog). */\r\n activeResourceId: string | undefined;\r\n /** Set the active resource ID. */\r\n setActiveResourceId: (id: string) => void;\r\n /** Whether catalog/multi-resource mode is enabled. */\r\n catalogMode: boolean;\r\n /** Whether multiple resources can be selected at once. */\r\n allowMultiSelect: boolean;\r\n /** Domain type. */\r\n domain: ResiraDomain;\r\n /** Resolved theme. */\r\n theme: Required<ResiraTheme>;\r\n /** Resolved locale. */\r\n locale: Required<ResiraLocale>;\r\n /** Resolved domain config. */\r\n domainConfig: DomainConfig;\r\n /** Stripe publishable key. */\r\n stripePublishableKey?: string;\r\n /** Custom terms text. */\r\n termsText?: string;\r\n /** Custom waiver text. */\r\n waiverText?: string;\r\n /** Whether to show the waiver checkbox. */\r\n showWaiver: boolean;\r\n /** Whether to show the terms checkbox. */\r\n showTerms: boolean;\r\n /** Whether to show remaining capacity labels in time slots. */\r\n showRemainingSpots: boolean;\r\n /** Deposit percentage (0-100). */\r\n depositPercent: number;\r\n /** Refund policy rules from property config. */\r\n refundPolicy: RefundRule[];\r\n /** Callback when the modal should close. */\r\n onClose?: () => void;\r\n /** CSS class name overrides. */\r\n classNames: ResiraClassNames;\r\n /** Layout direction for service cards. */\r\n serviceLayout: ServiceLayout;\r\n /** Number of visible service cards before scroll. */\r\n visibleServiceCount: number;\r\n /** Whether services should be grouped by linked equipment category. */\r\n groupServicesByCategory: boolean;\r\n /** Custom render function for service cards. */\r\n renderServiceCard?: (product: Product, selected: boolean) => React.ReactNode;\r\n /** Whether the step indicator bar is visible. */\r\n showStepIndicator: boolean;\r\n /** Pre-fill booking data for deeplink integration. */\r\n deeplink?: DeeplinkSelection;\r\n /** Pre-fill guest information. */\r\n deeplinkGuest?: DeeplinkGuest;\r\n /** Called when the booking step changes. */\r\n onStepChange?: (step: BookingStep) => void;\r\n /** Called when a booking is successfully completed. */\r\n onBookingComplete?: (data: { reservationId?: string; product?: Product; selection: BookingSelection; guest: GuestFormValues }) => void;\r\n /** Called when an error occurs during the booking flow. */\r\n onError?: (code: string, message: string) => void;\r\n /** Checkout session token — when provided, the widget skips to checkout. */\r\n checkoutSessionToken?: string;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Widget state\r\n// ─────────────────────────────────────────────────────────────\r\n\r\n/** Steps in the booking flow. */\r\nexport type BookingStep = \"resource\" | \"availability\" | \"details\" | \"terms\" | \"payment\" | \"confirmation\" | \"checkout\";\r\n\r\n/** Selection state from the availability step. */\r\nexport interface BookingSelection {\r\n /** Selected start date (YYYY-MM-DD). */\r\n startDate?: string;\r\n /** Selected end date (YYYY-MM-DD). */\r\n endDate?: string;\r\n /** Selected time slot start (ISO 8601). */\r\n startTime?: string;\r\n /** Selected time slot end (ISO 8601). */\r\n endTime?: string;\r\n /** Party size. */\r\n partySize: number;\r\n /** Duration in minutes (watersport/service). */\r\n duration?: number;\r\n /** Selected product/service ID. */\r\n productId?: string;\r\n /** Discount code (optional, no server validation yet). */\r\n discountCode?: string;\r\n}\r\n\r\n/** Guest form values. */\r\nexport interface GuestFormValues {\r\n guestName: string;\r\n guestEmail: string;\r\n guestPhone: string;\r\n notes: string;\r\n}\r\n\r\n/** Validation errors for guest form fields. */\r\nexport type GuestFormErrors = Partial<Record<keyof GuestFormValues, string>>;\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Re-exports from SDK for convenience\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nexport type { Availability, Reservation, CreateReservationRequest, PublicResource, ResourceListResponse, ResourceImage, ResourceImageDisplaySettings, Product, ProductImage, ProductListResponse, ProductCategory, PricingModel, DurationPrice, RiderTierPrice, PaymentIntentResponse, ConfirmPaymentResponse, CreatePaymentIntentRequest, ConfirmPaymentRequest, PropertyConfig, ValidatePromoCodeResponse, PromoCode, RefundRule, Dish, DishModel, DishResponse, DishListResponse, CheckoutSession, CheckoutSessionResponse, CreateCheckoutSessionRequest, CreateCheckoutSessionResponse, CheckoutConfig, ProductVariant } from \"@resira/sdk\";\r\n","// ═══════════════════════════════════════════════════════════════\r\n// @resira/ui — Theme utilities\r\n// ═══════════════════════════════════════════════════════════════\r\n\r\nimport type { ResiraTheme } from \"./types.js\";\r\n\r\n/** Default theme values. */\r\nexport const DEFAULT_THEME: Required<ResiraTheme> = {\r\n primaryColor: \"#2563eb\",\r\n primaryHover: \"#1d4ed8\",\r\n primaryForeground: \"#ffffff\",\r\n accentColor: \"#f0f4ff\",\r\n accentForeground: \"#1e40af\",\r\n errorColor: \"#dc2626\",\r\n successColor: \"#16a34a\",\r\n warningColor: \"#d97706\",\r\n textColor: \"#0f172a\",\r\n mutedColor: \"#64748b\",\r\n surfaceColor: \"#ffffff\",\r\n backgroundSubtle: \"#f8fafc\",\r\n borderColor: \"#e2e8f0\",\r\n borderRadius: \"12px\",\r\n fontFamily: \"system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif\",\r\n // Extended token set\r\n cardRadius: \"14px\",\r\n buttonRadius: \"10px\",\r\n inputRadius: \"10px\",\r\n chipRadius: \"20px\",\r\n spacing: \"16px\",\r\n shadowSm: \"0 1px 3px rgba(0,0,0,0.06)\",\r\n shadowMd: \"0 4px 12px rgba(0,0,0,0.08)\",\r\n shadowLg: \"0 8px 30px rgba(0,0,0,0.1)\",\r\n calendarDaySize: \"36px\",\r\n slotMinWidth: \"80px\",\r\n};\r\n\r\n/**\r\n * Merge user-supplied theme with defaults, producing a complete theme.\r\n */\r\nexport function resolveTheme(overrides?: ResiraTheme): Required<ResiraTheme> {\r\n if (!overrides) return DEFAULT_THEME;\r\n return { ...DEFAULT_THEME, ...overrides };\r\n}\r\n\r\n/**\r\n * Generate CSS custom properties from a theme object.\r\n * Returns a CSSProperties-compatible object.\r\n */\r\nexport function themeToCSS(theme: Required<ResiraTheme>): Record<string, string> {\r\n return {\r\n \"--resira-primary\": theme.primaryColor,\r\n \"--resira-primary-hover\": theme.primaryHover,\r\n \"--resira-primary-fg\": theme.primaryForeground,\r\n \"--resira-accent\": theme.accentColor,\r\n \"--resira-accent-fg\": theme.accentForeground,\r\n \"--resira-error\": theme.errorColor,\r\n \"--resira-success\": theme.successColor,\r\n \"--resira-warning\": theme.warningColor,\r\n \"--resira-text\": theme.textColor,\r\n \"--resira-muted\": theme.mutedColor,\r\n \"--resira-surface\": theme.surfaceColor,\r\n \"--resira-bg-subtle\": theme.backgroundSubtle,\r\n \"--resira-border\": theme.borderColor,\r\n \"--resira-radius\": theme.borderRadius,\r\n \"--resira-font\": theme.fontFamily,\r\n \"--resira-card-radius\": theme.cardRadius,\r\n \"--resira-btn-radius\": theme.buttonRadius,\r\n \"--resira-input-radius\": theme.inputRadius,\r\n \"--resira-chip-radius\": theme.chipRadius,\r\n \"--resira-spacing\": theme.spacing,\r\n \"--resira-shadow-sm\": theme.shadowSm,\r\n \"--resira-shadow-md\": theme.shadowMd,\r\n \"--resira-shadow-lg\": theme.shadowLg,\r\n \"--resira-cal-day-size\": theme.calendarDaySize,\r\n \"--resira-slot-min-w\": theme.slotMinWidth,\r\n };\r\n}\r\n","import React, { createContext, useContext, useMemo, useState, useCallback, useEffect } from \"react\";\r\nimport { Resira } from \"@resira/sdk\";\r\nimport type { PropertyConfig } from \"@resira/sdk\";\r\nimport type { RefundRule } from \"@resira/sdk\";\r\nimport type {\r\n ResiraContextValue,\r\n ResiraProviderProps,\r\n DomainConfig,\r\n ResiraDomain,\r\n ResiraClassNames,\r\n DeeplinkSelection,\r\n DeeplinkGuest,\r\n BookingStep,\r\n} from \"./types.js\";\r\nimport { DEFAULT_LOCALE } from \"./types.js\";\r\nimport { resolveTheme, themeToCSS } from \"./theme.js\";\r\n\r\nconst ResiraContext = createContext<ResiraContextValue | null>(null);\r\n\r\n/** Access the Resira context. Throws if used outside ResiraProvider. */\r\nexport function useResira(): ResiraContextValue {\r\n const ctx = useContext(ResiraContext);\r\n if (!ctx) {\r\n throw new Error(\r\n \"useResira must be used within a <ResiraProvider>. \" +\r\n \"Wrap your component tree with <ResiraProvider apiKey={...} resourceId={...} domain={...}>.\",\r\n );\r\n }\r\n return ctx;\r\n}\r\n\r\nconst DOMAIN_DEFAULTS: Record<ResiraDomain, DomainConfig> = {\r\n rental: {\r\n label: \"Vacation Rental\",\r\n defaultPartySize: 2,\r\n minPartySize: 1,\r\n maxPartySize: 20,\r\n minStay: 1,\r\n },\r\n restaurant: {\r\n label: \"Restaurant\",\r\n defaultPartySize: 2,\r\n minPartySize: 1,\r\n maxPartySize: 12,\r\n },\r\n watersport: {\r\n label: \"Water Sport\",\r\n defaultPartySize: 1,\r\n minPartySize: 1,\r\n maxPartySize: 10,\r\n defaultDuration: 60,\r\n availableDurations: [30, 60, 90, 120],\r\n },\r\n service: {\r\n label: \"Service\",\r\n defaultPartySize: 1,\r\n minPartySize: 1,\r\n maxPartySize: 1,\r\n defaultDuration: 60,\r\n availableDurations: [30, 45, 60, 90],\r\n },\r\n};\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Provider component\r\n// ─────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * ResiraProvider — root of the @resira/ui component tree.\r\n *\r\n * Initializes the SDK client and provides domain configuration,\r\n * theme, and locale to all child components.\r\n *\r\n * ```tsx\r\n * <ResiraProvider apiKey=\"resira_live_…\" resourceId=\"prop-1\" domain=\"rental\">\r\n * <ResiraBookingWidget />\r\n * </ResiraProvider>\r\n * ```\r\n */\r\nexport function ResiraProvider({\r\n apiKey,\r\n resourceId,\r\n domain,\r\n config,\r\n checkoutSessionToken,\r\n onClose,\r\n children,\r\n}: ResiraProviderProps) {\r\n // Memoize the SDK client — only re-create when key or URL change.\r\n // Base URL resolution order:\r\n // 1. config.baseUrl prop\r\n // 2. config.baseUrls prop\r\n // 3. NEXT_PUBLIC_RESIRA_API_ENDPOINTS / NEXT_PUBLIC_RESIRA_URL (handled inside the SDK)\r\n // 4. Hard-coded production split\r\n const client = useMemo(\r\n () =>\r\n new Resira({\r\n apiKey,\r\n baseUrl: config?.baseUrl,\r\n baseUrls: config?.baseUrls,\r\n }),\r\n [apiKey, config?.baseUrl, config?.baseUrls],\r\n );\r\n\r\n // Resolve theme\r\n const theme = useMemo(() => resolveTheme(config?.theme), [config?.theme]);\r\n\r\n // Resolve locale\r\n const locale = useMemo(\r\n () => ({ ...DEFAULT_LOCALE, ...config?.locale }) as Required<typeof DEFAULT_LOCALE>,\r\n [config?.locale],\r\n );\r\n\r\n // Resolve domain config\r\n const domainConfig = useMemo(\r\n () => ({ ...DOMAIN_DEFAULTS[domain], ...config?.domainConfig }),\r\n [domain, config?.domainConfig],\r\n );\r\n\r\n // Catalog mode: no resourceId → user picks from catalog\r\n const catalogMode = !resourceId;\r\n const allowMultiSelect = domainConfig.allowMultiSelect ?? false;\r\n\r\n // ── Auto-fetch property config (Stripe key, deposit %, etc.) ──\r\n const [remoteConfig, setRemoteConfig] = useState<PropertyConfig | null>(null);\r\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n client\r\n .getConfig()\r\n .then((cfg) => {\r\n if (!cancelled) setRemoteConfig(cfg);\r\n })\r\n .catch(() => {\r\n // Non-fatal: widget works without remote config, just no Stripe\r\n });\r\n return () => {\r\n cancelled = true;\r\n };\r\n }, [client]);\r\n\r\n // Payment & terms config — manual prop overrides auto-fetched value\r\n const stripePublishableKey =\r\n config?.stripePublishableKey ?? remoteConfig?.stripePublishableKey ?? undefined;\r\n const termsText = config?.termsText ?? (remoteConfig as Record<string, unknown>)?.termsText as string | undefined;\r\n const waiverText = config?.waiverText;\r\n const showWaiver = config?.showWaiver ?? false;\r\n // If backend says termsRequired=true, automatically show terms checkbox\r\n const remoteTermsRequired = (remoteConfig as Record<string, unknown>)?.termsRequired as boolean | undefined;\r\n const showTerms = config?.showTerms ?? remoteTermsRequired ?? true;\r\n const showRemainingSpots = config?.showRemainingSpots ?? false;\r\n const depositPercent =\r\n config?.depositPercent ?? remoteConfig?.depositPercent ?? 100;\r\n const refundPolicy: RefundRule[] =\r\n ((remoteConfig as Record<string, unknown>)?.refundPolicy as RefundRule[] | undefined) ?? [];\r\n\r\n // Active resource ID state (starts as the provided resourceId or undefined)\r\n const [activeResourceId, setActiveResourceIdState] = useState<string | undefined>(resourceId);\r\n\r\n const setActiveResourceId = useCallback((id: string) => {\r\n setActiveResourceIdState(id);\r\n }, []);\r\n\r\n // Customization options\r\n const classNames: ResiraClassNames = config?.classNames ?? {};\r\n const serviceLayout = config?.serviceLayout ?? \"vertical\";\r\n const visibleServiceCount = config?.visibleServiceCount ?? 4;\r\n const groupServicesByCategory = config?.groupServicesByCategory ?? true;\r\n const renderServiceCard = config?.renderServiceCard;\r\n\r\n // Step indicator visibility\r\n const showStepIndicator = config?.showStepIndicator ?? true;\r\n\r\n // Deeplink pre-fill\r\n const deeplink: DeeplinkSelection | undefined = config?.deeplink;\r\n const deeplinkGuest: DeeplinkGuest | undefined = config?.deeplinkGuest;\r\n\r\n // Event hooks\r\n const onStepChange = config?.onStepChange;\r\n const onBookingComplete = config?.onBookingComplete;\r\n const onError = config?.onError;\r\n\r\n // Build CSS variables\r\n const cssVars = useMemo(() => themeToCSS(theme), [theme]);\r\n\r\n const value = useMemo<ResiraContextValue>(\r\n () => ({\r\n client,\r\n resourceId,\r\n activeResourceId,\r\n setActiveResourceId,\r\n catalogMode,\r\n allowMultiSelect,\r\n domain,\r\n theme,\r\n locale,\r\n domainConfig,\r\n stripePublishableKey,\r\n termsText,\r\n waiverText,\r\n showWaiver,\r\n showTerms,\r\n showRemainingSpots,\r\n depositPercent,\r\n refundPolicy,\r\n onClose,\r\n classNames,\r\n serviceLayout,\r\n visibleServiceCount,\r\n groupServicesByCategory,\r\n renderServiceCard,\r\n showStepIndicator,\r\n deeplink,\r\n deeplinkGuest,\r\n onStepChange,\r\n onBookingComplete,\r\n onError,\r\n checkoutSessionToken,\r\n }),\r\n [client, resourceId, activeResourceId, setActiveResourceId, catalogMode, allowMultiSelect, domain, theme, locale, domainConfig, stripePublishableKey, termsText, waiverText, showWaiver, showTerms, showRemainingSpots, depositPercent, refundPolicy, onClose, classNames, serviceLayout, visibleServiceCount, groupServicesByCategory, renderServiceCard, showStepIndicator, deeplink, deeplinkGuest, onStepChange, onBookingComplete, onError, checkoutSessionToken],\r\n );\r\n\r\n return (\r\n <ResiraContext.Provider value={value}>\r\n <div className=\"resira-root\" style={cssVars as React.CSSProperties}>\r\n {children}\r\n </div>\r\n </ResiraContext.Provider>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback, useRef } from \"react\";\r\nimport type {\r\n Availability,\r\n AvailabilityParams,\r\n Reservation,\r\n CreateReservationRequest,\r\n PublicResource,\r\n ResourceListResponse,\r\n} from \"@resira/sdk\";\r\nimport type { Product, CreatePaymentIntentRequest, PaymentIntentResponse, Dish } from \"@resira/sdk\";\r\nimport type { CheckoutSession } from \"@resira/sdk\";\r\nimport { useResira } from \"./ResiraProvider.js\";\r\n\r\nasync function getDishCompat(client: unknown, dishId: string): Promise<{ dish: Dish }> {\r\n const maybeClient = client as {\r\n getDish?: (id: string) => Promise<{ dish: Dish }>;\r\n request?: (method: string, path: string) => Promise<{ dish: Dish }>;\r\n };\r\n\r\n if (typeof maybeClient.getDish === \"function\") {\r\n return maybeClient.getDish(dishId);\r\n }\r\n\r\n if (typeof maybeClient.request === \"function\") {\r\n return maybeClient.request(\"GET\", `/dishes/${encodeURIComponent(dishId)}`);\r\n }\r\n\r\n throw new Error(\"Installed @resira/sdk does not support dish endpoints. Upgrade to @resira/sdk >= 0.3.0.\");\r\n}\r\n\r\nasync function listDishesCompat(client: unknown): Promise<{ dishes: Dish[] }> {\r\n const maybeClient = client as {\r\n listDishes?: () => Promise<{ dishes: Dish[] }>;\r\n request?: (method: string, path: string) => Promise<{ dishes: Dish[] }>;\r\n };\r\n\r\n if (typeof maybeClient.listDishes === \"function\") {\r\n return maybeClient.listDishes();\r\n }\r\n\r\n if (typeof maybeClient.request === \"function\") {\r\n return maybeClient.request(\"GET\", \"/dishes\");\r\n }\r\n\r\n throw new Error(\"Installed @resira/sdk does not support dish endpoints. Upgrade to @resira/sdk >= 0.3.0.\");\r\n}\r\n\r\ninterface UseAvailabilityReturn {\r\n /** Current availability data. */\r\n data: Availability | null;\r\n /** Whether the request is in flight. */\r\n loading: boolean;\r\n /** Error message if the request failed. */\r\n error: string | null;\r\n /** Re-fetch availability with optional new params. */\r\n refetch: (params?: AvailabilityParams) => Promise<void>;\r\n}\r\n\r\n/**\r\n * Fetch and cache availability data for a resource or product.\r\n *\r\n * Automatically re-fetches when `params` change (shallow compare).\r\n *\r\n * When `productId` is provided, uses the product-level availability\r\n * endpoint which aggregates capacity across all linked equipment.\r\n *\r\n * ```tsx\r\n * const { data, loading, error } = useAvailability({\r\n * date: \"2026-07-01\",\r\n * durationMinutes: 30,\r\n * }, \"product-uuid\");\r\n * ```\r\n */\r\nexport function useAvailability(\r\n params?: AvailabilityParams,\r\n productId?: string,\r\n): UseAvailabilityReturn {\r\n const { client, activeResourceId } = useResira();\r\n const resourceId = activeResourceId ?? \"\";\r\n const [data, setData] = useState<Availability | null>(null);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const abortRef = useRef(0);\r\n\r\n // Product-level availability takes priority; otherwise fall back to resource.\r\n const useProduct = !!productId;\r\n\r\n // Guard: need either a productId or a resourceId to fetch.\r\n const enabled = useProduct ? productId!.length > 0 : resourceId.length > 0;\r\n\r\n // Stabilize params by serializing — avoids infinite re-fetch when\r\n // callers pass a new object literal with the same values each render.\r\n const paramsKey = JSON.stringify(params ?? null);\r\n\r\n // Track the last successfully-or-error fetched key so we don't\r\n // re-fetch the same params in a loop on error.\r\n const completedKeyRef = useRef<string | null>(null);\r\n\r\n // Manual refetch\r\n const refetch = useCallback(\r\n async (overrideParams?: AvailabilityParams) => {\r\n if (!enabled) return;\r\n const fetchId = ++abortRef.current;\r\n // Clear the completed guard so manual refetch always proceeds\r\n completedKeyRef.current = null;\r\n setLoading(true);\r\n setError(null);\r\n\r\n try {\r\n const p = overrideParams ?? (params === undefined ? undefined : JSON.parse(paramsKey));\r\n const result = useProduct\r\n ? await client.getProductAvailability(productId!, p)\r\n : await client.getAvailability(resourceId, p);\r\n if (fetchId === abortRef.current) {\r\n setData(result);\r\n completedKeyRef.current = paramsKey;\r\n }\r\n } catch (err) {\r\n if (fetchId === abortRef.current) {\r\n setError(\r\n err instanceof Error ? err.message : \"Failed to load availability\",\r\n );\r\n completedKeyRef.current = paramsKey;\r\n }\r\n } finally {\r\n if (fetchId === abortRef.current) {\r\n setLoading(false);\r\n }\r\n }\r\n },\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [client, resourceId, productId, useProduct, paramsKey, enabled],\r\n );\r\n\r\n // Auto-fetch on mount and when params change\r\n useEffect(() => {\r\n // Skip if no resource selected (prevents /resources//availability)\r\n if (!enabled) {\r\n setData(null);\r\n setLoading(false);\r\n setError(null);\r\n completedKeyRef.current = null;\r\n return;\r\n }\r\n\r\n // Only fetch if params actually changed since last completed fetch\r\n if (completedKeyRef.current === paramsKey) {\r\n return;\r\n }\r\n\r\n const fetchId = ++abortRef.current;\r\n let cancelled = false;\r\n setLoading(true);\r\n setError(null);\r\n\r\n const run = async () => {\r\n try {\r\n const p = params === undefined ? undefined : JSON.parse(paramsKey);\r\n const result = useProduct\r\n ? await client.getProductAvailability(productId!, p)\r\n : await client.getAvailability(resourceId, p);\r\n if (!cancelled && fetchId === abortRef.current) {\r\n setData(result);\r\n completedKeyRef.current = paramsKey;\r\n }\r\n } catch (err) {\r\n if (!cancelled && fetchId === abortRef.current) {\r\n setError(\r\n err instanceof Error ? err.message : \"Failed to load availability\",\r\n );\r\n // Mark as completed so we don't retry endlessly\r\n completedKeyRef.current = paramsKey;\r\n }\r\n } finally {\r\n if (!cancelled && fetchId === abortRef.current) {\r\n setLoading(false);\r\n }\r\n }\r\n };\r\n\r\n run();\r\n\r\n return () => {\r\n cancelled = true;\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [client, resourceId, productId, useProduct, paramsKey, enabled]);\r\n\r\n return { data, loading, error, refetch };\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// useReservation\r\n// ─────────────────────────────────────────────────────────────\r\n\r\ninterface UseReservationReturn {\r\n /** The created reservation (after successful submit). */\r\n reservation: Reservation | null;\r\n /** Whether the submission is in flight. */\r\n submitting: boolean;\r\n /** Error message if submission failed. */\r\n error: string | null;\r\n /** Submit a reservation. Returns the created reservation on success. */\r\n submit: (data: CreateReservationRequest) => Promise<Reservation | null>;\r\n /** Reset the hook state. */\r\n reset: () => void;\r\n}\r\n\r\n/**\r\n * Create a reservation via the SDK.\r\n *\r\n * ```tsx\r\n * const { submit, submitting, reservation, error } = useReservation();\r\n *\r\n * const handleSubmit = async () => {\r\n * await submit({\r\n * guestName: \"Jane\",\r\n * guestEmail: \"jane@example.com\",\r\n * startDate: \"2026-07-01\",\r\n * endDate: \"2026-07-07\",\r\n * });\r\n * };\r\n * ```\r\n */\r\nexport function useReservation(): UseReservationReturn {\r\n const { client } = useResira();\r\n const [reservation, setReservation] = useState<Reservation | null>(null);\r\n const [submitting, setSubmitting] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const submit = useCallback(\r\n async (data: CreateReservationRequest): Promise<Reservation | null> => {\r\n if (!data.resourceId) {\r\n setError(\"No resource selected\");\r\n return null;\r\n }\r\n setSubmitting(true);\r\n setError(null);\r\n\r\n try {\r\n const response = await client.createReservation(data);\r\n setReservation(response.reservation);\r\n return response.reservation;\r\n } catch (err) {\r\n const message =\r\n err instanceof Error ? err.message : \"Failed to create reservation\";\r\n setError(message);\r\n return null;\r\n } finally {\r\n setSubmitting(false);\r\n }\r\n },\r\n [client],\r\n );\r\n\r\n const reset = useCallback(() => {\r\n setReservation(null);\r\n setSubmitting(false);\r\n setError(null);\r\n }, []);\r\n\r\n return { reservation, submitting, error, submit, reset };\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// useResources\r\n// ─────────────────────────────────────────────────────────────\r\n\r\ninterface UseResourcesReturn {\r\n /** List of resources belonging to the organisation. */\r\n resources: PublicResource[];\r\n /** Whether the request is in flight. */\r\n loading: boolean;\r\n /** Error message if fetch failed. */\r\n error: string | null;\r\n}\r\n\r\n/**\r\n * Fetch the resource catalogue for the current organisation via the SDK.\r\n *\r\n * The hook fires automatically on mount (no parameters required).\r\n */\r\nexport function useResources(): UseResourcesReturn {\r\n const { client } = useResira();\r\n\r\n const [resources, setResources] = useState<PublicResource[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n\r\n async function fetchResources() {\r\n try {\r\n setLoading(true);\r\n setError(null);\r\n const data = await (client as any).listResources();\r\n if (!cancelled) {\r\n setResources((data as ResourceListResponse).resources ?? []);\r\n }\r\n } catch (err) {\r\n if (!cancelled) {\r\n const message =\r\n err instanceof Error ? err.message : \"Failed to load resources\";\r\n setError(message);\r\n }\r\n } finally {\r\n if (!cancelled) {\r\n setLoading(false);\r\n }\r\n }\r\n }\r\n\r\n fetchResources();\r\n return () => {\r\n cancelled = true;\r\n };\r\n }, [client]);\r\n\r\n return { resources, loading, error };\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// useProducts\r\n// ─────────────────────────────────────────────────────────────\r\n\r\ninterface UseProductsReturn {\r\n /** List of products/services belonging to the organisation. */\r\n products: Product[];\r\n /** Whether the request is in flight. */\r\n loading: boolean;\r\n /** Error message if fetch failed. */\r\n error: string | null;\r\n}\r\n\r\n/**\r\n * Fetch the product/service catalogue for the current organisation via the SDK.\r\n *\r\n * Calls `GET /v1/public/products` using the API key. Returns real products\r\n * with pricing, duration, and linked equipment as created in the admin dashboard.\r\n *\r\n * The hook fires automatically on mount (no parameters required).\r\n */\r\nexport function useProducts(): UseProductsReturn {\r\n const { client } = useResira();\r\n\r\n const [products, setProducts] = useState<Product[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n\r\n async function fetchProducts() {\r\n try {\r\n setLoading(true);\r\n setError(null);\r\n const data = await client.listProducts();\r\n if (!cancelled) {\r\n setProducts(data.products ?? []);\r\n }\r\n } catch (err) {\r\n if (!cancelled) {\r\n const message =\r\n err instanceof Error ? err.message : \"Failed to load services\";\r\n setError(message);\r\n }\r\n } finally {\r\n if (!cancelled) {\r\n setLoading(false);\r\n }\r\n }\r\n }\r\n\r\n fetchProducts();\r\n return () => {\r\n cancelled = true;\r\n };\r\n }, [client]);\r\n\r\n return { products, loading, error };\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// usePaymentIntent\r\n// ─────────────────────────────────────────────────────────────\r\n\r\ninterface UsePaymentIntentReturn {\r\n /** The payment intent response after creation. */\r\n paymentIntent: PaymentIntentResponse | null;\r\n /** Whether the payment intent is being created. */\r\n creating: boolean;\r\n /** Error message if creation failed. */\r\n error: string | null;\r\n /** Create a new payment intent. */\r\n create: (data: CreatePaymentIntentRequest) => Promise<PaymentIntentResponse | null>;\r\n /** Confirm payment was completed. */\r\n confirm: (paymentIntentId: string, reservationId: string) => Promise<boolean>;\r\n /** Whether confirmation is in progress. */\r\n confirming: boolean;\r\n /** Reset the hook state. */\r\n reset: () => void;\r\n}\r\n\r\n/**\r\n * Create and manage Stripe payment intents via the SDK.\r\n */\r\nexport function usePaymentIntent(): UsePaymentIntentReturn {\r\n const { client } = useResira();\r\n const [paymentIntent, setPaymentIntent] = useState<PaymentIntentResponse | null>(null);\r\n const [creating, setCreating] = useState(false);\r\n const [confirming, setConfirming] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const create = useCallback(\r\n async (data: CreatePaymentIntentRequest): Promise<PaymentIntentResponse | null> => {\r\n setCreating(true);\r\n setError(null);\r\n\r\n try {\r\n const response = await client.createPaymentIntent(data);\r\n setPaymentIntent(response);\r\n return response;\r\n } catch (err) {\r\n const message =\r\n err instanceof Error ? err.message : \"Failed to create payment\";\r\n setError(message);\r\n return null;\r\n } finally {\r\n setCreating(false);\r\n }\r\n },\r\n [client],\r\n );\r\n\r\n const confirm = useCallback(\r\n async (paymentIntentId: string, reservationId: string): Promise<boolean> => {\r\n setConfirming(true);\r\n setError(null);\r\n\r\n try {\r\n const response = await client.confirmPayment({ paymentIntentId, reservationId });\r\n return response.paymentStatus === \"succeeded\";\r\n } catch (err) {\r\n const message =\r\n err instanceof Error ? err.message : \"Payment confirmation failed\";\r\n setError(message);\r\n return false;\r\n } finally {\r\n setConfirming(false);\r\n }\r\n },\r\n [client],\r\n );\r\n\r\n const reset = useCallback(() => {\r\n setPaymentIntent(null);\r\n setCreating(false);\r\n setConfirming(false);\r\n setError(null);\r\n }, []);\r\n\r\n return { paymentIntent, creating, error, create, confirm, confirming, reset };\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// useDish\r\n// ─────────────────────────────────────────────────────────────\r\n\r\ninterface UseDishReturn {\r\n /** The fetched dish. */\r\n dish: Dish | null;\r\n /** Whether the request is in flight. */\r\n loading: boolean;\r\n /** Error message if fetch failed. */\r\n error: string | null;\r\n}\r\n\r\n/**\r\n * Fetch a single dish by ID via the SDK.\r\n *\r\n * ```tsx\r\n * const { dish, loading, error } = useDish(\"dish-uuid\");\r\n * ```\r\n */\r\nexport function useDish(dishId: string | undefined): UseDishReturn {\r\n const { client } = useResira();\r\n const [dish, setDish] = useState<Dish | null>(null);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n if (!dishId) {\r\n setDish(null);\r\n setLoading(false);\r\n setError(null);\r\n return;\r\n }\r\n\r\n let cancelled = false;\r\n setLoading(true);\r\n setError(null);\r\n\r\n async function fetchDish() {\r\n try {\r\n const data = await getDishCompat(client, dishId!);\r\n if (!cancelled) {\r\n setDish(data.dish);\r\n }\r\n } catch (err) {\r\n if (!cancelled) {\r\n setError(err instanceof Error ? err.message : \"Failed to load dish\");\r\n }\r\n } finally {\r\n if (!cancelled) {\r\n setLoading(false);\r\n }\r\n }\r\n }\r\n\r\n fetchDish();\r\n return () => { cancelled = true; };\r\n }, [client, dishId]);\r\n\r\n return { dish, loading, error };\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// useDishes\r\n// ─────────────────────────────────────────────────────────────\r\n\r\ninterface UseDishesReturn {\r\n /** List of dishes. */\r\n dishes: Dish[];\r\n /** Whether the request is in flight. */\r\n loading: boolean;\r\n /** Error message if fetch failed. */\r\n error: string | null;\r\n}\r\n\r\n/**\r\n * Fetch all dishes for the organisation via the SDK.\r\n *\r\n * ```tsx\r\n * const { dishes, loading, error } = useDishes();\r\n * ```\r\n */\r\nexport function useDishes(enabled = true): UseDishesReturn {\r\n const { client } = useResira();\r\n const [dishes, setDishes] = useState<Dish[]>([]);\r\n const [loading, setLoading] = useState(enabled);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n if (!enabled) {\r\n setLoading(false);\r\n setError(null);\r\n return;\r\n }\r\n\r\n let cancelled = false;\r\n\r\n async function fetchDishes() {\r\n try {\r\n setLoading(true);\r\n setError(null);\r\n const data = await listDishesCompat(client);\r\n if (!cancelled) {\r\n setDishes(data.dishes ?? []);\r\n }\r\n } catch (err) {\r\n if (!cancelled) {\r\n setError(err instanceof Error ? err.message : \"Failed to load dishes\");\r\n }\r\n } finally {\r\n if (!cancelled) {\r\n setLoading(false);\r\n }\r\n }\r\n }\r\n\r\n fetchDishes();\r\n return () => { cancelled = true; };\r\n }, [client, enabled]);\r\n\r\n return { dishes, loading, error };\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// useCheckoutSession\r\n// ─────────────────────────────────────────────────────────────\r\n\r\n/** Checkout session error codes for UX branching. */\r\nexport type CheckoutSessionErrorCode = \"not_found\" | \"consumed\" | \"expired\" | \"unknown\";\r\n\r\ninterface UseCheckoutSessionReturn {\r\n /** The hydrated checkout session. */\r\n session: CheckoutSession | null;\r\n /** Whether the session is loading. */\r\n loading: boolean;\r\n /** Error message if loading failed. */\r\n error: string | null;\r\n /** Structured error code for UX branching. */\r\n errorCode: CheckoutSessionErrorCode | null;\r\n}\r\n\r\n/**\r\n * Fetch and hydrate a checkout session by token.\r\n *\r\n * Handles the three error cases from the API:\r\n * - 404 → \"Invalid booking link\"\r\n * - \"already consumed\" → \"This booking was already completed\"\r\n * - \"expired\" → \"Session expired\"\r\n *\r\n * ```tsx\r\n * const { session, loading, error, errorCode } = useCheckoutSession(\"cs_ab12cd34...\");\r\n * ```\r\n */\r\nexport function useCheckoutSession(token: string | undefined): UseCheckoutSessionReturn {\r\n const { client } = useResira();\r\n const [session, setSession] = useState<CheckoutSession | null>(null);\r\n const [loading, setLoading] = useState(!!token);\r\n const [error, setError] = useState<string | null>(null);\r\n const [errorCode, setErrorCode] = useState<CheckoutSessionErrorCode | null>(null);\r\n\r\n useEffect(() => {\r\n if (!token) {\r\n setSession(null);\r\n setLoading(false);\r\n setError(null);\r\n setErrorCode(null);\r\n return;\r\n }\r\n\r\n let cancelled = false;\r\n setLoading(true);\r\n setError(null);\r\n setErrorCode(null);\r\n\r\n async function fetchSession() {\r\n try {\r\n const data = await client.getCheckoutSession(token!);\r\n if (!cancelled) {\r\n setSession(data.session);\r\n }\r\n } catch (err: unknown) {\r\n if (cancelled) return;\r\n\r\n const apiErr = err as { status?: number; body?: { error?: string } };\r\n const message = apiErr.body?.error ?? (err instanceof Error ? err.message : \"Failed to load checkout session\");\r\n\r\n if (apiErr.status === 404) {\r\n setError(\"Invalid booking link\");\r\n setErrorCode(\"not_found\");\r\n } else if (message.toLowerCase().includes(\"consumed\")) {\r\n setError(\"This booking was already completed\");\r\n setErrorCode(\"consumed\");\r\n } else if (message.toLowerCase().includes(\"expired\")) {\r\n setError(\"Session expired — please start a new booking\");\r\n setErrorCode(\"expired\");\r\n } else {\r\n setError(message);\r\n setErrorCode(\"unknown\");\r\n }\r\n } finally {\r\n if (!cancelled) {\r\n setLoading(false);\r\n }\r\n }\r\n }\r\n\r\n fetchSession();\r\n return () => { cancelled = true; };\r\n }, [client, token]);\r\n\r\n return { session, loading, error, errorCode };\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Service (enriched product view)\r\n// ─────────────────────────────────────────────────────────────\r\n\r\n/** A single duration/price option for a service. */\r\nexport interface ServiceOption {\r\n /** Duration in minutes. */\r\n durationMinutes: number;\r\n /** Human-readable duration label (e.g. \"1h 30m\"). */\r\n durationLabel: string;\r\n /** Price in minor units (cents). */\r\n priceCents: number;\r\n /** Formatted price string (e.g. \"€50.00\"). */\r\n priceFormatted: string;\r\n}\r\n\r\n/** Enriched service data ready for display. */\r\nexport interface Service {\r\n /** Unique service ID. */\r\n id: string;\r\n /** Service name. */\r\n name: string;\r\n /** Optional description. */\r\n description?: string;\r\n /** Image URL. */\r\n imageUrl?: string;\r\n /** ISO 4217 currency code. */\r\n currency: string;\r\n /** Whether the service is active. */\r\n active: boolean;\r\n /** Pricing model: \"per_session\" | \"per_person\" | \"per_rider\". */\r\n pricingModel: string;\r\n /** Default/base price in minor units. */\r\n priceCents: number;\r\n /** Formatted base price (e.g. \"€50.00\"). */\r\n priceFormatted: string;\r\n /** Lowest price across all options (for \"from €X\" display). */\r\n lowestPriceCents: number;\r\n /** Formatted lowest price. */\r\n lowestPriceFormatted: string;\r\n /** Whether multiple duration/price options exist. */\r\n hasMultipleOptions: boolean;\r\n /** Default duration in minutes. */\r\n durationMinutes: number;\r\n /** Human-readable default duration (e.g. \"2h\"). */\r\n durationLabel: string;\r\n /** All available duration/price options. */\r\n options: ServiceOption[];\r\n /** Maximum party/group size. */\r\n maxPartySize?: number;\r\n /** IDs of linked equipment/resources. */\r\n equipmentIds: string[];\r\n /** Names of linked equipment/resources. */\r\n equipmentNames?: string[];\r\n /** Display color. */\r\n serviceColor?: string;\r\n /** Sort order. */\r\n sortOrder?: number;\r\n /** Raw product object from the API. */\r\n raw: Product;\r\n}\r\n\r\nfunction formatPriceCentsUtil(cents: number, currency: string): string {\r\n return new Intl.NumberFormat(\"default\", { style: \"currency\", currency }).format(cents / 100);\r\n}\r\n\r\nfunction formatDurationUtil(minutes: number): string {\r\n if (minutes < 60) return `${minutes} min`;\r\n const h = Math.floor(minutes / 60);\r\n const m = minutes % 60;\r\n return m > 0 ? `${h}h ${m}m` : `${h}h`;\r\n}\r\n\r\nfunction enrichProduct(product: Product): Service {\r\n const currency = product.currency ?? \"EUR\";\r\n const options: ServiceOption[] = [];\r\n\r\n if (product.durationPricing?.length) {\r\n for (const dp of product.durationPricing) {\r\n options.push({\r\n durationMinutes: dp.durationMinutes,\r\n durationLabel: formatDurationUtil(dp.durationMinutes),\r\n priceCents: dp.priceCents,\r\n priceFormatted: formatPriceCentsUtil(dp.priceCents, currency),\r\n });\r\n }\r\n } else {\r\n options.push({\r\n durationMinutes: product.durationMinutes,\r\n durationLabel: formatDurationUtil(product.durationMinutes),\r\n priceCents: product.priceCents,\r\n priceFormatted: formatPriceCentsUtil(product.priceCents, currency),\r\n });\r\n }\r\n\r\n const lowestPriceCents = Math.min(...options.map((o) => o.priceCents));\r\n\r\n return {\r\n id: product.id,\r\n name: product.name,\r\n description: product.description,\r\n imageUrl: product.imageUrl,\r\n currency,\r\n active: product.active,\r\n pricingModel: product.pricingModel,\r\n priceCents: product.priceCents,\r\n priceFormatted: formatPriceCentsUtil(product.priceCents, currency),\r\n lowestPriceCents,\r\n lowestPriceFormatted: formatPriceCentsUtil(lowestPriceCents, currency),\r\n hasMultipleOptions: options.length > 1,\r\n durationMinutes: product.durationMinutes,\r\n durationLabel: formatDurationUtil(product.durationMinutes),\r\n options,\r\n maxPartySize: product.maxPartySize,\r\n equipmentIds: product.equipmentIds,\r\n equipmentNames: product.equipmentNames,\r\n serviceColor: product.serviceColor,\r\n sortOrder: product.sortOrder,\r\n raw: product,\r\n };\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// useServices (React hook — requires ResiraProvider)\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nexport interface UseServicesReturn {\r\n /** Enriched service list. */\r\n services: Service[];\r\n /** Whether loading. */\r\n loading: boolean;\r\n /** Error message. */\r\n error: string | null;\r\n /** Re-fetch services. */\r\n refetch: () => void;\r\n}\r\n\r\n/**\r\n * Fetch all services for the organisation with enriched display data.\r\n *\r\n * Returns formatted prices, duration labels, and \"from €X\" logic\r\n * so you can render service cards with your own styling.\r\n *\r\n * Requires `<ResiraProvider>` ancestor.\r\n *\r\n * ```tsx\r\n * const { services, loading, error } = useServices();\r\n *\r\n * return services.map(s => (\r\n * <div key={s.id}>\r\n * <h3>{s.name}</h3>\r\n * <img src={s.imageUrl} alt={s.name} />\r\n * <p>{s.hasMultipleOptions ? `from ${s.lowestPriceFormatted}` : s.priceFormatted}</p>\r\n * <p>{s.durationLabel}</p>\r\n * {s.options.map(opt => (\r\n * <span key={opt.durationMinutes}>{opt.durationLabel} — {opt.priceFormatted}</span>\r\n * ))}\r\n * </div>\r\n * ));\r\n * ```\r\n */\r\nexport function useServices(): UseServicesReturn {\r\n const { client } = useResira();\r\n const [services, setServices] = useState<Service[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n const [fetchCount, setFetchCount] = useState(0);\r\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n setLoading(true);\r\n setError(null);\r\n\r\n async function load() {\r\n try {\r\n const data = await client.listProducts();\r\n if (!cancelled) {\r\n setServices((data.products ?? []).map(enrichProduct));\r\n }\r\n } catch (err) {\r\n if (!cancelled) {\r\n setError(err instanceof Error ? err.message : \"Failed to load services\");\r\n }\r\n } finally {\r\n if (!cancelled) setLoading(false);\r\n }\r\n }\r\n\r\n load();\r\n return () => { cancelled = true; };\r\n }, [client, fetchCount]);\r\n\r\n const refetch = useCallback(() => setFetchCount((c) => c + 1), []);\r\n\r\n return { services, loading, error, refetch };\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// fetchServices (standalone — no React required)\r\n// ─────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Fetch all services for an organisation — standalone, no React needed.\r\n *\r\n * Use this in non-React contexts, server components, scripts, or\r\n * when you want full control over rendering.\r\n *\r\n * ```ts\r\n * import { fetchServices } from \"@resira/ui\";\r\n *\r\n * const services = await fetchServices(\"your-api-key\");\r\n * services.forEach(s => {\r\n * console.log(s.name, s.lowestPriceFormatted, s.options);\r\n * });\r\n * ```\r\n *\r\n * @param apiKey Your Resira public API key\r\n * @param opts Optional: baseUrl override\r\n * @returns Array of enriched Service objects\r\n */\r\nexport async function fetchServices(\r\n apiKey: string,\r\n opts?: { baseUrl?: string },\r\n): Promise<Service[]> {\r\n const { Resira } = await import(\"@resira/sdk\");\r\n const client = new Resira({\r\n apiKey,\r\n ...(opts?.baseUrl ? { baseUrl: opts.baseUrl } : {}),\r\n });\r\n const data = await client.listProducts();\r\n return (data.products ?? []).map(enrichProduct);\r\n}\r\n","// ═══════════════════════════════════════════════════════════════\r\n// @resira/ui — SVG Icons\r\n// Clean, minimal 20×20 SVG icons. No emojis.\r\n// ═══════════════════════════════════════════════════════════════\r\n\r\nimport React from \"react\";\r\n\r\ninterface IconProps {\r\n size?: number;\r\n className?: string;\r\n}\r\n\r\nconst defaultSize = 20;\r\n\r\nexport function CalendarIcon({ size = defaultSize, className }: IconProps) {\r\n return (\r\n <svg\r\n width={size}\r\n height={size}\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={1.5}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <rect x=\"2.5\" y=\"4\" width=\"15\" height=\"13.5\" rx=\"2\" />\r\n <path d=\"M2.5 8.5h15\" />\r\n <path d=\"M6.5 2.5v3\" />\r\n <path d=\"M13.5 2.5v3\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function ClockIcon({ size = defaultSize, className }: IconProps) {\r\n return (\r\n <svg\r\n width={size}\r\n height={size}\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={1.5}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <circle cx=\"10\" cy=\"10\" r=\"7.5\" />\r\n <path d=\"M10 6v4l2.5 2.5\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function UserIcon({ size = defaultSize, className }: IconProps) {\r\n return (\r\n <svg\r\n width={size}\r\n height={size}\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={1.5}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <circle cx=\"10\" cy=\"7\" r=\"3.5\" />\r\n <path d=\"M3.5 17.5c0-3.59 2.91-6.5 6.5-6.5s6.5 2.91 6.5 6.5\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function UsersIcon({ size = defaultSize, className }: IconProps) {\r\n return (\r\n <svg\r\n width={size}\r\n height={size}\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={1.5}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <circle cx=\"7.5\" cy=\"6.5\" r=\"3\" />\r\n <path d=\"M2 17c0-3.04 2.46-5.5 5.5-5.5S13 13.96 13 17\" />\r\n <circle cx=\"14\" cy=\"7\" r=\"2.5\" />\r\n <path d=\"M14.5 11.5c1.93.5 3.5 2.46 3.5 4.5\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function CheckIcon({ size = defaultSize, className }: IconProps) {\r\n return (\r\n <svg\r\n width={size}\r\n height={size}\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <path d=\"M4 10.5l4 4 8-9\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function CheckCircleIcon({ size = defaultSize, className }: IconProps) {\r\n return (\r\n <svg\r\n width={size}\r\n height={size}\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={1.5}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <circle cx=\"10\" cy=\"10\" r=\"7.5\" />\r\n <path d=\"M6.5 10.5l2 2 5-5.5\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function ChevronLeftIcon({ size = defaultSize, className }: IconProps) {\r\n return (\r\n <svg\r\n width={size}\r\n height={size}\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={1.5}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <path d=\"M12 4l-6 6 6 6\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function ChevronRightIcon({ size = defaultSize, className }: IconProps) {\r\n return (\r\n <svg\r\n width={size}\r\n height={size}\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={1.5}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <path d=\"M8 4l6 6-6 6\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function AlertCircleIcon({ size = defaultSize, className }: IconProps) {\r\n return (\r\n <svg\r\n width={size}\r\n height={size}\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={1.5}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <circle cx=\"10\" cy=\"10\" r=\"7.5\" />\r\n <path d=\"M10 7v4\" />\r\n <circle cx=\"10\" cy=\"13.5\" r=\"0.5\" fill=\"currentColor\" stroke=\"none\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function MinusIcon({ size = defaultSize, className }: IconProps) {\r\n return (\r\n <svg\r\n width={size}\r\n height={size}\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={1.5}\r\n strokeLinecap=\"round\"\r\n className={className}\r\n >\r\n <path d=\"M5 10h10\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function PlusIcon({ size = defaultSize, className }: IconProps) {\r\n return (\r\n <svg\r\n width={size}\r\n height={size}\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={1.5}\r\n strokeLinecap=\"round\"\r\n className={className}\r\n >\r\n <path d=\"M10 5v10M5 10h10\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function MailIcon({ size = defaultSize, className }: IconProps) {\r\n return (\r\n <svg\r\n width={size}\r\n height={size}\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={1.5}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <rect x=\"2.5\" y=\"4.5\" width=\"15\" height=\"11\" rx=\"2\" />\r\n <path d=\"M2.5 6.5l7.5 5 7.5-5\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function PhoneIcon({ size = defaultSize, className }: IconProps) {\r\n return (\r\n <svg\r\n width={size}\r\n height={size}\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={1.5}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <path d=\"M3 4.5c0-.83.67-1.5 1.5-1.5h2.09c.36 0 .67.24.76.59l.8 2.82a.78.78 0 01-.22.78l-1.12.93a10.5 10.5 0 005.57 5.57l.93-1.12a.78.78 0 01.78-.22l2.82.8c.35.09.59.4.59.76v2.09c0 .83-.67 1.5-1.5 1.5C8.82 17 3 11.18 3 4.5z\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function NoteIcon({ size = defaultSize, className }: IconProps) {\r\n return (\r\n <svg\r\n width={size}\r\n height={size}\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={1.5}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <rect x=\"3.5\" y=\"2.5\" width=\"13\" height=\"15\" rx=\"2\" />\r\n <path d=\"M7 7h6M7 10h6M7 13h3\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function XIcon({ size = defaultSize, className }: IconProps) {\r\n return (\r\n <svg\r\n width={size}\r\n height={size}\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={1.5}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <path d=\"M5 5l10 10M15 5L5 15\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function LockIcon({ size = defaultSize, className }: IconProps) {\r\n return (\r\n <svg\r\n width={size}\r\n height={size}\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={1.5}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <rect x=\"4\" y=\"9\" width=\"12\" height=\"8\" rx=\"2\" />\r\n <path d=\"M7 9V6a3 3 0 016 0v3\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function CreditCardIcon({ size = defaultSize, className }: IconProps) {\r\n return (\r\n <svg\r\n width={size}\r\n height={size}\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={1.5}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <rect x=\"2\" y=\"4\" width=\"16\" height=\"12\" rx=\"2\" />\r\n <path d=\"M2 8h16\" />\r\n <path d=\"M6 12h2\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function ShieldIcon({ size = defaultSize, className }: IconProps) {\r\n return (\r\n <svg\r\n width={size}\r\n height={size}\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={1.5}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <path d=\"M10 2l6 3v4c0 4.5-2.5 7.5-6 9-3.5-1.5-6-4.5-6-9V5l6-3z\" />\r\n <path d=\"M7 10l2 2 4-4\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function TagIcon({ size = defaultSize, className }: IconProps) {\r\n return (\r\n <svg\r\n width={size}\r\n height={size}\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={1.5}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <path d=\"M2 10.5V4a2 2 0 012-2h6.5l7.5 7.5-6.5 6.5L2 10.5z\" />\r\n <circle cx=\"7\" cy=\"7\" r=\"1\" fill=\"currentColor\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function CubeIcon({ size = defaultSize, className }: IconProps) {\r\n return (\r\n <svg\r\n width={size}\r\n height={size}\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={1.5}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <path d=\"M10 2l7 4v8l-7 4-7-4V6l7-4z\" />\r\n <path d=\"M10 10l7-4\" />\r\n <path d=\"M10 10v8\" />\r\n <path d=\"M10 10L3 6\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function ViewfinderIcon({ size = defaultSize, className }: IconProps) {\r\n return (\r\n <svg\r\n width={size}\r\n height={size}\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={1.5}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n >\r\n <path d=\"M2 6V4a2 2 0 012-2h2\" />\r\n <path d=\"M14 2h2a2 2 0 012 2v2\" />\r\n <path d=\"M18 14v2a2 2 0 01-2 2h-2\" />\r\n <path d=\"M6 18H4a2 2 0 01-2-2v-2\" />\r\n <circle cx=\"10\" cy=\"10\" r=\"3\" />\r\n </svg>\r\n );\r\n}\r\n","// ═══════════════════════════════════════════════════════════════\r\n// @resira/ui — BookingCalendar\r\n// Multi-day date range picker for rental domains.\r\n// Shows blocked dates, supports check-in / check-out selection.\r\n// ═══════════════════════════════════════════════════════════════\r\n\r\nimport React, { useState, useMemo, useCallback } from \"react\";\r\nimport { useResira } from \"../ResiraProvider.js\";\r\nimport { ChevronLeftIcon, ChevronRightIcon } from \"../icons.js\";\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Helpers\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nfunction toDateStr(d: Date): string {\r\n const y = d.getFullYear();\r\n const m = String(d.getMonth() + 1).padStart(2, \"0\");\r\n const day = String(d.getDate()).padStart(2, \"0\");\r\n return `${y}-${m}-${day}`;\r\n}\r\n\r\nfunction parseDate(s: string): Date {\r\n const [y, m, d] = s.split(\"-\").map(Number);\r\n return new Date(y, m - 1, d);\r\n}\r\n\r\nfunction isSameDay(a: Date, b: Date): boolean {\r\n return (\r\n a.getFullYear() === b.getFullYear() &&\r\n a.getMonth() === b.getMonth() &&\r\n a.getDate() === b.getDate()\r\n );\r\n}\r\n\r\nfunction isBeforeDay(a: Date, b: Date): boolean {\r\n return toDateStr(a) < toDateStr(b);\r\n}\r\n\r\nfunction isBetween(date: Date, start: Date, end: Date): boolean {\r\n const d = toDateStr(date);\r\n return d > toDateStr(start) && d < toDateStr(end);\r\n}\r\n\r\nconst WEEKDAYS = [\"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\", \"Su\"];\r\n\r\nfunction getDaysInMonth(year: number, month: number): number {\r\n return new Date(year, month + 1, 0).getDate();\r\n}\r\n\r\n/** Get the day of the week (Mon=0, Sun=6) for the first day of a month. */\r\nfunction getFirstDayOffset(year: number, month: number): number {\r\n const day = new Date(year, month, 1).getDay();\r\n return day === 0 ? 6 : day - 1; // Convert Sun=0 to Mon-start\r\n}\r\n\r\nfunction formatMonth(year: number, month: number): string {\r\n return new Date(year, month).toLocaleString(\"default\", {\r\n month: \"long\",\r\n year: \"numeric\",\r\n });\r\n}\r\n\r\nfunction formatShortDate(dateStr: string): string {\r\n const d = parseDate(dateStr);\r\n return d.toLocaleDateString(\"default\", {\r\n month: \"short\",\r\n day: \"numeric\",\r\n });\r\n}\r\n\r\nfunction nightsBetween(start: string, end: string): number {\r\n const a = parseDate(start);\r\n const b = parseDate(end);\r\n return Math.round((b.getTime() - a.getTime()) / (1000 * 60 * 60 * 24));\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Props\r\n// ─────────────────────────────────────────────────────────────\r\n\r\ninterface BookingCalendarProps {\r\n /** Set of blocked/unavailable dates (YYYY-MM-DD). */\r\n blockedDates?: Set<string>;\r\n /** Currently selected start date. */\r\n startDate?: string;\r\n /** Currently selected end date. */\r\n endDate?: string;\r\n /** Called when the user selects dates. */\r\n onSelect: (start: string, end: string | undefined) => void;\r\n /** Minimum stay in nights. */\r\n minStay?: number;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Component\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nexport function BookingCalendar({\r\n blockedDates = new Set(),\r\n startDate,\r\n endDate,\r\n onSelect,\r\n minStay = 1,\r\n}: BookingCalendarProps) {\r\n const { locale } = useResira();\r\n const today = useMemo(() => new Date(), []);\r\n const [viewYear, setViewYear] = useState(today.getFullYear());\r\n const [viewMonth, setViewMonth] = useState(today.getMonth());\r\n\r\n const prevMonth = useCallback(() => {\r\n setViewMonth((m) => {\r\n if (m === 0) {\r\n setViewYear((y) => y - 1);\r\n return 11;\r\n }\r\n return m - 1;\r\n });\r\n }, []);\r\n\r\n const nextMonth = useCallback(() => {\r\n setViewMonth((m) => {\r\n if (m === 11) {\r\n setViewYear((y) => y + 1);\r\n return 0;\r\n }\r\n return m + 1;\r\n });\r\n }, []);\r\n\r\n const isPrevDisabled =\r\n viewYear < today.getFullYear() ||\r\n (viewYear === today.getFullYear() && viewMonth <= today.getMonth());\r\n\r\n // Build calendar grid\r\n const calendarDays = useMemo(() => {\r\n const offset = getFirstDayOffset(viewYear, viewMonth);\r\n const daysInMonth = getDaysInMonth(viewYear, viewMonth);\r\n const cells: Array<{ date: Date; inMonth: boolean }> = [];\r\n\r\n // Previous month fill\r\n const prevMonthDays = getDaysInMonth(\r\n viewMonth === 0 ? viewYear - 1 : viewYear,\r\n viewMonth === 0 ? 11 : viewMonth - 1,\r\n );\r\n for (let i = offset - 1; i >= 0; i--) {\r\n cells.push({\r\n date: new Date(\r\n viewMonth === 0 ? viewYear - 1 : viewYear,\r\n viewMonth === 0 ? 11 : viewMonth - 1,\r\n prevMonthDays - i,\r\n ),\r\n inMonth: false,\r\n });\r\n }\r\n\r\n // Current month\r\n for (let d = 1; d <= daysInMonth; d++) {\r\n cells.push({ date: new Date(viewYear, viewMonth, d), inMonth: true });\r\n }\r\n\r\n // Next month fill (complete the last row)\r\n const remaining = 7 - (cells.length % 7);\r\n if (remaining < 7) {\r\n for (let i = 1; i <= remaining; i++) {\r\n cells.push({\r\n date: new Date(\r\n viewMonth === 11 ? viewYear + 1 : viewYear,\r\n viewMonth === 11 ? 0 : viewMonth + 1,\r\n i,\r\n ),\r\n inMonth: false,\r\n });\r\n }\r\n }\r\n\r\n return cells;\r\n }, [viewYear, viewMonth]);\r\n\r\n const handleDayClick = useCallback(\r\n (dateStr: string) => {\r\n if (blockedDates.has(dateStr)) return;\r\n\r\n // No start selected → set start\r\n if (!startDate) {\r\n onSelect(dateStr, undefined);\r\n return;\r\n }\r\n\r\n // Start already selected, no end → set end (or restart)\r\n if (startDate && !endDate) {\r\n if (dateStr <= startDate) {\r\n // Clicked before or on start → restart\r\n onSelect(dateStr, undefined);\r\n return;\r\n }\r\n\r\n // Check if any blocked date falls in range\r\n const start = parseDate(startDate);\r\n const end = parseDate(dateStr);\r\n for (const blocked of blockedDates) {\r\n const bd = parseDate(blocked);\r\n if (isBetween(bd, start, end)) {\r\n // Blocked date in range → restart\r\n onSelect(dateStr, undefined);\r\n return;\r\n }\r\n }\r\n\r\n onSelect(startDate, dateStr);\r\n return;\r\n }\r\n\r\n // Both selected → restart\r\n onSelect(dateStr, undefined);\r\n },\r\n [startDate, endDate, blockedDates, onSelect],\r\n );\r\n\r\n return (\r\n <div className=\"resira-calendar\">\r\n {/* Navigation */}\r\n <div className=\"resira-calendar-nav\">\r\n <button\r\n type=\"button\"\r\n className=\"resira-calendar-nav-btn\"\r\n onClick={prevMonth}\r\n disabled={isPrevDisabled}\r\n aria-label=\"Previous month\"\r\n >\r\n <ChevronLeftIcon size={16} />\r\n </button>\r\n <span className=\"resira-calendar-month\">\r\n {formatMonth(viewYear, viewMonth)}\r\n </span>\r\n <button\r\n type=\"button\"\r\n className=\"resira-calendar-nav-btn\"\r\n onClick={nextMonth}\r\n aria-label=\"Next month\"\r\n >\r\n <ChevronRightIcon size={16} />\r\n </button>\r\n </div>\r\n\r\n {/* Grid */}\r\n <div className=\"resira-calendar-grid\">\r\n {/* Weekday headers */}\r\n {WEEKDAYS.map((wd) => (\r\n <div key={wd} className=\"resira-calendar-weekday\">\r\n {wd}\r\n </div>\r\n ))}\r\n\r\n {/* Day cells */}\r\n {calendarDays.map(({ date, inMonth }, idx) => {\r\n const dateStr = toDateStr(date);\r\n const isToday = isSameDay(date, today);\r\n const isPast = isBeforeDay(date, today);\r\n const isBlocked = blockedDates.has(dateStr);\r\n const isDisabled = !inMonth || isPast || isBlocked;\r\n\r\n const isStart = startDate ? dateStr === startDate : false;\r\n const isEnd = endDate ? dateStr === endDate : false;\r\n const isSelected = isStart || isEnd;\r\n\r\n const inRange =\r\n startDate && endDate\r\n ? isBetween(date, parseDate(startDate), parseDate(endDate))\r\n : false;\r\n\r\n let className = \"resira-calendar-day\";\r\n if (!inMonth) className += \" resira-calendar-day--outside\";\r\n if (isToday) className += \" resira-calendar-day--today\";\r\n if (isBlocked && inMonth) className += \" resira-calendar-day--blocked\";\r\n if (isSelected) className += \" resira-calendar-day--selected\";\r\n if (inRange) className += \" resira-calendar-day--in-range\";\r\n if (isStart && endDate) className += \" resira-calendar-day--range-start\";\r\n if (isEnd) className += \" resira-calendar-day--range-end\";\r\n\r\n return (\r\n <button\r\n key={idx}\r\n type=\"button\"\r\n className={className}\r\n disabled={isDisabled}\r\n onClick={() => handleDayClick(dateStr)}\r\n aria-label={dateStr}\r\n >\r\n {date.getDate()}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n\r\n {/* Date summary */}\r\n {startDate && (\r\n <div className=\"resira-date-summary\">\r\n <div className=\"resira-date-summary-item\">\r\n <div className=\"resira-date-summary-label\">{locale.checkIn}</div>\r\n <div className=\"resira-date-summary-value\">\r\n {formatShortDate(startDate)}\r\n </div>\r\n </div>\r\n {endDate ? (\r\n <>\r\n <div className=\"resira-date-summary-item\">\r\n <div className=\"resira-date-summary-label\">{locale.checkOut}</div>\r\n <div className=\"resira-date-summary-value\">\r\n {formatShortDate(endDate)}\r\n </div>\r\n </div>\r\n <div className=\"resira-date-summary-item\">\r\n <div className=\"resira-date-summary-label\">{locale.nights}</div>\r\n <div className=\"resira-date-summary-value\">\r\n {nightsBetween(startDate, endDate)}\r\n </div>\r\n </div>\r\n </>\r\n ) : (\r\n <div className=\"resira-date-summary-item\">\r\n <div className=\"resira-date-summary-label\">{locale.checkOut}</div>\r\n <div className=\"resira-date-summary-value\" style={{ opacity: 0.4 }}>\r\n —\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","// ═══════════════════════════════════════════════════════════════\r\n// @resira/ui — TimeSlotPicker (v2)\r\n// Compact calendar + time slot grid.\r\n// Clear sections: Duration → Date → Party Size → Time Slots\r\n// Custom inline calendar replaces native date input.\r\n// ═══════════════════════════════════════════════════════════════\r\n\r\nimport React, { useCallback, useMemo, useState } from \"react\";\r\nimport type { TimeSlotAvailability, DurationPrice } from \"@resira/sdk\";\r\nimport { useResira } from \"../ResiraProvider.js\";\r\nimport { MinusIcon, PlusIcon, ClockIcon, ChevronLeftIcon, ChevronRightIcon } from \"../icons.js\";\r\n\r\nfunction formatDurationLabel(minutes: number): string {\r\n if (minutes < 60) return `${minutes} min`;\r\n const h = Math.floor(minutes / 60);\r\n const m = minutes % 60;\r\n return m > 0 ? `${h}h${m}` : `${h}h`;\r\n}\r\n\r\nfunction formatPriceCents(cents: number, currency: string = \"EUR\"): string {\r\n return new Intl.NumberFormat(\"default\", {\r\n style: \"currency\",\r\n currency,\r\n }).format(cents / 100);\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Mini calendar helpers\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nfunction toDateStr(d: Date): string {\r\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, \"0\")}-${String(d.getDate()).padStart(2, \"0\")}`;\r\n}\r\n\r\nfunction todayStr(): string {\r\n return toDateStr(new Date());\r\n}\r\n\r\nconst WEEKDAY_LABELS = [\"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\", \"Su\"];\r\n\r\nfunction getDaysInMonth(year: number, month: number): number {\r\n return new Date(year, month + 1, 0).getDate();\r\n}\r\n\r\nfunction getFirstDayOffset(year: number, month: number): number {\r\n const day = new Date(year, month, 1).getDay();\r\n return day === 0 ? 6 : day - 1;\r\n}\r\n\r\nfunction formatSlotTime(isoString: string): string {\r\n try {\r\n const d = new Date(isoString);\r\n return d.toLocaleTimeString(\"default\", {\r\n hour: \"2-digit\",\r\n minute: \"2-digit\",\r\n hour12: false,\r\n });\r\n } catch {\r\n return isoString;\r\n }\r\n}\r\n\r\nfunction formatSelectedDate(dateStr: string): string {\r\n const [y, m, d] = dateStr.split(\"-\").map(Number);\r\n const date = new Date(y, m - 1, d);\r\n return date.toLocaleDateString(\"default\", {\r\n weekday: \"short\",\r\n month: \"short\",\r\n day: \"numeric\",\r\n });\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// CompactCalendar (inline mini calendar)\r\n// ─────────────────────────────────────────────────────────────\r\n\r\ninterface CompactCalendarProps {\r\n selectedDate: string;\r\n onDateSelect: (date: string) => void;\r\n fullyBookedDates?: Set<string>;\r\n}\r\n\r\nfunction CompactCalendar({ selectedDate, onDateSelect, fullyBookedDates = new Set() }: CompactCalendarProps) {\r\n const today = useMemo(() => new Date(), []);\r\n const todayS = useMemo(() => toDateStr(today), [today]);\r\n const [viewYear, setViewYear] = useState(() => {\r\n if (selectedDate) {\r\n const [y] = selectedDate.split(\"-\").map(Number);\r\n return y;\r\n }\r\n return today.getFullYear();\r\n });\r\n const [viewMonth, setViewMonth] = useState(() => {\r\n if (selectedDate) {\r\n const parts = selectedDate.split(\"-\").map(Number);\r\n return parts[1] - 1;\r\n }\r\n return today.getMonth();\r\n });\r\n\r\n const prevMonth = useCallback(() => {\r\n setViewMonth((m) => {\r\n if (m === 0) { setViewYear((y) => y - 1); return 11; }\r\n return m - 1;\r\n });\r\n }, []);\r\n\r\n const nextMonth = useCallback(() => {\r\n setViewMonth((m) => {\r\n if (m === 11) { setViewYear((y) => y + 1); return 0; }\r\n return m + 1;\r\n });\r\n }, []);\r\n\r\n const isPrevDisabled =\r\n viewYear < today.getFullYear() ||\r\n (viewYear === today.getFullYear() && viewMonth <= today.getMonth());\r\n\r\n const monthLabel = new Date(viewYear, viewMonth).toLocaleString(\"default\", {\r\n month: \"long\",\r\n year: \"numeric\",\r\n });\r\n\r\n const cells = useMemo(() => {\r\n const offset = getFirstDayOffset(viewYear, viewMonth);\r\n const daysInMonth = getDaysInMonth(viewYear, viewMonth);\r\n const result: Array<{ date: Date; inMonth: boolean }> = [];\r\n\r\n const prevMonthDays = getDaysInMonth(\r\n viewMonth === 0 ? viewYear - 1 : viewYear,\r\n viewMonth === 0 ? 11 : viewMonth - 1,\r\n );\r\n for (let i = offset - 1; i >= 0; i--) {\r\n result.push({\r\n date: new Date(\r\n viewMonth === 0 ? viewYear - 1 : viewYear,\r\n viewMonth === 0 ? 11 : viewMonth - 1,\r\n prevMonthDays - i,\r\n ),\r\n inMonth: false,\r\n });\r\n }\r\n for (let d = 1; d <= daysInMonth; d++) {\r\n result.push({ date: new Date(viewYear, viewMonth, d), inMonth: true });\r\n }\r\n const remaining = 7 - (result.length % 7);\r\n if (remaining < 7) {\r\n for (let i = 1; i <= remaining; i++) {\r\n result.push({\r\n date: new Date(\r\n viewMonth === 11 ? viewYear + 1 : viewYear,\r\n viewMonth === 11 ? 0 : viewMonth + 1,\r\n i,\r\n ),\r\n inMonth: false,\r\n });\r\n }\r\n }\r\n return result;\r\n }, [viewYear, viewMonth]);\r\n\r\n return (\r\n <div className=\"resira-mini-cal\">\r\n {/* Navigation */}\r\n <div className=\"resira-mini-cal-nav\">\r\n <button type=\"button\" className=\"resira-mini-cal-nav-btn\" onClick={prevMonth} disabled={isPrevDisabled} aria-label=\"Previous month\">\r\n <ChevronLeftIcon size={14} />\r\n </button>\r\n <span className=\"resira-mini-cal-month\">{monthLabel}</span>\r\n <button type=\"button\" className=\"resira-mini-cal-nav-btn\" onClick={nextMonth} aria-label=\"Next month\">\r\n <ChevronRightIcon size={14} />\r\n </button>\r\n </div>\r\n\r\n {/* Grid */}\r\n <div className=\"resira-mini-cal-grid\">\r\n {WEEKDAY_LABELS.map((wd) => (\r\n <div key={wd} className=\"resira-mini-cal-weekday\">{wd}</div>\r\n ))}\r\n\r\n {cells.map(({ date, inMonth }, idx) => {\r\n const dateStr = toDateStr(date);\r\n const isToday = dateStr === todayS;\r\n const isPast = dateStr < todayS;\r\n const isFullyBooked = fullyBookedDates.has(dateStr);\r\n const isDisabled = !inMonth || isPast;\r\n const isSelected = dateStr === selectedDate;\r\n\r\n let cn = \"resira-mini-cal-day\";\r\n if (!inMonth) cn += \" resira-mini-cal-day--outside\";\r\n if (isToday && inMonth) cn += \" resira-mini-cal-day--today\";\r\n if (isFullyBooked && inMonth && !isPast) cn += \" resira-mini-cal-day--booked\";\r\n if (isSelected) cn += \" resira-mini-cal-day--selected\";\r\n\r\n return (\r\n <button\r\n key={idx}\r\n type=\"button\"\r\n className={cn}\r\n disabled={isDisabled}\r\n onClick={() => onDateSelect(dateStr)}\r\n aria-label={dateStr}\r\n title={isFullyBooked && inMonth ? \"Fully booked\" : undefined}\r\n >\r\n {date.getDate()}\r\n {isFullyBooked && inMonth && !isPast && (\r\n <span className=\"resira-mini-cal-day-dot resira-mini-cal-day-dot--full\" />\r\n )}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Props\r\n// ─────────────────────────────────────────────────────────────\r\n\r\ninterface TimeSlotPickerProps {\r\n timeSlots: TimeSlotAvailability[];\r\n selectedDate: string;\r\n onDateChange: (date: string) => void;\r\n selectedSlot?: string;\r\n onSlotSelect: (start: string, end: string) => void;\r\n partySize: number;\r\n onPartySizeChange: (size: number) => void;\r\n showPartySize?: boolean;\r\n showDuration?: boolean;\r\n selectedDuration?: number;\r\n onDurationChange?: (minutes: number) => void;\r\n maxPartySizeOverride?: number;\r\n durationPricing?: DurationPrice[];\r\n currency?: string;\r\n /** Set of dates (YYYY-MM-DD) that are fully booked. */\r\n fullyBookedDates?: Set<string>;\r\n /** Whether to show remaining-capacity labels under available slots. */\r\n showRemainingSpots?: boolean;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Component\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nexport function TimeSlotPicker({\r\n timeSlots,\r\n selectedDate,\r\n onDateChange,\r\n selectedSlot,\r\n onSlotSelect,\r\n partySize,\r\n onPartySizeChange,\r\n showPartySize = true,\r\n showDuration = false,\r\n selectedDuration,\r\n onDurationChange,\r\n maxPartySizeOverride,\r\n durationPricing,\r\n currency,\r\n fullyBookedDates,\r\n showRemainingSpots = false,\r\n}: TimeSlotPickerProps) {\r\n const { locale, domainConfig, domain, classNames } = useResira();\r\n const minParty = domainConfig.minPartySize ?? 1;\r\n const maxParty = maxPartySizeOverride ?? domainConfig.maxPartySize ?? 12;\r\n\r\n const durations = useMemo(() => {\r\n if (durationPricing && durationPricing.length > 0) {\r\n return durationPricing.map((dp) => dp.durationMinutes);\r\n }\r\n return domainConfig.availableDurations ?? [60];\r\n }, [durationPricing, domainConfig.availableDurations]);\r\n\r\n const durationPriceMap = useMemo(() => {\r\n if (!durationPricing) return null;\r\n const m = new Map<number, number>();\r\n for (const dp of durationPricing) m.set(dp.durationMinutes, dp.priceCents);\r\n return m;\r\n }, [durationPricing]);\r\n\r\n const isSeatingDomain = domain === \"restaurant\";\r\n\r\n const handleDecrease = useCallback(() => {\r\n onPartySizeChange(Math.max(minParty, partySize - 1));\r\n }, [partySize, minParty, onPartySizeChange]);\r\n\r\n const handleIncrease = useCallback(() => {\r\n onPartySizeChange(Math.min(maxParty, partySize + 1));\r\n }, [partySize, maxParty, onPartySizeChange]);\r\n\r\n const filteredSlots = useMemo(\r\n () =>\r\n timeSlots.filter((s) => {\r\n if (!s.available) return true;\r\n return isSeatingDomain ? s.remaining >= partySize : true;\r\n }),\r\n [timeSlots, partySize, isSeatingDomain],\r\n );\r\n\r\n // Determine fully booked dates from props\r\n const bookedDates = fullyBookedDates ?? new Set<string>();\r\n\r\n return (\r\n <div className=\"resira-time-picker\">\r\n {/* ── Section 1: Duration (if applicable) ── */}\r\n {showDuration && durations.length > 1 && (\r\n <div className=\"resira-time-section\">\r\n <div className=\"resira-time-section-header\">\r\n <ClockIcon size={14} />\r\n <span>{locale.duration}</span>\r\n </div>\r\n <div className={`resira-duration-picker ${classNames.durationOption ?? \"\"}`}>\r\n {durations.map((dur: number) => {\r\n const price = durationPriceMap?.get(dur);\r\n return (\r\n <button\r\n key={dur}\r\n type=\"button\"\r\n className={`resira-duration-chip${selectedDuration === dur ? \" resira-duration-chip--selected\" : \"\"}`}\r\n onClick={() => onDurationChange?.(dur)}\r\n >\r\n <span className=\"resira-duration-chip-label\">{formatDurationLabel(dur)}</span>\r\n {price != null && (\r\n <span className=\"resira-duration-chip-price\">\r\n {formatPriceCents(price, currency)}\r\n </span>\r\n )}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* ── Section 2: Date (compact calendar) ── */}\r\n <div className=\"resira-time-section\">\r\n <div className=\"resira-time-section-header\">\r\n <span>Select a date</span>\r\n {selectedDate && (\r\n <span className=\"resira-time-section-badge\">\r\n {formatSelectedDate(selectedDate)}\r\n </span>\r\n )}\r\n </div>\r\n <CompactCalendar\r\n selectedDate={selectedDate}\r\n onDateSelect={onDateChange}\r\n fullyBookedDates={bookedDates}\r\n />\r\n </div>\r\n\r\n {/* ── Section 3: Party size ── */}\r\n {showPartySize && (\r\n <div className=\"resira-time-section\">\r\n <div className={`resira-party-row ${classNames.partySize ?? \"\"}`}>\r\n <span className=\"resira-party-row-label\">{locale.partySize}</span>\r\n <div className=\"resira-party-row-controls\">\r\n <button\r\n type=\"button\"\r\n className=\"resira-party-btn\"\r\n onClick={handleDecrease}\r\n disabled={partySize <= minParty}\r\n aria-label=\"Decrease party size\"\r\n >\r\n <MinusIcon size={12} />\r\n </button>\r\n <span className=\"resira-party-value\">{partySize}</span>\r\n <button\r\n type=\"button\"\r\n className=\"resira-party-btn\"\r\n onClick={handleIncrease}\r\n disabled={partySize >= maxParty}\r\n aria-label=\"Increase party size\"\r\n >\r\n <PlusIcon size={12} />\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* ── Section 4: Available time slots ── */}\r\n <div className=\"resira-time-section\">\r\n <div className=\"resira-time-section-header\">\r\n <span>Available times</span>\r\n {filteredSlots.length > 0 && (\r\n <span className=\"resira-time-section-count\">\r\n {filteredSlots.filter((s) => s.available).length} slots\r\n </span>\r\n )}\r\n </div>\r\n\r\n {filteredSlots.length > 0 ? (\r\n <div className=\"resira-slot-grid\">\r\n {filteredSlots.map((slot) => {\r\n const isSelected = selectedSlot === slot.start;\r\n const isUnavailable = isSeatingDomain\r\n ? !slot.available || slot.remaining < partySize\r\n : !slot.available;\r\n\r\n let cn = `resira-slot ${classNames.timeSlot ?? \"\"}`;\r\n if (isSelected) cn += ` resira-slot--selected ${classNames.timeSlotSelected ?? \"\"}`;\r\n if (isUnavailable) cn += \" resira-slot--unavailable\";\r\n\r\n return (\r\n <button\r\n key={slot.start}\r\n type=\"button\"\r\n className={cn}\r\n disabled={isUnavailable}\r\n onClick={() => onSlotSelect(slot.start, slot.end)}\r\n >\r\n <span className=\"resira-slot-time\">\r\n {formatSlotTime(slot.start)}\r\n </span>\r\n {!isUnavailable && isSeatingDomain && showRemainingSpots && (\r\n <span className=\"resira-slot-seats\">\r\n {slot.remaining} left\r\n </span>\r\n )}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n ) : (\r\n <div className=\"resira-empty resira-empty--compact\">\r\n <ClockIcon size={20} />\r\n <p>{locale.noAvailability}</p>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","// ═══════════════════════════════════════════════════════════════\r\n// @resira/ui — ResourcePicker\r\n// Card-based resource catalogue for watersport / multi-resource\r\n// orgs. Shows image, name, price, and duration per resource.\r\n// Supports multi-image with carousel navigation.\r\n// ═══════════════════════════════════════════════════════════════\r\n\r\nimport React, { useState, useCallback } from \"react\";\r\nimport type { PublicResource, ResourceImage } from \"../types.js\";\r\nimport { ClockIcon } from \"../icons.js\";\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Props\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nexport interface ResourcePickerProps {\r\n /** List of resources to display. */\r\n resources: PublicResource[];\r\n /** Currently selected resource ID(s). */\r\n selectedIds: string[];\r\n /** Callback when a resource is selected. */\r\n onSelect: (resourceId: string) => void;\r\n /** Whether the user can select multiple resources at once. */\r\n allowMultiSelect?: boolean;\r\n /** Whether the list is loading. */\r\n loading?: boolean;\r\n /** Error message if loading failed. */\r\n error?: string | null;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Helpers\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nfunction formatPrice(cents: number, currency: string): string {\r\n return new Intl.NumberFormat(\"default\", {\r\n style: \"currency\",\r\n currency,\r\n }).format(cents / 100);\r\n}\r\n\r\nfunction formatDuration(minutes: number): string {\r\n if (minutes < 60) return `${minutes} min`;\r\n const h = Math.floor(minutes / 60);\r\n const m = minutes % 60;\r\n if (m === 0) return `${h}h`;\r\n return `${h}h ${m}m`;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Placeholder image (SVG data URI)\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nconst PLACEHOLDER_IMG =\r\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='400' height='240' fill='%23e2e8f0'%3E%3Crect width='400' height='240' rx='8'/%3E%3Ctext x='50%25' y='50%25' dominant-baseline='middle' text-anchor='middle' font-family='system-ui' font-size='16' fill='%2394a3b8'%3ENo image%3C/text%3E%3C/svg%3E\";\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Image helpers\r\n// ─────────────────────────────────────────────────────────────\r\n\r\n/** Resolve all images for a resource, always returning at least an array with the primary image. */\r\nfunction resolveImages(resource: PublicResource): ResourceImage[] {\r\n if (resource.images && resource.images.length > 0) return resource.images;\r\n if (resource.imageUrl) return [{ url: resource.imageUrl }];\r\n return [];\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Chevron Icons (inline SVGs to avoid extra deps)\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nfunction ChevronLeftIcon() {\r\n return (\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M10 12L6 8L10 4\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction ChevronRightIcon() {\r\n return (\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M6 4L10 8L6 12\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n </svg>\r\n );\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// ResourceImageCarousel — shows cover image with prev/next\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nfunction ResourceImageCarousel({\r\n images,\r\n alt,\r\n}: {\r\n images: ResourceImage[];\r\n alt: string;\r\n}) {\r\n const [idx, setIdx] = useState(0);\r\n const hasMultiple = images.length > 1;\r\n const current = images[idx] ?? images[0];\r\n\r\n const goPrev = useCallback(\r\n (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n setIdx((i) => (i - 1 + images.length) % images.length);\r\n },\r\n [images.length],\r\n );\r\n\r\n const goNext = useCallback(\r\n (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n setIdx((i) => (i + 1) % images.length);\r\n },\r\n [images.length],\r\n );\r\n\r\n if (!current) {\r\n return (\r\n <img\r\n src={PLACEHOLDER_IMG}\r\n alt={alt}\r\n loading=\"lazy\"\r\n />\r\n );\r\n }\r\n\r\n const ds = current.displaySettings;\r\n\r\n return (\r\n <div className=\"resira-resource-carousel\">\r\n <img\r\n src={current.url}\r\n alt={alt}\r\n loading=\"lazy\"\r\n style={{\r\n objectFit: ds?.objectFit ?? \"cover\",\r\n objectPosition: ds?.objectPosition ?? \"center center\",\r\n transform: ds?.zoom && ds.zoom !== 1 ? `scale(${ds.zoom})` : undefined,\r\n }}\r\n />\r\n\r\n {hasMultiple && (\r\n <>\r\n <button\r\n type=\"button\"\r\n className=\"resira-resource-carousel-btn resira-resource-carousel-prev\"\r\n onClick={goPrev}\r\n aria-label=\"Previous image\"\r\n >\r\n <ChevronLeftIcon />\r\n </button>\r\n <button\r\n type=\"button\"\r\n className=\"resira-resource-carousel-btn resira-resource-carousel-next\"\r\n onClick={goNext}\r\n aria-label=\"Next image\"\r\n >\r\n <ChevronRightIcon />\r\n </button>\r\n\r\n {/* Dot indicators */}\r\n <div className=\"resira-resource-carousel-dots\">\r\n {images.map((_, i) => (\r\n <span\r\n key={i}\r\n className={`resira-resource-carousel-dot${i === idx ? \" resira-resource-carousel-dot--active\" : \"\"}`}\r\n />\r\n ))}\r\n </div>\r\n\r\n {/* Counter badge */}\r\n <span className=\"resira-resource-carousel-count\">\r\n {idx + 1}/{images.length}\r\n </span>\r\n </>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Component\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nexport function ResourcePicker({\r\n resources,\r\n selectedIds,\r\n onSelect,\r\n allowMultiSelect = false,\r\n loading = false,\r\n error = null,\r\n}: ResourcePickerProps) {\r\n if (loading) {\r\n return (\r\n <div className=\"resira-loading\" role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\r\n <div className=\"resira-spinner\" aria-hidden=\"true\" />\r\n <span className=\"resira-loading-text\">Loading resources…</span>\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div className=\"resira-error\" role=\"alert\" aria-live=\"assertive\">\r\n <p className=\"resira-error-message\">{error}</p>\r\n </div>\r\n );\r\n }\r\n\r\n if (resources.length === 0) {\r\n return (\r\n <div className=\"resira-empty\">\r\n <p>No resources available at the moment.</p>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"resira-resource-picker\">\r\n {allowMultiSelect && (\r\n <p className=\"resira-resource-picker-hint\">\r\n Select one or more options to continue.\r\n </p>\r\n )}\r\n\r\n <div className=\"resira-resource-grid\">\r\n {resources.map((resource) => {\r\n const isSelected = selectedIds.includes(resource.id);\r\n const price = resource.pricePerSession;\r\n const currency = resource.currency ?? \"EUR\";\r\n const duration = resource.durationMinutes;\r\n\r\n return (\r\n <button\r\n key={resource.id}\r\n type=\"button\"\r\n className={`resira-resource-card${isSelected ? \" resira-resource-card--selected\" : \"\"}`}\r\n onClick={() => onSelect(resource.id)}\r\n aria-pressed={isSelected}\r\n >\r\n {/* Image */}\r\n <div className=\"resira-resource-card-image\">\r\n {(() => {\r\n const images = resolveImages(resource);\r\n return images.length > 0 ? (\r\n <ResourceImageCarousel images={images} alt={resource.name} />\r\n ) : (\r\n <img\r\n src={PLACEHOLDER_IMG}\r\n alt={resource.name}\r\n loading=\"lazy\"\r\n />\r\n );\r\n })()}\r\n </div>\r\n\r\n {/* Content */}\r\n <div className=\"resira-resource-card-content\">\r\n <h3 className=\"resira-resource-card-name\">\r\n {resource.name}\r\n </h3>\r\n\r\n {resource.description && (\r\n <p className=\"resira-resource-card-description\">\r\n {resource.description}\r\n </p>\r\n )}\r\n\r\n <div className=\"resira-resource-card-meta\">\r\n {/* Price */}\r\n {price != null && (\r\n <span className=\"resira-resource-card-price\">\r\n {formatPrice(price, currency)}\r\n <span className=\"resira-resource-card-price-label\">\r\n / session\r\n </span>\r\n </span>\r\n )}\r\n\r\n {/* Duration */}\r\n {duration != null && (\r\n <span className=\"resira-resource-card-duration\">\r\n <ClockIcon size={14} />\r\n {formatDuration(duration)}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Selection indicator */}\r\n {isSelected && (\r\n <div className=\"resira-resource-card-check\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M13.3 4.3L6 11.6L2.7 8.3\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n )}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","// ═══════════════════════════════════════════════════════════════\r\n// @resira/ui — ProductSelector\r\n// Category-first service picker for the booking flow.\r\n// 1. Shows category tiles (with image from linked resource)\r\n// 2. Drill-in shows services as image-background overlay cards\r\n// Supports vertical (default) and horizontal layouts.\r\n// ═══════════════════════════════════════════════════════════════\r\n\r\nimport React, { useMemo, useRef, useState, useEffect } from \"react\";\r\nimport type { Product, PublicResource } from \"@resira/sdk\";\r\nimport { useResira } from \"../ResiraProvider.js\";\r\nimport { ClockIcon, UsersIcon } from \"../icons.js\";\r\nimport type { ServiceLayout } from \"../types.js\";\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Helpers\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nfunction formatPrice(cents: number, currency: string): string {\r\n return new Intl.NumberFormat(\"default\", {\r\n style: \"currency\",\r\n currency,\r\n }).format(cents / 100);\r\n}\r\n\r\nfunction formatDuration(minutes: number): string {\r\n if (minutes < 60) return `${minutes} min`;\r\n const h = Math.floor(minutes / 60);\r\n const m = minutes % 60;\r\n if (m === 0) return `${h}h`;\r\n return `${h}h ${m}m`;\r\n}\r\n\r\nconst PLACEHOLDER_IMG =\r\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='400' height='240' fill='%23e2e8f0'%3E%3Crect width='400' height='240' rx='8'/%3E%3Ctext x='50%25' y='50%25' dominant-baseline='middle' text-anchor='middle' font-family='system-ui' font-size='16' fill='%2394a3b8'%3ENo image%3C/text%3E%3C/svg%3E\";\r\n\r\nconst UNCATEGORIZED_CATEGORY_KEY = \"uncategorized\";\r\nconst UNCATEGORIZED_CATEGORY_LABEL = \"Other services\";\r\n\r\ninterface ProductCategoryGroup {\r\n id: string;\r\n label: string;\r\n imageUrl?: string;\r\n products: Product[];\r\n}\r\n\r\nfunction formatCategoryLabel(resourceType: string): string {\r\n return resourceType\r\n .trim()\r\n .split(/[_\\-\\s]+/)\r\n .filter(Boolean)\r\n .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1).toLowerCase())\r\n .join(\" \");\r\n}\r\n\r\nfunction groupProductsByCategory(\r\n products: Product[],\r\n resources: PublicResource[],\r\n): ProductCategoryGroup[] {\r\n const resourceById = new Map(\r\n resources.map((resource) => [resource.id, resource]),\r\n );\r\n const groups = new Map<string, ProductCategoryGroup>();\r\n\r\n products.forEach((product) => {\r\n // Prefer product-level category fields (new API) over resource-based grouping (legacy)\r\n const productCategory = product.category?.trim();\r\n\r\n let groupId: string;\r\n let label: string;\r\n let catImage: string | undefined;\r\n\r\n if (productCategory) {\r\n // New category fields from product.availabilityConfig\r\n groupId = productCategory.toLowerCase();\r\n label = product.categoryName?.trim()\r\n ? product.categoryName.trim()\r\n : formatCategoryLabel(productCategory);\r\n // Use categoryImage from the product's category metadata\r\n catImage = product.categoryImage ?? undefined;\r\n } else {\r\n // Legacy fallback: group by linked resource's resourceType\r\n let categoryResource: PublicResource | undefined;\r\n const categoryType = product.equipmentIds\r\n .map((equipmentId) => {\r\n const res = resourceById.get(equipmentId);\r\n if (res?.resourceType?.trim() && !categoryResource) {\r\n categoryResource = res;\r\n }\r\n return res?.resourceType?.trim();\r\n })\r\n .find((resourceType): resourceType is string => Boolean(resourceType));\r\n\r\n groupId = categoryType?.toLowerCase() ?? UNCATEGORIZED_CATEGORY_KEY;\r\n label = categoryType\r\n ? formatCategoryLabel(categoryType)\r\n : UNCATEGORIZED_CATEGORY_LABEL;\r\n catImage = categoryResource?.images?.[0]?.url ?? categoryResource?.imageUrl ?? undefined;\r\n }\r\n\r\n if (!groups.has(groupId)) {\r\n groups.set(groupId, {\r\n id: groupId,\r\n label,\r\n imageUrl: catImage,\r\n products: [],\r\n });\r\n }\r\n\r\n const group = groups.get(groupId)!;\r\n group.products.push(product);\r\n // Fill image from categoryImage, then first product image (if allowed in header), then resource image\r\n if (!group.imageUrl) {\r\n if (catImage) {\r\n group.imageUrl = catImage;\r\n } else {\r\n const coverImage = product.images?.[0];\r\n const firstImage = (coverImage?.showInCategoryHeader !== false ? coverImage?.url : undefined) ?? product.imageUrl;\r\n if (firstImage) {\r\n group.imageUrl = firstImage;\r\n }\r\n }\r\n }\r\n });\r\n\r\n return Array.from(groups.values());\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Props\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nexport interface ProductSelectorProps {\r\n products: Product[];\r\n resources?: PublicResource[];\r\n selectedId?: string;\r\n onSelect: (product: Product) => void;\r\n loading?: boolean;\r\n error?: string | null;\r\n layout?: ServiceLayout;\r\n visibleCount?: number;\r\n groupByCategory?: boolean;\r\n /** Pre-select a specific category to show (skip category tiles). */\r\n initialCategory?: string;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Inline icons\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nfunction BackArrow() {\r\n return (\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <path d=\"M19 12H5\" />\r\n <path d=\"M12 19l-7-7 7-7\" />\r\n </svg>\r\n );\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Category tile\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nfunction CategoryTile({\r\n group,\r\n onClick,\r\n}: {\r\n group: ProductCategoryGroup;\r\n onClick: () => void;\r\n}) {\r\n return (\r\n <button\r\n type=\"button\"\r\n className=\"resira-category-tile\"\r\n onClick={onClick}\r\n >\r\n <div className=\"resira-category-tile-image\">\r\n <img\r\n src={group.imageUrl || PLACEHOLDER_IMG}\r\n alt={group.label}\r\n loading=\"lazy\"\r\n />\r\n <div className=\"resira-category-tile-overlay\" />\r\n </div>\r\n <div className=\"resira-category-tile-content\">\r\n <h3 className=\"resira-category-tile-name\">{group.label}</h3>\r\n <span className=\"resira-category-tile-count\">\r\n {group.products.length} {group.products.length === 1 ? \"service\" : \"services\"}\r\n </span>\r\n </div>\r\n </button>\r\n );\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Service overlay card (image bg + text overlay)\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nfunction ServiceOverlayCard({\r\n product,\r\n isSelected,\r\n locale,\r\n cardClassName,\r\n}: {\r\n product: Product;\r\n isSelected: boolean;\r\n locale: Record<string, string>;\r\n cardClassName?: string;\r\n}) {\r\n const currency = product.currency ?? \"EUR\";\r\n const priceLabel =\r\n product.pricingModel === \"per_rider\"\r\n ? \"per rider\"\r\n : product.pricingModel === \"per_person\"\r\n ? locale.perPerson\r\n : locale.perSession;\r\n\r\n // Show \"from €X\" when multiple duration/price options exist\r\n const hasMultipleOptions = (product.durationPricing?.length ?? 0) > 1\r\n || (product.riderTierPricing?.length ?? 0) > 1;\r\n const lowestPrice = hasMultipleOptions && product.durationPricing?.length\r\n ? Math.min(...product.durationPricing.map((dp) => dp.priceCents))\r\n : product.priceCents;\r\n const pricePrefix = hasMultipleOptions ? \"from \" : \"\";\r\n const optionCount = product.durationPricing?.length ?? (product.riderTierPricing?.length ?? 0);\r\n\r\n let className = \"resira-service-overlay-card\";\r\n if (isSelected) className += \" resira-service-overlay-card--selected\";\r\n if (cardClassName) className += ` ${cardClassName}`;\r\n\r\n return (\r\n <div className={className}>\r\n <div className=\"resira-service-overlay-card-bg\">\r\n <img\r\n src={product.imageUrl ?? PLACEHOLDER_IMG}\r\n alt={product.name}\r\n loading=\"lazy\"\r\n />\r\n </div>\r\n <div className=\"resira-service-overlay-card-gradient\" />\r\n <div className=\"resira-service-overlay-card-content\">\r\n <div className=\"resira-service-overlay-card-top\">\r\n <h3 className=\"resira-service-overlay-card-name\">{product.name}</h3>\r\n {product.description && (\r\n <p className=\"resira-service-overlay-card-desc\">{product.description}</p>\r\n )}\r\n </div>\r\n <div className=\"resira-service-overlay-card-bottom\">\r\n <span className=\"resira-service-overlay-card-price\">\r\n {pricePrefix}{formatPrice(lowestPrice, currency)}\r\n <span className=\"resira-service-overlay-card-price-unit\">/{priceLabel}</span>\r\n </span>\r\n <div className=\"resira-service-overlay-card-pills\">\r\n {hasMultipleOptions && optionCount > 1 ? (\r\n <span className=\"resira-service-overlay-card-pill\">\r\n <ClockIcon size={11} />\r\n {optionCount} options\r\n </span>\r\n ) : product.durationMinutes > 0 ? (\r\n <span className=\"resira-service-overlay-card-pill\">\r\n <ClockIcon size={11} />\r\n {formatDuration(product.durationMinutes)}\r\n </span>\r\n ) : null}\r\n {product.maxPartySize && (\r\n <span className=\"resira-service-overlay-card-pill\">\r\n <UsersIcon size={11} />\r\n max {product.maxPartySize}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n {isSelected && (\r\n <div className=\"resira-service-card-check\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M13.3 4.3L6 11.6L2.7 8.3\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Legacy flat card (kept for renderServiceCard compatibility)\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nfunction DefaultServiceCard({\r\n product,\r\n isSelected,\r\n layout,\r\n locale,\r\n cardClassName,\r\n}: {\r\n product: Product;\r\n isSelected: boolean;\r\n layout: ServiceLayout;\r\n locale: Record<string, string>;\r\n cardClassName?: string;\r\n}) {\r\n const currency = product.currency ?? \"EUR\";\r\n const priceLabel =\r\n product.pricingModel === \"per_rider\"\r\n ? \"per rider\"\r\n : product.pricingModel === \"per_person\"\r\n ? locale.perPerson\r\n : locale.perSession;\r\n\r\n // Show \"from €X\" when multiple duration/price options exist\r\n const hasMultipleOptions = (product.durationPricing?.length ?? 0) > 1\r\n || (product.riderTierPricing?.length ?? 0) > 1;\r\n const lowestPrice = hasMultipleOptions && product.durationPricing?.length\r\n ? Math.min(...product.durationPricing.map((dp) => dp.priceCents))\r\n : product.priceCents;\r\n const pricePrefix = hasMultipleOptions ? \"from \" : \"\";\r\n const optionCount = product.durationPricing?.length ?? (product.riderTierPricing?.length ?? 0);\r\n\r\n let className = `resira-service-card resira-service-card--${layout}`;\r\n if (isSelected) className += \" resira-service-card--selected\";\r\n if (cardClassName) className += ` ${cardClassName}`;\r\n\r\n return (\r\n <div className={className}>\r\n <div className=\"resira-service-card-image\">\r\n <img\r\n src={product.imageUrl ?? PLACEHOLDER_IMG}\r\n alt={product.name}\r\n loading=\"lazy\"\r\n />\r\n </div>\r\n <div className=\"resira-service-card-body\">\r\n <div className=\"resira-service-card-top\">\r\n <h3 className=\"resira-service-card-name\">{product.name}</h3>\r\n {product.description && (\r\n <p className=\"resira-service-card-desc\">{product.description}</p>\r\n )}\r\n </div>\r\n <div className=\"resira-service-card-bottom\">\r\n <span className=\"resira-service-card-price\">\r\n {pricePrefix}{formatPrice(lowestPrice, currency)}\r\n <span className=\"resira-service-card-price-unit\">/{priceLabel}</span>\r\n </span>\r\n <div className=\"resira-service-card-pills\">\r\n {hasMultipleOptions && optionCount > 1 ? (\r\n <span className=\"resira-service-card-pill\">\r\n <ClockIcon size={12} />\r\n {optionCount} options\r\n </span>\r\n ) : product.durationMinutes > 0 ? (\r\n <span className=\"resira-service-card-pill\">\r\n <ClockIcon size={12} />\r\n {formatDuration(product.durationMinutes)}\r\n </span>\r\n ) : null}\r\n {product.pricingModel === \"per_person\" && (\r\n <span className=\"resira-service-card-pill\">\r\n <UsersIcon size={12} />\r\n {product.maxPartySize ? `1–${product.maxPartySize}` : locale.perPerson}\r\n </span>\r\n )}\r\n {product.maxPartySize && product.pricingModel !== \"per_person\" && (\r\n <span className=\"resira-service-card-pill\">\r\n <UsersIcon size={12} />\r\n max {product.maxPartySize}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n {isSelected && (\r\n <div className=\"resira-service-card-check\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M13.3 4.3L6 11.6L2.7 8.3\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Component\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nexport function ProductSelector({\r\n products,\r\n resources = [],\r\n selectedId,\r\n onSelect,\r\n loading = false,\r\n error = null,\r\n layout: layoutProp,\r\n visibleCount: visibleCountProp,\r\n groupByCategory: groupByCategoryProp,\r\n initialCategory,\r\n}: ProductSelectorProps) {\r\n const {\r\n locale,\r\n serviceLayout: providerLayout,\r\n visibleServiceCount: providerCount,\r\n groupServicesByCategory: providerGroupByCategory,\r\n renderServiceCard,\r\n classNames,\r\n } = useResira();\r\n\r\n const layout = layoutProp ?? providerLayout;\r\n const visibleCount = visibleCountProp ?? providerCount;\r\n const groupByCategory = groupByCategoryProp ?? providerGroupByCategory;\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n const [activeCategory, setActiveCategory] = useState<string | null>(initialCategory ?? null);\r\n\r\n const productGroups = useMemo(\r\n () => (groupByCategory ? groupProductsByCategory(products, resources) : [{ id: \"all\", label: \"\", imageUrl: undefined, products }]),\r\n [groupByCategory, products, resources],\r\n );\r\n\r\n const skipCategoryView = productGroups.length <= 1;\r\n\r\n useEffect(() => {\r\n if (initialCategory && productGroups.some((g) => g.id === initialCategory)) {\r\n setActiveCategory(initialCategory);\r\n }\r\n }, [initialCategory, productGroups]);\r\n\r\n useEffect(() => {\r\n if (activeCategory && !productGroups.some((g) => g.id === activeCategory)) {\r\n setActiveCategory(null);\r\n }\r\n }, [activeCategory, productGroups]);\r\n\r\n const activeCategoryGroup = useMemo(\r\n () => productGroups.find((g) => g.id === activeCategory) ?? null,\r\n [productGroups, activeCategory],\r\n );\r\n\r\n const displayProducts = useMemo(() => {\r\n if (skipCategoryView) return products;\r\n return activeCategoryGroup?.products ?? [];\r\n }, [skipCategoryView, products, activeCategoryGroup]);\r\n\r\n const containerStyle = useMemo(() => {\r\n if (layout === \"horizontal\") return {};\r\n const cardHeight = 180;\r\n const gap = 12;\r\n const maxHeight = visibleCount * cardHeight + (visibleCount - 1) * gap;\r\n return { maxHeight, overflowY: \"auto\" as const };\r\n }, [layout, visibleCount]);\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"resira-loading\" role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\r\n <div className=\"resira-spinner\" aria-hidden=\"true\" />\r\n <span className=\"resira-loading-text\">{locale.loading}</span>\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div className=\"resira-error\" role=\"alert\" aria-live=\"assertive\">\r\n <p className=\"resira-error-message\">{error}</p>\r\n </div>\r\n );\r\n }\r\n\r\n if (products.length === 0) {\r\n return (\r\n <div className=\"resira-empty\">\r\n <p>No services available at the moment.</p>\r\n </div>\r\n );\r\n }\r\n\r\n // Category tile view\r\n if (groupByCategory && !skipCategoryView && !activeCategory) {\r\n return (\r\n <div className=\"resira-service-picker\">\r\n <div className=\"resira-category-grid\">\r\n {productGroups.map((group) => (\r\n <CategoryTile\r\n key={group.id}\r\n group={group}\r\n onClick={() => setActiveCategory(group.id)}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n // Service cards within a category\r\n const listClassName = [\r\n \"resira-service-overlay-list\",\r\n classNames.serviceList,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return (\r\n <div className=\"resira-service-picker\">\r\n {groupByCategory && !skipCategoryView && activeCategory && (\r\n <button\r\n type=\"button\"\r\n className=\"resira-category-back\"\r\n onClick={() => setActiveCategory(null)}\r\n >\r\n <BackArrow />\r\n <span>{activeCategoryGroup?.label ?? \"All categories\"}</span>\r\n </button>\r\n )}\r\n\r\n <div\r\n ref={containerRef}\r\n className={listClassName}\r\n style={containerStyle}\r\n >\r\n {displayProducts.map((product) => {\r\n const isSelected = selectedId === product.id;\r\n return (\r\n <button\r\n key={product.id}\r\n type=\"button\"\r\n className=\"resira-service-card-btn\"\r\n onClick={() => onSelect(product)}\r\n aria-pressed={isSelected}\r\n >\r\n {renderServiceCard ? (\r\n renderServiceCard(product, isSelected)\r\n ) : (\r\n <ServiceOverlayCard\r\n product={product}\r\n isSelected={isSelected}\r\n locale={locale as unknown as Record<string, string>}\r\n cardClassName={\r\n isSelected\r\n ? classNames.serviceCardSelected\r\n : classNames.serviceCard\r\n }\r\n />\r\n )}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n\r\n {displayProducts.length > visibleCount && (\r\n <div className=\"resira-service-scroll-hint\">\r\n <span>Scroll for more</span>\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\">\r\n <path d=\"M4 6l4 4 4-4\" />\r\n </svg>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","// ═══════════════════════════════════════════════════════════════\r\n// @resira/ui — GuestForm (v2)\r\n// Compact 2-column layout with inline validation.\r\n// Restaurant mode: name + phone primary, email optional (at least one contact required).\r\n// ═══════════════════════════════════════════════════════════════\r\n\r\nimport React, { useCallback } from \"react\";\r\nimport { useResira } from \"../ResiraProvider.js\";\r\nimport { UserIcon, MailIcon, PhoneIcon, NoteIcon } from \"../icons.js\";\r\nimport type { GuestFormValues, GuestFormErrors } from \"../types.js\";\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Validation\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nconst EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n\r\n/**\r\n * Validate the guest form. Returns an errors object (empty = valid).\r\n *\r\n * When `contactMode` is `\"either\"` (restaurant), at least one of\r\n * phone or email must be provided but neither is individually required.\r\n */\r\nexport function validateGuestForm(\r\n values: GuestFormValues,\r\n labels: { required: string; invalidEmail: string; contactRequired?: string },\r\n contactMode: \"email-required\" | \"either\" = \"email-required\",\r\n): GuestFormErrors {\r\n const errors: GuestFormErrors = {};\r\n if (!values.guestName.trim()) errors.guestName = labels.required;\r\n\r\n if (contactMode === \"either\") {\r\n const hasPhone = values.guestPhone.trim().length > 0;\r\n const hasEmail = values.guestEmail.trim().length > 0;\r\n if (!hasPhone && !hasEmail) {\r\n const msg = labels.contactRequired ?? \"Phone or email required\";\r\n errors.guestPhone = msg;\r\n errors.guestEmail = msg;\r\n } else if (hasEmail && !EMAIL_RE.test(values.guestEmail.trim())) {\r\n errors.guestEmail = labels.invalidEmail;\r\n }\r\n } else {\r\n if (!values.guestEmail.trim()) {\r\n errors.guestEmail = labels.required;\r\n } else if (!EMAIL_RE.test(values.guestEmail.trim())) {\r\n errors.guestEmail = labels.invalidEmail;\r\n }\r\n }\r\n\r\n return errors;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Props\r\n// ─────────────────────────────────────────────────────────────\r\n\r\ninterface GuestFormProps {\r\n values: GuestFormValues;\r\n onChange: (values: GuestFormValues) => void;\r\n errors?: GuestFormErrors;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Component\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nexport function GuestForm({ values, onChange, errors = {} }: GuestFormProps) {\r\n const { locale, domain } = useResira();\r\n const isRestaurant = domain === \"restaurant\";\r\n\r\n const update = useCallback(\r\n (field: keyof GuestFormValues, value: string) => {\r\n onChange({ ...values, [field]: value });\r\n },\r\n [values, onChange],\r\n );\r\n\r\n if (isRestaurant) {\r\n return (\r\n <div className=\"resira-form resira-form--compact\">\r\n {/* Name — full width for restaurant */}\r\n <div className=\"resira-field\">\r\n <label className=\"resira-field-label\">\r\n {locale.fullName}\r\n <span>*</span>\r\n </label>\r\n <div className=\"resira-field-input-wrap\">\r\n <UserIcon size={15} className=\"resira-field-input-icon\" />\r\n <input\r\n type=\"text\"\r\n className={`resira-field-input resira-field-input--sm${errors.guestName ? \" resira-field-input--error\" : \"\"}`}\r\n value={values.guestName}\r\n onChange={(e) => update(\"guestName\", e.target.value)}\r\n placeholder={locale.fullName}\r\n autoComplete=\"name\"\r\n />\r\n </div>\r\n {errors.guestName && (\r\n <span className=\"resira-field-error\">{errors.guestName}</span>\r\n )}\r\n </div>\r\n\r\n {/* Phone + Email — side by side, at least one required */}\r\n <div className=\"resira-form-row\">\r\n <div className=\"resira-field resira-field--half\">\r\n <label className=\"resira-field-label\">\r\n {locale.phone}\r\n <span className=\"resira-field-label-hint\">*</span>\r\n </label>\r\n <div className=\"resira-field-input-wrap\">\r\n <PhoneIcon size={15} className=\"resira-field-input-icon\" />\r\n <input\r\n type=\"tel\"\r\n className={`resira-field-input resira-field-input--sm${errors.guestPhone ? \" resira-field-input--error\" : \"\"}`}\r\n value={values.guestPhone}\r\n onChange={(e) => update(\"guestPhone\", e.target.value)}\r\n placeholder={locale.phone}\r\n autoComplete=\"tel\"\r\n />\r\n </div>\r\n {errors.guestPhone && (\r\n <span className=\"resira-field-error\">{errors.guestPhone}</span>\r\n )}\r\n </div>\r\n\r\n <div className=\"resira-field resira-field--half\">\r\n <label className=\"resira-field-label\">\r\n {locale.email}\r\n <span className=\"resira-field-label-hint\">*</span>\r\n </label>\r\n <div className=\"resira-field-input-wrap\">\r\n <MailIcon size={15} className=\"resira-field-input-icon\" />\r\n <input\r\n type=\"email\"\r\n className={`resira-field-input resira-field-input--sm${errors.guestEmail ? \" resira-field-input--error\" : \"\"}`}\r\n value={values.guestEmail}\r\n onChange={(e) => update(\"guestEmail\", e.target.value)}\r\n placeholder={locale.email}\r\n autoComplete=\"email\"\r\n />\r\n </div>\r\n {errors.guestEmail && (\r\n <span className=\"resira-field-error\">{errors.guestEmail}</span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Hint text */}\r\n <p className=\"resira-field-hint\">{locale.contactHint ?? \"Please provide at least a phone number or email\"}</p>\r\n\r\n {/* Notes */}\r\n <div className=\"resira-field\">\r\n <label className=\"resira-field-label\">{locale.notes}</label>\r\n <div className=\"resira-field-input-wrap resira-field-input-wrap--textarea\">\r\n <NoteIcon size={15} className=\"resira-field-input-icon\" />\r\n <textarea\r\n className=\"resira-field-input resira-field-input--sm\"\r\n value={values.notes}\r\n onChange={(e) => update(\"notes\", e.target.value)}\r\n placeholder={locale.restaurantNotesPlaceholder ?? \"Allergies, special requests...\"}\r\n rows={2}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"resira-form resira-form--compact\">\r\n {/* Name + Email — side by side */}\r\n <div className=\"resira-form-row\">\r\n <div className=\"resira-field resira-field--half\">\r\n <label className=\"resira-field-label\">\r\n {locale.fullName}\r\n <span>*</span>\r\n </label>\r\n <div className=\"resira-field-input-wrap\">\r\n <UserIcon size={15} className=\"resira-field-input-icon\" />\r\n <input\r\n type=\"text\"\r\n className={`resira-field-input resira-field-input--sm${errors.guestName ? \" resira-field-input--error\" : \"\"}`}\r\n value={values.guestName}\r\n onChange={(e) => update(\"guestName\", e.target.value)}\r\n placeholder={locale.fullName}\r\n autoComplete=\"name\"\r\n />\r\n </div>\r\n {errors.guestName && (\r\n <span className=\"resira-field-error\">{errors.guestName}</span>\r\n )}\r\n </div>\r\n\r\n <div className=\"resira-field resira-field--half\">\r\n <label className=\"resira-field-label\">\r\n {locale.email}\r\n <span>*</span>\r\n </label>\r\n <div className=\"resira-field-input-wrap\">\r\n <MailIcon size={15} className=\"resira-field-input-icon\" />\r\n <input\r\n type=\"email\"\r\n className={`resira-field-input resira-field-input--sm${errors.guestEmail ? \" resira-field-input--error\" : \"\"}`}\r\n value={values.guestEmail}\r\n onChange={(e) => update(\"guestEmail\", e.target.value)}\r\n placeholder={locale.email}\r\n autoComplete=\"email\"\r\n />\r\n </div>\r\n {errors.guestEmail && (\r\n <span className=\"resira-field-error\">{errors.guestEmail}</span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Phone */}\r\n <div className=\"resira-field\">\r\n <label className=\"resira-field-label\">{locale.phone}</label>\r\n <div className=\"resira-field-input-wrap\">\r\n <PhoneIcon size={15} className=\"resira-field-input-icon\" />\r\n <input\r\n type=\"tel\"\r\n className=\"resira-field-input resira-field-input--sm\"\r\n value={values.guestPhone}\r\n onChange={(e) => update(\"guestPhone\", e.target.value)}\r\n placeholder={locale.phone}\r\n autoComplete=\"tel\"\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Notes */}\r\n <div className=\"resira-field\">\r\n <label className=\"resira-field-label\">{locale.notes}</label>\r\n <div className=\"resira-field-input-wrap resira-field-input-wrap--textarea\">\r\n <NoteIcon size={15} className=\"resira-field-input-icon\" />\r\n <textarea\r\n className=\"resira-field-input resira-field-input--sm\"\r\n value={values.notes}\r\n onChange={(e) => update(\"notes\", e.target.value)}\r\n placeholder={locale.notes}\r\n rows={2}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","// ═══════════════════════════════════════════════════════════════\r\n// @resira/ui — WaiverConsent (v2)\r\n// Compact terms, waiver, refund policy, and promo code.\r\n// ═══════════════════════════════════════════════════════════════\r\n\r\nimport React, { useState, useCallback } from \"react\";\r\nimport { useResira } from \"../ResiraProvider.js\";\r\nimport { CheckCircleIcon, AlertCircleIcon, TagIcon } from \"../icons.js\";\r\nimport type { ValidatePromoCodeResponse } from \"@resira/sdk\";\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Props\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nexport interface WaiverConsentProps {\r\n termsAccepted: boolean;\r\n onTermsChange: (accepted: boolean) => void;\r\n waiverAccepted: boolean;\r\n onWaiverChange: (accepted: boolean) => void;\r\n discountCode: string;\r\n onDiscountCodeChange: (code: string) => void;\r\n onPromoValidated?: (result: ValidatePromoCodeResponse) => void;\r\n error?: string;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Component\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nexport function WaiverConsent({\r\n termsAccepted,\r\n onTermsChange,\r\n waiverAccepted,\r\n onWaiverChange,\r\n discountCode,\r\n onDiscountCodeChange,\r\n onPromoValidated,\r\n error,\r\n}: WaiverConsentProps) {\r\n const { client, locale, showTerms, showWaiver, termsText, waiverText, refundPolicy } = useResira();\r\n\r\n const [promoValidating, setPromoValidating] = useState(false);\r\n const [promoResult, setPromoResult] = useState<ValidatePromoCodeResponse | null>(null);\r\n\r\n const handleApplyPromo = useCallback(async () => {\r\n const code = discountCode.trim();\r\n if (!code) return;\r\n\r\n setPromoValidating(true);\r\n setPromoResult(null);\r\n\r\n try {\r\n const result = await client.validatePromoCode(code);\r\n setPromoResult(result);\r\n if (result.valid) {\r\n onPromoValidated?.(result);\r\n }\r\n } catch {\r\n setPromoResult({ valid: false, error: locale.discountInvalid });\r\n } finally {\r\n setPromoValidating(false);\r\n }\r\n }, [client, discountCode, locale.discountInvalid, onPromoValidated]);\r\n\r\n const handleCodeChange = useCallback(\r\n (code: string) => {\r\n onDiscountCodeChange(code);\r\n if (promoResult) setPromoResult(null);\r\n },\r\n [onDiscountCodeChange, promoResult],\r\n );\r\n\r\n return (\r\n <div className=\"resira-waiver resira-waiver--compact\">\r\n {/* Terms + Waiver checkboxes */}\r\n {(showTerms || showWaiver) && (\r\n <div className=\"resira-waiver-checks\">\r\n {showTerms && (\r\n <label className=\"resira-waiver-row resira-waiver-row--compact\">\r\n <input\r\n type=\"checkbox\"\r\n className=\"resira-waiver-checkbox\"\r\n checked={termsAccepted}\r\n onChange={(e) => onTermsChange(e.target.checked)}\r\n />\r\n <span className=\"resira-waiver-label\">\r\n {termsText || locale.termsAccept}\r\n </span>\r\n </label>\r\n )}\r\n\r\n {showWaiver && (\r\n <label className=\"resira-waiver-row resira-waiver-row--compact\">\r\n <input\r\n type=\"checkbox\"\r\n className=\"resira-waiver-checkbox\"\r\n checked={waiverAccepted}\r\n onChange={(e) => onWaiverChange(e.target.checked)}\r\n />\r\n <span className=\"resira-waiver-label\">\r\n {waiverText || locale.waiverAccept}\r\n </span>\r\n </label>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Refund policy — compact inline */}\r\n {refundPolicy.length > 0 && (\r\n <div className=\"resira-waiver-refund\">\r\n <span className=\"resira-waiver-refund-title\">{locale.refundPolicyTitle}</span>\r\n <div className=\"resira-waiver-refund-chips\">\r\n {refundPolicy\r\n .slice()\r\n .sort((a, b) => b.hoursBeforeStart - a.hoursBeforeStart)\r\n .map((rule, i) => (\r\n <span key={i} className=\"resira-waiver-refund-chip\">\r\n <strong>\r\n {rule.refundPercent === 100\r\n ? \"100%\"\r\n : rule.refundPercent === 0\r\n ? \"0%\"\r\n : `${rule.refundPercent}%`}\r\n </strong>\r\n {\" \"}\r\n {rule.hoursBeforeStart >= 24\r\n ? `${Math.floor(rule.hoursBeforeStart / 24)}d+`\r\n : rule.hoursBeforeStart > 0\r\n ? `${rule.hoursBeforeStart}h+`\r\n : \"< above\"}\r\n </span>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Error */}\r\n {error && (\r\n <p className=\"resira-waiver-error\">{error}</p>\r\n )}\r\n\r\n {/* Promo code — inline row */}\r\n <div className=\"resira-waiver-promo\">\r\n <div className=\"resira-waiver-promo-row\">\r\n <TagIcon size={14} />\r\n <input\r\n type=\"text\"\r\n className=\"resira-field-input resira-field-input--sm resira-waiver-promo-input\"\r\n value={discountCode}\r\n onChange={(e) => handleCodeChange(e.target.value.toUpperCase())}\r\n placeholder={locale.discountPlaceholder}\r\n disabled={promoResult?.valid === true}\r\n />\r\n {!promoResult?.valid && (\r\n <button\r\n type=\"button\"\r\n className=\"resira-btn resira-btn--secondary resira-waiver-promo-btn\"\r\n onClick={handleApplyPromo}\r\n disabled={!discountCode.trim() || promoValidating}\r\n >\r\n {promoValidating ? (\r\n <div className=\"resira-spinner\" style={{ width: 12, height: 12 }} />\r\n ) : (\r\n locale.discountApply\r\n )}\r\n </button>\r\n )}\r\n </div>\r\n\r\n {promoResult && (\r\n <div\r\n className={`resira-waiver-discount-result ${\r\n promoResult.valid\r\n ? \"resira-waiver-discount-result--valid\"\r\n : \"resira-waiver-discount-result--invalid\"\r\n }`}\r\n >\r\n {promoResult.valid ? (\r\n <>\r\n <CheckCircleIcon size={13} />\r\n <span>\r\n {locale.discountApplied}{\" \"}\r\n {promoResult.discountType === \"percent\"\r\n ? `(${promoResult.discountValue}% off)`\r\n : promoResult.discountType === \"fixed\" && promoResult.discountValue\r\n ? `(${(promoResult.discountValue / 100).toFixed(2)} ${promoResult.currency ?? \"\"} off)`\r\n : \"\"}\r\n </span>\r\n </>\r\n ) : (\r\n <>\r\n <AlertCircleIcon size={13} />\r\n <span>{promoResult.error ?? locale.discountInvalid}</span>\r\n </>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","// ═══════════════════════════════════════════════════════════════\r\n// @resira/ui — PaymentForm\r\n// Stripe Elements wrapper for secure card/wallet payment.\r\n// Uses vanilla Stripe.js (no @stripe/react-stripe-js dependency).\r\n// ═══════════════════════════════════════════════════════════════\r\n\r\nimport React, { useEffect, useRef, useState, useCallback } from \"react\";\r\nimport { useResira } from \"../ResiraProvider.js\";\r\nimport { LockIcon, CreditCardIcon, AlertCircleIcon } from \"../icons.js\";\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Dynamic Stripe.js loader (loads script once, returns Stripe)\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nlet stripePromise: Promise<any> | null = null;\r\n\r\nfunction loadStripeJs(publishableKey: string): Promise<any> {\r\n if (stripePromise) return stripePromise;\r\n\r\n stripePromise = new Promise((resolve, reject) => {\r\n // Check if already loaded\r\n if ((window as any).Stripe) {\r\n resolve((window as any).Stripe(publishableKey));\r\n return;\r\n }\r\n\r\n const script = document.createElement(\"script\");\r\n script.src = \"https://js.stripe.com/v3/\";\r\n script.async = true;\r\n script.onload = () => {\r\n if ((window as any).Stripe) {\r\n resolve((window as any).Stripe(publishableKey));\r\n } else {\r\n reject(new Error(\"Stripe.js failed to load\"));\r\n }\r\n };\r\n script.onerror = () => reject(new Error(\"Failed to load Stripe.js\"));\r\n document.head.appendChild(script);\r\n });\r\n\r\n return stripePromise;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Props\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nexport interface PaymentFormProps {\r\n /** Stripe client secret from the payment intent. */\r\n clientSecret: string;\r\n /** Amount to charge now (cents). */\r\n amountNow: number;\r\n /** Amount to charge at venue (cents). */\r\n amountAtVenue: number;\r\n /** Total amount (cents). */\r\n totalAmount: number;\r\n /** Currency code. */\r\n currency: string;\r\n /** Called when payment succeeds. Receives the paymentIntent ID. */\r\n onSuccess: (paymentIntentId: string) => void;\r\n /** Called when payment fails. */\r\n onError: (message: string) => void;\r\n /** Whether the form is in a processing state. */\r\n processing?: boolean;\r\n /** Discount amount in cents (if a promo code was applied). */\r\n discountAmount?: number;\r\n /** Original price before discount (cents). */\r\n originalPrice?: number;\r\n /** The promo code that was applied. */\r\n promoCodeApplied?: string;\r\n /** Hide the built-in submit button so navigation can be driven externally. */\r\n hideSubmitButton?: boolean;\r\n /** Increment to request a submit from an external footer action. */\r\n submitRequestId?: number;\r\n /** Called when the payment element becomes ready or not ready. */\r\n onReadyChange?: (ready: boolean) => void;\r\n /** Called when the form starts or stops processing a submission. */\r\n onSubmittingChange?: (submitting: boolean) => void;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Helpers\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nfunction formatPrice(cents: number, currency: string): string {\r\n return new Intl.NumberFormat(\"default\", {\r\n style: \"currency\",\r\n currency,\r\n }).format(cents / 100);\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Component\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nexport function PaymentForm({\r\n clientSecret,\r\n amountNow,\r\n amountAtVenue,\r\n totalAmount,\r\n currency,\r\n onSuccess,\r\n onError,\r\n processing = false,\r\n discountAmount,\r\n originalPrice,\r\n promoCodeApplied,\r\n hideSubmitButton = false,\r\n submitRequestId,\r\n onReadyChange,\r\n onSubmittingChange,\r\n}: PaymentFormProps) {\r\n const { locale, theme, stripePublishableKey } = useResira();\r\n const mountRef = useRef<HTMLDivElement>(null);\r\n const stripeRef = useRef<any>(null);\r\n const elementsRef = useRef<any>(null);\r\n const paymentElementRef = useRef<any>(null);\r\n const [ready, setReady] = useState(false);\r\n const [submitting, setSubmitting] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const lastSubmitRequestRef = useRef(submitRequestId ?? 0);\r\n\r\n // Initialize Stripe Elements\r\n useEffect(() => {\r\n setReady(false);\r\n if (!stripePublishableKey || !clientSecret || !mountRef.current) return;\r\n\r\n let cancelled = false;\r\n\r\n async function init() {\r\n try {\r\n const stripe = await loadStripeJs(stripePublishableKey!);\r\n if (cancelled) return;\r\n stripeRef.current = stripe;\r\n\r\n const elements = stripe.elements({\r\n clientSecret,\r\n appearance: {\r\n theme: \"stripe\",\r\n variables: {\r\n colorPrimary: theme.primaryColor,\r\n colorBackground: theme.surfaceColor,\r\n colorText: theme.textColor,\r\n colorDanger: theme.errorColor,\r\n fontFamily: theme.fontFamily,\r\n borderRadius: \"8px\",\r\n spacingUnit: \"4px\",\r\n },\r\n rules: {\r\n \".Input\": {\r\n border: `1px solid ${theme.borderColor}`,\r\n boxShadow: \"none\",\r\n padding: \"12px 14px\",\r\n fontSize: \"15px\",\r\n },\r\n \".Input:focus\": {\r\n border: `1px solid ${theme.primaryColor}`,\r\n boxShadow: `0 0 0 3px ${theme.primaryColor}20`,\r\n },\r\n \".Label\": {\r\n fontSize: \"14px\",\r\n fontWeight: \"500\",\r\n marginBottom: \"6px\",\r\n },\r\n },\r\n },\r\n });\r\n\r\n if (cancelled) return;\r\n elementsRef.current = elements;\r\n\r\n const paymentElement = elements.create(\"payment\", {\r\n layout: \"tabs\",\r\n });\r\n\r\n paymentElement.mount(mountRef.current!);\r\n paymentElementRef.current = paymentElement;\r\n\r\n paymentElement.on(\"ready\", () => {\r\n if (!cancelled) setReady(true);\r\n });\r\n } catch (err) {\r\n if (!cancelled) {\r\n setError(err instanceof Error ? err.message : \"Failed to load payment form\");\r\n }\r\n }\r\n }\r\n\r\n init();\r\n\r\n return () => {\r\n cancelled = true;\r\n if (paymentElementRef.current) {\r\n try { paymentElementRef.current.destroy(); } catch {}\r\n }\r\n };\r\n }, [stripePublishableKey, clientSecret, theme]);\r\n\r\n // Handle payment submission\r\n const handleSubmit = useCallback(async () => {\r\n if (!stripeRef.current || !elementsRef.current || submitting || processing) return;\r\n\r\n setSubmitting(true);\r\n setError(null);\r\n\r\n try {\r\n const { error: submitError } = await elementsRef.current.submit();\r\n if (submitError) {\r\n setError(submitError.message);\r\n setSubmitting(false);\r\n return;\r\n }\r\n\r\n const result = await stripeRef.current.confirmPayment({\r\n elements: elementsRef.current,\r\n clientSecret,\r\n confirmParams: {\r\n return_url: window.location.href,\r\n },\r\n redirect: \"if_required\",\r\n });\r\n\r\n if (result.error) {\r\n setError(result.error.message);\r\n onError(result.error.message);\r\n } else if (result.paymentIntent) {\r\n onSuccess(result.paymentIntent.id);\r\n }\r\n } catch (err) {\r\n const msg = err instanceof Error ? err.message : \"Payment failed\";\r\n setError(msg);\r\n onError(msg);\r\n } finally {\r\n setSubmitting(false);\r\n }\r\n }, [clientSecret, submitting, processing, onSuccess, onError]);\r\n\r\n const isProcessing = submitting || processing;\r\n\r\n useEffect(() => {\r\n onReadyChange?.(ready);\r\n }, [ready, onReadyChange]);\r\n\r\n useEffect(() => {\r\n onSubmittingChange?.(isProcessing);\r\n }, [isProcessing, onSubmittingChange]);\r\n\r\n useEffect(() => {\r\n if (!hideSubmitButton || submitRequestId == null) return;\r\n if (submitRequestId === lastSubmitRequestRef.current) return;\r\n lastSubmitRequestRef.current = submitRequestId;\r\n void handleSubmit();\r\n }, [hideSubmitButton, submitRequestId, handleSubmit]);\r\n\r\n return (\r\n <div className=\"resira-payment\">\r\n {/* Price breakdown */}\r\n <div className=\"resira-payment-breakdown\">\r\n <div className=\"resira-summary\">\r\n {/* Original price + discount (if promo applied) */}\r\n {discountAmount != null && discountAmount > 0 && originalPrice != null && (\r\n <>\r\n <div className=\"resira-summary-row\">\r\n <span className=\"resira-summary-label\">{locale.originalPrice ?? \"Original\"}</span>\r\n <span className=\"resira-summary-value\" style={{ textDecoration: \"line-through\", opacity: 0.6 }}>\r\n {formatPrice(originalPrice, currency)}\r\n </span>\r\n </div>\r\n <div className=\"resira-summary-row\">\r\n <span className=\"resira-summary-label resira-payment-discount\">\r\n {locale.discountLabel ?? \"Discount\"}\r\n {promoCodeApplied && (\r\n <span className=\"resira-payment-promo-badge\">{promoCodeApplied}</span>\r\n )}\r\n </span>\r\n <span className=\"resira-summary-value resira-payment-discount\">\r\n −{formatPrice(discountAmount, currency)}\r\n </span>\r\n </div>\r\n </>\r\n )}\r\n <div className=\"resira-summary-row\">\r\n <span className=\"resira-summary-label\">{locale.payNow}</span>\r\n <span className=\"resira-summary-value resira-payment-amount-now\">\r\n {formatPrice(amountNow, currency)}\r\n </span>\r\n </div>\r\n {amountAtVenue > 0 && (\r\n <div className=\"resira-summary-row\">\r\n <span className=\"resira-summary-label\">{locale.payAtVenue}</span>\r\n <span className=\"resira-summary-value resira-payment-amount-venue\">\r\n {formatPrice(amountAtVenue, currency)}\r\n </span>\r\n </div>\r\n )}\r\n <div className=\"resira-summary-divider\" />\r\n <div className=\"resira-summary-row\">\r\n <span className=\"resira-summary-label resira-summary-total\">{locale.total}</span>\r\n <span className=\"resira-summary-value resira-summary-total\">\r\n {formatPrice(totalAmount, currency)}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Stripe Payment Element */}\r\n <div className=\"resira-payment-element-container\">\r\n {!ready && !error && (\r\n <div className=\"resira-loading\" style={{ padding: \"24px 0\" }} role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\r\n <div className=\"resira-spinner\" aria-hidden=\"true\" />\r\n <span className=\"resira-loading-text\">{locale.loading}</span>\r\n </div>\r\n )}\r\n <div\r\n ref={mountRef}\r\n className=\"resira-payment-element\"\r\n style={{ display: ready ? \"block\" : \"none\" }}\r\n />\r\n </div>\r\n\r\n {/* Error */}\r\n {error && (\r\n <div className=\"resira-payment-error\" role=\"alert\" aria-live=\"assertive\">\r\n <AlertCircleIcon size={16} />\r\n <span>{error}</span>\r\n </div>\r\n )}\r\n\r\n {/* Pay button */}\r\n {ready && !hideSubmitButton && (\r\n <button\r\n type=\"button\"\r\n className=\"resira-btn resira-btn--primary resira-payment-btn\"\r\n onClick={handleSubmit}\r\n disabled={isProcessing}\r\n >\r\n {isProcessing ? (\r\n <>\r\n <div className=\"resira-spinner\" style={{ width: 16, height: 16 }} />\r\n {locale.processingPayment}\r\n </>\r\n ) : (\r\n <>\r\n <LockIcon size={16} />\r\n {locale.payNow} — {formatPrice(amountNow, currency)}\r\n </>\r\n )}\r\n </button>\r\n )}\r\n\r\n {/* Security badge */}\r\n <div className=\"resira-payment-secure\">\r\n <CreditCardIcon size={14} />\r\n <span>Secured by Stripe · 256-bit SSL encryption</span>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","// ═══════════════════════════════════════════════════════════════\r\n// @resira/ui — ReservationSummary (v2)\r\n// Compact, icon-enriched booking summary + confirmation.\r\n// ═══════════════════════════════════════════════════════════════\r\n\r\nimport React from \"react\";\r\nimport type { Reservation } from \"@resira/sdk\";\r\nimport { useResira } from \"../ResiraProvider.js\";\r\nimport type { BookingSelection, GuestFormValues } from \"../types.js\";\r\nimport {\r\n CheckCircleIcon,\r\n CalendarIcon,\r\n ClockIcon,\r\n UsersIcon,\r\n UserIcon,\r\n MailIcon,\r\n} from \"../icons.js\";\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Helpers\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nfunction formatDate(dateStr: string): string {\r\n try {\r\n const d = new Date(dateStr + \"T00:00:00\");\r\n return d.toLocaleDateString(\"default\", {\r\n weekday: \"short\",\r\n month: \"short\",\r\n day: \"numeric\",\r\n });\r\n } catch {\r\n return dateStr;\r\n }\r\n}\r\n\r\nfunction formatTime(isoStr: string): string {\r\n try {\r\n const d = new Date(isoStr);\r\n return d.toLocaleTimeString(\"default\", {\r\n hour: \"2-digit\",\r\n minute: \"2-digit\",\r\n hour12: false,\r\n });\r\n } catch {\r\n return isoStr;\r\n }\r\n}\r\n\r\nfunction formatPrice(cents: number, currency: string): string {\r\n return new Intl.NumberFormat(\"default\", {\r\n style: \"currency\",\r\n currency,\r\n }).format(cents / 100);\r\n}\r\n\r\nfunction nightsBetween(start: string, end: string): number {\r\n const a = new Date(start);\r\n const b = new Date(end);\r\n return Math.round((b.getTime() - a.getTime()) / (1000 * 60 * 60 * 24));\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Pre-confirmation summary (compact card)\r\n// ─────────────────────────────────────────────────────────────\r\n\r\ninterface SummaryPreviewProps {\r\n selection: BookingSelection;\r\n guest: GuestFormValues;\r\n totalPrice?: number;\r\n currency?: string;\r\n}\r\n\r\nexport function SummaryPreview({\r\n selection,\r\n guest,\r\n totalPrice,\r\n currency = \"EUR\",\r\n}: SummaryPreviewProps) {\r\n const { locale, domain } = useResira();\r\n const isDateBased = domain === \"rental\";\r\n\r\n return (\r\n <div className=\"resira-summary-card\">\r\n {/* Booking details section */}\r\n <div className=\"resira-summary-section\">\r\n <div className=\"resira-summary-section-title\">Booking Details</div>\r\n <div className=\"resira-summary-grid\">\r\n {/* Date/Time */}\r\n {isDateBased && selection.startDate && selection.endDate && (\r\n <>\r\n <div className=\"resira-summary-item\">\r\n <CalendarIcon size={14} />\r\n <div className=\"resira-summary-item-content\">\r\n <span className=\"resira-summary-item-label\">{locale.checkIn}</span>\r\n <span className=\"resira-summary-item-value\">{formatDate(selection.startDate)}</span>\r\n </div>\r\n </div>\r\n <div className=\"resira-summary-item\">\r\n <CalendarIcon size={14} />\r\n <div className=\"resira-summary-item-content\">\r\n <span className=\"resira-summary-item-label\">{locale.checkOut}</span>\r\n <span className=\"resira-summary-item-value\">{formatDate(selection.endDate)}</span>\r\n </div>\r\n </div>\r\n <div className=\"resira-summary-item\">\r\n <ClockIcon size={14} />\r\n <div className=\"resira-summary-item-content\">\r\n <span className=\"resira-summary-item-label\">{locale.nights}</span>\r\n <span className=\"resira-summary-item-value\">{nightsBetween(selection.startDate, selection.endDate)}</span>\r\n </div>\r\n </div>\r\n </>\r\n )}\r\n\r\n {!isDateBased && selection.startDate && (\r\n <div className=\"resira-summary-item\">\r\n <CalendarIcon size={14} />\r\n <div className=\"resira-summary-item-content\">\r\n <span className=\"resira-summary-item-label\">Date</span>\r\n <span className=\"resira-summary-item-value\">{formatDate(selection.startDate)}</span>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {!isDateBased && selection.startTime && (\r\n <div className=\"resira-summary-item\">\r\n <ClockIcon size={14} />\r\n <div className=\"resira-summary-item-content\">\r\n <span className=\"resira-summary-item-label\">Time</span>\r\n <span className=\"resira-summary-item-value\">\r\n {formatTime(selection.startTime)}\r\n {selection.endTime && ` – ${formatTime(selection.endTime)}`}\r\n </span>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div className=\"resira-summary-item\">\r\n <UsersIcon size={14} />\r\n <div className=\"resira-summary-item-content\">\r\n <span className=\"resira-summary-item-label\">{locale.guests}</span>\r\n <span className=\"resira-summary-item-value\">{selection.partySize}</span>\r\n </div>\r\n </div>\r\n\r\n {selection.duration && (\r\n <div className=\"resira-summary-item\">\r\n <ClockIcon size={14} />\r\n <div className=\"resira-summary-item-content\">\r\n <span className=\"resira-summary-item-label\">{locale.duration}</span>\r\n <span className=\"resira-summary-item-value\">{selection.duration} {locale.minutes}</span>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Guest info section */}\r\n <div className=\"resira-summary-section\">\r\n <div className=\"resira-summary-section-title\">Guest</div>\r\n <div className=\"resira-summary-grid\">\r\n <div className=\"resira-summary-item\">\r\n <UserIcon size={14} />\r\n <div className=\"resira-summary-item-content\">\r\n <span className=\"resira-summary-item-label\">{locale.fullName}</span>\r\n <span className=\"resira-summary-item-value\">{guest.guestName}</span>\r\n </div>\r\n </div>\r\n <div className=\"resira-summary-item\">\r\n <MailIcon size={14} />\r\n <div className=\"resira-summary-item-content\">\r\n <span className=\"resira-summary-item-label\">{locale.email}</span>\r\n <span className=\"resira-summary-item-value\">{guest.guestEmail}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Price */}\r\n {totalPrice !== undefined && (\r\n <div className=\"resira-summary-price-bar\">\r\n <span className=\"resira-summary-price-label\">{locale.total}</span>\r\n <span className=\"resira-summary-price-value\">{formatPrice(totalPrice, currency)}</span>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Post-confirmation view\r\n// ─────────────────────────────────────────────────────────────\r\n\r\ninterface ConfirmationViewProps {\r\n reservation: Reservation;\r\n}\r\n\r\nexport function ConfirmationView({ reservation }: ConfirmationViewProps) {\r\n const { locale } = useResira();\r\n\r\n return (\r\n <div className=\"resira-confirmation\">\r\n <div className=\"resira-confirmation-icon\">\r\n <CheckCircleIcon size={28} />\r\n </div>\r\n <h3 className=\"resira-confirmation-title\">{locale.bookingConfirmed}</h3>\r\n <p className=\"resira-confirmation-subtitle\">\r\n {reservation.id.slice(0, 8).toUpperCase()}\r\n </p>\r\n\r\n <div className=\"resira-confirmation-details\">\r\n <div className=\"resira-summary-grid\">\r\n {reservation.startDate && (\r\n <div className=\"resira-summary-item\">\r\n <CalendarIcon size={14} />\r\n <div className=\"resira-summary-item-content\">\r\n <span className=\"resira-summary-item-label\">{locale.checkIn}</span>\r\n <span className=\"resira-summary-item-value\">{formatDate(reservation.startDate)}</span>\r\n </div>\r\n </div>\r\n )}\r\n {reservation.endDate && (\r\n <div className=\"resira-summary-item\">\r\n <CalendarIcon size={14} />\r\n <div className=\"resira-summary-item-content\">\r\n <span className=\"resira-summary-item-label\">{locale.checkOut}</span>\r\n <span className=\"resira-summary-item-value\">{formatDate(reservation.endDate)}</span>\r\n </div>\r\n </div>\r\n )}\r\n {reservation.startTime && (\r\n <div className=\"resira-summary-item\">\r\n <ClockIcon size={14} />\r\n <div className=\"resira-summary-item-content\">\r\n <span className=\"resira-summary-item-label\">Time</span>\r\n <span className=\"resira-summary-item-value\">\r\n {formatTime(reservation.startTime)}\r\n {reservation.endTime && ` – ${formatTime(reservation.endTime)}`}\r\n </span>\r\n </div>\r\n </div>\r\n )}\r\n <div className=\"resira-summary-item\">\r\n <UsersIcon size={14} />\r\n <div className=\"resira-summary-item-content\">\r\n <span className=\"resira-summary-item-label\">{locale.guests}</span>\r\n <span className=\"resira-summary-item-value\">{reservation.partySize}</span>\r\n </div>\r\n </div>\r\n </div>\r\n {reservation.totalPrice > 0 && (\r\n <div className=\"resira-summary-price-bar\" style={{ marginTop: 12 }}>\r\n <span className=\"resira-summary-price-label\">{locale.total}</span>\r\n <span className=\"resira-summary-price-value\">\r\n {formatPrice(reservation.totalPrice, reservation.currency)}\r\n </span>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","// ═══════════════════════════════════════════════════════════════\r\n// @resira/ui — ResiraBookingWidget\r\n// Main orchestrator widget. Fully domain-aware.\r\n// Watersport/Service flow:\r\n// Service → Availability → Guest Details → Terms → Payment → ✓\r\n// Rental flow:\r\n// [Resource] → Availability → Guest Details → Terms → Payment → ✓\r\n// ═══════════════════════════════════════════════════════════════\r\n\r\nimport React, { useState, useCallback, useMemo, useEffect } from \"react\";\r\nimport type { CreateReservationRequest, Product, ValidatePromoCodeResponse } from \"@resira/sdk\";\r\nimport { useResira } from \"./ResiraProvider.js\";\r\nimport { useAvailability, useReservation, useResources, useProducts, usePaymentIntent, useCheckoutSession } from \"./hooks.js\";\r\nimport { BookingCalendar } from \"./components/BookingCalendar.js\";\r\nimport { TimeSlotPicker } from \"./components/TimeSlotPicker.js\";\r\nimport { ResourcePicker } from \"./components/ResourcePicker.js\";\r\nimport { ProductSelector } from \"./components/ProductSelector.js\";\r\nimport { GuestForm, validateGuestForm } from \"./components/GuestForm.js\";\r\nimport { WaiverConsent } from \"./components/WaiverConsent.js\";\r\nimport { PaymentForm } from \"./components/PaymentForm.js\";\r\nimport {\r\n SummaryPreview,\r\n ConfirmationView,\r\n} from \"./components/ReservationSummary.js\";\r\nimport { AlertCircleIcon, CheckCircleIcon, CheckIcon } from \"./icons.js\";\r\nimport type {\r\n BookingStep,\r\n BookingSelection,\r\n GuestFormValues,\r\n GuestFormErrors,\r\n} from \"./types.js\";\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Helpers\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nfunction todayStr(): string {\r\n const d = new Date();\r\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, \"0\")}-${String(d.getDate()).padStart(2, \"0\")}`;\r\n}\r\n\r\nfunction formatPrice(cents: number, currency: string): string {\r\n return new Intl.NumberFormat(\"default\", {\r\n style: \"currency\",\r\n currency,\r\n }).format(cents / 100);\r\n}\r\n\r\n/** Steps vary by domain and whether catalog / payment are active. */\r\nfunction buildSteps(domain: string, hasPayment: boolean, catalogMode: boolean): BookingStep[] {\r\n const steps: BookingStep[] = [];\r\n\r\n // Watersport/service always start with product selector;\r\n // rental catalog mode starts with resource picker.\r\n // Restaurants never show the resource step — tables are auto-assigned.\r\n if (domain === \"watersport\" || domain === \"service\" || (catalogMode && domain !== \"restaurant\")) {\r\n steps.push(\"resource\");\r\n }\r\n\r\n steps.push(\"availability\");\r\n steps.push(\"details\");\r\n\r\n // Restaurant: skip terms step unless payment is enabled\r\n if (domain !== \"restaurant\" || hasPayment) {\r\n steps.push(\"terms\");\r\n }\r\n\r\n if (hasPayment) {\r\n steps.push(\"payment\");\r\n }\r\n\r\n steps.push(\"confirmation\");\r\n return steps;\r\n}\r\n\r\nfunction stepIndex(step: BookingStep, steps: BookingStep[]): number {\r\n return steps.indexOf(step);\r\n}\r\n\r\n// Step labels for the indicator\r\nconst STEP_LABELS: Record<BookingStep, string> = {\r\n resource: \"Service\",\r\n availability: \"Date & Time\",\r\n details: \"Details\",\r\n terms: \"Terms\",\r\n payment: \"Payment\",\r\n confirmation: \"Done\",\r\n checkout: \"Checkout\",\r\n};\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Component\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nexport function ResiraBookingWidget() {\r\n const {\r\n domain,\r\n locale,\r\n domainConfig,\r\n catalogMode,\r\n allowMultiSelect,\r\n activeResourceId,\r\n setActiveResourceId,\r\n stripePublishableKey,\r\n showTerms,\r\n showWaiver,\r\n showRemainingSpots,\r\n depositPercent,\r\n onClose,\r\n showStepIndicator,\r\n deeplink,\r\n deeplinkGuest,\r\n onStepChange,\r\n onBookingComplete,\r\n onError,\r\n checkoutSessionToken,\r\n } = useResira();\r\n const isDateBased = domain === \"rental\";\r\n const isTimeBased = domain === \"restaurant\" || domain === \"watersport\" || domain === \"service\";\r\n const isServiceBased = domain === \"watersport\" || domain === \"service\";\r\n const hasPayment = !!stripePublishableKey;\r\n\r\n // ── Checkout session mode ──────────────────────────────────\r\n const isCheckoutMode = !!checkoutSessionToken;\r\n const {\r\n session: checkoutSession,\r\n loading: checkoutSessionLoading,\r\n error: checkoutSessionError,\r\n errorCode: checkoutSessionErrorCode,\r\n } = useCheckoutSession(checkoutSessionToken);\r\n\r\n // ── Steps (dynamic) ────────────────────────────────────────\r\n const STEPS = useMemo(() => {\r\n if (isCheckoutMode) {\r\n return [\"checkout\" as BookingStep, \"payment\" as BookingStep, \"confirmation\" as BookingStep];\r\n }\r\n return buildSteps(domain, hasPayment, catalogMode);\r\n }, [domain, hasPayment, catalogMode, isCheckoutMode]);\r\n const initialStep: BookingStep = STEPS[0];\r\n\r\n // ── Step management ────────────────────────────────────────\r\n const [step, setStep] = useState<BookingStep>(initialStep);\r\n\r\n // ── Selected resource IDs (for multi-select mode) ──────────\r\n const [selectedResourceIds, setSelectedResourceIds] = useState<string[]>([]);\r\n\r\n // ── Resource catalog ───────────────────────────────────────\r\n const {\r\n resources,\r\n loading: resourcesLoading,\r\n error: resourcesError,\r\n } = useResources();\r\n\r\n // ── Restaurant auto-select: pick first table silently ──────\r\n useEffect(() => {\r\n if (domain === \"restaurant\" && catalogMode && !activeResourceId && resources.length > 0) {\r\n setActiveResourceId(resources[0].id);\r\n }\r\n }, [domain, catalogMode, activeResourceId, resources, setActiveResourceId]);\r\n\r\n // ── Product catalog (watersport/service) ───────────────────\r\n const {\r\n products,\r\n loading: productsLoading,\r\n error: productsError,\r\n } = useProducts();\r\n\r\n // ── Selected product ───────────────────────────────────────\r\n const [selectedProduct, setSelectedProduct] = useState<Product | null>(null);\r\n\r\n // ── Selection state ────────────────────────────────────────\r\n const [selection, setSelection] = useState<BookingSelection>({\r\n partySize: domainConfig.defaultPartySize ?? 2,\r\n duration: domainConfig.defaultDuration,\r\n });\r\n\r\n // ── Guest form state ───────────────────────────────────────\r\n const [guest, setGuest] = useState<GuestFormValues>({\r\n guestName: \"\",\r\n guestEmail: \"\",\r\n guestPhone: \"\",\r\n notes: \"\",\r\n });\r\n const [formErrors, setFormErrors] = useState<GuestFormErrors>({});\r\n\r\n // ── Terms / waiver state ───────────────────────────────────\r\n const [termsAccepted, setTermsAccepted] = useState(false);\r\n const [waiverAccepted, setWaiverAccepted] = useState(false);\r\n const [termsError, setTermsError] = useState<string | null>(null);\r\n const [discountCode, setDiscountCode] = useState(\"\");\r\n const [promoValidation, setPromoValidation] = useState<ValidatePromoCodeResponse | null>(null);\r\n\r\n // Handler for promo code validation result from WaiverConsent\r\n const handlePromoValidated = useCallback((result: ValidatePromoCodeResponse) => {\r\n setPromoValidation(result);\r\n }, []);\r\n\r\n // ── Date for time-slot query ───────────────────────────────\r\n const [slotDate, setSlotDate] = useState(todayStr());\r\n\r\n // ── Availability query ─────────────────────────────────────\r\n const availabilityParams = useMemo(() => {\r\n if (isDateBased) {\r\n if (selection.startDate && selection.endDate) {\r\n return { startDate: selection.startDate, endDate: selection.endDate };\r\n }\r\n return {};\r\n }\r\n return {\r\n date: slotDate,\r\n partySize: selection.partySize,\r\n durationMinutes: selection.duration,\r\n };\r\n }, [isDateBased, selection.startDate, selection.endDate, slotDate, selection.partySize, selection.duration]);\r\n\r\n // For watersport/service with a selected product, use product-level\r\n // availability (aggregates capacity across all linked equipment).\r\n const availabilityProductId = isServiceBased ? selectedProduct?.id : undefined;\r\n\r\n const { data: availability, loading, error, refetch } = useAvailability(\r\n availabilityParams,\r\n availabilityProductId,\r\n );\r\n\r\n // ── Calendar data (blocked dates) ─────────────────────────\r\n const {\r\n data: calendarData,\r\n loading: calendarLoading,\r\n } = useAvailability(isDateBased ? {} : undefined);\r\n\r\n // ── Reservation hook ───────────────────────────────────────\r\n const {\r\n reservation,\r\n submitting,\r\n error: submitError,\r\n submit,\r\n } = useReservation();\r\n\r\n // ── Payment hook ───────────────────────────────────────────\r\n const {\r\n paymentIntent,\r\n creating: creatingPayment,\r\n error: paymentError,\r\n create: createPayment,\r\n confirm: confirmPayment,\r\n confirming: confirmingPayment,\r\n reset: resetPaymentIntent,\r\n } = usePaymentIntent();\r\n const [paymentSubmitRequestId, setPaymentSubmitRequestId] = useState(0);\r\n const [paymentFormReady, setPaymentFormReady] = useState(false);\r\n const [paymentFormSubmitting, setPaymentFormSubmitting] = useState(false);\r\n\r\n const paymentPayload = useMemo(() => {\r\n // Checkout session mode — backend hydrates from the session token\r\n if (isCheckoutMode && checkoutSession) {\r\n return {\r\n checkoutSessionToken,\r\n guestName: guest.guestName.trim() || checkoutSession.guestName || \"\",\r\n guestEmail: guest.guestEmail.trim() || checkoutSession.guestEmail || undefined,\r\n guestPhone: guest.guestPhone.trim() || undefined,\r\n notes: guest.notes.trim() || undefined,\r\n termsAccepted: termsAccepted || undefined,\r\n };\r\n }\r\n\r\n const resourceId = activeResourceId ?? selectedProduct?.equipmentIds?.[0] ?? \"\";\r\n\r\n return {\r\n productId: selectedProduct?.id ?? \"\",\r\n resourceId,\r\n partySize: selection.partySize,\r\n durationMinutes: selection.duration,\r\n startDate: selection.startDate!,\r\n startTime: selection.startTime,\r\n endTime: selection.endTime,\r\n guestName: guest.guestName.trim(),\r\n guestEmail: guest.guestEmail.trim(),\r\n guestPhone: guest.guestPhone.trim() || undefined,\r\n notes: guest.notes.trim() || undefined,\r\n promoCode: discountCode.trim() || undefined,\r\n termsAccepted: termsAccepted || undefined,\r\n };\r\n }, [activeResourceId, selectedProduct, selection, guest, discountCode, termsAccepted, isCheckoutMode, checkoutSession, checkoutSessionToken]);\r\n\r\n // ── Blocked dates set ──────────────────────────────────────\r\n const blockedDates = useMemo(() => {\r\n const dates = calendarData?.dates?.blockedDates ?? availability?.dates?.blockedDates ?? [];\r\n return new Set(dates);\r\n }, [calendarData, availability]);\r\n\r\n // ── Price calculation ──────────────────────────────────────\r\n const currency = selectedProduct?.currency ?? availability?.currency ?? \"EUR\";\r\n\r\n // For per_rider model, resolve the active rider tier's durationPricing\r\n const activeRiderDurationPricing = useMemo(() => {\r\n if (selectedProduct?.pricingModel === \"per_rider\" && selectedProduct.riderTierPricing?.length) {\r\n // Find the tier matching current party size, or the closest one ≥ partySize\r\n const sorted = [...selectedProduct.riderTierPricing].sort((a, b) => (a.riders ?? a.minRiders ?? 0) - (b.riders ?? b.minRiders ?? 0));\r\n const exact = sorted.find((t) => t.riders === selection.partySize || (t.minRiders != null && t.maxRiders != null && selection.partySize >= t.minRiders && selection.partySize <= t.maxRiders));\r\n if (exact) return exact.durationPricing;\r\n const closest = sorted.find((t) => (t.riders ?? t.minRiders ?? 0) >= selection.partySize);\r\n return closest?.durationPricing ?? sorted[sorted.length - 1]?.durationPricing ?? [];\r\n }\r\n return null;\r\n }, [selectedProduct, selection.partySize]);\r\n\r\n const computedPrice = useMemo(() => {\r\n if (selectedProduct) {\r\n let base = selectedProduct.priceCents;\r\n\r\n if (selectedProduct.pricingModel === \"per_rider\" && activeRiderDurationPricing?.length) {\r\n // Look up price from rider tier's duration pricing\r\n const match = selection.duration\r\n ? activeRiderDurationPricing.find((dp) => dp.durationMinutes === selection.duration)\r\n : activeRiderDurationPricing[0];\r\n if (match) base = match.priceCents;\r\n } else if (selectedProduct.durationPricing?.length && selection.duration) {\r\n // Standard per_session / per_person lookup\r\n const match = selectedProduct.durationPricing.find(\r\n (dp) => dp.durationMinutes === selection.duration,\r\n );\r\n if (match) base = match.priceCents;\r\n }\r\n\r\n const total = selectedProduct.pricingModel === \"per_person\"\r\n ? base * selection.partySize\r\n : base; // per_session and per_rider are flat per the tier\r\n const pct = depositPercent ?? 100;\r\n const amountNow = Math.round(total * pct / 100);\r\n const amountAtVenue = total - amountNow;\r\n return { total, amountNow, amountAtVenue };\r\n }\r\n if (availability?.dates?.totalPrice) {\r\n const total = availability.dates.totalPrice;\r\n const pct = depositPercent ?? 100;\r\n const amountNow = Math.round(total * pct / 100);\r\n const amountAtVenue = total - amountNow;\r\n return { total, amountNow, amountAtVenue };\r\n }\r\n return null;\r\n }, [selectedProduct, availability, selection.partySize, selection.duration, depositPercent, activeRiderDurationPricing]);\r\n\r\n // ── Step title ─────────────────────────────────────────────\r\n const stepTitle = useMemo(() => {\r\n switch (step) {\r\n case \"resource\":\r\n return isServiceBased ? locale.chooseService : \"Choose an experience\";\r\n case \"availability\":\r\n if (domain === \"restaurant\") return locale.reserveTable;\r\n return isDateBased ? locale.selectDates : locale.selectTime;\r\n case \"details\":\r\n return locale.guestDetails;\r\n case \"terms\":\r\n return locale.termsTitle;\r\n case \"payment\":\r\n return locale.payment;\r\n case \"confirmation\":\r\n return locale.bookingConfirmed;\r\n case \"checkout\":\r\n return \"Checkout\";\r\n }\r\n }, [step, isDateBased, isServiceBased, locale, domain]);\r\n\r\n const stepSubtitle = useMemo(() => {\r\n switch (step) {\r\n case \"resource\":\r\n return isServiceBased\r\n ? \"Select a service to continue\"\r\n : allowMultiSelect\r\n ? \"Select one or more options\"\r\n : \"Select one to continue\";\r\n case \"availability\":\r\n if (domain === \"restaurant\") return \"Pick your preferred date and time\";\r\n return selectedProduct?.name ?? domainConfig.label ?? \"\";\r\n case \"details\":\r\n if (domain === \"restaurant\") return locale.reservationFor;\r\n return locale.confirmBooking;\r\n case \"terms\":\r\n return \"Review and accept before payment\";\r\n case \"payment\":\r\n return \"Complete your booking securely\";\r\n case \"confirmation\":\r\n return \"\";\r\n case \"checkout\":\r\n return checkoutSession?.productName ?? \"Complete your booking\";\r\n }\r\n }, [step, domainConfig.label, locale, allowMultiSelect, isServiceBased, selectedProduct, domain, checkoutSession]);\r\n\r\n // ── Can proceed to next step? ──────────────────────────────\r\n const canContinue = useMemo(() => {\r\n if (step === \"resource\") {\r\n if (isServiceBased) return !!selectedProduct;\r\n return selectedResourceIds.length > 0;\r\n }\r\n if (step === \"availability\") {\r\n if (isDateBased) return !!selection.startDate && !!selection.endDate;\r\n return !!selection.startTime && !!selection.endTime;\r\n }\r\n if (step === \"terms\") {\r\n const needTerms = showTerms && !termsAccepted;\r\n const needWaiver = showWaiver && !waiverAccepted;\r\n return !needTerms && !needWaiver;\r\n }\r\n return true;\r\n }, [step, isDateBased, isServiceBased, selection, selectedResourceIds, selectedProduct, termsAccepted, waiverAccepted, showTerms, showWaiver]);\r\n\r\n // ── Date selection handler (rentals) ───────────────────────\r\n const handleDateSelect = useCallback(\r\n (start: string, end: string | undefined) => {\r\n setSelection((prev) => ({ ...prev, startDate: start, endDate: end }));\r\n },\r\n [],\r\n );\r\n\r\n // ── Time slot selection handler ────────────────────────────\r\n const handleSlotSelect = useCallback(\r\n (start: string, end: string) => {\r\n setSelection((prev) => ({\r\n ...prev,\r\n startDate: slotDate,\r\n endDate: slotDate,\r\n startTime: start,\r\n endTime: end,\r\n }));\r\n },\r\n [slotDate],\r\n );\r\n\r\n // ── Party size handler ─────────────────────────────────────\r\n const handlePartySizeChange = useCallback((size: number) => {\r\n setSelection((prev) => ({ ...prev, partySize: size }));\r\n }, []);\r\n\r\n // ── Duration handler ───────────────────────────────────────\r\n const handleDurationChange = useCallback((minutes: number) => {\r\n // Clear selected time slot — intervals change with duration so\r\n // the previously selected slot may no longer exist.\r\n setSelection((prev) => ({\r\n ...prev,\r\n duration: minutes,\r\n startTime: undefined,\r\n endTime: undefined,\r\n }));\r\n }, []);\r\n\r\n // ── Product selection handler ──────────────────────────────\r\n const handleProductSelect = useCallback(\r\n (product: Product) => {\r\n setSelectedProduct(product);\r\n // Auto-set resource ID to first linked equipment\r\n if (product.equipmentIds?.length) {\r\n setActiveResourceId(product.equipmentIds[0]);\r\n }\r\n setSelection((prev) => {\r\n // Clamp party size to product's maxPartySize if set\r\n const maxParty = product.maxPartySize ?? domainConfig.maxPartySize ?? 10;\r\n const clampedPartySize = Math.min(prev.partySize, maxParty);\r\n // Use first duration from durationPricing (sorted shortest first),\r\n // or fall back to the product's top-level durationMinutes\r\n const defaultDuration =\r\n product.durationPricing?.[0]?.durationMinutes ?? product.durationMinutes ?? prev.duration;\r\n return {\r\n ...prev,\r\n productId: product.id,\r\n duration: defaultDuration,\r\n partySize: clampedPartySize,\r\n };\r\n });\r\n\r\n // Auto-advance past the resource/service step to availability\r\n if (step === \"resource\" && isServiceBased) {\r\n const nextIdx = stepIndex(\"resource\", STEPS) + 1;\r\n if (nextIdx < STEPS.length) {\r\n setStep(STEPS[nextIdx]);\r\n }\r\n }\r\n },\r\n [setActiveResourceId, domainConfig.maxPartySize, step, isServiceBased, STEPS],\r\n );\r\n\r\n // ── Resource selection handler (rental catalog) ────────────\r\n const handleResourceSelect = useCallback(\r\n (resourceId: string) => {\r\n if (allowMultiSelect) {\r\n setSelectedResourceIds((prev) =>\r\n prev.includes(resourceId)\r\n ? prev.filter((id) => id !== resourceId)\r\n : [...prev, resourceId],\r\n );\r\n } else {\r\n setSelectedResourceIds([resourceId]);\r\n setActiveResourceId(resourceId);\r\n }\r\n },\r\n [allowMultiSelect, setActiveResourceId],\r\n );\r\n\r\n // ── Navigation ─────────────────────────────────────────────\r\n const currentIndex = stepIndex(step, STEPS);\r\n\r\n const handleContinue = useCallback(async () => {\r\n if (step === \"resource\") {\r\n if (!isServiceBased && allowMultiSelect && selectedResourceIds.length > 0) {\r\n setActiveResourceId(selectedResourceIds[0]);\r\n }\r\n setStep(STEPS[currentIndex + 1]);\r\n return;\r\n }\r\n\r\n if (step === \"availability\") {\r\n setFormErrors({});\r\n setStep(STEPS[currentIndex + 1]);\r\n return;\r\n }\r\n\r\n if (step === \"terms\") {\r\n if (showTerms && !termsAccepted) {\r\n setTermsError(locale.termsRequired);\r\n return;\r\n }\r\n if (showWaiver && !waiverAccepted) {\r\n setTermsError(locale.termsRequired);\r\n return;\r\n }\r\n\r\n setTermsError(null);\r\n\r\n if (!hasPayment) {\r\n setStep(STEPS[currentIndex + 1]);\r\n return;\r\n }\r\n setStep(STEPS[currentIndex + 1]);\r\n }\r\n }, [step, STEPS, currentIndex, allowMultiSelect, selectedResourceIds, setActiveResourceId, isServiceBased, termsAccepted, waiverAccepted, showTerms, showWaiver, locale, hasPayment]);\r\n\r\n const handleBack = useCallback(() => {\r\n if (currentIndex > 0) {\r\n if (step === \"payment\") {\r\n resetPaymentIntent();\r\n setPaymentFormReady(false);\r\n setPaymentFormSubmitting(false);\r\n }\r\n setStep(STEPS[currentIndex - 1]);\r\n }\r\n }, [STEPS, currentIndex, step, resetPaymentIntent]);\r\n\r\n // ── Submit guest details (move to terms or confirmation) ───\r\n const handleDetailsSubmit = useCallback(async () => {\r\n const contactMode = domain === \"restaurant\" ? \"either\" as const : \"email-required\" as const;\r\n const errors = validateGuestForm(guest, {\r\n required: locale.required,\r\n invalidEmail: locale.invalidEmail,\r\n contactRequired: locale.contactRequired,\r\n }, contactMode);\r\n if (Object.keys(errors).length > 0) {\r\n setFormErrors(errors);\r\n return;\r\n }\r\n setFormErrors({});\r\n\r\n // Restaurant without payment: submit directly and go to confirmation\r\n if (domain === \"restaurant\" && !hasPayment) {\r\n const resourceId = activeResourceId ?? \"\";\r\n const payload: CreateReservationRequest = {\r\n resourceId,\r\n guestName: guest.guestName.trim(),\r\n guestEmail: guest.guestEmail.trim() || undefined,\r\n guestPhone: guest.guestPhone.trim() || undefined,\r\n startDate: selection.startDate ?? selection.startTime?.split(\"T\")[0],\r\n endDate: selection.endDate ?? selection.endTime?.split(\"T\")[0],\r\n startTime: selection.startTime,\r\n endTime: selection.endTime,\r\n partySize: selection.partySize,\r\n notes: guest.notes.trim() || undefined,\r\n };\r\n\r\n const result = await submit(payload);\r\n if (result) {\r\n setStep(\"confirmation\");\r\n }\r\n return;\r\n }\r\n\r\n setStep(STEPS[currentIndex + 1]);\r\n }, [guest, locale, STEPS, currentIndex, domain, hasPayment, activeResourceId, selection, submit]);\r\n\r\n // ── Handle payment success ─────────────────────────────────\r\n const handlePaymentSuccess = useCallback(\r\n async (paymentIntentId: string) => {\r\n if (paymentIntent?.reservationId) {\r\n const confirmed = await confirmPayment(paymentIntentId, paymentIntent.reservationId);\r\n if (!confirmed) return;\r\n }\r\n setStep(\"confirmation\");\r\n },\r\n [paymentIntent, confirmPayment],\r\n );\r\n\r\n const handleStartPayment = useCallback(async () => {\r\n const result = await createPayment(paymentPayload);\r\n if (!result) return;\r\n\r\n if (result.amountNow === 0) {\r\n if (result.reservationId) {\r\n const confirmed = await confirmPayment(result.paymentIntentId, result.reservationId);\r\n if (!confirmed) return;\r\n }\r\n setStep(\"confirmation\");\r\n }\r\n }, [createPayment, paymentPayload, confirmPayment]);\r\n\r\n const handlePaymentError = useCallback((msg: string) => {\r\n // Error is displayed inside PaymentForm component\r\n onError?.(\"payment_error\", msg);\r\n }, [onError]);\r\n\r\n // ── Submit checkout session (validate guest + create payment intent) ──\r\n const handleCheckoutSubmit = useCallback(async () => {\r\n // Validate guest form\r\n const contactMode = \"email-required\" as const;\r\n const errors = validateGuestForm(guest, {\r\n required: locale.required,\r\n invalidEmail: locale.invalidEmail,\r\n contactRequired: locale.contactRequired,\r\n }, contactMode);\r\n if (Object.keys(errors).length > 0) {\r\n setFormErrors(errors);\r\n return;\r\n }\r\n setFormErrors({});\r\n\r\n // Terms validation\r\n if (checkoutSession?.checkoutConfig.termsRequired && !termsAccepted) {\r\n setTermsError(locale.termsRequired);\r\n return;\r\n }\r\n setTermsError(null);\r\n\r\n // Create payment intent with session token\r\n const result = await createPayment(paymentPayload);\r\n if (!result) return;\r\n\r\n if (result.amountNow === 0) {\r\n if (result.reservationId) {\r\n const confirmed = await confirmPayment(result.paymentIntentId, result.reservationId);\r\n if (!confirmed) return;\r\n }\r\n setStep(\"confirmation\");\r\n } else {\r\n setStep(\"payment\");\r\n }\r\n }, [guest, locale, checkoutSession, termsAccepted, createPayment, paymentPayload, confirmPayment]);\r\n\r\n // ── Submit without payment (free or no Stripe) ─────────────\r\n const handleSubmitNoPayment = useCallback(async () => {\r\n if (showTerms && !termsAccepted) {\r\n setTermsError(locale.termsRequired);\r\n return;\r\n }\r\n if (showWaiver && !waiverAccepted) {\r\n setTermsError(locale.termsRequired);\r\n return;\r\n }\r\n\r\n const resourceId = activeResourceId ?? selectedProduct?.equipmentIds?.[0] ?? \"\";\r\n\r\n const payload: CreateReservationRequest = {\r\n resourceId,\r\n guestName: guest.guestName.trim(),\r\n guestEmail: guest.guestEmail.trim() || undefined,\r\n guestPhone: guest.guestPhone.trim() || undefined,\r\n startDate: selection.startDate ?? selection.startTime?.split(\"T\")[0],\r\n endDate: selection.endDate ?? selection.endTime?.split(\"T\")[0],\r\n startTime: selection.startTime,\r\n endTime: selection.endTime,\r\n partySize: selection.partySize,\r\n notes: guest.notes.trim() || undefined,\r\n };\r\n\r\n const result = await submit(payload);\r\n if (result) {\r\n setStep(\"confirmation\");\r\n }\r\n }, [guest, selection, locale, submit, termsAccepted, waiverAccepted, showTerms, showWaiver, activeResourceId, selectedProduct]);\r\n\r\n const footerBusy = submitting || creatingPayment || confirmingPayment || paymentFormSubmitting;\r\n const paymentActionDisabled = !paymentIntent || !paymentFormReady || paymentFormSubmitting || confirmingPayment;\r\n\r\n // ── Deeplink auto-apply ────────────────────────────────────\r\n const [deeplinkApplied, setDeeplinkApplied] = useState(false);\r\n\r\n // ── Checkout session auto-fill ─────────────────────────────\r\n const [checkoutGuestFilled, setCheckoutGuestFilled] = useState(false);\r\n\r\n useEffect(() => {\r\n if (checkoutGuestFilled || !checkoutSession) return;\r\n setGuest((prev) => ({\r\n guestName: checkoutSession.guestName ?? prev.guestName,\r\n guestEmail: checkoutSession.guestEmail ?? prev.guestEmail,\r\n guestPhone: prev.guestPhone,\r\n notes: prev.notes,\r\n }));\r\n setCheckoutGuestFilled(true);\r\n }, [checkoutSession, checkoutGuestFilled]);\r\n\r\n useEffect(() => {\r\n if (deeplinkApplied || !deeplink) return;\r\n\r\n // Auto-select product by ID\r\n if (deeplink.productId && products.length > 0 && !selectedProduct) {\r\n const target = products.find((p) => p.id === deeplink.productId);\r\n if (target) {\r\n handleProductSelect(target);\r\n }\r\n }\r\n\r\n // Auto-set selection fields\r\n if (deeplink.partySize || deeplink.duration || deeplink.date) {\r\n setSelection((prev) => ({\r\n ...prev,\r\n ...(deeplink.partySize ? { partySize: deeplink.partySize } : {}),\r\n ...(deeplink.duration ? { duration: deeplink.duration } : {}),\r\n ...(deeplink.date ? { startDate: deeplink.date } : {}),\r\n }));\r\n if (deeplink.date) setSlotDate(deeplink.date);\r\n }\r\n\r\n // Auto-fill guest info\r\n if (deeplinkGuest) {\r\n setGuest((prev) => ({\r\n guestName: deeplinkGuest.name ?? prev.guestName,\r\n guestEmail: deeplinkGuest.email ?? prev.guestEmail,\r\n guestPhone: deeplinkGuest.phone ?? prev.guestPhone,\r\n notes: deeplinkGuest.notes ?? prev.notes,\r\n }));\r\n }\r\n\r\n // Auto-advance past resource step if product was pre-selected\r\n if (deeplink.productId && step === \"resource\" && isServiceBased) {\r\n const target = products.find((p) => p.id === deeplink.productId);\r\n if (target) {\r\n setStep(STEPS[stepIndex(\"resource\", STEPS) + 1]);\r\n }\r\n }\r\n\r\n setDeeplinkApplied(true);\r\n }, [deeplink, deeplinkGuest, products, selectedProduct, step, isServiceBased, STEPS, handleProductSelect]);\r\n\r\n // ── Fire onStepChange callback ─────────────────────────────\r\n useEffect(() => {\r\n onStepChange?.(step);\r\n }, [step, onStepChange]);\r\n\r\n // ── Fire onBookingComplete callback ────────────────────────\r\n useEffect(() => {\r\n if (step === \"confirmation\") {\r\n const bookingId = reservation?.id ?? paymentIntent?.reservationId;\r\n onBookingComplete?.({\r\n reservationId: bookingId,\r\n product: selectedProduct ?? undefined,\r\n selection,\r\n guest,\r\n });\r\n }\r\n }, [step]); // intentionally thin deps — fire once on confirmation\r\n\r\n // ── Fire onError for submission / payment errors ───────────\r\n useEffect(() => {\r\n if (submitError) onError?.(\"submit_error\", submitError);\r\n }, [submitError, onError]);\r\n\r\n useEffect(() => {\r\n if (paymentError) onError?.(\"payment_error\", paymentError);\r\n }, [paymentError, onError]);\r\n\r\n // ── Render ─────────────────────────────────────────────────\r\n return (\r\n <div className=\"resira-widget\">\r\n {step !== \"confirmation\" && (\r\n <div className=\"resira-widget-topbar\">\r\n {showStepIndicator && (\r\n <nav className=\"resira-steps\" aria-label=\"Booking steps\">\r\n {STEPS.filter((s) => s !== \"confirmation\").map((s, i) => {\r\n const isCompleted = stepIndex(step, STEPS) > i;\r\n const isActive = s === step;\r\n return (\r\n <div\r\n key={s}\r\n className={`resira-step-tab${isActive ? \" resira-step-tab--active\" : \"\"}${isCompleted ? \" resira-step-tab--completed\" : \"\"}`}\r\n role=\"tab\"\r\n aria-selected={isActive}\r\n >\r\n {isCompleted && <CheckIcon size={11} />}\r\n <span>{STEP_LABELS[s]}</span>\r\n </div>\r\n );\r\n })}\r\n </nav>\r\n )}\r\n\r\n <div className=\"resira-widget-header\">\r\n <h2 className=\"resira-widget-title\">{stepTitle}</h2>\r\n {stepSubtitle && (\r\n <p className=\"resira-widget-subtitle\">{stepSubtitle}</p>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Body */}\r\n <div className=\"resira-widget-body\" aria-busy={loading || calendarLoading || resourcesLoading || productsLoading || footerBusy}>\r\n {/* ─── Service/Product step ─── */}\r\n {step === \"resource\" && isServiceBased && (\r\n <ProductSelector\r\n products={products.filter((p) => p.active)}\r\n resources={resources}\r\n selectedId={selectedProduct?.id}\r\n onSelect={handleProductSelect}\r\n loading={productsLoading}\r\n error={productsError}\r\n />\r\n )}\r\n\r\n {/* ─── Resource step (rental catalog mode) ─── */}\r\n {step === \"resource\" && !isServiceBased && (\r\n <ResourcePicker\r\n resources={resources}\r\n selectedIds={selectedResourceIds}\r\n onSelect={handleResourceSelect}\r\n allowMultiSelect={allowMultiSelect}\r\n loading={resourcesLoading}\r\n error={resourcesError}\r\n />\r\n )}\r\n\r\n {/* ─── Availability step ─── */}\r\n {step === \"availability\" && (\r\n <>\r\n {(loading || calendarLoading) && !availability && !calendarData ? (\r\n <div className=\"resira-loading\" role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\r\n <div className=\"resira-spinner\" aria-hidden=\"true\" />\r\n <span className=\"resira-loading-text\">{locale.loading}</span>\r\n </div>\r\n ) : error ? (\r\n <div className=\"resira-error\" role=\"alert\" aria-live=\"assertive\">\r\n <AlertCircleIcon size={24} />\r\n <p className=\"resira-error-message\">{error}</p>\r\n <button\r\n type=\"button\"\r\n className=\"resira-btn resira-btn--secondary resira-error-retry\"\r\n onClick={() => refetch()}\r\n >\r\n Retry\r\n </button>\r\n </div>\r\n ) : (\r\n <>\r\n {isDateBased && (\r\n <BookingCalendar\r\n blockedDates={blockedDates}\r\n startDate={selection.startDate}\r\n endDate={selection.endDate}\r\n onSelect={handleDateSelect}\r\n minStay={domainConfig.minStay}\r\n />\r\n )}\r\n\r\n {isTimeBased && (\r\n <TimeSlotPicker\r\n timeSlots={availability?.timeSlots ?? []}\r\n selectedDate={slotDate}\r\n onDateChange={setSlotDate}\r\n selectedSlot={selection.startTime}\r\n onSlotSelect={handleSlotSelect}\r\n partySize={selection.partySize}\r\n onPartySizeChange={handlePartySizeChange}\r\n showPartySize={true}\r\n showDuration={domain === \"watersport\" || domain === \"service\"}\r\n selectedDuration={selection.duration}\r\n onDurationChange={handleDurationChange}\r\n maxPartySizeOverride={selectedProduct?.maxPartySize}\r\n durationPricing={activeRiderDurationPricing ?? selectedProduct?.durationPricing}\r\n currency={currency}\r\n showRemainingSpots={showRemainingSpots}\r\n />\r\n )}\r\n\r\n {/* Price preview for service-based */}\r\n {isServiceBased && selectedProduct && computedPrice && (\r\n <div className=\"resira-price-preview\">\r\n <div className=\"resira-price-preview-row\">\r\n <span>\r\n {selectedProduct.name}\r\n {selection.duration && selectedProduct.durationPricing && selectedProduct.durationPricing.length > 1 && (\r\n <span className=\"resira-price-preview-label\">\r\n {\" \"}({selection.duration < 60 ? `${selection.duration} min` : `${Math.floor(selection.duration / 60)}h${selection.duration % 60 ? selection.duration % 60 : \"\"}`})\r\n </span>\r\n )}\r\n </span>\r\n <span>\r\n {(() => {\r\n let unitPrice = selectedProduct.priceCents;\r\n if (selectedProduct.durationPricing?.length && selection.duration) {\r\n const match = selectedProduct.durationPricing.find(\r\n (dp) => dp.durationMinutes === selection.duration,\r\n );\r\n if (match) unitPrice = match.priceCents;\r\n }\r\n return formatPrice(unitPrice, currency);\r\n })()}\r\n {selectedProduct.pricingModel === \"per_person\" && (\r\n <span className=\"resira-price-preview-label\"> × {selection.partySize} pax</span>\r\n )}\r\n </span>\r\n </div>\r\n <div className=\"resira-price-preview-total\">\r\n <span>{locale.total}</span>\r\n <span>{formatPrice(computedPrice.total, currency)}</span>\r\n </div>\r\n {computedPrice.amountAtVenue > 0 && (\r\n <div className=\"resira-price-preview-split\">\r\n <span>{locale.payNow}: {formatPrice(computedPrice.amountNow, currency)}</span>\r\n <span>{locale.payAtVenue}: {formatPrice(computedPrice.amountAtVenue, currency)}</span>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </>\r\n )}\r\n </>\r\n )}\r\n\r\n {/* ─── Details step ─── */}\r\n {step === \"details\" && (\r\n <>\r\n <GuestForm\r\n values={guest}\r\n onChange={setGuest}\r\n errors={formErrors}\r\n />\r\n\r\n {submitError && (\r\n <div className=\"resira-error\" style={{ padding: \"12px 0\" }}>\r\n <AlertCircleIcon size={18} />\r\n <p className=\"resira-error-message\">{submitError}</p>\r\n </div>\r\n )}\r\n </>\r\n )}\r\n\r\n {/* ─── Terms step ─── */}\r\n {step === \"terms\" && (\r\n <>\r\n <SummaryPreview\r\n selection={selection}\r\n guest={guest}\r\n totalPrice={computedPrice?.total}\r\n currency={currency}\r\n />\r\n\r\n <div style={{ marginTop: 14 }}>\r\n <WaiverConsent\r\n termsAccepted={termsAccepted}\r\n onTermsChange={setTermsAccepted}\r\n waiverAccepted={waiverAccepted}\r\n onWaiverChange={setWaiverAccepted}\r\n discountCode={discountCode}\r\n onDiscountCodeChange={setDiscountCode}\r\n onPromoValidated={handlePromoValidated}\r\n error={termsError ?? undefined}\r\n />\r\n </div>\r\n\r\n {paymentError && hasPayment && (\r\n <div className=\"resira-error\" style={{ padding: \"12px 0\" }}>\r\n <AlertCircleIcon size={18} />\r\n <p className=\"resira-error-message\">{paymentError}</p>\r\n </div>\r\n )}\r\n </>\r\n )}\r\n\r\n {/* ─── Checkout session step (session-token flow) ─── */}\r\n {step === \"checkout\" && (\r\n <>\r\n {checkoutSessionLoading && (\r\n <div className=\"resira-loading\" role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\r\n <div className=\"resira-spinner\" aria-hidden=\"true\" />\r\n <span className=\"resira-loading-text\">{locale.loading}</span>\r\n </div>\r\n )}\r\n\r\n {checkoutSessionError && (\r\n <div className=\"resira-error\" role=\"alert\" aria-live=\"assertive\">\r\n <AlertCircleIcon size={24} />\r\n <p className=\"resira-error-message\">{checkoutSessionError}</p>\r\n {(checkoutSessionErrorCode === \"not_found\" || checkoutSessionErrorCode === \"expired\") && onClose && (\r\n <button\r\n type=\"button\"\r\n className=\"resira-btn resira-btn--secondary resira-error-retry\"\r\n onClick={onClose}\r\n >\r\n Start a new booking\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {checkoutSession && !checkoutSessionError && (\r\n <>\r\n {/* Session summary */}\r\n <div className=\"resira-summary\" style={{ marginBottom: 16 }}>\r\n <div className=\"resira-summary-row\">\r\n <span className=\"resira-summary-label\">Service</span>\r\n <span className=\"resira-summary-value\">{checkoutSession.productName}</span>\r\n </div>\r\n <div className=\"resira-summary-row\">\r\n <span className=\"resira-summary-label\">Date</span>\r\n <span className=\"resira-summary-value\">\r\n {new Date(checkoutSession.date + \"T00:00:00\").toLocaleDateString(\"default\", { weekday: \"short\", month: \"short\", day: \"numeric\" })}\r\n </span>\r\n </div>\r\n <div className=\"resira-summary-row\">\r\n <span className=\"resira-summary-label\">Time</span>\r\n <span className=\"resira-summary-value\">\r\n {new Date(checkoutSession.startTime).toLocaleTimeString(\"default\", { hour: \"2-digit\", minute: \"2-digit\", hour12: false })}\r\n {\" – \"}\r\n {new Date(checkoutSession.endTime).toLocaleTimeString(\"default\", { hour: \"2-digit\", minute: \"2-digit\", hour12: false })}\r\n </span>\r\n </div>\r\n <div className=\"resira-summary-row\">\r\n <span className=\"resira-summary-label\">Duration</span>\r\n <span className=\"resira-summary-value\">{checkoutSession.durationMinutes} min</span>\r\n </div>\r\n <div className=\"resira-summary-row\">\r\n <span className=\"resira-summary-label\">{locale.guests}</span>\r\n <span className=\"resira-summary-value\">{checkoutSession.partySize}</span>\r\n </div>\r\n {checkoutSession.promoCode && (\r\n <div className=\"resira-summary-row\">\r\n <span className=\"resira-summary-label\">{locale.discountCode}</span>\r\n <span className=\"resira-summary-value\">{checkoutSession.promoCode}</span>\r\n </div>\r\n )}\r\n <div className=\"resira-summary-divider\" />\r\n <div className=\"resira-summary-row\">\r\n <span className=\"resira-summary-label resira-summary-total\">{locale.total}</span>\r\n <span className=\"resira-summary-value resira-summary-total\">\r\n {formatPrice(checkoutSession.priceCents, checkoutSession.currency)}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Guest form */}\r\n <GuestForm\r\n values={guest}\r\n onChange={setGuest}\r\n errors={formErrors}\r\n />\r\n\r\n {/* Terms checkbox if required by session */}\r\n {checkoutSession.checkoutConfig.termsRequired && (\r\n <div style={{ marginTop: 14 }}>\r\n <WaiverConsent\r\n termsAccepted={termsAccepted}\r\n onTermsChange={setTermsAccepted}\r\n waiverAccepted={false}\r\n onWaiverChange={() => {}}\r\n discountCode=\"\"\r\n onDiscountCodeChange={() => {}}\r\n onPromoValidated={() => {}}\r\n error={termsError ?? undefined}\r\n />\r\n </div>\r\n )}\r\n\r\n {paymentError && (\r\n <div className=\"resira-error\" style={{ padding: \"12px 0\" }}>\r\n <AlertCircleIcon size={18} />\r\n <p className=\"resira-error-message\">{paymentError}</p>\r\n </div>\r\n )}\r\n </>\r\n )}\r\n </>\r\n )}\r\n\r\n {/* ─── Payment step ─── */}\r\n {step === \"payment\" && (\r\n <>\r\n {paymentError && (\r\n <div className=\"resira-error\">\r\n <AlertCircleIcon size={24} />\r\n <p className=\"resira-error-message\">{paymentError}</p>\r\n </div>\r\n )}\r\n\r\n {/* Normal payment — show Stripe form */}\r\n {paymentIntent && paymentIntent.amountNow > 0 && (\r\n <PaymentForm\r\n clientSecret={paymentIntent.clientSecret}\r\n amountNow={paymentIntent.amountNow}\r\n amountAtVenue={paymentIntent.amountAtVenue}\r\n totalAmount={paymentIntent.totalAmount}\r\n currency={paymentIntent.currency}\r\n onSuccess={handlePaymentSuccess}\r\n onError={handlePaymentError}\r\n processing={confirmingPayment}\r\n discountAmount={paymentIntent.discountAmount}\r\n originalPrice={paymentIntent.originalPrice}\r\n promoCodeApplied={paymentIntent.promoCodeApplied}\r\n hideSubmitButton={true}\r\n submitRequestId={paymentSubmitRequestId}\r\n onReadyChange={setPaymentFormReady}\r\n onSubmittingChange={setPaymentFormSubmitting}\r\n />\r\n )}\r\n\r\n {!paymentIntent && !paymentError && (\r\n <div className=\"resira-summary\" style={{ marginTop: 4 }}>\r\n <div className=\"resira-summary-row\">\r\n <span className=\"resira-summary-label\">{locale.payNow}</span>\r\n <span className=\"resira-summary-value\">\r\n {computedPrice ? formatPrice(computedPrice.amountNow, currency) : \"-\"}\r\n </span>\r\n </div>\r\n {computedPrice && computedPrice.amountAtVenue > 0 && (\r\n <div className=\"resira-summary-row\">\r\n <span className=\"resira-summary-label\">{locale.payAtVenue}</span>\r\n <span className=\"resira-summary-value\">\r\n {formatPrice(computedPrice.amountAtVenue, currency)}\r\n </span>\r\n </div>\r\n )}\r\n {computedPrice && (\r\n <>\r\n <div className=\"resira-summary-divider\" />\r\n <div className=\"resira-summary-row\">\r\n <span className=\"resira-summary-label resira-summary-total\">{locale.total}</span>\r\n <span className=\"resira-summary-value resira-summary-total\">\r\n {formatPrice(computedPrice.total, currency)}\r\n </span>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n )}\r\n </>\r\n )}\r\n\r\n {/* ─── Confirmation step ─── */}\r\n {step === \"confirmation\" && (\r\n <div className=\"resira-confirmation\">\r\n <div className=\"resira-confirmation-icon\">\r\n <CheckCircleIcon size={28} />\r\n </div>\r\n <h3 className=\"resira-confirmation-title\">\r\n {domain === \"restaurant\" ? \"Reservation Confirmed\" : locale.bookingConfirmed}\r\n </h3>\r\n <p className=\"resira-confirmation-subtitle\">\r\n {reservation\r\n ? reservation.id.slice(0, 8).toUpperCase()\r\n : paymentIntent?.reservationId?.slice(0, 8).toUpperCase() ?? \"\"}\r\n </p>\r\n\r\n <div className=\"resira-confirmation-details\">\r\n <div className=\"resira-summary\">\r\n {selectedProduct && (\r\n <div className=\"resira-summary-row\">\r\n <span className=\"resira-summary-label\">Service</span>\r\n <span className=\"resira-summary-value\">{selectedProduct.name}</span>\r\n </div>\r\n )}\r\n {guest.guestName && domain === \"restaurant\" && (\r\n <div className=\"resira-summary-row\">\r\n <span className=\"resira-summary-label\">{locale.fullName}</span>\r\n <span className=\"resira-summary-value\">{guest.guestName}</span>\r\n </div>\r\n )}\r\n {selection.startDate && (\r\n <div className=\"resira-summary-row\">\r\n <span className=\"resira-summary-label\">Date</span>\r\n <span className=\"resira-summary-value\">\r\n {new Date(selection.startDate + \"T00:00:00\").toLocaleDateString(\"default\", { weekday: \"short\", month: \"short\", day: \"numeric\" })}\r\n </span>\r\n </div>\r\n )}\r\n {selection.startTime && (\r\n <div className=\"resira-summary-row\">\r\n <span className=\"resira-summary-label\">Time</span>\r\n <span className=\"resira-summary-value\">\r\n {new Date(selection.startTime).toLocaleTimeString(\"default\", { hour: \"2-digit\", minute: \"2-digit\", hour12: false })}\r\n </span>\r\n </div>\r\n )}\r\n <div className=\"resira-summary-row\">\r\n <span className=\"resira-summary-label\">{locale.guests}</span>\r\n <span className=\"resira-summary-value\">{selection.partySize}</span>\r\n </div>\r\n {computedPrice && (\r\n <>\r\n <div className=\"resira-summary-divider\" />\r\n {computedPrice.amountNow > 0 && computedPrice.amountAtVenue > 0 && (\r\n <>\r\n <div className=\"resira-summary-row\">\r\n <span className=\"resira-summary-label\">{locale.payNow}</span>\r\n <span className=\"resira-summary-value\">{formatPrice(computedPrice.amountNow, currency)}</span>\r\n </div>\r\n <div className=\"resira-summary-row\">\r\n <span className=\"resira-summary-label\">{locale.payAtVenue}</span>\r\n <span className=\"resira-summary-value\">{formatPrice(computedPrice.amountAtVenue, currency)}</span>\r\n </div>\r\n </>\r\n )}\r\n <div className=\"resira-summary-row\">\r\n <span className=\"resira-summary-label resira-summary-total\">{locale.total}</span>\r\n <span className=\"resira-summary-value resira-summary-total\">{formatPrice(computedPrice.total, currency)}</span>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Footer navigation — always rendered for stable button positioning */}\r\n <div className=\"resira-widget-footer\">\r\n {/* Back button — always in DOM for stable layout; invisible on first step */}\r\n <button\r\n type=\"button\"\r\n className=\"resira-btn resira-btn--secondary\"\r\n onClick={handleBack}\r\n disabled={footerBusy || currentIndex === 0}\r\n style={currentIndex === 0 || step === \"confirmation\" ? { visibility: \"hidden\" } : undefined}\r\n aria-hidden={currentIndex === 0 || step === \"confirmation\"}\r\n >\r\n {locale.back}\r\n </button>\r\n\r\n {/* Primary action — always present, label/handler changes per step */}\r\n {step === \"confirmation\" ? (\r\n onClose ? (\r\n <button\r\n type=\"button\"\r\n className=\"resira-btn resira-btn--primary\"\r\n onClick={onClose}\r\n >\r\n {locale.done}\r\n </button>\r\n ) : (\r\n <span style={{ visibility: \"hidden\" }} className=\"resira-btn resira-btn--primary\">{locale.continue}</span>\r\n )\r\n ) : step === \"checkout\" ? (\r\n <button\r\n type=\"button\"\r\n className=\"resira-btn resira-btn--primary\"\r\n onClick={() => { void handleCheckoutSubmit(); }}\r\n disabled={footerBusy || checkoutSessionLoading || !!checkoutSessionError}\r\n >\r\n {creatingPayment ? (\r\n <>\r\n <div className=\"resira-spinner\" style={{ width: 16, height: 16 }} />\r\n {locale.processingPayment}\r\n </>\r\n ) : checkoutSession ? (\r\n `${locale.payNow} — ${formatPrice(checkoutSession.priceCents, checkoutSession.currency)}`\r\n ) : (\r\n locale.continue\r\n )}\r\n </button>\r\n ) : (step === \"resource\" || step === \"availability\") ? (\r\n <button\r\n type=\"button\"\r\n className=\"resira-btn resira-btn--primary\"\r\n onClick={() => {\r\n void handleContinue();\r\n }}\r\n disabled={!canContinue || footerBusy}\r\n >\r\n {locale.continue}\r\n </button>\r\n ) : step === \"details\" ? (\r\n <button\r\n type=\"button\"\r\n className=\"resira-btn resira-btn--primary\"\r\n onClick={handleDetailsSubmit}\r\n disabled={footerBusy}\r\n >\r\n {submitting ? (\r\n <>\r\n <div className=\"resira-spinner\" style={{ width: 16, height: 16 }} />\r\n {locale.loading}\r\n </>\r\n ) : domain === \"restaurant\" && !hasPayment ? (\r\n locale.reserveTable\r\n ) : (\r\n locale.continue\r\n )}\r\n </button>\r\n ) : step === \"terms\" ? (\r\n <button\r\n type=\"button\"\r\n className=\"resira-btn resira-btn--primary\"\r\n onClick={hasPayment ? () => {\r\n void handleContinue();\r\n } : handleSubmitNoPayment}\r\n disabled={!canContinue || footerBusy}\r\n >\r\n {creatingPayment ? (\r\n <>\r\n <div className=\"resira-spinner\" style={{ width: 16, height: 16 }} />\r\n {locale.processingPayment}\r\n </>\r\n ) : submitting ? (\r\n <>\r\n <div className=\"resira-spinner\" style={{ width: 16, height: 16 }} />\r\n {locale.loading}\r\n </>\r\n ) : hasPayment ? (\r\n locale.continue\r\n ) : (\r\n locale.bookNow\r\n )}\r\n </button>\r\n ) : step === \"payment\" && !paymentIntent ? (\r\n <button\r\n type=\"button\"\r\n className=\"resira-btn resira-btn--primary\"\r\n onClick={() => {\r\n void handleStartPayment();\r\n }}\r\n disabled={footerBusy}\r\n >\r\n {creatingPayment ? (\r\n <>\r\n <div className=\"resira-spinner\" style={{ width: 16, height: 16 }} />\r\n {locale.processingPayment}\r\n </>\r\n ) : computedPrice ? (\r\n `${locale.payNow} — ${formatPrice(computedPrice.amountNow, currency)}`\r\n ) : (\r\n locale.payNow\r\n )}\r\n </button>\r\n ) : step === \"payment\" && paymentIntent?.amountNow != null && paymentIntent.amountNow > 0 ? (\r\n <button\r\n type=\"button\"\r\n className=\"resira-btn resira-btn--primary\"\r\n onClick={() => setPaymentSubmitRequestId((prev) => prev + 1)}\r\n disabled={paymentActionDisabled}\r\n >\r\n {paymentFormSubmitting || confirmingPayment ? (\r\n <>\r\n <div className=\"resira-spinner\" style={{ width: 16, height: 16 }} />\r\n {locale.processingPayment}\r\n </>\r\n ) : (\r\n `${locale.payNow} — ${formatPrice(paymentIntent.amountNow, paymentIntent.currency)}`\r\n )}\r\n </button>\r\n ) : (\r\n /* Fallback placeholder to hold space (e.g. zero-amount payment auto-advancing) */\r\n <span style={{ visibility: \"hidden\" }} className=\"resira-btn resira-btn--primary\">{locale.continue}</span>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","// ═══════════════════════════════════════════════════════════════\r\n// @resira/ui — BookingModal\r\n// Full-viewport responsive modal with close button.\r\n// Wraps ResiraProvider + ResiraBookingWidget in a portal-free\r\n// overlay that triggers from a \"Book Now\" button.\r\n// ═══════════════════════════════════════════════════════════════\r\n\r\nimport React, { useState, useCallback, useEffect, useRef } from \"react\";\r\nimport { ResiraProvider } from \"../ResiraProvider.js\";\r\nimport { ResiraBookingWidget } from \"../ResiraBookingWidget.js\";\r\nimport { XIcon } from \"../icons.js\";\r\nimport type { ResiraDomain, ResiraProviderConfig } from \"../types.js\";\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Props\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nexport interface BookingModalProps {\r\n /** API key for authentication. */\r\n apiKey: string;\r\n /** Booking domain type. */\r\n domain: ResiraDomain;\r\n /** Optional resource ID (omit for catalog mode). */\r\n resourceId?: string;\r\n /** Configuration overrides. */\r\n config?: ResiraProviderConfig;\r\n /** Checkout session token. When provided, skips to checkout. */\r\n checkoutSessionToken?: string;\r\n /** Custom trigger button — if omitted, uses the default \"Book Now\" button. */\r\n trigger?: React.ReactNode;\r\n /** Custom button label. @default \"Book Now\" */\r\n buttonLabel?: string;\r\n /** Custom button className. */\r\n buttonClassName?: string;\r\n /** Custom button style. */\r\n buttonStyle?: React.CSSProperties;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Component\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nexport function BookingModal({\r\n apiKey,\r\n domain,\r\n resourceId,\r\n config,\r\n checkoutSessionToken,\r\n trigger,\r\n buttonLabel = \"Book Now\",\r\n buttonClassName,\r\n buttonStyle,\r\n}: BookingModalProps) {\r\n const [open, setOpen] = useState(false);\r\n const modalRef = useRef<HTMLDivElement>(null);\r\n const triggerRef = useRef<HTMLButtonElement | HTMLSpanElement>(null);\r\n\r\n const handleOpen = useCallback(() => setOpen(true), []);\r\n const handleClose = useCallback(() => {\r\n setOpen(false);\r\n // Return focus to trigger\r\n requestAnimationFrame(() => {\r\n (triggerRef.current as HTMLElement | null)?.focus();\r\n });\r\n }, []);\r\n\r\n // Lock body scroll when modal is open\r\n useEffect(() => {\r\n if (open) {\r\n const prev = document.body.style.overflow;\r\n document.body.style.overflow = \"hidden\";\r\n return () => {\r\n document.body.style.overflow = prev;\r\n };\r\n }\r\n }, [open]);\r\n\r\n // Close on Escape + focus trap\r\n useEffect(() => {\r\n if (!open) return;\r\n const modal = modalRef.current;\r\n if (!modal) return;\r\n\r\n // Auto-focus first focusable element\r\n requestAnimationFrame(() => {\r\n const first = modal.querySelector<HTMLElement>(\r\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\r\n );\r\n first?.focus();\r\n });\r\n\r\n const handleKey = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\") {\r\n handleClose();\r\n return;\r\n }\r\n // Focus trap\r\n if (e.key === \"Tab\") {\r\n const focusable = modal.querySelectorAll<HTMLElement>(\r\n 'button:not(:disabled), [href], input:not(:disabled), select:not(:disabled), textarea:not(:disabled), [tabindex]:not([tabindex=\"-1\"])'\r\n );\r\n if (focusable.length === 0) return;\r\n const first = focusable[0];\r\n const last = focusable[focusable.length - 1];\r\n if (e.shiftKey) {\r\n if (document.activeElement === first) {\r\n e.preventDefault();\r\n last.focus();\r\n }\r\n } else {\r\n if (document.activeElement === last) {\r\n e.preventDefault();\r\n first.focus();\r\n }\r\n }\r\n }\r\n };\r\n window.addEventListener(\"keydown\", handleKey);\r\n return () => window.removeEventListener(\"keydown\", handleKey);\r\n }, [open, handleClose]);\r\n\r\n return (\r\n <>\r\n {/* Trigger */}\r\n {trigger ? (\r\n <span\r\n ref={triggerRef as React.Ref<HTMLSpanElement>}\r\n onClick={handleOpen}\r\n onKeyDown={(e) => { if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); handleOpen(); } }}\r\n role=\"button\"\r\n tabIndex={0}\r\n style={{ cursor: \"pointer\" }}\r\n >\r\n {trigger}\r\n </span>\r\n ) : (\r\n <button\r\n ref={triggerRef as React.Ref<HTMLButtonElement>}\r\n type=\"button\"\r\n className={buttonClassName || \"resira-book-now-btn\"}\r\n style={buttonStyle}\r\n onClick={handleOpen}\r\n >\r\n {buttonLabel}\r\n </button>\r\n )}\r\n\r\n {/* Modal overlay */}\r\n {open && (\r\n <div\r\n className=\"resira-modal-overlay\"\r\n onClick={handleClose}\r\n role=\"presentation\"\r\n >\r\n <div\r\n ref={modalRef}\r\n className=\"resira-modal-container\"\r\n onClick={(e) => e.stopPropagation()}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-label=\"Booking\"\r\n >\r\n {/* Close button */}\r\n <button\r\n type=\"button\"\r\n className=\"resira-modal-close\"\r\n onClick={handleClose}\r\n aria-label=\"Close booking dialog\"\r\n >\r\n <XIcon size={20} />\r\n </button>\r\n\r\n {/* Provider + widget */}\r\n <ResiraProvider\r\n apiKey={apiKey}\r\n domain={domain}\r\n resourceId={resourceId}\r\n config={config}\r\n checkoutSessionToken={checkoutSessionToken}\r\n onClose={handleClose}\r\n >\r\n <ResiraBookingWidget />\r\n </ResiraProvider>\r\n </div>\r\n </div>\r\n )}\r\n </>\r\n );\r\n}\r\n","// ═══════════════════════════════════════════════════════════════\r\n// @resira/ui — DishShowcase\r\n// A button component that opens a nested modal displaying dishes\r\n// with 3D model preview and AR viewing capabilities.\r\n// ═══════════════════════════════════════════════════════════════\r\n\r\nimport React, { useState, useCallback, useEffect, useRef } from \"react\";\r\nimport type { Dish } from \"@resira/sdk\";\r\nimport { useDish, useDishes } from \"../hooks.js\";\r\nimport { XIcon, CubeIcon, ViewfinderIcon, ChevronLeftIcon } from \"../icons.js\";\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Props\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nexport interface DishShowcaseProps {\r\n /** Single dish ID — when set, opens directly to that dish. */\r\n dishId?: string;\r\n /** Show all dishes in a browsable grid (ignored when dishId is set). */\r\n showAll?: boolean;\r\n /** Filter dishes by category (e.g. \"Starter\", \"Main\"). */\r\n category?: string;\r\n /** Custom CSS class for the trigger button. */\r\n className?: string;\r\n /** Custom inline styles for the trigger button. */\r\n style?: React.CSSProperties;\r\n /** Button content / label. */\r\n children: React.ReactNode;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Helpers\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nfunction formatPrice(cents: number, currency: string): string {\r\n try {\r\n return new Intl.NumberFormat(undefined, {\r\n style: \"currency\",\r\n currency,\r\n minimumFractionDigits: 0,\r\n maximumFractionDigits: 2,\r\n }).format(cents / 100);\r\n } catch {\r\n return `${(cents / 100).toFixed(2)} ${currency}`;\r\n }\r\n}\r\n\r\n/** Check if USDZ AR is likely supported (iOS Safari). */\r\nfunction supportsArQuickLook(): boolean {\r\n if (typeof document === \"undefined\") return false;\r\n const a = document.createElement(\"a\");\r\n return a.relList?.supports?.(\"ar\") ?? false;\r\n}\r\n\r\nfunction supportsModelViewer(): boolean {\r\n if (typeof window === \"undefined\") return false;\r\n return typeof customElements !== \"undefined\" && customElements.get(\"model-viewer\") !== undefined;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Sub-components\r\n// ─────────────────────────────────────────────────────────────\r\n\r\n/** Inline 3D model viewer using <model-viewer> web component. */\r\nfunction ModelViewer3D({\r\n dish,\r\n onClose,\r\n}: {\r\n dish: Dish;\r\n onClose: () => void;\r\n}) {\r\n const model = dish.model;\r\n const arSupported = supportsArQuickLook();\r\n const modelViewerSupported = supportsModelViewer();\r\n\r\n // Handle AR launch via <a rel=\"ar\"> for iOS Quick Look\r\n const arLinkRef = useRef<HTMLAnchorElement>(null);\r\n const handleArClick = useCallback(() => {\r\n arLinkRef.current?.click();\r\n }, []);\r\n\r\n return (\r\n <div className=\"resira-dish-viewer\">\r\n {/* Header */}\r\n <div className=\"resira-dish-viewer-header\">\r\n <button\r\n type=\"button\"\r\n className=\"resira-dish-viewer-back\"\r\n onClick={onClose}\r\n aria-label=\"Back to dishes\"\r\n >\r\n <ChevronLeftIcon size={18} />\r\n <span>Back</span>\r\n </button>\r\n <h3 className=\"resira-dish-viewer-title\">{dish.name}</h3>\r\n </div>\r\n\r\n {/* 3D Viewer area */}\r\n <div className=\"resira-dish-viewer-canvas\">\r\n {model?.glbUrl && modelViewerSupported ? (\r\n <>\r\n {/*\r\n Uses the <model-viewer> web component from Google.\r\n Integrators need to load the script in their page:\r\n <script type=\"module\" src=\"https://ajax.googleapis.com/ajax/libs/model-viewer/4.0/model-viewer.min.js\" />\r\n Falls back to poster image if not available.\r\n */}\r\n {/* @ts-expect-error model-viewer is a web component */}\r\n <model-viewer\r\n src={model.glbUrl}\r\n ios-src={model.usdzUrl || undefined}\r\n poster={model.posterUrl || dish.imageUrl || undefined}\r\n alt={model.alt || dish.name}\r\n camera-controls\r\n touch-action=\"pan-y\"\r\n auto-rotate\r\n ar={arSupported ? true : undefined}\r\n ar-modes=\"webxr scene-viewer quick-look\"\r\n shadow-intensity=\"1\"\r\n style={{\r\n width: \"100%\",\r\n height: \"100%\",\r\n minHeight: \"280px\",\r\n borderRadius: \"12px\",\r\n background: \"var(--resira-bg-subtle, #f8f9fa)\",\r\n }}\r\n />\r\n {/* Hidden AR link fallback for iOS */}\r\n {model.usdzUrl && (\r\n <a\r\n ref={arLinkRef}\r\n rel=\"ar\"\r\n href={model.usdzUrl}\r\n style={{ display: \"none\" }}\r\n >\r\n <img src={model.posterUrl || dish.imageUrl || \"\"} alt=\"\" />\r\n </a>\r\n )}\r\n </>\r\n ) : dish.imageUrl ? (\r\n <div className=\"resira-dish-viewer-fallback\">\r\n <img\r\n src={dish.imageUrl}\r\n alt={dish.name}\r\n className=\"resira-dish-viewer-fallback-img\"\r\n />\r\n <p className=\"resira-dish-viewer-no3d\">\r\n {model?.glbUrl ? \"3D preview is unavailable here. Showing image instead.\" : \"No 3D model available\"}\r\n </p>\r\n </div>\r\n ) : (\r\n <div className=\"resira-dish-viewer-fallback\">\r\n <CubeIcon size={48} />\r\n <p className=\"resira-dish-viewer-no3d\">No preview available</p>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Details */}\r\n <div className=\"resira-dish-viewer-details\">\r\n {dish.description && (\r\n <p className=\"resira-dish-viewer-desc\">{dish.description}</p>\r\n )}\r\n <div className=\"resira-dish-viewer-meta\">\r\n {dish.priceCents != null && dish.currency && (\r\n <span className=\"resira-dish-viewer-price\">\r\n {formatPrice(dish.priceCents, dish.currency)}\r\n </span>\r\n )}\r\n {dish.category && (\r\n <span className=\"resira-dish-viewer-category\">{dish.category}</span>\r\n )}\r\n </div>\r\n {dish.allergens && dish.allergens.length > 0 && (\r\n <div className=\"resira-dish-viewer-allergens\">\r\n {dish.allergens.map((a) => (\r\n <span key={a} className=\"resira-dish-viewer-allergen\">{a}</span>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Action buttons */}\r\n <div className=\"resira-dish-viewer-actions\">\r\n {model?.glbUrl && modelViewerSupported && (\r\n <button\r\n type=\"button\"\r\n className=\"resira-dish-action resira-dish-action--3d\"\r\n onClick={() => {\r\n // model-viewer handles interaction via camera-controls\r\n // This button scrolls to / focuses the viewer\r\n const mv = document.querySelector(\"model-viewer\");\r\n mv?.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\r\n }}\r\n >\r\n <CubeIcon size={16} />\r\n <span>3D Preview</span>\r\n </button>\r\n )}\r\n {arSupported && model?.usdzUrl && (\r\n <button\r\n type=\"button\"\r\n className=\"resira-dish-action resira-dish-action--ar\"\r\n onClick={handleArClick}\r\n >\r\n <ViewfinderIcon size={16} />\r\n <span>View in AR</span>\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n/** A single dish card in the grid. */\r\nfunction DishCard({\r\n dish,\r\n onSelect,\r\n}: {\r\n dish: Dish;\r\n onSelect: (dish: Dish) => void;\r\n}) {\r\n const has3D = !!dish.model?.glbUrl;\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n className=\"resira-dish-card\"\r\n onClick={() => onSelect(dish)}\r\n >\r\n <div className=\"resira-dish-card-image\">\r\n {dish.imageUrl || dish.model?.posterUrl ? (\r\n <img\r\n src={dish.imageUrl || dish.model!.posterUrl!}\r\n alt={dish.name}\r\n loading=\"lazy\"\r\n />\r\n ) : (\r\n <div className=\"resira-dish-card-placeholder\">\r\n <CubeIcon size={28} />\r\n </div>\r\n )}\r\n {has3D && (\r\n <span className=\"resira-dish-card-badge\">\r\n <CubeIcon size={12} />\r\n 3D\r\n </span>\r\n )}\r\n </div>\r\n <div className=\"resira-dish-card-info\">\r\n <span className=\"resira-dish-card-name\">{dish.name}</span>\r\n {dish.priceCents != null && dish.currency && (\r\n <span className=\"resira-dish-card-price\">\r\n {formatPrice(dish.priceCents, dish.currency)}\r\n </span>\r\n )}\r\n </div>\r\n </button>\r\n );\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Main component\r\n// ─────────────────────────────────────────────────────────────\r\n\r\nexport function DishShowcase({\r\n dishId,\r\n showAll = false,\r\n category,\r\n className,\r\n style,\r\n children,\r\n}: DishShowcaseProps) {\r\n const [open, setOpen] = useState(false);\r\n const [selectedDish, setSelectedDish] = useState<Dish | null>(null);\r\n const modalRef = useRef<HTMLDivElement>(null);\r\n const triggerRef = useRef<HTMLButtonElement>(null);\r\n\r\n // Fetch single dish if dishId provided\r\n const { dish: singleDish, loading: singleLoading, error: singleError } = useDish(\r\n open && dishId ? dishId : undefined,\r\n );\r\n\r\n // Fetch all dishes if showAll or no dishId\r\n const shouldLoadAllDishes = open && (!dishId || showAll);\r\n const { dishes: allDishes, loading: allLoading, error: allError } = useDishes(shouldLoadAllDishes);\r\n\r\n // Determine which mode we're in\r\n const isSingleMode = !!dishId;\r\n const loading = isSingleMode ? singleLoading : allLoading;\r\n const error = isSingleMode ? singleError : allError;\r\n\r\n // Filter dishes by category if needed\r\n const filteredDishes = category\r\n ? allDishes.filter((d) => d.category?.toLowerCase() === category.toLowerCase())\r\n : allDishes;\r\n\r\n // When single dish loads, go straight to viewer\r\n useEffect(() => {\r\n if (singleDish && isSingleMode && open) {\r\n setSelectedDish(singleDish);\r\n }\r\n }, [singleDish, isSingleMode, open]);\r\n\r\n const handleOpen = useCallback(() => {\r\n setOpen(true);\r\n setSelectedDish(null);\r\n }, []);\r\n\r\n const handleClose = useCallback(() => {\r\n setOpen(false);\r\n setSelectedDish(null);\r\n requestAnimationFrame(() => {\r\n triggerRef.current?.focus();\r\n });\r\n }, []);\r\n\r\n const handleSelectDish = useCallback((dish: Dish) => {\r\n setSelectedDish(dish);\r\n }, []);\r\n\r\n const handleBackToGrid = useCallback(() => {\r\n setSelectedDish(null);\r\n }, []);\r\n\r\n // Body scroll lock\r\n useEffect(() => {\r\n if (open) {\r\n const prev = document.body.style.overflow;\r\n document.body.style.overflow = \"hidden\";\r\n return () => {\r\n document.body.style.overflow = prev;\r\n };\r\n }\r\n }, [open]);\r\n\r\n // Escape key + focus trap\r\n useEffect(() => {\r\n if (!open) return;\r\n const modal = modalRef.current;\r\n if (!modal) return;\r\n\r\n requestAnimationFrame(() => {\r\n const first = modal.querySelector<HTMLElement>(\r\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\r\n );\r\n first?.focus();\r\n });\r\n\r\n const handleKey = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\") {\r\n if (selectedDish && !isSingleMode) {\r\n setSelectedDish(null);\r\n } else {\r\n handleClose();\r\n }\r\n return;\r\n }\r\n if (e.key === \"Tab\") {\r\n const focusable = modal.querySelectorAll<HTMLElement>(\r\n 'button:not(:disabled), [href], input:not(:disabled), select:not(:disabled), textarea:not(:disabled), [tabindex]:not([tabindex=\"-1\"])',\r\n );\r\n if (focusable.length === 0) return;\r\n const first = focusable[0];\r\n const last = focusable[focusable.length - 1];\r\n if (e.shiftKey) {\r\n if (document.activeElement === first) {\r\n e.preventDefault();\r\n last.focus();\r\n }\r\n } else {\r\n if (document.activeElement === last) {\r\n e.preventDefault();\r\n first.focus();\r\n }\r\n }\r\n }\r\n };\r\n window.addEventListener(\"keydown\", handleKey);\r\n return () => window.removeEventListener(\"keydown\", handleKey);\r\n }, [open, selectedDish, isSingleMode, handleClose]);\r\n\r\n return (\r\n <>\r\n {/* Trigger button */}\r\n <button\r\n ref={triggerRef}\r\n type=\"button\"\r\n className={className || \"resira-dish-showcase-btn\"}\r\n style={style}\r\n onClick={handleOpen}\r\n aria-haspopup=\"dialog\"\r\n aria-expanded={open}\r\n >\r\n {children}\r\n </button>\r\n\r\n {/* Nested modal overlay */}\r\n {open && (\r\n <div\r\n className=\"resira-dish-overlay\"\r\n onClick={handleClose}\r\n role=\"presentation\"\r\n >\r\n <div\r\n ref={modalRef}\r\n className=\"resira-dish-modal\"\r\n onClick={(e) => e.stopPropagation()}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-label={selectedDish ? `${selectedDish.name} dish preview` : \"Dish showcase\"}\r\n >\r\n {/* Close button */}\r\n <button\r\n type=\"button\"\r\n className=\"resira-dish-modal-close\"\r\n onClick={handleClose}\r\n aria-label=\"Close dish showcase\"\r\n >\r\n <XIcon size={18} />\r\n </button>\r\n\r\n {/* Loading state */}\r\n {loading && (\r\n <div className=\"resira-dish-loading\" role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\r\n <div className=\"resira-dish-spinner\" aria-hidden=\"true\" />\r\n <span>Loading dishes…</span>\r\n </div>\r\n )}\r\n\r\n {/* Error state */}\r\n {error && !loading && (\r\n <div className=\"resira-dish-error\" role=\"alert\" aria-live=\"assertive\">\r\n <p>{error}</p>\r\n </div>\r\n )}\r\n\r\n {/* Content */}\r\n {!loading && !error && (\r\n <>\r\n {selectedDish ? (\r\n <ModelViewer3D\r\n dish={selectedDish}\r\n onClose={isSingleMode ? handleClose : handleBackToGrid}\r\n />\r\n ) : (\r\n <div className=\"resira-dish-grid-container\">\r\n <div className=\"resira-dish-grid-header\">\r\n <h2 className=\"resira-dish-grid-title\">\r\n {category ? `${category}` : \"Our Dishes\"}\r\n </h2>\r\n <p className=\"resira-dish-grid-subtitle\">\r\n Tap a dish to preview in 3D\r\n </p>\r\n </div>\r\n {filteredDishes.length === 0 ? (\r\n <div className=\"resira-dish-empty\">\r\n <CubeIcon size={36} />\r\n <p>No dishes available</p>\r\n </div>\r\n ) : (\r\n <div className=\"resira-dish-grid\">\r\n {filteredDishes.map((dish) => (\r\n <DishCard\r\n key={dish.id}\r\n dish={dish}\r\n onSelect={handleSelectDish}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </>\r\n );\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/types.ts","../src/theme.ts","../src/ResiraProvider.tsx","../src/hooks.ts","../src/icons.tsx","../src/components/BookingCalendar.tsx","../src/components/TimeSlotPicker.tsx","../src/components/ResourcePicker.tsx","../src/components/ProductSelector.tsx","../src/components/GuestForm.tsx","../src/components/WaiverConsent.tsx","../src/components/PaymentForm.tsx","../src/components/ReservationSummary.tsx","../src/ResiraBookingWidget.tsx","../src/components/BookingModal.tsx","../src/components/DishShowcase.tsx"],"names":["useState","useCallback","useEffect","Resira","jsx","useMemo","jsxs","toDateStr","getDaysInMonth","getFirstDayOffset","ChevronLeftIcon","ChevronRightIcon","Fragment","formatPrice","formatDuration","PLACEHOLDER_IMG","useRef","nightsBetween"],"mappings":"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","file":"index.js","sourcesContent":["import type React from \"react\";\nimport type { Resira, Availability, Reservation, CreateReservationRequest, Product, PricingModel, PaymentIntentResponse, RefundRule } from \"@resira/sdk\";\n\n/** Supported booking domain types. */\nimport type { WeightedBaseUrl } from \"@resira/sdk\";\n\nexport type ResiraDomain = \"rental\" | \"restaurant\" | \"watersport\" | \"service\";\n\n/** Layout direction for the product/service selector. */\nexport type ServiceLayout = \"vertical\" | \"horizontal\";\n\n/** Domain-specific configuration. */\nexport interface DomainConfig {\n /** Label for the domain (e.g. \"Vacation Rental\", \"Restaurant\"). */\n label?: string;\n /** Default party size. */\n defaultPartySize?: number;\n /** Minimum party size. */\n minPartySize?: number;\n /** Maximum party size. */\n maxPartySize?: number;\n /** Minimum stay in nights (rental only). */\n minStay?: number;\n /** Default duration in minutes (service/watersport). */\n defaultDuration?: number;\n /** Available durations in minutes (service/watersport). */\n availableDurations?: number[];\n /** Allow selecting multiple resources in one booking. */\n allowMultiSelect?: boolean;\n}\n\n/** Theme color palette — maps to CSS custom properties. */\nexport interface ResiraTheme {\n /** Primary brand color. @default \"#2563eb\" */\n primaryColor?: string;\n /** Primary color on hover. @default \"#1d4ed8\" */\n primaryHover?: string;\n /** Text on primary background. @default \"#ffffff\" */\n primaryForeground?: string;\n /** Accent/secondary color. @default \"#f0f4ff\" */\n accentColor?: string;\n /** Accent foreground. @default \"#1e40af\" */\n accentForeground?: string;\n /** Error color. @default \"#dc2626\" */\n errorColor?: string;\n /** Success color. @default \"#16a34a\" */\n successColor?: string;\n /** Warning color. @default \"#d97706\" */\n warningColor?: string;\n /** Default text color. @default \"#0f172a\" */\n textColor?: string;\n /** Muted/secondary text. @default \"#64748b\" */\n mutedColor?: string;\n /** Surface / card background. @default \"#ffffff\" */\n surfaceColor?: string;\n /** Subtle background (e.g. form inputs). @default \"#f8fafc\" */\n backgroundSubtle?: string;\n /** Border color. @default \"#e2e8f0\" */\n borderColor?: string;\n /** Card border radius. @default \"12px\" */\n borderRadius?: string;\n /** Font family. @default \"system-ui, -apple-system, sans-serif\" */\n fontFamily?: string;\n /** Card component radius. @default \"14px\" */\n cardRadius?: string;\n /** Button radius. @default \"10px\" */\n buttonRadius?: string;\n /** Input radius. @default \"10px\" */\n inputRadius?: string;\n /** Chip/pill radius. @default \"20px\" */\n chipRadius?: string;\n /** Base spacing unit. @default \"16px\" */\n spacing?: string;\n /** Small shadow. */\n shadowSm?: string;\n /** Medium shadow. */\n shadowMd?: string;\n /** Large shadow. */\n shadowLg?: string;\n /** Calendar day cell size. @default \"36px\" */\n calendarDaySize?: string;\n /** Minimum width for time slot cells. @default \"80px\" */\n slotMinWidth?: string;\n}\n\n/** Internationalization strings. Override any label. */\nexport interface ResiraLocale {\n /** @default \"Select dates\" */\n selectDates?: string;\n /** @default \"Select a time\" */\n selectTime?: string;\n /** @default \"Guest details\" */\n guestDetails?: string;\n /** @default \"Confirm booking\" */\n confirmBooking?: string;\n /** @default \"Booking confirmed\" */\n bookingConfirmed?: string;\n /** @default \"Full name\" */\n fullName?: string;\n /** @default \"Email\" */\n email?: string;\n /** @default \"Phone\" */\n phone?: string;\n /** @default \"Party size\" */\n partySize?: string;\n /** @default \"Notes\" */\n notes?: string;\n /** @default \"Check-in\" */\n checkIn?: string;\n /** @default \"Check-out\" */\n checkOut?: string;\n /** @default \"Guests\" */\n guests?: string;\n /** @default \"per night\" */\n perNight?: string;\n /** @default \"total\" */\n total?: string;\n /** @default \"Available\" */\n available?: string;\n /** @default \"Unavailable\" */\n unavailable?: string;\n /** @default \"Loading…\" */\n loading?: string;\n /** @default \"Something went wrong\" */\n errorGeneric?: string;\n /** @default \"Continue\" */\n continue?: string;\n /** @default \"Back\" */\n back?: string;\n /** @default \"Book now\" */\n bookNow?: string;\n /** @default \"nights\" */\n nights?: string;\n /** @default \"Duration\" */\n duration?: string;\n /** @default \"minutes\" */\n minutes?: string;\n /** @default \"No availability\" */\n noAvailability?: string;\n /** @default \"Required\" */\n required?: string;\n /** @default \"Invalid email\" */\n invalidEmail?: string;\n /** @default \"Choose a service\" */\n chooseService?: string;\n /** @default \"per session\" */\n perSession?: string;\n /** @default \"per person\" */\n perPerson?: string;\n /** @default \"Payment\" */\n payment?: string;\n /** @default \"Pay now\" */\n payNow?: string;\n /** @default \"Pay at venue\" */\n payAtVenue?: string;\n /** @default \"Processing payment…\" */\n processingPayment?: string;\n /** @default \"Payment failed\" */\n paymentFailed?: string;\n /** @default \"Terms & conditions\" */\n termsTitle?: string;\n /** @default \"I accept the terms and conditions\" */\n termsAccept?: string;\n /** @default \"I accept the waiver and release of liability\" */\n waiverAccept?: string;\n /** @default \"You must accept the terms to continue\" */\n termsRequired?: string;\n /** @default \"Discount code\" */\n discountCode?: string;\n /** @default \"Enter code\" */\n discountPlaceholder?: string;\n /** @default \"Apply\" */\n discountApply?: string;\n /** @default \"Code applied!\" */\n discountApplied?: string;\n /** @default \"Invalid code\" */\n discountInvalid?: string;\n /** @default \"Discount\" */\n discountLabel?: string;\n /** @default \"Original\" */\n originalPrice?: string;\n /** @default \"Cancellation policy\" */\n refundPolicyTitle?: string;\n /** @default \"Close\" */\n close?: string;\n /** @default \"Done\" */\n done?: string;\n /** @default \"Phone or email required\" */\n contactRequired?: string;\n /** @default \"Please provide at least a phone number or email\" */\n contactHint?: string;\n /** @default \"Allergies, special requests...\" */\n restaurantNotesPlaceholder?: string;\n /** @default \"Reserve a table\" */\n reserveTable?: string;\n /** @default \"Reservation for\" */\n reservationFor?: string;\n}\n\n/** Default English locale. */\nexport const DEFAULT_LOCALE: Required<ResiraLocale> = {\n selectDates: \"Select dates\",\n selectTime: \"Select a time\",\n guestDetails: \"Guest details\",\n confirmBooking: \"Confirm booking\",\n bookingConfirmed: \"Booking confirmed\",\n fullName: \"Full name\",\n email: \"Email\",\n phone: \"Phone\",\n partySize: \"Party size\",\n notes: \"Notes\",\n checkIn: \"Check-in\",\n checkOut: \"Check-out\",\n guests: \"Guests\",\n perNight: \"per night\",\n total: \"total\",\n available: \"Available\",\n unavailable: \"Unavailable\",\n loading: \"Loading…\",\n errorGeneric: \"Something went wrong\",\n continue: \"Continue\",\n back: \"Back\",\n bookNow: \"Book now\",\n nights: \"nights\",\n duration: \"Duration\",\n minutes: \"minutes\",\n noAvailability: \"No availability\",\n required: \"Required\",\n invalidEmail: \"Invalid email\",\n chooseService: \"Choose a service\",\n perSession: \"per session\",\n perPerson: \"per person\",\n payment: \"Payment\",\n payNow: \"Pay now\",\n payAtVenue: \"Pay at venue\",\n processingPayment: \"Processing payment…\",\n paymentFailed: \"Payment failed\",\n termsTitle: \"Terms & conditions\",\n termsAccept: \"I accept the terms and conditions\",\n waiverAccept: \"I accept the waiver and release of liability\",\n termsRequired: \"You must accept the terms to continue\",\n discountCode: \"Discount code\",\n discountPlaceholder: \"Enter code\",\n discountApply: \"Apply\",\n discountApplied: \"Code applied!\",\n discountInvalid: \"Invalid code\",\n discountLabel: \"Discount\",\n originalPrice: \"Original\",\n refundPolicyTitle: \"Cancellation policy\",\n close: \"Close\",\n done: \"Done\",\n contactRequired: \"Phone or email required\",\n contactHint: \"Please provide at least a phone number or email\",\n restaurantNotesPlaceholder: \"Allergies, special requests...\",\n reserveTable: \"Reserve a table\",\n reservationFor: \"Reservation for\",\n};\n\n// ─────────────────────────────────────────────────────────────\n// Provider config\n// ─────────────────────────────────────────────────────────────\n\n/** CSS class name overrides for deep styling customization. */\nexport interface ResiraClassNames {\n /** Root widget wrapper. */\n root?: string;\n /** Step indicator bar. */\n steps?: string;\n /** Widget header area. */\n header?: string;\n /** Widget body area. */\n body?: string;\n /** Widget footer area. */\n footer?: string;\n /** Service/product card. */\n serviceCard?: string;\n /** Service/product card when selected. */\n serviceCardSelected?: string;\n /** Service list container. */\n serviceList?: string;\n /** Calendar container. */\n calendar?: string;\n /** Calendar day cell. */\n calendarDay?: string;\n /** Time slot button. */\n timeSlot?: string;\n /** Time slot button when selected. */\n timeSlotSelected?: string;\n /** Duration option button. */\n durationOption?: string;\n /** Party size control. */\n partySize?: string;\n /** Primary action button. */\n primaryButton?: string;\n /** Secondary action button. */\n secondaryButton?: string;\n /** Form field wrapper. */\n field?: string;\n /** Form input. */\n fieldInput?: string;\n /** Price preview panel. */\n pricePreview?: string;\n}\n\n/** Pre-filled selection data for deeplink integration. */\nexport interface DeeplinkSelection {\n /** Pre-selected product/service ID. */\n productId?: string;\n /** Pre-selected date (YYYY-MM-DD). */\n date?: string;\n /** Pre-selected party size. */\n partySize?: number;\n /** Pre-selected duration in minutes. */\n duration?: number;\n}\n\n/** Pre-filled guest data for deeplink integration. */\nexport interface DeeplinkGuest {\n /** Guest name. */\n name?: string;\n /** Guest email. */\n email?: string;\n /** Guest phone. */\n phone?: string;\n /** Notes. */\n notes?: string;\n}\n\n/** Configuration passed to ResiraProvider. */\nexport interface ResiraProviderConfig {\n /** Theme overrides. */\n theme?: ResiraTheme;\n /** Locale / label overrides. */\n locale?: ResiraLocale;\n /** Domain-specific configuration overrides. */\n domainConfig?: DomainConfig;\n /** CSS class name overrides for full styling control. */\n classNames?: ResiraClassNames;\n /** Layout direction for services. @default \"vertical\" */\n serviceLayout?: ServiceLayout;\n /** Number of services visible before scrolling. @default 4 */\n visibleServiceCount?: number;\n /** Group services by linked equipment category. @default true */\n groupServicesByCategory?: boolean;\n /** Custom render function for service cards. Receives product and selected state. */\n renderServiceCard?: (product: Product, selected: boolean) => React.ReactNode;\n /** API base URL override (defaults to SDK default). */\n baseUrl?: string;\n /** Weighted API origins for client-side traffic splitting. */\n baseUrls?: Array<string | WeightedBaseUrl>;\n /** Stripe publishable key for payment processing. */\n stripePublishableKey?: string;\n /** Custom terms & conditions text or URL. */\n termsText?: string;\n /** Custom waiver text. */\n waiverText?: string;\n /** Whether to show the waiver checkbox. */\n showWaiver?: boolean;\n /** Whether to show the terms checkbox. */\n showTerms?: boolean;\n /** Whether to show remaining capacity labels in time slots. @default false */\n showRemainingSpots?: boolean;\n /** Percentage of total to charge upfront (0-100). Default 100. */\n depositPercent?: number;\n /** Whether to show the step indicator bar. @default true */\n showStepIndicator?: boolean;\n /** Pre-fill booking data for deeplink integration. */\n deeplink?: DeeplinkSelection;\n /** Pre-fill guest information. */\n deeplinkGuest?: DeeplinkGuest;\n /** Called when the booking step changes. */\n onStepChange?: (step: BookingStep) => void;\n /** Called when a booking is successfully completed. */\n onBookingComplete?: (data: { reservationId?: string; product?: Product; selection: BookingSelection; guest: GuestFormValues }) => void;\n /** Called when an error occurs during the booking flow. */\n onError?: (code: string, message: string) => void;\n}\n\n/** Props for the ResiraProvider component. */\nexport interface ResiraProviderProps {\n /** API key for authentication. */\n apiKey: string;\n /** Resource ID to book. Optional — omit to enable catalog mode (multi-resource picker). */\n resourceId?: string;\n /** Booking domain type. */\n domain: ResiraDomain;\n /** Configuration overrides. */\n config?: ResiraProviderConfig;\n /** Checkout session token. When provided, skips service selection and opens directly into checkout. */\n checkoutSessionToken?: string;\n /** Callback when the modal/widget should close. */\n onClose?: () => void;\n /** Child components. */\n children: React.ReactNode;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Internal context value\n// ─────────────────────────────────────────────────────────────\n\n/** Shape of the Resira context available to all child components. */\nexport interface ResiraContextValue {\n /** Instantiated SDK client. */\n client: Resira;\n /** Initial resource ID (may be undefined in catalog mode). */\n resourceId?: string;\n /** Currently active resource ID (set after user picks from catalog). */\n activeResourceId: string | undefined;\n /** Set the active resource ID. */\n setActiveResourceId: (id: string) => void;\n /** Whether catalog/multi-resource mode is enabled. */\n catalogMode: boolean;\n /** Whether multiple resources can be selected at once. */\n allowMultiSelect: boolean;\n /** Domain type. */\n domain: ResiraDomain;\n /** Resolved theme. */\n theme: Required<ResiraTheme>;\n /** Resolved locale. */\n locale: Required<ResiraLocale>;\n /** Resolved domain config. */\n domainConfig: DomainConfig;\n /** Stripe publishable key. */\n stripePublishableKey?: string;\n /** Custom terms text. */\n termsText?: string;\n /** Custom waiver text. */\n waiverText?: string;\n /** Whether to show the waiver checkbox. */\n showWaiver: boolean;\n /** Whether to show the terms checkbox. */\n showTerms: boolean;\n /** Whether to show remaining capacity labels in time slots. */\n showRemainingSpots: boolean;\n /** Deposit percentage (0-100). */\n depositPercent: number;\n /** Refund policy rules from property config. */\n refundPolicy: RefundRule[];\n /** Callback when the modal should close. */\n onClose?: () => void;\n /** CSS class name overrides. */\n classNames: ResiraClassNames;\n /** Layout direction for service cards. */\n serviceLayout: ServiceLayout;\n /** Number of visible service cards before scroll. */\n visibleServiceCount: number;\n /** Whether services should be grouped by linked equipment category. */\n groupServicesByCategory: boolean;\n /** Custom render function for service cards. */\n renderServiceCard?: (product: Product, selected: boolean) => React.ReactNode;\n /** Whether the step indicator bar is visible. */\n showStepIndicator: boolean;\n /** Pre-fill booking data for deeplink integration. */\n deeplink?: DeeplinkSelection;\n /** Pre-fill guest information. */\n deeplinkGuest?: DeeplinkGuest;\n /** Called when the booking step changes. */\n onStepChange?: (step: BookingStep) => void;\n /** Called when a booking is successfully completed. */\n onBookingComplete?: (data: { reservationId?: string; product?: Product; selection: BookingSelection; guest: GuestFormValues }) => void;\n /** Called when an error occurs during the booking flow. */\n onError?: (code: string, message: string) => void;\n /** Checkout session token — when provided, the widget skips to checkout. */\n checkoutSessionToken?: string;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Widget state\n// ─────────────────────────────────────────────────────────────\n\n/** Steps in the booking flow. */\nexport type BookingStep = \"resource\" | \"availability\" | \"details\" | \"terms\" | \"payment\" | \"confirmation\" | \"checkout\";\n\n/** Selection state from the availability step. */\nexport interface BookingSelection {\n /** Selected start date (YYYY-MM-DD). */\n startDate?: string;\n /** Selected end date (YYYY-MM-DD). */\n endDate?: string;\n /** Selected time slot start (ISO 8601). */\n startTime?: string;\n /** Selected time slot end (ISO 8601). */\n endTime?: string;\n /** Party size. */\n partySize: number;\n /** Duration in minutes (watersport/service). */\n duration?: number;\n /** Selected product/service ID. */\n productId?: string;\n /** Discount code (optional, no server validation yet). */\n discountCode?: string;\n}\n\n/** Guest form values. */\nexport interface GuestFormValues {\n guestName: string;\n guestEmail: string;\n guestPhone: string;\n notes: string;\n}\n\n/** Validation errors for guest form fields. */\nexport type GuestFormErrors = Partial<Record<keyof GuestFormValues, string>>;\n\n// ─────────────────────────────────────────────────────────────\n// Re-exports from SDK for convenience\n// ─────────────────────────────────────────────────────────────\n\nexport type { Availability, Reservation, CreateReservationRequest, PublicResource, ResourceListResponse, ResourceImage, ResourceImageDisplaySettings, Product, ProductImage, ProductListResponse, ProductCategory, PricingModel, DurationPrice, RiderTierPrice, PaymentIntentResponse, ConfirmPaymentResponse, CreatePaymentIntentRequest, ConfirmPaymentRequest, PropertyConfig, ValidatePromoCodeResponse, PromoCode, RefundRule, Dish, DishModel, DishResponse, DishListResponse, CheckoutSession, CheckoutSessionResponse, CreateCheckoutSessionRequest, CreateCheckoutSessionResponse, CheckoutConfig, ProductVariant } from \"@resira/sdk\";\n","// ═══════════════════════════════════════════════════════════════\n// @resira/ui — Theme utilities\n// ═══════════════════════════════════════════════════════════════\n\nimport type { ResiraTheme } from \"./types.js\";\n\n/** Default theme values. */\nexport const DEFAULT_THEME: Required<ResiraTheme> = {\n primaryColor: \"#2563eb\",\n primaryHover: \"#1d4ed8\",\n primaryForeground: \"#ffffff\",\n accentColor: \"#f0f4ff\",\n accentForeground: \"#1e40af\",\n errorColor: \"#dc2626\",\n successColor: \"#16a34a\",\n warningColor: \"#d97706\",\n textColor: \"#0f172a\",\n mutedColor: \"#64748b\",\n surfaceColor: \"#ffffff\",\n backgroundSubtle: \"#f8fafc\",\n borderColor: \"#e2e8f0\",\n borderRadius: \"12px\",\n fontFamily: \"system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif\",\n // Extended token set\n cardRadius: \"14px\",\n buttonRadius: \"10px\",\n inputRadius: \"10px\",\n chipRadius: \"20px\",\n spacing: \"16px\",\n shadowSm: \"0 1px 3px rgba(0,0,0,0.06)\",\n shadowMd: \"0 4px 12px rgba(0,0,0,0.08)\",\n shadowLg: \"0 8px 30px rgba(0,0,0,0.1)\",\n calendarDaySize: \"36px\",\n slotMinWidth: \"80px\",\n};\n\n/**\n * Merge user-supplied theme with defaults, producing a complete theme.\n */\nexport function resolveTheme(overrides?: ResiraTheme): Required<ResiraTheme> {\n if (!overrides) return DEFAULT_THEME;\n return { ...DEFAULT_THEME, ...overrides };\n}\n\n/**\n * Generate CSS custom properties from a theme object.\n * Returns a CSSProperties-compatible object.\n */\nexport function themeToCSS(theme: Required<ResiraTheme>): Record<string, string> {\n return {\n \"--resira-primary\": theme.primaryColor,\n \"--resira-primary-hover\": theme.primaryHover,\n \"--resira-primary-fg\": theme.primaryForeground,\n \"--resira-accent\": theme.accentColor,\n \"--resira-accent-fg\": theme.accentForeground,\n \"--resira-error\": theme.errorColor,\n \"--resira-success\": theme.successColor,\n \"--resira-warning\": theme.warningColor,\n \"--resira-text\": theme.textColor,\n \"--resira-muted\": theme.mutedColor,\n \"--resira-surface\": theme.surfaceColor,\n \"--resira-bg-subtle\": theme.backgroundSubtle,\n \"--resira-border\": theme.borderColor,\n \"--resira-radius\": theme.borderRadius,\n \"--resira-font\": theme.fontFamily,\n \"--resira-card-radius\": theme.cardRadius,\n \"--resira-btn-radius\": theme.buttonRadius,\n \"--resira-input-radius\": theme.inputRadius,\n \"--resira-chip-radius\": theme.chipRadius,\n \"--resira-spacing\": theme.spacing,\n \"--resira-shadow-sm\": theme.shadowSm,\n \"--resira-shadow-md\": theme.shadowMd,\n \"--resira-shadow-lg\": theme.shadowLg,\n \"--resira-cal-day-size\": theme.calendarDaySize,\n \"--resira-slot-min-w\": theme.slotMinWidth,\n };\n}\n","import React, { createContext, useContext, useMemo, useState, useCallback, useEffect } from \"react\";\nimport { Resira } from \"@resira/sdk\";\nimport type { PropertyConfig } from \"@resira/sdk\";\nimport type { RefundRule } from \"@resira/sdk\";\nimport type {\n ResiraContextValue,\n ResiraProviderProps,\n DomainConfig,\n ResiraDomain,\n ResiraClassNames,\n DeeplinkSelection,\n DeeplinkGuest,\n BookingStep,\n} from \"./types.js\";\nimport { DEFAULT_LOCALE } from \"./types.js\";\nimport { resolveTheme, themeToCSS } from \"./theme.js\";\n\nconst ResiraContext = createContext<ResiraContextValue | null>(null);\n\n/** Access the Resira context. Throws if used outside ResiraProvider. */\nexport function useResira(): ResiraContextValue {\n const ctx = useContext(ResiraContext);\n if (!ctx) {\n throw new Error(\n \"useResira must be used within a <ResiraProvider>. \" +\n \"Wrap your component tree with <ResiraProvider apiKey={...} resourceId={...} domain={...}>.\",\n );\n }\n return ctx;\n}\n\nconst DOMAIN_DEFAULTS: Record<ResiraDomain, DomainConfig> = {\n rental: {\n label: \"Vacation Rental\",\n defaultPartySize: 2,\n minPartySize: 1,\n maxPartySize: 20,\n minStay: 1,\n },\n restaurant: {\n label: \"Restaurant\",\n defaultPartySize: 2,\n minPartySize: 1,\n maxPartySize: 12,\n },\n watersport: {\n label: \"Water Sport\",\n defaultPartySize: 1,\n minPartySize: 1,\n maxPartySize: 10,\n defaultDuration: 60,\n availableDurations: [30, 60, 90, 120],\n },\n service: {\n label: \"Service\",\n defaultPartySize: 1,\n minPartySize: 1,\n maxPartySize: 1,\n defaultDuration: 60,\n availableDurations: [30, 45, 60, 90],\n },\n};\n\n// ─────────────────────────────────────────────────────────────\n// Provider component\n// ─────────────────────────────────────────────────────────────\n\n/**\n * ResiraProvider — root of the @resira/ui component tree.\n *\n * Initializes the SDK client and provides domain configuration,\n * theme, and locale to all child components.\n *\n * ```tsx\n * <ResiraProvider apiKey=\"resira_live_…\" resourceId=\"prop-1\" domain=\"rental\">\n * <ResiraBookingWidget />\n * </ResiraProvider>\n * ```\n */\nexport function ResiraProvider({\n apiKey,\n resourceId,\n domain,\n config,\n checkoutSessionToken,\n onClose,\n children,\n}: ResiraProviderProps) {\n // Memoize the SDK client — only re-create when key or URL change.\n // Base URL resolution order:\n // 1. config.baseUrl prop\n // 2. config.baseUrls prop\n // 3. NEXT_PUBLIC_RESIRA_API_ENDPOINTS / NEXT_PUBLIC_RESIRA_URL (handled inside the SDK)\n // 4. Hard-coded production split\n const client = useMemo(\n () =>\n new Resira({\n apiKey,\n baseUrl: config?.baseUrl,\n baseUrls: config?.baseUrls,\n }),\n [apiKey, config?.baseUrl, config?.baseUrls],\n );\n\n // Resolve theme\n const theme = useMemo(() => resolveTheme(config?.theme), [config?.theme]);\n\n // Resolve locale\n const locale = useMemo(\n () => ({ ...DEFAULT_LOCALE, ...config?.locale }) as Required<typeof DEFAULT_LOCALE>,\n [config?.locale],\n );\n\n // Resolve domain config\n const domainConfig = useMemo(\n () => ({ ...DOMAIN_DEFAULTS[domain], ...config?.domainConfig }),\n [domain, config?.domainConfig],\n );\n\n // Catalog mode: no resourceId → user picks from catalog\n const catalogMode = !resourceId;\n const allowMultiSelect = domainConfig.allowMultiSelect ?? false;\n\n // ── Auto-fetch property config (Stripe key, deposit %, etc.) ──\n const [remoteConfig, setRemoteConfig] = useState<PropertyConfig | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n client\n .getConfig()\n .then((cfg) => {\n if (!cancelled) setRemoteConfig(cfg);\n })\n .catch(() => {\n // Non-fatal: widget works without remote config, just no Stripe\n });\n return () => {\n cancelled = true;\n };\n }, [client]);\n\n // Payment & terms config — manual prop overrides auto-fetched value\n const stripePublishableKey =\n config?.stripePublishableKey ?? remoteConfig?.stripePublishableKey ?? undefined;\n const termsText = config?.termsText ?? (remoteConfig as Record<string, unknown>)?.termsText as string | undefined;\n const waiverText = config?.waiverText;\n const showWaiver = config?.showWaiver ?? false;\n // If backend says termsRequired=true, automatically show terms checkbox\n const remoteTermsRequired = (remoteConfig as Record<string, unknown>)?.termsRequired as boolean | undefined;\n const showTerms = config?.showTerms ?? remoteTermsRequired ?? true;\n const showRemainingSpots = config?.showRemainingSpots ?? false;\n const depositPercent =\n config?.depositPercent ?? remoteConfig?.depositPercent ?? 100;\n const refundPolicy: RefundRule[] =\n ((remoteConfig as Record<string, unknown>)?.refundPolicy as RefundRule[] | undefined) ?? [];\n\n // Active resource ID state (starts as the provided resourceId or undefined)\n const [activeResourceId, setActiveResourceIdState] = useState<string | undefined>(resourceId);\n\n const setActiveResourceId = useCallback((id: string) => {\n setActiveResourceIdState(id);\n }, []);\n\n // Customization options\n const classNames: ResiraClassNames = config?.classNames ?? {};\n const serviceLayout = config?.serviceLayout ?? \"vertical\";\n const visibleServiceCount = config?.visibleServiceCount ?? 4;\n const groupServicesByCategory = config?.groupServicesByCategory ?? true;\n const renderServiceCard = config?.renderServiceCard;\n\n // Step indicator visibility\n const showStepIndicator = config?.showStepIndicator ?? true;\n\n // Deeplink pre-fill\n const deeplink: DeeplinkSelection | undefined = config?.deeplink;\n const deeplinkGuest: DeeplinkGuest | undefined = config?.deeplinkGuest;\n\n // Event hooks\n const onStepChange = config?.onStepChange;\n const onBookingComplete = config?.onBookingComplete;\n const onError = config?.onError;\n\n // Build CSS variables\n const cssVars = useMemo(() => themeToCSS(theme), [theme]);\n\n const value = useMemo<ResiraContextValue>(\n () => ({\n client,\n resourceId,\n activeResourceId,\n setActiveResourceId,\n catalogMode,\n allowMultiSelect,\n domain,\n theme,\n locale,\n domainConfig,\n stripePublishableKey,\n termsText,\n waiverText,\n showWaiver,\n showTerms,\n showRemainingSpots,\n depositPercent,\n refundPolicy,\n onClose,\n classNames,\n serviceLayout,\n visibleServiceCount,\n groupServicesByCategory,\n renderServiceCard,\n showStepIndicator,\n deeplink,\n deeplinkGuest,\n onStepChange,\n onBookingComplete,\n onError,\n checkoutSessionToken,\n }),\n [client, resourceId, activeResourceId, setActiveResourceId, catalogMode, allowMultiSelect, domain, theme, locale, domainConfig, stripePublishableKey, termsText, waiverText, showWaiver, showTerms, showRemainingSpots, depositPercent, refundPolicy, onClose, classNames, serviceLayout, visibleServiceCount, groupServicesByCategory, renderServiceCard, showStepIndicator, deeplink, deeplinkGuest, onStepChange, onBookingComplete, onError, checkoutSessionToken],\n );\n\n return (\n <ResiraContext.Provider value={value}>\n <div className=\"resira-root\" style={cssVars as React.CSSProperties}>\n {children}\n </div>\n </ResiraContext.Provider>\n );\n}\n","import { useState, useEffect, useCallback, useRef } from \"react\";\nimport type {\n Availability,\n AvailabilityParams,\n Reservation,\n CreateReservationRequest,\n PublicResource,\n ResourceListResponse,\n} from \"@resira/sdk\";\nimport type { Product, CreatePaymentIntentRequest, PaymentIntentResponse, Dish } from \"@resira/sdk\";\nimport type { CheckoutSession } from \"@resira/sdk\";\nimport { useResira } from \"./ResiraProvider.js\";\n\nasync function getDishCompat(client: unknown, dishId: string): Promise<{ dish: Dish }> {\n const maybeClient = client as {\n getDish?: (id: string) => Promise<{ dish: Dish }>;\n request?: (method: string, path: string) => Promise<{ dish: Dish }>;\n };\n\n if (typeof maybeClient.getDish === \"function\") {\n return maybeClient.getDish(dishId);\n }\n\n if (typeof maybeClient.request === \"function\") {\n return maybeClient.request(\"GET\", `/dishes/${encodeURIComponent(dishId)}`);\n }\n\n throw new Error(\"Installed @resira/sdk does not support dish endpoints. Upgrade to @resira/sdk >= 0.3.0.\");\n}\n\nasync function listDishesCompat(client: unknown): Promise<{ dishes: Dish[] }> {\n const maybeClient = client as {\n listDishes?: () => Promise<{ dishes: Dish[] }>;\n request?: (method: string, path: string) => Promise<{ dishes: Dish[] }>;\n };\n\n if (typeof maybeClient.listDishes === \"function\") {\n return maybeClient.listDishes();\n }\n\n if (typeof maybeClient.request === \"function\") {\n return maybeClient.request(\"GET\", \"/dishes\");\n }\n\n throw new Error(\"Installed @resira/sdk does not support dish endpoints. Upgrade to @resira/sdk >= 0.3.0.\");\n}\n\ninterface UseAvailabilityReturn {\n /** Current availability data. */\n data: Availability | null;\n /** Whether the request is in flight. */\n loading: boolean;\n /** Error message if the request failed. */\n error: string | null;\n /** Re-fetch availability with optional new params. */\n refetch: (params?: AvailabilityParams) => Promise<void>;\n}\n\n/**\n * Fetch and cache availability data for a resource or product.\n *\n * Automatically re-fetches when `params` change (shallow compare).\n *\n * When `productId` is provided, uses the product-level availability\n * endpoint which aggregates capacity across all linked equipment.\n *\n * ```tsx\n * const { data, loading, error } = useAvailability({\n * date: \"2026-07-01\",\n * durationMinutes: 30,\n * }, \"product-uuid\");\n * ```\n */\nexport function useAvailability(\n params?: AvailabilityParams,\n productId?: string,\n): UseAvailabilityReturn {\n const { client, activeResourceId } = useResira();\n const resourceId = activeResourceId ?? \"\";\n const [data, setData] = useState<Availability | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const abortRef = useRef(0);\n\n // Product-level availability takes priority; otherwise fall back to resource.\n const useProduct = !!productId;\n\n // Guard: need either a productId or a resourceId to fetch.\n const enabled = useProduct ? productId!.length > 0 : resourceId.length > 0;\n\n // Stabilize params by serializing — avoids infinite re-fetch when\n // callers pass a new object literal with the same values each render.\n const paramsKey = JSON.stringify(params ?? null);\n\n // Track the last successfully-or-error fetched key so we don't\n // re-fetch the same params in a loop on error.\n const completedKeyRef = useRef<string | null>(null);\n\n // Manual refetch\n const refetch = useCallback(\n async (overrideParams?: AvailabilityParams) => {\n if (!enabled) return;\n const fetchId = ++abortRef.current;\n // Clear the completed guard so manual refetch always proceeds\n completedKeyRef.current = null;\n setLoading(true);\n setError(null);\n\n try {\n const p = overrideParams ?? (params === undefined ? undefined : JSON.parse(paramsKey));\n const result = useProduct\n ? await client.getProductAvailability(productId!, p)\n : await client.getAvailability(resourceId, p);\n if (fetchId === abortRef.current) {\n setData(result);\n completedKeyRef.current = paramsKey;\n }\n } catch (err) {\n if (fetchId === abortRef.current) {\n setError(\n err instanceof Error ? err.message : \"Failed to load availability\",\n );\n completedKeyRef.current = paramsKey;\n }\n } finally {\n if (fetchId === abortRef.current) {\n setLoading(false);\n }\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [client, resourceId, productId, useProduct, paramsKey, enabled],\n );\n\n // Auto-fetch on mount and when params change\n useEffect(() => {\n // Skip if no resource selected (prevents /resources//availability)\n if (!enabled) {\n setData(null);\n setLoading(false);\n setError(null);\n completedKeyRef.current = null;\n return;\n }\n\n // Only fetch if params actually changed since last completed fetch\n if (completedKeyRef.current === paramsKey) {\n return;\n }\n\n const fetchId = ++abortRef.current;\n let cancelled = false;\n setLoading(true);\n setError(null);\n\n const run = async () => {\n try {\n const p = params === undefined ? undefined : JSON.parse(paramsKey);\n const result = useProduct\n ? await client.getProductAvailability(productId!, p)\n : await client.getAvailability(resourceId, p);\n if (!cancelled && fetchId === abortRef.current) {\n setData(result);\n completedKeyRef.current = paramsKey;\n }\n } catch (err) {\n if (!cancelled && fetchId === abortRef.current) {\n setError(\n err instanceof Error ? err.message : \"Failed to load availability\",\n );\n // Mark as completed so we don't retry endlessly\n completedKeyRef.current = paramsKey;\n }\n } finally {\n if (!cancelled && fetchId === abortRef.current) {\n setLoading(false);\n }\n }\n };\n\n run();\n\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [client, resourceId, productId, useProduct, paramsKey, enabled]);\n\n return { data, loading, error, refetch };\n}\n\n// ─────────────────────────────────────────────────────────────\n// useReservation\n// ─────────────────────────────────────────────────────────────\n\ninterface UseReservationReturn {\n /** The created reservation (after successful submit). */\n reservation: Reservation | null;\n /** Whether the submission is in flight. */\n submitting: boolean;\n /** Error message if submission failed. */\n error: string | null;\n /** Submit a reservation. Returns the created reservation on success. */\n submit: (data: CreateReservationRequest) => Promise<Reservation | null>;\n /** Reset the hook state. */\n reset: () => void;\n}\n\n/**\n * Create a reservation via the SDK.\n *\n * ```tsx\n * const { submit, submitting, reservation, error } = useReservation();\n *\n * const handleSubmit = async () => {\n * await submit({\n * guestName: \"Jane\",\n * guestEmail: \"jane@example.com\",\n * startDate: \"2026-07-01\",\n * endDate: \"2026-07-07\",\n * });\n * };\n * ```\n */\nexport function useReservation(): UseReservationReturn {\n const { client } = useResira();\n const [reservation, setReservation] = useState<Reservation | null>(null);\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const submit = useCallback(\n async (data: CreateReservationRequest): Promise<Reservation | null> => {\n if (!data.resourceId && !data.checkoutSessionToken) {\n setError(\"No resource selected\");\n return null;\n }\n setSubmitting(true);\n setError(null);\n\n try {\n const response = await client.createReservation(data);\n setReservation(response.reservation);\n return response.reservation;\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Failed to create reservation\";\n setError(message);\n return null;\n } finally {\n setSubmitting(false);\n }\n },\n [client],\n );\n\n const reset = useCallback(() => {\n setReservation(null);\n setSubmitting(false);\n setError(null);\n }, []);\n\n return { reservation, submitting, error, submit, reset };\n}\n\n// ─────────────────────────────────────────────────────────────\n// useResources\n// ─────────────────────────────────────────────────────────────\n\ninterface UseResourcesReturn {\n /** List of resources belonging to the organisation. */\n resources: PublicResource[];\n /** Whether the request is in flight. */\n loading: boolean;\n /** Error message if fetch failed. */\n error: string | null;\n}\n\n/**\n * Fetch the resource catalogue for the current organisation via the SDK.\n *\n * The hook fires automatically on mount (no parameters required).\n */\nexport function useResources(): UseResourcesReturn {\n const { client } = useResira();\n\n const [resources, setResources] = useState<PublicResource[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n\n async function fetchResources() {\n try {\n setLoading(true);\n setError(null);\n const data = await (client as any).listResources();\n if (!cancelled) {\n setResources((data as ResourceListResponse).resources ?? []);\n }\n } catch (err) {\n if (!cancelled) {\n const message =\n err instanceof Error ? err.message : \"Failed to load resources\";\n setError(message);\n }\n } finally {\n if (!cancelled) {\n setLoading(false);\n }\n }\n }\n\n fetchResources();\n return () => {\n cancelled = true;\n };\n }, [client]);\n\n return { resources, loading, error };\n}\n\n// ─────────────────────────────────────────────────────────────\n// useProducts\n// ─────────────────────────────────────────────────────────────\n\ninterface UseProductsReturn {\n /** List of products/services belonging to the organisation. */\n products: Product[];\n /** Whether the request is in flight. */\n loading: boolean;\n /** Error message if fetch failed. */\n error: string | null;\n}\n\n/**\n * Fetch the product/service catalogue for the current organisation via the SDK.\n *\n * Calls `GET /v1/public/products` using the API key. Returns real products\n * with pricing, duration, and linked equipment as created in the admin dashboard.\n *\n * The hook fires automatically on mount (no parameters required).\n */\nexport function useProducts(): UseProductsReturn {\n const { client } = useResira();\n\n const [products, setProducts] = useState<Product[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n\n async function fetchProducts() {\n try {\n setLoading(true);\n setError(null);\n const data = await client.listProducts();\n if (!cancelled) {\n setProducts(data.products ?? []);\n }\n } catch (err) {\n if (!cancelled) {\n const message =\n err instanceof Error ? err.message : \"Failed to load services\";\n setError(message);\n }\n } finally {\n if (!cancelled) {\n setLoading(false);\n }\n }\n }\n\n fetchProducts();\n return () => {\n cancelled = true;\n };\n }, [client]);\n\n return { products, loading, error };\n}\n\n// ─────────────────────────────────────────────────────────────\n// usePaymentIntent\n// ─────────────────────────────────────────────────────────────\n\ninterface UsePaymentIntentReturn {\n /** The payment intent response after creation. */\n paymentIntent: PaymentIntentResponse | null;\n /** Whether the payment intent is being created. */\n creating: boolean;\n /** Error message if creation failed. */\n error: string | null;\n /** Create a new payment intent. */\n create: (data: CreatePaymentIntentRequest) => Promise<PaymentIntentResponse | null>;\n /** Confirm payment was completed. */\n confirm: (paymentIntentId: string, reservationId: string) => Promise<boolean>;\n /** Whether confirmation is in progress. */\n confirming: boolean;\n /** Reset the hook state. */\n reset: () => void;\n}\n\n/**\n * Create and manage Stripe payment intents via the SDK.\n */\nexport function usePaymentIntent(): UsePaymentIntentReturn {\n const { client } = useResira();\n const [paymentIntent, setPaymentIntent] = useState<PaymentIntentResponse | null>(null);\n const [creating, setCreating] = useState(false);\n const [confirming, setConfirming] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const create = useCallback(\n async (data: CreatePaymentIntentRequest): Promise<PaymentIntentResponse | null> => {\n setCreating(true);\n setError(null);\n\n try {\n const response = await client.createPaymentIntent(data);\n setPaymentIntent(response);\n return response;\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Failed to create payment\";\n setError(message);\n return null;\n } finally {\n setCreating(false);\n }\n },\n [client],\n );\n\n const confirm = useCallback(\n async (paymentIntentId: string, reservationId: string): Promise<boolean> => {\n setConfirming(true);\n setError(null);\n\n try {\n const response = await client.confirmPayment({ paymentIntentId, reservationId });\n return response.paymentStatus === \"succeeded\";\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Payment confirmation failed\";\n setError(message);\n return false;\n } finally {\n setConfirming(false);\n }\n },\n [client],\n );\n\n const reset = useCallback(() => {\n setPaymentIntent(null);\n setCreating(false);\n setConfirming(false);\n setError(null);\n }, []);\n\n return { paymentIntent, creating, error, create, confirm, confirming, reset };\n}\n\n// ─────────────────────────────────────────────────────────────\n// useDish\n// ─────────────────────────────────────────────────────────────\n\ninterface UseDishReturn {\n /** The fetched dish. */\n dish: Dish | null;\n /** Whether the request is in flight. */\n loading: boolean;\n /** Error message if fetch failed. */\n error: string | null;\n}\n\n/**\n * Fetch a single dish by ID via the SDK.\n *\n * ```tsx\n * const { dish, loading, error } = useDish(\"dish-uuid\");\n * ```\n */\nexport function useDish(dishId: string | undefined): UseDishReturn {\n const { client } = useResira();\n const [dish, setDish] = useState<Dish | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!dishId) {\n setDish(null);\n setLoading(false);\n setError(null);\n return;\n }\n\n let cancelled = false;\n setLoading(true);\n setError(null);\n\n async function fetchDish() {\n try {\n const data = await getDishCompat(client, dishId!);\n if (!cancelled) {\n setDish(data.dish);\n }\n } catch (err) {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : \"Failed to load dish\");\n }\n } finally {\n if (!cancelled) {\n setLoading(false);\n }\n }\n }\n\n fetchDish();\n return () => { cancelled = true; };\n }, [client, dishId]);\n\n return { dish, loading, error };\n}\n\n// ─────────────────────────────────────────────────────────────\n// useDishes\n// ─────────────────────────────────────────────────────────────\n\ninterface UseDishesReturn {\n /** List of dishes. */\n dishes: Dish[];\n /** Whether the request is in flight. */\n loading: boolean;\n /** Error message if fetch failed. */\n error: string | null;\n}\n\n/**\n * Fetch all dishes for the organisation via the SDK.\n *\n * ```tsx\n * const { dishes, loading, error } = useDishes();\n * ```\n */\nexport function useDishes(enabled = true): UseDishesReturn {\n const { client } = useResira();\n const [dishes, setDishes] = useState<Dish[]>([]);\n const [loading, setLoading] = useState(enabled);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!enabled) {\n setLoading(false);\n setError(null);\n return;\n }\n\n let cancelled = false;\n\n async function fetchDishes() {\n try {\n setLoading(true);\n setError(null);\n const data = await listDishesCompat(client);\n if (!cancelled) {\n setDishes(data.dishes ?? []);\n }\n } catch (err) {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : \"Failed to load dishes\");\n }\n } finally {\n if (!cancelled) {\n setLoading(false);\n }\n }\n }\n\n fetchDishes();\n return () => { cancelled = true; };\n }, [client, enabled]);\n\n return { dishes, loading, error };\n}\n\n// ─────────────────────────────────────────────────────────────\n// useCheckoutSession\n// ─────────────────────────────────────────────────────────────\n\n/** Checkout session error codes for UX branching. */\nexport type CheckoutSessionErrorCode = \"not_found\" | \"consumed\" | \"expired\" | \"unknown\";\n\ninterface UseCheckoutSessionReturn {\n /** The hydrated checkout session. */\n session: CheckoutSession | null;\n /** Whether the session is loading. */\n loading: boolean;\n /** Error message if loading failed. */\n error: string | null;\n /** Structured error code for UX branching. */\n errorCode: CheckoutSessionErrorCode | null;\n}\n\n/**\n * Fetch and hydrate a checkout session by token.\n *\n * Handles the three error cases from the API:\n * - 404 → \"Invalid booking link\"\n * - \"already consumed\" → \"This booking was already completed\"\n * - \"expired\" → \"Session expired\"\n *\n * ```tsx\n * const { session, loading, error, errorCode } = useCheckoutSession(\"cs_ab12cd34...\");\n * ```\n */\nexport function useCheckoutSession(token: string | undefined): UseCheckoutSessionReturn {\n const { client } = useResira();\n const [session, setSession] = useState<CheckoutSession | null>(null);\n const [loading, setLoading] = useState(!!token);\n const [error, setError] = useState<string | null>(null);\n const [errorCode, setErrorCode] = useState<CheckoutSessionErrorCode | null>(null);\n\n useEffect(() => {\n if (!token) {\n setSession(null);\n setLoading(false);\n setError(null);\n setErrorCode(null);\n return;\n }\n\n let cancelled = false;\n setLoading(true);\n setError(null);\n setErrorCode(null);\n\n async function fetchSession() {\n try {\n const data = await client.getCheckoutSession(token!);\n if (!cancelled) {\n setSession(data.session);\n }\n } catch (err: unknown) {\n if (cancelled) return;\n\n const apiErr = err as { status?: number; body?: { error?: string } };\n const message = apiErr.body?.error ?? (err instanceof Error ? err.message : \"Failed to load checkout session\");\n\n if (apiErr.status === 404) {\n setError(\"Invalid booking link\");\n setErrorCode(\"not_found\");\n } else if (message.toLowerCase().includes(\"consumed\")) {\n setError(\"This booking was already completed\");\n setErrorCode(\"consumed\");\n } else if (message.toLowerCase().includes(\"expired\")) {\n setError(\"Session expired — please start a new booking\");\n setErrorCode(\"expired\");\n } else {\n setError(message);\n setErrorCode(\"unknown\");\n }\n } finally {\n if (!cancelled) {\n setLoading(false);\n }\n }\n }\n\n fetchSession();\n return () => { cancelled = true; };\n }, [client, token]);\n\n return { session, loading, error, errorCode };\n}\n\n// ─────────────────────────────────────────────────────────────\n// Service (enriched product view)\n// ─────────────────────────────────────────────────────────────\n\n/** A single duration/price option for a service. */\nexport interface ServiceOption {\n /** Duration in minutes. */\n durationMinutes: number;\n /** Human-readable duration label (e.g. \"1h 30m\"). */\n durationLabel: string;\n /** Price in minor units (cents). */\n priceCents: number;\n /** Formatted price string (e.g. \"€50.00\"). */\n priceFormatted: string;\n}\n\n/** Enriched service data ready for display. */\nexport interface Service {\n /** Unique service ID. */\n id: string;\n /** Service name. */\n name: string;\n /** Optional description. */\n description?: string;\n /** Image URL. */\n imageUrl?: string;\n /** ISO 4217 currency code. */\n currency: string;\n /** Whether the service is active. */\n active: boolean;\n /** Pricing model: \"per_session\" | \"per_person\" | \"per_rider\". */\n pricingModel: string;\n /** Default/base price in minor units. */\n priceCents: number;\n /** Formatted base price (e.g. \"€50.00\"). */\n priceFormatted: string;\n /** Lowest price across all options (for \"from €X\" display). */\n lowestPriceCents: number;\n /** Formatted lowest price. */\n lowestPriceFormatted: string;\n /** Whether multiple duration/price options exist. */\n hasMultipleOptions: boolean;\n /** Default duration in minutes. */\n durationMinutes: number;\n /** Human-readable default duration (e.g. \"2h\"). */\n durationLabel: string;\n /** All available duration/price options. */\n options: ServiceOption[];\n /** Maximum party/group size. */\n maxPartySize?: number;\n /** IDs of linked equipment/resources. */\n equipmentIds: string[];\n /** Names of linked equipment/resources. */\n equipmentNames?: string[];\n /** Display color. */\n serviceColor?: string;\n /** Sort order. */\n sortOrder?: number;\n /** Raw product object from the API. */\n raw: Product;\n}\n\nfunction formatPriceCentsUtil(cents: number, currency: string): string {\n return new Intl.NumberFormat(\"default\", { style: \"currency\", currency }).format(cents / 100);\n}\n\nfunction formatDurationUtil(minutes: number): string {\n if (minutes < 60) return `${minutes} min`;\n const h = Math.floor(minutes / 60);\n const m = minutes % 60;\n return m > 0 ? `${h}h ${m}m` : `${h}h`;\n}\n\nfunction enrichProduct(product: Product): Service {\n const currency = product.currency ?? \"EUR\";\n const options: ServiceOption[] = [];\n\n if (product.durationPricing?.length) {\n for (const dp of product.durationPricing) {\n options.push({\n durationMinutes: dp.durationMinutes,\n durationLabel: formatDurationUtil(dp.durationMinutes),\n priceCents: dp.priceCents,\n priceFormatted: formatPriceCentsUtil(dp.priceCents, currency),\n });\n }\n } else {\n options.push({\n durationMinutes: product.durationMinutes,\n durationLabel: formatDurationUtil(product.durationMinutes),\n priceCents: product.priceCents,\n priceFormatted: formatPriceCentsUtil(product.priceCents, currency),\n });\n }\n\n const lowestPriceCents = Math.min(...options.map((o) => o.priceCents));\n\n return {\n id: product.id,\n name: product.name,\n description: product.description,\n imageUrl: product.imageUrl,\n currency,\n active: product.active,\n pricingModel: product.pricingModel,\n priceCents: product.priceCents,\n priceFormatted: formatPriceCentsUtil(product.priceCents, currency),\n lowestPriceCents,\n lowestPriceFormatted: formatPriceCentsUtil(lowestPriceCents, currency),\n hasMultipleOptions: options.length > 1,\n durationMinutes: product.durationMinutes,\n durationLabel: formatDurationUtil(product.durationMinutes),\n options,\n maxPartySize: product.maxPartySize,\n equipmentIds: product.equipmentIds,\n equipmentNames: product.equipmentNames,\n serviceColor: product.serviceColor,\n sortOrder: product.sortOrder,\n raw: product,\n };\n}\n\n// ─────────────────────────────────────────────────────────────\n// useServices (React hook — requires ResiraProvider)\n// ─────────────────────────────────────────────────────────────\n\nexport interface UseServicesReturn {\n /** Enriched service list. */\n services: Service[];\n /** Whether loading. */\n loading: boolean;\n /** Error message. */\n error: string | null;\n /** Re-fetch services. */\n refetch: () => void;\n}\n\n/**\n * Fetch all services for the organisation with enriched display data.\n *\n * Returns formatted prices, duration labels, and \"from €X\" logic\n * so you can render service cards with your own styling.\n *\n * Requires `<ResiraProvider>` ancestor.\n *\n * ```tsx\n * const { services, loading, error } = useServices();\n *\n * return services.map(s => (\n * <div key={s.id}>\n * <h3>{s.name}</h3>\n * <img src={s.imageUrl} alt={s.name} />\n * <p>{s.hasMultipleOptions ? `from ${s.lowestPriceFormatted}` : s.priceFormatted}</p>\n * <p>{s.durationLabel}</p>\n * {s.options.map(opt => (\n * <span key={opt.durationMinutes}>{opt.durationLabel} — {opt.priceFormatted}</span>\n * ))}\n * </div>\n * ));\n * ```\n */\nexport function useServices(): UseServicesReturn {\n const { client } = useResira();\n const [services, setServices] = useState<Service[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [fetchCount, setFetchCount] = useState(0);\n\n useEffect(() => {\n let cancelled = false;\n setLoading(true);\n setError(null);\n\n async function load() {\n try {\n const data = await client.listProducts();\n if (!cancelled) {\n setServices((data.products ?? []).map(enrichProduct));\n }\n } catch (err) {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : \"Failed to load services\");\n }\n } finally {\n if (!cancelled) setLoading(false);\n }\n }\n\n load();\n return () => { cancelled = true; };\n }, [client, fetchCount]);\n\n const refetch = useCallback(() => setFetchCount((c) => c + 1), []);\n\n return { services, loading, error, refetch };\n}\n\n// ─────────────────────────────────────────────────────────────\n// fetchServices (standalone — no React required)\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Fetch all services for an organisation — standalone, no React needed.\n *\n * Use this in non-React contexts, server components, scripts, or\n * when you want full control over rendering.\n *\n * ```ts\n * import { fetchServices } from \"@resira/ui\";\n *\n * const services = await fetchServices(\"your-api-key\");\n * services.forEach(s => {\n * console.log(s.name, s.lowestPriceFormatted, s.options);\n * });\n * ```\n *\n * @param apiKey Your Resira public API key\n * @param opts Optional: baseUrl override\n * @returns Array of enriched Service objects\n */\nexport async function fetchServices(\n apiKey: string,\n opts?: { baseUrl?: string },\n): Promise<Service[]> {\n const { Resira } = await import(\"@resira/sdk\");\n const client = new Resira({\n apiKey,\n ...(opts?.baseUrl ? { baseUrl: opts.baseUrl } : {}),\n });\n const data = await client.listProducts();\n return (data.products ?? []).map(enrichProduct);\n}\n","// ═══════════════════════════════════════════════════════════════\n// @resira/ui — SVG Icons\n// Clean, minimal 20×20 SVG icons. No emojis.\n// ═══════════════════════════════════════════════════════════════\n\nimport React from \"react\";\n\ninterface IconProps {\n size?: number;\n className?: string;\n}\n\nconst defaultSize = 20;\n\nexport function CalendarIcon({ size = defaultSize, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <rect x=\"2.5\" y=\"4\" width=\"15\" height=\"13.5\" rx=\"2\" />\n <path d=\"M2.5 8.5h15\" />\n <path d=\"M6.5 2.5v3\" />\n <path d=\"M13.5 2.5v3\" />\n </svg>\n );\n}\n\nexport function ClockIcon({ size = defaultSize, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <circle cx=\"10\" cy=\"10\" r=\"7.5\" />\n <path d=\"M10 6v4l2.5 2.5\" />\n </svg>\n );\n}\n\nexport function UserIcon({ size = defaultSize, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <circle cx=\"10\" cy=\"7\" r=\"3.5\" />\n <path d=\"M3.5 17.5c0-3.59 2.91-6.5 6.5-6.5s6.5 2.91 6.5 6.5\" />\n </svg>\n );\n}\n\nexport function UsersIcon({ size = defaultSize, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <circle cx=\"7.5\" cy=\"6.5\" r=\"3\" />\n <path d=\"M2 17c0-3.04 2.46-5.5 5.5-5.5S13 13.96 13 17\" />\n <circle cx=\"14\" cy=\"7\" r=\"2.5\" />\n <path d=\"M14.5 11.5c1.93.5 3.5 2.46 3.5 4.5\" />\n </svg>\n );\n}\n\nexport function CheckIcon({ size = defaultSize, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M4 10.5l4 4 8-9\" />\n </svg>\n );\n}\n\nexport function CheckCircleIcon({ size = defaultSize, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <circle cx=\"10\" cy=\"10\" r=\"7.5\" />\n <path d=\"M6.5 10.5l2 2 5-5.5\" />\n </svg>\n );\n}\n\nexport function ChevronLeftIcon({ size = defaultSize, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M12 4l-6 6 6 6\" />\n </svg>\n );\n}\n\nexport function ChevronRightIcon({ size = defaultSize, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M8 4l6 6-6 6\" />\n </svg>\n );\n}\n\nexport function AlertCircleIcon({ size = defaultSize, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <circle cx=\"10\" cy=\"10\" r=\"7.5\" />\n <path d=\"M10 7v4\" />\n <circle cx=\"10\" cy=\"13.5\" r=\"0.5\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n );\n}\n\nexport function MinusIcon({ size = defaultSize, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n className={className}\n >\n <path d=\"M5 10h10\" />\n </svg>\n );\n}\n\nexport function PlusIcon({ size = defaultSize, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n className={className}\n >\n <path d=\"M10 5v10M5 10h10\" />\n </svg>\n );\n}\n\nexport function MailIcon({ size = defaultSize, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <rect x=\"2.5\" y=\"4.5\" width=\"15\" height=\"11\" rx=\"2\" />\n <path d=\"M2.5 6.5l7.5 5 7.5-5\" />\n </svg>\n );\n}\n\nexport function PhoneIcon({ size = defaultSize, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M3 4.5c0-.83.67-1.5 1.5-1.5h2.09c.36 0 .67.24.76.59l.8 2.82a.78.78 0 01-.22.78l-1.12.93a10.5 10.5 0 005.57 5.57l.93-1.12a.78.78 0 01.78-.22l2.82.8c.35.09.59.4.59.76v2.09c0 .83-.67 1.5-1.5 1.5C8.82 17 3 11.18 3 4.5z\" />\n </svg>\n );\n}\n\nexport function NoteIcon({ size = defaultSize, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <rect x=\"3.5\" y=\"2.5\" width=\"13\" height=\"15\" rx=\"2\" />\n <path d=\"M7 7h6M7 10h6M7 13h3\" />\n </svg>\n );\n}\n\nexport function XIcon({ size = defaultSize, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M5 5l10 10M15 5L5 15\" />\n </svg>\n );\n}\n\nexport function LockIcon({ size = defaultSize, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <rect x=\"4\" y=\"9\" width=\"12\" height=\"8\" rx=\"2\" />\n <path d=\"M7 9V6a3 3 0 016 0v3\" />\n </svg>\n );\n}\n\nexport function CreditCardIcon({ size = defaultSize, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <rect x=\"2\" y=\"4\" width=\"16\" height=\"12\" rx=\"2\" />\n <path d=\"M2 8h16\" />\n <path d=\"M6 12h2\" />\n </svg>\n );\n}\n\nexport function ShieldIcon({ size = defaultSize, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M10 2l6 3v4c0 4.5-2.5 7.5-6 9-3.5-1.5-6-4.5-6-9V5l6-3z\" />\n <path d=\"M7 10l2 2 4-4\" />\n </svg>\n );\n}\n\nexport function TagIcon({ size = defaultSize, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M2 10.5V4a2 2 0 012-2h6.5l7.5 7.5-6.5 6.5L2 10.5z\" />\n <circle cx=\"7\" cy=\"7\" r=\"1\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nexport function CubeIcon({ size = defaultSize, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M10 2l7 4v8l-7 4-7-4V6l7-4z\" />\n <path d=\"M10 10l7-4\" />\n <path d=\"M10 10v8\" />\n <path d=\"M10 10L3 6\" />\n </svg>\n );\n}\n\nexport function ViewfinderIcon({ size = defaultSize, className }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M2 6V4a2 2 0 012-2h2\" />\n <path d=\"M14 2h2a2 2 0 012 2v2\" />\n <path d=\"M18 14v2a2 2 0 01-2 2h-2\" />\n <path d=\"M6 18H4a2 2 0 01-2-2v-2\" />\n <circle cx=\"10\" cy=\"10\" r=\"3\" />\n </svg>\n );\n}\n","// ═══════════════════════════════════════════════════════════════\n// @resira/ui — BookingCalendar\n// Multi-day date range picker for rental domains.\n// Shows blocked dates, supports check-in / check-out selection.\n// ═══════════════════════════════════════════════════════════════\n\nimport React, { useState, useMemo, useCallback } from \"react\";\nimport { useResira } from \"../ResiraProvider.js\";\nimport { ChevronLeftIcon, ChevronRightIcon } from \"../icons.js\";\n\n// ─────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────\n\nfunction toDateStr(d: Date): string {\n const y = d.getFullYear();\n const m = String(d.getMonth() + 1).padStart(2, \"0\");\n const day = String(d.getDate()).padStart(2, \"0\");\n return `${y}-${m}-${day}`;\n}\n\nfunction parseDate(s: string): Date {\n const [y, m, d] = s.split(\"-\").map(Number);\n return new Date(y, m - 1, d);\n}\n\nfunction isSameDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\nfunction isBeforeDay(a: Date, b: Date): boolean {\n return toDateStr(a) < toDateStr(b);\n}\n\nfunction isBetween(date: Date, start: Date, end: Date): boolean {\n const d = toDateStr(date);\n return d > toDateStr(start) && d < toDateStr(end);\n}\n\nconst WEEKDAYS = [\"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\", \"Su\"];\n\nfunction getDaysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate();\n}\n\n/** Get the day of the week (Mon=0, Sun=6) for the first day of a month. */\nfunction getFirstDayOffset(year: number, month: number): number {\n const day = new Date(year, month, 1).getDay();\n return day === 0 ? 6 : day - 1; // Convert Sun=0 to Mon-start\n}\n\nfunction formatMonth(year: number, month: number): string {\n return new Date(year, month).toLocaleString(\"default\", {\n month: \"long\",\n year: \"numeric\",\n });\n}\n\nfunction formatShortDate(dateStr: string): string {\n const d = parseDate(dateStr);\n return d.toLocaleDateString(\"default\", {\n month: \"short\",\n day: \"numeric\",\n });\n}\n\nfunction nightsBetween(start: string, end: string): number {\n const a = parseDate(start);\n const b = parseDate(end);\n return Math.round((b.getTime() - a.getTime()) / (1000 * 60 * 60 * 24));\n}\n\n// ─────────────────────────────────────────────────────────────\n// Props\n// ─────────────────────────────────────────────────────────────\n\ninterface BookingCalendarProps {\n /** Set of blocked/unavailable dates (YYYY-MM-DD). */\n blockedDates?: Set<string>;\n /** Currently selected start date. */\n startDate?: string;\n /** Currently selected end date. */\n endDate?: string;\n /** Called when the user selects dates. */\n onSelect: (start: string, end: string | undefined) => void;\n /** Minimum stay in nights. */\n minStay?: number;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Component\n// ─────────────────────────────────────────────────────────────\n\nexport function BookingCalendar({\n blockedDates = new Set(),\n startDate,\n endDate,\n onSelect,\n minStay = 1,\n}: BookingCalendarProps) {\n const { locale } = useResira();\n const today = useMemo(() => new Date(), []);\n const [viewYear, setViewYear] = useState(today.getFullYear());\n const [viewMonth, setViewMonth] = useState(today.getMonth());\n\n const prevMonth = useCallback(() => {\n setViewMonth((m) => {\n if (m === 0) {\n setViewYear((y) => y - 1);\n return 11;\n }\n return m - 1;\n });\n }, []);\n\n const nextMonth = useCallback(() => {\n setViewMonth((m) => {\n if (m === 11) {\n setViewYear((y) => y + 1);\n return 0;\n }\n return m + 1;\n });\n }, []);\n\n const isPrevDisabled =\n viewYear < today.getFullYear() ||\n (viewYear === today.getFullYear() && viewMonth <= today.getMonth());\n\n // Build calendar grid\n const calendarDays = useMemo(() => {\n const offset = getFirstDayOffset(viewYear, viewMonth);\n const daysInMonth = getDaysInMonth(viewYear, viewMonth);\n const cells: Array<{ date: Date; inMonth: boolean }> = [];\n\n // Previous month fill\n const prevMonthDays = getDaysInMonth(\n viewMonth === 0 ? viewYear - 1 : viewYear,\n viewMonth === 0 ? 11 : viewMonth - 1,\n );\n for (let i = offset - 1; i >= 0; i--) {\n cells.push({\n date: new Date(\n viewMonth === 0 ? viewYear - 1 : viewYear,\n viewMonth === 0 ? 11 : viewMonth - 1,\n prevMonthDays - i,\n ),\n inMonth: false,\n });\n }\n\n // Current month\n for (let d = 1; d <= daysInMonth; d++) {\n cells.push({ date: new Date(viewYear, viewMonth, d), inMonth: true });\n }\n\n // Next month fill (complete the last row)\n const remaining = 7 - (cells.length % 7);\n if (remaining < 7) {\n for (let i = 1; i <= remaining; i++) {\n cells.push({\n date: new Date(\n viewMonth === 11 ? viewYear + 1 : viewYear,\n viewMonth === 11 ? 0 : viewMonth + 1,\n i,\n ),\n inMonth: false,\n });\n }\n }\n\n return cells;\n }, [viewYear, viewMonth]);\n\n const handleDayClick = useCallback(\n (dateStr: string) => {\n if (blockedDates.has(dateStr)) return;\n\n // No start selected → set start\n if (!startDate) {\n onSelect(dateStr, undefined);\n return;\n }\n\n // Start already selected, no end → set end (or restart)\n if (startDate && !endDate) {\n if (dateStr <= startDate) {\n // Clicked before or on start → restart\n onSelect(dateStr, undefined);\n return;\n }\n\n // Check if any blocked date falls in range\n const start = parseDate(startDate);\n const end = parseDate(dateStr);\n for (const blocked of blockedDates) {\n const bd = parseDate(blocked);\n if (isBetween(bd, start, end)) {\n // Blocked date in range → restart\n onSelect(dateStr, undefined);\n return;\n }\n }\n\n onSelect(startDate, dateStr);\n return;\n }\n\n // Both selected → restart\n onSelect(dateStr, undefined);\n },\n [startDate, endDate, blockedDates, onSelect],\n );\n\n return (\n <div className=\"resira-calendar\">\n {/* Navigation */}\n <div className=\"resira-calendar-nav\">\n <button\n type=\"button\"\n className=\"resira-calendar-nav-btn\"\n onClick={prevMonth}\n disabled={isPrevDisabled}\n aria-label=\"Previous month\"\n >\n <ChevronLeftIcon size={16} />\n </button>\n <span className=\"resira-calendar-month\">\n {formatMonth(viewYear, viewMonth)}\n </span>\n <button\n type=\"button\"\n className=\"resira-calendar-nav-btn\"\n onClick={nextMonth}\n aria-label=\"Next month\"\n >\n <ChevronRightIcon size={16} />\n </button>\n </div>\n\n {/* Grid */}\n <div className=\"resira-calendar-grid\">\n {/* Weekday headers */}\n {WEEKDAYS.map((wd) => (\n <div key={wd} className=\"resira-calendar-weekday\">\n {wd}\n </div>\n ))}\n\n {/* Day cells */}\n {calendarDays.map(({ date, inMonth }, idx) => {\n const dateStr = toDateStr(date);\n const isToday = isSameDay(date, today);\n const isPast = isBeforeDay(date, today);\n const isBlocked = blockedDates.has(dateStr);\n const isDisabled = !inMonth || isPast || isBlocked;\n\n const isStart = startDate ? dateStr === startDate : false;\n const isEnd = endDate ? dateStr === endDate : false;\n const isSelected = isStart || isEnd;\n\n const inRange =\n startDate && endDate\n ? isBetween(date, parseDate(startDate), parseDate(endDate))\n : false;\n\n let className = \"resira-calendar-day\";\n if (!inMonth) className += \" resira-calendar-day--outside\";\n if (isToday) className += \" resira-calendar-day--today\";\n if (isBlocked && inMonth) className += \" resira-calendar-day--blocked\";\n if (isSelected) className += \" resira-calendar-day--selected\";\n if (inRange) className += \" resira-calendar-day--in-range\";\n if (isStart && endDate) className += \" resira-calendar-day--range-start\";\n if (isEnd) className += \" resira-calendar-day--range-end\";\n\n return (\n <button\n key={idx}\n type=\"button\"\n className={className}\n disabled={isDisabled}\n onClick={() => handleDayClick(dateStr)}\n aria-label={dateStr}\n >\n {date.getDate()}\n </button>\n );\n })}\n </div>\n\n {/* Date summary */}\n {startDate && (\n <div className=\"resira-date-summary\">\n <div className=\"resira-date-summary-item\">\n <div className=\"resira-date-summary-label\">{locale.checkIn}</div>\n <div className=\"resira-date-summary-value\">\n {formatShortDate(startDate)}\n </div>\n </div>\n {endDate ? (\n <>\n <div className=\"resira-date-summary-item\">\n <div className=\"resira-date-summary-label\">{locale.checkOut}</div>\n <div className=\"resira-date-summary-value\">\n {formatShortDate(endDate)}\n </div>\n </div>\n <div className=\"resira-date-summary-item\">\n <div className=\"resira-date-summary-label\">{locale.nights}</div>\n <div className=\"resira-date-summary-value\">\n {nightsBetween(startDate, endDate)}\n </div>\n </div>\n </>\n ) : (\n <div className=\"resira-date-summary-item\">\n <div className=\"resira-date-summary-label\">{locale.checkOut}</div>\n <div className=\"resira-date-summary-value\" style={{ opacity: 0.4 }}>\n —\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","// ═══════════════════════════════════════════════════════════════\n// @resira/ui — TimeSlotPicker (v2)\n// Compact calendar + time slot grid.\n// Clear sections: Duration → Date → Party Size → Time Slots\n// Custom inline calendar replaces native date input.\n// ═══════════════════════════════════════════════════════════════\n\nimport React, { useCallback, useMemo, useState } from \"react\";\nimport type { TimeSlotAvailability, DurationPrice } from \"@resira/sdk\";\nimport { useResira } from \"../ResiraProvider.js\";\nimport { MinusIcon, PlusIcon, ClockIcon, ChevronLeftIcon, ChevronRightIcon } from \"../icons.js\";\n\nfunction formatDurationLabel(minutes: number): string {\n if (minutes < 60) return `${minutes} min`;\n const h = Math.floor(minutes / 60);\n const m = minutes % 60;\n return m > 0 ? `${h}h${m}` : `${h}h`;\n}\n\nfunction formatPriceCents(cents: number, currency: string = \"EUR\"): string {\n return new Intl.NumberFormat(\"default\", {\n style: \"currency\",\n currency,\n }).format(cents / 100);\n}\n\n// ─────────────────────────────────────────────────────────────\n// Mini calendar helpers\n// ─────────────────────────────────────────────────────────────\n\nfunction toDateStr(d: Date): string {\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, \"0\")}-${String(d.getDate()).padStart(2, \"0\")}`;\n}\n\nfunction todayStr(): string {\n return toDateStr(new Date());\n}\n\nconst WEEKDAY_LABELS = [\"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\", \"Su\"];\n\nfunction getDaysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate();\n}\n\nfunction getFirstDayOffset(year: number, month: number): number {\n const day = new Date(year, month, 1).getDay();\n return day === 0 ? 6 : day - 1;\n}\n\nfunction formatSlotTime(isoString: string): string {\n try {\n const d = new Date(isoString);\n return d.toLocaleTimeString(\"default\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n } catch {\n return isoString;\n }\n}\n\nfunction formatSelectedDate(dateStr: string): string {\n const [y, m, d] = dateStr.split(\"-\").map(Number);\n const date = new Date(y, m - 1, d);\n return date.toLocaleDateString(\"default\", {\n weekday: \"short\",\n month: \"short\",\n day: \"numeric\",\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// CompactCalendar (inline mini calendar)\n// ─────────────────────────────────────────────────────────────\n\ninterface CompactCalendarProps {\n selectedDate: string;\n onDateSelect: (date: string) => void;\n fullyBookedDates?: Set<string>;\n}\n\nfunction CompactCalendar({ selectedDate, onDateSelect, fullyBookedDates = new Set() }: CompactCalendarProps) {\n const today = useMemo(() => new Date(), []);\n const todayS = useMemo(() => toDateStr(today), [today]);\n const [viewYear, setViewYear] = useState(() => {\n if (selectedDate) {\n const [y] = selectedDate.split(\"-\").map(Number);\n return y;\n }\n return today.getFullYear();\n });\n const [viewMonth, setViewMonth] = useState(() => {\n if (selectedDate) {\n const parts = selectedDate.split(\"-\").map(Number);\n return parts[1] - 1;\n }\n return today.getMonth();\n });\n\n const prevMonth = useCallback(() => {\n setViewMonth((m) => {\n if (m === 0) { setViewYear((y) => y - 1); return 11; }\n return m - 1;\n });\n }, []);\n\n const nextMonth = useCallback(() => {\n setViewMonth((m) => {\n if (m === 11) { setViewYear((y) => y + 1); return 0; }\n return m + 1;\n });\n }, []);\n\n const isPrevDisabled =\n viewYear < today.getFullYear() ||\n (viewYear === today.getFullYear() && viewMonth <= today.getMonth());\n\n const monthLabel = new Date(viewYear, viewMonth).toLocaleString(\"default\", {\n month: \"long\",\n year: \"numeric\",\n });\n\n const cells = useMemo(() => {\n const offset = getFirstDayOffset(viewYear, viewMonth);\n const daysInMonth = getDaysInMonth(viewYear, viewMonth);\n const result: Array<{ date: Date; inMonth: boolean }> = [];\n\n const prevMonthDays = getDaysInMonth(\n viewMonth === 0 ? viewYear - 1 : viewYear,\n viewMonth === 0 ? 11 : viewMonth - 1,\n );\n for (let i = offset - 1; i >= 0; i--) {\n result.push({\n date: new Date(\n viewMonth === 0 ? viewYear - 1 : viewYear,\n viewMonth === 0 ? 11 : viewMonth - 1,\n prevMonthDays - i,\n ),\n inMonth: false,\n });\n }\n for (let d = 1; d <= daysInMonth; d++) {\n result.push({ date: new Date(viewYear, viewMonth, d), inMonth: true });\n }\n const remaining = 7 - (result.length % 7);\n if (remaining < 7) {\n for (let i = 1; i <= remaining; i++) {\n result.push({\n date: new Date(\n viewMonth === 11 ? viewYear + 1 : viewYear,\n viewMonth === 11 ? 0 : viewMonth + 1,\n i,\n ),\n inMonth: false,\n });\n }\n }\n return result;\n }, [viewYear, viewMonth]);\n\n return (\n <div className=\"resira-mini-cal\">\n {/* Navigation */}\n <div className=\"resira-mini-cal-nav\">\n <button type=\"button\" className=\"resira-mini-cal-nav-btn\" onClick={prevMonth} disabled={isPrevDisabled} aria-label=\"Previous month\">\n <ChevronLeftIcon size={14} />\n </button>\n <span className=\"resira-mini-cal-month\">{monthLabel}</span>\n <button type=\"button\" className=\"resira-mini-cal-nav-btn\" onClick={nextMonth} aria-label=\"Next month\">\n <ChevronRightIcon size={14} />\n </button>\n </div>\n\n {/* Grid */}\n <div className=\"resira-mini-cal-grid\">\n {WEEKDAY_LABELS.map((wd) => (\n <div key={wd} className=\"resira-mini-cal-weekday\">{wd}</div>\n ))}\n\n {cells.map(({ date, inMonth }, idx) => {\n const dateStr = toDateStr(date);\n const isToday = dateStr === todayS;\n const isPast = dateStr < todayS;\n const isFullyBooked = fullyBookedDates.has(dateStr);\n const isDisabled = !inMonth || isPast;\n const isSelected = dateStr === selectedDate;\n\n let cn = \"resira-mini-cal-day\";\n if (!inMonth) cn += \" resira-mini-cal-day--outside\";\n if (isToday && inMonth) cn += \" resira-mini-cal-day--today\";\n if (isFullyBooked && inMonth && !isPast) cn += \" resira-mini-cal-day--booked\";\n if (isSelected) cn += \" resira-mini-cal-day--selected\";\n\n return (\n <button\n key={idx}\n type=\"button\"\n className={cn}\n disabled={isDisabled}\n onClick={() => onDateSelect(dateStr)}\n aria-label={dateStr}\n title={isFullyBooked && inMonth ? \"Fully booked\" : undefined}\n >\n {date.getDate()}\n {isFullyBooked && inMonth && !isPast && (\n <span className=\"resira-mini-cal-day-dot resira-mini-cal-day-dot--full\" />\n )}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n\n// ─────────────────────────────────────────────────────────────\n// Props\n// ─────────────────────────────────────────────────────────────\n\ninterface TimeSlotPickerProps {\n timeSlots: TimeSlotAvailability[];\n selectedDate: string;\n onDateChange: (date: string) => void;\n selectedSlot?: string;\n onSlotSelect: (start: string, end: string) => void;\n partySize: number;\n onPartySizeChange: (size: number) => void;\n showPartySize?: boolean;\n showDuration?: boolean;\n selectedDuration?: number;\n onDurationChange?: (minutes: number) => void;\n maxPartySizeOverride?: number;\n durationPricing?: DurationPrice[];\n currency?: string;\n /** Set of dates (YYYY-MM-DD) that are fully booked. */\n fullyBookedDates?: Set<string>;\n /** Whether to show remaining-capacity labels under available slots. */\n showRemainingSpots?: boolean;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Component\n// ─────────────────────────────────────────────────────────────\n\nexport function TimeSlotPicker({\n timeSlots,\n selectedDate,\n onDateChange,\n selectedSlot,\n onSlotSelect,\n partySize,\n onPartySizeChange,\n showPartySize = true,\n showDuration = false,\n selectedDuration,\n onDurationChange,\n maxPartySizeOverride,\n durationPricing,\n currency,\n fullyBookedDates,\n showRemainingSpots = false,\n}: TimeSlotPickerProps) {\n const { locale, domainConfig, domain, classNames } = useResira();\n const minParty = domainConfig.minPartySize ?? 1;\n const maxParty = maxPartySizeOverride ?? domainConfig.maxPartySize ?? 12;\n\n const durations = useMemo(() => {\n if (durationPricing && durationPricing.length > 0) {\n return durationPricing.map((dp) => dp.durationMinutes);\n }\n return domainConfig.availableDurations ?? [60];\n }, [durationPricing, domainConfig.availableDurations]);\n\n const durationPriceMap = useMemo(() => {\n if (!durationPricing) return null;\n const m = new Map<number, number>();\n for (const dp of durationPricing) m.set(dp.durationMinutes, dp.priceCents);\n return m;\n }, [durationPricing]);\n\n const isSeatingDomain = domain === \"restaurant\";\n\n const handleDecrease = useCallback(() => {\n onPartySizeChange(Math.max(minParty, partySize - 1));\n }, [partySize, minParty, onPartySizeChange]);\n\n const handleIncrease = useCallback(() => {\n onPartySizeChange(Math.min(maxParty, partySize + 1));\n }, [partySize, maxParty, onPartySizeChange]);\n\n const filteredSlots = useMemo(\n () =>\n timeSlots.filter((s) => {\n if (!s.available) return true;\n return isSeatingDomain ? s.remaining >= partySize : true;\n }),\n [timeSlots, partySize, isSeatingDomain],\n );\n\n // Determine fully booked dates from props\n const bookedDates = fullyBookedDates ?? new Set<string>();\n\n return (\n <div className=\"resira-time-picker\">\n {/* ── Section 1: Duration (if applicable) ── */}\n {showDuration && durations.length > 1 && (\n <div className=\"resira-time-section\">\n <div className=\"resira-time-section-header\">\n <ClockIcon size={14} />\n <span>{locale.duration}</span>\n </div>\n <div className={`resira-duration-picker ${classNames.durationOption ?? \"\"}`}>\n {durations.map((dur: number) => {\n const price = durationPriceMap?.get(dur);\n return (\n <button\n key={dur}\n type=\"button\"\n className={`resira-duration-chip${selectedDuration === dur ? \" resira-duration-chip--selected\" : \"\"}`}\n onClick={() => onDurationChange?.(dur)}\n >\n <span className=\"resira-duration-chip-label\">{formatDurationLabel(dur)}</span>\n {price != null && (\n <span className=\"resira-duration-chip-price\">\n {formatPriceCents(price, currency)}\n </span>\n )}\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {/* ── Section 2: Date (compact calendar) ── */}\n <div className=\"resira-time-section\">\n <div className=\"resira-time-section-header\">\n <span>Select a date</span>\n {selectedDate && (\n <span className=\"resira-time-section-badge\">\n {formatSelectedDate(selectedDate)}\n </span>\n )}\n </div>\n <CompactCalendar\n selectedDate={selectedDate}\n onDateSelect={onDateChange}\n fullyBookedDates={bookedDates}\n />\n </div>\n\n {/* ── Section 3: Party size ── */}\n {showPartySize && (\n <div className=\"resira-time-section\">\n <div className={`resira-party-row ${classNames.partySize ?? \"\"}`}>\n <span className=\"resira-party-row-label\">{locale.partySize}</span>\n <div className=\"resira-party-row-controls\">\n <button\n type=\"button\"\n className=\"resira-party-btn\"\n onClick={handleDecrease}\n disabled={partySize <= minParty}\n aria-label=\"Decrease party size\"\n >\n <MinusIcon size={12} />\n </button>\n <span className=\"resira-party-value\">{partySize}</span>\n <button\n type=\"button\"\n className=\"resira-party-btn\"\n onClick={handleIncrease}\n disabled={partySize >= maxParty}\n aria-label=\"Increase party size\"\n >\n <PlusIcon size={12} />\n </button>\n </div>\n </div>\n </div>\n )}\n\n {/* ── Section 4: Available time slots ── */}\n <div className=\"resira-time-section\">\n <div className=\"resira-time-section-header\">\n <span>Available times</span>\n {filteredSlots.length > 0 && (\n <span className=\"resira-time-section-count\">\n {filteredSlots.filter((s) => s.available).length} slots\n </span>\n )}\n </div>\n\n {filteredSlots.length > 0 ? (\n <div className=\"resira-slot-grid\">\n {filteredSlots.map((slot) => {\n const isSelected = selectedSlot === slot.start;\n const isUnavailable = isSeatingDomain\n ? !slot.available || slot.remaining < partySize\n : !slot.available;\n\n let cn = `resira-slot ${classNames.timeSlot ?? \"\"}`;\n if (isSelected) cn += ` resira-slot--selected ${classNames.timeSlotSelected ?? \"\"}`;\n if (isUnavailable) cn += \" resira-slot--unavailable\";\n\n return (\n <button\n key={slot.start}\n type=\"button\"\n className={cn}\n disabled={isUnavailable}\n onClick={() => onSlotSelect(slot.start, slot.end)}\n >\n <span className=\"resira-slot-time\">\n {formatSlotTime(slot.start)}\n </span>\n {!isUnavailable && isSeatingDomain && showRemainingSpots && (\n <span className=\"resira-slot-seats\">\n {slot.remaining} left\n </span>\n )}\n </button>\n );\n })}\n </div>\n ) : (\n <div className=\"resira-empty resira-empty--compact\">\n <ClockIcon size={20} />\n <p>{locale.noAvailability}</p>\n </div>\n )}\n </div>\n </div>\n );\n}\n","// ═══════════════════════════════════════════════════════════════\n// @resira/ui — ResourcePicker\n// Card-based resource catalogue for watersport / multi-resource\n// orgs. Shows image, name, price, and duration per resource.\n// Supports multi-image with carousel navigation.\n// ═══════════════════════════════════════════════════════════════\n\nimport React, { useState, useCallback } from \"react\";\nimport type { PublicResource, ResourceImage } from \"../types.js\";\nimport { ClockIcon } from \"../icons.js\";\n\n// ─────────────────────────────────────────────────────────────\n// Props\n// ─────────────────────────────────────────────────────────────\n\nexport interface ResourcePickerProps {\n /** List of resources to display. */\n resources: PublicResource[];\n /** Currently selected resource ID(s). */\n selectedIds: string[];\n /** Callback when a resource is selected. */\n onSelect: (resourceId: string) => void;\n /** Whether the user can select multiple resources at once. */\n allowMultiSelect?: boolean;\n /** Whether the list is loading. */\n loading?: boolean;\n /** Error message if loading failed. */\n error?: string | null;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────\n\nfunction formatPrice(cents: number, currency: string): string {\n return new Intl.NumberFormat(\"default\", {\n style: \"currency\",\n currency,\n }).format(cents / 100);\n}\n\nfunction formatDuration(minutes: number): string {\n if (minutes < 60) return `${minutes} min`;\n const h = Math.floor(minutes / 60);\n const m = minutes % 60;\n if (m === 0) return `${h}h`;\n return `${h}h ${m}m`;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Placeholder image (SVG data URI)\n// ─────────────────────────────────────────────────────────────\n\nconst PLACEHOLDER_IMG =\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='400' height='240' fill='%23e2e8f0'%3E%3Crect width='400' height='240' rx='8'/%3E%3Ctext x='50%25' y='50%25' dominant-baseline='middle' text-anchor='middle' font-family='system-ui' font-size='16' fill='%2394a3b8'%3ENo image%3C/text%3E%3C/svg%3E\";\n\n// ─────────────────────────────────────────────────────────────\n// Image helpers\n// ─────────────────────────────────────────────────────────────\n\n/** Resolve all images for a resource, always returning at least an array with the primary image. */\nfunction resolveImages(resource: PublicResource): ResourceImage[] {\n if (resource.images && resource.images.length > 0) return resource.images;\n if (resource.imageUrl) return [{ url: resource.imageUrl }];\n return [];\n}\n\n// ─────────────────────────────────────────────────────────────\n// Chevron Icons (inline SVGs to avoid extra deps)\n// ─────────────────────────────────────────────────────────────\n\nfunction ChevronLeftIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M10 12L6 8L10 4\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nfunction ChevronRightIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M6 4L10 8L6 12\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\n// ─────────────────────────────────────────────────────────────\n// ResourceImageCarousel — shows cover image with prev/next\n// ─────────────────────────────────────────────────────────────\n\nfunction ResourceImageCarousel({\n images,\n alt,\n}: {\n images: ResourceImage[];\n alt: string;\n}) {\n const [idx, setIdx] = useState(0);\n const hasMultiple = images.length > 1;\n const current = images[idx] ?? images[0];\n\n const goPrev = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n setIdx((i) => (i - 1 + images.length) % images.length);\n },\n [images.length],\n );\n\n const goNext = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n setIdx((i) => (i + 1) % images.length);\n },\n [images.length],\n );\n\n if (!current) {\n return (\n <img\n src={PLACEHOLDER_IMG}\n alt={alt}\n loading=\"lazy\"\n />\n );\n }\n\n const ds = current.displaySettings;\n\n return (\n <div className=\"resira-resource-carousel\">\n <img\n src={current.url}\n alt={alt}\n loading=\"lazy\"\n style={{\n objectFit: ds?.objectFit ?? \"cover\",\n objectPosition: ds?.objectPosition ?? \"center center\",\n transform: ds?.zoom && ds.zoom !== 1 ? `scale(${ds.zoom})` : undefined,\n }}\n />\n\n {hasMultiple && (\n <>\n <button\n type=\"button\"\n className=\"resira-resource-carousel-btn resira-resource-carousel-prev\"\n onClick={goPrev}\n aria-label=\"Previous image\"\n >\n <ChevronLeftIcon />\n </button>\n <button\n type=\"button\"\n className=\"resira-resource-carousel-btn resira-resource-carousel-next\"\n onClick={goNext}\n aria-label=\"Next image\"\n >\n <ChevronRightIcon />\n </button>\n\n {/* Dot indicators */}\n <div className=\"resira-resource-carousel-dots\">\n {images.map((_, i) => (\n <span\n key={i}\n className={`resira-resource-carousel-dot${i === idx ? \" resira-resource-carousel-dot--active\" : \"\"}`}\n />\n ))}\n </div>\n\n {/* Counter badge */}\n <span className=\"resira-resource-carousel-count\">\n {idx + 1}/{images.length}\n </span>\n </>\n )}\n </div>\n );\n}\n\n// ─────────────────────────────────────────────────────────────\n// Component\n// ─────────────────────────────────────────────────────────────\n\nexport function ResourcePicker({\n resources,\n selectedIds,\n onSelect,\n allowMultiSelect = false,\n loading = false,\n error = null,\n}: ResourcePickerProps) {\n if (loading) {\n return (\n <div className=\"resira-loading\" role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\n <div className=\"resira-spinner\" aria-hidden=\"true\" />\n <span className=\"resira-loading-text\">Loading resources…</span>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"resira-error\" role=\"alert\" aria-live=\"assertive\">\n <p className=\"resira-error-message\">{error}</p>\n </div>\n );\n }\n\n if (resources.length === 0) {\n return (\n <div className=\"resira-empty\">\n <p>No resources available at the moment.</p>\n </div>\n );\n }\n\n return (\n <div className=\"resira-resource-picker\">\n {allowMultiSelect && (\n <p className=\"resira-resource-picker-hint\">\n Select one or more options to continue.\n </p>\n )}\n\n <div className=\"resira-resource-grid\">\n {resources.map((resource) => {\n const isSelected = selectedIds.includes(resource.id);\n const price = resource.pricePerSession;\n const currency = resource.currency ?? \"EUR\";\n const duration = resource.durationMinutes;\n\n return (\n <button\n key={resource.id}\n type=\"button\"\n className={`resira-resource-card${isSelected ? \" resira-resource-card--selected\" : \"\"}`}\n onClick={() => onSelect(resource.id)}\n aria-pressed={isSelected}\n >\n {/* Image */}\n <div className=\"resira-resource-card-image\">\n {(() => {\n const images = resolveImages(resource);\n return images.length > 0 ? (\n <ResourceImageCarousel images={images} alt={resource.name} />\n ) : (\n <img\n src={PLACEHOLDER_IMG}\n alt={resource.name}\n loading=\"lazy\"\n />\n );\n })()}\n </div>\n\n {/* Content */}\n <div className=\"resira-resource-card-content\">\n <h3 className=\"resira-resource-card-name\">\n {resource.name}\n </h3>\n\n {resource.description && (\n <p className=\"resira-resource-card-description\">\n {resource.description}\n </p>\n )}\n\n <div className=\"resira-resource-card-meta\">\n {/* Price */}\n {price != null && (\n <span className=\"resira-resource-card-price\">\n {formatPrice(price, currency)}\n <span className=\"resira-resource-card-price-label\">\n / session\n </span>\n </span>\n )}\n\n {/* Duration */}\n {duration != null && (\n <span className=\"resira-resource-card-duration\">\n <ClockIcon size={14} />\n {formatDuration(duration)}\n </span>\n )}\n </div>\n </div>\n\n {/* Selection indicator */}\n {isSelected && (\n <div className=\"resira-resource-card-check\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M13.3 4.3L6 11.6L2.7 8.3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </div>\n )}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","// ═══════════════════════════════════════════════════════════════\n// @resira/ui — ProductSelector\n// Category-first service picker for the booking flow.\n// 1. Shows category tiles (with image from linked resource)\n// 2. Drill-in shows services as image-background overlay cards\n// Supports vertical (default) and horizontal layouts.\n// ═══════════════════════════════════════════════════════════════\n\nimport React, { useMemo, useRef, useState, useEffect } from \"react\";\nimport type { Product, PublicResource } from \"@resira/sdk\";\nimport { useResira } from \"../ResiraProvider.js\";\nimport { ClockIcon, UsersIcon } from \"../icons.js\";\nimport type { ServiceLayout } from \"../types.js\";\n\n// ─────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────\n\nfunction formatPrice(cents: number, currency: string): string {\n return new Intl.NumberFormat(\"default\", {\n style: \"currency\",\n currency,\n }).format(cents / 100);\n}\n\nfunction formatDuration(minutes: number): string {\n if (minutes < 60) return `${minutes} min`;\n const h = Math.floor(minutes / 60);\n const m = minutes % 60;\n if (m === 0) return `${h}h`;\n return `${h}h ${m}m`;\n}\n\nconst PLACEHOLDER_IMG =\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='400' height='240' fill='%23e2e8f0'%3E%3Crect width='400' height='240' rx='8'/%3E%3Ctext x='50%25' y='50%25' dominant-baseline='middle' text-anchor='middle' font-family='system-ui' font-size='16' fill='%2394a3b8'%3ENo image%3C/text%3E%3C/svg%3E\";\n\nconst UNCATEGORIZED_CATEGORY_KEY = \"uncategorized\";\nconst UNCATEGORIZED_CATEGORY_LABEL = \"Other services\";\n\ninterface ProductCategoryGroup {\n id: string;\n label: string;\n imageUrl?: string;\n products: Product[];\n}\n\nfunction formatCategoryLabel(resourceType: string): string {\n return resourceType\n .trim()\n .split(/[_\\-\\s]+/)\n .filter(Boolean)\n .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1).toLowerCase())\n .join(\" \");\n}\n\nfunction groupProductsByCategory(\n products: Product[],\n resources: PublicResource[],\n): ProductCategoryGroup[] {\n const resourceById = new Map(\n resources.map((resource) => [resource.id, resource]),\n );\n const groups = new Map<string, ProductCategoryGroup>();\n\n products.forEach((product) => {\n // Prefer product-level category fields (new API) over resource-based grouping (legacy)\n const productCategory = product.category?.trim();\n\n let groupId: string;\n let label: string;\n let catImage: string | undefined;\n\n if (productCategory) {\n // New category fields from product.availabilityConfig\n groupId = productCategory.toLowerCase();\n label = product.categoryName?.trim()\n ? product.categoryName.trim()\n : formatCategoryLabel(productCategory);\n // Use categoryImage from the product's category metadata\n catImage = product.categoryImage ?? undefined;\n } else {\n // Legacy fallback: group by linked resource's resourceType\n let categoryResource: PublicResource | undefined;\n const categoryType = product.equipmentIds\n .map((equipmentId) => {\n const res = resourceById.get(equipmentId);\n if (res?.resourceType?.trim() && !categoryResource) {\n categoryResource = res;\n }\n return res?.resourceType?.trim();\n })\n .find((resourceType): resourceType is string => Boolean(resourceType));\n\n groupId = categoryType?.toLowerCase() ?? UNCATEGORIZED_CATEGORY_KEY;\n label = categoryType\n ? formatCategoryLabel(categoryType)\n : UNCATEGORIZED_CATEGORY_LABEL;\n catImage = categoryResource?.images?.[0]?.url ?? categoryResource?.imageUrl ?? undefined;\n }\n\n if (!groups.has(groupId)) {\n groups.set(groupId, {\n id: groupId,\n label,\n imageUrl: catImage,\n products: [],\n });\n }\n\n const group = groups.get(groupId)!;\n group.products.push(product);\n // Fill image from categoryImage, then first product image (if allowed in header), then resource image\n if (!group.imageUrl) {\n if (catImage) {\n group.imageUrl = catImage;\n } else {\n const coverImage = product.images?.[0];\n const firstImage = (coverImage?.showInCategoryHeader !== false ? coverImage?.url : undefined) ?? product.imageUrl;\n if (firstImage) {\n group.imageUrl = firstImage;\n }\n }\n }\n });\n\n return Array.from(groups.values());\n}\n\n// ─────────────────────────────────────────────────────────────\n// Props\n// ─────────────────────────────────────────────────────────────\n\nexport interface ProductSelectorProps {\n products: Product[];\n resources?: PublicResource[];\n selectedId?: string;\n onSelect: (product: Product) => void;\n loading?: boolean;\n error?: string | null;\n layout?: ServiceLayout;\n visibleCount?: number;\n groupByCategory?: boolean;\n /** Pre-select a specific category to show (skip category tiles). */\n initialCategory?: string;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Inline icons\n// ─────────────────────────────────────────────────────────────\n\nfunction BackArrow() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M19 12H5\" />\n <path d=\"M12 19l-7-7 7-7\" />\n </svg>\n );\n}\n\n// ─────────────────────────────────────────────────────────────\n// Category tile\n// ─────────────────────────────────────────────────────────────\n\nfunction CategoryTile({\n group,\n onClick,\n}: {\n group: ProductCategoryGroup;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n className=\"resira-category-tile\"\n onClick={onClick}\n >\n <div className=\"resira-category-tile-image\">\n <img\n src={group.imageUrl || PLACEHOLDER_IMG}\n alt={group.label}\n loading=\"lazy\"\n />\n <div className=\"resira-category-tile-overlay\" />\n </div>\n <div className=\"resira-category-tile-content\">\n <h3 className=\"resira-category-tile-name\">{group.label}</h3>\n <span className=\"resira-category-tile-count\">\n {group.products.length} {group.products.length === 1 ? \"service\" : \"services\"}\n </span>\n </div>\n </button>\n );\n}\n\n// ─────────────────────────────────────────────────────────────\n// Service overlay card (image bg + text overlay)\n// ─────────────────────────────────────────────────────────────\n\nfunction ServiceOverlayCard({\n product,\n isSelected,\n locale,\n cardClassName,\n}: {\n product: Product;\n isSelected: boolean;\n locale: Record<string, string>;\n cardClassName?: string;\n}) {\n const currency = product.currency ?? \"EUR\";\n const priceLabel =\n product.pricingModel === \"per_rider\"\n ? \"per rider\"\n : product.pricingModel === \"per_person\"\n ? locale.perPerson\n : locale.perSession;\n\n // Show \"from €X\" when multiple duration/price options exist\n const hasMultipleOptions = (product.durationPricing?.length ?? 0) > 1\n || (product.riderTierPricing?.length ?? 0) > 1;\n const lowestPrice = hasMultipleOptions && product.durationPricing?.length\n ? Math.min(...product.durationPricing.map((dp) => dp.priceCents))\n : product.priceCents;\n const pricePrefix = hasMultipleOptions ? \"from \" : \"\";\n const optionCount = product.durationPricing?.length ?? (product.riderTierPricing?.length ?? 0);\n\n let className = \"resira-service-overlay-card\";\n if (isSelected) className += \" resira-service-overlay-card--selected\";\n if (cardClassName) className += ` ${cardClassName}`;\n\n return (\n <div className={className}>\n <div className=\"resira-service-overlay-card-bg\">\n <img\n src={product.imageUrl ?? PLACEHOLDER_IMG}\n alt={product.name}\n loading=\"lazy\"\n />\n </div>\n <div className=\"resira-service-overlay-card-gradient\" />\n <div className=\"resira-service-overlay-card-content\">\n <div className=\"resira-service-overlay-card-top\">\n <h3 className=\"resira-service-overlay-card-name\">{product.name}</h3>\n {product.description && (\n <p className=\"resira-service-overlay-card-desc\">{product.description}</p>\n )}\n </div>\n <div className=\"resira-service-overlay-card-bottom\">\n <span className=\"resira-service-overlay-card-price\">\n {pricePrefix}{formatPrice(lowestPrice, currency)}\n <span className=\"resira-service-overlay-card-price-unit\">/{priceLabel}</span>\n </span>\n <div className=\"resira-service-overlay-card-pills\">\n {hasMultipleOptions && optionCount > 1 ? (\n <span className=\"resira-service-overlay-card-pill\">\n <ClockIcon size={11} />\n {optionCount} options\n </span>\n ) : product.durationMinutes > 0 ? (\n <span className=\"resira-service-overlay-card-pill\">\n <ClockIcon size={11} />\n {formatDuration(product.durationMinutes)}\n </span>\n ) : null}\n {product.maxPartySize && (\n <span className=\"resira-service-overlay-card-pill\">\n <UsersIcon size={11} />\n max {product.maxPartySize}\n </span>\n )}\n </div>\n </div>\n </div>\n {isSelected && (\n <div className=\"resira-service-card-check\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M13.3 4.3L6 11.6L2.7 8.3\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </div>\n )}\n </div>\n );\n}\n\n// ─────────────────────────────────────────────────────────────\n// Legacy flat card (kept for renderServiceCard compatibility)\n// ─────────────────────────────────────────────────────────────\n\nfunction DefaultServiceCard({\n product,\n isSelected,\n layout,\n locale,\n cardClassName,\n}: {\n product: Product;\n isSelected: boolean;\n layout: ServiceLayout;\n locale: Record<string, string>;\n cardClassName?: string;\n}) {\n const currency = product.currency ?? \"EUR\";\n const priceLabel =\n product.pricingModel === \"per_rider\"\n ? \"per rider\"\n : product.pricingModel === \"per_person\"\n ? locale.perPerson\n : locale.perSession;\n\n // Show \"from €X\" when multiple duration/price options exist\n const hasMultipleOptions = (product.durationPricing?.length ?? 0) > 1\n || (product.riderTierPricing?.length ?? 0) > 1;\n const lowestPrice = hasMultipleOptions && product.durationPricing?.length\n ? Math.min(...product.durationPricing.map((dp) => dp.priceCents))\n : product.priceCents;\n const pricePrefix = hasMultipleOptions ? \"from \" : \"\";\n const optionCount = product.durationPricing?.length ?? (product.riderTierPricing?.length ?? 0);\n\n let className = `resira-service-card resira-service-card--${layout}`;\n if (isSelected) className += \" resira-service-card--selected\";\n if (cardClassName) className += ` ${cardClassName}`;\n\n return (\n <div className={className}>\n <div className=\"resira-service-card-image\">\n <img\n src={product.imageUrl ?? PLACEHOLDER_IMG}\n alt={product.name}\n loading=\"lazy\"\n />\n </div>\n <div className=\"resira-service-card-body\">\n <div className=\"resira-service-card-top\">\n <h3 className=\"resira-service-card-name\">{product.name}</h3>\n {product.description && (\n <p className=\"resira-service-card-desc\">{product.description}</p>\n )}\n </div>\n <div className=\"resira-service-card-bottom\">\n <span className=\"resira-service-card-price\">\n {pricePrefix}{formatPrice(lowestPrice, currency)}\n <span className=\"resira-service-card-price-unit\">/{priceLabel}</span>\n </span>\n <div className=\"resira-service-card-pills\">\n {hasMultipleOptions && optionCount > 1 ? (\n <span className=\"resira-service-card-pill\">\n <ClockIcon size={12} />\n {optionCount} options\n </span>\n ) : product.durationMinutes > 0 ? (\n <span className=\"resira-service-card-pill\">\n <ClockIcon size={12} />\n {formatDuration(product.durationMinutes)}\n </span>\n ) : null}\n {product.pricingModel === \"per_person\" && (\n <span className=\"resira-service-card-pill\">\n <UsersIcon size={12} />\n {product.maxPartySize ? `1–${product.maxPartySize}` : locale.perPerson}\n </span>\n )}\n {product.maxPartySize && product.pricingModel !== \"per_person\" && (\n <span className=\"resira-service-card-pill\">\n <UsersIcon size={12} />\n max {product.maxPartySize}\n </span>\n )}\n </div>\n </div>\n </div>\n {isSelected && (\n <div className=\"resira-service-card-check\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M13.3 4.3L6 11.6L2.7 8.3\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </div>\n )}\n </div>\n );\n}\n\n// ─────────────────────────────────────────────────────────────\n// Component\n// ─────────────────────────────────────────────────────────────\n\nexport function ProductSelector({\n products,\n resources = [],\n selectedId,\n onSelect,\n loading = false,\n error = null,\n layout: layoutProp,\n visibleCount: visibleCountProp,\n groupByCategory: groupByCategoryProp,\n initialCategory,\n}: ProductSelectorProps) {\n const {\n locale,\n serviceLayout: providerLayout,\n visibleServiceCount: providerCount,\n groupServicesByCategory: providerGroupByCategory,\n renderServiceCard,\n classNames,\n } = useResira();\n\n const layout = layoutProp ?? providerLayout;\n const visibleCount = visibleCountProp ?? providerCount;\n const groupByCategory = groupByCategoryProp ?? providerGroupByCategory;\n const containerRef = useRef<HTMLDivElement>(null);\n\n const [activeCategory, setActiveCategory] = useState<string | null>(initialCategory ?? null);\n\n const productGroups = useMemo(\n () => (groupByCategory ? groupProductsByCategory(products, resources) : [{ id: \"all\", label: \"\", imageUrl: undefined, products }]),\n [groupByCategory, products, resources],\n );\n\n const skipCategoryView = productGroups.length <= 1;\n\n useEffect(() => {\n if (initialCategory && productGroups.some((g) => g.id === initialCategory)) {\n setActiveCategory(initialCategory);\n }\n }, [initialCategory, productGroups]);\n\n useEffect(() => {\n if (activeCategory && !productGroups.some((g) => g.id === activeCategory)) {\n setActiveCategory(null);\n }\n }, [activeCategory, productGroups]);\n\n const activeCategoryGroup = useMemo(\n () => productGroups.find((g) => g.id === activeCategory) ?? null,\n [productGroups, activeCategory],\n );\n\n const displayProducts = useMemo(() => {\n if (skipCategoryView) return products;\n return activeCategoryGroup?.products ?? [];\n }, [skipCategoryView, products, activeCategoryGroup]);\n\n const containerStyle = useMemo(() => {\n if (layout === \"horizontal\") return {};\n const cardHeight = 180;\n const gap = 12;\n const maxHeight = visibleCount * cardHeight + (visibleCount - 1) * gap;\n return { maxHeight, overflowY: \"auto\" as const };\n }, [layout, visibleCount]);\n\n if (loading) {\n return (\n <div className=\"resira-loading\" role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\n <div className=\"resira-spinner\" aria-hidden=\"true\" />\n <span className=\"resira-loading-text\">{locale.loading}</span>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"resira-error\" role=\"alert\" aria-live=\"assertive\">\n <p className=\"resira-error-message\">{error}</p>\n </div>\n );\n }\n\n if (products.length === 0) {\n return (\n <div className=\"resira-empty\">\n <p>No services available at the moment.</p>\n </div>\n );\n }\n\n // Category tile view\n if (groupByCategory && !skipCategoryView && !activeCategory) {\n return (\n <div className=\"resira-service-picker\">\n <div className=\"resira-category-grid\">\n {productGroups.map((group) => (\n <CategoryTile\n key={group.id}\n group={group}\n onClick={() => setActiveCategory(group.id)}\n />\n ))}\n </div>\n </div>\n );\n }\n\n // Service cards within a category\n const listClassName = [\n \"resira-service-overlay-list\",\n classNames.serviceList,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className=\"resira-service-picker\">\n {groupByCategory && !skipCategoryView && activeCategory && (\n <button\n type=\"button\"\n className=\"resira-category-back\"\n onClick={() => setActiveCategory(null)}\n >\n <BackArrow />\n <span>{activeCategoryGroup?.label ?? \"All categories\"}</span>\n </button>\n )}\n\n <div\n ref={containerRef}\n className={listClassName}\n style={containerStyle}\n >\n {displayProducts.map((product) => {\n const isSelected = selectedId === product.id;\n return (\n <button\n key={product.id}\n type=\"button\"\n className=\"resira-service-card-btn\"\n onClick={() => onSelect(product)}\n aria-pressed={isSelected}\n >\n {renderServiceCard ? (\n renderServiceCard(product, isSelected)\n ) : (\n <ServiceOverlayCard\n product={product}\n isSelected={isSelected}\n locale={locale as unknown as Record<string, string>}\n cardClassName={\n isSelected\n ? classNames.serviceCardSelected\n : classNames.serviceCard\n }\n />\n )}\n </button>\n );\n })}\n </div>\n\n {displayProducts.length > visibleCount && (\n <div className=\"resira-service-scroll-hint\">\n <span>Scroll for more</span>\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\">\n <path d=\"M4 6l4 4 4-4\" />\n </svg>\n </div>\n )}\n </div>\n );\n}\n","// ═══════════════════════════════════════════════════════════════\n// @resira/ui — GuestForm (v2)\n// Compact 2-column layout with inline validation.\n// Restaurant mode: name + phone primary, email optional (at least one contact required).\n// ═══════════════════════════════════════════════════════════════\n\nimport React, { useCallback } from \"react\";\nimport { useResira } from \"../ResiraProvider.js\";\nimport { UserIcon, MailIcon, PhoneIcon, NoteIcon } from \"../icons.js\";\nimport type { GuestFormValues, GuestFormErrors } from \"../types.js\";\n\n// ─────────────────────────────────────────────────────────────\n// Validation\n// ─────────────────────────────────────────────────────────────\n\nconst EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\n/**\n * Validate the guest form. Returns an errors object (empty = valid).\n *\n * When `contactMode` is `\"either\"` (restaurant), at least one of\n * phone or email must be provided but neither is individually required.\n */\nexport function validateGuestForm(\n values: GuestFormValues,\n labels: { required: string; invalidEmail: string; contactRequired?: string },\n contactMode: \"email-required\" | \"either\" = \"email-required\",\n): GuestFormErrors {\n const errors: GuestFormErrors = {};\n if (!values.guestName.trim()) errors.guestName = labels.required;\n\n if (contactMode === \"either\") {\n const hasPhone = values.guestPhone.trim().length > 0;\n const hasEmail = values.guestEmail.trim().length > 0;\n if (!hasPhone && !hasEmail) {\n const msg = labels.contactRequired ?? \"Phone or email required\";\n errors.guestPhone = msg;\n errors.guestEmail = msg;\n } else if (hasEmail && !EMAIL_RE.test(values.guestEmail.trim())) {\n errors.guestEmail = labels.invalidEmail;\n }\n } else {\n if (!values.guestEmail.trim()) {\n errors.guestEmail = labels.required;\n } else if (!EMAIL_RE.test(values.guestEmail.trim())) {\n errors.guestEmail = labels.invalidEmail;\n }\n }\n\n return errors;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Props\n// ─────────────────────────────────────────────────────────────\n\ninterface GuestFormProps {\n values: GuestFormValues;\n onChange: (values: GuestFormValues) => void;\n errors?: GuestFormErrors;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Component\n// ─────────────────────────────────────────────────────────────\n\nexport function GuestForm({ values, onChange, errors = {} }: GuestFormProps) {\n const { locale, domain } = useResira();\n const isRestaurant = domain === \"restaurant\";\n\n const update = useCallback(\n (field: keyof GuestFormValues, value: string) => {\n onChange({ ...values, [field]: value });\n },\n [values, onChange],\n );\n\n if (isRestaurant) {\n return (\n <div className=\"resira-form resira-form--compact\">\n {/* Name — full width for restaurant */}\n <div className=\"resira-field\">\n <label className=\"resira-field-label\">\n {locale.fullName}\n <span>*</span>\n </label>\n <div className=\"resira-field-input-wrap\">\n <UserIcon size={15} className=\"resira-field-input-icon\" />\n <input\n type=\"text\"\n className={`resira-field-input resira-field-input--sm${errors.guestName ? \" resira-field-input--error\" : \"\"}`}\n value={values.guestName}\n onChange={(e) => update(\"guestName\", e.target.value)}\n placeholder={locale.fullName}\n autoComplete=\"name\"\n />\n </div>\n {errors.guestName && (\n <span className=\"resira-field-error\">{errors.guestName}</span>\n )}\n </div>\n\n {/* Phone + Email — side by side, at least one required */}\n <div className=\"resira-form-row\">\n <div className=\"resira-field resira-field--half\">\n <label className=\"resira-field-label\">\n {locale.phone}\n <span className=\"resira-field-label-hint\">*</span>\n </label>\n <div className=\"resira-field-input-wrap\">\n <PhoneIcon size={15} className=\"resira-field-input-icon\" />\n <input\n type=\"tel\"\n className={`resira-field-input resira-field-input--sm${errors.guestPhone ? \" resira-field-input--error\" : \"\"}`}\n value={values.guestPhone}\n onChange={(e) => update(\"guestPhone\", e.target.value)}\n placeholder={locale.phone}\n autoComplete=\"tel\"\n />\n </div>\n {errors.guestPhone && (\n <span className=\"resira-field-error\">{errors.guestPhone}</span>\n )}\n </div>\n\n <div className=\"resira-field resira-field--half\">\n <label className=\"resira-field-label\">\n {locale.email}\n <span className=\"resira-field-label-hint\">*</span>\n </label>\n <div className=\"resira-field-input-wrap\">\n <MailIcon size={15} className=\"resira-field-input-icon\" />\n <input\n type=\"email\"\n className={`resira-field-input resira-field-input--sm${errors.guestEmail ? \" resira-field-input--error\" : \"\"}`}\n value={values.guestEmail}\n onChange={(e) => update(\"guestEmail\", e.target.value)}\n placeholder={locale.email}\n autoComplete=\"email\"\n />\n </div>\n {errors.guestEmail && (\n <span className=\"resira-field-error\">{errors.guestEmail}</span>\n )}\n </div>\n </div>\n\n {/* Hint text */}\n <p className=\"resira-field-hint\">{locale.contactHint ?? \"Please provide at least a phone number or email\"}</p>\n\n {/* Notes */}\n <div className=\"resira-field\">\n <label className=\"resira-field-label\">{locale.notes}</label>\n <div className=\"resira-field-input-wrap resira-field-input-wrap--textarea\">\n <NoteIcon size={15} className=\"resira-field-input-icon\" />\n <textarea\n className=\"resira-field-input resira-field-input--sm\"\n value={values.notes}\n onChange={(e) => update(\"notes\", e.target.value)}\n placeholder={locale.restaurantNotesPlaceholder ?? \"Allergies, special requests...\"}\n rows={2}\n />\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"resira-form resira-form--compact\">\n {/* Name + Email — side by side */}\n <div className=\"resira-form-row\">\n <div className=\"resira-field resira-field--half\">\n <label className=\"resira-field-label\">\n {locale.fullName}\n <span>*</span>\n </label>\n <div className=\"resira-field-input-wrap\">\n <UserIcon size={15} className=\"resira-field-input-icon\" />\n <input\n type=\"text\"\n className={`resira-field-input resira-field-input--sm${errors.guestName ? \" resira-field-input--error\" : \"\"}`}\n value={values.guestName}\n onChange={(e) => update(\"guestName\", e.target.value)}\n placeholder={locale.fullName}\n autoComplete=\"name\"\n />\n </div>\n {errors.guestName && (\n <span className=\"resira-field-error\">{errors.guestName}</span>\n )}\n </div>\n\n <div className=\"resira-field resira-field--half\">\n <label className=\"resira-field-label\">\n {locale.email}\n <span>*</span>\n </label>\n <div className=\"resira-field-input-wrap\">\n <MailIcon size={15} className=\"resira-field-input-icon\" />\n <input\n type=\"email\"\n className={`resira-field-input resira-field-input--sm${errors.guestEmail ? \" resira-field-input--error\" : \"\"}`}\n value={values.guestEmail}\n onChange={(e) => update(\"guestEmail\", e.target.value)}\n placeholder={locale.email}\n autoComplete=\"email\"\n />\n </div>\n {errors.guestEmail && (\n <span className=\"resira-field-error\">{errors.guestEmail}</span>\n )}\n </div>\n </div>\n\n {/* Phone */}\n <div className=\"resira-field\">\n <label className=\"resira-field-label\">{locale.phone}</label>\n <div className=\"resira-field-input-wrap\">\n <PhoneIcon size={15} className=\"resira-field-input-icon\" />\n <input\n type=\"tel\"\n className=\"resira-field-input resira-field-input--sm\"\n value={values.guestPhone}\n onChange={(e) => update(\"guestPhone\", e.target.value)}\n placeholder={locale.phone}\n autoComplete=\"tel\"\n />\n </div>\n </div>\n\n {/* Notes */}\n <div className=\"resira-field\">\n <label className=\"resira-field-label\">{locale.notes}</label>\n <div className=\"resira-field-input-wrap resira-field-input-wrap--textarea\">\n <NoteIcon size={15} className=\"resira-field-input-icon\" />\n <textarea\n className=\"resira-field-input resira-field-input--sm\"\n value={values.notes}\n onChange={(e) => update(\"notes\", e.target.value)}\n placeholder={locale.notes}\n rows={2}\n />\n </div>\n </div>\n </div>\n );\n}\n","// ═══════════════════════════════════════════════════════════════\n// @resira/ui — WaiverConsent (v2)\n// Compact terms, waiver, refund policy, and promo code.\n// ═══════════════════════════════════════════════════════════════\n\nimport React, { useState, useCallback } from \"react\";\nimport { useResira } from \"../ResiraProvider.js\";\nimport { CheckCircleIcon, AlertCircleIcon, TagIcon } from \"../icons.js\";\nimport type { ValidatePromoCodeResponse } from \"@resira/sdk\";\n\n// ─────────────────────────────────────────────────────────────\n// Props\n// ─────────────────────────────────────────────────────────────\n\nexport interface WaiverConsentProps {\n termsAccepted: boolean;\n onTermsChange: (accepted: boolean) => void;\n waiverAccepted: boolean;\n onWaiverChange: (accepted: boolean) => void;\n discountCode: string;\n onDiscountCodeChange: (code: string) => void;\n onPromoValidated?: (result: ValidatePromoCodeResponse) => void;\n error?: string;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Component\n// ─────────────────────────────────────────────────────────────\n\nexport function WaiverConsent({\n termsAccepted,\n onTermsChange,\n waiverAccepted,\n onWaiverChange,\n discountCode,\n onDiscountCodeChange,\n onPromoValidated,\n error,\n}: WaiverConsentProps) {\n const { client, locale, showTerms, showWaiver, termsText, waiverText, refundPolicy } = useResira();\n\n const [promoValidating, setPromoValidating] = useState(false);\n const [promoResult, setPromoResult] = useState<ValidatePromoCodeResponse | null>(null);\n\n const handleApplyPromo = useCallback(async () => {\n const code = discountCode.trim();\n if (!code) return;\n\n setPromoValidating(true);\n setPromoResult(null);\n\n try {\n const result = await client.validatePromoCode(code);\n setPromoResult(result);\n if (result.valid) {\n onPromoValidated?.(result);\n }\n } catch {\n setPromoResult({ valid: false, error: locale.discountInvalid });\n } finally {\n setPromoValidating(false);\n }\n }, [client, discountCode, locale.discountInvalid, onPromoValidated]);\n\n const handleCodeChange = useCallback(\n (code: string) => {\n onDiscountCodeChange(code);\n if (promoResult) setPromoResult(null);\n },\n [onDiscountCodeChange, promoResult],\n );\n\n return (\n <div className=\"resira-waiver resira-waiver--compact\">\n {/* Terms + Waiver checkboxes */}\n {(showTerms || showWaiver) && (\n <div className=\"resira-waiver-checks\">\n {showTerms && (\n <label className=\"resira-waiver-row resira-waiver-row--compact\">\n <input\n type=\"checkbox\"\n className=\"resira-waiver-checkbox\"\n checked={termsAccepted}\n onChange={(e) => onTermsChange(e.target.checked)}\n />\n <span className=\"resira-waiver-label\">\n {termsText || locale.termsAccept}\n </span>\n </label>\n )}\n\n {showWaiver && (\n <label className=\"resira-waiver-row resira-waiver-row--compact\">\n <input\n type=\"checkbox\"\n className=\"resira-waiver-checkbox\"\n checked={waiverAccepted}\n onChange={(e) => onWaiverChange(e.target.checked)}\n />\n <span className=\"resira-waiver-label\">\n {waiverText || locale.waiverAccept}\n </span>\n </label>\n )}\n </div>\n )}\n\n {/* Refund policy — compact inline */}\n {refundPolicy.length > 0 && (\n <div className=\"resira-waiver-refund\">\n <span className=\"resira-waiver-refund-title\">{locale.refundPolicyTitle}</span>\n <div className=\"resira-waiver-refund-chips\">\n {refundPolicy\n .slice()\n .sort((a, b) => b.hoursBeforeStart - a.hoursBeforeStart)\n .map((rule, i) => (\n <span key={i} className=\"resira-waiver-refund-chip\">\n <strong>\n {rule.refundPercent === 100\n ? \"100%\"\n : rule.refundPercent === 0\n ? \"0%\"\n : `${rule.refundPercent}%`}\n </strong>\n {\" \"}\n {rule.hoursBeforeStart >= 24\n ? `${Math.floor(rule.hoursBeforeStart / 24)}d+`\n : rule.hoursBeforeStart > 0\n ? `${rule.hoursBeforeStart}h+`\n : \"< above\"}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {/* Error */}\n {error && (\n <p className=\"resira-waiver-error\">{error}</p>\n )}\n\n {/* Promo code — inline row */}\n <div className=\"resira-waiver-promo\">\n <div className=\"resira-waiver-promo-row\">\n <TagIcon size={14} />\n <input\n type=\"text\"\n className=\"resira-field-input resira-field-input--sm resira-waiver-promo-input\"\n value={discountCode}\n onChange={(e) => handleCodeChange(e.target.value.toUpperCase())}\n placeholder={locale.discountPlaceholder}\n disabled={promoResult?.valid === true}\n />\n {!promoResult?.valid && (\n <button\n type=\"button\"\n className=\"resira-btn resira-btn--secondary resira-waiver-promo-btn\"\n onClick={handleApplyPromo}\n disabled={!discountCode.trim() || promoValidating}\n >\n {promoValidating ? (\n <div className=\"resira-spinner\" style={{ width: 12, height: 12 }} />\n ) : (\n locale.discountApply\n )}\n </button>\n )}\n </div>\n\n {promoResult && (\n <div\n className={`resira-waiver-discount-result ${\n promoResult.valid\n ? \"resira-waiver-discount-result--valid\"\n : \"resira-waiver-discount-result--invalid\"\n }`}\n >\n {promoResult.valid ? (\n <>\n <CheckCircleIcon size={13} />\n <span>\n {locale.discountApplied}{\" \"}\n {promoResult.discountType === \"percent\"\n ? `(${promoResult.discountValue}% off)`\n : promoResult.discountType === \"fixed\" && promoResult.discountValue\n ? `(${(promoResult.discountValue / 100).toFixed(2)} ${promoResult.currency ?? \"\"} off)`\n : \"\"}\n </span>\n </>\n ) : (\n <>\n <AlertCircleIcon size={13} />\n <span>{promoResult.error ?? locale.discountInvalid}</span>\n </>\n )}\n </div>\n )}\n </div>\n </div>\n );\n}\n","// ═══════════════════════════════════════════════════════════════\n// @resira/ui — PaymentForm\n// Stripe Elements wrapper for secure card/wallet payment.\n// Uses vanilla Stripe.js (no @stripe/react-stripe-js dependency).\n// ═══════════════════════════════════════════════════════════════\n\nimport React, { useEffect, useRef, useState, useCallback } from \"react\";\nimport { useResira } from \"../ResiraProvider.js\";\nimport { LockIcon, CreditCardIcon, AlertCircleIcon } from \"../icons.js\";\n\n// ─────────────────────────────────────────────────────────────\n// Dynamic Stripe.js loader (loads script once, returns Stripe)\n// ─────────────────────────────────────────────────────────────\n\nlet stripePromise: Promise<any> | null = null;\n\nfunction loadStripeJs(publishableKey: string): Promise<any> {\n if (stripePromise) return stripePromise;\n\n stripePromise = new Promise((resolve, reject) => {\n // Check if already loaded\n if ((window as any).Stripe) {\n resolve((window as any).Stripe(publishableKey));\n return;\n }\n\n const script = document.createElement(\"script\");\n script.src = \"https://js.stripe.com/v3/\";\n script.async = true;\n script.onload = () => {\n if ((window as any).Stripe) {\n resolve((window as any).Stripe(publishableKey));\n } else {\n reject(new Error(\"Stripe.js failed to load\"));\n }\n };\n script.onerror = () => reject(new Error(\"Failed to load Stripe.js\"));\n document.head.appendChild(script);\n });\n\n return stripePromise;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Props\n// ─────────────────────────────────────────────────────────────\n\nexport interface PaymentFormProps {\n /** Stripe client secret from the payment intent. */\n clientSecret: string;\n /** Amount to charge now (cents). */\n amountNow: number;\n /** Amount to charge at venue (cents). */\n amountAtVenue: number;\n /** Total amount (cents). */\n totalAmount: number;\n /** Currency code. */\n currency: string;\n /** Called when payment succeeds. Receives the paymentIntent ID. */\n onSuccess: (paymentIntentId: string) => void;\n /** Called when payment fails. */\n onError: (message: string) => void;\n /** Whether the form is in a processing state. */\n processing?: boolean;\n /** Discount amount in cents (if a promo code was applied). */\n discountAmount?: number;\n /** Original price before discount (cents). */\n originalPrice?: number;\n /** The promo code that was applied. */\n promoCodeApplied?: string;\n /** Hide the built-in submit button so navigation can be driven externally. */\n hideSubmitButton?: boolean;\n /** Increment to request a submit from an external footer action. */\n submitRequestId?: number;\n /** Called when the payment element becomes ready or not ready. */\n onReadyChange?: (ready: boolean) => void;\n /** Called when the form starts or stops processing a submission. */\n onSubmittingChange?: (submitting: boolean) => void;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────\n\nfunction formatPrice(cents: number, currency: string): string {\n return new Intl.NumberFormat(\"default\", {\n style: \"currency\",\n currency,\n }).format(cents / 100);\n}\n\n// ─────────────────────────────────────────────────────────────\n// Component\n// ─────────────────────────────────────────────────────────────\n\nexport function PaymentForm({\n clientSecret,\n amountNow,\n amountAtVenue,\n totalAmount,\n currency,\n onSuccess,\n onError,\n processing = false,\n discountAmount,\n originalPrice,\n promoCodeApplied,\n hideSubmitButton = false,\n submitRequestId,\n onReadyChange,\n onSubmittingChange,\n}: PaymentFormProps) {\n const { locale, theme, stripePublishableKey } = useResira();\n const mountRef = useRef<HTMLDivElement>(null);\n const stripeRef = useRef<any>(null);\n const elementsRef = useRef<any>(null);\n const paymentElementRef = useRef<any>(null);\n const [ready, setReady] = useState(false);\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const lastSubmitRequestRef = useRef(submitRequestId ?? 0);\n\n // Initialize Stripe Elements\n useEffect(() => {\n setReady(false);\n if (!stripePublishableKey || !clientSecret || !mountRef.current) return;\n\n let cancelled = false;\n\n async function init() {\n try {\n const stripe = await loadStripeJs(stripePublishableKey!);\n if (cancelled) return;\n stripeRef.current = stripe;\n\n const elements = stripe.elements({\n clientSecret,\n appearance: {\n theme: \"stripe\",\n variables: {\n colorPrimary: theme.primaryColor,\n colorBackground: theme.surfaceColor,\n colorText: theme.textColor,\n colorDanger: theme.errorColor,\n fontFamily: theme.fontFamily,\n borderRadius: \"8px\",\n spacingUnit: \"4px\",\n },\n rules: {\n \".Input\": {\n border: `1px solid ${theme.borderColor}`,\n boxShadow: \"none\",\n padding: \"12px 14px\",\n fontSize: \"15px\",\n },\n \".Input:focus\": {\n border: `1px solid ${theme.primaryColor}`,\n boxShadow: `0 0 0 3px ${theme.primaryColor}20`,\n },\n \".Label\": {\n fontSize: \"14px\",\n fontWeight: \"500\",\n marginBottom: \"6px\",\n },\n },\n },\n });\n\n if (cancelled) return;\n elementsRef.current = elements;\n\n const paymentElement = elements.create(\"payment\", {\n layout: \"tabs\",\n });\n\n paymentElement.mount(mountRef.current!);\n paymentElementRef.current = paymentElement;\n\n paymentElement.on(\"ready\", () => {\n if (!cancelled) setReady(true);\n });\n } catch (err) {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : \"Failed to load payment form\");\n }\n }\n }\n\n init();\n\n return () => {\n cancelled = true;\n if (paymentElementRef.current) {\n try { paymentElementRef.current.destroy(); } catch {}\n }\n };\n }, [stripePublishableKey, clientSecret, theme]);\n\n // Handle payment submission\n const handleSubmit = useCallback(async () => {\n if (!stripeRef.current || !elementsRef.current || submitting || processing) return;\n\n setSubmitting(true);\n setError(null);\n\n try {\n const { error: submitError } = await elementsRef.current.submit();\n if (submitError) {\n setError(submitError.message);\n setSubmitting(false);\n return;\n }\n\n const result = await stripeRef.current.confirmPayment({\n elements: elementsRef.current,\n clientSecret,\n confirmParams: {\n return_url: window.location.href,\n },\n redirect: \"if_required\",\n });\n\n if (result.error) {\n setError(result.error.message);\n onError(result.error.message);\n } else if (result.paymentIntent) {\n onSuccess(result.paymentIntent.id);\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : \"Payment failed\";\n setError(msg);\n onError(msg);\n } finally {\n setSubmitting(false);\n }\n }, [clientSecret, submitting, processing, onSuccess, onError]);\n\n const isProcessing = submitting || processing;\n\n useEffect(() => {\n onReadyChange?.(ready);\n }, [ready, onReadyChange]);\n\n useEffect(() => {\n onSubmittingChange?.(isProcessing);\n }, [isProcessing, onSubmittingChange]);\n\n useEffect(() => {\n if (!hideSubmitButton || submitRequestId == null) return;\n if (submitRequestId === lastSubmitRequestRef.current) return;\n lastSubmitRequestRef.current = submitRequestId;\n void handleSubmit();\n }, [hideSubmitButton, submitRequestId, handleSubmit]);\n\n return (\n <div className=\"resira-payment\">\n {/* Price breakdown */}\n <div className=\"resira-payment-breakdown\">\n <div className=\"resira-summary\">\n {/* Original price + discount (if promo applied) */}\n {discountAmount != null && discountAmount > 0 && originalPrice != null && (\n <>\n <div className=\"resira-summary-row\">\n <span className=\"resira-summary-label\">{locale.originalPrice ?? \"Original\"}</span>\n <span className=\"resira-summary-value\" style={{ textDecoration: \"line-through\", opacity: 0.6 }}>\n {formatPrice(originalPrice, currency)}\n </span>\n </div>\n <div className=\"resira-summary-row\">\n <span className=\"resira-summary-label resira-payment-discount\">\n {locale.discountLabel ?? \"Discount\"}\n {promoCodeApplied && (\n <span className=\"resira-payment-promo-badge\">{promoCodeApplied}</span>\n )}\n </span>\n <span className=\"resira-summary-value resira-payment-discount\">\n −{formatPrice(discountAmount, currency)}\n </span>\n </div>\n </>\n )}\n <div className=\"resira-summary-row\">\n <span className=\"resira-summary-label\">{locale.payNow}</span>\n <span className=\"resira-summary-value resira-payment-amount-now\">\n {formatPrice(amountNow, currency)}\n </span>\n </div>\n {amountAtVenue > 0 && (\n <div className=\"resira-summary-row\">\n <span className=\"resira-summary-label\">{locale.payAtVenue}</span>\n <span className=\"resira-summary-value resira-payment-amount-venue\">\n {formatPrice(amountAtVenue, currency)}\n </span>\n </div>\n )}\n <div className=\"resira-summary-divider\" />\n <div className=\"resira-summary-row\">\n <span className=\"resira-summary-label resira-summary-total\">{locale.total}</span>\n <span className=\"resira-summary-value resira-summary-total\">\n {formatPrice(totalAmount, currency)}\n </span>\n </div>\n </div>\n </div>\n\n {/* Stripe Payment Element */}\n <div className=\"resira-payment-element-container\">\n {!ready && !error && (\n <div className=\"resira-loading\" style={{ padding: \"24px 0\" }} role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\n <div className=\"resira-spinner\" aria-hidden=\"true\" />\n <span className=\"resira-loading-text\">{locale.loading}</span>\n </div>\n )}\n <div\n ref={mountRef}\n className=\"resira-payment-element\"\n style={{ display: ready ? \"block\" : \"none\" }}\n />\n </div>\n\n {/* Error */}\n {error && (\n <div className=\"resira-payment-error\" role=\"alert\" aria-live=\"assertive\">\n <AlertCircleIcon size={16} />\n <span>{error}</span>\n </div>\n )}\n\n {/* Pay button */}\n {ready && !hideSubmitButton && (\n <button\n type=\"button\"\n className=\"resira-btn resira-btn--primary resira-payment-btn\"\n onClick={handleSubmit}\n disabled={isProcessing}\n >\n {isProcessing ? (\n <>\n <div className=\"resira-spinner\" style={{ width: 16, height: 16 }} />\n {locale.processingPayment}\n </>\n ) : (\n <>\n <LockIcon size={16} />\n {locale.payNow} — {formatPrice(amountNow, currency)}\n </>\n )}\n </button>\n )}\n\n {/* Security badge */}\n <div className=\"resira-payment-secure\">\n <CreditCardIcon size={14} />\n <span>Secured by Stripe · 256-bit SSL encryption</span>\n </div>\n </div>\n );\n}\n","// ═══════════════════════════════════════════════════════════════\n// @resira/ui — ReservationSummary (v2)\n// Compact, icon-enriched booking summary + confirmation.\n// ═══════════════════════════════════════════════════════════════\n\nimport React from \"react\";\nimport type { Reservation } from \"@resira/sdk\";\nimport { useResira } from \"../ResiraProvider.js\";\nimport type { BookingSelection, GuestFormValues } from \"../types.js\";\nimport {\n CheckCircleIcon,\n CalendarIcon,\n ClockIcon,\n UsersIcon,\n UserIcon,\n MailIcon,\n} from \"../icons.js\";\n\n// ─────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────\n\nfunction formatDate(dateStr: string): string {\n try {\n const d = new Date(dateStr + \"T00:00:00\");\n return d.toLocaleDateString(\"default\", {\n weekday: \"short\",\n month: \"short\",\n day: \"numeric\",\n });\n } catch {\n return dateStr;\n }\n}\n\nfunction formatTime(isoStr: string): string {\n try {\n const d = new Date(isoStr);\n return d.toLocaleTimeString(\"default\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n } catch {\n return isoStr;\n }\n}\n\nfunction formatPrice(cents: number, currency: string): string {\n return new Intl.NumberFormat(\"default\", {\n style: \"currency\",\n currency,\n }).format(cents / 100);\n}\n\nfunction nightsBetween(start: string, end: string): number {\n const a = new Date(start);\n const b = new Date(end);\n return Math.round((b.getTime() - a.getTime()) / (1000 * 60 * 60 * 24));\n}\n\n// ─────────────────────────────────────────────────────────────\n// Pre-confirmation summary (compact card)\n// ─────────────────────────────────────────────────────────────\n\ninterface SummaryPreviewProps {\n selection: BookingSelection;\n guest: GuestFormValues;\n totalPrice?: number;\n currency?: string;\n}\n\nexport function SummaryPreview({\n selection,\n guest,\n totalPrice,\n currency = \"EUR\",\n}: SummaryPreviewProps) {\n const { locale, domain } = useResira();\n const isDateBased = domain === \"rental\";\n\n return (\n <div className=\"resira-summary-card\">\n {/* Booking details section */}\n <div className=\"resira-summary-section\">\n <div className=\"resira-summary-section-title\">Booking Details</div>\n <div className=\"resira-summary-grid\">\n {/* Date/Time */}\n {isDateBased && selection.startDate && selection.endDate && (\n <>\n <div className=\"resira-summary-item\">\n <CalendarIcon size={14} />\n <div className=\"resira-summary-item-content\">\n <span className=\"resira-summary-item-label\">{locale.checkIn}</span>\n <span className=\"resira-summary-item-value\">{formatDate(selection.startDate)}</span>\n </div>\n </div>\n <div className=\"resira-summary-item\">\n <CalendarIcon size={14} />\n <div className=\"resira-summary-item-content\">\n <span className=\"resira-summary-item-label\">{locale.checkOut}</span>\n <span className=\"resira-summary-item-value\">{formatDate(selection.endDate)}</span>\n </div>\n </div>\n <div className=\"resira-summary-item\">\n <ClockIcon size={14} />\n <div className=\"resira-summary-item-content\">\n <span className=\"resira-summary-item-label\">{locale.nights}</span>\n <span className=\"resira-summary-item-value\">{nightsBetween(selection.startDate, selection.endDate)}</span>\n </div>\n </div>\n </>\n )}\n\n {!isDateBased && selection.startDate && (\n <div className=\"resira-summary-item\">\n <CalendarIcon size={14} />\n <div className=\"resira-summary-item-content\">\n <span className=\"resira-summary-item-label\">Date</span>\n <span className=\"resira-summary-item-value\">{formatDate(selection.startDate)}</span>\n </div>\n </div>\n )}\n\n {!isDateBased && selection.startTime && (\n <div className=\"resira-summary-item\">\n <ClockIcon size={14} />\n <div className=\"resira-summary-item-content\">\n <span className=\"resira-summary-item-label\">Time</span>\n <span className=\"resira-summary-item-value\">\n {formatTime(selection.startTime)}\n {selection.endTime && ` – ${formatTime(selection.endTime)}`}\n </span>\n </div>\n </div>\n )}\n\n <div className=\"resira-summary-item\">\n <UsersIcon size={14} />\n <div className=\"resira-summary-item-content\">\n <span className=\"resira-summary-item-label\">{locale.guests}</span>\n <span className=\"resira-summary-item-value\">{selection.partySize}</span>\n </div>\n </div>\n\n {selection.duration && (\n <div className=\"resira-summary-item\">\n <ClockIcon size={14} />\n <div className=\"resira-summary-item-content\">\n <span className=\"resira-summary-item-label\">{locale.duration}</span>\n <span className=\"resira-summary-item-value\">{selection.duration} {locale.minutes}</span>\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Guest info section */}\n <div className=\"resira-summary-section\">\n <div className=\"resira-summary-section-title\">Guest</div>\n <div className=\"resira-summary-grid\">\n <div className=\"resira-summary-item\">\n <UserIcon size={14} />\n <div className=\"resira-summary-item-content\">\n <span className=\"resira-summary-item-label\">{locale.fullName}</span>\n <span className=\"resira-summary-item-value\">{guest.guestName}</span>\n </div>\n </div>\n <div className=\"resira-summary-item\">\n <MailIcon size={14} />\n <div className=\"resira-summary-item-content\">\n <span className=\"resira-summary-item-label\">{locale.email}</span>\n <span className=\"resira-summary-item-value\">{guest.guestEmail}</span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Price */}\n {totalPrice !== undefined && (\n <div className=\"resira-summary-price-bar\">\n <span className=\"resira-summary-price-label\">{locale.total}</span>\n <span className=\"resira-summary-price-value\">{formatPrice(totalPrice, currency)}</span>\n </div>\n )}\n </div>\n );\n}\n\n// ─────────────────────────────────────────────────────────────\n// Post-confirmation view\n// ─────────────────────────────────────────────────────────────\n\ninterface ConfirmationViewProps {\n reservation: Reservation;\n}\n\nexport function ConfirmationView({ reservation }: ConfirmationViewProps) {\n const { locale } = useResira();\n\n return (\n <div className=\"resira-confirmation\">\n <div className=\"resira-confirmation-icon\">\n <CheckCircleIcon size={28} />\n </div>\n <h3 className=\"resira-confirmation-title\">{locale.bookingConfirmed}</h3>\n <p className=\"resira-confirmation-subtitle\">\n {reservation.id.slice(0, 8).toUpperCase()}\n </p>\n\n <div className=\"resira-confirmation-details\">\n <div className=\"resira-summary-grid\">\n {reservation.startDate && (\n <div className=\"resira-summary-item\">\n <CalendarIcon size={14} />\n <div className=\"resira-summary-item-content\">\n <span className=\"resira-summary-item-label\">{locale.checkIn}</span>\n <span className=\"resira-summary-item-value\">{formatDate(reservation.startDate)}</span>\n </div>\n </div>\n )}\n {reservation.endDate && (\n <div className=\"resira-summary-item\">\n <CalendarIcon size={14} />\n <div className=\"resira-summary-item-content\">\n <span className=\"resira-summary-item-label\">{locale.checkOut}</span>\n <span className=\"resira-summary-item-value\">{formatDate(reservation.endDate)}</span>\n </div>\n </div>\n )}\n {reservation.startTime && (\n <div className=\"resira-summary-item\">\n <ClockIcon size={14} />\n <div className=\"resira-summary-item-content\">\n <span className=\"resira-summary-item-label\">Time</span>\n <span className=\"resira-summary-item-value\">\n {formatTime(reservation.startTime)}\n {reservation.endTime && ` – ${formatTime(reservation.endTime)}`}\n </span>\n </div>\n </div>\n )}\n <div className=\"resira-summary-item\">\n <UsersIcon size={14} />\n <div className=\"resira-summary-item-content\">\n <span className=\"resira-summary-item-label\">{locale.guests}</span>\n <span className=\"resira-summary-item-value\">{reservation.partySize}</span>\n </div>\n </div>\n </div>\n {reservation.totalPrice > 0 && (\n <div className=\"resira-summary-price-bar\" style={{ marginTop: 12 }}>\n <span className=\"resira-summary-price-label\">{locale.total}</span>\n <span className=\"resira-summary-price-value\">\n {formatPrice(reservation.totalPrice, reservation.currency)}\n </span>\n </div>\n )}\n </div>\n </div>\n );\n}\n","// ═══════════════════════════════════════════════════════════════\n// @resira/ui — ResiraBookingWidget\n// Main orchestrator widget. Fully domain-aware.\n// Watersport/Service flow:\n// Service → Availability → Guest Details → Terms → Payment → ✓\n// Rental flow:\n// [Resource] → Availability → Guest Details → Terms → Payment → ✓\n// ═══════════════════════════════════════════════════════════════\n\nimport React, { useState, useCallback, useMemo, useEffect } from \"react\";\nimport type { CreateReservationRequest, Product, ValidatePromoCodeResponse } from \"@resira/sdk\";\nimport { useResira } from \"./ResiraProvider.js\";\nimport { useAvailability, useReservation, useResources, useProducts, usePaymentIntent, useCheckoutSession } from \"./hooks.js\";\nimport { BookingCalendar } from \"./components/BookingCalendar.js\";\nimport { TimeSlotPicker } from \"./components/TimeSlotPicker.js\";\nimport { ResourcePicker } from \"./components/ResourcePicker.js\";\nimport { ProductSelector } from \"./components/ProductSelector.js\";\nimport { GuestForm, validateGuestForm } from \"./components/GuestForm.js\";\nimport { WaiverConsent } from \"./components/WaiverConsent.js\";\nimport { PaymentForm } from \"./components/PaymentForm.js\";\nimport {\n SummaryPreview,\n ConfirmationView,\n} from \"./components/ReservationSummary.js\";\nimport { AlertCircleIcon, CheckCircleIcon, CheckIcon } from \"./icons.js\";\nimport type {\n BookingStep,\n BookingSelection,\n GuestFormValues,\n GuestFormErrors,\n} from \"./types.js\";\n\n// ─────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────\n\nfunction todayStr(): string {\n const d = new Date();\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, \"0\")}-${String(d.getDate()).padStart(2, \"0\")}`;\n}\n\nfunction formatPrice(cents: number, currency: string): string {\n return new Intl.NumberFormat(\"default\", {\n style: \"currency\",\n currency,\n }).format(cents / 100);\n}\n\n/** Steps vary by domain and whether catalog / payment are active. */\nfunction buildSteps(domain: string, hasPayment: boolean, catalogMode: boolean): BookingStep[] {\n const steps: BookingStep[] = [];\n\n // Watersport/service always start with product selector;\n // rental catalog mode starts with resource picker.\n // Restaurants never show the resource step — tables are auto-assigned.\n if (domain === \"watersport\" || domain === \"service\" || (catalogMode && domain !== \"restaurant\")) {\n steps.push(\"resource\");\n }\n\n steps.push(\"availability\");\n steps.push(\"details\");\n\n // Restaurant: skip terms step unless payment is enabled\n if (domain !== \"restaurant\" || hasPayment) {\n steps.push(\"terms\");\n }\n\n if (hasPayment) {\n steps.push(\"payment\");\n }\n\n steps.push(\"confirmation\");\n return steps;\n}\n\nfunction stepIndex(step: BookingStep, steps: BookingStep[]): number {\n return steps.indexOf(step);\n}\n\n// Step labels for the indicator\nconst STEP_LABELS: Record<BookingStep, string> = {\n resource: \"Service\",\n availability: \"Date & Time\",\n details: \"Details\",\n terms: \"Terms\",\n payment: \"Payment\",\n confirmation: \"Done\",\n checkout: \"Checkout\",\n};\n\n// ─────────────────────────────────────────────────────────────\n// Component\n// ─────────────────────────────────────────────────────────────\n\nexport function ResiraBookingWidget() {\n const {\n domain,\n locale,\n domainConfig,\n catalogMode,\n allowMultiSelect,\n activeResourceId,\n setActiveResourceId,\n stripePublishableKey,\n showTerms,\n showWaiver,\n showRemainingSpots,\n depositPercent,\n onClose,\n showStepIndicator,\n deeplink,\n deeplinkGuest,\n onStepChange,\n onBookingComplete,\n onError,\n checkoutSessionToken,\n } = useResira();\n const isDateBased = domain === \"rental\";\n const isTimeBased = domain === \"restaurant\" || domain === \"watersport\" || domain === \"service\";\n const isServiceBased = domain === \"watersport\" || domain === \"service\";\n const hasPayment = !!stripePublishableKey;\n\n // ── Checkout session mode ──────────────────────────────────\n const isCheckoutMode = !!checkoutSessionToken;\n const {\n session: checkoutSession,\n loading: checkoutSessionLoading,\n error: checkoutSessionError,\n errorCode: checkoutSessionErrorCode,\n } = useCheckoutSession(checkoutSessionToken);\n\n // ── Steps (dynamic) ────────────────────────────────────────\n const STEPS = useMemo(() => {\n if (isCheckoutMode) {\n return [\"checkout\" as BookingStep, \"payment\" as BookingStep, \"confirmation\" as BookingStep];\n }\n return buildSteps(domain, hasPayment, catalogMode);\n }, [domain, hasPayment, catalogMode, isCheckoutMode]);\n const initialStep: BookingStep = STEPS[0];\n\n // ── Step management ────────────────────────────────────────\n const [step, setStep] = useState<BookingStep>(initialStep);\n\n // ── Selected resource IDs (for multi-select mode) ──────────\n const [selectedResourceIds, setSelectedResourceIds] = useState<string[]>([]);\n\n // ── Resource catalog ───────────────────────────────────────\n const {\n resources,\n loading: resourcesLoading,\n error: resourcesError,\n } = useResources();\n\n // ── Restaurant auto-select: pick first table silently ──────\n useEffect(() => {\n if (domain === \"restaurant\" && catalogMode && !activeResourceId && resources.length > 0) {\n setActiveResourceId(resources[0].id);\n }\n }, [domain, catalogMode, activeResourceId, resources, setActiveResourceId]);\n\n // ── Product catalog (watersport/service) ───────────────────\n const {\n products,\n loading: productsLoading,\n error: productsError,\n } = useProducts();\n\n // ── Selected product ───────────────────────────────────────\n const [selectedProduct, setSelectedProduct] = useState<Product | null>(null);\n\n // ── Selection state ────────────────────────────────────────\n const [selection, setSelection] = useState<BookingSelection>({\n partySize: domainConfig.defaultPartySize ?? 2,\n duration: domainConfig.defaultDuration,\n });\n\n // ── Guest form state ───────────────────────────────────────\n const [guest, setGuest] = useState<GuestFormValues>({\n guestName: \"\",\n guestEmail: \"\",\n guestPhone: \"\",\n notes: \"\",\n });\n const [formErrors, setFormErrors] = useState<GuestFormErrors>({});\n\n // ── Terms / waiver state ───────────────────────────────────\n const [termsAccepted, setTermsAccepted] = useState(false);\n const [waiverAccepted, setWaiverAccepted] = useState(false);\n const [termsError, setTermsError] = useState<string | null>(null);\n const [discountCode, setDiscountCode] = useState(\"\");\n const [promoValidation, setPromoValidation] = useState<ValidatePromoCodeResponse | null>(null);\n\n // Handler for promo code validation result from WaiverConsent\n const handlePromoValidated = useCallback((result: ValidatePromoCodeResponse) => {\n setPromoValidation(result);\n }, []);\n\n // ── Date for time-slot query ───────────────────────────────\n const [slotDate, setSlotDate] = useState(todayStr());\n\n // ── Availability query ─────────────────────────────────────\n const availabilityParams = useMemo(() => {\n if (isDateBased) {\n if (selection.startDate && selection.endDate) {\n return { startDate: selection.startDate, endDate: selection.endDate };\n }\n return {};\n }\n return {\n date: slotDate,\n partySize: selection.partySize,\n durationMinutes: selection.duration,\n };\n }, [isDateBased, selection.startDate, selection.endDate, slotDate, selection.partySize, selection.duration]);\n\n // For watersport/service with a selected product, use product-level\n // availability (aggregates capacity across all linked equipment).\n const availabilityProductId = isServiceBased ? selectedProduct?.id : undefined;\n\n const { data: availability, loading, error, refetch } = useAvailability(\n availabilityParams,\n availabilityProductId,\n );\n\n // ── Calendar data (blocked dates) ─────────────────────────\n const {\n data: calendarData,\n loading: calendarLoading,\n } = useAvailability(isDateBased ? {} : undefined);\n\n // ── Reservation hook ───────────────────────────────────────\n const {\n reservation,\n submitting,\n error: submitError,\n submit,\n } = useReservation();\n\n // ── Payment hook ───────────────────────────────────────────\n const {\n paymentIntent,\n creating: creatingPayment,\n error: paymentError,\n create: createPayment,\n confirm: confirmPayment,\n confirming: confirmingPayment,\n reset: resetPaymentIntent,\n } = usePaymentIntent();\n const [paymentSubmitRequestId, setPaymentSubmitRequestId] = useState(0);\n const [paymentFormReady, setPaymentFormReady] = useState(false);\n const [paymentFormSubmitting, setPaymentFormSubmitting] = useState(false);\n\n const paymentPayload = useMemo(() => {\n // Checkout session mode — backend hydrates from the session token\n if (isCheckoutMode && checkoutSession) {\n return {\n checkoutSessionToken,\n guestName: guest.guestName.trim() || checkoutSession.guestName || \"\",\n guestEmail: guest.guestEmail.trim() || checkoutSession.guestEmail || undefined,\n guestPhone: guest.guestPhone.trim() || undefined,\n notes: guest.notes.trim() || undefined,\n termsAccepted: termsAccepted || undefined,\n };\n }\n\n const resourceId = activeResourceId ?? selectedProduct?.equipmentIds?.[0] ?? \"\";\n\n return {\n productId: selectedProduct?.id ?? \"\",\n resourceId,\n partySize: selection.partySize,\n durationMinutes: selection.duration,\n startDate: selection.startDate!,\n startTime: selection.startTime,\n endTime: selection.endTime,\n guestName: guest.guestName.trim(),\n guestEmail: guest.guestEmail.trim(),\n guestPhone: guest.guestPhone.trim() || undefined,\n notes: guest.notes.trim() || undefined,\n promoCode: discountCode.trim() || undefined,\n termsAccepted: termsAccepted || undefined,\n waiverAccepted: waiverAccepted || undefined,\n };\n }, [activeResourceId, selectedProduct, selection, guest, discountCode, termsAccepted, waiverAccepted, isCheckoutMode, checkoutSession, checkoutSessionToken]);\n\n // ── Blocked dates set ──────────────────────────────────────\n const blockedDates = useMemo(() => {\n const dates = calendarData?.dates?.blockedDates ?? availability?.dates?.blockedDates ?? [];\n return new Set(dates);\n }, [calendarData, availability]);\n\n // ── Price calculation ──────────────────────────────────────\n const currency = selectedProduct?.currency ?? availability?.currency ?? \"EUR\";\n\n // For per_rider model, resolve the active rider tier's durationPricing\n const activeRiderDurationPricing = useMemo(() => {\n if (selectedProduct?.pricingModel === \"per_rider\" && selectedProduct.riderTierPricing?.length) {\n // Find the tier matching current party size, or the closest one ≥ partySize\n const sorted = [...selectedProduct.riderTierPricing].sort((a, b) => (a.riders ?? a.minRiders ?? 0) - (b.riders ?? b.minRiders ?? 0));\n const exact = sorted.find((t) => t.riders === selection.partySize || (t.minRiders != null && t.maxRiders != null && selection.partySize >= t.minRiders && selection.partySize <= t.maxRiders));\n if (exact) return exact.durationPricing;\n const closest = sorted.find((t) => (t.riders ?? t.minRiders ?? 0) >= selection.partySize);\n return closest?.durationPricing ?? sorted[sorted.length - 1]?.durationPricing ?? [];\n }\n return null;\n }, [selectedProduct, selection.partySize]);\n\n const computedPrice = useMemo(() => {\n if (selectedProduct) {\n let base = selectedProduct.priceCents;\n\n if (selectedProduct.pricingModel === \"per_rider\" && activeRiderDurationPricing?.length) {\n // Look up price from rider tier's duration pricing\n const match = selection.duration\n ? activeRiderDurationPricing.find((dp) => dp.durationMinutes === selection.duration)\n : activeRiderDurationPricing[0];\n if (match) base = match.priceCents;\n } else if (selectedProduct.durationPricing?.length && selection.duration) {\n // Standard per_session / per_person lookup\n const match = selectedProduct.durationPricing.find(\n (dp) => dp.durationMinutes === selection.duration,\n );\n if (match) base = match.priceCents;\n }\n\n const total = selectedProduct.pricingModel === \"per_person\"\n ? base * selection.partySize\n : base; // per_session and per_rider are flat per the tier\n const pct = depositPercent ?? 100;\n const amountNow = Math.round(total * pct / 100);\n const amountAtVenue = total - amountNow;\n return { total, amountNow, amountAtVenue };\n }\n if (availability?.dates?.totalPrice) {\n const total = availability.dates.totalPrice;\n const pct = depositPercent ?? 100;\n const amountNow = Math.round(total * pct / 100);\n const amountAtVenue = total - amountNow;\n return { total, amountNow, amountAtVenue };\n }\n return null;\n }, [selectedProduct, availability, selection.partySize, selection.duration, depositPercent, activeRiderDurationPricing]);\n\n // ── Step title ─────────────────────────────────────────────\n const stepTitle = useMemo(() => {\n switch (step) {\n case \"resource\":\n return isServiceBased ? locale.chooseService : \"Choose an experience\";\n case \"availability\":\n if (domain === \"restaurant\") return locale.reserveTable;\n return isDateBased ? locale.selectDates : locale.selectTime;\n case \"details\":\n return locale.guestDetails;\n case \"terms\":\n return locale.termsTitle;\n case \"payment\":\n return locale.payment;\n case \"confirmation\":\n return locale.bookingConfirmed;\n case \"checkout\":\n return \"Checkout\";\n }\n }, [step, isDateBased, isServiceBased, locale, domain]);\n\n const stepSubtitle = useMemo(() => {\n switch (step) {\n case \"resource\":\n return isServiceBased\n ? \"Select a service to continue\"\n : allowMultiSelect\n ? \"Select one or more options\"\n : \"Select one to continue\";\n case \"availability\":\n if (domain === \"restaurant\") return \"Pick your preferred date and time\";\n return selectedProduct?.name ?? domainConfig.label ?? \"\";\n case \"details\":\n if (domain === \"restaurant\") return locale.reservationFor;\n return locale.confirmBooking;\n case \"terms\":\n return \"Review and accept before payment\";\n case \"payment\":\n return \"Complete your booking securely\";\n case \"confirmation\":\n return \"\";\n case \"checkout\":\n return checkoutSession?.productName ?? \"Complete your booking\";\n }\n }, [step, domainConfig.label, locale, allowMultiSelect, isServiceBased, selectedProduct, domain, checkoutSession]);\n\n // ── Can proceed to next step? ──────────────────────────────\n const canContinue = useMemo(() => {\n if (step === \"resource\") {\n if (isServiceBased) return !!selectedProduct;\n return selectedResourceIds.length > 0;\n }\n if (step === \"availability\") {\n if (isDateBased) return !!selection.startDate && !!selection.endDate;\n return !!selection.startTime && !!selection.endTime;\n }\n if (step === \"terms\") {\n const needTerms = showTerms && !termsAccepted;\n const needWaiver = showWaiver && !waiverAccepted;\n return !needTerms && !needWaiver;\n }\n return true;\n }, [step, isDateBased, isServiceBased, selection, selectedResourceIds, selectedProduct, termsAccepted, waiverAccepted, showTerms, showWaiver]);\n\n // ── Date selection handler (rentals) ───────────────────────\n const handleDateSelect = useCallback(\n (start: string, end: string | undefined) => {\n setSelection((prev) => ({ ...prev, startDate: start, endDate: end }));\n },\n [],\n );\n\n // ── Time slot selection handler ────────────────────────────\n const handleSlotSelect = useCallback(\n (start: string, end: string) => {\n setSelection((prev) => ({\n ...prev,\n startDate: slotDate,\n endDate: slotDate,\n startTime: start,\n endTime: end,\n }));\n },\n [slotDate],\n );\n\n // ── Party size handler ─────────────────────────────────────\n const handlePartySizeChange = useCallback((size: number) => {\n setSelection((prev) => ({ ...prev, partySize: size }));\n }, []);\n\n // ── Duration handler ───────────────────────────────────────\n const handleDurationChange = useCallback((minutes: number) => {\n // Clear selected time slot — intervals change with duration so\n // the previously selected slot may no longer exist.\n setSelection((prev) => ({\n ...prev,\n duration: minutes,\n startTime: undefined,\n endTime: undefined,\n }));\n }, []);\n\n // ── Product selection handler ──────────────────────────────\n const handleProductSelect = useCallback(\n (product: Product) => {\n setSelectedProduct(product);\n // Auto-set resource ID to first linked equipment\n if (product.equipmentIds?.length) {\n setActiveResourceId(product.equipmentIds[0]);\n }\n setSelection((prev) => {\n // Clamp party size to product's maxPartySize if set\n const maxParty = product.maxPartySize ?? domainConfig.maxPartySize ?? 10;\n const clampedPartySize = Math.min(prev.partySize, maxParty);\n // Use first duration from durationPricing (sorted shortest first),\n // or fall back to the product's top-level durationMinutes\n const defaultDuration =\n product.durationPricing?.[0]?.durationMinutes ?? product.durationMinutes ?? prev.duration;\n return {\n ...prev,\n productId: product.id,\n duration: defaultDuration,\n partySize: clampedPartySize,\n };\n });\n\n // Auto-advance past the resource/service step to availability\n if (step === \"resource\" && isServiceBased) {\n const nextIdx = stepIndex(\"resource\", STEPS) + 1;\n if (nextIdx < STEPS.length) {\n setStep(STEPS[nextIdx]);\n }\n }\n },\n [setActiveResourceId, domainConfig.maxPartySize, step, isServiceBased, STEPS],\n );\n\n // ── Resource selection handler (rental catalog) ────────────\n const handleResourceSelect = useCallback(\n (resourceId: string) => {\n if (allowMultiSelect) {\n setSelectedResourceIds((prev) =>\n prev.includes(resourceId)\n ? prev.filter((id) => id !== resourceId)\n : [...prev, resourceId],\n );\n } else {\n setSelectedResourceIds([resourceId]);\n setActiveResourceId(resourceId);\n }\n },\n [allowMultiSelect, setActiveResourceId],\n );\n\n // ── Navigation ─────────────────────────────────────────────\n const currentIndex = stepIndex(step, STEPS);\n\n const handleContinue = useCallback(async () => {\n if (step === \"resource\") {\n if (!isServiceBased && allowMultiSelect && selectedResourceIds.length > 0) {\n setActiveResourceId(selectedResourceIds[0]);\n }\n setStep(STEPS[currentIndex + 1]);\n return;\n }\n\n if (step === \"availability\") {\n setFormErrors({});\n setStep(STEPS[currentIndex + 1]);\n return;\n }\n\n if (step === \"terms\") {\n if (showTerms && !termsAccepted) {\n setTermsError(locale.termsRequired);\n return;\n }\n if (showWaiver && !waiverAccepted) {\n setTermsError(locale.termsRequired);\n return;\n }\n\n setTermsError(null);\n\n if (!hasPayment) {\n setStep(STEPS[currentIndex + 1]);\n return;\n }\n setStep(STEPS[currentIndex + 1]);\n }\n }, [step, STEPS, currentIndex, allowMultiSelect, selectedResourceIds, setActiveResourceId, isServiceBased, termsAccepted, waiverAccepted, showTerms, showWaiver, locale, hasPayment]);\n\n const handleBack = useCallback(() => {\n if (currentIndex > 0) {\n if (step === \"payment\") {\n resetPaymentIntent();\n setPaymentFormReady(false);\n setPaymentFormSubmitting(false);\n }\n setStep(STEPS[currentIndex - 1]);\n }\n }, [STEPS, currentIndex, step, resetPaymentIntent]);\n\n // ── Submit guest details (move to terms or confirmation) ───\n const handleDetailsSubmit = useCallback(async () => {\n const contactMode = domain === \"restaurant\" ? \"either\" as const : \"email-required\" as const;\n const errors = validateGuestForm(guest, {\n required: locale.required,\n invalidEmail: locale.invalidEmail,\n contactRequired: locale.contactRequired,\n }, contactMode);\n if (Object.keys(errors).length > 0) {\n setFormErrors(errors);\n return;\n }\n setFormErrors({});\n\n // Restaurant without payment: submit directly and go to confirmation\n if (domain === \"restaurant\" && !hasPayment) {\n const resourceId = activeResourceId ?? \"\";\n const payload: CreateReservationRequest = {\n resourceId,\n guestName: guest.guestName.trim(),\n guestEmail: guest.guestEmail.trim() || undefined,\n guestPhone: guest.guestPhone.trim() || undefined,\n startDate: selection.startDate ?? selection.startTime?.split(\"T\")[0],\n endDate: selection.endDate ?? selection.endTime?.split(\"T\")[0],\n startTime: selection.startTime,\n endTime: selection.endTime,\n partySize: selection.partySize,\n notes: guest.notes.trim() || undefined,\n termsAccepted: termsAccepted || undefined,\n waiverAccepted: waiverAccepted || undefined,\n };\n\n const result = await submit(payload);\n if (result) {\n setStep(\"confirmation\");\n }\n return;\n }\n\n setStep(STEPS[currentIndex + 1]);\n }, [guest, locale, STEPS, currentIndex, domain, hasPayment, activeResourceId, selection, submit]);\n\n // ── Handle payment success ─────────────────────────────────\n const handlePaymentSuccess = useCallback(\n async (paymentIntentId: string) => {\n if (paymentIntent?.reservationId) {\n const confirmed = await confirmPayment(paymentIntentId, paymentIntent.reservationId);\n if (!confirmed) return;\n }\n setStep(\"confirmation\");\n },\n [paymentIntent, confirmPayment],\n );\n\n const handleStartPayment = useCallback(async () => {\n const result = await createPayment(paymentPayload);\n if (!result) return;\n\n if (result.amountNow === 0) {\n if (result.reservationId) {\n const confirmed = await confirmPayment(result.paymentIntentId, result.reservationId);\n if (!confirmed) return;\n }\n setStep(\"confirmation\");\n }\n }, [createPayment, paymentPayload, confirmPayment]);\n\n const handlePaymentError = useCallback((msg: string) => {\n // Error is displayed inside PaymentForm component\n onError?.(\"payment_error\", msg);\n }, [onError]);\n\n // ── Submit checkout session (validate guest + create payment intent) ──\n const handleCheckoutSubmit = useCallback(async () => {\n // Validate guest form\n const contactMode = \"email-required\" as const;\n const errors = validateGuestForm(guest, {\n required: locale.required,\n invalidEmail: locale.invalidEmail,\n contactRequired: locale.contactRequired,\n }, contactMode);\n if (Object.keys(errors).length > 0) {\n setFormErrors(errors);\n return;\n }\n setFormErrors({});\n\n // Terms validation\n if (checkoutSession?.checkoutConfig.termsRequired && !termsAccepted) {\n setTermsError(locale.termsRequired);\n return;\n }\n if (showWaiver && !waiverAccepted) {\n setTermsError(locale.termsRequired);\n return;\n }\n setTermsError(null);\n\n // Create payment intent with session token\n const result = await createPayment(paymentPayload);\n if (!result) return;\n\n if (result.amountNow === 0) {\n if (result.reservationId) {\n const confirmed = await confirmPayment(result.paymentIntentId, result.reservationId);\n if (!confirmed) return;\n }\n setStep(\"confirmation\");\n } else {\n setStep(\"payment\");\n }\n }, [guest, locale, checkoutSession, termsAccepted, createPayment, paymentPayload, confirmPayment]);\n\n // ── Submit without payment (free or no Stripe) ─────────────\n const handleSubmitNoPayment = useCallback(async () => {\n if (showTerms && !termsAccepted) {\n setTermsError(locale.termsRequired);\n return;\n }\n if (showWaiver && !waiverAccepted) {\n setTermsError(locale.termsRequired);\n return;\n }\n\n const resourceId = activeResourceId ?? selectedProduct?.equipmentIds?.[0] ?? \"\";\n\n const payload: CreateReservationRequest = {\n resourceId: isCheckoutMode ? undefined : resourceId,\n checkoutSessionToken: isCheckoutMode ? checkoutSessionToken : undefined,\n guestName: guest.guestName.trim(),\n guestEmail: guest.guestEmail.trim() || undefined,\n guestPhone: guest.guestPhone.trim() || undefined,\n startDate: selection.startDate ?? selection.startTime?.split(\"T\")[0],\n endDate: selection.endDate ?? selection.endTime?.split(\"T\")[0],\n startTime: selection.startTime,\n endTime: selection.endTime,\n partySize: selection.partySize,\n notes: guest.notes.trim() || undefined,\n termsAccepted: termsAccepted || undefined,\n waiverAccepted: waiverAccepted || undefined,\n };\n\n const result = await submit(payload);\n if (result) {\n setStep(\"confirmation\");\n }\n }, [guest, selection, locale, submit, termsAccepted, waiverAccepted, showTerms, showWaiver, activeResourceId, selectedProduct]);\n\n const footerBusy = submitting || creatingPayment || confirmingPayment || paymentFormSubmitting;\n const paymentActionDisabled = !paymentIntent || !paymentFormReady || paymentFormSubmitting || confirmingPayment;\n\n // ── Deeplink auto-apply ────────────────────────────────────\n const [deeplinkApplied, setDeeplinkApplied] = useState(false);\n\n // ── Checkout session auto-fill ─────────────────────────────\n const [checkoutGuestFilled, setCheckoutGuestFilled] = useState(false);\n\n useEffect(() => {\n if (checkoutGuestFilled || !checkoutSession) return;\n setGuest((prev) => ({\n guestName: checkoutSession.guestName ?? prev.guestName,\n guestEmail: checkoutSession.guestEmail ?? prev.guestEmail,\n guestPhone: prev.guestPhone,\n notes: prev.notes,\n }));\n setCheckoutGuestFilled(true);\n }, [checkoutSession, checkoutGuestFilled]);\n\n useEffect(() => {\n if (deeplinkApplied || !deeplink) return;\n\n // Auto-select product by ID\n if (deeplink.productId && products.length > 0 && !selectedProduct) {\n const target = products.find((p) => p.id === deeplink.productId);\n if (target) {\n handleProductSelect(target);\n }\n }\n\n // Auto-set selection fields\n if (deeplink.partySize || deeplink.duration || deeplink.date) {\n setSelection((prev) => ({\n ...prev,\n ...(deeplink.partySize ? { partySize: deeplink.partySize } : {}),\n ...(deeplink.duration ? { duration: deeplink.duration } : {}),\n ...(deeplink.date ? { startDate: deeplink.date } : {}),\n }));\n if (deeplink.date) setSlotDate(deeplink.date);\n }\n\n // Auto-fill guest info\n if (deeplinkGuest) {\n setGuest((prev) => ({\n guestName: deeplinkGuest.name ?? prev.guestName,\n guestEmail: deeplinkGuest.email ?? prev.guestEmail,\n guestPhone: deeplinkGuest.phone ?? prev.guestPhone,\n notes: deeplinkGuest.notes ?? prev.notes,\n }));\n }\n\n // Auto-advance past resource step if product was pre-selected\n if (deeplink.productId && step === \"resource\" && isServiceBased) {\n const target = products.find((p) => p.id === deeplink.productId);\n if (target) {\n setStep(STEPS[stepIndex(\"resource\", STEPS) + 1]);\n }\n }\n\n setDeeplinkApplied(true);\n }, [deeplink, deeplinkGuest, products, selectedProduct, step, isServiceBased, STEPS, handleProductSelect]);\n\n // ── Fire onStepChange callback ─────────────────────────────\n useEffect(() => {\n onStepChange?.(step);\n }, [step, onStepChange]);\n\n // ── Fire onBookingComplete callback ────────────────────────\n useEffect(() => {\n if (step === \"confirmation\") {\n const bookingId = reservation?.id ?? paymentIntent?.reservationId;\n onBookingComplete?.({\n reservationId: bookingId,\n product: selectedProduct ?? undefined,\n selection,\n guest,\n });\n }\n }, [step]); // intentionally thin deps — fire once on confirmation\n\n // ── Fire onError for submission / payment errors ───────────\n useEffect(() => {\n if (submitError) onError?.(\"submit_error\", submitError);\n }, [submitError, onError]);\n\n useEffect(() => {\n if (paymentError) onError?.(\"payment_error\", paymentError);\n }, [paymentError, onError]);\n\n // ── Render ─────────────────────────────────────────────────\n return (\n <div className=\"resira-widget\">\n {step !== \"confirmation\" && (\n <div className=\"resira-widget-topbar\">\n {showStepIndicator && (\n <nav className=\"resira-steps\" aria-label=\"Booking steps\">\n {STEPS.filter((s) => s !== \"confirmation\").map((s, i) => {\n const isCompleted = stepIndex(step, STEPS) > i;\n const isActive = s === step;\n return (\n <div\n key={s}\n className={`resira-step-tab${isActive ? \" resira-step-tab--active\" : \"\"}${isCompleted ? \" resira-step-tab--completed\" : \"\"}`}\n role=\"tab\"\n aria-selected={isActive}\n >\n {isCompleted && <CheckIcon size={11} />}\n <span>{STEP_LABELS[s]}</span>\n </div>\n );\n })}\n </nav>\n )}\n\n <div className=\"resira-widget-header\">\n <h2 className=\"resira-widget-title\">{stepTitle}</h2>\n {stepSubtitle && (\n <p className=\"resira-widget-subtitle\">{stepSubtitle}</p>\n )}\n </div>\n </div>\n )}\n\n {/* Body */}\n <div className=\"resira-widget-body\" aria-busy={loading || calendarLoading || resourcesLoading || productsLoading || footerBusy}>\n {/* ─── Service/Product step ─── */}\n {step === \"resource\" && isServiceBased && (\n <ProductSelector\n products={products.filter((p) => p.active)}\n resources={resources}\n selectedId={selectedProduct?.id}\n onSelect={handleProductSelect}\n loading={productsLoading}\n error={productsError}\n />\n )}\n\n {/* ─── Resource step (rental catalog mode) ─── */}\n {step === \"resource\" && !isServiceBased && (\n <ResourcePicker\n resources={resources}\n selectedIds={selectedResourceIds}\n onSelect={handleResourceSelect}\n allowMultiSelect={allowMultiSelect}\n loading={resourcesLoading}\n error={resourcesError}\n />\n )}\n\n {/* ─── Availability step ─── */}\n {step === \"availability\" && (\n <>\n {(loading || calendarLoading) && !availability && !calendarData ? (\n <div className=\"resira-loading\" role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\n <div className=\"resira-spinner\" aria-hidden=\"true\" />\n <span className=\"resira-loading-text\">{locale.loading}</span>\n </div>\n ) : error ? (\n <div className=\"resira-error\" role=\"alert\" aria-live=\"assertive\">\n <AlertCircleIcon size={24} />\n <p className=\"resira-error-message\">{error}</p>\n <button\n type=\"button\"\n className=\"resira-btn resira-btn--secondary resira-error-retry\"\n onClick={() => refetch()}\n >\n Retry\n </button>\n </div>\n ) : (\n <>\n {isDateBased && (\n <BookingCalendar\n blockedDates={blockedDates}\n startDate={selection.startDate}\n endDate={selection.endDate}\n onSelect={handleDateSelect}\n minStay={domainConfig.minStay}\n />\n )}\n\n {isTimeBased && (\n <TimeSlotPicker\n timeSlots={availability?.timeSlots ?? []}\n selectedDate={slotDate}\n onDateChange={setSlotDate}\n selectedSlot={selection.startTime}\n onSlotSelect={handleSlotSelect}\n partySize={selection.partySize}\n onPartySizeChange={handlePartySizeChange}\n showPartySize={true}\n showDuration={domain === \"watersport\" || domain === \"service\"}\n selectedDuration={selection.duration}\n onDurationChange={handleDurationChange}\n maxPartySizeOverride={selectedProduct?.maxPartySize}\n durationPricing={activeRiderDurationPricing ?? selectedProduct?.durationPricing}\n currency={currency}\n showRemainingSpots={showRemainingSpots}\n />\n )}\n\n {/* Price preview for service-based */}\n {isServiceBased && selectedProduct && computedPrice && (\n <div className=\"resira-price-preview\">\n <div className=\"resira-price-preview-row\">\n <span>\n {selectedProduct.name}\n {selection.duration && selectedProduct.durationPricing && selectedProduct.durationPricing.length > 1 && (\n <span className=\"resira-price-preview-label\">\n {\" \"}({selection.duration < 60 ? `${selection.duration} min` : `${Math.floor(selection.duration / 60)}h${selection.duration % 60 ? selection.duration % 60 : \"\"}`})\n </span>\n )}\n </span>\n <span>\n {(() => {\n let unitPrice = selectedProduct.priceCents;\n if (selectedProduct.durationPricing?.length && selection.duration) {\n const match = selectedProduct.durationPricing.find(\n (dp) => dp.durationMinutes === selection.duration,\n );\n if (match) unitPrice = match.priceCents;\n }\n return formatPrice(unitPrice, currency);\n })()}\n {selectedProduct.pricingModel === \"per_person\" && (\n <span className=\"resira-price-preview-label\"> × {selection.partySize} pax</span>\n )}\n </span>\n </div>\n <div className=\"resira-price-preview-total\">\n <span>{locale.total}</span>\n <span>{formatPrice(computedPrice.total, currency)}</span>\n </div>\n {computedPrice.amountAtVenue > 0 && (\n <div className=\"resira-price-preview-split\">\n <span>{locale.payNow}: {formatPrice(computedPrice.amountNow, currency)}</span>\n <span>{locale.payAtVenue}: {formatPrice(computedPrice.amountAtVenue, currency)}</span>\n </div>\n )}\n </div>\n )}\n </>\n )}\n </>\n )}\n\n {/* ─── Details step ─── */}\n {step === \"details\" && (\n <>\n <GuestForm\n values={guest}\n onChange={setGuest}\n errors={formErrors}\n />\n\n {submitError && (\n <div className=\"resira-error\" style={{ padding: \"12px 0\" }}>\n <AlertCircleIcon size={18} />\n <p className=\"resira-error-message\">{submitError}</p>\n </div>\n )}\n </>\n )}\n\n {/* ─── Terms step ─── */}\n {step === \"terms\" && (\n <>\n <SummaryPreview\n selection={selection}\n guest={guest}\n totalPrice={computedPrice?.total}\n currency={currency}\n />\n\n <div style={{ marginTop: 14 }}>\n <WaiverConsent\n termsAccepted={termsAccepted}\n onTermsChange={setTermsAccepted}\n waiverAccepted={waiverAccepted}\n onWaiverChange={setWaiverAccepted}\n discountCode={discountCode}\n onDiscountCodeChange={setDiscountCode}\n onPromoValidated={handlePromoValidated}\n error={termsError ?? undefined}\n />\n </div>\n\n {paymentError && hasPayment && (\n <div className=\"resira-error\" style={{ padding: \"12px 0\" }}>\n <AlertCircleIcon size={18} />\n <p className=\"resira-error-message\">{paymentError}</p>\n </div>\n )}\n </>\n )}\n\n {/* ─── Checkout session step (session-token flow) ─── */}\n {step === \"checkout\" && (\n <>\n {checkoutSessionLoading && (\n <div className=\"resira-loading\" role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\n <div className=\"resira-spinner\" aria-hidden=\"true\" />\n <span className=\"resira-loading-text\">{locale.loading}</span>\n </div>\n )}\n\n {checkoutSessionError && (\n <div className=\"resira-error\" role=\"alert\" aria-live=\"assertive\">\n <AlertCircleIcon size={24} />\n <p className=\"resira-error-message\">{checkoutSessionError}</p>\n {(checkoutSessionErrorCode === \"not_found\" || checkoutSessionErrorCode === \"expired\") && onClose && (\n <button\n type=\"button\"\n className=\"resira-btn resira-btn--secondary resira-error-retry\"\n onClick={onClose}\n >\n Start a new booking\n </button>\n )}\n </div>\n )}\n\n {checkoutSession && !checkoutSessionError && (\n <>\n {/* Session summary */}\n <div className=\"resira-summary\" style={{ marginBottom: 16 }}>\n <div className=\"resira-summary-row\">\n <span className=\"resira-summary-label\">Service</span>\n <span className=\"resira-summary-value\">{checkoutSession.productName}</span>\n </div>\n <div className=\"resira-summary-row\">\n <span className=\"resira-summary-label\">Date</span>\n <span className=\"resira-summary-value\">\n {new Date(checkoutSession.date + \"T00:00:00\").toLocaleDateString(\"default\", { weekday: \"short\", month: \"short\", day: \"numeric\" })}\n </span>\n </div>\n <div className=\"resira-summary-row\">\n <span className=\"resira-summary-label\">Time</span>\n <span className=\"resira-summary-value\">\n {new Date(checkoutSession.startTime).toLocaleTimeString(\"default\", { hour: \"2-digit\", minute: \"2-digit\", hour12: false })}\n {\" – \"}\n {new Date(checkoutSession.endTime).toLocaleTimeString(\"default\", { hour: \"2-digit\", minute: \"2-digit\", hour12: false })}\n </span>\n </div>\n <div className=\"resira-summary-row\">\n <span className=\"resira-summary-label\">Duration</span>\n <span className=\"resira-summary-value\">{checkoutSession.durationMinutes} min</span>\n </div>\n <div className=\"resira-summary-row\">\n <span className=\"resira-summary-label\">{locale.guests}</span>\n <span className=\"resira-summary-value\">{checkoutSession.partySize}</span>\n </div>\n {checkoutSession.promoCode && (\n <div className=\"resira-summary-row\">\n <span className=\"resira-summary-label\">{locale.discountCode}</span>\n <span className=\"resira-summary-value\">{checkoutSession.promoCode}</span>\n </div>\n )}\n <div className=\"resira-summary-divider\" />\n <div className=\"resira-summary-row\">\n <span className=\"resira-summary-label resira-summary-total\">{locale.total}</span>\n <span className=\"resira-summary-value resira-summary-total\">\n {formatPrice(checkoutSession.priceCents, checkoutSession.currency)}\n </span>\n </div>\n </div>\n\n {/* Guest form */}\n <GuestForm\n values={guest}\n onChange={setGuest}\n errors={formErrors}\n />\n\n {/* Terms checkbox if required by session */}\n {checkoutSession.checkoutConfig.termsRequired && (\n <div style={{ marginTop: 14 }}>\n <WaiverConsent\n termsAccepted={termsAccepted}\n onTermsChange={setTermsAccepted}\n waiverAccepted={false}\n onWaiverChange={() => {}}\n discountCode=\"\"\n onDiscountCodeChange={() => {}}\n onPromoValidated={() => {}}\n error={termsError ?? undefined}\n />\n </div>\n )}\n\n {paymentError && (\n <div className=\"resira-error\" style={{ padding: \"12px 0\" }}>\n <AlertCircleIcon size={18} />\n <p className=\"resira-error-message\">{paymentError}</p>\n </div>\n )}\n </>\n )}\n </>\n )}\n\n {/* ─── Payment step ─── */}\n {step === \"payment\" && (\n <>\n {paymentError && (\n <div className=\"resira-error\">\n <AlertCircleIcon size={24} />\n <p className=\"resira-error-message\">{paymentError}</p>\n </div>\n )}\n\n {/* Normal payment — show Stripe form */}\n {paymentIntent && paymentIntent.amountNow > 0 && (\n <PaymentForm\n clientSecret={paymentIntent.clientSecret}\n amountNow={paymentIntent.amountNow}\n amountAtVenue={paymentIntent.amountAtVenue}\n totalAmount={paymentIntent.totalAmount}\n currency={paymentIntent.currency}\n onSuccess={handlePaymentSuccess}\n onError={handlePaymentError}\n processing={confirmingPayment}\n discountAmount={paymentIntent.discountAmount}\n originalPrice={paymentIntent.originalPrice}\n promoCodeApplied={paymentIntent.promoCodeApplied}\n hideSubmitButton={true}\n submitRequestId={paymentSubmitRequestId}\n onReadyChange={setPaymentFormReady}\n onSubmittingChange={setPaymentFormSubmitting}\n />\n )}\n\n {!paymentIntent && !paymentError && (\n <div className=\"resira-summary\" style={{ marginTop: 4 }}>\n <div className=\"resira-summary-row\">\n <span className=\"resira-summary-label\">{locale.payNow}</span>\n <span className=\"resira-summary-value\">\n {computedPrice ? formatPrice(computedPrice.amountNow, currency) : \"-\"}\n </span>\n </div>\n {computedPrice && computedPrice.amountAtVenue > 0 && (\n <div className=\"resira-summary-row\">\n <span className=\"resira-summary-label\">{locale.payAtVenue}</span>\n <span className=\"resira-summary-value\">\n {formatPrice(computedPrice.amountAtVenue, currency)}\n </span>\n </div>\n )}\n {computedPrice && (\n <>\n <div className=\"resira-summary-divider\" />\n <div className=\"resira-summary-row\">\n <span className=\"resira-summary-label resira-summary-total\">{locale.total}</span>\n <span className=\"resira-summary-value resira-summary-total\">\n {formatPrice(computedPrice.total, currency)}\n </span>\n </div>\n </>\n )}\n </div>\n )}\n </>\n )}\n\n {/* ─── Confirmation step ─── */}\n {step === \"confirmation\" && (\n <div className=\"resira-confirmation\">\n <div className=\"resira-confirmation-icon\">\n <CheckCircleIcon size={28} />\n </div>\n <h3 className=\"resira-confirmation-title\">\n {domain === \"restaurant\" ? \"Reservation Confirmed\" : locale.bookingConfirmed}\n </h3>\n <p className=\"resira-confirmation-subtitle\">\n {reservation\n ? reservation.id.slice(0, 8).toUpperCase()\n : paymentIntent?.reservationId?.slice(0, 8).toUpperCase() ?? \"\"}\n </p>\n\n <div className=\"resira-confirmation-details\">\n <div className=\"resira-summary\">\n {selectedProduct && (\n <div className=\"resira-summary-row\">\n <span className=\"resira-summary-label\">Service</span>\n <span className=\"resira-summary-value\">{selectedProduct.name}</span>\n </div>\n )}\n {guest.guestName && domain === \"restaurant\" && (\n <div className=\"resira-summary-row\">\n <span className=\"resira-summary-label\">{locale.fullName}</span>\n <span className=\"resira-summary-value\">{guest.guestName}</span>\n </div>\n )}\n {selection.startDate && (\n <div className=\"resira-summary-row\">\n <span className=\"resira-summary-label\">Date</span>\n <span className=\"resira-summary-value\">\n {new Date(selection.startDate + \"T00:00:00\").toLocaleDateString(\"default\", { weekday: \"short\", month: \"short\", day: \"numeric\" })}\n </span>\n </div>\n )}\n {selection.startTime && (\n <div className=\"resira-summary-row\">\n <span className=\"resira-summary-label\">Time</span>\n <span className=\"resira-summary-value\">\n {new Date(selection.startTime).toLocaleTimeString(\"default\", { hour: \"2-digit\", minute: \"2-digit\", hour12: false })}\n </span>\n </div>\n )}\n <div className=\"resira-summary-row\">\n <span className=\"resira-summary-label\">{locale.guests}</span>\n <span className=\"resira-summary-value\">{selection.partySize}</span>\n </div>\n {computedPrice && (\n <>\n <div className=\"resira-summary-divider\" />\n {computedPrice.amountNow > 0 && computedPrice.amountAtVenue > 0 && (\n <>\n <div className=\"resira-summary-row\">\n <span className=\"resira-summary-label\">{locale.payNow}</span>\n <span className=\"resira-summary-value\">{formatPrice(computedPrice.amountNow, currency)}</span>\n </div>\n <div className=\"resira-summary-row\">\n <span className=\"resira-summary-label\">{locale.payAtVenue}</span>\n <span className=\"resira-summary-value\">{formatPrice(computedPrice.amountAtVenue, currency)}</span>\n </div>\n </>\n )}\n <div className=\"resira-summary-row\">\n <span className=\"resira-summary-label resira-summary-total\">{locale.total}</span>\n <span className=\"resira-summary-value resira-summary-total\">{formatPrice(computedPrice.total, currency)}</span>\n </div>\n </>\n )}\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* Footer navigation — always rendered for stable button positioning */}\n <div className=\"resira-widget-footer\">\n {/* Back button — always in DOM for stable layout; invisible on first step */}\n <button\n type=\"button\"\n className=\"resira-btn resira-btn--secondary\"\n onClick={handleBack}\n disabled={footerBusy || currentIndex === 0}\n style={currentIndex === 0 || step === \"confirmation\" ? { visibility: \"hidden\" } : undefined}\n aria-hidden={currentIndex === 0 || step === \"confirmation\"}\n >\n {locale.back}\n </button>\n\n {/* Primary action — always present, label/handler changes per step */}\n {step === \"confirmation\" ? (\n onClose ? (\n <button\n type=\"button\"\n className=\"resira-btn resira-btn--primary\"\n onClick={onClose}\n >\n {locale.done}\n </button>\n ) : (\n <span style={{ visibility: \"hidden\" }} className=\"resira-btn resira-btn--primary\">{locale.continue}</span>\n )\n ) : step === \"checkout\" ? (\n <button\n type=\"button\"\n className=\"resira-btn resira-btn--primary\"\n onClick={() => { void handleCheckoutSubmit(); }}\n disabled={footerBusy || checkoutSessionLoading || !!checkoutSessionError}\n >\n {creatingPayment ? (\n <>\n <div className=\"resira-spinner\" style={{ width: 16, height: 16 }} />\n {locale.processingPayment}\n </>\n ) : checkoutSession ? (\n `${locale.payNow} — ${formatPrice(checkoutSession.priceCents, checkoutSession.currency)}`\n ) : (\n locale.continue\n )}\n </button>\n ) : (step === \"resource\" || step === \"availability\") ? (\n <button\n type=\"button\"\n className=\"resira-btn resira-btn--primary\"\n onClick={() => {\n void handleContinue();\n }}\n disabled={!canContinue || footerBusy}\n >\n {locale.continue}\n </button>\n ) : step === \"details\" ? (\n <button\n type=\"button\"\n className=\"resira-btn resira-btn--primary\"\n onClick={handleDetailsSubmit}\n disabled={footerBusy}\n >\n {submitting ? (\n <>\n <div className=\"resira-spinner\" style={{ width: 16, height: 16 }} />\n {locale.loading}\n </>\n ) : domain === \"restaurant\" && !hasPayment ? (\n locale.reserveTable\n ) : (\n locale.continue\n )}\n </button>\n ) : step === \"terms\" ? (\n <button\n type=\"button\"\n className=\"resira-btn resira-btn--primary\"\n onClick={hasPayment ? () => {\n void handleContinue();\n } : handleSubmitNoPayment}\n disabled={!canContinue || footerBusy}\n >\n {creatingPayment ? (\n <>\n <div className=\"resira-spinner\" style={{ width: 16, height: 16 }} />\n {locale.processingPayment}\n </>\n ) : submitting ? (\n <>\n <div className=\"resira-spinner\" style={{ width: 16, height: 16 }} />\n {locale.loading}\n </>\n ) : hasPayment ? (\n locale.continue\n ) : (\n locale.bookNow\n )}\n </button>\n ) : step === \"payment\" && !paymentIntent ? (\n <button\n type=\"button\"\n className=\"resira-btn resira-btn--primary\"\n onClick={() => {\n void handleStartPayment();\n }}\n disabled={footerBusy}\n >\n {creatingPayment ? (\n <>\n <div className=\"resira-spinner\" style={{ width: 16, height: 16 }} />\n {locale.processingPayment}\n </>\n ) : computedPrice ? (\n `${locale.payNow} — ${formatPrice(computedPrice.amountNow, currency)}`\n ) : (\n locale.payNow\n )}\n </button>\n ) : step === \"payment\" && paymentIntent?.amountNow != null && paymentIntent.amountNow > 0 ? (\n <button\n type=\"button\"\n className=\"resira-btn resira-btn--primary\"\n onClick={() => setPaymentSubmitRequestId((prev) => prev + 1)}\n disabled={paymentActionDisabled}\n >\n {paymentFormSubmitting || confirmingPayment ? (\n <>\n <div className=\"resira-spinner\" style={{ width: 16, height: 16 }} />\n {locale.processingPayment}\n </>\n ) : (\n `${locale.payNow} — ${formatPrice(paymentIntent.amountNow, paymentIntent.currency)}`\n )}\n </button>\n ) : (\n /* Fallback placeholder to hold space (e.g. zero-amount payment auto-advancing) */\n <span style={{ visibility: \"hidden\" }} className=\"resira-btn resira-btn--primary\">{locale.continue}</span>\n )}\n </div>\n </div>\n );\n}\n","// ═══════════════════════════════════════════════════════════════\n// @resira/ui — BookingModal\n// Full-viewport responsive modal with close button.\n// Wraps ResiraProvider + ResiraBookingWidget in a portal-free\n// overlay that triggers from a \"Book Now\" button.\n// ═══════════════════════════════════════════════════════════════\n\nimport React, { useState, useCallback, useEffect, useRef } from \"react\";\nimport { ResiraProvider } from \"../ResiraProvider.js\";\nimport { ResiraBookingWidget } from \"../ResiraBookingWidget.js\";\nimport { XIcon } from \"../icons.js\";\nimport type { ResiraDomain, ResiraProviderConfig } from \"../types.js\";\n\n// ─────────────────────────────────────────────────────────────\n// Props\n// ─────────────────────────────────────────────────────────────\n\nexport interface BookingModalProps {\n /** API key for authentication. */\n apiKey: string;\n /** Booking domain type. */\n domain: ResiraDomain;\n /** Optional resource ID (omit for catalog mode). */\n resourceId?: string;\n /** Configuration overrides. */\n config?: ResiraProviderConfig;\n /** Checkout session token. When provided, skips to checkout. */\n checkoutSessionToken?: string;\n /** Custom trigger button — if omitted, uses the default \"Book Now\" button. */\n trigger?: React.ReactNode;\n /** Custom button label. @default \"Book Now\" */\n buttonLabel?: string;\n /** Custom button className. */\n buttonClassName?: string;\n /** Custom button style. */\n buttonStyle?: React.CSSProperties;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Component\n// ─────────────────────────────────────────────────────────────\n\nexport function BookingModal({\n apiKey,\n domain,\n resourceId,\n config,\n checkoutSessionToken,\n trigger,\n buttonLabel = \"Book Now\",\n buttonClassName,\n buttonStyle,\n}: BookingModalProps) {\n const [open, setOpen] = useState(false);\n const modalRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement | HTMLSpanElement>(null);\n\n const handleOpen = useCallback(() => setOpen(true), []);\n const handleClose = useCallback(() => {\n setOpen(false);\n // Return focus to trigger\n requestAnimationFrame(() => {\n (triggerRef.current as HTMLElement | null)?.focus();\n });\n }, []);\n\n // Lock body scroll when modal is open\n useEffect(() => {\n if (open) {\n const prev = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = prev;\n };\n }\n }, [open]);\n\n // Close on Escape + focus trap\n useEffect(() => {\n if (!open) return;\n const modal = modalRef.current;\n if (!modal) return;\n\n // Auto-focus first focusable element\n requestAnimationFrame(() => {\n const first = modal.querySelector<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n first?.focus();\n });\n\n const handleKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n handleClose();\n return;\n }\n // Focus trap\n if (e.key === \"Tab\") {\n const focusable = modal.querySelectorAll<HTMLElement>(\n 'button:not(:disabled), [href], input:not(:disabled), select:not(:disabled), textarea:not(:disabled), [tabindex]:not([tabindex=\"-1\"])'\n );\n if (focusable.length === 0) return;\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n if (e.shiftKey) {\n if (document.activeElement === first) {\n e.preventDefault();\n last.focus();\n }\n } else {\n if (document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n }\n }\n };\n window.addEventListener(\"keydown\", handleKey);\n return () => window.removeEventListener(\"keydown\", handleKey);\n }, [open, handleClose]);\n\n return (\n <>\n {/* Trigger */}\n {trigger ? (\n <span\n ref={triggerRef as React.Ref<HTMLSpanElement>}\n onClick={handleOpen}\n onKeyDown={(e) => { if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); handleOpen(); } }}\n role=\"button\"\n tabIndex={0}\n style={{ cursor: \"pointer\" }}\n >\n {trigger}\n </span>\n ) : (\n <button\n ref={triggerRef as React.Ref<HTMLButtonElement>}\n type=\"button\"\n className={buttonClassName || \"resira-book-now-btn\"}\n style={buttonStyle}\n onClick={handleOpen}\n >\n {buttonLabel}\n </button>\n )}\n\n {/* Modal overlay */}\n {open && (\n <div\n className=\"resira-modal-overlay\"\n onClick={handleClose}\n role=\"presentation\"\n >\n <div\n ref={modalRef}\n className=\"resira-modal-container\"\n onClick={(e) => e.stopPropagation()}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Booking\"\n >\n {/* Close button */}\n <button\n type=\"button\"\n className=\"resira-modal-close\"\n onClick={handleClose}\n aria-label=\"Close booking dialog\"\n >\n <XIcon size={20} />\n </button>\n\n {/* Provider + widget */}\n <ResiraProvider\n apiKey={apiKey}\n domain={domain}\n resourceId={resourceId}\n config={config}\n checkoutSessionToken={checkoutSessionToken}\n onClose={handleClose}\n >\n <ResiraBookingWidget />\n </ResiraProvider>\n </div>\n </div>\n )}\n </>\n );\n}\n","// ═══════════════════════════════════════════════════════════════\n// @resira/ui — DishShowcase\n// A button component that opens a nested modal displaying dishes\n// with 3D model preview and AR viewing capabilities.\n// ═══════════════════════════════════════════════════════════════\n\nimport React, { useState, useCallback, useEffect, useRef } from \"react\";\nimport type { Dish } from \"@resira/sdk\";\nimport { useDish, useDishes } from \"../hooks.js\";\nimport { XIcon, CubeIcon, ViewfinderIcon, ChevronLeftIcon } from \"../icons.js\";\n\n// ─────────────────────────────────────────────────────────────\n// Props\n// ─────────────────────────────────────────────────────────────\n\nexport interface DishShowcaseProps {\n /** Single dish ID — when set, opens directly to that dish. */\n dishId?: string;\n /** Show all dishes in a browsable grid (ignored when dishId is set). */\n showAll?: boolean;\n /** Filter dishes by category (e.g. \"Starter\", \"Main\"). */\n category?: string;\n /** Custom CSS class for the trigger button. */\n className?: string;\n /** Custom inline styles for the trigger button. */\n style?: React.CSSProperties;\n /** Button content / label. */\n children: React.ReactNode;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────\n\nfunction formatPrice(cents: number, currency: string): string {\n try {\n return new Intl.NumberFormat(undefined, {\n style: \"currency\",\n currency,\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n }).format(cents / 100);\n } catch {\n return `${(cents / 100).toFixed(2)} ${currency}`;\n }\n}\n\n/** Check if USDZ AR is likely supported (iOS Safari). */\nfunction supportsArQuickLook(): boolean {\n if (typeof document === \"undefined\") return false;\n const a = document.createElement(\"a\");\n return a.relList?.supports?.(\"ar\") ?? false;\n}\n\nfunction supportsModelViewer(): boolean {\n if (typeof window === \"undefined\") return false;\n return typeof customElements !== \"undefined\" && customElements.get(\"model-viewer\") !== undefined;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Sub-components\n// ─────────────────────────────────────────────────────────────\n\n/** Inline 3D model viewer using <model-viewer> web component. */\nfunction ModelViewer3D({\n dish,\n onClose,\n}: {\n dish: Dish;\n onClose: () => void;\n}) {\n const model = dish.model;\n const arSupported = supportsArQuickLook();\n const modelViewerSupported = supportsModelViewer();\n\n // Handle AR launch via <a rel=\"ar\"> for iOS Quick Look\n const arLinkRef = useRef<HTMLAnchorElement>(null);\n const handleArClick = useCallback(() => {\n arLinkRef.current?.click();\n }, []);\n\n return (\n <div className=\"resira-dish-viewer\">\n {/* Header */}\n <div className=\"resira-dish-viewer-header\">\n <button\n type=\"button\"\n className=\"resira-dish-viewer-back\"\n onClick={onClose}\n aria-label=\"Back to dishes\"\n >\n <ChevronLeftIcon size={18} />\n <span>Back</span>\n </button>\n <h3 className=\"resira-dish-viewer-title\">{dish.name}</h3>\n </div>\n\n {/* 3D Viewer area */}\n <div className=\"resira-dish-viewer-canvas\">\n {model?.glbUrl && modelViewerSupported ? (\n <>\n {/*\n Uses the <model-viewer> web component from Google.\n Integrators need to load the script in their page:\n <script type=\"module\" src=\"https://ajax.googleapis.com/ajax/libs/model-viewer/4.0/model-viewer.min.js\" />\n Falls back to poster image if not available.\n */}\n {/* @ts-expect-error model-viewer is a web component */}\n <model-viewer\n src={model.glbUrl}\n ios-src={model.usdzUrl || undefined}\n poster={model.posterUrl || dish.imageUrl || undefined}\n alt={model.alt || dish.name}\n camera-controls\n touch-action=\"pan-y\"\n auto-rotate\n ar={arSupported ? true : undefined}\n ar-modes=\"webxr scene-viewer quick-look\"\n shadow-intensity=\"1\"\n style={{\n width: \"100%\",\n height: \"100%\",\n minHeight: \"280px\",\n borderRadius: \"12px\",\n background: \"var(--resira-bg-subtle, #f8f9fa)\",\n }}\n />\n {/* Hidden AR link fallback for iOS */}\n {model.usdzUrl && (\n <a\n ref={arLinkRef}\n rel=\"ar\"\n href={model.usdzUrl}\n style={{ display: \"none\" }}\n >\n <img src={model.posterUrl || dish.imageUrl || \"\"} alt=\"\" />\n </a>\n )}\n </>\n ) : dish.imageUrl ? (\n <div className=\"resira-dish-viewer-fallback\">\n <img\n src={dish.imageUrl}\n alt={dish.name}\n className=\"resira-dish-viewer-fallback-img\"\n />\n <p className=\"resira-dish-viewer-no3d\">\n {model?.glbUrl ? \"3D preview is unavailable here. Showing image instead.\" : \"No 3D model available\"}\n </p>\n </div>\n ) : (\n <div className=\"resira-dish-viewer-fallback\">\n <CubeIcon size={48} />\n <p className=\"resira-dish-viewer-no3d\">No preview available</p>\n </div>\n )}\n </div>\n\n {/* Details */}\n <div className=\"resira-dish-viewer-details\">\n {dish.description && (\n <p className=\"resira-dish-viewer-desc\">{dish.description}</p>\n )}\n <div className=\"resira-dish-viewer-meta\">\n {dish.priceCents != null && dish.currency && (\n <span className=\"resira-dish-viewer-price\">\n {formatPrice(dish.priceCents, dish.currency)}\n </span>\n )}\n {dish.category && (\n <span className=\"resira-dish-viewer-category\">{dish.category}</span>\n )}\n </div>\n {dish.allergens && dish.allergens.length > 0 && (\n <div className=\"resira-dish-viewer-allergens\">\n {dish.allergens.map((a) => (\n <span key={a} className=\"resira-dish-viewer-allergen\">{a}</span>\n ))}\n </div>\n )}\n </div>\n\n {/* Action buttons */}\n <div className=\"resira-dish-viewer-actions\">\n {model?.glbUrl && modelViewerSupported && (\n <button\n type=\"button\"\n className=\"resira-dish-action resira-dish-action--3d\"\n onClick={() => {\n // model-viewer handles interaction via camera-controls\n // This button scrolls to / focuses the viewer\n const mv = document.querySelector(\"model-viewer\");\n mv?.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n }}\n >\n <CubeIcon size={16} />\n <span>3D Preview</span>\n </button>\n )}\n {arSupported && model?.usdzUrl && (\n <button\n type=\"button\"\n className=\"resira-dish-action resira-dish-action--ar\"\n onClick={handleArClick}\n >\n <ViewfinderIcon size={16} />\n <span>View in AR</span>\n </button>\n )}\n </div>\n </div>\n );\n}\n\n/** A single dish card in the grid. */\nfunction DishCard({\n dish,\n onSelect,\n}: {\n dish: Dish;\n onSelect: (dish: Dish) => void;\n}) {\n const has3D = !!dish.model?.glbUrl;\n\n return (\n <button\n type=\"button\"\n className=\"resira-dish-card\"\n onClick={() => onSelect(dish)}\n >\n <div className=\"resira-dish-card-image\">\n {dish.imageUrl || dish.model?.posterUrl ? (\n <img\n src={dish.imageUrl || dish.model!.posterUrl!}\n alt={dish.name}\n loading=\"lazy\"\n />\n ) : (\n <div className=\"resira-dish-card-placeholder\">\n <CubeIcon size={28} />\n </div>\n )}\n {has3D && (\n <span className=\"resira-dish-card-badge\">\n <CubeIcon size={12} />\n 3D\n </span>\n )}\n </div>\n <div className=\"resira-dish-card-info\">\n <span className=\"resira-dish-card-name\">{dish.name}</span>\n {dish.priceCents != null && dish.currency && (\n <span className=\"resira-dish-card-price\">\n {formatPrice(dish.priceCents, dish.currency)}\n </span>\n )}\n </div>\n </button>\n );\n}\n\n// ─────────────────────────────────────────────────────────────\n// Main component\n// ─────────────────────────────────────────────────────────────\n\nexport function DishShowcase({\n dishId,\n showAll = false,\n category,\n className,\n style,\n children,\n}: DishShowcaseProps) {\n const [open, setOpen] = useState(false);\n const [selectedDish, setSelectedDish] = useState<Dish | null>(null);\n const modalRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n\n // Fetch single dish if dishId provided\n const { dish: singleDish, loading: singleLoading, error: singleError } = useDish(\n open && dishId ? dishId : undefined,\n );\n\n // Fetch all dishes if showAll or no dishId\n const shouldLoadAllDishes = open && (!dishId || showAll);\n const { dishes: allDishes, loading: allLoading, error: allError } = useDishes(shouldLoadAllDishes);\n\n // Determine which mode we're in\n const isSingleMode = !!dishId;\n const loading = isSingleMode ? singleLoading : allLoading;\n const error = isSingleMode ? singleError : allError;\n\n // Filter dishes by category if needed\n const filteredDishes = category\n ? allDishes.filter((d) => d.category?.toLowerCase() === category.toLowerCase())\n : allDishes;\n\n // When single dish loads, go straight to viewer\n useEffect(() => {\n if (singleDish && isSingleMode && open) {\n setSelectedDish(singleDish);\n }\n }, [singleDish, isSingleMode, open]);\n\n const handleOpen = useCallback(() => {\n setOpen(true);\n setSelectedDish(null);\n }, []);\n\n const handleClose = useCallback(() => {\n setOpen(false);\n setSelectedDish(null);\n requestAnimationFrame(() => {\n triggerRef.current?.focus();\n });\n }, []);\n\n const handleSelectDish = useCallback((dish: Dish) => {\n setSelectedDish(dish);\n }, []);\n\n const handleBackToGrid = useCallback(() => {\n setSelectedDish(null);\n }, []);\n\n // Body scroll lock\n useEffect(() => {\n if (open) {\n const prev = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = prev;\n };\n }\n }, [open]);\n\n // Escape key + focus trap\n useEffect(() => {\n if (!open) return;\n const modal = modalRef.current;\n if (!modal) return;\n\n requestAnimationFrame(() => {\n const first = modal.querySelector<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n );\n first?.focus();\n });\n\n const handleKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n if (selectedDish && !isSingleMode) {\n setSelectedDish(null);\n } else {\n handleClose();\n }\n return;\n }\n if (e.key === \"Tab\") {\n const focusable = modal.querySelectorAll<HTMLElement>(\n 'button:not(:disabled), [href], input:not(:disabled), select:not(:disabled), textarea:not(:disabled), [tabindex]:not([tabindex=\"-1\"])',\n );\n if (focusable.length === 0) return;\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n if (e.shiftKey) {\n if (document.activeElement === first) {\n e.preventDefault();\n last.focus();\n }\n } else {\n if (document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n }\n }\n };\n window.addEventListener(\"keydown\", handleKey);\n return () => window.removeEventListener(\"keydown\", handleKey);\n }, [open, selectedDish, isSingleMode, handleClose]);\n\n return (\n <>\n {/* Trigger button */}\n <button\n ref={triggerRef}\n type=\"button\"\n className={className || \"resira-dish-showcase-btn\"}\n style={style}\n onClick={handleOpen}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n >\n {children}\n </button>\n\n {/* Nested modal overlay */}\n {open && (\n <div\n className=\"resira-dish-overlay\"\n onClick={handleClose}\n role=\"presentation\"\n >\n <div\n ref={modalRef}\n className=\"resira-dish-modal\"\n onClick={(e) => e.stopPropagation()}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={selectedDish ? `${selectedDish.name} dish preview` : \"Dish showcase\"}\n >\n {/* Close button */}\n <button\n type=\"button\"\n className=\"resira-dish-modal-close\"\n onClick={handleClose}\n aria-label=\"Close dish showcase\"\n >\n <XIcon size={18} />\n </button>\n\n {/* Loading state */}\n {loading && (\n <div className=\"resira-dish-loading\" role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\n <div className=\"resira-dish-spinner\" aria-hidden=\"true\" />\n <span>Loading dishes…</span>\n </div>\n )}\n\n {/* Error state */}\n {error && !loading && (\n <div className=\"resira-dish-error\" role=\"alert\" aria-live=\"assertive\">\n <p>{error}</p>\n </div>\n )}\n\n {/* Content */}\n {!loading && !error && (\n <>\n {selectedDish ? (\n <ModelViewer3D\n dish={selectedDish}\n onClose={isSingleMode ? handleClose : handleBackToGrid}\n />\n ) : (\n <div className=\"resira-dish-grid-container\">\n <div className=\"resira-dish-grid-header\">\n <h2 className=\"resira-dish-grid-title\">\n {category ? `${category}` : \"Our Dishes\"}\n </h2>\n <p className=\"resira-dish-grid-subtitle\">\n Tap a dish to preview in 3D\n </p>\n </div>\n {filteredDishes.length === 0 ? (\n <div className=\"resira-dish-empty\">\n <CubeIcon size={36} />\n <p>No dishes available</p>\n </div>\n ) : (\n <div className=\"resira-dish-grid\">\n {filteredDishes.map((dish) => (\n <DishCard\n key={dish.id}\n dish={dish}\n onSelect={handleSelectDish}\n />\n ))}\n </div>\n )}\n </div>\n )}\n </>\n )}\n </div>\n </div>\n )}\n </>\n );\n}\n"]}