/** * Service - High-level component for displaying service information * Provides components for displaying service details and booking actions */ import React from 'react'; import { AsChildChildren } from '@wix/headless-utils/react'; import { MoneyData } from '@wix/headless-components/react'; import { type Service, type Payment, type DurationRange as DurationRangeData } from '@wix/auto_sdk_bookings_services'; import * as ServiceMediaModule from './ServiceMedia.js'; export declare const TestIds: { readonly serviceRoot: "service-root"; readonly serviceName: "service-name"; readonly serviceDescription: "service-description"; readonly servicePrice: "service-price"; readonly serviceTagline: "service-tagline"; readonly serviceDurationInMinutes: "service-duration-in-minutes"; readonly serviceDurationRange: "service-duration-range"; readonly serviceType: "service-type"; readonly serviceCategory: "service-category"; readonly serviceLocations: "service-locations"; readonly serviceLocation: "service-location"; readonly serviceLocationRepeater: "service-location-repeater"; readonly locationRoot: "location-root"; readonly serviceStaffMembers: "service-staff-members"; readonly serviceStaffMemberRepeater: "service-staff-member-repeater"; readonly serviceSchedule: "service-schedule"; readonly serviceDefaultCapacity: "service-default-capacity"; readonly serviceRaw: "service-raw"; readonly serviceActionSelect: "service-action-select"; readonly serviceActionAdd: "service-action-add"; readonly serviceActionRemove: "service-action-remove"; readonly servicePolicyLatestCancellationInMinutes: "service-policy-latest-cancellation-in-minutes"; readonly servicePolicyLatestBookingInMinutes: "service-policy-latest-booking-in-minutes"; readonly servicePolicyEarliestBookingInMinutes: "service-policy-earliest-booking-in-minutes"; readonly servicePolicyLatestRescheduleInMinutes: "service-policy-latest-reschedule-in-minutes"; readonly servicePolicyWaitlistCapacity: "service-policy-waitlist-capacity"; readonly servicePolicyBookAfterStartEnabled: "service-policy-book-after-start-enabled"; readonly servicePolicyMaxParticipantsPerBooking: "service-policy-max-participants-per-booking"; readonly serviceScheduleFirstSessionStart: "service-schedule-first-session-start"; readonly serviceScheduleLastSessionEnd: "service-schedule-last-session-end"; readonly serviceScheduleSessionDuration: "service-schedule-session-duration"; readonly serviceAvailableOnline: "service-available-online"; }; /** * Base props shared by all Service.Root variants */ interface ServiceRootBaseProps { children?: React.ReactNode | AsChildChildren<{ selected: boolean; bookable: boolean; }>; appId?: string; asChild?: boolean; className?: string; } /** * Props for Service.Root with pre-loaded service object (SSR pattern) */ type ServiceRootWithService = ServiceRootBaseProps & { service: Service; serviceId?: never; serviceSlug?: never; }; /** * Props for Service.Root with dynamic loading by service ID */ type ServiceRootWithId = ServiceRootBaseProps & { service?: never; serviceId: string; serviceSlug?: never; }; /** * Props for Service.Root with dynamic loading by service slug */ type ServiceRootWithSlug = ServiceRootBaseProps & { service?: never; serviceId?: never; serviceSlug: string; }; /** * Props for Service.Root that reads from BookingService's selected service. * When used without service config, the component reads from the booking signal. * Requires BookingService to be available in the context. */ type ServiceRootFromBooking = ServiceRootBaseProps & { service?: never; serviceId?: never; serviceSlug?: never; }; /** * Props for Service.Root component. * Accepts one of: * - service: Pre-loaded service object (SSR pattern) * - serviceId: Service ID for dynamic loading * - serviceSlug: Service slug for dynamic loading * - No service config: Reads from BookingService's selected service */ export type ServiceRootProps = ServiceRootWithService | ServiceRootWithId | ServiceRootWithSlug | ServiceRootFromBooking; /** * Root component that provides service context to the entire app. * Can be used with: * - service: Pre-loaded service object (SSR pattern) * - serviceId: Service ID for dynamic loading * - serviceSlug: Service slug for dynamic loading * - No config: Reads from BookingService's selected service (requires BookingService) * * @order 1 * @component * @example * ```tsx * import { Service } from '@wix/bookings/components'; * * // With pre-loaded service object (SSR pattern) * function ServicePage({ service }) { * return ( * * * * * ); * } * * // With dynamic loading by serviceId * function ServicePageById({ serviceId }) { * return ( * * * * * ); * } * * // With dynamic loading by serviceSlug * function ServicePageBySlug({ slug }) { * return ( * * * * * ); * } * * // Reading from BookingService's selected service * // (requires Booking.Root parent context) * function SelectedServiceDisplay() { * return ( * * * * * ); * } * ``` */ export declare const Root: React.ForwardRefExoticComponent>; /** * Props for Service Name component */ export interface NameProps extends Omit, 'children'> { asChild?: boolean; children?: AsChildChildren<{ name: string; }>; } /** * Displays the service name with customizable rendering. * * @component * @example * ```tsx * // Default usage * * * // asChild with primitive * *

* * * // asChild with custom component * * {React.forwardRef(({name, ...props}, ref) => ( *

* {name} *

* ))} *
* ``` */ export declare const Name: React.ForwardRefExoticComponent>; /** * Props for Service Description component */ export interface DescriptionProps extends Omit, 'children'> { asChild?: boolean; children?: AsChildChildren<{ description: string; }>; } /** * Displays the service description with customizable rendering. * * @component * @example * ```tsx * // Default usage * * * // asChild with primitive * *

* * ``` */ export declare const Description: React.ForwardRefExoticComponent>; /** * Props for Service Price component */ export interface PriceProps { asChild?: boolean; children?: AsChildChildren<{ servicePayment: Payment | undefined; rateType: Payment['rateType'] | undefined; money: MoneyData | null; minPrice: MoneyData | null; maxPrice: MoneyData | null; priceDescription: string | null; hasAddOns: boolean; hasPricingPlans: boolean; }>; className?: string; } /** * Displays the service price using the Money component with customizable rendering. * Renders different defaults based on rate type: * - FIXED: Shows formatted price (e.g., '$50.00') * - VARIED: Shows price range (e.g., '$30.00 - $50.00') * - CUSTOM: Shows custom description text * - NO_FEE: Shows zero price (e.g., '$0.00') * * @component * @example * ```tsx * // Default usage - renders based on rate type * * * // Custom rendering with full price data * * {({ rateType, money, minPrice, maxPrice, priceDescription, hasAddOns, hasPricingPlans }) => ( *

* {rateType === 'FIXED' && money && } * {rateType === 'VARIED' && minPrice && maxPrice && ( * - * )} * {rateType === 'CUSTOM' && priceDescription && {priceDescription}} * {rateType === 'NO_FEE' && money && } * {hasPricingPlans && Pricing plans available} *
* )} * * ``` */ export declare const Price: React.ForwardRefExoticComponent>; /** * Props for Service Tagline component */ export interface TaglineProps extends Omit, 'children'> { asChild?: boolean; children?: AsChildChildren<{ tagline: string; }>; } /** * Displays the service tagline with customizable rendering. * * @component * @example * ```tsx * // Default usage * * ``` * * @example * ```tsx * // asChild with primitive element * *

* * ``` * * @example * ```tsx * // asChild with custom component accessing tagline data * * {React.forwardRef(({tagline, ...props}, ref) => ( *

* "{tagline}" *
* ))} *
* ``` */ export declare const Tagline: React.ForwardRefExoticComponent>; /** * Props for Service DurationInMinutes component */ export interface DurationInMinutesProps extends Omit, 'children'> { asChild?: boolean; children?: AsChildChildren<{ duration: number; }>; } /** * Displays the service duration in minutes (raw number) with customizable rendering. * Returns the duration as a numeric value representing minutes. * * @component * @example * ```tsx * // Default usage - displays raw minutes * * ``` * * @example * ```tsx * // asChild with primitive element * * * * ``` * * @example * ```tsx * // asChild with custom component to format duration * * {React.forwardRef(({duration, ...props}, ref) => ( * * {duration} minutes * * ))} * * ``` */ export declare const DurationInMinutes: React.ForwardRefExoticComponent>; /** * Props for Service DurationRange component */ export interface DurationRangeProps extends Omit, 'children'> { asChild?: boolean; children?: AsChildChildren<{ range: DurationRangeData; }>; } /** * Provides the service's supported session duration range as raw SDK data. * Renders nothing when the service has fewer than two distinct supported * durations — use {@link DurationInMinutes} for that case. * * The component is intentionally UI-agnostic: it does not pick formatting, * units, or labels for you. The default render outputs only the raw * `min - max` numbers (no unit text). Consumers wanting unit-aware UI use * `asChild` with a custom render and narrow on the SDK `range` payload * (`range.hourOptions` / `range.dayOptions` / `range.unitType`, or any * other unit configuration the SDK adds in the future). * * @component * @example * ```tsx * // Default usage - displays raw min/max, e.g. "120 - 540" or "2 - 5" * * ``` * * @example * ```tsx * // asChild with primitive element * * * * ``` * * @example * ```tsx * // asChild with custom component - narrow on the SDK range payload to * // decide unit-specific formatting. * * {React.forwardRef(({ range, ...props }, ref) => { * if (range.hourOptions) { * const { minDurationInMinutes: min, maxDurationInMinutes: max } = * range.hourOptions; * return ( * * {min}-{max} min * * ); * } * if (range.dayOptions) { * const { minDurationInDays: min, maxDurationInDays: max } = * range.dayOptions; * return ( * * {min}-{max} days * * ); * } * return ; * })} * * ``` */ export declare const DurationRange: React.ForwardRefExoticComponent>; /** * Props for Service Type component */ export interface TypeProps extends Omit, 'children'> { asChild?: boolean; children?: AsChildChildren<{ type: string; }>; } /** * Displays the service type (APPOINTMENT, CLASS, COURSE, etc.) with customizable rendering. * * @component * @example * ```tsx * // Default usage * * ``` * * @example * ```tsx * // asChild with badge styling * * * * ``` * * @example * ```tsx * // asChild with custom component to format type * * {React.forwardRef(({type, ...props}, ref) => { * const label = { * APPOINTMENT: '1-on-1', * CLASS: 'Group Class', * COURSE: 'Course', * }[type] || type; * return {label}; * })} * * ``` */ export declare const Type: React.ForwardRefExoticComponent>; /** * Props for Service Category component */ export interface CategoryProps extends Omit, 'children'> { asChild?: boolean; children?: AsChildChildren<{ category: { name?: string; _id?: string; }; }>; } /** * Displays the service category with customizable rendering. * * @component * @example * ```tsx * // Default usage * * ``` * * @example * ```tsx * // asChild with link styling * * * * ``` * * @example * ```tsx * // asChild with custom component accessing category data * * {React.forwardRef(({category, ...props}, ref) => ( * * {category.name} * * ))} * * ``` */ export declare const Category: React.ForwardRefExoticComponent>; /** * Type for location */ type LocationType = NonNullable[number] & { id: string; }; /** * Props for Service Locations component (Container Level) */ export interface LocationsProps { asChild?: boolean; children?: React.ReactNode; className?: string; } /** * Container for service locations list (Container Level). * Follows the 3-level List/Options/Repeater pattern. * Provides context and doesn't render when there are no locations. * Internally uses LocationList.Root for consistent location handling. * * @component * @example * ```tsx * // Basic usage with 3-level pattern * * No locations available}> * * * * * * * * // With asChild pattern for custom container * *
    * * *
  • *
    *
    *
*
* ``` */ declare const LocationsBase: React.ForwardRefExoticComponent>; /** * Props for Service Locations.List component (List Container Level) */ export interface LocationsListProps { children?: React.ReactNode; emptyState?: React.ReactNode; className?: string; } /** * List container for locations with empty state support (List Container Level). * Renders emptyState when no locations, otherwise renders children. * Internally delegates to LocationList.Locations. * * @component * @example * ```tsx * No locations available}> * * * ``` */ export declare const LocationsList: React.ForwardRefExoticComponent>; /** * Render props for LocationRepeater asChild pattern */ export interface LocationRepeaterRenderProps { items: LocationType[]; itemWrapper: (props: { item: LocationType; index: number; children: React.ReactNode; }) => React.ReactNode; } /** * Props for Service Locations.LocationRepeater component */ export interface LocationRepeaterProps { children?: React.ReactNode; } /** * Repeater component that renders Location.Root for each location. * Internally delegates to LocationList.LocationRepeater. * Children are rendered inside each Location.Root context. * * @component * @example * ```tsx * // Standard usage - renders Location.Root for each location * * * * * * // With custom styling * *
* * * *
*
* ``` */ export declare const LocationRepeater: React.ForwardRefExoticComponent>; /** * Props for Service StaffMembers component (Container Level) */ export interface StaffMembersProps { asChild?: boolean; children?: React.ReactNode; className?: string; } /** * Container for service staff members list (Container Level). * Follows the 3-level List/Options/Repeater pattern. * Provides context and doesn't render when there are no staff members. * Internally uses StaffMemberList.Root for consistent staff member handling. * * @component * @example * ```tsx * // Basic usage with 3-level pattern * * No staff assigned}> * * * * * * * // With asChild pattern for custom container * *
    * * *
  • *
    *
    *
*
* ``` */ declare const StaffMembersBase: React.ForwardRefExoticComponent>; /** * Props for Service StaffMembers.List component (List Container Level) */ export interface StaffMembersListProps { children?: React.ReactNode; emptyState?: React.ReactNode; className?: string; } /** * List container for staff members with empty state support (List Container Level). * Renders emptyState when no staff members, otherwise renders children. * Internally delegates to StaffMemberList.StaffMembers. * * @component * @example * ```tsx * No staff assigned}> * * * ``` */ export declare const StaffMembersList: React.ForwardRefExoticComponent>; /** * Props for Service StaffMembers.StaffMemberRepeater component */ export interface StaffMemberRepeaterProps { children?: React.ReactNode; } /** * Repeater component that renders StaffMember.Root for each staff member. * Internally delegates to StaffMemberList.StaffMemberRepeater. * Children are rendered inside each StaffMember.Root context. * * @component * @example * ```tsx * // Standard usage - renders StaffMember.Root for each staff member * * * * * // With custom styling * *
* *
*
* ``` */ export declare const StaffMemberRepeater: React.ForwardRefExoticComponent>; /** * Props for Service Raw component */ export interface RawProps { asChild?: boolean; children?: AsChildChildren<{ service: Service; isLoading: boolean; error: string | null; }>; className?: string; } /** * Provides direct access to service object. Should be used only in rare cases. * * @component * @example * ```tsx * // Using render prop pattern to access raw service data * * {({ service, isLoading, error }) => ( *
* {isLoading &&
Loading...
} * {error &&
Error: {error}
} * {service &&
{JSON.stringify(service, null, 2)}
} *
* )} *
* * // With asChild pattern * * * * ``` */ export declare const Raw: React.ForwardRefExoticComponent>; /** * Actions namespace with individual action components */ export declare namespace Actions { /** * Props for Select action component */ interface SelectProps extends Omit, 'children' | 'disabled' | 'onClick'> { asChild?: boolean; children?: React.ReactNode | ((props: { bookable: boolean; selected: boolean; requiresAvailability: boolean; onClick: () => void; service: Service; }) => React.ReactNode); label?: string; /** Called after selection with the selected service */ onClick?: (service: Service) => void; } /** * Select action component - replaces selection with only this service. * * @component * @example * ```tsx * // Default button * * * // With asChild using custom Button component * * * * * // With onClick callback for navigation * router.push('/booking/time-slots')} * /> * * // Using render prop pattern to access bookable state * * {({ bookable, selected, onClick }) => ( * * )} * * ``` */ const Select: React.ForwardRefExoticComponent>; /** * Props for Add action component */ interface AddProps extends Omit, 'children' | 'disabled' | 'onClick'> { asChild?: boolean; children?: React.ReactNode | ((props: { bookable: boolean; selected: boolean; requiresAvailability: boolean; onClick: () => void; service: Service; }) => React.ReactNode); label?: string; /** Called after adding with the added service */ onClick?: (service: Service) => void; } /** * Add action component - adds service to selection array. * * @component * @example * ```tsx * // Default button * * * // With asChild using custom Button component * * * * * // With onClick callback * console.log('Service added')} * /> * * // Using render prop pattern to access bookable state * * {({ bookable, selected, onClick }) => ( * * )} * * ``` */ const Add: React.ForwardRefExoticComponent>; /** * Props for Remove action component */ interface RemoveProps extends Omit, 'children' | 'disabled' | 'onClick'> { asChild?: boolean; children?: React.ReactNode | ((props: { bookable: boolean; selected: boolean; requiresAvailability: boolean; onClick: () => void; service: Service; }) => React.ReactNode); label?: string; /** Called after removing with the removed service */ onClick?: (service: Service) => void; } /** * Remove action component - removes service from selection array. * * @component * @example * ```tsx * // Default button * * * // With asChild using custom Button component * * * * * // With onClick callback * console.log('Service removed')} * /> * * // Using render prop pattern to access bookable state * * {({ bookable, selected, onClick }) => ( * * )} * * ``` */ const Remove: React.ForwardRefExoticComponent>; } /** * Props for Service.Policy.LatestCancellationInMinutes component */ export interface PolicyLatestCancellationInMinutesProps { asChild?: boolean; children?: AsChildChildren<{ cancellationPolicyEnabled: boolean; limitLatestCancellationEnabled: boolean; latestCancellationInMinutes: number | undefined; }>; className?: string; } /** * Displays latestCancellationInMinutes as a raw number. * Headless component - contains zero formatting logic. * * Maps to: bookingPolicy.cancellationPolicy.latestCancellationInMinutes * * @component * @example * ```tsx * // Default usage - displays raw number only (or null if disabled/undefined) * * // Renders: 30 or null * ``` * * @example * ```tsx * // Consumer adds formatting logic via asChild * * {({ cancellationPolicyEnabled, limitLatestCancellationEnabled, latestCancellationInMinutes }) => ( * cancellationPolicyEnabled ? ( *
* {limitLatestCancellationEnabled * ? `Cancel up to ${latestCancellationInMinutes} minutes before` * : 'Free cancellation anytime' * } *
* ) : null * )} *
* ``` */ export declare const PolicyLatestCancellationInMinutes: React.ForwardRefExoticComponent>; /** * Props for Service.Policy.LatestBookingInMinutes component */ export interface PolicyLatestBookingInMinutesProps { asChild?: boolean; children?: AsChildChildren<{ latestBookingPolicyEnabled: boolean; latestBookingInMinutes: number | undefined; }>; className?: string; } /** * Displays latestBookingInMinutes as a raw number. * Headless component - contains zero formatting logic. * * Maps to: bookingPolicy.limitLateBookingPolicy.latestBookingInMinutes * * @component * @example * ```tsx * // Default usage * * ``` */ export declare const PolicyLatestBookingInMinutes: React.ForwardRefExoticComponent>; /** * Props for Service.Policy.EarliestBookingInMinutes component */ export interface PolicyEarliestBookingInMinutesProps { asChild?: boolean; children?: AsChildChildren<{ earliestBookingPolicyEnabled: boolean; earliestBookingInMinutes: number | undefined; }>; className?: string; } /** * Displays earliestBookingInMinutes as a raw number. * Headless component - contains zero formatting logic. * * Maps to: bookingPolicy.limitEarlyBookingPolicy.earliestBookingInMinutes * * @component * @example * ```tsx * // Default usage * * ``` */ export declare const PolicyEarliestBookingInMinutes: React.ForwardRefExoticComponent>; /** * Props for Service.Policy.LatestRescheduleInMinutes component */ export interface PolicyLatestRescheduleInMinutesProps { asChild?: boolean; children?: AsChildChildren<{ reschedulePolicyEnabled: boolean; limitLatestRescheduleEnabled: boolean; latestRescheduleInMinutes: number | undefined; }>; className?: string; } /** * Displays latestRescheduleInMinutes as a raw number. * Headless component - contains zero formatting logic. * * Maps to: bookingPolicy.reschedulePolicy.latestRescheduleInMinutes * * @component * @example * ```tsx * // Default usage * * ``` */ export declare const PolicyLatestRescheduleInMinutes: React.ForwardRefExoticComponent>; /** * Props for Service.Policy.WaitlistCapacity component */ export interface PolicyWaitlistCapacityProps { asChild?: boolean; children?: AsChildChildren<{ waitlistPolicyEnabled: boolean; waitlistCapacity: number | undefined; }>; className?: string; } /** * Displays waitlist capacity as a raw number. * Headless component - contains zero formatting logic. * * Maps to: bookingPolicy.waitlistPolicy.capacity * * @component * @example * ```tsx * // Default usage * * ``` */ export declare const PolicyWaitlistCapacity: React.ForwardRefExoticComponent>; /** * Props for Service.Policy.BookAfterStartEnabled component */ export interface PolicyBookAfterStartEnabledProps { asChild?: boolean; children?: AsChildChildren<{ bookAfterStartEnabled: boolean; }>; className?: string; } /** * Displays whether booking after start is enabled. * Headless component - contains zero formatting logic. * * Maps to: bookingPolicy.bookAfterStartPolicy.enabled * * @component * @example * ```tsx * // Default usage * * ``` */ export declare const PolicyBookAfterStartEnabled: React.ForwardRefExoticComponent>; /** * Props for Service.Policy.MaxParticipantsPerBooking component */ export interface PolicyMaxParticipantsPerBookingProps { asChild?: boolean; children?: AsChildChildren<{ maxParticipantsPerBooking: number | undefined; }>; className?: string; } /** * Displays maximum participants per booking as a raw number. * Headless component - contains zero formatting logic. * * Maps to: bookingPolicy.participantsPolicy.maxParticipantsPerBooking * * @component * @example * ```tsx * // Default usage * * ``` */ export declare const PolicyMaxParticipantsPerBooking: React.ForwardRefExoticComponent>; /** * Policy namespace containing all policy sub-components */ export declare namespace Policy { const LatestCancellationInMinutes: React.ForwardRefExoticComponent>; const LatestBookingInMinutes: React.ForwardRefExoticComponent>; const EarliestBookingInMinutes: React.ForwardRefExoticComponent>; const LatestRescheduleInMinutes: React.ForwardRefExoticComponent>; const WaitlistCapacity: React.ForwardRefExoticComponent>; const BookAfterStartEnabled: React.ForwardRefExoticComponent>; const MaxParticipantsPerBooking: React.ForwardRefExoticComponent>; } /** * Props for Service.Schedule.FirstSessionStart component */ export interface ScheduleFirstSessionStartProps { asChild?: boolean; children?: AsChildChildren<{ firstSessionStart: Date | undefined; }>; className?: string; } /** * Displays the first session start date as a raw Date value. * Headless component - contains zero formatting logic. * * @component * @example * ```tsx * // Default usage - displays ISO string * * * // With custom formatting * * {({ firstSessionStart }) => ( * firstSessionStart ? ( * Starts: {formatDate(firstSessionStart)} * ) : null * )} * * ``` */ export declare const ScheduleFirstSessionStart: React.ForwardRefExoticComponent>; /** * Props for Service.Schedule.LastSessionEnd component */ export interface ScheduleLastSessionEndProps { asChild?: boolean; children?: AsChildChildren<{ lastSessionEnd: Date | undefined; }>; className?: string; } /** * Displays the last session end date as a raw Date value. * Headless component - contains zero formatting logic. * * @component * @example * ```tsx * // Default usage - displays ISO string * * * // With custom formatting * * {({ lastSessionEnd }) => ( * lastSessionEnd ? ( * Ends: {formatDate(lastSessionEnd)} * ) : null * )} * * ``` */ export declare const ScheduleLastSessionEnd: React.ForwardRefExoticComponent>; /** * Props for Service.Schedule.SessionDuration component */ export interface ScheduleSessionDurationProps { asChild?: boolean; children?: AsChildChildren<{ sessionDuration: number | undefined; }>; className?: string; } /** * Displays the session duration in minutes as a raw number. * Headless component - contains zero formatting logic. * * @component * @example * ```tsx * // Default usage - displays raw minutes * * * // With custom formatting * * {({ sessionDuration }) => ( * sessionDuration ? ( * {formatDuration(sessionDuration)} * ) : null * )} * * ``` */ export declare const ScheduleSessionDuration: React.ForwardRefExoticComponent>; /** * Schedule namespace containing all schedule sub-components */ export declare namespace Schedule { const FirstSessionStart: React.ForwardRefExoticComponent>; const LastSessionEnd: React.ForwardRefExoticComponent>; const SessionDuration: React.ForwardRefExoticComponent>; } /** * Props for Service DefaultCapacity component */ export interface DefaultCapacityProps extends Omit, 'children'> { asChild?: boolean; children?: AsChildChildren<{ defaultCapacity: number; isClassOrCourse: boolean; }>; } /** * Displays the service default capacity with customizable rendering. * Only renders for CLASS or COURSE service types. * * @component * @example * ```tsx * // Default usage * * * // asChild with custom component * * {({ defaultCapacity, isClassOrCourse }) => isClassOrCourse ? ( * Max participants: {defaultCapacity} * ) : null} * * ``` */ export declare const DefaultCapacity: React.ForwardRefExoticComponent>; /** * Props for Service AvailableOnline component */ export interface AvailableOnlineProps extends Omit, 'children'> { asChild?: boolean; children?: AsChildChildren<{ availableOnline: boolean; }>; label?: string; } /** * Displays whether the service is available online (conferencing enabled). * Headless component - contains zero formatting logic. * * Maps to: service.conferencing.enabled * * @component * @example * ```tsx * // Default usage - displays label only when available online * * ``` * * @example * ```tsx * // asChild with custom component * * {({ availableOnline }) => availableOnline ? ( * Online * ) : null} * * ``` */ export declare const AvailableOnline: React.ForwardRefExoticComponent>; export declare const Locations: typeof LocationsBase & { List: typeof LocationsList; LocationRepeater: typeof LocationRepeater; }; export declare const StaffMembers: typeof StaffMembersBase & { List: typeof StaffMembersList; StaffMemberRepeater: typeof StaffMemberRepeater; }; export declare const MainMedia: React.ForwardRefExoticComponent>; export declare const CoverMedia: React.ForwardRefExoticComponent>; export type { MainProps as MainMediaProps } from './ServiceMedia.js'; export type { CoverProps as CoverMediaProps } from './ServiceMedia.js';